ZGlmZiAtLWdpdCBhL2JlbmNoL0JlbmNoU3BhcnNlVXRpbC5oIGIvYmVuY2gvQmVuY2hTcGFyc2VVdGlsLmgKaW5kZXggMTM5ODFmNi4uNjYzY2Q0OCAxMDA2NDQKLS0tIGEvYmVuY2gvQmVuY2hTcGFyc2VVdGlsLmgKKysrIGIvYmVuY2gvQmVuY2hTcGFyc2VVdGlsLmgKQEAgLTIwLDYzICsyMCw1MSBAQAogI2VuZGlmCiAKIHR5cGVkZWYgU0NBTEFSIFNjYWxhcjsKLXR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OwotdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7Cit0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IERlbnNlTWF0cml4OwordHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBEZW5zZVZlY3RvcjsKIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcj4gRWlnZW5TcGFyc2VNYXRyaXg7CiAKLXZvaWQgZmlsbE1hdHJpeChmbG9hdCBkZW5zaXR5LCBpbnQgcm93cywgaW50IGNvbHMsICBFaWdlblNwYXJzZU1hdHJpeCYgZHN0KQotewotICBkc3QucmVzZXJ2ZShkb3VibGUocm93cykqY29scypkZW5zaXR5KTsKLSAgZm9yKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykKLSAgewotICAgIGZvcihpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspCi0gICAgewotICAgICAgU2NhbGFyIHYgPSAoaW50ZXJuYWw6OnJhbmRvbTxmbG9hdD4oMCwxKSA8IGRlbnNpdHkpID8gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgOiAwOwotICAgICAgaWYgKHYhPTApCi0gICAgICAgIGRzdC5pbnNlcnQoaSxqKSA9IHY7Cit2b2lkIGZpbGxNYXRyaXgoZmxvYXQgZGVuc2l0eSwgaW50IHJvd3MsIGludCBjb2xzLCBFaWdlblNwYXJzZU1hdHJpeCYgZHN0KSB7CisgIGRzdC5yZXNlcnZlKGRvdWJsZShyb3dzKSAqIGNvbHMgKiBkZW5zaXR5KTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgeworICAgICAgU2NhbGFyIHYgPSAoaW50ZXJuYWw6OnJhbmRvbTxmbG9hdD4oMCwgMSkgPCBkZW5zaXR5KSA/IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpIDogMDsKKyAgICAgIGlmICh2ICE9IDApIGRzdC5pbnNlcnQoaSwgaikgPSB2OwogICAgIH0KICAgfQogICBkc3QuZmluYWxpemUoKTsKIH0KIAotdm9pZCBmaWxsTWF0cml4MihpbnQgbm56UGVyQ29sLCBpbnQgcm93cywgaW50IGNvbHMsICBFaWdlblNwYXJzZU1hdHJpeCYgZHN0KQotewotLy8gICBzdGQ6OmNvdXQgPDwgImFsbG9jICIgPDwgbm56UGVyQ29sKmNvbHMgPDwgIlxuIjsKLSAgZHN0LnJlc2VydmUobm56UGVyQ29sKmNvbHMpOwotICBmb3IoaW50IGogPSAwOyBqIDwgY29sczsgaisrKQotICB7Cit2b2lkIGZpbGxNYXRyaXgyKGludCBubnpQZXJDb2wsIGludCByb3dzLCBpbnQgY29scywgRWlnZW5TcGFyc2VNYXRyaXgmIGRzdCkgeworICAvLyAgIHN0ZDo6Y291dCA8PCAiYWxsb2MgIiA8PCBubnpQZXJDb2wqY29scyA8PCAiXG4iOworICBkc3QucmVzZXJ2ZShubnpQZXJDb2wgKiBjb2xzKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICBzdGQ6OnNldDxpbnQ+IGF1eDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgbm56UGVyQ29sOyBpKyspCi0gICAgewotICAgICAgaW50IGsgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpOwotICAgICAgd2hpbGUgKGF1eC5maW5kKGspIT1hdXguZW5kKCkpCi0gICAgICAgIGsgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm56UGVyQ29sOyBpKyspIHsKKyAgICAgIGludCBrID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIHJvd3MgLSAxKTsKKyAgICAgIHdoaWxlIChhdXguZmluZChrKSAhPSBhdXguZW5kKCkpIGsgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgcm93cyAtIDEpOwogICAgICAgYXV4Lmluc2VydChrKTsKIAotICAgICAgZHN0Lmluc2VydChrLGopID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgICAgICBkc3QuaW5zZXJ0KGssIGopID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAgICAgfQogICB9CiAgIGRzdC5maW5hbGl6ZSgpOwogfQogCi12b2lkIGVpVG9EZW5zZShjb25zdCBFaWdlblNwYXJzZU1hdHJpeCYgc3JjLCBEZW5zZU1hdHJpeCYgZHN0KQotewordm9pZCBlaVRvRGVuc2UoY29uc3QgRWlnZW5TcGFyc2VNYXRyaXgmIHNyYywgRGVuc2VNYXRyaXgmIGRzdCkgewogICBkc3Quc2V0WmVybygpOwotICBmb3IgKGludCBqPTA7IGo8c3JjLmNvbHMoKTsgKytqKQotICAgIGZvciAoRWlnZW5TcGFyc2VNYXRyaXg6OklubmVySXRlcmF0b3IgaXQoc3JjLmRlcml2ZWQoKSwgaik7IGl0OyArK2l0KQotICAgICAgZHN0KGl0LmluZGV4KCksaikgPSBpdC52YWx1ZSgpOworICBmb3IgKGludCBqID0gMDsgaiA8IHNyYy5jb2xzKCk7ICsraikKKyAgICBmb3IgKEVpZ2VuU3BhcnNlTWF0cml4OjpJbm5lckl0ZXJhdG9yIGl0KHNyYy5kZXJpdmVkKCksIGopOyBpdDsgKytpdCkgZHN0KGl0LmluZGV4KCksIGopID0gaXQudmFsdWUoKTsKIH0KIAogI2lmbmRlZiBOT0dNTQogI2luY2x1ZGUgImdtbS9nbW0uaCIKIHR5cGVkZWYgZ21tOjpjc2NfbWF0cml4PFNjYWxhcj4gR21tU3BhcnNlOwotdHlwZWRlZiBnbW06OmNvbF9tYXRyaXg8IGdtbTo6d3N2ZWN0b3I8U2NhbGFyPiA+IEdtbUR5blNwYXJzZTsKLXZvaWQgZWlUb0dtbShjb25zdCBFaWdlblNwYXJzZU1hdHJpeCYgc3JjLCBHbW1TcGFyc2UmIGRzdCkKLXsKK3R5cGVkZWYgZ21tOjpjb2xfbWF0cml4PGdtbTo6d3N2ZWN0b3I8U2NhbGFyPiA+IEdtbUR5blNwYXJzZTsKK3ZvaWQgZWlUb0dtbShjb25zdCBFaWdlblNwYXJzZU1hdHJpeCYgc3JjLCBHbW1TcGFyc2UmIGRzdCkgewogICBHbW1EeW5TcGFyc2UgdG1wKHNyYy5yb3dzKCksIHNyYy5jb2xzKCkpOwotICBmb3IgKGludCBqPTA7IGo8c3JjLmNvbHMoKTsgKytqKQotICAgIGZvciAoRWlnZW5TcGFyc2VNYXRyaXg6OklubmVySXRlcmF0b3IgaXQoc3JjLmRlcml2ZWQoKSwgaik7IGl0OyArK2l0KQotICAgICAgdG1wKGl0LmluZGV4KCksaikgPSBpdC52YWx1ZSgpOworICBmb3IgKGludCBqID0gMDsgaiA8IHNyYy5jb2xzKCk7ICsraikKKyAgICBmb3IgKEVpZ2VuU3BhcnNlTWF0cml4OjpJbm5lckl0ZXJhdG9yIGl0KHNyYy5kZXJpdmVkKCksIGopOyBpdDsgKytpdCkgdG1wKGl0LmluZGV4KCksIGopID0gaXQudmFsdWUoKTsKICAgZ21tOjpjb3B5KHRtcCwgZHN0KTsKIH0KICNlbmRpZgpAQCAtODUsMTIgKzczLDEwIEBACiAjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9tdGwvbXRsLmhwcD4KIHR5cGVkZWYgbXRsOjpjb21wcmVzc2VkMkQ8U2NhbGFyLCBtdGw6Om1hdHJpeDo6cGFyYW1ldGVyczxtdGw6OnRhZzo6Y29sX21ham9yPiA+IE10bFNwYXJzZTsKIHR5cGVkZWYgbXRsOjpjb21wcmVzc2VkMkQ8U2NhbGFyLCBtdGw6Om1hdHJpeDo6cGFyYW1ldGVyczxtdGw6OnRhZzo6cm93X21ham9yPiA+IE10bFNwYXJzZVJvd01ham9yOwotdm9pZCBlaVRvTXRsKGNvbnN0IEVpZ2VuU3BhcnNlTWF0cml4JiBzcmMsIE10bFNwYXJzZSYgZHN0KQotewordm9pZCBlaVRvTXRsKGNvbnN0IEVpZ2VuU3BhcnNlTWF0cml4JiBzcmMsIE10bFNwYXJzZSYgZHN0KSB7CiAgIG10bDo6bWF0cml4OjppbnNlcnRlcjxNdGxTcGFyc2U+IGlucyhkc3QpOwotICBmb3IgKGludCBqPTA7IGo8c3JjLmNvbHMoKTsgKytqKQotICAgIGZvciAoRWlnZW5TcGFyc2VNYXRyaXg6OklubmVySXRlcmF0b3IgaXQoc3JjLmRlcml2ZWQoKSwgaik7IGl0OyArK2l0KQotICAgICAgaW5zW2l0LmluZGV4KCldW2pdID0gaXQudmFsdWUoKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBzcmMuY29scygpOyArK2opCisgICAgZm9yIChFaWdlblNwYXJzZU1hdHJpeDo6SW5uZXJJdGVyYXRvciBpdChzcmMuZGVyaXZlZCgpLCBqKTsgaXQ7ICsraXQpIGluc1tpdC5pbmRleCgpXVtqXSA9IGl0LnZhbHVlKCk7CiB9CiAjZW5kaWYKIApAQCAtOTgsMjAgKzg0LDE4IEBACiBleHRlcm4gIkMiIHsKICNpbmNsdWRlICJjcy5oIgogfQotdm9pZCBlaVRvQ1NwYXJzZShjb25zdCBFaWdlblNwYXJzZU1hdHJpeCYgc3JjLCBjcyogJmRzdCkKLXsKLSAgY3MqIGF1eCA9IGNzX3NwYWxsb2MgKDAsIDAsIDEsIDEsIDEpOwotICBmb3IgKGludCBqPTA7IGo8c3JjLmNvbHMoKTsgKytqKQordm9pZCBlaVRvQ1NwYXJzZShjb25zdCBFaWdlblNwYXJzZU1hdHJpeCYgc3JjLCBjcyomIGRzdCkgeworICBjcyogYXV4ID0gY3Nfc3BhbGxvYygwLCAwLCAxLCAxLCAxKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBzcmMuY29scygpOyArK2opCiAgICAgZm9yIChFaWdlblNwYXJzZU1hdHJpeDo6SW5uZXJJdGVyYXRvciBpdChzcmMuZGVyaXZlZCgpLCBqKTsgaXQ7ICsraXQpCi0gICAgICBpZiAoIWNzX2VudHJ5KGF1eCwgaXQuaW5kZXgoKSwgaiwgaXQudmFsdWUoKSkpCi0gICAgICB7CisgICAgICBpZiAoIWNzX2VudHJ5KGF1eCwgaXQuaW5kZXgoKSwgaiwgaXQudmFsdWUoKSkpIHsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJjc19lbnRyeSBlcnJvclxuIjsKICAgICAgICAgZXhpdCgyKTsKICAgICAgIH0KLSAgIGRzdCA9IGNzX2NvbXByZXNzKGF1eCk7Ci0vLyAgICBjc19zcGZyZWUoYXV4KTsKKyAgZHN0ID0gY3NfY29tcHJlc3MoYXV4KTsKKyAgLy8gICAgY3Nfc3BmcmVlKGF1eCk7CiB9Ci0jZW5kaWYgLy8gQ1NQQVJTRQorI2VuZGlmICAvLyBDU1BBUlNFCiAKICNpZm5kZWYgTk9VQkxBUwogI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvdWJsYXMvdmVjdG9yLmhwcD4KQEAgLTEyMywyMiArMTA3LDE4IEBACiAjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy91Ymxhcy92ZWN0b3Jfb2ZfdmVjdG9yLmhwcD4KICNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL29wZXJhdGlvbi5ocHA+CiAKLXR5cGVkZWYgYm9vc3Q6Om51bWVyaWM6OnVibGFzOjpjb21wcmVzc2VkX21hdHJpeDxTY2FsYXIsYm9vc3Q6Om51bWVyaWM6OnVibGFzOjpjb2x1bW5fbWFqb3I+IFVCbGFzU3BhcnNlOwordHlwZWRlZiBib29zdDo6bnVtZXJpYzo6dWJsYXM6OmNvbXByZXNzZWRfbWF0cml4PFNjYWxhciwgYm9vc3Q6Om51bWVyaWM6OnVibGFzOjpjb2x1bW5fbWFqb3I+IFVCbGFzU3BhcnNlOwogCi12b2lkIGVpVG9VYmxhcyhjb25zdCBFaWdlblNwYXJzZU1hdHJpeCYgc3JjLCBVQmxhc1NwYXJzZSYgZHN0KQotewordm9pZCBlaVRvVWJsYXMoY29uc3QgRWlnZW5TcGFyc2VNYXRyaXgmIHNyYywgVUJsYXNTcGFyc2UmIGRzdCkgewogICBkc3QucmVzaXplKHNyYy5yb3dzKCksIHNyYy5jb2xzKCksIGZhbHNlKTsKLSAgZm9yIChpbnQgaj0wOyBqPHNyYy5jb2xzKCk7ICsraikKLSAgICBmb3IgKEVpZ2VuU3BhcnNlTWF0cml4OjpJbm5lckl0ZXJhdG9yIGl0KHNyYy5kZXJpdmVkKCksIGopOyBpdDsgKytpdCkKLSAgICAgIGRzdChpdC5pbmRleCgpLGopID0gaXQudmFsdWUoKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBzcmMuY29scygpOyArK2opCisgICAgZm9yIChFaWdlblNwYXJzZU1hdHJpeDo6SW5uZXJJdGVyYXRvciBpdChzcmMuZGVyaXZlZCgpLCBqKTsgaXQ7ICsraXQpIGRzdChpdC5pbmRleCgpLCBqKSA9IGl0LnZhbHVlKCk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBFaWdlblR5cGUsIHR5cGVuYW1lIFVibGFzVHlwZT4KLXZvaWQgZWlUb1VibGFzVmVjKGNvbnN0IEVpZ2VuVHlwZSYgc3JjLCBVYmxhc1R5cGUmIGRzdCkKLXsKK3ZvaWQgZWlUb1VibGFzVmVjKGNvbnN0IEVpZ2VuVHlwZSYgc3JjLCBVYmxhc1R5cGUmIGRzdCkgewogICBkc3QucmVzaXplKHNyYy5zaXplKCkpOwotICBmb3IgKGludCBqPTA7IGo8c3JjLnNpemUoKTsgKytqKQotICAgICAgZHN0W2pdID0gc3JjLmNvZWZmKGopOworICBmb3IgKGludCBqID0gMDsgaiA8IHNyYy5zaXplKCk7ICsraikgZHN0W2pdID0gc3JjLmNvZWZmKGopOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2JlbmNoL0JlbmNoVGltZXIuaCBiL2JlbmNoL0JlbmNoVGltZXIuaAppbmRleCA4YTBkYmJlLi4wYjhjNjNjIDEwMDY0NAotLS0gYS9iZW5jaC9CZW5jaFRpbWVyLmgKKysrIGIvYmVuY2gvQmVuY2hUaW1lci5oCkBAIC0xMiwxOSArMTIsMTkgQEAKICNkZWZpbmUgRUlHRU5fQkVOQ0hfVElNRVJSX0gKIAogI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jIGlmbmRlZiBOT01JTk1BWAotIyAgIGRlZmluZSBOT01JTk1BWAotIyAgIGRlZmluZSBFSUdFTl9CVF9VTkRFRl9OT01JTk1BWAotIyBlbmRpZgotIyBpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgotIyAgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jICAgZGVmaW5lIEVJR0VOX0JUX1VOREVGX1dJTjMyX0xFQU5fQU5EX01FQU4KLSMgZW5kaWYKLSMgaW5jbHVkZSA8d2luZG93cy5oPgorI2lmbmRlZiBOT01JTk1BWAorI2RlZmluZSBOT01JTk1BWAorI2RlZmluZSBFSUdFTl9CVF9VTkRFRl9OT01JTk1BWAorI2VuZGlmCisjaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBFSUdFTl9CVF9VTkRFRl9XSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKICNpbmNsdWRlIDxtYWNoL21hY2hfdGltZS5oPgogI2Vsc2UKLSMgaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYKIAogc3RhdGljIHZvaWQgZXNjYXBlKHZvaWQgKnApIHsKQEAgLTQxLDI3ICs0MSwyMCBAQAogCiAjaW5jbHVkZSA8RWlnZW4vQ29yZT4KIAotbmFtZXNwYWNlIEVpZ2VuCi17CituYW1lc3BhY2UgRWlnZW4gewogCi1lbnVtIHsKLSAgQ1BVX1RJTUVSID0gMCwKLSAgUkVBTF9USU1FUiA9IDEKLX07CitlbnVtIHsgQ1BVX1RJTUVSID0gMCwgUkVBTF9USU1FUiA9IDEgfTsKIAogLyoqIEVsYXBzZWQgdGltZSB0aW1lciBrZWVwaW5nIHRoZSBiZXN0IHRyeS4KLSAgKgotICAqIE9uIFBPU0lYIHBsYXRmb3JtcyB3ZSB1c2UgY2xvY2tfZ2V0dGltZSB3aXRoIENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRC4KLSAgKiBPbiBXaW5kb3dzIHdlIHVzZSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgotICAqCi0gICogSW1wb3J0YW50OiBvbiBsaW51eCwgeW91IG11c3QgbGluayB3aXRoIC1scnQKLSAgKi8KLWNsYXNzIEJlbmNoVGltZXIKLXsKLXB1YmxpYzoKLQotICBCZW5jaFRpbWVyKCkKLSAgeworICoKKyAqIE9uIFBPU0lYIHBsYXRmb3JtcyB3ZSB1c2UgY2xvY2tfZ2V0dGltZSB3aXRoIENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRC4KKyAqIE9uIFdpbmRvd3Mgd2UgdXNlIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyCisgKgorICogSW1wb3J0YW50OiBvbiBsaW51eCwgeW91IG11c3QgbGluayB3aXRoIC1scnQKKyAqLworY2xhc3MgQmVuY2hUaW1lciB7CisgcHVibGljOgorICBCZW5jaFRpbWVyKCkgewogI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCiAgICAgTEFSR0VfSU5URUdFUiBmcmVxOwogICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmZyZXEpOwpAQCAtNzIsNjkgKzY1LDUzIEBACiAKICAgfkJlbmNoVGltZXIoKSB7fQogCi0gIGlubGluZSB2b2lkIHJlc2V0KCkKLSAgeworICBpbmxpbmUgdm9pZCByZXNldCgpIHsKICAgICBtX2Jlc3RzLmZpbGwoMWU5KTsKICAgICBtX3dvcnN0cy5maWxsKDApOwogICAgIG1fdG90YWxzLnNldFplcm8oKTsKICAgfQotICBpbmxpbmUgdm9pZCBzdGFydCgpCi0gIHsKLSAgICBtX3N0YXJ0c1tDUFVfVElNRVJdICA9IGdldENwdVRpbWUoKTsKKyAgaW5saW5lIHZvaWQgc3RhcnQoKSB7CisgICAgbV9zdGFydHNbQ1BVX1RJTUVSXSA9IGdldENwdVRpbWUoKTsKICAgICBtX3N0YXJ0c1tSRUFMX1RJTUVSXSA9IGdldFJlYWxUaW1lKCk7CiAgIH0KLSAgaW5saW5lIHZvaWQgc3RvcCgpCi0gIHsKKyAgaW5saW5lIHZvaWQgc3RvcCgpIHsKICAgICBtX3RpbWVzW0NQVV9USU1FUl0gPSBnZXRDcHVUaW1lKCkgLSBtX3N0YXJ0c1tDUFVfVElNRVJdOwogICAgIG1fdGltZXNbUkVBTF9USU1FUl0gPSBnZXRSZWFsVGltZSgpIC0gbV9zdGFydHNbUkVBTF9USU1FUl07Ci0gICAgI2lmIEVJR0VOX1ZFUlNJT05fQVRfTEVBU1QoMiw5MCwwKQorI2lmIEVJR0VOX1ZFUlNJT05fQVRfTEVBU1QoMiwgOTAsIDApCiAgICAgbV9iZXN0cyA9IG1fYmVzdHMuY3dpc2VNaW4obV90aW1lcyk7CiAgICAgbV93b3JzdHMgPSBtX3dvcnN0cy5jd2lzZU1heChtX3RpbWVzKTsKLSAgICAjZWxzZQotICAgIG1fYmVzdHMoMCkgPSBzdGQ6Om1pbihtX2Jlc3RzKDApLG1fdGltZXMoMCkpOwotICAgIG1fYmVzdHMoMSkgPSBzdGQ6Om1pbihtX2Jlc3RzKDEpLG1fdGltZXMoMSkpOwotICAgIG1fd29yc3RzKDApID0gc3RkOjptYXgobV93b3JzdHMoMCksbV90aW1lcygwKSk7Ci0gICAgbV93b3JzdHMoMSkgPSBzdGQ6Om1heChtX3dvcnN0cygxKSxtX3RpbWVzKDEpKTsKLSAgICAjZW5kaWYKKyNlbHNlCisgICAgbV9iZXN0cygwKSA9IHN0ZDo6bWluKG1fYmVzdHMoMCksIG1fdGltZXMoMCkpOworICAgIG1fYmVzdHMoMSkgPSBzdGQ6Om1pbihtX2Jlc3RzKDEpLCBtX3RpbWVzKDEpKTsKKyAgICBtX3dvcnN0cygwKSA9IHN0ZDo6bWF4KG1fd29yc3RzKDApLCBtX3RpbWVzKDApKTsKKyAgICBtX3dvcnN0cygxKSA9IHN0ZDo6bWF4KG1fd29yc3RzKDEpLCBtX3RpbWVzKDEpKTsKKyNlbmRpZgogICAgIG1fdG90YWxzICs9IG1fdGltZXM7CiAgIH0KIAogICAvKiogUmV0dXJuIHRoZSBlbGFwc2VkIHRpbWUgaW4gc2Vjb25kcyBiZXR3ZWVuIHRoZSBsYXN0IHN0YXJ0L3N0b3AgcGFpcgotICAgICovCi0gIGlubGluZSBkb3VibGUgdmFsdWUoaW50IFRJTUVSID0gQ1BVX1RJTUVSKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIG1fdGltZXNbVElNRVJdOwotICB9CisgICAqLworICBpbmxpbmUgZG91YmxlIHZhbHVlKGludCBUSU1FUiA9IENQVV9USU1FUikgY29uc3QgeyByZXR1cm4gbV90aW1lc1tUSU1FUl07IH0KIAogICAvKiogUmV0dXJuIHRoZSBiZXN0IGVsYXBzZWQgdGltZSBpbiBzZWNvbmRzCi0gICAgKi8KLSAgaW5saW5lIGRvdWJsZSBiZXN0KGludCBUSU1FUiA9IENQVV9USU1FUikgY29uc3QKLSAgewotICAgIHJldHVybiBtX2Jlc3RzW1RJTUVSXTsKLSAgfQorICAgKi8KKyAgaW5saW5lIGRvdWJsZSBiZXN0KGludCBUSU1FUiA9IENQVV9USU1FUikgY29uc3QgeyByZXR1cm4gbV9iZXN0c1tUSU1FUl07IH0KIAogICAvKiogUmV0dXJuIHRoZSB3b3JzdCBlbGFwc2VkIHRpbWUgaW4gc2Vjb25kcwotICAgICovCi0gIGlubGluZSBkb3VibGUgd29yc3QoaW50IFRJTUVSID0gQ1BVX1RJTUVSKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIG1fd29yc3RzW1RJTUVSXTsKLSAgfQorICAgKi8KKyAgaW5saW5lIGRvdWJsZSB3b3JzdChpbnQgVElNRVIgPSBDUFVfVElNRVIpIGNvbnN0IHsgcmV0dXJuIG1fd29yc3RzW1RJTUVSXTsgfQogCiAgIC8qKiBSZXR1cm4gdGhlIHRvdGFsIGVsYXBzZWQgdGltZSBpbiBzZWNvbmRzLgotICAgICovCi0gIGlubGluZSBkb3VibGUgdG90YWwoaW50IFRJTUVSID0gQ1BVX1RJTUVSKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIG1fdG90YWxzW1RJTUVSXTsKLSAgfQorICAgKi8KKyAgaW5saW5lIGRvdWJsZSB0b3RhbChpbnQgVElNRVIgPSBDUFVfVElNRVIpIGNvbnN0IHsgcmV0dXJuIG1fdG90YWxzW1RJTUVSXTsgfQogCi0gIGlubGluZSBkb3VibGUgZ2V0Q3B1VGltZSgpIGNvbnN0Ci0gIHsKKyAgaW5saW5lIGRvdWJsZSBnZXRDcHVUaW1lKCkgY29uc3QgewogI2lmZGVmIF9XSU4zMgogICAgIExBUkdFX0lOVEVHRVIgcXVlcnlfdGlja3M7CiAgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnF1ZXJ5X3RpY2tzKTsKLSAgICByZXR1cm4gcXVlcnlfdGlja3MuUXVhZFBhcnQvbV9mcmVxdWVuY3k7CisgICAgcmV0dXJuIHF1ZXJ5X3RpY2tzLlF1YWRQYXJ0IC8gbV9mcmVxdWVuY3k7CiAjZWxpZiBfX0FQUExFX18KLSAgICByZXR1cm4gZG91YmxlKG1hY2hfYWJzb2x1dGVfdGltZSgpKSoxZS05OworICAgIHJldHVybiBkb3VibGUobWFjaF9hYnNvbHV0ZV90aW1lKCkpICogMWUtOTsKICNlbHNlCiAgICAgdGltZXNwZWMgdHM7CiAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQsICZ0cyk7CkBAIC0xNDIsMTQgKzExOSwxMyBAQAogI2VuZGlmCiAgIH0KIAotICBpbmxpbmUgZG91YmxlIGdldFJlYWxUaW1lKCkgY29uc3QKLSAgeworICBpbmxpbmUgZG91YmxlIGdldFJlYWxUaW1lKCkgY29uc3QgewogI2lmZGVmIF9XSU4zMgogICAgIFNZU1RFTVRJTUUgc3Q7CiAgICAgR2V0U3lzdGVtVGltZSgmc3QpOwogICAgIHJldHVybiAoZG91YmxlKXN0LndTZWNvbmQgKyAxLmUtMyAqIChkb3VibGUpc3Qud01pbGxpc2Vjb25kczsKICNlbGlmIF9fQVBQTEVfXwotICAgIHJldHVybiBkb3VibGUobWFjaF9hYnNvbHV0ZV90aW1lKCkpKjFlLTk7CisgICAgcmV0dXJuIGRvdWJsZShtYWNoX2Fic29sdXRlX3RpbWUoKSkgKiAxZS05OwogI2Vsc2UKICAgICB0aW1lc3BlYyB0czsKICAgICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMpOwpAQCAtMTU3LDcgKzEzMyw3IEBACiAjZW5kaWYKICAgfQogCi1wcm90ZWN0ZWQ6CisgcHJvdGVjdGVkOgogI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCiAgIGRvdWJsZSBtX2ZyZXF1ZW5jeTsKICNlbmRpZgpAQCAtMTY3LDMzICsxNDMsMzQgQEAKICAgVmVjdG9yMmQgbV93b3JzdHM7CiAgIFZlY3RvcjJkIG1fdG90YWxzOwogCi1wdWJsaWM6CisgcHVibGljOgogICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCiB9OwogCi0jZGVmaW5lIEJFTkNIKFRJTUVSLFRSSUVTLFJFUCxDT0RFKSB7IFwKLSAgICBUSU1FUi5yZXNldCgpOyBcCi0gICAgZm9yKGludCB1Z2x5dmFybmFtZTE9MDsgdWdseXZhcm5hbWUxPFRSSUVTOyArK3VnbHl2YXJuYW1lMSl7IFwKLSAgICAgIFRJTUVSLnN0YXJ0KCk7IFwKLSAgICAgIGZvcihpbnQgdWdseXZhcm5hbWUyPTA7IHVnbHl2YXJuYW1lMjxSRVA7ICsrdWdseXZhcm5hbWUyKXsgXAotICAgICAgICBDT0RFOyBcCi0gICAgICB9IFwKLSAgICAgIFRJTUVSLnN0b3AoKTsgXAotICAgICAgY2xvYmJlcigpOyBcCi0gICAgfSBcCisjZGVmaW5lIEJFTkNIKFRJTUVSLCBUUklFUywgUkVQLCBDT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRJTUVSLnJlc2V0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpbnQgdWdseXZhcm5hbWUxID0gMDsgdWdseXZhcm5hbWUxIDwgVFJJRVM7ICsrdWdseXZhcm5hbWUxKSB7IFwKKyAgICAgIFRJTUVSLnN0YXJ0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yIChpbnQgdWdseXZhcm5hbWUyID0gMDsgdWdseXZhcm5hbWUyIDwgUkVQOyArK3VnbHl2YXJuYW1lMikgeyBcCisgICAgICAgIENPREU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVElNRVIuc3RvcCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjbG9iYmVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CiAKLX0KK30gIC8vIG5hbWVzcGFjZSBFaWdlbgogCiAvLyBjbGVhbiAjZGVmaW5lZCB0b2tlbnMKICNpZmRlZiBFSUdFTl9CVF9VTkRFRl9OT01JTk1BWAotIyB1bmRlZiBFSUdFTl9CVF9VTkRFRl9OT01JTk1BWAotIyB1bmRlZiBOT01JTk1BWAorI3VuZGVmIEVJR0VOX0JUX1VOREVGX05PTUlOTUFYCisjdW5kZWYgTk9NSU5NQVgKICNlbmRpZgogCiAjaWZkZWYgRUlHRU5fQlRfVU5ERUZfV0lOMzJfTEVBTl9BTkRfTUVBTgotIyB1bmRlZiBFSUdFTl9CVF9VTkRFRl9XSU4zMl9MRUFOX0FORF9NRUFOCi0jIHVuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyN1bmRlZiBFSUdFTl9CVF9VTkRFRl9XSU4zMl9MRUFOX0FORF9NRUFOCisjdW5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgogI2VuZGlmCiAKLSNlbmRpZiAvLyBFSUdFTl9CRU5DSF9USU1FUlJfSAorI2VuZGlmICAvLyBFSUdFTl9CRU5DSF9USU1FUlJfSApkaWZmIC0tZ2l0IGEvYmVuY2gvQmVuY2hVdGlsLmggYi9iZW5jaC9CZW5jaFV0aWwuaAppbmRleCA4ODgzYTEzLi40YWRmMGFjIDEwMDY0NAotLS0gYS9iZW5jaC9CZW5jaFV0aWwuaAorKysgYi9iZW5jaC9CZW5jaFV0aWwuaApAQCAtMTgsNTQgKzE4LDUyIEBACiAjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL3B1bmN0dWF0aW9uL2NvbW1hLmhwcD4KICNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3Ivc3RyaW5naXplLmhwcD4KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbml0TWF0cml4X3JhbmRvbShNYXRyaXhUeXBlJiBtYXQpIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7Ci10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGluaXRNYXRyaXhfcmFuZG9tKE1hdHJpeFR5cGUmIG1hdCkKLXsKLSAgbWF0LnNldFJhbmRvbSgpOy8vID0gTWF0cml4VHlwZTo6cmFuZG9tKG1hdC5yb3dzKCksIG1hdC5jb2xzKCkpOwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGluaXRNYXRyaXhfcmFuZG9tKE1hdHJpeFR5cGUmIG1hdCkgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBpbml0TWF0cml4X3JhbmRvbShNYXRyaXhUeXBlJiBtYXQpIHsKKyAgbWF0LnNldFJhbmRvbSgpOyAgLy8gPSBNYXRyaXhUeXBlOjpyYW5kb20obWF0LnJvd3MoKSwgbWF0LmNvbHMoKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgaW5pdE1hdHJpeF9pZGVudGl0eShNYXRyaXhUeXBlJiBtYXQpIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7Ci10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGluaXRNYXRyaXhfaWRlbnRpdHkoTWF0cml4VHlwZSYgbWF0KQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGluaXRNYXRyaXhfaWRlbnRpdHkoTWF0cml4VHlwZSYgbWF0KSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpOwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGluaXRNYXRyaXhfaWRlbnRpdHkoTWF0cml4VHlwZSYgbWF0KSB7CiAgIG1hdC5zZXRJZGVudGl0eSgpOwogfQogCiAjaWZuZGVmIF9fSU5URUxfQ09NUElMRVIKLSNkZWZpbmUgRElTQUJMRV9TU0VfRVhDRVBUSU9OUygpICB7IFwKLSAgaW50IGF1eDsgXAotICBhc20oIFwKLSAgInN0bXhjc3IgICAlW2F1eF0gICAgICAgICAgIFxuXHQiIFwKLSAgIm9ybCAgICAgICAkMzI4MzIsICVbYXV4XSAgIFxuXHQiIFwKLSAgImxkbXhjc3IgICAlW2F1eF0gICAgICAgICAgIFxuXHQiIFwKLSAgOiA6IFthdXhdICJtIiAoYXV4KSk7IFwKLX0KKyNkZWZpbmUgRElTQUJMRV9TU0VfRVhDRVBUSU9OUygpICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYXV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20oInN0bXhjc3IgICAlW2F1eF0gICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgIm9ybCAgICAgICAkMzI4MzIsICVbYXV4XSAgIFxuXHQiIFwKKyAgICAgICAgImxkbXhjc3IgICAlW2F1eF0gICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiBbYXV4XSAibSIoYXV4KSk7ICAgICAgICAgICAgICAgIFwKKyAgfQogI2Vsc2UKLSNkZWZpbmUgRElTQUJMRV9TU0VfRVhDRVBUSU9OUygpICAKKyNkZWZpbmUgRElTQUJMRV9TU0VfRVhDRVBUSU9OUygpCiAjZW5kaWYKIAogI2lmZGVmIEJFTkNIX0dNTQogI2luY2x1ZGUgPGdtbS9nbW0uaD4KIHRlbXBsYXRlIDx0eXBlbmFtZSBFaWdlbk1hdHJpeFR5cGUsIHR5cGVuYW1lIEdtbU1hdHJpeFR5cGU+Ci12b2lkIGVpVG9HbW0oY29uc3QgRWlnZW5NYXRyaXhUeXBlJiBzcmMsIEdtbU1hdHJpeFR5cGUmIGRzdCkKLXsKLSAgZHN0LnJlc2l6ZShzcmMucm93cygpLHNyYy5jb2xzKCkpOwotICBmb3IgKGludCBqPTA7IGo8c3JjLmNvbHMoKTsgKytqKQotICAgIGZvciAoaW50IGk9MDsgaTxzcmMucm93cygpOyArK2kpCi0gICAgICBkc3QoaSxqKSA9IHNyYy5jb2VmZihpLGopOwordm9pZCBlaVRvR21tKGNvbnN0IEVpZ2VuTWF0cml4VHlwZSYgc3JjLCBHbW1NYXRyaXhUeXBlJiBkc3QpIHsKKyAgZHN0LnJlc2l6ZShzcmMucm93cygpLCBzcmMuY29scygpKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBzcmMuY29scygpOyArK2opCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMucm93cygpOyArK2kpIGRzdChpLCBqKSA9IHNyYy5jb2VmZihpLCBqKTsKIH0KICNlbmRpZgogCi0KICNpZmRlZiBCRU5DSF9HU0wKICNpbmNsdWRlIDxnc2wvZ3NsX21hdHJpeC5oPgogI2luY2x1ZGUgPGdzbC9nc2xfbGluYWxnLmg+CiAjaW5jbHVkZSA8Z3NsL2dzbF9laWdlbi5oPgogdGVtcGxhdGUgPHR5cGVuYW1lIEVpZ2VuTWF0cml4VHlwZT4KLXZvaWQgZWlUb0dzbChjb25zdCBFaWdlbk1hdHJpeFR5cGUmIHNyYywgZ3NsX21hdHJpeCoqIGRzdCkKLXsKLSAgZm9yIChpbnQgaj0wOyBqPHNyYy5jb2xzKCk7ICsraikKLSAgICBmb3IgKGludCBpPTA7IGk8c3JjLnJvd3MoKTsgKytpKQotICAgICAgZ3NsX21hdHJpeF9zZXQoKmRzdCwgaSwgaiwgc3JjLmNvZWZmKGksaikpOwordm9pZCBlaVRvR3NsKGNvbnN0IEVpZ2VuTWF0cml4VHlwZSYgc3JjLCBnc2xfbWF0cml4KiogZHN0KSB7CisgIGZvciAoaW50IGogPSAwOyBqIDwgc3JjLmNvbHMoKTsgKytqKQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjLnJvd3MoKTsgKytpKSBnc2xfbWF0cml4X3NldCgqZHN0LCBpLCBqLCBzcmMuY29lZmYoaSwgaikpOwogfQogI2VuZGlmCiAKQEAgLTczLDIwICs3MSwxNiBAQAogI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvdWJsYXMvbWF0cml4LmhwcD4KICNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL3ZlY3Rvci5ocHA+CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWlnZW5NYXRyaXhUeXBlLCB0eXBlbmFtZSBVYmxhc01hdHJpeFR5cGU+Ci12b2lkIGVpVG9VYmxhcyhjb25zdCBFaWdlbk1hdHJpeFR5cGUmIHNyYywgVWJsYXNNYXRyaXhUeXBlJiBkc3QpCi17Ci0gIGRzdC5yZXNpemUoc3JjLnJvd3MoKSxzcmMuY29scygpKTsKLSAgZm9yIChpbnQgaj0wOyBqPHNyYy5jb2xzKCk7ICsraikKLSAgICBmb3IgKGludCBpPTA7IGk8c3JjLnJvd3MoKTsgKytpKQotICAgICAgZHN0KGksaikgPSBzcmMuY29lZmYoaSxqKTsKK3ZvaWQgZWlUb1VibGFzKGNvbnN0IEVpZ2VuTWF0cml4VHlwZSYgc3JjLCBVYmxhc01hdHJpeFR5cGUmIGRzdCkgeworICBkc3QucmVzaXplKHNyYy5yb3dzKCksIHNyYy5jb2xzKCkpOworICBmb3IgKGludCBqID0gMDsgaiA8IHNyYy5jb2xzKCk7ICsraikKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNyYy5yb3dzKCk7ICsraSkgZHN0KGksIGopID0gc3JjLmNvZWZmKGksIGopOwogfQogdGVtcGxhdGUgPHR5cGVuYW1lIEVpZ2VuVHlwZSwgdHlwZW5hbWUgVWJsYXNUeXBlPgotdm9pZCBlaVRvVWJsYXNWZWMoY29uc3QgRWlnZW5UeXBlJiBzcmMsIFVibGFzVHlwZSYgZHN0KQotewordm9pZCBlaVRvVWJsYXNWZWMoY29uc3QgRWlnZW5UeXBlJiBzcmMsIFVibGFzVHlwZSYgZHN0KSB7CiAgIGRzdC5yZXNpemUoc3JjLnNpemUoKSk7Ci0gIGZvciAoaW50IGo9MDsgajxzcmMuc2l6ZSgpOyArK2opCi0gICAgICBkc3Rbal0gPSBzcmMuY29lZmYoaik7CisgIGZvciAoaW50IGogPSAwOyBqIDwgc3JjLnNpemUoKTsgKytqKSBkc3Rbal0gPSBzcmMuY29lZmYoaik7CiB9CiAjZW5kaWYKIAotI2VuZGlmIC8vIEVJR0VOX0JFTkNIX1VUSUxfSAorI2VuZGlmICAvLyBFSUdFTl9CRU5DSF9VVElMX0gKZGlmZiAtLWdpdCBhL2JlbmNoL2FuYWx5emUtYmxvY2tpbmctc2l6ZXMuY3BwIGIvYmVuY2gvYW5hbHl6ZS1ibG9ja2luZy1zaXplcy5jcHAKaW5kZXggNmJjNGFjYS4uYzQzNjczOSAxMDA2NDQKLS0tIGEvYmVuY2gvYW5hbHl6ZS1ibG9ja2luZy1zaXplcy5jcHAKKysrIGIvYmVuY2gvYW5hbHl6ZS1ibG9ja2luZy1zaXplcy5jcHAKQEAgLTM3LDIwICszNywxNyBAQAogICByZXR1cm4gbDsKIH0KIAotdWludDE2X3QgY29tcGFjdF9zaXplX3RyaXBsZShzaXplX3Qgaywgc2l6ZV90IG0sIHNpemVfdCBuKQotewordWludDE2X3QgY29tcGFjdF9zaXplX3RyaXBsZShzaXplX3Qgaywgc2l6ZV90IG0sIHNpemVfdCBuKSB7CiAgIHJldHVybiAobG9nMl9wb3QoaykgPDwgOCkgfCAobG9nMl9wb3QobSkgPDwgNCkgfCBsb2cyX3BvdChuKTsKIH0KIAogLy8ganVzdCBhIGhlbHBlciB0byBzdG9yZSBhIHRyaXBsZSBvZiBLLE0sTiBzaXplcyBmb3IgbWF0cml4IHByb2R1Y3QKLXN0cnVjdCBzaXplX3RyaXBsZV90Ci17CitzdHJ1Y3Qgc2l6ZV90cmlwbGVfdCB7CiAgIHVpbnQxNl90IGssIG0sIG47CiAgIHNpemVfdHJpcGxlX3QoKSA6IGsoMCksIG0oMCksIG4oMCkge30KICAgc2l6ZV90cmlwbGVfdChzaXplX3QgX2ssIHNpemVfdCBfbSwgc2l6ZV90IF9uKSA6IGsoX2spLCBtKF9tKSwgbihfbikge30KICAgc2l6ZV90cmlwbGVfdChjb25zdCBzaXplX3RyaXBsZV90JiBvKSA6IGsoby5rKSwgbShvLm0pLCBuKG8ubikge30KLSAgc2l6ZV90cmlwbGVfdCh1aW50MTZfdCBjb21wYWN0KQotICB7CisgIHNpemVfdHJpcGxlX3QodWludDE2X3QgY29tcGFjdCkgewogICAgIGsgPSAxIDw8ICgoY29tcGFjdCAmIDB4ZjAwKSA+PiA4KTsKICAgICBtID0gMSA8PCAoKGNvbXBhY3QgJiAweDBmMCkgPj4gNCk7CiAgICAgbiA9IDEgPDwgKChjb21wYWN0ICYgMHgwMGYpID4+IDApOwpAQCAtNTgsMzUgKzU1LDIzIEBACiAgIGJvb2wgaXNfY3ViaWMoKSBjb25zdCB7IHJldHVybiBrID09IG0gJiYgbSA9PSBuOyB9CiB9OwogCi1vc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIHMsIGNvbnN0IHNpemVfdHJpcGxlX3QmIHQpCi17Ci0gIHJldHVybiBzIDw8ICIoIiA8PCB0LmsgPDwgIiwgIiA8PCB0Lm0gPDwgIiwgIiA8PCB0Lm4gPDwgIikiOwotfQorb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBzLCBjb25zdCBzaXplX3RyaXBsZV90JiB0KSB7IHJldHVybiBzIDw8ICIoIiA8PCB0LmsgPDwgIiwgIiA8PCB0Lm0gPDwgIiwgIiA8PCB0Lm4gPDwgIikiOyB9CiAKLXN0cnVjdCBpbnB1dGZpbGVfZW50cnlfdAoteworc3RydWN0IGlucHV0ZmlsZV9lbnRyeV90IHsKICAgdWludDE2X3QgcHJvZHVjdF9zaXplOwogICB1aW50MTZfdCBwb3RfYmxvY2tfc2l6ZTsKICAgc2l6ZV90cmlwbGVfdCBub25wb3RfYmxvY2tfc2l6ZTsKICAgZmxvYXQgZ2Zsb3BzOwogfTsKIAotc3RydWN0IGlucHV0ZmlsZV90Ci17Ci0gIGVudW0gY2xhc3MgdHlwZV90IHsKLSAgICB1bmtub3duLAotICAgIGFsbF9wb3Rfc2l6ZXMsCi0gICAgZGVmYXVsdF9zaXplcwotICB9Oworc3RydWN0IGlucHV0ZmlsZV90IHsKKyAgZW51bSBjbGFzcyB0eXBlX3QgeyB1bmtub3duLCBhbGxfcG90X3NpemVzLCBkZWZhdWx0X3NpemVzIH07CiAKICAgc3RyaW5nIGZpbGVuYW1lOwogICB2ZWN0b3I8aW5wdXRmaWxlX2VudHJ5X3Q+IGVudHJpZXM7CiAgIHR5cGVfdCB0eXBlOwogCi0gIGlucHV0ZmlsZV90KGNvbnN0IHN0cmluZyYgZm5hbWUpCi0gICAgOiBmaWxlbmFtZShmbmFtZSkKLSAgICAsIHR5cGUodHlwZV90Ojp1bmtub3duKQotICB7CisgIGlucHV0ZmlsZV90KGNvbnN0IHN0cmluZyYgZm5hbWUpIDogZmlsZW5hbWUoZm5hbWUpLCB0eXBlKHR5cGVfdDo6dW5rbm93bikgewogICAgIGlmc3RyZWFtIHN0cmVhbShmaWxlbmFtZSk7CiAgICAgaWYgKCFzdHJlYW0uaXNfb3BlbigpKSB7CiAgICAgICBjZXJyIDw8ICJjb3VsZG4ndCBvcGVuIGlucHV0IGZpbGU6ICIgPDwgZmlsZW5hbWUgPDwgZW5kbDsKQEAgLTExMSwyNyArOTYsMTcgQEAKICAgICAgICAgdHlwZSA9IHR5cGVfdDo6ZGVmYXVsdF9zaXplczsKICAgICAgICAgY29udGludWU7CiAgICAgICB9Ci0gICAgICAKIAogICAgICAgaWYgKHR5cGUgPT0gdHlwZV90Ojp1bmtub3duKSB7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQotICAgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICBjYXNlIHR5cGVfdDo6YWxsX3BvdF9zaXplczogewogICAgICAgICAgIHVuc2lnbmVkIGludCBwcm9kdWN0X3NpemUsIGJsb2NrX3NpemU7CiAgICAgICAgICAgZmxvYXQgZ2Zsb3BzOwotICAgICAgICAgIGludCBzc2NhbmZfcmVzdWx0ID0KLSAgICAgICAgICAgIHNzY2FuZihsaW5lLmNfc3RyKCksICIleCAleCAlZiIsCi0gICAgICAgICAgICAgICAgICAgJnByb2R1Y3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAmYmxvY2tfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAmZ2Zsb3BzKTsKLSAgICAgICAgICBpZiAoMyAhPSBzc2NhbmZfcmVzdWx0IHx8Ci0gICAgICAgICAgICAgICFwcm9kdWN0X3NpemUgfHwKLSAgICAgICAgICAgICAgcHJvZHVjdF9zaXplID4gMHhmZmYgfHwKLSAgICAgICAgICAgICAgIWJsb2NrX3NpemUgfHwKLSAgICAgICAgICAgICAgYmxvY2tfc2l6ZSA+IDB4ZmZmIHx8Ci0gICAgICAgICAgICAgICFpc2Zpbml0ZShnZmxvcHMpKQotICAgICAgICAgIHsKKyAgICAgICAgICBpbnQgc3NjYW5mX3Jlc3VsdCA9IHNzY2FuZihsaW5lLmNfc3RyKCksICIleCAleCAlZiIsICZwcm9kdWN0X3NpemUsICZibG9ja19zaXplLCAmZ2Zsb3BzKTsKKyAgICAgICAgICBpZiAoMyAhPSBzc2NhbmZfcmVzdWx0IHx8ICFwcm9kdWN0X3NpemUgfHwgcHJvZHVjdF9zaXplID4gMHhmZmYgfHwgIWJsb2NrX3NpemUgfHwgYmxvY2tfc2l6ZSA+IDB4ZmZmIHx8CisgICAgICAgICAgICAgICFpc2Zpbml0ZShnZmxvcHMpKSB7CiAgICAgICAgICAgICBjZXJyIDw8ICJpbGwtZm9ybWVkIGlucHV0IGZpbGU6ICIgPDwgZmlsZW5hbWUgPDwgZW5kbDsKICAgICAgICAgICAgIGNlcnIgPDwgIm9mZmVuZGluZyBsaW5lOiIgPDwgZW5kbCA8PCBsaW5lIDw8IGVuZGw7CiAgICAgICAgICAgICBleGl0KDEpOwpAQCAtMTUwLDE2ICsxMjUsOCBAQAogICAgICAgICAgIHVuc2lnbmVkIGludCBwcm9kdWN0X3NpemU7CiAgICAgICAgICAgZmxvYXQgZ2Zsb3BzOwogICAgICAgICAgIGludCBiaywgYm0sIGJuOwotICAgICAgICAgIGludCBzc2NhbmZfcmVzdWx0ID0KLSAgICAgICAgICAgIHNzY2FuZihsaW5lLmNfc3RyKCksICIleCBkZWZhdWx0KCVkLCAlZCwgJWQpICVmIiwKLSAgICAgICAgICAgICAgICAgICAmcHJvZHVjdF9zaXplLAotICAgICAgICAgICAgICAgICAgICZiaywgJmJtLCAmYm4sCi0gICAgICAgICAgICAgICAgICAgJmdmbG9wcyk7Ci0gICAgICAgICAgaWYgKDUgIT0gc3NjYW5mX3Jlc3VsdCB8fAotICAgICAgICAgICAgICAhcHJvZHVjdF9zaXplIHx8Ci0gICAgICAgICAgICAgIHByb2R1Y3Rfc2l6ZSA+IDB4ZmZmIHx8Ci0gICAgICAgICAgICAgICFpc2Zpbml0ZShnZmxvcHMpKQotICAgICAgICAgIHsKKyAgICAgICAgICBpbnQgc3NjYW5mX3Jlc3VsdCA9IHNzY2FuZihsaW5lLmNfc3RyKCksICIleCBkZWZhdWx0KCVkLCAlZCwgJWQpICVmIiwgJnByb2R1Y3Rfc2l6ZSwgJmJrLCAmYm0sICZibiwgJmdmbG9wcyk7CisgICAgICAgICAgaWYgKDUgIT0gc3NjYW5mX3Jlc3VsdCB8fCAhcHJvZHVjdF9zaXplIHx8IHByb2R1Y3Rfc2l6ZSA+IDB4ZmZmIHx8ICFpc2Zpbml0ZShnZmxvcHMpKSB7CiAgICAgICAgICAgICBjZXJyIDw8ICJpbGwtZm9ybWVkIGlucHV0IGZpbGU6ICIgPDwgZmlsZW5hbWUgPDwgZW5kbDsKICAgICAgICAgICAgIGNlcnIgPDwgIm9mZmVuZGluZyBsaW5lOiIgPDwgZW5kbCA8PCBsaW5lIDw8IGVuZGw7CiAgICAgICAgICAgICBleGl0KDEpOwpAQCAtMTc1LDcgKzE0Miw3IEBACiAgICAgICAgICAgZW50cmllcy5wdXNoX2JhY2soZW50cnkpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC0xOTIsMjcgKzE1OSwyMiBAQAogICB9CiB9OwogCi1zdHJ1Y3QgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV9lbnRyeV90Ci17CitzdHJ1Y3QgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV9lbnRyeV90IHsKICAgdWludDE2X3QgcHJvZHVjdF9zaXplOwogICB1aW50MTZfdCBibG9ja19zaXplOwogCiAgIGZsb2F0IGVmZmljaWVuY3k7CiB9OwogCi1ib29sIGxvd2VyX2VmZmljaWVuY3koY29uc3QgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV9lbnRyeV90JiBlMSwgY29uc3QgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV9lbnRyeV90JiBlMikKLXsKK2Jvb2wgbG93ZXJfZWZmaWNpZW5jeShjb25zdCBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX2VudHJ5X3QmIGUxLCBjb25zdCBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX2VudHJ5X3QmIGUyKSB7CiAgIHJldHVybiBlMS5lZmZpY2llbmN5IDwgZTIuZWZmaWNpZW5jeTsKIH0KIAotc3RydWN0IHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdAoteworc3RydWN0IHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdCB7CiAgIHN0cmluZyBmaWxlbmFtZTsKICAgdmVjdG9yPHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfZW50cnlfdD4gZW50cmllczsKIAotICBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX3QoY29uc3QgaW5wdXRmaWxlX3QmIGlucHV0ZmlsZSkKLSAgICA6IGZpbGVuYW1lKGlucHV0ZmlsZS5maWxlbmFtZSkKLSAgeworICBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX3QoY29uc3QgaW5wdXRmaWxlX3QmIGlucHV0ZmlsZSkgOiBmaWxlbmFtZShpbnB1dGZpbGUuZmlsZW5hbWUpIHsKICAgICBpZiAoaW5wdXRmaWxlLnR5cGUgIT0gaW5wdXRmaWxlX3Q6OnR5cGVfdDo6YWxsX3BvdF9zaXplcykgewogICAgICAgYWJvcnQoKTsKICAgICB9CkBAIC0yMjAsMjAgKzE4MiwxNiBAQAogICAgIGF1dG8gaXRfZmlyc3Rfd2l0aF9naXZlbl9wcm9kdWN0X3NpemUgPSBpdDsKICAgICB3aGlsZSAoaXQgIT0gaW5wdXRmaWxlLmVudHJpZXMuZW5kKCkpIHsKICAgICAgICsraXQ7Ci0gICAgICBpZiAoaXQgPT0gaW5wdXRmaWxlLmVudHJpZXMuZW5kKCkgfHwKLSAgICAgICAgaXQtPnByb2R1Y3Rfc2l6ZSAhPSBpdF9maXJzdF93aXRoX2dpdmVuX3Byb2R1Y3Rfc2l6ZS0+cHJvZHVjdF9zaXplKQotICAgICAgeworICAgICAgaWYgKGl0ID09IGlucHV0ZmlsZS5lbnRyaWVzLmVuZCgpIHx8IGl0LT5wcm9kdWN0X3NpemUgIT0gaXRfZmlyc3Rfd2l0aF9naXZlbl9wcm9kdWN0X3NpemUtPnByb2R1Y3Rfc2l6ZSkgewogICAgICAgICBpbXBvcnRfaW5wdXRfZmlsZV9yYW5nZV9vbmVfcHJvZHVjdF9zaXplKGl0X2ZpcnN0X3dpdGhfZ2l2ZW5fcHJvZHVjdF9zaXplLCBpdCk7CiAgICAgICAgIGl0X2ZpcnN0X3dpdGhfZ2l2ZW5fcHJvZHVjdF9zaXplID0gaXQ7CiAgICAgICB9CiAgICAgfQogICB9CiAKLXByaXZhdGU6Ci0gIHZvaWQgaW1wb3J0X2lucHV0X2ZpbGVfcmFuZ2Vfb25lX3Byb2R1Y3Rfc2l6ZSgKLSAgICBjb25zdCB2ZWN0b3I8aW5wdXRmaWxlX2VudHJ5X3Q+Ojpjb25zdF9pdGVyYXRvciYgYmVnaW4sCi0gICAgY29uc3QgdmVjdG9yPGlucHV0ZmlsZV9lbnRyeV90Pjo6Y29uc3RfaXRlcmF0b3ImIGVuZCkKLSAgeworIHByaXZhdGU6CisgIHZvaWQgaW1wb3J0X2lucHV0X2ZpbGVfcmFuZ2Vfb25lX3Byb2R1Y3Rfc2l6ZShjb25zdCB2ZWN0b3I8aW5wdXRmaWxlX2VudHJ5X3Q+Ojpjb25zdF9pdGVyYXRvciYgYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8aW5wdXRmaWxlX2VudHJ5X3Q+Ojpjb25zdF9pdGVyYXRvciYgZW5kKSB7CiAgICAgdWludDE2X3QgcHJvZHVjdF9zaXplID0gYmVnaW4tPnByb2R1Y3Rfc2l6ZTsKICAgICBmbG9hdCBtYXhfZ2Zsb3BzID0gMC4wZjsKICAgICBmb3IgKGF1dG8gaXQgPSBiZWdpbjsgaXQgIT0gZW5kOyArK2l0KSB7CkBAIC0yNTQsOSArMjEyLDcgQEAKICAgfQogfTsKIAotdm9pZCBjaGVja19hbGxfZmlsZXNfaW5fc2FtZV9leGFjdF9vcmRlcigKLSAgICAgICBjb25zdCB2ZWN0b3I8cHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90PiYgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMpCi17Cit2b2lkIGNoZWNrX2FsbF9maWxlc19pbl9zYW1lX2V4YWN0X29yZGVyKGNvbnN0IHZlY3RvcjxwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX3Q+JiBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcykgewogICBpZiAocHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMuZW1wdHkoKSkgewogICAgIHJldHVybjsKICAgfQpAQCAtMjY2LDExICsyMjIsOCBAQAogCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMuc2l6ZSgpOyBpKyspIHsKICAgICBpZiAocHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXNbaV0uZW50cmllcy5zaXplKCkgIT0gbnVtX2VudHJpZXMpIHsKLSAgICAgIGNlcnIgPDwgInRoZXNlIGZpbGVzIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzOiAiCi0gICAgICAgICAgIDw8IHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzW2ldLmZpbGVuYW1lCi0gICAgICAgICAgIDw8ICIgYW5kICIKLSAgICAgICAgICAgPDwgZmlyc3RfZmlsZS5maWxlbmFtZQotICAgICAgICAgICA8PCBlbmRsOworICAgICAgY2VyciA8PCAidGhlc2UgZmlsZXMgaGF2ZSBkaWZmZXJlbnQgbnVtYmVyIG9mIGVudHJpZXM6ICIgPDwgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXNbaV0uZmlsZW5hbWUgPDwgIiBhbmQgIgorICAgICAgICAgICA8PCBmaXJzdF9maWxlLmZpbGVuYW1lIDw8IGVuZGw7CiAgICAgICBleGl0KDEpOwogICAgIH0KICAgfQpAQCAtMjgxLDEyICsyMzQsOCBAQAogICAgIGZvciAoc2l6ZV90IGZpbGVfaW5kZXggPSAwOyBmaWxlX2luZGV4IDwgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMuc2l6ZSgpOyBmaWxlX2luZGV4KyspIHsKICAgICAgIGNvbnN0IHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdCYgY3VyX2ZpbGUgPSBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlc1tmaWxlX2luZGV4XTsKICAgICAgIGlmIChjdXJfZmlsZS5lbnRyaWVzW2VudHJ5X2luZGV4XS5wcm9kdWN0X3NpemUgIT0gZW50cnlfcHJvZHVjdF9zaXplIHx8Ci0gICAgICAgICAgY3VyX2ZpbGUuZW50cmllc1tlbnRyeV9pbmRleF0uYmxvY2tfc2l6ZSAhPSBlbnRyeV9ibG9ja19zaXplKQotICAgICAgewotICAgICAgICBjZXJyIDw8ICJlbnRyaWVzIG5vdCBpbiBzYW1lIG9yZGVyIGJldHdlZW4gdGhlc2UgZmlsZXM6ICIKLSAgICAgICAgICAgICA8PCBmaXJzdF9maWxlLmZpbGVuYW1lCi0gICAgICAgICAgICAgPDwgIiBhbmQgIgotICAgICAgICAgICAgIDw8IGN1cl9maWxlLmZpbGVuYW1lCisgICAgICAgICAgY3VyX2ZpbGUuZW50cmllc1tlbnRyeV9pbmRleF0uYmxvY2tfc2l6ZSAhPSBlbnRyeV9ibG9ja19zaXplKSB7CisgICAgICAgIGNlcnIgPDwgImVudHJpZXMgbm90IGluIHNhbWUgb3JkZXIgYmV0d2VlbiB0aGVzZSBmaWxlczogIiA8PCBmaXJzdF9maWxlLmZpbGVuYW1lIDw8ICIgYW5kICIgPDwgY3VyX2ZpbGUuZmlsZW5hbWUKICAgICAgICAgICAgICA8PCBlbmRsOwogICAgICAgICBleGl0KDEpOwogICAgICAgfQpAQCAtMjk0LDEwICsyNDMsOCBAQAogICB9CiB9CiAKLWZsb2F0IGVmZmljaWVuY3lfb2Zfc3Vic2V0KAotICAgICAgICBjb25zdCB2ZWN0b3I8cHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90PiYgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMsCi0gICAgICAgIGNvbnN0IHZlY3RvcjxzaXplX3Q+JiBzdWJzZXQpCi17CitmbG9hdCBlZmZpY2llbmN5X29mX3N1YnNldChjb25zdCB2ZWN0b3I8cHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90PiYgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8c2l6ZV90PiYgc3Vic2V0KSB7CiAgIGlmIChzdWJzZXQuc2l6ZSgpIDw9IDEpIHsKICAgICByZXR1cm4gMS4wZjsKICAgfQpAQCAtMzA5LDkgKzI1Niw3IEBACiAgIHVpbnQxNl90IHByb2R1Y3Rfc2l6ZSA9IGZpcnN0X2ZpbGUuZW50cmllc1swXS5wcm9kdWN0X3NpemU7CiAgIHdoaWxlIChlbnRyeV9pbmRleCA8IG51bV9lbnRyaWVzKSB7CiAgICAgKytlbnRyeV9pbmRleDsKLSAgICBpZiAoZW50cnlfaW5kZXggPT0gbnVtX2VudHJpZXMgfHwKLSAgICAgICAgZmlyc3RfZmlsZS5lbnRyaWVzW2VudHJ5X2luZGV4XS5wcm9kdWN0X3NpemUgIT0gcHJvZHVjdF9zaXplKQotICAgIHsKKyAgICBpZiAoZW50cnlfaW5kZXggPT0gbnVtX2VudHJpZXMgfHwgZmlyc3RfZmlsZS5lbnRyaWVzW2VudHJ5X2luZGV4XS5wcm9kdWN0X3NpemUgIT0gcHJvZHVjdF9zaXplKSB7CiAgICAgICBmbG9hdCBlZmZpY2llbmN5X3RoaXNfcHJvZHVjdF9zaXplID0gMC4wZjsKICAgICAgIGZvciAoc2l6ZV90IGUgPSBmaXJzdF9lbnRyeV9pbmRleF93aXRoX3RoaXNfcHJvZHVjdF9zaXplOyBlIDwgZW50cnlfaW5kZXg7IGUrKykgewogICAgICAgICBmbG9hdCBlZmZpY2llbmN5X3RoaXNfZW50cnkgPSAxLjBmOwpAQCAtMzMxLDEwICsyNzYsOCBAQAogICByZXR1cm4gZWZmaWNpZW5jeTsKIH0KIAotdm9pZCBkdW1wX3RhYmxlX2Zvcl9zdWJzZXQoCi0gICAgICAgIGNvbnN0IHZlY3RvcjxwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX3Q+JiBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcywKLSAgICAgICAgY29uc3QgdmVjdG9yPHNpemVfdD4mIHN1YnNldCkKLXsKK3ZvaWQgZHVtcF90YWJsZV9mb3Jfc3Vic2V0KGNvbnN0IHZlY3RvcjxwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX3Q+JiBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxzaXplX3Q+JiBzdWJzZXQpIHsKICAgY29uc3QgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90JiBmaXJzdF9maWxlID0gcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXNbc3Vic2V0WzBdXTsKICAgY29uc3Qgc2l6ZV90IG51bV9lbnRyaWVzID0gZmlyc3RfZmlsZS5lbnRyaWVzLnNpemUoKTsKICAgc2l6ZV90IGVudHJ5X2luZGV4ID0gMDsKQEAgLTM1OSw5ICszMDIsNyBAQAogICBjb3V0IDw8ICIgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRhdGFbIiA8PCBUYWJsZVNpemUgPDwgIl0gPSB7IjsKICAgd2hpbGUgKGVudHJ5X2luZGV4IDwgbnVtX2VudHJpZXMpIHsKICAgICArK2VudHJ5X2luZGV4OwotICAgIGlmIChlbnRyeV9pbmRleCA9PSBudW1fZW50cmllcyB8fAotICAgICAgICBmaXJzdF9maWxlLmVudHJpZXNbZW50cnlfaW5kZXhdLnByb2R1Y3Rfc2l6ZSAhPSBwcm9kdWN0X3NpemUpCi0gICAgeworICAgIGlmIChlbnRyeV9pbmRleCA9PSBudW1fZW50cmllcyB8fCBmaXJzdF9maWxlLmVudHJpZXNbZW50cnlfaW5kZXhdLnByb2R1Y3Rfc2l6ZSAhPSBwcm9kdWN0X3NpemUpIHsKICAgICAgIGZsb2F0IGJlc3RfZWZmaWNpZW5jeV90aGlzX3Byb2R1Y3Rfc2l6ZSA9IDAuMGY7CiAgICAgICB1aW50MTZfdCBiZXN0X2Jsb2NrX3NpemVfdGhpc19wcm9kdWN0X3NpemUgPSAwOwogICAgICAgZm9yIChzaXplX3QgZSA9IGZpcnN0X2VudHJ5X2luZGV4X3dpdGhfdGhpc19wcm9kdWN0X3NpemU7IGUgPCBlbnRyeV9pbmRleDsgZSsrKSB7CkBAIC0zOTcsMTAgKzMzOCw4IEBACiAgIGNvdXQgPDwgIn07IiA8PCBlbmRsOwogfQogCi1mbG9hdCBlZmZpY2llbmN5X29mX3BhcnRpdGlvbigKLSAgICAgICAgY29uc3QgdmVjdG9yPHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdD4mIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLAotICAgICAgICBjb25zdCB2ZWN0b3I8dmVjdG9yPHNpemVfdD4+JiBwYXJ0aXRpb24pCi17CitmbG9hdCBlZmZpY2llbmN5X29mX3BhcnRpdGlvbihjb25zdCB2ZWN0b3I8cHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90PiYgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dmVjdG9yPHNpemVfdD4+JiBwYXJ0aXRpb24pIHsKICAgZmxvYXQgZWZmaWNpZW5jeSA9IDEuMGY7CiAgIGZvciAoYXV0byBzID0gcGFydGl0aW9uLmJlZ2luKCk7IHMgIT0gcGFydGl0aW9uLmVuZCgpOyArK3MpIHsKICAgICBlZmZpY2llbmN5ID0gbWluKGVmZmljaWVuY3ksIGVmZmljaWVuY3lfb2Zfc3Vic2V0KHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLCAqcykpOwpAQCAtNDA4LDggKzM0Nyw3IEBACiAgIHJldHVybiBlZmZpY2llbmN5OwogfQogCi12b2lkIG1ha2VfZmlyc3Rfc3Vic2V0KHNpemVfdCBzdWJzZXRfc2l6ZSwgdmVjdG9yPHNpemVfdD4mIG91dF9zdWJzZXQsIHNpemVfdCBzZXRfc2l6ZSkKLXsKK3ZvaWQgbWFrZV9maXJzdF9zdWJzZXQoc2l6ZV90IHN1YnNldF9zaXplLCB2ZWN0b3I8c2l6ZV90PiYgb3V0X3N1YnNldCwgc2l6ZV90IHNldF9zaXplKSB7CiAgIGFzc2VydChzdWJzZXRfc2l6ZSA+PSAxICYmIHN1YnNldF9zaXplIDw9IHNldF9zaXplKTsKICAgb3V0X3N1YnNldC5yZXNpemUoc3Vic2V0X3NpemUpOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN1YnNldF9zaXplOyBpKyspIHsKQEAgLTQxNywxMyArMzU1LDkgQEAKICAgfQogfQogCi1ib29sIGlzX2xhc3Rfc3Vic2V0KGNvbnN0IHZlY3RvcjxzaXplX3Q+JiBzdWJzZXQsIHNpemVfdCBzZXRfc2l6ZSkKLXsKLSAgcmV0dXJuIHN1YnNldFswXSA9PSBzZXRfc2l6ZSAtIHN1YnNldC5zaXplKCk7Ci19Citib29sIGlzX2xhc3Rfc3Vic2V0KGNvbnN0IHZlY3RvcjxzaXplX3Q+JiBzdWJzZXQsIHNpemVfdCBzZXRfc2l6ZSkgeyByZXR1cm4gc3Vic2V0WzBdID09IHNldF9zaXplIC0gc3Vic2V0LnNpemUoKTsgfQogCi12b2lkIG5leHRfc3Vic2V0KHZlY3RvcjxzaXplX3Q+JiBpbm91dF9zdWJzZXQsIHNpemVfdCBzZXRfc2l6ZSkKLXsKK3ZvaWQgbmV4dF9zdWJzZXQodmVjdG9yPHNpemVfdD4mIGlub3V0X3N1YnNldCwgc2l6ZV90IHNldF9zaXplKSB7CiAgIGlmIChpc19sYXN0X3N1YnNldChpbm91dF9zdWJzZXQsIHNldF9zaXplKSkgewogICAgIGNlcnIgPDwgIml0ZXJhdGluZyBwYXN0IHRoZSBsYXN0IHN1YnNldCIgPDwgZW5kbDsKICAgICBhYm9ydCgpOwpAQCAtNDQ0LDkgKzM3OCw4IEBACiBjb25zdCBzaXplX3QgbnVtYmVyX29mX3N1YnNldHNfbGltaXQgPSAxMDA7CiBjb25zdCBzaXplX3QgYWx3YXlzX3NlYXJjaF9zdWJzZXRzX29mX3NpemVfYXRfbGVhc3QgPSAyOwogCi1ib29sIGlzX251bWJlcl9vZl9zdWJzZXRzX2ZlYXNpYmxlKHNpemVfdCBuLCBzaXplX3QgcCkKLXsgCi0gIGFzc2VydChuPjAgJiYgcD4wICYmIHA8PW4pOworYm9vbCBpc19udW1iZXJfb2Zfc3Vic2V0c19mZWFzaWJsZShzaXplX3Qgbiwgc2l6ZV90IHApIHsKKyAgYXNzZXJ0KG4gPiAwICYmIHAgPiAwICYmIHAgPD0gbik7CiAgIHVpbnQ2NF90IG51bWVyYXRvciA9IDEsIGRlbm9taW5hdG9yID0gMTsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwOyBpKyspIHsKICAgICBudW1lcmF0b3IgKj0gbiAtIGk7CkBAIC00NTgsMjQgKzM5MSwyMCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotc2l6ZV90IG1heF9mZWFzaWJsZV9zdWJzZXRfc2l6ZShzaXplX3QgbikKLXsKK3NpemVfdCBtYXhfZmVhc2libGVfc3Vic2V0X3NpemUoc2l6ZV90IG4pIHsKICAgYXNzZXJ0KG4gPiAwKTsKLSAgY29uc3Qgc2l6ZV90IG1pbnJlc3VsdCA9IG1pbjxzaXplX3Q+KG4tMSwgYWx3YXlzX3NlYXJjaF9zdWJzZXRzX29mX3NpemVfYXRfbGVhc3QpOworICBjb25zdCBzaXplX3QgbWlucmVzdWx0ID0gbWluPHNpemVfdD4obiAtIDEsIGFsd2F5c19zZWFyY2hfc3Vic2V0c19vZl9zaXplX2F0X2xlYXN0KTsKICAgZm9yIChzaXplX3QgcCA9IDE7IHAgPD0gbiAtIDE7IHArKykgewotICAgIGlmICghaXNfbnVtYmVyX29mX3N1YnNldHNfZmVhc2libGUobiwgcCsxKSkgeworICAgIGlmICghaXNfbnVtYmVyX29mX3N1YnNldHNfZmVhc2libGUobiwgcCArIDEpKSB7CiAgICAgICByZXR1cm4gbWF4KHAsIG1pbnJlc3VsdCk7CiAgICAgfQogICB9CiAgIHJldHVybiBuIC0gMTsKIH0KIAotdm9pZCBmaW5kX3N1YnNldF93aXRoX2VmZmljaWVuY3lfaGlnaGVyX3RoYW4oCi0gICAgICAgY29uc3QgdmVjdG9yPHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdD4mIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLAotICAgICAgIGZsb2F0IHJlcXVpcmVkX2VmZmljaWVuY3lfdG9fYmVhdCwKLSAgICAgICB2ZWN0b3I8c2l6ZV90PiYgaW5vdXRfcmVtYWluZGVyLAotICAgICAgIHZlY3RvcjxzaXplX3Q+JiBvdXRfc3Vic2V0KQotewordm9pZCBmaW5kX3N1YnNldF93aXRoX2VmZmljaWVuY3lfaGlnaGVyX3RoYW4oY29uc3QgdmVjdG9yPHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdD4mIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmVxdWlyZWRfZWZmaWNpZW5jeV90b19iZWF0LCB2ZWN0b3I8c2l6ZV90PiYgaW5vdXRfcmVtYWluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHNpemVfdD4mIG91dF9zdWJzZXQpIHsKICAgb3V0X3N1YnNldC5yZXNpemUoMCk7CiAKICAgaWYgKHJlcXVpcmVkX2VmZmljaWVuY3lfdG9fYmVhdCA+PSAxLjBmKSB7CkBAIC00ODQsNyArNDEzLDYgQEAKICAgfQogCiAgIHdoaWxlICghaW5vdXRfcmVtYWluZGVyLmVtcHR5KCkpIHsKLQogICAgIHZlY3RvcjxzaXplX3Q+IGNhbmRpZGF0ZV9pbmRpY2VzKGlub3V0X3JlbWFpbmRlci5zaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FuZGlkYXRlX2luZGljZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgIGNhbmRpZGF0ZV9pbmRpY2VzW2ldID0gaTsKQEAgLTQ5MywyMCArNDIxLDE3IEBACiAgICAgc2l6ZV90IGNhbmRpZGF0ZV9pbmRpY2VzX3N1YnNldF9zaXplID0gbWF4X2ZlYXNpYmxlX3N1YnNldF9zaXplKGNhbmRpZGF0ZV9pbmRpY2VzLnNpemUoKSk7CiAgICAgd2hpbGUgKGNhbmRpZGF0ZV9pbmRpY2VzX3N1YnNldF9zaXplID49IDEpIHsKICAgICAgIHZlY3RvcjxzaXplX3Q+IGNhbmRpZGF0ZV9pbmRpY2VzX3N1YnNldDsKLSAgICAgIG1ha2VfZmlyc3Rfc3Vic2V0KGNhbmRpZGF0ZV9pbmRpY2VzX3N1YnNldF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlX2luZGljZXNfc3Vic2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlX2luZGljZXMuc2l6ZSgpKTsKKyAgICAgIG1ha2VfZmlyc3Rfc3Vic2V0KGNhbmRpZGF0ZV9pbmRpY2VzX3N1YnNldF9zaXplLCBjYW5kaWRhdGVfaW5kaWNlc19zdWJzZXQsIGNhbmRpZGF0ZV9pbmRpY2VzLnNpemUoKSk7CiAKICAgICAgIHZlY3RvcjxzaXplX3Q+IGJlc3RfY2FuZGlkYXRlX2luZGljZXNfc3Vic2V0OwogICAgICAgZmxvYXQgYmVzdF9lZmZpY2llbmN5ID0gMC4wZjsKICAgICAgIHZlY3RvcjxzaXplX3Q+IHRyaWFsX3N1YnNldCA9IG91dF9zdWJzZXQ7CiAgICAgICB0cmlhbF9zdWJzZXQucmVzaXplKG91dF9zdWJzZXQuc2l6ZSgpICsgY2FuZGlkYXRlX2luZGljZXNfc3Vic2V0X3NpemUpOwotICAgICAgd2hpbGUgKHRydWUpCi0gICAgICB7CisgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbmRpZGF0ZV9pbmRpY2VzX3N1YnNldF9zaXplOyBpKyspIHsKICAgICAgICAgICB0cmlhbF9zdWJzZXRbb3V0X3N1YnNldC5zaXplKCkgKyBpXSA9IGlub3V0X3JlbWFpbmRlcltjYW5kaWRhdGVfaW5kaWNlc19zdWJzZXRbaV1dOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGZsb2F0IHRyaWFsX2VmZmljaWVuY3kgPSBlZmZpY2llbmN5X29mX3N1YnNldChwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcywgdHJpYWxfc3Vic2V0KTsKICAgICAgICAgaWYgKHRyaWFsX2VmZmljaWVuY3kgPiBiZXN0X2VmZmljaWVuY3kpIHsKICAgICAgICAgICBiZXN0X2VmZmljaWVuY3kgPSB0cmlhbF9lZmZpY2llbmN5OwpAQCAtNTE3LDcgKzQ0Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgbmV4dF9zdWJzZXQoY2FuZGlkYXRlX2luZGljZXNfc3Vic2V0LCBjYW5kaWRhdGVfaW5kaWNlcy5zaXplKCkpOwogICAgICAgfQotICAgICAgIAorCiAgICAgICBpZiAoYmVzdF9lZmZpY2llbmN5ID4gcmVxdWlyZWRfZWZmaWNpZW5jeV90b19iZWF0KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmVzdF9jYW5kaWRhdGVfaW5kaWNlc19zdWJzZXQuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICBjYW5kaWRhdGVfaW5kaWNlc1tpXSA9IGNhbmRpZGF0ZV9pbmRpY2VzW2Jlc3RfY2FuZGlkYXRlX2luZGljZXNfc3Vic2V0W2ldXTsKQEAgLTUyNiw3ICs0NTEsNyBAQAogICAgICAgfQogICAgICAgY2FuZGlkYXRlX2luZGljZXNfc3Vic2V0X3NpemUtLTsKICAgICB9Ci0gICAgICAKKwogICAgIHNpemVfdCBjYW5kaWRhdGVfaW5kZXggPSBjYW5kaWRhdGVfaW5kaWNlc1swXTsKICAgICBhdXRvIGNhbmRpZGF0ZV9pdGVyYXRvciA9IGlub3V0X3JlbWFpbmRlci5iZWdpbigpICsgY2FuZGlkYXRlX2luZGV4OwogICAgIHZlY3RvcjxzaXplX3Q+IHRyaWFsX3N1YnNldCA9IG91dF9zdWJzZXQ7CkBAIC01NDIsMTEgKzQ2Nyw5IEBACiAgIH0KIH0KIAotdm9pZCBmaW5kX3BhcnRpdGlvbl93aXRoX2VmZmljaWVuY3lfaGlnaGVyX3RoYW4oCi0gICAgICAgY29uc3QgdmVjdG9yPHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdD4mIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLAotICAgICAgIGZsb2F0IHJlcXVpcmVkX2VmZmljaWVuY3lfdG9fYmVhdCwKLSAgICAgICB2ZWN0b3I8dmVjdG9yPHNpemVfdD4+JiBvdXRfcGFydGl0aW9uKQotewordm9pZCBmaW5kX3BhcnRpdGlvbl93aXRoX2VmZmljaWVuY3lfaGlnaGVyX3RoYW4oY29uc3QgdmVjdG9yPHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdD4mIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmVxdWlyZWRfZWZmaWNpZW5jeV90b19iZWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHZlY3RvcjxzaXplX3Q+PiYgb3V0X3BhcnRpdGlvbikgewogICBvdXRfcGFydGl0aW9uLnJlc2l6ZSgwKTsKIAogICB2ZWN0b3I8c2l6ZV90PiByZW1haW5kZXI7CkBAIC01NTYsMjUgKzQ3OSwxOSBAQAogCiAgIHdoaWxlICghcmVtYWluZGVyLmVtcHR5KCkpIHsKICAgICB2ZWN0b3I8c2l6ZV90PiBuZXdfc3Vic2V0OwotICAgIGZpbmRfc3Vic2V0X3dpdGhfZWZmaWNpZW5jeV9oaWdoZXJfdGhhbigKLSAgICAgIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLAotICAgICAgcmVxdWlyZWRfZWZmaWNpZW5jeV90b19iZWF0LAotICAgICAgcmVtYWluZGVyLAotICAgICAgbmV3X3N1YnNldCk7CisgICAgZmluZF9zdWJzZXRfd2l0aF9lZmZpY2llbmN5X2hpZ2hlcl90aGFuKHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLCByZXF1aXJlZF9lZmZpY2llbmN5X3RvX2JlYXQsIHJlbWFpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N1YnNldCk7CiAgICAgb3V0X3BhcnRpdGlvbi5wdXNoX2JhY2sobmV3X3N1YnNldCk7CiAgIH0KIH0KIAotdm9pZCBwcmludF9wYXJ0aXRpb24oCi0gICAgICAgY29uc3QgdmVjdG9yPHByZXByb2Nlc3NlZF9pbnB1dGZpbGVfdD4mIHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLAotICAgICAgIGNvbnN0IHZlY3Rvcjx2ZWN0b3I8c2l6ZV90Pj4mIHBhcnRpdGlvbikKLXsKK3ZvaWQgcHJpbnRfcGFydGl0aW9uKGNvbnN0IHZlY3RvcjxwcmVwcm9jZXNzZWRfaW5wdXRmaWxlX3Q+JiBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx2ZWN0b3I8c2l6ZV90Pj4mIHBhcnRpdGlvbikgewogICBmbG9hdCBlZmZpY2llbmN5ID0gZWZmaWNpZW5jeV9vZl9wYXJ0aXRpb24ocHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMsIHBhcnRpdGlvbik7Ci0gIGNvdXQgPDwgIlBhcnRpdGlvbiBpbnRvICIgPDwgcGFydGl0aW9uLnNpemUoKSA8PCAiIHN1YnNldHMgZm9yICIgPDwgZWZmaWNpZW5jeSAqIDEwMC4wZiA8PCAiJSBlZmZpY2llbmN5IiAgPDwgZW5kbDsKKyAgY291dCA8PCAiUGFydGl0aW9uIGludG8gIiA8PCBwYXJ0aXRpb24uc2l6ZSgpIDw8ICIgc3Vic2V0cyBmb3IgIiA8PCBlZmZpY2llbmN5ICogMTAwLjBmIDw8ICIlIGVmZmljaWVuY3kiIDw8IGVuZGw7CiAgIGZvciAoYXV0byBzdWJzZXQgPSBwYXJ0aXRpb24uYmVnaW4oKTsgc3Vic2V0ICE9IHBhcnRpdGlvbi5lbmQoKTsgKytzdWJzZXQpIHsKLSAgICBjb3V0IDw8ICIgIFN1YnNldCAiIDw8IChzdWJzZXQgLSBwYXJ0aXRpb24uYmVnaW4oKSkKLSAgICAgICAgIDw8ICIsIGVmZmljaWVuY3kgIiA8PCBlZmZpY2llbmN5X29mX3N1YnNldChwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcywgKnN1YnNldCkgKiAxMDAuMGYgPDwgIiU6IgotICAgICAgICAgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICIgIFN1YnNldCAiIDw8IChzdWJzZXQgLSBwYXJ0aXRpb24uYmVnaW4oKSkgPDwgIiwgZWZmaWNpZW5jeSAiCisgICAgICAgICA8PCBlZmZpY2llbmN5X29mX3N1YnNldChwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcywgKnN1YnNldCkgKiAxMDAuMGYgPDwgIiU6IiA8PCBlbmRsOwogICAgIGZvciAoYXV0byBmaWxlID0gc3Vic2V0LT5iZWdpbigpOyBmaWxlICE9IHN1YnNldC0+ZW5kKCk7ICsrZmlsZSkgewogICAgICAgY291dCA8PCAiICAgICIgPDwgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXNbKmZpbGVdLmZpbGVuYW1lIDw8IGVuZGw7CiAgICAgfQpAQCAtNTg2LDE4ICs1MDMsMTggQEAKICAgY291dCA8PCBlbmRsOwogfQogCi1zdHJ1Y3QgYWN0aW9uX3QKLXsKLSAgdmlydHVhbCBjb25zdCBjaGFyKiBpbnZva2F0aW9uX25hbWUoKSBjb25zdCB7IGFib3J0KCk7IHJldHVybiBudWxscHRyOyB9CitzdHJ1Y3QgYWN0aW9uX3QgeworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGludm9rYXRpb25fbmFtZSgpIGNvbnN0IHsKKyAgICBhYm9ydCgpOworICAgIHJldHVybiBudWxscHRyOworICB9CiAgIHZpcnR1YWwgdm9pZCBydW4oY29uc3QgdmVjdG9yPHN0cmluZz4mKSBjb25zdCB7IGFib3J0KCk7IH0KICAgdmlydHVhbCB+YWN0aW9uX3QoKSB7fQogfTsKIAotc3RydWN0IHBhcnRpdGlvbl9hY3Rpb25fdCA6IGFjdGlvbl90Ci17CitzdHJ1Y3QgcGFydGl0aW9uX2FjdGlvbl90IDogYWN0aW9uX3QgewogICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGludm9rYXRpb25fbmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJwYXJ0aXRpb24iOyB9Ci0gIHZpcnR1YWwgdm9pZCBydW4oY29uc3QgdmVjdG9yPHN0cmluZz4mIGlucHV0X2ZpbGVuYW1lcykgY29uc3Qgb3ZlcnJpZGUKLSAgeworICB2aXJ0dWFsIHZvaWQgcnVuKGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBpbnB1dF9maWxlbmFtZXMpIGNvbnN0IG92ZXJyaWRlIHsKICAgICB2ZWN0b3I8cHJlcHJvY2Vzc2VkX2lucHV0ZmlsZV90PiBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlczsKIAogICAgIGlmIChpbnB1dF9maWxlbmFtZXMuZW1wdHkoKSkgewpAQCAtNjI3LDE3ICs1NDQsMTIgQEAKICAgICBmbG9hdCByZXF1aXJlZF9lZmZpY2llbmN5X3RvX2JlYXQgPSAwLjBmOwogICAgIHZlY3Rvcjx2ZWN0b3I8dmVjdG9yPHNpemVfdD4+PiBwYXJ0aXRpb25zOwogICAgIGNlcnIgPDwgInNlYXJjaGluZyBmb3IgcGFydGl0aW9ucy4uLlxyIiA8PCBmbHVzaDsKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7CisgICAgd2hpbGUgKHRydWUpIHsKICAgICAgIHZlY3Rvcjx2ZWN0b3I8c2l6ZV90Pj4gcGFydGl0aW9uOwotICAgICAgZmluZF9wYXJ0aXRpb25fd2l0aF9lZmZpY2llbmN5X2hpZ2hlcl90aGFuKAotICAgICAgICBwcmVwcm9jZXNzZWRfaW5wdXRmaWxlcywKLSAgICAgICAgcmVxdWlyZWRfZWZmaWNpZW5jeV90b19iZWF0LAotICAgICAgICBwYXJ0aXRpb24pOworICAgICAgZmluZF9wYXJ0aXRpb25fd2l0aF9lZmZpY2llbmN5X2hpZ2hlcl90aGFuKHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLCByZXF1aXJlZF9lZmZpY2llbmN5X3RvX2JlYXQsIHBhcnRpdGlvbik7CiAgICAgICBmbG9hdCBhY3R1YWxfZWZmaWNpZW5jeSA9IGVmZmljaWVuY3lfb2ZfcGFydGl0aW9uKHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLCBwYXJ0aXRpb24pOwotICAgICAgY2VyciA8PCAicGFydGl0aW9uICIgPDwgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMuc2l6ZSgpIDw8ICIgZmlsZXMgaW50byAiIDw8IHBhcnRpdGlvbi5zaXplKCkKLSAgICAgICAgICAgPDwgIiBzdWJzZXRzIGZvciAiIDw8IDEwMC4wZiAqIGFjdHVhbF9lZmZpY2llbmN5Ci0gICAgICAgICAgIDw8ICIgJSBlZmZpY2llbmN5IgorICAgICAgY2VyciA8PCAicGFydGl0aW9uICIgPDwgcHJlcHJvY2Vzc2VkX2lucHV0ZmlsZXMuc2l6ZSgpIDw8ICIgZmlsZXMgaW50byAiIDw8IHBhcnRpdGlvbi5zaXplKCkgPDwgIiBzdWJzZXRzIGZvciAiCisgICAgICAgICAgIDw8IDEwMC4wZiAqIGFjdHVhbF9lZmZpY2llbmN5IDw8ICIgJSBlZmZpY2llbmN5IgogICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgXHIiIDw8IGZsdXNoOwogICAgICAgcGFydGl0aW9ucy5wdXNoX2JhY2socGFydGl0aW9uKTsKICAgICAgIGlmIChwYXJ0aXRpb24uc2l6ZSgpID09IHByZXByb2Nlc3NlZF9pbnB1dGZpbGVzLnNpemUoKSB8fCBhY3R1YWxfZWZmaWNpZW5jeSA9PSAxLjBmKSB7CkBAIC02NDksNyArNTYxLDcgQEAKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgYm9vbCByZXBlYXQgPSBmYWxzZTsKICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFydGl0aW9ucy5zaXplKCkgLSAxOyBpKyspIHsKLSAgICAgICAgaWYgKHBhcnRpdGlvbnNbaV0uc2l6ZSgpID49IHBhcnRpdGlvbnNbaSsxXS5zaXplKCkpIHsKKyAgICAgICAgaWYgKHBhcnRpdGlvbnNbaV0uc2l6ZSgpID49IHBhcnRpdGlvbnNbaSArIDFdLnNpemUoKSkgewogICAgICAgICAgIHBhcnRpdGlvbnMuZXJhc2UocGFydGl0aW9ucy5iZWdpbigpICsgaSk7CiAgICAgICAgICAgcmVwZWF0ID0gdHJ1ZTsKICAgICAgICAgICBicmVhazsKQEAgLTY2NSw4ICs1NzcsNyBAQAogICB9CiB9OwogCi1zdHJ1Y3QgZXZhbHVhdGVfZGVmYXVsdHNfYWN0aW9uX3QgOiBhY3Rpb25fdAoteworc3RydWN0IGV2YWx1YXRlX2RlZmF1bHRzX2FjdGlvbl90IDogYWN0aW9uX3QgewogICBzdHJ1Y3QgcmVzdWx0c19lbnRyeV90IHsKICAgICB1aW50MTZfdCBwcm9kdWN0X3NpemU7CiAgICAgc2l6ZV90cmlwbGVfdCBkZWZhdWx0X2Jsb2NrX3NpemU7CkBAIC02NzUsMzAgKzU4NiwyNCBAQAogICAgIGZsb2F0IGJlc3RfcG90X2dmbG9wczsKICAgICBmbG9hdCBkZWZhdWx0X2VmZmljaWVuY3k7CiAgIH07Ci0gIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIHMsIGNvbnN0IHJlc3VsdHNfZW50cnlfdCYgZW50cnkpCi0gIHsKLSAgICByZXR1cm4gcwotICAgICAgPDwgIlByb2R1Y3Qgc2l6ZSAiIDw8IHNpemVfdHJpcGxlX3QoZW50cnkucHJvZHVjdF9zaXplKQotICAgICAgPDwgIjogZGVmYXVsdCBibG9jayBzaXplICIgPDwgZW50cnkuZGVmYXVsdF9ibG9ja19zaXplCi0gICAgICA8PCAiIC0+ICIgPDwgZW50cnkuZGVmYXVsdF9nZmxvcHMKLSAgICAgIDw8ICIgR0Zsb3AvcyA9ICIgPDwgZW50cnkuZGVmYXVsdF9lZmZpY2llbmN5ICogMTAwLjBmIDw8ICIgJSIKLSAgICAgIDw8ICIgb2YgYmVzdCBQT1QgYmxvY2sgc2l6ZSAiIDw8IHNpemVfdHJpcGxlX3QoZW50cnkuYmVzdF9wb3RfYmxvY2tfc2l6ZSkKLSAgICAgIDw8ICIgLT4gIiA8PCBlbnRyeS5iZXN0X3BvdF9nZmxvcHMKLSAgICAgIDw8ICIgR0Zsb3AvcyIgPDwgZGVjOworICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBzLCBjb25zdCByZXN1bHRzX2VudHJ5X3QmIGVudHJ5KSB7CisgICAgcmV0dXJuIHMgPDwgIlByb2R1Y3Qgc2l6ZSAiIDw8IHNpemVfdHJpcGxlX3QoZW50cnkucHJvZHVjdF9zaXplKSA8PCAiOiBkZWZhdWx0IGJsb2NrIHNpemUgIgorICAgICAgICAgICAgIDw8IGVudHJ5LmRlZmF1bHRfYmxvY2tfc2l6ZSA8PCAiIC0+ICIgPDwgZW50cnkuZGVmYXVsdF9nZmxvcHMKKyAgICAgICAgICAgICA8PCAiIEdGbG9wL3MgPSAiIDw8IGVudHJ5LmRlZmF1bHRfZWZmaWNpZW5jeSAqIDEwMC4wZiA8PCAiICUiCisgICAgICAgICAgICAgPDwgIiBvZiBiZXN0IFBPVCBibG9jayBzaXplICIgPDwgc2l6ZV90cmlwbGVfdChlbnRyeS5iZXN0X3BvdF9ibG9ja19zaXplKSA8PCAiIC0+ICIKKyAgICAgICAgICAgICA8PCBlbnRyeS5iZXN0X3BvdF9nZmxvcHMgPDwgIiBHRmxvcC9zIiA8PCBkZWM7CiAgIH0KICAgc3RhdGljIGJvb2wgbG93ZXJfZWZmaWNpZW5jeShjb25zdCByZXN1bHRzX2VudHJ5X3QmIGUxLCBjb25zdCByZXN1bHRzX2VudHJ5X3QmIGUyKSB7CiAgICAgcmV0dXJuIGUxLmRlZmF1bHRfZWZmaWNpZW5jeSA8IGUyLmRlZmF1bHRfZWZmaWNpZW5jeTsKICAgfQogICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGludm9rYXRpb25fbmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJldmFsdWF0ZS1kZWZhdWx0cyI7IH0KLSAgdm9pZCBzaG93X3VzYWdlX2FuZF9leGl0KCkgY29uc3QKLSAgeworICB2b2lkIHNob3dfdXNhZ2VfYW5kX2V4aXQoKSBjb25zdCB7CiAgICAgY2VyciA8PCAidXNhZ2U6ICIgPDwgaW52b2thdGlvbl9uYW1lKCkgPDwgIiBkZWZhdWx0LXNpemVzLWRhdGEgYWxsLXBvdC1zaXplcy1kYXRhIiA8PCBlbmRsOwogICAgIGNlcnIgPDwgImNoZWNrcyBob3cgd2VsbCB0aGUgcGVyZm9ybWFuY2Ugd2l0aCBkZWZhdWx0IHNpemVzIGNvbXBhcmVzIHRvIHRoZSBiZXN0ICIKICAgICAgICAgIDw8ICJwZXJmb3JtYW5jZSBtZWFzdXJlZCBvdmVyIGFsbCBQT1Qgc2l6ZXMuIiA8PCBlbmRsOwogICAgIGV4aXQoMSk7CiAgIH0KLSAgdmlydHVhbCB2b2lkIHJ1bihjb25zdCB2ZWN0b3I8c3RyaW5nPiYgaW5wdXRfZmlsZW5hbWVzKSBjb25zdCBvdmVycmlkZQotICB7CisgIHZpcnR1YWwgdm9pZCBydW4oY29uc3QgdmVjdG9yPHN0cmluZz4mIGlucHV0X2ZpbGVuYW1lcykgY29uc3Qgb3ZlcnJpZGUgewogICAgIGlmIChpbnB1dF9maWxlbmFtZXMuc2l6ZSgpICE9IDIpIHsKICAgICAgIHNob3dfdXNhZ2VfYW5kX2V4aXQoKTsKICAgICB9CkBAIC03MTQsMjAgKzYxOSwxNyBAQAogICAgIH0KICAgICB2ZWN0b3I8cmVzdWx0c19lbnRyeV90PiByZXN1bHRzOwogICAgIHZlY3RvcjxyZXN1bHRzX2VudHJ5X3Q+IGN1YmljX3Jlc3VsdHM7Ci0gICAgCisKICAgICB1aW50MTZfdCBwcm9kdWN0X3NpemUgPSAwOwogICAgIGF1dG8gaXRfYWxsX3BvdF9zaXplcyA9IGlucHV0ZmlsZV9hbGxfcG90X3NpemVzLmVudHJpZXMuYmVnaW4oKTsKICAgICBmb3IgKGF1dG8gaXRfZGVmYXVsdF9zaXplcyA9IGlucHV0ZmlsZV9kZWZhdWx0X3NpemVzLmVudHJpZXMuYmVnaW4oKTsKLSAgICAgICAgIGl0X2RlZmF1bHRfc2l6ZXMgIT0gaW5wdXRmaWxlX2RlZmF1bHRfc2l6ZXMuZW50cmllcy5lbmQoKTsKLSAgICAgICAgICsraXRfZGVmYXVsdF9zaXplcykKLSAgICB7CisgICAgICAgICBpdF9kZWZhdWx0X3NpemVzICE9IGlucHV0ZmlsZV9kZWZhdWx0X3NpemVzLmVudHJpZXMuZW5kKCk7ICsraXRfZGVmYXVsdF9zaXplcykgewogICAgICAgaWYgKGl0X2RlZmF1bHRfc2l6ZXMtPnByb2R1Y3Rfc2l6ZSA9PSBwcm9kdWN0X3NpemUpIHsKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAgICAgICBwcm9kdWN0X3NpemUgPSBpdF9kZWZhdWx0X3NpemVzLT5wcm9kdWN0X3NpemU7CiAgICAgICB3aGlsZSAoaXRfYWxsX3BvdF9zaXplcyAhPSBpbnB1dGZpbGVfYWxsX3BvdF9zaXplcy5lbnRyaWVzLmVuZCgpICYmCi0gICAgICAgICAgICAgaXRfYWxsX3BvdF9zaXplcy0+cHJvZHVjdF9zaXplICE9IHByb2R1Y3Rfc2l6ZSkKLSAgICAgIHsKKyAgICAgICAgICAgICBpdF9hbGxfcG90X3NpemVzLT5wcm9kdWN0X3NpemUgIT0gcHJvZHVjdF9zaXplKSB7CiAgICAgICAgICsraXRfYWxsX3BvdF9zaXplczsKICAgICAgIH0KICAgICAgIGlmIChpdF9hbGxfcG90X3NpemVzID09IGlucHV0ZmlsZV9hbGxfcG90X3NpemVzLmVudHJpZXMuZW5kKCkpIHsKQEAgLTczNSwxMCArNjM3LDggQEAKICAgICAgIH0KICAgICAgIHVpbnQxNl90IGJlc3RfcG90X2Jsb2NrX3NpemUgPSAwOwogICAgICAgZmxvYXQgYmVzdF9wb3RfZ2Zsb3BzID0gMDsKLSAgICAgIGZvciAoYXV0byBpdCA9IGl0X2FsbF9wb3Rfc2l6ZXM7Ci0gICAgICAgICAgIGl0ICE9IGlucHV0ZmlsZV9hbGxfcG90X3NpemVzLmVudHJpZXMuZW5kKCkgJiYgaXQtPnByb2R1Y3Rfc2l6ZSA9PSBwcm9kdWN0X3NpemU7Ci0gICAgICAgICAgICsraXQpCi0gICAgICB7CisgICAgICBmb3IgKGF1dG8gaXQgPSBpdF9hbGxfcG90X3NpemVzOyBpdCAhPSBpbnB1dGZpbGVfYWxsX3BvdF9zaXplcy5lbnRyaWVzLmVuZCgpICYmIGl0LT5wcm9kdWN0X3NpemUgPT0gcHJvZHVjdF9zaXplOworICAgICAgICAgICArK2l0KSB7CiAgICAgICAgIGlmIChpdC0+Z2Zsb3BzID4gYmVzdF9wb3RfZ2Zsb3BzKSB7CiAgICAgICAgICAgYmVzdF9wb3RfZ2Zsb3BzID0gaXQtPmdmbG9wczsKICAgICAgICAgICBiZXN0X3BvdF9ibG9ja19zaXplID0gaXQtPnBvdF9ibG9ja19zaXplOwpAQCAtNzY2LDcgKzY2Niw3IEBACiAgICAgY291dCA8PCBlbmRsOwogCiAgICAgc29ydChyZXN1bHRzLmJlZ2luKCksIHJlc3VsdHMuZW5kKCksIGxvd2VyX2VmZmljaWVuY3kpOwotICAgIAorCiAgICAgY29uc3Qgc2l6ZV90IG4gPSBtaW48c2l6ZV90PigyMCwgcmVzdWx0cy5zaXplKCkpOwogICAgIGNvdXQgPDwgbiA8PCAiIHdvcnN0IHJlc3VsdHM6IiA8PCBlbmRsOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKSB7CkBAIC03ODEsMzQgKzY4MSwzMCBAQAogICAgIGNvdXQgPDwgZW5kbDsKIAogICAgIHNvcnQoY3ViaWNfcmVzdWx0cy5iZWdpbigpLCBjdWJpY19yZXN1bHRzLmVuZCgpLCBsb3dlcl9lZmZpY2llbmN5KTsKLSAgICAKKwogICAgIGNvdXQucHJlY2lzaW9uKDIpOwogICAgIHZlY3RvcjxmbG9hdD4gYSA9IHswLjVmLCAwLjIwZiwgMC4xMGYsIDAuMDVmLCAwLjAyZiwgMC4wMWZ9OwogICAgIGZvciAoYXV0byBpdCA9IGEuYmVnaW4oKTsgaXQgIT0gYS5lbmQoKTsgKytpdCkgewogICAgICAgc2l6ZV90IG4gPSBtaW4ocmVzdWx0cy5zaXplKCkgLSAxLCBzaXplX3QoKml0ICogcmVzdWx0cy5zaXplKCkpKTsKICAgICAgIGNvdXQgPDwgKDEwMC4wZiAqIG4gLyAocmVzdWx0cy5zaXplKCkgLSAxKSkKLSAgICAgICAgICAgPDwgIiAlIG9mIHByb2R1Y3Qgc2l6ZXMgaGF2ZSBkZWZhdWx0IGVmZmljaWVuY3kgPD0gIgotICAgICAgICAgICA8PCAxMDAuMGYgKiByZXN1bHRzW25dLmRlZmF1bHRfZWZmaWNpZW5jeSA8PCAiICUiIDw8IGVuZGw7CisgICAgICAgICAgIDw8ICIgJSBvZiBwcm9kdWN0IHNpemVzIGhhdmUgZGVmYXVsdCBlZmZpY2llbmN5IDw9ICIgPDwgMTAwLjBmICogcmVzdWx0c1tuXS5kZWZhdWx0X2VmZmljaWVuY3kgPDwgIiAlIgorICAgICAgICAgICA8PCBlbmRsOwogICAgIH0KICAgICBjb3V0LnByZWNpc2lvbihkZWZhdWx0X3ByZWNpc2lvbik7CiAgIH0KIH07CiAKLQotdm9pZCBzaG93X3VzYWdlX2FuZF9leGl0KGludCBhcmdjLCBjaGFyKiBhcmd2W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHVuaXF1ZV9wdHI8YWN0aW9uX3Q+PiYgYXZhaWxhYmxlX2FjdGlvbnMpCi17Cit2b2lkIHNob3dfdXNhZ2VfYW5kX2V4aXQoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSwgY29uc3QgdmVjdG9yPHVuaXF1ZV9wdHI8YWN0aW9uX3Q+PiYgYXZhaWxhYmxlX2FjdGlvbnMpIHsKICAgY2VyciA8PCAidXNhZ2U6ICIgPDwgYXJndlswXSA8PCAiIDxhY3Rpb24+IFtvcHRpb25zLi4uXSA8aW5wdXQgZmlsZXMuLi4+IiA8PCBlbmRsOwogICBjZXJyIDw8ICJhdmFpbGFibGUgYWN0aW9uczoiIDw8IGVuZGw7CiAgIGZvciAoYXV0byBpdCA9IGF2YWlsYWJsZV9hY3Rpb25zLmJlZ2luKCk7IGl0ICE9IGF2YWlsYWJsZV9hY3Rpb25zLmVuZCgpOyArK2l0KSB7CiAgICAgY2VyciA8PCAiICAiIDw8ICgqaXQpLT5pbnZva2F0aW9uX25hbWUoKSA8PCBlbmRsOwotICB9IAorICB9CiAgIGNlcnIgPDwgInRoZSBpbnB1dCBmaWxlcyBzaG91bGQgZWFjaCBjb250YWluIGFuIG91dHB1dCBvZiBiZW5jaG1hcmstYmxvY2tpbmctc2l6ZXMiIDw8IGVuZGw7CiAgIGV4aXQoMSk7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCi17CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgIGNvdXQucHJlY2lzaW9uKGRlZmF1bHRfcHJlY2lzaW9uKTsKICAgY2Vyci5wcmVjaXNpb24oZGVmYXVsdF9wcmVjaXNpb24pOwogCmRpZmYgLS1naXQgYS9iZW5jaC9iYXNpY2JlbmNobWFyay5jcHAgYi9iZW5jaC9iYXNpY2JlbmNobWFyay5jcHAKaW5kZXggYTI2ZWE4NS4uZGNlYjlmYSAxMDA2NDQKLS0tIGEvYmVuY2gvYmFzaWNiZW5jaG1hcmsuY3BwCisrKyBiL2JlbmNoL2Jhc2ljYmVuY2htYXJrLmNwcApAQCAtMywzMiArMywzMSBAQAogI2luY2x1ZGUgIkJlbmNoVXRpbC5oIgogI2luY2x1ZGUgImJhc2ljYmVuY2htYXJrLmgiCiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgIERJU0FCTEVfU1NFX0VYQ0VQVElPTlMoKTsKIAotICAvLyB0aGlzIGlzIHRoZSBsaXN0IG9mIG1hdHJpeCB0eXBlIGFuZCBzaXplIHdlIHdhbnQgdG8gYmVuY2g6Ci0gIC8vICgoc3VmZml4KSAobWF0cml4IHNpemUpIChudW1iZXIgb2YgaXRlcmF0aW9ucykpCi0gICNkZWZpbmUgTU9ERVMgKCgzZCkoMykoNDAwMDAwMCkpICgoNGQpKDQpKDEwMDAwMDApKSAoKFhkKSg0KSgxMDAwMDAwKSkgKChYZCkoMjApKDEwMDAwKSkKLS8vICAgI2RlZmluZSBNT0RFUyAoKFhkKSgyMCkoMTAwMDApKQorLy8gdGhpcyBpcyB0aGUgbGlzdCBvZiBtYXRyaXggdHlwZSBhbmQgc2l6ZSB3ZSB3YW50IHRvIGJlbmNoOgorLy8gKChzdWZmaXgpIChtYXRyaXggc2l6ZSkgKG51bWJlciBvZiBpdGVyYXRpb25zKSkKKyNkZWZpbmUgTU9ERVMgKCgzZCkoMykoNDAwMDAwMCkpKCg0ZCkoNCkoMTAwMDAwMCkpKChYZCkoNCkoMTAwMDAwMCkpKChYZCkoMjApKDEwMDAwKSkKKyAgLy8gICAjZGVmaW5lIE1PREVTICgoWGQpKDIwKSgxMDAwMCkpCiAKLSAgI2RlZmluZSBfR0VORVJBVEVfSEVBREVSKFIsQVJHLEVMKSA8PCBCT09TVF9QUF9TVFJJTkdJWkUoQk9PU1RfUFBfU0VRX0hFQUQoRUwpKSA8PCAiLSIgXAotICAgIDw8IEJPT1NUX1BQX1NUUklOR0laRShCT09TVF9QUF9TRVFfRUxFTSgxLEVMKSkgPDwgIngiIFwKLSAgICA8PCBCT09TVF9QUF9TVFJJTkdJWkUoQk9PU1RfUFBfU0VRX0VMRU0oMSxFTCkpIDw8ICIgICAvICAgIgorI2RlZmluZSBfR0VORVJBVEVfSEVBREVSKFIsIEFSRywgRUwpICAgICAgICAgICBcCisgIDw8IEJPT1NUX1BQX1NUUklOR0laRShCT09TVF9QUF9TRVFfSEVBRChFTCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICItIiAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQk9PU1RfUFBfU1RSSU5HSVpFKEJPT1NUX1BQX1NFUV9FTEVNKDEsRUwpKSA8PCAieCIgPDwgQk9PU1RfUFBfU1RSSU5HSVpFKEJPT1NUX1BQX1NFUV9FTEVNKDEsRUwpKSA8PCAiICAgLyAgICIKIAotICBzdGQ6OmNvdXQgQk9PU1RfUFBfU0VRX0ZPUl9FQUNIKF9HRU5FUkFURV9IRUFERVIsIH4sIE1PREVTICkgPDwgZW5kbDsKKyAgc3RkOjpjb3V0IEJPT1NUX1BQX1NFUV9GT1JfRUFDSChfR0VORVJBVEVfSEVBREVSLCB+LCBNT0RFUykgPDwgZW5kbDsKIAogICBjb25zdCBpbnQgdHJpZXMgPSAxMDsKIAotICAjZGVmaW5lIF9SVU5fQkVOQ0goUixBUkcsRUwpIFwKLSAgICBzdGQ6OmNvdXQgPDwgQVJHKCBcCi0gICAgICBCT09TVF9QUF9DQVQoTWF0cml4LCBCT09TVF9QUF9TRVFfSEVBRChFTCkpIChcCi0gICAgICAgICBCT09TVF9QUF9TRVFfRUxFTSgxLEVMKSxCT09TVF9QUF9TRVFfRUxFTSgxLEVMKSksIEJPT1NUX1BQX1NFUV9FTEVNKDIsRUwpLCB0cmllcykgXAotICAgIDw8ICIgICAiOworI2RlZmluZSBfUlVOX0JFTkNIKFIsIEFSRywgRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0ZDo6Y291dCA8PCBBUkcoQk9PU1RfUFBfQ0FUKE1hdHJpeCwgQk9PU1RfUFBfU0VRX0hFQUQoRUwpKShCT09TVF9QUF9TRVFfRUxFTSgxLCBFTCksIEJPT1NUX1BQX1NFUV9FTEVNKDEsIEVMKSksIFwKKyAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9TRVFfRUxFTSgyLCBFTCksIHRyaWVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgPDwgIiAgICI7CiAKLSAgQk9PU1RfUFBfU0VRX0ZPUl9FQUNIKF9SVU5fQkVOQ0gsIGJlbmNoQmFzaWM8TGF6eUV2YWw+LCBNT0RFUyApOworICBCT09TVF9QUF9TRVFfRk9SX0VBQ0goX1JVTl9CRU5DSCwgYmVuY2hCYXNpYzxMYXp5RXZhbD4sIE1PREVTKTsKICAgc3RkOjpjb3V0IDw8IGVuZGw7Ci0gIEJPT1NUX1BQX1NFUV9GT1JfRUFDSChfUlVOX0JFTkNILCBiZW5jaEJhc2ljPEVhcmx5RXZhbD4sIE1PREVTICk7CisgIEJPT1NUX1BQX1NFUV9GT1JfRUFDSChfUlVOX0JFTkNILCBiZW5jaEJhc2ljPEVhcmx5RXZhbD4sIE1PREVTKTsKICAgc3RkOjpjb3V0IDw8IGVuZGw7CiAKICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9iZW5jaC9iYXNpY2JlbmNobWFyay5oIGIvYmVuY2gvYmFzaWNiZW5jaG1hcmsuaAppbmRleCA4MDU5Mzc1Li42MWFkMTUzIDEwMDY0NAotLS0gYS9iZW5jaC9iYXNpY2JlbmNobWFyay5oCisrKyBiL2JlbmNoL2Jhc2ljYmVuY2htYXJrLmgKQEAgLTIsNTUgKzIsNDYgQEAKICNpZm5kZWYgRUlHRU5fQkVOQ0hfQkFTSUNCRU5DSF9ICiAjZGVmaW5lIEVJR0VOX0JFTkNIX0JBU0lDQkVOQ0hfSAogCi1lbnVtIHtMYXp5RXZhbCwgRWFybHlFdmFsLCBPbXBFdmFsfTsKK2VudW0geyBMYXp5RXZhbCwgRWFybHlFdmFsLCBPbXBFdmFsIH07CiAKLXRlbXBsYXRlPGludCBNb2RlLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGUgPGludCBNb2RlLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgogdm9pZCBiZW5jaEJhc2ljX2xvb3AoY29uc3QgTWF0cml4VHlwZSYgSSwgTWF0cml4VHlwZSYgbSwgaW50IGl0ZXJhdGlvbnMpIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7CiAKLXRlbXBsYXRlPGludCBNb2RlLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCBiZW5jaEJhc2ljX2xvb3AoY29uc3QgTWF0cml4VHlwZSYgSSwgTWF0cml4VHlwZSYgbSwgaW50IGl0ZXJhdGlvbnMpCi17Ci0gIGZvcihpbnQgYSA9IDA7IGEgPCBpdGVyYXRpb25zOyBhKyspCi0gIHsKLSAgICBpZiAoTW9kZT09TGF6eUV2YWwpCi0gICAgewordGVtcGxhdGUgPGludCBNb2RlLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBiZW5jaEJhc2ljX2xvb3AoY29uc3QgTWF0cml4VHlwZSYgSSwgTWF0cml4VHlwZSYgbSwgaW50IGl0ZXJhdGlvbnMpIHsKKyAgZm9yIChpbnQgYSA9IDA7IGEgPCBpdGVyYXRpb25zOyBhKyspIHsKKyAgICBpZiAoTW9kZSA9PSBMYXp5RXZhbCkgewogICAgICAgYXNtKCIjYmVnaW5fYmVuY2hfbG9vcCBMYXp5RXZhbCIpOwotICAgICAgaWYgKE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lIT1FaWdlbjo6RHluYW1pYykgYXNtKCIjZml4ZWRzaXplIik7CisgICAgICBpZiAoTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgIT0gRWlnZW46OkR5bmFtaWMpIGFzbSgiI2ZpeGVkc2l6ZSIpOwogICAgICAgbSA9IChJICsgMC4wMDAwNSAqIChtICsgbS5sYXp5UHJvZHVjdChtKSkpLmV2YWwoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTW9kZT09T21wRXZhbCkKLSAgICB7CisgICAgfSBlbHNlIGlmIChNb2RlID09IE9tcEV2YWwpIHsKICAgICAgIGFzbSgiI2JlZ2luX2JlbmNoX2xvb3AgT21wRXZhbCIpOwotICAgICAgaWYgKE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lIT1FaWdlbjo6RHluYW1pYykgYXNtKCIjZml4ZWRzaXplIik7CisgICAgICBpZiAoTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgIT0gRWlnZW46OkR5bmFtaWMpIGFzbSgiI2ZpeGVkc2l6ZSIpOwogICAgICAgbSA9IChJICsgMC4wMDAwNSAqIChtICsgbS5sYXp5UHJvZHVjdChtKSkpLmV2YWwoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgYXNtKCIjYmVnaW5fYmVuY2hfbG9vcCBFYXJseUV2YWwiKTsKLSAgICAgIGlmIChNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSE9RWlnZW46OkR5bmFtaWMpIGFzbSgiI2ZpeGVkc2l6ZSIpOworICAgICAgaWYgKE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lICE9IEVpZ2VuOjpEeW5hbWljKSBhc20oIiNmaXhlZHNpemUiKTsKICAgICAgIG0gPSBJICsgMC4wMDAwNSAqIChtICsgbSAqIG0pOwogICAgIH0KICAgICBhc20oIiNlbmRfYmVuY2hfbG9vcCIpOwogICB9CiB9CiAKLXRlbXBsYXRlPGludCBNb2RlLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGUgPGludCBNb2RlLCB0eXBlbmFtZSBNYXRyaXhUeXBlPgogZG91YmxlIGJlbmNoQmFzaWMoY29uc3QgTWF0cml4VHlwZSYgbWF0LCBpbnQgc2l6ZSwgaW50IHRyaWVzKSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpOwogCi10ZW1wbGF0ZTxpbnQgTW9kZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4KLWRvdWJsZSBiZW5jaEJhc2ljKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgaW50IGl0ZXJhdGlvbnMsIGludCB0cmllcykKLXsKK3RlbXBsYXRlIDxpbnQgTW9kZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK2RvdWJsZSBiZW5jaEJhc2ljKGNvbnN0IE1hdHJpeFR5cGUmIG1hdCwgaW50IGl0ZXJhdGlvbnMsIGludCB0cmllcykgewogICBjb25zdCBpbnQgcm93cyA9IG1hdC5yb3dzKCk7CiAgIGNvbnN0IGludCBjb2xzID0gbWF0LmNvbHMoKTsKIAotICBNYXRyaXhUeXBlIEkocm93cyxjb2xzKTsKLSAgTWF0cml4VHlwZSBtKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgSShyb3dzLCBjb2xzKTsKKyAgTWF0cml4VHlwZSBtKHJvd3MsIGNvbHMpOwogCiAgIGluaXRNYXRyaXhfaWRlbnRpdHkoSSk7CiAKICAgRWlnZW46OkJlbmNoVGltZXIgdGltZXI7Ci0gIGZvcih1aW50IHQ9MDsgdDx0cmllczsgKyt0KQotICB7CisgIGZvciAodWludCB0ID0gMDsgdCA8IHRyaWVzOyArK3QpIHsKICAgICBpbml0TWF0cml4X3JhbmRvbShtKTsKICAgICB0aW1lci5zdGFydCgpOwogICAgIGJlbmNoQmFzaWNfbG9vcDxNb2RlPihJLCBtLCBpdGVyYXRpb25zKTsKQEAgLTYwLDQgKzUxLDQgQEAKICAgcmV0dXJuIHRpbWVyLnZhbHVlKCk7CiB9OwogCi0jZW5kaWYgLy8gRUlHRU5fQkVOQ0hfQkFTSUNCRU5DSF9ICisjZW5kaWYgIC8vIEVJR0VOX0JFTkNIX0JBU0lDQkVOQ0hfSApkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2hCbGFzR2VtbS5jcHAgYi9iZW5jaC9iZW5jaEJsYXNHZW1tLmNwcAppbmRleCBjYjA4NmE1Li5hNTc5NjZlIDEwMDY0NAotLS0gYS9iZW5jaC9iZW5jaEJsYXNHZW1tLmNwcAorKysgYi9iZW5jaC9iZW5jaEJsYXNHZW1tLmNwcApAQCAtMjUsNTkgKzI1LDQ3IEBACiAjZGVmaW5lIENCTEFTX0dFTU0gY2JsYXNfZGdlbW0KICNlbmRpZgogCi0KLXR5cGVkZWYgRWlnZW46Ok1hdHJpeDxTY2FsYXIsRWlnZW46OkR5bmFtaWMsRWlnZW46OkR5bmFtaWM+IE15TWF0cml4OwordHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljPiBNeU1hdHJpeDsKIHZvaWQgYmVuY2hfZWlnZW5nZW1tKE15TWF0cml4JiBtYywgY29uc3QgTXlNYXRyaXgmIG1hLCBjb25zdCBNeU1hdHJpeCYgbWIsIGludCBuYmxvb3BzKTsKIHZvaWQgY2hlY2tfcHJvZHVjdChpbnQgTSwgaW50IE4sIGludCBLKTsKIHZvaWQgY2hlY2tfcHJvZHVjdCh2b2lkKTsKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgLy8gZGlzYWJsZSBTU0UgZXhjZXB0aW9ucwotICAjaWZkZWYgX19HTlVDX18KK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKy8vIGRpc2FibGUgU1NFIGV4Y2VwdGlvbnMKKyNpZmRlZiBfX0dOVUNfXwogICB7CiAgICAgaW50IGF1eDsKLSAgICBhc20oCi0gICAgInN0bXhjc3IgICAlW2F1eF0gICAgICAgICAgIFxuXHQiCi0gICAgIm9ybCAgICAgICAkMzI4MzIsICVbYXV4XSAgIFxuXHQiCi0gICAgImxkbXhjc3IgICAlW2F1eF0gICAgICAgICAgIFxuXHQiCi0gICAgOiA6IFthdXhdICJtIiAoYXV4KSk7CisgICAgYXNtKCJzdG14Y3NyICAgJVthdXhdICAgICAgICAgICBcblx0IgorICAgICAgICAib3JsICAgICAgICQzMjgzMiwgJVthdXhdICAgXG5cdCIKKyAgICAgICAgImxkbXhjc3IgICAlW2F1eF0gICAgICAgICAgIFxuXHQiCisgICAgICAgIDoKKyAgICAgICAgOiBbYXV4XSAibSIoYXV4KSk7CiAgIH0KLSAgI2VuZGlmCisjZW5kaWYKIAotICBpbnQgbmJ0cmllcz0xLCBuYmxvb3BzPTEsIE0sIE4sIEs7CisgIGludCBuYnRyaWVzID0gMSwgbmJsb29wcyA9IDEsIE0sIE4sIEs7CiAKLSAgaWYgKGFyZ2M9PTIpCi0gIHsKLSAgICBpZiAoc3RkOjpzdHJpbmcoYXJndlsxXSk9PSJjaGVjayIpCisgIGlmIChhcmdjID09IDIpIHsKKyAgICBpZiAoc3RkOjpzdHJpbmcoYXJndlsxXSkgPT0gImNoZWNrIikKICAgICAgIGNoZWNrX3Byb2R1Y3QoKTsKICAgICBlbHNlCiAgICAgICBNID0gTiA9IEsgPSBhdG9pKGFyZ3ZbMV0pOwotICB9Ci0gIGVsc2UgaWYgKChhcmdjPT0zKSAmJiAoc3RkOjpzdHJpbmcoYXJndlsxXSk9PSJhdXRvIikpCi0gIHsKKyAgfSBlbHNlIGlmICgoYXJnYyA9PSAzKSAmJiAoc3RkOjpzdHJpbmcoYXJndlsxXSkgPT0gImF1dG8iKSkgewogICAgIE0gPSBOID0gSyA9IGF0b2koYXJndlsyXSk7Ci0gICAgbmJsb29wcyA9IDEwMDAwMDAwMDAvKE0qTSpNKTsKLSAgICBpZiAobmJsb29wczwxKQotICAgICAgbmJsb29wcyA9IDE7CisgICAgbmJsb29wcyA9IDEwMDAwMDAwMDAgLyAoTSAqIE0gKiBNKTsKKyAgICBpZiAobmJsb29wcyA8IDEpIG5ibG9vcHMgPSAxOwogICAgIG5idHJpZXMgPSA2OwotICB9Ci0gIGVsc2UgaWYgKGFyZ2M9PTQpCi0gIHsKKyAgfSBlbHNlIGlmIChhcmdjID09IDQpIHsKICAgICBNID0gTiA9IEsgPSBhdG9pKGFyZ3ZbMV0pOwogICAgIG5ibG9vcHMgPSBhdG9pKGFyZ3ZbMl0pOwogICAgIG5idHJpZXMgPSBhdG9pKGFyZ3ZbM10pOwotICB9Ci0gIGVsc2UgaWYgKGFyZ2M9PTYpCi0gIHsKKyAgfSBlbHNlIGlmIChhcmdjID09IDYpIHsKICAgICBNID0gYXRvaShhcmd2WzFdKTsKICAgICBOID0gYXRvaShhcmd2WzJdKTsKICAgICBLID0gYXRvaShhcmd2WzNdKTsKICAgICBuYmxvb3BzID0gYXRvaShhcmd2WzRdKTsKICAgICBuYnRyaWVzID0gYXRvaShhcmd2WzVdKTsKLSAgfQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICBzdGQ6OmNvdXQgPDwgIlVzYWdlOiAiIDw8IGFyZ3ZbMF0gPDwgIiBzaXplICBcbiI7CiAgICAgc3RkOjpjb3V0IDw8ICJVc2FnZTogIiA8PCBhcmd2WzBdIDw8ICIgYXV0byBzaXplXG4iOwogICAgIHN0ZDo6Y291dCA8PCAiVXNhZ2U6ICIgPDwgYXJndlswXSA8PCAiIHNpemUgbmJsb29wcyBuYnRyaWVzXG4iOwpAQCAtOTUsMTQgKzgzLDEzIEBACiAKICAgZG91YmxlIG5ibWFkID0gZG91YmxlKE0pICogZG91YmxlKE4pICogZG91YmxlKEspICogZG91YmxlKG5ibG9vcHMpOwogCi0gIGlmICghKHN0ZDo6c3RyaW5nKGFyZ3ZbMV0pPT0iYXV0byIpKQotICAgIHN0ZDo6Y291dCA8PCBNIDw8ICIgeCAiIDw8IE4gPDwgIiB4ICIgPDwgSyA8PCAiXG4iOworICBpZiAoIShzdGQ6OnN0cmluZyhhcmd2WzFdKSA9PSAiYXV0byIpKSBzdGQ6OmNvdXQgPDwgTSA8PCAiIHggIiA8PCBOIDw8ICIgeCAiIDw8IEsgPDwgIlxuIjsKIAogICBTY2FsYXIgYWxwaGEsIGJldGE7Ci0gIE15TWF0cml4IG1hKE0sSyksIG1iKEssTiksIG1jKE0sTik7Ci0gIG1hID0gTXlNYXRyaXg6OlJhbmRvbShNLEspOwotICBtYiA9IE15TWF0cml4OjpSYW5kb20oSyxOKTsKLSAgbWMgPSBNeU1hdHJpeDo6UmFuZG9tKE0sTik7CisgIE15TWF0cml4IG1hKE0sIEspLCBtYihLLCBOKSwgbWMoTSwgTik7CisgIG1hID0gTXlNYXRyaXg6OlJhbmRvbShNLCBLKTsKKyAgbWIgPSBNeU1hdHJpeDo6UmFuZG9tKEssIE4pOworICBtYyA9IE15TWF0cml4OjpSYW5kb20oTSwgTik7CiAKICAgRWlnZW46OkJlbmNoVGltZXIgdGltZXI7CiAKQEAgLTExMiwxMDggKzk5LDEwMSBAQAogCiAgIC8vIGJlbmNoIGNibGFzCiAgIC8vIFJPV1NfQSwgQ09MU19CLCBDT0xTX0EsIDEuMCwgIEEsIENPTFNfQSwgQiwgQ09MU19CLCAwLjAsIEMsIENPTFNfQik7Ci0gIGlmICghKHN0ZDo6c3RyaW5nKGFyZ3ZbMV0pPT0iYXV0byIpKQotICB7CisgIGlmICghKHN0ZDo6c3RyaW5nKGFyZ3ZbMV0pID09ICJhdXRvIikpIHsKICAgICB0aW1lci5yZXNldCgpOwotICAgIGZvciAodWludCBrPTAgOyBrPG5idHJpZXMgOyArK2spCi0gICAgewotICAgICAgICB0aW1lci5zdGFydCgpOwotICAgICAgICBmb3IgKHVpbnQgaj0wIDsgajxuYmxvb3BzIDsgKytqKQotICAgICAgICAgICAgICAjaWZkZWYgRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IKLSAgICAgICAgICAgICAgQ0JMQVNfR0VNTShDYmxhc1Jvd01ham9yLCBDYmxhc05vVHJhbnMsIENibGFzTm9UcmFucywgTSwgTiwgSywgYWxwaGEsIG1hLmRhdGEoKSwgSywgbWIuZGF0YSgpLCBOLCBiZXRhLCBtYy5kYXRhKCksIE4pOwotICAgICAgICAgICAgICAjZWxzZQotICAgICAgICAgICAgICBDQkxBU19HRU1NKENibGFzQ29sTWFqb3IsIENibGFzTm9UcmFucywgQ2JsYXNOb1RyYW5zLCBNLCBOLCBLLCBhbHBoYSwgbWEuZGF0YSgpLCBNLCBtYi5kYXRhKCksIEssIGJldGEsIG1jLmRhdGEoKSwgTSk7Ci0gICAgICAgICAgICAgICNlbmRpZgotICAgICAgICB0aW1lci5zdG9wKCk7CisgICAgZm9yICh1aW50IGsgPSAwOyBrIDwgbmJ0cmllczsgKytrKSB7CisgICAgICB0aW1lci5zdGFydCgpOworICAgICAgZm9yICh1aW50IGogPSAwOyBqIDwgbmJsb29wczsgKytqKQorI2lmZGVmIEVJR0VOX0RFRkFVTFRfVE9fUk9XX01BSk9SCisgICAgICAgIENCTEFTX0dFTU0oQ2JsYXNSb3dNYWpvciwgQ2JsYXNOb1RyYW5zLCBDYmxhc05vVHJhbnMsIE0sIE4sIEssIGFscGhhLCBtYS5kYXRhKCksIEssIG1iLmRhdGEoKSwgTiwgYmV0YSwKKyAgICAgICAgICAgICAgICAgICBtYy5kYXRhKCksIE4pOworI2Vsc2UKKyAgICAgICAgQ0JMQVNfR0VNTShDYmxhc0NvbE1ham9yLCBDYmxhc05vVHJhbnMsIENibGFzTm9UcmFucywgTSwgTiwgSywgYWxwaGEsIG1hLmRhdGEoKSwgTSwgbWIuZGF0YSgpLCBLLCBiZXRhLAorICAgICAgICAgICAgICAgICAgIG1jLmRhdGEoKSwgTSk7CisjZW5kaWYKKyAgICAgIHRpbWVyLnN0b3AoKTsKICAgICB9Ci0gICAgaWYgKCEoc3RkOjpzdHJpbmcoYXJndlsxXSk9PSJhdXRvIikpCi0gICAgICBzdGQ6OmNvdXQgPDwgImNibGFzOiAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIiAoIiA8PCAxZS0zKmZsb29yKDFlLTYqbmJtYWQvdGltZXIudmFsdWUoKSkgPDwgIiBHRmxvcHMvcylcbiI7CisgICAgaWYgKCEoc3RkOjpzdHJpbmcoYXJndlsxXSkgPT0gImF1dG8iKSkKKyAgICAgIHN0ZDo6Y291dCA8PCAiY2JsYXM6ICIgPDwgdGltZXIudmFsdWUoKSA8PCAiICgiIDw8IDFlLTMgKiBmbG9vcigxZS02ICogbmJtYWQgLyB0aW1lci52YWx1ZSgpKSA8PCAiIEdGbG9wcy9zKVxuIjsKICAgICBlbHNlCi0gICAgICAgIHN0ZDo6Y291dCA8PCBNIDw8ICIgOiAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIiA7ICIgPDwgMWUtMypmbG9vcigxZS02Km5ibWFkL3RpbWVyLnZhbHVlKCkpIDw8ICJcbiI7CisgICAgICBzdGQ6OmNvdXQgPDwgTSA8PCAiIDogIiA8PCB0aW1lci52YWx1ZSgpIDw8ICIgOyAiIDw8IDFlLTMgKiBmbG9vcigxZS02ICogbmJtYWQgLyB0aW1lci52YWx1ZSgpKSA8PCAiXG4iOwogICB9CiAKICAgLy8gY2xlYXIKLSAgbWEgPSBNeU1hdHJpeDo6UmFuZG9tKE0sSyk7Ci0gIG1iID0gTXlNYXRyaXg6OlJhbmRvbShLLE4pOwotICBtYyA9IE15TWF0cml4OjpSYW5kb20oTSxOKTsKKyAgbWEgPSBNeU1hdHJpeDo6UmFuZG9tKE0sIEspOworICBtYiA9IE15TWF0cml4OjpSYW5kb20oSywgTik7CisgIG1jID0gTXlNYXRyaXg6OlJhbmRvbShNLCBOKTsKIAogICAvLyBlaWdlbgotLy8gICBpZiAoIShzdGQ6OnN0cmluZyhhcmd2WzFdKT09ImF1dG8iKSkKKyAgLy8gICBpZiAoIShzdGQ6OnN0cmluZyhhcmd2WzFdKT09ImF1dG8iKSkKICAgewotICAgICAgdGltZXIucmVzZXQoKTsKLSAgICAgIGZvciAodWludCBrPTAgOyBrPG5idHJpZXMgOyArK2spCi0gICAgICB7Ci0gICAgICAgICAgdGltZXIuc3RhcnQoKTsKLSAgICAgICAgICBiZW5jaF9laWdlbmdlbW0obWMsIG1hLCBtYiwgbmJsb29wcyk7Ci0gICAgICAgICAgdGltZXIuc3RvcCgpOwotICAgICAgfQotICAgICAgaWYgKCEoc3RkOjpzdHJpbmcoYXJndlsxXSk9PSJhdXRvIikpCi0gICAgICAgIHN0ZDo6Y291dCA8PCAiZWlnZW4gOiAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIiAoIiA8PCAxZS0zKmZsb29yKDFlLTYqbmJtYWQvdGltZXIudmFsdWUoKSkgPDwgIiBHRmxvcHMvcylcbiI7Ci0gICAgICBlbHNlCi0gICAgICAgIHN0ZDo6Y291dCA8PCBNIDw8ICIgOiAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIiA7ICIgPDwgMWUtMypmbG9vcigxZS02Km5ibWFkL3RpbWVyLnZhbHVlKCkpIDw8ICJcbiI7CisgICAgdGltZXIucmVzZXQoKTsKKyAgICBmb3IgKHVpbnQgayA9IDA7IGsgPCBuYnRyaWVzOyArK2spIHsKKyAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICBiZW5jaF9laWdlbmdlbW0obWMsIG1hLCBtYiwgbmJsb29wcyk7CisgICAgICB0aW1lci5zdG9wKCk7CisgICAgfQorICAgIGlmICghKHN0ZDo6c3RyaW5nKGFyZ3ZbMV0pID09ICJhdXRvIikpCisgICAgICBzdGQ6OmNvdXQgPDwgImVpZ2VuIDogIiA8PCB0aW1lci52YWx1ZSgpIDw8ICIgKCIgPDwgMWUtMyAqIGZsb29yKDFlLTYgKiBuYm1hZCAvIHRpbWVyLnZhbHVlKCkpIDw8ICIgR0Zsb3BzL3MpXG4iOworICAgIGVsc2UKKyAgICAgIHN0ZDo6Y291dCA8PCBNIDw8ICIgOiAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIiA7ICIgPDwgMWUtMyAqIGZsb29yKDFlLTYgKiBuYm1hZCAvIHRpbWVyLnZhbHVlKCkpIDw8ICJcbiI7CiAgIH0KIAogICBzdGQ6OmNvdXQgPDwgImwxOiAiIDw8IEVpZ2VuOjpsMUNhY2hlU2l6ZSgpIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8ICJsMjogIiA8PCBFaWdlbjo6bDJDYWNoZVNpemUoKSA8PCBzdGQ6OmVuZGw7Ci0gIAogCiAgIHJldHVybiAwOwogfQogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgYmVuY2hfZWlnZW5nZW1tKE15TWF0cml4JiBtYywgY29uc3QgTXlNYXRyaXgmIG1hLCBjb25zdCBNeU1hdHJpeCYgbWIsIGludCBuYmxvb3BzKQotewotICBmb3IgKHVpbnQgaj0wIDsgajxuYmxvb3BzIDsgKytqKQotICAgICAgbWMubm9hbGlhcygpICs9IG1hICogbWI7Cit2b2lkIGJlbmNoX2VpZ2VuZ2VtbShNeU1hdHJpeCYgbWMsIGNvbnN0IE15TWF0cml4JiBtYSwgY29uc3QgTXlNYXRyaXgmIG1iLCBpbnQgbmJsb29wcykgeworICBmb3IgKHVpbnQgaiA9IDA7IGogPCBuYmxvb3BzOyArK2opIG1jLm5vYWxpYXMoKSArPSBtYSAqIG1iOwogfQogCi0jZGVmaW5lIE1ZVkVSSUZZKEEsTSkgaWYgKCEoQSkpIHsgXAorI2RlZmluZSBNWVZFUklGWShBLCBNKSAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEoQSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgc3RkOjpjb3V0IDw8ICJGQUlMOiAiIDw8IE0gPDwgIlxuIjsgXAogICB9Ci12b2lkIGNoZWNrX3Byb2R1Y3QoaW50IE0sIGludCBOLCBpbnQgSykKLXsKLSAgTXlNYXRyaXggbWEoTSxLKSwgbWIoSyxOKSwgbWMoTSxOKSwgbWFUKEssTSksIG1iVChOLEspLCBtZWlnZW4oTSxOKSwgbXJlZihNLE4pOwotICBtYSA9IE15TWF0cml4OjpSYW5kb20oTSxLKTsKLSAgbWIgPSBNeU1hdHJpeDo6UmFuZG9tKEssTik7Cit2b2lkIGNoZWNrX3Byb2R1Y3QoaW50IE0sIGludCBOLCBpbnQgSykgeworICBNeU1hdHJpeCBtYShNLCBLKSwgbWIoSywgTiksIG1jKE0sIE4pLCBtYVQoSywgTSksIG1iVChOLCBLKSwgbWVpZ2VuKE0sIE4pLCBtcmVmKE0sIE4pOworICBtYSA9IE15TWF0cml4OjpSYW5kb20oTSwgSyk7CisgIG1iID0gTXlNYXRyaXg6OlJhbmRvbShLLCBOKTsKICAgbWFUID0gbWEudHJhbnNwb3NlKCk7CiAgIG1iVCA9IG1iLnRyYW5zcG9zZSgpOwotICBtYyA9IE15TWF0cml4OjpSYW5kb20oTSxOKTsKKyAgbWMgPSBNeU1hdHJpeDo6UmFuZG9tKE0sIE4pOwogCiAgIE15TWF0cml4OjpTY2FsYXIgZXBzID0gMWUtNDsKIAogICBtZWlnZW4gPSBtcmVmID0gbWM7CiAgIENCTEFTX0dFTU0oQ2JsYXNDb2xNYWpvciwgQ2JsYXNOb1RyYW5zLCBDYmxhc05vVHJhbnMsIE0sIE4sIEssIDEsIG1hLmRhdGEoKSwgTSwgbWIuZGF0YSgpLCBLLCAxLCBtcmVmLmRhdGEoKSwgTSk7CiAgIG1laWdlbiArPSBtYSAqIG1iOwotICBNWVZFUklGWShtZWlnZW4uaXNBcHByb3gobXJlZiwgZXBzKSwiLiAqIC4iKTsKKyAgTVlWRVJJRlkobWVpZ2VuLmlzQXBwcm94KG1yZWYsIGVwcyksICIuICogLiIpOwogCiAgIG1laWdlbiA9IG1yZWYgPSBtYzsKICAgQ0JMQVNfR0VNTShDYmxhc0NvbE1ham9yLCBDYmxhc1RyYW5zLCBDYmxhc05vVHJhbnMsIE0sIE4sIEssIDEsIG1hVC5kYXRhKCksIEssIG1iLmRhdGEoKSwgSywgMSwgbXJlZi5kYXRhKCksIE0pOwogICBtZWlnZW4gKz0gbWFULnRyYW5zcG9zZSgpICogbWI7Ci0gIE1ZVkVSSUZZKG1laWdlbi5pc0FwcHJveChtcmVmLCBlcHMpLCJUICogLiIpOworICBNWVZFUklGWShtZWlnZW4uaXNBcHByb3gobXJlZiwgZXBzKSwgIlQgKiAuIik7CiAKICAgbWVpZ2VuID0gbXJlZiA9IG1jOwogICBDQkxBU19HRU1NKENibGFzQ29sTWFqb3IsIENibGFzVHJhbnMsIENibGFzVHJhbnMsIE0sIE4sIEssIDEsIG1hVC5kYXRhKCksIEssIG1iVC5kYXRhKCksIE4sIDEsIG1yZWYuZGF0YSgpLCBNKTsKICAgbWVpZ2VuICs9IChtYVQudHJhbnNwb3NlKCkpICogKG1iVC50cmFuc3Bvc2UoKSk7Ci0gIE1ZVkVSSUZZKG1laWdlbi5pc0FwcHJveChtcmVmLCBlcHMpLCJUICogVCIpOworICBNWVZFUklGWShtZWlnZW4uaXNBcHByb3gobXJlZiwgZXBzKSwgIlQgKiBUIik7CiAKICAgbWVpZ2VuID0gbXJlZiA9IG1jOwogICBDQkxBU19HRU1NKENibGFzQ29sTWFqb3IsIENibGFzTm9UcmFucywgQ2JsYXNUcmFucywgTSwgTiwgSywgMSwgbWEuZGF0YSgpLCBNLCBtYlQuZGF0YSgpLCBOLCAxLCBtcmVmLmRhdGEoKSwgTSk7CiAgIG1laWdlbiArPSBtYSAqIG1iVC50cmFuc3Bvc2UoKTsKLSAgTVlWRVJJRlkobWVpZ2VuLmlzQXBwcm94KG1yZWYsIGVwcyksIi4gKiBUIik7CisgIE1ZVkVSSUZZKG1laWdlbi5pc0FwcHJveChtcmVmLCBlcHMpLCAiLiAqIFQiKTsKIH0KIAotdm9pZCBjaGVja19wcm9kdWN0KHZvaWQpCi17Cit2b2lkIGNoZWNrX3Byb2R1Y3Qodm9pZCkgewogICBpbnQgTSwgTiwgSzsKLSAgZm9yICh1aW50IGk9MDsgaTwxMDAwOyArK2kpCi0gIHsKLSAgICBNID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsNjQpOwotICAgIE4gPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSw3NjgpOwotICAgIEsgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSw3NjgpOworICBmb3IgKHVpbnQgaSA9IDA7IGkgPCAxMDAwOyArK2kpIHsKKyAgICBNID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDY0KTsKKyAgICBOID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDc2OCk7CisgICAgSyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCA3NjgpOwogICAgIE0gPSAoMCArIE0pICogMTsKICAgICBzdGQ6OmNvdXQgPDwgTSA8PCAiIHggIiA8PCBOIDw8ICIgeCAiIDw8IEsgPDwgIlxuIjsKICAgICBjaGVja19wcm9kdWN0KE0sIE4sIEspOwogICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNoQ2hvbGVza3kuY3BwIGIvYmVuY2gvYmVuY2hDaG9sZXNreS5jcHAKaW5kZXggMGRjOTRlNS4uM2Q2NjU1YiAxMDA2NDQKLS0tIGEvYmVuY2gvYmVuY2hDaG9sZXNreS5jcHAKKysrIGIvYmVuY2gvYmVuY2hDaG9sZXNreS5jcHAKQEAgLTI1LDExNyArMjUsMTAwIEBACiB0eXBlZGVmIGZsb2F0IFNjYWxhcjsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci1fX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSB2b2lkIGJlbmNoTExUKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17CitfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpIHZvaWQgYmVuY2hMTFQoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICBpbnQgcm93cyA9IG0ucm93cygpOwogICBpbnQgY29scyA9IG0uY29scygpOwogCiAgIGRvdWJsZSBjb3N0ID0gMDsKLSAgZm9yIChpbnQgaj0wOyBqPHJvd3M7ICsraikKLSAgewotICAgIGludCByID0gc3RkOjptYXgocm93cyAtIGogLTEsMCk7Ci0gICAgY29zdCArPSAyKihyKmorcitqKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCByb3dzOyArK2opIHsKKyAgICBpbnQgciA9IHN0ZDo6bWF4KHJvd3MgLSBqIC0gMSwgMCk7CisgICAgY29zdCArPSAyICogKHIgKiBqICsgciArIGopOwogICB9CiAKLSAgaW50IHJlcGVhdHMgPSAoUkVQRUFUKjEwMDApLyhyb3dzKnJvd3MpOworICBpbnQgcmVwZWF0cyA9IChSRVBFQVQgKiAxMDAwKSAvIChyb3dzICogcm93cyk7CiAKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gU3F1YXJlTWF0cml4VHlwZTsKIAotICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKLSAgU3F1YXJlTWF0cml4VHlwZSBjb3ZNYXQgPSAgYSAqIGEuYWRqb2ludCgpOworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIFNxdWFyZU1hdHJpeFR5cGUgY292TWF0ID0gYSAqIGEuYWRqb2ludCgpOwogCiAgIEJlbmNoVGltZXIgdGltZXJOb1NxcnQsIHRpbWVyU3FydDsKIAogICBTY2FsYXIgYWNjID0gMDsKLSAgaW50IHIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb3ZNYXQucm93cygpLTEpOwotICBpbnQgYyA9IGludGVybmFsOjpyYW5kb208aW50PigwLGNvdk1hdC5jb2xzKCktMSk7Ci0gIGZvciAoaW50IHQ9MDsgdDxUUklFUzsgKyt0KQotICB7CisgIGludCByID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIGNvdk1hdC5yb3dzKCkgLSAxKTsKKyAgaW50IGMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgY292TWF0LmNvbHMoKSAtIDEpOworICBmb3IgKGludCB0ID0gMDsgdCA8IFRSSUVTOyArK3QpIHsKICAgICB0aW1lck5vU3FydC5zdGFydCgpOwotICAgIGZvciAoaW50IGs9MDsgazxyZXBlYXRzOyArK2spCi0gICAgeworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcmVwZWF0czsgKytrKSB7CiAgICAgICBMRExUPFNxdWFyZU1hdHJpeFR5cGU+IGNob2xub3NxcnQoY292TWF0KTsKLSAgICAgIGFjYyArPSBjaG9sbm9zcXJ0Lm1hdHJpeEwoKS5jb2VmZihyLGMpOworICAgICAgYWNjICs9IGNob2xub3NxcnQubWF0cml4TCgpLmNvZWZmKHIsIGMpOwogICAgIH0KICAgICB0aW1lck5vU3FydC5zdG9wKCk7CiAgIH0KIAotICBmb3IgKGludCB0PTA7IHQ8VFJJRVM7ICsrdCkKLSAgeworICBmb3IgKGludCB0ID0gMDsgdCA8IFRSSUVTOyArK3QpIHsKICAgICB0aW1lclNxcnQuc3RhcnQoKTsKLSAgICBmb3IgKGludCBrPTA7IGs8cmVwZWF0czsgKytrKQotICAgIHsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IHJlcGVhdHM7ICsraykgewogICAgICAgTExUPFNxdWFyZU1hdHJpeFR5cGU+IGNob2woY292TWF0KTsKLSAgICAgIGFjYyArPSBjaG9sLm1hdHJpeEwoKS5jb2VmZihyLGMpOworICAgICAgYWNjICs9IGNob2wubWF0cml4TCgpLmNvZWZmKHIsIGMpOwogICAgIH0KICAgICB0aW1lclNxcnQuc3RvcCgpOwogICB9CiAKLSAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljKQorICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykKICAgICBzdGQ6OmNvdXQgPDwgImR5biAgICI7CiAgIGVsc2UKICAgICBzdGQ6OmNvdXQgPDwgImZpeGVkICI7Ci0gIHN0ZDo6Y291dCA8PCBjb3ZNYXQucm93cygpIDw8ICIgXHQiCi0gICAgICAgICAgICA8PCAodGltZXJOb1NxcnQuYmVzdCgpKSAvIHJlcGVhdHMgPDwgInMgIgotICAgICAgICAgICAgPDwgIigiIDw8IDFlLTkgKiBjb3N0KnJlcGVhdHMvdGltZXJOb1NxcnQuYmVzdCgpIDw8ICIgR0ZMT1BTKVx0IgotICAgICAgICAgICAgPDwgKHRpbWVyU3FydC5iZXN0KCkpIC8gcmVwZWF0cyA8PCAicyAiCi0gICAgICAgICAgICA8PCAiKCIgPDwgMWUtOSAqIGNvc3QqcmVwZWF0cy90aW1lclNxcnQuYmVzdCgpIDw8ICIgR0ZMT1BTKVxuIjsKKyAgc3RkOjpjb3V0IDw8IGNvdk1hdC5yb3dzKCkgPDwgIiBcdCIgPDwgKHRpbWVyTm9TcXJ0LmJlc3QoKSkgLyByZXBlYXRzIDw8ICJzICIKKyAgICAgICAgICAgIDw8ICIoIiA8PCAxZS05ICogY29zdCAqIHJlcGVhdHMgLyB0aW1lck5vU3FydC5iZXN0KCkgPDwgIiBHRkxPUFMpXHQiIDw8ICh0aW1lclNxcnQuYmVzdCgpKSAvIHJlcGVhdHMgPDwgInMgIgorICAgICAgICAgICAgPDwgIigiIDw8IDFlLTkgKiBjb3N0ICogcmVwZWF0cyAvIHRpbWVyU3FydC5iZXN0KCkgPDwgIiBHRkxPUFMpXG4iOwogCi0KLSAgI2lmZGVmIEJFTkNIX0dTTAotICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCi0gIHsKKyNpZmRlZiBCRU5DSF9HU0wKKyAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMpIHsKICAgICB0aW1lclNxcnQucmVzZXQoKTsKIAotICAgIGdzbF9tYXRyaXgqIGdzbENvdk1hdCA9IGdzbF9tYXRyaXhfYWxsb2MoY292TWF0LnJvd3MoKSxjb3ZNYXQuY29scygpKTsKLSAgICBnc2xfbWF0cml4KiBnc2xDb3B5ID0gZ3NsX21hdHJpeF9hbGxvYyhjb3ZNYXQucm93cygpLGNvdk1hdC5jb2xzKCkpOworICAgIGdzbF9tYXRyaXgqIGdzbENvdk1hdCA9IGdzbF9tYXRyaXhfYWxsb2MoY292TWF0LnJvd3MoKSwgY292TWF0LmNvbHMoKSk7CisgICAgZ3NsX21hdHJpeCogZ3NsQ29weSA9IGdzbF9tYXRyaXhfYWxsb2MoY292TWF0LnJvd3MoKSwgY292TWF0LmNvbHMoKSk7CiAKICAgICBlaVRvR3NsKGNvdk1hdCwgJmdzbENvdk1hdCk7Ci0gICAgZm9yIChpbnQgdD0wOyB0PFRSSUVTOyArK3QpCi0gICAgeworICAgIGZvciAoaW50IHQgPSAwOyB0IDwgVFJJRVM7ICsrdCkgewogICAgICAgdGltZXJTcXJ0LnN0YXJ0KCk7Ci0gICAgICBmb3IgKGludCBrPTA7IGs8cmVwZWF0czsgKytrKQotICAgICAgewotICAgICAgICBnc2xfbWF0cml4X21lbWNweShnc2xDb3B5LGdzbENvdk1hdCk7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IHJlcGVhdHM7ICsraykgeworICAgICAgICBnc2xfbWF0cml4X21lbWNweShnc2xDb3B5LCBnc2xDb3ZNYXQpOwogICAgICAgICBnc2xfbGluYWxnX2Nob2xlc2t5X2RlY29tcChnc2xDb3B5KTsKLSAgICAgICAgYWNjICs9IGdzbF9tYXRyaXhfZ2V0KGdzbENvcHkscixjKTsKKyAgICAgICAgYWNjICs9IGdzbF9tYXRyaXhfZ2V0KGdzbENvcHksIHIsIGMpOwogICAgICAgfQogICAgICAgdGltZXJTcXJ0LnN0b3AoKTsKICAgICB9CiAKLSAgICBzdGQ6OmNvdXQgPDwgIiB8IFx0IgotICAgICAgICAgICAgICA8PCB0aW1lclNxcnQudmFsdWUoKSAqIFJFUEVBVCAvIHJlcGVhdHMgPDwgInMiOworICAgIHN0ZDo6Y291dCA8PCAiIHwgXHQiIDw8IHRpbWVyU3FydC52YWx1ZSgpICogUkVQRUFUIC8gcmVwZWF0cyA8PCAicyI7CiAKICAgICBnc2xfbWF0cml4X2ZyZWUoZ3NsQ292TWF0KTsKICAgfQotICAjZW5kaWYKKyNlbmRpZgogICBzdGQ6OmNvdXQgPDwgIlxuIjsKICAgLy8gbWFrZSBzdXJlIHRoZSBjb21waWxlciBkb2VzIG5vdCBvcHRpbWl6ZSB0b28gbXVjaAotICBpZiAoYWNjPT0xMjMpCi0gICAgc3RkOjpjb3V0IDw8IGFjYzsKKyAgaWYgKGFjYyA9PSAxMjMpIHN0ZDo6Y291dCA8PCBhY2M7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCi17Ci0gIGNvbnN0IGludCBkeW5zaXplc1tdID0gezQsNiw4LDE2LDI0LDMyLDQ5LDY0LDEyOCwyNTYsNTEyLDkwMCwxNTAwLDB9OworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBjb25zdCBpbnQgZHluc2l6ZXNbXSA9IHs0LCA2LCA4LCAxNiwgMjQsIDMyLCA0OSwgNjQsIDEyOCwgMjU2LCA1MTIsIDkwMCwgMTUwMCwgMH07CiAgIHN0ZDo6Y291dCA8PCAic2l6ZSAgICAgICAgICAgIExETFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExUIjsKLS8vICAgI2lmZGVmIEJFTkNIX0dTTAotLy8gICBzdGQ6OmNvdXQgPDwgIiAgICAgICBHU0wgKHN0YW5kYXJkICsgZG91YmxlICsgQVRMQVMpICAiOwotLy8gICAjZW5kaWYKKyAgLy8gICAjaWZkZWYgQkVOQ0hfR1NMCisgIC8vICAgc3RkOjpjb3V0IDw8ICIgICAgICAgR1NMIChzdGFuZGFyZCArIGRvdWJsZSArIEFUTEFTKSAgIjsKKyAgLy8gICAjZW5kaWYKICAgc3RkOjpjb3V0IDw8ICJcbiI7Ci0gIGZvciAoaW50IGk9MDsgZHluc2l6ZXNbaV0+MDsgKytpKQotICAgIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPihkeW5zaXplc1tpXSxkeW5zaXplc1tpXSkpOworICBmb3IgKGludCBpID0gMDsgZHluc2l6ZXNbaV0gPiAwOyArK2kpIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+KGR5bnNpemVzW2ldLCBkeW5zaXplc1tpXSkpOwogCi0gIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsMiwyPigpKTsKLSAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciwzLDM+KCkpOwotICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLDQsND4oKSk7Ci0gIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsNSw1PigpKTsKLSAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciw2LDY+KCkpOwotICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLDcsNz4oKSk7Ci0gIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsOCw4PigpKTsKLSAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciwxMiwxMj4oKSk7Ci0gIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsMTYsMTY+KCkpOworICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLCAyLCAyPigpKTsKKyAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciwgMywgMz4oKSk7CisgIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsIDQsIDQ+KCkpOworICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLCA1LCA1PigpKTsKKyAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciwgNiwgNj4oKSk7CisgIGJlbmNoTExUKE1hdHJpeDxTY2FsYXIsIDcsIDc+KCkpOworICBiZW5jaExMVChNYXRyaXg8U2NhbGFyLCA4LCA4PigpKTsKKyAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciwgMTIsIDEyPigpKTsKKyAgYmVuY2hMTFQoTWF0cml4PFNjYWxhciwgMTYsIDE2PigpKTsKICAgcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNoRWlnZW5Tb2x2ZXIuY3BwIGIvYmVuY2gvYmVuY2hFaWdlblNvbHZlci5jcHAKaW5kZXggZGQ3OGM3ZS4uODM5ODc3NyAxMDA2NDQKLS0tIGEvYmVuY2gvYmVuY2hFaWdlblNvbHZlci5jcHAKKysrIGIvYmVuY2gvYmVuY2hFaWdlblNvbHZlci5jcHAKQEAgLTMxLDM0ICszMSwzMSBAQAogdHlwZWRlZiBTQ0FMQVIgU2NhbGFyOwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KLV9fYXR0cmlidXRlX18gKChub2lubGluZSkpIHZvaWQgYmVuY2hFaWdlblNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiBtKQoteworX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSB2b2lkIGJlbmNoRWlnZW5Tb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICBpbnQgcm93cyA9IG0ucm93cygpOwogICBpbnQgY29scyA9IG0uY29scygpOwogCi0gIGludCBzdGRSZXBlYXRzID0gc3RkOjptYXgoMSxpbnQoKFJFUEVBVCoxMDAwKS8ocm93cypyb3dzKnNxcnQocm93cykpKSk7CisgIGludCBzdGRSZXBlYXRzID0gc3RkOjptYXgoMSwgaW50KChSRVBFQVQgKiAxMDAwKSAvIChyb3dzICogcm93cyAqIHNxcnQocm93cykpKSk7CiAgIGludCBzYVJlcGVhdHMgPSBzdGRSZXBlYXRzICogNDsKIAogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBTcXVhcmVNYXRyaXhUeXBlOwogCi0gIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICBTcXVhcmVNYXRyaXhUeXBlIGNvdk1hdCA9ICBhICogYS5hZGpvaW50KCk7CisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgU3F1YXJlTWF0cml4VHlwZSBjb3ZNYXQgPSBhICogYS5hZGpvaW50KCk7CiAKICAgQmVuY2hUaW1lciB0aW1lclNhLCB0aW1lclN0ZDsKIAogICBTY2FsYXIgYWNjID0gMDsKLSAgaW50IHIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb3ZNYXQucm93cygpLTEpOwotICBpbnQgYyA9IGludGVybmFsOjpyYW5kb208aW50PigwLGNvdk1hdC5jb2xzKCktMSk7CisgIGludCByID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIGNvdk1hdC5yb3dzKCkgLSAxKTsKKyAgaW50IGMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgY292TWF0LmNvbHMoKSAtIDEpOwogICB7CiAgICAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxTcXVhcmVNYXRyaXhUeXBlPiBlaShjb3ZNYXQpOwotICAgIGZvciAoaW50IHQ9MDsgdDxUUklFUzsgKyt0KQotICAgIHsKKyAgICBmb3IgKGludCB0ID0gMDsgdCA8IFRSSUVTOyArK3QpIHsKICAgICAgIHRpbWVyU2Euc3RhcnQoKTsKLSAgICAgIGZvciAoaW50IGs9MDsgazxzYVJlcGVhdHM7ICsraykKLSAgICAgIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc2FSZXBlYXRzOyArK2spIHsKICAgICAgICAgZWkuY29tcHV0ZShjb3ZNYXQpOwotICAgICAgICBhY2MgKz0gZWkuZWlnZW52ZWN0b3JzKCkuY29lZmYocixjKTsKKyAgICAgICAgYWNjICs9IGVpLmVpZ2VudmVjdG9ycygpLmNvZWZmKHIsIGMpOwogICAgICAgfQogICAgICAgdGltZXJTYS5zdG9wKCk7CiAgICAgfQpAQCAtNjYsMTA3ICs2Myw5NCBAQAogCiAgIHsKICAgICBFaWdlblNvbHZlcjxTcXVhcmVNYXRyaXhUeXBlPiBlaShjb3ZNYXQpOwotICAgIGZvciAoaW50IHQ9MDsgdDxUUklFUzsgKyt0KQotICAgIHsKKyAgICBmb3IgKGludCB0ID0gMDsgdCA8IFRSSUVTOyArK3QpIHsKICAgICAgIHRpbWVyU3RkLnN0YXJ0KCk7Ci0gICAgICBmb3IgKGludCBrPTA7IGs8c3RkUmVwZWF0czsgKytrKQotICAgICAgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzdGRSZXBlYXRzOyArK2spIHsKICAgICAgICAgZWkuY29tcHV0ZShjb3ZNYXQpOwotICAgICAgICBhY2MgKz0gZWkuZWlnZW52ZWN0b3JzKCkuY29lZmYocixjKTsKKyAgICAgICAgYWNjICs9IGVpLmVpZ2VudmVjdG9ycygpLmNvZWZmKHIsIGMpOwogICAgICAgfQogICAgICAgdGltZXJTdGQuc3RvcCgpOwogICAgIH0KICAgfQogCi0gIGlmIChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMpCiAgICAgc3RkOjpjb3V0IDw8ICJkeW4gICAiOwogICBlbHNlCiAgICAgc3RkOjpjb3V0IDw8ICJmaXhlZCAiOwotICBzdGQ6OmNvdXQgPDwgY292TWF0LnJvd3MoKSA8PCAiIFx0IgotICAgICAgICAgICAgPDwgdGltZXJTYS52YWx1ZSgpICogUkVQRUFUIC8gc2FSZXBlYXRzIDw8ICJzIFx0IgorICBzdGQ6OmNvdXQgPDwgY292TWF0LnJvd3MoKSA8PCAiIFx0IiA8PCB0aW1lclNhLnZhbHVlKCkgKiBSRVBFQVQgLyBzYVJlcGVhdHMgPDwgInMgXHQiCiAgICAgICAgICAgICA8PCB0aW1lclN0ZC52YWx1ZSgpICogUkVQRUFUIC8gc3RkUmVwZWF0cyA8PCAicyI7CiAKLSAgI2lmZGVmIEJFTkNIX0dNTQotICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCi0gIHsKKyNpZmRlZiBCRU5DSF9HTU0KKyAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMpIHsKICAgICB0aW1lclNhLnJlc2V0KCk7CiAgICAgdGltZXJTdGQucmVzZXQoKTsKIAotICAgIGdtbTo6ZGVuc2VfbWF0cml4PFNjYWxhcj4gZ21tQ292TWF0KGNvdk1hdC5yb3dzKCksY292TWF0LmNvbHMoKSk7Ci0gICAgZ21tOjpkZW5zZV9tYXRyaXg8U2NhbGFyPiBlaWd2ZWN0KGNvdk1hdC5yb3dzKCksY292TWF0LmNvbHMoKSk7CisgICAgZ21tOjpkZW5zZV9tYXRyaXg8U2NhbGFyPiBnbW1Db3ZNYXQoY292TWF0LnJvd3MoKSwgY292TWF0LmNvbHMoKSk7CisgICAgZ21tOjpkZW5zZV9tYXRyaXg8U2NhbGFyPiBlaWd2ZWN0KGNvdk1hdC5yb3dzKCksIGNvdk1hdC5jb2xzKCkpOwogICAgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gZWlndmFsKGNvdk1hdC5yb3dzKCkpOwogICAgIGVpVG9HbW0oY292TWF0LCBnbW1Db3ZNYXQpOwotICAgIGZvciAoaW50IHQ9MDsgdDxUUklFUzsgKyt0KQotICAgIHsKKyAgICBmb3IgKGludCB0ID0gMDsgdCA8IFRSSUVTOyArK3QpIHsKICAgICAgIHRpbWVyU2Euc3RhcnQoKTsKLSAgICAgIGZvciAoaW50IGs9MDsgazxzYVJlcGVhdHM7ICsraykKLSAgICAgIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc2FSZXBlYXRzOyArK2spIHsKICAgICAgICAgZ21tOjpzeW1tZXRyaWNfcXJfYWxnb3JpdGhtKGdtbUNvdk1hdCwgZWlndmFsLCBlaWd2ZWN0KTsKLSAgICAgICAgYWNjICs9IGVpZ3ZlY3QocixjKTsKKyAgICAgICAgYWNjICs9IGVpZ3ZlY3QociwgYyk7CiAgICAgICB9CiAgICAgICB0aW1lclNhLnN0b3AoKTsKICAgICB9CiAgICAgLy8gdGhlIG5vbi1zZWxmYWRqb2ludCBzb2x2ZXIgZG9lcyBub3QgY29tcHV0ZSB0aGUgZWlnZW4gdmVjdG9ycwotLy8gICAgIGZvciAoaW50IHQ9MDsgdDxUUklFUzsgKyt0KQotLy8gICAgIHsKLS8vICAgICAgIHRpbWVyU3RkLnN0YXJ0KCk7Ci0vLyAgICAgICBmb3IgKGludCBrPTA7IGs8c3RkUmVwZWF0czsgKytrKQotLy8gICAgICAgewotLy8gICAgICAgICBnbW06OmltcGxpY2l0X3FyX2FsZ29yaXRobShnbW1Db3ZNYXQsIGVpZ3ZhbCwgZWlndmVjdCk7Ci0vLyAgICAgICAgIGFjYyArPSBlaWd2ZWN0KHIsYyk7Ci0vLyAgICAgICB9Ci0vLyAgICAgICB0aW1lclN0ZC5zdG9wKCk7Ci0vLyAgICAgfQorICAgIC8vICAgICBmb3IgKGludCB0PTA7IHQ8VFJJRVM7ICsrdCkKKyAgICAvLyAgICAgeworICAgIC8vICAgICAgIHRpbWVyU3RkLnN0YXJ0KCk7CisgICAgLy8gICAgICAgZm9yIChpbnQgaz0wOyBrPHN0ZFJlcGVhdHM7ICsraykKKyAgICAvLyAgICAgICB7CisgICAgLy8gICAgICAgICBnbW06OmltcGxpY2l0X3FyX2FsZ29yaXRobShnbW1Db3ZNYXQsIGVpZ3ZhbCwgZWlndmVjdCk7CisgICAgLy8gICAgICAgICBhY2MgKz0gZWlndmVjdChyLGMpOworICAgIC8vICAgICAgIH0KKyAgICAvLyAgICAgICB0aW1lclN0ZC5zdG9wKCk7CisgICAgLy8gICAgIH0KIAotICAgIHN0ZDo6Y291dCA8PCAiIHwgXHQiCi0gICAgICAgICAgICAgIDw8IHRpbWVyU2EudmFsdWUoKSAqIFJFUEVBVCAvIHNhUmVwZWF0cyA8PCAicyIKKyAgICBzdGQ6OmNvdXQgPDwgIiB8IFx0IiA8PCB0aW1lclNhLnZhbHVlKCkgKiBSRVBFQVQgLyBzYVJlcGVhdHMgPDwgInMiCiAgICAgICAgICAgICAgIDw8IC8qdGltZXJTdGQudmFsdWUoKSAqIFJFUEVBVCAvIHN0ZFJlcGVhdHMgPDwgInMiKi8gIiAgIG5hICAgIjsKICAgfQotICAjZW5kaWYKKyNlbmRpZgogCi0gICNpZmRlZiBCRU5DSF9HU0wKLSAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljKQotICB7CisjaWZkZWYgQkVOQ0hfR1NMCisgIGlmIChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSB7CiAgICAgdGltZXJTYS5yZXNldCgpOwogICAgIHRpbWVyU3RkLnJlc2V0KCk7CiAKLSAgICBnc2xfbWF0cml4KiBnc2xDb3ZNYXQgPSBnc2xfbWF0cml4X2FsbG9jKGNvdk1hdC5yb3dzKCksY292TWF0LmNvbHMoKSk7Ci0gICAgZ3NsX21hdHJpeCogZ3NsQ29weSA9IGdzbF9tYXRyaXhfYWxsb2MoY292TWF0LnJvd3MoKSxjb3ZNYXQuY29scygpKTsKLSAgICBnc2xfbWF0cml4KiBlaWd2ZWN0ID0gZ3NsX21hdHJpeF9hbGxvYyhjb3ZNYXQucm93cygpLGNvdk1hdC5jb2xzKCkpOwotICAgIGdzbF92ZWN0b3IqIGVpZ3ZhbCAgPSBnc2xfdmVjdG9yX2FsbG9jKGNvdk1hdC5yb3dzKCkpOworICAgIGdzbF9tYXRyaXgqIGdzbENvdk1hdCA9IGdzbF9tYXRyaXhfYWxsb2MoY292TWF0LnJvd3MoKSwgY292TWF0LmNvbHMoKSk7CisgICAgZ3NsX21hdHJpeCogZ3NsQ29weSA9IGdzbF9tYXRyaXhfYWxsb2MoY292TWF0LnJvd3MoKSwgY292TWF0LmNvbHMoKSk7CisgICAgZ3NsX21hdHJpeCogZWlndmVjdCA9IGdzbF9tYXRyaXhfYWxsb2MoY292TWF0LnJvd3MoKSwgY292TWF0LmNvbHMoKSk7CisgICAgZ3NsX3ZlY3RvciogZWlndmFsID0gZ3NsX3ZlY3Rvcl9hbGxvYyhjb3ZNYXQucm93cygpKTsKICAgICBnc2xfZWlnZW5fc3ltbXZfd29ya3NwYWNlKiBlaXN5bW0gPSBnc2xfZWlnZW5fc3ltbXZfYWxsb2MoY292TWF0LnJvd3MoKSk7Ci0gICAgCi0gICAgZ3NsX21hdHJpeF9jb21wbGV4KiBlaWd2ZWN0eiA9IGdzbF9tYXRyaXhfY29tcGxleF9hbGxvYyhjb3ZNYXQucm93cygpLGNvdk1hdC5jb2xzKCkpOwotICAgIGdzbF92ZWN0b3JfY29tcGxleCogZWlndmFseiAgPSBnc2xfdmVjdG9yX2NvbXBsZXhfYWxsb2MoY292TWF0LnJvd3MoKSk7CisKKyAgICBnc2xfbWF0cml4X2NvbXBsZXgqIGVpZ3ZlY3R6ID0gZ3NsX21hdHJpeF9jb21wbGV4X2FsbG9jKGNvdk1hdC5yb3dzKCksIGNvdk1hdC5jb2xzKCkpOworICAgIGdzbF92ZWN0b3JfY29tcGxleCogZWlndmFseiA9IGdzbF92ZWN0b3JfY29tcGxleF9hbGxvYyhjb3ZNYXQucm93cygpKTsKICAgICBnc2xfZWlnZW5fbm9uc3ltbXZfd29ya3NwYWNlKiBlaW5vbnN5bW0gPSBnc2xfZWlnZW5fbm9uc3ltbXZfYWxsb2MoY292TWF0LnJvd3MoKSk7Ci0gICAgCisKICAgICBlaVRvR3NsKGNvdk1hdCwgJmdzbENvdk1hdCk7Ci0gICAgZm9yIChpbnQgdD0wOyB0PFRSSUVTOyArK3QpCi0gICAgeworICAgIGZvciAoaW50IHQgPSAwOyB0IDwgVFJJRVM7ICsrdCkgewogICAgICAgdGltZXJTYS5zdGFydCgpOwotICAgICAgZm9yIChpbnQgaz0wOyBrPHNhUmVwZWF0czsgKytrKQotICAgICAgewotICAgICAgICBnc2xfbWF0cml4X21lbWNweShnc2xDb3B5LGdzbENvdk1hdCk7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNhUmVwZWF0czsgKytrKSB7CisgICAgICAgIGdzbF9tYXRyaXhfbWVtY3B5KGdzbENvcHksIGdzbENvdk1hdCk7CiAgICAgICAgIGdzbF9laWdlbl9zeW1tdihnc2xDb3B5LCBlaWd2YWwsIGVpZ3ZlY3QsIGVpc3ltbSk7Ci0gICAgICAgIGFjYyArPSBnc2xfbWF0cml4X2dldChlaWd2ZWN0LHIsYyk7CisgICAgICAgIGFjYyArPSBnc2xfbWF0cml4X2dldChlaWd2ZWN0LCByLCBjKTsKICAgICAgIH0KICAgICAgIHRpbWVyU2Euc3RvcCgpOwogICAgIH0KLSAgICBmb3IgKGludCB0PTA7IHQ8VFJJRVM7ICsrdCkKLSAgICB7CisgICAgZm9yIChpbnQgdCA9IDA7IHQgPCBUUklFUzsgKyt0KSB7CiAgICAgICB0aW1lclN0ZC5zdGFydCgpOwotICAgICAgZm9yIChpbnQgaz0wOyBrPHN0ZFJlcGVhdHM7ICsraykKLSAgICAgIHsKLSAgICAgICAgZ3NsX21hdHJpeF9tZW1jcHkoZ3NsQ29weSxnc2xDb3ZNYXQpOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzdGRSZXBlYXRzOyArK2spIHsKKyAgICAgICAgZ3NsX21hdHJpeF9tZW1jcHkoZ3NsQ29weSwgZ3NsQ292TWF0KTsKICAgICAgICAgZ3NsX2VpZ2VuX25vbnN5bW12KGdzbENvcHksIGVpZ3ZhbHosIGVpZ3ZlY3R6LCBlaW5vbnN5bW0pOwotICAgICAgICBhY2MgKz0gR1NMX1JFQUwoZ3NsX21hdHJpeF9jb21wbGV4X2dldChlaWd2ZWN0eixyLGMpKTsKKyAgICAgICAgYWNjICs9IEdTTF9SRUFMKGdzbF9tYXRyaXhfY29tcGxleF9nZXQoZWlndmVjdHosIHIsIGMpKTsKICAgICAgIH0KICAgICAgIHRpbWVyU3RkLnN0b3AoKTsKICAgICB9CiAKLSAgICBzdGQ6OmNvdXQgPDwgIiB8IFx0IgotICAgICAgICAgICAgICA8PCB0aW1lclNhLnZhbHVlKCkgKiBSRVBFQVQgLyBzYVJlcGVhdHMgPDwgInMgXHQiCi0gICAgICAgICAgICAgIDw8IHRpbWVyU3RkLnZhbHVlKCkgKiBSRVBFQVQgLyBzdGRSZXBlYXRzIDw8ICJzIjsKKyAgICBzdGQ6OmNvdXQgPDwgIiB8IFx0IiA8PCB0aW1lclNhLnZhbHVlKCkgKiBSRVBFQVQgLyBzYVJlcGVhdHMgPDwgInMgXHQiIDw8IHRpbWVyU3RkLnZhbHVlKCkgKiBSRVBFQVQgLyBzdGRSZXBlYXRzCisgICAgICAgICAgICAgIDw8ICJzIjsKIAogICAgIGdzbF9tYXRyaXhfZnJlZShnc2xDb3ZNYXQpOwogICAgIGdzbF92ZWN0b3JfZnJlZShnc2xDb3B5KTsKQEAgLTE3NywzNiArMTYxLDMyIEBACiAgICAgZ3NsX2VpZ2VuX3N5bW12X2ZyZWUoZWlzeW1tKTsKICAgICBnc2xfZWlnZW5fbm9uc3ltbXZfZnJlZShlaW5vbnN5bW0pOwogICB9Ci0gICNlbmRpZgorI2VuZGlmCiAKICAgc3RkOjpjb3V0IDw8ICJcbiI7Ci0gIAorCiAgIC8vIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgb3B0aW1pemUgdG9vIG11Y2gKLSAgaWYgKGFjYz09MTIzKQotICAgIHN0ZDo6Y291dCA8PCBhY2M7CisgIGlmIChhY2MgPT0gMTIzKSBzdGQ6OmNvdXQgPDwgYWNjOwogfQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQotewotICBjb25zdCBpbnQgZHluc2l6ZXNbXSA9IHs0LDYsOCwxMiwxNiwyNCwzMiw2NCwxMjgsMjU2LDUxMiwwfTsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgY29uc3QgaW50IGR5bnNpemVzW10gPSB7NCwgNiwgOCwgMTIsIDE2LCAyNCwgMzIsIDY0LCAxMjgsIDI1NiwgNTEyLCAwfTsKICAgc3RkOjpjb3V0IDw8ICJzaXplICAgICAgICAgICAgc2VsZmFkam9pbnQgICAgICAgZ2VuZXJpYyI7Ci0gICNpZmRlZiBCRU5DSF9HTU0KKyNpZmRlZiBCRU5DSF9HTU0KICAgc3RkOjpjb3V0IDw8ICIgICAgICAgIEdNTSsrICAgICAgICAgICI7Ci0gICNlbmRpZgotICAjaWZkZWYgQkVOQ0hfR1NMCisjZW5kaWYKKyNpZmRlZiBCRU5DSF9HU0wKICAgc3RkOjpjb3V0IDw8ICIgICAgICAgR1NMIChkb3VibGUgKyBBVExBUykgICI7Ci0gICNlbmRpZgorI2VuZGlmCiAgIHN0ZDo6Y291dCA8PCAiXG4iOwotICBmb3IgKHVpbnQgaT0wOyBkeW5zaXplc1tpXT4wOyArK2kpCi0gICAgYmVuY2hFaWdlblNvbHZlcihNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4oZHluc2l6ZXNbaV0sZHluc2l6ZXNbaV0pKTsKKyAgZm9yICh1aW50IGkgPSAwOyBkeW5zaXplc1tpXSA+IDA7ICsraSkgYmVuY2hFaWdlblNvbHZlcihNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPihkeW5zaXplc1tpXSwgZHluc2l6ZXNbaV0pKTsKIAotICBiZW5jaEVpZ2VuU29sdmVyKE1hdHJpeDxTY2FsYXIsMiwyPigpKTsKLSAgYmVuY2hFaWdlblNvbHZlcihNYXRyaXg8U2NhbGFyLDMsMz4oKSk7Ci0gIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciw0LDQ+KCkpOwotICBiZW5jaEVpZ2VuU29sdmVyKE1hdHJpeDxTY2FsYXIsNiw2PigpKTsKLSAgYmVuY2hFaWdlblNvbHZlcihNYXRyaXg8U2NhbGFyLDgsOD4oKSk7Ci0gIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciwxMiwxMj4oKSk7Ci0gIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciwxNiwxNj4oKSk7CisgIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciwgMiwgMj4oKSk7CisgIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciwgMywgMz4oKSk7CisgIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciwgNCwgND4oKSk7CisgIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciwgNiwgNj4oKSk7CisgIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciwgOCwgOD4oKSk7CisgIGJlbmNoRWlnZW5Tb2x2ZXIoTWF0cml4PFNjYWxhciwgMTIsIDEyPigpKTsKKyAgYmVuY2hFaWdlblNvbHZlcihNYXRyaXg8U2NhbGFyLCAxNiwgMTY+KCkpOwogICByZXR1cm4gMDsKIH0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2hGRlQuY3BwIGIvYmVuY2gvYmVuY2hGRlQuY3BwCmluZGV4IDNlYjFhMWEuLjNjMzNlNzcgMTAwNjQ0Ci0tLSBhL2JlbmNoL2JlbmNoRkZULmNwcAorKysgYi9iZW5jaC9iZW5jaEZGVC5jcHAKQEAgLTE5LDEzICsxOSwyMSBAQAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cmluZyBuYW1lb2YoKTsKIAotdGVtcGxhdGUgPD4gc3RyaW5nIG5hbWVvZjxmbG9hdD4oKSB7cmV0dXJuICJmbG9hdCI7fQotdGVtcGxhdGUgPD4gc3RyaW5nIG5hbWVvZjxkb3VibGU+KCkge3JldHVybiAiZG91YmxlIjt9Ci10ZW1wbGF0ZSA8PiBzdHJpbmcgbmFtZW9mPGxvbmcgZG91YmxlPigpIHtyZXR1cm4gImxvbmcgZG91YmxlIjt9Cit0ZW1wbGF0ZSA8Pgorc3RyaW5nIG5hbWVvZjxmbG9hdD4oKSB7CisgIHJldHVybiAiZmxvYXQiOworfQordGVtcGxhdGUgPD4KK3N0cmluZyBuYW1lb2Y8ZG91YmxlPigpIHsKKyAgcmV0dXJuICJkb3VibGUiOworfQordGVtcGxhdGUgPD4KK3N0cmluZyBuYW1lb2Y8bG9uZyBkb3VibGU+KCkgeworICByZXR1cm4gImxvbmcgZG91YmxlIjsKK30KIAogI2lmbmRlZiBUWVBFCiAjZGVmaW5lIFRZUEUgZmxvYXQKQEAgLTQxLDc1ICs0OSw2OSBAQAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgYmVuY2goaW50IG5mZnQsYm9vbCBmd2QsYm9vbCB1bnNjYWxlZD1mYWxzZSwgYm9vbCBoYWxmc3BlYz1mYWxzZSkKLXsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbCBTY2FsYXI7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbXBsZXg8U2NhbGFyPiBDb21wbGV4OwotICAgIGludCBuaXRzID0gTkRBVEEvbmZmdDsKLSAgICB2ZWN0b3I8VD4gaW5idWYobmZmdCk7Ci0gICAgdmVjdG9yPENvbXBsZXggPiBvdXRidWYobmZmdCk7Ci0gICAgRkZUPCBTY2FsYXIgPiBmZnQ7Cit2b2lkIGJlbmNoKGludCBuZmZ0LCBib29sIGZ3ZCwgYm9vbCB1bnNjYWxlZCA9IGZhbHNlLCBib29sIGhhbGZzcGVjID0gZmFsc2UpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8VD46OlJlYWwgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29tcGxleDxTY2FsYXI+IENvbXBsZXg7CisgIGludCBuaXRzID0gTkRBVEEgLyBuZmZ0OworICB2ZWN0b3I8VD4gaW5idWYobmZmdCk7CisgIHZlY3RvcjxDb21wbGV4PiBvdXRidWYobmZmdCk7CisgIEZGVDxTY2FsYXI+IGZmdDsKIAotICAgIGlmICh1bnNjYWxlZCkgewotICAgICAgICBmZnQuU2V0RmxhZyhmZnQuVW5zY2FsZWQpOwotICAgICAgICBjb3V0IDw8ICJ1bnNjYWxlZCAiOwotICAgIH0KLSAgICBpZiAoaGFsZnNwZWMpIHsKLSAgICAgICAgZmZ0LlNldEZsYWcoZmZ0LkhhbGZTcGVjdHJ1bSk7Ci0gICAgICAgIGNvdXQgPDwgImhhbGZzcGVjICI7Ci0gICAgfQorICBpZiAodW5zY2FsZWQpIHsKKyAgICBmZnQuU2V0RmxhZyhmZnQuVW5zY2FsZWQpOworICAgIGNvdXQgPDwgInVuc2NhbGVkICI7CisgIH0KKyAgaWYgKGhhbGZzcGVjKSB7CisgICAgZmZ0LlNldEZsYWcoZmZ0LkhhbGZTcGVjdHJ1bSk7CisgICAgY291dCA8PCAiaGFsZnNwZWMgIjsKKyAgfQogCisgIHN0ZDo6ZmlsbChpbmJ1Zi5iZWdpbigpLCBpbmJ1Zi5lbmQoKSwgMCk7CisgIGZmdC5md2Qob3V0YnVmLCBpbmJ1Zik7CiAKLSAgICBzdGQ6OmZpbGwoaW5idWYuYmVnaW4oKSxpbmJ1Zi5lbmQoKSwwKTsKLSAgICBmZnQuZndkKCBvdXRidWYgLCBpbmJ1Zik7Ci0KLSAgICBCZW5jaFRpbWVyIHRpbWVyOwotICAgIHRpbWVyLnJlc2V0KCk7Ci0gICAgZm9yIChpbnQgaz0wO2s8ODsrK2spIHsKLSAgICAgICAgdGltZXIuc3RhcnQoKTsKLSAgICAgICAgaWYgKGZ3ZCkKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuaXRzOyBpKyspCi0gICAgICAgICAgICAgICAgZmZ0LmZ3ZCggb3V0YnVmICwgaW5idWYpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbml0czsgaSsrKQotICAgICAgICAgICAgICAgIGZmdC5pbnYoaW5idWYsb3V0YnVmKTsKLSAgICAgICAgdGltZXIuc3RvcCgpOwotICAgIH0KLQotICAgIGNvdXQgPDwgbmFtZW9mPFNjYWxhcj4oKSA8PCAiICI7Ci0gICAgZG91YmxlIG1mbG9wcyA9IDUuKm5mZnQqbG9nMigoZG91YmxlKW5mZnQpIC8gKDFlNiAqIHRpbWVyLnZhbHVlKCkgLyAoZG91YmxlKW5pdHMgKTsKLSAgICBpZiAoIE51bVRyYWl0czxUPjo6SXNDb21wbGV4ICkgewotICAgICAgICBjb3V0IDw8ICJjb21wbGV4IjsKLSAgICB9ZWxzZXsKLSAgICAgICAgY291dCA8PCAicmVhbCAgICI7Ci0gICAgICAgIG1mbG9wcyAvPSAyOwotICAgIH0KLQotCisgIEJlbmNoVGltZXIgdGltZXI7CisgIHRpbWVyLnJlc2V0KCk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgODsgKytrKSB7CisgICAgdGltZXIuc3RhcnQoKTsKICAgICBpZiAoZndkKQotICAgICAgICBjb3V0IDw8ICIgZndkIjsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbml0czsgaSsrKSBmZnQuZndkKG91dGJ1ZiwgaW5idWYpOwogICAgIGVsc2UKLSAgICAgICAgY291dCA8PCAiIGludiI7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5pdHM7IGkrKykgZmZ0LmludihpbmJ1Ziwgb3V0YnVmKTsKKyAgICB0aW1lci5zdG9wKCk7CisgIH0KIAotICAgIGNvdXQgPDwgIiBORkZUPSIgPDwgbmZmdCA8PCAiICAiIDw8IChkb3VibGUoMWUtNipuZmZ0Km5pdHMpL3RpbWVyLnZhbHVlKCkpIDw8ICIgTVMvcyAgIiA8PCBtZmxvcHMgPDwgIk1GTE9QU1xuIjsKKyAgY291dCA8PCBuYW1lb2Y8U2NhbGFyPigpIDw8ICIgIjsKKyAgZG91YmxlIG1mbG9wcyA9IDUuICogbmZmdCAqIGxvZzIoKGRvdWJsZSluZmZ0KSAvICgxZTYgKiB0aW1lci52YWx1ZSgpIC8gKGRvdWJsZSluaXRzKTsKKyAgaWYgKE51bVRyYWl0czxUPjo6SXNDb21wbGV4KSB7CisgICAgY291dCA8PCAiY29tcGxleCI7CisgIH0gZWxzZSB7CisgICAgY291dCA8PCAicmVhbCAgICI7CisgICAgbWZsb3BzIC89IDI7CisgIH0KKworICBpZiAoZndkKQorICAgIGNvdXQgPDwgIiBmd2QiOworICBlbHNlCisgICAgY291dCA8PCAiIGludiI7CisKKyAgY291dCA8PCAiIE5GRlQ9IiA8PCBuZmZ0IDw8ICIgICIgPDwgKGRvdWJsZSgxZS02ICogbmZmdCAqIG5pdHMpIC8gdGltZXIudmFsdWUoKSkgPDwgIiBNUy9zICAiIDw8IG1mbG9wcyA8PCAiTUZMT1BTXG4iOwogfQogCi1pbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqIGFyZ3YpCi17Ci0gICAgYmVuY2g8Y29tcGxleDxmbG9hdD4gPihORkZULHRydWUpOwotICAgIGJlbmNoPGNvbXBsZXg8ZmxvYXQ+ID4oTkZGVCxmYWxzZSk7Ci0gICAgYmVuY2g8ZmxvYXQ+KE5GRlQsdHJ1ZSk7Ci0gICAgYmVuY2g8ZmxvYXQ+KE5GRlQsZmFsc2UpOwotICAgIGJlbmNoPGZsb2F0PihORkZULGZhbHNlLHRydWUpOwotICAgIGJlbmNoPGZsb2F0PihORkZULGZhbHNlLHRydWUsdHJ1ZSk7CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgYmVuY2g8Y29tcGxleDxmbG9hdD4gPihORkZULCB0cnVlKTsKKyAgYmVuY2g8Y29tcGxleDxmbG9hdD4gPihORkZULCBmYWxzZSk7CisgIGJlbmNoPGZsb2F0PihORkZULCB0cnVlKTsKKyAgYmVuY2g8ZmxvYXQ+KE5GRlQsIGZhbHNlKTsKKyAgYmVuY2g8ZmxvYXQ+KE5GRlQsIGZhbHNlLCB0cnVlKTsKKyAgYmVuY2g8ZmxvYXQ+KE5GRlQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKIAotICAgIGJlbmNoPGNvbXBsZXg8ZG91YmxlPiA+KE5GRlQsdHJ1ZSk7Ci0gICAgYmVuY2g8Y29tcGxleDxkb3VibGU+ID4oTkZGVCxmYWxzZSk7Ci0gICAgYmVuY2g8ZG91YmxlPihORkZULHRydWUpOwotICAgIGJlbmNoPGRvdWJsZT4oTkZGVCxmYWxzZSk7Ci0gICAgYmVuY2g8Y29tcGxleDxsb25nIGRvdWJsZT4gPihORkZULHRydWUpOwotICAgIGJlbmNoPGNvbXBsZXg8bG9uZyBkb3VibGU+ID4oTkZGVCxmYWxzZSk7Ci0gICAgYmVuY2g8bG9uZyBkb3VibGU+KE5GRlQsdHJ1ZSk7Ci0gICAgYmVuY2g8bG9uZyBkb3VibGU+KE5GRlQsZmFsc2UpOwotICAgIHJldHVybiAwOworICBiZW5jaDxjb21wbGV4PGRvdWJsZT4gPihORkZULCB0cnVlKTsKKyAgYmVuY2g8Y29tcGxleDxkb3VibGU+ID4oTkZGVCwgZmFsc2UpOworICBiZW5jaDxkb3VibGU+KE5GRlQsIHRydWUpOworICBiZW5jaDxkb3VibGU+KE5GRlQsIGZhbHNlKTsKKyAgYmVuY2g8Y29tcGxleDxsb25nIGRvdWJsZT4gPihORkZULCB0cnVlKTsKKyAgYmVuY2g8Y29tcGxleDxsb25nIGRvdWJsZT4gPihORkZULCBmYWxzZSk7CisgIGJlbmNoPGxvbmcgZG91YmxlPihORkZULCB0cnVlKTsKKyAgYmVuY2g8bG9uZyBkb3VibGU+KE5GRlQsIGZhbHNlKTsKKyAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaEdlb21ldHJ5LmNwcCBiL2JlbmNoL2JlbmNoR2VvbWV0cnkuY3BwCmluZGV4IDZlMTZjMDMuLjY3YzE2YTkgMTAwNjQ0Ci0tLSBhL2JlbmNoL2JlbmNoR2VvbWV0cnkuY3BwCisrKyBiL2JlbmNoL2JlbmNoR2VvbWV0cnkuY3BwCkBAIC0xMSwxMjQgKzExLDExMCBAQAogI2RlZmluZSBSRVBFQVQgMTAwMDAwMAogI2VuZGlmCiAKLWVudW0gZnVuY19vcHQKLXsKLSAgICBUViwKLSAgICBUTUFUViwKLSAgICBUTUFUVk1BVCwKK2VudW0gZnVuY19vcHQgeworICBUViwKKyAgVE1BVFYsCisgIFRNQVRWTUFULAogfTsKIAotCiB0ZW1wbGF0ZSA8Y2xhc3MgcmVzLCBjbGFzcyBhcmcxLCBjbGFzcyBhcmcyLCBpbnQgb3B0Pgogc3RydWN0IGZ1bmM7CiAKIHRlbXBsYXRlIDxjbGFzcyByZXMsIGNsYXNzIGFyZzEsIGNsYXNzIGFyZzI+Ci1zdHJ1Y3QgZnVuYzxyZXMsIGFyZzEsIGFyZzIsIFRWPgotewotICAgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSByZXMgcnVuKCBhcmcxJiBhMSwgYXJnMiYgYTIgKQotICAgIHsKLQlhc20gKCIiKTsKLQlyZXR1cm4gYTEgKiBhMjsKLSAgICB9CitzdHJ1Y3QgZnVuYzxyZXMsIGFyZzEsIGFyZzIsIFRWPiB7CisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSByZXMgcnVuKGFyZzEmIGExLCBhcmcyJiBhMikgeworICAgIGFzbSgiIik7CisgICAgcmV0dXJuIGExICogYTI7CisgIH0KIH07CiAKIHRlbXBsYXRlIDxjbGFzcyByZXMsIGNsYXNzIGFyZzEsIGNsYXNzIGFyZzI+Ci1zdHJ1Y3QgZnVuYzxyZXMsIGFyZzEsIGFyZzIsIFRNQVRWPgotewotICAgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSByZXMgcnVuKCBhcmcxJiBhMSwgYXJnMiYgYTIgKQotICAgIHsKLQlhc20gKCIiKTsKLQlyZXR1cm4gYTEubWF0cml4KCkgKiBhMjsKLSAgICB9CitzdHJ1Y3QgZnVuYzxyZXMsIGFyZzEsIGFyZzIsIFRNQVRWPiB7CisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSByZXMgcnVuKGFyZzEmIGExLCBhcmcyJiBhMikgeworICAgIGFzbSgiIik7CisgICAgcmV0dXJuIGExLm1hdHJpeCgpICogYTI7CisgIH0KIH07CiAKIHRlbXBsYXRlIDxjbGFzcyByZXMsIGNsYXNzIGFyZzEsIGNsYXNzIGFyZzI+Ci1zdHJ1Y3QgZnVuYzxyZXMsIGFyZzEsIGFyZzIsIFRNQVRWTUFUPgotewotICAgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSByZXMgcnVuKCBhcmcxJiBhMSwgYXJnMiYgYTIgKQotICAgIHsKLQlhc20gKCIiKTsKLQlyZXR1cm4gcmVzKGExLm1hdHJpeCgpICogYTIubWF0cml4KCkpOwotICAgIH0KK3N0cnVjdCBmdW5jPHJlcywgYXJnMSwgYXJnMiwgVE1BVFZNQVQ+IHsKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHJlcyBydW4oYXJnMSYgYTEsIGFyZzImIGEyKSB7CisgICAgYXNtKCIiKTsKKyAgICByZXR1cm4gcmVzKGExLm1hdHJpeCgpICogYTIubWF0cml4KCkpOworICB9CiB9OwogCiB0ZW1wbGF0ZSA8Y2xhc3MgZnVuYywgY2xhc3MgYXJnMSwgY2xhc3MgYXJnMj4KLXN0cnVjdCB0ZXN0X3RyYW5zZm9ybQotewotICAgIHN0YXRpYyB2b2lkIHJ1bigpCi0gICAgewotCWFyZzEgYTE7Ci0JYTEuc2V0SWRlbnRpdHkoKTsKLQlhcmcyIGEyOwotCWEyLnNldElkZW50aXR5KCk7CitzdHJ1Y3QgdGVzdF90cmFuc2Zvcm0geworICBzdGF0aWMgdm9pZCBydW4oKSB7CisgICAgYXJnMSBhMTsKKyAgICBhMS5zZXRJZGVudGl0eSgpOworICAgIGFyZzIgYTI7CisgICAgYTIuc2V0SWRlbnRpdHkoKTsKIAotCUJlbmNoVGltZXIgdGltZXI7Ci0JdGltZXIucmVzZXQoKTsKLQlmb3IgKGludCBrPTA7IGs8MTA7ICsraykKLQl7Ci0JICAgIHRpbWVyLnN0YXJ0KCk7Ci0JICAgIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykKLQkJYTIgPSBmdW5jOjpydW4oIGExLCBhMiApOwotCSAgICB0aW1lci5zdG9wKCk7Ci0JfQotCWNvdXQgPDwgc2V0cHJlY2lzaW9uKDQpIDw8IGZpeGVkIDw8IHRpbWVyLnZhbHVlKCkgPDwgInMgICIgPDwgZW5kbDs7CisgICAgQmVuY2hUaW1lciB0aW1lcjsKKyAgICB0aW1lci5yZXNldCgpOworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMTA7ICsraykgeworICAgICAgdGltZXIuc3RhcnQoKTsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgUkVQRUFUOyArK2spIGEyID0gZnVuYzo6cnVuKGExLCBhMik7CisgICAgICB0aW1lci5zdG9wKCk7CiAgICAgfQorICAgIGNvdXQgPDwgc2V0cHJlY2lzaW9uKDQpIDw8IGZpeGVkIDw8IHRpbWVyLnZhbHVlKCkgPDwgInMgICIgPDwgZW5kbDsKKyAgICA7CisgIH0KIH07CiAKKyNkZWZpbmUgcnVuX3ZlYyhvcCwgc2NhbGFyLCBtb2RlLCBvcHRpb24sIHZzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGQ6OmNvdXQgPDwgI3NjYWxhciA8PCAiXHQgIiA8PCAjbW9kZSA8PCAiXHQgIiA8PCAjb3B0aW9uIDw8ICIgIiA8PCAjdnNpemUgIiAiOyBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIFRyYW5zZm9ybTxzY2FsYXIsIDMsIG1vZGUsIG9wdGlvbj4gVHJhbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgTWF0cml4PHNjYWxhciwgdnNpemUsIDEsIG9wdGlvbj4gVmVjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiBmdW5jPFZlYywgVHJhbnMsIFZlYywgb3A+IEZ1bmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0X3RyYW5zZm9ybTxGdW5jLCBUcmFucywgVmVjPjo6cnVuKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKLSNkZWZpbmUgcnVuX3ZlYyggb3AsIHNjYWxhciwgbW9kZSwgb3B0aW9uLCB2c2l6ZSApIFwKLSAgICBzdGQ6OmNvdXQgPDwgI3NjYWxhciA8PCAiXHQgIiA8PCAjbW9kZSA8PCAiXHQgIiA8PCAjb3B0aW9uIDw8ICIgIiA8PCAjdnNpemUgIiAiOyBcCi0gICAge1wKLQl0eXBlZGVmIFRyYW5zZm9ybTxzY2FsYXIsIDMsIG1vZGUsIG9wdGlvbj4gVHJhbnM7XAotCXR5cGVkZWYgTWF0cml4PHNjYWxhciwgdnNpemUsIDEsIG9wdGlvbj4gVmVjO1wKLQl0eXBlZGVmIGZ1bmM8VmVjLFRyYW5zLFZlYyxvcD4gRnVuYztcCi0JdGVzdF90cmFuc2Zvcm08IEZ1bmMsIFRyYW5zLCBWZWMgPjo6cnVuKCk7XAotICAgIH0KKyNkZWZpbmUgcnVuX3RyYW5zKG9wLCBzY2FsYXIsIG1vZGUsIG9wdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGQ6OmNvdXQgPDwgI3NjYWxhciA8PCAiXHQgIiA8PCAjbW9kZSA8PCAiXHQgIiA8PCAjb3B0aW9uIDw8ICIgICAiOyBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIFRyYW5zZm9ybTxzY2FsYXIsIDMsIG1vZGUsIG9wdGlvbj4gVHJhbnM7ICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgZnVuYzxUcmFucywgVHJhbnMsIFRyYW5zLCBvcD4gRnVuYzsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVzdF90cmFuc2Zvcm08RnVuYywgVHJhbnMsIFRyYW5zPjo6cnVuKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCi0jZGVmaW5lIHJ1bl90cmFucyggb3AsIHNjYWxhciwgbW9kZSwgb3B0aW9uICkgXAotICAgIHN0ZDo6Y291dCA8PCAjc2NhbGFyIDw8ICJcdCAiIDw8ICNtb2RlIDw8ICJcdCAiIDw8ICNvcHRpb24gPDwgIiAgICI7IFwKLSAgICB7XAotCXR5cGVkZWYgVHJhbnNmb3JtPHNjYWxhciwgMywgbW9kZSwgb3B0aW9uPiBUcmFucztcCi0JdHlwZWRlZiBmdW5jPFRyYW5zLFRyYW5zLFRyYW5zLG9wPiBGdW5jO1wKLQl0ZXN0X3RyYW5zZm9ybTwgRnVuYywgVHJhbnMsIFRyYW5zID46OnJ1bigpO1wKLSAgICB9CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIGNvdXQgPDwgInZlYyA9IHRyYW5zICogdmVjIiA8PCBlbmRsOworICBydW5fdmVjKFRWLCBmbG9hdCwgSXNvbWV0cnksIEF1dG9BbGlnbiwgMyk7CisgIHJ1bl92ZWMoVFYsIGZsb2F0LCBJc29tZXRyeSwgRG9udEFsaWduLCAzKTsKKyAgcnVuX3ZlYyhUViwgZmxvYXQsIElzb21ldHJ5LCBBdXRvQWxpZ24sIDQpOworICBydW5fdmVjKFRWLCBmbG9hdCwgSXNvbWV0cnksIERvbnRBbGlnbiwgNCk7CisgIHJ1bl92ZWMoVFYsIGZsb2F0LCBQcm9qZWN0aXZlLCBBdXRvQWxpZ24sIDQpOworICBydW5fdmVjKFRWLCBmbG9hdCwgUHJvamVjdGl2ZSwgRG9udEFsaWduLCA0KTsKKyAgcnVuX3ZlYyhUViwgZG91YmxlLCBJc29tZXRyeSwgQXV0b0FsaWduLCAzKTsKKyAgcnVuX3ZlYyhUViwgZG91YmxlLCBJc29tZXRyeSwgRG9udEFsaWduLCAzKTsKKyAgcnVuX3ZlYyhUViwgZG91YmxlLCBJc29tZXRyeSwgQXV0b0FsaWduLCA0KTsKKyAgcnVuX3ZlYyhUViwgZG91YmxlLCBJc29tZXRyeSwgRG9udEFsaWduLCA0KTsKKyAgcnVuX3ZlYyhUViwgZG91YmxlLCBQcm9qZWN0aXZlLCBBdXRvQWxpZ24sIDQpOworICBydW5fdmVjKFRWLCBkb3VibGUsIFByb2plY3RpdmUsIERvbnRBbGlnbiwgNCk7CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCi17Ci0gICAgY291dCA8PCAidmVjID0gdHJhbnMgKiB2ZWMiIDw8IGVuZGw7Ci0gICAgcnVuX3ZlYyhUViwgZmxvYXQsICBJc29tZXRyeSwgQXV0b0FsaWduLCAzKTsKLSAgICBydW5fdmVjKFRWLCBmbG9hdCwgIElzb21ldHJ5LCBEb250QWxpZ24sIDMpOwotICAgIHJ1bl92ZWMoVFYsIGZsb2F0LCAgSXNvbWV0cnksIEF1dG9BbGlnbiwgNCk7Ci0gICAgcnVuX3ZlYyhUViwgZmxvYXQsICBJc29tZXRyeSwgRG9udEFsaWduLCA0KTsKLSAgICBydW5fdmVjKFRWLCBmbG9hdCwgIFByb2plY3RpdmUsIEF1dG9BbGlnbiwgNCk7Ci0gICAgcnVuX3ZlYyhUViwgZmxvYXQsICBQcm9qZWN0aXZlLCBEb250QWxpZ24sIDQpOwotICAgIHJ1bl92ZWMoVFYsIGRvdWJsZSwgSXNvbWV0cnksIEF1dG9BbGlnbiwgMyk7Ci0gICAgcnVuX3ZlYyhUViwgZG91YmxlLCBJc29tZXRyeSwgRG9udEFsaWduLCAzKTsKLSAgICBydW5fdmVjKFRWLCBkb3VibGUsIElzb21ldHJ5LCBBdXRvQWxpZ24sIDQpOwotICAgIHJ1bl92ZWMoVFYsIGRvdWJsZSwgSXNvbWV0cnksIERvbnRBbGlnbiwgNCk7Ci0gICAgcnVuX3ZlYyhUViwgZG91YmxlLCBQcm9qZWN0aXZlLCBBdXRvQWxpZ24sIDQpOwotICAgIHJ1bl92ZWMoVFYsIGRvdWJsZSwgUHJvamVjdGl2ZSwgRG9udEFsaWduLCA0KTsKKyAgY291dCA8PCAidmVjID0gdHJhbnMubWF0cml4KCkgKiB2ZWMiIDw8IGVuZGw7CisgIHJ1bl92ZWMoVE1BVFYsIGZsb2F0LCBJc29tZXRyeSwgQXV0b0FsaWduLCA0KTsKKyAgcnVuX3ZlYyhUTUFUViwgZmxvYXQsIElzb21ldHJ5LCBEb250QWxpZ24sIDQpOworICBydW5fdmVjKFRNQVRWLCBkb3VibGUsIElzb21ldHJ5LCBBdXRvQWxpZ24sIDQpOworICBydW5fdmVjKFRNQVRWLCBkb3VibGUsIElzb21ldHJ5LCBEb250QWxpZ24sIDQpOwogCi0gICAgY291dCA8PCAidmVjID0gdHJhbnMubWF0cml4KCkgKiB2ZWMiIDw8IGVuZGw7Ci0gICAgcnVuX3ZlYyhUTUFUViwgZmxvYXQsICBJc29tZXRyeSwgQXV0b0FsaWduLCA0KTsKLSAgICBydW5fdmVjKFRNQVRWLCBmbG9hdCwgIElzb21ldHJ5LCBEb250QWxpZ24sIDQpOwotICAgIHJ1bl92ZWMoVE1BVFYsIGRvdWJsZSwgSXNvbWV0cnksIEF1dG9BbGlnbiwgNCk7Ci0gICAgcnVuX3ZlYyhUTUFUViwgZG91YmxlLCBJc29tZXRyeSwgRG9udEFsaWduLCA0KTsKKyAgY291dCA8PCAidHJhbnMgPSB0cmFuczEgKiB0cmFucyIgPDwgZW5kbDsKKyAgcnVuX3RyYW5zKFRWLCBmbG9hdCwgSXNvbWV0cnksIEF1dG9BbGlnbik7CisgIHJ1bl90cmFucyhUViwgZmxvYXQsIElzb21ldHJ5LCBEb250QWxpZ24pOworICBydW5fdHJhbnMoVFYsIGRvdWJsZSwgSXNvbWV0cnksIEF1dG9BbGlnbik7CisgIHJ1bl90cmFucyhUViwgZG91YmxlLCBJc29tZXRyeSwgRG9udEFsaWduKTsKKyAgcnVuX3RyYW5zKFRWLCBmbG9hdCwgUHJvamVjdGl2ZSwgQXV0b0FsaWduKTsKKyAgcnVuX3RyYW5zKFRWLCBmbG9hdCwgUHJvamVjdGl2ZSwgRG9udEFsaWduKTsKKyAgcnVuX3RyYW5zKFRWLCBkb3VibGUsIFByb2plY3RpdmUsIEF1dG9BbGlnbik7CisgIHJ1bl90cmFucyhUViwgZG91YmxlLCBQcm9qZWN0aXZlLCBEb250QWxpZ24pOwogCi0gICAgY291dCA8PCAidHJhbnMgPSB0cmFuczEgKiB0cmFucyIgPDwgZW5kbDsKLSAgICBydW5fdHJhbnMoVFYsIGZsb2F0LCAgSXNvbWV0cnksIEF1dG9BbGlnbik7Ci0gICAgcnVuX3RyYW5zKFRWLCBmbG9hdCwgIElzb21ldHJ5LCBEb250QWxpZ24pOwotICAgIHJ1bl90cmFucyhUViwgZG91YmxlLCBJc29tZXRyeSwgQXV0b0FsaWduKTsKLSAgICBydW5fdHJhbnMoVFYsIGRvdWJsZSwgSXNvbWV0cnksIERvbnRBbGlnbik7Ci0gICAgcnVuX3RyYW5zKFRWLCBmbG9hdCwgIFByb2plY3RpdmUsIEF1dG9BbGlnbik7Ci0gICAgcnVuX3RyYW5zKFRWLCBmbG9hdCwgIFByb2plY3RpdmUsIERvbnRBbGlnbik7Ci0gICAgcnVuX3RyYW5zKFRWLCBkb3VibGUsIFByb2plY3RpdmUsIEF1dG9BbGlnbik7Ci0gICAgcnVuX3RyYW5zKFRWLCBkb3VibGUsIFByb2plY3RpdmUsIERvbnRBbGlnbik7Ci0KLSAgICBjb3V0IDw8ICJ0cmFucyA9IHRyYW5zMS5tYXRyaXgoKSAqIHRyYW5zLm1hdHJpeCgpIiA8PCBlbmRsOwotICAgIHJ1bl90cmFucyhUTUFUVk1BVCwgZmxvYXQsICBJc29tZXRyeSwgQXV0b0FsaWduKTsKLSAgICBydW5fdHJhbnMoVE1BVFZNQVQsIGZsb2F0LCAgSXNvbWV0cnksIERvbnRBbGlnbik7Ci0gICAgcnVuX3RyYW5zKFRNQVRWTUFULCBkb3VibGUsIElzb21ldHJ5LCBBdXRvQWxpZ24pOwotICAgIHJ1bl90cmFucyhUTUFUVk1BVCwgZG91YmxlLCBJc29tZXRyeSwgRG9udEFsaWduKTsKKyAgY291dCA8PCAidHJhbnMgPSB0cmFuczEubWF0cml4KCkgKiB0cmFucy5tYXRyaXgoKSIgPDwgZW5kbDsKKyAgcnVuX3RyYW5zKFRNQVRWTUFULCBmbG9hdCwgSXNvbWV0cnksIEF1dG9BbGlnbik7CisgIHJ1bl90cmFucyhUTUFUVk1BVCwgZmxvYXQsIElzb21ldHJ5LCBEb250QWxpZ24pOworICBydW5fdHJhbnMoVE1BVFZNQVQsIGRvdWJsZSwgSXNvbWV0cnksIEF1dG9BbGlnbik7CisgIHJ1bl90cmFucyhUTUFUVk1BVCwgZG91YmxlLCBJc29tZXRyeSwgRG9udEFsaWduKTsKIH0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2hWZWNBZGQuY3BwIGIvYmVuY2gvYmVuY2hWZWNBZGQuY3BwCmluZGV4IGNlOGUxZTkuLjUwOWM2NDIgMTAwNjQ0Ci0tLSBhL2JlbmNoL2JlbmNoVmVjQWRkLmNwcAorKysgYi9iZW5jaC9iZW5jaFZlY0FkZC5jcHAKQEAgLTE0LDEyMiArMTQsMTE4IEBACiAKIHR5cGVkZWYgZmxvYXQgU2NhbGFyOwogCi1fX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSB2b2lkIGJlbmNoVmVjKFNjYWxhciogYSwgU2NhbGFyKiBiLCBTY2FsYXIqIGMsIGludCBzaXplKTsKLV9fYXR0cmlidXRlX18gKChub2lubGluZSkpIHZvaWQgYmVuY2hWZWMoTWF0cml4WGYmIGEsIE1hdHJpeFhmJiBiLCBNYXRyaXhYZiYgYyk7Ci1fX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKSB2b2lkIGJlbmNoVmVjKFZlY3RvclhmJiBhLCBWZWN0b3JYZiYgYiwgVmVjdG9yWGYmIGMpOworX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSB2b2lkIGJlbmNoVmVjKFNjYWxhciogYSwgU2NhbGFyKiBiLCBTY2FsYXIqIGMsIGludCBzaXplKTsKK19fYXR0cmlidXRlX18oKG5vaW5saW5lKSkgdm9pZCBiZW5jaFZlYyhNYXRyaXhYZiYgYSwgTWF0cml4WGYmIGIsIE1hdHJpeFhmJiBjKTsKK19fYXR0cmlidXRlX18oKG5vaW5saW5lKSkgdm9pZCBiZW5jaFZlYyhWZWN0b3JYZiYgYSwgVmVjdG9yWGYmIGIsIFZlY3RvclhmJiBjKTsKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKLXsKLSAgICBpbnQgc2l6ZSA9IFNJWkUgKiA4OwotICAgIGludCBzaXplMiA9IHNpemUgKiBzaXplOwotICAgIFNjYWxhciogYSA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KHNpemUyKTsKLSAgICBTY2FsYXIqIGIgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplMis0KSsxOwotICAgIFNjYWxhciogYyA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KHNpemUyKTsgCi0gICAgCi0gICAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKLSAgICB7Ci0gICAgICAgIGFbaV0gPSBiW2ldID0gY1tpXSA9IDA7Ci0gICAgfQotICAgIAotICAgIEJlbmNoVGltZXIgdGltZXI7Ci0gICAgCi0gICAgdGltZXIucmVzZXQoKTsKLSAgICBmb3IgKGludCBrPTA7IGs8MTA7ICsraykKLSAgICB7CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIGludCBzaXplID0gU0laRSAqIDg7CisgIGludCBzaXplMiA9IHNpemUgKiBzaXplOworICBTY2FsYXIqIGEgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplMik7CisgIFNjYWxhciogYiA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KHNpemUyICsgNCkgKyAxOworICBTY2FsYXIqIGMgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplMik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBhW2ldID0gYltpXSA9IGNbaV0gPSAwOworICB9CisKKyAgQmVuY2hUaW1lciB0aW1lcjsKKworICB0aW1lci5yZXNldCgpOworICBmb3IgKGludCBrID0gMDsgayA8IDEwOyArK2spIHsKKyAgICB0aW1lci5zdGFydCgpOworICAgIGJlbmNoVmVjKGEsIGIsIGMsIHNpemUyKTsKKyAgICB0aW1lci5zdG9wKCk7CisgIH0KKyAgc3RkOjpjb3V0IDw8IHRpbWVyLnZhbHVlKCkgPDwgInMgICIgPDwgKGRvdWJsZShzaXplMiAqIFJFUEVBVCkgLyB0aW1lci52YWx1ZSgpKSAvICgxMDI0LiAqIDEwMjQuICogMTAyNC4pCisgICAgICAgICAgICA8PCAiIEdGbG9wc1xuIjsKKyAgcmV0dXJuIDA7CisgIGZvciAoaW50IGlubmVyc2l6ZSA9IHNpemU7IGlubmVyc2l6ZSA+IDI7IC0taW5uZXJzaXplKSB7CisgICAgaWYgKHNpemUyICUgaW5uZXJzaXplID09IDApIHsKKyAgICAgIGludCBvdXRlcnNpemUgPSBzaXplMiAvIGlubmVyc2l6ZTsKKyAgICAgIE1hdHJpeFhmIG1hID0gTWFwPE1hdHJpeFhmPihhLCBpbm5lcnNpemUsIG91dGVyc2l6ZSk7CisgICAgICBNYXRyaXhYZiBtYiA9IE1hcDxNYXRyaXhYZj4oYiwgaW5uZXJzaXplLCBvdXRlcnNpemUpOworICAgICAgTWF0cml4WGYgbWMgPSBNYXA8TWF0cml4WGY+KGMsIGlubmVyc2l6ZSwgb3V0ZXJzaXplKTsKKyAgICAgIHRpbWVyLnJlc2V0KCk7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IDM7ICsraykgewogICAgICAgICB0aW1lci5zdGFydCgpOwotICAgICAgICBiZW5jaFZlYyhhLCBiLCBjLCBzaXplMik7CisgICAgICAgIGJlbmNoVmVjKG1hLCBtYiwgbWMpOwogICAgICAgICB0aW1lci5zdG9wKCk7CisgICAgICB9CisgICAgICBzdGQ6OmNvdXQgPDwgaW5uZXJzaXplIDw8ICIgeCAiIDw8IG91dGVyc2l6ZSA8PCAiICAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgInMgICAiCisgICAgICAgICAgICAgICAgPDwgKGRvdWJsZShzaXplMiAqIFJFUEVBVCkgLyB0aW1lci52YWx1ZSgpKSAvICgxMDI0LiAqIDEwMjQuICogMTAyNC4pIDw8ICIgR0Zsb3BzXG4iOwogICAgIH0KLSAgICBzdGQ6OmNvdXQgPDwgdGltZXIudmFsdWUoKSA8PCAicyAgIiA8PCAoZG91YmxlKHNpemUyKlJFUEVBVCkvdGltZXIudmFsdWUoKSkvKDEwMjQuKjEwMjQuKjEwMjQuKSA8PCAiIEdGbG9wc1xuIjsKLSAgICByZXR1cm4gMDsKLSAgICBmb3IgKGludCBpbm5lcnNpemUgPSBzaXplOyBpbm5lcnNpemU+MiA7IC0taW5uZXJzaXplKQotICAgIHsKLSAgICAgICAgaWYgKHNpemUyJWlubmVyc2l6ZT09MCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG91dGVyc2l6ZSA9IHNpemUyL2lubmVyc2l6ZTsKLSAgICAgICAgICAgIE1hdHJpeFhmIG1hID0gTWFwPE1hdHJpeFhmPihhLCBpbm5lcnNpemUsIG91dGVyc2l6ZSApOwotICAgICAgICAgICAgTWF0cml4WGYgbWIgPSBNYXA8TWF0cml4WGY+KGIsIGlubmVyc2l6ZSwgb3V0ZXJzaXplICk7Ci0gICAgICAgICAgICBNYXRyaXhYZiBtYyA9IE1hcDxNYXRyaXhYZj4oYywgaW5uZXJzaXplLCBvdXRlcnNpemUgKTsKLSAgICAgICAgICAgIHRpbWVyLnJlc2V0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBrPTA7IGs8MzsgKytrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRpbWVyLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgYmVuY2hWZWMobWEsIG1iLCBtYyk7Ci0gICAgICAgICAgICAgICAgdGltZXIuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RkOjpjb3V0IDw8IGlubmVyc2l6ZSA8PCAiIHggIiA8PCBvdXRlcnNpemUgPDwgIiAgIiA8PCB0aW1lci52YWx1ZSgpIDw8ICJzICAgIiA8PCAoZG91YmxlKHNpemUyKlJFUEVBVCkvdGltZXIudmFsdWUoKSkvKDEwMjQuKjEwMjQuKjEwMjQuKSA8PCAiIEdGbG9wc1xuIjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBWZWN0b3JYZiB2YSA9IE1hcDxWZWN0b3JYZj4oYSwgc2l6ZTIpOwotICAgIFZlY3RvclhmIHZiID0gTWFwPFZlY3RvclhmPihiLCBzaXplMik7Ci0gICAgVmVjdG9yWGYgdmMgPSBNYXA8VmVjdG9yWGY+KGMsIHNpemUyKTsKLSAgICB0aW1lci5yZXNldCgpOwotICAgIGZvciAoaW50IGs9MDsgazwzOyArK2spCi0gICAgewotICAgICAgICB0aW1lci5zdGFydCgpOwotICAgICAgICBiZW5jaFZlYyh2YSwgdmIsIHZjKTsKLSAgICAgICAgdGltZXIuc3RvcCgpOwotICAgIH0KLSAgICBzdGQ6OmNvdXQgPDwgdGltZXIudmFsdWUoKSA8PCAicyAgICIgPDwgKGRvdWJsZShzaXplMipSRVBFQVQpL3RpbWVyLnZhbHVlKCkpLygxMDI0LioxMDI0LioxMDI0LikgPDwgIiBHRmxvcHNcbiI7CisgIH0KIAotICAgIHJldHVybiAwOworICBWZWN0b3JYZiB2YSA9IE1hcDxWZWN0b3JYZj4oYSwgc2l6ZTIpOworICBWZWN0b3JYZiB2YiA9IE1hcDxWZWN0b3JYZj4oYiwgc2l6ZTIpOworICBWZWN0b3JYZiB2YyA9IE1hcDxWZWN0b3JYZj4oYywgc2l6ZTIpOworICB0aW1lci5yZXNldCgpOworICBmb3IgKGludCBrID0gMDsgayA8IDM7ICsraykgeworICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgYmVuY2hWZWModmEsIHZiLCB2Yyk7CisgICAgdGltZXIuc3RvcCgpOworICB9CisgIHN0ZDo6Y291dCA8PCB0aW1lci52YWx1ZSgpIDw8ICJzICAgIiA8PCAoZG91YmxlKHNpemUyICogUkVQRUFUKSAvIHRpbWVyLnZhbHVlKCkpIC8gKDEwMjQuICogMTAyNC4gKiAxMDI0LikKKyAgICAgICAgICAgIDw8ICIgR0Zsb3BzXG4iOworCisgIHJldHVybiAwOwogfQogCi12b2lkIGJlbmNoVmVjKE1hdHJpeFhmJiBhLCBNYXRyaXhYZiYgYiwgTWF0cml4WGYmIGMpCi17Ci0gICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQotICAgICAgICBhID0gYSArIGI7Cit2b2lkIGJlbmNoVmVjKE1hdHJpeFhmJiBhLCBNYXRyaXhYZiYgYiwgTWF0cml4WGYmIGMpIHsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBSRVBFQVQ7ICsraykgYSA9IGEgKyBiOwogfQogCi12b2lkIGJlbmNoVmVjKFZlY3RvclhmJiBhLCBWZWN0b3JYZiYgYiwgVmVjdG9yWGYmIGMpCi17Ci0gICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQotICAgICAgICBhID0gYSArIGI7Cit2b2lkIGJlbmNoVmVjKFZlY3RvclhmJiBhLCBWZWN0b3JYZiYgYiwgVmVjdG9yWGYmIGMpIHsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBSRVBFQVQ7ICsraykgYSA9IGEgKyBiOwogfQogCi12b2lkIGJlbmNoVmVjKFNjYWxhciogYSwgU2NhbGFyKiBiLCBTY2FsYXIqIGMsIGludCBzaXplKQotewotICAgIHR5cGVkZWYgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXRTY2FsYXI7Ci0gICAgY29uc3QgaW50IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplOwotICAgIFBhY2tldFNjYWxhciBhMCwgYTEsIGEyLCBhMywgYjAsIGIxLCBiMiwgYjM7Ci0gICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQotICAgICAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSs9UGFja2V0U2l6ZSo4KQotICAgICAgICB7Ci0vLyAgICAgICAgICAgICBhMCA9IGludGVybmFsOjpwbG9hZCgmYVtpXSk7Ci0vLyAgICAgICAgICAgICBiMCA9IGludGVybmFsOjpwbG9hZCgmYltpXSk7Ci0vLyAgICAgICAgICAgICBhMSA9IGludGVybmFsOjpwbG9hZCgmYVtpKzEqUGFja2V0U2l6ZV0pOwotLy8gICAgICAgICAgICAgYjEgPSBpbnRlcm5hbDo6cGxvYWQoJmJbaSsxKlBhY2tldFNpemVdKTsKLS8vICAgICAgICAgICAgIGEyID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krMipQYWNrZXRTaXplXSk7Ci0vLyAgICAgICAgICAgICBiMiA9IGludGVybmFsOjpwbG9hZCgmYltpKzIqUGFja2V0U2l6ZV0pOwotLy8gICAgICAgICAgICAgYTMgPSBpbnRlcm5hbDo6cGxvYWQoJmFbaSszKlBhY2tldFNpemVdKTsKLS8vICAgICAgICAgICAgIGIzID0gaW50ZXJuYWw6OnBsb2FkKCZiW2krMypQYWNrZXRTaXplXSk7Ci0vLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2ldLCBpbnRlcm5hbDo6cGFkZChhMCwgYjApKTsKLS8vICAgICAgICAgICAgIGEwID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krNCpQYWNrZXRTaXplXSk7Ci0vLyAgICAgICAgICAgICBiMCA9IGludGVybmFsOjpwbG9hZCgmYltpKzQqUGFja2V0U2l6ZV0pOwotLy8gICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krMSpQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoYTEsIGIxKSk7Ci0vLyAgICAgICAgICAgICBhMSA9IGludGVybmFsOjpwbG9hZCgmYVtpKzUqUGFja2V0U2l6ZV0pOwotLy8gICAgICAgICAgICAgYjEgPSBpbnRlcm5hbDo6cGxvYWQoJmJbaSs1KlBhY2tldFNpemVdKTsKLS8vICAgICAgICAgICAgIAotLy8gICAgICAgICAgICAgaW50ZXJuYWw6OnBzdG9yZSgmYVtpKzIqUGFja2V0U2l6ZV0sIGludGVybmFsOjpwYWRkKGEyLCBiMikpOwotLy8gICAgICAgICAgICAgYTIgPSBpbnRlcm5hbDo6cGxvYWQoJmFbaSs2KlBhY2tldFNpemVdKTsKLS8vICAgICAgICAgICAgIGIyID0gaW50ZXJuYWw6OnBsb2FkKCZiW2krNipQYWNrZXRTaXplXSk7Ci0vLyAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSszKlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMywgYjMpKTsKLS8vICAgICAgICAgICAgIGEzID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krNypQYWNrZXRTaXplXSk7Ci0vLyAgICAgICAgICAgICBiMyA9IGludGVybmFsOjpwbG9hZCgmYltpKzcqUGFja2V0U2l6ZV0pOwotLy8gICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNCpQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoYTAsIGIwKSk7Ci0vLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNSpQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoYTEsIGIxKSk7Ci0vLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNipQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoYTIsIGIyKSk7Ci0vLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNypQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoYTMsIGIzKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSsyKlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChpbnRlcm5hbDo6cGxvYWR1KCZhW2krMipQYWNrZXRTaXplXSksIGludGVybmFsOjpwbG9hZHUoJmJbaSsyKlBhY2tldFNpemVdKSkpOwotICAgICAgICAgICAgaW50ZXJuYWw6OnBzdG9yZSgmYVtpKzMqUGFja2V0U2l6ZV0sIGludGVybmFsOjpwYWRkKGludGVybmFsOjpwbG9hZHUoJmFbaSszKlBhY2tldFNpemVdKSwgaW50ZXJuYWw6OnBsb2FkdSgmYltpKzMqUGFja2V0U2l6ZV0pKSk7Ci0gICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNCpQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoaW50ZXJuYWw6OnBsb2FkdSgmYVtpKzQqUGFja2V0U2l6ZV0pLCBpbnRlcm5hbDo6cGxvYWR1KCZiW2krNCpQYWNrZXRTaXplXSkpKTsKLSAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSs1KlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChpbnRlcm5hbDo6cGxvYWR1KCZhW2krNSpQYWNrZXRTaXplXSksIGludGVybmFsOjpwbG9hZHUoJmJbaSs1KlBhY2tldFNpemVdKSkpOwotICAgICAgICAgICAgaW50ZXJuYWw6OnBzdG9yZSgmYVtpKzYqUGFja2V0U2l6ZV0sIGludGVybmFsOjpwYWRkKGludGVybmFsOjpwbG9hZHUoJmFbaSs2KlBhY2tldFNpemVdKSwgaW50ZXJuYWw6OnBsb2FkdSgmYltpKzYqUGFja2V0U2l6ZV0pKSk7Ci0gICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2krNypQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoaW50ZXJuYWw6OnBsb2FkdSgmYVtpKzcqUGFja2V0U2l6ZV0pLCBpbnRlcm5hbDo6cGxvYWR1KCZiW2krNypQYWNrZXRTaXplXSkpKTsKLSAgICAgICAgfQordm9pZCBiZW5jaFZlYyhTY2FsYXIqIGEsIFNjYWxhciogYiwgU2NhbGFyKiBjLCBpbnQgc2l6ZSkgeworICB0eXBlZGVmIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUgUGFja2V0U2NhbGFyOworICBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU7CisgIFBhY2tldFNjYWxhciBhMCwgYTEsIGEyLCBhMywgYjAsIGIxLCBiMiwgYjM7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgUkVQRUFUOyArK2spCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICs9IFBhY2tldFNpemUgKiA4KSB7CisgICAgICAvLyAgICAgICAgICAgICBhMCA9IGludGVybmFsOjpwbG9hZCgmYVtpXSk7CisgICAgICAvLyAgICAgICAgICAgICBiMCA9IGludGVybmFsOjpwbG9hZCgmYltpXSk7CisgICAgICAvLyAgICAgICAgICAgICBhMSA9IGludGVybmFsOjpwbG9hZCgmYVtpKzEqUGFja2V0U2l6ZV0pOworICAgICAgLy8gICAgICAgICAgICAgYjEgPSBpbnRlcm5hbDo6cGxvYWQoJmJbaSsxKlBhY2tldFNpemVdKTsKKyAgICAgIC8vICAgICAgICAgICAgIGEyID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krMipQYWNrZXRTaXplXSk7CisgICAgICAvLyAgICAgICAgICAgICBiMiA9IGludGVybmFsOjpwbG9hZCgmYltpKzIqUGFja2V0U2l6ZV0pOworICAgICAgLy8gICAgICAgICAgICAgYTMgPSBpbnRlcm5hbDo6cGxvYWQoJmFbaSszKlBhY2tldFNpemVdKTsKKyAgICAgIC8vICAgICAgICAgICAgIGIzID0gaW50ZXJuYWw6OnBsb2FkKCZiW2krMypQYWNrZXRTaXplXSk7CisgICAgICAvLyAgICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2ldLCBpbnRlcm5hbDo6cGFkZChhMCwgYjApKTsKKyAgICAgIC8vICAgICAgICAgICAgIGEwID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krNCpQYWNrZXRTaXplXSk7CisgICAgICAvLyAgICAgICAgICAgICBiMCA9IGludGVybmFsOjpwbG9hZCgmYltpKzQqUGFja2V0U2l6ZV0pOworICAgICAgLy8KKyAgICAgIC8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSsxKlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMSwgYjEpKTsKKyAgICAgIC8vICAgICAgICAgICAgIGExID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krNSpQYWNrZXRTaXplXSk7CisgICAgICAvLyAgICAgICAgICAgICBiMSA9IGludGVybmFsOjpwbG9hZCgmYltpKzUqUGFja2V0U2l6ZV0pOworICAgICAgLy8KKyAgICAgIC8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSsyKlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMiwgYjIpKTsKKyAgICAgIC8vICAgICAgICAgICAgIGEyID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krNipQYWNrZXRTaXplXSk7CisgICAgICAvLyAgICAgICAgICAgICBiMiA9IGludGVybmFsOjpwbG9hZCgmYltpKzYqUGFja2V0U2l6ZV0pOworICAgICAgLy8KKyAgICAgIC8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSszKlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMywgYjMpKTsKKyAgICAgIC8vICAgICAgICAgICAgIGEzID0gaW50ZXJuYWw6OnBsb2FkKCZhW2krNypQYWNrZXRTaXplXSk7CisgICAgICAvLyAgICAgICAgICAgICBiMyA9IGludGVybmFsOjpwbG9hZCgmYltpKzcqUGFja2V0U2l6ZV0pOworICAgICAgLy8KKyAgICAgIC8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSs0KlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMCwgYjApKTsKKyAgICAgIC8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSs1KlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMSwgYjEpKTsKKyAgICAgIC8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSs2KlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMiwgYjIpKTsKKyAgICAgIC8vICAgICAgICAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSs3KlBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChhMywgYjMpKTsKKworICAgICAgaW50ZXJuYWw6OnBzdG9yZSgmYVtpICsgMiAqIFBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChpbnRlcm5hbDo6cGxvYWR1KCZhW2kgKyAyICogUGFja2V0U2l6ZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cGxvYWR1KCZiW2kgKyAyICogUGFja2V0U2l6ZV0pKSk7CisgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2kgKyAzICogUGFja2V0U2l6ZV0sIGludGVybmFsOjpwYWRkKGludGVybmFsOjpwbG9hZHUoJmFbaSArIDMgKiBQYWNrZXRTaXplXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpwbG9hZHUoJmJbaSArIDMgKiBQYWNrZXRTaXplXSkpKTsKKyAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSArIDQgKiBQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoaW50ZXJuYWw6OnBsb2FkdSgmYVtpICsgNCAqIFBhY2tldFNpemVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnBsb2FkdSgmYltpICsgNCAqIFBhY2tldFNpemVdKSkpOworICAgICAgaW50ZXJuYWw6OnBzdG9yZSgmYVtpICsgNSAqIFBhY2tldFNpemVdLCBpbnRlcm5hbDo6cGFkZChpbnRlcm5hbDo6cGxvYWR1KCZhW2kgKyA1ICogUGFja2V0U2l6ZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cGxvYWR1KCZiW2kgKyA1ICogUGFja2V0U2l6ZV0pKSk7CisgICAgICBpbnRlcm5hbDo6cHN0b3JlKCZhW2kgKyA2ICogUGFja2V0U2l6ZV0sIGludGVybmFsOjpwYWRkKGludGVybmFsOjpwbG9hZHUoJmFbaSArIDYgKiBQYWNrZXRTaXplXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpwbG9hZHUoJmJbaSArIDYgKiBQYWNrZXRTaXplXSkpKTsKKyAgICAgIGludGVybmFsOjpwc3RvcmUoJmFbaSArIDcgKiBQYWNrZXRTaXplXSwgaW50ZXJuYWw6OnBhZGQoaW50ZXJuYWw6OnBsb2FkdSgmYVtpICsgNyAqIFBhY2tldFNpemVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnBsb2FkdSgmYltpICsgNyAqIFBhY2tldFNpemVdKSkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNoX2dlbW0uY3BwIGIvYmVuY2gvYmVuY2hfZ2VtbS5jcHAKaW5kZXggNzhjYTFjZC4uZTAxYmRiOCAxMDA2NDQKLS0tIGEvYmVuY2gvYmVuY2hfZ2VtbS5jcHAKKysrIGIvYmVuY2gvYmVuY2hfZ2VtbS5jcHAKQEAgLTMsNyArMyw3IEBACiAvLyBpY3BjIGJlbmNoX2dlbW0uY3BwIC1JIC4uIC1PMyAtRE5ERUJVRyAtbHJ0IC1vcGVubXAgICYmIE9NUF9OVU1fVEhSRUFEUz0yICAuL2Eub3V0CiAKIC8vIENvbXBpbGF0aW9uIG9wdGlvbnM6Ci0vLyAKKy8vCiAvLyAtRFNDQUxBUj1zdGQ6OmNvbXBsZXg8ZG91YmxlPgogLy8gLURTQ0FMQVJBPWRvdWJsZSBvciAtRFNDQUxBUkI9ZG91YmxlCiAvLyAtREhBVkVfQkxBUwpAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgPGJlbmNoL0JlbmNoVGltZXIuaD4KICNpbmNsdWRlIDxFaWdlbi9Db3JlPgogCi0KIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKQEAgLTQ1LDE1ICs0NCwxNSBAQAogCiB0eXBlZGVmIFNDQUxBUiBTY2FsYXI7CiB0eXBlZGVmIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7Ci10eXBlZGVmIE1hdHJpeDxTQ0FMQVJBLER5bmFtaWMsRHluYW1pYyxvcHRfQT4gQTsKLXR5cGVkZWYgTWF0cml4PFNDQUxBUkIsRHluYW1pYyxEeW5hbWljLG9wdF9CPiBCOwotdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gQzsKLXR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBNOwordHlwZWRlZiBNYXRyaXg8U0NBTEFSQSwgRHluYW1pYywgRHluYW1pYywgb3B0X0E+IEE7Cit0eXBlZGVmIE1hdHJpeDxTQ0FMQVJCLCBEeW5hbWljLCBEeW5hbWljLCBvcHRfQj4gQjsKK3R5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gQzsKK3R5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IE07CiAKICNpZmRlZiBIQVZFX0JMQVMKIAogZXh0ZXJuICJDIiB7Ci0gICNpbmNsdWRlIDxFaWdlbi9zcmMvbWlzYy9ibGFzLmg+CisjaW5jbHVkZSA8RWlnZW4vc3JjL21pc2MvYmxhcy5oPgogfQogCiBzdGF0aWMgZmxvYXQgZm9uZSA9IDE7CkBAIC02NSw3ICs2NCw3IEBACiBzdGF0aWMgc3RkOjpjb21wbGV4PGRvdWJsZT4gY2RvbmUgPSAxOwogc3RhdGljIHN0ZDo6Y29tcGxleDxkb3VibGU+IGNkemVybyA9IDA7CiBzdGF0aWMgY2hhciBub3RyYW5zID0gJ04nOwotc3RhdGljIGNoYXIgdHJhbnMgPSAnVCc7ICAKK3N0YXRpYyBjaGFyIHRyYW5zID0gJ1QnOwogc3RhdGljIGNoYXIgbm9udW5pdCA9ICdOJzsKIHN0YXRpYyBjaGFyIGxvd2VyID0gJ0wnOwogc3RhdGljIGNoYXIgcmlnaHQgPSAnUic7CkBAIC04Myw2MCArODIsNjEgQEAKIGNvbnN0IGNoYXIgdHJhbnNCID0gbm90cmFuczsKICNlbmRpZgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBBLHR5cGVuYW1lIEI+Ci12b2lkIGJsYXNfZ2VtbShjb25zdCBBJiBhLCBjb25zdCBCJiBiLCBNYXRyaXhYZiYgYykKLXsKLSAgaW50IE0gPSBjLnJvd3MoKTsgaW50IE4gPSBjLmNvbHMoKTsgaW50IEsgPSBhLmNvbHMoKTsKLSAgaW50IGxkYSA9IGEub3V0ZXJTdHJpZGUoKTsgaW50IGxkYiA9IGIub3V0ZXJTdHJpZGUoKTsgaW50IGxkYyA9IGMucm93cygpOwordGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+Cit2b2lkIGJsYXNfZ2VtbShjb25zdCBBJiBhLCBjb25zdCBCJiBiLCBNYXRyaXhYZiYgYykgeworICBpbnQgTSA9IGMucm93cygpOworICBpbnQgTiA9IGMuY29scygpOworICBpbnQgSyA9IGEuY29scygpOworICBpbnQgbGRhID0gYS5vdXRlclN0cmlkZSgpOworICBpbnQgbGRiID0gYi5vdXRlclN0cmlkZSgpOworICBpbnQgbGRjID0gYy5yb3dzKCk7CiAKLSAgc2dlbW1fKCZ0cmFuc0EsJnRyYW5zQiwmTSwmTiwmSywmZm9uZSwKLSAgICAgICAgIGNvbnN0X2Nhc3Q8ZmxvYXQqPihhLmRhdGEoKSksJmxkYSwKLSAgICAgICAgIGNvbnN0X2Nhc3Q8ZmxvYXQqPihiLmRhdGEoKSksJmxkYiwmZm9uZSwKLSAgICAgICAgIGMuZGF0YSgpLCZsZGMpOworICBzZ2VtbV8oJnRyYW5zQSwgJnRyYW5zQiwgJk0sICZOLCAmSywgJmZvbmUsIGNvbnN0X2Nhc3Q8ZmxvYXQqPihhLmRhdGEoKSksICZsZGEsIGNvbnN0X2Nhc3Q8ZmxvYXQqPihiLmRhdGEoKSksICZsZGIsCisgICAgICAgICAmZm9uZSwgYy5kYXRhKCksICZsZGMpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBBLHR5cGVuYW1lIEI+Ci12b2lkIGJsYXNfZ2VtbShjb25zdCBBJiBhLCBjb25zdCBCJiBiLCBNYXRyaXhYZCYgYykKLXsKLSAgaW50IE0gPSBjLnJvd3MoKTsgaW50IE4gPSBjLmNvbHMoKTsgaW50IEsgPSBhLmNvbHMoKTsKLSAgaW50IGxkYSA9IGEub3V0ZXJTdHJpZGUoKTsgaW50IGxkYiA9IGIub3V0ZXJTdHJpZGUoKTsgaW50IGxkYyA9IGMucm93cygpOwordGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+Cit2b2lkIGJsYXNfZ2VtbShjb25zdCBBJiBhLCBjb25zdCBCJiBiLCBNYXRyaXhYZCYgYykgeworICBpbnQgTSA9IGMucm93cygpOworICBpbnQgTiA9IGMuY29scygpOworICBpbnQgSyA9IGEuY29scygpOworICBpbnQgbGRhID0gYS5vdXRlclN0cmlkZSgpOworICBpbnQgbGRiID0gYi5vdXRlclN0cmlkZSgpOworICBpbnQgbGRjID0gYy5yb3dzKCk7CiAKLSAgZGdlbW1fKCZ0cmFuc0EsJnRyYW5zQiwmTSwmTiwmSywmZG9uZSwKLSAgICAgICAgIGNvbnN0X2Nhc3Q8ZG91YmxlKj4oYS5kYXRhKCkpLCZsZGEsCi0gICAgICAgICBjb25zdF9jYXN0PGRvdWJsZSo+KGIuZGF0YSgpKSwmbGRiLCZkb25lLAotICAgICAgICAgYy5kYXRhKCksJmxkYyk7CisgIGRnZW1tXygmdHJhbnNBLCAmdHJhbnNCLCAmTSwgJk4sICZLLCAmZG9uZSwgY29uc3RfY2FzdDxkb3VibGUqPihhLmRhdGEoKSksICZsZGEsIGNvbnN0X2Nhc3Q8ZG91YmxlKj4oYi5kYXRhKCkpLCAmbGRiLAorICAgICAgICAgJmRvbmUsIGMuZGF0YSgpLCAmbGRjKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgQSx0eXBlbmFtZSBCPgotdm9pZCBibGFzX2dlbW0oY29uc3QgQSYgYSwgY29uc3QgQiYgYiwgTWF0cml4WGNmJiBjKQotewotICBpbnQgTSA9IGMucm93cygpOyBpbnQgTiA9IGMuY29scygpOyBpbnQgSyA9IGEuY29scygpOwotICBpbnQgbGRhID0gYS5vdXRlclN0cmlkZSgpOyBpbnQgbGRiID0gYi5vdXRlclN0cmlkZSgpOyBpbnQgbGRjID0gYy5yb3dzKCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KK3ZvaWQgYmxhc19nZW1tKGNvbnN0IEEmIGEsIGNvbnN0IEImIGIsIE1hdHJpeFhjZiYgYykgeworICBpbnQgTSA9IGMucm93cygpOworICBpbnQgTiA9IGMuY29scygpOworICBpbnQgSyA9IGEuY29scygpOworICBpbnQgbGRhID0gYS5vdXRlclN0cmlkZSgpOworICBpbnQgbGRiID0gYi5vdXRlclN0cmlkZSgpOworICBpbnQgbGRjID0gYy5yb3dzKCk7CiAKLSAgY2dlbW1fKCZ0cmFuc0EsJnRyYW5zQiwmTSwmTiwmSywoZmxvYXQqKSZjZm9uZSwKLSAgICAgICAgIGNvbnN0X2Nhc3Q8ZmxvYXQqPigoY29uc3QgZmxvYXQqKWEuZGF0YSgpKSwmbGRhLAotICAgICAgICAgY29uc3RfY2FzdDxmbG9hdCo+KChjb25zdCBmbG9hdCopYi5kYXRhKCkpLCZsZGIsKGZsb2F0KikmY2ZvbmUsCi0gICAgICAgICAoZmxvYXQqKWMuZGF0YSgpLCZsZGMpOworICBjZ2VtbV8oJnRyYW5zQSwgJnRyYW5zQiwgJk0sICZOLCAmSywgKGZsb2F0KikmY2ZvbmUsIGNvbnN0X2Nhc3Q8ZmxvYXQqPigoY29uc3QgZmxvYXQqKWEuZGF0YSgpKSwgJmxkYSwKKyAgICAgICAgIGNvbnN0X2Nhc3Q8ZmxvYXQqPigoY29uc3QgZmxvYXQqKWIuZGF0YSgpKSwgJmxkYiwgKGZsb2F0KikmY2ZvbmUsIChmbG9hdCopYy5kYXRhKCksICZsZGMpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBBLHR5cGVuYW1lIEI+Ci12b2lkIGJsYXNfZ2VtbShjb25zdCBBJiBhLCBjb25zdCBCJiBiLCBNYXRyaXhYY2QmIGMpCi17Ci0gIGludCBNID0gYy5yb3dzKCk7IGludCBOID0gYy5jb2xzKCk7IGludCBLID0gYS5jb2xzKCk7Ci0gIGludCBsZGEgPSBhLm91dGVyU3RyaWRlKCk7IGludCBsZGIgPSBiLm91dGVyU3RyaWRlKCk7IGludCBsZGMgPSBjLnJvd3MoKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgordm9pZCBibGFzX2dlbW0oY29uc3QgQSYgYSwgY29uc3QgQiYgYiwgTWF0cml4WGNkJiBjKSB7CisgIGludCBNID0gYy5yb3dzKCk7CisgIGludCBOID0gYy5jb2xzKCk7CisgIGludCBLID0gYS5jb2xzKCk7CisgIGludCBsZGEgPSBhLm91dGVyU3RyaWRlKCk7CisgIGludCBsZGIgPSBiLm91dGVyU3RyaWRlKCk7CisgIGludCBsZGMgPSBjLnJvd3MoKTsKIAotICB6Z2VtbV8oJnRyYW5zQSwmdHJhbnNCLCZNLCZOLCZLLChkb3VibGUqKSZjZG9uZSwKLSAgICAgICAgIGNvbnN0X2Nhc3Q8ZG91YmxlKj4oKGNvbnN0IGRvdWJsZSopYS5kYXRhKCkpLCZsZGEsCi0gICAgICAgICBjb25zdF9jYXN0PGRvdWJsZSo+KChjb25zdCBkb3VibGUqKWIuZGF0YSgpKSwmbGRiLChkb3VibGUqKSZjZG9uZSwKLSAgICAgICAgIChkb3VibGUqKWMuZGF0YSgpLCZsZGMpOworICB6Z2VtbV8oJnRyYW5zQSwgJnRyYW5zQiwgJk0sICZOLCAmSywgKGRvdWJsZSopJmNkb25lLCBjb25zdF9jYXN0PGRvdWJsZSo+KChjb25zdCBkb3VibGUqKWEuZGF0YSgpKSwgJmxkYSwKKyAgICAgICAgIGNvbnN0X2Nhc3Q8ZG91YmxlKj4oKGNvbnN0IGRvdWJsZSopYi5kYXRhKCkpLCAmbGRiLCAoZG91YmxlKikmY2RvbmUsIChkb3VibGUqKWMuZGF0YSgpLCAmbGRjKTsKIH0KIAotCi0KICNlbmRpZgogCi12b2lkIG1hdGxhYl9jcGx4X2NwbHgoY29uc3QgTSYgYXIsIGNvbnN0IE0mIGFpLCBjb25zdCBNJiBiciwgY29uc3QgTSYgYmksIE0mIGNyLCBNJiBjaSkKLXsKK3ZvaWQgbWF0bGFiX2NwbHhfY3BseChjb25zdCBNJiBhciwgY29uc3QgTSYgYWksIGNvbnN0IE0mIGJyLCBjb25zdCBNJiBiaSwgTSYgY3IsIE0mIGNpKSB7CiAgIGNyLm5vYWxpYXMoKSArPSBhciAqIGJyOwogICBjci5ub2FsaWFzKCkgLT0gYWkgKiBiaTsKICAgY2kubm9hbGlhcygpICs9IGFyICogYmk7CkBAIC0xNDQsMzMgKzE0NCwyNyBAQAogICAvLyBbY3IgY2ldICs9IFthciBhaV0gKiBiciArIFstYWkgYXJdICogYmkKIH0KIAotdm9pZCBtYXRsYWJfcmVhbF9jcGx4KGNvbnN0IE0mIGEsIGNvbnN0IE0mIGJyLCBjb25zdCBNJiBiaSwgTSYgY3IsIE0mIGNpKQotewordm9pZCBtYXRsYWJfcmVhbF9jcGx4KGNvbnN0IE0mIGEsIGNvbnN0IE0mIGJyLCBjb25zdCBNJiBiaSwgTSYgY3IsIE0mIGNpKSB7CiAgIGNyLm5vYWxpYXMoKSArPSBhICogYnI7CiAgIGNpLm5vYWxpYXMoKSArPSBhICogYmk7CiB9CiAKLXZvaWQgbWF0bGFiX2NwbHhfcmVhbChjb25zdCBNJiBhciwgY29uc3QgTSYgYWksIGNvbnN0IE0mIGIsIE0mIGNyLCBNJiBjaSkKLXsKK3ZvaWQgbWF0bGFiX2NwbHhfcmVhbChjb25zdCBNJiBhciwgY29uc3QgTSYgYWksIGNvbnN0IE0mIGIsIE0mIGNyLCBNJiBjaSkgewogICBjci5ub2FsaWFzKCkgKz0gYXIgKiBiOwogICBjaS5ub2FsaWFzKCkgKz0gYWkgKiBiOwogfQogCi0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQiwgdHlwZW5hbWUgQz4KLUVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgZ2VtbShjb25zdCBBJiBhLCBjb25zdCBCJiBiLCBDJiBjKQotewordGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEIsIHR5cGVuYW1lIEM+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGdlbW0oY29uc3QgQSYgYSwgY29uc3QgQiYgYiwgQyYgYykgewogICBjLm5vYWxpYXMoKSArPSBhICogYjsKIH0KIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKLXsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogICBzdGQ6OnB0cmRpZmZfdCBsMSA9IGludGVybmFsOjpxdWVyeUwxQ2FjaGVTaXplKCk7CiAgIHN0ZDo6cHRyZGlmZl90IGwyID0gaW50ZXJuYWw6OnF1ZXJ5VG9wTGV2ZWxDYWNoZVNpemUoKTsKLSAgc3RkOjpjb3V0IDw8ICJMMSBjYWNoZSBzaXplICAgICA9ICIgPDwgKGwxPjAgPyBsMS8xMDI0IDogLTEpIDw8ICIgS0JcbiI7Ci0gIHN0ZDo6Y291dCA8PCAiTDIvTDMgY2FjaGUgc2l6ZSAgPSAiIDw8IChsMj4wID8gbDIvMTAyNCA6IC0xKSA8PCAiIEtCXG4iOwotICB0eXBlZGVmIGludGVybmFsOjpnZWJwX3RyYWl0czxTY2FsYXIsU2NhbGFyPiBUcmFpdHM7CisgIHN0ZDo6Y291dCA8PCAiTDEgY2FjaGUgc2l6ZSAgICAgPSAiIDw8IChsMSA+IDAgPyBsMSAvIDEwMjQgOiAtMSkgPDwgIiBLQlxuIjsKKyAgc3RkOjpjb3V0IDw8ICJMMi9MMyBjYWNoZSBzaXplICA9ICIgPDwgKGwyID4gMCA/IGwyIC8gMTAyNCA6IC0xKSA8PCAiIEtCXG4iOworICB0eXBlZGVmIGludGVybmFsOjpnZWJwX3RyYWl0czxTY2FsYXIsIFNjYWxhcj4gVHJhaXRzOwogICBzdGQ6OmNvdXQgPDwgIlJlZ2lzdGVyIGJsb2NraW5nID0gIiA8PCBUcmFpdHM6Om1yIDw8ICIgeCAiIDw8IFRyYWl0czo6bnIgPDwgIlxuIjsKIAogICBpbnQgcmVwID0gMTsgICAgLy8gbnVtYmVyIG9mIHJlcGV0aXRpb25zIHBlciB0cnkKQEAgLTE4MCwxOTYgKzE3NCwyMjAgQEAKICAgaW50IG0gPSBzOwogICBpbnQgbiA9IHM7CiAgIGludCBwID0gczsKLSAgaW50IGNhY2hlX3NpemUxPS0xLCBjYWNoZV9zaXplMj1sMiwgY2FjaGVfc2l6ZTMgPSAwOworICBpbnQgY2FjaGVfc2l6ZTEgPSAtMSwgY2FjaGVfc2l6ZTIgPSBsMiwgY2FjaGVfc2l6ZTMgPSAwOwogCiAgIGJvb2wgbmVlZF9oZWxwID0gZmFsc2U7Ci0gIGZvciAoaW50IGk9MTsgaTxhcmdjOykKLSAgewotICAgIGlmKGFyZ3ZbaV1bMF09PSctJykKLSAgICB7Ci0gICAgICBpZihhcmd2W2ldWzFdPT0ncycpCi0gICAgICB7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzspIHsKKyAgICBpZiAoYXJndltpXVswXSA9PSAnLScpIHsKKyAgICAgIGlmIChhcmd2W2ldWzFdID09ICdzJykgewogICAgICAgICArK2k7CiAgICAgICAgIHMgPSBhdG9pKGFyZ3ZbaSsrXSk7CiAgICAgICAgIG0gPSBuID0gcCA9IHM7Ci0gICAgICAgIGlmKGFyZ3ZbaV1bMF0hPSctJykKLSAgICAgICAgeworICAgICAgICBpZiAoYXJndltpXVswXSAhPSAnLScpIHsKICAgICAgICAgICBuID0gYXRvaShhcmd2W2krK10pOwogICAgICAgICAgIHAgPSBhdG9pKGFyZ3ZbaSsrXSk7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoYXJndltpXVsxXT09J2MnKQotICAgICAgeworICAgICAgfSBlbHNlIGlmIChhcmd2W2ldWzFdID09ICdjJykgewogICAgICAgICArK2k7CiAgICAgICAgIGNhY2hlX3NpemUxID0gYXRvaShhcmd2W2krK10pOwotICAgICAgICBpZihhcmd2W2ldWzBdIT0nLScpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKGFyZ3ZbaV1bMF0gIT0gJy0nKSB7CiAgICAgICAgICAgY2FjaGVfc2l6ZTIgPSBhdG9pKGFyZ3ZbaSsrXSk7Ci0gICAgICAgICAgaWYoYXJndltpXVswXSE9Jy0nKQotICAgICAgICAgICAgY2FjaGVfc2l6ZTMgPSBhdG9pKGFyZ3ZbaSsrXSk7CisgICAgICAgICAgaWYgKGFyZ3ZbaV1bMF0gIT0gJy0nKSBjYWNoZV9zaXplMyA9IGF0b2koYXJndltpKytdKTsKICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZihhcmd2W2ldWzFdPT0ndCcpCi0gICAgICB7CisgICAgICB9IGVsc2UgaWYgKGFyZ3ZbaV1bMV0gPT0gJ3QnKSB7CiAgICAgICAgIHRyaWVzID0gYXRvaShhcmd2WysraV0pOwogICAgICAgICArK2k7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKGFyZ3ZbaV1bMV09PSdwJykKLSAgICAgIHsKKyAgICAgIH0gZWxzZSBpZiAoYXJndltpXVsxXSA9PSAncCcpIHsKICAgICAgICAgKytpOwogICAgICAgICByZXAgPSBhdG9pKGFyZ3ZbaSsrXSk7CiAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgIG5lZWRfaGVscCA9IHRydWU7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KIAotICBpZihuZWVkX2hlbHApCi0gIHsKKyAgaWYgKG5lZWRfaGVscCkgewogICAgIHN0ZDo6Y291dCA8PCBhcmd2WzBdIDw8ICIgLXMgPG1hdHJpeCBzaXplcz4gLWMgPGNhY2hlIHNpemVzPiAtdCA8bmIgdHJpZXM+IC1wIDxuYiByZXBlYXRzPlxuIjsKICAgICBzdGQ6OmNvdXQgPDwgIiAgIDxtYXRyaXggc2l6ZXM+IDogc2l6ZVxuIjsKICAgICBzdGQ6OmNvdXQgPDwgIiAgIDxtYXRyaXggc2l6ZXM+IDogcm93cyBjb2x1bW5zIGRlcHRoXG4iOwogICAgIHJldHVybiAxOwogICB9CiAKLSNpZiBFSUdFTl9WRVJTSU9OX0FUX0xFQVNUKDMsMiw5MCkKLSAgaWYoY2FjaGVfc2l6ZTE+MCkKLSAgICBzZXRDcHVDYWNoZVNpemVzKGNhY2hlX3NpemUxLGNhY2hlX3NpemUyLGNhY2hlX3NpemUzKTsKKyNpZiBFSUdFTl9WRVJTSU9OX0FUX0xFQVNUKDMsIDIsIDkwKQorICBpZiAoY2FjaGVfc2l6ZTEgPiAwKSBzZXRDcHVDYWNoZVNpemVzKGNhY2hlX3NpemUxLCBjYWNoZV9zaXplMiwgY2FjaGVfc2l6ZTMpOwogI2VuZGlmCi0gIAotICBBIGEobSxwKTsgYS5zZXRSYW5kb20oKTsKLSAgQiBiKHAsbik7IGIuc2V0UmFuZG9tKCk7Ci0gIEMgYyhtLG4pOyBjLnNldE9uZXMoKTsKKworICBBIGEobSwgcCk7CisgIGEuc2V0UmFuZG9tKCk7CisgIEIgYihwLCBuKTsKKyAgYi5zZXRSYW5kb20oKTsKKyAgQyBjKG0sIG4pOworICBjLnNldE9uZXMoKTsKICAgQyByYyA9IGM7CiAKICAgc3RkOjpjb3V0IDw8ICJNYXRyaXggc2l6ZXMgPSAiIDw8IG0gPDwgIngiIDw8IHAgPDwgIiAqICIgPDwgcCA8PCAieCIgPDwgbiA8PCAiXG4iOwogICBzdGQ6OnB0cmRpZmZfdCBtYyhtKSwgbmMobiksIGtjKHApOwotICBpbnRlcm5hbDo6Y29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzPFNjYWxhcixTY2FsYXI+KGtjLCBtYywgbmMpOworICBpbnRlcm5hbDo6Y29tcHV0ZVByb2R1Y3RCbG9ja2luZ1NpemVzPFNjYWxhciwgU2NhbGFyPihrYywgbWMsIG5jKTsKICAgc3RkOjpjb3V0IDw8ICJibG9ja2luZyBzaXplIChtYyB4IGtjKSA9ICIgPDwgbWMgPDwgIiB4ICIgPDwga2MgPDwgIiB4ICIgPDwgbmMgPDwgIlxuIjsKIAogICBDIHIgPSBjOwogCi0gIC8vIGNoZWNrIHRoZSBwYXJhbGxlbCBwcm9kdWN0IGlzIGNvcnJlY3QKLSAgI2lmIGRlZmluZWQgRUlHRU5fSEFTX09QRU5NUAorLy8gY2hlY2sgdGhlIHBhcmFsbGVsIHByb2R1Y3QgaXMgY29ycmVjdAorI2lmIGRlZmluZWQgRUlHRU5fSEFTX09QRU5NUAogICBFaWdlbjo6aW5pdFBhcmFsbGVsKCk7CiAgIGludCBwcm9jcyA9IG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKLSAgaWYocHJvY3M+MSkKLSAgewotICAgICNpZmRlZiBIQVZFX0JMQVMKLSAgICBibGFzX2dlbW0oYSxiLHIpOwotICAgICNlbHNlCisgIGlmIChwcm9jcyA+IDEpIHsKKyNpZmRlZiBIQVZFX0JMQVMKKyAgICBibGFzX2dlbW0oYSwgYiwgcik7CisjZWxzZQogICAgIG9tcF9zZXRfbnVtX3RocmVhZHMoMSk7CiAgICAgci5ub2FsaWFzKCkgKz0gYSAqIGI7CiAgICAgb21wX3NldF9udW1fdGhyZWFkcyhwcm9jcyk7Ci0gICAgI2VuZGlmCisjZW5kaWYKICAgICBjLm5vYWxpYXMoKSArPSBhICogYjsKLSAgICBpZighci5pc0FwcHJveChjKSkgc3RkOjpjZXJyIDw8ICJXYXJuaW5nLCB5b3VyIHBhcmFsbGVsIHByb2R1Y3QgaXMgY3JhcCFcblxuIjsKKyAgICBpZiAoIXIuaXNBcHByb3goYykpIHN0ZDo6Y2VyciA8PCAiV2FybmluZywgeW91ciBwYXJhbGxlbCBwcm9kdWN0IGlzIGNyYXAhXG5cbiI7CiAgIH0KLSAgI2VsaWYgZGVmaW5lZCBIQVZFX0JMQVMKLSAgICBibGFzX2dlbW0oYSxiLHIpOwotICAgIGMubm9hbGlhcygpICs9IGEgKiBiOwotICAgIGlmKCFyLmlzQXBwcm94KGMpKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgKHIgIC0gYykubm9ybSgpL3Iubm9ybSgpIDw8ICJcbiI7CisjZWxpZiBkZWZpbmVkIEhBVkVfQkxBUworICBibGFzX2dlbW0oYSwgYiwgcik7CisgIGMubm9hbGlhcygpICs9IGEgKiBiOworICBpZiAoIXIuaXNBcHByb3goYykpIHsKKyAgICBzdGQ6OmNvdXQgPDwgKHIgLSBjKS5ub3JtKCkgLyByLm5vcm0oKSA8PCAiXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiV2FybmluZywgeW91ciBwcm9kdWN0IGlzIGNyYXAhXG5cbiI7CisgIH0KKyNlbHNlCisgIGlmICgxLiAqIG0gKiBuICogcCA8IDIwMDAuICogMjAwMCAqIDIwMDApIHsKKyAgICBnZW1tKGEsIGIsIGMpOworICAgIHIubm9hbGlhcygpICs9IGEuY2FzdDxTY2FsYXI+KCkubGF6eVByb2R1Y3QoYi5jYXN0PFNjYWxhcj4oKSk7CisgICAgaWYgKCFyLmlzQXBwcm94KGMpKSB7CisgICAgICBzdGQ6OmNvdXQgPDwgKHIgLSBjKS5ub3JtKCkgLyByLm5vcm0oKSA8PCAiXG4iOwogICAgICAgc3RkOjpjZXJyIDw8ICJXYXJuaW5nLCB5b3VyIHByb2R1Y3QgaXMgY3JhcCFcblxuIjsKICAgICB9Ci0gICNlbHNlCi0gICAgaWYoMS4qbSpuKnA8MjAwMC4qMjAwMCoyMDAwKQotICAgIHsKLSAgICAgIGdlbW0oYSxiLGMpOwotICAgICAgci5ub2FsaWFzKCkgKz0gYS5jYXN0PFNjYWxhcj4oKSAubGF6eVByb2R1Y3QoIGIuY2FzdDxTY2FsYXI+KCkgKTsKLSAgICAgIGlmKCFyLmlzQXBwcm94KGMpKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAociAgLSBjKS5ub3JtKCkvci5ub3JtKCkgPDwgIlxuIjsKLSAgICAgICAgc3RkOjpjZXJyIDw8ICJXYXJuaW5nLCB5b3VyIHByb2R1Y3QgaXMgY3JhcCFcblxuIjsKLSAgICAgIH0KLSAgICB9Ci0gICNlbmRpZgorICB9CisjZW5kaWYKIAotICAjaWZkZWYgSEFWRV9CTEFTCisjaWZkZWYgSEFWRV9CTEFTCiAgIEJlbmNoVGltZXIgdGJsYXM7CiAgIGMgPSByYzsKLSAgQkVOQ0godGJsYXMsIHRyaWVzLCByZXAsIGJsYXNfZ2VtbShhLGIsYykpOwotICBzdGQ6OmNvdXQgPDwgImJsYXMgIGNwdSAgICAgICAgICIgPDwgdGJsYXMuYmVzdChDUFVfVElNRVIpL3JlcCAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90Ymxhcy5iZXN0KENQVV9USU1FUikpKjFlLTkgIDw8ICAiIEdGTE9QUyBcdCgiIDw8IHRibGFzLnRvdGFsKENQVV9USU1FUikgIDw8ICJzKVxuIjsKLSAgc3RkOjpjb3V0IDw8ICJibGFzICByZWFsICAgICAgICAiIDw8IHRibGFzLmJlc3QoUkVBTF9USU1FUikvcmVwIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdGJsYXMuYmVzdChSRUFMX1RJTUVSKSkqMWUtOSA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0Ymxhcy50b3RhbChSRUFMX1RJTUVSKSA8PCAicylcbiI7Ci0gICNlbmRpZgorICBCRU5DSCh0YmxhcywgdHJpZXMsIHJlcCwgYmxhc19nZW1tKGEsIGIsIGMpKTsKKyAgc3RkOjpjb3V0IDw8ICJibGFzICBjcHUgICAgICAgICAiIDw8IHRibGFzLmJlc3QoQ1BVX1RJTUVSKSAvIHJlcCA8PCAicyAgXHQiCisgICAgICAgICAgICA8PCAoZG91YmxlKG0pICogbiAqIHAgKiByZXAgKiAyIC8gdGJsYXMuYmVzdChDUFVfVElNRVIpKSAqIDFlLTkgPDwgIiBHRkxPUFMgXHQoIiA8PCB0Ymxhcy50b3RhbChDUFVfVElNRVIpCisgICAgICAgICAgICA8PCAicylcbiI7CisgIHN0ZDo6Y291dCA8PCAiYmxhcyAgcmVhbCAgICAgICAgIiA8PCB0Ymxhcy5iZXN0KFJFQUxfVElNRVIpIC8gcmVwIDw8ICJzICBcdCIKKyAgICAgICAgICAgIDw8IChkb3VibGUobSkgKiBuICogcCAqIHJlcCAqIDIgLyB0Ymxhcy5iZXN0KFJFQUxfVElNRVIpKSAqIDFlLTkgPDwgIiBHRkxPUFMgXHQoIiA8PCB0Ymxhcy50b3RhbChSRUFMX1RJTUVSKQorICAgICAgICAgICAgPDwgInMpXG4iOworI2VuZGlmCiAKICAgLy8gd2FybSBzdGFydAotICBpZihiLm5vcm0oKSthLm5vcm0oKT09MTIzLjU1NCkgc3RkOjpjb3V0IDw8ICJcbiI7CisgIGlmIChiLm5vcm0oKSArIGEubm9ybSgpID09IDEyMy41NTQpIHN0ZDo6Y291dCA8PCAiXG4iOwogCiAgIEJlbmNoVGltZXIgdG10OwogICBjID0gcmM7Ci0gIEJFTkNIKHRtdCwgdHJpZXMsIHJlcCwgZ2VtbShhLGIsYykpOwotICBzdGQ6OmNvdXQgPDwgImVpZ2VuIGNwdSAgICAgICAgICIgPDwgdG10LmJlc3QoQ1BVX1RJTUVSKS9yZXAgIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdG10LmJlc3QoQ1BVX1RJTUVSKSkqMWUtOSAgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdG10LnRvdGFsKENQVV9USU1FUikgIDw8ICJzKVxuIjsKLSAgc3RkOjpjb3V0IDw8ICJlaWdlbiByZWFsICAgICAgICAiIDw8IHRtdC5iZXN0KFJFQUxfVElNRVIpL3JlcCA8PCAicyAgXHQiIDw8IChkb3VibGUobSkqbipwKnJlcCoyL3RtdC5iZXN0KFJFQUxfVElNRVIpKSoxZS05IDw8ICAiIEdGTE9QUyBcdCgiIDw8IHRtdC50b3RhbChSRUFMX1RJTUVSKSA8PCAicylcbiI7CisgIEJFTkNIKHRtdCwgdHJpZXMsIHJlcCwgZ2VtbShhLCBiLCBjKSk7CisgIHN0ZDo6Y291dCA8PCAiZWlnZW4gY3B1ICAgICAgICAgIiA8PCB0bXQuYmVzdChDUFVfVElNRVIpIC8gcmVwIDw8ICJzICBcdCIKKyAgICAgICAgICAgIDw8IChkb3VibGUobSkgKiBuICogcCAqIHJlcCAqIDIgLyB0bXQuYmVzdChDUFVfVElNRVIpKSAqIDFlLTkgPDwgIiBHRkxPUFMgXHQoIiA8PCB0bXQudG90YWwoQ1BVX1RJTUVSKQorICAgICAgICAgICAgPDwgInMpXG4iOworICBzdGQ6OmNvdXQgPDwgImVpZ2VuIHJlYWwgICAgICAgICIgPDwgdG10LmJlc3QoUkVBTF9USU1FUikgLyByZXAgPDwgInMgIFx0IgorICAgICAgICAgICAgPDwgKGRvdWJsZShtKSAqIG4gKiBwICogcmVwICogMiAvIHRtdC5iZXN0KFJFQUxfVElNRVIpKSAqIDFlLTkgPDwgIiBHRkxPUFMgXHQoIiA8PCB0bXQudG90YWwoUkVBTF9USU1FUikKKyAgICAgICAgICAgIDw8ICJzKVxuIjsKIAotICAjaWZkZWYgRUlHRU5fSEFTX09QRU5NUAotICBpZihwcm9jcz4xKQotICB7CisjaWZkZWYgRUlHRU5fSEFTX09QRU5NUAorICBpZiAocHJvY3MgPiAxKSB7CiAgICAgQmVuY2hUaW1lciB0bW9ubzsKICAgICBvbXBfc2V0X251bV90aHJlYWRzKDEpOwogICAgIEVpZ2VuOjpzZXROYlRocmVhZHMoMSk7CiAgICAgYyA9IHJjOwotICAgIEJFTkNIKHRtb25vLCB0cmllcywgcmVwLCBnZW1tKGEsYixjKSk7Ci0gICAgc3RkOjpjb3V0IDw8ICJlaWdlbiBtb25vIGNwdSAgICAiIDw8IHRtb25vLmJlc3QoQ1BVX1RJTUVSKS9yZXAgIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdG1vbm8uYmVzdChDUFVfVElNRVIpKSoxZS05ICA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0bW9uby50b3RhbChDUFVfVElNRVIpICA8PCAicylcbiI7Ci0gICAgc3RkOjpjb3V0IDw8ICJlaWdlbiBtb25vIHJlYWwgICAiIDw8IHRtb25vLmJlc3QoUkVBTF9USU1FUikvcmVwIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdG1vbm8uYmVzdChSRUFMX1RJTUVSKSkqMWUtOSA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0bW9uby50b3RhbChSRUFMX1RJTUVSKSA8PCAicylcbiI7Ci0gICAgc3RkOjpjb3V0IDw8ICJtdCBzcGVlZCB1cCB4IiA8PCB0bW9uby5iZXN0KENQVV9USU1FUikgLyB0bXQuYmVzdChSRUFMX1RJTUVSKSAgPDwgIiA9PiAiIDw8ICgxMDAuMCp0bW9uby5iZXN0KENQVV9USU1FUikgLyB0bXQuYmVzdChSRUFMX1RJTUVSKSkvcHJvY3MgPDwgIiVcbiI7CisgICAgQkVOQ0godG1vbm8sIHRyaWVzLCByZXAsIGdlbW0oYSwgYiwgYykpOworICAgIHN0ZDo6Y291dCA8PCAiZWlnZW4gbW9ubyBjcHUgICAgIiA8PCB0bW9uby5iZXN0KENQVV9USU1FUikgLyByZXAgPDwgInMgIFx0IgorICAgICAgICAgICAgICA8PCAoZG91YmxlKG0pICogbiAqIHAgKiByZXAgKiAyIC8gdG1vbm8uYmVzdChDUFVfVElNRVIpKSAqIDFlLTkgPDwgIiBHRkxPUFMgXHQoIiA8PCB0bW9uby50b3RhbChDUFVfVElNRVIpCisgICAgICAgICAgICAgIDw8ICJzKVxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgImVpZ2VuIG1vbm8gcmVhbCAgICIgPDwgdG1vbm8uYmVzdChSRUFMX1RJTUVSKSAvIHJlcCA8PCAicyAgXHQiCisgICAgICAgICAgICAgIDw8IChkb3VibGUobSkgKiBuICogcCAqIHJlcCAqIDIgLyB0bW9uby5iZXN0KFJFQUxfVElNRVIpKSAqIDFlLTkgPDwgIiBHRkxPUFMgXHQoIgorICAgICAgICAgICAgICA8PCB0bW9uby50b3RhbChSRUFMX1RJTUVSKSA8PCAicylcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJtdCBzcGVlZCB1cCB4IiA8PCB0bW9uby5iZXN0KENQVV9USU1FUikgLyB0bXQuYmVzdChSRUFMX1RJTUVSKSA8PCAiID0+ICIKKyAgICAgICAgICAgICAgPDwgKDEwMC4wICogdG1vbm8uYmVzdChDUFVfVElNRVIpIC8gdG10LmJlc3QoUkVBTF9USU1FUikpIC8gcHJvY3MgPDwgIiVcbiI7CiAgIH0KLSAgI2VuZGlmCi0gIAotICBpZigxLiptKm4qcDwzMCozMCozMCkKLSAgeworI2VuZGlmCisKKyAgaWYgKDEuICogbSAqIG4gKiBwIDwgMzAgKiAzMCAqIDMwKSB7CiAgICAgQmVuY2hUaW1lciB0bXQ7CiAgICAgYyA9IHJjOwotICAgIEJFTkNIKHRtdCwgdHJpZXMsIHJlcCwgYy5ub2FsaWFzKCkrPWEubGF6eVByb2R1Y3QoYikpOwotICAgIHN0ZDo6Y291dCA8PCAibGF6eSBjcHUgICAgICAgICAiIDw8IHRtdC5iZXN0KENQVV9USU1FUikvcmVwICA8PCAicyAgXHQiIDw8IChkb3VibGUobSkqbipwKnJlcCoyL3RtdC5iZXN0KENQVV9USU1FUikpKjFlLTkgIDw8ICAiIEdGTE9QUyBcdCgiIDw8IHRtdC50b3RhbChDUFVfVElNRVIpICA8PCAicylcbiI7Ci0gICAgc3RkOjpjb3V0IDw8ICJsYXp5IHJlYWwgICAgICAgICIgPDwgdG10LmJlc3QoUkVBTF9USU1FUikvcmVwIDw8ICJzICBcdCIgPDwgKGRvdWJsZShtKSpuKnAqcmVwKjIvdG10LmJlc3QoUkVBTF9USU1FUikpKjFlLTkgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdG10LnRvdGFsKFJFQUxfVElNRVIpIDw8ICJzKVxuIjsKKyAgICBCRU5DSCh0bXQsIHRyaWVzLCByZXAsIGMubm9hbGlhcygpICs9IGEubGF6eVByb2R1Y3QoYikpOworICAgIHN0ZDo6Y291dCA8PCAibGF6eSBjcHUgICAgICAgICAiIDw8IHRtdC5iZXN0KENQVV9USU1FUikgLyByZXAgPDwgInMgIFx0IgorICAgICAgICAgICAgICA8PCAoZG91YmxlKG0pICogbiAqIHAgKiByZXAgKiAyIC8gdG10LmJlc3QoQ1BVX1RJTUVSKSkgKiAxZS05IDw8ICIgR0ZMT1BTIFx0KCIgPDwgdG10LnRvdGFsKENQVV9USU1FUikKKyAgICAgICAgICAgICAgPDwgInMpXG4iOworICAgIHN0ZDo6Y291dCA8PCAibGF6eSByZWFsICAgICAgICAiIDw8IHRtdC5iZXN0KFJFQUxfVElNRVIpIC8gcmVwIDw8ICJzICBcdCIKKyAgICAgICAgICAgICAgPDwgKGRvdWJsZShtKSAqIG4gKiBwICogcmVwICogMiAvIHRtdC5iZXN0KFJFQUxfVElNRVIpKSAqIDFlLTkgPDwgIiBHRkxPUFMgXHQoIiA8PCB0bXQudG90YWwoUkVBTF9USU1FUikKKyAgICAgICAgICAgICAgPDwgInMpXG4iOwogICB9Ci0gIAotICAjaWZkZWYgREVDT1VQTEVECi0gIGlmKChOdW1UcmFpdHM8QTo6U2NhbGFyPjo6SXNDb21wbGV4KSAmJiAoTnVtVHJhaXRzPEI6OlNjYWxhcj46OklzQ29tcGxleCkpCi0gIHsKLSAgICBNIGFyKG0scCk7IGFyLnNldFJhbmRvbSgpOwotICAgIE0gYWkobSxwKTsgYWkuc2V0UmFuZG9tKCk7Ci0gICAgTSBicihwLG4pOyBici5zZXRSYW5kb20oKTsKLSAgICBNIGJpKHAsbik7IGJpLnNldFJhbmRvbSgpOwotICAgIE0gY3IobSxuKTsgY3Iuc2V0UmFuZG9tKCk7Ci0gICAgTSBjaShtLG4pOyBjaS5zZXRSYW5kb20oKTsKLSAgICAKKworI2lmZGVmIERFQ09VUExFRAorICBpZiAoKE51bVRyYWl0czxBOjpTY2FsYXI+OjpJc0NvbXBsZXgpICYmIChOdW1UcmFpdHM8Qjo6U2NhbGFyPjo6SXNDb21wbGV4KSkgeworICAgIE0gYXIobSwgcCk7CisgICAgYXIuc2V0UmFuZG9tKCk7CisgICAgTSBhaShtLCBwKTsKKyAgICBhaS5zZXRSYW5kb20oKTsKKyAgICBNIGJyKHAsIG4pOworICAgIGJyLnNldFJhbmRvbSgpOworICAgIE0gYmkocCwgbik7CisgICAgYmkuc2V0UmFuZG9tKCk7CisgICAgTSBjcihtLCBuKTsKKyAgICBjci5zZXRSYW5kb20oKTsKKyAgICBNIGNpKG0sIG4pOworICAgIGNpLnNldFJhbmRvbSgpOworCiAgICAgQmVuY2hUaW1lciB0OwotICAgIEJFTkNIKHQsIHRyaWVzLCByZXAsIG1hdGxhYl9jcGx4X2NwbHgoYXIsYWksYnIsYmksY3IsY2kpKTsKLSAgICBzdGQ6OmNvdXQgPDwgIlwibWF0bGFiXCIgY3B1ICAgICIgPDwgdC5iZXN0KENQVV9USU1FUikvcmVwICA8PCAicyAgXHQiIDw8IChkb3VibGUobSkqbipwKnJlcCoyL3QuYmVzdChDUFVfVElNRVIpKSoxZS05ICA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0LnRvdGFsKENQVV9USU1FUikgIDw8ICJzKVxuIjsKLSAgICBzdGQ6OmNvdXQgPDwgIlwibWF0bGFiXCIgcmVhbCAgICIgPDwgdC5iZXN0KFJFQUxfVElNRVIpL3JlcCA8PCAicyAgXHQiIDw8IChkb3VibGUobSkqbipwKnJlcCoyL3QuYmVzdChSRUFMX1RJTUVSKSkqMWUtOSA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0LnRvdGFsKFJFQUxfVElNRVIpIDw8ICJzKVxuIjsKKyAgICBCRU5DSCh0LCB0cmllcywgcmVwLCBtYXRsYWJfY3BseF9jcGx4KGFyLCBhaSwgYnIsIGJpLCBjciwgY2kpKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlwibWF0bGFiXCIgY3B1ICAgICIgPDwgdC5iZXN0KENQVV9USU1FUikgLyByZXAgPDwgInMgIFx0IgorICAgICAgICAgICAgICA8PCAoZG91YmxlKG0pICogbiAqIHAgKiByZXAgKiAyIC8gdC5iZXN0KENQVV9USU1FUikpICogMWUtOSA8PCAiIEdGTE9QUyBcdCgiIDw8IHQudG90YWwoQ1BVX1RJTUVSKQorICAgICAgICAgICAgICA8PCAicylcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJcIm1hdGxhYlwiIHJlYWwgICAiIDw8IHQuYmVzdChSRUFMX1RJTUVSKSAvIHJlcCA8PCAicyAgXHQiCisgICAgICAgICAgICAgIDw8IChkb3VibGUobSkgKiBuICogcCAqIHJlcCAqIDIgLyB0LmJlc3QoUkVBTF9USU1FUikpICogMWUtOSA8PCAiIEdGTE9QUyBcdCgiIDw8IHQudG90YWwoUkVBTF9USU1FUikKKyAgICAgICAgICAgICAgPDwgInMpXG4iOwogICB9Ci0gIGlmKCghTnVtVHJhaXRzPEE6OlNjYWxhcj46OklzQ29tcGxleCkgJiYgKE51bVRyYWl0czxCOjpTY2FsYXI+OjpJc0NvbXBsZXgpKQotICB7Ci0gICAgTSBhKG0scCk7ICBhLnNldFJhbmRvbSgpOwotICAgIE0gYnIocCxuKTsgYnIuc2V0UmFuZG9tKCk7Ci0gICAgTSBiaShwLG4pOyBiaS5zZXRSYW5kb20oKTsKLSAgICBNIGNyKG0sbik7IGNyLnNldFJhbmRvbSgpOwotICAgIE0gY2kobSxuKTsgY2kuc2V0UmFuZG9tKCk7Ci0gICAgCisgIGlmICgoIU51bVRyYWl0czxBOjpTY2FsYXI+OjpJc0NvbXBsZXgpICYmIChOdW1UcmFpdHM8Qjo6U2NhbGFyPjo6SXNDb21wbGV4KSkgeworICAgIE0gYShtLCBwKTsKKyAgICBhLnNldFJhbmRvbSgpOworICAgIE0gYnIocCwgbik7CisgICAgYnIuc2V0UmFuZG9tKCk7CisgICAgTSBiaShwLCBuKTsKKyAgICBiaS5zZXRSYW5kb20oKTsKKyAgICBNIGNyKG0sIG4pOworICAgIGNyLnNldFJhbmRvbSgpOworICAgIE0gY2kobSwgbik7CisgICAgY2kuc2V0UmFuZG9tKCk7CisKICAgICBCZW5jaFRpbWVyIHQ7Ci0gICAgQkVOQ0godCwgdHJpZXMsIHJlcCwgbWF0bGFiX3JlYWxfY3BseChhLGJyLGJpLGNyLGNpKSk7Ci0gICAgc3RkOjpjb3V0IDw8ICJcIm1hdGxhYlwiIGNwdSAgICAiIDw8IHQuYmVzdChDUFVfVElNRVIpL3JlcCAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90LmJlc3QoQ1BVX1RJTUVSKSkqMWUtOSAgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdC50b3RhbChDUFVfVElNRVIpICA8PCAicylcbiI7Ci0gICAgc3RkOjpjb3V0IDw8ICJcIm1hdGxhYlwiIHJlYWwgICAiIDw8IHQuYmVzdChSRUFMX1RJTUVSKS9yZXAgPDwgInMgIFx0IiA8PCAoZG91YmxlKG0pKm4qcCpyZXAqMi90LmJlc3QoUkVBTF9USU1FUikpKjFlLTkgPDwgICIgR0ZMT1BTIFx0KCIgPDwgdC50b3RhbChSRUFMX1RJTUVSKSA8PCAicylcbiI7CisgICAgQkVOQ0godCwgdHJpZXMsIHJlcCwgbWF0bGFiX3JlYWxfY3BseChhLCBiciwgYmksIGNyLCBjaSkpOworICAgIHN0ZDo6Y291dCA8PCAiXCJtYXRsYWJcIiBjcHUgICAgIiA8PCB0LmJlc3QoQ1BVX1RJTUVSKSAvIHJlcCA8PCAicyAgXHQiCisgICAgICAgICAgICAgIDw8IChkb3VibGUobSkgKiBuICogcCAqIHJlcCAqIDIgLyB0LmJlc3QoQ1BVX1RJTUVSKSkgKiAxZS05IDw8ICIgR0ZMT1BTIFx0KCIgPDwgdC50b3RhbChDUFVfVElNRVIpCisgICAgICAgICAgICAgIDw8ICJzKVxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgIlwibWF0bGFiXCIgcmVhbCAgICIgPDwgdC5iZXN0KFJFQUxfVElNRVIpIC8gcmVwIDw8ICJzICBcdCIKKyAgICAgICAgICAgICAgPDwgKGRvdWJsZShtKSAqIG4gKiBwICogcmVwICogMiAvIHQuYmVzdChSRUFMX1RJTUVSKSkgKiAxZS05IDw8ICIgR0ZMT1BTIFx0KCIgPDwgdC50b3RhbChSRUFMX1RJTUVSKQorICAgICAgICAgICAgICA8PCAicylcbiI7CiAgIH0KLSAgaWYoKE51bVRyYWl0czxBOjpTY2FsYXI+OjpJc0NvbXBsZXgpICYmICghTnVtVHJhaXRzPEI6OlNjYWxhcj46OklzQ29tcGxleCkpCi0gIHsKLSAgICBNIGFyKG0scCk7IGFyLnNldFJhbmRvbSgpOwotICAgIE0gYWkobSxwKTsgYWkuc2V0UmFuZG9tKCk7Ci0gICAgTSBiKHAsbik7ICBiLnNldFJhbmRvbSgpOwotICAgIE0gY3IobSxuKTsgY3Iuc2V0UmFuZG9tKCk7Ci0gICAgTSBjaShtLG4pOyBjaS5zZXRSYW5kb20oKTsKLSAgICAKKyAgaWYgKChOdW1UcmFpdHM8QTo6U2NhbGFyPjo6SXNDb21wbGV4KSAmJiAoIU51bVRyYWl0czxCOjpTY2FsYXI+OjpJc0NvbXBsZXgpKSB7CisgICAgTSBhcihtLCBwKTsKKyAgICBhci5zZXRSYW5kb20oKTsKKyAgICBNIGFpKG0sIHApOworICAgIGFpLnNldFJhbmRvbSgpOworICAgIE0gYihwLCBuKTsKKyAgICBiLnNldFJhbmRvbSgpOworICAgIE0gY3IobSwgbik7CisgICAgY3Iuc2V0UmFuZG9tKCk7CisgICAgTSBjaShtLCBuKTsKKyAgICBjaS5zZXRSYW5kb20oKTsKKwogICAgIEJlbmNoVGltZXIgdDsKLSAgICBCRU5DSCh0LCB0cmllcywgcmVwLCBtYXRsYWJfY3BseF9yZWFsKGFyLGFpLGIsY3IsY2kpKTsKLSAgICBzdGQ6OmNvdXQgPDwgIlwibWF0bGFiXCIgY3B1ICAgICIgPDwgdC5iZXN0KENQVV9USU1FUikvcmVwICA8PCAicyAgXHQiIDw8IChkb3VibGUobSkqbipwKnJlcCoyL3QuYmVzdChDUFVfVElNRVIpKSoxZS05ICA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0LnRvdGFsKENQVV9USU1FUikgIDw8ICJzKVxuIjsKLSAgICBzdGQ6OmNvdXQgPDwgIlwibWF0bGFiXCIgcmVhbCAgICIgPDwgdC5iZXN0KFJFQUxfVElNRVIpL3JlcCA8PCAicyAgXHQiIDw8IChkb3VibGUobSkqbipwKnJlcCoyL3QuYmVzdChSRUFMX1RJTUVSKSkqMWUtOSA8PCAgIiBHRkxPUFMgXHQoIiA8PCB0LnRvdGFsKFJFQUxfVElNRVIpIDw8ICJzKVxuIjsKKyAgICBCRU5DSCh0LCB0cmllcywgcmVwLCBtYXRsYWJfY3BseF9yZWFsKGFyLCBhaSwgYiwgY3IsIGNpKSk7CisgICAgc3RkOjpjb3V0IDw8ICJcIm1hdGxhYlwiIGNwdSAgICAiIDw8IHQuYmVzdChDUFVfVElNRVIpIC8gcmVwIDw8ICJzICBcdCIKKyAgICAgICAgICAgICAgPDwgKGRvdWJsZShtKSAqIG4gKiBwICogcmVwICogMiAvIHQuYmVzdChDUFVfVElNRVIpKSAqIDFlLTkgPDwgIiBHRkxPUFMgXHQoIiA8PCB0LnRvdGFsKENQVV9USU1FUikKKyAgICAgICAgICAgICAgPDwgInMpXG4iOworICAgIHN0ZDo6Y291dCA8PCAiXCJtYXRsYWJcIiByZWFsICAgIiA8PCB0LmJlc3QoUkVBTF9USU1FUikgLyByZXAgPDwgInMgIFx0IgorICAgICAgICAgICAgICA8PCAoZG91YmxlKG0pICogbiAqIHAgKiByZXAgKiAyIC8gdC5iZXN0KFJFQUxfVElNRVIpKSAqIDFlLTkgPDwgIiBHRkxPUFMgXHQoIiA8PCB0LnRvdGFsKFJFQUxfVElNRVIpCisgICAgICAgICAgICAgIDw8ICJzKVxuIjsKICAgfQotICAjZW5kaWYKKyNlbmRpZgogCiAgIHJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaF9tb3ZlX3NlbWFudGljcy5jcHAgYi9iZW5jaC9iZW5jaF9tb3ZlX3NlbWFudGljcy5jcHAKaW5kZXggMzIzZDgwNC4uOGI3MzQxYSAxMDA2NDQKLS0tIGEvYmVuY2gvYmVuY2hfbW92ZV9zZW1hbnRpY3MuY3BwCisrKyBiL2JlbmNoL2JlbmNoX21vdmVfc2VtYW50aWNzLmNwcApAQCAtMTYsMjMgKzE2LDIwIEBACiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogdGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIGNvcHlfbWF0cml4KE1hdHJpeFR5cGUmIG0pCi17Cit2b2lkIGNvcHlfbWF0cml4KE1hdHJpeFR5cGUmIG0pIHsKICAgTWF0cml4VHlwZSB0bXAobSk7CiAgIG0gPSB0bXA7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCBtb3ZlX21hdHJpeChNYXRyaXhUeXBlJiYgbSkKLXsKK3ZvaWQgbW92ZV9tYXRyaXgoTWF0cml4VHlwZSYmIG0pIHsKICAgTWF0cml4VHlwZSB0bXAoc3RkOjptb3ZlKG0pKTsKICAgbSA9IHN0ZDo6bW92ZSh0bXApOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIGJlbmNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBsYWJlbCkKLXsKLSAgdXNpbmcgTWF0cml4VHlwZSA9IEVpZ2VuOjpNYXRyaXg8RWlnZW46Ok1vdmFibGVTY2FsYXI8U2NhbGFyPiwxLDEwPjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGJlbmNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBsYWJlbCkgeworICB1c2luZyBNYXRyaXhUeXBlID0gRWlnZW46Ok1hdHJpeDxFaWdlbjo6TW92YWJsZVNjYWxhcjxTY2FsYXI+LCAxLCAxMD47CiAgIEVpZ2VuOjpCZW5jaFRpbWVyIHQ7CiAKICAgaW50IHRyaWVzID0gMTA7CkBAIC00MiwxNiArMzksMTQgQEAKICAgTWF0cml4VHlwZSBkZXN0OwogCiAgIEJFTkNIKHQsIHRyaWVzLCByZXAsIGNvcHlfbWF0cml4KGRhdGEpKTsKLSAgc3RkOjpjb3V0IDw8IGxhYmVsIDw8ICIgY29weSBzZW1hbnRpY3M6ICIgPDwgMWUzKnQuYmVzdChFaWdlbjo6Q1BVX1RJTUVSKSA8PCAiIG1zIiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCBsYWJlbCA8PCAiIGNvcHkgc2VtYW50aWNzOiAiIDw8IDFlMyAqIHQuYmVzdChFaWdlbjo6Q1BVX1RJTUVSKSA8PCAiIG1zIiA8PCBzdGQ6OmVuZGw7CiAKICAgQkVOQ0godCwgdHJpZXMsIHJlcCwgbW92ZV9tYXRyaXgoc3RkOjptb3ZlKGRhdGEpKSk7Ci0gIHN0ZDo6Y291dCA8PCBsYWJlbCA8PCAiIG1vdmUgc2VtYW50aWNzOiAiIDw8IDFlMyp0LmJlc3QoRWlnZW46OkNQVV9USU1FUikgPDwgIiBtcyIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgbGFiZWwgPDwgIiBtb3ZlIHNlbWFudGljczogIiA8PCAxZTMgKiB0LmJlc3QoRWlnZW46OkNQVV9USU1FUikgPDwgIiBtcyIgPDwgc3RkOjplbmRsOwogfQogCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgYmVuY2g8ZmxvYXQ+KCJmbG9hdCIpOwogICBiZW5jaDxkb3VibGU+KCJkb3VibGUiKTsKICAgcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNoX25vcm0uY3BwIGIvYmVuY2gvYmVuY2hfbm9ybS5jcHAKaW5kZXggNTkyZjI1ZC4uZmI1M2I4NSAxMDA2NDQKLS0tIGEvYmVuY2gvYmVuY2hfbm9ybS5jcHAKKysrIGIvYmVuY2gvYmVuY2hfbm9ybS5jcHAKQEAgLTUsNzkgKzUsNjQgQEAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1FSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBUOjpTY2FsYXIgc3FzdW1Ob3JtKFQmIHYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciBzcXN1bU5vcm0oVCYgdikgewogICByZXR1cm4gdi5ub3JtKCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1FSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBUOjpTY2FsYXIgc3RhYmxlTm9ybShUJiB2KQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBUOjpTY2FsYXIgc3RhYmxlTm9ybShUJiB2KSB7CiAgIHJldHVybiB2LnN0YWJsZU5vcm0oKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLUVJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciBoeXBvdE5vcm0oVCYgdikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgVDo6U2NhbGFyIGh5cG90Tm9ybShUJiB2KSB7CiAgIHJldHVybiB2Lmh5cG90Tm9ybSgpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgVDo6U2NhbGFyIGJsdWVOb3JtKFQmIHYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciBibHVlTm9ybShUJiB2KSB7CiAgIHJldHVybiB2LmJsdWVOb3JtKCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1FSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBUOjpTY2FsYXIgbGFwYWNrTm9ybShUJiB2KQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBUOjpTY2FsYXIgbGFwYWNrTm9ybShUJiB2KSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVDo6U2NhbGFyIFNjYWxhcjsKICAgaW50IG4gPSB2LnNpemUoKTsKICAgU2NhbGFyIHNjYWxlID0gMDsKICAgU2NhbGFyIHNzcSA9IDE7Ci0gIGZvciAoaW50IGk9MDtpPG47KytpKQotICB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgU2NhbGFyIGF4ID0gc3RkOjphYnModi5jb2VmZihpKSk7Ci0gICAgaWYgKHNjYWxlID49IGF4KQotICAgIHsKLSAgICAgIHNzcSArPSBudW1leHQ6OmFiczIoYXgvc2NhbGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc3NxID0gU2NhbGFyKDEpICsgc3NxICogbnVtZXh0OjphYnMyKHNjYWxlL2F4KTsKKyAgICBpZiAoc2NhbGUgPj0gYXgpIHsKKyAgICAgIHNzcSArPSBudW1leHQ6OmFiczIoYXggLyBzY2FsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNzcSA9IFNjYWxhcigxKSArIHNzcSAqIG51bWV4dDo6YWJzMihzY2FsZSAvIGF4KTsKICAgICAgIHNjYWxlID0gYXg7CiAgICAgfQogICB9CiAgIHJldHVybiBzY2FsZSAqIHN0ZDo6c3FydChzc3EpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgVDo6U2NhbGFyIHR3b3Bhc3NOb3JtKFQmIHYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciB0d29wYXNzTm9ybShUJiB2KSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVDo6U2NhbGFyIFNjYWxhcjsKICAgU2NhbGFyIHMgPSB2LmFycmF5KCkuYWJzKCkubWF4Q29lZmYoKTsKLSAgcmV0dXJuIHMqKHYvcykubm9ybSgpOworICByZXR1cm4gcyAqICh2IC8gcykubm9ybSgpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgVDo6U2NhbGFyIGJsMnBhc3NOb3JtKFQmIHYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciBibDJwYXNzTm9ybShUJiB2KSB7CiAgIHJldHVybiB2LnN0YWJsZU5vcm0oKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLUVJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciBkaXZhY05vcm0oVCYgdikKLXsKLSAgaW50IG4gPXYuc2l6ZSgpIC8gMjsKLSAgZm9yIChpbnQgaT0wO2k8bjsrK2kpCi0gICAgdihpKSA9IHYoMippKSp2KDIqaSkgKyB2KDIqaSsxKSp2KDIqaSsxKTsKLSAgbiA9IG4vMjsKLSAgd2hpbGUgKG4+MCkKLSAgewotICAgIGZvciAoaW50IGk9MDtpPG47KytpKQotICAgICAgdihpKSA9IHYoMippKSArIHYoMippKzEpOwotICAgIG4gPSBuLzI7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciBkaXZhY05vcm0oVCYgdikgeworICBpbnQgbiA9IHYuc2l6ZSgpIC8gMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHYoaSkgPSB2KDIgKiBpKSAqIHYoMiAqIGkpICsgdigyICogaSArIDEpICogdigyICogaSArIDEpOworICBuID0gbiAvIDI7CisgIHdoaWxlIChuID4gMCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB2KGkpID0gdigyICogaSkgKyB2KDIgKiBpICsgMSk7CisgICAgbiA9IG4gLyAyOwogICB9CiAgIHJldHVybiBzdGQ6OnNxcnQodigwKSk7CiB9CkBAIC04NSw2MSArNzAsNjEgQEAKIG5hbWVzcGFjZSBFaWdlbiB7CiBuYW1lc3BhY2UgaW50ZXJuYWwgewogI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRQotUGFja2V0NGYgcGx0KGNvbnN0IFBhY2tldDRmJiBhLCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gX21tX2NtcGx0X3BzKGEsYik7IH0KLVBhY2tldDJkIHBsdChjb25zdCBQYWNrZXQyZCYgYSwgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV9jbXBsdF9wZChhLGIpOyB9CitQYWNrZXQ0ZiBwbHQoY29uc3QgUGFja2V0NGYmIGEsIFBhY2tldDRmJiBiKSB7IHJldHVybiBfbW1fY21wbHRfcHMoYSwgYik7IH0KK1BhY2tldDJkIHBsdChjb25zdCBQYWNrZXQyZCYgYSwgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV9jbXBsdF9wZChhLCBiKTsgfQogCi1QYWNrZXQ0ZiBwYW5kbm90KGNvbnN0IFBhY2tldDRmJiBhLCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gX21tX2FuZG5vdF9wcyhhLGIpOyB9Ci1QYWNrZXQyZCBwYW5kbm90KGNvbnN0IFBhY2tldDJkJiBhLCBQYWNrZXQyZCYgYikgeyByZXR1cm4gX21tX2FuZG5vdF9wZChhLGIpOyB9CitQYWNrZXQ0ZiBwYW5kbm90KGNvbnN0IFBhY2tldDRmJiBhLCBQYWNrZXQ0ZiYgYikgeyByZXR1cm4gX21tX2FuZG5vdF9wcyhhLCBiKTsgfQorUGFja2V0MmQgcGFuZG5vdChjb25zdCBQYWNrZXQyZCYgYSwgUGFja2V0MmQmIGIpIHsgcmV0dXJuIF9tbV9hbmRub3RfcGQoYSwgYik7IH0KICNlbmRpZgotfQotfQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLUVJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFQ6OlNjYWxhciBwYmx1ZU5vcm0oY29uc3QgVCYgdikKLXsKLSAgI2lmbmRlZiBFSUdFTl9WRUNUT1JJWkUKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgVDo6U2NhbGFyIHBibHVlTm9ybShjb25zdCBUJiB2KSB7CisjaWZuZGVmIEVJR0VOX1ZFQ1RPUklaRQogICByZXR1cm4gdi5ibHVlTm9ybSgpOwotICAjZWxzZQorI2Vsc2UKICAgdHlwZWRlZiB0eXBlbmFtZSBUOjpTY2FsYXIgU2NhbGFyOwogCiAgIHN0YXRpYyBpbnQgbm1heCA9IDA7CiAgIHN0YXRpYyBTY2FsYXIgYjEsIGIyLCBzMW0sIHMybSwgb3ZlcmZsLCByYmlnLCByZWxlcnI7CiAgIGludCBuOwogCi0gIGlmKG5tYXggPD0gMCkKLSAgeworICBpZiAobm1heCA8PSAwKSB7CiAgICAgaW50IG5iaWcsIGliZXRhLCBpdCwgaWVtaW4sIGllbWF4LCBpZXhwOwogICAgIFNjYWxhciBhYmlnLCBlcHM7CiAKLSAgICBuYmlnICA9IE51bVRyYWl0czxpbnQ+OjpoaWdoZXN0KCk7ICAgICAgICAgIC8vIGxhcmdlc3QgaW50ZWdlcgotICAgIGliZXRhID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjpyYWRpeDsgLy8gTnVtVHJhaXRzPFNjYWxhcj46OkJhc2U7ICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzCi0gICAgaXQgICAgPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZGlnaXRzKCk7ICAgICAgICAvLyBOdW1UcmFpdHM8U2NhbGFyPjo6TWFudGlzc2E7ICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBiYXNlLWJldGEgZGlnaXRzIGluIG1hbnRpc3NhCisgICAgbmJpZyA9IE51bVRyYWl0czxpbnQ+OjpoaWdoZXN0KCk7ICAgICAgICAgICAgLy8gbGFyZ2VzdCBpbnRlZ2VyCisgICAgaWJldGEgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OnJhZGl4OyAgLy8gTnVtVHJhaXRzPFNjYWxhcj46OkJhc2U7ICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0aW5nLXBvaW50IG51bWJlcnMKKyAgICBpdCA9IE51bVRyYWl0czxTY2FsYXI+OjpkaWdpdHMoKTsgIC8vIE51bVRyYWl0czxTY2FsYXI+OjpNYW50aXNzYTsgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJhc2UtYmV0YSBkaWdpdHMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnRpc3NhCiAgICAgaWVtaW4gPSBOdW1UcmFpdHM8U2NhbGFyPjo6bWluX2V4cG9uZW50KCk7ICAvLyBtaW5pbXVtIGV4cG9uZW50CiAgICAgaWVtYXggPSBOdW1UcmFpdHM8U2NhbGFyPjo6bWF4X2V4cG9uZW50KCk7ICAvLyBtYXhpbXVtIGV4cG9uZW50Ci0gICAgcmJpZyAgPSBOdW1UcmFpdHM8U2NhbGFyPjo6aGlnaGVzdCgpOyAgICAgICAvLyBsYXJnZXN0IGZsb2F0aW5nLXBvaW50IG51bWJlcgorICAgIHJiaWcgPSBOdW1UcmFpdHM8U2NhbGFyPjo6aGlnaGVzdCgpOyAgICAgICAgLy8gbGFyZ2VzdCBmbG9hdGluZy1wb2ludCBudW1iZXIKIAogICAgIC8vIENoZWNrIHRoZSBiYXNpYyBtYWNoaW5lLWRlcGVuZGVudCBjb25zdGFudHMuCi0gICAgaWYoaWVtaW4gPiAxIC0gMippdCB8fCAxK2l0PmllbWF4IHx8IChpdD09MiAmJiBpYmV0YTw1KQotICAgICAgfHwgKGl0PD00ICYmIGliZXRhIDw9IDMgKSB8fCBpdDwyKQotICAgIHsKKyAgICBpZiAoaWVtaW4gPiAxIC0gMiAqIGl0IHx8IDEgKyBpdCA+IGllbWF4IHx8IChpdCA9PSAyICYmIGliZXRhIDwgNSkgfHwgKGl0IDw9IDQgJiYgaWJldGEgPD0gMykgfHwgaXQgPCAyKSB7CiAgICAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgInRoZSBhbGdvcml0aG0gY2Fubm90IGJlIGd1YXJhbnRlZWQgb24gdGhpcyBjb21wdXRlciIpOwogICAgIH0KLSAgICBpZXhwICA9IC0oKDEtaWVtaW4pLzIpOwotICAgIGIxICAgID0gc3RkOjpwb3coaWJldGEsIGlleHApOyAgLy8gbG93ZXIgYm91bmRhcnkgb2YgbWlkcmFuZ2UKLSAgICBpZXhwICA9IChpZW1heCArIDEgLSBpdCkvMjsKLSAgICBiMiAgICA9IHN0ZDo6cG93KGliZXRhLGlleHApOyAgIC8vIHVwcGVyIGJvdW5kYXJ5IG9mIG1pZHJhbmdlCisgICAgaWV4cCA9IC0oKDEgLSBpZW1pbikgLyAyKTsKKyAgICBiMSA9IHN0ZDo6cG93KGliZXRhLCBpZXhwKTsgIC8vIGxvd2VyIGJvdW5kYXJ5IG9mIG1pZHJhbmdlCisgICAgaWV4cCA9IChpZW1heCArIDEgLSBpdCkgLyAyOworICAgIGIyID0gc3RkOjpwb3coaWJldGEsIGlleHApOyAgLy8gdXBwZXIgYm91bmRhcnkgb2YgbWlkcmFuZ2UKIAotICAgIGlleHAgID0gKDItaWVtaW4pLzI7Ci0gICAgczFtICAgPSBzdGQ6OnBvdyhpYmV0YSxpZXhwKTsgICAvLyBzY2FsaW5nIGZhY3RvciBmb3IgbG93ZXIgcmFuZ2UKLSAgICBpZXhwICA9IC0gKChpZW1heCtpdCkvMik7Ci0gICAgczJtICAgPSBzdGQ6OnBvdyhpYmV0YSxpZXhwKTsgICAvLyBzY2FsaW5nIGZhY3RvciBmb3IgdXBwZXIgcmFuZ2UKKyAgICBpZXhwID0gKDIgLSBpZW1pbikgLyAyOworICAgIHMxbSA9IHN0ZDo6cG93KGliZXRhLCBpZXhwKTsgIC8vIHNjYWxpbmcgZmFjdG9yIGZvciBsb3dlciByYW5nZQorICAgIGlleHAgPSAtKChpZW1heCArIGl0KSAvIDIpOworICAgIHMybSA9IHN0ZDo6cG93KGliZXRhLCBpZXhwKTsgIC8vIHNjYWxpbmcgZmFjdG9yIGZvciB1cHBlciByYW5nZQogCi0gICAgb3ZlcmZsICA9IHJiaWcqczJtOyAgICAgICAgICAvLyBvdmVyZmxvdyBib3VuZGFyeSBmb3IgYWJpZwotICAgIGVwcyAgICAgPSBzdGQ6OnBvdyhpYmV0YSwgMS1pdCk7Ci0gICAgcmVsZXJyICA9IHN0ZDo6c3FydChlcHMpOyAgICAgIC8vIHRvbGVyYW5jZSBmb3IgbmVnbGVjdGluZyBhc21sCi0gICAgYWJpZyAgICA9IDEuMC9lcHMgLSAxLjA7Ci0gICAgaWYgKFNjYWxhcihuYmlnKT5hYmlnKSAgbm1heCA9IGFiaWc7ICAvLyBsYXJnZXN0IHNhZmUgbgotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIG5tYXggPSBuYmlnOworICAgIG92ZXJmbCA9IHJiaWcgKiBzMm07ICAvLyBvdmVyZmxvdyBib3VuZGFyeSBmb3IgYWJpZworICAgIGVwcyA9IHN0ZDo6cG93KGliZXRhLCAxIC0gaXQpOworICAgIHJlbGVyciA9IHN0ZDo6c3FydChlcHMpOyAgLy8gdG9sZXJhbmNlIGZvciBuZWdsZWN0aW5nIGFzbWwKKyAgICBhYmlnID0gMS4wIC8gZXBzIC0gMS4wOworICAgIGlmIChTY2FsYXIobmJpZykgPiBhYmlnKQorICAgICAgbm1heCA9IGFiaWc7ICAvLyBsYXJnZXN0IHNhZmUgbgorICAgIGVsc2UKKyAgICAgIG5tYXggPSBuYmlnOwogICB9CiAKICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKQEAgLTE0OSwxMDggKzEzNCwxMDMgQEAKICAgUGFja2V0IHBhYmlnID0gaW50ZXJuYWw6OnBzZXQxPFBhY2tldD4oU2NhbGFyKDApKTsKICAgUGFja2V0IHBzMm0gPSBpbnRlcm5hbDo6cHNldDE8UGFja2V0PihzMm0pOwogICBQYWNrZXQgcHMxbSA9IGludGVybmFsOjpwc2V0MTxQYWNrZXQ+KHMxbSk7Ci0gIFBhY2tldCBwYjIgID0gaW50ZXJuYWw6OnBzZXQxPFBhY2tldD4oYjIpOwotICBQYWNrZXQgcGIxICA9IGludGVybmFsOjpwc2V0MTxQYWNrZXQ+KGIxKTsKLSAgZm9yKGludCBqPTA7IGo8di5zaXplKCk7IGorPXBzKQotICB7CisgIFBhY2tldCBwYjIgPSBpbnRlcm5hbDo6cHNldDE8UGFja2V0PihiMik7CisgIFBhY2tldCBwYjEgPSBpbnRlcm5hbDo6cHNldDE8UGFja2V0PihiMSk7CisgIGZvciAoaW50IGogPSAwOyBqIDwgdi5zaXplKCk7IGogKz0gcHMpIHsKICAgICBQYWNrZXQgYXggPSBpbnRlcm5hbDo6cGFicyh2LnRlbXBsYXRlIHBhY2tldDxBbGlnbmVkPihqKSk7Ci0gICAgUGFja2V0IGF4X3MybSA9IGludGVybmFsOjpwbXVsKGF4LHBzMm0pOwotICAgIFBhY2tldCBheF9zMW0gPSBpbnRlcm5hbDo6cG11bChheCxwczFtKTsKLSAgICBQYWNrZXQgbWFza0JpZyA9IGludGVybmFsOjpwbHQocGIyLGF4KTsKLSAgICBQYWNrZXQgbWFza1NtbCA9IGludGVybmFsOjpwbHQoYXgscGIxKTsKKyAgICBQYWNrZXQgYXhfczJtID0gaW50ZXJuYWw6OnBtdWwoYXgsIHBzMm0pOworICAgIFBhY2tldCBheF9zMW0gPSBpbnRlcm5hbDo6cG11bChheCwgcHMxbSk7CisgICAgUGFja2V0IG1hc2tCaWcgPSBpbnRlcm5hbDo6cGx0KHBiMiwgYXgpOworICAgIFBhY2tldCBtYXNrU21sID0gaW50ZXJuYWw6OnBsdChheCwgcGIxKTsKIAotLy8gICAgIFBhY2tldCBtYXNrTWVkID0gaW50ZXJuYWw6OnBhbmQobWFza1NtbCxtYXNrQmlnKTsKLS8vICAgICBQYWNrZXQgc2NhbGUgPSBpbnRlcm5hbDo6cHNldDEoU2NhbGFyKDApKTsKLS8vICAgICBzY2FsZSA9IGludGVybmFsOjpwb3Ioc2NhbGUsIGludGVybmFsOjpwYW5kKG1hc2tCaWcscHMybSkpOwotLy8gICAgIHNjYWxlID0gaW50ZXJuYWw6OnBvcihzY2FsZSwgaW50ZXJuYWw6OnBhbmQobWFza1NtbCxwczFtKSk7Ci0vLyAgICAgc2NhbGUgPSBpbnRlcm5hbDo6cG9yKHNjYWxlLCBpbnRlcm5hbDo6cGFuZG5vdChpbnRlcm5hbDo6cHNldDEoU2NhbGFyKDEpKSxtYXNrTWVkKSk7Ci0vLyAgICAgYXggPSBpbnRlcm5hbDo6cG11bChheCxzY2FsZSk7Ci0vLyAgICAgYXggPSBpbnRlcm5hbDo6cG11bChheCxheCk7Ci0vLyAgICAgcGFiaWcgPSBpbnRlcm5hbDo6cGFkZChwYWJpZywgaW50ZXJuYWw6OnBhbmQobWFza0JpZywgYXgpKTsKLS8vICAgICBwYXNtbCA9IGludGVybmFsOjpwYWRkKHBhc21sLCBpbnRlcm5hbDo6cGFuZChtYXNrU21sLCBheCkpOwotLy8gICAgIHBhbWVkID0gaW50ZXJuYWw6OnBhZGQocGFtZWQsIGludGVybmFsOjpwYW5kbm90KGF4LG1hc2tNZWQpKTsKKyAgICAvLyAgICAgUGFja2V0IG1hc2tNZWQgPSBpbnRlcm5hbDo6cGFuZChtYXNrU21sLG1hc2tCaWcpOworICAgIC8vICAgICBQYWNrZXQgc2NhbGUgPSBpbnRlcm5hbDo6cHNldDEoU2NhbGFyKDApKTsKKyAgICAvLyAgICAgc2NhbGUgPSBpbnRlcm5hbDo6cG9yKHNjYWxlLCBpbnRlcm5hbDo6cGFuZChtYXNrQmlnLHBzMm0pKTsKKyAgICAvLyAgICAgc2NhbGUgPSBpbnRlcm5hbDo6cG9yKHNjYWxlLCBpbnRlcm5hbDo6cGFuZChtYXNrU21sLHBzMW0pKTsKKyAgICAvLyAgICAgc2NhbGUgPSBpbnRlcm5hbDo6cG9yKHNjYWxlLCBpbnRlcm5hbDo6cGFuZG5vdChpbnRlcm5hbDo6cHNldDEoU2NhbGFyKDEpKSxtYXNrTWVkKSk7CisgICAgLy8gICAgIGF4ID0gaW50ZXJuYWw6OnBtdWwoYXgsc2NhbGUpOworICAgIC8vICAgICBheCA9IGludGVybmFsOjpwbXVsKGF4LGF4KTsKKyAgICAvLyAgICAgcGFiaWcgPSBpbnRlcm5hbDo6cGFkZChwYWJpZywgaW50ZXJuYWw6OnBhbmQobWFza0JpZywgYXgpKTsKKyAgICAvLyAgICAgcGFzbWwgPSBpbnRlcm5hbDo6cGFkZChwYXNtbCwgaW50ZXJuYWw6OnBhbmQobWFza1NtbCwgYXgpKTsKKyAgICAvLyAgICAgcGFtZWQgPSBpbnRlcm5hbDo6cGFkZChwYW1lZCwgaW50ZXJuYWw6OnBhbmRub3QoYXgsbWFza01lZCkpOwogCi0KLSAgICBwYWJpZyA9IGludGVybmFsOjpwYWRkKHBhYmlnLCBpbnRlcm5hbDo6cGFuZChtYXNrQmlnLCBpbnRlcm5hbDo6cG11bChheF9zMm0sYXhfczJtKSkpOwotICAgIHBhc21sID0gaW50ZXJuYWw6OnBhZGQocGFzbWwsIGludGVybmFsOjpwYW5kKG1hc2tTbWwsIGludGVybmFsOjpwbXVsKGF4X3MxbSxheF9zMW0pKSk7Ci0gICAgcGFtZWQgPSBpbnRlcm5hbDo6cGFkZChwYW1lZCwgaW50ZXJuYWw6OnBhbmRub3QoaW50ZXJuYWw6OnBtdWwoYXgsYXgpLGludGVybmFsOjpwYW5kKG1hc2tTbWwsbWFza0JpZykpKTsKKyAgICBwYWJpZyA9IGludGVybmFsOjpwYWRkKHBhYmlnLCBpbnRlcm5hbDo6cGFuZChtYXNrQmlnLCBpbnRlcm5hbDo6cG11bChheF9zMm0sIGF4X3MybSkpKTsKKyAgICBwYXNtbCA9IGludGVybmFsOjpwYWRkKHBhc21sLCBpbnRlcm5hbDo6cGFuZChtYXNrU21sLCBpbnRlcm5hbDo6cG11bChheF9zMW0sIGF4X3MxbSkpKTsKKyAgICBwYW1lZCA9IGludGVybmFsOjpwYWRkKHBhbWVkLCBpbnRlcm5hbDo6cGFuZG5vdChpbnRlcm5hbDo6cG11bChheCwgYXgpLCBpbnRlcm5hbDo6cGFuZChtYXNrU21sLCBtYXNrQmlnKSkpOwogICB9CiAgIFNjYWxhciBhYmlnID0gaW50ZXJuYWw6OnByZWR1eChwYWJpZyk7CiAgIFNjYWxhciBhc21sID0gaW50ZXJuYWw6OnByZWR1eChwYXNtbCk7CiAgIFNjYWxhciBhbWVkID0gaW50ZXJuYWw6OnByZWR1eChwYW1lZCk7Ci0gIGlmKGFiaWcgPiBTY2FsYXIoMCkpCi0gIHsKKyAgaWYgKGFiaWcgPiBTY2FsYXIoMCkpIHsKICAgICBhYmlnID0gc3RkOjpzcXJ0KGFiaWcpOwotICAgIGlmKGFiaWcgPiBvdmVyZmwpCi0gICAgeworICAgIGlmIChhYmlnID4gb3ZlcmZsKSB7CiAgICAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgIm92ZXJmbG93Iik7CiAgICAgICByZXR1cm4gcmJpZzsKICAgICB9Ci0gICAgaWYoYW1lZCA+IFNjYWxhcigwKSkKLSAgICB7Ci0gICAgICBhYmlnID0gYWJpZy9zMm07CisgICAgaWYgKGFtZWQgPiBTY2FsYXIoMCkpIHsKKyAgICAgIGFiaWcgPSBhYmlnIC8gczJtOwogICAgICAgYW1lZCA9IHN0ZDo6c3FydChhbWVkKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBhYmlnL3MybTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGFiaWcgLyBzMm07CiAgICAgfQogCi0gIH0KLSAgZWxzZSBpZihhc21sID4gU2NhbGFyKDApKQotICB7Ci0gICAgaWYgKGFtZWQgPiBTY2FsYXIoMCkpCi0gICAgeworICB9IGVsc2UgaWYgKGFzbWwgPiBTY2FsYXIoMCkpIHsKKyAgICBpZiAoYW1lZCA+IFNjYWxhcigwKSkgewogICAgICAgYWJpZyA9IHN0ZDo6c3FydChhbWVkKTsKICAgICAgIGFtZWQgPSBzdGQ6OnNxcnQoYXNtbCkgLyBzMW07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBzdGQ6OnNxcnQoYXNtbCkgLyBzMW07CiAgICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gc3RkOjpzcXJ0KGFzbWwpL3MxbTsKLSAgICB9Ci0gIH0KLSAgZWxzZQotICB7CisgIH0gZWxzZSB7CiAgICAgcmV0dXJuIHN0ZDo6c3FydChhbWVkKTsKICAgfQogICBhc21sID0gc3RkOjptaW4oYWJpZywgYW1lZCk7CiAgIGFiaWcgPSBzdGQ6Om1heChhYmlnLCBhbWVkKTsKLSAgaWYoYXNtbCA8PSBhYmlnKnJlbGVycikKKyAgaWYgKGFzbWwgPD0gYWJpZyAqIHJlbGVycikKICAgICByZXR1cm4gYWJpZzsKICAgZWxzZQotICAgIHJldHVybiBhYmlnICogc3RkOjpzcXJ0KFNjYWxhcigxKSArIG51bWV4dDo6YWJzMihhc21sL2FiaWcpKTsKLSAgI2VuZGlmCisgICAgcmV0dXJuIGFiaWcgKiBzdGQ6OnNxcnQoU2NhbGFyKDEpICsgbnVtZXh0OjphYnMyKGFzbWwgLyBhYmlnKSk7CisjZW5kaWYKIH0KIAotI2RlZmluZSBCRU5DSF9QRVJGKE5STSkgeyBcCi0gIGZsb2F0IGFmID0gMDsgZG91YmxlIGFkID0gMDsgc3RkOjpjb21wbGV4PGZsb2F0PiBhYyA9IDA7IFwKLSAgRWlnZW46OkJlbmNoVGltZXIgdGYsIHRkLCB0Y2Y7IHRmLnJlc2V0KCk7IHRkLnJlc2V0KCk7IHRjZi5yZXNldCgpO1wKLSAgZm9yIChpbnQgaz0wOyBrPHRyaWVzOyArK2spIHsgXAotICAgIHRmLnN0YXJ0KCk7IFwKLSAgICBmb3IgKGludCBpPTA7IGk8aXRlcnM7ICsraSkgeyBhZiArPSBOUk0odmYpOyB9IFwKLSAgICB0Zi5zdG9wKCk7IFwKLSAgfSBcCi0gIGZvciAoaW50IGs9MDsgazx0cmllczsgKytrKSB7IFwKLSAgICB0ZC5zdGFydCgpOyBcCi0gICAgZm9yIChpbnQgaT0wOyBpPGl0ZXJzOyArK2kpIHsgYWQgKz0gTlJNKHZkKTsgfSBcCi0gICAgdGQuc3RvcCgpOyBcCi0gIH0gXAotICAvKmZvciAoaW50IGs9MDsgazxzdGQ6Om1heCgxLHRyaWVzLzMpOyArK2spIHsgXAotICAgIHRjZi5zdGFydCgpOyBcCi0gICAgZm9yIChpbnQgaT0wOyBpPGl0ZXJzOyArK2kpIHsgYWMgKz0gTlJNKHZjZik7IH0gXAotICAgIHRjZi5zdG9wKCk7IFwKLSAgfSAqL1wKLSAgc3RkOjpjb3V0IDw8ICNOUk0gPDwgIlx0IiA8PCB0Zi52YWx1ZSgpIDw8ICIgICAiIDw8IHRkLnZhbHVlKCkgPDwgICIgICAgIiA8PCB0Y2YudmFsdWUoKSA8PCAiXG4iOyBcCi19CisjZGVmaW5lIEJFTkNIX1BFUkYoTlJNKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0IGFmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlIGFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGFjID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpCZW5jaFRpbWVyIHRmLCB0ZCwgdGNmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGYucmVzZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZC5yZXNldCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRjZi5yZXNldCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpbnQgayA9IDA7IGsgPCB0cmllczsgKytrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRmLnN0YXJ0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyczsgKytpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFmICs9IE5STSh2Zik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGYuc3RvcCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGludCBrID0gMDsgayA8IHRyaWVzOyArK2spIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGQuc3RhcnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJzOyArK2kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYWQgKz0gTlJNKHZkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0ZC5zdG9wKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qZm9yIChpbnQgaz0wOyBrPHN0ZDo6bWF4KDEsdHJpZXMvMyk7ICsraykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0Y2Yuc3RhcnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvciAoaW50IGk9MDsgaTxpdGVyczsgKytpKSB7IGFjICs9IE5STSh2Y2YpOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGNmLnN0b3AoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGQ6OmNvdXQgPDwgI05STSA8PCAiXHQiIDw8IHRmLnZhbHVlKCkgPDwgIiAgICIgPDwgdGQudmFsdWUoKSA8PCAiICAgICIgPDwgdGNmLnZhbHVlKCkgPDwgIlxuIjsgXAorICB9CiAKLXZvaWQgY2hlY2tfYWNjdXJhY3koZG91YmxlIGJhc2VmLCBkb3VibGUgYmFzZWQsIGludCBzKQotewordm9pZCBjaGVja19hY2N1cmFjeShkb3VibGUgYmFzZWYsIGRvdWJsZSBiYXNlZCwgaW50IHMpIHsKICAgZG91YmxlIHlmID0gYmFzZWYgKiBzdGQ6OmFicyhpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKSk7CiAgIGRvdWJsZSB5ZCA9IGJhc2VkICogc3RkOjphYnMoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCkpOwogICBWZWN0b3JYZiB2ZiA9IFZlY3RvclhmOjpPbmVzKHMpICogeWY7CiAgIFZlY3RvclhkIHZkID0gVmVjdG9yWGQ6Ok9uZXMocykgKiB5ZDsKIAotICBzdGQ6OmNvdXQgPDwgInJlZmVyZW5jZVx0IiA8PCBzdGQ6OnNxcnQoZG91YmxlKHMpKSp5ZiA8PCAiXHQiIDw8IHN0ZDo6c3FydChkb3VibGUocykpKnlkIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAicmVmZXJlbmNlXHQiIDw8IHN0ZDo6c3FydChkb3VibGUocykpICogeWYgPDwgIlx0IiA8PCBzdGQ6OnNxcnQoZG91YmxlKHMpKSAqIHlkIDw8ICJcbiI7CiAgIHN0ZDo6Y291dCA8PCAic3FzdW1Ob3JtXHQiIDw8IHNxc3VtTm9ybSh2ZikgPDwgIlx0IiA8PCBzcXN1bU5vcm0odmQpIDw8ICJcbiI7CiAgIHN0ZDo6Y291dCA8PCAiaHlwb3ROb3JtXHQiIDw8IGh5cG90Tm9ybSh2ZikgPDwgIlx0IiA8PCBoeXBvdE5vcm0odmQpIDw8ICJcbiI7CiAgIHN0ZDo6Y291dCA8PCAiYmx1ZU5vcm1cdCIgPDwgYmx1ZU5vcm0odmYpIDw8ICJcdCIgPDwgYmx1ZU5vcm0odmQpIDw8ICJcbiI7CkBAIC0yNjAsMzQgKzI0MCwzOCBAQAogICBzdGQ6OmNvdXQgPDwgImJsMnBhc3NOb3JtXHQiIDw8IGJsMnBhc3NOb3JtKHZmKSA8PCAiXHQiIDw8IGJsMnBhc3NOb3JtKHZkKSA8PCAiXG4iOwogfQogCi12b2lkIGNoZWNrX2FjY3VyYWN5X3ZhcihpbnQgZWYwLCBpbnQgZWYxLCBpbnQgZWQwLCBpbnQgZWQxLCBpbnQgcykKLXsKK3ZvaWQgY2hlY2tfYWNjdXJhY3lfdmFyKGludCBlZjAsIGludCBlZjEsIGludCBlZDAsIGludCBlZDEsIGludCBzKSB7CiAgIFZlY3RvclhmIHZmKHMpOwogICBWZWN0b3JYZCB2ZChzKTsKLSAgZm9yIChpbnQgaT0wOyBpPHM7ICsraSkKLSAgewotICAgIHZmW2ldID0gc3RkOjphYnMoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCkpICogc3RkOjpwb3coZG91YmxlKDEwKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KGVmMCxlZjEpKTsKLSAgICB2ZFtpXSA9IHN0ZDo6YWJzKGludGVybmFsOjpyYW5kb208ZG91YmxlPigpKSAqIHN0ZDo6cG93KGRvdWJsZSgxMCksIGludGVybmFsOjpyYW5kb208aW50PihlZDAsZWQxKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgczsgKytpKSB7CisgICAgdmZbaV0gPSBzdGQ6OmFicyhpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKSkgKiBzdGQ6OnBvdyhkb3VibGUoMTApLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oZWYwLCBlZjEpKTsKKyAgICB2ZFtpXSA9IHN0ZDo6YWJzKGludGVybmFsOjpyYW5kb208ZG91YmxlPigpKSAqIHN0ZDo6cG93KGRvdWJsZSgxMCksIGludGVybmFsOjpyYW5kb208aW50PihlZDAsIGVkMSkpOwogICB9CiAKLSAgLy9zdGQ6OmNvdXQgPDwgInJlZmVyZW5jZVx0IiA8PCBpbnRlcm5hbDo6c3FydChkb3VibGUocykpKnlmIDw8ICJcdCIgPDwgaW50ZXJuYWw6OnNxcnQoZG91YmxlKHMpKSp5ZCA8PCAiXG4iOwotICBzdGQ6OmNvdXQgPDwgInNxc3VtTm9ybVx0IiAgPDwgc3FzdW1Ob3JtKHZmKSAgPDwgIlx0IiA8PCBzcXN1bU5vcm0odmQpICA8PCAiXHQiIDw8IHNxc3VtTm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXHQiIDw8IHNxc3VtTm9ybSh2ZC5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXG4iOwotICBzdGQ6OmNvdXQgPDwgImh5cG90Tm9ybVx0IiAgPDwgaHlwb3ROb3JtKHZmKSAgPDwgIlx0IiA8PCBoeXBvdE5vcm0odmQpICA8PCAiXHQiIDw8IGh5cG90Tm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXHQiIDw8IGh5cG90Tm9ybSh2ZC5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXG4iOwotICBzdGQ6OmNvdXQgPDwgImJsdWVOb3JtXHQiICAgPDwgYmx1ZU5vcm0odmYpICAgPDwgIlx0IiA8PCBibHVlTm9ybSh2ZCkgICA8PCAiXHQiIDw8IGJsdWVOb3JtKHZmLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcdCIgPDwgYmx1ZU5vcm0odmQuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlxuIjsKLSAgc3RkOjpjb3V0IDw8ICJwYmx1ZU5vcm1cdCIgIDw8IHBibHVlTm9ybSh2ZikgIDw8ICJcdCIgPDwgcGJsdWVOb3JtKHZkKSAgPDwgIlx0IiA8PCBibHVlTm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXHQiIDw8IGJsdWVOb3JtKHZkLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcbiI7Ci0gIHN0ZDo6Y291dCA8PCAibGFwYWNrTm9ybVx0IiA8PCBsYXBhY2tOb3JtKHZmKSA8PCAiXHQiIDw8IGxhcGFja05vcm0odmQpIDw8ICJcdCIgPDwgbGFwYWNrTm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXHQiIDw8IGxhcGFja05vcm0odmQuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlxuIjsKLSAgc3RkOjpjb3V0IDw8ICJ0d29wYXNzTm9ybVx0IiA8PCB0d29wYXNzTm9ybSh2ZikgPDwgIlx0IiA8PCB0d29wYXNzTm9ybSh2ZCkgPDwgIlx0IiA8PCB0d29wYXNzTm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXHQiIDw8IHR3b3Bhc3NOb3JtKHZkLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcbiI7Ci0vLyAgIHN0ZDo6Y291dCA8PCAiYmwycGFzc05vcm1cdCIgPDwgYmwycGFzc05vcm0odmYpIDw8ICJcdCIgPDwgYmwycGFzc05vcm0odmQpIDw8ICJcdCIgPDwgYmwycGFzc05vcm0odmYuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlx0IiA8PCBibDJwYXNzTm9ybSh2ZC5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXG4iOworICAvLyBzdGQ6OmNvdXQgPDwgInJlZmVyZW5jZVx0IiA8PCBpbnRlcm5hbDo6c3FydChkb3VibGUocykpKnlmIDw8ICJcdCIgPDwgaW50ZXJuYWw6OnNxcnQoZG91YmxlKHMpKSp5ZCA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgInNxc3VtTm9ybVx0IiA8PCBzcXN1bU5vcm0odmYpIDw8ICJcdCIgPDwgc3FzdW1Ob3JtKHZkKSA8PCAiXHQiIDw8IHNxc3VtTm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKQorICAgICAgICAgICAgPDwgIlx0IiA8PCBzcXN1bU5vcm0odmQuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8ICJoeXBvdE5vcm1cdCIgPDwgaHlwb3ROb3JtKHZmKSA8PCAiXHQiIDw8IGh5cG90Tm9ybSh2ZCkgPDwgIlx0IiA8PCBoeXBvdE5vcm0odmYuY2FzdDxsb25nIGRvdWJsZT4oKSkKKyAgICAgICAgICAgIDw8ICJcdCIgPDwgaHlwb3ROb3JtKHZkLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAiYmx1ZU5vcm1cdCIgPDwgYmx1ZU5vcm0odmYpIDw8ICJcdCIgPDwgYmx1ZU5vcm0odmQpIDw8ICJcdCIgPDwgYmx1ZU5vcm0odmYuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlx0IgorICAgICAgICAgICAgPDwgYmx1ZU5vcm0odmQuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8ICJwYmx1ZU5vcm1cdCIgPDwgcGJsdWVOb3JtKHZmKSA8PCAiXHQiIDw8IHBibHVlTm9ybSh2ZCkgPDwgIlx0IiA8PCBibHVlTm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKQorICAgICAgICAgICAgPDwgIlx0IiA8PCBibHVlTm9ybSh2ZC5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgImxhcGFja05vcm1cdCIgPDwgbGFwYWNrTm9ybSh2ZikgPDwgIlx0IiA8PCBsYXBhY2tOb3JtKHZkKSA8PCAiXHQiIDw8IGxhcGFja05vcm0odmYuY2FzdDxsb25nIGRvdWJsZT4oKSkKKyAgICAgICAgICAgIDw8ICJcdCIgPDwgbGFwYWNrTm9ybSh2ZC5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgInR3b3Bhc3NOb3JtXHQiIDw8IHR3b3Bhc3NOb3JtKHZmKSA8PCAiXHQiIDw8IHR3b3Bhc3NOb3JtKHZkKSA8PCAiXHQiCisgICAgICAgICAgICA8PCB0d29wYXNzTm9ybSh2Zi5jYXN0PGxvbmcgZG91YmxlPigpKSA8PCAiXHQiIDw8IHR3b3Bhc3NOb3JtKHZkLmNhc3Q8bG9uZyBkb3VibGU+KCkpIDw8ICJcbiI7CisgIC8vICAgc3RkOjpjb3V0IDw8ICJibDJwYXNzTm9ybVx0IiA8PCBibDJwYXNzTm9ybSh2ZikgPDwgIlx0IiA8PCBibDJwYXNzTm9ybSh2ZCkgPDwgIlx0IiA8PCBibDJwYXNzTm9ybSh2Zi5jYXN0PGxvbmcKKyAgLy8gICBkb3VibGU+KCkpIDw8ICJcdCIgPDwgYmwycGFzc05vcm0odmQuY2FzdDxsb25nIGRvdWJsZT4oKSkgPDwgIlxuIjsKIH0KIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoteworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgIGludCB0cmllcyA9IDEwOwogICBpbnQgaXRlcnMgPSAxMDAwMDA7CiAgIGRvdWJsZSB5ID0gMS4xMzQ1NzQzMjMzNDU1Nzg1NDU2Nzg4ZTEyICogaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCk7CiAgIFZlY3RvclhmIHYgPSBWZWN0b3JYZjo6T25lcygxMDI0KSAqIHk7CiAKLS8vIHJldHVybiAwOworICAvLyByZXR1cm4gMDsKICAgaW50IHMgPSAxMDAwMDsKICAgZG91YmxlIGJhc2VmX29rID0gMS4xMzQ1NzQzMjMzNDU1Nzg1NDU2Nzg4ZTE1OwogICBkb3VibGUgYmFzZWRfb2sgPSAxLjEzNDU3NDMyMzM0NTU3ODU0NTY3ODhlOTU7CkBAIC0zMTAsMjIgKzI5NCwyMCBAQAogICBjaGVja19hY2N1cmFjeShiYXNlZl9vdmVyLCBiYXNlZF9vdmVyLCBzKTsKIAogICBzdGQ6OmNlcnIgPDwgIlxuVmFyeWluZyAob3Zlcik6XG4iOwotICBmb3IgKGludCBrPTA7IGs8MTsgKytrKQotICB7Ci0gICAgY2hlY2tfYWNjdXJhY3lfdmFyKDIwLDI3LDE5MCwzMDIscyk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgMTsgKytrKSB7CisgICAgY2hlY2tfYWNjdXJhY3lfdmFyKDIwLCAyNywgMTkwLCAzMDIsIHMpOwogICAgIHN0ZDo6Y291dCA8PCAiXG4iOwogICB9CiAKICAgc3RkOjpjZXJyIDw8ICJcblZhcnlpbmcgKHVuZGVyKTpcbiI7Ci0gIGZvciAoaW50IGs9MDsgazwxOyArK2spCi0gIHsKLSAgICBjaGVja19hY2N1cmFjeV92YXIoLTI3LDIwLC0zMDIsLTE5MCxzKTsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCAxOyArK2spIHsKKyAgICBjaGVja19hY2N1cmFjeV92YXIoLTI3LCAyMCwgLTMwMiwgLTE5MCwgcyk7CiAgICAgc3RkOjpjb3V0IDw8ICJcbiI7CiAgIH0KIAogICB5ID0gMTsKICAgc3RkOjpjb3V0LnByZWNpc2lvbig0KTsKLSAgaW50IHMxID0gMTAyNCoxMDI0KjMyOworICBpbnQgczEgPSAxMDI0ICogMTAyNCAqIDMyOwogICBzdGQ6OmNlcnIgPDwgIlBlcmZvcm1hbmNlIChvdXQgb2YgY2FjaGUsICIgPDwgczEgPDwgIik6XG4iOwogICB7CiAgICAgaW50IGl0ZXJzID0gMTsKZGlmZiAtLWdpdCBhL2JlbmNoL2JlbmNoX3JldmVyc2UuY3BwIGIvYmVuY2gvYmVuY2hfcmV2ZXJzZS5jcHAKaW5kZXggMWU2OWNhMS4uYmYyNDk4MiAxMDA2NDQKLS0tIGEvYmVuY2gvYmVuY2hfcmV2ZXJzZS5jcHAKKysrIGIvYmVuY2gvYmVuY2hfcmV2ZXJzZS5jcHAKQEAgLTE1LDcwICsxNSw2MiBAQAogdHlwZWRlZiBkb3VibGUgU2NhbGFyOwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KLV9fYXR0cmlidXRlX18gKChub2lubGluZSkpIHZvaWQgYmVuY2hfcmV2ZXJzZShjb25zdCBNYXRyaXhUeXBlJiBtKQoteworX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSB2b2lkIGJlbmNoX3JldmVyc2UoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICBpbnQgcm93cyA9IG0ucm93cygpOwogICBpbnQgY29scyA9IG0uY29scygpOwogICBpbnQgc2l6ZSA9IG0uc2l6ZSgpOwogCi0gIGludCByZXBlYXRzID0gKFJFUEVBVCoxMDAwKS9zaXplOwotICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKLSAgTWF0cml4VHlwZSBiID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIGludCByZXBlYXRzID0gKFJFUEVBVCAqIDEwMDApIC8gc2l6ZTsKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICBNYXRyaXhUeXBlIGIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CiAKICAgQmVuY2hUaW1lciB0aW1lckIsIHRpbWVySCwgdGltZXJWOwogCiAgIFNjYWxhciBhY2MgPSAwOwotICBpbnQgciA9IGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSk7Ci0gIGludCBjID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsY29scy0xKTsKLSAgZm9yIChpbnQgdD0wOyB0PFRSSUVTOyArK3QpCi0gIHsKKyAgaW50IHIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgcm93cyAtIDEpOworICBpbnQgYyA9IGludGVybmFsOjpyYW5kb208aW50PigwLCBjb2xzIC0gMSk7CisgIGZvciAoaW50IHQgPSAwOyB0IDwgVFJJRVM7ICsrdCkgewogICAgIHRpbWVyQi5zdGFydCgpOwotICAgIGZvciAoaW50IGs9MDsgazxyZXBlYXRzOyArK2spCi0gICAgeworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcmVwZWF0czsgKytrKSB7CiAgICAgICBhc20oIiNiZWdpbiBmb28iKTsKICAgICAgIGIgPSBhLnJldmVyc2UoKTsKICAgICAgIGFzbSgiI2VuZCBmb28iKTsKLSAgICAgIGFjYyArPSBiLmNvZWZmKHIsYyk7CisgICAgICBhY2MgKz0gYi5jb2VmZihyLCBjKTsKICAgICB9CiAgICAgdGltZXJCLnN0b3AoKTsKICAgfQogCi0gIGlmIChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKKyAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMpCiAgICAgc3RkOjpjb3V0IDw8ICJkeW4gICAiOwogICBlbHNlCiAgICAgc3RkOjpjb3V0IDw8ICJmaXhlZCAiOwotICBzdGQ6OmNvdXQgPDwgcm93cyA8PCAiIHggIiA8PCBjb2xzIDw8ICIgXHQiCi0gICAgICAgICAgICA8PCAodGltZXJCLnZhbHVlKCkgKiBSRVBFQVQpIC8gcmVwZWF0cyA8PCAicyAiCi0gICAgICAgICAgICA8PCAiKCIgPDwgMWUtNiAqIHNpemUqcmVwZWF0cy90aW1lckIudmFsdWUoKSA8PCAiIE1GTE9QUylcdCI7CisgIHN0ZDo6Y291dCA8PCByb3dzIDw8ICIgeCAiIDw8IGNvbHMgPDwgIiBcdCIgPDwgKHRpbWVyQi52YWx1ZSgpICogUkVQRUFUKSAvIHJlcGVhdHMgPDwgInMgIgorICAgICAgICAgICAgPDwgIigiIDw8IDFlLTYgKiBzaXplICogcmVwZWF0cyAvIHRpbWVyQi52YWx1ZSgpIDw8ICIgTUZMT1BTKVx0IjsKIAogICBzdGQ6OmNvdXQgPDwgIlxuIjsKICAgLy8gbWFrZSBzdXJlIHRoZSBjb21waWxlciBkb2VzIG5vdCBvcHRpbWl6ZSB0b28gbXVjaAotICBpZiAoYWNjPT0xMjMpCi0gICAgc3RkOjpjb3V0IDw8IGFjYzsKKyAgaWYgKGFjYyA9PSAxMjMpIHN0ZDo6Y291dCA8PCBhY2M7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCi17Ci0gIGNvbnN0IGludCBkeW5zaXplc1tdID0gezQsNiw4LDE2LDI0LDMyLDQ5LDY0LDEyOCwyNTYsNTEyLDkwMCwwfTsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgY29uc3QgaW50IGR5bnNpemVzW10gPSB7NCwgNiwgOCwgMTYsIDI0LCAzMiwgNDksIDY0LCAxMjgsIDI1NiwgNTEyLCA5MDAsIDB9OwogICBzdGQ6OmNvdXQgPDwgInNpemUgICAgICAgICAgICBubyBzcXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQiOwotLy8gICAjaWZkZWYgQkVOQ0hfR1NMCi0vLyAgIHN0ZDo6Y291dCA8PCAiICAgICAgIEdTTCAoc3RhbmRhcmQgKyBkb3VibGUgKyBBVExBUykgICI7Ci0vLyAgICNlbmRpZgorICAvLyAgICNpZmRlZiBCRU5DSF9HU0wKKyAgLy8gICBzdGQ6OmNvdXQgPDwgIiAgICAgICBHU0wgKHN0YW5kYXJkICsgZG91YmxlICsgQVRMQVMpICAiOworICAvLyAgICNlbmRpZgogICBzdGQ6OmNvdXQgPDwgIlxuIjsKLSAgZm9yICh1aW50IGk9MDsgZHluc2l6ZXNbaV0+MDsgKytpKQotICB7Ci0gICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4oZHluc2l6ZXNbaV0sZHluc2l6ZXNbaV0pKTsKLSAgICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPihkeW5zaXplc1tpXSpkeW5zaXplc1tpXSkpOworICBmb3IgKHVpbnQgaSA9IDA7IGR5bnNpemVzW2ldID4gMDsgKytpKSB7CisgICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPihkeW5zaXplc1tpXSwgZHluc2l6ZXNbaV0pKTsKKyAgICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+KGR5bnNpemVzW2ldICogZHluc2l6ZXNbaV0pKTsKICAgfQotLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsMiwyPigpKTsKLS8vICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLDMsMz4oKSk7Ci0vLyAgIGJlbmNoX3JldmVyc2UoTWF0cml4PFNjYWxhciw0LDQ+KCkpOwotLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsNSw1PigpKTsKLS8vICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLDYsNj4oKSk7Ci0vLyAgIGJlbmNoX3JldmVyc2UoTWF0cml4PFNjYWxhciw3LDc+KCkpOwotLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsOCw4PigpKTsKLS8vICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLDEyLDEyPigpKTsKLS8vICAgYmVuY2hfcmV2ZXJzZShNYXRyaXg8U2NhbGFyLDE2LDE2PigpKTsKKyAgLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsMiwyPigpKTsKKyAgLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsMywzPigpKTsKKyAgLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsNCw0PigpKTsKKyAgLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsNSw1PigpKTsKKyAgLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsNiw2PigpKTsKKyAgLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsNyw3PigpKTsKKyAgLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsOCw4PigpKTsKKyAgLy8gICBiZW5jaF9yZXZlcnNlKE1hdHJpeDxTY2FsYXIsMTIsMTI+KCkpOworICAvLyAgIGJlbmNoX3JldmVyc2UoTWF0cml4PFNjYWxhciwxNiwxNj4oKSk7CiAgIHJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaF9zdW0uY3BwIGIvYmVuY2gvYmVuY2hfc3VtLmNwcAppbmRleCBhM2Q5MjVlLi5hNTM5MGIyIDEwMDY0NAotLS0gYS9iZW5jaC9iZW5jaF9zdW0uY3BwCisrKyBiL2JlbmNoL2JlbmNoX3N1bS5jcHAKQEAgLTMsMTUgKzMsMTMgQEAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLWludCBtYWluKCkgCi17Ci0gIHR5cGVkZWYgTWF0cml4PFNDQUxBUixFaWdlbjo6RHluYW1pYywxPiBWZWM7CitpbnQgbWFpbigpIHsKKyAgdHlwZWRlZiBNYXRyaXg8U0NBTEFSLCBFaWdlbjo6RHluYW1pYywgMT4gVmVjOwogICBWZWMgdihTSVpFKTsKICAgdi5zZXRaZXJvKCk7CiAgIHZbMF0gPSAxOwogICB2WzFdID0gMjsKLSAgZm9yKGludCBpID0gMDsgaSA8IDEwMDAwMDA7IGkrKykKLSAgeworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDAwMDA7IGkrKykgewogICAgIHYuY29lZmZSZWYoMCkgKz0gdi5zdW0oKSAqIFNDQUxBUigxZS0yMCk7CiAgIH0KICAgY291dCA8PCB2LnN1bSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaG1hcmstYmxvY2tpbmctc2l6ZXMuY3BwIGIvYmVuY2gvYmVuY2htYXJrLWJsb2NraW5nLXNpemVzLmNwcAppbmRleCA4MjdiZTI4Li44Yzk0YTc5IDEwMDY0NAotLS0gYS9iZW5jaC9iZW5jaG1hcmstYmxvY2tpbmctc2l6ZXMuY3BwCisrKyBiL2JlbmNoL2JlbmNobWFyay1ibG9ja2luZy1zaXplcy5jcHAKQEAgLTU5LDE0ICs1OSwxMiBAQAogc3RhdGljX2Fzc2VydChtYXhzaXplIDwgKG1pbnNpemUgPDwgMTYpLCAibWF4c2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiAobWluc2l6ZTw8MTYpIik7CiAKIC8vIGp1c3QgYSBoZWxwZXIgdG8gc3RvcmUgYSB0cmlwbGUgb2YgSyxNLE4gc2l6ZXMgZm9yIG1hdHJpeCBwcm9kdWN0Ci1zdHJ1Y3Qgc2l6ZV90cmlwbGVfdAoteworc3RydWN0IHNpemVfdHJpcGxlX3QgewogICBzaXplX3QgaywgbSwgbjsKICAgc2l6ZV90cmlwbGVfdCgpIDogaygwKSwgbSgwKSwgbigwKSB7fQogICBzaXplX3RyaXBsZV90KHNpemVfdCBfaywgc2l6ZV90IF9tLCBzaXplX3QgX24pIDogayhfayksIG0oX20pLCBuKF9uKSB7fQogICBzaXplX3RyaXBsZV90KGNvbnN0IHNpemVfdHJpcGxlX3QmIG8pIDogayhvLmspLCBtKG8ubSksIG4oby5uKSB7fQotICBzaXplX3RyaXBsZV90KHVpbnQxNl90IGNvbXBhY3QpCi0gIHsKKyAgc2l6ZV90cmlwbGVfdCh1aW50MTZfdCBjb21wYWN0KSB7CiAgICAgayA9IDEgPDwgKChjb21wYWN0ICYgMHhmMDApID4+IDgpOwogICAgIG0gPSAxIDw8ICgoY29tcGFjdCAmIDB4MGYwKSA+PiA0KTsKICAgICBuID0gMSA8PCAoKGNvbXBhY3QgJiAweDAwZikgPj4gMCk7CkBAIC04Miw1MCArODAsMzUgQEAKIC8vIENvbnZlcnQgYmV0d2VlbiBzaXplIHRyaXBlcyBhbmQgYSBjb21wYWN0IGZvcm0gZml0dGluZyBpbiAxMiBiaXRzCiAvLyB3aGVyZSBlYWNoIHNpemUsIHdoaWNoIG11c3QgYmUgYSBQT1QsIGlzIGVuY29kZWQgYXMgaXRzIGxvZzIsIG9uIDQgYml0cwogLy8gc28gdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBzaXplIGlzIDJeMTUgPT0gMzJrICAuLi4gYmlnIGVub3VnaC4KLXVpbnQxNl90IGNvbXBhY3Rfc2l6ZV90cmlwbGUoc2l6ZV90IGssIHNpemVfdCBtLCBzaXplX3QgbikKLXsKK3VpbnQxNl90IGNvbXBhY3Rfc2l6ZV90cmlwbGUoc2l6ZV90IGssIHNpemVfdCBtLCBzaXplX3QgbikgewogICByZXR1cm4gKGxvZzJfcG90KGspIDw8IDgpIHwgKGxvZzJfcG90KG0pIDw8IDQpIHwgbG9nMl9wb3Qobik7CiB9CiAKLXVpbnQxNl90IGNvbXBhY3Rfc2l6ZV90cmlwbGUoY29uc3Qgc2l6ZV90cmlwbGVfdCYgdCkKLXsKLSAgcmV0dXJuIGNvbXBhY3Rfc2l6ZV90cmlwbGUodC5rLCB0Lm0sIHQubik7Ci19Cit1aW50MTZfdCBjb21wYWN0X3NpemVfdHJpcGxlKGNvbnN0IHNpemVfdHJpcGxlX3QmIHQpIHsgcmV0dXJuIGNvbXBhY3Rfc2l6ZV90cmlwbGUodC5rLCB0Lm0sIHQubik7IH0KIAogLy8gQSBzaW5nbGUgYmVuY2htYXJrLiBJbml0aWFsbHkgb25seSBjb250YWlucyBiZW5jaG1hcmsgcGFyYW1zLgogLy8gVGhlbiBjYWxsIHJ1bigpLCB3aGljaCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGUgZ2Zsb3BzIGZpZWxkLgotc3RydWN0IGJlbmNobWFya190Ci17CitzdHJ1Y3QgYmVuY2htYXJrX3QgewogICB1aW50MTZfdCBjb21wYWN0X3Byb2R1Y3Rfc2l6ZTsKICAgdWludDE2X3QgY29tcGFjdF9ibG9ja19zaXplOwogICBib29sIHVzZV9kZWZhdWx0X2Jsb2NrX3NpemU7CiAgIGZsb2F0IGdmbG9wczsKLSAgYmVuY2htYXJrX3QoKQotICAgIDogY29tcGFjdF9wcm9kdWN0X3NpemUoMCkKLSAgICAsIGNvbXBhY3RfYmxvY2tfc2l6ZSgwKQotICAgICwgdXNlX2RlZmF1bHRfYmxvY2tfc2l6ZShmYWxzZSkKLSAgICAsIGdmbG9wcygwKQotICB7Ci0gIH0KLSAgYmVuY2htYXJrX3Qoc2l6ZV90IHBrLCBzaXplX3QgcG0sIHNpemVfdCBwbiwKLSAgICAgICAgICAgICAgc2l6ZV90IGJrLCBzaXplX3QgYm0sIHNpemVfdCBibikKLSAgICA6IGNvbXBhY3RfcHJvZHVjdF9zaXplKGNvbXBhY3Rfc2l6ZV90cmlwbGUocGssIHBtLCBwbikpCi0gICAgLCBjb21wYWN0X2Jsb2NrX3NpemUoY29tcGFjdF9zaXplX3RyaXBsZShiaywgYm0sIGJuKSkKLSAgICAsIHVzZV9kZWZhdWx0X2Jsb2NrX3NpemUoZmFsc2UpCi0gICAgLCBnZmxvcHMoMCkKLSAge30KKyAgYmVuY2htYXJrX3QoKSA6IGNvbXBhY3RfcHJvZHVjdF9zaXplKDApLCBjb21wYWN0X2Jsb2NrX3NpemUoMCksIHVzZV9kZWZhdWx0X2Jsb2NrX3NpemUoZmFsc2UpLCBnZmxvcHMoMCkge30KKyAgYmVuY2htYXJrX3Qoc2l6ZV90IHBrLCBzaXplX3QgcG0sIHNpemVfdCBwbiwgc2l6ZV90IGJrLCBzaXplX3QgYm0sIHNpemVfdCBibikKKyAgICAgIDogY29tcGFjdF9wcm9kdWN0X3NpemUoY29tcGFjdF9zaXplX3RyaXBsZShwaywgcG0sIHBuKSksCisgICAgICAgIGNvbXBhY3RfYmxvY2tfc2l6ZShjb21wYWN0X3NpemVfdHJpcGxlKGJrLCBibSwgYm4pKSwKKyAgICAgICAgdXNlX2RlZmF1bHRfYmxvY2tfc2l6ZShmYWxzZSksCisgICAgICAgIGdmbG9wcygwKSB7fQogICBiZW5jaG1hcmtfdChzaXplX3QgcGssIHNpemVfdCBwbSwgc2l6ZV90IHBuKQotICAgIDogY29tcGFjdF9wcm9kdWN0X3NpemUoY29tcGFjdF9zaXplX3RyaXBsZShwaywgcG0sIHBuKSkKLSAgICAsIGNvbXBhY3RfYmxvY2tfc2l6ZSgwKQotICAgICwgdXNlX2RlZmF1bHRfYmxvY2tfc2l6ZSh0cnVlKQotICAgICwgZ2Zsb3BzKDApCi0gIHt9CisgICAgICA6IGNvbXBhY3RfcHJvZHVjdF9zaXplKGNvbXBhY3Rfc2l6ZV90cmlwbGUocGssIHBtLCBwbikpLAorICAgICAgICBjb21wYWN0X2Jsb2NrX3NpemUoMCksCisgICAgICAgIHVzZV9kZWZhdWx0X2Jsb2NrX3NpemUodHJ1ZSksCisgICAgICAgIGdmbG9wcygwKSB7fQogCiAgIHZvaWQgcnVuKCk7CiB9OwogCi1vc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIHMsIGNvbnN0IGJlbmNobWFya190JiBiKQoteworb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBzLCBjb25zdCBiZW5jaG1hcmtfdCYgYikgewogICBzIDw8IGhleCA8PCBiLmNvbXBhY3RfcHJvZHVjdF9zaXplIDw8IGRlYzsKICAgaWYgKGIudXNlX2RlZmF1bHRfYmxvY2tfc2l6ZSkgewogICAgIHNpemVfdHJpcGxlX3QgdChiLmNvbXBhY3RfcHJvZHVjdF9zaXplKTsKQEAgLTE0MSwxNyArMTI0LDE0IEBACiAKIC8vIFdlIHNvcnQgZmlyc3QgYnkgaW5jcmVhc2luZyBiZW5jaG1hcmsgcGFyYW1ldGVycywKIC8vIHRoZW4gYnkgZGVjcmVhc2luZyBwZXJmb3JtYW5jZS4KLWJvb2wgb3BlcmF0b3I8KGNvbnN0IGJlbmNobWFya190JiBiMSwgY29uc3QgYmVuY2htYXJrX3QmIGIyKQoteyAKK2Jvb2wgb3BlcmF0b3I8KGNvbnN0IGJlbmNobWFya190JiBiMSwgY29uc3QgYmVuY2htYXJrX3QmIGIyKSB7CiAgIHJldHVybiBiMS5jb21wYWN0X3Byb2R1Y3Rfc2l6ZSA8IGIyLmNvbXBhY3RfcHJvZHVjdF9zaXplIHx8Ci0gICAgICAgICAgIChiMS5jb21wYWN0X3Byb2R1Y3Rfc2l6ZSA9PSBiMi5jb21wYWN0X3Byb2R1Y3Rfc2l6ZSAmJiAoCi0gICAgICAgICAgICAgKGIxLmNvbXBhY3RfYmxvY2tfc2l6ZSA8IGIyLmNvbXBhY3RfYmxvY2tfc2l6ZSB8fCAoCi0gICAgICAgICAgICAgICBiMS5jb21wYWN0X2Jsb2NrX3NpemUgPT0gYjIuY29tcGFjdF9ibG9ja19zaXplICYmCi0gICAgICAgICAgICAgICAgIGIxLmdmbG9wcyA+IGIyLmdmbG9wcykpKSk7CisgICAgICAgICAoYjEuY29tcGFjdF9wcm9kdWN0X3NpemUgPT0gYjIuY29tcGFjdF9wcm9kdWN0X3NpemUgJiYKKyAgICAgICAgICAoKGIxLmNvbXBhY3RfYmxvY2tfc2l6ZSA8IGIyLmNvbXBhY3RfYmxvY2tfc2l6ZSB8fAorICAgICAgICAgICAgKGIxLmNvbXBhY3RfYmxvY2tfc2l6ZSA9PSBiMi5jb21wYWN0X2Jsb2NrX3NpemUgJiYgYjEuZ2Zsb3BzID4gYjIuZ2Zsb3BzKSkpKTsKIH0KIAotdm9pZCBiZW5jaG1hcmtfdDo6cnVuKCkKLXsKK3ZvaWQgYmVuY2htYXJrX3Q6OnJ1bigpIHsKICAgc2l6ZV90cmlwbGVfdCBwcm9kdWN0c2l6ZXMoY29tcGFjdF9wcm9kdWN0X3NpemUpOwogCiAgIGlmICh1c2VfZGVmYXVsdF9ibG9ja19zaXplKSB7CkBAIC0xNjgsMjYgKzE0OCwyMiBAQAogICAvLyBzZXQgdXAgdGhlIG1hdHJpeCBwb29sCiAKICAgY29uc3Qgc2l6ZV90IGNvbWJpbmVkX3RocmVlX21hdHJpY2VzX3NpemVzID0KLSAgICBzaXplb2YoU2NhbGFyKSAqCi0gICAgICAocHJvZHVjdHNpemVzLmsgKiBwcm9kdWN0c2l6ZXMubSArCi0gICAgICAgcHJvZHVjdHNpemVzLmsgKiBwcm9kdWN0c2l6ZXMubiArCi0gICAgICAgcHJvZHVjdHNpemVzLm0gKiBwcm9kdWN0c2l6ZXMubik7CisgICAgICBzaXplb2YoU2NhbGFyKSAqCisgICAgICAocHJvZHVjdHNpemVzLmsgKiBwcm9kdWN0c2l6ZXMubSArIHByb2R1Y3RzaXplcy5rICogcHJvZHVjdHNpemVzLm4gKyBwcm9kdWN0c2l6ZXMubSAqIHByb2R1Y3RzaXplcy5uKTsKIAogICAvLyA2NCBNIGlzIGxhcmdlIGVub3VnaCB0aGF0IG5vYm9keSBoYXMgYSBjYWNoZSBiaWdnZXIgdGhhbiB0aGF0LAogICAvLyB3aGlsZSBzdGlsbCBiZWluZyBzbWFsbCBlbm91Z2ggdGhhdCBldmVyeWJvZHkgaGFzIHRoaXMgbXVjaCBSQU0sCiAgIC8vIHNvIGNvbnZlbmllbnRseSB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpYWwtY2FzZSBwbGF0Zm9ybXMgaGVyZS4KICAgY29uc3Qgc2l6ZV90IHVubGlrZWx5X2xhcmdlX2NhY2hlX3NpemUgPSA2NCA8PCAyMDsKIAotICBjb25zdCBzaXplX3Qgd29ya2luZ19zZXRfc2l6ZSA9Ci0gICAgbWluX3dvcmtpbmdfc2V0X3NpemUgPyBtaW5fd29ya2luZ19zZXRfc2l6ZSA6IHVubGlrZWx5X2xhcmdlX2NhY2hlX3NpemU7CisgIGNvbnN0IHNpemVfdCB3b3JraW5nX3NldF9zaXplID0gbWluX3dvcmtpbmdfc2V0X3NpemUgPyBtaW5fd29ya2luZ19zZXRfc2l6ZSA6IHVubGlrZWx5X2xhcmdlX2NhY2hlX3NpemU7CiAKLSAgY29uc3Qgc2l6ZV90IG1hdHJpeF9wb29sX3NpemUgPQotICAgIDEgKyB3b3JraW5nX3NldF9zaXplIC8gY29tYmluZWRfdGhyZWVfbWF0cmljZXNfc2l6ZXM7CisgIGNvbnN0IHNpemVfdCBtYXRyaXhfcG9vbF9zaXplID0gMSArIHdvcmtpbmdfc2V0X3NpemUgLyBjb21iaW5lZF90aHJlZV9tYXRyaWNlc19zaXplczsKIAotICBNYXRyaXhUeXBlICpsaHMgPSBuZXcgTWF0cml4VHlwZVttYXRyaXhfcG9vbF9zaXplXTsKLSAgTWF0cml4VHlwZSAqcmhzID0gbmV3IE1hdHJpeFR5cGVbbWF0cml4X3Bvb2xfc2l6ZV07Ci0gIE1hdHJpeFR5cGUgKmRzdCA9IG5ldyBNYXRyaXhUeXBlW21hdHJpeF9wb29sX3NpemVdOwotICAKKyAgTWF0cml4VHlwZSogbGhzID0gbmV3IE1hdHJpeFR5cGVbbWF0cml4X3Bvb2xfc2l6ZV07CisgIE1hdHJpeFR5cGUqIHJocyA9IG5ldyBNYXRyaXhUeXBlW21hdHJpeF9wb29sX3NpemVdOworICBNYXRyaXhUeXBlKiBkc3QgPSBuZXcgTWF0cml4VHlwZVttYXRyaXhfcG9vbF9zaXplXTsKKwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdHJpeF9wb29sX3NpemU7IGkrKykgewogICAgIGxoc1tpXSA9IE1hdHJpeFR5cGU6Olplcm8ocHJvZHVjdHNpemVzLm0sIHByb2R1Y3RzaXplcy5rKTsKICAgICByaHNbaV0gPSBNYXRyaXhUeXBlOjpaZXJvKHByb2R1Y3RzaXplcy5rLCBwcm9kdWN0c2l6ZXMubik7CkBAIC0yMDAsNyArMTc2LDYgQEAKICAgZmxvYXQgdGltZV9wZXJfaXRlciA9IDAuMGY7CiAgIHNpemVfdCBtYXRyaXhfaW5kZXggPSAwOwogICB3aGlsZSAodHJ1ZSkgewotCiAgICAgZG91YmxlIHN0YXJ0dGltZSA9IHRpbWVyLmdldENwdVRpbWUoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJzX2F0X2FfdGltZTsgaSsrKSB7CiAgICAgICBkc3RbbWF0cml4X2luZGV4XS5ub2FsaWFzKCkgPSBsaHNbbWF0cml4X2luZGV4XSAqIHJoc1ttYXRyaXhfaW5kZXhdOwpAQCAtMjI4LDggKzIwMyw3IEBACiAgIGdmbG9wcyA9IDJlLTkgKiBwcm9kdWN0c2l6ZXMuayAqIHByb2R1Y3RzaXplcy5tICogcHJvZHVjdHNpemVzLm4gLyB0aW1lX3Blcl9pdGVyOwogfQogCi12b2lkIHByaW50X2NwdWluZm8oKQotewordm9pZCBwcmludF9jcHVpbmZvKCkgewogI2lmZGVmIF9fbGludXhfXwogICBjb3V0IDw8ICJjb250ZW50cyBvZiAvcHJvYy9jcHVpbmZvOiIgPDwgZW5kbDsKICAgc3RyaW5nIGxpbmU7CkBAIC0yNDksMzMgKzIyMywzMCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0cmluZyB0eXBlX25hbWUoKQoteworc3RyaW5nIHR5cGVfbmFtZSgpIHsKICAgcmV0dXJuICJ1bmtub3duIjsKIH0KIAotdGVtcGxhdGU8Pgotc3RyaW5nIHR5cGVfbmFtZTxmbG9hdD4oKQotewordGVtcGxhdGUgPD4KK3N0cmluZyB0eXBlX25hbWU8ZmxvYXQ+KCkgewogICByZXR1cm4gImZsb2F0IjsKIH0KIAotdGVtcGxhdGU8Pgotc3RyaW5nIHR5cGVfbmFtZTxkb3VibGU+KCkKLXsKK3RlbXBsYXRlIDw+CitzdHJpbmcgdHlwZV9uYW1lPGRvdWJsZT4oKSB7CiAgIHJldHVybiAiZG91YmxlIjsKIH0KIAotc3RydWN0IGFjdGlvbl90Ci17Ci0gIHZpcnR1YWwgY29uc3QgY2hhciogaW52b2thdGlvbl9uYW1lKCkgY29uc3QgeyBhYm9ydCgpOyByZXR1cm4gbnVsbHB0cjsgfQorc3RydWN0IGFjdGlvbl90IHsKKyAgdmlydHVhbCBjb25zdCBjaGFyKiBpbnZva2F0aW9uX25hbWUoKSBjb25zdCB7CisgICAgYWJvcnQoKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQogICB2aXJ0dWFsIHZvaWQgcnVuKCkgY29uc3QgeyBhYm9ydCgpOyB9CiAgIHZpcnR1YWwgfmFjdGlvbl90KCkge30KIH07CiAKLXZvaWQgc2hvd191c2FnZV9hbmRfZXhpdChpbnQgLyphcmdjKi8sIGNoYXIqIGFyZ3ZbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dW5pcXVlX3B0cjxhY3Rpb25fdD4+JiBhdmFpbGFibGVfYWN0aW9ucykKLXsKK3ZvaWQgc2hvd191c2FnZV9hbmRfZXhpdChpbnQgLyphcmdjKi8sIGNoYXIqIGFyZ3ZbXSwgY29uc3QgdmVjdG9yPHVuaXF1ZV9wdHI8YWN0aW9uX3Q+PiYgYXZhaWxhYmxlX2FjdGlvbnMpIHsKICAgY2VyciA8PCAidXNhZ2U6ICIgPDwgYXJndlswXSA8PCAiIDxhY3Rpb24+IFtvcHRpb25zLi4uXSIgPDwgZW5kbCA8PCBlbmRsOwogICBjZXJyIDw8ICJhdmFpbGFibGUgYWN0aW9uczoiIDw8IGVuZGwgPDwgZW5kbDsKICAgZm9yIChhdXRvIGl0ID0gYXZhaWxhYmxlX2FjdGlvbnMuYmVnaW4oKTsgaXQgIT0gYXZhaWxhYmxlX2FjdGlvbnMuZW5kKCk7ICsraXQpIHsKQEAgLTI5MywxMSArMjY0LDEwIEBACiAgIGNlcnIgPDwgIiAgICAgICBhdm9pZCB3YXJtIGNhY2hlcy4iIDw8IGVuZGw7CiAgIGV4aXQoMSk7CiB9Ci0gICAgIAotZmxvYXQgbWVhc3VyZV9jbG9ja19zcGVlZCgpCi17CisKK2Zsb2F0IG1lYXN1cmVfY2xvY2tfc3BlZWQoKSB7CiAgIGNlcnIgPDwgIk1lYXN1cmluZyBjbG9jayBzcGVlZC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyIiA8PCBmbHVzaDsKLSAgICAgICAgICAKKwogICB2ZWN0b3I8ZmxvYXQ+IGFsbF9nZmxvcHM7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgYmVuY2htYXJrX3QgYigxMDI0LCAxMDI0LCAxMDI0KTsKQEAgLTMxNSwxNCArMjg1LDEyIEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0cnVjdCBodW1hbl9kdXJhdGlvbl90Ci17CitzdHJ1Y3QgaHVtYW5fZHVyYXRpb25fdCB7CiAgIGludCBzZWNvbmRzOwogICBodW1hbl9kdXJhdGlvbl90KGludCBzKSA6IHNlY29uZHMocykge30KIH07CiAKLW9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgcywgY29uc3QgaHVtYW5fZHVyYXRpb25fdCYgZCkKLXsKK29zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgcywgY29uc3QgaHVtYW5fZHVyYXRpb25fdCYgZCkgewogICBpbnQgcmVtYWluZGVyID0gZC5zZWNvbmRzOwogICBpZiAocmVtYWluZGVyID4gMzYwMCkgewogICAgIGludCBob3VycyA9IHJlbWFpbmRlciAvIDM2MDA7CkBAIC0zNDIsOCArMzEwLDcgQEAKIAogY29uc3QgY2hhciBzZXNzaW9uX2ZpbGVuYW1lW10gPSAiL2RhdGEvbG9jYWwvdG1wL2JlbmNobWFyay1ibG9ja2luZy1zaXplcy1zZXNzaW9uLmRhdGEiOwogCi12b2lkIHNlcmlhbGl6ZV9iZW5jaG1hcmtzKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB2ZWN0b3I8YmVuY2htYXJrX3Q+JiBiZW5jaG1hcmtzLCBzaXplX3QgZmlyc3RfYmVuY2htYXJrX3RvX3J1bikKLXsKK3ZvaWQgc2VyaWFsaXplX2JlbmNobWFya3MoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHZlY3RvcjxiZW5jaG1hcmtfdD4mIGJlbmNobWFya3MsIHNpemVfdCBmaXJzdF9iZW5jaG1hcmtfdG9fcnVuKSB7CiAgIEZJTEUqIGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInciKTsKICAgaWYgKCFmaWxlKSB7CiAgICAgY2VyciA8PCAiQ291bGQgbm90IG9wZW4gZmlsZSAiIDw8IGZpbGVuYW1lIDw8ICIgZm9yIHdyaXRpbmcuIiA8PCBlbmRsOwpAQCAtMzU4LDggKzMyNSw3IEBACiAgIGZjbG9zZShmaWxlKTsKIH0KIAotYm9vbCBkZXNlcmlhbGl6ZV9iZW5jaG1hcmtzKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCB2ZWN0b3I8YmVuY2htYXJrX3Q+JiBiZW5jaG1hcmtzLCBzaXplX3QmIGZpcnN0X2JlbmNobWFya190b19ydW4pCi17Citib29sIGRlc2VyaWFsaXplX2JlbmNobWFya3MoY29uc3QgY2hhciogZmlsZW5hbWUsIHZlY3RvcjxiZW5jaG1hcmtfdD4mIGJlbmNobWFya3MsIHNpemVfdCYgZmlyc3RfYmVuY2htYXJrX3RvX3J1bikgewogICBGSUxFKiBmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CiAgIGlmICghZmlsZSkgewogICAgIHJldHVybiBmYWxzZTsKQEAgLTM4MiwxMSArMzQ4LDcgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgdHJ5X3J1bl9zb21lX2JlbmNobWFya3MoCi0gIHZlY3RvcjxiZW5jaG1hcmtfdD4mIGJlbmNobWFya3MsCi0gIGRvdWJsZSB0aW1lX3N0YXJ0LAotICBzaXplX3QmIGZpcnN0X2JlbmNobWFya190b19ydW4pCi17Cit2b2lkIHRyeV9ydW5fc29tZV9iZW5jaG1hcmtzKHZlY3RvcjxiZW5jaG1hcmtfdD4mIGJlbmNobWFya3MsIGRvdWJsZSB0aW1lX3N0YXJ0LCBzaXplX3QmIGZpcnN0X2JlbmNobWFya190b19ydW4pIHsKICAgaWYgKGZpcnN0X2JlbmNobWFya190b19ydW4gPT0gYmVuY2htYXJrcy5zaXplKCkpIHsKICAgICByZXR1cm47CiAgIH0KQEAgLTQwMiw5ICszNjQsNyBAQAogICAgIHRpbWVfbm93ID0gdGltZXIuZ2V0UmVhbFRpbWUoKTsKIAogICAgIC8vIFdlIGNoZWNrIGNsb2NrIHNwZWVkIGV2ZXJ5IG1pbnV0ZSBhbmQgYXQgdGhlIGVuZC4KLSAgICBpZiAoYmVuY2htYXJrX2luZGV4ID09IGJlbmNobWFya3Muc2l6ZSgpIHx8Ci0gICAgICAgIHRpbWVfbm93ID4gdGltZV9sYXN0X2Nsb2NrX3NwZWVkX21lYXN1cmVtZW50ICsgNjAuMGYpCi0gICAgeworICAgIGlmIChiZW5jaG1hcmtfaW5kZXggPT0gYmVuY2htYXJrcy5zaXplKCkgfHwgdGltZV9ub3cgPiB0aW1lX2xhc3RfY2xvY2tfc3BlZWRfbWVhc3VyZW1lbnQgKyA2MC4wZikgewogICAgICAgdGltZV9sYXN0X2Nsb2NrX3NwZWVkX21lYXN1cmVtZW50ID0gdGltZV9ub3c7CiAKICAgICAgIC8vIEVuc3VyZSB0aGF0IGNsb2NrIHNwZWVkIGlzIGFzIGV4cGVjdGVkCkBAIC00MjUsOCArMzg1LDcgQEAKICAgICAgICAgLy8gd2hpY2ggaW52YWxpZGF0ZXMgYWxsIGJlbmNobWFyayByZXN1bHRzIGNvbGxlY3RlZCBzbyBmYXIuCiAgICAgICAgIC8vIEVpdGhlciB3YXksIHdlIGJldHRlciByZXN0YXJ0IGFsbCBvdmVyIGFnYWluIG5vdy4KICAgICAgICAgaWYgKGJlbmNobWFya19pbmRleCkgewotICAgICAgICAgIGNlcnIgPDwgIlJlc3RhcnRpbmcgYXQgIiA8PCAxMDAuMGYgKiByYXRpb19kb25lCi0gICAgICAgICAgICAgICA8PCAiICUgYmVjYXVzZSBjbG9jayBzcGVlZCBpbmNyZWFzZWQuICAgICAgICAgICIgPDwgZW5kbDsKKyAgICAgICAgICBjZXJyIDw8ICJSZXN0YXJ0aW5nIGF0ICIgPDwgMTAwLjBmICogcmF0aW9fZG9uZSA8PCAiICUgYmVjYXVzZSBjbG9jayBzcGVlZCBpbmNyZWFzZWQuICAgICAgICAgICIgPDwgZW5kbDsKICAgICAgICAgfQogICAgICAgICBtYXhfY2xvY2tfc3BlZWQgPSBjdXJyZW50X2Nsb2NrX3NwZWVkOwogICAgICAgICBmaXJzdF9iZW5jaG1hcmtfdG9fcnVuID0gMDsKQEAgLTQzNiwxMiArMzk1LDkgQEAKICAgICAgIGJvb2wgcmVydW5fbGFzdF90ZXN0cyA9IGZhbHNlOwogCiAgICAgICBpZiAoY3VycmVudF9jbG9ja19zcGVlZCA8ICgxIC0gY2xvY2tfc3BlZWRfdG9sZXJhbmNlKSAqIG1heF9jbG9ja19zcGVlZCkgewotICAgICAgICBjZXJyIDw8ICJNZWFzdXJlbWVudHMgY29tcGxldGVkIHNvIGZhcjogIgotICAgICAgICAgICAgIDw8IDEwMC4wZiAqIHJhdGlvX2RvbmUKLSAgICAgICAgICAgICA8PCAiICUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPDwgZW5kbDsKLSAgICAgICAgY2VyciA8PCAiQ2xvY2sgc3BlZWQgc2VlbXMgdG8gYmUgb25seSAiCi0gICAgICAgICAgICAgPDwgY3VycmVudF9jbG9ja19zcGVlZC9tYXhfY2xvY2tfc3BlZWQKLSAgICAgICAgICAgICA8PCAiIHRpbWVzIHdoYXQgaXQgdXNlZCB0byBiZS4iIDw8IGVuZGw7CisgICAgICAgIGNlcnIgPDwgIk1lYXN1cmVtZW50cyBjb21wbGV0ZWQgc28gZmFyOiAiIDw8IDEwMC4wZiAqIHJhdGlvX2RvbmUgPDwgIiAlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIDw8IGVuZGw7CisgICAgICAgIGNlcnIgPDwgIkNsb2NrIHNwZWVkIHNlZW1zIHRvIGJlIG9ubHkgIiA8PCBjdXJyZW50X2Nsb2NrX3NwZWVkIC8gbWF4X2Nsb2NrX3NwZWVkIDw8ICIgdGltZXMgd2hhdCBpdCB1c2VkIHRvIGJlLiIKKyAgICAgICAgICAgICA8PCBlbmRsOwogCiAgICAgICAgIHVuc2lnbmVkIGludCBzZWNvbmRzX3RvX3NsZWVwX2lmX2xvd2VyX2Nsb2NrX3NwZWVkID0gMTsKIApAQCAtNDU0LDkgKzQxMCw4IEBACiAgICAgICAgICAgICBleGl0KDIpOwogICAgICAgICAgIH0KICAgICAgICAgICByZXJ1bl9sYXN0X3Rlc3RzID0gdHJ1ZTsKLSAgICAgICAgICBjZXJyIDw8ICJTbGVlcGluZyAiCi0gICAgICAgICAgICAgICA8PCBzZWNvbmRzX3RvX3NsZWVwX2lmX2xvd2VyX2Nsb2NrX3NwZWVkCi0gICAgICAgICAgICAgICA8PCAiIHMuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyIiA8PCBlbmRsOworICAgICAgICAgIGNlcnIgPDwgIlNsZWVwaW5nICIgPDwgc2Vjb25kc190b19zbGVlcF9pZl9sb3dlcl9jbG9ja19zcGVlZCA8PCAiIHMuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyIgorICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgICAgICAgICBzbGVlcChzZWNvbmRzX3RvX3NsZWVwX2lmX2xvd2VyX2Nsb2NrX3NwZWVkKTsKICAgICAgICAgICBjdXJyZW50X2Nsb2NrX3NwZWVkID0gbWVhc3VyZV9jbG9ja19zcGVlZCgpOwogICAgICAgICAgIHNlY29uZHNfdG9fc2xlZXBfaWZfbG93ZXJfY2xvY2tfc3BlZWQgKj0gMjsKQEAgLTQ2NCw4ICs0MTksNyBAQAogICAgICAgfQogCiAgICAgICBpZiAocmVydW5fbGFzdF90ZXN0cykgewotICAgICAgICBjZXJyIDw8ICJSZWRvaW5nIHRoZSBsYXN0ICIKLSAgICAgICAgICAgICA8PCAxMDAuMGYgKiBmbG9hdChiZW5jaG1hcmtfaW5kZXggLSBmaXJzdF9iZW5jaG1hcmtfdG9fcnVuKSAvIGJlbmNobWFya3Muc2l6ZSgpCisgICAgICAgIGNlcnIgPDwgIlJlZG9pbmcgdGhlIGxhc3QgIiA8PCAxMDAuMGYgKiBmbG9hdChiZW5jaG1hcmtfaW5kZXggLSBmaXJzdF9iZW5jaG1hcmtfdG9fcnVuKSAvIGJlbmNobWFya3Muc2l6ZSgpCiAgICAgICAgICAgICAgPDwgIiAlIGJlY2F1c2UgY2xvY2sgc3BlZWQgaGFkIGJlZW4gbG93LiAgICIgPDwgZW5kbDsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQpAQCAtNDg2LDggKzQ0MCw3IEBACiAgICAgLy8gRGlzcGxheSBwcm9ncmVzcyBpbmZvIG9uIHN0ZGVycgogICAgIGlmICh0aW1lX25vdyA+IHRpbWVfbGFzdF9wcm9ncmVzc191cGRhdGUgKyAxLjBmKSB7CiAgICAgICB0aW1lX2xhc3RfcHJvZ3Jlc3NfdXBkYXRlID0gdGltZV9ub3c7Ci0gICAgICBjZXJyIDw8ICJNZWFzdXJlbWVudHMuLi4gIiA8PCAxMDAuMGYgKiByYXRpb19kb25lCi0gICAgICAgICAgIDw8ICIgJSwgRVRBICIKKyAgICAgIGNlcnIgPDwgIk1lYXN1cmVtZW50cy4uLiAiIDw8IDEwMC4wZiAqIHJhdGlvX2RvbmUgPDwgIiAlLCBFVEEgIgogICAgICAgICAgICA8PCBodW1hbl9kdXJhdGlvbl90KGZsb2F0KHRpbWVfbm93IC0gdGltZV9zdGFydCkgKiAoMS4wZiAtIHJhdGlvX2RvbmUpIC8gcmF0aW9fZG9uZSkKICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgXHIiIDw8IGZsdXNoOwogICAgIH0KQEAgLTQ5OCwxOSArNDUxLDE1IEBACiAgIH0KIH0KIAotdm9pZCBydW5fYmVuY2htYXJrcyh2ZWN0b3I8YmVuY2htYXJrX3Q+JiBiZW5jaG1hcmtzKQotewordm9pZCBydW5fYmVuY2htYXJrcyh2ZWN0b3I8YmVuY2htYXJrX3Q+JiBiZW5jaG1hcmtzKSB7CiAgIHNpemVfdCBmaXJzdF9iZW5jaG1hcmtfdG9fcnVuOwogICB2ZWN0b3I8YmVuY2htYXJrX3Q+IGRlc2VyaWFsaXplZF9iZW5jaG1hcmtzOwogICBib29sIHVzZV9kZXNlcmlhbGl6ZWRfYmVuY2htYXJrcyA9IGZhbHNlOwogICBpZiAoZGVzZXJpYWxpemVfYmVuY2htYXJrcyhzZXNzaW9uX2ZpbGVuYW1lLCBkZXNlcmlhbGl6ZWRfYmVuY2htYXJrcywgZmlyc3RfYmVuY2htYXJrX3RvX3J1bikpIHsKLSAgICBjZXJyIDw8ICJGb3VuZCBzZXJpYWxpemVkIHNlc3Npb24gd2l0aCAiCi0gICAgICAgICA8PCAxMDAuMGYgKiBmaXJzdF9iZW5jaG1hcmtfdG9fcnVuIC8gZGVzZXJpYWxpemVkX2JlbmNobWFya3Muc2l6ZSgpCisgICAgY2VyciA8PCAiRm91bmQgc2VyaWFsaXplZCBzZXNzaW9uIHdpdGggIiA8PCAxMDAuMGYgKiBmaXJzdF9iZW5jaG1hcmtfdG9fcnVuIC8gZGVzZXJpYWxpemVkX2JlbmNobWFya3Muc2l6ZSgpCiAgICAgICAgICA8PCAiICUgYWxyZWFkeSBkb25lIiA8PCBlbmRsOwotICAgIGlmIChkZXNlcmlhbGl6ZWRfYmVuY2htYXJrcy5zaXplKCkgPT0gYmVuY2htYXJrcy5zaXplKCkgJiYKLSAgICAgICAgZmlyc3RfYmVuY2htYXJrX3RvX3J1biA+IDAgJiYKLSAgICAgICAgZmlyc3RfYmVuY2htYXJrX3RvX3J1biA8IGJlbmNobWFya3Muc2l6ZSgpKQotICAgIHsKKyAgICBpZiAoZGVzZXJpYWxpemVkX2JlbmNobWFya3Muc2l6ZSgpID09IGJlbmNobWFya3Muc2l6ZSgpICYmIGZpcnN0X2JlbmNobWFya190b19ydW4gPiAwICYmCisgICAgICAgIGZpcnN0X2JlbmNobWFya190b19ydW4gPCBiZW5jaG1hcmtzLnNpemUoKSkgewogICAgICAgdXNlX2Rlc2VyaWFsaXplZF9iZW5jaG1hcmtzID0gdHJ1ZTsKICAgICB9CiAgIH0KQEAgLTUzMSwxNSArNDgwLDEzIEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgbWF4X2Nsb2NrX3NwZWVkID0gbWF4KG1heF9jbG9ja19zcGVlZCwgbWVhc3VyZV9jbG9ja19zcGVlZCgpKTsKICAgfQotICAKKwogICBkb3VibGUgdGltZV9zdGFydCA9IDAuMDsKICAgd2hpbGUgKGZpcnN0X2JlbmNobWFya190b19ydW4gPCBiZW5jaG1hcmtzLnNpemUoKSkgewogICAgIGlmIChmaXJzdF9iZW5jaG1hcmtfdG9fcnVuID09IDApIHsKICAgICAgIHRpbWVfc3RhcnQgPSB0aW1lci5nZXRSZWFsVGltZSgpOwogICAgIH0KLSAgICB0cnlfcnVuX3NvbWVfYmVuY2htYXJrcyhiZW5jaG1hcmtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfYmVuY2htYXJrX3RvX3J1bik7CisgICAgdHJ5X3J1bl9zb21lX2JlbmNobWFya3MoYmVuY2htYXJrcywgdGltZV9zdGFydCwgZmlyc3RfYmVuY2htYXJrX3RvX3J1bik7CiAgIH0KIAogICAvLyBTb3J0IHRpbWluZ3MgYnkgaW5jcmVhc2luZyBiZW5jaG1hcmsgcGFyYW1ldGVycywgYW5kIGRlY3JlYXNpbmcgZ2Zsb3BzLgpAQCAtNTUwLDEwICs0OTcsOCBAQAogICAvLyBDb2xsZWN0IGJlc3QgKGkuZS4gbm93IGZpcnN0KSByZXN1bHRzIGZvciBlYWNoIHBhcmFtZXRlciB2YWx1ZXMuCiAgIHZlY3RvcjxiZW5jaG1hcmtfdD4gYmVzdF9iZW5jaG1hcmtzOwogICBmb3IgKGF1dG8gaXQgPSBiZW5jaG1hcmtzLmJlZ2luKCk7IGl0ICE9IGJlbmNobWFya3MuZW5kKCk7ICsraXQpIHsKLSAgICBpZiAoYmVzdF9iZW5jaG1hcmtzLmVtcHR5KCkgfHwKLSAgICAgICAgYmVzdF9iZW5jaG1hcmtzLmJhY2soKS5jb21wYWN0X3Byb2R1Y3Rfc2l6ZSAhPSBpdC0+Y29tcGFjdF9wcm9kdWN0X3NpemUgfHwKLSAgICAgICAgYmVzdF9iZW5jaG1hcmtzLmJhY2soKS5jb21wYWN0X2Jsb2NrX3NpemUgIT0gaXQtPmNvbXBhY3RfYmxvY2tfc2l6ZSkKLSAgICB7CisgICAgaWYgKGJlc3RfYmVuY2htYXJrcy5lbXB0eSgpIHx8IGJlc3RfYmVuY2htYXJrcy5iYWNrKCkuY29tcGFjdF9wcm9kdWN0X3NpemUgIT0gaXQtPmNvbXBhY3RfcHJvZHVjdF9zaXplIHx8CisgICAgICAgIGJlc3RfYmVuY2htYXJrcy5iYWNrKCkuY29tcGFjdF9ibG9ja19zaXplICE9IGl0LT5jb21wYWN0X2Jsb2NrX3NpemUpIHsKICAgICAgIGJlc3RfYmVuY2htYXJrcy5wdXNoX2JhY2soKml0KTsKICAgICB9CiAgIH0KQEAgLTU2MiwxMSArNTA3LDkgQEAKICAgYmVuY2htYXJrcyA9IGJlc3RfYmVuY2htYXJrczsKIH0KIAotc3RydWN0IG1lYXN1cmVfYWxsX3BvdF9zaXplc19hY3Rpb25fdCA6IGFjdGlvbl90Ci17CitzdHJ1Y3QgbWVhc3VyZV9hbGxfcG90X3NpemVzX2FjdGlvbl90IDogYWN0aW9uX3QgewogICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGludm9rYXRpb25fbmFtZSgpIGNvbnN0IHsgcmV0dXJuICJhbGwtcG90LXNpemVzIjsgfQotICB2aXJ0dWFsIHZvaWQgcnVuKCkgY29uc3QKLSAgeworICB2aXJ0dWFsIHZvaWQgcnVuKCkgY29uc3QgewogICAgIHZlY3RvcjxiZW5jaG1hcmtfdD4gYmVuY2htYXJrczsKICAgICBmb3IgKGludCByZXBldGl0aW9uID0gMDsgcmVwZXRpdGlvbiA8IG1lYXN1cmVtZW50X3JlcGV0aXRpb25zOyByZXBldGl0aW9uKyspIHsKICAgICAgIGZvciAoc2l6ZV90IGtzaXplID0gbWluc2l6ZTsga3NpemUgPD0gbWF4c2l6ZTsga3NpemUgKj0gMikgewpAQCAtNTkzLDExICs1MzYsOSBAQAogICB9CiB9OwogCi1zdHJ1Y3QgbWVhc3VyZV9kZWZhdWx0X3NpemVzX2FjdGlvbl90IDogYWN0aW9uX3QKLXsKK3N0cnVjdCBtZWFzdXJlX2RlZmF1bHRfc2l6ZXNfYWN0aW9uX3QgOiBhY3Rpb25fdCB7CiAgIHZpcnR1YWwgY29uc3QgY2hhciogaW52b2thdGlvbl9uYW1lKCkgY29uc3QgeyByZXR1cm4gImRlZmF1bHQtc2l6ZXMiOyB9Ci0gIHZpcnR1YWwgdm9pZCBydW4oKSBjb25zdAotICB7CisgIHZpcnR1YWwgdm9pZCBydW4oKSBjb25zdCB7CiAgICAgdmVjdG9yPGJlbmNobWFya190PiBiZW5jaG1hcmtzOwogICAgIGZvciAoaW50IHJlcGV0aXRpb24gPSAwOyByZXBldGl0aW9uIDwgbWVhc3VyZW1lbnRfcmVwZXRpdGlvbnM7IHJlcGV0aXRpb24rKykgewogICAgICAgZm9yIChzaXplX3Qga3NpemUgPSBtaW5zaXplOyBrc2l6ZSA8PSBtYXhzaXplOyBrc2l6ZSAqPSAyKSB7CkBAIC02MTgsOCArNTU5LDcgQEAKICAgfQogfTsKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKLXsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgZG91YmxlIHRpbWVfc3RhcnQgPSB0aW1lci5nZXRSZWFsVGltZSgpOwogICBjb3V0LnByZWNpc2lvbig0KTsKICAgY2Vyci5wcmVjaXNpb24oNCk7CkBAIC02NDcsNyArNTg3LDcgQEAKICAgZm9yIChpbnQgaSA9IDI7IGkgPCBhcmdjOyBpKyspIHsKICAgICBpZiAoYXJndltpXSA9PSBzdHJzdHIoYXJndltpXSwgIi0tbWluLXdvcmtpbmctc2V0LXNpemU9IikpIHsKICAgICAgIGNvbnN0IGNoYXIqIGVxdWFsc19zaWduID0gc3RyY2hyKGFyZ3ZbaV0sICc9Jyk7Ci0gICAgICBtaW5fd29ya2luZ19zZXRfc2l6ZSA9IHN0cnRvdWwoZXF1YWxzX3NpZ24rMSwgbnVsbHB0ciwgMTApOworICAgICAgbWluX3dvcmtpbmdfc2V0X3NpemUgPSBzdHJ0b3VsKGVxdWFsc19zaWduICsgMSwgbnVsbHB0ciwgMTApOwogICAgIH0gZWxzZSB7CiAgICAgICBjZXJyIDw8ICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAiIDw8IGFyZ3ZbaV0gPDwgZW5kbCA8PCBlbmRsOwogICAgICAgc2hvd191c2FnZV9hbmRfZXhpdChhcmdjLCBhcmd2LCBhdmFpbGFibGVfYWN0aW9ucyk7CkBAIC02NTcsNyArNTk3LDcgQEAKICAgcHJpbnRfY3B1aW5mbygpOwogCiAgIGNvdXQgPDwgImJlbmNobWFyayBwYXJhbWV0ZXJzOiIgPDwgZW5kbDsKLSAgY291dCA8PCAicG9pbnRlciBzaXplOiAiIDw8IDgqc2l6ZW9mKHZvaWQqKSA8PCAiIGJpdHMiIDw8IGVuZGw7CisgIGNvdXQgPDwgInBvaW50ZXIgc2l6ZTogIiA8PCA4ICogc2l6ZW9mKHZvaWQqKSA8PCAiIGJpdHMiIDw8IGVuZGw7CiAgIGNvdXQgPDwgInNjYWxhciB0eXBlOiAiIDw8IHR5cGVfbmFtZTxTY2FsYXI+KCkgPDwgZW5kbDsKICAgY291dCA8PCAicGFja2V0IHNpemU6ICIgPDwgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8TWF0cml4VHlwZTo6U2NhbGFyPjo6c2l6ZSA8PCBlbmRsOwogICBjb3V0IDw8ICJtaW5zaXplID0gIiA8PCBtaW5zaXplIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaG1hcmsuY3BwIGIvYmVuY2gvYmVuY2htYXJrLmNwcAppbmRleCBjNzIxYjkwLi45M2UxOGI2IDEwMDY0NAotLS0gYS9iZW5jaC9iZW5jaG1hcmsuY3BwCisrKyBiL2JlbmNoL2JlbmNobWFyay5jcHAKQEAgLTE5LDIxICsxOSwxOCBAQAogI2RlZmluZSBTQ0FMQVIgZG91YmxlCiAjZW5kaWYKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBNYXRyaXg8U0NBTEFSLE1BVFNJWkUsTUFUU0laRT4gSSA9IE1hdHJpeDxTQ0FMQVIsTUFUU0laRSxNQVRTSVpFPjo6T25lcygpOwotICAgIE1hdHJpeDxTQ0FMQVIsTUFUU0laRSxNQVRTSVpFPiBtOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBNQVRTSVpFOyBpKyspCi0gICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBNQVRTSVpFOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG0oaSxqKSA9IChpK01BVFNJWkUqaik7Ci0gICAgICAgIH0KLSAgICBhc20oIiNiZWdpbiIpOwotICAgIGZvcihpbnQgYSA9IDA7IGEgPCBSRVBFQVQ7IGErKykKLSAgICB7Ci0gICAgICAgIG0gPSBNYXRyaXg8U0NBTEFSLE1BVFNJWkUsTUFUU0laRT46Ok9uZXMoKSArIDAuMDAwMDUgKiAobSArIChtKm0pKTsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgTWF0cml4PFNDQUxBUiwgTUFUU0laRSwgTUFUU0laRT4gSSA9IE1hdHJpeDxTQ0FMQVIsIE1BVFNJWkUsIE1BVFNJWkU+OjpPbmVzKCk7CisgIE1hdHJpeDxTQ0FMQVIsIE1BVFNJWkUsIE1BVFNJWkU+IG07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFUU0laRTsgaSsrKQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgTUFUU0laRTsgaisrKSB7CisgICAgICBtKGksIGopID0gKGkgKyBNQVRTSVpFICogaik7CiAgICAgfQotICAgIGFzbSgiI2VuZCIpOwotICAgIGNvdXQgPDwgbSA8PCBlbmRsOwotICAgIHJldHVybiAwOworICBhc20oIiNiZWdpbiIpOworICBmb3IgKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKSB7CisgICAgbSA9IE1hdHJpeDxTQ0FMQVIsIE1BVFNJWkUsIE1BVFNJWkU+OjpPbmVzKCkgKyAwLjAwMDA1ICogKG0gKyAobSAqIG0pKTsKKyAgfQorICBhc20oIiNlbmQiKTsKKyAgY291dCA8PCBtIDw8IGVuZGw7CisgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2htYXJrU2xpY2UuY3BwIGIvYmVuY2gvYmVuY2htYXJrU2xpY2UuY3BwCmluZGV4IGM1Yjg5YzUuLjU4NDEzN2IgMTAwNjQ0Ci0tLSBhL2JlbmNoL2JlbmNobWFya1NsaWNlLmNwcAorKysgYi9iZW5jaC9iZW5jaG1hcmtTbGljZS5jcHAKQEAgLTE1LDIzICsxNSwyMSBAQAogI2RlZmluZSBTQ0FMQVIgZmxvYXQKICNlbmRpZgogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoteworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICB0eXBlZGVmIE1hdHJpeDxTQ0FMQVIsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYz4gTWF0OwogICBNYXQgbSgxMDAsIDEwMCk7CiAgIG0uc2V0UmFuZG9tKCk7CiAKLSAgZm9yKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKQotICB7CisgIGZvciAoaW50IGEgPSAwOyBhIDwgUkVQRUFUOyBhKyspIHsKICAgICBpbnQgciwgYywgbnIsIG5jOwotICAgIHIgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsMTApOwotICAgIGMgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsMTApOwotICAgIG5yID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50Pig1MCw4MCk7Ci0gICAgbmMgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDUwLDgwKTsKLSAgICBtLmJsb2NrKHIsYyxucixuYykgKz0gTWF0OjpPbmVzKG5yLG5jKTsKLSAgICBtLmJsb2NrKHIsYyxucixuYykgKj0gU0NBTEFSKDEwKTsKLSAgICBtLmJsb2NrKHIsYyxucixuYykgLT0gTWF0Ojpjb25zdGFudChucixuYywxMCk7Ci0gICAgbS5ibG9jayhyLGMsbnIsbmMpIC89IFNDQUxBUigxMCk7CisgICAgciA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgMTApOworICAgIGMgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIDEwKTsKKyAgICBuciA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oNTAsIDgwKTsKKyAgICBuYyA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oNTAsIDgwKTsKKyAgICBtLmJsb2NrKHIsIGMsIG5yLCBuYykgKz0gTWF0OjpPbmVzKG5yLCBuYyk7CisgICAgbS5ibG9jayhyLCBjLCBuciwgbmMpICo9IFNDQUxBUigxMCk7CisgICAgbS5ibG9jayhyLCBjLCBuciwgbmMpIC09IE1hdDo6Y29uc3RhbnQobnIsIG5jLCAxMCk7CisgICAgbS5ibG9jayhyLCBjLCBuciwgbmMpIC89IFNDQUxBUigxMCk7CiAgIH0KICAgY291dCA8PCBtWzBdIDw8IGVuZGw7CiAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYmVuY2gvYmVuY2htYXJrWC5jcHAgYi9iZW5jaC9iZW5jaG1hcmtYLmNwcAppbmRleCA4ZTRiNjBjLi5lZmY5MzE4IDEwMDY0NAotLS0gYS9iZW5jaC9iZW5jaG1hcmtYLmNwcAorKysgYi9iZW5jaC9iZW5jaG1hcmtYLmNwcApAQCAtMTksMTggKzE5LDE2IEBACiAjZGVmaW5lIFJFUEVBVCAxMDAKICNlbmRpZgogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCU1BVFRZUEUgSSA9IE1BVFRZUEU6Ok9uZXMoTUFUU0laRSxNQVRTSVpFKTsKLQlNQVRUWVBFIG0oTUFUU0laRSxNQVRTSVpFKTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgTUFUU0laRTsgaSsrKSBmb3IoaW50IGogPSAwOyBqIDwgTUFUU0laRTsgaisrKQotCXsKLQkJbShpLGopID0gKGkraisxKS8oTUFUU0laRSpNQVRTSVpFKTsKLQl9Ci0JZm9yKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKQotCXsKLQkJbSA9IEkgKyAwLjAwMDEgKiAobSArIG0qbSk7Ci0JfQotCWNvdXQgPDwgbSgwLDApIDw8IGVuZGw7Ci0JcmV0dXJuIDA7CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisgIE1BVFRZUEUgSSA9IE1BVFRZUEU6Ok9uZXMoTUFUU0laRSwgTUFUU0laRSk7CisgIE1BVFRZUEUgbShNQVRTSVpFLCBNQVRTSVpFKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVRTSVpFOyBpKyspCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBNQVRTSVpFOyBqKyspIHsKKyAgICAgIG0oaSwgaikgPSAoaSArIGogKyAxKSAvIChNQVRTSVpFICogTUFUU0laRSk7CisgICAgfQorICBmb3IgKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKSB7CisgICAgbSA9IEkgKyAwLjAwMDEgKiAobSArIG0gKiBtKTsKKyAgfQorICBjb3V0IDw8IG0oMCwgMCkgPDwgZW5kbDsKKyAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9iZW5jaC9iZW5jaG1hcmtYY3dpc2UuY3BwIGIvYmVuY2gvYmVuY2htYXJrWGN3aXNlLmNwcAppbmRleCA2MjQzNzQzLi5mMGM0OTc3IDEwMDY0NAotLS0gYS9iZW5jaC9iZW5jaG1hcmtYY3dpc2UuY3BwCisrKyBiL2JlbmNoL2JlbmNobWFya1hjd2lzZS5jcHAKQEAgLTE4LDE4ICsxOCwxNSBAQAogI2RlZmluZSBSRVBFQVQgMTAwMAogI2VuZGlmCiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0JVkVDVFlQRSBJID0gVkVDVFlQRTo6T25lcyhWRUNTSVpFKTsKLQlWRUNUWVBFIG0oVkVDU0laRSwxKTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgVkVDU0laRTsgaSsrKQotCXsKLQkJbVtpXSA9IDAuMSAqIGkvVkVDU0laRTsKLQl9Ci0JZm9yKGludCBhID0gMDsgYSA8IFJFUEVBVDsgYSsrKQotCXsKLQkJbSA9IFZFQ1RZUEU6Ok9uZXMoVkVDU0laRSkgKyAwLjAwMDA1ICogKG0uY3dpc2UoKS5zcXVhcmUoKSArIG0vNCk7Ci0JfQotCWNvdXQgPDwgbVswXSA8PCBlbmRsOwotCXJldHVybiAwOworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICBWRUNUWVBFIEkgPSBWRUNUWVBFOjpPbmVzKFZFQ1NJWkUpOworICBWRUNUWVBFIG0oVkVDU0laRSwgMSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgVkVDU0laRTsgaSsrKSB7CisgICAgbVtpXSA9IDAuMSAqIGkgLyBWRUNTSVpFOworICB9CisgIGZvciAoaW50IGEgPSAwOyBhIDwgUkVQRUFUOyBhKyspIHsKKyAgICBtID0gVkVDVFlQRTo6T25lcyhWRUNTSVpFKSArIDAuMDAwMDUgKiAobS5jd2lzZSgpLnNxdWFyZSgpICsgbSAvIDQpOworICB9CisgIGNvdXQgPDwgbVswXSA8PCBlbmRsOworICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9hYXRfcHJvZHVjdC5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9hYXRfcHJvZHVjdC5oaAppbmRleCBhYTViMzVjLi4yZGUxNzQwIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYWF0X3Byb2R1Y3QuaGgKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2FhdF9wcm9kdWN0LmhoCkBAIC0yOCwxMDEgKzI4LDgwIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLXRlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK3RlbXBsYXRlIDxjbGFzcyBJbnRlcmZhY2U+CiBjbGFzcyBBY3Rpb25fYWF0X3Byb2R1Y3QgewotCi1wdWJsaWMgOgotCisgcHVibGljOgogICAvLyBDdG9yCiAKLSAgQWN0aW9uX2FhdF9wcm9kdWN0KCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCi0gIHsKKyAgQWN0aW9uX2FhdF9wcm9kdWN0KGludCBzaXplKSA6IF9zaXplKHNpemUpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fYWF0X3Byb2R1Y3QgQ3RvciIpOwogCiAgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCiAKLSAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOwotICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCwgX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KFhfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsIF9zaXplKTsKIAogICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KIAotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsIEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZiwgWF9zdGwpOwogCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7Ci0KKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLCBBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCwgWF9zdGwpOwogICB9CiAKICAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKIAotICBBY3Rpb25fYWF0X3Byb2R1Y3QoIGNvbnN0ICBBY3Rpb25fYWF0X3Byb2R1Y3QgJiApCi0gIHsKKyAgQWN0aW9uX2FhdF9wcm9kdWN0KGNvbnN0IEFjdGlvbl9hYXRfcHJvZHVjdCYpIHsKICAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9hYXRfcHJvZHVjdCBDb3B5IEN0b3IiKTsKICAgICBleGl0KDApOwogICB9CiAKICAgLy8gRHRvcgogCi0gIH5BY3Rpb25fYWF0X3Byb2R1Y3QoIHZvaWQgKXsKLQorICB+QWN0aW9uX2FhdF9wcm9kdWN0KHZvaWQpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fYWF0X3Byb2R1Y3QgRHRvciIpOwogCiAgICAgLy8gZGVhbGxvY2F0aW9uCiAKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsX3NpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLCBfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYLCBfc2l6ZSk7CiAKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKLQorICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQV9yZWYsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLCBfc2l6ZSk7CiAgIH0KIAogICAvLyBhY3Rpb24gbmFtZQogCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gImFhdF8iK0ludGVyZmFjZTo6bmFtZSgpOworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUodm9pZCkgeyByZXR1cm4gImFhdF8iICsgSW50ZXJmYWNlOjpuYW1lKCk7IH0KKworICBkb3VibGUgbmJfb3BfYmFzZSh2b2lkKSB7IHJldHVybiBkb3VibGUoX3NpemUpICogZG91YmxlKF9zaXplKSAqIGRvdWJsZShfc2l6ZSk7IH0KKworICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKHZvaWQpIHsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLCBBLCBfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZiwgWCwgX3NpemUpOwogICB9CiAKLSAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKLSAgICByZXR1cm4gZG91YmxlKF9zaXplKSpkb3VibGUoX3NpemUpKmRvdWJsZShfc2l6ZSk7Ci0gIH0KKyAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKHZvaWQpIHsgSW50ZXJmYWNlOjphYXRfcHJvZHVjdChBLCBYLCBfc2l6ZSk7IH0KIAotICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7Ci0KLSAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOwotICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7Ci0KLSAgfQotCi0gIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKLQotICAgICAgSW50ZXJmYWNlOjphYXRfcHJvZHVjdChBLFgsX3NpemUpOwotCi0gIH0KLQotICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApewotICAgIGlmIChfc2l6ZT4xMjgpIHJldHVybjsKKyAgdm9pZCBjaGVja19yZXN1bHQodm9pZCkgeworICAgIGlmIChfc2l6ZSA+IDEyOCkgcmV0dXJuOwogICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCiAKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoWCxyZXN1X3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKFgsIHJlc3Vfc3RsKTsKIAotICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjphYXRfcHJvZHVjdChBX3N0bCxYX3N0bCxfc2l6ZSk7CisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmFhdF9wcm9kdWN0KEFfc3RsLCBYX3N0bCwgX3NpemUpOwogCi0gICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9Ci0gICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvciA9IFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwsIHJlc3Vfc3RsKTsKIAotICAgIGlmIChlcnJvcj4xLmUtNil7CisgICAgaWYgKGVycm9yID4gMS5lLTYpIHsKICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOwogICAgICAgZXhpdCgxKTsKICAgICB9Ci0KICAgfQogCi1wcml2YXRlIDoKLQorIHByaXZhdGU6CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggcmVzdV9zdGw7CkBAIC0xMzMsMTMgKzExMiw3IEBACiAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQTsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYOwogCi0KICAgaW50IF9zaXplOwotCiB9OwogCi0KICNlbmRpZgotCi0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2F0YV9wcm9kdWN0LmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2F0YV9wcm9kdWN0LmhoCmluZGV4IDA0MzY0ZmUuLjA0NDdhYjMgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9hdGFfcHJvZHVjdC5oaAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXRhX3Byb2R1Y3QuaGgKQEAgLTI4LDEwMSArMjgsODAgQEAKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgordGVtcGxhdGUgPGNsYXNzIEludGVyZmFjZT4KIGNsYXNzIEFjdGlvbl9hdGFfcHJvZHVjdCB7Ci0KLXB1YmxpYyA6Ci0KKyBwdWJsaWM6CiAgIC8vIEN0b3IKIAotICBBY3Rpb25fYXRhX3Byb2R1Y3QoIGludCBzaXplICk6X3NpemUoc2l6ZSkKLSAgeworICBBY3Rpb25fYXRhX3Byb2R1Y3QoaW50IHNpemUpIDogX3NpemUoc2l6ZSkgewogICAgIE1FU1NBR0UoIkFjdGlvbl9hdGFfcHJvZHVjdCBDdG9yIik7CiAKICAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KIAotICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKLSAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihYX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oWF9zdGwsIF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCwgX3NpemUpOwogCiAgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgogCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZiwgQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLCBYX3N0bCk7CiAKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYLFhfc3RsKTsKLQorICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsIEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYLCBYX3N0bCk7CiAgIH0KIAogICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgogCi0gIEFjdGlvbl9hdGFfcHJvZHVjdCggY29uc3QgIEFjdGlvbl9hdGFfcHJvZHVjdCAmICkKLSAgeworICBBY3Rpb25fYXRhX3Byb2R1Y3QoY29uc3QgQWN0aW9uX2F0YV9wcm9kdWN0JikgewogICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2F0YV9wcm9kdWN0IENvcHkgQ3RvciIpOwogICAgIGV4aXQoMCk7CiAgIH0KIAogICAvLyBEdG9yCiAKLSAgfkFjdGlvbl9hdGFfcHJvZHVjdCggdm9pZCApewotCisgIH5BY3Rpb25fYXRhX3Byb2R1Y3Qodm9pZCkgewogICAgIE1FU1NBR0UoIkFjdGlvbl9hdGFfcHJvZHVjdCBEdG9yIik7CiAKICAgICAvLyBkZWFsbG9jYXRpb24KIAotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsIF9zaXplKTsKIAotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQV9yZWYsX3NpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsX3NpemUpOwotCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZiwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsIF9zaXplKTsKICAgfQogCiAgIC8vIGFjdGlvbiBuYW1lCiAKLSAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKLSAgewotICAgIHJldHVybiAiYXRhXyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSh2b2lkKSB7IHJldHVybiAiYXRhXyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKHZvaWQpIHsgcmV0dXJuIDIuMCAqIF9zaXplICogX3NpemUgKiBfc2l6ZTsgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUodm9pZCkgeworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsIEEsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KFhfcmVmLCBYLCBfc2l6ZSk7CiAgIH0KIAotICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApewotICAgIHJldHVybiAyLjAqX3NpemUqX3NpemUqX3NpemU7Ci0gIH0KKyAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKHZvaWQpIHsgSW50ZXJmYWNlOjphdGFfcHJvZHVjdChBLCBYLCBfc2l6ZSk7IH0KIAotICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7Ci0KLSAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOwotICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7Ci0KLSAgfQotCi0gIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKLQotICAgICAgSW50ZXJmYWNlOjphdGFfcHJvZHVjdChBLFgsX3NpemUpOwotCi0gIH0KLQotICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApewotICAgIGlmIChfc2l6ZT4xMjgpIHJldHVybjsKKyAgdm9pZCBjaGVja19yZXN1bHQodm9pZCkgeworICAgIGlmIChfc2l6ZSA+IDEyOCkgcmV0dXJuOwogICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCiAKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoWCxyZXN1X3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKFgsIHJlc3Vfc3RsKTsKIAotICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjphdGFfcHJvZHVjdChBX3N0bCxYX3N0bCxfc2l6ZSk7CisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmF0YV9wcm9kdWN0KEFfc3RsLCBYX3N0bCwgX3NpemUpOwogCi0gICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9Ci0gICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvciA9IFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwsIHJlc3Vfc3RsKTsKIAotICAgIGlmIChlcnJvcj4xLmUtNil7CisgICAgaWYgKGVycm9yID4gMS5lLTYpIHsKICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOwogICAgICAgZXhpdCgxKTsKICAgICB9Ci0KICAgfQogCi1wcml2YXRlIDoKLQorIHByaXZhdGU6CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggcmVzdV9zdGw7CkBAIC0xMzMsMTMgKzExMiw3IEBACiAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQTsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYOwogCi0KICAgaW50IF9zaXplOwotCiB9OwogCi0KICNlbmRpZgotCi0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2F0dl9wcm9kdWN0LmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2F0dl9wcm9kdWN0LmhoCmluZGV4IGE4MjM0NTEuLjkzYzJlMWMgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9hdHZfcHJvZHVjdC5oaAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXR2X3Byb2R1Y3QuaGgKQEAgLTI4LDg3ICsyOCw3OSBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi10ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+Cit0ZW1wbGF0ZSA8Y2xhc3MgSW50ZXJmYWNlPgogY2xhc3MgQWN0aW9uX2F0dl9wcm9kdWN0IHsKLQotcHVibGljIDoKLQotICBBY3Rpb25fYXR2X3Byb2R1Y3QoIGludCBzaXplICkgOiBfc2l6ZShzaXplKQotICB7CisgcHVibGljOgorICBBY3Rpb25fYXR2X3Byb2R1Y3QoaW50IHNpemUpIDogX3NpemUoc2l6ZSkgewogICAgIE1FU1NBR0UoIkFjdGlvbl9hdHZfcHJvZHVjdCBDdG9yIik7CiAKICAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KIAotICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKLSAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihCX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOwotICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCwgX3NpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEJfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4oWF9zdGwsIF9zaXplKTsKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCwgX3NpemUpOwogCiAgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgogCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEJfcmVmLEJfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsIEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCX3JlZiwgQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLCBYX3N0bCk7CiAKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCLEJfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLCBBX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQiwgQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFgsIFhfc3RsKTsKICAgfQogCiAgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCi0gIEFjdGlvbl9hdHZfcHJvZHVjdCggY29uc3QgIEFjdGlvbl9hdHZfcHJvZHVjdCAmICkKLSAgeworICBBY3Rpb25fYXR2X3Byb2R1Y3QoY29uc3QgQWN0aW9uX2F0dl9wcm9kdWN0JikgewogICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2F0dl9wcm9kdWN0IENvcHkgQ3RvciIpOwogICAgIGV4aXQoMSk7CiAgIH0KIAotICB+QWN0aW9uX2F0dl9wcm9kdWN0KCB2b2lkICkKLSAgeworICB+QWN0aW9uX2F0dl9wcm9kdWN0KHZvaWQpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fYXR2X3Byb2R1Y3QgRHRvciIpOwogCi0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsIF9zaXplKTsKICAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOwogICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7CiAKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLCBfc2l6ZSk7CiAgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihCX3JlZik7CiAgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYX3JlZik7CiAgIH0KIAogICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKSB7IHJldHVybiAiYXR2XyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsgfQogCi0gIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICkgeyByZXR1cm4gMi4wKl9zaXplKl9zaXplOyB9CisgIGRvdWJsZSBuYl9vcF9iYXNlKHZvaWQpIHsgcmV0dXJuIDIuMCAqIF9zaXplICogX3NpemU7IH0KIAotICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7Ci0gICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZixBLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKEJfcmVmLEIsX3NpemUpOwotICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsWCxfc2l6ZSk7CisgIGlubGluZSB2b2lkIGluaXRpYWxpemUodm9pZCkgeworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsIEEsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKEJfcmVmLCBCLCBfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihYX3JlZiwgWCwgX3NpemUpOwogICB9CiAKLSAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjYWxjdWxhdGUodm9pZCkgewogICAgIEJUTF9BU01fQ09NTUVOVCgiYmVnaW4gYXR2Iik7Ci0gICAgSW50ZXJmYWNlOjphdHZfcHJvZHVjdChBLEIsWCxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjphdHZfcHJvZHVjdChBLCBCLCBYLCBfc2l6ZSk7CiAgICAgQlRMX0FTTV9DT01NRU5UKCJlbmQgYXR2Iik7CiAgIH0KIAotICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApCi0gIHsKLSAgICBpZiAoX3NpemU+MTI4KSByZXR1cm47Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFgscmVzdV9zdGwpOworICB2b2lkIGNoZWNrX3Jlc3VsdCh2b2lkKSB7CisgICAgaWYgKF9zaXplID4gMTI4KSByZXR1cm47CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFgsIHJlc3Vfc3RsKTsKIAotICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjphdHZfcHJvZHVjdChBX3N0bCxCX3N0bCxYX3N0bCxfc2l6ZSk7CisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmF0dl9wcm9kdWN0KEFfc3RsLCBCX3N0bCwgWF9zdGwsIF9zaXplKTsKIAotICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQotICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3IgPSBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLCByZXN1X3N0bCk7CiAKLSAgICBpZiAoZXJyb3I+MS5lLTYpeworICAgIGlmIChlcnJvciA+IDEuZS02KSB7CiAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKICAgICAgIGV4aXQoMSk7CiAgICAgfQogICB9CiAKLXByaXZhdGUgOgotCisgcHJpdmF0ZToKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEFfc3RsOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgQl9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBYX3N0bDsKQEAgLTEyMiwxMyArMTE0LDcgQEAKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBCOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFg7CiAKLQogICBpbnQgX3NpemU7Ci0KIH07CiAKLQogI2VuZGlmCi0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXhwYnkuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXhwYnkuaGgKaW5kZXggZGFkZDBjYy4uZTc0Y2JkOCAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2F4cGJ5LmhoCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9heHBieS5oaApAQCAtMjcsMzggKzI3LDM0IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLXRlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK3RlbXBsYXRlIDxjbGFzcyBJbnRlcmZhY2U+CiBjbGFzcyBBY3Rpb25fYXhwYnkgewotCi1wdWJsaWMgOgotCisgcHVibGljOgogICAvLyBDdG9yCi0gIEFjdGlvbl9heHBieSggaW50IHNpemUgKTpfYWxwaGEoMC41KSxfYmV0YSgwLjk1KSxfc2l6ZShzaXplKQotICB7CisgIEFjdGlvbl9heHBieShpbnQgc2l6ZSkgOiBfYWxwaGEoMC41KSwgX2JldGEoMC45NSksIF9zaXplKHNpemUpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fYXhwYnkgQ3RvciIpOwogCiAgICAgLy8gU1RMIHZlY3RvciBpbml0aWFsaXphdGlvbgotICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KFhfc3RsLF9zaXplKTsKLSAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihZX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KFhfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oWV9zdGwsIF9zaXplKTsKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCwgX3NpemUpOwogCiAgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChZX3JlZixZX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWF9yZWYsIFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChZX3JlZiwgWV9zdGwpOwogCi0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWCxYX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWSxZX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWCwgWF9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFksIFlfc3RsKTsKICAgfQogCiAgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCi0gIEFjdGlvbl9heHBieSggY29uc3QgIEFjdGlvbl9heHBieSAmICkKLSAgeworICBBY3Rpb25fYXhwYnkoY29uc3QgQWN0aW9uX2F4cGJ5JikgewogICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2F4cGJ5IENvcHkgQ3RvciIpOwogICAgIGV4aXQoMSk7CiAgIH0KIAogICAvLyBEdG9yCi0gIH5BY3Rpb25fYXhwYnkoIHZvaWQgKXsKKyAgfkFjdGlvbl9heHBieSh2b2lkKSB7CiAgICAgTUVTU0FHRSgiQWN0aW9uX2F4cGJ5IER0b3IiKTsKIAogICAgIC8vIGRlYWxsb2NhdGlvbgpAQCAtNzAsNDQgKzY2LDM3IEBACiAgIH0KIAogICAvLyBhY3Rpb24gbmFtZQotICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuICJheHBieV8iK0ludGVyZmFjZTo6bmFtZSgpOworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUodm9pZCkgeyByZXR1cm4gImF4cGJ5XyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKHZvaWQpIHsgcmV0dXJuIDMuMCAqIF9zaXplOyB9CisKKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKSB7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihYX3JlZiwgWCwgX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWV9yZWYsIFksIF9zaXplKTsKICAgfQogCi0gIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7Ci0gICAgcmV0dXJuIDMuMCpfc2l6ZTsKLSAgfQotCi0gIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKLSAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKFhfcmVmLFgsX3NpemUpOwotICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWV9yZWYsWSxfc2l6ZSk7Ci0gIH0KLQotICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSh2b2lkKSB7CiAgICAgQlRMX0FTTV9DT01NRU5UKCJteWJlZ2luIGF4cGJ5Iik7Ci0gICAgSW50ZXJmYWNlOjpheHBieShfYWxwaGEsWCxfYmV0YSxZLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmF4cGJ5KF9hbHBoYSwgWCwgX2JldGEsIFksIF9zaXplKTsKICAgICBCVExfQVNNX0NPTU1FTlQoIm15ZW5kIGF4cGJ5Iik7CiAgIH0KIAotICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApewotICAgIGlmIChfc2l6ZT4xMjgpIHJldHVybjsKKyAgdm9pZCBjaGVja19yZXN1bHQodm9pZCkgeworICAgIGlmIChfc2l6ZSA+IDEyOCkgcmV0dXJuOwogICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCi0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFkscmVzdV9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChZLCByZXN1X3N0bCk7CiAKLSAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6YXhwYnkoX2FscGhhLFhfc3RsLF9iZXRhLFlfc3RsLF9zaXplKTsKKyAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6YXhwYnkoX2FscGhhLCBYX3N0bCwgX2JldGEsIFlfc3RsLCBfc2l6ZSk7CiAKLSAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KLSAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWV9zdGwscmVzdV9zdGwpOworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yID0gU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihZX3N0bCwgcmVzdV9zdGwpOwogCi0gICAgaWYgKGVycm9yPjEuZS02KXsKKyAgICBpZiAoZXJyb3IgPiAxLmUtNikgewogICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CiAgICAgICBleGl0KDIpOwogICAgIH0KICAgfQogCi1wcml2YXRlIDoKLQorIHByaXZhdGU6CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBYX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIFlfc3RsOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgcmVzdV9zdGw7CmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fYXhweS5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9heHB5LmhoCmluZGV4IDI2MWJlNGMuLjA3M2YzNjQgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9heHB5LmhoCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9heHB5LmhoCkBAIC0yOCw0NiArMjgsMzkgQEAKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgordGVtcGxhdGUgPGNsYXNzIEludGVyZmFjZT4KIGNsYXNzIEFjdGlvbl9heHB5IHsKLQotcHVibGljIDoKLQorIHB1YmxpYzoKICAgLy8gQ3RvcgogCi0gIEFjdGlvbl9heHB5KCBpbnQgc2l6ZSApOl9jb2VmKDEuMCksX3NpemUoc2l6ZSkKLSAgeworICBBY3Rpb25fYXhweShpbnQgc2l6ZSkgOiBfY29lZigxLjApLCBfc2l6ZShzaXplKSB7CiAgICAgTUVTU0FHRSgiQWN0aW9uX2F4cHkgQ3RvciIpOwogCiAgICAgLy8gU1RMIHZlY3RvciBpbml0aWFsaXphdGlvbgogCi0gICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oWF9zdGwsX3NpemUpOwotICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KFlfc3RsLF9zaXplKTsKLSAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oWF9zdGwsIF9zaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihZX3N0bCwgX3NpemUpOworICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLCBfc2l6ZSk7CiAKICAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCiAKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYX3JlZixYX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWV9yZWYsWV9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLCBYX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWV9yZWYsIFlfc3RsKTsKIAotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFgsWF9zdGwpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFksWV9zdGwpOwotCi0KKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLCBYX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWSwgWV9zdGwpOwogICB9CiAKICAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKIAotICBBY3Rpb25fYXhweSggY29uc3QgIEFjdGlvbl9heHB5ICYgKQotICB7CisgIEFjdGlvbl9heHB5KGNvbnN0IEFjdGlvbl9heHB5JikgewogICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2F4cHkgQ29weSBDdG9yIik7CiAgICAgZXhpdCgxKTsKICAgfQogCiAgIC8vIER0b3IKIAotICB+QWN0aW9uX2F4cHkoIHZvaWQgKXsKLQorICB+QWN0aW9uX2F4cHkodm9pZCkgewogICAgIE1FU1NBR0UoIkFjdGlvbl9heHB5IER0b3IiKTsKIAogICAgIC8vIGRlYWxsb2NhdGlvbgpAQCAtODEsNDYgKzc0LDM4IEBACiAKICAgLy8gYWN0aW9uIG5hbWUKIAotICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuICJheHB5XyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSh2b2lkKSB7IHJldHVybiAiYXhweV8iICsgSW50ZXJmYWNlOjpuYW1lKCk7IH0KKworICBkb3VibGUgbmJfb3BfYmFzZSh2b2lkKSB7IHJldHVybiAyLjAgKiBfc2l6ZTsgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUodm9pZCkgeworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsIFgsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKFlfcmVmLCBZLCBfc2l6ZSk7CiAgIH0KIAotICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApewotICAgIHJldHVybiAyLjAqX3NpemU7Ci0gIH0KLQotICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7Ci0gICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihYX3JlZixYLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKFlfcmVmLFksX3NpemUpOwotICB9Ci0KLSAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUodm9pZCkgewogICAgIEJUTF9BU01fQ09NTUVOVCgibXliZWdpbiBheHB5Iik7Ci0gICAgSW50ZXJmYWNlOjpheHB5KF9jb2VmLFgsWSxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpheHB5KF9jb2VmLCBYLCBZLCBfc2l6ZSk7CiAgICAgQlRMX0FTTV9DT01NRU5UKCJteWVuZCBheHB5Iik7CiAgIH0KIAotICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApewotICAgIGlmIChfc2l6ZT4xMjgpIHJldHVybjsKKyAgdm9pZCBjaGVja19yZXN1bHQodm9pZCkgeworICAgIGlmIChfc2l6ZSA+IDEyOCkgcmV0dXJuOwogICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCiAKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWSxyZXN1X3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFksIHJlc3Vfc3RsKTsKIAotICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpheHB5KF9jb2VmLFhfc3RsLFlfc3RsLF9zaXplKTsKKyAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6YXhweShfY29lZiwgWF9zdGwsIFlfc3RsLCBfc2l6ZSk7CiAKLSAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KLSAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWV9zdGwscmVzdV9zdGwpOworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yID0gU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihZX3N0bCwgcmVzdV9zdGwpOwogCi0gICAgaWYgKGVycm9yPjEuZS02KXsKKyAgICBpZiAoZXJyb3IgPiAxLmUtNikgewogICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CiAgICAgICBleGl0KDApOwogICAgIH0KLQogICB9CiAKLXByaXZhdGUgOgotCisgcHJpdmF0ZToKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIFhfc3RsOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWV9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciByZXN1X3N0bDsKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9jaG9sZXNreS5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9jaG9sZXNreS5oaAppbmRleCA1ZjY2ZDExLi5jMmFjMWMyIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fY2hvbGVza3kuaGgKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2Nob2xlc2t5LmhoCkBAIC0yNyw5MyArMjcsNzUgQEAKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgordGVtcGxhdGUgPGNsYXNzIEludGVyZmFjZT4KIGNsYXNzIEFjdGlvbl9jaG9sZXNreSB7Ci0KLXB1YmxpYyA6Ci0KKyBwdWJsaWM6CiAgIC8vIEN0b3IKIAotICBBY3Rpb25fY2hvbGVza3koIGludCBzaXplICk6X3NpemUoc2l6ZSkKLSAgeworICBBY3Rpb25fY2hvbGVza3koaW50IHNpemUpIDogX3NpemUoc2l6ZSkgewogICAgIE1FU1NBR0UoIkFjdGlvbl9jaG9sZXNreSBDdG9yIik7CiAKICAgICAvLyBTVEwgbWF0L3ZlYyBpbml0aWFsaXphdGlvbgotICAgIGluaXRfbWF0cml4X3N5bW08cHNldWRvX3JhbmRvbT4oWF9zdGwsX3NpemUpOwotICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KENfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeF9zeW1tPHBzZXVkb19yYW5kb20+KFhfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oQ19zdGwsIF9zaXplKTsKIAogICAgIC8vIG1ha2Ugc3VyZSBYIGlzIGludmVydGlibGUKLSAgICBmb3IgKGludCBpPTA7IGk8X3NpemU7ICsraSkKLSAgICAgIFhfc3RsW2ldW2ldID0gc3RkOjphYnMoWF9zdGxbaV1baV0pICogMWUyICsgMTAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NpemU7ICsraSkgWF9zdGxbaV1baV0gPSBzdGQ6OmFicyhYX3N0bFtpXVtpXSkgKiAxZTIgKyAxMDA7CiAKICAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEMsQ19zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLCBYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCwgWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEMsIENfc3RsKTsKIAogICAgIF9jb3N0ID0gMDsKLSAgICBmb3IgKGludCBqPTA7IGo8X3NpemU7ICsraikKLSAgICB7Ci0gICAgICBkb3VibGUgciA9IHN0ZDo6bWF4KF9zaXplIC0gaiAtMSwwKTsKLSAgICAgIF9jb3N0ICs9IDIqKHIqaityK2opOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgX3NpemU7ICsraikgeworICAgICAgZG91YmxlIHIgPSBzdGQ6Om1heChfc2l6ZSAtIGogLSAxLCAwKTsKKyAgICAgIF9jb3N0ICs9IDIgKiAociAqIGogKyByICsgaik7CiAgICAgfQogICB9CiAKICAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKIAotICBBY3Rpb25fY2hvbGVza3koIGNvbnN0ICBBY3Rpb25fY2hvbGVza3kgJiApCi0gIHsKKyAgQWN0aW9uX2Nob2xlc2t5KGNvbnN0IEFjdGlvbl9jaG9sZXNreSYpIHsKICAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9jaG9sZXNreSBDb3B5IEN0b3IiKTsKICAgICBleGl0KDEpOwogICB9CiAKICAgLy8gRHRvcgogCi0gIH5BY3Rpb25fY2hvbGVza3koIHZvaWQgKXsKLQorICB+QWN0aW9uX2Nob2xlc2t5KHZvaWQpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fY2hvbGVza3kgRHRvciIpOwogCiAgICAgLy8gZGVhbGxvY2F0aW9uCi0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZixfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEMsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEMsIF9zaXplKTsKICAgfQogCiAgIC8vIGFjdGlvbiBuYW1lCiAKLSAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKLSAgewotICAgIHJldHVybiAiY2hvbGVza3lfIitJbnRlcmZhY2U6Om5hbWUoKTsKLSAgfQorICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUodm9pZCkgeyByZXR1cm4gImNob2xlc2t5XyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsgfQogCi0gIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7Ci0gICAgcmV0dXJuIF9jb3N0OwotICB9CisgIGRvdWJsZSBuYl9vcF9iYXNlKHZvaWQpIHsgcmV0dXJuIF9jb3N0OyB9CiAKLSAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApewotICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7Ci0gIH0KKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKSB7IEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsIFgsIF9zaXplKTsgfQogCi0gIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKLSAgICAgIEludGVyZmFjZTo6Y2hvbGVza3koWCxDLF9zaXplKTsKLSAgfQorICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUodm9pZCkgeyBJbnRlcmZhY2U6OmNob2xlc2t5KFgsIEMsIF9zaXplKTsgfQogCi0gIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisgIHZvaWQgY2hlY2tfcmVzdWx0KHZvaWQpIHsKICAgICAvLyBjYWxjdWxhdGlvbiBjaGVjawotLy8gICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpjaG9sZXNreShYX3N0bCxDX3N0bCxfc2l6ZSk7Ci0vLwotLy8gICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQotLy8gICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihDX3N0bCxyZXN1X3N0bCk7Ci0vLwotLy8gICAgIGlmIChlcnJvcj4xLmUtNil7Ci0vLyAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKLS8vICAgICAgIGV4aXQoMCk7Ci0vLyAgICAgfQotCisgICAgLy8gICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpjaG9sZXNreShYX3N0bCxDX3N0bCxfc2l6ZSk7CisgICAgLy8KKyAgICAvLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgLy8gICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihDX3N0bCxyZXN1X3N0bCk7CisgICAgLy8KKyAgICAvLyAgICAgaWYgKGVycm9yPjEuZS02KXsKKyAgICAvLyAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAvLyAgICAgICBleGl0KDApOworICAgIC8vICAgICB9CiAgIH0KIAotcHJpdmF0ZSA6Ci0KKyBwcml2YXRlOgogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggWF9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBDX3N0bDsKIApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2dlci5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9nZXIuaGgKaW5kZXggZGM3NjZlZi4uZDQ2ZGQwYSAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2dlci5oaAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fZ2VyLmhoCkBAIC0yMyw5MSArMjMsNzggQEAKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgordGVtcGxhdGUgPGNsYXNzIEludGVyZmFjZT4KIGNsYXNzIEFjdGlvbl9nZXIgewotCi1wdWJsaWMgOgotCisgcHVibGljOgogICAvLyBDdG9yCi0gIEJUTF9ET05UX0lOTElORSBBY3Rpb25fZ2VyKCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCi0gIHsKKyAgQlRMX0RPTlRfSU5MSU5FIEFjdGlvbl9nZXIoaW50IHNpemUpIDogX3NpemUoc2l6ZSkgewogICAgIE1FU1NBR0UoIkFjdGlvbl9nZXIgQ3RvciIpOwogCiAgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCiAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHRtcDsKLSAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oQl9zdGwsX3NpemUpOwotICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KFhfc3RsLF9zaXplKTsKLSAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsIF9zaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihCX3N0bCwgX3NpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KFhfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsIF9zaXplKTsKIAogICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQl9yZWYsQl9zdGwpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEIsQl9zdGwpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZiwgQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsIEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCX3JlZiwgQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEIsIEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYX3JlZiwgWF9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFgsIFhfc3RsKTsKICAgfQogCiAgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCi0gIEFjdGlvbl9nZXIoIGNvbnN0ICBBY3Rpb25fZ2VyICYgKQotICB7CisgIEFjdGlvbl9nZXIoY29uc3QgQWN0aW9uX2dlciYpIHsKICAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9nZXIgQ29weSBDdG9yIik7CiAgICAgZXhpdCgxKTsKICAgfQogCiAgIC8vIER0b3IKLSAgQlRMX0RPTlRfSU5MSU5FIH5BY3Rpb25fZ2VyKCB2b2lkICl7CisgIEJUTF9ET05UX0lOTElORSB+QWN0aW9uX2dlcih2b2lkKSB7CiAgICAgTUVTU0FHRSgiQWN0aW9uX2dlciBEdG9yIik7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsIF9zaXplKTsKICAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOwogICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZiwgX3NpemUpOwogICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQl9yZWYpOwogICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWF9yZWYpOwotCiAgIH0KIAogICAvLyBhY3Rpb24gbmFtZQotICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuICJnZXJfIiArIEludGVyZmFjZTo6bmFtZSgpOworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUodm9pZCkgeyByZXR1cm4gImdlcl8iICsgSW50ZXJmYWNlOjpuYW1lKCk7IH0KKworICBkb3VibGUgbmJfb3BfYmFzZSh2b2lkKSB7IHJldHVybiAyLjAgKiBfc2l6ZSAqIF9zaXplOyB9CisKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKSB7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZiwgQSwgX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoQl9yZWYsIEIsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKFhfcmVmLCBYLCBfc2l6ZSk7CiAgIH0KIAotICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApewotICAgIHJldHVybiAyLjAqX3NpemUqX3NpemU7Ci0gIH0KLQotICBCVExfRE9OVF9JTkxJTkUgIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApewotICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsQSxfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihCX3JlZixCLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKFhfcmVmLFgsX3NpemUpOwotICB9Ci0KLSAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjYWxjdWxhdGUodm9pZCkgewogICAgIEJUTF9BU01fQ09NTUVOVCgiI2JlZ2luIGdlciIpOwotICAgIEludGVyZmFjZTo6Z2VyKEEsQixYLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmdlcihBLCBCLCBYLCBfc2l6ZSk7CiAgICAgQlRMX0FTTV9DT01NRU5UKCJlbmQgZ2VyIik7CiAgIH0KIAotICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2hlY2tfcmVzdWx0KHZvaWQpIHsKICAgICAvLyBjYWxjdWxhdGlvbiBjaGVjawotICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLHJlc3Vfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWCwgcmVzdV9zdGwpOwogCi0gICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmdlcihBX3N0bCxCX3N0bCxYX3N0bCxfc2l6ZSk7CisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmdlcihBX3N0bCwgQl9zdGwsIFhfc3RsLCBfc2l6ZSk7CiAKLSAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KLSAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwscmVzdV9zdGwpOworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yID0gU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCwgcmVzdV9zdGwpOwogCi0gICAgaWYgKGVycm9yPjEuZS0zKXsKKyAgICBpZiAoZXJyb3IgPiAxLmUtMykgewogICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7Ci0vLyAgICAgICBleGl0KDApOworICAgICAgLy8gICAgICAgZXhpdCgwKTsKICAgICB9Ci0KICAgfQogCi1wcml2YXRlIDoKLQorIHByaXZhdGU6CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIEJfc3RsOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWF9zdGw7CkBAIC0xMjQsNSArMTExLDQgQEAKICAgaW50IF9zaXplOwogfTsKIAotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9oZXNzZW5iZXJnLmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2hlc3NlbmJlcmcuaGgKaW5kZXggMjEwMGViZC4uYzM2NGJmYyAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2hlc3NlbmJlcmcuaGgKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2hlc3NlbmJlcmcuaGgKQEAgLTI3LDk0ICsyNyw3NyBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi10ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+Cit0ZW1wbGF0ZSA8Y2xhc3MgSW50ZXJmYWNlPgogY2xhc3MgQWN0aW9uX2hlc3NlbmJlcmcgewotCi1wdWJsaWMgOgotCisgcHVibGljOgogICAvLyBDdG9yCiAKLSAgQWN0aW9uX2hlc3NlbmJlcmcoIGludCBzaXplICk6X3NpemUoc2l6ZSkKLSAgeworICBBY3Rpb25faGVzc2VuYmVyZyhpbnQgc2l6ZSkgOiBfc2l6ZShzaXplKSB7CiAgICAgTUVTU0FHRSgiQWN0aW9uX2hlc3NlbmJlcmcgQ3RvciIpOwogCiAgICAgLy8gU1RMIHZlY3RvciBpbml0aWFsaXphdGlvbgotICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KFhfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihYX3N0bCwgX3NpemUpOwogCi0gICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oQ19zdGwsX3NpemUpOwotICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihDX3N0bCwgX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLCBfc2l6ZSk7CiAKICAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEMsQ19zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLCBYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCwgWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEMsIENfc3RsKTsKIAogICAgIF9jb3N0ID0gMDsKLSAgICBmb3IgKGludCBqPTA7IGo8X3NpemUtMjsgKytqKQotICAgIHsKLSAgICAgIGRvdWJsZSByID0gc3RkOjptYXgoMCxfc2l6ZS1qLTEpOwotICAgICAgZG91YmxlIGIgPSBzdGQ6Om1heCgwLF9zaXplLWotMik7Ci0gICAgICBfY29zdCArPSA2ICsgMypiICsgcipyKjQgKyByKl9zaXplKjQ7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBfc2l6ZSAtIDI7ICsraikgeworICAgICAgZG91YmxlIHIgPSBzdGQ6Om1heCgwLCBfc2l6ZSAtIGogLSAxKTsKKyAgICAgIGRvdWJsZSBiID0gc3RkOjptYXgoMCwgX3NpemUgLSBqIC0gMik7CisgICAgICBfY29zdCArPSA2ICsgMyAqIGIgKyByICogciAqIDQgKyByICogX3NpemUgKiA0OwogICAgIH0KICAgfQogCiAgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCiAKLSAgQWN0aW9uX2hlc3NlbmJlcmcoIGNvbnN0ICBBY3Rpb25faGVzc2VuYmVyZyAmICkKLSAgeworICBBY3Rpb25faGVzc2VuYmVyZyhjb25zdCBBY3Rpb25faGVzc2VuYmVyZyYpIHsKICAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9oZXNzZW5iZXJnIENvcHkgQ3RvciIpOwogICAgIGV4aXQoMSk7CiAgIH0KIAogICAvLyBEdG9yCiAKLSAgfkFjdGlvbl9oZXNzZW5iZXJnKCB2b2lkICl7Ci0KKyAgfkFjdGlvbl9oZXNzZW5iZXJnKHZvaWQpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25faGVzc2VuYmVyZyBEdG9yIik7CiAKICAgICAvLyBkZWFsbG9jYXRpb24KLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsX3NpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQyxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZiwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQywgX3NpemUpOwogICB9CiAKICAgLy8gYWN0aW9uIG5hbWUKIAotICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuICJoZXNzZW5iZXJnXyIrSW50ZXJmYWNlOjpuYW1lKCk7Ci0gIH0KKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKHZvaWQpIHsgcmV0dXJuICJoZXNzZW5iZXJnXyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsgfQogCi0gIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7Ci0gICAgcmV0dXJuIF9jb3N0OwotICB9CisgIGRvdWJsZSBuYl9vcF9iYXNlKHZvaWQpIHsgcmV0dXJuIF9jb3N0OyB9CiAKLSAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApewotICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7Ci0gIH0KKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKSB7IEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsIFgsIF9zaXplKTsgfQogCi0gIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKLSAgICAgIEludGVyZmFjZTo6aGVzc2VuYmVyZyhYLEMsX3NpemUpOwotICB9CisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSh2b2lkKSB7IEludGVyZmFjZTo6aGVzc2VuYmVyZyhYLCBDLCBfc2l6ZSk7IH0KIAotICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICB2b2lkIGNoZWNrX3Jlc3VsdCh2b2lkKSB7CiAgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoQyxyZXN1X3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKEMsIHJlc3Vfc3RsKTsKIAotLy8gICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpoZXNzZW5iZXJnKFhfc3RsLENfc3RsLF9zaXplKTsKLS8vCi0vLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9Ci0vLyAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKENfc3RsLHJlc3Vfc3RsKTsKLS8vCi0vLyAgICAgaWYgKGVycm9yPjEuZS02KXsKLS8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOwotLy8gICAgICAgZXhpdCgwKTsKLS8vICAgICB9Ci0KKyAgICAvLyAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Omhlc3NlbmJlcmcoWF9zdGwsQ19zdGwsX3NpemUpOworICAgIC8vCisgICAgLy8gICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorICAgIC8vICAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoQ19zdGwscmVzdV9zdGwpOworICAgIC8vCisgICAgLy8gICAgIGlmIChlcnJvcj4xLmUtNil7CisgICAgLy8gICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisgICAgLy8gICAgICAgZXhpdCgwKTsKKyAgICAvLyAgICAgfQogICB9CiAKLXByaXZhdGUgOgotCisgcHJpdmF0ZToKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQ19zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCByZXN1X3N0bDsKQEAgLTEyNyw5NyArMTEwLDgxIEBACiAgIGRvdWJsZSBfY29zdDsKIH07CiAKLXRlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK3RlbXBsYXRlIDxjbGFzcyBJbnRlcmZhY2U+CiBjbGFzcyBBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uIHsKLQotcHVibGljIDoKLQorIHB1YmxpYzoKICAgLy8gQ3RvcgogCi0gIEFjdGlvbl90cmlkaWFnb25hbGl6YXRpb24oIGludCBzaXplICk6X3NpemUoc2l6ZSkKLSAgeworICBBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uKGludCBzaXplKSA6IF9zaXplKHNpemUpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uIEN0b3IiKTsKIAogICAgIC8vIFNUTCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KLSAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihYX3N0bCxfc2l6ZSk7Ci0gICAgCi0gICAgZm9yKGludCBpPTA7IGk8X3NpemU7ICsraSkKLSAgICB7Ci0gICAgICBmb3IoaW50IGo9MDsgajxpOyArK2opCi0gICAgICAgIFhfc3RsW2ldW2pdID0gWF9zdGxbal1baV07CisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oWF9zdGwsIF9zaXplKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NpemU7ICsraSkgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyArK2opIFhfc3RsW2ldW2pdID0gWF9zdGxbal1baV07CiAgICAgfQotICAgIAotICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KENfc3RsLF9zaXplKTsKLSAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihDX3N0bCwgX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLCBfc2l6ZSk7CiAKICAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEMsQ19zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLCBYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCwgWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEMsIENfc3RsKTsKIAogICAgIF9jb3N0ID0gMDsKLSAgICBmb3IgKGludCBqPTA7IGo8X3NpemUtMjsgKytqKQotICAgIHsKLSAgICAgIGRvdWJsZSByID0gc3RkOjptYXgoMCxfc2l6ZS1qLTEpOwotICAgICAgZG91YmxlIGIgPSBzdGQ6Om1heCgwLF9zaXplLWotMik7Ci0gICAgICBfY29zdCArPSA2LiArIDMuKmIgKyByKnIqOC47CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBfc2l6ZSAtIDI7ICsraikgeworICAgICAgZG91YmxlIHIgPSBzdGQ6Om1heCgwLCBfc2l6ZSAtIGogLSAxKTsKKyAgICAgIGRvdWJsZSBiID0gc3RkOjptYXgoMCwgX3NpemUgLSBqIC0gMik7CisgICAgICBfY29zdCArPSA2LiArIDMuICogYiArIHIgKiByICogOC47CiAgICAgfQogICB9CiAKICAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKIAotICBBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uKCBjb25zdCAgQWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbiAmICkKLSAgeworICBBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IEFjdGlvbl90cmlkaWFnb25hbGl6YXRpb24mKSB7CiAgICAgSU5GT1MoImlsbGVnYWwgY2FsbCB0byBBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uIENvcHkgQ3RvciIpOwogICAgIGV4aXQoMSk7CiAgIH0KIAogICAvLyBEdG9yCiAKLSAgfkFjdGlvbl90cmlkaWFnb25hbGl6YXRpb24oIHZvaWQgKXsKLQorICB+QWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbih2b2lkKSB7CiAgICAgTUVTU0FHRSgiQWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbiBEdG9yIik7CiAKICAgICAvLyBkZWFsbG9jYXRpb24KLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsX3NpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQyxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZiwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQywgX3NpemUpOwogICB9CiAKICAgLy8gYWN0aW9uIG5hbWUKIAotICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKSB7IHJldHVybiAidHJpZGlhZ29uYWxpemF0aW9uXyIrSW50ZXJmYWNlOjpuYW1lKCk7IH0KKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKHZvaWQpIHsgcmV0dXJuICJ0cmlkaWFnb25hbGl6YXRpb25fIiArIEludGVyZmFjZTo6bmFtZSgpOyB9CiAKLSAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKLSAgICByZXR1cm4gX2Nvc3Q7Ci0gIH0KKyAgZG91YmxlIG5iX29wX2Jhc2Uodm9pZCkgeyByZXR1cm4gX2Nvc3Q7IH0KIAotICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7Ci0gICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZixYLF9zaXplKTsKLSAgfQorICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKHZvaWQpIHsgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZiwgWCwgX3NpemUpOyB9CiAKLSAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgewotICAgICAgSW50ZXJmYWNlOjp0cmlkaWFnb25hbGl6YXRpb24oWCxDLF9zaXplKTsKLSAgfQorICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUodm9pZCkgeyBJbnRlcmZhY2U6OnRyaWRpYWdvbmFsaXphdGlvbihYLCBDLCBfc2l6ZSk7IH0KIAotICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICB2b2lkIGNoZWNrX3Jlc3VsdCh2b2lkKSB7CiAgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoQyxyZXN1X3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKEMsIHJlc3Vfc3RsKTsKIAotLy8gICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojp0cmlkaWFnb25hbGl6YXRpb24oWF9zdGwsQ19zdGwsX3NpemUpOwotLy8KLS8vICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KLS8vICAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoQ19zdGwscmVzdV9zdGwpOwotLy8KLS8vICAgICBpZiAoZXJyb3I+MS5lLTYpewotLy8gICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7Ci0vLyAgICAgICBleGl0KDApOwotLy8gICAgIH0KLQorICAgIC8vICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6dHJpZGlhZ29uYWxpemF0aW9uKFhfc3RsLENfc3RsLF9zaXplKTsKKyAgICAvLworICAgIC8vICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKyAgICAvLyAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKENfc3RsLHJlc3Vfc3RsKTsKKyAgICAvLworICAgIC8vICAgICBpZiAoZXJyb3I+MS5lLTYpeworICAgIC8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworICAgIC8vICAgICAgIGV4aXQoMCk7CisgICAgLy8gICAgIH0KICAgfQogCi1wcml2YXRlIDoKLQorIHByaXZhdGU6CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBYX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IENfc3RsOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggcmVzdV9zdGw7CmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbHVfZGVjb21wLmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2x1X2RlY29tcC5oaAppbmRleCAyNDQ4ZTgyLi40NmZhZDkxIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbHVfZGVjb21wLmhoCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9sdV9kZWNvbXAuaGgKQEAgLTI3LDg4ICsyNyw3MiBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi10ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+Cit0ZW1wbGF0ZSA8Y2xhc3MgSW50ZXJmYWNlPgogY2xhc3MgQWN0aW9uX2x1X2RlY29tcCB7Ci0KLXB1YmxpYyA6Ci0KKyBwdWJsaWM6CiAgIC8vIEN0b3IKIAotICBBY3Rpb25fbHVfZGVjb21wKCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCi0gIHsKKyAgQWN0aW9uX2x1X2RlY29tcChpbnQgc2l6ZSkgOiBfc2l6ZShzaXplKSB7CiAgICAgTUVTU0FHRSgiQWN0aW9uX2x1X2RlY29tcCBDdG9yIik7CiAKICAgICAvLyBTVEwgdmVjdG9yIGluaXRpYWxpemF0aW9uCi0gICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oWF9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KFhfc3RsLCBfc2l6ZSk7CiAKLSAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihDX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KENfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsIF9zaXplKTsKIAogICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQyxDX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsIFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYLCBYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQywgQ19zdGwpOwogCi0gICAgX2Nvc3QgPSAyLjAqc2l6ZSpzaXplKnNpemUvMy4wICsgc2l6ZSpzaXplOworICAgIF9jb3N0ID0gMi4wICogc2l6ZSAqIHNpemUgKiBzaXplIC8gMy4wICsgc2l6ZSAqIHNpemU7CiAgIH0KIAogICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgogCi0gIEFjdGlvbl9sdV9kZWNvbXAoIGNvbnN0ICBBY3Rpb25fbHVfZGVjb21wICYgKQotICB7CisgIEFjdGlvbl9sdV9kZWNvbXAoY29uc3QgQWN0aW9uX2x1X2RlY29tcCYpIHsKICAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9sdV9kZWNvbXAgQ29weSBDdG9yIik7CiAgICAgZXhpdCgxKTsKICAgfQogCiAgIC8vIER0b3IKIAotICB+QWN0aW9uX2x1X2RlY29tcCggdm9pZCApewotCisgIH5BY3Rpb25fbHVfZGVjb21wKHZvaWQpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fbHVfZGVjb21wIER0b3IiKTsKIAogICAgIC8vIGRlYWxsb2NhdGlvbgotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsX3NpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChDLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLCBfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYLCBfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChDLCBfc2l6ZSk7CiAgIH0KIAogICAvLyBhY3Rpb24gbmFtZQogCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gImNvbXBsZXRlX2x1X2RlY29tcF8iK0ludGVyZmFjZTo6bmFtZSgpOwotICB9CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSh2b2lkKSB7IHJldHVybiAiY29tcGxldGVfbHVfZGVjb21wXyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsgfQogCi0gIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7Ci0gICAgcmV0dXJuIF9jb3N0OwotICB9CisgIGRvdWJsZSBuYl9vcF9iYXNlKHZvaWQpIHsgcmV0dXJuIF9jb3N0OyB9CiAKLSAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApewotICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxfc2l6ZSk7Ci0gIH0KKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKSB7IEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsIFgsIF9zaXplKTsgfQogCi0gIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKLSAgICAgIEludGVyZmFjZTo6bHVfZGVjb21wKFgsQyxfc2l6ZSk7Ci0gIH0KKyAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKHZvaWQpIHsgSW50ZXJmYWNlOjpsdV9kZWNvbXAoWCwgQywgX3NpemUpOyB9CiAKLSAgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKKyAgdm9pZCBjaGVja19yZXN1bHQodm9pZCkgewogICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKEMscmVzdV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChDLCByZXN1X3N0bCk7CiAKLS8vICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bHVfZGVjb21wKFhfc3RsLENfc3RsLF9zaXplKTsKLS8vCi0vLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9Ci0vLyAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKENfc3RsLHJlc3Vfc3RsKTsKLS8vCi0vLyAgICAgaWYgKGVycm9yPjEuZS02KXsKLS8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOwotLy8gICAgICAgZXhpdCgwKTsKLS8vICAgICB9Ci0KKyAgICAvLyAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Omx1X2RlY29tcChYX3N0bCxDX3N0bCxfc2l6ZSk7CisgICAgLy8KKyAgICAvLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgLy8gICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihDX3N0bCxyZXN1X3N0bCk7CisgICAgLy8KKyAgICAvLyAgICAgaWYgKGVycm9yPjEuZS02KXsKKyAgICAvLyAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAvLyAgICAgICBleGl0KDApOworICAgIC8vICAgICB9CiAgIH0KIAotcHJpdmF0ZSA6Ci0KKyBwcml2YXRlOgogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggWF9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBDX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHJlc3Vfc3RsOwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2x1X3NvbHZlLmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX2x1X3NvbHZlLmhoCmluZGV4IDVhODFlNjMuLmFmYzY0MGMgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9sdV9zb2x2ZS5oaAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbHVfc29sdmUuaGgKQEAgLTEsMTQgKzEsMTQgQEAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIEZpbGUgICA6ICBhY3Rpb25fbHVfc29sdmUuaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE5IENFU1QgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDcgKzE2LDcgQEAKIC8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0vLyAKKy8vCiAjaWZuZGVmIEFDVElPTl9MVV9TT0xWRQogI2RlZmluZSBBQ1RJT05fTFVfU09MVkUKICNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKQEAgLTI4LDMzICsyOCwyNSBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi10ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+Ci1jbGFzcyBBY3Rpb25fbHVfc29sdmUgCi17Cit0ZW1wbGF0ZSA8Y2xhc3MgSW50ZXJmYWNlPgorY2xhc3MgQWN0aW9uX2x1X3NvbHZlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSh2b2lkKSB7IHJldHVybiAibHVfc29sdmVfIiArIEludGVyZmFjZTo6bmFtZSgpOyB9CiAKLXB1YmxpYyA6Ci0KLSAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKLSAgewotICAgIHJldHVybiAibHVfc29sdmVfIitJbnRlcmZhY2U6Om5hbWUoKTsKLSAgfQotICAKLSAgc3RhdGljIGRvdWJsZSBuYl9vcF9iYXNlKGludCBzaXplKXsKLSAgICByZXR1cm4gMi4wKnNpemUqc2l6ZSpzaXplLzMuMDsgIC8vIHF1ZXN0aW9uYWJsZSBidXQgbm90IHJlYWxseSBpbXBvcnRhbnQKKyAgc3RhdGljIGRvdWJsZSBuYl9vcF9iYXNlKGludCBzaXplKSB7CisgICAgcmV0dXJuIDIuMCAqIHNpemUgKiBzaXplICogc2l6ZSAvIDMuMDsgIC8vIHF1ZXN0aW9uYWJsZSBidXQgbm90IHJlYWxseSBpbXBvcnRhbnQKICAgfQogCi0KLSAgc3RhdGljIGRvdWJsZSBjYWxjdWxhdGUoIGludCBuYl9jYWxjLCBpbnQgc2l6ZSApIHsKLQorICBzdGF0aWMgZG91YmxlIGNhbGN1bGF0ZShpbnQgbmJfY2FsYywgaW50IHNpemUpIHsKICAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KLSAgICAKKwogICAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgQl9zdGw7CiAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIFhfc3RsOwogCi0gICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsc2l6ZSk7Ci0gICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oQl9zdGwsc2l6ZSk7Ci0gICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4oWF9zdGwsc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsIHNpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEJfc3RsLCBzaXplKTsKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihYX3N0bCwgc2l6ZSk7CiAKICAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCiAKQEAgLTYyLDE4ICs1NCwxOCBAQAogICAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQjsKICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIFg7CiAKLSAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IExVOyAKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IExVOwogCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQixCX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWCxYX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoTFUsQV9zdGwpOwotICAKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLCBBX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQiwgQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFgsIFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChMVSwgQV9zdGwpOworCiAgICAgLy8gbG9jYWwgdmFyaWFibGUgOgogCi0gICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpQaXZvdF9WZWN0b3IgcGl2b3Q7IC8vIHBpdm90IHZlY3RvcgotICAgIEludGVyZmFjZTo6bmV3X1Bpdm90X1ZlY3RvcihwaXZvdCxzaXplKTsKLSAgICAKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OlBpdm90X1ZlY3RvciBwaXZvdDsgIC8vIHBpdm90IHZlY3RvcgorICAgIEludGVyZmFjZTo6bmV3X1Bpdm90X1ZlY3RvcihwaXZvdCwgc2l6ZSk7CisKICAgICAvLyB0aW1lciB1dGlsaXRpZXMKIAogICAgIFBvcnRhYmxlX1RpbWVyIGNocm9ub3M7CkBAIC04MSw1NiArNzMsNDggQEAKICAgICAvLyB0aW1lIG1lYXN1cmVtZW50CiAKICAgICBjaHJvbm9zLnN0YXJ0KCk7Ci0gICAgCi0gICAgZm9yIChpbnQgaWk9MDtpaTxuYl9jYWxjO2lpKyspewogCisgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG5iX2NhbGM7IGlpKyspIHsKICAgICAgIC8vIExVIGZhY3Rvcml6YXRpb24KLSAgICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQSxMVSxzaXplKTsKLSAgICAgIEludGVyZmFjZTo6TFVfZmFjdG9yKExVLHBpdm90LHNpemUpOwotICAgICAgCisgICAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEEsIExVLCBzaXplKTsKKyAgICAgIEludGVyZmFjZTo6TFVfZmFjdG9yKExVLCBwaXZvdCwgc2l6ZSk7CisKICAgICAgIC8vIExVIHNvbHZlCiAKLSAgICAgIEludGVyZmFjZTo6TFVfc29sdmUoTFUscGl2b3QsQixYLHNpemUpOwotCisgICAgICBJbnRlcmZhY2U6OkxVX3NvbHZlKExVLCBwaXZvdCwgQiwgWCwgc2l6ZSk7CiAgICAgfQogCiAgICAgLy8gVGltZSBzdG9wCiAKICAgICBjaHJvbm9zLnN0b3AoKTsKIAotICAgIGRvdWJsZSB0aW1lPWNocm9ub3MudXNlcl90aW1lKCk7Ci0gIAorICAgIGRvdWJsZSB0aW1lID0gY2hyb25vcy51c2VyX3RpbWUoKTsKKwogICAgIC8vIGNoZWNrIHJlc3VsdCA6CiAKICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgQl9uZXdfc3RsKHNpemUpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWCwgWF9zdGwpOwogCi0gICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om1hdHJpeF92ZWN0b3JfcHJvZHVjdChBX3N0bCxYX3N0bCxCX25ld19zdGwsc2l6ZSk7IAotICAKLSAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KLSAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoQl9zdGwsQl9uZXdfc3RsKTsKLSAgICAKLSAgICBpZiAoZXJyb3I+MS5lLTUpeworICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjptYXRyaXhfdmVjdG9yX3Byb2R1Y3QoQV9zdGwsIFhfc3RsLCBCX25ld19zdGwsIHNpemUpOworCisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3IgPSBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKEJfc3RsLCBCX25ld19zdGwpOworCisgICAgaWYgKGVycm9yID4gMS5lLTUpIHsKICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOwogICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmRpc3BsYXlfdmVjdG9yKEJfc3RsKTsKICAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpkaXNwbGF5X3ZlY3RvcihCX25ld19zdGwpOwogICAgICAgZXhpdCgwKTsKICAgICB9Ci0gICAgCisKICAgICAvLyBkZWFsbG9jYXRpb24gYW5kIHJldHVybiB0aW1lCi0gICAgCi0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLHNpemUpOworCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLCBzaXplKTsKICAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOwogICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7CiAgICAgSW50ZXJmYWNlOjpmcmVlX1Bpdm90X1ZlY3RvcihwaXZvdCk7CiAKICAgICByZXR1cm4gdGltZTsKICAgfQotCiB9OwotICAKIAogI2VuZGlmCi0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdC5oaAppbmRleCBmNjVlZTA1Li5hNjZkNDc3IDEwMDY0NAotLS0gYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QuaGgKQEAgLTI4LDEwMyArMjgsODMgQEAKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgordGVtcGxhdGUgPGNsYXNzIEludGVyZmFjZT4KIGNsYXNzIEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QgewotCi1wdWJsaWMgOgotCisgcHVibGljOgogICAvLyBDdG9yCiAKLSAgQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCggaW50IHNpemUgKTpfc2l6ZShzaXplKQotICB7CisgIEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoaW50IHNpemUpIDogX3NpemUoc2l6ZSkgewogICAgIE1FU1NBR0UoIkFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QgQ3RvciIpOwogCiAgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCiAKLSAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQl9zdGwsX3NpemUpOwotICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KFhfc3RsLF9zaXplKTsKLSAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsIF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihCX3N0bCwgX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KFhfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsIF9zaXplKTsKIAogICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KIAotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCX3JlZixCX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLCBBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQl9yZWYsIEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZiwgWF9zdGwpOwogCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQixCX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7Ci0KKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLCBBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQiwgQl9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsIFhfc3RsKTsKICAgfQogCiAgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCiAKLSAgQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCggY29uc3QgIEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QgJiApCi0gIHsKKyAgQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0JikgewogICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCBDb3B5IEN0b3IiKTsKICAgICBleGl0KDApOwogICB9CiAKICAgLy8gRHRvcgogCi0gIH5BY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0KCB2b2lkICl7Ci0KKyAgfkFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3Qodm9pZCkgewogICAgIE1FU1NBR0UoIkFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QgRHRvciIpOwogCiAgICAgLy8gZGVhbGxvY2F0aW9uCiAKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsX3NpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQixfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEIsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsIF9zaXplKTsKIAotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQV9yZWYsX3NpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQl9yZWYsX3NpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsX3NpemUpOwotCisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZiwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQl9yZWYsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLCBfc2l6ZSk7CiAgIH0KIAogICAvLyBhY3Rpb24gbmFtZQogCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gIm1hdHJpeF9tYXRyaXhfIitJbnRlcmZhY2U6Om5hbWUoKTsKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKHZvaWQpIHsgcmV0dXJuICJtYXRyaXhfbWF0cml4XyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKHZvaWQpIHsgcmV0dXJuIDIuMCAqIF9zaXplICogX3NpemUgKiBfc2l6ZTsgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUodm9pZCkgeworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsIEEsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEJfcmVmLCBCLCBfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZiwgWCwgX3NpemUpOwogICB9CiAKLSAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKLSAgICByZXR1cm4gMi4wKl9zaXplKl9zaXplKl9zaXplOwotICB9CisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSh2b2lkKSB7IEludGVyZmFjZTo6bWF0cml4X21hdHJpeF9wcm9kdWN0KEEsIEIsIFgsIF9zaXplKTsgfQogCi0gIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKLQotICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsQSxfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChCX3JlZixCLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KFhfcmVmLFgsX3NpemUpOwotCi0gIH0KLQotICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7Ci0gICAgICBJbnRlcmZhY2U6Om1hdHJpeF9tYXRyaXhfcHJvZHVjdChBLEIsWCxfc2l6ZSk7Ci0gIH0KLQotICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApewotCisgIHZvaWQgY2hlY2tfcmVzdWx0KHZvaWQpIHsKICAgICAvLyBjYWxjdWxhdGlvbiBjaGVjawotICAgIGlmIChfc2l6ZTwyMDApCi0gICAgewotICAgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKFgscmVzdV9zdGwpOwotICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om1hdHJpeF9tYXRyaXhfcHJvZHVjdChBX3N0bCxCX3N0bCxYX3N0bCxfc2l6ZSk7Ci0gICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KLSAgICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7Ci0gICAgICBpZiAoZXJyb3I+MS5lLTYpeworICAgIGlmIChfc2l6ZSA8IDIwMCkgeworICAgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKFgsIHJlc3Vfc3RsKTsKKyAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjptYXRyaXhfbWF0cml4X3Byb2R1Y3QoQV9zdGwsIEJfc3RsLCBYX3N0bCwgX3NpemUpOworICAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3IgPSBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLCByZXN1X3N0bCk7CisgICAgICBpZiAoZXJyb3IgPiAxLmUtNikgewogICAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKICAgICAgICAgZXhpdCgxKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAotcHJpdmF0ZSA6Ci0KKyBwcml2YXRlOgogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBCX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOwpAQCAtMTM4LDEzICsxMTgsNyBAQAogICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEI7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWDsKIAotCiAgIGludCBfc2l6ZTsKLQogfTsKIAotCiAjZW5kaWYKLQotCi0KZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3RfYmlzLmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdF9iaXMuaGgKaW5kZXggMjljMTBhNi4uYzAyZGZiMyAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdF9iaXMuaGgKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdF9iaXMuaGgKQEAgLTI5LDMxICsyOSwyMyBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi10ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+Cit0ZW1wbGF0ZSA8Y2xhc3MgSW50ZXJmYWNlPgogY2xhc3MgQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdF9iaXMgeworIHB1YmxpYzoKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKHZvaWQpIHsgcmV0dXJuICJtYXRyaXhfbWF0cml4XyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsgfQogCi1wdWJsaWMgOgorICBzdGF0aWMgZG91YmxlIG5iX29wX2Jhc2UoaW50IHNpemUpIHsgcmV0dXJuIDIuMCAqIHNpemUgKiBzaXplICogc2l6ZTsgfQogCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gIm1hdHJpeF9tYXRyaXhfIitJbnRlcmZhY2U6Om5hbWUoKTsKLSAgfQotCi0gIHN0YXRpYyBkb3VibGUgbmJfb3BfYmFzZShpbnQgc2l6ZSl7Ci0gICAgcmV0dXJuIDIuMCpzaXplKnNpemUqc2l6ZTsKLSAgfQotCi0gIHN0YXRpYyBkb3VibGUgY2FsY3VsYXRlKCBpbnQgbmJfY2FsYywgaW50IHNpemUgKSB7Ci0KKyAgc3RhdGljIGRvdWJsZSBjYWxjdWxhdGUoaW50IG5iX2NhbGMsIGludCBzaXplKSB7CiAgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCiAKICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CiAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEJfc3RsOwogICAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBYX3N0bDsKIAotICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLHNpemUpOwotICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEJfc3RsLHNpemUpOwotICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KFhfc3RsLHNpemUpOworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLCBzaXplKTsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihCX3N0bCwgc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oWF9zdGwsIHNpemUpOwogCiAgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgogCkBAIC02NSwxNSArNTcsMTMgQEAKICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEI7CiAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYOwogCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsIEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCX3JlZiwgQl9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLCBYX3N0bCk7CiAKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQl9yZWYsQl9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKLQotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsQV9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEIsQl9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOwotCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSwgQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEIsIEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYLCBYX3N0bCk7CiAKICAgICAvLyBTVExfdGltZXIgdXRpbGl0aWVzCiAKQEAgLTg0LDE1ICs3NCwxMiBAQAogICAgIGNocm9ub3Muc3RhcnRfYmFzZWxpbmUobmJfY2FsYyk7CiAKICAgICBkbyB7Ci0KLSAgICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsQSxzaXplKTsKLSAgICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQl9yZWYsQixzaXplKTsKLSAgICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxzaXplKTsKLQorICAgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZiwgQSwgc2l6ZSk7CisgICAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEJfcmVmLCBCLCBzaXplKTsKKyAgICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsIFgsIHNpemUpOwogCiAgICAgICAvLyAgICAgIEludGVyZmFjZTo6bWF0cml4X21hdHJpeF9wcm9kdWN0KEEsQixYLHNpemUpOyBUaGlzIGxpbmUgbXVzdCBiZSBjb21tZW50ZWQgISEhIQotICAgIH0KLSAgICB3aGlsZShjaHJvbm9zLmNoZWNrKCkpOworICAgIH0gd2hpbGUgKGNocm9ub3MuY2hlY2soKSk7CiAKICAgICBjaHJvbm9zLnJlcG9ydCh0cnVlKTsKIApAQCAtMTAxLDUyICs4OCw0NCBAQAogICAgIGNocm9ub3Muc3RhcnQobmJfY2FsYyk7CiAKICAgICBkbyB7CisgICAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLCBBLCBzaXplKTsKKyAgICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQl9yZWYsIEIsIHNpemUpOworICAgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZiwgWCwgc2l6ZSk7CiAKLSAgICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsQSxzaXplKTsKLSAgICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQl9yZWYsQixzaXplKTsKLSAgICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsWCxzaXplKTsKLQotICAgICAgSW50ZXJmYWNlOjptYXRyaXhfbWF0cml4X3Byb2R1Y3QoQSxCLFgsc2l6ZSk7IC8vIGhlcmUgaXQgaXMgbm90IGNvbW1lbnRlZCAhISEhCi0gICAgfQotICAgIHdoaWxlKGNocm9ub3MuY2hlY2soKSk7CisgICAgICBJbnRlcmZhY2U6Om1hdHJpeF9tYXRyaXhfcHJvZHVjdChBLCBCLCBYLCBzaXplKTsgIC8vIGhlcmUgaXQgaXMgbm90IGNvbW1lbnRlZCAhISEhCisgICAgfSB3aGlsZSAoY2hyb25vcy5jaGVjaygpKTsKIAogICAgIGNocm9ub3MucmVwb3J0KHRydWUpOwogCi0gICAgZG91YmxlIHRpbWU9Y2hyb25vcy5jYWxjdWxhdGVkX3RpbWUvMjAwMC4wOworICAgIGRvdWJsZSB0aW1lID0gY2hyb25vcy5jYWxjdWxhdGVkX3RpbWUgLyAyMDAwLjA7CiAKICAgICAvLyBjYWxjdWxhdGlvbiBjaGVjawogCiAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHJlc3Vfc3RsKHNpemUpOwogCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKFgscmVzdV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChYLCByZXN1X3N0bCk7CiAKLSAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bWF0cml4X21hdHJpeF9wcm9kdWN0KEFfc3RsLEJfc3RsLFhfc3RsLHNpemUpOworICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjptYXRyaXhfbWF0cml4X3Byb2R1Y3QoQV9zdGwsIEJfc3RsLCBYX3N0bCwgc2l6ZSk7CiAKLSAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KLSAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwscmVzdV9zdGwpOworICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yID0gU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCwgcmVzdV9zdGwpOwogCi0gICAgaWYgKGVycm9yPjEuZS02KXsKKyAgICBpZiAoZXJyb3IgPiAxLmUtNikgewogICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CiAgICAgICBleGl0KDEpOwogICAgIH0KIAogICAgIC8vIGRlYWxsb2NhdGlvbiBhbmQgcmV0dXJuIHRpbWUKIAotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxzaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEIsc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYLHNpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSwgc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCLCBzaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsIHNpemUpOwogCi0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixzaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEJfcmVmLHNpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZiwgc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCX3JlZiwgc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZiwgc2l6ZSk7CiAKICAgICByZXR1cm4gdGltZTsKICAgfQotCiB9OwogCi0KICNlbmRpZgotCi0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdC5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QuaGgKaW5kZXggOGJhYjc5ZC4uMDAyZjg3NiAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdC5oaAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LmhoCkBAIC0yOCwxMDYgKzI4LDg4IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLXRlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK3RlbXBsYXRlIDxjbGFzcyBJbnRlcmZhY2U+CiBjbGFzcyBBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0IHsKLQotcHVibGljIDoKLQorIHB1YmxpYzoKICAgLy8gQ3RvcgogCi0gIEJUTF9ET05UX0lOTElORSBBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCi0gIHsKKyAgQlRMX0RPTlRfSU5MSU5FIEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QoaW50IHNpemUpIDogX3NpemUoc2l6ZSkgewogICAgIE1FU1NBR0UoIkFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QgQ3RvciIpOwogCiAgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCiAKLSAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oQl9zdGwsX3NpemUpOwotICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KFhfc3RsLF9zaXplKTsKLSAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsIF9zaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihCX3N0bCwgX3NpemUpOworICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KFhfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsIF9zaXplKTsKIAogICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KIAotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCX3JlZixCX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQixCX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFgsWF9zdGwpOwotCisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsIEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLCBBX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQl9yZWYsIEJfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCLCBCX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWF9yZWYsIFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLCBYX3N0bCk7CiAgIH0KIAogICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgogCi0gIEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QoIGNvbnN0ICBBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0ICYgKQotICB7CisgIEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QoY29uc3QgQWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCYpIHsKICAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QgQ29weSBDdG9yIik7CiAgICAgZXhpdCgxKTsKICAgfQogCiAgIC8vIER0b3IKIAotICBCVExfRE9OVF9JTkxJTkUgfkFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QoIHZvaWQgKXsKLQorICBCVExfRE9OVF9JTkxJTkUgfkFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Qodm9pZCkgewogICAgIE1FU1NBR0UoIkFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QgRHRvciIpOwogCiAgICAgLy8gZGVhbGxvY2F0aW9uCiAKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSwgX3NpemUpOwogICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQik7CiAgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYKTsKIAotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQV9yZWYsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQV9yZWYsIF9zaXplKTsKICAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEJfcmVmKTsKICAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFhfcmVmKTsKLQogICB9CiAKICAgLy8gYWN0aW9uIG5hbWUKIAotICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuICJtYXRyaXhfdmVjdG9yXyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKHZvaWQpIHsgcmV0dXJuICJtYXRyaXhfdmVjdG9yXyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKHZvaWQpIHsgcmV0dXJuIDIuMCAqIF9zaXplICogX3NpemU7IH0KKworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBpbml0aWFsaXplKHZvaWQpIHsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLCBBLCBfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihCX3JlZiwgQiwgX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsIFgsIF9zaXplKTsKICAgfQogCi0gIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7Ci0gICAgcmV0dXJuIDIuMCpfc2l6ZSpfc2l6ZTsKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2FsY3VsYXRlKHZvaWQpIHsKKyAgICBCVExfQVNNX0NPTU1FTlQoIiNiZWdpbiBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QiKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF92ZWN0b3JfcHJvZHVjdChBLCBCLCBYLCBfc2l6ZSk7CisgICAgQlRMX0FTTV9DT01NRU5UKCJlbmQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0Iik7CiAgIH0KIAotICBCVExfRE9OVF9JTkxJTkUgIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApewotCi0gICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZixBLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKEJfcmVmLEIsX3NpemUpOwotICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsWCxfc2l6ZSk7Ci0KLSAgfQotCi0gIEJUTF9ET05UX0lOTElORSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKLSAgICAgIEJUTF9BU01fQ09NTUVOVCgiI2JlZ2luIG1hdHJpeF92ZWN0b3JfcHJvZHVjdCIpOwotICAgICAgSW50ZXJmYWNlOjptYXRyaXhfdmVjdG9yX3Byb2R1Y3QoQSxCLFgsX3NpemUpOwotICAgICAgQlRMX0FTTV9DT01NRU5UKCJlbmQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0Iik7Ci0gIH0KLQotICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKLQorICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjaGVja19yZXN1bHQodm9pZCkgewogICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCiAKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWCxyZXN1X3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFgsIHJlc3Vfc3RsKTsKIAotICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjptYXRyaXhfdmVjdG9yX3Byb2R1Y3QoQV9zdGwsQl9zdGwsWF9zdGwsX3NpemUpOworICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjptYXRyaXhfdmVjdG9yX3Byb2R1Y3QoQV9zdGwsIEJfc3RsLCBYX3N0bCwgX3NpemUpOwogCi0gICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9Ci0gICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvciA9IFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwsIHJlc3Vfc3RsKTsKIAotICAgIGlmIChlcnJvcj4xLmUtNSl7CisgICAgaWYgKGVycm9yID4gMS5lLTUpIHsKICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOwogICAgICAgZXhpdCgwKTsKICAgICB9Ci0KICAgfQogCi1wcml2YXRlIDoKLQorIHByaXZhdGU6CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIEJfc3RsOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWF9zdGw7CkBAIC0xNDEsMTMgKzEyMyw3IEBACiAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQjsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBYOwogCi0KICAgaW50IF9zaXplOwotCiB9OwogCi0KICNlbmRpZgotCi0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3BhcnRpYWxfbHUuaGggYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fcGFydGlhbF9sdS5oaAppbmRleCA3NzBlYTFkLi40MDBlM2ZmIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fcGFydGlhbF9sdS5oaAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fcGFydGlhbF9sdS5oaApAQCAtMjcsOTAgKzI3LDczIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLXRlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK3RlbXBsYXRlIDxjbGFzcyBJbnRlcmZhY2U+CiBjbGFzcyBBY3Rpb25fcGFydGlhbF9sdSB7Ci0KLXB1YmxpYyA6Ci0KKyBwdWJsaWM6CiAgIC8vIEN0b3IKIAotICBBY3Rpb25fcGFydGlhbF9sdSggaW50IHNpemUgKTpfc2l6ZShzaXplKQotICB7CisgIEFjdGlvbl9wYXJ0aWFsX2x1KGludCBzaXplKSA6IF9zaXplKHNpemUpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fcGFydGlhbF9sdSBDdG9yIik7CiAKICAgICAvLyBTVEwgdmVjdG9yIGluaXRpYWxpemF0aW9uCi0gICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oWF9zdGwsX3NpemUpOwotICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KENfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihYX3N0bCwgX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KENfc3RsLCBfc2l6ZSk7CiAKICAgICAvLyBtYWtlIHN1cmUgWCBpcyBpbnZlcnRpYmxlCi0gICAgZm9yIChpbnQgaT0wOyBpPF9zaXplOyArK2kpCi0gICAgICBYX3N0bFtpXVtpXSA9IFhfc3RsW2ldW2ldICogMWUyICsgMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zaXplOyArK2kpIFhfc3RsW2ldW2ldID0gWF9zdGxbaV1baV0gKiAxZTIgKyAxOwogCiAgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYLFhfc3RsKTsKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChDLENfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZiwgWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsIFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChDLCBDX3N0bCk7CiAKLSAgICBfY29zdCA9IDIuMCpzaXplKnNpemUqc2l6ZS8zLjAgKyBzaXplKnNpemU7CisgICAgX2Nvc3QgPSAyLjAgKiBzaXplICogc2l6ZSAqIHNpemUgLyAzLjAgKyBzaXplICogc2l6ZTsKICAgfQogCiAgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCiAKLSAgQWN0aW9uX3BhcnRpYWxfbHUoIGNvbnN0ICBBY3Rpb25fcGFydGlhbF9sdSAmICkKLSAgeworICBBY3Rpb25fcGFydGlhbF9sdShjb25zdCBBY3Rpb25fcGFydGlhbF9sdSYpIHsKICAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9wYXJ0aWFsX2x1IENvcHkgQ3RvciIpOwogICAgIGV4aXQoMSk7CiAgIH0KIAogICAvLyBEdG9yCiAKLSAgfkFjdGlvbl9wYXJ0aWFsX2x1KCB2b2lkICl7Ci0KKyAgfkFjdGlvbl9wYXJ0aWFsX2x1KHZvaWQpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fcGFydGlhbF9sdSBEdG9yIik7CiAKICAgICAvLyBkZWFsbG9jYXRpb24KLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsX3NpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQyxfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZiwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQywgX3NpemUpOwogICB9CiAKICAgLy8gYWN0aW9uIG5hbWUKIAotICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuICJwYXJ0aWFsX2x1X2RlY29tcF8iK0ludGVyZmFjZTo6bmFtZSgpOwotICB9CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSh2b2lkKSB7IHJldHVybiAicGFydGlhbF9sdV9kZWNvbXBfIiArIEludGVyZmFjZTo6bmFtZSgpOyB9CiAKLSAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKLSAgICByZXR1cm4gX2Nvc3Q7Ci0gIH0KKyAgZG91YmxlIG5iX29wX2Jhc2Uodm9pZCkgeyByZXR1cm4gX2Nvc3Q7IH0KIAotICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7Ci0gICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZixYLF9zaXplKTsKLSAgfQorICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKHZvaWQpIHsgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZiwgWCwgX3NpemUpOyB9CiAKLSAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgewotICAgICAgSW50ZXJmYWNlOjpwYXJ0aWFsX2x1X2RlY29tcChYLEMsX3NpemUpOwotICB9CisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSh2b2lkKSB7IEludGVyZmFjZTo6cGFydGlhbF9sdV9kZWNvbXAoWCwgQywgX3NpemUpOyB9CiAKLSAgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKKyAgdm9pZCBjaGVja19yZXN1bHQodm9pZCkgewogICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCi0vLyAgICAgSW50ZXJmYWNlOjptYXRyaXhfdG9fc3RsKEMscmVzdV9zdGwpOworICAgIC8vICAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoQyxyZXN1X3N0bCk7CiAKLS8vICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bHVfZGVjb21wKFhfc3RsLENfc3RsLF9zaXplKTsKLS8vCi0vLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9Ci0vLyAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKENfc3RsLHJlc3Vfc3RsKTsKLS8vCi0vLyAgICAgaWYgKGVycm9yPjEuZS02KXsKLS8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOwotLy8gICAgICAgZXhpdCgwKTsKLS8vICAgICB9Ci0KKyAgICAvLyAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Omx1X2RlY29tcChYX3N0bCxDX3N0bCxfc2l6ZSk7CisgICAgLy8KKyAgICAvLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgLy8gICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihDX3N0bCxyZXN1X3N0bCk7CisgICAgLy8KKyAgICAvLyAgICAgaWYgKGVycm9yPjEuZS02KXsKKyAgICAvLyAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAvLyAgICAgICBleGl0KDApOworICAgIC8vICAgICB9CiAgIH0KIAotcHJpdmF0ZSA6Ci0KKyBwcml2YXRlOgogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggWF9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBDX3N0bDsKIApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3JvdC5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9yb3QuaGgKaW5kZXggZGY4MjJhNi4uN2NjM2M2MSAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3JvdC5oaAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fcm90LmhoCkBAIC0yMywzNyArMjMsMzMgQEAKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgordGVtcGxhdGUgPGNsYXNzIEludGVyZmFjZT4KIGNsYXNzIEFjdGlvbl9yb3QgewotCi1wdWJsaWMgOgotCisgcHVibGljOgogICAvLyBDdG9yCi0gIEJUTF9ET05UX0lOTElORSBBY3Rpb25fcm90KCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCi0gIHsKKyAgQlRMX0RPTlRfSU5MSU5FIEFjdGlvbl9yb3QoaW50IHNpemUpIDogX3NpemUoc2l6ZSkgewogICAgIE1FU1NBR0UoIkFjdGlvbl9yb3QgQ3RvciIpOwogCiAgICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCiAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHRtcDsKLSAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oQl9zdGwsX3NpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEFfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oQl9zdGwsIF9zaXplKTsKIAogICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChBX3JlZixBX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQSxBX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQl9yZWYsQl9zdGwpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEIsQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEFfcmVmLCBBX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQSwgQV9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEJfcmVmLCBCX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQiwgQl9zdGwpOwogICB9CiAKICAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKLSAgQWN0aW9uX3JvdCggY29uc3QgIEFjdGlvbl9yb3QgJiApCi0gIHsKKyAgQWN0aW9uX3JvdChjb25zdCBBY3Rpb25fcm90JikgewogICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX3JvdCBDb3B5IEN0b3IiKTsKICAgICBleGl0KDEpOwogICB9CiAKICAgLy8gRHRvcgotICBCVExfRE9OVF9JTkxJTkUgfkFjdGlvbl9yb3QoIHZvaWQgKXsKKyAgQlRMX0RPTlRfSU5MSU5FIH5BY3Rpb25fcm90KHZvaWQpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fcm90IER0b3IiKTsKICAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEEpOwogICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQik7CkBAIC02Miw0NCArNTgsMzcgQEAKICAgfQogCiAgIC8vIGFjdGlvbiBuYW1lCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gInJvdF8iICsgSW50ZXJmYWNlOjpuYW1lKCk7CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSh2b2lkKSB7IHJldHVybiAicm90XyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKHZvaWQpIHsgcmV0dXJuIDYuMCAqIF9zaXplOyB9CisKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKSB7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihBX3JlZiwgQSwgX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoQl9yZWYsIEIsIF9zaXplKTsKICAgfQogCi0gIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7Ci0gICAgcmV0dXJuIDYuMCpfc2l6ZTsKLSAgfQotCi0gIEJUTF9ET05UX0lOTElORSAgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7Ci0gICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihBX3JlZixBLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKEJfcmVmLEIsX3NpemUpOwotICB9Ci0KLSAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgeworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjYWxjdWxhdGUodm9pZCkgewogICAgIEJUTF9BU01fQ09NTUVOVCgiI2JlZ2luIHJvdCIpOwotICAgIEludGVyZmFjZTo6cm90KEEsQiwwLjUsMC42LF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OnJvdChBLCBCLCAwLjUsIDAuNiwgX3NpemUpOwogICAgIEJUTF9BU01fQ09NTUVOVCgiZW5kIHJvdCIpOwogICB9CiAKLSAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7CisgIEJUTF9ET05UX0lOTElORSB2b2lkIGNoZWNrX3Jlc3VsdCh2b2lkKSB7CiAgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKLS8vICAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWCxyZXN1X3N0bCk7CisgICAgLy8gICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLHJlc3Vfc3RsKTsKIAotLy8gICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpyb3QoQV9zdGwsQl9zdGwsWF9zdGwsX3NpemUpOworICAgIC8vICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6cm90KEFfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKIAotLy8gICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQotLy8gICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisgICAgLy8gICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorICAgIC8vICAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwscmVzdV9zdGwpOwogCi0vLyAgICAgaWYgKGVycm9yPjEuZS0zKXsKLS8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOwotLy8gICAgICAgZXhpdCgwKTsKLS8vICAgICB9Ci0KKyAgICAvLyAgICAgaWYgKGVycm9yPjEuZS0zKXsKKyAgICAvLyAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAvLyAgICAgICBleGl0KDApOworICAgIC8vICAgICB9CiAgIH0KIAotcHJpdmF0ZSA6Ci0KKyBwcml2YXRlOgogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgQV9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBCX3N0bDsKIApAQCAtMTEyLDUgKzEwMSw0IEBACiAgIGludCBfc2l6ZTsKIH07CiAKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fc3ltdi5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9zeW12LmhoCmluZGV4IGEzMmI5ZGYuLmQ4YjM4NTUxIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fc3ltdi5oaAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fc3ltdi5oaApAQCAtMjgsOTUgKzI4LDgwIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLXRlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK3RlbXBsYXRlIDxjbGFzcyBJbnRlcmZhY2U+CiBjbGFzcyBBY3Rpb25fc3ltdiB7Ci0KLXB1YmxpYyA6Ci0KKyBwdWJsaWM6CiAgIC8vIEN0b3IKIAotICBCVExfRE9OVF9JTkxJTkUgQWN0aW9uX3N5bXYoIGludCBzaXplICk6X3NpemUoc2l6ZSkKLSAgeworICBCVExfRE9OVF9JTkxJTkUgQWN0aW9uX3N5bXYoaW50IHNpemUpIDogX3NpemUoc2l6ZSkgewogICAgIE1FU1NBR0UoIkFjdGlvbl9zeW12IEN0b3IiKTsKIAogICAgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgotICAgIGluaXRfbWF0cml4X3N5bW08cHNldWRvX3JhbmRvbT4oQV9zdGwsX3NpemUpOwotICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEJfc3RsLF9zaXplKTsKLSAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihYX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4X3N5bW08cHNldWRvX3JhbmRvbT4oQV9zdGwsIF9zaXplKTsKKyAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihCX3N0bCwgX3NpemUpOworICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KFhfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsIF9zaXplKTsKIAogICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQl9yZWYsQl9zdGwpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEIsQl9zdGwpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKLQorICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLCBBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSwgQV9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEJfcmVmLCBCX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQiwgQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLCBYX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWCwgWF9zdGwpOwogICB9CiAKICAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKIAotICBBY3Rpb25fc3ltdiggY29uc3QgIEFjdGlvbl9zeW12ICYgKQotICB7CisgIEFjdGlvbl9zeW12KGNvbnN0IEFjdGlvbl9zeW12JikgewogICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX3N5bXYgQ29weSBDdG9yIik7CiAgICAgZXhpdCgxKTsKICAgfQogCiAgIC8vIER0b3IKLSAgQlRMX0RPTlRfSU5MSU5FIH5BY3Rpb25fc3ltdiggdm9pZCApewotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxfc2l6ZSk7CisgIEJUTF9ET05UX0lOTElORSB+QWN0aW9uX3N5bXYodm9pZCkgeworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSwgX3NpemUpOwogICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQik7CiAgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLCBfc2l6ZSk7CiAgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihCX3JlZik7CiAgICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYX3JlZik7CiAgIH0KIAogICAvLyBhY3Rpb24gbmFtZQogCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gInN5bXZfIiArIEludGVyZmFjZTo6bmFtZSgpOworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUodm9pZCkgeyByZXR1cm4gInN5bXZfIiArIEludGVyZmFjZTo6bmFtZSgpOyB9CisKKyAgZG91YmxlIG5iX29wX2Jhc2Uodm9pZCkgeyByZXR1cm4gMi4wICogX3NpemUgKiBfc2l6ZTsgfQorCisgIEJUTF9ET05UX0lOTElORSB2b2lkIGluaXRpYWxpemUodm9pZCkgeworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsIEEsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKEJfcmVmLCBCLCBfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihYX3JlZiwgWCwgX3NpemUpOwogICB9CiAKLSAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKLSAgICByZXR1cm4gMi4wKl9zaXplKl9zaXplOworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjYWxjdWxhdGUodm9pZCkgeworICAgIEJUTF9BU01fQ09NTUVOVCgiI2JlZ2luIHN5bXYiKTsKKyAgICBJbnRlcmZhY2U6OnN5bXYoQSwgQiwgWCwgX3NpemUpOworICAgIEJUTF9BU01fQ09NTUVOVCgiZW5kIHN5bXYiKTsKICAgfQogCi0gIEJUTF9ET05UX0lOTElORSAgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7Ci0KLSAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOwotICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoQl9yZWYsQixfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihYX3JlZixYLF9zaXplKTsKLQotICB9Ci0KLSAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgewotICAgICAgQlRMX0FTTV9DT01NRU5UKCIjYmVnaW4gc3ltdiIpOwotICAgICAgSW50ZXJmYWNlOjpzeW12KEEsQixYLF9zaXplKTsKLSAgICAgIEJUTF9BU01fQ09NTUVOVCgiZW5kIHN5bXYiKTsKLSAgfQotCi0gIEJUTF9ET05UX0lOTElORSB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApewotICAgIGlmIChfc2l6ZT4xMjgpIHJldHVybjsKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2hlY2tfcmVzdWx0KHZvaWQpIHsKKyAgICBpZiAoX3NpemUgPiAxMjgpIHJldHVybjsKICAgICAvLyBjYWxjdWxhdGlvbiBjaGVjawotICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLHJlc3Vfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWCwgcmVzdV9zdGwpOwogCi0gICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OnN5bXYoQV9zdGwsQl9zdGwsWF9zdGwsX3NpemUpOworICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpzeW12KEFfc3RsLCBCX3N0bCwgWF9zdGwsIF9zaXplKTsKIAotICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQotICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3IgPSBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLCByZXN1X3N0bCk7CiAKLSAgICBpZiAoZXJyb3I+MS5lLTUpeworICAgIGlmIChlcnJvciA+IDEuZS01KSB7CiAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKICAgICAgIGV4aXQoMCk7CiAgICAgfQotCiAgIH0KIAotcHJpdmF0ZSA6Ci0KKyBwcml2YXRlOgogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBCX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIFhfc3RsOwpAQCAtMTMwLDEwICsxMTUsNyBAQAogICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEI7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWDsKIAotCiAgIGludCBfc2l6ZTsKLQogfTsKIAotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl9zeXIyLmhoIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3N5cjIuaGgKaW5kZXggN2M2NzEyYi4uMzM1NWZhYSAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3N5cjIuaGgKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3N5cjIuaGgKQEAgLTI4LDg5ICsyOCw3NyBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi10ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+Cit0ZW1wbGF0ZSA8Y2xhc3MgSW50ZXJmYWNlPgogY2xhc3MgQWN0aW9uX3N5cjIgewotCi1wdWJsaWMgOgotCisgcHVibGljOgogICAvLyBDdG9yCiAKLSAgQlRMX0RPTlRfSU5MSU5FIEFjdGlvbl9zeXIyKCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCi0gIHsKKyAgQlRMX0RPTlRfSU5MSU5FIEFjdGlvbl9zeXIyKGludCBzaXplKSA6IF9zaXplKHNpemUpIHsKICAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggdG1wOwotICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKLSAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihCX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oWF9zdGwsX3NpemUpOwotICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCwgX3NpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEJfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oWF9zdGwsIF9zaXplKTsKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCwgX3NpemUpOwogCiAgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCX3JlZixCX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQixCX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFgsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLCBBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSwgQV9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEJfcmVmLCBCX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQiwgQl9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLCBYX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWCwgWF9zdGwpOwogICB9CiAKICAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKLSAgQWN0aW9uX3N5cjIoIGNvbnN0ICBBY3Rpb25fc3lyMiAmICkKLSAgeworICBBY3Rpb25fc3lyMihjb25zdCBBY3Rpb25fc3lyMiYpIHsKICAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl9zeXIyIENvcHkgQ3RvciIpOwogICAgIGV4aXQoMSk7CiAgIH0KIAogICAvLyBEdG9yCi0gIEJUTF9ET05UX0lOTElORSB+QWN0aW9uX3N5cjIoIHZvaWQgKXsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsX3NpemUpOworICBCVExfRE9OVF9JTkxJTkUgfkFjdGlvbl9zeXIyKHZvaWQpIHsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsIF9zaXplKTsKICAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOwogICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZiwgX3NpemUpOwogICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoQl9yZWYpOwogICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWF9yZWYpOwogICB9CiAKICAgLy8gYWN0aW9uIG5hbWUKIAotICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuICJzeXIyXyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKHZvaWQpIHsgcmV0dXJuICJzeXIyXyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKHZvaWQpIHsgcmV0dXJuIDIuMCAqIF9zaXplICogX3NpemU7IH0KKworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBpbml0aWFsaXplKHZvaWQpIHsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLCBBLCBfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihCX3JlZiwgQiwgX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsIFgsIF9zaXplKTsKICAgfQogCi0gIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7Ci0gICAgcmV0dXJuIDIuMCpfc2l6ZSpfc2l6ZTsKKyAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2FsY3VsYXRlKHZvaWQpIHsKKyAgICBCVExfQVNNX0NPTU1FTlQoIiNiZWdpbiBzeXIyIik7CisgICAgSW50ZXJmYWNlOjpzeXIyKEEsIEIsIFgsIF9zaXplKTsKKyAgICBCVExfQVNNX0NPTU1FTlQoImVuZCBzeXIyIik7CiAgIH0KIAotICBCVExfRE9OVF9JTkxJTkUgIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApewotICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQV9yZWYsQSxfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihCX3JlZixCLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmNvcHlfdmVjdG9yKFhfcmVmLFgsX3NpemUpOwotICB9Ci0KLSAgQlRMX0RPTlRfSU5MSU5FIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgewotICAgICAgQlRMX0FTTV9DT01NRU5UKCIjYmVnaW4gc3lyMiIpOwotICAgICAgSW50ZXJmYWNlOjpzeXIyKEEsQixYLF9zaXplKTsKLSAgICAgIEJUTF9BU01fQ09NTUVOVCgiZW5kIHN5cjIiKTsKLSAgfQotCi0gIEJUTF9ET05UX0lOTElORSB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApeworICBCVExfRE9OVF9JTkxJTkUgdm9pZCBjaGVja19yZXN1bHQodm9pZCkgewogICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCi0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFgscmVzdV9zdGwpOworICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLCByZXN1X3N0bCk7CiAKLSAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6c3lyMihBX3N0bCxCX3N0bCxYX3N0bCxfc2l6ZSk7CisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OnN5cjIoQV9zdGwsIEJfc3RsLCBYX3N0bCwgX3NpemUpOwogCi0gICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9Ci0gICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvciA9IFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwsIHJlc3Vfc3RsKTsKIAotICAgIGlmIChlcnJvcj4xLmUtMyl7CisgICAgaWYgKGVycm9yID4gMS5lLTMpIHsKICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOwotLy8gICAgICAgZXhpdCgwKTsKKyAgICAgIC8vICAgICAgIGV4aXQoMCk7CiAgICAgfQotCiAgIH0KIAotcHJpdmF0ZSA6Ci0KKyBwcml2YXRlOgogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBCX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIFhfc3RsOwpAQCAtMTI0LDEwICsxMTIsNyBAQAogICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfdmVjdG9yIEI7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgWDsKIAotCiAgIGludCBfc2l6ZTsKLQogfTsKIAotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cmlzb2x2ZS5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cmlzb2x2ZS5oaAppbmRleCBkNmYwYjQ3Li42NzUxYTIwIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fdHJpc29sdmUuaGgKKysrIGIvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3RyaXNvbHZlLmhoCkBAIC0yNywxMDAgKzI3LDgyIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLXRlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK3RlbXBsYXRlIDxjbGFzcyBJbnRlcmZhY2U+CiBjbGFzcyBBY3Rpb25fdHJpc29sdmUgewotCi1wdWJsaWMgOgotCisgcHVibGljOgogICAvLyBDdG9yCiAKLSAgQWN0aW9uX3RyaXNvbHZlKCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCi0gIHsKKyAgQWN0aW9uX3RyaXNvbHZlKGludCBzaXplKSA6IF9zaXplKHNpemUpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fdHJpc29sdmUgQ3RvciIpOwogCiAgICAgLy8gU1RMIHZlY3RvciBpbml0aWFsaXphdGlvbgotICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KExfc3RsLF9zaXplKTsKLSAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihCX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOwotICAgIGZvciAoaW50IGo9MDsgajxfc2l6ZTsgKytqKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxqOyArK2kpCi0gICAgICAgIExfc3RsW2pdW2ldID0gMDsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihMX3N0bCwgX3NpemUpOworICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEJfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4oWF9zdGwsIF9zaXplKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IF9zaXplOyArK2opIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgajsgKytpKSBMX3N0bFtqXVtpXSA9IDA7CiAgICAgICBMX3N0bFtqXVtqXSArPSAzOwogICAgIH0KIAotICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKyAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCwgX3NpemUpOwogCiAgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEwsTF9zdGwpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFgsWF9zdGwpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEIsQl9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEwsIExfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLCBYX3N0bCk7CisgICAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQiwgQl9zdGwpOwogCiAgICAgX2Nvc3QgPSAwOwotICAgIGZvciAoaW50IGo9MDsgajxfc2l6ZTsgKytqKQotICAgIHsKLSAgICAgIF9jb3N0ICs9IDIqaiArIDE7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBfc2l6ZTsgKytqKSB7CisgICAgICBfY29zdCArPSAyICogaiArIDE7CiAgICAgfQogICB9CiAKICAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKIAotICBBY3Rpb25fdHJpc29sdmUoIGNvbnN0ICBBY3Rpb25fdHJpc29sdmUgJiApCi0gIHsKKyAgQWN0aW9uX3RyaXNvbHZlKGNvbnN0IEFjdGlvbl90cmlzb2x2ZSYpIHsKICAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl90cmlzb2x2ZSBDb3B5IEN0b3IiKTsKICAgICBleGl0KDEpOwogICB9CiAKICAgLy8gRHRvcgogCi0gIH5BY3Rpb25fdHJpc29sdmUoIHZvaWQgKXsKLQorICB+QWN0aW9uX3RyaXNvbHZlKHZvaWQpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fdHJpc29sdmUgRHRvciIpOwogCiAgICAgLy8gZGVhbGxvY2F0aW9uCi0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChMLF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEwsIF9zaXplKTsKICAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOwogICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7CiAgIH0KIAogICAvLyBhY3Rpb24gbmFtZQogCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gInRyaXNvbHZlX3ZlY3Rvcl8iK0ludGVyZmFjZTo6bmFtZSgpOworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUodm9pZCkgeyByZXR1cm4gInRyaXNvbHZlX3ZlY3Rvcl8iICsgSW50ZXJmYWNlOjpuYW1lKCk7IH0KKworICBkb3VibGUgbmJfb3BfYmFzZSh2b2lkKSB7IHJldHVybiBfY29zdDsgfQorCisgIGlubGluZSB2b2lkIGluaXRpYWxpemUodm9pZCkgeworICAgIC8vIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsWCxfc2l6ZSk7CiAgIH0KIAotICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApewotICAgIHJldHVybiBfY29zdDsKLSAgfQorICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUodm9pZCkgeyBJbnRlcmZhY2U6OnRyaXNvbHZlX2xvd2VyKEwsIEIsIFgsIF9zaXplKTsgfQogCi0gIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKLSAgICAvL0ludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsWCxfc2l6ZSk7Ci0gIH0KLQotICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7Ci0gICAgICBJbnRlcmZhY2U6OnRyaXNvbHZlX2xvd2VyKEwsQixYLF9zaXplKTsKLSAgfQotCi0gIHZvaWQgY2hlY2tfcmVzdWx0KCl7Ci0gICAgaWYgKF9zaXplPjEyOCkgcmV0dXJuOworICB2b2lkIGNoZWNrX3Jlc3VsdCgpIHsKKyAgICBpZiAoX3NpemUgPiAxMjgpIHJldHVybjsKICAgICAvLyBjYWxjdWxhdGlvbiBjaGVjawotICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLHJlc3Vfc3RsKTsKKyAgICBJbnRlcmZhY2U6OnZlY3Rvcl90b19zdGwoWCwgcmVzdV9zdGwpOwogCi0gICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OnRyaXNvbHZlX2xvd2VyKExfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKKyAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6dHJpc29sdmVfbG93ZXIoTF9zdGwsIEJfc3RsLCBYX3N0bCwgX3NpemUpOwogCi0gICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9Ci0gICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKyAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvciA9IFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwsIHJlc3Vfc3RsKTsKIAotICAgIGlmIChlcnJvcj4xLmUtNCl7CisgICAgaWYgKGVycm9yID4gMS5lLTQpIHsKICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOwogICAgICAgZXhpdCgyKTsKLSAgICB9IC8vZWxzZSBJTkZPUygiQ0FMQ1VMQVRJT04gT0suLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKLQorICAgIH0gIC8vIGVsc2UgSU5GT1MoIkNBTENVTEFUSU9OIE9LLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CiAgIH0KIAotcHJpdmF0ZSA6Ci0KKyBwcml2YXRlOgogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggTF9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBYX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIEJfc3RsOwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3RyaXNvbHZlX21hdHJpeC5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cmlzb2x2ZV9tYXRyaXguaGgKaW5kZXggMGZjMmJiOS4uY2Y1NWFhZSAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2FjdGlvbnMvYWN0aW9uX3RyaXNvbHZlX21hdHJpeC5oaAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fdHJpc29sdmVfbWF0cml4LmhoCkBAIC0yOCwxMTggKzI4LDk3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLXRlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK3RlbXBsYXRlIDxjbGFzcyBJbnRlcmZhY2U+CiBjbGFzcyBBY3Rpb25fdHJpc29sdmVfbWF0cml4IHsKLQotcHVibGljIDoKLQorIHB1YmxpYzoKICAgLy8gQ3RvcgogCi0gIEFjdGlvbl90cmlzb2x2ZV9tYXRyaXgoIGludCBzaXplICk6X3NpemUoc2l6ZSkKLSAgeworICBBY3Rpb25fdHJpc29sdmVfbWF0cml4KGludCBzaXplKSA6IF9zaXplKHNpemUpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fdHJpc29sdmVfbWF0cml4IEN0b3IiKTsKIAogICAgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgogCi0gICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsX3NpemUpOwotICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEJfc3RsLF9zaXplKTsKLSAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihYX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQl9zdGwsIF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihYX3N0bCwgX3NpemUpOworICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLCBfc2l6ZSk7CiAKLSAgICBmb3IgKGludCBqPTA7IGo8X3NpemU7ICsraikKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8ajsgKytpKQotICAgICAgICBBX3N0bFtqXVtpXSA9IDA7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBfc2l6ZTsgKytqKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGo7ICsraSkgQV9zdGxbal1baV0gPSAwOwogICAgICAgQV9zdGxbal1bal0gKz0gMzsKICAgICB9CiAKICAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCiAKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQl9yZWYsQl9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZiwgQV9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEJfcmVmLCBCX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsIFhfc3RsKTsKIAotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsQV9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEIsQl9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsIEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCLCBCX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCwgWF9zdGwpOwogCiAgICAgX2Nvc3QgPSAwOwotICAgIGZvciAoaW50IGo9MDsgajxfc2l6ZTsgKytqKQotICAgIHsKLSAgICAgIF9jb3N0ICs9IDIqaiArIDE7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBfc2l6ZTsgKytqKSB7CisgICAgICBfY29zdCArPSAyICogaiArIDE7CiAgICAgfQogICAgIF9jb3N0ICo9IF9zaXplOwogICB9CiAKICAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKIAotICBBY3Rpb25fdHJpc29sdmVfbWF0cml4KCBjb25zdCAgQWN0aW9uX3RyaXNvbHZlX21hdHJpeCAmICkKLSAgeworICBBY3Rpb25fdHJpc29sdmVfbWF0cml4KGNvbnN0IEFjdGlvbl90cmlzb2x2ZV9tYXRyaXgmKSB7CiAgICAgSU5GT1MoImlsbGVnYWwgY2FsbCB0byBBY3Rpb25fdHJpc29sdmVfbWF0cml4IENvcHkgQ3RvciIpOwogICAgIGV4aXQoMCk7CiAgIH0KIAogICAvLyBEdG9yCiAKLSAgfkFjdGlvbl90cmlzb2x2ZV9tYXRyaXgoIHZvaWQgKXsKLQorICB+QWN0aW9uX3RyaXNvbHZlX21hdHJpeCh2b2lkKSB7CiAgICAgTUVTU0FHRSgiQWN0aW9uX3RyaXNvbHZlX21hdHJpeCBEdG9yIik7CiAKICAgICAvLyBkZWFsbG9jYXRpb24KIAotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQiwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCwgX3NpemUpOwogCi0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCX3JlZixfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZixfc2l6ZSk7Ci0KKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLCBfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCX3JlZiwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsIF9zaXplKTsKICAgfQogCiAgIC8vIGFjdGlvbiBuYW1lCiAKLSAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKLSAgewotICAgIHJldHVybiAidHJpc29sdmVfbWF0cml4XyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSh2b2lkKSB7IHJldHVybiAidHJpc29sdmVfbWF0cml4XyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsgfQorCisgIGRvdWJsZSBuYl9vcF9iYXNlKHZvaWQpIHsgcmV0dXJuIF9jb3N0OyB9CisKKyAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKSB7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZiwgQSwgX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQl9yZWYsIEIsIF9zaXplKTsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KFhfcmVmLCBYLCBfc2l6ZSk7CiAgIH0KIAotICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApewotICAgIHJldHVybiBfY29zdDsKLSAgfQorICBpbmxpbmUgdm9pZCBjYWxjdWxhdGUodm9pZCkgeyBJbnRlcmZhY2U6OnRyaXNvbHZlX2xvd2VyX21hdHJpeChBLCBCLCBYLCBfc2l6ZSk7IH0KIAotICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7Ci0KLSAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOwotICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQl9yZWYsQixfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZixYLF9zaXplKTsKLQotICB9Ci0KLSAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgewotICAgICAgSW50ZXJmYWNlOjp0cmlzb2x2ZV9sb3dlcl9tYXRyaXgoQSxCLFgsX3NpemUpOwotICB9Ci0KLSAgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKLQorICB2b2lkIGNoZWNrX3Jlc3VsdCh2b2lkKSB7CiAgICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKIAotLy8gICAgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChYLHJlc3Vfc3RsKTsKLS8vCi0vLyAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om1hdHJpeF9tYXRyaXhfcHJvZHVjdChBX3N0bCxCX3N0bCxYX3N0bCxfc2l6ZSk7Ci0vLwotLy8gICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQotLy8gICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7Ci0vLwotLy8gICAgIGlmIChlcnJvcj4xLmUtNil7Ci0vLyAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKLS8vIC8vICAgICAgIGV4aXQoMSk7Ci0vLyAgICAgfQotCisgICAgLy8gICAgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChYLHJlc3Vfc3RsKTsKKyAgICAvLworICAgIC8vICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bWF0cml4X21hdHJpeF9wcm9kdWN0KEFfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKKyAgICAvLworICAgIC8vICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKyAgICAvLyAgICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKKyAgICAvLworICAgIC8vICAgICBpZiAoZXJyb3I+MS5lLTYpeworICAgIC8vICAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworICAgIC8vIC8vICAgICAgIGV4aXQoMSk7CisgICAgLy8gICAgIH0KICAgfQogCi1wcml2YXRlIDoKLQorIHByaXZhdGU6CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IEJfc3RsOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggWF9zdGw7CkBAIC0xNTUsMTEgKzEzNCw2IEBACiAKICAgaW50IF9zaXplOwogICBkb3VibGUgX2Nvc3Q7Ci0KIH07CiAKLQogI2VuZGlmCi0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvYWN0aW9ucy9hY3Rpb25fdHJtbS5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cm1tLmhoCmluZGV4IDhmNzgxMzguLjhjMGIyNWYgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cm1tLmhoCisrKyBiL2JlbmNoL2J0bC9hY3Rpb25zL2FjdGlvbl90cm1tLmhoCkBAIC0yOCwxMTggKzI4LDk3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLXRlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK3RlbXBsYXRlIDxjbGFzcyBJbnRlcmZhY2U+CiBjbGFzcyBBY3Rpb25fdHJtbSB7Ci0KLXB1YmxpYyA6Ci0KKyBwdWJsaWM6CiAgIC8vIEN0b3IKIAotICBBY3Rpb25fdHJtbSggaW50IHNpemUgKTpfc2l6ZShzaXplKQotICB7CisgIEFjdGlvbl90cm1tKGludCBzaXplKSA6IF9zaXplKHNpemUpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fdHJtbSBDdG9yIik7CiAKICAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KIAotICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKLSAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihCX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOwotICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCwgX3NpemUpOworICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEJfc3RsLCBfc2l6ZSk7CisgICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oWF9zdGwsIF9zaXplKTsKKyAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCwgX3NpemUpOwogCi0gICAgZm9yIChpbnQgaj0wOyBqPF9zaXplOyArK2opCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpPGo7ICsraSkKLSAgICAgICAgQV9zdGxbal1baV0gPSAwOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgX3NpemU7ICsraikgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqOyArK2kpIEFfc3RsW2pdW2ldID0gMDsKICAgICAgIEFfc3RsW2pdW2pdICs9IDM7CiAgICAgfQogCiAgICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgogCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEJfcmVmLEJfc3RsKTsKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsIEFfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCX3JlZiwgQl9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLCBYX3N0bCk7CiAKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCLEJfc3RsKTsKLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYLFhfc3RsKTsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLCBBX3N0bCk7CisgICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQiwgQl9zdGwpOworICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsIFhfc3RsKTsKIAogICAgIF9jb3N0ID0gMDsKLSAgICBmb3IgKGludCBqPTA7IGo8X3NpemU7ICsraikKLSAgICB7Ci0gICAgICBfY29zdCArPSAyKmogKyAxOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgX3NpemU7ICsraikgeworICAgICAgX2Nvc3QgKz0gMiAqIGogKyAxOwogICAgIH0KICAgICBfY29zdCAqPSBfc2l6ZTsKICAgfQogCiAgIC8vIGludmFsaWRhdGUgY29weSBjdG9yCiAKLSAgQWN0aW9uX3RybW0oIGNvbnN0ICBBY3Rpb25fdHJtbSAmICkKLSAgeworICBBY3Rpb25fdHJtbShjb25zdCBBY3Rpb25fdHJtbSYpIHsKICAgICBJTkZPUygiaWxsZWdhbCBjYWxsIHRvIEFjdGlvbl90cm1tIENvcHkgQ3RvciIpOwogICAgIGV4aXQoMCk7CiAgIH0KIAogICAvLyBEdG9yCiAKLSAgfkFjdGlvbl90cm1tKCB2b2lkICl7Ci0KKyAgfkFjdGlvbl90cm1tKHZvaWQpIHsKICAgICBNRVNTQUdFKCJBY3Rpb25fdHJtbSBEdG9yIik7CiAKICAgICAvLyBkZWFsbG9jYXRpb24KIAotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFgsX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQiwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCwgX3NpemUpOwogCi0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCX3JlZixfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZixfc2l6ZSk7Ci0KKyAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLCBfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCX3JlZiwgX3NpemUpOworICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsIF9zaXplKTsKICAgfQogCiAgIC8vIGFjdGlvbiBuYW1lCiAKLSAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKLSAgewotICAgIHJldHVybiAidHJtbV8iK0ludGVyZmFjZTo6bmFtZSgpOworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUodm9pZCkgeyByZXR1cm4gInRybW1fIiArIEludGVyZmFjZTo6bmFtZSgpOyB9CisKKyAgZG91YmxlIG5iX29wX2Jhc2Uodm9pZCkgeyByZXR1cm4gX2Nvc3Q7IH0KKworICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKHZvaWQpIHsKKyAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLCBBLCBfc2l6ZSk7CisgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChCX3JlZiwgQiwgX3NpemUpOworICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoWF9yZWYsIFgsIF9zaXplKTsKICAgfQogCi0gIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7Ci0gICAgcmV0dXJuIF9jb3N0OwotICB9CisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSh2b2lkKSB7IEludGVyZmFjZTo6dHJtbShBLCBCLCBYLCBfc2l6ZSk7IH0KIAotICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7Ci0KLSAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOwotICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQl9yZWYsQixfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZixYLF9zaXplKTsKLQotICB9Ci0KLSAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgewotICAgICAgSW50ZXJmYWNlOjp0cm1tKEEsQixYLF9zaXplKTsKLSAgfQotCi0gIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7Ci0KKyAgdm9pZCBjaGVja19yZXN1bHQodm9pZCkgewogICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCiAKLS8vICAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoWCxyZXN1X3N0bCk7Ci0vLwotLy8gICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjptYXRyaXhfbWF0cml4X3Byb2R1Y3QoQV9zdGwsQl9zdGwsWF9zdGwsX3NpemUpOwotLy8KLS8vICAgICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KLS8vICAgICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwscmVzdV9zdGwpOwotLy8KLS8vICAgICBpZiAoZXJyb3I+MS5lLTYpewotLy8gICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7Ci0vLyAvLyAgICAgICBleGl0KDEpOwotLy8gICAgIH0KLQorICAgIC8vICAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoWCxyZXN1X3N0bCk7CisgICAgLy8KKyAgICAvLyAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om1hdHJpeF9tYXRyaXhfcHJvZHVjdChBX3N0bCxCX3N0bCxYX3N0bCxfc2l6ZSk7CisgICAgLy8KKyAgICAvLyAgICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgLy8gICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisgICAgLy8KKyAgICAvLyAgICAgaWYgKGVycm9yPjEuZS02KXsKKyAgICAvLyAgICAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICAvLyAvLyAgICAgICBleGl0KDEpOworICAgIC8vICAgICB9CiAgIH0KIAotcHJpdmF0ZSA6Ci0KKyBwcml2YXRlOgogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBCX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOwpAQCAtMTU1LDExICsxMzQsNiBAQAogCiAgIGludCBfc2l6ZTsKICAgZG91YmxlIF9jb3N0OwotCiB9OwogCi0KICNlbmRpZgotCi0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2FjdGlvbnMvYmFzaWNfYWN0aW9ucy5oaCBiL2JlbmNoL2J0bC9hY3Rpb25zL2Jhc2ljX2FjdGlvbnMuaGgKaW5kZXggNjI0NDJmMC4uZTJlMWYxYyAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2FjdGlvbnMvYmFzaWNfYWN0aW9ucy5oaAorKysgYi9iZW5jaC9idGwvYWN0aW9ucy9iYXNpY19hY3Rpb25zLmhoCkBAIC0xOCw0ICsxOCwzIEBACiAjaW5jbHVkZSAiYWN0aW9uX3JvdC5oaCIKIAogLy8gI2luY2x1ZGUgImFjdGlvbl9sdV9zb2x2ZS5oaCIKLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2RhdGEvbWVhbi5jeHggYi9iZW5jaC9idGwvZGF0YS9tZWFuLmN4eAppbmRleCBjNTY3ZWYzLi5mZTRiNDUzIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvZGF0YS9tZWFuLmN4eAorKysgYi9iZW5jaC9idGwvZGF0YS9tZWFuLmN4eApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIG1lYW4uY3h4Ci0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxNSBDRVNUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2luY2x1ZGUgInV0aWxpdGllcy5oIgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdHJpbmc+CkBAIC0yOCwxNTUgKzI4LDEzOCBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi1kb3VibGUgbWVhbl9jYWxjKGNvbnN0IHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCBjb25zdCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMsIGNvbnN0IGludCBzaXplX21pbiwgY29uc3QgaW50IHNpemVfbWF4KTsKK2RvdWJsZSBtZWFuX2NhbGMoY29uc3QgdmVjdG9yPGludD4gJnRhYl9zaXplcywgY29uc3QgdmVjdG9yPGRvdWJsZT4gJnRhYl9tZmxvcHMsIGNvbnN0IGludCBzaXplX21pbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNpemVfbWF4KTsKIAotY2xhc3MgTGliX01lYW57Ci0KLXB1YmxpYzoKLSAgTGliX01lYW4oIHZvaWQgKTpfbGliX25hbWUoKSxfbWVhbl9pbl9jYWNoZSgpLF9tZWFuX291dF9vZl9jYWNoZSgpeworY2xhc3MgTGliX01lYW4geworIHB1YmxpYzoKKyAgTGliX01lYW4odm9pZCkgOiBfbGliX25hbWUoKSwgX21lYW5faW5fY2FjaGUoKSwgX21lYW5fb3V0X29mX2NhY2hlKCkgewogICAgIE1FU1NBR0UoIkxpYl9tZWFuIERlZmF1bHQgQ3RvciIpOwogICAgIE1FU1NBR0UoIiEhISBzaG91bGQgbm90IGJlIHVzZWQiKTsKICAgICBleGl0KDApOwogICB9Ci0gIExpYl9NZWFuKGNvbnN0IHN0cmluZyAmIG5hbWUsIGNvbnN0IGRvdWJsZSAmIG1pYywgY29uc3QgZG91YmxlICYgbW9jKTpfbGliX25hbWUobmFtZSksX21lYW5faW5fY2FjaGUobWljKSxfbWVhbl9vdXRfb2ZfY2FjaGUobW9jKXsKKyAgTGliX01lYW4oY29uc3Qgc3RyaW5nICZuYW1lLCBjb25zdCBkb3VibGUgJm1pYywgY29uc3QgZG91YmxlICZtb2MpCisgICAgICA6IF9saWJfbmFtZShuYW1lKSwgX21lYW5faW5fY2FjaGUobWljKSwgX21lYW5fb3V0X29mX2NhY2hlKG1vYykgewogICAgIE1FU1NBR0UoIkxpYl9tZWFuIEN0b3IiKTsKICAgfQotICBMaWJfTWVhbihjb25zdCBMaWJfTWVhbiAmIGxtKTpfbGliX25hbWUobG0uX2xpYl9uYW1lKSxfbWVhbl9pbl9jYWNoZShsbS5fbWVhbl9pbl9jYWNoZSksX21lYW5fb3V0X29mX2NhY2hlKGxtLl9tZWFuX291dF9vZl9jYWNoZSl7CisgIExpYl9NZWFuKGNvbnN0IExpYl9NZWFuICZsbSkKKyAgICAgIDogX2xpYl9uYW1lKGxtLl9saWJfbmFtZSksIF9tZWFuX2luX2NhY2hlKGxtLl9tZWFuX2luX2NhY2hlKSwgX21lYW5fb3V0X29mX2NhY2hlKGxtLl9tZWFuX291dF9vZl9jYWNoZSkgewogICAgIE1FU1NBR0UoIkxpYl9tZWFuIENvcHkgQ3RvciIpOwogICB9Ci0gIH5MaWJfTWVhbiggdm9pZCApewotICAgIE1FU1NBR0UoIkxpYl9tZWFuIER0b3IiKTsKLSAgfQotICAgIAorICB+TGliX01lYW4odm9pZCkgeyBNRVNTQUdFKCJMaWJfbWVhbiBEdG9yIik7IH0KKwogICBkb3VibGUgX21lYW5faW5fY2FjaGU7CiAgIGRvdWJsZSBfbWVhbl9vdXRfb2ZfY2FjaGU7CiAgIHN0cmluZyBfbGliX25hbWU7CiAKLSAgYm9vbCBvcGVyYXRvciA8ICggY29uc3QgTGliX01lYW4gJnJpZ2h0KSBjb25zdCAKLSAgewotICAgIC8vcmV0dXJuICggdGhpcy0+X21lYW5fb3V0X29mX2NhY2hlID4gcmlnaHQuX21lYW5fb3V0X29mX2NhY2hlKSA7Ci0gICAgcmV0dXJuICggdGhpcy0+X21lYW5faW5fY2FjaGUgPiByaWdodC5fbWVhbl9pbl9jYWNoZSkgOworICBib29sIG9wZXJhdG9yPChjb25zdCBMaWJfTWVhbiAmcmlnaHQpIGNvbnN0IHsKKyAgICAvLyByZXR1cm4gKCB0aGlzLT5fbWVhbl9vdXRfb2ZfY2FjaGUgPiByaWdodC5fbWVhbl9vdXRfb2ZfY2FjaGUpIDsKKyAgICByZXR1cm4gKHRoaXMtPl9tZWFuX2luX2NhY2hlID4gcmlnaHQuX21lYW5faW5fY2FjaGUpOwogICB9Cit9OwogCi19OyAKLQotCi1pbnQgbWFpbiggaW50IGFyZ2MgLCBjaGFyICphcmd2W10gKQotewotCi0gIGlmIChhcmdjPDYpeworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICBpZiAoYXJnYyA8IDYpIHsKICAgICBJTkZPUygiISEhIEVycm9yIC4uLiB1c2FnZSA6IG1haW4gd2hhdCBtaWMgTWljIG1vYyBNb2MgZmlsZW5hbWUxIGZpbmVuYW1lMi4uLiIpOwogICAgIGV4aXQoMCk7CiAgIH0KICAgSU5GT1MoYXJnYyk7CiAKLSAgaW50IG1pbl9pbl9jYWNoZT1hdG9pKGFyZ3ZbMl0pOwotICBpbnQgbWF4X2luX2NhY2hlPWF0b2koYXJndlszXSk7Ci0gIGludCBtaW5fb3V0X29mX2NhY2hlPWF0b2koYXJndls0XSk7Ci0gIGludCBtYXhfb3V0X29mX2NhY2hlPWF0b2koYXJndls1XSk7CisgIGludCBtaW5faW5fY2FjaGUgPSBhdG9pKGFyZ3ZbMl0pOworICBpbnQgbWF4X2luX2NhY2hlID0gYXRvaShhcmd2WzNdKTsKKyAgaW50IG1pbl9vdXRfb2ZfY2FjaGUgPSBhdG9pKGFyZ3ZbNF0pOworICBpbnQgbWF4X291dF9vZl9jYWNoZSA9IGF0b2koYXJndls1XSk7CiAKKyAgbXVsdGlzZXQ8TGliX01lYW4+IHNfbGliX21lYW47CiAKLSAgbXVsdGlzZXQ8TGliX01lYW4+IHNfbGliX21lYW4gOworICBmb3IgKGludCBpID0gNjsgaSA8IGFyZ2M7IGkrKykgeworICAgIHN0cmluZyBmaWxlbmFtZSA9IGFyZ3ZbaV07CiAKLSAgZm9yIChpbnQgaT02O2k8YXJnYztpKyspewotICAgIAotICAgIHN0cmluZyBmaWxlbmFtZT1hcmd2W2ldOwotICAgIAogICAgIElORk9TKGZpbGVuYW1lKTsKIAotICAgIGRvdWJsZSBtaWM9MDsKLSAgICBkb3VibGUgbW9jPTA7CisgICAgZG91YmxlIG1pYyA9IDA7CisgICAgZG91YmxlIG1vYyA9IDA7CiAKICAgICB7Ci0gICAgICAKICAgICAgIHZlY3RvcjxpbnQ+IHRhYl9zaXplczsKICAgICAgIHZlY3Rvcjxkb3VibGU+IHRhYl9tZmxvcHM7CiAKLSAgICAgIHJlYWRfeHlfZmlsZShmaWxlbmFtZSx0YWJfc2l6ZXMsdGFiX21mbG9wcyk7CisgICAgICByZWFkX3h5X2ZpbGUoZmlsZW5hbWUsIHRhYl9zaXplcywgdGFiX21mbG9wcyk7CiAKLSAgICAgIG1pYz1tZWFuX2NhbGModGFiX3NpemVzLHRhYl9tZmxvcHMsbWluX2luX2NhY2hlLG1heF9pbl9jYWNoZSk7Ci0gICAgICBtb2M9bWVhbl9jYWxjKHRhYl9zaXplcyx0YWJfbWZsb3BzLG1pbl9vdXRfb2ZfY2FjaGUsbWF4X291dF9vZl9jYWNoZSk7CisgICAgICBtaWMgPSBtZWFuX2NhbGModGFiX3NpemVzLCB0YWJfbWZsb3BzLCBtaW5faW5fY2FjaGUsIG1heF9pbl9jYWNoZSk7CisgICAgICBtb2MgPSBtZWFuX2NhbGModGFiX3NpemVzLCB0YWJfbWZsb3BzLCBtaW5fb3V0X29mX2NhY2hlLCBtYXhfb3V0X29mX2NhY2hlKTsKIAotICAgICAgTGliX01lYW4gY3VyX2xpYl9tZWFuKGZpbGVuYW1lLG1pYyxtb2MpOwotICAgICAgCi0gICAgICBzX2xpYl9tZWFuLmluc2VydChjdXJfbGliX21lYW4pOwkKKyAgICAgIExpYl9NZWFuIGN1cl9saWJfbWVhbihmaWxlbmFtZSwgbWljLCBtb2MpOwogCi0gICAgfSAgIAotICAgICAgICAgICAKKyAgICAgIHNfbGliX21lYW4uaW5zZXJ0KGN1cl9saWJfbWVhbik7CisgICAgfQogICB9CiAKLQotICBjb3V0IDw8ICI8VEFCTEUgQk9SREVSIENFTExQQURESU5HPTI+IiA8PCBlbmRsIDsKLSAgY291dCA8PCAiICA8VFI+IiA8PCBlbmRsIDsKLSAgY291dCA8PCAiICAgIDxUSCBBTElHTj1DRU5URVI+ICIgPDwgYXJndlsxXSA8PCAiIDwvVEg+IiA8PCBlbmRsIDsKLSAgY291dCA8PCAiICAgIDxUSCBBTElHTj1DRU5URVI+IDxhIGhyZWY9IiIjbWVhbl9tYXJrZXIiIj4gaW4gY2FjaGUgPEJSPiBtZWFuIHBlcmYgPEJSPiBNZmxvcHMgPC9hPjwvVEg+IiA8PCBlbmRsIDsKLSAgY291dCA8PCAiICAgIDxUSCBBTElHTj1DRU5URVI+IGluIGNhY2hlIDxCUj4gJSBiZXN0IDwvVEg+IiA8PCBlbmRsIDsKLSAgY291dCA8PCAiICAgIDxUSCBBTElHTj1DRU5URVI+IDxhIGhyZWY9IiIjbWVhbl9tYXJrZXIiIj4gb3V0IG9mIGNhY2hlIDxCUj4gbWVhbiBwZXJmIDxCUj4gTWZsb3BzIDwvYT48L1RIPiIgPDwgZW5kbCA7Ci0gIGNvdXQgPDwgIiAgICA8VEggQUxJR049Q0VOVEVSPiBvdXQgb2YgY2FjaGUgPEJSPiAlIGJlc3QgPC9USD4iIDw8IGVuZGwgOwotICBjb3V0IDw8ICIgICAgPFRIIEFMSUdOPUNFTlRFUj4gZGV0YWlscyA8L1RIPiIgPDwgZW5kbCA7Ci0gIGNvdXQgPDwgIiAgICA8VEggQUxJR049Q0VOVEVSPiBjb21tZW50cyA8L1RIPiIgPDwgZW5kbCA7Ci0gIGNvdXQgPDwgIiAgPC9UUj4iIDw8IGVuZGwgOworICBjb3V0IDw8ICI8VEFCTEUgQk9SREVSIENFTExQQURESU5HPTI+IiA8PCBlbmRsOworICBjb3V0IDw8ICIgIDxUUj4iIDw8IGVuZGw7CisgIGNvdXQgPDwgIiAgICA8VEggQUxJR049Q0VOVEVSPiAiIDw8IGFyZ3ZbMV0gPDwgIiA8L1RIPiIgPDwgZW5kbDsKKyAgY291dCA8PCAiICAgIDxUSCBBTElHTj1DRU5URVI+IDxhIGhyZWY9IgorICAgICAgICAgICIjbWVhbl9tYXJrZXIiCisgICAgICAgICAgIj4gaW4gY2FjaGUgPEJSPiBtZWFuIHBlcmYgPEJSPiBNZmxvcHMgPC9hPjwvVEg+IgorICAgICAgIDw8IGVuZGw7CisgIGNvdXQgPDwgIiAgICA8VEggQUxJR049Q0VOVEVSPiBpbiBjYWNoZSA8QlI+ICUgYmVzdCA8L1RIPiIgPDwgZW5kbDsKKyAgY291dCA8PCAiICAgIDxUSCBBTElHTj1DRU5URVI+IDxhIGhyZWY9IgorICAgICAgICAgICIjbWVhbl9tYXJrZXIiCisgICAgICAgICAgIj4gb3V0IG9mIGNhY2hlIDxCUj4gbWVhbiBwZXJmIDxCUj4gTWZsb3BzIDwvYT48L1RIPiIKKyAgICAgICA8PCBlbmRsOworICBjb3V0IDw8ICIgICAgPFRIIEFMSUdOPUNFTlRFUj4gb3V0IG9mIGNhY2hlIDxCUj4gJSBiZXN0IDwvVEg+IiA8PCBlbmRsOworICBjb3V0IDw8ICIgICAgPFRIIEFMSUdOPUNFTlRFUj4gZGV0YWlscyA8L1RIPiIgPDwgZW5kbDsKKyAgY291dCA8PCAiICAgIDxUSCBBTElHTj1DRU5URVI+IGNvbW1lbnRzIDwvVEg+IiA8PCBlbmRsOworICBjb3V0IDw8ICIgIDwvVFI+IiA8PCBlbmRsOwogCiAgIG11bHRpc2V0PExpYl9NZWFuPjo6aXRlcmF0b3IgaXMgPSBzX2xpYl9tZWFuLmJlZ2luKCk7Ci0gIExpYl9NZWFuIGJlc3QoKmlzKTsgIAotICAKKyAgTGliX01lYW4gYmVzdCgqaXMpOwogCi0gIGZvciAoaXM9c19saWJfbWVhbi5iZWdpbigpOyBpcyE9c19saWJfbWVhbi5lbmQoKSA7IGlzKyspewotCi0gICAgY291dCA8PCAiICA8VFI+IiA8PCBlbmRsIDsKLSAgICBjb3V0IDw8ICIgICAgIDxURD4gIiA8PCBpcy0+X2xpYl9uYW1lIDw8ICIgPC9URD4iIDw8IGVuZGwgOwotICAgIGNvdXQgPDwgIiAgICAgPFREPiAiIDw8IGlzLT5fbWVhbl9pbl9jYWNoZSA8PCAiIDwvVEQ+IiA8PCBlbmRsIDsKLSAgICBjb3V0IDw8ICIgICAgIDxURD4gIiA8PCAxMDAqKGlzLT5fbWVhbl9pbl9jYWNoZS9iZXN0Ll9tZWFuX2luX2NhY2hlKSA8PCAiIDwvVEQ+IiA8PCBlbmRsIDsKLSAgICBjb3V0IDw8ICIgICAgIDxURD4gIiA8PCBpcy0+X21lYW5fb3V0X29mX2NhY2hlIDw8ICIgPC9URD4iIDw8IGVuZGwgOwotICAgIGNvdXQgPDwgIiAgICAgPFREPiAiIDw8IDEwMCooaXMtPl9tZWFuX291dF9vZl9jYWNoZS9iZXN0Ll9tZWFuX291dF9vZl9jYWNoZSkgPDwgIiA8L1REPiIgPDwgZW5kbCA7Ci0gICAgY291dCA8PCAiICAgICA8VEQ+ICIgPDwgCi0gICAgICAiPGEgaHJlZj1cIiMiPDxpcy0+X2xpYl9uYW1lPDwiXyI8PGFyZ3ZbMV08PCJcIj5zbmlwcGV0PC9hPi8iIAotICAgICAgIjxhIGhyZWY9XCIjIjw8aXMtPl9saWJfbmFtZTw8Il9mbGFnc1wiPmZsYWdzPC9hPiAgPC9URD4iIDw8IGVuZGwgOwotICAgIGNvdXQgPDwgIiAgICAgPFREPiAiIDw8IAotICAgICAgIjxhIGhyZWY9XCIjIjw8aXMtPl9saWJfbmFtZTw8Il9jb21tZW50c1wiPmNsaWNrIGhlcmU8L2E+ICA8L1REPiIgPDwgZW5kbCA7Ci0gICAgY291dCA8PCAiICA8L1RSPiIgPDwgZW5kbCA7Ci0gIAorICBmb3IgKGlzID0gc19saWJfbWVhbi5iZWdpbigpOyBpcyAhPSBzX2xpYl9tZWFuLmVuZCgpOyBpcysrKSB7CisgICAgY291dCA8PCAiICA8VFI+IiA8PCBlbmRsOworICAgIGNvdXQgPDwgIiAgICAgPFREPiAiIDw8IGlzLT5fbGliX25hbWUgPDwgIiA8L1REPiIgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICIgICAgIDxURD4gIiA8PCBpcy0+X21lYW5faW5fY2FjaGUgPDwgIiA8L1REPiIgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICIgICAgIDxURD4gIiA8PCAxMDAgKiAoaXMtPl9tZWFuX2luX2NhY2hlIC8gYmVzdC5fbWVhbl9pbl9jYWNoZSkgPDwgIiA8L1REPiIgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICIgICAgIDxURD4gIiA8PCBpcy0+X21lYW5fb3V0X29mX2NhY2hlIDw8ICIgPC9URD4iIDw8IGVuZGw7CisgICAgY291dCA8PCAiICAgICA8VEQ+ICIgPDwgMTAwICogKGlzLT5fbWVhbl9vdXRfb2ZfY2FjaGUgLyBiZXN0Ll9tZWFuX291dF9vZl9jYWNoZSkgPDwgIiA8L1REPiIgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICIgICAgIDxURD4gIgorICAgICAgICAgPDwgIjxhIGhyZWY9XCIjIiA8PCBpcy0+X2xpYl9uYW1lIDw8ICJfIiA8PCBhcmd2WzFdCisgICAgICAgICA8PCAiXCI+c25pcHBldDwvYT4vIgorICAgICAgICAgICAgIjxhIGhyZWY9XCIjIgorICAgICAgICAgPDwgaXMtPl9saWJfbmFtZSA8PCAiX2ZsYWdzXCI+ZmxhZ3M8L2E+ICA8L1REPiIgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICIgICAgIDxURD4gIgorICAgICAgICAgPDwgIjxhIGhyZWY9XCIjIiA8PCBpcy0+X2xpYl9uYW1lIDw8ICJfY29tbWVudHNcIj5jbGljayBoZXJlPC9hPiAgPC9URD4iIDw8IGVuZGw7CisgICAgY291dCA8PCAiICA8L1RSPiIgPDwgZW5kbDsKICAgfQogCi0gIGNvdXQgPDwgIjwvVEFCTEU+IiA8PCBlbmRsIDsKKyAgY291dCA8PCAiPC9UQUJMRT4iIDw8IGVuZGw7CiAKLSAgb2ZzdHJlYW0gb3V0cHV0X2ZpbGUgKCIuLi9vcmRlcl9saWIiLGlvczo6b3V0KSA7Ci0gIAotICBmb3IgKGlzPXNfbGliX21lYW4uYmVnaW4oKTsgaXMhPXNfbGliX21lYW4uZW5kKCkgOyBpcysrKXsKLSAgICBvdXRwdXRfZmlsZSA8PCBpcy0+X2xpYl9uYW1lIDw8IGVuZGwgOworICBvZnN0cmVhbSBvdXRwdXRfZmlsZSgiLi4vb3JkZXJfbGliIiwgaW9zOjpvdXQpOworCisgIGZvciAoaXMgPSBzX2xpYl9tZWFuLmJlZ2luKCk7IGlzICE9IHNfbGliX21lYW4uZW5kKCk7IGlzKyspIHsKKyAgICBvdXRwdXRfZmlsZSA8PCBpcy0+X2xpYl9uYW1lIDw8IGVuZGw7CiAgIH0KIAogICBvdXRwdXRfZmlsZS5jbG9zZSgpOwotCiB9CiAKLWRvdWJsZSBtZWFuX2NhbGMoY29uc3QgdmVjdG9yPGludD4gJiB0YWJfc2l6ZXMsIGNvbnN0IHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcywgY29uc3QgaW50IHNpemVfbWluLCBjb25zdCBpbnQgc2l6ZV9tYXgpewotICAKLSAgaW50IHNpemU9dGFiX3NpemVzLnNpemUoKTsKLSAgaW50IG5iX3NhbXBsZT0wOwotICBkb3VibGUgbWVhbj0wLjA7Citkb3VibGUgbWVhbl9jYWxjKGNvbnN0IHZlY3RvcjxpbnQ+ICZ0YWJfc2l6ZXMsIGNvbnN0IHZlY3Rvcjxkb3VibGU+ICZ0YWJfbWZsb3BzLCBjb25zdCBpbnQgc2l6ZV9taW4sCisgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzaXplX21heCkgeworICBpbnQgc2l6ZSA9IHRhYl9zaXplcy5zaXplKCk7CisgIGludCBuYl9zYW1wbGUgPSAwOworICBkb3VibGUgbWVhbiA9IDAuMDsKIAotICBmb3IgKGludCBpPTA7aTxzaXplO2krKyl7Ci0gICAgCi0gICAgCi0gICAgaWYgKCh0YWJfc2l6ZXNbaV0+PXNpemVfbWluKSYmKHRhYl9zaXplc1tpXTw9c2l6ZV9tYXgpKXsKLSAgICAgIAorICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGlmICgodGFiX3NpemVzW2ldID49IHNpemVfbWluKSAmJiAodGFiX3NpemVzW2ldIDw9IHNpemVfbWF4KSkgewogICAgICAgbmJfc2FtcGxlKys7Ci0gICAgICBtZWFuKz10YWJfbWZsb3BzW2ldOwotCisgICAgICBtZWFuICs9IHRhYl9tZmxvcHNbaV07CiAgICAgfQotCi0gICAgCiAgIH0KIAotICBpZiAobmJfc2FtcGxlPT0wKXsKKyAgaWYgKG5iX3NhbXBsZSA9PSAwKSB7CiAgICAgSU5GT1MoIm5vIGRhdGEgZm9yIG1lYW4gY2FsY3VsYXRpb24iKTsKICAgICByZXR1cm4gMC4wOwogICB9CiAKLSAgcmV0dXJuIG1lYW4vbmJfc2FtcGxlOworICByZXR1cm4gbWVhbiAvIG5iX3NhbXBsZTsKIH0KLQotICAKLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZGF0YS9yZWd1bGFyaXplLmN4eCBiL2JlbmNoL2J0bC9kYXRhL3JlZ3VsYXJpemUuY3h4CmluZGV4IGVlYTJiOGIuLjUxZTJlZGYgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9kYXRhL3JlZ3VsYXJpemUuY3h4CisrKyBiL2JlbmNoL2J0bC9kYXRhL3JlZ3VsYXJpemUuY3h4CkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgcmVndWxhcml6ZS5jeHgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE1IENFU1QgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDcgKzE2LDcgQEAKIC8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0vLyAKKy8vCiAjaW5jbHVkZSAidXRpbGl0aWVzLmgiCiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0cmluZz4KQEAgLTI3LDk5ICsyNyw4MiBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi12b2lkIHJlYWRfeHlfZmlsZShjb25zdCBzdHJpbmcgJiBmaWxlbmFtZSwgdmVjdG9yPGludD4gJiB0YWJfc2l6ZXMsIHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcyk7Ci12b2lkIHJlZ3VsYXJpemVfY3VydmUoY29uc3Qgc3RyaW5nICYgZmlsZW5hbWUsCi0JCSAgICAgIGNvbnN0IHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcywgCi0JCSAgICAgIGNvbnN0IHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCAKLQkJICAgICAgaW50IHN0YXJ0X2N1dF9zaXplLCBpbnQgc3RvcF9jdXRfc2l6ZSk7Cit2b2lkIHJlYWRfeHlfZmlsZShjb25zdCBzdHJpbmcgJmZpbGVuYW1lLCB2ZWN0b3I8aW50PiAmdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmdGFiX21mbG9wcyk7Cit2b2lkIHJlZ3VsYXJpemVfY3VydmUoY29uc3Qgc3RyaW5nICZmaWxlbmFtZSwgY29uc3QgdmVjdG9yPGRvdWJsZT4gJnRhYl9tZmxvcHMsIGNvbnN0IHZlY3RvcjxpbnQ+ICZ0YWJfc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2N1dF9zaXplLCBpbnQgc3RvcF9jdXRfc2l6ZSk7CiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLWludCBtYWluKCBpbnQgYXJnYyAsIGNoYXIgKmFyZ3ZbXSApCi17Ci0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgLy8gaW5wdXQgZGF0YQogCi0gIGlmIChhcmdjPDQpeworICBpZiAoYXJnYyA8IDQpIHsKICAgICBJTkZPUygiISEhIEVycm9yIC4uLiB1c2FnZSA6IG1haW4gZmlsZW5hbWUgc3RhcnRfY3V0X3NpemUgc3RvcF9jdXRfc2l6ZSByZWd1bGFyaXplX2ZpbGVuYW1lIik7CiAgICAgZXhpdCgwKTsKICAgfQogICBJTkZPUyhhcmdjKTsKIAotICBpbnQgc3RhcnRfY3V0X3NpemU9YXRvaShhcmd2WzJdKTsKLSAgaW50IHN0b3BfY3V0X3NpemU9YXRvaShhcmd2WzNdKTsKKyAgaW50IHN0YXJ0X2N1dF9zaXplID0gYXRvaShhcmd2WzJdKTsKKyAgaW50IHN0b3BfY3V0X3NpemUgPSBhdG9pKGFyZ3ZbM10pOwogCi0gIHN0cmluZyBmaWxlbmFtZT1hcmd2WzFdOwotICBzdHJpbmcgcmVndWxhcml6ZV9maWxlbmFtZT1hcmd2WzRdOwotICAKKyAgc3RyaW5nIGZpbGVuYW1lID0gYXJndlsxXTsKKyAgc3RyaW5nIHJlZ3VsYXJpemVfZmlsZW5hbWUgPSBhcmd2WzRdOworCiAgIElORk9TKGZpbGVuYW1lKTsKLSAgSU5GT1MoInN0YXJ0X2N1dF9zaXplPSI8PHN0YXJ0X2N1dF9zaXplKTsKKyAgSU5GT1MoInN0YXJ0X2N1dF9zaXplPSIgPDwgc3RhcnRfY3V0X3NpemUpOwogCiAgIHZlY3RvcjxpbnQ+IHRhYl9zaXplczsKICAgdmVjdG9yPGRvdWJsZT4gdGFiX21mbG9wczsKIAotICByZWFkX3h5X2ZpbGUoZmlsZW5hbWUsdGFiX3NpemVzLHRhYl9tZmxvcHMpOworICByZWFkX3h5X2ZpbGUoZmlsZW5hbWUsIHRhYl9zaXplcywgdGFiX21mbG9wcyk7CiAKICAgLy8gcmVndWxhcml6ZWluZwogCi0gIHJlZ3VsYXJpemVfY3VydmUocmVndWxhcml6ZV9maWxlbmFtZSx0YWJfbWZsb3BzLHRhYl9zaXplcyxzdGFydF9jdXRfc2l6ZSxzdG9wX2N1dF9zaXplKTsKLSAgCi0KKyAgcmVndWxhcml6ZV9jdXJ2ZShyZWd1bGFyaXplX2ZpbGVuYW1lLCB0YWJfbWZsb3BzLCB0YWJfc2l6ZXMsIHN0YXJ0X2N1dF9zaXplLCBzdG9wX2N1dF9zaXplKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotdm9pZCByZWd1bGFyaXplX2N1cnZlKGNvbnN0IHN0cmluZyAmIGZpbGVuYW1lLAotCQkgICAgICBjb25zdCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMsIAotCQkgICAgICBjb25zdCB2ZWN0b3I8aW50PiAmIHRhYl9zaXplcywgCi0JCSAgICAgIGludCBzdGFydF9jdXRfc2l6ZSwgaW50IHN0b3BfY3V0X3NpemUpCi17Ci0gIGludCBzaXplPXRhYl9tZmxvcHMuc2l6ZSgpOwotICBvZnN0cmVhbSBvdXRwdXRfZmlsZSAoZmlsZW5hbWUuY19zdHIoKSxpb3M6Om91dCkgOwordm9pZCByZWd1bGFyaXplX2N1cnZlKGNvbnN0IHN0cmluZyAmZmlsZW5hbWUsIGNvbnN0IHZlY3Rvcjxkb3VibGU+ICZ0YWJfbWZsb3BzLCBjb25zdCB2ZWN0b3I8aW50PiAmdGFiX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9jdXRfc2l6ZSwgaW50IHN0b3BfY3V0X3NpemUpIHsKKyAgaW50IHNpemUgPSB0YWJfbWZsb3BzLnNpemUoKTsKKyAgb2ZzdHJlYW0gb3V0cHV0X2ZpbGUoZmlsZW5hbWUuY19zdHIoKSwgaW9zOjpvdXQpOwogCi0gIGludCBpPTA7CisgIGludCBpID0gMDsKIAotICB3aGlsZSh0YWJfc2l6ZXNbaV08c3RhcnRfY3V0X3NpemUpewotICAgIAotICAgIG91dHB1dF9maWxlIDw8IHRhYl9zaXplc1tpXSA8PCAiICIgPDwgIHRhYl9tZmxvcHNbaV0gPDwgZW5kbCA7CisgIHdoaWxlICh0YWJfc2l6ZXNbaV0gPCBzdGFydF9jdXRfc2l6ZSkgeworICAgIG91dHB1dF9maWxlIDw8IHRhYl9zaXplc1tpXSA8PCAiICIgPDwgdGFiX21mbG9wc1tpXSA8PCBlbmRsOwogICAgIGkrKzsKLQotICB9Ci0gICAgCi0gIG91dHB1dF9maWxlIDw8IGVuZGwgOwotCi0gIHdoaWxlKHRhYl9zaXplc1tpXTxzdG9wX2N1dF9zaXplKXsKLSAgICAKLSAgICBpKys7Ci0KICAgfQogCi0gIHdoaWxlKGk8c2l6ZSl7Ci0gICAgCi0gICAgb3V0cHV0X2ZpbGUgPDwgdGFiX3NpemVzW2ldIDw8ICIgIiA8PCAgdGFiX21mbG9wc1tpXSA8PCBlbmRsIDsKLSAgICBpKys7CisgIG91dHB1dF9maWxlIDw8IGVuZGw7CiAKKyAgd2hpbGUgKHRhYl9zaXplc1tpXSA8IHN0b3BfY3V0X3NpemUpIHsKKyAgICBpKys7CisgIH0KKworICB3aGlsZSAoaSA8IHNpemUpIHsKKyAgICBvdXRwdXRfZmlsZSA8PCB0YWJfc2l6ZXNbaV0gPDwgIiAiIDw8IHRhYl9tZmxvcHNbaV0gPDwgZW5kbDsKKyAgICBpKys7CiAgIH0KIAogICBvdXRwdXRfZmlsZS5jbG9zZSgpOwotCiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotdm9pZCByZWFkX3h5X2ZpbGUoY29uc3Qgc3RyaW5nICYgZmlsZW5hbWUsIHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMpewordm9pZCByZWFkX3h5X2ZpbGUoY29uc3Qgc3RyaW5nICZmaWxlbmFtZSwgdmVjdG9yPGludD4gJnRhYl9zaXplcywgdmVjdG9yPGRvdWJsZT4gJnRhYl9tZmxvcHMpIHsKKyAgaWZzdHJlYW0gaW5wdXRfZmlsZShmaWxlbmFtZS5jX3N0cigpLCBpb3M6OmluKTsKIAotICBpZnN0cmVhbSBpbnB1dF9maWxlIChmaWxlbmFtZS5jX3N0cigpLGlvczo6aW4pIDsKLQotICBpZiAoIWlucHV0X2ZpbGUpewotICAgIElORk9TKCIhISEgRXJyb3Igb3BlbmluZyAiPDxmaWxlbmFtZSk7CisgIGlmICghaW5wdXRfZmlsZSkgeworICAgIElORk9TKCIhISEgRXJyb3Igb3BlbmluZyAiIDw8IGZpbGVuYW1lKTsKICAgICBleGl0KDApOwogICB9Ci0gIAotICBpbnQgbmJfcG9pbnQ9MDsKLSAgaW50IHNpemU9MDsKLSAgZG91YmxlIG1mbG9wcz0wOwogCi0gIHdoaWxlIChpbnB1dF9maWxlID4+IHNpemUgPj4gbWZsb3BzICl7CisgIGludCBuYl9wb2ludCA9IDA7CisgIGludCBzaXplID0gMDsKKyAgZG91YmxlIG1mbG9wcyA9IDA7CisKKyAgd2hpbGUgKGlucHV0X2ZpbGUgPj4gc2l6ZSA+PiBtZmxvcHMpIHsKICAgICBuYl9wb2ludCsrOwogICAgIHRhYl9zaXplcy5wdXNoX2JhY2soc2l6ZSk7CiAgICAgdGFiX21mbG9wcy5wdXNoX2JhY2sobWZsb3BzKTsKQEAgLTEyOCw0ICsxMTEsMyBAQAogCiAgIGlucHV0X2ZpbGUuY2xvc2UoKTsKIH0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2RhdGEvc21vb3RoLmN4eCBiL2JlbmNoL2J0bC9kYXRhL3Ntb290aC5jeHgKaW5kZXggZTUyNzBjYy4uYjBhMmQ5NiAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2RhdGEvc21vb3RoLmN4eAorKysgYi9iZW5jaC9idGwvZGF0YS9zbW9vdGguY3h4CkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgc21vb3RoLmN4eAotLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KIC8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTUgQ0VTVCAyMDAyCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKIC8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpAQCAtMTYsNyArMTYsNyBAQAogLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLS8vIAorLy8KICNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8ZGVxdWU+CkBAIC0yOCwxNjUgKzI4LDEzMyBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi12b2lkIHJlYWRfeHlfZmlsZShjb25zdCBzdHJpbmcgJiBmaWxlbmFtZSwgdmVjdG9yPGludD4gJiB0YWJfc2l6ZXMsIHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcyk7Ci12b2lkIHdyaXRlX3h5X2ZpbGUoY29uc3Qgc3RyaW5nICYgZmlsZW5hbWUsIHZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMpOwotdm9pZCBzbW9vdGhfY3VydmUoY29uc3QgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzLCB2ZWN0b3I8ZG91YmxlPiAmIHNtb290aF90YWJfbWZsb3BzLGludCB3aW5kb3dfaGFsZl93aWR0aCk7Ci12b2lkIGNlbnRlcmVkX3Ntb290aF9jdXJ2ZShjb25zdCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMsIHZlY3Rvcjxkb3VibGU+ICYgc21vb3RoX3RhYl9tZmxvcHMsaW50IHdpbmRvd19oYWxmX3dpZHRoKTsKK3ZvaWQgcmVhZF94eV9maWxlKGNvbnN0IHN0cmluZyAmZmlsZW5hbWUsIHZlY3RvcjxpbnQ+ICZ0YWJfc2l6ZXMsIHZlY3Rvcjxkb3VibGU+ICZ0YWJfbWZsb3BzKTsKK3ZvaWQgd3JpdGVfeHlfZmlsZShjb25zdCBzdHJpbmcgJmZpbGVuYW1lLCB2ZWN0b3I8aW50PiAmdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmdGFiX21mbG9wcyk7Cit2b2lkIHNtb290aF9jdXJ2ZShjb25zdCB2ZWN0b3I8ZG91YmxlPiAmdGFiX21mbG9wcywgdmVjdG9yPGRvdWJsZT4gJnNtb290aF90YWJfbWZsb3BzLCBpbnQgd2luZG93X2hhbGZfd2lkdGgpOwordm9pZCBjZW50ZXJlZF9zbW9vdGhfY3VydmUoY29uc3QgdmVjdG9yPGRvdWJsZT4gJnRhYl9tZmxvcHMsIHZlY3Rvcjxkb3VibGU+ICZzbW9vdGhfdGFiX21mbG9wcywgaW50IHdpbmRvd19oYWxmX3dpZHRoKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1pbnQgbWFpbiggaW50IGFyZ2MgLCBjaGFyICphcmd2W10gKQotewotCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgIC8vIGlucHV0IGRhdGEKIAotICBpZiAoYXJnYzwzKXsKKyAgaWYgKGFyZ2MgPCAzKSB7CiAgICAgSU5GT1MoIiEhISBFcnJvciAuLi4gdXNhZ2UgOiBtYWluIGZpbGVuYW1lIHdpbmRvd19oYWxmX3dpZHRoIHNtb290aF9maWxlbmFtZSIpOwogICAgIGV4aXQoMCk7CiAgIH0KICAgSU5GT1MoYXJnYyk7CiAKLSAgaW50IHdpbmRvd19oYWxmX3dpZHRoPWF0b2koYXJndlsyXSk7CisgIGludCB3aW5kb3dfaGFsZl93aWR0aCA9IGF0b2koYXJndlsyXSk7CiAKLSAgc3RyaW5nIGZpbGVuYW1lPWFyZ3ZbMV07Ci0gIHN0cmluZyBzbW9vdGhfZmlsZW5hbWU9YXJndlszXTsKLSAgCisgIHN0cmluZyBmaWxlbmFtZSA9IGFyZ3ZbMV07CisgIHN0cmluZyBzbW9vdGhfZmlsZW5hbWUgPSBhcmd2WzNdOworCiAgIElORk9TKGZpbGVuYW1lKTsKLSAgSU5GT1MoIndpbmRvd19oYWxmX3dpZHRoPSI8PHdpbmRvd19oYWxmX3dpZHRoKTsKKyAgSU5GT1MoIndpbmRvd19oYWxmX3dpZHRoPSIgPDwgd2luZG93X2hhbGZfd2lkdGgpOwogCiAgIHZlY3RvcjxpbnQ+IHRhYl9zaXplczsKICAgdmVjdG9yPGRvdWJsZT4gdGFiX21mbG9wczsKIAotICByZWFkX3h5X2ZpbGUoZmlsZW5hbWUsdGFiX3NpemVzLHRhYl9tZmxvcHMpOworICByZWFkX3h5X2ZpbGUoZmlsZW5hbWUsIHRhYl9zaXplcywgdGFiX21mbG9wcyk7CiAKICAgLy8gc21vb3RoaW5nCiAKICAgdmVjdG9yPGRvdWJsZT4gc21vb3RoX3RhYl9tZmxvcHM7CiAKLSAgLy9zbW9vdGhfY3VydmUodGFiX21mbG9wcyxzbW9vdGhfdGFiX21mbG9wcyx3aW5kb3dfaGFsZl93aWR0aCk7Ci0gIGNlbnRlcmVkX3Ntb290aF9jdXJ2ZSh0YWJfbWZsb3BzLHNtb290aF90YWJfbWZsb3BzLHdpbmRvd19oYWxmX3dpZHRoKTsKKyAgLy8gc21vb3RoX2N1cnZlKHRhYl9tZmxvcHMsc21vb3RoX3RhYl9tZmxvcHMsd2luZG93X2hhbGZfd2lkdGgpOworICBjZW50ZXJlZF9zbW9vdGhfY3VydmUodGFiX21mbG9wcywgc21vb3RoX3RhYl9tZmxvcHMsIHdpbmRvd19oYWxmX3dpZHRoKTsKIAogICAvLyBvdXRwdXQgcmVzdWx0CiAKLSAgd3JpdGVfeHlfZmlsZShzbW9vdGhfZmlsZW5hbWUsdGFiX3NpemVzLHNtb290aF90YWJfbWZsb3BzKTsKLSAgCi0KKyAgd3JpdGVfeHlfZmlsZShzbW9vdGhfZmlsZW5hbWUsIHRhYl9zaXplcywgc21vb3RoX3RhYl9tZmxvcHMpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXRlbXBsYXRlPGNsYXNzIFZFQ1RPUj4KLWRvdWJsZSB3ZWlnaHRlZF9tZWFuKGNvbnN0IFZFQ1RPUiAmIGRhdGEpCi17Cit0ZW1wbGF0ZSA8Y2xhc3MgVkVDVE9SPgorZG91YmxlIHdlaWdodGVkX21lYW4oY29uc3QgVkVDVE9SICZkYXRhKSB7CisgIGRvdWJsZSBtZWFuID0gMC4wOwogCi0gIGRvdWJsZSBtZWFuPTAuMDsKLSAgCi0gIGZvciAoaW50IGk9MCA7IGk8ZGF0YS5zaXplKCkgOyBpKyspewotCi0gICAgbWVhbis9ZGF0YVtpXTsKLQorICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEuc2l6ZSgpOyBpKyspIHsKKyAgICBtZWFuICs9IGRhdGFbaV07CiAgIH0KIAotICByZXR1cm4gbWVhbi9kb3VibGUoZGF0YS5zaXplKCkpIDsKLQotfSAgICAKLQotCi0KKyAgcmV0dXJuIG1lYW4gLyBkb3VibGUoZGF0YS5zaXplKCkpOworfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKK3ZvaWQgc21vb3RoX2N1cnZlKGNvbnN0IHZlY3Rvcjxkb3VibGU+ICZ0YWJfbWZsb3BzLCB2ZWN0b3I8ZG91YmxlPiAmc21vb3RoX3RhYl9tZmxvcHMsIGludCB3aW5kb3dfaGFsZl93aWR0aCkgeworICBpbnQgd2luZG93X3dpZHRoID0gMiAqIHdpbmRvd19oYWxmX3dpZHRoICsgMTsKIAotdm9pZCBzbW9vdGhfY3VydmUoY29uc3QgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzLCB2ZWN0b3I8ZG91YmxlPiAmIHNtb290aF90YWJfbWZsb3BzLGludCB3aW5kb3dfaGFsZl93aWR0aCl7Ci0gIAotICBpbnQgd2luZG93X3dpZHRoPTIqd2luZG93X2hhbGZfd2lkdGgrMTsKLQotICBpbnQgc2l6ZT10YWJfbWZsb3BzLnNpemUoKTsKKyAgaW50IHNpemUgPSB0YWJfbWZsb3BzLnNpemUoKTsKIAogICB2ZWN0b3I8ZG91YmxlPiBzYW1wbGUod2luZG93X3dpZHRoKTsKLSAgCi0gIGZvciAoaW50IGk9MCA7IGkgPCBzaXplIDsgaSsrKXsKLSAgICAKLSAgICBmb3IgKCBpbnQgaj0wIDsgaiA8IHdpbmRvd193aWR0aCA7IGorKyApewotICAgICAgCi0gICAgICBpbnQgc2hpZnRlZF9pbmRleD1pK2otd2luZG93X2hhbGZfd2lkdGg7Ci0gICAgICBpZiAoc2hpZnRlZF9pbmRleDwwKSBzaGlmdGVkX2luZGV4PTA7Ci0gICAgICBpZiAoc2hpZnRlZF9pbmRleD5zaXplLTEpIHNoaWZ0ZWRfaW5kZXg9c2l6ZS0xOwotICAgICAgc2FtcGxlW2pdPXRhYl9tZmxvcHNbc2hpZnRlZF9pbmRleF07Ci0gICAgICAKKworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgd2luZG93X3dpZHRoOyBqKyspIHsKKyAgICAgIGludCBzaGlmdGVkX2luZGV4ID0gaSArIGogLSB3aW5kb3dfaGFsZl93aWR0aDsKKyAgICAgIGlmIChzaGlmdGVkX2luZGV4IDwgMCkgc2hpZnRlZF9pbmRleCA9IDA7CisgICAgICBpZiAoc2hpZnRlZF9pbmRleCA+IHNpemUgLSAxKSBzaGlmdGVkX2luZGV4ID0gc2l6ZSAtIDE7CisgICAgICBzYW1wbGVbal0gPSB0YWJfbWZsb3BzW3NoaWZ0ZWRfaW5kZXhdOwogICAgIH0KIAogICAgIHNtb290aF90YWJfbWZsb3BzLnB1c2hfYmFjayh3ZWlnaHRlZF9tZWFuKHNhbXBsZSkpOwotCiAgIH0KLQogfQogCi12b2lkIGNlbnRlcmVkX3Ntb290aF9jdXJ2ZShjb25zdCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMsIHZlY3Rvcjxkb3VibGU+ICYgc21vb3RoX3RhYl9tZmxvcHMsaW50IHdpbmRvd19oYWxmX3dpZHRoKXsKLSAgCi0gIGludCBtYXhfd2luZG93X3dpZHRoPTIqd2luZG93X2hhbGZfd2lkdGgrMTsKK3ZvaWQgY2VudGVyZWRfc21vb3RoX2N1cnZlKGNvbnN0IHZlY3Rvcjxkb3VibGU+ICZ0YWJfbWZsb3BzLCB2ZWN0b3I8ZG91YmxlPiAmc21vb3RoX3RhYl9tZmxvcHMsIGludCB3aW5kb3dfaGFsZl93aWR0aCkgeworICBpbnQgbWF4X3dpbmRvd193aWR0aCA9IDIgKiB3aW5kb3dfaGFsZl93aWR0aCArIDE7CiAKLSAgaW50IHNpemU9dGFiX21mbG9wcy5zaXplKCk7CisgIGludCBzaXplID0gdGFiX21mbG9wcy5zaXplKCk7CiAKLSAgCi0gIGZvciAoaW50IGk9MCA7IGkgPCBzaXplIDsgaSsrKXsKLQorICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgIGRlcXVlPGRvdWJsZT4gc2FtcGxlOwogCi0gICAgCiAgICAgc2FtcGxlLnB1c2hfYmFjayh0YWJfbWZsb3BzW2ldKTsKIAotICAgIGZvciAoIGludCBqPTEgOyBqIDw9IHdpbmRvd19oYWxmX3dpZHRoIDsgaisrICl7Ci0gICAgICAKLSAgICAgIGludCBiZWZvcmU9aS1qOwotICAgICAgaW50IGFmdGVyPWkrajsKLSAgICAgIAotICAgICAgaWYgKChiZWZvcmU+PTApJiYoYWZ0ZXI8c2l6ZSkpIC8vIGluc2lkZSBvZiB0aGUgdmVjdG9yCi0JeyAKLQkgIHNhbXBsZS5wdXNoX2Zyb250KHRhYl9tZmxvcHNbYmVmb3JlXSk7Ci0JICBzYW1wbGUucHVzaF9iYWNrKHRhYl9tZmxvcHNbYWZ0ZXJdKTsKLQl9CisgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gd2luZG93X2hhbGZfd2lkdGg7IGorKykgeworICAgICAgaW50IGJlZm9yZSA9IGkgLSBqOworICAgICAgaW50IGFmdGVyID0gaSArIGo7CisKKyAgICAgIGlmICgoYmVmb3JlID49IDApICYmIChhZnRlciA8IHNpemUpKSAgLy8gaW5zaWRlIG9mIHRoZSB2ZWN0b3IKKyAgICAgIHsKKyAgICAgICAgc2FtcGxlLnB1c2hfZnJvbnQodGFiX21mbG9wc1tiZWZvcmVdKTsKKyAgICAgICAgc2FtcGxlLnB1c2hfYmFjayh0YWJfbWZsb3BzW2FmdGVyXSk7CisgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgc21vb3RoX3RhYl9tZmxvcHMucHVzaF9iYWNrKHdlaWdodGVkX21lYW4oc2FtcGxlKSk7Ci0gICAgCisgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIHdyaXRlX3h5X2ZpbGUoY29uc3Qgc3RyaW5nICZmaWxlbmFtZSwgdmVjdG9yPGludD4gJnRhYl9zaXplcywgdmVjdG9yPGRvdWJsZT4gJnRhYl9tZmxvcHMpIHsKKyAgb2ZzdHJlYW0gb3V0cHV0X2ZpbGUoZmlsZW5hbWUuY19zdHIoKSwgaW9zOjpvdXQpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFiX3NpemVzLnNpemUoKTsgaSsrKSB7CisgICAgb3V0cHV0X2ZpbGUgPDwgdGFiX3NpemVzW2ldIDw8ICIgIiA8PCB0YWJfbWZsb3BzW2ldIDw8IGVuZGw7CiAgIH0KIAotfQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotdm9pZCB3cml0ZV94eV9maWxlKGNvbnN0IHN0cmluZyAmIGZpbGVuYW1lLCB2ZWN0b3I8aW50PiAmIHRhYl9zaXplcywgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzKXsKLQotICBvZnN0cmVhbSBvdXRwdXRfZmlsZSAoZmlsZW5hbWUuY19zdHIoKSxpb3M6Om91dCkgOwotICAKLSAgZm9yIChpbnQgaT0wIDsgaSA8IHRhYl9zaXplcy5zaXplKCkgOyBpKyspCi0gICAgewotICAgICAgb3V0cHV0X2ZpbGUgPDwgdGFiX3NpemVzW2ldIDw8ICIgIiA8PCAgdGFiX21mbG9wc1tpXSA8PCBlbmRsIDsKLSAgICB9Ci0gIAogICBvdXRwdXRfZmlsZS5jbG9zZSgpOwotCiB9CiAKLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi12b2lkIHJlYWRfeHlfZmlsZShjb25zdCBzdHJpbmcgJiBmaWxlbmFtZSwgdmVjdG9yPGludD4gJiB0YWJfc2l6ZXMsIHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcyl7Cit2b2lkIHJlYWRfeHlfZmlsZShjb25zdCBzdHJpbmcgJmZpbGVuYW1lLCB2ZWN0b3I8aW50PiAmdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmdGFiX21mbG9wcykgeworICBpZnN0cmVhbSBpbnB1dF9maWxlKGZpbGVuYW1lLmNfc3RyKCksIGlvczo6aW4pOwogCi0gIGlmc3RyZWFtIGlucHV0X2ZpbGUgKGZpbGVuYW1lLmNfc3RyKCksaW9zOjppbikgOwotCi0gIGlmICghaW5wdXRfZmlsZSl7Ci0gICAgSU5GT1MoIiEhISBFcnJvciBvcGVuaW5nICI8PGZpbGVuYW1lKTsKKyAgaWYgKCFpbnB1dF9maWxlKSB7CisgICAgSU5GT1MoIiEhISBFcnJvciBvcGVuaW5nICIgPDwgZmlsZW5hbWUpOwogICAgIGV4aXQoMCk7CiAgIH0KLSAgCi0gIGludCBuYl9wb2ludD0wOwotICBpbnQgc2l6ZT0wOwotICBkb3VibGUgbWZsb3BzPTA7CiAKLSAgd2hpbGUgKGlucHV0X2ZpbGUgPj4gc2l6ZSA+PiBtZmxvcHMgKXsKKyAgaW50IG5iX3BvaW50ID0gMDsKKyAgaW50IHNpemUgPSAwOworICBkb3VibGUgbWZsb3BzID0gMDsKKworICB3aGlsZSAoaW5wdXRfZmlsZSA+PiBzaXplID4+IG1mbG9wcykgewogICAgIG5iX3BvaW50Kys7CiAgICAgdGFiX3NpemVzLnB1c2hfYmFjayhzaXplKTsKICAgICB0YWJfbWZsb3BzLnB1c2hfYmFjayhtZmxvcHMpOwpAQCAtMTk1LDQgKzE2MywzIEBACiAKICAgaW5wdXRfZmlsZS5jbG9zZSgpOwogfQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9iZW5jaC5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2JlbmNoLmhoCmluZGV4IDA3MzI5NDAuLmNiM2MzNTkgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2JlbmNoLmhoCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2JlbmNoLmhoCkBAIC0zMywxOSArMzMsMTcgQEAKIC8vICNpbmNsdWRlICJ0aW1lcnMveDg2X3BlcmZfYW5hbHl6ZXIuaGgiCiAvLyAjaW5jbHVkZSAidGltZXJzL1NUTF9wZXJmX2FuYWx5emVyLmhoIgogI2lmZGVmIEhBVkVfTUtMCi1leHRlcm4gIkMiIHZvaWQgY2JsYXNfc2F4cHkoY29uc3QgaW50LCBjb25zdCBmbG9hdCwgY29uc3QgZmxvYXQqLCBjb25zdCBpbnQsIGZsb2F0ICosIGNvbnN0IGludCk7CitleHRlcm4gIkMiIHZvaWQgY2JsYXNfc2F4cHkoY29uc3QgaW50LCBjb25zdCBmbG9hdCwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50LCBmbG9hdCAqLCBjb25zdCBpbnQpOwogI2VuZGlmCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi10ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3M+IGNsYXNzIFBlcmZfQW5hbHl6ZXIsIGNsYXNzIEFjdGlvbj4KLUJUTF9ET05UX0lOTElORSB2b2lkIGJlbmNoKCBpbnQgc2l6ZV9taW4sIGludCBzaXplX21heCwgaW50IG5iX3BvaW50ICkKLXsKLSAgaWYgKEJ0bENvbmZpZzo6c2tpcEFjdGlvbihBY3Rpb246Om5hbWUoKSkpCi0gICAgcmV0dXJuOwordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgUGVyZl9BbmFseXplciwgY2xhc3MgQWN0aW9uPgorQlRMX0RPTlRfSU5MSU5FIHZvaWQgYmVuY2goaW50IHNpemVfbWluLCBpbnQgc2l6ZV9tYXgsIGludCBuYl9wb2ludCkgeworICBpZiAoQnRsQ29uZmlnOjpza2lwQWN0aW9uKEFjdGlvbjo6bmFtZSgpKSkgcmV0dXJuOwogCi0gIHN0cmluZyBmaWxlbmFtZT0iYmVuY2hfIitBY3Rpb246Om5hbWUoKSsiLmRhdCI7CisgIHN0cmluZyBmaWxlbmFtZSA9ICJiZW5jaF8iICsgQWN0aW9uOjpuYW1lKCkgKyAiLmRhdCI7CiAKLSAgSU5GT1MoInN0YXJ0aW5nICIgPDxmaWxlbmFtZSk7CisgIElORk9TKCJzdGFydGluZyAiIDw8IGZpbGVuYW1lKTsKIAogICAvLyB1dGlsaXRpZXMKIApAQCAtNTMsNyArNTEsNyBAQAogICBzdGQ6OnZlY3RvcjxpbnQ+IHRhYl9zaXplcyhuYl9wb2ludCk7CiAKICAgLy8gbWF0cmljZXMgYW5kIHZlY3RvciBzaXplIGNhbGN1bGF0aW9ucwotICBzaXplX2xpbl9sb2cobmJfcG9pbnQsc2l6ZV9taW4sc2l6ZV9tYXgsdGFiX3NpemVzKTsKKyAgc2l6ZV9saW5fbG9nKG5iX3BvaW50LCBzaXplX21pbiwgc2l6ZV9tYXgsIHRhYl9zaXplcyk7CiAKICAgc3RkOjp2ZWN0b3I8aW50PiBvbGRTaXplczsKICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBvbGRGbG9wczsKQEAgLTYyLDI5ICs2MCwyNiBAQAogCiAgIC8vIGxvb3Agb24gbWF0cml4IHNpemUKICAgUGVyZl9BbmFseXplcjxBY3Rpb24+IHBlcmZfYWN0aW9uOwotICBmb3IgKGludCBpPW5iX3BvaW50LTE7aT49MDtpLS0pCi0gIHsKLSAgICAvL0lORk9TKCJzaXplPSIgPDx0YWJfc2l6ZXNbaV08PCIgICAoIjw8bmJfcG9pbnQtaTw8Ii8iPDxuYl9wb2ludDw8IikiKTsKLSAgICBzdGQ6OmNvdXQgPDwgIiAiIDw8ICJzaXplID0gIiA8PCB0YWJfc2l6ZXNbaV0gPDwgIiAgIiA8PCBzdGQ6OmZsdXNoOworICBmb3IgKGludCBpID0gbmJfcG9pbnQgLSAxOyBpID49IDA7IGktLSkgeworICAgIC8vIElORk9TKCJzaXplPSIgPDx0YWJfc2l6ZXNbaV08PCIgICAoIjw8bmJfcG9pbnQtaTw8Ii8iPDxuYl9wb2ludDw8IikiKTsKKyAgICBzdGQ6OmNvdXQgPDwgIiAiCisgICAgICAgICAgICAgIDw8ICJzaXplID0gIiA8PCB0YWJfc2l6ZXNbaV0gPDwgIiAgIiA8PCBzdGQ6OmZsdXNoOwogCiAgICAgQlRMX0RJU0FCTEVfU1NFX0VYQ0VQVElPTlMoKTsKLSAgICAjaWZkZWYgSEFWRV9NS0wKKyNpZmRlZiBIQVZFX01LTAogICAgIHsKICAgICAgIGZsb2F0IGR1bW15OwotICAgICAgY2JsYXNfc2F4cHkoMSwwLCZkdW1teSwxLCZkdW1teSwxKTsKKyAgICAgIGNibGFzX3NheHB5KDEsIDAsICZkdW1teSwgMSwgJmR1bW15LCAxKTsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAogICAgIHRhYl9tZmxvcHNbaV0gPSBwZXJmX2FjdGlvbi5ldmFsX21mbG9wcyh0YWJfc2l6ZXNbaV0pOwogICAgIHN0ZDo6Y291dCA8PCB0YWJfbWZsb3BzW2ldOwotICAgIAotICAgIGlmIChoYXNPbGRSZXN1bHRzKQotICAgIHsKLSAgICAgIHdoaWxlIChvbGRpPj0wICYmIG9sZFNpemVzW29sZGldPnRhYl9zaXplc1tpXSkKLSAgICAgICAgLS1vbGRpOwotICAgICAgaWYgKG9sZGk+PTAgJiYgb2xkU2l6ZXNbb2xkaV09PXRhYl9zaXplc1tpXSkKLSAgICAgIHsKLSAgICAgICAgaWYgKG9sZEZsb3BzW29sZGldPHRhYl9tZmxvcHNbaV0pCisKKyAgICBpZiAoaGFzT2xkUmVzdWx0cykgeworICAgICAgd2hpbGUgKG9sZGkgPj0gMCAmJiBvbGRTaXplc1tvbGRpXSA+IHRhYl9zaXplc1tpXSkgLS1vbGRpOworICAgICAgaWYgKG9sZGkgPj0gMCAmJiBvbGRTaXplc1tvbGRpXSA9PSB0YWJfc2l6ZXNbaV0pIHsKKyAgICAgICAgaWYgKG9sZEZsb3BzW29sZGldIDwgdGFiX21mbG9wc1tpXSkKICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0ID4gIjsKICAgICAgICAgZWxzZQogICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHQgPCAiOwpAQCAtOTIsNDggKzg3LDM4IEBACiAgICAgICB9CiAgICAgICAtLW9sZGk7CiAgICAgfQotICAgIHN0ZDo6Y291dCA8PCAiIE1GbG9wcyAgICAoIiA8PCBuYl9wb2ludC1pIDw8ICIvIiA8PCBuYl9wb2ludCA8PCAiKSIgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAiIE1GbG9wcyAgICAoIiA8PCBuYl9wb2ludCAtIGkgPDwgIi8iIDw8IG5iX3BvaW50IDw8ICIpIiA8PCBzdGQ6OmVuZGw7CiAgIH0KIAotICBpZiAoIUJ0bENvbmZpZzo6SW5zdGFuY2Uub3ZlcndyaXRlUmVzdWx0cykKLSAgewotICAgIGlmIChoYXNPbGRSZXN1bHRzKQotICAgIHsKKyAgaWYgKCFCdGxDb25maWc6Okluc3RhbmNlLm92ZXJ3cml0ZVJlc3VsdHMpIHsKKyAgICBpZiAoaGFzT2xkUmVzdWx0cykgewogICAgICAgLy8gbWVyZ2UgdGhlIHR3byBkYXRhCiAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IG5ld1NpemVzOwogICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBuZXdGbG9wczsKLSAgICAgIHVuc2lnbmVkIGludCBpPTA7Ci0gICAgICB1bnNpZ25lZCBpbnQgaj0wOwotICAgICAgd2hpbGUgKGk8dGFiX3NpemVzLnNpemUoKSAmJiBqPG9sZFNpemVzLnNpemUoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHRhYl9zaXplc1tpXSA9PSBvbGRTaXplc1tqXSkKLSAgICAgICAgeworICAgICAgdW5zaWduZWQgaW50IGkgPSAwOworICAgICAgdW5zaWduZWQgaW50IGogPSAwOworICAgICAgd2hpbGUgKGkgPCB0YWJfc2l6ZXMuc2l6ZSgpICYmIGogPCBvbGRTaXplcy5zaXplKCkpIHsKKyAgICAgICAgaWYgKHRhYl9zaXplc1tpXSA9PSBvbGRTaXplc1tqXSkgewogICAgICAgICAgIG5ld1NpemVzLnB1c2hfYmFjayh0YWJfc2l6ZXNbaV0pOwogICAgICAgICAgIG5ld0Zsb3BzLnB1c2hfYmFjayhzdGQ6Om1heCh0YWJfbWZsb3BzW2ldLCBvbGRGbG9wc1tqXSkpOwogICAgICAgICAgICsraTsKICAgICAgICAgICArK2o7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFiX3NpemVzW2ldIDwgb2xkU2l6ZXNbal0pCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIGlmICh0YWJfc2l6ZXNbaV0gPCBvbGRTaXplc1tqXSkgewogICAgICAgICAgIG5ld1NpemVzLnB1c2hfYmFjayh0YWJfc2l6ZXNbaV0pOwogICAgICAgICAgIG5ld0Zsb3BzLnB1c2hfYmFjayh0YWJfbWZsb3BzW2ldKTsKICAgICAgICAgICArK2k7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgbmV3U2l6ZXMucHVzaF9iYWNrKG9sZFNpemVzW2pdKTsKICAgICAgICAgICBuZXdGbG9wcy5wdXNoX2JhY2sob2xkRmxvcHNbal0pOwogICAgICAgICAgICsrajsKICAgICAgICAgfQogICAgICAgfQotICAgICAgd2hpbGUgKGk8dGFiX3NpemVzLnNpemUoKSkKLSAgICAgIHsKKyAgICAgIHdoaWxlIChpIDwgdGFiX3NpemVzLnNpemUoKSkgewogICAgICAgICBuZXdTaXplcy5wdXNoX2JhY2sodGFiX3NpemVzW2ldKTsKICAgICAgICAgbmV3RmxvcHMucHVzaF9iYWNrKHRhYl9tZmxvcHNbaV0pOwogICAgICAgICArK2k7CiAgICAgICB9Ci0gICAgICB3aGlsZSAoajxvbGRTaXplcy5zaXplKCkpCi0gICAgICB7CisgICAgICB3aGlsZSAoaiA8IG9sZFNpemVzLnNpemUoKSkgewogICAgICAgICBuZXdTaXplcy5wdXNoX2JhY2sob2xkU2l6ZXNbal0pOwogICAgICAgICBuZXdGbG9wcy5wdXNoX2JhY2sob2xkRmxvcHNbal0pOwogICAgICAgICArK2o7CkBAIC0xNDQsMjUgKzEyOSwyMSBAQAogICB9CiAKICAgLy8gZHVtcCB0aGUgcmVzdWx0IGluIGEgZmlsZSAgOgotICBkdW1wX3h5X2ZpbGUodGFiX3NpemVzLHRhYl9tZmxvcHMsZmlsZW5hbWUpOwotCisgIGR1bXBfeHlfZmlsZSh0YWJfc2l6ZXMsIHRhYl9tZmxvcHMsIGZpbGVuYW1lKTsKIH0KIAogLy8gZGVmYXVsdCBQZXJmIEFuYWx5emVyCiAKIHRlbXBsYXRlIDxjbGFzcyBBY3Rpb24+Ci1CVExfRE9OVF9JTkxJTkUgdm9pZCBiZW5jaCggaW50IHNpemVfbWluLCBpbnQgc2l6ZV9tYXgsIGludCBuYl9wb2ludCApewotCitCVExfRE9OVF9JTkxJTkUgdm9pZCBiZW5jaChpbnQgc2l6ZV9taW4sIGludCBzaXplX21heCwgaW50IG5iX3BvaW50KSB7CiAgIC8vIGlmIHRoZSByZHRzYyBpcyBub3QgYXZhaWxhYmxlIDoKLSAgYmVuY2g8UG9ydGFibGVfUGVyZl9BbmFseXplcixBY3Rpb24+KHNpemVfbWluLHNpemVfbWF4LG5iX3BvaW50KTsKKyAgYmVuY2g8UG9ydGFibGVfUGVyZl9BbmFseXplciwgQWN0aW9uPihzaXplX21pbiwgc2l6ZV9tYXgsIG5iX3BvaW50KTsKICAgLy8gaWYgdGhlIHJkdHNjIGlzIGF2YWlsYWJsZSA6Ci0vLyAgICBiZW5jaDxNaXhlZF9QZXJmX0FuYWx5emVyLEFjdGlvbj4oc2l6ZV9taW4sc2l6ZV9tYXgsbmJfcG9pbnQpOwotCisgIC8vICAgIGJlbmNoPE1peGVkX1BlcmZfQW5hbHl6ZXIsQWN0aW9uPihzaXplX21pbixzaXplX21heCxuYl9wb2ludCk7CiAKICAgLy8gT25seSBmb3Igc21hbGwgcHJvYmxlbSBzaXplLiBPdGhlcndpc2UgaXQgd2lsbCBiZSB0b28gbG9uZwotLy8gICBiZW5jaDxYODZfUGVyZl9BbmFseXplcixBY3Rpb24+KHNpemVfbWluLHNpemVfbWF4LG5iX3BvaW50KTsKLS8vICAgYmVuY2g8U1RMX1BlcmZfQW5hbHl6ZXIsQWN0aW9uPihzaXplX21pbixzaXplX21heCxuYl9wb2ludCk7Ci0KKyAgLy8gICBiZW5jaDxYODZfUGVyZl9BbmFseXplcixBY3Rpb24+KHNpemVfbWluLHNpemVfbWF4LG5iX3BvaW50KTsKKyAgLy8gICBiZW5jaDxTVExfUGVyZl9BbmFseXplcixBY3Rpb24+KHNpemVfbWluLHNpemVfbWF4LG5iX3BvaW50KTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9idGwuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9idGwuaGgKaW5kZXggNzA2YjAwZi4uOWVkNTI0OCAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvYnRsLmhoCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2J0bC5oaApAQCAtMzksNyArMzksNyBAQAogI2VuZGlmCiAKICNpZiAoZGVmaW5lZCBfX0dOVUNfXykKLSNkZWZpbmUgQlRMX0FTTV9DT01NRU5UKFgpICBhc20oIiMiIFgpCisjZGVmaW5lIEJUTF9BU01fQ09NTUVOVChYKSBhc20oIiMiIFgpCiAjZWxzZQogI2RlZmluZSBCVExfQVNNX0NPTU1FTlQoWCkKICNlbmRpZgpAQCAtNDcsMTY0ICs0NywxMzEgQEAKICNpZmRlZiBfX1NTRV9fCiAjaW5jbHVkZSAieG1taW50cmluLmgiCiAvLyBUaGlzIGVuYWJsZXMgZmx1c2ggdG8gemVybyAoRlRaKSBhbmQgZGVub3JtYWxzIGFyZSB6ZXJvIChEQVopIG1vZGVzOgotI2RlZmluZSBCVExfRElTQUJMRV9TU0VfRVhDRVBUSU9OUygpICB7IF9tbV9zZXRjc3IoX21tX2dldGNzcigpIHwgMHg4MDQwKTsgfQorI2RlZmluZSBCVExfRElTQUJMRV9TU0VfRVhDRVBUSU9OUygpIFwKKyAgeyBfbW1fc2V0Y3NyKF9tbV9nZXRjc3IoKSB8IDB4ODA0MCk7IH0KICNlbHNlCiAjZGVmaW5lIEJUTF9ESVNBQkxFX1NTRV9FWENFUFRJT05TKCkKICNlbmRpZgogCiAvKiogRW5oYW5jZWQgc3RkOjpzdHJpbmcKLSovCi1jbGFzcyBCdGxTdHJpbmcgOiBwdWJsaWMgc3RkOjpzdHJpbmcKLXsKLXB1YmxpYzoKLSAgICBCdGxTdHJpbmcoKSA6IHN0ZDo6c3RyaW5nKCkge30KLSAgICBCdGxTdHJpbmcoY29uc3QgQnRsU3RyaW5nJiBzdHIpIDogc3RkOjpzdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzdHJpbmcmPihzdHIpKSB7fQotICAgIEJ0bFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSA6IHN0ZDo6c3RyaW5nKHN0cikge30KLSAgICBCdGxTdHJpbmcoY29uc3QgY2hhciogc3RyKSA6IHN0ZDo6c3RyaW5nKHN0cikge30KKyAqLworY2xhc3MgQnRsU3RyaW5nIDogcHVibGljIHN0ZDo6c3RyaW5nIHsKKyBwdWJsaWM6CisgIEJ0bFN0cmluZygpIDogc3RkOjpzdHJpbmcoKSB7fQorICBCdGxTdHJpbmcoY29uc3QgQnRsU3RyaW5nJiBzdHIpIDogc3RkOjpzdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzdHJpbmcmPihzdHIpKSB7fQorICBCdGxTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgOiBzdGQ6OnN0cmluZyhzdHIpIHt9CisgIEJ0bFN0cmluZyhjb25zdCBjaGFyKiBzdHIpIDogc3RkOjpzdHJpbmcoc3RyKSB7fQogCi0gICAgb3BlcmF0b3IgY29uc3QgY2hhciogKCkgY29uc3QgeyByZXR1cm4gY19zdHIoKTsgfQorICBvcGVyYXRvciBjb25zdCBjaGFyKigpIGNvbnN0IHsgcmV0dXJuIGNfc3RyKCk7IH0KIAotICAgIHZvaWQgdHJpbSggYm9vbCBsZWZ0ID0gdHJ1ZSwgYm9vbCByaWdodCA9IHRydWUgKQotICAgIHsKLSAgICAgICAgaW50IGxzcGFjZXMsIHJzcGFjZXMsIGxlbiA9IGxlbmd0aCgpLCBpOwotICAgICAgICBsc3BhY2VzID0gcnNwYWNlcyA9IDA7CisgIHZvaWQgdHJpbShib29sIGxlZnQgPSB0cnVlLCBib29sIHJpZ2h0ID0gdHJ1ZSkgeworICAgIGludCBsc3BhY2VzLCByc3BhY2VzLCBsZW4gPSBsZW5ndGgoKSwgaTsKKyAgICBsc3BhY2VzID0gcnNwYWNlcyA9IDA7CiAKLSAgICAgICAgaWYgKCBsZWZ0ICkKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPGxlbiAmJiAoYXQoaSk9PScgJ3x8YXQoaSk9PSdcdCd8fGF0KGkpPT0nXHInfHxhdChpKT09J1xuJyk7ICsrbHNwYWNlcywrK2kpOworICAgIGlmIChsZWZ0KQorICAgICAgZm9yIChpID0gMDsgaSA8IGxlbiAmJiAoYXQoaSkgPT0gJyAnIHx8IGF0KGkpID09ICdcdCcgfHwgYXQoaSkgPT0gJ1xyJyB8fCBhdChpKSA9PSAnXG4nKTsgKytsc3BhY2VzLCArK2kpCisgICAgICAgIDsKIAotICAgICAgICBpZiAoIHJpZ2h0ICYmIGxzcGFjZXMgPCBsZW4gKQotICAgICAgICAgICAgZm9yKGk9bGVuLTE7IGk+PTAgJiYgKGF0KGkpPT0nICd8fGF0KGkpPT0nXHQnfHxhdChpKT09J1xyJ3x8YXQoaSk9PSdcbicpOyByc3BhY2VzKyssaS0tKTsKKyAgICBpZiAocmlnaHQgJiYgbHNwYWNlcyA8IGxlbikKKyAgICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMCAmJiAoYXQoaSkgPT0gJyAnIHx8IGF0KGkpID09ICdcdCcgfHwgYXQoaSkgPT0gJ1xyJyB8fCBhdChpKSA9PSAnXG4nKTsgcnNwYWNlcysrLCBpLS0pCisgICAgICAgIDsKIAotICAgICAgICAqdGhpcyA9IHN1YnN0cihsc3BhY2VzLCBsZW4tbHNwYWNlcy1yc3BhY2VzKTsKLSAgICB9CisgICAgKnRoaXMgPSBzdWJzdHIobHNwYWNlcywgbGVuIC0gbHNwYWNlcyAtIHJzcGFjZXMpOworICB9CiAKLSAgICBzdGQ6OnZlY3RvcjxCdGxTdHJpbmc+IHNwbGl0KCBjb25zdCBCdGxTdHJpbmcmIGRlbGltcyA9ICJcdFxuICIpIGNvbnN0Ci0gICAgewotICAgICAgICBzdGQ6OnZlY3RvcjxCdGxTdHJpbmc+IHJldDsKLSAgICAgICAgdW5zaWduZWQgaW50IG51bVNwbGl0cyA9IDA7Ci0gICAgICAgIHNpemVfdCBzdGFydCwgcG9zOwotICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBvcyA9IGZpbmRfZmlyc3Rfb2YoZGVsaW1zLCBzdGFydCk7Ci0gICAgICAgICAgICBpZiAocG9zID09IHN0YXJ0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldC5wdXNoX2JhY2soIiIpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gcG9zICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBvcyA9PSBucG9zKQotICAgICAgICAgICAgICAgIHJldC5wdXNoX2JhY2soIHN1YnN0cihzdGFydCkgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXQucHVzaF9iYWNrKCBzdWJzdHIoc3RhcnQsIHBvcyAtIHN0YXJ0KSApOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gcG9zICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vc3RhcnQgPSBmaW5kX2ZpcnN0X25vdF9vZihkZWxpbXMsIHN0YXJ0KTsKLSAgICAgICAgICAgICsrbnVtU3BsaXRzOwotICAgICAgICB9IHdoaWxlIChwb3MgIT0gbnBvcyk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQorICBzdGQ6OnZlY3RvcjxCdGxTdHJpbmc+IHNwbGl0KGNvbnN0IEJ0bFN0cmluZyYgZGVsaW1zID0gIlx0XG4gIikgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPEJ0bFN0cmluZz4gcmV0OworICAgIHVuc2lnbmVkIGludCBudW1TcGxpdHMgPSAwOworICAgIHNpemVfdCBzdGFydCwgcG9zOworICAgIHN0YXJ0ID0gMDsKKyAgICBkbyB7CisgICAgICBwb3MgPSBmaW5kX2ZpcnN0X29mKGRlbGltcywgc3RhcnQpOworICAgICAgaWYgKHBvcyA9PSBzdGFydCkgeworICAgICAgICByZXQucHVzaF9iYWNrKCIiKTsKKyAgICAgICAgc3RhcnQgPSBwb3MgKyAxOworICAgICAgfSBlbHNlIGlmIChwb3MgPT0gbnBvcykKKyAgICAgICAgcmV0LnB1c2hfYmFjayhzdWJzdHIoc3RhcnQpKTsKKyAgICAgIGVsc2UgeworICAgICAgICByZXQucHVzaF9iYWNrKHN1YnN0cihzdGFydCwgcG9zIC0gc3RhcnQpKTsKKyAgICAgICAgc3RhcnQgPSBwb3MgKyAxOworICAgICAgfQorICAgICAgLy8gc3RhcnQgPSBmaW5kX2ZpcnN0X25vdF9vZihkZWxpbXMsIHN0YXJ0KTsKKyAgICAgICsrbnVtU3BsaXRzOworICAgIH0gd2hpbGUgKHBvcyAhPSBucG9zKTsKKyAgICByZXR1cm4gcmV0OworICB9CiAKLSAgICBib29sIGVuZHNXaXRoKGNvbnN0IEJ0bFN0cmluZyYgc3RyKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYoc3RyLnNpemUoKT50aGlzLT5zaXplKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0aGlzLT5zdWJzdHIodGhpcy0+c2l6ZSgpLXN0ci5zaXplKCksc3RyLnNpemUoKSkgPT0gc3RyOwotICAgIH0KLSAgICBib29sIGNvbnRhaW5zKGNvbnN0IEJ0bFN0cmluZyYgc3RyKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMtPmZpbmQoc3RyKTx0aGlzLT5zaXplKCk7Ci0gICAgfQotICAgIGJvb2wgYmVnaW5zV2l0aChjb25zdCBCdGxTdHJpbmcmIHN0cikgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmKHN0ci5zaXplKCk+dGhpcy0+c2l6ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdGhpcy0+c3Vic3RyKDAsc3RyLnNpemUoKSkgPT0gc3RyOwotICAgIH0KKyAgYm9vbCBlbmRzV2l0aChjb25zdCBCdGxTdHJpbmcmIHN0cikgY29uc3QgeworICAgIGlmIChzdHIuc2l6ZSgpID4gdGhpcy0+c2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRoaXMtPnN1YnN0cih0aGlzLT5zaXplKCkgLSBzdHIuc2l6ZSgpLCBzdHIuc2l6ZSgpKSA9PSBzdHI7CisgIH0KKyAgYm9vbCBjb250YWlucyhjb25zdCBCdGxTdHJpbmcmIHN0cikgY29uc3QgeyByZXR1cm4gdGhpcy0+ZmluZChzdHIpIDwgdGhpcy0+c2l6ZSgpOyB9CisgIGJvb2wgYmVnaW5zV2l0aChjb25zdCBCdGxTdHJpbmcmIHN0cikgY29uc3QgeworICAgIGlmIChzdHIuc2l6ZSgpID4gdGhpcy0+c2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRoaXMtPnN1YnN0cigwLCBzdHIuc2l6ZSgpKSA9PSBzdHI7CisgIH0KIAotICAgIEJ0bFN0cmluZyB0b0xvd2VyQ2FzZSggdm9pZCApCi0gICAgewotICAgICAgICBzdGQ6OnRyYW5zZm9ybShiZWdpbigpLCBlbmQoKSwgYmVnaW4oKSwgc3RhdGljX2Nhc3Q8aW50KCopKGludCk+KDo6dG9sb3dlcikgKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBCdGxTdHJpbmcgdG9VcHBlckNhc2UoIHZvaWQgKQotICAgIHsKLSAgICAgICAgc3RkOjp0cmFuc2Zvcm0oYmVnaW4oKSwgZW5kKCksIGJlZ2luKCksIHN0YXRpY19jYXN0PGludCgqKShpbnQpPig6OnRvdXBwZXIpICk7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9CisgIEJ0bFN0cmluZyB0b0xvd2VyQ2FzZSh2b2lkKSB7CisgICAgc3RkOjp0cmFuc2Zvcm0oYmVnaW4oKSwgZW5kKCksIGJlZ2luKCksIHN0YXRpY19jYXN0PGludCAoKikoaW50KT4oOjp0b2xvd2VyKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEJ0bFN0cmluZyB0b1VwcGVyQ2FzZSh2b2lkKSB7CisgICAgc3RkOjp0cmFuc2Zvcm0oYmVnaW4oKSwgZW5kKCksIGJlZ2luKCksIHN0YXRpY19jYXN0PGludCAoKikoaW50KT4oOjp0b3VwcGVyKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CiAKLSAgICAvKiogQ2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLgotICAgICovCi0gICAgYm9vbCBpc0VxdWl2KGNvbnN0IEJ0bFN0cmluZyYgc3RyKSBjb25zdAotICAgIHsKLSAgICAgICAgQnRsU3RyaW5nIHN0cjAgPSAqdGhpczsKLSAgICAgICAgc3RyMC50b0xvd2VyQ2FzZSgpOwotICAgICAgICBCdGxTdHJpbmcgc3RyMSA9IHN0cjsKLSAgICAgICAgc3RyMS50b0xvd2VyQ2FzZSgpOwotICAgICAgICByZXR1cm4gc3RyMCA9PSBzdHIxOwotICAgIH0KKyAgLyoqIENhc2UgaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4KKyAgICovCisgIGJvb2wgaXNFcXVpdihjb25zdCBCdGxTdHJpbmcmIHN0cikgY29uc3QgeworICAgIEJ0bFN0cmluZyBzdHIwID0gKnRoaXM7CisgICAgc3RyMC50b0xvd2VyQ2FzZSgpOworICAgIEJ0bFN0cmluZyBzdHIxID0gc3RyOworICAgIHN0cjEudG9Mb3dlckNhc2UoKTsKKyAgICByZXR1cm4gc3RyMCA9PSBzdHIxOworICB9CiAKLSAgICAvKiogRGVjb21wb3NlIHRoZSBjdXJyZW50IHN0cmluZyBhcyBhIHBhdGggYW5kIGEgZmlsZS4KLSAgICAgICAgRm9yIGluc3RhbmNlOiAiZGlyMS9kaXIyL2ZpbGUuZXh0IiBsZWFkcyB0byBwYXRoPSJkaXIxL2RpcjIvIiBhbmQgZmlsZW5hbWU9ImZpbGUuZXh0IgotICAgICovCi0gICAgdm9pZCBkZWNvbXBvc2VQYXRoQW5kRmlsZShCdGxTdHJpbmcmIHBhdGgsIEJ0bFN0cmluZyYgZmlsZW5hbWUpIGNvbnN0Ci0gICAgewotICAgICAgICBzdGQ6OnZlY3RvcjxCdGxTdHJpbmc+IGVsZW1lbnRzID0gdGhpcy0+c3BsaXQoIi9cXCIpOwotICAgICAgICBwYXRoID0gIiI7Ci0gICAgICAgIGZpbGVuYW1lID0gZWxlbWVudHMuYmFjaygpOwotICAgICAgICBlbGVtZW50cy5wb3BfYmFjaygpOwotICAgICAgICBpZiAodGhpcy0+YXQoMCk9PScvJykKLSAgICAgICAgICAgIHBhdGggPSAiLyI7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaW50IGk9MCA7IGk8ZWxlbWVudHMuc2l6ZSgpIDsgKytpKQotICAgICAgICAgICAgcGF0aCArPSBlbGVtZW50c1tpXSArICIvIjsKLSAgICB9CisgIC8qKiBEZWNvbXBvc2UgdGhlIGN1cnJlbnQgc3RyaW5nIGFzIGEgcGF0aCBhbmQgYSBmaWxlLgorICAgICAgRm9yIGluc3RhbmNlOiAiZGlyMS9kaXIyL2ZpbGUuZXh0IiBsZWFkcyB0byBwYXRoPSJkaXIxL2RpcjIvIiBhbmQgZmlsZW5hbWU9ImZpbGUuZXh0IgorICAqLworICB2b2lkIGRlY29tcG9zZVBhdGhBbmRGaWxlKEJ0bFN0cmluZyYgcGF0aCwgQnRsU3RyaW5nJiBmaWxlbmFtZSkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPEJ0bFN0cmluZz4gZWxlbWVudHMgPSB0aGlzLT5zcGxpdCgiL1xcIik7CisgICAgcGF0aCA9ICIiOworICAgIGZpbGVuYW1lID0gZWxlbWVudHMuYmFjaygpOworICAgIGVsZW1lbnRzLnBvcF9iYWNrKCk7CisgICAgaWYgKHRoaXMtPmF0KDApID09ICcvJykgcGF0aCA9ICIvIjsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgKytpKSBwYXRoICs9IGVsZW1lbnRzW2ldICsgIi8iOworICB9CiB9OwogCi1jbGFzcyBCdGxDb25maWcKLXsKLXB1YmxpYzoKLSAgQnRsQ29uZmlnKCkKLSAgICA6IG92ZXJ3cml0ZVJlc3VsdHMoZmFsc2UpLCBjaGVja1Jlc3VsdHModHJ1ZSksIHJlYWxjbG9jayhmYWxzZSksIHRyaWVzKERFRkFVTFRfTkJfVFJJRVMpCi0gIHsKLSAgICBjaGFyICogX2NvbmZpZzsKLSAgICBfY29uZmlnID0gZ2V0ZW52ICgiQlRMX0NPTkZJRyIpOwotICAgIGlmIChfY29uZmlnIT1OVUxMKQotICAgIHsKK2NsYXNzIEJ0bENvbmZpZyB7CisgcHVibGljOgorICBCdGxDb25maWcoKSA6IG92ZXJ3cml0ZVJlc3VsdHMoZmFsc2UpLCBjaGVja1Jlc3VsdHModHJ1ZSksIHJlYWxjbG9jayhmYWxzZSksIHRyaWVzKERFRkFVTFRfTkJfVFJJRVMpIHsKKyAgICBjaGFyKiBfY29uZmlnOworICAgIF9jb25maWcgPSBnZXRlbnYoIkJUTF9DT05GSUciKTsKKyAgICBpZiAoX2NvbmZpZyAhPSBOVUxMKSB7CiAgICAgICBzdGQ6OnZlY3RvcjxCdGxTdHJpbmc+IGNvbmZpZyA9IEJ0bFN0cmluZyhfY29uZmlnKS5zcGxpdCgiIFx0XG4iKTsKLSAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpPGNvbmZpZy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGNvbmZpZ1tpXS5iZWdpbnNXaXRoKCItYSIpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGkrMT09Y29uZmlnLnNpemUoKSkKLSAgICAgICAgICB7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvbmZpZy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoY29uZmlnW2ldLmJlZ2luc1dpdGgoIi1hIikpIHsKKyAgICAgICAgICBpZiAoaSArIDEgPT0gY29uZmlnLnNpemUoKSkgewogICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJlcnJvciBwcm9jZXNzaW5nIG9wdGlvbjogIiA8PCBjb25maWdbaV0gPDwgIlxuIjsKICAgICAgICAgICAgIGV4aXQoMik7CiAgICAgICAgICAgfQotICAgICAgICAgIEluc3RhbmNlLm1fc2VsZWN0ZWRBY3Rpb25OYW1lcyA9IGNvbmZpZ1tpKzFdLnNwbGl0KCI6Iik7CisgICAgICAgICAgSW5zdGFuY2UubV9zZWxlY3RlZEFjdGlvbk5hbWVzID0gY29uZmlnW2kgKyAxXS5zcGxpdCgiOiIpOwogCiAgICAgICAgICAgaSArPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbmZpZ1tpXS5iZWdpbnNXaXRoKCItdCIpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGkrMT09Y29uZmlnLnNpemUoKSkKLSAgICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnW2ldLmJlZ2luc1dpdGgoIi10IikpIHsKKyAgICAgICAgICBpZiAoaSArIDEgPT0gY29uZmlnLnNpemUoKSkgewogICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJlcnJvciBwcm9jZXNzaW5nIG9wdGlvbjogIiA8PCBjb25maWdbaV0gPDwgIlxuIjsKICAgICAgICAgICAgIGV4aXQoMik7CiAgICAgICAgICAgfQotICAgICAgICAgIEluc3RhbmNlLnRyaWVzID0gYXRvaShjb25maWdbaSsxXS5jX3N0cigpKTsKKyAgICAgICAgICBJbnN0YW5jZS50cmllcyA9IGF0b2koY29uZmlnW2kgKyAxXS5jX3N0cigpKTsKIAogICAgICAgICAgIGkgKz0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb25maWdbaV0uYmVnaW5zV2l0aCgiLS1vdmVyd3JpdGUiKSkKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZ1tpXS5iZWdpbnNXaXRoKCItLW92ZXJ3cml0ZSIpKSB7CiAgICAgICAgICAgSW5zdGFuY2Uub3ZlcndyaXRlUmVzdWx0cyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29uZmlnW2ldLmJlZ2luc1dpdGgoIi0tbm9jaGVjayIpKQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnW2ldLmJlZ2luc1dpdGgoIi0tbm9jaGVjayIpKSB7CiAgICAgICAgICAgSW5zdGFuY2UuY2hlY2tSZXN1bHRzID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29uZmlnW2ldLmJlZ2luc1dpdGgoIi0tcmVhbCIpKQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnW2ldLmJlZ2luc1dpdGgoIi0tcmVhbCIpKSB7CiAgICAgICAgICAgSW5zdGFuY2UucmVhbGNsb2NrID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgfQpAQCAtMjEzLDE1ICsxODAsMTIgQEAKICAgICBCVExfRElTQUJMRV9TU0VfRVhDRVBUSU9OUygpOwogICB9CiAKLSAgQlRMX0RPTlRfSU5MSU5FIHN0YXRpYyBib29sIHNraXBBY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lKQotICB7Ci0gICAgaWYgKEluc3RhbmNlLm1fc2VsZWN0ZWRBY3Rpb25OYW1lcy5lbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOworICBCVExfRE9OVF9JTkxJTkUgc3RhdGljIGJvb2wgc2tpcEFjdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgX25hbWUpIHsKKyAgICBpZiAoSW5zdGFuY2UubV9zZWxlY3RlZEFjdGlvbk5hbWVzLmVtcHR5KCkpIHJldHVybiBmYWxzZTsKIAogICAgIEJ0bFN0cmluZyBuYW1lKF9uYW1lKTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpPTA7IGk8SW5zdGFuY2UubV9zZWxlY3RlZEFjdGlvbk5hbWVzLnNpemUoKTsgKytpKQotICAgICAgaWYgKG5hbWUuY29udGFpbnMoSW5zdGFuY2UubV9zZWxlY3RlZEFjdGlvbk5hbWVzW2ldKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgSW5zdGFuY2UubV9zZWxlY3RlZEFjdGlvbk5hbWVzLnNpemUoKTsgKytpKQorICAgICAgaWYgKG5hbWUuY29udGFpbnMoSW5zdGFuY2UubV9zZWxlY3RlZEFjdGlvbk5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTIzMiwxMSArMTk2LDEwIEBACiAgIGJvb2wgcmVhbGNsb2NrOwogICBpbnQgdHJpZXM7CiAKLXByb3RlY3RlZDoKKyBwcm90ZWN0ZWQ6CiAgIHN0ZDo6dmVjdG9yPEJ0bFN0cmluZz4gbV9zZWxlY3RlZEFjdGlvbk5hbWVzOwogfTsKIAotI2RlZmluZSBCVExfTUFJTiBcCi0gIEJ0bENvbmZpZyBCdGxDb25maWc6Okluc3RhbmNlCisjZGVmaW5lIEJUTF9NQUlOIEJ0bENvbmZpZyBCdGxDb25maWc6Okluc3RhbmNlCiAKLSNlbmRpZiAvLyBCVExfSEgKKyNlbmRpZiAgLy8gQlRMX0hICmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfZnVuY3Rpb24uaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfZnVuY3Rpb24uaGgKaW5kZXggZTQ2N2NiNi4uNzQwZmZlMiAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X2Z1bmN0aW9uLmhoCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2luaXQvaW5pdF9mdW5jdGlvbi5oaApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIGluaXRfZnVuY3Rpb24uaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE4IENFU1QgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDM5ICsxNiwyMCBAQAogLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLS8vIAorLy8KICNpZm5kZWYgSU5JVF9GVU5DVElPTl9ISAogI2RlZmluZSBJTklUX0ZVTkNUSU9OX0hICiAKLWRvdWJsZSBzaW1wbGVfZnVuY3Rpb24oaW50IGluZGV4KQotewotICByZXR1cm4gaW5kZXg7Ci19Citkb3VibGUgc2ltcGxlX2Z1bmN0aW9uKGludCBpbmRleCkgeyByZXR1cm4gaW5kZXg7IH0KIAotZG91YmxlIHNpbXBsZV9mdW5jdGlvbihpbnQgaW5kZXhfaSwgaW50IGluZGV4X2opCi17Ci0gIHJldHVybiBpbmRleF9pK2luZGV4X2o7Ci19Citkb3VibGUgc2ltcGxlX2Z1bmN0aW9uKGludCBpbmRleF9pLCBpbnQgaW5kZXhfaikgeyByZXR1cm4gaW5kZXhfaSArIGluZGV4X2o7IH0KIAotZG91YmxlIHBzZXVkb19yYW5kb20oaW50IC8qaW5kZXgqLykKLXsKLSAgcmV0dXJuIHN0ZDo6cmFuZCgpL2RvdWJsZShSQU5EX01BWCk7Ci19Citkb3VibGUgcHNldWRvX3JhbmRvbShpbnQgLyppbmRleCovKSB7IHJldHVybiBzdGQ6OnJhbmQoKSAvIGRvdWJsZShSQU5EX01BWCk7IH0KIAotZG91YmxlIHBzZXVkb19yYW5kb20oaW50IC8qaW5kZXhfaSovLCBpbnQgLyppbmRleF9qKi8pCi17Ci0gIHJldHVybiBzdGQ6OnJhbmQoKS9kb3VibGUoUkFORF9NQVgpOwotfQorZG91YmxlIHBzZXVkb19yYW5kb20oaW50IC8qaW5kZXhfaSovLCBpbnQgLyppbmRleF9qKi8pIHsgcmV0dXJuIHN0ZDo6cmFuZCgpIC8gZG91YmxlKFJBTkRfTUFYKTsgfQogCitkb3VibGUgbnVsbF9mdW5jdGlvbihpbnQgLyppbmRleCovKSB7IHJldHVybiAwLjA7IH0KIAotZG91YmxlIG51bGxfZnVuY3Rpb24oaW50IC8qaW5kZXgqLykKLXsKLSAgcmV0dXJuIDAuMDsKLX0KLQotZG91YmxlIG51bGxfZnVuY3Rpb24oaW50IC8qaW5kZXhfaSovLCBpbnQgLyppbmRleF9qKi8pCi17Ci0gIHJldHVybiAwLjA7Ci19Citkb3VibGUgbnVsbF9mdW5jdGlvbihpbnQgLyppbmRleF9pKi8sIGludCAvKmluZGV4X2oqLykgeyByZXR1cm4gMC4wOyB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X21hdHJpeC5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2luaXQvaW5pdF9tYXRyaXguaGgKaW5kZXggNjM4MmQzMC4uMWE0YWE1ZCAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X21hdHJpeC5oaAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfbWF0cml4LmhoCkBAIC0yNCwzOCArMjQsMzUgQEAKIC8vICAgICAgICAgICAgcmVzaXplKCkgbWV0aG9kCiAvLyAgICAgICAgICAgIFtdIG9wZXJhdG9yIGZvciBzZXR0aW5nIGVsZW1lbnQKIC8vICAgICAgICAgICAgdmFsdWVfdHlwZSBkZWZpbmVkCi10ZW1wbGF0ZTxkb3VibGUgaW5pdF9mdW5jdGlvbihpbnQsaW50KSwgY2xhc3MgVmVjdG9yPgotQlRMX0RPTlRfSU5MSU5FIHZvaWQgaW5pdF9yb3coVmVjdG9yICYgWCwgaW50IHNpemUsIGludCByb3cpewotCit0ZW1wbGF0ZSA8ZG91YmxlIGluaXRfZnVuY3Rpb24oaW50LCBpbnQpLCBjbGFzcyBWZWN0b3I+CitCVExfRE9OVF9JTkxJTkUgdm9pZCBpbml0X3JvdyhWZWN0b3ImIFgsIGludCBzaXplLCBpbnQgcm93KSB7CiAgIFgucmVzaXplKHNpemUpOwogCi0gIGZvciAodW5zaWduZWQgaW50IGo9MDtqPFguc2l6ZSgpO2orKyl7Ci0gICAgWFtqXT10eXBlbmFtZSBWZWN0b3I6OnZhbHVlX3R5cGUoaW5pdF9mdW5jdGlvbihyb3csaikpOworICBmb3IgKHVuc2lnbmVkIGludCBqID0gMDsgaiA8IFguc2l6ZSgpOyBqKyspIHsKKyAgICBYW2pdID0gdHlwZW5hbWUgVmVjdG9yOjp2YWx1ZV90eXBlKGluaXRfZnVuY3Rpb24ocm93LCBqKSk7CiAgIH0KIH0KIAotCiAvLyBNYXRyaXggaXMgYSBWZWN0b3Igb2YgVmVjdG9yCiAvLyBUaGUgTWF0cml4IGNsYXNzIG11c3Qgc2F0aXNmeSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgU1RMIHZlY3RvciBjb25jZXB0IDoKIC8vICAgICAgICAgICAgcmVzaXplKCkgbWV0aG9kCiAvLyAgICAgICAgICAgIFtdIG9wZXJhdG9yIGZvciBzZXR0aW5nIHJvd3MKLXRlbXBsYXRlPGRvdWJsZSBpbml0X2Z1bmN0aW9uKGludCxpbnQpLGNsYXNzIFZlY3Rvcj4KLUJUTF9ET05UX0lOTElORSB2b2lkIGluaXRfbWF0cml4KFZlY3RvciAmICBBLCBpbnQgc2l6ZSl7Cit0ZW1wbGF0ZSA8ZG91YmxlIGluaXRfZnVuY3Rpb24oaW50LCBpbnQpLCBjbGFzcyBWZWN0b3I+CitCVExfRE9OVF9JTkxJTkUgdm9pZCBpbml0X21hdHJpeChWZWN0b3ImIEEsIGludCBzaXplKSB7CiAgIEEucmVzaXplKHNpemUpOwotICBmb3IgKHVuc2lnbmVkIGludCByb3c9MDsgcm93PEEuc2l6ZSgpIDsgcm93KyspewotICAgIGluaXRfcm93PGluaXRfZnVuY3Rpb24+KEFbcm93XSxzaXplLHJvdyk7CisgIGZvciAodW5zaWduZWQgaW50IHJvdyA9IDA7IHJvdyA8IEEuc2l6ZSgpOyByb3crKykgeworICAgIGluaXRfcm93PGluaXRfZnVuY3Rpb24+KEFbcm93XSwgc2l6ZSwgcm93KTsKICAgfQogfQogCi10ZW1wbGF0ZTxkb3VibGUgaW5pdF9mdW5jdGlvbihpbnQsaW50KSxjbGFzcyBNYXRyaXg+Ci1CVExfRE9OVF9JTkxJTkUgdm9pZCBpbml0X21hdHJpeF9zeW1tKE1hdHJpeCYgIEEsIGludCBzaXplKXsKK3RlbXBsYXRlIDxkb3VibGUgaW5pdF9mdW5jdGlvbihpbnQsIGludCksIGNsYXNzIE1hdHJpeD4KK0JUTF9ET05UX0lOTElORSB2b2lkIGluaXRfbWF0cml4X3N5bW0oTWF0cml4JiBBLCBpbnQgc2l6ZSkgewogICBBLnJlc2l6ZShzaXplKTsKLSAgZm9yICh1bnNpZ25lZCBpbnQgcm93PTA7IHJvdzxBLnNpemUoKSA7IHJvdysrKQotICAgIEFbcm93XS5yZXNpemUoc2l6ZSk7Ci0gIGZvciAodW5zaWduZWQgaW50IHJvdz0wOyByb3c8QS5zaXplKCkgOyByb3crKyl7Ci0gICAgQVtyb3ddW3Jvd10gPSBpbml0X2Z1bmN0aW9uKHJvdyxyb3cpOwotICAgIGZvciAodW5zaWduZWQgaW50IGNvbD0wOyBjb2w8cm93IDsgY29sKyspewotICAgICAgZG91YmxlIHggPSBpbml0X2Z1bmN0aW9uKHJvdyxjb2wpOworICBmb3IgKHVuc2lnbmVkIGludCByb3cgPSAwOyByb3cgPCBBLnNpemUoKTsgcm93KyspIEFbcm93XS5yZXNpemUoc2l6ZSk7CisgIGZvciAodW5zaWduZWQgaW50IHJvdyA9IDA7IHJvdyA8IEEuc2l6ZSgpOyByb3crKykgeworICAgIEFbcm93XVtyb3ddID0gaW5pdF9mdW5jdGlvbihyb3csIHJvdyk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgY29sID0gMDsgY29sIDwgcm93OyBjb2wrKykgeworICAgICAgZG91YmxlIHggPSBpbml0X2Z1bmN0aW9uKHJvdywgY29sKTsKICAgICAgIEFbcm93XVtjb2xdID0gQVtjb2xdW3Jvd10gPSB4OwogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X3ZlY3Rvci5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL2luaXQvaW5pdF92ZWN0b3IuaGgKaW5kZXggNTE4ZTg3ZC4uZDQ1NzZhNCAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X3ZlY3Rvci5oaAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfdmVjdG9yLmhoCkBAIC0yNCwxMyArMjQsMTIgQEAKIC8vICAgICAgICAgICAgcmVzaXplKCkgbWV0aG9kCiAvLyAgICAgICAgICAgIFtdIG9wZXJhdG9yIGZvciBzZXR0aW5nIGVsZW1lbnQKIC8vICAgICAgICAgICAgdmFsdWVfdHlwZSBkZWZpbmVkCi10ZW1wbGF0ZTxkb3VibGUgaW5pdF9mdW5jdGlvbihpbnQpLCBjbGFzcyBWZWN0b3I+Ci12b2lkIGluaXRfdmVjdG9yKFZlY3RvciAmIFgsIGludCBzaXplKXsKLQordGVtcGxhdGUgPGRvdWJsZSBpbml0X2Z1bmN0aW9uKGludCksIGNsYXNzIFZlY3Rvcj4KK3ZvaWQgaW5pdF92ZWN0b3IoVmVjdG9yJiBYLCBpbnQgc2l6ZSkgewogICBYLnJlc2l6ZShzaXplKTsKIAotICBmb3IgKHVuc2lnbmVkIGludCBpPTA7aTxYLnNpemUoKTtpKyspewotICAgIFhbaV09dHlwZW5hbWUgVmVjdG9yOjp2YWx1ZV90eXBlKGluaXRfZnVuY3Rpb24oaSkpOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IFguc2l6ZSgpOyBpKyspIHsKKyAgICBYW2ldID0gdHlwZW5hbWUgVmVjdG9yOjp2YWx1ZV90eXBlKGluaXRfZnVuY3Rpb24oaSkpOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9iZW5jaF9zdGF0aWMuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9zdGF0aWMvYmVuY2hfc3RhdGljLmhoCmluZGV4IDIzYjU1ZWMuLjljMmFiMjIgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9iZW5jaF9zdGF0aWMuaGgKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvc3RhdGljL2JlbmNoX3N0YXRpYy5oaApAQCAtMzIsMTQgKzMyLDExIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIFBlcmZfQW5hbHl6ZXIsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgQWN0aW9uLCB0ZW1wbGF0ZSA8Y2xhc3MsIGludD4gY2xhc3MgSW50ZXJmYWNlPgorQlRMX0RPTlRfSU5MSU5FIHZvaWQgYmVuY2hfc3RhdGljKHZvaWQpIHsKKyAgaWYgKEJ0bENvbmZpZzo6c2tpcEFjdGlvbihBY3Rpb248SW50ZXJmYWNlPFJFQUxfVFlQRSwgMTA+ID46Om5hbWUoKSkpIHJldHVybjsKIAotdGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBQZXJmX0FuYWx5emVyLCB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgQWN0aW9uLCB0ZW1wbGF0ZTxjbGFzcyxpbnQ+IGNsYXNzIEludGVyZmFjZT4KLUJUTF9ET05UX0lOTElORSAgdm9pZCBiZW5jaF9zdGF0aWModm9pZCkKLXsKLSAgaWYgKEJ0bENvbmZpZzo6c2tpcEFjdGlvbihBY3Rpb248SW50ZXJmYWNlPFJFQUxfVFlQRSwxMD4gPjo6bmFtZSgpKSkKLSAgICByZXR1cm47Ci0KLSAgc3RyaW5nIGZpbGVuYW1lID0gImJlbmNoXyIgKyBBY3Rpb248SW50ZXJmYWNlPFJFQUxfVFlQRSwxMD4gPjo6bmFtZSgpICsgIi5kYXQiOworICBzdHJpbmcgZmlsZW5hbWUgPSAiYmVuY2hfIiArIEFjdGlvbjxJbnRlcmZhY2U8UkVBTF9UWVBFLCAxMD4gPjo6bmFtZSgpICsgIi5kYXQiOwogCiAgIElORk9TKCJzdGFydGluZyAiIDw8IGZpbGVuYW1lKTsKIApAQCAtNDgsMzMgKzQ1LDE3IEBACiAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdGFiX21mbG9wczsKICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiB0YWJfc2l6ZXM7CiAKLSAgc3RhdGljX3NpemVfZ2VuZXJhdG9yPG1heF9zaXplLFBlcmZfQW5hbHl6ZXIsQWN0aW9uLEludGVyZmFjZT46OmdvKHRhYl9zaXplcyx0YWJfbWZsb3BzKTsKKyAgc3RhdGljX3NpemVfZ2VuZXJhdG9yPG1heF9zaXplLCBQZXJmX0FuYWx5emVyLCBBY3Rpb24sIEludGVyZmFjZT46OmdvKHRhYl9zaXplcywgdGFiX21mbG9wcyk7CiAKLSAgZHVtcF94eV9maWxlKHRhYl9zaXplcyx0YWJfbWZsb3BzLGZpbGVuYW1lKTsKKyAgZHVtcF94eV9maWxlKHRhYl9zaXplcywgdGFiX21mbG9wcywgZmlsZW5hbWUpOwogfQogCiAvLyBkZWZhdWx0IFBlcmYgQW5hbHl6ZXIKLXRlbXBsYXRlIDx0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgQWN0aW9uLCB0ZW1wbGF0ZTxjbGFzcyxpbnQ+IGNsYXNzIEludGVyZmFjZT4KLUJUTF9ET05UX0lOTElORSAgdm9pZCBiZW5jaF9zdGF0aWModm9pZCkKLXsKLSAgYmVuY2hfc3RhdGljPFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIsQWN0aW9uLEludGVyZmFjZT4oKTsKLSAgLy9iZW5jaF9zdGF0aWM8TWl4ZWRfUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlPigpOwotICAvL2JlbmNoX3N0YXRpYzxYODZfUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlPigpOwordGVtcGxhdGUgPHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgQWN0aW9uLCB0ZW1wbGF0ZSA8Y2xhc3MsIGludD4gY2xhc3MgSW50ZXJmYWNlPgorQlRMX0RPTlRfSU5MSU5FIHZvaWQgYmVuY2hfc3RhdGljKHZvaWQpIHsKKyAgYmVuY2hfc3RhdGljPFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIsIEFjdGlvbiwgSW50ZXJmYWNlPigpOworICAvLyBiZW5jaF9zdGF0aWM8TWl4ZWRfUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlPigpOworICAvLyBiZW5jaF9zdGF0aWM8WDg2X1BlcmZfQW5hbHl6ZXIsQWN0aW9uLEludGVyZmFjZT4oKTsKIH0KIAogI2VuZGlmCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9zdGF0aWMvaW50ZWxfYmVuY2hfZml4ZWRfc2l6ZS5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9pbnRlbF9iZW5jaF9maXhlZF9zaXplLmhoCmluZGV4IGI0ZWRjYmMuLjNkYTRiMmYgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9pbnRlbF9iZW5jaF9maXhlZF9zaXplLmhoCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9pbnRlbF9iZW5jaF9maXhlZF9zaXplLmhoCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgaW50ZWxfYmVuY2hfZml4ZWRfc2l6ZS5oaAotLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KIC8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIG1hciBk6WMgMyAxODo1OTozNyBDRVQgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDcgKzE2LDcgQEAKIC8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0vLyAKKy8vCiAjaWZuZGVmIF9CRU5DSF9GSVhFRF9TSVpFX0hIXwogI2RlZmluZSBfQkVOQ0hfRklYRURfU0laRV9ISF8KIApAQCAtMjQsNDMgKzI0LDM3IEBACiAjaW5jbHVkZSAiZnVuY3Rpb25fdGltZS5oaCIKIAogdGVtcGxhdGUgPGNsYXNzIEFjdGlvbj4KLWRvdWJsZSBiZW5jaF9maXhlZF9zaXplKGludCBzaXplLCB1bnNpZ25lZCBsb25nIGxvbmcgICYgbmJfY2FsYyx1bnNpZ25lZCBsb25nIGxvbmcgJiBuYl9pbml0KQotewotICAKK2RvdWJsZSBiZW5jaF9maXhlZF9zaXplKGludCBzaXplLCB1bnNpZ25lZCBsb25nIGxvbmcmIG5iX2NhbGMsIHVuc2lnbmVkIGxvbmcgbG9uZyYgbmJfaW5pdCkgewogICBBY3Rpb24gYWN0aW9uKHNpemUpOwotICAKLSAgZG91YmxlIHRpbWVfYmFzZWxpbmU9dGltZV9pbml0KG5iX2luaXQsYWN0aW9uKTsKKworICBkb3VibGUgdGltZV9iYXNlbGluZSA9IHRpbWVfaW5pdChuYl9pbml0LCBhY3Rpb24pOwogCiAgIHdoaWxlICh0aW1lX2Jhc2VsaW5lIDwgTUlOX1RJTUUpIHsKLQotICAgIC8vSU5GT1MoIm5iX2luaXQ9Ijw8bmJfaW5pdCk7Ci0gICAgLy9JTkZPUygidGltZV9iYXNlbGluZT0iPDx0aW1lX2Jhc2VsaW5lKTsKLSAgICBuYl9pbml0Kj0yOwotICAgIHRpbWVfYmFzZWxpbmU9dGltZV9pbml0KG5iX2luaXQsYWN0aW9uKTsKKyAgICAvLyBJTkZPUygibmJfaW5pdD0iPDxuYl9pbml0KTsKKyAgICAvLyBJTkZPUygidGltZV9iYXNlbGluZT0iPDx0aW1lX2Jhc2VsaW5lKTsKKyAgICBuYl9pbml0ICo9IDI7CisgICAgdGltZV9iYXNlbGluZSA9IHRpbWVfaW5pdChuYl9pbml0LCBhY3Rpb24pOwogICB9Ci0gIAotICB0aW1lX2Jhc2VsaW5lPXRpbWVfYmFzZWxpbmUvKGRvdWJsZShuYl9pbml0KSk7Ci0gIAotICBkb3VibGUgdGltZV9hY3Rpb249dGltZV9jYWxjdWxhdGUobmJfY2FsYyxhY3Rpb24pOwotICAKKworICB0aW1lX2Jhc2VsaW5lID0gdGltZV9iYXNlbGluZSAvIChkb3VibGUobmJfaW5pdCkpOworCisgIGRvdWJsZSB0aW1lX2FjdGlvbiA9IHRpbWVfY2FsY3VsYXRlKG5iX2NhbGMsIGFjdGlvbik7CisKICAgd2hpbGUgKHRpbWVfYWN0aW9uIDwgTUlOX1RJTUUpIHsKLSAgICAKLSAgICBuYl9jYWxjKj0yOwotICAgIHRpbWVfYWN0aW9uPXRpbWVfY2FsY3VsYXRlKG5iX2NhbGMsYWN0aW9uKTsKKyAgICBuYl9jYWxjICo9IDI7CisgICAgdGltZV9hY3Rpb24gPSB0aW1lX2NhbGN1bGF0ZShuYl9jYWxjLCBhY3Rpb24pOwogICB9CiAKLSAgSU5GT1MoIm5iX2luaXQ9Ijw8bmJfaW5pdCk7Ci0gIElORk9TKCJuYl9jYWxjPSI8PG5iX2NhbGMpOwotICAKLSAgCi0gIHRpbWVfYWN0aW9uPXRpbWVfYWN0aW9uLyhkb3VibGUobmJfY2FsYykpOwotICAKKyAgSU5GT1MoIm5iX2luaXQ9IiA8PCBuYl9pbml0KTsKKyAgSU5GT1MoIm5iX2NhbGM9IiA8PCBuYl9jYWxjKTsKKworICB0aW1lX2FjdGlvbiA9IHRpbWVfYWN0aW9uIC8gKGRvdWJsZShuYl9jYWxjKSk7CisKICAgYWN0aW9uLmNoZWNrX3Jlc3VsdCgpOwotICAKLSAgdGltZV9hY3Rpb249dGltZV9hY3Rpb24tdGltZV9iYXNlbGluZTsKIAotICByZXR1cm4gYWN0aW9uLm5iX29wX2Jhc2UoKS8odGltZV9hY3Rpb24qMTAwMDAwMC4wKTsKKyAgdGltZV9hY3Rpb24gPSB0aW1lX2FjdGlvbiAtIHRpbWVfYmFzZWxpbmU7CiAKKyAgcmV0dXJuIGFjdGlvbi5uYl9vcF9iYXNlKCkgLyAodGltZV9hY3Rpb24gKiAxMDAwMDAwLjApOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9zdGF0aWNfc2l6ZV9nZW5lcmF0b3IuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC9zdGF0aWMvc3RhdGljX3NpemVfZ2VuZXJhdG9yLmhoCmluZGV4IGRkMDJkZjMuLjgwY2VkNDkgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3N0YXRpYy9zdGF0aWNfc2l6ZV9nZW5lcmF0b3IuaGgKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvc3RhdGljL3N0YXRpY19zaXplX2dlbmVyYXRvci5oaApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIHN0YXRpY19zaXplX2dlbmVyYXRvci5oaAotLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KIC8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIG1hciBk6WMgMyAxODo1OTozNiBDRVQgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDQyICsxNiwzNyBAQAogLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLS8vIAorLy8KICNpZm5kZWYgX1NUQVRJQ19TSVpFX0dFTkVSQVRPUl9ISAogI2RlZmluZSBfU1RBVElDX1NJWkVfR0VORVJBVE9SX0hICiAjaW5jbHVkZSA8dmVjdG9yPgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi0vL3JlY3Vyc2l2ZSBnZW5lcmF0aW9uIG9mIHN0YXRpY2FsbHkgZGVmaW5lZCBtYXRyaXggYW5kIHZlY3RvciBzaXplcworLy8gcmVjdXJzaXZlIGdlbmVyYXRpb24gb2Ygc3RhdGljYWxseSBkZWZpbmVkIG1hdHJpeCBhbmQgdmVjdG9yIHNpemVzCiAKLXRlbXBsYXRlIDxpbnQgU0laRSx0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgUGVyZl9BbmFseXplciwgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIEFjdGlvbiwgdGVtcGxhdGU8Y2xhc3MsaW50PiBjbGFzcyBJbnRlcmZhY2U+IAotc3RydWN0IHN0YXRpY19zaXplX2dlbmVyYXRvcnsKLSAgc3RhdGljIHZvaWQgZ28odmVjdG9yPGRvdWJsZT4gJiB0YWJfc2l6ZXMsIHZlY3Rvcjxkb3VibGU+ICYgdGFiX21mbG9wcykKLSAgewordGVtcGxhdGUgPGludCBTSVpFLCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIFBlcmZfQW5hbHl6ZXIsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgQWN0aW9uLAorICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcywgaW50PiBjbGFzcyBJbnRlcmZhY2U+CitzdHJ1Y3Qgc3RhdGljX3NpemVfZ2VuZXJhdG9yIHsKKyAgc3RhdGljIHZvaWQgZ28odmVjdG9yPGRvdWJsZT4mIHRhYl9zaXplcywgdmVjdG9yPGRvdWJsZT4mIHRhYl9tZmxvcHMpIHsKICAgICB0YWJfc2l6ZXMucHVzaF9iYWNrKFNJWkUpOwogICAgIHN0ZDo6Y291dCA8PCB0YWJfc2l6ZXMuYmFjaygpIDw8ICIgXHQiIDw8IHN0ZDo6Zmx1c2g7Ci0gICAgUGVyZl9BbmFseXplcjxBY3Rpb248SW50ZXJmYWNlPFJFQUxfVFlQRSxTSVpFPiA+ID4gcGVyZl9hY3Rpb247CisgICAgUGVyZl9BbmFseXplcjxBY3Rpb248SW50ZXJmYWNlPFJFQUxfVFlQRSwgU0laRT4gPiA+IHBlcmZfYWN0aW9uOwogICAgIHRhYl9tZmxvcHMucHVzaF9iYWNrKHBlcmZfYWN0aW9uLmV2YWxfbWZsb3BzKFNJWkUpKTsKICAgICBzdGQ6OmNvdXQgPDwgdGFiX21mbG9wcy5iYWNrKCkgPDwgIiBNRmxvcHMiIDw8IHN0ZDo6ZW5kbDsKLSAgICBzdGF0aWNfc2l6ZV9nZW5lcmF0b3I8U0laRS0xLFBlcmZfQW5hbHl6ZXIsQWN0aW9uLEludGVyZmFjZT46OmdvKHRhYl9zaXplcyx0YWJfbWZsb3BzKTsKKyAgICBzdGF0aWNfc2l6ZV9nZW5lcmF0b3I8U0laRSAtIDEsIFBlcmZfQW5hbHl6ZXIsIEFjdGlvbiwgSW50ZXJmYWNlPjo6Z28odGFiX3NpemVzLCB0YWJfbWZsb3BzKTsKICAgfTsKIH07CiAKLS8vcmVjdXJzaW9uIGVuZAorLy8gcmVjdXJzaW9uIGVuZAogCi10ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3M+IGNsYXNzIFBlcmZfQW5hbHl6ZXIsIHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBBY3Rpb24sIHRlbXBsYXRlPGNsYXNzLGludD4gY2xhc3MgSW50ZXJmYWNlPiAKLXN0cnVjdCBzdGF0aWNfc2l6ZV9nZW5lcmF0b3I8MSxQZXJmX0FuYWx5emVyLEFjdGlvbixJbnRlcmZhY2U+eyAgCi0gIHN0YXRpYyAgdm9pZCBnbyh2ZWN0b3I8ZG91YmxlPiAmIHRhYl9zaXplcywgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzKQotICB7Cit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBQZXJmX0FuYWx5emVyLCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEFjdGlvbiwgdGVtcGxhdGUgPGNsYXNzLCBpbnQ+IGNsYXNzIEludGVyZmFjZT4KK3N0cnVjdCBzdGF0aWNfc2l6ZV9nZW5lcmF0b3I8MSwgUGVyZl9BbmFseXplciwgQWN0aW9uLCBJbnRlcmZhY2U+IHsKKyAgc3RhdGljIHZvaWQgZ28odmVjdG9yPGRvdWJsZT4mIHRhYl9zaXplcywgdmVjdG9yPGRvdWJsZT4mIHRhYl9tZmxvcHMpIHsKICAgICB0YWJfc2l6ZXMucHVzaF9iYWNrKDEpOwotICAgIFBlcmZfQW5hbHl6ZXI8QWN0aW9uPEludGVyZmFjZTxSRUFMX1RZUEUsMT4gPiA+IHBlcmZfYWN0aW9uOworICAgIFBlcmZfQW5hbHl6ZXI8QWN0aW9uPEludGVyZmFjZTxSRUFMX1RZUEUsIDE+ID4gPiBwZXJmX2FjdGlvbjsKICAgICB0YWJfbWZsb3BzLnB1c2hfYmFjayhwZXJmX2FjdGlvbi5ldmFsX21mbG9wcygxKSk7CiAgIH07CiB9OwogCiAjZW5kaWYKLSAgCi0gIAotICAKLSAgCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvU1RMX3BlcmZfYW5hbHl6ZXIuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvU1RMX3BlcmZfYW5hbHl6ZXIuaGgKaW5kZXggYzlmODk0Yi4uNjgxNTQzNyAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL1NUTF9wZXJmX2FuYWx5emVyLmhoCisrKyBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9TVExfcGVyZl9hbmFseXplci5oaApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIFNUTF9wZXJmX2FuYWx5emVyLmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbWFyIGTpYyAzIDE4OjU5OjM1IENFVCAyMDAyCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKIC8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpAQCAtMTYsNDIgKzE2LDM1IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBfU1RMX1BFUkZfQU5BTFlTRVJfSEgKICNkZWZpbmUgX1NUTF9QRVJGX0FOQUxZU0VSX0hICiAKICNpbmNsdWRlICJTVExfdGltZXIuaGgiCiAjaW5jbHVkZSAiYmVuY2hfcGFyYW1ldGVyLmhoIgogCi10ZW1wbGF0ZTxjbGFzcyBBQ1RJT04+Ci1jbGFzcyBTVExfUGVyZl9BbmFseXplcnsKLXB1YmxpYzogIAotICBTVExfUGVyZl9BbmFseXplcih1bnNpZ25lZCBsb25nIGxvbmcgbmJfc2FtcGxlPURFRkFVTFRfTkJfU0FNUExFKTpfbmJfc2FtcGxlKG5iX3NhbXBsZSksX2Nocm9ub3MoKQotICB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQUNUSU9OPgorY2xhc3MgU1RMX1BlcmZfQW5hbHl6ZXIgeworIHB1YmxpYzoKKyAgU1RMX1BlcmZfQW5hbHl6ZXIodW5zaWduZWQgbG9uZyBsb25nIG5iX3NhbXBsZSA9IERFRkFVTFRfTkJfU0FNUExFKSA6IF9uYl9zYW1wbGUobmJfc2FtcGxlKSwgX2Nocm9ub3MoKSB7CiAgICAgTUVTU0FHRSgiU1RMX1BlcmZfQW5hbHl6ZXIgQ3RvciIpOwotICB9OyAKLSAgU1RMX1BlcmZfQW5hbHl6ZXIoIGNvbnN0IFNUTF9QZXJmX0FuYWx5emVyICYgKXsKKyAgfTsKKyAgU1RMX1BlcmZfQW5hbHl6ZXIoY29uc3QgU1RMX1BlcmZfQW5hbHl6ZXImKSB7CiAgICAgSU5GT1MoIkNvcHkgQ3RvciBub3QgaW1wbGVtZW50ZWQiKTsKICAgICBleGl0KDApOwogICB9OwotICB+U1RMX1BlcmZfQW5hbHl6ZXIoIHZvaWQgKXsKLSAgICBNRVNTQUdFKCJTVExfUGVyZl9BbmFseXplciBEdG9yIik7Ci0gIH07Ci0gIAotICAKLSAgaW5saW5lIGRvdWJsZSBldmFsX21mbG9wcyhpbnQgc2l6ZSkKLSAgeworICB+U1RMX1BlcmZfQW5hbHl6ZXIodm9pZCkgeyBNRVNTQUdFKCJTVExfUGVyZl9BbmFseXplciBEdG9yIik7IH07CiAKKyAgaW5saW5lIGRvdWJsZSBldmFsX21mbG9wcyhpbnQgc2l6ZSkgewogICAgIEFDVElPTiBhY3Rpb24oc2l6ZSk7CiAKICAgICBfY2hyb25vcy5zdGFydF9iYXNlbGluZShfbmJfc2FtcGxlKTsKLSAgICAgIAotICAgIGRvIHsKIAorICAgIGRvIHsKICAgICAgIGFjdGlvbi5pbml0aWFsaXplKCk7CiAgICAgfSB3aGlsZSAoX2Nocm9ub3MuY2hlY2soKSk7CiAKLSAgICBkb3VibGUgYmFzZWxpbmVfdGltZT1fY2hyb25vcy5nZXRfdGltZSgpOworICAgIGRvdWJsZSBiYXNlbGluZV90aW1lID0gX2Nocm9ub3MuZ2V0X3RpbWUoKTsKIAogICAgIF9jaHJvbm9zLnN0YXJ0KF9uYl9zYW1wbGUpOwogICAgIGRvIHsKQEAgLTU5LDI0ICs1MiwxOSBAQAogICAgICAgYWN0aW9uLmNhbGN1bGF0ZSgpOwogICAgIH0gd2hpbGUgKF9jaHJvbm9zLmNoZWNrKCkpOwogCi0gICAgZG91YmxlIGNhbGN1bGF0ZV90aW1lPV9jaHJvbm9zLmdldF90aW1lKCk7CisgICAgZG91YmxlIGNhbGN1bGF0ZV90aW1lID0gX2Nocm9ub3MuZ2V0X3RpbWUoKTsKIAotICAgIGRvdWJsZSBjb3JyZWN0ZWRfdGltZT1jYWxjdWxhdGVfdGltZS1iYXNlbGluZV90aW1lOwotICAgIAotICAgIC8vICAgIGNvdXQgPDwgc2l6ZSA8PCIgIjw8YmFzZWxpbmVfdGltZTw8IiAiPDxjYWxjdWxhdGVfdGltZTw8IiAiPDxjb3JyZWN0ZWRfdGltZTw8IiAiPDxhY3Rpb24ubmJfb3BfYmFzZSgpIDw8IGVuZGw7ICAgIAotICAgIAotICAgIHJldHVybiBhY3Rpb24ubmJfb3BfYmFzZSgpLyhjb3JyZWN0ZWRfdGltZSoxMDAwMDAwLjApOwotICAgIC8vcmV0dXJuIGFjdGlvbi5uYl9vcF9iYXNlKCkvKGNhbGN1bGF0ZV90aW1lKjEwMDAwMDAuMCk7Ci0gICAgCisgICAgZG91YmxlIGNvcnJlY3RlZF90aW1lID0gY2FsY3VsYXRlX3RpbWUgLSBiYXNlbGluZV90aW1lOworCisgICAgLy8gICAgY291dCA8PCBzaXplIDw8IiAiPDxiYXNlbGluZV90aW1lPDwiICI8PGNhbGN1bGF0ZV90aW1lPDwiICI8PGNvcnJlY3RlZF90aW1lPDwiICI8PGFjdGlvbi5uYl9vcF9iYXNlKCkgPDwgZW5kbDsKKworICAgIHJldHVybiBhY3Rpb24ubmJfb3BfYmFzZSgpIC8gKGNvcnJlY3RlZF90aW1lICogMTAwMDAwMC4wKTsKKyAgICAvLyByZXR1cm4gYWN0aW9uLm5iX29wX2Jhc2UoKS8oY2FsY3VsYXRlX3RpbWUqMTAwMDAwMC4wKTsKICAgfQotcHJpdmF0ZToKIAorIHByaXZhdGU6CiAgIFNUTF9UaW1lciBfY2hyb25vczsKICAgdW5zaWduZWQgbG9uZyBsb25nIF9uYl9zYW1wbGU7Ci0KLSAgCiB9OwogCi0gIAotICAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL1NUTF90aW1lci5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9TVExfdGltZXIuaGgKaW5kZXggMTljNTRlOS4uMjc0ZjkwMCAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL1NUTF90aW1lci5oaAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvU1RMX3RpbWVyLmhoCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgU1RMX1RpbWVyLmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbWFyIGTpYyAzIDE4OjU5OjM1IENFVCAyMDAyCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKIC8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpAQCAtMTYsNyArMTYsNyBAQAogLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLS8vIAorLy8KIC8vIFNUTCBUaW1lciBDbGFzcy4gQWRhcHRlZCAoTC5QLikgZnJvbSB0aGUgdGltZXIgY2xhc3MgYnkgTXVzc2VyIGV0IEFsCiAvLyBkZXNjcmliZWQgaW50IHRoZSBCb29rIDogU1RMIFR1dG9yaWFsIGFuZCByZWZlcmVuY2UgZ3VpZGUuCiAvLyBEZWZpbmUgYSB0aW1lciBjbGFzcyBmb3IgYW5hbHl6aW5nIGFsZ29yaXRobSBwZXJmb3JtYW5jZS4KQEAgLTI4LDEwICsyOCwxMCBAQAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogY2xhc3MgU1RMX1RpbWVyIHsKLXB1YmxpYzoKLSAgU1RMX1RpbWVyKCl7IGJhc2VsaW5lID0gZmFsc2U7IH07ICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgcHVibGljOgorICBTVExfVGltZXIoKSB7IGJhc2VsaW5lID0gZmFsc2U7IH07ICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCiAgIC8vIFN0YXJ0IGEgc2VyaWVzIG9mIHIgdHJpYWxzOgotICB2b2lkIHN0YXJ0KHVuc2lnbmVkIGludCByKXsKKyAgdm9pZCBzdGFydCh1bnNpZ25lZCBpbnQgcikgewogICAgIHJlcHMgPSByOwogICAgIGNvdW50ID0gMDsKICAgICBpdGVyYXRpb25zLmNsZWFyKCk7CkBAIC0zOSwzMCArMzksMjggQEAKICAgICBpbml0aWFsID0gdGltZSgwKTsKICAgfTsKICAgLy8gU3RhcnQgYSBzZXJpZXMgb2YgciB0cmlhbHMgdG8gZGV0ZXJtaW5lIGJhc2VsaW5lIHRpbWU6Ci0gIHZvaWQgc3RhcnRfYmFzZWxpbmUodW5zaWduZWQgaW50IHIpCi0gIHsKKyAgdm9pZCBzdGFydF9iYXNlbGluZSh1bnNpZ25lZCBpbnQgcikgewogICAgIGJhc2VsaW5lID0gdHJ1ZTsKICAgICBzdGFydChyKTsKICAgfQogICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRyaWFscyBoYXZlIGJlZW4gY29tcGxldGVkLCBlbHNlIGZhbHNlCi0gIGJvb2wgY2hlY2soKQotICB7CisgIGJvb2wgY2hlY2soKSB7CiAgICAgKytjb3VudDsKICAgICBmaW5hbCA9IHRpbWUoMCk7CiAgICAgaWYgKGluaXRpYWwgPCBmaW5hbCkgewotICAgICAgaXRlcmF0aW9ucy5wdXNoX2JhY2soY291bnQpOyAgCisgICAgICBpdGVyYXRpb25zLnB1c2hfYmFjayhjb3VudCk7CiAgICAgICBpbml0aWFsID0gZmluYWw7CiAgICAgICBjb3VudCA9IDA7CiAgICAgfQogICAgIHJldHVybiAoaXRlcmF0aW9ucy5zaXplKCkgPCByZXBzKTsKICAgfTsKICAgLy8gUmV0dXJucyB0aGUgcmVzdWx0cyBmb3IgZXh0ZXJuYWwgdXNlCi0gIGRvdWJsZSBnZXRfdGltZSggdm9pZCApCi0gIHsKKyAgZG91YmxlIGdldF90aW1lKHZvaWQpIHsKICAgICBzb3J0KGl0ZXJhdGlvbnMuYmVnaW4oKSwgaXRlcmF0aW9ucy5lbmQoKSk7Ci0gICAgcmV0dXJuIDEuMC9pdGVyYXRpb25zW3JlcHMvMl07CisgICAgcmV0dXJuIDEuMCAvIGl0ZXJhdGlvbnNbcmVwcyAvIDJdOwogICB9OwotcHJpdmF0ZToKKworIHByaXZhdGU6CiAgIHVuc2lnbmVkIGludCByZXBzOyAgLy8gTnVtYmVyIG9mIHRyaWFscwogICAvLyBGb3Igc3RvcmluZyBsb29wIGl0ZXJhdGlvbnMgb2YgYSB0cmlhbAogICB2ZWN0b3I8bG9uZz4gaXRlcmF0aW9uczsKQEAgLTcyLDcgKzcwLDYgQEAKICAgdW5zaWduZWQgbG9uZyBjb3VudDsKICAgLy8gdHJ1ZSBpZiB0aGlzIGlzIGEgYmFzZWxpbmUgY29tcHV0YXRpb24sIGZhbHNlIG90aGVyd2lzZQogICBib29sIGJhc2VsaW5lOwotICAvLyBGb3IgcmVjb3JkaW5nIHRoZSBiYXNlbGluZSB0aW1lIAorICAvLyBGb3IgcmVjb3JkaW5nIHRoZSBiYXNlbGluZSB0aW1lCiAgIGRvdWJsZSBiYXNlbGluZV90aW1lOwogfTsKLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL21peGVkX3BlcmZfYW5hbHl6ZXIuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvbWl4ZWRfcGVyZl9hbmFseXplci5oaAppbmRleCBlMTkwMjM2Li44Zjg5MTU0IDEwMDY0NAotLS0gYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvbWl4ZWRfcGVyZl9hbmFseXplci5oaAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvbWl4ZWRfcGVyZl9hbmFseXplci5oaApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIG1peGVkX3BlcmZfYW5hbHl6ZXIuaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBtYXIgZOljIDMgMTg6NTk6MzYgQ0VUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBfTUlYRURfUEVSRl9BTkFMWVNFUl9ISAogI2RlZmluZSBfTUlYRURfUEVSRl9BTkFMWVNFUl9ISAogCkBAIC0yNSw0OSArMjUsMzQgQEAKIAogLy8gY2hvb3NlIHBvcnRhYmxlIHBlcmYgYW5hbHl6ZXIgZm9yIGxvbmcgY2FsY3VsYXRpb25zIGFuZCB4ODYgYW5hbHlzZXIgZm9yIHNob3J0IG9uZXMKIAotCi10ZW1wbGF0ZTxjbGFzcyBBY3Rpb24+Ci1jbGFzcyBNaXhlZF9QZXJmX0FuYWx5emVyewotICAKLXB1YmxpYzogIAotICBNaXhlZF9QZXJmX0FuYWx5emVyKCB2b2lkICk6X3g4NnBhKCksX3BwYSgpLF91c2VfcHBhKHRydWUpCi0gIHsKLSAgICBNRVNTQUdFKCJNaXhlZF9QZXJmX0FuYWx5emVyIEN0b3IiKTsKLSAgfTsgCi0gIE1peGVkX1BlcmZfQW5hbHl6ZXIoIGNvbnN0IE1peGVkX1BlcmZfQW5hbHl6ZXIgJiApewordGVtcGxhdGUgPGNsYXNzIEFjdGlvbj4KK2NsYXNzIE1peGVkX1BlcmZfQW5hbHl6ZXIgeworIHB1YmxpYzoKKyAgTWl4ZWRfUGVyZl9BbmFseXplcih2b2lkKSA6IF94ODZwYSgpLCBfcHBhKCksIF91c2VfcHBhKHRydWUpIHsgTUVTU0FHRSgiTWl4ZWRfUGVyZl9BbmFseXplciBDdG9yIik7IH07CisgIE1peGVkX1BlcmZfQW5hbHl6ZXIoY29uc3QgTWl4ZWRfUGVyZl9BbmFseXplciYpIHsKICAgICBJTkZPUygiQ29weSBDdG9yIG5vdCBpbXBsZW1lbnRlZCIpOwogICAgIGV4aXQoMCk7CiAgIH07Ci0gIH5NaXhlZF9QZXJmX0FuYWx5emVyKCB2b2lkICl7Ci0gICAgTUVTU0FHRSgiTWl4ZWRfUGVyZl9BbmFseXplciBEdG9yIik7Ci0gIH07Ci0gICAgCi0gIAotICBpbmxpbmUgZG91YmxlIGV2YWxfbWZsb3BzKGludCBzaXplKQotICB7CisgIH5NaXhlZF9QZXJmX0FuYWx5emVyKHZvaWQpIHsgTUVTU0FHRSgiTWl4ZWRfUGVyZl9BbmFseXplciBEdG9yIik7IH07CiAKLSAgICBkb3VibGUgcmVzdWx0PTAuMDsKLSAgICBpZiAoX3VzZV9wcGEpeyAgICAgIAotICAgICAgcmVzdWx0PV9wcGEuZXZhbF9tZmxvcHMoc2l6ZSk7Ci0gICAgICBpZiAoX3BwYS5nZXRfbmJfY2FsYygpPkRFRkFVTFRfTkJfU0FNUExFKXtfdXNlX3BwYT1mYWxzZTt9ICAgICAgCi0gICAgfQotICAgIGVsc2V7ICAgICAgCi0gICAgICByZXN1bHQ9X3g4NnBhLmV2YWxfbWZsb3BzKHNpemUpOworICBpbmxpbmUgZG91YmxlIGV2YWxfbWZsb3BzKGludCBzaXplKSB7CisgICAgZG91YmxlIHJlc3VsdCA9IDAuMDsKKyAgICBpZiAoX3VzZV9wcGEpIHsKKyAgICAgIHJlc3VsdCA9IF9wcGEuZXZhbF9tZmxvcHMoc2l6ZSk7CisgICAgICBpZiAoX3BwYS5nZXRfbmJfY2FsYygpID4gREVGQVVMVF9OQl9TQU1QTEUpIHsKKyAgICAgICAgX3VzZV9wcGEgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gX3g4NnBhLmV2YWxfbWZsb3BzKHNpemUpOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotcHJpdmF0ZToKLQorIHByaXZhdGU6CiAgIFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXI8QWN0aW9uPiBfcHBhOwogICBYODZfUGVyZl9BbmFseXplcjxBY3Rpb24+IF94ODZwYTsKICAgYm9vbCBfdXNlX3BwYTsKLQogfTsKIAogI2VuZGlmCi0KLSAgCi0gICAgCi0gIApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3BvcnRhYmxlX3BlcmZfYW5hbHl6ZXIuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfcGVyZl9hbmFseXplci5oaAppbmRleCA1ZTU3OWZiLi42NzM5M2Q3IDEwMDY0NAotLS0gYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfcGVyZl9hbmFseXplci5oaAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfcGVyZl9hbmFseXplci5oaApAQCAtMjUsMzggKzI1LDMzIEBACiAjaW5jbHVkZSAidGltZXJzL3BvcnRhYmxlX3RpbWVyLmhoIgogCiB0ZW1wbGF0ZSA8Y2xhc3MgQWN0aW9uPgotY2xhc3MgUG9ydGFibGVfUGVyZl9BbmFseXplcnsKLXB1YmxpYzoKLSAgUG9ydGFibGVfUGVyZl9BbmFseXplciggKTpfbmJfY2FsYygwKSwgbV90aW1lX2FjdGlvbigwKSwgX2Nocm9ub3MoKXsKLSAgICBNRVNTQUdFKCJQb3J0YWJsZV9QZXJmX0FuYWx5emVyIEN0b3IiKTsKLSAgfTsKLSAgUG9ydGFibGVfUGVyZl9BbmFseXplciggY29uc3QgUG9ydGFibGVfUGVyZl9BbmFseXplciAmICl7CitjbGFzcyBQb3J0YWJsZV9QZXJmX0FuYWx5emVyIHsKKyBwdWJsaWM6CisgIFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIoKSA6IF9uYl9jYWxjKDApLCBtX3RpbWVfYWN0aW9uKDApLCBfY2hyb25vcygpIHsgTUVTU0FHRSgiUG9ydGFibGVfUGVyZl9BbmFseXplciBDdG9yIik7IH07CisgIFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIoY29uc3QgUG9ydGFibGVfUGVyZl9BbmFseXplciYpIHsKICAgICBJTkZPUygiQ29weSBDdG9yIG5vdCBpbXBsZW1lbnRlZCIpOwogICAgIGV4aXQoMCk7CiAgIH07Ci0gIH5Qb3J0YWJsZV9QZXJmX0FuYWx5emVyKCl7Ci0gICAgTUVTU0FHRSgiUG9ydGFibGVfUGVyZl9BbmFseXplciBEdG9yIik7Ci0gIH07CisgIH5Qb3J0YWJsZV9QZXJmX0FuYWx5emVyKCkgeyBNRVNTQUdFKCJQb3J0YWJsZV9QZXJmX0FuYWx5emVyIER0b3IiKTsgfTsKIAotICBCVExfRE9OVF9JTkxJTkUgZG91YmxlIGV2YWxfbWZsb3BzKGludCBzaXplKQotICB7CisgIEJUTF9ET05UX0lOTElORSBkb3VibGUgZXZhbF9tZmxvcHMoaW50IHNpemUpIHsKICAgICBBY3Rpb24gYWN0aW9uKHNpemUpOwogCi0vLyAgICAgYWN0aW9uLmluaXRpYWxpemUoKTsKLS8vICAgICB0aW1lX2FjdGlvbiA9IHRpbWVfY2FsY3VsYXRlKGFjdGlvbik7Ci0gICAgd2hpbGUgKG1fdGltZV9hY3Rpb24gPCBNSU5fVElNRSkKLSAgICB7Ci0gICAgICBpZihfbmJfY2FsYz09MCkgX25iX2NhbGMgPSAxOwotICAgICAgZWxzZSAgICAgICAgICAgIF9uYl9jYWxjICo9IDI7CisgICAgLy8gICAgIGFjdGlvbi5pbml0aWFsaXplKCk7CisgICAgLy8gICAgIHRpbWVfYWN0aW9uID0gdGltZV9jYWxjdWxhdGUoYWN0aW9uKTsKKyAgICB3aGlsZSAobV90aW1lX2FjdGlvbiA8IE1JTl9USU1FKSB7CisgICAgICBpZiAoX25iX2NhbGMgPT0gMCkKKyAgICAgICAgX25iX2NhbGMgPSAxOworICAgICAgZWxzZQorICAgICAgICBfbmJfY2FsYyAqPSAyOwogICAgICAgYWN0aW9uLmluaXRpYWxpemUoKTsKICAgICAgIG1fdGltZV9hY3Rpb24gPSB0aW1lX2NhbGN1bGF0ZShhY3Rpb24pOwogICAgIH0KIAogICAgIC8vIG9wdGltaXplCi0gICAgZm9yIChpbnQgaT0xOyBpPEJ0bENvbmZpZzo6SW5zdGFuY2UudHJpZXM7ICsraSkKLSAgICB7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBCdGxDb25maWc6Okluc3RhbmNlLnRyaWVzOyArK2kpIHsKICAgICAgIEFjdGlvbiBfYWN0aW9uKHNpemUpOwotICAgICAgc3RkOjpjb3V0IDw8ICIgIiA8PCBfYWN0aW9uLm5iX29wX2Jhc2UoKSpfbmJfY2FsYy8obV90aW1lX2FjdGlvbioxZTYpIDw8ICIgIjsKKyAgICAgIHN0ZDo6Y291dCA8PCAiICIgPDwgX2FjdGlvbi5uYl9vcF9iYXNlKCkgKiBfbmJfY2FsYyAvIChtX3RpbWVfYWN0aW9uICogMWU2KSA8PCAiICI7CiAgICAgICBfYWN0aW9uLmluaXRpYWxpemUoKTsKICAgICAgIG1fdGltZV9hY3Rpb24gPSBzdGQ6Om1pbihtX3RpbWVfYWN0aW9uLCB0aW1lX2NhbGN1bGF0ZShfYWN0aW9uKSk7CiAgICAgfQpAQCAtNjQsNDAgKzU5LDMxIEBACiAgICAgZG91YmxlIHRpbWVfYWN0aW9uID0gbV90aW1lX2FjdGlvbiAvIChkb3VibGUoX25iX2NhbGMpKTsKIAogICAgIC8vIGNoZWNrCi0gICAgaWYgKEJ0bENvbmZpZzo6SW5zdGFuY2UuY2hlY2tSZXN1bHRzICYmIHNpemU8MTI4KQotICAgIHsKKyAgICBpZiAoQnRsQ29uZmlnOjpJbnN0YW5jZS5jaGVja1Jlc3VsdHMgJiYgc2l6ZSA8IDEyOCkgewogICAgICAgYWN0aW9uLmluaXRpYWxpemUoKTsKICAgICAgIGFjdGlvbi5jYWxjdWxhdGUoKTsKICAgICAgIGFjdGlvbi5jaGVja19yZXN1bHQoKTsKICAgICB9Ci0gICAgcmV0dXJuIGFjdGlvbi5uYl9vcF9iYXNlKCkvKHRpbWVfYWN0aW9uKjFlNik7CisgICAgcmV0dXJuIGFjdGlvbi5uYl9vcF9iYXNlKCkgLyAodGltZV9hY3Rpb24gKiAxZTYpOwogICB9CiAKLSAgQlRMX0RPTlRfSU5MSU5FIGRvdWJsZSB0aW1lX2NhbGN1bGF0ZShBY3Rpb24gJiBhY3Rpb24pCi0gIHsKKyAgQlRMX0RPTlRfSU5MSU5FIGRvdWJsZSB0aW1lX2NhbGN1bGF0ZShBY3Rpb24mIGFjdGlvbikgewogICAgIC8vIHRpbWUgbWVhc3VyZW1lbnQKICAgICBhY3Rpb24uY2FsY3VsYXRlKCk7CiAgICAgX2Nocm9ub3Muc3RhcnQoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpaT0wO2lpPF9uYl9jYWxjO2lpKyspCi0gICAgeworICAgIGZvciAodW5zaWduZWQgaW50IGlpID0gMDsgaWkgPCBfbmJfY2FsYzsgaWkrKykgewogICAgICAgYWN0aW9uLmNhbGN1bGF0ZSgpOwogICAgIH0KICAgICBfY2hyb25vcy5zdG9wKCk7CiAgICAgcmV0dXJuIF9jaHJvbm9zLnVzZXJfdGltZSgpOwogICB9CiAKLSAgdW5zaWduZWQgbG9uZyBsb25nIGdldF9uYl9jYWxjKCkKLSAgewotICAgIHJldHVybiBfbmJfY2FsYzsKLSAgfQorICB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0X25iX2NhbGMoKSB7IHJldHVybiBfbmJfY2FsYzsgfQogCi0KLXByaXZhdGU6CisgcHJpdmF0ZToKICAgdW5zaWduZWQgbG9uZyBsb25nIF9uYl9jYWxjOwogICBkb3VibGUgbV90aW1lX2FjdGlvbjsKICAgUG9ydGFibGVfVGltZXIgX2Nocm9ub3M7Ci0KIH07CiAKLSNlbmRpZiAvL19QT1JUQUJMRV9QRVJGX0FOQUxZWkVSX0hICi0KKyNlbmRpZiAgLy9fUE9SVEFCTEVfUEVSRl9BTkFMWVpFUl9ISApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3BvcnRhYmxlX3BlcmZfYW5hbHl6ZXJfb2xkLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3BvcnRhYmxlX3BlcmZfYW5hbHl6ZXJfb2xkLmhoCmluZGV4IGZjZTM3ODEuLjc3MzNkNGUgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9wb3J0YWJsZV9wZXJmX2FuYWx5emVyX29sZC5oaAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfcGVyZl9hbmFseXplcl9vbGQuaGgKQEAgLTI0LDkzICsyNCw3NCBAQAogI2luY2x1ZGUgInRpbWVycy9wb3J0YWJsZV90aW1lci5oaCIKIAogdGVtcGxhdGUgPGNsYXNzIEFjdGlvbj4KLWNsYXNzIFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXJ7Ci1wdWJsaWM6Ci0gIFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIoIHZvaWQgKTpfbmJfY2FsYygxKSxfbmJfaW5pdCgxKSxfY2hyb25vcygpewotICAgIE1FU1NBR0UoIlBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIgQ3RvciIpOwotICB9OwotICBQb3J0YWJsZV9QZXJmX0FuYWx5emVyKCBjb25zdCBQb3J0YWJsZV9QZXJmX0FuYWx5emVyICYgKXsKK2NsYXNzIFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIgeworIHB1YmxpYzoKKyAgUG9ydGFibGVfUGVyZl9BbmFseXplcih2b2lkKSA6IF9uYl9jYWxjKDEpLCBfbmJfaW5pdCgxKSwgX2Nocm9ub3MoKSB7IE1FU1NBR0UoIlBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIgQ3RvciIpOyB9OworICBQb3J0YWJsZV9QZXJmX0FuYWx5emVyKGNvbnN0IFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXImKSB7CiAgICAgSU5GT1MoIkNvcHkgQ3RvciBub3QgaW1wbGVtZW50ZWQiKTsKICAgICBleGl0KDApOwogICB9OwotICB+UG9ydGFibGVfUGVyZl9BbmFseXplciggdm9pZCApewotICAgIE1FU1NBR0UoIlBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIgRHRvciIpOwotICB9OworICB+UG9ydGFibGVfUGVyZl9BbmFseXplcih2b2lkKSB7IE1FU1NBR0UoIlBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIgRHRvciIpOyB9OwogCi0KLQotICBpbmxpbmUgZG91YmxlIGV2YWxfbWZsb3BzKGludCBzaXplKQotICB7Ci0KKyAgaW5saW5lIGRvdWJsZSBldmFsX21mbG9wcyhpbnQgc2l6ZSkgewogICAgIEFjdGlvbiBhY3Rpb24oc2l6ZSk7CiAKLS8vICAgICBkb3VibGUgdGltZV9iYXNlbGluZSA9IHRpbWVfaW5pdChhY3Rpb24pOwotLy8gICAgIHdoaWxlICh0aW1lX2Jhc2VsaW5lIDwgTUlOX1RJTUVfSU5JVCkKLS8vICAgICB7Ci0vLyAgICAgICBfbmJfaW5pdCAqPSAyOwotLy8gICAgICAgdGltZV9iYXNlbGluZSA9IHRpbWVfaW5pdChhY3Rpb24pOwotLy8gICAgIH0KLS8vCi0vLyAgICAgLy8gb3B0aW1pemUKLS8vICAgICBmb3IgKGludCBpPTE7IGk8TkJfVFJJRVM7ICsraSkKLS8vICAgICAgIHRpbWVfYmFzZWxpbmUgPSBzdGQ6Om1pbih0aW1lX2Jhc2VsaW5lLCB0aW1lX2luaXQoYWN0aW9uKSk7Ci0vLwotLy8gICAgIHRpbWVfYmFzZWxpbmUgPSB0aW1lX2Jhc2VsaW5lLyhkb3VibGUoX25iX2luaXQpKTsKKyAgICAvLyAgICAgZG91YmxlIHRpbWVfYmFzZWxpbmUgPSB0aW1lX2luaXQoYWN0aW9uKTsKKyAgICAvLyAgICAgd2hpbGUgKHRpbWVfYmFzZWxpbmUgPCBNSU5fVElNRV9JTklUKQorICAgIC8vICAgICB7CisgICAgLy8gICAgICAgX25iX2luaXQgKj0gMjsKKyAgICAvLyAgICAgICB0aW1lX2Jhc2VsaW5lID0gdGltZV9pbml0KGFjdGlvbik7CisgICAgLy8gICAgIH0KKyAgICAvLworICAgIC8vICAgICAvLyBvcHRpbWl6ZQorICAgIC8vICAgICBmb3IgKGludCBpPTE7IGk8TkJfVFJJRVM7ICsraSkKKyAgICAvLyAgICAgICB0aW1lX2Jhc2VsaW5lID0gc3RkOjptaW4odGltZV9iYXNlbGluZSwgdGltZV9pbml0KGFjdGlvbikpOworICAgIC8vCisgICAgLy8gICAgIHRpbWVfYmFzZWxpbmUgPSB0aW1lX2Jhc2VsaW5lLyhkb3VibGUoX25iX2luaXQpKTsKIAogICAgIGRvdWJsZSB0aW1lX2FjdGlvbiA9IHRpbWVfY2FsY3VsYXRlKGFjdGlvbik7Ci0gICAgd2hpbGUgKHRpbWVfYWN0aW9uIDwgTUlOX1RJTUUpCi0gICAgeworICAgIHdoaWxlICh0aW1lX2FjdGlvbiA8IE1JTl9USU1FKSB7CiAgICAgICBfbmJfY2FsYyAqPSAyOwogICAgICAgdGltZV9hY3Rpb24gPSB0aW1lX2NhbGN1bGF0ZShhY3Rpb24pOwogICAgIH0KIAogICAgIC8vIG9wdGltaXplCi0gICAgZm9yIChpbnQgaT0xOyBpPE5CX1RSSUVTOyArK2kpCi0gICAgICB0aW1lX2FjdGlvbiA9IHN0ZDo6bWluKHRpbWVfYWN0aW9uLCB0aW1lX2NhbGN1bGF0ZShhY3Rpb24pKTsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IE5CX1RSSUVTOyArK2kpIHRpbWVfYWN0aW9uID0gc3RkOjptaW4odGltZV9hY3Rpb24sIHRpbWVfY2FsY3VsYXRlKGFjdGlvbikpOwogCi0vLyAgICAgSU5GT1MoInNpemU9Ijw8c2l6ZSk7Ci0vLyAgICAgSU5GT1MoIl9uYl9pbml0PSI8PF9uYl9pbml0KTsKLS8vICAgICBJTkZPUygiX25iX2NhbGM9Ijw8X25iX2NhbGMpOworICAgIC8vICAgICBJTkZPUygic2l6ZT0iPDxzaXplKTsKKyAgICAvLyAgICAgSU5GT1MoIl9uYl9pbml0PSI8PF9uYl9pbml0KTsKKyAgICAvLyAgICAgSU5GT1MoIl9uYl9jYWxjPSI8PF9uYl9jYWxjKTsKIAogICAgIHRpbWVfYWN0aW9uID0gdGltZV9hY3Rpb24gLyAoZG91YmxlKF9uYl9jYWxjKSk7CiAKICAgICBhY3Rpb24uY2hlY2tfcmVzdWx0KCk7CiAKLQogICAgIGRvdWJsZSB0aW1lX2Jhc2VsaW5lID0gdGltZV9pbml0KGFjdGlvbik7Ci0gICAgZm9yIChpbnQgaT0xOyBpPE5CX1RSSUVTOyArK2kpCi0gICAgICB0aW1lX2Jhc2VsaW5lID0gc3RkOjptaW4odGltZV9iYXNlbGluZSwgdGltZV9pbml0KGFjdGlvbikpOwotICAgIHRpbWVfYmFzZWxpbmUgPSB0aW1lX2Jhc2VsaW5lLyhkb3VibGUoX25iX2luaXQpKTsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IE5CX1RSSUVTOyArK2kpIHRpbWVfYmFzZWxpbmUgPSBzdGQ6Om1pbih0aW1lX2Jhc2VsaW5lLCB0aW1lX2luaXQoYWN0aW9uKSk7CisgICAgdGltZV9iYXNlbGluZSA9IHRpbWVfYmFzZWxpbmUgLyAoZG91YmxlKF9uYl9pbml0KSk7CiAKLQotCi0vLyAgICAgSU5GT1MoInRpbWVfYmFzZWxpbmU9Ijw8dGltZV9iYXNlbGluZSk7Ci0vLyAgICAgSU5GT1MoInRpbWVfYWN0aW9uPSI8PHRpbWVfYWN0aW9uKTsKKyAgICAvLyAgICAgSU5GT1MoInRpbWVfYmFzZWxpbmU9Ijw8dGltZV9iYXNlbGluZSk7CisgICAgLy8gICAgIElORk9TKCJ0aW1lX2FjdGlvbj0iPDx0aW1lX2FjdGlvbik7CiAKICAgICB0aW1lX2FjdGlvbiA9IHRpbWVfYWN0aW9uIC0gdGltZV9iYXNlbGluZTsKIAotLy8gICAgIElORk9TKCJ0aW1lX2NvcnJlY3RlZD0iPDx0aW1lX2FjdGlvbik7CisgICAgLy8gICAgIElORk9TKCJ0aW1lX2NvcnJlY3RlZD0iPDx0aW1lX2FjdGlvbik7CiAKLSAgICByZXR1cm4gYWN0aW9uLm5iX29wX2Jhc2UoKS8odGltZV9hY3Rpb24qMTAwMDAwMC4wKTsKKyAgICByZXR1cm4gYWN0aW9uLm5iX29wX2Jhc2UoKSAvICh0aW1lX2FjdGlvbiAqIDEwMDAwMDAuMCk7CiAgIH0KIAotICBpbmxpbmUgZG91YmxlIHRpbWVfaW5pdChBY3Rpb24gJiBhY3Rpb24pCi0gIHsKKyAgaW5saW5lIGRvdWJsZSB0aW1lX2luaXQoQWN0aW9uJiBhY3Rpb24pIHsKICAgICAvLyB0aW1lIG1lYXN1cmVtZW50CiAgICAgX2Nocm9ub3Muc3RhcnQoKTsKLSAgICBmb3IgKGludCBpaT0wOyBpaTxfbmJfaW5pdDsgaWkrKykKLSAgICAgIGFjdGlvbi5pbml0aWFsaXplKCk7CisgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IF9uYl9pbml0OyBpaSsrKSBhY3Rpb24uaW5pdGlhbGl6ZSgpOwogICAgIF9jaHJvbm9zLnN0b3AoKTsKICAgICByZXR1cm4gX2Nocm9ub3MudXNlcl90aW1lKCk7CiAgIH0KIAotCi0gIGlubGluZSBkb3VibGUgdGltZV9jYWxjdWxhdGUoQWN0aW9uICYgYWN0aW9uKQotICB7CisgIGlubGluZSBkb3VibGUgdGltZV9jYWxjdWxhdGUoQWN0aW9uJiBhY3Rpb24pIHsKICAgICAvLyB0aW1lIG1lYXN1cmVtZW50CiAgICAgX2Nocm9ub3Muc3RhcnQoKTsKLSAgICBmb3IgKGludCBpaT0wO2lpPF9uYl9jYWxjO2lpKyspCi0gICAgeworICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBfbmJfY2FsYzsgaWkrKykgewogICAgICAgYWN0aW9uLmluaXRpYWxpemUoKTsKICAgICAgIGFjdGlvbi5jYWxjdWxhdGUoKTsKICAgICB9CkBAIC0xMTgsMTcgKzk5LDEyIEBACiAgICAgcmV0dXJuIF9jaHJvbm9zLnVzZXJfdGltZSgpOwogICB9CiAKLSAgdW5zaWduZWQgbG9uZyBsb25nIGdldF9uYl9jYWxjKCB2b2lkICkKLSAgewotICAgIHJldHVybiBfbmJfY2FsYzsKLSAgfQorICB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0X25iX2NhbGModm9pZCkgeyByZXR1cm4gX25iX2NhbGM7IH0KIAotCi1wcml2YXRlOgorIHByaXZhdGU6CiAgIHVuc2lnbmVkIGxvbmcgbG9uZyBfbmJfY2FsYzsKICAgdW5zaWduZWQgbG9uZyBsb25nIF9uYl9pbml0OwogICBQb3J0YWJsZV9UaW1lciBfY2hyb25vczsKLQogfTsKIAotI2VuZGlmIC8vX1BPUlRBQkxFX1BFUkZfQU5BTFlaRVJfSEgKKyNlbmRpZiAgLy9fUE9SVEFCTEVfUEVSRl9BTkFMWVpFUl9ISApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3BvcnRhYmxlX3RpbWVyLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3BvcnRhYmxlX3RpbWVyLmhoCmluZGV4IGMxOTk4MTEuLmY3YzNmNWMgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy9wb3J0YWJsZV90aW1lci5oaAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfdGltZXIuaGgKQEAgLTI3LDEwICsyNyw4IEBACiAKICNpbmNsdWRlIDx0aW1lLmg+CiAKLQogI2RlZmluZSBVU0VDX0lOX1NFQyAxMDAwMDAwCiAKLQogLy8gIHRpbWVyICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KIAogLy8gIEEgdGltZXIgb2JqZWN0IG1lYXN1cmVzIENQVSB0aW1lLgpAQCAtNDQsOTAgKzQyLDY2IEBACiAjZGVmaW5lIGhyX3RpbWVyCiAjZW5kaWYqLwogCi0gY2xhc3MgUG9ydGFibGVfVGltZXIKLSB7Ci0gIHB1YmxpYzoKLQotICAgdHlwZWRlZiBzdHJ1Y3QgeworY2xhc3MgUG9ydGFibGVfVGltZXIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBzdHJ1Y3QgewogICAgIExBUkdFX0lOVEVHRVIgc3RhcnQ7CiAgICAgTEFSR0VfSU5URUdFUiBzdG9wOwotICAgfSBzdG9wV2F0Y2g7CisgIH0gc3RvcFdhdGNoOwogCisgIFBvcnRhYmxlX1RpbWVyKCkgeworICAgIHN0YXJ0VmFsLlF1YWRQYXJ0ID0gMDsKKyAgICBzdG9wVmFsLlF1YWRQYXJ0ID0gMDsKKyAgICBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZmcmVxdWVuY3kpOworICB9CiAKLSAgIFBvcnRhYmxlX1RpbWVyKCkKLSAgIHsKLQkgc3RhcnRWYWwuUXVhZFBhcnQgPSAwOwotCSBzdG9wVmFsLlF1YWRQYXJ0ID0gMDsKLQkgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmZnJlcXVlbmN5KTsKLSAgIH0KKyAgdm9pZCBzdGFydCgpIHsgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnN0YXJ0VmFsKTsgfQogCi0gICB2b2lkIHN0YXJ0KCkgeyBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmc3RhcnRWYWwpOyB9CisgIHZvaWQgc3RvcCgpIHsgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnN0b3BWYWwpOyB9CiAKLSAgIHZvaWQgc3RvcCgpIHsgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnN0b3BWYWwpOyB9CisgIGRvdWJsZSBlbGFwc2VkKCkgeworICAgIExBUkdFX0lOVEVHRVIgdGltZTsKKyAgICB0aW1lLlF1YWRQYXJ0ID0gc3RvcFZhbC5RdWFkUGFydCAtIHN0YXJ0VmFsLlF1YWRQYXJ0OworICAgIHJldHVybiBMSVRvU2Vjcyh0aW1lKTsKKyAgfQogCi0gICBkb3VibGUgZWxhcHNlZCgpIHsKLQkgTEFSR0VfSU5URUdFUiB0aW1lOwotICAgICB0aW1lLlF1YWRQYXJ0ID0gc3RvcFZhbC5RdWFkUGFydCAtIHN0YXJ0VmFsLlF1YWRQYXJ0OwotICAgICByZXR1cm4gTElUb1NlY3ModGltZSk7Ci0gICB9Ci0KLSAgIGRvdWJsZSB1c2VyX3RpbWUoKSB7IHJldHVybiBlbGFwc2VkKCk7IH0KLQorICBkb3VibGUgdXNlcl90aW1lKCkgeyByZXR1cm4gZWxhcHNlZCgpOyB9CiAKICBwcml2YXRlOgorICBkb3VibGUgTElUb1NlY3MoTEFSR0VfSU5URUdFUiYgTCkgeyByZXR1cm4gKChkb3VibGUpTC5RdWFkUGFydCAvIChkb3VibGUpZnJlcXVlbmN5LlF1YWRQYXJ0KTsgfQogCi0gICBkb3VibGUgTElUb1NlY3MoTEFSR0VfSU5URUdFUiYgTCkgewotICAgICByZXR1cm4gKChkb3VibGUpTC5RdWFkUGFydCAvKGRvdWJsZSlmcmVxdWVuY3kuUXVhZFBhcnQpIDsKLSAgIH0KKyAgTEFSR0VfSU5URUdFUiBzdGFydFZhbDsKKyAgTEFSR0VfSU5URUdFUiBzdG9wVmFsOworICBMQVJHRV9JTlRFR0VSIGZyZXF1ZW5jeTsKIAotICAgTEFSR0VfSU5URUdFUiBzdGFydFZhbDsKLSAgIExBUkdFX0lOVEVHRVIgc3RvcFZhbDsKLSAgIExBUkdFX0lOVEVHRVIgZnJlcXVlbmN5OwotCi0KLSB9OyAvLyBQb3J0YWJsZV9UaW1lcgorfTsgIC8vIFBvcnRhYmxlX1RpbWVyCiAKICNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQogI2luY2x1ZGUgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KICNpbmNsdWRlIDxtYWNoL21hY2hfdGltZS5oPgogCi0KLWNsYXNzIFBvcnRhYmxlX1RpbWVyCi17CitjbGFzcyBQb3J0YWJsZV9UaW1lciB7CiAgcHVibGljOgorICBQb3J0YWJsZV9UaW1lcigpIHt9CiAKLSAgUG9ydGFibGVfVGltZXIoKQotICB7CisgIHZvaWQgc3RhcnQoKSB7CisgICAgbV9zdGFydF90aW1lID0gZG91YmxlKG1hY2hfYWJzb2x1dGVfdGltZSgpKSAqIDFlLTk7CisgICAgOwogICB9CiAKLSAgdm9pZCBzdGFydCgpCi0gIHsKLSAgICBtX3N0YXJ0X3RpbWUgPSBkb3VibGUobWFjaF9hYnNvbHV0ZV90aW1lKCkpKjFlLTk7OwotCisgIHZvaWQgc3RvcCgpIHsKKyAgICBtX3N0b3BfdGltZSA9IGRvdWJsZShtYWNoX2Fic29sdXRlX3RpbWUoKSkgKiAxZS05OworICAgIDsKICAgfQogCi0gIHZvaWQgc3RvcCgpCi0gIHsKLSAgICBtX3N0b3BfdGltZSA9IGRvdWJsZShtYWNoX2Fic29sdXRlX3RpbWUoKSkqMWUtOTs7CisgIGRvdWJsZSBlbGFwc2VkKCkgeyByZXR1cm4gdXNlcl90aW1lKCk7IH0KIAotICB9CisgIGRvdWJsZSB1c2VyX3RpbWUoKSB7IHJldHVybiBtX3N0b3BfdGltZSAtIG1fc3RhcnRfdGltZTsgfQogCi0gIGRvdWJsZSBlbGFwc2VkKCkKLSAgewotICAgIHJldHVybiAgdXNlcl90aW1lKCk7Ci0gIH0KLQotICBkb3VibGUgdXNlcl90aW1lKCkKLSAgewotICAgIHJldHVybiBtX3N0b3BfdGltZSAtIG1fc3RhcnRfdGltZTsKLSAgfQotCi0KLXByaXZhdGU6Ci0KKyBwcml2YXRlOgogICBkb3VibGUgbV9zdG9wX3RpbWUsIG1fc3RhcnRfdGltZTsKIAotfTsgLy8gUG9ydGFibGVfVGltZXIgKEFwcGxlKQorfTsgIC8vIFBvcnRhYmxlX1RpbWVyIChBcHBsZSkKIAogI2Vsc2UKIApAQCAtMTM2LDUxICsxMTAsMzMgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvdGltZXMuaD4KIAotY2xhc3MgUG9ydGFibGVfVGltZXIKLXsKK2NsYXNzIFBvcnRhYmxlX1RpbWVyIHsKICBwdWJsaWM6CisgIFBvcnRhYmxlX1RpbWVyKCkgeyBtX2Nsa2lkID0gQnRsQ29uZmlnOjpJbnN0YW5jZS5yZWFsY2xvY2sgPyBDTE9DS19SRUFMVElNRSA6IENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRDsgfQogCi0gIFBvcnRhYmxlX1RpbWVyKCkKLSAgewotICAgIG1fY2xraWQgPSBCdGxDb25maWc6Okluc3RhbmNlLnJlYWxjbG9jayA/IENMT0NLX1JFQUxUSU1FIDogQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEOwotICB9CisgIFBvcnRhYmxlX1RpbWVyKGludCBjbGtpZCkgOiBtX2Nsa2lkKGNsa2lkKSB7fQogCi0gIFBvcnRhYmxlX1RpbWVyKGludCBjbGtpZCkgOiBtX2Nsa2lkKGNsa2lkKQotICB7fQotCi0gIHZvaWQgc3RhcnQoKQotICB7CisgIHZvaWQgc3RhcnQoKSB7CiAgICAgdGltZXNwZWMgdHM7CiAgICAgY2xvY2tfZ2V0dGltZShtX2Nsa2lkLCAmdHMpOwogICAgIG1fc3RhcnRfdGltZSA9IGRvdWJsZSh0cy50dl9zZWMpICsgMWUtOSAqIGRvdWJsZSh0cy50dl9uc2VjKTsKLQogICB9CiAKLSAgdm9pZCBzdG9wKCkKLSAgeworICB2b2lkIHN0b3AoKSB7CiAgICAgdGltZXNwZWMgdHM7CiAgICAgY2xvY2tfZ2V0dGltZShtX2Nsa2lkLCAmdHMpOwogICAgIG1fc3RvcF90aW1lID0gZG91YmxlKHRzLnR2X3NlYykgKyAxZS05ICogZG91YmxlKHRzLnR2X25zZWMpOwotCiAgIH0KIAotICBkb3VibGUgZWxhcHNlZCgpCi0gIHsKLSAgICByZXR1cm4gIHVzZXJfdGltZSgpOwotICB9CisgIGRvdWJsZSBlbGFwc2VkKCkgeyByZXR1cm4gdXNlcl90aW1lKCk7IH0KIAotICBkb3VibGUgdXNlcl90aW1lKCkKLSAgewotICAgIHJldHVybiBtX3N0b3BfdGltZSAtIG1fc3RhcnRfdGltZTsKLSAgfQorICBkb3VibGUgdXNlcl90aW1lKCkgeyByZXR1cm4gbV9zdG9wX3RpbWUgLSBtX3N0YXJ0X3RpbWU7IH0KIAotCi1wcml2YXRlOgotCisgcHJpdmF0ZToKICAgaW50IG1fY2xraWQ7CiAgIGRvdWJsZSBtX3N0b3BfdGltZSwgbV9zdGFydF90aW1lOwogCi19OyAvLyBQb3J0YWJsZV9UaW1lciAoTGludXgpCit9OyAgLy8gUG9ydGFibGVfVGltZXIgKExpbnV4KQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl9wZXJmX2FuYWx5emVyLmhoIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl9wZXJmX2FuYWx5emVyLmhoCmluZGV4IDM3ZWEyMWQuLmExNjkzNzMgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy94ODZfcGVyZl9hbmFseXplci5oaAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMveDg2X3BlcmZfYW5hbHl6ZXIuaGgKQEAgLTIzLDM4ICsyMywzMCBAQAogI2luY2x1ZGUgIng4Nl90aW1lci5oaCIKICNpbmNsdWRlICJiZW5jaF9wYXJhbWV0ZXIuaGgiCiAKLXRlbXBsYXRlPGNsYXNzIEFDVElPTj4KLWNsYXNzIFg4Nl9QZXJmX0FuYWx5emVyewotcHVibGljOgotICBYODZfUGVyZl9BbmFseXplciggdW5zaWduZWQgbG9uZyBsb25nIG5iX3NhbXBsZT1ERUZBVUxUX05CX1NBTVBMRSk6X25iX3NhbXBsZShuYl9zYW1wbGUpLF9jaHJvbm9zKCkKLSAgewordGVtcGxhdGUgPGNsYXNzIEFDVElPTj4KK2NsYXNzIFg4Nl9QZXJmX0FuYWx5emVyIHsKKyBwdWJsaWM6CisgIFg4Nl9QZXJmX0FuYWx5emVyKHVuc2lnbmVkIGxvbmcgbG9uZyBuYl9zYW1wbGUgPSBERUZBVUxUX05CX1NBTVBMRSkgOiBfbmJfc2FtcGxlKG5iX3NhbXBsZSksIF9jaHJvbm9zKCkgewogICAgIE1FU1NBR0UoIlg4Nl9QZXJmX0FuYWx5emVyIEN0b3IiKTsKICAgICBfY2hyb25vcy5maW5kX2ZyZXF1ZW5jeSgpOwogICB9OwotICBYODZfUGVyZl9BbmFseXplciggY29uc3QgWDg2X1BlcmZfQW5hbHl6ZXIgJiApeworICBYODZfUGVyZl9BbmFseXplcihjb25zdCBYODZfUGVyZl9BbmFseXplciYpIHsKICAgICBJTkZPUygiQ29weSBDdG9yIG5vdCBpbXBsZW1lbnRlZCIpOwogICAgIGV4aXQoMCk7CiAgIH07Ci0gIH5YODZfUGVyZl9BbmFseXplciggdm9pZCApewotICAgIE1FU1NBR0UoIlg4Nl9QZXJmX0FuYWx5emVyIER0b3IiKTsKLSAgfTsKKyAgflg4Nl9QZXJmX0FuYWx5emVyKHZvaWQpIHsgTUVTU0FHRSgiWDg2X1BlcmZfQW5hbHl6ZXIgRHRvciIpOyB9OwogCi0KLSAgaW5saW5lIGRvdWJsZSBldmFsX21mbG9wcyhpbnQgc2l6ZSkKLSAgewotCisgIGlubGluZSBkb3VibGUgZXZhbF9tZmxvcHMoaW50IHNpemUpIHsKICAgICBBQ1RJT04gYWN0aW9uKHNpemUpOwogCi0gICAgaW50IG5iX2xvb3A9NTsKLSAgICBkb3VibGUgY2FsY3VsYXRlX3RpbWU9MC4wOwotICAgIGRvdWJsZSBiYXNlbGluZV90aW1lPTAuMDsKKyAgICBpbnQgbmJfbG9vcCA9IDU7CisgICAgZG91YmxlIGNhbGN1bGF0ZV90aW1lID0gMC4wOworICAgIGRvdWJsZSBiYXNlbGluZV90aW1lID0gMC4wOwogCi0gICAgZm9yIChpbnQgaj0wIDsgaiA8IG5iX2xvb3AgOyBqKyspewotCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuYl9sb29wOyBqKyspIHsKICAgICAgIF9jaHJvbm9zLmNsZWFyKCk7CiAKLSAgICAgIGZvcihpbnQgaT0wIDsgaSA8IF9uYl9zYW1wbGUgIDsgaSsrKQotICAgICAgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbmJfc2FtcGxlOyBpKyspIHsKICAgICAgICAgX2Nocm9ub3Muc3RhcnQoKTsKICAgICAgICAgYWN0aW9uLmluaXRpYWxpemUoKTsKICAgICAgICAgYWN0aW9uLmNhbGN1bGF0ZSgpOwpAQCAtNjIsNDcgKzU0LDM4IEBACiAgICAgICAgIF9jaHJvbm9zLmFkZF9nZXRfY2xpY2soKTsKICAgICAgIH0KIAotICAgICAgY2FsY3VsYXRlX3RpbWUgKz0gZG91YmxlKF9jaHJvbm9zLmdldF9zaG9ydGVzdF9jbGlja3MoKSkvX2Nocm9ub3MuZnJlcXVlbmN5KCk7CisgICAgICBjYWxjdWxhdGVfdGltZSArPSBkb3VibGUoX2Nocm9ub3MuZ2V0X3Nob3J0ZXN0X2NsaWNrcygpKSAvIF9jaHJvbm9zLmZyZXF1ZW5jeSgpOwogCi0gICAgICBpZiAoaj09MCkgYWN0aW9uLmNoZWNrX3Jlc3VsdCgpOworICAgICAgaWYgKGogPT0gMCkgYWN0aW9uLmNoZWNrX3Jlc3VsdCgpOwogCiAgICAgICBfY2hyb25vcy5jbGVhcigpOwogCi0gICAgICBmb3IoaW50IGk9MCA7IGkgPCBfbmJfc2FtcGxlICA7IGkrKykKLSAgICAgIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX25iX3NhbXBsZTsgaSsrKSB7CiAgICAgICAgIF9jaHJvbm9zLnN0YXJ0KCk7CiAgICAgICAgIGFjdGlvbi5pbml0aWFsaXplKCk7CiAgICAgICAgIF9jaHJvbm9zLnN0b3AoKTsKICAgICAgICAgX2Nocm9ub3MuYWRkX2dldF9jbGljaygpOwotCiAgICAgICB9CiAKLSAgICAgIGJhc2VsaW5lX3RpbWUrPWRvdWJsZShfY2hyb25vcy5nZXRfc2hvcnRlc3RfY2xpY2tzKCkpL19jaHJvbm9zLmZyZXF1ZW5jeSgpOwotCisgICAgICBiYXNlbGluZV90aW1lICs9IGRvdWJsZShfY2hyb25vcy5nZXRfc2hvcnRlc3RfY2xpY2tzKCkpIC8gX2Nocm9ub3MuZnJlcXVlbmN5KCk7CiAgICAgfQogCi0gICAgZG91YmxlIGNvcnJlY3RlZF90aW1lID0gKGNhbGN1bGF0ZV90aW1lLWJhc2VsaW5lX3RpbWUpL2RvdWJsZShuYl9sb29wKTsKKyAgICBkb3VibGUgY29ycmVjdGVkX3RpbWUgPSAoY2FsY3VsYXRlX3RpbWUgLSBiYXNlbGluZV90aW1lKSAvIGRvdWJsZShuYl9sb29wKTsKIAorICAgIC8vICAgICBJTkZPUygiX25iX3NhbXBsZT0iPDxfbmJfc2FtcGxlKTsKKyAgICAvLyAgICAgSU5GT1MoImJhc2VsaW5lX3RpbWU9Ijw8YmFzZWxpbmVfdGltZSk7CisgICAgLy8gICAgIElORk9TKCJjYWxjdWxhdGVfdGltZT0iPDxjYWxjdWxhdGVfdGltZSk7CisgICAgLy8gICAgIElORk9TKCJjb3JyZWN0ZWRfdGltZT0iPDxjb3JyZWN0ZWRfdGltZSk7CiAKLS8vICAgICBJTkZPUygiX25iX3NhbXBsZT0iPDxfbmJfc2FtcGxlKTsKLS8vICAgICBJTkZPUygiYmFzZWxpbmVfdGltZT0iPDxiYXNlbGluZV90aW1lKTsKLS8vICAgICBJTkZPUygiY2FsY3VsYXRlX3RpbWU9Ijw8Y2FsY3VsYXRlX3RpbWUpOwotLy8gICAgIElORk9TKCJjb3JyZWN0ZWRfdGltZT0iPDxjb3JyZWN0ZWRfdGltZSk7CisgICAgLy8gICAgY291dCA8PCBzaXplIDw8IiAiPDxiYXNlbGluZV90aW1lPDwiICI8PGNhbGN1bGF0ZV90aW1lPDwiICI8PGNvcnJlY3RlZF90aW1lPDwiICI8PGFjdGlvbi5uYl9vcF9iYXNlKCkgPDwgZW5kbDsKIAotLy8gICAgY291dCA8PCBzaXplIDw8IiAiPDxiYXNlbGluZV90aW1lPDwiICI8PGNhbGN1bGF0ZV90aW1lPDwiICI8PGNvcnJlY3RlZF90aW1lPDwiICI8PGFjdGlvbi5uYl9vcF9iYXNlKCkgPDwgZW5kbDsKLQotICAgIHJldHVybiBhY3Rpb24ubmJfb3BfYmFzZSgpLyhjb3JyZWN0ZWRfdGltZSoxMDAwMDAwLjApOwotICAgIC8vcmV0dXJuIGFjdGlvbi5uYl9vcF9iYXNlKCkvKGNhbGN1bGF0ZV90aW1lKjEwMDAwMDAuMCk7CisgICAgcmV0dXJuIGFjdGlvbi5uYl9vcF9iYXNlKCkgLyAoY29ycmVjdGVkX3RpbWUgKiAxMDAwMDAwLjApOworICAgIC8vIHJldHVybiBhY3Rpb24ubmJfb3BfYmFzZSgpLyhjYWxjdWxhdGVfdGltZSoxMDAwMDAwLjApOwogICB9CiAKLXByaXZhdGU6Ci0KKyBwcml2YXRlOgogICBYODZfVGltZXIgX2Nocm9ub3M7CiAgIHVuc2lnbmVkIGxvbmcgbG9uZyBfbmJfc2FtcGxlOwotCi0KIH07CiAKLQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy94ODZfdGltZXIuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC90aW1lcnMveDg2X3RpbWVyLmhoCmluZGV4IGNmYjVlZTguLmI1NDQ4NWIgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3RpbWVycy94ODZfdGltZXIuaGgKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl90aW1lci5oaApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIHg4Nl90aW1lci5oaAotLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KIC8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIG1hciBk77+9YyAzIDE4OjU5OjM1IENFVCAyMDAyCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKIC8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpAQCAtMTYsNyArMTYsNyBAQAogLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLS8vIAorLy8KICNpZm5kZWYgX1g4Nl9USU1FUl9ISAogI2RlZmluZSBfWDg2X1RJTUVSX0hICiAKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLS8vI2luY2x1ZGUgInN5c3RlbV90aW1lLmgiCisvLyAjaW5jbHVkZSAic3lzdGVtX3RpbWUuaCIKICNkZWZpbmUgdTMyIHVuc2lnbmVkIGludAogI2luY2x1ZGUgPGFzbS9tc3IuaD4KICNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKQEAgLTM0LDIxMyArMzQsMTQzIEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKIC8vIGZyZXF1ZW5jZSBkZSBsYSBiZWNhbm5lIGVuIEh6Ci0vLyNkZWZpbmUgRlJFUVVFTkNZIDY0ODAwMDAwMAotLy8jZGVmaW5lIEZSRVFVRU5DWSAxNDAwMDAwMDAwCisvLyAjZGVmaW5lIEZSRVFVRU5DWSA2NDgwMDAwMDAKKy8vICNkZWZpbmUgRlJFUVVFTkNZIDE0MDAwMDAwMDAKICNkZWZpbmUgRlJFUVVFTkNZIDE2OTUwMDAwMDAKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotCiBjbGFzcyBYODZfVGltZXIgeworIHB1YmxpYzoKKyAgWDg2X1RpbWVyKHZvaWQpIDogX2ZyZXF1ZW5jeShGUkVRVUVOQ1kpLCBfbmJfc2FtcGxlKDApIHsgTUVTU0FHRSgiWDg2X1RpbWVyIERlZmF1bHQgQ3RvciIpOyB9CiAKLXB1YmxpYyA6CisgIGlubGluZSB2b2lkIHN0YXJ0KHZvaWQpIHsgcmR0c2MoX2NsaWNrX3N0YXJ0Lm4zMlswXSwgX2NsaWNrX3N0YXJ0Lm4zMlsxXSk7IH0KIAotICBYODZfVGltZXIoIHZvaWQgKTpfZnJlcXVlbmN5KEZSRVFVRU5DWSksX25iX3NhbXBsZSgwKQotICB7Ci0gICAgTUVTU0FHRSgiWDg2X1RpbWVyIERlZmF1bHQgQ3RvciIpOyAgICAKLSAgfQorICBpbmxpbmUgdm9pZCBzdG9wKHZvaWQpIHsgcmR0c2MoX2NsaWNrX3N0b3AubjMyWzBdLCBfY2xpY2tfc3RvcC5uMzJbMV0pOyB9CiAKLSAgaW5saW5lIHZvaWQgc3RhcnQoIHZvaWQgKXsKKyAgaW5saW5lIGRvdWJsZSBmcmVxdWVuY3kodm9pZCkgeyByZXR1cm4gX2ZyZXF1ZW5jeTsgfQogCi0gICAgcmR0c2MoX2NsaWNrX3N0YXJ0Lm4zMlswXSxfY2xpY2tfc3RhcnQubjMyWzFdKTsKKyAgZG91YmxlIGdldF9lbGFwc2VkX3RpbWVfaW5fc2Vjb25kKHZvaWQpIHsgcmV0dXJuIChfY2xpY2tfc3RvcC5uNjQgLSBfY2xpY2tfc3RhcnQubjY0KSAvIGRvdWJsZShGUkVRVUVOQ1kpOyB9CiAKLSAgfQorICB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0X2NsaWNrKHZvaWQpIHsgcmV0dXJuIChfY2xpY2tfc3RvcC5uNjQgLSBfY2xpY2tfc3RhcnQubjY0KTsgfQogCi0KLSAgaW5saW5lIHZvaWQgc3RvcCggdm9pZCApewotCi0gICAgcmR0c2MoX2NsaWNrX3N0b3AubjMyWzBdLF9jbGlja19zdG9wLm4zMlsxXSk7Ci0KLSAgfQotICAKLQotICBpbmxpbmUgZG91YmxlIGZyZXF1ZW5jeSggdm9pZCApewotICAgIHJldHVybiBfZnJlcXVlbmN5OwotICB9Ci0KLSAgZG91YmxlIGdldF9lbGFwc2VkX3RpbWVfaW5fc2Vjb25kKCB2b2lkICl7Ci0KLSAgICByZXR1cm4gKF9jbGlja19zdG9wLm42NC1fY2xpY2tfc3RhcnQubjY0KS9kb3VibGUoRlJFUVVFTkNZKTsKLQotCi0gIH0gICAgCi0KLSAgdW5zaWduZWQgbG9uZyBsb25nICBnZXRfY2xpY2soIHZvaWQgKXsKLSAgICAKLSAgICByZXR1cm4gKF9jbGlja19zdG9wLm42NC1fY2xpY2tfc3RhcnQubjY0KTsKLQotICB9ICAgIAotCi0gIGlubGluZSB2b2lkIGZpbmRfZnJlcXVlbmN5KCB2b2lkICl7Ci0KKyAgaW5saW5lIHZvaWQgZmluZF9mcmVxdWVuY3kodm9pZCkgewogICAgIHRpbWVfdCBpbml0aWFsLCBmaW5hbDsKLSAgICBpbnQgZHVtbXk9MjsKKyAgICBpbnQgZHVtbXkgPSAyOwogCiAgICAgaW5pdGlhbCA9IHRpbWUoMCk7CiAgICAgc3RhcnQoKTsKICAgICBkbyB7Ci0gICAgICBkdW1teSs9MjsKLSAgICB9Ci0gICAgd2hpbGUodGltZSgwKT09aW5pdGlhbCk7CisgICAgICBkdW1teSArPSAyOworICAgIH0gd2hpbGUgKHRpbWUoMCkgPT0gaW5pdGlhbCk7CiAgICAgLy8gT24gZXN0IGF1IGRlYnV0IGQndW4gY3ljbGUgZCd1bmUgc2Vjb25kZSAhISEKICAgICBpbml0aWFsID0gdGltZSgwKTsKICAgICBzdGFydCgpOwogICAgIGRvIHsKLSAgICAgIGR1bW15Kz0yOwotICAgIH0KLSAgICB3aGlsZSh0aW1lKDApPT1pbml0aWFsKTsKLSAgICBmaW5hbD10aW1lKDApOworICAgICAgZHVtbXkgKz0gMjsKKyAgICB9IHdoaWxlICh0aW1lKDApID09IGluaXRpYWwpOworICAgIGZpbmFsID0gdGltZSgwKTsKICAgICBzdG9wKCk7CiAgICAgLy8gICAgSU5GT1MoImZpbmUgZ3JhaW5lZCB0aW1lIDogIjw8ICBnZXRfZWxhcHNlZF90aW1lX2luX3NlY29uZCgpKTsKICAgICAvLyAgSU5GT1MoImNvYXJzZSBncmFpbmVkIHRpbWUgOiAiPDwgIGZpbmFsLWluaXRpYWwpOwotICAgIF9mcmVxdWVuY3k9X2ZyZXF1ZW5jeSpnZXRfZWxhcHNlZF90aW1lX2luX3NlY29uZCgpL2RvdWJsZShmaW5hbC1pbml0aWFsKTsKLSAgICAvLy8gIElORk9TKCJDUFUgZnJlcXVlbmN5IDogIjw8ICBfZnJlcXVlbmN5KTsgICAgICAgIAotCisgICAgX2ZyZXF1ZW5jeSA9IF9mcmVxdWVuY3kgKiBnZXRfZWxhcHNlZF90aW1lX2luX3NlY29uZCgpIC8gZG91YmxlKGZpbmFsIC0gaW5pdGlhbCk7CisgICAgLy8vICBJTkZPUygiQ1BVIGZyZXF1ZW5jeSA6ICI8PCAgX2ZyZXF1ZW5jeSk7CiAgIH0KIAotICB2b2lkICBhZGRfZ2V0X2NsaWNrKCB2b2lkICl7Ci0gICAgICAgCisgIHZvaWQgYWRkX2dldF9jbGljayh2b2lkKSB7CiAgICAgX25iX3NhbXBsZSsrOwogICAgIF9jb3VudGVkX2NsaWNrc1tnZXRfY2xpY2soKV0rKzsKICAgICBmaWxsX2hpc3RvcnlfY2xpY2tzKCk7CisgIH0KIAotICB9ICAgIAorICB2b2lkIGR1bXBfc3RhdGlzdGljcyhzdHJpbmcgZmlsZW1hbmUpIHsKKyAgICBvZnN0cmVhbSBvdXRmaWxlKGZpbGVtYW5lLmNfc3RyKCksIGlvczo6b3V0KTsKIAotICB2b2lkIGR1bXBfc3RhdGlzdGljcyhzdHJpbmcgZmlsZW1hbmUpewotICAgIAotICAgIG9mc3RyZWFtIG91dGZpbGUgKGZpbGVtYW5lLmNfc3RyKCksaW9zOjpvdXQpIDsKKyAgICBzdGQ6Om1hcDx1bnNpZ25lZCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZz46Oml0ZXJhdG9yIGl0cjsKKyAgICBmb3IgKGl0ciA9IF9jb3VudGVkX2NsaWNrcy5iZWdpbigpOyBpdHIgIT0gX2NvdW50ZWRfY2xpY2tzLmVuZCgpOyBpdHIrKykgeworICAgICAgb3V0ZmlsZSA8PCAoKml0cikuZmlyc3QgPDwgIiAgIiA8PCAoKml0cikuc2Vjb25kIDw8IGVuZGw7CisgICAgfQogCi0gICAgc3RkOjptYXA8dW5zaWduZWQgbG9uZyBsb25nICwgdW5zaWduZWQgbG9uZyBsb25nPjo6aXRlcmF0b3IgaXRyOwotICAgIGZvcihpdHI9X2NvdW50ZWRfY2xpY2tzLmJlZ2luKCkgOyBpdHIhPV9jb3VudGVkX2NsaWNrcy5lbmQoKSAgOyBpdHIrKykKLSAgICAgIHsgICAgICAKLSAgICAgIG91dGZpbGUgIDw8ICgqaXRyKS5maXJzdCA8PCAiICAiIDw8ICgqaXRyKS5zZWNvbmQgPDwgZW5kbCA7ICAgICAgIAotICAgICAgfSAgICAgIAotICAgIAogICAgIG91dGZpbGUuY2xvc2UoKTsKLQogICB9CiAKLSAgdm9pZCBkdW1wX2hpc3Rvcnkoc3RyaW5nIGZpbGVtYW5lKXsKLSAgICAKLSAgICBvZnN0cmVhbSBvdXRmaWxlIChmaWxlbWFuZS5jX3N0cigpLGlvczo6b3V0KSA7CisgIHZvaWQgZHVtcF9oaXN0b3J5KHN0cmluZyBmaWxlbWFuZSkgeworICAgIG9mc3RyZWFtIG91dGZpbGUoZmlsZW1hbmUuY19zdHIoKSwgaW9zOjpvdXQpOwogCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfaGlzdG9yeV9tZWFuX2NsaWNrcy5zaXplKCk7IGkrKykgeworICAgICAgb3V0ZmlsZSA8PCBpIDw8ICIgIiA8PCBfaGlzdG9yeV9tZWFuX2NsaWNrc1tpXSA8PCAiICIgPDwgX2hpc3Rvcnlfc2hvcnRlc3RfY2xpY2tzW2ldIDw8ICIgIgorICAgICAgICAgICAgICA8PCBfaGlzdG9yeV9tb3N0X29jY3VyZWRfY2xpY2tzW2ldIDw8IGVuZGw7CisgICAgfQogCi0KLSAgICBmb3IoaW50IGk9MCA7IGk8X2hpc3RvcnlfbWVhbl9jbGlja3Muc2l6ZSgpIDsgaSsrKQotICAgICAgeyAgICAgIAotCW91dGZpbGUgIDw8IGkgPDwgIiAiIAotCQkgPDwgX2hpc3RvcnlfbWVhbl9jbGlja3NbaV0gPDwgIiAiIAotCQkgPDwgX2hpc3Rvcnlfc2hvcnRlc3RfY2xpY2tzW2ldIDw8ICIgIiAKLQkJIDw8IF9oaXN0b3J5X21vc3Rfb2NjdXJlZF9jbGlja3NbaV0gPDwgZW5kbCA7Ci0gICAgICB9ICAgICAgCi0gICAgCiAgICAgb3V0ZmlsZS5jbG9zZSgpOwotCi0gIH0KLSAgICAgCi0KLQotICBkb3VibGUgZ2V0X21lYW5fY2xpY2tzKCB2b2lkICl7Ci0gICAgCi0gICAgc3RkOjptYXA8dW5zaWduZWQgbG9uZyBsb25nLHVuc2lnbmVkIGxvbmcgbG9uZz46Oml0ZXJhdG9yIGl0cjsKLSAgICAKLSAgICB1bnNpZ25lZCBsb25nIGxvbmcgbWVhbl9jbGlja3M9MDsKLQotICAgIGZvcihpdHI9X2NvdW50ZWRfY2xpY2tzLmJlZ2luKCkgOyBpdHIhPV9jb3VudGVkX2NsaWNrcy5lbmQoKSAgOyBpdHIrKykKLSAgICAgIHsgICAgICAKLQkKLQltZWFuX2NsaWNrcys9KCppdHIpLnNlY29uZCooKml0cikuZmlyc3Q7Ci0gICAgICB9ICAgICAgCi0KLSAgICByZXR1cm4gbWVhbl9jbGlja3MvZG91YmxlKF9uYl9zYW1wbGUpOwotCiAgIH0KIAotICBkb3VibGUgZ2V0X3Nob3J0ZXN0X2NsaWNrcyggdm9pZCApewotICAgIAotICAgIHJldHVybiBkb3VibGUoKCpfY291bnRlZF9jbGlja3MuYmVnaW4oKSkuZmlyc3QpOworICBkb3VibGUgZ2V0X21lYW5fY2xpY2tzKHZvaWQpIHsKKyAgICBzdGQ6Om1hcDx1bnNpZ25lZCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZz46Oml0ZXJhdG9yIGl0cjsKIAorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtZWFuX2NsaWNrcyA9IDA7CisKKyAgICBmb3IgKGl0ciA9IF9jb3VudGVkX2NsaWNrcy5iZWdpbigpOyBpdHIgIT0gX2NvdW50ZWRfY2xpY2tzLmVuZCgpOyBpdHIrKykgeworICAgICAgbWVhbl9jbGlja3MgKz0gKCppdHIpLnNlY29uZCAqICgqaXRyKS5maXJzdDsKKyAgICB9CisKKyAgICByZXR1cm4gbWVhbl9jbGlja3MgLyBkb3VibGUoX25iX3NhbXBsZSk7CiAgIH0KIAotICB2b2lkIGZpbGxfaGlzdG9yeV9jbGlja3MoIHZvaWQgKXsKKyAgZG91YmxlIGdldF9zaG9ydGVzdF9jbGlja3Modm9pZCkgeyByZXR1cm4gZG91YmxlKCgqX2NvdW50ZWRfY2xpY2tzLmJlZ2luKCkpLmZpcnN0KTsgfQogCisgIHZvaWQgZmlsbF9oaXN0b3J5X2NsaWNrcyh2b2lkKSB7CiAgICAgX2hpc3RvcnlfbWVhbl9jbGlja3MucHVzaF9iYWNrKGdldF9tZWFuX2NsaWNrcygpKTsKICAgICBfaGlzdG9yeV9zaG9ydGVzdF9jbGlja3MucHVzaF9iYWNrKGdldF9zaG9ydGVzdF9jbGlja3MoKSk7CiAgICAgX2hpc3RvcnlfbW9zdF9vY2N1cmVkX2NsaWNrcy5wdXNoX2JhY2soZ2V0X21vc3Rfb2NjdXJlZF9jbGlja3MoKSk7Ci0KICAgfQogCisgIGRvdWJsZSBnZXRfbW9zdF9vY2N1cmVkX2NsaWNrcyh2b2lkKSB7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIG1vYyA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIG1heF9vY2N1cmVuY2UgPSAwOwogCi0gIGRvdWJsZSBnZXRfbW9zdF9vY2N1cmVkX2NsaWNrcyggdm9pZCApeworICAgIHN0ZDo6bWFwPHVuc2lnbmVkIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZyBsb25nPjo6aXRlcmF0b3IgaXRyOwogCi0gICAgdW5zaWduZWQgbG9uZyBsb25nIG1vYz0wOwotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtYXhfb2NjdXJlbmNlPTA7CisgICAgZm9yIChpdHIgPSBfY291bnRlZF9jbGlja3MuYmVnaW4oKTsgaXRyICE9IF9jb3VudGVkX2NsaWNrcy5lbmQoKTsgaXRyKyspIHsKKyAgICAgIGlmIChtYXhfb2NjdXJlbmNlIDw9ICgqaXRyKS5zZWNvbmQpIHsKKyAgICAgICAgbWF4X29jY3VyZW5jZSA9ICgqaXRyKS5zZWNvbmQ7CisgICAgICAgIG1vYyA9ICgqaXRyKS5maXJzdDsKKyAgICAgIH0KKyAgICB9CiAKLSAgICBzdGQ6Om1hcDx1bnNpZ25lZCBsb25nIGxvbmcsdW5zaWduZWQgbG9uZyBsb25nPjo6aXRlcmF0b3IgaXRyOwotCi0gICAgZm9yKGl0cj1fY291bnRlZF9jbGlja3MuYmVnaW4oKSA7IGl0ciE9X2NvdW50ZWRfY2xpY2tzLmVuZCgpICA7IGl0cisrKQotICAgICAgeyAgICAgIAotCQotCWlmIChtYXhfb2NjdXJlbmNlPD0oKml0cikuc2Vjb25kKXsKLQkgIG1heF9vY2N1cmVuY2U9KCppdHIpLnNlY29uZDsKLQkgIG1vYz0oKml0cikuZmlyc3Q7Ci0JfQotICAgICAgfSAgICAgIAotICAgIAotICAgIHJldHVybiBkb3VibGUobW9jKTsgICAgCi0KKyAgICByZXR1cm4gZG91YmxlKG1vYyk7CiAgIH0KLSAgCi0gIHZvaWQgY2xlYXIoIHZvaWQgKQotICB7CisKKyAgdm9pZCBjbGVhcih2b2lkKSB7CiAgICAgX2NvdW50ZWRfY2xpY2tzLmNsZWFyKCk7CiAKICAgICBfaGlzdG9yeV9tZWFuX2NsaWNrcy5jbGVhcigpOwogICAgIF9oaXN0b3J5X3Nob3J0ZXN0X2NsaWNrcy5jbGVhcigpOwogICAgIF9oaXN0b3J5X21vc3Rfb2NjdXJlZF9jbGlja3MuY2xlYXIoKTsKIAotICAgIF9uYl9zYW1wbGU9MDsKKyAgICBfbmJfc2FtcGxlID0gMDsKICAgfQogCi0KLSAgICAKLXByaXZhdGUgOgotICAKLSAgdW5pb24KLSAgewotICAgIHVuc2lnbmVkIGxvbmcgaW50IG4zMlsyXSA7Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIG42NCA7CisgcHJpdmF0ZToKKyAgdW5pb24geworICAgIHVuc2lnbmVkIGxvbmcgaW50IG4zMlsyXTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgbjY0OwogICB9IF9jbGlja19zdGFydDsKIAotICB1bmlvbgotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBpbnQgbjMyWzJdIDsKLSAgICB1bnNpZ25lZCBsb25nIGxvbmcgbjY0IDsKKyAgdW5pb24geworICAgIHVuc2lnbmVkIGxvbmcgaW50IG4zMlsyXTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgbjY0OwogICB9IF9jbGlja19zdG9wOwogCi0gIGRvdWJsZSBfZnJlcXVlbmN5IDsKKyAgZG91YmxlIF9mcmVxdWVuY3k7CiAKLSAgbWFwPHVuc2lnbmVkIGxvbmcgbG9uZyx1bnNpZ25lZCBsb25nIGxvbmc+IF9jb3VudGVkX2NsaWNrczsKKyAgbWFwPHVuc2lnbmVkIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZyBsb25nPiBfY291bnRlZF9jbGlja3M7CiAKICAgdmVjdG9yPGRvdWJsZT4gX2hpc3RvcnlfbWVhbl9jbGlja3M7CiAgIHZlY3Rvcjxkb3VibGU+IF9oaXN0b3J5X3Nob3J0ZXN0X2NsaWNrczsKICAgdmVjdG9yPGRvdWJsZT4gX2hpc3RvcnlfbW9zdF9vY2N1cmVkX2NsaWNrczsKIAogICB1bnNpZ25lZCBsb25nIGxvbmcgX25iX3NhbXBsZTsKLQotICAKLQogfTsKIAotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3V0aWxzL3NpemVfbGluX2xvZy5oaCBiL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3V0aWxzL3NpemVfbGluX2xvZy5oaAppbmRleCBiYmM5ZjU0Li40NDMyOTE0IDEwMDY0NAotLS0gYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy9zaXplX2xpbl9sb2cuaGgKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdXRpbHMvc2l6ZV9saW5fbG9nLmhoCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgc2l6ZV9saW5fbG9nLmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbWFyIGTpYyAzIDE4OjU5OjM3IENFVCAyMDAyCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKIC8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpAQCAtMTYsNTUgKzE2LDQxIEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBTSVpFX0xJTl9MT0cKICNkZWZpbmUgU0laRV9MSU5fTE9HCiAKICNpbmNsdWRlICJzaXplX2xvZy5oaCIKIAotdGVtcGxhdGU8Y2xhc3MgVmVjdG9yPgotdm9pZCBzaXplX2xpbl9sb2coY29uc3QgaW50IG5iX3BvaW50LCBjb25zdCBpbnQgLypzaXplX21pbiovLCBjb25zdCBpbnQgc2l6ZV9tYXgsIFZlY3RvciAmIFgpCi17Ci0gIGludCB0ZW49MTA7Ci0gIGludCBuaW5lPTk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVmVjdG9yPgordm9pZCBzaXplX2xpbl9sb2coY29uc3QgaW50IG5iX3BvaW50LCBjb25zdCBpbnQgLypzaXplX21pbiovLCBjb25zdCBpbnQgc2l6ZV9tYXgsIFZlY3RvciYgWCkgeworICBpbnQgdGVuID0gMTA7CisgIGludCBuaW5lID0gOTsKIAogICBYLnJlc2l6ZShuYl9wb2ludCk7CiAKLSAgaWYgKG5iX3BvaW50PnRlbil7Ci0KLSAgICBmb3IgKGludCBpPTA7aTxuaW5lO2krKyl7Ci0gICAgICAKLSAgICAgIFhbaV09aSsxOwotCisgIGlmIChuYl9wb2ludCA+IHRlbikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmluZTsgaSsrKSB7CisgICAgICBYW2ldID0gaSArIDE7CiAgICAgfQogCiAgICAgVmVjdG9yIGxvZ19zaXplOwotICAgIHNpemVfbG9nKG5iX3BvaW50LW5pbmUsdGVuLHNpemVfbWF4LGxvZ19zaXplKTsKKyAgICBzaXplX2xvZyhuYl9wb2ludCAtIG5pbmUsIHRlbiwgc2l6ZV9tYXgsIGxvZ19zaXplKTsKIAotICAgIGZvciAoaW50IGk9MDtpPG5iX3BvaW50LW5pbmU7aSsrKXsKLSAgICAgIAotICAgICAgWFtpK25pbmVdPWxvZ19zaXplW2ldOwotCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYl9wb2ludCAtIG5pbmU7IGkrKykgeworICAgICAgWFtpICsgbmluZV0gPSBsb2dfc2l6ZVtpXTsKICAgICB9Ci0gIH0KLSAgZWxzZXsKLQotICAgIGZvciAoaW50IGk9MDtpPG5iX3BvaW50O2krKyl7Ci0gICAgICAKLSAgICAgIFhbaV09aSsxOwotCisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYl9wb2ludDsgaSsrKSB7CisgICAgICBYW2ldID0gaSArIDE7CiAgICAgfQogICB9CiAKLSAvLyAgZm9yIChpbnQgaT0wO2k8bmJfcG9pbnQ7aSsrKXsKLSAgICAKLS8vICAgICAgICBJTkZPUygiY29tcHV0ZWQgc2l6ZXMgOiBYWyI8PGk8PCJdPSI8PFhbaV0pOwotICAgIAotLy8gICB9CisgIC8vICBmb3IgKGludCBpPTA7aTxuYl9wb2ludDtpKyspewogCisgIC8vICAgICAgICBJTkZPUygiY29tcHV0ZWQgc2l6ZXMgOiBYWyI8PGk8PCJdPSI8PFhbaV0pOworCisgIC8vICAgfQogfQotICAKKwogI2VuZGlmCi0gICAgCi0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdXRpbHMvc2l6ZV9sb2cuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy9zaXplX2xvZy5oaAppbmRleCA2ODk0NWU3Li4wOTI4Y2Y3IDEwMDY0NAotLS0gYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy9zaXplX2xvZy5oaAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy9zaXplX2xvZy5oaApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIHNpemVfbG9nLmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxNyBDRVNUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBTSVpFX0xPRwogI2RlZmluZSBTSVpFX0xPRwogCkBAIC0yNSwzMCArMjUsMjYgQEAKIC8vICAgICAgICAgICAgcmVzaXplKCkgbWV0aG9kCiAvLyAgICAgICAgICAgIFtdIG9wZXJhdG9yIGZvciBzZXR0aW5nIGVsZW1lbnQKIC8vIHRoZSB2ZWN0b3IgZWxlbWVudCBhcmUgaW50IGNvbXBhdGlibGUuCi10ZW1wbGF0ZTxjbGFzcyBWZWN0b3I+Ci12b2lkIHNpemVfbG9nKGNvbnN0IGludCBuYl9wb2ludCwgY29uc3QgaW50IHNpemVfbWluLCBjb25zdCBpbnQgc2l6ZV9tYXgsIFZlY3RvciAmIFgpCi17Cit0ZW1wbGF0ZSA8Y2xhc3MgVmVjdG9yPgordm9pZCBzaXplX2xvZyhjb25zdCBpbnQgbmJfcG9pbnQsIGNvbnN0IGludCBzaXplX21pbiwgY29uc3QgaW50IHNpemVfbWF4LCBWZWN0b3ImIFgpIHsKICAgWC5yZXNpemUobmJfcG9pbnQpOwogCi0gIGZsb2F0IGxzX21pbj1sb2coZmxvYXQoc2l6ZV9taW4pKTsKLSAgZmxvYXQgbHNfbWF4PWxvZyhmbG9hdChzaXplX21heCkpOworICBmbG9hdCBsc19taW4gPSBsb2coZmxvYXQoc2l6ZV9taW4pKTsKKyAgZmxvYXQgbHNfbWF4ID0gbG9nKGZsb2F0KHNpemVfbWF4KSk7CiAKLSAgZmxvYXQgbHM9MC4wOworICBmbG9hdCBscyA9IDAuMDsKIAotICBmbG9hdCBkZWx0YV9scz0obHNfbWF4LWxzX21pbikvKGZsb2F0KG5iX3BvaW50LTEpKTsKKyAgZmxvYXQgZGVsdGFfbHMgPSAobHNfbWF4IC0gbHNfbWluKSAvIChmbG9hdChuYl9wb2ludCAtIDEpKTsKIAotICBpbnQgc2l6ZT0wOworICBpbnQgc2l6ZSA9IDA7CiAKLSAgZm9yIChpbnQgaT0wO2k8bmJfcG9pbnQ7aSsrKXsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYl9wb2ludDsgaSsrKSB7CisgICAgbHMgPSBsc19taW4gKyBmbG9hdChpKSAqIGRlbHRhX2xzOwogCi0gICAgbHMgPSBsc19taW4gKyBmbG9hdChpKSpkZWx0YV9scyA7Ci0gICAgCi0gICAgc2l6ZT1pbnQoZXhwKGxzKSk7IAorICAgIHNpemUgPSBpbnQoZXhwKGxzKSk7CiAKLSAgICBYW2ldPXNpemU7CisgICAgWFtpXSA9IHNpemU7CiAgIH0KLQogfQogCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdXRpbHMvdXRpbGl0aWVzLmggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy91dGlsaXRpZXMuaAppbmRleCBkMjMzMGQwLi4zNTJkNjFhIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy91dGlsaXRpZXMuaAorKysgYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy91dGlsaXRpZXMuaApAQCAtOSw4MiArOSwxMjAgQEAKIAogLyogLS0tICBEZWZpbml0aW9uIG1hY3JvcyBmaWxlIHRvIHByaW50IGluZm9ybWF0aW9uIGlmIF9ERUJVR18gaXMgZGVmaW5lZCAtLS0gKi8KIAotIyBpZm5kZWYgVVRJTElUSUVTX0gKLSMgZGVmaW5lIFVUSUxJVElFU19ICisjaWZuZGVmIFVUSUxJVElFU19ICisjZGVmaW5lIFVUSUxJVElFU19ICiAKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0vLyMgaW5jbHVkZSA8aW9zdHJlYW0+IG9rIGZvciBnY2MzLjAxCi0jIGluY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorLy8gIyBpbmNsdWRlIDxpb3N0cmVhbT4gb2sgZm9yIGdjYzMuMDEKKyNpbmNsdWRlIDxpb3N0cmVhbT4KIAogLyogLS0tICBJTkZPUyBpcyBhbHdheXMgZGVmaW5lZCAod2l0aG91dCBfREVCVUdfKTogdG8gYmUgdXNlZCBmb3Igd2FybmluZ3MsIHdpdGggcmVsZWFzZSB2ZXJzaW9uIC0tLSAqLwogCi0jIGRlZmluZSBIRVJFV0VBUkUgY291dDw8Zmx1c2ggOyBjZXJyIDw8IF9fRklMRV9fIDw8ICIgWyIgPDwgX19MSU5FX18gPDwgIl0gOiAiIDw8IGZsdXNoIDsKLSMgZGVmaW5lIElORk9TKGNoYWluKSB7SEVSRVdFQVJFIDsgY2VyciA8PCBjaGFpbiA8PCBlbmRsIDt9Ci0jIGRlZmluZSBQWVNDUklQVChjaGFpbikge2NvdXQ8PGZsdXNoIDsgY2VyciA8PCAiLS0tUFlTQ1JJUFQtLS0gIiA8PCBjaGFpbiA8PCBlbmRsIDt9CisjZGVmaW5lIEhFUkVXRUFSRSBcCisgIGNvdXQgPDwgZmx1c2g7ICBcCisgIGNlcnIgPDwgX19GSUxFX18gPDwgIiBbIiA8PCBfX0xJTkVfXyA8PCAiXSA6ICIgPDwgZmx1c2g7CisjZGVmaW5lIElORk9TKGNoYWluKSAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEVSRVdFQVJFOyAgICAgICAgICAgICBcCisgICAgY2VyciA8PCBjaGFpbiA8PCBlbmRsOyBcCisgIH0KKyNkZWZpbmUgUFlTQ1JJUFQoY2hhaW4pICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb3V0IDw8IGZsdXNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjZXJyIDw8ICItLS1QWVNDUklQVC0tLSAiIDw8IGNoYWluIDw8IGVuZGw7IFwKKyAgfQogCiAvKiAtLS0gVG8gcHJpbnQgZGF0ZSBhbmQgdGltZSBvZiBjb21waWxhdGlvbiBvZiBjdXJyZW50IHNvdXJjZSBvbiBzdGRvdXQgLS0tICovCiAKLSMgaWYgZGVmaW5lZCAoIF9fR05VQ19fICkKLSMgZGVmaW5lIENPTVBJTEVSCQkiZysrIiA7Ci0jIGVsaWYgZGVmaW5lZCAoIF9fc3VuICkKLSMgZGVmaW5lIENPTVBJTEVSCQkiQ0MiIDsKLSMgZWxpZiBkZWZpbmVkICggX19LQ0MgKQotIyBkZWZpbmUgQ09NUElMRVIJCSJLQ0MiIDsKLSMgZWxpZiBkZWZpbmVkICggX19QR0kgKQotIyBkZWZpbmUgQ09NUElMRVIJCSJwZ0NDIiA7Ci0jIGVsc2UKLSMgZGVmaW5lIENPTVBJTEVSCQkidW5kZWZpbmVkIiA7Ci0jIGVuZGlmCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgQ09NUElMRVIgImcrKyI7CisjZWxpZiBkZWZpbmVkKF9fc3VuKQorI2RlZmluZSBDT01QSUxFUiAiQ0MiOworI2VsaWYgZGVmaW5lZChfX0tDQykKKyNkZWZpbmUgQ09NUElMRVIgIktDQyI7CisjZWxpZiBkZWZpbmVkKF9fUEdJKQorI2RlZmluZSBDT01QSUxFUiAicGdDQyI7CisjZWxzZQorI2RlZmluZSBDT01QSUxFUiAidW5kZWZpbmVkIjsKKyNlbmRpZgogCi0jIGlmZGVmIElORk9TX0NPTVBJTEFUSU9OCi0jIGVycm9yIElORk9TX0NPTVBJTEFUSU9OIGFscmVhZHkgZGVmaW5lZAotIyBlbmRpZgotIyBkZWZpbmUgSU5GT1NfQ09NUElMQVRJT04Je1wKLQkJCQkJY2VyciA8PCBmbHVzaDtcCi0JCQkJCWNvdXQgPDwgX19GSUxFX18gO1wKLQkJCQkJY291dCA8PCAiIFsiIDw8IF9fTElORV9fIDw8ICJdIDogIiA7XAotCQkJCQljb3V0IDw8ICJDT01QSUxFRCB3aXRoICIgPDwgQ09NUElMRVIgO1wKLQkJCQkJY291dCA8PCAiLCAiIDw8IF9fREFURV9fIDsgXAotCQkJCQljb3V0IDw8ICIgYXQgIiA8PCBfX1RJTUVfXyA8PCBlbmRsIDtcCi0JCQkJCWNvdXQgPDwgIlxuXG4iIDtcCi0JCQkJCWNvdXQgPDwgZmx1c2ggO1wKLQkJCQl9CisjaWZkZWYgSU5GT1NfQ09NUElMQVRJT04KKyNlcnJvciBJTkZPU19DT01QSUxBVElPTiBhbHJlYWR5IGRlZmluZWQKKyNlbmRpZgorI2RlZmluZSBJTkZPU19DT01QSUxBVElPTiAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNlcnIgPDwgZmx1c2g7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvdXQgPDwgX19GSUxFX187ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvdXQgPDwgIiBbIiA8PCBfX0xJTkVfXyA8PCAiXSA6ICI7ICAgXAorICAgIGNvdXQgPDwgIkNPTVBJTEVEIHdpdGggIiA8PCBDT01QSUxFUjsgXAorICAgIGNvdXQgPDwgIiwgIiA8PCBfX0RBVEVfXzsgICAgICAgICAgICAgXAorICAgIGNvdXQgPDwgIiBhdCAiIDw8IF9fVElNRV9fIDw8IGVuZGw7ICAgXAorICAgIGNvdXQgPDwgIlxuXG4iOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvdXQgPDwgZmx1c2g7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKLSMgaWZkZWYgX0RFQlVHXworI2lmZGVmIF9ERUJVR18KIAogLyogLS0tIHRoZSBmb2xsb3dpbmcgTUFDUk9TIGFyZSB1c2VmdWwgYXQgZGVidWcgdGltZSAtLS0gKi8KIAotIyBkZWZpbmUgSEVSRSBjb3V0PDxmbHVzaCA7IGNlcnIgPDwgIi0gVHJhY2UgIiA8PCBfX0ZJTEVfXyA8PCAiIFsiIDw8IF9fTElORV9fIDw8ICJdIDogIiA8PCBmbHVzaCA7Ci0jIGRlZmluZSBTQ1JVVEUodmFyKSBIRVJFIDsgY2VyciA8PCAjdmFyIDw8ICI9IiA8PCB2YXIgPDwgZW5kbCA7Ci0jIGRlZmluZSBNRVNTQUdFKGNoYWluKSB7SEVSRSA7IGNlcnIgPDwgY2hhaW4gPDwgZW5kbCA7fQotIyBkZWZpbmUgSU5URVJSVVBUSU9OKGNvZGUpIEhFUkUgOyBjZXJyIDw8ICJJTlRFUlJVUFRJT04gcmV0dXJuIGNvZGU9ICIgPDwgY29kZSA8PCBlbmRsIDsgZXhpdChjb2RlKSA7CisjZGVmaW5lIEhFUkUgICAgIFwKKyAgY291dCA8PCBmbHVzaDsgXAorICBjZXJyIDw8ICItIFRyYWNlICIgPDwgX19GSUxFX18gPDwgIiBbIiA8PCBfX0xJTkVfXyA8PCAiXSA6ICIgPDwgZmx1c2g7CisjZGVmaW5lIFNDUlVURSh2YXIpIFwKKyAgSEVSRTsgICAgICAgICAgICAgXAorICBjZXJyIDw8ICN2YXIgPDwgIj0iIDw8IHZhciA8PCBlbmRsOworI2RlZmluZSBNRVNTQUdFKGNoYWluKSAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhFUkU7ICAgICAgICAgICAgICAgICAgXAorICAgIGNlcnIgPDwgY2hhaW4gPDwgZW5kbDsgXAorICB9CisjZGVmaW5lIElOVEVSUlVQVElPTihjb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEVSRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjZXJyIDw8ICJJTlRFUlJVUFRJT04gcmV0dXJuIGNvZGU9ICIgPDwgY29kZSA8PCBlbmRsOyBcCisgIGV4aXQoY29kZSk7CiAKLSMgaWZuZGVmIEFTU0VSVAotIyBkZWZpbmUgQVNTRVJUKGNvbmRpdGlvbikgaWYgKCEoY29uZGl0aW9uKSl7IEhFUkUgOyBjZXJyIDw8ICJDT05ESVRJT04gIiA8PCAjY29uZGl0aW9uIDw8ICIgTk9UIFZFUklGSUVEIjw8IGVuZGwgOyBJTlRFUlJVUFRJT04oMSkgO30KLSMgZW5kaWYgLyogQVNTRVJUICovCisjaWZuZGVmIEFTU0VSVAorI2RlZmluZSBBU1NFUlQoY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEoY29uZGl0aW9uKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEVSRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNlcnIgPDwgIkNPTkRJVElPTiAiIDw8ICNjb25kaXRpb24gPDwgIiBOT1QgVkVSSUZJRUQiIDw8IGVuZGw7IFwKKyAgICBJTlRFUlJVUFRJT04oMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbmRpZiAvKiBBU1NFUlQgKi8KIAotI2RlZmluZSBSRVBFUkUgY291dDw8Zmx1c2ggOyBjZXJyIDw8ICIgICAtLS0tLS0tLS0tLS0tLSIgPDwgZW5kbCA8PCBmbHVzaCA7Ci0jZGVmaW5lIEJFR0lOX09GKGNoYWluKSB7UkVQRVJFIDsgSEVSRSA7IGNlcnIgPDwgIkJlZ2luIG9mOiAiIDw8IGNoYWluIDw8IGVuZGwgOyBSRVBFUkUgOyB9Ci0jZGVmaW5lIEVORF9PRihjaGFpbikge1JFUEVSRSA7IEhFUkUgOyBjZXJyIDw8ICJOb3JtYWwgZW5kIG9mOiAiIDw8IGNoYWluIDw8IGVuZGwgOyBSRVBFUkUgOyB9CisjZGVmaW5lIFJFUEVSRSAgIFwKKyAgY291dCA8PCBmbHVzaDsgXAorICBjZXJyIDw8ICIgICAtLS0tLS0tLS0tLS0tLSIgPDwgZW5kbCA8PCBmbHVzaDsKKyNkZWZpbmUgQkVHSU5fT0YoY2hhaW4pICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJFUEVSRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIRVJFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2VyciA8PCAiQmVnaW4gb2Y6ICIgPDwgY2hhaW4gPDwgZW5kbDsgXAorICAgIFJFUEVSRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBFTkRfT0YoY2hhaW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJFUEVSRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEhFUkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNlcnIgPDwgIk5vcm1hbCBlbmQgb2Y6ICIgPDwgY2hhaW4gPDwgZW5kbDsgXAorICAgIFJFUEVSRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKKyNlbHNlIC8qIGlmZGVmIF9ERUJVR18qLwogCisjZGVmaW5lIEhFUkUKKyNkZWZpbmUgU0NSVVRFKHZhcikKKyNkZWZpbmUgTUVTU0FHRShjaGFpbikKKyNkZWZpbmUgSU5URVJSVVBUSU9OKGNvZGUpCiAKLSMgZWxzZSAvKiBpZmRlZiBfREVCVUdfKi8KLQotIyBkZWZpbmUgSEVSRQotIyBkZWZpbmUgU0NSVVRFKHZhcikKLSMgZGVmaW5lIE1FU1NBR0UoY2hhaW4pCi0jIGRlZmluZSBJTlRFUlJVUFRJT04oY29kZSkKLQotIyBpZm5kZWYgQVNTRVJUCi0jIGRlZmluZSBBU1NFUlQoY29uZGl0aW9uKQotIyBlbmRpZiAvKiBBU1NFUlQgKi8KKyNpZm5kZWYgQVNTRVJUCisjZGVmaW5lIEFTU0VSVChjb25kaXRpb24pCisjZW5kaWYgLyogQVNTRVJUICovCiAKICNkZWZpbmUgUkVQRVJFCiAjZGVmaW5lIEJFR0lOX09GKGNoYWluKQogI2RlZmluZSBFTkRfT0YoY2hhaW4pCiAKKyNlbmRpZiAvKiBpZmRlZiBfREVCVUdfKi8KIAotIyBlbmRpZiAvKiBpZmRlZiBfREVCVUdfKi8KLQotIyBlbmRpZiAvKiBpZm5kZWYgVVRJTElUSUVTX0ggKi8KKyNlbmRpZiAvKiBpZm5kZWYgVVRJTElUSUVTX0ggKi8KZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3V0aWxzL3h5X2ZpbGUuaGggYi9iZW5jaC9idGwvZ2VuZXJpY19iZW5jaC91dGlscy94eV9maWxlLmhoCmluZGV4IDA0OTJmYWYuLmUzNGUzMDIgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9nZW5lcmljX2JlbmNoL3V0aWxzL3h5X2ZpbGUuaGgKKysrIGIvYmVuY2gvYnRsL2dlbmVyaWNfYmVuY2gvdXRpbHMveHlfZmlsZS5oaApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIGR1bXBfZmlsZV94X3kuaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjIwIENFU1QgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDcgKzE2LDcgQEAKIC8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0vLyAKKy8vCiAjaWZuZGVmIFhZX0ZJTEVfSEgKICNkZWZpbmUgWFlfRklMRV9ISAogI2luY2x1ZGUgPGZzdHJlYW0+CkBAIC0yNSwyNCArMjUsMjIgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi1ib29sIHJlYWRfeHlfZmlsZShjb25zdCBzdGQ6OnN0cmluZyAmIGZpbGVuYW1lLCBzdGQ6OnZlY3RvcjxpbnQ+ICYgdGFiX3NpemVzLAotICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMsIGJvb2wgcXVpZXQgPSBmYWxzZSkKLXsKK2Jvb2wgcmVhZF94eV9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgc3RkOjp2ZWN0b3I8aW50PiYgdGFiX3NpemVzLCBzdGQ6OnZlY3Rvcjxkb3VibGU+JiB0YWJfbWZsb3BzLAorICAgICAgICAgICAgICAgICAgYm9vbCBxdWlldCA9IGZhbHNlKSB7CisgIHN0ZDo6aWZzdHJlYW0gaW5wdXRfZmlsZShmaWxlbmFtZS5jX3N0cigpLCBzdGQ6Omlvczo6aW4pOwogCi0gIHN0ZDo6aWZzdHJlYW0gaW5wdXRfZmlsZSAoZmlsZW5hbWUuY19zdHIoKSxzdGQ6Omlvczo6aW4pOwotCi0gIGlmICghaW5wdXRfZmlsZSl7CisgIGlmICghaW5wdXRfZmlsZSkgewogICAgIGlmICghcXVpZXQpIHsKLSAgICAgIElORk9TKCIhISEgRXJyb3Igb3BlbmluZyAiPDxmaWxlbmFtZSk7CisgICAgICBJTkZPUygiISEhIEVycm9yIG9wZW5pbmcgIiA8PCBmaWxlbmFtZSk7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGludCBuYl9wb2ludD0wOwotICBpbnQgc2l6ZT0wOwotICBkb3VibGUgbWZsb3BzPTA7CisgIGludCBuYl9wb2ludCA9IDA7CisgIGludCBzaXplID0gMDsKKyAgZG91YmxlIG1mbG9wcyA9IDA7CiAKLSAgd2hpbGUgKGlucHV0X2ZpbGUgPj4gc2l6ZSA+PiBtZmxvcHMgKXsKKyAgd2hpbGUgKGlucHV0X2ZpbGUgPj4gc2l6ZSA+PiBtZmxvcHMpIHsKICAgICBuYl9wb2ludCsrOwogICAgIHRhYl9zaXplcy5wdXNoX2JhY2soc2l6ZSk7CiAgICAgdGFiX21mbG9wcy5wdXNoX2JhY2sobWZsb3BzKTsKQEAgLTYwLDE2ICs1OCwxNCBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi10ZW1wbGF0ZTxjbGFzcyBWZWN0b3JfQSwgY2xhc3MgVmVjdG9yX0I+Ci12b2lkIGR1bXBfeHlfZmlsZShjb25zdCBWZWN0b3JfQSAmIFgsIGNvbnN0IFZlY3Rvcl9CICYgWSwgY29uc3Qgc3RkOjpzdHJpbmcgJiBmaWxlbmFtZSl7Ci0gIAotICBvZnN0cmVhbSBvdXRmaWxlIChmaWxlbmFtZS5jX3N0cigpLGlvczo6b3V0KSA7Ci0gIGludCBzaXplPVguc2l6ZSgpOwotICAKLSAgZm9yIChpbnQgaT0wO2k8c2l6ZTtpKyspCi0gICAgb3V0ZmlsZSA8PCBYW2ldIDw8ICIgIiA8PCBZW2ldIDw8IGVuZGw7Cit0ZW1wbGF0ZSA8Y2xhc3MgVmVjdG9yX0EsIGNsYXNzIFZlY3Rvcl9CPgordm9pZCBkdW1wX3h5X2ZpbGUoY29uc3QgVmVjdG9yX0EmIFgsIGNvbnN0IFZlY3Rvcl9CJiBZLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKKyAgb2ZzdHJlYW0gb3V0ZmlsZShmaWxlbmFtZS5jX3N0cigpLCBpb3M6Om91dCk7CisgIGludCBzaXplID0gWC5zaXplKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIG91dGZpbGUgPDwgWFtpXSA8PCAiICIgPDwgWVtpXSA8PCBlbmRsOwogCiAgIG91dGZpbGUuY2xvc2UoKTsKLX0gCit9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvQkxBUy9ibGFzLmggYi9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXMuaAppbmRleCAyOGYzYTRlLi42Y2Y1NmVmIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXMuaAorKysgYi9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXMuaApAQCAtMTEsNjY0ICsxMSw1MzQgQEAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBCTEFTVUxPTkc7CiAjZW5kaWYKIAotaW50ICAgIEJMQVNGVU5DKHhlcmJsYSkoY29uc3QgY2hhciAqLCBpbnQgKmluZm8sIGludCk7CitpbnQgQkxBU0ZVTkMoeGVyYmxhKShjb25zdCBjaGFyICosIGludCAqaW5mbywgaW50KTsKIAotZmxvYXQgIEJMQVNGVU5DKHNkb3QpICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWZsb2F0ICBCTEFTRlVOQyhzZHNkb3QpKGludCAqLCBmbG9hdCAgKiwgICAgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2Zsb2F0IEJMQVNGVU5DKHNkb3QpKGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworZmxvYXQgQkxBU0ZVTkMoc2RzZG90KShpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKIAotZG91YmxlIEJMQVNGVU5DKGRzZG90KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWRvdWJsZSBCTEFTRlVOQyhkZG90KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1kb3VibGUgQkxBU0ZVTkMocWRvdCkgIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRzZG90KShpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkZG90KShpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFkb3QpKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKICNpZiBkZWZpbmVkKEZfSU5URVJGQUNFX0dGT1JUKSAmJiAhZGVmaW5lZChfXzY0QklUX18pCi1pbnQgICBCTEFTRlVOQyhjZG90dSkgIChpbnQgKiwgZmxvYXQgICogLCBpbnQgKiwgZmxvYXQgICosICBpbnQgKik7Ci1pbnQgICBCTEFTRlVOQyhjZG90YykgIChpbnQgKiwgZmxvYXQgICosICBpbnQgKiwgZmxvYXQgICosICBpbnQgKik7Ci12b2lkICBCTEFTRlVOQyh6ZG90dSkgIChkb3VibGUgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICopOwotdm9pZCAgQkxBU0ZVTkMoemRvdGMpICAoZG91YmxlICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKLXZvaWQgIEJMQVNGVU5DKHhkb3R1KSAgKGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKik7Ci12b2lkICBCTEFTRlVOQyh4ZG90YykgIChkb3VibGUgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICopOwotI2VsaWYgIGRlZmluZWQoRl9JTlRFUkZBQ0VfRjJDKSB8fCBcCi0gICAgIGRlZmluZWQoRl9JTlRFUkZBQ0VfUEdJKSB8fCBcCi0gICAgIGRlZmluZWQoRl9JTlRFUkZBQ0VfR0ZPUlQpIHx8IFwKK2ludCBCTEFTRlVOQyhjZG90dSkoaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2RvdGMpKGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOwordm9pZCBCTEFTRlVOQyh6ZG90dSkoZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Cit2b2lkIEJMQVNGVU5DKHpkb3RjKShkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK3ZvaWQgQkxBU0ZVTkMoeGRvdHUpKGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwordm9pZCBCTEFTRlVOQyh4ZG90YykoZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CisjZWxpZiBkZWZpbmVkKEZfSU5URVJGQUNFX0YyQykgfHwgZGVmaW5lZChGX0lOVEVSRkFDRV9QR0kpIHx8IGRlZmluZWQoRl9JTlRFUkZBQ0VfR0ZPUlQpIHx8IFwKICAgICAoZGVmaW5lZChGX0lOVEVSRkFDRV9QQVRIU0NBTEUpICYmIGRlZmluZWQoX182NEJJVF9fKSkKLXZvaWQgIEJMQVNGVU5DKGNkb3R1KSAgKGZsb2F0ICosICBpbnQgKiwgZmxvYXQgICogLCBpbnQgKiwgZmxvYXQgICosICBpbnQgKik7Ci12b2lkICBCTEFTRlVOQyhjZG90YykgIChmbG9hdCAqLCAgaW50ICosIGZsb2F0ICAqLCAgaW50ICosIGZsb2F0ICAqLCAgaW50ICopOwotdm9pZCAgQkxBU0ZVTkMoemRvdHUpICAoZG91YmxlICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKLXZvaWQgIEJMQVNGVU5DKHpkb3RjKSAgKGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKik7Ci12b2lkICBCTEFTRlVOQyh4ZG90dSkgIChkb3VibGUgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICopOwotdm9pZCAgQkxBU0ZVTkMoeGRvdGMpICAoZG91YmxlICosIGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKK3ZvaWQgQkxBU0ZVTkMoY2RvdHUpKGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOwordm9pZCBCTEFTRlVOQyhjZG90YykoZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7Cit2b2lkIEJMQVNGVU5DKHpkb3R1KShkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK3ZvaWQgQkxBU0ZVTkMoemRvdGMpKGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwordm9pZCBCTEFTRlVOQyh4ZG90dSkoZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Cit2b2lkIEJMQVNGVU5DKHhkb3RjKShkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKICNlbHNlCi1zdGQ6OmNvbXBsZXg8ZmxvYXQ+ICAgQkxBU0ZVTkMoY2RvdHUpICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLXN0ZDo6Y29tcGxleDxmbG9hdD4gICBCTEFTRlVOQyhjZG90YykgIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotc3RkOjpjb21wbGV4PGRvdWJsZT4gIEJMQVNGVU5DKHpkb3R1KSAgKGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKLXN0ZDo6Y29tcGxleDxkb3VibGU+ICBCTEFTRlVOQyh6ZG90YykgIChpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKik7Ci1kb3VibGUgIEJMQVNGVU5DKHhkb3R1KSAgKGludCAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqKTsKLWRvdWJsZSAgQkxBU0ZVTkMoeGRvdGMpICAoaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICopOworc3RkOjpjb21wbGV4PGZsb2F0PiBCTEFTRlVOQyhjZG90dSkoaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitzdGQ6OmNvbXBsZXg8ZmxvYXQ+IEJMQVNGVU5DKGNkb3RjKShpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK3N0ZDo6Y29tcGxleDxkb3VibGU+IEJMQVNGVU5DKHpkb3R1KShpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworc3RkOjpjb21wbGV4PGRvdWJsZT4gQkxBU0ZVTkMoemRvdGMpKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoeGRvdHUpKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoeGRvdGMpKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAjZW5kaWYKIAotaW50ICBCTEFTRlVOQyhjZG90dXcpICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCopOwotaW50ICBCTEFTRlVOQyhjZG90Y3cpICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCopOwotaW50ICBCTEFTRlVOQyh6ZG90dXcpICAoaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSopOwotaW50ICBCTEFTRlVOQyh6ZG90Y3cpICAoaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSopOworaW50IEJMQVNGVU5DKGNkb3R1dykoaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKik7CitpbnQgQkxBU0ZVTkMoY2RvdGN3KShpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyh6ZG90dXcpKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKHpkb3RjdykoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CiAKLWludCAgICBCTEFTRlVOQyhzYXhweSkgKGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGRheHB5KSAoaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMocWF4cHkpIChpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhjYXhweSkgKGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKHpheHB5KSAoaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoeGF4cHkpIChpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhjYXhweWMpKGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKHpheHB5YykoaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoeGF4cHljKShpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzYXhweSkoaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGF4cHkpKGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFheHB5KShpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjYXhweSkoaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemF4cHkpKGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhheHB5KShpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjYXhweWMpKGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpheHB5YykoaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGF4cHljKShpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50ICAgIEJMQVNGVU5DKHNjb3B5KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhkY29weSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMocWNvcHkpIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGNjb3B5KSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyh6Y29weSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoeGNvcHkpIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNjb3B5KShpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkY29weSkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxY29weSkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjY29weSkoaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemNvcHkpKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGNvcHkpKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCAgICBCTEFTRlVOQyhzc3dhcCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoZHN3YXApIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKHFzd2FwKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhjc3dhcCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoenN3YXApIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKHhzd2FwKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzc3dhcCkoaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHN3YXApKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN3YXApKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N3YXApKGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzd2FwKShpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhzd2FwKShpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1mbG9hdCAgQkxBU0ZVTkMoc2FzdW0pIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWZsb2F0ICBCTEFTRlVOQyhzY2FzdW0pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKGRhc3VtKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1kb3VibGUgQkxBU0ZVTkMocWFzdW0pIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2Zsb2F0IEJMQVNGVU5DKHNhc3VtKShpbnQgKiwgZmxvYXQgKiwgaW50ICopOworZmxvYXQgQkxBU0ZVTkMoc2Nhc3VtKShpbnQgKiwgZmxvYXQgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRhc3VtKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxYXN1bSkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiBkb3VibGUgQkxBU0ZVTkMoZHphc3VtKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKIGRvdWJsZSBCTEFTRlVOQyhxeGFzdW0pKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgICAgQkxBU0ZVTkMoaXNhbWF4KShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhpZGFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGlxYW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoaWNhbWF4KShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhpemFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGl4YW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaXNhbWF4KShpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGlkYW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaXFhbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpY2FtYXgpKGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaXphbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpeGFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgICAgQkxBU0ZVTkMoaXNtYXgpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhpZG1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGlxbWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoaWNtYXgpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhpem1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGl4bWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaXNtYXgpKGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaWRtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGlxbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpY21heCkoaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpem1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaXhtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgICAgQkxBU0ZVTkMoaXNhbWluKShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhpZGFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGlxYW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoaWNhbWluKShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhpemFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGl4YW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaXNhbWluKShpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGlkYW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaXFhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpY2FtaW4pKGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaXphbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpeGFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgICAgQkxBU0ZVTkMoaXNtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGlkbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhpcW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoaWNtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGl6bWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhpeG1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaXNtaW4pKGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaWRtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGlxbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpY21pbikoaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpem1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaXhtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1mbG9hdCAgQkxBU0ZVTkMoc2FtYXgpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWRvdWJsZSBCTEFTRlVOQyhkYW1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKHFhbWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1mbG9hdCAgQkxBU0ZVTkMoc2NhbWF4KShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2Zsb2F0IEJMQVNGVU5DKHNhbWF4KShpbnQgKiwgZmxvYXQgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRhbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxYW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitmbG9hdCBCTEFTRlVOQyhzY2FtYXgpKGludCAqLCBmbG9hdCAqLCBpbnQgKik7CiBkb3VibGUgQkxBU0ZVTkMoZHphbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKIGRvdWJsZSBCTEFTRlVOQyhxeGFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1mbG9hdCAgQkxBU0ZVTkMoc2FtaW4pIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWRvdWJsZSBCTEFTRlVOQyhkYW1pbikgKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKHFhbWluKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1mbG9hdCAgQkxBU0ZVTkMoc2NhbWluKShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2Zsb2F0IEJMQVNGVU5DKHNhbWluKShpbnQgKiwgZmxvYXQgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxYW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitmbG9hdCBCTEFTRlVOQyhzY2FtaW4pKGludCAqLCBmbG9hdCAqLCBpbnQgKik7CiBkb3VibGUgQkxBU0ZVTkMoZHphbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKIGRvdWJsZSBCTEFTRlVOQyhxeGFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1mbG9hdCAgQkxBU0ZVTkMoc21heCkgIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWRvdWJsZSBCTEFTRlVOQyhkbWF4KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKHFtYXgpICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1mbG9hdCAgQkxBU0ZVTkMoc2NtYXgpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWRvdWJsZSBCTEFTRlVOQyhkem1heCkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKHF4bWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitmbG9hdCBCTEFTRlVOQyhzbWF4KShpbnQgKiwgZmxvYXQgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZmxvYXQgQkxBU0ZVTkMoc2NtYXgpKGludCAqLCBmbG9hdCAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZHptYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHF4bWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKIAotZmxvYXQgIEJMQVNGVU5DKHNtaW4pICAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1kb3VibGUgQkxBU0ZVTkMoZG1pbikgIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWRvdWJsZSBCTEFTRlVOQyhxbWluKSAgKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotZmxvYXQgIEJMQVNGVU5DKHNjbWluKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1kb3VibGUgQkxBU0ZVTkMoZHptaW4pIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWRvdWJsZSBCTEFTRlVOQyhxeG1pbikgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZmxvYXQgQkxBU0ZVTkMoc21pbikoaW50ICosIGZsb2F0ICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2Zsb2F0IEJMQVNGVU5DKHNjbWluKShpbnQgKiwgZmxvYXQgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGR6bWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxeG1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCAgICBCTEFTRlVOQyhzc2NhbCkgKGludCAqLCAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoZHNjYWwpIChpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKHFzY2FsKSAoaW50ICosICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhjc2NhbCkgKGludCAqLCAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoenNjYWwpIChpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKHhzY2FsKSAoaW50ICosICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhjc3NjYWwpKGludCAqLCAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoemRzY2FsKShpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKHhxc2NhbCkoaW50ICosICBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzc2NhbCkoaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc2NhbCkoaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFzY2FsKShpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3NjYWwpKGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenNjYWwpKGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4c2NhbCkoaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzc2NhbCkoaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6ZHNjYWwpKGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4cXNjYWwpKGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKIAotZmxvYXQgIEJMQVNGVU5DKHNucm0yKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1mbG9hdCAgQkxBU0ZVTkMoc2Nucm0yKShpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2Zsb2F0IEJMQVNGVU5DKHNucm0yKShpbnQgKiwgZmxvYXQgKiwgaW50ICopOworZmxvYXQgQkxBU0ZVTkMoc2Nucm0yKShpbnQgKiwgZmxvYXQgKiwgaW50ICopOwogCi1kb3VibGUgQkxBU0ZVTkMoZG5ybTIpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWRvdWJsZSBCTEFTRlVOQyhxbnJtMikgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRucm0yKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxbnJtMikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiBkb3VibGUgQkxBU0ZVTkMoZHpucm0yKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKIGRvdWJsZSBCTEFTRlVOQyhxeG5ybTIpKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgICAgQkxBU0ZVTkMoc3JvdCkgIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKik7Ci1pbnQgICAgQkxBU0ZVTkMoZHJvdCkgIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKik7Ci1pbnQgICAgQkxBU0ZVTkMocXJvdCkgIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKik7Ci1pbnQgICAgQkxBU0ZVTkMoY3Nyb3QpIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKik7Ci1pbnQgICAgQkxBU0ZVTkMoemRyb3QpIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKik7Ci1pbnQgICAgQkxBU0ZVTkMoeHFyb3QpIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoc3JvdCkoaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKik7CitpbnQgQkxBU0ZVTkMoZHJvdCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKHFyb3QpKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhjc3JvdCkoaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKik7CitpbnQgQkxBU0ZVTkMoemRyb3QpKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyh4cXJvdCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICopOwogCi1pbnQgICAgQkxBU0ZVTkMoc3JvdGcpIChmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKik7Ci1pbnQgICAgQkxBU0ZVTkMoZHJvdGcpIChkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7Ci1pbnQgICAgQkxBU0ZVTkMocXJvdGcpIChkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7Ci1pbnQgICAgQkxBU0ZVTkMoY3JvdGcpIChmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKik7Ci1pbnQgICAgQkxBU0ZVTkMoenJvdGcpIChkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7Ci1pbnQgICAgQkxBU0ZVTkMoeHJvdGcpIChkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoc3JvdGcpKGZsb2F0ICosIGZsb2F0ICosIGZsb2F0ICosIGZsb2F0ICopOworaW50IEJMQVNGVU5DKGRyb3RnKShkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMocXJvdGcpKGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhjcm90ZykoZmxvYXQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgZmxvYXQgKik7CitpbnQgQkxBU0ZVTkMoenJvdGcpKGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyh4cm90ZykoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOwogCi1pbnQgICAgQkxBU0ZVTkMoc3JvdG1nKShmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgZmxvYXQgICopOwotaW50ICAgIEJMQVNGVU5DKGRyb3RtZykoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhzcm90bWcpKGZsb2F0ICosIGZsb2F0ICosIGZsb2F0ICosIGZsb2F0ICosIGZsb2F0ICopOworaW50IEJMQVNGVU5DKGRyb3RtZykoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKIAotaW50ICAgIEJMQVNGVU5DKHNyb3RtKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKik7Ci1pbnQgICAgQkxBU0ZVTkMoZHJvdG0pIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKLWludCAgICBCTEFTRlVOQyhxcm90bSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKHNyb3RtKShpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyhkcm90bSkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMocXJvdG0pKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOwogCiAvKiBMZXZlbCAyIHJvdXRpbmVzICovCiAKLWludCBCTEFTRlVOQyhzZ2VyKShpbnQgKiwgICAgaW50ICosIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwKLQkJICAgZmxvYXQgKiwgIGludCAqLCBmbG9hdCAqLCAgaW50ICopOwotaW50IEJMQVNGVU5DKGRnZXIpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHFnZXIpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNnZXJ1KShpbnQgKiwgICAgaW50ICosIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwKLQkJICAgIGZsb2F0ICosICBpbnQgKiwgZmxvYXQgKiwgIGludCAqKTsKLWludCBCTEFTRlVOQyhjZ2VyYykoaW50ICosICAgIGludCAqLCBmbG9hdCAqLCAgZmxvYXQgKiwgaW50ICosCi0JCSAgICBmbG9hdCAqLCAgaW50ICosIGZsb2F0ICosICBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemdlcnUpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6Z2VyYykoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhnZXJ1KShpbnQgKiwgICAgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeGdlcmMpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzZ2VyKShpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZXIpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZXIpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXJ1KShpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXJjKShpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZXJ1KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VyYykoaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlcnUpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZXJjKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNnZW12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZGdlbXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhxZ2VtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNnZW12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemdlbXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4Z2VtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNnZW12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZW12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2VtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZW12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2VtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzdHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosCi0JCSAgICAgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkdHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICAgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhxdHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICAgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjdHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosCi0JCSAgICAgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6dHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICAgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4dHJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzdHJzdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRyc3YpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRyc3YpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3Ryc3YpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0cnN2KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0cnN2KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc3Rwc3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZHRwc3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMocXRwc3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3Rwc3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoenRwc3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeHRwc3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3Rwc3YpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRwc3YpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHBzdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0cHN2KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0cHN2KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRwc3YpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHN0cm12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgICBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGR0cm12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgICBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHF0cm12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgICBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGN0cm12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgICBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHp0cm12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgICBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHh0cm12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHN0cm12KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHJtdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJtdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHJtdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRybXYpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRybXYpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzdHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkdHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhxdHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjdHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6dHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4dHBtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzdHBtdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHBtdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0cG12KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RwbXYpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRwbXYpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHBtdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc3RibXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkdGJtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHF0Ym12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3RibXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6dGJtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHh0Ym12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3RibXYpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdGJtdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRibXYpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0Ym12KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRibXYpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0Ym12KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHN0YnN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZHRic3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhxdGJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGN0YnN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoenRic3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4dGJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHN0YnN2KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRic3YpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0YnN2KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdGJzdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0YnN2KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dGJzdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzc3ltdikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAqLCBpbnQgKiwKLQkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkc3ltdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHFzeW12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3N5bXYpIChjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgKiwgaW50ICosCi0JCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoenN5bXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4c3ltdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNzeW12KShjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3ltdikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxc3ltdikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3ltdikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5bXYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5bXYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzc3BtdikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAqLAotCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGRzcG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKLQkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhxc3BtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCi0JCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3NwbXYpIChjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgKiwKLQkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6c3BtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCi0JCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeHNwbXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLAotCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNzcG12KShjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzcG12KShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXNwbXYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3BtdikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3BtdikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhzcG12KShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzc3lyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosCi0JCSAgICBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGRzeXIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMocXN5cikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjc3lyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosCi0JCSAgICBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpzeXIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeHN5cikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzc3lyKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzeXIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5cikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3lyKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzeXIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNzeXIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAotCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGRzeXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHFzeXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNzeXIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAotCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpzeXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhzeXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNzeXIyKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3lyMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFzeXIyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5cjIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpzeXIyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNzcHIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgIGZsb2F0ICAqKTsKLWludCBCTEFTRlVOQyhkc3ByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKik7Ci1pbnQgQkxBU0ZVTkMocXNwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICopOwotaW50IEJMQVNGVU5DKGNzcHIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgIGZsb2F0ICAqKTsKLWludCBCTEFTRlVOQyh6c3ByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKik7Ci1pbnQgQkxBU0ZVTkMoeHNwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICopOworaW50IEJMQVNGVU5DKHNzcHIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyhkc3ByKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMocXNwcikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKGNzcHIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyh6c3ByKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoeHNwcikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOwogCi1pbnQgQkxBU0ZVTkMoc3NwcjIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosCi0JCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKLWludCBCTEFTRlVOQyhkc3ByMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKLQkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOwotaW50IEJMQVNGVU5DKHFzcHIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7Ci1pbnQgQkxBU0ZVTkMoY3NwcjIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosCi0JCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKLWludCBCTEFTRlVOQyh6c3ByMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKLQkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOwotaW50IEJMQVNGVU5DKHhzcHIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoc3NwcjIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKik7CitpbnQgQkxBU0ZVTkMoZHNwcjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKHFzcHIyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhjc3ByMikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyh6c3ByMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoeHNwcjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOwogCi1pbnQgQkxBU0ZVTkMoY2hlcikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwgZmxvYXQgICosIGludCAqLAotCQkgICAgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6aGVyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhoZXIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2hlcikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhjaHByKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKLWludCBCTEFTRlVOQyh6aHByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKLWludCBCTEFTRlVOQyh4aHByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhjaHByKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKik7CitpbnQgQkxBU0ZVTkMoemhwcikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKHhocHIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKIAotaW50IEJMQVNGVU5DKGNoZXIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAotCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpoZXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhoZXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNoZXIyKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXIyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhjaHByMikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwKLQkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICopOwotaW50IEJMQVNGVU5DKHpocHIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7Ci1pbnQgQkxBU0ZVTkMoeGhwcjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCi0JCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhjaHByMikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyh6aHByMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoeGhwcjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOwogCi1pbnQgQkxBU0ZVTkMoY2hlbXYpIChjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgKiwgaW50ICosCi0JCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemhlbXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4aGVtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNoZW12KShjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVtdikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVtdikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKGNocG12KSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICosCi0JCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemhwbXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLAotCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhocG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKLQkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjaHBtdikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aHBtdikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhocG12KShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzbm9ybSkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc25vcm0pKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoZG5vcm0pKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNub3JtKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjbm9ybSkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKIGludCBCTEFTRlVOQyh6bm9ybSkoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZGdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHFnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICopOworaW50IEJMQVNGVU5DKHpnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICopOworaW50IEJMQVNGVU5DKHhnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc3NibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkc2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHFzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3NibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6c2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3NibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKGNoYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemhibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4aGJtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNoYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKIAogLyogTGV2ZWwgMyByb3V0aW5lcyAqLwogCi1pbnQgQkxBU0ZVTkMoc2dlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLAotCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkZ2VtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAotCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhxZ2VtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAotCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjZ2VtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosCi0JICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpnZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCi0JICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhnZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCi0JICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNnZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICopOworaW50IEJMQVNGVU5DKHFnZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2VtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICopOworaW50IEJMQVNGVU5DKHpnZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2VtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhjZ2VtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwKLQkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemdlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAotCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4Z2VtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCi0JICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosCisgICAgICAgICAgICAgICAgICAgICAgaW50ICopOworaW50IEJMQVNGVU5DKHpnZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAotCQkgICAgIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLAotCQkgICAgIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZGdlMm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCi0JCSAgICAgZG91YmxlICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosCi0JCSAgICAgZG91YmxlICosIGRvdWJsZSAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAotCQkgICAgIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLAotCQkgICAgIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemdlMm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCi0JCSAgICAgZG91YmxlICosIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAgKiwgaW50ICosCi0JCSAgICAgZG91YmxlICosIGRvdWJsZSAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosCisgICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlMm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosCisgICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlMm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc3Ryc20pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAotCSAgIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGR0cnNtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKLQkgICBkb3VibGUgKiwgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhxdHJzbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCi0JICAgZG91YmxlICosICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3Ryc20pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAotCSAgIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHp0cnNtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKLQkgICBkb3VibGUgKiwgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4dHJzbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCi0JICAgZG91YmxlICosICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3Ryc20pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0cnNtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJzbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3Ryc20pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHp0cnNtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHJzbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzdHJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCi0JICAgZmxvYXQgKiwgIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZHRybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAotCSAgIGRvdWJsZSAqLCAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHF0cm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKLQkgICBkb3VibGUgKiwgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjdHJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosCi0JICAgZmxvYXQgKiwgIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoenRybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAotCSAgIGRvdWJsZSAqLCAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHh0cm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKLQkgICBkb3VibGUgKiwgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzdHJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHRybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0cm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0cm1tKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNzeW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZHN5bW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhxc3ltbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNzeW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoenN5bW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4c3ltbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNzeW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3ltbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGludCAqKTsKK2ludCBCTEFTRlVOQyhxc3ltbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3ltbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5bW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5bW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhjc3ltbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoenN5bW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhzeW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3ltbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3ltbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5bW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgICAgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc3N5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCi0JICAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZHN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMocXN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3N5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCi0JICAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoenN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeHN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3N5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFzeXJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3lyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3lyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc3N5cjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCSAgIGZsb2F0ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkc3lyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHFzeXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkgICBkb3VibGUqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3N5cjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCSAgIGZsb2F0ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6c3lyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhzeXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkgICBkb3VibGUqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3N5cjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3lyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICAgaW50ICopOworaW50IEJMQVNGVU5DKHFzeXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5cjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3lyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICAgaW50ICopOworaW50IEJMQVNGVU5DKHhzeXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgICBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhjaGVtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKLQkgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpoZW1tKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeGhlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjaGVtbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhlbW0pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhjaGVtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemhlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhoZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjaGVtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgICAgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoY2hlcmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCi0JICAgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemhlcmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeGhlcmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2hlcmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlcmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKGNoZXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKLQkgICBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemhlcjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCSAgIGRvdWJsZSosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4aGVyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNoZXIybSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCSAgIGZsb2F0ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6aGVyMm0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkgICBkb3VibGUqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeGhlcjJtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNoZXIyaykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlcjJrKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgIGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVyMmspKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICAgaW50ICopOworaW50IEJMQVNGVU5DKGNoZXIybSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosCisgICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlcjJtKShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXIybSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNnZW10KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZGdlbXQpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjZ2VtdCkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCi0JCSAgICBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpnZW10KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc2dlbXQpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZW10KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2VtdCkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlbXQpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc2dlbWEpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLAotCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkZ2VtYSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNnZW1hKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwKLQkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemdlbWEpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAotCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzZ2VtYSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbWEpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlbWEpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZW1hKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc2dlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLAotCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkZ2VtcykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNnZW1zKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwKLQkJICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemdlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAotCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzZ2VtcykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZW1zKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc2dldGYyKShpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzZ2V0ZjIpKGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoZGdldGYyKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyhxZ2V0ZjIpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNnZXRmMikoaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dldGYyKShpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHpnZXRmMikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoeGdldGYyKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNnZXRyZikoaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc2dldHJmKShpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKGRnZXRyZikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMocWdldHJmKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjZ2V0cmYpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXRyZikoaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyh6Z2V0cmYpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHhnZXRyZikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzbGFzd3ApKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzbGFzd3ApKGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKGRsYXN3cCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHFsYXN3cCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNsYXN3cCkoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNsYXN3cCkoaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoemxhc3dwKShpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoeGxhc3dwKShpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzZ2V0cnMpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzZ2V0cnMpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoZGdldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMocWdldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY2dldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHpnZXRycykoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHhnZXRycykoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc2dlc3YpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkZ2VzdikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHFnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSosIGludCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY2dlc3YpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6Z2VzdikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc2dlc3YpKGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXN2KShpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VzdikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2VzdikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNwb3RmMikoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3BvdGYyKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKGRwb3RmMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMocXBvdGYyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjcG90ZjIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNwb3RmMikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyh6cG90ZjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHhwb3RmMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzcG90cmYpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNwb3RyZikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyhkcG90cmYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHFwb3RyZikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3BvdHJmKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjcG90cmYpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoenBvdHJmKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyh4cG90cmYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc2xhdXUyKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzbGF1dTIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoZGxhdXUyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyhxbGF1dTIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNsYXV1MikoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2xhdXUyKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHpsYXV1MikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoeGxhdXUyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNsYXV1bSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc2xhdXVtKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKGRsYXV1bSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMocWxhdXVtKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjbGF1dW0pKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNsYXV1bSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyh6bGF1dW0pKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHhsYXV1bSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzdHJ0aTIpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3RydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoZHRydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHF0cnRpMikoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjdHJ0aTIpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoenRydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHh0cnRpMikoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHN0cnRyaSkoY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzdHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyhkdHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMocXRydHJpKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGN0cnRyaSkoY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyh6dHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoeHRydHJpKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc3BvdHJpKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzcG90cmkpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoZHBvdHJpKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyhxcG90cmkpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNwb3RyaSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3BvdHJpKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHpwb3RyaSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoeHBvdHJpKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIApkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvQkxBUy9ibGFzX2ludGVyZmFjZS5oaCBiL2JlbmNoL2J0bC9saWJzL0JMQVMvYmxhc19pbnRlcmZhY2UuaGgKaW5kZXggNjUxMDU0Ni4uYmI3NzMwMyAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvQkxBUy9ibGFzX2ludGVyZmFjZS5oaAorKysgYi9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXNfaW50ZXJmYWNlLmhoCkBAIC0yMiwyNCArMjIsMjcgQEAKIAogI2luY2x1ZGUgPGNfaW50ZXJmYWNlX2Jhc2UuaD4KICNpbmNsdWRlIDxjb21wbGV4PgotZXh0ZXJuICJDIgoteworZXh0ZXJuICJDIiB7CiAjaW5jbHVkZSAiYmxhcy5oIgogCi0gIC8vIENob2xlc2t5IEZhY3Rvcml6YXRpb24KKy8vIENob2xlc2t5IEZhY3Rvcml6YXRpb24KIC8vICAgdm9pZCBzcG90cmZfKGNvbnN0IGNoYXIqIHVwbG8sIGNvbnN0IGludCogbiwgZmxvYXQgKmEsIGNvbnN0IGludCogbGQsIGludCogaW5mbyk7CiAvLyAgIHZvaWQgZHBvdHJmXyhjb25zdCBjaGFyKiB1cGxvLCBjb25zdCBpbnQqIG4sIGRvdWJsZSAqYSwgY29uc3QgaW50KiBsZCwgaW50KiBpbmZvKTsKLSAgdm9pZCBzc3l0cmRfKGNoYXIgKnVwbG8sIGNvbnN0IGludCAqbiwgZmxvYXQgKmEsIGNvbnN0IGludCAqbGRhLCBmbG9hdCAqZCwgZmxvYXQgKmUsIGZsb2F0ICp0YXUsIGZsb2F0ICp3b3JrLCBpbnQgKmx3b3JrLCBpbnQgKmluZm8gKTsKLSAgdm9pZCBkc3l0cmRfKGNoYXIgKnVwbG8sIGNvbnN0IGludCAqbiwgZG91YmxlICphLCBjb25zdCBpbnQgKmxkYSwgZG91YmxlICpkLCBkb3VibGUgKmUsIGRvdWJsZSAqdGF1LCBkb3VibGUgKndvcmssIGludCAqbHdvcmssIGludCAqaW5mbyApOwotICB2b2lkIHNnZWhyZF8oIGNvbnN0IGludCAqbiwgaW50ICppbG8sIGludCAqaWhpLCBmbG9hdCAqYSwgY29uc3QgaW50ICpsZGEsIGZsb2F0ICp0YXUsIGZsb2F0ICp3b3JrLCBpbnQgKmx3b3JrLCBpbnQgKmluZm8gKTsKLSAgdm9pZCBkZ2VocmRfKCBjb25zdCBpbnQgKm4sIGludCAqaWxvLCBpbnQgKmloaSwgZG91YmxlICphLCBjb25zdCBpbnQgKmxkYSwgZG91YmxlICp0YXUsIGRvdWJsZSAqd29yaywgaW50ICpsd29yaywgaW50ICppbmZvICk7Cit2b2lkIHNzeXRyZF8oY2hhciAqdXBsbywgY29uc3QgaW50ICpuLCBmbG9hdCAqYSwgY29uc3QgaW50ICpsZGEsIGZsb2F0ICpkLCBmbG9hdCAqZSwgZmxvYXQgKnRhdSwgZmxvYXQgKndvcmssCisgICAgICAgICAgICAgaW50ICpsd29yaywgaW50ICppbmZvKTsKK3ZvaWQgZHN5dHJkXyhjaGFyICp1cGxvLCBjb25zdCBpbnQgKm4sIGRvdWJsZSAqYSwgY29uc3QgaW50ICpsZGEsIGRvdWJsZSAqZCwgZG91YmxlICplLCBkb3VibGUgKnRhdSwgZG91YmxlICp3b3JrLAorICAgICAgICAgICAgIGludCAqbHdvcmssIGludCAqaW5mbyk7Cit2b2lkIHNnZWhyZF8oY29uc3QgaW50ICpuLCBpbnQgKmlsbywgaW50ICppaGksIGZsb2F0ICphLCBjb25zdCBpbnQgKmxkYSwgZmxvYXQgKnRhdSwgZmxvYXQgKndvcmssIGludCAqbHdvcmssCisgICAgICAgICAgICAgaW50ICppbmZvKTsKK3ZvaWQgZGdlaHJkXyhjb25zdCBpbnQgKm4sIGludCAqaWxvLCBpbnQgKmloaSwgZG91YmxlICphLCBjb25zdCBpbnQgKmxkYSwgZG91YmxlICp0YXUsIGRvdWJsZSAqd29yaywgaW50ICpsd29yaywKKyAgICAgICAgICAgICBpbnQgKmluZm8pOwogCi0gIC8vIExVIHJvdyBwaXZvdGluZworLy8gTFUgcm93IHBpdm90aW5nCiAvLyAgIHZvaWQgZGdldHJmXyggaW50ICptLCBpbnQgKm4sIGRvdWJsZSAqYSwgaW50ICpsZGEsIGludCAqaXBpdiwgaW50ICppbmZvICk7CiAvLyAgIHZvaWQgc2dldHJmXyhjb25zdCBpbnQqIG0sIGNvbnN0IGludCogbiwgZmxvYXQgKmEsIGNvbnN0IGludCogbGQsIGludCogaXBpdm90LCBpbnQqIGluZm8pOwotICAvLyBMVSBmdWxsIHBpdm90aW5nCi0gIHZvaWQgc2dldGMyXyhjb25zdCBpbnQqIG4sIGZsb2F0ICphLCBjb25zdCBpbnQgKmxkYSwgaW50ICppcGl2LCBpbnQgKmpwaXYsIGludCppbmZvICk7Ci0gIHZvaWQgZGdldGMyXyhjb25zdCBpbnQqIG4sIGRvdWJsZSAqYSwgY29uc3QgaW50ICpsZGEsIGludCAqaXBpdiwgaW50ICpqcGl2LCBpbnQqaW5mbyApOworLy8gTFUgZnVsbCBwaXZvdGluZwordm9pZCBzZ2V0YzJfKGNvbnN0IGludCAqbiwgZmxvYXQgKmEsIGNvbnN0IGludCAqbGRhLCBpbnQgKmlwaXYsIGludCAqanBpdiwgaW50ICppbmZvKTsKK3ZvaWQgZGdldGMyXyhjb25zdCBpbnQgKm4sIGRvdWJsZSAqYSwgY29uc3QgaW50ICpsZGEsIGludCAqaXBpdiwgaW50ICpqcGl2LCBpbnQgKmluZm8pOwogI2lmZGVmIEhBU19MQVBBQ0sKICNlbmRpZgogfQpAQCAtNDcsMTIgKzUwLDExIEBACiAjZGVmaW5lIE1BS0VfU1RSSU5HMihTKSAjUwogI2RlZmluZSBNQUtFX1NUUklORyhTKSBNQUtFX1NUUklORzIoUykKIAotI2RlZmluZSBDQVQyKEEsQikgQSMjQgotI2RlZmluZSBDQVQoQSxCKSBDQVQyKEEsQikKKyNkZWZpbmUgQ0FUMihBLCBCKSBBIyNCCisjZGVmaW5lIENBVChBLCBCKSBDQVQyKEEsIEIpCiAKLQotdGVtcGxhdGU8Y2xhc3MgcmVhbD4gY2xhc3MgYmxhc19pbnRlcmZhY2U7Ci0KK3RlbXBsYXRlIDxjbGFzcyByZWFsPgorY2xhc3MgYmxhc19pbnRlcmZhY2U7CiAKIHN0YXRpYyBjaGFyIG5vdHJhbnMgPSAnTic7CiBzdGF0aWMgY2hhciB0cmFucyA9ICdUJzsKQEAgLTYyLDIyICs2NCwxNiBAQAogc3RhdGljIGNoYXIgbGVmdCA9ICdMJzsKIHN0YXRpYyBpbnQgaW50b25lID0gMTsKIAotCi0KLSNkZWZpbmUgU0NBTEFSICAgICAgICBmbG9hdAorI2RlZmluZSBTQ0FMQVIgZmxvYXQKICNkZWZpbmUgU0NBTEFSX1BSRUZJWCBzCiAjaW5jbHVkZSAiYmxhc19pbnRlcmZhY2VfaW1wbC5oaCIKICN1bmRlZiBTQ0FMQVIKICN1bmRlZiBTQ0FMQVJfUFJFRklYCiAKLQotI2RlZmluZSBTQ0FMQVIgICAgICAgIGRvdWJsZQorI2RlZmluZSBTQ0FMQVIgZG91YmxlCiAjZGVmaW5lIFNDQUxBUl9QUkVGSVggZAogI2luY2x1ZGUgImJsYXNfaW50ZXJmYWNlX2ltcGwuaGgiCiAjdW5kZWYgU0NBTEFSCiAjdW5kZWYgU0NBTEFSX1BSRUZJWAogCiAjZW5kaWYKLQotCi0KZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL0JMQVMvYmxhc19pbnRlcmZhY2VfaW1wbC5oaCBiL2JlbmNoL2J0bC9saWJzL0JMQVMvYmxhc19pbnRlcmZhY2VfaW1wbC5oaAppbmRleCA5ZTBhNjQ5Li5iYTMzYmVjIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9CTEFTL2JsYXNfaW50ZXJmYWNlX2ltcGwuaGgKKysrIGIvYmVuY2gvYnRsL2xpYnMvQkxBUy9ibGFzX2ludGVyZmFjZV9pbXBsLmhoCkBAIC0xLDExNiArMSwxMDkgQEAKIAotI2RlZmluZSBCTEFTX0ZVTkMoTkFNRSkgQ0FUKENBVChTQ0FMQVJfUFJFRklYLE5BTUUpLF8pCisjZGVmaW5lIEJMQVNfRlVOQyhOQU1FKSBDQVQoQ0FUKFNDQUxBUl9QUkVGSVgsIE5BTUUpLCBfKQogCi10ZW1wbGF0ZTw+IGNsYXNzIGJsYXNfaW50ZXJmYWNlPFNDQUxBUj4gOiBwdWJsaWMgY19pbnRlcmZhY2VfYmFzZTxTQ0FMQVI+Ci17Ci0KLXB1YmxpYyA6Ci0gIAordGVtcGxhdGUgPD4KK2NsYXNzIGJsYXNfaW50ZXJmYWNlPFNDQUxBUj4gOiBwdWJsaWMgY19pbnRlcmZhY2VfYmFzZTxTQ0FMQVI+IHsKKyBwdWJsaWM6CiAgIHN0YXRpYyBTQ0FMQVIgZm9uZTsKICAgc3RhdGljIFNDQUxBUiBmemVybzsKIAotICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKQotICB7Ci0gICAgcmV0dXJuIE1BS0VfU1RSSU5HKENCTEFTTkFNRSk7CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSgpIHsgcmV0dXJuIE1BS0VfU1RSSU5HKENCTEFTTkFNRSk7IH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4JiBBLCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3ImIFgsIGludCBOKSB7CisgICAgQkxBU19GVU5DKGdlbXYpKCZub3RyYW5zLCAmTiwgJk4sICZmb25lLCBBLCAmTiwgQiwgJmludG9uZSwgJmZ6ZXJvLCBYLCAmaW50b25lKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pewotICAgIEJMQVNfRlVOQyhnZW12KSgmbm90cmFucywmTiwmTiwmZm9uZSxBLCZOLEIsJmludG9uZSwmZnplcm8sWCwmaW50b25lKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIHN5bXYoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4pIHsKKyAgICBCTEFTX0ZVTkMoc3ltdikoJmxvd2VyLCAmTiwgJmZvbmUsIEEsICZOLCBCLCAmaW50b25lLCAmZnplcm8sIFgsICZpbnRvbmUpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIHN5bXYoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pewotICAgIEJMQVNfRlVOQyhzeW12KSgmbG93ZXIsICZOLCZmb25lLEEsJk4sQiwmaW50b25lLCZmemVybyxYLCZpbnRvbmUpOworICBzdGF0aWMgaW5saW5lIHZvaWQgc3lyMihnZW5lX21hdHJpeCYgQSwgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgeworICAgIEJMQVNfRlVOQyhzeXIyKSgmbG93ZXIsICZOLCAmZm9uZSwgQiwgJmludG9uZSwgWCwgJmludG9uZSwgQSwgJk4pOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIHN5cjIoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pewotICAgIEJMQVNfRlVOQyhzeXIyKSgmbG93ZXIsJk4sJmZvbmUsQiwmaW50b25lLFgsJmludG9uZSxBLCZOKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIGdlcihnZW5lX21hdHJpeCYgQSwgZ2VuZV92ZWN0b3ImIFgsIGdlbmVfdmVjdG9yJiBZLCBpbnQgTikgeworICAgIEJMQVNfRlVOQyhnZXIpKCZOLCAmTiwgJmZvbmUsIFgsICZpbnRvbmUsIFksICZpbnRvbmUsIEEsICZOKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBnZXIoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4pewotICAgIEJMQVNfRlVOQyhnZXIpKCZOLCZOLCZmb25lLFgsJmludG9uZSxZLCZpbnRvbmUsQSwmTik7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCByb3QoZ2VuZV92ZWN0b3ImIEEsIGdlbmVfdmVjdG9yJiBCLCBTQ0FMQVIgYywgU0NBTEFSIHMsIGludCBOKSB7CisgICAgQkxBU19GVU5DKHJvdCkoJk4sIEEsICZpbnRvbmUsIEIsICZpbnRvbmUsICZjLCAmcyk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgcm90KGdlbmVfdmVjdG9yICYgQSwgIGdlbmVfdmVjdG9yICYgQiwgU0NBTEFSIGMsIFNDQUxBUiBzLCBpbnQgTil7Ci0gICAgQkxBU19GVU5DKHJvdCkoJk4sQSwmaW50b25lLEIsJmludG9uZSwmYywmcyk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCYgQSwgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgeworICAgIEJMQVNfRlVOQyhnZW12KSgmdHJhbnMsICZOLCAmTiwgJmZvbmUsIEEsICZOLCBCLCAmaW50b25lLCAmZnplcm8sIFgsICZpbnRvbmUpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF0dl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKLSAgICBCTEFTX0ZVTkMoZ2VtdikoJnRyYW5zLCZOLCZOLCZmb25lLEEsJk4sQiwmaW50b25lLCZmemVybyxYLCZpbnRvbmUpOworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGdlbmVfbWF0cml4JiBBLCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKSB7CisgICAgQkxBU19GVU5DKGdlbW0pKCZub3RyYW5zLCAmbm90cmFucywgJk4sICZOLCAmTiwgJmZvbmUsIEEsICZOLCBCLCAmTiwgJmZ6ZXJvLCBYLCAmTik7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKLSAgICBCTEFTX0ZVTkMoZ2VtbSkoJm5vdHJhbnMsJm5vdHJhbnMsJk4sJk4sJk4sJmZvbmUsQSwmTixCLCZOLCZmemVybyxYLCZOKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9zZWRfbWF0cml4X21hdHJpeF9wcm9kdWN0KGdlbmVfbWF0cml4JiBBLCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKSB7CisgICAgQkxBU19GVU5DKGdlbW0pKCZub3RyYW5zLCAmbm90cmFucywgJk4sICZOLCAmTiwgJmZvbmUsIEEsICZOLCBCLCAmTiwgJmZ6ZXJvLCBYLCAmTik7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNwb3NlZF9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pewotICAgIEJMQVNfRlVOQyhnZW1tKSgmbm90cmFucywmbm90cmFucywmTiwmTiwmTiwmZm9uZSxBLCZOLEIsJk4sJmZ6ZXJvLFgsJk4pOworICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfbWF0cml4JiBYLCBpbnQgTikgeworICAgIEJMQVNfRlVOQyhzeXJrKSgmbG93ZXIsICZ0cmFucywgJk4sICZOLCAmZm9uZSwgQSwgJk4sICZmemVybywgWCwgJk4pOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7Ci0gICAgQkxBU19GVU5DKHN5cmspKCZsb3dlciwmdHJhbnMsJk4sJk4sJmZvbmUsQSwmTiwmZnplcm8sWCwmTik7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChnZW5lX21hdHJpeCYgQSwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKSB7CisgICAgQkxBU19GVU5DKHN5cmspKCZsb3dlciwgJm5vdHJhbnMsICZOLCAmTiwgJmZvbmUsIEEsICZOLCAmZnplcm8sIFgsICZOKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pewotICAgIEJMQVNfRlVOQyhzeXJrKSgmbG93ZXIsJm5vdHJhbnMsJk4sJk4sJmZvbmUsQSwmTiwmZnplcm8sWCwmTik7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KFNDQUxBUiBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciYgWCwgZ2VuZV92ZWN0b3ImIFksIGludCBOKSB7CisgICAgQkxBU19GVU5DKGF4cHkpKCZOLCAmY29lZiwgWCwgJmludG9uZSwgWSwgJmludG9uZSk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShTQ0FMQVIgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKLSAgICBCTEFTX0ZVTkMoYXhweSkoJk4sJmNvZWYsWCwmaW50b25lLFksJmludG9uZSk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHBieShTQ0FMQVIgYSwgY29uc3QgZ2VuZV92ZWN0b3ImIFgsIFNDQUxBUiBiLCBnZW5lX3ZlY3RvciYgWSwgaW50IE4pIHsKKyAgICBCTEFTX0ZVTkMoc2NhbCkoJk4sICZiLCBZLCAmaW50b25lKTsKKyAgICBCTEFTX0ZVTkMoYXhweSkoJk4sICZhLCBYLCAmaW50b25lLCBZLCAmaW50b25lKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBheHBieShTQ0FMQVIgYSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCBTQ0FMQVIgYiwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7Ci0gICAgQkxBU19GVU5DKHNjYWwpKCZOLCZiLFksJmludG9uZSk7Ci0gICAgQkxBU19GVU5DKGF4cHkpKCZOLCZhLFgsJmludG9uZSxZLCZpbnRvbmUpOwotICB9Ci0KLSAgc3RhdGljIGlubGluZSB2b2lkIGNob2xlc2t5KGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7Ci0gICAgaW50IE4yID0gTipOOworICBzdGF0aWMgaW5saW5lIHZvaWQgY2hvbGVza3koY29uc3QgZ2VuZV9tYXRyaXgmIFgsIGdlbmVfbWF0cml4JiBDLCBpbnQgTikgeworICAgIGludCBOMiA9IE4gKiBOOwogICAgIEJMQVNfRlVOQyhjb3B5KSgmTjIsIFgsICZpbnRvbmUsIEMsICZpbnRvbmUpOwogICAgIGNoYXIgdXBsbyA9ICdMJzsKICAgICBpbnQgaW5mbyA9IDA7CiAgICAgQkxBU19GVU5DKHBvdHJmKSgmdXBsbywgJk4sIEMsICZOLCAmaW5mbyk7Ci0gICAgaWYoaW5mbyE9MCkgc3RkOjpjZXJyIDw8ICJwb3RyZl8gZXJyb3IgIiA8PCBpbmZvIDw8ICJcbiI7CisgICAgaWYgKGluZm8gIT0gMCkgc3RkOjpjZXJyIDw8ICJwb3RyZl8gZXJyb3IgIiA8PCBpbmZvIDw8ICJcbiI7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgcGFydGlhbF9sdV9kZWNvbXAoY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKLSAgICBpbnQgTjIgPSBOKk47CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBwYXJ0aWFsX2x1X2RlY29tcChjb25zdCBnZW5lX21hdHJpeCYgWCwgZ2VuZV9tYXRyaXgmIEMsIGludCBOKSB7CisgICAgaW50IE4yID0gTiAqIE47CiAgICAgQkxBU19GVU5DKGNvcHkpKCZOMiwgWCwgJmludG9uZSwgQywgJmludG9uZSk7CiAgICAgaW50IGluZm8gPSAwOwotICAgIGludCAqIGlwaXYgPSAoaW50KilhbGxvY2Eoc2l6ZW9mKGludCkqTik7CisgICAgaW50KiBpcGl2ID0gKGludCopYWxsb2NhKHNpemVvZihpbnQpICogTik7CiAgICAgQkxBU19GVU5DKGdldHJmKSgmTiwgJk4sIEMsICZOLCBpcGl2LCAmaW5mbyk7Ci0gICAgaWYoaW5mbyE9MCkgc3RkOjpjZXJyIDw8ICJnZXRyZl8gZXJyb3IgIiA8PCBpbmZvIDw8ICJcbiI7CisgICAgaWYgKGluZm8gIT0gMCkgc3RkOjpjZXJyIDw8ICJnZXRyZl8gZXJyb3IgIiA8PCBpbmZvIDw8ICJcbiI7CiAgIH0KLSAgCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCAmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXIoY29uc3QgZ2VuZV9tYXRyaXgmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4pIHsKICAgICBCTEFTX0ZVTkMoY29weSkoJk4sIEIsICZpbnRvbmUsIFgsICZpbnRvbmUpOwogICAgIEJMQVNfRlVOQyh0cnN2KSgmbG93ZXIsICZub3RyYW5zLCAmbm9udW5pdCwgJk4sIEwsICZOLCBYLCAmaW50b25lKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcl9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcl9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXgmIEwsIGNvbnN0IGdlbmVfbWF0cml4JiBCLCBnZW5lX21hdHJpeCYgWCwgaW50IE4pIHsKICAgICBCTEFTX0ZVTkMoY29weSkoJk4sIEIsICZpbnRvbmUsIFgsICZpbnRvbmUpOwogICAgIEJMQVNfRlVOQyh0cnNtKSgmcmlnaHQsICZsb3dlciwgJm5vdHJhbnMsICZub251bml0LCAmTiwgJk4sICZmb25lLCBMLCAmTiwgWCwgJk4pOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIHRybW0oZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgLypYKi8sIGludCBOKXsKLSAgICBCTEFTX0ZVTkModHJtbSkoJmxlZnQsICZsb3dlciwgJm5vdHJhbnMsJm5vbnVuaXQsICZOLCZOLCZmb25lLEEsJk4sQiwmTik7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cm1tKGdlbmVfbWF0cml4JiBBLCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIC8qWCovLCBpbnQgTikgeworICAgIEJMQVNfRlVOQyh0cm1tKSgmbGVmdCwgJmxvd2VyLCAmbm90cmFucywgJm5vbnVuaXQsICZOLCAmTiwgJmZvbmUsIEEsICZOLCBCLCAmTik7CiAgIH0KIAotICAjaWZkZWYgSEFTX0xBUEFDSworI2lmZGVmIEhBU19MQVBBQ0sKIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbHVfZGVjb21wKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7Ci0gICAgaW50IE4yID0gTipOOworICBzdGF0aWMgaW5saW5lIHZvaWQgbHVfZGVjb21wKGNvbnN0IGdlbmVfbWF0cml4JiBYLCBnZW5lX21hdHJpeCYgQywgaW50IE4pIHsKKyAgICBpbnQgTjIgPSBOICogTjsKICAgICBCTEFTX0ZVTkMoY29weSkoJk4yLCBYLCAmaW50b25lLCBDLCAmaW50b25lKTsKICAgICBpbnQgaW5mbyA9IDA7Ci0gICAgaW50ICogaXBpdiA9IChpbnQqKWFsbG9jYShzaXplb2YoaW50KSpOKTsKLSAgICBpbnQgKiBqcGl2ID0gKGludCopYWxsb2NhKHNpemVvZihpbnQpKk4pOworICAgIGludCogaXBpdiA9IChpbnQqKWFsbG9jYShzaXplb2YoaW50KSAqIE4pOworICAgIGludCoganBpdiA9IChpbnQqKWFsbG9jYShzaXplb2YoaW50KSAqIE4pOwogICAgIEJMQVNfRlVOQyhnZXRjMikoJk4sIEMsICZOLCBpcGl2LCBqcGl2LCAmaW5mbyk7CiAgIH0KIAotCi0KLSAgc3RhdGljIGlubGluZSB2b2lkIGhlc3NlbmJlcmcoY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIGhlc3NlbmJlcmcoY29uc3QgZ2VuZV9tYXRyaXgmIFgsIGdlbmVfbWF0cml4JiBDLCBpbnQgTikgewogICAgIHsKLSAgICAgIGludCBOMiA9IE4qTjsKKyAgICAgIGludCBOMiA9IE4gKiBOOwogICAgICAgaW50IGluYyA9IDE7CiAgICAgICBCTEFTX0ZVTkMoY29weSkoJk4yLCBYLCAmaW5jLCBDLCAmaW5jKTsKICAgICB9CkBAIC0xMTgsMjkgKzExMSwyOCBAQAogICAgIGludCBpbG8gPSAxOwogICAgIGludCBpaGkgPSBOOwogICAgIGludCBic2l6ZSA9IDY0OwotICAgIGludCB3b3Jrc2l6ZSA9IE4qYnNpemU7Ci0gICAgU0NBTEFSKiBkID0gbmV3IFNDQUxBUltOK3dvcmtzaXplXTsKLSAgICBCTEFTX0ZVTkMoZ2VocmQpKCZOLCAmaWxvLCAmaWhpLCBDLCAmTiwgZCwgZCtOLCAmd29ya3NpemUsICZpbmZvKTsKKyAgICBpbnQgd29ya3NpemUgPSBOICogYnNpemU7CisgICAgU0NBTEFSKiBkID0gbmV3IFNDQUxBUltOICsgd29ya3NpemVdOworICAgIEJMQVNfRlVOQyhnZWhyZCkoJk4sICZpbG8sICZpaGksIEMsICZOLCBkLCBkICsgTiwgJndvcmtzaXplLCAmaW5mbyk7CiAgICAgZGVsZXRlW10gZDsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlkaWFnb25hbGl6YXRpb24oY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaWRpYWdvbmFsaXphdGlvbihjb25zdCBnZW5lX21hdHJpeCYgWCwgZ2VuZV9tYXRyaXgmIEMsIGludCBOKSB7CiAgICAgewotICAgICAgaW50IE4yID0gTipOOworICAgICAgaW50IE4yID0gTiAqIE47CiAgICAgICBpbnQgaW5jID0gMTsKICAgICAgIEJMQVNfRlVOQyhjb3B5KSgmTjIsIFgsICZpbmMsIEMsICZpbmMpOwogICAgIH0KICAgICBjaGFyIHVwbG8gPSAnVSc7CiAgICAgaW50IGluZm8gPSAwOwogICAgIGludCBic2l6ZSA9IDY0OwotICAgIGludCB3b3Jrc2l6ZSA9IE4qYnNpemU7Ci0gICAgU0NBTEFSKiBkID0gbmV3IFNDQUxBUlszKk4rd29ya3NpemVdOwotICAgIEJMQVNfRlVOQyhzeXRyZCkoJnVwbG8sICZOLCBDLCAmTiwgZCwgZCtOLCBkKzIqTiwgZCszKk4sICZ3b3Jrc2l6ZSwgJmluZm8pOworICAgIGludCB3b3Jrc2l6ZSA9IE4gKiBic2l6ZTsKKyAgICBTQ0FMQVIqIGQgPSBuZXcgU0NBTEFSWzMgKiBOICsgd29ya3NpemVdOworICAgIEJMQVNfRlVOQyhzeXRyZCkoJnVwbG8sICZOLCBDLCAmTiwgZCwgZCArIE4sIGQgKyAyICogTiwgZCArIDMgKiBOLCAmd29ya3NpemUsICZpbmZvKTsKICAgICBkZWxldGVbXSBkOwogICB9Ci0gIAotICAjZW5kaWYgLy8gSEFTX0xBUEFDSwogCisjZW5kaWYgIC8vIEhBU19MQVBBQ0sKIH07CiAKIFNDQUxBUiBibGFzX2ludGVyZmFjZTxTQ0FMQVI+Ojpmb25lID0gU0NBTEFSKDEpOwpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvQkxBUy9jX2ludGVyZmFjZV9iYXNlLmggYi9iZW5jaC9idGwvbGlicy9CTEFTL2NfaW50ZXJmYWNlX2Jhc2UuaAppbmRleCBkZTYxMzgwLi5hZmUxZDJhIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9CTEFTL2NfaW50ZXJmYWNlX2Jhc2UuaAorKysgYi9iZW5jaC9idGwvbGlicy9CTEFTL2NfaW50ZXJmYWNlX2Jhc2UuaApAQCAtNSw2OSArNSw1NyBAQAogI2luY2x1ZGUgInV0aWxpdGllcy5oIgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotdGVtcGxhdGU8Y2xhc3MgcmVhbD4gY2xhc3MgY19pbnRlcmZhY2VfYmFzZQotewotCi1wdWJsaWM6Ci0KLSAgdHlwZWRlZiByZWFsICAgICAgICAgICAgICAgICAgICAgIHJlYWxfdHlwZTsKLSAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiAgICAgICAgIHN0bF92ZWN0b3I7Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3RvciA+ICBzdGxfbWF0cml4OwordGVtcGxhdGUgPGNsYXNzIHJlYWw+CitjbGFzcyBjX2ludGVyZmFjZV9iYXNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgcmVhbCByZWFsX3R5cGU7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yPiBzdGxfbWF0cml4OwogCiAgIHR5cGVkZWYgcmVhbCogZ2VuZV9tYXRyaXg7CiAgIHR5cGVkZWYgcmVhbCogZ2VuZV92ZWN0b3I7CiAKLSAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXggJiBBLCBpbnQgLypOKi8pewotICAgIGRlbGV0ZVtdIEE7Ci0gIH0KKyAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXgmIEEsIGludCAvKk4qLykgeyBkZWxldGVbXSBBOyB9CiAKLSAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKXsKLSAgICBkZWxldGVbXSBCOwotICB9CisgIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yJiBCKSB7IGRlbGV0ZVtdIEI7IH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCYgQSwgc3RsX21hdHJpeCYgQV9zdGwpIHsKICAgICBpbnQgTiA9IEFfc3RsLnNpemUoKTsKLSAgICBBID0gbmV3IHJlYWxbTipOXTsKLSAgICBmb3IgKGludCBqPTA7ajxOO2orKykKLSAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKQotICAgICAgICBBW2krTipqXSA9IEFfc3RsW2pdW2ldOworICAgIEEgPSBuZXcgcmVhbFtOICogTl07CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgQVtpICsgTiAqIGpdID0gQV9zdGxbal1baV07CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciYgQiwgc3RsX3ZlY3RvciYgQl9zdGwpIHsKICAgICBpbnQgTiA9IEJfc3RsLnNpemUoKTsKICAgICBCID0gbmV3IHJlYWxbTl07Ci0gICAgZm9yIChpbnQgaT0wO2k8TjtpKyspCi0gICAgICBCW2ldID0gQl9zdGxbaV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIEJbaV0gPSBCX3N0bFtpXTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3ImIEIsIHN0bF92ZWN0b3ImIEJfc3RsKSB7CiAgICAgaW50IE4gPSBCX3N0bC5zaXplKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8TjtpKyspCi0gICAgICBCX3N0bFtpXSA9IEJbaV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIEJfc3RsW2ldID0gQltpXTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXgmIEEsIHN0bF9tYXRyaXgmIEFfc3RsKSB7CiAgICAgaW50IE4gPSBBX3N0bC5zaXplKCk7Ci0gICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CiAgICAgICBBX3N0bFtqXS5yZXNpemUoTik7Ci0gICAgICBmb3IgKGludCBpPTA7aTxOO2krKykKLSAgICAgICAgQV9zdGxbal1baV0gPSBBW2krTipqXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSBBX3N0bFtqXVtpXSA9IEFbaSArIE4gKiBqXTsKICAgICB9CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKLSAgICBmb3IgKGludCBpPTA7aTxOO2krKykKLSAgICAgIGNpYmxlW2ldPXNvdXJjZVtpXTsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yJiBzb3VyY2UsIGdlbmVfdmVjdG9yJiBjaWJsZSwgaW50IE4pIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgY2libGVbaV0gPSBzb3VyY2VbaV07CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKXsKLSAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7Ci0gICAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7Ci0gICAgICAgIGNpYmxlW2krTipqXSA9IHNvdXJjZVtpK04qal07CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X21hdHJpeChjb25zdCBnZW5lX21hdHJpeCYgc291cmNlLCBnZW5lX21hdHJpeCYgY2libGUsIGludCBOKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgIGNpYmxlW2kgKyBOICogal0gPSBzb3VyY2VbaSArIE4gKiBqXTsKICAgICAgIH0KICAgICB9CiAgIH0KLQogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9CTEFTL21haW4uY3BwIGIvYmVuY2gvYnRsL2xpYnMvQkxBUy9tYWluLmNwcAppbmRleCBmZDk5MTQ5Li5hNThmZDczIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9CTEFTL21haW4uY3BwCisrKyBiL2JlbmNoL2J0bC9saWJzL0JMQVMvbWFpbi5jcHAKQEAgLTMzLDQxICszMywzNyBAQAogCiBCVExfTUFJTjsKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CisgIGJlbmNoPEFjdGlvbl9heHB5PGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLCBNQVhfQVhQWSwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXhwYnk8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksIE1BWF9BWFBZLCBOQl9QT0lOVCk7CiAKLSAgYmVuY2g8QWN0aW9uX2F4cHk8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fYXhwYnk8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NViwgTUFYX01WLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsIE1BWF9NViwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fc3ltdjxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsIE1BWF9NViwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fc3lyMjxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsIE1BWF9NViwgTkJfUE9JTlQpOwogCi0gIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX3N5bXY8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9zeXIyPGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fZ2VyPGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NViwgTUFYX01WLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9yb3Q8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksIE1BWF9BWFBZLCBOQl9QT0lOVCk7CiAKLSAgYmVuY2g8QWN0aW9uX2dlcjxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX3JvdDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0YV9wcm9kdWN0PGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sIE1BWF9NTSwgTkJfUE9JTlQpOwogCi0gIGJlbmNoPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX2FhdF9wcm9kdWN0PGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fdHJpc29sdmU8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlX21hdHJpeDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sIE1BWF9NTSwgTkJfUE9JTlQpOwogCi0gIGJlbmNoPEFjdGlvbl90cmlzb2x2ZTxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlX21hdHJpeDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3RybW08Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKIAotICBiZW5jaDxBY3Rpb25fdHJtbTxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2Nob2xlc2t5PGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSwgTUFYX0xVLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9wYXJ0aWFsX2x1PGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSwgTUFYX0xVLCBOQl9QT0lOVCk7CiAKLSAgYmVuY2g8QWN0aW9uX2Nob2xlc2t5PGJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fcGFydGlhbF9sdTxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTFUsTUFYX0xVLE5CX1BPSU5UKTsKKyNpZmRlZiBIQVNfTEFQQUNLCisgIC8vICAgYmVuY2g8QWN0aW9uX2x1X2RlY29tcDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTFUsTUFYX0xVLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2hlc3NlbmJlcmc8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLCBNQVhfTFUsIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbjxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTFUsIE1BWF9MVSwgTkJfUE9JTlQpOworI2VuZGlmCiAKLSAgI2lmZGVmIEhBU19MQVBBQ0sKLS8vICAgYmVuY2g8QWN0aW9uX2x1X2RlY29tcDxibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTFUsTUFYX0xVLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX2hlc3NlbmJlcmc8Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl90cmlkaWFnb25hbGl6YXRpb248Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7Ci0gICNlbmRpZgotCi0gIC8vYmVuY2g8QWN0aW9uX2x1X3NvbHZlPGJsYXNfTFVfc29sdmVfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOworICAvLyBiZW5jaDxBY3Rpb25fbHVfc29sdmU8Ymxhc19MVV9zb2x2ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7CiAKICAgcmV0dXJuIDA7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvU1RML1NUTF9pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy9TVEwvU1RMX2ludGVyZmFjZS5oaAppbmRleCA1YjM5MWM2Li40YTU5MjUzIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9TVEwvU1RMX2ludGVyZmFjZS5oaAorKysgYi9iZW5jaC9idGwvbGlicy9TVEwvU1RMX2ludGVyZmFjZS5oaApAQCAtMjUsMjIzICsyNSwxNzggQEAKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotdGVtcGxhdGU8Y2xhc3MgcmVhbD4KLWNsYXNzIFNUTF9pbnRlcmZhY2V7Cit0ZW1wbGF0ZSA8Y2xhc3MgcmVhbD4KK2NsYXNzIFNUTF9pbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZTsKIAotcHVibGljIDoKLQotICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlIDsKLQotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHJlYWw+ICBzdGxfdmVjdG9yOwotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0bF92ZWN0b3IgPiBzdGxfbWF0cml4OworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHJlYWw+IHN0bF92ZWN0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3Rvcj4gc3RsX21hdHJpeDsKIAogICB0eXBlZGVmIHN0bF9tYXRyaXggZ2VuZV9tYXRyaXg7CiAKICAgdHlwZWRlZiBzdGxfdmVjdG9yIGdlbmVfdmVjdG9yOwogCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gIlNUTCI7Ci0gIH0KKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKHZvaWQpIHsgcmV0dXJuICJTVEwiOyB9CiAKLSAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXggJiAvKkEqLywgaW50IC8qTiovKXt9CisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4JiAvKkEqLywgaW50IC8qTiovKSB7fQogCi0gIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yICYgLypCKi8pe30KKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3ImIC8qQiovKSB7fQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfZnJvbV9zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpewotICAgIEEgPSBBX3N0bDsKLSAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgeyBBID0gQV9zdGw7IH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKLSAgICBCID0gQl9zdGw7Ci0gIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciYgQiwgc3RsX3ZlY3RvciYgQl9zdGwpIHsgQiA9IEJfc3RsOyB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpewotICAgIEJfc3RsID0gQiA7Ci0gIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3ImIEIsIHN0bF92ZWN0b3ImIEJfc3RsKSB7IEJfc3RsID0gQjsgfQogCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgeyBBX3N0bCA9IEE7IH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7Ci0gICAgQV9zdGwgPSBBIDsKLSAgfQotCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciAmIHNvdXJjZSwgZ2VuZV92ZWN0b3IgJiBjaWJsZSwgaW50IE4pewotICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKLSAgICAgIGNpYmxlW2ldPXNvdXJjZVtpXTsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yJiBzb3VyY2UsIGdlbmVfdmVjdG9yJiBjaWJsZSwgaW50IE4pIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgY2libGVbaV0gPSBzb3VyY2VbaV07CiAgICAgfQogICB9CiAKLQotICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKXsKLSAgICBmb3IgKGludCBpPTA7aTxOO2krKykKLSAgICAgIGZvciAoaW50IGo9MDtqPE47aisrKQotICAgICAgICBjaWJsZVtpXVtqXT1zb3VyY2VbaV1bal07CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X21hdHJpeChjb25zdCBnZW5lX21hdHJpeCYgc291cmNlLCBnZW5lX21hdHJpeCYgY2libGUsIGludCBOKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgY2libGVbaV1bal0gPSBzb3VyY2VbaV1bal07CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKQotICB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGFfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCYgQSwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKSB7CiAgICAgcmVhbCBzb21tZTsKLSAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7Ci0gICAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7Ci0gICAgICAgIHNvbW1lPTAuMDsKLSAgICAgICAgaWYoaT49aikKLSAgICAgICAgewotICAgICAgICBmb3IgKGludCBrPTA7azxOO2srKykKLSAgICAgICAgICBzb21tZSArPSBBW2ldW2tdKkFbal1ba107Ci0gICAgICAgIFhbal1baV09c29tbWU7Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pCi0gIHsKLSAgICByZWFsIHNvbW1lOwotICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKLSAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKLSAgICAgICAgc29tbWU9MC4wOwotICAgICAgICBpZihpPj1qKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgaz0wO2s8TjtrKyspewotICAgICAgICAgICAgc29tbWUrPUFba11baV0qQVtrXVtqXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgWFtqXVtpXT1zb21tZTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgc29tbWUgPSAwLjA7CisgICAgICAgIGlmIChpID49IGopIHsKKyAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IE47IGsrKykgc29tbWUgKz0gQVtpXVtrXSAqIEFbal1ba107CisgICAgICAgICAgWFtqXVtpXSA9IHNvbW1lOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiAKLQotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKQotICB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCYgQSwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKSB7CiAgICAgcmVhbCBzb21tZTsKLSAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7Ci0gICAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7Ci0gICAgICAgIHNvbW1lPTAuMDsKLSAgICAgICAgZm9yIChpbnQgaz0wO2s8TjtrKyspCi0gICAgICAgICAgc29tbWUrPUFba11baV0qQltqXVtrXTsKLSAgICAgICAgWFtqXVtpXT1zb21tZTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgc29tbWUgPSAwLjA7CisgICAgICAgIGlmIChpID49IGopIHsKKyAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IE47IGsrKykgeworICAgICAgICAgICAgc29tbWUgKz0gQVtrXVtpXSAqIEFba11bal07CisgICAgICAgICAgfQorICAgICAgICAgIFhbal1baV0gPSBzb21tZTsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pCi0gIHsKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCYgQSwgY29uc3QgZ2VuZV9tYXRyaXgmIEIsIGdlbmVfbWF0cml4JiBYLCBpbnQgTikgewogICAgIHJlYWwgc29tbWU7Ci0gICAgZm9yIChpbnQgaT0wO2k8TjtpKyspewotICAgICAgc29tbWU9MC4wOwotICAgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspCi0gICAgICAgIHNvbW1lKz1BW2pdW2ldKkJbal07Ci0gICAgICBYW2ldPXNvbW1lOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICBzb21tZSA9IDAuMDsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBOOyBrKyspIHNvbW1lICs9IEFba11baV0gKiBCW2pdW2tdOworICAgICAgICBYW2pdW2ldID0gc29tbWU7CisgICAgICB9CiAgICAgfQogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIHN5bXYoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pCi0gIHsKLSAgICBmb3IgKGludCBqPTA7IGo8TjsgKytqKQotICAgICAgWFtqXSA9IDA7Ci0gICAgZm9yIChpbnQgaj0wOyBqPE47ICsraikKLSAgICB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4pIHsKKyAgICByZWFsIHNvbW1lOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICBzb21tZSA9IDAuMDsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSBzb21tZSArPSBBW2pdW2ldICogQltqXTsKKyAgICAgIFhbaV0gPSBzb21tZTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgc3ltdihnZW5lX21hdHJpeCYgQSwgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgKytqKSBYW2pdID0gMDsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IE47ICsraikgewogICAgICAgcmVhbCB0MSA9IEJbal07CiAgICAgICByZWFsIHQyID0gMDsKICAgICAgIFhbal0gKz0gdDEgKiBBW2pdW2pdOwotICAgICAgZm9yIChpbnQgaT1qKzE7IGk8TjsgKytpKSB7CisgICAgICBmb3IgKGludCBpID0gaiArIDE7IGkgPCBOOyArK2kpIHsKICAgICAgICAgWFtpXSArPSB0MSAqIEFbal1baV07CiAgICAgICAgIHQyICs9IEFbal1baV0gKiBCW2ldOwogICAgICAgfQogICAgICAgWFtqXSArPSB0MjsKICAgICB9CiAgIH0KLSAgCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBzeXIyKGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKQotICB7Ci0gICAgZm9yIChpbnQgaj0wOyBqPE47ICsraikKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPWo7IGk8TjsgKytpKQotICAgICAgICBBW2pdW2ldICs9IEJbaV0qWFtqXSArIEJbal0qWFtpXTsKKworICBzdGF0aWMgaW5saW5lIHZvaWQgc3lyMihnZW5lX21hdHJpeCYgQSwgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgKytqKSB7CisgICAgICBmb3IgKGludCBpID0gajsgaSA8IE47ICsraSkgQVtqXVtpXSArPSBCW2ldICogWFtqXSArIEJbal0gKiBYW2ldOwogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBnZXIoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4pCi0gIHsKLSAgICBmb3IgKGludCBqPTA7IGo8TjsgKytqKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9ajsgaTxOOyArK2kpCi0gICAgICAgIEFbal1baV0gKz0gWFtpXSpZW2pdOworICBzdGF0aWMgaW5saW5lIHZvaWQgZ2VyKGdlbmVfbWF0cml4JiBBLCBnZW5lX3ZlY3RvciYgWCwgZ2VuZV92ZWN0b3ImIFksIGludCBOKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyArK2opIHsKKyAgICAgIGZvciAoaW50IGkgPSBqOyBpIDwgTjsgKytpKSBBW2pdW2ldICs9IFhbaV0gKiBZW2pdOwogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTikKLSAgeworICBzdGF0aWMgaW5saW5lIHZvaWQgYXR2X3Byb2R1Y3QoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4pIHsKICAgICByZWFsIHNvbW1lOwotICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgc29tbWUgPSAwLjA7Ci0gICAgICBmb3IgKGludCBqPTA7ajxOO2orKykKLSAgICAgICAgc29tbWUgKz0gQVtpXVtqXSpCW2pdOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHNvbW1lICs9IEFbaV1bal0gKiBCW2pdOwogICAgICAgWFtpXSA9IHNvbW1lOwogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKLSAgICBmb3IgKGludCBpPTA7aTxOO2krKykKLSAgICAgIFlbaV0rPWNvZWYqWFtpXTsKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkocmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciYgWCwgZ2VuZV92ZWN0b3ImIFksIGludCBOKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIFlbaV0gKz0gY29lZiAqIFhbaV07CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgYXhwYnkocmVhbCBhLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIHJlYWwgYiwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7Ci0gICAgZm9yIChpbnQgaT0wO2k8TjtpKyspCi0gICAgICBZW2ldID0gYSpYW2ldICsgYipZW2ldOworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhwYnkocmVhbCBhLCBjb25zdCBnZW5lX3ZlY3RvciYgWCwgcmVhbCBiLCBnZW5lX3ZlY3RvciYgWSwgaW50IE4pIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgWVtpXSA9IGEgKiBYW2ldICsgYiAqIFlbaV07CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXIoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pewotICAgIGNvcHlfdmVjdG9yKEIsWCxOKTsKLSAgICBmb3IoaW50IGk9MDsgaTxOOyArK2kpCi0gICAgeworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXIoY29uc3QgZ2VuZV9tYXRyaXgmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4pIHsKKyAgICBjb3B5X3ZlY3RvcihCLCBYLCBOKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47ICsraSkgewogICAgICAgWFtpXSAvPSBMW2ldW2ldOwogICAgICAgcmVhbCB0bXAgPSBYW2ldOwotICAgICAgZm9yIChpbnQgaj1pKzE7IGo8TjsgKytqKQotICAgICAgICBYW2pdIC09IHRtcCAqIExbaV1bal07CisgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBOOyArK2opIFhbal0gLT0gdG1wICogTFtpXVtqXTsKICAgICB9CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHJlYWwgbm9ybV9kaWZmKGNvbnN0IHN0bF92ZWN0b3IgJiBBLCBjb25zdCBzdGxfdmVjdG9yICYgQikKLSAgewotICAgIGludCBOPUEuc2l6ZSgpOwotICAgIHJlYWwgc29tbWU9MC4wOwotICAgIHJlYWwgc29tbWUyPTAuMDsKKyAgc3RhdGljIGlubGluZSByZWFsIG5vcm1fZGlmZihjb25zdCBzdGxfdmVjdG9yJiBBLCBjb25zdCBzdGxfdmVjdG9yJiBCKSB7CisgICAgaW50IE4gPSBBLnNpemUoKTsKKyAgICByZWFsIHNvbW1lID0gMC4wOworICAgIHJlYWwgc29tbWUyID0gMC4wOwogCi0gICAgZm9yIChpbnQgaT0wO2k8TjtpKyspewotICAgICAgcmVhbCBkaWZmPUFbaV0tQltpXTsKLSAgICAgIHNvbW1lKz1kaWZmKmRpZmY7Ci0gICAgICBzb21tZTIrPUFbaV0qQVtpXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgcmVhbCBkaWZmID0gQVtpXSAtIEJbaV07CisgICAgICBzb21tZSArPSBkaWZmICogZGlmZjsKKyAgICAgIHNvbW1lMiArPSBBW2ldICogQVtpXTsKICAgICB9Ci0gICAgcmV0dXJuIHNvbW1lL3NvbW1lMjsKKyAgICByZXR1cm4gc29tbWUgLyBzb21tZTI7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHJlYWwgbm9ybV9kaWZmKGNvbnN0IHN0bF9tYXRyaXggJiBBLCBjb25zdCBzdGxfbWF0cml4ICYgQikKLSAgewotICAgIGludCBOPUFbMF0uc2l6ZSgpOwotICAgIHJlYWwgc29tbWU9MC4wOwotICAgIHJlYWwgc29tbWUyPTAuMDsKKyAgc3RhdGljIGlubGluZSByZWFsIG5vcm1fZGlmZihjb25zdCBzdGxfbWF0cml4JiBBLCBjb25zdCBzdGxfbWF0cml4JiBCKSB7CisgICAgaW50IE4gPSBBWzBdLnNpemUoKTsKKyAgICByZWFsIHNvbW1lID0gMC4wOworICAgIHJlYWwgc29tbWUyID0gMC4wOwogCi0gICAgZm9yIChpbnQgaT0wO2k8TjtpKyspewotICAgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspewotICAgICAgICByZWFsIGRpZmY9QVtpXVtqXSAtIEJbaV1bal07Ci0gICAgICAgIHNvbW1lICs9IGRpZmYqZGlmZjsKLSAgICAgICAgc29tbWUyICs9IEFbaV1bal0qQVtpXVtqXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKKyAgICAgICAgcmVhbCBkaWZmID0gQVtpXVtqXSAtIEJbaV1bal07CisgICAgICAgIHNvbW1lICs9IGRpZmYgKiBkaWZmOworICAgICAgICBzb21tZTIgKz0gQVtpXVtqXSAqIEFbaV1bal07CiAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHNvbW1lL3NvbW1lMjsKKyAgICByZXR1cm4gc29tbWUgLyBzb21tZTI7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgZGlzcGxheV92ZWN0b3IoY29uc3Qgc3RsX3ZlY3RvciAmIEEpCi0gIHsKLSAgICBpbnQgTj1BLnNpemUoKTsKLSAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7Ci0gICAgICBJTkZPUygiQVsiPDxpPDwiXT0iPDxBW2ldPDxlbmRsKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIGRpc3BsYXlfdmVjdG9yKGNvbnN0IHN0bF92ZWN0b3ImIEEpIHsKKyAgICBpbnQgTiA9IEEuc2l6ZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICBJTkZPUygiQVsiIDw8IGkgPDwgIl09IiA8PCBBW2ldIDw8IGVuZGwpOwogICAgIH0KICAgfQotCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL1NUTC9tYWluLmNwcCBiL2JlbmNoL2J0bC9saWJzL1NUTC9tYWluLmNwcAppbmRleCA0ZTczMzI4Li43NzJmNDg0IDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9TVEwvbWFpbi5jcHAKKysrIGIvYmVuY2gvYnRsL2xpYnMvU1RML21haW4uY3BwCkBAIC0yNCwxOSArMjQsMTYgQEAKIAogQlRMX01BSU47CiAKLWludCBtYWluKCkKLXsKLSAgYmVuY2g8QWN0aW9uX2F4cHk8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9heHBieTxTVExfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxTVExfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fYXR2X3Byb2R1Y3Q8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX3N5bXY8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX3N5cjI8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxTVExfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fYXRhX3Byb2R1Y3Q8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX2FhdF9wcm9kdWN0PFNUTF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CitpbnQgbWFpbigpIHsKKyAgYmVuY2g8QWN0aW9uX2F4cHk8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSwgTUFYX0FYUFksIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F4cGJ5PFNUTF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksIE1BWF9BWFBZLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsIE1BWF9NViwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXR2X3Byb2R1Y3Q8U1RMX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsIE1BWF9NViwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fc3ltdjxTVExfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NViwgTUFYX01WLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9zeXIyPFNUTF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLCBNQVhfTVYsIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxTVExfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxTVExfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDxTVExfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CiAKICAgcmV0dXJuIDA7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxhemUvYmxhemVfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvYmxhemUvYmxhemVfaW50ZXJmYWNlLmhoCmluZGV4IDdiNDE4ZjYuLmNkMGYzMGEgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9saWJzL2JsYXplL2JsYXplX2ludGVyZmFjZS5oaAorKysgYi9iZW5jaC9idGwvbGlicy9ibGF6ZS9ibGF6ZV9pbnRlcmZhY2UuaGgKQEAgLTI1LDExNyArMjUsMTAyIEBACiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKLXRlbXBsYXRlPGNsYXNzIHJlYWw+Cit0ZW1wbGF0ZSA8Y2xhc3MgcmVhbD4KIGNsYXNzIGJsYXplX2ludGVyZmFjZSB7CisgcHVibGljOgorICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlOwogCi1wdWJsaWMgOgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHJlYWw+IHN0bF92ZWN0b3I7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3Rvcj4gc3RsX21hdHJpeDsKIAotICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlIDsKLQotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHJlYWw+ICAgICAgICBzdGxfdmVjdG9yOwotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0bF92ZWN0b3IgPiBzdGxfbWF0cml4OwotCi0gIHR5cGVkZWYgYmxhemU6OkR5bmFtaWNNYXRyaXg8cmVhbCxibGF6ZTo6Y29sdW1uTWFqb3I+ICBnZW5lX21hdHJpeDsKLSAgdHlwZWRlZiBibGF6ZTo6RHluYW1pY1ZlY3RvcjxyZWFsPiAgZ2VuZV92ZWN0b3I7CisgIHR5cGVkZWYgYmxhemU6OkR5bmFtaWNNYXRyaXg8cmVhbCwgYmxhemU6OmNvbHVtbk1ham9yPiBnZW5lX21hdHJpeDsKKyAgdHlwZWRlZiBibGF6ZTo6RHluYW1pY1ZlY3RvcjxyZWFsPiBnZW5lX3ZlY3RvcjsKIAogICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKSB7IHJldHVybiAiYmxhemUiOyB9CiAKLSAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXggJiBBLCBpbnQgTil7Ci0gICAgcmV0dXJuIDsKLSAgfQorICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCYgQSwgaW50IE4pIHsgcmV0dXJuOyB9CiAKLSAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKXsKLSAgICByZXR1cm4gOwotICB9CisgIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yJiBCKSB7IHJldHVybjsgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfZnJvbV9zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgewogICAgIEEucmVzaXplKEFfc3RsWzBdLnNpemUoKSwgQV9zdGwuc2l6ZSgpKTsKIAotICAgIGZvciAoaW50IGo9MDsgajxBX3N0bC5zaXplKCkgOyBqKyspewotICAgICAgZm9yIChpbnQgaT0wOyBpPEFfc3RsW2pdLnNpemUoKSA7IGkrKyl7Ci0gICAgICAgIEEoaSxqKSA9IEFfc3RsW2pdW2ldOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgQV9zdGwuc2l6ZSgpOyBqKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQV9zdGxbal0uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQShpLCBqKSA9IEFfc3RsW2pdW2ldOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yJiBCLCBzdGxfdmVjdG9yJiBCX3N0bCkgewogICAgIEIucmVzaXplKEJfc3RsLnNpemUoKSk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCX3N0bC5zaXplKCk7IGkrKykgewogICAgICAgQltpXSA9IEJfc3RsW2ldOwogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKLSAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3ImIEIsIHN0bF92ZWN0b3ImIEJfc3RsKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCX3N0bC5zaXplKCk7IGkrKykgewogICAgICAgQl9zdGxbaV0gPSBCW2ldOwogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKLSAgICBpbnQgTj1BX3N0bC5zaXplKCk7Ci0gICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCYgQSwgc3RsX21hdHJpeCYgQV9zdGwpIHsKKyAgICBpbnQgTiA9IEFfc3RsLnNpemUoKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgQV9zdGxbal0ucmVzaXplKE4pOwotICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspewotICAgICAgICBBX3N0bFtqXVtpXSA9IEEoaSxqKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgIEFfc3RsW2pdW2ldID0gQShpLCBqKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pewotICAgIFggPSAoQSpCKTsKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4JiBBLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTikgeworICAgIFggPSAoQSAqIEIpOwogICB9CiAKLSAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJhbnNwb3NlZF9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pewotICAgIFggPSAodHJhbnMoQSkqdHJhbnMoQikpOworICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCB0cmFuc3Bvc2VkX21hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCYgQSwgY29uc3QgZ2VuZV9tYXRyaXgmIEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfbWF0cml4JiBYLCBpbnQgTikgeworICAgIFggPSAodHJhbnMoQSkgKiB0cmFucyhCKSk7CiAgIH0KIAotICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBhdGFfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pewotICAgIFggPSAodHJhbnMoQSkqQSk7CisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIGF0YV9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4JiBBLCBnZW5lX21hdHJpeCYgWCwgaW50IE4pIHsgWCA9ICh0cmFucyhBKSAqIEEpOyB9CisKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgYWF0X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGdlbmVfbWF0cml4JiBYLCBpbnQgTikgeyBYID0gKEEgKiB0cmFucyhBKSk7IH0KKworICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4pIHsKKyAgICBYID0gKEEgKiBCKTsKICAgfQogCi0gIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIGFhdF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7Ci0gICAgWCA9IChBKnRyYW5zKEEpKTsKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgYXR2X3Byb2R1Y3QoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4pIHsKKyAgICBYID0gKHRyYW5zKEEpICogQik7CiAgIH0KIAotICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pewotICAgIFggPSAoQSpCKTsKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgYXhweShjb25zdCByZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yJiBYLCBnZW5lX3ZlY3RvciYgWSwgaW50IE4pIHsgWSArPSBjb2VmICogWDsgfQorCisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIGF4cGJ5KHJlYWwgYSwgY29uc3QgZ2VuZV92ZWN0b3ImIFgsIHJlYWwgYiwgZ2VuZV92ZWN0b3ImIFksIGludCBOKSB7CisgICAgWSA9IGEgKiBYICsgYiAqIFk7CiAgIH0KIAotICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7Ci0gICAgWCA9ICh0cmFucyhBKSpCKTsKLSAgfQorICAvLyAgIHN0YXRpYyBpbmxpbmUgdm9pZCBjaG9sZXNreShjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgQywgaW50IE4peworICAvLyAgICAgQyA9IFg7CisgIC8vICAgICByZWN1cnNpdmVfY2hvbGVza3koQyk7CisgIC8vICAgfQogCi0gIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4pewotICAgIFkgKz0gY29lZiAqIFg7Ci0gIH0KKyAgLy8gICBzdGF0aWMgaW5saW5lIHZvaWQgbHVfZGVjb21wKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBSLCBpbnQgTil7CisgIC8vICAgICBSID0gWDsKKyAgLy8gICAgIHN0ZDo6dmVjdG9yPGludD4gaXB2dChOKTsKKyAgLy8gICAgIGx1X2ZhY3RvcihSLCBpcHZ0KTsKKyAgLy8gICB9CiAKLSAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgYXhwYnkocmVhbCBhLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIHJlYWwgYiwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7Ci0gICAgWSA9IGEqWCArIGIqWTsKLSAgfQorICAvLyAgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCAmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKKyAgLy8gICAgIFggPSBsb3dlcl90cmlzb2x2ZShMLCBCKTsKKyAgLy8gICB9CiAKLS8vICAgc3RhdGljIGlubGluZSB2b2lkIGNob2xlc2t5KGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7Ci0vLyAgICAgQyA9IFg7Ci0vLyAgICAgcmVjdXJzaXZlX2Nob2xlc2t5KEMpOwotLy8gICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X21hdHJpeChjb25zdCBnZW5lX21hdHJpeCYgc291cmNlLCBnZW5lX21hdHJpeCYgY2libGUsIGludCBOKSB7IGNpYmxlID0gc291cmNlOyB9CiAKLS8vICAgc3RhdGljIGlubGluZSB2b2lkIGx1X2RlY29tcChjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgUiwgaW50IE4pewotLy8gICAgIFIgPSBYOwotLy8gICAgIHN0ZDo6dmVjdG9yPGludD4gaXB2dChOKTsKLS8vICAgICBsdV9mYWN0b3IoUiwgaXB2dCk7Ci0vLyAgIH0KLQotLy8gICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXIoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7Ci0vLyAgICAgWCA9IGxvd2VyX3RyaXNvbHZlKEwsIEIpOwotLy8gICB9Ci0KLSAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTil7Ci0gICAgY2libGUgPSBzb3VyY2U7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKLSAgICBjaWJsZSA9IHNvdXJjZTsKLSAgfQotCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciYgc291cmNlLCBnZW5lX3ZlY3RvciYgY2libGUsIGludCBOKSB7IGNpYmxlID0gc291cmNlOyB9CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2JsYXplL21haW4uY3BwIGIvYmVuY2gvYnRsL2xpYnMvYmxhemUvbWFpbi5jcHAKaW5kZXggY2NhZTBjYi4uN2Q5ZTc4NCAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvYmxhemUvbWFpbi5jcHAKKysrIGIvYmVuY2gvYnRsL2xpYnMvYmxhemUvbWFpbi5jcHAKQEAgLTIyLDE5ICsyMiwxNSBAQAogCiBCVExfTUFJTjsKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CisgIGJlbmNoPEFjdGlvbl9heHB5PGJsYXplX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSwgTUFYX0FYUFksIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F4cGJ5PGJsYXplX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSwgTUFYX0FYUFksIE5CX1BPSU5UKTsKIAotICBiZW5jaDxBY3Rpb25fYXhweTxibGF6ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fYXhwYnk8YmxhemVfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKLQotICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGJsYXplX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX2F0dl9wcm9kdWN0PGJsYXplX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxibGF6ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxibGF6ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDxibGF6ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8YmxhemVfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NViwgTUFYX01WLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDxibGF6ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLCBNQVhfTVYsIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxibGF6ZV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0YV9wcm9kdWN0PGJsYXplX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sIE1BWF9NTSwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYWF0X3Byb2R1Y3Q8YmxhemVfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CiAKICAgcmV0dXJuIDA7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlLmhoCmluZGV4IGRjYjlmNTYuLjk1NWM4MTYgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9saWJzL2JsaXR6L2JsaXR6X0xVX3NvbHZlX2ludGVyZmFjZS5oaAorKysgYi9iZW5jaC9idGwvbGlicy9ibGl0ei9ibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKQEAgLTEsMTQgKzEsMTQgQEAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIEZpbGUgICA6ICBibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjMxIENFU1QgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDcgKzE2LDcgQEAKIC8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0vLyAKKy8vCiAjaWZuZGVmIEJMSVRaX0xVX1NPTFZFX0lOVEVSRkFDRV9ISAogI2RlZmluZSBCTElUWl9MVV9TT0xWRV9JTlRFUkZBQ0VfSEgKIApAQCAtMjUsMTY4ICsyNSwxMzYgQEAKIAogQlpfVVNJTkdfTkFNRVNQQUNFKGJsaXR6KQogCi10ZW1wbGF0ZTxjbGFzcyByZWFsPgotY2xhc3MgYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlIDogcHVibGljIGJsaXR6X2ludGVyZmFjZTxyZWFsPgotewotCi1wdWJsaWMgOgotCit0ZW1wbGF0ZSA8Y2xhc3MgcmVhbD4KK2NsYXNzIGJsaXR6X0xVX3NvbHZlX2ludGVyZmFjZSA6IHB1YmxpYyBibGl0el9pbnRlcmZhY2U8cmVhbD4geworIHB1YmxpYzoKICAgdHlwZWRlZiB0eXBlbmFtZSBibGl0el9pbnRlcmZhY2U8cmVhbD46OmdlbmVfbWF0cml4IGdlbmVfbWF0cml4OwogICB0eXBlZGVmIHR5cGVuYW1lIGJsaXR6X2ludGVyZmFjZTxyZWFsPjo6Z2VuZV92ZWN0b3IgZ2VuZV92ZWN0b3I7CiAKLSAgdHlwZWRlZiBibGl0ejo6QXJyYXk8aW50LDE+IFBpdm90X1ZlY3RvcjsKKyAgdHlwZWRlZiBibGl0ejo6QXJyYXk8aW50LCAxPiBQaXZvdF9WZWN0b3I7CiAKLSAgaW5saW5lIHN0YXRpYyB2b2lkIG5ld19QaXZvdF9WZWN0b3IoUGl2b3RfVmVjdG9yICYgcGl2b3QsaW50IE4pCi0gIHsKKyAgaW5saW5lIHN0YXRpYyB2b2lkIG5ld19QaXZvdF9WZWN0b3IoUGl2b3RfVmVjdG9yICZwaXZvdCwgaW50IE4pIHsgcGl2b3QucmVzaXplKE4pOyB9CiAKLSAgICBwaXZvdC5yZXNpemUoTik7CisgIGlubGluZSBzdGF0aWMgdm9pZCBmcmVlX1Bpdm90X1ZlY3RvcihQaXZvdF9WZWN0b3IgJnBpdm90KSB7IHJldHVybjsgfQogCi0gIH0KKyAgc3RhdGljIGlubGluZSByZWFsIG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoY29uc3QgZ2VuZV9tYXRyaXggJkEsIGdlbmVfdmVjdG9yIEIsIGludCByb3csIGludCBjb2xfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xfZW5kKSB7CisgICAgcmVhbCBzb21tZSA9IDAuOwogCi0gIGlubGluZSBzdGF0aWMgdm9pZCBmcmVlX1Bpdm90X1ZlY3RvcihQaXZvdF9WZWN0b3IgJiBwaXZvdCkKLSAgewotICAgIAotICAgIHJldHVybjsKLQotICB9Ci0KLQotICBzdGF0aWMgaW5saW5lIHJlYWwgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3NsaWNlZChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yIEIsIGludCByb3csIGludCBjb2xfc3RhcnQsIGludCBjb2xfZW5kKQotICB7Ci0gICAgCi0gICAgcmVhbCBzb21tZT0wLjsKLSAgICAKLSAgICBmb3IgKGludCBqPWNvbF9zdGFydCA7IGo8Y29sX2VuZCsxIDsgaisrKXsKLQkKLQlzb21tZSs9QShyb3csaikqQihqKTsKLQkKKyAgICBmb3IgKGludCBqID0gY29sX3N0YXJ0OyBqIDwgY29sX2VuZCArIDE7IGorKykgeworICAgICAgc29tbWUgKz0gQShyb3csIGopICogQihqKTsKICAgICB9CiAKICAgICByZXR1cm4gc29tbWU7Ci0KICAgfQogCisgIHN0YXRpYyBpbmxpbmUgcmVhbCBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKGdlbmVfbWF0cml4ICZBLCBpbnQgcm93LCBpbnQgY29sX3N0YXJ0LCBpbnQgY29sX2VuZCwgZ2VuZV9tYXRyaXggJkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dfc2hpZnQsIGludCBjb2wpIHsKKyAgICByZWFsIHNvbW1lID0gMC47CiAKLQotCi0gIHN0YXRpYyBpbmxpbmUgcmVhbCBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKGdlbmVfbWF0cml4ICYgQSwgaW50IHJvdywgaW50IGNvbF9zdGFydCwgaW50IGNvbF9lbmQsIGdlbmVfbWF0cml4ICYgQiwgaW50IHJvd19zaGlmdCwgaW50IGNvbCApCi0gIHsKLSAgICAKLSAgICByZWFsIHNvbW1lPTAuOwotICAgIAotICAgIGZvciAoaW50IGo9Y29sX3N0YXJ0IDsgajxjb2xfZW5kKzEgOyBqKyspewotCQotCXNvbW1lKz1BKHJvdyxqKSpCKGorcm93X3NoaWZ0LGNvbCk7Ci0JCisgICAgZm9yIChpbnQgaiA9IGNvbF9zdGFydDsgaiA8IGNvbF9lbmQgKyAxOyBqKyspIHsKKyAgICAgIHNvbW1lICs9IEEocm93LCBqKSAqIEIoaiArIHJvd19zaGlmdCwgY29sKTsKICAgICB9CiAKICAgICByZXR1cm4gc29tbWU7Ci0KICAgfQogCi0gIGlubGluZSBzdGF0aWMgdm9pZCBMVV9mYWN0b3IoZ2VuZV9tYXRyaXggJiBMVSwgUGl2b3RfVmVjdG9yICYgcGl2b3QsIGludCBOKQotICB7Ci0KLSAgICBBU1NFUlQoIExVLnJvd3MoKT09TFUuY29scygpICkgOwotICAgIGludCBpbmRleF9tYXggPSAwIDsKLSAgICByZWFsIGJpZyA9IDAuIDsKLSAgICByZWFsIHRoZVN1bSA9IDAuIDsKLSAgICByZWFsIGR1bSA9IDAuIDsKKyAgaW5saW5lIHN0YXRpYyB2b2lkIExVX2ZhY3RvcihnZW5lX21hdHJpeCAmTFUsIFBpdm90X1ZlY3RvciAmcGl2b3QsIGludCBOKSB7CisgICAgQVNTRVJUKExVLnJvd3MoKSA9PSBMVS5jb2xzKCkpOworICAgIGludCBpbmRleF9tYXggPSAwOworICAgIHJlYWwgYmlnID0gMC47CisgICAgcmVhbCB0aGVTdW0gPSAwLjsKKyAgICByZWFsIGR1bSA9IDAuOwogICAgIC8vIEdldCB0aGUgaW1wbGljaXQgc2NhbGluZyBpbmZvcm1hdGlvbiA6Ci0gICAgZ2VuZV92ZWN0b3IgSW1wbGljaXRTY2FsaW5nKCBOICkgOwotICAgIGZvciggaW50IGk9MDsgaTxOOyBpKysgKSB7Ci0gICAgICBiaWcgPSAwLiA7Ci0gICAgICBmb3IoIGludCBqPTA7IGo8TjsgaisrICkgewotCWlmKCBhYnMoIExVKCBpLCBqICkgKT49YmlnICkgYmlnID0gYWJzKCBMVSggaSwgaiApICkgOworICAgIGdlbmVfdmVjdG9yIEltcGxpY2l0U2NhbGluZyhOKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgYmlnID0gMC47CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgeworICAgICAgICBpZiAoYWJzKExVKGksIGopKSA+PSBiaWcpIGJpZyA9IGFicyhMVShpLCBqKSk7CiAgICAgICB9Ci0gICAgICBpZiggYmlnPT0wLiApIHsKLQlJTkZPUyggImJsaXR6X0xVX2ZhY3Rvcjo6U2luZ3VsYXIgbWF0cml4IiApIDsKLQlleGl0KCAwICkgOworICAgICAgaWYgKGJpZyA9PSAwLikgeworICAgICAgICBJTkZPUygiYmxpdHpfTFVfZmFjdG9yOjpTaW5ndWxhciBtYXRyaXgiKTsKKyAgICAgICAgZXhpdCgwKTsKICAgICAgIH0KLSAgICAgIEltcGxpY2l0U2NhbGluZyggaSApID0gMS4vYmlnIDsKKyAgICAgIEltcGxpY2l0U2NhbGluZyhpKSA9IDEuIC8gYmlnOwogICAgIH0KICAgICAvLyBMb29wIG92ZXIgY29sdW1ucyBvZiBDcm91dCdzIG1ldGhvZCA6Ci0gICAgZm9yKCBpbnQgaj0wOyBqPE47IGorKyApIHsKLSAgICAgIGZvciggaW50IGk9MDsgaTxqOyBpKysgKSB7Ci0JdGhlU3VtID0gTFUoIGksIGogKSA7Ci0JdGhlU3VtIC09IG1hdHJpeF9tYXRyaXhfcHJvZHVjdF9zbGljZWQoTFUsIGksIDAsIGktMSwgTFUsIDAsIGopIDsKLQkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGZyb21TdGFydCwgaS0xICkgKSpMVSggUmFuZ2UoIGZyb21TdGFydCwgaS0xICksIGogKSApIDsKLQlMVSggaSwgaiApID0gdGhlU3VtIDsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICAgICAgdGhlU3VtID0gTFUoaSwgaik7CisgICAgICAgIHRoZVN1bSAtPSBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKExVLCBpLCAwLCBpIC0gMSwgTFUsIDAsIGopOworICAgICAgICAvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGZyb21TdGFydCwgaS0xICkgKSpMVSggUmFuZ2UoIGZyb21TdGFydCwgaS0xICksIGogKSApIDsKKyAgICAgICAgTFUoaSwgaikgPSB0aGVTdW07CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gU2VhcmNoIGZvciB0aGUgbGFyZ2VzdCBwaXZvdCBlbGVtZW50IDoKLSAgICAgIGJpZyA9IDAuIDsKLSAgICAgIGZvciggaW50IGk9ajsgaTxOOyBpKysgKSB7Ci0JdGhlU3VtID0gTFUoIGksIGogKSA7Ci0JdGhlU3VtIC09IG1hdHJpeF9tYXRyaXhfcHJvZHVjdF9zbGljZWQoTFUsIGksIDAsIGotMSwgTFUsIDAsIGopIDsKLQkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGZyb21TdGFydCwgai0xICkgKSpMVSggUmFuZ2UoIGZyb21TdGFydCwgai0xICksIGogKSApIDsKLQlMVSggaSwgaiApID0gdGhlU3VtIDsKLQlpZiggKEltcGxpY2l0U2NhbGluZyggaSApKmFicyggdGhlU3VtICkpPj1iaWcgKSB7Ci0JICBkdW0gPSBJbXBsaWNpdFNjYWxpbmcoIGkgKSphYnMoIHRoZVN1bSApIDsKLQkgIGJpZyA9IGR1bSA7Ci0JICBpbmRleF9tYXggPSBpIDsKLQl9CisgICAgICBiaWcgPSAwLjsKKyAgICAgIGZvciAoaW50IGkgPSBqOyBpIDwgTjsgaSsrKSB7CisgICAgICAgIHRoZVN1bSA9IExVKGksIGopOworICAgICAgICB0aGVTdW0gLT0gbWF0cml4X21hdHJpeF9wcm9kdWN0X3NsaWNlZChMVSwgaSwgMCwgaiAtIDEsIExVLCAwLCBqKTsKKyAgICAgICAgLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApLCBqICkgKSA7CisgICAgICAgIExVKGksIGopID0gdGhlU3VtOworICAgICAgICBpZiAoKEltcGxpY2l0U2NhbGluZyhpKSAqIGFicyh0aGVTdW0pKSA+PSBiaWcpIHsKKyAgICAgICAgICBkdW0gPSBJbXBsaWNpdFNjYWxpbmcoaSkgKiBhYnModGhlU3VtKTsKKyAgICAgICAgICBiaWcgPSBkdW07CisgICAgICAgICAgaW5kZXhfbWF4ID0gaTsKKyAgICAgICAgfQogICAgICAgfQogICAgICAgLy8gSW50ZXJjaGFuZ2luZyByb3dzIGFuZCB0aGUgc2NhbGUgZmFjdG9yIDoKLSAgICAgIGlmKCBqIT1pbmRleF9tYXggKSB7Ci0JZm9yKCBpbnQgaz0wOyBrPE47IGsrKyApIHsKLQkgIGR1bSA9IExVKCBpbmRleF9tYXgsIGsgKSA7Ci0JICBMVSggaW5kZXhfbWF4LCBrICkgPSBMVSggaiwgayApIDsKLQkgIExVKCBqLCBrICkgPSBkdW0gOwotCX0KLQlJbXBsaWNpdFNjYWxpbmcoIGluZGV4X21heCApID0gSW1wbGljaXRTY2FsaW5nKCBqICkgOworICAgICAgaWYgKGogIT0gaW5kZXhfbWF4KSB7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgTjsgaysrKSB7CisgICAgICAgICAgZHVtID0gTFUoaW5kZXhfbWF4LCBrKTsKKyAgICAgICAgICBMVShpbmRleF9tYXgsIGspID0gTFUoaiwgayk7CisgICAgICAgICAgTFUoaiwgaykgPSBkdW07CisgICAgICAgIH0KKyAgICAgICAgSW1wbGljaXRTY2FsaW5nKGluZGV4X21heCkgPSBJbXBsaWNpdFNjYWxpbmcoaik7CiAgICAgICB9Ci0gICAgICBwaXZvdCggaiApID0gaW5kZXhfbWF4IDsKLSAgICAgIGlmICggTFUoIGosIGogKT09MC4gKSBMVSggaiwgaiApID0gMS5lLTIwIDsKKyAgICAgIHBpdm90KGopID0gaW5kZXhfbWF4OworICAgICAgaWYgKExVKGosIGopID09IDAuKSBMVShqLCBqKSA9IDEuZS0yMDsKICAgICAgIC8vIERpdmlkZSBieSB0aGUgcGl2b3QgZWxlbWVudCA6Ci0gICAgICBpZiggajxOICkgewotCWR1bSA9IDEuL0xVKCBqLCBqICkgOwotCWZvciggaW50IGk9aisxOyBpPE47IGkrKyApIExVKCBpLCBqICkgKj0gZHVtIDsKKyAgICAgIGlmIChqIDwgTikgeworICAgICAgICBkdW0gPSAxLiAvIExVKGosIGopOworICAgICAgICBmb3IgKGludCBpID0gaiArIDE7IGkgPCBOOyBpKyspIExVKGksIGopICo9IGR1bTsKICAgICAgIH0KICAgICB9Ci0KICAgfQogCi0gIGlubGluZSBzdGF0aWMgdm9pZCBMVV9zb2x2ZShjb25zdCBnZW5lX21hdHJpeCAmIExVLCBjb25zdCBQaXZvdF9WZWN0b3IgcGl2b3QsIGdlbmVfdmVjdG9yICZCLCBnZW5lX3ZlY3RvciBYLCBpbnQgTikKLSAgewotCisgIGlubGluZSBzdGF0aWMgdm9pZCBMVV9zb2x2ZShjb25zdCBnZW5lX21hdHJpeCAmTFUsIGNvbnN0IFBpdm90X1ZlY3RvciBwaXZvdCwgZ2VuZV92ZWN0b3IgJkIsIGdlbmVfdmVjdG9yIFgsIGludCBOKSB7CiAgICAgLy8gUG91ciBjb25zZXJ2ZXIgbGUgbWVtZSBoZWFkZXIsIG9uIHRyYXZhaWxsZSBzdXIgWCwgY29waWUgZHUgc2Vjb25kLW1lbWJyZSBCCi0gICAgWCA9IEIuY29weSgpIDsKLSAgICBBU1NFUlQoIExVLnJvd3MoKT09TFUuY29scygpICkgOwotICAgIGZpcnN0SW5kZXggaW5kSSA7CisgICAgWCA9IEIuY29weSgpOworICAgIEFTU0VSVChMVS5yb3dzKCkgPT0gTFUuY29scygpKTsKKyAgICBmaXJzdEluZGV4IGluZEk7CiAgICAgLy8gRm9yd2FyZCBzdWJzdGl0dXRpb24gOgotICAgIGludCBpaSA9IDAgOwotICAgIHJlYWwgdGhlU3VtID0gMC4gOwotICAgIGZvciggaW50IGk9MDsgaTxOOyBpKysgKSB7Ci0gICAgICBpbnQgaXAgPSBwaXZvdCggaSApIDsKLSAgICAgIHRoZVN1bSA9IFgoIGlwICkgOworICAgIGludCBpaSA9IDA7CisgICAgcmVhbCB0aGVTdW0gPSAwLjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgaW50IGlwID0gcGl2b3QoaSk7CisgICAgICB0aGVTdW0gPSBYKGlwKTsKICAgICAgIC8vICAgICAgdGhlU3VtID0gQiggaXAgKSA7Ci0gICAgICBYKCBpcCApID0gWCggaSApIDsKKyAgICAgIFgoaXApID0gWChpKTsKICAgICAgIC8vICAgICAgQiggaXAgKSA9IEIoIGkgKSA7Ci0gICAgICBpZiggaWkgKSB7Ci0JdGhlU3VtIC09IG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoTFUsIFgsIGksIGlpLTEsIGktMSkgOwotCS8vCXRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaWktMSwgaS0xICkgKSpYKCBSYW5nZSggaWktMSwgaS0xICkgKSApIDsKLQkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGlpLTEsIGktMSApICkqQiggUmFuZ2UoIGlpLTEsIGktMSApICkgKSA7Ci0gICAgICB9IGVsc2UgaWYoIHRoZVN1bSApIHsKLQlpaSA9IGkrMSA7CisgICAgICBpZiAoaWkpIHsKKyAgICAgICAgdGhlU3VtIC09IG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoTFUsIFgsIGksIGlpIC0gMSwgaSAtIDEpOworICAgICAgICAvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGlpLTEsIGktMSApICkqWCggUmFuZ2UoIGlpLTEsIGktMSApICkgKSA7CisgICAgICAgIC8vCXRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaWktMSwgaS0xICkgKSpCKCBSYW5nZSggaWktMSwgaS0xICkgKSApIDsKKyAgICAgIH0gZWxzZSBpZiAodGhlU3VtKSB7CisgICAgICAgIGlpID0gaSArIDE7CiAgICAgICB9Ci0gICAgICBYKCBpICkgPSB0aGVTdW0gOworICAgICAgWChpKSA9IHRoZVN1bTsKICAgICAgIC8vICAgICAgQiggaSApID0gdGhlU3VtIDsKICAgICB9CiAgICAgLy8gQmFja3N1YnN0aXR1dGlvbiA6Ci0gICAgZm9yKCBpbnQgaT1OLTE7IGk+PTA7IGktLSApIHsKLSAgICAgIHRoZVN1bSA9IFgoIGkgKSA7CisgICAgZm9yIChpbnQgaSA9IE4gLSAxOyBpID49IDA7IGktLSkgeworICAgICAgdGhlU3VtID0gWChpKTsKICAgICAgIC8vICAgICAgdGhlU3VtID0gQiggaSApIDsKLSAgICAgIHRoZVN1bSAtPSBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKExVLCBYLCBpLCBpKzEsIE4pIDsKKyAgICAgIHRoZVN1bSAtPSBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKExVLCBYLCBpLCBpICsgMSwgTik7CiAgICAgICAvLyAgICAgIHRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaSsxLCB0b0VuZCApICkqWCggUmFuZ2UoIGkrMSwgdG9FbmQgKSApICkgOwogICAgICAgLy8gICAgICB0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGkrMSwgdG9FbmQgKSApKkIoIFJhbmdlKCBpKzEsIHRvRW5kICkgKSApIDsKICAgICAgIC8vIFN0b3JlIGEgY29tcG9uZW50IG9mIHRoZSBzb2x1dGlvbiB2ZWN0b3IgOgotICAgICAgWCggaSApID0gdGhlU3VtL0xVKCBpLCBpICkgOworICAgICAgWChpKSA9IHRoZVN1bSAvIExVKGksIGkpOwogICAgICAgLy8gICAgICBCKCBpICkgPSB0aGVTdW0vTFUoIGksIGkgKSA7CiAgICAgfQotCiAgIH0KLQogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9ibGl0ei9ibGl0el9pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy9ibGl0ei9ibGl0el9pbnRlcmZhY2UuaGgKaW5kZXggYTY3YzQ3Yy4uYjA3NTBjMCAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovYmxpdHpfaW50ZXJmYWNlLmhoCisrKyBiL2JlbmNoL2J0bC9saWJzL2JsaXR6L2JsaXR6X2ludGVyZmFjZS5oaApAQCAtMzAsMTE4ICszMCwxMDggQEAKIAogQlpfVVNJTkdfTkFNRVNQQUNFKGJsaXR6KQogCi10ZW1wbGF0ZTxjbGFzcyByZWFsPgotY2xhc3MgYmxpdHpfaW50ZXJmYWNlewordGVtcGxhdGUgPGNsYXNzIHJlYWw+CitjbGFzcyBibGl0el9pbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZTsKIAotcHVibGljIDoKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiBzdGxfdmVjdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0bF92ZWN0b3I+IHN0bF9tYXRyaXg7CiAKLSAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZSA7Ci0KLSAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiAgc3RsX3ZlY3RvcjsKLSAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yID4gc3RsX21hdHJpeDsKLQotICB0eXBlZGVmIGJsaXR6OjpBcnJheTxyZWFsLCAyPiAgZ2VuZV9tYXRyaXg7Ci0gIHR5cGVkZWYgYmxpdHo6OkFycmF5PHJlYWwsIDE+ICBnZW5lX3ZlY3RvcjsKLS8vICAgdHlwZWRlZiBibGl0ejo6TWF0cml4PHJlYWwsIGJsaXR6OjpDb2x1bW5NYWpvcj4gIGdlbmVfbWF0cml4OwotLy8gICB0eXBlZGVmIGJsaXR6OjpWZWN0b3I8cmVhbD4gZ2VuZV92ZWN0b3I7CisgIHR5cGVkZWYgYmxpdHo6OkFycmF5PHJlYWwsIDI+IGdlbmVfbWF0cml4OworICB0eXBlZGVmIGJsaXR6OjpBcnJheTxyZWFsLCAxPiBnZW5lX3ZlY3RvcjsKKyAgLy8gICB0eXBlZGVmIGJsaXR6OjpNYXRyaXg8cmVhbCwgYmxpdHo6OkNvbHVtbk1ham9yPiAgZ2VuZV9tYXRyaXg7CisgIC8vICAgdHlwZWRlZiBibGl0ejo6VmVjdG9yPHJlYWw+IGdlbmVfdmVjdG9yOwogCiAgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSgpIHsgcmV0dXJuICJibGl0eiI7IH0KIAotICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIEEsIGludCBOKXt9CisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4JiBBLCBpbnQgTikge30KIAotICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciAmIEIpe30KKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3ImIEIpIHt9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7Ci0gICAgQS5yZXNpemUoQV9zdGxbMF0uc2l6ZSgpLEFfc3RsLnNpemUoKSk7Ci0gICAgZm9yIChpbnQgaj0wOyBqPEFfc3RsLnNpemUoKSA7IGorKyl7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8QV9zdGxbal0uc2l6ZSgpIDsgaSsrKXsKLSAgICAgICAgQShpLGopPUFfc3RsW2pdW2ldOworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgeworICAgIEEucmVzaXplKEFfc3RsWzBdLnNpemUoKSwgQV9zdGwuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IEFfc3RsLnNpemUoKTsgaisrKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFfc3RsW2pdLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEEoaSwgaikgPSBBX3N0bFtqXVtpXTsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciYgQiwgc3RsX3ZlY3RvciYgQl9zdGwpIHsKICAgICBCLnJlc2l6ZShCX3N0bC5zaXplKCkpOwotICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspewotICAgICAgQihpKT1CX3N0bFtpXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJfc3RsLnNpemUoKTsgaSsrKSB7CisgICAgICBCKGkpID0gQl9zdGxbaV07CiAgICAgfQogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpewotICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspewotICAgICAgQl9zdGxbaV09QihpKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3ImIEIsIHN0bF92ZWN0b3ImIEJfc3RsKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCX3N0bC5zaXplKCk7IGkrKykgeworICAgICAgQl9zdGxbaV0gPSBCKGkpOwogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKLSAgICBpbnQgTj1BX3N0bC5zaXplKCk7Ci0gICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCYgQSwgc3RsX21hdHJpeCYgQV9zdGwpIHsKKyAgICBpbnQgTiA9IEFfc3RsLnNpemUoKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgQV9zdGxbal0ucmVzaXplKE4pOwotICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspCi0gICAgICAgIEFfc3RsW2pdW2ldID0gQShpLGopOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIEFfc3RsW2pdW2ldID0gQShpLCBqKTsKICAgICB9CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKQotICB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGNvbnN0IGdlbmVfbWF0cml4JiBCLCBnZW5lX21hdHJpeCYgWCwgaW50IE4pIHsKICAgICBmaXJzdEluZGV4IGk7CiAgICAgc2Vjb25kSW5kZXggajsKICAgICB0aGlyZEluZGV4IGs7Ci0gICAgWCA9IHN1bShBKGksaykgKiBCKGssaiksIGspOworICAgIFggPSBzdW0oQShpLCBrKSAqIEIoaywgaiksIGspOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTikKLSAgeworICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGdlbmVfbWF0cml4JiBYLCBpbnQgTikgewogICAgIGZpcnN0SW5kZXggaTsKICAgICBzZWNvbmRJbmRleCBqOwogICAgIHRoaXJkSW5kZXggazsKLSAgICBYID0gc3VtKEEoayxpKSAqIEEoayxqKSwgayk7CisgICAgWCA9IHN1bShBKGssIGkpICogQShrLCBqKSwgayk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgYWF0X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKQotICB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCYgQSwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKSB7CiAgICAgZmlyc3RJbmRleCBpOwogICAgIHNlY29uZEluZGV4IGo7CiAgICAgdGhpcmRJbmRleCBrOwotICAgIFggPSBzdW0oQShpLGspICogQShqLGspLCBrKTsKKyAgICBYID0gc3VtKEEoaSwgaykgKiBBKGosIGspLCBrKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pCi0gIHsKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF92ZWN0b3JfcHJvZHVjdChnZW5lX21hdHJpeCYgQSwgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgewogICAgIGZpcnN0SW5kZXggaTsKICAgICBzZWNvbmRJbmRleCBqOwotICAgIFggPSBzdW0oQShpLGopKkIoaiksaik7CisgICAgWCA9IHN1bShBKGksIGopICogQihqKSwgaik7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgYXR2X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pCi0gIHsKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0dl9wcm9kdWN0KGdlbmVfbWF0cml4JiBBLCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3ImIFgsIGludCBOKSB7CiAgICAgZmlyc3RJbmRleCBpOwogICAgIHNlY29uZEluZGV4IGo7Ci0gICAgWCA9IHN1bShBKGosaSkgKiBCKGopLGopOworICAgIFggPSBzdW0oQShqLCBpKSAqIEIoaiksIGopOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4pCi0gIHsKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciYgWCwgZ2VuZV92ZWN0b3ImIFksIGludCBOKSB7CiAgICAgZmlyc3RJbmRleCBpOwogICAgIFkgPSBZKGkpICsgY29lZiAqIFgoaSk7Ci0gICAgLy9ZICs9IGNvZWYgKiBYOworICAgIC8vIFkgKz0gY29lZiAqIFg7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4JiBzb3VyY2UsIGdlbmVfbWF0cml4JiBjaWJsZSwgaW50IE4pIHsKICAgICBjaWJsZSA9IHNvdXJjZTsKLSAgICAvL2NpYmxlLnRlbXBsYXRlIG9wZXJhdG9yPTxnZW5lX21hdHJpeD4oc291cmNlKTsKLS8vICAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7Ci0vLyAgICAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7Ci0vLyAgICAgICAgIGNpYmxlKGksaik9c291cmNlKGksaik7Ci0vLyAgICAgICB9Ci0vLyAgICAgfQorICAgIC8vIGNpYmxlLnRlbXBsYXRlIG9wZXJhdG9yPTxnZW5lX21hdHJpeD4oc291cmNlKTsKKyAgICAvLyAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICAgIC8vICAgICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKKyAgICAvLyAgICAgICAgIGNpYmxlKGksaik9c291cmNlKGksaik7CisgICAgLy8gICAgICAgfQorICAgIC8vICAgICB9CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKLSAgICAvL2NpYmxlLnRlbXBsYXRlIG9wZXJhdG9yPTxnZW5lX3ZlY3Rvcj4oc291cmNlKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yJiBzb3VyY2UsIGdlbmVfdmVjdG9yJiBjaWJsZSwgaW50IE4pIHsKKyAgICAvLyBjaWJsZS50ZW1wbGF0ZSBvcGVyYXRvcj08Z2VuZV92ZWN0b3I+KHNvdXJjZSk7CiAgICAgY2libGUgPSBzb3VyY2U7CiAgIH0KLQogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9ibGl0ei9idGxfYmxpdHouY3BwIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovYnRsX2JsaXR6LmNwcAppbmRleCAxNmQyYjU5Li5iMWNjOGYwIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9ibGl0ei9idGxfYmxpdHouY3BwCisrKyBiL2JlbmNoL2J0bC9saWJzL2JsaXR6L2J0bF9ibGl0ei5jcHAKQEAgLTMxLDIxICszMSwxNyBAQAogCiBCVExfTUFJTjsKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8YmxpdHpfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NViwgTUFYX01WLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLCBNQVhfTVYsIE5CX1BPSU5UKTsKIAotICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGJsaXR6X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX2F0dl9wcm9kdWN0PGJsaXR6X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0YV9wcm9kdWN0PGJsaXR6X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sIE1BWF9NTSwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYWF0X3Byb2R1Y3Q8YmxpdHpfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CiAKLSAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9heHB5PGJsaXR6X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSwgTUFYX0FYUFksIE5CX1BPSU5UKTsKIAotICBiZW5jaDxBY3Rpb25fYXhweTxibGl0el9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOwotCi0gIC8vYmVuY2g8QWN0aW9uX2x1X3NvbHZlPGJsaXR6X0xVX3NvbHZlX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTFUsTUFYX0xVLE5CX1BPSU5UKTsKKyAgLy8gYmVuY2g8QWN0aW9uX2x1X3NvbHZlPGJsaXR6X0xVX3NvbHZlX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTFUsTUFYX0xVLE5CX1BPSU5UKTsKIAogICByZXR1cm4gMDsKIH0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9ibGl0ei9idGxfdGlueV9ibGl0ei5jcHAgYi9iZW5jaC9idGwvbGlicy9ibGl0ei9idGxfdGlueV9ibGl0ei5jcHAKaW5kZXggOWZkZGRlNy4uYTc5MTFiYyAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovYnRsX3RpbnlfYmxpdHouY3BwCisrKyBiL2JlbmNoL2J0bC9saWJzL2JsaXR6L2J0bF90aW55X2JsaXR6LmNwcApAQCAtMjYsMTMgKzI2LDEwIEBACiAKIEJUTF9NQUlOOwogCi1pbnQgbWFpbigpCi17Ci0gIGJlbmNoX3N0YXRpYzxBY3Rpb25fYXhweSx0aW55X2JsaXR6X2ludGVyZmFjZT4oKTsKLSAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QsdGlueV9ibGl0el9pbnRlcmZhY2U+KCk7Ci0gIGJlbmNoX3N0YXRpYzxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LHRpbnlfYmxpdHpfaW50ZXJmYWNlPigpOworaW50IG1haW4oKSB7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fYXhweSwgdGlueV9ibGl0el9pbnRlcmZhY2U+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LCB0aW55X2JsaXR6X2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QsIHRpbnlfYmxpdHpfaW50ZXJmYWNlPigpOwogCiAgIHJldHVybiAwOwogfQotCi0KZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2JsaXR6L3RpbnlfYmxpdHpfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovdGlueV9ibGl0el9pbnRlcmZhY2UuaGgKaW5kZXggNmIyNmRiNy4uZGFhZDE0ZSAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvYmxpdHovdGlueV9ibGl0el9pbnRlcmZhY2UuaGgKKysrIGIvYmVuY2gvYnRsL2xpYnMvYmxpdHovdGlueV9ibGl0el9pbnRlcmZhY2UuaGgKQEAgLTMwLDc3ICszMCw2MiBAQAogCiBCWl9VU0lOR19OQU1FU1BBQ0UoYmxpdHopCiAKLXRlbXBsYXRlPGNsYXNzIHJlYWwsIGludCBTSVpFPgotY2xhc3MgdGlueV9ibGl0el9pbnRlcmZhY2UKLXsKK3RlbXBsYXRlIDxjbGFzcyByZWFsLCBpbnQgU0laRT4KK2NsYXNzIHRpbnlfYmxpdHpfaW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgcmVhbCByZWFsX3R5cGU7CiAKLXB1YmxpYyA6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yPiBzdGxfbWF0cml4OwogCi0gIHR5cGVkZWYgcmVhbCByZWFsX3R5cGUgOwotCi0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gIHN0bF92ZWN0b3I7Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3RvciA+IHN0bF9tYXRyaXg7Ci0KLSAgdHlwZWRlZiBUaW55VmVjdG9yPHJlYWwsU0laRT4gZ2VuZV92ZWN0b3I7Ci0gIHR5cGVkZWYgVGlueU1hdHJpeDxyZWFsLFNJWkUsU0laRT4gZ2VuZV9tYXRyaXg7CisgIHR5cGVkZWYgVGlueVZlY3RvcjxyZWFsLCBTSVpFPiBnZW5lX3ZlY3RvcjsKKyAgdHlwZWRlZiBUaW55TWF0cml4PHJlYWwsIFNJWkUsIFNJWkU+IGdlbmVfbWF0cml4OwogCiAgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSgpIHsgcmV0dXJuICJ0aW55X2JsaXR6IjsgfQogCi0gIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IE4pe30KKyAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXgmIEEsIGludCBOKSB7fQogCi0gIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yICYgQil7fQorICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciYgQikge30KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKLSAgICBmb3IgKGludCBqPTA7IGo8QV9zdGwuc2l6ZSgpIDsgaisrKQotICAgICAgZm9yIChpbnQgaT0wOyBpPEFfc3RsW2pdLnNpemUoKSA7IGkrKykKLSAgICAgICAgQShpLGopPUFfc3RsW2pdW2ldOworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgQV9zdGwuc2l6ZSgpOyBqKyspCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFfc3RsW2pdLnNpemUoKTsgaSsrKSBBKGksIGopID0gQV9zdGxbal1baV07CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKLSAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKQotICAgICAgQihpKSA9IEJfc3RsW2ldOworICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yJiBCLCBzdGxfdmVjdG9yJiBCX3N0bCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQl9zdGwuc2l6ZSgpOyBpKyspIEIoaSkgPSBCX3N0bFtpXTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKLSAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKQotICAgICAgQl9zdGxbaV0gPSBCKGkpOworICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciYgQiwgc3RsX3ZlY3RvciYgQl9zdGwpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJfc3RsLnNpemUoKTsgaSsrKSBCX3N0bFtpXSA9IEIoaSk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgewogICAgIGludCBOID0gQV9zdGwuc2l6ZSgpOwotICAgIGZvciAoaW50IGo9MDtqPE47aisrKQotICAgIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgQV9zdGxbal0ucmVzaXplKE4pOwotICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspCi0gICAgICAgIEFfc3RsW2pdW2ldID0gQShpLGopOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIEFfc3RsW2pdW2ldID0gQShpLCBqKTsKICAgICB9CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKXsKLSAgICBmb3IgKGludCBqPTA7ajxOO2orKykKLSAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKQotICAgICAgICBjaWJsZShpLGopID0gc291cmNlKGksaik7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X21hdHJpeChjb25zdCBnZW5lX21hdHJpeCYgc291cmNlLCBnZW5lX21hdHJpeCYgY2libGUsIGludCBOKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgY2libGUoaSwgaikgPSBzb3VyY2UoaSwgaik7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKLSAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciYgc291cmNlLCBnZW5lX3ZlY3RvciYgY2libGUsIGludCBOKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgIGNpYmxlKGkpID0gc291cmNlKGkpOwogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pewotICAgIFggPSBwcm9kdWN0KEEsQik7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGNvbnN0IGdlbmVfbWF0cml4JiBCLCBnZW5lX21hdHJpeCYgWCwgaW50IE4pIHsKKyAgICBYID0gcHJvZHVjdChBLCBCKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pewotICAgIFggPSBwcm9kdWN0KEEsQik7Ci0gIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF92ZWN0b3JfcHJvZHVjdChnZW5lX21hdHJpeCYgQSwgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgeyBYID0gcHJvZHVjdChBLCBCKTsgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KGNvbnN0IHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKLSAgICBZICs9IGNvZWYgKiBYOwotICB9Ci0KKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciYgWCwgZ2VuZV92ZWN0b3ImIFksIGludCBOKSB7IFkgKz0gY29lZiAqIFg7IH0KIH07CiAKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9laWdlbjIvYnRsX3RpbnlfZWlnZW4yLmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9idGxfdGlueV9laWdlbjIuY3BwCmluZGV4IGQxNTE1YmUuLmI3MGUzNWQgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9idGxfdGlueV9laWdlbjIuY3BwCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9idGxfdGlueV9laWdlbjIuY3BwCkBAIC0zMCwxNyArMzAsMTMgQEAKIAogQlRMX01BSU47CiAKLWludCBtYWluKCkKLXsKLQotICBiZW5jaF9zdGF0aWM8QWN0aW9uX2F4cHksZWlnZW4yX2ludGVyZmFjZT4oKTsKLSAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QsZWlnZW4yX2ludGVyZmFjZT4oKTsKLSAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QsZWlnZW4yX2ludGVyZmFjZT4oKTsKLSAgYmVuY2hfc3RhdGljPEFjdGlvbl9hdHZfcHJvZHVjdCxlaWdlbjJfaW50ZXJmYWNlPigpOwotICBiZW5jaF9zdGF0aWM8QWN0aW9uX2Nob2xlc2t5LGVpZ2VuMl9pbnRlcmZhY2U+KCk7Ci0gIGJlbmNoX3N0YXRpYzxBY3Rpb25fdHJpc29sdmUsZWlnZW4yX2ludGVyZmFjZT4oKTsKK2ludCBtYWluKCkgeworICBiZW5jaF9zdGF0aWM8QWN0aW9uX2F4cHksIGVpZ2VuMl9pbnRlcmZhY2U+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LCBlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCwgZWlnZW4yX2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9hdHZfcHJvZHVjdCwgZWlnZW4yX2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9jaG9sZXNreSwgZWlnZW4yX2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl90cmlzb2x2ZSwgZWlnZW4yX2ludGVyZmFjZT4oKTsKIAogICByZXR1cm4gMDsKIH0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9laWdlbjIvZWlnZW4yX2ludGVyZmFjZS5oaCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9laWdlbjJfaW50ZXJmYWNlLmhoCmluZGV4IDFkZWFiZGEuLjAxM2RlY2EgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9laWdlbjJfaW50ZXJmYWNlLmhoCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9laWdlbjJfaW50ZXJmYWNlLmhoCkBAIC0yNywxNDIgKzI3LDEzMyBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXRlbXBsYXRlPGNsYXNzIHJlYWwsIGludCBTSVpFPUR5bmFtaWM+Ci1jbGFzcyBlaWdlbjJfaW50ZXJmYWNlCi17Ci0KLXB1YmxpYyA6Ci0KLSAgZW51bSB7SXNGaXhlZFNpemUgPSAoU0laRSE9RHluYW1pYyl9OwordGVtcGxhdGUgPGNsYXNzIHJlYWwsIGludCBTSVpFID0gRHluYW1pYz4KK2NsYXNzIGVpZ2VuMl9pbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgZW51bSB7IElzRml4ZWRTaXplID0gKFNJWkUgIT0gRHluYW1pYykgfTsKIAogICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlOwogCiAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gc3RsX3ZlY3RvcjsKICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yPiBzdGxfbWF0cml4OwogCi0gIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxyZWFsLFNJWkUsU0laRT4gZ2VuZV9tYXRyaXg7Ci0gIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxyZWFsLFNJWkUsMT4gZ2VuZV92ZWN0b3I7CisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxyZWFsLCBTSVpFLCBTSVpFPiBnZW5lX21hdHJpeDsKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PHJlYWwsIFNJWkUsIDE+IGdlbmVfdmVjdG9yOwogCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICAjaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfU1NFKQotICAgIGlmIChTSVpFPT1EeW5hbWljKSByZXR1cm4gImVpZ2VuMiI7IGVsc2UgcmV0dXJuICJ0aW55X2VpZ2VuMiI7Ci0gICAgI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfQUxUSVZFQykgfHwgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfVlNYKQotICAgIGlmIChTSVpFPT1EeW5hbWljKSByZXR1cm4gImVpZ2VuMiI7IGVsc2UgcmV0dXJuICJ0aW55X2VpZ2VuMiI7Ci0gICAgI2Vsc2UKLSAgICBpZiAoU0laRT09RHluYW1pYykgcmV0dXJuICJlaWdlbjJfbm92ZWMiOyBlbHNlIHJldHVybiAidGlueV9laWdlbjJfbm92ZWMiOwotICAgICNlbmRpZgorICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUodm9pZCkgeworI2lmIGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFX1NTRSkKKyAgICBpZiAoU0laRSA9PSBEeW5hbWljKQorICAgICAgcmV0dXJuICJlaWdlbjIiOworICAgIGVsc2UKKyAgICAgIHJldHVybiAidGlueV9laWdlbjIiOworI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfQUxUSVZFQykgfHwgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfVlNYKQorICAgIGlmIChTSVpFID09IER5bmFtaWMpCisgICAgICByZXR1cm4gImVpZ2VuMiI7CisgICAgZWxzZQorICAgICAgcmV0dXJuICJ0aW55X2VpZ2VuMiI7CisjZWxzZQorICAgIGlmIChTSVpFID09IER5bmFtaWMpCisgICAgICByZXR1cm4gImVpZ2VuMl9ub3ZlYyI7CisgICAgZWxzZQorICAgICAgcmV0dXJuICJ0aW55X2VpZ2VuMl9ub3ZlYyI7CisjZW5kaWYKICAgfQogCi0gIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IE4pIHt9CisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4JiBBLCBpbnQgTikge30KIAotICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciAmIEIpIHt9CisgIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yJiBCKSB7fQogCi0gIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgdm9pZCBtYXRyaXhfZnJvbV9zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICBzdGF0aWMgQlRMX0RPTlRfSU5MSU5FIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgewogICAgIEEucmVzaXplKEFfc3RsWzBdLnNpemUoKSwgQV9zdGwuc2l6ZSgpKTsKIAotICAgIGZvciAoaW50IGo9MDsgajxBX3N0bC5zaXplKCkgOyBqKyspewotICAgICAgZm9yIChpbnQgaT0wOyBpPEFfc3RsW2pdLnNpemUoKSA7IGkrKyl7Ci0gICAgICAgIEEuY29lZmZSZWYoaSxqKSA9IEFfc3RsW2pdW2ldOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgQV9zdGwuc2l6ZSgpOyBqKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQV9zdGxbal0uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQS5jb2VmZlJlZihpLCBqKSA9IEFfc3RsW2pdW2ldOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKLSAgICBCLnJlc2l6ZShCX3N0bC5zaXplKCksMSk7CisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3ImIEIsIHN0bF92ZWN0b3ImIEJfc3RsKSB7CisgICAgQi5yZXNpemUoQl9zdGwuc2l6ZSgpLCAxKTsKIAotICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQl9zdGwuc2l6ZSgpOyBpKyspIHsKICAgICAgIEIuY29lZmZSZWYoaSkgPSBCX3N0bFtpXTsKICAgICB9CiAgIH0KIAotICBzdGF0aWMgQlRMX0RPTlRfSU5MSU5FICB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpewotICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspeworICBzdGF0aWMgQlRMX0RPTlRfSU5MSU5FIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciYgQiwgc3RsX3ZlY3RvciYgQl9zdGwpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJfc3RsLnNpemUoKTsgaSsrKSB7CiAgICAgICBCX3N0bFtpXSA9IEIuY29lZmYoaSk7CiAgICAgfQogICB9CiAKLSAgc3RhdGljIEJUTF9ET05UX0lOTElORSAgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKLSAgICBpbnQgTj1BX3N0bC5zaXplKCk7CisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgeworICAgIGludCBOID0gQV9zdGwuc2l6ZSgpOwogCi0gICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CiAgICAgICBBX3N0bFtqXS5yZXNpemUoTik7Ci0gICAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7Ci0gICAgICAgIEFfc3RsW2pdW2ldID0gQS5jb2VmZihpLGopOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgQV9zdGxbal1baV0gPSBBLmNvZWZmKGksIGopOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pewotICAgIFggPSAoQSpCKS5sYXp5KCk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGNvbnN0IGdlbmVfbWF0cml4JiBCLCBnZW5lX21hdHJpeCYgWCwgaW50IE4pIHsKKyAgICBYID0gKEEgKiBCKS5sYXp5KCk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNwb3NlZF9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pewotICAgIFggPSAoQS50cmFuc3Bvc2UoKSpCLnRyYW5zcG9zZSgpKS5sYXp5KCk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc3Bvc2VkX21hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCYgQSwgY29uc3QgZ2VuZV9tYXRyaXgmIEIsIGdlbmVfbWF0cml4JiBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE4pIHsKKyAgICBYID0gKEEudHJhbnNwb3NlKCkgKiBCLnRyYW5zcG9zZSgpKS5sYXp5KCk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKLSAgICBYID0gKEEudHJhbnNwb3NlKCkqQSkubGF6eSgpOworICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGdlbmVfbWF0cml4JiBYLCBpbnQgTikgeyBYID0gKEEudHJhbnNwb3NlKCkgKiBBKS5sYXp5KCk7IH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgYWF0X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGdlbmVfbWF0cml4JiBYLCBpbnQgTikgeyBYID0gKEEgKiBBLnRyYW5zcG9zZSgpKS5sYXp5KCk7IH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4JiBBLCBjb25zdCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3ImIFgsIGludCBOKSB7CisgICAgWCA9IChBICogQikgLyoubGF6eSgpKi87CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgYWF0X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKLSAgICBYID0gKEEqQS50cmFuc3Bvc2UoKSkubGF6eSgpOworICBzdGF0aWMgaW5saW5lIHZvaWQgYXR2X3Byb2R1Y3QoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4pIHsKKyAgICBYID0gKEEudHJhbnNwb3NlKCkgKiBCKSAvKi5sYXp5KCkqLzsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pewotICAgIFggPSAoQSpCKS8qLmxhenkoKSovOwotICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3ImIFgsIGdlbmVfdmVjdG9yJiBZLCBpbnQgTikgeyBZICs9IGNvZWYgKiBYOyB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF0dl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKLSAgICBYID0gKEEudHJhbnNwb3NlKCkqQikvKi5sYXp5KCkqLzsKLSAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgYXhwYnkocmVhbCBhLCBjb25zdCBnZW5lX3ZlY3RvciYgWCwgcmVhbCBiLCBnZW5lX3ZlY3RvciYgWSwgaW50IE4pIHsgWSA9IGEgKiBYICsgYiAqIFk7IH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShyZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7Ci0gICAgWSArPSBjb2VmICogWDsKLSAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXgmIHNvdXJjZSwgZ2VuZV9tYXRyaXgmIGNpYmxlLCBpbnQgTikgeyBjaWJsZSA9IHNvdXJjZTsgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBheHBieShyZWFsIGEsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgcmVhbCBiLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKLSAgICBZID0gYSpYICsgYipZOwotICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciYgc291cmNlLCBnZW5lX3ZlY3RvciYgY2libGUsIGludCBOKSB7IGNpYmxlID0gc291cmNlOyB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTil7Ci0gICAgY2libGUgPSBzb3VyY2U7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKLSAgICBjaWJsZSA9IHNvdXJjZTsKLSAgfQotCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCAmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4peworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXIoY29uc3QgZ2VuZV9tYXRyaXgmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4pIHsKICAgICBYID0gTC50ZW1wbGF0ZSBtYXJrZWQ8TG93ZXJUcmlhbmd1bGFyPigpLnNvbHZlVHJpYW5ndWxhcihCKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcl9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaXNvbHZlX2xvd2VyX21hdHJpeChjb25zdCBnZW5lX21hdHJpeCYgTCwgY29uc3QgZ2VuZV9tYXRyaXgmIEIsIGdlbmVfbWF0cml4JiBYLCBpbnQgTikgewogICAgIFggPSBMLnRlbXBsYXRlIG1hcmtlZDxMb3dlclRyaWFuZ3VsYXI+KCkuc29sdmVUcmlhbmd1bGFyKEIpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGNob2xlc2t5KGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjaG9sZXNreShjb25zdCBnZW5lX21hdHJpeCYgWCwgZ2VuZV9tYXRyaXgmIEMsIGludCBOKSB7CiAgICAgQyA9IFgubGx0KCkubWF0cml4TCgpOwotLy8gICAgIEMgPSBYOwotLy8gICAgIENob2xlc2t5PGdlbmVfbWF0cml4Pjo6Y29tcHV0ZUluUGxhY2UoQyk7Ci0vLyAgICAgQ2hvbGVza3k8Z2VuZV9tYXRyaXg+Ojpjb21wdXRlSW5QbGFjZUJsb2NrKEMpOworICAgIC8vICAgICBDID0gWDsKKyAgICAvLyAgICAgQ2hvbGVza3k8Z2VuZV9tYXRyaXg+Ojpjb21wdXRlSW5QbGFjZShDKTsKKyAgICAvLyAgICAgQ2hvbGVza3k8Z2VuZV9tYXRyaXg+Ojpjb21wdXRlSW5QbGFjZUJsb2NrKEMpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGx1X2RlY29tcChjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgQywgaW50IE4peworICBzdGF0aWMgaW5saW5lIHZvaWQgbHVfZGVjb21wKGNvbnN0IGdlbmVfbWF0cml4JiBYLCBnZW5lX21hdHJpeCYgQywgaW50IE4pIHsKICAgICBDID0gWC5sdSgpLm1hdHJpeExVKCk7Ci0vLyAgICAgQyA9IFguaW52ZXJzZSgpOworICAgIC8vICAgICBDID0gWC5pbnZlcnNlKCk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgTil7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlkaWFnb25hbGl6YXRpb24oY29uc3QgZ2VuZV9tYXRyaXgmIFgsIGdlbmVfbWF0cml4JiBDLCBpbnQgTikgewogICAgIEMgPSBUcmlkaWFnb25hbGl6YXRpb248Z2VuZV9tYXRyaXg+KFgpLnBhY2tlZE1hdHJpeCgpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGhlc3NlbmJlcmcoY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIGhlc3NlbmJlcmcoY29uc3QgZ2VuZV9tYXRyaXgmIFgsIGdlbmVfbWF0cml4JiBDLCBpbnQgTikgewogICAgIEMgPSBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxnZW5lX21hdHJpeD4oWCkucGFja2VkTWF0cml4KCk7CiAgIH0KLQotCi0KIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL21haW5fYWR2LmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX2Fkdi5jcHAKaW5kZXggZmUzMzY4OS4uMzM3YjRjOCAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL21haW5fYWR2LmNwcAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjIvbWFpbl9hZHYuY3BwCkBAIC0yNywxOCArMjcsMTUgQEAKIAogQlRMX01BSU47CiAKLWludCBtYWluKCkKLXsKLSAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlPGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl90cmlzb2x2ZV9tYXRyaXg8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX2Nob2xlc2t5PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9sdV9kZWNvbXA8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKLS8vICAgYmVuY2g8QWN0aW9uX3BhcnRpYWxfbHU8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKK2ludCBtYWluKCkgeworICBiZW5jaDxBY3Rpb25fdHJpc29sdmU8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sIE1BWF9NTSwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fdHJpc29sdmVfbWF0cml4PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2Nob2xlc2t5PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2x1X2RlY29tcDxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CisgIC8vICAgYmVuY2g8QWN0aW9uX3BhcnRpYWxfbHU8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKIAotICBiZW5jaDxBY3Rpb25faGVzc2VuYmVyZzxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uPGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9oZXNzZW5iZXJnPGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbjxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CiAKICAgcmV0dXJuIDA7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL21haW5fbGluZWFyLmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX2xpbmVhci5jcHAKaW5kZXggYzE3ZDE2Yy4uNmY5YTg5NCAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL21haW5fbGluZWFyLmNwcAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjIvbWFpbl9saW5lYXIuY3BwCkBAIC0yMiwxMyArMjIsOSBAQAogCiBCVExfTUFJTjsKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CisgIGJlbmNoPEFjdGlvbl9heHB5PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksIE1BWF9BWFBZLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9heHBieTxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLCBNQVhfQVhQWSwgTkJfUE9JTlQpOwogCi0gIGJlbmNoPEFjdGlvbl9heHB5PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fYXhwYnk8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7Ci0gIAogICByZXR1cm4gMDsKIH0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9laWdlbjIvbWFpbl9tYXRtYXQuY3BwIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL21haW5fbWF0bWF0LmNwcAppbmRleCBjZDlkYzljLi4zN2NlNDAxIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9laWdlbjIvbWFpbl9tYXRtYXQuY3BwCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX21hdG1hdC5jcHAKQEAgLTIyLDE0ICsyMiwxMSBAQAogCiBCVExfTUFJTjsKIAotaW50IG1haW4oKQotewotICBiZW5jaDxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0vLyAgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fYWF0X3Byb2R1Y3Q8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKLS8vICAgYmVuY2g8QWN0aW9uX3RybW08ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKK2ludCBtYWluKCkgeworICBiZW5jaDxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKKyAgLy8gICBiZW5jaDxBY3Rpb25fYXRhX3Byb2R1Y3Q8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2FhdF9wcm9kdWN0PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKKyAgLy8gICBiZW5jaDxBY3Rpb25fdHJtbTxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOwogCiAgIHJldHVybiAwOwogfQotCi0KZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX3ZlY21hdC5jcHAgYi9iZW5jaC9idGwvbGlicy9laWdlbjIvbWFpbl92ZWNtYXQuY3BwCmluZGV4IDhiNjZjZDIuLjk5NDcyZDggMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMi9tYWluX3ZlY21hdC5jcHAKKysrIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4yL21haW5fdmVjbWF0LmNwcApAQCAtMjIsMTUgKzIyLDEyIEBACiAKIEJUTF9NQUlOOwogCi1pbnQgbWFpbigpCi17Ci0gIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX2F0dl9wcm9kdWN0PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7Ci0vLyAgIGJlbmNoPEFjdGlvbl9zeW12PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7Ci0vLyAgIGJlbmNoPEFjdGlvbl9zeXIyPGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7Ci0vLyAgIGJlbmNoPEFjdGlvbl9nZXI8ZWlnZW4yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKK2ludCBtYWluKCkgeworICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLCBNQVhfTVYsIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0dl9wcm9kdWN0PGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLCBNQVhfTVYsIE5CX1BPSU5UKTsKKyAgLy8gICBiZW5jaDxBY3Rpb25fc3ltdjxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworICAvLyAgIGJlbmNoPEFjdGlvbl9zeXIyPGVpZ2VuMl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CisgIC8vICAgYmVuY2g8QWN0aW9uX2dlcjxlaWdlbjJfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOwogCiAgIHJldHVybiAwOwogfQotCi0KZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9idGxfdGlueV9laWdlbjMuY3BwIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL2J0bF90aW55X2VpZ2VuMy5jcHAKaW5kZXggZDE1MTViZS4uYjcwZTM1ZCAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL2J0bF90aW55X2VpZ2VuMy5jcHAKKysrIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL2J0bF90aW55X2VpZ2VuMy5jcHAKQEAgLTMwLDE3ICszMCwxMyBAQAogCiBCVExfTUFJTjsKIAotaW50IG1haW4oKQotewotCi0gIGJlbmNoX3N0YXRpYzxBY3Rpb25fYXhweSxlaWdlbjJfaW50ZXJmYWNlPigpOwotICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCxlaWdlbjJfaW50ZXJmYWNlPigpOwotICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCxlaWdlbjJfaW50ZXJmYWNlPigpOwotICBiZW5jaF9zdGF0aWM8QWN0aW9uX2F0dl9wcm9kdWN0LGVpZ2VuMl9pbnRlcmZhY2U+KCk7Ci0gIGJlbmNoX3N0YXRpYzxBY3Rpb25fY2hvbGVza3ksZWlnZW4yX2ludGVyZmFjZT4oKTsKLSAgYmVuY2hfc3RhdGljPEFjdGlvbl90cmlzb2x2ZSxlaWdlbjJfaW50ZXJmYWNlPigpOworaW50IG1haW4oKSB7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fYXhweSwgZWlnZW4yX2ludGVyZmFjZT4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QsIGVpZ2VuMl9pbnRlcmZhY2U+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LCBlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX2F0dl9wcm9kdWN0LCBlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX2Nob2xlc2t5LCBlaWdlbjJfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX3RyaXNvbHZlLCBlaWdlbjJfaW50ZXJmYWNlPigpOwogCiAgIHJldHVybiAwOwogfQotCi0KZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9laWdlbjNfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL2VpZ2VuM19pbnRlcmZhY2UuaGgKaW5kZXggMmUzMDJkMC4uNjAzNTU2MSAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL2VpZ2VuM19pbnRlcmZhY2UuaGgKKysrIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL2VpZ2VuM19pbnRlcmZhY2UuaGgKQEAgLTI0LDIxOSArMjQsMjAxIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdGVtcGxhdGU8Y2xhc3MgcmVhbCwgaW50IFNJWkU9RHluYW1pYz4KLWNsYXNzIGVpZ2VuM19pbnRlcmZhY2UKLXsKLQotcHVibGljIDoKLQotICBlbnVtIHtJc0ZpeGVkU2l6ZSA9IChTSVpFIT1EeW5hbWljKX07Cit0ZW1wbGF0ZSA8Y2xhc3MgcmVhbCwgaW50IFNJWkUgPSBEeW5hbWljPgorY2xhc3MgZWlnZW4zX2ludGVyZmFjZSB7CisgcHVibGljOgorICBlbnVtIHsgSXNGaXhlZFNpemUgPSAoU0laRSAhPSBEeW5hbWljKSB9OwogCiAgIHR5cGVkZWYgcmVhbCByZWFsX3R5cGU7CiAKICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiBzdGxfdmVjdG9yOwogICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0bF92ZWN0b3I+IHN0bF9tYXRyaXg7CiAKLSAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PHJlYWwsU0laRSxTSVpFPiBnZW5lX21hdHJpeDsKLSAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PHJlYWwsU0laRSwxPiBnZW5lX3ZlY3RvcjsKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PHJlYWwsIFNJWkUsIFNJWkU+IGdlbmVfbWF0cml4OworICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8cmVhbCwgU0laRSwgMT4gZ2VuZV92ZWN0b3I7CiAKLSAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKLSAgewotICAgIHJldHVybiBFSUdFTl9NQUtFU1RSSU5HKEJUTF9QUkVGSVgpOwotICB9CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSh2b2lkKSB7IHJldHVybiBFSUdFTl9NQUtFU1RSSU5HKEJUTF9QUkVGSVgpOyB9CiAKLSAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXggJiAvKkEqLywgaW50IC8qTiovKSB7fQorICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCYgLypBKi8sIGludCAvKk4qLykge30KIAotICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciAmIC8qQiovKSB7fQorICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciYgLypCKi8pIHt9CiAKLSAgc3RhdGljIEJUTF9ET05UX0lOTElORSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7CisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgdm9pZCBtYXRyaXhfZnJvbV9zdGwoZ2VuZV9tYXRyaXgmIEEsIHN0bF9tYXRyaXgmIEFfc3RsKSB7CiAgICAgQS5yZXNpemUoQV9zdGxbMF0uc2l6ZSgpLCBBX3N0bC5zaXplKCkpOwogCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaj0wOyBqPEFfc3RsLnNpemUoKSA7IGorKyl7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTA7IGk8QV9zdGxbal0uc2l6ZSgpIDsgaSsrKXsKLSAgICAgICAgQS5jb2VmZlJlZihpLGopID0gQV9zdGxbal1baV07CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaiA9IDA7IGogPCBBX3N0bC5zaXplKCk7IGorKykgeworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBBX3N0bFtqXS5zaXplKCk7IGkrKykgeworICAgICAgICBBLmNvZWZmUmVmKGksIGopID0gQV9zdGxbal1baV07CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgc3RhdGljIEJUTF9ET05UX0lOTElORSAgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpewotICAgIEIucmVzaXplKEJfc3RsLnNpemUoKSwxKTsKKyAgc3RhdGljIEJUTF9ET05UX0lOTElORSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciYgQiwgc3RsX3ZlY3RvciYgQl9zdGwpIHsKKyAgICBCLnJlc2l6ZShCX3N0bC5zaXplKCksIDEpOwogCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBCX3N0bC5zaXplKCk7IGkrKykgewogICAgICAgQi5jb2VmZlJlZihpKSA9IEJfc3RsW2ldOwogICAgIH0KICAgfQogCi0gIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7CisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yJiBCLCBzdGxfdmVjdG9yJiBCX3N0bCkgeworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgQl9zdGwuc2l6ZSgpOyBpKyspIHsKICAgICAgIEJfc3RsW2ldID0gQi5jb2VmZihpKTsKICAgICB9CiAgIH0KIAotICBzdGF0aWMgQlRMX0RPTlRfSU5MSU5FICB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpewotICAgIGludCAgTj1BX3N0bC5zaXplKCk7CisgIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgeworICAgIGludCBOID0gQV9zdGwuc2l6ZSgpOwogCi0gICAgZm9yIChpbnQgaj0wO2o8TjtqKyspeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CiAgICAgICBBX3N0bFtqXS5yZXNpemUoTik7Ci0gICAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7Ci0gICAgICAgIEFfc3RsW2pdW2ldID0gQS5jb2VmZihpLGopOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgQV9zdGxbal1baV0gPSBBLmNvZWZmKGksIGopOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50ICAvKk4qLyl7Ci0gICAgWC5ub2FsaWFzKCkgPSBBKkI7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGNvbnN0IGdlbmVfbWF0cml4JiBCLCBnZW5lX21hdHJpeCYgWCwgaW50IC8qTiovKSB7CisgICAgWC5ub2FsaWFzKCkgPSBBICogQjsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc3Bvc2VkX21hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgIC8qTiovKXsKLSAgICBYLm5vYWxpYXMoKSA9IEEudHJhbnNwb3NlKCkqQi50cmFuc3Bvc2UoKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9zZWRfbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4JiBBLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypOKi8pIHsKKyAgICBYLm5vYWxpYXMoKSA9IEEudHJhbnNwb3NlKCkgKiBCLnRyYW5zcG9zZSgpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgIC8qTiovKXsKLSAgICAvL1gubm9hbGlhcygpID0gQS50cmFuc3Bvc2UoKSpBOworICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGdlbmVfbWF0cml4JiBYLCBpbnQgLypOKi8pIHsKKyAgICAvLyBYLm5vYWxpYXMoKSA9IEEudHJhbnNwb3NlKCkqQTsKICAgICBYLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNldFplcm8oKTsKICAgICBYLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKEEudHJhbnNwb3NlKCkpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGFhdF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgIC8qTiovKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIGFhdF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4JiBBLCBnZW5lX21hdHJpeCYgWCwgaW50IC8qTiovKSB7CiAgICAgWC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7CiAgICAgWC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShBKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50ICAvKk4qLyl7Ci0gICAgWC5ub2FsaWFzKCkgPSBBKkI7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IC8qTiovKSB7CisgICAgWC5ub2FsaWFzKCkgPSBBICogQjsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBzeW12KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCAgLypOKi8peworICBzdGF0aWMgaW5saW5lIHZvaWQgc3ltdihjb25zdCBnZW5lX21hdHJpeCYgQSwgY29uc3QgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgLypOKi8pIHsKICAgICBYLm5vYWxpYXMoKSA9IChBLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIEIpOwotLy8gICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X3ZlY3RvcjxyZWFsLDAsTG93ZXJUcmlhbmd1bGFyQml0LGZhbHNlLGZhbHNlPihOLEEuZGF0YSgpLE4sIEIuZGF0YSgpLCAxLCBYLmRhdGEoKSwgMSk7CisgICAgLy8gICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X3ZlY3RvcjxyZWFsLDAsTG93ZXJUcmlhbmd1bGFyQml0LGZhbHNlLGZhbHNlPihOLEEuZGF0YSgpLE4sIEIuZGF0YSgpLCAxLAorICAgIC8vICAgICBYLmRhdGEoKSwgMSk7CiAgIH0KIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBTcmM+IHN0YXRpYyB2b2lkIHRyaWFzc2lnbihEZXN0JiBkc3QsIGNvbnN0IFNyYyYgc3JjKQotICB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXN0LCB0eXBlbmFtZSBTcmM+CisgIHN0YXRpYyB2b2lkIHRyaWFzc2lnbihEZXN0JiBkc3QsIGNvbnN0IFNyYyYgc3JjKSB7CiAgICAgdHlwZWRlZiB0eXBlbmFtZSBEZXN0OjpTY2FsYXIgU2NhbGFyOwogICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXQ7Ci0gICAgY29uc3QgaW50IFBhY2tldFNpemUgPSBzaXplb2YoUGFja2V0KS9zaXplb2YoU2NhbGFyKTsKKyAgICBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IHNpemVvZihQYWNrZXQpIC8gc2l6ZW9mKFNjYWxhcik7CiAgICAgaW50IHNpemUgPSBkc3QuY29scygpOwotICAgIGZvcihpbnQgaj0wOyBqPHNpemU7IGorPTEpCi0gICAgewotLy8gICAgICAgY29uc3QgaW50IGFsaWduZWRFbmQgPSBhbGlnbmVkU3RhcnQgKyAoKGlubmVyU2l6ZS1hbGlnbmVkU3RhcnQpICYgfnBhY2tldEFsaWduZWRNYXNrKTsKLSAgICAgIFNjYWxhciogQTAgPSBkc3QuZGF0YSgpICsgaipkc3Quc3RyaWRlKCk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqICs9IDEpIHsKKyAgICAgIC8vICAgICAgIGNvbnN0IGludCBhbGlnbmVkRW5kID0gYWxpZ25lZFN0YXJ0ICsgKChpbm5lclNpemUtYWxpZ25lZFN0YXJ0KSAmIH5wYWNrZXRBbGlnbmVkTWFzayk7CisgICAgICBTY2FsYXIqIEEwID0gZHN0LmRhdGEoKSArIGogKiBkc3Quc3RyaWRlKCk7CiAgICAgICBpbnQgc3RhcnRpID0gajsKICAgICAgIGludCBhbGlnbmVkRW5kID0gc3RhcnRpOwotICAgICAgaW50IGFsaWduZWRTdGFydCA9IChzdGFydGkpICsgaW50ZXJuYWw6OmZpcnN0X2FsaWduZWQoJkEwW3N0YXJ0aV0sIHNpemUtc3RhcnRpKTsKLSAgICAgIGFsaWduZWRFbmQgPSBhbGlnbmVkU3RhcnQgKyAoKHNpemUtYWxpZ25lZFN0YXJ0KS8oMipQYWNrZXRTaXplKSkqKFBhY2tldFNpemUqMik7CisgICAgICBpbnQgYWxpZ25lZFN0YXJ0ID0gKHN0YXJ0aSkgKyBpbnRlcm5hbDo6Zmlyc3RfYWxpZ25lZCgmQTBbc3RhcnRpXSwgc2l6ZSAtIHN0YXJ0aSk7CisgICAgICBhbGlnbmVkRW5kID0gYWxpZ25lZFN0YXJ0ICsgKChzaXplIC0gYWxpZ25lZFN0YXJ0KSAvICgyICogUGFja2V0U2l6ZSkpICogKFBhY2tldFNpemUgKiAyKTsKIAogICAgICAgLy8gZG8gdGhlIG5vbi12ZWN0b3JpemFibGUgcGFydCBvZiB0aGUgYXNzaWdubWVudAotICAgICAgZm9yIChpbnQgaW5kZXggPSBzdGFydGk7IGluZGV4PGFsaWduZWRTdGFydCA7ICsraW5kZXgpCi0gICAgICB7Ci0gICAgICAgIGlmKERlc3Q6OkZsYWdzJlJvd01ham9yQml0KQorICAgICAgZm9yIChpbnQgaW5kZXggPSBzdGFydGk7IGluZGV4IDwgYWxpZ25lZFN0YXJ0OyArK2luZGV4KSB7CisgICAgICAgIGlmIChEZXN0OjpGbGFncyAmIFJvd01ham9yQml0KQogICAgICAgICAgIGRzdC5jb3B5Q29lZmYoaiwgaW5kZXgsIHNyYyk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICBkc3QuY29weUNvZWZmKGluZGV4LCBqLCBzcmMpOwogICAgICAgfQogCiAgICAgICAvLyBkbyB0aGUgdmVjdG9yaXphYmxlIHBhcnQgb2YgdGhlIGFzc2lnbm1lbnQKLSAgICAgIGZvciAoaW50IGluZGV4ID0gYWxpZ25lZFN0YXJ0OyBpbmRleDxhbGlnbmVkRW5kOyBpbmRleCs9UGFja2V0U2l6ZSkKLSAgICAgIHsKLSAgICAgICAgaWYoRGVzdDo6RmxhZ3MmUm93TWFqb3JCaXQpCisgICAgICBmb3IgKGludCBpbmRleCA9IGFsaWduZWRTdGFydDsgaW5kZXggPCBhbGlnbmVkRW5kOyBpbmRleCArPSBQYWNrZXRTaXplKSB7CisgICAgICAgIGlmIChEZXN0OjpGbGFncyAmIFJvd01ham9yQml0KQogICAgICAgICAgIGRzdC50ZW1wbGF0ZSBjb3B5UGFja2V0PFNyYywgQWxpZ25lZCwgVW5hbGlnbmVkPihqLCBpbmRleCwgc3JjKTsKICAgICAgICAgZWxzZQogICAgICAgICAgIGRzdC50ZW1wbGF0ZSBjb3B5UGFja2V0PFNyYywgQWxpZ25lZCwgVW5hbGlnbmVkPihpbmRleCwgaiwgc3JjKTsKICAgICAgIH0KIAogICAgICAgLy8gZG8gdGhlIG5vbi12ZWN0b3JpemFibGUgcGFydCBvZiB0aGUgYXNzaWdubWVudAotICAgICAgZm9yIChpbnQgaW5kZXggPSBhbGlnbmVkRW5kOyBpbmRleDxzaXplOyArK2luZGV4KQotICAgICAgewotICAgICAgICBpZihEZXN0OjpGbGFncyZSb3dNYWpvckJpdCkKKyAgICAgIGZvciAoaW50IGluZGV4ID0gYWxpZ25lZEVuZDsgaW5kZXggPCBzaXplOyArK2luZGV4KSB7CisgICAgICAgIGlmIChEZXN0OjpGbGFncyAmIFJvd01ham9yQml0KQogICAgICAgICAgIGRzdC5jb3B5Q29lZmYoaiwgaW5kZXgsIHNyYyk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICBkc3QuY29weUNvZWZmKGluZGV4LCBqLCBzcmMpOwogICAgICAgfQotICAgICAgLy9kc3QuY29sKGopLnRhaWwoTi1qKSA9IHNyYy5jb2woaikudGFpbChOLWopOworICAgICAgLy8gZHN0LmNvbChqKS50YWlsKE4taikgPSBzcmMuY29sKGopLnRhaWwoTi1qKTsKICAgICB9CiAgIH0KIAotICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBzeXIyKGdlbmVfbWF0cml4ICYgQSwgIGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgIE4pewotICAgIC8vIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X3JhbmsyX3VwZGF0ZTxyZWFsLDAsTG93ZXJUcmlhbmd1bGFyQml0PihOLEEuZGF0YSgpLE4sIFguZGF0YSgpLCAxLCBZLmRhdGEoKSwgMSwgLTEpOwotICAgIGZvcihpbnQgaj0wOyBqPE47ICsraikKLSAgICAgIEEuY29sKGopLnRhaWwoTi1qKSArPSBYW2pdICogWS50YWlsKE4taikgKyBZW2pdICogWC50YWlsKE4taik7CisgIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIHN5cjIoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfdmVjdG9yJiBYLCBnZW5lX3ZlY3RvciYgWSwgaW50IE4pIHsKKyAgICAvLyBpbnRlcm5hbDo6cHJvZHVjdF9zZWxmYWRqb2ludF9yYW5rMl91cGRhdGU8cmVhbCwwLExvd2VyVHJpYW5ndWxhckJpdD4oTixBLmRhdGEoKSxOLCBYLmRhdGEoKSwgMSwgWS5kYXRhKCksIDEsCisgICAgLy8gLTEpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgKytqKSBBLmNvbChqKS50YWlsKE4gLSBqKSArPSBYW2pdICogWS50YWlsKE4gLSBqKSArIFlbal0gKiBYLnRhaWwoTiAtIGopOwogICB9CiAKLSAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgZ2VyKGdlbmVfbWF0cml4ICYgQSwgIGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgIE4pewotICAgIGZvcihpbnQgaj0wOyBqPE47ICsraikKLSAgICAgIEEuY29sKGopICs9IFggKiBZW2pdOworICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBnZXIoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfdmVjdG9yJiBYLCBnZW5lX3ZlY3RvciYgWSwgaW50IE4pIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IE47ICsraikgQS5jb2woaikgKz0gWCAqIFlbal07CiAgIH0KIAotICBzdGF0aWMgRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCByb3QoZ2VuZV92ZWN0b3IgJiBBLCAgZ2VuZV92ZWN0b3IgJiBCLCByZWFsIGMsIHJlYWwgcywgaW50ICAvKk4qLyl7Ci0gICAgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZShBLCBCLCBKYWNvYmlSb3RhdGlvbjxyZWFsPihjLHMpKTsKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcm90KGdlbmVfdmVjdG9yJiBBLCBnZW5lX3ZlY3RvciYgQiwgcmVhbCBjLCByZWFsIHMsIGludCAvKk4qLykgeworICAgIGludGVybmFsOjphcHBseV9yb3RhdGlvbl9pbl90aGVfcGxhbmUoQSwgQiwgSmFjb2JpUm90YXRpb248cmVhbD4oYywgcykpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF0dl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCAgLypOKi8pewotICAgIFgubm9hbGlhcygpID0gKEEudHJhbnNwb3NlKCkqQik7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCYgQSwgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgLypOKi8pIHsKKyAgICBYLm5vYWxpYXMoKSA9IChBLnRyYW5zcG9zZSgpICogQik7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShyZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgIC8qTiovKXsKLSAgICBZICs9IGNvZWYgKiBYOwotICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3ImIFgsIGdlbmVfdmVjdG9yJiBZLCBpbnQgLypOKi8pIHsgWSArPSBjb2VmICogWDsgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBheHBieShyZWFsIGEsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgcmVhbCBiLCBnZW5lX3ZlY3RvciAmIFksIGludCAgLypOKi8pewotICAgIFkgPSBhKlggKyBiKlk7Ci0gIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KHJlYWwgYSwgY29uc3QgZ2VuZV92ZWN0b3ImIFgsIHJlYWwgYiwgZ2VuZV92ZWN0b3ImIFksIGludCAvKk4qLykgeyBZID0gYSAqIFggKyBiICogWTsgfQogCi0gIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgIC8qTiovKXsKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXgmIHNvdXJjZSwgZ2VuZV9tYXRyaXgmIGNpYmxlLCBpbnQgLypOKi8pIHsKICAgICBjaWJsZSA9IHNvdXJjZTsKICAgfQogCi0gIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yICYgc291cmNlLCBnZW5lX3ZlY3RvciAmIGNpYmxlLCBpbnQgIC8qTiovKXsKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3ImIHNvdXJjZSwgZ2VuZV92ZWN0b3ImIGNpYmxlLCBpbnQgLypOKi8pIHsKICAgICBjaWJsZSA9IHNvdXJjZTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCAmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50ICAvKk4qLyl7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCYgTCwgY29uc3QgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgLypOKi8pIHsKICAgICBYID0gTC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZShCKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcl9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsIGludCAgLypOKi8peworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXJfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4JiBMLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsIGludCAvKk4qLykgewogICAgIFggPSBMLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKEIpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIHRybW0oY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsIGludCAgLypOKi8peworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJtbShjb25zdCBnZW5lX21hdHJpeCYgTCwgY29uc3QgZ2VuZV9tYXRyaXgmIEIsIGdlbmVfbWF0cml4JiBYLCBpbnQgLypOKi8pIHsKICAgICBYLm5vYWxpYXMoKSA9IEwudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKiBCOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGNob2xlc2t5KGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgIC8qTiovKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNob2xlc2t5KGNvbnN0IGdlbmVfbWF0cml4JiBYLCBnZW5lX21hdHJpeCYgQywgaW50IC8qTiovKSB7CiAgICAgQyA9IFg7Ci0gICAgaW50ZXJuYWw6OmxsdF9pbnBsYWNlPHJlYWwsTG93ZXI+OjpibG9ja2VkKEMpOwotICAgIC8vQyA9IFgubGx0KCkubWF0cml4TCgpOwotLy8gICAgIEMgPSBYOwotLy8gICAgIENob2xlc2t5PGdlbmVfbWF0cml4Pjo6Y29tcHV0ZUluUGxhY2UoQyk7Ci0vLyAgICAgQ2hvbGVza3k8Z2VuZV9tYXRyaXg+Ojpjb21wdXRlSW5QbGFjZUJsb2NrKEMpOworICAgIGludGVybmFsOjpsbHRfaW5wbGFjZTxyZWFsLCBMb3dlcj46OmJsb2NrZWQoQyk7CisgICAgLy8gQyA9IFgubGx0KCkubWF0cml4TCgpOworICAgIC8vICAgICBDID0gWDsKKyAgICAvLyAgICAgQ2hvbGVza3k8Z2VuZV9tYXRyaXg+Ojpjb21wdXRlSW5QbGFjZShDKTsKKyAgICAvLyAgICAgQ2hvbGVza3k8Z2VuZV9tYXRyaXg+Ojpjb21wdXRlSW5QbGFjZUJsb2NrKEMpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGx1X2RlY29tcChjb25zdCBnZW5lX21hdHJpeCAmIFgsIGdlbmVfbWF0cml4ICYgQywgaW50ICAvKk4qLyl7Ci0gICAgQyA9IFguZnVsbFBpdkx1KCkubWF0cml4TFUoKTsKLSAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgbHVfZGVjb21wKGNvbnN0IGdlbmVfbWF0cml4JiBYLCBnZW5lX21hdHJpeCYgQywgaW50IC8qTiovKSB7IEMgPSBYLmZ1bGxQaXZMdSgpLm1hdHJpeExVKCk7IH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgcGFydGlhbF9sdV9kZWNvbXAoY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCAgTil7Ci0gICAgTWF0cml4PERlbnNlSW5kZXgsMSxEeW5hbWljPiBwaXYoTik7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBwYXJ0aWFsX2x1X2RlY29tcChjb25zdCBnZW5lX21hdHJpeCYgWCwgZ2VuZV9tYXRyaXgmIEMsIGludCBOKSB7CisgICAgTWF0cml4PERlbnNlSW5kZXgsIDEsIER5bmFtaWM+IHBpdihOKTsKICAgICBEZW5zZUluZGV4IG5iOwogICAgIEMgPSBYOwotICAgIGludGVybmFsOjpwYXJ0aWFsX2x1X2lucGxhY2UoQyxwaXYsbmIpOwotLy8gICAgIEMgPSBYLnBhcnRpYWxQaXZMdSgpLm1hdHJpeExVKCk7CisgICAgaW50ZXJuYWw6OnBhcnRpYWxfbHVfaW5wbGFjZShDLCBwaXYsIG5iKTsKKyAgICAvLyAgICAgQyA9IFgucGFydGlhbFBpdkx1KCkubWF0cml4TFUoKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlkaWFnb25hbGl6YXRpb24oY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCAgTil7Ci0gICAgdHlwZW5hbWUgVHJpZGlhZ29uYWxpemF0aW9uPGdlbmVfbWF0cml4Pjo6Q29lZmZWZWN0b3JUeXBlIGF1eChOLTEpOworICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IGdlbmVfbWF0cml4JiBYLCBnZW5lX21hdHJpeCYgQywgaW50IE4pIHsKKyAgICB0eXBlbmFtZSBUcmlkaWFnb25hbGl6YXRpb248Z2VuZV9tYXRyaXg+OjpDb2VmZlZlY3RvclR5cGUgYXV4KE4gLSAxKTsKICAgICBDID0gWDsKICAgICBpbnRlcm5hbDo6dHJpZGlhZ29uYWxpemF0aW9uX2lucGxhY2UoQywgYXV4KTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBoZXNzZW5iZXJnKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBDLCBpbnQgIC8qTiovKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIGhlc3NlbmJlcmcoY29uc3QgZ2VuZV9tYXRyaXgmIFgsIGdlbmVfbWF0cml4JiBDLCBpbnQgLypOKi8pIHsKICAgICBDID0gSGVzc2VuYmVyZ0RlY29tcG9zaXRpb248Z2VuZV9tYXRyaXg+KFgpLnBhY2tlZE1hdHJpeCgpOwogICB9Ci0KLQotCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX2Fkdi5jcHAgYi9iZW5jaC9idGwvbGlicy9laWdlbjMvbWFpbl9hZHYuY3BwCmluZGV4IDk1ODY1MzUuLjVlZGFmNGIgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX2Fkdi5jcHAKKysrIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL21haW5fYWR2LmNwcApAQCAtMjcsMTggKzI3LDE1IEBACiAKIEJUTF9NQUlOOwogCi1pbnQgbWFpbigpCi17Ci0gIGJlbmNoPEFjdGlvbl90cmlzb2x2ZTxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fdHJpc29sdmVfbWF0cml4PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9jaG9sZXNreTxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOwotLy8gICBiZW5jaDxBY3Rpb25fbHVfZGVjb21wPGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9wYXJ0aWFsX2x1PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7CitpbnQgbWFpbigpIHsKKyAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlPGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLCBNQVhfTFUsIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlX21hdHJpeDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSwgTUFYX0xVLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9jaG9sZXNreTxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSwgTUFYX0xVLCBOQl9QT0lOVCk7CisgIC8vICAgYmVuY2g8QWN0aW9uX2x1X2RlY29tcDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fcGFydGlhbF9sdTxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSwgTUFYX0xVLCBOQl9QT0lOVCk7CiAKLS8vICAgYmVuY2g8QWN0aW9uX2hlc3NlbmJlcmc8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTFUsTUFYX0xVLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX3RyaWRpYWdvbmFsaXphdGlvbjxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOworICAvLyAgIGJlbmNoPEFjdGlvbl9oZXNzZW5iZXJnPGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0xVLE1BWF9MVSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl90cmlkaWFnb25hbGl6YXRpb248ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTFUsIE1BWF9MVSwgTkJfUE9JTlQpOwogCiAgIHJldHVybiAwOwogfQotCi0KZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX2xpbmVhci5jcHAgYi9iZW5jaC9idGwvbGlicy9laWdlbjMvbWFpbl9saW5lYXIuY3BwCmluZGV4IGU4NTM4YjcuLjcyMDk1NzQgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX2xpbmVhci5jcHAKKysrIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL21haW5fbGluZWFyLmNwcApAQCAtMjIsMTQgKzIyLDEwIEBACiAKIEJUTF9NQUlOOwogCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKKyAgYmVuY2g8QWN0aW9uX2F4cHk8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSwgTUFYX0FYUFksIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F4cGJ5PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksIE1BWF9BWFBZLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9yb3Q8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSwgTUFYX0FYUFksIE5CX1BPSU5UKTsKIAotICBiZW5jaDxBY3Rpb25fYXhweTxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX2F4cGJ5PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fcm90PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOwotICAKICAgcmV0dXJuIDA7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL21haW5fbWF0bWF0LmNwcCBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX21hdG1hdC5jcHAKaW5kZXggMDUyODEwYS4uNjdiNmU3NiAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL21haW5fbWF0bWF0LmNwcAorKysgYi9iZW5jaC9idGwvbGlicy9laWdlbjMvbWFpbl9tYXRtYXQuY3BwCkBAIC0yMiwxNCArMjIsMTEgQEAKIAogQlRMX01BSU47CiAKLWludCBtYWluKCkKLXsKLSAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fYXRhX3Byb2R1Y3Q8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX2FhdF9wcm9kdWN0PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl90cm1tPGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CitpbnQgbWFpbigpIHsKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl90cm1tPGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKIAogICByZXR1cm4gMDsKIH0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9laWdlbjMvbWFpbl92ZWNtYXQuY3BwIGIvYmVuY2gvYnRsL2xpYnMvZWlnZW4zL21haW5fdmVjbWF0LmNwcAppbmRleCAwZGRhNDQ0Li4xMWU4ZTY2IDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9laWdlbjMvbWFpbl92ZWNtYXQuY3BwCisrKyBiL2JlbmNoL2J0bC9saWJzL2VpZ2VuMy9tYWluX3ZlY21hdC5jcHAKQEAgLTIyLDE1ICsyMiwxMiBAQAogCiBCVExfTUFJTjsKIAotaW50IG1haW4oKQotewotICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fc3ltdjxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fc3lyMjxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fZ2VyPGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CitpbnQgbWFpbigpIHsKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NViwgTUFYX01WLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDxlaWdlbjNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NViwgTUFYX01WLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9zeW12PGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLCBNQVhfTVYsIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3N5cjI8ZWlnZW4zX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsIE1BWF9NViwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fZ2VyPGVpZ2VuM19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLCBNQVhfTVYsIE5CX1BPSU5UKTsKIAogICByZXR1cm4gMDsKIH0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9nbW0vZ21tX0xVX3NvbHZlX2ludGVyZmFjZS5oaCBiL2JlbmNoL2J0bC9saWJzL2dtbS9nbW1fTFVfc29sdmVfaW50ZXJmYWNlLmhoCmluZGV4IGRjYjlmNTYuLjk1NWM4MTYgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9saWJzL2dtbS9nbW1fTFVfc29sdmVfaW50ZXJmYWNlLmhoCisrKyBiL2JlbmNoL2J0bC9saWJzL2dtbS9nbW1fTFVfc29sdmVfaW50ZXJmYWNlLmhoCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlLmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzozMSBDRVNUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBCTElUWl9MVV9TT0xWRV9JTlRFUkZBQ0VfSEgKICNkZWZpbmUgQkxJVFpfTFVfU09MVkVfSU5URVJGQUNFX0hICiAKQEAgLTI1LDE2OCArMjUsMTM2IEBACiAKIEJaX1VTSU5HX05BTUVTUEFDRShibGl0eikKIAotdGVtcGxhdGU8Y2xhc3MgcmVhbD4KLWNsYXNzIGJsaXR6X0xVX3NvbHZlX2ludGVyZmFjZSA6IHB1YmxpYyBibGl0el9pbnRlcmZhY2U8cmVhbD4KLXsKLQotcHVibGljIDoKLQordGVtcGxhdGUgPGNsYXNzIHJlYWw+CitjbGFzcyBibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UgOiBwdWJsaWMgYmxpdHpfaW50ZXJmYWNlPHJlYWw+IHsKKyBwdWJsaWM6CiAgIHR5cGVkZWYgdHlwZW5hbWUgYmxpdHpfaW50ZXJmYWNlPHJlYWw+OjpnZW5lX21hdHJpeCBnZW5lX21hdHJpeDsKICAgdHlwZWRlZiB0eXBlbmFtZSBibGl0el9pbnRlcmZhY2U8cmVhbD46OmdlbmVfdmVjdG9yIGdlbmVfdmVjdG9yOwogCi0gIHR5cGVkZWYgYmxpdHo6OkFycmF5PGludCwxPiBQaXZvdF9WZWN0b3I7CisgIHR5cGVkZWYgYmxpdHo6OkFycmF5PGludCwgMT4gUGl2b3RfVmVjdG9yOwogCi0gIGlubGluZSBzdGF0aWMgdm9pZCBuZXdfUGl2b3RfVmVjdG9yKFBpdm90X1ZlY3RvciAmIHBpdm90LGludCBOKQotICB7CisgIGlubGluZSBzdGF0aWMgdm9pZCBuZXdfUGl2b3RfVmVjdG9yKFBpdm90X1ZlY3RvciAmcGl2b3QsIGludCBOKSB7IHBpdm90LnJlc2l6ZShOKTsgfQogCi0gICAgcGl2b3QucmVzaXplKE4pOworICBpbmxpbmUgc3RhdGljIHZvaWQgZnJlZV9QaXZvdF9WZWN0b3IoUGl2b3RfVmVjdG9yICZwaXZvdCkgeyByZXR1cm47IH0KIAotICB9CisgIHN0YXRpYyBpbmxpbmUgcmVhbCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKGNvbnN0IGdlbmVfbWF0cml4ICZBLCBnZW5lX3ZlY3RvciBCLCBpbnQgcm93LCBpbnQgY29sX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sX2VuZCkgeworICAgIHJlYWwgc29tbWUgPSAwLjsKIAotICBpbmxpbmUgc3RhdGljIHZvaWQgZnJlZV9QaXZvdF9WZWN0b3IoUGl2b3RfVmVjdG9yICYgcGl2b3QpCi0gIHsKLSAgICAKLSAgICByZXR1cm47Ci0KLSAgfQotCi0KLSAgc3RhdGljIGlubGluZSByZWFsIG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciBCLCBpbnQgcm93LCBpbnQgY29sX3N0YXJ0LCBpbnQgY29sX2VuZCkKLSAgewotICAgIAotICAgIHJlYWwgc29tbWU9MC47Ci0gICAgCi0gICAgZm9yIChpbnQgaj1jb2xfc3RhcnQgOyBqPGNvbF9lbmQrMSA7IGorKyl7Ci0JCi0Jc29tbWUrPUEocm93LGopKkIoaik7Ci0JCisgICAgZm9yIChpbnQgaiA9IGNvbF9zdGFydDsgaiA8IGNvbF9lbmQgKyAxOyBqKyspIHsKKyAgICAgIHNvbW1lICs9IEEocm93LCBqKSAqIEIoaik7CiAgICAgfQogCiAgICAgcmV0dXJuIHNvbW1lOwotCiAgIH0KIAorICBzdGF0aWMgaW5saW5lIHJlYWwgbWF0cml4X21hdHJpeF9wcm9kdWN0X3NsaWNlZChnZW5lX21hdHJpeCAmQSwgaW50IHJvdywgaW50IGNvbF9zdGFydCwgaW50IGNvbF9lbmQsIGdlbmVfbWF0cml4ICZCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X3NoaWZ0LCBpbnQgY29sKSB7CisgICAgcmVhbCBzb21tZSA9IDAuOwogCi0KLQotICBzdGF0aWMgaW5saW5lIHJlYWwgbWF0cml4X21hdHJpeF9wcm9kdWN0X3NsaWNlZChnZW5lX21hdHJpeCAmIEEsIGludCByb3csIGludCBjb2xfc3RhcnQsIGludCBjb2xfZW5kLCBnZW5lX21hdHJpeCAmIEIsIGludCByb3dfc2hpZnQsIGludCBjb2wgKQotICB7Ci0gICAgCi0gICAgcmVhbCBzb21tZT0wLjsKLSAgICAKLSAgICBmb3IgKGludCBqPWNvbF9zdGFydCA7IGo8Y29sX2VuZCsxIDsgaisrKXsKLQkKLQlzb21tZSs9QShyb3csaikqQihqK3Jvd19zaGlmdCxjb2wpOwotCQorICAgIGZvciAoaW50IGogPSBjb2xfc3RhcnQ7IGogPCBjb2xfZW5kICsgMTsgaisrKSB7CisgICAgICBzb21tZSArPSBBKHJvdywgaikgKiBCKGogKyByb3dfc2hpZnQsIGNvbCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHNvbW1lOwotCiAgIH0KIAotICBpbmxpbmUgc3RhdGljIHZvaWQgTFVfZmFjdG9yKGdlbmVfbWF0cml4ICYgTFUsIFBpdm90X1ZlY3RvciAmIHBpdm90LCBpbnQgTikKLSAgewotCi0gICAgQVNTRVJUKCBMVS5yb3dzKCk9PUxVLmNvbHMoKSApIDsKLSAgICBpbnQgaW5kZXhfbWF4ID0gMCA7Ci0gICAgcmVhbCBiaWcgPSAwLiA7Ci0gICAgcmVhbCB0aGVTdW0gPSAwLiA7Ci0gICAgcmVhbCBkdW0gPSAwLiA7CisgIGlubGluZSBzdGF0aWMgdm9pZCBMVV9mYWN0b3IoZ2VuZV9tYXRyaXggJkxVLCBQaXZvdF9WZWN0b3IgJnBpdm90LCBpbnQgTikgeworICAgIEFTU0VSVChMVS5yb3dzKCkgPT0gTFUuY29scygpKTsKKyAgICBpbnQgaW5kZXhfbWF4ID0gMDsKKyAgICByZWFsIGJpZyA9IDAuOworICAgIHJlYWwgdGhlU3VtID0gMC47CisgICAgcmVhbCBkdW0gPSAwLjsKICAgICAvLyBHZXQgdGhlIGltcGxpY2l0IHNjYWxpbmcgaW5mb3JtYXRpb24gOgotICAgIGdlbmVfdmVjdG9yIEltcGxpY2l0U2NhbGluZyggTiApIDsKLSAgICBmb3IoIGludCBpPTA7IGk8TjsgaSsrICkgewotICAgICAgYmlnID0gMC4gOwotICAgICAgZm9yKCBpbnQgaj0wOyBqPE47IGorKyApIHsKLQlpZiggYWJzKCBMVSggaSwgaiApICk+PWJpZyApIGJpZyA9IGFicyggTFUoIGksIGogKSApIDsKKyAgICBnZW5lX3ZlY3RvciBJbXBsaWNpdFNjYWxpbmcoTik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgIGJpZyA9IDAuOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKKyAgICAgICAgaWYgKGFicyhMVShpLCBqKSkgPj0gYmlnKSBiaWcgPSBhYnMoTFUoaSwgaikpOwogICAgICAgfQotICAgICAgaWYoIGJpZz09MC4gKSB7Ci0JSU5GT1MoICJibGl0el9MVV9mYWN0b3I6OlNpbmd1bGFyIG1hdHJpeCIgKSA7Ci0JZXhpdCggMCApIDsKKyAgICAgIGlmIChiaWcgPT0gMC4pIHsKKyAgICAgICAgSU5GT1MoImJsaXR6X0xVX2ZhY3Rvcjo6U2luZ3VsYXIgbWF0cml4Iik7CisgICAgICAgIGV4aXQoMCk7CiAgICAgICB9Ci0gICAgICBJbXBsaWNpdFNjYWxpbmcoIGkgKSA9IDEuL2JpZyA7CisgICAgICBJbXBsaWNpdFNjYWxpbmcoaSkgPSAxLiAvIGJpZzsKICAgICB9CiAgICAgLy8gTG9vcCBvdmVyIGNvbHVtbnMgb2YgQ3JvdXQncyBtZXRob2QgOgotICAgIGZvciggaW50IGo9MDsgajxOOyBqKysgKSB7Ci0gICAgICBmb3IoIGludCBpPTA7IGk8ajsgaSsrICkgewotCXRoZVN1bSA9IExVKCBpLCBqICkgOwotCXRoZVN1bSAtPSBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKExVLCBpLCAwLCBpLTEsIExVLCAwLCBqKSA7Ci0JLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGktMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGktMSApLCBqICkgKSA7Ci0JTFUoIGksIGogKSA9IHRoZVN1bSA7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgajsgaSsrKSB7CisgICAgICAgIHRoZVN1bSA9IExVKGksIGopOworICAgICAgICB0aGVTdW0gLT0gbWF0cml4X21hdHJpeF9wcm9kdWN0X3NsaWNlZChMVSwgaSwgMCwgaSAtIDEsIExVLCAwLCBqKTsKKyAgICAgICAgLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGktMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGktMSApLCBqICkgKSA7CisgICAgICAgIExVKGksIGopID0gdGhlU3VtOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGxhcmdlc3QgcGl2b3QgZWxlbWVudCA6Ci0gICAgICBiaWcgPSAwLiA7Ci0gICAgICBmb3IoIGludCBpPWo7IGk8TjsgaSsrICkgewotCXRoZVN1bSA9IExVKCBpLCBqICkgOwotCXRoZVN1bSAtPSBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKExVLCBpLCAwLCBqLTEsIExVLCAwLCBqKSA7Ci0JLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApLCBqICkgKSA7Ci0JTFUoIGksIGogKSA9IHRoZVN1bSA7Ci0JaWYoIChJbXBsaWNpdFNjYWxpbmcoIGkgKSphYnMoIHRoZVN1bSApKT49YmlnICkgewotCSAgZHVtID0gSW1wbGljaXRTY2FsaW5nKCBpICkqYWJzKCB0aGVTdW0gKSA7Ci0JICBiaWcgPSBkdW0gOwotCSAgaW5kZXhfbWF4ID0gaSA7Ci0JfQorICAgICAgYmlnID0gMC47CisgICAgICBmb3IgKGludCBpID0gajsgaSA8IE47IGkrKykgeworICAgICAgICB0aGVTdW0gPSBMVShpLCBqKTsKKyAgICAgICAgdGhlU3VtIC09IG1hdHJpeF9tYXRyaXhfcHJvZHVjdF9zbGljZWQoTFUsIGksIDAsIGogLSAxLCBMVSwgMCwgaik7CisgICAgICAgIC8vCXRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggZnJvbVN0YXJ0LCBqLTEgKSApKkxVKCBSYW5nZSggZnJvbVN0YXJ0LCBqLTEgKSwgaiApICkgOworICAgICAgICBMVShpLCBqKSA9IHRoZVN1bTsKKyAgICAgICAgaWYgKChJbXBsaWNpdFNjYWxpbmcoaSkgKiBhYnModGhlU3VtKSkgPj0gYmlnKSB7CisgICAgICAgICAgZHVtID0gSW1wbGljaXRTY2FsaW5nKGkpICogYWJzKHRoZVN1bSk7CisgICAgICAgICAgYmlnID0gZHVtOworICAgICAgICAgIGluZGV4X21heCA9IGk7CisgICAgICAgIH0KICAgICAgIH0KICAgICAgIC8vIEludGVyY2hhbmdpbmcgcm93cyBhbmQgdGhlIHNjYWxlIGZhY3RvciA6Ci0gICAgICBpZiggaiE9aW5kZXhfbWF4ICkgewotCWZvciggaW50IGs9MDsgazxOOyBrKysgKSB7Ci0JICBkdW0gPSBMVSggaW5kZXhfbWF4LCBrICkgOwotCSAgTFUoIGluZGV4X21heCwgayApID0gTFUoIGosIGsgKSA7Ci0JICBMVSggaiwgayApID0gZHVtIDsKLQl9Ci0JSW1wbGljaXRTY2FsaW5nKCBpbmRleF9tYXggKSA9IEltcGxpY2l0U2NhbGluZyggaiApIDsKKyAgICAgIGlmIChqICE9IGluZGV4X21heCkgeworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IE47IGsrKykgeworICAgICAgICAgIGR1bSA9IExVKGluZGV4X21heCwgayk7CisgICAgICAgICAgTFUoaW5kZXhfbWF4LCBrKSA9IExVKGosIGspOworICAgICAgICAgIExVKGosIGspID0gZHVtOworICAgICAgICB9CisgICAgICAgIEltcGxpY2l0U2NhbGluZyhpbmRleF9tYXgpID0gSW1wbGljaXRTY2FsaW5nKGopOwogICAgICAgfQotICAgICAgcGl2b3QoIGogKSA9IGluZGV4X21heCA7Ci0gICAgICBpZiAoIExVKCBqLCBqICk9PTAuICkgTFUoIGosIGogKSA9IDEuZS0yMCA7CisgICAgICBwaXZvdChqKSA9IGluZGV4X21heDsKKyAgICAgIGlmIChMVShqLCBqKSA9PSAwLikgTFUoaiwgaikgPSAxLmUtMjA7CiAgICAgICAvLyBEaXZpZGUgYnkgdGhlIHBpdm90IGVsZW1lbnQgOgotICAgICAgaWYoIGo8TiApIHsKLQlkdW0gPSAxLi9MVSggaiwgaiApIDsKLQlmb3IoIGludCBpPWorMTsgaTxOOyBpKysgKSBMVSggaSwgaiApICo9IGR1bSA7CisgICAgICBpZiAoaiA8IE4pIHsKKyAgICAgICAgZHVtID0gMS4gLyBMVShqLCBqKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGogKyAxOyBpIDwgTjsgaSsrKSBMVShpLCBqKSAqPSBkdW07CiAgICAgICB9CiAgICAgfQotCiAgIH0KIAotICBpbmxpbmUgc3RhdGljIHZvaWQgTFVfc29sdmUoY29uc3QgZ2VuZV9tYXRyaXggJiBMVSwgY29uc3QgUGl2b3RfVmVjdG9yIHBpdm90LCBnZW5lX3ZlY3RvciAmQiwgZ2VuZV92ZWN0b3IgWCwgaW50IE4pCi0gIHsKLQorICBpbmxpbmUgc3RhdGljIHZvaWQgTFVfc29sdmUoY29uc3QgZ2VuZV9tYXRyaXggJkxVLCBjb25zdCBQaXZvdF9WZWN0b3IgcGl2b3QsIGdlbmVfdmVjdG9yICZCLCBnZW5lX3ZlY3RvciBYLCBpbnQgTikgewogICAgIC8vIFBvdXIgY29uc2VydmVyIGxlIG1lbWUgaGVhZGVyLCBvbiB0cmF2YWlsbGUgc3VyIFgsIGNvcGllIGR1IHNlY29uZC1tZW1icmUgQgotICAgIFggPSBCLmNvcHkoKSA7Ci0gICAgQVNTRVJUKCBMVS5yb3dzKCk9PUxVLmNvbHMoKSApIDsKLSAgICBmaXJzdEluZGV4IGluZEkgOworICAgIFggPSBCLmNvcHkoKTsKKyAgICBBU1NFUlQoTFUucm93cygpID09IExVLmNvbHMoKSk7CisgICAgZmlyc3RJbmRleCBpbmRJOwogICAgIC8vIEZvcndhcmQgc3Vic3RpdHV0aW9uIDoKLSAgICBpbnQgaWkgPSAwIDsKLSAgICByZWFsIHRoZVN1bSA9IDAuIDsKLSAgICBmb3IoIGludCBpPTA7IGk8TjsgaSsrICkgewotICAgICAgaW50IGlwID0gcGl2b3QoIGkgKSA7Ci0gICAgICB0aGVTdW0gPSBYKCBpcCApIDsKKyAgICBpbnQgaWkgPSAwOworICAgIHJlYWwgdGhlU3VtID0gMC47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgIGludCBpcCA9IHBpdm90KGkpOworICAgICAgdGhlU3VtID0gWChpcCk7CiAgICAgICAvLyAgICAgIHRoZVN1bSA9IEIoIGlwICkgOwotICAgICAgWCggaXAgKSA9IFgoIGkgKSA7CisgICAgICBYKGlwKSA9IFgoaSk7CiAgICAgICAvLyAgICAgIEIoIGlwICkgPSBCKCBpICkgOwotICAgICAgaWYoIGlpICkgewotCXRoZVN1bSAtPSBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKExVLCBYLCBpLCBpaS0xLCBpLTEpIDsKLQkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGlpLTEsIGktMSApICkqWCggUmFuZ2UoIGlpLTEsIGktMSApICkgKSA7Ci0JLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBpaS0xLCBpLTEgKSApKkIoIFJhbmdlKCBpaS0xLCBpLTEgKSApICkgOwotICAgICAgfSBlbHNlIGlmKCB0aGVTdW0gKSB7Ci0JaWkgPSBpKzEgOworICAgICAgaWYgKGlpKSB7CisgICAgICAgIHRoZVN1bSAtPSBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKExVLCBYLCBpLCBpaSAtIDEsIGkgLSAxKTsKKyAgICAgICAgLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBpaS0xLCBpLTEgKSApKlgoIFJhbmdlKCBpaS0xLCBpLTEgKSApICkgOworICAgICAgICAvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGlpLTEsIGktMSApICkqQiggUmFuZ2UoIGlpLTEsIGktMSApICkgKSA7CisgICAgICB9IGVsc2UgaWYgKHRoZVN1bSkgeworICAgICAgICBpaSA9IGkgKyAxOwogICAgICAgfQotICAgICAgWCggaSApID0gdGhlU3VtIDsKKyAgICAgIFgoaSkgPSB0aGVTdW07CiAgICAgICAvLyAgICAgIEIoIGkgKSA9IHRoZVN1bSA7CiAgICAgfQogICAgIC8vIEJhY2tzdWJzdGl0dXRpb24gOgotICAgIGZvciggaW50IGk9Ti0xOyBpPj0wOyBpLS0gKSB7Ci0gICAgICB0aGVTdW0gPSBYKCBpICkgOworICAgIGZvciAoaW50IGkgPSBOIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIHRoZVN1bSA9IFgoaSk7CiAgICAgICAvLyAgICAgIHRoZVN1bSA9IEIoIGkgKSA7Ci0gICAgICB0aGVTdW0gLT0gbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3NsaWNlZChMVSwgWCwgaSwgaSsxLCBOKSA7CisgICAgICB0aGVTdW0gLT0gbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3NsaWNlZChMVSwgWCwgaSwgaSArIDEsIE4pOwogICAgICAgLy8gICAgICB0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGkrMSwgdG9FbmQgKSApKlgoIFJhbmdlKCBpKzEsIHRvRW5kICkgKSApIDsKICAgICAgIC8vICAgICAgdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBpKzEsIHRvRW5kICkgKSpCKCBSYW5nZSggaSsxLCB0b0VuZCApICkgKSA7CiAgICAgICAvLyBTdG9yZSBhIGNvbXBvbmVudCBvZiB0aGUgc29sdXRpb24gdmVjdG9yIDoKLSAgICAgIFgoIGkgKSA9IHRoZVN1bS9MVSggaSwgaSApIDsKKyAgICAgIFgoaSkgPSB0aGVTdW0gLyBMVShpLCBpKTsKICAgICAgIC8vICAgICAgQiggaSApID0gdGhlU3VtL0xVKCBpLCBpICkgOwogICAgIH0KLQogICB9Ci0KIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvZ21tL2dtbV9pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy9nbW0vZ21tX2ludGVyZmFjZS5oaAppbmRleCAzZWEzMDNjLi4yZGE1YTg5IDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9nbW0vZ21tX2ludGVyZmFjZS5oaAorKysgYi9iZW5jaC9idGwvbGlicy9nbW0vZ21tX2ludGVyZmFjZS5oaApAQCAtMjMsMTIyICsyMywxMDEgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGdtbTsKIAotdGVtcGxhdGU8Y2xhc3MgcmVhbD4KK3RlbXBsYXRlIDxjbGFzcyByZWFsPgogY2xhc3MgZ21tX2ludGVyZmFjZSB7CisgcHVibGljOgorICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlOwogCi1wdWJsaWMgOgotCi0gIHR5cGVkZWYgcmVhbCByZWFsX3R5cGUgOwotCi0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gIHN0bF92ZWN0b3I7Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3RvciA+IHN0bF9tYXRyaXg7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gc3RsX3ZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yPiBzdGxfbWF0cml4OwogCiAgIHR5cGVkZWYgZ21tOjpkZW5zZV9tYXRyaXg8cmVhbD4gZ2VuZV9tYXRyaXg7CiAgIHR5cGVkZWYgc3RsX3ZlY3RvciBnZW5lX3ZlY3RvcjsKIAotICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuICJnbW0iOwotICB9CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSh2b2lkKSB7IHJldHVybiAiZ21tIjsgfQogCi0gIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IE4pewotICAgIHJldHVybiA7Ci0gIH0KKyAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXgmIEEsIGludCBOKSB7IHJldHVybjsgfQogCi0gIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yICYgQil7Ci0gICAgcmV0dXJuIDsKLSAgfQorICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciYgQikgeyByZXR1cm47IH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKLSAgICBBLnJlc2l6ZShBX3N0bFswXS5zaXplKCksQV9zdGwuc2l6ZSgpKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCYgQSwgc3RsX21hdHJpeCYgQV9zdGwpIHsKKyAgICBBLnJlc2l6ZShBX3N0bFswXS5zaXplKCksIEFfc3RsLnNpemUoKSk7CiAKLSAgICBmb3IgKGludCBqPTA7IGo8QV9zdGwuc2l6ZSgpIDsgaisrKXsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxBX3N0bFtqXS5zaXplKCkgOyBpKyspewotICAgICAgICBBKGksaikgPSBBX3N0bFtqXVtpXTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IEFfc3RsLnNpemUoKTsgaisrKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFfc3RsW2pdLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEEoaSwgaikgPSBBX3N0bFtqXVtpXTsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKLSAgICBCID0gQl9zdGw7Ci0gIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciYgQiwgc3RsX3ZlY3RvciYgQl9zdGwpIHsgQiA9IEJfc3RsOyB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpewotICAgIEJfc3RsID0gQjsKLSAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciYgQiwgc3RsX3ZlY3RvciYgQl9zdGwpIHsgQl9zdGwgPSBCOyB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpewotICAgIGludCBOPUFfc3RsLnNpemUoKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXgmIEEsIHN0bF9tYXRyaXgmIEFfc3RsKSB7CisgICAgaW50IE4gPSBBX3N0bC5zaXplKCk7CiAKLSAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKICAgICAgIEFfc3RsW2pdLnJlc2l6ZShOKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKLSAgICAgICAgQV9zdGxbal1baV0gPSBBKGksaik7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICBBX3N0bFtqXVtpXSA9IEEoaSwgaik7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7Ci0gICAgZ21tOjptdWx0KEEsQiwgWCk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGNvbnN0IGdlbmVfbWF0cml4JiBCLCBnZW5lX21hdHJpeCYgWCwgaW50IE4pIHsKKyAgICBnbW06Om11bHQoQSwgQiwgWCk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNwb3NlZF9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pewotICAgIGdtbTo6bXVsdChnbW06OnRyYW5zcG9zZWQoQSksZ21tOjp0cmFuc3Bvc2VkKEIpLCBYKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9zZWRfbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4JiBBLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTikgeworICAgIGdtbTo6bXVsdChnbW06OnRyYW5zcG9zZWQoQSksIGdtbTo6dHJhbnNwb3NlZChCKSwgWCk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKLSAgICBnbW06Om11bHQoZ21tOjp0cmFuc3Bvc2VkKEEpLEEsIFgpOworICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGdlbmVfbWF0cml4JiBYLCBpbnQgTikgeyBnbW06Om11bHQoZ21tOjp0cmFuc3Bvc2VkKEEpLCBBLCBYKTsgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCYgQSwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKSB7IGdtbTo6bXVsdChBLCBnbW06OnRyYW5zcG9zZWQoQSksIFgpOyB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF92ZWN0b3JfcHJvZHVjdChnZW5lX21hdHJpeCYgQSwgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgeworICAgIGdtbTo6bXVsdChBLCBCLCBYKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pewotICAgIGdtbTo6bXVsdChBLGdtbTo6dHJhbnNwb3NlZChBKSwgWCk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCYgQSwgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgeworICAgIGdtbTo6bXVsdChnbW06OnRyYW5zcG9zZWQoQSksIEIsIFgpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF92ZWN0b3JfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7Ci0gICAgZ21tOjptdWx0KEEsQixYKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciYgWCwgZ2VuZV92ZWN0b3ImIFksIGludCBOKSB7CisgICAgZ21tOjphZGQoZ21tOjpzY2FsZWQoWCwgY29lZiksIFkpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF0dl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKLSAgICBnbW06Om11bHQoZ21tOjp0cmFuc3Bvc2VkKEEpLEIsWCk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHBieShyZWFsIGEsIGNvbnN0IGdlbmVfdmVjdG9yJiBYLCByZWFsIGIsIGdlbmVfdmVjdG9yJiBZLCBpbnQgTikgeworICAgIGdtbTo6YWRkKGdtbTo6c2NhbGVkKFgsIGEpLCBnbW06OnNjYWxlZChZLCBiKSwgWSk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShjb25zdCByZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7Ci0gICAgZ21tOjphZGQoZ21tOjpzY2FsZWQoWCxjb2VmKSwgWSk7Ci0gIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4JiBzb3VyY2UsIGdlbmVfbWF0cml4JiBjaWJsZSwgaW50IE4pIHsgZ21tOjpjb3B5KHNvdXJjZSwgY2libGUpOyB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KHJlYWwgYSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCByZWFsIGIsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4pewotICAgIGdtbTo6YWRkKGdtbTo6c2NhbGVkKFgsYSksIGdtbTo6c2NhbGVkKFksYiksIFkpOwotICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciYgc291cmNlLCBnZW5lX3ZlY3RvciYgY2libGUsIGludCBOKSB7IGdtbTo6Y29weShzb3VyY2UsIGNpYmxlKTsgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X21hdHJpeChjb25zdCBnZW5lX21hdHJpeCAmIHNvdXJjZSwgZ2VuZV9tYXRyaXggJiBjaWJsZSwgaW50IE4pewotICAgIGdtbTo6Y29weShzb3VyY2UsY2libGUpOwotICB9Ci0KLSAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yICYgc291cmNlLCBnZW5lX3ZlY3RvciAmIGNpYmxlLCBpbnQgTil7Ci0gICAgZ21tOjpjb3B5KHNvdXJjZSxjaWJsZSk7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXIoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7Ci0gICAgZ21tOjpjb3B5KEIsWCk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCYgTCwgY29uc3QgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgeworICAgIGdtbTo6Y29weShCLCBYKTsKICAgICBnbW06Omxvd2VyX3RyaV9zb2x2ZShMLCBYLCBmYWxzZSk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgcGFydGlhbF9sdV9kZWNvbXAoY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIFIsIGludCBOKXsKLSAgICBnbW06OmNvcHkoWCxSKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIHBhcnRpYWxfbHVfZGVjb21wKGNvbnN0IGdlbmVfbWF0cml4JiBYLCBnZW5lX21hdHJpeCYgUiwgaW50IE4pIHsKKyAgICBnbW06OmNvcHkoWCwgUik7CiAgICAgc3RkOjp2ZWN0b3I8aW50PiBpcHZ0KE4pOwogICAgIGdtbTo6bHVfZmFjdG9yKFIsIGlwdnQpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGhlc3NlbmJlcmcoY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIFIsIGludCBOKXsKLSAgICBnbW06OmNvcHkoWCxSKTsKLSAgICBnbW06Okhlc3NlbmJlcmdfcmVkdWN0aW9uKFIsWCxmYWxzZSk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBoZXNzZW5iZXJnKGNvbnN0IGdlbmVfbWF0cml4JiBYLCBnZW5lX21hdHJpeCYgUiwgaW50IE4pIHsKKyAgICBnbW06OmNvcHkoWCwgUik7CisgICAgZ21tOjpIZXNzZW5iZXJnX3JlZHVjdGlvbihSLCBYLCBmYWxzZSk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpZGlhZ29uYWxpemF0aW9uKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBSLCBpbnQgTil7Ci0gICAgZ21tOjpjb3B5KFgsUik7Ci0gICAgZ21tOjpIb3VzZWhvbGRlcl90cmlkaWFnb25hbGl6YXRpb24oUixYLGZhbHNlKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIHRyaWRpYWdvbmFsaXphdGlvbihjb25zdCBnZW5lX21hdHJpeCYgWCwgZ2VuZV9tYXRyaXgmIFIsIGludCBOKSB7CisgICAgZ21tOjpjb3B5KFgsIFIpOworICAgIGdtbTo6SG91c2Vob2xkZXJfdHJpZGlhZ29uYWxpemF0aW9uKFIsIFgsIGZhbHNlKTsKICAgfQotCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL2dtbS9tYWluLmNwcCBiL2JlbmNoL2J0bC9saWJzL2dtbS9tYWluLmNwcAppbmRleCAxZjBjMDUxLi4xZDIzZTUzIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9nbW0vbWFpbi5jcHAKKysrIGIvYmVuY2gvYnRsL2xpYnMvZ21tL21haW4uY3BwCkBAIC0yNCwyOCArMjQsMjQgQEAKIAogQlRMX01BSU47CiAKLWludCBtYWluKCkKLXsKK2ludCBtYWluKCkgeworICBiZW5jaDxBY3Rpb25fYXhweTxnbW1faW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLCBNQVhfQVhQWSwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXhwYnk8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSwgTUFYX0FYUFksIE5CX1BPSU5UKTsKIAotICBiZW5jaDxBY3Rpb25fYXhweTxnbW1faW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX2F4cGJ5PGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLCBNQVhfTVYsIE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2F0dl9wcm9kdWN0PGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLCBNQVhfTVYsIE5CX1BPSU5UKTsKIAotICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDxnbW1faW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0PGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKKyAgLy8gICBiZW5jaDxBY3Rpb25fYXRhX3Byb2R1Y3Q8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgLy8gICBiZW5jaDxBY3Rpb25fYWF0X3Byb2R1Y3Q8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKIAotICBiZW5jaDxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0PGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0vLyAgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxnbW1faW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOwotLy8gICBiZW5jaDxBY3Rpb25fYWF0X3Byb2R1Y3Q8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX3RyaXNvbHZlPGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKKyAgLy8gYmVuY2g8QWN0aW9uX2x1X3NvbHZlPGJsaXR6X0xVX3NvbHZlX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTFUsTUFYX0xVLE5CX1BPSU5UKTsKIAotICBiZW5jaDxBY3Rpb25fdHJpc29sdmU8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKLSAgLy9iZW5jaDxBY3Rpb25fbHVfc29sdmU8YmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9MVSxNQVhfTFUsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fcGFydGlhbF9sdTxnbW1faW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CiAKLSAgYmVuY2g8QWN0aW9uX3BhcnRpYWxfbHU8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKLSAgCi0gIGJlbmNoPEFjdGlvbl9oZXNzZW5iZXJnPGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl90cmlkaWFnb25hbGl6YXRpb248Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgYmVuY2g8QWN0aW9uX2hlc3NlbmJlcmc8Z21tX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sIE1BWF9NTSwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fdHJpZGlhZ29uYWxpemF0aW9uPGdtbV9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKIAogICByZXR1cm4gMDsKIH0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9tdGw0L21haW4uY3BwIGIvYmVuY2gvYnRsL2xpYnMvbXRsNC9tYWluLmNwcAppbmRleCA5NmZjZmI5Li44NjI5YWQ4IDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9tdGw0L21haW4uY3BwCisrKyBiL2JlbmNoL2J0bC9saWJzL210bDQvbWFpbi5jcHAKQEAgLTI0LDIzICsyNCwxOSBAQAogCiBCVExfTUFJTjsKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CisgIGJlbmNoPEFjdGlvbl9heHB5PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLCBNQVhfQVhQWSwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXhwYnk8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksIE1BWF9BWFBZLCBOQl9QT0lOVCk7CiAKLSAgYmVuY2g8QWN0aW9uX2F4cHk8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fYXhwYnk8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NViwgTUFYX01WLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9hdHZfcHJvZHVjdDxtdGw0X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsIE1BWF9NViwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CisgIC8vICAgYmVuY2g8QWN0aW9uX2F0YV9wcm9kdWN0PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICAvLyAgIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDxtdGw0X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKIAotICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fYXR2X3Byb2R1Y3Q8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7Ci0gIGJlbmNoPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0vLyAgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDxtdGw0X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKLS8vICAgYmVuY2g8QWN0aW9uX2FhdF9wcm9kdWN0PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOwotCi0gIGJlbmNoPEFjdGlvbl90cmlzb2x2ZTxtdGw0X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKLS8vICAgYmVuY2g8QWN0aW9uX2Nob2xlc2t5PG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOwotLy8gICBiZW5jaDxBY3Rpb25fbHVfZGVjb21wPG10bDRfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fdHJpc29sdmU8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKKyAgLy8gICBiZW5jaDxBY3Rpb25fY2hvbGVza3k8bXRsNF9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIC8vICAgYmVuY2g8QWN0aW9uX2x1X2RlY29tcDxtdGw0X2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKIAogICByZXR1cm4gMDsKIH0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9tdGw0L210bDRfTFVfc29sdmVfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvbXRsNC9tdGw0X0xVX3NvbHZlX2ludGVyZmFjZS5oaAppbmRleCBkY2I5ZjU2Li45NTVjODE2IDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9tdGw0L210bDRfTFVfc29sdmVfaW50ZXJmYWNlLmhoCisrKyBiL2JlbmNoL2J0bC9saWJzL210bDQvbXRsNF9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKQEAgLTEsMTQgKzEsMTQgQEAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIEZpbGUgICA6ICBibGl0el9MVV9zb2x2ZV9pbnRlcmZhY2UuaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjMxIENFU1QgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDcgKzE2LDcgQEAKIC8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0vLyAKKy8vCiAjaWZuZGVmIEJMSVRaX0xVX1NPTFZFX0lOVEVSRkFDRV9ISAogI2RlZmluZSBCTElUWl9MVV9TT0xWRV9JTlRFUkZBQ0VfSEgKIApAQCAtMjUsMTY4ICsyNSwxMzYgQEAKIAogQlpfVVNJTkdfTkFNRVNQQUNFKGJsaXR6KQogCi10ZW1wbGF0ZTxjbGFzcyByZWFsPgotY2xhc3MgYmxpdHpfTFVfc29sdmVfaW50ZXJmYWNlIDogcHVibGljIGJsaXR6X2ludGVyZmFjZTxyZWFsPgotewotCi1wdWJsaWMgOgotCit0ZW1wbGF0ZSA8Y2xhc3MgcmVhbD4KK2NsYXNzIGJsaXR6X0xVX3NvbHZlX2ludGVyZmFjZSA6IHB1YmxpYyBibGl0el9pbnRlcmZhY2U8cmVhbD4geworIHB1YmxpYzoKICAgdHlwZWRlZiB0eXBlbmFtZSBibGl0el9pbnRlcmZhY2U8cmVhbD46OmdlbmVfbWF0cml4IGdlbmVfbWF0cml4OwogICB0eXBlZGVmIHR5cGVuYW1lIGJsaXR6X2ludGVyZmFjZTxyZWFsPjo6Z2VuZV92ZWN0b3IgZ2VuZV92ZWN0b3I7CiAKLSAgdHlwZWRlZiBibGl0ejo6QXJyYXk8aW50LDE+IFBpdm90X1ZlY3RvcjsKKyAgdHlwZWRlZiBibGl0ejo6QXJyYXk8aW50LCAxPiBQaXZvdF9WZWN0b3I7CiAKLSAgaW5saW5lIHN0YXRpYyB2b2lkIG5ld19QaXZvdF9WZWN0b3IoUGl2b3RfVmVjdG9yICYgcGl2b3QsaW50IE4pCi0gIHsKKyAgaW5saW5lIHN0YXRpYyB2b2lkIG5ld19QaXZvdF9WZWN0b3IoUGl2b3RfVmVjdG9yICZwaXZvdCwgaW50IE4pIHsgcGl2b3QucmVzaXplKE4pOyB9CiAKLSAgICBwaXZvdC5yZXNpemUoTik7CisgIGlubGluZSBzdGF0aWMgdm9pZCBmcmVlX1Bpdm90X1ZlY3RvcihQaXZvdF9WZWN0b3IgJnBpdm90KSB7IHJldHVybjsgfQogCi0gIH0KKyAgc3RhdGljIGlubGluZSByZWFsIG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoY29uc3QgZ2VuZV9tYXRyaXggJkEsIGdlbmVfdmVjdG9yIEIsIGludCByb3csIGludCBjb2xfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xfZW5kKSB7CisgICAgcmVhbCBzb21tZSA9IDAuOwogCi0gIGlubGluZSBzdGF0aWMgdm9pZCBmcmVlX1Bpdm90X1ZlY3RvcihQaXZvdF9WZWN0b3IgJiBwaXZvdCkKLSAgewotICAgIAotICAgIHJldHVybjsKLQotICB9Ci0KLQotICBzdGF0aWMgaW5saW5lIHJlYWwgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3NsaWNlZChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yIEIsIGludCByb3csIGludCBjb2xfc3RhcnQsIGludCBjb2xfZW5kKQotICB7Ci0gICAgCi0gICAgcmVhbCBzb21tZT0wLjsKLSAgICAKLSAgICBmb3IgKGludCBqPWNvbF9zdGFydCA7IGo8Y29sX2VuZCsxIDsgaisrKXsKLQkKLQlzb21tZSs9QShyb3csaikqQihqKTsKLQkKKyAgICBmb3IgKGludCBqID0gY29sX3N0YXJ0OyBqIDwgY29sX2VuZCArIDE7IGorKykgeworICAgICAgc29tbWUgKz0gQShyb3csIGopICogQihqKTsKICAgICB9CiAKICAgICByZXR1cm4gc29tbWU7Ci0KICAgfQogCisgIHN0YXRpYyBpbmxpbmUgcmVhbCBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKGdlbmVfbWF0cml4ICZBLCBpbnQgcm93LCBpbnQgY29sX3N0YXJ0LCBpbnQgY29sX2VuZCwgZ2VuZV9tYXRyaXggJkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dfc2hpZnQsIGludCBjb2wpIHsKKyAgICByZWFsIHNvbW1lID0gMC47CiAKLQotCi0gIHN0YXRpYyBpbmxpbmUgcmVhbCBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKGdlbmVfbWF0cml4ICYgQSwgaW50IHJvdywgaW50IGNvbF9zdGFydCwgaW50IGNvbF9lbmQsIGdlbmVfbWF0cml4ICYgQiwgaW50IHJvd19zaGlmdCwgaW50IGNvbCApCi0gIHsKLSAgICAKLSAgICByZWFsIHNvbW1lPTAuOwotICAgIAotICAgIGZvciAoaW50IGo9Y29sX3N0YXJ0IDsgajxjb2xfZW5kKzEgOyBqKyspewotCQotCXNvbW1lKz1BKHJvdyxqKSpCKGorcm93X3NoaWZ0LGNvbCk7Ci0JCisgICAgZm9yIChpbnQgaiA9IGNvbF9zdGFydDsgaiA8IGNvbF9lbmQgKyAxOyBqKyspIHsKKyAgICAgIHNvbW1lICs9IEEocm93LCBqKSAqIEIoaiArIHJvd19zaGlmdCwgY29sKTsKICAgICB9CiAKICAgICByZXR1cm4gc29tbWU7Ci0KICAgfQogCi0gIGlubGluZSBzdGF0aWMgdm9pZCBMVV9mYWN0b3IoZ2VuZV9tYXRyaXggJiBMVSwgUGl2b3RfVmVjdG9yICYgcGl2b3QsIGludCBOKQotICB7Ci0KLSAgICBBU1NFUlQoIExVLnJvd3MoKT09TFUuY29scygpICkgOwotICAgIGludCBpbmRleF9tYXggPSAwIDsKLSAgICByZWFsIGJpZyA9IDAuIDsKLSAgICByZWFsIHRoZVN1bSA9IDAuIDsKLSAgICByZWFsIGR1bSA9IDAuIDsKKyAgaW5saW5lIHN0YXRpYyB2b2lkIExVX2ZhY3RvcihnZW5lX21hdHJpeCAmTFUsIFBpdm90X1ZlY3RvciAmcGl2b3QsIGludCBOKSB7CisgICAgQVNTRVJUKExVLnJvd3MoKSA9PSBMVS5jb2xzKCkpOworICAgIGludCBpbmRleF9tYXggPSAwOworICAgIHJlYWwgYmlnID0gMC47CisgICAgcmVhbCB0aGVTdW0gPSAwLjsKKyAgICByZWFsIGR1bSA9IDAuOwogICAgIC8vIEdldCB0aGUgaW1wbGljaXQgc2NhbGluZyBpbmZvcm1hdGlvbiA6Ci0gICAgZ2VuZV92ZWN0b3IgSW1wbGljaXRTY2FsaW5nKCBOICkgOwotICAgIGZvciggaW50IGk9MDsgaTxOOyBpKysgKSB7Ci0gICAgICBiaWcgPSAwLiA7Ci0gICAgICBmb3IoIGludCBqPTA7IGo8TjsgaisrICkgewotCWlmKCBhYnMoIExVKCBpLCBqICkgKT49YmlnICkgYmlnID0gYWJzKCBMVSggaSwgaiApICkgOworICAgIGdlbmVfdmVjdG9yIEltcGxpY2l0U2NhbGluZyhOKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgYmlnID0gMC47CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgeworICAgICAgICBpZiAoYWJzKExVKGksIGopKSA+PSBiaWcpIGJpZyA9IGFicyhMVShpLCBqKSk7CiAgICAgICB9Ci0gICAgICBpZiggYmlnPT0wLiApIHsKLQlJTkZPUyggImJsaXR6X0xVX2ZhY3Rvcjo6U2luZ3VsYXIgbWF0cml4IiApIDsKLQlleGl0KCAwICkgOworICAgICAgaWYgKGJpZyA9PSAwLikgeworICAgICAgICBJTkZPUygiYmxpdHpfTFVfZmFjdG9yOjpTaW5ndWxhciBtYXRyaXgiKTsKKyAgICAgICAgZXhpdCgwKTsKICAgICAgIH0KLSAgICAgIEltcGxpY2l0U2NhbGluZyggaSApID0gMS4vYmlnIDsKKyAgICAgIEltcGxpY2l0U2NhbGluZyhpKSA9IDEuIC8gYmlnOwogICAgIH0KICAgICAvLyBMb29wIG92ZXIgY29sdW1ucyBvZiBDcm91dCdzIG1ldGhvZCA6Ci0gICAgZm9yKCBpbnQgaj0wOyBqPE47IGorKyApIHsKLSAgICAgIGZvciggaW50IGk9MDsgaTxqOyBpKysgKSB7Ci0JdGhlU3VtID0gTFUoIGksIGogKSA7Ci0JdGhlU3VtIC09IG1hdHJpeF9tYXRyaXhfcHJvZHVjdF9zbGljZWQoTFUsIGksIDAsIGktMSwgTFUsIDAsIGopIDsKLQkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGZyb21TdGFydCwgaS0xICkgKSpMVSggUmFuZ2UoIGZyb21TdGFydCwgaS0xICksIGogKSApIDsKLQlMVSggaSwgaiApID0gdGhlU3VtIDsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICAgICAgdGhlU3VtID0gTFUoaSwgaik7CisgICAgICAgIHRoZVN1bSAtPSBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xpY2VkKExVLCBpLCAwLCBpIC0gMSwgTFUsIDAsIGopOworICAgICAgICAvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGZyb21TdGFydCwgaS0xICkgKSpMVSggUmFuZ2UoIGZyb21TdGFydCwgaS0xICksIGogKSApIDsKKyAgICAgICAgTFUoaSwgaikgPSB0aGVTdW07CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gU2VhcmNoIGZvciB0aGUgbGFyZ2VzdCBwaXZvdCBlbGVtZW50IDoKLSAgICAgIGJpZyA9IDAuIDsKLSAgICAgIGZvciggaW50IGk9ajsgaTxOOyBpKysgKSB7Ci0JdGhlU3VtID0gTFUoIGksIGogKSA7Ci0JdGhlU3VtIC09IG1hdHJpeF9tYXRyaXhfcHJvZHVjdF9zbGljZWQoTFUsIGksIDAsIGotMSwgTFUsIDAsIGopIDsKLQkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGZyb21TdGFydCwgai0xICkgKSpMVSggUmFuZ2UoIGZyb21TdGFydCwgai0xICksIGogKSApIDsKLQlMVSggaSwgaiApID0gdGhlU3VtIDsKLQlpZiggKEltcGxpY2l0U2NhbGluZyggaSApKmFicyggdGhlU3VtICkpPj1iaWcgKSB7Ci0JICBkdW0gPSBJbXBsaWNpdFNjYWxpbmcoIGkgKSphYnMoIHRoZVN1bSApIDsKLQkgIGJpZyA9IGR1bSA7Ci0JICBpbmRleF9tYXggPSBpIDsKLQl9CisgICAgICBiaWcgPSAwLjsKKyAgICAgIGZvciAoaW50IGkgPSBqOyBpIDwgTjsgaSsrKSB7CisgICAgICAgIHRoZVN1bSA9IExVKGksIGopOworICAgICAgICB0aGVTdW0gLT0gbWF0cml4X21hdHJpeF9wcm9kdWN0X3NsaWNlZChMVSwgaSwgMCwgaiAtIDEsIExVLCAwLCBqKTsKKyAgICAgICAgLy8JdGhlU3VtIC09IHN1bSggTFUoIGksIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApICkqTFUoIFJhbmdlKCBmcm9tU3RhcnQsIGotMSApLCBqICkgKSA7CisgICAgICAgIExVKGksIGopID0gdGhlU3VtOworICAgICAgICBpZiAoKEltcGxpY2l0U2NhbGluZyhpKSAqIGFicyh0aGVTdW0pKSA+PSBiaWcpIHsKKyAgICAgICAgICBkdW0gPSBJbXBsaWNpdFNjYWxpbmcoaSkgKiBhYnModGhlU3VtKTsKKyAgICAgICAgICBiaWcgPSBkdW07CisgICAgICAgICAgaW5kZXhfbWF4ID0gaTsKKyAgICAgICAgfQogICAgICAgfQogICAgICAgLy8gSW50ZXJjaGFuZ2luZyByb3dzIGFuZCB0aGUgc2NhbGUgZmFjdG9yIDoKLSAgICAgIGlmKCBqIT1pbmRleF9tYXggKSB7Ci0JZm9yKCBpbnQgaz0wOyBrPE47IGsrKyApIHsKLQkgIGR1bSA9IExVKCBpbmRleF9tYXgsIGsgKSA7Ci0JICBMVSggaW5kZXhfbWF4LCBrICkgPSBMVSggaiwgayApIDsKLQkgIExVKCBqLCBrICkgPSBkdW0gOwotCX0KLQlJbXBsaWNpdFNjYWxpbmcoIGluZGV4X21heCApID0gSW1wbGljaXRTY2FsaW5nKCBqICkgOworICAgICAgaWYgKGogIT0gaW5kZXhfbWF4KSB7CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgTjsgaysrKSB7CisgICAgICAgICAgZHVtID0gTFUoaW5kZXhfbWF4LCBrKTsKKyAgICAgICAgICBMVShpbmRleF9tYXgsIGspID0gTFUoaiwgayk7CisgICAgICAgICAgTFUoaiwgaykgPSBkdW07CisgICAgICAgIH0KKyAgICAgICAgSW1wbGljaXRTY2FsaW5nKGluZGV4X21heCkgPSBJbXBsaWNpdFNjYWxpbmcoaik7CiAgICAgICB9Ci0gICAgICBwaXZvdCggaiApID0gaW5kZXhfbWF4IDsKLSAgICAgIGlmICggTFUoIGosIGogKT09MC4gKSBMVSggaiwgaiApID0gMS5lLTIwIDsKKyAgICAgIHBpdm90KGopID0gaW5kZXhfbWF4OworICAgICAgaWYgKExVKGosIGopID09IDAuKSBMVShqLCBqKSA9IDEuZS0yMDsKICAgICAgIC8vIERpdmlkZSBieSB0aGUgcGl2b3QgZWxlbWVudCA6Ci0gICAgICBpZiggajxOICkgewotCWR1bSA9IDEuL0xVKCBqLCBqICkgOwotCWZvciggaW50IGk9aisxOyBpPE47IGkrKyApIExVKCBpLCBqICkgKj0gZHVtIDsKKyAgICAgIGlmIChqIDwgTikgeworICAgICAgICBkdW0gPSAxLiAvIExVKGosIGopOworICAgICAgICBmb3IgKGludCBpID0gaiArIDE7IGkgPCBOOyBpKyspIExVKGksIGopICo9IGR1bTsKICAgICAgIH0KICAgICB9Ci0KICAgfQogCi0gIGlubGluZSBzdGF0aWMgdm9pZCBMVV9zb2x2ZShjb25zdCBnZW5lX21hdHJpeCAmIExVLCBjb25zdCBQaXZvdF9WZWN0b3IgcGl2b3QsIGdlbmVfdmVjdG9yICZCLCBnZW5lX3ZlY3RvciBYLCBpbnQgTikKLSAgewotCisgIGlubGluZSBzdGF0aWMgdm9pZCBMVV9zb2x2ZShjb25zdCBnZW5lX21hdHJpeCAmTFUsIGNvbnN0IFBpdm90X1ZlY3RvciBwaXZvdCwgZ2VuZV92ZWN0b3IgJkIsIGdlbmVfdmVjdG9yIFgsIGludCBOKSB7CiAgICAgLy8gUG91ciBjb25zZXJ2ZXIgbGUgbWVtZSBoZWFkZXIsIG9uIHRyYXZhaWxsZSBzdXIgWCwgY29waWUgZHUgc2Vjb25kLW1lbWJyZSBCCi0gICAgWCA9IEIuY29weSgpIDsKLSAgICBBU1NFUlQoIExVLnJvd3MoKT09TFUuY29scygpICkgOwotICAgIGZpcnN0SW5kZXggaW5kSSA7CisgICAgWCA9IEIuY29weSgpOworICAgIEFTU0VSVChMVS5yb3dzKCkgPT0gTFUuY29scygpKTsKKyAgICBmaXJzdEluZGV4IGluZEk7CiAgICAgLy8gRm9yd2FyZCBzdWJzdGl0dXRpb24gOgotICAgIGludCBpaSA9IDAgOwotICAgIHJlYWwgdGhlU3VtID0gMC4gOwotICAgIGZvciggaW50IGk9MDsgaTxOOyBpKysgKSB7Ci0gICAgICBpbnQgaXAgPSBwaXZvdCggaSApIDsKLSAgICAgIHRoZVN1bSA9IFgoIGlwICkgOworICAgIGludCBpaSA9IDA7CisgICAgcmVhbCB0aGVTdW0gPSAwLjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgaW50IGlwID0gcGl2b3QoaSk7CisgICAgICB0aGVTdW0gPSBYKGlwKTsKICAgICAgIC8vICAgICAgdGhlU3VtID0gQiggaXAgKSA7Ci0gICAgICBYKCBpcCApID0gWCggaSApIDsKKyAgICAgIFgoaXApID0gWChpKTsKICAgICAgIC8vICAgICAgQiggaXAgKSA9IEIoIGkgKSA7Ci0gICAgICBpZiggaWkgKSB7Ci0JdGhlU3VtIC09IG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoTFUsIFgsIGksIGlpLTEsIGktMSkgOwotCS8vCXRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaWktMSwgaS0xICkgKSpYKCBSYW5nZSggaWktMSwgaS0xICkgKSApIDsKLQkvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGlpLTEsIGktMSApICkqQiggUmFuZ2UoIGlpLTEsIGktMSApICkgKSA7Ci0gICAgICB9IGVsc2UgaWYoIHRoZVN1bSApIHsKLQlpaSA9IGkrMSA7CisgICAgICBpZiAoaWkpIHsKKyAgICAgICAgdGhlU3VtIC09IG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbGljZWQoTFUsIFgsIGksIGlpIC0gMSwgaSAtIDEpOworICAgICAgICAvLwl0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGlpLTEsIGktMSApICkqWCggUmFuZ2UoIGlpLTEsIGktMSApICkgKSA7CisgICAgICAgIC8vCXRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaWktMSwgaS0xICkgKSpCKCBSYW5nZSggaWktMSwgaS0xICkgKSApIDsKKyAgICAgIH0gZWxzZSBpZiAodGhlU3VtKSB7CisgICAgICAgIGlpID0gaSArIDE7CiAgICAgICB9Ci0gICAgICBYKCBpICkgPSB0aGVTdW0gOworICAgICAgWChpKSA9IHRoZVN1bTsKICAgICAgIC8vICAgICAgQiggaSApID0gdGhlU3VtIDsKICAgICB9CiAgICAgLy8gQmFja3N1YnN0aXR1dGlvbiA6Ci0gICAgZm9yKCBpbnQgaT1OLTE7IGk+PTA7IGktLSApIHsKLSAgICAgIHRoZVN1bSA9IFgoIGkgKSA7CisgICAgZm9yIChpbnQgaSA9IE4gLSAxOyBpID49IDA7IGktLSkgeworICAgICAgdGhlU3VtID0gWChpKTsKICAgICAgIC8vICAgICAgdGhlU3VtID0gQiggaSApIDsKLSAgICAgIHRoZVN1bSAtPSBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKExVLCBYLCBpLCBpKzEsIE4pIDsKKyAgICAgIHRoZVN1bSAtPSBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xpY2VkKExVLCBYLCBpLCBpICsgMSwgTik7CiAgICAgICAvLyAgICAgIHRoZVN1bSAtPSBzdW0oIExVKCBpLCBSYW5nZSggaSsxLCB0b0VuZCApICkqWCggUmFuZ2UoIGkrMSwgdG9FbmQgKSApICkgOwogICAgICAgLy8gICAgICB0aGVTdW0gLT0gc3VtKCBMVSggaSwgUmFuZ2UoIGkrMSwgdG9FbmQgKSApKkIoIFJhbmdlKCBpKzEsIHRvRW5kICkgKSApIDsKICAgICAgIC8vIFN0b3JlIGEgY29tcG9uZW50IG9mIHRoZSBzb2x1dGlvbiB2ZWN0b3IgOgotICAgICAgWCggaSApID0gdGhlU3VtL0xVKCBpLCBpICkgOworICAgICAgWChpKSA9IHRoZVN1bSAvIExVKGksIGkpOwogICAgICAgLy8gICAgICBCKCBpICkgPSB0aGVTdW0vTFUoIGksIGkgKSA7CiAgICAgfQotCiAgIH0KLQogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy9tdGw0L210bDRfaW50ZXJmYWNlLmhoIGIvYmVuY2gvYnRsL2xpYnMvbXRsNC9tdGw0X2ludGVyZmFjZS5oaAppbmRleCAzNzk1YWM2Li5mYTU2MzZmIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy9tdGw0L210bDRfaW50ZXJmYWNlLmhoCisrKyBiL2JlbmNoL2J0bC9saWJzL210bDQvbXRsNF9pbnRlcmZhY2UuaGgKQEAgLTI1LDEyMCArMjUsMTAwIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBtdGw7CiAKLXRlbXBsYXRlPGNsYXNzIHJlYWw+Cit0ZW1wbGF0ZSA8Y2xhc3MgcmVhbD4KIGNsYXNzIG10bDRfaW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgcmVhbCByZWFsX3R5cGU7CiAKLXB1YmxpYyA6Ci0KLSAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZSA7Ci0KLSAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiAgc3RsX3ZlY3RvcjsKLSAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yID4gc3RsX21hdHJpeDsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiBzdGxfdmVjdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0bF92ZWN0b3I+IHN0bF9tYXRyaXg7CiAKICAgdHlwZWRlZiBtdGw6OmRlbnNlMkQ8cmVhbCwgbXRsOjptYXRyaXg6OnBhcmFtZXRlcnM8bXRsOjp0YWc6OmNvbF9tYWpvcj4gPiBnZW5lX21hdHJpeDsKLSAgdHlwZWRlZiBtdGw6OmRlbnNlX3ZlY3RvcjxyZWFsPiAgZ2VuZV92ZWN0b3I7CisgIHR5cGVkZWYgbXRsOjpkZW5zZV92ZWN0b3I8cmVhbD4gZ2VuZV92ZWN0b3I7CiAKICAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCkgeyByZXR1cm4gIm10bDQiOyB9CiAKLSAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXggJiBBLCBpbnQgTil7Ci0gICAgcmV0dXJuIDsKLSAgfQorICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCYgQSwgaW50IE4pIHsgcmV0dXJuOyB9CiAKLSAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKXsKLSAgICByZXR1cm4gOwotICB9CisgIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yJiBCKSB7IHJldHVybjsgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfZnJvbV9zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgewogICAgIEEuY2hhbmdlX2RpbShBX3N0bFswXS5zaXplKCksIEFfc3RsLnNpemUoKSk7CiAKLSAgICBmb3IgKGludCBqPTA7IGo8QV9zdGwuc2l6ZSgpIDsgaisrKXsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxBX3N0bFtqXS5zaXplKCkgOyBpKyspewotICAgICAgICBBKGksaikgPSBBX3N0bFtqXVtpXTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IEFfc3RsLnNpemUoKTsgaisrKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFfc3RsW2pdLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEEoaSwgaikgPSBBX3N0bFtqXVtpXTsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciYgQiwgc3RsX3ZlY3RvciYgQl9zdGwpIHsKICAgICBCLmNoYW5nZV9kaW0oQl9zdGwuc2l6ZSgpKTsKLSAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKXsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJfc3RsLnNpemUoKTsgaSsrKSB7CiAgICAgICBCW2ldID0gQl9zdGxbaV07CiAgICAgfQogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpewotICAgIGZvciAoaW50IGk9MDsgaTxCX3N0bC5zaXplKCkgOyBpKyspeworICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciYgQiwgc3RsX3ZlY3RvciYgQl9zdGwpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJfc3RsLnNpemUoKTsgaSsrKSB7CiAgICAgICBCX3N0bFtpXSA9IEJbaV07CiAgICAgfQogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpewotICAgIGludCBOPUFfc3RsLnNpemUoKTsKLSAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgeworICAgIGludCBOID0gQV9zdGwuc2l6ZSgpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CiAgICAgICBBX3N0bFtqXS5yZXNpemUoTik7Ci0gICAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7Ci0gICAgICAgIEFfc3RsW2pdW2ldID0gQShpLGopOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgQV9zdGxbal1baV0gPSBBKGksIGopOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pewotICAgIFggPSAoQSpCKTsKLS8vICAgICBtb3J0b25fZGVuc2U8ZG91YmxlLCBkb3BwbGVkXzY0X3Jvd19tYXNrPiBDKE4sTik7Ci0vLyAgICAgQyA9IEI7Ci0vLyAgICAgWCA9IChBKkMpOworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4JiBBLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKSB7CisgICAgWCA9IChBICogQik7CisgICAgLy8gICAgIG1vcnRvbl9kZW5zZTxkb3VibGUsIGRvcHBsZWRfNjRfcm93X21hc2s+IEMoTixOKTsKKyAgICAvLyAgICAgQyA9IEI7CisgICAgLy8gICAgIFggPSAoQSpDKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc3Bvc2VkX21hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7Ci0gICAgWCA9ICh0cmFucyhBKSp0cmFucyhCKSk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc3Bvc2VkX21hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCYgQSwgY29uc3QgZ2VuZV9tYXRyaXgmIEIsIGdlbmVfbWF0cml4JiBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE4pIHsKKyAgICBYID0gKHRyYW5zKEEpICogdHJhbnMoQikpOwogICB9CiAKLS8vICAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7Ci0vLyAgICAgWCA9ICh0cmFucyhBKSpBKTsKLS8vICAgfQorICAvLyAgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdGFfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4peworICAvLyAgICAgWCA9ICh0cmFucyhBKSpBKTsKKyAgLy8gICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGFhdF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7Ci0gICAgWCA9IChBKnRyYW5zKEEpKTsKLSAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgYWF0X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGdlbmVfbWF0cml4JiBYLCBpbnQgTikgeyBYID0gKEEgKiB0cmFucyhBKSk7IH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKLSAgICBYID0gKEEqQik7Ci0gIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF92ZWN0b3JfcHJvZHVjdChnZW5lX21hdHJpeCYgQSwgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgeyBYID0gKEEgKiBCKTsgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7Ci0gICAgWCA9ICh0cmFucyhBKSpCKTsKLSAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgYXR2X3Byb2R1Y3QoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4pIHsgWCA9ICh0cmFucyhBKSAqIEIpOyB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4pewotICAgIFkgKz0gY29lZiAqIFg7Ci0gIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciYgWCwgZ2VuZV92ZWN0b3ImIFksIGludCBOKSB7IFkgKz0gY29lZiAqIFg7IH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgYXhwYnkocmVhbCBhLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIHJlYWwgYiwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7Ci0gICAgWSA9IGEqWCArIGIqWTsKLSAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgYXhwYnkocmVhbCBhLCBjb25zdCBnZW5lX3ZlY3RvciYgWCwgcmVhbCBiLCBnZW5lX3ZlY3RvciYgWSwgaW50IE4pIHsgWSA9IGEgKiBYICsgYiAqIFk7IH0KIAotLy8gICBzdGF0aWMgaW5saW5lIHZvaWQgY2hvbGVza3koY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKLS8vICAgICBDID0gWDsKLS8vICAgICByZWN1cnNpdmVfY2hvbGVza3koQyk7Ci0vLyAgIH0KKyAgLy8gICBzdGF0aWMgaW5saW5lIHZvaWQgY2hvbGVza3koY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIEMsIGludCBOKXsKKyAgLy8gICAgIEMgPSBYOworICAvLyAgICAgcmVjdXJzaXZlX2Nob2xlc2t5KEMpOworICAvLyAgIH0KIAotLy8gICBzdGF0aWMgaW5saW5lIHZvaWQgbHVfZGVjb21wKGNvbnN0IGdlbmVfbWF0cml4ICYgWCwgZ2VuZV9tYXRyaXggJiBSLCBpbnQgTil7Ci0vLyAgICAgUiA9IFg7Ci0vLyAgICAgc3RkOjp2ZWN0b3I8aW50PiBpcHZ0KE4pOwotLy8gICAgIGx1X2ZhY3RvcihSLCBpcHZ0KTsKLS8vICAgfQorICAvLyAgIHN0YXRpYyBpbmxpbmUgdm9pZCBsdV9kZWNvbXAoY29uc3QgZ2VuZV9tYXRyaXggJiBYLCBnZW5lX21hdHJpeCAmIFIsIGludCBOKXsKKyAgLy8gICAgIFIgPSBYOworICAvLyAgICAgc3RkOjp2ZWN0b3I8aW50PiBpcHZ0KE4pOworICAvLyAgICAgbHVfZmFjdG9yKFIsIGlwdnQpOworICAvLyAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdHJpc29sdmVfbG93ZXIoY29uc3QgZ2VuZV9tYXRyaXggJiBMLCBjb25zdCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCYgTCwgY29uc3QgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgewogICAgIFggPSBsb3dlcl90cmlzb2x2ZShMLCBCKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X21hdHJpeChjb25zdCBnZW5lX21hdHJpeCAmIHNvdXJjZSwgZ2VuZV9tYXRyaXggJiBjaWJsZSwgaW50IE4pewotICAgIGNpYmxlID0gc291cmNlOwotICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X21hdHJpeChjb25zdCBnZW5lX21hdHJpeCYgc291cmNlLCBnZW5lX21hdHJpeCYgY2libGUsIGludCBOKSB7IGNpYmxlID0gc291cmNlOyB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yICYgc291cmNlLCBnZW5lX3ZlY3RvciAmIGNpYmxlLCBpbnQgTil7Ci0gICAgY2libGUgPSBzb3VyY2U7Ci0gIH0KLQorICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3ImIHNvdXJjZSwgZ2VuZV92ZWN0b3ImIGNpYmxlLCBpbnQgTikgeyBjaWJsZSA9IHNvdXJjZTsgfQogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy90ZW5zb3JzL21haW5fbGluZWFyLmNwcCBiL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvbWFpbl9saW5lYXIuY3BwCmluZGV4IGUyNTdmMWUuLjVkOTliMDkgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvbWFpbl9saW5lYXIuY3BwCisrKyBiL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvbWFpbl9saW5lYXIuY3BwCkBAIC0xNCwxMCArMTQsOSBAQAogCiBCVExfTUFJTjsKIAotaW50IG1haW4oKQotewotICBiZW5jaDxBY3Rpb25fYXhweTx0ZW5zb3JfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX2F4cGJ5PHRlbnNvcl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOworaW50IG1haW4oKSB7CisgIGJlbmNoPEFjdGlvbl9heHB5PHRlbnNvcl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksIE1BWF9BWFBZLCBOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9heHBieTx0ZW5zb3JfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLCBNQVhfQVhQWSwgTkJfUE9JTlQpOwogCiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYmVuY2gvYnRsL2xpYnMvdGVuc29ycy9tYWluX21hdG1hdC5jcHAgYi9iZW5jaC9idGwvbGlicy90ZW5zb3JzL21haW5fbWF0bWF0LmNwcAppbmRleCA2NzVmY2ZjLi5mMmI4MGRmIDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy90ZW5zb3JzL21haW5fbWF0bWF0LmNwcAorKysgYi9iZW5jaC9idGwvbGlicy90ZW5zb3JzL21haW5fbWF0bWF0LmNwcApAQCAtMTMsOSArMTMsOCBAQAogCiBCVExfTUFJTjsKIAotaW50IG1haW4oKQotewotICBiZW5jaDxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0PHRlbnNvcl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CitpbnQgbWFpbigpIHsKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDx0ZW5zb3JfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CiAKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy90ZW5zb3JzL21haW5fdmVjbWF0LmNwcCBiL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvbWFpbl92ZWNtYXQuY3BwCmluZGV4IDFhZjAwYzguLmZhZTJjNTUgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvbWFpbl92ZWNtYXQuY3BwCisrKyBiL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvbWFpbl92ZWNtYXQuY3BwCkBAIC0xMyw5ICsxMyw4IEBACiAKIEJUTF9NQUlOOwogCi1pbnQgbWFpbigpCi17Ci0gIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8dGVuc29yX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsTUFYX01WLE5CX1BPSU5UKTsKK2ludCBtYWluKCkgeworICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PHRlbnNvcl9pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLCBNQVhfTVYsIE5CX1BPSU5UKTsKIAogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvdGVuc29yX2ludGVyZmFjZS5oaCBiL2JlbmNoL2J0bC9saWJzL3RlbnNvcnMvdGVuc29yX2ludGVyZmFjZS5oaAppbmRleCA5N2I4ZTBmLi4zZmY4ZTk0IDEwMDY0NAotLS0gYS9iZW5jaC9idGwvbGlicy90ZW5zb3JzL3RlbnNvcl9pbnRlcmZhY2UuaGgKKysrIGIvYmVuY2gvYnRsL2xpYnMvdGVuc29ycy90ZW5zb3JfaW50ZXJmYWNlLmhoCkBAIC0xNSw4OSArMTUsODIgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi10ZW1wbGF0ZTxjbGFzcyByZWFsPgotY2xhc3MgdGVuc29yX2ludGVyZmFjZQotewotcHVibGljIDoKK3RlbXBsYXRlIDxjbGFzcyByZWFsPgorY2xhc3MgdGVuc29yX2ludGVyZmFjZSB7CisgcHVibGljOgogICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjpUZW5zb3I8cmVhbCwyPjo6SW5kZXggSW5kZXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OlRlbnNvcjxyZWFsLCAyPjo6SW5kZXggSW5kZXg7CiAKICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiBzdGxfdmVjdG9yOwogICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0bF92ZWN0b3I+IHN0bF9tYXRyaXg7CiAKLSAgdHlwZWRlZiBFaWdlbjo6VGVuc29yPHJlYWwsMj4gZ2VuZV9tYXRyaXg7Ci0gIHR5cGVkZWYgRWlnZW46OlRlbnNvcjxyZWFsLDE+IGdlbmVfdmVjdG9yOworICB0eXBlZGVmIEVpZ2VuOjpUZW5zb3I8cmVhbCwgMj4gZ2VuZV9tYXRyaXg7CisgIHR5cGVkZWYgRWlnZW46OlRlbnNvcjxyZWFsLCAxPiBnZW5lX3ZlY3RvcjsKIAorICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUodm9pZCkgeyByZXR1cm4gRUlHRU5fTUFLRVNUUklORyhCVExfUFJFRklYKTsgfQogCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gRUlHRU5fTUFLRVNUUklORyhCVExfUFJFRklYKTsKLSAgfQorICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCYgLypBKi8sIGludCAvKk4qLykge30KIAotICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIC8qQSovLCBpbnQgLypOKi8pIHt9CisgIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yJiAvKkIqLykge30KIAotICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciAmIC8qQiovKSB7fQorICBzdGF0aWMgQlRMX0RPTlRfSU5MSU5FIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgeworICAgIEEucmVzaXplKEVpZ2VuOjphcnJheTxJbmRleCwgMj4oQV9zdGxbMF0uc2l6ZSgpLCBBX3N0bC5zaXplKCkpKTsKIAotICBzdGF0aWMgQlRMX0RPTlRfSU5MSU5FIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKLSAgICBBLnJlc2l6ZShFaWdlbjo6YXJyYXk8SW5kZXgsMj4oQV9zdGxbMF0uc2l6ZSgpLCBBX3N0bC5zaXplKCkpKTsKLQotICAgIGZvciAodW5zaWduZWQgaW50IGo9MDsgajxBX3N0bC5zaXplKCkgOyBqKyspewotICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPEFfc3RsW2pdLnNpemUoKSA7IGkrKyl7Ci0gICAgICAgIEEuY29lZmZSZWYoRWlnZW46OmFycmF5PEluZGV4LDI+KGksaikpID0gQV9zdGxbal1baV07CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaiA9IDA7IGogPCBBX3N0bC5zaXplKCk7IGorKykgeworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBBX3N0bFtqXS5zaXplKCk7IGkrKykgeworICAgICAgICBBLmNvZWZmUmVmKEVpZ2VuOjphcnJheTxJbmRleCwgMj4oaSwgaikpID0gQV9zdGxbal1baV07CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgc3RhdGljIEJUTF9ET05UX0lOTElORSAgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3IgJiBCLCBzdGxfdmVjdG9yICYgQl9zdGwpeworICBzdGF0aWMgQlRMX0RPTlRfSU5MSU5FIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yJiBCLCBzdGxfdmVjdG9yJiBCX3N0bCkgewogICAgIEIucmVzaXplKEJfc3RsLnNpemUoKSk7CiAKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKXsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IEJfc3RsLnNpemUoKTsgaSsrKSB7CiAgICAgICBCLmNvZWZmUmVmKGkpID0gQl9zdGxbaV07CiAgICAgfQogICB9CiAKLSAgc3RhdGljIEJUTF9ET05UX0lOTElORSAgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKXsKKyAgc3RhdGljIEJUTF9ET05UX0lOTElORSB2b2lkIHZlY3Rvcl90b19zdGwoZ2VuZV92ZWN0b3ImIEIsIHN0bF92ZWN0b3ImIEJfc3RsKSB7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBCX3N0bC5zaXplKCk7IGkrKykgewogICAgICAgQl9zdGxbaV0gPSBCLmNvZWZmKGkpOwogICAgIH0KICAgfQogCi0gIHN0YXRpYyBCVExfRE9OVF9JTkxJTkUgIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7Ci0gICAgaW50ICBOPUFfc3RsLnNpemUoKTsKKyAgc3RhdGljIEJUTF9ET05UX0lOTElORSB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXgmIEEsIHN0bF9tYXRyaXgmIEFfc3RsKSB7CisgICAgaW50IE4gPSBBX3N0bC5zaXplKCk7CiAKLSAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKICAgICAgIEFfc3RsW2pdLnJlc2l6ZShOKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKLSAgICAgICAgQV9zdGxbal1baV0gPSBBLmNvZWZmKEVpZ2VuOjphcnJheTxJbmRleCwyPihpLGopKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgIEFfc3RsW2pdW2ldID0gQS5jb2VmZihFaWdlbjo6YXJyYXk8SW5kZXgsIDI+KGksIGopKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4ICYgQSwgY29uc3QgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCAgLypOKi8peworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4JiBBLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsIGludCAvKk4qLykgewogICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OlRlbnNvcjxyZWFsX3R5cGUsIDE+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CiAgICAgY29uc3QgRWlnZW46OmFycmF5PERpbVBhaXIsIDE+IGRpbXMoRGltUGFpcigxLCAwKSk7Ci0gICAgWC8qLm5vYWxpYXMoKSovID0gQS5jb250cmFjdChCLCBkaW1zKTsKKyAgICBYIC8qLm5vYWxpYXMoKSovID0gQS5jb250cmFjdChCLCBkaW1zKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50ICAvKk4qLyl7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IC8qTiovKSB7CiAgICAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6VGVuc29yPHJlYWxfdHlwZSwgMT46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKICAgICBjb25zdCBFaWdlbjo6YXJyYXk8RGltUGFpciwgMT4gZGltcyhEaW1QYWlyKDEsIDApKTsKLSAgICBYLyoubm9hbGlhcygpKi8gPSBBLmNvbnRyYWN0KEIsIGRpbXMpOworICAgIFggLyoubm9hbGlhcygpKi8gPSBBLmNvbnRyYWN0KEIsIGRpbXMpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkocmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50ICAvKk4qLyl7Ci0gICAgWSArPSBYLmNvbnN0YW50KGNvZWYpICogWDsKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkocmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciYgWCwgZ2VuZV92ZWN0b3ImIFksIGludCAvKk4qLykgeyBZICs9IFguY29uc3RhbnQoY29lZikgKiBYOyB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KHJlYWwgYSwgY29uc3QgZ2VuZV92ZWN0b3ImIFgsIHJlYWwgYiwgZ2VuZV92ZWN0b3ImIFksIGludCAvKk4qLykgeworICAgIFkgPSBYLmNvbnN0YW50KGEpICogWCArIFkuY29uc3RhbnQoYikgKiBZOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KHJlYWwgYSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCByZWFsIGIsIGdlbmVfdmVjdG9yICYgWSwgaW50ICAvKk4qLyl7Ci0gICAgWSA9IFguY29uc3RhbnQoYSkqWCArIFkuY29uc3RhbnQoYikqWTsKLSAgfQotCi0gIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgIC8qTiovKXsKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXgmIHNvdXJjZSwgZ2VuZV9tYXRyaXgmIGNpYmxlLCBpbnQgLypOKi8pIHsKICAgICBjaWJsZSA9IHNvdXJjZTsKICAgfQogCi0gIHN0YXRpYyBFSUdFTl9ET05UX0lOTElORSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yICYgc291cmNlLCBnZW5lX3ZlY3RvciAmIGNpYmxlLCBpbnQgIC8qTiovKXsKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3ImIHNvdXJjZSwgZ2VuZV92ZWN0b3ImIGNpYmxlLCBpbnQgLypOKi8pIHsKICAgICBjaWJsZSA9IHNvdXJjZTsKICAgfQogfTsKZGlmZiAtLWdpdCBhL2JlbmNoL2J0bC9saWJzL3R2bWV0L21haW4uY3BwIGIvYmVuY2gvYnRsL2xpYnMvdHZtZXQvbWFpbi5jcHAKaW5kZXggNjMzMjE1Yy4uYWEwZjMzNyAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvdHZtZXQvbWFpbi5jcHAKKysrIGIvYmVuY2gvYnRsL2xpYnMvdHZtZXQvbWFpbi5jcHAKQEAgLTI3LDE0ICsyNywxMSBAQAogCiBCVExfTUFJTjsKIAotaW50IG1haW4oKQotewotICBiZW5jaF9zdGF0aWM8QWN0aW9uX2F4cHksdHZtZXRfaW50ZXJmYWNlPigpOwotICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCx0dm1ldF9pbnRlcmZhY2U+KCk7Ci0gIGJlbmNoX3N0YXRpYzxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LHR2bWV0X2ludGVyZmFjZT4oKTsKLSAgYmVuY2hfc3RhdGljPEFjdGlvbl9hdHZfcHJvZHVjdCx0dm1ldF9pbnRlcmZhY2U+KCk7CitpbnQgbWFpbigpIHsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9heHB5LCB0dm1ldF9pbnRlcmZhY2U+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LCB0dm1ldF9pbnRlcmZhY2U+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LCB0dm1ldF9pbnRlcmZhY2U+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fYXR2X3Byb2R1Y3QsIHR2bWV0X2ludGVyZmFjZT4oKTsKIAogICByZXR1cm4gMDsKIH0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy90dm1ldC90dm1ldF9pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy90dm1ldC90dm1ldF9pbnRlcmZhY2UuaGgKaW5kZXggYjQ0MWFkYS4uM2QxMmU2YyAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvdHZtZXQvdHZtZXRfaW50ZXJmYWNlLmhoCisrKyBiL2JlbmNoL2J0bC9saWJzL3R2bWV0L3R2bWV0X2ludGVyZmFjZS5oaApAQCAtMjgsNzcgKzI4LDU5IEBACiAKIHVzaW5nIG5hbWVzcGFjZSB0dm1ldDsKIAotdGVtcGxhdGU8Y2xhc3MgcmVhbCwgaW50IFNJWkU+Ci1jbGFzcyB0dm1ldF9pbnRlcmZhY2V7Cit0ZW1wbGF0ZSA8Y2xhc3MgcmVhbCwgaW50IFNJWkU+CitjbGFzcyB0dm1ldF9pbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZTsKIAotcHVibGljIDoKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiBzdGxfdmVjdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0bF92ZWN0b3I+IHN0bF9tYXRyaXg7CiAKLSAgdHlwZWRlZiByZWFsIHJlYWxfdHlwZSA7Ci0KLSAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxyZWFsPiAgc3RsX3ZlY3RvcjsKLSAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yID4gc3RsX21hdHJpeDsKLQotICB0eXBlZGVmIFZlY3RvcjxyZWFsLFNJWkU+IGdlbmVfdmVjdG9yOwotICB0eXBlZGVmIE1hdHJpeDxyZWFsLFNJWkUsU0laRT4gZ2VuZV9tYXRyaXg7CisgIHR5cGVkZWYgVmVjdG9yPHJlYWwsIFNJWkU+IGdlbmVfdmVjdG9yOworICB0eXBlZGVmIE1hdHJpeDxyZWFsLCBTSVpFLCBTSVpFPiBnZW5lX21hdHJpeDsKIAogICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKSB7IHJldHVybiAidGlueV90dm1ldCI7IH0KIAotICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIEEsIGludCBOKXt9CisgIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4JiBBLCBpbnQgTikge30KIAotICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciAmIEIpe30KKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3ImIEIpIHt9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7Ci0gICAgZm9yIChpbnQgaj0wOyBqPEFfc3RsLnNpemUoKSA7IGorKykKLSAgICAgIGZvciAoaW50IGk9MDsgaTxBX3N0bFtqXS5zaXplKCkgOyBpKyspCi0gICAgICAgIEEoaSxqKSA9IEFfc3RsW2pdW2ldOworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgQV9zdGwuc2l6ZSgpOyBqKyspCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFfc3RsW2pdLnNpemUoKTsgaSsrKSBBKGksIGopID0gQV9zdGxbal1baV07CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX2Zyb21fc3RsKGdlbmVfdmVjdG9yICYgQiwgc3RsX3ZlY3RvciAmIEJfc3RsKXsKLSAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKQotICAgICAgQltpXT1CX3N0bFtpXTsKKyAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciYgQiwgc3RsX3ZlY3RvciYgQl9zdGwpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJfc3RsLnNpemUoKTsgaSsrKSBCW2ldID0gQl9zdGxbaV07CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7Ci0gICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7Ci0gICAgICBCX3N0bFtpXT1CW2ldOworICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciYgQiwgc3RsX3ZlY3RvciYgQl9zdGwpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJfc3RsLnNpemUoKTsgaSsrKSB7CisgICAgICBCX3N0bFtpXSA9IEJbaV07CiAgICAgfQogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpeworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCYgQSwgc3RsX21hdHJpeCYgQV9zdGwpIHsKICAgICBpbnQgTiA9IEFfc3RsLnNpemUoKTsKLSAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKICAgICAgIEFfc3RsW2pdLnJlc2l6ZShOKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPE47aSsrKQotICAgICAgICBBX3N0bFtqXVtpXSA9IEEoaSxqKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSBBX3N0bFtqXVtpXSA9IEEoaSwgaik7CiAgICAgfQogICB9CiAKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4JiBzb3VyY2UsIGdlbmVfbWF0cml4JiBjaWJsZSwgaW50IE4pIHsgY2libGUgPSBzb3VyY2U7IH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKXsKLSAgICBjaWJsZSA9IHNvdXJjZTsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yJiBzb3VyY2UsIGdlbmVfdmVjdG9yJiBjaWJsZSwgaW50IE4pIHsgY2libGUgPSBzb3VyY2U7IH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IGdlbmVfbWF0cml4JiBBLCBjb25zdCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKSB7CisgICAgWCA9IHByb2QoQSwgQik7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKLSAgICBjaWJsZSA9IHNvdXJjZTsKLSAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4JiBBLCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3ImIFgsIGludCBOKSB7IFggPSBwcm9kKEEsIEIpOyB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9tYXRyaXhfcHJvZHVjdChjb25zdCBnZW5lX21hdHJpeCAmIEEsIGNvbnN0IGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7Ci0gICAgWCA9IHByb2QoQSxCKTsKLSAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgYXR2X3Byb2R1Y3QoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4pIHsgWCA9IHByb2QodHJhbnMoQSksIEIpOyB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF92ZWN0b3JfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7Ci0gICAgWCA9IHByb2QoQSxCKTsKLSAgfQotCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7Ci0gICAgWCA9IHByb2QodHJhbnMoQSksQik7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShjb25zdCByZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yICYgWCwgZ2VuZV92ZWN0b3IgJiBZLCBpbnQgTil7Ci0gICAgWSs9Y29lZipYOwotICB9Ci0KKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciYgWCwgZ2VuZV92ZWN0b3ImIFksIGludCBOKSB7IFkgKz0gY29lZiAqIFg7IH0KIH07CiAKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy91Ymxhcy9tYWluLmNwcCBiL2JlbmNoL2J0bC9saWJzL3VibGFzL21haW4uY3BwCmluZGV4IGUyZTc3ZWUuLmJkMTM1ZjMgMTAwNjQ0Ci0tLSBhL2JlbmNoL2J0bC9saWJzL3VibGFzL21haW4uY3BwCisrKyBiL2JlbmNoL2J0bC9saWJzL3VibGFzL21haW4uY3BwCkBAIC0yNCwyMSArMjQsMTggQEAKIAogQlRMX01BSU47CiAKLWludCBtYWluKCkKLXsKLSAgYmVuY2g8QWN0aW9uX2F4cHk8dWJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLE1BWF9BWFBZLE5CX1BPSU5UKTsKLSAgYmVuY2g8QWN0aW9uX2F4cGJ5PHVibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CitpbnQgbWFpbigpIHsKKyAgYmVuY2g8QWN0aW9uX2F4cHk8dWJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLCBNQVhfQVhQWSwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXhwYnk8dWJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9BWFBZLCBNQVhfQVhQWSwgTkJfUE9JTlQpOwogCi0gIGJlbmNoPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8dWJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOwotICBiZW5jaDxBY3Rpb25fYXR2X3Byb2R1Y3Q8dWJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NVixNQVhfTVYsTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PHVibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTVYsIE1BWF9NViwgTkJfUE9JTlQpOworICBiZW5jaDxBY3Rpb25fYXR2X3Byb2R1Y3Q8dWJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NViwgTUFYX01WLCBOQl9QT0lOVCk7CiAKLSAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0vLyAgIGJlbmNoPEFjdGlvbl9hdGFfcHJvZHVjdDx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7Ci0vLyAgIGJlbmNoPEFjdGlvbl9hYXRfcHJvZHVjdDx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8dWJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSwgTUFYX01NLCBOQl9QT0lOVCk7CisgIC8vICAgYmVuY2g8QWN0aW9uX2F0YV9wcm9kdWN0PHVibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKKyAgLy8gICBiZW5jaDxBY3Rpb25fYWF0X3Byb2R1Y3Q8dWJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOwogCi0gIGJlbmNoPEFjdGlvbl90cmlzb2x2ZTx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CisgIGJlbmNoPEFjdGlvbl90cmlzb2x2ZTx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLCBNQVhfTU0sIE5CX1BPSU5UKTsKIAogICByZXR1cm4gMDsKIH0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC9idGwvbGlicy91Ymxhcy91Ymxhc19pbnRlcmZhY2UuaGggYi9iZW5jaC9idGwvbGlicy91Ymxhcy91Ymxhc19pbnRlcmZhY2UuaGgKaW5kZXggZjU5YjdjZi4uM2I3MTA1YyAxMDA2NDQKLS0tIGEvYmVuY2gvYnRsL2xpYnMvdWJsYXMvdWJsYXNfaW50ZXJmYWNlLmhoCisrKyBiL2JlbmNoL2J0bC9saWJzL3VibGFzL3VibGFzX2ludGVyZmFjZS5oaApAQCAtMjgsMTE0ICsyOCw5OCBAQAogdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpudW1lcmljOwogCiB0ZW1wbGF0ZSA8Y2xhc3MgcmVhbD4KLWNsYXNzIHVibGFzX2ludGVyZmFjZXsKLQotcHVibGljIDoKLQotICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlIDsKK2NsYXNzIHVibGFzX2ludGVyZmFjZSB7CisgcHVibGljOgorICB0eXBlZGVmIHJlYWwgcmVhbF90eXBlOwogCiAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gc3RsX3ZlY3RvcjsKICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGxfdmVjdG9yPiBzdGxfbWF0cml4OwogCi0gIHR5cGVkZWYgdHlwZW5hbWUgYm9vc3Q6Om51bWVyaWM6OnVibGFzOjptYXRyaXg8cmVhbCxib29zdDo6bnVtZXJpYzo6dWJsYXM6OmNvbHVtbl9tYWpvcj4gZ2VuZV9tYXRyaXg7CisgIHR5cGVkZWYgdHlwZW5hbWUgYm9vc3Q6Om51bWVyaWM6OnVibGFzOjptYXRyaXg8cmVhbCwgYm9vc3Q6Om51bWVyaWM6OnVibGFzOjpjb2x1bW5fbWFqb3I+IGdlbmVfbWF0cml4OwogICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpudW1lcmljOjp1Ymxhczo6dmVjdG9yPHJlYWw+IGdlbmVfdmVjdG9yOwogCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApIHsgcmV0dXJuICJ1YmxhcyI7IH0KKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKHZvaWQpIHsgcmV0dXJuICJ1YmxhcyI7IH0KIAotICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCAmIEEsIGludCBOKSB7fQorICBzdGF0aWMgdm9pZCBmcmVlX21hdHJpeChnZW5lX21hdHJpeCYgQSwgaW50IE4pIHt9CiAKLSAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3IgJiBCKSB7fQorICBzdGF0aWMgdm9pZCBmcmVlX3ZlY3RvcihnZW5lX3ZlY3RvciYgQikge30KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKLSAgICBBLnJlc2l6ZShBX3N0bC5zaXplKCksQV9zdGxbMF0uc2l6ZSgpKTsKLSAgICBmb3IgKGludCBqPTA7IGo8QV9zdGwuc2l6ZSgpIDsgaisrKQotICAgICAgZm9yIChpbnQgaT0wOyBpPEFfc3RsW2pdLnNpemUoKSA7IGkrKykKLSAgICAgICAgQShpLGopPUFfc3RsW2pdW2ldOworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgeworICAgIEEucmVzaXplKEFfc3RsLnNpemUoKSwgQV9zdGxbMF0uc2l6ZSgpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IEFfc3RsLnNpemUoKTsgaisrKQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBX3N0bFtqXS5zaXplKCk7IGkrKykgQShpLCBqKSA9IEFfc3RsW2pdW2ldOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3ImIEIsIHN0bF92ZWN0b3ImIEJfc3RsKSB7CiAgICAgQi5yZXNpemUoQl9zdGwuc2l6ZSgpKTsKLSAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKQotICAgICAgQihpKT1CX3N0bFtpXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJfc3RsLnNpemUoKTsgaSsrKSBCKGkpID0gQl9zdGxbaV07CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7Ci0gICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKykKLSAgICAgIEJfc3RsW2ldPUIoaSk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yJiBCLCBzdGxfdmVjdG9yJiBCX3N0bCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQl9zdGwuc2l6ZSgpOyBpKyspIEJfc3RsW2ldID0gQihpKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKLSAgICBpbnQgTj1BX3N0bC5zaXplKCk7Ci0gICAgZm9yIChpbnQgaj0wO2o8TjtqKyspCi0gICAgeworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCYgQSwgc3RsX21hdHJpeCYgQV9zdGwpIHsKKyAgICBpbnQgTiA9IEFfc3RsLnNpemUoKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgewogICAgICAgQV9zdGxbal0ucmVzaXplKE4pOwotICAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspCi0gICAgICAgIEFfc3RsW2pdW2ldPUEoaSxqKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSBBX3N0bFtqXVtpXSA9IEEoaSwgaik7CiAgICAgfQogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdmVjdG9yKGNvbnN0IGdlbmVfdmVjdG9yICYgc291cmNlLCBnZW5lX3ZlY3RvciAmIGNpYmxlLCBpbnQgTil7Ci0gICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3ImIHNvdXJjZSwgZ2VuZV92ZWN0b3ImIGNpYmxlLCBpbnQgTikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICBjaWJsZShpKSA9IHNvdXJjZShpKTsKICAgICB9CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXggJiBzb3VyY2UsIGdlbmVfbWF0cml4ICYgY2libGUsIGludCBOKXsKLSAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7Ci0gICAgICBmb3IgKGludCBqPTA7ajxOO2orKyl7Ci0gICAgICAgIGNpYmxlKGksaikgPSBzb3VyY2UoaSxqKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4JiBzb3VyY2UsIGdlbmVfbWF0cml4JiBjaWJsZSwgaW50IE4pIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKKyAgICAgICAgY2libGUoaSwgaikgPSBzb3VyY2UoaSwgaik7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbG93KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKLSAgICBYID0gIHByb2QoQSxCKTsKKyAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF92ZWN0b3JfcHJvZHVjdF9zbG93KGdlbmVfbWF0cml4JiBBLCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3ImIFgsIGludCBOKSB7CisgICAgWCA9IHByb2QoQSwgQik7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0X3Nsb3coZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pewotICAgIFggPSAgcHJvZChBLEIpOworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0X3Nsb3coZ2VuZV9tYXRyaXgmIEEsIGdlbmVfbWF0cml4JiBCLCBnZW5lX21hdHJpeCYgWCwgaW50IE4pIHsKKyAgICBYID0gcHJvZChBLCBCKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5X3Nsb3coY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4pewotICAgIFkrPWNvZWYqWDsKLSAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweV9zbG93KGNvbnN0IHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3ImIFgsIGdlbmVfdmVjdG9yJiBZLCBpbnQgTikgeyBZICs9IGNvZWYgKiBYOyB9CiAKICAgLy8gYWxpYXMgZnJlZSBhc3NpZ25tZW50cwogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX3ZlY3RvciAmIEIsIGdlbmVfdmVjdG9yICYgWCwgaW50IE4pewotICAgIFguYXNzaWduKHByb2QoQSxCKSk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3QoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciYgWCwgaW50IE4pIHsKKyAgICBYLmFzc2lnbihwcm9kKEEsIEIpKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTil7Ci0gICAgWC5hc3NpZ24ocHJvZCh0cmFucyhBKSxCKSk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHZfcHJvZHVjdChnZW5lX21hdHJpeCYgQSwgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgeyBYLmFzc2lnbihwcm9kKHRyYW5zKEEpLCBCKSk7IH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGdlbmVfbWF0cml4JiBBLCBnZW5lX21hdHJpeCYgQiwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKSB7CisgICAgWC5hc3NpZ24ocHJvZChBLCBCKSk7CiAgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X21hdHJpeF9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBCLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKLSAgICBYLmFzc2lnbihwcm9kKEEsQikpOwotICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KGNvbnN0IHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3ImIFgsIGdlbmVfdmVjdG9yJiBZLCBpbnQgTikgeyBZLnBsdXNfYXNzaWduKGNvZWYgKiBYKTsgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5KGNvbnN0IHJlYWwgY29lZiwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCBnZW5lX3ZlY3RvciAmIFksIGludCBOKXsKLSAgICBZLnBsdXNfYXNzaWduKGNvZWYqWCk7Ci0gIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KHJlYWwgYSwgY29uc3QgZ2VuZV92ZWN0b3ImIFgsIHJlYWwgYiwgZ2VuZV92ZWN0b3ImIFksIGludCBOKSB7IFkgPSBhICogWCArIGIgKiBZOyB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF4cGJ5KHJlYWwgYSwgY29uc3QgZ2VuZV92ZWN0b3IgJiBYLCByZWFsIGIsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4pewotICAgIFkgPSBhKlggKyBiKlk7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIHZvaWQgYXRhX3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIFgsIGludCBOKXsKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGdlbmVfbWF0cml4JiBBLCBnZW5lX21hdHJpeCYgWCwgaW50IE4pIHsKICAgICAvLyBYID0gIHByb2QodHJhbnMoQSksQSk7Ci0gICAgWC5hc3NpZ24ocHJvZCh0cmFucyhBKSxBKSk7CisgICAgWC5hc3NpZ24ocHJvZCh0cmFucyhBKSwgQSkpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGFhdF9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTil7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBhYXRfcHJvZHVjdChnZW5lX21hdHJpeCYgQSwgZ2VuZV9tYXRyaXgmIFgsIGludCBOKSB7CiAgICAgLy8gWCA9ICBwcm9kKEEsdHJhbnMoQSkpOwotICAgIFguYXNzaWduKHByb2QoQSx0cmFucyhBKSkpOworICAgIFguYXNzaWduKHByb2QoQSwgdHJhbnMoQSkpKTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCAmIEwsIGNvbnN0IGdlbmVfdmVjdG9yJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKXsKLSAgICBYID0gc29sdmUoTCwgQiwgdWJsYXM6Omxvd2VyX3RhZyAoKSk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmlzb2x2ZV9sb3dlcihjb25zdCBnZW5lX21hdHJpeCYgTCwgY29uc3QgZ2VuZV92ZWN0b3ImIEIsIGdlbmVfdmVjdG9yJiBYLCBpbnQgTikgeworICAgIFggPSBzb2x2ZShMLCBCLCB1Ymxhczo6bG93ZXJfdGFnKCkpOwogICB9Ci0KIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYmVuY2gvY2hlY2tfY2FjaGVfcXVlcmllcy5jcHAgYi9iZW5jaC9jaGVja19jYWNoZV9xdWVyaWVzLmNwcAppbmRleCAwMjlkNDRjLi5lYWIxYzdhIDEwMDY0NAotLS0gYS9iZW5jaC9jaGVja19jYWNoZV9xdWVyaWVzLmNwcAorKysgYi9iZW5jaC9jaGVja19jYWNoZV9xdWVyaWVzLmNwcApAQCAtNiwzMSArNiwzMCBAQAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotI2RlZmluZSBEVU1QX0NQVUlEKENPREUpIHtcCi0gIGludCBhYmNkWzRdOyBcCi0gIGFiY2RbMF0gPSBhYmNkWzFdID0gYWJjZFsyXSA9IGFiY2RbM10gPSAwO1wKLSAgRUlHRU5fQ1BVSUQoYWJjZCwgQ09ERSwgMCk7IFwKLSAgc3RkOjpjb3V0IDw8ICJUaGUgY29kZSAiIDw8IENPREUgPDwgIiBnaXZlcyAiIFwKLSAgICAgICAgICAgICAgPDwgKGludCopKGFiY2RbMF0pIDw8ICIgIiA8PCAoaW50KikoYWJjZFsxXSkgPDwgIiAiIFwKLSAgICAgICAgICAgICAgPDwgKGludCopKGFiY2RbMl0pIDw8ICIgIiA8PCAoaW50KikoYWJjZFszXSkgPDwgIiAiIDw8IHN0ZDo6ZW5kbDsgXAorI2RlZmluZSBEVU1QX0NQVUlEKENPREUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBhYmNkWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFiY2RbMF0gPSBhYmNkWzFdID0gYWJjZFsyXSA9IGFiY2RbM10gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVJR0VOX0NQVUlEKGFiY2QsIENPREUsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZDo6Y291dCA8PCAiVGhlIGNvZGUgIiA8PCBDT0RFIDw8ICIgZ2l2ZXMgIiA8PCAoaW50KikoYWJjZFswXSkgPDwgIiAiIDw8IChpbnQqKShhYmNkWzFdKSA8PCAiICIgXAorICAgICAgICAgICAgICA8PCAoaW50KikoYWJjZFsyXSkgPDwgIiAiIDw8IChpbnQqKShhYmNkWzNdKSA8PCAiICIgPDwgc3RkOjplbmRsOyAgICAgICAgICAgICAgICAgICAgICAgXAogICB9Ci0gIAotaW50IG1haW4oKQoteworCitpbnQgbWFpbigpIHsKICAgY291dCA8PCAiRWlnZW4ncyBMMSAgICA9ICIgPDwgaW50ZXJuYWw6OnF1ZXJ5TDFDYWNoZVNpemUoKSA8PCBlbmRsOwogICBjb3V0IDw8ICJFaWdlbidzIEwyL0wzID0gIiA8PCBpbnRlcm5hbDo6cXVlcnlUb3BMZXZlbENhY2hlU2l6ZSgpIDw8IGVuZGw7CiAgIGludCBsMSwgbDIsIGwzOwogICBpbnRlcm5hbDo6cXVlcnlDYWNoZVNpemVzKGwxLCBsMiwgbDMpOwogICBjb3V0IDw8ICJFaWdlbidzIEwxLCBMMiwgTDMgICAgICAgPSAiIDw8IGwxIDw8ICIgIiA8PCBsMiA8PCAiICIgPDwgbDMgPDwgZW5kbDsKLSAgCi0gICNpZmRlZiBFSUdFTl9DUFVJRAorCisjaWZkZWYgRUlHRU5fQ1BVSUQKIAogICBpbnQgYWJjZFs0XTsKICAgaW50IHN0cmluZ1s4XTsKICAgY2hhciogc3RyaW5nX2NoYXIgPSAoY2hhciopKHN0cmluZyk7CiAKICAgLy8gdmVuZG9yIElECi0gIEVJR0VOX0NQVUlEKGFiY2QsMHgwLDApOworICBFSUdFTl9DUFVJRChhYmNkLCAweDAsIDApOwogICBzdHJpbmdbMF0gPSBhYmNkWzFdOwogICBzdHJpbmdbMV0gPSBhYmNkWzNdOwogICBzdHJpbmdbMl0gPSBhYmNkWzJdOwpAQCAtNDIsMzIgKzQxLDMwIEBACiAKICAgaW50ZXJuYWw6OnF1ZXJ5Q2FjaGVTaXplc19pbnRlbF9jb2RlcyhsMSwgbDIsIGwzKTsKICAgY291dCA8PCAiRWlnZW4ncyBpbnRlbCBjb2RlcyBMMSwgTDIsIEwzID0gIiA8PCBsMSA8PCAiICIgPDwgbDIgPDwgIiAiIDw8IGwzIDw8IGVuZGw7Ci0gIGlmKG1heF9mdW5jcz49NCkKLSAgeworICBpZiAobWF4X2Z1bmNzID49IDQpIHsKICAgICBpbnRlcm5hbDo6cXVlcnlDYWNoZVNpemVzX2ludGVsX2RpcmVjdChsMSwgbDIsIGwzKTsKICAgICBjb3V0IDw8ICJFaWdlbidzIGludGVsIGRpcmVjdCBMMSwgTDIsIEwzID0gIiA8PCBsMSA8PCAiICIgPDwgbDIgPDwgIiAiIDw8IGwzIDw8IGVuZGw7CiAgIH0KICAgaW50ZXJuYWw6OnF1ZXJ5Q2FjaGVTaXplc19hbWQobDEsIGwyLCBsMyk7CiAgIGNvdXQgPDwgIkVpZ2VuJ3MgYW1kIEwxLCBMMiwgTDMgICAgICAgICA9ICIgPDwgbDEgPDwgIiAiIDw8IGwyIDw8ICIgIiA8PCBsMyA8PCBlbmRsOwogICBjb3V0IDw8IGVuZGw7Ci0gIAorCiAgIC8vIGR1bXAgSW50ZWwgZGlyZWN0IG1ldGhvZAotICBpZihtYXhfZnVuY3M+PTQpCi0gIHsKKyAgaWYgKG1heF9mdW5jcyA+PSA0KSB7CiAgICAgbDEgPSBsMiA9IGwzID0gMDsKICAgICBpbnQgY2FjaGVfaWQgPSAwOwogICAgIGludCBjYWNoZV90eXBlID0gMDsKICAgICBkbyB7CiAgICAgICBhYmNkWzBdID0gYWJjZFsxXSA9IGFiY2RbMl0gPSBhYmNkWzNdID0gMDsKLSAgICAgIEVJR0VOX0NQVUlEKGFiY2QsMHg0LGNhY2hlX2lkKTsKLSAgICAgIGNhY2hlX3R5cGUgID0gKGFiY2RbMF0gJiAweDBGKSA+PiAwOwotICAgICAgaW50IGNhY2hlX2xldmVsID0gKGFiY2RbMF0gJiAweEUwKSA+PiA1OyAgLy8gQVs3OjVdCi0gICAgICBpbnQgd2F5cyAgICAgICAgPSAoYWJjZFsxXSAmIDB4RkZDMDAwMDApID4+IDIyOyAvLyBCWzMxOjIyXQotICAgICAgaW50IHBhcnRpdGlvbnMgID0gKGFiY2RbMV0gJiAweDAwM0ZGMDAwKSA+PiAxMjsgLy8gQlsyMToxMl0KLSAgICAgIGludCBsaW5lX3NpemUgICA9IChhYmNkWzFdICYgMHgwMDAwMEZGRikgPj4gIDA7IC8vIEJbMTE6MF0KLSAgICAgIGludCBzZXRzICAgICAgICA9IChhYmNkWzJdKTsgICAgICAgICAgICAgICAgICAgIC8vIENbMzE6MF0KLSAgICAgIGludCBjYWNoZV9zaXplID0gKHdheXMrMSkgKiAocGFydGl0aW9ucysxKSAqIChsaW5lX3NpemUrMSkgKiAoc2V0cysxKTsKLSAgICAgIAorICAgICAgRUlHRU5fQ1BVSUQoYWJjZCwgMHg0LCBjYWNoZV9pZCk7CisgICAgICBjYWNoZV90eXBlID0gKGFiY2RbMF0gJiAweDBGKSA+PiAwOworICAgICAgaW50IGNhY2hlX2xldmVsID0gKGFiY2RbMF0gJiAweEUwKSA+PiA1OyAgICAgICAgLy8gQVs3OjVdCisgICAgICBpbnQgd2F5cyA9IChhYmNkWzFdICYgMHhGRkMwMDAwMCkgPj4gMjI7ICAgICAgICAvLyBCWzMxOjIyXQorICAgICAgaW50IHBhcnRpdGlvbnMgPSAoYWJjZFsxXSAmIDB4MDAzRkYwMDApID4+IDEyOyAgLy8gQlsyMToxMl0KKyAgICAgIGludCBsaW5lX3NpemUgPSAoYWJjZFsxXSAmIDB4MDAwMDBGRkYpID4+IDA7ICAgIC8vIEJbMTE6MF0KKyAgICAgIGludCBzZXRzID0gKGFiY2RbMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENbMzE6MF0KKyAgICAgIGludCBjYWNoZV9zaXplID0gKHdheXMgKyAxKSAqIChwYXJ0aXRpb25zICsgMSkgKiAobGluZV9zaXplICsgMSkgKiAoc2V0cyArIDEpOworCiAgICAgICBjb3V0IDw8ICJjYWNoZVsiIDw8IGNhY2hlX2lkIDw8ICJdLnR5cGUgICAgICAgPSAiIDw8IGNhY2hlX3R5cGUgPDwgIlxuIjsKICAgICAgIGNvdXQgPDwgImNhY2hlWyIgPDwgY2FjaGVfaWQgPDwgIl0ubGV2ZWwgICAgICA9ICIgPDwgY2FjaGVfbGV2ZWwgPDwgIlxuIjsKICAgICAgIGNvdXQgPDwgImNhY2hlWyIgPDwgY2FjaGVfaWQgPDwgIl0ud2F5cyAgICAgICA9ICIgPDwgd2F5cyA8PCAiXG4iOwpAQCAtNzUsMTUgKzcyLDE0IEBACiAgICAgICBjb3V0IDw8ICJjYWNoZVsiIDw8IGNhY2hlX2lkIDw8ICJdLmxpbmVfc2l6ZSAgPSAiIDw8IGxpbmVfc2l6ZSA8PCAiXG4iOwogICAgICAgY291dCA8PCAiY2FjaGVbIiA8PCBjYWNoZV9pZCA8PCAiXS5zZXRzICAgICAgID0gIiA8PCBzZXRzIDw8ICJcbiI7CiAgICAgICBjb3V0IDw8ICJjYWNoZVsiIDw8IGNhY2hlX2lkIDw8ICJdLnNpemUgICAgICAgPSAiIDw8IGNhY2hlX3NpemUgPDwgIlxuIjsKLSAgICAgIAorCiAgICAgICBjYWNoZV9pZCsrOwotICAgIH0gd2hpbGUoY2FjaGVfdHlwZT4wICYmIGNhY2hlX2lkPDE2KTsKKyAgICB9IHdoaWxlIChjYWNoZV90eXBlID4gMCAmJiBjYWNoZV9pZCA8IDE2KTsKICAgfQotICAKKwogICAvLyBkdW1wIGV2ZXJ5dGhpbmcKLSAgc3RkOjpjb3V0IDw8IGVuZGwgPDwiUmF3IGR1bXA6IiA8PCBlbmRsOwotICBmb3IoaW50IGk9MDsgaTxtYXhfZnVuY3M7ICsraSkKLSAgICBEVU1QX0NQVUlEKGkpOworICBzdGQ6OmNvdXQgPDwgZW5kbCA8PCAiUmF3IGR1bXA6IiA8PCBlbmRsOworICBmb3IgKGludCBpID0gMDsgaSA8IG1heF9mdW5jczsgKytpKSBEVU1QX0NQVUlEKGkpOwogCiAgIERVTVBfQ1BVSUQoMHg4MDAwMDAwMCk7CiAgIERVTVBfQ1BVSUQoMHg4MDAwMDAwMSk7CkBAIC05NCw4ICs5MCw4IEBACiAgIERVTVBfQ1BVSUQoMHg4MDAwMDAwNik7CiAgIERVTVBfQ1BVSUQoMHg4MDAwMDAwNyk7CiAgIERVTVBfQ1BVSUQoMHg4MDAwMDAwOCk7Ci0gICNlbHNlCisjZWxzZQogICBjb3V0IDw8ICJFSUdFTl9DUFVJRCBpcyBub3QgZGVmaW5lZCIgPDwgZW5kbDsKLSAgI2VuZGlmCisjZW5kaWYKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9iZW5jaC9kZW5zZV9zb2x2ZXJzLmNwcCBiL2JlbmNoL2RlbnNlX3NvbHZlcnMuY3BwCmluZGV4IDExYzc1NWIuLmVmOWVjYjcgMTAwNjQ0Ci0tLSBhL2JlbmNoL2RlbnNlX3NvbHZlcnMuY3BwCisrKyBiL2JlbmNoL2RlbnNlX3NvbHZlcnMuY3BwCkBAIC03LDY4ICs3LDYyIEBACiAjaW5jbHVkZSA8c3N0cmVhbT4KIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotc3RkOjptYXA8c3RkOjpzdHJpbmcsQXJyYXk8ZmxvYXQsMSw4LERvbnRBbGlnbnxSb3dNYWpvcj4gPiByZXN1bHRzOworc3RkOjptYXA8c3RkOjpzdHJpbmcsIEFycmF5PGZsb2F0LCAxLCA4LCBEb250QWxpZ24gfCBSb3dNYWpvcj4gPiByZXN1bHRzOwogc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxhYmVsczsKIHN0ZDo6dmVjdG9yPEFycmF5Mmk+IHNpemVzOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsdHlwZW5hbWUgTWF0cml4VHlwZT4KLUVJR0VOX0RPTlRfSU5MSU5FCi12b2lkIGNvbXB1dGVfbm9ybV9lcXVhdGlvbihTb2x2ZXIgJnNvbHZlciwgY29uc3QgTWF0cml4VHlwZSAmQSkgewotICBpZihBLnJvd3MoKSE9QS5jb2xzKCkpCi0gICAgc29sdmVyLmNvbXB1dGUoQS50cmFuc3Bvc2UoKSpBKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIE1hdHJpeFR5cGU+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGNvbXB1dGVfbm9ybV9lcXVhdGlvbihTb2x2ZXIgJnNvbHZlciwgY29uc3QgTWF0cml4VHlwZSAmQSkgeworICBpZiAoQS5yb3dzKCkgIT0gQS5jb2xzKCkpCisgICAgc29sdmVyLmNvbXB1dGUoQS50cmFuc3Bvc2UoKSAqIEEpOwogICBlbHNlCiAgICAgc29sdmVyLmNvbXB1dGUoQSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNvbHZlcix0eXBlbmFtZSBNYXRyaXhUeXBlPgotRUlHRU5fRE9OVF9JTkxJTkUKLXZvaWQgY29tcHV0ZShTb2x2ZXIgJnNvbHZlciwgY29uc3QgTWF0cml4VHlwZSAmQSkgewordGVtcGxhdGUgPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgTWF0cml4VHlwZT4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY29tcHV0ZShTb2x2ZXIgJnNvbHZlciwgY29uc3QgTWF0cml4VHlwZSAmQSkgewogICBzb2x2ZXIuY29tcHV0ZShBKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGludCBTaXplPgotdm9pZCBiZW5jaChpbnQgaWQsIGludCByb3dzLCBpbnQgc2l6ZSA9IFNpemUpCi17Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLFNpemU+IE1hdDsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gTWF0RHluOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsU2l6ZSxTaXplPiBNYXRTcXVhcmU7Ci0gIE1hdCBBKHJvd3Msc2l6ZSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgU2l6ZT4KK3ZvaWQgYmVuY2goaW50IGlkLCBpbnQgcm93cywgaW50IHNpemUgPSBTaXplKSB7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgU2l6ZT4gTWF0OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IE1hdER5bjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBTaXplLCBTaXplPiBNYXRTcXVhcmU7CisgIE1hdCBBKHJvd3MsIHNpemUpOwogICBBLnNldFJhbmRvbSgpOwotICBpZihyb3dzPT1zaXplKQotICAgIEEgPSBBKkEuYWRqb2ludCgpOworICBpZiAocm93cyA9PSBzaXplKSBBID0gQSAqIEEuYWRqb2ludCgpOwogICBCZW5jaFRpbWVyIHRfbGx0LCB0X2xkbHQsIHRfbHUsIHRfZnBsdSwgdF9xciwgdF9jcHFyLCB0X2NvZCwgdF9mcHFyLCB0X2pzdmQsIHRfYmRjc3ZkOwogCiAgIGludCB0cmllcyA9IDU7Ci0gIGludCByZXAgPSAxMDAwL3NpemU7Ci0gIGlmKHJlcD09MCkgcmVwID0gMTsKLS8vICAgcmVwID0gcmVwKnJlcDsKLSAgCisgIGludCByZXAgPSAxMDAwIC8gc2l6ZTsKKyAgaWYgKHJlcCA9PSAwKSByZXAgPSAxOworICAvLyAgIHJlcCA9IHJlcCpyZXA7CisKICAgTExUPE1hdFNxdWFyZT4gbGx0KHNpemUpOwogICBMRExUPE1hdFNxdWFyZT4gbGRsdChzaXplKTsKICAgUGFydGlhbFBpdkxVPE1hdFNxdWFyZT4gbHUoc2l6ZSk7Ci0gIEZ1bGxQaXZMVTxNYXRTcXVhcmU+IGZwbHUoc2l6ZSxzaXplKTsKLSAgSG91c2Vob2xkZXJRUjxNYXQ+IHFyKEEucm93cygpLEEuY29scygpKTsKLSAgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXQ+IGNwcXIoQS5yb3dzKCksQS5jb2xzKCkpOwotICBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPE1hdD4gY29kKEEucm93cygpLEEuY29scygpKTsKLSAgRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0PiBmcHFyKEEucm93cygpLEEuY29scygpKTsKLSAgSmFjb2JpU1ZEPE1hdER5biwgQ29tcHV0ZVRoaW5VfENvbXB1dGVUaGluVj4ganN2ZChBLnJvd3MoKSxBLmNvbHMoKSk7Ci0gIEJEQ1NWRDxNYXREeW4sIENvbXB1dGVUaGluVXxDb21wdXRlVGhpblY+IGJkY3N2ZChBLnJvd3MoKSxBLmNvbHMoKSk7Ci0gIAotICBCRU5DSCh0X2xsdCwgdHJpZXMsIHJlcCwgY29tcHV0ZV9ub3JtX2VxdWF0aW9uKGxsdCxBKSk7Ci0gIEJFTkNIKHRfbGRsdCwgdHJpZXMsIHJlcCwgY29tcHV0ZV9ub3JtX2VxdWF0aW9uKGxkbHQsQSkpOwotICBCRU5DSCh0X2x1LCB0cmllcywgcmVwLCBjb21wdXRlX25vcm1fZXF1YXRpb24obHUsQSkpOwotICBpZihzaXplPD0xMDAwKQotICAgIEJFTkNIKHRfZnBsdSwgdHJpZXMsIHJlcCwgY29tcHV0ZV9ub3JtX2VxdWF0aW9uKGZwbHUsQSkpOwotICBCRU5DSCh0X3FyLCB0cmllcywgcmVwLCBjb21wdXRlKHFyLEEpKTsKLSAgQkVOQ0godF9jcHFyLCB0cmllcywgcmVwLCBjb21wdXRlKGNwcXIsQSkpOwotICBCRU5DSCh0X2NvZCwgdHJpZXMsIHJlcCwgY29tcHV0ZShjb2QsQSkpOwotICBpZihzaXplKnJvd3M8PTEwMDAwMDAwKQotICAgIEJFTkNIKHRfZnBxciwgdHJpZXMsIHJlcCwgY29tcHV0ZShmcHFyLEEpKTsKLSAgaWYoc2l6ZTw1MDApIC8vIEphY29iaVNWRCBpcyByZWFsbHkgdG9vIHNsb3cgZm9yIHRvbyBsYXJnZSBtYXRyaWNlcworICBGdWxsUGl2TFU8TWF0U3F1YXJlPiBmcGx1KHNpemUsIHNpemUpOworICBIb3VzZWhvbGRlclFSPE1hdD4gcXIoQS5yb3dzKCksIEEuY29scygpKTsKKyAgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXQ+IGNwcXIoQS5yb3dzKCksIEEuY29scygpKTsKKyAgQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbjxNYXQ+IGNvZChBLnJvd3MoKSwgQS5jb2xzKCkpOworICBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXQ+IGZwcXIoQS5yb3dzKCksIEEuY29scygpKTsKKyAgSmFjb2JpU1ZEPE1hdER5biwgQ29tcHV0ZVRoaW5VIHwgQ29tcHV0ZVRoaW5WPiBqc3ZkKEEucm93cygpLCBBLmNvbHMoKSk7CisgIEJEQ1NWRDxNYXREeW4sIENvbXB1dGVUaGluVSB8IENvbXB1dGVUaGluVj4gYmRjc3ZkKEEucm93cygpLCBBLmNvbHMoKSk7CisKKyAgQkVOQ0godF9sbHQsIHRyaWVzLCByZXAsIGNvbXB1dGVfbm9ybV9lcXVhdGlvbihsbHQsIEEpKTsKKyAgQkVOQ0godF9sZGx0LCB0cmllcywgcmVwLCBjb21wdXRlX25vcm1fZXF1YXRpb24obGRsdCwgQSkpOworICBCRU5DSCh0X2x1LCB0cmllcywgcmVwLCBjb21wdXRlX25vcm1fZXF1YXRpb24obHUsIEEpKTsKKyAgaWYgKHNpemUgPD0gMTAwMCkgQkVOQ0godF9mcGx1LCB0cmllcywgcmVwLCBjb21wdXRlX25vcm1fZXF1YXRpb24oZnBsdSwgQSkpOworICBCRU5DSCh0X3FyLCB0cmllcywgcmVwLCBjb21wdXRlKHFyLCBBKSk7CisgIEJFTkNIKHRfY3BxciwgdHJpZXMsIHJlcCwgY29tcHV0ZShjcHFyLCBBKSk7CisgIEJFTkNIKHRfY29kLCB0cmllcywgcmVwLCBjb21wdXRlKGNvZCwgQSkpOworICBpZiAoc2l6ZSAqIHJvd3MgPD0gMTAwMDAwMDApIEJFTkNIKHRfZnBxciwgdHJpZXMsIHJlcCwgY29tcHV0ZShmcHFyLCBBKSk7CisgIGlmIChzaXplIDwgNTAwKSAgLy8gSmFjb2JpU1ZEIGlzIHJlYWxseSB0b28gc2xvdyBmb3IgdG9vIGxhcmdlIG1hdHJpY2VzCiAgICAgQkVOQ0godF9qc3ZkLCB0cmllcywgcmVwLCBqc3ZkLmNvbXB1dGUoQSkpOwotLy8gICBpZihzaXplKnJvd3M8PTIwMDAwMDAwKQotICAgIEJFTkNIKHRfYmRjc3ZkLCB0cmllcywgcmVwLCBiZGNzdmQuY29tcHV0ZShBKSk7Ci0gIAorICAvLyAgIGlmKHNpemUqcm93czw9MjAwMDAwMDApCisgIEJFTkNIKHRfYmRjc3ZkLCB0cmllcywgcmVwLCBiZGNzdmQuY29tcHV0ZShBKSk7CisKICAgcmVzdWx0c1siTExUIl1baWRdID0gdF9sbHQuYmVzdCgpOwogICByZXN1bHRzWyJMRExUIl1baWRdID0gdF9sZGx0LmJlc3QoKTsKICAgcmVzdWx0c1siUGFydGlhbFBpdkxVIl1baWRdID0gdF9sdS5iZXN0KCk7CkBAIC04MSw5ICs3NSw3IEBACiAgIHJlc3VsdHNbIkJEQ1NWRCJdW2lkXSA9IHRfYmRjc3ZkLmJlc3QoKTsKIH0KIAotCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgbGFiZWxzLnB1c2hfYmFjaygiTExUIik7CiAgIGxhYmVscy5wdXNoX2JhY2soIkxETFQiKTsKICAgbGFiZWxzLnB1c2hfYmFjaygiUGFydGlhbFBpdkxVIik7CkBAIC05NSw0OCArODcsNDggQEAKICAgbGFiZWxzLnB1c2hfYmFjaygiSmFjb2JpU1ZEIik7CiAgIGxhYmVscy5wdXNoX2JhY2soIkJEQ1NWRCIpOwogCi0gIGZvcihpbnQgaT0wOyBpPGxhYmVscy5zaXplKCk7ICsraSkKLSAgICByZXN1bHRzW2xhYmVsc1tpXV0uZmlsbCgtMSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLnNpemUoKTsgKytpKSByZXN1bHRzW2xhYmVsc1tpXV0uZmlsbCgtMSk7CiAKICAgY29uc3QgaW50IHNtYWxsID0gODsKLSAgc2l6ZXMucHVzaF9iYWNrKEFycmF5Mmkoc21hbGwsc21hbGwpKTsKLSAgc2l6ZXMucHVzaF9iYWNrKEFycmF5MmkoMTAwLDEwMCkpOwotICBzaXplcy5wdXNoX2JhY2soQXJyYXkyaSgxMDAwLDEwMDApKTsKLSAgc2l6ZXMucHVzaF9iYWNrKEFycmF5MmkoNDAwMCw0MDAwKSk7Ci0gIHNpemVzLnB1c2hfYmFjayhBcnJheTJpKDEwMDAwLHNtYWxsKSk7Ci0gIHNpemVzLnB1c2hfYmFjayhBcnJheTJpKDEwMDAwLDEwMCkpOwotICBzaXplcy5wdXNoX2JhY2soQXJyYXkyaSgxMDAwMCwxMDAwKSk7Ci0gIHNpemVzLnB1c2hfYmFjayhBcnJheTJpKDEwMDAwLDQwMDApKTsKKyAgc2l6ZXMucHVzaF9iYWNrKEFycmF5Mmkoc21hbGwsIHNtYWxsKSk7CisgIHNpemVzLnB1c2hfYmFjayhBcnJheTJpKDEwMCwgMTAwKSk7CisgIHNpemVzLnB1c2hfYmFjayhBcnJheTJpKDEwMDAsIDEwMDApKTsKKyAgc2l6ZXMucHVzaF9iYWNrKEFycmF5MmkoNDAwMCwgNDAwMCkpOworICBzaXplcy5wdXNoX2JhY2soQXJyYXkyaSgxMDAwMCwgc21hbGwpKTsKKyAgc2l6ZXMucHVzaF9iYWNrKEFycmF5MmkoMTAwMDAsIDEwMCkpOworICBzaXplcy5wdXNoX2JhY2soQXJyYXkyaSgxMDAwMCwgMTAwMCkpOworICBzaXplcy5wdXNoX2JhY2soQXJyYXkyaSgxMDAwMCwgNDAwMCkpOwogCiAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLSAgZm9yKGludCBrPTA7IGs8c2l6ZXMuc2l6ZSgpOyArK2spCi0gIHsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBzaXplcy5zaXplKCk7ICsraykgewogICAgIGNvdXQgPDwgc2l6ZXNba10oMCkgPDwgIngiIDw8IHNpemVzW2tdKDEpIDw8ICIuLi5cbiI7Ci0gICAgYmVuY2g8ZmxvYXQsRHluYW1pYz4oayxzaXplc1trXSgwKSxzaXplc1trXSgxKSk7CisgICAgYmVuY2g8ZmxvYXQsIER5bmFtaWM+KGssIHNpemVzW2tdKDApLCBzaXplc1trXSgxKSk7CiAgIH0KIAogICBjb3V0LndpZHRoKDMyKTsKICAgY291dCA8PCAic29sdmVyL3NpemUiOwogICBjb3V0IDw8ICIgICI7Ci0gIGZvcihpbnQgaz0wOyBrPHNpemVzLnNpemUoKTsgKytrKQotICB7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgc2l6ZXMuc2l6ZSgpOyArK2spIHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKICAgICBzcyA8PCBzaXplc1trXSgwKSA8PCAieCIgPDwgc2l6ZXNba10oMSk7Ci0gICAgY291dC53aWR0aCgxMCk7IGNvdXQgPDwgc3Muc3RyKCk7IGNvdXQgPDwgIiAiOworICAgIGNvdXQud2lkdGgoMTApOworICAgIGNvdXQgPDwgc3Muc3RyKCk7CisgICAgY291dCA8PCAiICI7CiAgIH0KICAgY291dCA8PCBlbmRsOwogCi0KLSAgZm9yKGludCBpPTA7IGk8bGFiZWxzLnNpemUoKTsgKytpKQotICB7Ci0gICAgY291dC53aWR0aCgzMik7IGNvdXQgPDwgbGFiZWxzW2ldOyBjb3V0IDw8ICIgICI7Ci0gICAgQXJyYXlYZiByID0gKHJlc3VsdHNbbGFiZWxzW2ldXSoxMDAwMDAuZikuZmxvb3IoKS8xMDAuZjsKLSAgICBmb3IoaW50IGs9MDsgazxzaXplcy5zaXplKCk7ICsraykKLSAgICB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLnNpemUoKTsgKytpKSB7CisgICAgY291dC53aWR0aCgzMik7CisgICAgY291dCA8PCBsYWJlbHNbaV07CisgICAgY291dCA8PCAiICAiOworICAgIEFycmF5WGYgciA9IChyZXN1bHRzW2xhYmVsc1tpXV0gKiAxMDAwMDAuZikuZmxvb3IoKSAvIDEwMC5mOworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc2l6ZXMuc2l6ZSgpOyArK2spIHsKICAgICAgIGNvdXQud2lkdGgoMTApOwotICAgICAgaWYocihrKT49MWU2KSAgY291dCA8PCAiLSI7Ci0gICAgICBlbHNlICAgICAgICAgICBjb3V0IDw8IHIoayk7CisgICAgICBpZiAocihrKSA+PSAxZTYpCisgICAgICAgIGNvdXQgPDwgIi0iOworICAgICAgZWxzZQorICAgICAgICBjb3V0IDw8IHIoayk7CiAgICAgICBjb3V0IDw8ICIgIjsKICAgICB9CiAgICAgY291dCA8PCBlbmRsOwpAQCAtMTQ1LDI1ICsxMzcsMjAgQEAKICAgLy8gSFRNTCBvdXRwdXQKICAgY291dCA8PCAiPHRhYmxlIGNsYXNzPVwibWFudWFsXCI+IiA8PCBlbmRsOwogICBjb3V0IDw8ICI8dHI+PHRoPnNvbHZlci9zaXplPC90aD4iIDw8IGVuZGw7Ci0gIGZvcihpbnQgaz0wOyBrPHNpemVzLnNpemUoKTsgKytrKQotICAgIGNvdXQgPDwgIiAgPHRoPiIgPDwgc2l6ZXNba10oMCkgPDwgIngiIDw8IHNpemVzW2tdKDEpIDw8ICI8L3RoPiI7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgc2l6ZXMuc2l6ZSgpOyArK2spIGNvdXQgPDwgIiAgPHRoPiIgPDwgc2l6ZXNba10oMCkgPDwgIngiIDw8IHNpemVzW2tdKDEpIDw8ICI8L3RoPiI7CiAgIGNvdXQgPDwgIjwvdHI+IiA8PCBlbmRsOwotICBmb3IoaW50IGk9MDsgaTxsYWJlbHMuc2l6ZSgpOyArK2kpCi0gIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMuc2l6ZSgpOyArK2kpIHsKICAgICBjb3V0IDw8ICI8dHIiOwotICAgIGlmKGklMj09MSkgY291dCA8PCAiIGNsYXNzPVwiYWx0XCIiOworICAgIGlmIChpICUgMiA9PSAxKSBjb3V0IDw8ICIgY2xhc3M9XCJhbHRcIiI7CiAgICAgY291dCA8PCAiPjx0ZD4iIDw8IGxhYmVsc1tpXSA8PCAiPC90ZD4iOwotICAgIEFycmF5WGYgciA9IChyZXN1bHRzW2xhYmVsc1tpXV0qMTAwMDAwLmYpLmZsb29yKCkvMTAwLmY7Ci0gICAgZm9yKGludCBrPTA7IGs8c2l6ZXMuc2l6ZSgpOyArK2spCi0gICAgewotICAgICAgaWYocihrKT49MWU2KSBjb3V0IDw8ICI8dGQ+LTwvdGQ+IjsKLSAgICAgIGVsc2UKLSAgICAgIHsKKyAgICBBcnJheVhmIHIgPSAocmVzdWx0c1tsYWJlbHNbaV1dICogMTAwMDAwLmYpLmZsb29yKCkgLyAxMDAuZjsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IHNpemVzLnNpemUoKTsgKytrKSB7CisgICAgICBpZiAocihrKSA+PSAxZTYpCisgICAgICAgIGNvdXQgPDwgIjx0ZD4tPC90ZD4iOworICAgICAgZWxzZSB7CiAgICAgICAgIGNvdXQgPDwgIjx0ZD4iIDw8IHIoayk7Ci0gICAgICAgIGlmKGk+MCkKLSAgICAgICAgICBjb3V0IDw8ICIgKHgiIDw8IG51bWV4dDo6cm91bmQoMTAuZipyZXN1bHRzW2xhYmVsc1tpXV0oaykvcmVzdWx0c1siTExUIl0oaykpLzEwLmYgPDwgIikiOwotICAgICAgICBpZihpPDQgJiYgc2l6ZXNba10oMCkhPXNpemVzW2tdKDEpKQotICAgICAgICAgIGNvdXQgPDwgIiA8c3VwPjxhIGhyZWY9XCIjbm90ZV9sc1wiPio8L2E+PC9zdXA+IjsKKyAgICAgICAgaWYgKGkgPiAwKSBjb3V0IDw8ICIgKHgiIDw8IG51bWV4dDo6cm91bmQoMTAuZiAqIHJlc3VsdHNbbGFiZWxzW2ldXShrKSAvIHJlc3VsdHNbIkxMVCJdKGspKSAvIDEwLmYgPDwgIikiOworICAgICAgICBpZiAoaSA8IDQgJiYgc2l6ZXNba10oMCkgIT0gc2l6ZXNba10oMSkpIGNvdXQgPDwgIiA8c3VwPjxhIGhyZWY9XCIjbm90ZV9sc1wiPio8L2E+PC9zdXA+IjsKICAgICAgICAgY291dCA8PCAiPC90ZD4iOwogICAgICAgfQogICAgIH0KQEAgLTE3MSwxNCArMTU4LDE1IEBACiAgIH0KICAgY291dCA8PCAiPC90YWJsZT4iIDw8IGVuZGw7CiAKLS8vICAgY291dCA8PCAiTExUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobXMpICAiIDw8IChyZXN1bHRzWyJMTFQiXSoxMDAwLikuZm9ybWF0KGZtdCkgPDwgIlxuIjsKLS8vICAgY291dCA8PCAiTERMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCUpICAiIDw8IChyZXN1bHRzWyJMRExUIl0vcmVzdWx0c1siTExUIl0pLmZvcm1hdChmbXQpIDw8ICJcbiI7Ci0vLyAgIGNvdXQgPDwgIlBhcnRpYWxQaXZMVSAgICAgICAgICAgICAgICAgICAgICglKSAgIiA8PCAocmVzdWx0c1siUGFydGlhbFBpdkxVIl0vcmVzdWx0c1siTExUIl0pLmZvcm1hdChmbXQpIDw8ICJcbiI7Ci0vLyAgIGNvdXQgPDwgIkZ1bGxQaXZMVSAgICAgICAgICAgICAgICAgICAgICAgICglKSAgIiA8PCAocmVzdWx0c1siRnVsbFBpdkxVIl0vcmVzdWx0c1siTExUIl0pLmZvcm1hdChmbXQpIDw8ICJcbiI7Ci0vLyAgIGNvdXQgPDwgIkhvdXNlaG9sZGVyUVIgICAgICAgICAgICAgICAgICAgICglKSAgIiA8PCAocmVzdWx0c1siSG91c2Vob2xkZXJRUiJdL3Jlc3VsdHNbIkxMVCJdKS5mb3JtYXQoZm10KSA8PCAiXG4iOwotLy8gICBjb3V0IDw8ICJDb2xQaXZIb3VzZWhvbGRlclFSICAgICAgICAgICAgICAoJSkgICIgPDwgKHJlc3VsdHNbIkNvbFBpdkhvdXNlaG9sZGVyUVIiXS9yZXN1bHRzWyJMTFQiXSkuZm9ybWF0KGZtdCkgPDwgIlxuIjsKLS8vICAgY291dCA8PCAiQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbiAgKCUpICAiIDw8IChyZXN1bHRzWyJDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uIl0vcmVzdWx0c1siTExUIl0pLmZvcm1hdChmbXQpIDw8ICJcbiI7Ci0vLyAgIGNvdXQgPDwgIkZ1bGxQaXZIb3VzZWhvbGRlclFSICAgICAgICAgICAgICglKSAgIiA8PCAocmVzdWx0c1siRnVsbFBpdkhvdXNlaG9sZGVyUVIiXS9yZXN1bHRzWyJMTFQiXSkuZm9ybWF0KGZtdCkgPDwgIlxuIjsKLS8vICAgY291dCA8PCAiSmFjb2JpU1ZEICAgICAgICAgICAgICAgICAgICAgICAgKCUpICAiIDw8IChyZXN1bHRzWyJKYWNvYmlTVkQiXS9yZXN1bHRzWyJMTFQiXSkuZm9ybWF0KGZtdCkgPDwgIlxuIjsKLS8vICAgY291dCA8PCAiQkRDU1ZEICAgICAgICAgICAgICAgICAgICAgICAgICAgKCUpICAiIDw8IChyZXN1bHRzWyJCRENTVkQiXS9yZXN1bHRzWyJMTFQiXSkuZm9ybWF0KGZtdCkgPDwgIlxuIjsKKyAgLy8gICBjb3V0IDw8ICJMTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtcykgICIgPDwgKHJlc3VsdHNbIkxMVCJdKjEwMDAuKS5mb3JtYXQoZm10KSA8PCAiXG4iOworICAvLyAgIGNvdXQgPDwgIkxETFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICglKSAgIiA8PCAocmVzdWx0c1siTERMVCJdL3Jlc3VsdHNbIkxMVCJdKS5mb3JtYXQoZm10KSA8PCAiXG4iOworICAvLyAgIGNvdXQgPDwgIlBhcnRpYWxQaXZMVSAgICAgICAgICAgICAgICAgICAgICglKSAgIiA8PCAocmVzdWx0c1siUGFydGlhbFBpdkxVIl0vcmVzdWx0c1siTExUIl0pLmZvcm1hdChmbXQpIDw8ICJcbiI7CisgIC8vICAgY291dCA8PCAiRnVsbFBpdkxVICAgICAgICAgICAgICAgICAgICAgICAgKCUpICAiIDw8IChyZXN1bHRzWyJGdWxsUGl2TFUiXS9yZXN1bHRzWyJMTFQiXSkuZm9ybWF0KGZtdCkgPDwgIlxuIjsKKyAgLy8gICBjb3V0IDw8ICJIb3VzZWhvbGRlclFSICAgICAgICAgICAgICAgICAgICAoJSkgICIgPDwgKHJlc3VsdHNbIkhvdXNlaG9sZGVyUVIiXS9yZXN1bHRzWyJMTFQiXSkuZm9ybWF0KGZtdCkgPDwKKyAgLy8gICAiXG4iOyBjb3V0IDw8ICJDb2xQaXZIb3VzZWhvbGRlclFSICAgICAgICAgICAgICAoJSkgICIgPDwKKyAgLy8gICAocmVzdWx0c1siQ29sUGl2SG91c2Vob2xkZXJRUiJdL3Jlc3VsdHNbIkxMVCJdKS5mb3JtYXQoZm10KSA8PCAiXG4iOyBjb3V0IDw8ICJDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uICglKQorICAvLyAgICIgPDwgKHJlc3VsdHNbIkNvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb24iXS9yZXN1bHRzWyJMTFQiXSkuZm9ybWF0KGZtdCkgPDwgIlxuIjsgY291dCA8PAorICAvLyAgICJGdWxsUGl2SG91c2Vob2xkZXJRUiAgICAgICAgICAgICAoJSkgICIgPDwgKHJlc3VsdHNbIkZ1bGxQaXZIb3VzZWhvbGRlclFSIl0vcmVzdWx0c1siTExUIl0pLmZvcm1hdChmbXQpIDw8ICJcbiI7CisgIC8vICAgY291dCA8PCAiSmFjb2JpU1ZEICAgICAgICAgICAgICAgICAgICAgICAgKCUpICAiIDw8IChyZXN1bHRzWyJKYWNvYmlTVkQiXS9yZXN1bHRzWyJMTFQiXSkuZm9ybWF0KGZtdCkgPDwgIlxuIjsKKyAgLy8gICBjb3V0IDw8ICJCRENTVkQgICAgICAgICAgICAgICAgICAgICAgICAgICAoJSkgICIgPDwgKHJlc3VsdHNbIkJEQ1NWRCJdL3Jlc3VsdHNbIkxMVCJdKS5mb3JtYXQoZm10KSA8PCAiXG4iOwogfQpkaWZmIC0tZ2l0IGEvYmVuY2gvZWlnMzMuY3BwIGIvYmVuY2gvZWlnMzMuY3BwCmluZGV4IGYwMDNkOGEuLjI1ZGYxNDIgMTAwNjQ0Ci0tLSBhL2JlbmNoL2VpZzMzLmNwcAorKysgYi9iZW5jaC9laWczMy5jcHAKQEAgLTksMjUgKzksMjUgQEAKIAogLy8gVGhlIGNvbXB1dGVSb290cyBmdW5jdGlvbiBpbmNsdWRlZCBpbiB0aGlzIGlzIGJhc2VkIG9uIG1hdGVyaWFscwogLy8gY292ZXJlZCBieSB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZToKLS8vIAorLy8KIC8vIEdlb21ldHJpYyBUb29scywgTExDCiAvLyBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMAogLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgotLy8gCisvLwogLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uCiAvLyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoZSBzb2Z0d2FyZSBhbmQgYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24gY292ZXJlZCBieQogLy8gdGhpcyBsaWNlbnNlICh0aGUgIlNvZnR3YXJlIikgdG8gdXNlLCByZXByb2R1Y2UsIGRpc3BsYXksIGRpc3RyaWJ1dGUsCiAvLyBleGVjdXRlLCBhbmQgdHJhbnNtaXQgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZQogLy8gU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgdGhpcmQtcGFydGllcyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8KIC8vIGRvIHNvLCBhbGwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nOgotLy8gCisvLwogLy8gVGhlIGNvcHlyaWdodCBub3RpY2VzIGluIHRoZSBTb2Z0d2FyZSBhbmQgdGhpcyBlbnRpcmUgc3RhdGVtZW50LCBpbmNsdWRpbmcKIC8vIHRoZSBhYm92ZSBsaWNlbnNlIGdyYW50LCB0aGlzIHJlc3RyaWN0aW9uIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCiAvLyBtdXN0IGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBhbmQKIC8vIGFsbCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTb2Z0d2FyZSwgdW5sZXNzIHN1Y2ggY29waWVzIG9yIGRlcml2YXRpdmUKIC8vIHdvcmtzIGFyZSBzb2xlbHkgaW4gdGhlIGZvcm0gb2YgbWFjaGluZS1leGVjdXRhYmxlIG9iamVjdCBjb2RlIGdlbmVyYXRlZCBieQogLy8gYSBzb3VyY2UgbGFuZ3VhZ2UgcHJvY2Vzc29yLgotLy8gCisvLwogLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKIC8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVApAQCAtNDUsMTUxICs0NSwxNDUgQEAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeCwgdHlwZW5hbWUgUm9vdHM+Ci1pbmxpbmUgdm9pZCBjb21wdXRlUm9vdHMoY29uc3QgTWF0cml4JiBtLCBSb290cyYgcm9vdHMpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4LCB0eXBlbmFtZSBSb290cz4KK2lubGluZSB2b2lkIGNvbXB1dGVSb290cyhjb25zdCBNYXRyaXgmIG0sIFJvb3RzJiByb290cykgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeDo6U2NhbGFyIFNjYWxhcjsKLSAgY29uc3QgU2NhbGFyIHNfaW52MyA9IDEuMC8zLjA7CisgIGNvbnN0IFNjYWxhciBzX2ludjMgPSAxLjAgLyAzLjA7CiAgIGNvbnN0IFNjYWxhciBzX3NxcnQzID0gc3RkOjpzcXJ0KFNjYWxhcigzLjApKTsKIAogICAvLyBUaGUgY2hhcmFjdGVyaXN0aWMgZXF1YXRpb24gaXMgeF4zIC0gYzIqeF4yICsgYzEqeCAtIGMwID0gMC4gIFRoZQogICAvLyBlaWdlbnZhbHVlcyBhcmUgdGhlIHJvb3RzIHRvIHRoaXMgZXF1YXRpb24sIGFsbCBndWFyYW50ZWVkIHRvIGJlCiAgIC8vIHJlYWwtdmFsdWVkLCBiZWNhdXNlIHRoZSBtYXRyaXggaXMgc3ltbWV0cmljLgotICBTY2FsYXIgYzAgPSBtKDAsMCkqbSgxLDEpKm0oMiwyKSArIFNjYWxhcigyKSptKDAsMSkqbSgwLDIpKm0oMSwyKSAtIG0oMCwwKSptKDEsMikqbSgxLDIpIC0gbSgxLDEpKm0oMCwyKSptKDAsMikgLSBtKDIsMikqbSgwLDEpKm0oMCwxKTsKLSAgU2NhbGFyIGMxID0gbSgwLDApKm0oMSwxKSAtIG0oMCwxKSptKDAsMSkgKyBtKDAsMCkqbSgyLDIpIC0gbSgwLDIpKm0oMCwyKSArIG0oMSwxKSptKDIsMikgLSBtKDEsMikqbSgxLDIpOwotICBTY2FsYXIgYzIgPSBtKDAsMCkgKyBtKDEsMSkgKyBtKDIsMik7CisgIFNjYWxhciBjMCA9IG0oMCwgMCkgKiBtKDEsIDEpICogbSgyLCAyKSArIFNjYWxhcigyKSAqIG0oMCwgMSkgKiBtKDAsIDIpICogbSgxLCAyKSAtIG0oMCwgMCkgKiBtKDEsIDIpICogbSgxLCAyKSAtCisgICAgICAgICAgICAgIG0oMSwgMSkgKiBtKDAsIDIpICogbSgwLCAyKSAtIG0oMiwgMikgKiBtKDAsIDEpICogbSgwLCAxKTsKKyAgU2NhbGFyIGMxID0gbSgwLCAwKSAqIG0oMSwgMSkgLSBtKDAsIDEpICogbSgwLCAxKSArIG0oMCwgMCkgKiBtKDIsIDIpIC0gbSgwLCAyKSAqIG0oMCwgMikgKyBtKDEsIDEpICogbSgyLCAyKSAtCisgICAgICAgICAgICAgIG0oMSwgMikgKiBtKDEsIDIpOworICBTY2FsYXIgYzIgPSBtKDAsIDApICsgbSgxLCAxKSArIG0oMiwgMik7CiAKICAgLy8gQ29uc3RydWN0IHRoZSBwYXJhbWV0ZXJzIHVzZWQgaW4gY2xhc3NpZnlpbmcgdGhlIHJvb3RzIG9mIHRoZSBlcXVhdGlvbgogICAvLyBhbmQgaW4gc29sdmluZyB0aGUgZXF1YXRpb24gZm9yIHRoZSByb290cyBpbiBjbG9zZWQgZm9ybS4KLSAgU2NhbGFyIGMyX292ZXJfMyA9IGMyKnNfaW52MzsKLSAgU2NhbGFyIGFfb3Zlcl8zID0gKGMxIC0gYzIqYzJfb3Zlcl8zKSpzX2ludjM7Ci0gIGlmIChhX292ZXJfMyA+IFNjYWxhcigwKSkKLSAgICBhX292ZXJfMyA9IFNjYWxhcigwKTsKKyAgU2NhbGFyIGMyX292ZXJfMyA9IGMyICogc19pbnYzOworICBTY2FsYXIgYV9vdmVyXzMgPSAoYzEgLSBjMiAqIGMyX292ZXJfMykgKiBzX2ludjM7CisgIGlmIChhX292ZXJfMyA+IFNjYWxhcigwKSkgYV9vdmVyXzMgPSBTY2FsYXIoMCk7CiAKLSAgU2NhbGFyIGhhbGZfYiA9IFNjYWxhcigwLjUpKihjMCArIGMyX292ZXJfMyooU2NhbGFyKDIpKmMyX292ZXJfMypjMl9vdmVyXzMgLSBjMSkpOworICBTY2FsYXIgaGFsZl9iID0gU2NhbGFyKDAuNSkgKiAoYzAgKyBjMl9vdmVyXzMgKiAoU2NhbGFyKDIpICogYzJfb3Zlcl8zICogYzJfb3Zlcl8zIC0gYzEpKTsKIAotICBTY2FsYXIgcSA9IGhhbGZfYipoYWxmX2IgKyBhX292ZXJfMyphX292ZXJfMyphX292ZXJfMzsKLSAgaWYgKHEgPiBTY2FsYXIoMCkpCi0gICAgcSA9IFNjYWxhcigwKTsKKyAgU2NhbGFyIHEgPSBoYWxmX2IgKiBoYWxmX2IgKyBhX292ZXJfMyAqIGFfb3Zlcl8zICogYV9vdmVyXzM7CisgIGlmIChxID4gU2NhbGFyKDApKSBxID0gU2NhbGFyKDApOwogCiAgIC8vIENvbXB1dGUgdGhlIGVpZ2VudmFsdWVzIGJ5IHNvbHZpbmcgZm9yIHRoZSByb290cyBvZiB0aGUgcG9seW5vbWlhbC4KICAgU2NhbGFyIHJobyA9IHN0ZDo6c3FydCgtYV9vdmVyXzMpOwotICBTY2FsYXIgdGhldGEgPSBzdGQ6OmF0YW4yKHN0ZDo6c3FydCgtcSksaGFsZl9iKSpzX2ludjM7CisgIFNjYWxhciB0aGV0YSA9IHN0ZDo6YXRhbjIoc3RkOjpzcXJ0KC1xKSwgaGFsZl9iKSAqIHNfaW52MzsKICAgU2NhbGFyIGNvc190aGV0YSA9IHN0ZDo6Y29zKHRoZXRhKTsKICAgU2NhbGFyIHNpbl90aGV0YSA9IHN0ZDo6c2luKHRoZXRhKTsKLSAgcm9vdHMoMikgPSBjMl9vdmVyXzMgKyBTY2FsYXIoMikqcmhvKmNvc190aGV0YTsKLSAgcm9vdHMoMCkgPSBjMl9vdmVyXzMgLSByaG8qKGNvc190aGV0YSArIHNfc3FydDMqc2luX3RoZXRhKTsKLSAgcm9vdHMoMSkgPSBjMl9vdmVyXzMgLSByaG8qKGNvc190aGV0YSAtIHNfc3FydDMqc2luX3RoZXRhKTsKKyAgcm9vdHMoMikgPSBjMl9vdmVyXzMgKyBTY2FsYXIoMikgKiByaG8gKiBjb3NfdGhldGE7CisgIHJvb3RzKDApID0gYzJfb3Zlcl8zIC0gcmhvICogKGNvc190aGV0YSArIHNfc3FydDMgKiBzaW5fdGhldGEpOworICByb290cygxKSA9IGMyX292ZXJfMyAtIHJobyAqIChjb3NfdGhldGEgLSBzX3NxcnQzICogc2luX3RoZXRhKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4LCB0eXBlbmFtZSBWZWN0b3I+Ci12b2lkIGVpZ2VuMzMoY29uc3QgTWF0cml4JiBtYXQsIE1hdHJpeCYgZXZlY3MsIFZlY3RvciYgZXZhbHMpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4LCB0eXBlbmFtZSBWZWN0b3I+Cit2b2lkIGVpZ2VuMzMoY29uc3QgTWF0cml4JiBtYXQsIE1hdHJpeCYgZXZlY3MsIFZlY3RvciYgZXZhbHMpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXg6OlNjYWxhciBTY2FsYXI7CiAgIC8vIFNjYWxlIHRoZSBtYXRyaXggc28gaXRzIGVudHJpZXMgYXJlIGluIFstMSwxXS4gIFRoZSBzY2FsaW5nIGlzIGFwcGxpZWQKICAgLy8gb25seSB3aGVuIGF0IGxlYXN0IG9uZSBtYXRyaXggZW50cnkgaGFzIG1hZ25pdHVkZSBsYXJnZXIgdGhhbiAxLgogCi0gIFNjYWxhciBzaGlmdCA9IG1hdC50cmFjZSgpLzM7CisgIFNjYWxhciBzaGlmdCA9IG1hdC50cmFjZSgpIC8gMzsKICAgTWF0cml4IHNjYWxlZE1hdCA9IG1hdDsKICAgc2NhbGVkTWF0LmRpYWdvbmFsKCkuYXJyYXkoKSAtPSBzaGlmdDsKLSAgU2NhbGFyIHNjYWxlID0gc2NhbGVkTWF0LmN3aXNlQWJzKCkvKi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSovLm1heENvZWZmKCk7Ci0gIHNjYWxlID0gc3RkOjptYXgoc2NhbGUsU2NhbGFyKDEpKTsKLSAgc2NhbGVkTWF0Lz1zY2FsZTsKKyAgU2NhbGFyIHNjYWxlID0gc2NhbGVkTWF0LmN3aXNlQWJzKCkgLyoudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkqLy5tYXhDb2VmZigpOworICBzY2FsZSA9IHN0ZDo6bWF4KHNjYWxlLCBTY2FsYXIoMSkpOworICBzY2FsZWRNYXQgLz0gc2NhbGU7CiAKICAgLy8gQ29tcHV0ZSB0aGUgZWlnZW52YWx1ZXMKLS8vICAgc2NhbGVkTWF0LnNldFplcm8oKTsKLSAgY29tcHV0ZVJvb3RzKHNjYWxlZE1hdCxldmFscyk7CisgIC8vICAgc2NhbGVkTWF0LnNldFplcm8oKTsKKyAgY29tcHV0ZVJvb3RzKHNjYWxlZE1hdCwgZXZhbHMpOwogCiAgIC8vIGNvbXB1dGUgdGhlIGVpZ2VuIHZlY3RvcnMKICAgLy8gKipoZXJlIHdlIGFzc3VtZSAzIGRpZmZlcmVudCBlaWdlbnZhbHVlcyoqCiAKICAgLy8gIm9wdGltaXplZCB2ZXJzaW9uIiB3aGljaCBhcHBlYXJzIHRvIGJlIHNsb3dlciB3aXRoIGdjYyEKLS8vICAgICBWZWN0b3IgYmFzZTsKLS8vICAgICBTY2FsYXIgYWxwaGEsIGJldGE7Ci0vLyAgICAgYmFzZSA8PCAgIHNjYWxlZE1hdCgxLDApICogc2NhbGVkTWF0KDIsMSksCi0vLyAgICAgICAgICAgICAgIHNjYWxlZE1hdCgxLDApICogc2NhbGVkTWF0KDIsMCksCi0vLyAgICAgICAgICAgICAgLXNjYWxlZE1hdCgxLDApICogc2NhbGVkTWF0KDEsMCk7Ci0vLyAgICAgZm9yKGludCBrPTA7IGs8MjsgKytrKQotLy8gICAgIHsKLS8vICAgICAgIGFscGhhID0gc2NhbGVkTWF0KDAsMCkgLSBldmFscyhrKTsKLS8vICAgICAgIGJldGEgID0gc2NhbGVkTWF0KDEsMSkgLSBldmFscyhrKTsKLS8vICAgICAgIGV2ZWNzLmNvbChrKSA9IChiYXNlICsgVmVjdG9yKC1iZXRhKnNjYWxlZE1hdCgyLDApLCAtYWxwaGEqc2NhbGVkTWF0KDIsMSksIGFscGhhKmJldGEpKS5ub3JtYWxpemVkKCk7Ci0vLyAgICAgfQotLy8gICAgIGV2ZWNzLmNvbCgyKSA9IGV2ZWNzLmNvbCgwKS5jcm9zcyhldmVjcy5jb2woMSkpLm5vcm1hbGl6ZWQoKTsKKyAgLy8gICAgIFZlY3RvciBiYXNlOworICAvLyAgICAgU2NhbGFyIGFscGhhLCBiZXRhOworICAvLyAgICAgYmFzZSA8PCAgIHNjYWxlZE1hdCgxLDApICogc2NhbGVkTWF0KDIsMSksCisgIC8vICAgICAgICAgICAgICAgc2NhbGVkTWF0KDEsMCkgKiBzY2FsZWRNYXQoMiwwKSwKKyAgLy8gICAgICAgICAgICAgIC1zY2FsZWRNYXQoMSwwKSAqIHNjYWxlZE1hdCgxLDApOworICAvLyAgICAgZm9yKGludCBrPTA7IGs8MjsgKytrKQorICAvLyAgICAgeworICAvLyAgICAgICBhbHBoYSA9IHNjYWxlZE1hdCgwLDApIC0gZXZhbHMoayk7CisgIC8vICAgICAgIGJldGEgID0gc2NhbGVkTWF0KDEsMSkgLSBldmFscyhrKTsKKyAgLy8gICAgICAgZXZlY3MuY29sKGspID0gKGJhc2UgKyBWZWN0b3IoLWJldGEqc2NhbGVkTWF0KDIsMCksIC1hbHBoYSpzY2FsZWRNYXQoMiwxKSwgYWxwaGEqYmV0YSkpLm5vcm1hbGl6ZWQoKTsKKyAgLy8gICAgIH0KKyAgLy8gICAgIGV2ZWNzLmNvbCgyKSA9IGV2ZWNzLmNvbCgwKS5jcm9zcyhldmVjcy5jb2woMSkpLm5vcm1hbGl6ZWQoKTsKIAotLy8gICAvLyBuYWl2ZSB2ZXJzaW9uCi0vLyAgIE1hdHJpeCB0bXA7Ci0vLyAgIHRtcCA9IHNjYWxlZE1hdDsKLS8vICAgdG1wLmRpYWdvbmFsKCkuYXJyYXkoKSAtPSBldmFscygwKTsKLS8vICAgZXZlY3MuY29sKDApID0gdG1wLnJvdygwKS5jcm9zcyh0bXAucm93KDEpKS5ub3JtYWxpemVkKCk7Ci0vLyAKLS8vICAgdG1wID0gc2NhbGVkTWF0OwotLy8gICB0bXAuZGlhZ29uYWwoKS5hcnJheSgpIC09IGV2YWxzKDEpOwotLy8gICBldmVjcy5jb2woMSkgPSB0bXAucm93KDApLmNyb3NzKHRtcC5yb3coMSkpLm5vcm1hbGl6ZWQoKTsKLS8vIAotLy8gICB0bXAgPSBzY2FsZWRNYXQ7Ci0vLyAgIHRtcC5kaWFnb25hbCgpLmFycmF5KCkgLT0gZXZhbHMoMik7Ci0vLyAgIGV2ZWNzLmNvbCgyKSA9IHRtcC5yb3coMCkuY3Jvc3ModG1wLnJvdygxKSkubm9ybWFsaXplZCgpOwotICAKKyAgLy8gICAvLyBuYWl2ZSB2ZXJzaW9uCisgIC8vICAgTWF0cml4IHRtcDsKKyAgLy8gICB0bXAgPSBzY2FsZWRNYXQ7CisgIC8vICAgdG1wLmRpYWdvbmFsKCkuYXJyYXkoKSAtPSBldmFscygwKTsKKyAgLy8gICBldmVjcy5jb2woMCkgPSB0bXAucm93KDApLmNyb3NzKHRtcC5yb3coMSkpLm5vcm1hbGl6ZWQoKTsKKyAgLy8KKyAgLy8gICB0bXAgPSBzY2FsZWRNYXQ7CisgIC8vICAgdG1wLmRpYWdvbmFsKCkuYXJyYXkoKSAtPSBldmFscygxKTsKKyAgLy8gICBldmVjcy5jb2woMSkgPSB0bXAucm93KDApLmNyb3NzKHRtcC5yb3coMSkpLm5vcm1hbGl6ZWQoKTsKKyAgLy8KKyAgLy8gICB0bXAgPSBzY2FsZWRNYXQ7CisgIC8vICAgdG1wLmRpYWdvbmFsKCkuYXJyYXkoKSAtPSBldmFscygyKTsKKyAgLy8gICBldmVjcy5jb2woMikgPSB0bXAucm93KDApLmNyb3NzKHRtcC5yb3coMSkpLm5vcm1hbGl6ZWQoKTsKKwogICAvLyBhIG1vcmUgc3RhYmxlIHZlcnNpb246Ci0gIGlmKChldmFscygyKS1ldmFscygwKSk8PUVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKQotICB7CisgIGlmICgoZXZhbHMoMikgLSBldmFscygwKSkgPD0gRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkpIHsKICAgICBldmVjcy5zZXRJZGVudGl0eSgpOwotICB9Ci0gIGVsc2UKLSAgeworICB9IGVsc2UgewogICAgIE1hdHJpeCB0bXA7CiAgICAgdG1wID0gc2NhbGVkTWF0OwotICAgIHRtcC5kaWFnb25hbCAoKS5hcnJheSAoKSAtPSBldmFscyAoMik7Ci0gICAgZXZlY3MuY29sICgyKSA9IHRtcC5yb3cgKDApLmNyb3NzICh0bXAucm93ICgxKSkubm9ybWFsaXplZCAoKTsKLSAgICAKKyAgICB0bXAuZGlhZ29uYWwoKS5hcnJheSgpIC09IGV2YWxzKDIpOworICAgIGV2ZWNzLmNvbCgyKSA9IHRtcC5yb3coMCkuY3Jvc3ModG1wLnJvdygxKSkubm9ybWFsaXplZCgpOworCiAgICAgdG1wID0gc2NhbGVkTWF0OwotICAgIHRtcC5kaWFnb25hbCAoKS5hcnJheSAoKSAtPSBldmFscyAoMSk7Ci0gICAgZXZlY3MuY29sKDEpID0gdG1wLnJvdyAoMCkuY3Jvc3ModG1wLnJvdyAoMSkpOworICAgIHRtcC5kaWFnb25hbCgpLmFycmF5KCkgLT0gZXZhbHMoMSk7CisgICAgZXZlY3MuY29sKDEpID0gdG1wLnJvdygwKS5jcm9zcyh0bXAucm93KDEpKTsKICAgICBTY2FsYXIgbjEgPSBldmVjcy5jb2woMSkubm9ybSgpOwotICAgIGlmKG4xPD1FaWdlbjo6TnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSkKKyAgICBpZiAobjEgPD0gRWlnZW46Ok51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkpCiAgICAgICBldmVjcy5jb2woMSkgPSBldmVjcy5jb2woMikudW5pdE9ydGhvZ29uYWwoKTsKICAgICBlbHNlCiAgICAgICBldmVjcy5jb2woMSkgLz0gbjE7Ci0gICAgCisKICAgICAvLyBtYWtlIHN1cmUgdGhhdCBldmVjc1sxXSBpcyBvcnRob2dvbmFsIHRvIGV2ZWNzWzJdCiAgICAgZXZlY3MuY29sKDEpID0gZXZlY3MuY29sKDIpLmNyb3NzKGV2ZWNzLmNvbCgxKS5jcm9zcyhldmVjcy5jb2woMikpKS5ub3JtYWxpemVkKCk7CiAgICAgZXZlY3MuY29sKDApID0gZXZlY3MuY29sKDIpLmNyb3NzKGV2ZWNzLmNvbCgxKSk7CiAgIH0KLSAgCisKICAgLy8gUmVzY2FsZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzaXplLgogICBldmFscyAqPSBzY2FsZTsKLSAgZXZhbHMuYXJyYXkoKSs9c2hpZnQ7CisgIGV2YWxzLmFycmF5KCkgKz0gc2hpZnQ7CiB9CiAKLWludCBtYWluKCkKLXsKK2ludCBtYWluKCkgewogICBCZW5jaFRpbWVyIHQ7CiAgIGludCB0cmllcyA9IDEwOwogICBpbnQgcmVwID0gNDAwMDAwOwogICB0eXBlZGVmIE1hdHJpeDNkIE1hdDsKICAgdHlwZWRlZiBWZWN0b3IzZCBWZWM7Ci0gIE1hdCBBID0gTWF0OjpSYW5kb20oMywzKTsKKyAgTWF0IEEgPSBNYXQ6OlJhbmRvbSgzLCAzKTsKICAgQSA9IEEuYWRqb2ludCgpICogQTsKLS8vICAgTWF0IFEgPSBBLmhvdXNlaG9sZGVyUXIoKS5ob3VzZWhvbGRlclEoKTsKLS8vICAgQSA9IFEgKiBWZWMoMi4yNDI0NTY3LDIuMjQyNDU2Niw3LjQ1NDM1MykuYXNEaWFnb25hbCgpICogUS50cmFuc3Bvc2UoKTsKKyAgLy8gICBNYXQgUSA9IEEuaG91c2Vob2xkZXJRcigpLmhvdXNlaG9sZGVyUSgpOworICAvLyAgIEEgPSBRICogVmVjKDIuMjQyNDU2NywyLjI0MjQ1NjYsNy40NTQzNTMpLmFzRGlhZ29uYWwoKSAqIFEudHJhbnNwb3NlKCk7CiAKICAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXQ+IGVpZyhBKTsKICAgQkVOQ0godCwgdHJpZXMsIHJlcCwgZWlnLmNvbXB1dGUoQSkpOwogICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIGl0ZXJhdGl2ZTogICIgPDwgdC5iZXN0KCkgPDwgInNcbiI7Ci0gIAorCiAgIEJFTkNIKHQsIHRyaWVzLCByZXAsIGVpZy5jb21wdXRlRGlyZWN0KEEpKTsKICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBkaXJlY3QgICA6ICAiIDw8IHQuYmVzdCgpIDw8ICJzXG4iOwogCiAgIE1hdCBldmVjczsKICAgVmVjIGV2YWxzOwotICBCRU5DSCh0LCB0cmllcywgcmVwLCBlaWdlbjMzKEEsZXZlY3MsZXZhbHMpKTsKKyAgQkVOQ0godCwgdHJpZXMsIHJlcCwgZWlnZW4zMyhBLCBldmVjcywgZXZhbHMpKTsKICAgc3RkOjpjb3V0IDw8ICJEaXJlY3Q6ICIgPDwgdC5iZXN0KCkgPDwgInNcblxuIjsKIAotLy8gICBzdGQ6OmNlcnIgPDwgIkVpZ2VudmFsdWUvZWlnZW52ZWN0b3IgZGlmZnM6XG4iOwotLy8gICBzdGQ6OmNlcnIgPDwgKGV2YWxzIC0gZWlnLmVpZ2VudmFsdWVzKCkpLnRyYW5zcG9zZSgpIDw8ICJcbiI7Ci0vLyAgIGZvcihpbnQgaz0wO2s8MzsrK2spCi0vLyAgICAgaWYoZXZlY3MuY29sKGspLmRvdChlaWcuZWlnZW52ZWN0b3JzKCkuY29sKGspKTwwKQotLy8gICAgICAgZXZlY3MuY29sKGspID0gLWV2ZWNzLmNvbChrKTsKLS8vICAgc3RkOjpjZXJyIDw8IGV2ZWNzIC0gZWlnLmVpZ2VudmVjdG9ycygpIDw8ICJcblxuIjsKKyAgLy8gICBzdGQ6OmNlcnIgPDwgIkVpZ2VudmFsdWUvZWlnZW52ZWN0b3IgZGlmZnM6XG4iOworICAvLyAgIHN0ZDo6Y2VyciA8PCAoZXZhbHMgLSBlaWcuZWlnZW52YWx1ZXMoKSkudHJhbnNwb3NlKCkgPDwgIlxuIjsKKyAgLy8gICBmb3IoaW50IGs9MDtrPDM7KytrKQorICAvLyAgICAgaWYoZXZlY3MuY29sKGspLmRvdChlaWcuZWlnZW52ZWN0b3JzKCkuY29sKGspKTwwKQorICAvLyAgICAgICBldmVjcy5jb2woaykgPSAtZXZlY3MuY29sKGspOworICAvLyAgIHN0ZDo6Y2VyciA8PCBldmVjcyAtIGVpZy5laWdlbnZlY3RvcnMoKSA8PCAiXG5cbiI7CiB9CmRpZmYgLS1naXQgYS9iZW5jaC9nZW9tZXRyeS5jcHAgYi9iZW5jaC9nZW9tZXRyeS5jcHAKaW5kZXggYjE4N2E1MS4uMzVlZWU4OCAxMDA2NDQKLS0tIGEvYmVuY2gvZ2VvbWV0cnkuY3BwCisrKyBiL2JlbmNoL2dlb21ldHJ5LmNwcApAQCAtMTYsMTA1ICsxNiwxMDAgQEAKIAogdHlwZWRlZiBTQ0FMQVIgU2NhbGFyOwogdHlwZWRlZiBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOwotdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhcixEeW5hbWljLER5bmFtaWM+IEE7Ci10eXBlZGVmIE1hdHJpeDwvKlJlYWwqL1NjYWxhcixEeW5hbWljLER5bmFtaWM+IEI7Ci10eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBDOwotdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhcixEeW5hbWljLER5bmFtaWM+IE07Cit0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBBOwordHlwZWRlZiBNYXRyaXg8LypSZWFsKi8gU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBCOwordHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBDOwordHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gTTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtYXRpb24sIHR5cGVuYW1lIERhdGE+Ci1FSUdFTl9ET05UX0lOTElORSB2b2lkIHRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbiYgdCwgRGF0YSYgZGF0YSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUcmFuc2Zvcm1hdGlvbiwgdHlwZW5hbWUgRGF0YT4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uJiB0LCBEYXRhJiBkYXRhKSB7CiAgIEVJR0VOX0FTTV9DT01NRU5UKCJiZWdpbiIpOwogICBkYXRhID0gdCAqIGRhdGE7CiAgIEVJR0VOX0FTTV9DT01NRU5UKCJlbmQiKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBEYXRhPgotRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCB0cmFuc2Zvcm0oY29uc3QgUXVhdGVybmlvbjxTY2FsYXI+JiB0LCBEYXRhJiBkYXRhKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRGF0YT4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFF1YXRlcm5pb248U2NhbGFyPiYgdCwgRGF0YSYgZGF0YSkgewogICBFSUdFTl9BU01fQ09NTUVOVCgiYmVnaW4gcXVhdCIpOwotICBmb3IoaW50IGk9MDtpPGRhdGEuY29scygpOysraSkKLSAgICBkYXRhLmNvbChpKSA9IHQgKiBkYXRhLmNvbChpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmNvbHMoKTsgKytpKSBkYXRhLmNvbChpKSA9IHQgKiBkYXRhLmNvbChpKTsKICAgRUlHRU5fQVNNX0NPTU1FTlQoImVuZCBxdWF0Iik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBUb1JvdGF0aW9uTWF0cml4V3JhcHBlcgotewotICBlbnVtIHtEaW0gPSBUOjpEaW19OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVG9Sb3RhdGlvbk1hdHJpeFdyYXBwZXIgeworICBlbnVtIHsgRGltID0gVDo6RGltIH07CiAgIHR5cGVkZWYgdHlwZW5hbWUgVDo6U2NhbGFyIFNjYWxhcjsKICAgVG9Sb3RhdGlvbk1hdHJpeFdyYXBwZXIoY29uc3QgVCYgbykgOiBvYmplY3Qobykge30KICAgVCBvYmplY3Q7CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBRVHlwZSwgdHlwZW5hbWUgRGF0YT4KLUVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFRvUm90YXRpb25NYXRyaXhXcmFwcGVyPFFUeXBlPiYgdCwgRGF0YSYgZGF0YSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBRVHlwZSwgdHlwZW5hbWUgRGF0YT4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFRvUm90YXRpb25NYXRyaXhXcmFwcGVyPFFUeXBlPiYgdCwgRGF0YSYgZGF0YSkgewogICBFSUdFTl9BU01fQ09NTUVOVCgiYmVnaW4gcXVhdCB2aWEgbWF0Iik7CiAgIGRhdGEgPSB0Lm9iamVjdC50b1JvdGF0aW9uTWF0cml4KCkgKiBkYXRhOwogICBFSUdFTl9BU01fQ09NTUVOVCgiZW5kIHF1YXQgdmlhIG1hdCIpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIHR5cGVuYW1lIERhdGE+Ci1FSUdFTl9ET05UX0lOTElORSB2b2lkIHRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm08U2NhbGFyLERpbSxQcm9qZWN0aXZlPiYgdCwgRGF0YSYgZGF0YSkKLXsKLSAgZGF0YSA9ICh0ICogZGF0YS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSkudGVtcGxhdGUgYmxvY2s8RGltLERhdGE6OkNvbHNBdENvbXBpbGVUaW1lPigwLDApOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgdHlwZW5hbWUgRGF0YT4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybTxTY2FsYXIsIERpbSwgUHJvamVjdGl2ZT4mIHQsIERhdGEmIGRhdGEpIHsKKyAgZGF0YSA9ICh0ICogZGF0YS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSkudGVtcGxhdGUgYmxvY2s8RGltLCBEYXRhOjpDb2xzQXRDb21waWxlVGltZT4oMCwgMCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBnZXRfZGltIHsgZW51bSB7IERpbSA9IFQ6OkRpbSB9OyB9OwotdGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IFIsIGludCBDLCBpbnQgTywgaW50IE1SLCBpbnQgTUM+Ci1zdHJ1Y3QgZ2V0X2RpbTxNYXRyaXg8UyxSLEMsTyxNUixNQz4gPiB7IGVudW0geyBEaW0gPSBSIH07IH07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBnZXRfZGltIHsKKyAgZW51bSB7IERpbSA9IFQ6OkRpbSB9OworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTLCBpbnQgUiwgaW50IEMsIGludCBPLCBpbnQgTVIsIGludCBNQz4KK3N0cnVjdCBnZXRfZGltPE1hdHJpeDxTLCBSLCBDLCBPLCBNUiwgTUM+ID4geworICBlbnVtIHsgRGltID0gUiB9OworfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtYXRpb24sIGludCBOPgotc3RydWN0IGJlbmNoX2ltcGwKLXsKLSAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKGNvbnN0IFRyYW5zZm9ybWF0aW9uJiB0KQotICB7Ci0gICAgTWF0cml4PHR5cGVuYW1lIFRyYW5zZm9ybWF0aW9uOjpTY2FsYXIsZ2V0X2RpbTxUcmFuc2Zvcm1hdGlvbj46OkRpbSxOPiBkYXRhOwordGVtcGxhdGUgPHR5cGVuYW1lIFRyYW5zZm9ybWF0aW9uLCBpbnQgTj4KK3N0cnVjdCBiZW5jaF9pbXBsIHsKKyAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKGNvbnN0IFRyYW5zZm9ybWF0aW9uJiB0KSB7CisgICAgTWF0cml4PHR5cGVuYW1lIFRyYW5zZm9ybWF0aW9uOjpTY2FsYXIsIGdldF9kaW08VHJhbnNmb3JtYXRpb24+OjpEaW0sIE4+IGRhdGE7CiAgICAgZGF0YS5zZXRSYW5kb20oKTsKLSAgICBiZW5jaF9pbXBsPFRyYW5zZm9ybWF0aW9uLE4tMT46OnJ1bih0KTsKKyAgICBiZW5jaF9pbXBsPFRyYW5zZm9ybWF0aW9uLCBOIC0gMT46OnJ1bih0KTsKICAgICBCZW5jaFRpbWVyIHRpbWVyOwotICAgIEJFTkNIKHRpbWVyLDEwLDEwMDAwMCx0cmFuc2Zvcm0odCxkYXRhKSk7CisgICAgQkVOQ0godGltZXIsIDEwLCAxMDAwMDAsIHRyYW5zZm9ybSh0LCBkYXRhKSk7CiAgICAgY291dC53aWR0aCg5KTsKICAgICBjb3V0IDw8IHRpbWVyLmJlc3QoKSA8PCAiICI7CiAgIH0KIH07CiAKLQotdGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtYXRpb24+Ci1zdHJ1Y3QgYmVuY2hfaW1wbDxUcmFuc2Zvcm1hdGlvbiwwPgotewordGVtcGxhdGUgPHR5cGVuYW1lIFRyYW5zZm9ybWF0aW9uPgorc3RydWN0IGJlbmNoX2ltcGw8VHJhbnNmb3JtYXRpb24sIDA+IHsKICAgc3RhdGljIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcnVuKGNvbnN0IFRyYW5zZm9ybWF0aW9uJikge30KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFRyYW5zZm9ybWF0aW9uPgotRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBiZW5jaChjb25zdCBzdGQ6OnN0cmluZyYgbXNnLCBjb25zdCBUcmFuc2Zvcm1hdGlvbiYgdCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUcmFuc2Zvcm1hdGlvbj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgYmVuY2goY29uc3Qgc3RkOjpzdHJpbmcmIG1zZywgY29uc3QgVHJhbnNmb3JtYXRpb24mIHQpIHsKICAgY291dCA8PCBtc2cgPDwgIiAiOwotICBiZW5jaF9pbXBsPFRyYW5zZm9ybWF0aW9uLFNJWkU+OjpydW4odCk7CisgIGJlbmNoX2ltcGw8VHJhbnNmb3JtYXRpb24sIFNJWkU+OjpydW4odCk7CiAgIHN0ZDo6Y291dCA8PCAiXG4iOwogfQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQotewotICBNYXRyaXg8U2NhbGFyLDMsND4gbWF0MzQ7IG1hdDM0LnNldFJhbmRvbSgpOwotICBUcmFuc2Zvcm08U2NhbGFyLDMsSXNvbWV0cnk+IGlzbzMobWF0MzQpOwotICBUcmFuc2Zvcm08U2NhbGFyLDMsQWZmaW5lPiBhZmYzKG1hdDM0KTsKLSAgVHJhbnNmb3JtPFNjYWxhciwzLEFmZmluZUNvbXBhY3Q+IGNhZmYzKG1hdDM0KTsKLSAgVHJhbnNmb3JtPFNjYWxhciwzLFByb2plY3RpdmU+IHByb2ozKG1hdDM0KTsKLSAgUXVhdGVybmlvbjxTY2FsYXI+IHF1YXQ7cXVhdC5zZXRJZGVudGl0eSgpOworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIE1hdHJpeDxTY2FsYXIsIDMsIDQ+IG1hdDM0OworICBtYXQzNC5zZXRSYW5kb20oKTsKKyAgVHJhbnNmb3JtPFNjYWxhciwgMywgSXNvbWV0cnk+IGlzbzMobWF0MzQpOworICBUcmFuc2Zvcm08U2NhbGFyLCAzLCBBZmZpbmU+IGFmZjMobWF0MzQpOworICBUcmFuc2Zvcm08U2NhbGFyLCAzLCBBZmZpbmVDb21wYWN0PiBjYWZmMyhtYXQzNCk7CisgIFRyYW5zZm9ybTxTY2FsYXIsIDMsIFByb2plY3RpdmU+IHByb2ozKG1hdDM0KTsKKyAgUXVhdGVybmlvbjxTY2FsYXI+IHF1YXQ7CisgIHF1YXQuc2V0SWRlbnRpdHkoKTsKICAgVG9Sb3RhdGlvbk1hdHJpeFdyYXBwZXI8UXVhdGVybmlvbjxTY2FsYXI+ID4gcXVhdG1hdChxdWF0KTsKLSAgTWF0cml4PFNjYWxhciwzLDM+IG1hdDMzOyBtYXQzMy5zZXRSYW5kb20oKTsKLSAgCisgIE1hdHJpeDxTY2FsYXIsIDMsIDM+IG1hdDMzOworICBtYXQzMy5zZXRSYW5kb20oKTsKKwogICBjb3V0LnByZWNpc2lvbig0KTsKLSAgc3RkOjpjb3V0Ci0gICAgIDw8ICJOICAgICAgICAgICI7Ci0gIGZvcihpbnQgaT0wO2k8U0laRTsrK2kpCi0gIHsKKyAgc3RkOjpjb3V0IDw8ICJOICAgICAgICAgICI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgKytpKSB7CiAgICAgY291dC53aWR0aCg5KTsKLSAgICBjb3V0IDw8IGkrMSA8PCAiICI7CisgICAgY291dCA8PCBpICsgMSA8PCAiICI7CiAgIH0KICAgY291dCA8PCAiXG4iOwotICAKKwogICBiZW5jaCgibWF0cml4IDN4MyIsIG1hdDMzKTsKICAgYmVuY2goInF1YXRlcm5pb24iLCBxdWF0KTsKICAgYmVuY2goInF1YXQtbWF0ICAiLCBxdWF0bWF0KTsKQEAgLTEyMyw0ICsxMTgsMyBAQAogICBiZW5jaCgiYyBhZmZpbmUzICIsIGNhZmYzKTsKICAgYmVuY2goInByb2ozICAgICAiLCBwcm9qMyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW1tLmNwcCBiL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW1tLmNwcAppbmRleCA4MDQxMzlkLi4yNWFkMmZiIDEwMDY0NAotLS0gYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvZ2VtbS5jcHAKKysrIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbW0uY3BwCkBAIC0xLDEyICsxLDUgQEAKICNpbmNsdWRlICJnZW1tX2NvbW1vbi5oIgogCi1FSUdFTl9ET05UX0lOTElORQotdm9pZCBnZW1tKGNvbnN0IE1hdCAmQSwgY29uc3QgTWF0ICZCLCBNYXQgJkMpCi17Ci0gIEMubm9hbGlhcygpICs9IEEgKiBCOwotfQorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBnZW1tKGNvbnN0IE1hdCAmQSwgY29uc3QgTWF0ICZCLCBNYXQgJkMpIHsgQy5ub2FsaWFzKCkgKz0gQSAqIEI7IH0KIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICByZXR1cm4gbWFpbl9nZW1tKGFyZ2MsIGFyZ3YsIGdlbW0pOwotfQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IHJldHVybiBtYWluX2dlbW0oYXJnYywgYXJndiwgZ2VtbSk7IH0KZGlmZiAtLWdpdCBhL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW1tX2NvbW1vbi5oIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbW1fY29tbW9uLmgKaW5kZXggMzBkYmMwZC4uOWFmZDZmOCAxMDA2NDQKLS0tIGEvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbW1fY29tbW9uLmgKKysrIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbW1fY29tbW9uLmgKQEAgLTEyLDU2ICsxMiw1MCBAQAogCiB0eXBlZGVmIFNDQUxBUiBTY2FsYXI7CiAKLXR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IE1hdDsKK3R5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gTWF0OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jPgotRUlHRU5fRE9OVF9JTkxJTkUKLWRvdWJsZSBiZW5jaChsb25nIG0sIGxvbmcgbiwgbG9uZyBrLCBjb25zdCBGdW5jJiBmKQotewotICBNYXQgQShtLGspOwotICBNYXQgQihrLG4pOwotICBNYXQgQyhtLG4pOwordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+CitFSUdFTl9ET05UX0lOTElORSBkb3VibGUgYmVuY2gobG9uZyBtLCBsb25nIG4sIGxvbmcgaywgY29uc3QgRnVuYyYgZikgeworICBNYXQgQShtLCBrKTsKKyAgTWF0IEIoaywgbik7CisgIE1hdCBDKG0sIG4pOwogICBBLnNldFJhbmRvbSgpOwogICBCLnNldFJhbmRvbSgpOwogICBDLnNldFplcm8oKTsKLSAgCisKICAgQmVuY2hUaW1lciB0OwotICAKLSAgZG91YmxlIHVwID0gMWU4KjQvc2l6ZW9mKFNjYWxhcik7CisKKyAgZG91YmxlIHVwID0gMWU4ICogNCAvIHNpemVvZihTY2FsYXIpOwogICBkb3VibGUgdG0wID0gNCwgdG0xID0gMTA7Ci0gIGlmKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCi0gIHsKKyAgaWYgKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpIHsKICAgICB1cCAvPSA0OwogICAgIHRtMCA9IDI7CiAgICAgdG0xID0gNDsKICAgfQotICAKKwogICBkb3VibGUgZmxvcHMgPSAyLiAqIG0gKiBuICogazsKLSAgbG9uZyByZXAgPSBzdGQ6Om1heCgxLiwgc3RkOjptaW4oMTAwLiwgdXAvZmxvcHMpICk7Ci0gIGxvbmcgdHJpZXMgPSBzdGQ6Om1heCh0bTAsIHN0ZDo6bWluKHRtMSwgdXAvZmxvcHMpICk7Ci0gIAotICBCRU5DSCh0LCB0cmllcywgcmVwLCBmKEEsQixDKSk7Ci0gIAorICBsb25nIHJlcCA9IHN0ZDo6bWF4KDEuLCBzdGQ6Om1pbigxMDAuLCB1cCAvIGZsb3BzKSk7CisgIGxvbmcgdHJpZXMgPSBzdGQ6Om1heCh0bTAsIHN0ZDo6bWluKHRtMSwgdXAgLyBmbG9wcykpOworCisgIEJFTkNIKHQsIHRyaWVzLCByZXAsIGYoQSwgQiwgQykpOworCiAgIHJldHVybiAxZS05ICogcmVwICogZmxvcHMgLyB0LmJlc3QoKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4KLWludCBtYWluX2dlbW0oaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjb25zdCBGdW5jJiBmKQotewordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+CitpbnQgbWFpbl9nZW1tKGludCBhcmdjLCBjaGFyKiogYXJndiwgY29uc3QgRnVuYyYgZikgewogICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHJlc3VsdHM7Ci0gIAorCiAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gc3RkOjpzdHJpbmcoImdlbW1fc2V0dGluZ3MudHh0Iik7Ci0gIGlmKGFyZ2M+MSkKLSAgICBmaWxlbmFtZSA9IHN0ZDo6c3RyaW5nKGFyZ3ZbMV0pOworICBpZiAoYXJnYyA+IDEpIGZpbGVuYW1lID0gc3RkOjpzdHJpbmcoYXJndlsxXSk7CiAgIHN0ZDo6aWZzdHJlYW0gc2V0dGluZ3MoZmlsZW5hbWUpOwogICBsb25nIG0sIG4sIGs7Ci0gIHdoaWxlKHNldHRpbmdzID4+IG0gPj4gbiA+PiBrKQotICB7Ci0gICAgLy9zdGQ6OmNlcnIgPDwgIiAgVGVzdGluZyAiIDw8IG0gPDwgIiAiIDw8IG4gPDwgIiAiIDw8IGsgPDwgc3RkOjplbmRsOwotICAgIHJlc3VsdHMucHVzaF9iYWNrKCBiZW5jaChtLCBuLCBrLCBmKSApOworICB3aGlsZSAoc2V0dGluZ3MgPj4gbSA+PiBuID4+IGspIHsKKyAgICAvLyBzdGQ6OmNlcnIgPDwgIiAgVGVzdGluZyAiIDw8IG0gPDwgIiAiIDw8IG4gPDwgIiAiIDw8IGsgPDwgc3RkOjplbmRsOworICAgIHJlc3VsdHMucHVzaF9iYWNrKGJlbmNoKG0sIG4sIGssIGYpKTsKICAgfQotICAKKwogICBzdGQ6OmNvdXQgPDwgUm93VmVjdG9yWGQ6Ok1hcChyZXN1bHRzLmRhdGEoKSwgcmVzdWx0cy5zaXplKCkpOwotICAKKwogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW12LmNwcCBiL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW12LmNwcAppbmRleCA4MmU1YWI5Li5iMjhhOGI4IDEwMDY0NAotLS0gYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvZ2Vtdi5jcHAKKysrIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbXYuY3BwCkBAIC0xLDEyICsxLDUgQEAKICNpbmNsdWRlICJnZW12X2NvbW1vbi5oIgogCi1FSUdFTl9ET05UX0lOTElORQotdm9pZCBnZW12KGNvbnN0IE1hdCAmQSwgY29uc3QgVmVjICZCLCBWZWMgJkMpCi17Ci0gIEMubm9hbGlhcygpICs9IEEgKiBCOwotfQorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBnZW12KGNvbnN0IE1hdCAmQSwgY29uc3QgVmVjICZCLCBWZWMgJkMpIHsgQy5ub2FsaWFzKCkgKz0gQSAqIEI7IH0KIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICByZXR1cm4gbWFpbl9nZW12KGFyZ2MsIGFyZ3YsIGdlbXYpOwotfQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IHJldHVybiBtYWluX2dlbXYoYXJnYywgYXJndiwgZ2Vtdik7IH0KZGlmZiAtLWdpdCBhL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW12X2NvbW1vbi5oIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbXZfY29tbW9uLmgKaW5kZXggY2MzMjU3Ny4uMTAyZmE3MSAxMDA2NDQKLS0tIGEvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbXZfY29tbW9uLmgKKysrIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbXZfY29tbW9uLmgKQEAgLTEzLDE0ICsxMywxMiBAQAogCiB0eXBlZGVmIFNDQUxBUiBTY2FsYXI7CiAKLXR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IE1hdDsKLXR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+ICAgICAgIFZlYzsKK3R5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gTWF0OwordHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBWZWM7CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+Ci1FSUdFTl9ET05UX0lOTElORQotZG91YmxlIGJlbmNoKGxvbmcgbSwgbG9uZyBuLCBGdW5jICZmKQotewotICBNYXQgQShtLG4pOwordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+CitFSUdFTl9ET05UX0lOTElORSBkb3VibGUgYmVuY2gobG9uZyBtLCBsb25nIG4sIEZ1bmMgJmYpIHsKKyAgTWF0IEEobSwgbik7CiAgIFZlYyBCKG4pOwogICBWZWMgQyhtKTsKICAgQS5zZXRSYW5kb20oKTsKQEAgLTI5LDM4ICsyNywzNCBAQAogCiAgIEJlbmNoVGltZXIgdDsKIAotICBkb3VibGUgdXAgPSAxZTgvc2l6ZW9mKFNjYWxhcik7CisgIGRvdWJsZSB1cCA9IDFlOCAvIHNpemVvZihTY2FsYXIpOwogICBkb3VibGUgdG0wID0gNCwgdG0xID0gMTA7Ci0gIGlmKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCi0gIHsKKyAgaWYgKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpIHsKICAgICB1cCAvPSA0OwogICAgIHRtMCA9IDI7CiAgICAgdG0xID0gNDsKICAgfQogCiAgIGRvdWJsZSBmbG9wcyA9IDIuICogbSAqIG47Ci0gIGxvbmcgcmVwID0gc3RkOjptYXgoMS4sIHN0ZDo6bWluKDEwMC4sIHVwL2Zsb3BzKSApOwotICBsb25nIHRyaWVzID0gc3RkOjptYXgodG0wLCBzdGQ6Om1pbih0bTEsIHVwL2Zsb3BzKSApOworICBsb25nIHJlcCA9IHN0ZDo6bWF4KDEuLCBzdGQ6Om1pbigxMDAuLCB1cCAvIGZsb3BzKSk7CisgIGxvbmcgdHJpZXMgPSBzdGQ6Om1heCh0bTAsIHN0ZDo6bWluKHRtMSwgdXAgLyBmbG9wcykpOwogCi0gIEJFTkNIKHQsIHRyaWVzLCByZXAsIGYoQSxCLEMpKTsKKyAgQkVOQ0godCwgdHJpZXMsIHJlcCwgZihBLCBCLCBDKSk7CiAKICAgcmV0dXJuIDFlLTkgKiByZXAgKiBmbG9wcyAvIHQuYmVzdCgpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jPgotaW50IG1haW5fZ2VtdihpbnQgYXJnYywgY2hhciAqKmFyZ3YsIEZ1bmMmIGYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYz4KK2ludCBtYWluX2dlbXYoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBGdW5jICZmKSB7CiAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gcmVzdWx0czsKIAogICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IHN0ZDo6c3RyaW5nKCJnZW12X3NldHRpbmdzLnR4dCIpOwotICBpZihhcmdjPjEpCi0gICAgZmlsZW5hbWUgPSBzdGQ6OnN0cmluZyhhcmd2WzFdKTsKKyAgaWYgKGFyZ2MgPiAxKSBmaWxlbmFtZSA9IHN0ZDo6c3RyaW5nKGFyZ3ZbMV0pOwogICBzdGQ6Omlmc3RyZWFtIHNldHRpbmdzKGZpbGVuYW1lKTsKICAgbG9uZyBtLCBuOwotICB3aGlsZShzZXR0aW5ncyA+PiBtID4+IG4pCi0gIHsKLSAgICAvL3N0ZDo6Y2VyciA8PCAiICBUZXN0aW5nICIgPDwgbSA8PCAiICIgPDwgbiA8PCBzdGQ6OmVuZGw7Ci0gICAgcmVzdWx0cy5wdXNoX2JhY2soIGJlbmNoKG0sIG4sIGYpICk7CisgIHdoaWxlIChzZXR0aW5ncyA+PiBtID4+IG4pIHsKKyAgICAvLyBzdGQ6OmNlcnIgPDwgIiAgVGVzdGluZyAiIDw8IG0gPDwgIiAiIDw8IG4gPDwgc3RkOjplbmRsOworICAgIHJlc3VsdHMucHVzaF9iYWNrKGJlbmNoKG0sIG4sIGYpKTsKICAgfQogCiAgIHN0ZDo6Y291dCA8PCBSb3dWZWN0b3JYZDo6TWFwKHJlc3VsdHMuZGF0YSgpLCByZXN1bHRzLnNpemUoKSk7CmRpZmYgLS1naXQgYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvZ2VtdnQuY3BwIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2dlbXZ0LmNwcAppbmRleCBmZTk0NTc2Li41OTAwYzUyIDEwMDY0NAotLS0gYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvZ2VtdnQuY3BwCisrKyBiL2JlbmNoL3BlcmZfbW9uaXRvcmluZy9nZW12dC5jcHAKQEAgLTEsMTIgKzEsNSBAQAogI2luY2x1ZGUgImdlbXZfY29tbW9uLmgiCiAKLUVJR0VOX0RPTlRfSU5MSU5FCi12b2lkIGdlbXYoY29uc3QgTWF0ICZBLCBWZWMgJkIsIGNvbnN0IFZlYyAmQykKLXsKLSAgQi5ub2FsaWFzKCkgKz0gQS50cmFuc3Bvc2UoKSAqIEM7Ci19CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGdlbXYoY29uc3QgTWF0ICZBLCBWZWMgJkIsIGNvbnN0IFZlYyAmQykgeyBCLm5vYWxpYXMoKSArPSBBLnRyYW5zcG9zZSgpICogQzsgfQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIHJldHVybiBtYWluX2dlbXYoYXJnYywgYXJndiwgZ2Vtdik7Ci19CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsgcmV0dXJuIG1haW5fZ2VtdihhcmdjLCBhcmd2LCBnZW12KTsgfQpkaWZmIC0tZ2l0IGEvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2xhenlfZ2VtbS5jcHAgYi9iZW5jaC9wZXJmX21vbml0b3JpbmcvbGF6eV9nZW1tLmNwcAppbmRleCA3NzMzMDYwLi4zNDU0YzE5IDEwMDY0NAotLS0gYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvbGF6eV9nZW1tLmNwcAorKysgYi9iZW5jaC9wZXJmX21vbml0b3JpbmcvbGF6eV9nZW1tLmNwcApAQCAtMTEsOTEgKzExLDEwNSBAQAogCiB0eXBlZGVmIFNDQUxBUiBTY2FsYXI7CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdEEsIHR5cGVuYW1lIE1hdEIsIHR5cGVuYW1lIE1hdEM+Ci1FSUdFTl9ET05UX0lOTElORQotdm9pZCBsYXp5X2dlbW0oY29uc3QgTWF0QSAmQSwgY29uc3QgTWF0QiAmQiwgTWF0QyAmQykKLXsKLS8vICAgZXNjYXBlKCh2b2lkKilBLmRhdGEoKSk7Ci0vLyAgIGVzY2FwZSgodm9pZCopQi5kYXRhKCkpOwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdEEsIHR5cGVuYW1lIE1hdEIsIHR5cGVuYW1lIE1hdEM+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGxhenlfZ2VtbShjb25zdCBNYXRBICZBLCBjb25zdCBNYXRCICZCLCBNYXRDICZDKSB7CisgIC8vICAgZXNjYXBlKCh2b2lkKilBLmRhdGEoKSk7CisgIC8vICAgZXNjYXBlKCh2b2lkKilCLmRhdGEoKSk7CiAgIEMubm9hbGlhcygpICs9IEEubGF6eVByb2R1Y3QoQik7Ci0vLyAgIGVzY2FwZSgodm9pZCopQy5kYXRhKCkpOworICAvLyAgIGVzY2FwZSgodm9pZCopQy5kYXRhKCkpOwogfQogCi10ZW1wbGF0ZTxpbnQgbSwgaW50IG4sIGludCBrLCBpbnQgVEE+Ci1FSUdFTl9ET05UX0lOTElORQotZG91YmxlIGJlbmNoKCkKLXsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLG0sayxUQT4gTWF0QTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLGssbj4gTWF0QjsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLG0sbj4gTWF0QzsKK3RlbXBsYXRlIDxpbnQgbSwgaW50IG4sIGludCBrLCBpbnQgVEE+CitFSUdFTl9ET05UX0lOTElORSBkb3VibGUgYmVuY2goKSB7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgbSwgaywgVEE+IE1hdEE7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgaywgbj4gTWF0QjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBtLCBuPiBNYXRDOwogCi0gIE1hdEEgQShtLGspOwotICBNYXRCIEIoayxuKTsKLSAgTWF0QyBDKG0sbik7CisgIE1hdEEgQShtLCBrKTsKKyAgTWF0QiBCKGssIG4pOworICBNYXRDIEMobSwgbik7CiAgIEEuc2V0UmFuZG9tKCk7CiAgIEIuc2V0UmFuZG9tKCk7CiAgIEMuc2V0WmVybygpOwogCiAgIEJlbmNoVGltZXIgdDsKIAotICBkb3VibGUgdXAgPSAxZTcqNC9zaXplb2YoU2NhbGFyKTsKKyAgZG91YmxlIHVwID0gMWU3ICogNCAvIHNpemVvZihTY2FsYXIpOwogICBkb3VibGUgdG0wID0gMTAsIHRtMSA9IDIwOwogCiAgIGRvdWJsZSBmbG9wcyA9IDIuICogbSAqIG4gKiBrOwotICBsb25nIHJlcCA9IHN0ZDo6bWF4KDEwLiwgc3RkOjptaW4oMTAwMDAuLCB1cC9mbG9wcykgKTsKLSAgbG9uZyB0cmllcyA9IHN0ZDo6bWF4KHRtMCwgc3RkOjptaW4odG0xLCB1cC9mbG9wcykgKTsKKyAgbG9uZyByZXAgPSBzdGQ6Om1heCgxMC4sIHN0ZDo6bWluKDEwMDAwLiwgdXAgLyBmbG9wcykpOworICBsb25nIHRyaWVzID0gc3RkOjptYXgodG0wLCBzdGQ6Om1pbih0bTEsIHVwIC8gZmxvcHMpKTsKIAotICBCRU5DSCh0LCB0cmllcywgcmVwLCBsYXp5X2dlbW0oQSxCLEMpKTsKKyAgQkVOQ0godCwgdHJpZXMsIHJlcCwgbGF6eV9nZW1tKEEsIEIsIEMpKTsKIAogICByZXR1cm4gMWUtOSAqIHJlcCAqIGZsb3BzIC8gdC5iZXN0KCk7CiB9CiAKLXRlbXBsYXRlPGludCBtLCBpbnQgbiwgaW50IGs+Ci1kb3VibGUgYmVuY2hfdChpbnQgdCkKLXsKLSAgaWYodCkKLSAgICByZXR1cm4gYmVuY2g8bSxuLGssUm93TWFqb3I+KCk7Cit0ZW1wbGF0ZSA8aW50IG0sIGludCBuLCBpbnQgaz4KK2RvdWJsZSBiZW5jaF90KGludCB0KSB7CisgIGlmICh0KQorICAgIHJldHVybiBiZW5jaDxtLCBuLCBrLCBSb3dNYWpvcj4oKTsKICAgZWxzZQotICAgIHJldHVybiBiZW5jaDxtLG4saywwPigpOworICAgIHJldHVybiBiZW5jaDxtLCBuLCBrLCAwPigpOwogfQogCi1FSUdFTl9ET05UX0lOTElORQotZG91YmxlIGJlbmNoX21uayhpbnQgbSwgaW50IG4sIGludCBrLCBpbnQgdCkKLXsKLSAgaW50IGlkID0gbSoxMDAwMCArIG4qMTAwICsgazsKLSAgc3dpdGNoKGlkKSB7Ci0gICAgY2FzZSAgMTAxMDEgOiByZXR1cm4gYmVuY2hfdDwgMSwgMSwgMT4odCk7IGJyZWFrOwotICAgIGNhc2UgIDIwMjAyIDogcmV0dXJuIGJlbmNoX3Q8IDIsIDIsIDI+KHQpOyBicmVhazsKLSAgICBjYXNlICAzMDMwMyA6IHJldHVybiBiZW5jaF90PCAzLCAzLCAzPih0KTsgYnJlYWs7Ci0gICAgY2FzZSAgNDA0MDQgOiByZXR1cm4gYmVuY2hfdDwgNCwgNCwgND4odCk7IGJyZWFrOwotICAgIGNhc2UgIDUwNTA1IDogcmV0dXJuIGJlbmNoX3Q8IDUsIDUsIDU+KHQpOyBicmVhazsKLSAgICBjYXNlICA2MDYwNiA6IHJldHVybiBiZW5jaF90PCA2LCA2LCA2Pih0KTsgYnJlYWs7Ci0gICAgY2FzZSAgNzA3MDcgOiByZXR1cm4gYmVuY2hfdDwgNywgNywgNz4odCk7IGJyZWFrOwotICAgIGNhc2UgIDgwODA4IDogcmV0dXJuIGJlbmNoX3Q8IDgsIDgsIDg+KHQpOyBicmVhazsKLSAgICBjYXNlICA5MDkwOSA6IHJldHVybiBiZW5jaF90PCA5LCA5LCA5Pih0KTsgYnJlYWs7Ci0gICAgY2FzZSAxMDEwMTAgOiByZXR1cm4gYmVuY2hfdDwxMCwxMCwxMD4odCk7IGJyZWFrOwotICAgIGNhc2UgMTExMTExIDogcmV0dXJuIGJlbmNoX3Q8MTEsMTEsMTE+KHQpOyBicmVhazsKLSAgICBjYXNlIDEyMTIxMiA6IHJldHVybiBiZW5jaF90PDEyLDEyLDEyPih0KTsgYnJlYWs7CitFSUdFTl9ET05UX0lOTElORSBkb3VibGUgYmVuY2hfbW5rKGludCBtLCBpbnQgbiwgaW50IGssIGludCB0KSB7CisgIGludCBpZCA9IG0gKiAxMDAwMCArIG4gKiAxMDAgKyBrOworICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSAxMDEwMToKKyAgICAgIHJldHVybiBiZW5jaF90PDEsIDEsIDE+KHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDIwMjoKKyAgICAgIHJldHVybiBiZW5jaF90PDIsIDIsIDI+KHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMDMwMzoKKyAgICAgIHJldHVybiBiZW5jaF90PDMsIDMsIDM+KHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0MDQwNDoKKyAgICAgIHJldHVybiBiZW5jaF90PDQsIDQsIDQ+KHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1MDUwNToKKyAgICAgIHJldHVybiBiZW5jaF90PDUsIDUsIDU+KHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2MDYwNjoKKyAgICAgIHJldHVybiBiZW5jaF90PDYsIDYsIDY+KHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA3MDcwNzoKKyAgICAgIHJldHVybiBiZW5jaF90PDcsIDcsIDc+KHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4MDgwODoKKyAgICAgIHJldHVybiBiZW5jaF90PDgsIDgsIDg+KHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5MDkwOToKKyAgICAgIHJldHVybiBiZW5jaF90PDksIDksIDk+KHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDEwMTA6CisgICAgICByZXR1cm4gYmVuY2hfdDwxMCwgMTAsIDEwPih0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTExMTExOgorICAgICAgcmV0dXJuIGJlbmNoX3Q8MTEsIDExLCAxMT4odCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyMTIxMjoKKyAgICAgIHJldHVybiBiZW5jaF90PDEyLCAxMiwgMTI+KHQpOworICAgICAgYnJlYWs7CiAgIH0KICAgcmV0dXJuIDA7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewogICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHJlc3VsdHM7Ci0gIAorCiAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gc3RkOjpzdHJpbmcoImxhenlfZ2VtbV9zZXR0aW5ncy50eHQiKTsKLSAgaWYoYXJnYz4xKQotICAgIGZpbGVuYW1lID0gc3RkOjpzdHJpbmcoYXJndlsxXSk7CisgIGlmIChhcmdjID4gMSkgZmlsZW5hbWUgPSBzdGQ6OnN0cmluZyhhcmd2WzFdKTsKICAgc3RkOjppZnN0cmVhbSBzZXR0aW5ncyhmaWxlbmFtZSk7CiAgIGxvbmcgbSwgbiwgaywgdDsKLSAgd2hpbGUoc2V0dGluZ3MgPj4gbSA+PiBuID4+IGsgPj4gdCkKLSAgewotICAgIC8vc3RkOjpjZXJyIDw8ICIgIFRlc3RpbmcgIiA8PCBtIDw8ICIgIiA8PCBuIDw8ICIgIiA8PCBrIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXN1bHRzLnB1c2hfYmFjayggYmVuY2hfbW5rKG0sIG4sIGssIHQpICk7CisgIHdoaWxlIChzZXR0aW5ncyA+PiBtID4+IG4gPj4gayA+PiB0KSB7CisgICAgLy8gc3RkOjpjZXJyIDw8ICIgIFRlc3RpbmcgIiA8PCBtIDw8ICIgIiA8PCBuIDw8ICIgIiA8PCBrIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXN1bHRzLnB1c2hfYmFjayhiZW5jaF9tbmsobSwgbiwgaywgdCkpOwogICB9Ci0gIAorCiAgIHN0ZDo6Y291dCA8PCBSb3dWZWN0b3JYZDo6TWFwKHJlc3VsdHMuZGF0YSgpLCByZXN1bHRzLnNpemUoKSk7Ci0gIAorCiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYmVuY2gvcGVyZl9tb25pdG9yaW5nL2xsdC5jcHAgYi9iZW5jaC9wZXJmX21vbml0b3JpbmcvbGx0LmNwcAppbmRleCBkNTViN2Q4Li4wMTAzYjAwIDEwMDY0NAotLS0gYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvbGx0LmNwcAorKysgYi9iZW5jaC9wZXJmX21vbml0b3JpbmcvbGx0LmNwcApAQCAtMSwxNSArMSwxMCBAQAogI2luY2x1ZGUgImdlbW1fY29tbW9uLmgiCiAjaW5jbHVkZSA8RWlnZW4vQ2hvbGVza3k+CiAKLUVJR0VOX0RPTlRfSU5MSU5FCi12b2lkIGxsdChjb25zdCBNYXQgJkEsIGNvbnN0IE1hdCAmQiwgTWF0ICZDKQoteworRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBsbHQoY29uc3QgTWF0ICZBLCBjb25zdCBNYXQgJkIsIE1hdCAmQykgewogICBDID0gQTsKICAgQy5kaWFnb25hbCgpLmFycmF5KCkgKz0gMTAwMDsKICAgRWlnZW46OmludGVybmFsOjpsbHRfaW5wbGFjZTxNYXQ6OlNjYWxhciwgTG93ZXI+OjpibG9ja2VkKEMpOwogfQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIHJldHVybiBtYWluX2dlbW0oYXJnYywgYXJndiwgbGx0KTsKLX0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeyByZXR1cm4gbWFpbl9nZW1tKGFyZ2MsIGFyZ3YsIGxsdCk7IH0KZGlmZiAtLWdpdCBhL2JlbmNoL3BlcmZfbW9uaXRvcmluZy90cm12X2xvLmNwcCBiL2JlbmNoL3BlcmZfbW9uaXRvcmluZy90cm12X2xvLmNwcAppbmRleCAzZmFiYjZlLi5mZDZlYWYzIDEwMDY0NAotLS0gYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvdHJtdl9sby5jcHAKKysrIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL3RybXZfbG8uY3BwCkBAIC0xLDEyICsxLDUgQEAKICNpbmNsdWRlICJnZW12X2NvbW1vbi5oIgogCi1FSUdFTl9ET05UX0lOTElORQotdm9pZCB0cm12KGNvbnN0IE1hdCAmQSwgY29uc3QgVmVjICZCLCBWZWMgJkMpCi17Ci0gIEMubm9hbGlhcygpICs9IEEudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKiBCOwotfQorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCB0cm12KGNvbnN0IE1hdCAmQSwgY29uc3QgVmVjICZCLCBWZWMgJkMpIHsgQy5ub2FsaWFzKCkgKz0gQS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSAqIEI7IH0KIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICByZXR1cm4gbWFpbl9nZW12KGFyZ2MsIGFyZ3YsIHRybXYpOwotfQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IHJldHVybiBtYWluX2dlbXYoYXJnYywgYXJndiwgdHJtdik7IH0KZGlmZiAtLWdpdCBhL2JlbmNoL3BlcmZfbW9uaXRvcmluZy90cm12X2xvdC5jcHAgYi9iZW5jaC9wZXJmX21vbml0b3JpbmcvdHJtdl9sb3QuY3BwCmluZGV4IDMyZTA4NWEuLmFiYmUwMDMgMTAwNjQ0Ci0tLSBhL2JlbmNoL3BlcmZfbW9uaXRvcmluZy90cm12X2xvdC5jcHAKKysrIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL3RybXZfbG90LmNwcApAQCAtMSwxMiArMSw3IEBACiAjaW5jbHVkZSAiZ2Vtdl9jb21tb24uaCIKIAotRUlHRU5fRE9OVF9JTkxJTkUKLXZvaWQgdHJtdihjb25zdCBNYXQgJkEsIFZlYyAmQiwgY29uc3QgVmVjICZDKQoteworRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCB0cm12KGNvbnN0IE1hdCAmQSwgVmVjICZCLCBjb25zdCBWZWMgJkMpIHsKICAgQi5ub2FsaWFzKCkgKz0gQS50cmFuc3Bvc2UoKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSAqIEM7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgcmV0dXJuIG1haW5fZ2VtdihhcmdjLCBhcmd2LCB0cm12KTsKLX0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeyByZXR1cm4gbWFpbl9nZW12KGFyZ2MsIGFyZ3YsIHRybXYpOyB9CmRpZmYgLS1naXQgYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvdHJtdl91cC5jcHAgYi9iZW5jaC9wZXJmX21vbml0b3JpbmcvdHJtdl91cC5jcHAKaW5kZXggYzU4ZTQ3MS4uOTg5YTNmNyAxMDA2NDQKLS0tIGEvYmVuY2gvcGVyZl9tb25pdG9yaW5nL3RybXZfdXAuY3BwCisrKyBiL2JlbmNoL3BlcmZfbW9uaXRvcmluZy90cm12X3VwLmNwcApAQCAtMSwxMiArMSw1IEBACiAjaW5jbHVkZSAiZ2Vtdl9jb21tb24uaCIKIAotRUlHRU5fRE9OVF9JTkxJTkUKLXZvaWQgdHJtdihjb25zdCBNYXQgJkEsIGNvbnN0IFZlYyAmQiwgVmVjICZDKQotewotICBDLm5vYWxpYXMoKSArPSBBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogQjsKLX0KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJtdihjb25zdCBNYXQgJkEsIGNvbnN0IFZlYyAmQiwgVmVjICZDKSB7IEMubm9hbGlhcygpICs9IEEudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiBCOyB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgcmV0dXJuIG1haW5fZ2VtdihhcmdjLCBhcmd2LCB0cm12KTsKLX0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeyByZXR1cm4gbWFpbl9nZW12KGFyZ2MsIGFyZ3YsIHRybXYpOyB9CmRpZmYgLS1naXQgYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvdHJtdl91cHQuY3BwIGIvYmVuY2gvcGVyZl9tb25pdG9yaW5nL3RybXZfdXB0LmNwcAppbmRleCA1MTFlMDA4Li44MjA5MmQ3IDEwMDY0NAotLS0gYS9iZW5jaC9wZXJmX21vbml0b3JpbmcvdHJtdl91cHQuY3BwCisrKyBiL2JlbmNoL3BlcmZfbW9uaXRvcmluZy90cm12X3VwdC5jcHAKQEAgLTEsMTIgKzEsNyBAQAogI2luY2x1ZGUgImdlbXZfY29tbW9uLmgiCiAKLUVJR0VOX0RPTlRfSU5MSU5FCi12b2lkIHRybXYoY29uc3QgTWF0ICZBLCBWZWMgJkIsIGNvbnN0IFZlYyAmQykKLXsKK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgdHJtdihjb25zdCBNYXQgJkEsIFZlYyAmQiwgY29uc3QgVmVjICZDKSB7CiAgIEIubm9hbGlhcygpICs9IEEudHJhbnNwb3NlKCkudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiBDOwogfQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIHJldHVybiBtYWluX2dlbXYoYXJnYywgYXJndiwgdHJtdik7Ci19CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsgcmV0dXJuIG1haW5fZ2VtdihhcmdjLCBhcmd2LCB0cm12KTsgfQpkaWZmIC0tZ2l0IGEvYmVuY2gvcHJvZHVjdF90aHJlc2hvbGQuY3BwIGIvYmVuY2gvcHJvZHVjdF90aHJlc2hvbGQuY3BwCmluZGV4IGRkNmQxNWEuLmY5NjcxM2MgMTAwNjQ0Ci0tLSBhL2JlbmNoL3Byb2R1Y3RfdGhyZXNob2xkLmNwcAorKysgYi9iZW5jaC9wcm9kdWN0X3RocmVzaG9sZC5jcHAKQEAgLTgsMTM2ICs4LDE1NyBAQAogCiAjZGVmaW5lIEVORCA5CiAKLXRlbXBsYXRlPGludCBTPiBzdHJ1Y3QgbWFwX3NpemUgeyBlbnVtIHsgcmV0ID0gUyB9OyB9OwotdGVtcGxhdGU8PiAgc3RydWN0IG1hcF9zaXplPDEwPiB7IGVudW0geyByZXQgPSAyMCB9OyB9OwotdGVtcGxhdGU8PiAgc3RydWN0IG1hcF9zaXplPDExPiB7IGVudW0geyByZXQgPSA1MCB9OyB9OwotdGVtcGxhdGU8PiAgc3RydWN0IG1hcF9zaXplPDEyPiB7IGVudW0geyByZXQgPSAxMDAgfTsgfTsKLXRlbXBsYXRlPD4gIHN0cnVjdCBtYXBfc2l6ZTwxMz4geyBlbnVtIHsgcmV0ID0gMzAwIH07IH07Cit0ZW1wbGF0ZSA8aW50IFM+CitzdHJ1Y3QgbWFwX3NpemUgeworICBlbnVtIHsgcmV0ID0gUyB9OworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgbWFwX3NpemU8MTA+IHsKKyAgZW51bSB7IHJldCA9IDIwIH07Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBtYXBfc2l6ZTwxMT4geworICBlbnVtIHsgcmV0ID0gNTAgfTsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IG1hcF9zaXplPDEyPiB7CisgIGVudW0geyByZXQgPSAxMDAgfTsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IG1hcF9zaXplPDEzPiB7CisgIGVudW0geyByZXQgPSAzMDAgfTsKK307CiAKLXRlbXBsYXRlPGludCBNLCBpbnQgTixpbnQgSz4gc3RydWN0IGFsdF9wcm9kCi17Cit0ZW1wbGF0ZSA8aW50IE0sIGludCBOLCBpbnQgSz4KK3N0cnVjdCBhbHRfcHJvZCB7CiAgIGVudW0gewotICAgIHJldCA9IE09PTEgJiYgTj09MSA/IElubmVyUHJvZHVjdAotICAgICAgICA6IEs9PTEgPyBPdXRlclByb2R1Y3QKLSAgICAgICAgOiBNPT0xID8gR2VtdlByb2R1Y3QKLSAgICAgICAgOiBOPT0xID8gR2VtdlByb2R1Y3QKLSAgICAgICAgOiBHZW1tUHJvZHVjdAorICAgIHJldCA9IE0gPT0gMSAmJiBOID09IDEgPyBJbm5lclByb2R1Y3QKKyAgICAgICAgICA6IEsgPT0gMSAgICAgICAgID8gT3V0ZXJQcm9kdWN0CisgICAgICAgICAgOiBNID09IDEgICAgICAgICA/IEdlbXZQcm9kdWN0CisgICAgICAgICAgOiBOID09IDEgICAgICAgICA/IEdlbXZQcm9kdWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdlbW1Qcm9kdWN0CiAgIH07CiB9OwotICAgICAgICAKLXZvaWQgcHJpbnRfbW9kZShpbnQgbW9kZSkKLXsKLSAgaWYobW9kZT09SW5uZXJQcm9kdWN0KSBzdGQ6OmNvdXQgPDwgImkiOwotICBpZihtb2RlPT1PdXRlclByb2R1Y3QpIHN0ZDo6Y291dCA8PCAibyI7Ci0gIGlmKG1vZGU9PUNvZWZmQmFzZWRQcm9kdWN0TW9kZSkgc3RkOjpjb3V0IDw8ICJjIjsKLSAgaWYobW9kZT09TGF6eUNvZWZmQmFzZWRQcm9kdWN0TW9kZSkgc3RkOjpjb3V0IDw8ICJsIjsKLSAgaWYobW9kZT09R2VtdlByb2R1Y3QpIHN0ZDo6Y291dCA8PCAidiI7Ci0gIGlmKG1vZGU9PUdlbW1Qcm9kdWN0KSBzdGQ6OmNvdXQgPDwgIm0iOworCit2b2lkIHByaW50X21vZGUoaW50IG1vZGUpIHsKKyAgaWYgKG1vZGUgPT0gSW5uZXJQcm9kdWN0KSBzdGQ6OmNvdXQgPDwgImkiOworICBpZiAobW9kZSA9PSBPdXRlclByb2R1Y3QpIHN0ZDo6Y291dCA8PCAibyI7CisgIGlmIChtb2RlID09IENvZWZmQmFzZWRQcm9kdWN0TW9kZSkgc3RkOjpjb3V0IDw8ICJjIjsKKyAgaWYgKG1vZGUgPT0gTGF6eUNvZWZmQmFzZWRQcm9kdWN0TW9kZSkgc3RkOjpjb3V0IDw8ICJsIjsKKyAgaWYgKG1vZGUgPT0gR2VtdlByb2R1Y3QpIHN0ZDo6Y291dCA8PCAidiI7CisgIGlmIChtb2RlID09IEdlbW1Qcm9kdWN0KSBzdGQ6OmNvdXQgPDwgIm0iOwogfQogCi10ZW1wbGF0ZTxpbnQgTW9kZSwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFJlcz4KLUVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcHJvZChjb25zdCBMaHMmIGEsIGNvbnN0IFJocyYgYiwgUmVzJiBjKQotewotICBjLm5vYWxpYXMoKSArPSB0eXBlbmFtZSBQcm9kdWN0UmV0dXJuVHlwZTxMaHMsUmhzLE1vZGU+OjpUeXBlKGEsYik7Cit0ZW1wbGF0ZSA8aW50IE1vZGUsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBSZXM+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIHByb2QoY29uc3QgTGhzJiBhLCBjb25zdCBSaHMmIGIsIFJlcyYgYykgeworICBjLm5vYWxpYXMoKSArPSB0eXBlbmFtZSBQcm9kdWN0UmV0dXJuVHlwZTxMaHMsIFJocywgTW9kZT46OlR5cGUoYSwgYik7CiB9CiAKLXRlbXBsYXRlPGludCBNLCBpbnQgTiwgaW50IEssIHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGU+Ci1FSUdFTl9ET05UX0lOTElORSB2b2lkIGJlbmNoX3Byb2QoKQotewotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsTSxLPiBMaHM7IExocyBhOyBhLnNldFJhbmRvbSgpOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsSyxOPiBSaHM7IFJocyBiOyBiLnNldFJhbmRvbSgpOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsTSxOPiBSZXM7IFJlcyBjOyBjLnNldFJhbmRvbSgpOwordGVtcGxhdGUgPGludCBNLCBpbnQgTiwgaW50IEssIHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGU+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGJlbmNoX3Byb2QoKSB7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTSwgSz4gTGhzOworICBMaHMgYTsKKyAgYS5zZXRSYW5kb20oKTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBLLCBOPiBSaHM7CisgIFJocyBiOworICBiLnNldFJhbmRvbSgpOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE0sIE4+IFJlczsKKyAgUmVzIGM7CisgIGMuc2V0UmFuZG9tKCk7CiAKICAgQmVuY2hUaW1lciB0OwotICBkb3VibGUgbiA9IDIuKmRvdWJsZShNKSpkb3VibGUoTikqZG91YmxlKEspOwotICBpbnQgcmVwID0gMTAwMDAwLi9uOworICBkb3VibGUgbiA9IDIuICogZG91YmxlKE0pICogZG91YmxlKE4pICogZG91YmxlKEspOworICBpbnQgcmVwID0gMTAwMDAwLiAvIG47CiAgIHJlcCAvPSAyOwotICBpZihyZXA8MSkgcmVwID0gMTsKKyAgaWYgKHJlcCA8IDEpIHJlcCA9IDE7CiAgIGRvIHsKICAgICByZXAgKj0gMjsKICAgICB0LnJlc2V0KCk7Ci0gICAgQkVOQ0godCwxLHJlcCxwcm9kPENvZWZmQmFzZWRQcm9kdWN0TW9kZT4oYSxiLGMpKTsKLSAgfSB3aGlsZSh0LmJlc3QoKTwwLjEpOwotICAKKyAgICBCRU5DSCh0LCAxLCByZXAsIHByb2Q8Q29lZmZCYXNlZFByb2R1Y3RNb2RlPihhLCBiLCBjKSk7CisgIH0gd2hpbGUgKHQuYmVzdCgpIDwgMC4xKTsKKwogICB0LnJlc2V0KCk7Ci0gIEJFTkNIKHQsNSxyZXAscHJvZDxNb2RlPihhLGIsYykpOworICBCRU5DSCh0LCA1LCByZXAsIHByb2Q8TW9kZT4oYSwgYiwgYykpOwogCiAgIHByaW50X21vZGUoTW9kZSk7Ci0gIHN0ZDo6Y291dCA8PCBpbnQoMWUtNipuKnJlcC90LmJlc3QoKSkgPDwgIlx0IjsKKyAgc3RkOjpjb3V0IDw8IGludCgxZS02ICogbiAqIHJlcCAvIHQuYmVzdCgpKSA8PCAiXHQiOwogfQogCi10ZW1wbGF0ZTxpbnQgTj4gc3RydWN0IHByaW50X247Ci10ZW1wbGF0ZTxpbnQgTSwgaW50IE4sIGludCBLPiBzdHJ1Y3QgbG9vcF9vbl9tOwotdGVtcGxhdGU8aW50IE0sIGludCBOLCBpbnQgSywgdHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZT4gc3RydWN0IGxvb3Bfb25fbjsKK3RlbXBsYXRlIDxpbnQgTj4KK3N0cnVjdCBwcmludF9uOwordGVtcGxhdGUgPGludCBNLCBpbnQgTiwgaW50IEs+CitzdHJ1Y3QgbG9vcF9vbl9tOwordGVtcGxhdGUgPGludCBNLCBpbnQgTiwgaW50IEssIHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGU+CitzdHJ1Y3QgbG9vcF9vbl9uOwogCi10ZW1wbGF0ZTxpbnQgTSwgaW50IE4sIGludCBLPgotc3RydWN0IGxvb3Bfb25fawotewotICBzdGF0aWMgdm9pZCBydW4oKQotICB7Cit0ZW1wbGF0ZSA8aW50IE0sIGludCBOLCBpbnQgSz4KK3N0cnVjdCBsb29wX29uX2sgeworICBzdGF0aWMgdm9pZCBydW4oKSB7CiAgICAgc3RkOjpjb3V0IDw8ICJLPSIgPDwgSyA8PCAiXHQiOwogICAgIHByaW50X248Tj46OnJ1bigpOwogICAgIHN0ZDo6Y291dCA8PCAiXG4iOwogCi0gICAgbG9vcF9vbl9tPE0sTixLPjo6cnVuKCk7CisgICAgbG9vcF9vbl9tPE0sIE4sIEs+OjpydW4oKTsKICAgICBzdGQ6OmNvdXQgPDwgIlxuXG4iOwogCi0gICAgbG9vcF9vbl9rPE0sTixLKzE+OjpydW4oKTsKKyAgICBsb29wX29uX2s8TSwgTiwgSyArIDE+OjpydW4oKTsKICAgfQogfTsKIAotdGVtcGxhdGU8aW50IE0sIGludCBOPgotc3RydWN0IGxvb3Bfb25fazxNLE4sRU5EPiB7IHN0YXRpYyB2b2lkIHJ1bigpe30gfTsKK3RlbXBsYXRlIDxpbnQgTSwgaW50IE4+CitzdHJ1Y3QgbG9vcF9vbl9rPE0sIE4sIEVORD4geworICBzdGF0aWMgdm9pZCBydW4oKSB7fQorfTsKIAotCi10ZW1wbGF0ZTxpbnQgTSwgaW50IE4sIGludCBLPgotc3RydWN0IGxvb3Bfb25fbQotewotICBzdGF0aWMgdm9pZCBydW4oKQotICB7Cit0ZW1wbGF0ZSA8aW50IE0sIGludCBOLCBpbnQgSz4KK3N0cnVjdCBsb29wX29uX20geworICBzdGF0aWMgdm9pZCBydW4oKSB7CiAgICAgc3RkOjpjb3V0IDw8IE0gPDwgImZcdCI7Ci0gICAgbG9vcF9vbl9uPE0sTixLLGZsb2F0LENvZWZmQmFzZWRQcm9kdWN0TW9kZT46OnJ1bigpOwotICAgIHN0ZDo6Y291dCA8PCAiXG4iOwotICAgIAotICAgIHN0ZDo6Y291dCA8PCBNIDw8ICJmXHQiOwotICAgIGxvb3Bfb25fbjxNLE4sSyxmbG9hdCwtMT46OnJ1bigpOworICAgIGxvb3Bfb25fbjxNLCBOLCBLLCBmbG9hdCwgQ29lZmZCYXNlZFByb2R1Y3RNb2RlPjo6cnVuKCk7CiAgICAgc3RkOjpjb3V0IDw8ICJcbiI7CiAKLSAgICBsb29wX29uX208TSsxLE4sSz46OnJ1bigpOworICAgIHN0ZDo6Y291dCA8PCBNIDw8ICJmXHQiOworICAgIGxvb3Bfb25fbjxNLCBOLCBLLCBmbG9hdCwgLTE+OjpydW4oKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKworICAgIGxvb3Bfb25fbTxNICsgMSwgTiwgSz46OnJ1bigpOwogICB9CiB9OwogCi10ZW1wbGF0ZTxpbnQgTiwgaW50IEs+Ci1zdHJ1Y3QgbG9vcF9vbl9tPEVORCxOLEs+IHsgc3RhdGljIHZvaWQgcnVuKCl7fSB9OwordGVtcGxhdGUgPGludCBOLCBpbnQgSz4KK3N0cnVjdCBsb29wX29uX208RU5ELCBOLCBLPiB7CisgIHN0YXRpYyB2b2lkIHJ1bigpIHt9Cit9OwogCi10ZW1wbGF0ZTxpbnQgTSwgaW50IE4sIGludCBLLCB0eXBlbmFtZSBTY2FsYXIsIGludCBNb2RlPgotc3RydWN0IGxvb3Bfb25fbgotewotICBzdGF0aWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmVuY2hfcHJvZDxNLE4sSyxTY2FsYXIsTW9kZT09LTE/IGFsdF9wcm9kPE0sTixLPjo6cmV0IDogTW9kZT4oKTsKLSAgICAKLSAgICBsb29wX29uX248TSxOKzEsSyxTY2FsYXIsTW9kZT46OnJ1bigpOwordGVtcGxhdGUgPGludCBNLCBpbnQgTiwgaW50IEssIHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGU+CitzdHJ1Y3QgbG9vcF9vbl9uIHsKKyAgc3RhdGljIHZvaWQgcnVuKCkgeworICAgIGJlbmNoX3Byb2Q8TSwgTiwgSywgU2NhbGFyLCBNb2RlID09IC0xID8gYWx0X3Byb2Q8TSwgTiwgSz46OnJldCA6IE1vZGU+KCk7CisKKyAgICBsb29wX29uX248TSwgTiArIDEsIEssIFNjYWxhciwgTW9kZT46OnJ1bigpOwogICB9CiB9OwogCi10ZW1wbGF0ZTxpbnQgTSwgaW50IEssIHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGU+Ci1zdHJ1Y3QgbG9vcF9vbl9uPE0sRU5ELEssU2NhbGFyLE1vZGU+IHsgc3RhdGljIHZvaWQgcnVuKCl7fSB9OwordGVtcGxhdGUgPGludCBNLCBpbnQgSywgdHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZT4KK3N0cnVjdCBsb29wX29uX248TSwgRU5ELCBLLCBTY2FsYXIsIE1vZGU+IHsKKyAgc3RhdGljIHZvaWQgcnVuKCkge30KK307CiAKLXRlbXBsYXRlPGludCBOPiBzdHJ1Y3QgcHJpbnRfbgotewotICBzdGF0aWMgdm9pZCBydW4oKQotICB7Cit0ZW1wbGF0ZSA8aW50IE4+CitzdHJ1Y3QgcHJpbnRfbiB7CisgIHN0YXRpYyB2b2lkIHJ1bigpIHsKICAgICBzdGQ6OmNvdXQgPDwgbWFwX3NpemU8Tj46OnJldCA8PCAiXHQiOwotICAgIHByaW50X248TisxPjo6cnVuKCk7CisgICAgcHJpbnRfbjxOICsgMT46OnJ1bigpOwogICB9CiB9OwogCi10ZW1wbGF0ZTw+IHN0cnVjdCBwcmludF9uPEVORD4geyBzdGF0aWMgdm9pZCBydW4oKXt9IH07Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IHByaW50X248RU5EPiB7CisgIHN0YXRpYyB2b2lkIHJ1bigpIHt9Cit9OwogCi1pbnQgbWFpbigpCi17Ci0gIGxvb3Bfb25fazwxLDEsMT46OnJ1bigpOwotICAKLSAgcmV0dXJuIDA7IAoraW50IG1haW4oKSB7CisgIGxvb3Bfb25fazwxLCAxLCAxPjo6cnVuKCk7CisKKyAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9iZW5jaC9xdWF0X3NsZXJwLmNwcCBiL2JlbmNoL3F1YXRfc2xlcnAuY3BwCmluZGV4IGJmZmIzYmYuLjQwOGYzMDggMTAwNjQ0Ci0tLSBhL2JlbmNoL3F1YXRfc2xlcnAuY3BwCisrKyBiL2JlbmNoL3F1YXRfc2xlcnAuY3BwCkBAIC01LDIzNyArNSwyMTEgQEAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBRPgotRUlHRU5fRE9OVF9JTkxJTkUgUSBubGVycChjb25zdCBRJiBhLCBjb25zdCBRJiBiLCB0eXBlbmFtZSBROjpTY2FsYXIgdCkKLXsKLSAgcmV0dXJuIFEoKGEuY29lZmZzKCkgKiAoMS4wLXQpICsgYi5jb2VmZnMoKSAqIHQpLm5vcm1hbGl6ZWQoKSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUT4KK0VJR0VOX0RPTlRfSU5MSU5FIFEgbmxlcnAoY29uc3QgUSYgYSwgY29uc3QgUSYgYiwgdHlwZW5hbWUgUTo6U2NhbGFyIHQpIHsKKyAgcmV0dXJuIFEoKGEuY29lZmZzKCkgKiAoMS4wIC0gdCkgKyBiLmNvZWZmcygpICogdCkubm9ybWFsaXplZCgpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgUT4KLUVJR0VOX0RPTlRfSU5MSU5FIFEgc2xlcnBfZWlnZW4oY29uc3QgUSYgYSwgY29uc3QgUSYgYiwgdHlwZW5hbWUgUTo6U2NhbGFyIHQpCi17Ci0gIHJldHVybiBhLnNsZXJwKHQsYik7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUT4KK0VJR0VOX0RPTlRfSU5MSU5FIFEgc2xlcnBfZWlnZW4oY29uc3QgUSYgYSwgY29uc3QgUSYgYiwgdHlwZW5hbWUgUTo6U2NhbGFyIHQpIHsKKyAgcmV0dXJuIGEuc2xlcnAodCwgYik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFE+Ci1FSUdFTl9ET05UX0lOTElORSBRIHNsZXJwX2xlZ2FjeShjb25zdCBRJiBhLCBjb25zdCBRJiBiLCB0eXBlbmFtZSBROjpTY2FsYXIgdCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBRPgorRUlHRU5fRE9OVF9JTkxJTkUgUSBzbGVycF9sZWdhY3koY29uc3QgUSYgYSwgY29uc3QgUSYgYiwgdHlwZW5hbWUgUTo6U2NhbGFyIHQpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBROjpTY2FsYXIgU2NhbGFyOwogICBzdGF0aWMgY29uc3QgU2NhbGFyIG9uZSA9IFNjYWxhcigxKSAtIGR1bW15X3ByZWNpc2lvbjxTY2FsYXI+KCk7CiAgIFNjYWxhciBkID0gYS5kb3QoYik7CiAgIFNjYWxhciBhYnNEID0gaW50ZXJuYWw6OmFicyhkKTsKLSAgaWYgKGFic0Q+PW9uZSkKLSAgICByZXR1cm4gYTsKKyAgaWYgKGFic0QgPj0gb25lKSByZXR1cm4gYTsKIAogICAvLyB0aGV0YSBpcyB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgMiBxdWF0ZXJuaW9ucwogICBTY2FsYXIgdGhldGEgPSBzdGQ6OmFjb3MoYWJzRCk7CiAgIFNjYWxhciBzaW5UaGV0YSA9IGludGVybmFsOjpzaW4odGhldGEpOwogCi0gIFNjYWxhciBzY2FsZTAgPSBpbnRlcm5hbDo6c2luKCAoIFNjYWxhcigxKSAtIHQgKSAqIHRoZXRhKSAvIHNpblRoZXRhOwotICBTY2FsYXIgc2NhbGUxID0gaW50ZXJuYWw6OnNpbiggKCB0ICogdGhldGEpICkgLyBzaW5UaGV0YTsKLSAgaWYgKGQ8MCkKLSAgICBzY2FsZTEgPSAtc2NhbGUxOworICBTY2FsYXIgc2NhbGUwID0gaW50ZXJuYWw6OnNpbigoU2NhbGFyKDEpIC0gdCkgKiB0aGV0YSkgLyBzaW5UaGV0YTsKKyAgU2NhbGFyIHNjYWxlMSA9IGludGVybmFsOjpzaW4oKHQgKiB0aGV0YSkpIC8gc2luVGhldGE7CisgIGlmIChkIDwgMCkgc2NhbGUxID0gLXNjYWxlMTsKIAogICByZXR1cm4gUShzY2FsZTAgKiBhLmNvZWZmcygpICsgc2NhbGUxICogYi5jb2VmZnMoKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFE+Ci1FSUdFTl9ET05UX0lOTElORSBRIHNsZXJwX2xlZ2FjeV9ubGVycChjb25zdCBRJiBhLCBjb25zdCBRJiBiLCB0eXBlbmFtZSBROjpTY2FsYXIgdCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBRPgorRUlHRU5fRE9OVF9JTkxJTkUgUSBzbGVycF9sZWdhY3lfbmxlcnAoY29uc3QgUSYgYSwgY29uc3QgUSYgYiwgdHlwZW5hbWUgUTo6U2NhbGFyIHQpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBROjpTY2FsYXIgU2NhbGFyOwogICBzdGF0aWMgY29uc3QgU2NhbGFyIG9uZSA9IFNjYWxhcigxKSAtIGVwc2lsb248U2NhbGFyPigpOwogICBTY2FsYXIgZCA9IGEuZG90KGIpOwogICBTY2FsYXIgYWJzRCA9IGludGVybmFsOjphYnMoZCk7Ci0gIAorCiAgIFNjYWxhciBzY2FsZTA7CiAgIFNjYWxhciBzY2FsZTE7Ci0gIAotICBpZiAoYWJzRD49b25lKQotICB7CisKKyAgaWYgKGFic0QgPj0gb25lKSB7CiAgICAgc2NhbGUwID0gU2NhbGFyKDEpIC0gdDsKICAgICBzY2FsZTEgPSB0OwotICB9Ci0gIGVsc2UKLSAgeworICB9IGVsc2UgewogICAgIC8vIHRoZXRhIGlzIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSAyIHF1YXRlcm5pb25zCiAgICAgU2NhbGFyIHRoZXRhID0gc3RkOjphY29zKGFic0QpOwogICAgIFNjYWxhciBzaW5UaGV0YSA9IGludGVybmFsOjpzaW4odGhldGEpOwogCi0gICAgc2NhbGUwID0gaW50ZXJuYWw6OnNpbiggKCBTY2FsYXIoMSkgLSB0ICkgKiB0aGV0YSkgLyBzaW5UaGV0YTsKLSAgICBzY2FsZTEgPSBpbnRlcm5hbDo6c2luKCAoIHQgKiB0aGV0YSkgKSAvIHNpblRoZXRhOwotICAgIGlmIChkPDApCi0gICAgICBzY2FsZTEgPSAtc2NhbGUxOworICAgIHNjYWxlMCA9IGludGVybmFsOjpzaW4oKFNjYWxhcigxKSAtIHQpICogdGhldGEpIC8gc2luVGhldGE7CisgICAgc2NhbGUxID0gaW50ZXJuYWw6OnNpbigodCAqIHRoZXRhKSkgLyBzaW5UaGV0YTsKKyAgICBpZiAoZCA8IDApIHNjYWxlMSA9IC1zY2FsZTE7CiAgIH0KIAogICByZXR1cm4gUShzY2FsZTAgKiBhLmNvZWZmcygpICsgc2NhbGUxICogYi5jb2VmZnMoKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgVCBzaW5fb3Zlcl94KFQgeCkKLXsKLSAgaWYgKFQoMSkgKyB4KnggPT0gVCgxKSkKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIFQgc2luX292ZXJfeChUIHgpIHsKKyAgaWYgKFQoMSkgKyB4ICogeCA9PSBUKDEpKQogICAgIHJldHVybiBUKDEpOwogICBlbHNlCi0gICAgcmV0dXJuIHN0ZDo6c2luKHgpL3g7CisgICAgcmV0dXJuIHN0ZDo6c2luKHgpIC8geDsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgUT4KLUVJR0VOX0RPTlRfSU5MSU5FIFEgc2xlcnBfcncoY29uc3QgUSYgYSwgY29uc3QgUSYgYiwgdHlwZW5hbWUgUTo6U2NhbGFyIHQpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUT4KK0VJR0VOX0RPTlRfSU5MSU5FIFEgc2xlcnBfcncoY29uc3QgUSYgYSwgY29uc3QgUSYgYiwgdHlwZW5hbWUgUTo6U2NhbGFyIHQpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBROjpTY2FsYXIgU2NhbGFyOwotICAKKwogICBTY2FsYXIgZCA9IGEuZG90KGIpOwogICBTY2FsYXIgdGhldGE7Ci0gIGlmIChkPDAuMCkKLSAgICB0aGV0YSA9IC8qTV9QSSAtKi8gU2NhbGFyKDIpKnN0ZDo6YXNpbiggKGEuY29lZmZzKCkrYi5jb2VmZnMoKSkubm9ybSgpLzIgKTsKKyAgaWYgKGQgPCAwLjApCisgICAgdGhldGEgPSAvKk1fUEkgLSovIFNjYWxhcigyKSAqIHN0ZDo6YXNpbigoYS5jb2VmZnMoKSArIGIuY29lZmZzKCkpLm5vcm0oKSAvIDIpOwogICBlbHNlCi0gICAgdGhldGEgPSBTY2FsYXIoMikqc3RkOjphc2luKCAoYS5jb2VmZnMoKS1iLmNvZWZmcygpKS5ub3JtKCkvMiApOwotICAKKyAgICB0aGV0YSA9IFNjYWxhcigyKSAqIHN0ZDo6YXNpbigoYS5jb2VmZnMoKSAtIGIuY29lZmZzKCkpLm5vcm0oKSAvIDIpOworCiAgIC8vIHRoZXRhIGlzIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSAyIHF1YXRlcm5pb25zCi0vLyAgIFNjYWxhciB0aGV0YSA9IHN0ZDo6YWNvcyhhYnNEKTsKKyAgLy8gICBTY2FsYXIgdGhldGEgPSBzdGQ6OmFjb3MoYWJzRCk7CiAgIFNjYWxhciBzaW5PdmVyVGhldGEgPSBzaW5fb3Zlcl94KHRoZXRhKTsKIAotICBTY2FsYXIgc2NhbGUwID0gKFNjYWxhcigxKS10KSpzaW5fb3Zlcl94KCAoIFNjYWxhcigxKSAtIHQgKSAqIHRoZXRhKSAvIHNpbk92ZXJUaGV0YTsKLSAgU2NhbGFyIHNjYWxlMSA9IHQgKiBzaW5fb3Zlcl94KCAoIHQgKiB0aGV0YSkgKSAvIHNpbk92ZXJUaGV0YTsKLSAgaWYgKGQ8MCkKLSAgICBzY2FsZTEgPSAtc2NhbGUxOworICBTY2FsYXIgc2NhbGUwID0gKFNjYWxhcigxKSAtIHQpICogc2luX292ZXJfeCgoU2NhbGFyKDEpIC0gdCkgKiB0aGV0YSkgLyBzaW5PdmVyVGhldGE7CisgIFNjYWxhciBzY2FsZTEgPSB0ICogc2luX292ZXJfeCgodCAqIHRoZXRhKSkgLyBzaW5PdmVyVGhldGE7CisgIGlmIChkIDwgMCkgc2NhbGUxID0gLXNjYWxlMTsKIAogICByZXR1cm4gUXVhdGVybmlvbjxTY2FsYXI+KHNjYWxlMCAqIGEuY29lZmZzKCkgKyBzY2FsZTEgKiBiLmNvZWZmcygpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgUT4KLUVJR0VOX0RPTlRfSU5MSU5FIFEgc2xlcnBfZ2FlbChjb25zdCBRJiBhLCBjb25zdCBRJiBiLCB0eXBlbmFtZSBROjpTY2FsYXIgdCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBRPgorRUlHRU5fRE9OVF9JTkxJTkUgUSBzbGVycF9nYWVsKGNvbnN0IFEmIGEsIGNvbnN0IFEmIGIsIHR5cGVuYW1lIFE6OlNjYWxhciB0KSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgUTo6U2NhbGFyIFNjYWxhcjsKLSAgCisKICAgU2NhbGFyIGQgPSBhLmRvdChiKTsKICAgU2NhbGFyIHRoZXRhOwotLy8gICB0aGV0YSA9IFNjYWxhcigyKSAqIGF0YW4yKChhLmNvZWZmcygpLWIuY29lZmZzKCkpLm5vcm0oKSwoYS5jb2VmZnMoKStiLmNvZWZmcygpKS5ub3JtKCkpOwotLy8gICBpZiAoZDwwLjApCi0vLyAgICAgdGhldGEgPSBNX1BJLXRoZXRhOwotICAKLSAgaWYgKGQ8MC4wKQotICAgIHRoZXRhID0gLypNX1BJIC0qLyBTY2FsYXIoMikqc3RkOjphc2luKCAoLWEuY29lZmZzKCktYi5jb2VmZnMoKSkubm9ybSgpLzIgKTsKKyAgLy8gICB0aGV0YSA9IFNjYWxhcigyKSAqIGF0YW4yKChhLmNvZWZmcygpLWIuY29lZmZzKCkpLm5vcm0oKSwoYS5jb2VmZnMoKStiLmNvZWZmcygpKS5ub3JtKCkpOworICAvLyAgIGlmIChkPDAuMCkKKyAgLy8gICAgIHRoZXRhID0gTV9QSS10aGV0YTsKKworICBpZiAoZCA8IDAuMCkKKyAgICB0aGV0YSA9IC8qTV9QSSAtKi8gU2NhbGFyKDIpICogc3RkOjphc2luKCgtYS5jb2VmZnMoKSAtIGIuY29lZmZzKCkpLm5vcm0oKSAvIDIpOwogICBlbHNlCi0gICAgdGhldGEgPSBTY2FsYXIoMikqc3RkOjphc2luKCAoYS5jb2VmZnMoKS1iLmNvZWZmcygpKS5ub3JtKCkvMiApOwotICAKLSAgCisgICAgdGhldGEgPSBTY2FsYXIoMikgKiBzdGQ6OmFzaW4oKGEuY29lZmZzKCkgLSBiLmNvZWZmcygpKS5ub3JtKCkgLyAyKTsKKwogICBTY2FsYXIgc2NhbGUwOwogICBTY2FsYXIgc2NhbGUxOwotICBpZih0aGV0YSp0aGV0YS1TY2FsYXIoNik9PS1TY2FsYXIoNikpCi0gIHsKKyAgaWYgKHRoZXRhICogdGhldGEgLSBTY2FsYXIoNikgPT0gLVNjYWxhcig2KSkgewogICAgIHNjYWxlMCA9IFNjYWxhcigxKSAtIHQ7CiAgICAgc2NhbGUxID0gdDsKLSAgfQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICBTY2FsYXIgc2luVGhldGEgPSBzdGQ6OnNpbih0aGV0YSk7Ci0gICAgc2NhbGUwID0gaW50ZXJuYWw6OnNpbiggKCBTY2FsYXIoMSkgLSB0ICkgKiB0aGV0YSkgLyBzaW5UaGV0YTsKLSAgICBzY2FsZTEgPSBpbnRlcm5hbDo6c2luKCAoIHQgKiB0aGV0YSkgKSAvIHNpblRoZXRhOwotICAgIGlmIChkPDApCi0gICAgICBzY2FsZTEgPSAtc2NhbGUxOworICAgIHNjYWxlMCA9IGludGVybmFsOjpzaW4oKFNjYWxhcigxKSAtIHQpICogdGhldGEpIC8gc2luVGhldGE7CisgICAgc2NhbGUxID0gaW50ZXJuYWw6OnNpbigodCAqIHRoZXRhKSkgLyBzaW5UaGV0YTsKKyAgICBpZiAoZCA8IDApIHNjYWxlMSA9IC1zY2FsZTE7CiAgIH0KIAogICByZXR1cm4gUXVhdGVybmlvbjxTY2FsYXI+KHNjYWxlMCAqIGEuY29lZmZzKCkgKyBzY2FsZTEgKiBiLmNvZWZmcygpKTsKIH0KIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIHR5cGVkZWYgZG91YmxlIFJlZlNjYWxhcjsKICAgdHlwZWRlZiBmbG9hdCBUZXN0U2NhbGFyOwotICAKLSAgdHlwZWRlZiBRdWF0ZXJuaW9uPFJlZlNjYWxhcj4gIFFkOworCisgIHR5cGVkZWYgUXVhdGVybmlvbjxSZWZTY2FsYXI+IFFkOwogICB0eXBlZGVmIFF1YXRlcm5pb248VGVzdFNjYWxhcj4gUWY7Ci0gIAotICB1bnNpZ25lZCBpbnQgZ19zZWVkID0gKHVuc2lnbmVkIGludCkgdGltZShOVUxMKTsKKworICB1bnNpZ25lZCBpbnQgZ19zZWVkID0gKHVuc2lnbmVkIGludCl0aW1lKE5VTEwpOwogICBzdGQ6OmNvdXQgPDwgZ19zZWVkIDw8ICJcbiI7Ci0vLyAgIGdfc2VlZCA9IDEyNTk5MzI0OTY7CisgIC8vICAgZ19zZWVkID0gMTI1OTkzMjQ5NjsKICAgc3JhbmQoZ19zZWVkKTsKLSAgCi0gIE1hdHJpeDxSZWZTY2FsYXIsRHluYW1pYywxPiBtYXhlcnIoNyk7CisKKyAgTWF0cml4PFJlZlNjYWxhciwgRHluYW1pYywgMT4gbWF4ZXJyKDcpOwogICBtYXhlcnIuc2V0WmVybygpOwotICAKLSAgTWF0cml4PFJlZlNjYWxhcixEeW5hbWljLDE+IGF2Z2Vycig3KTsKKworICBNYXRyaXg8UmVmU2NhbGFyLCBEeW5hbWljLCAxPiBhdmdlcnIoNyk7CiAgIGF2Z2Vyci5zZXRaZXJvKCk7Ci0gIAotICBjb3V0IDw8ICJkb3VibGU9PmZsb2F0PT5kb3VibGUgICAgICAgbmxlcnAgICAgICAgIGVpZ2VuICAgICAgICBsZWdhY3koc25hcCkgICAgICAgICBsZWdhY3kobmxlcnApICAgICAgICByaWdodHdheSAgICAgICAgIGdhZWwncyBjcml0ZXJpYVxuIjsKLSAgCisKKyAgY291dCA8PCAiZG91YmxlPT5mbG9hdD0+ZG91YmxlICAgICAgIG5sZXJwICAgICAgICBlaWdlbiAgICAgICAgbGVnYWN5KHNuYXApICAgICAgICAgbGVnYWN5KG5sZXJwKSAgICAgICAgcmlnaHR3YXkgICAgIgorICAgICAgICAgICIgICAgIGdhZWwncyBjcml0ZXJpYVxuIjsKKwogICBpbnQgcmVwID0gMTAwOwogICBpbnQgaXRlcnMgPSA0MDsKLSAgZm9yIChpbnQgdz0wOyB3PHJlcDsgKyt3KQotICB7CisgIGZvciAoaW50IHcgPSAwOyB3IDwgcmVwOyArK3cpIHsKICAgICBRZiBhLCBiOwogICAgIGEuY29lZmZzKCkuc2V0UmFuZG9tKCk7CiAgICAgYS5ub3JtYWxpemUoKTsKICAgICBiLmNvZWZmcygpLnNldFJhbmRvbSgpOwogICAgIGIubm9ybWFsaXplKCk7Ci0gICAgCisKICAgICBRZiBjWzZdOwotICAgIAorCiAgICAgUWQgYXIoYS5jYXN0PFJlZlNjYWxhcj4oKSk7CiAgICAgUWQgYnIoYi5jYXN0PFJlZlNjYWxhcj4oKSk7CiAgICAgUWQgY3I7Ci0gICAgCi0gICAgCi0gICAgCisKICAgICBjb3V0LnByZWNpc2lvbig4KTsKICAgICBjb3V0IDw8IHN0ZDo6c2NpZW50aWZpYzsKLSAgICBmb3IgKGludCBpPTA7IGk8aXRlcnM7ICsraSkKLSAgICB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyczsgKytpKSB7CiAgICAgICBSZWZTY2FsYXIgdCA9IDAuNjU7Ci0gICAgICBjciA9IHNsZXJwX3J3KGFyLGJyLHQpOwotICAgICAgCisgICAgICBjciA9IHNsZXJwX3J3KGFyLCBiciwgdCk7CisKICAgICAgIFFmIHJlZmMgPSBjci5jYXN0PFRlc3RTY2FsYXI+KCk7Ci0gICAgICBjWzBdID0gbmxlcnAoYSxiLHQpOwotICAgICAgY1sxXSA9IHNsZXJwX2VpZ2VuKGEsYix0KTsKLSAgICAgIGNbMl0gPSBzbGVycF9sZWdhY3koYSxiLHQpOwotICAgICAgY1szXSA9IHNsZXJwX2xlZ2FjeV9ubGVycChhLGIsdCk7Ci0gICAgICBjWzRdID0gc2xlcnBfcncoYSxiLHQpOwotICAgICAgY1s1XSA9IHNsZXJwX2dhZWwoYSxiLHQpOwotICAgICAgCisgICAgICBjWzBdID0gbmxlcnAoYSwgYiwgdCk7CisgICAgICBjWzFdID0gc2xlcnBfZWlnZW4oYSwgYiwgdCk7CisgICAgICBjWzJdID0gc2xlcnBfbGVnYWN5KGEsIGIsIHQpOworICAgICAgY1szXSA9IHNsZXJwX2xlZ2FjeV9ubGVycChhLCBiLCB0KTsKKyAgICAgIGNbNF0gPSBzbGVycF9ydyhhLCBiLCB0KTsKKyAgICAgIGNbNV0gPSBzbGVycF9nYWVsKGEsIGIsIHQpOworCiAgICAgICBWZWN0b3JYZCBlcnIoNyk7Ci0gICAgICBlcnJbMF0gPSAoY3IuY29lZmZzKCktcmVmYy5jYXN0PFJlZlNjYWxhcj4oKS5jb2VmZnMoKSkubm9ybSgpOwotLy8gICAgICAgc3RkOjpjb3V0IDw8IGVyclswXSA8PCAiICAgICI7Ci0gICAgICBmb3IgKGludCBrPTA7IGs8NjsgKytrKQotICAgICAgewotICAgICAgICBlcnJbaysxXSA9IChjW2tdLmNvZWZmcygpLXJlZmMuY29lZmZzKCkpLm5vcm0oKTsKLS8vICAgICAgICAgc3RkOjpjb3V0IDw8IGVycltrKzFdIDw8ICIgICAgIjsKKyAgICAgIGVyclswXSA9IChjci5jb2VmZnMoKSAtIHJlZmMuY2FzdDxSZWZTY2FsYXI+KCkuY29lZmZzKCkpLm5vcm0oKTsKKyAgICAgIC8vICAgICAgIHN0ZDo6Y291dCA8PCBlcnJbMF0gPDwgIiAgICAiOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA2OyArK2spIHsKKyAgICAgICAgZXJyW2sgKyAxXSA9IChjW2tdLmNvZWZmcygpIC0gcmVmYy5jb2VmZnMoKSkubm9ybSgpOworICAgICAgICAvLyAgICAgICAgIHN0ZDo6Y291dCA8PCBlcnJbaysxXSA8PCAiICAgICI7CiAgICAgICB9CiAgICAgICBtYXhlcnIgPSBtYXhlcnIuY3dpc2UoKS5tYXgoZXJyKTsKICAgICAgIGF2Z2VyciArPSBlcnI7Ci0vLyAgICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICAgIC8vICAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOwogICAgICAgYiA9IGNyLmNhc3Q8VGVzdFNjYWxhcj4oKTsKICAgICAgIGJyID0gY3I7CiAgICAgfQotLy8gICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICAgIC8vICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKICAgfQotICBhdmdlcnIgLz0gUmVmU2NhbGFyKHJlcCppdGVycyk7CisgIGF2Z2VyciAvPSBSZWZTY2FsYXIocmVwICogaXRlcnMpOwogICBjb3V0IDw8ICJcblxuQWNjdXJhY3k6XG4iCiAgICAgICAgPDwgIiAgbWF4OiAiIDw8IG1heGVyci50cmFuc3Bvc2UoKSA8PCAiXG4iOwogICBjb3V0IDw8ICIgIGF2ZzogIiA8PCBhdmdlcnIudHJhbnNwb3NlKCkgPDwgIlxuIjsKLSAgCisKICAgLy8gcGVyZiBiZW5jaAotICBRdWF0ZXJuaW9uZiBhLGI7CisgIFF1YXRlcm5pb25mIGEsIGI7CiAgIGEuY29lZmZzKCkuc2V0UmFuZG9tKCk7CiAgIGEubm9ybWFsaXplKCk7CiAgIGIuY29lZmZzKCkuc2V0UmFuZG9tKCk7CiAgIGIubm9ybWFsaXplKCk7Ci0gIC8vYiA9IGE7CisgIC8vIGIgPSBhOwogICBmbG9hdCBzID0gMC42NTsKLSAgICAKLSAgI2RlZmluZSBCRU5DSChGVU5DKSB7XAotICAgIEJlbmNoVGltZXIgdDsgXAotICAgIGZvcihpbnQgaz0wOyBrPDI7ICsraykge1wKLSAgICAgIHQuc3RhcnQoKTsgXAotICAgICAgZm9yKGludCBpPTA7IGk8MTAwMDAwMDsgKytpKSBcCi0gICAgICAgIEZVTkMoYSxiLHMpOyBcCi0gICAgICB0LnN0b3AoKTsgXAotICAgIH0gXAorCisjZGVmaW5lIEJFTkNIKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJlbmNoVGltZXIgdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHQuc3RhcnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDAwOyArK2kpIEZVTkMoYSwgYiwgcyk7ICAgICAgICBcCisgICAgICB0LnN0b3AoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGNvdXQgPDwgIiAgIiA8PCAjRlVOQyA8PCAiID0+IFx0ICIgPDwgdC52YWx1ZSgpIDw8ICJzXG4iOyBcCiAgIH0KLSAgCisKICAgY291dCA8PCAiXG5TcGVlZDpcbiIgPDwgc3RkOjpmaXhlZDsKICAgQkVOQ0gobmxlcnApOwogICBCRU5DSChzbGVycF9laWdlbik7CkBAIC0yNDQsNCArMjE4LDMgQEAKICAgQkVOQ0goc2xlcnBfcncpOwogICBCRU5DSChzbGVycF9nYWVsKTsKIH0KLQpkaWZmIC0tZ2l0IGEvYmVuY2gvcXVhdG11bC5jcHAgYi9iZW5jaC9xdWF0bXVsLmNwcAppbmRleCA4ZDlkNzkyLi4yMTdjMDljIDEwMDY0NAotLS0gYS9iZW5jaC9xdWF0bXVsLmNwcAorKysgYi9iZW5jaC9xdWF0bXVsLmNwcApAQCAtMyw0NSArMyw0MiBAQAogI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgogI2luY2x1ZGUgPGJlbmNoL0JlbmNoVGltZXIuaD4KIAotdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOyAKK3VzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdGVtcGxhdGU8dHlwZW5hbWUgUXVhdD4KLUVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcXVhdG11bF9kZWZhdWx0KGNvbnN0IFF1YXQmIGEsIGNvbnN0IFF1YXQmIGIsIFF1YXQmIGMpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUXVhdD4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgcXVhdG11bF9kZWZhdWx0KGNvbnN0IFF1YXQmIGEsIGNvbnN0IFF1YXQmIGIsIFF1YXQmIGMpIHsKICAgYyA9IGEgKiBiOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBRdWF0PgotRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBxdWF0bXVsX25vdmVjKGNvbnN0IFF1YXQmIGEsIGNvbnN0IFF1YXQmIGIsIFF1YXQmIGMpCi17Ci0gIGMgPSBpbnRlcm5hbDo6cXVhdF9wcm9kdWN0PDAsIFF1YXQsIFF1YXQsIHR5cGVuYW1lIFF1YXQ6OlNjYWxhciwgQWxpZ25lZD46OnJ1bihhLGIpOwordGVtcGxhdGUgPHR5cGVuYW1lIFF1YXQ+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIHF1YXRtdWxfbm92ZWMoY29uc3QgUXVhdCYgYSwgY29uc3QgUXVhdCYgYiwgUXVhdCYgYykgeworICBjID0gaW50ZXJuYWw6OnF1YXRfcHJvZHVjdDwwLCBRdWF0LCBRdWF0LCB0eXBlbmFtZSBRdWF0OjpTY2FsYXIsIEFsaWduZWQ+OjpydW4oYSwgYik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFF1YXQ+IHZvaWQgYmVuY2goY29uc3Qgc3RkOjpzdHJpbmcmIGxhYmVsKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFF1YXQ+Cit2b2lkIGJlbmNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBsYWJlbCkgewogICBpbnQgdHJpZXMgPSAxMDsKICAgaW50IHJlcCA9IDEwMDAwMDA7CiAgIEJlbmNoVGltZXIgdDsKLSAgCisKICAgUXVhdCBhKDQsIDEsIDIsIDMpOwogICBRdWF0IGIoMiwgMywgNCwgNSk7CiAgIFF1YXQgYzsKLSAgCisKICAgc3RkOjpjb3V0LnByZWNpc2lvbigzKTsKLSAgCi0gIEJFTkNIKHQsIHRyaWVzLCByZXAsIHF1YXRtdWxfZGVmYXVsdChhLGIsYykpOwotICBzdGQ6OmNvdXQgPDwgbGFiZWwgPDwgIiBkZWZhdWx0ICIgPDwgMWUzKnQuYmVzdChDUFVfVElNRVIpIDw8ICJtcyAgXHQiIDw8IDFlLTYqZG91YmxlKHJlcCkvKHQuYmVzdChDUFVfVElNRVIpKSA8PCAiIE0gbXVsL3NcbiI7Ci0gIAotICBCRU5DSCh0LCB0cmllcywgcmVwLCBxdWF0bXVsX25vdmVjKGEsYixjKSk7Ci0gIHN0ZDo6Y291dCA8PCBsYWJlbCA8PCAiIG5vdmVjICAgIiA8PCAxZTMqdC5iZXN0KENQVV9USU1FUikgPDwgIm1zICBcdCIgPDwgMWUtNipkb3VibGUocmVwKS8odC5iZXN0KENQVV9USU1FUikpIDw8ICIgTSBtdWwvc1xuIjsKKworICBCRU5DSCh0LCB0cmllcywgcmVwLCBxdWF0bXVsX2RlZmF1bHQoYSwgYiwgYykpOworICBzdGQ6OmNvdXQgPDwgbGFiZWwgPDwgIiBkZWZhdWx0ICIgPDwgMWUzICogdC5iZXN0KENQVV9USU1FUikgPDwgIm1zICBcdCIgPDwgMWUtNiAqIGRvdWJsZShyZXApIC8gKHQuYmVzdChDUFVfVElNRVIpKQorICAgICAgICAgICAgPDwgIiBNIG11bC9zXG4iOworCisgIEJFTkNIKHQsIHRyaWVzLCByZXAsIHF1YXRtdWxfbm92ZWMoYSwgYiwgYykpOworICBzdGQ6OmNvdXQgPDwgbGFiZWwgPDwgIiBub3ZlYyAgICIgPDwgMWUzICogdC5iZXN0KENQVV9USU1FUikgPDwgIm1zICBcdCIgPDwgMWUtNiAqIGRvdWJsZShyZXApIC8gKHQuYmVzdChDUFVfVElNRVIpKQorICAgICAgICAgICAgPDwgIiBNIG11bC9zXG4iOwogfQogCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgYmVuY2g8UXVhdGVybmlvbmY+KCJmbG9hdCAiKTsKICAgYmVuY2g8UXVhdGVybmlvbmQ+KCJkb3VibGUiKTsKIAogICByZXR1cm4gMDsKLQogfQotCmRpZmYgLS1naXQgYS9iZW5jaC9zcGFyc2VfY2hvbGVza3kuY3BwIGIvYmVuY2gvc3BhcnNlX2Nob2xlc2t5LmNwcAppbmRleCBlY2IyMjY3Li4yNmQ0ODNhIDEwMDY0NAotLS0gYS9iZW5jaC9zcGFyc2VfY2hvbGVza3kuY3BwCisrKyBiL2JlbmNoL3NwYXJzZV9jaG9sZXNreS5jcHAKQEAgLTMsNyArMywxNyBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZT4KIAotLy8gZysrIC1EU0laRT0xMDAwMCAtRERFTlNJVFk9MC4wMDEgIHNwYXJzZV9jaG9sZXNreS5jcHAgLUkuLiAtRERFTlNFTUFUUkkgLU8zIC1nMCAtRE5ERUJVRyAgIC1ETkJUUklFUz0xIC1JIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvdGF1Y3NfZnVsbC9zcmMvIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS90YXVjc19mdWxsL2J1aWxkL2xpbnV4LyAgLUwvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL3RhdWNzX2Z1bGwvbGliL2xpbnV4LyAtbHRhdWNzIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvR290b0JMQVMvbGliZ290by5hIC1scHRocmVhZCAtSSAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL0NIT0xNT0QvSW5jbHVkZS8gJENIT0xMSUIgLUkgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9TdWl0ZVNwYXJzZS9VRmNvbmZpZy8gL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9TdWl0ZVNwYXJzZS9DQ09MQU1EL0xpYi9saWJjY29sYW1kLmEgICAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL0NIT0xNT0QvTGliL2xpYmNob2xtb2QuYSAtbG1ldGlzIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvU3VpdGVTcGFyc2UvQU1EL0xpYi9saWJhbWQuYSAgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9TdWl0ZVNwYXJzZS9DQU1EL0xpYi9saWJjYW1kLmEgICAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL0NDT0xBTUQvTGliL2xpYmNjb2xhbWQuYSAgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9TdWl0ZVNwYXJzZS9DT0xBTUQvTGliL2xpYmNvbGFtZC5hIC1sbGFwYWNrICYmIC4vYS5vdXQKKy8vIGcrKyAtRFNJWkU9MTAwMDAgLURERU5TSVRZPTAuMDAxICBzcGFyc2VfY2hvbGVza3kuY3BwIC1JLi4gLURERU5TRU1BVFJJIC1PMyAtZzAgLUROREVCVUcgICAtRE5CVFJJRVM9MSAtSQorLy8gL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS90YXVjc19mdWxsL3NyYy8gLUkvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL3RhdWNzX2Z1bGwvYnVpbGQvbGludXgvCisvLyAtTC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvdGF1Y3NfZnVsbC9saWIvbGludXgvIC1sdGF1Y3MgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9Hb3RvQkxBUy9saWJnb3RvLmEKKy8vIC1scHRocmVhZCAtSSAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL0NIT0xNT0QvSW5jbHVkZS8gJENIT0xMSUIgLUkKKy8vIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvU3VpdGVTcGFyc2UvVUZjb25maWcvCisvLyAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL0NDT0xBTUQvTGliL2xpYmNjb2xhbWQuYQorLy8gL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9TdWl0ZVNwYXJzZS9DSE9MTU9EL0xpYi9saWJjaG9sbW9kLmEgLWxtZXRpcworLy8gL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9TdWl0ZVNwYXJzZS9BTUQvTGliL2xpYmFtZC5hCisvLyAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL1N1aXRlU3BhcnNlL0NBTUQvTGliL2xpYmNhbWQuYQorLy8gL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9TdWl0ZVNwYXJzZS9DQ09MQU1EL0xpYi9saWJjY29sYW1kLmEKKy8vIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvU3VpdGVTcGFyc2UvQ09MQU1EL0xpYi9saWJjb2xhbWQuYSAtbGxhcGFjayAmJiAuL2Eub3V0CiAKICNkZWZpbmUgTk9HTU0KICNkZWZpbmUgTk9NVEwKQEAgLTMwLDUyICs0MCw0NyBAQAogI2RlZmluZSBOQlRSSUVTIDEwCiAjZW5kaWYKIAotI2RlZmluZSBCRU5DSChYKSBcCi0gIHRpbWVyLnJlc2V0KCk7IFwKLSAgZm9yIChpbnQgX2o9MDsgX2o8TkJUUklFUzsgKytfaikgeyBcCi0gICAgdGltZXIuc3RhcnQoKTsgXAotICAgIGZvciAoaW50IF9rPTA7IF9rPFJFUEVBVDsgKytfaykgeyBcCi0gICAgICAgIFggIFwKLSAgfSB0aW1lci5zdG9wKCk7IH0KKyNkZWZpbmUgQkVOQ0goWCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGltZXIucmVzZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpbnQgX2ogPSAwOyBfaiA8IE5CVFJJRVM7ICsrX2opIHsgIFwKKyAgICB0aW1lci5zdGFydCgpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGludCBfayA9IDA7IF9rIDwgUkVQRUFUOyArK19rKSB7IFwKKyAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lci5zdG9wKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCiAvLyB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsVXBwZXJUcmlhbmd1bGFyPiBFaWdlblNwYXJzZVRyaU1hdHJpeDsKLXR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixTZWxmQWRqb2ludHxMb3dlclRyaWFuZ3VsYXI+IEVpZ2VuU3BhcnNlU2VsZkFkam9pbnRNYXRyaXg7Cit0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsIFNlbGZBZGpvaW50IHwgTG93ZXJUcmlhbmd1bGFyPiBFaWdlblNwYXJzZVNlbGZBZGpvaW50TWF0cml4OwogCi12b2lkIGZpbGxTcGRNYXRyaXgoZmxvYXQgZGVuc2l0eSwgaW50IHJvd3MsIGludCBjb2xzLCAgRWlnZW5TcGFyc2VTZWxmQWRqb2ludE1hdHJpeCYgZHN0KQotewotICBkc3Quc3RhcnRGaWxsKHJvd3MqY29scypkZW5zaXR5KTsKLSAgZm9yKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykKLSAgewotICAgIGRzdC5maWxsKGosaikgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oMTAsMjApOwotICAgIGZvcihpbnQgaSA9IGorMTsgaSA8IHJvd3M7IGkrKykKLSAgICB7Ci0gICAgICBTY2FsYXIgdiA9IChpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLDEpIDwgZGVuc2l0eSkgPyBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSA6IDA7Ci0gICAgICBpZiAodiE9MCkKLSAgICAgICAgZHN0LmZpbGwoaSxqKSA9IHY7Cit2b2lkIGZpbGxTcGRNYXRyaXgoZmxvYXQgZGVuc2l0eSwgaW50IHJvd3MsIGludCBjb2xzLCBFaWdlblNwYXJzZVNlbGZBZGpvaW50TWF0cml4JiBkc3QpIHsKKyAgZHN0LnN0YXJ0RmlsbChyb3dzICogY29scyAqIGRlbnNpdHkpOworICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgeworICAgIGRzdC5maWxsKGosIGopID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KDEwLCAyMCk7CisgICAgZm9yIChpbnQgaSA9IGogKyAxOyBpIDwgcm93czsgaSsrKSB7CisgICAgICBTY2FsYXIgdiA9IChpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLCAxKSA8IGRlbnNpdHkpID8gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgOiAwOworICAgICAgaWYgKHYgIT0gMCkgZHN0LmZpbGwoaSwgaikgPSB2OwogICAgIH0KLQogICB9CiAgIGRzdC5lbmRGaWxsKCk7CiB9CiAKICNpbmNsdWRlIDxFaWdlbi9DaG9sZXNreT4KIAotdGVtcGxhdGU8aW50IEJhY2tlbmQ+Ci12b2lkIGRvRWlnZW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgRWlnZW5TcGFyc2VTZWxmQWRqb2ludE1hdHJpeCYgc20xLCBpbnQgZmxhZ3MgPSAwKQotewordGVtcGxhdGUgPGludCBCYWNrZW5kPgordm9pZCBkb0VpZ2VuKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IEVpZ2VuU3BhcnNlU2VsZkFkam9pbnRNYXRyaXgmIHNtMSwgaW50IGZsYWdzID0gMCkgewogICBzdGQ6OmNvdXQgPDwgbmFtZSA8PCAiLi4uIiA8PCBzdGQ6OmZsdXNoOwogICBCZW5jaFRpbWVyIHRpbWVyOwogICB0aW1lci5zdGFydCgpOwotICBTcGFyc2VMTFQ8RWlnZW5TcGFyc2VTZWxmQWRqb2ludE1hdHJpeCxCYWNrZW5kPiBjaG9sKHNtMSwgZmxhZ3MpOworICBTcGFyc2VMTFQ8RWlnZW5TcGFyc2VTZWxmQWRqb2ludE1hdHJpeCwgQmFja2VuZD4gY2hvbChzbTEsIGZsYWdzKTsKICAgdGltZXIuc3RvcCgpOwogICBzdGQ6OmNvdXQgPDwgIjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwogCiAgIHN0ZDo6Y291dCA8PCAiICBubno6ICIgPDwgc20xLm5vblplcm9zKCkgPDwgIiA9PiAiIDw8IGNob2wubWF0cml4TCgpLm5vblplcm9zKCkgPDwgIlxuIjsKLS8vICAgc3RkOjpjb3V0IDw8ICJzcGFyc2VcbiIgPDwgY2hvbC5tYXRyaXhMKCkgPDwgIiVcbiI7CisgIC8vICAgc3RkOjpjb3V0IDw8ICJzcGFyc2VcbiIgPDwgY2hvbC5tYXRyaXhMKCkgPDwgIiVcbiI7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgIGludCByb3dzID0gU0laRTsKICAgaW50IGNvbHMgPSBTSVpFOwogICBmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsKQEAgLTg2LDI3ICs5MSwyNiBAQAogCiAgIGJvb2wgZGVuc2Vkb25lID0gZmFsc2U7CiAKLSAgLy9mb3IgKGZsb2F0IGRlbnNpdHkgPSBERU5TSVRZOyBkZW5zaXR5Pj1NSU5ERU5TSVRZOyBkZW5zaXR5Kj0wLjUpCi0vLyAgIGZsb2F0IGRlbnNpdHkgPSAwLjU7CisgIC8vIGZvciAoZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7IGRlbnNpdHk+PU1JTkRFTlNJVFk7IGRlbnNpdHkqPTAuNSkKKyAgLy8gICBmbG9hdCBkZW5zaXR5ID0gMC41OwogICB7CiAgICAgRWlnZW5TcGFyc2VTZWxmQWRqb2ludE1hdHJpeCBzbTEocm93cywgY29scyk7CiAgICAgc3RkOjpjb3V0IDw8ICJHZW5lcmF0ZSBzcGFyc2UgbWF0cml4IChtaWdodCB0YWtlIGEgd2hpbGUpLi4uXG4iOwogICAgIGZpbGxTcGRNYXRyaXgoZGVuc2l0eSwgcm93cywgY29scywgc20xKTsKICAgICBzdGQ6OmNvdXQgPDwgIkRPTkVcblxuIjsKIAotICAgIC8vIGRlbnNlIG1hdHJpY2VzCi0gICAgI2lmZGVmIERFTlNFTUFUUklYCi0gICAgaWYgKCFkZW5zZWRvbmUpCi0gICAgeworLy8gZGVuc2UgbWF0cmljZXMKKyNpZmRlZiBERU5TRU1BVFJJWAorICAgIGlmICghZGVuc2Vkb25lKSB7CiAgICAgICBkZW5zZWRvbmUgPSB0cnVlOwotICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBEZW5zZVx0IiA8PCBkZW5zaXR5KjEwMCA8PCAiJVxuIjsKLSAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsY29scyk7CisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIERlbnNlXHQiIDw8IGRlbnNpdHkgKiAxMDAgPDwgIiVcbiI7CisgICAgICBEZW5zZU1hdHJpeCBtMShyb3dzLCBjb2xzKTsKICAgICAgIGVpVG9EZW5zZShzbTEsIG0xKTsKICAgICAgIG0xID0gKG0xICsgbTEudHJhbnNwb3NlKCkpLmV2YWwoKTsKICAgICAgIG0xLmRpYWdvbmFsKCkgKj0gMC41OwogCi0vLyAgICAgICBCRU5DSChMTFQ8RGVuc2VNYXRyaXg+IGNob2wobTEpOykKLS8vICAgICAgIHN0ZDo6Y291dCA8PCAiZGVuc2U6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICAgIC8vICAgICAgIEJFTkNIKExMVDxEZW5zZU1hdHJpeD4gY2hvbChtMSk7KQorICAgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICJkZW5zZTpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwogCiAgICAgICBCZW5jaFRpbWVyIHRpbWVyOwogICAgICAgdGltZXIuc3RhcnQoKTsKQEAgLTExNCwyNyArMTE4LDI3IEBACiAgICAgICB0aW1lci5zdG9wKCk7CiAgICAgICBzdGQ6OmNvdXQgPDwgImRlbnNlOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CiAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgZm9yIChpbnQgaj0wOyBqPGNvbHM7ICsraikKLSAgICAgICAgZm9yIChpbnQgaT1qOyBpPHJvd3M7ICsraSkKLSAgICAgICAgICBpZiAoIWludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihpbnRlcm5hbDo6YWJzKGNob2wubWF0cml4TCgpKGksaikpLCAwLjEpKQotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgIHN0ZDo6Y291dCA8PCAiZGVuc2U6ICIgPDwgIm5ueiA9ICIgPDwgY291bnQgPDwgIlxuIjsKLS8vICAgICAgIHN0ZDo6Y291dCA8PCAiZGVuc2U6XG4iIDw8IG0xIDw8ICJcblxuIiA8PCBjaG9sLm1hdHJpeEwoKSA8PCBlbmRsOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyArK2opCisgICAgICAgIGZvciAoaW50IGkgPSBqOyBpIDwgcm93czsgKytpKQorICAgICAgICAgIGlmICghaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGludGVybmFsOjphYnMoY2hvbC5tYXRyaXhMKCkoaSwgaikpLCAwLjEpKSBjb3VudCsrOworICAgICAgc3RkOjpjb3V0IDw8ICJkZW5zZTogIgorICAgICAgICAgICAgICAgIDw8ICJubnogPSAiIDw8IGNvdW50IDw8ICJcbiI7CisgICAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgImRlbnNlOlxuIiA8PCBtMSA8PCAiXG5cbiIgPDwgY2hvbC5tYXRyaXhMKCkgPDwgZW5kbDsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAogICAgIC8vIGVpZ2VuIHNwYXJzZSBtYXRyaWNlcwogICAgIGRvRWlnZW48RWlnZW46OkRlZmF1bHRCYWNrZW5kPigiRWlnZW4vU3BhcnNlIiwgc20xLCBFaWdlbjo6SW5jb21wbGV0ZUZhY3Rvcml6YXRpb24pOwogCi0gICAgI2lmZGVmIEVJR0VOX0NIT0xNT0RfU1VQUE9SVAorI2lmZGVmIEVJR0VOX0NIT0xNT0RfU1VQUE9SVAogICAgIGRvRWlnZW48RWlnZW46OkNob2xtb2Q+KCJFaWdlbi9DaG9sbW9kIiwgc20xLCBFaWdlbjo6SW5jb21wbGV0ZUZhY3Rvcml6YXRpb24pOwotICAgICNlbmRpZgorI2VuZGlmCiAKLSAgICAjaWZkZWYgRUlHRU5fVEFVQ1NfU1VQUE9SVAorI2lmZGVmIEVJR0VOX1RBVUNTX1NVUFBPUlQKICAgICBkb0VpZ2VuPEVpZ2VuOjpUYXVjcz4oIkVpZ2VuL1RhdWNzIiwgc20xLCBFaWdlbjo6SW5jb21wbGV0ZUZhY3Rvcml6YXRpb24pOwotICAgICNlbmRpZgorI2VuZGlmCiAKLSAgICAjaWYgMAorI2lmIDAKICAgICAvLyBUQVVDUwogICAgIHsKICAgICAgIHRhdWNzX2Njc19tYXRyaXggQSA9IHNtMS5hc1RhdWNzTWF0cml4KCk7CkBAIC0xNTMsNyArMTU3LDcgQEAKICAgICB9CiAKICAgICAvLyBDSE9MTU9ECi0gICAgI2lmZGVmIEVJR0VOX0NIT0xNT0RfU1VQUE9SVAorI2lmZGVmIEVJR0VOX0NIT0xNT0RfU1VQUE9SVAogICAgIHsKICAgICAgIGNob2xtb2RfY29tbW9uIGM7CiAgICAgICBjaG9sbW9kX3N0YXJ0ICgmYyk7CkBAIC0yMDIsMTUgKzIwNiwxMCBAQAogLy8gICAgICAgICAgICAgc3RkOjpjb3V0IDw8IGNob2wtPnZhbHVlcy5zW2ldIDw8ICIgIjsKIC8vICAgICAgIH0KICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAotICAgICNlbmRpZgotCi0KLQorI2VuZGlmCiAgIH0KIAotCiAgIHJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9iZW5jaC9zcGFyc2VfZGVuc2VfcHJvZHVjdC5jcHAgYi9iZW5jaC9zcGFyc2VfZGVuc2VfcHJvZHVjdC5jcHAKaW5kZXggZjNmNTE5NC4uNWU5NzdiMCAxMDA2NDQKLS0tIGEvYmVuY2gvc3BhcnNlX2RlbnNlX3Byb2R1Y3QuY3BwCisrKyBiL2JlbmNoL3NwYXJzZV9kZW5zZV9wcm9kdWN0LmNwcApAQCAtMSw4ICsxLDkgQEAKIAotLy9nKysgLU8zIC1nMCAtRE5ERUJVRyAgc3BhcnNlX3Byb2R1Y3QuY3BwIC1JLi4gLUkvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL210bDQvIC1EREVOU0lUWT0wLjAwNSAtRFNJWkU9MTAwMDAgJiYgLi9hLm91dAotLy9nKysgLU8zIC1nMCAtRE5ERUJVRyAgc3BhcnNlX3Byb2R1Y3QuY3BwIC1JLi4gLUkvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL210bDQvIC1EREVOU0lUWT0wLjA1IC1EU0laRT0yMDAwICYmIC4vYS5vdXQKLS8vIC1ETk9HTU0gLUROT01UTCAtRENTUEFSU0UKLS8vIC1JIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9JbmNsdWRlLyAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL0NTcGFyc2UvTGliL2xpYmNzcGFyc2UuYQorLy8gZysrIC1PMyAtZzAgLUROREVCVUcgIHNwYXJzZV9wcm9kdWN0LmNwcCAtSS4uIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAtRERFTlNJVFk9MC4wMDUgLURTSVpFPTEwMDAwICYmCisvLyAuL2Eub3V0IGcrKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDUKKy8vIC1EU0laRT0yMDAwICYmIC4vYS5vdXQKKy8vICAtRE5PR01NIC1ETk9NVEwgLURDU1BBUlNFCisvLyAgLUkgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0luY2x1ZGUvIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9MaWIvbGliY3NwYXJzZS5hCiAjaWZuZGVmIFNJWkUKICNkZWZpbmUgU0laRSA2NTAwMDAKICNlbmRpZgpAQCAtMjUsMTYzICsyNiwxNjAgQEAKICNkZWZpbmUgTkJUUklFUyAxMAogI2VuZGlmCiAKLSNkZWZpbmUgQkVOQ0goWCkgXAotICB0aW1lci5yZXNldCgpOyBcCi0gIGZvciAoaW50IF9qPTA7IF9qPE5CVFJJRVM7ICsrX2opIHsgXAotICAgIHRpbWVyLnN0YXJ0KCk7IFwKLSAgICBmb3IgKGludCBfaz0wOyBfazxSRVBFQVQ7ICsrX2spIHsgXAotICAgICAgICBYICBcCi0gIH0gdGltZXIuc3RvcCgpOyB9Ci0KKyNkZWZpbmUgQkVOQ0goWCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGltZXIucmVzZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpbnQgX2ogPSAwOyBfaiA8IE5CVFJJRVM7ICsrX2opIHsgIFwKKyAgICB0aW1lci5zdGFydCgpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGludCBfayA9IDA7IF9rIDwgUkVQRUFUOyArK19rKSB7IFwKKyAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lci5zdG9wKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCiAjaWZkZWYgQ1NQQVJTRQotY3MqIGNzX3NvcnRlZF9tdWx0aXBseShjb25zdCBjcyogYSwgY29uc3QgY3MqIGIpCi17Ci0gIGNzKiBBID0gY3NfdHJhbnNwb3NlIChhLCAxKSA7Ci0gIGNzKiBCID0gY3NfdHJhbnNwb3NlIChiLCAxKSA7Ci0gIGNzKiBEID0gY3NfbXVsdGlwbHkgKEIsQSkgOyAgIC8qIEQgPSBCJypBJyAqLwotICBjc19zcGZyZWUgKEEpIDsKLSAgY3Nfc3BmcmVlIChCKSA7Ci0gIGNzX2Ryb3B6ZXJvcyAoRCkgOyAgICAgIC8qIGRyb3AgemVyb3MgZnJvbSBEICovCi0gIGNzKiBDID0gY3NfdHJhbnNwb3NlIChELCAxKSA7ICAgLyogQyA9IEQnLCBzbyB0aGF0IEMgaXMgc29ydGVkICovCi0gIGNzX3NwZnJlZSAoRCkgOworY3MqIGNzX3NvcnRlZF9tdWx0aXBseShjb25zdCBjcyogYSwgY29uc3QgY3MqIGIpIHsKKyAgY3MqIEEgPSBjc190cmFuc3Bvc2UoYSwgMSk7CisgIGNzKiBCID0gY3NfdHJhbnNwb3NlKGIsIDEpOworICBjcyogRCA9IGNzX211bHRpcGx5KEIsIEEpOyAvKiBEID0gQicqQScgKi8KKyAgY3Nfc3BmcmVlKEEpOworICBjc19zcGZyZWUoQik7CisgIGNzX2Ryb3B6ZXJvcyhEKTsgICAgICAgICAgICAvKiBkcm9wIHplcm9zIGZyb20gRCAqLworICBjcyogQyA9IGNzX3RyYW5zcG9zZShELCAxKTsgLyogQyA9IEQnLCBzbyB0aGF0IEMgaXMgc29ydGVkICovCisgIGNzX3NwZnJlZShEKTsKICAgcmV0dXJuIEM7CiB9CiAjZW5kaWYKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgaW50IHJvd3MgPSBTSVpFOwogICBpbnQgY29scyA9IFNJWkU7CiAgIGZsb2F0IGRlbnNpdHkgPSBERU5TSVRZOwogCi0gIEVpZ2VuU3BhcnNlTWF0cml4IHNtMShyb3dzLGNvbHMpOworICBFaWdlblNwYXJzZU1hdHJpeCBzbTEocm93cywgY29scyk7CiAgIERlbnNlVmVjdG9yIHYxKGNvbHMpLCB2Mihjb2xzKTsKICAgdjEuc2V0UmFuZG9tKCk7CiAKICAgQmVuY2hUaW1lciB0aW1lcjsKLSAgZm9yIChmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsgZGVuc2l0eT49TUlOREVOU0lUWTsgZGVuc2l0eSo9MC41KQotICB7Ci0gICAgLy9maWxsTWF0cml4KGRlbnNpdHksIHJvd3MsIGNvbHMsIHNtMSk7CisgIGZvciAoZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7IGRlbnNpdHkgPj0gTUlOREVOU0lUWTsgZGVuc2l0eSAqPSAwLjUpIHsKKyAgICAvLyBmaWxsTWF0cml4KGRlbnNpdHksIHJvd3MsIGNvbHMsIHNtMSk7CiAgICAgZmlsbE1hdHJpeDIoNywgcm93cywgY29scywgc20xKTsKIAotICAgIC8vIGRlbnNlIG1hdHJpY2VzCi0gICAgI2lmZGVmIERFTlNFTUFUUklYCisvLyBkZW5zZSBtYXRyaWNlcworI2lmZGVmIERFTlNFTUFUUklYCiAgICAgewotICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBEZW5zZVx0IiA8PCBkZW5zaXR5KjEwMCA8PCAiJVxuIjsKLSAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsY29scyk7CisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIERlbnNlXHQiIDw8IGRlbnNpdHkgKiAxMDAgPDwgIiVcbiI7CisgICAgICBEZW5zZU1hdHJpeCBtMShyb3dzLCBjb2xzKTsKICAgICAgIGVpVG9EZW5zZShzbTEsIG0xKTsKIAogICAgICAgdGltZXIucmVzZXQoKTsKICAgICAgIHRpbWVyLnN0YXJ0KCk7Ci0gICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCi0gICAgICAgIHYyID0gbTEgKiB2MTsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgUkVQRUFUOyArK2spIHYyID0gbTEgKiB2MTsKICAgICAgIHRpbWVyLnN0b3AoKTsKLSAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIHY6XHQiIDw8IHRpbWVyLmJlc3QoKSA8PCAiICAiIDw8IGRvdWJsZShSRVBFQVQpL3RpbWVyLmJlc3QoKSA8PCAiICogLyBzZWMgIiA8PCBlbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogdjpcdCIgPDwgdGltZXIuYmVzdCgpIDw8ICIgICIgPDwgZG91YmxlKFJFUEVBVCkgLyB0aW1lci5iZXN0KCkgPDwgIiAqIC8gc2VjICIgPDwgZW5kbDsKIAogICAgICAgdGltZXIucmVzZXQoKTsKICAgICAgIHRpbWVyLnN0YXJ0KCk7Ci0gICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCi0gICAgICAgIHYyID0gbTEudHJhbnNwb3NlKCkgKiB2MTsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgUkVQRUFUOyArK2spIHYyID0gbTEudHJhbnNwb3NlKCkgKiB2MTsKICAgICAgIHRpbWVyLnN0b3AoKTsKICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiB2Olx0IiA8PCB0aW1lci5iZXN0KCkgPDwgZW5kbDsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAogICAgIC8vIGVpZ2VuIHNwYXJzZSBtYXRyaWNlcwogICAgIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gc3BhcnNlXHQiIDw8IHNtMS5ub25aZXJvcygpL2Zsb2F0KHNtMS5yb3dzKCkqc20xLmNvbHMoKSkqMTAwIDw8ICIlXG4iOworICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBzcGFyc2VcdCIgPDwgc20xLm5vblplcm9zKCkgLyBmbG9hdChzbTEucm93cygpICogc20xLmNvbHMoKSkgKiAxMDAgPDwgIiVcbiI7CiAKICAgICAgIEJFTkNIKGFzbSgiI215YyIpOyB2MiA9IHNtMSAqIHYxOyBhc20oIiNteWQiKTspCi0gICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiB2Olx0IiA8PCB0aW1lci5iZXN0KCkvUkVQRUFUIDw8ICIgICIgPDwgZG91YmxlKFJFUEVBVCkvdGltZXIuYmVzdChSRUFMX1RJTUVSKSA8PCAiICogLyBzZWMgIiA8PCBlbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogdjpcdCIgPDwgdGltZXIuYmVzdCgpIC8gUkVQRUFUIDw8ICIgICIgPDwgZG91YmxlKFJFUEVBVCkgLyB0aW1lci5iZXN0KFJFQUxfVElNRVIpCisgICAgICAgICAgICAgICAgPDwgIiAqIC8gc2VjICIgPDwgZW5kbDsKIAorICAgICAgQkVOQ0goeworICAgICAgICBhc20oIiNteWEiKTsKKyAgICAgICAgdjIgPSBzbTEudHJhbnNwb3NlKCkgKiB2MTsKKyAgICAgICAgYXNtKCIjbXliIik7CisgICAgICB9KQogCi0gICAgICBCRU5DSCggeyBhc20oIiNteWEiKTsgdjIgPSBzbTEudHJhbnNwb3NlKCkgKiB2MTsgYXNtKCIjbXliIik7IH0pCi0KLSAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiB2Olx0IiA8PCB0aW1lci5iZXN0KCkvUkVQRUFUIDw8IGVuZGw7CisgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogdjpcdCIgPDwgdGltZXIuYmVzdCgpIC8gUkVQRUFUIDw8IGVuZGw7CiAgICAgfQogCi0vLyAgICAgewotLy8gICAgICAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXI+IG0xKHNtMSk7Ci0vLyAgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIGR5bi1zcGFyc2VcdCIgPDwgbTEubm9uWmVyb3MoKS9mbG9hdChtMS5yb3dzKCkqbTEuY29scygpKSoxMDAgPDwgIiVcbiI7Ci0vLwotLy8gICAgICAgQkVOQ0goZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSB2MiA9IG0xICogdjE7KQotLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogdjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwotLy8KLS8vICAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgdjIgPSBtMS50cmFuc3Bvc2UoKSAqIHYxOykKLS8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiB2Olx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7Ci0vLyAgICAgfQorICAgIC8vICAgICB7CisgICAgLy8gICAgICAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXI+IG0xKHNtMSk7CisgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBkeW4tc3BhcnNlXHQiIDw8IG0xLm5vblplcm9zKCkvZmxvYXQobTEucm93cygpKm0xLmNvbHMoKSkqMTAwIDw8ICIlXG4iOworICAgIC8vCisgICAgLy8gICAgICAgQkVOQ0goZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSB2MiA9IG0xICogdjE7KQorICAgIC8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIHY6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICAvLworICAgIC8vICAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgdjIgPSBtMS50cmFuc3Bvc2UoKSAqIHYxOykKKyAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogdjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgIC8vICAgICB9CiAKLSAgICAvLyBHTU0rKwotICAgICNpZm5kZWYgTk9HTU0KKy8vIEdNTSsrCisjaWZuZGVmIE5PR01NCiAgICAgewotICAgICAgc3RkOjpjb3V0IDw8ICJHTU0rKyBzcGFyc2VcdCIgPDwgZGVuc2l0eSoxMDAgPDwgIiVcbiI7Ci0gICAgICAvL0dtbUR5blNwYXJzZSAgZ21tVDMocm93cyxjb2xzKTsKLSAgICAgIEdtbVNwYXJzZSBtMShyb3dzLGNvbHMpOworICAgICAgc3RkOjpjb3V0IDw8ICJHTU0rKyBzcGFyc2VcdCIgPDwgZGVuc2l0eSAqIDEwMCA8PCAiJVxuIjsKKyAgICAgIC8vIEdtbUR5blNwYXJzZSAgZ21tVDMocm93cyxjb2xzKTsKKyAgICAgIEdtbVNwYXJzZSBtMShyb3dzLCBjb2xzKTsKICAgICAgIGVpVG9HbW0oc20xLCBtMSk7CiAKICAgICAgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gZ21tVjEoY29scyksIGdtbVYyKGNvbHMpOwotICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1WMVswXSwgY29scykgPSB2MTsKLSAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPigmZ21tVjJbMF0sIGNvbHMpID0gdjI7CisgICAgICBNYXA8TWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gPigmZ21tVjFbMF0sIGNvbHMpID0gdjE7CisgICAgICBNYXA8TWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gPigmZ21tVjJbMF0sIGNvbHMpID0gdjI7CiAKLSAgICAgIEJFTkNIKCBhc20oIiNteXgiKTsgZ21tOjptdWx0KG0xLCBnbW1WMSwgZ21tVjIpOyBhc20oIiNteXkiKTsgKQorICAgICAgQkVOQ0goYXNtKCIjbXl4Iik7IGdtbTo6bXVsdChtMSwgZ21tVjEsIGdtbVYyKTsgYXNtKCIjbXl5Iik7KQogICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogdjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwogCi0gICAgICBCRU5DSCggZ21tOjptdWx0KGdtbTo6dHJhbnNwb3NlZChtMSksIGdtbVYxLCBnbW1WMik7ICkKKyAgICAgIEJFTkNIKGdtbTo6bXVsdChnbW06OnRyYW5zcG9zZWQobTEpLCBnbW1WMSwgZ21tVjIpOykKICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiB2Olx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CiAgICAgfQotICAgICNlbmRpZgotICAgIAotICAgICNpZm5kZWYgTk9VQkxBUworI2VuZGlmCisKKyNpZm5kZWYgTk9VQkxBUwogICAgIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAidWJsYXMgc3BhcnNlXHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOwotICAgICAgVUJsYXNTcGFyc2UgbTEocm93cyxjb2xzKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAidWJsYXMgc3BhcnNlXHQiIDw8IGRlbnNpdHkgKiAxMDAgPDwgIiVcbiI7CisgICAgICBVQmxhc1NwYXJzZSBtMShyb3dzLCBjb2xzKTsKICAgICAgIGVpVG9VYmxhcyhzbTEsIG0xKTsKLSAgICAgIAorCiAgICAgICBib29zdDo6bnVtZXJpYzo6dWJsYXM6OnZlY3RvcjxTY2FsYXI+IHV2MSwgdXYyOwotICAgICAgZWlUb1VibGFzVmVjKHYxLHV2MSk7Ci0gICAgICBlaVRvVWJsYXNWZWModjIsdXYyKTsKKyAgICAgIGVpVG9VYmxhc1ZlYyh2MSwgdXYxKTsKKyAgICAgIGVpVG9VYmxhc1ZlYyh2MiwgdXYyKTsKIAotLy8gICAgICAgc3RkOjp2ZWN0b3I8U2NhbGFyPiBnbW1WMShjb2xzKSwgZ21tVjIoY29scyk7Ci0vLyAgICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4oJmdtbVYxWzBdLCBjb2xzKSA9IHYxOwotLy8gICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1WMlswXSwgY29scykgPSB2MjsKKyAgICAgIC8vICAgICAgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gZ21tVjEoY29scyksIGdtbVYyKGNvbHMpOworICAgICAgLy8gICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1WMVswXSwgY29scykgPSB2MTsKKyAgICAgIC8vICAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPigmZ21tVjJbMF0sIGNvbHMpID0gdjI7CiAKLSAgICAgIEJFTkNIKCB1djIgPSBib29zdDo6bnVtZXJpYzo6dWJsYXM6OnByb2QobTEsIHV2MSk7ICkKKyAgICAgIEJFTkNIKHV2MiA9IGJvb3N0OjpudW1lcmljOjp1Ymxhczo6cHJvZChtMSwgdXYxKTspCiAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiB2Olx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CiAKLS8vICAgICAgIEJFTkNIKCBib29zdDo6dWJsYXM6OnByb2QoZ21tOjp0cmFuc3Bvc2VkKG0xKSwgZ21tVjEsIGdtbVYyKTsgKQotLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIHY6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICAgIC8vICAgICAgIEJFTkNIKCBib29zdDo6dWJsYXM6OnByb2QoZ21tOjp0cmFuc3Bvc2VkKG0xKSwgZ21tVjEsIGdtbVYyKTsgKQorICAgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIHY6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAotICAgIC8vIE1UTDQKLSAgICAjaWZuZGVmIE5PTVRMCisvLyBNVEw0CisjaWZuZGVmIE5PTVRMCiAgICAgewotICAgICAgc3RkOjpjb3V0IDw8ICJNVEw0XHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOwotICAgICAgTXRsU3BhcnNlIG0xKHJvd3MsY29scyk7CisgICAgICBzdGQ6OmNvdXQgPDwgIk1UTDRcdCIgPDwgZGVuc2l0eSAqIDEwMCA8PCAiJVxuIjsKKyAgICAgIE10bFNwYXJzZSBtMShyb3dzLCBjb2xzKTsKICAgICAgIGVpVG9NdGwoc20xLCBtMSk7CiAgICAgICBtdGw6OmRlbnNlX3ZlY3RvcjxTY2FsYXI+IG10bFYxKGNvbHMsIDEuMCk7CiAgICAgICBtdGw6OmRlbnNlX3ZlY3RvcjxTY2FsYXI+IG10bFYyKGNvbHMsIDEuMCk7CiAKICAgICAgIHRpbWVyLnJlc2V0KCk7CiAgICAgICB0aW1lci5zdGFydCgpOwotICAgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQotICAgICAgICBtdGxWMiA9IG0xICogbXRsVjE7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IFJFUEVBVDsgKytrKSBtdGxWMiA9IG0xICogbXRsVjE7CiAgICAgICB0aW1lci5zdG9wKCk7CiAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiB2Olx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CiAKICAgICAgIHRpbWVyLnJlc2V0KCk7CiAgICAgICB0aW1lci5zdGFydCgpOwotICAgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQotICAgICAgICBtdGxWMiA9IHRyYW5zKG0xKSAqIG10bFYxOworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBSRVBFQVQ7ICsraykgbXRsVjIgPSB0cmFucyhtMSkgKiBtdGxWMTsKICAgICAgIHRpbWVyLnN0b3AoKTsKICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiB2Olx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CiAgICAgfQotICAgICNlbmRpZgorI2VuZGlmCiAKICAgICBzdGQ6OmNvdXQgPDwgIlxuXG4iOwogICB9CiAKICAgcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2JlbmNoL3NwYXJzZV9sdS5jcHAgYi9iZW5jaC9zcGFyc2VfbHUuY3BwCmluZGV4IDVjNzUwMDEuLmYwNzRlNTUgMTAwNjQ0Ci0tLSBhL2JlbmNoL3NwYXJzZV9sdS5jcHAKKysrIGIvYmVuY2gvc3BhcnNlX2x1LmNwcApAQCAtMzAsNDcgKzMwLDQ5IEBACiAjZGVmaW5lIE5CVFJJRVMgMTAKICNlbmRpZgogCi0jZGVmaW5lIEJFTkNIKFgpIFwKLSAgdGltZXIucmVzZXQoKTsgXAotICBmb3IgKGludCBfaj0wOyBfajxOQlRSSUVTOyArK19qKSB7IFwKLSAgICB0aW1lci5zdGFydCgpOyBcCi0gICAgZm9yIChpbnQgX2s9MDsgX2s8UkVQRUFUOyArK19rKSB7IFwKLSAgICAgICAgWCAgXAotICB9IHRpbWVyLnN0b3AoKTsgfQorI2RlZmluZSBCRU5DSChYKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0aW1lci5yZXNldCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGludCBfaiA9IDA7IF9qIDwgTkJUUklFUzsgKytfaikgeyAgXAorICAgIHRpbWVyLnN0YXJ0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IF9rID0gMDsgX2sgPCBSRVBFQVQ7ICsrX2spIHsgXAorICAgICAgWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRpbWVyLnN0b3AoKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKLXR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZlY3Rvclg7Cit0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IFZlY3Rvclg7CiAKICNpbmNsdWRlIDxFaWdlbi9MVT4KIAotdGVtcGxhdGU8aW50IEJhY2tlbmQ+Ci12b2lkIGRvRWlnZW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgRWlnZW5TcGFyc2VNYXRyaXgmIHNtMSwgY29uc3QgVmVjdG9yWCYgYiwgVmVjdG9yWCYgeCwgaW50IGZsYWdzID0gMCkKLXsKK3RlbXBsYXRlIDxpbnQgQmFja2VuZD4KK3ZvaWQgZG9FaWdlbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBFaWdlblNwYXJzZU1hdHJpeCYgc20xLCBjb25zdCBWZWN0b3JYJiBiLCBWZWN0b3JYJiB4LCBpbnQgZmxhZ3MgPSAwKSB7CiAgIHN0ZDo6Y291dCA8PCBuYW1lIDw8ICIuLi4iIDw8IHN0ZDo6Zmx1c2g7Ci0gIEJlbmNoVGltZXIgdGltZXI7IHRpbWVyLnN0YXJ0KCk7Ci0gIFNwYXJzZUxVPEVpZ2VuU3BhcnNlTWF0cml4LEJhY2tlbmQ+IGx1KHNtMSwgZmxhZ3MpOworICBCZW5jaFRpbWVyIHRpbWVyOworICB0aW1lci5zdGFydCgpOworICBTcGFyc2VMVTxFaWdlblNwYXJzZU1hdHJpeCwgQmFja2VuZD4gbHUoc20xLCBmbGFncyk7CiAgIHRpbWVyLnN0b3AoKTsKICAgaWYgKGx1LnN1Y2NlZWRlZCgpKQogICAgIHN0ZDo6Y291dCA8PCAiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7Ci0gIGVsc2UKLSAgeworICBlbHNlIHsKICAgICBzdGQ6OmNvdXQgPDwgIjpcdCBGQUlMRUQiIDw8IGVuZGw7CiAgICAgcmV0dXJuOwogICB9CiAKICAgYm9vbCBvazsKLSAgdGltZXIucmVzZXQoKTsgdGltZXIuc3RhcnQoKTsKLSAgb2sgPSBsdS5zb2x2ZShiLCZ4KTsKKyAgdGltZXIucmVzZXQoKTsKKyAgdGltZXIuc3RhcnQoKTsKKyAgb2sgPSBsdS5zb2x2ZShiLCAmeCk7CiAgIHRpbWVyLnN0b3AoKTsKICAgaWYgKG9rKQogICAgIHN0ZDo6Y291dCA8PCAiICBzb2x2ZTpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwogICBlbHNlCi0gICAgc3RkOjpjb3V0IDw8ICIgIHNvbHZlOlx0IiA8PCAiIEZBSUxFRCIgPDwgZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgc29sdmU6XHQiCisgICAgICAgICAgICAgIDw8ICIgRkFJTEVEIiA8PCBlbmRsOwogCi0gIC8vc3RkOjpjb3V0IDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKKyAgLy8gc3RkOjpjb3V0IDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKIH0KIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgaW50IHJvd3MgPSBTSVpFOwogICBpbnQgY29scyA9IFNJWkU7CiAgIGZsb2F0IGRlbnNpdHkgPSBERU5TSVRZOwpAQCAtODEsMTkgKzgzLDE4IEBACiAKICAgYm9vbCBkZW5zZWRvbmUgPSBmYWxzZTsKIAotICAvL2ZvciAoZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7IGRlbnNpdHk+PU1JTkRFTlNJVFk7IGRlbnNpdHkqPTAuNSkKLS8vICAgZmxvYXQgZGVuc2l0eSA9IDAuNTsKKyAgLy8gZm9yIChmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsgZGVuc2l0eT49TUlOREVOU0lUWTsgZGVuc2l0eSo9MC41KQorICAvLyAgIGZsb2F0IGRlbnNpdHkgPSAwLjU7CiAgIHsKICAgICBFaWdlblNwYXJzZU1hdHJpeCBzbTEocm93cywgY29scyk7CiAgICAgZmlsbE1hdHJpeChkZW5zaXR5LCByb3dzLCBjb2xzLCBzbTEpOwogCi0gICAgLy8gZGVuc2UgbWF0cmljZXMKLSAgICAjaWZkZWYgREVOU0VNQVRSSVgKLSAgICBpZiAoIWRlbnNlZG9uZSkKLSAgICB7CisvLyBkZW5zZSBtYXRyaWNlcworI2lmZGVmIERFTlNFTUFUUklYCisgICAgaWYgKCFkZW5zZWRvbmUpIHsKICAgICAgIGRlbnNlZG9uZSA9IHRydWU7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIERlbnNlXHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOwotICAgICAgRGVuc2VNYXRyaXggbTEocm93cyxjb2xzKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gRGVuc2VcdCIgPDwgZGVuc2l0eSAqIDEwMCA8PCAiJVxuIjsKKyAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsIGNvbHMpOwogICAgICAgZWlUb0RlbnNlKHNtMSwgbTEpOwogCiAgICAgICBCZW5jaFRpbWVyIHRpbWVyOwpAQCAtMTA0LDI5ICsxMDUsMjcgQEAKIAogICAgICAgdGltZXIucmVzZXQoKTsKICAgICAgIHRpbWVyLnN0YXJ0KCk7Ci0gICAgICBsdS5zb2x2ZShiLCZ4KTsKKyAgICAgIGx1LnNvbHZlKGIsICZ4KTsKICAgICAgIHRpbWVyLnN0b3AoKTsKICAgICAgIHN0ZDo6Y291dCA8PCAiICBzb2x2ZTpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwotLy8gICAgICAgc3RkOjpjb3V0IDw8IGIudHJhbnNwb3NlKCkgPDwgIlxuIjsKLS8vICAgICAgIHN0ZDo6Y291dCA8PCB4LnRyYW5zcG9zZSgpIDw8ICJcbiI7CisgICAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgYi50cmFuc3Bvc2UoKSA8PCAiXG4iOworICAgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAotICAgICNpZmRlZiBFSUdFTl9VTUZQQUNLX1NVUFBPUlQKKyNpZmRlZiBFSUdFTl9VTUZQQUNLX1NVUFBPUlQKICAgICB4LnNldFplcm8oKTsKICAgICBkb0VpZ2VuPEVpZ2VuOjpVbWZQYWNrPigiRWlnZW4vVW1mUGFjayAoYXV0bykiLCBzbTEsIGIsIHgsIDApOwotICAgICNlbmRpZgorI2VuZGlmCiAKLSAgICAjaWZkZWYgRUlHRU5fU1VQRVJMVV9TVVBQT1JUCisjaWZkZWYgRUlHRU5fU1VQRVJMVV9TVVBQT1JUCiAgICAgeC5zZXRaZXJvKCk7CiAgICAgZG9FaWdlbjxFaWdlbjo6U3VwZXJMVT4oIkVpZ2VuL1N1cGVyTFUgKG5hdCkiLCBzbTEsIGIsIHgsIEVpZ2VuOjpOYXR1cmFsT3JkZXJpbmcpOwotLy8gICAgIGRvRWlnZW48RWlnZW46OlN1cGVyTFU+KCJFaWdlbi9TdXBlckxVIChNRCBBVCtBKSIsIHNtMSwgYiwgeCwgRWlnZW46Ok1pbmltdW1EZWdyZWVfQVRfUExVU19BKTsKLS8vICAgICBkb0VpZ2VuPEVpZ2VuOjpTdXBlckxVPigiRWlnZW4vU3VwZXJMVSAoTUQgQVRBKSIsIHNtMSwgYiwgeCwgRWlnZW46Ok1pbmltdW1EZWdyZWVfQVRBKTsKKyAgICAvLyAgICAgZG9FaWdlbjxFaWdlbjo6U3VwZXJMVT4oIkVpZ2VuL1N1cGVyTFUgKE1EIEFUK0EpIiwgc20xLCBiLCB4LCBFaWdlbjo6TWluaW11bURlZ3JlZV9BVF9QTFVTX0EpOworICAgIC8vICAgICBkb0VpZ2VuPEVpZ2VuOjpTdXBlckxVPigiRWlnZW4vU3VwZXJMVSAoTUQgQVRBKSIsIHNtMSwgYiwgeCwgRWlnZW46Ok1pbmltdW1EZWdyZWVfQVRBKTsKICAgICBkb0VpZ2VuPEVpZ2VuOjpTdXBlckxVPigiRWlnZW4vU3VwZXJMVSAoQ09MQU1EKSIsIHNtMSwgYiwgeCwgRWlnZW46OkNvbEFwcHJveE1pbmltdW1EZWdyZWUpOwotICAgICNlbmRpZgotCisjZW5kaWYKICAgfQogCiAgIHJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9iZW5jaC9zcGFyc2VfcHJvZHVjdC5jcHAgYi9iZW5jaC9zcGFyc2VfcHJvZHVjdC5jcHAKaW5kZXggZDJmYzQ0Zi4uY2Y5MTA4MCAxMDA2NDQKLS0tIGEvYmVuY2gvc3BhcnNlX3Byb2R1Y3QuY3BwCisrKyBiL2JlbmNoL3NwYXJzZV9wcm9kdWN0LmNwcApAQCAtMSw4ICsxLDkgQEAKIAotLy9nKysgLU8zIC1nMCAtRE5ERUJVRyAgc3BhcnNlX3Byb2R1Y3QuY3BwIC1JLi4gLUkvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL210bDQvIC1EREVOU0lUWT0wLjAwNSAtRFNJWkU9MTAwMDAgJiYgLi9hLm91dAotLy9nKysgLU8zIC1nMCAtRE5ERUJVRyAgc3BhcnNlX3Byb2R1Y3QuY3BwIC1JLi4gLUkvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL210bDQvIC1EREVOU0lUWT0wLjA1IC1EU0laRT0yMDAwICYmIC4vYS5vdXQKLS8vIC1ETk9HTU0gLUROT01UTCAtRENTUEFSU0UKLS8vIC1JIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9JbmNsdWRlLyAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL0NTcGFyc2UvTGliL2xpYmNzcGFyc2UuYQorLy8gZysrIC1PMyAtZzAgLUROREVCVUcgIHNwYXJzZV9wcm9kdWN0LmNwcCAtSS4uIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAtRERFTlNJVFk9MC4wMDUgLURTSVpFPTEwMDAwICYmCisvLyAuL2Eub3V0IGcrKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDUKKy8vIC1EU0laRT0yMDAwICYmIC4vYS5vdXQKKy8vICAtRE5PR01NIC1ETk9NVEwgLURDU1BBUlNFCisvLyAgLUkgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0luY2x1ZGUvIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9MaWIvbGliY3NwYXJzZS5hCiAKICNpbmNsdWRlIDx0eXBlaW5mbz4KIApAQCAtMjcsMTMgKzI4LDE1IEBACiAjZGVmaW5lIE5CVFJJRVMgMQogI2VuZGlmCiAKLSNkZWZpbmUgQkVOQ0goWCkgXAotICB0aW1lci5yZXNldCgpOyBcCi0gIGZvciAoaW50IF9qPTA7IF9qPE5CVFJJRVM7ICsrX2opIHsgXAotICAgIHRpbWVyLnN0YXJ0KCk7IFwKLSAgICBmb3IgKGludCBfaz0wOyBfazxSRVBFQVQ7ICsrX2spIHsgXAotICAgICAgICBYICBcCi0gIH0gdGltZXIuc3RvcCgpOyB9CisjZGVmaW5lIEJFTkNIKFgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRpbWVyLnJlc2V0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaW50IF9qID0gMDsgX2ogPCBOQlRSSUVTOyArK19qKSB7ICBcCisgICAgdGltZXIuc3RhcnQoKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpbnQgX2sgPSAwOyBfayA8IFJFUEVBVDsgKytfaykgeyBcCisgICAgICBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGltZXIuc3RvcCgpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KIAogLy8gI2lmZGVmIE1LTAogLy8KQEAgLTU5LDMzICs2MiwzMCBAQAogLy8KIC8vICNlbmRpZgogCi0KICNpZmRlZiBDU1BBUlNFCi1jcyogY3Nfc29ydGVkX211bHRpcGx5KGNvbnN0IGNzKiBhLCBjb25zdCBjcyogYikKLXsKLS8vICAgcmV0dXJuIGNzX211bHRpcGx5KGEsYik7CitjcyogY3Nfc29ydGVkX211bHRpcGx5KGNvbnN0IGNzKiBhLCBjb25zdCBjcyogYikgeworICAvLyAgIHJldHVybiBjc19tdWx0aXBseShhLGIpOwogCiAgIGNzKiBBID0gY3NfdHJhbnNwb3NlKGEsIDEpOwogICBjcyogQiA9IGNzX3RyYW5zcG9zZShiLCAxKTsKLSAgY3MqIEQgPSBjc19tdWx0aXBseShCLEEpOyAgIC8qIEQgPSBCJypBJyAqLwotICBjc19zcGZyZWUgKEEpIDsKLSAgY3Nfc3BmcmVlIChCKSA7Ci0gIGNzX2Ryb3B6ZXJvcyAoRCkgOyAgICAgIC8qIGRyb3AgemVyb3MgZnJvbSBEICovCi0gIGNzKiBDID0gY3NfdHJhbnNwb3NlIChELCAxKSA7ICAgLyogQyA9IEQnLCBzbyB0aGF0IEMgaXMgc29ydGVkICovCi0gIGNzX3NwZnJlZSAoRCkgOworICBjcyogRCA9IGNzX211bHRpcGx5KEIsIEEpOyAvKiBEID0gQicqQScgKi8KKyAgY3Nfc3BmcmVlKEEpOworICBjc19zcGZyZWUoQik7CisgIGNzX2Ryb3B6ZXJvcyhEKTsgICAgICAgICAgICAvKiBkcm9wIHplcm9zIGZyb20gRCAqLworICBjcyogQyA9IGNzX3RyYW5zcG9zZShELCAxKTsgLyogQyA9IEQnLCBzbyB0aGF0IEMgaXMgc29ydGVkICovCisgIGNzX3NwZnJlZShEKTsKICAgcmV0dXJuIEM7CiAKLS8vICAgY3MqIEEgPSBjc190cmFuc3Bvc2UoYSwgMSk7Ci0vLyAgIGNzKiBDID0gY3NfdHJhbnNwb3NlKEEsIDEpOwotLy8gICByZXR1cm4gQzsKKyAgLy8gICBjcyogQSA9IGNzX3RyYW5zcG9zZShhLCAxKTsKKyAgLy8gICBjcyogQyA9IGNzX3RyYW5zcG9zZShBLCAxKTsKKyAgLy8gICByZXR1cm4gQzsKIH0KIAotY3MqIGNzX3NvcnRlZF9tdWx0aXBseTIoY29uc3QgY3MqIGEsIGNvbnN0IGNzKiBiKQotewotICBjcyogRCA9IGNzX211bHRpcGx5KGEsYik7Ci0gIGNzKiBFID0gY3NfdHJhbnNwb3NlKEQsMSk7CitjcyogY3Nfc29ydGVkX211bHRpcGx5Mihjb25zdCBjcyogYSwgY29uc3QgY3MqIGIpIHsKKyAgY3MqIEQgPSBjc19tdWx0aXBseShhLCBiKTsKKyAgY3MqIEUgPSBjc190cmFuc3Bvc2UoRCwgMSk7CiAgIGNzX3NwZnJlZShEKTsKLSAgY3MqIEMgPSBjc190cmFuc3Bvc2UoRSwxKTsKKyAgY3MqIEMgPSBjc190cmFuc3Bvc2UoRSwgMSk7CiAgIGNzX3NwZnJlZShFKTsKICAgcmV0dXJuIEM7CiB9CkBAIC05MywyMzEgKzkzLDIxOCBAQAogCiB2b2lkIGJlbmNoX3NvcnQoKTsKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLS8vICAgYmVuY2hfc29ydCgpOworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAvLyAgIGJlbmNoX3NvcnQoKTsKIAogICBpbnQgcm93cyA9IFNJWkU7CiAgIGludCBjb2xzID0gU0laRTsKICAgZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7CiAKLSAgRWlnZW5TcGFyc2VNYXRyaXggc20xKHJvd3MsY29scyksIHNtMihyb3dzLGNvbHMpLCBzbTMocm93cyxjb2xzKSwgc200KHJvd3MsY29scyk7CisgIEVpZ2VuU3BhcnNlTWF0cml4IHNtMShyb3dzLCBjb2xzKSwgc20yKHJvd3MsIGNvbHMpLCBzbTMocm93cywgY29scyksIHNtNChyb3dzLCBjb2xzKTsKIAogICBCZW5jaFRpbWVyIHRpbWVyOwotICBmb3IgKGludCBubnpQZXJDb2wgPSBOTlpQRVJDT0w7IG5uelBlckNvbD4xOyBubnpQZXJDb2wvPTEuMSkKLSAgeworICBmb3IgKGludCBubnpQZXJDb2wgPSBOTlpQRVJDT0w7IG5uelBlckNvbCA+IDE7IG5uelBlckNvbCAvPSAxLjEpIHsKICAgICBzbTEuc2V0WmVybygpOwogICAgIHNtMi5zZXRaZXJvKCk7CiAgICAgZmlsbE1hdHJpeDIobm56UGVyQ29sLCByb3dzLCBjb2xzLCBzbTEpOwogICAgIGZpbGxNYXRyaXgyKG5uelBlckNvbCwgcm93cywgY29scywgc20yKTsKLS8vICAgICBzdGQ6OmNlcnIgPDwgImZpbGxpbmcgT0tcbiI7CisgICAgLy8gICAgIHN0ZDo6Y2VyciA8PCAiZmlsbGluZyBPS1xuIjsKIAotICAgIC8vIGRlbnNlIG1hdHJpY2VzCi0gICAgI2lmZGVmIERFTlNFTUFUUklYCisvLyBkZW5zZSBtYXRyaWNlcworI2lmZGVmIERFTlNFTUFUUklYCiAgICAgewogICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBEZW5zZVx0IiA8PCBubnpQZXJDb2wgPDwgIiVcbiI7Ci0gICAgICBEZW5zZU1hdHJpeCBtMShyb3dzLGNvbHMpLCBtMihyb3dzLGNvbHMpLCBtMyhyb3dzLGNvbHMpOworICAgICAgRGVuc2VNYXRyaXggbTEocm93cywgY29scyksIG0yKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKTsKICAgICAgIGVpVG9EZW5zZShzbTEsIG0xKTsKICAgICAgIGVpVG9EZW5zZShzbTIsIG0yKTsKIAogICAgICAgdGltZXIucmVzZXQoKTsKICAgICAgIHRpbWVyLnN0YXJ0KCk7Ci0gICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCi0gICAgICAgIG0zID0gbTEgKiBtMjsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgUkVQRUFUOyArK2spIG0zID0gbTEgKiBtMjsKICAgICAgIHRpbWVyLnN0b3AoKTsKICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKIAogICAgICAgdGltZXIucmVzZXQoKTsKICAgICAgIHRpbWVyLnN0YXJ0KCk7Ci0gICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCi0gICAgICAgIG0zID0gbTEudHJhbnNwb3NlKCkgKiBtMjsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgUkVQRUFUOyArK2spIG0zID0gbTEudHJhbnNwb3NlKCkgKiBtMjsKICAgICAgIHRpbWVyLnN0b3AoKTsKICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CiAKICAgICAgIHRpbWVyLnJlc2V0KCk7CiAgICAgICB0aW1lci5zdGFydCgpOwotICAgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQotICAgICAgICBtMyA9IG0xLnRyYW5zcG9zZSgpICogbTIudHJhbnNwb3NlKCk7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IFJFUEVBVDsgKytrKSBtMyA9IG0xLnRyYW5zcG9zZSgpICogbTIudHJhbnNwb3NlKCk7CiAgICAgICB0aW1lci5zdG9wKCk7CiAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYic6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKIAogICAgICAgdGltZXIucmVzZXQoKTsKICAgICAgIHRpbWVyLnN0YXJ0KCk7Ci0gICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCi0gICAgICAgIG0zID0gbTEgKiBtMi50cmFuc3Bvc2UoKTsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgUkVQRUFUOyArK2spIG0zID0gbTEgKiBtMi50cmFuc3Bvc2UoKTsKICAgICAgIHRpbWVyLnN0b3AoKTsKICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CiAgICAgfQotICAgICNlbmRpZgorI2VuZGlmCiAKICAgICAvLyBlaWdlbiBzcGFyc2UgbWF0cmljZXMKICAgICB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIHNwYXJzZVx0IiA8PCBzbTEubm9uWmVyb3MoKS8oZmxvYXQoc20xLnJvd3MoKSkqZmxvYXQoc20xLmNvbHMoKSkpKjEwMCA8PCAiJSAqICIKLSAgICAgICAgICAgICAgICA8PCBzbTIubm9uWmVyb3MoKS8oZmxvYXQoc20yLnJvd3MoKSkqZmxvYXQoc20yLmNvbHMoKSkpKjEwMCA8PCAiJVxuIjsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gc3BhcnNlXHQiIDw8IHNtMS5ub25aZXJvcygpIC8gKGZsb2F0KHNtMS5yb3dzKCkpICogZmxvYXQoc20xLmNvbHMoKSkpICogMTAwIDw8ICIlICogIgorICAgICAgICAgICAgICAgIDw8IHNtMi5ub25aZXJvcygpIC8gKGZsb2F0KHNtMi5yb3dzKCkpICogZmxvYXQoc20yLmNvbHMoKSkpICogMTAwIDw8ICIlXG4iOwogCi0gICAgICBCRU5DSChzbTMgPSBzbTEgKiBzbTI7ICkKKyAgICAgIEJFTkNIKHNtMyA9IHNtMSAqIHNtMjspCiAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CiAKLS8vICAgICAgIEJFTkNIKHNtMyA9IHNtMS50cmFuc3Bvc2UoKSAqIHNtMjsgKQotLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKLS8vIC8vCi0vLyAgICAgICBCRU5DSChzbTMgPSBzbTEudHJhbnNwb3NlKCkgKiBzbTIudHJhbnNwb3NlKCk7ICkKLS8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiBiJzpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwotLy8gLy8KLS8vICAgICAgIEJFTkNIKHNtMyA9IHNtMSAqIHNtMi50cmFuc3Bvc2UoKTsgKQotLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYicgOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgICAvLyAgICAgICBCRU5DSChzbTMgPSBzbTEudHJhbnNwb3NlKCkgKiBzbTI7ICkKKyAgICAgIC8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYScgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgICAvLyAvLworICAgICAgLy8gICAgICAgQkVOQ0goc20zID0gc20xLnRyYW5zcG9zZSgpICogc20yLnRyYW5zcG9zZSgpOyApCisgICAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYic6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICAgIC8vIC8vCisgICAgICAvLyAgICAgICBCRU5DSChzbTMgPSBzbTEgKiBzbTIudHJhbnNwb3NlKCk7ICkKKyAgICAgIC8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGInIDpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwogCi0KLS8vICAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOwotLy8KLS8vICAgICAgIEJFTkNIKCBzbTMuX2V4cGVyaW1lbnRhbE5ld1Byb2R1Y3Qoc20xLCBzbTIpOyApCi0vLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7Ci0vLwotLy8gICAgICAgQkVOQ0goc20zLl9leHBlcmltZW50YWxOZXdQcm9kdWN0KHNtMS50cmFuc3Bvc2UoKSxzbTIpOyApCi0vLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwotLy8gLy8KLS8vICAgICAgIEJFTkNIKHNtMy5fZXhwZXJpbWVudGFsTmV3UHJvZHVjdChzbTEudHJhbnNwb3NlKCksc20yLnRyYW5zcG9zZSgpKTsgKQotLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7Ci0vLyAvLwotLy8gICAgICAgQkVOQ0goc20zLl9leHBlcmltZW50YWxOZXdQcm9kdWN0KHNtMSwgc20yLnRyYW5zcG9zZSgpKTspCi0vLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJyA6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICAgIC8vICAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICAgICAgLy8KKyAgICAgIC8vICAgICAgIEJFTkNIKCBzbTMuX2V4cGVyaW1lbnRhbE5ld1Byb2R1Y3Qoc20xLCBzbTIpOyApCisgICAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgICAvLworICAgICAgLy8gICAgICAgQkVOQ0goc20zLl9leHBlcmltZW50YWxOZXdQcm9kdWN0KHNtMS50cmFuc3Bvc2UoKSxzbTIpOyApCisgICAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgICAgLy8gLy8KKyAgICAgIC8vICAgICAgIEJFTkNIKHNtMy5fZXhwZXJpbWVudGFsTmV3UHJvZHVjdChzbTEudHJhbnNwb3NlKCksc20yLnRyYW5zcG9zZSgpKTsgKQorICAgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgICAvLyAvLworICAgICAgLy8gICAgICAgQkVOQ0goc20zLl9leHBlcmltZW50YWxOZXdQcm9kdWN0KHNtMSwgc20yLnRyYW5zcG9zZSgpKTspCisgICAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJyA6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKICAgICB9CiAKLSAgICAvLyBlaWdlbiBkeW4tc3BhcnNlIG1hdHJpY2VzCi0gICAgLyp7Ci0gICAgICBEeW5hbWljU3BhcnNlTWF0cml4PFNjYWxhcj4gbTEoc20xKSwgbTIoc20yKSwgbTMoc20zKTsKLSAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gZHluLXNwYXJzZVx0IiA8PCBtMS5ub25aZXJvcygpLyhmbG9hdChtMS5yb3dzKCkpKmZsb2F0KG0xLmNvbHMoKSkpKjEwMCA8PCAiJSAqICIKLSAgICAgICAgICAgICAgICA8PCBtMi5ub25aZXJvcygpLyhmbG9hdChtMi5yb3dzKCkpKmZsb2F0KG0yLmNvbHMoKSkpKjEwMCA8PCAiJVxuIjsKKy8vIGVpZ2VuIGR5bi1zcGFyc2UgbWF0cmljZXMKKy8qeworICBEeW5hbWljU3BhcnNlTWF0cml4PFNjYWxhcj4gbTEoc20xKSwgbTIoc20yKSwgbTMoc20zKTsKKyAgc3RkOjpjb3V0IDw8ICJFaWdlbiBkeW4tc3BhcnNlXHQiIDw8IG0xLm5vblplcm9zKCkvKGZsb2F0KG0xLnJvd3MoKSkqZmxvYXQobTEuY29scygpKSkqMTAwIDw8ICIlICogIgorICAgICAgICAgICAgPDwgbTIubm9uWmVyb3MoKS8oZmxvYXQobTIucm93cygpKSpmbG9hdChtMi5jb2xzKCkpKSoxMDAgPDwgIiVcbiI7CiAKIC8vICAgICAgIHRpbWVyLnJlc2V0KCk7CiAvLyAgICAgICB0aW1lci5zdGFydCgpOwotICAgICAgQkVOQ0goZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSBtMyA9IG0xICogbTI7KQorICBCRU5DSChmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spIG0zID0gbTEgKiBtMjspCiAvLyAgICAgICB0aW1lci5zdG9wKCk7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKIC8vICAgICAgIHN0ZDo6Y291dCA8PCBzbTMgPDwgIlxuIjsKIAotICAgICAgdGltZXIucmVzZXQoKTsKLSAgICAgIHRpbWVyLnN0YXJ0KCk7CisgIHRpbWVyLnJlc2V0KCk7CisgIHRpbWVyLnN0YXJ0KCk7CiAvLyAgICAgICBzdGQ6OmNlcnIgPDwgInRyYW5zcG9zZS4uLlxuIjsKIC8vICAgICAgIEVpZ2VuU3BhcnNlTWF0cml4IHNtNCA9IHNtMS50cmFuc3Bvc2UoKTsKIC8vICAgICAgIHN0ZDo6Y291dCA8PCBzbTQubm9uWmVyb3MoKSA8PCAiID09ICIgPDwgc20xLm5vblplcm9zKCkgPDwgIlxuIjsKIC8vICAgICAgIGV4aXQoMSk7CiAvLyAgICAgICBzdGQ6OmNlcnIgPDwgInRyYW5zcG9zZSBPS1xuIjsKIC8vICAgICAgIHN0ZDo6Y291dCA8PCBzbTEgPDwgIlxuXG4iIDw8IHNtMS50cmFuc3Bvc2UoKSA8PCAiXG5cbiIgPDwgc200LnRyYW5zcG9zZSgpIDw8ICJcblxuIjsKLSAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgbTMgPSBtMS50cmFuc3Bvc2UoKSAqIG0yOykKKyAgQkVOQ0goZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSBtMyA9IG0xLnRyYW5zcG9zZSgpICogbTI7KQogLy8gICAgICAgdGltZXIuc3RvcCgpOwotICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKIAogLy8gICAgICAgdGltZXIucmVzZXQoKTsKIC8vICAgICAgIHRpbWVyLnN0YXJ0KCk7Ci0gICAgICBCRU5DSCggZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSBtMyA9IG0xLnRyYW5zcG9zZSgpICogbTIudHJhbnNwb3NlKCk7ICkKKyAgQkVOQ0goIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgbTMgPSBtMS50cmFuc3Bvc2UoKSAqIG0yLnRyYW5zcG9zZSgpOyApCiAvLyAgICAgICB0aW1lci5zdG9wKCk7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYic6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CiAKIC8vICAgICAgIHRpbWVyLnJlc2V0KCk7CiAvLyAgICAgICB0aW1lci5zdGFydCgpOwotICAgICAgQkVOQ0goIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgbTMgPSBtMSAqIG0yLnRyYW5zcG9zZSgpOyApCisgIEJFTkNIKCBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spIG0zID0gbTEgKiBtMi50cmFuc3Bvc2UoKTsgKQogLy8gICAgICAgdGltZXIuc3RvcCgpOwotICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYicgOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7Ci0gICAgfSovCisgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGInIDpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworfSovCiAKLSAgICAvLyBDU3BhcnNlCi0gICAgI2lmZGVmIENTUEFSU0UKKy8vIENTcGFyc2UKKyNpZmRlZiBDU1BBUlNFCiAgICAgewogICAgICAgc3RkOjpjb3V0IDw8ICJDU3BhcnNlIFx0IiA8PCBubnpQZXJDb2wgPDwgIiVcbiI7CiAgICAgICBjcyAqbTEsICptMiwgKm0zOwogICAgICAgZWlUb0NTcGFyc2Uoc20xLCBtMSk7CiAgICAgICBlaVRvQ1NwYXJzZShzbTIsIG0yKTsKIAotICAgICAgQkVOQ0goCi0gICAgICB7CisgICAgICBCRU5DSCh7CiAgICAgICAgIG0zID0gY3Nfc29ydGVkX211bHRpcGx5KG0xLCBtMik7Ci0gICAgICAgIGlmICghbTMpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKCFtMykgewogICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiY3NfbXVsdGlwbHkgZmFpbGVkXG4iOwogICAgICAgICB9Ci0vLyAgICAgICAgIGNzX3ByaW50KG0zLCAwKTsKKyAgICAgICAgLy8gICAgICAgICBjc19wcmludChtMywgMCk7CiAgICAgICAgIGNzX3NwZnJlZShtMyk7Ci0gICAgICB9Ci0gICAgICApOwotLy8gICAgICAgdGltZXIuc3RvcCgpOworICAgICAgfSk7CisgICAgICAvLyAgICAgICB0aW1lci5zdG9wKCk7CiAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CiAKLS8vICAgICAgIEJFTkNIKCB7IG0zID0gY3Nfc29ydGVkX211bHRpcGx5MihtMSwgbTIpOyBjc19zcGZyZWUobTMpOyB9ICk7Ci0vLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgICAvLyAgICAgICBCRU5DSCggeyBtMyA9IGNzX3NvcnRlZF9tdWx0aXBseTIobTEsIG0yKTsgY3Nfc3BmcmVlKG0zKTsgfSApOworICAgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwogICAgIH0KLSAgICAjZW5kaWYKKyNlbmRpZgogCi0gICAgI2lmbmRlZiBOT1VCTEFTCisjaWZuZGVmIE5PVUJMQVMKICAgICB7CiAgICAgICBzdGQ6OmNvdXQgPDwgInVibGFzXHQiIDw8IG5uelBlckNvbCA8PCAiJVxuIjsKLSAgICAgIFVCbGFzU3BhcnNlIG0xKHJvd3MsY29scyksIG0yKHJvd3MsY29scyksIG0zKHJvd3MsY29scyk7CisgICAgICBVQmxhc1NwYXJzZSBtMShyb3dzLCBjb2xzKSwgbTIocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMpOwogICAgICAgZWlUb1VibGFzKHNtMSwgbTEpOwogICAgICAgZWlUb1VibGFzKHNtMiwgbTIpOwogCiAgICAgICBCRU5DSChib29zdDo6bnVtZXJpYzo6dWJsYXM6OnByb2QobTEsIG0yLCBtMyk7KTsKICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAotICAgIC8vIEdNTSsrCi0gICAgI2lmbmRlZiBOT0dNTQorLy8gR01NKysKKyNpZm5kZWYgTk9HTU0KICAgICB7CiAgICAgICBzdGQ6OmNvdXQgPDwgIkdNTSsrIHNwYXJzZVx0IiA8PCBubnpQZXJDb2wgPDwgIiVcbiI7Ci0gICAgICBHbW1EeW5TcGFyc2UgIGdtbVQzKHJvd3MsY29scyk7Ci0gICAgICBHbW1TcGFyc2UgbTEocm93cyxjb2xzKSwgbTIocm93cyxjb2xzKSwgbTMocm93cyxjb2xzKTsKKyAgICAgIEdtbUR5blNwYXJzZSBnbW1UMyhyb3dzLCBjb2xzKTsKKyAgICAgIEdtbVNwYXJzZSBtMShyb3dzLCBjb2xzKSwgbTIocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMpOwogICAgICAgZWlUb0dtbShzbTEsIG0xKTsKICAgICAgIGVpVG9HbW0oc20yLCBtMik7CiAKICAgICAgIEJFTkNIKGdtbTo6bXVsdChtMSwgbTIsIGdtbVQzKTspOwogICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwogCi0vLyAgICAgICBCRU5DSChnbW06Om11bHQoZ21tOjp0cmFuc3Bvc2VkKG0xKSwgbTIsIGdtbVQzKTspOwotLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKLS8vCi0vLyAgICAgICBpZiAocm93czw1MDApCi0vLyAgICAgICB7Ci0vLyAgICAgICAgIEJFTkNIKGdtbTo6bXVsdChnbW06OnRyYW5zcG9zZWQobTEpLCBnbW06OnRyYW5zcG9zZWQobTIpLCBnbW1UMyk7KTsKLS8vICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7Ci0vLwotLy8gICAgICAgICBCRU5DSChnbW06Om11bHQobTEsIGdtbTo6dHJhbnNwb3NlZChtMiksIGdtbVQzKTspOwotLy8gICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJzpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwotLy8gICAgICAgfQotLy8gICAgICAgZWxzZQotLy8gICAgICAgewotLy8gICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYic6XHQiIDw8ICJmb3JldmVyIiA8PCBlbmRsOwotLy8gICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJzpcdCIgPDwgImZvcmV2ZXIiIDw8IGVuZGw7Ci0vLyAgICAgICB9CisgICAgICAvLyAgICAgICBCRU5DSChnbW06Om11bHQoZ21tOjp0cmFuc3Bvc2VkKG0xKSwgbTIsIGdtbVQzKTspOworICAgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICAgIC8vCisgICAgICAvLyAgICAgICBpZiAocm93czw1MDApCisgICAgICAvLyAgICAgICB7CisgICAgICAvLyAgICAgICAgIEJFTkNIKGdtbTo6bXVsdChnbW06OnRyYW5zcG9zZWQobTEpLCBnbW06OnRyYW5zcG9zZWQobTIpLCBnbW1UMyk7KTsKKyAgICAgIC8vICAgICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGInOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgICAvLworICAgICAgLy8gICAgICAgICBCRU5DSChnbW06Om11bHQobTEsIGdtbTo6dHJhbnNwb3NlZChtMiksIGdtbVQzKTspOworICAgICAgLy8gICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJzpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgICAgLy8gICAgICAgfQorICAgICAgLy8gICAgICAgZWxzZQorICAgICAgLy8gICAgICAgeworICAgICAgLy8gICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYic6XHQiIDw8ICJmb3JldmVyIiA8PCBlbmRsOworICAgICAgLy8gICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJzpcdCIgPDwgImZvcmV2ZXIiIDw8IGVuZGw7CisgICAgICAvLyAgICAgICB9CiAgICAgfQotICAgICNlbmRpZgorI2VuZGlmCiAKLSAgICAvLyBNVEw0Ci0gICAgI2lmbmRlZiBOT01UTAorLy8gTVRMNAorI2lmbmRlZiBOT01UTAogICAgIHsKICAgICAgIHN0ZDo6Y291dCA8PCAiTVRMNFx0IiA8PCBubnpQZXJDb2wgPDwgIiVcbiI7Ci0gICAgICBNdGxTcGFyc2UgbTEocm93cyxjb2xzKSwgbTIocm93cyxjb2xzKSwgbTMocm93cyxjb2xzKTsKKyAgICAgIE10bFNwYXJzZSBtMShyb3dzLCBjb2xzKSwgbTIocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMpOwogICAgICAgZWlUb010bChzbTEsIG0xKTsKICAgICAgIGVpVG9NdGwoc20yLCBtMik7CiAKICAgICAgIEJFTkNIKG0zID0gbTEgKiBtMjspOwogICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwogCi0vLyAgICAgICBCRU5DSChtMyA9IHRyYW5zKG0xKSAqIG0yOyk7Ci0vLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEnICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwotLy8KLS8vICAgICAgIEJFTkNIKG0zID0gdHJhbnMobTEpICogdHJhbnMobTIpOyk7Ci0vLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgYScgKiBiJzpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwotLy8KLS8vICAgICAgIEJFTkNIKG0zID0gbTEgKiB0cmFucyhtMik7KTsKLS8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGInIDpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgICAgLy8gICAgICAgQkVOQ0gobTMgPSB0cmFucyhtMSkgKiBtMjspOworICAgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhJyAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICAgIC8vCisgICAgICAvLyAgICAgICBCRU5DSChtMyA9IHRyYW5zKG0xKSAqIHRyYW5zKG0yKTspOworICAgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgIGEnICogYic6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKKyAgICAgIC8vCisgICAgICAvLyAgICAgICBCRU5DSChtMyA9IG0xICogdHJhbnMobTIpOyk7CisgICAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiJyA6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAogICAgIHN0ZDo6Y291dCA8PCAiXG5cbiI7CiAgIH0KIAogICByZXR1cm4gMDsKIH0KLQotCi0KZGlmZiAtLWdpdCBhL2JlbmNoL3NwYXJzZV9yYW5kb21zZXR0ZXIuY3BwIGIvYmVuY2gvc3BhcnNlX3JhbmRvbXNldHRlci5jcHAKaW5kZXggYzQzMzc0Mi4uZDU1MDE3NCAxMDA2NDQKLS0tIGEvYmVuY2gvc3BhcnNlX3JhbmRvbXNldHRlci5jcHAKKysrIGIvYmVuY2gvc3BhcnNlX3JhbmRvbXNldHRlci5jcHAKQEAgLTMwLDk3ICszMCw5NiBAQAogI2RlZmluZSBOQlRSSUVTIDEwCiAjZW5kaWYKIAotI2RlZmluZSBCRU5DSChYKSBcCi0gIHRpbWVyLnJlc2V0KCk7IFwKLSAgZm9yIChpbnQgX2o9MDsgX2o8TkJUUklFUzsgKytfaikgeyBcCi0gICAgdGltZXIuc3RhcnQoKTsgXAotICAgIGZvciAoaW50IF9rPTA7IF9rPFJFUEVBVDsgKytfaykgeyBcCi0gICAgICAgIFggIFwKLSAgfSB0aW1lci5zdG9wKCk7IH0KLQorI2RlZmluZSBCRU5DSChYKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0aW1lci5yZXNldCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGludCBfaiA9IDA7IF9qIDwgTkJUUklFUzsgKytfaikgeyAgXAorICAgIHRpbWVyLnN0YXJ0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IF9rID0gMDsgX2sgPCBSRVBFQVQ7ICsrX2spIHsgXAorICAgICAgWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRpbWVyLnN0b3AoKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKIHN0YXRpYyBkb3VibGUgcnRpbWU7CiBzdGF0aWMgZG91YmxlIG5lbnRyaWVzOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTZXR0ZXJUeXBlPgotdm9pZCBkb3N0dWZmKGNvbnN0IGNoYXIqIG5hbWUsIEVpZ2VuU3BhcnNlTWF0cml4JiBzbTEpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2V0dGVyVHlwZT4KK3ZvaWQgZG9zdHVmZihjb25zdCBjaGFyKiBuYW1lLCBFaWdlblNwYXJzZU1hdHJpeCYgc20xKSB7CiAgIGludCByb3dzID0gc20xLnJvd3MoKTsKICAgaW50IGNvbHMgPSBzbTEuY29scygpOwogICBzbTEuc2V0WmVybygpOwogICBCZW5jaFRpbWVyIHQ7CiAgIFNldHRlclR5cGUqIHNldDEgPSBuZXcgU2V0dGVyVHlwZShzbTEpOwotICB0LnJlc2V0KCk7IHQuc3RhcnQoKTsKLSAgZm9yIChpbnQgaz0wOyBrPG5lbnRyaWVzOyArK2spCi0gICAgKCpzZXQxKShpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpLGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSkpICs9IDE7CisgIHQucmVzZXQoKTsKKyAgdC5zdGFydCgpOworICBmb3IgKGludCBrID0gMDsgayA8IG5lbnRyaWVzOyArK2spCisgICAgKCpzZXQxKShpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgcm93cyAtIDEpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgY29scyAtIDEpKSArPSAxOwogICB0LnN0b3AoKTsKLSAgc3RkOjpjb3V0IDw8ICJzdGQ6Om1hcCA9PiAgICAgIFx0IiA8PCB0LnZhbHVlKCktcnRpbWUKLSAgICAgICAgICAgIDw8ICIgbm56PSIgPDwgc2V0MS0+bm9uWmVyb3MoKSA8PCBzdGQ6OmZsdXNoOworICBzdGQ6OmNvdXQgPDwgInN0ZDo6bWFwID0+ICAgICAgXHQiIDw8IHQudmFsdWUoKSAtIHJ0aW1lIDw8ICIgbm56PSIgPDwgc2V0MS0+bm9uWmVyb3MoKSA8PCBzdGQ6OmZsdXNoOwogCiAgIC8vIGdldGNoYXIoKTsKIAotICB0LnJlc2V0KCk7IHQuc3RhcnQoKTsgZGVsZXRlIHNldDE7IHQuc3RvcCgpOworICB0LnJlc2V0KCk7CisgIHQuc3RhcnQoKTsKKyAgZGVsZXRlIHNldDE7CisgIHQuc3RvcCgpOwogICBzdGQ6OmNvdXQgPDwgIiAgYmFjazogXHQiIDw8IHQudmFsdWUoKSA8PCAiXG4iOwogfQotICAgIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewogICBpbnQgcm93cyA9IFNJWkU7CiAgIGludCBjb2xzID0gU0laRTsKICAgZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7CiAKLSAgRWlnZW5TcGFyc2VNYXRyaXggc20xKHJvd3MsY29scyksIHNtMihyb3dzLGNvbHMpOworICBFaWdlblNwYXJzZU1hdHJpeCBzbTEocm93cywgY29scyksIHNtMihyb3dzLCBjb2xzKTsKIAotCi0gIG5lbnRyaWVzID0gcm93cypjb2xzKmRlbnNpdHk7CisgIG5lbnRyaWVzID0gcm93cyAqIGNvbHMgKiBkZW5zaXR5OwogICBzdGQ6OmNvdXQgPDwgIm4gPSAiIDw8IG5lbnRyaWVzIDw8ICJcbiI7CiAgIGludCBkdW1teTsKICAgQmVuY2hUaW1lciB0OwogCi0gIHQucmVzZXQoKTsgdC5zdGFydCgpOwotICBmb3IgKGludCBrPTA7IGs8bmVudHJpZXM7ICsraykKLSAgICBkdW1teSA9IGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSkgKyBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpOworICB0LnJlc2V0KCk7CisgIHQuc3RhcnQoKTsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBuZW50cmllczsgKytrKSBkdW1teSA9IGludGVybmFsOjpyYW5kb208aW50PigwLCByb3dzIC0gMSkgKyBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgY29scyAtIDEpOwogICB0LnN0b3AoKTsKICAgcnRpbWUgPSB0LnZhbHVlKCk7CiAgIHN0ZDo6Y291dCA8PCAicnRpbWUgPSAiIDw8IHJ0aW1lIDw8ICIgKCIgPDwgZHVtbXkgPDwgIilcblxuIjsKICAgY29uc3QgaW50IEJpdHMgPSA2OwotICBmb3IgKDs7KQotICB7Ci0gICAgZG9zdHVmZjxSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsU3RkTWFwVHJhaXRzLEJpdHM+ID4oInN0ZDo6bWFwICAgICAiLCBzbTEpOwotICAgIGRvc3R1ZmY8UmFuZG9tU2V0dGVyPEVpZ2VuU3BhcnNlTWF0cml4LEdudUhhc2hNYXBUcmFpdHMsQml0cz4gPigiZ251OjpoYXNoX21hcCIsIHNtMSk7Ci0gICAgZG9zdHVmZjxSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsR29vZ2xlRGVuc2VIYXNoTWFwVHJhaXRzLEJpdHM+ID4oImdvb2dsZTo6ZGVuc2UiLCBzbTEpOwotICAgIGRvc3R1ZmY8UmFuZG9tU2V0dGVyPEVpZ2VuU3BhcnNlTWF0cml4LEdvb2dsZVNwYXJzZUhhc2hNYXBUcmFpdHMsQml0cz4gPigiZ29vZ2xlOjpzcGFyc2UiLCBzbTEpOworICBmb3IgKDs7KSB7CisgICAgZG9zdHVmZjxSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsIFN0ZE1hcFRyYWl0cywgQml0cz4gPigic3RkOjptYXAgICAgICIsIHNtMSk7CisgICAgZG9zdHVmZjxSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsIEdudUhhc2hNYXBUcmFpdHMsIEJpdHM+ID4oImdudTo6aGFzaF9tYXAiLCBzbTEpOworICAgIGRvc3R1ZmY8UmFuZG9tU2V0dGVyPEVpZ2VuU3BhcnNlTWF0cml4LCBHb29nbGVEZW5zZUhhc2hNYXBUcmFpdHMsIEJpdHM+ID4oImdvb2dsZTo6ZGVuc2UiLCBzbTEpOworICAgIGRvc3R1ZmY8UmFuZG9tU2V0dGVyPEVpZ2VuU3BhcnNlTWF0cml4LCBHb29nbGVTcGFyc2VIYXNoTWFwVHJhaXRzLCBCaXRzPiA+KCJnb29nbGU6OnNwYXJzZSIsIHNtMSk7CiAKLS8vICAgICB7Ci0vLyAgICAgICBSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsR251SGFzaE1hcFRyYWl0cyxCaXRzPiBzZXQxKHNtMSk7Ci0vLyAgICAgICB0LnJlc2V0KCk7IHQuc3RhcnQoKTsKLS8vICAgICAgIGZvciAoaW50IGs9MDsgazxuOyArK2spCi0vLyAgICAgICAgIHNldDEoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpKSArPSAxOwotLy8gICAgICAgdC5zdG9wKCk7Ci0vLyAgICAgICBzdGQ6OmNvdXQgPDwgImdudTo6aGFzaF9tYXAgPT4gXHQiIDw8IHQudmFsdWUoKS1ydGltZQotLy8gICAgICAgICAgICAgICAgIDw8ICIgbm56PSIgPDwgc2V0MS5ub25aZXJvcygpIDw8ICJcbiI7Z2V0Y2hhcigpOwotLy8gICAgIH0KLS8vICAgICB7Ci0vLyAgICAgICBSYW5kb21TZXR0ZXI8RWlnZW5TcGFyc2VNYXRyaXgsR29vZ2xlRGVuc2VIYXNoTWFwVHJhaXRzLEJpdHM+IHNldDEoc20xKTsKLS8vICAgICAgIHQucmVzZXQoKTsgdC5zdGFydCgpOwotLy8gICAgICAgZm9yIChpbnQgaz0wOyBrPG47ICsraykKLS8vICAgICAgICAgc2V0MShpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpLGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSkpICs9IDE7Ci0vLyAgICAgICB0LnN0b3AoKTsKLS8vICAgICAgIHN0ZDo6Y291dCA8PCAiZ29vZ2xlOjpkZW5zZSA9PiBcdCIgPDwgdC52YWx1ZSgpLXJ0aW1lCi0vLyAgICAgICAgICAgICAgICAgPDwgIiBubno9IiA8PCBzZXQxLm5vblplcm9zKCkgPDwgIlxuIjtnZXRjaGFyKCk7Ci0vLyAgICAgfQotLy8gICAgIHsKLS8vICAgICAgIFJhbmRvbVNldHRlcjxFaWdlblNwYXJzZU1hdHJpeCxHb29nbGVTcGFyc2VIYXNoTWFwVHJhaXRzLEJpdHM+IHNldDEoc20xKTsKLS8vICAgICAgIHQucmVzZXQoKTsgdC5zdGFydCgpOwotLy8gICAgICAgZm9yIChpbnQgaz0wOyBrPG47ICsraykKLS8vICAgICAgICAgc2V0MShpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpLGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSkpICs9IDE7Ci0vLyAgICAgICB0LnN0b3AoKTsKLS8vICAgICAgIHN0ZDo6Y291dCA8PCAiZ29vZ2xlOjpzcGFyc2UgPT4gXHQiIDw8IHQudmFsdWUoKS1ydGltZQotLy8gICAgICAgICAgICAgICAgIDw8ICIgbm56PSIgPDwgc2V0MS5ub25aZXJvcygpIDw8ICJcbiI7Z2V0Y2hhcigpOwotLy8gICAgIH0KKyAgICAvLyAgICAgeworICAgIC8vICAgICAgIFJhbmRvbVNldHRlcjxFaWdlblNwYXJzZU1hdHJpeCxHbnVIYXNoTWFwVHJhaXRzLEJpdHM+IHNldDEoc20xKTsKKyAgICAvLyAgICAgICB0LnJlc2V0KCk7IHQuc3RhcnQoKTsKKyAgICAvLyAgICAgICBmb3IgKGludCBrPTA7IGs8bjsgKytrKQorICAgIC8vICAgICAgICAgc2V0MShpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpLGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSkpICs9IDE7CisgICAgLy8gICAgICAgdC5zdG9wKCk7CisgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICJnbnU6Omhhc2hfbWFwID0+IFx0IiA8PCB0LnZhbHVlKCktcnRpbWUKKyAgICAvLyAgICAgICAgICAgICAgICAgPDwgIiBubno9IiA8PCBzZXQxLm5vblplcm9zKCkgPDwgIlxuIjtnZXRjaGFyKCk7CisgICAgLy8gICAgIH0KKyAgICAvLyAgICAgeworICAgIC8vICAgICAgIFJhbmRvbVNldHRlcjxFaWdlblNwYXJzZU1hdHJpeCxHb29nbGVEZW5zZUhhc2hNYXBUcmFpdHMsQml0cz4gc2V0MShzbTEpOworICAgIC8vICAgICAgIHQucmVzZXQoKTsgdC5zdGFydCgpOworICAgIC8vICAgICAgIGZvciAoaW50IGs9MDsgazxuOyArK2spCisgICAgLy8gICAgICAgICBzZXQxKGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsY29scy0xKSkgKz0gMTsKKyAgICAvLyAgICAgICB0LnN0b3AoKTsKKyAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgImdvb2dsZTo6ZGVuc2UgPT4gXHQiIDw8IHQudmFsdWUoKS1ydGltZQorICAgIC8vICAgICAgICAgICAgICAgICA8PCAiIG5uej0iIDw8IHNldDEubm9uWmVyb3MoKSA8PCAiXG4iO2dldGNoYXIoKTsKKyAgICAvLyAgICAgfQorICAgIC8vICAgICB7CisgICAgLy8gICAgICAgUmFuZG9tU2V0dGVyPEVpZ2VuU3BhcnNlTWF0cml4LEdvb2dsZVNwYXJzZUhhc2hNYXBUcmFpdHMsQml0cz4gc2V0MShzbTEpOworICAgIC8vICAgICAgIHQucmVzZXQoKTsgdC5zdGFydCgpOworICAgIC8vICAgICAgIGZvciAoaW50IGs9MDsgazxuOyArK2spCisgICAgLy8gICAgICAgICBzZXQxKGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsY29scy0xKSkgKz0gMTsKKyAgICAvLyAgICAgICB0LnN0b3AoKTsKKyAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgImdvb2dsZTo6c3BhcnNlID0+IFx0IiA8PCB0LnZhbHVlKCktcnRpbWUKKyAgICAvLyAgICAgICAgICAgICAgICAgPDwgIiBubno9IiA8PCBzZXQxLm5vblplcm9zKCkgPDwgIlxuIjtnZXRjaGFyKCk7CisgICAgLy8gICAgIH0KICAgICBzdGQ6OmNvdXQgPDwgIlxuXG4iOwogICB9CiAKICAgcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2JlbmNoL3NwYXJzZV9zZXR0ZXIuY3BwIGIvYmVuY2gvc3BhcnNlX3NldHRlci5jcHAKaW5kZXggYTlmMGIxMS4uMTQ4YjE0MCAxMDA2NDQKLS0tIGEvYmVuY2gvc3BhcnNlX3NldHRlci5jcHAKKysrIGIvYmVuY2gvc3BhcnNlX3NldHRlci5jcHAKQEAgLTEsOCArMSw5IEBACiAKLS8vZysrIC1PMyAtZzAgLUROREVCVUcgIHNwYXJzZV9wcm9kdWN0LmNwcCAtSS4uIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAtRERFTlNJVFk9MC4wMDUgLURTSVpFPTEwMDAwICYmIC4vYS5vdXQKLS8vZysrIC1PMyAtZzAgLUROREVCVUcgIHNwYXJzZV9wcm9kdWN0LmNwcCAtSS4uIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAtRERFTlNJVFk9MC4wNSAtRFNJWkU9MjAwMCAmJiAuL2Eub3V0Ci0vLyAtRE5PR01NIC1ETk9NVEwgLURDU1BBUlNFCi0vLyAtSSAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL0NTcGFyc2UvSW5jbHVkZS8gL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0xpYi9saWJjc3BhcnNlLmEKKy8vIGcrKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDA1IC1EU0laRT0xMDAwMCAmJgorLy8gLi9hLm91dCBnKysgLU8zIC1nMCAtRE5ERUJVRyAgc3BhcnNlX3Byb2R1Y3QuY3BwIC1JLi4gLUkvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL210bDQvIC1EREVOU0lUWT0wLjA1CisvLyAtRFNJWkU9MjAwMCAmJiAuL2Eub3V0CisvLyAgLUROT0dNTSAtRE5PTVRMIC1EQ1NQQVJTRQorLy8gIC1JIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9JbmNsdWRlLyAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL0NTcGFyc2UvTGliL2xpYmNzcGFyc2UuYQogI2lmbmRlZiBTSVpFCiAjZGVmaW5lIFNJWkUgMTAwMDAwCiAjZW5kaWYKQEAgLTMzLDEzICszNCwxNSBAQAogI2RlZmluZSBDSEVDS19NRU0KIC8vICNkZWZpbmUgQ0hFQ0tfTUVNICBzdGQvKiovOjpjb3V0IDw8ICJjaGVjayBtZW1cbiI7IGdldGNoYXIoKTsKIAotI2RlZmluZSBCRU5DSChYKSBcCi0gIHRpbWVyLnJlc2V0KCk7IFwKLSAgZm9yIChpbnQgX2o9MDsgX2o8TkJUUklFUzsgKytfaikgeyBcCi0gICAgdGltZXIuc3RhcnQoKTsgXAotICAgIGZvciAoaW50IF9rPTA7IF9rPFJFUEVBVDsgKytfaykgeyBcCi0gICAgICAgIFggIFwKLSAgfSB0aW1lci5zdG9wKCk7IH0KKyNkZWZpbmUgQkVOQ0goWCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGltZXIucmVzZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpbnQgX2ogPSAwOyBfaiA8IE5CVFJJRVM7ICsrX2opIHsgIFwKKyAgICB0aW1lci5zdGFydCgpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGludCBfayA9IDA7IF9rIDwgUkVQRUFUOyArK19rKSB7IFwKKyAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lci5zdG9wKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCiB0eXBlZGVmIHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiBDb29yZGluYXRlczsKIHR5cGVkZWYgc3RkOjp2ZWN0b3I8ZmxvYXQ+IFZhbHVlczsKQEAgLTU4LDggKzYxLDcgQEAKIEVJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF91Ymxhc19nZW52ZWMoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKTsKIEVJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9tdGwoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKTsKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgaW50IHJvd3MgPSBTSVpFOwogICBpbnQgY29scyA9IFNJWkU7CiAgIGJvb2wgZnVsbHlyYW5kID0gdHJ1ZTsKQEAgLTY3LDEzNyArNjksMTI3IEBACiAgIEJlbmNoVGltZXIgdGltZXI7CiAgIENvb3JkaW5hdGVzIGNvb3JkczsKICAgVmFsdWVzIHZhbHVlczsKLSAgaWYoZnVsbHlyYW5kKQotICB7CisgIGlmIChmdWxseXJhbmQpIHsKICAgICBDb29yZGluYXRlcyBwb29sOwotICAgIHBvb2wucmVzZXJ2ZShjb2xzKk5CUEVSUk9XKTsKLSAgICBzdGQ6OmNlcnIgPDwgImZpbGwgcG9vbCIgPDwgIlxuIjsKLSAgICBmb3IgKGludCBpPTA7IGk8Y29scypOQlBFUlJPVzsgKQotICAgIHsKLS8vICAgICAgIER5bmFtaWNTcGFyc2VNYXRyaXg8aW50PiBzdGVuY2lsKFNJWkUsU0laRSk7Ci0gICAgICBWZWN0b3IyaSBpaihpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpLGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSkpOwotLy8gICAgICAgaWYoc3RlbmNpbC5jb2VmZlJlZihpai54KCksIGlqLnkoKSk9PTApCisgICAgcG9vbC5yZXNlcnZlKGNvbHMgKiBOQlBFUlJPVyk7CisgICAgc3RkOjpjZXJyIDw8ICJmaWxsIHBvb2wiCisgICAgICAgICAgICAgIDw8ICJcbiI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzICogTkJQRVJST1c7KSB7CisgICAgICAvLyAgICAgICBEeW5hbWljU3BhcnNlTWF0cml4PGludD4gc3RlbmNpbChTSVpFLFNJWkUpOworICAgICAgVmVjdG9yMmkgaWooaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIHJvd3MgLSAxKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIGNvbHMgLSAxKSk7CisgICAgICAvLyAgICAgICBpZihzdGVuY2lsLmNvZWZmUmVmKGlqLngoKSwgaWoueSgpKT09MCkKICAgICAgIHsKLS8vICAgICAgICAgc3RlbmNpbC5jb2VmZlJlZihpai54KCksIGlqLnkoKSkgPSAxOworICAgICAgICAvLyAgICAgICAgIHN0ZW5jaWwuY29lZmZSZWYoaWoueCgpLCBpai55KCkpID0gMTsKICAgICAgICAgcG9vbC5wdXNoX2JhY2soaWopOwotCiAgICAgICB9CiAgICAgICArK2k7CiAgICAgfQotICAgIHN0ZDo6Y2VyciA8PCAicG9vbCBvayIgPDwgIlxuIjsKLSAgICBpbnQgbiA9IGNvbHMqTkJQRVJST1cqS0s7CisgICAgc3RkOjpjZXJyIDw8ICJwb29sIG9rIgorICAgICAgICAgICAgICA8PCAiXG4iOworICAgIGludCBuID0gY29scyAqIE5CUEVSUk9XICogS0s7CiAgICAgY29vcmRzLnJlc2VydmUobik7CiAgICAgdmFsdWVzLnJlc2VydmUobik7Ci0gICAgZm9yIChpbnQgaT0wOyBpPG47ICsraSkKLSAgICB7Ci0gICAgICBpbnQgaSA9IGludGVybmFsOjpyYW5kb208aW50PigwLHBvb2wuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgcG9vbC5zaXplKCkpOwogICAgICAgY29vcmRzLnB1c2hfYmFjayhwb29sW2ldKTsKICAgICAgIHZhbHVlcy5wdXNoX2JhY2soaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkpOwogICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7ICsraikKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkJQRVJST1c7ICsraSkgeworICAgICAgICBjb29yZHMucHVzaF9iYWNrKFZlY3RvcjJpKGludGVybmFsOjpyYW5kb208aW50PigwLCByb3dzIC0gMSksIGopKTsKKyAgICAgICAgdmFsdWVzLnB1c2hfYmFjayhpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSk7CisgICAgICB9CiAgIH0KLSAgZWxzZQotICB7Ci0gICAgZm9yIChpbnQgaj0wOyBqPGNvbHM7ICsraikKLSAgICBmb3IgKGludCBpPTA7IGk8TkJQRVJST1c7ICsraSkKLSAgICB7Ci0gICAgICBjb29yZHMucHVzaF9iYWNrKFZlY3RvcjJpKGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSksaikpOwotICAgICAgdmFsdWVzLnB1c2hfYmFjayhpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSk7Ci0gICAgfQotICB9Ci0gIHN0ZDo6Y291dCA8PCAibm56ID0gIiA8PCBjb29yZHMuc2l6ZSgpICA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgIm5ueiA9ICIgPDwgY29vcmRzLnNpemUoKSA8PCAiXG4iOwogICBDSEVDS19NRU0KKy8vIGRlbnNlIG1hdHJpY2VzCisjaWZkZWYgREVOU0VNQVRSSVgKKyAgeworICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fZGVuc2UoY29vcmRzLCB2YWx1ZXMpOykKKyAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIERlbnNlXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgfQorI2VuZGlmCiAKLSAgICAvLyBkZW5zZSBtYXRyaWNlcwotICAgICNpZmRlZiBERU5TRU1BVFJJWAotICAgIHsKLSAgICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fZGVuc2UoY29vcmRzLHZhbHVlcyk7KQotICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBEZW5zZVx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7Ci0gICAgfQotICAgICNlbmRpZgorICAvLyBlaWdlbiBzcGFyc2UgbWF0cmljZXMKKyAgLy8gICAgIGlmICghZnVsbHlyYW5kKQorICAvLyAgICAgeworICAvLyAgICAgICBCRU5DSChzZXRpbm5lcnJhbmRfZWlnZW4oY29vcmRzLHZhbHVlcyk7KQorICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIGZpbGxyYW5kXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgLy8gICAgIH0KKyAgeworICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fZHluYW1pYyhjb29yZHMsIHZhbHVlcyk7KQorICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gZHluYW1pY1x0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgIH0KKyAgLy8gICAgIHsKKyAgLy8gICAgICAgQkVOQ0goc2V0cmFuZF9laWdlbl9jb21wYWN0KGNvb3Jkcyx2YWx1ZXMpOykKKyAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBjb21wYWN0XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgLy8gICAgIH0KKyAgeworICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fc3VtZXEoY29vcmRzLCB2YWx1ZXMpOykKKyAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIHN1bWVxXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgfQorICB7CisgICAgLy8gICAgICAgQkVOQ0goc2V0cmFuZF9laWdlbl9nbnVfaGFzaChjb29yZHMsdmFsdWVzKTspCisgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBzdGQ6Om1hcFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgIH0KKyAgeworICAgIEJFTkNIKHNldHJhbmRfc2NpcHkoY29vcmRzLCB2YWx1ZXMpOykKKyAgICBzdGQ6OmNvdXQgPDwgInNjaXB5XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKKyAgfQorI2lmbmRlZiBOT0dPT0dMRQorICB7CisgICAgQkVOQ0goc2V0cmFuZF9laWdlbl9nb29nbGVfZGVuc2UoY29vcmRzLCB2YWx1ZXMpOykKKyAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIGdvb2dsZSBkZW5zZVx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgIH0KKyAgeworICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fZ29vZ2xlX3NwYXJzZShjb29yZHMsIHZhbHVlcyk7KQorICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gZ29vZ2xlIHNwYXJzZVx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgIH0KKyNlbmRpZgogCi0gICAgLy8gZWlnZW4gc3BhcnNlIG1hdHJpY2VzCi0vLyAgICAgaWYgKCFmdWxseXJhbmQpCi0vLyAgICAgewotLy8gICAgICAgQkVOQ0goc2V0aW5uZXJyYW5kX2VpZ2VuKGNvb3Jkcyx2YWx1ZXMpOykKLS8vICAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gZmlsbHJhbmRcdCIgPDwgdGltZXIudmFsdWUoKSA8PCAiXG4iOwotLy8gICAgIH0KLSAgICB7Ci0gICAgICBCRU5DSChzZXRyYW5kX2VpZ2VuX2R5bmFtaWMoY29vcmRzLHZhbHVlcyk7KQotICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBkeW5hbWljXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKLSAgICB9Ci0vLyAgICAgewotLy8gICAgICAgQkVOQ0goc2V0cmFuZF9laWdlbl9jb21wYWN0KGNvb3Jkcyx2YWx1ZXMpOykKLS8vICAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gY29tcGFjdFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7Ci0vLyAgICAgfQotICAgIHsKLSAgICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fc3VtZXEoY29vcmRzLHZhbHVlcyk7KQotICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBzdW1lcVx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7Ci0gICAgfQotICAgIHsKLS8vICAgICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fZ251X2hhc2goY29vcmRzLHZhbHVlcyk7KQotLy8gICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBzdGQ6Om1hcFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7Ci0gICAgfQotICAgIHsKLSAgICAgIEJFTkNIKHNldHJhbmRfc2NpcHkoY29vcmRzLHZhbHVlcyk7KQotICAgICAgc3RkOjpjb3V0IDw8ICJzY2lweVx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7Ci0gICAgfQotICAgICNpZm5kZWYgTk9HT09HTEUKLSAgICB7Ci0gICAgICBCRU5DSChzZXRyYW5kX2VpZ2VuX2dvb2dsZV9kZW5zZShjb29yZHMsdmFsdWVzKTspCi0gICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIGdvb2dsZSBkZW5zZVx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7Ci0gICAgfQotICAgIHsKLSAgICAgIEJFTkNIKHNldHJhbmRfZWlnZW5fZ29vZ2xlX3NwYXJzZShjb29yZHMsdmFsdWVzKTspCi0gICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIGdvb2dsZSBzcGFyc2VcdCIgPDwgdGltZXIudmFsdWUoKSA8PCAiXG4iOwotICAgIH0KLSAgICAjZW5kaWYKKyNpZm5kZWYgTk9VQkxBUworICB7CisgICAgICAvLyAgICAgICBCRU5DSChzZXRyYW5kX3VibGFzX21hcHBlZChjb29yZHMsdmFsdWVzKTspCisgICAgICAvLyAgICAgICBzdGQ6OmNvdXQgPDwgInVibGFzIG1hcHBlZFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgIH0geworICAgIEJFTkNIKHNldHJhbmRfdWJsYXNfZ2VudmVjKGNvb3JkcywgdmFsdWVzKTspCisgICAgc3RkOjpjb3V0IDw8ICJ1YmxhcyB2ZWNvZnZlY1x0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7CisgIH0KKy8qeworICB0aW1lci5yZXNldCgpOworICB0aW1lci5zdGFydCgpOworICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCisgICAgc2V0cmFuZF91Ymxhc19jb21wcmVzc2VkKGNvb3Jkcyx2YWx1ZXMpOworICB0aW1lci5zdG9wKCk7CisgIHN0ZDo6Y291dCA8PCAidWJsYXMgY29tcFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7Cit9Cit7CisgIHRpbWVyLnJlc2V0KCk7CisgIHRpbWVyLnN0YXJ0KCk7CisgIGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykKKyAgICBzZXRyYW5kX3VibGFzX2Nvb3JkKGNvb3Jkcyx2YWx1ZXMpOworICB0aW1lci5zdG9wKCk7CisgIHN0ZDo6Y291dCA8PCAidWJsYXMgY29vcmRcdCIgPDwgdGltZXIudmFsdWUoKSA8PCAiXG4iOworfSovCisjZW5kaWYKIAotICAgICNpZm5kZWYgTk9VQkxBUwotICAgIHsKLS8vICAgICAgIEJFTkNIKHNldHJhbmRfdWJsYXNfbWFwcGVkKGNvb3Jkcyx2YWx1ZXMpOykKLS8vICAgICAgIHN0ZDo6Y291dCA8PCAidWJsYXMgbWFwcGVkXHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIlxuIjsKLSAgICB9Ci0gICAgewotICAgICAgQkVOQ0goc2V0cmFuZF91Ymxhc19nZW52ZWMoY29vcmRzLHZhbHVlcyk7KQotICAgICAgc3RkOjpjb3V0IDw8ICJ1YmxhcyB2ZWNvZnZlY1x0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7Ci0gICAgfQotICAgIC8qewotICAgICAgdGltZXIucmVzZXQoKTsKLSAgICAgIHRpbWVyLnN0YXJ0KCk7Ci0gICAgICBmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spCi0gICAgICAgIHNldHJhbmRfdWJsYXNfY29tcHJlc3NlZChjb29yZHMsdmFsdWVzKTsKLSAgICAgIHRpbWVyLnN0b3AoKTsKLSAgICAgIHN0ZDo6Y291dCA8PCAidWJsYXMgY29tcFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7Ci0gICAgfQotICAgIHsKLSAgICAgIHRpbWVyLnJlc2V0KCk7Ci0gICAgICB0aW1lci5zdGFydCgpOwotICAgICAgZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKQotICAgICAgICBzZXRyYW5kX3VibGFzX2Nvb3JkKGNvb3Jkcyx2YWx1ZXMpOwotICAgICAgdGltZXIuc3RvcCgpOwotICAgICAgc3RkOjpjb3V0IDw8ICJ1YmxhcyBjb29yZFx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICJcbiI7Ci0gICAgfSovCi0gICAgI2VuZGlmCi0KLQotICAgIC8vIE1UTDQKLSAgICAjaWZuZGVmIE5PTVRMCi0gICAgewotICAgICAgQkVOQ0goc2V0cmFuZF9tdGwoY29vcmRzLHZhbHVlcykpOwotICAgICAgc3RkOjpjb3V0IDw8ICJNVExcdCIgPDwgdGltZXIudmFsdWUoKSA8PCAiXG4iOwotICAgIH0KLSAgICAjZW5kaWYKKy8vIE1UTDQKKyNpZm5kZWYgTk9NVEwKKyAgeworICAgIEJFTkNIKHNldHJhbmRfbXRsKGNvb3JkcywgdmFsdWVzKSk7CisgICAgc3RkOjpjb3V0IDw8ICJNVExcdCIgPDwgdGltZXIudmFsdWUoKSA8PCAiXG4iOworICB9CisjZW5kaWYKIAogICByZXR1cm4gMDsKIH0KIAotRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRpbm5lcnJhbmRfZWlnZW4oY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKQoteworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRpbm5lcnJhbmRfZWlnZW4oY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKSB7CiAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKLSAgU3BhcnNlTWF0cml4PFNjYWxhcj4gbWF0KFNJWkUsU0laRSk7Ci0gIC8vbWF0LnN0YXJ0RmlsbCgyMDAwMDAwLypjb29yZHMuc2l6ZSgpKi8pOwotICBmb3IgKGludCBpPTA7IGk8Y29vcmRzLnNpemUoKTsgKytpKQotICB7CisgIFNwYXJzZU1hdHJpeDxTY2FsYXI+IG1hdChTSVpFLCBTSVpFKTsKKyAgLy8gbWF0LnN0YXJ0RmlsbCgyMDAwMDAwLypjb29yZHMuc2l6ZSgpKi8pOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvb3Jkcy5zaXplKCk7ICsraSkgewogICAgIG1hdC5pbnNlcnQoY29vcmRzW2ldLngoKSwgY29vcmRzW2ldLnkoKSkgPSB2YWxzW2ldOwogICB9CiAgIG1hdC5maW5hbGl6ZSgpOwpAQCAtMjA1LDEzICsxOTcsMTEgQEAKICAgcmV0dXJuIDA7CiB9CiAKLUVJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9keW5hbWljKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKLXsKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9keW5hbWljKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykgewogICB1c2luZyBuYW1lc3BhY2UgRWlnZW47Ci0gIER5bmFtaWNTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXQoU0laRSxTSVpFKTsKLSAgbWF0LnJlc2VydmUoY29vcmRzLnNpemUoKS8xMCk7Ci0gIGZvciAoaW50IGk9MDsgaTxjb29yZHMuc2l6ZSgpOyArK2kpCi0gIHsKKyAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXI+IG1hdChTSVpFLCBTSVpFKTsKKyAgbWF0LnJlc2VydmUoY29vcmRzLnNpemUoKSAvIDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29yZHMuc2l6ZSgpOyArK2kpIHsKICAgICBtYXQuY29lZmZSZWYoY29vcmRzW2ldLngoKSwgY29vcmRzW2ldLnkoKSkgKz0gdmFsc1tpXTsKICAgfQogICBtYXQuZmluYWxpemUoKTsKQEAgLTIxOSwxNyArMjA5LDE0IEBACiAgIHJldHVybiAmbWF0LmNvZWZmUmVmKGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOwogfQogCi1FSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fc3VtZXEoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKQoteworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX2VpZ2VuX3N1bWVxKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykgewogICB1c2luZyBuYW1lc3BhY2UgRWlnZW47Ci0gIGludCBuID0gY29vcmRzLnNpemUoKS9LSzsKLSAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXI+IG1hdChTSVpFLFNJWkUpOwotICBmb3IgKGludCBqPTA7IGo8S0s7ICsraikKLSAgewotICAgIER5bmFtaWNTcGFyc2VNYXRyaXg8U2NhbGFyPiBhdXgoU0laRSxTSVpFKTsKKyAgaW50IG4gPSBjb29yZHMuc2l6ZSgpIC8gS0s7CisgIER5bmFtaWNTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXQoU0laRSwgU0laRSk7CisgIGZvciAoaW50IGogPSAwOyBqIDwgS0s7ICsraikgeworICAgIER5bmFtaWNTcGFyc2VNYXRyaXg8U2NhbGFyPiBhdXgoU0laRSwgU0laRSk7CiAgICAgbWF0LnJlc2VydmUobik7Ci0gICAgZm9yIChpbnQgaT1qKm47IGk8KGorMSkqbjsgKytpKQotICAgIHsKKyAgICBmb3IgKGludCBpID0gaiAqIG47IGkgPCAoaiArIDEpICogbjsgKytpKSB7CiAgICAgICBhdXguaW5zZXJ0KGNvb3Jkc1tpXS54KCksIGNvb3Jkc1tpXS55KCkpICs9IHZhbHNbaV07CiAgICAgfQogICAgIGF1eC5maW5hbGl6ZSgpOwpAQCAtMjM4LDEzICsyMjUsMTEgQEAKICAgcmV0dXJuICZtYXQuY29lZmZSZWYoY29vcmRzWzBdLngoKSwgY29vcmRzWzBdLnkoKSk7CiB9CiAKLUVJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9jb21wYWN0KGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKLXsKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9jb21wYWN0KGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykgewogICB1c2luZyBuYW1lc3BhY2UgRWlnZW47Ci0gIER5bmFtaWNTcGFyc2VNYXRyaXg8U2NhbGFyPiBzZXR0ZXIoU0laRSxTSVpFKTsKLSAgc2V0dGVyLnJlc2VydmUoY29vcmRzLnNpemUoKS8xMCk7Ci0gIGZvciAoaW50IGk9MDsgaTxjb29yZHMuc2l6ZSgpOyArK2kpCi0gIHsKKyAgRHluYW1pY1NwYXJzZU1hdHJpeDxTY2FsYXI+IHNldHRlcihTSVpFLCBTSVpFKTsKKyAgc2V0dGVyLnJlc2VydmUoY29vcmRzLnNpemUoKSAvIDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29yZHMuc2l6ZSgpOyArK2kpIHsKICAgICBzZXR0ZXIuY29lZmZSZWYoY29vcmRzW2ldLngoKSwgY29vcmRzW2ldLnkoKSkgKz0gdmFsc1tpXTsKICAgfQogICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXQgPSBzZXR0ZXI7CkBAIC0yNTIsMTQgKzIzNywxMiBAQAogICByZXR1cm4gJm1hdC5jb2VmZlJlZihjb29yZHNbMF0ueCgpLCBjb29yZHNbMF0ueSgpKTsKIH0KIAotRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX2VpZ2VuX2dudV9oYXNoKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKLXsKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9nbnVfaGFzaChjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpIHsKICAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwotICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXQoU0laRSxTSVpFKTsKKyAgU3BhcnNlTWF0cml4PFNjYWxhcj4gbWF0KFNJWkUsIFNJWkUpOwogICB7Ci0gICAgUmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeDxTY2FsYXI+LCBTdGRNYXBUcmFpdHMgPiBzZXR0ZXIobWF0KTsKLSAgICBmb3IgKGludCBpPTA7IGk8Y29vcmRzLnNpemUoKTsgKytpKQotICAgIHsKKyAgICBSYW5kb21TZXR0ZXI8U3BhcnNlTWF0cml4PFNjYWxhcj4sIFN0ZE1hcFRyYWl0cz4gc2V0dGVyKG1hdCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29yZHMuc2l6ZSgpOyArK2kpIHsKICAgICAgIHNldHRlcihjb29yZHNbaV0ueCgpLCBjb29yZHNbaV0ueSgpKSArPSB2YWxzW2ldOwogICAgIH0KICAgICBDSEVDS19NRU07CkBAIC0yNjgsMTQ4ICsyNTEsMTI2IEBACiB9CiAKICNpZm5kZWYgTk9HT09HTEUKLUVJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9laWdlbl9nb29nbGVfZGVuc2UoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKQoteworRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX2VpZ2VuX2dvb2dsZV9kZW5zZShjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpIHsKICAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwotICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXQoU0laRSxTSVpFKTsKKyAgU3BhcnNlTWF0cml4PFNjYWxhcj4gbWF0KFNJWkUsIFNJWkUpOwogICB7CiAgICAgUmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeDxTY2FsYXI+LCBHb29nbGVEZW5zZUhhc2hNYXBUcmFpdHM+IHNldHRlcihtYXQpOwotICAgIGZvciAoaW50IGk9MDsgaTxjb29yZHMuc2l6ZSgpOyArK2kpCi0gICAgICBzZXR0ZXIoY29vcmRzW2ldLngoKSwgY29vcmRzW2ldLnkoKSkgKz0gdmFsc1tpXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb3Jkcy5zaXplKCk7ICsraSkgc2V0dGVyKGNvb3Jkc1tpXS54KCksIGNvb3Jkc1tpXS55KCkpICs9IHZhbHNbaV07CiAgICAgQ0hFQ0tfTUVNOwogICB9CiAgIHJldHVybiAmbWF0LmNvZWZmUmVmKGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOwogfQogCi1FSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fZ29vZ2xlX3NwYXJzZShjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpCi17CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfZWlnZW5fZ29vZ2xlX3NwYXJzZShjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpIHsKICAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwotICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXQoU0laRSxTSVpFKTsKKyAgU3BhcnNlTWF0cml4PFNjYWxhcj4gbWF0KFNJWkUsIFNJWkUpOwogICB7CiAgICAgUmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeDxTY2FsYXI+LCBHb29nbGVTcGFyc2VIYXNoTWFwVHJhaXRzPiBzZXR0ZXIobWF0KTsKLSAgICBmb3IgKGludCBpPTA7IGk8Y29vcmRzLnNpemUoKTsgKytpKQotICAgICAgc2V0dGVyKGNvb3Jkc1tpXS54KCksIGNvb3Jkc1tpXS55KCkpICs9IHZhbHNbaV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29yZHMuc2l6ZSgpOyArK2kpIHNldHRlcihjb29yZHNbaV0ueCgpLCBjb29yZHNbaV0ueSgpKSArPSB2YWxzW2ldOwogICAgIENIRUNLX01FTTsKICAgfQogICByZXR1cm4gJm1hdC5jb2VmZlJlZihjb29yZHNbMF0ueCgpLCBjb29yZHNbMF0ueSgpKTsKIH0KICNlbmRpZgogCi0KIHRlbXBsYXRlIDxjbGFzcyBUPgotdm9pZCBjb29fdG9jc3IoY29uc3QgaW50IG5fcm93LAotICAgICAgICAgICAgICAgY29uc3QgaW50IG5fY29sLAotICAgICAgICAgICAgICAgY29uc3QgaW50IG5ueiwKLSAgICAgICAgICAgICAgIGNvbnN0IENvb3JkaW5hdGVzIEFpaiwKLSAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlcyBBeCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBCcFtdLAotICAgICAgICAgICAgICAgICAgICAgaW50IEJqW10sCi0gICAgICAgICAgICAgICAgICAgICBUIEJ4W10pCi17Ci0gICAgLy9jb21wdXRlIG51bWJlciBvZiBub24temVybyBlbnRyaWVzIHBlciByb3cgb2YgQSBjb29fdG9jc3IKLSAgICBzdGQ6OmZpbGwoQnAsIEJwICsgbl9yb3csIDApOwordm9pZCBjb29fdG9jc3IoY29uc3QgaW50IG5fcm93LCBjb25zdCBpbnQgbl9jb2wsIGNvbnN0IGludCBubnosIGNvbnN0IENvb3JkaW5hdGVzIEFpaiwgY29uc3QgVmFsdWVzIEF4LCBpbnQgQnBbXSwKKyAgICAgICAgICAgICAgIGludCBCaltdLCBUIEJ4W10pIHsKKyAgLy8gY29tcHV0ZSBudW1iZXIgb2Ygbm9uLXplcm8gZW50cmllcyBwZXIgcm93IG9mIEEgY29vX3RvY3NyCisgIHN0ZDo6ZmlsbChCcCwgQnAgKyBuX3JvdywgMCk7CiAKLSAgICBmb3IgKGludCBuID0gMDsgbiA8IG5uejsgbisrKXsKLSAgICAgICAgQnBbQWlqW25dLngoKV0rKzsKLSAgICB9CisgIGZvciAoaW50IG4gPSAwOyBuIDwgbm56OyBuKyspIHsKKyAgICBCcFtBaWpbbl0ueCgpXSsrOworICB9CiAKLSAgICAvL2N1bXN1bSB0aGUgbm56IHBlciByb3cgdG8gZ2V0IEJwW10KLSAgICBmb3IoaW50IGkgPSAwLCBjdW1zdW0gPSAwOyBpIDwgbl9yb3c7IGkrKyl7Ci0gICAgICAgIGludCB0ZW1wID0gQnBbaV07Ci0gICAgICAgIEJwW2ldID0gY3Vtc3VtOwotICAgICAgICBjdW1zdW0gKz0gdGVtcDsKLSAgICB9Ci0gICAgQnBbbl9yb3ddID0gbm56OworICAvLyBjdW1zdW0gdGhlIG5ueiBwZXIgcm93IHRvIGdldCBCcFtdCisgIGZvciAoaW50IGkgPSAwLCBjdW1zdW0gPSAwOyBpIDwgbl9yb3c7IGkrKykgeworICAgIGludCB0ZW1wID0gQnBbaV07CisgICAgQnBbaV0gPSBjdW1zdW07CisgICAgY3Vtc3VtICs9IHRlbXA7CisgIH0KKyAgQnBbbl9yb3ddID0gbm56OwogCi0gICAgLy93cml0ZSBBaixBeCBpbnRvIEJqLEJ4Ci0gICAgZm9yKGludCBuID0gMDsgbiA8IG5uejsgbisrKXsKLSAgICAgICAgaW50IHJvdyAgPSBBaWpbbl0ueCgpOwotICAgICAgICBpbnQgZGVzdCA9IEJwW3Jvd107CisgIC8vIHdyaXRlIEFqLEF4IGludG8gQmosQngKKyAgZm9yIChpbnQgbiA9IDA7IG4gPCBubno7IG4rKykgeworICAgIGludCByb3cgPSBBaWpbbl0ueCgpOworICAgIGludCBkZXN0ID0gQnBbcm93XTsKIAotICAgICAgICBCaltkZXN0XSA9IEFpaltuXS55KCk7Ci0gICAgICAgIEJ4W2Rlc3RdID0gQXhbbl07CisgICAgQmpbZGVzdF0gPSBBaWpbbl0ueSgpOworICAgIEJ4W2Rlc3RdID0gQXhbbl07CiAKLSAgICAgICAgQnBbcm93XSsrOwotICAgIH0KKyAgICBCcFtyb3ddKys7CisgIH0KIAotICAgIGZvcihpbnQgaSA9IDAsIGxhc3QgPSAwOyBpIDw9IG5fcm93OyBpKyspewotICAgICAgICBpbnQgdGVtcCA9IEJwW2ldOwotICAgICAgICBCcFtpXSAgPSBsYXN0OwotICAgICAgICBsYXN0ICAgPSB0ZW1wOwotICAgIH0KKyAgZm9yIChpbnQgaSA9IDAsIGxhc3QgPSAwOyBpIDw9IG5fcm93OyBpKyspIHsKKyAgICBpbnQgdGVtcCA9IEJwW2ldOworICAgIEJwW2ldID0gbGFzdDsKKyAgICBsYXN0ID0gdGVtcDsKKyAgfQogCi0gICAgLy9ub3cgQnAsQmosQnggZm9ybSBhIENTUiByZXByZXNlbnRhdGlvbiAod2l0aCBwb3NzaWJsZSBkdXBsaWNhdGVzKQorICAvLyBub3cgQnAsQmosQnggZm9ybSBhIENTUiByZXByZXNlbnRhdGlvbiAod2l0aCBwb3NzaWJsZSBkdXBsaWNhdGVzKQogfQogCi10ZW1wbGF0ZTwgY2xhc3MgVDEsIGNsYXNzIFQyID4KLWJvb2wga3ZfcGFpcl9sZXNzKGNvbnN0IHN0ZDo6cGFpcjxUMSxUMj4mIHgsIGNvbnN0IHN0ZDo6cGFpcjxUMSxUMj4mIHkpewotICAgIHJldHVybiB4LmZpcnN0IDwgeS5maXJzdDsKLX0KLQotCi10ZW1wbGF0ZTxjbGFzcyBJLCBjbGFzcyBUPgotdm9pZCBjc3Jfc29ydF9pbmRpY2VzKGNvbnN0IEkgbl9yb3csCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSSBBcFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgQWpbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIEF4W10pCi17Ci0gICAgc3RkOjp2ZWN0b3I8IHN0ZDo6cGFpcjxJLFQ+ID4gdGVtcDsKLQotICAgIGZvcihJIGkgPSAwOyBpIDwgbl9yb3c7IGkrKyl7Ci0gICAgICAgIEkgcm93X3N0YXJ0ID0gQXBbaV07Ci0gICAgICAgIEkgcm93X2VuZCAgID0gQXBbaSsxXTsKLQotICAgICAgICB0ZW1wLmNsZWFyKCk7Ci0KLSAgICAgICAgZm9yKEkgamogPSByb3dfc3RhcnQ7IGpqIDwgcm93X2VuZDsgamorKyl7Ci0gICAgICAgICAgICB0ZW1wLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihBaltqal0sQXhbampdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGQ6OnNvcnQodGVtcC5iZWdpbigpLHRlbXAuZW5kKCksa3ZfcGFpcl9sZXNzPEksVD4pOwotCi0gICAgICAgIGZvcihJIGpqID0gcm93X3N0YXJ0LCBuID0gMDsgamogPCByb3dfZW5kOyBqaisrLCBuKyspewotICAgICAgICAgICAgQWpbampdID0gdGVtcFtuXS5maXJzdDsKLSAgICAgICAgICAgIEF4W2pqXSA9IHRlbXBbbl0uc2Vjb25kOwotICAgICAgICB9Ci0gICAgfQordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK2Jvb2wga3ZfcGFpcl9sZXNzKGNvbnN0IHN0ZDo6cGFpcjxUMSwgVDI+JiB4LCBjb25zdCBzdGQ6OnBhaXI8VDEsIFQyPiYgeSkgeworICByZXR1cm4geC5maXJzdCA8IHkuZmlyc3Q7CiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBJLCBjbGFzcyBUPgotdm9pZCBjc3Jfc3VtX2R1cGxpY2F0ZXMoY29uc3QgSSBuX3JvdywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEkgbl9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIEFwW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIEFqW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIEF4W10pCi17Ci0gICAgSSBubnogPSAwOwotICAgIEkgcm93X2VuZCA9IDA7Ci0gICAgZm9yKEkgaSA9IDA7IGkgPCBuX3JvdzsgaSsrKXsKLSAgICAgICAgSSBqaiA9IHJvd19lbmQ7Ci0gICAgICAgIHJvd19lbmQgPSBBcFtpKzFdOwotICAgICAgICB3aGlsZSggamogPCByb3dfZW5kICl7Ci0gICAgICAgICAgICBJIGogPSBBaltqal07Ci0gICAgICAgICAgICBUIHggPSBBeFtqal07Ci0gICAgICAgICAgICBqaisrOwotICAgICAgICAgICAgd2hpbGUoIGpqIDwgcm93X2VuZCAmJiBBaltqal0gPT0gaiApewotICAgICAgICAgICAgICAgIHggKz0gQXhbampdOwotICAgICAgICAgICAgICAgIGpqKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBaltubnpdID0gajsKLSAgICAgICAgICAgIEF4W25uel0gPSB4OwotICAgICAgICAgICAgbm56Kys7Ci0gICAgICAgIH0KLSAgICAgICAgQXBbaSsxXSA9IG5uejsKK3ZvaWQgY3NyX3NvcnRfaW5kaWNlcyhjb25zdCBJIG5fcm93LCBjb25zdCBJIEFwW10sIEkgQWpbXSwgVCBBeFtdKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxJLCBUPiA+IHRlbXA7CisKKyAgZm9yIChJIGkgPSAwOyBpIDwgbl9yb3c7IGkrKykgeworICAgIEkgcm93X3N0YXJ0ID0gQXBbaV07CisgICAgSSByb3dfZW5kID0gQXBbaSArIDFdOworCisgICAgdGVtcC5jbGVhcigpOworCisgICAgZm9yIChJIGpqID0gcm93X3N0YXJ0OyBqaiA8IHJvd19lbmQ7IGpqKyspIHsKKyAgICAgIHRlbXAucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEFqW2pqXSwgQXhbampdKSk7CiAgICAgfQorCisgICAgc3RkOjpzb3J0KHRlbXAuYmVnaW4oKSwgdGVtcC5lbmQoKSwga3ZfcGFpcl9sZXNzPEksIFQ+KTsKKworICAgIGZvciAoSSBqaiA9IHJvd19zdGFydCwgbiA9IDA7IGpqIDwgcm93X2VuZDsgamorKywgbisrKSB7CisgICAgICBBaltqal0gPSB0ZW1wW25dLmZpcnN0OworICAgICAgQXhbampdID0gdGVtcFtuXS5zZWNvbmQ7CisgICAgfQorICB9CiB9CiAKLUVJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9zY2lweShjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpCi17Cit0ZW1wbGF0ZSA8Y2xhc3MgSSwgY2xhc3MgVD4KK3ZvaWQgY3NyX3N1bV9kdXBsaWNhdGVzKGNvbnN0IEkgbl9yb3csIGNvbnN0IEkgbl9jb2wsIEkgQXBbXSwgSSBBaltdLCBUIEF4W10pIHsKKyAgSSBubnogPSAwOworICBJIHJvd19lbmQgPSAwOworICBmb3IgKEkgaSA9IDA7IGkgPCBuX3JvdzsgaSsrKSB7CisgICAgSSBqaiA9IHJvd19lbmQ7CisgICAgcm93X2VuZCA9IEFwW2kgKyAxXTsKKyAgICB3aGlsZSAoamogPCByb3dfZW5kKSB7CisgICAgICBJIGogPSBBaltqal07CisgICAgICBUIHggPSBBeFtqal07CisgICAgICBqaisrOworICAgICAgd2hpbGUgKGpqIDwgcm93X2VuZCAmJiBBaltqal0gPT0gaikgeworICAgICAgICB4ICs9IEF4W2pqXTsKKyAgICAgICAgamorKzsKKyAgICAgIH0KKyAgICAgIEFqW25uel0gPSBqOworICAgICAgQXhbbm56XSA9IHg7CisgICAgICBubnorKzsKKyAgICB9CisgICAgQXBbaSArIDFdID0gbm56OworICB9Cit9CisKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF9zY2lweShjb25zdCBDb29yZGluYXRlcyYgY29vcmRzLCBjb25zdCBWYWx1ZXMmIHZhbHMpIHsKICAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwotICBTcGFyc2VNYXRyaXg8U2NhbGFyPiBtYXQoU0laRSxTSVpFKTsKKyAgU3BhcnNlTWF0cml4PFNjYWxhcj4gbWF0KFNJWkUsIFNJWkUpOwogICBtYXQucmVzaXplTm9uWmVyb3MoY29vcmRzLnNpemUoKSk7Ci0vLyAgIHN0ZDo6Y2VyciA8PCAic2V0cmFuZF9zY2lweS4uLlxuIjsKLSAgY29vX3RvY3NyPFNjYWxhcj4oU0laRSxTSVpFLCBjb29yZHMuc2l6ZSgpLCBjb29yZHMsIHZhbHMsIG1hdC5fb3V0ZXJJbmRleFB0cigpLCBtYXQuX2lubmVySW5kZXhQdHIoKSwgbWF0Ll92YWx1ZVB0cigpKTsKLS8vICAgc3RkOjpjZXJyIDw8ICJjb29fdG9jc3Igb2tcbiI7CisgIC8vICAgc3RkOjpjZXJyIDw8ICJzZXRyYW5kX3NjaXB5Li4uXG4iOworICBjb29fdG9jc3I8U2NhbGFyPihTSVpFLCBTSVpFLCBjb29yZHMuc2l6ZSgpLCBjb29yZHMsIHZhbHMsIG1hdC5fb3V0ZXJJbmRleFB0cigpLCBtYXQuX2lubmVySW5kZXhQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgbWF0Ll92YWx1ZVB0cigpKTsKKyAgLy8gICBzdGQ6OmNlcnIgPDwgImNvb190b2NzciBva1xuIjsKIAogICBjc3Jfc29ydF9pbmRpY2VzKFNJWkUsIG1hdC5fb3V0ZXJJbmRleFB0cigpLCBtYXQuX2lubmVySW5kZXhQdHIoKSwgbWF0Ll92YWx1ZVB0cigpKTsKIApAQCAtNDIwLDIxICszODEsMTggQEAKICAgcmV0dXJuICZtYXQuY29lZmZSZWYoY29vcmRzWzBdLngoKSwgY29vcmRzWzBdLnkoKSk7CiB9CiAKLQogI2lmbmRlZiBOT1VCTEFTCi1FSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfdWJsYXNfbWFwcGVkKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKLXsKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF91Ymxhc19tYXBwZWQoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKSB7CiAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDsKICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpudW1lcmljOwogICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6Om51bWVyaWM6OnVibGFzOwotICBtYXBwZWRfbWF0cml4PFNjYWxhcj4gYXV4KFNJWkUsU0laRSk7Ci0gIGZvciAoaW50IGk9MDsgaTxjb29yZHMuc2l6ZSgpOyArK2kpCi0gIHsKKyAgbWFwcGVkX21hdHJpeDxTY2FsYXI+IGF1eChTSVpFLCBTSVpFKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29yZHMuc2l6ZSgpOyArK2kpIHsKICAgICBhdXgoY29vcmRzW2ldLngoKSwgY29vcmRzW2ldLnkoKSkgKz0gdmFsc1tpXTsKICAgfQogICBDSEVDS19NRU07CiAgIGNvbXByZXNzZWRfbWF0cml4PFNjYWxhcj4gbWF0KGF1eCk7Ci0gIHJldHVybiAwOy8vICZtYXQoY29vcmRzWzBdLngoKSwgY29vcmRzWzBdLnkoKSk7CisgIHJldHVybiAwOyAgLy8gJm1hdChjb29yZHNbMF0ueCgpLCBjb29yZHNbMF0ueSgpKTsKIH0KIC8qRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyKiBzZXRyYW5kX3VibGFzX2Nvb3JkKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKIHsKQEAgLTQ2MSwyNSArNDE5LDIyIEBACiAgIH0KICAgcmV0dXJuIDA7Ly8mbWF0KGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOwogfSovCi1FSUdFTl9ET05UX0lOTElORSBTY2FsYXIqIHNldHJhbmRfdWJsYXNfZ2VudmVjKGNvbnN0IENvb3JkaW5hdGVzJiBjb29yZHMsIGNvbnN0IFZhbHVlcyYgdmFscykKLXsKK0VJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciogc2V0cmFuZF91Ymxhc19nZW52ZWMoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKSB7CiAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDsKICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpudW1lcmljOwogICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6Om51bWVyaWM6OnVibGFzOwogCi0vLyAgIHVibGFzOjp2ZWN0b3I8Y29vcmRpbmF0ZV92ZWN0b3I8U2NhbGFyPiA+IGZvbzsKLSAgZ2VuZXJhbGl6ZWRfdmVjdG9yX29mX3ZlY3RvcjxTY2FsYXIsIHJvd19tYWpvciwgdWJsYXM6OnZlY3Rvcjxjb29yZGluYXRlX3ZlY3RvcjxTY2FsYXI+ID4gPiBhdXgoU0laRSxTSVpFKTsKLSAgZm9yIChpbnQgaT0wOyBpPGNvb3Jkcy5zaXplKCk7ICsraSkKLSAgeworICAvLyAgIHVibGFzOjp2ZWN0b3I8Y29vcmRpbmF0ZV92ZWN0b3I8U2NhbGFyPiA+IGZvbzsKKyAgZ2VuZXJhbGl6ZWRfdmVjdG9yX29mX3ZlY3RvcjxTY2FsYXIsIHJvd19tYWpvciwgdWJsYXM6OnZlY3Rvcjxjb29yZGluYXRlX3ZlY3RvcjxTY2FsYXI+ID4gPiBhdXgoU0laRSwgU0laRSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY29vcmRzLnNpemUoKTsgKytpKSB7CiAgICAgYXV4KGNvb3Jkc1tpXS54KCksIGNvb3Jkc1tpXS55KCkpICs9IHZhbHNbaV07CiAgIH0KICAgQ0hFQ0tfTUVNOwotICBjb21wcmVzc2VkX21hdHJpeDxTY2FsYXIscm93X21ham9yPiBtYXQoYXV4KTsKLSAgcmV0dXJuIDA7Ly8mbWF0KGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOworICBjb21wcmVzc2VkX21hdHJpeDxTY2FsYXIsIHJvd19tYWpvcj4gbWF0KGF1eCk7CisgIHJldHVybiAwOyAgLy8mbWF0KGNvb3Jkc1swXS54KCksIGNvb3Jkc1swXS55KCkpOwogfQogI2VuZGlmCiAKICNpZm5kZWYgTk9NVEwKIEVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgc2V0cmFuZF9tdGwoY29uc3QgQ29vcmRpbmF0ZXMmIGNvb3JkcywgY29uc3QgVmFsdWVzJiB2YWxzKTsKICNlbmRpZgotCmRpZmYgLS1naXQgYS9iZW5jaC9zcGFyc2VfdHJhbnNwb3NlLmNwcCBiL2JlbmNoL3NwYXJzZV90cmFuc3Bvc2UuY3BwCmluZGV4IGM5YWFjZjUuLjE4M2IzNTMgMTAwNjQ0Ci0tLSBhL2JlbmNoL3NwYXJzZV90cmFuc3Bvc2UuY3BwCisrKyBiL2JlbmNoL3NwYXJzZV90cmFuc3Bvc2UuY3BwCkBAIC0xLDcgKzEsOSBAQAogCi0vL2crKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfdHJhbnNwb3NlLmNwcCAtSS4uIC1JL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAtRERFTlNJVFk9MC4wMDUgLURTSVpFPTEwMDAwICYmIC4vYS5vdXQKLS8vIC1ETk9HTU0gLUROT01UTAotLy8gLURDU1BBUlNFIC1JIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9JbmNsdWRlLyAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL0NTcGFyc2UvTGliL2xpYmNzcGFyc2UuYQorLy8gZysrIC1PMyAtZzAgLUROREVCVUcgIHNwYXJzZV90cmFuc3Bvc2UuY3BwIC1JLi4gLUkvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL210bDQvIC1EREVOU0lUWT0wLjAwNSAtRFNJWkU9MTAwMDAKKy8vICYmIC4vYS5vdXQKKy8vICAtRE5PR01NIC1ETk9NVEwKKy8vICAtRENTUEFSU0UgLUkgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0luY2x1ZGUvCisvLyAgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0xpYi9saWJjc3BhcnNlLmEKIAogI2lmbmRlZiBTSVpFCiAjZGVmaW5lIFNJWkUgMTAwMDAKQEAgLTI1LDgwICsyNyw4MiBAQAogI2RlZmluZSBOQlRSSUVTIDEwCiAjZW5kaWYKIAotI2RlZmluZSBCRU5DSChYKSBcCi0gIHRpbWVyLnJlc2V0KCk7IFwKLSAgZm9yIChpbnQgX2o9MDsgX2o8TkJUUklFUzsgKytfaikgeyBcCi0gICAgdGltZXIuc3RhcnQoKTsgXAotICAgIGZvciAoaW50IF9rPTA7IF9rPFJFUEVBVDsgKytfaykgeyBcCi0gICAgICAgIFggIFwKLSAgfSB0aW1lci5zdG9wKCk7IH0KKyNkZWZpbmUgQkVOQ0goWCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGltZXIucmVzZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpbnQgX2ogPSAwOyBfaiA8IE5CVFJJRVM7ICsrX2opIHsgIFwKKyAgICB0aW1lci5zdGFydCgpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGludCBfayA9IDA7IF9rIDwgUkVQRUFUOyArK19rKSB7IFwKKyAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lci5zdG9wKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoteworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICBpbnQgcm93cyA9IFNJWkU7CiAgIGludCBjb2xzID0gU0laRTsKICAgZmxvYXQgZGVuc2l0eSA9IERFTlNJVFk7CiAKLSAgRWlnZW5TcGFyc2VNYXRyaXggc20xKHJvd3MsY29scyksIHNtMyhyb3dzLGNvbHMpOworICBFaWdlblNwYXJzZU1hdHJpeCBzbTEocm93cywgY29scyksIHNtMyhyb3dzLCBjb2xzKTsKIAogICBCZW5jaFRpbWVyIHRpbWVyOwotICBmb3IgKGZsb2F0IGRlbnNpdHkgPSBERU5TSVRZOyBkZW5zaXR5Pj1NSU5ERU5TSVRZOyBkZW5zaXR5Kj0wLjUpCi0gIHsKKyAgZm9yIChmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsgZGVuc2l0eSA+PSBNSU5ERU5TSVRZOyBkZW5zaXR5ICo9IDAuNSkgewogICAgIGZpbGxNYXRyaXgoZGVuc2l0eSwgcm93cywgY29scywgc20xKTsKIAotICAgIC8vIGRlbnNlIG1hdHJpY2VzCi0gICAgI2lmZGVmIERFTlNFTUFUUklYCisvLyBkZW5zZSBtYXRyaWNlcworI2lmZGVmIERFTlNFTUFUUklYCiAgICAgewotICAgICAgRGVuc2VNYXRyaXggbTEocm93cyxjb2xzKSwgbTMocm93cyxjb2xzKTsKKyAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKTsKICAgICAgIGVpVG9EZW5zZShzbTEsIG0xKTsKLSAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgbTMgPSBtMS50cmFuc3Bvc2UoKTspCisgICAgICBCRU5DSChmb3IgKGludCBrID0gMDsgayA8IFJFUEVBVDsgKytrKSBtMyA9IG0xLnRyYW5zcG9zZSgpOykKICAgICAgIHN0ZDo6Y291dCA8PCAiICBFaWdlbiBkZW5zZTpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwogICAgIH0KLSAgICAjZW5kaWYKKyNlbmRpZgogCi0gICAgc3RkOjpjb3V0IDw8ICJOb24gemVyb3M6ICIgPDwgc20xLm5vblplcm9zKCkvZmxvYXQoc20xLnJvd3MoKSpzbTEuY29scygpKSoxMDAgPDwgIiVcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJOb24gemVyb3M6ICIgPDwgc20xLm5vblplcm9zKCkgLyBmbG9hdChzbTEucm93cygpICogc20xLmNvbHMoKSkgKiAxMDAgPDwgIiVcbiI7CiAKICAgICAvLyBlaWdlbiBzcGFyc2UgbWF0cmljZXMKICAgICB7Ci0gICAgICBCRU5DSChmb3IgKGludCBrPTA7IGs8UkVQRUFUOyArK2spIHNtMyA9IHNtMS50cmFuc3Bvc2UoKTspCisgICAgICBCRU5DSChmb3IgKGludCBrID0gMDsgayA8IFJFUEVBVDsgKytrKSBzbTMgPSBzbTEudHJhbnNwb3NlKCk7KQogICAgICAgc3RkOjpjb3V0IDw8ICIgIEVpZ2VuOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CiAgICAgfQogCi0gICAgLy8gQ1NwYXJzZQotICAgICNpZmRlZiBDU1BBUlNFCisvLyBDU3BhcnNlCisjaWZkZWYgQ1NQQVJTRQogICAgIHsKICAgICAgIGNzICptMSwgKm0zOwogICAgICAgZWlUb0NTcGFyc2Uoc20xLCBtMSk7CiAKLSAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgeyBtMyA9IGNzX3RyYW5zcG9zZShtMSwxKTsgY3Nfc3BmcmVlKG0zKTt9KQorICAgICAgQkVOQ0goZm9yIChpbnQgayA9IDA7IGsgPCBSRVBFQVQ7ICsraykgeworICAgICAgICBtMyA9IGNzX3RyYW5zcG9zZShtMSwgMSk7CisgICAgICAgIGNzX3NwZnJlZShtMyk7CisgICAgICB9KQogICAgICAgc3RkOjpjb3V0IDw8ICIgIENTcGFyc2U6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAotICAgIC8vIEdNTSsrCi0gICAgI2lmbmRlZiBOT0dNTQorLy8gR01NKysKKyNpZm5kZWYgTk9HTU0KICAgICB7Ci0gICAgICBHbW1EeW5TcGFyc2UgIGdtbVQzKHJvd3MsY29scyk7Ci0gICAgICBHbW1TcGFyc2UgbTEocm93cyxjb2xzKSwgbTMocm93cyxjb2xzKTsKKyAgICAgIEdtbUR5blNwYXJzZSBnbW1UMyhyb3dzLCBjb2xzKTsKKyAgICAgIEdtbVNwYXJzZSBtMShyb3dzLCBjb2xzKSwgbTMocm93cywgY29scyk7CiAgICAgICBlaVRvR21tKHNtMSwgbTEpOwotICAgICAgQkVOQ0goZm9yIChpbnQgaz0wOyBrPFJFUEVBVDsgKytrKSBnbW06OmNvcHkoZ21tOjp0cmFuc3Bvc2VkKG0xKSxtMyk7KQorICAgICAgQkVOQ0goZm9yIChpbnQgayA9IDA7IGsgPCBSRVBFQVQ7ICsraykgZ21tOjpjb3B5KGdtbTo6dHJhbnNwb3NlZChtMSksIG0zKTspCiAgICAgICBzdGQ6OmNvdXQgPDwgIiAgR01NOlx0XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAotICAgIC8vIE1UTDQKLSAgICAjaWZuZGVmIE5PTVRMCisvLyBNVEw0CisjaWZuZGVmIE5PTVRMCiAgICAgewotICAgICAgTXRsU3BhcnNlIG0xKHJvd3MsY29scyksIG0zKHJvd3MsY29scyk7CisgICAgICBNdGxTcGFyc2UgbTEocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMpOwogICAgICAgZWlUb010bChzbTEsIG0xKTsKLSAgICAgIEJFTkNIKGZvciAoaW50IGs9MDsgazxSRVBFQVQ7ICsraykgbTMgPSB0cmFucyhtMSk7KQorICAgICAgQkVOQ0goZm9yIChpbnQgayA9IDA7IGsgPCBSRVBFQVQ7ICsraykgbTMgPSB0cmFucyhtMSk7KQogICAgICAgc3RkOjpjb3V0IDw8ICIgIE1UTDQ6XHRcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwogICAgIH0KLSAgICAjZW5kaWYKKyNlbmRpZgogCiAgICAgc3RkOjpjb3V0IDw8ICJcblxuIjsKICAgfQogCiAgIHJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9iZW5jaC9zcGFyc2VfdHJpc29sdmVyLmNwcCBiL2JlbmNoL3NwYXJzZV90cmlzb2x2ZXIuY3BwCmluZGV4IDEzZjRmMGEuLjZmNTNiYTkgMTAwNjQ0Ci0tLSBhL2JlbmNoL3NwYXJzZV90cmlzb2x2ZXIuY3BwCisrKyBiL2JlbmNoL3NwYXJzZV90cmlzb2x2ZXIuY3BwCkBAIC0xLDggKzEsOSBAQAogCi0vL2crKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDA1IC1EU0laRT0xMDAwMCAmJiAuL2Eub3V0Ci0vL2crKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDUgLURTSVpFPTIwMDAgJiYgLi9hLm91dAotLy8gLUROT0dNTSAtRE5PTVRMCi0vLyAtSSAvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL0NTcGFyc2UvSW5jbHVkZS8gL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0xpYi9saWJjc3BhcnNlLmEKKy8vIGcrKyAtTzMgLWcwIC1ETkRFQlVHICBzcGFyc2VfcHJvZHVjdC5jcHAgLUkuLiAtSS9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gLURERU5TSVRZPTAuMDA1IC1EU0laRT0xMDAwMCAmJgorLy8gLi9hLm91dCBnKysgLU8zIC1nMCAtRE5ERUJVRyAgc3BhcnNlX3Byb2R1Y3QuY3BwIC1JLi4gLUkvaG9tZS9nYWVsL0NvZGluZy9MaW5lYXJBbGdlYnJhL210bDQvIC1EREVOU0lUWT0wLjA1CisvLyAtRFNJWkU9MjAwMCAmJiAuL2Eub3V0CisvLyAgLUROT0dNTSAtRE5PTVRMCisvLyAgLUkgL2hvbWUvZ2FlbC9Db2RpbmcvTGluZWFyQWxnZWJyYS9DU3BhcnNlL0luY2x1ZGUvIC9ob21lL2dhZWwvQ29kaW5nL0xpbmVhckFsZ2VicmEvQ1NwYXJzZS9MaWIvbGliY3NwYXJzZS5hCiAKICNpZm5kZWYgU0laRQogI2RlZmluZSBTSVpFIDEwMDAwCkBAIC0yNiwxNjMgKzI3LDE1OCBAQAogI2RlZmluZSBOQlRSSUVTIDEwCiAjZW5kaWYKIAotI2RlZmluZSBCRU5DSChYKSBcCi0gIHRpbWVyLnJlc2V0KCk7IFwKLSAgZm9yIChpbnQgX2o9MDsgX2o8TkJUUklFUzsgKytfaikgeyBcCi0gICAgdGltZXIuc3RhcnQoKTsgXAotICAgIGZvciAoaW50IF9rPTA7IF9rPFJFUEVBVDsgKytfaykgeyBcCi0gICAgICAgIFggIFwKLSAgfSB0aW1lci5zdG9wKCk7IH0KKyNkZWZpbmUgQkVOQ0goWCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGltZXIucmVzZXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpbnQgX2ogPSAwOyBfaiA8IE5CVFJJRVM7ICsrX2opIHsgIFwKKyAgICB0aW1lci5zdGFydCgpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGludCBfayA9IDA7IF9rIDwgUkVQRUFUOyArK19rKSB7IFwKKyAgICAgIFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lci5zdG9wKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCi10eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsVXBwZXJUcmlhbmd1bGFyPiBFaWdlblNwYXJzZVRyaU1hdHJpeDsKLXR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixSb3dNYWpvckJpdHxVcHBlclRyaWFuZ3VsYXI+IEVpZ2VuU3BhcnNlVHJpTWF0cml4Um93OwordHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLCBVcHBlclRyaWFuZ3VsYXI+IEVpZ2VuU3BhcnNlVHJpTWF0cml4OwordHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLCBSb3dNYWpvckJpdCB8IFVwcGVyVHJpYW5ndWxhcj4gRWlnZW5TcGFyc2VUcmlNYXRyaXhSb3c7CiAKLXZvaWQgZmlsbE1hdHJpeChmbG9hdCBkZW5zaXR5LCBpbnQgcm93cywgaW50IGNvbHMsICBFaWdlblNwYXJzZVRyaU1hdHJpeCYgZHN0KQotewotICBkc3Quc3RhcnRGaWxsKHJvd3MqY29scypkZW5zaXR5KTsKLSAgZm9yKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykKLSAgewotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBqOyBpKyspCi0gICAgewotICAgICAgU2NhbGFyIHYgPSAoaW50ZXJuYWw6OnJhbmRvbTxmbG9hdD4oMCwxKSA8IGRlbnNpdHkpID8gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgOiAwOwotICAgICAgaWYgKHYhPTApCi0gICAgICAgIGRzdC5maWxsKGksaikgPSB2Owordm9pZCBmaWxsTWF0cml4KGZsb2F0IGRlbnNpdHksIGludCByb3dzLCBpbnQgY29scywgRWlnZW5TcGFyc2VUcmlNYXRyaXggJmRzdCkgeworICBkc3Quc3RhcnRGaWxsKHJvd3MgKiBjb2xzICogZGVuc2l0eSk7CisgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICAgIFNjYWxhciB2ID0gKGludGVybmFsOjpyYW5kb208ZmxvYXQ+KDAsIDEpIDwgZGVuc2l0eSkgPyBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSA6IDA7CisgICAgICBpZiAodiAhPSAwKSBkc3QuZmlsbChpLCBqKSA9IHY7CiAgICAgfQotICAgIGRzdC5maWxsKGosaikgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgICBkc3QuZmlsbChqLCBqKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwogICB9CiAgIGRzdC5lbmRGaWxsKCk7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgIGludCByb3dzID0gU0laRTsKICAgaW50IGNvbHMgPSBTSVpFOwogICBmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsKICAgQmVuY2hUaW1lciB0aW1lcjsKLSAgI2lmIDEKLSAgRWlnZW5TcGFyc2VUcmlNYXRyaXggc20xKHJvd3MsY29scyk7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IERlbnNlVmVjdG9yOworI2lmIDEKKyAgRWlnZW5TcGFyc2VUcmlNYXRyaXggc20xKHJvd3MsIGNvbHMpOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IERlbnNlVmVjdG9yOwogICBEZW5zZVZlY3RvciBiID0gRGVuc2VWZWN0b3I6OlJhbmRvbShjb2xzKTsKICAgRGVuc2VWZWN0b3IgeCA9IERlbnNlVmVjdG9yOjpSYW5kb20oY29scyk7CiAKICAgYm9vbCBkZW5zZWRvbmUgPSBmYWxzZTsKIAotICBmb3IgKGZsb2F0IGRlbnNpdHkgPSBERU5TSVRZOyBkZW5zaXR5Pj1NSU5ERU5TSVRZOyBkZW5zaXR5Kj0wLjUpCi0gIHsKKyAgZm9yIChmbG9hdCBkZW5zaXR5ID0gREVOU0lUWTsgZGVuc2l0eSA+PSBNSU5ERU5TSVRZOyBkZW5zaXR5ICo9IDAuNSkgewogICAgIEVpZ2VuU3BhcnNlVHJpTWF0cml4IHNtMShyb3dzLCBjb2xzKTsKICAgICBmaWxsTWF0cml4KGRlbnNpdHksIHJvd3MsIGNvbHMsIHNtMSk7CiAKLSAgICAvLyBkZW5zZSBtYXRyaWNlcwotICAgICNpZmRlZiBERU5TRU1BVFJJWAotICAgIGlmICghZGVuc2Vkb25lKQotICAgIHsKKy8vIGRlbnNlIG1hdHJpY2VzCisjaWZkZWYgREVOU0VNQVRSSVgKKyAgICBpZiAoIWRlbnNlZG9uZSkgewogICAgICAgZGVuc2Vkb25lID0gdHJ1ZTsKLSAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gRGVuc2VcdCIgPDwgZGVuc2l0eSoxMDAgPDwgIiVcbiI7Ci0gICAgICBEZW5zZU1hdHJpeCBtMShyb3dzLGNvbHMpOwotICAgICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsRHluYW1pYyxEeW5hbWljLFJvd01ham9yQml0PiBtMihyb3dzLGNvbHMpOworICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBEZW5zZVx0IiA8PCBkZW5zaXR5ICogMTAwIDw8ICIlXG4iOworICAgICAgRGVuc2VNYXRyaXggbTEocm93cywgY29scyk7CisgICAgICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvckJpdD4gbTIocm93cywgY29scyk7CiAgICAgICBlaVRvRGVuc2Uoc20xLCBtMSk7CiAgICAgICBtMiA9IG0xOwogCiAgICAgICBCRU5DSCh4ID0gbTEubWFya2VkPFVwcGVyVHJpYW5ndWxhcj4oKS5zb2x2ZVRyaWFuZ3VsYXIoYik7KQogICAgICAgc3RkOjpjb3V0IDw8ICIgICBjb2xtYWpvcl4tMSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKLS8vICAgICAgIHN0ZDo6Y2VyciA8PCB4LnRyYW5zcG9zZSgpIDw8ICJcbiI7CisgICAgICAvLyAgICAgICBzdGQ6OmNlcnIgPDwgeC50cmFuc3Bvc2UoKSA8PCAiXG4iOwogCiAgICAgICBCRU5DSCh4ID0gbTIubWFya2VkPFVwcGVyVHJpYW5ndWxhcj4oKS5zb2x2ZVRyaWFuZ3VsYXIoYik7KQogICAgICAgc3RkOjpjb3V0IDw8ICIgICByb3dtYWpvcl4tMSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKLS8vICAgICAgIHN0ZDo6Y2VyciA8PCB4LnRyYW5zcG9zZSgpIDw8ICJcbiI7CisgICAgICAvLyAgICAgICBzdGQ6OmNlcnIgPDwgeC50cmFuc3Bvc2UoKSA8PCAiXG4iOwogICAgIH0KLSAgICAjZW5kaWYKKyNlbmRpZgogCiAgICAgLy8gZWlnZW4gc3BhcnNlIG1hdHJpY2VzCiAgICAgewotICAgICAgc3RkOjpjb3V0IDw8ICJFaWdlbiBzcGFyc2VcdCIgPDwgZGVuc2l0eSoxMDAgPDwgIiVcbiI7CisgICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuIHNwYXJzZVx0IiA8PCBkZW5zaXR5ICogMTAwIDw8ICIlXG4iOwogICAgICAgRWlnZW5TcGFyc2VUcmlNYXRyaXhSb3cgc20yID0gc20xOwogCiAgICAgICBCRU5DSCh4ID0gc20xLnNvbHZlVHJpYW5ndWxhcihiKTspCiAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGNvbG1ham9yXi0xICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwotLy8gICAgICAgc3RkOjpjZXJyIDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKKyAgICAgIC8vICAgICAgIHN0ZDo6Y2VyciA8PCB4LnRyYW5zcG9zZSgpIDw8ICJcbiI7CiAKICAgICAgIEJFTkNIKHggPSBzbTIuc29sdmVUcmlhbmd1bGFyKGIpOykKICAgICAgIHN0ZDo6Y291dCA8PCAiICAgcm93bWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7Ci0vLyAgICAgICBzdGQ6OmNlcnIgPDwgeC50cmFuc3Bvc2UoKSA8PCAiXG4iOworICAgICAgLy8gICAgICAgc3RkOjpjZXJyIDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKIAotLy8gICAgICAgeCA9IGI7Ci0vLyAgICAgICBCRU5DSChzbTEuaW52ZXJzZVByb2R1Y3RJblBsYWNlKHgpOykKLS8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgY29sbWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICIgKGlucGxhY2UpIiA8PCBlbmRsOwotLy8gICAgICAgc3RkOjpjZXJyIDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKLS8vCi0vLyAgICAgICB4ID0gYjsKLS8vICAgICAgIEJFTkNIKHNtMi5pbnZlcnNlUHJvZHVjdEluUGxhY2UoeCk7KQotLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICByb3dtYWpvcl4tMSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIiAoaW5wbGFjZSkiIDw8IGVuZGw7Ci0vLyAgICAgICBzdGQ6OmNlcnIgPDwgeC50cmFuc3Bvc2UoKSA8PCAiXG4iOworICAgICAgLy8gICAgICAgeCA9IGI7CisgICAgICAvLyAgICAgICBCRU5DSChzbTEuaW52ZXJzZVByb2R1Y3RJblBsYWNlKHgpOykKKyAgICAgIC8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgY29sbWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8ICIgKGlucGxhY2UpIiA8PCBlbmRsOworICAgICAgLy8gICAgICAgc3RkOjpjZXJyIDw8IHgudHJhbnNwb3NlKCkgPDwgIlxuIjsKKyAgICAgIC8vCisgICAgICAvLyAgICAgICB4ID0gYjsKKyAgICAgIC8vICAgICAgIEJFTkNIKHNtMi5pbnZlcnNlUHJvZHVjdEluUGxhY2UoeCk7KQorICAgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICByb3dtYWpvcl4tMSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIiAoaW5wbGFjZSkiIDw8IGVuZGw7CisgICAgICAvLyAgICAgICBzdGQ6OmNlcnIgPDwgeC50cmFuc3Bvc2UoKSA8PCAiXG4iOwogICAgIH0KIAotCi0KLSAgICAvLyBDU3BhcnNlCi0gICAgI2lmZGVmIENTUEFSU0UKKy8vIENTcGFyc2UKKyNpZmRlZiBDU1BBUlNFCiAgICAgewotICAgICAgc3RkOjpjb3V0IDw8ICJDU3BhcnNlIFx0IiA8PCBkZW5zaXR5KjEwMCA8PCAiJVxuIjsKKyAgICAgIHN0ZDo6Y291dCA8PCAiQ1NwYXJzZSBcdCIgPDwgZGVuc2l0eSAqIDEwMCA8PCAiJVxuIjsKICAgICAgIGNzICptMTsKICAgICAgIGVpVG9DU3BhcnNlKHNtMSwgbTEpOwogCi0gICAgICBCRU5DSCh4ID0gYjsgaWYgKCFjc19sc29sdmUgKG0xLCB4LmRhdGEoKSkpe3N0ZDo6Y2VyciA8PCAiY3NfbHNvbHZlIGZhaWxlZFxuIjsgYnJlYWs7fTsgKQorICAgICAgQkVOQ0goeCA9IGI7IGlmICghY3NfbHNvbHZlKG0xLCB4LmRhdGEoKSkpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJjc19sc29sdmUgZmFpbGVkXG4iOworICAgICAgICBicmVhazsKKyAgICAgIH07KQogICAgICAgc3RkOjpjb3V0IDw8ICIgICBjb2xtYWpvcl4tMSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAotICAgIC8vIEdNTSsrCi0gICAgI2lmbmRlZiBOT0dNTQorLy8gR01NKysKKyNpZm5kZWYgTk9HTU0KICAgICB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIkdNTSsrIHNwYXJzZVx0IiA8PCBkZW5zaXR5KjEwMCA8PCAiJVxuIjsKLSAgICAgIEdtbVNwYXJzZSBtMShyb3dzLGNvbHMpOworICAgICAgc3RkOjpjb3V0IDw8ICJHTU0rKyBzcGFyc2VcdCIgPDwgZGVuc2l0eSAqIDEwMCA8PCAiJVxuIjsKKyAgICAgIEdtbVNwYXJzZSBtMShyb3dzLCBjb2xzKTsKICAgICAgIGdtbTo6Y3NyX21hdHJpeDxTY2FsYXI+IG0yOwogICAgICAgZWlUb0dtbShzbTEsIG0xKTsKLSAgICAgIGdtbTo6Y29weShtMSxtMik7CisgICAgICBnbW06OmNvcHkobTEsIG0yKTsKICAgICAgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gZ21tWChjb2xzKSwgZ21tQihjb2xzKTsKLSAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPigmZ21tWFswXSwgY29scykgPSB4OwotICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1CWzBdLCBjb2xzKSA9IGI7CisgICAgICBNYXA8TWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gPigmZ21tWFswXSwgY29scykgPSB4OworICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+ID4oJmdtbUJbMF0sIGNvbHMpID0gYjsKIAogICAgICAgZ21tWCA9IGdtbUI7CiAgICAgICBCRU5DSChnbW06OnVwcGVyX3RyaV9zb2x2ZShtMSwgZ21tWCwgZmFsc2UpOykKICAgICAgIHN0ZDo6Y291dCA8PCAiICAgY29sbWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7Ci0vLyAgICAgICBzdGQ6OmNlcnIgPDwgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1YWzBdLCBjb2xzKS50cmFuc3Bvc2UoKSA8PCAiXG4iOworICAgICAgLy8gICAgICAgc3RkOjpjZXJyIDw8IE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPigmZ21tWFswXSwgY29scykudHJhbnNwb3NlKCkgPDwgIlxuIjsKIAogICAgICAgZ21tWCA9IGdtbUI7CiAgICAgICBCRU5DSChnbW06OnVwcGVyX3RyaV9zb2x2ZShtMiwgZ21tWCwgZmFsc2UpOykKICAgICAgIHRpbWVyLnN0b3AoKTsKICAgICAgIHN0ZDo6Y291dCA8PCAiICAgcm93bWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7Ci0vLyAgICAgICBzdGQ6OmNlcnIgPDwgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZnbW1YWzBdLCBjb2xzKS50cmFuc3Bvc2UoKSA8PCAiXG4iOworICAgICAgLy8gICAgICAgc3RkOjpjZXJyIDw8IE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPigmZ21tWFswXSwgY29scykudHJhbnNwb3NlKCkgPDwgIlxuIjsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAotICAgIC8vIE1UTDQKLSAgICAjaWZuZGVmIE5PTVRMCisvLyBNVEw0CisjaWZuZGVmIE5PTVRMCiAgICAgewotICAgICAgc3RkOjpjb3V0IDw8ICJNVEw0XHQiIDw8IGRlbnNpdHkqMTAwIDw8ICIlXG4iOwotICAgICAgTXRsU3BhcnNlIG0xKHJvd3MsY29scyk7Ci0gICAgICBNdGxTcGFyc2VSb3dNYWpvciBtMihyb3dzLGNvbHMpOworICAgICAgc3RkOjpjb3V0IDw8ICJNVEw0XHQiIDw8IGRlbnNpdHkgKiAxMDAgPDwgIiVcbiI7CisgICAgICBNdGxTcGFyc2UgbTEocm93cywgY29scyk7CisgICAgICBNdGxTcGFyc2VSb3dNYWpvciBtMihyb3dzLCBjb2xzKTsKICAgICAgIGVpVG9NdGwoc20xLCBtMSk7CiAgICAgICBtMiA9IG0xOwogICAgICAgbXRsOjpkZW5zZV92ZWN0b3I8U2NhbGFyPiB4KHJvd3MsIDEuMCk7CiAgICAgICBtdGw6OmRlbnNlX3ZlY3RvcjxTY2FsYXI+IGIocm93cywgMS4wKTsKIAotICAgICAgQkVOQ0goeCA9IG10bDo6dXBwZXJfdHJpc29sdmUobTEsYik7KQorICAgICAgQkVOQ0goeCA9IG10bDo6dXBwZXJfdHJpc29sdmUobTEsIGIpOykKICAgICAgIHN0ZDo6Y291dCA8PCAiICAgY29sbWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7Ci0vLyAgICAgICBzdGQ6OmNlcnIgPDwgeCA8PCAiXG4iOworICAgICAgLy8gICAgICAgc3RkOjpjZXJyIDw8IHggPDwgIlxuIjsKIAotICAgICAgQkVOQ0goeCA9IG10bDo6dXBwZXJfdHJpc29sdmUobTIsYik7KQorICAgICAgQkVOQ0goeCA9IG10bDo6dXBwZXJfdHJpc29sdmUobTIsIGIpOykKICAgICAgIHN0ZDo6Y291dCA8PCAiICAgcm93bWFqb3JeLTEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7Ci0vLyAgICAgICBzdGQ6OmNlcnIgPDwgeCA8PCAiXG4iOworICAgICAgLy8gICAgICAgc3RkOjpjZXJyIDw8IHggPDwgIlxuIjsKICAgICB9Ci0gICAgI2VuZGlmCi0KKyNlbmRpZgogCiAgICAgc3RkOjpjb3V0IDw8ICJcblxuIjsKICAgfQotICAjZW5kaWYKKyNlbmRpZgogCi0gICNpZiAwCisjaWYgMAogICAgIC8vIGJlbmNoIHNtYWxsIG1hdHJpY2VzIChpbi1wbGFjZSB2ZXJzdXMgcmV0dXJuIGJ5ZSB2YWx1ZSkKICAgICB7CiAgICAgICB0aW1lci5yZXNldCgpOwpAQCAtMjEzLDggKzIwOSw3IEBACiAgICAgICB9CiAgICAgICBzdGQ6OmNvdXQgPDwgIjR4NCBJUCA6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKICAgICB9Ci0gICNlbmRpZgorI2VuZGlmCiAKICAgcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2JlbmNoL3NwYmVuY2gvc3Bfc29sdmVyLmNwcCBiL2JlbmNoL3NwYmVuY2gvc3Bfc29sdmVyLmNwcAppbmRleCA3NTgyMWE2Li40MmIxMjM5IDEwMDY0NAotLS0gYS9iZW5jaC9zcGJlbmNoL3NwX3NvbHZlci5jcHAKKysrIGIvYmVuY2gvc3BiZW5jaC9zcF9zb2x2ZXIuY3BwCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnM+CiAjaW5jbHVkZSA8RWlnZW4vTFU+CiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BhcnNlRXh0cmE+Ci0vLyNpbmNsdWRlIDxFaWdlbi9TcGFyc2VMVT4KKy8vICNpbmNsdWRlIDxFaWdlbi9TcGFyc2VMVT4KICNpbmNsdWRlIDxFaWdlbi9TdXBlckxVU3VwcG9ydD4KIC8vICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9zcmMvSXRlcmF0aXZlU29sdmVycy9TY2FsaW5nLmg+CiAjaW5jbHVkZSA8YmVuY2gvQmVuY2hUaW1lci5oPgpAQCAtMTcsMTA5ICsxNywxMTMgQEAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJncykKLXsKLSAgU3BhcnNlTWF0cml4PGRvdWJsZSwgQ29sTWFqb3I+IEE7IAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmdzKSB7CisgIFNwYXJzZU1hdHJpeDxkb3VibGUsIENvbE1ham9yPiBBOwogICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxkb3VibGUsIENvbE1ham9yPjo6SW5kZXggSW5kZXg7CiAgIHR5cGVkZWYgTWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYz4gRGVuc2VNYXRyaXg7CiAgIHR5cGVkZWYgTWF0cml4PGRvdWJsZSwgRHluYW1pYywgMT4gRGVuc2VSaHM7CiAgIFZlY3RvclhkIGIsIHgsIHRtcDsKLSAgQmVuY2hUaW1lciB0aW1lcix0b3RhbHRpbWU7IAotICAvL1NwYXJzZUxVPFNwYXJzZU1hdHJpeDxkb3VibGUsIENvbE1ham9yPiA+ICAgc29sdmVyOwotLy8gICBTdXBlckxVPFNwYXJzZU1hdHJpeDxkb3VibGUsIENvbE1ham9yPiA+ICAgc29sdmVyOwotICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXg8ZG91YmxlLCBDb2xNYWpvcj4sIExvd2VyLEluY29tcGxldGVDaG9sZXNreTxkb3VibGUsTG93ZXI+ID4gc29sdmVyOyAKLSAgaWZzdHJlYW0gbWF0cml4X2ZpbGU7IAorICBCZW5jaFRpbWVyIHRpbWVyLCB0b3RhbHRpbWU7CisgIC8vIFNwYXJzZUxVPFNwYXJzZU1hdHJpeDxkb3VibGUsIENvbE1ham9yPiA+ICAgc29sdmVyOworICAvLyAgIFN1cGVyTFU8U3BhcnNlTWF0cml4PGRvdWJsZSwgQ29sTWFqb3I+ID4gICBzb2x2ZXI7CisgIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxkb3VibGUsIENvbE1ham9yPiwgTG93ZXIsIEluY29tcGxldGVDaG9sZXNreTxkb3VibGUsIExvd2VyPiA+IHNvbHZlcjsKKyAgaWZzdHJlYW0gbWF0cml4X2ZpbGU7CiAgIHN0cmluZyBsaW5lOwotICBpbnQgIG47CisgIGludCBuOwogICAvLyBTZXQgcGFyYW1ldGVycwotLy8gICBzb2x2ZXIuaXBhcm0oSVBBUk1fVEhSRUFEX05CUikgPSA0OworICAvLyAgIHNvbHZlci5pcGFybShJUEFSTV9USFJFQURfTkJSKSA9IDQ7CiAgIC8qIEZpbGwgdGhlIG1hdHJpeCB3aXRoIHNwYXJzZSBtYXRyaXggc3RvcmVkIGluIE1hdHJpeC1NYXJrZXQgY29vcmRpbmF0ZSBjb2x1bW4tb3JpZW50ZWQgZm9ybWF0ICovCiAgIGlmIChhcmdjIDwgMikgYXNzZXJ0KGZhbHNlICYmICJwbGVhc2UsIGdpdmUgdGhlIG1hdHJpeCBtYXJrZXQgZmlsZSAiKTsKLSAgCisKICAgdGltZXIuc3RhcnQoKTsKICAgdG90YWx0aW1lLnN0YXJ0KCk7CiAgIGxvYWRNYXJrZXQoQSwgYXJnc1sxXSk7CiAgIGNvdXQgPDwgIkVuZCBjaGFyZ2luZyBtYXRyaXggIiA8PCBlbmRsOwotICBib29sIGlzY29tcGxleD1mYWxzZSwgaXN2ZWN0b3I9ZmFsc2U7CisgIGJvb2wgaXNjb21wbGV4ID0gZmFsc2UsIGlzdmVjdG9yID0gZmFsc2U7CiAgIGludCBzeW07CiAgIGdldE1hcmtldEhlYWRlcihhcmdzWzFdLCBzeW0sIGlzY29tcGxleCwgaXN2ZWN0b3IpOwotICBpZiAoaXNjb21wbGV4KSB7IGNvdXQ8PCAiIE5vdCBmb3IgY29tcGxleCBtYXRyaWNlcyBcbiI7IHJldHVybiAtMTsgfQotICBpZiAoaXN2ZWN0b3IpIHsgY291dCA8PCAiVGhlIHByb3ZpZGVkIGZpbGUgaXMgbm90IGEgbWF0cml4IGZpbGVcbiI7IHJldHVybiAtMTt9Ci0gIGlmIChzeW0gIT0gMCkgeyAvLyBzeW1tZXRyaWMgbWF0cmljZXMsIG9ubHkgdGhlIGxvd2VyIHBhcnQgaXMgc3RvcmVkCi0gICAgU3BhcnNlTWF0cml4PGRvdWJsZSwgQ29sTWFqb3I+IHRlbXA7IAorICBpZiAoaXNjb21wbGV4KSB7CisgICAgY291dCA8PCAiIE5vdCBmb3IgY29tcGxleCBtYXRyaWNlcyBcbiI7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChpc3ZlY3RvcikgeworICAgIGNvdXQgPDwgIlRoZSBwcm92aWRlZCBmaWxlIGlzIG5vdCBhIG1hdHJpeCBmaWxlXG4iOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoc3ltICE9IDApIHsgIC8vIHN5bW1ldHJpYyBtYXRyaWNlcywgb25seSB0aGUgbG93ZXIgcGFydCBpcyBzdG9yZWQKKyAgICBTcGFyc2VNYXRyaXg8ZG91YmxlLCBDb2xNYWpvcj4gdGVtcDsKICAgICB0ZW1wID0gQTsKICAgICBBID0gdGVtcC5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KCk7CiAgIH0KICAgdGltZXIuc3RvcCgpOwotICAKKwogICBuID0gQS5jb2xzKCk7CiAgIC8vID09PT09PSBURVNUUyBGT1IgU1BBUlNFIFRVVE9SSUFMID09PT09PQotLy8gICBjb3V0PDwgIk91dGVyU2l6ZSAiIDw8IEEub3V0ZXJTaXplKCkgPDwgIiBpbm5lciAiIDw8IEEuaW5uZXJTaXplKCkgPDwgZW5kbDsgCi0vLyAgIFNwYXJzZU1hdHJpeDxkb3VibGUsIFJvd01ham9yPiBtYXQxKEEpOyAKLS8vICAgU3BhcnNlTWF0cml4PGRvdWJsZSwgUm93TWFqb3I+IG1hdDI7Ci0vLyAgIGNvdXQgPDwgIiBub3JtIG9mIEEgIiA8PCBtYXQxLm5vcm0oKSA8PCBlbmRsOyA7Ci0vLyAgIFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsIER5bmFtaWMsIGludD4gcGVybShuKTsKLS8vICAgcGVybS5yZXNpemUobiwxKTsKLS8vICAgcGVybS5pbmRpY2VzKCkuc2V0TGluU3BhY2VkKG4sIDAsIG4tMSk7Ci0vLyAgIG1hdDIgPSBwZXJtICogbWF0MTsKLS8vICAgbWF0LnN1YnJvd3MoKTsKLS8vICAgbWF0Mi5yZXNpemUobixuKTsgCi0vLyAgIG1hdDIucmVzZXJ2ZSgxMCk7Ci0vLyAgIG1hdDIuc2V0Q29uc3RhbnQoKTsKLS8vICAgc3RkOjpjb3V0PDwgIk5PUk0gIiA8PCBtYXQxLnNxdWFyZWROb3JtKCk8PCBlbmRsOyAgCisgIC8vICAgY291dDw8ICJPdXRlclNpemUgIiA8PCBBLm91dGVyU2l6ZSgpIDw8ICIgaW5uZXIgIiA8PCBBLmlubmVyU2l6ZSgpIDw8IGVuZGw7CisgIC8vICAgU3BhcnNlTWF0cml4PGRvdWJsZSwgUm93TWFqb3I+IG1hdDEoQSk7CisgIC8vICAgU3BhcnNlTWF0cml4PGRvdWJsZSwgUm93TWFqb3I+IG1hdDI7CisgIC8vICAgY291dCA8PCAiIG5vcm0gb2YgQSAiIDw8IG1hdDEubm9ybSgpIDw8IGVuZGw7IDsKKyAgLy8gICBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLCBEeW5hbWljLCBpbnQ+IHBlcm0obik7CisgIC8vICAgcGVybS5yZXNpemUobiwxKTsKKyAgLy8gICBwZXJtLmluZGljZXMoKS5zZXRMaW5TcGFjZWQobiwgMCwgbi0xKTsKKyAgLy8gICBtYXQyID0gcGVybSAqIG1hdDE7CisgIC8vICAgbWF0LnN1YnJvd3MoKTsKKyAgLy8gICBtYXQyLnJlc2l6ZShuLG4pOworICAvLyAgIG1hdDIucmVzZXJ2ZSgxMCk7CisgIC8vICAgbWF0Mi5zZXRDb25zdGFudCgpOworICAvLyAgIHN0ZDo6Y291dDw8ICJOT1JNICIgPDwgbWF0MS5zcXVhcmVkTm9ybSgpPDwgZW5kbDsKIAotICBjb3V0PDwgIlRpbWUgdG8gbG9hZCB0aGUgbWF0cml4ICIgPDwgdGltZXIudmFsdWUoKSA8PGVuZGw7CisgIGNvdXQgPDwgIlRpbWUgdG8gbG9hZCB0aGUgbWF0cml4ICIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwogICAvKiBGaWxsIHRoZSByaWdodCBoYW5kIHNpZGUgKi8KIAotLy8gICBzb2x2ZXIuc2V0X3Jlc3RhcnQoMzc0KTsKKyAgLy8gICBzb2x2ZXIuc2V0X3Jlc3RhcnQoMzc0KTsKICAgaWYgKGFyZ2MgPiAyKQogICAgIGxvYWRNYXJrZXRWZWN0b3IoYiwgYXJnc1syXSk7Ci0gIGVsc2UgCi0gIHsKKyAgZWxzZSB7CiAgICAgYi5yZXNpemUobik7CiAgICAgdG1wLnJlc2l6ZShuKTsKLS8vICAgICAgIHRtcC5zZXRSYW5kb20oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgdG1wKGkpID0gaTsgCi0gICAgYiA9IEEgKiB0bXAgOworICAgIC8vICAgICAgIHRtcC5zZXRSYW5kb20oKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgdG1wKGkpID0gaTsKKyAgICBiID0gQSAqIHRtcDsKICAgfQotLy8gICBTY2FsaW5nPFNwYXJzZU1hdHJpeDxkb3VibGU+ID4gc2NhbDsgCi0vLyAgIHNjYWwuY29tcHV0ZVJlZihBKTsKLS8vICAgYiA9IHNjYWwuTGVmdFNjYWxpbmcoKS5jd2lzZVByb2R1Y3QoYik7CisgIC8vICAgU2NhbGluZzxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IHNjYWw7CisgIC8vICAgc2NhbC5jb21wdXRlUmVmKEEpOworICAvLyAgIGIgPSBzY2FsLkxlZnRTY2FsaW5nKCkuY3dpc2VQcm9kdWN0KGIpOwogCiAgIC8qIENvbXB1dGUgdGhlIGZhY3Rvcml6YXRpb24gKi8KLSAgY291dDw8ICJTdGFydGluZyB0aGUgZmFjdG9yaXphdGlvbiAiPDwgZW5kbDsgCisgIGNvdXQgPDwgIlN0YXJ0aW5nIHRoZSBmYWN0b3JpemF0aW9uICIgPDwgZW5kbDsKICAgdGltZXIucmVzZXQoKTsKLSAgdGltZXIuc3RhcnQoKTsgCi0gIGNvdXQ8PCAiU2l6ZSBvZiBJbnB1dCBNYXRyaXggIjw8IGIuc2l6ZSgpPDwiXG5cbiI7Ci0gIGNvdXQ8PCAiUm93cyBhbmQgY29sdW1ucyAiPDwgQS5yb3dzKCkgPDwiICIgPDxBLmNvbHMoKSA8PCJcbiI7CisgIHRpbWVyLnN0YXJ0KCk7CisgIGNvdXQgPDwgIlNpemUgb2YgSW5wdXQgTWF0cml4ICIgPDwgYi5zaXplKCkgPDwgIlxuXG4iOworICBjb3V0IDw8ICJSb3dzIGFuZCBjb2x1bW5zICIgPDwgQS5yb3dzKCkgPDwgIiAiIDw8IEEuY29scygpIDw8ICJcbiI7CiAgIHNvbHZlci5jb21wdXRlKEEpOwotLy8gICBzb2x2ZXIuYW5hbHl6ZVBhdHRlcm4oQSk7Ci0vLyAgIHNvbHZlci5mYWN0b3JpemUoQSk7CisgIC8vICAgc29sdmVyLmFuYWx5emVQYXR0ZXJuKEEpOworICAvLyAgIHNvbHZlci5mYWN0b3JpemUoQSk7CiAgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpIHsKLSAgICBzdGQ6OmNvdXQ8PCAiVGhlIHNvbHZlciBmYWlsZWQgXG4iOwotICAgIHJldHVybiAtMTsgCisgICAgc3RkOjpjb3V0IDw8ICJUaGUgc29sdmVyIGZhaWxlZCBcbiI7CisgICAgcmV0dXJuIC0xOwogICB9Ci0gIHRpbWVyLnN0b3AoKTsgCi0gIGZsb2F0IHRpbWVfY29tcCA9IHRpbWVyLnZhbHVlKCk7IAotICBjb3V0IDw8IiBDb21wdXRlIFRpbWUgIiA8PCB0aW1lX2NvbXA8PCBlbmRsOyAKLSAgCisgIHRpbWVyLnN0b3AoKTsKKyAgZmxvYXQgdGltZV9jb21wID0gdGltZXIudmFsdWUoKTsKKyAgY291dCA8PCAiIENvbXB1dGUgVGltZSAiIDw8IHRpbWVfY29tcCA8PCBlbmRsOworCiAgIHRpbWVyLnJlc2V0KCk7CiAgIHRpbWVyLnN0YXJ0KCk7CiAgIHggPSBzb2x2ZXIuc29sdmUoYik7Ci0vLyAgIHggPSBzY2FsLlJpZ2h0U2NhbGluZygpLmN3aXNlUHJvZHVjdCh4KTsKKyAgLy8gICB4ID0gc2NhbC5SaWdodFNjYWxpbmcoKS5jd2lzZVByb2R1Y3QoeCk7CiAgIHRpbWVyLnN0b3AoKTsKLSAgZmxvYXQgdGltZV9zb2x2ZSA9IHRpbWVyLnZhbHVlKCk7IAotICBjb3V0PDwgIiBUaW1lIHRvIHNvbHZlICIgPDwgdGltZV9zb2x2ZSA8PCBlbmRsOyAKLSAKKyAgZmxvYXQgdGltZV9zb2x2ZSA9IHRpbWVyLnZhbHVlKCk7CisgIGNvdXQgPDwgIiBUaW1lIHRvIHNvbHZlICIgPDwgdGltZV9zb2x2ZSA8PCBlbmRsOworCiAgIC8qIENoZWNrIHRoZSBhY2N1cmFjeSAqLwotICBWZWN0b3JYZCB0bXAyID0gYiAtIEEqeDsKLSAgZG91YmxlIHRlbXBOb3JtID0gdG1wMi5ub3JtKCkvYi5ub3JtKCk7Ci0gIGNvdXQgPDwgIlJlbGF0aXZlIG5vcm0gb2YgdGhlIGNvbXB1dGVkIHNvbHV0aW9uIDogIiA8PCB0ZW1wTm9ybSA8PCJcbiI7Ci0vLyAgIGNvdXQgPDwgIkl0ZXJhdGlvbnMgOiAiIDw8IHNvbHZlci5pdGVyYXRpb25zKCkgPDwgIlxuIjsgCi0gIAorICBWZWN0b3JYZCB0bXAyID0gYiAtIEEgKiB4OworICBkb3VibGUgdGVtcE5vcm0gPSB0bXAyLm5vcm0oKSAvIGIubm9ybSgpOworICBjb3V0IDw8ICJSZWxhdGl2ZSBub3JtIG9mIHRoZSBjb21wdXRlZCBzb2x1dGlvbiA6ICIgPDwgdGVtcE5vcm0gPDwgIlxuIjsKKyAgLy8gICBjb3V0IDw8ICJJdGVyYXRpb25zIDogIiA8PCBzb2x2ZXIuaXRlcmF0aW9ucygpIDw8ICJcbiI7CisKICAgdG90YWx0aW1lLnN0b3AoKTsKICAgY291dCA8PCAiVG90YWwgdGltZSAiIDw8IHRvdGFsdGltZS52YWx1ZSgpIDw8ICJcbiI7Ci0vLyAgc3RkOjpjb3V0PDx4LnRyYW5zcG9zZSgpPDwiXG4iOwotICAKKyAgLy8gIHN0ZDo6Y291dDw8eC50cmFuc3Bvc2UoKTw8IlxuIjsKKwogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2JlbmNoL3NwYmVuY2gvc3BiZW5jaHNvbHZlci5jcHAgYi9iZW5jaC9zcGJlbmNoL3NwYmVuY2hzb2x2ZXIuY3BwCmluZGV4IDlkMmUzODEuLjBiYjNjM2EgMTAwNjQ0Ci0tLSBhL2JlbmNoL3NwYmVuY2gvc3BiZW5jaHNvbHZlci5jcHAKKysrIGIvYmVuY2gvc3BiZW5jaC9zcGJlbmNoc29sdmVyLmNwcApAQCAtMSw4MiArMSw3OCBAQAogI2luY2x1ZGUgPGJlbmNoL3NwYmVuY2gvc3BiZW5jaHNvbHZlci5oPgogCi12b2lkIGJlbmNoX3ByaW50aGVscCgpCi17Ci0gICAgY291dDw8ICIgXG5iZW5jaHNvbHZlciA6IHBlcmZvcm1zIGEgYmVuY2htYXJrIG9mIGFsbCB0aGUgc29sdmVycyBhdmFpbGFibGUgaW4gRWlnZW4gXG5cbiI7Ci0gICAgY291dDw8ICIgTUFUUklYIEZPTERFUiA6IFxuIjsKLSAgICBjb3V0PDwgIiBUaGUgbWF0cmljZXMgZm9yIHRoZSBiZW5jaG1hcmsgc2hvdWxkIGJlIGNvbGxlY3RlZCBpbiBhIGZvbGRlciBzcGVjaWZpZWQgd2l0aCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBFSUdFTl9NQVRSSVhESVIgXG4iOwotICAgIGNvdXQ8PCAiIFRoZSBtYXRyaWNlcyBhcmUgc3RvcmVkIHVzaW5nIHRoZSBtYXRyaXggbWFya2V0IGNvb3JkaW5hdGUgZm9ybWF0IFxuIjsKLSAgICBjb3V0PDwgIiBUaGUgbWF0cml4IGFuZCBhc3NvY2lhdGVkIHJpZ2h0LWhhbmQgc2lkZSAocmhzKSBmaWxlcyBhcmUgbmFtZWQgcmVzcGVjdGl2ZWx5IGFzIE1hdHJpeE5hbWUubXR4IGFuZCBNYXRyaXhOYW1lX2IubXR4LlxuIjsKLSAgICBjb3V0PDwgIiBJZiB0aGUgcmhzIGRvZXMgbm90IGV4aXN0LCBhIHJhbmRvbSBvbmUgaXMgZ2VuZXJhdGVkLiBcbiI7Ci0gICAgY291dDw8ICIgSWYgYSB0cnVlIHNvbHV0aW9uIGV4aXN0cywgaXQgc2hvdWxkIGJlIG5hbWVkIGFzIE1hdHJpeE5hbWVfeC5tdHggOyBpdCB3aWxsIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbm9ybSBvZiB0aGUgZXJyb3IgXG4iOwotICAgIGNvdXQ8PCAiIHJlbGF0aXZlIHRvIHRoZSBjb21wdXRlZCBzb2x1dGlvbnMuIFxuIjsKLSAgICBjb3V0PDwgIiBJZiBhIG1hdHJpeCBpcyBTUEQsIHRoZSBtYXRyaXggc2hvdWxkIGJlIG5hbWVkIGFzIE1hdHJpeE5hbWVfU1BELm10eCAodGhlbiB1c2UgTWF0cml4TmFtZV9TUERfYi5tdHggXG4iOwotICAgIGNvdXQ8PCAiIGFuZCBNYXRyaXhOYW1lX1NQRF94Lm10eCBmb3IgdGhlIHJocyBhbmQgdGhlIHRydWUgc29sdXRpb24pLlxuXG4iOwotICAgIGNvdXQ8PCAiIE9QVElPTlMgOiBcbiI7IAotICAgIGNvdXQ8PCAiIC1oIG9yIC0taGVscCBcbiAgICBwcmludCB0aGlzIGhlbHAgYW5kIHJldHVyblxuXG4iOwotICAgIGNvdXQ8PCAiIC1kIG1hdHJpeGRpciBcbiAgICBVc2UgbWF0cml4ZGlyIGFzIHRoZSBtYXRyaXggZm9sZGVyIGluc3RlYWQgb2YgdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEVJR0VOX01BVFJJWERJUlxuXG4iOyAKLSAgICBjb3V0PDwgIiAtbyBvdXRwdXRmaWxlLnhtbCBcbiAgICBPdXRwdXQgdGhlIHN0YXRpc3RpY3MgdG8gYSB4bWwgZmlsZSBcblxuIjsKLSAgICBjb3V0PDwgIiAtLWVwcyA8UmVsRXJyPiBTZXRzIHRoZSByZWxhdGl2ZSB0b2xlcmFuY2UgZm9yIGl0ZXJhdGl2ZSBzb2x2ZXJzIChkZWZhdWx0IDFlLTA4KSBcblxuIjsKLSAgICBjb3V0PDwgIiAtLW1heGl0cyA8TWF4SXRzPiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIChkZWZhdWx0IDEwMDApIFxuXG4iOwordm9pZCBiZW5jaF9wcmludGhlbHAoKSB7CisgIGNvdXQgPDwgIiBcbmJlbmNoc29sdmVyIDogcGVyZm9ybXMgYSBiZW5jaG1hcmsgb2YgYWxsIHRoZSBzb2x2ZXJzIGF2YWlsYWJsZSBpbiBFaWdlbiBcblxuIjsKKyAgY291dCA8PCAiIE1BVFJJWCBGT0xERVIgOiBcbiI7CisgIGNvdXQgPDwgIiBUaGUgbWF0cmljZXMgZm9yIHRoZSBiZW5jaG1hcmsgc2hvdWxkIGJlIGNvbGxlY3RlZCBpbiBhIGZvbGRlciBzcGVjaWZpZWQgd2l0aCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSAiCisgICAgICAgICAgIkVJR0VOX01BVFJJWERJUiBcbiI7CisgIGNvdXQgPDwgIiBUaGUgbWF0cmljZXMgYXJlIHN0b3JlZCB1c2luZyB0aGUgbWF0cml4IG1hcmtldCBjb29yZGluYXRlIGZvcm1hdCBcbiI7CisgIGNvdXQgPDwgIiBUaGUgbWF0cml4IGFuZCBhc3NvY2lhdGVkIHJpZ2h0LWhhbmQgc2lkZSAocmhzKSBmaWxlcyBhcmUgbmFtZWQgcmVzcGVjdGl2ZWx5IGFzIE1hdHJpeE5hbWUubXR4IGFuZCAiCisgICAgICAgICAgIk1hdHJpeE5hbWVfYi5tdHguXG4iOworICBjb3V0IDw8ICIgSWYgdGhlIHJocyBkb2VzIG5vdCBleGlzdCwgYSByYW5kb20gb25lIGlzIGdlbmVyYXRlZC4gXG4iOworICBjb3V0IDw8ICIgSWYgYSB0cnVlIHNvbHV0aW9uIGV4aXN0cywgaXQgc2hvdWxkIGJlIG5hbWVkIGFzIE1hdHJpeE5hbWVfeC5tdHggOyBpdCB3aWxsIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbm9ybSBvZiAiCisgICAgICAgICAgInRoZSBlcnJvciBcbiI7CisgIGNvdXQgPDwgIiByZWxhdGl2ZSB0byB0aGUgY29tcHV0ZWQgc29sdXRpb25zLiBcbiI7CisgIGNvdXQgPDwgIiBJZiBhIG1hdHJpeCBpcyBTUEQsIHRoZSBtYXRyaXggc2hvdWxkIGJlIG5hbWVkIGFzIE1hdHJpeE5hbWVfU1BELm10eCAodGhlbiB1c2UgTWF0cml4TmFtZV9TUERfYi5tdHggXG4iOworICBjb3V0IDw8ICIgYW5kIE1hdHJpeE5hbWVfU1BEX3gubXR4IGZvciB0aGUgcmhzIGFuZCB0aGUgdHJ1ZSBzb2x1dGlvbikuXG5cbiI7CisgIGNvdXQgPDwgIiBPUFRJT05TIDogXG4iOworICBjb3V0IDw8ICIgLWggb3IgLS1oZWxwIFxuICAgIHByaW50IHRoaXMgaGVscCBhbmQgcmV0dXJuXG5cbiI7CisgIGNvdXQgPDwgIiAtZCBtYXRyaXhkaXIgXG4gICAgVXNlIG1hdHJpeGRpciBhcyB0aGUgbWF0cml4IGZvbGRlciBpbnN0ZWFkIG9mIHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoZSBlbnZpcm9ubWVudCAiCisgICAgICAgICAgInZhcmlhYmxlIEVJR0VOX01BVFJJWERJUlxuXG4iOworICBjb3V0IDw8ICIgLW8gb3V0cHV0ZmlsZS54bWwgXG4gICAgT3V0cHV0IHRoZSBzdGF0aXN0aWNzIHRvIGEgeG1sIGZpbGUgXG5cbiI7CisgIGNvdXQgPDwgIiAtLWVwcyA8UmVsRXJyPiBTZXRzIHRoZSByZWxhdGl2ZSB0b2xlcmFuY2UgZm9yIGl0ZXJhdGl2ZSBzb2x2ZXJzIChkZWZhdWx0IDFlLTA4KSBcblxuIjsKKyAgY291dCA8PCAiIC0tbWF4aXRzIDxNYXhJdHM+IFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgKGRlZmF1bHQgMTAwMCkgXG5cbiI7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3MpCi17Ci0gIAotICBib29sIGhlbHAgPSAoIGdldF9vcHRpb25zKGFyZ2MsIGFyZ3MsICItaCIpIHx8IGdldF9vcHRpb25zKGFyZ2MsIGFyZ3MsICItLWhlbHAiKSApOwotICBpZihoZWxwKSB7CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3MpIHsKKyAgYm9vbCBoZWxwID0gKGdldF9vcHRpb25zKGFyZ2MsIGFyZ3MsICItaCIpIHx8IGdldF9vcHRpb25zKGFyZ2MsIGFyZ3MsICItLWhlbHAiKSk7CisgIGlmIChoZWxwKSB7CiAgICAgYmVuY2hfcHJpbnRoZWxwKCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICAvLyBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSB0ZXN0IG1hdHJpY2VzCiAgIHN0cmluZyBtYXRyaXhfZGlyOwotICBpZiAoIWdldF9vcHRpb25zKGFyZ2MsIGFyZ3MsICItZCIsICZtYXRyaXhfZGlyKSkKLSAgewotICAgIGlmKGdldGVudigiRUlHRU5fTUFUUklYRElSIikgPT0gTlVMTCl7Ci0gICAgICBzdGQ6OmNlcnIgPDwgIlBsZWFzZSwgc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIG1hdHJpY2VzIHdpdGggLWQgbWF0X2ZvbGRlciBvciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRUlHRU5fTUFUUklYRElSIFxuIjsKKyAgaWYgKCFnZXRfb3B0aW9ucyhhcmdjLCBhcmdzLCAiLWQiLCAmbWF0cml4X2RpcikpIHsKKyAgICBpZiAoZ2V0ZW52KCJFSUdFTl9NQVRSSVhESVIiKSA9PSBOVUxMKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlBsZWFzZSwgc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIG1hdHJpY2VzIHdpdGggLWQgbWF0X2ZvbGRlciBvciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgIgorICAgICAgICAgICAgICAgICAgICJFSUdFTl9NQVRSSVhESVIgXG4iOwogICAgICAgc3RkOjpjZXJyIDw8ICIgUnVuIHdpdGggLS1oZWxwIHRvIHNlZSB0aGUgbGlzdCBvZiBhbGwgdGhlIGF2YWlsYWJsZSBvcHRpb25zIFxuIjsKICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgbWF0cml4X2RpciA9IGdldGVudigiRUlHRU5fTUFUUklYRElSIik7CiAgIH0KLSAgICAgCisKICAgc3RkOjpvZnN0cmVhbSBzdGF0YnVmOwotICBzdHJpbmcgc3RhdEZpbGUgOwotICAKKyAgc3RyaW5nIHN0YXRGaWxlOworCiAgIC8vIEdldCB0aGUgZmlsZSB0byB3cml0ZSB0aGUgc3RhdGlzdGljcwogICBib29sIHN0YXRGaWxlRXhpc3RzID0gZ2V0X29wdGlvbnMoYXJnYywgYXJncywgIi1vIiwgJnN0YXRGaWxlKTsKLSAgaWYoc3RhdEZpbGVFeGlzdHMpCi0gIHsKKyAgaWYgKHN0YXRGaWxlRXhpc3RzKSB7CiAgICAgc3RhdGJ1Zi5vcGVuKHN0YXRGaWxlLmNfc3RyKCksIHN0ZDo6aW9zOjpvdXQpOwotICAgIGlmKHN0YXRidWYuZ29vZCgpKXsKLSAgICAgIHN0YXRGaWxlRXhpc3RzID0gdHJ1ZTsgCisgICAgaWYgKHN0YXRidWYuZ29vZCgpKSB7CisgICAgICBzdGF0RmlsZUV4aXN0cyA9IHRydWU7CiAgICAgICBwcmludFN0YXRoZWFkZXIoc3RhdGJ1Zik7CiAgICAgICBzdGF0YnVmLmNsb3NlKCk7Ci0gICAgfQotICAgIGVsc2UKKyAgICB9IGVsc2UKICAgICAgIHN0ZDo6Y2VyciA8PCAiVW5hYmxlIHRvIG9wZW4gdGhlIHByb3ZpZGVkIGZpbGUgZm9yIHdyaXRpbmcuLi4gXG4iOwotICB9ICAgICAgIAotICAKKyAgfQorCiAgIC8vIEdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBhbmQgdGhlIHRvbGVyYW5jZQotICBpbnQgbWF4aXRlcnMgPSAxMDAwOyAKLSAgZG91YmxlIHRvbCA9IDFlLTA4OyAKLSAgc3RyaW5nIGludmFsOyAKLSAgaWYgKGdldF9vcHRpb25zKGFyZ2MsIGFyZ3MsICItLWVwcyIsICZpbnZhbCkpCi0gICAgdG9sID0gYXRvZihpbnZhbC5jX3N0cigpKTsgCi0gIGlmKGdldF9vcHRpb25zKGFyZ2MsIGFyZ3MsICItLW1heGl0cyIsICZpbnZhbCkpCi0gICAgbWF4aXRlcnMgPSBhdG9pKGludmFsLmNfc3RyKCkpOyAKLSAgCi0gIHN0cmluZyBjdXJyZW50X2RpcjsgCisgIGludCBtYXhpdGVycyA9IDEwMDA7CisgIGRvdWJsZSB0b2wgPSAxZS0wODsKKyAgc3RyaW5nIGludmFsOworICBpZiAoZ2V0X29wdGlvbnMoYXJnYywgYXJncywgIi0tZXBzIiwgJmludmFsKSkgdG9sID0gYXRvZihpbnZhbC5jX3N0cigpKTsKKyAgaWYgKGdldF9vcHRpb25zKGFyZ2MsIGFyZ3MsICItLW1heGl0cyIsICZpbnZhbCkpIG1heGl0ZXJzID0gYXRvaShpbnZhbC5jX3N0cigpKTsKKworICBzdHJpbmcgY3VycmVudF9kaXI7CiAgIC8vIFRlc3QgdGhlIHJlYWwtYXJpdGhtZXRpY3MgbWF0cmljZXMKLSAgQnJvd3NlX01hdHJpY2VzPGRvdWJsZT4obWF0cml4X2Rpciwgc3RhdEZpbGVFeGlzdHMsIHN0YXRGaWxlLG1heGl0ZXJzLCB0b2wpOwotICAKKyAgQnJvd3NlX01hdHJpY2VzPGRvdWJsZT4obWF0cml4X2Rpciwgc3RhdEZpbGVFeGlzdHMsIHN0YXRGaWxlLCBtYXhpdGVycywgdG9sKTsKKwogICAvLyBUZXN0IHRoZSBjb21wbGV4LWFyaXRobWV0aWNzIG1hdHJpY2VzCi0gIEJyb3dzZV9NYXRyaWNlczxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KG1hdHJpeF9kaXIsIHN0YXRGaWxlRXhpc3RzLCBzdGF0RmlsZSwgbWF4aXRlcnMsIHRvbCk7IAotICAKLSAgaWYoc3RhdEZpbGVFeGlzdHMpCi0gIHsKLSAgICBzdGF0YnVmLm9wZW4oc3RhdEZpbGUuY19zdHIoKSwgc3RkOjppb3M6OmFwcCk7IAorICBCcm93c2VfTWF0cmljZXM8c3RkOjpjb21wbGV4PGRvdWJsZT4gPihtYXRyaXhfZGlyLCBzdGF0RmlsZUV4aXN0cywgc3RhdEZpbGUsIG1heGl0ZXJzLCB0b2wpOworCisgIGlmIChzdGF0RmlsZUV4aXN0cykgeworICAgIHN0YXRidWYub3BlbihzdGF0RmlsZS5jX3N0cigpLCBzdGQ6Omlvczo6YXBwKTsKICAgICBzdGF0YnVmIDw8ICI8L0JFTkNIPiBcbiI7CiAgICAgY291dCA8PCAiXG4gT3V0cHV0IHdyaXR0ZW4gaW4gIiA8PCBzdGF0RmlsZSA8PCAiIC4uLlxuIjsKICAgICBzdGF0YnVmLmNsb3NlKCk7CkBAIC04NCw1ICs4MCwzIEBACiAKICAgcmV0dXJuIDA7CiB9Ci0KLSAgICAgIApkaWZmIC0tZ2l0IGEvYmVuY2gvc3BiZW5jaC9zcGJlbmNoc29sdmVyLmggYi9iZW5jaC9zcGJlbmNoL3NwYmVuY2hzb2x2ZXIuaAppbmRleCA4ZjU5ZDEwLi44MTFhMDU2IDEwMDY0NAotLS0gYS9iZW5jaC9zcGJlbmNoL3NwYmVuY2hzb2x2ZXIuaAorKysgYi9iZW5jaC9zcGJlbmNoL3NwYmVuY2hzb2x2ZXIuaApAQCAtNyw3ICs3LDYgQEAKIC8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAogLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCiAKLQogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8RWlnZW4vU3BhcnNlQ29yZT4KQEAgLTU0LDUyMCArNTMsNTEzIEBACiAjZW5kaWYKIAogLy8gQ09OU1RBTlRTCi0jZGVmaW5lIEVJR0VOX1VNRlBBQ0sgIDEwCi0jZGVmaW5lIEVJR0VOX0tMVSAgMTEKLSNkZWZpbmUgRUlHRU5fU1VQRVJMVSAgMjAKLSNkZWZpbmUgRUlHRU5fUEFTVElYICAzMAotI2RlZmluZSBFSUdFTl9QQVJESVNPICA0MAorI2RlZmluZSBFSUdFTl9VTUZQQUNLIDEwCisjZGVmaW5lIEVJR0VOX0tMVSAxMQorI2RlZmluZSBFSUdFTl9TVVBFUkxVIDIwCisjZGVmaW5lIEVJR0VOX1BBU1RJWCAzMAorI2RlZmluZSBFSUdFTl9QQVJESVNPIDQwCiAjZGVmaW5lIEVJR0VOX1NQQVJTRUxVX0NPTEFNRCA1MAogI2RlZmluZSBFSUdFTl9TUEFSU0VMVV9NRVRJUyA1MQotI2RlZmluZSBFSUdFTl9CSUNHU1RBQiAgNjAKLSNkZWZpbmUgRUlHRU5fQklDR1NUQUJfSUxVVCAgNjEKKyNkZWZpbmUgRUlHRU5fQklDR1NUQUIgNjAKKyNkZWZpbmUgRUlHRU5fQklDR1NUQUJfSUxVVCA2MQogI2RlZmluZSBFSUdFTl9HTVJFUyA3MAogI2RlZmluZSBFSUdFTl9HTVJFU19JTFVUIDcxCi0jZGVmaW5lIEVJR0VOX1NJTVBMSUNJQUxfTERMVCAgODAKLSNkZWZpbmUgRUlHRU5fQ0hPTE1PRF9MRExUICA5MAotI2RlZmluZSBFSUdFTl9QQVNUSVhfTERMVCAgMTAwCi0jZGVmaW5lIEVJR0VOX1BBUkRJU09fTERMVCAgMTEwCi0jZGVmaW5lIEVJR0VOX1NJTVBMSUNJQUxfTExUICAxMjAKLSNkZWZpbmUgRUlHRU5fQ0hPTE1PRF9TVVBFUk5PREFMX0xMVCAgMTMwCi0jZGVmaW5lIEVJR0VOX0NIT0xNT0RfU0lNUExJQ0lBTF9MTFQgIDE0MAotI2RlZmluZSBFSUdFTl9QQVNUSVhfTExUICAxNTAKLSNkZWZpbmUgRUlHRU5fUEFSRElTT19MTFQgIDE2MAotI2RlZmluZSBFSUdFTl9DRyAgMTcwCi0jZGVmaW5lIEVJR0VOX0NHX1BSRUNPTkQgIDE4MAorI2RlZmluZSBFSUdFTl9TSU1QTElDSUFMX0xETFQgODAKKyNkZWZpbmUgRUlHRU5fQ0hPTE1PRF9MRExUIDkwCisjZGVmaW5lIEVJR0VOX1BBU1RJWF9MRExUIDEwMAorI2RlZmluZSBFSUdFTl9QQVJESVNPX0xETFQgMTEwCisjZGVmaW5lIEVJR0VOX1NJTVBMSUNJQUxfTExUIDEyMAorI2RlZmluZSBFSUdFTl9DSE9MTU9EX1NVUEVSTk9EQUxfTExUIDEzMAorI2RlZmluZSBFSUdFTl9DSE9MTU9EX1NJTVBMSUNJQUxfTExUIDE0MAorI2RlZmluZSBFSUdFTl9QQVNUSVhfTExUIDE1MAorI2RlZmluZSBFSUdFTl9QQVJESVNPX0xMVCAxNjAKKyNkZWZpbmUgRUlHRU5fQ0cgMTcwCisjZGVmaW5lIEVJR0VOX0NHX1BSRUNPTkQgMTgwCiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7IAotCit1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiAvLyBHbG9iYWwgdmFyaWFibGVzIGZvciBpbnB1dCBwYXJhbWV0ZXJzCi1pbnQgTWF4aW11bUl0ZXJzOyAvLyBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zCi1kb3VibGUgUmVsRXJyOyAvLyBSZWxhdGl2ZSBlcnJvciBvZiB0aGUgY29tcHV0ZWQgc29sdXRpb24KLWRvdWJsZSBiZXN0X3RpbWVfdmFsOyAvLyBDdXJyZW50IGJlc3QgdGltZSBvdmVyYWxsIHNvbHZlcnMgCi1pbnQgYmVzdF90aW1lX2lkOyAvLyAgaWQgb2YgdGhlIGJlc3Qgc29sdmVyIGZvciB0aGUgY3VycmVudCBzeXN0ZW0gCitpbnQgTWF4aW11bUl0ZXJzOyAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMKK2RvdWJsZSBSZWxFcnI7ICAgICAgICAgLy8gUmVsYXRpdmUgZXJyb3Igb2YgdGhlIGNvbXB1dGVkIHNvbHV0aW9uCitkb3VibGUgYmVzdF90aW1lX3ZhbDsgIC8vIEN1cnJlbnQgYmVzdCB0aW1lIG92ZXJhbGwgc29sdmVycworaW50IGJlc3RfdGltZV9pZDsgICAgICAvLyAgaWQgb2YgdGhlIGJlc3Qgc29sdmVyIGZvciB0aGUgY3VycmVudCBzeXN0ZW0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbCB0ZXN0X3ByZWNpc2lvbigpIHsgcmV0dXJuIE51bVRyYWl0czxUPjo6ZHVtbXlfcHJlY2lzaW9uKCk7IH0KLXRlbXBsYXRlPD4gaW5saW5lIGZsb2F0IHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpIHsgcmV0dXJuIDFlLTNmOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotdGVtcGxhdGU8PiBpbmxpbmUgZG91YmxlIHRlc3RfcHJlY2lzaW9uPGRvdWJsZT4oKSB7IHJldHVybiAxZS02OyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi10ZW1wbGF0ZTw+IGlubGluZSBmbG9hdCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSB7IHJldHVybiB0ZXN0X3ByZWNpc2lvbjxmbG9hdD4oKTsgfQotdGVtcGxhdGU8PiBpbmxpbmUgZG91YmxlIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSB7IHJldHVybiB0ZXN0X3ByZWNpc2lvbjxkb3VibGU+KCk7IH0KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbCB0ZXN0X3ByZWNpc2lvbigpIHsKKyAgcmV0dXJuIE51bVRyYWl0czxUPjo6ZHVtbXlfcHJlY2lzaW9uKCk7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGZsb2F0IHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpIHsKKyAgcmV0dXJuIDFlLTNmOworfQordGVtcGxhdGUgPD4KK2lubGluZSBkb3VibGUgdGVzdF9wcmVjaXNpb248ZG91YmxlPigpIHsKKyAgcmV0dXJuIDFlLTY7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGZsb2F0IHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpIHsKKyAgcmV0dXJuIHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBkb3VibGUgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpIHsKKyAgcmV0dXJuIHRlc3RfcHJlY2lzaW9uPGRvdWJsZT4oKTsKK30KIAotdm9pZCBwcmludFN0YXRoZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0KQotewordm9pZCBwcmludFN0YXRoZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0KSB7CiAgIC8vIFByaW50IFhNTCBoZWFkZXIKLSAgLy8gTk9URSBJdCB3b3VsZCBoYXZlIGJlZW4gbXVjaCBlYXNpZXIgdG8gd3JpdGUgdGhlc2UgWE1MIGRvY3VtZW50cyB1c2luZyBleHRlcm5hbCBsaWJyYXJpZXMgbGlrZSB0aW55WE1MIG9yIFhlcmNlcy1DKysuCi0gIAorICAvLyBOT1RFIEl0IHdvdWxkIGhhdmUgYmVlbiBtdWNoIGVhc2llciB0byB3cml0ZSB0aGVzZSBYTUwgZG9jdW1lbnRzIHVzaW5nIGV4dGVybmFsIGxpYnJhcmllcyBsaWtlIHRpbnlYTUwgb3IKKyAgLy8gWGVyY2VzLUMrKy4KKwogICBvdXQgPDwgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+IFxuIjsKLSAgb3V0IDw8ICI8P3htbC1zdHlsZXNoZWV0IHR5cGU9J3RleHQveHNsJyBocmVmPScjc3R5bGVzaGVldCcgPz4gXG4iOyAKKyAgb3V0IDw8ICI8P3htbC1zdHlsZXNoZWV0IHR5cGU9J3RleHQveHNsJyBocmVmPScjc3R5bGVzaGVldCcgPz4gXG4iOwogICBvdXQgPDwgIjwhRE9DVFlQRSBCRU5DSCAgW1xuPCFBVFRMSVNUIHhzbDpzdHlsZXNoZWV0XG4gaWRcdCBJRCAgI1JFUVVJUkVEPlxuXT4iOwotICBvdXQgPDwgIlxuXG48IS0tIEdlbmVyYXRlZCBieSB0aGUgRWlnZW4gbGlicmFyeSAtLT5cbiI7IAotICAKLSAgb3V0IDw8ICJcbjxCRU5DSD4gXG4iIDsgLy9yb290IFhNTCBlbGVtZW50IAorICBvdXQgPDwgIlxuXG48IS0tIEdlbmVyYXRlZCBieSB0aGUgRWlnZW4gbGlicmFyeSAtLT5cbiI7CisKKyAgb3V0IDw8ICJcbjxCRU5DSD4gXG4iOyAgLy8gcm9vdCBYTUwgZWxlbWVudAogICAvLyBQcmludCB0aGUgeHNsIHN0eWxlIHNlY3Rpb24KLSAgcHJpbnRCZW5jaFN0eWxlKG91dCk7IAotICAvLyBMaXN0IGFsbCBhdmFpbGFibGUgc29sdmVycyAKKyAgcHJpbnRCZW5jaFN0eWxlKG91dCk7CisgIC8vIExpc3QgYWxsIGF2YWlsYWJsZSBzb2x2ZXJzCiAgIG91dCA8PCAiIDxBVkFJTFNPTFZFUj4gXG4iOwogI2lmZGVmIEVJR0VOX1VNRlBBQ0tfU1VQUE9SVAotICBvdXQgPDwiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX1VNRlBBQ0sgPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fVU1GUEFDSyA8PCAiJz5cbiI7CiAgIG91dCA8PCAiICAgPFRZUEU+IExVIDwvVFlQRT4gXG4iOwotICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBVTUZQQUNLIDwvUEFDS0FHRT4gXG4iOyAKLSAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7IAorICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBVTUZQQUNLIDwvUEFDS0FHRT4gXG4iOworICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsKICNlbmRpZgogI2lmZGVmIEVJR0VOX0tMVV9TVVBQT1JUCi0gIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fS0xVIDw8ICInPlxuIjsKKyAgb3V0IDw8ICIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fS0xVIDw8ICInPlxuIjsKICAgb3V0IDw8ICIgICA8VFlQRT4gTFUgPC9UWVBFPiBcbiI7CiAgIG91dCA8PCAiICAgPFBBQ0tBR0U+IEtMVSA8L1BBQ0tBR0U+IFxuIjsKICAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7CiAjZW5kaWYKICNpZmRlZiBFSUdFTl9TVVBFUkxVX1NVUFBPUlQKLSAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9TVVBFUkxVIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX1NVUEVSTFUgPDwgIic+XG4iOwogICBvdXQgPDwgIiAgIDxUWVBFPiBMVSA8L1RZUEU+IFxuIjsKLSAgb3V0IDw8ICIgICA8UEFDS0FHRT4gU1VQRVJMVSA8L1BBQ0tBR0U+IFxuIjsgCi0gIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gU1VQRVJMVSA8L1BBQ0tBR0U+IFxuIjsKKyAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7CiAjZW5kaWYKICNpZmRlZiBFSUdFTl9DSE9MTU9EX1NVUFBPUlQKLSAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9DSE9MTU9EX1NJTVBMSUNJQUxfTExUIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX0NIT0xNT0RfU0lNUExJQ0lBTF9MTFQgPDwgIic+XG4iOwogICBvdXQgPDwgIiAgIDxUWVBFPiBMTFQgU1A8L1RZUEU+IFxuIjsKICAgb3V0IDw8ICIgICA8UEFDS0FHRT4gQ0hPTE1PRCA8L1BBQ0tBR0U+IFxuIjsKLSAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7IAotICAKLSAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9DSE9MTU9EX1NVUEVSTk9EQUxfTExUIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOworCisgIG91dCA8PCAiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX0NIT0xNT0RfU1VQRVJOT0RBTF9MTFQgPDwgIic+XG4iOwogICBvdXQgPDwgIiAgIDxUWVBFPiBMTFQ8L1RZUEU+IFxuIjsKICAgb3V0IDw8ICIgICA8UEFDS0FHRT4gQ0hPTE1PRCA8L1BBQ0tBR0U+IFxuIjsKICAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7Ci0gIAotICBvdXQgPDwiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX0NIT0xNT0RfTERMVCA8PCAiJz5cbiI7IAorCisgIG91dCA8PCAiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX0NIT0xNT0RfTERMVCA8PCAiJz5cbiI7CiAgIG91dCA8PCAiICAgPFRZUEU+IExETFQgPC9UWVBFPiBcbiI7Ci0gIG91dCA8PCAiICAgPFBBQ0tBR0U+IENIT0xNT0QgPC9QQUNLQUdFPiBcbiI7ICAKLSAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7IAorICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBDSE9MTU9EIDwvUEFDS0FHRT4gXG4iOworICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsKICNlbmRpZgogI2lmZGVmIEVJR0VOX1BBUkRJU09fU1VQUE9SVAotICBvdXQgPDwiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX1BBUkRJU08gPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fUEFSRElTTyA8PCAiJz5cbiI7CiAgIG91dCA8PCAiICAgPFRZUEU+IExVIDwvVFlQRT4gXG4iOwotICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBQQVJESVNPIDwvUEFDS0FHRT4gXG4iOyAKLSAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7IAotICAKLSAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9QQVJESVNPX0xMVCA8PCAiJz5cbiI7IAorICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBQQVJESVNPIDwvUEFDS0FHRT4gXG4iOworICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsKKworICBvdXQgPDwgIiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9QQVJESVNPX0xMVCA8PCAiJz5cbiI7CiAgIG91dCA8PCAiICAgPFRZUEU+IExMVCA8L1RZUEU+IFxuIjsKLSAgb3V0IDw8ICIgICA8UEFDS0FHRT4gUEFSRElTTyA8L1BBQ0tBR0U+IFxuIjsgCi0gIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKLSAgCi0gIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fUEFSRElTT19MRExUIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICAgPFBBQ0tBR0U+IFBBUkRJU08gPC9QQUNLQUdFPiBcbiI7CisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOworCisgIG91dCA8PCAiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX1BBUkRJU09fTERMVCA8PCAiJz5cbiI7CiAgIG91dCA8PCAiICAgPFRZUEU+IExETFQgPC9UWVBFPiBcbiI7Ci0gIG91dCA8PCAiICAgPFBBQ0tBR0U+IFBBUkRJU08gPC9QQUNLQUdFPiBcbiI7IAotICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsgCisgIG91dCA8PCAiICAgPFBBQ0tBR0U+IFBBUkRJU08gPC9QQUNLQUdFPiBcbiI7CisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOwogI2VuZGlmCiAjaWZkZWYgRUlHRU5fUEFTVElYX1NVUFBPUlQKLSAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9QQVNUSVggPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fUEFTVElYIDw8ICInPlxuIjsKICAgb3V0IDw8ICIgICA8VFlQRT4gTFUgPC9UWVBFPiBcbiI7Ci0gIG91dCA8PCAiICAgPFBBQ0tBR0U+IFBBU1RJWCA8L1BBQ0tBR0U+IFxuIjsgCi0gIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKLSAgCi0gIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fUEFTVElYX0xMVCA8PCAiJz5cbiI7IAorICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBQQVNUSVggPC9QQUNLQUdFPiBcbiI7CisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOworCisgIG91dCA8PCAiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX1BBU1RJWF9MTFQgPDwgIic+XG4iOwogICBvdXQgPDwgIiAgIDxUWVBFPiBMTFQgPC9UWVBFPiBcbiI7Ci0gIG91dCA8PCAiICAgPFBBQ0tBR0U+IFBBU1RJWCA8L1BBQ0tBR0U+IFxuIjsgCi0gIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKLSAgCi0gIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fUEFTVElYX0xETFQgPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gUEFTVElYIDwvUEFDS0FHRT4gXG4iOworICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsKKworICBvdXQgPDwgIiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9QQVNUSVhfTERMVCA8PCAiJz5cbiI7CiAgIG91dCA8PCAiICAgPFRZUEU+IExETFQgPC9UWVBFPiBcbiI7Ci0gIG91dCA8PCAiICAgPFBBQ0tBR0U+IFBBU1RJWCA8L1BBQ0tBR0U+IFxuIjsgCi0gIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gUEFTVElYIDwvUEFDS0FHRT4gXG4iOworICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsKICNlbmRpZgotICAKLSAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9CSUNHU1RBQiA8PCAiJz5cbiI7IAorCisgIG91dCA8PCAiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX0JJQ0dTVEFCIDw8ICInPlxuIjsKICAgb3V0IDw8ICIgICA8VFlQRT4gQklDR1NUQUIgPC9UWVBFPiBcbiI7Ci0gIG91dCA8PCAiICAgPFBBQ0tBR0U+IEVJR0VOIDwvUEFDS0FHRT4gXG4iOyAKLSAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7IAotICAKLSAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9CSUNHU1RBQl9JTFVUIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICAgPFBBQ0tBR0U+IEVJR0VOIDwvUEFDS0FHRT4gXG4iOworICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsKKworICBvdXQgPDwgIiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9CSUNHU1RBQl9JTFVUIDw8ICInPlxuIjsKICAgb3V0IDw8ICIgICA8VFlQRT4gQklDR1NUQUJfSUxVVCA8L1RZUEU+IFxuIjsKLSAgb3V0IDw8ICIgICA8UEFDS0FHRT4gRUlHRU4gPC9QQUNLQUdFPiBcbiI7IAotICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsgCi0gIAotICBvdXQgPDwiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX0dNUkVTX0lMVVQgPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gRUlHRU4gPC9QQUNLQUdFPiBcbiI7CisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOworCisgIG91dCA8PCAiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX0dNUkVTX0lMVVQgPDwgIic+XG4iOwogICBvdXQgPDwgIiAgIDxUWVBFPiBHTVJFU19JTFVUIDwvVFlQRT4gXG4iOwotICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBFSUdFTiA8L1BBQ0tBR0U+IFxuIjsgCi0gIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKLSAgCi0gIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fU0lNUExJQ0lBTF9MRExUIDw8ICInPlxuIjsgCisgIG91dCA8PCAiICAgPFBBQ0tBR0U+IEVJR0VOIDwvUEFDS0FHRT4gXG4iOworICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsKKworICBvdXQgPDwgIiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9TSU1QTElDSUFMX0xETFQgPDwgIic+XG4iOwogICBvdXQgPDwgIiAgIDxUWVBFPiBMRExUIDwvVFlQRT4gXG4iOwotICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBFSUdFTiA8L1BBQ0tBR0U+IFxuIjsgCi0gIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKLSAgCi0gIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fU0lNUExJQ0lBTF9MTFQgPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gRUlHRU4gPC9QQUNLQUdFPiBcbiI7CisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOworCisgIG91dCA8PCAiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX1NJTVBMSUNJQUxfTExUIDw8ICInPlxuIjsKICAgb3V0IDw8ICIgICA8VFlQRT4gTExUIDwvVFlQRT4gXG4iOwotICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBFSUdFTiA8L1BBQ0tBR0U+IFxuIjsgCi0gIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOyAKLSAgCi0gIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fQ0cgPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gRUlHRU4gPC9QQUNLQUdFPiBcbiI7CisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOworCisgIG91dCA8PCAiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX0NHIDw8ICInPlxuIjsKICAgb3V0IDw8ICIgICA8VFlQRT4gQ0cgPC9UWVBFPiBcbiI7Ci0gIG91dCA8PCAiICAgPFBBQ0tBR0U+IEVJR0VOIDwvUEFDS0FHRT4gXG4iOyAKLSAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7IAotICAKLSAgb3V0IDw8IiAgPFNPTFZFUiBJRD0nIiA8PCBFSUdFTl9TUEFSU0VMVV9DT0xBTUQgPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgICA8UEFDS0FHRT4gRUlHRU4gPC9QQUNLQUdFPiBcbiI7CisgIG91dCA8PCAiICA8L1NPTFZFUj4gXG4iOworCisgIG91dCA8PCAiICA8U09MVkVSIElEPSciIDw8IEVJR0VOX1NQQVJTRUxVX0NPTEFNRCA8PCAiJz5cbiI7CiAgIG91dCA8PCAiICAgPFRZUEU+IExVX0NPTEFNRCA8L1RZUEU+IFxuIjsKLSAgb3V0IDw8ICIgICA8UEFDS0FHRT4gRUlHRU4gPC9QQUNLQUdFPiBcbiI7IAotICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsgCi0gIAorICBvdXQgPDwgIiAgIDxQQUNLQUdFPiBFSUdFTiA8L1BBQ0tBR0U+IFxuIjsKKyAgb3V0IDw8ICIgIDwvU09MVkVSPiBcbiI7CisKICNpZmRlZiBFSUdFTl9NRVRJU19TVVBQT1JUCi0gIG91dCA8PCIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fU1BBUlNFTFVfTUVUSVMgPDwgIic+XG4iOyAKKyAgb3V0IDw8ICIgIDxTT0xWRVIgSUQ9JyIgPDwgRUlHRU5fU1BBUlNFTFVfTUVUSVMgPDwgIic+XG4iOwogICBvdXQgPDwgIiAgIDxUWVBFPiBMVV9NRVRJUyA8L1RZUEU+IFxuIjsKLSAgb3V0IDw8ICIgICA8UEFDS0FHRT4gRUlHRU4gPC9QQUNLQUdFPiBcbiI7IAotICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsgCisgIG91dCA8PCAiICAgPFBBQ0tBR0U+IEVJR0VOIDwvUEFDS0FHRT4gXG4iOworICBvdXQgPDwgIiAgPC9TT0xWRVI+IFxuIjsKICNlbmRpZgotICBvdXQgPDwgIiA8L0FWQUlMU09MVkVSPiBcbiI7IAotICAKKyAgb3V0IDw8ICIgPC9BVkFJTFNPTFZFUj4gXG4iOwogfQogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgU2NhbGFyPgotdm9pZCBjYWxsX3NvbHZlcihTb2x2ZXIgJnNvbHZlciwgY29uc3QgaW50IHNvbHZlcl9pZCwgY29uc3QgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlJiBBLCBjb25zdCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiYgYiwgY29uc3QgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4mIHJlZlgsc3RkOjpvZnN0cmVhbSYgc3RhdGJ1ZikKLXsKLSAgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGNhbGxfc29sdmVyKFNvbHZlciYgc29sdmVyLCBjb25zdCBpbnQgc29sdmVyX2lkLCBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsCisgICAgICAgICAgICAgICAgIGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+JiBiLCBjb25zdCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiYgcmVmWCwgc3RkOjpvZnN0cmVhbSYgc3RhdGJ1ZikgewogICBkb3VibGUgdG90YWxfdGltZTsKICAgZG91YmxlIGNvbXB1dGVfdGltZTsKLSAgZG91YmxlIHNvbHZlX3RpbWU7IAorICBkb3VibGUgc29sdmVfdGltZTsKICAgZG91YmxlIHJlbF9lcnJvcjsKLSAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4geDsgCi0gIEJlbmNoVGltZXIgdGltZXI7IAorICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiB4OworICBCZW5jaFRpbWVyIHRpbWVyOwogICB0aW1lci5yZXNldCgpOwogICB0aW1lci5zdGFydCgpOwotICBzb2x2ZXIuY29tcHV0ZShBKTsgCi0gIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCi0gIHsKKyAgc29sdmVyLmNvbXB1dGUoQSk7CisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpIHsKICAgICBzdGQ6OmNlcnIgPDwgIlNvbHZlciBmYWlsZWQgLi4uIFxuIjsKICAgICByZXR1cm47CiAgIH0KICAgdGltZXIuc3RvcCgpOwogICBjb21wdXRlX3RpbWUgPSB0aW1lci52YWx1ZSgpOwotICBzdGF0YnVmIDw8ICIgICAgPFRJTUU+XG4iOyAKKyAgc3RhdGJ1ZiA8PCAiICAgIDxUSU1FPlxuIjsKICAgc3RhdGJ1ZiA8PCAiICAgICA8Q09NUFVURT4gIiA8PCB0aW1lci52YWx1ZSgpIDw8ICI8L0NPTVBVVEU+XG4iOwotICBzdGQ6OmNvdXQ8PCAiQ09NUFVURSBUSU1FIDogIiA8PCB0aW1lci52YWx1ZSgpIDw8c3RkOjplbmRsOyAKLSAgICAKKyAgc3RkOjpjb3V0IDw8ICJDT01QVVRFIFRJTUUgOiAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgc3RkOjplbmRsOworCiAgIHRpbWVyLnJlc2V0KCk7CiAgIHRpbWVyLnN0YXJ0KCk7Ci0gIHggPSBzb2x2ZXIuc29sdmUoYik7IAotICBpZiAoc29sdmVyLmluZm8oKSA9PSBOdW1lcmljYWxJc3N1ZSkKLSAgeworICB4ID0gc29sdmVyLnNvbHZlKGIpOworICBpZiAoc29sdmVyLmluZm8oKSA9PSBOdW1lcmljYWxJc3N1ZSkgewogICAgIHN0ZDo6Y2VyciA8PCAiU29sdmVyIGZhaWxlZCAuLi4gXG4iOwogICAgIHJldHVybjsKICAgfQogICB0aW1lci5zdG9wKCk7CiAgIHNvbHZlX3RpbWUgPSB0aW1lci52YWx1ZSgpOwotICBzdGF0YnVmIDw8ICIgICAgIDxTT0xWRT4gIiA8PCB0aW1lci52YWx1ZSgpIDw8ICI8L1NPTFZFPlxuIjsgCi0gIHN0ZDo6Y291dDw8ICJTT0xWRSBUSU1FIDogIiA8PCB0aW1lci52YWx1ZSgpIDw8c3RkOjplbmRsOyAKLSAgCisgIHN0YXRidWYgPDwgIiAgICAgPFNPTFZFPiAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgIjwvU09MVkU+XG4iOworICBzdGQ6OmNvdXQgPDwgIlNPTFZFIFRJTUUgOiAiIDw8IHRpbWVyLnZhbHVlKCkgPDwgc3RkOjplbmRsOworCiAgIHRvdGFsX3RpbWUgPSBzb2x2ZV90aW1lICsgY29tcHV0ZV90aW1lOwotICBzdGF0YnVmIDw8ICIgICAgIDxUT1RBTD4gIiA8PCB0b3RhbF90aW1lIDw8ICI8L1RPVEFMPlxuIjsgCi0gIHN0ZDo6Y291dDw8ICJUT1RBTCBUSU1FIDogIiA8PCB0b3RhbF90aW1lIDw8c3RkOjplbmRsOyAKLSAgc3RhdGJ1ZiA8PCAiICAgIDwvVElNRT5cbiI7IAotICAKKyAgc3RhdGJ1ZiA8PCAiICAgICA8VE9UQUw+ICIgPDwgdG90YWxfdGltZSA8PCAiPC9UT1RBTD5cbiI7CisgIHN0ZDo6Y291dCA8PCAiVE9UQUwgVElNRSA6ICIgPDwgdG90YWxfdGltZSA8PCBzdGQ6OmVuZGw7CisgIHN0YXRidWYgPDwgIiAgICA8L1RJTUU+XG4iOworCiAgIC8vIFZlcmlmeSB0aGUgcmVsYXRpdmUgZXJyb3IKLSAgaWYocmVmWC5zaXplKCkgIT0gMCkKLSAgICByZWxfZXJyb3IgPSAocmVmWCAtIHgpLm5vcm0oKS9yZWZYLm5vcm0oKTsKLSAgZWxzZSAKLSAgeworICBpZiAocmVmWC5zaXplKCkgIT0gMCkKKyAgICByZWxfZXJyb3IgPSAocmVmWCAtIHgpLm5vcm0oKSAvIHJlZlgubm9ybSgpOworICBlbHNlIHsKICAgICAvLyBDb21wdXRlIHRoZSByZWxhdGl2ZSByZXNpZHVhbCBub3JtCi0gICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gdGVtcDsgCi0gICAgdGVtcCA9IEEgKiB4OyAKLSAgICByZWxfZXJyb3IgPSAoYi10ZW1wKS5ub3JtKCkvYi5ub3JtKCk7CisgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gdGVtcDsKKyAgICB0ZW1wID0gQSAqIHg7CisgICAgcmVsX2Vycm9yID0gKGIgLSB0ZW1wKS5ub3JtKCkgLyBiLm5vcm0oKTsKICAgfQotICBzdGF0YnVmIDw8ICIgICAgPEVSUk9SPiAiIDw8IHJlbF9lcnJvciA8PCAiPC9FUlJPUj5cbiI7IAotICBzdGQ6OmNvdXQ8PCAiUkVMLiBFUlJPUiA6ICIgPDwgcmVsX2Vycm9yIDw8ICJcblxuIiA7Ci0gIGlmICggcmVsX2Vycm9yIDw9IFJlbEVyciApCi0gIHsKKyAgc3RhdGJ1ZiA8PCAiICAgIDxFUlJPUj4gIiA8PCByZWxfZXJyb3IgPDwgIjwvRVJST1I+XG4iOworICBzdGQ6OmNvdXQgPDwgIlJFTC4gRVJST1IgOiAiIDw8IHJlbF9lcnJvciA8PCAiXG5cbiI7CisgIGlmIChyZWxfZXJyb3IgPD0gUmVsRXJyKSB7CiAgICAgLy8gY2hlY2sgdGhlIGJlc3QgdGltZSBpZiBjb252ZXJnZW5jZQotICAgIGlmKCFiZXN0X3RpbWVfdmFsIHx8IChiZXN0X3RpbWVfdmFsID4gdG90YWxfdGltZSkpCi0gICAgeworICAgIGlmICghYmVzdF90aW1lX3ZhbCB8fCAoYmVzdF90aW1lX3ZhbCA+IHRvdGFsX3RpbWUpKSB7CiAgICAgICBiZXN0X3RpbWVfdmFsID0gdG90YWxfdGltZTsKICAgICAgIGJlc3RfdGltZV9pZCA9IHNvbHZlcl9pZDsKICAgICB9CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIGNhbGxfZGlyZWN0c29sdmVyKFNvbHZlciYgc29sdmVyLCBjb25zdCBpbnQgc29sdmVyX2lkLCBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+JiBiLCBjb25zdCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiYgcmVmWCwgc3RkOjpzdHJpbmcmIHN0YXRGaWxlKQotewotICAgIHN0ZDo6b2ZzdHJlYW0gc3RhdGJ1ZihzdGF0RmlsZS5jX3N0cigpLCBzdGQ6Omlvczo6YXBwKTsKLSAgICBzdGF0YnVmIDw8ICIgICA8U09MVkVSX1NUQVQgSUQ9JyIgPDwgc29sdmVyX2lkIDw8Iic+XG4iOyAKLSAgICBjYWxsX3NvbHZlcihzb2x2ZXIsIHNvbHZlcl9pZCwgQSwgYiwgcmVmWCxzdGF0YnVmKTsKLSAgICBzdGF0YnVmIDw8ICIgICA8L1NPTFZFUl9TVEFUPlxuIjsKLSAgICBzdGF0YnVmLmNsb3NlKCk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgU2NhbGFyPgotdm9pZCBjYWxsX2l0ZXJzb2x2ZXIoU29sdmVyICZzb2x2ZXIsIGNvbnN0IGludCBzb2x2ZXJfaWQsIGNvbnN0IHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwgY29uc3QgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4mIGIsIGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+JiByZWZYLCBzdGQ6OnN0cmluZyYgc3RhdEZpbGUpCi17Ci0gIHNvbHZlci5zZXRUb2xlcmFuY2UoUmVsRXJyKTsgCi0gIHNvbHZlci5zZXRNYXhJdGVyYXRpb25zKE1heGltdW1JdGVycyk7Ci0gIAordGVtcGxhdGUgPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgU2NhbGFyPgordm9pZCBjYWxsX2RpcmVjdHNvbHZlcihTb2x2ZXImIHNvbHZlciwgY29uc3QgaW50IHNvbHZlcl9pZCwgY29uc3QgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlJiBBLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiYgYiwgY29uc3QgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4mIHJlZlgsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nJiBzdGF0RmlsZSkgewogICBzdGQ6Om9mc3RyZWFtIHN0YXRidWYoc3RhdEZpbGUuY19zdHIoKSwgc3RkOjppb3M6OmFwcCk7Ci0gIHN0YXRidWYgPDwgIiA8U09MVkVSX1NUQVQgSUQ9JyIgPDwgc29sdmVyX2lkIDw8Iic+XG4iOyAKLSAgY2FsbF9zb2x2ZXIoc29sdmVyLCBzb2x2ZXJfaWQsIEEsIGIsIHJlZlgsc3RhdGJ1Zik7IAotICBzdGF0YnVmIDw8ICIgICA8SVRFUj4gIjw8IHNvbHZlci5pdGVyYXRpb25zKCkgPDwgIjwvSVRFUj5cbiI7Ci0gIHN0YXRidWYgPDwgIiA8L1NPTFZFUl9TVEFUPlxuIjsKLSAgc3RkOjpjb3V0IDw8ICJJVEVSQVRJT05TIDogIiA8PCBzb2x2ZXIuaXRlcmF0aW9ucygpIDw8IlxuXG5cbiI7IAotICAKKyAgc3RhdGJ1ZiA8PCAiICAgPFNPTFZFUl9TVEFUIElEPSciIDw8IHNvbHZlcl9pZCA8PCAiJz5cbiI7CisgIGNhbGxfc29sdmVyKHNvbHZlciwgc29sdmVyX2lkLCBBLCBiLCByZWZYLCBzdGF0YnVmKTsKKyAgc3RhdGJ1ZiA8PCAiICAgPC9TT0xWRVJfU1RBVD5cbiI7CisgIHN0YXRidWYuY2xvc2UoKTsKIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgU2NhbGFyPgordm9pZCBjYWxsX2l0ZXJzb2x2ZXIoU29sdmVyJiBzb2x2ZXIsIGNvbnN0IGludCBzb2x2ZXJfaWQsIGNvbnN0IHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+JiBiLCBjb25zdCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiYgcmVmWCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nJiBzdGF0RmlsZSkgeworICBzb2x2ZXIuc2V0VG9sZXJhbmNlKFJlbEVycik7CisgIHNvbHZlci5zZXRNYXhJdGVyYXRpb25zKE1heGltdW1JdGVycyk7CisKKyAgc3RkOjpvZnN0cmVhbSBzdGF0YnVmKHN0YXRGaWxlLmNfc3RyKCksIHN0ZDo6aW9zOjphcHApOworICBzdGF0YnVmIDw8ICIgPFNPTFZFUl9TVEFUIElEPSciIDw8IHNvbHZlcl9pZCA8PCAiJz5cbiI7CisgIGNhbGxfc29sdmVyKHNvbHZlciwgc29sdmVyX2lkLCBBLCBiLCByZWZYLCBzdGF0YnVmKTsKKyAgc3RhdGJ1ZiA8PCAiICAgPElURVI+ICIgPDwgc29sdmVyLml0ZXJhdGlvbnMoKSA8PCAiPC9JVEVSPlxuIjsKKyAgc3RhdGJ1ZiA8PCAiIDwvU09MVkVSX1NUQVQ+XG4iOworICBzdGQ6OmNvdXQgPDwgIklURVJBVElPTlMgOiAiIDw8IHNvbHZlci5pdGVyYXRpb25zKCkgPDwgIlxuXG5cbiI7Cit9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIFNlbGVjdFNvbHZlcnMoY29uc3QgU3BhcnNlTWF0cml4PFNjYWxhcj4mQSwgdW5zaWduZWQgaW50IHN5bSwgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4mIGIsIGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+JiByZWZYLCBzdGQ6OnN0cmluZyYgc3RhdEZpbGUpCi17Ci0gIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhciwgQ29sTWFqb3I+IFNwTWF0OyAKK3ZvaWQgU2VsZWN0U29sdmVycyhjb25zdCBTcGFyc2VNYXRyaXg8U2NhbGFyPiYgQSwgdW5zaWduZWQgaW50IHN5bSwgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4mIGIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4mIHJlZlgsIHN0ZDo6c3RyaW5nJiBzdGF0RmlsZSkgeworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsIENvbE1ham9yPiBTcE1hdDsKICAgLy8gRmlyc3QsIGRlYWwgd2l0aCBOb25zeW1tZXRyaWMgYW5kIHN5bW1ldHJpYyBtYXRyaWNlcwotICBiZXN0X3RpbWVfaWQgPSAwOyAKKyAgYmVzdF90aW1lX2lkID0gMDsKICAgYmVzdF90aW1lX3ZhbCA9IDAuMDsKLSAgLy9VTUZQQUNLCi0gICNpZmRlZiBFSUdFTl9VTUZQQUNLX1NVUFBPUlQKKy8vIFVNRlBBQ0sKKyNpZmRlZiBFSUdFTl9VTUZQQUNLX1NVUFBPUlQKICAgewotICAgIGNvdXQgPDwgIlNvbHZpbmcgd2l0aCBVTUZQQUNLIExVIC4uLiBcbiI7IAotICAgIFVtZlBhY2tMVTxTcE1hdD4gc29sdmVyOyAKLSAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX1VNRlBBQ0ssIEEsIGIsIHJlZlgsc3RhdEZpbGUpOyAKKyAgICBjb3V0IDw8ICJTb2x2aW5nIHdpdGggVU1GUEFDSyBMVSAuLi4gXG4iOworICAgIFVtZlBhY2tMVTxTcE1hdD4gc29sdmVyOworICAgIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgRUlHRU5fVU1GUEFDSywgQSwgYiwgcmVmWCwgc3RhdEZpbGUpOwogICB9Ci0gICNlbmRpZgotICAvL0tMVQotICAjaWZkZWYgRUlHRU5fS0xVX1NVUFBPUlQKKyNlbmRpZgorLy8gS0xVCisjaWZkZWYgRUlHRU5fS0xVX1NVUFBPUlQKICAgewogICAgIGNvdXQgPDwgIlNvbHZpbmcgd2l0aCBLTFUgTFUgLi4uIFxuIjsKICAgICBLTFU8U3BNYXQ+IHNvbHZlcjsKLSAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX0tMVSwgQSwgYiwgcmVmWCxzdGF0RmlsZSk7CisgICAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLCBFSUdFTl9LTFUsIEEsIGIsIHJlZlgsIHN0YXRGaWxlKTsKICAgfQotICAjZW5kaWYKLSAgICAvL1N1cGVyTFUKLSAgI2lmZGVmIEVJR0VOX1NVUEVSTFVfU1VQUE9SVAorI2VuZGlmCisgIC8vIFN1cGVyTFUKKyNpZmRlZiBFSUdFTl9TVVBFUkxVX1NVUFBPUlQKICAgewotICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFNVUEVSTFUgLi4uIFxuIjsgCisgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggU1VQRVJMVSAuLi4gXG4iOwogICAgIFN1cGVyTFU8U3BNYXQ+IHNvbHZlcjsKLSAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX1NVUEVSTFUsIEEsIGIsIHJlZlgsc3RhdEZpbGUpOyAKKyAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX1NVUEVSTFUsIEEsIGIsIHJlZlgsIHN0YXRGaWxlKTsKICAgfQotICAjZW5kaWYKLSAgICAKLSAgIC8vIFBhU3RpeCBMVQotICAjaWZkZWYgRUlHRU5fUEFTVElYX1NVUFBPUlQKLSAgewotICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFBBU1RJWCBMVSAuLi4gXG4iOyAKLSAgICBQYXN0aXhMVTxTcE1hdD4gc29sdmVyOyAKLSAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX1BBU1RJWCwgQSwgYiwgcmVmWCxzdGF0RmlsZSkgOwotICB9Ci0gICNlbmRpZgorI2VuZGlmCiAKLSAgIC8vUEFSRElTTyBMVQotICAjaWZkZWYgRUlHRU5fUEFSRElTT19TVVBQT1JUCisgIC8vIFBhU3RpeCBMVQorI2lmZGVmIEVJR0VOX1BBU1RJWF9TVVBQT1JUCiAgIHsKLSAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBQQVJESVNPIExVIC4uLiBcbiI7IAotICAgIFBhcmRpc29MVTxTcE1hdD4gIHNvbHZlcjsgCi0gICAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLCBFSUdFTl9QQVJESVNPLCBBLCBiLCByZWZYLHN0YXRGaWxlKTsKKyAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBQQVNUSVggTFUgLi4uIFxuIjsKKyAgICBQYXN0aXhMVTxTcE1hdD4gc29sdmVyOworICAgIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgRUlHRU5fUEFTVElYLCBBLCBiLCByZWZYLCBzdGF0RmlsZSk7CiAgIH0KLSAgI2VuZGlmCi0gIAorI2VuZGlmCisKKyAgLy8gUEFSRElTTyBMVQorI2lmZGVmIEVJR0VOX1BBUkRJU09fU1VQUE9SVAorICB7CisgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggUEFSRElTTyBMVSAuLi4gXG4iOworICAgIFBhcmRpc29MVTxTcE1hdD4gc29sdmVyOworICAgIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgRUlHRU5fUEFSRElTTywgQSwgYiwgcmVmWCwgc3RhdEZpbGUpOworICB9CisjZW5kaWYKKwogICAvLyBFaWdlbiBTcGFyc2VMVSBNRVRJUwogICBjb3V0IDw8ICJcbiBTb2x2aW5nIHdpdGggU3BhcnNlIExVIEFORCBDT0xBTUQgLi4uIFxuIjsKLSAgU3BhcnNlTFU8U3BNYXQsIENPTEFNRE9yZGVyaW5nPGludD4gPiAgIHNvbHZlcjsKLSAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLCBFSUdFTl9TUEFSU0VMVV9DT0xBTUQsIEEsIGIsIHJlZlgsIHN0YXRGaWxlKTsgCi0gIC8vIEVpZ2VuIFNwYXJzZUxVIE1FVElTCi0gICNpZmRlZiBFSUdFTl9NRVRJU19TVVBQT1JUCisgIFNwYXJzZUxVPFNwTWF0LCBDT0xBTURPcmRlcmluZzxpbnQ+ID4gc29sdmVyOworICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX1NQQVJTRUxVX0NPTEFNRCwgQSwgYiwgcmVmWCwgc3RhdEZpbGUpOworLy8gRWlnZW4gU3BhcnNlTFUgTUVUSVMKKyNpZmRlZiBFSUdFTl9NRVRJU19TVVBQT1JUCiAgIHsKICAgICBjb3V0IDw8ICJcbiBTb2x2aW5nIHdpdGggU3BhcnNlIExVIEFORCBNRVRJUyAuLi4gXG4iOwotICAgIFNwYXJzZUxVPFNwTWF0LCBNZXRpc09yZGVyaW5nPGludD4gPiAgIHNvbHZlcjsKLSAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX1NQQVJTRUxVX01FVElTLCBBLCBiLCByZWZYLCBzdGF0RmlsZSk7IAorICAgIFNwYXJzZUxVPFNwTWF0LCBNZXRpc09yZGVyaW5nPGludD4gPiBzb2x2ZXI7CisgICAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLCBFSUdFTl9TUEFSU0VMVV9NRVRJUywgQSwgYiwgcmVmWCwgc3RhdEZpbGUpOwogICB9Ci0gICNlbmRpZgotICAKLSAgLy9CaUNHU1RBQgorI2VuZGlmCisKKyAgLy8gQmlDR1NUQUIKICAgewotICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIEJpQ0dTVEFCIC4uLiBcbiI7IAotICAgIEJpQ0dTVEFCPFNwTWF0PiBzb2x2ZXI7IAotICAgIGNhbGxfaXRlcnNvbHZlcihzb2x2ZXIsIEVJR0VOX0JJQ0dTVEFCLCBBLCBiLCByZWZYLHN0YXRGaWxlKTsKKyAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBCaUNHU1RBQiAuLi4gXG4iOworICAgIEJpQ0dTVEFCPFNwTWF0PiBzb2x2ZXI7CisgICAgY2FsbF9pdGVyc29sdmVyKHNvbHZlciwgRUlHRU5fQklDR1NUQUIsIEEsIGIsIHJlZlgsIHN0YXRGaWxlKTsKICAgfQotICAvL0JpQ0dTVEFCK0lMVVQKKyAgLy8gQmlDR1NUQUIrSUxVVAogICB7Ci0gICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQmlDR1NUQUIgYW5kIElMVVQgLi4uIFxuIjsgCi0gICAgQmlDR1NUQUI8U3BNYXQsIEluY29tcGxldGVMVVQ8U2NhbGFyPiA+IHNvbHZlcjsgCi0gICAgY2FsbF9pdGVyc29sdmVyKHNvbHZlciwgRUlHRU5fQklDR1NUQUJfSUxVVCwgQSwgYiwgcmVmWCxzdGF0RmlsZSk7IAorICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIEJpQ0dTVEFCIGFuZCBJTFVUIC4uLiBcbiI7CisgICAgQmlDR1NUQUI8U3BNYXQsIEluY29tcGxldGVMVVQ8U2NhbGFyPiA+IHNvbHZlcjsKKyAgICBjYWxsX2l0ZXJzb2x2ZXIoc29sdmVyLCBFSUdFTl9CSUNHU1RBQl9JTFVULCBBLCBiLCByZWZYLCBzdGF0RmlsZSk7CiAgIH0KLSAgCi0gICAKLSAgLy9HTVJFUwotLy8gICB7Ci0vLyAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggR01SRVMgLi4uIFxuIjsgCi0vLyAgICAgR01SRVM8U3BNYXQ+IHNvbHZlcjsgCi0vLyAgICAgY2FsbF9pdGVyc29sdmVyKHNvbHZlciwgRUlHRU5fR01SRVMsIEEsIGIsIHJlZlgsc3RhdEZpbGUpOyAKLS8vICAgfQotICAvL0dNUkVTK0lMVVQKKworICAvLyBHTVJFUworICAvLyAgIHsKKyAgLy8gICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIEdNUkVTIC4uLiBcbiI7CisgIC8vICAgICBHTVJFUzxTcE1hdD4gc29sdmVyOworICAvLyAgICAgY2FsbF9pdGVyc29sdmVyKHNvbHZlciwgRUlHRU5fR01SRVMsIEEsIGIsIHJlZlgsc3RhdEZpbGUpOworICAvLyAgIH0KKyAgLy8gR01SRVMrSUxVVAogICB7Ci0gICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggR01SRVMgYW5kIElMVVQgLi4uIFxuIjsgCi0gICAgR01SRVM8U3BNYXQsIEluY29tcGxldGVMVVQ8U2NhbGFyPiA+IHNvbHZlcjsgCi0gICAgY2FsbF9pdGVyc29sdmVyKHNvbHZlciwgRUlHRU5fR01SRVNfSUxVVCwgQSwgYiwgcmVmWCxzdGF0RmlsZSk7CisgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggR01SRVMgYW5kIElMVVQgLi4uIFxuIjsKKyAgICBHTVJFUzxTcE1hdCwgSW5jb21wbGV0ZUxVVDxTY2FsYXI+ID4gc29sdmVyOworICAgIGNhbGxfaXRlcnNvbHZlcihzb2x2ZXIsIEVJR0VOX0dNUkVTX0lMVVQsIEEsIGIsIHJlZlgsIHN0YXRGaWxlKTsKICAgfQotICAKKwogICAvLyBIZXJtaXRpYW4gYW5kIG5vdCBuZWNlc3NhcmlseSBwb3NpdGl2ZS1kZWZpbml0ZXMKLSAgaWYgKHN5bSAhPSBOb25TeW1tZXRyaWMpCi0gIHsKKyAgaWYgKHN5bSAhPSBOb25TeW1tZXRyaWMpIHsKICAgICAvLyBJbnRlcm5hbCBDaG9sZXNreQogICAgIHsKLSAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFNpbXBsaWNpYWwgTERMVCAuLi4gXG4iOyAKKyAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFNpbXBsaWNpYWwgTERMVCAuLi4gXG4iOwogICAgICAgU2ltcGxpY2lhbExETFQ8U3BNYXQsIExvd2VyPiBzb2x2ZXI7Ci0gICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX1NJTVBMSUNJQUxfTERMVCwgQSwgYiwgcmVmWCxzdGF0RmlsZSk7IAorICAgICAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLCBFSUdFTl9TSU1QTElDSUFMX0xETFQsIEEsIGIsIHJlZlgsIHN0YXRGaWxlKTsKICAgICB9Ci0gICAgCi0gICAgLy8gQ0hPTE1PRAotICAgICNpZmRlZiBFSUdFTl9DSE9MTU9EX1NVUFBPUlQKKworLy8gQ0hPTE1PRAorI2lmZGVmIEVJR0VOX0NIT0xNT0RfU1VQUE9SVAogICAgIHsKLSAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIENIT0xNT0QgTERMVCAuLi4gXG4iOyAKKyAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIENIT0xNT0QgTERMVCAuLi4gXG4iOwogICAgICAgQ2hvbG1vZERlY29tcG9zaXRpb248U3BNYXQsIExvd2VyPiBzb2x2ZXI7CiAgICAgICBzb2x2ZXIuc2V0TW9kZShDaG9sbW9kTERMdCk7Ci0gICAgICAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLEVJR0VOX0NIT0xNT0RfTERMVCwgQSwgYiwgcmVmWCxzdGF0RmlsZSk7CisgICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX0NIT0xNT0RfTERMVCwgQSwgYiwgcmVmWCwgc3RhdEZpbGUpOwogICAgIH0KLSAgICAjZW5kaWYKLSAgICAKLSAgICAvL1BBU1RJWCBMTFQKLSAgICAjaWZkZWYgRUlHRU5fUEFTVElYX1NVUFBPUlQKKyNlbmRpZgorCisvLyBQQVNUSVggTExUCisjaWZkZWYgRUlHRU5fUEFTVElYX1NVUFBPUlQKICAgICB7Ci0gICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBQQVNUSVggTERMVCAuLi4gXG4iOyAKLSAgICAgIFBhc3RpeExETFQ8U3BNYXQsIExvd2VyPiBzb2x2ZXI7IAotICAgICAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLEVJR0VOX1BBU1RJWF9MRExULCBBLCBiLCByZWZYLHN0YXRGaWxlKTsgCisgICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBQQVNUSVggTERMVCAuLi4gXG4iOworICAgICAgUGFzdGl4TERMVDxTcE1hdCwgTG93ZXI+IHNvbHZlcjsKKyAgICAgIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgRUlHRU5fUEFTVElYX0xETFQsIEEsIGIsIHJlZlgsIHN0YXRGaWxlKTsKICAgICB9Ci0gICAgI2VuZGlmCi0gICAgCi0gICAgLy9QQVJESVNPIExMVAotICAgICNpZmRlZiBFSUdFTl9QQVJESVNPX1NVUFBPUlQKKyNlbmRpZgorCisvLyBQQVJESVNPIExMVAorI2lmZGVmIEVJR0VOX1BBUkRJU09fU1VQUE9SVAogICAgIHsKLSAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFBBUkRJU08gTERMVCAuLi4gXG4iOyAKLSAgICAgIFBhcmRpc29MRExUPFNwTWF0LCBMb3dlcj4gc29sdmVyOyAKLSAgICAgIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlcixFSUdFTl9QQVJESVNPX0xETFQsIEEsIGIsIHJlZlgsc3RhdEZpbGUpOyAKKyAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFBBUkRJU08gTERMVCAuLi4gXG4iOworICAgICAgUGFyZGlzb0xETFQ8U3BNYXQsIExvd2VyPiBzb2x2ZXI7CisgICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX1BBUkRJU09fTERMVCwgQSwgYiwgcmVmWCwgc3RhdEZpbGUpOwogICAgIH0KLSAgICAjZW5kaWYKKyNlbmRpZgogICB9CiAKLSAgIC8vIE5vdywgc3ltbWV0cmljIFBPU0lUSVZFIERFRklOSVRFIG1hdHJpY2VzCi0gIGlmIChzeW0gPT0gU1BEKQotICB7Ci0gICAgCi0gICAgLy9JbnRlcm5hbCBTcGFyc2UgQ2hvbGVza3kKKyAgLy8gTm93LCBzeW1tZXRyaWMgUE9TSVRJVkUgREVGSU5JVEUgbWF0cmljZXMKKyAgaWYgKHN5bSA9PSBTUEQpIHsKKyAgICAvLyBJbnRlcm5hbCBTcGFyc2UgQ2hvbGVza3kKICAgICB7Ci0gICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBTSU1QTElDSUFMIExMVCAuLi4gXG4iOyAKLSAgICAgIFNpbXBsaWNpYWxMTFQ8U3BNYXQsIExvd2VyPiBzb2x2ZXI7IAotICAgICAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLEVJR0VOX1NJTVBMSUNJQUxfTExULCBBLCBiLCByZWZYLHN0YXRGaWxlKTsgCisgICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBTSU1QTElDSUFMIExMVCAuLi4gXG4iOworICAgICAgU2ltcGxpY2lhbExMVDxTcE1hdCwgTG93ZXI+IHNvbHZlcjsKKyAgICAgIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgRUlHRU5fU0lNUExJQ0lBTF9MTFQsIEEsIGIsIHJlZlgsIHN0YXRGaWxlKTsKICAgICB9Ci0gICAgCi0gICAgLy8gQ0hPTE1PRAotICAgICNpZmRlZiBFSUdFTl9DSE9MTU9EX1NVUFBPUlQKKworLy8gQ0hPTE1PRAorI2lmZGVmIEVJR0VOX0NIT0xNT0RfU1VQUE9SVAogICAgIHsKICAgICAgIC8vIENob2xNT0QgU3VwZXJOb2RhbCBMTFQKLSAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIENIT0xNT0QgTExUIChTdXBlcm5vZGFsKS4uLiBcbiI7IAorICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQ0hPTE1PRCBMTFQgKFN1cGVybm9kYWwpLi4uIFxuIjsKICAgICAgIENob2xtb2REZWNvbXBvc2l0aW9uPFNwTWF0LCBMb3dlcj4gc29sdmVyOwogICAgICAgc29sdmVyLnNldE1vZGUoQ2hvbG1vZFN1cGVybm9kYWxMTHQpOwotICAgICAgIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlcixFSUdFTl9DSE9MTU9EX1NVUEVSTk9EQUxfTExULCBBLCBiLCByZWZYLHN0YXRGaWxlKTsKKyAgICAgIGNhbGxfZGlyZWN0c29sdmVyKHNvbHZlciwgRUlHRU5fQ0hPTE1PRF9TVVBFUk5PREFMX0xMVCwgQSwgYiwgcmVmWCwgc3RhdEZpbGUpOwogICAgICAgLy8gQ2hvbE1vZCBTaW1wbGljaWFsIExMVAotICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQ0hPTE1PRCBMTFQgKFNpbXBsaWNpYWwpIC4uLiBcbiI7IAorICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQ0hPTE1PRCBMTFQgKFNpbXBsaWNpYWwpIC4uLiBcbiI7CiAgICAgICBzb2x2ZXIuc2V0TW9kZShDaG9sbW9kU2ltcGxpY2lhbExMdCk7Ci0gICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsRUlHRU5fQ0hPTE1PRF9TSU1QTElDSUFMX0xMVCwgQSwgYiwgcmVmWCxzdGF0RmlsZSk7CisgICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX0NIT0xNT0RfU0lNUExJQ0lBTF9MTFQsIEEsIGIsIHJlZlgsIHN0YXRGaWxlKTsKICAgICB9Ci0gICAgI2VuZGlmCi0gICAgCi0gICAgLy9QQVNUSVggTExUCi0gICAgI2lmZGVmIEVJR0VOX1BBU1RJWF9TVVBQT1JUCisjZW5kaWYKKworLy8gUEFTVElYIExMVAorI2lmZGVmIEVJR0VOX1BBU1RJWF9TVVBQT1JUCiAgICAgewotICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggUEFTVElYIExMVCAuLi4gXG4iOyAKLSAgICAgIFBhc3RpeExMVDxTcE1hdCwgTG93ZXI+IHNvbHZlcjsgCi0gICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsRUlHRU5fUEFTVElYX0xMVCwgQSwgYiwgcmVmWCxzdGF0RmlsZSk7CisgICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBQQVNUSVggTExUIC4uLiBcbiI7CisgICAgICBQYXN0aXhMTFQ8U3BNYXQsIExvd2VyPiBzb2x2ZXI7CisgICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsIEVJR0VOX1BBU1RJWF9MTFQsIEEsIGIsIHJlZlgsIHN0YXRGaWxlKTsKICAgICB9Ci0gICAgI2VuZGlmCi0gICAgCi0gICAgLy9QQVJESVNPIExMVAotICAgICNpZmRlZiBFSUdFTl9QQVJESVNPX1NVUFBPUlQKKyNlbmRpZgorCisvLyBQQVJESVNPIExMVAorI2lmZGVmIEVJR0VOX1BBUkRJU09fU1VQUE9SVAogICAgIHsKLSAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFBBUkRJU08gTExUIC4uLiBcbiI7IAotICAgICAgUGFyZGlzb0xMVDxTcE1hdCwgTG93ZXI+IHNvbHZlcjsgCi0gICAgICBjYWxsX2RpcmVjdHNvbHZlcihzb2x2ZXIsRUlHRU5fUEFSRElTT19MTFQsIEEsIGIsIHJlZlgsc3RhdEZpbGUpOyAKKyAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIFBBUkRJU08gTExUIC4uLiBcbiI7CisgICAgICBQYXJkaXNvTExUPFNwTWF0LCBMb3dlcj4gc29sdmVyOworICAgICAgY2FsbF9kaXJlY3Rzb2x2ZXIoc29sdmVyLCBFSUdFTl9QQVJESVNPX0xMVCwgQSwgYiwgcmVmWCwgc3RhdEZpbGUpOwogICAgIH0KLSAgICAjZW5kaWYKLSAgICAKKyNlbmRpZgorCiAgICAgLy8gSW50ZXJuYWwgQ0cKICAgICB7Ci0gICAgICBjb3V0IDw8ICJcblNvbHZpbmcgd2l0aCBDRyAuLi4gXG4iOyAKLSAgICAgIENvbmp1Z2F0ZUdyYWRpZW50PFNwTWF0LCBMb3dlcj4gc29sdmVyOyAKLSAgICAgIGNhbGxfaXRlcnNvbHZlcihzb2x2ZXIsRUlHRU5fQ0csIEEsIGIsIHJlZlgsc3RhdEZpbGUpOworICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQ0cgLi4uIFxuIjsKKyAgICAgIENvbmp1Z2F0ZUdyYWRpZW50PFNwTWF0LCBMb3dlcj4gc29sdmVyOworICAgICAgY2FsbF9pdGVyc29sdmVyKHNvbHZlciwgRUlHRU5fQ0csIEEsIGIsIHJlZlgsIHN0YXRGaWxlKTsKICAgICB9Ci0gICAgLy9DRytJZGVudGl0eVByZWNvbmRpdGlvbmVyCi0vLyAgICAgewotLy8gICAgICAgY291dCA8PCAiXG5Tb2x2aW5nIHdpdGggQ0cgYW5kIElkZW50aXR5UHJlY29uZGl0aW9uZXIgLi4uIFxuIjsgCi0vLyAgICAgICBDb25qdWdhdGVHcmFkaWVudDxTcE1hdCwgTG93ZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXI+IHNvbHZlcjsgCi0vLyAgICAgICBjYWxsX2l0ZXJzb2x2ZXIoc29sdmVyLEVJR0VOX0NHX1BSRUNPTkQsIEEsIGIsIHJlZlgsc3RhdEZpbGUpOwotLy8gICAgIH0KLSAgfSAvLyBFbmQgU1BEIG1hdHJpY2VzIAorICAgIC8vIENHK0lkZW50aXR5UHJlY29uZGl0aW9uZXIKKyAgICAvLyAgICAgeworICAgIC8vICAgICAgIGNvdXQgPDwgIlxuU29sdmluZyB3aXRoIENHIGFuZCBJZGVudGl0eVByZWNvbmRpdGlvbmVyIC4uLiBcbiI7CisgICAgLy8gICAgICAgQ29uanVnYXRlR3JhZGllbnQ8U3BNYXQsIExvd2VyLCBJZGVudGl0eVByZWNvbmRpdGlvbmVyPiBzb2x2ZXI7CisgICAgLy8gICAgICAgY2FsbF9pdGVyc29sdmVyKHNvbHZlcixFSUdFTl9DR19QUkVDT05ELCBBLCBiLCByZWZYLHN0YXRGaWxlKTsKKyAgICAvLyAgICAgfQorICB9ICAvLyBFbmQgU1BEIG1hdHJpY2VzCiB9CiAKLS8qIEJyb3dzZSBhbGwgdGhlIG1hdHJpY2VzIGF2YWlsYWJsZSBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciAKKy8qIEJyb3dzZSBhbGwgdGhlIG1hdHJpY2VzIGF2YWlsYWJsZSBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlcgogICogYW5kIHNvbHZlIHRoZSBhc3NvY2lhdGVkIGxpbmVhciBzeXN0ZW0uCiAgKiBUaGUgcmVzdWx0cyBvZiBlYWNoIHNvbHZlIGFyZSBwcmludGVkIGluIHRoZSBzdGFuZGFyZCBvdXRwdXQKICAqIGFuZCBvcHRpb25hbGx5IGluIHRoZSBwcm92aWRlZCBodG1sIGZpbGUKICAqLwogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KLXZvaWQgQnJvd3NlX01hdHJpY2VzKGNvbnN0IHN0cmluZyBmb2xkZXIsIGJvb2wgc3RhdEZpbGVFeGlzdHMsIHN0ZDo6c3RyaW5nJiBzdGF0RmlsZSwgaW50IG1heGl0ZXJzLCBkb3VibGUgdG9sKQotewotICBNYXhpbXVtSXRlcnMgPSBtYXhpdGVyczsgLy8gTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucywgZ2xvYmFsIHZhcmlhYmxlIAotICBSZWxFcnIgPSB0b2w7ICAvL1JlbGF0aXZlIHJlc2lkdWFsIGVycm9yICBhcyBzdG9wcGluZyBjcml0ZXJpb24gZm9yIGl0ZXJhdGl2ZSBzb2x2ZXJzCit2b2lkIEJyb3dzZV9NYXRyaWNlcyhjb25zdCBzdHJpbmcgZm9sZGVyLCBib29sIHN0YXRGaWxlRXhpc3RzLCBzdGQ6OnN0cmluZyYgc3RhdEZpbGUsIGludCBtYXhpdGVycywgZG91YmxlIHRvbCkgeworICBNYXhpbXVtSXRlcnMgPSBtYXhpdGVyczsgIC8vIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMsIGdsb2JhbCB2YXJpYWJsZQorICBSZWxFcnIgPSB0b2w7ICAgICAgICAgICAgIC8vIFJlbGF0aXZlIHJlc2lkdWFsIGVycm9yICBhcyBzdG9wcGluZyBjcml0ZXJpb24gZm9yIGl0ZXJhdGl2ZSBzb2x2ZXJzCiAgIE1hdHJpeE1hcmtldEl0ZXJhdG9yPFNjYWxhcj4gaXQoZm9sZGVyKTsKLSAgZm9yICggOyBpdDsgKytpdCkKLSAgewotICAgIC8vcHJpbnQgdGhlIGluZm9zIGZvciB0aGlzIGxpbmVhciBzeXN0ZW0gCi0gICAgaWYoc3RhdEZpbGVFeGlzdHMpCi0gICAgeworICBmb3IgKDsgaXQ7ICsraXQpIHsKKyAgICAvLyBwcmludCB0aGUgaW5mb3MgZm9yIHRoaXMgbGluZWFyIHN5c3RlbQorICAgIGlmIChzdGF0RmlsZUV4aXN0cykgewogICAgICAgc3RkOjpvZnN0cmVhbSBzdGF0YnVmKHN0YXRGaWxlLmNfc3RyKCksIHN0ZDo6aW9zOjphcHApOwogICAgICAgc3RhdGJ1ZiA8PCAiPExJTkVBUlNZU1RFTT4gXG4iOwogICAgICAgc3RhdGJ1ZiA8PCAiICAgPE1BVFJJWD4gXG4iOwotICAgICAgc3RhdGJ1ZiA8PCAiICAgICA8TkFNRT4gIiA8PCBpdC5tYXRuYW1lKCkgPDwgIiA8L05BTUU+XG4iOyAKLSAgICAgIHN0YXRidWYgPDwgIiAgICAgPFNJWkU+ICIgPDwgaXQubWF0cml4KCkucm93cygpIDw8ICIgPC9TSVpFPlxuIjsgCisgICAgICBzdGF0YnVmIDw8ICIgICAgIDxOQU1FPiAiIDw8IGl0Lm1hdG5hbWUoKSA8PCAiIDwvTkFNRT5cbiI7CisgICAgICBzdGF0YnVmIDw8ICIgICAgIDxTSVpFPiAiIDw8IGl0Lm1hdHJpeCgpLnJvd3MoKSA8PCAiIDwvU0laRT5cbiI7CiAgICAgICBzdGF0YnVmIDw8ICIgICAgIDxFTlRSSUVTPiAiIDw8IGl0Lm1hdHJpeCgpLm5vblplcm9zKCkgPDwgIjwvRU5UUklFUz5cbiI7Ci0gICAgICBpZiAoaXQuc3ltKCkhPU5vblN5bW1ldHJpYykKLSAgICAgIHsKLSAgICAgICAgc3RhdGJ1ZiA8PCAiICAgICA8U1lNTUVUUlk+IFN5bW1ldHJpYyA8L1NZTU1FVFJZPlxuIiA7IAotICAgICAgICBpZiAoaXQuc3ltKCkgPT0gU1BEKSAKLSAgICAgICAgICBzdGF0YnVmIDw8ICIgICAgIDxQT1NERUY+IFlFUyA8L1BPU0RFRj5cbiI7IAotICAgICAgICBlbHNlIAotICAgICAgICAgIHN0YXRidWYgPDwgIiAgICAgPFBPU0RFRj4gTk8gPC9QT1NERUY+XG4iOyAKLSAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3RhdGJ1ZiA8PCAiICAgICA8U1lNTUVUUlk+IE5vblN5bW1ldHJpYyA8L1NZTU1FVFJZPlxuIiA7IAotICAgICAgICBzdGF0YnVmIDw8ICIgICAgIDxQT1NERUY+IE5PIDwvUE9TREVGPlxuIjsgCisgICAgICBpZiAoaXQuc3ltKCkgIT0gTm9uU3ltbWV0cmljKSB7CisgICAgICAgIHN0YXRidWYgPDwgIiAgICAgPFNZTU1FVFJZPiBTeW1tZXRyaWMgPC9TWU1NRVRSWT5cbiI7CisgICAgICAgIGlmIChpdC5zeW0oKSA9PSBTUEQpCisgICAgICAgICAgc3RhdGJ1ZiA8PCAiICAgICA8UE9TREVGPiBZRVMgPC9QT1NERUY+XG4iOworICAgICAgICBlbHNlCisgICAgICAgICAgc3RhdGJ1ZiA8PCAiICAgICA8UE9TREVGPiBOTyA8L1BPU0RFRj5cbiI7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXRidWYgPDwgIiAgICAgPFNZTU1FVFJZPiBOb25TeW1tZXRyaWMgPC9TWU1NRVRSWT5cbiI7CisgICAgICAgIHN0YXRidWYgPDwgIiAgICAgPFBPU0RFRj4gTk8gPC9QT1NERUY+XG4iOwogICAgICAgfQogICAgICAgc3RhdGJ1ZiA8PCAiICAgPC9NQVRSSVg+IFxuIjsKICAgICAgIHN0YXRidWYuY2xvc2UoKTsKICAgICB9Ci0gICAgCi0gICAgY291dDw8ICJcblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gXG4iOwotICAgIGNvdXQ8PCAiID09PT09PSAgU09MVklORyBXSVRIIE1BVFJJWCAiIDw8IGl0Lm1hdG5hbWUoKSA8PCAiID09PT1cbiI7Ci0gICAgY291dDw8ICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFxuXG4iOworCisgICAgY291dCA8PCAiXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFxuIjsKKyAgICBjb3V0IDw8ICIgPT09PT09ICBTT0xWSU5HIFdJVEggTUFUUklYICIgPDwgaXQubWF0bmFtZSgpIDw8ICIgPT09PVxuIjsKKyAgICBjb3V0IDw8ICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFxuXG4iOwogICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IHJlZlg7Ci0gICAgaWYoaXQuaGFzcmVmWCgpKSByZWZYID0gaXQucmVmWCgpOwotICAgIC8vIENhbGwgYWxsIHN1aXRhYmxlIHNvbHZlcnMgZm9yIHRoaXMgbGluZWFyIHN5c3RlbSAKKyAgICBpZiAoaXQuaGFzcmVmWCgpKSByZWZYID0gaXQucmVmWCgpOworICAgIC8vIENhbGwgYWxsIHN1aXRhYmxlIHNvbHZlcnMgZm9yIHRoaXMgbGluZWFyIHN5c3RlbQogICAgIFNlbGVjdFNvbHZlcnM8U2NhbGFyPihpdC5tYXRyaXgoKSwgaXQuc3ltKCksIGl0LnJocygpLCByZWZYLCBzdGF0RmlsZSk7Ci0gICAgCi0gICAgaWYoc3RhdEZpbGVFeGlzdHMpCi0gICAgeworCisgICAgaWYgKHN0YXRGaWxlRXhpc3RzKSB7CiAgICAgICBzdGQ6Om9mc3RyZWFtIHN0YXRidWYoc3RhdEZpbGUuY19zdHIoKSwgc3RkOjppb3M6OmFwcCk7Ci0gICAgICBzdGF0YnVmIDw8ICIgIDxCRVNUX1NPTFZFUiBJRD0nIjw8IGJlc3RfdGltZV9pZAotICAgICAgICAgICAgICA8PCAiJz48L0JFU1RfU09MVkVSPlxuIjsgCi0gICAgICBzdGF0YnVmIDw8ICIgPC9MSU5FQVJTWVNURU0+IFxuIjsgCisgICAgICBzdGF0YnVmIDw8ICIgIDxCRVNUX1NPTFZFUiBJRD0nIiA8PCBiZXN0X3RpbWVfaWQgPDwgIic+PC9CRVNUX1NPTFZFUj5cbiI7CisgICAgICBzdGF0YnVmIDw8ICIgPC9MSU5FQVJTWVNURU0+IFxuIjsKICAgICAgIHN0YXRidWYuY2xvc2UoKTsKICAgICB9Ci0gIH0gCi19IAotCi1ib29sIGdldF9vcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJncywgc3RyaW5nIG9wdGlvbiwgc3RyaW5nKiB2YWx1ZT0wKQotewotICBpbnQgaWR4ID0gMSwgZm91bmQ9ZmFsc2U7IAotICB3aGlsZSAoaWR4PGFyZ2MgJiYgIWZvdW5kKXsKLSAgICBpZiAob3B0aW9uLmNvbXBhcmUoYXJnc1tpZHhdKSA9PSAwKXsKLSAgICAgIGZvdW5kID0gdHJ1ZTsgCi0gICAgICBpZih2YWx1ZSkgKnZhbHVlID0gYXJnc1tpZHgrMV07Ci0gICAgfQotICAgIGlkeCs9MjsKICAgfQotICByZXR1cm4gZm91bmQ7IAorfQorCitib29sIGdldF9vcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJncywgc3RyaW5nIG9wdGlvbiwgc3RyaW5nKiB2YWx1ZSA9IDApIHsKKyAgaW50IGlkeCA9IDEsIGZvdW5kID0gZmFsc2U7CisgIHdoaWxlIChpZHggPCBhcmdjICYmICFmb3VuZCkgeworICAgIGlmIChvcHRpb24uY29tcGFyZShhcmdzW2lkeF0pID09IDApIHsKKyAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgIGlmICh2YWx1ZSkgKnZhbHVlID0gYXJnc1tpZHggKyAxXTsKKyAgICB9CisgICAgaWR4ICs9IDI7CisgIH0KKyAgcmV0dXJuIGZvdW5kOwogfQpkaWZmIC0tZ2l0IGEvYmVuY2gvc3BiZW5jaC9zcGJlbmNoc3R5bGUuaCBiL2JlbmNoL3NwYmVuY2gvc3BiZW5jaHN0eWxlLmgKaW5kZXggZjZhOTgxNy4uM2Y1MTQwMiAxMDA2NDQKLS0tIGEvYmVuY2gvc3BiZW5jaC9zcGJlbmNoc3R5bGUuaAorKysgYi9iZW5jaC9zcGJlbmNoL3NwYmVuY2hzdHlsZS5oCkBAIC0xMCw4ICsxMCw3IEBACiAjaWZuZGVmIFNQQkVOQ0hTVFlMRV9ICiAjZGVmaW5lIFNQQkVOQ0hTVFlMRV9ICiAKLXZvaWQgcHJpbnRCZW5jaFN0eWxlKHN0ZDo6b2ZzdHJlYW0mIG91dCkKLXsKK3ZvaWQgcHJpbnRCZW5jaFN0eWxlKHN0ZDo6b2ZzdHJlYW0mIG91dCkgewogICBvdXQgPDwgIjx4c2w6c3R5bGVzaGVldCBpZD0nc3R5bGVzaGVldCcgdmVyc2lvbj0nMS4wJyBcCiAgICAgICB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybScgPlxuIFwKICAgICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9J3hzbDpzdHlsZXNoZWV0JyAvPlxuIFwKQEAgLTIzLDcgKzIyLDcgQEAKICAgICAgICAgICA8L3N0eWxlPlxuIFwKICAgICAgICAgPC9oZWFkPlxuIFwKICAgICAgICAgPGJvZHk+IjsKLSAgb3V0PDwiPHRhYmxlIGJvcmRlcj0nMScgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJSc+XG4gXAorICBvdXQgPDwgIjx0YWJsZSBib3JkZXI9JzEnIHdpZHRoPScxMDAlJyBoZWlnaHQ9JzEwMCUnPlxuIFwKICAgICAgICAgPFRSPiA8IS0tIFdyaXRlIHRoZSB0YWJsZSBoZWFkZXIgLS0+XG4gXAogICAgICAgICA8VEg+TWF0cml4PC9USD4gPFRIPk48L1RIPiA8VEg+IE5OWjwvVEg+ICA8VEg+IFN5bTwvVEg+ICA8VEg+IFNQRDwvVEg+IDxUSD4gPC9USD5cbiBcCiAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9J0JFTkNIL0FWQUlMU09MVkVSL1NPTFZFUic+XG4gXApAQCAtMzYsOCArMzUsOCBAQAogICAgICAgICAgICAgPC9USD5cbiBcCiAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+XG4gXAogICAgICAgICA8L1RSPiI7Ci0gICAgICAgIAotICBvdXQ8PCIgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSdCRU5DSC9MSU5FQVJTWVNURU0nPlxuIFwKKworICBvdXQgPDwgIiAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9J0JFTkNIL0xJTkVBUlNZU1RFTSc+XG4gXAogICAgICAgICAgIDxUUj4gPCEtLSBwcmludCBzdGF0aXN0aWNzIGZvciBvbmUgbGluZWFyIHN5c3RlbS0tPlxuIFwKICAgICAgICAgICAgIDxUSCByb3dzcGFuPSc0Jz4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J01BVFJJWC9OQU1FJyAvPiA8L1RIPlxuIFwKICAgICAgICAgICAgIDxURCByb3dzcGFuPSc0Jz4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J01BVFJJWC9TSVpFJyAvPiA8L1REPlxuIFwKQEAgLTUwLDcgKzQ5LDcgQEAKICAgICAgICAgICAgICAgPFREPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nVElNRS9DT01QVVRFJyAvPiA8L1REPlxuIFwKICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPlxuIFwKICAgICAgICAgICA8L1RSPiI7Ci0gIG91dDw8IiAgPFRSPlxuIFwKKyAgb3V0IDw8ICIgIDxUUj5cbiBcCiAgICAgICAgICAgICA8VEg+IFNvbHZlIFRpbWUgPC9USD5cbiBcCiAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0nU09MVkVSX1NUQVQnPlxuIFwKICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0nQElEJyBkYXRhLXR5cGU9J251bWJlcicvPlxuIFwKQEAgLTcxLDcgKzcwLDcgQEAKICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPlxuIFwKICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPlxuIFwKICAgICAgICAgICA8L1RSPiI7Ci0gIG91dDw8IiAgPFRSPlxuIFwKKyAgb3V0IDw8ICIgIDxUUj5cbiBcCiAgICAgICAgICAgICAgIDxUSD4gRXJyb3IgPC9USD5cbiBcCiAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSdTT0xWRVJfU1RBVCc+XG4gXAogICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9J0BJRCcgZGF0YS10eXBlPSdudW1iZXInLz5cbiBcCkBAIC04OSw3ICs4OCw2IEBACiAgICAgPC9odG1sPlxuIFwKICAgPC94c2w6dGVtcGxhdGU+XG4gXAogICA8L3hzbDpzdHlsZXNoZWV0PlxuXG4iOwotICAKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9iZW5jaC9zcGJlbmNoL3Rlc3Rfc3BhcnNlTFUuY3BwIGIvYmVuY2gvc3BiZW5jaC90ZXN0X3NwYXJzZUxVLmNwcAppbmRleCBhNGNhZGU2Li4wMmRjYjNjIDEwMDY0NAotLS0gYS9iZW5jaC9zcGJlbmNoL3Rlc3Rfc3BhcnNlTFUuY3BwCisrKyBiL2JlbmNoL3NwYmVuY2gvdGVzdF9zcGFyc2VMVS5jcHAKQEAgLTE0LDQxICsxNCw0MyBAQAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmdzKQotewotLy8gICB0eXBlZGVmIGNvbXBsZXg8ZG91YmxlPiBzY2FsYXI7IAotICB0eXBlZGVmIGRvdWJsZSBzY2FsYXI7IAotICBTcGFyc2VNYXRyaXg8c2NhbGFyLCBDb2xNYWpvcj4gQTsgCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3MpIHsKKyAgLy8gICB0eXBlZGVmIGNvbXBsZXg8ZG91YmxlPiBzY2FsYXI7CisgIHR5cGVkZWYgZG91YmxlIHNjYWxhcjsKKyAgU3BhcnNlTWF0cml4PHNjYWxhciwgQ29sTWFqb3I+IEE7CiAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PHNjYWxhciwgQ29sTWFqb3I+OjpJbmRleCBJbmRleDsKICAgdHlwZWRlZiBNYXRyaXg8c2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBEZW5zZU1hdHJpeDsKICAgdHlwZWRlZiBNYXRyaXg8c2NhbGFyLCBEeW5hbWljLCAxPiBEZW5zZVJoczsKICAgTWF0cml4PHNjYWxhciwgRHluYW1pYywgMT4gYiwgeCwgdG1wOwotLy8gICBTcGFyc2VMVTxTcGFyc2VNYXRyaXg8c2NhbGFyLCBDb2xNYWpvcj4sIEFNRE9yZGVyaW5nPGludD4gPiAgIHNvbHZlcjsKLS8vICNpZmRlZiBFSUdFTl9NRVRJU19TVVBQT1JUCi0vLyAgIFNwYXJzZUxVPFNwYXJzZU1hdHJpeDxzY2FsYXIsIENvbE1ham9yPiwgTWV0aXNPcmRlcmluZzxpbnQ+ID4gc29sdmVyOyAKLS8vICAgc3RkOjpjb3V0PDwgIk9SREVSSU5HIDogTUVUSVNcbiI7IAotLy8gI2Vsc2UKLSAgU3BhcnNlTFU8U3BhcnNlTWF0cml4PHNjYWxhciwgQ29sTWFqb3I+LCBDT0xBTURPcmRlcmluZzxpbnQ+ID4gIHNvbHZlcjsKLSAgc3RkOjpjb3V0PDwgIk9SREVSSU5HIDogQ09MQU1EXG4iOyAKLS8vICNlbmRpZgotICAKLSAgaWZzdHJlYW0gbWF0cml4X2ZpbGU7IAorICAvLyAgIFNwYXJzZUxVPFNwYXJzZU1hdHJpeDxzY2FsYXIsIENvbE1ham9yPiwgQU1ET3JkZXJpbmc8aW50PiA+ICAgc29sdmVyOworICAvLyAjaWZkZWYgRUlHRU5fTUVUSVNfU1VQUE9SVAorICAvLyAgIFNwYXJzZUxVPFNwYXJzZU1hdHJpeDxzY2FsYXIsIENvbE1ham9yPiwgTWV0aXNPcmRlcmluZzxpbnQ+ID4gc29sdmVyOworICAvLyAgIHN0ZDo6Y291dDw8ICJPUkRFUklORyA6IE1FVElTXG4iOworICAvLyAjZWxzZQorICBTcGFyc2VMVTxTcGFyc2VNYXRyaXg8c2NhbGFyLCBDb2xNYWpvcj4sIENPTEFNRE9yZGVyaW5nPGludD4gPiBzb2x2ZXI7CisgIHN0ZDo6Y291dCA8PCAiT1JERVJJTkcgOiBDT0xBTURcbiI7CisgIC8vICNlbmRpZgorCisgIGlmc3RyZWFtIG1hdHJpeF9maWxlOwogICBzdHJpbmcgbGluZTsKLSAgaW50ICBuOwotICBCZW5jaFRpbWVyIHRpbWVyOyAKLSAgCisgIGludCBuOworICBCZW5jaFRpbWVyIHRpbWVyOworCiAgIC8vIFNldCBwYXJhbWV0ZXJzCiAgIC8qIEZpbGwgdGhlIG1hdHJpeCB3aXRoIHNwYXJzZSBtYXRyaXggc3RvcmVkIGluIE1hdHJpeC1NYXJrZXQgY29vcmRpbmF0ZSBjb2x1bW4tb3JpZW50ZWQgZm9ybWF0ICovCiAgIGlmIChhcmdjIDwgMikgYXNzZXJ0KGZhbHNlICYmICJwbGVhc2UsIGdpdmUgdGhlIG1hdHJpeCBtYXJrZXQgZmlsZSAiKTsKICAgbG9hZE1hcmtldChBLCBhcmdzWzFdKTsKICAgY291dCA8PCAiRW5kIGNoYXJnaW5nIG1hdHJpeCAiIDw8IGVuZGw7Ci0gIGJvb2wgaXNjb21wbGV4PWZhbHNlLCBpc3ZlY3Rvcj1mYWxzZTsKKyAgYm9vbCBpc2NvbXBsZXggPSBmYWxzZSwgaXN2ZWN0b3IgPSBmYWxzZTsKICAgaW50IHN5bTsKICAgZ2V0TWFya2V0SGVhZGVyKGFyZ3NbMV0sIHN5bSwgaXNjb21wbGV4LCBpc3ZlY3Rvcik7Ci0vLyAgIGlmIChpc2NvbXBsZXgpIHsgY291dDw8ICIgTm90IGZvciBjb21wbGV4IG1hdHJpY2VzIFxuIjsgcmV0dXJuIC0xOyB9Ci0gIGlmIChpc3ZlY3RvcikgeyBjb3V0IDw8ICJUaGUgcHJvdmlkZWQgZmlsZSBpcyBub3QgYSBtYXRyaXggZmlsZVxuIjsgcmV0dXJuIC0xO30KLSAgaWYgKHN5bSAhPSAwKSB7IC8vIHN5bW1ldHJpYyBtYXRyaWNlcywgb25seSB0aGUgbG93ZXIgcGFydCBpcyBzdG9yZWQKLSAgICBTcGFyc2VNYXRyaXg8c2NhbGFyLCBDb2xNYWpvcj4gdGVtcDsgCisgIC8vICAgaWYgKGlzY29tcGxleCkgeyBjb3V0PDwgIiBOb3QgZm9yIGNvbXBsZXggbWF0cmljZXMgXG4iOyByZXR1cm4gLTE7IH0KKyAgaWYgKGlzdmVjdG9yKSB7CisgICAgY291dCA8PCAiVGhlIHByb3ZpZGVkIGZpbGUgaXMgbm90IGEgbWF0cml4IGZpbGVcbiI7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChzeW0gIT0gMCkgeyAgLy8gc3ltbWV0cmljIG1hdHJpY2VzLCBvbmx5IHRoZSBsb3dlciBwYXJ0IGlzIHN0b3JlZAorICAgIFNwYXJzZU1hdHJpeDxzY2FsYXIsIENvbE1ham9yPiB0ZW1wOwogICAgIHRlbXAgPSBBOwogICAgIEEgPSB0ZW1wLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKICAgfQpAQCAtNTcsMzcgKzU5LDM2IEBACiAKICAgaWYgKGFyZ2MgPiAyKQogICAgIGxvYWRNYXJrZXRWZWN0b3IoYiwgYXJnc1syXSk7Ci0gIGVsc2UgCi0gIHsKKyAgZWxzZSB7CiAgICAgYi5yZXNpemUobik7CiAgICAgdG1wLnJlc2l6ZShuKTsKLS8vICAgICAgIHRtcC5zZXRSYW5kb20oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgdG1wKGkpID0gaTsgCi0gICAgYiA9IEEgKiB0bXAgOworICAgIC8vICAgICAgIHRtcC5zZXRSYW5kb20oKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgdG1wKGkpID0gaTsKKyAgICBiID0gQSAqIHRtcDsKICAgfQogCiAgIC8qIENvbXB1dGUgdGhlIGZhY3Rvcml6YXRpb24gKi8KLS8vICAgc29sdmVyLmlzU3ltbWV0cmljKHRydWUpOwotICB0aW1lci5zdGFydCgpOyAKLS8vICAgc29sdmVyLmNvbXB1dGUoQSk7Ci0gIHNvbHZlci5hbmFseXplUGF0dGVybihBKTsgCi0gIHRpbWVyLnN0b3AoKTsgCisgIC8vICAgc29sdmVyLmlzU3ltbWV0cmljKHRydWUpOworICB0aW1lci5zdGFydCgpOworICAvLyAgIHNvbHZlci5jb21wdXRlKEEpOworICBzb2x2ZXIuYW5hbHl6ZVBhdHRlcm4oQSk7CisgIHRpbWVyLnN0b3AoKTsKICAgY291dCA8PCAiVGltZSB0byBhbmFseXplICIgPDwgdGltZXIudmFsdWUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHRpbWVyLnJlc2V0KCk7IAotICB0aW1lci5zdGFydCgpOyAKLSAgc29sdmVyLmZhY3Rvcml6ZShBKTsgCi0gIHRpbWVyLnN0b3AoKTsgCisgIHRpbWVyLnJlc2V0KCk7CisgIHRpbWVyLnN0YXJ0KCk7CisgIHNvbHZlci5mYWN0b3JpemUoQSk7CisgIHRpbWVyLnN0b3AoKTsKICAgY291dCA8PCAiRmFjdG9yaXplIFRpbWUgIiA8PCB0aW1lci52YWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKLSAgdGltZXIucmVzZXQoKTsgCi0gIHRpbWVyLnN0YXJ0KCk7IAorICB0aW1lci5yZXNldCgpOworICB0aW1lci5zdGFydCgpOwogICB4ID0gc29sdmVyLnNvbHZlKGIpOwogICB0aW1lci5zdG9wKCk7Ci0gIGNvdXQgPDwgInNvbHZlIHRpbWUgIiA8PCB0aW1lci52YWx1ZSgpIDw8IHN0ZDo6ZW5kbDsgCisgIGNvdXQgPDwgInNvbHZlIHRpbWUgIiA8PCB0aW1lci52YWx1ZSgpIDw8IHN0ZDo6ZW5kbDsKICAgLyogQ2hlY2sgdGhlIGFjY3VyYWN5ICovCi0gIE1hdHJpeDxzY2FsYXIsIER5bmFtaWMsIDE+IHRtcDIgPSBiIC0gQSp4OwotICBzY2FsYXIgdGVtcE5vcm0gPSB0bXAyLm5vcm0oKS9iLm5vcm0oKTsKLSAgY291dCA8PCAiUmVsYXRpdmUgbm9ybSBvZiB0aGUgY29tcHV0ZWQgc29sdXRpb24gOiAiIDw8IHRlbXBOb3JtIDw8IlxuIjsKLSAgY291dCA8PCAiTnVtYmVyIG9mIG5vbnplcm9zIGluIHRoZSBmYWN0b3IgOiAiIDw8IHNvbHZlci5ubnpMKCkgKyBzb2x2ZXIubm56VSgpIDw8IHN0ZDo6ZW5kbDsgCi0gIAorICBNYXRyaXg8c2NhbGFyLCBEeW5hbWljLCAxPiB0bXAyID0gYiAtIEEgKiB4OworICBzY2FsYXIgdGVtcE5vcm0gPSB0bXAyLm5vcm0oKSAvIGIubm9ybSgpOworICBjb3V0IDw8ICJSZWxhdGl2ZSBub3JtIG9mIHRoZSBjb21wdXRlZCBzb2x1dGlvbiA6ICIgPDwgdGVtcE5vcm0gPDwgIlxuIjsKKyAgY291dCA8PCAiTnVtYmVyIG9mIG5vbnplcm9zIGluIHRoZSBmYWN0b3IgOiAiIDw8IHNvbHZlci5ubnpMKCkgKyBzb2x2ZXIubm56VSgpIDw8IHN0ZDo6ZW5kbDsKKwogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2JlbmNoL3NwbXYuY3BwIGIvYmVuY2gvc3Btdi5jcHAKaW5kZXggOTU5YmFiMC4uYzE3ZGNiMSAxMDA2NDQKLS0tIGEvYmVuY2gvc3Btdi5jcHAKKysrIGIvYmVuY2gvc3Btdi5jcHAKQEAgLTEsNSArMSw3IEBACiAKLS8vZysrLTQuNCAtRE5PTVRMICAtV2wsLXJwYXRoIC91c3IvbG9jYWwvbGliL29za2kgLUwgL3Vzci9sb2NhbC9saWIvb3NraS8gLWwgb3NraSAtbCBvc2tpX3V0aWwgLWwgb3NraV91dGlsX1RpZCAgLURPU0tJIC1JIH4vQ29kaW5nL0xpbmVhckFsZ2VicmEvbXRsNC8gIHNwbXYuY3BwICAtSSAuLiAtTzIgLUROREVCVUcgLWxydCAgLWxtIC1sIG9za2lfbWF0X0NTQ19UaWQgIC1sb3NraWx0ICYmIC4vYS5vdXQgcjIwMDAwMCBjMjAwMDAwIG4xMDAgdDEgcDEKKy8vIGcrKy00LjQgLUROT01UTCAgLVdsLC1ycGF0aCAvdXNyL2xvY2FsL2xpYi9vc2tpIC1MIC91c3IvbG9jYWwvbGliL29za2kvIC1sIG9za2kgLWwgb3NraV91dGlsIC1sIG9za2lfdXRpbF9UaWQgIC1ET1NLSQorLy8gLUkgfi9Db2RpbmcvTGluZWFyQWxnZWJyYS9tdGw0LyAgc3Btdi5jcHAgIC1JIC4uIC1PMiAtRE5ERUJVRyAtbHJ0ICAtbG0gLWwgb3NraV9tYXRfQ1NDX1RpZCAgLWxvc2tpbHQgJiYgLi9hLm91dAorLy8gcjIwMDAwMCBjMjAwMDAwIG4xMDAgdDEgcDEKIAogI2RlZmluZSBTQ0FMQVIgZG91YmxlCiAKQEAgLTgsNyArMTAsNyBAQAogI2luY2x1ZGUgIkJlbmNoVGltZXIuaCIKICNpbmNsdWRlICJCZW5jaFNwYXJzZVV0aWwuaCIKIAotI2RlZmluZSBTUE1WX0JFTkNIKENPREUpIEJFTkNIKHQsdHJpZXMscmVwZWF0cyxDT0RFKTsKKyNkZWZpbmUgU1BNVl9CRU5DSChDT0RFKSBCRU5DSCh0LCB0cmllcywgcmVwZWF0cywgQ09ERSk7CiAKIC8vICNpZmRlZiBNS0wKIC8vCkBAIC0zNCw4ICszNiw3IEBACiAvLwogLy8gI2VuZGlmCiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgIGludCBzaXplID0gMTAwMDA7CiAgIGludCByb3dzID0gc2l6ZTsKICAgaW50IGNvbHMgPSBzaXplOwpAQCAtNDQsMTA2ICs0NSw5MyBAQAogICBpbnQgcmVwZWF0cyA9IDI7CiAKICAgYm9vbCBuZWVkX2hlbHAgPSBmYWxzZTsKLSAgZm9yKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgewotICAgIGlmKGFyZ3ZbaV1bMF0gPT0gJ3InKQotICAgIHsKLSAgICAgIHJvd3MgPSBhdG9pKGFyZ3ZbaV0rMSk7Ci0gICAgfQotICAgIGVsc2UgaWYoYXJndltpXVswXSA9PSAnYycpCi0gICAgewotICAgICAgY29scyA9IGF0b2koYXJndltpXSsxKTsKLSAgICB9Ci0gICAgZWxzZSBpZihhcmd2W2ldWzBdID09ICduJykKLSAgICB7Ci0gICAgICBubnpQZXJDb2wgPSBhdG9pKGFyZ3ZbaV0rMSk7Ci0gICAgfQotICAgIGVsc2UgaWYoYXJndltpXVswXSA9PSAndCcpCi0gICAgewotICAgICAgdHJpZXMgPSBhdG9pKGFyZ3ZbaV0rMSk7Ci0gICAgfQotICAgIGVsc2UgaWYoYXJndltpXVswXSA9PSAncCcpCi0gICAgewotICAgICAgcmVwZWF0cyA9IGF0b2koYXJndltpXSsxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoYXJndltpXVswXSA9PSAncicpIHsKKyAgICAgIHJvd3MgPSBhdG9pKGFyZ3ZbaV0gKyAxKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3ZbaV1bMF0gPT0gJ2MnKSB7CisgICAgICBjb2xzID0gYXRvaShhcmd2W2ldICsgMSk7CisgICAgfSBlbHNlIGlmIChhcmd2W2ldWzBdID09ICduJykgeworICAgICAgbm56UGVyQ29sID0gYXRvaShhcmd2W2ldICsgMSk7CisgICAgfSBlbHNlIGlmIChhcmd2W2ldWzBdID09ICd0JykgeworICAgICAgdHJpZXMgPSBhdG9pKGFyZ3ZbaV0gKyAxKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3ZbaV1bMF0gPT0gJ3AnKSB7CisgICAgICByZXBlYXRzID0gYXRvaShhcmd2W2ldICsgMSk7CisgICAgfSBlbHNlIHsKICAgICAgIG5lZWRfaGVscCA9IHRydWU7CiAgICAgfQogICB9Ci0gIGlmKG5lZWRfaGVscCkKLSAgeworICBpZiAobmVlZF9oZWxwKSB7CiAgICAgc3RkOjpjb3V0IDw8IGFyZ3ZbMF0gPDwgIiByPG5iIHJvd3M+IGM8bmIgY29sdW1ucz4gbjxub24gemVyb3MgcGVyIGNvbHVtbj4gdDxuYiB0cmllcz4gcDxuYiByZXBlYXRzPlxuIjsKICAgICByZXR1cm4gMTsKICAgfQogCi0gIHN0ZDo6Y291dCA8PCAiU3BNViAiIDw8IHJvd3MgPDwgIiB4ICIgPDwgY29scyA8PCAiIHdpdGggIiA8PCBubnpQZXJDb2wgPDwgIiBub24gemVyb3MgcGVyIGNvbHVtbi4gKCIgPDwgcmVwZWF0cyA8PCAiIHJlcGVhdHMsIGFuZCAiIDw8IHRyaWVzIDw8ICIgdHJpZXMpXG5cbiI7CisgIHN0ZDo6Y291dCA8PCAiU3BNViAiIDw8IHJvd3MgPDwgIiB4ICIgPDwgY29scyA8PCAiIHdpdGggIiA8PCBubnpQZXJDb2wgPDwgIiBub24gemVyb3MgcGVyIGNvbHVtbi4gKCIgPDwgcmVwZWF0cworICAgICAgICAgICAgPDwgIiByZXBlYXRzLCBhbmQgIiA8PCB0cmllcyA8PCAiIHRyaWVzKVxuXG4iOwogCi0gIEVpZ2VuU3BhcnNlTWF0cml4IHNtKHJvd3MsY29scyk7CisgIEVpZ2VuU3BhcnNlTWF0cml4IHNtKHJvd3MsIGNvbHMpOwogICBEZW5zZVZlY3RvciBkdihjb2xzKSwgcmVzKHJvd3MpOwogICBkdi5zZXRSYW5kb20oKTsKIAogICBCZW5jaFRpbWVyIHQ7Ci0gIHdoaWxlIChubnpQZXJDb2w+PTQpCi0gIHsKKyAgd2hpbGUgKG5uelBlckNvbCA+PSA0KSB7CiAgICAgc3RkOjpjb3V0IDw8ICJubno6ICIgPDwgbm56UGVyQ29sIDw8ICJcbiI7CiAgICAgc20uc2V0WmVybygpOwogICAgIGZpbGxNYXRyaXgyKG5uelBlckNvbCwgcm93cywgY29scywgc20pOwogCi0gICAgLy8gZGVuc2UgbWF0cmljZXMKLSAgICAjaWZkZWYgREVOU0VNQVRSSVgKKy8vIGRlbnNlIG1hdHJpY2VzCisjaWZkZWYgREVOU0VNQVRSSVgKICAgICB7Ci0gICAgICBEZW5zZU1hdHJpeCBkbShyb3dzLGNvbHMpLCAocm93cyxjb2xzKTsKKyAgICAgIERlbnNlTWF0cml4IGRtKHJvd3MsIGNvbHMpLCAocm93cywgY29scyk7CiAgICAgICBlaVRvRGVuc2Uoc20sIGRtKTsKIAogICAgICAgU1BNVl9CRU5DSChyZXMgPSBkbSAqIHNtKTsKLSAgICAgIHN0ZDo6Y291dCA8PCAiRGVuc2UgICAgICAgIiA8PCB0LnZhbHVlKCkvcmVwZWF0cyA8PCAiXHQiOworICAgICAgc3RkOjpjb3V0IDw8ICJEZW5zZSAgICAgICAiIDw8IHQudmFsdWUoKSAvIHJlcGVhdHMgPDwgIlx0IjsKIAogICAgICAgU1BNVl9CRU5DSChyZXMgPSBkbS50cmFuc3Bvc2UoKSAqIHNtKTsKLSAgICAgIHN0ZDo6Y291dCA8PCB0LnZhbHVlKCkvcmVwZWF0cyA8PCBlbmRsOworICAgICAgc3RkOjpjb3V0IDw8IHQudmFsdWUoKSAvIHJlcGVhdHMgPDwgZW5kbDsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAogICAgIC8vIGVpZ2VuIHNwYXJzZSBtYXRyaWNlcwogICAgIHsKLSAgICAgIFNQTVZfQkVOQ0gocmVzLm5vYWxpYXMoKSArPSBzbSAqIGR2OyApCi0gICAgICBzdGQ6OmNvdXQgPDwgIkVpZ2VuICAgICAgICIgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgIlx0IjsKKyAgICAgIFNQTVZfQkVOQ0gocmVzLm5vYWxpYXMoKSArPSBzbSAqIGR2OykKKyAgICAgIHN0ZDo6Y291dCA8PCAiRWlnZW4gICAgICAgIiA8PCB0LnZhbHVlKCkgLyByZXBlYXRzIDw8ICJcdCI7CiAKLSAgICAgIFNQTVZfQkVOQ0gocmVzLm5vYWxpYXMoKSArPSBzbS50cmFuc3Bvc2UoKSAqIGR2OyApCi0gICAgICBzdGQ6OmNvdXQgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgZW5kbDsKKyAgICAgIFNQTVZfQkVOQ0gocmVzLm5vYWxpYXMoKSArPSBzbS50cmFuc3Bvc2UoKSAqIGR2OykKKyAgICAgIHN0ZDo6Y291dCA8PCB0LnZhbHVlKCkgLyByZXBlYXRzIDw8IGVuZGw7CiAgICAgfQogCi0gICAgLy8gQ1NwYXJzZQotICAgICNpZmRlZiBDU1BBUlNFCisvLyBDU3BhcnNlCisjaWZkZWYgQ1NQQVJTRQogICAgIHsKICAgICAgIHN0ZDo6Y291dCA8PCAiQ1NwYXJzZSBcbiI7CiAgICAgICBjcyAqY3NtOwogICAgICAgZWlUb0NTcGFyc2Uoc20sIGNzbSk7CiAKLS8vICAgICAgIEJFTkNIKCk7Ci0vLyAgICAgICB0aW1lci5zdG9wKCk7Ci0vLyAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIGEgKiBiOlx0IiA8PCB0aW1lci52YWx1ZSgpIDw8IGVuZGw7CisgICAgICAvLyAgICAgICBCRU5DSCgpOworICAgICAgLy8gICAgICAgdGltZXIuc3RvcCgpOworICAgICAgLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOwogCi0vLyAgICAgICBCRU5DSCggeyBtMyA9IGNzX3NvcnRlZF9tdWx0aXBseTIobTEsIG0yKTsgY3Nfc3BmcmVlKG0zKTsgfSApOwotLy8gICAgICAgc3RkOjpjb3V0IDw8ICIgICBhICogYjpcdCIgPDwgdGltZXIudmFsdWUoKSA8PCBlbmRsOworICAgICAgLy8gICAgICAgQkVOQ0goIHsgbTMgPSBjc19zb3J0ZWRfbXVsdGlwbHkyKG0xLCBtMik7IGNzX3NwZnJlZShtMyk7IH0gKTsKKyAgICAgIC8vICAgICAgIHN0ZDo6Y291dCA8PCAiICAgYSAqIGI6XHQiIDw8IHRpbWVyLnZhbHVlKCkgPDwgZW5kbDsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAotICAgICNpZmRlZiBPU0tJCisjaWZkZWYgT1NLSQogICAgIHsKICAgICAgIG9za2lfbWF0cml4X3Qgb207CiAgICAgICBvc2tpX3ZlY3ZpZXdfdCBvdiwgb3JlczsKICAgICAgIG9za2lfSW5pdCgpOwotICAgICAgb20gPSBvc2tpX0NyZWF0ZU1hdENTQyhzbS5fb3V0ZXJJbmRleFB0cigpLCBzbS5faW5uZXJJbmRleFB0cigpLCBzbS5fdmFsdWVQdHIoKSwgcm93cywgY29scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hBUkVfSU5QVVRNQVQsIDEsIElOREVYX1pFUk9fQkFTRUQpOworICAgICAgb20gPSBvc2tpX0NyZWF0ZU1hdENTQyhzbS5fb3V0ZXJJbmRleFB0cigpLCBzbS5faW5uZXJJbmRleFB0cigpLCBzbS5fdmFsdWVQdHIoKSwgcm93cywgY29scywgU0hBUkVfSU5QVVRNQVQsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOREVYX1pFUk9fQkFTRUQpOwogICAgICAgb3YgPSBvc2tpX0NyZWF0ZVZlY1ZpZXcoZHYuZGF0YSgpLCBjb2xzLCBTVFJJREVfVU5JVCk7CiAgICAgICBvcmVzID0gb3NraV9DcmVhdGVWZWNWaWV3KHJlcy5kYXRhKCksIHJvd3MsIFNUUklERV9VTklUKTsKIAotICAgICAgU1BNVl9CRU5DSCggb3NraV9NYXRNdWx0KG9tLCBPUF9OT1JNQUwsIDEsIG92LCAwLCBvcmVzKSApOwotICAgICAgc3RkOjpjb3V0IDw8ICJPU0tJICAgICAgICAiIDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8ICJcdCI7CisgICAgICBTUE1WX0JFTkNIKG9za2lfTWF0TXVsdChvbSwgT1BfTk9STUFMLCAxLCBvdiwgMCwgb3JlcykpOworICAgICAgc3RkOjpjb3V0IDw8ICJPU0tJICAgICAgICAiIDw8IHQudmFsdWUoKSAvIHJlcGVhdHMgPDwgIlx0IjsKIAotICAgICAgU1BNVl9CRU5DSCggb3NraV9NYXRNdWx0KG9tLCBPUF9UUkFOUywgMSwgb3YsIDAsIG9yZXMpICk7Ci0gICAgICBzdGQ6OmNvdXQgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgIlxuIjsKKyAgICAgIFNQTVZfQkVOQ0gob3NraV9NYXRNdWx0KG9tLCBPUF9UUkFOUywgMSwgb3YsIDAsIG9yZXMpKTsKKyAgICAgIHN0ZDo6Y291dCA8PCB0LnZhbHVlKCkgLyByZXBlYXRzIDw8ICJcbiI7CiAKICAgICAgIC8vIHR1bmUKICAgICAgIHQucmVzZXQoKTsKQEAgLTE1Myw4MSArMTQxLDc2IEBACiAgICAgICB0LnN0b3AoKTsKICAgICAgIGRvdWJsZSB0dW5pbmcgPSB0LnZhbHVlKCk7CiAKLSAgICAgIFNQTVZfQkVOQ0goIG9za2lfTWF0TXVsdChvbSwgT1BfTk9STUFMLCAxLCBvdiwgMCwgb3JlcykgKTsKLSAgICAgIHN0ZDo6Y291dCA8PCAiT1NLSSB0dW5lZCAgIiA8PCB0LnZhbHVlKCkvcmVwZWF0cyA8PCAiXHQiOworICAgICAgU1BNVl9CRU5DSChvc2tpX01hdE11bHQob20sIE9QX05PUk1BTCwgMSwgb3YsIDAsIG9yZXMpKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiT1NLSSB0dW5lZCAgIiA8PCB0LnZhbHVlKCkgLyByZXBlYXRzIDw8ICJcdCI7CiAKLSAgICAgIFNQTVZfQkVOQ0goIG9za2lfTWF0TXVsdChvbSwgT1BfVFJBTlMsIDEsIG92LCAwLCBvcmVzKSApOwotICAgICAgc3RkOjpjb3V0IDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8ICJcdCgiIDw8IHR1bmluZyA8PCAgIilcbiI7Ci0KKyAgICAgIFNQTVZfQkVOQ0gob3NraV9NYXRNdWx0KG9tLCBPUF9UUkFOUywgMSwgb3YsIDAsIG9yZXMpKTsKKyAgICAgIHN0ZDo6Y291dCA8PCB0LnZhbHVlKCkgLyByZXBlYXRzIDw8ICJcdCgiIDw8IHR1bmluZyA8PCAiKVxuIjsKIAogICAgICAgb3NraV9EZXN0cm95TWF0KG9tKTsKICAgICAgIG9za2lfRGVzdHJveVZlY1ZpZXcob3YpOwogICAgICAgb3NraV9EZXN0cm95VmVjVmlldyhvcmVzKTsKICAgICAgIG9za2lfQ2xvc2UoKTsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAotICAgICNpZm5kZWYgTk9VQkxBUworI2lmbmRlZiBOT1VCTEFTCiAgICAgewogICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpudW1lcmljOwotICAgICAgVWJsYXNNYXRyaXggdW0ocm93cyxjb2xzKTsKKyAgICAgIFVibGFzTWF0cml4IHVtKHJvd3MsIGNvbHMpOwogICAgICAgZWlUb1VibGFzKHNtLCB1bSk7CiAKICAgICAgIGJvb3N0OjpudW1lcmljOjp1Ymxhczo6dmVjdG9yPFNjYWxhcj4gdXYoY29scyksIHVyZXMocm93cyk7Ci0gICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4oJnV2WzBdLCBjb2xzKSA9IGR2OwotICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZ1cmVzWzBdLCByb3dzKSA9IHJlczsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiA+KCZ1dlswXSwgY29scykgPSBkdjsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiA+KCZ1cmVzWzBdLCByb3dzKSA9IHJlczsKIAogICAgICAgU1BNVl9CRU5DSCh1Ymxhczo6YXhweV9wcm9kKHVtLCB1diwgdXJlcywgdHJ1ZSkpOwotICAgICAgc3RkOjpjb3V0IDw8ICJ1YmxhcyAgICAgICAiIDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8ICJcdCI7CisgICAgICBzdGQ6OmNvdXQgPDwgInVibGFzICAgICAgICIgPDwgdC52YWx1ZSgpIC8gcmVwZWF0cyA8PCAiXHQiOwogCiAgICAgICBTUE1WX0JFTkNIKHVibGFzOjpheHB5X3Byb2QoYm9vc3Q6Om51bWVyaWM6OnVibGFzOjp0cmFucyh1bSksIHV2LCB1cmVzLCB0cnVlKSk7Ci0gICAgICBzdGQ6OmNvdXQgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCB0LnZhbHVlKCkgLyByZXBlYXRzIDw8IGVuZGw7CiAgICAgfQotICAgICNlbmRpZgorI2VuZGlmCiAKLSAgICAvLyBHTU0rKwotICAgICNpZm5kZWYgTk9HTU0KKy8vIEdNTSsrCisjaWZuZGVmIE5PR01NCiAgICAgewotICAgICAgR21tU3BhcnNlIGdtKHJvd3MsY29scyk7CisgICAgICBHbW1TcGFyc2UgZ20ocm93cywgY29scyk7CiAgICAgICBlaVRvR21tKHNtLCBnbSk7CiAKICAgICAgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gZ3YoY29scyksIGdyZXMocm93cyk7Ci0gICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4oJmd2WzBdLCBjb2xzKSA9IGR2OwotICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KCZncmVzWzBdLCByb3dzKSA9IHJlczsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiA+KCZndlswXSwgY29scykgPSBkdjsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiA+KCZncmVzWzBdLCByb3dzKSA9IHJlczsKIAogICAgICAgU1BNVl9CRU5DSChnbW06Om11bHQoZ20sIGd2LCBncmVzKSk7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIkdNTSsrICAgICAgICIgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgIlx0IjsKKyAgICAgIHN0ZDo6Y291dCA8PCAiR01NKysgICAgICAgIiA8PCB0LnZhbHVlKCkgLyByZXBlYXRzIDw8ICJcdCI7CiAKICAgICAgIFNQTVZfQkVOQ0goZ21tOjptdWx0KGdtbTo6dHJhbnNwb3NlZChnbSksIGd2LCBncmVzKSk7Ci0gICAgICBzdGQ6OmNvdXQgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCB0LnZhbHVlKCkgLyByZXBlYXRzIDw8IGVuZGw7CiAgICAgfQotICAgICNlbmRpZgorI2VuZGlmCiAKLSAgICAvLyBNVEw0Ci0gICAgI2lmbmRlZiBOT01UTAorLy8gTVRMNAorI2lmbmRlZiBOT01UTAogICAgIHsKLSAgICAgIE10bFNwYXJzZSBtbShyb3dzLGNvbHMpOworICAgICAgTXRsU3BhcnNlIG1tKHJvd3MsIGNvbHMpOwogICAgICAgZWlUb010bChzbSwgbW0pOwogICAgICAgbXRsOjpkZW5zZV92ZWN0b3I8U2NhbGFyPiBtdihjb2xzLCAxLjApOwogICAgICAgbXRsOjpkZW5zZV92ZWN0b3I8U2NhbGFyPiBtcmVzKHJvd3MsIDEuMCk7CiAKICAgICAgIFNQTVZfQkVOQ0gobXJlcyA9IG1tICogbXYpOwotICAgICAgc3RkOjpjb3V0IDw8ICJNVEw0ICAgICAgICAiIDw8IHQudmFsdWUoKS9yZXBlYXRzIDw8ICJcdCI7CisgICAgICBzdGQ6OmNvdXQgPDwgIk1UTDQgICAgICAgICIgPDwgdC52YWx1ZSgpIC8gcmVwZWF0cyA8PCAiXHQiOwogCiAgICAgICBTUE1WX0JFTkNIKG1yZXMgPSB0cmFucyhtbSkgKiBtdik7Ci0gICAgICBzdGQ6OmNvdXQgPDwgdC52YWx1ZSgpL3JlcGVhdHMgPDwgZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCB0LnZhbHVlKCkgLyByZXBlYXRzIDw8IGVuZGw7CiAgICAgfQotICAgICNlbmRpZgorI2VuZGlmCiAKICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKIAotICAgIGlmKG5uelBlckNvbD09MSkKLSAgICAgIGJyZWFrOwotICAgIG5uelBlckNvbCAtPSBubnpQZXJDb2wvMjsKKyAgICBpZiAobm56UGVyQ29sID09IDEpIGJyZWFrOworICAgIG5uelBlckNvbCAtPSBubnpQZXJDb2wgLyAyOwogICB9CiAKICAgcmV0dXJuIDA7CiB9Ci0KLQotCmRpZmYgLS1naXQgYS9iZW5jaC90ZW5zb3JzL2JlbmNobWFyay5oIGIvYmVuY2gvdGVuc29ycy9iZW5jaG1hcmsuaAppbmRleCBmMTE1YjU0Li45ZmIwZWJmIDEwMDY0NAotLS0gYS9iZW5jaC90ZW5zb3JzL2JlbmNobWFyay5oCisrKyBiL2JlbmNoL3RlbnNvcnMvYmVuY2htYXJrLmgKQEAgLTIwLDE3ICsyMCwxNCBAQAogbmFtZXNwYWNlIHRlc3RpbmcgewogY2xhc3MgQmVuY2htYXJrIHsKICBwdWJsaWM6Ci0gIEJlbmNobWFyayhjb25zdCBjaGFyKiBuYW1lLCB2b2lkICgqZm4pKGludCkpIHsKLSAgICBSZWdpc3RlcihuYW1lLCBmbiwgTlVMTCk7Ci0gIH0KLSAgQmVuY2htYXJrKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQgKCpmbl9yYW5nZSkoaW50LCBpbnQpKSB7Ci0gICAgUmVnaXN0ZXIobmFtZSwgTlVMTCwgZm5fcmFuZ2UpOwotICB9CisgIEJlbmNobWFyayhjb25zdCBjaGFyKiBuYW1lLCB2b2lkICgqZm4pKGludCkpIHsgUmVnaXN0ZXIobmFtZSwgZm4sIE5VTEwpOyB9CisgIEJlbmNobWFyayhjb25zdCBjaGFyKiBuYW1lLCB2b2lkICgqZm5fcmFuZ2UpKGludCwgaW50KSkgeyBSZWdpc3RlcihuYW1lLCBOVUxMLCBmbl9yYW5nZSk7IH0KICAgQmVuY2htYXJrKiBBcmcoaW50IHgpOwogICBCZW5jaG1hcmsqIFJhbmdlKGludCBsbywgaW50IGhpKTsKICAgY29uc3QgY2hhciogTmFtZSgpOwogICBib29sIFNob3VsZFJ1bihpbnQgYXJnYywgY2hhciogYXJndltdKTsKICAgdm9pZCBSdW4oKTsKKwogIHByaXZhdGU6CiAgIGNvbnN0IGNoYXIqIG5hbWVfOwogICB2b2lkICgqZm5fKShpbnQpOwpAQCAtNDUsNSArNDIsNCBAQAogdm9pZCBTdG9wQmVuY2htYXJrVGltaW5nKCk7CiB2b2lkIFN0YXJ0QmVuY2htYXJrVGltaW5nKCk7CiAjZGVmaW5lIEJFTkNITUFSSyhmKSBcCi0gICAgc3RhdGljIDo6dGVzdGluZzo6QmVuY2htYXJrKiBfYmVuY2htYXJrXyMjZiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IFwKLSAgICAgICAgKG5ldyA6OnRlc3Rpbmc6OkJlbmNobWFyaygjZiwgZikpCisgIHN0YXRpYyA6OnRlc3Rpbmc6OkJlbmNobWFyayogX2JlbmNobWFya18jI2YgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSAobmV3IDo6dGVzdGluZzo6QmVuY2htYXJrKCNmLCBmKSkKZGlmZiAtLWdpdCBhL2JlbmNoL3RlbnNvcnMvYmVuY2htYXJrX21haW4uY2MgYi9iZW5jaC90ZW5zb3JzL2JlbmNobWFya19tYWluLmNjCmluZGV4IDFlZmEwZGIuLmFmOTIwNjMgMTAwNjQ0Ci0tLSBhL2JlbmNoL3RlbnNvcnMvYmVuY2htYXJrX21haW4uY2MKKysrIGIvYmVuY2gvdGVuc29ycy9iZW5jaG1hcmtfbWFpbi5jYwpAQCAtMzgsMjQgKzM4LDIyIEBACiAKIHN0YXRpYyBpbnQgUm91bmQoaW50IG4pIHsKICAgaW50IGJhc2UgPSAxOwotICB3aGlsZSAoYmFzZSoxMCA8IG4pIHsKKyAgd2hpbGUgKGJhc2UgKiAxMCA8IG4pIHsKICAgICBiYXNlICo9IDEwOwogICB9Ci0gIGlmIChuIDwgMipiYXNlKSB7Ci0gICAgcmV0dXJuIDIqYmFzZTsKKyAgaWYgKG4gPCAyICogYmFzZSkgeworICAgIHJldHVybiAyICogYmFzZTsKICAgfQotICBpZiAobiA8IDUqYmFzZSkgewotICAgIHJldHVybiA1KmJhc2U7CisgIGlmIChuIDwgNSAqIGJhc2UpIHsKKyAgICByZXR1cm4gNSAqIGJhc2U7CiAgIH0KLSAgcmV0dXJuIDEwKmJhc2U7CisgIHJldHVybiAxMCAqIGJhc2U7CiB9CiAKICNpZmRlZiBfX0FQUExFX18KLSAgI2luY2x1ZGUgPG1hY2gvbWFjaF90aW1lLmg+Ci0gIHN0YXRpYyBtYWNoX3RpbWViYXNlX2luZm9fZGF0YV90IGdfdGltZV9pbmZvOwotICBzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIGluaXRfaW5mbygpIHsKLSAgICBtYWNoX3RpbWViYXNlX2luZm8oJmdfdGltZV9pbmZvKTsKLSAgfQorI2luY2x1ZGUgPG1hY2gvbWFjaF90aW1lLmg+CitzdGF0aWMgbWFjaF90aW1lYmFzZV9pbmZvX2RhdGFfdCBnX3RpbWVfaW5mbzsKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgaW5pdF9pbmZvKCkgeyBtYWNoX3RpbWViYXNlX2luZm8oJmdfdGltZV9pbmZvKTsgfQogI2VuZGlmCiAKIHN0YXRpYyBpbnQ2NF90IE5hbm9UaW1lKCkgewpAQCAtOTIsOSArOTAsNyBAQAogICByZXR1cm4gdGhpczsKIH0KIAotY29uc3QgY2hhciogQmVuY2htYXJrOjpOYW1lKCkgewotICByZXR1cm4gbmFtZV87Ci19Citjb25zdCBjaGFyKiBCZW5jaG1hcms6Ok5hbWUoKSB7IHJldHVybiBuYW1lXzsgfQogYm9vbCBCZW5jaG1hcms6OlNob3VsZFJ1bihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgIGlmIChhcmdjID09IDEpIHsKICAgICByZXR1cm4gdHJ1ZTsgIC8vIFdpdGggbm8gYXJndW1lbnRzLCB3ZSBydW4gYWxsIGJlbmNobWFya3MuCkBAIC0xNTcsNDIgKzE1Myw0MCBAQAogICBSdW5SZXBlYXRlZGx5V2l0aEFyZyhpdGVyYXRpb25zLCBhcmcpOwogICB3aGlsZSAoZ19iZW5jaG1hcmtfdG90YWxfdGltZV9ucyA8IDFlOSAmJiBpdGVyYXRpb25zIDwgMWU5KSB7CiAgICAgaW50IGxhc3QgPSBpdGVyYXRpb25zOwotICAgIGlmIChnX2JlbmNobWFya190b3RhbF90aW1lX25zL2l0ZXJhdGlvbnMgPT0gMCkgeworICAgIGlmIChnX2JlbmNobWFya190b3RhbF90aW1lX25zIC8gaXRlcmF0aW9ucyA9PSAwKSB7CiAgICAgICBpdGVyYXRpb25zID0gMWU5OwogICAgIH0gZWxzZSB7Ci0gICAgICBpdGVyYXRpb25zID0gMWU5IC8gKGdfYmVuY2htYXJrX3RvdGFsX3RpbWVfbnMvaXRlcmF0aW9ucyk7CisgICAgICBpdGVyYXRpb25zID0gMWU5IC8gKGdfYmVuY2htYXJrX3RvdGFsX3RpbWVfbnMgLyBpdGVyYXRpb25zKTsKICAgICB9Ci0gICAgaXRlcmF0aW9ucyA9IHN0ZDo6bWF4KGxhc3QgKyAxLCBzdGQ6Om1pbihpdGVyYXRpb25zICsgaXRlcmF0aW9ucy8yLCAxMDAqbGFzdCkpOworICAgIGl0ZXJhdGlvbnMgPSBzdGQ6Om1heChsYXN0ICsgMSwgc3RkOjptaW4oaXRlcmF0aW9ucyArIGl0ZXJhdGlvbnMgLyAyLCAxMDAgKiBsYXN0KSk7CiAgICAgaXRlcmF0aW9ucyA9IFJvdW5kKGl0ZXJhdGlvbnMpOwogICAgIFJ1blJlcGVhdGVkbHlXaXRoQXJnKGl0ZXJhdGlvbnMsIGFyZyk7CiAgIH0KICAgY2hhciB0aHJvdWdocHV0WzEwMF07CiAgIHRocm91Z2hwdXRbMF0gPSAnXDAnOwogICBpZiAoZ19iZW5jaG1hcmtfdG90YWxfdGltZV9ucyA+IDAgJiYgZ19mbG9wc19wcm9jZXNzZWQgPiAwKSB7Ci0gICAgZG91YmxlIG1mbG9wc19wcm9jZXNzZWQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGdfZmxvcHNfcHJvY2Vzc2VkKS8xZTY7Ci0gICAgZG91YmxlIHNlY29uZHMgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGdfYmVuY2htYXJrX3RvdGFsX3RpbWVfbnMpLzFlOTsKLSAgICBzbnByaW50Zih0aHJvdWdocHV0LCBzaXplb2YodGhyb3VnaHB1dCksICIgJTguMmYgTUZsb3BzL3MiLCBtZmxvcHNfcHJvY2Vzc2VkL3NlY29uZHMpOworICAgIGRvdWJsZSBtZmxvcHNfcHJvY2Vzc2VkID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihnX2Zsb3BzX3Byb2Nlc3NlZCkgLyAxZTY7CisgICAgZG91YmxlIHNlY29uZHMgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGdfYmVuY2htYXJrX3RvdGFsX3RpbWVfbnMpIC8gMWU5OworICAgIHNucHJpbnRmKHRocm91Z2hwdXQsIHNpemVvZih0aHJvdWdocHV0KSwgIiAlOC4yZiBNRmxvcHMvcyIsIG1mbG9wc19wcm9jZXNzZWQgLyBzZWNvbmRzKTsKICAgfQogICBjaGFyIGZ1bGxfbmFtZVsxMDBdOwogICBpZiAoZm5fcmFuZ2VfICE9IE5VTEwpIHsKLSAgICBpZiAoYXJnID49ICgxPDwyMCkpIHsKLSAgICAgIHNucHJpbnRmKGZ1bGxfbmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSksICIlcy8lZE0iLCBuYW1lXywgYXJnLygxPDwyMCkpOwotICAgIH0gZWxzZSBpZiAoYXJnID49ICgxPDwxMCkpIHsKLSAgICAgIHNucHJpbnRmKGZ1bGxfbmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSksICIlcy8lZEsiLCBuYW1lXywgYXJnLygxPDwxMCkpOworICAgIGlmIChhcmcgPj0gKDEgPDwgMjApKSB7CisgICAgICBzbnByaW50ZihmdWxsX25hbWUsIHNpemVvZihmdWxsX25hbWUpLCAiJXMvJWRNIiwgbmFtZV8sIGFyZyAvICgxIDw8IDIwKSk7CisgICAgfSBlbHNlIGlmIChhcmcgPj0gKDEgPDwgMTApKSB7CisgICAgICBzbnByaW50ZihmdWxsX25hbWUsIHNpemVvZihmdWxsX25hbWUpLCAiJXMvJWRLIiwgbmFtZV8sIGFyZyAvICgxIDw8IDEwKSk7CiAgICAgfSBlbHNlIHsKICAgICAgIHNucHJpbnRmKGZ1bGxfbmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSksICIlcy8lZCIsIG5hbWVfLCBhcmcpOwogICAgIH0KICAgfSBlbHNlIHsKICAgICBzbnByaW50ZihmdWxsX25hbWUsIHNpemVvZihmdWxsX25hbWUpLCAiJXMiLCBuYW1lXyk7CiAgIH0KLSAgcHJpbnRmKCIlLSpzICUxMGQgJTEwIiBQUklkNjQgIiVzXG4iLCBnX25hbWVfY29sdW1uX3dpZHRoLCBmdWxsX25hbWUsCi0gICAgICAgICBpdGVyYXRpb25zLCBnX2JlbmNobWFya190b3RhbF90aW1lX25zL2l0ZXJhdGlvbnMsIHRocm91Z2hwdXQpOworICBwcmludGYoIiUtKnMgJTEwZCAlMTAiIFBSSWQ2NCAiJXNcbiIsIGdfbmFtZV9jb2x1bW5fd2lkdGgsIGZ1bGxfbmFtZSwgaXRlcmF0aW9ucywKKyAgICAgICAgIGdfYmVuY2htYXJrX3RvdGFsX3RpbWVfbnMgLyBpdGVyYXRpb25zLCB0aHJvdWdocHV0KTsKICAgZmZsdXNoKHN0ZG91dCk7CiB9CiB9ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotdm9pZCBTZXRCZW5jaG1hcmtGbG9wc1Byb2Nlc3NlZChpbnQ2NF90IHgpIHsKLSAgZ19mbG9wc19wcm9jZXNzZWQgPSB4OwotfQordm9pZCBTZXRCZW5jaG1hcmtGbG9wc1Byb2Nlc3NlZChpbnQ2NF90IHgpIHsgZ19mbG9wc19wcm9jZXNzZWQgPSB4OyB9CiB2b2lkIFN0b3BCZW5jaG1hcmtUaW1pbmcoKSB7CiAgIGlmIChnX2JlbmNobWFya19zdGFydF90aW1lX25zICE9IDApIHsKICAgICBnX2JlbmNobWFya190b3RhbF90aW1lX25zICs9IE5hbm9UaW1lKCkgLSBnX2JlbmNobWFya19zdGFydF90aW1lX25zOwpkaWZmIC0tZ2l0IGEvYmVuY2gvdGVuc29ycy9jb250cmFjdGlvbl9iZW5jaG1hcmtzX2NwdS5jYyBiL2JlbmNoL3RlbnNvcnMvY29udHJhY3Rpb25fYmVuY2htYXJrc19jcHUuY2MKaW5kZXggZjllNTdhZC4uZDUxNzUzYSAxMDA2NDQKLS0tIGEvYmVuY2gvdGVuc29ycy9jb250cmFjdGlvbl9iZW5jaG1hcmtzX2NwdS5jYworKysgYi9iZW5jaC90ZW5zb3JzL2NvbnRyYWN0aW9uX2JlbmNobWFya3NfY3B1LmNjCkBAIC00LDEwICs0LDkgQEAKIAogI2luY2x1ZGUgInRlbnNvcl9iZW5jaG1hcmtzLmgiCiAKLSNkZWZpbmUgQ1JFQVRFX1RIUkVBRF9QT09MKHRocmVhZHMpICAgICAgICAgICAgIFwKLUVpZ2VuOjpUaHJlYWRQb29sIHBvb2wodGhyZWFkcyk7ICAgICAgICAgICAgICAgIFwKLUVpZ2VuOjpUaHJlYWRQb29sRGV2aWNlIGRldmljZSgmcG9vbCwgdGhyZWFkcyk7Ci0KKyNkZWZpbmUgQ1JFQVRFX1RIUkVBRF9QT09MKHRocmVhZHMpIFwKKyAgRWlnZW46OlRocmVhZFBvb2wgcG9vbCh0aHJlYWRzKTsgIFwKKyAgRWlnZW46OlRocmVhZFBvb2xEZXZpY2UgZGV2aWNlKCZwb29sLCB0aHJlYWRzKTsKIAogLy8gQ29udHJhY3Rpb25zIGZvciBudW1iZXIgb2YgdGhyZWFkcyByYW5naW5nIGZyb20gMSB0byAzMgogLy8gRGltZW5zaW9ucyBhcmUgUm93cywgQ29scywgRGVwdGgKQEAgLTIwLDcgKzE5LDYgQEAKICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgQkVOQ0hNQVJLX1JBTkdFKEJNXyMjQ29udHJhY3Rpb24jI18jI0QxIyN4IyNEMiMjeCMjRDMsIDEsIDMyKTsKIAotCiAvLyBWZWN0b3IgTWF0cml4IGFuZCBNYXRyaXggVmVjdG9yIHByb2R1Y3RzCiBCTV9Db250cmFjdGlvbkNQVSgxLCAyMDAwLCA1MDApOwogQk1fQ29udHJhY3Rpb25DUFUoMjAwMCwgMSwgNTAwKTsKZGlmZiAtLWdpdCBhL2JlbmNoL3RlbnNvcnMvdGVuc29yX2JlbmNobWFya3MuaCBiL2JlbmNoL3RlbnNvcnMvdGVuc29yX2JlbmNobWFya3MuaAppbmRleCAxYTdhMGZlLi4wNmI4MTViIDEwMDY0NAotLS0gYS9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzLmgKKysrIGIvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrcy5oCkBAIC03LDMwICs3LDIzIEBACiAjaW5jbHVkZSAidW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGVuc29yIgogI2luY2x1ZGUgImJlbmNobWFyay5oIgogCi0jZGVmaW5lIEJFTkNITUFSS19SQU5HRShiZW5jaCwgbG8sIGhpKSBcCi0gIEJFTkNITUFSSyhiZW5jaCktPlJhbmdlKGxvLCBoaSkKKyNkZWZpbmUgQkVOQ0hNQVJLX1JBTkdFKGJlbmNoLCBsbywgaGkpIEJFTkNITUFSSyhiZW5jaCktPlJhbmdlKGxvLCBoaSkKIAogdXNpbmcgRWlnZW46OlRlbnNvcjsKIHVzaW5nIEVpZ2VuOjpUZW5zb3JNYXA7CiAKIC8vIFRPRE8oYnN0ZWluZXIpOiBhbHNvIHRlbXBsYXRpemUgb24gdGhlIGlucHV0IHR5cGUgc2luY2Ugd2UgaGF2ZSB1c2VycwogLy8gZm9yIGludDggYXMgd2VsbCBhcyBmbG9hdHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRGV2aWNlLCB0eXBlbmFtZSBUPiBjbGFzcyBCZW5jaG1hcmtTdWl0ZSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGV2aWNlLCB0eXBlbmFtZSBUPgorY2xhc3MgQmVuY2htYXJrU3VpdGUgewogIHB1YmxpYzoKLSAgQmVuY2htYXJrU3VpdGUoY29uc3QgRGV2aWNlJiBkZXZpY2UsIHNpemVfdCBtLCBzaXplX3Qgaywgc2l6ZV90IG4pCi0gICAgICA6IG1fKG0pLCBrXyhrKSwgbl8obiksIGRldmljZV8oZGV2aWNlKSB7CisgIEJlbmNobWFya1N1aXRlKGNvbnN0IERldmljZSYgZGV2aWNlLCBzaXplX3QgbSwgc2l6ZV90IGssIHNpemVfdCBuKSA6IG1fKG0pLCBrXyhrKSwgbl8obiksIGRldmljZV8oZGV2aWNlKSB7CiAgICAgaW5pdGlhbGl6ZSgpOwogICB9CiAKLSAgQmVuY2htYXJrU3VpdGUoY29uc3QgRGV2aWNlJiBkZXZpY2UsIHNpemVfdCBtKQotICAgICAgOiBtXyhtKSwga18obSksIG5fKG0pLCBkZXZpY2VfKGRldmljZSkgewotICAgIGluaXRpYWxpemUoKTsKLSAgfQorICBCZW5jaG1hcmtTdWl0ZShjb25zdCBEZXZpY2UmIGRldmljZSwgc2l6ZV90IG0pIDogbV8obSksIGtfKG0pLCBuXyhtKSwgZGV2aWNlXyhkZXZpY2UpIHsgaW5pdGlhbGl6ZSgpOyB9CiAKLSAgQmVuY2htYXJrU3VpdGUoY29uc3QgRGV2aWNlJiBkZXZpY2UsIHNpemVfdCBtLCBzaXplX3QgaykKLSAgICAgIDogbV8oMSksIGtfKGspLCBuXyhtKSwgZGV2aWNlXyhkZXZpY2UpIHsKLSAgICBpbml0aWFsaXplKCk7Ci0gIH0KKyAgQmVuY2htYXJrU3VpdGUoY29uc3QgRGV2aWNlJiBkZXZpY2UsIHNpemVfdCBtLCBzaXplX3QgaykgOiBtXygxKSwga18oayksIG5fKG0pLCBkZXZpY2VfKGRldmljZSkgeyBpbml0aWFsaXplKCk7IH0KIAogICB+QmVuY2htYXJrU3VpdGUoKSB7CiAgICAgZGV2aWNlXy5kZWFsbG9jYXRlKGFfKTsKQEAgLTQwLDcgKzMzLDcgQEAKIAogICB2b2lkIG1lbWNweShpbnQgbnVtX2l0ZXJzKSB7CiAgICAgZWlnZW5fYXNzZXJ0KG1fID09IGtfICYmIGtfID09IG5fKTsKLSNpZmRlZiBFSUdFTl9VU0VfU1lDTCAvLyB3YXJtdXAgZm9yIHN5Y2wKKyNpZmRlZiBFSUdFTl9VU0VfU1lDTCAgLy8gd2FybXVwIGZvciBzeWNsCiAgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCAxMDsgKytpdGVyKSB7CiAgICAgICBkZXZpY2VfLm1lbWNweShjXywgYV8sIG1fICogbV8gKiBzaXplb2YoVCkpOwogICAgIH0KQEAgLTY1LDcgKzU4LDcgQEAKICAgICB9CiAgICAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxpbnQsIDIsIDAsIFRlbnNvckluZGV4PiwgRWlnZW46OkFsaWduZWQ+IEEoKGludCopYV8sIHNpemVzKTsKICAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDIsIDAsIFRlbnNvckluZGV4PiwgRWlnZW46OkFsaWduZWQ+IEIoYl8sIHNpemVzKTsKLSNpZmRlZiBFSUdFTl9VU0VfU1lDTCAvLyB3YXJtdXAgZm9yIHN5Y2wKKyNpZmRlZiBFSUdFTl9VU0VfU1lDTCAgLy8gd2FybXVwIGZvciBzeWNsCiAgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCAxMDsgKytpdGVyKSB7CiAgICAgICBCLmRldmljZShkZXZpY2VfKSA9IEEudGVtcGxhdGUgY2FzdDxUPigpOwogICAgIH0KQEAgLTg0LDcgKzc3LDcgQEAKICAgICBzaXplc1swXSA9IG1fOwogICAgIHNpemVzWzFdID0gbV87CiAgICAgVGVuc29yTWFwPFRlbnNvcjxULCAyPiwgRWlnZW46OkFsaWduZWQ+IEMoY18sIHNpemVzKTsKLSNpZmRlZiBFSUdFTl9VU0VfU1lDTCAvLyB3YXJtdXAgZm9yIHN5Y2wKKyNpZmRlZiBFSUdFTl9VU0VfU1lDTCAgLy8gd2FybXVwIGZvciBzeWNsCiAgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCAxMDsgKytpdGVyKSB7CiAgICAgICBDLmRldmljZShkZXZpY2VfKSA9IEMucmFuZG9tKCk7CiAgICAgfQpAQCAtMTA2LDMzICs5OSwyNSBAQAogICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBCKGJfLCBzaXplcyk7CiAgICAgVGVuc29yTWFwPFRlbnNvcjxULCAyPiwgRWlnZW46OkFsaWduZWQ+IEMoY18sIHNpemVzKTsKIAotICAgIGNvbnN0IEVpZ2VuOjpEU2l6ZXM8VGVuc29ySW5kZXgsIDI+IHF1YXJ0ZXJfc2l6ZXMobV8vMiwgbV8vMik7CisgICAgY29uc3QgRWlnZW46OkRTaXplczxUZW5zb3JJbmRleCwgMj4gcXVhcnRlcl9zaXplcyhtXyAvIDIsIG1fIC8gMik7CiAgICAgY29uc3QgRWlnZW46OkRTaXplczxUZW5zb3JJbmRleCwgMj4gZmlyc3RfcXVhZHJhbnQoMCwgMCk7Ci0gICAgY29uc3QgRWlnZW46OkRTaXplczxUZW5zb3JJbmRleCwgMj4gc2Vjb25kX3F1YWRyYW50KDAsIG1fLzIpOwotICAgIGNvbnN0IEVpZ2VuOjpEU2l6ZXM8VGVuc29ySW5kZXgsIDI+IHRoaXJkX3F1YWRyYW50KG1fLzIsIDApOwotICAgIGNvbnN0IEVpZ2VuOjpEU2l6ZXM8VGVuc29ySW5kZXgsIDI+IGZvdXJ0aF9xdWFkcmFudChtXy8yLCBtXy8yKTsKLSNpZmRlZiBFSUdFTl9VU0VfU1lDTCAvLyB3YXJtdXAgZm9yIHN5Y2wKKyAgICBjb25zdCBFaWdlbjo6RFNpemVzPFRlbnNvckluZGV4LCAyPiBzZWNvbmRfcXVhZHJhbnQoMCwgbV8gLyAyKTsKKyAgICBjb25zdCBFaWdlbjo6RFNpemVzPFRlbnNvckluZGV4LCAyPiB0aGlyZF9xdWFkcmFudChtXyAvIDIsIDApOworICAgIGNvbnN0IEVpZ2VuOjpEU2l6ZXM8VGVuc29ySW5kZXgsIDI+IGZvdXJ0aF9xdWFkcmFudChtXyAvIDIsIG1fIC8gMik7CisjaWZkZWYgRUlHRU5fVVNFX1NZQ0wgIC8vIHdhcm11cCBmb3Igc3ljbAogICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgewotICAgICAgQy5zbGljZShmaXJzdF9xdWFkcmFudCwgcXVhcnRlcl9zaXplcykuZGV2aWNlKGRldmljZV8pID0KLSAgICAgICAgICBBLnNsaWNlKGZpcnN0X3F1YWRyYW50LCBxdWFydGVyX3NpemVzKTsKLSAgICAgIEMuc2xpY2Uoc2Vjb25kX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKS5kZXZpY2UoZGV2aWNlXykgPQotICAgICAgICAgIEIuc2xpY2Uoc2Vjb25kX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKTsKLSAgICAgIEMuc2xpY2UodGhpcmRfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpLmRldmljZShkZXZpY2VfKSA9Ci0gICAgICAgICAgQS5zbGljZSh0aGlyZF9xdWFkcmFudCwgcXVhcnRlcl9zaXplcyk7Ci0gICAgICBDLnNsaWNlKGZvdXJ0aF9xdWFkcmFudCwgcXVhcnRlcl9zaXplcykuZGV2aWNlKGRldmljZV8pID0KLSAgICAgICAgICBCLnNsaWNlKGZvdXJ0aF9xdWFkcmFudCwgcXVhcnRlcl9zaXplcyk7CisgICAgICBDLnNsaWNlKGZpcnN0X3F1YWRyYW50LCBxdWFydGVyX3NpemVzKS5kZXZpY2UoZGV2aWNlXykgPSBBLnNsaWNlKGZpcnN0X3F1YWRyYW50LCBxdWFydGVyX3NpemVzKTsKKyAgICAgIEMuc2xpY2Uoc2Vjb25kX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKS5kZXZpY2UoZGV2aWNlXykgPSBCLnNsaWNlKHNlY29uZF9xdWFkcmFudCwgcXVhcnRlcl9zaXplcyk7CisgICAgICBDLnNsaWNlKHRoaXJkX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKS5kZXZpY2UoZGV2aWNlXykgPSBBLnNsaWNlKHRoaXJkX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKTsKKyAgICAgIEMuc2xpY2UoZm91cnRoX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKS5kZXZpY2UoZGV2aWNlXykgPSBCLnNsaWNlKGZvdXJ0aF9xdWFkcmFudCwgcXVhcnRlcl9zaXplcyk7CiAgICAgfQogI2VuZGlmCiAgICAgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKICAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7Ci0gICAgICBDLnNsaWNlKGZpcnN0X3F1YWRyYW50LCBxdWFydGVyX3NpemVzKS5kZXZpY2UoZGV2aWNlXykgPQotICAgICAgICAgIEEuc2xpY2UoZmlyc3RfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpOwotICAgICAgQy5zbGljZShzZWNvbmRfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpLmRldmljZShkZXZpY2VfKSA9Ci0gICAgICAgICAgQi5zbGljZShzZWNvbmRfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpOwotICAgICAgQy5zbGljZSh0aGlyZF9xdWFkcmFudCwgcXVhcnRlcl9zaXplcykuZGV2aWNlKGRldmljZV8pID0KLSAgICAgICAgICBBLnNsaWNlKHRoaXJkX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKTsKLSAgICAgIEMuc2xpY2UoZm91cnRoX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKS5kZXZpY2UoZGV2aWNlXykgPQotICAgICAgICAgIEIuc2xpY2UoZm91cnRoX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKTsKKyAgICAgIEMuc2xpY2UoZmlyc3RfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpLmRldmljZShkZXZpY2VfKSA9IEEuc2xpY2UoZmlyc3RfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpOworICAgICAgQy5zbGljZShzZWNvbmRfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpLmRldmljZShkZXZpY2VfKSA9IEIuc2xpY2Uoc2Vjb25kX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKTsKKyAgICAgIEMuc2xpY2UodGhpcmRfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpLmRldmljZShkZXZpY2VfKSA9IEEuc2xpY2UodGhpcmRfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpOworICAgICAgQy5zbGljZShmb3VydGhfcXVhZHJhbnQsIHF1YXJ0ZXJfc2l6ZXMpLmRldmljZShkZXZpY2VfKSA9IEIuc2xpY2UoZm91cnRoX3F1YWRyYW50LCBxdWFydGVyX3NpemVzKTsKICAgICB9CiAgICAgLy8gUmVjb3JkIHRoZSBudW1iZXIgb2YgdmFsdWVzIGNvcGllZCBmcm9tIHRoZSByaHMgc2xpY2UgdG8gdGhlIGxocyBzbGljZQogICAgIC8vIGVhY2ggc2Vjb25kCkBAIC0xNDcsNyArMTMyLDcgQEAKICAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDE+IG91dHB1dF9zaXplOwogICAgIG91dHB1dF9zaXplWzBdID0gbl87CiAgICAgVGVuc29yTWFwPFRlbnNvcjxULCAxLCAwLCBUZW5zb3JJbmRleD4sIEVpZ2VuOjpBbGlnbmVkPiBDKGNfLCBvdXRwdXRfc2l6ZSk7Ci0jaWZkZWYgRUlHRU5fVVNFX1NZQ0wgLy8gd2FybXVwIGZvciBzeWNsCisjaWZkZWYgRUlHRU5fVVNFX1NZQ0wgIC8vIHdhcm11cCBmb3Igc3ljbAogICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgewogICAgICAgQy5kZXZpY2UoZGV2aWNlXykgPSBCLmNoaXAoaXRlciAlIGtfLCAwKTsKICAgICB9CkBAIC0xNjgsNyArMTUzLDcgQEAKICAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDE+IG91dHB1dF9zaXplOwogICAgIG91dHB1dF9zaXplWzBdID0gbl87CiAgICAgVGVuc29yTWFwPFRlbnNvcjxULCAxLCAwLCBUZW5zb3JJbmRleD4sIEVpZ2VuOjpBbGlnbmVkPiBDKGNfLCBvdXRwdXRfc2l6ZSk7Ci0jaWZkZWYgRUlHRU5fVVNFX1NZQ0wgLy8gd2FybXVwIGZvciBzeWNsCisjaWZkZWYgRUlHRU5fVVNFX1NZQ0wgIC8vIHdhcm11cCBmb3Igc3ljbAogICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgewogICAgICAgQy5kZXZpY2UoZGV2aWNlXykgPSBCLmNoaXAoaXRlciAlIG5fLCAxKTsKICAgICB9CkBAIC0xOTUsNyArMTgwLDcgQEAKICAgICBFaWdlbjo6YXJyYXk8aW50LCAyPiBzaHVmZmxlOwogICAgIHNodWZmbGVbMF0gPSAxOwogICAgIHNodWZmbGVbMV0gPSAwOwotI2lmZGVmIEVJR0VOX1VTRV9TWUNMIC8vIHdhcm11cCBmb3Igc3ljbAorI2lmZGVmIEVJR0VOX1VTRV9TWUNMICAvLyB3YXJtdXAgZm9yIHN5Y2wKICAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IDEwOyArK2l0ZXIpIHsKICAgICAgIEIuZGV2aWNlKGRldmljZV8pID0gQS5zaHVmZmxlKHNodWZmbGUpOwogICAgIH0KQEAgLTIwOCwyMCArMTkzLDE5IEBACiAgICAgZmluYWxpemVCZW5jaG1hcmsoc3RhdGljX2Nhc3Q8aW50NjRfdD4obV8pICoga18gKiBudW1faXRlcnMpOwogICB9CiAKLSB2b2lkIHBhZGRpbmcoaW50IG51bV9pdGVycykgeworICB2b2lkIHBhZGRpbmcoaW50IG51bV9pdGVycykgewogICAgIGVpZ2VuX2Fzc2VydChtXyA9PSBrXyk7CiAgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAyPiBzaXplX2E7CiAgICAgc2l6ZV9hWzBdID0gbV87Ci0gICAgc2l6ZV9hWzFdID0ga18tMzsKKyAgICBzaXplX2FbMV0gPSBrXyAtIDM7CiAgICAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxULCAyPiwgRWlnZW46OkFsaWduZWQ+IEEoYV8sIHNpemVfYSk7CiAgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAyPiBzaXplX2I7CiAgICAgc2l6ZV9iWzBdID0ga187CiAgICAgc2l6ZV9iWzFdID0gbV87CiAgICAgVGVuc29yTWFwPFRlbnNvcjxULCAyPiwgRWlnZW46OkFsaWduZWQ+IEIoYl8sIHNpemVfYik7CiAKLSAgICBFaWdlbjo6SW5kZXhQYWlyTGlzdDxFaWdlbjo6dHlwZTJpbmRleHBhaXI8MCwgMD4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgRWlnZW46OnR5cGUyaW5kZXhwYWlyPDIsIDE+ID4gcGFkZGluZ3M7Ci0jaWZkZWYgRUlHRU5fVVNFX1NZQ0wgLy8gd2FybXVwIGZvciBzeWNsCisgICAgRWlnZW46OkluZGV4UGFpckxpc3Q8RWlnZW46OnR5cGUyaW5kZXhwYWlyPDAsIDA+LCBFaWdlbjo6dHlwZTJpbmRleHBhaXI8MiwgMT4+IHBhZGRpbmdzOworI2lmZGVmIEVJR0VOX1VTRV9TWUNMICAvLyB3YXJtdXAgZm9yIHN5Y2wKICAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IDEwOyArK2l0ZXIpIHsKICAgICAgIEIuZGV2aWNlKGRldmljZV8pID0gQS5wYWQocGFkZGluZ3MpOwogICAgIH0KQEAgLTIzNCw3ICsyMTgsNyBAQAogICAgIGZpbmFsaXplQmVuY2htYXJrKHN0YXRpY19jYXN0PGludDY0X3Q+KG1fKSAqIGtfICogbnVtX2l0ZXJzKTsKICAgfQogCi0gdm9pZCBzdHJpZGluZyhpbnQgbnVtX2l0ZXJzKSB7CisgIHZvaWQgc3RyaWRpbmcoaW50IG51bV9pdGVycykgewogICAgIGVpZ2VuX2Fzc2VydChtXyA9PSBrXyk7CiAgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAyPiBzaXplX2E7CiAgICAgc2l6ZV9hWzBdID0gbV87CkBAIC0yNDIsMTIgKzIyNiwxMiBAQAogICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBBKGFfLCBzaXplX2EpOwogICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gc2l6ZV9iOwogICAgIHNpemVfYlswXSA9IG1fOwotICAgIHNpemVfYlsxXSA9IGtfLzI7CisgICAgc2l6ZV9iWzFdID0ga18gLyAyOwogICAgIFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBCKGJfLCBzaXplX2IpOwogCi0gICAgRWlnZW46OkluZGV4TGlzdDxFaWdlbjo6dHlwZTJpbmRleDwxPiwgRWlnZW46OnR5cGUyaW5kZXg8Mj4gPiBzdHJpZGVzOworICAgIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MT4sIEVpZ2VuOjp0eXBlMmluZGV4PDI+PiBzdHJpZGVzOwogCi0jaWZkZWYgRUlHRU5fVVNFX1NZQ0wgLy8gd2FybXVwIGZvciBzeWNsCisjaWZkZWYgRUlHRU5fVVNFX1NZQ0wgIC8vIHdhcm11cCBmb3Igc3ljbAogICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgewogICAgICAgQi5kZXZpY2UoZGV2aWNlXykgPSBBLnN0cmlkZShzdHJpZGVzKTsKICAgICB9CkBAIC0yNjAsNyArMjQ0LDYgQEAKICAgICBmaW5hbGl6ZUJlbmNobWFyayhzdGF0aWNfY2FzdDxpbnQ2NF90PihtXykgKiBrXyAqIG51bV9pdGVycyk7CiAgIH0KIAotCiAgIHZvaWQgYnJvYWRjYXN0aW5nKGludCBudW1faXRlcnMpIHsKICAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDI+IHNpemVfYTsKICAgICBzaXplX2FbMF0gPSBtXzsKQEAgLTI3Myw3ICsyNTYsNyBAQAogICAgIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MT4sIGludD4gYnJvYWRjYXN0OwogICAgIGJyb2FkY2FzdC5zZXQoMSwgbl8pOwogCi0jaWZkZWYgRUlHRU5fVVNFX1NZQ0wgLy8gd2FybXVwIGZvciBzeWNsCisjaWZkZWYgRUlHRU5fVVNFX1NZQ0wgIC8vIHdhcm11cCBmb3Igc3ljbAogICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgewogICAgICAgQy5kZXZpY2UoZGV2aWNlXykgPSBBLmJyb2FkY2FzdChicm9hZGNhc3QpOwogICAgIH0KQEAgLTI5NCw3ICsyNzcsNyBAQAogICAgIGNvbnN0IFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBBKGFfLCBzaXplcyk7CiAgICAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxULCAyPiwgRWlnZW46OkFsaWduZWQ+IEIoYl8sIHNpemVzKTsKICAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQyhjXywgc2l6ZXMpOwotI2lmZGVmIEVJR0VOX1VTRV9TWUNMIC8vIHdhcm11cCBmb3Igc3ljbAorI2lmZGVmIEVJR0VOX1VTRV9TWUNMICAvLyB3YXJtdXAgZm9yIHN5Y2wKICAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IDEwOyArK2l0ZXIpIHsKICAgICAgIEMuZGV2aWNlKGRldmljZV8pID0gQSAqIEEuY29uc3RhbnQoc3RhdGljX2Nhc3Q8VD4oMy4xNCkpICsgQiAqIEIuY29uc3RhbnQoc3RhdGljX2Nhc3Q8VD4oMi43KSk7CiAgICAgfQpAQCAtMzE3LDEwICszMDAsMTAgQEAKICAgICBjb25zdCBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQihiXywgc2l6ZXMpOwogICAgIFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBDKGNfLCBzaXplcyk7CiAKLSNpZmRlZiBFSUdFTl9VU0VfU1lDTCAvLyB3YXJtdXAgZm9yIHN5Y2wKLWZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgeworI2lmZGVmIEVJR0VOX1VTRV9TWUNMICAvLyB3YXJtdXAgZm9yIHN5Y2wKKyAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IDEwOyArK2l0ZXIpIHsKICAgICAgIEMuZGV2aWNlKGRldmljZV8pID0gQS5yc3FydCgpICsgQi5zcXJ0KCkgKiBCLnNxdWFyZSgpOwotfQorICAgIH0KICNlbmRpZgogICAgIFN0YXJ0QmVuY2htYXJrVGltaW5nKCk7CiAgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCBudW1faXRlcnM7ICsraXRlcikgewpAQCAtMzM5LDcgKzMyMiw3IEBACiAgICAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxULCAyPiwgRWlnZW46OkFsaWduZWQ+IEEoYV8sIHNpemVzKTsKICAgICBjb25zdCBUZW5zb3JNYXA8VGVuc29yPFQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gQihiXywgc2l6ZXMpOwogICAgIFRlbnNvck1hcDxUZW5zb3I8VCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBDKGNfLCBzaXplcyk7Ci0jaWZkZWYgRUlHRU5fVVNFX1NZQ0wgLy8gd2FybXVwIGZvciBzeWNsCisjaWZkZWYgRUlHRU5fVVNFX1NZQ0wgIC8vIHdhcm11cCBmb3Igc3ljbAogICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgewogICAgICAgQy5kZXZpY2UoZGV2aWNlXykgPSBBLmV4cCgpICsgQi5sb2coKTsKICAgICB9CkBAIC0zNTMsNyArMzM2LDcgQEAKICAgICBmaW5hbGl6ZUJlbmNobWFyayhzdGF0aWNfY2FzdDxpbnQ2NF90PihtXykgKiBtXyAqIG51bV9pdGVycyk7CiAgIH0KIAotIC8vIFJvdyByZWR1Y3Rpb24KKyAgLy8gUm93IHJlZHVjdGlvbgogICB2b2lkIHJvd1JlZHVjdGlvbihpbnQgbnVtX2l0ZXJzKSB7CiAgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAyPiBpbnB1dF9zaXplOwogICAgIGlucHV0X3NpemVbMF0gPSBrXzsKQEAgLTM2MywxMCArMzQ2LDEwIEBACiAgICAgb3V0cHV0X3NpemVbMF0gPSBuXzsKICAgICBUZW5zb3JNYXA8VGVuc29yPFQsIDEsIDAsIFRlbnNvckluZGV4PiwgRWlnZW46OkFsaWduZWQ+IEMoY18sIG91dHB1dF9zaXplKTsKICAgICBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDA+PiBzdW1fYWxvbmdfZGltOwotI2lmZGVmIEVJR0VOX1VTRV9TWUNMIC8vIHdhcm11cCBmb3Igc3ljbAotICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IDEwOyArK2l0ZXIpIHsKLSAgICBDLmRldmljZShkZXZpY2VfKSA9IEIuc3VtKHN1bV9hbG9uZ19kaW0pOwotICB9CisjaWZkZWYgRUlHRU5fVVNFX1NZQ0wgIC8vIHdhcm11cCBmb3Igc3ljbAorICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgeworICAgICAgQy5kZXZpY2UoZGV2aWNlXykgPSBCLnN1bShzdW1fYWxvbmdfZGltKTsKKyAgICB9CiAjZW5kaWYKICAgICBTdGFydEJlbmNobWFya1RpbWluZygpOwogICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgbnVtX2l0ZXJzOyArK2l0ZXIpIHsKQEAgLTM4MiwxMiArMzY1LDEwIEBACiAgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAyPiBpbnB1dF9zaXplOwogICAgIGlucHV0X3NpemVbMF0gPSBrXzsKICAgICBpbnB1dF9zaXplWzFdID0gbl87Ci0gICAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxULCAyLCAwLCBUZW5zb3JJbmRleD4sIEVpZ2VuOjpBbGlnbmVkPiBCKAotICAgICAgICBiXywgaW5wdXRfc2l6ZSk7CisgICAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxULCAyLCAwLCBUZW5zb3JJbmRleD4sIEVpZ2VuOjpBbGlnbmVkPiBCKGJfLCBpbnB1dF9zaXplKTsKICAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDE+IG91dHB1dF9zaXplOwogICAgIG91dHB1dF9zaXplWzBdID0ga187Ci0gICAgVGVuc29yTWFwPFRlbnNvcjxULCAxLCAwLCBUZW5zb3JJbmRleD4sIEVpZ2VuOjpBbGlnbmVkPiBBKAotICAgICAgICBhXywgb3V0cHV0X3NpemUpOworICAgIFRlbnNvck1hcDxUZW5zb3I8VCwgMSwgMCwgVGVuc29ySW5kZXg+LCBFaWdlbjo6QWxpZ25lZD4gQShhXywgb3V0cHV0X3NpemUpOwogCiAjaWZuZGVmIEVJR0VOX0hBU19JTkRFWF9MSVNUCiAgICAgRWlnZW46OmFycmF5PFRlbnNvckluZGV4LCAxPiBzdW1fYWxvbmdfZGltOwpAQCAtMzk3LDEwICszNzgsMTAgQEAKICAgICAvLyBvcHRpbWl6ZSB0aGUgY29kZS4KICAgICBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDE+PiBzdW1fYWxvbmdfZGltOwogI2VuZGlmCi0jaWZkZWYgRUlHRU5fVVNFX1NZQ0wgLy8gd2FybXVwIGZvciBzeWNsCi0gIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgewotICAgIEEuZGV2aWNlKGRldmljZV8pID0gQi5zdW0oc3VtX2Fsb25nX2RpbSk7Ci0gIH0KKyNpZmRlZiBFSUdFTl9VU0VfU1lDTCAgLy8gd2FybXVwIGZvciBzeWNsCisgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCAxMDsgKytpdGVyKSB7CisgICAgICBBLmRldmljZShkZXZpY2VfKSA9IEIuc3VtKHN1bV9hbG9uZ19kaW0pOworICAgIH0KICNlbmRpZgogICAgIFN0YXJ0QmVuY2htYXJrVGltaW5nKCk7CiAgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCBudW1faXRlcnM7ICsraXRlcikgewpAQCAtNDE2LDEyICszOTcsMTAgQEAKICAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDI+IGlucHV0X3NpemU7CiAgICAgaW5wdXRfc2l6ZVswXSA9IGtfOwogICAgIGlucHV0X3NpemVbMV0gPSBuXzsKLSAgICBjb25zdCBUZW5zb3JNYXA8VGVuc29yPFQsIDIsIDAsIFRlbnNvckluZGV4PiwgRWlnZW46OkFsaWduZWQ+IEIoCi0gICAgICAgIGJfLCBpbnB1dF9zaXplKTsKKyAgICBjb25zdCBUZW5zb3JNYXA8VGVuc29yPFQsIDIsIDAsIFRlbnNvckluZGV4PiwgRWlnZW46OkFsaWduZWQ+IEIoYl8sIGlucHV0X3NpemUpOwogICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMD4gb3V0cHV0X3NpemU7Ci0gICAgVGVuc29yTWFwPFRlbnNvcjxULCAwLCAwLCBUZW5zb3JJbmRleD4sIEVpZ2VuOjpBbGlnbmVkPiBDKAotICAgICAgICBjXywgb3V0cHV0X3NpemUpOwotI2lmZGVmIEVJR0VOX1VTRV9TWUNMIC8vIHdhcm11cCBmb3Igc3ljbAorICAgIFRlbnNvck1hcDxUZW5zb3I8VCwgMCwgMCwgVGVuc29ySW5kZXg+LCBFaWdlbjo6QWxpZ25lZD4gQyhjXywgb3V0cHV0X3NpemUpOworI2lmZGVmIEVJR0VOX1VTRV9TWUNMICAvLyB3YXJtdXAgZm9yIHN5Y2wKICAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IDEwOyArK2l0ZXIpIHsKICAgICAgIEMuZGV2aWNlKGRldmljZV8pID0gQi5zdW0oKTsKICAgICB9CkBAIC00MzUsMjggKzQxNCwxNiBAQAogICAgIGZpbmFsaXplQmVuY2htYXJrKHN0YXRpY19jYXN0PGludDY0X3Q+KGtfKSAqIG5fICogbnVtX2l0ZXJzKTsKICAgfQogCi0gIAotCiAgIC8vIGRvIGEgY29udHJhY3Rpb24gd2hpY2ggaXMgZXF1aXZhbGVudCB0byBhIG1hdHJpeCBtdWx0aXBsaWNhdGlvbgotICB2b2lkIGNvbnRyYWN0aW9uKGludCBudW1faXRlcnMpIHsKLSAgICAgIGNvbnRyYWN0aW9uPHN0YXRpY19jYXN0PGludD4oRWlnZW46OkNvbE1ham9yKT4obnVtX2l0ZXJzLCBmYWxzZSwgZmFsc2UpOwotICB9CisgIHZvaWQgY29udHJhY3Rpb24oaW50IG51bV9pdGVycykgeyBjb250cmFjdGlvbjxzdGF0aWNfY2FzdDxpbnQ+KEVpZ2VuOjpDb2xNYWpvcik+KG51bV9pdGVycywgZmFsc2UsIGZhbHNlKTsgfQogCi0gICAgdm9pZCBjb250cmFjdGlvblJvd01ham9yKGludCBudW1faXRlcnMpIHsKLSAgICAgIGNvbnRyYWN0aW9uPHN0YXRpY19jYXN0PGludD4oRWlnZW46OlJvd01ham9yKT4obnVtX2l0ZXJzLCBmYWxzZSwgZmFsc2UpOwotICB9Ci0gICAgCi0gIHZvaWQgY29udHJhY3Rpb25Sb3dNYWpvckFUKGludCBudW1faXRlcnMpIHsKLSAgICAgIGNvbnRyYWN0aW9uPHN0YXRpY19jYXN0PGludD4oRWlnZW46OlJvd01ham9yKT4obnVtX2l0ZXJzLCB0cnVlLCBmYWxzZSk7Ci0gIH0KKyAgdm9pZCBjb250cmFjdGlvblJvd01ham9yKGludCBudW1faXRlcnMpIHsgY29udHJhY3Rpb248c3RhdGljX2Nhc3Q8aW50PihFaWdlbjo6Um93TWFqb3IpPihudW1faXRlcnMsIGZhbHNlLCBmYWxzZSk7IH0KIAotICB2b2lkIGNvbnRyYWN0aW9uUm93TWFqb3JCVChpbnQgbnVtX2l0ZXJzKSB7Ci0gICAgICBjb250cmFjdGlvbjxzdGF0aWNfY2FzdDxpbnQ+KEVpZ2VuOjpSb3dNYWpvcik+KG51bV9pdGVycywgZmFsc2UsIHRydWUpOwotICB9CisgIHZvaWQgY29udHJhY3Rpb25Sb3dNYWpvckFUKGludCBudW1faXRlcnMpIHsgY29udHJhY3Rpb248c3RhdGljX2Nhc3Q8aW50PihFaWdlbjo6Um93TWFqb3IpPihudW1faXRlcnMsIHRydWUsIGZhbHNlKTsgfQogCi0gIHZvaWQgY29udHJhY3Rpb25Sb3dNYWpvckFCVChpbnQgbnVtX2l0ZXJzKSB7Ci0gICAgICBjb250cmFjdGlvbjxzdGF0aWNfY2FzdDxpbnQ+KEVpZ2VuOjpSb3dNYWpvcik+KG51bV9pdGVycywgdHJ1ZSwgdHJ1ZSk7Ci0gIH0KKyAgdm9pZCBjb250cmFjdGlvblJvd01ham9yQlQoaW50IG51bV9pdGVycykgeyBjb250cmFjdGlvbjxzdGF0aWNfY2FzdDxpbnQ+KEVpZ2VuOjpSb3dNYWpvcik+KG51bV9pdGVycywgZmFsc2UsIHRydWUpOyB9CisKKyAgdm9pZCBjb250cmFjdGlvblJvd01ham9yQUJUKGludCBudW1faXRlcnMpIHsgY29udHJhY3Rpb248c3RhdGljX2Nhc3Q8aW50PihFaWdlbjo6Um93TWFqb3IpPihudW1faXRlcnMsIHRydWUsIHRydWUpOyB9CiAKICAgdm9pZCBjb252b2x1dGlvbihpbnQgbnVtX2l0ZXJzLCBpbnQga2VybmVsX3gsIGludCBrZXJuZWxfeSkgewogICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gaW5wdXRfc2l6ZXM7CkBAIC00NzQsMTAgKzQ0MSwxMCBAQAogICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gZGltczsKICAgICBkaW1zWzBdID0gMDsKICAgICBkaW1zWzFdID0gMTsKLSNpZmRlZiBFSUdFTl9VU0VfU1lDTCAvLyB3YXJtdXAgZm9yIHN5Y2wKKyNpZmRlZiBFSUdFTl9VU0VfU1lDTCAgLy8gd2FybXVwIGZvciBzeWNsCiAgICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCAxMDsgKytpdGVyKSB7CiAgICAgICBDLmRldmljZShkZXZpY2VfKSA9IEEuY29udm9sdmUoQiwgZGltcyk7Ci0gICAgIH0KKyAgICB9CiAjZW5kaWYKICAgICBTdGFydEJlbmNobWFya1RpbWluZygpOwogICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgbnVtX2l0ZXJzOyArK2l0ZXIpIHsKQEAgLTQ4NSwyMCArNDUyLDIwIEBACiAgICAgfQogICAgIC8vIFJlY29yZCB0aGUgbnVtYmVyIG9mIEZMT1BzIGV4ZWN1dGVkIHBlciBzZWNvbmQgKGtlcm5lbF9zaXplCiAgICAgLy8gbXVsdGlwbGljYXRpb25zIGFuZCBhZGRpdGlvbnMgZm9yIGVhY2ggdmFsdWUgaW4gdGhlIHJlc3VsdGluZyB0ZW5zb3IpCi0gICAgZmluYWxpemVCZW5jaG1hcmsoc3RhdGljX2Nhc3Q8aW50NjRfdD4oMikgKgotICAgICAgICAobV8gLSBrZXJuZWxfeCArIDEpICogKG5fIC0ga2VybmVsX3kgKyAxKSAqIGtlcm5lbF94ICoga2VybmVsX3kgKiBudW1faXRlcnMpOworICAgIGZpbmFsaXplQmVuY2htYXJrKHN0YXRpY19jYXN0PGludDY0X3Q+KDIpICogKG1fIC0ga2VybmVsX3ggKyAxKSAqIChuXyAtIGtlcm5lbF95ICsgMSkgKiBrZXJuZWxfeCAqIGtlcm5lbF95ICoKKyAgICAgICAgICAgICAgICAgICAgICBudW1faXRlcnMpOwogICB9CiAKICBwcml2YXRlOgotIC8vIGRvIGEgY29udHJhY3Rpb24gd2hpY2ggaXMgZXF1aXZhbGVudCB0byBhIG1hdHJpeCBtdWx0aXBsaWNhdGlvbgotICB0ZW1wbGF0ZTxpbnQgTGF5b3V0PgorICAvLyBkbyBhIGNvbnRyYWN0aW9uIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gYSBtYXRyaXggbXVsdGlwbGljYXRpb24KKyAgdGVtcGxhdGUgPGludCBMYXlvdXQ+CiAgIHZvaWQgY29udHJhY3Rpb24oaW50IG51bV9pdGVycywgYm9vbCB0cmFuc19hLCBib29sIHRyYW5zX2IpIHsKICAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDI+IHNpemVBOwotICAgIHNpemVBWzBdID0gKHRyYW5zX2EgPyBrXzogbV8pOwotICAgIHNpemVBWzFdID0gKHRyYW5zX2EgPyBtXzogIGtfKTsKKyAgICBzaXplQVswXSA9ICh0cmFuc19hID8ga18gOiBtXyk7CisgICAgc2l6ZUFbMV0gPSAodHJhbnNfYSA/IG1fIDoga18pOwogICAgIEVpZ2VuOjphcnJheTxUZW5zb3JJbmRleCwgMj4gc2l6ZUI7Ci0gICAgc2l6ZUJbMF0gPSAodHJhbnNfYiA/IG5fOiBrXyk7Ci0gICAgc2l6ZUJbMV0gPSAodHJhbnNfYiA/IGtfOiBuXyk7CisgICAgc2l6ZUJbMF0gPSAodHJhbnNfYiA/IG5fIDoga18pOworICAgIHNpemVCWzFdID0gKHRyYW5zX2IgPyBrXyA6IG5fKTsKICAgICBFaWdlbjo6YXJyYXk8VGVuc29ySW5kZXgsIDI+IHNpemVDOwogICAgIHNpemVDWzBdID0gbV87CiAgICAgc2l6ZUNbMV0gPSBuXzsKQEAgLTUxMiwxMCArNDc5LDEwIEBACiAgICAgVGVuc29ySW5kZXggYV9jb250cmFjdF9kaW0gPSAodHJhbnNfYSA/IDAgOiAxKTsKICAgICBUZW5zb3JJbmRleCBiX2NvbnRyYWN0X2RpbSA9ICh0cmFuc19iID8gMSA6IDApOwogICAgIGRpbXNbMF0gPSBEaW1QYWlyKGFfY29udHJhY3RfZGltLCBiX2NvbnRyYWN0X2RpbSk7Ci0jaWZkZWYgRUlHRU5fVVNFX1NZQ0wgLy8gd2FybXVwIGZvciBzeWNsCisjaWZkZWYgRUlHRU5fVVNFX1NZQ0wgIC8vIHdhcm11cCBmb3Igc3ljbAogICAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgewogICAgICAgQy5kZXZpY2UoZGV2aWNlXykgPSBBLmNvbnRyYWN0KEIsIGRpbXMpOwotICAgICB9CisgICAgfQogI2VuZGlmCiAgICAgU3RhcnRCZW5jaG1hcmtUaW1pbmcoKTsKICAgICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CkBAIC01MjcsMTYgKzQ5NCwxNSBAQAogICB9CiAKICAgdm9pZCBpbml0aWFsaXplKCkgewotICAgIGFfID0gKFQgKikgZGV2aWNlXy5hbGxvY2F0ZShtXyAqIGtfICogc2l6ZW9mKFQpKTsKLSAgICBiXyA9IChUICopIGRldmljZV8uYWxsb2NhdGUoa18gKiBuXyAqIHNpemVvZihUKSk7Ci0gICAgY18gPSAoVCAqKSBkZXZpY2VfLmFsbG9jYXRlKG1fICogbl8gKiBzaXplb2YoVCkpOworICAgIGFfID0gKFQqKWRldmljZV8uYWxsb2NhdGUobV8gKiBrXyAqIHNpemVvZihUKSk7CisgICAgYl8gPSAoVCopZGV2aWNlXy5hbGxvY2F0ZShrXyAqIG5fICogc2l6ZW9mKFQpKTsKKyAgICBjXyA9IChUKilkZXZpY2VfLmFsbG9jYXRlKG1fICogbl8gKiBzaXplb2YoVCkpOwogCiAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGUgbWVtb3J5IHBvb2xzIHRvIHByZXZlbnQgYXNhbiBmcm9tCiAgICAgLy8gY29tcGxhaW5pbmcuCiAgICAgZGV2aWNlXy5maWxsKGFfLCBhXyArIG1fICoga18sIFQoMTIpKTsKICAgICBkZXZpY2VfLmZpbGwoYl8sIGJfICsga18gKiBuXywgVCgyMykpOwogICAgIGRldmljZV8uZmlsbChjXywgY18gKyBtXyAqIG5fLCBUKDMxKSk7Ci0KICAgfQogCiAgIGlubGluZSB2b2lkIGZpbmFsaXplQmVuY2htYXJrKGludDY0X3QgbnVtX2l0ZW1zKSB7CkBAIC01NTQsNyArNTIwLDYgQEAKICAgICBTZXRCZW5jaG1hcmtGbG9wc1Byb2Nlc3NlZChudW1faXRlbXMpOwogICB9CiAKLQogICBUZW5zb3JJbmRleCBtXzsKICAgVGVuc29ySW5kZXgga187CiAgIFRlbnNvckluZGV4IG5fOwpkaWZmIC0tZ2l0IGEvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrc19jcHUuY2MgYi9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzX2NwdS5jYwppbmRleCA4OTQ3ZjRiLi41OTljYTRiIDEwMDY0NAotLS0gYS9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzX2NwdS5jYworKysgYi9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzX2NwdS5jYwpAQCAtNCw5ICs0LDkgQEAKIAogI2luY2x1ZGUgInRlbnNvcl9iZW5jaG1hcmtzLmgiCiAKLSNkZWZpbmUgQ1JFQVRFX1RIUkVBRF9QT09MKHRocmVhZHMpICAgICAgICAgICAgIFwKLUVpZ2VuOjpUaHJlYWRQb29sIHBvb2wodGhyZWFkcyk7ICAgICAgICAgICAgICAgIFwKLUVpZ2VuOjpUaHJlYWRQb29sRGV2aWNlIGRldmljZSgmcG9vbCwgdGhyZWFkcyk7CisjZGVmaW5lIENSRUFURV9USFJFQURfUE9PTCh0aHJlYWRzKSBcCisgIEVpZ2VuOjpUaHJlYWRQb29sIHBvb2wodGhyZWFkcyk7ICBcCisgIEVpZ2VuOjpUaHJlYWRQb29sRGV2aWNlIGRldmljZSgmcG9vbCwgdGhyZWFkcyk7CiAKIC8vIFNpbXBsZSBmdW5jdGlvbnMKICNkZWZpbmUgQk1fRnVuY0NQVShGVU5DLCBUSFJFQURTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTc4LDcgKzc4LDYgQEAKIEJNX0Z1bmNDUFUoY29sUmVkdWN0aW9uLCA4KTsKIEJNX0Z1bmNDUFUoY29sUmVkdWN0aW9uLCAxMik7CiAKLQogLy8gQ29udHJhY3Rpb25zCiAjZGVmaW5lIEJNX0Z1bmNXaXRoSW5wdXREaW1zQ1BVKEZVTkMsIEQxLCBEMiwgRDMsIFRIUkVBRFMpICAgICAgICAgICAgICAgICAgICAgIFwKICAgc3RhdGljIHZvaWQgQk1fIyNGVU5DIyNfIyNEMSMjeCMjRDIjI3gjI0QzIyNfIyNUSFJFQURTIyNUKGludCBpdGVycywgaW50IE4pIHsgXApAQCAtOTUsNyArOTQsNiBAQAogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIEJFTkNITUFSS19SQU5HRShCTV8jI0ZVTkMjI18jI0QxIyN4IyNEMiMjeCMjRDMjI18jI1RIUkVBRFMjI1QsIDEwLCA1MDAwKTsKIAotCiBCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgTiwgTiwgTiwgMSk7CiBCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgTiwgTiwgTiwgNCk7CiBCTV9GdW5jV2l0aElucHV0RGltc0NQVShjb250cmFjdGlvbiwgTiwgTiwgTiwgOCk7CkBAIC0xMzIsMTUgKzEzMCwxNCBAQAogQk1fRnVuY1dpdGhJbnB1dERpbXNDUFUoY29udHJhY3Rpb24sIE4sIE4sIDEsIDEyKTsKIEJNX0Z1bmNXaXRoSW5wdXREaW1zQ1BVKGNvbnRyYWN0aW9uLCBOLCBOLCAxLCAxNik7CiAKLQogLy8gQ29udm9sdXRpb25zCi0jZGVmaW5lIEJNX0Z1bmNXaXRoS2VybmVsRGltc0NQVShGVU5DLCBESU0xLCBESU0yLCBUSFJFQURTKSAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgdm9pZCBCTV8jI0ZVTkMjI18jI0RJTTEjI3gjI0RJTTIjI18jI1RIUkVBRFMjI1QoaW50IGl0ZXJzLCBpbnQgTikgeyAgIFwKLSAgICBTdG9wQmVuY2htYXJrVGltaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1JFQVRFX1RIUkVBRF9QT09MKFRIUkVBRFMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJlbmNobWFya1N1aXRlPEVpZ2VuOjpUaHJlYWRQb29sRGV2aWNlLCBmbG9hdD4gc3VpdGUoZGV2aWNlLCBOKTsJICAgICAgIFwKLSAgICBzdWl0ZS5GVU5DKGl0ZXJzLCBESU0xLCBESU0yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBCTV9GdW5jV2l0aEtlcm5lbERpbXNDUFUoRlVOQywgRElNMSwgRElNMiwgVEhSRUFEUykgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIEJNXyMjRlVOQyMjXyMjRElNMSMjeCMjRElNMiMjXyMjVEhSRUFEUyMjVChpbnQgaXRlcnMsIGludCBOKSB7IFwKKyAgICBTdG9wQmVuY2htYXJrVGltaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENSRUFURV9USFJFQURfUE9PTChUSFJFQURTKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQmVuY2htYXJrU3VpdGU8RWlnZW46OlRocmVhZFBvb2xEZXZpY2UsIGZsb2F0PiBzdWl0ZShkZXZpY2UsIE4pOyAgICAgICAgIFwKKyAgICBzdWl0ZS5GVU5DKGl0ZXJzLCBESU0xLCBESU0yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIEJFTkNITUFSS19SQU5HRShCTV8jI0ZVTkMjI18jI0RJTTEjI3gjI0RJTTIjI18jI1RIUkVBRFMjI1QsIDEyOCwgNTAwMCk7CiAKIEJNX0Z1bmNXaXRoS2VybmVsRGltc0NQVShjb252b2x1dGlvbiwgNywgMSwgNCk7CmRpZmYgLS1naXQgYS9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzX2ZwMTZfZ3B1LmN1IGIvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrc19mcDE2X2dwdS5jdQppbmRleCBkNjNmZjhiLi4zYWQ1M2IxIDEwMDY0NAotLS0gYS9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzX2ZwMTZfZ3B1LmN1CisrKyBiL2JlbmNoL3RlbnNvcnMvdGVuc29yX2JlbmNobWFya3NfZnAxNl9ncHUuY3UKQEAgLTcsMjAgKzcsMjAgQEAKICNpbmNsdWRlICJ0ZW5zb3JfYmVuY2htYXJrcy5oIgogCiAvLyBTaW1wbGUgZnVuY3Rpb25zCi0jZGVmaW5lIEJNX0Z1bmNHUFUoRlVOQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgdm9pZCBCTV8jI0ZVTkMoaW50IGl0ZXJzLCBpbnQgTikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTdG9wQmVuY2htYXJrVGltaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEVpZ2VuOjpHcHVEZXZpY2UgZGV2aWNlKCZzdHJlYW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBCZW5jaG1hcmtTdWl0ZTxFaWdlbjo6R3B1RGV2aWNlLCBFaWdlbjo6aGFsZj4gc3VpdGUoZGV2aWNlLCBOKTsgICAgICAgICAgICBcCi0gICAgY3VkYURldmljZVN5bmNocm9uaXplKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN1aXRlLkZVTkMoaXRlcnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIEJNX0Z1bmNHUFUoRlVOQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgQk1fIyNGVU5DKGludCBpdGVycywgaW50IE4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFN0b3BCZW5jaG1hcmtUaW1pbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6R3B1RGV2aWNlIGRldmljZSgmc3RyZWFtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJlbmNobWFya1N1aXRlPEVpZ2VuOjpHcHVEZXZpY2UsIEVpZ2VuOjpoYWxmPiBzdWl0ZShkZXZpY2UsIE4pOyBcCisgICAgY3VkYURldmljZVN5bmNocm9uaXplKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdWl0ZS5GVU5DKGl0ZXJzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIEJFTkNITUFSS19SQU5HRShCTV8jI0ZVTkMsIDEwLCA1MDAwKTsKIAogQk1fRnVuY0dQVShtZW1jcHkpOwogQk1fRnVuY0dQVSh0eXBlQ2FzdGluZyk7Ci0vL0JNX0Z1bmNHUFUocmFuZG9tKTsKKy8vIEJNX0Z1bmNHUFUocmFuZG9tKTsKIEJNX0Z1bmNHUFUoc2xpY2luZyk7CiBCTV9GdW5jR1BVKHJvd0NoaXApOwogQk1fRnVuY0dQVShjb2xDaGlwKTsKQEAgLTM1LDM2ICszNSwzMyBAQAogQk1fRnVuY0dQVShjb2xSZWR1Y3Rpb24pOwogQk1fRnVuY0dQVShmdWxsUmVkdWN0aW9uKTsKIAotCiAvLyBDb250cmFjdGlvbnMKLSNkZWZpbmUgQk1fRnVuY1dpdGhJbnB1dERpbXNHUFUoRlVOQywgRDEsIEQyLCBEMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyB2b2lkIEJNXyMjRlVOQyMjXyMjRDEjI3gjI0QyIyN4IyNEMyhpbnQgaXRlcnMsIGludCBOKSB7ICAgICAgICAgICAgICAgXAotICAgIFN0b3BCZW5jaG1hcmtUaW1pbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRWlnZW46OkdwdURldmljZSBkZXZpY2UoJnN0cmVhbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJlbmNobWFya1N1aXRlPEVpZ2VuOjpHcHVEZXZpY2UsIEVpZ2VuOjpoYWxmPiBzdWl0ZShkZXZpY2UsIEQxLCBEMiwgRDMpOyAgIFwKLSAgICBjdWRhRGV2aWNlU3luY2hyb25pemUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3VpdGUuRlVOQyhpdGVycyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgQk1fRnVuY1dpdGhJbnB1dERpbXNHUFUoRlVOQywgRDEsIEQyLCBEMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdm9pZCBCTV8jI0ZVTkMjI18jI0QxIyN4IyNEMiMjeCMjRDMoaW50IGl0ZXJzLCBpbnQgTikgeyAgICAgICAgICAgICBcCisgICAgU3RvcEJlbmNobWFya1RpbWluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpHcHVEZXZpY2UgZGV2aWNlKCZzdHJlYW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQmVuY2htYXJrU3VpdGU8RWlnZW46OkdwdURldmljZSwgRWlnZW46OmhhbGY+IHN1aXRlKGRldmljZSwgRDEsIEQyLCBEMyk7IFwKKyAgICBjdWRhRGV2aWNlU3luY2hyb25pemUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN1aXRlLkZVTkMoaXRlcnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgQkVOQ0hNQVJLX1JBTkdFKEJNXyMjRlVOQyMjXyMjRDEjI3gjI0QyIyN4IyNEMywgMTAsIDUwMDApOwogCi0KIEJNX0Z1bmNXaXRoSW5wdXREaW1zR1BVKGNvbnRyYWN0aW9uLCBOLCBOLCBOKTsKIEJNX0Z1bmNXaXRoSW5wdXREaW1zR1BVKGNvbnRyYWN0aW9uLCA2NCwgTiwgTik7CiBCTV9GdW5jV2l0aElucHV0RGltc0dQVShjb250cmFjdGlvbiwgTiwgNjQsIE4pOwogQk1fRnVuY1dpdGhJbnB1dERpbXNHUFUoY29udHJhY3Rpb24sIE4sIE4sIDY0KTsKIAotCiAvLyBDb252b2x1dGlvbnMKLSNkZWZpbmUgQk1fRnVuY1dpdGhLZXJuZWxEaW1zR1BVKEZVTkMsIERJTTEsIERJTTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyB2b2lkIEJNXyMjRlVOQyMjXyMjRElNMSMjeCMjRElNMihpbnQgaXRlcnMsIGludCBOKSB7ICAgICAgICAgICAgICAgICAgXAotICAgIFN0b3BCZW5jaG1hcmtUaW1pbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRWlnZW46OkdwdURldmljZSBkZXZpY2UoJnN0cmVhbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJlbmNobWFya1N1aXRlPEVpZ2VuOjpHcHVEZXZpY2UsIEVpZ2VuOjpoYWxmPiBzdWl0ZShkZXZpY2UsIE4pOyAgICAgICAgICAgIFwKLSAgICBjdWRhRGV2aWNlU3luY2hyb25pemUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3VpdGUuRlVOQyhpdGVycywgRElNMSwgRElNMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgQk1fRnVuY1dpdGhLZXJuZWxEaW1zR1BVKEZVTkMsIERJTTEsIERJTTIpICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdm9pZCBCTV8jI0ZVTkMjI18jI0RJTTEjI3gjI0RJTTIoaW50IGl0ZXJzLCBpbnQgTikgeyAgICAgICBcCisgICAgU3RvcEJlbmNobWFya1RpbWluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpHcHVEZXZpY2UgZGV2aWNlKCZzdHJlYW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQmVuY2htYXJrU3VpdGU8RWlnZW46OkdwdURldmljZSwgRWlnZW46OmhhbGY+IHN1aXRlKGRldmljZSwgTik7IFwKKyAgICBjdWRhRGV2aWNlU3luY2hyb25pemUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN1aXRlLkZVTkMoaXRlcnMsIERJTTEsIERJTTIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgQkVOQ0hNQVJLX1JBTkdFKEJNXyMjRlVOQyMjXyMjRElNMSMjeCMjRElNMiwgMTI4LCA1MDAwKTsKIAogLyoKZGlmZiAtLWdpdCBhL2JlbmNoL3RlbnNvcnMvdGVuc29yX2JlbmNobWFya3NfZ3B1LmN1IGIvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrc19ncHUuY3UKaW5kZXggYzc3ODEwMi4uNzhkMTZhYSAxMDA2NDQKLS0tIGEvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrc19ncHUuY3UKKysrIGIvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrc19ncHUuY3UKQEAgLTcsMTUgKzcsMTUgQEAKICNpbmNsdWRlICJ0ZW5zb3JfYmVuY2htYXJrcy5oIgogCiAvLyBTaW1wbGUgZnVuY3Rpb25zCi0jZGVmaW5lIEJNX0Z1bmNHUFUoRlVOQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgdm9pZCBCTV8jI0ZVTkMoaW50IGl0ZXJzLCBpbnQgTikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTdG9wQmVuY2htYXJrVGltaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEVpZ2VuOjpHcHVEZXZpY2UgZGV2aWNlKCZzdHJlYW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBCZW5jaG1hcmtTdWl0ZTxFaWdlbjo6R3B1RGV2aWNlLCBmbG9hdD4gc3VpdGUoZGV2aWNlLCBOKTsgICAgICAgICAgICAgICAgICBcCi0gICAgY3VkYURldmljZVN5bmNocm9uaXplKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN1aXRlLkZVTkMoaXRlcnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIEJNX0Z1bmNHUFUoRlVOQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgQk1fIyNGVU5DKGludCBpdGVycywgaW50IE4pIHsgICAgICAgICAgICAgICAgICAgXAorICAgIFN0b3BCZW5jaG1hcmtUaW1pbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6R3B1RGV2aWNlIGRldmljZSgmc3RyZWFtKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJlbmNobWFya1N1aXRlPEVpZ2VuOjpHcHVEZXZpY2UsIGZsb2F0PiBzdWl0ZShkZXZpY2UsIE4pOyBcCisgICAgY3VkYURldmljZVN5bmNocm9uaXplKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdWl0ZS5GVU5DKGl0ZXJzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIEJFTkNITUFSS19SQU5HRShCTV8jI0ZVTkMsIDEwLCA1MDAwKTsKIAogQk1fRnVuY0dQVShtZW1jcHkpOwpAQCAtMzUsMzYgKzM1LDMzIEBACiBCTV9GdW5jR1BVKGNvbFJlZHVjdGlvbik7CiBCTV9GdW5jR1BVKGZ1bGxSZWR1Y3Rpb24pOwogCi0KIC8vIENvbnRyYWN0aW9ucwotI2RlZmluZSBCTV9GdW5jV2l0aElucHV0RGltc0dQVShGVU5DLCBEMSwgRDIsIEQzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIHZvaWQgQk1fIyNGVU5DIyNfIyNEMSMjeCMjRDIjI3gjI0QzKGludCBpdGVycywgaW50IE4pIHsgICAgICAgICAgICAgICBcCi0gICAgU3RvcEJlbmNobWFya1RpbWluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBFaWdlbjo6R3B1RGV2aWNlIGRldmljZSgmc3RyZWFtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQmVuY2htYXJrU3VpdGU8RWlnZW46OkdwdURldmljZSwgZmxvYXQ+IHN1aXRlKGRldmljZSwgRDEsIEQyLCBEMyk7ICAgICAgICAgXAotICAgIGN1ZGFEZXZpY2VTeW5jaHJvbml6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdWl0ZS5GVU5DKGl0ZXJzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBCTV9GdW5jV2l0aElucHV0RGltc0dQVShGVU5DLCBEMSwgRDIsIEQzKSAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIEJNXyMjRlVOQyMjXyMjRDEjI3gjI0QyIyN4IyNEMyhpbnQgaXRlcnMsIGludCBOKSB7ICAgICAgIFwKKyAgICBTdG9wQmVuY2htYXJrVGltaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRWlnZW46OkdwdURldmljZSBkZXZpY2UoJnN0cmVhbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCZW5jaG1hcmtTdWl0ZTxFaWdlbjo6R3B1RGV2aWNlLCBmbG9hdD4gc3VpdGUoZGV2aWNlLCBEMSwgRDIsIEQzKTsgXAorICAgIGN1ZGFEZXZpY2VTeW5jaHJvbml6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3VpdGUuRlVOQyhpdGVycyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBCRU5DSE1BUktfUkFOR0UoQk1fIyNGVU5DIyNfIyNEMSMjeCMjRDIjI3gjI0QzLCAxMCwgNTAwMCk7CiAKLQogQk1fRnVuY1dpdGhJbnB1dERpbXNHUFUoY29udHJhY3Rpb24sIE4sIE4sIE4pOwogQk1fRnVuY1dpdGhJbnB1dERpbXNHUFUoY29udHJhY3Rpb24sIDY0LCBOLCBOKTsKIEJNX0Z1bmNXaXRoSW5wdXREaW1zR1BVKGNvbnRyYWN0aW9uLCBOLCA2NCwgTik7CiBCTV9GdW5jV2l0aElucHV0RGltc0dQVShjb250cmFjdGlvbiwgTiwgTiwgNjQpOwogCi0KIC8vIENvbnZvbHV0aW9ucwotI2RlZmluZSBCTV9GdW5jV2l0aEtlcm5lbERpbXNHUFUoRlVOQywgRElNMSwgRElNMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIHZvaWQgQk1fIyNGVU5DIyNfIyNESU0xIyN4IyNESU0yKGludCBpdGVycywgaW50IE4pIHsgICAgICAgICAgICAgICAgICBcCi0gICAgU3RvcEJlbmNobWFya1RpbWluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBFaWdlbjo6R3B1RGV2aWNlIGRldmljZSgmc3RyZWFtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQmVuY2htYXJrU3VpdGU8RWlnZW46OkdwdURldmljZSwgZmxvYXQ+IHN1aXRlKGRldmljZSwgTik7ICAgICAgICAgICAgICAgICAgXAotICAgIGN1ZGFEZXZpY2VTeW5jaHJvbml6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdWl0ZS5GVU5DKGl0ZXJzLCBESU0xLCBESU0yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBCTV9GdW5jV2l0aEtlcm5lbERpbXNHUFUoRlVOQywgRElNMSwgRElNMikgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIEJNXyMjRlVOQyMjXyMjRElNMSMjeCMjRElNMihpbnQgaXRlcnMsIGludCBOKSB7IFwKKyAgICBTdG9wQmVuY2htYXJrVGltaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRWlnZW46OkdwdURldmljZSBkZXZpY2UoJnN0cmVhbSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCZW5jaG1hcmtTdWl0ZTxFaWdlbjo6R3B1RGV2aWNlLCBmbG9hdD4gc3VpdGUoZGV2aWNlLCBOKTsgXAorICAgIGN1ZGFEZXZpY2VTeW5jaHJvbml6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3VpdGUuRlVOQyhpdGVycywgRElNMSwgRElNMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBCRU5DSE1BUktfUkFOR0UoQk1fIyNGVU5DIyNfIyNESU0xIyN4IyNESU0yLCAxMjgsIDUwMDApOwogCiBCTV9GdW5jV2l0aEtlcm5lbERpbXNHUFUoY29udm9sdXRpb24sIDcsIDEpOwpkaWZmIC0tZ2l0IGEvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrc19zeWNsLmNjIGIvYmVuY2gvdGVuc29ycy90ZW5zb3JfYmVuY2htYXJrc19zeWNsLmNjCmluZGV4IDZmOWY4NzEuLmIzZmI1ZmIgMTAwNjQ0Ci0tLSBhL2JlbmNoL3RlbnNvcnMvdGVuc29yX2JlbmNobWFya3Nfc3ljbC5jYworKysgYi9iZW5jaC90ZW5zb3JzL3RlbnNvcl9iZW5jaG1hcmtzX3N5Y2wuY2MKQEAgLTExNSw3ICsxMTUsNiBAQAogQk1fRnVuY1dpdGhJbnB1dERpbXNHUFUoY29udHJhY3Rpb25Sb3dNYWpvckJULCBOLCA2NCwgTik7CiBCTV9GdW5jV2l0aElucHV0RGltc0dQVShjb250cmFjdGlvblJvd01ham9yQlQsIE4sIE4sIDY0KTsKIAotCiBCTV9GdW5jV2l0aElucHV0RGltc0dQVShjb250cmFjdGlvblJvd01ham9yQUJULCBOLCBOLCBOKTsKIEJNX0Z1bmNXaXRoSW5wdXREaW1zR1BVKGNvbnRyYWN0aW9uUm93TWFqb3JBQlQsIDY0LCBOLCBOKTsKIEJNX0Z1bmNXaXRoSW5wdXREaW1zR1BVKGNvbnRyYWN0aW9uUm93TWFqb3JBQlQsIE4sIDY0LCBOKTsKZGlmZiAtLWdpdCBhL2JlbmNoL3RlbnNvcnMvdGVuc29yX2NvbnRyYWN0X3N5Y2xfYmVuY2guY2MgYi9iZW5jaC90ZW5zb3JzL3RlbnNvcl9jb250cmFjdF9zeWNsX2JlbmNoLmNjCmluZGV4IGIxZDg5ZDIuLjMwMDY5NWIgMTAwNjQ0Ci0tLSBhL2JlbmNoL3RlbnNvcnMvdGVuc29yX2NvbnRyYWN0X3N5Y2xfYmVuY2guY2MKKysrIGIvYmVuY2gvdGVuc29ycy90ZW5zb3JfY29udHJhY3Rfc3ljbF9iZW5jaC5jYwpAQCAtMjksMzAgKzI5LDMyIEBACiB1c2luZyBFaWdlbjo6VGVuc29yTWFwOwogc3RkOjpvZnN0cmVhbSBvdXQoIlJlc3VsdC50eHQiKTsKIAotc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jaz4gZ2V0X3RpbWUoKXsKK3N0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IGdldF90aW1lKCkgewogICBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrPiBzdGFydCwgZW5kOwogICByZXR1cm4gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFN0YXJ0LCB0eXBlbmFtZSBFbmQsIHR5cGVuYW1lIFRlbnNvckluZGV4Pgotdm9pZCBmaW5hbGl6ZUJlbmNobWFyayhTdGFydCBzdGFydCwgRW5kIGVuZCwgVGVuc29ySW5kZXggbV8sIFRlbnNvckluZGV4IGtfLCBUZW5zb3JJbmRleCBuXyAsIFRlbnNvckluZGV4IG51bV9pdGVycywgc3RkOjpzdHJpbmcgbmFtZSl7Ci0KLSAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gZWxhcHNlZF9zZWNvbmRzID0gZW5kLXN0YXJ0OwotICBzdGQ6OmNvdXQgPDwiS2VybmVsIE5hbWUgOiAiIDw8IG5hbWUgPDwgIiwgTSA6ICIgPDwgbV8gPDwgIiwgIE4gOiAiIDw8IG5fIDw8ICIsIEsgOiAiIDw8IGtfIDw8ICIgR0ZMT1AvcyA6ICIgPDwKLSAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KChzdGF0aWNfY2FzdDxpbnQ2NF90PigyKSAqIG1fICogbl8gKiBrXyAqIG51bV9pdGVycykvIGVsYXBzZWRfc2Vjb25kcy5jb3VudCgpKSAqIDFlLTkgPDwgIlxuIjsKLSAgICBvdXQgPDwiS2VybmVsIE5hbWUgOiAiIDw8IG5hbWUgPDwgIiwgTSA6ICIgPDwgbV8gPDwgIiwgIE4gOiAiIDw8IG5fIDw8ICIsIEsgOiAiIDw8IGtfIDw8ICIgR0ZMT1AvcyA6ICIgPDwKLSAgICBzdGF0aWNfY2FzdDxmbG9hdD4oKHN0YXRpY19jYXN0PGludDY0X3Q+KDIpICogbV8gKiBuXyAqIGtfICogbnVtX2l0ZXJzKS8gZWxhcHNlZF9zZWNvbmRzLmNvdW50KCkpICogMWUtOSA8PCAiXG4iOwordGVtcGxhdGUgPHR5cGVuYW1lIFN0YXJ0LCB0eXBlbmFtZSBFbmQsIHR5cGVuYW1lIFRlbnNvckluZGV4Pgordm9pZCBmaW5hbGl6ZUJlbmNobWFyayhTdGFydCBzdGFydCwgRW5kIGVuZCwgVGVuc29ySW5kZXggbV8sIFRlbnNvckluZGV4IGtfLCBUZW5zb3JJbmRleCBuXywgVGVuc29ySW5kZXggbnVtX2l0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lKSB7CisgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IGVsYXBzZWRfc2Vjb25kcyA9IGVuZCAtIHN0YXJ0OworICBzdGQ6OmNvdXQgPDwgIktlcm5lbCBOYW1lIDogIiA8PCBuYW1lIDw8ICIsIE0gOiAiIDw8IG1fIDw8ICIsICBOIDogIiA8PCBuXyA8PCAiLCBLIDogIiA8PCBrXyA8PCAiIEdGTE9QL3MgOiAiCisgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxmbG9hdD4oKHN0YXRpY19jYXN0PGludDY0X3Q+KDIpICogbV8gKiBuXyAqIGtfICogbnVtX2l0ZXJzKSAvIGVsYXBzZWRfc2Vjb25kcy5jb3VudCgpKSAqIDFlLTkKKyAgICAgICAgICAgIDw8ICJcbiI7CisgIG91dCA8PCAiS2VybmVsIE5hbWUgOiAiIDw8IG5hbWUgPDwgIiwgTSA6ICIgPDwgbV8gPDwgIiwgIE4gOiAiIDw8IG5fIDw8ICIsIEsgOiAiIDw8IGtfIDw8ICIgR0ZMT1AvcyA6ICIKKyAgICAgIDw8IHN0YXRpY19jYXN0PGZsb2F0Pigoc3RhdGljX2Nhc3Q8aW50NjRfdD4oMikgKiBtXyAqIG5fICoga18gKiBudW1faXRlcnMpIC8gZWxhcHNlZF9zZWNvbmRzLmNvdW50KCkpICogMWUtOQorICAgICAgPDwgIlxuIjsKIH0KIAogLy8gZG8gYSBjb250cmFjdGlvbiB3aGljaCBpcyBlcXVpdmFsZW50IHRvIGEgbWF0cml4IG11bHRpcGxpY2F0aW9uCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBEZXZpY2UsIHR5cGVuYW1lIFRlbnNvckluZGV4PgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERldmljZSwgdHlwZW5hbWUgVGVuc29ySW5kZXg+CiB2b2lkIGNvbnRyYWN0aW9uKGNvbnN0IERldmljZSYgZGV2aWNlXywgVGVuc29ySW5kZXggbnVtX2l0ZXJzLCBUZW5zb3JJbmRleCBtXywgVGVuc29ySW5kZXgga18sIFRlbnNvckluZGV4IG5fKSB7CiAgIFQqIGFfOwogICBUKiBiXzsKICAgVCogY187Ci0gIGFfID0gKFQgKikgZGV2aWNlXy5hbGxvY2F0ZShtXyAqIGtfICogc2l6ZW9mKFQpKTsKLSAgYl8gPSAoVCAqKSBkZXZpY2VfLmFsbG9jYXRlKGtfICogbl8gKiBzaXplb2YoVCkpOwotICBjXyA9IChUICopIGRldmljZV8uYWxsb2NhdGUobV8gKiBuXyAqIHNpemVvZihUKSk7CisgIGFfID0gKFQqKWRldmljZV8uYWxsb2NhdGUobV8gKiBrXyAqIHNpemVvZihUKSk7CisgIGJfID0gKFQqKWRldmljZV8uYWxsb2NhdGUoa18gKiBuXyAqIHNpemVvZihUKSk7CisgIGNfID0gKFQqKWRldmljZV8uYWxsb2NhdGUobV8gKiBuXyAqIHNpemVvZihUKSk7CiAKICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGUgbWVtb3J5IHBvb2xzIHRvIHByZXZlbnQgYXNhbiBmcm9tCiAgIC8vIGNvbXBsYWluaW5nLgpAQCAtNzcsMTYgKzc5LDE2IEBACiAgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yPFQsIDI+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CiAgIEVpZ2VuOjphcnJheTxEaW1QYWlyLCAxPiBkaW1zOwogICBkaW1zWzBdID0gRGltUGFpcigxLCAwKTsKLSNpZmRlZiBFSUdFTl9VU0VfU1lDTCAvLyB3YXJtdXAgZm9yIHN5Y2wKKyNpZmRlZiBFSUdFTl9VU0VfU1lDTCAgLy8gd2FybXVwIGZvciBzeWNsCiAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgewogICAgIEMuZGV2aWNlKGRldmljZV8pID0gQS5jb250cmFjdChCLCBkaW1zKTsKLSAgIH0KKyAgfQogI2VuZGlmCiAgIGF1dG8gc3RhcnQgPSBnZXRfdGltZSgpOwogICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CiAgICAgQy5kZXZpY2UoZGV2aWNlXykgPSBBLmNvbnRyYWN0KEIsIGRpbXMpOwogICB9Ci0gYXV0byBlbmQgPSBnZXRfdGltZSgpOworICBhdXRvIGVuZCA9IGdldF90aW1lKCk7CiAgIC8vIFJlY29yZCB0aGUgbnVtYmVyIG9mIEZMT1BzIGV4ZWN1dGVkIHBlciBzZWNvbmQgKHNpemVfIG11bHRpcGxpY2F0aW9ucyBhbmQKICAgLy8gYWRkaXRpb25zIGZvciBlYWNoIHZhbHVlIGluIHRoZSByZXN1bHRpbmcgdGVuc29yKQogICBmaW5hbGl6ZUJlbmNobWFyayhzdGFydCwgZW5kLCBtXywga18sIG5fLCBudW1faXRlcnMsICJjb250cmFjdGlvbiIpOwpAQCAtOTYsMTcgKzk4LDE1IEBACiAgIGRldmljZV8uc3luY2hyb25pemUoKTsKIH0KIAotCi0KIC8vIGRvIGEgY29udHJhY3Rpb24gd2hpY2ggaXMgZXF1aXZhbGVudCB0byBhIG1hdHJpeCBtdWx0aXBsaWNhdGlvbgotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGV2aWNlLCB0eXBlbmFtZSBUZW5zb3JJbmRleD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBEZXZpY2UsIHR5cGVuYW1lIFRlbnNvckluZGV4Pgogdm9pZCBjb250cmFjdGlvblJvd01ham9yKGNvbnN0IERldmljZSYgZGV2aWNlXywgVGVuc29ySW5kZXggbnVtX2l0ZXJzLCBUZW5zb3JJbmRleCBtXywgVGVuc29ySW5kZXgga18sIFRlbnNvckluZGV4IG5fKSB7CiAgIFQqIGFfOwogICBUKiBiXzsKICAgVCogY187Ci0gIGFfID0gKFQgKikgZGV2aWNlXy5hbGxvY2F0ZShtXyAqIGtfICogc2l6ZW9mKFQpKTsKLSAgYl8gPSAoVCAqKSBkZXZpY2VfLmFsbG9jYXRlKGtfICogbl8gKiBzaXplb2YoVCkpOwotICBjXyA9IChUICopIGRldmljZV8uYWxsb2NhdGUobV8gKiBuXyAqIHNpemVvZihUKSk7CisgIGFfID0gKFQqKWRldmljZV8uYWxsb2NhdGUobV8gKiBrXyAqIHNpemVvZihUKSk7CisgIGJfID0gKFQqKWRldmljZV8uYWxsb2NhdGUoa18gKiBuXyAqIHNpemVvZihUKSk7CisgIGNfID0gKFQqKWRldmljZV8uYWxsb2NhdGUobV8gKiBuXyAqIHNpemVvZihUKSk7CiAKICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGUgbWVtb3J5IHBvb2xzIHRvIHByZXZlbnQgYXNhbiBmcm9tCiAgIC8vIGNvbXBsYWluaW5nLgpAQCAtMTMxLDEwICsxMzEsMTAgQEAKICAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3I8VCwgMj46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKICAgRWlnZW46OmFycmF5PERpbVBhaXIsIDE+IGRpbXM7CiAgIGRpbXNbMF0gPSBEaW1QYWlyKDEsIDApOwotI2lmZGVmIEVJR0VOX1VTRV9TWUNMIC8vIHdhcm11cCBmb3Igc3ljbAorI2lmZGVmIEVJR0VOX1VTRV9TWUNMICAvLyB3YXJtdXAgZm9yIHN5Y2wKICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCAxMDsgKytpdGVyKSB7CiAgICAgQy5kZXZpY2UoZGV2aWNlXykgPSBBLmNvbnRyYWN0KEIsIGRpbXMpOwotICAgfQorICB9CiAjZW5kaWYKICAgYXV0byBzdGFydCA9IGdldF90aW1lKCk7CiAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgbnVtX2l0ZXJzOyArK2l0ZXIpIHsKQEAgLTE1MCwxNSArMTUwLDE0IEBACiAgIGRldmljZV8uc3luY2hyb25pemUoKTsKIH0KIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBEZXZpY2UsIHR5cGVuYW1lIFRlbnNvckluZGV4PgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERldmljZSwgdHlwZW5hbWUgVGVuc29ySW5kZXg+CiB2b2lkIGNvbnRyYWN0aW9uQVQoY29uc3QgRGV2aWNlJiBkZXZpY2VfLCBUZW5zb3JJbmRleCBudW1faXRlcnMsIFRlbnNvckluZGV4IG1fLCBUZW5zb3JJbmRleCBrXywgVGVuc29ySW5kZXggbl8pIHsKICAgVCogYV87CiAgIFQqIGJfOwogICBUKiBjXzsKLSAgYV8gPSAoVCAqKSBkZXZpY2VfLmFsbG9jYXRlKG1fICoga18gKiBzaXplb2YoVCkpOwotICBiXyA9IChUICopIGRldmljZV8uYWxsb2NhdGUoa18gKiBuXyAqIHNpemVvZihUKSk7Ci0gIGNfID0gKFQgKikgZGV2aWNlXy5hbGxvY2F0ZShtXyAqIG5fICogc2l6ZW9mKFQpKTsKKyAgYV8gPSAoVCopZGV2aWNlXy5hbGxvY2F0ZShtXyAqIGtfICogc2l6ZW9mKFQpKTsKKyAgYl8gPSAoVCopZGV2aWNlXy5hbGxvY2F0ZShrXyAqIG5fICogc2l6ZW9mKFQpKTsKKyAgY18gPSAoVCopZGV2aWNlXy5hbGxvY2F0ZShtXyAqIG5fICogc2l6ZW9mKFQpKTsKIAogICAvLyBJbml0aWFsaXplIHRoZSBjb250ZW50IG9mIHRoZSBtZW1vcnkgcG9vbHMgdG8gcHJldmVudCBhc2FuIGZyb20KICAgLy8gY29tcGxhaW5pbmcuCkBAIC0xODIsMTAgKzE4MSwxMCBAQAogICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvcjxULCAyPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOwogICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMT4gZGltczsKICAgZGltc1swXSA9IERpbVBhaXIoMCwgMCk7Ci0jaWZkZWYgRUlHRU5fVVNFX1NZQ0wgLy8gd2FybXVwIGZvciBzeWNsCisjaWZkZWYgRUlHRU5fVVNFX1NZQ0wgIC8vIHdhcm11cCBmb3Igc3ljbAogICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IDEwOyArK2l0ZXIpIHsKICAgICBDLmRldmljZShkZXZpY2VfKSA9IEEuY29udHJhY3QoQiwgZGltcyk7Ci0gICB9CisgIH0KICNlbmRpZgogICBhdXRvIHN0YXJ0ID0gZ2V0X3RpbWUoKTsKICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCBudW1faXRlcnM7ICsraXRlcikgewpAQCAtMTk5LDE3ICsxOTgsMTYgQEAKICAgZGV2aWNlXy5kZWFsbG9jYXRlKGJfKTsKICAgZGV2aWNlXy5kZWFsbG9jYXRlKGNfKTsKICAgZGV2aWNlXy5zeW5jaHJvbml6ZSgpOwotCiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERldmljZSwgdHlwZW5hbWUgVGVuc29ySW5kZXg+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGV2aWNlLCB0eXBlbmFtZSBUZW5zb3JJbmRleD4KIHZvaWQgY29udHJhY3Rpb25CVChjb25zdCBEZXZpY2UmIGRldmljZV8sIFRlbnNvckluZGV4IG51bV9pdGVycywgVGVuc29ySW5kZXggbV8sIFRlbnNvckluZGV4IGtfLCBUZW5zb3JJbmRleCBuXykgewogICBUKiBhXzsKICAgVCogYl87CiAgIFQqIGNfOwotICBhXyA9IChUICopIGRldmljZV8uYWxsb2NhdGUobV8gKiBrXyAqIHNpemVvZihUKSk7Ci0gIGJfID0gKFQgKikgZGV2aWNlXy5hbGxvY2F0ZShrXyAqIG5fICogc2l6ZW9mKFQpKTsKLSAgY18gPSAoVCAqKSBkZXZpY2VfLmFsbG9jYXRlKG1fICogbl8gKiBzaXplb2YoVCkpOworICBhXyA9IChUKilkZXZpY2VfLmFsbG9jYXRlKG1fICoga18gKiBzaXplb2YoVCkpOworICBiXyA9IChUKilkZXZpY2VfLmFsbG9jYXRlKGtfICogbl8gKiBzaXplb2YoVCkpOworICBjXyA9IChUKilkZXZpY2VfLmFsbG9jYXRlKG1fICogbl8gKiBzaXplb2YoVCkpOwogCiAgIC8vIEluaXRpYWxpemUgdGhlIGNvbnRlbnQgb2YgdGhlIG1lbW9yeSBwb29scyB0byBwcmV2ZW50IGFzYW4gZnJvbQogICAvLyBjb21wbGFpbmluZy4KQEAgLTIzNCwxMCArMjMyLDEwIEBACiAgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yPFQsIDI+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CiAgIEVpZ2VuOjphcnJheTxEaW1QYWlyLCAxPiBkaW1zOwogICBkaW1zWzBdID0gRGltUGFpcigxLCAxKTsKLSNpZmRlZiBFSUdFTl9VU0VfU1lDTCAvLyB3YXJtdXAgZm9yIHN5Y2wKKyNpZmRlZiBFSUdFTl9VU0VfU1lDTCAgLy8gd2FybXVwIGZvciBzeWNsCiAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgewogICAgIEMuZGV2aWNlKGRldmljZV8pID0gQS5jb250cmFjdChCLCBkaW1zKTsKLSAgIH0KKyAgfQogI2VuZGlmCiAgIGF1dG8gc3RhcnQgPSBnZXRfdGltZSgpOwogICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CkBAIC0yNTEsMTcgKzI0OSwxNiBAQAogICBkZXZpY2VfLmRlYWxsb2NhdGUoYl8pOwogICBkZXZpY2VfLmRlYWxsb2NhdGUoY18pOwogICBkZXZpY2VfLnN5bmNocm9uaXplKCk7Ci0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGV2aWNlLCB0eXBlbmFtZSBUZW5zb3JJbmRleD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBEZXZpY2UsIHR5cGVuYW1lIFRlbnNvckluZGV4Pgogdm9pZCBjb250cmFjdGlvbkFCVChjb25zdCBEZXZpY2UmIGRldmljZV8sIFRlbnNvckluZGV4IG51bV9pdGVycywgVGVuc29ySW5kZXggbV8sIFRlbnNvckluZGV4IGtfLCBUZW5zb3JJbmRleCBuXykgewogICBUKiBhXzsKICAgVCogYl87CiAgIFQqIGNfOwotICBhXyA9IChUICopIGRldmljZV8uYWxsb2NhdGUobV8gKiBrXyAqIHNpemVvZihUKSk7Ci0gIGJfID0gKFQgKikgZGV2aWNlXy5hbGxvY2F0ZShrXyAqIG5fICogc2l6ZW9mKFQpKTsKLSAgY18gPSAoVCAqKSBkZXZpY2VfLmFsbG9jYXRlKG1fICogbl8gKiBzaXplb2YoVCkpOworICBhXyA9IChUKilkZXZpY2VfLmFsbG9jYXRlKG1fICoga18gKiBzaXplb2YoVCkpOworICBiXyA9IChUKilkZXZpY2VfLmFsbG9jYXRlKGtfICogbl8gKiBzaXplb2YoVCkpOworICBjXyA9IChUKilkZXZpY2VfLmFsbG9jYXRlKG1fICogbl8gKiBzaXplb2YoVCkpOwogCiAgIC8vIEluaXRpYWxpemUgdGhlIGNvbnRlbnQgb2YgdGhlIG1lbW9yeSBwb29scyB0byBwcmV2ZW50IGFzYW4gZnJvbQogICAvLyBjb21wbGFpbmluZy4KQEAgLTI4NiwxMCArMjgzLDEwIEBACiAgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yPFQsIDI+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CiAgIEVpZ2VuOjphcnJheTxEaW1QYWlyLCAxPiBkaW1zOwogICBkaW1zWzBdID0gRGltUGFpcigwLCAxKTsKLSNpZmRlZiBFSUdFTl9VU0VfU1lDTCAvLyB3YXJtdXAgZm9yIHN5Y2wKKyNpZmRlZiBFSUdFTl9VU0VfU1lDTCAgLy8gd2FybXVwIGZvciBzeWNsCiAgIGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIDwgMTA7ICsraXRlcikgewogICAgIEMuZGV2aWNlKGRldmljZV8pID0gQS5jb250cmFjdChCLCBkaW1zKTsKLSAgIH0KKyAgfQogI2VuZGlmCiAgIGF1dG8gc3RhcnQgPSBnZXRfdGltZSgpOwogICBmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IG51bV9pdGVyczsgKytpdGVyKSB7CkBAIC0zMDksMTAgKzMwNiwxMCBAQAogICBjbDo6c3ljbDo6Z3B1X3NlbGVjdG9yIHNlbGVjdG9yOwogICBFaWdlbjo6UXVldWVJbnRlcmZhY2UgcXVldWUoc2VsZWN0b3IpOwogICBFaWdlbjo6U3ljbERldmljZSBkZXZpY2UoJnF1ZXVlKTsKLSAgaW50NjRfdCBudW1faXRlcnMgPTIwOwotICBmb3IoaW50NjRfdCBtID0gMzI7IG0gPD0gNDA5NjsgbSAqPSAyKQotICAgIGZvcihpbnQ2NF90IGsgPSAzMjsgayA8PSA0MDk2OyBrICo9IDIpCi0gICAgICBmb3IoaW50NjRfdCBuID0gMzI7IG4gPD0gNDA5Njsgbio9IDIpeworICBpbnQ2NF90IG51bV9pdGVycyA9IDIwOworICBmb3IgKGludDY0X3QgbSA9IDMyOyBtIDw9IDQwOTY7IG0gKj0gMikKKyAgICBmb3IgKGludDY0X3QgayA9IDMyOyBrIDw9IDQwOTY7IGsgKj0gMikKKyAgICAgIGZvciAoaW50NjRfdCBuID0gMzI7IG4gPD0gNDA5NjsgbiAqPSAyKSB7CiAgICAgICAgIChjb250cmFjdGlvbjxmbG9hdD4oZGV2aWNlLCBudW1faXRlcnMsIG0sIGssIG4pKTsKICAgICAgICAgKGNvbnRyYWN0aW9uUm93TWFqb3I8ZmxvYXQ+KGRldmljZSwgbnVtX2l0ZXJzLCBtLCBrLCBuKSk7CiAgICAgICAgIChjb250cmFjdGlvbkFUPGZsb2F0PihkZXZpY2UsIG51bV9pdGVycywgbSwgaywgbikpOwpAQCAtMzIwLDYgKzMxNyw2IEBACiAgICAgICAgIChjb250cmFjdGlvbkFCVDxmbG9hdD4oZGV2aWNlLCBudW1faXRlcnMsIG0sIGssIG4pKTsKICAgICAgIH0KICAgcmV0dXJuIDA7Ci0gIH0KK30KIAotI2VuZGlmIC8vIEVJR0VOX0JFTkNIX0NPTlRSQUNUX1NZQ0wKKyNlbmRpZiAgLy8gRUlHRU5fQkVOQ0hfQ09OVFJBQ1RfU1lDTApkaWZmIC0tZ2l0IGEvYmVuY2gvdmR3X25ldy5jcHAgYi9iZW5jaC92ZHdfbmV3LmNwcAppbmRleCBkMjYwNDA0Li44NWJjZDA1IDEwMDY0NAotLS0gYS9iZW5jaC92ZHdfbmV3LmNwcAorKysgYi9iZW5jaC92ZHdfbmV3LmNwcApAQCAtMTksMTcgKzE5LDExIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLVNDQUxBUiBFX1ZEVyhjb25zdCBWZWMgJmludGVyYWN0aW9uczEsIGNvbnN0IFZlYyAmaW50ZXJhY3Rpb25zMikKLXsKLSAgcmV0dXJuIChpbnRlcmFjdGlvbnMyLmN3aXNlKCkvaW50ZXJhY3Rpb25zMSkKLSAgICAgICAgIC5jd2lzZSgpLmN1YmUoKQotICAgICAgICAgLmN3aXNlKCkuc3F1YXJlKCkKLSAgICAgICAgIC5jd2lzZSgpLnNxdWFyZSgpCi0gICAgICAgICAuc3VtKCk7CitTQ0FMQVIgRV9WRFcoY29uc3QgVmVjICZpbnRlcmFjdGlvbnMxLCBjb25zdCBWZWMgJmludGVyYWN0aW9uczIpIHsKKyAgcmV0dXJuIChpbnRlcmFjdGlvbnMyLmN3aXNlKCkgLyBpbnRlcmFjdGlvbnMxKS5jd2lzZSgpLmN1YmUoKS5jd2lzZSgpLnNxdWFyZSgpLmN3aXNlKCkuc3F1YXJlKCkuc3VtKCk7CiB9CiAKLWludCBtYWluKCkgCi17CitpbnQgbWFpbigpIHsKICAgLy8KICAgLy8gICAgICAgICAgMSAgIDIgICAzICAgNCAgLi4uIChpbnRlcmFjdGlvbnMpCiAgIC8vIGthICAgICAgIC4gICAuICAgLiAgIC4gIC4uLgpAQCAtNDAsMTcgKzM0LDE3IEBACiAgIC8vICAgIGZvcgogICAvLyBpbnRlcmFjdGlvbikKICAgLy8KLSAgVmVjIGludGVyYWN0aW9uczEoU0laRSksIGludGVyYWN0aW9uczIoU0laRSk7IC8vIFNJWkUgaXMgdGhlIG51bWJlciBvZiB2ZHcgaW50ZXJhY3Rpb25zIGluIG91ciBzeXN0ZW0KKyAgVmVjIGludGVyYWN0aW9uczEoU0laRSksIGludGVyYWN0aW9uczIoU0laRSk7ICAvLyBTSVpFIGlzIHRoZSBudW1iZXIgb2YgdmR3IGludGVyYWN0aW9ucyBpbiBvdXIgc3lzdGVtCiAgIC8vIFNldHVwQ2FsY3VsYXRpb25zKCkKLSAgU0NBTEFSIHJhYiA9IDEuMDsgIAorICBTQ0FMQVIgcmFiID0gMS4wOwogICBpbnRlcmFjdGlvbnMxLnNldENvbnN0YW50KDIuNCk7CiAgIGludGVyYWN0aW9uczIuc2V0Q29uc3RhbnQocmFiKTsKLSAgCisKICAgLy8gRW5lcmd5KCkKICAgU0NBTEFSIGVuZXJneSA9IDAuMDsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGk8UkVQRUFUOyArK2kpIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBSRVBFQVQ7ICsraSkgewogICAgIGVuZXJneSArPSBFX1ZEVyhpbnRlcmFjdGlvbnMxLCBpbnRlcmFjdGlvbnMyKTsKLSAgICBlbmVyZ3kgKj0gMSArIDFlLTIwICogaTsgLy8gcHJldmVudCBjb21waWxlciBmcm9tIG9wdGltaXppbmcgdGhlIGxvb3AKKyAgICBlbmVyZ3kgKj0gMSArIDFlLTIwICogaTsgIC8vIHByZXZlbnQgY29tcGlsZXIgZnJvbSBvcHRpbWl6aW5nIHRoZSBsb29wCiAgIH0KICAgY291dCA8PCAiZW5lcmd5ID0gIiA8PCBlbmVyZ3kgPDwgZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2JsYXMvQmFuZFRyaWFuZ3VsYXJTb2x2ZXIuaCBiL2JsYXMvQmFuZFRyaWFuZ3VsYXJTb2x2ZXIuaAppbmRleCBlODU1MWNkLi4wMTRhZjI0IDEwMDY0NAotLS0gYS9ibGFzL0JhbmRUcmlhbmd1bGFyU29sdmVyLmgKKysrIGIvYmxhcy9CYW5kVHJpYW5ndWxhclNvbHZlci5oCkBAIC0xMiw4MiArMTIsNzEgQEAKIAogbmFtZXNwYWNlIGludGVybmFsIHsKIAotIC8qIFxpbnRlcm5hbAotICAqIFNvbHZlIEF4PWIgd2l0aCBBIGEgYmFuZCB0cmlhbmd1bGFyIG1hdHJpeAotICAqIFRPRE86IGV4dGVuZCBpdCB0byBtYXRyaWNlcyBmb3IgeCBhYmQgYiAqLwotdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCB0eXBlbmFtZSBMaHNTY2FsYXIsIGJvb2wgQ29uakxocywgdHlwZW5hbWUgUmhzU2NhbGFyLCBpbnQgU3RvcmFnZU9yZGVyPgorLyogXGludGVybmFsCisgKiBTb2x2ZSBBeD1iIHdpdGggQSBhIGJhbmQgdHJpYW5ndWxhciBtYXRyaXgKKyAqIFRPRE86IGV4dGVuZCBpdCB0byBtYXRyaWNlcyBmb3IgeCBhYmQgYiAqLwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgdHlwZW5hbWUgTGhzU2NhbGFyLCBib29sIENvbmpMaHMsIHR5cGVuYW1lIFJoc1NjYWxhciwgaW50IFN0b3JhZ2VPcmRlcj4KIHN0cnVjdCBiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I7CiAKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIHR5cGVuYW1lIExoc1NjYWxhciwgYm9vbCBDb25qTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXI+CitzdHJ1Y3QgYmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPEluZGV4LCBNb2RlLCBMaHNTY2FsYXIsIENvbmpMaHMsIFJoc1NjYWxhciwgUm93TWFqb3I+IHsKKyAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PExoc1NjYWxhciwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4gTGhzTWFwOworICB0eXBlZGVmIE1hcDxNYXRyaXg8UmhzU2NhbGFyLCBEeW5hbWljLCAxPiA+IFJoc01hcDsKKyAgZW51bSB7IElzTG93ZXIgPSAoTW9kZSAmIExvd2VyKSA/IDEgOiAwIH07CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBJbmRleCBrLCBjb25zdCBMaHNTY2FsYXIqIF9saHMsIEluZGV4IGxoc1N0cmlkZSwgUmhzU2NhbGFyKiBfb3RoZXIpIHsKKyAgICBjb25zdCBMaHNNYXAgbGhzKF9saHMsIHNpemUsIGsgKyAxLCBPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOworICAgIFJoc01hcCBvdGhlcihfb3RoZXIsIHNpemUsIDEpOworICAgIHN0ZDo6Y29uZGl0aW9uYWxfdDxDb25qTGhzLCBjb25zdCBDd2lzZVVuYXJ5T3A8dHlwZW5hbWUgaW50ZXJuYWw6OnNjYWxhcl9jb25qdWdhdGVfb3A8TGhzU2NhbGFyPiwgTGhzTWFwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGhzTWFwJj4KKyAgICAgICAgY2pMaHMobGhzKTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgSW5kZXgsIGludCBNb2RlLCB0eXBlbmFtZSBMaHNTY2FsYXIsIGJvb2wgQ29uakxocywgdHlwZW5hbWUgUmhzU2NhbGFyPgotc3RydWN0IGJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxJbmRleCxNb2RlLExoc1NjYWxhcixDb25qTGhzLFJoc1NjYWxhcixSb3dNYWpvcj4KLXsKLSAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PExoc1NjYWxhcixEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4gTGhzTWFwOwotICB0eXBlZGVmIE1hcDxNYXRyaXg8UmhzU2NhbGFyLER5bmFtaWMsMT4gPiBSaHNNYXA7Ci0gIGVudW0geyBJc0xvd2VyID0gKE1vZGUmTG93ZXIpID8gMSA6IDAgfTsKLSAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIEluZGV4IGssIGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLCBSaHNTY2FsYXIqIF9vdGhlcikKLSAgewotICAgIGNvbnN0IExoc01hcCBsaHMoX2xocyxzaXplLGsrMSxPdXRlclN0cmlkZTw+KGxoc1N0cmlkZSkpOwotICAgIFJoc01hcCBvdGhlcihfb3RoZXIsc2l6ZSwxKTsKLSAgICBzdGQ6OmNvbmRpdGlvbmFsX3Q8Q29uakxocywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEN3aXNlVW5hcnlPcDx0eXBlbmFtZSBpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxMaHNTY2FsYXI+LExoc01hcD4sCi0gICAgICAgICAgICAgICAgICBjb25zdCBMaHNNYXAmPiBjakxocyhsaHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZm9yKGludCBjb2w9MCA7IGNvbDxvdGhlci5jb2xzKCkgOyArK2NvbCkKLSAgICB7Ci0gICAgICBmb3IoaW50IGlpPTA7IGlpPHNpemU7ICsraWkpCi0gICAgICB7Ci0gICAgICAgIGludCBpID0gSXNMb3dlciA/IGlpIDogc2l6ZS1paS0xOwotICAgICAgICBpbnQgYWN0dWFsX2sgPSAoc3RkOjptaW4pKGssaWkpOwotICAgICAgICBpbnQgYWN0dWFsX3N0YXJ0ID0gSXNMb3dlciA/IGstYWN0dWFsX2sgOiAxOwotICAgICAgICAKLSAgICAgICAgaWYoYWN0dWFsX2s+MCkKLSAgICAgICAgICBvdGhlci5jb2VmZlJlZihpLGNvbCkgLT0gY2pMaHMucm93KGkpLnNlZ21lbnQoYWN0dWFsX3N0YXJ0LGFjdHVhbF9rKS50cmFuc3Bvc2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jd2lzZVByb2R1Y3Qob3RoZXIuY29sKGNvbCkuc2VnbWVudChJc0xvd2VyID8gaS1hY3R1YWxfayA6IGkrMSxhY3R1YWxfaykpLnN1bSgpOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG90aGVyLmNvbHMoKTsgKytjb2wpIHsKKyAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBzaXplOyArK2lpKSB7CisgICAgICAgIGludCBpID0gSXNMb3dlciA/IGlpIDogc2l6ZSAtIGlpIC0gMTsKKyAgICAgICAgaW50IGFjdHVhbF9rID0gKHN0ZDo6bWluKShrLCBpaSk7CisgICAgICAgIGludCBhY3R1YWxfc3RhcnQgPSBJc0xvd2VyID8gayAtIGFjdHVhbF9rIDogMTsKIAotICAgICAgICBpZigoTW9kZSZVbml0RGlhZyk9PTApCi0gICAgICAgICAgb3RoZXIuY29lZmZSZWYoaSxjb2wpIC89IGNqTGhzKGksSXNMb3dlciA/IGsgOiAwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi19OworICAgICAgICBpZiAoYWN0dWFsX2sgPiAwKQorICAgICAgICAgIG90aGVyLmNvZWZmUmVmKGksIGNvbCkgLT0gY2pMaHMucm93KGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlZ21lbnQoYWN0dWFsX3N0YXJ0LCBhY3R1YWxfaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJhbnNwb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3dpc2VQcm9kdWN0KG90aGVyLmNvbChjb2wpLnNlZ21lbnQoSXNMb3dlciA/IGkgLSBhY3R1YWxfayA6IGkgKyAxLCBhY3R1YWxfaykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1bSgpOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIHR5cGVuYW1lIExoc1NjYWxhciwgYm9vbCBDb25qTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXI+Ci1zdHJ1Y3QgYmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPEluZGV4LE1vZGUsTGhzU2NhbGFyLENvbmpMaHMsUmhzU2NhbGFyLENvbE1ham9yPgotewotICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8TGhzU2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPiBMaHNNYXA7Ci0gIHR5cGVkZWYgTWFwPE1hdHJpeDxSaHNTY2FsYXIsRHluYW1pYywxPiA+IFJoc01hcDsKLSAgZW51bSB7IElzTG93ZXIgPSAoTW9kZSZMb3dlcikgPyAxIDogMCB9OwotICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgSW5kZXggaywgY29uc3QgTGhzU2NhbGFyKiBfbGhzLCBJbmRleCBsaHNTdHJpZGUsIFJoc1NjYWxhciogX290aGVyKQotICB7Ci0gICAgY29uc3QgTGhzTWFwIGxocyhfbGhzLGsrMSxzaXplLE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7Ci0gICAgUmhzTWFwIG90aGVyKF9vdGhlcixzaXplLDEpOwotICAgIHN0ZDo6Y29uZGl0aW9uYWxfdDxDb25qTGhzLAotICAgICAgICAgICAgICAgICAgY29uc3QgQ3dpc2VVbmFyeU9wPHR5cGVuYW1lIGludGVybmFsOjpzY2FsYXJfY29uanVnYXRlX29wPExoc1NjYWxhcj4sTGhzTWFwPiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IExoc01hcCY+IGNqTGhzKGxocyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmb3IoaW50IGNvbD0wIDsgY29sPG90aGVyLmNvbHMoKSA7ICsrY29sKQotICAgIHsKLSAgICAgIGZvcihpbnQgaWk9MDsgaWk8c2l6ZTsgKytpaSkKLSAgICAgIHsKLSAgICAgICAgaW50IGkgPSBJc0xvd2VyID8gaWkgOiBzaXplLWlpLTE7Ci0gICAgICAgIGludCBhY3R1YWxfayA9IChzdGQ6Om1pbikoayxzaXplLWlpLTEpOwotICAgICAgICBpbnQgYWN0dWFsX3N0YXJ0ID0gSXNMb3dlciA/IDEgOiBrLWFjdHVhbF9rOwotICAgICAgICAKLSAgICAgICAgaWYoKE1vZGUmVW5pdERpYWcpPT0wKQotICAgICAgICAgIG90aGVyLmNvZWZmUmVmKGksY29sKSAvPSBjakxocyhJc0xvd2VyID8gMCA6IGssIGkpOwotCi0gICAgICAgIGlmKGFjdHVhbF9rPjApCi0gICAgICAgICAgb3RoZXIuY29sKGNvbCkuc2VnbWVudChJc0xvd2VyID8gaSsxIDogaS1hY3R1YWxfaywgYWN0dWFsX2spCi0gICAgICAgICAgICAgIC09IG90aGVyLmNvZWZmKGksY29sKSAqIGNqTGhzLmNvbChpKS5zZWdtZW50KGFjdHVhbF9zdGFydCxhY3R1YWxfayk7Ci0gICAgICAgIAorICAgICAgICBpZiAoKE1vZGUgJiBVbml0RGlhZykgPT0gMCkgb3RoZXIuY29lZmZSZWYoaSwgY29sKSAvPSBjakxocyhpLCBJc0xvd2VyID8gayA6IDApOwogICAgICAgfQogICAgIH0KICAgfQogfTsKIAordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgdHlwZW5hbWUgTGhzU2NhbGFyLCBib29sIENvbmpMaHMsIHR5cGVuYW1lIFJoc1NjYWxhcj4KK3N0cnVjdCBiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8SW5kZXgsIE1vZGUsIExoc1NjYWxhciwgQ29uakxocywgUmhzU2NhbGFyLCBDb2xNYWpvcj4geworICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8TGhzU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPiBMaHNNYXA7CisgIHR5cGVkZWYgTWFwPE1hdHJpeDxSaHNTY2FsYXIsIER5bmFtaWMsIDE+ID4gUmhzTWFwOworICBlbnVtIHsgSXNMb3dlciA9IChNb2RlICYgTG93ZXIpID8gMSA6IDAgfTsKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIEluZGV4IGssIGNvbnN0IExoc1NjYWxhciogX2xocywgSW5kZXggbGhzU3RyaWRlLCBSaHNTY2FsYXIqIF9vdGhlcikgeworICAgIGNvbnN0IExoc01hcCBsaHMoX2xocywgayArIDEsIHNpemUsIE91dGVyU3RyaWRlPD4obGhzU3RyaWRlKSk7CisgICAgUmhzTWFwIG90aGVyKF9vdGhlciwgc2l6ZSwgMSk7CisgICAgc3RkOjpjb25kaXRpb25hbF90PENvbmpMaHMsIGNvbnN0IEN3aXNlVW5hcnlPcDx0eXBlbmFtZSBpbnRlcm5hbDo6c2NhbGFyX2Nvbmp1Z2F0ZV9vcDxMaHNTY2FsYXI+LCBMaHNNYXA+LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaHNNYXAmPgorICAgICAgICBjakxocyhsaHMpOwogCi19IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBvdGhlci5jb2xzKCk7ICsrY29sKSB7CisgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgc2l6ZTsgKytpaSkgeworICAgICAgICBpbnQgaSA9IElzTG93ZXIgPyBpaSA6IHNpemUgLSBpaSAtIDE7CisgICAgICAgIGludCBhY3R1YWxfayA9IChzdGQ6Om1pbikoaywgc2l6ZSAtIGlpIC0gMSk7CisgICAgICAgIGludCBhY3R1YWxfc3RhcnQgPSBJc0xvd2VyID8gMSA6IGsgLSBhY3R1YWxfazsKIAotI2VuZGlmIC8vIEVJR0VOX0JBTkRfVFJJQU5HVUxBUlNPTFZFUl9ICisgICAgICAgIGlmICgoTW9kZSAmIFVuaXREaWFnKSA9PSAwKSBvdGhlci5jb2VmZlJlZihpLCBjb2wpIC89IGNqTGhzKElzTG93ZXIgPyAwIDogaywgaSk7CisKKyAgICAgICAgaWYgKGFjdHVhbF9rID4gMCkKKyAgICAgICAgICBvdGhlci5jb2woY29sKS5zZWdtZW50KElzTG93ZXIgPyBpICsgMSA6IGkgLSBhY3R1YWxfaywgYWN0dWFsX2spIC09CisgICAgICAgICAgICAgIG90aGVyLmNvZWZmKGksIGNvbCkgKiBjakxocy5jb2woaSkuc2VnbWVudChhY3R1YWxfc3RhcnQsIGFjdHVhbF9rKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2VuZGlmICAvLyBFSUdFTl9CQU5EX1RSSUFOR1VMQVJTT0xWRVJfSApkaWZmIC0tZ2l0IGEvYmxhcy9HZW5lcmFsUmFuazFVcGRhdGUuaCBiL2JsYXMvR2VuZXJhbFJhbmsxVXBkYXRlLmgKaW5kZXggMDdkMzg4Yy4uZGQzNjNlNSAxMDA2NDQKLS0tIGEvYmxhcy9HZW5lcmFsUmFuazFVcGRhdGUuaAorKysgYi9ibGFzL0dlbmVyYWxSYW5rMVVwZGF0ZS5oCkBAIC0xMywzMiArMTMsMjggQEAKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CiAKIC8qIE9wdGltaXplZCBtYXRyaXggKz0gYWxwaGEgKiB1dicgKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTdG9yYWdlT3JkZXIsIGJvb2wgQ29uakxocywgYm9vbCBDb25qUmhzPgordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTdG9yYWdlT3JkZXIsIGJvb2wgQ29uakxocywgYm9vbCBDb25qUmhzPgogc3RydWN0IGdlbmVyYWxfcmFuazFfdXBkYXRlOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4KLXN0cnVjdCBnZW5lcmFsX3JhbmsxX3VwZGF0ZTxTY2FsYXIsSW5kZXgsQ29sTWFqb3IsQ29uakxocyxDb25qUmhzPgotewotICBzdGF0aWMgdm9pZCBydW4oSW5kZXggcm93cywgSW5kZXggY29scywgU2NhbGFyKiBtYXQsIEluZGV4IHN0cmlkZSwgY29uc3QgU2NhbGFyKiB1LCBjb25zdCBTY2FsYXIqIHYsIFNjYWxhciBhbHBoYSkKLSAgewotICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+IE90aGVyTWFwOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgY29ual9leHByX2lmPENvbmpMaHMsT3RoZXJNYXA+Ojp0eXBlIENvbmpSaHNUeXBlOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGJvb2wgQ29uakxocywgYm9vbCBDb25qUmhzPgorc3RydWN0IGdlbmVyYWxfcmFuazFfdXBkYXRlPFNjYWxhciwgSW5kZXgsIENvbE1ham9yLCBDb25qTGhzLCBDb25qUmhzPiB7CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCByb3dzLCBJbmRleCBjb2xzLCBTY2FsYXIqIG1hdCwgSW5kZXggc3RyaWRlLCBjb25zdCBTY2FsYXIqIHUsIGNvbnN0IFNjYWxhciogdiwgU2NhbGFyIGFscGhhKSB7CisgICAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gPiBPdGhlck1hcDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmpfZXhwcl9pZjxDb25qTGhzLCBPdGhlck1hcD46OnR5cGUgQ29ualJoc1R5cGU7CiAgICAgY29ual9pZjxDb25qUmhzPiBjajsKIAotICAgIGZvciAoSW5kZXggaT0wOyBpPGNvbHM7ICsraSkKLSAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPihtYXQrc3RyaWRlKmkscm93cykgKz0gYWxwaGEgKiBjaih2W2ldKSAqIENvbmpSaHNUeXBlKE90aGVyTWFwKHUscm93cykpOworICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBjb2xzOyArK2kpCisgICAgICBNYXA8TWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gPihtYXQgKyBzdHJpZGUgKiBpLCByb3dzKSArPSBhbHBoYSAqIGNqKHZbaV0pICogQ29ualJoc1R5cGUoT3RoZXJNYXAodSwgcm93cykpOwogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4KLXN0cnVjdCBnZW5lcmFsX3JhbmsxX3VwZGF0ZTxTY2FsYXIsSW5kZXgsUm93TWFqb3IsQ29uakxocyxDb25qUmhzPgotewotICBzdGF0aWMgdm9pZCBydW4oSW5kZXggcm93cywgSW5kZXggY29scywgU2NhbGFyKiBtYXQsIEluZGV4IHN0cmlkZSwgY29uc3QgU2NhbGFyKiB1LCBjb25zdCBTY2FsYXIqIHYsIFNjYWxhciBhbHBoYSkKLSAgewotICAgIGdlbmVyYWxfcmFuazFfdXBkYXRlPFNjYWxhcixJbmRleCxDb2xNYWpvcixDb25qUmhzLENvbmpSaHM+OjpydW4ocm93cyxjb2xzLG1hdCxzdHJpZGUsdSx2LGFscGhhKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4KK3N0cnVjdCBnZW5lcmFsX3JhbmsxX3VwZGF0ZTxTY2FsYXIsIEluZGV4LCBSb3dNYWpvciwgQ29uakxocywgQ29ualJocz4geworICBzdGF0aWMgdm9pZCBydW4oSW5kZXggcm93cywgSW5kZXggY29scywgU2NhbGFyKiBtYXQsIEluZGV4IHN0cmlkZSwgY29uc3QgU2NhbGFyKiB1LCBjb25zdCBTY2FsYXIqIHYsIFNjYWxhciBhbHBoYSkgeworICAgIGdlbmVyYWxfcmFuazFfdXBkYXRlPFNjYWxhciwgSW5kZXgsIENvbE1ham9yLCBDb25qUmhzLCBDb25qUmhzPjo6cnVuKHJvd3MsIGNvbHMsIG1hdCwgc3RyaWRlLCB1LCB2LCBhbHBoYSk7CiAgIH0KIH07CiAKLX0gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAogCi0jZW5kaWYgLy8gRUlHRU5fR0VORVJBTF9SQU5LMVVQREFURV9ICisjZW5kaWYgIC8vIEVJR0VOX0dFTkVSQUxfUkFOSzFVUERBVEVfSApkaWZmIC0tZ2l0IGEvYmxhcy9QYWNrZWRTZWxmYWRqb2ludFByb2R1Y3QuaCBiL2JsYXMvUGFja2VkU2VsZmFkam9pbnRQcm9kdWN0LmgKaW5kZXggMDczMjdhMi4uNjU1ZGE1MSAxMDA2NDQKLS0tIGEvYmxhcy9QYWNrZWRTZWxmYWRqb2ludFByb2R1Y3QuaAorKysgYi9ibGFzL1BhY2tlZFNlbGZhZGpvaW50UHJvZHVjdC5oCkBAIC0xNSwzOSArMTUsMzYgQEAKIC8qIE9wdGltaXplZCBtYXRyaXggKz0gYWxwaGEgKiB1dicKICAqIFRoZSBtYXRyaXggaXMgaW4gcGFja2VkIGZvcm0uCiAgKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBTdG9yYWdlT3JkZXIsIGludCBVcExvLCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgU3RvcmFnZU9yZGVyLCBpbnQgVXBMbywgYm9vbCBDb25qTGhzLCBib29sIENvbmpSaHM+CiBzdHJ1Y3Qgc2VsZmFkam9pbnRfcGFja2VkX3JhbmsxX3VwZGF0ZTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IFVwTG8sIGJvb2wgQ29uakxocywgYm9vbCBDb25qUmhzPgotc3RydWN0IHNlbGZhZGpvaW50X3BhY2tlZF9yYW5rMV91cGRhdGU8U2NhbGFyLEluZGV4LENvbE1ham9yLFVwTG8sQ29uakxocyxDb25qUmhzPgotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBVcExvLCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4KK3N0cnVjdCBzZWxmYWRqb2ludF9wYWNrZWRfcmFuazFfdXBkYXRlPFNjYWxhciwgSW5kZXgsIENvbE1ham9yLCBVcExvLCBDb25qTGhzLCBDb25qUmhzPiB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKLSAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIFNjYWxhciogbWF0LCBjb25zdCBTY2FsYXIqIHZlYywgUmVhbFNjYWxhciBhbHBoYSkKLSAgewotICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+IE90aGVyTWFwOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgY29ual9leHByX2lmPENvbmpMaHMsT3RoZXJNYXA+Ojp0eXBlIENvbmpSaHNUeXBlOworICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgU2NhbGFyKiBtYXQsIGNvbnN0IFNjYWxhciogdmVjLCBSZWFsU2NhbGFyIGFscGhhKSB7CisgICAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gPiBPdGhlck1hcDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmpfZXhwcl9pZjxDb25qTGhzLCBPdGhlck1hcD46OnR5cGUgQ29ualJoc1R5cGU7CiAgICAgY29ual9pZjxDb25qUmhzPiBjajsKIAotICAgIGZvciAoSW5kZXggaT0wOyBpPHNpemU7ICsraSkKLSAgICB7Ci0gICAgICBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4obWF0LCBVcExvPT1Mb3dlciA/IHNpemUtaSA6IChpKzEpKSArPSBhbHBoYSAqIGNqKHZlY1tpXSkgKiBDb25qUmhzVHlwZShPdGhlck1hcCh2ZWMrKFVwTG89PUxvd2VyID8gaSA6IDApLCBVcExvPT1Mb3dlciA/IHNpemUtaSA6IChpKzEpKSk7Ci0gICAgICAvL0ZJWE1FIFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgb3V0c2lkZS4KLSAgICAgIG1hdFtVcExvPT1Mb3dlciA/IDAgOiBpXSA9IG51bWV4dDo6cmVhbChtYXRbVXBMbz09TG93ZXIgPyAwIDogaV0pOwotICAgICAgbWF0ICs9IFVwTG89PUxvd2VyID8gc2l6ZS1pIDogKGkrMSk7CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+ID4obWF0LCBVcExvID09IExvd2VyID8gc2l6ZSAtIGkgOiAoaSArIDEpKSArPQorICAgICAgICAgIGFscGhhICogY2oodmVjW2ldKSAqIENvbmpSaHNUeXBlKE90aGVyTWFwKHZlYyArIChVcExvID09IExvd2VyID8gaSA6IDApLCBVcExvID09IExvd2VyID8gc2l6ZSAtIGkgOiAoaSArIDEpKSk7CisgICAgICAvLyBGSVhNRSBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIG91dHNpZGUuCisgICAgICBtYXRbVXBMbyA9PSBMb3dlciA/IDAgOiBpXSA9IG51bWV4dDo6cmVhbChtYXRbVXBMbyA9PSBMb3dlciA/IDAgOiBpXSk7CisgICAgICBtYXQgKz0gVXBMbyA9PSBMb3dlciA/IHNpemUgLSBpIDogKGkgKyAxKTsKICAgICB9CiAgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBVcExvLCBib29sIENvbmpMaHMsIGJvb2wgQ29ualJocz4KLXN0cnVjdCBzZWxmYWRqb2ludF9wYWNrZWRfcmFuazFfdXBkYXRlPFNjYWxhcixJbmRleCxSb3dNYWpvcixVcExvLENvbmpMaHMsQ29ualJocz4KLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgVXBMbywgYm9vbCBDb25qTGhzLCBib29sIENvbmpSaHM+CitzdHJ1Y3Qgc2VsZmFkam9pbnRfcGFja2VkX3JhbmsxX3VwZGF0ZTxTY2FsYXIsIEluZGV4LCBSb3dNYWpvciwgVXBMbywgQ29uakxocywgQ29ualJocz4gewogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7Ci0gIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBTY2FsYXIqIG1hdCwgY29uc3QgU2NhbGFyKiB2ZWMsIFJlYWxTY2FsYXIgYWxwaGEpCi0gIHsKLSAgICBzZWxmYWRqb2ludF9wYWNrZWRfcmFuazFfdXBkYXRlPFNjYWxhcixJbmRleCxDb2xNYWpvcixVcExvPT1Mb3dlcj9VcHBlcjpMb3dlcixDb25qUmhzLENvbmpMaHM+OjpydW4oc2l6ZSxtYXQsdmVjLGFscGhhKTsKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIFNjYWxhciogbWF0LCBjb25zdCBTY2FsYXIqIHZlYywgUmVhbFNjYWxhciBhbHBoYSkgeworICAgIHNlbGZhZGpvaW50X3BhY2tlZF9yYW5rMV91cGRhdGU8U2NhbGFyLCBJbmRleCwgQ29sTWFqb3IsIFVwTG8gPT0gTG93ZXIgPyBVcHBlciA6IExvd2VyLCBDb25qUmhzLCBDb25qTGhzPjo6cnVuKAorICAgICAgICBzaXplLCBtYXQsIHZlYywgYWxwaGEpOwogICB9CiB9OwogCi19IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKIAotI2VuZGlmIC8vIEVJR0VOX1NFTEZBREpPSU5UX1BBQ0tFRF9QUk9EVUNUX0gKKyNlbmRpZiAgLy8gRUlHRU5fU0VMRkFESk9JTlRfUEFDS0VEX1BST0RVQ1RfSApkaWZmIC0tZ2l0IGEvYmxhcy9QYWNrZWRUcmlhbmd1bGFyTWF0cml4VmVjdG9yLmggYi9ibGFzL1BhY2tlZFRyaWFuZ3VsYXJNYXRyaXhWZWN0b3IuaAppbmRleCBjYzJhOWI4Li5iYjgzMGNiIDEwMDY0NAotLS0gYS9ibGFzL1BhY2tlZFRyaWFuZ3VsYXJNYXRyaXhWZWN0b3IuaAorKysgYi9ibGFzL1BhY2tlZFRyaWFuZ3VsYXJNYXRyaXhWZWN0b3IuaApAQCAtMTIsMjQgKzEyLDIzIEBACiAKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgdHlwZW5hbWUgTGhzU2NhbGFyLCBib29sIENvbmpMaHMsIHR5cGVuYW1lIFJoc1NjYWxhciwgYm9vbCBDb25qUmhzLCBpbnQgU3RvcmFnZU9yZGVyPgordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgdHlwZW5hbWUgTGhzU2NhbGFyLCBib29sIENvbmpMaHMsIHR5cGVuYW1lIFJoc1NjYWxhciwgYm9vbCBDb25qUmhzLAorICAgICAgICAgIGludCBTdG9yYWdlT3JkZXI+CiBzdHJ1Y3QgcGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIHR5cGVuYW1lIExoc1NjYWxhciwgYm9vbCBDb25qTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29ualJocz4KLXN0cnVjdCBwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxMaHNTY2FsYXIsQ29uakxocyxSaHNTY2FsYXIsQ29ualJocyxDb2xNYWpvcj4KLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIHR5cGVuYW1lIExoc1NjYWxhciwgYm9vbCBDb25qTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29ualJocz4KK3N0cnVjdCBwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsIE1vZGUsIExoc1NjYWxhciwgQ29uakxocywgUmhzU2NhbGFyLCBDb25qUmhzLCBDb2xNYWpvcj4gewogICB0eXBlZGVmIHR5cGVuYW1lIFNjYWxhckJpbmFyeU9wVHJhaXRzPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6UmV0dXJuVHlwZSBSZXNTY2FsYXI7CiAgIGVudW0gewotICAgIElzTG93ZXIgICAgID0gKE1vZGUgJiBMb3dlcikgICA9PUxvd2VyLAotICAgIEhhc1VuaXREaWFnID0gKE1vZGUgJiBVbml0RGlhZyk9PVVuaXREaWFnLAotICAgIEhhc1plcm9EaWFnID0gKE1vZGUgJiBaZXJvRGlhZyk9PVplcm9EaWFnCisgICAgSXNMb3dlciA9IChNb2RlICYgTG93ZXIpID09IExvd2VyLAorICAgIEhhc1VuaXREaWFnID0gKE1vZGUgJiBVbml0RGlhZykgPT0gVW5pdERpYWcsCisgICAgSGFzWmVyb0RpYWcgPSAoTW9kZSAmIFplcm9EaWFnKSA9PSBaZXJvRGlhZwogICB9OwotICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgY29uc3QgTGhzU2NhbGFyKiBsaHMsIGNvbnN0IFJoc1NjYWxhciogcmhzLCBSZXNTY2FsYXIqIHJlcywgUmVzU2NhbGFyIGFscGhhKQotICB7CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBjb25zdCBMaHNTY2FsYXIqIGxocywgY29uc3QgUmhzU2NhbGFyKiByaHMsIFJlc1NjYWxhciogcmVzLCBSZXNTY2FsYXIgYWxwaGEpIHsKICAgICBpbnRlcm5hbDo6Y29ual9pZjxDb25qUmhzPiBjajsKLSAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8TGhzU2NhbGFyLER5bmFtaWMsMT4gPiBMaHNNYXA7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBjb25qX2V4cHJfaWY8Q29uakxocyxMaHNNYXA+Ojp0eXBlIENvbmpMaHNUeXBlOwotICAgIHR5cGVkZWYgTWFwPE1hdHJpeDxSZXNTY2FsYXIsRHluYW1pYywxPiA+IFJlc01hcDsKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8TGhzU2NhbGFyLCBEeW5hbWljLCAxPiA+IExoc01hcDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmpfZXhwcl9pZjxDb25qTGhzLCBMaHNNYXA+Ojp0eXBlIENvbmpMaHNUeXBlOworICAgIHR5cGVkZWYgTWFwPE1hdHJpeDxSZXNTY2FsYXIsIER5bmFtaWMsIDE+ID4gUmVzTWFwOwogCiAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IHNpemU7ICsraSkgewogICAgICAgSW5kZXggcyA9IElzTG93ZXIgJiYgKEhhc1VuaXREaWFnIHx8IEhhc1plcm9EaWFnKSA/IDEgOiAwOwpAQCAtNDUsMjggKzQ0LDI4IEBACiAgIH07CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIHR5cGVuYW1lIExoc1NjYWxhciwgYm9vbCBDb25qTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29ualJocz4KLXN0cnVjdCBwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsTW9kZSxMaHNTY2FsYXIsQ29uakxocyxSaHNTY2FsYXIsQ29ualJocyxSb3dNYWpvcj4KLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIHR5cGVuYW1lIExoc1NjYWxhciwgYm9vbCBDb25qTGhzLCB0eXBlbmFtZSBSaHNTY2FsYXIsIGJvb2wgQ29ualJocz4KK3N0cnVjdCBwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8SW5kZXgsIE1vZGUsIExoc1NjYWxhciwgQ29uakxocywgUmhzU2NhbGFyLCBDb25qUmhzLCBSb3dNYWpvcj4gewogICB0eXBlZGVmIHR5cGVuYW1lIFNjYWxhckJpbmFyeU9wVHJhaXRzPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6UmV0dXJuVHlwZSBSZXNTY2FsYXI7CiAgIGVudW0gewotICAgIElzTG93ZXIgICAgID0gKE1vZGUgJiBMb3dlcikgICA9PUxvd2VyLAotICAgIEhhc1VuaXREaWFnID0gKE1vZGUgJiBVbml0RGlhZyk9PVVuaXREaWFnLAotICAgIEhhc1plcm9EaWFnID0gKE1vZGUgJiBaZXJvRGlhZyk9PVplcm9EaWFnCisgICAgSXNMb3dlciA9IChNb2RlICYgTG93ZXIpID09IExvd2VyLAorICAgIEhhc1VuaXREaWFnID0gKE1vZGUgJiBVbml0RGlhZykgPT0gVW5pdERpYWcsCisgICAgSGFzWmVyb0RpYWcgPSAoTW9kZSAmIFplcm9EaWFnKSA9PSBaZXJvRGlhZwogICB9OwotICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgY29uc3QgTGhzU2NhbGFyKiBsaHMsIGNvbnN0IFJoc1NjYWxhciogcmhzLCBSZXNTY2FsYXIqIHJlcywgUmVzU2NhbGFyIGFscGhhKQotICB7CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBjb25zdCBMaHNTY2FsYXIqIGxocywgY29uc3QgUmhzU2NhbGFyKiByaHMsIFJlc1NjYWxhciogcmVzLCBSZXNTY2FsYXIgYWxwaGEpIHsKICAgICBpbnRlcm5hbDo6Y29ual9pZjxDb25qUmhzPiBjajsKLSAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8TGhzU2NhbGFyLER5bmFtaWMsMT4gPiBMaHNNYXA7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBjb25qX2V4cHJfaWY8Q29uakxocyxMaHNNYXA+Ojp0eXBlIENvbmpMaHNUeXBlOwotICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxSaHNTY2FsYXIsRHluYW1pYywxPiA+IFJoc01hcDsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmpfZXhwcl9pZjxDb25qUmhzLFJoc01hcD46OnR5cGUgQ29ualJoc1R5cGU7CisgICAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PExoc1NjYWxhciwgRHluYW1pYywgMT4gPiBMaHNNYXA7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25qX2V4cHJfaWY8Q29uakxocywgTGhzTWFwPjo6dHlwZSBDb25qTGhzVHlwZTsKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8UmhzU2NhbGFyLCBEeW5hbWljLCAxPiA+IFJoc01hcDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmpfZXhwcl9pZjxDb25qUmhzLCBSaHNNYXA+Ojp0eXBlIENvbmpSaHNUeXBlOwogCiAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IHNpemU7ICsraSkgewogICAgICAgSW5kZXggcyA9ICFJc0xvd2VyICYmIChIYXNVbml0RGlhZyB8fCBIYXNaZXJvRGlhZykgPyAxIDogMDsKICAgICAgIEluZGV4IHIgPSBJc0xvd2VyID8gaSArIDEgOiBzaXplIC0gaTsKICAgICAgIGlmICghKEhhc1VuaXREaWFnIHx8IEhhc1plcm9EaWFnKSB8fCAoLS1yID4gMCkpIHsKLSAgICAgICAgcmVzW2ldICs9IGFscGhhICogKENvbmpMaHNUeXBlKExoc01hcChsaHMgKyBzLCByKSkuY3dpc2VQcm9kdWN0KENvbmpSaHNUeXBlKFJoc01hcChyaHMgKyAoSXNMb3dlciA/IDAgOiBzICsgaSksIHIpKSkpLnN1bSgpOworICAgICAgICByZXNbaV0gKz0KKyAgICAgICAgICAgIGFscGhhICoKKyAgICAgICAgICAgIChDb25qTGhzVHlwZShMaHNNYXAobGhzICsgcywgcikpLmN3aXNlUHJvZHVjdChDb25qUmhzVHlwZShSaHNNYXAocmhzICsgKElzTG93ZXIgPyAwIDogcyArIGkpLCByKSkpKS5zdW0oKTsKICAgICAgIH0KICAgICAgIGlmIChIYXNVbml0RGlhZykgewogICAgICAgICByZXNbaV0gKz0gYWxwaGEgKiBjaihyaHNbaV0pOwpAQCAtNzYsNiArNzUsNiBAQAogICB9OwogfTsKIAotfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCiAKLSNlbmRpZiAvLyBFSUdFTl9QQUNLRURfVFJJQU5HVUxBUl9NQVRSSVhfVkVDVE9SX0gKKyNlbmRpZiAgLy8gRUlHRU5fUEFDS0VEX1RSSUFOR1VMQVJfTUFUUklYX1ZFQ1RPUl9ICmRpZmYgLS1naXQgYS9ibGFzL1BhY2tlZFRyaWFuZ3VsYXJTb2x2ZXJWZWN0b3IuaCBiL2JsYXMvUGFja2VkVHJpYW5ndWxhclNvbHZlclZlY3Rvci5oCmluZGV4IDVjMGJiNGIuLjZhMWE4YzEgMTAwNjQ0Ci0tLSBhL2JsYXMvUGFja2VkVHJpYW5ndWxhclNvbHZlclZlY3Rvci5oCisrKyBiL2JsYXMvUGFja2VkVHJpYW5ndWxhclNvbHZlclZlY3Rvci5oCkBAIC0xMiw3NyArMTIsNjMgQEAKIAogbmFtZXNwYWNlIGludGVybmFsIHsKIAotdGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgU2lkZSwgaW50IE1vZGUsIGJvb2wgQ29uanVnYXRlLCBpbnQgU3RvcmFnZU9yZGVyPgordGVtcGxhdGUgPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IFNpZGUsIGludCBNb2RlLCBib29sIENvbmp1Z2F0ZSwgaW50IFN0b3JhZ2VPcmRlcj4KIHN0cnVjdCBwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I7CiAKIC8vIGZvcndhcmQgYW5kIGJhY2t3YXJkIHN1YnN0aXR1dGlvbiwgcm93LW1ham9yLCByaHMgaXMgYSB2ZWN0b3IKLXRlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIGJvb2wgQ29uanVnYXRlPgotc3RydWN0IHBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxMaHNTY2FsYXIsIFJoc1NjYWxhciwgSW5kZXgsIE9uVGhlTGVmdCwgTW9kZSwgQ29uanVnYXRlLCBSb3dNYWpvcj4KLXsKLSAgZW51bSB7Ci0gICAgSXNMb3dlciA9IChNb2RlJkxvd2VyKT09TG93ZXIKLSAgfTsKLSAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIGNvbnN0IExoc1NjYWxhciogbGhzLCBSaHNTY2FsYXIqIHJocykKLSAgewordGVtcGxhdGUgPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIGJvb2wgQ29uanVnYXRlPgorc3RydWN0IHBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxMaHNTY2FsYXIsIFJoc1NjYWxhciwgSW5kZXgsIE9uVGhlTGVmdCwgTW9kZSwgQ29uanVnYXRlLCBSb3dNYWpvcj4geworICBlbnVtIHsgSXNMb3dlciA9IChNb2RlICYgTG93ZXIpID09IExvd2VyIH07CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBjb25zdCBMaHNTY2FsYXIqIGxocywgUmhzU2NhbGFyKiByaHMpIHsKICAgICBpbnRlcm5hbDo6Y29ual9pZjxDb25qdWdhdGU+IGNqOwotICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxMaHNTY2FsYXIsRHluYW1pYywxPiA+IExoc01hcDsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmpfZXhwcl9pZjxDb25qdWdhdGUsTGhzTWFwPjo6dHlwZSBDb25qTGhzVHlwZTsKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8TGhzU2NhbGFyLCBEeW5hbWljLCAxPiA+IExoc01hcDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmpfZXhwcl9pZjxDb25qdWdhdGUsIExoc01hcD46OnR5cGUgQ29uakxoc1R5cGU7CiAKLSAgICBsaHMgKz0gSXNMb3dlciA/IDAgOiAoc2l6ZSooc2l6ZSsxKT4+MSktMTsKLSAgICBmb3IoSW5kZXggcGk9MDsgcGk8c2l6ZTsgKytwaSkKLSAgICB7Ci0gICAgICBJbmRleCBpID0gSXNMb3dlciA/IHBpIDogc2l6ZS1waS0xOworICAgIGxocyArPSBJc0xvd2VyID8gMCA6IChzaXplICogKHNpemUgKyAxKSA+PiAxKSAtIDE7CisgICAgZm9yIChJbmRleCBwaSA9IDA7IHBpIDwgc2l6ZTsgKytwaSkgeworICAgICAgSW5kZXggaSA9IElzTG93ZXIgPyBwaSA6IHNpemUgLSBwaSAtIDE7CiAgICAgICBJbmRleCBzID0gSXNMb3dlciA/IDAgOiAxOwotICAgICAgaWYgKHBpPjApCi0JcmhzW2ldIC09IChDb25qTGhzVHlwZShMaHNNYXAobGhzK3MscGkpKQotCSAgICAuY3dpc2VQcm9kdWN0KE1hcDxjb25zdCBNYXRyaXg8UmhzU2NhbGFyLER5bmFtaWMsMT4gPihyaHMrKElzTG93ZXIgPyAwIDogaSsxKSxwaSkpKS5zdW0oKTsKLSAgICAgIGlmICghKE1vZGUgJiBVbml0RGlhZykpCi0JcmhzW2ldIC89IGNqKGxoc1tJc0xvd2VyID8gaSA6IDBdKTsKLSAgICAgIElzTG93ZXIgPyBsaHMgKz0gcGkrMSA6IGxocyAtPSBwaSsyOworICAgICAgaWYgKHBpID4gMCkKKyAgICAgICAgcmhzW2ldIC09IChDb25qTGhzVHlwZShMaHNNYXAobGhzICsgcywgcGkpKQorICAgICAgICAgICAgICAgICAgICAgICAuY3dpc2VQcm9kdWN0KE1hcDxjb25zdCBNYXRyaXg8UmhzU2NhbGFyLCBEeW5hbWljLCAxPiA+KHJocyArIChJc0xvd2VyID8gMCA6IGkgKyAxKSwgcGkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAuc3VtKCk7CisgICAgICBpZiAoIShNb2RlICYgVW5pdERpYWcpKSByaHNbaV0gLz0gY2oobGhzW0lzTG93ZXIgPyBpIDogMF0pOworICAgICAgSXNMb3dlciA/IGxocyArPSBwaSArIDEgOiBsaHMgLT0gcGkgKyAyOwogICAgIH0KICAgfQogfTsKIAogLy8gZm9yd2FyZCBhbmQgYmFja3dhcmQgc3Vic3RpdHV0aW9uLCBjb2x1bW4tbWFqb3IsIHJocyBpcyBhIHZlY3RvcgotdGVtcGxhdGU8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGU+Ci1zdHJ1Y3QgcGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgT25UaGVMZWZ0LCBNb2RlLCBDb25qdWdhdGUsIENvbE1ham9yPgotewotICBlbnVtIHsKLSAgICBJc0xvd2VyID0gKE1vZGUmTG93ZXIpPT1Mb3dlcgotICB9OwotICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgY29uc3QgTGhzU2NhbGFyKiBsaHMsIFJoc1NjYWxhciogcmhzKQotICB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGU+CitzdHJ1Y3QgcGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgT25UaGVMZWZ0LCBNb2RlLCBDb25qdWdhdGUsIENvbE1ham9yPiB7CisgIGVudW0geyBJc0xvd2VyID0gKE1vZGUgJiBMb3dlcikgPT0gTG93ZXIgfTsKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIGNvbnN0IExoc1NjYWxhciogbGhzLCBSaHNTY2FsYXIqIHJocykgewogICAgIGludGVybmFsOjpjb25qX2lmPENvbmp1Z2F0ZT4gY2o7Ci0gICAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PExoc1NjYWxhcixEeW5hbWljLDE+ID4gTGhzTWFwOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgY29ual9leHByX2lmPENvbmp1Z2F0ZSxMaHNNYXA+Ojp0eXBlIENvbmpMaHNUeXBlOworICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxMaHNTY2FsYXIsIER5bmFtaWMsIDE+ID4gTGhzTWFwOworICAgIHR5cGVkZWYgdHlwZW5hbWUgY29ual9leHByX2lmPENvbmp1Z2F0ZSwgTGhzTWFwPjo6dHlwZSBDb25qTGhzVHlwZTsKIAotICAgIGxocyArPSBJc0xvd2VyID8gMCA6IHNpemUqKHNpemUtMSk+PjE7Ci0gICAgZm9yKEluZGV4IHBpPTA7IHBpPHNpemU7ICsrcGkpCi0gICAgewotICAgICAgSW5kZXggaSA9IElzTG93ZXIgPyBwaSA6IHNpemUtcGktMTsKKyAgICBsaHMgKz0gSXNMb3dlciA/IDAgOiBzaXplICogKHNpemUgLSAxKSA+PiAxOworICAgIGZvciAoSW5kZXggcGkgPSAwOyBwaSA8IHNpemU7ICsrcGkpIHsKKyAgICAgIEluZGV4IGkgPSBJc0xvd2VyID8gcGkgOiBzaXplIC0gcGkgLSAxOwogICAgICAgSW5kZXggciA9IHNpemUgLSBwaSAtIDE7Ci0gICAgICBpZiAoIShNb2RlICYgVW5pdERpYWcpKQotCXJoc1tpXSAvPSBjaihsaHNbSXNMb3dlciA/IDAgOiBpXSk7Ci0gICAgICBpZiAocj4wKQotCU1hcDxNYXRyaXg8UmhzU2NhbGFyLER5bmFtaWMsMT4gPihyaHMrKElzTG93ZXI/IGkrMSA6IDApLHIpIC09Ci0JICAgIHJoc1tpXSAqIENvbmpMaHNUeXBlKExoc01hcChsaHMrKElzTG93ZXI/IDEgOiAwKSxyKSk7Ci0gICAgICBJc0xvd2VyID8gbGhzICs9IHNpemUtcGkgOiBsaHMgLT0gcjsKKyAgICAgIGlmICghKE1vZGUgJiBVbml0RGlhZykpIHJoc1tpXSAvPSBjaihsaHNbSXNMb3dlciA/IDAgOiBpXSk7CisgICAgICBpZiAociA+IDApCisgICAgICAgIE1hcDxNYXRyaXg8UmhzU2NhbGFyLCBEeW5hbWljLCAxPiA+KHJocyArIChJc0xvd2VyID8gaSArIDEgOiAwKSwgcikgLT0KKyAgICAgICAgICAgIHJoc1tpXSAqIENvbmpMaHNUeXBlKExoc01hcChsaHMgKyAoSXNMb3dlciA/IDEgOiAwKSwgcikpOworICAgICAgSXNMb3dlciA/IGxocyArPSBzaXplIC0gcGkgOiBsaHMgLT0gcjsKICAgICB9CiAgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIExoc1NjYWxhciwgdHlwZW5hbWUgUmhzU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IE1vZGUsIGJvb2wgQ29uanVnYXRlLCBpbnQgU3RvcmFnZU9yZGVyPgotc3RydWN0IHBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxMaHNTY2FsYXIsIFJoc1NjYWxhciwgSW5kZXgsIE9uVGhlUmlnaHQsIE1vZGUsIENvbmp1Z2F0ZSwgU3RvcmFnZU9yZGVyPgotewotICBzdGF0aWMgdm9pZCBydW4oSW5kZXggc2l6ZSwgY29uc3QgTGhzU2NhbGFyKiBsaHMsIFJoc1NjYWxhciogcmhzKQotICB7Ci0gICAgcGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPExoc1NjYWxhcixSaHNTY2FsYXIsSW5kZXgsT25UaGVMZWZ0LAotCSgoTW9kZSZVcHBlcik9PVVwcGVyID8gTG93ZXIgOiBVcHBlcikgfCAoTW9kZSZVbml0RGlhZyksCi0JQ29uanVnYXRlLFN0b3JhZ2VPcmRlcj09Um93TWFqb3I/Q29sTWFqb3I6Um93TWFqb3IKLSAgICAgID46OnJ1bihzaXplLCBsaHMsIHJocyk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzU2NhbGFyLCB0eXBlbmFtZSBSaHNTY2FsYXIsIHR5cGVuYW1lIEluZGV4LCBpbnQgTW9kZSwgYm9vbCBDb25qdWdhdGUsIGludCBTdG9yYWdlT3JkZXI+CitzdHJ1Y3QgcGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPExoc1NjYWxhciwgUmhzU2NhbGFyLCBJbmRleCwgT25UaGVSaWdodCwgTW9kZSwgQ29uanVnYXRlLCBTdG9yYWdlT3JkZXI+IHsKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIGNvbnN0IExoc1NjYWxhciogbGhzLCBSaHNTY2FsYXIqIHJocykgeworICAgIHBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxMaHNTY2FsYXIsIFJoc1NjYWxhciwgSW5kZXgsIE9uVGhlTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNb2RlICYgVXBwZXIpID09IFVwcGVyID8gTG93ZXIgOiBVcHBlcikgfCAoTW9kZSAmIFVuaXREaWFnKSwgQ29uanVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlT3JkZXIgPT0gUm93TWFqb3IgPyBDb2xNYWpvciA6IFJvd01ham9yPjo6cnVuKHNpemUsIGxocywgcmhzKTsKICAgfQogfTsKIAotfSAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBlbmQgbmFtZXNwYWNlIGludGVybmFsCiAKLSNlbmRpZiAvLyBFSUdFTl9QQUNLRURfVFJJQU5HVUxBUl9TT0xWRVJfVkVDVE9SX0gKKyNlbmRpZiAgLy8gRUlHRU5fUEFDS0VEX1RSSUFOR1VMQVJfU09MVkVSX1ZFQ1RPUl9ICmRpZmYgLS1naXQgYS9ibGFzL1JhbmsyVXBkYXRlLmggYi9ibGFzL1JhbmsyVXBkYXRlLmgKaW5kZXggMTM4ZDcwZi4uZTUwNDZjZiAxMDA2NDQKLS0tIGEvYmxhcy9SYW5rMlVwZGF0ZS5oCisrKyBiL2JsYXMvUmFuazJVcGRhdGUuaApAQCAtMTUsMTcgKzE1LDE2IEBACiAvKiBPcHRpbWl6ZWQgc2VsZmFkam9pbnQgbWF0cml4ICs9IGFscGhhICogdXYnICsgY29uaihhbHBoYSkqdnUnCiAgKiBUaGlzIGlzIHRoZSBsb3ctbGV2ZWwgdmVyc2lvbiBvZiBTZWxmYWRqb2ludFJhbmsyVXBkYXRlLmgKICAqLwotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IFVwTG8+Ci1zdHJ1Y3QgcmFuazJfdXBkYXRlX3NlbGVjdG9yCi17Ci0gIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBTY2FsYXIqIG1hdCwgSW5kZXggc3RyaWRlLCBjb25zdCBTY2FsYXIqIHUsIGNvbnN0IFNjYWxhciogdiwgU2NhbGFyIGFscGhhKQotICB7Ci0gICAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4gT3RoZXJNYXA7Ci0gICAgZm9yIChJbmRleCBpPTA7IGk8c2l6ZTsgKytpKQotICAgIHsKLSAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gPihtYXQrc3RyaWRlKmkrKFVwTG89PUxvd2VyID8gaSA6IDApLCBVcExvPT1Mb3dlciA/IHNpemUtaSA6IChpKzEpKSArPQotICAgICAgbnVtZXh0Ojpjb25qKGFscGhhKSAqIG51bWV4dDo6Y29uaih1W2ldKSAqIE90aGVyTWFwKHYrKFVwTG89PUxvd2VyID8gaSA6IDApLCBVcExvPT1Mb3dlciA/IHNpemUtaSA6IChpKzEpKQotICAgICAgICAgICAgICAgICsgYWxwaGEgKiBudW1leHQ6OmNvbmoodltpXSkgKiBPdGhlck1hcCh1KyhVcExvPT1Mb3dlciA/IGkgOiAwKSwgVXBMbz09TG93ZXIgPyBzaXplLWkgOiAoaSsxKSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IFVwTG8+CitzdHJ1Y3QgcmFuazJfdXBkYXRlX3NlbGVjdG9yIHsKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIFNjYWxhciogbWF0LCBJbmRleCBzdHJpZGUsIGNvbnN0IFNjYWxhciogdSwgY29uc3QgU2NhbGFyKiB2LCBTY2FsYXIgYWxwaGEpIHsKKyAgICB0eXBlZGVmIE1hcDxjb25zdCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiA+IE90aGVyTWFwOworICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiA+KG1hdCArIHN0cmlkZSAqIGkgKyAoVXBMbyA9PSBMb3dlciA/IGkgOiAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwTG8gPT0gTG93ZXIgPyBzaXplIC0gaSA6IChpICsgMSkpICs9CisgICAgICAgICAgbnVtZXh0Ojpjb25qKGFscGhhKSAqIG51bWV4dDo6Y29uaih1W2ldKSAqCisgICAgICAgICAgICAgIE90aGVyTWFwKHYgKyAoVXBMbyA9PSBMb3dlciA/IGkgOiAwKSwgVXBMbyA9PSBMb3dlciA/IHNpemUgLSBpIDogKGkgKyAxKSkgKworICAgICAgICAgIGFscGhhICogbnVtZXh0Ojpjb25qKHZbaV0pICogT3RoZXJNYXAodSArIChVcExvID09IExvd2VyID8gaSA6IDApLCBVcExvID09IExvd2VyID8gc2l6ZSAtIGkgOiAoaSArIDEpKTsKICAgICB9CiAgIH0KIH07CkBAIC0zMywyNSArMzIsMjMgQEAKIC8qIE9wdGltaXplZCBzZWxmYWRqb2ludCBtYXRyaXggKz0gYWxwaGEgKiB1dicgKyBjb25qKGFscGhhKSp2dScKICAqIFRoZSBtYXRyaXggaXMgaW4gcGFja2VkIGZvcm0uCiAgKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgSW5kZXgsIGludCBVcExvPgotc3RydWN0IHBhY2tlZF9yYW5rMl91cGRhdGVfc2VsZWN0b3IKLXsKLSAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHNpemUsIFNjYWxhciogbWF0LCBjb25zdCBTY2FsYXIqIHUsIGNvbnN0IFNjYWxhciogdiwgU2NhbGFyIGFscGhhKQotICB7Ci0gICAgdHlwZWRlZiBNYXA8Y29uc3QgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+ID4gT3RoZXJNYXA7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBJbmRleCwgaW50IFVwTG8+CitzdHJ1Y3QgcGFja2VkX3JhbmsyX3VwZGF0ZV9zZWxlY3RvciB7CisgIHN0YXRpYyB2b2lkIHJ1bihJbmRleCBzaXplLCBTY2FsYXIqIG1hdCwgY29uc3QgU2NhbGFyKiB1LCBjb25zdCBTY2FsYXIqIHYsIFNjYWxhciBhbHBoYSkgeworICAgIHR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+ID4gT3RoZXJNYXA7CiAgICAgSW5kZXggb2Zmc2V0ID0gMDsKLSAgICBmb3IgKEluZGV4IGk9MDsgaTxzaXplOyArK2kpCi0gICAgewotICAgICAgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+KG1hdCtvZmZzZXQsIFVwTG89PUxvd2VyID8gc2l6ZS1pIDogKGkrMSkpICs9Ci0gICAgICBudW1leHQ6OmNvbmooYWxwaGEpICogbnVtZXh0Ojpjb25qKHVbaV0pICogT3RoZXJNYXAodisoVXBMbz09TG93ZXIgPyBpIDogMCksIFVwTG89PUxvd2VyID8gc2l6ZS1pIDogKGkrMSkpCi0gICAgICAgICAgICAgICAgKyBhbHBoYSAqIG51bWV4dDo6Y29uaih2W2ldKSAqIE90aGVyTWFwKHUrKFVwTG89PUxvd2VyID8gaSA6IDApLCBVcExvPT1Mb3dlciA/IHNpemUtaSA6IChpKzEpKTsKLSAgICAgIC8vRklYTUUgVGhpcyBzaG91bGQgYmUgaGFuZGxlZCBvdXRzaWRlLgotICAgICAgbWF0W29mZnNldCsoVXBMbz09TG93ZXIgPyAwIDogaSldID0gbnVtZXh0OjpyZWFsKG1hdFtvZmZzZXQrKFVwTG89PUxvd2VyID8gMCA6IGkpXSk7Ci0gICAgICBvZmZzZXQgKz0gVXBMbz09TG93ZXIgPyBzaXplLWkgOiAoaSsxKTsKKyAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICBNYXA8TWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gPihtYXQgKyBvZmZzZXQsIFVwTG8gPT0gTG93ZXIgPyBzaXplIC0gaSA6IChpICsgMSkpICs9CisgICAgICAgICAgbnVtZXh0Ojpjb25qKGFscGhhKSAqIG51bWV4dDo6Y29uaih1W2ldKSAqCisgICAgICAgICAgICAgIE90aGVyTWFwKHYgKyAoVXBMbyA9PSBMb3dlciA/IGkgOiAwKSwgVXBMbyA9PSBMb3dlciA/IHNpemUgLSBpIDogKGkgKyAxKSkgKworICAgICAgICAgIGFscGhhICogbnVtZXh0Ojpjb25qKHZbaV0pICogT3RoZXJNYXAodSArIChVcExvID09IExvd2VyID8gaSA6IDApLCBVcExvID09IExvd2VyID8gc2l6ZSAtIGkgOiAoaSArIDEpKTsKKyAgICAgIC8vIEZJWE1FIFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgb3V0c2lkZS4KKyAgICAgIG1hdFtvZmZzZXQgKyAoVXBMbyA9PSBMb3dlciA/IDAgOiBpKV0gPSBudW1leHQ6OnJlYWwobWF0W29mZnNldCArIChVcExvID09IExvd2VyID8gMCA6IGkpXSk7CisgICAgICBvZmZzZXQgKz0gVXBMbyA9PSBMb3dlciA/IHNpemUgLSBpIDogKGkgKyAxKTsKICAgICB9CiAgIH0KIH07CiAKLX0gLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gZW5kIG5hbWVzcGFjZSBpbnRlcm5hbAogCi0jZW5kaWYgLy8gRUlHRU5fUkFOSzJVUERBVEVfSAorI2VuZGlmICAvLyBFSUdFTl9SQU5LMlVQREFURV9ICmRpZmYgLS1naXQgYS9ibGFzL2JsYXMuaCBiL2JsYXMvYmxhcy5oCmluZGV4IDI1MjE1YjEuLjY5YTkyNjIgMTAwNjQ0Ci0tLSBhL2JsYXMvYmxhcy5oCisrKyBiL2JsYXMvYmxhcy5oCkBAIC0yLDggKzIsNyBAQAogI2RlZmluZSBCTEFTX0gKIAogI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17CitleHRlcm4gIkMiIHsKICNlbmRpZgogCiAjZGVmaW5lIEJMQVNGVU5DKEZVTkMpIEZVTkMjI18KQEAgLTE2LDQyMiArMTUsNDU0IEBACiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQkxBU1VMT05HOwogI2VuZGlmCiAKLWludCAgICBCTEFTRlVOQyh4ZXJibGEpKGNvbnN0IGNoYXIgKiwgaW50ICppbmZvLCBpbnQpOworaW50IEJMQVNGVU5DKHhlcmJsYSkoY29uc3QgY2hhciAqLCBpbnQgKmluZm8sIGludCk7CiAKLWZsb2F0ICBCTEFTRlVOQyhzZG90KSAgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1mbG9hdCAgQkxBU0ZVTkMoc2RzZG90KShpbnQgKiwgZmxvYXQgICosICAgICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7CitmbG9hdCBCTEFTRlVOQyhzZG90KShpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2Zsb2F0IEJMQVNGVU5DKHNkc2RvdCkoaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CiAKLWRvdWJsZSBCTEFTRlVOQyhkc2RvdCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1kb3VibGUgQkxBU0ZVTkMoZGRvdCkgIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKHFkb3QpICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkc2RvdCkoaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZGRvdCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhxZG90KShpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgIEJMQVNGVU5DKGNkb3R1dykgIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0Kik7Ci1pbnQgIEJMQVNGVU5DKGNkb3RjdykgIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0Kik7Ci1pbnQgIEJMQVNGVU5DKHpkb3R1dykgIChpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlKik7Ci1pbnQgIEJMQVNGVU5DKHpkb3RjdykgIChpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlKik7CitpbnQgQkxBU0ZVTkMoY2RvdHV3KShpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyhjZG90Y3cpKGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICopOworaW50IEJMQVNGVU5DKHpkb3R1dykoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoemRvdGN3KShpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKIAotaW50ICAgIEJMQVNGVU5DKHNheHB5KSAoY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGZsb2F0ICAqLCBjb25zdCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoZGF4cHkpIChjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCAgICBCTEFTRlVOQyhxYXhweSkgKGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGNheHB5KSAoY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGZsb2F0ICAqLCBjb25zdCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoemF4cHkpIChjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCAgICBCTEFTRlVOQyh4YXhweSkgKGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGNheHB5YykoY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGZsb2F0ICAqLCBjb25zdCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoemF4cHljKShjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCAgICBCTEFTRlVOQyh4YXhweWMpKGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHNheHB5KShjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGZsb2F0ICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhkYXhweSkoY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWF4cHkpKGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGNheHB5KShjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGZsb2F0ICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh6YXhweSkoY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGF4cHkpKGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGNheHB5YykoY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLCBmbG9hdCAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemF4cHljKShjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh4YXhweWMpKGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwogCi1pbnQgICAgQkxBU0ZVTkMoc2NvcHkpIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGRjb3B5KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhxY29weSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoY2NvcHkpIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKHpjb3B5KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyh4Y29weSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc2NvcHkpKGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRjb3B5KShpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFjb3B5KShpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNjb3B5KShpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Y29weSkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Y29weSkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50ICAgIEJMQVNGVU5DKHNzd2FwKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhkc3dhcCkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMocXN3YXApIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGNzd2FwKSAoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyh6c3dhcCkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoeHN3YXApIChpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNzd2FwKShpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3dhcCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxc3dhcCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3dhcCkoaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN3YXApKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN3YXApKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWZsb2F0ICBCTEFTRlVOQyhzYXN1bSkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotZmxvYXQgIEJMQVNGVU5DKHNjYXN1bSkoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1kb3VibGUgQkxBU0ZVTkMoZGFzdW0pIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWRvdWJsZSBCTEFTRlVOQyhxYXN1bSkgKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZmxvYXQgQkxBU0ZVTkMoc2FzdW0pKGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitmbG9hdCBCTEFTRlVOQyhzY2FzdW0pKGludCAqLCBmbG9hdCAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZGFzdW0pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFhc3VtKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKIGRvdWJsZSBCTEFTRlVOQyhkemFzdW0pKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogZG91YmxlIEJMQVNGVU5DKHF4YXN1bSkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCAgICBCTEFTRlVOQyhpc2FtYXgpKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGlkYW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoaXFhbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhpY2FtYXgpKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGl6YW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoaXhhbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpc2FtYXgpKGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaWRhbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpcWFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGljYW1heCkoaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpemFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGl4YW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCAgICBCTEFTRlVOQyhpc21heCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGlkbWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoaXFtYXgpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhpY21heCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGl6bWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoaXhtYXgpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpc21heCkoaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpZG1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaXFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGljbWF4KShpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGl6bWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpeG1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCAgICBCTEFTRlVOQyhpc2FtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGlkYW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoaXFhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhpY2FtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGl6YW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoaXhhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpc2FtaW4pKGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaWRhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpcWFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGljYW1pbikoaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpemFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGl4YW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCAgICBCTEFTRlVOQyhpc21pbikoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoaWRtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGlxbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhpY21pbikoaW50ICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoaXptaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGl4bWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpc21pbikoaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpZG1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoaXFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGljbWluKShpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGl6bWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhpeG1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWZsb2F0ICBCTEFTRlVOQyhzYW1heCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKGRhbWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1kb3VibGUgQkxBU0ZVTkMocWFtYXgpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWZsb2F0ICBCTEFTRlVOQyhzY2FtYXgpKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZmxvYXQgQkxBU0ZVTkMoc2FtYXgpKGludCAqLCBmbG9hdCAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZGFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFhbWF4KShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2Zsb2F0IEJMQVNGVU5DKHNjYW1heCkoaW50ICosIGZsb2F0ICosIGludCAqKTsKIGRvdWJsZSBCTEFTRlVOQyhkemFtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogZG91YmxlIEJMQVNGVU5DKHF4YW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWZsb2F0ICBCTEFTRlVOQyhzYW1pbikgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKGRhbWluKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1kb3VibGUgQkxBU0ZVTkMocWFtaW4pIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWZsb2F0ICBCTEFTRlVOQyhzY2FtaW4pKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZmxvYXQgQkxBU0ZVTkMoc2FtaW4pKGludCAqLCBmbG9hdCAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZGFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFhbWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2Zsb2F0IEJMQVNGVU5DKHNjYW1pbikoaW50ICosIGZsb2F0ICosIGludCAqKTsKIGRvdWJsZSBCTEFTRlVOQyhkemFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogZG91YmxlIEJMQVNGVU5DKHF4YW1pbikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWZsb2F0ICBCTEFTRlVOQyhzbWF4KSAgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKGRtYXgpICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1kb3VibGUgQkxBU0ZVTkMocW1heCkgIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWZsb2F0ICBCTEFTRlVOQyhzY21heCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKGR6bWF4KSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1kb3VibGUgQkxBU0ZVTkMocXhtYXgpIChpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2Zsb2F0IEJMQVNGVU5DKHNtYXgpKGludCAqLCBmbG9hdCAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZG1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocW1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitmbG9hdCBCTEFTRlVOQyhzY21heCkoaW50ICosIGZsb2F0ICosIGludCAqKTsKK2RvdWJsZSBCTEFTRlVOQyhkem1heCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMocXhtYXgpKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1mbG9hdCAgQkxBU0ZVTkMoc21pbikgIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWRvdWJsZSBCTEFTRlVOQyhkbWluKSAgKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKHFtaW4pICAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1mbG9hdCAgQkxBU0ZVTkMoc2NtaW4pIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWRvdWJsZSBCTEFTRlVOQyhkem1pbikgKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKHF4bWluKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitmbG9hdCBCTEFTRlVOQyhzbWluKShpbnQgKiwgZmxvYXQgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKGRtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFtaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZmxvYXQgQkxBU0ZVTkMoc2NtaW4pKGludCAqLCBmbG9hdCAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZHptaW4pKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHF4bWluKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50ICAgIEJMQVNGVU5DKHNzY2FsKSAoaW50ICosICBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyhkc2NhbCkgKGludCAqLCAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMocXNjYWwpIChpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGNzY2FsKSAoaW50ICosICBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyh6c2NhbCkgKGludCAqLCAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoeHNjYWwpIChpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50ICAgIEJMQVNGVU5DKGNzc2NhbCkoaW50ICosICBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCAgICBCTEFTRlVOQyh6ZHNjYWwpKGludCAqLCAgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgICAgQkxBU0ZVTkMoeHFzY2FsKShpbnQgKiwgIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNzY2FsKShpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzY2FsKShpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXNjYWwpKGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjc2NhbCkoaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c2NhbCkoaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhzY2FsKShpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3NzY2FsKShpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpkc2NhbCkoaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhxc2NhbCkoaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwogCi1mbG9hdCAgQkxBU0ZVTkMoc25ybTIpIChpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWZsb2F0ICBCTEFTRlVOQyhzY25ybTIpKGludCAqLCBmbG9hdCAgKiwgaW50ICopOworZmxvYXQgQkxBU0ZVTkMoc25ybTIpKGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitmbG9hdCBCTEFTRlVOQyhzY25ybTIpKGludCAqLCBmbG9hdCAqLCBpbnQgKik7CiAKLWRvdWJsZSBCTEFTRlVOQyhkbnJtMikgKGludCAqLCBkb3VibGUgKiwgaW50ICopOwotZG91YmxlIEJMQVNGVU5DKHFucm0yKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Citkb3VibGUgQkxBU0ZVTkMoZG5ybTIpKGludCAqLCBkb3VibGUgKiwgaW50ICopOworZG91YmxlIEJMQVNGVU5DKHFucm0yKShpbnQgKiwgZG91YmxlICosIGludCAqKTsKIGRvdWJsZSBCTEFTRlVOQyhkem5ybTIpKGludCAqLCBkb3VibGUgKiwgaW50ICopOwogZG91YmxlIEJMQVNGVU5DKHF4bnJtMikoaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCAgICBCTEFTRlVOQyhzcm90KSAgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqKTsKLWludCAgICBCTEFTRlVOQyhkcm90KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKLWludCAgICBCTEFTRlVOQyhxcm90KSAgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKLWludCAgICBCTEFTRlVOQyhjc3JvdCkgKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqKTsKLWludCAgICBCTEFTRlVOQyh6ZHJvdCkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKLWludCAgICBCTEFTRlVOQyh4cXJvdCkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhzcm90KShpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyhkcm90KShpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMocXJvdCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKGNzcm90KShpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyh6ZHJvdCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKHhxcm90KShpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKik7CiAKLWludCAgICBCTEFTRlVOQyhzcm90ZykgKGZsb2F0ICAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqKTsKLWludCAgICBCTEFTRlVOQyhkcm90ZykgKGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKLWludCAgICBCTEFTRlVOQyhxcm90ZykgKGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKLWludCAgICBCTEFTRlVOQyhjcm90ZykgKGZsb2F0ICAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqKTsKLWludCAgICBCTEFTRlVOQyh6cm90ZykgKGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKLWludCAgICBCTEFTRlVOQyh4cm90ZykgKGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhzcm90ZykoZmxvYXQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgZmxvYXQgKik7CitpbnQgQkxBU0ZVTkMoZHJvdGcpKGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhxcm90ZykoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKGNyb3RnKShmbG9hdCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyh6cm90ZykoZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKHhyb3RnKShkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKik7CiAKLWludCAgICBCTEFTRlVOQyhzcm90bWcpKGZsb2F0ICAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBmbG9hdCAgKik7Ci1pbnQgICAgQkxBU0ZVTkMoZHJvdG1nKShkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKHNyb3RtZykoZmxvYXQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgZmxvYXQgKik7CitpbnQgQkxBU0ZVTkMoZHJvdG1nKShkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICopOwogCi1pbnQgICAgQkxBU0ZVTkMoc3JvdG0pIChpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKLWludCAgICBCTEFTRlVOQyhkcm90bSkgKGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOwotaW50ICAgIEJMQVNGVU5DKHFyb3RtKSAoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoc3JvdG0pKGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICopOworaW50IEJMQVNGVU5DKGRyb3RtKShpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhxcm90bSkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CiAKIC8qIExldmVsIDIgcm91dGluZXMgKi8KIAotaW50IEJMQVNGVU5DKHNnZXIpKGludCAqLCAgICBpbnQgKiwgZmxvYXQgKiwgIGZsb2F0ICosIGludCAqLAotCQkgICBmbG9hdCAqLCAgaW50ICosIGZsb2F0ICosICBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZGdlcikoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMocWdlcikoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY2dlcnUpKGludCAqLCAgICBpbnQgKiwgZmxvYXQgKiwgIGZsb2F0ICosIGludCAqLAotCQkgICAgZmxvYXQgKiwgIGludCAqLCBmbG9hdCAqLCAgaW50ICopOwotaW50IEJMQVNGVU5DKGNnZXJjKShpbnQgKiwgICAgaW50ICosIGZsb2F0ICosICBmbG9hdCAqLCBpbnQgKiwKLQkJICAgIGZsb2F0ICosICBpbnQgKiwgZmxvYXQgKiwgIGludCAqKTsKLWludCBCTEFTRlVOQyh6Z2VydSkoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpnZXJjKShpbnQgKiwgICAgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeGdlcnUpKGludCAqLCAgICBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4Z2VyYykoaW50ICosICAgIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNnZXIpKGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlcikoaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdlcikoaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlcnUpKGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlcmMpKGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlcnUpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZXJjKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2VydSkoaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlcmMpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc2dlbXYpKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKGRnZW12KShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyhxZ2VtdikoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY2dlbXYpKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKHpnZW12KShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh4Z2VtdikoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc2dlbXYpKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGZsb2F0ICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2VtdikoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocWdlbXYpKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW12KShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBmbG9hdCAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdlbXYpKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHhnZW12KShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKIAotaW50IEJMQVNGVU5DKHN0cnN2KSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyhkdHJzdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMocXRyc3YpIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKGN0cnN2KSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh6dHJzdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeHRyc3YpIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHN0cnN2KShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGZsb2F0ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHJzdikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJzdikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHJzdikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLCBmbG9hdCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRyc3YpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRyc3YpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzdHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkdHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhxdHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjdHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6dHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4dHBzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzdHBzdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHBzdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHF0cHN2KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3Rwc3YpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRwc3YpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHBzdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc3RybXYpIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKGR0cm12KSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyhxdHJtdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3RybXYpIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKHp0cm12KSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh4dHJtdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3RybXYpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwgZmxvYXQgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGR0cm12KShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHF0cm12KShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGN0cm12KShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGZsb2F0ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHJtdikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHJtdikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqKTsKIAotaW50IEJMQVNGVU5DKHN0cG12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGR0cG12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHF0cG12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGN0cG12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHp0cG12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHh0cG12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHN0cG12KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0cG12KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRwbXYpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHBtdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHBtdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0cG12KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzdGJtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGR0Ym12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMocXRibXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjdGJtdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHp0Ym12KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeHRibXYpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzdGJtdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGR0Ym12KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxdGJtdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RibXYpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6dGJtdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRibXYpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc3Ric3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkdGJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHF0YnN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3Ric3YpIChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6dGJzdikgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHh0YnN2KSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3Ric3YpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkdGJzdikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRic3YpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGN0YnN2KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenRic3YpKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHh0YnN2KShjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNzeW12KSAoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyhkc3ltdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMocXN5bXYpIChjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHNzeW12KShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICosIGZsb2F0ICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3ltdikoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhxc3ltdikoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNzcG12KSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICosCi0JCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZHNwbXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLAotCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHFzcG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKLQkJICAgICBkb3VibGUgICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzc3BtdikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3BtdikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFzcG12KShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzc3lyKSAoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGZsb2F0ICAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZHN5cikgKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKHFzeXIpIChjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhzc3lyKShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwgZmxvYXQgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGRzeXIpKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5cikoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNzeXIyKSAoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyhkc3lyMikgKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMocXN5cjIpIChjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKGNzeXIyKSAoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh6c3lyMikgKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeHN5cjIpIChjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHNzeXIyKShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhkc3lyMikoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHFzeXIyKShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5cjIpKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHpzeXIyKShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHN5cjIpKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlICosIGNvbnN0IGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNzcHIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgIGZsb2F0ICAqKTsKLWludCBCTEFTRlVOQyhkc3ByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKik7Ci1pbnQgQkxBU0ZVTkMocXNwcikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICopOworaW50IEJMQVNGVU5DKHNzcHIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyhkc3ByKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMocXNwcikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOwogCi1pbnQgQkxBU0ZVTkMoc3NwcjIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosCi0JCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKLWludCBCTEFTRlVOQyhkc3ByMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKLQkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOwotaW50IEJMQVNGVU5DKHFzcHIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7Ci1pbnQgQkxBU0ZVTkMoY3NwcjIpIChjaGFyICosIGludCAqLCBmbG9hdCAgICosCi0JCSAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKLWludCBCTEFTRlVOQyh6c3ByMikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwKLQkJICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOwotaW50IEJMQVNGVU5DKHhzcHIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoc3NwcjIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKik7CitpbnQgQkxBU0ZVTkMoZHNwcjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKHFzcHIyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhjc3ByMikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyh6c3ByMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoeHNwcjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOwogCi1pbnQgQkxBU0ZVTkMoY2hlcikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwgZmxvYXQgICosIGludCAqLAotCQkgICAgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6aGVyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhoZXIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2hlcikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhjaHByKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqKTsKLWludCBCTEFTRlVOQyh6aHByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKLWludCBCTEFTRlVOQyh4aHByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhjaHByKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKik7CitpbnQgQkxBU0ZVTkMoemhwcikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOworaW50IEJMQVNGVU5DKHhocHIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKIAotaW50IEJMQVNGVU5DKGNoZXIyKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLAotCQkgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpoZXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhoZXIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNoZXIyKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVyMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXIyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhjaHByMikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwKLQkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICopOwotaW50IEJMQVNGVU5DKHpocHIyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLAotCQkgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7Ci1pbnQgQkxBU0ZVTkMoeGhwcjIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosCi0JCSAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhjaHByMikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqKTsKK2ludCBCTEFTRlVOQyh6aHByMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CitpbnQgQkxBU0ZVTkMoeGhwcjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICopOwogCi1pbnQgQkxBU0ZVTkMoY2hlbXYpIChjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKHpoZW12KSAoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh4aGVtdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2hlbXYpKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKiwgZmxvYXQgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHpoZW12KShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHhoZW12KShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoY2hwbXYpIChjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgKiwKLQkJICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6aHBtdikgKGNoYXIgKiwgaW50ICosIGRvdWJsZSAgKiwgZG91YmxlICosCi0JCSAgICAgZG91YmxlICAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeGhwbXYpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLAotCQkgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNocG12KShjaGFyICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpocG12KShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhwbXYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNub3JtKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzbm9ybSkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKIGludCBCTEFTRlVOQyhkbm9ybSkoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY25vcm0pKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNub3JtKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHpub3JtKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMocWdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6Z2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeGdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNnYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosCisgICAgICAgICAgICAgICAgICAgIGludCAqKTsKK2ludCBCTEFTRlVOQyhkZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGludCAqKTsKK2ludCBCTEFTRlVOQyhxZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzc2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCi0JCSAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGRzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMocXNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjc2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCi0JCSAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeHNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotCQkgICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzc2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRzYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhxc2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3NibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6c2JtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHNibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoY2hibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCQkgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6aGJtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JCSAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhoYm12KShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkJICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2hibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGJtdikoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhibXYpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwogCiAvKiBMZXZlbCAzIHJvdXRpbmVzICovCiAKLWludCBCTEFTRlVOQyhzZ2VtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGZsb2F0ICAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZGdlbW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKHFnZW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyhjZ2VtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGZsb2F0ICAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemdlbW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKHhnZW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhzZ2VtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGZsb2F0ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgZmxvYXQgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGRnZW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhxZ2VtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlbW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBmbG9hdCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGZsb2F0ICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGdlbW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoY2dlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosCi0JICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpnZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKLQkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeGdlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAotCSAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2VtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHhnZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzZ2UybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKLQkJICAgICBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgICBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGRnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAotCQkgICAgIGRvdWJsZSAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqLAotCQkgICAgIGRvdWJsZSAqLCBkb3VibGUgICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjZ2UybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwKLQkJICAgICBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwKLQkJICAgICBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLAotCQkgICAgIGRvdWJsZSAqLCBkb3VibGUgICosIGludCAqLCBkb3VibGUgICosIGludCAqLAotCQkgICAgIGRvdWJsZSAqLCBkb3VibGUgICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzZ2UybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLAorICAgICAgICAgICAgICAgICAgICAgaW50ICopOworaW50IEJMQVNGVU5DKGRnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjZ2UybW0pKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLAorICAgICAgICAgICAgICAgICAgICAgaW50ICopOworaW50IEJMQVNGVU5DKHpnZTJtbSkoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHN0cnNtKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgIGNvbnN0IGZsb2F0ICosICBjb25zdCBpbnQgKiwgZmxvYXQgKiwgIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyhkdHJzbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMocXRyc20pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKGN0cnNtKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgIGNvbnN0IGZsb2F0ICosICBjb25zdCBpbnQgKiwgZmxvYXQgKiwgIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh6dHJzbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeHRyc20pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHN0cnNtKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGZsb2F0ICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhkdHJzbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXRyc20pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGN0cnNtKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGZsb2F0ICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh6dHJzbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeHRyc20pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc3RybW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCAgY29uc3QgZmxvYXQgKiwgIGNvbnN0IGludCAqLCBmbG9hdCAqLCAgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKGR0cm1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyhxdHJtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3RybW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCAgY29uc3QgZmxvYXQgKiwgIGNvbnN0IGludCAqLCBmbG9hdCAqLCAgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKHp0cm1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh4dHJtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3RybW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwgZmxvYXQgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGR0cm1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhxdHJtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RybW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwgZmxvYXQgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHp0cm1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh4dHJtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzc3ltbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyhkc3ltbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyhxc3ltbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyhjc3ltbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh6c3ltbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh4c3ltbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhzc3ltbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBmbG9hdCAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZHN5bW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5bW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5bW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgZmxvYXQgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHpzeW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHhzeW1tKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoY3N5bW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6c3ltbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhzeW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5bW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5bW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgICAgaW50ICopOworaW50IEJMQVNGVU5DKHhzeW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNzeXJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyhkc3lyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMocXN5cmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKGNzeXJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh6c3lyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeHN5cmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHNzeXJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKiwgZmxvYXQgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGRzeXJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhxc3lyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5cmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqLCBmbG9hdCAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5cmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHhzeXJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKGRzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKHFzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKGNzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKHpzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKHhzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHNzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgZmxvYXQgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGRzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMocXN5cjJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhjc3lyMmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGZsb2F0ICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh6c3lyMmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHhzeXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhjaGVtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh6aGVtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh4aGVtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyhjaGVtbSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgZmxvYXQgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBmbG9hdCAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlbW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhlbW0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhjaGVtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgICosIGludCAqLAotCSAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemhlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwKLQkgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhoZW1tM20pKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0JICAgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjaGVtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6aGVtbTNtKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoeGhlbW0zbSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgICAgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoY2hlcmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKHpoZXJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh4aGVyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2hlcmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqLCBmbG9hdCAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlcmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKIAotaW50IEJMQVNGVU5DKGNoZXIyaykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGZsb2F0ICAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgZmxvYXQgICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh6aGVyMmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoeGhlcjJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKGNoZXIybSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZmxvYXQgICosIGZsb2F0ICAqLCBjb25zdCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemhlcjJtKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh4aGVyMm0pKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwotCitpbnQgQkxBU0ZVTkMoY2hlcjJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBmbG9hdCAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlcjJrKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKK2ludCBCTEFTRlVOQyh4aGVyMmspKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKGNoZXIybSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBmbG9hdCAqLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBmbG9hdCAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoemhlcjJtKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHhoZXIybSkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9ibGFzL2NvbW1vbi5oIGIvYmxhcy9jb21tb24uaAppbmRleCAwMzY0NjAyLi5iZjkxYTgzIDEwMDY0NAotLS0gYS9ibGFzL2NvbW1vbi5oCisrKyBiL2JsYXMvY29tbW9uLmgKQEAgLTExLDExICsxMSwxMSBAQAogI2RlZmluZSBFSUdFTl9CTEFTX0NPTU1PTl9ICiAKICNpZmRlZiBfX0dOVUNfXwotIyBpZiBfX0dOVUNfXzw1CisjaWYgX19HTlVDX18gPCA1CiAvLyBHQ0MgPCA1LjAgZG9lcyBub3QgbGlrZSB0aGUgZ2xvYmFsIFNjYWxhciB0eXBlZGVmCiAvLyB3ZSBqdXN0IGtlZXAgc2hhZG93LXdhcm5pbmdzIGRpc2FibGVkIHBlcm1hbmVudGx5Ci0jICBkZWZpbmUgRUlHRU5fUEVSTUFORU5UTFlfRElTQUJMRV9TVFVQSURfV0FSTklOR1MKLSMgZW5kaWYKKyNkZWZpbmUgRUlHRU5fUEVSTUFORU5UTFlfRElTQUJMRV9TVFVQSURfV0FSTklOR1MKKyNlbmRpZgogI2VuZGlmCiAKICNpbmNsdWRlICIuLi9FaWdlbi9Db3JlIgpAQCAtMjksNTQgKzI5LDM1IEBACiAKICNpbmNsdWRlICJibGFzLmgiCiAKLSNkZWZpbmUgTk9UUiAgICAwCi0jZGVmaW5lIFRSICAgICAgMQotI2RlZmluZSBBREogICAgIDIKKyNkZWZpbmUgTk9UUiAwCisjZGVmaW5lIFRSIDEKKyNkZWZpbmUgQURKIDIKIAotI2RlZmluZSBMRUZUICAgIDAKLSNkZWZpbmUgUklHSFQgICAxCisjZGVmaW5lIExFRlQgMAorI2RlZmluZSBSSUdIVCAxCiAKLSNkZWZpbmUgVVAgICAgICAwCi0jZGVmaW5lIExPICAgICAgMQorI2RlZmluZSBVUCAwCisjZGVmaW5lIExPIDEKIAotI2RlZmluZSBOVU5JVCAgIDAKLSNkZWZpbmUgVU5JVCAgICAxCisjZGVmaW5lIE5VTklUIDAKKyNkZWZpbmUgVU5JVCAxCiAKICNkZWZpbmUgSU5WQUxJRCAweGZmCiAKLSNkZWZpbmUgT1AoWCkgICAoICAgKChYKT09J04nIHx8IChYKT09J24nKSA/IE5PVFIgICBcCi0gICAgICAgICAgICAgICAgICA6ICgoWCk9PSdUJyB8fCAoWCk9PSd0JykgPyBUUiAgICAgXAotICAgICAgICAgICAgICAgICAgOiAoKFgpPT0nQycgfHwgKFgpPT0nYycpID8gQURKICAgIFwKLSAgICAgICAgICAgICAgICAgIDogSU5WQUxJRCkKKyNkZWZpbmUgT1AoWCkgXAorICAoKChYKSA9PSAnTicgfHwgKFgpID09ICduJykgPyBOT1RSIDogKChYKSA9PSAnVCcgfHwgKFgpID09ICd0JykgPyBUUiA6ICgoWCkgPT0gJ0MnIHx8IChYKSA9PSAnYycpID8gQURKIDogSU5WQUxJRCkKIAotI2RlZmluZSBTSURFKFgpICggICAoKFgpPT0nTCcgfHwgKFgpPT0nbCcpID8gTEVGVCAgIFwKLSAgICAgICAgICAgICAgICAgIDogKChYKT09J1InIHx8IChYKT09J3InKSA/IFJJR0hUICBcCi0gICAgICAgICAgICAgICAgICA6IElOVkFMSUQpCisjZGVmaW5lIFNJREUoWCkgKCgoWCkgPT0gJ0wnIHx8IChYKSA9PSAnbCcpID8gTEVGVCA6ICgoWCkgPT0gJ1InIHx8IChYKSA9PSAncicpID8gUklHSFQgOiBJTlZBTElEKQogCi0jZGVmaW5lIFVQTE8oWCkgKCAgICgoWCk9PSdVJyB8fCAoWCk9PSd1JykgPyBVUCAgICAgXAotICAgICAgICAgICAgICAgICAgOiAoKFgpPT0nTCcgfHwgKFgpPT0nbCcpID8gTE8gICAgIFwKLSAgICAgICAgICAgICAgICAgIDogSU5WQUxJRCkKKyNkZWZpbmUgVVBMTyhYKSAoKChYKSA9PSAnVScgfHwgKFgpID09ICd1JykgPyBVUCA6ICgoWCkgPT0gJ0wnIHx8IChYKSA9PSAnbCcpID8gTE8gOiBJTlZBTElEKQogCi0jZGVmaW5lIERJQUcoWCkgKCAgICgoWCk9PSdOJyB8fCAoWCk9PSduJykgPyBOVU5JVCAgXAotICAgICAgICAgICAgICAgICAgOiAoKFgpPT0nVScgfHwgKFgpPT0ndScpID8gVU5JVCAgIFwKLSAgICAgICAgICAgICAgICAgIDogSU5WQUxJRCkKKyNkZWZpbmUgRElBRyhYKSAoKChYKSA9PSAnTicgfHwgKFgpID09ICduJykgPyBOVU5JVCA6ICgoWCkgPT0gJ1UnIHx8IChYKSA9PSAndScpID8gVU5JVCA6IElOVkFMSUQpCiAKK2lubGluZSBib29sIGNoZWNrX29wKGNvbnN0IGNoYXIqIG9wKSB7IHJldHVybiBPUCgqb3ApICE9IDB4ZmY7IH0KIAotaW5saW5lIGJvb2wgY2hlY2tfb3AoY29uc3QgY2hhciogb3ApCi17Ci0gIHJldHVybiBPUCgqb3ApIT0weGZmOwotfQoraW5saW5lIGJvb2wgY2hlY2tfc2lkZShjb25zdCBjaGFyKiBzaWRlKSB7IHJldHVybiBTSURFKCpzaWRlKSAhPSAweGZmOyB9CiAKLWlubGluZSBib29sIGNoZWNrX3NpZGUoY29uc3QgY2hhciogc2lkZSkKLXsKLSAgcmV0dXJuIFNJREUoKnNpZGUpIT0weGZmOwotfQotCi1pbmxpbmUgYm9vbCBjaGVja191cGxvKGNvbnN0IGNoYXIqIHVwbG8pCi17Ci0gIHJldHVybiBVUExPKCp1cGxvKSE9MHhmZjsKLX0KLQoraW5saW5lIGJvb2wgY2hlY2tfdXBsbyhjb25zdCBjaGFyKiB1cGxvKSB7IHJldHVybiBVUExPKCp1cGxvKSAhPSAweGZmOyB9CiAKIG5hbWVzcGFjZSBFaWdlbiB7CiAjaW5jbHVkZSAiQmFuZFRyaWFuZ3VsYXJTb2x2ZXIuaCIKQEAgLTg1LDcgKzY2LDcgQEAKICNpbmNsdWRlICJQYWNrZWRUcmlhbmd1bGFyTWF0cml4VmVjdG9yLmgiCiAjaW5jbHVkZSAiUGFja2VkVHJpYW5ndWxhclNvbHZlclZlY3Rvci5oIgogI2luY2x1ZGUgIlJhbmsyVXBkYXRlLmgiCi19Cit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCkBAIC05Myw3NiArNzQsNjUgQEAKIHR5cGVkZWYgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXg7CiAKLWVudW0KLXsKLSAgSXNDb21wbGV4ID0gRWlnZW46Ok51bVRyYWl0czxTQ0FMQVI+OjpJc0NvbXBsZXgsCi0gIENvbmogPSBJc0NvbXBsZXgKLX07CitlbnVtIHsgSXNDb21wbGV4ID0gRWlnZW46Ok51bVRyYWl0czxTQ0FMQVI+OjpJc0NvbXBsZXgsIENvbmogPSBJc0NvbXBsZXggfTsKIAotdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4gUGxhaW5NYXRyaXhUeXBlOwotdHlwZWRlZiBNYXA8TWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4gTWF0cml4VHlwZTsKLXR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IENvbnN0TWF0cml4VHlwZTsKLXR5cGVkZWYgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiwgMCwgSW5uZXJTdHJpZGU8RHluYW1pYz4gPiBTdHJpZGVkVmVjdG9yVHlwZTsKLXR5cGVkZWYgTWFwPE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiA+IENvbXBhY3RWZWN0b3JUeXBlOwordHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBDb2xNYWpvcj4gUGxhaW5NYXRyaXhUeXBlOwordHlwZWRlZiBNYXA8TWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgQ29sTWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4gTWF0cml4VHlwZTsKK3R5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+IENvbnN0TWF0cml4VHlwZTsKK3R5cGVkZWYgTWFwPE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+LCAwLCBJbm5lclN0cmlkZTxEeW5hbWljPiA+IFN0cmlkZWRWZWN0b3JUeXBlOwordHlwZWRlZiBNYXA8TWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gPiBDb21wYWN0VmVjdG9yVHlwZTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLU1hcDxNYXRyaXg8VCxEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4KLW1hdHJpeChUKiBkYXRhLCBpbnQgcm93cywgaW50IGNvbHMsIGludCBzdHJpZGUpCi17Ci0gIHJldHVybiBNYXA8TWF0cml4PFQsRHluYW1pYyxEeW5hbWljLENvbE1ham9yPiwgMCwgT3V0ZXJTdHJpZGU8PiA+KGRhdGEsIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPD4oc3RyaWRlKSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK01hcDxNYXRyaXg8VCwgRHluYW1pYywgRHluYW1pYywgQ29sTWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4gbWF0cml4KFQqIGRhdGEsIGludCByb3dzLCBpbnQgY29scywgaW50IHN0cmlkZSkgeworICByZXR1cm4gTWFwPE1hdHJpeDxULCBEeW5hbWljLCBEeW5hbWljLCBDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPihkYXRhLCByb3dzLCBjb2xzLCBPdXRlclN0cmlkZTw+KHN0cmlkZSkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotTWFwPGNvbnN0IE1hdHJpeDxULER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPgotbWF0cml4KGNvbnN0IFQqIGRhdGEsIGludCByb3dzLCBpbnQgY29scywgaW50IHN0cmlkZSkKLXsKLSAgcmV0dXJuIE1hcDxjb25zdCBNYXRyaXg8VCxEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+LCAwLCBPdXRlclN0cmlkZTw+ID4oZGF0YSwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8PihzdHJpZGUpKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorTWFwPGNvbnN0IE1hdHJpeDxULCBEeW5hbWljLCBEeW5hbWljLCBDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPiBtYXRyaXgoY29uc3QgVCogZGF0YSwgaW50IHJvd3MsIGludCBjb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgeworICByZXR1cm4gTWFwPGNvbnN0IE1hdHJpeDxULCBEeW5hbWljLCBEeW5hbWljLCBDb2xNYWpvcj4sIDAsIE91dGVyU3RyaWRlPD4gPihkYXRhLCByb3dzLCBjb2xzLCBPdXRlclN0cmlkZTw+KHN0cmlkZSkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotTWFwPE1hdHJpeDxULER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPER5bmFtaWM+ID4gbWFrZV92ZWN0b3IoVCogZGF0YSwgaW50IHNpemUsIGludCBpbmNyKQotewotICByZXR1cm4gTWFwPE1hdHJpeDxULER5bmFtaWMsMT4sIDAsIElubmVyU3RyaWRlPER5bmFtaWM+ID4oZGF0YSwgc2l6ZSwgSW5uZXJTdHJpZGU8RHluYW1pYz4oaW5jcikpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitNYXA8TWF0cml4PFQsIER5bmFtaWMsIDE+LCAwLCBJbm5lclN0cmlkZTxEeW5hbWljPiA+IG1ha2VfdmVjdG9yKFQqIGRhdGEsIGludCBzaXplLCBpbnQgaW5jcikgeworICByZXR1cm4gTWFwPE1hdHJpeDxULCBEeW5hbWljLCAxPiwgMCwgSW5uZXJTdHJpZGU8RHluYW1pYz4gPihkYXRhLCBzaXplLCBJbm5lclN0cmlkZTxEeW5hbWljPihpbmNyKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1NYXA8Y29uc3QgTWF0cml4PFQsRHluYW1pYywxPiwgMCwgSW5uZXJTdHJpZGU8RHluYW1pYz4gPiBtYWtlX3ZlY3Rvcihjb25zdCBUKiBkYXRhLCBpbnQgc2l6ZSwgaW50IGluY3IpCi17Ci0gIHJldHVybiBNYXA8Y29uc3QgTWF0cml4PFQsRHluYW1pYywxPiwgMCwgSW5uZXJTdHJpZGU8RHluYW1pYz4gPihkYXRhLCBzaXplLCBJbm5lclN0cmlkZTxEeW5hbWljPihpbmNyKSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK01hcDxjb25zdCBNYXRyaXg8VCwgRHluYW1pYywgMT4sIDAsIElubmVyU3RyaWRlPER5bmFtaWM+ID4gbWFrZV92ZWN0b3IoY29uc3QgVCogZGF0YSwgaW50IHNpemUsIGludCBpbmNyKSB7CisgIHJldHVybiBNYXA8Y29uc3QgTWF0cml4PFQsIER5bmFtaWMsIDE+LCAwLCBJbm5lclN0cmlkZTxEeW5hbWljPiA+KGRhdGEsIHNpemUsIElubmVyU3RyaWRlPER5bmFtaWM+KGluY3IpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLU1hcDxNYXRyaXg8VCxEeW5hbWljLDE+ID4gbWFrZV92ZWN0b3IoVCogZGF0YSwgaW50IHNpemUpCi17Ci0gIHJldHVybiBNYXA8TWF0cml4PFQsRHluYW1pYywxPiA+KGRhdGEsIHNpemUpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitNYXA8TWF0cml4PFQsIER5bmFtaWMsIDE+ID4gbWFrZV92ZWN0b3IoVCogZGF0YSwgaW50IHNpemUpIHsKKyAgcmV0dXJuIE1hcDxNYXRyaXg8VCwgRHluYW1pYywgMT4gPihkYXRhLCBzaXplKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLU1hcDxjb25zdCBNYXRyaXg8VCxEeW5hbWljLDE+ID4gbWFrZV92ZWN0b3IoY29uc3QgVCogZGF0YSwgaW50IHNpemUpCi17Ci0gIHJldHVybiBNYXA8Y29uc3QgTWF0cml4PFQsRHluYW1pYywxPiA+KGRhdGEsIHNpemUpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitNYXA8Y29uc3QgTWF0cml4PFQsIER5bmFtaWMsIDE+ID4gbWFrZV92ZWN0b3IoY29uc3QgVCogZGF0YSwgaW50IHNpemUpIHsKKyAgcmV0dXJuIE1hcDxjb25zdCBNYXRyaXg8VCwgRHluYW1pYywgMT4gPihkYXRhLCBzaXplKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLVQqIGdldF9jb21wYWN0X3ZlY3RvcihUKiB4LCBpbnQgbiwgaW50IGluY3gpCi17Ci0gIGlmKGluY3g9PTEpCi0gICAgcmV0dXJuIHg7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QqIGdldF9jb21wYWN0X3ZlY3RvcihUKiB4LCBpbnQgbiwgaW50IGluY3gpIHsKKyAgaWYgKGluY3ggPT0gMSkgcmV0dXJuIHg7CiAKICAgc3RkOjpyZW1vdmVfY29uc3RfdDxUPiogcmV0ID0gbmV3IFNjYWxhcltuXTsKLSAgaWYoaW5jeDwwKSBtYWtlX3ZlY3RvcihyZXQsbikgPSBtYWtlX3ZlY3Rvcih4LG4sLWluY3gpLnJldmVyc2UoKTsKLSAgZWxzZSAgICAgICBtYWtlX3ZlY3RvcihyZXQsbikgPSBtYWtlX3ZlY3Rvcih4LG4sIGluY3gpOworICBpZiAoaW5jeCA8IDApCisgICAgbWFrZV92ZWN0b3IocmV0LCBuKSA9IG1ha2VfdmVjdG9yKHgsIG4sIC1pbmN4KS5yZXZlcnNlKCk7CisgIGVsc2UKKyAgICBtYWtlX3ZlY3RvcihyZXQsIG4pID0gbWFrZV92ZWN0b3IoeCwgbiwgaW5jeCk7CiAgIHJldHVybiByZXQ7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1UKiBjb3B5X2JhY2soVCogeF9jcHksIFQqIHgsIGludCBuLCBpbnQgaW5jeCkKLXsKLSAgaWYoeF9jcHk9PXgpCi0gICAgcmV0dXJuIDA7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QqIGNvcHlfYmFjayhUKiB4X2NweSwgVCogeCwgaW50IG4sIGludCBpbmN4KSB7CisgIGlmICh4X2NweSA9PSB4KSByZXR1cm4gMDsKIAotICBpZihpbmN4PDApIG1ha2VfdmVjdG9yKHgsbiwtaW5jeCkucmV2ZXJzZSgpID0gbWFrZV92ZWN0b3IoeF9jcHksbik7Ci0gIGVsc2UgICAgICAgbWFrZV92ZWN0b3IoeCxuLCBpbmN4KSAgICAgICAgICAgPSBtYWtlX3ZlY3Rvcih4X2NweSxuKTsKKyAgaWYgKGluY3ggPCAwKQorICAgIG1ha2VfdmVjdG9yKHgsIG4sIC1pbmN4KS5yZXZlcnNlKCkgPSBtYWtlX3ZlY3Rvcih4X2NweSwgbik7CisgIGVsc2UKKyAgICBtYWtlX3ZlY3Rvcih4LCBuLCBpbmN4KSA9IG1ha2VfdmVjdG9yKHhfY3B5LCBuKTsKICAgcmV0dXJuIHhfY3B5OwogfQogCkBAIC0xNzIsNCArMTQyLDQgQEAKIAogI2RlZmluZSBFSUdFTl9CTEFTX0ZVTkMoWCkgRUlHRU5fQ0FUKFNDQUxBUl9TVUZGSVgsIEVJR0VOX0NBVChYLCBFSUdFTl9CTEFTX0ZVTkNfU1VGRklYKSkKIAotI2VuZGlmIC8vIEVJR0VOX0JMQVNfQ09NTU9OX0gKKyNlbmRpZiAgLy8gRUlHRU5fQkxBU19DT01NT05fSApkaWZmIC0tZ2l0IGEvYmxhcy9jb21wbGV4X2RvdWJsZS5jcHAgYi9ibGFzL2NvbXBsZXhfZG91YmxlLmNwcAppbmRleCA2NDhjNmQ0Li45NGI5ZDIwIDEwMDY0NAotLS0gYS9ibGFzL2NvbXBsZXhfZG91YmxlLmNwcAorKysgYi9ibGFzL2NvbXBsZXhfZG91YmxlLmNwcApAQCAtNywxMSArNywxMSBAQAogLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCiAvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KIAotI2RlZmluZSBTQ0FMQVIgICAgICAgIHN0ZDo6Y29tcGxleDxkb3VibGU+CisjZGVmaW5lIFNDQUxBUiBzdGQ6OmNvbXBsZXg8ZG91YmxlPgogI2RlZmluZSBTQ0FMQVJfU1VGRklYIHoKICNkZWZpbmUgU0NBTEFSX1NVRkZJWF9VUCAiWiIKICNkZWZpbmUgUkVBTF9TQ0FMQVJfU1VGRklYIGQKLSNkZWZpbmUgSVNDT01QTEVYICAgICAxCisjZGVmaW5lIElTQ09NUExFWCAxCiAKICNpbmNsdWRlICJsZXZlbDFfaW1wbC5oIgogI2luY2x1ZGUgImxldmVsMV9jcGx4X2ltcGwuaCIKZGlmZiAtLWdpdCBhL2JsYXMvY29tcGxleF9zaW5nbGUuY3BwIGIvYmxhcy9jb21wbGV4X3NpbmdsZS5jcHAKaW5kZXggNzc4NjUxOS4uODQyZmFlYyAxMDA2NDQKLS0tIGEvYmxhcy9jb21wbGV4X3NpbmdsZS5jcHAKKysrIGIvYmxhcy9jb21wbGV4X3NpbmdsZS5jcHAKQEAgLTcsMTEgKzcsMTEgQEAKIC8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAogLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCiAKLSNkZWZpbmUgU0NBTEFSICAgICAgICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+CisjZGVmaW5lIFNDQUxBUiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+CiAjZGVmaW5lIFNDQUxBUl9TVUZGSVggYwogI2RlZmluZSBTQ0FMQVJfU1VGRklYX1VQICJDIgogI2RlZmluZSBSRUFMX1NDQUxBUl9TVUZGSVggcwotI2RlZmluZSBJU0NPTVBMRVggICAgIDEKKyNkZWZpbmUgSVNDT01QTEVYIDEKIAogI2luY2x1ZGUgImxldmVsMV9pbXBsLmgiCiAjaW5jbHVkZSAibGV2ZWwxX2NwbHhfaW1wbC5oIgpkaWZmIC0tZ2l0IGEvYmxhcy9kb3VibGUuY3BwIGIvYmxhcy9kb3VibGUuY3BwCmluZGV4IGViMmU1NzMuLmVlZjU4OTEgMTAwNjQ0Ci0tLSBhL2JsYXMvZG91YmxlLmNwcAorKysgYi9ibGFzL2RvdWJsZS5jcHAKQEAgLTgsMTAgKzgsMTAgQEAKIC8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAogLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCiAKLSNkZWZpbmUgU0NBTEFSICAgICAgICBkb3VibGUKKyNkZWZpbmUgU0NBTEFSIGRvdWJsZQogI2RlZmluZSBTQ0FMQVJfU1VGRklYIGQKICNkZWZpbmUgU0NBTEFSX1NVRkZJWF9VUCAiRCIKLSNkZWZpbmUgSVNDT01QTEVYICAgICAwCisjZGVmaW5lIElTQ09NUExFWCAwCiAKICNpbmNsdWRlICJsZXZlbDFfaW1wbC5oIgogI2luY2x1ZGUgImxldmVsMV9yZWFsX2ltcGwuaCIKQEAgLTE5LDE0ICsxOSwyNSBAQAogI2luY2x1ZGUgImxldmVsMl9yZWFsX2ltcGwuaCIKICNpbmNsdWRlICJsZXZlbDNfaW1wbC5oIgogCi1kb3VibGUgRUlHRU5fQkxBU19GVU5DKHNkb3QpKGludCogbiwgZmxvYXQqIHgsIGludCogaW5jeCwgZmxvYXQqIHksIGludCogaW5jeSkKLXsKLSAgaWYoKm48PTApIHJldHVybiAwOworZG91YmxlIEVJR0VOX0JMQVNfRlVOQyhzZG90KShpbnQqIG4sIGZsb2F0KiB4LCBpbnQqIGluY3gsIGZsb2F0KiB5LCBpbnQqIGluY3kpIHsKKyAgaWYgKCpuIDw9IDApIHJldHVybiAwOwogCi0gIGlmKCppbmN4PT0xICYmICppbmN5PT0xKSAgICByZXR1cm4gKG1ha2VfdmVjdG9yKHgsKm4pLmNhc3Q8ZG91YmxlPigpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCpuKS5jYXN0PGRvdWJsZT4oKSkpLnN1bSgpOwotICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k+MCkgcmV0dXJuIChtYWtlX3ZlY3Rvcih4LCpuLCppbmN4KS5jYXN0PGRvdWJsZT4oKS5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwqbiwqaW5jeSkuY2FzdDxkb3VibGU+KCkpKS5zdW0oKTsKLSAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PjApIHJldHVybiAobWFrZV92ZWN0b3IoeCwqbiwtKmluY3gpLnJldmVyc2UoKS5jYXN0PGRvdWJsZT4oKS5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwqbiwqaW5jeSkuY2FzdDxkb3VibGU+KCkpKS5zdW0oKTsKLSAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PDApIHJldHVybiAobWFrZV92ZWN0b3IoeCwqbiwqaW5jeCkuY2FzdDxkb3VibGU+KCkuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksKm4sLSppbmN5KS5yZXZlcnNlKCkuY2FzdDxkb3VibGU+KCkpKS5zdW0oKTsKLSAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PDApIHJldHVybiAobWFrZV92ZWN0b3IoeCwqbiwtKmluY3gpLnJldmVyc2UoKS5jYXN0PGRvdWJsZT4oKS5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwqbiwtKmluY3kpLnJldmVyc2UoKS5jYXN0PGRvdWJsZT4oKSkpLnN1bSgpOwotICBlbHNlIHJldHVybiAwOworICBpZiAoKmluY3ggPT0gMSAmJiAqaW5jeSA9PSAxKQorICAgIHJldHVybiAobWFrZV92ZWN0b3IoeCwgKm4pLmNhc3Q8ZG91YmxlPigpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCAqbikuY2FzdDxkb3VibGU+KCkpKS5zdW0oKTsKKyAgZWxzZSBpZiAoKmluY3ggPiAwICYmICppbmN5ID4gMCkKKyAgICByZXR1cm4gKG1ha2VfdmVjdG9yKHgsICpuLCAqaW5jeCkuY2FzdDxkb3VibGU+KCkuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksICpuLCAqaW5jeSkuY2FzdDxkb3VibGU+KCkpKS5zdW0oKTsKKyAgZWxzZSBpZiAoKmluY3ggPCAwICYmICppbmN5ID4gMCkKKyAgICByZXR1cm4gKG1ha2VfdmVjdG9yKHgsICpuLCAtKmluY3gpLnJldmVyc2UoKS5jYXN0PGRvdWJsZT4oKS5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwgKm4sICppbmN5KS5jYXN0PGRvdWJsZT4oKSkpCisgICAgICAgIC5zdW0oKTsKKyAgZWxzZSBpZiAoKmluY3ggPiAwICYmICppbmN5IDwgMCkKKyAgICByZXR1cm4gKG1ha2VfdmVjdG9yKHgsICpuLCAqaW5jeCkuY2FzdDxkb3VibGU+KCkuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksICpuLCAtKmluY3kpLnJldmVyc2UoKS5jYXN0PGRvdWJsZT4oKSkpCisgICAgICAgIC5zdW0oKTsKKyAgZWxzZSBpZiAoKmluY3ggPCAwICYmICppbmN5IDwgMCkKKyAgICByZXR1cm4gKG1ha2VfdmVjdG9yKHgsICpuLCAtKmluY3gpCisgICAgICAgICAgICAgICAgLnJldmVyc2UoKQorICAgICAgICAgICAgICAgIC5jYXN0PGRvdWJsZT4oKQorICAgICAgICAgICAgICAgIC5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwgKm4sIC0qaW5jeSkucmV2ZXJzZSgpLmNhc3Q8ZG91YmxlPigpKSkKKyAgICAgICAgLnN1bSgpOworICBlbHNlCisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9ibGFzL2YyYy9kYXRhdHlwZXMuaCBiL2JsYXMvZjJjL2RhdGF0eXBlcy5oCmluZGV4IDYzMjMyYjIuLjdjMmY0YWUgMTAwNjQ0Ci0tLSBhL2JsYXMvZjJjL2RhdGF0eXBlcy5oCisrKyBiL2JsYXMvZjJjL2RhdGF0eXBlcy5oCkBAIC05LDE2ICs5LDIwIEBACiB0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50ZWdlcjsKIHR5cGVkZWYgZmxvYXQgcmVhbDsKIHR5cGVkZWYgZG91YmxlIGRvdWJsZXJlYWw7Ci10eXBlZGVmIHN0cnVjdCB7IHJlYWwgciwgaTsgfSBjb21wbGV4OwotdHlwZWRlZiBzdHJ1Y3QgeyBkb3VibGVyZWFsIHIsIGk7IH0gZG91YmxlY29tcGxleDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgcmVhbCByLCBpOworfSBjb21wbGV4OwordHlwZWRlZiBzdHJ1Y3QgeworICBkb3VibGVyZWFsIHIsIGk7Cit9IGRvdWJsZWNvbXBsZXg7CiB0eXBlZGVmIGludCBmdG5sZW47CiB0eXBlZGVmIGludCBsb2dpY2FsOwogCiAjZGVmaW5lIGFicyh4KSAoKHgpID49IDAgPyAoeCkgOiAtKHgpKQotI2RlZmluZSBkYWJzKHgpIChkb3VibGVyZWFsKWFicyh4KQotI2RlZmluZSBtaW4oYSxiKSAoKGEpIDw9IChiKSA/IChhKSA6IChiKSkKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+PSAoYikgPyAoYSkgOiAoYikpCi0jZGVmaW5lIGRtaW4oYSxiKSAoZG91YmxlcmVhbCltaW4oYSxiKQotI2RlZmluZSBkbWF4KGEsYikgKGRvdWJsZXJlYWwpbWF4KGEsYikKKyNkZWZpbmUgZGFicyh4KSAoZG91YmxlcmVhbCkgYWJzKHgpCisjZGVmaW5lIG1pbihhLCBiKSAoKGEpIDw9IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgbWF4KGEsIGIpICgoYSkgPj0gKGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBkbWluKGEsIGIpIChkb3VibGVyZWFsKSBtaW4oYSwgYikKKyNkZWZpbmUgZG1heChhLCBiKSAoZG91YmxlcmVhbCkgbWF4KGEsIGIpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYmxhcy9sZXZlbDFfY3BseF9pbXBsLmggYi9ibGFzL2xldmVsMV9jcGx4X2ltcGwuaAppbmRleCBhYTQ2Nzg0Li41NTJiMzg0IDEwMDY0NAotLS0gYS9ibGFzL2xldmVsMV9jcGx4X2ltcGwuaAorKysgYi9ibGFzL2xldmVsMV9jcGx4X2ltcGwuaApAQCAtMTEsMTQ0ICsxMSwxNTUgQEAKIAogc3RydWN0IHNjYWxhcl9ub3JtMV9vcCB7CiAgIHR5cGVkZWYgUmVhbFNjYWxhciByZXN1bHRfdHlwZTsKLSAgaW5saW5lIFJlYWxTY2FsYXIgb3BlcmF0b3IoKSAoY29uc3QgU2NhbGFyJiBhKSBjb25zdCB7IHJldHVybiBudW1leHQ6Om5vcm0xKGEpOyB9CisgIGlubGluZSBSZWFsU2NhbGFyIG9wZXJhdG9yKCkoY29uc3QgU2NhbGFyICZhKSBjb25zdCB7IHJldHVybiBudW1leHQ6Om5vcm0xKGEpOyB9CiB9OwogbmFtZXNwYWNlIEVpZ2VuIHsKLSAgbmFtZXNwYWNlIGludGVybmFsIHsKLSAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBmdW5jdG9yX3RyYWl0czxzY2FsYXJfbm9ybTFfb3AgPgotICAgIHsKLSAgICAgIGVudW0geyBDb3N0ID0gMyAqIE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LCBQYWNrZXRBY2Nlc3MgPSAwIH07Ci0gICAgfTsKLSAgfQotfQorbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8c2NhbGFyX25vcm0xX29wPiB7CisgIGVudW0geyBDb3N0ID0gMyAqIE51bVRyYWl0czxTY2FsYXI+OjpBZGRDb3N0LCBQYWNrZXRBY2Nlc3MgPSAwIH07Cit9OworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KIAogLy8gY29tcHV0ZXMgdGhlIHN1bSBvZiBtYWduaXR1ZGVzIG9mIGFsbCB2ZWN0b3IgZWxlbWVudHMgb3IsIGZvciBhIGNvbXBsZXggdmVjdG9yIHgsIHRoZSBzdW0KIC8vIHJlcyA9IHxSZXgxfCArIHxJbXgxfCArIHxSZXgyfCArIHxJbXgyfCArIC4uLiArIHxSZXhufCArIHxJbXhufCwgd2hlcmUgeCBpcyBhIHZlY3RvciBvZiBvcmRlciBuCi1SZWFsU2NhbGFyIEVJR0VOX0NBVChSRUFMX1NDQUxBUl9TVUZGSVgsIEVJR0VOX0JMQVNfRlVOQyhhc3VtKSkoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KQotewotLy8gICBzdGQ6OmNlcnIgPDwgIl9fYXN1bSAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiXG4iOwotICBDb21wbGV4KiB4ID0gcmVpbnRlcnByZXRfY2FzdDxDb21wbGV4Kj4ocHgpOworUmVhbFNjYWxhciBFSUdFTl9DQVQoUkVBTF9TQ0FMQVJfU1VGRklYLCBFSUdFTl9CTEFTX0ZVTkMoYXN1bSkpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkgeworICAvLyAgIHN0ZDo6Y2VyciA8PCAiX19hc3VtICIgPDwgKm4gPDwgIiAiIDw8ICppbmN4IDw8ICJcbiI7CisgIENvbXBsZXggKnggPSByZWludGVycHJldF9jYXN0PENvbXBsZXggKj4ocHgpOwogCi0gIGlmKCpuPD0wKSByZXR1cm4gMDsKKyAgaWYgKCpuIDw9IDApIHJldHVybiAwOwogCi0gIGlmKCppbmN4PT0xKSAgcmV0dXJuIG1ha2VfdmVjdG9yKHgsKm4pLnVuYXJ5RXhwcjxzY2FsYXJfbm9ybTFfb3A+KCkuc3VtKCk7Ci0gIGVsc2UgICAgICAgICAgcmV0dXJuIG1ha2VfdmVjdG9yKHgsKm4sc3RkOjphYnMoKmluY3gpKS51bmFyeUV4cHI8c2NhbGFyX25vcm0xX29wPigpLnN1bSgpOworICBpZiAoKmluY3ggPT0gMSkKKyAgICByZXR1cm4gbWFrZV92ZWN0b3IoeCwgKm4pLnVuYXJ5RXhwcjxzY2FsYXJfbm9ybTFfb3A+KCkuc3VtKCk7CisgIGVsc2UKKyAgICByZXR1cm4gbWFrZV92ZWN0b3IoeCwgKm4sIHN0ZDo6YWJzKCppbmN4KSkudW5hcnlFeHByPHNjYWxhcl9ub3JtMV9vcD4oKS5zdW0oKTsKIH0KIAotaW50IEVJR0VOX0NBVChpLCBFSUdFTl9CTEFTX0ZVTkMoYW1heCkpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkKLXsKLSAgaWYoKm48PTApIHJldHVybiAwOwotICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKK2ludCBFSUdFTl9DQVQoaSwgRUlHRU5fQkxBU19GVU5DKGFtYXgpKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpIHsKKyAgaWYgKCpuIDw9IDApIHJldHVybiAwOworICBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweCk7CiAKICAgRGVuc2VJbmRleCByZXQ7Ci0gIGlmKCppbmN4PT0xKSAgbWFrZV92ZWN0b3IoeCwqbikudW5hcnlFeHByPHNjYWxhcl9ub3JtMV9vcD4oKS5tYXhDb2VmZigmcmV0KTsKLSAgZWxzZSAgICAgICAgICBtYWtlX3ZlY3Rvcih4LCpuLHN0ZDo6YWJzKCppbmN4KSkudW5hcnlFeHByPHNjYWxhcl9ub3JtMV9vcD4oKS5tYXhDb2VmZigmcmV0KTsKLSAgcmV0dXJuIGludChyZXQpKzE7CisgIGlmICgqaW5jeCA9PSAxKQorICAgIG1ha2VfdmVjdG9yKHgsICpuKS51bmFyeUV4cHI8c2NhbGFyX25vcm0xX29wPigpLm1heENvZWZmKCZyZXQpOworICBlbHNlCisgICAgbWFrZV92ZWN0b3IoeCwgKm4sIHN0ZDo6YWJzKCppbmN4KSkudW5hcnlFeHByPHNjYWxhcl9ub3JtMV9vcD4oKS5tYXhDb2VmZigmcmV0KTsKKyAgcmV0dXJuIGludChyZXQpICsgMTsKIH0KIAotaW50IEVJR0VOX0NBVChpLCBFSUdFTl9CTEFTX0ZVTkMoYW1pbikpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkKLXsKLSAgaWYoKm48PTApIHJldHVybiAwOwotICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKK2ludCBFSUdFTl9DQVQoaSwgRUlHRU5fQkxBU19GVU5DKGFtaW4pKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpIHsKKyAgaWYgKCpuIDw9IDApIHJldHVybiAwOworICBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweCk7CiAKICAgRGVuc2VJbmRleCByZXQ7Ci0gIGlmKCppbmN4PT0xKSAgbWFrZV92ZWN0b3IoeCwqbikudW5hcnlFeHByPHNjYWxhcl9ub3JtMV9vcD4oKS5taW5Db2VmZigmcmV0KTsKLSAgZWxzZSAgICAgICAgICBtYWtlX3ZlY3Rvcih4LCpuLHN0ZDo6YWJzKCppbmN4KSkudW5hcnlFeHByPHNjYWxhcl9ub3JtMV9vcD4oKS5taW5Db2VmZigmcmV0KTsKLSAgcmV0dXJuIGludChyZXQpKzE7CisgIGlmICgqaW5jeCA9PSAxKQorICAgIG1ha2VfdmVjdG9yKHgsICpuKS51bmFyeUV4cHI8c2NhbGFyX25vcm0xX29wPigpLm1pbkNvZWZmKCZyZXQpOworICBlbHNlCisgICAgbWFrZV92ZWN0b3IoeCwgKm4sIHN0ZDo6YWJzKCppbmN4KSkudW5hcnlFeHByPHNjYWxhcl9ub3JtMV9vcD4oKS5taW5Db2VmZigmcmV0KTsKKyAgcmV0dXJuIGludChyZXQpICsgMTsKIH0KIAogLy8gY29tcHV0ZXMgYSBkb3QgcHJvZHVjdCBvZiBhIGNvbmp1Z2F0ZWQgdmVjdG9yIHdpdGggYW5vdGhlciB2ZWN0b3IuCi1pbnQgRUlHRU5fQkxBU19GVU5DKGRvdGN3KShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksIFJlYWxTY2FsYXIqIHByZXMpCi17Ci0vLyAgIHN0ZDo6Y2VyciA8PCAiX2RvdGMgIiA8PCAqbiA8PCAiICIgPDwgKmluY3ggPDwgIiAiIDw8ICppbmN5IDw8ICJcbiI7Ci0gIFNjYWxhciogcmVzID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwcmVzKTsKK2ludCBFSUdFTl9CTEFTX0ZVTkMoZG90Y3cpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwgUmVhbFNjYWxhciAqcHJlcykgeworICAvLyAgIHN0ZDo6Y2VyciA8PCAiX2RvdGMgIiA8PCAqbiA8PCAiICIgPDwgKmluY3ggPDwgIiAiIDw8ICppbmN5IDw8ICJcbiI7CisgIFNjYWxhciAqcmVzID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHJlcyk7CiAKLSAgaWYoKm48PTApCi0gIHsKKyAgaWYgKCpuIDw9IDApIHsKICAgICAqcmVzID0gU2NhbGFyKDApOwogICAgIHJldHVybiAwOwogICB9CiAKLSAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7Ci0gIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOworICBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweCk7CisgIFNjYWxhciAqeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHB5KTsKIAotICBpZigqaW5jeD09MSAmJiAqaW5jeT09MSkgICAgKnJlcyA9IChtYWtlX3ZlY3Rvcih4LCpuKS5kb3QobWFrZV92ZWN0b3IoeSwqbikpKTsKLSAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PjApICpyZXMgPSAobWFrZV92ZWN0b3IoeCwqbiwqaW5jeCkuZG90KG1ha2VfdmVjdG9yKHksKm4sKmluY3kpKSk7Ci0gIGVsc2UgaWYoKmluY3g8MCAmJiAqaW5jeT4wKSAqcmVzID0gKG1ha2VfdmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkuZG90KG1ha2VfdmVjdG9yKHksKm4sKmluY3kpKSk7Ci0gIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeTwwKSAqcmVzID0gKG1ha2VfdmVjdG9yKHgsKm4sKmluY3gpLmRvdChtYWtlX3ZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpKSk7Ci0gIGVsc2UgaWYoKmluY3g8MCAmJiAqaW5jeTwwKSAqcmVzID0gKG1ha2VfdmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkuZG90KG1ha2VfdmVjdG9yKHksKm4sLSppbmN5KS5yZXZlcnNlKCkpKTsKKyAgaWYgKCppbmN4ID09IDEgJiYgKmluY3kgPT0gMSkKKyAgICAqcmVzID0gKG1ha2VfdmVjdG9yKHgsICpuKS5kb3QobWFrZV92ZWN0b3IoeSwgKm4pKSk7CisgIGVsc2UgaWYgKCppbmN4ID4gMCAmJiAqaW5jeSA+IDApCisgICAgKnJlcyA9IChtYWtlX3ZlY3Rvcih4LCAqbiwgKmluY3gpLmRvdChtYWtlX3ZlY3Rvcih5LCAqbiwgKmluY3kpKSk7CisgIGVsc2UgaWYgKCppbmN4IDwgMCAmJiAqaW5jeSA+IDApCisgICAgKnJlcyA9IChtYWtlX3ZlY3Rvcih4LCAqbiwgLSppbmN4KS5yZXZlcnNlKCkuZG90KG1ha2VfdmVjdG9yKHksICpuLCAqaW5jeSkpKTsKKyAgZWxzZSBpZiAoKmluY3ggPiAwICYmICppbmN5IDwgMCkKKyAgICAqcmVzID0gKG1ha2VfdmVjdG9yKHgsICpuLCAqaW5jeCkuZG90KG1ha2VfdmVjdG9yKHksICpuLCAtKmluY3kpLnJldmVyc2UoKSkpOworICBlbHNlIGlmICgqaW5jeCA8IDAgJiYgKmluY3kgPCAwKQorICAgICpyZXMgPSAobWFrZV92ZWN0b3IoeCwgKm4sIC0qaW5jeCkucmV2ZXJzZSgpLmRvdChtYWtlX3ZlY3Rvcih5LCAqbiwgLSppbmN5KS5yZXZlcnNlKCkpKTsKICAgcmV0dXJuIDA7CiB9CiAKIC8vIGNvbXB1dGVzIGEgdmVjdG9yLXZlY3RvciBkb3QgcHJvZHVjdCB3aXRob3V0IGNvbXBsZXggY29uanVnYXRpb24uCi1pbnQgRUlHRU5fQkxBU19GVU5DKGRvdHV3KShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksIFJlYWxTY2FsYXIqIHByZXMpCi17Ci0gIFNjYWxhciogcmVzID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwcmVzKTsKK2ludCBFSUdFTl9CTEFTX0ZVTkMoZG90dXcpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwgUmVhbFNjYWxhciAqcHJlcykgeworICBTY2FsYXIgKnJlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHByZXMpOwogCi0gIGlmKCpuPD0wKQotICB7CisgIGlmICgqbiA8PSAwKSB7CiAgICAgKnJlcyA9IFNjYWxhcigwKTsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOwotICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHgpOworICBTY2FsYXIgKnkgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweSk7CiAKLSAgaWYoKmluY3g9PTEgJiYgKmluY3k9PTEpICAgICpyZXMgPSAobWFrZV92ZWN0b3IoeCwqbikuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksKm4pKSkuc3VtKCk7Ci0gIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeT4wKSAqcmVzID0gKG1ha2VfdmVjdG9yKHgsKm4sKmluY3gpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCpuLCppbmN5KSkpLnN1bSgpOwotICBlbHNlIGlmKCppbmN4PDAgJiYgKmluY3k+MCkgKnJlcyA9IChtYWtlX3ZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCpuLCppbmN5KSkpLnN1bSgpOwotICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k8MCkgKnJlcyA9IChtYWtlX3ZlY3Rvcih4LCpuLCppbmN4KS5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwqbiwtKmluY3kpLnJldmVyc2UoKSkpLnN1bSgpOwotICBlbHNlIGlmKCppbmN4PDAgJiYgKmluY3k8MCkgKnJlcyA9IChtYWtlX3ZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpKSkuc3VtKCk7CisgIGlmICgqaW5jeCA9PSAxICYmICppbmN5ID09IDEpCisgICAgKnJlcyA9IChtYWtlX3ZlY3Rvcih4LCAqbikuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksICpuKSkpLnN1bSgpOworICBlbHNlIGlmICgqaW5jeCA+IDAgJiYgKmluY3kgPiAwKQorICAgICpyZXMgPSAobWFrZV92ZWN0b3IoeCwgKm4sICppbmN4KS5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwgKm4sICppbmN5KSkpLnN1bSgpOworICBlbHNlIGlmICgqaW5jeCA8IDAgJiYgKmluY3kgPiAwKQorICAgICpyZXMgPSAobWFrZV92ZWN0b3IoeCwgKm4sIC0qaW5jeCkucmV2ZXJzZSgpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCAqbiwgKmluY3kpKSkuc3VtKCk7CisgIGVsc2UgaWYgKCppbmN4ID4gMCAmJiAqaW5jeSA8IDApCisgICAgKnJlcyA9IChtYWtlX3ZlY3Rvcih4LCAqbiwgKmluY3gpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCAqbiwgLSppbmN5KS5yZXZlcnNlKCkpKS5zdW0oKTsKKyAgZWxzZSBpZiAoKmluY3ggPCAwICYmICppbmN5IDwgMCkKKyAgICAqcmVzID0gKG1ha2VfdmVjdG9yKHgsICpuLCAtKmluY3gpLnJldmVyc2UoKS5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwgKm4sIC0qaW5jeSkucmV2ZXJzZSgpKSkuc3VtKCk7CiAgIHJldHVybiAwOwogfQogCi1SZWFsU2NhbGFyIEVJR0VOX0NBVChSRUFMX1NDQUxBUl9TVUZGSVgsIEVJR0VOX0JMQVNfRlVOQyhucm0yKSkoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KQotewotLy8gICBzdGQ6OmNlcnIgPDwgIl9fbnJtMiAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiXG4iOwotICBpZigqbjw9MCkgcmV0dXJuIDA7CitSZWFsU2NhbGFyIEVJR0VOX0NBVChSRUFMX1NDQUxBUl9TVUZGSVgsIEVJR0VOX0JMQVNfRlVOQyhucm0yKSkoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KSB7CisgIC8vICAgc3RkOjpjZXJyIDw8ICJfX25ybTIgIiA8PCAqbiA8PCAiICIgPDwgKmluY3ggPDwgIlxuIjsKKyAgaWYgKCpuIDw9IDApIHJldHVybiAwOwogCi0gIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweCk7CiAKLSAgaWYoKmluY3g9PTEpCi0gICAgcmV0dXJuIG1ha2VfdmVjdG9yKHgsKm4pLnN0YWJsZU5vcm0oKTsKKyAgaWYgKCppbmN4ID09IDEpIHJldHVybiBtYWtlX3ZlY3Rvcih4LCAqbikuc3RhYmxlTm9ybSgpOwogCi0gIHJldHVybiBtYWtlX3ZlY3Rvcih4LCpuLCppbmN4KS5zdGFibGVOb3JtKCk7CisgIHJldHVybiBtYWtlX3ZlY3Rvcih4LCAqbiwgKmluY3gpLnN0YWJsZU5vcm0oKTsKIH0KIAotaW50IEVJR0VOX0JMQVNfRlVOQyhFSUdFTl9DQVQoUkVBTF9TQ0FMQVJfU1VGRklYLCByb3QpKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksIFJlYWxTY2FsYXIgKnBjLCBSZWFsU2NhbGFyICpwcykKLXsKLSAgaWYoKm48PTApIHJldHVybiAwOworaW50IEVJR0VOX0JMQVNfRlVOQyhFSUdFTl9DQVQoUkVBTF9TQ0FMQVJfU1VGRklYLCByb3QpKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxTY2FsYXIgKnBjLCBSZWFsU2NhbGFyICpwcykgeworICBpZiAoKm4gPD0gMCkgcmV0dXJuIDA7CiAKLSAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7Ci0gIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOworICBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweCk7CisgIFNjYWxhciAqeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHB5KTsKICAgUmVhbFNjYWxhciBjID0gKnBjOwogICBSZWFsU2NhbGFyIHMgPSAqcHM7CiAKLSAgU3RyaWRlZFZlY3RvclR5cGUgdngobWFrZV92ZWN0b3IoeCwqbixzdGQ6OmFicygqaW5jeCkpKTsKLSAgU3RyaWRlZFZlY3RvclR5cGUgdnkobWFrZV92ZWN0b3IoeSwqbixzdGQ6OmFicygqaW5jeSkpKTsKKyAgU3RyaWRlZFZlY3RvclR5cGUgdngobWFrZV92ZWN0b3IoeCwgKm4sIHN0ZDo6YWJzKCppbmN4KSkpOworICBTdHJpZGVkVmVjdG9yVHlwZSB2eShtYWtlX3ZlY3Rvcih5LCAqbiwgc3RkOjphYnMoKmluY3kpKSk7CiAKICAgUmV2ZXJzZTxTdHJpZGVkVmVjdG9yVHlwZT4gcnZ4KHZ4KTsKICAgUmV2ZXJzZTxTdHJpZGVkVmVjdG9yVHlwZT4gcnZ5KHZ5KTsKIAogICAvLyBUT0RPIGltcGxlbWVudCBtaXhlZCByZWFsLXNjYWxhciByb3RhdGlvbnMKLSAgICAgICBpZigqaW5jeDwwICYmICppbmN5PjApIGludGVybmFsOjphcHBseV9yb3RhdGlvbl9pbl90aGVfcGxhbmUocnZ4LCB2eSwgSmFjb2JpUm90YXRpb248U2NhbGFyPihjLHMpKTsKLSAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PDApIGludGVybmFsOjphcHBseV9yb3RhdGlvbl9pbl90aGVfcGxhbmUodngsIHJ2eSwgSmFjb2JpUm90YXRpb248U2NhbGFyPihjLHMpKTsKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjphcHBseV9yb3RhdGlvbl9pbl90aGVfcGxhbmUodngsIHZ5LCAgSmFjb2JpUm90YXRpb248U2NhbGFyPihjLHMpKTsKKyAgaWYgKCppbmN4IDwgMCAmJiAqaW5jeSA+IDApCisgICAgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZShydngsIHZ5LCBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+KGMsIHMpKTsKKyAgZWxzZSBpZiAoKmluY3ggPiAwICYmICppbmN5IDwgMCkKKyAgICBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHZ4LCBydnksIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYywgcykpOworICBlbHNlCisgICAgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZSh2eCwgdnksIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYywgcykpOwogCiAgIHJldHVybiAwOwogfQogCi1pbnQgRUlHRU5fQkxBU19GVU5DKEVJR0VOX0NBVChSRUFMX1NDQUxBUl9TVUZGSVgsIHNjYWwpKShpbnQgKm4sIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkKLXsKLSAgaWYoKm48PTApIHJldHVybiAwOworaW50IEVJR0VOX0JMQVNfRlVOQyhFSUdFTl9DQVQoUkVBTF9TQ0FMQVJfU1VGRklYLCBzY2FsKSkoaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpIHsKKyAgaWYgKCpuIDw9IDApIHJldHVybiAwOwogCi0gIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweCk7CiAgIFJlYWxTY2FsYXIgYWxwaGEgPSAqcGFscGhhOwogCi0vLyAgIHN0ZDo6Y2VyciA8PCAiX19zY2FsICIgPDwgKm4gPDwgIiAiIDw8IGFscGhhIDw8ICIgIiA8PCAqaW5jeCA8PCAiXG4iOworICAvLyAgIHN0ZDo6Y2VyciA8PCAiX19zY2FsICIgPDwgKm4gPDwgIiAiIDw8IGFscGhhIDw8ICIgIiA8PCAqaW5jeCA8PCAiXG4iOwogCi0gIGlmKCppbmN4PT0xKSAgbWFrZV92ZWN0b3IoeCwqbikgKj0gYWxwaGE7Ci0gIGVsc2UgICAgICAgICAgbWFrZV92ZWN0b3IoeCwqbixzdGQ6OmFicygqaW5jeCkpICo9IGFscGhhOworICBpZiAoKmluY3ggPT0gMSkKKyAgICBtYWtlX3ZlY3Rvcih4LCAqbikgKj0gYWxwaGE7CisgIGVsc2UKKyAgICBtYWtlX3ZlY3Rvcih4LCAqbiwgc3RkOjphYnMoKmluY3gpKSAqPSBhbHBoYTsKIAogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2JsYXMvbGV2ZWwxX2ltcGwuaCBiL2JsYXMvbGV2ZWwxX2ltcGwuaAppbmRleCA3MWJkNTM0Li5mMWZmM2NjIDEwMDY0NAotLS0gYS9ibGFzL2xldmVsMV9pbXBsLmgKKysrIGIvYmxhcy9sZXZlbDFfaW1wbC5oCkBAIC05LDM5ICs5LDQxIEBACiAKICNpbmNsdWRlICJjb21tb24uaCIKIAotaW50IEVJR0VOX0JMQVNfRlVOQyhheHB5KShjb25zdCBpbnQgKm4sIGNvbnN0IFJlYWxTY2FsYXIgKnBhbHBoYSwgY29uc3QgUmVhbFNjYWxhciAqcHgsIGNvbnN0IGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGNvbnN0IGludCAqaW5jeSkKLXsKLSAgY29uc3QgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihweCk7Ci0gIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOwotICBTY2FsYXIgYWxwaGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKK2ludCBFSUdFTl9CTEFTX0ZVTkMoYXhweSkoY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnB4LCBjb25zdCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmluY3kpIHsKKyAgY29uc3QgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocHgpOworICBTY2FsYXIgKnkgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweSk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYWxwaGEpOwogCi0gIGlmKCpuPD0wKSByZXR1cm4gMDsKKyAgaWYgKCpuIDw9IDApIHJldHVybiAwOwogCi0gIGlmKCppbmN4PT0xICYmICppbmN5PT0xKSAgICBtYWtlX3ZlY3Rvcih5LCpuKSArPSBhbHBoYSAqIG1ha2VfdmVjdG9yKHgsKm4pOwotICBlbHNlIGlmKCppbmN4PjAgJiYgKmluY3k+MCkgbWFrZV92ZWN0b3IoeSwqbiwqaW5jeSkgKz0gYWxwaGEgKiBtYWtlX3ZlY3Rvcih4LCpuLCppbmN4KTsKLSAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PDApIG1ha2VfdmVjdG9yKHksKm4sLSppbmN5KS5yZXZlcnNlKCkgKz0gYWxwaGEgKiBtYWtlX3ZlY3Rvcih4LCpuLCppbmN4KTsKLSAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PjApIG1ha2VfdmVjdG9yKHksKm4sKmluY3kpICs9IGFscGhhICogbWFrZV92ZWN0b3IoeCwqbiwtKmluY3gpLnJldmVyc2UoKTsKLSAgZWxzZSBpZigqaW5jeDwwICYmICppbmN5PDApIG1ha2VfdmVjdG9yKHksKm4sLSppbmN5KS5yZXZlcnNlKCkgKz0gYWxwaGEgKiBtYWtlX3ZlY3Rvcih4LCpuLC0qaW5jeCkucmV2ZXJzZSgpOworICBpZiAoKmluY3ggPT0gMSAmJiAqaW5jeSA9PSAxKQorICAgIG1ha2VfdmVjdG9yKHksICpuKSArPSBhbHBoYSAqIG1ha2VfdmVjdG9yKHgsICpuKTsKKyAgZWxzZSBpZiAoKmluY3ggPiAwICYmICppbmN5ID4gMCkKKyAgICBtYWtlX3ZlY3Rvcih5LCAqbiwgKmluY3kpICs9IGFscGhhICogbWFrZV92ZWN0b3IoeCwgKm4sICppbmN4KTsKKyAgZWxzZSBpZiAoKmluY3ggPiAwICYmICppbmN5IDwgMCkKKyAgICBtYWtlX3ZlY3Rvcih5LCAqbiwgLSppbmN5KS5yZXZlcnNlKCkgKz0gYWxwaGEgKiBtYWtlX3ZlY3Rvcih4LCAqbiwgKmluY3gpOworICBlbHNlIGlmICgqaW5jeCA8IDAgJiYgKmluY3kgPiAwKQorICAgIG1ha2VfdmVjdG9yKHksICpuLCAqaW5jeSkgKz0gYWxwaGEgKiBtYWtlX3ZlY3Rvcih4LCAqbiwgLSppbmN4KS5yZXZlcnNlKCk7CisgIGVsc2UgaWYgKCppbmN4IDwgMCAmJiAqaW5jeSA8IDApCisgICAgbWFrZV92ZWN0b3IoeSwgKm4sIC0qaW5jeSkucmV2ZXJzZSgpICs9IGFscGhhICogbWFrZV92ZWN0b3IoeCwgKm4sIC0qaW5jeCkucmV2ZXJzZSgpOwogCiAgIHJldHVybiAwOwogfQogCi1pbnQgRUlHRU5fQkxBU19GVU5DKGNvcHkpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSkKLXsKLSAgaWYoKm48PTApIHJldHVybiAwOworaW50IEVJR0VOX0JMQVNfRlVOQyhjb3B5KShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3kpIHsKKyAgaWYgKCpuIDw9IDApIHJldHVybiAwOwogCi0gIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOwotICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKKyAgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHgpOworICBTY2FsYXIgKnkgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweSk7CiAKICAgLy8gYmUgY2FyZWZ1bCwgKmluY3g9PTAgaXMgYWxsb3dlZCAhIQotICBpZigqaW5jeD09MSAmJiAqaW5jeT09MSkKLSAgICBtYWtlX3ZlY3Rvcih5LCpuKSA9IG1ha2VfdmVjdG9yKHgsKm4pOwotICBlbHNlCi0gIHsKLSAgICBpZigqaW5jeDwwKSB4ID0geCAtICgqbi0xKSooKmluY3gpOwotICAgIGlmKCppbmN5PDApIHkgPSB5IC0gKCpuLTEpKigqaW5jeSk7Ci0gICAgZm9yKGludCBpPTA7aTwqbjsrK2kpCi0gICAgeworICBpZiAoKmluY3ggPT0gMSAmJiAqaW5jeSA9PSAxKQorICAgIG1ha2VfdmVjdG9yKHksICpuKSA9IG1ha2VfdmVjdG9yKHgsICpuKTsKKyAgZWxzZSB7CisgICAgaWYgKCppbmN4IDwgMCkgeCA9IHggLSAoKm4gLSAxKSAqICgqaW5jeCk7CisgICAgaWYgKCppbmN5IDwgMCkgeSA9IHkgLSAoKm4gLSAxKSAqICgqaW5jeSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAqbjsgKytpKSB7CiAgICAgICAqeSA9ICp4OwogICAgICAgeCArPSAqaW5jeDsKICAgICAgIHkgKz0gKmluY3k7CkBAIC01MSw5NCArNTMsOTEgQEAKICAgcmV0dXJuIDA7CiB9CiAKLWludCBFSUdFTl9CTEFTX0ZVTkMocm90ZykoUmVhbFNjYWxhciAqcGEsIFJlYWxTY2FsYXIgKnBiLCBSZWFsU2NhbGFyICpwYywgUmVhbFNjYWxhciAqcHMpCi17Ci0gIHVzaW5nIHN0ZDo6c3FydDsKK2ludCBFSUdFTl9CTEFTX0ZVTkMocm90ZykoUmVhbFNjYWxhciAqcGEsIFJlYWxTY2FsYXIgKnBiLCBSZWFsU2NhbGFyICpwYywgUmVhbFNjYWxhciAqcHMpIHsKICAgdXNpbmcgc3RkOjphYnM7CisgIHVzaW5nIHN0ZDo6c3FydDsKIAotICBTY2FsYXImIGEgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7Ci0gIFNjYWxhciYgYiA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBiKTsKLSAgUmVhbFNjYWxhciogYyA9IHBjOwotICBTY2FsYXIqIHMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBzKTsKKyAgU2NhbGFyICZhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBhKTsKKyAgU2NhbGFyICZiID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBiKTsKKyAgUmVhbFNjYWxhciAqYyA9IHBjOworICBTY2FsYXIgKnMgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwcyk7CiAKLSAgI2lmICFJU0NPTVBMRVgKLSAgU2NhbGFyIHIsejsKKyNpZiAhSVNDT01QTEVYCisgIFNjYWxhciByLCB6OwogICBTY2FsYXIgYWEgPSBhYnMoYSk7CiAgIFNjYWxhciBhYiA9IGFicyhiKTsKLSAgaWYoKGFhK2FiKT09U2NhbGFyKDApKQotICB7CisgIGlmICgoYWEgKyBhYikgPT0gU2NhbGFyKDApKSB7CiAgICAgKmMgPSAxOwogICAgICpzID0gMDsKICAgICByID0gMDsKICAgICB6ID0gMDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICByID0gc3FydChhKmEgKyBiKmIpOwotICAgIFNjYWxhciBhbWF4ID0gYWE+YWIgPyBhIDogYjsKLSAgICByID0gYW1heD4wID8gciA6IC1yOwotICAgICpjID0gYS9yOwotICAgICpzID0gYi9yOworICB9IGVsc2UgeworICAgIHIgPSBzcXJ0KGEgKiBhICsgYiAqIGIpOworICAgIFNjYWxhciBhbWF4ID0gYWEgPiBhYiA/IGEgOiBiOworICAgIHIgPSBhbWF4ID4gMCA/IHIgOiAtcjsKKyAgICAqYyA9IGEgLyByOworICAgICpzID0gYiAvIHI7CiAgICAgeiA9IDE7CiAgICAgaWYgKGFhID4gYWIpIHogPSAqczsKLSAgICBpZiAoYWIgPiBhYSAmJiAqYyE9UmVhbFNjYWxhcigwKSkKLSAgICAgIHogPSBTY2FsYXIoMSkvICpjOworICAgIGlmIChhYiA+IGFhICYmICpjICE9IFJlYWxTY2FsYXIoMCkpIHogPSBTY2FsYXIoMSkgLyAqYzsKICAgfQogICAqcGEgPSByOwogICAqcGIgPSB6OwotICAjZWxzZQorI2Vsc2UKICAgU2NhbGFyIGFscGhhOwotICBSZWFsU2NhbGFyIG5vcm0sc2NhbGU7Ci0gIGlmKGFicyhhKT09UmVhbFNjYWxhcigwKSkKLSAgeworICBSZWFsU2NhbGFyIG5vcm0sIHNjYWxlOworICBpZiAoYWJzKGEpID09IFJlYWxTY2FsYXIoMCkpIHsKICAgICAqYyA9IFJlYWxTY2FsYXIoMCk7CiAgICAgKnMgPSBTY2FsYXIoMSk7CiAgICAgYSA9IGI7Ci0gIH0KLSAgZWxzZQotICB7CisgIH0gZWxzZSB7CiAgICAgc2NhbGUgPSBhYnMoYSkgKyBhYnMoYik7Ci0gICAgbm9ybSA9IHNjYWxlKnNxcnQoKG51bWV4dDo6YWJzMihhL3NjYWxlKSkgKyAobnVtZXh0OjphYnMyKGIvc2NhbGUpKSk7Ci0gICAgYWxwaGEgPSBhL2FicyhhKTsKLSAgICAqYyA9IGFicyhhKS9ub3JtOwotICAgICpzID0gYWxwaGEqbnVtZXh0Ojpjb25qKGIpL25vcm07Ci0gICAgYSA9IGFscGhhKm5vcm07CisgICAgbm9ybSA9IHNjYWxlICogc3FydCgobnVtZXh0OjphYnMyKGEgLyBzY2FsZSkpICsgKG51bWV4dDo6YWJzMihiIC8gc2NhbGUpKSk7CisgICAgYWxwaGEgPSBhIC8gYWJzKGEpOworICAgICpjID0gYWJzKGEpIC8gbm9ybTsKKyAgICAqcyA9IGFscGhhICogbnVtZXh0Ojpjb25qKGIpIC8gbm9ybTsKKyAgICBhID0gYWxwaGEgKiBub3JtOwogICB9Ci0gICNlbmRpZgorI2VuZGlmCiAKLS8vICAgSmFjb2JpUm90YXRpb248U2NhbGFyPiByOwotLy8gICByLm1ha2VHaXZlbnMoYSxiKTsKLS8vICAgKmMgPSByLmMoKTsKLS8vICAgKnMgPSByLnMoKTsKKyAgLy8gICBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+IHI7CisgIC8vICAgci5tYWtlR2l2ZW5zKGEsYik7CisgIC8vICAgKmMgPSByLmMoKTsKKyAgLy8gICAqcyA9IHIucygpOwogCiAgIHJldHVybiAwOwogfQogCi1pbnQgRUlHRU5fQkxBU19GVU5DKHNjYWwpKGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KQotewotICBpZigqbjw9MCkgcmV0dXJuIDA7CitpbnQgRUlHRU5fQkxBU19GVU5DKHNjYWwpKGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KSB7CisgIGlmICgqbiA8PSAwKSByZXR1cm4gMDsKIAotICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKLSAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKyAgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHgpOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocGFscGhhKTsKIAotICBpZigqaW5jeD09MSkgIG1ha2VfdmVjdG9yKHgsKm4pICo9IGFscGhhOwotICBlbHNlICAgICAgICAgIG1ha2VfdmVjdG9yKHgsKm4sc3RkOjphYnMoKmluY3gpKSAqPSBhbHBoYTsKKyAgaWYgKCppbmN4ID09IDEpCisgICAgbWFrZV92ZWN0b3IoeCwgKm4pICo9IGFscGhhOworICBlbHNlCisgICAgbWFrZV92ZWN0b3IoeCwgKm4sIHN0ZDo6YWJzKCppbmN4KSkgKj0gYWxwaGE7CiAKICAgcmV0dXJuIDA7CiB9CiAKLWludCBFSUdFTl9CTEFTX0ZVTkMoc3dhcCkoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpweSwgaW50ICppbmN5KQotewotICBpZigqbjw9MCkgcmV0dXJuIDA7CitpbnQgRUlHRU5fQkxBU19GVU5DKHN3YXApKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSkgeworICBpZiAoKm4gPD0gMCkgcmV0dXJuIDA7CiAKLSAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7Ci0gIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOworICBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweCk7CisgIFNjYWxhciAqeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHB5KTsKIAotICBpZigqaW5jeD09MSAmJiAqaW5jeT09MSkgICAgbWFrZV92ZWN0b3IoeSwqbikuc3dhcChtYWtlX3ZlY3Rvcih4LCpuKSk7Ci0gIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeT4wKSBtYWtlX3ZlY3Rvcih5LCpuLCppbmN5KS5zd2FwKG1ha2VfdmVjdG9yKHgsKm4sKmluY3gpKTsKLSAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PDApIG1ha2VfdmVjdG9yKHksKm4sLSppbmN5KS5yZXZlcnNlKCkuc3dhcChtYWtlX3ZlY3Rvcih4LCpuLCppbmN4KSk7Ci0gIGVsc2UgaWYoKmluY3g8MCAmJiAqaW5jeT4wKSBtYWtlX3ZlY3Rvcih5LCpuLCppbmN5KS5zd2FwKG1ha2VfdmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkpOwotICBlbHNlIGlmKCppbmN4PDAgJiYgKmluY3k8MCkgbWFrZV92ZWN0b3IoeSwqbiwtKmluY3kpLnJldmVyc2UoKS5zd2FwKG1ha2VfdmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkpOworICBpZiAoKmluY3ggPT0gMSAmJiAqaW5jeSA9PSAxKQorICAgIG1ha2VfdmVjdG9yKHksICpuKS5zd2FwKG1ha2VfdmVjdG9yKHgsICpuKSk7CisgIGVsc2UgaWYgKCppbmN4ID4gMCAmJiAqaW5jeSA+IDApCisgICAgbWFrZV92ZWN0b3IoeSwgKm4sICppbmN5KS5zd2FwKG1ha2VfdmVjdG9yKHgsICpuLCAqaW5jeCkpOworICBlbHNlIGlmICgqaW5jeCA+IDAgJiYgKmluY3kgPCAwKQorICAgIG1ha2VfdmVjdG9yKHksICpuLCAtKmluY3kpLnJldmVyc2UoKS5zd2FwKG1ha2VfdmVjdG9yKHgsICpuLCAqaW5jeCkpOworICBlbHNlIGlmICgqaW5jeCA8IDAgJiYgKmluY3kgPiAwKQorICAgIG1ha2VfdmVjdG9yKHksICpuLCAqaW5jeSkuc3dhcChtYWtlX3ZlY3Rvcih4LCAqbiwgLSppbmN4KS5yZXZlcnNlKCkpOworICBlbHNlIGlmICgqaW5jeCA8IDAgJiYgKmluY3kgPCAwKQorICAgIG1ha2VfdmVjdG9yKHksICpuLCAtKmluY3kpLnJldmVyc2UoKS5zd2FwKG1ha2VfdmVjdG9yKHgsICpuLCAtKmluY3gpLnJldmVyc2UoKSk7CiAKICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9ibGFzL2xldmVsMV9yZWFsX2ltcGwuaCBiL2JsYXMvbGV2ZWwxX3JlYWxfaW1wbC5oCmluZGV4IGM1ODc3MTEuLmQ1Y2I1NzMgMTAwNjQ0Ci0tLSBhL2JsYXMvbGV2ZWwxX3JlYWxfaW1wbC5oCisrKyBiL2JsYXMvbGV2ZWwxX3JlYWxfaW1wbC5oCkBAIC0xMSw5MSArMTEsMTAxIEBACiAKIC8vIGNvbXB1dGVzIHRoZSBzdW0gb2YgbWFnbml0dWRlcyBvZiBhbGwgdmVjdG9yIGVsZW1lbnRzIG9yLCBmb3IgYSBjb21wbGV4IHZlY3RvciB4LCB0aGUgc3VtCiAvLyByZXMgPSB8UmV4MXwgKyB8SW14MXwgKyB8UmV4MnwgKyB8SW14MnwgKyAuLi4gKyB8UmV4bnwgKyB8SW14bnwsIHdoZXJlIHggaXMgYSB2ZWN0b3Igb2Ygb3JkZXIgbgotUmVhbFNjYWxhciBFSUdFTl9CTEFTX0ZVTkMoYXN1bSkoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KQotewotLy8gICBzdGQ6OmNlcnIgPDwgIl9hc3VtICIgPDwgKm4gPDwgIiAiIDw8ICppbmN4IDw8ICJcbiI7CitSZWFsU2NhbGFyIEVJR0VOX0JMQVNfRlVOQyhhc3VtKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpIHsKKyAgLy8gICBzdGQ6OmNlcnIgPDwgIl9hc3VtICIgPDwgKm4gPDwgIiAiIDw8ICppbmN4IDw8ICJcbiI7CiAKLSAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIFNjYWxhciAqeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHB4KTsKIAotICBpZigqbjw9MCkgcmV0dXJuIDA7CisgIGlmICgqbiA8PSAwKSByZXR1cm4gMDsKIAotICBpZigqaW5jeD09MSkgIHJldHVybiBtYWtlX3ZlY3Rvcih4LCpuKS5jd2lzZUFicygpLnN1bSgpOwotICBlbHNlICAgICAgICAgIHJldHVybiBtYWtlX3ZlY3Rvcih4LCpuLHN0ZDo6YWJzKCppbmN4KSkuY3dpc2VBYnMoKS5zdW0oKTsKKyAgaWYgKCppbmN4ID09IDEpCisgICAgcmV0dXJuIG1ha2VfdmVjdG9yKHgsICpuKS5jd2lzZUFicygpLnN1bSgpOworICBlbHNlCisgICAgcmV0dXJuIG1ha2VfdmVjdG9yKHgsICpuLCBzdGQ6OmFicygqaW5jeCkpLmN3aXNlQWJzKCkuc3VtKCk7CiB9CiAKLWludCBFSUdFTl9DQVQoaSwgRUlHRU5fQkxBU19GVU5DKGFtYXgpKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCi17Ci0gIGlmKCpuPD0wKSByZXR1cm4gMDsKLSAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CitpbnQgRUlHRU5fQ0FUKGksIEVJR0VOX0JMQVNfRlVOQyhhbWF4KSkoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KSB7CisgIGlmICgqbiA8PSAwKSByZXR1cm4gMDsKKyAgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHgpOwogCiAgIERlbnNlSW5kZXggcmV0OwotICBpZigqaW5jeD09MSkgIG1ha2VfdmVjdG9yKHgsKm4pLmN3aXNlQWJzKCkubWF4Q29lZmYoJnJldCk7Ci0gIGVsc2UgICAgICAgICAgbWFrZV92ZWN0b3IoeCwqbixzdGQ6OmFicygqaW5jeCkpLmN3aXNlQWJzKCkubWF4Q29lZmYoJnJldCk7Ci0gIHJldHVybiBpbnQocmV0KSsxOworICBpZiAoKmluY3ggPT0gMSkKKyAgICBtYWtlX3ZlY3Rvcih4LCAqbikuY3dpc2VBYnMoKS5tYXhDb2VmZigmcmV0KTsKKyAgZWxzZQorICAgIG1ha2VfdmVjdG9yKHgsICpuLCBzdGQ6OmFicygqaW5jeCkpLmN3aXNlQWJzKCkubWF4Q29lZmYoJnJldCk7CisgIHJldHVybiBpbnQocmV0KSArIDE7CiB9CiAKLWludCBFSUdFTl9DQVQoaSwgRUlHRU5fQkxBU19GVU5DKGFtaW4pKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCi17Ci0gIGlmKCpuPD0wKSByZXR1cm4gMDsKLSAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CitpbnQgRUlHRU5fQ0FUKGksIEVJR0VOX0JMQVNfRlVOQyhhbWluKSkoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KSB7CisgIGlmICgqbiA8PSAwKSByZXR1cm4gMDsKKyAgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHgpOwogCiAgIERlbnNlSW5kZXggcmV0OwotICBpZigqaW5jeD09MSkgIG1ha2VfdmVjdG9yKHgsKm4pLmN3aXNlQWJzKCkubWluQ29lZmYoJnJldCk7Ci0gIGVsc2UgICAgICAgICAgbWFrZV92ZWN0b3IoeCwqbixzdGQ6OmFicygqaW5jeCkpLmN3aXNlQWJzKCkubWluQ29lZmYoJnJldCk7Ci0gIHJldHVybiBpbnQocmV0KSsxOworICBpZiAoKmluY3ggPT0gMSkKKyAgICBtYWtlX3ZlY3Rvcih4LCAqbikuY3dpc2VBYnMoKS5taW5Db2VmZigmcmV0KTsKKyAgZWxzZQorICAgIG1ha2VfdmVjdG9yKHgsICpuLCBzdGQ6OmFicygqaW5jeCkpLmN3aXNlQWJzKCkubWluQ29lZmYoJnJldCk7CisgIHJldHVybiBpbnQocmV0KSArIDE7CiB9CiAKIC8vIGNvbXB1dGVzIGEgdmVjdG9yLXZlY3RvciBkb3QgcHJvZHVjdC4KLVNjYWxhciBFSUdFTl9CTEFTX0ZVTkMoZG90KShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3kpCi17Ci0vLyAgIHN0ZDo6Y2VyciA8PCAiX2RvdCAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiICIgPDwgKmluY3kgPDwgIlxuIjsKK1NjYWxhciBFSUdFTl9CTEFTX0ZVTkMoZG90KShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3kpIHsKKyAgLy8gICBzdGQ6OmNlcnIgPDwgIl9kb3QgIiA8PCAqbiA8PCAiICIgPDwgKmluY3ggPDwgIiAiIDw8ICppbmN5IDw8ICJcbiI7CiAKLSAgaWYoKm48PTApIHJldHVybiAwOworICBpZiAoKm4gPD0gMCkgcmV0dXJuIDA7CiAKLSAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7Ci0gIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOworICBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweCk7CisgIFNjYWxhciAqeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHB5KTsKIAotICBpZigqaW5jeD09MSAmJiAqaW5jeT09MSkgICAgcmV0dXJuIChtYWtlX3ZlY3Rvcih4LCpuKS5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwqbikpKS5zdW0oKTsKLSAgZWxzZSBpZigqaW5jeD4wICYmICppbmN5PjApIHJldHVybiAobWFrZV92ZWN0b3IoeCwqbiwqaW5jeCkuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksKm4sKmluY3kpKSkuc3VtKCk7Ci0gIGVsc2UgaWYoKmluY3g8MCAmJiAqaW5jeT4wKSByZXR1cm4gKG1ha2VfdmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksKm4sKmluY3kpKSkuc3VtKCk7Ci0gIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeTwwKSByZXR1cm4gKG1ha2VfdmVjdG9yKHgsKm4sKmluY3gpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCpuLC0qaW5jeSkucmV2ZXJzZSgpKSkuc3VtKCk7Ci0gIGVsc2UgaWYoKmluY3g8MCAmJiAqaW5jeTwwKSByZXR1cm4gKG1ha2VfdmVjdG9yKHgsKm4sLSppbmN4KS5yZXZlcnNlKCkuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksKm4sLSppbmN5KS5yZXZlcnNlKCkpKS5zdW0oKTsKLSAgZWxzZSByZXR1cm4gMDsKKyAgaWYgKCppbmN4ID09IDEgJiYgKmluY3kgPT0gMSkKKyAgICByZXR1cm4gKG1ha2VfdmVjdG9yKHgsICpuKS5jd2lzZVByb2R1Y3QobWFrZV92ZWN0b3IoeSwgKm4pKSkuc3VtKCk7CisgIGVsc2UgaWYgKCppbmN4ID4gMCAmJiAqaW5jeSA+IDApCisgICAgcmV0dXJuIChtYWtlX3ZlY3Rvcih4LCAqbiwgKmluY3gpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCAqbiwgKmluY3kpKSkuc3VtKCk7CisgIGVsc2UgaWYgKCppbmN4IDwgMCAmJiAqaW5jeSA+IDApCisgICAgcmV0dXJuIChtYWtlX3ZlY3Rvcih4LCAqbiwgLSppbmN4KS5yZXZlcnNlKCkuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksICpuLCAqaW5jeSkpKS5zdW0oKTsKKyAgZWxzZSBpZiAoKmluY3ggPiAwICYmICppbmN5IDwgMCkKKyAgICByZXR1cm4gKG1ha2VfdmVjdG9yKHgsICpuLCAqaW5jeCkuY3dpc2VQcm9kdWN0KG1ha2VfdmVjdG9yKHksICpuLCAtKmluY3kpLnJldmVyc2UoKSkpLnN1bSgpOworICBlbHNlIGlmICgqaW5jeCA8IDAgJiYgKmluY3kgPCAwKQorICAgIHJldHVybiAobWFrZV92ZWN0b3IoeCwgKm4sIC0qaW5jeCkucmV2ZXJzZSgpLmN3aXNlUHJvZHVjdChtYWtlX3ZlY3Rvcih5LCAqbiwgLSppbmN5KS5yZXZlcnNlKCkpKS5zdW0oKTsKKyAgZWxzZQorICAgIHJldHVybiAwOwogfQogCiAvLyBjb21wdXRlcyB0aGUgRXVjbGlkZWFuIG5vcm0gb2YgYSB2ZWN0b3IuCiAvLyBGSVhNRQotU2NhbGFyIEVJR0VOX0JMQVNfRlVOQyhucm0yKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCi17Ci0vLyAgIHN0ZDo6Y2VyciA8PCAiX25ybTIgIiA8PCAqbiA8PCAiICIgPDwgKmluY3ggPDwgIlxuIjsKLSAgaWYoKm48PTApIHJldHVybiAwOworU2NhbGFyIEVJR0VOX0JMQVNfRlVOQyhucm0yKShpbnQgKm4sIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpIHsKKyAgLy8gICBzdGQ6OmNlcnIgPDwgIl9ucm0yICIgPDwgKm4gPDwgIiAiIDw8ICppbmN4IDw8ICJcbiI7CisgIGlmICgqbiA8PSAwKSByZXR1cm4gMDsKIAotICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKKyAgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHgpOwogCi0gIGlmKCppbmN4PT0xKSAgcmV0dXJuIG1ha2VfdmVjdG9yKHgsKm4pLnN0YWJsZU5vcm0oKTsKLSAgZWxzZSAgICAgICAgICByZXR1cm4gbWFrZV92ZWN0b3IoeCwqbixzdGQ6OmFicygqaW5jeCkpLnN0YWJsZU5vcm0oKTsKKyAgaWYgKCppbmN4ID09IDEpCisgICAgcmV0dXJuIG1ha2VfdmVjdG9yKHgsICpuKS5zdGFibGVOb3JtKCk7CisgIGVsc2UKKyAgICByZXR1cm4gbWFrZV92ZWN0b3IoeCwgKm4sIHN0ZDo6YWJzKCppbmN4KSkuc3RhYmxlTm9ybSgpOwogfQogCi1pbnQgRUlHRU5fQkxBU19GVU5DKHJvdCkoaW50ICpuLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpweSwgaW50ICppbmN5LCBSZWFsU2NhbGFyICpwYywgUmVhbFNjYWxhciAqcHMpCi17Ci0vLyAgIHN0ZDo6Y2VyciA8PCAiX3JvdCAiIDw8ICpuIDw8ICIgIiA8PCAqaW5jeCA8PCAiICIgPDwgKmluY3kgPDwgIlxuIjsKLSAgaWYoKm48PTApIHJldHVybiAwOworaW50IEVJR0VOX0JMQVNfRlVOQyhyb3QpKGludCAqbiwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwgUmVhbFNjYWxhciAqcGMsIFJlYWxTY2FsYXIgKnBzKSB7CisgIC8vICAgc3RkOjpjZXJyIDw8ICJfcm90ICIgPDwgKm4gPDwgIiAiIDw8ICppbmN4IDw8ICIgIiA8PCAqaW5jeSA8PCAiXG4iOworICBpZiAoKm4gPD0gMCkgcmV0dXJuIDA7CiAKLSAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7Ci0gIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOwotICBTY2FsYXIgYyA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKLSAgU2NhbGFyIHMgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwcyk7CisgIFNjYWxhciAqeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHB4KTsKKyAgU2NhbGFyICp5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHkpOworICBTY2FsYXIgYyA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYyk7CisgIFNjYWxhciBzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBzKTsKIAotICBTdHJpZGVkVmVjdG9yVHlwZSB2eChtYWtlX3ZlY3Rvcih4LCpuLHN0ZDo6YWJzKCppbmN4KSkpOwotICBTdHJpZGVkVmVjdG9yVHlwZSB2eShtYWtlX3ZlY3Rvcih5LCpuLHN0ZDo6YWJzKCppbmN5KSkpOworICBTdHJpZGVkVmVjdG9yVHlwZSB2eChtYWtlX3ZlY3Rvcih4LCAqbiwgc3RkOjphYnMoKmluY3gpKSk7CisgIFN0cmlkZWRWZWN0b3JUeXBlIHZ5KG1ha2VfdmVjdG9yKHksICpuLCBzdGQ6OmFicygqaW5jeSkpKTsKIAogICBSZXZlcnNlPFN0cmlkZWRWZWN0b3JUeXBlPiBydngodngpOwogICBSZXZlcnNlPFN0cmlkZWRWZWN0b3JUeXBlPiBydnkodnkpOwogCi0gICAgICAgaWYoKmluY3g8MCAmJiAqaW5jeT4wKSBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHJ2eCwgdnksIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYyxzKSk7Ci0gIGVsc2UgaWYoKmluY3g+MCAmJiAqaW5jeTwwKSBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHZ4LCBydnksIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYyxzKSk7Ci0gIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHZ4LCB2eSwgIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYyxzKSk7Ci0KKyAgaWYgKCppbmN4IDwgMCAmJiAqaW5jeSA+IDApCisgICAgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZShydngsIHZ5LCBKYWNvYmlSb3RhdGlvbjxTY2FsYXI+KGMsIHMpKTsKKyAgZWxzZSBpZiAoKmluY3ggPiAwICYmICppbmN5IDwgMCkKKyAgICBpbnRlcm5hbDo6YXBwbHlfcm90YXRpb25faW5fdGhlX3BsYW5lKHZ4LCBydnksIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYywgcykpOworICBlbHNlCisgICAgaW50ZXJuYWw6OmFwcGx5X3JvdGF0aW9uX2luX3RoZV9wbGFuZSh2eCwgdnksIEphY29iaVJvdGF0aW9uPFNjYWxhcj4oYywgcykpOwogCiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYmxhcy9sZXZlbDJfY3BseF9pbXBsLmggYi9ibGFzL2xldmVsMl9jcGx4X2ltcGwuaAppbmRleCBlM2NlNjE0Li44YzU2YTZmIDEwMDY0NAotLS0gYS9ibGFzL2xldmVsMl9jcGx4X2ltcGwuaAorKysgYi9ibGFzL2xldmVsMl9jcGx4X2ltcGwuaApAQCAtMTAsNzMgKzEwLDc1IEBACiAjaW5jbHVkZSAiY29tbW9uLmgiCiAKIC8qKiAgWkhFTVYgIHBlcmZvcm1zIHRoZSBtYXRyaXgtdmVjdG9yICBvcGVyYXRpb24KLSAgKgotICAqICAgICB5IDo9IGFscGhhKkEqeCArIGJldGEqeSwKLSAgKgotICAqICB3aGVyZSBhbHBoYSBhbmQgYmV0YSBhcmUgc2NhbGFycywgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kCi0gICogIEEgaXMgYW4gbiBieSBuIGhlcm1pdGlhbiBtYXRyaXguCi0gICovCi1pbnQgRUlHRU5fQkxBU19GVU5DKGhlbXYpKGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGludCAqbiwgY29uc3QgUmVhbFNjYWxhciAqcGFscGhhLCBjb25zdCBSZWFsU2NhbGFyICpwYSwgY29uc3QgaW50ICpsZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgKnB4LCBjb25zdCBpbnQgKmluY3gsIGNvbnN0IFJlYWxTY2FsYXIgKnBiZXRhLCBSZWFsU2NhbGFyICpweSwgY29uc3QgaW50ICppbmN5KQotewotICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBjb25zdCBTY2FsYXIqLCBpbnQsIGNvbnN0IFNjYWxhciosIFNjYWxhciosIFNjYWxhcik7CisgKgorICogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorICoKKyAqICB3aGVyZSBhbHBoYSBhbmQgYmV0YSBhcmUgc2NhbGFycywgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kCisgKiAgQSBpcyBhbiBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeC4KKyAqLworaW50IEVJR0VOX0JMQVNfRlVOQyhoZW12KShjb25zdCBjaGFyICp1cGxvLCBjb25zdCBpbnQgKm4sIGNvbnN0IFJlYWxTY2FsYXIgKnBhbHBoYSwgY29uc3QgUmVhbFNjYWxhciAqcGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqbGRhLCBjb25zdCBSZWFsU2NhbGFyICpweCwgY29uc3QgaW50ICppbmN4LCBjb25zdCBSZWFsU2NhbGFyICpwYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbFNjYWxhciAqcHksIGNvbnN0IGludCAqaW5jeSkgeworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBjb25zdCBTY2FsYXIgKiwgaW50LCBjb25zdCBTY2FsYXIgKiwgU2NhbGFyICosIFNjYWxhcik7CiAgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzJdID0gewotICAgIC8vIGFycmF5IGluZGV4OiBVUAotICAgIChpbnRlcm5hbDo6c2VsZmFkam9pbnRfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PFNjYWxhcixpbnQsQ29sTWFqb3IsVXBwZXIsZmFsc2UsZmFsc2U+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBMTwotICAgIChpbnRlcm5hbDo6c2VsZmFkam9pbnRfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PFNjYWxhcixpbnQsQ29sTWFqb3IsTG93ZXIsZmFsc2UsZmFsc2U+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFVQCisgICAgICAoaW50ZXJuYWw6OnNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdDxTY2FsYXIsIGludCwgQ29sTWFqb3IsIFVwcGVyLCBmYWxzZSwgZmFsc2U+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IExPCisgICAgICAoaW50ZXJuYWw6OnNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdDxTY2FsYXIsIGludCwgQ29sTWFqb3IsIExvd2VyLCBmYWxzZSwgZmFsc2U+OjpydW4pLAogICB9OwogCi0gIGNvbnN0IFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGEpOwotICBjb25zdCBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHB4KTsKLSAgU2NhbGFyKiB5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweSk7Ci0gIFNjYWxhciBhbHBoYSAgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYWxwaGEpOwotICBTY2FsYXIgYmV0YSAgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGJldGEpOworICBjb25zdCBTY2FsYXIgKmEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYSk7CisgIGNvbnN0IFNjYWxhciAqeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHB4KTsKKyAgU2NhbGFyICp5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHkpOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGFscGhhKTsKKyAgU2NhbGFyIGJldGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGJldGEpOwogCiAgIC8vIGNoZWNrIGFyZ3VtZW50cwogICBpbnQgaW5mbyA9IDA7Ci0gIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgaW5mbyA9IDE7Ci0gIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7Ci0gIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLCpuKSkgICAgaW5mbyA9IDU7Ci0gIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgaW5mbyA9IDc7Ci0gIGVsc2UgaWYoKmluY3k9PTApICAgICAgICAgICAgICAgaW5mbyA9IDEwOwotICBpZihpbmZvKQotICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiSEVNViAiLCZpbmZvLDYpOworICBpZiAoVVBMTygqdXBsbykgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMTsKKyAgZWxzZSBpZiAoKm4gPCAwKQorICAgIGluZm8gPSAyOworICBlbHNlIGlmICgqbGRhIDwgc3RkOjptYXgoMSwgKm4pKQorICAgIGluZm8gPSA1OworICBlbHNlIGlmICgqaW5jeCA9PSAwKQorICAgIGluZm8gPSA3OworICBlbHNlIGlmICgqaW5jeSA9PSAwKQorICAgIGluZm8gPSAxMDsKKyAgaWYgKGluZm8pIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAgIkhFTVYgIiwgJmluZm8sIDYpOwogCi0gIGlmKCpuPT0wKQotICAgIHJldHVybiAxOworICBpZiAoKm4gPT0gMCkgcmV0dXJuIDE7CiAKLSAgY29uc3QgU2NhbGFyKiBhY3R1YWxfeCA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCpuLCppbmN4KTsKLSAgU2NhbGFyKiBhY3R1YWxfeSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCpuLCppbmN5KTsKKyAgY29uc3QgU2NhbGFyICphY3R1YWxfeCA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbiwgKmluY3gpOworICBTY2FsYXIgKmFjdHVhbF95ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHksICpuLCAqaW5jeSk7CiAKLSAgaWYoYmV0YSE9U2NhbGFyKDEpKQotICB7Ci0gICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYWtlX3ZlY3RvcihhY3R1YWxfeSwgKm4pLnNldFplcm8oKTsKLSAgICBlbHNlICAgICAgICAgICAgICAgIG1ha2VfdmVjdG9yKGFjdHVhbF95LCAqbikgKj0gYmV0YTsKKyAgaWYgKGJldGEgIT0gU2NhbGFyKDEpKSB7CisgICAgaWYgKGJldGEgPT0gU2NhbGFyKDApKQorICAgICAgbWFrZV92ZWN0b3IoYWN0dWFsX3ksICpuKS5zZXRaZXJvKCk7CisgICAgZWxzZQorICAgICAgbWFrZV92ZWN0b3IoYWN0dWFsX3ksICpuKSAqPSBiZXRhOwogICB9CiAKLSAgaWYoYWxwaGEhPVNjYWxhcigwKSkKLSAgeworICBpZiAoYWxwaGEgIT0gU2NhbGFyKDApKSB7CiAgICAgaW50IGNvZGUgPSBVUExPKCp1cGxvKTsKLSAgICBpZihjb2RlPj0yIHx8IGZ1bmNbY29kZV09PTApCi0gICAgICByZXR1cm4gMDsKKyAgICBpZiAoY29kZSA+PSAyIHx8IGZ1bmNbY29kZV0gPT0gMCkgcmV0dXJuIDA7CiAKICAgICBmdW5jW2NvZGVdKCpuLCBhLCAqbGRhLCBhY3R1YWxfeCwgYWN0dWFsX3ksIGFscGhhKTsKICAgfQogCi0gIGlmKGFjdHVhbF94IT14KSBkZWxldGVbXSBhY3R1YWxfeDsKLSAgaWYoYWN0dWFsX3khPXkpIGRlbGV0ZVtdIGNvcHlfYmFjayhhY3R1YWxfeSx5LCpuLCppbmN5KTsKKyAgaWYgKGFjdHVhbF94ICE9IHgpIGRlbGV0ZVtdIGFjdHVhbF94OworICBpZiAoYWN0dWFsX3kgIT0geSkgZGVsZXRlW10gY29weV9iYWNrKGFjdHVhbF95LCB5LCAqbiwgKmluY3kpOwogCiAgIHJldHVybiAxOwogfQogCiAvKiogIFpIQk1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciAgb3BlcmF0aW9uCi0gICoKLSAgKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksCi0gICoKLSAgKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZAotICAqICBBIGlzIGFuIG4gYnkgbiBoZXJtaXRpYW4gYmFuZCBtYXRyaXgsIHdpdGggayBzdXBlci1kaWFnb25hbHMuCi0gICovCisgKgorICogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAorICoKKyAqICB3aGVyZSBhbHBoYSBhbmQgYmV0YSBhcmUgc2NhbGFycywgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kCisgKiAgQSBpcyBhbiBuIGJ5IG4gaGVybWl0aWFuIGJhbmQgbWF0cml4LCB3aXRoIGsgc3VwZXItZGlhZ29uYWxzLgorICovCiAvLyBpbnQgRUlHRU5fQkxBU19GVU5DKGhibXYpKGNoYXIgKnVwbG8sIGludCAqbiwgaW50ICprLCBSZWFsU2NhbGFyICphbHBoYSwgUmVhbFNjYWxhciAqYSwgaW50ICpsZGEsCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxTY2FsYXIgKngsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqYmV0YSwgUmVhbFNjYWxhciAqeSwgaW50ICppbmN5KQogLy8gewpAQCAtODQsMjc3ICs4NiwyODYgQEAKIC8vIH0KIAogLyoqICBaSFBNViAgcGVyZm9ybXMgdGhlIG1hdHJpeC12ZWN0b3Igb3BlcmF0aW9uCi0gICoKLSAgKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksCi0gICoKLSAgKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZAotICAqICBBIGlzIGFuIG4gYnkgbiBoZXJtaXRpYW4gbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KLSAgKi8KLS8vIGludCBFSUdFTl9CTEFTX0ZVTkMoaHBtdikoY2hhciAqdXBsbywgaW50ICpuLCBSZWFsU2NhbGFyICphbHBoYSwgUmVhbFNjYWxhciAqYXAsIFJlYWxTY2FsYXIgKngsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqYmV0YSwgUmVhbFNjYWxhciAqeSwgaW50ICppbmN5KQorICoKKyAqICAgICB5IDo9IGFscGhhKkEqeCArIGJldGEqeSwKKyAqCisgKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZAorICogIEEgaXMgYW4gbiBieSBuIGhlcm1pdGlhbiBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgorICovCisvLyBpbnQgRUlHRU5fQkxBU19GVU5DKGhwbXYpKGNoYXIgKnVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqYWxwaGEsIFJlYWxTY2FsYXIgKmFwLCBSZWFsU2NhbGFyICp4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIKKy8vICpiZXRhLCBSZWFsU2NhbGFyICp5LCBpbnQgKmluY3kpCiAvLyB7CiAvLyAgIHJldHVybiAxOwogLy8gfQogCiAvKiogIFpIUFIgICAgcGVyZm9ybXMgdGhlIGhlcm1pdGlhbiByYW5rIDEgb3BlcmF0aW9uCi0gICoKLSAgKiAgICAgQSA6PSBhbHBoYSp4KmNvbmpnKCB4JyApICsgQSwKLSAgKgotICAqICB3aGVyZSBhbHBoYSBpcyBhIHJlYWwgc2NhbGFyLCB4IGlzIGFuIG4gZWxlbWVudCB2ZWN0b3IgYW5kIEEgaXMgYW4KLSAgKiAgbiBieSBuIGhlcm1pdGlhbiBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgotICAqLwotaW50IEVJR0VOX0JMQVNfRlVOQyhocHIpKGNoYXIgKnVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpwYXApCi17Ci0gIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIFNjYWxhciosIGNvbnN0IFNjYWxhciosIFJlYWxTY2FsYXIpOworICoKKyAqICAgICBBIDo9IGFscGhhKngqY29uamcoIHgnICkgKyBBLAorICoKKyAqICB3aGVyZSBhbHBoYSBpcyBhIHJlYWwgc2NhbGFyLCB4IGlzIGFuIG4gZWxlbWVudCB2ZWN0b3IgYW5kIEEgaXMgYW4KKyAqICBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkMoaHByKShjaGFyICp1cGxvLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcGFwKSB7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIFNjYWxhciAqLCBjb25zdCBTY2FsYXIgKiwgUmVhbFNjYWxhcik7CiAgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzJdID0gewotICAgIC8vIGFycmF5IGluZGV4OiBVUAotICAgIChpbnRlcm5hbDo6c2VsZmFkam9pbnRfcGFja2VkX3JhbmsxX3VwZGF0ZTxTY2FsYXIsaW50LENvbE1ham9yLFVwcGVyLGZhbHNlLENvbmo+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBMTwotICAgIChpbnRlcm5hbDo6c2VsZmFkam9pbnRfcGFja2VkX3JhbmsxX3VwZGF0ZTxTY2FsYXIsaW50LENvbE1ham9yLExvd2VyLGZhbHNlLENvbmo+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFVQCisgICAgICAoaW50ZXJuYWw6OnNlbGZhZGpvaW50X3BhY2tlZF9yYW5rMV91cGRhdGU8U2NhbGFyLCBpbnQsIENvbE1ham9yLCBVcHBlciwgZmFsc2UsIENvbmo+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IExPCisgICAgICAoaW50ZXJuYWw6OnNlbGZhZGpvaW50X3BhY2tlZF9yYW5rMV91cGRhdGU8U2NhbGFyLCBpbnQsIENvbE1ham9yLCBMb3dlciwgZmFsc2UsIENvbmo+OjpydW4pLAogICB9OwogCi0gIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOwotICBTY2FsYXIqIGFwID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYXApOworICBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweCk7CisgIFNjYWxhciAqYXAgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYXApOwogICBSZWFsU2NhbGFyIGFscGhhID0gKnBhbHBoYTsKIAogICBpbnQgaW5mbyA9IDA7Ci0gIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7Ci0gIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7Ci0gIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7Ci0gIGlmKGluZm8pCi0gICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJIUFIgICIsJmluZm8sNik7CisgIGlmIChVUExPKCp1cGxvKSA9PSBJTlZBTElEKQorICAgIGluZm8gPSAxOworICBlbHNlIGlmICgqbiA8IDApCisgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYgKCppbmN4ID09IDApCisgICAgaW5mbyA9IDU7CisgIGlmIChpbmZvKSByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQICJIUFIgICIsICZpbmZvLCA2KTsKIAotICBpZihhbHBoYT09U2NhbGFyKDApKQotICAgIHJldHVybiAxOworICBpZiAoYWxwaGEgPT0gU2NhbGFyKDApKSByZXR1cm4gMTsKIAotICBTY2FsYXIqIHhfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsICpuLCAqaW5jeCk7CisgIFNjYWxhciAqeF9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwgKm4sICppbmN4KTsKIAogICBpbnQgY29kZSA9IFVQTE8oKnVwbG8pOwotICBpZihjb2RlPj0yIHx8IGZ1bmNbY29kZV09PTApCi0gICAgcmV0dXJuIDA7CisgIGlmIChjb2RlID49IDIgfHwgZnVuY1tjb2RlXSA9PSAwKSByZXR1cm4gMDsKIAogICBmdW5jW2NvZGVdKCpuLCBhcCwgeF9jcHksIGFscGhhKTsKIAotICBpZih4X2NweSE9eCkgIGRlbGV0ZVtdIHhfY3B5OworICBpZiAoeF9jcHkgIT0geCkgZGVsZXRlW10geF9jcHk7CiAKICAgcmV0dXJuIDE7CiB9CiAKIC8qKiAgWkhQUjIgIHBlcmZvcm1zIHRoZSBoZXJtaXRpYW4gcmFuayAyIG9wZXJhdGlvbgotICAqCi0gICogICAgIEEgOj0gYWxwaGEqeCpjb25qZyggeScgKSArIGNvbmpnKCBhbHBoYSApKnkqY29uamcoIHgnICkgKyBBLAotICAqCi0gICogIHdoZXJlIGFscGhhIGlzIGEgc2NhbGFyLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQgQSBpcyBhbgotICAqICBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCi0gICovCi1pbnQgRUlHRU5fQkxBU19GVU5DKGhwcjIpKGNoYXIgKnVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpweSwgaW50ICppbmN5LCBSZWFsU2NhbGFyICpwYXApCi17Ci0gIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIFNjYWxhciosIGNvbnN0IFNjYWxhciosIGNvbnN0IFNjYWxhciosIFNjYWxhcik7CisgKgorICogICAgIEEgOj0gYWxwaGEqeCpjb25qZyggeScgKSArIGNvbmpnKCBhbHBoYSApKnkqY29uamcoIHgnICkgKyBBLAorICoKKyAqICB3aGVyZSBhbHBoYSBpcyBhIHNjYWxhciwgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kIEEgaXMgYW4KKyAqICBuIGJ5IG4gaGVybWl0aWFuIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCisgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkMoaHByMikoY2hhciAqdXBsbywgaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxTY2FsYXIgKnBhcCkgeworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBTY2FsYXIgKiwgY29uc3QgU2NhbGFyICosIGNvbnN0IFNjYWxhciAqLCBTY2FsYXIpOwogICBzdGF0aWMgY29uc3QgZnVuY3R5cGUgZnVuY1syXSA9IHsKLSAgICAvLyBhcnJheSBpbmRleDogVVAKLSAgICAoaW50ZXJuYWw6OnBhY2tlZF9yYW5rMl91cGRhdGVfc2VsZWN0b3I8U2NhbGFyLGludCxVcHBlcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IExPCi0gICAgKGludGVybmFsOjpwYWNrZWRfcmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhcixpbnQsTG93ZXI+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFVQCisgICAgICAoaW50ZXJuYWw6OnBhY2tlZF9yYW5rMl91cGRhdGVfc2VsZWN0b3I8U2NhbGFyLCBpbnQsIFVwcGVyPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBMTworICAgICAgKGludGVybmFsOjpwYWNrZWRfcmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhciwgaW50LCBMb3dlcj46OnJ1biksCiAgIH07CiAKLSAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7Ci0gIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOwotICBTY2FsYXIqIGFwID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYXApOwotICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYWxwaGEpOworICBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweCk7CisgIFNjYWxhciAqeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHB5KTsKKyAgU2NhbGFyICphcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBhcCk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYWxwaGEpOwogCiAgIGludCBpbmZvID0gMDsKLSAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKLSAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKLSAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKLSAgZWxzZSBpZigqaW5jeT09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKLSAgaWYoaW5mbykKLSAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkhQUjIgIiwmaW5mbyw2KTsKKyAgaWYgKFVQTE8oKnVwbG8pID09IElOVkFMSUQpCisgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYgKCpuIDwgMCkKKyAgICBpbmZvID0gMjsKKyAgZWxzZSBpZiAoKmluY3ggPT0gMCkKKyAgICBpbmZvID0gNTsKKyAgZWxzZSBpZiAoKmluY3kgPT0gMCkKKyAgICBpbmZvID0gNzsKKyAgaWYgKGluZm8pIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAgIkhQUjIgIiwgJmluZm8sIDYpOwogCi0gIGlmKGFscGhhPT1TY2FsYXIoMCkpCi0gICAgcmV0dXJuIDE7CisgIGlmIChhbHBoYSA9PSBTY2FsYXIoMCkpIHJldHVybiAxOwogCi0gIFNjYWxhciogeF9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwgKm4sICppbmN4KTsKLSAgU2NhbGFyKiB5X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCAqbiwgKmluY3kpOworICBTY2FsYXIgKnhfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsICpuLCAqaW5jeCk7CisgIFNjYWxhciAqeV9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeSwgKm4sICppbmN5KTsKIAogICBpbnQgY29kZSA9IFVQTE8oKnVwbG8pOwotICBpZihjb2RlPj0yIHx8IGZ1bmNbY29kZV09PTApCi0gICAgcmV0dXJuIDA7CisgIGlmIChjb2RlID49IDIgfHwgZnVuY1tjb2RlXSA9PSAwKSByZXR1cm4gMDsKIAogICBmdW5jW2NvZGVdKCpuLCBhcCwgeF9jcHksIHlfY3B5LCBhbHBoYSk7CiAKLSAgaWYoeF9jcHkhPXgpICBkZWxldGVbXSB4X2NweTsKLSAgaWYoeV9jcHkhPXkpICBkZWxldGVbXSB5X2NweTsKKyAgaWYgKHhfY3B5ICE9IHgpIGRlbGV0ZVtdIHhfY3B5OworICBpZiAoeV9jcHkgIT0geSkgZGVsZXRlW10geV9jcHk7CiAKICAgcmV0dXJuIDE7CiB9CiAKIC8qKiAgWkhFUiAgIHBlcmZvcm1zIHRoZSBoZXJtaXRpYW4gcmFuayAxIG9wZXJhdGlvbgotICAqCi0gICogICAgIEEgOj0gYWxwaGEqeCpjb25qZyggeCcgKSArIEEsCi0gICoKLSAgKiAgd2hlcmUgYWxwaGEgaXMgYSByZWFsIHNjYWxhciwgeCBpcyBhbiBuIGVsZW1lbnQgdmVjdG9yIGFuZCBBIGlzIGFuCi0gICogIG4gYnkgbiBoZXJtaXRpYW4gbWF0cml4LgotICAqLwotaW50IEVJR0VOX0JMQVNfRlVOQyhoZXIpKGNoYXIgKnVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEpCi17Ci0gIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIFNjYWxhciosIGludCwgY29uc3QgU2NhbGFyKiwgY29uc3QgU2NhbGFyKiwgY29uc3QgU2NhbGFyJik7CisgKgorICogICAgIEEgOj0gYWxwaGEqeCpjb25qZyggeCcgKSArIEEsCisgKgorICogIHdoZXJlIGFscGhhIGlzIGEgcmVhbCBzY2FsYXIsIHggaXMgYW4gbiBlbGVtZW50IHZlY3RvciBhbmQgQSBpcyBhbgorICogIG4gYnkgbiBoZXJtaXRpYW4gbWF0cml4LgorICovCitpbnQgRUlHRU5fQkxBU19GVU5DKGhlcikoY2hhciAqdXBsbywgaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSkgeworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBTY2FsYXIgKiwgaW50LCBjb25zdCBTY2FsYXIgKiwgY29uc3QgU2NhbGFyICosIGNvbnN0IFNjYWxhciAmKTsKICAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMl0gPSB7Ci0gICAgLy8gYXJyYXkgaW5kZXg6IFVQCi0gICAgKHNlbGZhZGpvaW50X3JhbmsxX3VwZGF0ZTxTY2FsYXIsaW50LENvbE1ham9yLFVwcGVyLGZhbHNlLENvbmo+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBMTwotICAgIChzZWxmYWRqb2ludF9yYW5rMV91cGRhdGU8U2NhbGFyLGludCxDb2xNYWpvcixMb3dlcixmYWxzZSxDb25qPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBVUAorICAgICAgKHNlbGZhZGpvaW50X3JhbmsxX3VwZGF0ZTxTY2FsYXIsIGludCwgQ29sTWFqb3IsIFVwcGVyLCBmYWxzZSwgQ29uaj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogTE8KKyAgICAgIChzZWxmYWRqb2ludF9yYW5rMV91cGRhdGU8U2NhbGFyLCBpbnQsIENvbE1ham9yLCBMb3dlciwgZmFsc2UsIENvbmo+OjpydW4pLAogICB9OwogCi0gIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOwotICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKLSAgUmVhbFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFJlYWxTY2FsYXIqPihwYWxwaGEpOworICBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweCk7CisgIFNjYWxhciAqYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBhKTsKKyAgUmVhbFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFJlYWxTY2FsYXIgKj4ocGFscGhhKTsKIAogICBpbnQgaW5mbyA9IDA7Ci0gIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7Ci0gIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7Ci0gIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7Ci0gIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLCpuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7Ci0gIGlmKGluZm8pCi0gICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJIRVIgICIsJmluZm8sNik7CisgIGlmIChVUExPKCp1cGxvKSA9PSBJTlZBTElEKQorICAgIGluZm8gPSAxOworICBlbHNlIGlmICgqbiA8IDApCisgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYgKCppbmN4ID09IDApCisgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYgKCpsZGEgPCBzdGQ6Om1heCgxLCAqbikpCisgICAgaW5mbyA9IDc7CisgIGlmIChpbmZvKSByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQICJIRVIgICIsICZpbmZvLCA2KTsKIAotICBpZihhbHBoYT09UmVhbFNjYWxhcigwKSkKLSAgICByZXR1cm4gMTsKKyAgaWYgKGFscGhhID09IFJlYWxTY2FsYXIoMCkpIHJldHVybiAxOwogCi0gIFNjYWxhciogeF9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwgKm4sICppbmN4KTsKKyAgU2NhbGFyICp4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbiwgKmluY3gpOwogCiAgIGludCBjb2RlID0gVVBMTygqdXBsbyk7Ci0gIGlmKGNvZGU+PTIgfHwgZnVuY1tjb2RlXT09MCkKLSAgICByZXR1cm4gMDsKKyAgaWYgKGNvZGUgPj0gMiB8fCBmdW5jW2NvZGVdID09IDApIHJldHVybiAwOwogCiAgIGZ1bmNbY29kZV0oKm4sIGEsICpsZGEsIHhfY3B5LCB4X2NweSwgYWxwaGEpOwogCi0gIG1hdHJpeChhLCpuLCpuLCpsZGEpLmRpYWdvbmFsKCkuaW1hZygpLnNldFplcm8oKTsKKyAgbWF0cml4KGEsICpuLCAqbiwgKmxkYSkuZGlhZ29uYWwoKS5pbWFnKCkuc2V0WmVybygpOwogCi0gIGlmKHhfY3B5IT14KSAgZGVsZXRlW10geF9jcHk7CisgIGlmICh4X2NweSAhPSB4KSBkZWxldGVbXSB4X2NweTsKIAogICByZXR1cm4gMTsKIH0KIAogLyoqICBaSEVSMiAgcGVyZm9ybXMgdGhlIGhlcm1pdGlhbiByYW5rIDIgb3BlcmF0aW9uCi0gICoKLSAgKiAgICAgQSA6PSBhbHBoYSp4KmNvbmpnKCB5JyApICsgY29uamcoIGFscGhhICkqeSpjb25qZyggeCcgKSArIEEsCi0gICoKLSAgKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCBBIGlzIGFuIG4KLSAgKiAgYnkgbiBoZXJtaXRpYW4gbWF0cml4LgotICAqLwotaW50IEVJR0VOX0JMQVNfRlVOQyhoZXIyKShjaGFyICp1cGxvLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhKQotewotICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBTY2FsYXIqLCBpbnQsIGNvbnN0IFNjYWxhciosIGNvbnN0IFNjYWxhciosIFNjYWxhcik7CisgKgorICogICAgIEEgOj0gYWxwaGEqeCpjb25qZyggeScgKSArIGNvbmpnKCBhbHBoYSApKnkqY29uamcoIHgnICkgKyBBLAorICoKKyAqICB3aGVyZSBhbHBoYSBpcyBhIHNjYWxhciwgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kIEEgaXMgYW4gbgorICogIGJ5IG4gaGVybWl0aWFuIG1hdHJpeC4KKyAqLworaW50IEVJR0VOX0JMQVNfRlVOQyhoZXIyKShjaGFyICp1cGxvLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhKSB7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIFNjYWxhciAqLCBpbnQsIGNvbnN0IFNjYWxhciAqLCBjb25zdCBTY2FsYXIgKiwgU2NhbGFyKTsKICAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMl0gPSB7Ci0gICAgLy8gYXJyYXkgaW5kZXg6IFVQCi0gICAgKGludGVybmFsOjpyYW5rMl91cGRhdGVfc2VsZWN0b3I8U2NhbGFyLGludCxVcHBlcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IExPCi0gICAgKGludGVybmFsOjpyYW5rMl91cGRhdGVfc2VsZWN0b3I8U2NhbGFyLGludCxMb3dlcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogVVAKKyAgICAgIChpbnRlcm5hbDo6cmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhciwgaW50LCBVcHBlcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogTE8KKyAgICAgIChpbnRlcm5hbDo6cmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhciwgaW50LCBMb3dlcj46OnJ1biksCiAgIH07CiAKLSAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7Ci0gIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOwotICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKLSAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKyAgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHgpOworICBTY2FsYXIgKnkgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweSk7CisgIFNjYWxhciAqYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBhKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBhbHBoYSk7CiAKICAgaW50IGluZm8gPSAwOwotICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOwotICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOwotICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OwotICBlbHNlIGlmKCppbmN5PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA3OwotICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA5OwotICBpZihpbmZvKQotICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiSEVSMiAiLCZpbmZvLDYpOworICBpZiAoVVBMTygqdXBsbykgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMTsKKyAgZWxzZSBpZiAoKm4gPCAwKQorICAgIGluZm8gPSAyOworICBlbHNlIGlmICgqaW5jeCA9PSAwKQorICAgIGluZm8gPSA1OworICBlbHNlIGlmICgqaW5jeSA9PSAwKQorICAgIGluZm8gPSA3OworICBlbHNlIGlmICgqbGRhIDwgc3RkOjptYXgoMSwgKm4pKQorICAgIGluZm8gPSA5OworICBpZiAoaW5mbykgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCAiSEVSMiAiLCAmaW5mbywgNik7CiAKLSAgaWYoYWxwaGE9PVNjYWxhcigwKSkKLSAgICByZXR1cm4gMTsKKyAgaWYgKGFscGhhID09IFNjYWxhcigwKSkgcmV0dXJuIDE7CiAKLSAgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbiwgKmluY3gpOwotICBTY2FsYXIqIHlfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHksICpuLCAqaW5jeSk7CisgIFNjYWxhciAqeF9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwgKm4sICppbmN4KTsKKyAgU2NhbGFyICp5X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCAqbiwgKmluY3kpOwogCiAgIGludCBjb2RlID0gVVBMTygqdXBsbyk7Ci0gIGlmKGNvZGU+PTIgfHwgZnVuY1tjb2RlXT09MCkKLSAgICByZXR1cm4gMDsKKyAgaWYgKGNvZGUgPj0gMiB8fCBmdW5jW2NvZGVdID09IDApIHJldHVybiAwOwogCiAgIGZ1bmNbY29kZV0oKm4sIGEsICpsZGEsIHhfY3B5LCB5X2NweSwgYWxwaGEpOwogCi0gIG1hdHJpeChhLCpuLCpuLCpsZGEpLmRpYWdvbmFsKCkuaW1hZygpLnNldFplcm8oKTsKKyAgbWF0cml4KGEsICpuLCAqbiwgKmxkYSkuZGlhZ29uYWwoKS5pbWFnKCkuc2V0WmVybygpOwogCi0gIGlmKHhfY3B5IT14KSAgZGVsZXRlW10geF9jcHk7Ci0gIGlmKHlfY3B5IT15KSAgZGVsZXRlW10geV9jcHk7CisgIGlmICh4X2NweSAhPSB4KSBkZWxldGVbXSB4X2NweTsKKyAgaWYgKHlfY3B5ICE9IHkpIGRlbGV0ZVtdIHlfY3B5OwogCiAgIHJldHVybiAxOwogfQogCiAvKiogIFpHRVJVICBwZXJmb3JtcyB0aGUgcmFuayAxIG9wZXJhdGlvbgotICAqCi0gICogICAgIEEgOj0gYWxwaGEqeCp5JyArIEEsCi0gICoKLSAgKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggaXMgYW4gbSBlbGVtZW50IHZlY3RvciwgeSBpcyBhbiBuIGVsZW1lbnQKLSAgKiAgdmVjdG9yIGFuZCBBIGlzIGFuIG0gYnkgbiBtYXRyaXguCi0gICovCi1pbnQgRUlHRU5fQkxBU19GVU5DKGdlcnUpKGludCAqbSwgaW50ICpuLCBSZWFsU2NhbGFyICpwYWxwaGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnB5LCBpbnQgKmluY3ksIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSkKLXsKLSAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7Ci0gIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOwotICBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhKTsKLSAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKyAqCisgKiAgICAgQSA6PSBhbHBoYSp4KnknICsgQSwKKyAqCisgKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggaXMgYW4gbSBlbGVtZW50IHZlY3RvciwgeSBpcyBhbiBuIGVsZW1lbnQKKyAqICB2ZWN0b3IgYW5kIEEgaXMgYW4gbSBieSBuIG1hdHJpeC4KKyAqLworaW50IEVJR0VOX0JMQVNfRlVOQyhnZXJ1KShpbnQgKm0sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpweSwgaW50ICppbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEpIHsKKyAgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHgpOworICBTY2FsYXIgKnkgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweSk7CisgIFNjYWxhciAqYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBhKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBhbHBoYSk7CiAKICAgaW50IGluZm8gPSAwOwotICAgICAgIGlmKCptPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOwotICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOwotICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OwotICBlbHNlIGlmKCppbmN5PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA3OwotICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA5OwotICBpZihpbmZvKQotICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiR0VSVSAiLCZpbmZvLDYpOworICBpZiAoKm0gPCAwKQorICAgIGluZm8gPSAxOworICBlbHNlIGlmICgqbiA8IDApCisgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYgKCppbmN4ID09IDApCisgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYgKCppbmN5ID09IDApCisgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYgKCpsZGEgPCBzdGQ6Om1heCgxLCAqbSkpCisgICAgaW5mbyA9IDk7CisgIGlmIChpbmZvKSByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQICJHRVJVICIsICZpbmZvLCA2KTsKIAotICBpZihhbHBoYT09U2NhbGFyKDApKQotICAgIHJldHVybiAxOworICBpZiAoYWxwaGEgPT0gU2NhbGFyKDApKSByZXR1cm4gMTsKIAotICBTY2FsYXIqIHhfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsKm0sKmluY3gpOwotICBTY2FsYXIqIHlfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHksKm4sKmluY3kpOworICBTY2FsYXIgKnhfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsICptLCAqaW5jeCk7CisgIFNjYWxhciAqeV9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeSwgKm4sICppbmN5KTsKIAotICBpbnRlcm5hbDo6Z2VuZXJhbF9yYW5rMV91cGRhdGU8U2NhbGFyLGludCxDb2xNYWpvcixmYWxzZSxmYWxzZT46OnJ1bigqbSwgKm4sIGEsICpsZGEsIHhfY3B5LCB5X2NweSwgYWxwaGEpOworICBpbnRlcm5hbDo6Z2VuZXJhbF9yYW5rMV91cGRhdGU8U2NhbGFyLCBpbnQsIENvbE1ham9yLCBmYWxzZSwgZmFsc2U+OjpydW4oKm0sICpuLCBhLCAqbGRhLCB4X2NweSwgeV9jcHksIGFscGhhKTsKIAotICBpZih4X2NweSE9eCkgIGRlbGV0ZVtdIHhfY3B5OwotICBpZih5X2NweSE9eSkgIGRlbGV0ZVtdIHlfY3B5OworICBpZiAoeF9jcHkgIT0geCkgZGVsZXRlW10geF9jcHk7CisgIGlmICh5X2NweSAhPSB5KSBkZWxldGVbXSB5X2NweTsKIAogICByZXR1cm4gMTsKIH0KIAogLyoqICBaR0VSQyAgcGVyZm9ybXMgdGhlIHJhbmsgMSBvcGVyYXRpb24KLSAgKgotICAqICAgICBBIDo9IGFscGhhKngqY29uamcoIHknICkgKyBBLAotICAqCi0gICogIHdoZXJlIGFscGhhIGlzIGEgc2NhbGFyLCB4IGlzIGFuIG0gZWxlbWVudCB2ZWN0b3IsIHkgaXMgYW4gbiBlbGVtZW50Ci0gICogIHZlY3RvciBhbmQgQSBpcyBhbiBtIGJ5IG4gbWF0cml4LgotICAqLwotaW50IEVJR0VOX0JMQVNfRlVOQyhnZXJjKShpbnQgKm0sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpweSwgaW50ICppbmN5LCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEpCi17Ci0gIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOwotICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKLSAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7Ci0gIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisgKgorICogICAgIEEgOj0gYWxwaGEqeCpjb25qZyggeScgKSArIEEsCisgKgorICogIHdoZXJlIGFscGhhIGlzIGEgc2NhbGFyLCB4IGlzIGFuIG0gZWxlbWVudCB2ZWN0b3IsIHkgaXMgYW4gbiBlbGVtZW50CisgKiAgdmVjdG9yIGFuZCBBIGlzIGFuIG0gYnkgbiBtYXRyaXguCisgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkMoZ2VyYykoaW50ICptLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhKSB7CisgIFNjYWxhciAqeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHB4KTsKKyAgU2NhbGFyICp5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHkpOworICBTY2FsYXIgKmEgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYSk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYWxwaGEpOwogCiAgIGludCBpbmZvID0gMDsKLSAgICAgICBpZigqbTwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKLSAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKLSAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKLSAgZWxzZSBpZigqaW5jeT09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKLSAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKm0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKLSAgaWYoaW5mbykKLSAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkdFUkMgIiwmaW5mbyw2KTsKKyAgaWYgKCptIDwgMCkKKyAgICBpbmZvID0gMTsKKyAgZWxzZSBpZiAoKm4gPCAwKQorICAgIGluZm8gPSAyOworICBlbHNlIGlmICgqaW5jeCA9PSAwKQorICAgIGluZm8gPSA1OworICBlbHNlIGlmICgqaW5jeSA9PSAwKQorICAgIGluZm8gPSA3OworICBlbHNlIGlmICgqbGRhIDwgc3RkOjptYXgoMSwgKm0pKQorICAgIGluZm8gPSA5OworICBpZiAoaW5mbykgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCAiR0VSQyAiLCAmaW5mbywgNik7CiAKLSAgaWYoYWxwaGE9PVNjYWxhcigwKSkKLSAgICByZXR1cm4gMTsKKyAgaWYgKGFscGhhID09IFNjYWxhcigwKSkgcmV0dXJuIDE7CiAKLSAgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCptLCppbmN4KTsKLSAgU2NhbGFyKiB5X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCpuLCppbmN5KTsKKyAgU2NhbGFyICp4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbSwgKmluY3gpOworICBTY2FsYXIgKnlfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHksICpuLCAqaW5jeSk7CiAKLSAgaW50ZXJuYWw6OmdlbmVyYWxfcmFuazFfdXBkYXRlPFNjYWxhcixpbnQsQ29sTWFqb3IsZmFsc2UsQ29uaj46OnJ1bigqbSwgKm4sIGEsICpsZGEsIHhfY3B5LCB5X2NweSwgYWxwaGEpOworICBpbnRlcm5hbDo6Z2VuZXJhbF9yYW5rMV91cGRhdGU8U2NhbGFyLCBpbnQsIENvbE1ham9yLCBmYWxzZSwgQ29uaj46OnJ1bigqbSwgKm4sIGEsICpsZGEsIHhfY3B5LCB5X2NweSwgYWxwaGEpOwogCi0gIGlmKHhfY3B5IT14KSAgZGVsZXRlW10geF9jcHk7Ci0gIGlmKHlfY3B5IT15KSAgZGVsZXRlW10geV9jcHk7CisgIGlmICh4X2NweSAhPSB4KSBkZWxldGVbXSB4X2NweTsKKyAgaWYgKHlfY3B5ICE9IHkpIGRlbGV0ZVtdIHlfY3B5OwogCiAgIHJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvYmxhcy9sZXZlbDJfaW1wbC5oIGIvYmxhcy9sZXZlbDJfaW1wbC5oCmluZGV4IDE3M2Y0MGIuLjAxMzhhOWMgMTAwNjQ0Ci0tLSBhL2JsYXMvbGV2ZWwyX2ltcGwuaAorKysgYi9ibGFzL2xldmVsMl9pbXBsLmgKQEAgLTksMjcwICs5LDI3MyBAQAogCiAjaW5jbHVkZSAiY29tbW9uLmgiCiAKLXRlbXBsYXRlPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBTY2FsYXIsIGludCBTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLCBib29sIENvbmp1Z2F0ZVJocz4KLXN0cnVjdCBnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdF93cmFwcGVyCi17Ci0gIHN0YXRpYyB2b2lkIHJ1bihJbmRleCByb3dzLCBJbmRleCBjb2xzLGNvbnN0IFNjYWxhciAqbGhzLCBJbmRleCBsaHNTdHJpZGUsIGNvbnN0IFNjYWxhciAqcmhzLCBJbmRleCByaHNJbmNyLCBTY2FsYXIqIHJlcywgSW5kZXggcmVzSW5jciwgU2NhbGFyIGFscGhhKQotICB7Ci0gICAgdHlwZWRlZiBpbnRlcm5hbDo6Y29uc3RfYmxhc19kYXRhX21hcHBlcjxTY2FsYXIsSW5kZXgsU3RvcmFnZU9yZGVyPiBMaHNNYXBwZXI7Ci0gICAgdHlwZWRlZiBpbnRlcm5hbDo6Y29uc3RfYmxhc19kYXRhX21hcHBlcjxTY2FsYXIsSW5kZXgsUm93TWFqb3I+IFJoc01hcHBlcjsKLSAgICAKLSAgICBpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QKLSAgICAgICAgPEluZGV4LFNjYWxhcixMaHNNYXBwZXIsU3RvcmFnZU9yZGVyLENvbmp1Z2F0ZUxocyxTY2FsYXIsUmhzTWFwcGVyLENvbmp1Z2F0ZVJocz46OnJ1bigKLSAgICAgICAgcm93cywgY29scywgTGhzTWFwcGVyKGxocywgbGhzU3RyaWRlKSwgUmhzTWFwcGVyKHJocywgcmhzSW5jciksIHJlcywgcmVzSW5jciwgYWxwaGEpOwordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBTY2FsYXIsIGludCBTdG9yYWdlT3JkZXIsIGJvb2wgQ29uanVnYXRlTGhzLCBib29sIENvbmp1Z2F0ZVJocz4KK3N0cnVjdCBnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdF93cmFwcGVyIHsKKyAgc3RhdGljIHZvaWQgcnVuKEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIGNvbnN0IFNjYWxhciAqbGhzLCBJbmRleCBsaHNTdHJpZGUsIGNvbnN0IFNjYWxhciAqcmhzLCBJbmRleCByaHNJbmNyLAorICAgICAgICAgICAgICAgICAgU2NhbGFyICpyZXMsIEluZGV4IHJlc0luY3IsIFNjYWxhciBhbHBoYSkgeworICAgIHR5cGVkZWYgaW50ZXJuYWw6OmNvbnN0X2JsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgU3RvcmFnZU9yZGVyPiBMaHNNYXBwZXI7CisgICAgdHlwZWRlZiBpbnRlcm5hbDo6Y29uc3RfYmxhc19kYXRhX21hcHBlcjxTY2FsYXIsIEluZGV4LCBSb3dNYWpvcj4gUmhzTWFwcGVyOworCisgICAgaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEluZGV4LCBTY2FsYXIsIExoc01hcHBlciwgU3RvcmFnZU9yZGVyLCBDb25qdWdhdGVMaHMsIFNjYWxhciwgUmhzTWFwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25qdWdhdGVSaHM+OjpydW4ocm93cywgY29scywgTGhzTWFwcGVyKGxocywgbGhzU3RyaWRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJoc01hcHBlcihyaHMsIHJoc0luY3IpLCByZXMsIHJlc0luY3IsIGFscGhhKTsKICAgfQogfTsKIAotaW50IEVJR0VOX0JMQVNfRlVOQyhnZW12KShjb25zdCBjaGFyICpvcGEsIGNvbnN0IGludCAqbSwgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGIsIGNvbnN0IGludCAqaW5jYiwgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBjb25zdCBpbnQgKmluY2MpCi17Ci0gIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIGludCwgY29uc3QgU2NhbGFyICosIGludCwgY29uc3QgU2NhbGFyICosIGludCAsIFNjYWxhciAqLCBpbnQsIFNjYWxhcik7Ci0gIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzRdID0gewotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSCi0gICAgKGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3dyYXBwZXI8aW50LFNjYWxhcixDb2xNYWpvcixmYWxzZSxmYWxzZT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAKLSAgICAoZ2VuZXJhbF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfd3JhcHBlcjxpbnQsU2NhbGFyLFJvd01ham9yLGZhbHNlLGZhbHNlPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKIAotICAgIChnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdF93cmFwcGVyPGludCxTY2FsYXIsUm93TWFqb3IsQ29uaiAsZmFsc2U+OjpydW4pLAotICAgIDAKLSAgfTsKK2ludCBFSUdFTl9CTEFTX0ZVTkMoZ2VtdikoY29uc3QgY2hhciAqb3BhLCBjb25zdCBpbnQgKm0sIGNvbnN0IGludCAqbiwgY29uc3QgUmVhbFNjYWxhciAqcGFscGhhLCBjb25zdCBSZWFsU2NhbGFyICpwYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpsZGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBiLCBjb25zdCBpbnQgKmluY2IsIGNvbnN0IFJlYWxTY2FsYXIgKnBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsU2NhbGFyICpwYywgY29uc3QgaW50ICppbmNjKSB7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIGludCwgY29uc3QgU2NhbGFyICosIGludCwgY29uc3QgU2NhbGFyICosIGludCwgU2NhbGFyICosIGludCwgU2NhbGFyKTsKKyAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbNF0gPSB7Ly8gYXJyYXkgaW5kZXg6IE5PVFIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3dyYXBwZXI8aW50LCBTY2FsYXIsIENvbE1ham9yLCBmYWxzZSwgZmFsc2U+OjpydW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBpbmRleDogVFIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdlbmVyYWxfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0X3dyYXBwZXI8aW50LCBTY2FsYXIsIFJvd01ham9yLCBmYWxzZSwgZmFsc2U+OjpydW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBpbmRleDogQURKCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZW5lcmFsX21hdHJpeF92ZWN0b3JfcHJvZHVjdF93cmFwcGVyPGludCwgU2NhbGFyLCBSb3dNYWpvciwgQ29uaiwgZmFsc2U+OjpydW4pLCAwfTsKIAotICBjb25zdCBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhKTsKLSAgY29uc3QgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYik7Ci0gIFNjYWxhciogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGMpOwotICBTY2FsYXIgYWxwaGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKLSAgU2NhbGFyIGJldGEgICA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBiZXRhKTsKKyAgY29uc3QgU2NhbGFyICphID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGEpOworICBjb25zdCBTY2FsYXIgKmIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYik7CisgIFNjYWxhciAqYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBjKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBhbHBoYSk7CisgIFNjYWxhciBiZXRhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBiZXRhKTsKIAogICAvLyBjaGVjayBhcmd1bWVudHMKICAgaW50IGluZm8gPSAwOwotICBpZihPUCgqb3BhKT09SU5WQUxJRCkgICAgICAgICAgIGluZm8gPSAxOwotICBlbHNlIGlmKCptPDApICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOwotICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOwotICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbSkpICAgIGluZm8gPSA2OwotICBlbHNlIGlmKCppbmNiPT0wKSAgICAgICAgICAgICAgIGluZm8gPSA4OwotICBlbHNlIGlmKCppbmNjPT0wKSAgICAgICAgICAgICAgIGluZm8gPSAxMTsKLSAgaWYoaW5mbykKLSAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkdFTVYgIiwmaW5mbyw2KTsKKyAgaWYgKE9QKCpvcGEpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYgKCptIDwgMCkKKyAgICBpbmZvID0gMjsKKyAgZWxzZSBpZiAoKm4gPCAwKQorICAgIGluZm8gPSAzOworICBlbHNlIGlmICgqbGRhIDwgc3RkOjptYXgoMSwgKm0pKQorICAgIGluZm8gPSA2OworICBlbHNlIGlmICgqaW5jYiA9PSAwKQorICAgIGluZm8gPSA4OworICBlbHNlIGlmICgqaW5jYyA9PSAwKQorICAgIGluZm8gPSAxMTsKKyAgaWYgKGluZm8pIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAgIkdFTVYgIiwgJmluZm8sIDYpOwogCi0gIGlmKCptPT0wIHx8ICpuPT0wIHx8IChhbHBoYT09U2NhbGFyKDApICYmIGJldGE9PVNjYWxhcigxKSkpCi0gICAgcmV0dXJuIDA7CisgIGlmICgqbSA9PSAwIHx8ICpuID09IDAgfHwgKGFscGhhID09IFNjYWxhcigwKSAmJiBiZXRhID09IFNjYWxhcigxKSkpIHJldHVybiAwOwogCiAgIGludCBhY3R1YWxfbSA9ICptOwogICBpbnQgYWN0dWFsX24gPSAqbjsKICAgaW50IGNvZGUgPSBPUCgqb3BhKTsKLSAgaWYoY29kZSE9Tk9UUikKLSAgICBzdGQ6OnN3YXAoYWN0dWFsX20sYWN0dWFsX24pOworICBpZiAoY29kZSAhPSBOT1RSKSBzdGQ6OnN3YXAoYWN0dWFsX20sIGFjdHVhbF9uKTsKIAotICBjb25zdCBTY2FsYXIqIGFjdHVhbF9iID0gZ2V0X2NvbXBhY3RfdmVjdG9yKGIsYWN0dWFsX24sKmluY2IpOwotICBTY2FsYXIqIGFjdHVhbF9jID0gZ2V0X2NvbXBhY3RfdmVjdG9yKGMsYWN0dWFsX20sKmluY2MpOworICBjb25zdCBTY2FsYXIgKmFjdHVhbF9iID0gZ2V0X2NvbXBhY3RfdmVjdG9yKGIsIGFjdHVhbF9uLCAqaW5jYik7CisgIFNjYWxhciAqYWN0dWFsX2MgPSBnZXRfY29tcGFjdF92ZWN0b3IoYywgYWN0dWFsX20sICppbmNjKTsKIAotICBpZihiZXRhIT1TY2FsYXIoMSkpCi0gIHsKLSAgICBpZihiZXRhPT1TY2FsYXIoMCkpIG1ha2VfdmVjdG9yKGFjdHVhbF9jLCBhY3R1YWxfbSkuc2V0WmVybygpOwotICAgIGVsc2UgICAgICAgICAgICAgICAgbWFrZV92ZWN0b3IoYWN0dWFsX2MsIGFjdHVhbF9tKSAqPSBiZXRhOworICBpZiAoYmV0YSAhPSBTY2FsYXIoMSkpIHsKKyAgICBpZiAoYmV0YSA9PSBTY2FsYXIoMCkpCisgICAgICBtYWtlX3ZlY3RvcihhY3R1YWxfYywgYWN0dWFsX20pLnNldFplcm8oKTsKKyAgICBlbHNlCisgICAgICBtYWtlX3ZlY3RvcihhY3R1YWxfYywgYWN0dWFsX20pICo9IGJldGE7CiAgIH0KIAotICBpZihjb2RlPj00IHx8IGZ1bmNbY29kZV09PTApCi0gICAgcmV0dXJuIDA7CisgIGlmIChjb2RlID49IDQgfHwgZnVuY1tjb2RlXSA9PSAwKSByZXR1cm4gMDsKIAogICBmdW5jW2NvZGVdKGFjdHVhbF9tLCBhY3R1YWxfbiwgYSwgKmxkYSwgYWN0dWFsX2IsIDEsIGFjdHVhbF9jLCAxLCBhbHBoYSk7CiAKLSAgaWYoYWN0dWFsX2IhPWIpIGRlbGV0ZVtdIGFjdHVhbF9iOwotICBpZihhY3R1YWxfYyE9YykgZGVsZXRlW10gY29weV9iYWNrKGFjdHVhbF9jLGMsYWN0dWFsX20sKmluY2MpOworICBpZiAoYWN0dWFsX2IgIT0gYikgZGVsZXRlW10gYWN0dWFsX2I7CisgIGlmIChhY3R1YWxfYyAhPSBjKSBkZWxldGVbXSBjb3B5X2JhY2soYWN0dWFsX2MsIGMsIGFjdHVhbF9tLCAqaW5jYyk7CiAKICAgcmV0dXJuIDE7CiB9CiAKLWludCBFSUdFTl9CTEFTX0ZVTkModHJzdikoY29uc3QgY2hhciAqdXBsbywgY29uc3QgY2hhciAqb3BhLCBjb25zdCBjaGFyICpkaWFnLCBjb25zdCBpbnQgKm4sIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgUmVhbFNjYWxhciAqcGIsIGNvbnN0IGludCAqaW5jYikKLXsKK2ludCBFSUdFTl9CTEFTX0ZVTkModHJzdikoY29uc3QgY2hhciAqdXBsbywgY29uc3QgY2hhciAqb3BhLCBjb25zdCBjaGFyICpkaWFnLCBjb25zdCBpbnQgKm4sIGNvbnN0IFJlYWxTY2FsYXIgKnBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmxkYSwgUmVhbFNjYWxhciAqcGIsIGNvbnN0IGludCAqaW5jYikgewogICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBjb25zdCBTY2FsYXIgKiwgaW50LCBTY2FsYXIgKik7CiAgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzE2XSA9IHsKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgVXBwZXJ8MCwgICAgICAgZmFsc2UsQ29sTWFqb3I+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBMb3dlcnwwLCAgICAgICBmYWxzZSxSb3dNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIExvd2VyfDAsICAgICAgIENvbmosIFJvd01ham9yPjo6cnVuKSwKLSAgICAwLAotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBMb3dlcnwwLCAgICAgICBmYWxzZSxDb2xNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIFVwcGVyfDAsICAgICAgIGZhbHNlLFJvd01ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMykKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgVXBwZXJ8MCwgICAgICAgQ29uaiwgUm93TWFqb3I+OjpydW4pLAotICAgIDAsCi0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIFVwcGVyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgTG93ZXJ8VW5pdERpYWcsZmFsc2UsUm93TWFqb3I+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBMb3dlcnxVbml0RGlhZyxDb25qLCBSb3dNYWpvcj46OnJ1biksCi0gICAgMCwKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgTG93ZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBVcHBlcnxVbml0RGlhZyxmYWxzZSxSb3dNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIFVwcGVyfFVuaXREaWFnLENvbmosIFJvd01ham9yPjo6cnVuKSwKLSAgICAwCi0gIH07CisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLCBTY2FsYXIsIGludCwgT25UaGVMZWZ0LCBVcHBlciB8IDAsIGZhbHNlLCBDb2xNYWpvcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLCBTY2FsYXIsIGludCwgT25UaGVMZWZ0LCBMb3dlciB8IDAsIGZhbHNlLCBSb3dNYWpvcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLCBTY2FsYXIsIGludCwgT25UaGVMZWZ0LCBMb3dlciB8IDAsIENvbmosIFJvd01ham9yPjo6cnVuKSwgMCwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsIFNjYWxhciwgaW50LCBPblRoZUxlZnQsIExvd2VyIHwgMCwgZmFsc2UsIENvbE1ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsIFNjYWxhciwgaW50LCBPblRoZUxlZnQsIFVwcGVyIHwgMCwgZmFsc2UsIFJvd01ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsIFNjYWxhciwgaW50LCBPblRoZUxlZnQsIFVwcGVyIHwgMCwgQ29uaiwgUm93TWFqb3I+OjpydW4pLCAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhciwgU2NhbGFyLCBpbnQsIE9uVGhlTGVmdCwgVXBwZXIgfCBVbml0RGlhZywgZmFsc2UsIENvbE1ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsIFNjYWxhciwgaW50LCBPblRoZUxlZnQsIExvd2VyIHwgVW5pdERpYWcsIGZhbHNlLCBSb3dNYWpvcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLCBTY2FsYXIsIGludCwgT25UaGVMZWZ0LCBMb3dlciB8IFVuaXREaWFnLCBDb25qLCBSb3dNYWpvcj46OnJ1biksIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLCBTY2FsYXIsIGludCwgT25UaGVMZWZ0LCBMb3dlciB8IFVuaXREaWFnLCBmYWxzZSwgQ29sTWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhciwgU2NhbGFyLCBpbnQsIE9uVGhlTGVmdCwgVXBwZXIgfCBVbml0RGlhZywgZmFsc2UsIFJvd01ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsIFNjYWxhciwgaW50LCBPblRoZUxlZnQsIFVwcGVyIHwgVW5pdERpYWcsIENvbmosIFJvd01ham9yPjo6cnVuKSwgMH07CiAKLSAgY29uc3QgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYSk7Ci0gIFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGIpOworICBjb25zdCBTY2FsYXIgKmEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYSk7CisgIFNjYWxhciAqYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBiKTsKIAogICBpbnQgaW5mbyA9IDA7Ci0gIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7Ci0gIGVsc2UgaWYoT1AoKm9wYSk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7Ci0gIGVsc2UgaWYoRElBRygqZGlhZyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7Ci0gIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7Ci0gIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLCpuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDY7Ci0gIGVsc2UgaWYoKmluY2I9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDg7Ci0gIGlmKGluZm8pCi0gICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJUUlNWICIsJmluZm8sNik7CisgIGlmIChVUExPKCp1cGxvKSA9PSBJTlZBTElEKQorICAgIGluZm8gPSAxOworICBlbHNlIGlmIChPUCgqb3BhKSA9PSBJTlZBTElEKQorICAgIGluZm8gPSAyOworICBlbHNlIGlmIChESUFHKCpkaWFnKSA9PSBJTlZBTElEKQorICAgIGluZm8gPSAzOworICBlbHNlIGlmICgqbiA8IDApCisgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYgKCpsZGEgPCBzdGQ6Om1heCgxLCAqbikpCisgICAgaW5mbyA9IDY7CisgIGVsc2UgaWYgKCppbmNiID09IDApCisgICAgaW5mbyA9IDg7CisgIGlmIChpbmZvKSByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQICJUUlNWICIsICZpbmZvLCA2KTsKIAotICBTY2FsYXIqIGFjdHVhbF9iID0gZ2V0X2NvbXBhY3RfdmVjdG9yKGIsKm4sKmluY2IpOworICBTY2FsYXIgKmFjdHVhbF9iID0gZ2V0X2NvbXBhY3RfdmVjdG9yKGIsICpuLCAqaW5jYik7CiAKICAgaW50IGNvZGUgPSBPUCgqb3BhKSB8IChVUExPKCp1cGxvKSA8PCAyKSB8IChESUFHKCpkaWFnKSA8PCAzKTsKICAgZnVuY1tjb2RlXSgqbiwgYSwgKmxkYSwgYWN0dWFsX2IpOwogCi0gIGlmKGFjdHVhbF9iIT1iKSBkZWxldGVbXSBjb3B5X2JhY2soYWN0dWFsX2IsYiwqbiwqaW5jYik7CisgIGlmIChhY3R1YWxfYiAhPSBiKSBkZWxldGVbXSBjb3B5X2JhY2soYWN0dWFsX2IsIGIsICpuLCAqaW5jYik7CiAKICAgcmV0dXJuIDA7CiB9CiAKLQotCi1pbnQgRUlHRU5fQkxBU19GVU5DKHRybXYpKGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGNoYXIgKm9wYSwgY29uc3QgY2hhciAqZGlhZywgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYSwgY29uc3QgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiLCBjb25zdCBpbnQgKmluY2IpCi17Ci0gIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIGludCwgY29uc3QgU2NhbGFyICosIGludCwgY29uc3QgU2NhbGFyICosIGludCwgU2NhbGFyICosIGludCwgY29uc3QgU2NhbGFyJik7CitpbnQgRUlHRU5fQkxBU19GVU5DKHRybXYpKGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGNoYXIgKm9wYSwgY29uc3QgY2hhciAqZGlhZywgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiLCBjb25zdCBpbnQgKmluY2IpIHsKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKGludCwgaW50LCBjb25zdCBTY2FsYXIgKiwgaW50LCBjb25zdCBTY2FsYXIgKiwgaW50LCBTY2FsYXIgKiwgaW50LCBjb25zdCBTY2FsYXIgJik7CiAgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzE2XSA9IHsKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnwwLCAgICAgICBTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxMb3dlcnwwLCAgICAgICBTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxMb3dlcnwwLCAgICAgICBTY2FsYXIsQ29uaiwgU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKLSAgICAwLAotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LExvd2VyfDAsICAgICAgIFNjYWxhcixmYWxzZSxTY2FsYXIsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LFVwcGVyfDAsICAgICAgIFNjYWxhcixmYWxzZSxTY2FsYXIsZmFsc2UsUm93TWFqb3I+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LFVwcGVyfDAsICAgICAgIFNjYWxhcixDb25qLCBTY2FsYXIsZmFsc2UsUm93TWFqb3I+OjpydW4pLAotICAgIDAsCi0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsVXBwZXJ8VW5pdERpYWcsU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxDb2xNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsTG93ZXJ8VW5pdERpYWcsU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsTG93ZXJ8VW5pdERpYWcsU2NhbGFyLENvbmosIFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1biksCi0gICAgMCwKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxMb3dlcnxVbml0RGlhZyxTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnxVbml0RGlhZyxTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnxVbml0RGlhZyxTY2FsYXIsQ29uaiwgU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKLSAgICAwCi0gIH07CisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LCBVcHBlciB8IDAsIFNjYWxhciwgZmFsc2UsIFNjYWxhciwgZmFsc2UsIENvbE1ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsIExvd2VyIHwgMCwgU2NhbGFyLCBmYWxzZSwgU2NhbGFyLCBmYWxzZSwgUm93TWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCwgTG93ZXIgfCAwLCBTY2FsYXIsIENvbmosIFNjYWxhciwgZmFsc2UsIFJvd01ham9yPjo6cnVuKSwgMCwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsIExvd2VyIHwgMCwgU2NhbGFyLCBmYWxzZSwgU2NhbGFyLCBmYWxzZSwgQ29sTWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCwgVXBwZXIgfCAwLCBTY2FsYXIsIGZhbHNlLCBTY2FsYXIsIGZhbHNlLCBSb3dNYWpvcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LCBVcHBlciB8IDAsIFNjYWxhciwgQ29uaiwgU2NhbGFyLCBmYWxzZSwgUm93TWFqb3I+OjpydW4pLCAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCwgVXBwZXIgfCBVbml0RGlhZywgU2NhbGFyLCBmYWxzZSwgU2NhbGFyLCBmYWxzZSwgQ29sTWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCwgTG93ZXIgfCBVbml0RGlhZywgU2NhbGFyLCBmYWxzZSwgU2NhbGFyLCBmYWxzZSwgUm93TWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCwgTG93ZXIgfCBVbml0RGlhZywgU2NhbGFyLCBDb25qLCBTY2FsYXIsIGZhbHNlLCBSb3dNYWpvcj46OnJ1biksCisgICAgICAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCwgTG93ZXIgfCBVbml0RGlhZywgU2NhbGFyLCBmYWxzZSwgU2NhbGFyLCBmYWxzZSwgQ29sTWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCwgVXBwZXIgfCBVbml0RGlhZywgU2NhbGFyLCBmYWxzZSwgU2NhbGFyLCBmYWxzZSwgUm93TWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCwgVXBwZXIgfCBVbml0RGlhZywgU2NhbGFyLCBDb25qLCBTY2FsYXIsIGZhbHNlLCBSb3dNYWpvcj46OnJ1biksCisgICAgICAwfTsKIAotICBjb25zdCBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhKTsKLSAgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYik7CisgIGNvbnN0IFNjYWxhciAqYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBhKTsKKyAgU2NhbGFyICpiID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocGIpOwogCiAgIGludCBpbmZvID0gMDsKLSAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKLSAgZWxzZSBpZihPUCgqb3BhKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKLSAgZWxzZSBpZihESUFHKCpkaWFnKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKLSAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKLSAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNjsKLSAgZWxzZSBpZigqaW5jYj09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gODsKLSAgaWYoaW5mbykKLSAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlRSTVYgIiwmaW5mbyw2KTsKKyAgaWYgKFVQTE8oKnVwbG8pID09IElOVkFMSUQpCisgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYgKE9QKCpvcGEpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYgKERJQUcoKmRpYWcpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYgKCpuIDwgMCkKKyAgICBpbmZvID0gNDsKKyAgZWxzZSBpZiAoKmxkYSA8IHN0ZDo6bWF4KDEsICpuKSkKKyAgICBpbmZvID0gNjsKKyAgZWxzZSBpZiAoKmluY2IgPT0gMCkKKyAgICBpbmZvID0gODsKKyAgaWYgKGluZm8pIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAgIlRSTVYgIiwgJmluZm8sIDYpOwogCi0gIGlmKCpuPT0wKQotICAgIHJldHVybiAxOworICBpZiAoKm4gPT0gMCkgcmV0dXJuIDE7CiAKLSAgU2NhbGFyKiBhY3R1YWxfYiA9IGdldF9jb21wYWN0X3ZlY3RvcihiLCpuLCppbmNiKTsKLSAgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IHJlcygqbik7CisgIFNjYWxhciAqYWN0dWFsX2IgPSBnZXRfY29tcGFjdF92ZWN0b3IoYiwgKm4sICppbmNiKTsKKyAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gcmVzKCpuKTsKICAgcmVzLnNldFplcm8oKTsKIAogICBpbnQgY29kZSA9IE9QKCpvcGEpIHwgKFVQTE8oKnVwbG8pIDw8IDIpIHwgKERJQUcoKmRpYWcpIDw8IDMpOwotICBpZihjb2RlPj0xNiB8fCBmdW5jW2NvZGVdPT0wKQotICAgIHJldHVybiAwOworICBpZiAoY29kZSA+PSAxNiB8fCBmdW5jW2NvZGVdID09IDApIHJldHVybiAwOwogCiAgIGZ1bmNbY29kZV0oKm4sICpuLCBhLCAqbGRhLCBhY3R1YWxfYiwgMSwgcmVzLmRhdGEoKSwgMSwgU2NhbGFyKDEpKTsKIAotICBjb3B5X2JhY2socmVzLmRhdGEoKSxiLCpuLCppbmNiKTsKLSAgaWYoYWN0dWFsX2IhPWIpIGRlbGV0ZVtdIGFjdHVhbF9iOworICBjb3B5X2JhY2socmVzLmRhdGEoKSwgYiwgKm4sICppbmNiKTsKKyAgaWYgKGFjdHVhbF9iICE9IGIpIGRlbGV0ZVtdIGFjdHVhbF9iOwogCiAgIHJldHVybiAxOwogfQogCiAvKiogIEdCTVYgIHBlcmZvcm1zIG9uZSBvZiB0aGUgbWF0cml4LXZlY3RvciBvcGVyYXRpb25zCi0gICoKLSAgKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksICAgb3IgICB5IDo9IGFscGhhKkEnKnggKyBiZXRhKnksCi0gICoKLSAgKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIHZlY3RvcnMgYW5kIEEgaXMgYW4KLSAgKiAgbSBieSBuIGJhbmQgbWF0cml4LCB3aXRoIGtsIHN1Yi1kaWFnb25hbHMgYW5kIGt1IHN1cGVyLWRpYWdvbmFscy4KLSAgKi8KKyAqCisgKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksICAgb3IgICB5IDo9IGFscGhhKkEnKnggKyBiZXRhKnksCisgKgorICogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSB2ZWN0b3JzIGFuZCBBIGlzIGFuCisgKiAgbSBieSBuIGJhbmQgbWF0cml4LCB3aXRoIGtsIHN1Yi1kaWFnb25hbHMgYW5kIGt1IHN1cGVyLWRpYWdvbmFscy4KKyAqLwogaW50IEVJR0VOX0JMQVNfRlVOQyhnYm12KShjaGFyICp0cmFucywgaW50ICptLCBpbnQgKm4sIGludCAqa2wsIGludCAqa3UsIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcGEsIGludCAqbGRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpwYmV0YSwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSkKLXsKLSAgY29uc3QgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYSk7Ci0gIGNvbnN0IFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocHgpOwotICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKLSAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKLSAgU2NhbGFyIGJldGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYmV0YSk7Ci0gIGludCBjb2VmZl9yb3dzID0gKmtsKyprdSsxOworICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpwYmV0YSwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSkgeworICBjb25zdCBTY2FsYXIgKmEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYSk7CisgIGNvbnN0IFNjYWxhciAqeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHB4KTsKKyAgU2NhbGFyICp5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHkpOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGFscGhhKTsKKyAgU2NhbGFyIGJldGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGJldGEpOworICBpbnQgY29lZmZfcm93cyA9ICprbCArICprdSArIDE7CiAKICAgaW50IGluZm8gPSAwOwotICAgICAgIGlmKE9QKCp0cmFucyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOwotICBlbHNlIGlmKCptPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOwotICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOwotICBlbHNlIGlmKCprbDwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA0OwotICBlbHNlIGlmKCprdTwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OwotICBlbHNlIGlmKCpsZGE8Y29lZmZfcm93cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA4OwotICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxMDsKLSAgZWxzZSBpZigqaW5jeT09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTM7Ci0gIGlmKGluZm8pCi0gICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJHQk1WICIsJmluZm8sNik7CisgIGlmIChPUCgqdHJhbnMpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYgKCptIDwgMCkKKyAgICBpbmZvID0gMjsKKyAgZWxzZSBpZiAoKm4gPCAwKQorICAgIGluZm8gPSAzOworICBlbHNlIGlmICgqa2wgPCAwKQorICAgIGluZm8gPSA0OworICBlbHNlIGlmICgqa3UgPCAwKQorICAgIGluZm8gPSA1OworICBlbHNlIGlmICgqbGRhIDwgY29lZmZfcm93cykKKyAgICBpbmZvID0gODsKKyAgZWxzZSBpZiAoKmluY3ggPT0gMCkKKyAgICBpbmZvID0gMTA7CisgIGVsc2UgaWYgKCppbmN5ID09IDApCisgICAgaW5mbyA9IDEzOworICBpZiAoaW5mbykgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCAiR0JNViAiLCAmaW5mbywgNik7CiAKLSAgaWYoKm09PTAgfHwgKm49PTAgfHwgKGFscGhhPT1TY2FsYXIoMCkgJiYgYmV0YT09U2NhbGFyKDEpKSkKLSAgICByZXR1cm4gMDsKKyAgaWYgKCptID09IDAgfHwgKm4gPT0gMCB8fCAoYWxwaGEgPT0gU2NhbGFyKDApICYmIGJldGEgPT0gU2NhbGFyKDEpKSkgcmV0dXJuIDA7CiAKICAgaW50IGFjdHVhbF9tID0gKm07CiAgIGludCBhY3R1YWxfbiA9ICpuOwotICBpZihPUCgqdHJhbnMpIT1OT1RSKQotICAgIHN0ZDo6c3dhcChhY3R1YWxfbSxhY3R1YWxfbik7CisgIGlmIChPUCgqdHJhbnMpICE9IE5PVFIpIHN0ZDo6c3dhcChhY3R1YWxfbSwgYWN0dWFsX24pOwogCi0gIGNvbnN0IFNjYWxhciogYWN0dWFsX3ggPSBnZXRfY29tcGFjdF92ZWN0b3IoeCxhY3R1YWxfbiwqaW5jeCk7Ci0gIFNjYWxhciogYWN0dWFsX3kgPSBnZXRfY29tcGFjdF92ZWN0b3IoeSxhY3R1YWxfbSwqaW5jeSk7CisgIGNvbnN0IFNjYWxhciAqYWN0dWFsX3ggPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwgYWN0dWFsX24sICppbmN4KTsKKyAgU2NhbGFyICphY3R1YWxfeSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCBhY3R1YWxfbSwgKmluY3kpOwogCi0gIGlmKGJldGEhPVNjYWxhcigxKSkKLSAgewotICAgIGlmKGJldGE9PVNjYWxhcigwKSkgbWFrZV92ZWN0b3IoYWN0dWFsX3ksIGFjdHVhbF9tKS5zZXRaZXJvKCk7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICBtYWtlX3ZlY3RvcihhY3R1YWxfeSwgYWN0dWFsX20pICo9IGJldGE7CisgIGlmIChiZXRhICE9IFNjYWxhcigxKSkgeworICAgIGlmIChiZXRhID09IFNjYWxhcigwKSkKKyAgICAgIG1ha2VfdmVjdG9yKGFjdHVhbF95LCBhY3R1YWxfbSkuc2V0WmVybygpOworICAgIGVsc2UKKyAgICAgIG1ha2VfdmVjdG9yKGFjdHVhbF95LCBhY3R1YWxfbSkgKj0gYmV0YTsKICAgfQogCi0gIENvbnN0TWF0cml4VHlwZSBtYXRfY29lZmZzKGEsY29lZmZfcm93cywqbiwqbGRhKTsKKyAgQ29uc3RNYXRyaXhUeXBlIG1hdF9jb2VmZnMoYSwgY29lZmZfcm93cywgKm4sICpsZGEpOwogCi0gIGludCBuYiA9IHN0ZDo6bWluKCpuLCgqbSkrKCprdSkpOwotICBmb3IoaW50IGo9MDsgajxuYjsgKytqKQotICB7Ci0gICAgaW50IHN0YXJ0ID0gc3RkOjptYXgoMCxqIC0gKmt1KTsKLSAgICBpbnQgZW5kID0gc3RkOjptaW4oKCptKS0xLGogKyAqa2wpOworICBpbnQgbmIgPSBzdGQ6Om1pbigqbiwgKCptKSArICgqa3UpKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBuYjsgKytqKSB7CisgICAgaW50IHN0YXJ0ID0gc3RkOjptYXgoMCwgaiAtICprdSk7CisgICAgaW50IGVuZCA9IHN0ZDo6bWluKCgqbSkgLSAxLCBqICsgKmtsKTsKICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQgKyAxOwogICAgIGludCBvZmZzZXQgPSAoKmt1KSAtIGogKyBzdGFydDsKLSAgICBpZihPUCgqdHJhbnMpPT1OT1RSKQotICAgICAgbWFrZV92ZWN0b3IoYWN0dWFsX3krc3RhcnQsbGVuKSArPSAoYWxwaGEqYWN0dWFsX3hbal0pICogbWF0X2NvZWZmcy5jb2woaikuc2VnbWVudChvZmZzZXQsbGVuKTsKLSAgICBlbHNlIGlmKE9QKCp0cmFucyk9PVRSKQotICAgICAgYWN0dWFsX3lbal0gKz0gYWxwaGEgKiAoIG1hdF9jb2VmZnMuY29sKGopLnNlZ21lbnQob2Zmc2V0LGxlbikudHJhbnNwb3NlKCkgKiBtYWtlX3ZlY3RvcihhY3R1YWxfeCtzdGFydCxsZW4pICkudmFsdWUoKTsKKyAgICBpZiAoT1AoKnRyYW5zKSA9PSBOT1RSKQorICAgICAgbWFrZV92ZWN0b3IoYWN0dWFsX3kgKyBzdGFydCwgbGVuKSArPSAoYWxwaGEgKiBhY3R1YWxfeFtqXSkgKiBtYXRfY29lZmZzLmNvbChqKS5zZWdtZW50KG9mZnNldCwgbGVuKTsKKyAgICBlbHNlIGlmIChPUCgqdHJhbnMpID09IFRSKQorICAgICAgYWN0dWFsX3lbal0gKz0KKyAgICAgICAgICBhbHBoYSAqIChtYXRfY29lZmZzLmNvbChqKS5zZWdtZW50KG9mZnNldCwgbGVuKS50cmFuc3Bvc2UoKSAqIG1ha2VfdmVjdG9yKGFjdHVhbF94ICsgc3RhcnQsIGxlbikpLnZhbHVlKCk7CiAgICAgZWxzZQotICAgICAgYWN0dWFsX3lbal0gKz0gYWxwaGEgKiAoIG1hdF9jb2VmZnMuY29sKGopLnNlZ21lbnQob2Zmc2V0LGxlbikuYWRqb2ludCgpICAgKiBtYWtlX3ZlY3RvcihhY3R1YWxfeCtzdGFydCxsZW4pICkudmFsdWUoKTsKKyAgICAgIGFjdHVhbF95W2pdICs9CisgICAgICAgICAgYWxwaGEgKiAobWF0X2NvZWZmcy5jb2woaikuc2VnbWVudChvZmZzZXQsIGxlbikuYWRqb2ludCgpICogbWFrZV92ZWN0b3IoYWN0dWFsX3ggKyBzdGFydCwgbGVuKSkudmFsdWUoKTsKICAgfQogCi0gIGlmKGFjdHVhbF94IT14KSBkZWxldGVbXSBhY3R1YWxfeDsKLSAgaWYoYWN0dWFsX3khPXkpIGRlbGV0ZVtdIGNvcHlfYmFjayhhY3R1YWxfeSx5LGFjdHVhbF9tLCppbmN5KTsKKyAgaWYgKGFjdHVhbF94ICE9IHgpIGRlbGV0ZVtdIGFjdHVhbF94OworICBpZiAoYWN0dWFsX3kgIT0geSkgZGVsZXRlW10gY29weV9iYWNrKGFjdHVhbF95LCB5LCBhY3R1YWxfbSwgKmluY3kpOwogCiAgIHJldHVybiAwOwogfQpAQCAtMzM3LDIxNyArMzQwLDIzMSBAQAogI2VuZGlmCiAKIC8qKiAgRFRCU1YgIHNvbHZlcyBvbmUgb2YgdGhlIHN5c3RlbXMgb2YgZXF1YXRpb25zCi0gICoKLSAgKiAgICAgQSp4ID0gYiwgICBvciAgIEEnKnggPSBiLAotICAqCi0gICogIHdoZXJlIGIgYW5kIHggYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCBBIGlzIGFuIG4gYnkgbiB1bml0LCBvcgotICAqICBub24tdW5pdCwgdXBwZXIgb3IgbG93ZXIgdHJpYW5ndWxhciBiYW5kIG1hdHJpeCwgd2l0aCAoIGsgKyAxICkKLSAgKiAgZGlhZ29uYWxzLgotICAqCi0gICogIE5vIHRlc3QgZm9yIHNpbmd1bGFyaXR5IG9yIG5lYXItc2luZ3VsYXJpdHkgaXMgaW5jbHVkZWQgaW4gdGhpcwotICAqICByb3V0aW5lLiBTdWNoIHRlc3RzIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KLSAgKi8KLWludCBFSUdFTl9CTEFTX0ZVTkModGJzdikoY2hhciAqdXBsbywgY2hhciAqb3AsIGNoYXIgKmRpYWcsIGludCAqbiwgaW50ICprLCBSZWFsU2NhbGFyICpwYSwgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpCi17CisgKgorICogICAgIEEqeCA9IGIsICAgb3IgICBBJyp4ID0gYiwKKyAqCisgKiAgd2hlcmUgYiBhbmQgeCBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kIEEgaXMgYW4gbiBieSBuIHVuaXQsIG9yCisgKiAgbm9uLXVuaXQsIHVwcGVyIG9yIGxvd2VyIHRyaWFuZ3VsYXIgYmFuZCBtYXRyaXgsIHdpdGggKCBrICsgMSApCisgKiAgZGlhZ29uYWxzLgorICoKKyAqICBObyB0ZXN0IGZvciBzaW5ndWxhcml0eSBvciBuZWFyLXNpbmd1bGFyaXR5IGlzIGluY2x1ZGVkIGluIHRoaXMKKyAqICByb3V0aW5lLiBTdWNoIHRlc3RzIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAqLworaW50IEVJR0VOX0JMQVNfRlVOQyh0YnN2KShjaGFyICp1cGxvLCBjaGFyICpvcCwgY2hhciAqZGlhZywgaW50ICpuLCBpbnQgKmssIFJlYWxTY2FsYXIgKnBhLCBpbnQgKmxkYSwgUmVhbFNjYWxhciAqcHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5jeCkgewogICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBpbnQsIGNvbnN0IFNjYWxhciAqLCBpbnQsIFNjYWxhciAqKTsKICAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMTZdID0gewotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQotICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCxVcHBlcnwwLCAgICAgICBTY2FsYXIsZmFsc2UsU2NhbGFyLENvbE1ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKLSAgICAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsTG93ZXJ8MCwgICAgICAgU2NhbGFyLGZhbHNlLFNjYWxhcixSb3dNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpCi0gICAgKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LExvd2VyfDAsICAgICAgIFNjYWxhcixDb25qLCBTY2FsYXIsUm93TWFqb3I+OjpydW4pLAotICAgIDAsCi0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpCi0gICAgKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LExvd2VyfDAsICAgICAgIFNjYWxhcixmYWxzZSxTY2FsYXIsQ29sTWFqb3I+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQotICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCxVcHBlcnwwLCAgICAgICBTY2FsYXIsZmFsc2UsU2NhbGFyLFJvd01ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMykKLSAgICAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsVXBwZXJ8MCwgICAgICAgU2NhbGFyLENvbmosIFNjYWxhcixSb3dNYWpvcj46OnJ1biksCi0gICAgMCwKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKLSAgICAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsVXBwZXJ8VW5pdERpYWcsU2NhbGFyLGZhbHNlLFNjYWxhcixDb2xNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCi0gICAgKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LExvd2VyfFVuaXREaWFnLFNjYWxhcixmYWxzZSxTY2FsYXIsUm93TWFqb3I+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQotICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCxMb3dlcnxVbml0RGlhZyxTY2FsYXIsQ29uaiwgU2NhbGFyLFJvd01ham9yPjo6cnVuKSwKLSAgICAwLAotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKQotICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCxMb3dlcnxVbml0RGlhZyxTY2FsYXIsZmFsc2UsU2NhbGFyLENvbE1ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKLSAgICAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsVXBwZXJ8VW5pdERpYWcsU2NhbGFyLGZhbHNlLFNjYWxhcixSb3dNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCi0gICAgKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LFVwcGVyfFVuaXREaWFnLFNjYWxhcixDb25qLCBTY2FsYXIsUm93TWFqb3I+OjpydW4pLAotICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCwgVXBwZXIgfCAwLCBTY2FsYXIsIGZhbHNlLCBTY2FsYXIsIENvbE1ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LCBMb3dlciB8IDAsIFNjYWxhciwgZmFsc2UsIFNjYWxhciwgUm93TWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsIExvd2VyIHwgMCwgU2NhbGFyLCBDb25qLCBTY2FsYXIsIFJvd01ham9yPjo6cnVuKSwKKyAgICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCwgTG93ZXIgfCAwLCBTY2FsYXIsIGZhbHNlLCBTY2FsYXIsIENvbE1ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjpiYW5kX3NvbHZlX3RyaWFuZ3VsYXJfc2VsZWN0b3I8aW50LCBVcHBlciB8IDAsIFNjYWxhciwgZmFsc2UsIFNjYWxhciwgUm93TWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OmJhbmRfc29sdmVfdHJpYW5ndWxhcl9zZWxlY3RvcjxpbnQsIFVwcGVyIHwgMCwgU2NhbGFyLCBDb25qLCBTY2FsYXIsIFJvd01ham9yPjo6cnVuKSwKKyAgICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCwgVXBwZXIgfCBVbml0RGlhZywgU2NhbGFyLCBmYWxzZSwgU2NhbGFyLCBDb2xNYWpvcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCwgTG93ZXIgfCBVbml0RGlhZywgU2NhbGFyLCBmYWxzZSwgU2NhbGFyLCBSb3dNYWpvcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCwgTG93ZXIgfCBVbml0RGlhZywgU2NhbGFyLCBDb25qLCBTY2FsYXIsIFJvd01ham9yPjo6cnVuKSwKKyAgICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCwgTG93ZXIgfCBVbml0RGlhZywgU2NhbGFyLCBmYWxzZSwgU2NhbGFyLCBDb2xNYWpvcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCwgVXBwZXIgfCBVbml0RGlhZywgU2NhbGFyLCBmYWxzZSwgU2NhbGFyLCBSb3dNYWpvcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6YmFuZF9zb2x2ZV90cmlhbmd1bGFyX3NlbGVjdG9yPGludCwgVXBwZXIgfCBVbml0RGlhZywgU2NhbGFyLCBDb25qLCBTY2FsYXIsIFJvd01ham9yPjo6cnVuKSwKKyAgICAgIDAsCiAgIH07CiAKLSAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7Ci0gIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOwotICBpbnQgY29lZmZfcm93cyA9ICprKzE7CisgIFNjYWxhciAqYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBhKTsKKyAgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHgpOworICBpbnQgY29lZmZfcm93cyA9ICprICsgMTsKIAogICBpbnQgaW5mbyA9IDA7Ci0gICAgICAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7Ci0gIGVsc2UgaWYoT1AoKm9wKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7Ci0gIGVsc2UgaWYoRElBRygqZGlhZyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7Ci0gIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7Ci0gIGVsc2UgaWYoKms8MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7Ci0gIGVsc2UgaWYoKmxkYTxjb2VmZl9yb3dzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7Ci0gIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDk7Ci0gIGlmKGluZm8pCi0gICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJUQlNWICIsJmluZm8sNik7CisgIGlmIChVUExPKCp1cGxvKSA9PSBJTlZBTElEKQorICAgIGluZm8gPSAxOworICBlbHNlIGlmIChPUCgqb3ApID09IElOVkFMSUQpCisgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYgKERJQUcoKmRpYWcpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYgKCpuIDwgMCkKKyAgICBpbmZvID0gNDsKKyAgZWxzZSBpZiAoKmsgPCAwKQorICAgIGluZm8gPSA1OworICBlbHNlIGlmICgqbGRhIDwgY29lZmZfcm93cykKKyAgICBpbmZvID0gNzsKKyAgZWxzZSBpZiAoKmluY3ggPT0gMCkKKyAgICBpbmZvID0gOTsKKyAgaWYgKGluZm8pIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAgIlRCU1YgIiwgJmluZm8sIDYpOwogCi0gIGlmKCpuPT0wIHx8ICgqaz09MCAmJiBESUFHKCpkaWFnKT09VU5JVCkpCi0gICAgcmV0dXJuIDA7CisgIGlmICgqbiA9PSAwIHx8ICgqayA9PSAwICYmIERJQUcoKmRpYWcpID09IFVOSVQpKSByZXR1cm4gMDsKIAogICBpbnQgYWN0dWFsX24gPSAqbjsKIAotICBTY2FsYXIqIGFjdHVhbF94ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsYWN0dWFsX24sKmluY3gpOworICBTY2FsYXIgKmFjdHVhbF94ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsIGFjdHVhbF9uLCAqaW5jeCk7CiAKICAgaW50IGNvZGUgPSBPUCgqb3ApIHwgKFVQTE8oKnVwbG8pIDw8IDIpIHwgKERJQUcoKmRpYWcpIDw8IDMpOwotICBpZihjb2RlPj0xNiB8fCBmdW5jW2NvZGVdPT0wKQotICAgIHJldHVybiAwOworICBpZiAoY29kZSA+PSAxNiB8fCBmdW5jW2NvZGVdID09IDApIHJldHVybiAwOwogCiAgIGZ1bmNbY29kZV0oKm4sICprLCBhLCAqbGRhLCBhY3R1YWxfeCk7CiAKLSAgaWYoYWN0dWFsX3ghPXgpIGRlbGV0ZVtdIGNvcHlfYmFjayhhY3R1YWxfeCx4LGFjdHVhbF9uLCppbmN4KTsKKyAgaWYgKGFjdHVhbF94ICE9IHgpIGRlbGV0ZVtdIGNvcHlfYmFjayhhY3R1YWxfeCwgeCwgYWN0dWFsX24sICppbmN4KTsKIAogICByZXR1cm4gMDsKIH0KIAogLyoqICBEVFBNViAgcGVyZm9ybXMgb25lIG9mIHRoZSBtYXRyaXgtdmVjdG9yIG9wZXJhdGlvbnMKLSAgKgotICAqICAgICB4IDo9IEEqeCwgICBvciAgIHggOj0gQScqeCwKLSAgKgotICAqICB3aGVyZSB4IGlzIGFuIG4gZWxlbWVudCB2ZWN0b3IgYW5kICBBIGlzIGFuIG4gYnkgbiB1bml0LCBvciBub24tdW5pdCwKLSAgKiAgdXBwZXIgb3IgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgotICAqLwotaW50IEVJR0VOX0JMQVNfRlVOQyh0cG12KShjaGFyICp1cGxvLCBjaGFyICpvcGEsIGNoYXIgKmRpYWcsIGludCAqbiwgUmVhbFNjYWxhciAqcGFwLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4KQotewotICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBjb25zdCBTY2FsYXIqLCBjb25zdCBTY2FsYXIqLCBTY2FsYXIqLCBTY2FsYXIpOworICoKKyAqICAgICB4IDo9IEEqeCwgICBvciAgIHggOj0gQScqeCwKKyAqCisgKiAgd2hlcmUgeCBpcyBhbiBuIGVsZW1lbnQgdmVjdG9yIGFuZCAgQSBpcyBhbiBuIGJ5IG4gdW5pdCwgb3Igbm9uLXVuaXQsCisgKiAgdXBwZXIgb3IgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgorICovCitpbnQgRUlHRU5fQkxBU19GVU5DKHRwbXYpKGNoYXIgKnVwbG8sIGNoYXIgKm9wYSwgY2hhciAqZGlhZywgaW50ICpuLCBSZWFsU2NhbGFyICpwYXAsIFJlYWxTY2FsYXIgKnB4LCBpbnQgKmluY3gpIHsKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKGludCwgY29uc3QgU2NhbGFyICosIGNvbnN0IFNjYWxhciAqLCBTY2FsYXIgKiwgU2NhbGFyKTsKICAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMTZdID0gewotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQotICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnwwLCAgICAgICBTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKLSAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsTG93ZXJ8MCwgICAgICAgU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpCi0gICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LExvd2VyfDAsICAgICAgIFNjYWxhcixDb25qLCBTY2FsYXIsZmFsc2UsUm93TWFqb3I+OjpydW4pLAotICAgIDAsCi0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpCi0gICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LExvd2VyfDAsICAgICAgIFNjYWxhcixmYWxzZSxTY2FsYXIsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQotICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxVcHBlcnwwLCAgICAgICBTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMykKLSAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsVXBwZXJ8MCwgICAgICAgU2NhbGFyLENvbmosIFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1biksCi0gICAgMCwKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKLSAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsVXBwZXJ8VW5pdERpYWcsU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxDb2xNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCi0gICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LExvd2VyfFVuaXREaWFnLFNjYWxhcixmYWxzZSxTY2FsYXIsZmFsc2UsUm93TWFqb3I+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQotICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxMb3dlcnxVbml0RGlhZyxTY2FsYXIsQ29uaiwgU2NhbGFyLGZhbHNlLFJvd01ham9yPjo6cnVuKSwKLSAgICAwLAotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKQotICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCxMb3dlcnxVbml0RGlhZyxTY2FsYXIsZmFsc2UsU2NhbGFyLGZhbHNlLENvbE1ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKLSAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsVXBwZXJ8VW5pdERpYWcsU2NhbGFyLGZhbHNlLFNjYWxhcixmYWxzZSxSb3dNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCi0gICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LFVwcGVyfFVuaXREaWFnLFNjYWxhcixDb25qLCBTY2FsYXIsZmFsc2UsUm93TWFqb3I+OjpydW4pLAotICAgIDAKLSAgfTsKKyAgICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LCBVcHBlciB8IDAsIFNjYWxhciwgZmFsc2UsIFNjYWxhciwgZmFsc2UsIENvbE1ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LCBMb3dlciB8IDAsIFNjYWxhciwgZmFsc2UsIFNjYWxhciwgZmFsc2UsIFJvd01ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LCBMb3dlciB8IDAsIFNjYWxhciwgQ29uaiwgU2NhbGFyLCBmYWxzZSwgUm93TWFqb3I+OjpydW4pLAorICAgICAgMCwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LCBMb3dlciB8IDAsIFNjYWxhciwgZmFsc2UsIFNjYWxhciwgZmFsc2UsIENvbE1ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LCBVcHBlciB8IDAsIFNjYWxhciwgZmFsc2UsIFNjYWxhciwgZmFsc2UsIFJvd01ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LCBVcHBlciB8IDAsIFNjYWxhciwgQ29uaiwgU2NhbGFyLCBmYWxzZSwgUm93TWFqb3I+OjpydW4pLAorICAgICAgMCwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LCBVcHBlciB8IFVuaXREaWFnLCBTY2FsYXIsIGZhbHNlLCBTY2FsYXIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFVQIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsIExvd2VyIHwgVW5pdERpYWcsIFNjYWxhciwgZmFsc2UsIFNjYWxhciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dNYWpvcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCwgTG93ZXIgfCBVbml0RGlhZywgU2NhbGFyLCBDb25qLCBTY2FsYXIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93TWFqb3I+OjpydW4pLAorICAgICAgMCwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKSB8IChVTklUICA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8aW50LCBMb3dlciB8IFVuaXREaWFnLCBTY2FsYXIsIGZhbHNlLCBTY2FsYXIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX21hdHJpeF92ZWN0b3JfcHJvZHVjdDxpbnQsIFVwcGVyIHwgVW5pdERpYWcsIFNjYWxhciwgZmFsc2UsIFNjYWxhciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dNYWpvcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikgfCAoVU5JVCAgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PGludCwgVXBwZXIgfCBVbml0RGlhZywgU2NhbGFyLCBDb25qLCBTY2FsYXIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93TWFqb3I+OjpydW4pLAorICAgICAgMH07CiAKLSAgU2NhbGFyKiBhcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFwKTsKLSAgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihweCk7CisgIFNjYWxhciAqYXAgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYXApOworICBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweCk7CiAKICAgaW50IGluZm8gPSAwOwotICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOwotICBlbHNlIGlmKE9QKCpvcGEpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOwotICBlbHNlIGlmKERJQUcoKmRpYWcpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOwotICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA0OwotICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA3OwotICBpZihpbmZvKQotICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiVFBNViAiLCZpbmZvLDYpOworICBpZiAoVVBMTygqdXBsbykgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMTsKKyAgZWxzZSBpZiAoT1AoKm9wYSkgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMjsKKyAgZWxzZSBpZiAoRElBRygqZGlhZykgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMzsKKyAgZWxzZSBpZiAoKm4gPCAwKQorICAgIGluZm8gPSA0OworICBlbHNlIGlmICgqaW5jeCA9PSAwKQorICAgIGluZm8gPSA3OworICBpZiAoaW5mbykgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCAiVFBNViAiLCAmaW5mbywgNik7CiAKLSAgaWYoKm49PTApCi0gICAgcmV0dXJuIDE7CisgIGlmICgqbiA9PSAwKSByZXR1cm4gMTsKIAotICBTY2FsYXIqIGFjdHVhbF94ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsKm4sKmluY3gpOwotICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gcmVzKCpuKTsKKyAgU2NhbGFyICphY3R1YWxfeCA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbiwgKmluY3gpOworICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiByZXMoKm4pOwogICByZXMuc2V0WmVybygpOwogCiAgIGludCBjb2RlID0gT1AoKm9wYSkgfCAoVVBMTygqdXBsbykgPDwgMikgfCAoRElBRygqZGlhZykgPDwgMyk7Ci0gIGlmKGNvZGU+PTE2IHx8IGZ1bmNbY29kZV09PTApCi0gICAgcmV0dXJuIDA7CisgIGlmIChjb2RlID49IDE2IHx8IGZ1bmNbY29kZV0gPT0gMCkgcmV0dXJuIDA7CiAKICAgZnVuY1tjb2RlXSgqbiwgYXAsIGFjdHVhbF94LCByZXMuZGF0YSgpLCBTY2FsYXIoMSkpOwogCi0gIGNvcHlfYmFjayhyZXMuZGF0YSgpLHgsKm4sKmluY3gpOwotICBpZihhY3R1YWxfeCE9eCkgZGVsZXRlW10gYWN0dWFsX3g7CisgIGNvcHlfYmFjayhyZXMuZGF0YSgpLCB4LCAqbiwgKmluY3gpOworICBpZiAoYWN0dWFsX3ggIT0geCkgZGVsZXRlW10gYWN0dWFsX3g7CiAKICAgcmV0dXJuIDE7CiB9CiAKIC8qKiAgRFRQU1YgIHNvbHZlcyBvbmUgb2YgdGhlIHN5c3RlbXMgb2YgZXF1YXRpb25zCi0gICoKLSAgKiAgICAgQSp4ID0gYiwgICBvciAgIEEnKnggPSBiLAotICAqCi0gICogIHdoZXJlIGIgYW5kIHggYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCBBIGlzIGFuIG4gYnkgbiB1bml0LCBvcgotICAqICBub24tdW5pdCwgdXBwZXIgb3IgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgotICAqCi0gICogIE5vIHRlc3QgZm9yIHNpbmd1bGFyaXR5IG9yIG5lYXItc2luZ3VsYXJpdHkgaXMgaW5jbHVkZWQgaW4gdGhpcwotICAqICByb3V0aW5lLiBTdWNoIHRlc3RzIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KLSAgKi8KLWludCBFSUdFTl9CTEFTX0ZVTkModHBzdikoY2hhciAqdXBsbywgY2hhciAqb3BhLCBjaGFyICpkaWFnLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhcCwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkKLXsKLSAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKGludCwgY29uc3QgU2NhbGFyKiwgU2NhbGFyKik7CisgKgorICogICAgIEEqeCA9IGIsICAgb3IgICBBJyp4ID0gYiwKKyAqCisgKiAgd2hlcmUgYiBhbmQgeCBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kIEEgaXMgYW4gbiBieSBuIHVuaXQsIG9yCisgKiAgbm9uLXVuaXQsIHVwcGVyIG9yIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyAqCisgKiAgTm8gdGVzdCBmb3Igc2luZ3VsYXJpdHkgb3IgbmVhci1zaW5ndWxhcml0eSBpcyBpbmNsdWRlZCBpbiB0aGlzCisgKiAgcm91dGluZS4gU3VjaCB0ZXN0cyBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkModHBzdikoY2hhciAqdXBsbywgY2hhciAqb3BhLCBjaGFyICpkaWFnLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhcCwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCkgeworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBjb25zdCBTY2FsYXIgKiwgU2NhbGFyICopOwogICBzdGF0aWMgY29uc3QgZnVuY3R5cGUgZnVuY1sxNl0gPSB7Ci0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpCi0gICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBVcHBlcnwwLCAgICAgICBmYWxzZSxDb2xNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpCi0gICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBMb3dlcnwwLCAgICAgICBmYWxzZSxSb3dNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpCi0gICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBMb3dlcnwwLCAgICAgICBDb25qLCBSb3dNYWpvcj46OnJ1biksCi0gICAgMCwKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMykKLSAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIExvd2VyfDAsICAgICAgIGZhbHNlLENvbE1ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMykKLSAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIFVwcGVyfDAsICAgICAgIGZhbHNlLFJvd01ham9yPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMykKLSAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsU2NhbGFyLGludCxPblRoZUxlZnQsIFVwcGVyfDAsICAgICAgIENvbmosIFJvd01ham9yPjo6cnVuKSwKLSAgICAwLAotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQotICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgVXBwZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3I+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQotICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgTG93ZXJ8VW5pdERpYWcsZmFsc2UsUm93TWFqb3I+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQotICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhcixTY2FsYXIsaW50LE9uVGhlTGVmdCwgTG93ZXJ8VW5pdERpYWcsQ29uaiwgUm93TWFqb3I+OjpydW4pLAotICAgIDAsCi0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCi0gICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBMb3dlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCi0gICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBVcHBlcnxVbml0RGlhZyxmYWxzZSxSb3dNYWpvcj46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCi0gICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLFNjYWxhcixpbnQsT25UaGVMZWZ0LCBVcHBlcnxVbml0RGlhZyxDb25qLCBSb3dNYWpvcj46OnJ1biksCi0gICAgMAotICB9OworICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFVQIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsIFNjYWxhciwgaW50LCBPblRoZUxlZnQsIFVwcGVyIHwgMCwgZmFsc2UsIENvbE1ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChVUCA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLCBTY2FsYXIsIGludCwgT25UaGVMZWZ0LCBMb3dlciB8IDAsIGZhbHNlLCBSb3dNYWpvcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhciwgU2NhbGFyLCBpbnQsIE9uVGhlTGVmdCwgTG93ZXIgfCAwLCBDb25qLCBSb3dNYWpvcj46OnJ1biksIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTE8gPDwgMikgfCAoTlVOSVQgPDwgMykKKyAgICAgIChpbnRlcm5hbDo6cGFja2VkX3RyaWFuZ3VsYXJfc29sdmVfdmVjdG9yPFNjYWxhciwgU2NhbGFyLCBpbnQsIE9uVGhlTGVmdCwgTG93ZXIgfCAwLCBmYWxzZSwgQ29sTWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExPIDw8IDIpIHwgKE5VTklUIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsIFNjYWxhciwgaW50LCBPblRoZUxlZnQsIFVwcGVyIHwgMCwgZmFsc2UsIFJvd01ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMTyA8PCAyKSB8IChOVU5JVCA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLCBTY2FsYXIsIGludCwgT25UaGVMZWZ0LCBVcHBlciB8IDAsIENvbmosIFJvd01ham9yPjo6cnVuKSwgMCwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLCBTY2FsYXIsIGludCwgT25UaGVMZWZ0LCBVcHBlciB8IFVuaXREaWFnLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbE1ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLCBTY2FsYXIsIGludCwgT25UaGVMZWZ0LCBMb3dlciB8IFVuaXREaWFnLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvd01ham9yPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChVUCA8PCAyKSB8IChVTklUICA8PCAzKQorICAgICAgKGludGVybmFsOjpwYWNrZWRfdHJpYW5ndWxhcl9zb2x2ZV92ZWN0b3I8U2NhbGFyLCBTY2FsYXIsIGludCwgT25UaGVMZWZ0LCBMb3dlciB8IFVuaXREaWFnLCBDb25qLCBSb3dNYWpvcj46OnJ1biksCisgICAgICAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsIFNjYWxhciwgaW50LCBPblRoZUxlZnQsIExvd2VyIHwgVW5pdERpYWcsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsIFNjYWxhciwgaW50LCBPblRoZUxlZnQsIFVwcGVyIHwgVW5pdERpYWcsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93TWFqb3I+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExPIDw8IDIpIHwgKFVOSVQgIDw8IDMpCisgICAgICAoaW50ZXJuYWw6OnBhY2tlZF90cmlhbmd1bGFyX3NvbHZlX3ZlY3RvcjxTY2FsYXIsIFNjYWxhciwgaW50LCBPblRoZUxlZnQsIFVwcGVyIHwgVW5pdERpYWcsIENvbmosIFJvd01ham9yPjo6cnVuKSwKKyAgICAgIDB9OwogCi0gIFNjYWxhciogYXAgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhcCk7Ci0gIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOworICBTY2FsYXIgKmFwID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocGFwKTsKKyAgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHgpOwogCiAgIGludCBpbmZvID0gMDsKLSAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKLSAgZWxzZSBpZihPUCgqb3BhKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKLSAgZWxzZSBpZihESUFHKCpkaWFnKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKLSAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKLSAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKLSAgaWYoaW5mbykKLSAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlRQU1YgIiwmaW5mbyw2KTsKKyAgaWYgKFVQTE8oKnVwbG8pID09IElOVkFMSUQpCisgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYgKE9QKCpvcGEpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYgKERJQUcoKmRpYWcpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYgKCpuIDwgMCkKKyAgICBpbmZvID0gNDsKKyAgZWxzZSBpZiAoKmluY3ggPT0gMCkKKyAgICBpbmZvID0gNzsKKyAgaWYgKGluZm8pIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAgIlRQU1YgIiwgJmluZm8sIDYpOwogCi0gIFNjYWxhciogYWN0dWFsX3ggPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwqbiwqaW5jeCk7CisgIFNjYWxhciAqYWN0dWFsX3ggPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwgKm4sICppbmN4KTsKIAogICBpbnQgY29kZSA9IE9QKCpvcGEpIHwgKFVQTE8oKnVwbG8pIDw8IDIpIHwgKERJQUcoKmRpYWcpIDw8IDMpOwogICBmdW5jW2NvZGVdKCpuLCBhcCwgYWN0dWFsX3gpOwogCi0gIGlmKGFjdHVhbF94IT14KSBkZWxldGVbXSBjb3B5X2JhY2soYWN0dWFsX3gseCwqbiwqaW5jeCk7CisgIGlmIChhY3R1YWxfeCAhPSB4KSBkZWxldGVbXSBjb3B5X2JhY2soYWN0dWFsX3gsIHgsICpuLCAqaW5jeCk7CiAKICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9ibGFzL2xldmVsMl9yZWFsX2ltcGwuaCBiL2JsYXMvbGV2ZWwyX3JlYWxfaW1wbC5oCmluZGV4IDc2MjBmMGEuLjI5ZjVhNTYgMTAwNjQ0Ci0tLSBhL2JsYXMvbGV2ZWwyX3JlYWxfaW1wbC5oCisrKyBiL2JsYXMvbGV2ZWwyX3JlYWxfaW1wbC5oCkBAIC0xMCwyOTcgKzEwLDMwNiBAQAogI2luY2x1ZGUgImNvbW1vbi5oIgogCiAvLyB5ID0gYWxwaGEqQSp4ICsgYmV0YSp5Ci1pbnQgRUlHRU5fQkxBU19GVU5DKHN5bXYpIChjb25zdCBjaGFyICp1cGxvLCBjb25zdCBpbnQgKm4sIGNvbnN0IFJlYWxTY2FsYXIgKnBhbHBoYSwgY29uc3QgUmVhbFNjYWxhciAqcGEsIGNvbnN0IGludCAqbGRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciAqcHgsIGNvbnN0IGludCAqaW5jeCwgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnB5LCBjb25zdCBpbnQgKmluY3kpCi17Ci0gIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIGNvbnN0IFNjYWxhciosIGludCwgY29uc3QgU2NhbGFyKiwgU2NhbGFyKiwgU2NhbGFyKTsKK2ludCBFSUdFTl9CTEFTX0ZVTkMoc3ltdikoY29uc3QgY2hhciAqdXBsbywgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcHgsIGNvbnN0IGludCAqaW5jeCwgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxTY2FsYXIgKnB5LCBjb25zdCBpbnQgKmluY3kpIHsKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKGludCwgY29uc3QgU2NhbGFyICosIGludCwgY29uc3QgU2NhbGFyICosIFNjYWxhciAqLCBTY2FsYXIpOwogICBzdGF0aWMgY29uc3QgZnVuY3R5cGUgZnVuY1syXSA9IHsKLSAgICAvLyBhcnJheSBpbmRleDogVVAKLSAgICAoaW50ZXJuYWw6OnNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdDxTY2FsYXIsaW50LENvbE1ham9yLFVwcGVyLGZhbHNlLGZhbHNlPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogTE8KLSAgICAoaW50ZXJuYWw6OnNlbGZhZGpvaW50X21hdHJpeF92ZWN0b3JfcHJvZHVjdDxTY2FsYXIsaW50LENvbE1ham9yLExvd2VyLGZhbHNlLGZhbHNlPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBVUAorICAgICAgKGludGVybmFsOjpzZWxmYWRqb2ludF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8U2NhbGFyLCBpbnQsIENvbE1ham9yLCBVcHBlciwgZmFsc2UsIGZhbHNlPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBMTworICAgICAgKGludGVybmFsOjpzZWxmYWRqb2ludF9tYXRyaXhfdmVjdG9yX3Byb2R1Y3Q8U2NhbGFyLCBpbnQsIENvbE1ham9yLCBMb3dlciwgZmFsc2UsIGZhbHNlPjo6cnVuKSwKICAgfTsKIAotICBjb25zdCBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhKTsKLSAgY29uc3QgU2NhbGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihweCk7Ci0gIFNjYWxhciogeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHkpOwotICBTY2FsYXIgYWxwaGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKLSAgU2NhbGFyIGJldGEgICA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBiZXRhKTsKKyAgY29uc3QgU2NhbGFyICphID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGEpOworICBjb25zdCBTY2FsYXIgKnggPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihweCk7CisgIFNjYWxhciAqeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHB5KTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBhbHBoYSk7CisgIFNjYWxhciBiZXRhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBiZXRhKTsKIAogICAvLyBjaGVjayBhcmd1bWVudHMKICAgaW50IGluZm8gPSAwOwotICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgIGluZm8gPSAxOwotICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOwotICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwqbikpICAgIGluZm8gPSA1OwotICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgIGluZm8gPSA3OwotICBlbHNlIGlmKCppbmN5PT0wKSAgICAgICAgICAgICAgIGluZm8gPSAxMDsKLSAgaWYoaW5mbykKLSAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlNZTVYgIiwmaW5mbyw2KTsKKyAgaWYgKFVQTE8oKnVwbG8pID09IElOVkFMSUQpCisgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYgKCpuIDwgMCkKKyAgICBpbmZvID0gMjsKKyAgZWxzZSBpZiAoKmxkYSA8IHN0ZDo6bWF4KDEsICpuKSkKKyAgICBpbmZvID0gNTsKKyAgZWxzZSBpZiAoKmluY3ggPT0gMCkKKyAgICBpbmZvID0gNzsKKyAgZWxzZSBpZiAoKmluY3kgPT0gMCkKKyAgICBpbmZvID0gMTA7CisgIGlmIChpbmZvKSByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQICJTWU1WICIsICZpbmZvLCA2KTsKIAotICBpZigqbj09MCkKLSAgICByZXR1cm4gMDsKKyAgaWYgKCpuID09IDApIHJldHVybiAwOwogCi0gIGNvbnN0IFNjYWxhciogYWN0dWFsX3ggPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwqbiwqaW5jeCk7Ci0gIFNjYWxhciogYWN0dWFsX3kgPSBnZXRfY29tcGFjdF92ZWN0b3IoeSwqbiwqaW5jeSk7CisgIGNvbnN0IFNjYWxhciAqYWN0dWFsX3ggPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwgKm4sICppbmN4KTsKKyAgU2NhbGFyICphY3R1YWxfeSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCAqbiwgKmluY3kpOwogCi0gIGlmKGJldGEhPVNjYWxhcigxKSkKLSAgewotICAgIGlmKGJldGE9PVNjYWxhcigwKSkgbWFrZV92ZWN0b3IoYWN0dWFsX3ksICpuKS5zZXRaZXJvKCk7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICBtYWtlX3ZlY3RvcihhY3R1YWxfeSwgKm4pICo9IGJldGE7CisgIGlmIChiZXRhICE9IFNjYWxhcigxKSkgeworICAgIGlmIChiZXRhID09IFNjYWxhcigwKSkKKyAgICAgIG1ha2VfdmVjdG9yKGFjdHVhbF95LCAqbikuc2V0WmVybygpOworICAgIGVsc2UKKyAgICAgIG1ha2VfdmVjdG9yKGFjdHVhbF95LCAqbikgKj0gYmV0YTsKICAgfQogCiAgIGludCBjb2RlID0gVVBMTygqdXBsbyk7Ci0gIGlmKGNvZGU+PTIgfHwgZnVuY1tjb2RlXT09MCkKLSAgICByZXR1cm4gMDsKKyAgaWYgKGNvZGUgPj0gMiB8fCBmdW5jW2NvZGVdID09IDApIHJldHVybiAwOwogCiAgIGZ1bmNbY29kZV0oKm4sIGEsICpsZGEsIGFjdHVhbF94LCBhY3R1YWxfeSwgYWxwaGEpOwogCi0gIGlmKGFjdHVhbF94IT14KSBkZWxldGVbXSBhY3R1YWxfeDsKLSAgaWYoYWN0dWFsX3khPXkpIGRlbGV0ZVtdIGNvcHlfYmFjayhhY3R1YWxfeSx5LCpuLCppbmN5KTsKKyAgaWYgKGFjdHVhbF94ICE9IHgpIGRlbGV0ZVtdIGFjdHVhbF94OworICBpZiAoYWN0dWFsX3kgIT0geSkgZGVsZXRlW10gY29weV9iYWNrKGFjdHVhbF95LCB5LCAqbiwgKmluY3kpOwogCiAgIHJldHVybiAxOwogfQogCiAvLyBDIDo9IGFscGhhKngqeCcgKyBDCi1pbnQgRUlHRU5fQkxBU19GVU5DKHN5cikoY29uc3QgY2hhciAqdXBsbywgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnB4LCBjb25zdCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnBjLCBjb25zdCBpbnQgKmxkYykKLXsKLQotICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBTY2FsYXIqLCBpbnQsIGNvbnN0IFNjYWxhciosIGNvbnN0IFNjYWxhciosIGNvbnN0IFNjYWxhciYpOworaW50IEVJR0VOX0JMQVNfRlVOQyhzeXIpKGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGludCAqbiwgY29uc3QgUmVhbFNjYWxhciAqcGFscGhhLCBjb25zdCBSZWFsU2NhbGFyICpweCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKnBjLCBjb25zdCBpbnQgKmxkYykgeworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBTY2FsYXIgKiwgaW50LCBjb25zdCBTY2FsYXIgKiwgY29uc3QgU2NhbGFyICosIGNvbnN0IFNjYWxhciAmKTsKICAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMl0gPSB7Ci0gICAgLy8gYXJyYXkgaW5kZXg6IFVQCi0gICAgKHNlbGZhZGpvaW50X3JhbmsxX3VwZGF0ZTxTY2FsYXIsaW50LENvbE1ham9yLFVwcGVyLGZhbHNlLENvbmo+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBMTwotICAgIChzZWxmYWRqb2ludF9yYW5rMV91cGRhdGU8U2NhbGFyLGludCxDb2xNYWpvcixMb3dlcixmYWxzZSxDb25qPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBVUAorICAgICAgKHNlbGZhZGpvaW50X3JhbmsxX3VwZGF0ZTxTY2FsYXIsIGludCwgQ29sTWFqb3IsIFVwcGVyLCBmYWxzZSwgQ29uaj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogTE8KKyAgICAgIChzZWxmYWRqb2ludF9yYW5rMV91cGRhdGU8U2NhbGFyLCBpbnQsIENvbE1ham9yLCBMb3dlciwgZmFsc2UsIENvbmo+OjpydW4pLAogICB9OwogCi0gIGNvbnN0IFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocHgpOwotICBTY2FsYXIqIGMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKLSAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKKyAgY29uc3QgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocHgpOworICBTY2FsYXIgKmMgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYyk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYWxwaGEpOwogCiAgIGludCBpbmZvID0gMDsKLSAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKLSAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKLSAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKLSAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKLSAgaWYoaW5mbykKLSAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlNZUiAgIiwmaW5mbyw2KTsKKyAgaWYgKFVQTE8oKnVwbG8pID09IElOVkFMSUQpCisgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYgKCpuIDwgMCkKKyAgICBpbmZvID0gMjsKKyAgZWxzZSBpZiAoKmluY3ggPT0gMCkKKyAgICBpbmZvID0gNTsKKyAgZWxzZSBpZiAoKmxkYyA8IHN0ZDo6bWF4KDEsICpuKSkKKyAgICBpbmZvID0gNzsKKyAgaWYgKGluZm8pIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAgIlNZUiAgIiwgJmluZm8sIDYpOwogCi0gIGlmKCpuPT0wIHx8IGFscGhhPT1TY2FsYXIoMCkpIHJldHVybiAxOworICBpZiAoKm4gPT0gMCB8fCBhbHBoYSA9PSBTY2FsYXIoMCkpIHJldHVybiAxOwogCiAgIC8vIGlmIHRoZSBpbmNyZW1lbnQgaXMgbm90IDEsIGxldCdzIGNvcHkgaXQgdG8gYSB0ZW1wb3JhcnkgdmVjdG9yIHRvIGVuYWJsZSB2ZWN0b3JpemF0aW9uCi0gIGNvbnN0IFNjYWxhciogeF9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwqbiwqaW5jeCk7CisgIGNvbnN0IFNjYWxhciAqeF9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwgKm4sICppbmN4KTsKIAogICBpbnQgY29kZSA9IFVQTE8oKnVwbG8pOwotICBpZihjb2RlPj0yIHx8IGZ1bmNbY29kZV09PTApCi0gICAgcmV0dXJuIDA7CisgIGlmIChjb2RlID49IDIgfHwgZnVuY1tjb2RlXSA9PSAwKSByZXR1cm4gMDsKIAogICBmdW5jW2NvZGVdKCpuLCBjLCAqbGRjLCB4X2NweSwgeF9jcHksIGFscGhhKTsKIAotICBpZih4X2NweSE9eCkgIGRlbGV0ZVtdIHhfY3B5OworICBpZiAoeF9jcHkgIT0geCkgZGVsZXRlW10geF9jcHk7CiAKICAgcmV0dXJuIDE7CiB9CiAKIC8vIEMgOj0gYWxwaGEqeCp5JyArIGFscGhhKnkqeCcgKyBDCi1pbnQgRUlHRU5fQkxBU19GVU5DKHN5cjIpKGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGludCAqbiwgY29uc3QgUmVhbFNjYWxhciAqcGFscGhhLCBjb25zdCBSZWFsU2NhbGFyICpweCwgY29uc3QgaW50ICppbmN4LCBjb25zdCBSZWFsU2NhbGFyICpweSwgY29uc3QgaW50ICppbmN5LCBSZWFsU2NhbGFyICpwYywgY29uc3QgaW50ICpsZGMpCi17Ci0gIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShpbnQsIFNjYWxhciosIGludCwgY29uc3QgU2NhbGFyKiwgY29uc3QgU2NhbGFyKiwgU2NhbGFyKTsKK2ludCBFSUdFTl9CTEFTX0ZVTkMoc3lyMikoY29uc3QgY2hhciAqdXBsbywgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmluY3gsIGNvbnN0IFJlYWxTY2FsYXIgKnB5LCBjb25zdCBpbnQgKmluY3ksIFJlYWxTY2FsYXIgKnBjLCBjb25zdCBpbnQgKmxkYykgeworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBTY2FsYXIgKiwgaW50LCBjb25zdCBTY2FsYXIgKiwgY29uc3QgU2NhbGFyICosIFNjYWxhcik7CiAgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzJdID0gewotICAgIC8vIGFycmF5IGluZGV4OiBVUAotICAgIChpbnRlcm5hbDo6cmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhcixpbnQsVXBwZXI+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBMTwotICAgIChpbnRlcm5hbDo6cmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhcixpbnQsTG93ZXI+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFVQCisgICAgICAoaW50ZXJuYWw6OnJhbmsyX3VwZGF0ZV9zZWxlY3RvcjxTY2FsYXIsIGludCwgVXBwZXI+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IExPCisgICAgICAoaW50ZXJuYWw6OnJhbmsyX3VwZGF0ZV9zZWxlY3RvcjxTY2FsYXIsIGludCwgTG93ZXI+OjpydW4pLAogICB9OwogCi0gIGNvbnN0IFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocHgpOwotICBjb25zdCBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHB5KTsKLSAgU2NhbGFyKiBjID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYyk7Ci0gIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhbHBoYSk7CisgIGNvbnN0IFNjYWxhciAqeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHB4KTsKKyAgY29uc3QgU2NhbGFyICp5ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocHkpOworICBTY2FsYXIgKmMgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYyk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYWxwaGEpOwogCiAgIGludCBpbmZvID0gMDsKLSAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKLSAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKLSAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKLSAgZWxzZSBpZigqaW5jeT09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKLSAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKLSAgaWYoaW5mbykKLSAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlNZUjIgIiwmaW5mbyw2KTsKKyAgaWYgKFVQTE8oKnVwbG8pID09IElOVkFMSUQpCisgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYgKCpuIDwgMCkKKyAgICBpbmZvID0gMjsKKyAgZWxzZSBpZiAoKmluY3ggPT0gMCkKKyAgICBpbmZvID0gNTsKKyAgZWxzZSBpZiAoKmluY3kgPT0gMCkKKyAgICBpbmZvID0gNzsKKyAgZWxzZSBpZiAoKmxkYyA8IHN0ZDo6bWF4KDEsICpuKSkKKyAgICBpbmZvID0gOTsKKyAgaWYgKGluZm8pIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAgIlNZUjIgIiwgJmluZm8sIDYpOwogCi0gIGlmKGFscGhhPT1TY2FsYXIoMCkpCi0gICAgcmV0dXJuIDE7CisgIGlmIChhbHBoYSA9PSBTY2FsYXIoMCkpIHJldHVybiAxOwogCi0gIGNvbnN0IFNjYWxhciogeF9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwqbiwqaW5jeCk7Ci0gIGNvbnN0IFNjYWxhciogeV9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeSwqbiwqaW5jeSk7CisgIGNvbnN0IFNjYWxhciAqeF9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeCwgKm4sICppbmN4KTsKKyAgY29uc3QgU2NhbGFyICp5X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCAqbiwgKmluY3kpOwogCiAgIGludCBjb2RlID0gVVBMTygqdXBsbyk7Ci0gIGlmKGNvZGU+PTIgfHwgZnVuY1tjb2RlXT09MCkKLSAgICByZXR1cm4gMDsKKyAgaWYgKGNvZGUgPj0gMiB8fCBmdW5jW2NvZGVdID09IDApIHJldHVybiAwOwogCiAgIGZ1bmNbY29kZV0oKm4sIGMsICpsZGMsIHhfY3B5LCB5X2NweSwgYWxwaGEpOwogCi0gIGlmKHhfY3B5IT14KSAgZGVsZXRlW10geF9jcHk7Ci0gIGlmKHlfY3B5IT15KSAgZGVsZXRlW10geV9jcHk7CisgIGlmICh4X2NweSAhPSB4KSBkZWxldGVbXSB4X2NweTsKKyAgaWYgKHlfY3B5ICE9IHkpIGRlbGV0ZVtdIHlfY3B5OwogCi0vLyAgIGludCBjb2RlID0gVVBMTygqdXBsbyk7Ci0vLyAgIGlmKGNvZGU+PTIgfHwgZnVuY1tjb2RlXT09MCkKLS8vICAgICByZXR1cm4gMDsKKyAgLy8gICBpbnQgY29kZSA9IFVQTE8oKnVwbG8pOworICAvLyAgIGlmKGNvZGU+PTIgfHwgZnVuY1tjb2RlXT09MCkKKyAgLy8gICAgIHJldHVybiAwOwogCi0vLyAgIGZ1bmNbY29kZV0oKm4sIGEsICppbmNhLCBiLCAqaW5jYiwgYywgKmxkYywgYWxwaGEpOworICAvLyAgIGZ1bmNbY29kZV0oKm4sIGEsICppbmNhLCBiLCAqaW5jYiwgYywgKmxkYywgYWxwaGEpOwogICByZXR1cm4gMTsKIH0KIAogLyoqICBEU0JNViAgcGVyZm9ybXMgdGhlIG1hdHJpeC12ZWN0b3IgIG9wZXJhdGlvbgotICAqCi0gICogICAgIHkgOj0gYWxwaGEqQSp4ICsgYmV0YSp5LAotICAqCi0gICogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKLSAgKiAgQSBpcyBhbiBuIGJ5IG4gc3ltbWV0cmljIGJhbmQgbWF0cml4LCB3aXRoIGsgc3VwZXItZGlhZ29uYWxzLgotICAqLworICoKKyAqICAgICB5IDo9IGFscGhhKkEqeCArIGJldGEqeSwKKyAqCisgKiAgd2hlcmUgYWxwaGEgYW5kIGJldGEgYXJlIHNjYWxhcnMsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZAorICogIEEgaXMgYW4gbiBieSBuIHN5bW1ldHJpYyBiYW5kIG1hdHJpeCwgd2l0aCBrIHN1cGVyLWRpYWdvbmFscy4KKyAqLwogLy8gaW50IEVJR0VOX0JMQVNfRlVOQyhzYm12KSggY2hhciAqdXBsbywgaW50ICpuLCBpbnQgKmssIFJlYWxTY2FsYXIgKmFscGhhLCBSZWFsU2NhbGFyICphLCBpbnQgKmxkYSwKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxTY2FsYXIgKngsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqYmV0YSwgUmVhbFNjYWxhciAqeSwgaW50ICppbmN5KQogLy8gewogLy8gICByZXR1cm4gMTsKIC8vIH0KIAotCiAvKiogIERTUE1WICBwZXJmb3JtcyB0aGUgbWF0cml4LXZlY3RvciBvcGVyYXRpb24KLSAgKgotICAqICAgICB5IDo9IGFscGhhKkEqeCArIGJldGEqeSwKLSAgKgotICAqICB3aGVyZSBhbHBoYSBhbmQgYmV0YSBhcmUgc2NhbGFycywgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kCi0gICogIEEgaXMgYW4gbiBieSBuIHN5bW1ldHJpYyBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgotICAqCi0gICovCi0vLyBpbnQgRUlHRU5fQkxBU19GVU5DKHNwbXYpKGNoYXIgKnVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqYWxwaGEsIFJlYWxTY2FsYXIgKmFwLCBSZWFsU2NhbGFyICp4LCBpbnQgKmluY3gsIFJlYWxTY2FsYXIgKmJldGEsIFJlYWxTY2FsYXIgKnksIGludCAqaW5jeSkKKyAqCisgKiAgICAgeSA6PSBhbHBoYSpBKnggKyBiZXRhKnksCisgKgorICogIHdoZXJlIGFscGhhIGFuZCBiZXRhIGFyZSBzY2FsYXJzLCB4IGFuZCB5IGFyZSBuIGVsZW1lbnQgdmVjdG9ycyBhbmQKKyAqICBBIGlzIGFuIG4gYnkgbiBzeW1tZXRyaWMgbWF0cml4LCBzdXBwbGllZCBpbiBwYWNrZWQgZm9ybS4KKyAqCisgKi8KKy8vIGludCBFSUdFTl9CTEFTX0ZVTkMoc3BtdikoY2hhciAqdXBsbywgaW50ICpuLCBSZWFsU2NhbGFyICphbHBoYSwgUmVhbFNjYWxhciAqYXAsIFJlYWxTY2FsYXIgKngsIGludCAqaW5jeCwgUmVhbFNjYWxhcgorLy8gKmJldGEsIFJlYWxTY2FsYXIgKnksIGludCAqaW5jeSkKIC8vIHsKIC8vICAgcmV0dXJuIDE7CiAvLyB9CiAKIC8qKiAgRFNQUiAgICBwZXJmb3JtcyB0aGUgc3ltbWV0cmljIHJhbmsgMSBvcGVyYXRpb24KLSAgKgotICAqICAgICBBIDo9IGFscGhhKngqeCcgKyBBLAotICAqCi0gICogIHdoZXJlIGFscGhhIGlzIGEgcmVhbCBzY2FsYXIsIHggaXMgYW4gbiBlbGVtZW50IHZlY3RvciBhbmQgQSBpcyBhbgotICAqICBuIGJ5IG4gc3ltbWV0cmljIG1hdHJpeCwgc3VwcGxpZWQgaW4gcGFja2VkIGZvcm0uCi0gICovCi1pbnQgRUlHRU5fQkxBU19GVU5DKHNwcikoY2hhciAqdXBsbywgaW50ICpuLCBTY2FsYXIgKnBhbHBoYSwgU2NhbGFyICpweCwgaW50ICppbmN4LCBTY2FsYXIgKnBhcCkKLXsKLSAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKGludCwgU2NhbGFyKiwgY29uc3QgU2NhbGFyKiwgU2NhbGFyKTsKKyAqCisgKiAgICAgQSA6PSBhbHBoYSp4KngnICsgQSwKKyAqCisgKiAgd2hlcmUgYWxwaGEgaXMgYSByZWFsIHNjYWxhciwgeCBpcyBhbiBuIGVsZW1lbnQgdmVjdG9yIGFuZCBBIGlzIGFuCisgKiAgbiBieSBuIHN5bW1ldHJpYyBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgorICovCitpbnQgRUlHRU5fQkxBU19GVU5DKHNwcikoY2hhciAqdXBsbywgaW50ICpuLCBTY2FsYXIgKnBhbHBoYSwgU2NhbGFyICpweCwgaW50ICppbmN4LCBTY2FsYXIgKnBhcCkgeworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBTY2FsYXIgKiwgY29uc3QgU2NhbGFyICosIFNjYWxhcik7CiAgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzJdID0gewotICAgIC8vIGFycmF5IGluZGV4OiBVUAotICAgIChpbnRlcm5hbDo6c2VsZmFkam9pbnRfcGFja2VkX3JhbmsxX3VwZGF0ZTxTY2FsYXIsaW50LENvbE1ham9yLFVwcGVyLGZhbHNlLGZhbHNlPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogTE8KLSAgICAoaW50ZXJuYWw6OnNlbGZhZGpvaW50X3BhY2tlZF9yYW5rMV91cGRhdGU8U2NhbGFyLGludCxDb2xNYWpvcixMb3dlcixmYWxzZSxmYWxzZT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogVVAKKyAgICAgIChpbnRlcm5hbDo6c2VsZmFkam9pbnRfcGFja2VkX3JhbmsxX3VwZGF0ZTxTY2FsYXIsIGludCwgQ29sTWFqb3IsIFVwcGVyLCBmYWxzZSwgZmFsc2U+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IExPCisgICAgICAoaW50ZXJuYWw6OnNlbGZhZGpvaW50X3BhY2tlZF9yYW5rMV91cGRhdGU8U2NhbGFyLCBpbnQsIENvbE1ham9yLCBMb3dlciwgZmFsc2UsIGZhbHNlPjo6cnVuKSwKICAgfTsKIAotICBTY2FsYXIqIHggPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB4KTsKLSAgU2NhbGFyKiBhcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFwKTsKLSAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKyAgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHgpOworICBTY2FsYXIgKmFwID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocGFwKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBhbHBoYSk7CiAKICAgaW50IGluZm8gPSAwOwotICBpZihVUExPKCp1cGxvKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOwotICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOwotICBlbHNlIGlmKCppbmN4PT0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OwotICBpZihpbmZvKQotICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiU1BSICAiLCZpbmZvLDYpOworICBpZiAoVVBMTygqdXBsbykgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMTsKKyAgZWxzZSBpZiAoKm4gPCAwKQorICAgIGluZm8gPSAyOworICBlbHNlIGlmICgqaW5jeCA9PSAwKQorICAgIGluZm8gPSA1OworICBpZiAoaW5mbykgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCAiU1BSICAiLCAmaW5mbywgNik7CiAKLSAgaWYoYWxwaGE9PVNjYWxhcigwKSkKLSAgICByZXR1cm4gMTsKKyAgaWYgKGFscGhhID09IFNjYWxhcigwKSkgcmV0dXJuIDE7CiAKLSAgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbiwgKmluY3gpOworICBTY2FsYXIgKnhfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsICpuLCAqaW5jeCk7CiAKICAgaW50IGNvZGUgPSBVUExPKCp1cGxvKTsKLSAgaWYoY29kZT49MiB8fCBmdW5jW2NvZGVdPT0wKQotICAgIHJldHVybiAwOworICBpZiAoY29kZSA+PSAyIHx8IGZ1bmNbY29kZV0gPT0gMCkgcmV0dXJuIDA7CiAKICAgZnVuY1tjb2RlXSgqbiwgYXAsIHhfY3B5LCBhbHBoYSk7CiAKLSAgaWYoeF9jcHkhPXgpICBkZWxldGVbXSB4X2NweTsKKyAgaWYgKHhfY3B5ICE9IHgpIGRlbGV0ZVtdIHhfY3B5OwogCiAgIHJldHVybiAxOwogfQogCiAvKiogIERTUFIyICBwZXJmb3JtcyB0aGUgc3ltbWV0cmljIHJhbmsgMiBvcGVyYXRpb24KLSAgKgotICAqICAgICBBIDo9IGFscGhhKngqeScgKyBhbHBoYSp5KngnICsgQSwKLSAgKgotICAqICB3aGVyZSBhbHBoYSBpcyBhIHNjYWxhciwgeCBhbmQgeSBhcmUgbiBlbGVtZW50IHZlY3RvcnMgYW5kIEEgaXMgYW4KLSAgKiAgbiBieSBuIHN5bW1ldHJpYyBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgotICAqLwotaW50IEVJR0VOX0JMQVNfRlVOQyhzcHIyKShjaGFyICp1cGxvLCBpbnQgKm4sIFJlYWxTY2FsYXIgKnBhbHBoYSwgUmVhbFNjYWxhciAqcHgsIGludCAqaW5jeCwgUmVhbFNjYWxhciAqcHksIGludCAqaW5jeSwgUmVhbFNjYWxhciAqcGFwKQotewotICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoaW50LCBTY2FsYXIqLCBjb25zdCBTY2FsYXIqLCBjb25zdCBTY2FsYXIqLCBTY2FsYXIpOworICoKKyAqICAgICBBIDo9IGFscGhhKngqeScgKyBhbHBoYSp5KngnICsgQSwKKyAqCisgKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggYW5kIHkgYXJlIG4gZWxlbWVudCB2ZWN0b3JzIGFuZCBBIGlzIGFuCisgKiAgbiBieSBuIHN5bW1ldHJpYyBtYXRyaXgsIHN1cHBsaWVkIGluIHBhY2tlZCBmb3JtLgorICovCitpbnQgRUlHRU5fQkxBU19GVU5DKHNwcjIpKGNoYXIgKnVwbG8sIGludCAqbiwgUmVhbFNjYWxhciAqcGFscGhhLCBSZWFsU2NhbGFyICpweCwgaW50ICppbmN4LCBSZWFsU2NhbGFyICpweSwgaW50ICppbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsU2NhbGFyICpwYXApIHsKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKGludCwgU2NhbGFyICosIGNvbnN0IFNjYWxhciAqLCBjb25zdCBTY2FsYXIgKiwgU2NhbGFyKTsKICAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMl0gPSB7Ci0gICAgLy8gYXJyYXkgaW5kZXg6IFVQCi0gICAgKGludGVybmFsOjpwYWNrZWRfcmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhcixpbnQsVXBwZXI+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBMTwotICAgIChpbnRlcm5hbDo6cGFja2VkX3JhbmsyX3VwZGF0ZV9zZWxlY3RvcjxTY2FsYXIsaW50LExvd2VyPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBVUAorICAgICAgKGludGVybmFsOjpwYWNrZWRfcmFuazJfdXBkYXRlX3NlbGVjdG9yPFNjYWxhciwgaW50LCBVcHBlcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogTE8KKyAgICAgIChpbnRlcm5hbDo6cGFja2VkX3JhbmsyX3VwZGF0ZV9zZWxlY3RvcjxTY2FsYXIsIGludCwgTG93ZXI+OjpydW4pLAogICB9OwogCi0gIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOwotICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKLSAgU2NhbGFyKiBhcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFwKTsKLSAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGFscGhhKTsKKyAgU2NhbGFyICp4ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHgpOworICBTY2FsYXIgKnkgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihweSk7CisgIFNjYWxhciAqYXAgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYXApOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocGFscGhhKTsKIAogICBpbnQgaW5mbyA9IDA7Ci0gIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7Ci0gIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7Ci0gIGVsc2UgaWYoKmluY3g9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7Ci0gIGVsc2UgaWYoKmluY3k9PTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7Ci0gIGlmKGluZm8pCi0gICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJTUFIyICIsJmluZm8sNik7CisgIGlmIChVUExPKCp1cGxvKSA9PSBJTlZBTElEKQorICAgIGluZm8gPSAxOworICBlbHNlIGlmICgqbiA8IDApCisgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYgKCppbmN4ID09IDApCisgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYgKCppbmN5ID09IDApCisgICAgaW5mbyA9IDc7CisgIGlmIChpbmZvKSByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQICJTUFIyICIsICZpbmZvLCA2KTsKIAotICBpZihhbHBoYT09U2NhbGFyKDApKQotICAgIHJldHVybiAxOworICBpZiAoYWxwaGEgPT0gU2NhbGFyKDApKSByZXR1cm4gMTsKIAotICBTY2FsYXIqIHhfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHgsICpuLCAqaW5jeCk7Ci0gIFNjYWxhciogeV9jcHkgPSBnZXRfY29tcGFjdF92ZWN0b3IoeSwgKm4sICppbmN5KTsKKyAgU2NhbGFyICp4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbiwgKmluY3gpOworICBTY2FsYXIgKnlfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHksICpuLCAqaW5jeSk7CiAKICAgaW50IGNvZGUgPSBVUExPKCp1cGxvKTsKLSAgaWYoY29kZT49MiB8fCBmdW5jW2NvZGVdPT0wKQotICAgIHJldHVybiAwOworICBpZiAoY29kZSA+PSAyIHx8IGZ1bmNbY29kZV0gPT0gMCkgcmV0dXJuIDA7CiAKICAgZnVuY1tjb2RlXSgqbiwgYXAsIHhfY3B5LCB5X2NweSwgYWxwaGEpOwogCi0gIGlmKHhfY3B5IT14KSAgZGVsZXRlW10geF9jcHk7Ci0gIGlmKHlfY3B5IT15KSAgZGVsZXRlW10geV9jcHk7CisgIGlmICh4X2NweSAhPSB4KSBkZWxldGVbXSB4X2NweTsKKyAgaWYgKHlfY3B5ICE9IHkpIGRlbGV0ZVtdIHlfY3B5OwogCiAgIHJldHVybiAxOwogfQogCiAvKiogIERHRVIgICBwZXJmb3JtcyB0aGUgcmFuayAxIG9wZXJhdGlvbgotICAqCi0gICogICAgIEEgOj0gYWxwaGEqeCp5JyArIEEsCi0gICoKLSAgKiAgd2hlcmUgYWxwaGEgaXMgYSBzY2FsYXIsIHggaXMgYW4gbSBlbGVtZW50IHZlY3RvciwgeSBpcyBhbiBuIGVsZW1lbnQKLSAgKiAgdmVjdG9yIGFuZCBBIGlzIGFuIG0gYnkgbiBtYXRyaXguCi0gICovCi1pbnQgRUlHRU5fQkxBU19GVU5DKGdlcikoaW50ICptLCBpbnQgKm4sIFNjYWxhciAqcGFscGhhLCBTY2FsYXIgKnB4LCBpbnQgKmluY3gsIFNjYWxhciAqcHksIGludCAqaW5jeSwgU2NhbGFyICpwYSwgaW50ICpsZGEpCi17Ci0gIFNjYWxhciogeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocHgpOwotICBTY2FsYXIqIHkgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHB5KTsKLSAgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYSk7Ci0gIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBhbHBoYSk7CisgKgorICogICAgIEEgOj0gYWxwaGEqeCp5JyArIEEsCisgKgorICogIHdoZXJlIGFscGhhIGlzIGEgc2NhbGFyLCB4IGlzIGFuIG0gZWxlbWVudCB2ZWN0b3IsIHkgaXMgYW4gbiBlbGVtZW50CisgKiAgdmVjdG9yIGFuZCBBIGlzIGFuIG0gYnkgbiBtYXRyaXguCisgKi8KK2ludCBFSUdFTl9CTEFTX0ZVTkMoZ2VyKShpbnQgKm0sIGludCAqbiwgU2NhbGFyICpwYWxwaGEsIFNjYWxhciAqcHgsIGludCAqaW5jeCwgU2NhbGFyICpweSwgaW50ICppbmN5LCBTY2FsYXIgKnBhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGRhKSB7CisgIFNjYWxhciAqeCA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHB4KTsKKyAgU2NhbGFyICp5ID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocHkpOworICBTY2FsYXIgKmEgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYSk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYWxwaGEpOwogCiAgIGludCBpbmZvID0gMDsKLSAgICAgICBpZigqbTwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKLSAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKLSAgZWxzZSBpZigqaW5jeD09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNTsKLSAgZWxzZSBpZigqaW5jeT09MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKLSAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKm0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKLSAgaWYoaW5mbykKLSAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkdFUiAgIiwmaW5mbyw2KTsKKyAgaWYgKCptIDwgMCkKKyAgICBpbmZvID0gMTsKKyAgZWxzZSBpZiAoKm4gPCAwKQorICAgIGluZm8gPSAyOworICBlbHNlIGlmICgqaW5jeCA9PSAwKQorICAgIGluZm8gPSA1OworICBlbHNlIGlmICgqaW5jeSA9PSAwKQorICAgIGluZm8gPSA3OworICBlbHNlIGlmICgqbGRhIDwgc3RkOjptYXgoMSwgKm0pKQorICAgIGluZm8gPSA5OworICBpZiAoaW5mbykgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCAiR0VSICAiLCAmaW5mbywgNik7CiAKLSAgaWYoYWxwaGE9PVNjYWxhcigwKSkKLSAgICByZXR1cm4gMTsKKyAgaWYgKGFscGhhID09IFNjYWxhcigwKSkgcmV0dXJuIDE7CiAKLSAgU2NhbGFyKiB4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCptLCppbmN4KTsKLSAgU2NhbGFyKiB5X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih5LCpuLCppbmN5KTsKKyAgU2NhbGFyICp4X2NweSA9IGdldF9jb21wYWN0X3ZlY3Rvcih4LCAqbSwgKmluY3gpOworICBTY2FsYXIgKnlfY3B5ID0gZ2V0X2NvbXBhY3RfdmVjdG9yKHksICpuLCAqaW5jeSk7CiAKLSAgaW50ZXJuYWw6OmdlbmVyYWxfcmFuazFfdXBkYXRlPFNjYWxhcixpbnQsQ29sTWFqb3IsZmFsc2UsZmFsc2U+OjpydW4oKm0sICpuLCBhLCAqbGRhLCB4X2NweSwgeV9jcHksIGFscGhhKTsKKyAgaW50ZXJuYWw6OmdlbmVyYWxfcmFuazFfdXBkYXRlPFNjYWxhciwgaW50LCBDb2xNYWpvciwgZmFsc2UsIGZhbHNlPjo6cnVuKCptLCAqbiwgYSwgKmxkYSwgeF9jcHksIHlfY3B5LCBhbHBoYSk7CiAKLSAgaWYoeF9jcHkhPXgpICBkZWxldGVbXSB4X2NweTsKLSAgaWYoeV9jcHkhPXkpICBkZWxldGVbXSB5X2NweTsKKyAgaWYgKHhfY3B5ICE9IHgpIGRlbGV0ZVtdIHhfY3B5OworICBpZiAoeV9jcHkgIT0geSkgZGVsZXRlW10geV9jcHk7CiAKICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9ibGFzL2xldmVsM19pbXBsLmggYi9ibGFzL2xldmVsM19pbXBsLmgKaW5kZXggNjYyMTZjOS4uNWFmNTAyNyAxMDA2NDQKLS0tIGEvYmxhcy9sZXZlbDNfaW1wbC5oCisrKyBiL2JsYXMvbGV2ZWwzX2ltcGwuaApAQCAtOSwyNzQgKzksMzM4IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSAiY29tbW9uLmgiCiAKLWludCBFSUdFTl9CTEFTX0ZVTkMoZ2VtbSkoY29uc3QgY2hhciAqb3BhLCBjb25zdCBjaGFyICpvcGIsIGNvbnN0IGludCAqbSwgY29uc3QgaW50ICpuLCBjb25zdCBpbnQgKmssIGNvbnN0IFJlYWxTY2FsYXIgKnBhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciAqcGEsIGNvbnN0IGludCAqbGRhLCBjb25zdCBSZWFsU2NhbGFyICpwYiwgY29uc3QgaW50ICpsZGIsIGNvbnN0IFJlYWxTY2FsYXIgKnBiZXRhLCBSZWFsU2NhbGFyICpwYywgY29uc3QgaW50ICpsZGMpCi17Ci0vLyAgIHN0ZDo6Y2VyciA8PCAiaW4gZ2VtbSAiIDw8ICpvcGEgPDwgIiAiIDw8ICpvcGIgPDwgIiAiIDw8ICptIDw8ICIgIiA8PCAqbiA8PCAiICIgPDwgKmsgPDwgIiAiIDw8ICpsZGEgPDwgIiAiIDw8ICpsZGIgPDwgIiAiIDw8ICpsZGMgPDwgIiAiIDw8ICpwYWxwaGEgPDwgIiAiIDw8ICpwYmV0YSA8PCAiXG4iOwotICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyICosIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgU2NhbGFyLCBpbnRlcm5hbDo6bGV2ZWwzX2Jsb2NraW5nPFNjYWxhcixTY2FsYXI+JiwgRWlnZW46OmludGVybmFsOjpHZW1tUGFyYWxsZWxJbmZvPERlbnNlSW5kZXg+Kik7CitpbnQgRUlHRU5fQkxBU19GVU5DKGdlbW0pKGNvbnN0IGNoYXIgKm9wYSwgY29uc3QgY2hhciAqb3BiLCBjb25zdCBpbnQgKm0sIGNvbnN0IGludCAqbiwgY29uc3QgaW50ICprLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqbGRiLCBjb25zdCBSZWFsU2NhbGFyICpwYmV0YSwgUmVhbFNjYWxhciAqcGMsIGNvbnN0IGludCAqbGRjKSB7CisgIC8vICAgc3RkOjpjZXJyIDw8ICJpbiBnZW1tICIgPDwgKm9wYSA8PCAiICIgPDwgKm9wYiA8PCAiICIgPDwgKm0gPDwgIiAiIDw8ICpuIDw8ICIgIiA8PCAqayA8PCAiICIgPDwgKmxkYSA8PCAiICIgPDwKKyAgLy8gICAqbGRiIDw8ICIgIiA8PCAqbGRjIDw8ICIgIiA8PCAqcGFscGhhIDw8ICIgIiA8PCAqcGJldGEgPDwgIlxuIjsKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhciAqLCBEZW5zZUluZGV4LCBEZW5zZUluZGV4LCBTY2FsYXIsIGludGVybmFsOjpsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLCBTY2FsYXI+ICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6aW50ZXJuYWw6OkdlbW1QYXJhbGxlbEluZm88RGVuc2VJbmRleD4gKik7CiAgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzEyXSA9IHsKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTk9UUiA8PCAyKQotICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsQ29sTWFqb3IsZmFsc2UsU2NhbGFyLENvbE1ham9yLGZhbHNlLENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChOT1RSIDw8IDIpCi0gICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixSb3dNYWpvcixmYWxzZSxTY2FsYXIsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKE5PVFIgPDwgMikKLSAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLFJvd01ham9yLENvbmosIFNjYWxhcixDb2xNYWpvcixmYWxzZSxDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAwLAotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChUUiAgIDw8IDIpCi0gICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixDb2xNYWpvcixmYWxzZSxTY2FsYXIsUm93TWFqb3IsZmFsc2UsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFRSICAgPDwgMikKLSAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLFJvd01ham9yLGZhbHNlLFNjYWxhcixSb3dNYWpvcixmYWxzZSxDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVFIgICA8PCAyKQotICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsQ29uaiwgU2NhbGFyLFJvd01ham9yLGZhbHNlLENvbE1ham9yLDE+OjpydW4pLAotICAgIDAsCi0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKEFESiAgPDwgMikKLSAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLENvbE1ham9yLGZhbHNlLFNjYWxhcixSb3dNYWpvcixDb25qLCBDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoQURKICA8PCAyKQotICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsZmFsc2UsU2NhbGFyLFJvd01ham9yLENvbmosIENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChBREogIDw8IDIpCi0gICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixSb3dNYWpvcixDb25qLCBTY2FsYXIsUm93TWFqb3IsQ29uaiwgQ29sTWFqb3IsMT46OnJ1biksCi0gICAgMAotICB9OworICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKE5PVFIgPDwgMikKKyAgICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8RGVuc2VJbmRleCwgU2NhbGFyLCBDb2xNYWpvciwgZmFsc2UsIFNjYWxhciwgQ29sTWFqb3IsIGZhbHNlLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTk9UUiA8PCAyKQorICAgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxEZW5zZUluZGV4LCBTY2FsYXIsIFJvd01ham9yLCBmYWxzZSwgU2NhbGFyLCBDb2xNYWpvciwgZmFsc2UsIENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChOT1RSIDw8IDIpCisgICAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PERlbnNlSW5kZXgsIFNjYWxhciwgUm93TWFqb3IsIENvbmosIFNjYWxhciwgQ29sTWFqb3IsIGZhbHNlLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT46OnJ1biksCisgICAgICAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFRSICAgPDwgMikKKyAgICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8RGVuc2VJbmRleCwgU2NhbGFyLCBDb2xNYWpvciwgZmFsc2UsIFNjYWxhciwgUm93TWFqb3IsIGZhbHNlLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVFIgICA8PCAyKQorICAgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxEZW5zZUluZGV4LCBTY2FsYXIsIFJvd01ham9yLCBmYWxzZSwgU2NhbGFyLCBSb3dNYWpvciwgZmFsc2UsIENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChUUiAgIDw8IDIpCisgICAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PERlbnNlSW5kZXgsIFNjYWxhciwgUm93TWFqb3IsIENvbmosIFNjYWxhciwgUm93TWFqb3IsIGZhbHNlLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT46OnJ1biksCisgICAgICAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKEFESiAgPDwgMikKKyAgICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8RGVuc2VJbmRleCwgU2NhbGFyLCBDb2xNYWpvciwgZmFsc2UsIFNjYWxhciwgUm93TWFqb3IsIENvbmosIENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChBREogIDw8IDIpCisgICAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF9wcm9kdWN0PERlbnNlSW5kZXgsIFNjYWxhciwgUm93TWFqb3IsIGZhbHNlLCBTY2FsYXIsIFJvd01ham9yLCBDb25qLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoQURKICA8PCAyKQorICAgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxEZW5zZUluZGV4LCBTY2FsYXIsIFJvd01ham9yLCBDb25qLCBTY2FsYXIsIFJvd01ham9yLCBDb25qLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT46OnJ1biksCisgICAgICAwfTsKIAotICBjb25zdCBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhKTsKLSAgY29uc3QgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYik7Ci0gIFNjYWxhciogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGMpOwotICBTY2FsYXIgYWxwaGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKLSAgU2NhbGFyIGJldGEgICA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBiZXRhKTsKKyAgY29uc3QgU2NhbGFyICphID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGEpOworICBjb25zdCBTY2FsYXIgKmIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYik7CisgIFNjYWxhciAqYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBjKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBhbHBoYSk7CisgIFNjYWxhciBiZXRhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBiZXRhKTsKIAogICBpbnQgaW5mbyA9IDA7Ci0gIGlmKE9QKCpvcGEpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7Ci0gIGVsc2UgaWYoT1AoKm9wYik9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7Ci0gIGVsc2UgaWYoKm08MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7Ci0gIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7Ci0gIGVsc2UgaWYoKms8MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7Ci0gIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLChPUCgqb3BhKT09Tk9UUik/Km06KmspKSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDg7Ci0gIGVsc2UgaWYoKmxkYjxzdGQ6Om1heCgxLChPUCgqb3BiKT09Tk9UUik/Kms6Km4pKSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDEwOwotICBlbHNlIGlmKCpsZGM8c3RkOjptYXgoMSwqbSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxMzsKLSAgaWYoaW5mbykKLSAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIkdFTU0gIiwmaW5mbyw2KTsKKyAgaWYgKE9QKCpvcGEpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYgKE9QKCpvcGIpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYgKCptIDwgMCkKKyAgICBpbmZvID0gMzsKKyAgZWxzZSBpZiAoKm4gPCAwKQorICAgIGluZm8gPSA0OworICBlbHNlIGlmICgqayA8IDApCisgICAgaW5mbyA9IDU7CisgIGVsc2UgaWYgKCpsZGEgPCBzdGQ6Om1heCgxLCAoT1AoKm9wYSkgPT0gTk9UUikgPyAqbSA6ICprKSkKKyAgICBpbmZvID0gODsKKyAgZWxzZSBpZiAoKmxkYiA8IHN0ZDo6bWF4KDEsIChPUCgqb3BiKSA9PSBOT1RSKSA/ICprIDogKm4pKQorICAgIGluZm8gPSAxMDsKKyAgZWxzZSBpZiAoKmxkYyA8IHN0ZDo6bWF4KDEsICptKSkKKyAgICBpbmZvID0gMTM7CisgIGlmIChpbmZvKSByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQICJHRU1NICIsICZpbmZvLCA2KTsKIAotICBpZiAoKm0gPT0gMCB8fCAqbiA9PSAwKQotICAgIHJldHVybiAwOworICBpZiAoKm0gPT0gMCB8fCAqbiA9PSAwKSByZXR1cm4gMDsKIAotICBpZihiZXRhIT1TY2FsYXIoMSkpCi0gIHsKLSAgICBpZihiZXRhPT1TY2FsYXIoMCkpIG1hdHJpeChjLCAqbSwgKm4sICpsZGMpLnNldFplcm8oKTsKLSAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbSwgKm4sICpsZGMpICo9IGJldGE7CisgIGlmIChiZXRhICE9IFNjYWxhcigxKSkgeworICAgIGlmIChiZXRhID09IFNjYWxhcigwKSkKKyAgICAgIG1hdHJpeChjLCAqbSwgKm4sICpsZGMpLnNldFplcm8oKTsKKyAgICBlbHNlCisgICAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKSAqPSBiZXRhOwogICB9CiAKLSAgaWYoKmsgPT0gMCkKLSAgICByZXR1cm4gMDsKKyAgaWYgKCprID09IDApIHJldHVybiAwOwogCi0gIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPENvbE1ham9yLFNjYWxhcixTY2FsYXIsRHluYW1pYyxEeW5hbWljLER5bmFtaWM+IGJsb2NraW5nKCptLCpuLCprLDEsdHJ1ZSk7CisgIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPENvbE1ham9yLCBTY2FsYXIsIFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgRHluYW1pYz4gYmxvY2tpbmcoKm0sICpuLCAqaywgMSwgdHJ1ZSk7CiAKICAgaW50IGNvZGUgPSBPUCgqb3BhKSB8IChPUCgqb3BiKSA8PCAyKTsKICAgZnVuY1tjb2RlXSgqbSwgKm4sICprLCBhLCAqbGRhLCBiLCAqbGRiLCBjLCAxLCAqbGRjLCBhbHBoYSwgYmxvY2tpbmcsIDApOwogICByZXR1cm4gMDsKIH0KIAotaW50IEVJR0VOX0JMQVNfRlVOQyh0cnNtKShjb25zdCBjaGFyICpzaWRlLCBjb25zdCBjaGFyICp1cGxvLCBjb25zdCBjaGFyICpvcGEsIGNvbnN0IGNoYXIgKmRpYWcsIGNvbnN0IGludCAqbSwgY29uc3QgaW50ICpuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsICBjb25zdCBSZWFsU2NhbGFyICpwYSwgY29uc3QgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiLCBjb25zdCBpbnQgKmxkYikKLXsKLS8vICAgc3RkOjpjZXJyIDw8ICJpbiB0cnNtICIgPDwgKnNpZGUgPDwgIiAiIDw8ICp1cGxvIDw8ICIgIiA8PCAqb3BhIDw8ICIgIiA8PCAqZGlhZyA8PCAiICIgPDwgKm0gPDwgIiwiIDw8ICpuIDw8ICIgIiA8PCAqcGFscGhhIDw8ICIgIiA8PCAqbGRhIDw8ICIgIiA8PCAqbGRiPDwgIlxuIjsKLSAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgaW50ZXJuYWw6OmxldmVsM19ibG9ja2luZzxTY2FsYXIsU2NhbGFyPiYpOworaW50IEVJR0VOX0JMQVNfRlVOQyh0cnNtKShjb25zdCBjaGFyICpzaWRlLCBjb25zdCBjaGFyICp1cGxvLCBjb25zdCBjaGFyICpvcGEsIGNvbnN0IGNoYXIgKmRpYWcsIGNvbnN0IGludCAqbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgUmVhbFNjYWxhciAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqbGRiKSB7CisgIC8vICAgc3RkOjpjZXJyIDw8ICJpbiB0cnNtICIgPDwgKnNpZGUgPDwgIiAiIDw8ICp1cGxvIDw8ICIgIiA8PCAqb3BhIDw8ICIgIiA8PCAqZGlhZyA8PCAiICIgPDwgKm0gPDwgIiwiIDw8ICpuIDw8ICIgIgorICAvLyAgIDw8ICpwYWxwaGEgPDwgIiAiIDw8ICpsZGEgPDwgIiAiIDw8ICpsZGI8PCAiXG4iOworICB0eXBlZGVmIHZvaWQgKCpmdW5jdHlwZSkoRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyICosIERlbnNlSW5kZXgsIFNjYWxhciAqLCBEZW5zZUluZGV4LCBEZW5zZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmxldmVsM19ibG9ja2luZzxTY2FsYXIsIFNjYWxhcj4gJik7CiAgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzMyXSA9IHsKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlTGVmdCwgVXBwZXJ8MCwgICAgICAgICAgZmFsc2UsQ29sTWFqb3IsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZUxlZnQsIExvd2VyfDAsICAgICAgICAgIGZhbHNlLFJvd01ham9yLENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVMZWZ0LCBMb3dlcnwwLCAgICAgICAgICBDb25qLCBSb3dNYWpvcixDb2xNYWpvciwxPjo6cnVuKSxcCi0gICAgMCwKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlUmlnaHQsVXBwZXJ8MCwgICAgICAgICAgZmFsc2UsQ29sTWFqb3IsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZVJpZ2h0LExvd2VyfDAsICAgICAgICAgIGZhbHNlLFJvd01ham9yLENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVSaWdodCxMb3dlcnwwLCAgICAgICAgICBDb25qLCBSb3dNYWpvcixDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAwLAotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVMZWZ0LCBMb3dlcnwwLCAgICAgICAgICBmYWxzZSxDb2xNYWpvcixDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlTGVmdCwgVXBwZXJ8MCwgICAgICAgICAgZmFsc2UsUm93TWFqb3IsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZUxlZnQsIFVwcGVyfDAsICAgICAgICAgIENvbmosIFJvd01ham9yLENvbE1ham9yLDE+OjpydW4pLAotICAgIDAsCi0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZVJpZ2h0LExvd2VyfDAsICAgICAgICAgIGZhbHNlLENvbE1ham9yLENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVSaWdodCxVcHBlcnwwLCAgICAgICAgICBmYWxzZSxSb3dNYWpvcixDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlUmlnaHQsVXBwZXJ8MCwgICAgICAgICAgQ29uaiwgUm93TWFqb3IsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgMCwKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlTGVmdCwgVXBwZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3IsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZUxlZnQsIExvd2VyfFVuaXREaWFnLGZhbHNlLFJvd01ham9yLENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVMZWZ0LCBMb3dlcnxVbml0RGlhZyxDb25qLCBSb3dNYWpvcixDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAwLAotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVSaWdodCxVcHBlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcixDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlUmlnaHQsTG93ZXJ8VW5pdERpYWcsZmFsc2UsUm93TWFqb3IsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZVJpZ2h0LExvd2VyfFVuaXREaWFnLENvbmosIFJvd01ham9yLENvbE1ham9yLDE+OjpydW4pLAotICAgIDAsCi0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZUxlZnQsIExvd2VyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yLENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVMZWZ0LCBVcHBlcnxVbml0RGlhZyxmYWxzZSxSb3dNYWpvcixDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlTGVmdCwgVXBwZXJ8VW5pdERpYWcsQ29uaiwgUm93TWFqb3IsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgMCwKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LE9uVGhlUmlnaHQsTG93ZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3IsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCi0gICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxPblRoZVJpZ2h0LFVwcGVyfFVuaXREaWFnLGZhbHNlLFJvd01ham9yLENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQotICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsT25UaGVSaWdodCxVcHBlcnxVbml0RGlhZyxDb25qLCBSb3dNYWpvcixDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAwCi0gIH07CisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBPblRoZUxlZnQsIFVwcGVyIHwgMCwgZmFsc2UsIENvbE1ham9yLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBPblRoZUxlZnQsIExvd2VyIHwgMCwgZmFsc2UsIFJvd01ham9yLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBPblRoZUxlZnQsIExvd2VyIHwgMCwgQ29uaiwgUm93TWFqb3IsIENvbE1ham9yLCAxPjo6cnVuKSwKKyAgICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBPblRoZVJpZ2h0LCBVcHBlciB8IDAsIGZhbHNlLCBDb2xNYWpvciwgQ29sTWFqb3IsIDE+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgT25UaGVSaWdodCwgTG93ZXIgfCAwLCBmYWxzZSwgUm93TWFqb3IsIENvbE1ham9yLCAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIE9uVGhlUmlnaHQsIExvd2VyIHwgMCwgQ29uaiwgUm93TWFqb3IsIENvbE1ham9yLCAxPjo6cnVuKSwKKyAgICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBPblRoZUxlZnQsIExvd2VyIHwgMCwgZmFsc2UsIENvbE1ham9yLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBPblRoZUxlZnQsIFVwcGVyIHwgMCwgZmFsc2UsIFJvd01ham9yLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBPblRoZUxlZnQsIFVwcGVyIHwgMCwgQ29uaiwgUm93TWFqb3IsIENvbE1ham9yLCAxPjo6cnVuKSwKKyAgICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBPblRoZVJpZ2h0LCBMb3dlciB8IDAsIGZhbHNlLCBDb2xNYWpvciwgQ29sTWFqb3IsIDE+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgT25UaGVSaWdodCwgVXBwZXIgfCAwLCBmYWxzZSwgUm93TWFqb3IsIENvbE1ham9yLCAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIE9uVGhlUmlnaHQsIFVwcGVyIHwgMCwgQ29uaiwgUm93TWFqb3IsIENvbE1ham9yLCAxPjo6cnVuKSwKKyAgICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBPblRoZUxlZnQsIFVwcGVyIHwgVW5pdERpYWcsIGZhbHNlLCBDb2xNYWpvciwgQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgT25UaGVMZWZ0LCBMb3dlciB8IFVuaXREaWFnLCBmYWxzZSwgUm93TWFqb3IsIENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIE9uVGhlTGVmdCwgTG93ZXIgfCBVbml0RGlhZywgQ29uaiwgUm93TWFqb3IsIENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKSwKKyAgICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBPblRoZVJpZ2h0LCBVcHBlciB8IFVuaXREaWFnLCBmYWxzZSwgQ29sTWFqb3IsIENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIE9uVGhlUmlnaHQsIExvd2VyIHwgVW5pdERpYWcsIGZhbHNlLCBSb3dNYWpvciwgQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgT25UaGVSaWdodCwgTG93ZXIgfCBVbml0RGlhZywgQ29uaiwgUm93TWFqb3IsIENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKSwKKyAgICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBPblRoZUxlZnQsIExvd2VyIHwgVW5pdERpYWcsIGZhbHNlLCBDb2xNYWpvciwgQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgT25UaGVMZWZ0LCBVcHBlciB8IFVuaXREaWFnLCBmYWxzZSwgUm93TWFqb3IsIENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIE9uVGhlTGVmdCwgVXBwZXIgfCBVbml0RGlhZywgQ29uaiwgUm93TWFqb3IsIENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKSwKKyAgICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6dHJpYW5ndWxhcl9zb2x2ZV9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBPblRoZVJpZ2h0LCBMb3dlciB8IFVuaXREaWFnLCBmYWxzZSwgQ29sTWFqb3IsIENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQorICAgICAgKGludGVybmFsOjp0cmlhbmd1bGFyX3NvbHZlX21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIE9uVGhlUmlnaHQsIFVwcGVyIHwgVW5pdERpYWcsIGZhbHNlLCBSb3dNYWpvciwgQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnRyaWFuZ3VsYXJfc29sdmVfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgT25UaGVSaWdodCwgVXBwZXIgfCBVbml0RGlhZywgQ29uaiwgUm93TWFqb3IsIENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKSwKKyAgICAgIDB9OwogCi0gIGNvbnN0IFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGEpOwotICBTY2FsYXIqIGIgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBiKTsKLSAgU2NhbGFyICBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhbHBoYSk7CisgIGNvbnN0IFNjYWxhciAqYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBhKTsKKyAgU2NhbGFyICpiID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocGIpOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGFscGhhKTsKIAogICBpbnQgaW5mbyA9IDA7Ci0gIGlmKFNJREUoKnNpZGUpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7Ci0gIGVsc2UgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7Ci0gIGVsc2UgaWYoT1AoKm9wYSk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7Ci0gIGVsc2UgaWYoRElBRygqZGlhZyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7Ci0gIGVsc2UgaWYoKm08MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDU7Ci0gIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDY7Ci0gIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLChTSURFKCpzaWRlKT09TEVGVCk/Km06Km4pKSAgICAgICAgICAgICAgICAgaW5mbyA9IDk7Ci0gIGVsc2UgaWYoKmxkYjxzdGQ6Om1heCgxLCptKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDExOwotICBpZihpbmZvKQotICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiVFJTTSAiLCZpbmZvLDYpOworICBpZiAoU0lERSgqc2lkZSkgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMTsKKyAgZWxzZSBpZiAoVVBMTygqdXBsbykgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMjsKKyAgZWxzZSBpZiAoT1AoKm9wYSkgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMzsKKyAgZWxzZSBpZiAoRElBRygqZGlhZykgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gNDsKKyAgZWxzZSBpZiAoKm0gPCAwKQorICAgIGluZm8gPSA1OworICBlbHNlIGlmICgqbiA8IDApCisgICAgaW5mbyA9IDY7CisgIGVsc2UgaWYgKCpsZGEgPCBzdGQ6Om1heCgxLCAoU0lERSgqc2lkZSkgPT0gTEVGVCkgPyAqbSA6ICpuKSkKKyAgICBpbmZvID0gOTsKKyAgZWxzZSBpZiAoKmxkYiA8IHN0ZDo6bWF4KDEsICptKSkKKyAgICBpbmZvID0gMTE7CisgIGlmIChpbmZvKSByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQICJUUlNNICIsICZpbmZvLCA2KTsKIAotICBpZigqbT09MCB8fCAqbj09MCkKLSAgICByZXR1cm4gMDsKKyAgaWYgKCptID09IDAgfHwgKm4gPT0gMCkgcmV0dXJuIDA7CiAKICAgaW50IGNvZGUgPSBPUCgqb3BhKSB8IChTSURFKCpzaWRlKSA8PCAyKSB8IChVUExPKCp1cGxvKSA8PCAzKSB8IChESUFHKCpkaWFnKSA8PCA0KTsKIAotICBpZihTSURFKCpzaWRlKT09TEVGVCkKLSAgewotICAgIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPENvbE1ham9yLFNjYWxhcixTY2FsYXIsRHluYW1pYyxEeW5hbWljLER5bmFtaWMsND4gYmxvY2tpbmcoKm0sKm4sKm0sMSxmYWxzZSk7CisgIGlmIChTSURFKCpzaWRlKSA9PSBMRUZUKSB7CisgICAgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8Q29sTWFqb3IsIFNjYWxhciwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBEeW5hbWljLCA0PiBibG9ja2luZygqbSwgKm4sICptLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgIGZ1bmNbY29kZV0oKm0sICpuLCBhLCAqbGRhLCBiLCAxLCAqbGRiLCBibG9ja2luZyk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8Q29sTWFqb3IsU2NhbGFyLFNjYWxhcixEeW5hbWljLER5bmFtaWMsRHluYW1pYyw0PiBibG9ja2luZygqbSwqbiwqbiwxLGZhbHNlKTsKKyAgfSBlbHNlIHsKKyAgICBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvciwgU2NhbGFyLCBTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIER5bmFtaWMsIDQ+IGJsb2NraW5nKCptLCAqbiwgKm4sIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgZnVuY1tjb2RlXSgqbiwgKm0sIGEsICpsZGEsIGIsIDEsICpsZGIsIGJsb2NraW5nKTsKICAgfQogCi0gIGlmKGFscGhhIT1TY2FsYXIoMSkpCi0gICAgbWF0cml4KGIsKm0sKm4sKmxkYikgKj0gYWxwaGE7CisgIGlmIChhbHBoYSAhPSBTY2FsYXIoMSkpIG1hdHJpeChiLCAqbSwgKm4sICpsZGIpICo9IGFscGhhOwogCiAgIHJldHVybiAwOwogfQogCi0KIC8vIGIgPSBhbHBoYSpvcChhKSpiICBmb3Igc2lkZSA9ICdMJ29yJ2wnCiAvLyBiID0gYWxwaGEqYipvcChhKSAgZm9yIHNpZGUgPSAnUidvcidyJwotaW50IEVJR0VOX0JMQVNfRlVOQyh0cm1tKShjb25zdCBjaGFyICpzaWRlLCBjb25zdCBjaGFyICp1cGxvLCBjb25zdCBjaGFyICpvcGEsIGNvbnN0IGNoYXIgKmRpYWcsIGNvbnN0IGludCAqbSwgY29uc3QgaW50ICpuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgUmVhbFNjYWxhciAqcGIsIGNvbnN0IGludCAqbGRiKQotewotLy8gICBzdGQ6OmNlcnIgPDwgImluIHRybW0gIiA8PCAqc2lkZSA8PCAiICIgPDwgKnVwbG8gPDwgIiAiIDw8ICpvcGEgPDwgIiAiIDw8ICpkaWFnIDw8ICIgIiA8PCAqbSA8PCAiICIgPDwgKm4gPDwgIiAiIDw8ICpsZGEgPDwgIiAiIDw8ICpsZGIgPDwgIiAiIDw8ICpwYWxwaGEgPDwgIlxuIjsKLSAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgU2NhbGFyICosIERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciYsIGludGVybmFsOjpsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mKTsKK2ludCBFSUdFTl9CTEFTX0ZVTkModHJtbSkoY29uc3QgY2hhciAqc2lkZSwgY29uc3QgY2hhciAqdXBsbywgY29uc3QgY2hhciAqb3BhLCBjb25zdCBjaGFyICpkaWFnLCBjb25zdCBpbnQgKm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqbiwgY29uc3QgUmVhbFNjYWxhciAqcGFscGhhLCBjb25zdCBSZWFsU2NhbGFyICpwYSwgY29uc3QgaW50ICpsZGEsIFJlYWxTY2FsYXIgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmxkYikgeworICAvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gdHJtbSAiIDw8ICpzaWRlIDw8ICIgIiA8PCAqdXBsbyA8PCAiICIgPDwgKm9wYSA8PCAiICIgPDwgKmRpYWcgPDwgIiAiIDw8ICptIDw8ICIgIiA8PCAqbiA8PCAiICIKKyAgLy8gICA8PCAqbGRhIDw8ICIgIiA8PCAqbGRiIDw8ICIgIiA8PCAqcGFscGhhIDw8ICJcbiI7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShEZW5zZUluZGV4LCBEZW5zZUluZGV4LCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyICosIERlbnNlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXIgKiwgRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6bGV2ZWwzX2Jsb2NraW5nPFNjYWxhciwgU2NhbGFyPiAmKTsKICAgc3RhdGljIGNvbnN0IGZ1bmN0eXBlIGZ1bmNbMzJdID0gewotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KQotICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8MCwgICAgICAgICAgdHJ1ZSwgQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCi0gICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxMb3dlcnwwLCAgICAgICAgICB0cnVlLCBSb3dNYWpvcixmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LExvd2VyfDAsICAgICAgICAgIHRydWUsIFJvd01ham9yLENvbmosIENvbE1ham9yLGZhbHNlLENvbE1ham9yLDE+OjpydW4pLAotICAgIDAsCi0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCi0gICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnwwLCAgICAgICAgICBmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LExvd2VyfDAsICAgICAgICAgIGZhbHNlLENvbE1ham9yLGZhbHNlLFJvd01ham9yLGZhbHNlLENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KQotICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsTG93ZXJ8MCwgICAgICAgICAgZmFsc2UsQ29sTWFqb3IsZmFsc2UsUm93TWFqb3IsQ29uaiwgQ29sTWFqb3IsMT46OnJ1biksCi0gICAgMCwKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LExvd2VyfDAsICAgICAgICAgIHRydWUsIENvbE1ham9yLGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KQotICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8MCwgICAgICAgICAgdHJ1ZSwgUm93TWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpCi0gICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnwwLCAgICAgICAgICB0cnVlLCBSb3dNYWpvcixDb25qLCBDb2xNYWpvcixmYWxzZSxDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAwLAotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KQotICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsTG93ZXJ8MCwgICAgICAgICAgZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpCi0gICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnwwLCAgICAgICAgICBmYWxzZSxDb2xNYWpvcixmYWxzZSxSb3dNYWpvcixmYWxzZSxDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LFVwcGVyfDAsICAgICAgICAgIGZhbHNlLENvbE1ham9yLGZhbHNlLFJvd01ham9yLENvbmosIENvbE1ham9yLDE+OjpydW4pLAotICAgIDAsCi0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCi0gICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnxVbml0RGlhZyx0cnVlLCBDb2xNYWpvcixmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LExvd2VyfFVuaXREaWFnLHRydWUsIFJvd01ham9yLGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KQotICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsTG93ZXJ8VW5pdERpYWcsdHJ1ZSwgUm93TWFqb3IsQ29uaiwgQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgMCwKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LFVwcGVyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yLGZhbHNlLENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KQotICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsTG93ZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3IsZmFsc2UsUm93TWFqb3IsZmFsc2UsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCi0gICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxMb3dlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcixmYWxzZSxSb3dNYWpvcixDb25qLCBDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAwLAotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQotICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsTG93ZXJ8VW5pdERpYWcsdHJ1ZSwgQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsMT46OnJ1biksCi0gICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCi0gICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxVcHBlcnxVbml0RGlhZyx0cnVlLCBSb3dNYWpvcixmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LFVwcGVyfFVuaXREaWFnLHRydWUsIFJvd01ham9yLENvbmosIENvbE1ham9yLGZhbHNlLENvbE1ham9yLDE+OjpydW4pLAotICAgIDAsCi0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCi0gICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsRGVuc2VJbmRleCxMb3dlcnxVbml0RGlhZyxmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvcixmYWxzZSxDb2xNYWpvciwxPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCkKLSAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LFVwcGVyfFVuaXREaWFnLGZhbHNlLENvbE1ham9yLGZhbHNlLFJvd01ham9yLGZhbHNlLENvbE1ham9yLDE+OjpydW4pLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQotICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsVXBwZXJ8VW5pdERpYWcsZmFsc2UsQ29sTWFqb3IsZmFsc2UsUm93TWFqb3IsQ29uaiwgQ29sTWFqb3IsMT46OnJ1biksCi0gICAgMAotICB9OworICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgVXBwZXIgfCAwLCB0cnVlLCBDb2xNYWpvciwgZmFsc2UsIENvbE1ham9yLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3IsIDE+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgTG93ZXIgfCAwLCB0cnVlLCBSb3dNYWpvciwgZmFsc2UsIENvbE1ham9yLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3IsIDE+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgTG93ZXIgfCAwLCB0cnVlLCBSb3dNYWpvciwgQ29uaiwgQ29sTWFqb3IsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgVXBwZXIgfCAwLCBmYWxzZSwgQ29sTWFqb3IsIGZhbHNlLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIENvbE1ham9yLCAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIExvd2VyIHwgMCwgZmFsc2UsIENvbE1ham9yLCBmYWxzZSwgUm93TWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBMb3dlciB8IDAsIGZhbHNlLCBDb2xNYWpvciwgZmFsc2UsIFJvd01ham9yLCBDb25qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgTG93ZXIgfCAwLCB0cnVlLCBDb2xNYWpvciwgZmFsc2UsIENvbE1ham9yLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3IsIDE+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgVXBwZXIgfCAwLCB0cnVlLCBSb3dNYWpvciwgZmFsc2UsIENvbE1ham9yLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3IsIDE+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgVXBwZXIgfCAwLCB0cnVlLCBSb3dNYWpvciwgQ29uaiwgQ29sTWFqb3IsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKE5VTklUIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgTG93ZXIgfCAwLCBmYWxzZSwgQ29sTWFqb3IsIGZhbHNlLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIENvbE1ham9yLCAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChOVU5JVCA8PCA0KQorICAgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIFVwcGVyIHwgMCwgZmFsc2UsIENvbE1ham9yLCBmYWxzZSwgUm93TWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoTlVOSVQgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBVcHBlciB8IDAsIGZhbHNlLCBDb2xNYWpvciwgZmFsc2UsIFJvd01ham9yLCBDb25qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExFRlQgIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgVXBwZXIgfCBVbml0RGlhZywgdHJ1ZSwgQ29sTWFqb3IsIGZhbHNlLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIENvbE1ham9yLCAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMRUZUICA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KQorICAgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIExvd2VyIHwgVW5pdERpYWcsIHRydWUsIFJvd01ham9yLCBmYWxzZSwgQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTEVGVCAgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBMb3dlciB8IFVuaXREaWFnLCB0cnVlLCBSb3dNYWpvciwgQ29uaiwgQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKFVQIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgVXBwZXIgfCBVbml0RGlhZywgZmFsc2UsIENvbE1ham9yLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3IsIGZhbHNlLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoUklHSFQgPDwgMikgfCAoVVAgPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBMb3dlciB8IFVuaXREaWFnLCBmYWxzZSwgQ29sTWFqb3IsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dNYWpvciwgZmFsc2UsIENvbE1ham9yLCAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChSSUdIVCA8PCAyKSB8IChVUCA8PCAzKSB8IChVTklUICA8PCA0KQorICAgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIExvd2VyIHwgVW5pdERpYWcsIGZhbHNlLCBDb2xNYWpvciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvd01ham9yLCBDb25qLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExFRlQgIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgTG93ZXIgfCBVbml0RGlhZywgdHJ1ZSwgQ29sTWFqb3IsIGZhbHNlLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIENvbE1ham9yLCAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBUUiAgICB8IChMRUZUICA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQorICAgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIFVwcGVyIHwgVW5pdERpYWcsIHRydWUsIFJvd01ham9yLCBmYWxzZSwgQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTEVGVCAgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBVcHBlciB8IFVuaXREaWFnLCB0cnVlLCBSb3dNYWpvciwgQ29uaiwgQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFJJR0hUIDw8IDIpIHwgKExPIDw8IDMpIHwgKFVOSVQgIDw8IDQpCisgICAgICAoaW50ZXJuYWw6OnByb2R1Y3RfdHJpYW5ndWxhcl9tYXRyaXhfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgTG93ZXIgfCBVbml0RGlhZywgZmFsc2UsIENvbE1ham9yLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3IsIGZhbHNlLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoUklHSFQgPDwgMikgfCAoTE8gPDwgMykgfCAoVU5JVCAgPDwgNCkKKyAgICAgIChpbnRlcm5hbDo6cHJvZHVjdF90cmlhbmd1bGFyX21hdHJpeF9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBVcHBlciB8IFVuaXREaWFnLCBmYWxzZSwgQ29sTWFqb3IsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dNYWpvciwgZmFsc2UsIENvbE1ham9yLCAxPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChSSUdIVCA8PCAyKSB8IChMTyA8PCAzKSB8IChVTklUICA8PCA0KQorICAgICAgKGludGVybmFsOjpwcm9kdWN0X3RyaWFuZ3VsYXJfbWF0cml4X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIFVwcGVyIHwgVW5pdERpYWcsIGZhbHNlLCBDb2xNYWpvciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvd01ham9yLCBDb25qLCBDb2xNYWpvciwgMT46OnJ1biksCisgICAgICAwfTsKIAotICBjb25zdCBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhKTsKLSAgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYik7Ci0gIFNjYWxhciAgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYWxwaGEpOworICBjb25zdCBTY2FsYXIgKmEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYSk7CisgIFNjYWxhciAqYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBiKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBhbHBoYSk7CiAKICAgaW50IGluZm8gPSAwOwotICBpZihTSURFKCpzaWRlKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOwotICBlbHNlIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOwotICBlbHNlIGlmKE9QKCpvcGEpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOwotICBlbHNlIGlmKERJQUcoKmRpYWcpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA0OwotICBlbHNlIGlmKCptPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA1OwotICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA2OwotICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwoU0lERSgqc2lkZSk9PUxFRlQpPyptOipuKSkgICAgICAgICAgICAgICAgIGluZm8gPSA5OwotICBlbHNlIGlmKCpsZGI8c3RkOjptYXgoMSwqbSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxMTsKLSAgaWYoaW5mbykKLSAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlRSTU0gIiwmaW5mbyw2KTsKKyAgaWYgKFNJREUoKnNpZGUpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYgKFVQTE8oKnVwbG8pID09IElOVkFMSUQpCisgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYgKE9QKCpvcGEpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYgKERJQUcoKmRpYWcpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYgKCptIDwgMCkKKyAgICBpbmZvID0gNTsKKyAgZWxzZSBpZiAoKm4gPCAwKQorICAgIGluZm8gPSA2OworICBlbHNlIGlmICgqbGRhIDwgc3RkOjptYXgoMSwgKFNJREUoKnNpZGUpID09IExFRlQpID8gKm0gOiAqbikpCisgICAgaW5mbyA9IDk7CisgIGVsc2UgaWYgKCpsZGIgPCBzdGQ6Om1heCgxLCAqbSkpCisgICAgaW5mbyA9IDExOworICBpZiAoaW5mbykgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCAiVFJNTSAiLCAmaW5mbywgNik7CiAKICAgaW50IGNvZGUgPSBPUCgqb3BhKSB8IChTSURFKCpzaWRlKSA8PCAyKSB8IChVUExPKCp1cGxvKSA8PCAzKSB8IChESUFHKCpkaWFnKSA8PCA0KTsKIAotICBpZigqbT09MCB8fCAqbj09MCkKLSAgICByZXR1cm4gMTsKKyAgaWYgKCptID09IDAgfHwgKm4gPT0gMCkgcmV0dXJuIDE7CiAKICAgLy8gRklYTUUgZmluZCBhIHdheSB0byBhdm9pZCB0aGlzIGNvcHkKLSAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+IHRtcCA9IG1hdHJpeChiLCptLCpuLCpsZGIpOwotICBtYXRyaXgoYiwqbSwqbiwqbGRiKS5zZXRaZXJvKCk7CisgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIENvbE1ham9yPiB0bXAgPSBtYXRyaXgoYiwgKm0sICpuLCAqbGRiKTsKKyAgbWF0cml4KGIsICptLCAqbiwgKmxkYikuc2V0WmVybygpOwogCi0gIGlmKFNJREUoKnNpZGUpPT1MRUZUKQotICB7Ci0gICAgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8Q29sTWFqb3IsU2NhbGFyLFNjYWxhcixEeW5hbWljLER5bmFtaWMsRHluYW1pYyw0PiBibG9ja2luZygqbSwqbiwqbSwxLGZhbHNlKTsKKyAgaWYgKFNJREUoKnNpZGUpID09IExFRlQpIHsKKyAgICBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvciwgU2NhbGFyLCBTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIER5bmFtaWMsIDQ+IGJsb2NraW5nKCptLCAqbiwgKm0sIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgZnVuY1tjb2RlXSgqbSwgKm4sICptLCBhLCAqbGRhLCB0bXAuZGF0YSgpLCB0bXAub3V0ZXJTdHJpZGUoKSwgYiwgMSwgKmxkYiwgYWxwaGEsIGJsb2NraW5nKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvcixTY2FsYXIsU2NhbGFyLER5bmFtaWMsRHluYW1pYyxEeW5hbWljLDQ+IGJsb2NraW5nKCptLCpuLCpuLDEsZmFsc2UpOworICB9IGVsc2UgeworICAgIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPENvbE1ham9yLCBTY2FsYXIsIFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgRHluYW1pYywgND4gYmxvY2tpbmcoKm0sICpuLCAqbiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICBmdW5jW2NvZGVdKCptLCAqbiwgKm4sIHRtcC5kYXRhKCksIHRtcC5vdXRlclN0cmlkZSgpLCBhLCAqbGRhLCBiLCAxLCAqbGRiLCBhbHBoYSwgYmxvY2tpbmcpOwogICB9CiAgIHJldHVybiAxOwpAQCAtMjg1LDE0OSArMzQ5LDE3NyBAQAogLy8gYyA9IGFscGhhKmEqYiArIGJldGEqYyAgZm9yIHNpZGUgPSAnTCdvcidsJwogLy8gYyA9IGFscGhhKmIqYSArIGJldGEqYyAgZm9yIHNpZGUgPSAnUidvcidyCiBpbnQgRUlHRU5fQkxBU19GVU5DKHN5bW0pKGNvbnN0IGNoYXIgKnNpZGUsIGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGludCAqbSwgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGIsIGNvbnN0IGludCAqbGRiLCBjb25zdCBSZWFsU2NhbGFyICpwYmV0YSwgUmVhbFNjYWxhciAqcGMsIGNvbnN0IGludCAqbGRjKQotewotLy8gICBzdGQ6OmNlcnIgPDwgImluIHN5bW0gIiA8PCAqc2lkZSA8PCAiICIgPDwgKnVwbG8gPDwgIiAiIDw8ICptIDw8ICJ4IiA8PCAqbiA8PCAiIGxkYToiIDw8ICpsZGEgPDwgIiBsZGI6IiA8PCAqbGRiIDw8ICIgbGRjOiIgPDwgKmxkYyA8PCAiIGFscGhhOiIgPDwgKnBhbHBoYSA8PCAiIGJldGE6IiA8PCAqcGJldGEgPDwgIlxuIjsKLSAgY29uc3QgU2NhbGFyKiBhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYSk7Ci0gIGNvbnN0IFNjYWxhciogYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGIpOwotICBTY2FsYXIqIGMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKLSAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKLSAgU2NhbGFyIGJldGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGJldGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYSwgY29uc3QgaW50ICpsZGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBiLCBjb25zdCBpbnQgKmxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBjb25zdCBpbnQgKmxkYykgeworICAvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gc3ltbSAiIDw8ICpzaWRlIDw8ICIgIiA8PCAqdXBsbyA8PCAiICIgPDwgKm0gPDwgIngiIDw8ICpuIDw8ICIgbGRhOiIgPDwgKmxkYSA8PCAiIGxkYjoiIDw8ICpsZGIKKyAgLy8gICA8PCAiIGxkYzoiIDw8ICpsZGMgPDwgIiBhbHBoYToiIDw8ICpwYWxwaGEgPDwgIiBiZXRhOiIgPDwgKnBiZXRhIDw8ICJcbiI7CisgIGNvbnN0IFNjYWxhciAqYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBhKTsKKyAgY29uc3QgU2NhbGFyICpiID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGIpOworICBTY2FsYXIgKmMgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYyk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYWxwaGEpOworICBTY2FsYXIgYmV0YSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYmV0YSk7CiAKICAgaW50IGluZm8gPSAwOwotICBpZihTSURFKCpzaWRlKT09SU5WQUxJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxOwotICBlbHNlIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAyOwotICBlbHNlIGlmKCptPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAzOwotICBlbHNlIGlmKCpuPDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA0OwotICBlbHNlIGlmKCpsZGE8c3RkOjptYXgoMSwoU0lERSgqc2lkZSk9PUxFRlQpPyptOipuKSkgICAgICAgICAgICAgICAgIGluZm8gPSA3OwotICBlbHNlIGlmKCpsZGI8c3RkOjptYXgoMSwqbSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSA5OwotICBlbHNlIGlmKCpsZGM8c3RkOjptYXgoMSwqbSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAxMjsKLSAgaWYoaW5mbykKLSAgICByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQIlNZTU0gIiwmaW5mbyw2KTsKKyAgaWYgKFNJREUoKnNpZGUpID09IElOVkFMSUQpCisgICAgaW5mbyA9IDE7CisgIGVsc2UgaWYgKFVQTE8oKnVwbG8pID09IElOVkFMSUQpCisgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYgKCptIDwgMCkKKyAgICBpbmZvID0gMzsKKyAgZWxzZSBpZiAoKm4gPCAwKQorICAgIGluZm8gPSA0OworICBlbHNlIGlmICgqbGRhIDwgc3RkOjptYXgoMSwgKFNJREUoKnNpZGUpID09IExFRlQpID8gKm0gOiAqbikpCisgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYgKCpsZGIgPCBzdGQ6Om1heCgxLCAqbSkpCisgICAgaW5mbyA9IDk7CisgIGVsc2UgaWYgKCpsZGMgPCBzdGQ6Om1heCgxLCAqbSkpCisgICAgaW5mbyA9IDEyOworICBpZiAoaW5mbykgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCAiU1lNTSAiLCAmaW5mbywgNik7CiAKLSAgaWYoYmV0YSE9U2NhbGFyKDEpKQotICB7Ci0gICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm0sICpuLCAqbGRjKS5zZXRaZXJvKCk7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKSAqPSBiZXRhOworICBpZiAoYmV0YSAhPSBTY2FsYXIoMSkpIHsKKyAgICBpZiAoYmV0YSA9PSBTY2FsYXIoMCkpCisgICAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKS5zZXRaZXJvKCk7CisgICAgZWxzZQorICAgICAgbWF0cml4KGMsICptLCAqbiwgKmxkYykgKj0gYmV0YTsKICAgfQogCi0gIGlmKCptPT0wIHx8ICpuPT0wKQotICB7CisgIGlmICgqbSA9PSAwIHx8ICpuID09IDApIHsKICAgICByZXR1cm4gMTsKICAgfQogCi0gIGludCBzaXplID0gKFNJREUoKnNpZGUpPT1MRUZUKSA/ICgqbSkgOiAoKm4pOwotICAjaWYgSVNDT01QTEVYCisgIGludCBzaXplID0gKFNJREUoKnNpZGUpID09IExFRlQpID8gKCptKSA6ICgqbik7CisjaWYgSVNDT01QTEVYCiAgIC8vIEZJWE1FIGFkZCBzdXBwb3J0IGZvciBzeW1tZXRyaWMgY29tcGxleCBtYXRyaXgKLSAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+IG1hdEEoc2l6ZSxzaXplKTsKLSAgaWYoVVBMTygqdXBsbyk9PVVQKQotICB7Ci0gICAgbWF0QS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IG1hdHJpeChhLHNpemUsc2l6ZSwqbGRhKTsKLSAgICBtYXRBLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpID0gbWF0cml4KGEsc2l6ZSxzaXplLCpsZGEpLnRyYW5zcG9zZSgpOworICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBDb2xNYWpvcj4gbWF0QShzaXplLCBzaXplKTsKKyAgaWYgKFVQTE8oKnVwbG8pID09IFVQKSB7CisgICAgbWF0QS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IG1hdHJpeChhLCBzaXplLCBzaXplLCAqbGRhKTsKKyAgICBtYXRBLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpID0gbWF0cml4KGEsIHNpemUsIHNpemUsICpsZGEpLnRyYW5zcG9zZSgpOworICB9IGVsc2UgaWYgKFVQTE8oKnVwbG8pID09IExPKSB7CisgICAgbWF0QS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSA9IG1hdHJpeChhLCBzaXplLCBzaXplLCAqbGRhKTsKKyAgICBtYXRBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpID0gbWF0cml4KGEsIHNpemUsIHNpemUsICpsZGEpLnRyYW5zcG9zZSgpOwogICB9Ci0gIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKQotICB7Ci0gICAgbWF0QS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSA9IG1hdHJpeChhLHNpemUsc2l6ZSwqbGRhKTsKLSAgICBtYXRBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpID0gbWF0cml4KGEsc2l6ZSxzaXplLCpsZGEpLnRyYW5zcG9zZSgpOwotICB9Ci0gIGlmKFNJREUoKnNpZGUpPT1MRUZUKQorICBpZiAoU0lERSgqc2lkZSkgPT0gTEVGVCkKICAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKSArPSBhbHBoYSAqIG1hdEEgKiBtYXRyaXgoYiwgKm0sICpuLCAqbGRiKTsKLSAgZWxzZSBpZihTSURFKCpzaWRlKT09UklHSFQpCisgIGVsc2UgaWYgKFNJREUoKnNpZGUpID09IFJJR0hUKQogICAgIG1hdHJpeChjLCAqbSwgKm4sICpsZGMpICs9IGFscGhhICogbWF0cml4KGIsICptLCAqbiwgKmxkYikgKiBtYXRBOwotICAjZWxzZQotICBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvcixTY2FsYXIsU2NhbGFyLER5bmFtaWMsRHluYW1pYyxEeW5hbWljPiBibG9ja2luZygqbSwqbixzaXplLDEsZmFsc2UpOworI2Vsc2UKKyAgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8Q29sTWFqb3IsIFNjYWxhciwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBEeW5hbWljPiBibG9ja2luZygqbSwgKm4sIHNpemUsIDEsIGZhbHNlKTsKIAotICBpZihTSURFKCpzaWRlKT09TEVGVCkKLSAgICBpZihVUExPKCp1cGxvKT09VVApICAgICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIFJvd01ham9yLHRydWUsZmFsc2UsIENvbE1ham9yLGZhbHNlLGZhbHNlLCBDb2xNYWpvciwxPjo6cnVuKCptLCAqbiwgYSwgKmxkYSwgYiwgKmxkYiwgYywgMSwgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKLSAgICBlbHNlIGlmKFVQTE8oKnVwbG8pPT1MTykgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIENvbE1ham9yLHRydWUsZmFsc2UsIENvbE1ham9yLGZhbHNlLGZhbHNlLCBDb2xNYWpvciwxPjo6cnVuKCptLCAqbiwgYSwgKmxkYSwgYiwgKmxkYiwgYywgMSwgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICBlbHNlIGlmKFNJREUoKnNpZGUpPT1SSUdIVCkKLSAgICBpZihVUExPKCp1cGxvKT09VVApICAgICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIENvbE1ham9yLGZhbHNlLGZhbHNlLCBSb3dNYWpvcix0cnVlLGZhbHNlLCBDb2xNYWpvciwxPjo6cnVuKCptLCAqbiwgYiwgKmxkYiwgYSwgKmxkYSwgYywgMSwgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKLSAgICBlbHNlIGlmKFVQTE8oKnVwbG8pPT1MTykgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIENvbE1ham9yLGZhbHNlLGZhbHNlLCBDb2xNYWpvcix0cnVlLGZhbHNlLCBDb2xNYWpvciwxPjo6cnVuKCptLCAqbiwgYiwgKmxkYiwgYSwgKmxkYSwgYywgMSwgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICBpZiAoU0lERSgqc2lkZSkgPT0gTEVGVCkKKyAgICBpZiAoVVBMTygqdXBsbykgPT0gVVApCisgICAgICBpbnRlcm5hbDo6cHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8U2NhbGFyLCBEZW5zZUluZGV4LCBSb3dNYWpvciwgdHJ1ZSwgZmFsc2UsIENvbE1ham9yLCBmYWxzZSwgZmFsc2UsIENvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+OjpydW4oKm0sICpuLCBhLCAqbGRhLCBiLCAqbGRiLCBjLCAxLCAqbGRjLCBhbHBoYSwgYmxvY2tpbmcpOworICAgIGVsc2UgaWYgKFVQTE8oKnVwbG8pID09IExPKQorICAgICAgaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgQ29sTWFqb3IsIHRydWUsIGZhbHNlLCBDb2xNYWpvciwgZmFsc2UsIGZhbHNlLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKCptLCAqbiwgYSwgKmxkYSwgYiwgKmxkYiwgYywgMSwgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgZWxzZSBpZiAoU0lERSgqc2lkZSkgPT0gUklHSFQpCisgICAgaWYgKFVQTE8oKnVwbG8pID09IFVQKQorICAgICAgaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhciwgRGVuc2VJbmRleCwgQ29sTWFqb3IsIGZhbHNlLCBmYWxzZSwgUm93TWFqb3IsIHRydWUsIGZhbHNlLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKCptLCAqbiwgYiwgKmxkYiwgYSwgKmxkYSwgYywgMSwgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKKyAgICBlbHNlIGlmIChVUExPKCp1cGxvKSA9PSBMTykKKyAgICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIENvbE1ham9yLCBmYWxzZSwgZmFsc2UsIENvbE1ham9yLCB0cnVlLCBmYWxzZSwgQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT46OnJ1bigqbSwgKm4sIGIsICpsZGIsIGEsICpsZGEsIGMsIDEsICpsZGMsIGFscGhhLCBibG9ja2luZyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CiAgIGVsc2UKICAgICByZXR1cm4gMDsKLSAgI2VuZGlmCisjZW5kaWYKIAogICByZXR1cm4gMDsKIH0KIAogLy8gYyA9IGFscGhhKmEqYScgKyBiZXRhKmMgIGZvciBvcCA9ICdOJ29yJ24nCiAvLyBjID0gYWxwaGEqYScqYSArIGJldGEqYyAgZm9yIG9wID0gJ1Qnb3IndCcsJ0Mnb3InYycKLWludCBFSUdFTl9CTEFTX0ZVTkMoc3lyaykoY29uc3QgY2hhciAqdXBsbywgY29uc3QgY2hhciAqb3AsIGNvbnN0IGludCAqbiwgY29uc3QgaW50ICprLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBjb25zdCBpbnQgKmxkYykKLXsKLS8vICAgc3RkOjpjZXJyIDw8ICJpbiBzeXJrICIgPDwgKnVwbG8gPDwgIiAiIDw8ICpvcCA8PCAiICIgPDwgKm4gPDwgIiAiIDw8ICprIDw8ICIgIiA8PCAqcGFscGhhIDw8ICIgIiA8PCAqbGRhIDw8ICIgIiA8PCAqcGJldGEgPDwgIiAiIDw8ICpsZGMgPDwgIlxuIjsKLSAgI2lmICFJU0NPTVBMRVgKLSAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgU2NhbGFyICosIERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciYsIGludGVybmFsOjpsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mKTsKK2ludCBFSUdFTl9CTEFTX0ZVTkMoc3lyaykoY29uc3QgY2hhciAqdXBsbywgY29uc3QgY2hhciAqb3AsIGNvbnN0IGludCAqbiwgY29uc3QgaW50ICprLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmxkYykgeworICAvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gc3lyayAiIDw8ICp1cGxvIDw8ICIgIiA8PCAqb3AgPDwgIiAiIDw8ICpuIDw8ICIgIiA8PCAqayA8PCAiICIgPDwgKnBhbHBoYSA8PCAiICIgPDwgKmxkYSA8PCAiICIKKyAgLy8gICA8PCAqcGJldGEgPDwgIiAiIDw8ICpsZGMgPDwgIlxuIjsKKyNpZiAhSVNDT01QTEVYCisgIHR5cGVkZWYgdm9pZCAoKmZ1bmN0eXBlKShEZW5zZUluZGV4LCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyICosIERlbnNlSW5kZXgsIFNjYWxhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VJbmRleCwgRGVuc2VJbmRleCwgY29uc3QgU2NhbGFyICYsIGludGVybmFsOjpsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLCBTY2FsYXI+ICYpOwogICBzdGF0aWMgY29uc3QgZnVuY3R5cGUgZnVuY1s4XSA9IHsKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoVVAgPDwgMikKLSAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsQ29sTWFqb3IsZmFsc2UsU2NhbGFyLFJvd01ham9yLENvbmosQ29sTWFqb3IsIDEsIFVwcGVyPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVVAgPDwgMikKLSAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsZmFsc2UsU2NhbGFyLENvbE1ham9yLENvbmosQ29sTWFqb3IsIDEsIFVwcGVyPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikKLSAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsQ29uaiwgU2NhbGFyLENvbE1ham9yLGZhbHNlLENvbE1ham9yLCAxLCBVcHBlcj46OnJ1biksCi0gICAgMCwKLSAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTE8gPDwgMikKLSAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsQ29sTWFqb3IsZmFsc2UsU2NhbGFyLFJvd01ham9yLENvbmosQ29sTWFqb3IsIDEsIExvd2VyPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoTE8gPDwgMikKLSAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsZmFsc2UsU2NhbGFyLENvbE1ham9yLENvbmosQ29sTWFqb3IsIDEsIExvd2VyPjo6cnVuKSwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoTE8gPDwgMikKLSAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsQ29uaiwgU2NhbGFyLENvbE1ham9yLGZhbHNlLENvbE1ham9yLCAxLCBMb3dlcj46OnJ1biksCi0gICAgMAotICB9OwotICAjZW5kaWYKKyAgICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChVUCA8PCAyKQorICAgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PERlbnNlSW5kZXgsIFNjYWxhciwgQ29sTWFqb3IsIGZhbHNlLCBTY2FsYXIsIFJvd01ham9yLCBDb25qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbE1ham9yLCAxLCBVcHBlcj46OnJ1biksCisgICAgICAvLyBhcnJheSBpbmRleDogVFIgICAgfCAoVVAgPDwgMikKKyAgICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxEZW5zZUluZGV4LCBTY2FsYXIsIFJvd01ham9yLCBmYWxzZSwgU2NhbGFyLCBDb2xNYWpvciwgQ29uaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xNYWpvciwgMSwgVXBwZXI+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKFVQIDw8IDIpCisgICAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCwgU2NhbGFyLCBSb3dNYWpvciwgQ29uaiwgU2NhbGFyLCBDb2xNYWpvciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3IsIDEsIFVwcGVyPjo6cnVuKSwKKyAgICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogTk9UUiAgfCAoTE8gPDwgMikKKyAgICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxEZW5zZUluZGV4LCBTY2FsYXIsIENvbE1ham9yLCBmYWxzZSwgU2NhbGFyLCBSb3dNYWpvciwgQ29uaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xNYWpvciwgMSwgTG93ZXI+OjpydW4pLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IFRSICAgIHwgKExPIDw8IDIpCisgICAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCwgU2NhbGFyLCBSb3dNYWpvciwgZmFsc2UsIFNjYWxhciwgQ29sTWFqb3IsIENvbmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3IsIDEsIExvd2VyPjo6cnVuKSwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMTyA8PCAyKQorICAgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PERlbnNlSW5kZXgsIFNjYWxhciwgUm93TWFqb3IsIENvbmosIFNjYWxhciwgQ29sTWFqb3IsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbE1ham9yLCAxLCBMb3dlcj46OnJ1biksCisgICAgICAwfTsKKyNlbmRpZgogCi0gIGNvbnN0IFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGEpOwotICBTY2FsYXIqIGMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKLSAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGFscGhhKTsKLSAgU2NhbGFyIGJldGEgID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGJldGEpOworICBjb25zdCBTY2FsYXIgKmEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYSk7CisgIFNjYWxhciAqYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBjKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBhbHBoYSk7CisgIFNjYWxhciBiZXRhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBiZXRhKTsKIAogICBpbnQgaW5mbyA9IDA7Ci0gIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7Ci0gIGVsc2UgaWYoT1AoKm9wKT09SU5WQUxJRCB8fCAoSVNDT01QTEVYICYmIE9QKCpvcCk9PUFESikgKSAgICAgICAgICAgaW5mbyA9IDI7Ci0gIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7Ci0gIGVsc2UgaWYoKms8MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7Ci0gIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLChPUCgqb3ApPT1OT1RSKT8qbjoqaykpICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7Ci0gIGVsc2UgaWYoKmxkYzxzdGQ6Om1heCgxLCpuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDEwOwotICBpZihpbmZvKQotICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiU1lSSyAiLCZpbmZvLDYpOworICBpZiAoVVBMTygqdXBsbykgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMTsKKyAgZWxzZSBpZiAoT1AoKm9wKSA9PSBJTlZBTElEIHx8IChJU0NPTVBMRVggJiYgT1AoKm9wKSA9PSBBREopKQorICAgIGluZm8gPSAyOworICBlbHNlIGlmICgqbiA8IDApCisgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYgKCprIDwgMCkKKyAgICBpbmZvID0gNDsKKyAgZWxzZSBpZiAoKmxkYSA8IHN0ZDo6bWF4KDEsIChPUCgqb3ApID09IE5PVFIpID8gKm4gOiAqaykpCisgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYgKCpsZGMgPCBzdGQ6Om1heCgxLCAqbikpCisgICAgaW5mbyA9IDEwOworICBpZiAoaW5mbykgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCAiU1lSSyAiLCAmaW5mbywgNik7CiAKLSAgaWYoYmV0YSE9U2NhbGFyKDEpKQotICB7Ci0gICAgaWYoVVBMTygqdXBsbyk9PVVQKQotICAgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zZXRaZXJvKCk7Ci0gICAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICo9IGJldGE7CisgIGlmIChiZXRhICE9IFNjYWxhcigxKSkgeworICAgIGlmIChVUExPKCp1cGxvKSA9PSBVUCkKKyAgICAgIGlmIChiZXRhID09IFNjYWxhcigwKSkKKyAgICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc2V0WmVybygpOworICAgICAgZWxzZQorICAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqPSBiZXRhOworICAgIGVsc2UgaWYgKGJldGEgPT0gU2NhbGFyKDApKQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc2V0WmVybygpOwogICAgIGVsc2UKLSAgICAgIGlmKGJldGE9PVNjYWxhcigwKSkgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc2V0WmVybygpOwotICAgICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSAqPSBiZXRhOworICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKj0gYmV0YTsKICAgfQogCi0gIGlmKCpuPT0wIHx8ICprPT0wKQotICAgIHJldHVybiAwOworICBpZiAoKm4gPT0gMCB8fCAqayA9PSAwKSByZXR1cm4gMDsKIAotICAjaWYgSVNDT01QTEVYCisjaWYgSVNDT01QTEVYCiAgIC8vIEZJWE1FIGFkZCBzdXBwb3J0IGZvciBzeW1tZXRyaWMgY29tcGxleCBtYXRyaXgKLSAgaWYoVVBMTygqdXBsbyk9PVVQKQotICB7Ci0gICAgaWYoT1AoKm9wKT09Tk9UUikKLSAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICs9IGFscGhhICogbWF0cml4KGEsKm4sKmssKmxkYSkgKiBtYXRyaXgoYSwqbiwqaywqbGRhKS50cmFuc3Bvc2UoKTsKKyAgaWYgKFVQTE8oKnVwbG8pID09IFVQKSB7CisgICAgaWYgKE9QKCpvcCkgPT0gTk9UUikKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICs9CisgICAgICAgICAgYWxwaGEgKiBtYXRyaXgoYSwgKm4sICprLCAqbGRhKSAqIG1hdHJpeChhLCAqbiwgKmssICpsZGEpLnRyYW5zcG9zZSgpOwogICAgIGVsc2UKLSAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICs9IGFscGhhICogbWF0cml4KGEsKmssKm4sKmxkYSkudHJhbnNwb3NlKCkgKiBtYXRyaXgoYSwqaywqbiwqbGRhKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBpZihPUCgqb3ApPT1OT1RSKQotICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKz0gYWxwaGEgKiBtYXRyaXgoYSwqbiwqaywqbGRhKSAqIG1hdHJpeChhLCpuLCprLCpsZGEpLnRyYW5zcG9zZSgpOworICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKz0KKyAgICAgICAgICBhbHBoYSAqIG1hdHJpeChhLCAqaywgKm4sICpsZGEpLnRyYW5zcG9zZSgpICogbWF0cml4KGEsICprLCAqbiwgKmxkYSk7CisgIH0gZWxzZSB7CisgICAgaWYgKE9QKCpvcCkgPT0gTk9UUikKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICs9CisgICAgICAgICAgYWxwaGEgKiBtYXRyaXgoYSwgKm4sICprLCAqbGRhKSAqIG1hdHJpeChhLCAqbiwgKmssICpsZGEpLnRyYW5zcG9zZSgpOwogICAgIGVsc2UKLSAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICs9IGFscGhhICogbWF0cml4KGEsKmssKm4sKmxkYSkudHJhbnNwb3NlKCkgKiBtYXRyaXgoYSwqaywqbiwqbGRhKTsKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICs9CisgICAgICAgICAgYWxwaGEgKiBtYXRyaXgoYSwgKmssICpuLCAqbGRhKS50cmFuc3Bvc2UoKSAqIG1hdHJpeChhLCAqaywgKm4sICpsZGEpOwogICB9Ci0gICNlbHNlCi0gIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPENvbE1ham9yLFNjYWxhcixTY2FsYXIsRHluYW1pYyxEeW5hbWljLER5bmFtaWM+IGJsb2NraW5nKCpuLCpuLCprLDEsZmFsc2UpOworI2Vsc2UKKyAgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8Q29sTWFqb3IsIFNjYWxhciwgU2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBEeW5hbWljPiBibG9ja2luZygqbiwgKm4sICprLCAxLCBmYWxzZSk7CiAKICAgaW50IGNvZGUgPSBPUCgqb3ApIHwgKFVQTE8oKnVwbG8pIDw8IDIpOwogICBmdW5jW2NvZGVdKCpuLCAqaywgYSwgKmxkYSwgYSwgKmxkYSwgYywgMSwgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKLSAgI2VuZGlmCisjZW5kaWYKIAogICByZXR1cm4gMDsKIH0KQEAgLTQzNSwxMjQgKzUyNywxMzkgQEAKIC8vIGMgPSBhbHBoYSphKmInICsgYWxwaGEqYiphJyArIGJldGEqYyAgZm9yIG9wID0gJ04nb3InbicKIC8vIGMgPSBhbHBoYSphJypiICsgYWxwaGEqYicqYSArIGJldGEqYyAgZm9yIG9wID0gJ1Qnb3IndCcKIGludCBFSUdFTl9CTEFTX0ZVTkMoc3lyMmspKGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGNoYXIgKm9wLCBjb25zdCBpbnQgKm4sIGNvbnN0IGludCAqaywgY29uc3QgUmVhbFNjYWxhciAqcGFscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciAqcGEsIGNvbnN0IGludCAqbGRhLCBjb25zdCBSZWFsU2NhbGFyICpwYiwgY29uc3QgaW50ICpsZGIsIGNvbnN0IFJlYWxTY2FsYXIgKnBiZXRhLCBSZWFsU2NhbGFyICpwYywgY29uc3QgaW50ICpsZGMpCi17Ci0gIGNvbnN0IFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGEpOwotICBjb25zdCBTY2FsYXIqIGIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBiKTsKLSAgU2NhbGFyKiBjID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIqPihwYyk7Ci0gIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhbHBoYSk7Ci0gIFNjYWxhciBiZXRhICA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBiZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGIsIGNvbnN0IGludCAqbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciAqcGJldGEsIFJlYWxTY2FsYXIgKnBjLCBjb25zdCBpbnQgKmxkYykgeworICBjb25zdCBTY2FsYXIgKmEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYSk7CisgIGNvbnN0IFNjYWxhciAqYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBiKTsKKyAgU2NhbGFyICpjID0gcmVpbnRlcnByZXRfY2FzdDxTY2FsYXIgKj4ocGMpOworICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGFscGhhKTsKKyAgU2NhbGFyIGJldGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGJldGEpOwogCi0vLyAgIHN0ZDo6Y2VyciA8PCAiaW4gc3lyMmsgIiA8PCAqdXBsbyA8PCAiICIgPDwgKm9wIDw8ICIgIiA8PCAqbiA8PCAiICIgPDwgKmsgPDwgIiAiIDw8IGFscGhhIDw8ICIgIiA8PCAqbGRhIDw8ICIgIiA8PCAqbGRiIDw8ICIgIiA8PCBiZXRhIDw8ICIgIiA8PCAqbGRjIDw8ICJcbiI7CisgIC8vICAgc3RkOjpjZXJyIDw8ICJpbiBzeXIyayAiIDw8ICp1cGxvIDw8ICIgIiA8PCAqb3AgPDwgIiAiIDw8ICpuIDw8ICIgIiA8PCAqayA8PCAiICIgPDwgYWxwaGEgPDwgIiAiIDw8ICpsZGEgPDwgIiAiCisgIC8vICAgPDwgKmxkYiA8PCAiICIgPDwgYmV0YSA8PCAiICIgPDwgKmxkYyA8PCAiXG4iOwogCiAgIGludCBpbmZvID0gMDsKLSAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKLSAgZWxzZSBpZihPUCgqb3ApPT1JTlZBTElEIHx8IChJU0NPTVBMRVggJiYgT1AoKm9wKT09QURKKSApICAgICAgICAgICBpbmZvID0gMjsKLSAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKLSAgZWxzZSBpZigqazwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKLSAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKE9QKCpvcCk9PU5PVFIpPypuOiprKSkgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKLSAgZWxzZSBpZigqbGRiPHN0ZDo6bWF4KDEsKE9QKCpvcCk9PU5PVFIpPypuOiprKSkgICAgICAgICAgICAgICAgICAgICBpbmZvID0gOTsKLSAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTI7Ci0gIGlmKGluZm8pCi0gICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJTWVIySyIsJmluZm8sNik7CisgIGlmIChVUExPKCp1cGxvKSA9PSBJTlZBTElEKQorICAgIGluZm8gPSAxOworICBlbHNlIGlmIChPUCgqb3ApID09IElOVkFMSUQgfHwgKElTQ09NUExFWCAmJiBPUCgqb3ApID09IEFESikpCisgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYgKCpuIDwgMCkKKyAgICBpbmZvID0gMzsKKyAgZWxzZSBpZiAoKmsgPCAwKQorICAgIGluZm8gPSA0OworICBlbHNlIGlmICgqbGRhIDwgc3RkOjptYXgoMSwgKE9QKCpvcCkgPT0gTk9UUikgPyAqbiA6ICprKSkKKyAgICBpbmZvID0gNzsKKyAgZWxzZSBpZiAoKmxkYiA8IHN0ZDo6bWF4KDEsIChPUCgqb3ApID09IE5PVFIpID8gKm4gOiAqaykpCisgICAgaW5mbyA9IDk7CisgIGVsc2UgaWYgKCpsZGMgPCBzdGQ6Om1heCgxLCAqbikpCisgICAgaW5mbyA9IDEyOworICBpZiAoaW5mbykgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCAiU1lSMksiLCAmaW5mbywgNik7CiAKLSAgaWYoYmV0YSE9U2NhbGFyKDEpKQotICB7Ci0gICAgaWYoVVBMTygqdXBsbyk9PVVQKQotICAgICAgaWYoYmV0YT09U2NhbGFyKDApKSBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zZXRaZXJvKCk7Ci0gICAgICBlbHNlICAgICAgICAgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICo9IGJldGE7CisgIGlmIChiZXRhICE9IFNjYWxhcigxKSkgeworICAgIGlmIChVUExPKCp1cGxvKSA9PSBVUCkKKyAgICAgIGlmIChiZXRhID09IFNjYWxhcigwKSkKKyAgICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc2V0WmVybygpOworICAgICAgZWxzZQorICAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqPSBiZXRhOworICAgIGVsc2UgaWYgKGJldGEgPT0gU2NhbGFyKDApKQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc2V0WmVybygpOwogICAgIGVsc2UKLSAgICAgIGlmKGJldGE9PVNjYWxhcigwKSkgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc2V0WmVybygpOwotICAgICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSAqPSBiZXRhOworICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKj0gYmV0YTsKICAgfQogCi0gIGlmKCprPT0wKQotICAgIHJldHVybiAxOworICBpZiAoKmsgPT0gMCkgcmV0dXJuIDE7CiAKLSAgaWYoT1AoKm9wKT09Tk9UUikKLSAgewotICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkKLSAgICB7Ci0gICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKQotICAgICAgICArPSBhbHBoYSAqbWF0cml4KGEsICpuLCAqaywgKmxkYSkqbWF0cml4KGIsICpuLCAqaywgKmxkYikudHJhbnNwb3NlKCkKLSAgICAgICAgKyAgYWxwaGEqbWF0cml4KGIsICpuLCAqaywgKmxkYikqbWF0cml4KGEsICpuLCAqaywgKmxkYSkudHJhbnNwb3NlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKQotICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkKLSAgICAgICAgKz0gYWxwaGEqbWF0cml4KGEsICpuLCAqaywgKmxkYSkqbWF0cml4KGIsICpuLCAqaywgKmxkYikudHJhbnNwb3NlKCkKLSAgICAgICAgKyAgYWxwaGEqbWF0cml4KGIsICpuLCAqaywgKmxkYikqbWF0cml4KGEsICpuLCAqaywgKmxkYSkudHJhbnNwb3NlKCk7Ci0gIH0KLSAgZWxzZSBpZihPUCgqb3ApPT1UUiB8fCBPUCgqb3ApPT1BREopCi0gIHsKLSAgICBpZihVUExPKCp1cGxvKT09VVApCi0gICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKQotICAgICAgICArPSBhbHBoYSptYXRyaXgoYSwgKmssICpuLCAqbGRhKS50cmFuc3Bvc2UoKSptYXRyaXgoYiwgKmssICpuLCAqbGRiKQotICAgICAgICArICBhbHBoYSptYXRyaXgoYiwgKmssICpuLCAqbGRiKS50cmFuc3Bvc2UoKSptYXRyaXgoYSwgKmssICpuLCAqbGRhKTsKLSAgICBlbHNlIGlmKFVQTE8oKnVwbG8pPT1MTykKLSAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpCi0gICAgICAgICs9IGFscGhhKm1hdHJpeChhLCAqaywgKm4sICpsZGEpLnRyYW5zcG9zZSgpKm1hdHJpeChiLCAqaywgKm4sICpsZGIpCi0gICAgICAgICsgIGFscGhhKm1hdHJpeChiLCAqaywgKm4sICpsZGIpLnRyYW5zcG9zZSgpKm1hdHJpeChhLCAqaywgKm4sICpsZGEpOworICBpZiAoT1AoKm9wKSA9PSBOT1RSKSB7CisgICAgaWYgKFVQTE8oKnVwbG8pID09IFVQKSB7CisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSArPQorICAgICAgICAgIGFscGhhICogbWF0cml4KGEsICpuLCAqaywgKmxkYSkgKiBtYXRyaXgoYiwgKm4sICprLCAqbGRiKS50cmFuc3Bvc2UoKSArCisgICAgICAgICAgYWxwaGEgKiBtYXRyaXgoYiwgKm4sICprLCAqbGRiKSAqIG1hdHJpeChhLCAqbiwgKmssICpsZGEpLnRyYW5zcG9zZSgpOworICAgIH0gZWxzZSBpZiAoVVBMTygqdXBsbykgPT0gTE8pCisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSArPQorICAgICAgICAgIGFscGhhICogbWF0cml4KGEsICpuLCAqaywgKmxkYSkgKiBtYXRyaXgoYiwgKm4sICprLCAqbGRiKS50cmFuc3Bvc2UoKSArCisgICAgICAgICAgYWxwaGEgKiBtYXRyaXgoYiwgKm4sICprLCAqbGRiKSAqIG1hdHJpeChhLCAqbiwgKmssICpsZGEpLnRyYW5zcG9zZSgpOworICB9IGVsc2UgaWYgKE9QKCpvcCkgPT0gVFIgfHwgT1AoKm9wKSA9PSBBREopIHsKKyAgICBpZiAoVVBMTygqdXBsbykgPT0gVVApCisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSArPQorICAgICAgICAgIGFscGhhICogbWF0cml4KGEsICprLCAqbiwgKmxkYSkudHJhbnNwb3NlKCkgKiBtYXRyaXgoYiwgKmssICpuLCAqbGRiKSArCisgICAgICAgICAgYWxwaGEgKiBtYXRyaXgoYiwgKmssICpuLCAqbGRiKS50cmFuc3Bvc2UoKSAqIG1hdHJpeChhLCAqaywgKm4sICpsZGEpOworICAgIGVsc2UgaWYgKFVQTE8oKnVwbG8pID09IExPKQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKz0KKyAgICAgICAgICBhbHBoYSAqIG1hdHJpeChhLCAqaywgKm4sICpsZGEpLnRyYW5zcG9zZSgpICogbWF0cml4KGIsICprLCAqbiwgKmxkYikgKworICAgICAgICAgIGFscGhhICogbWF0cml4KGIsICprLCAqbiwgKmxkYikudHJhbnNwb3NlKCkgKiBtYXRyaXgoYSwgKmssICpuLCAqbGRhKTsKICAgfQogCiAgIHJldHVybiAwOwogfQogCi0KICNpZiBJU0NPTVBMRVgKIAogLy8gYyA9IGFscGhhKmEqYiArIGJldGEqYyAgZm9yIHNpZGUgPSAnTCdvcidsJwogLy8gYyA9IGFscGhhKmIqYSArIGJldGEqYyAgZm9yIHNpZGUgPSAnUidvcidyCiBpbnQgRUlHRU5fQkxBU19GVU5DKGhlbW0pKGNvbnN0IGNoYXIgKnNpZGUsIGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGludCAqbSwgY29uc3QgaW50ICpuLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGIsIGNvbnN0IGludCAqbGRiLCBjb25zdCBSZWFsU2NhbGFyICpwYmV0YSwgUmVhbFNjYWxhciAqcGMsIGNvbnN0IGludCAqbGRjKQotewotICBjb25zdCBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhKTsKLSAgY29uc3QgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYik7Ci0gIFNjYWxhciogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGMpOwotICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYWxwaGEpOwotICBTY2FsYXIgYmV0YSAgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYmV0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGIsIGNvbnN0IGludCAqbGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYmV0YSwgUmVhbFNjYWxhciAqcGMsIGNvbnN0IGludCAqbGRjKSB7CisgIGNvbnN0IFNjYWxhciAqYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBhKTsKKyAgY29uc3QgU2NhbGFyICpiID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGIpOworICBTY2FsYXIgKmMgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYyk7CisgIFNjYWxhciBhbHBoYSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYWxwaGEpOworICBTY2FsYXIgYmV0YSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYmV0YSk7CiAKLS8vICAgc3RkOjpjZXJyIDw8ICJpbiBoZW1tICIgPDwgKnNpZGUgPDwgIiAiIDw8ICp1cGxvIDw8ICIgIiA8PCAqbSA8PCAiICIgPDwgKm4gPDwgIiAiIDw8IGFscGhhIDw8ICIgIiA8PCAqbGRhIDw8ICIgIiA8PCBiZXRhIDw8ICIgIiA8PCAqbGRjIDw8ICJcbiI7CisgIC8vICAgc3RkOjpjZXJyIDw8ICJpbiBoZW1tICIgPDwgKnNpZGUgPDwgIiAiIDw8ICp1cGxvIDw8ICIgIiA8PCAqbSA8PCAiICIgPDwgKm4gPDwgIiAiIDw8IGFscGhhIDw8ICIgIiA8PCAqbGRhIDw8ICIgIgorICAvLyAgIDw8IGJldGEgPDwgIiAiIDw8ICpsZGMgPDwgIlxuIjsKIAogICBpbnQgaW5mbyA9IDA7Ci0gIGlmKFNJREUoKnNpZGUpPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7Ci0gIGVsc2UgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7Ci0gIGVsc2UgaWYoKm08MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7Ci0gIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7Ci0gIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLChTSURFKCpzaWRlKT09TEVGVCk/Km06Km4pKSAgICAgICAgICAgICAgICAgaW5mbyA9IDc7Ci0gIGVsc2UgaWYoKmxkYjxzdGQ6Om1heCgxLCptKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDk7Ci0gIGVsc2UgaWYoKmxkYzxzdGQ6Om1heCgxLCptKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDEyOwotICBpZihpbmZvKQotICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiSEVNTSAiLCZpbmZvLDYpOworICBpZiAoU0lERSgqc2lkZSkgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMTsKKyAgZWxzZSBpZiAoVVBMTygqdXBsbykgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMjsKKyAgZWxzZSBpZiAoKm0gPCAwKQorICAgIGluZm8gPSAzOworICBlbHNlIGlmICgqbiA8IDApCisgICAgaW5mbyA9IDQ7CisgIGVsc2UgaWYgKCpsZGEgPCBzdGQ6Om1heCgxLCAoU0lERSgqc2lkZSkgPT0gTEVGVCkgPyAqbSA6ICpuKSkKKyAgICBpbmZvID0gNzsKKyAgZWxzZSBpZiAoKmxkYiA8IHN0ZDo6bWF4KDEsICptKSkKKyAgICBpbmZvID0gOTsKKyAgZWxzZSBpZiAoKmxkYyA8IHN0ZDo6bWF4KDEsICptKSkKKyAgICBpbmZvID0gMTI7CisgIGlmIChpbmZvKSByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQICJIRU1NICIsICZpbmZvLCA2KTsKIAotICBpZihiZXRhPT1TY2FsYXIoMCkpICAgICAgIG1hdHJpeChjLCAqbSwgKm4sICpsZGMpLnNldFplcm8oKTsKLSAgZWxzZSBpZihiZXRhIT1TY2FsYXIoMSkpICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKSAqPSBiZXRhOworICBpZiAoYmV0YSA9PSBTY2FsYXIoMCkpCisgICAgbWF0cml4KGMsICptLCAqbiwgKmxkYykuc2V0WmVybygpOworICBlbHNlIGlmIChiZXRhICE9IFNjYWxhcigxKSkKKyAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKSAqPSBiZXRhOwogCi0gIGlmKCptPT0wIHx8ICpuPT0wKQotICB7CisgIGlmICgqbSA9PSAwIHx8ICpuID09IDApIHsKICAgICByZXR1cm4gMTsKICAgfQogCi0gIGludCBzaXplID0gKFNJREUoKnNpZGUpPT1MRUZUKSA/ICgqbSkgOiAoKm4pOwotICBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvcixTY2FsYXIsU2NhbGFyLER5bmFtaWMsRHluYW1pYyxEeW5hbWljPiBibG9ja2luZygqbSwqbixzaXplLDEsZmFsc2UpOworICBpbnQgc2l6ZSA9IChTSURFKCpzaWRlKSA9PSBMRUZUKSA/ICgqbSkgOiAoKm4pOworICBpbnRlcm5hbDo6Z2VtbV9ibG9ja2luZ19zcGFjZTxDb2xNYWpvciwgU2NhbGFyLCBTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIER5bmFtaWM+IGJsb2NraW5nKCptLCAqbiwgc2l6ZSwgMSwgZmFsc2UpOwogCi0gIGlmKFNJREUoKnNpZGUpPT1MRUZUKQotICB7Ci0gICAgaWYoVVBMTygqdXBsbyk9PVVQKSAgICAgICBpbnRlcm5hbDo6cHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsUm93TWFqb3IsdHJ1ZSxDb25qLCAgQ29sTWFqb3IsZmFsc2UsZmFsc2UsIENvbE1ham9yLCAxPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnJ1bigqbSwgKm4sIGEsICpsZGEsIGIsICpsZGIsIGMsIDEsICpsZGMsIGFscGhhLCBibG9ja2luZyk7Ci0gICAgZWxzZSBpZihVUExPKCp1cGxvKT09TE8pICBpbnRlcm5hbDo6cHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsQ29sTWFqb3IsdHJ1ZSxmYWxzZSwgQ29sTWFqb3IsZmFsc2UsZmFsc2UsIENvbE1ham9yLDE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6cnVuKCptLCAqbiwgYSwgKmxkYSwgYiwgKmxkYiwgYywgMSwgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICB9Ci0gIGVsc2UgaWYoU0lERSgqc2lkZSk9PVJJR0hUKQotICB7Ci0gICAgaWYoVVBMTygqdXBsbyk9PVVQKSAgICAgICBtYXRyaXgoYywqbSwqbiwqbGRjKSArPSBhbHBoYSAqIG1hdHJpeChiLCptLCpuLCpsZGIpICogbWF0cml4KGEsKm4sKm4sKmxkYSkuc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpOy8qaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LENvbE1ham9yLGZhbHNlLGZhbHNlLCBSb3dNYWpvcix0cnVlLENvbmosICBDb2xNYWpvciwgMT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpydW4oKm0sICpuLCBiLCAqbGRiLCBhLCAqbGRhLCBjLCAxLCAqbGRjLCBhbHBoYSwgYmxvY2tpbmcpOyovCi0gICAgZWxzZSBpZihVUExPKCp1cGxvKT09TE8pICBpbnRlcm5hbDo6cHJvZHVjdF9zZWxmYWRqb2ludF9tYXRyaXg8U2NhbGFyLERlbnNlSW5kZXgsQ29sTWFqb3IsZmFsc2UsZmFsc2UsIENvbE1ham9yLHRydWUsZmFsc2UsIENvbE1ham9yLDE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6cnVuKCptLCAqbiwgYiwgKmxkYiwgYSwgKmxkYSwgYywgMSwgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICB9Ci0gIGVsc2UKLSAgeworICBpZiAoU0lERSgqc2lkZSkgPT0gTEVGVCkgeworICAgIGlmIChVUExPKCp1cGxvKSA9PSBVUCkKKyAgICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIFJvd01ham9yLCB0cnVlLCBDb25qLCBDb2xNYWpvciwgZmFsc2UsIGZhbHNlLCBDb2xNYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6cnVuKCptLCAqbiwgYSwgKmxkYSwgYiwgKmxkYiwgYywgMSwgKmxkYywgYWxwaGEsIGJsb2NraW5nKTsKKyAgICBlbHNlIGlmIChVUExPKCp1cGxvKSA9PSBMTykKKyAgICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIENvbE1ham9yLCB0cnVlLCBmYWxzZSwgQ29sTWFqb3IsIGZhbHNlLCBmYWxzZSwgQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT46OnJ1bigqbSwgKm4sIGEsICpsZGEsIGIsICpsZGIsIGMsIDEsICpsZGMsIGFscGhhLCBibG9ja2luZyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0gZWxzZSBpZiAoU0lERSgqc2lkZSkgPT0gUklHSFQpIHsKKyAgICBpZiAoVVBMTygqdXBsbykgPT0gVVApCisgICAgICBtYXRyaXgoYywgKm0sICpuLCAqbGRjKSArPQorICAgICAgICAgIGFscGhhICogbWF0cml4KGIsICptLCAqbiwgKmxkYikgKgorICAgICAgICAgIG1hdHJpeChhLCAqbiwgKm4sICpsZGEpCisgICAgICAgICAgICAgIC5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7IC8qaW50ZXJuYWw6OnByb2R1Y3Rfc2VsZmFkam9pbnRfbWF0cml4PFNjYWxhcixEZW5zZUluZGV4LENvbE1ham9yLGZhbHNlLGZhbHNlLAorUm93TWFqb3IsdHJ1ZSxDb25qLCAgQ29sTWFqb3IsIDE+Cis6OnJ1bigqbSwgKm4sIGIsICpsZGIsIGEsICpsZGEsIGMsIDEsICpsZGMsIGFscGhhLCBibG9ja2luZyk7Ki8KKyAgICBlbHNlIGlmIChVUExPKCp1cGxvKSA9PSBMTykKKyAgICAgIGludGVybmFsOjpwcm9kdWN0X3NlbGZhZGpvaW50X21hdHJpeDxTY2FsYXIsIERlbnNlSW5kZXgsIENvbE1ham9yLCBmYWxzZSwgZmFsc2UsIENvbE1ham9yLCB0cnVlLCBmYWxzZSwgQ29sTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT46OnJ1bigqbSwgKm4sIGIsICpsZGIsIGEsICpsZGEsIGMsIDEsICpsZGMsIGFscGhhLCBibG9ja2luZyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNTYxLDY1ICs2NjgsNzYgQEAKIAogLy8gYyA9IGFscGhhKmEqY29uaihhJykgKyBiZXRhKmMgIGZvciBvcCA9ICdOJ29yJ24nCiAvLyBjID0gYWxwaGEqY29uaihhJykqYSArIGJldGEqYyAgZm9yIG9wICA9ICdDJ29yJ2MnCi1pbnQgRUlHRU5fQkxBU19GVU5DKGhlcmspKGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGNoYXIgKm9wLCBjb25zdCBpbnQgKm4sIGNvbnN0IGludCAqaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciAqcGFscGhhLCBjb25zdCBSZWFsU2NhbGFyICpwYSwgY29uc3QgaW50ICpsZGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBiZXRhLCBSZWFsU2NhbGFyICpwYywgY29uc3QgaW50ICpsZGMpCi17Ci0vLyAgIHN0ZDo6Y2VyciA8PCAiaW4gaGVyayAiIDw8ICp1cGxvIDw8ICIgIiA8PCAqb3AgPDwgIiAiIDw8ICpuIDw8ICIgIiA8PCAqayA8PCAiICIgPDwgKnBhbHBoYSA8PCAiICIgPDwgKmxkYSA8PCAiICIgPDwgKnBiZXRhIDw8ICIgIiA8PCAqbGRjIDw8ICJcbiI7CitpbnQgRUlHRU5fQkxBU19GVU5DKGhlcmspKGNvbnN0IGNoYXIgKnVwbG8sIGNvbnN0IGNoYXIgKm9wLCBjb25zdCBpbnQgKm4sIGNvbnN0IGludCAqaywgY29uc3QgUmVhbFNjYWxhciAqcGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYSwgY29uc3QgaW50ICpsZGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBiZXRhLCBSZWFsU2NhbGFyICpwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpsZGMpIHsKKyAgLy8gICBzdGQ6OmNlcnIgPDwgImluIGhlcmsgIiA8PCAqdXBsbyA8PCAiICIgPDwgKm9wIDw8ICIgIiA8PCAqbiA8PCAiICIgPDwgKmsgPDwgIiAiIDw8ICpwYWxwaGEgPDwgIiAiIDw8ICpsZGEgPDwgIiAiCisgIC8vICAgPDwgKnBiZXRhIDw8ICIgIiA8PCAqbGRjIDw8ICJcbiI7CiAKLSAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgU2NhbGFyICosIERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciYsIGludGVybmFsOjpsZXZlbDNfYmxvY2tpbmc8U2NhbGFyLFNjYWxhcj4mKTsKKyAgdHlwZWRlZiB2b2lkICgqZnVuY3R5cGUpKERlbnNlSW5kZXgsIERlbnNlSW5kZXgsIGNvbnN0IFNjYWxhciAqLCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgKiwgRGVuc2VJbmRleCwgU2NhbGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZUluZGV4LCBEZW5zZUluZGV4LCBjb25zdCBTY2FsYXIgJiwgaW50ZXJuYWw6OmxldmVsM19ibG9ja2luZzxTY2FsYXIsIFNjYWxhcj4gJik7CiAgIHN0YXRpYyBjb25zdCBmdW5jdHlwZSBmdW5jWzhdID0gewotICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChVUCA8PCAyKQotICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixDb2xNYWpvcixmYWxzZSxTY2FsYXIsUm93TWFqb3IsQ29uaiwgQ29sTWFqb3IsMSxVcHBlcj46OnJ1biksCi0gICAgMCwKLSAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikKLSAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCxTY2FsYXIsUm93TWFqb3IsQ29uaiwgU2NhbGFyLENvbE1ham9yLGZhbHNlLENvbE1ham9yLDEsVXBwZXI+OjpydW4pLAotICAgIDAsCi0gICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKExPIDw8IDIpCi0gICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PERlbnNlSW5kZXgsU2NhbGFyLENvbE1ham9yLGZhbHNlLFNjYWxhcixSb3dNYWpvcixDb25qLCBDb2xNYWpvciwxLExvd2VyPjo6cnVuKSwKLSAgICAwLAotICAgIC8vIGFycmF5IGluZGV4OiBBREogICB8IChMTyA8PCAyKQotICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxEZW5zZUluZGV4LFNjYWxhcixSb3dNYWpvcixDb25qLCBTY2FsYXIsQ29sTWFqb3IsZmFsc2UsQ29sTWFqb3IsMSxMb3dlcj46OnJ1biksCi0gICAgMAotICB9OworICAgICAgLy8gYXJyYXkgaW5kZXg6IE5PVFIgIHwgKFVQIDw8IDIpCisgICAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCwgU2NhbGFyLCBDb2xNYWpvciwgZmFsc2UsIFNjYWxhciwgUm93TWFqb3IsIENvbmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3IsIDEsIFVwcGVyPjo6cnVuKSwKKyAgICAgIDAsCisgICAgICAvLyBhcnJheSBpbmRleDogQURKICAgfCAoVVAgPDwgMikKKyAgICAgIChpbnRlcm5hbDo6Z2VuZXJhbF9tYXRyaXhfbWF0cml4X3RyaWFuZ3VsYXJfcHJvZHVjdDxEZW5zZUluZGV4LCBTY2FsYXIsIFJvd01ham9yLCBDb25qLCBTY2FsYXIsIENvbE1ham9yLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xNYWpvciwgMSwgVXBwZXI+OjpydW4pLAorICAgICAgMCwKKyAgICAgIC8vIGFycmF5IGluZGV4OiBOT1RSICB8IChMTyA8PCAyKQorICAgICAgKGludGVybmFsOjpnZW5lcmFsX21hdHJpeF9tYXRyaXhfdHJpYW5ndWxhcl9wcm9kdWN0PERlbnNlSW5kZXgsIFNjYWxhciwgQ29sTWFqb3IsIGZhbHNlLCBTY2FsYXIsIFJvd01ham9yLCBDb25qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbE1ham9yLCAxLCBMb3dlcj46OnJ1biksCisgICAgICAwLAorICAgICAgLy8gYXJyYXkgaW5kZXg6IEFESiAgIHwgKExPIDw8IDIpCisgICAgICAoaW50ZXJuYWw6OmdlbmVyYWxfbWF0cml4X21hdHJpeF90cmlhbmd1bGFyX3Byb2R1Y3Q8RGVuc2VJbmRleCwgU2NhbGFyLCBSb3dNYWpvciwgQ29uaiwgU2NhbGFyLCBDb2xNYWpvciwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sTWFqb3IsIDEsIExvd2VyPjo6cnVuKSwKKyAgICAgIDB9OwogCi0gIGNvbnN0IFNjYWxhciogYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyKj4ocGEpOwotICBTY2FsYXIqIGMgPSByZWludGVycHJldF9jYXN0PFNjYWxhcio+KHBjKTsKKyAgY29uc3QgU2NhbGFyICphID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGEpOworICBTY2FsYXIgKmMgPSByZWludGVycHJldF9jYXN0PFNjYWxhciAqPihwYyk7CiAgIFJlYWxTY2FsYXIgYWxwaGEgPSAqcGFscGhhOwotICBSZWFsU2NhbGFyIGJldGEgID0gKnBiZXRhOworICBSZWFsU2NhbGFyIGJldGEgPSAqcGJldGE7CiAKLS8vICAgc3RkOjpjZXJyIDw8ICJpbiBoZXJrICIgPDwgKnVwbG8gPDwgIiAiIDw8ICpvcCA8PCAiICIgPDwgKm4gPDwgIiAiIDw8ICprIDw8ICIgIiA8PCBhbHBoYSA8PCAiICIgPDwgKmxkYSA8PCAiICIgPDwgYmV0YSA8PCAiICIgPDwgKmxkYyA8PCAiXG4iOworICAvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gaGVyayAiIDw8ICp1cGxvIDw8ICIgIiA8PCAqb3AgPDwgIiAiIDw8ICpuIDw8ICIgIiA8PCAqayA8PCAiICIgPDwgYWxwaGEgPDwgIiAiIDw8ICpsZGEgPDwgIiAiIDw8CisgIC8vICAgYmV0YSA8PCAiICIgPDwgKmxkYyA8PCAiXG4iOwogCiAgIGludCBpbmZvID0gMDsKLSAgaWYoVVBMTygqdXBsbyk9PUlOVkFMSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTsKLSAgZWxzZSBpZigoT1AoKm9wKT09SU5WQUxJRCkgfHwgKE9QKCpvcCk9PVRSKSkgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMjsKLSAgZWxzZSBpZigqbjwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMzsKLSAgZWxzZSBpZigqazwwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNDsKLSAgZWxzZSBpZigqbGRhPHN0ZDo6bWF4KDEsKE9QKCpvcCk9PU5PVFIpPypuOiprKSkgICAgICAgICAgICAgICAgICAgICBpbmZvID0gNzsKLSAgZWxzZSBpZigqbGRjPHN0ZDo6bWF4KDEsKm4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gMTA7Ci0gIGlmKGluZm8pCi0gICAgcmV0dXJuIHhlcmJsYV8oU0NBTEFSX1NVRkZJWF9VUCJIRVJLICIsJmluZm8sNik7CisgIGlmIChVUExPKCp1cGxvKSA9PSBJTlZBTElEKQorICAgIGluZm8gPSAxOworICBlbHNlIGlmICgoT1AoKm9wKSA9PSBJTlZBTElEKSB8fCAoT1AoKm9wKSA9PSBUUikpCisgICAgaW5mbyA9IDI7CisgIGVsc2UgaWYgKCpuIDwgMCkKKyAgICBpbmZvID0gMzsKKyAgZWxzZSBpZiAoKmsgPCAwKQorICAgIGluZm8gPSA0OworICBlbHNlIGlmICgqbGRhIDwgc3RkOjptYXgoMSwgKE9QKCpvcCkgPT0gTk9UUikgPyAqbiA6ICprKSkKKyAgICBpbmZvID0gNzsKKyAgZWxzZSBpZiAoKmxkYyA8IHN0ZDo6bWF4KDEsICpuKSkKKyAgICBpbmZvID0gMTA7CisgIGlmIChpbmZvKSByZXR1cm4geGVyYmxhXyhTQ0FMQVJfU1VGRklYX1VQICJIRVJLICIsICZpbmZvLCA2KTsKIAogICBpbnQgY29kZSA9IE9QKCpvcCkgfCAoVVBMTygqdXBsbykgPDwgMik7CiAKLSAgaWYoYmV0YSE9UmVhbFNjYWxhcigxKSkKLSAgewotICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkKLSAgICAgIGlmKGJldGE9PVNjYWxhcigwKSkgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc2V0WmVybygpOwotICAgICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpICo9IGJldGE7CisgIGlmIChiZXRhICE9IFJlYWxTY2FsYXIoMSkpIHsKKyAgICBpZiAoVVBMTygqdXBsbykgPT0gVVApCisgICAgICBpZiAoYmV0YSA9PSBTY2FsYXIoMCkpCisgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNldFplcm8oKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8U3RyaWN0bHlVcHBlcj4oKSAqPSBiZXRhOworICAgIGVsc2UgaWYgKGJldGEgPT0gU2NhbGFyKDApKQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc2V0WmVybygpOwogICAgIGVsc2UKLSAgICAgIGlmKGJldGE9PVNjYWxhcigwKSkgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc2V0WmVybygpOwotICAgICAgZWxzZSAgICAgICAgICAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxTdHJpY3RseUxvd2VyPigpICo9IGJldGE7CisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxTdHJpY3RseUxvd2VyPigpICo9IGJldGE7CiAKLSAgICBpZihiZXRhIT1TY2FsYXIoMCkpCi0gICAgeworICAgIGlmIChiZXRhICE9IFNjYWxhcigwKSkgewogICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykuZGlhZ29uYWwoKS5yZWFsKCkgKj0gYmV0YTsKICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLmRpYWdvbmFsKCkuaW1hZygpLnNldFplcm8oKTsKICAgICB9CiAgIH0KIAotICBpZigqaz4wICYmIGFscGhhIT1SZWFsU2NhbGFyKDApKQotICB7Ci0gICAgaW50ZXJuYWw6OmdlbW1fYmxvY2tpbmdfc3BhY2U8Q29sTWFqb3IsU2NhbGFyLFNjYWxhcixEeW5hbWljLER5bmFtaWMsRHluYW1pYz4gYmxvY2tpbmcoKm4sKm4sKmssMSxmYWxzZSk7CisgIGlmICgqayA+IDAgJiYgYWxwaGEgIT0gUmVhbFNjYWxhcigwKSkgeworICAgIGludGVybmFsOjpnZW1tX2Jsb2NraW5nX3NwYWNlPENvbE1ham9yLCBTY2FsYXIsIFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgRHluYW1pYz4gYmxvY2tpbmcoKm4sICpuLCAqaywgMSwgZmFsc2UpOwogICAgIGZ1bmNbY29kZV0oKm4sICprLCBhLCAqbGRhLCBhLCAqbGRhLCBjLCAxLCAqbGRjLCBhbHBoYSwgYmxvY2tpbmcpOwogICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLmRpYWdvbmFsKCkuaW1hZygpLnNldFplcm8oKTsKICAgfQpAQCAtNjI4LDc1ICs3NDYsNzYgQEAKIAogLy8gYyA9IGFscGhhKmEqY29uaihiJykgKyBjb25qKGFscGhhKSpiKmNvbmooYScpICsgYmV0YSpjLCAgZm9yIG9wID0gJ04nb3InbicKIC8vIGMgPSBhbHBoYSpjb25qKGEnKSpiICsgY29uaihhbHBoYSkqY29uaihiJykqYSArIGJldGEqYywgIGZvciBvcCA9ICdDJ29yJ2MnCi1pbnQgRUlHRU5fQkxBU19GVU5DKGhlcjJrKShjb25zdCBjaGFyICp1cGxvLCBjb25zdCBjaGFyICpvcCwgY29uc3QgaW50ICpuLCBjb25zdCBpbnQgKmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBhLCBjb25zdCBpbnQgKmxkYSwgY29uc3QgUmVhbFNjYWxhciAqcGIsIGNvbnN0IGludCAqbGRiLCBjb25zdCBSZWFsU2NhbGFyICpwYmV0YSwgUmVhbFNjYWxhciAqcGMsIGNvbnN0IGludCAqbGRjKQotewotICBjb25zdCBTY2FsYXIqIGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhcio+KHBhKTsKLSAgY29uc3QgU2NhbGFyKiBiID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYik7Ci0gIFNjYWxhciogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyKj4ocGMpOwotICBTY2FsYXIgYWxwaGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIqPihwYWxwaGEpOwotICBSZWFsU2NhbGFyIGJldGEgID0gKnBiZXRhOworaW50IEVJR0VOX0JMQVNfRlVOQyhoZXIyaykoY29uc3QgY2hhciAqdXBsbywgY29uc3QgY2hhciAqb3AsIGNvbnN0IGludCAqbiwgY29uc3QgaW50ICprLCBjb25zdCBSZWFsU2NhbGFyICpwYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyICpwYSwgY29uc3QgaW50ICpsZGEsIGNvbnN0IFJlYWxTY2FsYXIgKnBiLCBjb25zdCBpbnQgKmxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWxTY2FsYXIgKnBiZXRhLCBSZWFsU2NhbGFyICpwYywgY29uc3QgaW50ICpsZGMpIHsKKyAgY29uc3QgU2NhbGFyICphID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTY2FsYXIgKj4ocGEpOworICBjb25zdCBTY2FsYXIgKmIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNjYWxhciAqPihwYik7CisgIFNjYWxhciAqYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U2NhbGFyICo+KHBjKTsKKyAgU2NhbGFyIGFscGhhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU2NhbGFyICo+KHBhbHBoYSk7CisgIFJlYWxTY2FsYXIgYmV0YSA9ICpwYmV0YTsKIAotLy8gICBzdGQ6OmNlcnIgPDwgImluIGhlcjJrICIgPDwgKnVwbG8gPDwgIiAiIDw8ICpvcCA8PCAiICIgPDwgKm4gPDwgIiAiIDw8ICprIDw8ICIgIiA8PCBhbHBoYSA8PCAiICIgPDwgKmxkYSA8PCAiICIgPDwgKmxkYiA8PCAiICIgPDwgYmV0YSA8PCAiICIgPDwgKmxkYyA8PCAiXG4iOworICAvLyAgIHN0ZDo6Y2VyciA8PCAiaW4gaGVyMmsgIiA8PCAqdXBsbyA8PCAiICIgPDwgKm9wIDw8ICIgIiA8PCAqbiA8PCAiICIgPDwgKmsgPDwgIiAiIDw8IGFscGhhIDw8ICIgIiA8PCAqbGRhIDw8ICIgIgorICAvLyAgIDw8ICpsZGIgPDwgIiAiIDw8IGJldGEgPDwgIiAiIDw8ICpsZGMgPDwgIlxuIjsKIAogICBpbnQgaW5mbyA9IDA7Ci0gIGlmKFVQTE8oKnVwbG8pPT1JTlZBTElEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDE7Ci0gIGVsc2UgaWYoKE9QKCpvcCk9PUlOVkFMSUQpIHx8IChPUCgqb3ApPT1UUikpICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDI7Ci0gIGVsc2UgaWYoKm48MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDM7Ci0gIGVsc2UgaWYoKms8MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDQ7Ci0gIGVsc2UgaWYoKmxkYTxzdGQ6Om1heCgxLChPUCgqb3ApPT1OT1RSKT8qbjoqaykpICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDc7Ci0gIGVsc2UgaWYoKmxkYjxzdGQ6Om1heCgxLChPUCgqb3ApPT1OT1RSKT8qbjoqaykpICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDk7Ci0gIGVsc2UgaWYoKmxkYzxzdGQ6Om1heCgxLCpuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IDEyOwotICBpZihpbmZvKQotICAgIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAiSEVSMksiLCZpbmZvLDYpOworICBpZiAoVVBMTygqdXBsbykgPT0gSU5WQUxJRCkKKyAgICBpbmZvID0gMTsKKyAgZWxzZSBpZiAoKE9QKCpvcCkgPT0gSU5WQUxJRCkgfHwgKE9QKCpvcCkgPT0gVFIpKQorICAgIGluZm8gPSAyOworICBlbHNlIGlmICgqbiA8IDApCisgICAgaW5mbyA9IDM7CisgIGVsc2UgaWYgKCprIDwgMCkKKyAgICBpbmZvID0gNDsKKyAgZWxzZSBpZiAoKmxkYSA8IHN0ZDo6bWF4KDEsIChPUCgqb3ApID09IE5PVFIpID8gKm4gOiAqaykpCisgICAgaW5mbyA9IDc7CisgIGVsc2UgaWYgKCpsZGIgPCBzdGQ6Om1heCgxLCAoT1AoKm9wKSA9PSBOT1RSKSA/ICpuIDogKmspKQorICAgIGluZm8gPSA5OworICBlbHNlIGlmICgqbGRjIDwgc3RkOjptYXgoMSwgKm4pKQorICAgIGluZm8gPSAxMjsKKyAgaWYgKGluZm8pIHJldHVybiB4ZXJibGFfKFNDQUxBUl9TVUZGSVhfVVAgIkhFUjJLIiwgJmluZm8sIDYpOwogCi0gIGlmKGJldGEhPVJlYWxTY2FsYXIoMSkpCi0gIHsKLSAgICBpZihVUExPKCp1cGxvKT09VVApCi0gICAgICBpZihiZXRhPT1TY2FsYXIoMCkpIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNldFplcm8oKTsKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8U3RyaWN0bHlVcHBlcj4oKSAqPSBiZXRhOworICBpZiAoYmV0YSAhPSBSZWFsU2NhbGFyKDEpKSB7CisgICAgaWYgKFVQTE8oKnVwbG8pID09IFVQKQorICAgICAgaWYgKGJldGEgPT0gU2NhbGFyKDApKQorICAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zZXRaZXJvKCk7CisgICAgICBlbHNlCisgICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5VXBwZXI+KCkgKj0gYmV0YTsKKyAgICBlbHNlIGlmIChiZXRhID09IFNjYWxhcigwKSkKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNldFplcm8oKTsKICAgICBlbHNlCi0gICAgICBpZihiZXRhPT1TY2FsYXIoMCkpIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNldFplcm8oKTsKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKSAqPSBiZXRhOworICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKSAqPSBiZXRhOwogCi0gICAgaWYoYmV0YSE9U2NhbGFyKDApKQotICAgIHsKKyAgICBpZiAoYmV0YSAhPSBTY2FsYXIoMCkpIHsKICAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLmRpYWdvbmFsKCkucmVhbCgpICo9IGJldGE7CiAgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS5kaWFnb25hbCgpLmltYWcoKS5zZXRaZXJvKCk7CiAgICAgfQotICB9Ci0gIGVsc2UgaWYoKms+MCAmJiBhbHBoYSE9U2NhbGFyKDApKQorICB9IGVsc2UgaWYgKCprID4gMCAmJiBhbHBoYSAhPSBTY2FsYXIoMCkpCiAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykuZGlhZ29uYWwoKS5pbWFnKCkuc2V0WmVybygpOwogCi0gIGlmKCprPT0wKQotICAgIHJldHVybiAxOworICBpZiAoKmsgPT0gMCkgcmV0dXJuIDE7CiAKLSAgaWYoT1AoKm9wKT09Tk9UUikKLSAgewotICAgIGlmKFVQTE8oKnVwbG8pPT1VUCkKLSAgICB7Ci0gICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKQotICAgICAgICArPSAgICAgICAgICAgIGFscGhhICptYXRyaXgoYSwgKm4sICprLCAqbGRhKSptYXRyaXgoYiwgKm4sICprLCAqbGRiKS5hZGpvaW50KCkKLSAgICAgICAgKyAgbnVtZXh0Ojpjb25qKGFscGhhKSptYXRyaXgoYiwgKm4sICprLCAqbGRiKSptYXRyaXgoYSwgKm4sICprLCAqbGRhKS5hZGpvaW50KCk7Ci0gICAgfQotICAgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKQotICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkKLSAgICAgICAgKz0gYWxwaGEqbWF0cml4KGEsICpuLCAqaywgKmxkYSkqbWF0cml4KGIsICpuLCAqaywgKmxkYikuYWRqb2ludCgpCi0gICAgICAgICsgIG51bWV4dDo6Y29uaihhbHBoYSkqbWF0cml4KGIsICpuLCAqaywgKmxkYikqbWF0cml4KGEsICpuLCAqaywgKmxkYSkuYWRqb2ludCgpOwotICB9Ci0gIGVsc2UgaWYoT1AoKm9wKT09QURKKQotICB7Ci0gICAgaWYoVVBMTygqdXBsbyk9PVVQKQotICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkKLSAgICAgICAgKz0gICAgICAgICAgICAgYWxwaGEqbWF0cml4KGEsICprLCAqbiwgKmxkYSkuYWRqb2ludCgpKm1hdHJpeChiLCAqaywgKm4sICpsZGIpCi0gICAgICAgICsgIG51bWV4dDo6Y29uaihhbHBoYSkqbWF0cml4KGIsICprLCAqbiwgKmxkYikuYWRqb2ludCgpKm1hdHJpeChhLCAqaywgKm4sICpsZGEpOwotICAgIGVsc2UgaWYoVVBMTygqdXBsbyk9PUxPKQotICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkKLSAgICAgICAgKz0gICAgICAgICAgICAgYWxwaGEqbWF0cml4KGEsICprLCAqbiwgKmxkYSkuYWRqb2ludCgpKm1hdHJpeChiLCAqaywgKm4sICpsZGIpCi0gICAgICAgICsgIG51bWV4dDo6Y29uaihhbHBoYSkqbWF0cml4KGIsICprLCAqbiwgKmxkYikuYWRqb2ludCgpKm1hdHJpeChhLCAqaywgKm4sICpsZGEpOworICBpZiAoT1AoKm9wKSA9PSBOT1RSKSB7CisgICAgaWYgKFVQTE8oKnVwbG8pID09IFVQKSB7CisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSArPQorICAgICAgICAgIGFscGhhICogbWF0cml4KGEsICpuLCAqaywgKmxkYSkgKiBtYXRyaXgoYiwgKm4sICprLCAqbGRiKS5hZGpvaW50KCkgKworICAgICAgICAgIG51bWV4dDo6Y29uaihhbHBoYSkgKiBtYXRyaXgoYiwgKm4sICprLCAqbGRiKSAqIG1hdHJpeChhLCAqbiwgKmssICpsZGEpLmFkam9pbnQoKTsKKyAgICB9IGVsc2UgaWYgKFVQTE8oKnVwbG8pID09IExPKQorICAgICAgbWF0cml4KGMsICpuLCAqbiwgKmxkYykudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKz0KKyAgICAgICAgICBhbHBoYSAqIG1hdHJpeChhLCAqbiwgKmssICpsZGEpICogbWF0cml4KGIsICpuLCAqaywgKmxkYikuYWRqb2ludCgpICsKKyAgICAgICAgICBudW1leHQ6OmNvbmooYWxwaGEpICogbWF0cml4KGIsICpuLCAqaywgKmxkYikgKiBtYXRyaXgoYSwgKm4sICprLCAqbGRhKS5hZGpvaW50KCk7CisgIH0gZWxzZSBpZiAoT1AoKm9wKSA9PSBBREopIHsKKyAgICBpZiAoVVBMTygqdXBsbykgPT0gVVApCisgICAgICBtYXRyaXgoYywgKm4sICpuLCAqbGRjKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSArPQorICAgICAgICAgIGFscGhhICogbWF0cml4KGEsICprLCAqbiwgKmxkYSkuYWRqb2ludCgpICogbWF0cml4KGIsICprLCAqbiwgKmxkYikgKworICAgICAgICAgIG51bWV4dDo6Y29uaihhbHBoYSkgKiBtYXRyaXgoYiwgKmssICpuLCAqbGRiKS5hZGpvaW50KCkgKiBtYXRyaXgoYSwgKmssICpuLCAqbGRhKTsKKyAgICBlbHNlIGlmIChVUExPKCp1cGxvKSA9PSBMTykKKyAgICAgIG1hdHJpeChjLCAqbiwgKm4sICpsZGMpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICs9CisgICAgICAgICAgYWxwaGEgKiBtYXRyaXgoYSwgKmssICpuLCAqbGRhKS5hZGpvaW50KCkgKiBtYXRyaXgoYiwgKmssICpuLCAqbGRiKSArCisgICAgICAgICAgbnVtZXh0Ojpjb25qKGFscGhhKSAqIG1hdHJpeChiLCAqaywgKm4sICpsZGIpLmFkam9pbnQoKSAqIG1hdHJpeChhLCAqaywgKm4sICpsZGEpOwogICB9CiAKICAgcmV0dXJuIDE7CiB9CiAKLSNlbmRpZiAvLyBJU0NPTVBMRVgKKyNlbmRpZiAgLy8gSVNDT01QTEVYCmRpZmYgLS1naXQgYS9ibGFzL3NpbmdsZS5jcHAgYi9ibGFzL3NpbmdsZS5jcHAKaW5kZXggZTY2ODc5YS4uOWFmZWEzNSAxMDA2NDQKLS0tIGEvYmxhcy9zaW5nbGUuY3BwCisrKyBiL2JsYXMvc2luZ2xlLmNwcApAQCAtNywxMCArNywxMCBAQAogLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCiAvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KIAotI2RlZmluZSBTQ0FMQVIgICAgICAgIGZsb2F0CisjZGVmaW5lIFNDQUxBUiBmbG9hdAogI2RlZmluZSBTQ0FMQVJfU1VGRklYIHMKICNkZWZpbmUgU0NBTEFSX1NVRkZJWF9VUCAiUyIKLSNkZWZpbmUgSVNDT01QTEVYICAgICAwCisjZGVmaW5lIElTQ09NUExFWCAwCiAKICNpbmNsdWRlICJsZXZlbDFfaW1wbC5oIgogI2luY2x1ZGUgImxldmVsMV9yZWFsX2ltcGwuaCIKQEAgLTE4LDUgKzE4LDYgQEAKICNpbmNsdWRlICJsZXZlbDJfcmVhbF9pbXBsLmgiCiAjaW5jbHVkZSAibGV2ZWwzX2ltcGwuaCIKIAotZmxvYXQgRUlHRU5fQkxBU19GVU5DKGRzZG90KShpbnQqIG4sIGZsb2F0KiBhbHBoYSwgZmxvYXQqIHgsIGludCogaW5jeCwgZmxvYXQqIHksIGludCogaW5jeSkKLXsgcmV0dXJuIGRvdWJsZSgqYWxwaGEpICsgQkxBU0ZVTkMoZHNkb3QpKG4sIHgsIGluY3gsIHksIGluY3kpOyB9CitmbG9hdCBFSUdFTl9CTEFTX0ZVTkMoZHNkb3QpKGludCogbiwgZmxvYXQqIGFscGhhLCBmbG9hdCogeCwgaW50KiBpbmN4LCBmbG9hdCogeSwgaW50KiBpbmN5KSB7CisgIHJldHVybiBkb3VibGUoKmFscGhhKSArIEJMQVNGVU5DKGRzZG90KShuLCB4LCBpbmN4LCB5LCBpbmN5KTsKK30KZGlmZiAtLWdpdCBhL2JsYXMveGVyYmxhLmNwcCBiL2JsYXMveGVyYmxhLmNwcAppbmRleCBjMzczZTg2Li42OThlODlmIDEwMDY0NAotLS0gYS9ibGFzL3hlcmJsYS5jcHAKKysrIGIvYmxhcy94ZXJibGEuY3BwCkBAIC0yLDE5ICsyLDE3IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KIAogI2lmIChkZWZpbmVkIF9fR05VQ19fKSAmJiAoIWRlZmluZWQgX19NSU5HVzMyX18pICYmICghZGVmaW5lZCBfX0NZR1dJTl9fKQotI2RlZmluZSBFSUdFTl9XRUFLX0xJTktJTkcgX19hdHRyaWJ1dGVfXyAoKHdlYWspKQorI2RlZmluZSBFSUdFTl9XRUFLX0xJTktJTkcgX19hdHRyaWJ1dGVfXygod2VhaykpCiAjZWxzZQogI2RlZmluZSBFSUdFTl9XRUFLX0xJTktJTkcKICNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKK2V4dGVybiAiQyIgewogI2VuZGlmCiAKLUVJR0VOX1dFQUtfTElOS0lORyBpbnQgeGVyYmxhXyhjb25zdCBjaGFyICogbXNnLCBpbnQgKmluZm8sIGludCkKLXsKLSAgcHJpbnRmKCJFaWdlbiBCTEFTIEVSUk9SICMlaTogJXNcbiIsICppbmZvLCBtc2cgKTsKK0VJR0VOX1dFQUtfTElOS0lORyBpbnQgeGVyYmxhXyhjb25zdCBjaGFyICptc2csIGludCAqaW5mbywgaW50KSB7CisgIHByaW50ZigiRWlnZW4gQkxBUyBFUlJPUiAjJWk6ICVzXG4iLCAqaW5mbywgbXNnKTsKICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RlbW9zL21hbmRlbGJyb3QvbWFuZGVsYnJvdC5jcHAgYi9kZW1vcy9tYW5kZWxicm90L21hbmRlbGJyb3QuY3BwCmluZGV4IDVkNTc1ZDUuLmE1YjFkYzggMTAwNjQ0Ci0tLSBhL2RlbW9zL21hbmRlbGJyb3QvbWFuZGVsYnJvdC5jcHAKKysrIGIvZGVtb3MvbWFuZGVsYnJvdC9tYW5kZWxicm90LmNwcApAQCAtOSwyMDEgKzksMTg0IEBACiAKICNpbmNsdWRlICJtYW5kZWxicm90LmgiCiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZTxRdEd1aS9RUGFpbnRlcj4KLSNpbmNsdWRlPFF0R3VpL1FJbWFnZT4KLSNpbmNsdWRlPFF0R3VpL1FNb3VzZUV2ZW50PgotI2luY2x1ZGU8UXRDb3JlL1FUaW1lPgorI2luY2x1ZGUgPFF0R3VpL1FQYWludGVyPgorI2luY2x1ZGUgPFF0R3VpL1FJbWFnZT4KKyNpbmNsdWRlIDxRdEd1aS9RTW91c2VFdmVudD4KKyNpbmNsdWRlIDxRdENvcmUvUVRpbWU+CiAKLXZvaWQgTWFuZGVsYnJvdFdpZGdldDo6cmVzaXplRXZlbnQoUVJlc2l6ZUV2ZW50ICopCi17Ci0gIGlmKHNpemUgPCB3aWR0aCgpICogaGVpZ2h0KCkpCi0gIHsKK3ZvaWQgTWFuZGVsYnJvdFdpZGdldDo6cmVzaXplRXZlbnQoUVJlc2l6ZUV2ZW50ICopIHsKKyAgaWYgKHNpemUgPCB3aWR0aCgpICogaGVpZ2h0KCkpIHsKICAgICBzdGQ6OmNvdXQgPDwgInJlYWxsb2NhdGUgYnVmZmVyIiA8PCBzdGQ6OmVuZGw7CiAgICAgc2l6ZSA9IHdpZHRoKCkgKiBoZWlnaHQoKTsKLSAgICBpZihidWZmZXIpIGRlbGV0ZVtdYnVmZmVyOwotICAgIGJ1ZmZlciA9IG5ldyB1bnNpZ25lZCBjaGFyWzQqc2l6ZV07CisgICAgaWYgKGJ1ZmZlcikgZGVsZXRlW10gYnVmZmVyOworICAgIGJ1ZmZlciA9IG5ldyB1bnNpZ25lZCBjaGFyWzQgKiBzaXplXTsKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXRlcnNfYmVmb3JlX3Rlc3QgeyBlbnVtIHsgcmV0ID0gOCB9OyB9OwotdGVtcGxhdGU8PiBzdHJ1Y3QgaXRlcnNfYmVmb3JlX3Rlc3Q8ZG91YmxlPiB7IGVudW0geyByZXQgPSAxNiB9OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXRlcnNfYmVmb3JlX3Rlc3QgeworICBlbnVtIHsgcmV0ID0gOCB9OworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaXRlcnNfYmVmb3JlX3Rlc3Q8ZG91YmxlPiB7CisgIGVudW0geyByZXQgPSAxNiB9OworfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgUmVhbD4gdm9pZCBNYW5kZWxicm90VGhyZWFkOjpyZW5kZXIoaW50IGltZ193aWR0aCwgaW50IGltZ19oZWlnaHQpCi17Ci0gIGVudW0geyBwYWNrZXRTaXplID0gRWlnZW46OmludGVybmFsOjpwYWNrZXRfdHJhaXRzPFJlYWw+OjpzaXplIH07IC8vIG51bWJlciBvZiByZWFscyBpbiBhIFBhY2tldAotICB0eXBlZGVmIEVpZ2VuOjpBcnJheTxSZWFsLCBwYWNrZXRTaXplLCAxPiBQYWNrZXQ7IC8vIHdyYXAgYSBQYWNrZXQgYXMgYSB2ZWN0b3IKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZWFsPgordm9pZCBNYW5kZWxicm90VGhyZWFkOjpyZW5kZXIoaW50IGltZ193aWR0aCwgaW50IGltZ19oZWlnaHQpIHsKKyAgZW51bSB7IHBhY2tldFNpemUgPSBFaWdlbjo6aW50ZXJuYWw6OnBhY2tldF90cmFpdHM8UmVhbD46OnNpemUgfTsgIC8vIG51bWJlciBvZiByZWFscyBpbiBhIFBhY2tldAorICB0eXBlZGVmIEVpZ2VuOjpBcnJheTxSZWFsLCBwYWNrZXRTaXplLCAxPiBQYWNrZXQ7ICAgICAgICAgICAgICAgICAgLy8gd3JhcCBhIFBhY2tldCBhcyBhIHZlY3RvcgogCiAgIGVudW0geyBpdGVyc19iZWZvcmVfdGVzdCA9IGl0ZXJzX2JlZm9yZV90ZXN0PFJlYWw+OjpyZXQgfTsKICAgbWF4X2l0ZXIgPSAobWF4X2l0ZXIgLyBpdGVyc19iZWZvcmVfdGVzdCkgKiBpdGVyc19iZWZvcmVfdGVzdDsKLSAgY29uc3QgaW50IGFsaWduZWRXaWR0aCA9IChpbWdfd2lkdGgvcGFja2V0U2l6ZSkqcGFja2V0U2l6ZTsKKyAgY29uc3QgaW50IGFsaWduZWRXaWR0aCA9IChpbWdfd2lkdGggLyBwYWNrZXRTaXplKSAqIHBhY2tldFNpemU7CiAgIHVuc2lnbmVkIGNoYXIgKmNvbnN0IGJ1ZmZlciA9IHdpZGdldC0+YnVmZmVyOwogICBjb25zdCBkb3VibGUgeHJhZGl1cyA9IHdpZGdldC0+eHJhZGl1czsKICAgY29uc3QgZG91YmxlIHlyYWRpdXMgPSB4cmFkaXVzICogaW1nX2hlaWdodCAvIGltZ193aWR0aDsKICAgY29uc3QgaW50IHRocmVhZGNvdW50ID0gd2lkZ2V0LT50aHJlYWRjb3VudDsKICAgdHlwZWRlZiBFaWdlbjo6QXJyYXk8UmVhbCwgMiwgMT4gVmVjdG9yMjsKICAgVmVjdG9yMiBzdGFydCh3aWRnZXQtPmNlbnRlci54KCkgLSB3aWRnZXQtPnhyYWRpdXMsIHdpZGdldC0+Y2VudGVyLnkoKSAtIHlyYWRpdXMpOwotICBWZWN0b3IyIHN0ZXAoMip3aWRnZXQtPnhyYWRpdXMvaW1nX3dpZHRoLCAyKnlyYWRpdXMvaW1nX2hlaWdodCk7CisgIFZlY3RvcjIgc3RlcCgyICogd2lkZ2V0LT54cmFkaXVzIC8gaW1nX3dpZHRoLCAyICogeXJhZGl1cyAvIGltZ19oZWlnaHQpOwogICB0b3RhbF9pdGVyID0gMDsKIAotICBmb3IoaW50IHkgPSBpZDsgeSA8IGltZ19oZWlnaHQ7IHkgKz0gdGhyZWFkY291bnQpCi0gIHsKKyAgZm9yIChpbnQgeSA9IGlkOyB5IDwgaW1nX2hlaWdodDsgeSArPSB0aHJlYWRjb3VudCkgewogICAgIGludCBwaXggPSB5ICogaW1nX3dpZHRoOwogCi0gICAgLy8gZm9yIGVhY2ggcGl4ZWwsIHdlJ3JlIGdvaW5nIHRvIGRvIHRoZSBpdGVyYXRpb24geiA6PSB6XjIgKyBjIHdoZXJlIHogYW5kIGMgYXJlIGNvbXBsZXggbnVtYmVycywgCisgICAgLy8gZm9yIGVhY2ggcGl4ZWwsIHdlJ3JlIGdvaW5nIHRvIGRvIHRoZSBpdGVyYXRpb24geiA6PSB6XjIgKyBjIHdoZXJlIHogYW5kIGMgYXJlIGNvbXBsZXggbnVtYmVycywKICAgICAvLyBzdGFydGluZyB3aXRoIHogPSBjID0gY29tcGxleCBjb29yZCBvZiB0aGUgcGl4ZWwuIHB6aSBhbmQgcHpyIGRlbm90ZSB0aGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIG9mIHouCiAgICAgLy8gcGNpIGFuZCBwY3IgZGVub3RlIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgb2YgYy4KIAogICAgIFBhY2tldCBwemlfc3RhcnQsIHBjaV9zdGFydDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgcGFja2V0U2l6ZTsgaSsrKSBwemlfc3RhcnRbaV0gPSBwY2lfc3RhcnRbaV0gPSBzdGFydC55KCkgKyB5ICogc3RlcC55KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrZXRTaXplOyBpKyspIHB6aV9zdGFydFtpXSA9IHBjaV9zdGFydFtpXSA9IHN0YXJ0LnkoKSArIHkgKiBzdGVwLnkoKTsKIAotICAgIGZvcihpbnQgeCA9IDA7IHggPCBhbGlnbmVkV2lkdGg7IHggKz0gcGFja2V0U2l6ZSwgcGl4ICs9IHBhY2tldFNpemUpCi0gICAgeworICAgIGZvciAoaW50IHggPSAwOyB4IDwgYWxpZ25lZFdpZHRoOyB4ICs9IHBhY2tldFNpemUsIHBpeCArPSBwYWNrZXRTaXplKSB7CiAgICAgICBQYWNrZXQgcGNyLCBwY2kgPSBwY2lfc3RhcnQsIHB6ciwgcHppID0gcHppX3N0YXJ0LCBwenJfYnVmOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8IHBhY2tldFNpemU7IGkrKykgcHpyW2ldID0gcGNyW2ldID0gc3RhcnQueCgpICsgKHgraSkgKiBzdGVwLngoKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2V0U2l6ZTsgaSsrKSBwenJbaV0gPSBwY3JbaV0gPSBzdGFydC54KCkgKyAoeCArIGkpICogc3RlcC54KCk7CiAKICAgICAgIC8vIGRvIHRoZSBpdGVyYXRpb25zLiBFdmVyeSBpdGVyc19iZWZvcmVfdGVzdCBpdGVyYXRpb25zIHdlIGNoZWNrIGZvciBkaXZlcmdlbmNlLAogICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBjYW4gc3RvcCBpdGVyYXRpbmcuCiAgICAgICBpbnQgaiA9IDA7CiAgICAgICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8aW50LCBwYWNrZXRTaXplLCAxPiBQYWNrZXRpOwotICAgICAgUGFja2V0aSBwaXhfaXRlciA9IFBhY2tldGk6Olplcm8oKSwgLy8gbnVtYmVyIG9mIGl0ZXJhdGlvbiBwZXIgcGl4ZWwgaW4gdGhlIHBhY2tldAotICAgICAgICAgICAgICBwaXhfZG9udF9kaXZlcmdlOyAvLyB3aGV0aGVyIG9yIG5vdCBlYWNoIHBpeGVsIGhhcyBhbHJlYWR5IGRpdmVyZ2VkCi0gICAgICBkbwotICAgICAgewotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgaXRlcnNfYmVmb3JlX3Rlc3QvNDsgaSsrKSAvLyBwZWVsIHRoZSBpbm5lciBsb29wIGJ5IDQKKyAgICAgIFBhY2tldGkgcGl4X2l0ZXIgPSBQYWNrZXRpOjpaZXJvKCksICAvLyBudW1iZXIgb2YgaXRlcmF0aW9uIHBlciBwaXhlbCBpbiB0aGUgcGFja2V0CisgICAgICAgICAgcGl4X2RvbnRfZGl2ZXJnZTsgICAgICAgICAgICAgICAgLy8gd2hldGhlciBvciBub3QgZWFjaCBwaXhlbCBoYXMgYWxyZWFkeSBkaXZlcmdlZAorICAgICAgZG8geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJzX2JlZm9yZV90ZXN0IC8gNDsgaSsrKSAgLy8gcGVlbCB0aGUgaW5uZXIgbG9vcCBieSA0CiAgICAgICAgIHsKLSMgICAgICAgICBkZWZpbmUgSVRFUkFURSBcCi0gICAgICAgICAgICBwenJfYnVmID0gcHpyOyBcCi0gICAgICAgICAgICBwenIgPSBwenIuc3F1YXJlKCk7IFwKLSAgICAgICAgICAgIHB6ciAtPSBwemkuc3F1YXJlKCk7IFwKLSAgICAgICAgICAgIHB6ciArPSBwY3I7IFwKLSAgICAgICAgICAgIHB6aSA9ICgyKnB6cl9idWYpKnB6aTsgXAotICAgICAgICAgICAgcHppICs9IHBjaTsKKyNkZWZpbmUgSVRFUkFURSAgICAgICAgICAgICAgXAorICBwenJfYnVmID0gcHpyOyAgICAgICAgICAgICBcCisgIHB6ciA9IHB6ci5zcXVhcmUoKTsgICAgICAgIFwKKyAgcHpyIC09IHB6aS5zcXVhcmUoKTsgICAgICAgXAorICBwenIgKz0gcGNyOyAgICAgICAgICAgICAgICBcCisgIHB6aSA9ICgyICogcHpyX2J1ZikgKiBwemk7IFwKKyAgcHppICs9IHBjaTsKICAgICAgICAgICBJVEVSQVRFIElURVJBVEUgSVRFUkFURSBJVEVSQVRFCiAgICAgICAgIH0KLSAgICAgICAgcGl4X2RvbnRfZGl2ZXJnZSA9ICgocHpyLnNxdWFyZSgpICsgcHppLnNxdWFyZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV2YWwoKSAvLyB0ZW1wb3JhcnkgZml4IGFzIHdoYXQgZm9sbG93cyBpcyBub3QgeWV0IHZlY3Rvcml6ZWQgYnkgRWlnZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhY2tldDo6Q29uc3RhbnQoNCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSA0IGhlcmUgaXMgbm90IGEgbWFnaWMgdmFsdWUsIGl0J3MgYSBtYXRoIGZhY3QgdGhhdCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3F1YXJlIG1vZHVsdXMgaXMgPjQgdGhlbiBkaXZlcmdlbmNlIGlzIGluZXZpdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAudGVtcGxhdGUgY2FzdDxpbnQ+KCk7CisgICAgICAgIHBpeF9kb250X2RpdmVyZ2UgPQorICAgICAgICAgICAgKChwenIuc3F1YXJlKCkgKyBwemkuc3F1YXJlKCkpLmV2YWwoKSAgLy8gdGVtcG9yYXJ5IGZpeCBhcyB3aGF0IGZvbGxvd3MgaXMgbm90IHlldCB2ZWN0b3JpemVkIGJ5IEVpZ2VuCisgICAgICAgICAgICAgPD0gUGFja2V0OjpDb25zdGFudCg0KSkKKyAgICAgICAgICAgICAgICAvLyB0aGUgNCBoZXJlIGlzIG5vdCBhIG1hZ2ljIHZhbHVlLCBpdCdzIGEgbWF0aCBmYWN0IHRoYXQgaWYKKyAgICAgICAgICAgICAgICAvLyB0aGUgc3F1YXJlIG1vZHVsdXMgaXMgPjQgdGhlbiBkaXZlcmdlbmNlIGlzIGluZXZpdGFibGUuCisgICAgICAgICAgICAgICAgLnRlbXBsYXRlIGNhc3Q8aW50PigpOwogICAgICAgICBwaXhfaXRlciArPSBpdGVyc19iZWZvcmVfdGVzdCAqIHBpeF9kb250X2RpdmVyZ2U7CiAgICAgICAgIGorKzsKICAgICAgICAgdG90YWxfaXRlciArPSBpdGVyc19iZWZvcmVfdGVzdCAqIHBhY2tldFNpemU7Ci0gICAgICB9Ci0gICAgICB3aGlsZShqIDwgbWF4X2l0ZXIvaXRlcnNfYmVmb3JlX3Rlc3QgJiYgcGl4X2RvbnRfZGl2ZXJnZS5hbnkoKSk7IC8vIGFueSgpIGlzIG5vdCB5ZXQgdmVjdG9yaXplZCBieSBFaWdlbgorICAgICAgfSB3aGlsZSAoaiA8IG1heF9pdGVyIC8gaXRlcnNfYmVmb3JlX3Rlc3QgJiYgcGl4X2RvbnRfZGl2ZXJnZS5hbnkoKSk7ICAvLyBhbnkoKSBpcyBub3QgeWV0IHZlY3Rvcml6ZWQgYnkgRWlnZW4KIAogICAgICAgLy8gY29tcHV0ZSBwaXhlbCBjb2xvcnMKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBwYWNrZXRTaXplOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGJ1ZmZlcls0KihwaXgraSldID0gMjU1KnBpeF9pdGVyW2ldL21heF9pdGVyOwotICAgICAgICBidWZmZXJbNCoocGl4K2kpKzFdID0gMDsKLSAgICAgICAgYnVmZmVyWzQqKHBpeCtpKSsyXSA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2tldFNpemU7IGkrKykgeworICAgICAgICBidWZmZXJbNCAqIChwaXggKyBpKV0gPSAyNTUgKiBwaXhfaXRlcltpXSAvIG1heF9pdGVyOworICAgICAgICBidWZmZXJbNCAqIChwaXggKyBpKSArIDFdID0gMDsKKyAgICAgICAgYnVmZmVyWzQgKiAocGl4ICsgaSkgKyAyXSA9IDA7CiAgICAgICB9CiAgICAgfQogCiAgICAgLy8gaWYgdGhlIHdpZHRoIGlzIG5vdCBhIG11bHRpcGxlIG9mIHBhY2tldFNpemUsIGZpbGwgdGhlIHJlbWFpbmRlciBpbiBibGFjawotICAgIGZvcihpbnQgeCA9IGFsaWduZWRXaWR0aDsgeCA8IGltZ193aWR0aDsgeCsrLCBwaXgrKykKLSAgICAgIGJ1ZmZlcls0KnBpeF0gPSBidWZmZXJbNCpwaXgrMV0gPSBidWZmZXJbNCpwaXgrMl0gPSAwOworICAgIGZvciAoaW50IHggPSBhbGlnbmVkV2lkdGg7IHggPCBpbWdfd2lkdGg7IHgrKywgcGl4KyspCisgICAgICBidWZmZXJbNCAqIHBpeF0gPSBidWZmZXJbNCAqIHBpeCArIDFdID0gYnVmZmVyWzQgKiBwaXggKyAyXSA9IDA7CiAgIH0KICAgcmV0dXJuOwogfQogCi12b2lkIE1hbmRlbGJyb3RUaHJlYWQ6OnJ1bigpCi17Cit2b2lkIE1hbmRlbGJyb3RUaHJlYWQ6OnJ1bigpIHsKICAgc2V0VGVybWluYXRpb25FbmFibGVkKHRydWUpOwotICBkb3VibGUgcmVzb2x1dGlvbiA9IHdpZGdldC0+eHJhZGl1cyoyL3dpZGdldC0+d2lkdGgoKTsKKyAgZG91YmxlIHJlc29sdXRpb24gPSB3aWRnZXQtPnhyYWRpdXMgKiAyIC8gd2lkZ2V0LT53aWR0aCgpOwogICBtYXhfaXRlciA9IDEyODsKLSAgaWYocmVzb2x1dGlvbiA8IDFlLTRmKSBtYXhfaXRlciArPSAxMjggKiAoIC0gNCAtIHN0ZDo6bG9nMTAocmVzb2x1dGlvbikpOwotICBpbnQgaW1nX3dpZHRoID0gd2lkZ2V0LT53aWR0aCgpL3dpZGdldC0+ZHJhZnQ7Ci0gIGludCBpbWdfaGVpZ2h0ID0gd2lkZ2V0LT5oZWlnaHQoKS93aWRnZXQtPmRyYWZ0OworICBpZiAocmVzb2x1dGlvbiA8IDFlLTRmKSBtYXhfaXRlciArPSAxMjggKiAoLTQgLSBzdGQ6OmxvZzEwKHJlc29sdXRpb24pKTsKKyAgaW50IGltZ193aWR0aCA9IHdpZGdldC0+d2lkdGgoKSAvIHdpZGdldC0+ZHJhZnQ7CisgIGludCBpbWdfaGVpZ2h0ID0gd2lkZ2V0LT5oZWlnaHQoKSAvIHdpZGdldC0+ZHJhZnQ7CiAgIHNpbmdsZV9wcmVjaXNpb24gPSByZXNvbHV0aW9uID4gMWUtN2Y7CiAKLSAgaWYoc2luZ2xlX3ByZWNpc2lvbikKKyAgaWYgKHNpbmdsZV9wcmVjaXNpb24pCiAgICAgcmVuZGVyPGZsb2F0PihpbWdfd2lkdGgsIGltZ19oZWlnaHQpOwogICBlbHNlCiAgICAgcmVuZGVyPGRvdWJsZT4oaW1nX3dpZHRoLCBpbWdfaGVpZ2h0KTsKIH0KIAotdm9pZCBNYW5kZWxicm90V2lkZ2V0OjpwYWludEV2ZW50KFFQYWludEV2ZW50ICopCi17Cit2b2lkIE1hbmRlbGJyb3RXaWRnZXQ6OnBhaW50RXZlbnQoUVBhaW50RXZlbnQgKikgewogICBzdGF0aWMgZmxvYXQgbWF4X3NwZWVkID0gMDsKICAgbG9uZyBsb25nIHRvdGFsX2l0ZXIgPSAwOwogCiAgIFFUaW1lIHRpbWU7CiAgIHRpbWUuc3RhcnQoKTsKLSAgZm9yKGludCB0aCA9IDA7IHRoIDwgdGhyZWFkY291bnQ7IHRoKyspCi0gICAgdGhyZWFkc1t0aF0tPnN0YXJ0KFFUaHJlYWQ6Okxvd1ByaW9yaXR5KTsKLSAgZm9yKGludCB0aCA9IDA7IHRoIDwgdGhyZWFkY291bnQ7IHRoKyspCi0gIHsKKyAgZm9yIChpbnQgdGggPSAwOyB0aCA8IHRocmVhZGNvdW50OyB0aCsrKSB0aHJlYWRzW3RoXS0+c3RhcnQoUVRocmVhZDo6TG93UHJpb3JpdHkpOworICBmb3IgKGludCB0aCA9IDA7IHRoIDwgdGhyZWFkY291bnQ7IHRoKyspIHsKICAgICB0aHJlYWRzW3RoXS0+d2FpdCgpOwogICAgIHRvdGFsX2l0ZXIgKz0gdGhyZWFkc1t0aF0tPnRvdGFsX2l0ZXI7CiAgIH0KICAgaW50IGVsYXBzZWQgPSB0aW1lLmVsYXBzZWQoKTsKIAotICBpZihkcmFmdCA9PSAxKQotICB7Ci0gICAgZmxvYXQgc3BlZWQgPSBlbGFwc2VkID8gZmxvYXQodG90YWxfaXRlcikqMTAwMC9lbGFwc2VkIDogMDsKKyAgaWYgKGRyYWZ0ID09IDEpIHsKKyAgICBmbG9hdCBzcGVlZCA9IGVsYXBzZWQgPyBmbG9hdCh0b3RhbF9pdGVyKSAqIDEwMDAgLyBlbGFwc2VkIDogMDsKICAgICBtYXhfc3BlZWQgPSBzdGQ6Om1heChtYXhfc3BlZWQsIHNwZWVkKTsKLSAgICBzdGQ6OmNvdXQgPDwgdGhyZWFkY291bnQgPDwgIiB0aHJlYWRzLCAiCi0gICAgICAgICAgICAgIDw8IGVsYXBzZWQgPDwgIiBtcywgIgotICAgICAgICAgICAgICA8PCBzcGVlZCA8PCAiIGl0ZXJzL3MgKG1heCAiIDw8IG1heF9zcGVlZCA8PCAiKSIgPDwgc3RkOjplbmRsOwotICAgIGludCBwYWNrZXRTaXplID0gdGhyZWFkc1swXS0+c2luZ2xlX3ByZWNpc2lvbgotICAgICAgICAgICAgICAgICAgID8gaW50KEVpZ2VuOjppbnRlcm5hbDo6cGFja2V0X3RyYWl0czxmbG9hdD46OnNpemUpCi0gICAgICAgICAgICAgICAgICAgOiBpbnQoRWlnZW46OmludGVybmFsOjpwYWNrZXRfdHJhaXRzPGRvdWJsZT46OnNpemUpOwotICAgIHNldFdpbmRvd1RpdGxlKFFTdHJpbmcoInJlc29sdXRpb24gIikrUVN0cmluZzo6bnVtYmVyKHhyYWRpdXMqMi93aWR0aCgpLCAnZScsIDIpCi0gICAgICAgICAgICAgICAgICArUVN0cmluZygiLCAlMSBpdGVyYXRpb25zIHBlciBwaXhlbCwgIikuYXJnKHRocmVhZHNbMF0tPm1heF9pdGVyKQotICAgICAgICAgICAgICAgICAgKyh0aHJlYWRzWzBdLT5zaW5nbGVfcHJlY2lzaW9uID8gUVN0cmluZygic2luZ2xlICIpIDogUVN0cmluZygiZG91YmxlICIpKQotICAgICAgICAgICAgICAgICAgK1FTdHJpbmcoInByZWNpc2lvbiwgIikKLSAgICAgICAgICAgICAgICAgICsocGFja2V0U2l6ZT09MSA/IFFTdHJpbmcoIm5vIHZlY3Rvcml6YXRpb24iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUVN0cmluZygidmVjdG9yaXplZCAoJTEgcGVyIHBhY2tldCkiKS5hcmcocGFja2V0U2l6ZSkpKTsKKyAgICBzdGQ6OmNvdXQgPDwgdGhyZWFkY291bnQgPDwgIiB0aHJlYWRzLCAiIDw8IGVsYXBzZWQgPDwgIiBtcywgIiA8PCBzcGVlZCA8PCAiIGl0ZXJzL3MgKG1heCAiIDw8IG1heF9zcGVlZCA8PCAiKSIKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgIGludCBwYWNrZXRTaXplID0gdGhyZWFkc1swXS0+c2luZ2xlX3ByZWNpc2lvbiA/IGludChFaWdlbjo6aW50ZXJuYWw6OnBhY2tldF90cmFpdHM8ZmxvYXQ+OjpzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludChFaWdlbjo6aW50ZXJuYWw6OnBhY2tldF90cmFpdHM8ZG91YmxlPjo6c2l6ZSk7CisgICAgc2V0V2luZG93VGl0bGUoCisgICAgICAgIFFTdHJpbmcoInJlc29sdXRpb24gIikgKyBRU3RyaW5nOjpudW1iZXIoeHJhZGl1cyAqIDIgLyB3aWR0aCgpLCAnZScsIDIpICsKKyAgICAgICAgUVN0cmluZygiLCAlMSBpdGVyYXRpb25zIHBlciBwaXhlbCwgIikuYXJnKHRocmVhZHNbMF0tPm1heF9pdGVyKSArCisgICAgICAgICh0aHJlYWRzWzBdLT5zaW5nbGVfcHJlY2lzaW9uID8gUVN0cmluZygic2luZ2xlICIpIDogUVN0cmluZygiZG91YmxlICIpKSArIFFTdHJpbmcoInByZWNpc2lvbiwgIikgKworICAgICAgICAocGFja2V0U2l6ZSA9PSAxID8gUVN0cmluZygibm8gdmVjdG9yaXphdGlvbiIpIDogUVN0cmluZygidmVjdG9yaXplZCAoJTEgcGVyIHBhY2tldCkiKS5hcmcocGFja2V0U2l6ZSkpKTsKICAgfQotICAKLSAgUUltYWdlIGltYWdlKGJ1ZmZlciwgd2lkdGgoKS9kcmFmdCwgaGVpZ2h0KCkvZHJhZnQsIFFJbWFnZTo6Rm9ybWF0X1JHQjMyKTsKKworICBRSW1hZ2UgaW1hZ2UoYnVmZmVyLCB3aWR0aCgpIC8gZHJhZnQsIGhlaWdodCgpIC8gZHJhZnQsIFFJbWFnZTo6Rm9ybWF0X1JHQjMyKTsKICAgUVBhaW50ZXIgcGFpbnRlcih0aGlzKTsKICAgcGFpbnRlci5kcmF3SW1hZ2UoUVBvaW50KDAsIDApLCBpbWFnZS5zY2FsZWQod2lkdGgoKSwgaGVpZ2h0KCkpKTsKIAotICBpZihkcmFmdD4xKQotICB7CisgIGlmIChkcmFmdCA+IDEpIHsKICAgICBkcmFmdCAvPSAyOwogICAgIHNldFdpbmRvd1RpdGxlKFFTdHJpbmcoInJlY29tcHV0aW5nIGF0IDEvJTEgcmVzb2x1dGlvbi4uLiIpLmFyZyhkcmFmdCkpOwogICAgIHVwZGF0ZSgpOwogICB9CiB9CiAKLXZvaWQgTWFuZGVsYnJvdFdpZGdldDo6bW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50ICpldmVudCkKLXsKLSAgaWYoIGV2ZW50LT5idXR0b25zKCkgJiBRdDo6TGVmdEJ1dHRvbiApCi0gIHsKK3ZvaWQgTWFuZGVsYnJvdFdpZGdldDo6bW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50ICpldmVudCkgeworICBpZiAoZXZlbnQtPmJ1dHRvbnMoKSAmIFF0OjpMZWZ0QnV0dG9uKSB7CiAgICAgbGFzdHBvcyA9IGV2ZW50LT5wb3MoKTsKICAgICBkb3VibGUgeXJhZGl1cyA9IHhyYWRpdXMgKiBoZWlnaHQoKSAvIHdpZHRoKCk7Ci0gICAgY2VudGVyID0gRWlnZW46OlZlY3RvcjJkKGNlbnRlci54KCkgKyAoZXZlbnQtPnBvcygpLngoKSAtIHdpZHRoKCkvMikgKiB4cmFkaXVzICogMiAvIHdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlci55KCkgKyAoZXZlbnQtPnBvcygpLnkoKSAtIGhlaWdodCgpLzIpICogeXJhZGl1cyAqIDIgLyBoZWlnaHQoKSk7CisgICAgY2VudGVyID0gRWlnZW46OlZlY3RvcjJkKGNlbnRlci54KCkgKyAoZXZlbnQtPnBvcygpLngoKSAtIHdpZHRoKCkgLyAyKSAqIHhyYWRpdXMgKiAyIC8gd2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyLnkoKSArIChldmVudC0+cG9zKCkueSgpIC0gaGVpZ2h0KCkgLyAyKSAqIHlyYWRpdXMgKiAyIC8gaGVpZ2h0KCkpOwogICAgIGRyYWZ0ID0gMTY7Ci0gICAgZm9yKGludCB0aCA9IDA7IHRoIDwgdGhyZWFkY291bnQ7IHRoKyspCi0gICAgICB0aHJlYWRzW3RoXS0+dGVybWluYXRlKCk7CisgICAgZm9yIChpbnQgdGggPSAwOyB0aCA8IHRocmVhZGNvdW50OyB0aCsrKSB0aHJlYWRzW3RoXS0+dGVybWluYXRlKCk7CiAgICAgdXBkYXRlKCk7CiAgIH0KIH0KIAotdm9pZCBNYW5kZWxicm90V2lkZ2V0Ojptb3VzZU1vdmVFdmVudChRTW91c2VFdmVudCAqZXZlbnQpCi17Cit2b2lkIE1hbmRlbGJyb3RXaWRnZXQ6Om1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50ICpldmVudCkgewogICBRUG9pbnQgZGVsdGEgPSBldmVudC0+cG9zKCkgLSBsYXN0cG9zOwogICBsYXN0cG9zID0gZXZlbnQtPnBvcygpOwotICBpZiggZXZlbnQtPmJ1dHRvbnMoKSAmIFF0OjpMZWZ0QnV0dG9uICkKLSAgeworICBpZiAoZXZlbnQtPmJ1dHRvbnMoKSAmIFF0OjpMZWZ0QnV0dG9uKSB7CiAgICAgZG91YmxlIHQgPSAxICsgNSAqIGRvdWJsZShkZWx0YS55KCkpIC8gaGVpZ2h0KCk7Ci0gICAgaWYodCA8IDAuNSkgdCA9IDAuNTsKLSAgICBpZih0ID4gMikgdCA9IDI7CisgICAgaWYgKHQgPCAwLjUpIHQgPSAwLjU7CisgICAgaWYgKHQgPiAyKSB0ID0gMjsKICAgICB4cmFkaXVzICo9IHQ7CiAgICAgZHJhZnQgPSAxNjsKLSAgICBmb3IoaW50IHRoID0gMDsgdGggPCB0aHJlYWRjb3VudDsgdGgrKykKLSAgICAgIHRocmVhZHNbdGhdLT50ZXJtaW5hdGUoKTsKKyAgICBmb3IgKGludCB0aCA9IDA7IHRoIDwgdGhyZWFkY291bnQ7IHRoKyspIHRocmVhZHNbdGhdLT50ZXJtaW5hdGUoKTsKICAgICB1cGRhdGUoKTsKICAgfQogfQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoteworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICBRQXBwbGljYXRpb24gYXBwKGFyZ2MsIGFyZ3YpOwogICBNYW5kZWxicm90V2lkZ2V0IHc7CiAgIHcuc2hvdygpOwpkaWZmIC0tZ2l0IGEvZGVtb3MvbWFuZGVsYnJvdC9tYW5kZWxicm90LmggYi9kZW1vcy9tYW5kZWxicm90L21hbmRlbGJyb3QuaAppbmRleCBhNjg3ZmQwLi44YjhlNWI5IDEwMDY0NAotLS0gYS9kZW1vcy9tYW5kZWxicm90L21hbmRlbGJyb3QuaAorKysgYi9kZW1vcy9tYW5kZWxicm90L21hbmRlbGJyb3QuaApAQCAtMTcsNTUgKzE3LDUxIEBACiAKIGNsYXNzIE1hbmRlbGJyb3RXaWRnZXQ7CiAKLWNsYXNzIE1hbmRlbGJyb3RUaHJlYWQgOiBwdWJsaWMgUVRocmVhZAotewotICAgIGZyaWVuZCBjbGFzcyBNYW5kZWxicm90V2lkZ2V0OwotICAgIE1hbmRlbGJyb3RXaWRnZXQgKndpZGdldDsKLSAgICBsb25nIGxvbmcgdG90YWxfaXRlcjsKLSAgICBpbnQgaWQsIG1heF9pdGVyOwotICAgIGJvb2wgc2luZ2xlX3ByZWNpc2lvbjsKK2NsYXNzIE1hbmRlbGJyb3RUaHJlYWQgOiBwdWJsaWMgUVRocmVhZCB7CisgIGZyaWVuZCBjbGFzcyBNYW5kZWxicm90V2lkZ2V0OworICBNYW5kZWxicm90V2lkZ2V0ICp3aWRnZXQ7CisgIGxvbmcgbG9uZyB0b3RhbF9pdGVyOworICBpbnQgaWQsIG1heF9pdGVyOworICBib29sIHNpbmdsZV9wcmVjaXNpb247CiAKLSAgcHVibGljOgotICAgIE1hbmRlbGJyb3RUaHJlYWQoTWFuZGVsYnJvdFdpZGdldCAqdywgaW50IGkpIDogd2lkZ2V0KHcpLCBpZChpKSB7fQotICAgIHZvaWQgcnVuKCk7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgUmVhbD4gdm9pZCByZW5kZXIoaW50IGltZ193aWR0aCwgaW50IGltZ19oZWlnaHQpOworIHB1YmxpYzoKKyAgTWFuZGVsYnJvdFRocmVhZChNYW5kZWxicm90V2lkZ2V0ICp3LCBpbnQgaSkgOiB3aWRnZXQodyksIGlkKGkpIHt9CisgIHZvaWQgcnVuKCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZWFsPgorICB2b2lkIHJlbmRlcihpbnQgaW1nX3dpZHRoLCBpbnQgaW1nX2hlaWdodCk7CiB9OwogCi1jbGFzcyBNYW5kZWxicm90V2lkZ2V0IDogcHVibGljIFFXaWRnZXQKLXsKLSAgICBRX09CSkVDVAorY2xhc3MgTWFuZGVsYnJvdFdpZGdldCA6IHB1YmxpYyBRV2lkZ2V0IHsKKyAgUV9PQkpFQ1QKIAotICAgIGZyaWVuZCBjbGFzcyBNYW5kZWxicm90VGhyZWFkOwotICAgIEVpZ2VuOjpWZWN0b3IyZCBjZW50ZXI7Ci0gICAgZG91YmxlIHhyYWRpdXM7Ci0gICAgaW50IHNpemU7Ci0gICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOwotICAgIFFQb2ludCBsYXN0cG9zOwotICAgIGludCBkcmFmdDsKLSAgICBNYW5kZWxicm90VGhyZWFkICoqdGhyZWFkczsKLSAgICBpbnQgdGhyZWFkY291bnQ7CisgIGZyaWVuZCBjbGFzcyBNYW5kZWxicm90VGhyZWFkOworICBFaWdlbjo6VmVjdG9yMmQgY2VudGVyOworICBkb3VibGUgeHJhZGl1czsKKyAgaW50IHNpemU7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgUVBvaW50IGxhc3Rwb3M7CisgIGludCBkcmFmdDsKKyAgTWFuZGVsYnJvdFRocmVhZCAqKnRocmVhZHM7CisgIGludCB0aHJlYWRjb3VudDsKIAotICBwcm90ZWN0ZWQ6Ci0gICAgdm9pZCByZXNpemVFdmVudChRUmVzaXplRXZlbnQgKik7Ci0gICAgdm9pZCBwYWludEV2ZW50KFFQYWludEV2ZW50ICopOwotICAgIHZvaWQgbW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50ICpldmVudCk7Ci0gICAgdm9pZCBtb3VzZU1vdmVFdmVudChRTW91c2VFdmVudCAqZXZlbnQpOworIHByb3RlY3RlZDoKKyAgdm9pZCByZXNpemVFdmVudChRUmVzaXplRXZlbnQgKik7CisgIHZvaWQgcGFpbnRFdmVudChRUGFpbnRFdmVudCAqKTsKKyAgdm9pZCBtb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQgKmV2ZW50KTsKKyAgdm9pZCBtb3VzZU1vdmVFdmVudChRTW91c2VFdmVudCAqZXZlbnQpOwogCi0gIHB1YmxpYzoKLSAgICBNYW5kZWxicm90V2lkZ2V0KCkgOiBRV2lkZ2V0KCksIGNlbnRlcigwLDApLCB4cmFkaXVzKDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUoMCksIGJ1ZmZlcigwKSwgZHJhZnQoMTYpCi0gICAgewotICAgICAgc2V0QXV0b0ZpbGxCYWNrZ3JvdW5kKGZhbHNlKTsKLSAgICAgIHRocmVhZGNvdW50ID0gUVRocmVhZDo6aWRlYWxUaHJlYWRDb3VudCgpOwotICAgICAgdGhyZWFkcyA9IG5ldyBNYW5kZWxicm90VGhyZWFkKlt0aHJlYWRjb3VudF07Ci0gICAgICBmb3IoaW50IHRoID0gMDsgdGggPCB0aHJlYWRjb3VudDsgdGgrKykgdGhyZWFkc1t0aF0gPSBuZXcgTWFuZGVsYnJvdFRocmVhZCh0aGlzLCB0aCk7Ci0gICAgfQotICAgIH5NYW5kZWxicm90V2lkZ2V0KCkKLSAgICB7Ci0gICAgICBpZihidWZmZXIpIGRlbGV0ZVtdYnVmZmVyOwotICAgICAgZm9yKGludCB0aCA9IDA7IHRoIDwgdGhyZWFkY291bnQ7IHRoKyspIGRlbGV0ZSB0aHJlYWRzW3RoXTsKLSAgICAgIGRlbGV0ZVtdIHRocmVhZHM7Ci0gICAgfQorIHB1YmxpYzoKKyAgTWFuZGVsYnJvdFdpZGdldCgpIDogUVdpZGdldCgpLCBjZW50ZXIoMCwgMCksIHhyYWRpdXMoMiksIHNpemUoMCksIGJ1ZmZlcigwKSwgZHJhZnQoMTYpIHsKKyAgICBzZXRBdXRvRmlsbEJhY2tncm91bmQoZmFsc2UpOworICAgIHRocmVhZGNvdW50ID0gUVRocmVhZDo6aWRlYWxUaHJlYWRDb3VudCgpOworICAgIHRocmVhZHMgPSBuZXcgTWFuZGVsYnJvdFRocmVhZCAqW3RocmVhZGNvdW50XTsKKyAgICBmb3IgKGludCB0aCA9IDA7IHRoIDwgdGhyZWFkY291bnQ7IHRoKyspIHRocmVhZHNbdGhdID0gbmV3IE1hbmRlbGJyb3RUaHJlYWQodGhpcywgdGgpOworICB9CisgIH5NYW5kZWxicm90V2lkZ2V0KCkgeworICAgIGlmIChidWZmZXIpIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICBmb3IgKGludCB0aCA9IDA7IHRoIDwgdGhyZWFkY291bnQ7IHRoKyspIGRlbGV0ZSB0aHJlYWRzW3RoXTsKKyAgICBkZWxldGVbXSB0aHJlYWRzOworICB9CiB9OwogCi0jZW5kaWYgLy8gTUFOREVMQlJPVF9ICisjZW5kaWYgIC8vIE1BTkRFTEJST1RfSApkaWZmIC0tZ2l0IGEvZGVtb3MvbWl4X2VpZ2VuX2FuZF9jL2JpbmFyeV9saWJyYXJ5LmNwcCBiL2RlbW9zL21peF9laWdlbl9hbmRfYy9iaW5hcnlfbGlicmFyeS5jcHAKaW5kZXggMTVhMmQwMy4uMmFjNzgyMSAxMDA2NDQKLS0tIGEvZGVtb3MvbWl4X2VpZ2VuX2FuZF9jL2JpbmFyeV9saWJyYXJ5LmNwcAorKysgYi9kZW1vcy9taXhfZWlnZW5fYW5kX2MvYmluYXJ5X2xpYnJhcnkuY3BwCkBAIC0yMCwxNjYgKzIwLDg0IEBACiAKIC8vLy8vLyBjbGFzcyBNYXRyaXhYZCAvLy8vLy8KIAotaW5saW5lIE1hdHJpeFhkJiBjX3RvX2VpZ2VuKENfTWF0cml4WGQqIHB0cikKLXsKLSAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PE1hdHJpeFhkKj4ocHRyKTsKLX0KK2lubGluZSBNYXRyaXhYZCAmY190b19laWdlbihDX01hdHJpeFhkICpwdHIpIHsgcmV0dXJuICpyZWludGVycHJldF9jYXN0PE1hdHJpeFhkICo+KHB0cik7IH0KIAotaW5saW5lIGNvbnN0IE1hdHJpeFhkJiBjX3RvX2VpZ2VuKGNvbnN0IENfTWF0cml4WGQqIHB0cikKLXsKLSAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IE1hdHJpeFhkKj4ocHRyKTsKLX0KK2lubGluZSBjb25zdCBNYXRyaXhYZCAmY190b19laWdlbihjb25zdCBDX01hdHJpeFhkICpwdHIpIHsgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IE1hdHJpeFhkICo+KHB0cik7IH0KIAotaW5saW5lIENfTWF0cml4WGQqIGVpZ2VuX3RvX2MoTWF0cml4WGQmIHJlZikKLXsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q19NYXRyaXhYZCo+KCZyZWYpOwotfQoraW5saW5lIENfTWF0cml4WGQgKmVpZ2VuX3RvX2MoTWF0cml4WGQgJnJlZikgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDX01hdHJpeFhkICo+KCZyZWYpOyB9CiAKLWlubGluZSBjb25zdCBDX01hdHJpeFhkKiBlaWdlbl90b19jKGNvbnN0IE1hdHJpeFhkJiByZWYpCi17Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IENfTWF0cml4WGQqPigmcmVmKTsKLX0KK2lubGluZSBjb25zdCBDX01hdHJpeFhkICplaWdlbl90b19jKGNvbnN0IE1hdHJpeFhkICZyZWYpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ19NYXRyaXhYZCAqPigmcmVmKTsgfQogCiAvLy8vLy8gY2xhc3MgTWFwPE1hdHJpeFhkPiAvLy8vLy8KIAotaW5saW5lIE1hcDxNYXRyaXhYZD4mIGNfdG9fZWlnZW4oQ19NYXBfTWF0cml4WGQqIHB0cikKLXsKLSAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PE1hcDxNYXRyaXhYZD4qPihwdHIpOworaW5saW5lIE1hcDxNYXRyaXhYZD4gJmNfdG9fZWlnZW4oQ19NYXBfTWF0cml4WGQgKnB0cikgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8TWFwPE1hdHJpeFhkPiAqPihwdHIpOyB9CisKK2lubGluZSBjb25zdCBNYXA8TWF0cml4WGQ+ICZjX3RvX2VpZ2VuKGNvbnN0IENfTWFwX01hdHJpeFhkICpwdHIpIHsKKyAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IE1hcDxNYXRyaXhYZD4gKj4ocHRyKTsKIH0KIAotaW5saW5lIGNvbnN0IE1hcDxNYXRyaXhYZD4mIGNfdG9fZWlnZW4oY29uc3QgQ19NYXBfTWF0cml4WGQqIHB0cikKLXsKLSAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IE1hcDxNYXRyaXhYZD4qPihwdHIpOwotfQoraW5saW5lIENfTWFwX01hdHJpeFhkICplaWdlbl90b19jKE1hcDxNYXRyaXhYZD4gJnJlZikgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDX01hcF9NYXRyaXhYZCAqPigmcmVmKTsgfQogCi1pbmxpbmUgQ19NYXBfTWF0cml4WGQqIGVpZ2VuX3RvX2MoTWFwPE1hdHJpeFhkPiYgcmVmKQotewotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDX01hcF9NYXRyaXhYZCo+KCZyZWYpOworaW5saW5lIGNvbnN0IENfTWFwX01hdHJpeFhkICplaWdlbl90b19jKGNvbnN0IE1hcDxNYXRyaXhYZD4gJnJlZikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDX01hcF9NYXRyaXhYZCAqPigmcmVmKTsKIH0KIAotaW5saW5lIGNvbnN0IENfTWFwX01hdHJpeFhkKiBlaWdlbl90b19jKGNvbnN0IE1hcDxNYXRyaXhYZD4mIHJlZikKLXsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ19NYXBfTWF0cml4WGQqPigmcmVmKTsKLX0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBpbXBsZW1lbnRhdGlvbiBvZiBjbGFzc2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLy8vLy8vIGNsYXNzIE1hdHJpeFhkIC8vLy8vLwogCitDX01hdHJpeFhkICpNYXRyaXhYZF9uZXcoaW50IHJvd3MsIGludCBjb2xzKSB7IHJldHVybiBlaWdlbl90b19jKCpuZXcgTWF0cml4WGQocm93cywgY29scykpOyB9CiAKLUNfTWF0cml4WGQqIE1hdHJpeFhkX25ldyhpbnQgcm93cywgaW50IGNvbHMpCi17Ci0gIHJldHVybiBlaWdlbl90b19jKCpuZXcgTWF0cml4WGQocm93cyxjb2xzKSk7Ci19Cit2b2lkIE1hdHJpeFhkX2RlbGV0ZShDX01hdHJpeFhkICptKSB7IGRlbGV0ZSAmY190b19laWdlbihtKTsgfQogCi12b2lkIE1hdHJpeFhkX2RlbGV0ZShDX01hdHJpeFhkICptKQotewotICBkZWxldGUgJmNfdG9fZWlnZW4obSk7Ci19Citkb3VibGUgKk1hdHJpeFhkX2RhdGEoQ19NYXRyaXhYZCAqbSkgeyByZXR1cm4gY190b19laWdlbihtKS5kYXRhKCk7IH0KIAotZG91YmxlKiBNYXRyaXhYZF9kYXRhKENfTWF0cml4WGQgKm0pCi17Ci0gIHJldHVybiBjX3RvX2VpZ2VuKG0pLmRhdGEoKTsKLX0KK3ZvaWQgTWF0cml4WGRfc2V0X3plcm8oQ19NYXRyaXhYZCAqbSkgeyBjX3RvX2VpZ2VuKG0pLnNldFplcm8oKTsgfQogCi12b2lkIE1hdHJpeFhkX3NldF96ZXJvKENfTWF0cml4WGQgKm0pCi17Ci0gIGNfdG9fZWlnZW4obSkuc2V0WmVybygpOwotfQordm9pZCBNYXRyaXhYZF9yZXNpemUoQ19NYXRyaXhYZCAqbSwgaW50IHJvd3MsIGludCBjb2xzKSB7IGNfdG9fZWlnZW4obSkucmVzaXplKHJvd3MsIGNvbHMpOyB9CiAKLXZvaWQgTWF0cml4WGRfcmVzaXplKENfTWF0cml4WGQgKm0sIGludCByb3dzLCBpbnQgY29scykKLXsKLSAgY190b19laWdlbihtKS5yZXNpemUocm93cyxjb2xzKTsKLX0KK3ZvaWQgTWF0cml4WGRfY29weShDX01hdHJpeFhkICpkc3QsIGNvbnN0IENfTWF0cml4WGQgKnNyYykgeyBjX3RvX2VpZ2VuKGRzdCkgPSBjX3RvX2VpZ2VuKHNyYyk7IH0KIAotdm9pZCBNYXRyaXhYZF9jb3B5KENfTWF0cml4WGQgKmRzdCwgY29uc3QgQ19NYXRyaXhYZCAqc3JjKQotewotICBjX3RvX2VpZ2VuKGRzdCkgPSBjX3RvX2VpZ2VuKHNyYyk7Ci19Cit2b2lkIE1hdHJpeFhkX2NvcHlfbWFwKENfTWF0cml4WGQgKmRzdCwgY29uc3QgQ19NYXBfTWF0cml4WGQgKnNyYykgeyBjX3RvX2VpZ2VuKGRzdCkgPSBjX3RvX2VpZ2VuKHNyYyk7IH0KIAotdm9pZCBNYXRyaXhYZF9jb3B5X21hcChDX01hdHJpeFhkICpkc3QsIGNvbnN0IENfTWFwX01hdHJpeFhkICpzcmMpCi17Ci0gIGNfdG9fZWlnZW4oZHN0KSA9IGNfdG9fZWlnZW4oc3JjKTsKLX0KK3ZvaWQgTWF0cml4WGRfc2V0X2NvZWZmKENfTWF0cml4WGQgKm0sIGludCBpLCBpbnQgaiwgZG91YmxlIGNvZWZmKSB7IGNfdG9fZWlnZW4obSkoaSwgaikgPSBjb2VmZjsgfQogCi12b2lkIE1hdHJpeFhkX3NldF9jb2VmZihDX01hdHJpeFhkICptLCBpbnQgaSwgaW50IGosIGRvdWJsZSBjb2VmZikKLXsKLSAgY190b19laWdlbihtKShpLGopID0gY29lZmY7Ci19Citkb3VibGUgTWF0cml4WGRfZ2V0X2NvZWZmKGNvbnN0IENfTWF0cml4WGQgKm0sIGludCBpLCBpbnQgaikgeyByZXR1cm4gY190b19laWdlbihtKShpLCBqKTsgfQogCi1kb3VibGUgTWF0cml4WGRfZ2V0X2NvZWZmKGNvbnN0IENfTWF0cml4WGQgKm0sIGludCBpLCBpbnQgaikKLXsKLSAgcmV0dXJuIGNfdG9fZWlnZW4obSkoaSxqKTsKLX0KK3ZvaWQgTWF0cml4WGRfcHJpbnQoY29uc3QgQ19NYXRyaXhYZCAqbSkgeyBzdGQ6OmNvdXQgPDwgY190b19laWdlbihtKSA8PCBzdGQ6OmVuZGw7IH0KIAotdm9pZCBNYXRyaXhYZF9wcmludChjb25zdCBDX01hdHJpeFhkICptKQotewotICBzdGQ6OmNvdXQgPDwgY190b19laWdlbihtKSA8PCBzdGQ6OmVuZGw7Ci19Ci0KLXZvaWQgTWF0cml4WGRfbXVsdGlwbHkoY29uc3QgQ19NYXRyaXhYZCAqbTEsIGNvbnN0IENfTWF0cml4WGQgKm0yLCBDX01hdHJpeFhkICpyZXN1bHQpCi17Cit2b2lkIE1hdHJpeFhkX211bHRpcGx5KGNvbnN0IENfTWF0cml4WGQgKm0xLCBjb25zdCBDX01hdHJpeFhkICptMiwgQ19NYXRyaXhYZCAqcmVzdWx0KSB7CiAgIGNfdG9fZWlnZW4ocmVzdWx0KSA9IGNfdG9fZWlnZW4obTEpICogY190b19laWdlbihtMik7CiB9CiAKLXZvaWQgTWF0cml4WGRfYWRkKGNvbnN0IENfTWF0cml4WGQgKm0xLCBjb25zdCBDX01hdHJpeFhkICptMiwgQ19NYXRyaXhYZCAqcmVzdWx0KQotewordm9pZCBNYXRyaXhYZF9hZGQoY29uc3QgQ19NYXRyaXhYZCAqbTEsIGNvbnN0IENfTWF0cml4WGQgKm0yLCBDX01hdHJpeFhkICpyZXN1bHQpIHsKICAgY190b19laWdlbihyZXN1bHQpID0gY190b19laWdlbihtMSkgKyBjX3RvX2VpZ2VuKG0yKTsKIH0KIAotCi0KIC8vLy8vLyBjbGFzcyBNYXBfTWF0cml4WGQgLy8vLy8vCiAKLQotQ19NYXBfTWF0cml4WGQqIE1hcF9NYXRyaXhYZF9uZXcoZG91YmxlICphcnJheSwgaW50IHJvd3MsIGludCBjb2xzKQotewotICByZXR1cm4gZWlnZW5fdG9fYygqbmV3IE1hcDxNYXRyaXhYZD4oYXJyYXkscm93cyxjb2xzKSk7CitDX01hcF9NYXRyaXhYZCAqTWFwX01hdHJpeFhkX25ldyhkb3VibGUgKmFycmF5LCBpbnQgcm93cywgaW50IGNvbHMpIHsKKyAgcmV0dXJuIGVpZ2VuX3RvX2MoKm5ldyBNYXA8TWF0cml4WGQ+KGFycmF5LCByb3dzLCBjb2xzKSk7CiB9CiAKLXZvaWQgTWFwX01hdHJpeFhkX2RlbGV0ZShDX01hcF9NYXRyaXhYZCAqbSkKLXsKLSAgZGVsZXRlICZjX3RvX2VpZ2VuKG0pOwotfQordm9pZCBNYXBfTWF0cml4WGRfZGVsZXRlKENfTWFwX01hdHJpeFhkICptKSB7IGRlbGV0ZSAmY190b19laWdlbihtKTsgfQogCi12b2lkIE1hcF9NYXRyaXhYZF9zZXRfemVybyhDX01hcF9NYXRyaXhYZCAqbSkKLXsKLSAgY190b19laWdlbihtKS5zZXRaZXJvKCk7Ci19Cit2b2lkIE1hcF9NYXRyaXhYZF9zZXRfemVybyhDX01hcF9NYXRyaXhYZCAqbSkgeyBjX3RvX2VpZ2VuKG0pLnNldFplcm8oKTsgfQogCi12b2lkIE1hcF9NYXRyaXhYZF9jb3B5KENfTWFwX01hdHJpeFhkICpkc3QsIGNvbnN0IENfTWFwX01hdHJpeFhkICpzcmMpCi17Ci0gIGNfdG9fZWlnZW4oZHN0KSA9IGNfdG9fZWlnZW4oc3JjKTsKLX0KK3ZvaWQgTWFwX01hdHJpeFhkX2NvcHkoQ19NYXBfTWF0cml4WGQgKmRzdCwgY29uc3QgQ19NYXBfTWF0cml4WGQgKnNyYykgeyBjX3RvX2VpZ2VuKGRzdCkgPSBjX3RvX2VpZ2VuKHNyYyk7IH0KIAotdm9pZCBNYXBfTWF0cml4WGRfY29weV9tYXRyaXgoQ19NYXBfTWF0cml4WGQgKmRzdCwgY29uc3QgQ19NYXRyaXhYZCAqc3JjKQotewotICBjX3RvX2VpZ2VuKGRzdCkgPSBjX3RvX2VpZ2VuKHNyYyk7Ci19Cit2b2lkIE1hcF9NYXRyaXhYZF9jb3B5X21hdHJpeChDX01hcF9NYXRyaXhYZCAqZHN0LCBjb25zdCBDX01hdHJpeFhkICpzcmMpIHsgY190b19laWdlbihkc3QpID0gY190b19laWdlbihzcmMpOyB9CiAKLXZvaWQgTWFwX01hdHJpeFhkX3NldF9jb2VmZihDX01hcF9NYXRyaXhYZCAqbSwgaW50IGksIGludCBqLCBkb3VibGUgY29lZmYpCi17Ci0gIGNfdG9fZWlnZW4obSkoaSxqKSA9IGNvZWZmOwotfQordm9pZCBNYXBfTWF0cml4WGRfc2V0X2NvZWZmKENfTWFwX01hdHJpeFhkICptLCBpbnQgaSwgaW50IGosIGRvdWJsZSBjb2VmZikgeyBjX3RvX2VpZ2VuKG0pKGksIGopID0gY29lZmY7IH0KIAotZG91YmxlIE1hcF9NYXRyaXhYZF9nZXRfY29lZmYoY29uc3QgQ19NYXBfTWF0cml4WGQgKm0sIGludCBpLCBpbnQgaikKLXsKLSAgcmV0dXJuIGNfdG9fZWlnZW4obSkoaSxqKTsKLX0KK2RvdWJsZSBNYXBfTWF0cml4WGRfZ2V0X2NvZWZmKGNvbnN0IENfTWFwX01hdHJpeFhkICptLCBpbnQgaSwgaW50IGopIHsgcmV0dXJuIGNfdG9fZWlnZW4obSkoaSwgaik7IH0KIAotdm9pZCBNYXBfTWF0cml4WGRfcHJpbnQoY29uc3QgQ19NYXBfTWF0cml4WGQgKm0pCi17Ci0gIHN0ZDo6Y291dCA8PCBjX3RvX2VpZ2VuKG0pIDw8IHN0ZDo6ZW5kbDsKLX0KK3ZvaWQgTWFwX01hdHJpeFhkX3ByaW50KGNvbnN0IENfTWFwX01hdHJpeFhkICptKSB7IHN0ZDo6Y291dCA8PCBjX3RvX2VpZ2VuKG0pIDw8IHN0ZDo6ZW5kbDsgfQogCi12b2lkIE1hcF9NYXRyaXhYZF9tdWx0aXBseShjb25zdCBDX01hcF9NYXRyaXhYZCAqbTEsIGNvbnN0IENfTWFwX01hdHJpeFhkICptMiwgQ19NYXBfTWF0cml4WGQgKnJlc3VsdCkKLXsKK3ZvaWQgTWFwX01hdHJpeFhkX211bHRpcGx5KGNvbnN0IENfTWFwX01hdHJpeFhkICptMSwgY29uc3QgQ19NYXBfTWF0cml4WGQgKm0yLCBDX01hcF9NYXRyaXhYZCAqcmVzdWx0KSB7CiAgIGNfdG9fZWlnZW4ocmVzdWx0KSA9IGNfdG9fZWlnZW4obTEpICogY190b19laWdlbihtMik7CiB9CiAKLXZvaWQgTWFwX01hdHJpeFhkX2FkZChjb25zdCBDX01hcF9NYXRyaXhYZCAqbTEsIGNvbnN0IENfTWFwX01hdHJpeFhkICptMiwgQ19NYXBfTWF0cml4WGQgKnJlc3VsdCkKLXsKK3ZvaWQgTWFwX01hdHJpeFhkX2FkZChjb25zdCBDX01hcF9NYXRyaXhYZCAqbTEsIGNvbnN0IENfTWFwX01hdHJpeFhkICptMiwgQ19NYXBfTWF0cml4WGQgKnJlc3VsdCkgewogICBjX3RvX2VpZ2VuKHJlc3VsdCkgPSBjX3RvX2VpZ2VuKG0xKSArIGNfdG9fZWlnZW4obTIpOwogfQpkaWZmIC0tZ2l0IGEvZGVtb3MvbWl4X2VpZ2VuX2FuZF9jL2JpbmFyeV9saWJyYXJ5LmggYi9kZW1vcy9taXhfZWlnZW5fYW5kX2MvYmluYXJ5X2xpYnJhcnkuaAppbmRleCA5YjYzZmFjLi45ZjE2MzgyIDEwMDY0NAotLS0gYS9kZW1vcy9taXhfZWlnZW5fYW5kX2MvYmluYXJ5X2xpYnJhcnkuaAorKysgYi9kZW1vcy9taXhfZWlnZW5fYW5kX2MvYmluYXJ5X2xpYnJhcnkuaApAQCAtMTMsNTkgKzEzLDQzIEBACiAvLyB0aGV5IHdpbGwgYmUgY29tcGlsZWQgdG8gQyBvYmplY3QgY29kZS4KIAogI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17CitleHRlcm4gIkMiIHsKICNlbmRpZgogCi0gIC8vIGp1c3QgZHVtbXkgZW1wdHkgc3RydWN0cyB0byBnaXZlIGRpZmZlcmVudCBwb2ludGVyIHR5cGVzLAotICAvLyBpbnN0ZWFkIG9mIHVzaW5nIHZvaWQqIHdoaWNoIHdvdWxkIGJlIHR5cGUgdW5zYWZlCi0gIHN0cnVjdCBDX01hdHJpeFhkIHt9OwotICBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQge307CisvLyBqdXN0IGR1bW15IGVtcHR5IHN0cnVjdHMgdG8gZ2l2ZSBkaWZmZXJlbnQgcG9pbnRlciB0eXBlcywKKy8vIGluc3RlYWQgb2YgdXNpbmcgdm9pZCogd2hpY2ggd291bGQgYmUgdHlwZSB1bnNhZmUKK3N0cnVjdCBDX01hdHJpeFhkIHt9Oworc3RydWN0IENfTWFwX01hdHJpeFhkIHt9OwogCi0gIC8vIHRoZSBDX01hdHJpeFhkIGNsYXNzLCB3cmFwcyBzb21lIG9mIHRoZSBmdW5jdGlvbmFsaXR5Ci0gIC8vIG9mIEVpZ2VuOjpNYXRyaXhYZC4KLSAgc3RydWN0IENfTWF0cml4WGQqIE1hdHJpeFhkX25ldyhpbnQgcm93cywgaW50IGNvbHMpOwotICB2b2lkICAgIE1hdHJpeFhkX2RlbGV0ZSAgICAgKHN0cnVjdCBDX01hdHJpeFhkICptKTsKLSAgZG91YmxlKiBNYXRyaXhYZF9kYXRhICAgICAgIChzdHJ1Y3QgQ19NYXRyaXhYZCAqbSk7Ci0gIHZvaWQgICAgTWF0cml4WGRfc2V0X3plcm8gICAoc3RydWN0IENfTWF0cml4WGQgKm0pOwotICB2b2lkICAgIE1hdHJpeFhkX3Jlc2l6ZSAgICAgKHN0cnVjdCBDX01hdHJpeFhkICptLCBpbnQgcm93cywgaW50IGNvbHMpOwotICB2b2lkICAgIE1hdHJpeFhkX2NvcHkgICAgICAgKHN0cnVjdCBDX01hdHJpeFhkICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IENfTWF0cml4WGQgKnNyYyk7Ci0gIHZvaWQgICAgTWF0cml4WGRfY29weV9tYXAgICAoc3RydWN0IENfTWF0cml4WGQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKnNyYyk7ICAKLSAgdm9pZCAgICBNYXRyaXhYZF9zZXRfY29lZmYgIChzdHJ1Y3QgQ19NYXRyaXhYZCAqbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGosIGRvdWJsZSBjb2VmZik7Ci0gIGRvdWJsZSAgTWF0cml4WGRfZ2V0X2NvZWZmICAoY29uc3Qgc3RydWN0IENfTWF0cml4WGQgKm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBqKTsKLSAgdm9pZCAgICBNYXRyaXhYZF9wcmludCAgICAgIChjb25zdCBzdHJ1Y3QgQ19NYXRyaXhYZCAqbSk7Ci0gIHZvaWQgICAgTWF0cml4WGRfYWRkICAgICAgICAoY29uc3Qgc3RydWN0IENfTWF0cml4WGQgKm0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBDX01hdHJpeFhkICptMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ19NYXRyaXhYZCAqcmVzdWx0KTsgIAotICB2b2lkICAgIE1hdHJpeFhkX211bHRpcGx5ICAgKGNvbnN0IHN0cnVjdCBDX01hdHJpeFhkICptMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgQ19NYXRyaXhYZCAqbTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENfTWF0cml4WGQgKnJlc3VsdCk7Ci0gIAotICAvLyB0aGUgQ19NYXBfTWF0cml4WGQgY2xhc3MsIHdyYXBzIHNvbWUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkKLSAgLy8gb2YgRWlnZW46Ok1hcDxNYXRyaXhYZD4KLSAgc3RydWN0IENfTWFwX01hdHJpeFhkKiBNYXBfTWF0cml4WGRfbmV3KGRvdWJsZSAqYXJyYXksIGludCByb3dzLCBpbnQgY29scyk7Ci0gIHZvaWQgICBNYXBfTWF0cml4WGRfZGVsZXRlICAgICAoc3RydWN0IENfTWFwX01hdHJpeFhkICptKTsKLSAgdm9pZCAgIE1hcF9NYXRyaXhYZF9zZXRfemVybyAgIChzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm0pOwotICB2b2lkICAgTWFwX01hdHJpeFhkX2NvcHkgICAgICAgKHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqc3JjKTsKLSAgdm9pZCAgIE1hcF9NYXRyaXhYZF9jb3B5X21hdHJpeChzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgQ19NYXRyaXhYZCAqc3JjKTsgIAotICB2b2lkICAgTWFwX01hdHJpeFhkX3NldF9jb2VmZiAgKHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGosIGRvdWJsZSBjb2VmZik7Ci0gIGRvdWJsZSBNYXBfTWF0cml4WGRfZ2V0X2NvZWZmICAoY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgaik7Ci0gIHZvaWQgICBNYXBfTWF0cml4WGRfcHJpbnQgICAgICAoY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICptKTsKLSAgdm9pZCAgIE1hcF9NYXRyaXhYZF9hZGQgICAgICAgIChjb25zdCBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENfTWFwX01hdHJpeFhkICpyZXN1bHQpOyAgCi0gIHZvaWQgICBNYXBfTWF0cml4WGRfbXVsdGlwbHkgICAoY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICptMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm0yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqcmVzdWx0KTsKKy8vIHRoZSBDX01hdHJpeFhkIGNsYXNzLCB3cmFwcyBzb21lIG9mIHRoZSBmdW5jdGlvbmFsaXR5CisvLyBvZiBFaWdlbjo6TWF0cml4WGQuCitzdHJ1Y3QgQ19NYXRyaXhYZCAqTWF0cml4WGRfbmV3KGludCByb3dzLCBpbnQgY29scyk7Cit2b2lkIE1hdHJpeFhkX2RlbGV0ZShzdHJ1Y3QgQ19NYXRyaXhYZCAqbSk7Citkb3VibGUgKk1hdHJpeFhkX2RhdGEoc3RydWN0IENfTWF0cml4WGQgKm0pOwordm9pZCBNYXRyaXhYZF9zZXRfemVybyhzdHJ1Y3QgQ19NYXRyaXhYZCAqbSk7Cit2b2lkIE1hdHJpeFhkX3Jlc2l6ZShzdHJ1Y3QgQ19NYXRyaXhYZCAqbSwgaW50IHJvd3MsIGludCBjb2xzKTsKK3ZvaWQgTWF0cml4WGRfY29weShzdHJ1Y3QgQ19NYXRyaXhYZCAqZHN0LCBjb25zdCBzdHJ1Y3QgQ19NYXRyaXhYZCAqc3JjKTsKK3ZvaWQgTWF0cml4WGRfY29weV9tYXAoc3RydWN0IENfTWF0cml4WGQgKmRzdCwgY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICpzcmMpOwordm9pZCBNYXRyaXhYZF9zZXRfY29lZmYoc3RydWN0IENfTWF0cml4WGQgKm0sIGludCBpLCBpbnQgaiwgZG91YmxlIGNvZWZmKTsKK2RvdWJsZSBNYXRyaXhYZF9nZXRfY29lZmYoY29uc3Qgc3RydWN0IENfTWF0cml4WGQgKm0sIGludCBpLCBpbnQgaik7Cit2b2lkIE1hdHJpeFhkX3ByaW50KGNvbnN0IHN0cnVjdCBDX01hdHJpeFhkICptKTsKK3ZvaWQgTWF0cml4WGRfYWRkKGNvbnN0IHN0cnVjdCBDX01hdHJpeFhkICptMSwgY29uc3Qgc3RydWN0IENfTWF0cml4WGQgKm0yLCBzdHJ1Y3QgQ19NYXRyaXhYZCAqcmVzdWx0KTsKK3ZvaWQgTWF0cml4WGRfbXVsdGlwbHkoY29uc3Qgc3RydWN0IENfTWF0cml4WGQgKm0xLCBjb25zdCBzdHJ1Y3QgQ19NYXRyaXhYZCAqbTIsIHN0cnVjdCBDX01hdHJpeFhkICpyZXN1bHQpOworCisvLyB0aGUgQ19NYXBfTWF0cml4WGQgY2xhc3MsIHdyYXBzIHNvbWUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkKKy8vIG9mIEVpZ2VuOjpNYXA8TWF0cml4WGQ+CitzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKk1hcF9NYXRyaXhYZF9uZXcoZG91YmxlICphcnJheSwgaW50IHJvd3MsIGludCBjb2xzKTsKK3ZvaWQgTWFwX01hdHJpeFhkX2RlbGV0ZShzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm0pOwordm9pZCBNYXBfTWF0cml4WGRfc2V0X3plcm8oc3RydWN0IENfTWFwX01hdHJpeFhkICptKTsKK3ZvaWQgTWFwX01hdHJpeFhkX2NvcHkoc3RydWN0IENfTWFwX01hdHJpeFhkICpkc3QsIGNvbnN0IHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqc3JjKTsKK3ZvaWQgTWFwX01hdHJpeFhkX2NvcHlfbWF0cml4KHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqZHN0LCBjb25zdCBzdHJ1Y3QgQ19NYXRyaXhYZCAqc3JjKTsKK3ZvaWQgTWFwX01hdHJpeFhkX3NldF9jb2VmZihzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm0sIGludCBpLCBpbnQgaiwgZG91YmxlIGNvZWZmKTsKK2RvdWJsZSBNYXBfTWF0cml4WGRfZ2V0X2NvZWZmKGNvbnN0IHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbSwgaW50IGksIGludCBqKTsKK3ZvaWQgTWFwX01hdHJpeFhkX3ByaW50KGNvbnN0IHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqbSk7Cit2b2lkIE1hcF9NYXRyaXhYZF9hZGQoY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICptMSwgY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICptMiwgc3RydWN0IENfTWFwX01hdHJpeFhkICpyZXN1bHQpOwordm9pZCBNYXBfTWF0cml4WGRfbXVsdGlwbHkoY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICptMSwgY29uc3Qgc3RydWN0IENfTWFwX01hdHJpeFhkICptMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDX01hcF9NYXRyaXhYZCAqcmVzdWx0KTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGVuZCBleHRlcm4gIkMiCit9ICAvLyBlbmQgZXh0ZXJuICJDIgogI2VuZGlmCmRpZmYgLS1naXQgYS9kZW1vcy9taXhfZWlnZW5fYW5kX2MvZXhhbXBsZS5jIGIvZGVtb3MvbWl4X2VpZ2VuX2FuZF9jL2V4YW1wbGUuYwppbmRleCA1MDhlYjU0Li43OTBjNDViIDEwMDY0NAotLS0gYS9kZW1vcy9taXhfZWlnZW5fYW5kX2MvZXhhbXBsZS5jCisrKyBiL2RlbW9zL21peF9laWdlbl9hbmRfYy9leGFtcGxlLmMKQEAgLTEwLDExICsxMCwxMCBAQAogI2luY2x1ZGUgImJpbmFyeV9saWJyYXJ5LmgiCiAjaW5jbHVkZSAic3RkaW8uaCIKIAotdm9pZCBkZW1vX01hdHJpeFhkKCkKLXsKK3ZvaWQgZGVtb19NYXRyaXhYZCgpIHsKICAgc3RydWN0IENfTWF0cml4WGQgKm1hdHJpeDEsICptYXRyaXgyLCAqcmVzdWx0OwogICBwcmludGYoIioqKiBkZW1vX01hdHJpeFhkICoqKlxuIik7Ci0gIAorCiAgIG1hdHJpeDEgPSBNYXRyaXhYZF9uZXcoMywgMyk7CiAgIE1hdHJpeFhkX3NldF96ZXJvKG1hdHJpeDEpOwogICBNYXRyaXhYZF9zZXRfY29lZmYobWF0cml4MSwgMCwgMSwgMi41KTsKQEAgLTMyLDI0ICszMSwyMiBAQAogfQogCiAvLyB0aGlzIGhlbHBlciBmdW5jdGlvbiB0YWtlcyBhIHBsYWluIEMgYXJyYXkgYW5kIHByaW50cyBpdCBpbiBvbmUgbGluZQotdm9pZCBwcmludF9hcnJheShkb3VibGUgKmFycmF5LCBpbnQgbikKLXsKK3ZvaWQgcHJpbnRfYXJyYXkoZG91YmxlICphcnJheSwgaW50IG4pIHsKICAgc3RydWN0IENfTWFwX01hdHJpeFhkICptID0gTWFwX01hdHJpeFhkX25ldyhhcnJheSwgMSwgbik7CiAgIE1hcF9NYXRyaXhYZF9wcmludChtKTsKICAgTWFwX01hdHJpeFhkX2RlbGV0ZShtKTsKIH0KIAotdm9pZCBkZW1vX01hcF9NYXRyaXhYZCgpCi17Cit2b2lkIGRlbW9fTWFwX01hdHJpeFhkKCkgewogICBzdHJ1Y3QgQ19NYXBfTWF0cml4WGQgKm1hcDsKICAgZG91YmxlIGFycmF5WzVdOwogICBpbnQgaTsKICAgcHJpbnRmKCIqKiogZGVtb19NYXBfTWF0cml4WGQgKioqXG4iKTsKLSAgCi0gIGZvcihpID0gMDsgaSA8IDU7ICsraSkgYXJyYXlbaV0gPSBpOworCisgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIGFycmF5W2ldID0gaTsKICAgcHJpbnRmKCJJbml0aWFsbHksIHRoZSBhcnJheSBpczpcbiIpOwogICBwcmludF9hcnJheShhcnJheSwgNSk7Ci0gIAorCiAgIG1hcCA9IE1hcF9NYXRyaXhYZF9uZXcoYXJyYXksIDUsIDEpOwogICBNYXBfTWF0cml4WGRfYWRkKG1hcCwgbWFwLCBtYXApOwogICBNYXBfTWF0cml4WGRfZGVsZXRlKG1hcCk7CkBAIC01OCw4ICs1NSw3IEBACiAgIHByaW50X2FycmF5KGFycmF5LCA1KTsKIH0KIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIGRlbW9fTWF0cml4WGQoKTsKICAgZGVtb19NYXBfTWF0cml4WGQoKTsKIH0KZGlmZiAtLWdpdCBhL2RlbW9zL29wZW5nbC9jYW1lcmEuY3BwIGIvZGVtb3Mvb3BlbmdsL2NhbWVyYS5jcHAKaW5kZXggOGEyMzQ0Yy4uZWEwMWQ5MCAxMDA2NDQKLS0tIGEvZGVtb3Mvb3BlbmdsL2NhbWVyYS5jcHAKKysrIGIvZGVtb3Mvb3BlbmdsL2NhbWVyYS5jcHAKQEAgLTE1LDI1MCArMTUsMjA1IEBACiAjaW5jbHVkZSAiRWlnZW4vTFUiCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLUNhbWVyYTo6Q2FtZXJhKCkKLSAgICA6IG1WaWV3SXNVcHRvZGF0ZShmYWxzZSksIG1Qcm9qSXNVcHRvZGF0ZShmYWxzZSkKLXsKLSAgICBtVmlld01hdHJpeC5zZXRJZGVudGl0eSgpOwotICAgIAotICAgIG1Gb3ZZID0gTV9QSS8zLjsKLSAgICBtTmVhckRpc3QgPSAxLjsKLSAgICBtRmFyRGlzdCA9IDUwMDAwLjsKLSAgICAKLSAgICBtVnBYID0gMDsKLSAgICBtVnBZID0gMDsKK0NhbWVyYTo6Q2FtZXJhKCkgOiBtVmlld0lzVXB0b2RhdGUoZmFsc2UpLCBtUHJvaklzVXB0b2RhdGUoZmFsc2UpIHsKKyAgbVZpZXdNYXRyaXguc2V0SWRlbnRpdHkoKTsKIAotICAgIHNldFBvc2l0aW9uKFZlY3RvcjNmOjpDb25zdGFudCgxMDAuKSk7Ci0gICAgc2V0VGFyZ2V0KFZlY3RvcjNmOjpaZXJvKCkpOworICBtRm92WSA9IE1fUEkgLyAzLjsKKyAgbU5lYXJEaXN0ID0gMS47CisgIG1GYXJEaXN0ID0gNTAwMDAuOworCisgIG1WcFggPSAwOworICBtVnBZID0gMDsKKworICBzZXRQb3NpdGlvbihWZWN0b3IzZjo6Q29uc3RhbnQoMTAwLikpOworICBzZXRUYXJnZXQoVmVjdG9yM2Y6Olplcm8oKSk7CiB9CiAKLUNhbWVyYSYgQ2FtZXJhOjpvcGVyYXRvcj0oY29uc3QgQ2FtZXJhJiBvdGhlcikKLXsKLSAgICBtVmlld0lzVXB0b2RhdGUgPSBmYWxzZTsKLSAgICBtUHJvaklzVXB0b2RhdGUgPSBmYWxzZTsKLSAgICAKLSAgICBtVnBYID0gb3RoZXIubVZwWDsKLSAgICBtVnBZID0gb3RoZXIubVZwWTsKLSAgICBtVnBXaWR0aCA9IG90aGVyLm1WcFdpZHRoOwotICAgIG1WcEhlaWdodCA9IG90aGVyLm1WcEhlaWdodDsKK0NhbWVyYSYgQ2FtZXJhOjpvcGVyYXRvcj0oY29uc3QgQ2FtZXJhJiBvdGhlcikgeworICBtVmlld0lzVXB0b2RhdGUgPSBmYWxzZTsKKyAgbVByb2pJc1VwdG9kYXRlID0gZmFsc2U7CiAKLSAgICBtVGFyZ2V0ID0gb3RoZXIubVRhcmdldDsKLSAgICBtRm92WSA9IG90aGVyLm1Gb3ZZOwotICAgIG1OZWFyRGlzdCA9IG90aGVyLm1OZWFyRGlzdDsKLSAgICBtRmFyRGlzdCA9IG90aGVyLm1GYXJEaXN0OwotICAgIAotICAgIG1WaWV3TWF0cml4ID0gb3RoZXIubVZpZXdNYXRyaXg7Ci0gICAgbVByb2plY3Rpb25NYXRyaXggPSBvdGhlci5tUHJvamVjdGlvbk1hdHJpeDsKKyAgbVZwWCA9IG90aGVyLm1WcFg7CisgIG1WcFkgPSBvdGhlci5tVnBZOworICBtVnBXaWR0aCA9IG90aGVyLm1WcFdpZHRoOworICBtVnBIZWlnaHQgPSBvdGhlci5tVnBIZWlnaHQ7CiAKLSAgICByZXR1cm4gKnRoaXM7CisgIG1UYXJnZXQgPSBvdGhlci5tVGFyZ2V0OworICBtRm92WSA9IG90aGVyLm1Gb3ZZOworICBtTmVhckRpc3QgPSBvdGhlci5tTmVhckRpc3Q7CisgIG1GYXJEaXN0ID0gb3RoZXIubUZhckRpc3Q7CisKKyAgbVZpZXdNYXRyaXggPSBvdGhlci5tVmlld01hdHJpeDsKKyAgbVByb2plY3Rpb25NYXRyaXggPSBvdGhlci5tUHJvamVjdGlvbk1hdHJpeDsKKworICByZXR1cm4gKnRoaXM7CiB9CiAKLUNhbWVyYTo6Q2FtZXJhKGNvbnN0IENhbWVyYSYgb3RoZXIpCi17Ci0gICAgKnRoaXMgPSBvdGhlcjsKK0NhbWVyYTo6Q2FtZXJhKGNvbnN0IENhbWVyYSYgb3RoZXIpIHsgKnRoaXMgPSBvdGhlcjsgfQorCitDYW1lcmE6On5DYW1lcmEoKSB7fQorCit2b2lkIENhbWVyYTo6c2V0Vmlld3BvcnQodWludCBvZmZzZXR4LCB1aW50IG9mZnNldHksIHVpbnQgd2lkdGgsIHVpbnQgaGVpZ2h0KSB7CisgIG1WcFggPSBvZmZzZXR4OworICBtVnBZID0gb2Zmc2V0eTsKKyAgbVZwV2lkdGggPSB3aWR0aDsKKyAgbVZwSGVpZ2h0ID0gaGVpZ2h0OworCisgIG1Qcm9qSXNVcHRvZGF0ZSA9IGZhbHNlOwogfQogCi1DYW1lcmE6On5DYW1lcmEoKQotewordm9pZCBDYW1lcmE6OnNldFZpZXdwb3J0KHVpbnQgd2lkdGgsIHVpbnQgaGVpZ2h0KSB7CisgIG1WcFdpZHRoID0gd2lkdGg7CisgIG1WcEhlaWdodCA9IGhlaWdodDsKKworICBtUHJvaklzVXB0b2RhdGUgPSBmYWxzZTsKIH0KIAotCi12b2lkIENhbWVyYTo6c2V0Vmlld3BvcnQodWludCBvZmZzZXR4LCB1aW50IG9mZnNldHksIHVpbnQgd2lkdGgsIHVpbnQgaGVpZ2h0KQotewotICAgIG1WcFggPSBvZmZzZXR4OwotICAgIG1WcFkgPSBvZmZzZXR5OwotICAgIG1WcFdpZHRoID0gd2lkdGg7Ci0gICAgbVZwSGVpZ2h0ID0gaGVpZ2h0OwotICAgIAotICAgIG1Qcm9qSXNVcHRvZGF0ZSA9IGZhbHNlOwordm9pZCBDYW1lcmE6OnNldEZvdlkoZmxvYXQgdmFsdWUpIHsKKyAgbUZvdlkgPSB2YWx1ZTsKKyAgbVByb2pJc1VwdG9kYXRlID0gZmFsc2U7CiB9CiAKLXZvaWQgQ2FtZXJhOjpzZXRWaWV3cG9ydCh1aW50IHdpZHRoLCB1aW50IGhlaWdodCkKLXsKLSAgICBtVnBXaWR0aCA9IHdpZHRoOwotICAgIG1WcEhlaWdodCA9IGhlaWdodDsKLSAgICAKLSAgICBtUHJvaklzVXB0b2RhdGUgPSBmYWxzZTsKK1ZlY3RvcjNmIENhbWVyYTo6ZGlyZWN0aW9uKHZvaWQpIGNvbnN0IHsgcmV0dXJuIC0ob3JpZW50YXRpb24oKSAqIFZlY3RvcjNmOjpVbml0WigpKTsgfQorVmVjdG9yM2YgQ2FtZXJhOjp1cCh2b2lkKSBjb25zdCB7IHJldHVybiBvcmllbnRhdGlvbigpICogVmVjdG9yM2Y6OlVuaXRZKCk7IH0KK1ZlY3RvcjNmIENhbWVyYTo6cmlnaHQodm9pZCkgY29uc3QgeyByZXR1cm4gb3JpZW50YXRpb24oKSAqIFZlY3RvcjNmOjpVbml0WCgpOyB9CisKK3ZvaWQgQ2FtZXJhOjpzZXREaXJlY3Rpb24oY29uc3QgVmVjdG9yM2YmIG5ld0RpcmVjdGlvbikgeworICAvLyBUT0RPIGltcGxlbWVudCBpdCBjb21wdXRpbmcgdGhlIHJvdGF0aW9uIGJldHdlZW4gbmV3RGlyZWN0aW9uIGFuZCBjdXJyZW50IGRpciA/CisgIFZlY3RvcjNmIHVwID0gdGhpcy0+dXAoKTsKKworICBNYXRyaXgzZiBjYW1BeGVzOworCisgIGNhbUF4ZXMuY29sKDIpID0gKC1uZXdEaXJlY3Rpb24pLm5vcm1hbGl6ZWQoKTsKKyAgY2FtQXhlcy5jb2woMCkgPSB1cC5jcm9zcyhjYW1BeGVzLmNvbCgyKSkubm9ybWFsaXplZCgpOworICBjYW1BeGVzLmNvbCgxKSA9IGNhbUF4ZXMuY29sKDIpLmNyb3NzKGNhbUF4ZXMuY29sKDApKS5ub3JtYWxpemVkKCk7CisgIHNldE9yaWVudGF0aW9uKFF1YXRlcm5pb25mKGNhbUF4ZXMpKTsKKworICBtVmlld0lzVXB0b2RhdGUgPSBmYWxzZTsKIH0KIAotdm9pZCBDYW1lcmE6OnNldEZvdlkoZmxvYXQgdmFsdWUpCi17Ci0gICAgbUZvdlkgPSB2YWx1ZTsKLSAgICBtUHJvaklzVXB0b2RhdGUgPSBmYWxzZTsKK3ZvaWQgQ2FtZXJhOjpzZXRUYXJnZXQoY29uc3QgVmVjdG9yM2YmIHRhcmdldCkgeworICBtVGFyZ2V0ID0gdGFyZ2V0OworICBpZiAoIW1UYXJnZXQuaXNBcHByb3gocG9zaXRpb24oKSkpIHsKKyAgICBWZWN0b3IzZiBuZXdEaXJlY3Rpb24gPSBtVGFyZ2V0IC0gcG9zaXRpb24oKTsKKyAgICBzZXREaXJlY3Rpb24obmV3RGlyZWN0aW9uLm5vcm1hbGl6ZWQoKSk7CisgIH0KIH0KIAotVmVjdG9yM2YgQ2FtZXJhOjpkaXJlY3Rpb24odm9pZCkgY29uc3QKLXsKLSAgICByZXR1cm4gLSAob3JpZW50YXRpb24oKSAqIFZlY3RvcjNmOjpVbml0WigpKTsKLX0KLVZlY3RvcjNmIENhbWVyYTo6dXAodm9pZCkgY29uc3QKLXsKLSAgICByZXR1cm4gb3JpZW50YXRpb24oKSAqIFZlY3RvcjNmOjpVbml0WSgpOwotfQotVmVjdG9yM2YgQ2FtZXJhOjpyaWdodCh2b2lkKSBjb25zdAotewotICAgIHJldHVybiBvcmllbnRhdGlvbigpICogVmVjdG9yM2Y6OlVuaXRYKCk7Cit2b2lkIENhbWVyYTo6c2V0UG9zaXRpb24oY29uc3QgVmVjdG9yM2YmIHApIHsKKyAgbUZyYW1lLnBvc2l0aW9uID0gcDsKKyAgbVZpZXdJc1VwdG9kYXRlID0gZmFsc2U7CiB9CiAKLXZvaWQgQ2FtZXJhOjpzZXREaXJlY3Rpb24oY29uc3QgVmVjdG9yM2YmIG5ld0RpcmVjdGlvbikKLXsKLSAgICAvLyBUT0RPIGltcGxlbWVudCBpdCBjb21wdXRpbmcgdGhlIHJvdGF0aW9uIGJldHdlZW4gbmV3RGlyZWN0aW9uIGFuZCBjdXJyZW50IGRpciA/Ci0gICAgVmVjdG9yM2YgdXAgPSB0aGlzLT51cCgpOwotICAgIAotICAgIE1hdHJpeDNmIGNhbUF4ZXM7Ci0KLSAgICBjYW1BeGVzLmNvbCgyKSA9ICgtbmV3RGlyZWN0aW9uKS5ub3JtYWxpemVkKCk7Ci0gICAgY2FtQXhlcy5jb2woMCkgPSB1cC5jcm9zcyggY2FtQXhlcy5jb2woMikgKS5ub3JtYWxpemVkKCk7Ci0gICAgY2FtQXhlcy5jb2woMSkgPSBjYW1BeGVzLmNvbCgyKS5jcm9zcyggY2FtQXhlcy5jb2woMCkgKS5ub3JtYWxpemVkKCk7Ci0gICAgc2V0T3JpZW50YXRpb24oUXVhdGVybmlvbmYoY2FtQXhlcykpOwotICAgIAotICAgIG1WaWV3SXNVcHRvZGF0ZSA9IGZhbHNlOwordm9pZCBDYW1lcmE6OnNldE9yaWVudGF0aW9uKGNvbnN0IFF1YXRlcm5pb25mJiBxKSB7CisgIG1GcmFtZS5vcmllbnRhdGlvbiA9IHE7CisgIG1WaWV3SXNVcHRvZGF0ZSA9IGZhbHNlOwogfQogCi12b2lkIENhbWVyYTo6c2V0VGFyZ2V0KGNvbnN0IFZlY3RvcjNmJiB0YXJnZXQpCi17Ci0gICAgbVRhcmdldCA9IHRhcmdldDsKLSAgICBpZiAoIW1UYXJnZXQuaXNBcHByb3gocG9zaXRpb24oKSkpCi0gICAgewotICAgICAgICBWZWN0b3IzZiBuZXdEaXJlY3Rpb24gPSBtVGFyZ2V0IC0gcG9zaXRpb24oKTsKLSAgICAgICAgc2V0RGlyZWN0aW9uKG5ld0RpcmVjdGlvbi5ub3JtYWxpemVkKCkpOwotICAgIH0KLX0KLQotdm9pZCBDYW1lcmE6OnNldFBvc2l0aW9uKGNvbnN0IFZlY3RvcjNmJiBwKQotewotICAgIG1GcmFtZS5wb3NpdGlvbiA9IHA7Ci0gICAgbVZpZXdJc1VwdG9kYXRlID0gZmFsc2U7Ci19Ci0KLXZvaWQgQ2FtZXJhOjpzZXRPcmllbnRhdGlvbihjb25zdCBRdWF0ZXJuaW9uZiYgcSkKLXsKLSAgICBtRnJhbWUub3JpZW50YXRpb24gPSBxOwotICAgIG1WaWV3SXNVcHRvZGF0ZSA9IGZhbHNlOwotfQotCi12b2lkIENhbWVyYTo6c2V0RnJhbWUoY29uc3QgRnJhbWUmIGYpCi17Cit2b2lkIENhbWVyYTo6c2V0RnJhbWUoY29uc3QgRnJhbWUmIGYpIHsKICAgbUZyYW1lID0gZjsKICAgbVZpZXdJc1VwdG9kYXRlID0gZmFsc2U7CiB9CiAKLXZvaWQgQ2FtZXJhOjpyb3RhdGVBcm91bmRUYXJnZXQoY29uc3QgUXVhdGVybmlvbmYmIHEpCi17Ci0gICAgTWF0cml4NGYgbXJvdCwgbXQsIG10bTsKLSAgICAKLSAgICAvLyB1cGRhdGUgdGhlIHRyYW5zZm9ybSBtYXRyaXgKLSAgICB1cGRhdGVWaWV3TWF0cml4KCk7Ci0gICAgVmVjdG9yM2YgdCA9IG1WaWV3TWF0cml4ICogbVRhcmdldDsKK3ZvaWQgQ2FtZXJhOjpyb3RhdGVBcm91bmRUYXJnZXQoY29uc3QgUXVhdGVybmlvbmYmIHEpIHsKKyAgTWF0cml4NGYgbXJvdCwgbXQsIG10bTsKIAotICAgIG1WaWV3TWF0cml4ID0gVHJhbnNsYXRpb24zZih0KQotICAgICAgICAgICAgICAgICogcQotICAgICAgICAgICAgICAgICogVHJhbnNsYXRpb24zZigtdCkKLSAgICAgICAgICAgICAgICAqIG1WaWV3TWF0cml4OwotICAgIAotICAgIFF1YXRlcm5pb25mIHFhKG1WaWV3TWF0cml4LmxpbmVhcigpKTsKLSAgICBxYSA9IHFhLmNvbmp1Z2F0ZSgpOwotICAgIHNldE9yaWVudGF0aW9uKHFhKTsKLSAgICBzZXRQb3NpdGlvbigtIChxYSAqIG1WaWV3TWF0cml4LnRyYW5zbGF0aW9uKCkpICk7CisgIC8vIHVwZGF0ZSB0aGUgdHJhbnNmb3JtIG1hdHJpeAorICB1cGRhdGVWaWV3TWF0cml4KCk7CisgIFZlY3RvcjNmIHQgPSBtVmlld01hdHJpeCAqIG1UYXJnZXQ7CiAKLSAgICBtVmlld0lzVXB0b2RhdGUgPSB0cnVlOworICBtVmlld01hdHJpeCA9IFRyYW5zbGF0aW9uM2YodCkgKiBxICogVHJhbnNsYXRpb24zZigtdCkgKiBtVmlld01hdHJpeDsKKworICBRdWF0ZXJuaW9uZiBxYShtVmlld01hdHJpeC5saW5lYXIoKSk7CisgIHFhID0gcWEuY29uanVnYXRlKCk7CisgIHNldE9yaWVudGF0aW9uKHFhKTsKKyAgc2V0UG9zaXRpb24oLShxYSAqIG1WaWV3TWF0cml4LnRyYW5zbGF0aW9uKCkpKTsKKworICBtVmlld0lzVXB0b2RhdGUgPSB0cnVlOwogfQogCi12b2lkIENhbWVyYTo6bG9jYWxSb3RhdGUoY29uc3QgUXVhdGVybmlvbmYmIHEpCi17Ci0gICAgZmxvYXQgZGlzdCA9IChwb3NpdGlvbigpIC0gbVRhcmdldCkubm9ybSgpOwotICAgIHNldE9yaWVudGF0aW9uKG9yaWVudGF0aW9uKCkgKiBxKTsKLSAgICBtVGFyZ2V0ID0gcG9zaXRpb24oKSArIGRpc3QgKiBkaXJlY3Rpb24oKTsKK3ZvaWQgQ2FtZXJhOjpsb2NhbFJvdGF0ZShjb25zdCBRdWF0ZXJuaW9uZiYgcSkgeworICBmbG9hdCBkaXN0ID0gKHBvc2l0aW9uKCkgLSBtVGFyZ2V0KS5ub3JtKCk7CisgIHNldE9yaWVudGF0aW9uKG9yaWVudGF0aW9uKCkgKiBxKTsKKyAgbVRhcmdldCA9IHBvc2l0aW9uKCkgKyBkaXN0ICogZGlyZWN0aW9uKCk7CisgIG1WaWV3SXNVcHRvZGF0ZSA9IGZhbHNlOworfQorCit2b2lkIENhbWVyYTo6em9vbShmbG9hdCBkKSB7CisgIGZsb2F0IGRpc3QgPSAocG9zaXRpb24oKSAtIG1UYXJnZXQpLm5vcm0oKTsKKyAgaWYgKGRpc3QgPiBkKSB7CisgICAgc2V0UG9zaXRpb24ocG9zaXRpb24oKSArIGRpcmVjdGlvbigpICogZCk7CiAgICAgbVZpZXdJc1VwdG9kYXRlID0gZmFsc2U7CisgIH0KIH0KIAotdm9pZCBDYW1lcmE6Onpvb20oZmxvYXQgZCkKLXsKLSAgICBmbG9hdCBkaXN0ID0gKHBvc2l0aW9uKCkgLSBtVGFyZ2V0KS5ub3JtKCk7Ci0gICAgaWYoZGlzdCA+IGQpCi0gICAgewotICAgICAgICBzZXRQb3NpdGlvbihwb3NpdGlvbigpICsgZGlyZWN0aW9uKCkgKiBkKTsKLSAgICAgICAgbVZpZXdJc1VwdG9kYXRlID0gZmFsc2U7Ci0gICAgfQotfQotCi12b2lkIENhbWVyYTo6bG9jYWxUcmFuc2xhdGUoY29uc3QgVmVjdG9yM2YmIHQpCi17Cit2b2lkIENhbWVyYTo6bG9jYWxUcmFuc2xhdGUoY29uc3QgVmVjdG9yM2YmIHQpIHsKICAgVmVjdG9yM2YgdHJhbnMgPSBvcmllbnRhdGlvbigpICogdDsKLSAgc2V0UG9zaXRpb24oIHBvc2l0aW9uKCkgKyB0cmFucyApOwotICBzZXRUYXJnZXQoIG1UYXJnZXQgKyB0cmFucyApOworICBzZXRQb3NpdGlvbihwb3NpdGlvbigpICsgdHJhbnMpOworICBzZXRUYXJnZXQobVRhcmdldCArIHRyYW5zKTsKIAogICBtVmlld0lzVXB0b2RhdGUgPSBmYWxzZTsKIH0KIAotdm9pZCBDYW1lcmE6OnVwZGF0ZVZpZXdNYXRyaXgodm9pZCkgY29uc3QKLXsKLSAgICBpZighbVZpZXdJc1VwdG9kYXRlKQotICAgIHsKLSAgICAgICAgUXVhdGVybmlvbmYgcSA9IG9yaWVudGF0aW9uKCkuY29uanVnYXRlKCk7Ci0gICAgICAgIG1WaWV3TWF0cml4LmxpbmVhcigpID0gcS50b1JvdGF0aW9uTWF0cml4KCk7Ci0gICAgICAgIG1WaWV3TWF0cml4LnRyYW5zbGF0aW9uKCkgPSAtIChtVmlld01hdHJpeC5saW5lYXIoKSAqIHBvc2l0aW9uKCkpOwordm9pZCBDYW1lcmE6OnVwZGF0ZVZpZXdNYXRyaXgodm9pZCkgY29uc3QgeworICBpZiAoIW1WaWV3SXNVcHRvZGF0ZSkgeworICAgIFF1YXRlcm5pb25mIHEgPSBvcmllbnRhdGlvbigpLmNvbmp1Z2F0ZSgpOworICAgIG1WaWV3TWF0cml4LmxpbmVhcigpID0gcS50b1JvdGF0aW9uTWF0cml4KCk7CisgICAgbVZpZXdNYXRyaXgudHJhbnNsYXRpb24oKSA9IC0obVZpZXdNYXRyaXgubGluZWFyKCkgKiBwb3NpdGlvbigpKTsKIAotICAgICAgICBtVmlld0lzVXB0b2RhdGUgPSB0cnVlOwotICAgIH0KKyAgICBtVmlld0lzVXB0b2RhdGUgPSB0cnVlOworICB9CiB9CiAKLWNvbnN0IEFmZmluZTNmJiBDYW1lcmE6OnZpZXdNYXRyaXgodm9pZCkgY29uc3QKLXsKK2NvbnN0IEFmZmluZTNmJiBDYW1lcmE6OnZpZXdNYXRyaXgodm9pZCkgY29uc3QgewogICB1cGRhdGVWaWV3TWF0cml4KCk7CiAgIHJldHVybiBtVmlld01hdHJpeDsKIH0KIAotdm9pZCBDYW1lcmE6OnVwZGF0ZVByb2plY3Rpb25NYXRyaXgodm9pZCkgY29uc3QKLXsKLSAgaWYoIW1Qcm9qSXNVcHRvZGF0ZSkKLSAgewordm9pZCBDYW1lcmE6OnVwZGF0ZVByb2plY3Rpb25NYXRyaXgodm9pZCkgY29uc3QgeworICBpZiAoIW1Qcm9qSXNVcHRvZGF0ZSkgewogICAgIG1Qcm9qZWN0aW9uTWF0cml4LnNldElkZW50aXR5KCk7Ci0gICAgZmxvYXQgYXNwZWN0ID0gZmxvYXQobVZwV2lkdGgpL2Zsb2F0KG1WcEhlaWdodCk7Ci0gICAgZmxvYXQgdGhldGEgPSBtRm92WSowLjU7CisgICAgZmxvYXQgYXNwZWN0ID0gZmxvYXQobVZwV2lkdGgpIC8gZmxvYXQobVZwSGVpZ2h0KTsKKyAgICBmbG9hdCB0aGV0YSA9IG1Gb3ZZICogMC41OwogICAgIGZsb2F0IHJhbmdlID0gbUZhckRpc3QgLSBtTmVhckRpc3Q7Ci0gICAgZmxvYXQgaW52dGFuID0gMS4vdGFuKHRoZXRhKTsKKyAgICBmbG9hdCBpbnZ0YW4gPSAxLiAvIHRhbih0aGV0YSk7CiAKLSAgICBtUHJvamVjdGlvbk1hdHJpeCgwLDApID0gaW52dGFuIC8gYXNwZWN0OwotICAgIG1Qcm9qZWN0aW9uTWF0cml4KDEsMSkgPSBpbnZ0YW47Ci0gICAgbVByb2plY3Rpb25NYXRyaXgoMiwyKSA9IC0obU5lYXJEaXN0ICsgbUZhckRpc3QpIC8gcmFuZ2U7Ci0gICAgbVByb2plY3Rpb25NYXRyaXgoMywyKSA9IC0xOwotICAgIG1Qcm9qZWN0aW9uTWF0cml4KDIsMykgPSAtMiAqIG1OZWFyRGlzdCAqIG1GYXJEaXN0IC8gcmFuZ2U7Ci0gICAgbVByb2plY3Rpb25NYXRyaXgoMywzKSA9IDA7Ci0gICAgCisgICAgbVByb2plY3Rpb25NYXRyaXgoMCwgMCkgPSBpbnZ0YW4gLyBhc3BlY3Q7CisgICAgbVByb2plY3Rpb25NYXRyaXgoMSwgMSkgPSBpbnZ0YW47CisgICAgbVByb2plY3Rpb25NYXRyaXgoMiwgMikgPSAtKG1OZWFyRGlzdCArIG1GYXJEaXN0KSAvIHJhbmdlOworICAgIG1Qcm9qZWN0aW9uTWF0cml4KDMsIDIpID0gLTE7CisgICAgbVByb2plY3Rpb25NYXRyaXgoMiwgMykgPSAtMiAqIG1OZWFyRGlzdCAqIG1GYXJEaXN0IC8gcmFuZ2U7CisgICAgbVByb2plY3Rpb25NYXRyaXgoMywgMykgPSAwOworCiAgICAgbVByb2pJc1VwdG9kYXRlID0gdHJ1ZTsKICAgfQogfQogCi1jb25zdCBNYXRyaXg0ZiYgQ2FtZXJhOjpwcm9qZWN0aW9uTWF0cml4KHZvaWQpIGNvbnN0Ci17Citjb25zdCBNYXRyaXg0ZiYgQ2FtZXJhOjpwcm9qZWN0aW9uTWF0cml4KHZvaWQpIGNvbnN0IHsKICAgdXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogICByZXR1cm4gbVByb2plY3Rpb25NYXRyaXg7CiB9CiAKLXZvaWQgQ2FtZXJhOjphY3RpdmF0ZUdMKHZvaWQpCi17Cit2b2lkIENhbWVyYTo6YWN0aXZhdGVHTCh2b2lkKSB7CiAgIGdsVmlld3BvcnQodnBYKCksIHZwWSgpLCB2cFdpZHRoKCksIHZwSGVpZ2h0KCkpOwotICBncHUubG9hZE1hdHJpeChwcm9qZWN0aW9uTWF0cml4KCksR0xfUFJPSkVDVElPTik7Ci0gIGdwdS5sb2FkTWF0cml4KHZpZXdNYXRyaXgoKS5tYXRyaXgoKSxHTF9NT0RFTFZJRVcpOworICBncHUubG9hZE1hdHJpeChwcm9qZWN0aW9uTWF0cml4KCksIEdMX1BST0pFQ1RJT04pOworICBncHUubG9hZE1hdHJpeCh2aWV3TWF0cml4KCkubWF0cml4KCksIEdMX01PREVMVklFVyk7CiB9CiAKLQotVmVjdG9yM2YgQ2FtZXJhOjp1blByb2plY3QoY29uc3QgVmVjdG9yMmYmIHV2LCBmbG9hdCBkZXB0aCkgY29uc3QKLXsKLSAgICBNYXRyaXg0ZiBpbnYgPSBtVmlld01hdHJpeC5pbnZlcnNlKCkubWF0cml4KCk7Ci0gICAgcmV0dXJuIHVuUHJvamVjdCh1diwgZGVwdGgsIGludik7CitWZWN0b3IzZiBDYW1lcmE6OnVuUHJvamVjdChjb25zdCBWZWN0b3IyZiYgdXYsIGZsb2F0IGRlcHRoKSBjb25zdCB7CisgIE1hdHJpeDRmIGludiA9IG1WaWV3TWF0cml4LmludmVyc2UoKS5tYXRyaXgoKTsKKyAgcmV0dXJuIHVuUHJvamVjdCh1diwgZGVwdGgsIGludik7CiB9CiAKLVZlY3RvcjNmIENhbWVyYTo6dW5Qcm9qZWN0KGNvbnN0IFZlY3RvcjJmJiB1diwgZmxvYXQgZGVwdGgsIGNvbnN0IE1hdHJpeDRmJiBpbnZNb2RlbHZpZXcpIGNvbnN0Ci17Ci0gICAgdXBkYXRlVmlld01hdHJpeCgpOwotICAgIHVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKLSAgICAKLSAgICBWZWN0b3IzZiBhKDIuKnV2LngoKS9mbG9hdChtVnBXaWR0aCktMS4sIDIuKnV2LnkoKS9mbG9hdChtVnBIZWlnaHQpLTEuLCAxLik7Ci0gICAgYS54KCkgKj0gZGVwdGgvbVByb2plY3Rpb25NYXRyaXgoMCwwKTsKLSAgICBhLnkoKSAqPSBkZXB0aC9tUHJvamVjdGlvbk1hdHJpeCgxLDEpOwotICAgIGEueigpID0gLWRlcHRoOwotICAgIC8vIEZJWE1FIC9cL3wKLSAgICBWZWN0b3I0ZiBiID0gaW52TW9kZWx2aWV3ICogVmVjdG9yNGYoYS54KCksIGEueSgpLCBhLnooKSwgMS4pOwotICAgIHJldHVybiBWZWN0b3IzZihiLngoKSwgYi55KCksIGIueigpKTsKK1ZlY3RvcjNmIENhbWVyYTo6dW5Qcm9qZWN0KGNvbnN0IFZlY3RvcjJmJiB1diwgZmxvYXQgZGVwdGgsIGNvbnN0IE1hdHJpeDRmJiBpbnZNb2RlbHZpZXcpIGNvbnN0IHsKKyAgdXBkYXRlVmlld01hdHJpeCgpOworICB1cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CisKKyAgVmVjdG9yM2YgYSgyLiAqIHV2LngoKSAvIGZsb2F0KG1WcFdpZHRoKSAtIDEuLCAyLiAqIHV2LnkoKSAvIGZsb2F0KG1WcEhlaWdodCkgLSAxLiwgMS4pOworICBhLngoKSAqPSBkZXB0aCAvIG1Qcm9qZWN0aW9uTWF0cml4KDAsIDApOworICBhLnkoKSAqPSBkZXB0aCAvIG1Qcm9qZWN0aW9uTWF0cml4KDEsIDEpOworICBhLnooKSA9IC1kZXB0aDsKKyAgLy8gRklYTUUgL1wvfAorICBWZWN0b3I0ZiBiID0gaW52TW9kZWx2aWV3ICogVmVjdG9yNGYoYS54KCksIGEueSgpLCBhLnooKSwgMS4pOworICByZXR1cm4gVmVjdG9yM2YoYi54KCksIGIueSgpLCBiLnooKSk7CiB9CmRpZmYgLS1naXQgYS9kZW1vcy9vcGVuZ2wvY2FtZXJhLmggYi9kZW1vcy9vcGVuZ2wvY2FtZXJhLmgKaW5kZXggMTU3MTRkMi4uNjc2YWQyMyAxMDA2NDQKLS0tIGEvZGVtb3Mvb3BlbmdsL2NhbWVyYS5oCisrKyBiL2RlbW9zL29wZW5nbC9jYW1lcmEuaApAQCAtMTQsMTA1ICsxNCw5OCBAQAogI2luY2x1ZGUgPFFPYmplY3Q+CiAvLyAjaW5jbHVkZSA8ZnJhbWUuaD4KIAotY2xhc3MgRnJhbWUKLXsKLSAgcHVibGljOgotICAgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcKLSAgICAKLSAgICBpbmxpbmUgRnJhbWUoY29uc3QgRWlnZW46OlZlY3RvcjNmJiBwb3MgPSBFaWdlbjo6VmVjdG9yM2Y6Olplcm8oKSwKLSAgICAgICAgICAgICAgICAgY29uc3QgRWlnZW46OlF1YXRlcm5pb25mJiBvID0gRWlnZW46OlF1YXRlcm5pb25mKCkpCi0gICAgICA6IG9yaWVudGF0aW9uKG8pLCBwb3NpdGlvbihwb3MpCi0gICAge30KLSAgICBGcmFtZSBsZXJwKGZsb2F0IGFscGhhLCBjb25zdCBGcmFtZSYgb3RoZXIpIGNvbnN0Ci0gICAgewotICAgICAgcmV0dXJuIEZyYW1lKCgxLmYtYWxwaGEpKnBvc2l0aW9uICsgYWxwaGEgKiBvdGhlci5wb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbi5zbGVycChhbHBoYSxvdGhlci5vcmllbnRhdGlvbikpOwotICAgIH0KK2NsYXNzIEZyYW1lIHsKKyBwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcKIAotICAgIEVpZ2VuOjpRdWF0ZXJuaW9uZiBvcmllbnRhdGlvbjsKLSAgICBFaWdlbjo6VmVjdG9yM2YgcG9zaXRpb247CisgIGlubGluZSBGcmFtZShjb25zdCBFaWdlbjo6VmVjdG9yM2YmIHBvcyA9IEVpZ2VuOjpWZWN0b3IzZjo6WmVybygpLCBjb25zdCBFaWdlbjo6UXVhdGVybmlvbmYmIG8gPSBFaWdlbjo6UXVhdGVybmlvbmYoKSkKKyAgICAgIDogb3JpZW50YXRpb24obyksIHBvc2l0aW9uKHBvcykge30KKyAgRnJhbWUgbGVycChmbG9hdCBhbHBoYSwgY29uc3QgRnJhbWUmIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIEZyYW1lKCgxLmYgLSBhbHBoYSkgKiBwb3NpdGlvbiArIGFscGhhICogb3RoZXIucG9zaXRpb24sIG9yaWVudGF0aW9uLnNsZXJwKGFscGhhLCBvdGhlci5vcmllbnRhdGlvbikpOworICB9CisKKyAgRWlnZW46OlF1YXRlcm5pb25mIG9yaWVudGF0aW9uOworICBFaWdlbjo6VmVjdG9yM2YgcG9zaXRpb247CiB9OwogCi1jbGFzcyBDYW1lcmEKLXsKLSAgcHVibGljOgotICAgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcKK2NsYXNzIENhbWVyYSB7CisgcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCiAKLSAgICBDYW1lcmEodm9pZCk7Ci0gICAgCi0gICAgQ2FtZXJhKGNvbnN0IENhbWVyYSYgb3RoZXIpOwotICAgIAotICAgIHZpcnR1YWwgfkNhbWVyYSgpOwotICAgIAotICAgIENhbWVyYSYgb3BlcmF0b3I9KGNvbnN0IENhbWVyYSYgb3RoZXIpOwotICAgIAotICAgIHZvaWQgc2V0Vmlld3BvcnQodWludCBvZmZzZXR4LCB1aW50IG9mZnNldHksIHVpbnQgd2lkdGgsIHVpbnQgaGVpZ2h0KTsKLSAgICB2b2lkIHNldFZpZXdwb3J0KHVpbnQgd2lkdGgsIHVpbnQgaGVpZ2h0KTsKLSAgICAKLSAgICBpbmxpbmUgdWludCB2cFgodm9pZCkgY29uc3QgeyByZXR1cm4gbVZwWDsgfQotICAgIGlubGluZSB1aW50IHZwWSh2b2lkKSBjb25zdCB7IHJldHVybiBtVnBZOyB9Ci0gICAgaW5saW5lIHVpbnQgdnBXaWR0aCh2b2lkKSBjb25zdCB7IHJldHVybiBtVnBXaWR0aDsgfQotICAgIGlubGluZSB1aW50IHZwSGVpZ2h0KHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1WcEhlaWdodDsgfQorICBDYW1lcmEodm9pZCk7CiAKLSAgICBpbmxpbmUgZmxvYXQgZm92WSh2b2lkKSBjb25zdCB7IHJldHVybiBtRm92WTsgfQotICAgIHZvaWQgc2V0Rm92WShmbG9hdCB2YWx1ZSk7Ci0gICAgCi0gICAgdm9pZCBzZXRQb3NpdGlvbihjb25zdCBFaWdlbjo6VmVjdG9yM2YmIHBvcyk7Ci0gICAgaW5saW5lIGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgcG9zaXRpb24odm9pZCkgY29uc3QgeyByZXR1cm4gbUZyYW1lLnBvc2l0aW9uOyB9CisgIENhbWVyYShjb25zdCBDYW1lcmEmIG90aGVyKTsKIAotICAgIHZvaWQgc2V0T3JpZW50YXRpb24oY29uc3QgRWlnZW46OlF1YXRlcm5pb25mJiBxKTsKLSAgICBpbmxpbmUgY29uc3QgRWlnZW46OlF1YXRlcm5pb25mJiBvcmllbnRhdGlvbih2b2lkKSBjb25zdCB7IHJldHVybiBtRnJhbWUub3JpZW50YXRpb247IH0KKyAgdmlydHVhbCB+Q2FtZXJhKCk7CiAKLSAgICB2b2lkIHNldEZyYW1lKGNvbnN0IEZyYW1lJiBmKTsKLSAgICBjb25zdCBGcmFtZSYgZnJhbWUodm9pZCkgY29uc3QgeyByZXR1cm4gbUZyYW1lOyB9Ci0gICAgCi0gICAgdm9pZCBzZXREaXJlY3Rpb24oY29uc3QgRWlnZW46OlZlY3RvcjNmJiBuZXdEaXJlY3Rpb24pOwotICAgIEVpZ2VuOjpWZWN0b3IzZiBkaXJlY3Rpb24odm9pZCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRVcChjb25zdCBFaWdlbjo6VmVjdG9yM2YmIHZlY3RvclVwKTsKLSAgICBFaWdlbjo6VmVjdG9yM2YgdXAodm9pZCkgY29uc3Q7Ci0gICAgRWlnZW46OlZlY3RvcjNmIHJpZ2h0KHZvaWQpIGNvbnN0OwotICAgIAotICAgIHZvaWQgc2V0VGFyZ2V0KGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgdGFyZ2V0KTsKLSAgICBpbmxpbmUgY29uc3QgRWlnZW46OlZlY3RvcjNmJiB0YXJnZXQodm9pZCkgeyByZXR1cm4gbVRhcmdldDsgfQotICAgIAotICAgIGNvbnN0IEVpZ2VuOjpBZmZpbmUzZiYgdmlld01hdHJpeCh2b2lkKSBjb25zdDsKLSAgICBjb25zdCBFaWdlbjo6TWF0cml4NGYmIHByb2plY3Rpb25NYXRyaXgodm9pZCkgY29uc3Q7Ci0gICAgCi0gICAgdm9pZCByb3RhdGVBcm91bmRUYXJnZXQoY29uc3QgRWlnZW46OlF1YXRlcm5pb25mJiBxKTsKLSAgICB2b2lkIGxvY2FsUm90YXRlKGNvbnN0IEVpZ2VuOjpRdWF0ZXJuaW9uZiYgcSk7Ci0gICAgdm9pZCB6b29tKGZsb2F0IGQpOwotICAgIAotICAgIHZvaWQgbG9jYWxUcmFuc2xhdGUoY29uc3QgRWlnZW46OlZlY3RvcjNmJiB0KTsKLSAgICAKLSAgICAvKiogU2V0dXAgT3BlbkdMIG1hdHJpY2VzIGFuZCB2aWV3cG9ydCAqLwotICAgIHZvaWQgYWN0aXZhdGVHTCh2b2lkKTsKLSAgICAKLSAgICBFaWdlbjo6VmVjdG9yM2YgdW5Qcm9qZWN0KGNvbnN0IEVpZ2VuOjpWZWN0b3IyZiYgdXYsIGZsb2F0IGRlcHRoLCBjb25zdCBFaWdlbjo6TWF0cml4NGYmIGludk1vZGVsdmlldykgY29uc3Q7Ci0gICAgRWlnZW46OlZlY3RvcjNmIHVuUHJvamVjdChjb25zdCBFaWdlbjo6VmVjdG9yMmYmIHV2LCBmbG9hdCBkZXB0aCkgY29uc3Q7Ci0gICAgCi0gIHByb3RlY3RlZDoKLSAgICB2b2lkIHVwZGF0ZVZpZXdNYXRyaXgodm9pZCkgY29uc3Q7Ci0gICAgdm9pZCB1cGRhdGVQcm9qZWN0aW9uTWF0cml4KHZvaWQpIGNvbnN0OworICBDYW1lcmEmIG9wZXJhdG9yPShjb25zdCBDYW1lcmEmIG90aGVyKTsKIAotICBwcm90ZWN0ZWQ6CisgIHZvaWQgc2V0Vmlld3BvcnQodWludCBvZmZzZXR4LCB1aW50IG9mZnNldHksIHVpbnQgd2lkdGgsIHVpbnQgaGVpZ2h0KTsKKyAgdm9pZCBzZXRWaWV3cG9ydCh1aW50IHdpZHRoLCB1aW50IGhlaWdodCk7CiAKLSAgICB1aW50IG1WcFgsIG1WcFk7Ci0gICAgdWludCBtVnBXaWR0aCwgbVZwSGVpZ2h0OworICBpbmxpbmUgdWludCB2cFgodm9pZCkgY29uc3QgeyByZXR1cm4gbVZwWDsgfQorICBpbmxpbmUgdWludCB2cFkodm9pZCkgY29uc3QgeyByZXR1cm4gbVZwWTsgfQorICBpbmxpbmUgdWludCB2cFdpZHRoKHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1WcFdpZHRoOyB9CisgIGlubGluZSB1aW50IHZwSGVpZ2h0KHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1WcEhlaWdodDsgfQogCi0gICAgRnJhbWUgbUZyYW1lOwotICAgIAotICAgIG11dGFibGUgRWlnZW46OkFmZmluZTNmIG1WaWV3TWF0cml4OwotICAgIG11dGFibGUgRWlnZW46Ok1hdHJpeDRmIG1Qcm9qZWN0aW9uTWF0cml4OworICBpbmxpbmUgZmxvYXQgZm92WSh2b2lkKSBjb25zdCB7IHJldHVybiBtRm92WTsgfQorICB2b2lkIHNldEZvdlkoZmxvYXQgdmFsdWUpOwogCi0gICAgbXV0YWJsZSBib29sIG1WaWV3SXNVcHRvZGF0ZTsKLSAgICBtdXRhYmxlIGJvb2wgbVByb2pJc1VwdG9kYXRlOworICB2b2lkIHNldFBvc2l0aW9uKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgcG9zKTsKKyAgaW5saW5lIGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgcG9zaXRpb24odm9pZCkgY29uc3QgeyByZXR1cm4gbUZyYW1lLnBvc2l0aW9uOyB9CiAKLSAgICAvLyB1c2VkIGJ5IHJvdGF0ZUFyb3VuZFRhcmdldAotICAgIEVpZ2VuOjpWZWN0b3IzZiBtVGFyZ2V0OwotICAgIAotICAgIGZsb2F0IG1Gb3ZZOwotICAgIGZsb2F0IG1OZWFyRGlzdDsKLSAgICBmbG9hdCBtRmFyRGlzdDsKKyAgdm9pZCBzZXRPcmllbnRhdGlvbihjb25zdCBFaWdlbjo6UXVhdGVybmlvbmYmIHEpOworICBpbmxpbmUgY29uc3QgRWlnZW46OlF1YXRlcm5pb25mJiBvcmllbnRhdGlvbih2b2lkKSBjb25zdCB7IHJldHVybiBtRnJhbWUub3JpZW50YXRpb247IH0KKworICB2b2lkIHNldEZyYW1lKGNvbnN0IEZyYW1lJiBmKTsKKyAgY29uc3QgRnJhbWUmIGZyYW1lKHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZTsgfQorCisgIHZvaWQgc2V0RGlyZWN0aW9uKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgbmV3RGlyZWN0aW9uKTsKKyAgRWlnZW46OlZlY3RvcjNmIGRpcmVjdGlvbih2b2lkKSBjb25zdDsKKyAgdm9pZCBzZXRVcChjb25zdCBFaWdlbjo6VmVjdG9yM2YmIHZlY3RvclVwKTsKKyAgRWlnZW46OlZlY3RvcjNmIHVwKHZvaWQpIGNvbnN0OworICBFaWdlbjo6VmVjdG9yM2YgcmlnaHQodm9pZCkgY29uc3Q7CisKKyAgdm9pZCBzZXRUYXJnZXQoY29uc3QgRWlnZW46OlZlY3RvcjNmJiB0YXJnZXQpOworICBpbmxpbmUgY29uc3QgRWlnZW46OlZlY3RvcjNmJiB0YXJnZXQodm9pZCkgeyByZXR1cm4gbVRhcmdldDsgfQorCisgIGNvbnN0IEVpZ2VuOjpBZmZpbmUzZiYgdmlld01hdHJpeCh2b2lkKSBjb25zdDsKKyAgY29uc3QgRWlnZW46Ok1hdHJpeDRmJiBwcm9qZWN0aW9uTWF0cml4KHZvaWQpIGNvbnN0OworCisgIHZvaWQgcm90YXRlQXJvdW5kVGFyZ2V0KGNvbnN0IEVpZ2VuOjpRdWF0ZXJuaW9uZiYgcSk7CisgIHZvaWQgbG9jYWxSb3RhdGUoY29uc3QgRWlnZW46OlF1YXRlcm5pb25mJiBxKTsKKyAgdm9pZCB6b29tKGZsb2F0IGQpOworCisgIHZvaWQgbG9jYWxUcmFuc2xhdGUoY29uc3QgRWlnZW46OlZlY3RvcjNmJiB0KTsKKworICAvKiogU2V0dXAgT3BlbkdMIG1hdHJpY2VzIGFuZCB2aWV3cG9ydCAqLworICB2b2lkIGFjdGl2YXRlR0wodm9pZCk7CisKKyAgRWlnZW46OlZlY3RvcjNmIHVuUHJvamVjdChjb25zdCBFaWdlbjo6VmVjdG9yMmYmIHV2LCBmbG9hdCBkZXB0aCwgY29uc3QgRWlnZW46Ok1hdHJpeDRmJiBpbnZNb2RlbHZpZXcpIGNvbnN0OworICBFaWdlbjo6VmVjdG9yM2YgdW5Qcm9qZWN0KGNvbnN0IEVpZ2VuOjpWZWN0b3IyZiYgdXYsIGZsb2F0IGRlcHRoKSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgdm9pZCB1cGRhdGVWaWV3TWF0cml4KHZvaWQpIGNvbnN0OworICB2b2lkIHVwZGF0ZVByb2plY3Rpb25NYXRyaXgodm9pZCkgY29uc3Q7CisKKyBwcm90ZWN0ZWQ6CisgIHVpbnQgbVZwWCwgbVZwWTsKKyAgdWludCBtVnBXaWR0aCwgbVZwSGVpZ2h0OworCisgIEZyYW1lIG1GcmFtZTsKKworICBtdXRhYmxlIEVpZ2VuOjpBZmZpbmUzZiBtVmlld01hdHJpeDsKKyAgbXV0YWJsZSBFaWdlbjo6TWF0cml4NGYgbVByb2plY3Rpb25NYXRyaXg7CisKKyAgbXV0YWJsZSBib29sIG1WaWV3SXNVcHRvZGF0ZTsKKyAgbXV0YWJsZSBib29sIG1Qcm9qSXNVcHRvZGF0ZTsKKworICAvLyB1c2VkIGJ5IHJvdGF0ZUFyb3VuZFRhcmdldAorICBFaWdlbjo6VmVjdG9yM2YgbVRhcmdldDsKKworICBmbG9hdCBtRm92WTsKKyAgZmxvYXQgbU5lYXJEaXN0OworICBmbG9hdCBtRmFyRGlzdDsKIH07CiAKLSNlbmRpZiAvLyBFSUdFTl9DQU1FUkFfSAorI2VuZGlmICAvLyBFSUdFTl9DQU1FUkFfSApkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL2dwdWhlbHBlci5jcHAgYi9kZW1vcy9vcGVuZ2wvZ3B1aGVscGVyLmNwcAppbmRleCBmZDIzNmIxLi45ZTNlY2JlIDEwMDY0NAotLS0gYS9kZW1vcy9vcGVuZ2wvZ3B1aGVscGVyLmNwcAorKysgYi9kZW1vcy9vcGVuZ2wvZ3B1aGVscGVyLmNwcApAQCAtMTcsMTEwICsxNywxMTEgQEAKIAogR3B1SGVscGVyIGdwdTsKIAotR3B1SGVscGVyOjpHcHVIZWxwZXIoKQotewotICAgIG1WcFdpZHRoID0gbVZwSGVpZ2h0ID0gMDsKLSAgICBtQ3VycmVudE1hdHJpeFRhcmdldCA9IDA7Ci0gICAgbUluaXRpYWxpemVkID0gZmFsc2U7CitHcHVIZWxwZXI6OkdwdUhlbHBlcigpIHsKKyAgbVZwV2lkdGggPSBtVnBIZWlnaHQgPSAwOworICBtQ3VycmVudE1hdHJpeFRhcmdldCA9IDA7CisgIG1Jbml0aWFsaXplZCA9IGZhbHNlOwogfQogCi1HcHVIZWxwZXI6On5HcHVIZWxwZXIoKQoteworR3B1SGVscGVyOjp+R3B1SGVscGVyKCkge30KKwordm9pZCBHcHVIZWxwZXI6OnB1c2hQcm9qZWN0aW9uTW9kZTJEKFByb2plY3Rpb25Nb2RlMkQgcG0pIHsKKyAgLy8gc3dpdGNoIHRvIDJEIHByb2plY3Rpb24KKyAgcHVzaE1hdHJpeChNYXRyaXg0Zjo6SWRlbnRpdHkoKSwgR0xfUFJPSkVDVElPTik7CisKKyAgaWYgKHBtID09IFBNX05vcm1hbGl6ZWQpIHsKKyAgICAvLyBnbE9ydGhvKC0xLiwgMS4sIC0xLiwgMS4sIDAuLCAxLik7CisgIH0gZWxzZSBpZiAocG0gPT0gUE1fVmlld3BvcnQpIHsKKyAgICBHTGludCB2cFs0XTsKKyAgICBnbEdldEludGVnZXJ2KEdMX1ZJRVdQT1JULCB2cCk7CisgICAgZ2xPcnRobygwLiwgdnBbMl0sIDAuLCB2cFszXSwgLTEuLCAxLik7CisgIH0KKworICBwdXNoTWF0cml4KE1hdHJpeDRmOjpJZGVudGl0eSgpLCBHTF9NT0RFTFZJRVcpOwogfQogCi12b2lkIEdwdUhlbHBlcjo6cHVzaFByb2plY3Rpb25Nb2RlMkQoUHJvamVjdGlvbk1vZGUyRCBwbSkKLXsKLSAgICAvLyBzd2l0Y2ggdG8gMkQgcHJvamVjdGlvbgotICAgIHB1c2hNYXRyaXgoTWF0cml4NGY6OklkZW50aXR5KCksR0xfUFJPSkVDVElPTik7Ci0KLSAgICBpZihwbT09UE1fTm9ybWFsaXplZCkKLSAgICB7Ci0gICAgICAgIC8vZ2xPcnRobygtMS4sIDEuLCAtMS4sIDEuLCAwLiwgMS4pOwotICAgIH0KLSAgICBlbHNlIGlmKHBtPT1QTV9WaWV3cG9ydCkKLSAgICB7Ci0gICAgICAgIEdMaW50IHZwWzRdOwotICAgICAgICBnbEdldEludGVnZXJ2KEdMX1ZJRVdQT1JULCB2cCk7Ci0gICAgICAgIGdsT3J0aG8oMC4sIHZwWzJdLCAwLiwgdnBbM10sIC0xLiwgMS4pOwotICAgIH0KLQotICAgIHB1c2hNYXRyaXgoTWF0cml4NGY6OklkZW50aXR5KCksR0xfTU9ERUxWSUVXKTsKK3ZvaWQgR3B1SGVscGVyOjpwb3BQcm9qZWN0aW9uTW9kZTJEKHZvaWQpIHsKKyAgcG9wTWF0cml4KEdMX1BST0pFQ1RJT04pOworICBwb3BNYXRyaXgoR0xfTU9ERUxWSUVXKTsKIH0KIAotdm9pZCBHcHVIZWxwZXI6OnBvcFByb2plY3Rpb25Nb2RlMkQodm9pZCkKLXsKLSAgICBwb3BNYXRyaXgoR0xfUFJPSkVDVElPTik7Ci0gICAgcG9wTWF0cml4KEdMX01PREVMVklFVyk7Cit2b2lkIEdwdUhlbHBlcjo6ZHJhd1ZlY3Rvcihjb25zdCBWZWN0b3IzZiYgcG9zaXRpb24sIGNvbnN0IFZlY3RvcjNmJiB2ZWMsIGNvbnN0IENvbG9yJiBjb2xvciwgZmxvYXQgYXNwZWN0IC8qID0gNTAuKi8pIHsKKyAgc3RhdGljIEdMVXF1YWRyaWNPYmoqIGN5bGluZHJlID0gZ2x1TmV3UXVhZHJpYygpOworICBnbENvbG9yNGZ2KGNvbG9yLmRhdGEoKSk7CisgIGZsb2F0IGxlbmd0aCA9IHZlYy5ub3JtKCk7CisgIHB1c2hNYXRyaXgoR0xfTU9ERUxWSUVXKTsKKyAgZ2xUcmFuc2xhdGVmKHBvc2l0aW9uLngoKSwgcG9zaXRpb24ueSgpLCBwb3NpdGlvbi56KCkpOworICBWZWN0b3IzZiBheCA9IE1hdHJpeDNmOjpJZGVudGl0eSgpLmNvbCgyKS5jcm9zcyh2ZWMpOworICBheC5ub3JtYWxpemUoKTsKKyAgVmVjdG9yM2YgdG1wID0gdmVjOworICB0bXAubm9ybWFsaXplKCk7CisgIGZsb2F0IGFuZ2xlID0gMTgwLmYgLyBNX1BJICogYWNvcyh0bXAueigpKTsKKyAgaWYgKGFuZ2xlID4gMWUtMykgZ2xSb3RhdGVmKGFuZ2xlLCBheC54KCksIGF4LnkoKSwgYXgueigpKTsKKyAgZ2x1Q3lsaW5kZXIoY3lsaW5kcmUsIGxlbmd0aCAvIGFzcGVjdCwgbGVuZ3RoIC8gYXNwZWN0LCAwLjggKiBsZW5ndGgsIDEwLCAxMCk7CisgIGdsVHJhbnNsYXRlZigwLjAsIDAuMCwgMC44ICogbGVuZ3RoKTsKKyAgZ2x1Q3lsaW5kZXIoY3lsaW5kcmUsIDIuMCAqIGxlbmd0aCAvIGFzcGVjdCwgMC4wLCAwLjIgKiBsZW5ndGgsIDEwLCAxMCk7CisKKyAgcG9wTWF0cml4KEdMX01PREVMVklFVyk7CiB9CiAKLXZvaWQgR3B1SGVscGVyOjpkcmF3VmVjdG9yKGNvbnN0IFZlY3RvcjNmJiBwb3NpdGlvbiwgY29uc3QgVmVjdG9yM2YmIHZlYywgY29uc3QgQ29sb3ImIGNvbG9yLCBmbG9hdCBhc3BlY3QgLyogPSA1MC4qLykKLXsKLSAgICBzdGF0aWMgR0xVcXVhZHJpY09iaiAqY3lsaW5kcmUgPSBnbHVOZXdRdWFkcmljKCk7Ci0gICAgZ2xDb2xvcjRmdihjb2xvci5kYXRhKCkpOwotICAgIGZsb2F0IGxlbmd0aCA9IHZlYy5ub3JtKCk7Ci0gICAgcHVzaE1hdHJpeChHTF9NT0RFTFZJRVcpOwotICAgIGdsVHJhbnNsYXRlZihwb3NpdGlvbi54KCksIHBvc2l0aW9uLnkoKSwgcG9zaXRpb24ueigpKTsKLSAgICBWZWN0b3IzZiBheCA9IE1hdHJpeDNmOjpJZGVudGl0eSgpLmNvbCgyKS5jcm9zcyh2ZWMpOwotICAgIGF4Lm5vcm1hbGl6ZSgpOwotICAgIFZlY3RvcjNmIHRtcCA9IHZlYzsKLSAgICB0bXAubm9ybWFsaXplKCk7Ci0gICAgZmxvYXQgYW5nbGUgPSAxODAuZi9NX1BJICogYWNvcyh0bXAueigpKTsKLSAgICBpZiAoYW5nbGU+MWUtMykKLSAgICAgICAgZ2xSb3RhdGVmKGFuZ2xlLCBheC54KCksIGF4LnkoKSwgYXgueigpKTsKLSAgICBnbHVDeWxpbmRlcihjeWxpbmRyZSwgbGVuZ3RoL2FzcGVjdCwgbGVuZ3RoL2FzcGVjdCwgMC44Kmxlbmd0aCwgMTAsIDEwKTsKLSAgICBnbFRyYW5zbGF0ZWYoMC4wLDAuMCwwLjgqbGVuZ3RoKTsKLSAgICBnbHVDeWxpbmRlcihjeWxpbmRyZSwgMi4wKmxlbmd0aC9hc3BlY3QsIDAuMCwgMC4yKmxlbmd0aCwgMTAsIDEwKTsKLQotICAgIHBvcE1hdHJpeChHTF9NT0RFTFZJRVcpOwordm9pZCBHcHVIZWxwZXI6OmRyYXdWZWN0b3JCb3goY29uc3QgVmVjdG9yM2YmIHBvc2l0aW9uLCBjb25zdCBWZWN0b3IzZiYgdmVjLCBjb25zdCBDb2xvciYgY29sb3IsIGZsb2F0IGFzcGVjdCkgeworICBzdGF0aWMgR0xVcXVhZHJpY09iaiogY3lsaW5kcmUgPSBnbHVOZXdRdWFkcmljKCk7CisgIGdsQ29sb3I0ZnYoY29sb3IuZGF0YSgpKTsKKyAgZmxvYXQgbGVuZ3RoID0gdmVjLm5vcm0oKTsKKyAgcHVzaE1hdHJpeChHTF9NT0RFTFZJRVcpOworICBnbFRyYW5zbGF0ZWYocG9zaXRpb24ueCgpLCBwb3NpdGlvbi55KCksIHBvc2l0aW9uLnooKSk7CisgIFZlY3RvcjNmIGF4ID0gTWF0cml4M2Y6OklkZW50aXR5KCkuY29sKDIpLmNyb3NzKHZlYyk7CisgIGF4Lm5vcm1hbGl6ZSgpOworICBWZWN0b3IzZiB0bXAgPSB2ZWM7CisgIHRtcC5ub3JtYWxpemUoKTsKKyAgZmxvYXQgYW5nbGUgPSAxODAuZiAvIE1fUEkgKiBhY29zKHRtcC56KCkpOworICBpZiAoYW5nbGUgPiAxZS0zKSBnbFJvdGF0ZWYoYW5nbGUsIGF4LngoKSwgYXgueSgpLCBheC56KCkpOworICBnbHVDeWxpbmRlcihjeWxpbmRyZSwgbGVuZ3RoIC8gYXNwZWN0LCBsZW5ndGggLyBhc3BlY3QsIDAuOCAqIGxlbmd0aCwgMTAsIDEwKTsKKyAgZ2xUcmFuc2xhdGVmKDAuMCwgMC4wLCAwLjggKiBsZW5ndGgpOworICBnbFNjYWxlZig0LjAgKiBsZW5ndGggLyBhc3BlY3QsIDQuMCAqIGxlbmd0aCAvIGFzcGVjdCwgNC4wICogbGVuZ3RoIC8gYXNwZWN0KTsKKyAgZHJhd1VuaXRDdWJlKCk7CisgIHBvcE1hdHJpeChHTF9NT0RFTFZJRVcpOwogfQogCi12b2lkIEdwdUhlbHBlcjo6ZHJhd1ZlY3RvckJveChjb25zdCBWZWN0b3IzZiYgcG9zaXRpb24sIGNvbnN0IFZlY3RvcjNmJiB2ZWMsIGNvbnN0IENvbG9yJiBjb2xvciwgZmxvYXQgYXNwZWN0KQotewotICAgIHN0YXRpYyBHTFVxdWFkcmljT2JqICpjeWxpbmRyZSA9IGdsdU5ld1F1YWRyaWMoKTsKLSAgICBnbENvbG9yNGZ2KGNvbG9yLmRhdGEoKSk7Ci0gICAgZmxvYXQgbGVuZ3RoID0gdmVjLm5vcm0oKTsKLSAgICBwdXNoTWF0cml4KEdMX01PREVMVklFVyk7Ci0gICAgZ2xUcmFuc2xhdGVmKHBvc2l0aW9uLngoKSwgcG9zaXRpb24ueSgpLCBwb3NpdGlvbi56KCkpOwotICAgIFZlY3RvcjNmIGF4ID0gTWF0cml4M2Y6OklkZW50aXR5KCkuY29sKDIpLmNyb3NzKHZlYyk7Ci0gICAgYXgubm9ybWFsaXplKCk7Ci0gICAgVmVjdG9yM2YgdG1wID0gdmVjOwotICAgIHRtcC5ub3JtYWxpemUoKTsKLSAgICBmbG9hdCBhbmdsZSA9IDE4MC5mL01fUEkgKiBhY29zKHRtcC56KCkpOwotICAgIGlmIChhbmdsZT4xZS0zKQotICAgICAgICBnbFJvdGF0ZWYoYW5nbGUsIGF4LngoKSwgYXgueSgpLCBheC56KCkpOwotICAgIGdsdUN5bGluZGVyKGN5bGluZHJlLCBsZW5ndGgvYXNwZWN0LCBsZW5ndGgvYXNwZWN0LCAwLjgqbGVuZ3RoLCAxMCwgMTApOwotICAgIGdsVHJhbnNsYXRlZigwLjAsMC4wLDAuOCpsZW5ndGgpOwotICAgIGdsU2NhbGVmKDQuMCpsZW5ndGgvYXNwZWN0LDQuMCpsZW5ndGgvYXNwZWN0LDQuMCpsZW5ndGgvYXNwZWN0KTsKLSAgICBkcmF3VW5pdEN1YmUoKTsKLSAgICBwb3BNYXRyaXgoR0xfTU9ERUxWSUVXKTsKK3ZvaWQgR3B1SGVscGVyOjpkcmF3VW5pdEN1YmUodm9pZCkgeworICBzdGF0aWMgZmxvYXQgdmVydGljZXNbXVszXSA9IHt7LTAuNSwgLTAuNSwgLTAuNX0sIHswLjUsIC0wLjUsIC0wLjV9LCB7LTAuNSwgMC41LCAtMC41fSwgezAuNSwgMC41LCAtMC41fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjUsIC0wLjUsIDAuNX0sICB7MC41LCAtMC41LCAwLjV9LCAgey0wLjUsIDAuNSwgMC41fSwgIHswLjUsIDAuNSwgMC41fX07CisKKyAgZ2xCZWdpbihHTF9RVUFEUyk7CisgIGdsTm9ybWFsM2YoMCwgMCwgLTEpOworICBnbFZlcnRleDNmdih2ZXJ0aWNlc1swXSk7CisgIGdsVmVydGV4M2Z2KHZlcnRpY2VzWzJdKTsKKyAgZ2xWZXJ0ZXgzZnYodmVydGljZXNbM10pOworICBnbFZlcnRleDNmdih2ZXJ0aWNlc1sxXSk7CisgIGdsTm9ybWFsM2YoMCwgMCwgMSk7CisgIGdsVmVydGV4M2Z2KHZlcnRpY2VzWzRdKTsKKyAgZ2xWZXJ0ZXgzZnYodmVydGljZXNbNV0pOworICBnbFZlcnRleDNmdih2ZXJ0aWNlc1s3XSk7CisgIGdsVmVydGV4M2Z2KHZlcnRpY2VzWzZdKTsKKyAgZ2xOb3JtYWwzZigwLCAtMSwgMCk7CisgIGdsVmVydGV4M2Z2KHZlcnRpY2VzWzBdKTsKKyAgZ2xWZXJ0ZXgzZnYodmVydGljZXNbMV0pOworICBnbFZlcnRleDNmdih2ZXJ0aWNlc1s1XSk7CisgIGdsVmVydGV4M2Z2KHZlcnRpY2VzWzRdKTsKKyAgZ2xOb3JtYWwzZigwLCAxLCAwKTsKKyAgZ2xWZXJ0ZXgzZnYodmVydGljZXNbMl0pOworICBnbFZlcnRleDNmdih2ZXJ0aWNlc1s2XSk7CisgIGdsVmVydGV4M2Z2KHZlcnRpY2VzWzddKTsKKyAgZ2xWZXJ0ZXgzZnYodmVydGljZXNbM10pOworICBnbE5vcm1hbDNmKC0xLCAwLCAwKTsKKyAgZ2xWZXJ0ZXgzZnYodmVydGljZXNbMF0pOworICBnbFZlcnRleDNmdih2ZXJ0aWNlc1s0XSk7CisgIGdsVmVydGV4M2Z2KHZlcnRpY2VzWzZdKTsKKyAgZ2xWZXJ0ZXgzZnYodmVydGljZXNbMl0pOworICBnbE5vcm1hbDNmKDEsIDAsIDApOworICBnbFZlcnRleDNmdih2ZXJ0aWNlc1sxXSk7CisgIGdsVmVydGV4M2Z2KHZlcnRpY2VzWzNdKTsKKyAgZ2xWZXJ0ZXgzZnYodmVydGljZXNbN10pOworICBnbFZlcnRleDNmdih2ZXJ0aWNlc1s1XSk7CisgIGdsRW5kKCk7CiB9CiAKLXZvaWQgR3B1SGVscGVyOjpkcmF3VW5pdEN1YmUodm9pZCkKLXsKLSAgICBzdGF0aWMgZmxvYXQgdmVydGljZXNbXVszXSA9IHsKLSAgICAgICAgey0wLjUsLTAuNSwtMC41fSwKLSAgICAgICAgeyAwLjUsLTAuNSwtMC41fSwKLSAgICAgICAgey0wLjUsIDAuNSwtMC41fSwKLSAgICAgICAgeyAwLjUsIDAuNSwtMC41fSwKLSAgICAgICAgey0wLjUsLTAuNSwgMC41fSwKLSAgICAgICAgeyAwLjUsLTAuNSwgMC41fSwKLSAgICAgICAgey0wLjUsIDAuNSwgMC41fSwKLSAgICAgICAgeyAwLjUsIDAuNSwgMC41fX07Ci0KLSAgICBnbEJlZ2luKEdMX1FVQURTKTsKLSAgICBnbE5vcm1hbDNmKDAsMCwtMSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzBdKTsgZ2xWZXJ0ZXgzZnYodmVydGljZXNbMl0pOyBnbFZlcnRleDNmdih2ZXJ0aWNlc1szXSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzFdKTsKLSAgICBnbE5vcm1hbDNmKDAsMCwgMSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzRdKTsgZ2xWZXJ0ZXgzZnYodmVydGljZXNbNV0pOyBnbFZlcnRleDNmdih2ZXJ0aWNlc1s3XSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzZdKTsKLSAgICBnbE5vcm1hbDNmKDAsLTEsMCk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzBdKTsgZ2xWZXJ0ZXgzZnYodmVydGljZXNbMV0pOyBnbFZlcnRleDNmdih2ZXJ0aWNlc1s1XSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzRdKTsKLSAgICBnbE5vcm1hbDNmKDAsIDEsMCk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzJdKTsgZ2xWZXJ0ZXgzZnYodmVydGljZXNbNl0pOyBnbFZlcnRleDNmdih2ZXJ0aWNlc1s3XSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzNdKTsKLSAgICBnbE5vcm1hbDNmKC0xLDAsMCk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzBdKTsgZ2xWZXJ0ZXgzZnYodmVydGljZXNbNF0pOyBnbFZlcnRleDNmdih2ZXJ0aWNlc1s2XSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzJdKTsKLSAgICBnbE5vcm1hbDNmKCAxLDAsMCk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzFdKTsgZ2xWZXJ0ZXgzZnYodmVydGljZXNbM10pOyBnbFZlcnRleDNmdih2ZXJ0aWNlc1s3XSk7IGdsVmVydGV4M2Z2KHZlcnRpY2VzWzVdKTsKLSAgICBnbEVuZCgpOwotfQotCi12b2lkIEdwdUhlbHBlcjo6ZHJhd1VuaXRTcGhlcmUoaW50IGxldmVsKQotewordm9pZCBHcHVIZWxwZXI6OmRyYXdVbml0U3BoZXJlKGludCBsZXZlbCkgewogICBzdGF0aWMgSWNvU3BoZXJlIHNwaGVyZTsKICAgc3BoZXJlLmRyYXcobGV2ZWwpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RlbW9zL29wZW5nbC9ncHVoZWxwZXIuaCBiL2RlbW9zL29wZW5nbC9ncHVoZWxwZXIuaAppbmRleCA4ODBlOWE1Li5iMjhjNjI1IDEwMDY0NAotLS0gYS9kZW1vcy9vcGVuZ2wvZ3B1aGVscGVyLmgKKysrIGIvZGVtb3Mvb3BlbmdsL2dwdWhlbHBlci5oCkBAIC0xOCwxOTAgKzE4LDE3MCBAQAogCiB0eXBlZGVmIFZlY3RvcjRmIENvbG9yOwogCi1jbGFzcyBHcHVIZWxwZXIKLXsKLSAgcHVibGljOgorY2xhc3MgR3B1SGVscGVyIHsKKyBwdWJsaWM6CisgIEdwdUhlbHBlcigpOwogCi0gICAgR3B1SGVscGVyKCk7CisgIH5HcHVIZWxwZXIoKTsKIAotICAgIH5HcHVIZWxwZXIoKTsKKyAgZW51bSBQcm9qZWN0aW9uTW9kZTJEIHsgUE1fTm9ybWFsaXplZCA9IDEsIFBNX1ZpZXdwb3J0ID0gMiB9OworICB2b2lkIHB1c2hQcm9qZWN0aW9uTW9kZTJEKFByb2plY3Rpb25Nb2RlMkQgcG0pOworICB2b2lkIHBvcFByb2plY3Rpb25Nb2RlMkQoKTsKIAotICAgIGVudW0gUHJvamVjdGlvbk1vZGUyRCB7IFBNX05vcm1hbGl6ZWQgPSAxLCBQTV9WaWV3cG9ydCA9IDIgfTsKLSAgICB2b2lkIHB1c2hQcm9qZWN0aW9uTW9kZTJEKFByb2plY3Rpb25Nb2RlMkQgcG0pOwotICAgIHZvaWQgcG9wUHJvamVjdGlvbk1vZGUyRCgpOworICAvKiogTXVsdGlwbHkgdGhlIE9wZW5HTCBtYXRyaXggXGEgbWF0cml4VGFyZ2V0IGJ5IHRoZSBtYXRyaXggXGEgbWF0LgorICAgICAgRXNzZW50aWFsbHksIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgY2FsbHMgZ2xNYXRyaXhNb2RlKG1hdHJpeFRhcmdldCkgaWYgcmVxdWlyZWQKKyAgICAgIGFuZCBkb2VzIGEgcHJvcGVyIGNhbGwgdG8gdGhlIHJpZ2h0IGdsTXVsdE1hdHJpeCooKSBmdW5jdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNjYWxhciB0eXBlCisgICAgICBhbmQgc3RvcmFnZSBvcmRlci4KKyAgICAgIFx3YXJuaW5nIGdsTWF0cml4TW9kZSgpIG11c3QgbmV2ZXIgYmUgY2FsbGVkIGRpcmVjdGx5LiBJZiB5b3UgYXJlIHVuc3VyZSwgdXNlIGZvcmNlTWF0cml4TW9kZSgpLgorICAgICAgXHNhIE1hdHJpeCwgbG9hZE1hdHJpeCgpLCBmb3JjZU1hdHJpeE1vZGUoKQorICAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRmxhZ3NfPgorICB2b2lkIG11bHRNYXRyaXgoY29uc3QgTWF0cml4PFNjYWxhciwgNCwgNCwgRmxhZ3NfLCA0LCA0PiYgbWF0LCBHTGVudW0gbWF0cml4VGFyZ2V0KTsKIAotICAgIC8qKiBNdWx0aXBseSB0aGUgT3BlbkdMIG1hdHJpeCBcYSBtYXRyaXhUYXJnZXQgYnkgdGhlIG1hdHJpeCBcYSBtYXQuCi0gICAgICAgIEVzc2VudGlhbGx5LCB0aGlzIGhlbHBlciBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGNhbGxzIGdsTWF0cml4TW9kZShtYXRyaXhUYXJnZXQpIGlmIHJlcXVpcmVkCi0gICAgICAgIGFuZCBkb2VzIGEgcHJvcGVyIGNhbGwgdG8gdGhlIHJpZ2h0IGdsTXVsdE1hdHJpeCooKSBmdW5jdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNjYWxhciB0eXBlCi0gICAgICAgIGFuZCBzdG9yYWdlIG9yZGVyLgotICAgICAgICBcd2FybmluZyBnbE1hdHJpeE1vZGUoKSBtdXN0IG5ldmVyIGJlIGNhbGxlZCBkaXJlY3RseS4gSWYgeW91IGFyZSB1bnN1cmUsIHVzZSBmb3JjZU1hdHJpeE1vZGUoKS4KLSAgICAgICAgXHNhIE1hdHJpeCwgbG9hZE1hdHJpeCgpLCBmb3JjZU1hdHJpeE1vZGUoKQotICAgICovCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRmxhZ3NfPgotICAgIHZvaWQgbXVsdE1hdHJpeChjb25zdCBNYXRyaXg8U2NhbGFyLDQsNCwgRmxhZ3NfLCA0LDQ+JiBtYXQsIEdMZW51bSBtYXRyaXhUYXJnZXQpOworICAvKiogTG9hZCB0aGUgbWF0cml4IFxhIG1hdCB0byB0aGUgT3BlbkdMIG1hdHJpeCBcYSBtYXRyaXhUYXJnZXQuCisgICAgICBFc3NlbnRpYWxseSwgdGhpcyBoZWxwZXIgZnVuY3Rpb24gYXV0b21hdGljYWxseSBjYWxscyBnbE1hdHJpeE1vZGUobWF0cml4VGFyZ2V0KSBpZiByZXF1aXJlZAorICAgICAgYW5kIGRvZXMgYSBwcm9wZXIgY2FsbCB0byB0aGUgcmlnaHQgZ2xMb2FkTWF0cml4KigpIG9yIGdsTG9hZElkZW50aXR5KCkgZnVuY3Rpb24gYWNjb3JkaW5nIHRvIHRoZSBzY2FsYXIgdHlwZQorICAgICAgYW5kIHN0b3JhZ2Ugb3JkZXIuCisgICAgICBcd2FybmluZyBnbE1hdHJpeE1vZGUoKSBtdXN0IG5ldmVyIGJlIGNhbGxlZCBkaXJlY3RseS4gSWYgeW91IGFyZSB1bnN1cmUsIHVzZSBmb3JjZU1hdHJpeE1vZGUoKS4KKyAgICAgIFxzYSBNYXRyaXgsIG11bHRNYXRyaXgoKSwgZm9yY2VNYXRyaXhNb2RlKCkKKyAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IEZsYWdzXz4KKyAgdm9pZCBsb2FkTWF0cml4KGNvbnN0IEVpZ2VuOjpNYXRyaXg8U2NhbGFyLCA0LCA0LCBGbGFnc18sIDQsIDQ+JiBtYXQsIEdMZW51bSBtYXRyaXhUYXJnZXQpOwogCi0gICAgLyoqIExvYWQgdGhlIG1hdHJpeCBcYSBtYXQgdG8gdGhlIE9wZW5HTCBtYXRyaXggXGEgbWF0cml4VGFyZ2V0LgotICAgICAgICBFc3NlbnRpYWxseSwgdGhpcyBoZWxwZXIgZnVuY3Rpb24gYXV0b21hdGljYWxseSBjYWxscyBnbE1hdHJpeE1vZGUobWF0cml4VGFyZ2V0KSBpZiByZXF1aXJlZAotICAgICAgICBhbmQgZG9lcyBhIHByb3BlciBjYWxsIHRvIHRoZSByaWdodCBnbExvYWRNYXRyaXgqKCkgb3IgZ2xMb2FkSWRlbnRpdHkoKSBmdW5jdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNjYWxhciB0eXBlCi0gICAgICAgIGFuZCBzdG9yYWdlIG9yZGVyLgotICAgICAgICBcd2FybmluZyBnbE1hdHJpeE1vZGUoKSBtdXN0IG5ldmVyIGJlIGNhbGxlZCBkaXJlY3RseS4gSWYgeW91IGFyZSB1bnN1cmUsIHVzZSBmb3JjZU1hdHJpeE1vZGUoKS4KLSAgICAgICAgXHNhIE1hdHJpeCwgbXVsdE1hdHJpeCgpLCBmb3JjZU1hdHJpeE1vZGUoKQotICAgICovCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRmxhZ3NfPgotICAgIHZvaWQgbG9hZE1hdHJpeChjb25zdCBFaWdlbjo6TWF0cml4PFNjYWxhciw0LDQsIEZsYWdzXywgNCw0PiYgbWF0LCBHTGVudW0gbWF0cml4VGFyZ2V0KTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRGVyaXZlZD4KKyAgdm9pZCBsb2FkTWF0cml4KGNvbnN0IEVpZ2VuOjpDd2lzZU51bGxhcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+LCBEZXJpdmVkPiYsCisgICAgICAgICAgICAgICAgICBHTGVudW0gbWF0cml4VGFyZ2V0KTsKIAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRGVyaXZlZD4KLSAgICB2b2lkIGxvYWRNYXRyaXgoCi0gICAgICAgIGNvbnN0IEVpZ2VuOjpDd2lzZU51bGxhcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+LERlcml2ZWQ+JiwKLSAgICAgICAgR0xlbnVtIG1hdHJpeFRhcmdldCk7CisgIC8qKiBNYWtlIHRoZSBtYXRyaXggXGEgbWF0cml4VGFyZ2V0IHRoZSBjdXJyZW50IE9wZW5HTCBtYXRyaXggdGFyZ2V0LgorICAgICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBsb2FkTWF0cml4KCkgb3IgbXVsdE1hdHJpeCgpIGlmIHlvdSBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgZ2xNYXRyaXhNb2RlKCkKKyAgICAgIGhhcyBuZXZlciBiZWVuIGNhbGxlZCBhZnRlciB0aGUgbGFzdCBsb2FkTWF0cml4KCkgb3IgbXVsdE1hdHJpeCgpIGNhbGxzLgorICAgICAgXHRvZG8gcHJvdmlkZXMgYSBkZWJ1ZyBtb2RlIGNoZWNraW5nIHRoZSBzYW5pdHkgb2YgdGhlIGNhY2hlZCBtYXRyaXggbW9kZS4KKyAgKi8KKyAgaW5saW5lIHZvaWQgZm9yY2VNYXRyaXhUYXJnZXQoR0xlbnVtIG1hdHJpeFRhcmdldCkgeyBnbE1hdHJpeE1vZGUobUN1cnJlbnRNYXRyaXhUYXJnZXQgPSBtYXRyaXhUYXJnZXQpOyB9CiAKLSAgICAvKiogTWFrZSB0aGUgbWF0cml4IFxhIG1hdHJpeFRhcmdldCB0aGUgY3VycmVudCBPcGVuR0wgbWF0cml4IHRhcmdldC4KLSAgICAgICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBsb2FkTWF0cml4KCkgb3IgbXVsdE1hdHJpeCgpIGlmIHlvdSBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgZ2xNYXRyaXhNb2RlKCkKLSAgICAgICAgaGFzIG5ldmVyIGJlZW4gY2FsbGVkIGFmdGVyIHRoZSBsYXN0IGxvYWRNYXRyaXgoKSBvciBtdWx0TWF0cml4KCkgY2FsbHMuCi0gICAgICAgIFx0b2RvIHByb3ZpZGVzIGEgZGVidWcgbW9kZSBjaGVja2luZyB0aGUgc2FuaXR5IG9mIHRoZSBjYWNoZWQgbWF0cml4IG1vZGUuCi0gICAgKi8KLSAgICBpbmxpbmUgdm9pZCBmb3JjZU1hdHJpeFRhcmdldChHTGVudW0gbWF0cml4VGFyZ2V0KSB7Z2xNYXRyaXhNb2RlKG1DdXJyZW50TWF0cml4VGFyZ2V0PW1hdHJpeFRhcmdldCk7fQorICBpbmxpbmUgdm9pZCBzZXRNYXRyaXhUYXJnZXQoR0xlbnVtIG1hdHJpeFRhcmdldCk7CiAKLSAgICBpbmxpbmUgdm9pZCBzZXRNYXRyaXhUYXJnZXQoR0xlbnVtIG1hdHJpeFRhcmdldCk7CisgIC8qKiBQdXNoIHRoZSBPcGVuR0wgbWF0cml4IFxhIG1hdHJpeFRhcmdldCBhbmQgbG9hZCBcYSBtYXQuCisgICAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRmxhZ3NfPgorICBpbmxpbmUgdm9pZCBwdXNoTWF0cml4KGNvbnN0IE1hdHJpeDxTY2FsYXIsIDQsIDQsIEZsYWdzXywgNCwgND4mIG1hdCwgR0xlbnVtIG1hdHJpeFRhcmdldCk7CiAKLSAgICAvKiogUHVzaCB0aGUgT3BlbkdMIG1hdHJpeCBcYSBtYXRyaXhUYXJnZXQgYW5kIGxvYWQgXGEgbWF0LgotICAgICovCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRmxhZ3NfPgotICAgIGlubGluZSB2b2lkIHB1c2hNYXRyaXgoY29uc3QgTWF0cml4PFNjYWxhciw0LDQsIEZsYWdzXywgNCw0PiYgbWF0LCBHTGVudW0gbWF0cml4VGFyZ2V0KTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRGVyaXZlZD4KKyAgdm9pZCBwdXNoTWF0cml4KGNvbnN0IEVpZ2VuOjpDd2lzZU51bGxhcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+LCBEZXJpdmVkPiYsCisgICAgICAgICAgICAgICAgICBHTGVudW0gbWF0cml4VGFyZ2V0KTsKIAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRGVyaXZlZD4KLSAgICB2b2lkIHB1c2hNYXRyaXgoCi0gICAgICAgIGNvbnN0IEVpZ2VuOjpDd2lzZU51bGxhcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+LERlcml2ZWQ+JiwKLSAgICAgICAgR0xlbnVtIG1hdHJpeFRhcmdldCk7CisgIC8qKiBQdXNoIGFuZCBjbG9uZSB0aGUgT3BlbkdMIG1hdHJpeCBcYSBtYXRyaXhUYXJnZXQKKyAgICovCisgIGlubGluZSB2b2lkIHB1c2hNYXRyaXgoR0xlbnVtIG1hdHJpeFRhcmdldCk7CiAKLSAgICAvKiogUHVzaCBhbmQgY2xvbmUgdGhlIE9wZW5HTCBtYXRyaXggXGEgbWF0cml4VGFyZ2V0Ci0gICAgKi8KLSAgICBpbmxpbmUgdm9pZCBwdXNoTWF0cml4KEdMZW51bSBtYXRyaXhUYXJnZXQpOworICAvKiogUG9wIHRoZSBPcGVuR0wgbWF0cml4IFxhIG1hdHJpeFRhcmdldAorICAgKi8KKyAgaW5saW5lIHZvaWQgcG9wTWF0cml4KEdMZW51bSBtYXRyaXhUYXJnZXQpOwogCi0gICAgLyoqIFBvcCB0aGUgT3BlbkdMIG1hdHJpeCBcYSBtYXRyaXhUYXJnZXQKLSAgICAqLwotICAgIGlubGluZSB2b2lkIHBvcE1hdHJpeChHTGVudW0gbWF0cml4VGFyZ2V0KTsKKyAgdm9pZCBkcmF3VmVjdG9yKGNvbnN0IFZlY3RvcjNmJiBwb3NpdGlvbiwgY29uc3QgVmVjdG9yM2YmIHZlYywgY29uc3QgQ29sb3ImIGNvbG9yLCBmbG9hdCBhc3BlY3QgPSA1MC4pOworICB2b2lkIGRyYXdWZWN0b3JCb3goY29uc3QgVmVjdG9yM2YmIHBvc2l0aW9uLCBjb25zdCBWZWN0b3IzZiYgdmVjLCBjb25zdCBDb2xvciYgY29sb3IsIGZsb2F0IGFzcGVjdCA9IDUwLik7CisgIHZvaWQgZHJhd1VuaXRDdWJlKHZvaWQpOworICB2b2lkIGRyYXdVbml0U3BoZXJlKGludCBsZXZlbCA9IDApOwogCi0gICAgdm9pZCBkcmF3VmVjdG9yKGNvbnN0IFZlY3RvcjNmJiBwb3NpdGlvbiwgY29uc3QgVmVjdG9yM2YmIHZlYywgY29uc3QgQ29sb3ImIGNvbG9yLCBmbG9hdCBhc3BlY3QgPSA1MC4pOwotICAgIHZvaWQgZHJhd1ZlY3RvckJveChjb25zdCBWZWN0b3IzZiYgcG9zaXRpb24sIGNvbnN0IFZlY3RvcjNmJiB2ZWMsIGNvbnN0IENvbG9yJiBjb2xvciwgZmxvYXQgYXNwZWN0ID0gNTAuKTsKLSAgICB2b2lkIGRyYXdVbml0Q3ViZSh2b2lkKTsKLSAgICB2b2lkIGRyYXdVbml0U3BoZXJlKGludCBsZXZlbD0wKTsKKyAgLy8vIGRyYXcgdGhlIFxhIG5vZkVsZW1lbnQgZmlyc3QgZWxlbWVudHMKKyAgaW5saW5lIHZvaWQgZHJhdyhHTGVudW0gbW9kZSwgdWludCBub2ZFbGVtZW50KTsKIAotICAgIC8vLyBkcmF3IHRoZSBcYSBub2ZFbGVtZW50IGZpcnN0IGVsZW1lbnRzCi0gICAgaW5saW5lIHZvaWQgZHJhdyhHTGVudW0gbW9kZSwgdWludCBub2ZFbGVtZW50KTsKKyAgLy8vIGRyYXcgYSByYW5nZSBvZiBlbGVtZW50cworICBpbmxpbmUgdm9pZCBkcmF3KEdMZW51bSBtb2RlLCB1aW50IHN0YXJ0LCB1aW50IGVuZCk7CiAKLSAgICAvLy8gZHJhdyBhIHJhbmdlIG9mIGVsZW1lbnRzCi0gICAgaW5saW5lIHZvaWQgZHJhdyhHTGVudW0gbW9kZSwgdWludCBzdGFydCwgdWludCBlbmQpOworICAvLy8gZHJhdyBhbiBpbmRleGVkIHN1YnNldAorICBpbmxpbmUgdm9pZCBkcmF3KEdMZW51bSBtb2RlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50PiogcEluZGV4ZXMpOwogCi0gICAgLy8vIGRyYXcgYW4gaW5kZXhlZCBzdWJzZXQKLSAgICBpbmxpbmUgdm9pZCBkcmF3KEdMZW51bSBtb2RlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50PiogcEluZGV4ZXMpOworIHByb3RlY3RlZDoKKyAgdm9pZCB1cGRhdGUodm9pZCk7CiAKLXByb3RlY3RlZDoKLQotICAgIHZvaWQgdXBkYXRlKHZvaWQpOwotCi0gICAgR0x1aW50IG1Db2xvckJ1ZmZlcklkOwotICAgIGludCBtVnBXaWR0aCwgbVZwSGVpZ2h0OwotICAgIEdMZW51bSBtQ3VycmVudE1hdHJpeFRhcmdldDsKLSAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgR0x1aW50IG1Db2xvckJ1ZmZlcklkOworICBpbnQgbVZwV2lkdGgsIG1WcEhlaWdodDsKKyAgR0xlbnVtIG1DdXJyZW50TWF0cml4VGFyZ2V0OworICBib29sIG1Jbml0aWFsaXplZDsKIH07CiAKIC8qKiBTaW5nbGV0b24gc2hvcnRjdXQKLSovCisgKi8KIGV4dGVybiBHcHVIZWxwZXIgZ3B1OwogCi0KIC8qKiBcaW50ZXJuYWwKLSovCi10ZW1wbGF0ZTxib29sIFJvd01ham9yLCBpbnQgRmxhZ3NfPiBzdHJ1Y3QgR2xNYXRyaXhIZWxwZXI7CisgKi8KK3RlbXBsYXRlIDxib29sIFJvd01ham9yLCBpbnQgRmxhZ3NfPgorc3RydWN0IEdsTWF0cml4SGVscGVyOwogCi10ZW1wbGF0ZTxpbnQgRmxhZ3NfPiBzdHJ1Y3QgR2xNYXRyaXhIZWxwZXI8ZmFsc2UsRmxhZ3NfPgotewotICAgIHN0YXRpYyB2b2lkIGxvYWRNYXRyaXgoY29uc3QgTWF0cml4PGZsb2F0LCA0LDQsIEZsYWdzXywgNCw0PiYgIG1hdCkgeyBnbExvYWRNYXRyaXhmKG1hdC5kYXRhKCkpOyB9Ci0gICAgc3RhdGljIHZvaWQgbG9hZE1hdHJpeChjb25zdCBNYXRyaXg8ZG91YmxlLDQsNCwgRmxhZ3NfLCA0LDQ+JiBtYXQpIHsgZ2xMb2FkTWF0cml4ZChtYXQuZGF0YSgpKTsgfQotICAgIHN0YXRpYyB2b2lkIG11bHRNYXRyaXgoY29uc3QgTWF0cml4PGZsb2F0LCA0LDQsIEZsYWdzXywgNCw0PiYgIG1hdCkgeyBnbE11bHRNYXRyaXhmKG1hdC5kYXRhKCkpOyB9Ci0gICAgc3RhdGljIHZvaWQgbXVsdE1hdHJpeChjb25zdCBNYXRyaXg8ZG91YmxlLDQsNCwgRmxhZ3NfLCA0LDQ+JiBtYXQpIHsgZ2xNdWx0TWF0cml4ZChtYXQuZGF0YSgpKTsgfQordGVtcGxhdGUgPGludCBGbGFnc18+CitzdHJ1Y3QgR2xNYXRyaXhIZWxwZXI8ZmFsc2UsIEZsYWdzXz4geworICBzdGF0aWMgdm9pZCBsb2FkTWF0cml4KGNvbnN0IE1hdHJpeDxmbG9hdCwgNCwgNCwgRmxhZ3NfLCA0LCA0PiYgbWF0KSB7IGdsTG9hZE1hdHJpeGYobWF0LmRhdGEoKSk7IH0KKyAgc3RhdGljIHZvaWQgbG9hZE1hdHJpeChjb25zdCBNYXRyaXg8ZG91YmxlLCA0LCA0LCBGbGFnc18sIDQsIDQ+JiBtYXQpIHsgZ2xMb2FkTWF0cml4ZChtYXQuZGF0YSgpKTsgfQorICBzdGF0aWMgdm9pZCBtdWx0TWF0cml4KGNvbnN0IE1hdHJpeDxmbG9hdCwgNCwgNCwgRmxhZ3NfLCA0LCA0PiYgbWF0KSB7IGdsTXVsdE1hdHJpeGYobWF0LmRhdGEoKSk7IH0KKyAgc3RhdGljIHZvaWQgbXVsdE1hdHJpeChjb25zdCBNYXRyaXg8ZG91YmxlLCA0LCA0LCBGbGFnc18sIDQsIDQ+JiBtYXQpIHsgZ2xNdWx0TWF0cml4ZChtYXQuZGF0YSgpKTsgfQogfTsKIAotdGVtcGxhdGU8aW50IEZsYWdzXz4gc3RydWN0IEdsTWF0cml4SGVscGVyPHRydWUsRmxhZ3NfPgotewotICAgIHN0YXRpYyB2b2lkIGxvYWRNYXRyaXgoY29uc3QgTWF0cml4PGZsb2F0LCA0LDQsIEZsYWdzXywgNCw0PiYgIG1hdCkgeyBnbExvYWRNYXRyaXhmKG1hdC50cmFuc3Bvc2UoKS5ldmFsKCkuZGF0YSgpKTsgfQotICAgIHN0YXRpYyB2b2lkIGxvYWRNYXRyaXgoY29uc3QgTWF0cml4PGRvdWJsZSw0LDQsIEZsYWdzXywgNCw0PiYgbWF0KSB7IGdsTG9hZE1hdHJpeGQobWF0LnRyYW5zcG9zZSgpLmV2YWwoKS5kYXRhKCkpOyB9Ci0gICAgc3RhdGljIHZvaWQgbXVsdE1hdHJpeChjb25zdCBNYXRyaXg8ZmxvYXQsIDQsNCwgRmxhZ3NfLCA0LDQ+JiAgbWF0KSB7IGdsTXVsdE1hdHJpeGYobWF0LnRyYW5zcG9zZSgpLmV2YWwoKS5kYXRhKCkpOyB9Ci0gICAgc3RhdGljIHZvaWQgbXVsdE1hdHJpeChjb25zdCBNYXRyaXg8ZG91YmxlLDQsNCwgRmxhZ3NfLCA0LDQ+JiBtYXQpIHsgZ2xNdWx0TWF0cml4ZChtYXQudHJhbnNwb3NlKCkuZXZhbCgpLmRhdGEoKSk7IH0KK3RlbXBsYXRlIDxpbnQgRmxhZ3NfPgorc3RydWN0IEdsTWF0cml4SGVscGVyPHRydWUsIEZsYWdzXz4geworICBzdGF0aWMgdm9pZCBsb2FkTWF0cml4KGNvbnN0IE1hdHJpeDxmbG9hdCwgNCwgNCwgRmxhZ3NfLCA0LCA0PiYgbWF0KSB7IGdsTG9hZE1hdHJpeGYobWF0LnRyYW5zcG9zZSgpLmV2YWwoKS5kYXRhKCkpOyB9CisgIHN0YXRpYyB2b2lkIGxvYWRNYXRyaXgoY29uc3QgTWF0cml4PGRvdWJsZSwgNCwgNCwgRmxhZ3NfLCA0LCA0PiYgbWF0KSB7CisgICAgZ2xMb2FkTWF0cml4ZChtYXQudHJhbnNwb3NlKCkuZXZhbCgpLmRhdGEoKSk7CisgIH0KKyAgc3RhdGljIHZvaWQgbXVsdE1hdHJpeChjb25zdCBNYXRyaXg8ZmxvYXQsIDQsIDQsIEZsYWdzXywgNCwgND4mIG1hdCkgeyBnbE11bHRNYXRyaXhmKG1hdC50cmFuc3Bvc2UoKS5ldmFsKCkuZGF0YSgpKTsgfQorICBzdGF0aWMgdm9pZCBtdWx0TWF0cml4KGNvbnN0IE1hdHJpeDxkb3VibGUsIDQsIDQsIEZsYWdzXywgNCwgND4mIG1hdCkgeworICAgIGdsTXVsdE1hdHJpeGQobWF0LnRyYW5zcG9zZSgpLmV2YWwoKS5kYXRhKCkpOworICB9CiB9OwogCi1pbmxpbmUgdm9pZCBHcHVIZWxwZXI6OnNldE1hdHJpeFRhcmdldChHTGVudW0gbWF0cml4VGFyZ2V0KQotewotICAgIGlmIChtYXRyaXhUYXJnZXQgIT0gbUN1cnJlbnRNYXRyaXhUYXJnZXQpCi0gICAgICAgIGdsTWF0cml4TW9kZShtQ3VycmVudE1hdHJpeFRhcmdldD1tYXRyaXhUYXJnZXQpOworaW5saW5lIHZvaWQgR3B1SGVscGVyOjpzZXRNYXRyaXhUYXJnZXQoR0xlbnVtIG1hdHJpeFRhcmdldCkgeworICBpZiAobWF0cml4VGFyZ2V0ICE9IG1DdXJyZW50TWF0cml4VGFyZ2V0KSBnbE1hdHJpeE1vZGUobUN1cnJlbnRNYXRyaXhUYXJnZXQgPSBtYXRyaXhUYXJnZXQpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBGbGFnc18+Ci12b2lkIEdwdUhlbHBlcjo6bXVsdE1hdHJpeChjb25zdCBNYXRyaXg8U2NhbGFyLDQsNCwgRmxhZ3NfLCA0LDQ+JiBtYXQsIEdMZW51bSBtYXRyaXhUYXJnZXQpCi17Ci0gICAgc2V0TWF0cml4VGFyZ2V0KG1hdHJpeFRhcmdldCk7Ci0gICAgR2xNYXRyaXhIZWxwZXI8RmxhZ3NfJkVpZ2VuOjpSb3dNYWpvckJpdCwgRmxhZ3NfPjo6bXVsdE1hdHJpeChtYXQpOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IEZsYWdzXz4KK3ZvaWQgR3B1SGVscGVyOjptdWx0TWF0cml4KGNvbnN0IE1hdHJpeDxTY2FsYXIsIDQsIDQsIEZsYWdzXywgNCwgND4mIG1hdCwgR0xlbnVtIG1hdHJpeFRhcmdldCkgeworICBzZXRNYXRyaXhUYXJnZXQobWF0cml4VGFyZ2V0KTsKKyAgR2xNYXRyaXhIZWxwZXI8RmxhZ3NfICYgRWlnZW46OlJvd01ham9yQml0LCBGbGFnc18+OjptdWx0TWF0cml4KG1hdCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRGVyaXZlZD4KLXZvaWQgR3B1SGVscGVyOjpsb2FkTWF0cml4KAotICAgIGNvbnN0IEVpZ2VuOjpDd2lzZU51bGxhcnlPcDxFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxTY2FsYXI+LERlcml2ZWQ+JiwKLSAgICBHTGVudW0gbWF0cml4VGFyZ2V0KQotewotICAgIHNldE1hdHJpeFRhcmdldChtYXRyaXhUYXJnZXQpOwotICAgIGdsTG9hZElkZW50aXR5KCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBEZXJpdmVkPgordm9pZCBHcHVIZWxwZXI6OmxvYWRNYXRyaXgoY29uc3QgRWlnZW46OkN3aXNlTnVsbGFyeU9wPEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX2lkZW50aXR5X29wPFNjYWxhcj4sIERlcml2ZWQ+JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBtYXRyaXhUYXJnZXQpIHsKKyAgc2V0TWF0cml4VGFyZ2V0KG1hdHJpeFRhcmdldCk7CisgIGdsTG9hZElkZW50aXR5KCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IEZsYWdzXz4KLXZvaWQgR3B1SGVscGVyOjpsb2FkTWF0cml4KGNvbnN0IEVpZ2VuOjpNYXRyaXg8U2NhbGFyLDQsNCwgRmxhZ3NfLCA0LDQ+JiBtYXQsIEdMZW51bSBtYXRyaXhUYXJnZXQpCi17Ci0gICAgc2V0TWF0cml4VGFyZ2V0KG1hdHJpeFRhcmdldCk7Ci0gICAgR2xNYXRyaXhIZWxwZXI8KEZsYWdzXyZFaWdlbjo6Um93TWFqb3JCaXQpIT0wLCBGbGFnc18+Ojpsb2FkTWF0cml4KG1hdCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRmxhZ3NfPgordm9pZCBHcHVIZWxwZXI6OmxvYWRNYXRyaXgoY29uc3QgRWlnZW46Ok1hdHJpeDxTY2FsYXIsIDQsIDQsIEZsYWdzXywgNCwgND4mIG1hdCwgR0xlbnVtIG1hdHJpeFRhcmdldCkgeworICBzZXRNYXRyaXhUYXJnZXQobWF0cml4VGFyZ2V0KTsKKyAgR2xNYXRyaXhIZWxwZXI8KEZsYWdzXyAmIEVpZ2VuOjpSb3dNYWpvckJpdCkgIT0gMCwgRmxhZ3NfPjo6bG9hZE1hdHJpeChtYXQpOwogfQogCi1pbmxpbmUgdm9pZCBHcHVIZWxwZXI6OnB1c2hNYXRyaXgoR0xlbnVtIG1hdHJpeFRhcmdldCkKLXsKLSAgICBzZXRNYXRyaXhUYXJnZXQobWF0cml4VGFyZ2V0KTsKLSAgICBnbFB1c2hNYXRyaXgoKTsKK2lubGluZSB2b2lkIEdwdUhlbHBlcjo6cHVzaE1hdHJpeChHTGVudW0gbWF0cml4VGFyZ2V0KSB7CisgIHNldE1hdHJpeFRhcmdldChtYXRyaXhUYXJnZXQpOworICBnbFB1c2hNYXRyaXgoKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRmxhZ3NfPgotaW5saW5lIHZvaWQgR3B1SGVscGVyOjpwdXNoTWF0cml4KGNvbnN0IE1hdHJpeDxTY2FsYXIsNCw0LCBGbGFnc18sIDQsND4mIG1hdCwgR0xlbnVtIG1hdHJpeFRhcmdldCkKLXsKLSAgICBwdXNoTWF0cml4KG1hdHJpeFRhcmdldCk7Ci0gICAgR2xNYXRyaXhIZWxwZXI8RmxhZ3NfJkVpZ2VuOjpSb3dNYWpvckJpdCxGbGFnc18+Ojpsb2FkTWF0cml4KG1hdCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRmxhZ3NfPgoraW5saW5lIHZvaWQgR3B1SGVscGVyOjpwdXNoTWF0cml4KGNvbnN0IE1hdHJpeDxTY2FsYXIsIDQsIDQsIEZsYWdzXywgNCwgND4mIG1hdCwgR0xlbnVtIG1hdHJpeFRhcmdldCkgeworICBwdXNoTWF0cml4KG1hdHJpeFRhcmdldCk7CisgIEdsTWF0cml4SGVscGVyPEZsYWdzXyAmIEVpZ2VuOjpSb3dNYWpvckJpdCwgRmxhZ3NfPjo6bG9hZE1hdHJpeChtYXQpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIERlcml2ZWQ+Ci12b2lkIEdwdUhlbHBlcjo6cHVzaE1hdHJpeCgKLSAgICBjb25zdCBFaWdlbjo6Q3dpc2VOdWxsYXJ5T3A8RWlnZW46OmludGVybmFsOjpzY2FsYXJfaWRlbnRpdHlfb3A8U2NhbGFyPixEZXJpdmVkPiYsCi0gICAgR0xlbnVtIG1hdHJpeFRhcmdldCkKLXsKLSAgICBwdXNoTWF0cml4KG1hdHJpeFRhcmdldCk7Ci0gICAgZ2xMb2FkSWRlbnRpdHkoKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIERlcml2ZWQ+Cit2b2lkIEdwdUhlbHBlcjo6cHVzaE1hdHJpeChjb25zdCBFaWdlbjo6Q3dpc2VOdWxsYXJ5T3A8RWlnZW46OmludGVybmFsOjpzY2FsYXJfaWRlbnRpdHlfb3A8U2NhbGFyPiwgRGVyaXZlZD4mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIG1hdHJpeFRhcmdldCkgeworICBwdXNoTWF0cml4KG1hdHJpeFRhcmdldCk7CisgIGdsTG9hZElkZW50aXR5KCk7CiB9CiAKLWlubGluZSB2b2lkIEdwdUhlbHBlcjo6cG9wTWF0cml4KEdMZW51bSBtYXRyaXhUYXJnZXQpCi17Ci0gICAgc2V0TWF0cml4VGFyZ2V0KG1hdHJpeFRhcmdldCk7Ci0gICAgZ2xQb3BNYXRyaXgoKTsKK2lubGluZSB2b2lkIEdwdUhlbHBlcjo6cG9wTWF0cml4KEdMZW51bSBtYXRyaXhUYXJnZXQpIHsKKyAgc2V0TWF0cml4VGFyZ2V0KG1hdHJpeFRhcmdldCk7CisgIGdsUG9wTWF0cml4KCk7CiB9CiAKLWlubGluZSB2b2lkIEdwdUhlbHBlcjo6ZHJhdyhHTGVudW0gbW9kZSwgdWludCBub2ZFbGVtZW50KQotewotICAgIGdsRHJhd0FycmF5cyhtb2RlLCAwLCBub2ZFbGVtZW50KTsKK2lubGluZSB2b2lkIEdwdUhlbHBlcjo6ZHJhdyhHTGVudW0gbW9kZSwgdWludCBub2ZFbGVtZW50KSB7IGdsRHJhd0FycmF5cyhtb2RlLCAwLCBub2ZFbGVtZW50KTsgfQorCitpbmxpbmUgdm9pZCBHcHVIZWxwZXI6OmRyYXcoR0xlbnVtIG1vZGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ+KiBwSW5kZXhlcykgeworICBnbERyYXdFbGVtZW50cyhtb2RlLCBwSW5kZXhlcy0+c2l6ZSgpLCBHTF9VTlNJR05FRF9JTlQsICYocEluZGV4ZXMtPmZyb250KCkpKTsKIH0KIAoraW5saW5lIHZvaWQgR3B1SGVscGVyOjpkcmF3KEdMZW51bSBtb2RlLCB1aW50IHN0YXJ0LCB1aW50IGVuZCkgeyBnbERyYXdBcnJheXMobW9kZSwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsgfQogCi1pbmxpbmUgdm9pZCBHcHVIZWxwZXI6OmRyYXcoR0xlbnVtIG1vZGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ+KiBwSW5kZXhlcykKLXsKLSAgICBnbERyYXdFbGVtZW50cyhtb2RlLCBwSW5kZXhlcy0+c2l6ZSgpLCBHTF9VTlNJR05FRF9JTlQsICYocEluZGV4ZXMtPmZyb250KCkpKTsKLX0KLQotaW5saW5lIHZvaWQgR3B1SGVscGVyOjpkcmF3KEdMZW51bSBtb2RlLCB1aW50IHN0YXJ0LCB1aW50IGVuZCkKLXsKLSAgICBnbERyYXdBcnJheXMobW9kZSwgc3RhcnQsIGVuZC1zdGFydCk7Ci19Ci0KLSNlbmRpZiAvLyBFSUdFTl9HUFVIRUxQRVJfSAorI2VuZGlmICAvLyBFSUdFTl9HUFVIRUxQRVJfSApkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL2ljb3NwaGVyZS5jcHAgYi9kZW1vcy9vcGVuZ2wvaWNvc3BoZXJlLmNwcAppbmRleCAzOTQ0NGNiLi5kYjI4YzQ3IDEwMDY0NAotLS0gYS9kZW1vcy9vcGVuZ2wvaWNvc3BoZXJlLmNwcAorKysgYi9kZW1vcy9vcGVuZ2wvaWNvc3BoZXJlLmNwcApAQCAtMjAsMTAxICsyMCw4NiBAQAogI2RlZmluZSBYIC41MjU3MzExMTIxMTkxMzM2MDYKICNkZWZpbmUgWiAuODUwNjUwODA4MzUyMDM5OTMyCiAKLXN0YXRpYyBHTGZsb2F0IHZkYXRhWzEyXVszXSA9IHsKLSAgIHstWCwgMC4wLCBafSwge1gsIDAuMCwgWn0sIHstWCwgMC4wLCAtWn0sIHtYLCAwLjAsIC1afSwKLSAgIHswLjAsIFosIFh9LCB7MC4wLCBaLCAtWH0sIHswLjAsIC1aLCBYfSwgezAuMCwgLVosIC1YfSwKLSAgIHtaLCBYLCAwLjB9LCB7LVosIFgsIDAuMH0sIHtaLCAtWCwgMC4wfSwgey1aLCAtWCwgMC4wfQotfTsKK3N0YXRpYyBHTGZsb2F0IHZkYXRhWzEyXVszXSA9IHt7LVgsIDAuMCwgWn0sIHtYLCAwLjAsIFp9LCAgIHstWCwgMC4wLCAtWn0sIHtYLCAwLjAsIC1afSwgezAuMCwgWiwgWH0sICB7MC4wLCBaLCAtWH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAuMCwgLVosIFh9LCB7MC4wLCAtWiwgLVh9LCB7WiwgWCwgMC4wfSwgICB7LVosIFgsIDAuMH0sIHtaLCAtWCwgMC4wfSwgey1aLCAtWCwgMC4wfX07CiAKLXN0YXRpYyBHTGludCB0aW5kaWNlc1syMF1bM10gPSB7Ci0gICB7MCw0LDF9LCB7MCw5LDR9LCB7OSw1LDR9LCB7NCw1LDh9LCB7NCw4LDF9LAotICAgezgsMTAsMX0sIHs4LDMsMTB9LCB7NSwzLDh9LCB7NSwyLDN9LCB7Miw3LDN9LAotICAgezcsMTAsM30sIHs3LDYsMTB9LCB7NywxMSw2fSwgezExLDAsNn0sIHswLDEsNn0sCi0gICB7NiwxLDEwfSwgezksMCwxMX0sIHs5LDExLDJ9LCB7OSwyLDV9LCB7NywyLDExfSB9Oworc3RhdGljIEdMaW50IHRpbmRpY2VzWzIwXVszXSA9IHt7MCwgNCwgMX0sIHswLCA5LCA0fSwgIHs5LCA1LCA0fSwgIHs0LCA1LCA4fSwgIHs0LCA4LCAxfSwgIHs4LCAxMCwgMX0sIHs4LCAzLCAxMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs1LCAzLCA4fSwgezUsIDIsIDN9LCAgezIsIDcsIDN9LCAgezcsIDEwLCAzfSwgezcsIDYsIDEwfSwgezcsIDExLCA2fSwgezExLCAwLCA2fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDEsIDZ9LCB7NiwgMSwgMTB9LCB7OSwgMCwgMTF9LCB7OSwgMTEsIDJ9LCB7OSwgMiwgNX0sICB7NywgMiwgMTF9fTsKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotSWNvU3BoZXJlOjpJY29TcGhlcmUodW5zaWduZWQgaW50IGxldmVscykKLXsKK0ljb1NwaGVyZTo6SWNvU3BoZXJlKHVuc2lnbmVkIGludCBsZXZlbHMpIHsKICAgLy8gaW5pdCB3aXRoIGFuIGljb3NhaGVkcm9uCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTI7IGkrKykKLSAgICBtVmVydGljZXMucHVzaF9iYWNrKE1hcDxWZWN0b3IzZj4odmRhdGFbaV0pKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMjsgaSsrKSBtVmVydGljZXMucHVzaF9iYWNrKE1hcDxWZWN0b3IzZj4odmRhdGFbaV0pKTsKICAgbUluZGljZXMucHVzaF9iYWNrKG5ldyBzdGQ6OnZlY3RvcjxpbnQ+KTsKICAgc3RkOjp2ZWN0b3I8aW50PiYgaW5kaWNlcyA9ICptSW5kaWNlcy5iYWNrKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKLSAgewotICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMzsgaysrKQotICAgICAgaW5kaWNlcy5wdXNoX2JhY2sodGluZGljZXNbaV1ba10pOworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDM7IGsrKykgaW5kaWNlcy5wdXNoX2JhY2sodGluZGljZXNbaV1ba10pOwogICB9CiAgIG1MaXN0SWRzLnB1c2hfYmFjaygwKTsKIAotICB3aGlsZShtSW5kaWNlcy5zaXplKCk8bGV2ZWxzKQotICAgIF9zdWJkaXZpZGUoKTsKKyAgd2hpbGUgKG1JbmRpY2VzLnNpemUoKSA8IGxldmVscykgX3N1YmRpdmlkZSgpOwogfQogCi1jb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBJY29TcGhlcmU6OmluZGljZXMoaW50IGxldmVsKSBjb25zdAotewotICB3aGlsZSAobGV2ZWw+PWludChtSW5kaWNlcy5zaXplKCkpKQotICAgIGNvbnN0X2Nhc3Q8SWNvU3BoZXJlKj4odGhpcyktPl9zdWJkaXZpZGUoKTsKK2NvbnN0IHN0ZDo6dmVjdG9yPGludD4mIEljb1NwaGVyZTo6aW5kaWNlcyhpbnQgbGV2ZWwpIGNvbnN0IHsKKyAgd2hpbGUgKGxldmVsID49IGludChtSW5kaWNlcy5zaXplKCkpKSBjb25zdF9jYXN0PEljb1NwaGVyZSo+KHRoaXMpLT5fc3ViZGl2aWRlKCk7CiAgIHJldHVybiAqbUluZGljZXNbbGV2ZWxdOwogfQogCi12b2lkIEljb1NwaGVyZTo6X3N1YmRpdmlkZSh2b2lkKQotewordm9pZCBJY29TcGhlcmU6Ol9zdWJkaXZpZGUodm9pZCkgewogICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBLZXk7Ci0gIHN0ZDo6bWFwPEtleSxpbnQ+IGVkZ2VNYXA7CisgIHN0ZDo6bWFwPEtleSwgaW50PiBlZGdlTWFwOwogICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpbmRpY2VzID0gKm1JbmRpY2VzLmJhY2soKTsKICAgbUluZGljZXMucHVzaF9iYWNrKG5ldyBzdGQ6OnZlY3RvcjxpbnQ+KTsKICAgc3RkOjp2ZWN0b3I8aW50PiYgcmVmaW5lZEluZGljZXMgPSAqbUluZGljZXMuYmFjaygpOwogICBpbnQgZW5kID0gaW5kaWNlcy5zaXplKCk7Ci0gIGZvciAoaW50IGk9MDsgaTxlbmQ7IGkrPTMpCi0gIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmQ7IGkgKz0gMykgewogICAgIGludCBpZHMwWzNdLCAgLy8gaW5kaWNlcyBvZiBvdXRlciB2ZXJ0aWNlcwogICAgICAgICBpZHMxWzNdOyAgLy8gaW5kaWNlcyBvZiBlZGdlIHZlcnRpY2VzCi0gICAgZm9yIChpbnQgaz0wOyBrPDM7ICsraykKLSAgICB7Ci0gICAgICBpbnQgazEgPSAoaysxKSUzOwotICAgICAgaW50IGUwID0gaW5kaWNlc1tpK2tdOwotICAgICAgaW50IGUxID0gaW5kaWNlc1tpK2sxXTsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDM7ICsraykgeworICAgICAgaW50IGsxID0gKGsgKyAxKSAlIDM7CisgICAgICBpbnQgZTAgPSBpbmRpY2VzW2kgKyBrXTsKKyAgICAgIGludCBlMSA9IGluZGljZXNbaSArIGsxXTsKICAgICAgIGlkczBba10gPSBlMDsKLSAgICAgIGlmIChlMT5lMCkKLSAgICAgICAgc3RkOjpzd2FwKGUwLGUxKTsKLSAgICAgIEtleSBlZGdlS2V5ID0gS2V5KGUwKSB8IChLZXkoZTEpPDwzMik7Ci0gICAgICBzdGQ6Om1hcDxLZXksaW50Pjo6aXRlcmF0b3IgaXQgPSBlZGdlTWFwLmZpbmQoZWRnZUtleSk7Ci0gICAgICBpZiAoaXQ9PWVkZ2VNYXAuZW5kKCkpCi0gICAgICB7CisgICAgICBpZiAoZTEgPiBlMCkgc3RkOjpzd2FwKGUwLCBlMSk7CisgICAgICBLZXkgZWRnZUtleSA9IEtleShlMCkgfCAoS2V5KGUxKSA8PCAzMik7CisgICAgICBzdGQ6Om1hcDxLZXksIGludD46Oml0ZXJhdG9yIGl0ID0gZWRnZU1hcC5maW5kKGVkZ2VLZXkpOworICAgICAgaWYgKGl0ID09IGVkZ2VNYXAuZW5kKCkpIHsKICAgICAgICAgaWRzMVtrXSA9IG1WZXJ0aWNlcy5zaXplKCk7CiAgICAgICAgIGVkZ2VNYXBbZWRnZUtleV0gPSBpZHMxW2tdOwotICAgICAgICBtVmVydGljZXMucHVzaF9iYWNrKCAobVZlcnRpY2VzW2UwXSttVmVydGljZXNbZTFdKS5ub3JtYWxpemVkKCkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKKyAgICAgICAgbVZlcnRpY2VzLnB1c2hfYmFjaygobVZlcnRpY2VzW2UwXSArIG1WZXJ0aWNlc1tlMV0pLm5vcm1hbGl6ZWQoKSk7CisgICAgICB9IGVsc2UKICAgICAgICAgaWRzMVtrXSA9IGl0LT5zZWNvbmQ7CiAgICAgfQotICAgIHJlZmluZWRJbmRpY2VzLnB1c2hfYmFjayhpZHMwWzBdKTsgcmVmaW5lZEluZGljZXMucHVzaF9iYWNrKGlkczFbMF0pOyByZWZpbmVkSW5kaWNlcy5wdXNoX2JhY2soaWRzMVsyXSk7Ci0gICAgcmVmaW5lZEluZGljZXMucHVzaF9iYWNrKGlkczBbMV0pOyByZWZpbmVkSW5kaWNlcy5wdXNoX2JhY2soaWRzMVsxXSk7IHJlZmluZWRJbmRpY2VzLnB1c2hfYmFjayhpZHMxWzBdKTsKLSAgICByZWZpbmVkSW5kaWNlcy5wdXNoX2JhY2soaWRzMFsyXSk7IHJlZmluZWRJbmRpY2VzLnB1c2hfYmFjayhpZHMxWzJdKTsgcmVmaW5lZEluZGljZXMucHVzaF9iYWNrKGlkczFbMV0pOwotICAgIHJlZmluZWRJbmRpY2VzLnB1c2hfYmFjayhpZHMxWzBdKTsgcmVmaW5lZEluZGljZXMucHVzaF9iYWNrKGlkczFbMV0pOyByZWZpbmVkSW5kaWNlcy5wdXNoX2JhY2soaWRzMVsyXSk7CisgICAgcmVmaW5lZEluZGljZXMucHVzaF9iYWNrKGlkczBbMF0pOworICAgIHJlZmluZWRJbmRpY2VzLnB1c2hfYmFjayhpZHMxWzBdKTsKKyAgICByZWZpbmVkSW5kaWNlcy5wdXNoX2JhY2soaWRzMVsyXSk7CisgICAgcmVmaW5lZEluZGljZXMucHVzaF9iYWNrKGlkczBbMV0pOworICAgIHJlZmluZWRJbmRpY2VzLnB1c2hfYmFjayhpZHMxWzFdKTsKKyAgICByZWZpbmVkSW5kaWNlcy5wdXNoX2JhY2soaWRzMVswXSk7CisgICAgcmVmaW5lZEluZGljZXMucHVzaF9iYWNrKGlkczBbMl0pOworICAgIHJlZmluZWRJbmRpY2VzLnB1c2hfYmFjayhpZHMxWzJdKTsKKyAgICByZWZpbmVkSW5kaWNlcy5wdXNoX2JhY2soaWRzMVsxXSk7CisgICAgcmVmaW5lZEluZGljZXMucHVzaF9iYWNrKGlkczFbMF0pOworICAgIHJlZmluZWRJbmRpY2VzLnB1c2hfYmFjayhpZHMxWzFdKTsKKyAgICByZWZpbmVkSW5kaWNlcy5wdXNoX2JhY2soaWRzMVsyXSk7CiAgIH0KICAgbUxpc3RJZHMucHVzaF9iYWNrKDApOwogfQogCi12b2lkIEljb1NwaGVyZTo6ZHJhdyhpbnQgbGV2ZWwpCi17Ci0gIHdoaWxlIChsZXZlbD49aW50KG1JbmRpY2VzLnNpemUoKSkpCi0gICAgY29uc3RfY2FzdDxJY29TcGhlcmUqPih0aGlzKS0+X3N1YmRpdmlkZSgpOwotICBpZiAobUxpc3RJZHNbbGV2ZWxdPT0wKQotICB7Cit2b2lkIEljb1NwaGVyZTo6ZHJhdyhpbnQgbGV2ZWwpIHsKKyAgd2hpbGUgKGxldmVsID49IGludChtSW5kaWNlcy5zaXplKCkpKSBjb25zdF9jYXN0PEljb1NwaGVyZSo+KHRoaXMpLT5fc3ViZGl2aWRlKCk7CisgIGlmIChtTGlzdElkc1tsZXZlbF0gPT0gMCkgewogICAgIG1MaXN0SWRzW2xldmVsXSA9IGdsR2VuTGlzdHMoMSk7CiAgICAgZ2xOZXdMaXN0KG1MaXN0SWRzW2xldmVsXSwgR0xfQ09NUElMRSk7Ci0gICAgICBnbFZlcnRleFBvaW50ZXIoMywgR0xfRkxPQVQsIDAsIG1WZXJ0aWNlc1swXS5kYXRhKCkpOwotICAgICAgZ2xOb3JtYWxQb2ludGVyKEdMX0ZMT0FULCAwLCBtVmVydGljZXNbMF0uZGF0YSgpKTsKLSAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKLSAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKLSAgICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbUluZGljZXNbbGV2ZWxdLT5zaXplKCksIEdMX1VOU0lHTkVEX0lOVCwgJihtSW5kaWNlc1tsZXZlbF0tPmF0KDApKSk7Ci0gICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwotICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKKyAgICBnbFZlcnRleFBvaW50ZXIoMywgR0xfRkxPQVQsIDAsIG1WZXJ0aWNlc1swXS5kYXRhKCkpOworICAgIGdsTm9ybWFsUG9pbnRlcihHTF9GTE9BVCwgMCwgbVZlcnRpY2VzWzBdLmRhdGEoKSk7CisgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOworICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKKyAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIG1JbmRpY2VzW2xldmVsXS0+c2l6ZSgpLCBHTF9VTlNJR05FRF9JTlQsICYobUluZGljZXNbbGV2ZWxdLT5hdCgwKSkpOworICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CisgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKICAgICBnbEVuZExpc3QoKTsKICAgfQogICBnbENhbGxMaXN0KG1MaXN0SWRzW2xldmVsXSk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL2ljb3NwaGVyZS5oIGIvZGVtb3Mvb3BlbmdsL2ljb3NwaGVyZS5oCmluZGV4IGIwMjEwZWQuLjExNDE4YzEgMTAwNjQ0Ci0tLSBhL2RlbW9zL29wZW5nbC9pY29zcGhlcmUuaAorKysgYi9kZW1vcy9vcGVuZ2wvaWNvc3BoZXJlLmgKQEAgLTEzLDE4ICsxMywxOCBAQAogI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi1jbGFzcyBJY29TcGhlcmUKLXsKLSAgcHVibGljOgotICAgIEljb1NwaGVyZSh1bnNpZ25lZCBpbnQgbGV2ZWxzPTEpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEVpZ2VuOjpWZWN0b3IzZj4mIHZlcnRpY2VzKCkgY29uc3QgeyByZXR1cm4gbVZlcnRpY2VzOyB9Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaW5kaWNlcyhpbnQgbGV2ZWwpIGNvbnN0OwotICAgIHZvaWQgZHJhdyhpbnQgbGV2ZWwpOwotICBwcm90ZWN0ZWQ6Ci0gICAgdm9pZCBfc3ViZGl2aWRlKCk7Ci0gICAgc3RkOjp2ZWN0b3I8RWlnZW46OlZlY3RvcjNmPiBtVmVydGljZXM7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pio+IG1JbmRpY2VzOwotICAgIHN0ZDo6dmVjdG9yPGludD4gbUxpc3RJZHM7CitjbGFzcyBJY29TcGhlcmUgeworIHB1YmxpYzoKKyAgSWNvU3BoZXJlKHVuc2lnbmVkIGludCBsZXZlbHMgPSAxKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8RWlnZW46OlZlY3RvcjNmPiYgdmVydGljZXMoKSBjb25zdCB7IHJldHVybiBtVmVydGljZXM7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaW5kaWNlcyhpbnQgbGV2ZWwpIGNvbnN0OworICB2b2lkIGRyYXcoaW50IGxldmVsKTsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBfc3ViZGl2aWRlKCk7CisgIHN0ZDo6dmVjdG9yPEVpZ2VuOjpWZWN0b3IzZj4gbVZlcnRpY2VzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+Kj4gbUluZGljZXM7CisgIHN0ZDo6dmVjdG9yPGludD4gbUxpc3RJZHM7CiB9OwogCi0jZW5kaWYgLy8gRUlHRU5fSUNPU1BIRVJFX0gKKyNlbmRpZiAgLy8gRUlHRU5fSUNPU1BIRVJFX0gKZGlmZiAtLWdpdCBhL2RlbW9zL29wZW5nbC9xdWF0ZXJuaW9uX2RlbW8uY3BwIGIvZGVtb3Mvb3BlbmdsL3F1YXRlcm5pb25fZGVtby5jcHAKaW5kZXggNTMxNDQ4ZC4uNWY4NjczYyAxMDA2NDQKLS0tIGEvZGVtb3Mvb3BlbmdsL3F1YXRlcm5pb25fZGVtby5jcHAKKysrIGIvZGVtb3Mvb3BlbmdsL3F1YXRlcm5pb25fZGVtby5jcHAKQEAgLTI3LDEyNiArMjcsMTEyIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotY2xhc3MgRmFuY3lTcGhlcmVzCi17Ci0gIHB1YmxpYzoKLSAgICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCi0gICAgCi0gICAgRmFuY3lTcGhlcmVzKCkKK2NsYXNzIEZhbmN5U3BoZXJlcyB7CisgcHVibGljOgorICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCisKKyAgRmFuY3lTcGhlcmVzKCkgeworICAgIGNvbnN0IGludCBsZXZlbHMgPSA0OworICAgIGNvbnN0IGZsb2F0IHNjYWxlID0gMC4zMzsKKyAgICBmbG9hdCByYWRpdXMgPSAxMDA7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBwYXJlbnRzOworCisgICAgLy8gbGV2YWwgMAorICAgIG1DZW50ZXJzLnB1c2hfYmFjayhWZWN0b3IzZjo6WmVybygpKTsKKyAgICBwYXJlbnRzLnB1c2hfYmFjaygtMSk7CisgICAgbVJhZGlpLnB1c2hfYmFjayhyYWRpdXMpOworCisgICAgLy8gZ2VuZXJhdGUgbGV2ZWwgMSB1c2luZyBpY29zcGhlcmUgdmVydGljZXMKKyAgICByYWRpdXMgKj0gMC40NTsKICAgICB7Ci0gICAgICBjb25zdCBpbnQgbGV2ZWxzID0gNDsKLSAgICAgIGNvbnN0IGZsb2F0IHNjYWxlID0gMC4zMzsKLSAgICAgIGZsb2F0IHJhZGl1cyA9IDEwMDsKLSAgICAgIHN0ZDo6dmVjdG9yPGludD4gcGFyZW50czsKLQotICAgICAgLy8gbGV2YWwgMAotICAgICAgbUNlbnRlcnMucHVzaF9iYWNrKFZlY3RvcjNmOjpaZXJvKCkpOwotICAgICAgcGFyZW50cy5wdXNoX2JhY2soLTEpOwotICAgICAgbVJhZGlpLnB1c2hfYmFjayhyYWRpdXMpOwotCi0gICAgICAvLyBnZW5lcmF0ZSBsZXZlbCAxIHVzaW5nIGljb3NwaGVyZSB2ZXJ0aWNlcwotICAgICAgcmFkaXVzICo9IDAuNDU7Ci0gICAgICB7Ci0gICAgICAgIGZsb2F0IGRpc3QgPSBtUmFkaWlbMF0qMC45OwotICAgICAgICBmb3IgKGludCBpPTA7IGk8MTI7ICsraSkKLSAgICAgICAgewotICAgICAgICAgIG1DZW50ZXJzLnB1c2hfYmFjayhtSWNvU3BoZXJlLnZlcnRpY2VzKClbaV0gKiBkaXN0KTsKLSAgICAgICAgICBtUmFkaWkucHVzaF9iYWNrKHJhZGl1cyk7Ci0gICAgICAgICAgcGFyZW50cy5wdXNoX2JhY2soMCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgc3RhdGljIGNvbnN0IGZsb2F0IGFuZ2xlcyBbMTBdID0gewotICAgICAgICAwLCAwLAotICAgICAgICBNX1BJLCAwLipNX1BJLAotICAgICAgICBNX1BJLCAwLjUqTV9QSSwKLSAgICAgICAgTV9QSSwgMS4qTV9QSSwKLSAgICAgICAgTV9QSSwgMS41Kk1fUEkKLSAgICAgIH07Ci0KLSAgICAgIC8vIGdlbmVyYXRlIG90aGVyIGxldmVscwotICAgICAgaW50IHN0YXJ0ID0gMTsKLSAgICAgIGZvciAoaW50IGw9MTsgbDxsZXZlbHM7IGwrKykKLSAgICAgIHsKLSAgICAgICAgcmFkaXVzICo9IHNjYWxlOwotICAgICAgICBpbnQgZW5kID0gbUNlbnRlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPXN0YXJ0OyBpPGVuZDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgVmVjdG9yM2YgYyA9IG1DZW50ZXJzW2ldOwotICAgICAgICAgIFZlY3RvcjNmIGF4MCA9IChjIC0gbUNlbnRlcnNbcGFyZW50c1tpXV0pLm5vcm1hbGl6ZWQoKTsKLSAgICAgICAgICBWZWN0b3IzZiBheDEgPSBheDAudW5pdE9ydGhvZ29uYWwoKTsKLSAgICAgICAgICBRdWF0ZXJuaW9uZiBxOwotICAgICAgICAgIHEuc2V0RnJvbVR3b1ZlY3RvcnMoVmVjdG9yM2Y6OlVuaXRaKCksIGF4MCk7Ci0gICAgICAgICAgQWZmaW5lM2YgdCA9IFRyYW5zbGF0aW9uM2YoYykgKiBxICogU2NhbGluZyhtUmFkaWlbaV0rcmFkaXVzKTsKLSAgICAgICAgICBmb3IgKGludCBqPTA7IGo8NTsgKytqKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFZlY3RvcjNmIG5ld0MgPSBjICsgKCAoQW5nbGVBeGlzZihhbmdsZXNbaioyKzFdLCBheDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQW5nbGVBeGlzZihhbmdsZXNbaioyKzBdICogKGw9PTEgPyAwLjM1IDogMC41KSwgYXgxKSkgKiBheDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKG1SYWRpaVtpXSArIHJhZGl1cyowLjgpOwotICAgICAgICAgICAgbUNlbnRlcnMucHVzaF9iYWNrKG5ld0MpOwotICAgICAgICAgICAgbVJhZGlpLnB1c2hfYmFjayhyYWRpdXMpOwotICAgICAgICAgICAgcGFyZW50cy5wdXNoX2JhY2soaSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0YXJ0ID0gZW5kOworICAgICAgZmxvYXQgZGlzdCA9IG1SYWRpaVswXSAqIDAuOTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTI7ICsraSkgeworICAgICAgICBtQ2VudGVycy5wdXNoX2JhY2sobUljb1NwaGVyZS52ZXJ0aWNlcygpW2ldICogZGlzdCk7CisgICAgICAgIG1SYWRpaS5wdXNoX2JhY2socmFkaXVzKTsKKyAgICAgICAgcGFyZW50cy5wdXNoX2JhY2soMCk7CiAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBkcmF3KCkKLSAgICB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGFuZ2xlc1sxMF0gPSB7MCwgMCwgTV9QSSwgMC4gKiBNX1BJLCBNX1BJLCAwLjUgKiBNX1BJLCBNX1BJLCAxLiAqIE1fUEksIE1fUEksIDEuNSAqIE1fUEl9OworCisgICAgLy8gZ2VuZXJhdGUgb3RoZXIgbGV2ZWxzCisgICAgaW50IHN0YXJ0ID0gMTsKKyAgICBmb3IgKGludCBsID0gMTsgbCA8IGxldmVsczsgbCsrKSB7CisgICAgICByYWRpdXMgKj0gc2NhbGU7CiAgICAgICBpbnQgZW5kID0gbUNlbnRlcnMuc2l6ZSgpOwotICAgICAgZ2xFbmFibGUoR0xfTk9STUFMSVpFKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxlbmQ7ICsraSkKLSAgICAgIHsKLSAgICAgICAgQWZmaW5lM2YgdCA9IFRyYW5zbGF0aW9uM2YobUNlbnRlcnNbaV0pICogU2NhbGluZyhtUmFkaWlbaV0pOwotICAgICAgICBncHUucHVzaE1hdHJpeChHTF9NT0RFTFZJRVcpOwotICAgICAgICBncHUubXVsdE1hdHJpeCh0Lm1hdHJpeCgpLEdMX01PREVMVklFVyk7Ci0gICAgICAgIG1JY29TcGhlcmUuZHJhdygyKTsKLSAgICAgICAgZ3B1LnBvcE1hdHJpeChHTF9NT0RFTFZJRVcpOworICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHsKKyAgICAgICAgVmVjdG9yM2YgYyA9IG1DZW50ZXJzW2ldOworICAgICAgICBWZWN0b3IzZiBheDAgPSAoYyAtIG1DZW50ZXJzW3BhcmVudHNbaV1dKS5ub3JtYWxpemVkKCk7CisgICAgICAgIFZlY3RvcjNmIGF4MSA9IGF4MC51bml0T3J0aG9nb25hbCgpOworICAgICAgICBRdWF0ZXJuaW9uZiBxOworICAgICAgICBxLnNldEZyb21Ud29WZWN0b3JzKFZlY3RvcjNmOjpVbml0WigpLCBheDApOworICAgICAgICBBZmZpbmUzZiB0ID0gVHJhbnNsYXRpb24zZihjKSAqIHEgKiBTY2FsaW5nKG1SYWRpaVtpXSArIHJhZGl1cyk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CisgICAgICAgICAgVmVjdG9yM2YgbmV3QyA9CisgICAgICAgICAgICAgIGMgKyAoKEFuZ2xlQXhpc2YoYW5nbGVzW2ogKiAyICsgMV0sIGF4MCkgKiBBbmdsZUF4aXNmKGFuZ2xlc1tqICogMiArIDBdICogKGwgPT0gMSA/IDAuMzUgOiAwLjUpLCBheDEpKSAqCisgICAgICAgICAgICAgICAgICAgYXgwKSAqCisgICAgICAgICAgICAgICAgICAgICAgKG1SYWRpaVtpXSArIHJhZGl1cyAqIDAuOCk7CisgICAgICAgICAgbUNlbnRlcnMucHVzaF9iYWNrKG5ld0MpOworICAgICAgICAgIG1SYWRpaS5wdXNoX2JhY2socmFkaXVzKTsKKyAgICAgICAgICBwYXJlbnRzLnB1c2hfYmFjayhpKTsKKyAgICAgICAgfQogICAgICAgfQotICAgICAgZ2xEaXNhYmxlKEdMX05PUk1BTElaRSk7CisgICAgICBzdGFydCA9IGVuZDsKICAgICB9Ci0gIHByb3RlY3RlZDoKLSAgICBzdGQ6OnZlY3RvcjxWZWN0b3IzZj4gbUNlbnRlcnM7Ci0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1SYWRpaTsKLSAgICBJY29TcGhlcmUgbUljb1NwaGVyZTsKKyAgfQorCisgIHZvaWQgZHJhdygpIHsKKyAgICBpbnQgZW5kID0gbUNlbnRlcnMuc2l6ZSgpOworICAgIGdsRW5hYmxlKEdMX05PUk1BTElaRSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmQ7ICsraSkgeworICAgICAgQWZmaW5lM2YgdCA9IFRyYW5zbGF0aW9uM2YobUNlbnRlcnNbaV0pICogU2NhbGluZyhtUmFkaWlbaV0pOworICAgICAgZ3B1LnB1c2hNYXRyaXgoR0xfTU9ERUxWSUVXKTsKKyAgICAgIGdwdS5tdWx0TWF0cml4KHQubWF0cml4KCksIEdMX01PREVMVklFVyk7CisgICAgICBtSWNvU3BoZXJlLmRyYXcoMik7CisgICAgICBncHUucG9wTWF0cml4KEdMX01PREVMVklFVyk7CisgICAgfQorICAgIGdsRGlzYWJsZShHTF9OT1JNQUxJWkUpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6dmVjdG9yPFZlY3RvcjNmPiBtQ2VudGVyczsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1SYWRpaTsKKyAgSWNvU3BoZXJlIG1JY29TcGhlcmU7CiB9OwogCi0KIC8vIGdlbmVyaWMgbGluZWFyIGludGVycG9sYXRpb24gbWV0aG9kCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIGxlcnAoZmxvYXQgdCwgY29uc3QgVCYgYSwgY29uc3QgVCYgYikKLXsKLSAgcmV0dXJuIGEqKDEtdCkgKyBiKnQ7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgbGVycChmbG9hdCB0LCBjb25zdCBUJiBhLCBjb25zdCBUJiBiKSB7CisgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0OwogfQogCiAvLyBxdWF0ZXJuaW9uIHNsZXJwCi10ZW1wbGF0ZTw+IFF1YXRlcm5pb25mIGxlcnAoZmxvYXQgdCwgY29uc3QgUXVhdGVybmlvbmYmIGEsIGNvbnN0IFF1YXRlcm5pb25mJiBiKQoteyByZXR1cm4gYS5zbGVycCh0LGIpOyB9Cit0ZW1wbGF0ZSA8PgorUXVhdGVybmlvbmYgbGVycChmbG9hdCB0LCBjb25zdCBRdWF0ZXJuaW9uZiYgYSwgY29uc3QgUXVhdGVybmlvbmYmIGIpIHsKKyAgcmV0dXJuIGEuc2xlcnAodCwgYik7Cit9CiAKIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIG9mIGEgZnJhbWUgdXNpbmcgdGhlIHR5cGUgT3JpZW50YXRpb25UeXBlCiAvLyB0byBwZXJmb3JtIHRoZSBpbnRlcnBvbGF0aW9uIG9mIHRoZSBvcmllbnRhdGlvbnMKLXRlbXBsYXRlPHR5cGVuYW1lIE9yaWVudGF0aW9uVHlwZT4KLWlubGluZSBzdGF0aWMgRnJhbWUgbGVycEZyYW1lKGZsb2F0IGFscGhhLCBjb25zdCBGcmFtZSYgYSwgY29uc3QgRnJhbWUmIGIpCi17Ci0gIHJldHVybiBGcmFtZShsZXJwKGFscGhhLGEucG9zaXRpb24sYi5wb3NpdGlvbiksCi0gICAgICAgICAgICAgICBRdWF0ZXJuaW9uZihsZXJwKGFscGhhLE9yaWVudGF0aW9uVHlwZShhLm9yaWVudGF0aW9uKSxPcmllbnRhdGlvblR5cGUoYi5vcmllbnRhdGlvbikpKSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3JpZW50YXRpb25UeXBlPgoraW5saW5lIHN0YXRpYyBGcmFtZSBsZXJwRnJhbWUoZmxvYXQgYWxwaGEsIGNvbnN0IEZyYW1lJiBhLCBjb25zdCBGcmFtZSYgYikgeworICByZXR1cm4gRnJhbWUobGVycChhbHBoYSwgYS5wb3NpdGlvbiwgYi5wb3NpdGlvbiksCisgICAgICAgICAgICAgICBRdWF0ZXJuaW9uZihsZXJwKGFscGhhLCBPcmllbnRhdGlvblR5cGUoYS5vcmllbnRhdGlvbiksIE9yaWVudGF0aW9uVHlwZShiLm9yaWVudGF0aW9uKSkpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyXz4gY2xhc3MgRXVsZXJBbmdsZXMKLXsKLXB1YmxpYzoKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXJfPgorY2xhc3MgRXVsZXJBbmdsZXMgeworIHB1YmxpYzoKICAgZW51bSB7IERpbSA9IDMgfTsKICAgdHlwZWRlZiBTY2FsYXJfIFNjYWxhcjsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMz4gTWF0cml4MzsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yMzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAzLCAzPiBNYXRyaXgzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDE+IFZlY3RvcjM7CiAgIHR5cGVkZWYgUXVhdGVybmlvbjxTY2FsYXI+IFF1YXRlcm5pb25UeXBlOwogCi1wcm90ZWN0ZWQ6Ci0KKyBwcm90ZWN0ZWQ6CiAgIFZlY3RvcjMgbV9hbmdsZXM7CiAKLXB1YmxpYzoKLQorIHB1YmxpYzoKICAgRXVsZXJBbmdsZXMoKSB7fQogICBpbmxpbmUgRXVsZXJBbmdsZXMoU2NhbGFyIGEwLCBTY2FsYXIgYTEsIFNjYWxhciBhMikgOiBtX2FuZ2xlcyhhMCwgYTEsIGEyKSB7fQogICBpbmxpbmUgRXVsZXJBbmdsZXMoY29uc3QgUXVhdGVybmlvblR5cGUmIHEpIHsgKnRoaXMgPSBxOyB9CkBAIC0xNTQsMzEgKzE0MCwyOCBAQAogICBjb25zdCBWZWN0b3IzJiBjb2VmZnMoKSBjb25zdCB7IHJldHVybiBtX2FuZ2xlczsgfQogICBWZWN0b3IzJiBjb2VmZnMoKSB7IHJldHVybiBtX2FuZ2xlczsgfQogCi0gIEV1bGVyQW5nbGVzJiBvcGVyYXRvcj0oY29uc3QgUXVhdGVybmlvblR5cGUmIHEpCi0gIHsKKyAgRXVsZXJBbmdsZXMmIG9wZXJhdG9yPShjb25zdCBRdWF0ZXJuaW9uVHlwZSYgcSkgewogICAgIE1hdHJpeDMgbSA9IHEudG9Sb3RhdGlvbk1hdHJpeCgpOwogICAgIHJldHVybiAqdGhpcyA9IG07CiAgIH0KIAotICBFdWxlckFuZ2xlcyYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeDMmIG0pCi0gIHsKKyAgRXVsZXJBbmdsZXMmIG9wZXJhdG9yPShjb25zdCBNYXRyaXgzJiBtKSB7CiAgICAgLy8gbWF0ID0gIGN5KmN6ICAgICAgICAgIC1jeSpzeiAgICAgICAgICAgc3kKICAgICAvLyAgICAgICAgY3oqc3gqc3krY3gqc3ogIGN4KmN6LXN4KnN5KnN6IC1jeSpzeAogICAgIC8vICAgICAgIC1jeCpjeipzeStzeCpzeiAgY3oqc3grY3gqc3kqc3ogIGN4KmN5Ci0gICAgbV9hbmdsZXMuY29lZmZSZWYoMSkgPSBzdGQ6OmFzaW4obS5jb2VmZigwLDIpKTsKLSAgICBtX2FuZ2xlcy5jb2VmZlJlZigwKSA9IHN0ZDo6YXRhbjIoLW0uY29lZmYoMSwyKSxtLmNvZWZmKDIsMikpOwotICAgIG1fYW5nbGVzLmNvZWZmUmVmKDIpID0gc3RkOjphdGFuMigtbS5jb2VmZigwLDEpLG0uY29lZmYoMCwwKSk7CisgICAgbV9hbmdsZXMuY29lZmZSZWYoMSkgPSBzdGQ6OmFzaW4obS5jb2VmZigwLCAyKSk7CisgICAgbV9hbmdsZXMuY29lZmZSZWYoMCkgPSBzdGQ6OmF0YW4yKC1tLmNvZWZmKDEsIDIpLCBtLmNvZWZmKDIsIDIpKTsKKyAgICBtX2FuZ2xlcy5jb2VmZlJlZigyKSA9IHN0ZDo6YXRhbjIoLW0uY29lZmYoMCwgMSksIG0uY29lZmYoMCwgMCkpOwogICAgIHJldHVybiAqdGhpczsKICAgfQogCi0gIE1hdHJpeDMgdG9Sb3RhdGlvbk1hdHJpeCh2b2lkKSBjb25zdAotICB7CisgIE1hdHJpeDMgdG9Sb3RhdGlvbk1hdHJpeCh2b2lkKSBjb25zdCB7CiAgICAgVmVjdG9yMyBjID0gbV9hbmdsZXMuYXJyYXkoKS5jb3MoKTsKICAgICBWZWN0b3IzIHMgPSBtX2FuZ2xlcy5hcnJheSgpLnNpbigpOwogICAgIE1hdHJpeDMgcmVzOwotICAgIHJlcyA8PCAgYy55KCkqYy56KCksICAgICAgICAgICAgICAgICAgICAtYy55KCkqcy56KCksICAgICAgICAgICAgICAgICAgIHMueSgpLAotICAgICAgICAgICAgYy56KCkqcy54KCkqcy55KCkrYy54KCkqcy56KCksICBjLngoKSpjLnooKS1zLngoKSpzLnkoKSpzLnooKSwgIC1jLnkoKSpzLngoKSwKLSAgICAgICAgICAgIC1jLngoKSpjLnooKSpzLnkoKStzLngoKSpzLnooKSwgYy56KCkqcy54KCkrYy54KCkqcy55KCkqcy56KCksICBjLngoKSpjLnkoKTsKKyAgICByZXMgPDwgYy55KCkgKiBjLnooKSwgLWMueSgpICogcy56KCksIHMueSgpLCBjLnooKSAqIHMueCgpICogcy55KCkgKyBjLngoKSAqIHMueigpLAorICAgICAgICBjLngoKSAqIGMueigpIC0gcy54KCkgKiBzLnkoKSAqIHMueigpLCAtYy55KCkgKiBzLngoKSwgLWMueCgpICogYy56KCkgKiBzLnkoKSArIHMueCgpICogcy56KCksCisgICAgICAgIGMueigpICogcy54KCkgKyBjLngoKSAqIHMueSgpICogcy56KCksIGMueCgpICogYy55KCk7CiAgICAgcmV0dXJuIHJlczsKICAgfQogCkBAIC0xODYsMTYgKzE2OSwxNCBAQAogfTsKIAogLy8gRXVsZXIgYW5nbGVzIHNsZXJwCi10ZW1wbGF0ZTw+IEV1bGVyQW5nbGVzPGZsb2F0PiBsZXJwKGZsb2F0IHQsIGNvbnN0IEV1bGVyQW5nbGVzPGZsb2F0PiYgYSwgY29uc3QgRXVsZXJBbmdsZXM8ZmxvYXQ+JiBiKQotewordGVtcGxhdGUgPD4KK0V1bGVyQW5nbGVzPGZsb2F0PiBsZXJwKGZsb2F0IHQsIGNvbnN0IEV1bGVyQW5nbGVzPGZsb2F0PiYgYSwgY29uc3QgRXVsZXJBbmdsZXM8ZmxvYXQ+JiBiKSB7CiAgIEV1bGVyQW5nbGVzPGZsb2F0PiByZXM7CiAgIHJlcy5jb2VmZnMoKSA9IGxlcnAodCwgYS5jb2VmZnMoKSwgYi5jb2VmZnMoKSk7CiAgIHJldHVybiByZXM7CiB9CiAKLQotUmVuZGVyaW5nV2lkZ2V0OjpSZW5kZXJpbmdXaWRnZXQoKQoteworUmVuZGVyaW5nV2lkZ2V0OjpSZW5kZXJpbmdXaWRnZXQoKSB7CiAgIG1BbmltYXRlID0gZmFsc2U7CiAgIG1DdXJyZW50VHJhY2tpbmdNb2RlID0gVE1fTk9fVFJBQ0s7CiAgIG1OYXZNb2RlID0gTmF2VHVybkFyb3VuZDsKQEAgLTIwNyw0MyArMTg4LDM4IEBACiAgIHNldEZvY3VzUG9saWN5KFF0OjpDbGlja0ZvY3VzKTsKIH0KIAotdm9pZCBSZW5kZXJpbmdXaWRnZXQ6OmdyYWJGcmFtZSh2b2lkKQotewotICAgIC8vIGFzayB1c2VyIGZvciBhIHRpbWUKLSAgICBib29sIG9rID0gZmFsc2U7Ci0gICAgZG91YmxlIHQgPSAwOwotICAgIGlmICghbV90aW1lbGluZS5lbXB0eSgpKQotICAgICAgdCA9ICgtLW1fdGltZWxpbmUuZW5kKCkpLT5maXJzdCArIDEuOwotICAgIHQgPSBRSW5wdXREaWFsb2c6OmdldERvdWJsZSh0aGlzLCAiRWlnZW4ncyBSZW5kZXJpbmdXaWRnZXQiLCAidGltZSB2YWx1ZTogIiwKLSAgICAgIHQsIDAsIDFlMywgMSwgJm9rKTsKLSAgICBpZiAob2spCi0gICAgewotICAgICAgRnJhbWUgYXV4OwotICAgICAgYXV4Lm9yaWVudGF0aW9uID0gbUNhbWVyYS52aWV3TWF0cml4KCkubGluZWFyKCk7Ci0gICAgICBhdXgucG9zaXRpb24gPSBtQ2FtZXJhLnZpZXdNYXRyaXgoKS50cmFuc2xhdGlvbigpOwotICAgICAgbV90aW1lbGluZVt0XSA9IGF1eDsKLSAgICB9Cit2b2lkIFJlbmRlcmluZ1dpZGdldDo6Z3JhYkZyYW1lKHZvaWQpIHsKKyAgLy8gYXNrIHVzZXIgZm9yIGEgdGltZQorICBib29sIG9rID0gZmFsc2U7CisgIGRvdWJsZSB0ID0gMDsKKyAgaWYgKCFtX3RpbWVsaW5lLmVtcHR5KCkpIHQgPSAoLS1tX3RpbWVsaW5lLmVuZCgpKS0+Zmlyc3QgKyAxLjsKKyAgdCA9IFFJbnB1dERpYWxvZzo6Z2V0RG91YmxlKHRoaXMsICJFaWdlbidzIFJlbmRlcmluZ1dpZGdldCIsICJ0aW1lIHZhbHVlOiAiLCB0LCAwLCAxZTMsIDEsICZvayk7CisgIGlmIChvaykgeworICAgIEZyYW1lIGF1eDsKKyAgICBhdXgub3JpZW50YXRpb24gPSBtQ2FtZXJhLnZpZXdNYXRyaXgoKS5saW5lYXIoKTsKKyAgICBhdXgucG9zaXRpb24gPSBtQ2FtZXJhLnZpZXdNYXRyaXgoKS50cmFuc2xhdGlvbigpOworICAgIG1fdGltZWxpbmVbdF0gPSBhdXg7CisgIH0KIH0KIAotdm9pZCBSZW5kZXJpbmdXaWRnZXQ6OmRyYXdTY2VuZSgpCi17Cit2b2lkIFJlbmRlcmluZ1dpZGdldDo6ZHJhd1NjZW5lKCkgewogICBzdGF0aWMgRmFuY3lTcGhlcmVzIHNGYW5jeVNwaGVyZXM7CiAgIGZsb2F0IGxlbmd0aCA9IDUwOwotICBncHUuZHJhd1ZlY3RvcihWZWN0b3IzZjo6WmVybygpLCBsZW5ndGgqVmVjdG9yM2Y6OlVuaXRYKCksIENvbG9yKDEsMCwwLDEpKTsKLSAgZ3B1LmRyYXdWZWN0b3IoVmVjdG9yM2Y6Olplcm8oKSwgbGVuZ3RoKlZlY3RvcjNmOjpVbml0WSgpLCBDb2xvcigwLDEsMCwxKSk7Ci0gIGdwdS5kcmF3VmVjdG9yKFZlY3RvcjNmOjpaZXJvKCksIGxlbmd0aCpWZWN0b3IzZjo6VW5pdFooKSwgQ29sb3IoMCwwLDEsMSkpOworICBncHUuZHJhd1ZlY3RvcihWZWN0b3IzZjo6WmVybygpLCBsZW5ndGggKiBWZWN0b3IzZjo6VW5pdFgoKSwgQ29sb3IoMSwgMCwgMCwgMSkpOworICBncHUuZHJhd1ZlY3RvcihWZWN0b3IzZjo6WmVybygpLCBsZW5ndGggKiBWZWN0b3IzZjo6VW5pdFkoKSwgQ29sb3IoMCwgMSwgMCwgMSkpOworICBncHUuZHJhd1ZlY3RvcihWZWN0b3IzZjo6WmVybygpLCBsZW5ndGggKiBWZWN0b3IzZjo6VW5pdFooKSwgQ29sb3IoMCwgMCwgMSwgMSkpOwogCiAgIC8vIGRyYXcgdGhlIGZyYWN0YWwgb2JqZWN0CiAgIGZsb2F0IHNxcnQzID0gc3RkOjpzcXJ0KDMuKTsKLSAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfQU1CSUVOVCwgVmVjdG9yNGYoMC41LDAuNSwwLjUsMSkuZGF0YSgpKTsKLSAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfRElGRlVTRSwgVmVjdG9yNGYoMC41LDEsMC41LDEpLmRhdGEoKSk7Ci0gIGdsTGlnaHRmdihHTF9MSUdIVDAsIEdMX1NQRUNVTEFSLCBWZWN0b3I0ZigxLDEsMSwxKS5kYXRhKCkpOwotICBnbExpZ2h0ZnYoR0xfTElHSFQwLCBHTF9QT1NJVElPTiwgVmVjdG9yNGYoLXNxcnQzLC1zcXJ0MyxzcXJ0MywwKS5kYXRhKCkpOworICBnbExpZ2h0ZnYoR0xfTElHSFQwLCBHTF9BTUJJRU5ULCBWZWN0b3I0ZigwLjUsIDAuNSwgMC41LCAxKS5kYXRhKCkpOworICBnbExpZ2h0ZnYoR0xfTElHSFQwLCBHTF9ESUZGVVNFLCBWZWN0b3I0ZigwLjUsIDEsIDAuNSwgMSkuZGF0YSgpKTsKKyAgZ2xMaWdodGZ2KEdMX0xJR0hUMCwgR0xfU1BFQ1VMQVIsIFZlY3RvcjRmKDEsIDEsIDEsIDEpLmRhdGEoKSk7CisgIGdsTGlnaHRmdihHTF9MSUdIVDAsIEdMX1BPU0lUSU9OLCBWZWN0b3I0Zigtc3FydDMsIC1zcXJ0Mywgc3FydDMsIDApLmRhdGEoKSk7CiAKLSAgZ2xMaWdodGZ2KEdMX0xJR0hUMSwgR0xfQU1CSUVOVCwgVmVjdG9yNGYoMCwwLDAsMSkuZGF0YSgpKTsKLSAgZ2xMaWdodGZ2KEdMX0xJR0hUMSwgR0xfRElGRlVTRSwgVmVjdG9yNGYoMSwwLjUsMC41LDEpLmRhdGEoKSk7Ci0gIGdsTGlnaHRmdihHTF9MSUdIVDEsIEdMX1NQRUNVTEFSLCBWZWN0b3I0ZigxLDEsMSwxKS5kYXRhKCkpOwotICBnbExpZ2h0ZnYoR0xfTElHSFQxLCBHTF9QT1NJVElPTiwgVmVjdG9yNGYoLXNxcnQzLHNxcnQzLC1zcXJ0MywwKS5kYXRhKCkpOworICBnbExpZ2h0ZnYoR0xfTElHSFQxLCBHTF9BTUJJRU5ULCBWZWN0b3I0ZigwLCAwLCAwLCAxKS5kYXRhKCkpOworICBnbExpZ2h0ZnYoR0xfTElHSFQxLCBHTF9ESUZGVVNFLCBWZWN0b3I0ZigxLCAwLjUsIDAuNSwgMSkuZGF0YSgpKTsKKyAgZ2xMaWdodGZ2KEdMX0xJR0hUMSwgR0xfU1BFQ1VMQVIsIFZlY3RvcjRmKDEsIDEsIDEsIDEpLmRhdGEoKSk7CisgIGdsTGlnaHRmdihHTF9MSUdIVDEsIEdMX1BPU0lUSU9OLCBWZWN0b3I0Zigtc3FydDMsIHNxcnQzLCAtc3FydDMsIDApLmRhdGEoKSk7CiAKICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5ULCBWZWN0b3I0ZigwLjcsIDAuNywgMC43LCAxKS5kYXRhKCkpOwogICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0RJRkZVU0UsIFZlY3RvcjRmKDAuOCwgMC43NSwgMC42LCAxKS5kYXRhKCkpOwpAQCAtMjY2LDggKzI0Miw3IEBACiAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7CiB9CiAKLXZvaWQgUmVuZGVyaW5nV2lkZ2V0OjphbmltYXRlKCkKLXsKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjphbmltYXRlKCkgewogICBtX2FscGhhICs9IGRvdWJsZShtX3RpbWVyLmludGVydmFsKCkpICogMWUtMzsKIAogICBUaW1lTGluZTo6Y29uc3RfaXRlcmF0b3IgaGkgPSBtX3RpbWVsaW5lLnVwcGVyX2JvdW5kKG1fYWxwaGEpOwpAQCAtMjc2LDI2ICsyNTEsMjAgQEAKIAogICBGcmFtZSBjdXJyZW50RnJhbWU7CiAKLSAgaWYoaGk9PW1fdGltZWxpbmUuZW5kKCkpCi0gIHsKKyAgaWYgKGhpID09IG1fdGltZWxpbmUuZW5kKCkpIHsKICAgICAvLyBlbmQKICAgICBjdXJyZW50RnJhbWUgPSBsby0+c2Vjb25kOwogICAgIHN0b3BBbmltYXRpb24oKTsKLSAgfQotICBlbHNlIGlmKGhpPT1tX3RpbWVsaW5lLmJlZ2luKCkpCi0gIHsKKyAgfSBlbHNlIGlmIChoaSA9PSBtX3RpbWVsaW5lLmJlZ2luKCkpIHsKICAgICAvLyBzdGFydAogICAgIGN1cnJlbnRGcmFtZSA9IGhpLT5zZWNvbmQ7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgZmxvYXQgcyA9IChtX2FscGhhIC0gbG8tPmZpcnN0KS8oaGktPmZpcnN0IC0gbG8tPmZpcnN0KTsKLSAgICBpZiAobUxlcnBNb2RlPT1MZXJwRXVsZXJBbmdsZXMpCisgIH0gZWxzZSB7CisgICAgZmxvYXQgcyA9IChtX2FscGhhIC0gbG8tPmZpcnN0KSAvIChoaS0+Zmlyc3QgLSBsby0+Zmlyc3QpOworICAgIGlmIChtTGVycE1vZGUgPT0gTGVycEV1bGVyQW5nbGVzKQogICAgICAgY3VycmVudEZyYW1lID0gOjpsZXJwRnJhbWU8RXVsZXJBbmdsZXM8ZmxvYXQ+ID4ocywgbG8tPnNlY29uZCwgaGktPnNlY29uZCk7Ci0gICAgZWxzZSBpZiAobUxlcnBNb2RlPT1MZXJwUXVhdGVybmlvbikKKyAgICBlbHNlIGlmIChtTGVycE1vZGUgPT0gTGVycFF1YXRlcm5pb24pCiAgICAgICBjdXJyZW50RnJhbWUgPSA6OmxlcnBGcmFtZTxFaWdlbjo6UXVhdGVybmlvbmY+KHMsIGxvLT5zZWNvbmQsIGhpLT5zZWNvbmQpOwotICAgIGVsc2UKLSAgICB7CisgICAgZWxzZSB7CiAgICAgICBzdGQ6OmNlcnIgPDwgIkludmFsaWQgcm90YXRpb24gaW50ZXJwb2xhdGlvbiBtb2RlIChhYm9ydClcbiI7CiAgICAgICBleGl0KDIpOwogICAgIH0KQEAgLTMwMywxNjIgKzI3MiwxNDEgQEAKICAgfQogCiAgIGN1cnJlbnRGcmFtZS5vcmllbnRhdGlvbiA9IGN1cnJlbnRGcmFtZS5vcmllbnRhdGlvbi5pbnZlcnNlKCk7Ci0gIGN1cnJlbnRGcmFtZS5wb3NpdGlvbiA9IC0gKGN1cnJlbnRGcmFtZS5vcmllbnRhdGlvbiAqIGN1cnJlbnRGcmFtZS5wb3NpdGlvbik7CisgIGN1cnJlbnRGcmFtZS5wb3NpdGlvbiA9IC0oY3VycmVudEZyYW1lLm9yaWVudGF0aW9uICogY3VycmVudEZyYW1lLnBvc2l0aW9uKTsKICAgbUNhbWVyYS5zZXRGcmFtZShjdXJyZW50RnJhbWUpOwogCiAgIHVwZGF0ZUdMKCk7CiB9CiAKLXZvaWQgUmVuZGVyaW5nV2lkZ2V0OjprZXlQcmVzc0V2ZW50KFFLZXlFdmVudCAqIGUpCi17Ci0gICAgc3dpdGNoKGUtPmtleSgpKQotICAgIHsKLSAgICAgIGNhc2UgUXQ6OktleV9VcDoKLSAgICAgICAgbUNhbWVyYS56b29tKDIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUXQ6OktleV9Eb3duOgotICAgICAgICBtQ2FtZXJhLnpvb20oLTIpOwotICAgICAgICBicmVhazsKLSAgICAgIC8vIGFkZCBhIGZyYW1lCi0gICAgICBjYXNlIFF0OjpLZXlfRzoKLSAgICAgICAgZ3JhYkZyYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgLy8gY2xlYXIgdGhlIHRpbWUgbGluZQotICAgICAgY2FzZSBRdDo6S2V5X0M6Ci0gICAgICAgIG1fdGltZWxpbmUuY2xlYXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAvLyBtb3ZlIHRoZSBjYW1lcmEgdG8gaW5pdGlhbCBwb3MKLSAgICAgIGNhc2UgUXQ6OktleV9SOgotICAgICAgICByZXNldENhbWVyYSgpOwotICAgICAgICBicmVhazsKLSAgICAgIC8vIHN0YXJ0L3N0b3AgdGhlIGFuaW1hdGlvbgotICAgICAgY2FzZSBRdDo6S2V5X0E6Ci0gICAgICAgIGlmIChtQW5pbWF0ZSkKLSAgICAgICAgewotICAgICAgICAgIHN0b3BBbmltYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtX2FscGhhID0gMDsKLSAgICAgICAgICBjb25uZWN0KCZtX3RpbWVyLCBTSUdOQUwodGltZW91dCgpKSwgdGhpcywgU0xPVChhbmltYXRlKCkpKTsKLSAgICAgICAgICBtX3RpbWVyLnN0YXJ0KDEwMDAvMzApOwotICAgICAgICAgIG1BbmltYXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjprZXlQcmVzc0V2ZW50KFFLZXlFdmVudCogZSkgeworICBzd2l0Y2ggKGUtPmtleSgpKSB7CisgICAgY2FzZSBRdDo6S2V5X1VwOgorICAgICAgbUNhbWVyYS56b29tKDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBRdDo6S2V5X0Rvd246CisgICAgICBtQ2FtZXJhLnpvb20oLTIpOworICAgICAgYnJlYWs7CisgICAgLy8gYWRkIGEgZnJhbWUKKyAgICBjYXNlIFF0OjpLZXlfRzoKKyAgICAgIGdyYWJGcmFtZSgpOworICAgICAgYnJlYWs7CisgICAgLy8gY2xlYXIgdGhlIHRpbWUgbGluZQorICAgIGNhc2UgUXQ6OktleV9DOgorICAgICAgbV90aW1lbGluZS5jbGVhcigpOworICAgICAgYnJlYWs7CisgICAgLy8gbW92ZSB0aGUgY2FtZXJhIHRvIGluaXRpYWwgcG9zCisgICAgY2FzZSBRdDo6S2V5X1I6CisgICAgICByZXNldENhbWVyYSgpOworICAgICAgYnJlYWs7CisgICAgLy8gc3RhcnQvc3RvcCB0aGUgYW5pbWF0aW9uCisgICAgY2FzZSBRdDo6S2V5X0E6CisgICAgICBpZiAobUFuaW1hdGUpIHsKKyAgICAgICAgc3RvcEFuaW1hdGlvbigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9hbHBoYSA9IDA7CisgICAgICAgIGNvbm5lY3QoJm1fdGltZXIsIFNJR05BTCh0aW1lb3V0KCkpLCB0aGlzLCBTTE9UKGFuaW1hdGUoKSkpOworICAgICAgICBtX3RpbWVyLnN0YXJ0KDEwMDAgLyAzMCk7CisgICAgICAgIG1BbmltYXRlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQogCi0gICAgdXBkYXRlR0woKTsKKyAgdXBkYXRlR0woKTsKIH0KIAotdm9pZCBSZW5kZXJpbmdXaWRnZXQ6OnN0b3BBbmltYXRpb24oKQotewordm9pZCBSZW5kZXJpbmdXaWRnZXQ6OnN0b3BBbmltYXRpb24oKSB7CiAgIGRpc2Nvbm5lY3QoJm1fdGltZXIsIFNJR05BTCh0aW1lb3V0KCkpLCB0aGlzLCBTTE9UKGFuaW1hdGUoKSkpOwogICBtX3RpbWVyLnN0b3AoKTsKICAgbUFuaW1hdGUgPSBmYWxzZTsKICAgbV9hbHBoYSA9IDA7CiB9CiAKLXZvaWQgUmVuZGVyaW5nV2lkZ2V0Ojptb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQqIGUpCi17Cit2b2lkIFJlbmRlcmluZ1dpZGdldDo6bW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50KiBlKSB7CiAgIG1Nb3VzZUNvb3JkcyA9IFZlY3RvcjJpKGUtPnBvcygpLngoKSwgZS0+cG9zKCkueSgpKTsKLSAgYm9vbCBmbHkgPSAobU5hdk1vZGU9PU5hdkZseSkgfHwgKGUtPm1vZGlmaWVycygpJlF0OjpDb250cm9sTW9kaWZpZXIpOwotICBzd2l0Y2goZS0+YnV0dG9uKCkpCi0gIHsKKyAgYm9vbCBmbHkgPSAobU5hdk1vZGUgPT0gTmF2Rmx5KSB8fCAoZS0+bW9kaWZpZXJzKCkgJiBRdDo6Q29udHJvbE1vZGlmaWVyKTsKKyAgc3dpdGNoIChlLT5idXR0b24oKSkgewogICAgIGNhc2UgUXQ6OkxlZnRCdXR0b246Ci0gICAgICBpZihmbHkpCi0gICAgICB7CisgICAgICBpZiAoZmx5KSB7CiAgICAgICAgIG1DdXJyZW50VHJhY2tpbmdNb2RlID0gVE1fTE9DQUxfUk9UQVRFOwogICAgICAgICBtVHJhY2tiYWxsLnN0YXJ0KFRyYWNrYmFsbDo6TG9jYWwpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgbUN1cnJlbnRUcmFja2luZ01vZGUgPSBUTV9ST1RBVEVfQVJPVU5EOwogICAgICAgICBtVHJhY2tiYWxsLnN0YXJ0KFRyYWNrYmFsbDo6QXJvdW5kKTsKICAgICAgIH0KICAgICAgIG1UcmFja2JhbGwudHJhY2sobU1vdXNlQ29vcmRzKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgUXQ6Ok1pZEJ1dHRvbjoKLSAgICAgIGlmKGZseSkKKyAgICAgIGlmIChmbHkpCiAgICAgICAgIG1DdXJyZW50VHJhY2tpbmdNb2RlID0gVE1fRkxZX1o7CiAgICAgICBlbHNlCiAgICAgICAgIG1DdXJyZW50VHJhY2tpbmdNb2RlID0gVE1fWk9PTTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgUXQ6OlJpZ2h0QnV0dG9uOgotICAgICAgICBtQ3VycmVudFRyYWNraW5nTW9kZSA9IFRNX0ZMWV9QQU47CisgICAgICBtQ3VycmVudFRyYWNraW5nTW9kZSA9IFRNX0ZMWV9QQU47CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgYnJlYWs7CiAgIH0KIH0KLXZvaWQgUmVuZGVyaW5nV2lkZ2V0Ojptb3VzZVJlbGVhc2VFdmVudChRTW91c2VFdmVudCopCi17Ci0gICAgbUN1cnJlbnRUcmFja2luZ01vZGUgPSBUTV9OT19UUkFDSzsKLSAgICB1cGRhdGVHTCgpOwordm9pZCBSZW5kZXJpbmdXaWRnZXQ6Om1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50KikgeworICBtQ3VycmVudFRyYWNraW5nTW9kZSA9IFRNX05PX1RSQUNLOworICB1cGRhdGVHTCgpOwogfQogCi12b2lkIFJlbmRlcmluZ1dpZGdldDo6bW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQqIGUpCi17Ci0gICAgLy8gdHJhY2tpbmcKLSAgICBpZihtQ3VycmVudFRyYWNraW5nTW9kZSAhPSBUTV9OT19UUkFDSykKLSAgICB7Ci0gICAgICAgIGZsb2F0IGR4ID0gICBmbG9hdChlLT54KCkgLSBtTW91c2VDb29yZHMueCgpKSAvIGZsb2F0KG1DYW1lcmEudnBXaWR0aCgpKTsKLSAgICAgICAgZmxvYXQgZHkgPSAtIGZsb2F0KGUtPnkoKSAtIG1Nb3VzZUNvb3Jkcy55KCkpIC8gZmxvYXQobUNhbWVyYS52cEhlaWdodCgpKTsKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0Ojptb3VzZU1vdmVFdmVudChRTW91c2VFdmVudCogZSkgeworICAvLyB0cmFja2luZworICBpZiAobUN1cnJlbnRUcmFja2luZ01vZGUgIT0gVE1fTk9fVFJBQ0spIHsKKyAgICBmbG9hdCBkeCA9IGZsb2F0KGUtPngoKSAtIG1Nb3VzZUNvb3Jkcy54KCkpIC8gZmxvYXQobUNhbWVyYS52cFdpZHRoKCkpOworICAgIGZsb2F0IGR5ID0gLWZsb2F0KGUtPnkoKSAtIG1Nb3VzZUNvb3Jkcy55KCkpIC8gZmxvYXQobUNhbWVyYS52cEhlaWdodCgpKTsKIAotICAgICAgICAvLyBzcGVlZHVwIHRoZSB0cmFuc2Zvcm1hdGlvbnMKLSAgICAgICAgaWYoZS0+bW9kaWZpZXJzKCkgJiBRdDo6U2hpZnRNb2RpZmllcikKLSAgICAgICAgewotICAgICAgICAgIGR4ICo9IDEwLjsKLSAgICAgICAgICBkeSAqPSAxMC47Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2gobUN1cnJlbnRUcmFja2luZ01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIFRNX1JPVEFURV9BUk9VTkQ6Ci0gICAgICAgICAgY2FzZSBUTV9MT0NBTF9ST1RBVEU6Ci0gICAgICAgICAgICBpZiAobVJvdGF0aW9uTW9kZT09Um90YXRpb25TdGFibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIHVzZSB0aGUgc3RhYmxlIHRyYWNrYmFsbCBpbXBsZW1lbnRhdGlvbiBtYXBwaW5nCi0gICAgICAgICAgICAgIC8vIHRoZSAyRCBjb29yZGluYXRlcyB0byAzRCBwb2ludHMgb24gYSBzcGhlcmUuCi0gICAgICAgICAgICAgIG1UcmFja2JhbGwudHJhY2soVmVjdG9yMmkoZS0+cG9zKCkueCgpLCBlLT5wb3MoKS55KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gc3RhbmRhcmQgYXBwcm9hY2ggbWFwcGluZyB0aGUgeCBhbmQgeSBkaXNwbGFjZW1lbnRzIGFzIHJvdGF0aW9ucwotICAgICAgICAgICAgICAvLyBhcm91bmQgdGhlIGNhbWVyYSdzIFggYW5kIFkgYXhlcy4KLSAgICAgICAgICAgICAgUXVhdGVybmlvbmYgcSA9IEFuZ2xlQXhpc2YoIGR4Kk1fUEksIFZlY3RvcjNmOjpVbml0WSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQW5nbGVBeGlzZigtZHkqTV9QSSwgVmVjdG9yM2Y6OlVuaXRYKCkpOwotICAgICAgICAgICAgICBpZiAobUN1cnJlbnRUcmFja2luZ01vZGU9PVRNX0xPQ0FMX1JPVEFURSkKLSAgICAgICAgICAgICAgICBtQ2FtZXJhLmxvY2FsUm90YXRlKHEpOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbUNhbWVyYS5yb3RhdGVBcm91bmRUYXJnZXQocSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRNX1pPT00gOgotICAgICAgICAgICAgbUNhbWVyYS56b29tKGR5KjEwMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRNX0ZMWV9aIDoKLSAgICAgICAgICAgIG1DYW1lcmEubG9jYWxUcmFuc2xhdGUoVmVjdG9yM2YoMCwgMCwgLWR5KjIwMCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBUTV9GTFlfUEFOIDoKLSAgICAgICAgICAgIG1DYW1lcmEubG9jYWxUcmFuc2xhdGUoVmVjdG9yM2YoZHgqMjAwLCBkeSoyMDAsIDApKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZUdMKCk7CisgICAgLy8gc3BlZWR1cCB0aGUgdHJhbnNmb3JtYXRpb25zCisgICAgaWYgKGUtPm1vZGlmaWVycygpICYgUXQ6OlNoaWZ0TW9kaWZpZXIpIHsKKyAgICAgIGR4ICo9IDEwLjsKKyAgICAgIGR5ICo9IDEwLjsKICAgICB9CiAKLSAgICBtTW91c2VDb29yZHMgPSBWZWN0b3IyaShlLT5wb3MoKS54KCksIGUtPnBvcygpLnkoKSk7CisgICAgc3dpdGNoIChtQ3VycmVudFRyYWNraW5nTW9kZSkgeworICAgICAgY2FzZSBUTV9ST1RBVEVfQVJPVU5EOgorICAgICAgY2FzZSBUTV9MT0NBTF9ST1RBVEU6CisgICAgICAgIGlmIChtUm90YXRpb25Nb2RlID09IFJvdGF0aW9uU3RhYmxlKSB7CisgICAgICAgICAgLy8gdXNlIHRoZSBzdGFibGUgdHJhY2tiYWxsIGltcGxlbWVudGF0aW9uIG1hcHBpbmcKKyAgICAgICAgICAvLyB0aGUgMkQgY29vcmRpbmF0ZXMgdG8gM0QgcG9pbnRzIG9uIGEgc3BoZXJlLgorICAgICAgICAgIG1UcmFja2JhbGwudHJhY2soVmVjdG9yMmkoZS0+cG9zKCkueCgpLCBlLT5wb3MoKS55KCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBzdGFuZGFyZCBhcHByb2FjaCBtYXBwaW5nIHRoZSB4IGFuZCB5IGRpc3BsYWNlbWVudHMgYXMgcm90YXRpb25zCisgICAgICAgICAgLy8gYXJvdW5kIHRoZSBjYW1lcmEncyBYIGFuZCBZIGF4ZXMuCisgICAgICAgICAgUXVhdGVybmlvbmYgcSA9IEFuZ2xlQXhpc2YoZHggKiBNX1BJLCBWZWN0b3IzZjo6VW5pdFkoKSkgKiBBbmdsZUF4aXNmKC1keSAqIE1fUEksIFZlY3RvcjNmOjpVbml0WCgpKTsKKyAgICAgICAgICBpZiAobUN1cnJlbnRUcmFja2luZ01vZGUgPT0gVE1fTE9DQUxfUk9UQVRFKQorICAgICAgICAgICAgbUNhbWVyYS5sb2NhbFJvdGF0ZShxKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtQ2FtZXJhLnJvdGF0ZUFyb3VuZFRhcmdldChxKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVE1fWk9PTToKKyAgICAgICAgbUNhbWVyYS56b29tKGR5ICogMTAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRNX0ZMWV9aOgorICAgICAgICBtQ2FtZXJhLmxvY2FsVHJhbnNsYXRlKFZlY3RvcjNmKDAsIDAsIC1keSAqIDIwMCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVE1fRkxZX1BBTjoKKyAgICAgICAgbUNhbWVyYS5sb2NhbFRyYW5zbGF0ZShWZWN0b3IzZihkeCAqIDIwMCwgZHkgKiAyMDAsIDApKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB1cGRhdGVHTCgpOworICB9CisKKyAgbU1vdXNlQ29vcmRzID0gVmVjdG9yMmkoZS0+cG9zKCkueCgpLCBlLT5wb3MoKS55KCkpOwogfQogCi12b2lkIFJlbmRlcmluZ1dpZGdldDo6cGFpbnRHTCgpCi17Cit2b2lkIFJlbmRlcmluZ1dpZGdldDo6cGFpbnRHTCgpIHsKICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CiAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOwotICBnbFBvbHlnb25Nb2RlKEdMX0ZST05UX0FORF9CQUNLLEdMX0ZJTEwpOworICBnbFBvbHlnb25Nb2RlKEdMX0ZST05UX0FORF9CQUNLLCBHTF9GSUxMKTsKICAgZ2xEaXNhYmxlKEdMX0NPTE9SX01BVEVSSUFMKTsKICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKICAgZ2xEaXNhYmxlKEdMX0FMUEhBX1RFU1QpOwpAQCAtNDc0LDggKzQyMiw3IEBACiAgIGRyYXdTY2VuZSgpOwogfQogCi12b2lkIFJlbmRlcmluZ1dpZGdldDo6aW5pdGlhbGl6ZUdMKCkKLXsKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0Ojppbml0aWFsaXplR0woKSB7CiAgIGdsQ2xlYXJDb2xvcigxLiwgMS4sIDEuLCAwLik7CiAgIGdsTGlnaHRNb2RlbGkoR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSLCAxKTsKICAgZ2xEZXB0aE1hc2soR0xfVFJVRSk7CkBAIC00ODcsMzAgKzQzNCwxNiBAQAogICBtSW5pdEZyYW1lLnBvc2l0aW9uID0gbUNhbWVyYS52aWV3TWF0cml4KCkudHJhbnNsYXRpb24oKTsKIH0KIAotdm9pZCBSZW5kZXJpbmdXaWRnZXQ6OnJlc2l6ZUdMKGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLSAgICBtQ2FtZXJhLnNldFZpZXdwb3J0KHdpZHRoLGhlaWdodCk7Ci19Cit2b2lkIFJlbmRlcmluZ1dpZGdldDo6cmVzaXplR0woaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7IG1DYW1lcmEuc2V0Vmlld3BvcnQod2lkdGgsIGhlaWdodCk7IH0KIAotdm9pZCBSZW5kZXJpbmdXaWRnZXQ6OnNldE5hdk1vZGUoaW50IG0pCi17Ci0gIG1OYXZNb2RlID0gTmF2TW9kZShtKTsKLX0KK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjpzZXROYXZNb2RlKGludCBtKSB7IG1OYXZNb2RlID0gTmF2TW9kZShtKTsgfQogCi12b2lkIFJlbmRlcmluZ1dpZGdldDo6c2V0TGVycE1vZGUoaW50IG0pCi17Ci0gIG1MZXJwTW9kZSA9IExlcnBNb2RlKG0pOwotfQordm9pZCBSZW5kZXJpbmdXaWRnZXQ6OnNldExlcnBNb2RlKGludCBtKSB7IG1MZXJwTW9kZSA9IExlcnBNb2RlKG0pOyB9CiAKLXZvaWQgUmVuZGVyaW5nV2lkZ2V0OjpzZXRSb3RhdGlvbk1vZGUoaW50IG0pCi17Ci0gIG1Sb3RhdGlvbk1vZGUgPSBSb3RhdGlvbk1vZGUobSk7Ci19Cit2b2lkIFJlbmRlcmluZ1dpZGdldDo6c2V0Um90YXRpb25Nb2RlKGludCBtKSB7IG1Sb3RhdGlvbk1vZGUgPSBSb3RhdGlvbk1vZGUobSk7IH0KIAotdm9pZCBSZW5kZXJpbmdXaWRnZXQ6OnJlc2V0Q2FtZXJhKCkKLXsKLSAgaWYgKG1BbmltYXRlKQotICAgIHN0b3BBbmltYXRpb24oKTsKK3ZvaWQgUmVuZGVyaW5nV2lkZ2V0OjpyZXNldENhbWVyYSgpIHsKKyAgaWYgKG1BbmltYXRlKSBzdG9wQW5pbWF0aW9uKCk7CiAgIG1fdGltZWxpbmUuY2xlYXIoKTsKICAgRnJhbWUgYXV4MCA9IG1DYW1lcmEuZnJhbWUoKTsKICAgYXV4MC5vcmllbnRhdGlvbiA9IGF1eDAub3JpZW50YXRpb24uaW52ZXJzZSgpOwpAQCAtNTI1LDEzICs0NTgsMTMgQEAKICAgYXV4MS5vcmllbnRhdGlvbiA9IGF1eDEub3JpZW50YXRpb24uaW52ZXJzZSgpOwogICBhdXgxLnBvc2l0aW9uID0gbUNhbWVyYS52aWV3TWF0cml4KCkudHJhbnNsYXRpb24oKTsKICAgZmxvYXQgZHVyYXRpb24gPSBhdXgwLm9yaWVudGF0aW9uLmFuZ3VsYXJEaXN0YW5jZShhdXgxLm9yaWVudGF0aW9uKSAqIDAuOTsKLSAgaWYgKGR1cmF0aW9uPDAuMSkgZHVyYXRpb24gPSAwLjE7CisgIGlmIChkdXJhdGlvbiA8IDAuMSkgZHVyYXRpb24gPSAwLjE7CiAKICAgLy8gcHV0IHRoZSBjYW1lcmEgYXQgdGhhdCB0aW1lIHN0ZXA6Ci0gIGF1eDEgPSBhdXgwLmxlcnAoZHVyYXRpb24vMixtSW5pdEZyYW1lKTsKKyAgYXV4MSA9IGF1eDAubGVycChkdXJhdGlvbiAvIDIsIG1Jbml0RnJhbWUpOwogICAvLyBhbmQgbWFrZSBpdCBsb29rIGF0IHRoZSB0YXJnZXQgYWdhaW4KICAgYXV4MS5vcmllbnRhdGlvbiA9IGF1eDEub3JpZW50YXRpb24uaW52ZXJzZSgpOwotICBhdXgxLnBvc2l0aW9uID0gLSAoYXV4MS5vcmllbnRhdGlvbiAqIGF1eDEucG9zaXRpb24pOworICBhdXgxLnBvc2l0aW9uID0gLShhdXgxLm9yaWVudGF0aW9uICogYXV4MS5wb3NpdGlvbik7CiAgIG1DYW1lcmEuc2V0RnJhbWUoYXV4MSk7CiAgIG1DYW1lcmEuc2V0VGFyZ2V0KFZlY3RvcjNmOjpaZXJvKCkpOwogCkBAIC01NDQsMTIgKzQ3NywxMSBAQAogICBtX2FscGhhID0gMDsKICAgYW5pbWF0ZSgpOwogICBjb25uZWN0KCZtX3RpbWVyLCBTSUdOQUwodGltZW91dCgpKSwgdGhpcywgU0xPVChhbmltYXRlKCkpKTsKLSAgbV90aW1lci5zdGFydCgxMDAwLzMwKTsKKyAgbV90aW1lci5zdGFydCgxMDAwIC8gMzApOwogICBtQW5pbWF0ZSA9IHRydWU7CiB9CiAKLVFXaWRnZXQqIFJlbmRlcmluZ1dpZGdldDo6Y3JlYXRlTmF2aWdhdGlvbkNvbnRyb2xXaWRnZXQoKQoteworUVdpZGdldCogUmVuZGVyaW5nV2lkZ2V0OjpjcmVhdGVOYXZpZ2F0aW9uQ29udHJvbFdpZGdldCgpIHsKICAgUVdpZGdldCogcGFuZWwgPSBuZXcgUVdpZGdldCgpOwogICBRVkJveExheW91dCogbGF5b3V0ID0gbmV3IFFWQm94TGF5b3V0KCk7CiAKQEAgLTU5MSw3ICs1MjMsOCBAQAogICAgIGJ1dCA9IG5ldyBRUmFkaW9CdXR0b24oInN0YW5kYXJkIHJvdGF0aW9uIik7CiAgICAgZ3JvdXAtPmFkZEJ1dHRvbihidXQsIFJvdGF0aW9uU3RhbmRhcmQpOwogICAgIGJveExheW91dC0+YWRkV2lkZ2V0KGJ1dCk7Ci0gICAgYnV0LT5zZXRUb29sVGlwKCJzdGFuZGFyZCBhcHByb2FjaCBtYXBwaW5nIHRoZSB4IGFuZCB5IGRpc3BsYWNlbWVudHNcbmFzIHJvdGF0aW9ucyBhcm91bmQgdGhlIGNhbWVyYSdzIFggYW5kIFkgYXhlcyIpOworICAgIGJ1dC0+c2V0VG9vbFRpcCgKKyAgICAgICAgInN0YW5kYXJkIGFwcHJvYWNoIG1hcHBpbmcgdGhlIHggYW5kIHkgZGlzcGxhY2VtZW50c1xuYXMgcm90YXRpb25zIGFyb3VuZCB0aGUgY2FtZXJhJ3MgWCBhbmQgWSBheGVzIik7CiAgICAgZ3JvdXAtPmJ1dHRvbihtUm90YXRpb25Nb2RlKS0+c2V0Q2hlY2tlZCh0cnVlKTsKICAgICBjb25uZWN0KGdyb3VwLCBTSUdOQUwoYnV0dG9uQ2xpY2tlZChpbnQpKSwgdGhpcywgU0xPVChzZXRSb3RhdGlvbk1vZGUoaW50KSkpOwogICAgIGJveC0+c2V0TGF5b3V0KGJveExheW91dCk7CkBAIC02MTYsMTMgKzU0OSwxMiBAQAogICAgIGJveC0+c2V0TGF5b3V0KGJveExheW91dCk7CiAgICAgbGF5b3V0LT5hZGRXaWRnZXQoYm94KTsKICAgfQotICBsYXlvdXQtPmFkZEl0ZW0obmV3IFFTcGFjZXJJdGVtKDAsMCxRU2l6ZVBvbGljeTo6TWluaW11bSxRU2l6ZVBvbGljeTo6RXhwYW5kaW5nKSk7CisgIGxheW91dC0+YWRkSXRlbShuZXcgUVNwYWNlckl0ZW0oMCwgMCwgUVNpemVQb2xpY3k6Ok1pbmltdW0sIFFTaXplUG9saWN5OjpFeHBhbmRpbmcpKTsKICAgcGFuZWwtPnNldExheW91dChsYXlvdXQpOwogICByZXR1cm4gcGFuZWw7CiB9CiAKLVF1YXRlcm5pb25EZW1vOjpRdWF0ZXJuaW9uRGVtbygpCi17CitRdWF0ZXJuaW9uRGVtbzo6UXVhdGVybmlvbkRlbW8oKSB7CiAgIG1SZW5kZXJpbmdXaWRnZXQgPSBuZXcgUmVuZGVyaW5nV2lkZ2V0KCk7CiAgIHNldENlbnRyYWxXaWRnZXQobVJlbmRlcmluZ1dpZGdldCk7CiAKQEAgLTYzMiw4ICs1NjQsNyBAQAogICBwYW5lbC0+c2V0V2lkZ2V0KG1SZW5kZXJpbmdXaWRnZXQtPmNyZWF0ZU5hdmlnYXRpb25Db250cm9sV2lkZ2V0KCkpOwogfQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoteworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewogICBzdGQ6OmNvdXQgPDwgIk5hdmlnYXRpb246XG4iOwogICBzdGQ6OmNvdXQgPDwgIiAgbGVmdCBidXR0b246ICAgICAgICAgICByb3RhdGUgYXJvdW5kIHRoZSB0YXJnZXRcbiI7CiAgIHN0ZDo6Y291dCA8PCAiICBtaWRkbGUgYnV0dG9uOiAgICAgICAgIHpvb21cbiI7CkBAIC02NDcsMTAgKzU3OCw5IEBACiAKICAgUUFwcGxpY2F0aW9uIGFwcChhcmdjLCBhcmd2KTsKICAgUXVhdGVybmlvbkRlbW8gZGVtbzsKLSAgZGVtby5yZXNpemUoNjAwLDUwMCk7CisgIGRlbW8ucmVzaXplKDYwMCwgNTAwKTsKICAgZGVtby5zaG93KCk7CiAgIHJldHVybiBhcHAuZXhlYygpOwogfQogCiAjaW5jbHVkZSAicXVhdGVybmlvbl9kZW1vLm1vYyIKLQpkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL3F1YXRlcm5pb25fZGVtby5oIGIvZGVtb3Mvb3BlbmdsL3F1YXRlcm5pb25fZGVtby5oCmluZGV4IGRiZmY0NmMuLjVlYjRmY2UgMTAwNjQ0Ci0tLSBhL2RlbW9zL29wZW5nbC9xdWF0ZXJuaW9uX2RlbW8uaAorKysgYi9kZW1vcy9vcGVuZ2wvcXVhdGVybmlvbl9kZW1vLmgKQEAgLTE5LDk2ICsxOSw4MiBAQAogI2luY2x1ZGUgPFF0T3BlbkdML1FHTFdpZGdldD4KICNpbmNsdWRlIDxRdEd1aS9RTWFpbldpbmRvdz4KIAotY2xhc3MgUmVuZGVyaW5nV2lkZ2V0IDogcHVibGljIFFHTFdpZGdldAoteworY2xhc3MgUmVuZGVyaW5nV2lkZ2V0IDogcHVibGljIFFHTFdpZGdldCB7CiAgIFFfT0JKRUNUCiAKLSAgICB0eXBlZGVmIHN0ZDo6bWFwPGZsb2F0LEZyYW1lPiBUaW1lTGluZTsKLSAgICBUaW1lTGluZSBtX3RpbWVsaW5lOwotICAgIEZyYW1lIGxlcnBGcmFtZShmbG9hdCB0KTsKKyAgdHlwZWRlZiBzdGQ6Om1hcDxmbG9hdCwgRnJhbWU+IFRpbWVMaW5lOworICBUaW1lTGluZSBtX3RpbWVsaW5lOworICBGcmFtZSBsZXJwRnJhbWUoZmxvYXQgdCk7CiAKLSAgICBGcmFtZSBtSW5pdEZyYW1lOwotICAgIGJvb2wgbUFuaW1hdGU7Ci0gICAgZmxvYXQgbV9hbHBoYTsKKyAgRnJhbWUgbUluaXRGcmFtZTsKKyAgYm9vbCBtQW5pbWF0ZTsKKyAgZmxvYXQgbV9hbHBoYTsKIAotICAgIGVudW0gVHJhY2tNb2RlIHsKLSAgICAgIFRNX05PX1RSQUNLPTAsIFRNX1JPVEFURV9BUk9VTkQsIFRNX1pPT00sCi0gICAgICBUTV9MT0NBTF9ST1RBVEUsIFRNX0ZMWV9aLCBUTV9GTFlfUEFOCi0gICAgfTsKKyAgZW51bSBUcmFja01vZGUgeyBUTV9OT19UUkFDSyA9IDAsIFRNX1JPVEFURV9BUk9VTkQsIFRNX1pPT00sIFRNX0xPQ0FMX1JPVEFURSwgVE1fRkxZX1osIFRNX0ZMWV9QQU4gfTsKIAotICAgIGVudW0gTmF2TW9kZSB7Ci0gICAgICBOYXZUdXJuQXJvdW5kLAotICAgICAgTmF2Rmx5Ci0gICAgfTsKKyAgZW51bSBOYXZNb2RlIHsgTmF2VHVybkFyb3VuZCwgTmF2Rmx5IH07CiAKLSAgICBlbnVtIExlcnBNb2RlIHsKLSAgICAgIExlcnBRdWF0ZXJuaW9uLAotICAgICAgTGVycEV1bGVyQW5nbGVzCi0gICAgfTsKKyAgZW51bSBMZXJwTW9kZSB7IExlcnBRdWF0ZXJuaW9uLCBMZXJwRXVsZXJBbmdsZXMgfTsKIAotICAgIGVudW0gUm90YXRpb25Nb2RlIHsKLSAgICAgIFJvdGF0aW9uU3RhYmxlLAotICAgICAgUm90YXRpb25TdGFuZGFyZAotICAgIH07CisgIGVudW0gUm90YXRpb25Nb2RlIHsgUm90YXRpb25TdGFibGUsIFJvdGF0aW9uU3RhbmRhcmQgfTsKIAotICAgIENhbWVyYSBtQ2FtZXJhOwotICAgIFRyYWNrTW9kZSBtQ3VycmVudFRyYWNraW5nTW9kZTsKLSAgICBOYXZNb2RlIG1OYXZNb2RlOwotICAgIExlcnBNb2RlIG1MZXJwTW9kZTsKLSAgICBSb3RhdGlvbk1vZGUgbVJvdGF0aW9uTW9kZTsKLSAgICBWZWN0b3IyaSBtTW91c2VDb29yZHM7Ci0gICAgVHJhY2tiYWxsIG1UcmFja2JhbGw7CisgIENhbWVyYSBtQ2FtZXJhOworICBUcmFja01vZGUgbUN1cnJlbnRUcmFja2luZ01vZGU7CisgIE5hdk1vZGUgbU5hdk1vZGU7CisgIExlcnBNb2RlIG1MZXJwTW9kZTsKKyAgUm90YXRpb25Nb2RlIG1Sb3RhdGlvbk1vZGU7CisgIFZlY3RvcjJpIG1Nb3VzZUNvb3JkczsKKyAgVHJhY2tiYWxsIG1UcmFja2JhbGw7CiAKLSAgICBRVGltZXIgbV90aW1lcjsKKyAgUVRpbWVyIG1fdGltZXI7CiAKLSAgICB2b2lkIHNldHVwQ2FtZXJhKCk7CisgIHZvaWQgc2V0dXBDYW1lcmEoKTsKIAotICAgIHN0ZDo6dmVjdG9yPFZlY3RvcjNmPiBtVmVydGljZXM7Ci0gICAgc3RkOjp2ZWN0b3I8VmVjdG9yM2Y+IG1Ob3JtYWxzOwotICAgIHN0ZDo6dmVjdG9yPGludD4gbUluZGljZXM7CisgIHN0ZDo6dmVjdG9yPFZlY3RvcjNmPiBtVmVydGljZXM7CisgIHN0ZDo6dmVjdG9yPFZlY3RvcjNmPiBtTm9ybWFsczsKKyAgc3RkOjp2ZWN0b3I8aW50PiBtSW5kaWNlczsKIAotICBwcm90ZWN0ZWQgc2xvdHM6CisgcHJvdGVjdGVkIHNsb3RzOgogCi0gICAgdmlydHVhbCB2b2lkIGFuaW1hdGUodm9pZCk7Ci0gICAgdmlydHVhbCB2b2lkIGRyYXdTY2VuZSh2b2lkKTsKKyAgdmlydHVhbCB2b2lkIGFuaW1hdGUodm9pZCk7CisgIHZpcnR1YWwgdm9pZCBkcmF3U2NlbmUodm9pZCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgZ3JhYkZyYW1lKHZvaWQpOwotICAgIHZpcnR1YWwgdm9pZCBzdG9wQW5pbWF0aW9uKCk7CisgIHZpcnR1YWwgdm9pZCBncmFiRnJhbWUodm9pZCk7CisgIHZpcnR1YWwgdm9pZCBzdG9wQW5pbWF0aW9uKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0TmF2TW9kZShpbnQpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRMZXJwTW9kZShpbnQpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRSb3RhdGlvbk1vZGUoaW50KTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXRDYW1lcmEoKTsKKyAgdmlydHVhbCB2b2lkIHNldE5hdk1vZGUoaW50KTsKKyAgdmlydHVhbCB2b2lkIHNldExlcnBNb2RlKGludCk7CisgIHZpcnR1YWwgdm9pZCBzZXRSb3RhdGlvbk1vZGUoaW50KTsKKyAgdmlydHVhbCB2b2lkIHJlc2V0Q2FtZXJhKCk7CiAKLSAgcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVHTCgpOworICB2aXJ0dWFsIHZvaWQgcmVzaXplR0woaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgdmlydHVhbCB2b2lkIHBhaW50R0woKTsKIAotICAgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplR0woKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzaXplR0woaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRHTCgpOwotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB2aXJ0dWFsIHZvaWQgbW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50ICogZSk7Ci0gICAgdmlydHVhbCB2b2lkIG1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50ICogZSk7Ci0gICAgdmlydHVhbCB2b2lkIG1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50ICogZSk7Ci0gICAgdmlydHVhbCB2b2lkIGtleVByZXNzRXZlbnQoUUtleUV2ZW50ICogZSk7Ci0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZpcnR1YWwgdm9pZCBtb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQqIGUpOworICB2aXJ0dWFsIHZvaWQgbW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQqIGUpOworICB2aXJ0dWFsIHZvaWQgbW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQqIGUpOworICB2aXJ0dWFsIHZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQqIGUpOworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgcHVibGljOiAKLSAgICBFSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXCi0gICAgCi0gICAgUmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgflJlbmRlcmluZ1dpZGdldCgpIHsgfQorIHB1YmxpYzoKKyAgRUlHRU5fTUFLRV9BTElHTkVEX09QRVJBVE9SX05FVwogCi0gICAgUVdpZGdldCogY3JlYXRlTmF2aWdhdGlvbkNvbnRyb2xXaWRnZXQoKTsKKyAgUmVuZGVyaW5nV2lkZ2V0KCk7CisgIH5SZW5kZXJpbmdXaWRnZXQoKSB7fQorCisgIFFXaWRnZXQqIGNyZWF0ZU5hdmlnYXRpb25Db250cm9sV2lkZ2V0KCk7CiB9OwogCi1jbGFzcyBRdWF0ZXJuaW9uRGVtbyA6IHB1YmxpYyBRTWFpbldpbmRvdwoteworY2xhc3MgUXVhdGVybmlvbkRlbW8gOiBwdWJsaWMgUU1haW5XaW5kb3cgewogICBRX09CSkVDVAotICBwdWJsaWM6Ci0gICAgUXVhdGVybmlvbkRlbW8oKTsKLSAgcHJvdGVjdGVkOgotICAgIFJlbmRlcmluZ1dpZGdldCogbVJlbmRlcmluZ1dpZGdldDsKKyBwdWJsaWM6CisgIFF1YXRlcm5pb25EZW1vKCk7CisKKyBwcm90ZWN0ZWQ6CisgIFJlbmRlcmluZ1dpZGdldCogbVJlbmRlcmluZ1dpZGdldDsKIH07CiAKLSNlbmRpZiAvLyBFSUdFTl9RVUFURVJOSU9OX0RFTU9fSAorI2VuZGlmICAvLyBFSUdFTl9RVUFURVJOSU9OX0RFTU9fSApkaWZmIC0tZ2l0IGEvZGVtb3Mvb3BlbmdsL3RyYWNrYmFsbC5jcHAgYi9kZW1vcy9vcGVuZ2wvdHJhY2tiYWxsLmNwcAppbmRleCA3YzJkYThlLi5iMTJkMDliIDEwMDY0NAotLS0gYS9kZW1vcy9vcGVuZ2wvdHJhY2tiYWxsLmNwcAorKysgYi9kZW1vcy9vcGVuZ2wvdHJhY2tiYWxsLmNwcApAQCAtMTIsMjEgKzEyLDE3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBUcmFja2JhbGw6OnRyYWNrKGNvbnN0IFZlY3RvcjJpJiBwb2ludDJEKQotewotICBpZiAobXBDYW1lcmE9PTApCi0gICAgcmV0dXJuOwordm9pZCBUcmFja2JhbGw6OnRyYWNrKGNvbnN0IFZlY3RvcjJpJiBwb2ludDJEKSB7CisgIGlmIChtcENhbWVyYSA9PSAwKSByZXR1cm47CiAgIFZlY3RvcjNmIG5ld1BvaW50M0Q7CiAgIGJvb2wgbmV3UG9pbnRPayA9IG1hcFRvU3BoZXJlKHBvaW50MkQsIG5ld1BvaW50M0QpOwogCi0gIGlmIChtTGFzdFBvaW50T2sgJiYgbmV3UG9pbnRPaykKLSAgeworICBpZiAobUxhc3RQb2ludE9rICYmIG5ld1BvaW50T2spIHsKICAgICBWZWN0b3IzZiBheGlzID0gbUxhc3RQb2ludDNELmNyb3NzKG5ld1BvaW50M0QpLm5vcm1hbGl6ZWQoKTsKICAgICBmbG9hdCBjb3NfYW5nbGUgPSBtTGFzdFBvaW50M0QuZG90KG5ld1BvaW50M0QpOwotICAgIGlmICggc3RkOjphYnMoY29zX2FuZ2xlKSA8IDEuMCApCi0gICAgeworICAgIGlmIChzdGQ6OmFicyhjb3NfYW5nbGUpIDwgMS4wKSB7CiAgICAgICBmbG9hdCBhbmdsZSA9IDIuICogYWNvcyhjb3NfYW5nbGUpOwotICAgICAgaWYgKG1Nb2RlPT1Bcm91bmQpCisgICAgICBpZiAobU1vZGUgPT0gQXJvdW5kKQogICAgICAgICBtcENhbWVyYS0+cm90YXRlQXJvdW5kVGFyZ2V0KFF1YXRlcm5pb25mKEFuZ2xlQXhpc2YoYW5nbGUsIGF4aXMpKSk7CiAgICAgICBlbHNlCiAgICAgICAgIG1wQ2FtZXJhLT5sb2NhbFJvdGF0ZShRdWF0ZXJuaW9uZihBbmdsZUF4aXNmKC1hbmdsZSwgYXhpcykpKTsKQEAgLTM3LDIzICszMywxOSBAQAogICBtTGFzdFBvaW50T2sgPSBuZXdQb2ludE9rOwogfQogCi1ib29sIFRyYWNrYmFsbDo6bWFwVG9TcGhlcmUoY29uc3QgVmVjdG9yMmkmIHAyLCBWZWN0b3IzZiYgdjMpCi17Ci0gIGlmICgocDIueCgpID49IDApICYmIChwMi54KCkgPD0gaW50KG1wQ2FtZXJhLT52cFdpZHRoKCkpKSAmJgotICAgICAgKHAyLnkoKSA+PSAwKSAmJiAocDIueSgpIDw9IGludChtcENhbWVyYS0+dnBIZWlnaHQoKSkpICkKLSAgewotICAgIGRvdWJsZSB4ICA9IChkb3VibGUpKHAyLngoKSAtIDAuNSptcENhbWVyYS0+dnBXaWR0aCgpKSAgLyAoZG91YmxlKW1wQ2FtZXJhLT52cFdpZHRoKCk7Ci0gICAgZG91YmxlIHkgID0gKGRvdWJsZSkoMC41Km1wQ2FtZXJhLT52cEhlaWdodCgpIC0gcDIueSgpKSAvIChkb3VibGUpbXBDYW1lcmEtPnZwSGVpZ2h0KCk7Ci0gICAgZG91YmxlIHNpbnggICAgICAgICA9IHNpbihNX1BJICogeCAqIDAuNSk7Ci0gICAgZG91YmxlIHNpbnkgICAgICAgICA9IHNpbihNX1BJICogeSAqIDAuNSk7Ci0gICAgZG91YmxlIHNpbngyc2lueTIgICA9IHNpbnggKiBzaW54ICsgc2lueSAqIHNpbnk7Citib29sIFRyYWNrYmFsbDo6bWFwVG9TcGhlcmUoY29uc3QgVmVjdG9yMmkmIHAyLCBWZWN0b3IzZiYgdjMpIHsKKyAgaWYgKChwMi54KCkgPj0gMCkgJiYgKHAyLngoKSA8PSBpbnQobXBDYW1lcmEtPnZwV2lkdGgoKSkpICYmIChwMi55KCkgPj0gMCkgJiYgKHAyLnkoKSA8PSBpbnQobXBDYW1lcmEtPnZwSGVpZ2h0KCkpKSkgeworICAgIGRvdWJsZSB4ID0gKGRvdWJsZSkocDIueCgpIC0gMC41ICogbXBDYW1lcmEtPnZwV2lkdGgoKSkgLyAoZG91YmxlKW1wQ2FtZXJhLT52cFdpZHRoKCk7CisgICAgZG91YmxlIHkgPSAoZG91YmxlKSgwLjUgKiBtcENhbWVyYS0+dnBIZWlnaHQoKSAtIHAyLnkoKSkgLyAoZG91YmxlKW1wQ2FtZXJhLT52cEhlaWdodCgpOworICAgIGRvdWJsZSBzaW54ID0gc2luKE1fUEkgKiB4ICogMC41KTsKKyAgICBkb3VibGUgc2lueSA9IHNpbihNX1BJICogeSAqIDAuNSk7CisgICAgZG91YmxlIHNpbngyc2lueTIgPSBzaW54ICogc2lueCArIHNpbnkgKiBzaW55OwogCiAgICAgdjMueCgpID0gc2lueDsKICAgICB2My55KCkgPSBzaW55OwogICAgIHYzLnooKSA9IHNpbngyc2lueTIgPCAxLjAgPyBzcXJ0KDEuMCAtIHNpbngyc2lueTIpIDogMC4wOwogCiAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgZWxzZQorICB9IGVsc2UKICAgICByZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9kZW1vcy9vcGVuZ2wvdHJhY2tiYWxsLmggYi9kZW1vcy9vcGVuZ2wvdHJhY2tiYWxsLmgKaW5kZXggMWVhODQyZi4uZGRhMjM1ZiAxMDA2NDQKLS0tIGEvZGVtb3Mvb3BlbmdsL3RyYWNrYmFsbC5oCisrKyBiL2RlbW9zL29wZW5nbC90cmFja2JhbGwuaApAQCAtMTQsMjkgKzE0LDI4IEBACiAKIGNsYXNzIENhbWVyYTsKIAotY2xhc3MgVHJhY2tiYWxsCi17Ci0gIHB1YmxpYzoKK2NsYXNzIFRyYWNrYmFsbCB7CisgcHVibGljOgorICBlbnVtIE1vZGUgeyBBcm91bmQsIExvY2FsIH07CiAKLSAgICBlbnVtIE1vZGUge0Fyb3VuZCwgTG9jYWx9OworICBUcmFja2JhbGwoKSA6IG1wQ2FtZXJhKDApIHt9CiAKLSAgICBUcmFja2JhbGwoKSA6IG1wQ2FtZXJhKDApIHt9CisgIHZvaWQgc3RhcnQoTW9kZSBtID0gQXJvdW5kKSB7CisgICAgbU1vZGUgPSBtOworICAgIG1MYXN0UG9pbnRPayA9IGZhbHNlOworICB9CiAKLSAgICB2b2lkIHN0YXJ0KE1vZGUgbSA9IEFyb3VuZCkgeyBtTW9kZSA9IG07IG1MYXN0UG9pbnRPayA9IGZhbHNlOyB9CisgIHZvaWQgc2V0Q2FtZXJhKENhbWVyYSogcENhbSkgeyBtcENhbWVyYSA9IHBDYW07IH0KIAotICAgIHZvaWQgc2V0Q2FtZXJhKENhbWVyYSogcENhbSkgeyBtcENhbWVyYSA9IHBDYW07IH0KKyAgdm9pZCB0cmFjayhjb25zdCBFaWdlbjo6VmVjdG9yMmkmIG5ld1BvaW50MkQpOwogCi0gICAgdm9pZCB0cmFjayhjb25zdCBFaWdlbjo6VmVjdG9yMmkmIG5ld1BvaW50MkQpOworIHByb3RlY3RlZDoKKyAgYm9vbCBtYXBUb1NwaGVyZShjb25zdCBFaWdlbjo6VmVjdG9yMmkmIHAyLCBFaWdlbjo6VmVjdG9yM2YmIHYzKTsKIAotICBwcm90ZWN0ZWQ6Ci0KLSAgICBib29sIG1hcFRvU3BoZXJlKCBjb25zdCBFaWdlbjo6VmVjdG9yMmkmIHAyLCBFaWdlbjo6VmVjdG9yM2YmIHYzKTsKLQotICAgIENhbWVyYSogbXBDYW1lcmE7Ci0gICAgRWlnZW46OlZlY3RvcjNmIG1MYXN0UG9pbnQzRDsKLSAgICBNb2RlIG1Nb2RlOwotICAgIGJvb2wgbUxhc3RQb2ludE9rOwotCisgIENhbWVyYSogbXBDYW1lcmE7CisgIEVpZ2VuOjpWZWN0b3IzZiBtTGFzdFBvaW50M0Q7CisgIE1vZGUgbU1vZGU7CisgIGJvb2wgbUxhc3RQb2ludE9rOwogfTsKIAotI2VuZGlmIC8vIEVJR0VOX1RSQUNLQkFMTF9ICisjZW5kaWYgIC8vIEVJR0VOX1RSQUNLQkFMTF9ICmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvQ3VzdG9taXppbmdFaWdlbl9Jbmhlcml0YW5jZS5jcHAgYi9kb2MvZXhhbXBsZXMvQ3VzdG9taXppbmdFaWdlbl9Jbmhlcml0YW5jZS5jcHAKaW5kZXggNDhkZjY0ZS4uMjZlMWUzYyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL0N1c3RvbWl6aW5nRWlnZW5fSW5oZXJpdGFuY2UuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9DdXN0b21pemluZ0VpZ2VuX0luaGVyaXRhbmNlLmNwcApAQCAtMSwyOCArMSwyMyBAQAogI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLWNsYXNzIE15VmVjdG9yVHlwZSA6IHB1YmxpYyBFaWdlbjo6VmVjdG9yWGQKLXsKLXB1YmxpYzoKLSAgICBNeVZlY3RvclR5cGUodm9pZCk6RWlnZW46OlZlY3RvclhkKCkge30KK2NsYXNzIE15VmVjdG9yVHlwZSA6IHB1YmxpYyBFaWdlbjo6VmVjdG9yWGQgeworIHB1YmxpYzoKKyAgTXlWZWN0b3JUeXBlKHZvaWQpIDogRWlnZW46OlZlY3RvclhkKCkge30KIAotICAgIC8vIFRoaXMgY29uc3RydWN0b3IgYWxsb3dzIHlvdSB0byBjb25zdHJ1Y3QgTXlWZWN0b3JUeXBlIGZyb20gRWlnZW4gZXhwcmVzc2lvbnMKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+Ci0gICAgTXlWZWN0b3JUeXBlKGNvbnN0IEVpZ2VuOjpNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKQotICAgICAgICA6IEVpZ2VuOjpWZWN0b3JYZChvdGhlcikKLSAgICB7IH0KKyAgLy8gVGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgeW91IHRvIGNvbnN0cnVjdCBNeVZlY3RvclR5cGUgZnJvbSBFaWdlbiBleHByZXNzaW9ucworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgorICBNeVZlY3RvclR5cGUoY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8T3RoZXJEZXJpdmVkPiYgb3RoZXIpIDogRWlnZW46OlZlY3RvclhkKG90aGVyKSB7fQogCi0gICAgLy8gVGhpcyBtZXRob2QgYWxsb3dzIHlvdSB0byBhc3NpZ24gRWlnZW4gZXhwcmVzc2lvbnMgdG8gTXlWZWN0b3JUeXBlCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJEZXJpdmVkPgotICAgIE15VmVjdG9yVHlwZSYgb3BlcmF0b3I9KGNvbnN0IEVpZ2VuOjpNYXRyaXhCYXNlIDxPdGhlckRlcml2ZWQ+JiBvdGhlcikKLSAgICB7Ci0gICAgICAgIHRoaXMtPkVpZ2VuOjpWZWN0b3JYZDo6b3BlcmF0b3I9KG90aGVyKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KKyAgLy8gVGhpcyBtZXRob2QgYWxsb3dzIHlvdSB0byBhc3NpZ24gRWlnZW4gZXhwcmVzc2lvbnMgdG8gTXlWZWN0b3JUeXBlCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlckRlcml2ZWQ+CisgIE15VmVjdG9yVHlwZSYgb3BlcmF0b3I9KGNvbnN0IEVpZ2VuOjpNYXRyaXhCYXNlPE90aGVyRGVyaXZlZD4mIG90aGVyKSB7CisgICAgdGhpcy0+RWlnZW46OlZlY3RvclhkOjpvcGVyYXRvcj0ob3RoZXIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQogfTsKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIE15VmVjdG9yVHlwZSB2ID0gTXlWZWN0b3JUeXBlOjpPbmVzKDQpOwogICB2KDIpICs9IDEwOwogICB2ID0gMiAqIHY7CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvQ3dpc2VfZXJmLmNwcCBiL2RvYy9leGFtcGxlcy9Dd2lzZV9lcmYuY3BwCmluZGV4IDlkZGM1N2QuLjU5OGMxOGMgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9Dd2lzZV9lcmYuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9Dd2lzZV9lcmYuY3BwCkBAIC0xLDggKzEsNyBAQAogI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BlY2lhbEZ1bmN0aW9ucz4KICNpbmNsdWRlIDxpb3N0cmVhbT4KLWludCBtYWluKCkKLXsKLSAgRWlnZW46OkFycmF5NGQgdigtMC41LDIsMCwtNyk7CitpbnQgbWFpbigpIHsKKyAgRWlnZW46OkFycmF5NGQgdigtMC41LCAyLCAwLCAtNyk7CiAgIHN0ZDo6Y291dCA8PCB2LmVyZigpIDw8IHN0ZDo6ZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9Dd2lzZV9lcmZjLmNwcCBiL2RvYy9leGFtcGxlcy9Dd2lzZV9lcmZjLmNwcAppbmRleCA0Yjc5MDJjLi45OGIwYjc1IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvQ3dpc2VfZXJmYy5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL0N3aXNlX2VyZmMuY3BwCkBAIC0xLDggKzEsNyBAQAogI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BlY2lhbEZ1bmN0aW9ucz4KICNpbmNsdWRlIDxpb3N0cmVhbT4KLWludCBtYWluKCkKLXsKLSAgRWlnZW46OkFycmF5NGQgdigtMC41LDIsMCwtNyk7CitpbnQgbWFpbigpIHsKKyAgRWlnZW46OkFycmF5NGQgdigtMC41LCAyLCAwLCAtNyk7CiAgIHN0ZDo6Y291dCA8PCB2LmVyZmMoKSA8PCBzdGQ6OmVuZGw7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvQ3dpc2VfbGdhbW1hLmNwcCBiL2RvYy9leGFtcGxlcy9Dd2lzZV9sZ2FtbWEuY3BwCmluZGV4IGYzYzlmZTYuLjEwODY2ZDggMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9Dd2lzZV9sZ2FtbWEuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9Dd2lzZV9sZ2FtbWEuY3BwCkBAIC0xLDggKzEsNyBAQAogI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BlY2lhbEZ1bmN0aW9ucz4KICNpbmNsdWRlIDxpb3N0cmVhbT4KLWludCBtYWluKCkKLXsKLSAgRWlnZW46OkFycmF5NGQgdigwLjUsMTAsMCwtMSk7CitpbnQgbWFpbigpIHsKKyAgRWlnZW46OkFycmF5NGQgdigwLjUsIDEwLCAwLCAtMSk7CiAgIHN0ZDo6Y291dCA8PCB2LmxnYW1tYSgpIDw8IHN0ZDo6ZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfbWlkZGxlQ29sc19pbnQuY3BwIGIvZG9jL2V4YW1wbGVzL0RlbnNlQmFzZV9taWRkbGVDb2xzX2ludC5jcHAKaW5kZXggZDA1YTU1Mi4uY2I3ZGFjZSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL0RlbnNlQmFzZV9taWRkbGVDb2xzX2ludC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL0RlbnNlQmFzZV9taWRkbGVDb2xzX2ludC5jcHAKQEAgLTEsMTIgKzEsMTEgQEAKICNpbmNsdWRlIDxFaWdlbi9Db3JlPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi1pbnQgbWFpbigpCi17Ci0gICAgaW50IGNvbnN0IE4gPSA1OwotICAgIEVpZ2VuOjpNYXRyaXhYaSBBKE4sTik7Ci0gICAgQS5zZXRSYW5kb20oKTsKLSAgICBzdGQ6OmNvdXQgPDwgIkEgPVxuIiA8PCBBIDw8ICdcbicgPDwgc3RkOjplbmRsOwotICAgIHN0ZDo6Y291dCA8PCAiQSgxLi4zLDopID1cbiIgPDwgQS5taWRkbGVDb2xzKDEsMykgPDwgc3RkOjplbmRsOwotICAgIHJldHVybiAwOworaW50IG1haW4oKSB7CisgIGludCBjb25zdCBOID0gNTsKKyAgRWlnZW46Ok1hdHJpeFhpIEEoTiwgTik7CisgIEEuc2V0UmFuZG9tKCk7CisgIHN0ZDo6Y291dCA8PCAiQSA9XG4iIDw8IEEgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiQSgxLi4zLDopID1cbiIgPDwgQS5taWRkbGVDb2xzKDEsIDMpIDw8IHN0ZDo6ZW5kbDsKKyAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX21pZGRsZVJvd3NfaW50LmNwcCBiL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfbWlkZGxlUm93c19pbnQuY3BwCmluZGV4IDg2NTE2MjkuLjZhMjU1MDAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfbWlkZGxlUm93c19pbnQuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfbWlkZGxlUm93c19pbnQuY3BwCkBAIC0xLDEyICsxLDExIEBACiAjaW5jbHVkZSA8RWlnZW4vQ29yZT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAotaW50IG1haW4oKQotewotICAgIGludCBjb25zdCBOID0gNTsKLSAgICBFaWdlbjo6TWF0cml4WGkgQShOLE4pOwotICAgIEEuc2V0UmFuZG9tKCk7Ci0gICAgc3RkOjpjb3V0IDw8ICJBID1cbiIgPDwgQSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKLSAgICBzdGQ6OmNvdXQgPDwgIkEoMi4uMyw6KSA9XG4iIDw8IEEubWlkZGxlUm93cygyLDIpIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gMDsKK2ludCBtYWluKCkgeworICBpbnQgY29uc3QgTiA9IDU7CisgIEVpZ2VuOjpNYXRyaXhYaSBBKE4sIE4pOworICBBLnNldFJhbmRvbSgpOworICBzdGQ6OmNvdXQgPDwgIkEgPVxuIiA8PCBBIDw8ICdcbicgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIkEoMi4uMyw6KSA9XG4iIDw8IEEubWlkZGxlUm93cygyLCAyKSA8PCBzdGQ6OmVuZGw7CisgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL0RlbnNlQmFzZV90ZW1wbGF0ZV9pbnRfbWlkZGxlQ29scy5jcHAgYi9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVDb2xzLmNwcAppbmRleCBjYWVmYWJmLi41MmMwMzJjIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVDb2xzLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVDb2xzLmNwcApAQCAtMSwxMiArMSwxMSBAQAogI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLWludCBtYWluKCkKLXsKLSAgICBpbnQgY29uc3QgTiA9IDU7Ci0gICAgRWlnZW46Ok1hdHJpeFhpIEEoTixOKTsKLSAgICBBLnNldFJhbmRvbSgpOwotICAgIHN0ZDo6Y291dCA8PCAiQSA9XG4iIDw8IEEgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7Ci0gICAgc3RkOjpjb3V0IDw8ICJBKDosMS4uMykgPVxuIiA8PCBBLm1pZGRsZUNvbHM8Mz4oMSkgPDwgc3RkOjplbmRsOwotICAgIHJldHVybiAwOworaW50IG1haW4oKSB7CisgIGludCBjb25zdCBOID0gNTsKKyAgRWlnZW46Ok1hdHJpeFhpIEEoTiwgTik7CisgIEEuc2V0UmFuZG9tKCk7CisgIHN0ZDo6Y291dCA8PCAiQSA9XG4iIDw8IEEgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiQSg6LDEuLjMpID1cbiIgPDwgQS5taWRkbGVDb2xzPDM+KDEpIDw8IHN0ZDo6ZW5kbDsKKyAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvRGVuc2VCYXNlX3RlbXBsYXRlX2ludF9taWRkbGVSb3dzLmNwcCBiL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfdGVtcGxhdGVfaW50X21pZGRsZVJvd3MuY3BwCmluZGV4IGVkNWIyOTUuLjRkYjVlNzAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfdGVtcGxhdGVfaW50X21pZGRsZVJvd3MuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9EZW5zZUJhc2VfdGVtcGxhdGVfaW50X21pZGRsZVJvd3MuY3BwCkBAIC0xLDEyICsxLDExIEBACiAjaW5jbHVkZSA8RWlnZW4vQ29yZT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAotaW50IG1haW4oKQotewotICAgIGludCBjb25zdCBOID0gNTsKLSAgICBFaWdlbjo6TWF0cml4WGkgQShOLE4pOwotICAgIEEuc2V0UmFuZG9tKCk7Ci0gICAgc3RkOjpjb3V0IDw8ICJBID1cbiIgPDwgQSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKLSAgICBzdGQ6OmNvdXQgPDwgIkEoMS4uMyw6KSA9XG4iIDw8IEEubWlkZGxlUm93czwzPigxKSA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIDA7CitpbnQgbWFpbigpIHsKKyAgaW50IGNvbnN0IE4gPSA1OworICBFaWdlbjo6TWF0cml4WGkgQShOLCBOKTsKKyAgQS5zZXRSYW5kb20oKTsKKyAgc3RkOjpjb3V0IDw8ICJBID1cbiIgPDwgQSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJBKDEuLjMsOikgPVxuIiA8PCBBLm1pZGRsZVJvd3M8Mz4oMSkgPDwgc3RkOjplbmRsOworICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9RdWlja1N0YXJ0X2V4YW1wbGUuY3BwIGIvZG9jL2V4YW1wbGVzL1F1aWNrU3RhcnRfZXhhbXBsZS5jcHAKaW5kZXggNzIzOGMwYy4uMTAzZGRkNSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1F1aWNrU3RhcnRfZXhhbXBsZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1F1aWNrU3RhcnRfZXhhbXBsZS5jcHAKQEAgLTMsMTIgKzMsMTEgQEAKIAogdXNpbmcgRWlnZW46Ok1hdHJpeFhkOwogCi1pbnQgbWFpbigpCi17Ci0gIE1hdHJpeFhkIG0oMiwyKTsKLSAgbSgwLDApID0gMzsKLSAgbSgxLDApID0gMi41OwotICBtKDAsMSkgPSAtMTsKLSAgbSgxLDEpID0gbSgxLDApICsgbSgwLDEpOworaW50IG1haW4oKSB7CisgIE1hdHJpeFhkIG0oMiwgMik7CisgIG0oMCwgMCkgPSAzOworICBtKDEsIDApID0gMi41OworICBtKDAsIDEpID0gLTE7CisgIG0oMSwgMSkgPSBtKDEsIDApICsgbSgwLCAxKTsKICAgc3RkOjpjb3V0IDw8IG0gPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1F1aWNrU3RhcnRfZXhhbXBsZTJfZHluYW1pYy5jcHAgYi9kb2MvZXhhbXBsZXMvUXVpY2tTdGFydF9leGFtcGxlMl9keW5hbWljLmNwcAppbmRleCBiYzhkMzI2Li5jN2U3YzMyIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvUXVpY2tTdGFydF9leGFtcGxlMl9keW5hbWljLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvUXVpY2tTdGFydF9leGFtcGxlMl9keW5hbWljLmNwcApAQCAtNCwxMCArNCw5IEBACiB1c2luZyBFaWdlbjo6TWF0cml4WGQ7CiB1c2luZyBFaWdlbjo6VmVjdG9yWGQ7CiAKLWludCBtYWluKCkKLXsKLSAgTWF0cml4WGQgbSA9IE1hdHJpeFhkOjpSYW5kb20oMywzKTsKLSAgbSA9IChtICsgTWF0cml4WGQ6OkNvbnN0YW50KDMsMywxLjIpKSAqIDUwOworaW50IG1haW4oKSB7CisgIE1hdHJpeFhkIG0gPSBNYXRyaXhYZDo6UmFuZG9tKDMsIDMpOworICBtID0gKG0gKyBNYXRyaXhYZDo6Q29uc3RhbnQoMywgMywgMS4yKSkgKiA1MDsKICAgc3RkOjpjb3V0IDw8ICJtID0iIDw8IHN0ZDo6ZW5kbCA8PCBtIDw8IHN0ZDo6ZW5kbDsKICAgVmVjdG9yWGQgdigzKTsKICAgdiA8PCAxLCAyLCAzOwpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1F1aWNrU3RhcnRfZXhhbXBsZTJfZml4ZWQuY3BwIGIvZG9jL2V4YW1wbGVzL1F1aWNrU3RhcnRfZXhhbXBsZTJfZml4ZWQuY3BwCmluZGV4IGFmNmY5YTkuLmU2NDNhNDcgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9RdWlja1N0YXJ0X2V4YW1wbGUyX2ZpeGVkLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvUXVpY2tTdGFydF9leGFtcGxlMl9maXhlZC5jcHAKQEAgLTQsMTIgKzQsMTEgQEAKIHVzaW5nIEVpZ2VuOjpNYXRyaXgzZDsKIHVzaW5nIEVpZ2VuOjpWZWN0b3IzZDsKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIE1hdHJpeDNkIG0gPSBNYXRyaXgzZDo6UmFuZG9tKCk7CiAgIG0gPSAobSArIE1hdHJpeDNkOjpDb25zdGFudCgxLjIpKSAqIDUwOwogICBzdGQ6OmNvdXQgPDwgIm0gPSIgPDwgc3RkOjplbmRsIDw8IG0gPDwgc3RkOjplbmRsOwotICBWZWN0b3IzZCB2KDEsMiwzKTsKLSAgCisgIFZlY3RvcjNkIHYoMSwgMiwgMyk7CisKICAgc3RkOjpjb3V0IDw8ICJtICogdiA9IiA8PCBzdGQ6OmVuZGwgPDwgbSAqIHYgPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1RlbXBsYXRlS2V5d29yZF9mbGV4aWJsZS5jcHAgYi9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX2ZsZXhpYmxlLmNwcAppbmRleCBlZmU0NThiLi4wOTkxOWEzIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX2ZsZXhpYmxlLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX2ZsZXhpYmxlLmNwcApAQCAtMiwxOSArMiwxNyBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyPgotdm9pZCBjb3B5VXBwZXJUcmlhbmd1bGFyUGFydChFaWdlbjo6TWF0cml4QmFzZTxEZXJpdmVkMT4mIGRzdCwgY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8RGVyaXZlZDI+JiBzcmMpCi17Cit2b2lkIGNvcHlVcHBlclRyaWFuZ3VsYXJQYXJ0KEVpZ2VuOjpNYXRyaXhCYXNlPERlcml2ZWQxPiYgZHN0LCBjb25zdCBFaWdlbjo6TWF0cml4QmFzZTxEZXJpdmVkMj4mIHNyYykgewogICAvKiBOb3RlIHRoZSAndGVtcGxhdGUnIGtleXdvcmRzIGluIHRoZSBmb2xsb3dpbmcgbGluZSEgKi8KICAgZHN0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVcHBlcj4oKSA9IHNyYy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCk7CiB9CiAKLWludCBtYWluKCkKLXsKLSAgRWlnZW46Ok1hdHJpeFhpIG0xID0gRWlnZW46Ok1hdHJpeFhpOjpPbmVzKDUsNSk7Ci0gIEVpZ2VuOjpNYXRyaXhYaSBtMiA9IEVpZ2VuOjpNYXRyaXhYaTo6UmFuZG9tKDQsNCk7CitpbnQgbWFpbigpIHsKKyAgRWlnZW46Ok1hdHJpeFhpIG0xID0gRWlnZW46Ok1hdHJpeFhpOjpPbmVzKDUsIDUpOworICBFaWdlbjo6TWF0cml4WGkgbTIgPSBFaWdlbjo6TWF0cml4WGk6OlJhbmRvbSg0LCA0KTsKICAgc3RkOjpjb3V0IDw8ICJtMiBiZWZvcmUgY29weToiIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8IG0yIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7Ci0gIGNvcHlVcHBlclRyaWFuZ3VsYXJQYXJ0KG0yLCBtMS50b3BMZWZ0Q29ybmVyKDQsNCkpOworICBjb3B5VXBwZXJUcmlhbmd1bGFyUGFydChtMiwgbTEudG9wTGVmdENvcm5lcig0LCA0KSk7CiAgIHN0ZDo6Y291dCA8PCAibTIgYWZ0ZXIgY29weToiIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8IG0yIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX3NpbXBsZS5jcHAgYi9kb2MvZXhhbXBsZXMvVGVtcGxhdGVLZXl3b3JkX3NpbXBsZS5jcHAKaW5kZXggNmI5NDZhZC4uNDkwMjk4OCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1RlbXBsYXRlS2V5d29yZF9zaW1wbGUuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9UZW1wbGF0ZUtleXdvcmRfc2ltcGxlLmNwcApAQCAtMywxNSArMywxMyBAQAogCiB1c2luZyBFaWdlbjo6TWF0cml4WGY7CiAKLXZvaWQgY29weVVwcGVyVHJpYW5ndWxhclBhcnQoTWF0cml4WGYmIGRzdCwgY29uc3QgTWF0cml4WGYmIHNyYykKLXsKK3ZvaWQgY29weVVwcGVyVHJpYW5ndWxhclBhcnQoTWF0cml4WGYmIGRzdCwgY29uc3QgTWF0cml4WGYmIHNyYykgewogICBkc3QudHJpYW5ndWxhclZpZXc8RWlnZW46OlVwcGVyPigpID0gc3JjLnRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVcHBlcj4oKTsKIH0KIAotaW50IG1haW4oKQotewotICBNYXRyaXhYZiBtMSA9IE1hdHJpeFhmOjpPbmVzKDQsNCk7Ci0gIE1hdHJpeFhmIG0yID0gTWF0cml4WGY6OlJhbmRvbSg0LDQpOworaW50IG1haW4oKSB7CisgIE1hdHJpeFhmIG0xID0gTWF0cml4WGY6Ok9uZXMoNCwgNCk7CisgIE1hdHJpeFhmIG0yID0gTWF0cml4WGY6OlJhbmRvbSg0LCA0KTsKICAgc3RkOjpjb3V0IDw8ICJtMiBiZWZvcmUgY29weToiIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8IG0yIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CiAgIGNvcHlVcHBlclRyaWFuZ3VsYXJQYXJ0KG0yLCBtMSk7CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxJbnBsYWNlTFUuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsSW5wbGFjZUxVLmNwcAppbmRleCA3MmJlYWQyLi4wNmY3ZTUzIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxJbnBsYWNlTFUuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbElucGxhY2VMVS5jcHAKQEAgLTYsOSArNiw4IEBACiAvLyBbaW5pdF0KICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KIAotaW50IG1haW4oKQotewotICBFaWdlbjo6TWF0cml4WGQgQSgyLDIpOworaW50IG1haW4oKSB7CisgIEVpZ2VuOjpNYXRyaXhYZCBBKDIsIDIpOwogICBBIDw8IDIsIC0xLCAxLCAzOwogICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdGhlIGlucHV0IG1hdHJpeCBBIGJlZm9yZSBkZWNvbXBvc2l0aW9uOlxuIiA8PCBBIDw8ICJcbiI7CiAgIHN0ZDo6Y291dCA8PCAiW2luaXRdXG4iOwpAQCAtMjMsOCArMjIsMTAgQEAKICAgc3RkOjpjb3V0IDw8ICJbbWF0cml4TFVdXG4iOwogCiAgIHN0ZDo6Y291dCA8PCAiW3NvbHZlXVxuIjsKLSAgRWlnZW46Ok1hdHJpeFhkIEEwKDIsMik7IEEwIDw8IDIsIC0xLCAxLCAzOwotICBFaWdlbjo6VmVjdG9yWGQgYigyKTsgICAgYiA8PCAxLCAyOworICBFaWdlbjo6TWF0cml4WGQgQTAoMiwgMik7CisgIEEwIDw8IDIsIC0xLCAxLCAzOworICBFaWdlbjo6VmVjdG9yWGQgYigyKTsKKyAgYiA8PCAxLCAyOwogICBFaWdlbjo6VmVjdG9yWGQgeCA9IGx1LnNvbHZlKGIpOwogICBzdGQ6OmNvdXQgPDwgIlJlc2lkdWFsOiAiIDw8IChBMCAqIHggLSBiKS5ub3JtKCkgPDwgIlxuIjsKICAgc3RkOjpjb3V0IDw8ICJbc29sdmVdXG4iOwpAQCAtMzYsMTUgKzM3LDE1IEBACiAgIHN0ZDo6Y291dCA8PCAiW21vZGlmeUFdXG4iOwogCiAgIHN0ZDo6Y291dCA8PCAiW3JlY29tcHV0ZV1cbiI7Ci0gIEEwID0gQTsgLy8gc2F2ZSBBCisgIEEwID0gQTsgIC8vIHNhdmUgQQogICBsdS5jb21wdXRlKEEpOwogICB4ID0gbHUuc29sdmUoYik7CiAgIHN0ZDo6Y291dCA8PCAiUmVzaWR1YWw6ICIgPDwgKEEwICogeCAtIGIpLm5vcm0oKSA8PCAiXG4iOwogICBzdGQ6OmNvdXQgPDwgIltyZWNvbXB1dGVdXG4iOwogCiAgIHN0ZDo6Y291dCA8PCAiW3JlY29tcHV0ZV9iaXMwXVxuIjsKLSAgRWlnZW46Ok1hdHJpeFhkIEExKDIsMik7Ci0gIEExIDw8IDUsLTIsMyw0OworICBFaWdlbjo6TWF0cml4WGQgQTEoMiwgMik7CisgIEExIDw8IDUsIC0yLCAzLCA0OwogICBsdS5jb21wdXRlKEExKTsKICAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHRoZSBpbnB1dCBtYXRyaXggQTEgYWZ0ZXIgZGVjb21wb3NpdGlvbjpcbiIgPDwgQTEgPDwgIlxuIjsKICAgc3RkOjpjb3V0IDw8ICJbcmVjb21wdXRlX2JpczBdXG4iOwpAQCAtNTMsNSArNTQsNCBAQAogICB4ID0gbHUuc29sdmUoYik7CiAgIHN0ZDo6Y291dCA8PCAiUmVzaWR1YWw6ICIgPDwgKEExICogeCAtIGIpLm5vcm0oKSA8PCAiXG4iOwogICBzdGQ6OmNvdXQgPDwgIltyZWNvbXB1dGVfYmlzMV1cbiI7Ci0KIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ0NvbXB1dGVUd2ljZS5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdDb21wdXRlVHdpY2UuY3BwCmluZGV4IGE1NjFmMDguLjQxZmYyMmUgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ0NvbXB1dGVUd2ljZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnQ29tcHV0ZVR3aWNlLmNwcApAQCAtMSwyMCArMSwxOSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgogCi1pbnQgbWFpbigpCi17Ci0gICBFaWdlbjo6TWF0cml4MmYgQSwgYjsKLSAgIEVpZ2VuOjpMTFQ8RWlnZW46Ok1hdHJpeDJmPiBsbHQ7Ci0gICBBIDw8IDIsIC0xLCAtMSwgMzsKLSAgIGIgPDwgMSwgMiwgMywgMTsKLSAgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6XG4iIDw8IEEgPDwgc3RkOjplbmRsOwotICAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHRoZSByaWdodCBoYW5kIHNpZGUgYjpcbiIgPDwgYiA8PCBzdGQ6OmVuZGw7Ci0gICBzdGQ6OmNvdXQgPDwgIkNvbXB1dGluZyBMTFQgZGVjb21wb3NpdGlvbi4uLiIgPDwgc3RkOjplbmRsOwotICAgbGx0LmNvbXB1dGUoQSk7Ci0gICBzdGQ6OmNvdXQgPDwgIlRoZSBzb2x1dGlvbiBpczpcbiIgPDwgbGx0LnNvbHZlKGIpIDw8IHN0ZDo6ZW5kbDsKLSAgIEEoMSwxKSsrOwotICAgc3RkOjpjb3V0IDw8ICJUaGUgbWF0cml4IEEgaXMgbm93OlxuIiA8PCBBIDw8IHN0ZDo6ZW5kbDsKLSAgIHN0ZDo6Y291dCA8PCAiQ29tcHV0aW5nIExMVCBkZWNvbXBvc2l0aW9uLi4uIiA8PCBzdGQ6OmVuZGw7Ci0gICBsbHQuY29tcHV0ZShBKTsKLSAgIHN0ZDo6Y291dCA8PCAiVGhlIHNvbHV0aW9uIGlzIG5vdzpcbiIgPDwgbGx0LnNvbHZlKGIpIDw8IHN0ZDo6ZW5kbDsKK2ludCBtYWluKCkgeworICBFaWdlbjo6TWF0cml4MmYgQSwgYjsKKyAgRWlnZW46OkxMVDxFaWdlbjo6TWF0cml4MmY+IGxsdDsKKyAgQSA8PCAyLCAtMSwgLTEsIDM7CisgIGIgPDwgMSwgMiwgMywgMTsKKyAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggQTpcbiIgPDwgQSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB0aGUgcmlnaHQgaGFuZCBzaWRlIGI6XG4iIDw8IGIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIkNvbXB1dGluZyBMTFQgZGVjb21wb3NpdGlvbi4uLiIgPDwgc3RkOjplbmRsOworICBsbHQuY29tcHV0ZShBKTsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgc29sdXRpb24gaXM6XG4iIDw8IGxsdC5zb2x2ZShiKSA8PCBzdGQ6OmVuZGw7CisgIEEoMSwgMSkrKzsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgbWF0cml4IEEgaXMgbm93OlxuIiA8PCBBIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJDb21wdXRpbmcgTExUIGRlY29tcG9zaXRpb24uLi4iIDw8IHN0ZDo6ZW5kbDsKKyAgbGx0LmNvbXB1dGUoQSk7CisgIHN0ZDo6Y291dCA8PCAiVGhlIHNvbHV0aW9uIGlzIG5vdzpcbiIgPDwgbGx0LnNvbHZlKGIpIDw8IHN0ZDo6ZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ0V4Q29tcHV0ZVNvbHZlRXJyb3IuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnRXhDb21wdXRlU29sdmVFcnJvci5jcHAKaW5kZXggMTk5ZjNmNS4uMjY4YWEzNSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnRXhDb21wdXRlU29sdmVFcnJvci5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnRXhDb21wdXRlU29sdmVFcnJvci5jcHAKQEAgLTMsMTEgKzMsMTAgQEAKIAogdXNpbmcgRWlnZW46Ok1hdHJpeFhkOwogCi1pbnQgbWFpbigpCi17Ci0gICBNYXRyaXhYZCBBID0gTWF0cml4WGQ6OlJhbmRvbSgxMDAsMTAwKTsKLSAgIE1hdHJpeFhkIGIgPSBNYXRyaXhYZDo6UmFuZG9tKDEwMCw1MCk7Ci0gICBNYXRyaXhYZCB4ID0gQS5mdWxsUGl2THUoKS5zb2x2ZShiKTsKLSAgIGRvdWJsZSByZWxhdGl2ZV9lcnJvciA9IChBKnggLSBiKS5ub3JtKCkgLyBiLm5vcm0oKTsgLy8gbm9ybSgpIGlzIEwyIG5vcm0KLSAgIHN0ZDo6Y291dCA8PCAiVGhlIHJlbGF0aXZlIGVycm9yIGlzOlxuIiA8PCByZWxhdGl2ZV9lcnJvciA8PCBzdGQ6OmVuZGw7CitpbnQgbWFpbigpIHsKKyAgTWF0cml4WGQgQSA9IE1hdHJpeFhkOjpSYW5kb20oMTAwLCAxMDApOworICBNYXRyaXhYZCBiID0gTWF0cml4WGQ6OlJhbmRvbSgxMDAsIDUwKTsKKyAgTWF0cml4WGQgeCA9IEEuZnVsbFBpdkx1KCkuc29sdmUoYik7CisgIGRvdWJsZSByZWxhdGl2ZV9lcnJvciA9IChBICogeCAtIGIpLm5vcm0oKSAvIGIubm9ybSgpOyAgLy8gbm9ybSgpIGlzIEwyIG5vcm0KKyAgc3RkOjpjb3V0IDw8ICJUaGUgcmVsYXRpdmUgZXJyb3IgaXM6XG4iIDw8IHJlbGF0aXZlX2Vycm9yIDw8IHN0ZDo6ZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ0V4U29sdmVDb2xQaXZIb3VzZWhvbGRlclFSLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ0V4U29sdmVDb2xQaXZIb3VzZWhvbGRlclFSLmNwcAppbmRleCA1ZWU2YjZhLi43Y2FlZDRhIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeFNvbHZlQ29sUGl2SG91c2Vob2xkZXJRUi5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnRXhTb2x2ZUNvbFBpdkhvdXNlaG9sZGVyUVIuY3BwCkBAIC0xLDE0ICsxLDEzIEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CiAKLWludCBtYWluKCkKLXsKLSAgIEVpZ2VuOjpNYXRyaXgzZiBBOwotICAgRWlnZW46OlZlY3RvcjNmIGI7Ci0gICBBIDw8IDEsMiwzLCAgNCw1LDYsICA3LDgsMTA7Ci0gICBiIDw8IDMsIDMsIDQ7Ci0gICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOlxuIiA8PCBBIDw8IHN0ZDo6ZW5kbDsKLSAgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB0aGUgdmVjdG9yIGI6XG4iIDw8IGIgPDwgc3RkOjplbmRsOwotICAgRWlnZW46OlZlY3RvcjNmIHggPSBBLmNvbFBpdkhvdXNlaG9sZGVyUXIoKS5zb2x2ZShiKTsKLSAgIHN0ZDo6Y291dCA8PCAiVGhlIHNvbHV0aW9uIGlzOlxuIiA8PCB4IDw8IHN0ZDo6ZW5kbDsKK2ludCBtYWluKCkgeworICBFaWdlbjo6TWF0cml4M2YgQTsKKyAgRWlnZW46OlZlY3RvcjNmIGI7CisgIEEgPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgMTA7CisgIGIgPDwgMywgMywgNDsKKyAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggQTpcbiIgPDwgQSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB0aGUgdmVjdG9yIGI6XG4iIDw8IGIgPDwgc3RkOjplbmRsOworICBFaWdlbjo6VmVjdG9yM2YgeCA9IEEuY29sUGl2SG91c2Vob2xkZXJRcigpLnNvbHZlKGIpOworICBzdGQ6OmNvdXQgPDwgIlRoZSBzb2x1dGlvbiBpczpcbiIgPDwgeCA8PCBzdGQ6OmVuZGw7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeFNvbHZlTERMVC5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdFeFNvbHZlTERMVC5jcHAKaW5kZXggODIxODZkNC4uYzExNTU3ZCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnRXhTb2x2ZUxETFQuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ0V4U29sdmVMRExULmNwcApAQCAtMSwxMyArMSwxMiBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgogCi1pbnQgbWFpbigpCi17Ci0gICBFaWdlbjo6TWF0cml4MmYgQSwgYjsKLSAgIEEgPDwgMiwgLTEsIC0xLCAzOwotICAgYiA8PCAxLCAyLCAzLCAxOwotICAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggQTpcbiIgPDwgQSA8PCBzdGQ6OmVuZGw7Ci0gICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdGhlIHJpZ2h0IGhhbmQgc2lkZSBiOlxuIiA8PCBiIDw8IHN0ZDo6ZW5kbDsKLSAgIEVpZ2VuOjpNYXRyaXgyZiB4ID0gQS5sZGx0KCkuc29sdmUoYik7Ci0gICBzdGQ6OmNvdXQgPDwgIlRoZSBzb2x1dGlvbiBpczpcbiIgPDwgeCA8PCBzdGQ6OmVuZGw7CitpbnQgbWFpbigpIHsKKyAgRWlnZW46Ok1hdHJpeDJmIEEsIGI7CisgIEEgPDwgMiwgLTEsIC0xLCAzOworICBiIDw8IDEsIDIsIDMsIDE7CisgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6XG4iIDw8IEEgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdGhlIHJpZ2h0IGhhbmQgc2lkZSBiOlxuIiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgRWlnZW46Ok1hdHJpeDJmIHggPSBBLmxkbHQoKS5zb2x2ZShiKTsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgc29sdXRpb24gaXM6XG4iIDw8IHggPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnSW52ZXJzZURldGVybWluYW50LmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ0ludmVyc2VEZXRlcm1pbmFudC5jcHAKaW5kZXggYjMxYTkyYS4uYzAzZmU1YyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnSW52ZXJzZURldGVybWluYW50LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdJbnZlcnNlRGV0ZXJtaW5hbnQuY3BwCkBAIC0xLDEzICsxLDEwIEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CiAKLWludCBtYWluKCkKLXsKLSAgIEVpZ2VuOjpNYXRyaXgzZiBBOwotICAgQSA8PCAxLCAyLCAxLAotICAgICAgICAyLCAxLCAwLAotICAgICAgICAtMSwgMSwgMjsKLSAgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6XG4iIDw8IEEgPDwgc3RkOjplbmRsOwotICAgc3RkOjpjb3V0IDw8ICJUaGUgZGV0ZXJtaW5hbnQgb2YgQSBpcyAiIDw8IEEuZGV0ZXJtaW5hbnQoKSA8PCBzdGQ6OmVuZGw7Ci0gICBzdGQ6OmNvdXQgPDwgIlRoZSBpbnZlcnNlIG9mIEEgaXM6XG4iIDw8IEEuaW52ZXJzZSgpIDw8IHN0ZDo6ZW5kbDsKK2ludCBtYWluKCkgeworICBFaWdlbjo6TWF0cml4M2YgQTsKKyAgQSA8PCAxLCAyLCAxLCAyLCAxLCAwLCAtMSwgMSwgMjsKKyAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggQTpcbiIgPDwgQSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiVGhlIGRldGVybWluYW50IG9mIEEgaXMgIiA8PCBBLmRldGVybWluYW50KCkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIlRoZSBpbnZlcnNlIG9mIEEgaXM6XG4iIDw8IEEuaW52ZXJzZSgpIDw8IHN0ZDo6ZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ1JhbmtSZXZlYWxpbmcuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnUmFua1JldmVhbGluZy5jcHAKaW5kZXggZmVhNTJhYi4uMWY4OTE0NiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnUmFua1JldmVhbGluZy5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnUmFua1JldmVhbGluZy5jcHAKQEAgLTEsMTcgKzEsMTQgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KIAotaW50IG1haW4oKQotewotICAgRWlnZW46Ok1hdHJpeDNmIEE7Ci0gICBBIDw8IDEsIDIsIDUsCi0gICAgICAgIDIsIDEsIDQsCi0gICAgICAgIDMsIDAsIDM7Ci0gICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOlxuIiA8PCBBIDw8IHN0ZDo6ZW5kbDsKLSAgIEVpZ2VuOjpGdWxsUGl2TFU8RWlnZW46Ok1hdHJpeDNmPiBsdV9kZWNvbXAoQSk7Ci0gICBzdGQ6OmNvdXQgPDwgIlRoZSByYW5rIG9mIEEgaXMgIiA8PCBsdV9kZWNvbXAucmFuaygpIDw8IHN0ZDo6ZW5kbDsKLSAgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyBhIG1hdHJpeCB3aG9zZSBjb2x1bW5zIGZvcm0gYSBiYXNpcyBvZiB0aGUgbnVsbC1zcGFjZSBvZiBBOlxuIgotICAgICAgICA8PCBsdV9kZWNvbXAua2VybmVsKCkgPDwgc3RkOjplbmRsOwotICAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIGEgbWF0cml4IHdob3NlIGNvbHVtbnMgZm9ybSBhIGJhc2lzIG9mIHRoZSBjb2x1bW4tc3BhY2Ugb2YgQTpcbiIKLSAgICAgICAgPDwgbHVfZGVjb21wLmltYWdlKEEpIDw8IHN0ZDo6ZW5kbDsgLy8geWVzLCBoYXZlIHRvIHBhc3MgdGhlIG9yaWdpbmFsIEEKK2ludCBtYWluKCkgeworICBFaWdlbjo6TWF0cml4M2YgQTsKKyAgQSA8PCAxLCAyLCA1LCAyLCAxLCA0LCAzLCAwLCAzOworICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOlxuIiA8PCBBIDw8IHN0ZDo6ZW5kbDsKKyAgRWlnZW46OkZ1bGxQaXZMVTxFaWdlbjo6TWF0cml4M2Y+IGx1X2RlY29tcChBKTsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgcmFuayBvZiBBIGlzICIgPDwgbHVfZGVjb21wLnJhbmsoKSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyBhIG1hdHJpeCB3aG9zZSBjb2x1bW5zIGZvcm0gYSBiYXNpcyBvZiB0aGUgbnVsbC1zcGFjZSBvZiBBOlxuIgorICAgICAgICAgICAgPDwgbHVfZGVjb21wLmtlcm5lbCgpIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIGEgbWF0cml4IHdob3NlIGNvbHVtbnMgZm9ybSBhIGJhc2lzIG9mIHRoZSBjb2x1bW4tc3BhY2Ugb2YgQTpcbiIKKyAgICAgICAgICAgIDw8IGx1X2RlY29tcC5pbWFnZShBKSA8PCBzdGQ6OmVuZGw7ICAvLyB5ZXMsIGhhdmUgdG8gcGFzcyB0aGUgb3JpZ2luYWwgQQogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnU1ZEU29sdmUuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnU1ZEU29sdmUuY3BwCmluZGV4IDIzYWQ0MjIuLjNjZWUyYjQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ1NWRFNvbHZlLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdTVkRTb2x2ZS5jcHAKQEAgLTEsMTIgKzEsMTEgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KIAotaW50IG1haW4oKQotewotICAgRWlnZW46Ok1hdHJpeFhmIEEgPSBFaWdlbjo6TWF0cml4WGY6OlJhbmRvbSgzLCAyKTsKLSAgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6XG4iIDw8IEEgPDwgc3RkOjplbmRsOwotICAgRWlnZW46OlZlY3RvclhmIGIgPSBFaWdlbjo6VmVjdG9yWGY6OlJhbmRvbSgzKTsKLSAgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB0aGUgcmlnaHQgaGFuZCBzaWRlIGI6XG4iIDw8IGIgPDwgc3RkOjplbmRsOwotICAgc3RkOjpjb3V0IDw8ICJUaGUgbGVhc3Qtc3F1YXJlcyBzb2x1dGlvbiBpczpcbiIKLSAgICAgICAgPDwgQS5iZGNTdmQoRWlnZW46OkNvbXB1dGVUaGluVSB8IEVpZ2VuOjpDb21wdXRlVGhpblYpLnNvbHZlKGIpIDw8IHN0ZDo6ZW5kbDsKK2ludCBtYWluKCkgeworICBFaWdlbjo6TWF0cml4WGYgQSA9IEVpZ2VuOjpNYXRyaXhYZjo6UmFuZG9tKDMsIDIpOworICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOlxuIiA8PCBBIDw8IHN0ZDo6ZW5kbDsKKyAgRWlnZW46OlZlY3RvclhmIGIgPSBFaWdlbjo6VmVjdG9yWGY6OlJhbmRvbSgzKTsKKyAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHRoZSByaWdodCBoYW5kIHNpZGUgYjpcbiIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiVGhlIGxlYXN0LXNxdWFyZXMgc29sdXRpb24gaXM6XG4iCisgICAgICAgICAgICA8PCBBLmJkY1N2ZChFaWdlbjo6Q29tcHV0ZVRoaW5VIHwgRWlnZW46OkNvbXB1dGVUaGluVikuc29sdmUoYikgPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnU2VsZkFkam9pbnRFaWdlblNvbHZlci5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdTZWxmQWRqb2ludEVpZ2VuU29sdmVyLmNwcAppbmRleCBmY2YyZjMzLi42ZmFjY2I2IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdTZWxmQWRqb2ludEVpZ2VuU29sdmVyLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdTZWxmQWRqb2ludEVpZ2VuU29sdmVyLmNwcApAQCAtMSwxNSArMSwxNCBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgogCi1pbnQgbWFpbigpCi17Ci0gICBFaWdlbjo6TWF0cml4MmYgQTsKLSAgIEEgPDwgMSwgMiwgMiwgMzsKLSAgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6XG4iIDw8IEEgPDwgc3RkOjplbmRsOwotICAgRWlnZW46OlNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8RWlnZW46Ok1hdHJpeDJmPiBlaWdlbnNvbHZlcihBKTsKLSAgIGlmIChlaWdlbnNvbHZlci5pbmZvKCkgIT0gRWlnZW46OlN1Y2Nlc3MpIGFib3J0KCk7Ci0gICBzdGQ6OmNvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiBBIGFyZTpcbiIgPDwgZWlnZW5zb2x2ZXIuZWlnZW52YWx1ZXMoKSA8PCBzdGQ6OmVuZGw7Ci0gICBzdGQ6OmNvdXQgPDwgIkhlcmUncyBhIG1hdHJpeCB3aG9zZSBjb2x1bW5zIGFyZSBlaWdlbnZlY3RvcnMgb2YgQSBcbiIKLSAgICAgICAgPDwgImNvcnJlc3BvbmRpbmcgdG8gdGhlc2UgZWlnZW52YWx1ZXM6XG4iCi0gICAgICAgIDw8IGVpZ2Vuc29sdmVyLmVpZ2VudmVjdG9ycygpIDw8IHN0ZDo6ZW5kbDsKK2ludCBtYWluKCkgeworICBFaWdlbjo6TWF0cml4MmYgQTsKKyAgQSA8PCAxLCAyLCAyLCAzOworICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOlxuIiA8PCBBIDw8IHN0ZDo6ZW5kbDsKKyAgRWlnZW46OlNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8RWlnZW46Ok1hdHJpeDJmPiBlaWdlbnNvbHZlcihBKTsKKyAgaWYgKGVpZ2Vuc29sdmVyLmluZm8oKSAhPSBFaWdlbjo6U3VjY2VzcykgYWJvcnQoKTsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgQSBhcmU6XG4iIDw8IGVpZ2Vuc29sdmVyLmVpZ2VudmFsdWVzKCkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIkhlcmUncyBhIG1hdHJpeCB3aG9zZSBjb2x1bW5zIGFyZSBlaWdlbnZlY3RvcnMgb2YgQSBcbiIKKyAgICAgICAgICAgIDw8ICJjb3JyZXNwb25kaW5nIHRvIHRoZXNlIGVpZ2VudmFsdWVzOlxuIgorICAgICAgICAgICAgPDwgZWlnZW5zb2x2ZXIuZWlnZW52ZWN0b3JzKCkgPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnU2V0VGhyZXNob2xkLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbExpbkFsZ1NldFRocmVzaG9sZC5jcHAKaW5kZXggZTEzMzVlNy4uOTcyNTFmOCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsTGluQWxnU2V0VGhyZXNob2xkLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxMaW5BbGdTZXRUaHJlc2hvbGQuY3BwCkBAIC0xLDEzICsxLDExIEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CiAKLWludCBtYWluKCkKLXsKLSAgIEVpZ2VuOjpNYXRyaXgyZCBBOwotICAgQSA8PCAyLCAxLAotICAgICAgICAyLCAwLjk5OTk5OTk5OTk7Ci0gICBFaWdlbjo6RnVsbFBpdkxVPEVpZ2VuOjpNYXRyaXgyZD4gbHUoQSk7Ci0gICBzdGQ6OmNvdXQgPDwgIkJ5IGRlZmF1bHQsIHRoZSByYW5rIG9mIEEgaXMgZm91bmQgdG8gYmUgIiA8PCBsdS5yYW5rKCkgPDwgc3RkOjplbmRsOwotICAgbHUuc2V0VGhyZXNob2xkKDFlLTUpOwotICAgc3RkOjpjb3V0IDw8ICJXaXRoIHRocmVzaG9sZCAxZS01LCB0aGUgcmFuayBvZiBBIGlzIGZvdW5kIHRvIGJlICIgPDwgbHUucmFuaygpIDw8IHN0ZDo6ZW5kbDsKK2ludCBtYWluKCkgeworICBFaWdlbjo6TWF0cml4MmQgQTsKKyAgQSA8PCAyLCAxLCAyLCAwLjk5OTk5OTk5OTk7CisgIEVpZ2VuOjpGdWxsUGl2TFU8RWlnZW46Ok1hdHJpeDJkPiBsdShBKTsKKyAgc3RkOjpjb3V0IDw8ICJCeSBkZWZhdWx0LCB0aGUgcmFuayBvZiBBIGlzIGZvdW5kIHRvIGJlICIgPDwgbHUucmFuaygpIDw8IHN0ZDo6ZW5kbDsKKyAgbHUuc2V0VGhyZXNob2xkKDFlLTUpOworICBzdGQ6OmNvdXQgPDwgIldpdGggdGhyZXNob2xkIDFlLTUsIHRoZSByYW5rIG9mIEEgaXMgZm91bmQgdG8gYmUgIiA8PCBsdS5yYW5rKCkgPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfYWNjZXNzb3JzLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2FjY2Vzc29ycy5jcHAKaW5kZXggMGRiNTJhMy4uNWU5MWRlYiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfYWNjZXNzb3JzLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19hY2Nlc3NvcnMuY3BwCkBAIC0xLDIxICsxLDIxIEBACiAjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLWludCBtYWluKCkKLXsKLSAgRWlnZW46OkFycmF5WFhmICBtKDIsMik7Ci0gIAoraW50IG1haW4oKSB7CisgIEVpZ2VuOjpBcnJheVhYZiBtKDIsIDIpOworCiAgIC8vIGFzc2lnbiBzb21lIHZhbHVlcyBjb2VmZmljaWVudCBieSBjb2VmZmljaWVudAotICBtKDAsMCkgPSAxLjA7IG0oMCwxKSA9IDIuMDsKLSAgbSgxLDApID0gMy4wOyBtKDEsMSkgPSBtKDAsMSkgKyBtKDEsMCk7Ci0gIAorICBtKDAsIDApID0gMS4wOworICBtKDAsIDEpID0gMi4wOworICBtKDEsIDApID0gMy4wOworICBtKDEsIDEpID0gbSgwLCAxKSArIG0oMSwgMCk7CisKICAgLy8gcHJpbnQgdmFsdWVzIHRvIHN0YW5kYXJkIG91dHB1dAogICBzdGQ6OmNvdXQgPDwgbSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOwotIAorCiAgIC8vIHVzaW5nIHRoZSBjb21tYS1pbml0aWFsaXplciBpcyBhbHNvIGFsbG93ZWQKLSAgbSA8PCAxLjAsMi4wLAotICAgICAgIDMuMCw0LjA7Ci0gICAgIAorICBtIDw8IDEuMCwgMi4wLCAzLjAsIDQuMDsKKwogICAvLyBwcmludCB2YWx1ZXMgdG8gc3RhbmRhcmQgb3V0cHV0CiAgIHN0ZDo6Y291dCA8PCBtIDw8IHN0ZDo6ZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2FkZGl0aW9uLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2FkZGl0aW9uLmNwcAppbmRleCA0YTQwN2E3Li5lOWE4ZjNlIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19hZGRpdGlvbi5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfYWRkaXRpb24uY3BwCkBAIC0xLDE3ICsxLDEyIEBACiAjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLWludCBtYWluKCkKLXsKLSAgRWlnZW46OkFycmF5WFhmIGEoMywzKTsKLSAgRWlnZW46OkFycmF5WFhmIGIoMywzKTsKLSAgYSA8PCAxLDIsMywKLSAgICAgICA0LDUsNiwKLSAgICAgICA3LDgsOTsKLSAgYiA8PCAxLDIsMywKLSAgICAgICAxLDIsMywKLSAgICAgICAxLDIsMzsKLSAgICAgICAKK2ludCBtYWluKCkgeworICBFaWdlbjo6QXJyYXlYWGYgYSgzLCAzKTsKKyAgRWlnZW46OkFycmF5WFhmIGIoMywgMyk7CisgIGEgPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOTsKKyAgYiA8PCAxLCAyLCAzLCAxLCAyLCAzLCAxLCAyLCAzOworCiAgIC8vIEFkZGluZyB0d28gYXJyYXlzCiAgIHN0ZDo6Y291dCA8PCAiYSArIGIgPSAiIDw8IHN0ZDo6ZW5kbCA8PCBhICsgYiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19jd2lzZV9vdGhlci5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19jd2lzZV9vdGhlci5jcHAKaW5kZXggMTI0ODNmMy4uY2JkMzIzOCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfY3dpc2Vfb3RoZXIuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2N3aXNlX290aGVyLmNwcApAQCAtMSwxNiArMSwxMSBAQAogI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgRWlnZW46OkFycmF5WGYgYSA9IEVpZ2VuOjpBcnJheVhmOjpSYW5kb20oNSk7CiAgIGEgKj0gMjsKLSAgc3RkOjpjb3V0IDw8ICJhID0iIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICAgPDwgYSA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCAiYS5hYnMoKSA9IiA8PCBzdGQ6OmVuZGwKLSAgICAgICAgICAgIDw8IGEuYWJzKCkgPDwgc3RkOjplbmRsOwotICBzdGQ6OmNvdXQgPDwgImEuYWJzKCkuc3FydCgpID0iIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICAgPDwgYS5hYnMoKS5zcXJ0KCkgPDwgc3RkOjplbmRsOwotICBzdGQ6OmNvdXQgPDwgImEubWluKGEuYWJzKCkuc3FydCgpKSA9IiA8PCBzdGQ6OmVuZGwKLSAgICAgICAgICAgIDw8IGEubWluKGEuYWJzKCkuc3FydCgpKSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiYSA9IiA8PCBzdGQ6OmVuZGwgPDwgYSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiYS5hYnMoKSA9IiA8PCBzdGQ6OmVuZGwgPDwgYS5hYnMoKSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiYS5hYnMoKS5zcXJ0KCkgPSIgPDwgc3RkOjplbmRsIDw8IGEuYWJzKCkuc3FydCgpIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJhLm1pbihhLmFicygpLnNxcnQoKSkgPSIgPDwgc3RkOjplbmRsIDw8IGEubWluKGEuYWJzKCkuc3FydCgpKSA8PCBzdGQ6OmVuZGw7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19pbnRlcm9wLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2ludGVyb3AuY3BwCmluZGV4IGM5YTgzNTIuLjliMDJmMmEgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2ludGVyb3AuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2ludGVyb3AuY3BwCkBAIC0zLDE3ICszLDE0IEBACiAKIHVzaW5nIEVpZ2VuOjpNYXRyaXhYZjsKIAotaW50IG1haW4oKQotewotICBNYXRyaXhYZiBtKDIsMik7Ci0gIE1hdHJpeFhmIG4oMiwyKTsKLSAgTWF0cml4WGYgcmVzdWx0KDIsMik7CitpbnQgbWFpbigpIHsKKyAgTWF0cml4WGYgbSgyLCAyKTsKKyAgTWF0cml4WGYgbigyLCAyKTsKKyAgTWF0cml4WGYgcmVzdWx0KDIsIDIpOwogCi0gIG0gPDwgMSwyLAotICAgICAgIDMsNDsKLSAgbiA8PCA1LDYsCi0gICAgICAgNyw4OwotICAKKyAgbSA8PCAxLCAyLCAzLCA0OworICBuIDw8IDUsIDYsIDcsIDg7CisKICAgcmVzdWx0ID0gKG0uYXJyYXkoKSArIDQpLm1hdHJpeCgpICogbTsKICAgc3RkOjpjb3V0IDw8ICItLSBDb21iaW5hdGlvbiAxOiAtLVxuIiA8PCByZXN1bHQgPDwgIlxuXG4iOwogICByZXN1bHQgPSAobS5hcnJheSgpICogbi5hcnJheSgpKS5tYXRyaXgoKSAqIG07CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19pbnRlcm9wX21hdHJpeC5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQXJyYXlDbGFzc19pbnRlcm9wX21hdHJpeC5jcHAKaW5kZXggMDdlYzliMC4uYjViYzZhZSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfaW50ZXJvcF9tYXRyaXguY3BwCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX2ludGVyb3BfbWF0cml4LmNwcApAQCAtMywxNiArMywxMyBAQAogCiB1c2luZyBFaWdlbjo6TWF0cml4WGY7CiAKLWludCBtYWluKCkKLXsKLSAgTWF0cml4WGYgbSgyLDIpOwotICBNYXRyaXhYZiBuKDIsMik7Ci0gIE1hdHJpeFhmIHJlc3VsdCgyLDIpOworaW50IG1haW4oKSB7CisgIE1hdHJpeFhmIG0oMiwgMik7CisgIE1hdHJpeFhmIG4oMiwgMik7CisgIE1hdHJpeFhmIHJlc3VsdCgyLCAyKTsKIAotICBtIDw8IDEsMiwKLSAgICAgICAzLDQ7Ci0gIG4gPDwgNSw2LAotICAgICAgIDcsODsKKyAgbSA8PCAxLCAyLCAzLCA0OworICBuIDw8IDUsIDYsIDcsIDg7CiAKICAgcmVzdWx0ID0gbSAqIG47CiAgIHN0ZDo6Y291dCA8PCAiLS0gTWF0cml4IG0qbjogLS1cbiIgPDwgcmVzdWx0IDw8ICJcblxuIjsKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9BcnJheUNsYXNzX211bHQuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfbXVsdC5jcHAKaW5kZXggYmFkYTM2Yy4uMzljMjMwMCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfbXVsdC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0FycmF5Q2xhc3NfbXVsdC5jcHAKQEAgLTEsMTMgKzEsMTAgQEAKICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAotaW50IG1haW4oKQotewotICBFaWdlbjo6QXJyYXlYWGYgYSgyLDIpOwotICBFaWdlbjo6QXJyYXlYWGYgYigyLDIpOwotICBhIDw8IDEsMiwKLSAgICAgICAzLDQ7Ci0gIGIgPDwgNSw2LAotICAgICAgIDcsODsKK2ludCBtYWluKCkgeworICBFaWdlbjo6QXJyYXlYWGYgYSgyLCAyKTsKKyAgRWlnZW46OkFycmF5WFhmIGIoMiwgMik7CisgIGEgPDwgMSwgMiwgMywgNDsKKyAgYiA8PCA1LCA2LCA3LCA4OwogICBzdGQ6OmNvdXQgPDwgImEgKiBiID0gIiA8PCBzdGQ6OmVuZGwgPDwgYSAqIGIgPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19ibG9ja19hc3NpZ25tZW50LmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfYmxvY2tfYXNzaWdubWVudC5jcHAKaW5kZXggMjZhZDQ3OC4uMjdiODhiMyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19ibG9ja19hc3NpZ25tZW50LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2Jsb2NrX2Fzc2lnbm1lbnQuY3BwCkBAIC0xLDE1ICsxLDEzIEBACiAjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLWludCBtYWluKCkKLXsKK2ludCBtYWluKCkgewogICBFaWdlbjo6QXJyYXkyMmYgbTsKLSAgbSA8PCAxLDIsCi0gICAgICAgMyw0OworICBtIDw8IDEsIDIsIDMsIDQ7CiAgIEVpZ2VuOjpBcnJheTQ0ZiBhID0gRWlnZW46OkFycmF5NDRmOjpDb25zdGFudCgwLjYpOwogICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdGhlIGFycmF5IGE6XG4iIDw8IGEgPDwgIlxuXG4iOwotICBhLmJsb2NrPDIsMj4oMSwxKSA9IG07CisgIGEuYmxvY2s8MiwgMj4oMSwgMSkgPSBtOwogICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgbm93IGEgd2l0aCBtIGNvcGllZCBpbnRvIGl0cyBjZW50cmFsIDJ4MiBibG9jazpcbiIgPDwgYSA8PCAiXG5cbiI7Ci0gIGEuYmxvY2soMCwwLDIsMykgPSBhLmJsb2NrKDIsMSwyLDMpOworICBhLmJsb2NrKDAsIDAsIDIsIDMpID0gYS5ibG9jaygyLCAxLCAyLCAzKTsKICAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIG5vdyBhIHdpdGggYm90dG9tLXJpZ2h0IDJ4MyBibG9jayBjb3BpZWQgaW50byB0b3AtbGVmdCAyeDMgYmxvY2s6XG4iIDw8IGEgPDwgIlxuXG4iOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19jb2xyb3cuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19jb2xyb3cuY3BwCmluZGV4IDJlN2ViMDAuLmIyMzYzMzQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfY29scm93LmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2NvbHJvdy5jcHAKQEAgLTMsMTIgKzMsOSBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi1pbnQgbWFpbigpCi17Ci0gIEVpZ2VuOjpNYXRyaXhYZiBtKDMsMyk7Ci0gIG0gPDwgMSwyLDMsCi0gICAgICAgNCw1LDYsCi0gICAgICAgNyw4LDk7CitpbnQgbWFpbigpIHsKKyAgRWlnZW46Ok1hdHJpeFhmIG0oMywgMyk7CisgIG0gPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOTsKICAgY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKICAgY291dCA8PCAiMm5kIFJvdzogIiA8PCBtLnJvdygxKSA8PCBlbmRsOwogICBtLmNvbCgyKSArPSAzICogbS5jb2woMCk7CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2Nvcm5lci5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX2Nvcm5lci5jcHAKaW5kZXggM2EzMTUwNy4uY2QwOTNmYyAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc19jb3JuZXIuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfY29ybmVyLmNwcApAQCAtMywxNSArMywxMSBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgRWlnZW46Ok1hdHJpeDRmIG07Ci0gIG0gPDwgMSwgMiwgMywgNCwKLSAgICAgICA1LCA2LCA3LCA4LAotICAgICAgIDksIDEwLDExLDEyLAotICAgICAgIDEzLDE0LDE1LDE2OworICBtIDw8IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2OwogICBjb3V0IDw8ICJtLmxlZnRDb2xzKDIpID0iIDw8IGVuZGwgPDwgbS5sZWZ0Q29scygyKSA8PCBlbmRsIDw8IGVuZGw7CiAgIGNvdXQgPDwgIm0uYm90dG9tUm93czwyPigpID0iIDw8IGVuZGwgPDwgbS5ib3R0b21Sb3dzPDI+KCkgPDwgZW5kbCA8PCBlbmRsOwotICBtLnRvcExlZnRDb3JuZXIoMSwzKSA9IG0uYm90dG9tUmlnaHRDb3JuZXIoMywxKS50cmFuc3Bvc2UoKTsKKyAgbS50b3BMZWZ0Q29ybmVyKDEsIDMpID0gbS5ib3R0b21SaWdodENvcm5lcigzLCAxKS50cmFuc3Bvc2UoKTsKICAgY291dCA8PCAiQWZ0ZXIgYXNzaWdubWVudCwgbSA9ICIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX3ByaW50X2Jsb2NrLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfcHJpbnRfYmxvY2suY3BwCmluZGV4IGVkZWE0YWUuLjdjNjVkZGIgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfcHJpbnRfYmxvY2suY3BwCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfcHJpbnRfYmxvY2suY3BwCkBAIC0zLDE4ICszLDEzIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLWludCBtYWluKCkKLXsKLSAgRWlnZW46Ok1hdHJpeFhmIG0oNCw0KTsKLSAgbSA8PCAgMSwgMiwgMywgNCwKLSAgICAgICAgNSwgNiwgNywgOCwKLSAgICAgICAgOSwxMCwxMSwxMiwKLSAgICAgICAxMywxNCwxNSwxNjsKK2ludCBtYWluKCkgeworICBFaWdlbjo6TWF0cml4WGYgbSg0LCA0KTsKKyAgbSA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNjsKICAgY291dCA8PCAiQmxvY2sgaW4gdGhlIG1pZGRsZSIgPDwgZW5kbDsKLSAgY291dCA8PCBtLmJsb2NrPDIsMj4oMSwxKSA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZvciAoaW50IGkgPSAxOyBpIDw9IDM7ICsraSkKLSAgeworICBjb3V0IDw8IG0uYmxvY2s8MiwgMj4oMSwgMSkgPDwgZW5kbCA8PCBlbmRsOworICBmb3IgKGludCBpID0gMTsgaSA8PSAzOyArK2kpIHsKICAgICBjb3V0IDw8ICJCbG9jayBvZiBzaXplICIgPDwgaSA8PCAieCIgPDwgaSA8PCBlbmRsOwotICAgIGNvdXQgPDwgbS5ibG9jaygwLDAsaSxpKSA8PCBlbmRsIDw8IGVuZGw7CisgICAgY291dCA8PCBtLmJsb2NrKDAsIDAsIGksIGkpIDw8IGVuZGwgPDwgZW5kbDsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc192ZWN0b3IuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX0Jsb2NrT3BlcmF0aW9uc192ZWN0b3IuY3BwCmluZGV4IDRhMGIwMjMuLjBjZTJiMGIgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9CbG9ja09wZXJhdGlvbnNfdmVjdG9yLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfQmxvY2tPcGVyYXRpb25zX3ZlY3Rvci5jcHAKQEAgLTMsMTIgKzMsMTEgQEAKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIEVpZ2VuOjpBcnJheVhmIHYoNik7CiAgIHYgPDwgMSwgMiwgMywgNCwgNSwgNjsKICAgY291dCA8PCAidi5oZWFkKDMpID0iIDw8IGVuZGwgPDwgdi5oZWFkKDMpIDw8IGVuZGwgPDwgZW5kbDsKICAgY291dCA8PCAidi50YWlsPDM+KCkgPSAiIDw8IGVuZGwgPDwgdi50YWlsPDM+KCkgPDwgZW5kbCA8PCBlbmRsOwotICB2LnNlZ21lbnQoMSw0KSAqPSAyOworICB2LnNlZ21lbnQoMSwgNCkgKj0gMjsKICAgY291dCA8PCAiYWZ0ZXIgJ3Yuc2VnbWVudCgxLDQpICo9IDInLCB2ID0iIDw8IGVuZGwgPDwgdiA8PCBlbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1BhcnRpYWxMVV9zb2x2ZS5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUGFydGlhbExVX3NvbHZlLmNwcAppbmRleCBjYTcyYzk5Li5iZmMwOTczIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUGFydGlhbExVX3NvbHZlLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUGFydGlhbExVX3NvbHZlLmNwcApAQCAtMiwxNCArMiwxMyBAQAogI2luY2x1ZGUgPEVpZ2VuL0xVPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi1pbnQgbWFpbigpCi17Ci0gICBFaWdlbjo6TWF0cml4M2YgQTsKLSAgIEVpZ2VuOjpWZWN0b3IzZiBiOwotICAgQSA8PCAxLDIsMywgIDQsNSw2LCAgNyw4LDEwOwotICAgYiA8PCAzLCAzLCA0OwotICAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggQToiIDw8IHN0ZDo6ZW5kbCA8PCBBIDw8IHN0ZDo6ZW5kbDsKLSAgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB0aGUgdmVjdG9yIGI6IiA8PCBzdGQ6OmVuZGwgPDwgYiA8PCBzdGQ6OmVuZGw7Ci0gICBFaWdlbjo6VmVjdG9yM2YgeCA9IEEubHUoKS5zb2x2ZShiKTsKLSAgIHN0ZDo6Y291dCA8PCAiVGhlIHNvbHV0aW9uIGlzOiIgPDwgc3RkOjplbmRsIDw8IHggPDwgc3RkOjplbmRsOworaW50IG1haW4oKSB7CisgIEVpZ2VuOjpNYXRyaXgzZiBBOworICBFaWdlbjo6VmVjdG9yM2YgYjsKKyAgQSA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAxMDsKKyAgYiA8PCAzLCAzLCA0OworICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBBOiIgPDwgc3RkOjplbmRsIDw8IEEgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciBiOiIgPDwgc3RkOjplbmRsIDw8IGIgPDwgc3RkOjplbmRsOworICBFaWdlbjo6VmVjdG9yM2YgeCA9IEEubHUoKS5zb2x2ZShiKTsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgc29sdXRpb24gaXM6IiA8PCBzdGQ6OmVuZGwgPDwgeCA8PCBzdGQ6OmVuZGw7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF8xbm4uY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19icm9hZGNhc3RfMW5uLmNwcAppbmRleCA4ZWYwNmJlLi42MWFiNzVmIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF8xbm4uY3BwCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0XzFubi5jcHAKQEAgLTEsMTYgKzEsMTMgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KIAotaW50IG1haW4oKQotewotICBFaWdlbjo6TWF0cml4WGYgbSgyLDQpOworaW50IG1haW4oKSB7CisgIEVpZ2VuOjpNYXRyaXhYZiBtKDIsIDQpOwogICBFaWdlbjo6VmVjdG9yWGYgdigyKTsKLSAgCi0gIG0gPDwgMSwgMjMsIDYsIDksCi0gICAgICAgMywgMTEsIDcsIDI7Ci0gICAgICAgCi0gIHYgPDwgMiwKLSAgICAgICAzOworCisgIG0gPDwgMSwgMjMsIDYsIDksIDMsIDExLCA3LCAyOworCisgIHYgPDwgMiwgMzsKIAogICBFaWdlbjo6SW5kZXggaW5kZXg7CiAgIC8vIGZpbmQgbmVhcmVzdCBuZWlnaGJvdXIKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0X3NpbXBsZS5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF9zaW1wbGUuY3BwCmluZGV4IGU2Yzg3YzYuLjYzZWU3MjQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0X3NpbXBsZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19icm9hZGNhc3Rfc2ltcGxlLmNwcApAQCAtMiwyMCArMiwxNyBAQAogI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwotaW50IG1haW4oKQotewotICBFaWdlbjo6TWF0cml4WGYgbWF0KDIsNCk7CitpbnQgbWFpbigpIHsKKyAgRWlnZW46Ok1hdHJpeFhmIG1hdCgyLCA0KTsKICAgRWlnZW46OlZlY3RvclhmIHYoMik7Ci0gIAotICBtYXQgPDwgMSwgMiwgNiwgOSwKLSAgICAgICAgIDMsIDEsIDcsIDI7Ci0gICAgICAgICAKLSAgdiA8PCAwLAotICAgICAgIDE7Ci0gICAgICAgCi0gIC8vYWRkIHYgdG8gZWFjaCBjb2x1bW4gb2YgbQorCisgIG1hdCA8PCAxLCAyLCA2LCA5LCAzLCAxLCA3LCAyOworCisgIHYgPDwgMCwgMTsKKworICAvLyBhZGQgdiB0byBlYWNoIGNvbHVtbiBvZiBtCiAgIG1hdC5jb2x3aXNlKCkgKz0gdjsKLSAgCisKICAgc3RkOjpjb3V0IDw8ICJCcm9hZGNhc3RpbmcgcmVzdWx0OiAiIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8IG1hdCA8PCBzdGQ6OmVuZGw7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF9zaW1wbGVfcm93d2lzZS5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2Jyb2FkY2FzdF9zaW1wbGVfcm93d2lzZS5jcHAKaW5kZXggZDg3Yzk2YS4uMWY5MzdhZCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19icm9hZGNhc3Rfc2ltcGxlX3Jvd3dpc2UuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfYnJvYWRjYXN0X3NpbXBsZV9yb3d3aXNlLmNwcApAQCAtMiwxOSArMiwxNyBAQAogI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwotaW50IG1haW4oKQotewotICBFaWdlbjo6TWF0cml4WGYgbWF0KDIsNCk7CitpbnQgbWFpbigpIHsKKyAgRWlnZW46Ok1hdHJpeFhmIG1hdCgyLCA0KTsKICAgRWlnZW46OlZlY3RvclhmIHYoNCk7Ci0gIAotICBtYXQgPDwgMSwgMiwgNiwgOSwKLSAgICAgICAgIDMsIDEsIDcsIDI7Ci0gICAgICAgICAKLSAgdiA8PCAwLDEsMiwzOwotICAgICAgIAotICAvL2FkZCB2IHRvIGVhY2ggcm93IG9mIG0KKworICBtYXQgPDwgMSwgMiwgNiwgOSwgMywgMSwgNywgMjsKKworICB2IDw8IDAsIDEsIDIsIDM7CisKKyAgLy8gYWRkIHYgdG8gZWFjaCByb3cgb2YgbQogICBtYXQucm93d2lzZSgpICs9IHYudHJhbnNwb3NlKCk7Ci0gIAorCiAgIHN0ZDo6Y291dCA8PCAiQnJvYWRjYXN0aW5nIHJlc3VsdDogIiA8PCBzdGQ6OmVuZGw7CiAgIHN0ZDo6Y291dCA8PCBtYXQgPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19jb2x3aXNlLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfY29sd2lzZS5jcHAKaW5kZXggZGY2ODI1Ni4uZjQwMTg0YiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19jb2x3aXNlLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX2NvbHdpc2UuY3BwCkBAIC0yLDEyICsyLDkgQEAKICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLWludCBtYWluKCkKLXsKLSAgRWlnZW46Ok1hdHJpeFhmIG1hdCgyLDQpOwotICBtYXQgPDwgMSwgMiwgNiwgOSwKLSAgICAgICAgIDMsIDEsIDcsIDI7Ci0gIAotICBzdGQ6OmNvdXQgPDwgIkNvbHVtbidzIG1heGltdW06ICIgPDwgc3RkOjplbmRsCi0gICA8PCBtYXQuY29sd2lzZSgpLm1heENvZWZmKCkgPDwgc3RkOjplbmRsOworaW50IG1haW4oKSB7CisgIEVpZ2VuOjpNYXRyaXhYZiBtYXQoMiwgNCk7CisgIG1hdCA8PCAxLCAyLCA2LCA5LCAzLCAxLCA3LCAyOworCisgIHN0ZDo6Y291dCA8PCAiQ29sdW1uJ3MgbWF4aW11bTogIiA8PCBzdGQ6OmVuZGwgPDwgbWF0LmNvbHdpc2UoKS5tYXhDb2VmZigpIDw8IHN0ZDo6ZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfbWF4bm9ybS5jcHAgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX21heG5vcm0uY3BwCmluZGV4IGI1ZDg4YzMuLjg4ZTMxOWQgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfbWF4bm9ybS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19tYXhub3JtLmNwcApAQCAtMSwxOCArMSwxNiBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgogCi1pbnQgbWFpbigpCi17Ci0gIEVpZ2VuOjpNYXRyaXhYZiBtYXQoMiw0KTsKLSAgbWF0IDw8IDEsIDIsIDYsIDksCi0gICAgICAgICAzLCAxLCA3LCAyOwotICAKLSAgRWlnZW46OkluZGV4ICAgbWF4SW5kZXg7CitpbnQgbWFpbigpIHsKKyAgRWlnZW46Ok1hdHJpeFhmIG1hdCgyLCA0KTsKKyAgbWF0IDw8IDEsIDIsIDYsIDksIDMsIDEsIDcsIDI7CisKKyAgRWlnZW46OkluZGV4IG1heEluZGV4OwogICBmbG9hdCBtYXhOb3JtID0gbWF0LmNvbHdpc2UoKS5zdW0oKS5tYXhDb2VmZigmbWF4SW5kZXgpOwotICAKKwogICBzdGQ6OmNvdXQgPDwgIk1heGltdW0gc3VtIGF0IHBvc2l0aW9uICIgPDwgbWF4SW5kZXggPDwgc3RkOjplbmRsOwogCiAgIHN0ZDo6Y291dCA8PCAiVGhlIGNvcnJlc3BvbmRpbmcgdmVjdG9yIGlzOiAiIDw8IHN0ZDo6ZW5kbDsKLSAgc3RkOjpjb3V0IDw8IG1hdC5jb2woIG1heEluZGV4ICkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgbWF0LmNvbChtYXhJbmRleCkgPDwgc3RkOjplbmRsOwogICBzdGQ6OmNvdXQgPDwgIkFuZCBpdHMgc3VtIGlzIGlzOiAiIDw8IG1heE5vcm0gPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX2Jvb2wuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX2Jvb2wuY3BwCmluZGV4IDdiODliY2YuLjcxZjIwMzAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19ib29sLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3JlZHVjdGlvbnNfYm9vbC5jcHAKQEAgLTEsMTIgKzEsMTAgQEAKICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAotaW50IG1haW4oKQotewotICBFaWdlbjo6QXJyYXlYWGYgYSgyLDIpOwotICAKLSAgYSA8PCAxLDIsCi0gICAgICAgMyw0OworaW50IG1haW4oKSB7CisgIEVpZ2VuOjpBcnJheVhYZiBhKDIsIDIpOworCisgIGEgPDwgMSwgMiwgMywgNDsKIAogICBzdGQ6OmNvdXQgPDwgIihhID4gMCkuYWxsKCkgICA9ICIgPDwgKGEgPiAwKS5hbGwoKSA8PCBzdGQ6OmVuZGw7CiAgIHN0ZDo6Y291dCA8PCAiKGEgPiAwKS5hbnkoKSAgID0gIiA8PCAoYSA+IDApLmFueSgpIDw8IHN0ZDo6ZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19ub3JtLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19ub3JtLmNwcAppbmRleCA3NTE5MTM3Li43NWJmZWUwIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3JlZHVjdGlvbnNfbm9ybS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX25vcm0uY3BwCkBAIC0xLDE2ICsxLDEzIEBACiAjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLWludCBtYWluKCkKLXsKK2ludCBtYWluKCkgewogICBFaWdlbjo6VmVjdG9yWGYgdigyKTsKLSAgRWlnZW46Ok1hdHJpeFhmIG0oMiwyKSwgbigyLDIpOwotICAKLSAgdiA8PCAtMSwKLSAgICAgICAyOwotICAKLSAgbSA8PCAxLC0yLAotICAgICAgIC0zLDQ7CisgIEVpZ2VuOjpNYXRyaXhYZiBtKDIsIDIpLCBuKDIsIDIpOworCisgIHYgPDwgLTEsIDI7CisKKyAgbSA8PCAxLCAtMiwgLTMsIDQ7CiAKICAgc3RkOjpjb3V0IDw8ICJ2LnNxdWFyZWROb3JtKCkgPSAiIDw8IHYuc3F1YXJlZE5vcm0oKSA8PCBzdGQ6OmVuZGw7CiAgIHN0ZDo6Y291dCA8PCAidi5ub3JtKCkgPSAiIDw8IHYubm9ybSgpIDw8IHN0ZDo6ZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfcmVkdWN0aW9uc19vcGVyYXRvcm5vcm0uY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX29wZXJhdG9ybm9ybS5jcHAKaW5kZXggOGZhYTVhMS4uNjk1ZjUzOCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX29wZXJhdG9ybm9ybS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yZWR1Y3Rpb25zX29wZXJhdG9ybm9ybS5jcHAKQEAgLTEsMTUgKzEsMTMgQEAKICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAotaW50IG1haW4oKQotewotICBFaWdlbjo6TWF0cml4WGYgbSgyLDIpOwotICBtIDw8IDEsLTIsCi0gICAgICAgLTMsNDsKK2ludCBtYWluKCkgeworICBFaWdlbjo6TWF0cml4WGYgbSgyLCAyKTsKKyAgbSA8PCAxLCAtMiwgLTMsIDQ7CiAKICAgc3RkOjpjb3V0IDw8ICIxLW5vcm0obSkgICAgID0gIiA8PCBtLmN3aXNlQWJzKCkuY29sd2lzZSgpLnN1bSgpLm1heENvZWZmKCkKLSAgICAgICAgICAgIDw8ICIgPT0gIiAgICAgICAgICAgICA8PCBtLmNvbHdpc2UoKS5scE5vcm08MT4oKS5tYXhDb2VmZigpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIDw8ICIgPT0gIiA8PCBtLmNvbHdpc2UoKS5scE5vcm08MT4oKS5tYXhDb2VmZigpIDw8IHN0ZDo6ZW5kbDsKIAogICBzdGQ6OmNvdXQgPDwgImluZnR5LW5vcm0obSkgPSAiIDw8IG0uY3dpc2VBYnMoKS5yb3d3aXNlKCkuc3VtKCkubWF4Q29lZmYoKQotICAgICAgICAgICAgPDwgIiA9PSAiICAgICAgICAgICAgIDw8IG0ucm93d2lzZSgpLmxwTm9ybTwxPigpLm1heENvZWZmKCkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgPDwgIiA9PSAiIDw8IG0ucm93d2lzZSgpLmxwTm9ybTwxPigpLm1heENvZWZmKCkgPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yb3d3aXNlLmNwcCBiL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3Rpbmdfcm93d2lzZS5jcHAKaW5kZXggODA0MjdjOS4uYjUyNWIyYSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ19yb3d3aXNlLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfUmVkdWN0aW9uc1Zpc2l0b3JzQnJvYWRjYXN0aW5nX3Jvd3dpc2UuY3BwCkBAIC0yLDEyICsyLDkgQEAKICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLWludCBtYWluKCkKLXsKLSAgRWlnZW46Ok1hdHJpeFhmIG1hdCgyLDQpOwotICBtYXQgPDwgMSwgMiwgNiwgOSwKLSAgICAgICAgIDMsIDEsIDcsIDI7Ci0gIAotICBzdGQ6OmNvdXQgPDwgIlJvdydzIG1heGltdW06ICIgPDwgc3RkOjplbmRsCi0gICA8PCBtYXQucm93d2lzZSgpLm1heENvZWZmKCkgPDwgc3RkOjplbmRsOworaW50IG1haW4oKSB7CisgIEVpZ2VuOjpNYXRyaXhYZiBtYXQoMiwgNCk7CisgIG1hdCA8PCAxLCAyLCA2LCA5LCAzLCAxLCA3LCAyOworCisgIHN0ZDo6Y291dCA8PCAiUm93J3MgbWF4aW11bTogIiA8PCBzdGQ6OmVuZGwgPDwgbWF0LnJvd3dpc2UoKS5tYXhDb2VmZigpIDw8IHN0ZDo6ZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9SZWR1Y3Rpb25zVmlzaXRvcnNCcm9hZGNhc3RpbmdfdmlzaXRvcnMuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ192aXNpdG9ycy5jcHAKaW5kZXggYmQyOTRiZC4uY2UzY2E3ZSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ192aXNpdG9ycy5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX1JlZHVjdGlvbnNWaXNpdG9yc0Jyb2FkY2FzdGluZ192aXNpdG9ycy5jcHAKQEAgLTEsMjMgKzEsMTkgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KIAotaW50IG1haW4oKQotewotICBFaWdlbjo6TWF0cml4WGYgbSgyLDIpOwotICAKLSAgbSA8PCAxLCAyLAotICAgICAgIDMsIDQ7CitpbnQgbWFpbigpIHsKKyAgRWlnZW46Ok1hdHJpeFhmIG0oMiwgMik7CiAKLSAgLy9nZXQgbG9jYXRpb24gb2YgbWF4aW11bQorICBtIDw8IDEsIDIsIDMsIDQ7CisKKyAgLy8gZ2V0IGxvY2F0aW9uIG9mIG1heGltdW0KICAgRWlnZW46OkluZGV4IG1heFJvdywgbWF4Q29sOwogICBmbG9hdCBtYXggPSBtLm1heENvZWZmKCZtYXhSb3csICZtYXhDb2wpOwogCi0gIC8vZ2V0IGxvY2F0aW9uIG9mIG1pbmltdW0KKyAgLy8gZ2V0IGxvY2F0aW9uIG9mIG1pbmltdW0KICAgRWlnZW46OkluZGV4IG1pblJvdywgbWluQ29sOwogICBmbG9hdCBtaW4gPSBtLm1pbkNvZWZmKCZtaW5Sb3csICZtaW5Db2wpOwogCi0gIHN0ZDo6Y291dCA8PCAiTWF4OiAiIDw8IG1heCA8PCAgIiwgYXQ6ICIgPDwKLSAgICAgbWF4Um93IDw8ICIsIiA8PCBtYXhDb2wgPDwgc3RkOjplbmRsOwotICBzdGQ6OiBjb3V0IDw8ICJNaW46ICIgPDwgbWluIDw8ICIsIGF0OiAiIDw8Ci0gICAgIG1pblJvdyA8PCAiLCIgPDwgbWluQ29sIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJNYXg6ICIgPDwgbWF4IDw8ICIsIGF0OiAiIDw8IG1heFJvdyA8PCAiLCIgPDwgbWF4Q29sIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJNaW46ICIgPDwgbWluIDw8ICIsIGF0OiAiIDw8IG1pblJvdyA8PCAiLCIgPDwgbWluQ29sIDw8IHN0ZDo6ZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9zaW1wbGVfZXhhbXBsZV9keW5hbWljX3NpemUuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX3NpbXBsZV9leGFtcGxlX2R5bmFtaWNfc2l6ZS5jcHAKaW5kZXggNzk2YmQ4Ny4uMTAyMjIzZiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX3NpbXBsZV9leGFtcGxlX2R5bmFtaWNfc2l6ZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX3NpbXBsZV9leGFtcGxlX2R5bmFtaWNfc2l6ZS5jcHAKQEAgLTEsMjAgKzEsMjEgQEAKICNpbmNsdWRlIDxFaWdlbi9Db3JlPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi1pbnQgbWFpbigpCi17Ci0gIGZvciAoaW50IHNpemU9MTsgc2l6ZTw9NDsgKytzaXplKQotICB7Ci0gICAgRWlnZW46Ok1hdHJpeFhpIG0oc2l6ZSxzaXplKzEpOyAgICAgICAgIC8vIGEgKHNpemUpeChzaXplKzEpLW1hdHJpeCBvZiBpbnQncwotICAgIGZvciAoaW50IGo9MDsgajxtLmNvbHMoKTsgKytqKSAgIC8vIGxvb3Agb3ZlciBjb2x1bW5zCi0gICAgICBmb3IgKGludCBpPTA7IGk8bS5yb3dzKCk7ICsraSkgLy8gbG9vcCBvdmVyIHJvd3MKLSAgICAgICAgbShpLGopID0gaStqKnNpemU7ICAgICAgICAgICAvLyB0byBhY2Nlc3MgbWF0cml4IGNvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2Ugb3BlcmF0b3IoKShpbnQsaW50KQoraW50IG1haW4oKSB7CisgIGZvciAoaW50IHNpemUgPSAxOyBzaXplIDw9IDQ7ICsrc2l6ZSkgeworICAgIEVpZ2VuOjpNYXRyaXhYaSBtKHNpemUsIHNpemUgKyAxKTsgICAgLy8gYSAoc2l6ZSl4KHNpemUrMSktbWF0cml4IG9mIGludCdzCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtLmNvbHMoKTsgKytqKSAgICAvLyBsb29wIG92ZXIgY29sdW1ucworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtLnJvd3MoKTsgKytpKSAgLy8gbG9vcCBvdmVyIHJvd3MKKyAgICAgICAgbShpLCBqKSA9IGkgKyBqICogc2l6ZTsgICAgICAgICAgIC8vIHRvIGFjY2VzcyBtYXRyaXggY29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIG9wZXJhdG9yKCkoaW50LGludCkKICAgICBzdGQ6OmNvdXQgPDwgbSA8PCAiXG5cbiI7CiAgIH0KIAotICBFaWdlbjo6VmVjdG9yWGYgdig0KTsgLy8gYSB2ZWN0b3Igb2YgNCBmbG9hdCdzCisgIEVpZ2VuOjpWZWN0b3JYZiB2KDQpOyAgLy8gYSB2ZWN0b3Igb2YgNCBmbG9hdCdzCiAgIC8vIHRvIGFjY2VzcyB2ZWN0b3IgY29lZmZpY2llbnRzLCB1c2UgZWl0aGVyIG9wZXJhdG9yICgpIG9yIG9wZXJhdG9yIFtdCi0gIHZbMF0gPSAxOyB2WzFdID0gMjsgdigyKSA9IDM7IHYoMykgPSA0OworICB2WzBdID0gMTsKKyAgdlsxXSA9IDI7CisgIHYoMikgPSAzOworICB2KDMpID0gNDsKICAgc3RkOjpjb3V0IDw8ICJcbnY6XG4iIDw8IHYgPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX3NpbXBsZV9leGFtcGxlX2ZpeGVkX3NpemUuY3BwIGIvZG9jL2V4YW1wbGVzL1R1dG9yaWFsX3NpbXBsZV9leGFtcGxlX2ZpeGVkX3NpemUuY3BwCmluZGV4IDk5YTk3NGQuLjhlMjAyMzAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9UdXRvcmlhbF9zaW1wbGVfZXhhbXBsZV9maXhlZF9zaXplLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvVHV0b3JpYWxfc2ltcGxlX2V4YW1wbGVfZml4ZWRfc2l6ZS5jcHAKQEAgLTEsMTMgKzEsMTEgQEAKICNpbmNsdWRlIDxFaWdlbi9Db3JlPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgRWlnZW46Ok1hdHJpeDNmIG0zOwogICBtMyA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5OwogICBFaWdlbjo6TWF0cml4NGYgbTQgPSBFaWdlbjo6TWF0cml4NGY6OklkZW50aXR5KCk7CiAgIEVpZ2VuOjpWZWN0b3I0aSB2NCgxLCAyLCAzLCA0KTsKIAotICBzdGQ6OmNvdXQgPDwgIm0zXG4iIDw8IG0zIDw8ICJcbm00OlxuIgotICAgIDw8IG00IDw8ICJcbnY0OlxuIiA8PCB2NCA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAibTNcbiIgPDwgbTMgPDwgIlxubTQ6XG4iIDw8IG00IDw8ICJcbnY0OlxuIiA8PCB2NCA8PCBzdGQ6OmVuZGw7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvY2xhc3NfQmxvY2suY3BwIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0Jsb2NrLmNwcAppbmRleCA5YWNlMGRhLi4wZmI5MjAyIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvY2xhc3NfQmxvY2suY3BwCisrKyBiL2RvYy9leGFtcGxlcy9jbGFzc19CbG9jay5jcHAKQEAgLTEsMjUgKzEsMjAgQEAKICNpbmNsdWRlIDxFaWdlbi9Db3JlPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgotRWlnZW46OkJsb2NrPERlcml2ZWQ+Ci10b3BMZWZ0Q29ybmVyKEVpZ2VuOjpNYXRyaXhCYXNlPERlcml2ZWQ+JiBtLCBpbnQgcm93cywgaW50IGNvbHMpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK0VpZ2VuOjpCbG9jazxEZXJpdmVkPiB0b3BMZWZ0Q29ybmVyKEVpZ2VuOjpNYXRyaXhCYXNlPERlcml2ZWQ+JiBtLCBpbnQgcm93cywgaW50IGNvbHMpIHsKICAgcmV0dXJuIEVpZ2VuOjpCbG9jazxEZXJpdmVkPihtLmRlcml2ZWQoKSwgMCwgMCwgcm93cywgY29scyk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1jb25zdCBFaWdlbjo6QmxvY2s8Y29uc3QgRGVyaXZlZD4KLXRvcExlZnRDb3JuZXIoY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8RGVyaXZlZD4mIG0sIGludCByb3dzLCBpbnQgY29scykKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgRWlnZW46OkJsb2NrPGNvbnN0IERlcml2ZWQ+IHRvcExlZnRDb3JuZXIoY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8RGVyaXZlZD4mIG0sIGludCByb3dzLCBpbnQgY29scykgewogICByZXR1cm4gRWlnZW46OkJsb2NrPGNvbnN0IERlcml2ZWQ+KG0uZGVyaXZlZCgpLCAwLCAwLCByb3dzLCBjb2xzKTsKIH0KIAotaW50IG1haW4oaW50LCBjaGFyKiopCi17CitpbnQgbWFpbihpbnQsIGNoYXIqKikgewogICBFaWdlbjo6TWF0cml4NGQgbSA9IEVpZ2VuOjpNYXRyaXg0ZDo6SWRlbnRpdHkoKTsKLSAgc3RkOjpjb3V0IDw8IHRvcExlZnRDb3JuZXIoNCptLCAyLCAzKSA8PCBzdGQ6OmVuZGw7IC8vIGNhbGxzIHRoZSBjb25zdCB2ZXJzaW9uCi0gIHRvcExlZnRDb3JuZXIobSwgMiwgMykgKj0gNTsgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBub24tY29uc3QgdmVyc2lvbgorICBzdGQ6OmNvdXQgPDwgdG9wTGVmdENvcm5lcig0ICogbSwgMiwgMykgPDwgc3RkOjplbmRsOyAgLy8gY2FsbHMgdGhlIGNvbnN0IHZlcnNpb24KKyAgdG9wTGVmdENvcm5lcihtLCAyLCAzKSAqPSA1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBub24tY29uc3QgdmVyc2lvbgogICBzdGQ6OmNvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBzdGQ6OmVuZGwgPDwgbSA8PCBzdGQ6OmVuZGw7CiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2NsYXNzX0N3aXNlQmluYXJ5T3AuY3BwIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0N3aXNlQmluYXJ5T3AuY3BwCmluZGV4IDk3M2JlZmQuLmY4YzFmOTIgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9jbGFzc19Dd2lzZUJpbmFyeU9wLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvY2xhc3NfQ3dpc2VCaW5hcnlPcC5jcHAKQEAgLTQsMTMgKzQsMTMgQEAKIHVzaW5nIEVpZ2VuOjpNYXRyaXg0ZDsKIAogLy8gZGVmaW5lIGEgY3VzdG9tIHRlbXBsYXRlIGJpbmFyeSBmdW5jdG9yCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCBNYWtlQ29tcGxleE9wIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgTWFrZUNvbXBsZXhPcCB7CiAgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFNjYWxhcj4gcmVzdWx0X3R5cGU7Ci0gIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBTY2FsYXImIGIpIGNvbnN0IHsgcmV0dXJuIHJlc3VsdF90eXBlKGEsYik7IH0KKyAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIGEsIGNvbnN0IFNjYWxhciYgYikgY29uc3QgeyByZXR1cm4gcmVzdWx0X3R5cGUoYSwgYik7IH0KIH07CiAKLWludCBtYWluKGludCwgY2hhcioqKQoteworaW50IG1haW4oaW50LCBjaGFyKiopIHsKICAgTWF0cml4NGQgbTEgPSBNYXRyaXg0ZDo6UmFuZG9tKCksIG0yID0gTWF0cml4NGQ6OlJhbmRvbSgpOwogICBzdGQ6OmNvdXQgPDwgbTEuYmluYXJ5RXhwcihtMiwgTWFrZUNvbXBsZXhPcDxkb3VibGU+KCkpIDw8IHN0ZDo6ZW5kbDsKICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvY2xhc3NfQ3dpc2VVbmFyeU9wLmNwcCBiL2RvYy9leGFtcGxlcy9jbGFzc19Dd2lzZVVuYXJ5T3AuY3BwCmluZGV4IDZjNjVmMmUuLjI0MTc3Y2UgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9jbGFzc19Dd2lzZVVuYXJ5T3AuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9jbGFzc19Dd2lzZVVuYXJ5T3AuY3BwCkBAIC0yLDE2ICsyLDE3IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKIC8vIGRlZmluZSBhIGN1c3RvbSB0ZW1wbGF0ZSB1bmFyeSBmdW5jdG9yCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgogc3RydWN0IEN3aXNlQ2xhbXBPcCB7CiAgIEN3aXNlQ2xhbXBPcChjb25zdCBTY2FsYXImIGluZiwgY29uc3QgU2NhbGFyJiBzdXApIDogbV9pbmYoaW5mKSwgbV9zdXAoc3VwKSB7fQotICBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIHgpIGNvbnN0IHsgcmV0dXJuIHg8bV9pbmYgPyBtX2luZiA6ICh4Pm1fc3VwID8gbV9zdXAgOiB4KTsgfQorICBjb25zdCBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIHgpIGNvbnN0IHsgcmV0dXJuIHggPCBtX2luZiA/IG1faW5mIDogKHggPiBtX3N1cCA/IG1fc3VwIDogeCk7IH0KICAgU2NhbGFyIG1faW5mLCBtX3N1cDsKIH07CiAKLWludCBtYWluKGludCwgY2hhcioqKQoteworaW50IG1haW4oaW50LCBjaGFyKiopIHsKICAgRWlnZW46Ok1hdHJpeDRkIG0xID0gRWlnZW46Ok1hdHJpeDRkOjpSYW5kb20oKTsKLSAgc3RkOjpjb3V0IDw8IG0xIDw8IHN0ZDo6ZW5kbCA8PCAiYmVjb21lczogIiA8PCBzdGQ6OmVuZGwgPDwgbTEudW5hcnlFeHByKEN3aXNlQ2xhbXBPcDxkb3VibGU+KC0wLjUsMC41KSkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgbTEgPDwgc3RkOjplbmRsCisgICAgICAgICAgICA8PCAiYmVjb21lczogIiA8PCBzdGQ6OmVuZGwKKyAgICAgICAgICAgIDw8IG0xLnVuYXJ5RXhwcihDd2lzZUNsYW1wT3A8ZG91YmxlPigtMC41LCAwLjUpKSA8PCBzdGQ6OmVuZGw7CiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2NsYXNzX0N3aXNlVW5hcnlPcF9wdHJmdW4uY3BwIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0N3aXNlVW5hcnlPcF9wdHJmdW4uY3BwCmluZGV4IGU5NzA5NWUuLjI3OTM1NWMgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9jbGFzc19Dd2lzZVVuYXJ5T3BfcHRyZnVuLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvY2xhc3NfQ3dpc2VVbmFyeU9wX3B0cmZ1bi5jcHAKQEAgLTIsMTYgKzIsMTQgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KIAogLy8gZGVmaW5lIGZ1bmN0aW9uIHRvIGJlIGFwcGxpZWQgY29lZmZpY2llbnQtd2lzZQotZG91YmxlIHJhbXAoZG91YmxlIHgpCi17Citkb3VibGUgcmFtcChkb3VibGUgeCkgewogICBpZiAoeCA+IDApCiAgICAgcmV0dXJuIHg7Ci0gIGVsc2UgCisgIGVsc2UKICAgICByZXR1cm4gMDsKIH0KIAotaW50IG1haW4oaW50LCBjaGFyKiopCi17CitpbnQgbWFpbihpbnQsIGNoYXIqKikgewogICBFaWdlbjo6TWF0cml4NGQgbTEgPSBFaWdlbjo6TWF0cml4NGQ6OlJhbmRvbSgpOwogICBzdGQ6OmNvdXQgPDwgbTEgPDwgc3RkOjplbmRsIDw8ICJiZWNvbWVzOiAiIDw8IHN0ZDo6ZW5kbCA8PCBtMS51bmFyeUV4cHIoc3RkOjpwdHJfZnVuKHJhbXApKSA8PCBzdGQ6OmVuZGw7CiAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2NsYXNzX0ZpeGVkQmxvY2suY3BwIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0ZpeGVkQmxvY2suY3BwCmluZGV4IDRiYjJkNDQuLjg3NWU3NzkgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9jbGFzc19GaXhlZEJsb2NrLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvY2xhc3NfRml4ZWRCbG9jay5jcHAKQEAgLTEsMjUgKzEsMjAgQEAKICNpbmNsdWRlIDxFaWdlbi9Db3JlPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgotRWlnZW46OkJsb2NrPERlcml2ZWQsIDIsIDI+Ci10b3BMZWZ0MngyQ29ybmVyKEVpZ2VuOjpNYXRyaXhCYXNlPERlcml2ZWQ+JiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CitFaWdlbjo6QmxvY2s8RGVyaXZlZCwgMiwgMj4gdG9wTGVmdDJ4MkNvcm5lcihFaWdlbjo6TWF0cml4QmFzZTxEZXJpdmVkPiYgbSkgewogICByZXR1cm4gRWlnZW46OkJsb2NrPERlcml2ZWQsIDIsIDI+KG0uZGVyaXZlZCgpLCAwLCAwKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWNvbnN0IEVpZ2VuOjpCbG9jazxjb25zdCBEZXJpdmVkLCAyLCAyPgotdG9wTGVmdDJ4MkNvcm5lcihjb25zdCBFaWdlbjo6TWF0cml4QmFzZTxEZXJpdmVkPiYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgorY29uc3QgRWlnZW46OkJsb2NrPGNvbnN0IERlcml2ZWQsIDIsIDI+IHRvcExlZnQyeDJDb3JuZXIoY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8RGVyaXZlZD4mIG0pIHsKICAgcmV0dXJuIEVpZ2VuOjpCbG9jazxjb25zdCBEZXJpdmVkLCAyLCAyPihtLmRlcml2ZWQoKSwgMCwgMCk7CiB9CiAKLWludCBtYWluKGludCwgY2hhcioqKQoteworaW50IG1haW4oaW50LCBjaGFyKiopIHsKICAgRWlnZW46Ok1hdHJpeDNkIG0gPSBFaWdlbjo6TWF0cml4M2Q6OklkZW50aXR5KCk7Ci0gIHN0ZDo6Y291dCA8PCB0b3BMZWZ0MngyQ29ybmVyKDQqbSkgPDwgc3RkOjplbmRsOyAvLyBjYWxscyB0aGUgY29uc3QgdmVyc2lvbgotICB0b3BMZWZ0MngyQ29ybmVyKG0pICo9IDI7ICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbm9uLWNvbnN0IHZlcnNpb24KKyAgc3RkOjpjb3V0IDw8IHRvcExlZnQyeDJDb3JuZXIoNCAqIG0pIDw8IHN0ZDo6ZW5kbDsgIC8vIGNhbGxzIHRoZSBjb25zdCB2ZXJzaW9uCisgIHRvcExlZnQyeDJDb3JuZXIobSkgKj0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbm9uLWNvbnN0IHZlcnNpb24KICAgc3RkOjpjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgc3RkOjplbmRsIDw8IG0gPDwgc3RkOjplbmRsOwogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9jbGFzc19GaXhlZFJlc2hhcGVkLmNwcCBiL2RvYy9leGFtcGxlcy9jbGFzc19GaXhlZFJlc2hhcGVkLmNwcAppbmRleCBiZTcwNjlkLi4yOWEwNGY2IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvY2xhc3NfRml4ZWRSZXNoYXBlZC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0ZpeGVkUmVzaGFwZWQuY3BwCkBAIC0xLDE4ICsxLDE0IEBACiAjaW5jbHVkZSA8RWlnZW4vQ29yZT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLUVpZ2VuOjpSZXNoYXBlZDxEZXJpdmVkLCA0LCAyPgotcmVzaGFwZV9oZWxwZXIoRWlnZW46Ok1hdHJpeEJhc2U8RGVyaXZlZD4mIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK0VpZ2VuOjpSZXNoYXBlZDxEZXJpdmVkLCA0LCAyPiByZXNoYXBlX2hlbHBlcihFaWdlbjo6TWF0cml4QmFzZTxEZXJpdmVkPiYgbSkgewogICByZXR1cm4gRWlnZW46OlJlc2hhcGVkPERlcml2ZWQsIDQsIDI+KG0uZGVyaXZlZCgpKTsKIH0KIAotaW50IG1haW4oaW50LCBjaGFyKiopCi17CitpbnQgbWFpbihpbnQsIGNoYXIqKikgewogICBFaWdlbjo6TWF0cml4WGQgbSgyLCA0KTsKLSAgbSA8PCAxLCAyLCAzLCA0LAotICAgICAgIDUsIDYsIDcsIDg7CisgIG0gPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgODsKICAgRWlnZW46Ok1hdHJpeFhkIG4gPSByZXNoYXBlX2hlbHBlcihtKTsKICAgc3RkOjpjb3V0IDw8ICJtYXRyaXggbSBpczoiIDw8IHN0ZDo6ZW5kbCA8PCBtIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8ICJtYXRyaXggbiBpczoiIDw8IHN0ZDo6ZW5kbCA8PCBuIDw8IHN0ZDo6ZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9jbGFzc19GaXhlZFZlY3RvckJsb2NrLmNwcCBiL2RvYy9leGFtcGxlcy9jbGFzc19GaXhlZFZlY3RvckJsb2NrLmNwcAppbmRleCBlZWQzMDA3Li5jZWU4YWM4IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvY2xhc3NfRml4ZWRWZWN0b3JCbG9jay5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2NsYXNzX0ZpeGVkVmVjdG9yQmxvY2suY3BwCkBAIC0xLDI1ICsxLDIxIEBACiAjaW5jbHVkZSA8RWlnZW4vQ29yZT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLUVpZ2VuOjpWZWN0b3JCbG9jazxEZXJpdmVkLCAyPgotZmlyc3RUd28oRWlnZW46Ok1hdHJpeEJhc2U8RGVyaXZlZD4mIHYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK0VpZ2VuOjpWZWN0b3JCbG9jazxEZXJpdmVkLCAyPiBmaXJzdFR3byhFaWdlbjo6TWF0cml4QmFzZTxEZXJpdmVkPiYgdikgewogICByZXR1cm4gRWlnZW46OlZlY3RvckJsb2NrPERlcml2ZWQsIDI+KHYuZGVyaXZlZCgpLCAwKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWNvbnN0IEVpZ2VuOjpWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkLCAyPgotZmlyc3RUd28oY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8RGVyaXZlZD4mIHYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IEVpZ2VuOjpWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkLCAyPiBmaXJzdFR3byhjb25zdCBFaWdlbjo6TWF0cml4QmFzZTxEZXJpdmVkPiYgdikgewogICByZXR1cm4gRWlnZW46OlZlY3RvckJsb2NrPGNvbnN0IERlcml2ZWQsIDI+KHYuZGVyaXZlZCgpLCAwKTsKIH0KIAotaW50IG1haW4oaW50LCBjaGFyKiopCi17Ci0gIEVpZ2VuOjpNYXRyaXg8aW50LDEsNj4gdjsgdiA8PCAxLDIsMyw0LDUsNjsKLSAgc3RkOjpjb3V0IDw8IGZpcnN0VHdvKDQqdikgPDwgc3RkOjplbmRsOyAvLyBjYWxscyB0aGUgY29uc3QgdmVyc2lvbgotICBmaXJzdFR3byh2KSAqPSAyOyAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5vbi1jb25zdCB2ZXJzaW9uCitpbnQgbWFpbihpbnQsIGNoYXIqKikgeworICBFaWdlbjo6TWF0cml4PGludCwgMSwgNj4gdjsKKyAgdiA8PCAxLCAyLCAzLCA0LCA1LCA2OworICBzdGQ6OmNvdXQgPDwgZmlyc3RUd28oNCAqIHYpIDw8IHN0ZDo6ZW5kbDsgIC8vIGNhbGxzIHRoZSBjb25zdCB2ZXJzaW9uCisgIGZpcnN0VHdvKHYpICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5vbi1jb25zdCB2ZXJzaW9uCiAgIHN0ZDo6Y291dCA8PCAiTm93IHRoZSB2ZWN0b3IgdiBpczoiIDw8IHN0ZDo6ZW5kbCA8PCB2IDw8IHN0ZDo6ZW5kbDsKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvY2xhc3NfUmVzaGFwZWQuY3BwIGIvZG9jL2V4YW1wbGVzL2NsYXNzX1Jlc2hhcGVkLmNwcAppbmRleCA3MjE5ODUzLi5hOTFjM2ZmIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvY2xhc3NfUmVzaGFwZWQuY3BwCisrKyBiL2RvYy9leGFtcGxlcy9jbGFzc19SZXNoYXBlZC5jcHAKQEAgLTEsMTkgKzEsMTQgQEAKICNpbmNsdWRlIDxFaWdlbi9Db3JlPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgotY29uc3QgRWlnZW46OlJlc2hhcGVkPGNvbnN0IERlcml2ZWQ+Ci1yZXNoYXBlX2hlbHBlcihjb25zdCBFaWdlbjo6TWF0cml4QmFzZTxEZXJpdmVkPiYgbSwgaW50IHJvd3MsIGludCBjb2xzKQotewordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citjb25zdCBFaWdlbjo6UmVzaGFwZWQ8Y29uc3QgRGVyaXZlZD4gcmVzaGFwZV9oZWxwZXIoY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8RGVyaXZlZD4mIG0sIGludCByb3dzLCBpbnQgY29scykgewogICByZXR1cm4gRWlnZW46OlJlc2hhcGVkPGNvbnN0IERlcml2ZWQ+KG0uZGVyaXZlZCgpLCByb3dzLCBjb2xzKTsKIH0KIAotaW50IG1haW4oaW50LCBjaGFyKiopCi17CitpbnQgbWFpbihpbnQsIGNoYXIqKikgewogICBFaWdlbjo6TWF0cml4WGQgbSgzLCA0KTsKLSAgbSA8PCAxLCA0LCA3LCAxMCwKLSAgICAgICAyLCA1LCA4LCAxMSwKLSAgICAgICAzLCA2LCA5LCAxMjsKKyAgbSA8PCAxLCA0LCA3LCAxMCwgMiwgNSwgOCwgMTEsIDMsIDYsIDksIDEyOwogICBzdGQ6OmNvdXQgPDwgbSA8PCBzdGQ6OmVuZGw7CiAgIEVpZ2VuOjpSZWY8Y29uc3QgRWlnZW46Ok1hdHJpeFhkPiBuID0gcmVzaGFwZV9oZWxwZXIobSwgMiwgNik7CiAgIHN0ZDo6Y291dCA8PCAiTWF0cml4IG0gaXM6IiA8PCBzdGQ6OmVuZGwgPDwgbSA8PCBzdGQ6OmVuZGw7CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvY2xhc3NfVmVjdG9yQmxvY2suY3BwIGIvZG9jL2V4YW1wbGVzL2NsYXNzX1ZlY3RvckJsb2NrLmNwcAppbmRleCA1Y2VlMTQ3Li5kNDI3ZmE3IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvY2xhc3NfVmVjdG9yQmxvY2suY3BwCisrKyBiL2RvYy9leGFtcGxlcy9jbGFzc19WZWN0b3JCbG9jay5jcHAKQEAgLTEsMjUgKzEsMjEgQEAKICNpbmNsdWRlIDxFaWdlbi9Db3JlPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgotRWlnZW46OlZlY3RvckJsb2NrPERlcml2ZWQ+Ci1zZWdtZW50RnJvbVJhbmdlKEVpZ2VuOjpNYXRyaXhCYXNlPERlcml2ZWQ+JiB2LCBpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gIHJldHVybiBFaWdlbjo6VmVjdG9yQmxvY2s8RGVyaXZlZD4odi5kZXJpdmVkKCksIHN0YXJ0LCBlbmQtc3RhcnQpOwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CitFaWdlbjo6VmVjdG9yQmxvY2s8RGVyaXZlZD4gc2VnbWVudEZyb21SYW5nZShFaWdlbjo6TWF0cml4QmFzZTxEZXJpdmVkPiYgdiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgIHJldHVybiBFaWdlbjo6VmVjdG9yQmxvY2s8RGVyaXZlZD4odi5kZXJpdmVkKCksIHN0YXJ0LCBlbmQgLSBzdGFydCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1jb25zdCBFaWdlbjo6VmVjdG9yQmxvY2s8Y29uc3QgRGVyaXZlZD4KLXNlZ21lbnRGcm9tUmFuZ2UoY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8RGVyaXZlZD4mIHYsIGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgcmV0dXJuIEVpZ2VuOjpWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkPih2LmRlcml2ZWQoKSwgc3RhcnQsIGVuZC1zdGFydCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2NvbnN0IEVpZ2VuOjpWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkPiBzZWdtZW50RnJvbVJhbmdlKGNvbnN0IEVpZ2VuOjpNYXRyaXhCYXNlPERlcml2ZWQ+JiB2LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgcmV0dXJuIEVpZ2VuOjpWZWN0b3JCbG9jazxjb25zdCBEZXJpdmVkPih2LmRlcml2ZWQoKSwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKIH0KIAotaW50IG1haW4oaW50LCBjaGFyKiopCi17Ci0gIEVpZ2VuOjpNYXRyaXg8aW50LDEsNj4gdjsgdiA8PCAxLDIsMyw0LDUsNjsKLSAgc3RkOjpjb3V0IDw8IHNlZ21lbnRGcm9tUmFuZ2UoMip2LCAyLCA0KSA8PCBzdGQ6OmVuZGw7IC8vIGNhbGxzIHRoZSBjb25zdCB2ZXJzaW9uCi0gIHNlZ21lbnRGcm9tUmFuZ2UodiwgMSwgMykgKj0gNTsgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBub24tY29uc3QgdmVyc2lvbgoraW50IG1haW4oaW50LCBjaGFyKiopIHsKKyAgRWlnZW46Ok1hdHJpeDxpbnQsIDEsIDY+IHY7CisgIHYgPDwgMSwgMiwgMywgNCwgNSwgNjsKKyAgc3RkOjpjb3V0IDw8IHNlZ21lbnRGcm9tUmFuZ2UoMiAqIHYsIDIsIDQpIDw8IHN0ZDo6ZW5kbDsgIC8vIGNhbGxzIHRoZSBjb25zdCB2ZXJzaW9uCisgIHNlZ21lbnRGcm9tUmFuZ2UodiwgMSwgMykgKj0gNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbm9uLWNvbnN0IHZlcnNpb24KICAgc3RkOjpjb3V0IDw8ICJOb3cgdGhlIHZlY3RvciB2IGlzOiIgPDwgc3RkOjplbmRsIDw8IHYgPDwgc3RkOjplbmRsOwogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9mdW5jdGlvbl90YWtpbmdfZWlnZW5iYXNlLmNwcCBiL2RvYy9leGFtcGxlcy9mdW5jdGlvbl90YWtpbmdfZWlnZW5iYXNlLmNwcAppbmRleCA0ZTFlNWE5Li41MjRlYTE4IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZnVuY3Rpb25fdGFraW5nX2VpZ2VuYmFzZS5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2Z1bmN0aW9uX3Rha2luZ19laWdlbmJhc2UuY3BwCkBAIC0yLDE2ICsyLDEzIEBACiAjaW5jbHVkZSA8RWlnZW4vQ29yZT4KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Ci12b2lkIHByaW50X3NpemUoY29uc3QgRWlnZW46OkVpZ2VuQmFzZTxEZXJpdmVkPiYgYikKLXsKLSAgc3RkOjpjb3V0IDw8ICJzaXplIChyb3dzLCBjb2xzKTogIiA8PCBiLnNpemUoKSA8PCAiICgiIDw8IGIucm93cygpCi0gICAgICAgICAgICA8PCAiLCAiIDw8IGIuY29scygpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Cit2b2lkIHByaW50X3NpemUoY29uc3QgRWlnZW46OkVpZ2VuQmFzZTxEZXJpdmVkPiYgYikgeworICBzdGQ6OmNvdXQgPDwgInNpemUgKHJvd3MsIGNvbHMpOiAiIDw8IGIuc2l6ZSgpIDw8ICIgKCIgPDwgYi5yb3dzKCkgPDwgIiwgIiA8PCBiLmNvbHMoKSA8PCAiKSIgPDwgc3RkOjplbmRsOwogfQogCi1pbnQgbWFpbigpCi17Ci0gICAgRWlnZW46OlZlY3RvcjNmIHY7Ci0gICAgcHJpbnRfc2l6ZSh2KTsKLSAgICAvLyB2LmFzRGlhZ29uYWwoKSByZXR1cm5zIGEgM3gzIGRpYWdvbmFsIG1hdHJpeCBwc2V1ZG8tZXhwcmVzc2lvbgotICAgIHByaW50X3NpemUodi5hc0RpYWdvbmFsKCkpOworaW50IG1haW4oKSB7CisgIEVpZ2VuOjpWZWN0b3IzZiB2OworICBwcmludF9zaXplKHYpOworICAvLyB2LmFzRGlhZ29uYWwoKSByZXR1cm5zIGEgM3gzIGRpYWdvbmFsIG1hdHJpeCBwc2V1ZG8tZXhwcmVzc2lvbgorICBwcmludF9zaXplKHYuYXNEaWFnb25hbCgpKTsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9mdW5jdGlvbl90YWtpbmdfcmVmLmNwcCBiL2RvYy9leGFtcGxlcy9mdW5jdGlvbl90YWtpbmdfcmVmLmNwcAppbmRleCBhODM3ZTE5Li44ZmQ4Yzc2IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZnVuY3Rpb25fdGFraW5nX3JlZi5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL2Z1bmN0aW9uX3Rha2luZ19yZWYuY3BwCkBAIC0xLDE3ICsxLDE1IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8RWlnZW4vU1ZEPgogCi1mbG9hdCBpbnZfY29uZChjb25zdCBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpNYXRyaXhYZj4mIGEpCi17CitmbG9hdCBpbnZfY29uZChjb25zdCBFaWdlbjo6UmVmPGNvbnN0IEVpZ2VuOjpNYXRyaXhYZj4mIGEpIHsKICAgY29uc3QgRWlnZW46OlZlY3RvclhmIHNpbmdfdmFscyA9IGEuamFjb2JpU3ZkKCkuc2luZ3VsYXJWYWx1ZXMoKTsKLSAgcmV0dXJuIHNpbmdfdmFscyhzaW5nX3ZhbHMuc2l6ZSgpLTEpIC8gc2luZ192YWxzKDApOworICByZXR1cm4gc2luZ192YWxzKHNpbmdfdmFscy5zaXplKCkgLSAxKSAvIHNpbmdfdmFscygwKTsKIH0KIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIEVpZ2VuOjpNYXRyaXhYZiBtID0gRWlnZW46Ok1hdHJpeFhmOjpSYW5kb20oNCwgNCk7CiAgIHN0ZDo6Y291dCA8PCAibWF0cml4IG06XG4iIDw8IG0gPDwgIlxuXG4iOwotICBzdGQ6OmNvdXQgPDwgImludl9jb25kKG0pOiAgICAgICAgICAiIDw8IGludl9jb25kKG0pICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiI7Ci0gIHN0ZDo6Y291dCA8PCAiaW52X2NvbmQobSgxOjMsMTozKSk6ICIgPDwgaW52X2NvbmQobS50b3BMZWZ0Q29ybmVyKDMsMykpICAgPDwgIlxuIjsKLSAgc3RkOjpjb3V0IDw8ICJpbnZfY29uZChtK0kpOiAgICAgICAgIiA8PCBpbnZfY29uZChtK0VpZ2VuOjpNYXRyaXhYZjo6SWRlbnRpdHkoNCwgNCkpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAiaW52X2NvbmQobSk6ICAgICAgICAgICIgPDwgaW52X2NvbmQobSkgPDwgIlxuIjsKKyAgc3RkOjpjb3V0IDw8ICJpbnZfY29uZChtKDE6MywxOjMpKTogIiA8PCBpbnZfY29uZChtLnRvcExlZnRDb3JuZXIoMywgMykpIDw8ICJcbiI7CisgIHN0ZDo6Y291dCA8PCAiaW52X2NvbmQobStJKTogICAgICAgICIgPDwgaW52X2NvbmQobSArIEVpZ2VuOjpNYXRyaXhYZjo6SWRlbnRpdHkoNCwgNCkpIDw8ICJcbiI7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLmVudHJ5IGIvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC5lbnRyeQppbmRleCBmOWQyZWI4Li5mNWU2OTEwIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLmVudHJ5CisrKyBiL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAuZW50cnkKQEAgLTEsNSArMSw0IEBACiB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZT4KLUNpcmN1bGFudDxBcmdUeXBlPiBtYWtlQ2lyY3VsYW50KGNvbnN0IEVpZ2VuOjpNYXRyaXhCYXNlPEFyZ1R5cGU+JiBhcmcpCi17CitDaXJjdWxhbnQ8QXJnVHlwZT4gbWFrZUNpcmN1bGFudChjb25zdCBFaWdlbjo6TWF0cml4QmFzZTxBcmdUeXBlPiYgYXJnKSB7CiAgIHJldHVybiBDaXJjdWxhbnQ8QXJnVHlwZT4oYXJnLmRlcml2ZWQoKSk7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLmV2YWx1YXRvciBiL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAuZXZhbHVhdG9yCmluZGV4IGNkNDYxYjkuLjMzMDRkODkgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAuZXZhbHVhdG9yCisrKyBiL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAuZXZhbHVhdG9yCkBAIC0xLDMyICsxLDI0IEBACiBuYW1lc3BhY2UgRWlnZW4gewotICBuYW1lc3BhY2UgaW50ZXJuYWwgewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGU+Ci0gICAgc3RydWN0IGV2YWx1YXRvcjxDaXJjdWxhbnQ8QXJnVHlwZT4gPgotICAgICAgOiBldmFsdWF0b3JfYmFzZTxDaXJjdWxhbnQ8QXJnVHlwZT4gPgotICAgIHsKLSAgICAgIHR5cGVkZWYgQ2lyY3VsYW50PEFyZ1R5cGU+IFhwclR5cGU7Ci0gICAgICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZF9ldmFsPEFyZ1R5cGUsIFhwclR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPjo6dHlwZSBBcmdUeXBlTmVzdGVkOwotICAgICAgdHlwZWRlZiByZW1vdmVfYWxsX3Q8QXJnVHlwZU5lc3RlZD4gQXJnVHlwZU5lc3RlZENsZWFuZWQ7Ci0gICAgICB0eXBlZGVmIHR5cGVuYW1lIFhwclR5cGU6OkNvZWZmUmV0dXJuVHlwZSBDb2VmZlJldHVyblR5cGU7CituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1R5cGU+CitzdHJ1Y3QgZXZhbHVhdG9yPENpcmN1bGFudDxBcmdUeXBlPiA+IDogZXZhbHVhdG9yX2Jhc2U8Q2lyY3VsYW50PEFyZ1R5cGU+ID4geworICB0eXBlZGVmIENpcmN1bGFudDxBcmdUeXBlPiBYcHJUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIG5lc3RlZF9ldmFsPEFyZ1R5cGUsIFhwclR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPjo6dHlwZSBBcmdUeXBlTmVzdGVkOworICB0eXBlZGVmIHJlbW92ZV9hbGxfdDxBcmdUeXBlTmVzdGVkPiBBcmdUeXBlTmVzdGVkQ2xlYW5lZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBYcHJUeXBlOjpDb2VmZlJldHVyblR5cGUgQ29lZmZSZXR1cm5UeXBlOwogCi0gICAgICBlbnVtIHsgCi0gICAgICAgIENvZWZmUmVhZENvc3QgPSBldmFsdWF0b3I8QXJnVHlwZU5lc3RlZENsZWFuZWQ+OjpDb2VmZlJlYWRDb3N0LAotICAgICAgICBGbGFncyA9IEVpZ2VuOjpDb2xNYWpvciAKLSAgICAgIH07Ci0gICAgICAKLSAgICAgIGV2YWx1YXRvcihjb25zdCBYcHJUeXBlJiB4cHIpCi0gICAgICAgIDogbV9hcmdJbXBsKHhwci5tX2FyZyksIG1fcm93cyh4cHIucm93cygpKQotICAgICAgeyB9CisgIGVudW0geyBDb2VmZlJlYWRDb3N0ID0gZXZhbHVhdG9yPEFyZ1R5cGVOZXN0ZWRDbGVhbmVkPjo6Q29lZmZSZWFkQ29zdCwgRmxhZ3MgPSBFaWdlbjo6Q29sTWFqb3IgfTsKIAotICAgICAgQ29lZmZSZXR1cm5UeXBlIGNvZWZmKEluZGV4IHJvdywgSW5kZXggY29sKSBjb25zdAotICAgICAgewotICAgICAgICBJbmRleCBpbmRleCA9IHJvdyAtIGNvbDsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgaW5kZXggKz0gbV9yb3dzOwotICAgICAgICByZXR1cm4gbV9hcmdJbXBsLmNvZWZmKGluZGV4KTsKLSAgICAgIH0KKyAgZXZhbHVhdG9yKGNvbnN0IFhwclR5cGUmIHhwcikgOiBtX2FyZ0ltcGwoeHByLm1fYXJnKSwgbV9yb3dzKHhwci5yb3dzKCkpIHt9CiAKLSAgICAgIGV2YWx1YXRvcjxBcmdUeXBlTmVzdGVkQ2xlYW5lZD4gbV9hcmdJbXBsOwotICAgICAgY29uc3QgSW5kZXggbV9yb3dzOwotICAgIH07CisgIENvZWZmUmV0dXJuVHlwZSBjb2VmZihJbmRleCByb3csIEluZGV4IGNvbCkgY29uc3QgeworICAgIEluZGV4IGluZGV4ID0gcm93IC0gY29sOworICAgIGlmIChpbmRleCA8IDApIGluZGV4ICs9IG1fcm93czsKKyAgICByZXR1cm4gbV9hcmdJbXBsLmNvZWZmKGluZGV4KTsKICAgfQotfQorCisgIGV2YWx1YXRvcjxBcmdUeXBlTmVzdGVkQ2xlYW5lZD4gbV9hcmdJbXBsOworICBjb25zdCBJbmRleCBtX3Jvd3M7Cit9OworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAuZXhwcmVzc2lvbiBiL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAuZXhwcmVzc2lvbgppbmRleCAzODBjZDQ0Li45ODY4YzFlIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLmV4cHJlc3Npb24KKysrIGIvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC5leHByZXNzaW9uCkBAIC0xLDE1ICsxLDExIEBACiB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZT4KLWNsYXNzIENpcmN1bGFudCA6IHB1YmxpYyBFaWdlbjo6TWF0cml4QmFzZTxDaXJjdWxhbnQ8QXJnVHlwZT4gPgotewotcHVibGljOgotICBDaXJjdWxhbnQoY29uc3QgQXJnVHlwZSYgYXJnKQotICAgIDogbV9hcmcoYXJnKQotICB7IAotICAgIEVJR0VOX1NUQVRJQ19BU1NFUlQoQXJnVHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFlPVV9UUklFRF9DQUxMSU5HX0FfVkVDVE9SX01FVEhPRF9PTl9BX01BVFJJWCk7CitjbGFzcyBDaXJjdWxhbnQgOiBwdWJsaWMgRWlnZW46Ok1hdHJpeEJhc2U8Q2lyY3VsYW50PEFyZ1R5cGU+ID4geworIHB1YmxpYzoKKyAgQ2lyY3VsYW50KGNvbnN0IEFyZ1R5cGUmIGFyZykgOiBtX2FyZyhhcmcpIHsKKyAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKEFyZ1R5cGU6OkNvbHNBdENvbXBpbGVUaW1lID09IDEsIFlPVV9UUklFRF9DQUxMSU5HX0FfVkVDVE9SX01FVEhPRF9PTl9BX01BVFJJWCk7CiAgIH0KIAotICB0eXBlZGVmIHR5cGVuYW1lIEVpZ2VuOjppbnRlcm5hbDo6cmVmX3NlbGVjdG9yPENpcmN1bGFudD46OnR5cGUgTmVzdGVkOyAKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnJlZl9zZWxlY3RvcjxDaXJjdWxhbnQ+Ojp0eXBlIE5lc3RlZDsKIAogICB0eXBlZGVmIEVpZ2VuOjpJbmRleCBJbmRleDsKICAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1fYXJnLnJvd3MoKTsgfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC5tYWluIGIvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC5tYWluCmluZGV4IDg3N2Y5N2YuLjBiNmQ5NDYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAubWFpbgorKysgYi9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLm1haW4KQEAgLTEsNSArMSw0IEBACi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgRWlnZW46OlZlY3RvclhkIHZlYyg0KTsKICAgdmVjIDw8IDEsIDIsIDQsIDg7CiAgIEVpZ2VuOjpNYXRyaXhYZCBtYXQ7CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLnByZWFtYmxlIGIvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC5wcmVhbWJsZQppbmRleCBlNTc1Y2NlLi44OTA2MDMzIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLnByZWFtYmxlCisrKyBiL2RvYy9leGFtcGxlcy9tYWtlX2NpcmN1bGFudC5jcHAucHJlYW1ibGUKQEAgLTEsNCArMSw1IEBACiAjaW5jbHVkZSA8RWlnZW4vQ29yZT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAotdGVtcGxhdGUgPGNsYXNzIEFyZ1R5cGU+IGNsYXNzIENpcmN1bGFudDsKK3RlbXBsYXRlIDxjbGFzcyBBcmdUeXBlPgorY2xhc3MgQ2lyY3VsYW50OwpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50LmNwcC50cmFpdHMgYi9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLnRyYWl0cwppbmRleCA0ZTA0NTM1Li4yZDVlNDFiIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLnRyYWl0cworKysgYi9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQuY3BwLnRyYWl0cwpAQCAtMSwxOSArMSwxOCBAQAogbmFtZXNwYWNlIEVpZ2VuIHsKLSAgbmFtZXNwYWNlIGludGVybmFsIHsKLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZT4KLSAgICBzdHJ1Y3QgdHJhaXRzPENpcmN1bGFudDxBcmdUeXBlPiA+Ci0gICAgewotICAgICAgdHlwZWRlZiBFaWdlbjo6RGVuc2UgU3RvcmFnZUtpbmQ7Ci0gICAgICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXhYcHIgWHByS2luZDsKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQXJnVHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQXJnVHlwZTo6U2NhbGFyIFNjYWxhcjsKLSAgICAgIGVudW0geyAKLSAgICAgICAgRmxhZ3MgPSBFaWdlbjo6Q29sTWFqb3IsCi0gICAgICAgIFJvd3NBdENvbXBpbGVUaW1lID0gQXJnVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCi0gICAgICAgIENvbHNBdENvbXBpbGVUaW1lID0gQXJnVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCi0gICAgICAgIE1heFJvd3NBdENvbXBpbGVUaW1lID0gQXJnVHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUsCi0gICAgICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gQXJnVHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUKLSAgICAgIH07Ci0gICAgfTsKLSAgfQotfQorbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlIDxjbGFzcyBBcmdUeXBlPgorc3RydWN0IHRyYWl0czxDaXJjdWxhbnQ8QXJnVHlwZT4gPiB7CisgIHR5cGVkZWYgRWlnZW46OkRlbnNlIFN0b3JhZ2VLaW5kOworICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXhYcHIgWHByS2luZDsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBcmdUeXBlOjpTdG9yYWdlSW5kZXggU3RvcmFnZUluZGV4OworICB0eXBlZGVmIHR5cGVuYW1lIEFyZ1R5cGU6OlNjYWxhciBTY2FsYXI7CisgIGVudW0geworICAgIEZsYWdzID0gRWlnZW46OkNvbE1ham9yLAorICAgIFJvd3NBdENvbXBpbGVUaW1lID0gQXJnVHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCisgICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBBcmdUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBNYXhSb3dzQXRDb21waWxlVGltZSA9IEFyZ1R5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lLAorICAgIE1heENvbHNBdENvbXBpbGVUaW1lID0gQXJnVHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUKKyAgfTsKK307Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL21ha2VfY2lyY3VsYW50Mi5jcHAgYi9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQyLmNwcAppbmRleCBkODZhNjZiLi5iM2JiY2ZjIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQyLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvbWFrZV9jaXJjdWxhbnQyLmNwcApAQCAtMiwxMyArMiwxNCBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgogCiAvLyBbY2lyY3VsYW50X2Z1bmNdCi10ZW1wbGF0ZTxjbGFzcyBBcmdUeXBlPgordGVtcGxhdGUgPGNsYXNzIEFyZ1R5cGU+CiBjbGFzcyBjaXJjdWxhbnRfZnVuY3RvciB7Ci0gIGNvbnN0IEFyZ1R5cGUgJm1fdmVjOwotcHVibGljOgorICBjb25zdCBBcmdUeXBlJiBtX3ZlYzsKKworIHB1YmxpYzoKICAgY2lyY3VsYW50X2Z1bmN0b3IoY29uc3QgQXJnVHlwZSYgYXJnKSA6IG1fdmVjKGFyZykge30KIAotICBjb25zdCB0eXBlbmFtZSBBcmdUeXBlOjpTY2FsYXImIG9wZXJhdG9yKCkgKEVpZ2VuOjpJbmRleCByb3csIEVpZ2VuOjpJbmRleCBjb2wpIGNvbnN0IHsKKyAgY29uc3QgdHlwZW5hbWUgQXJnVHlwZTo6U2NhbGFyJiBvcGVyYXRvcigpKEVpZ2VuOjpJbmRleCByb3csIEVpZ2VuOjpJbmRleCBjb2wpIGNvbnN0IHsKICAgICBFaWdlbjo6SW5kZXggaW5kZXggPSByb3cgLSBjb2w7CiAgICAgaWYgKGluZGV4IDwgMCkgaW5kZXggKz0gbV92ZWMuc2l6ZSgpOwogICAgIHJldHVybiBtX3ZlYyhpbmRleCk7CkBAIC0xNywzMCArMTgsMjUgQEAKIC8vIFtjaXJjdWxhbnRfZnVuY10KIAogLy8gW3NxdWFyZV0KLXRlbXBsYXRlPGNsYXNzIEFyZ1R5cGU+Cit0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZT4KIHN0cnVjdCBjaXJjdWxhbnRfaGVscGVyIHsKLSAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PHR5cGVuYW1lIEFyZ1R5cGU6OlNjYWxhciwKLSAgICAgICAgICAgICAgICAgQXJnVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsCi0gICAgICAgICAgICAgICAgIEFyZ1R5cGU6OlNpemVBdENvbXBpbGVUaW1lLAotICAgICAgICAgICAgICAgICBFaWdlbjo6Q29sTWFqb3IsCi0gICAgICAgICAgICAgICAgIEFyZ1R5cGU6Ok1heFNpemVBdENvbXBpbGVUaW1lLAotICAgICAgICAgICAgICAgICBBcmdUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZT4gTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PHR5cGVuYW1lIEFyZ1R5cGU6OlNjYWxhciwgQXJnVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsIEFyZ1R5cGU6OlNpemVBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgRWlnZW46OkNvbE1ham9yLCBBcmdUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZSwgQXJnVHlwZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWU+CisgICAgICBNYXRyaXhUeXBlOwogfTsKIC8vIFtzcXVhcmVdCiAKIC8vIFttYWtlQ2lyY3VsYW50XQogdGVtcGxhdGUgPGNsYXNzIEFyZ1R5cGU+Ci1FaWdlbjo6Q3dpc2VOdWxsYXJ5T3A8Y2lyY3VsYW50X2Z1bmN0b3I8QXJnVHlwZT4sIHR5cGVuYW1lIGNpcmN1bGFudF9oZWxwZXI8QXJnVHlwZT46Ok1hdHJpeFR5cGU+Ci1tYWtlQ2lyY3VsYW50KGNvbnN0IEVpZ2VuOjpNYXRyaXhCYXNlPEFyZ1R5cGU+JiBhcmcpCi17CitFaWdlbjo6Q3dpc2VOdWxsYXJ5T3A8Y2lyY3VsYW50X2Z1bmN0b3I8QXJnVHlwZT4sIHR5cGVuYW1lIGNpcmN1bGFudF9oZWxwZXI8QXJnVHlwZT46Ok1hdHJpeFR5cGU+IG1ha2VDaXJjdWxhbnQoCisgICAgY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8QXJnVHlwZT4mIGFyZykgewogICB0eXBlZGVmIHR5cGVuYW1lIGNpcmN1bGFudF9oZWxwZXI8QXJnVHlwZT46Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKICAgcmV0dXJuIE1hdHJpeFR5cGU6Ok51bGxhcnlFeHByKGFyZy5zaXplKCksIGFyZy5zaXplKCksIGNpcmN1bGFudF9mdW5jdG9yPEFyZ1R5cGU+KGFyZy5kZXJpdmVkKCkpKTsKIH0KIC8vIFttYWtlQ2lyY3VsYW50XQogCiAvLyBbbWFpbl0KLWludCBtYWluKCkKLXsKK2ludCBtYWluKCkgewogICBFaWdlbjo6VmVjdG9yWGQgdmVjKDQpOwogICB2ZWMgPDwgMSwgMiwgNCwgODsKICAgRWlnZW46Ok1hdHJpeFhkIG1hdDsKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9tYXRyaXhmcmVlX2NnLmNwcCBiL2RvYy9leGFtcGxlcy9tYXRyaXhmcmVlX2NnLmNwcAppbmRleCBjYzBlZWFkLi42NmYyYzI3IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvbWF0cml4ZnJlZV9jZy5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL21hdHJpeGZyZWVfY2cuY3BwCkBAIC05LDgxICs5LDcwIEBACiAKIG5hbWVzcGFjZSBFaWdlbiB7CiBuYW1lc3BhY2UgaW50ZXJuYWwgewotICAvLyBNYXRyaXhSZXBsYWNlbWVudCBsb29rcy1saWtlIGEgU3BhcnNlTWF0cml4LCBzbyBsZXQncyBpbmhlcml0IGl0cyB0cmFpdHM6Ci0gIHRlbXBsYXRlPD4KLSAgc3RydWN0IHRyYWl0czxNYXRyaXhSZXBsYWNlbWVudD4gOiAgcHVibGljIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPEVpZ2VuOjpTcGFyc2VNYXRyaXg8ZG91YmxlPiA+Ci0gIHt9OwotfQotfQorLy8gTWF0cml4UmVwbGFjZW1lbnQgbG9va3MtbGlrZSBhIFNwYXJzZU1hdHJpeCwgc28gbGV0J3MgaW5oZXJpdCBpdHMgdHJhaXRzOgordGVtcGxhdGUgPD4KK3N0cnVjdCB0cmFpdHM8TWF0cml4UmVwbGFjZW1lbnQ+IDogcHVibGljIEVpZ2VuOjppbnRlcm5hbDo6dHJhaXRzPEVpZ2VuOjpTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IHt9OworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KIAogLy8gRXhhbXBsZSBvZiBhIG1hdHJpeC1mcmVlIHdyYXBwZXIgZnJvbSBhIHVzZXIgdHlwZSB0byBFaWdlbidzIGNvbXBhdGlibGUgdHlwZQogLy8gRm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHksIHRoaXMgZXhhbXBsZSBzaW1wbHkgd3JhcCBhIEVpZ2VuOjpTcGFyc2VNYXRyaXguCiBjbGFzcyBNYXRyaXhSZXBsYWNlbWVudCA6IHB1YmxpYyBFaWdlbjo6RWlnZW5CYXNlPE1hdHJpeFJlcGxhY2VtZW50PiB7Ci1wdWJsaWM6CisgcHVibGljOgogICAvLyBSZXF1aXJlZCB0eXBlZGVmcywgY29uc3RhbnRzLCBhbmQgbWV0aG9kOgogICB0eXBlZGVmIGRvdWJsZSBTY2FsYXI7CiAgIHR5cGVkZWYgZG91YmxlIFJlYWxTY2FsYXI7CiAgIHR5cGVkZWYgaW50IFN0b3JhZ2VJbmRleDsKLSAgZW51bSB7Ci0gICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBFaWdlbjo6RHluYW1pYywKLSAgICBNYXhDb2xzQXRDb21waWxlVGltZSA9IEVpZ2VuOjpEeW5hbWljLAotICAgIElzUm93TWFqb3IgPSBmYWxzZQotICB9OworICBlbnVtIHsgQ29sc0F0Q29tcGlsZVRpbWUgPSBFaWdlbjo6RHluYW1pYywgTWF4Q29sc0F0Q29tcGlsZVRpbWUgPSBFaWdlbjo6RHluYW1pYywgSXNSb3dNYWpvciA9IGZhbHNlIH07CiAKICAgSW5kZXggcm93cygpIGNvbnN0IHsgcmV0dXJuIG1wX21hdC0+cm93cygpOyB9CiAgIEluZGV4IGNvbHMoKSBjb25zdCB7IHJldHVybiBtcF9tYXQtPmNvbHMoKTsgfQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFJocz4KLSAgRWlnZW46OlByb2R1Y3Q8TWF0cml4UmVwbGFjZW1lbnQsUmhzLEVpZ2VuOjpBbGlhc0ZyZWVQcm9kdWN0PiBvcGVyYXRvciooY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8UmhzPiYgeCkgY29uc3QgewotICAgIHJldHVybiBFaWdlbjo6UHJvZHVjdDxNYXRyaXhSZXBsYWNlbWVudCxSaHMsRWlnZW46OkFsaWFzRnJlZVByb2R1Y3Q+KCp0aGlzLCB4LmRlcml2ZWQoKSk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSaHM+CisgIEVpZ2VuOjpQcm9kdWN0PE1hdHJpeFJlcGxhY2VtZW50LCBSaHMsIEVpZ2VuOjpBbGlhc0ZyZWVQcm9kdWN0PiBvcGVyYXRvciooY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8UmhzPiYgeCkgY29uc3QgeworICAgIHJldHVybiBFaWdlbjo6UHJvZHVjdDxNYXRyaXhSZXBsYWNlbWVudCwgUmhzLCBFaWdlbjo6QWxpYXNGcmVlUHJvZHVjdD4oKnRoaXMsIHguZGVyaXZlZCgpKTsKICAgfQogCiAgIC8vIEN1c3RvbSBBUEk6CiAgIE1hdHJpeFJlcGxhY2VtZW50KCkgOiBtcF9tYXQoMCkge30KIAotICB2b2lkIGF0dGFjaE15TWF0cml4KGNvbnN0IFNwYXJzZU1hdHJpeDxkb3VibGU+ICZtYXQpIHsKLSAgICBtcF9tYXQgPSAmbWF0OwotICB9CisgIHZvaWQgYXR0YWNoTXlNYXRyaXgoY29uc3QgU3BhcnNlTWF0cml4PGRvdWJsZT4mIG1hdCkgeyBtcF9tYXQgPSAmbWF0OyB9CiAgIGNvbnN0IFNwYXJzZU1hdHJpeDxkb3VibGU+IG15X21hdHJpeCgpIGNvbnN0IHsgcmV0dXJuICptcF9tYXQ7IH0KIAotcHJpdmF0ZToKLSAgY29uc3QgU3BhcnNlTWF0cml4PGRvdWJsZT4gKm1wX21hdDsKKyBwcml2YXRlOgorICBjb25zdCBTcGFyc2VNYXRyaXg8ZG91YmxlPiogbXBfbWF0OwogfTsKIAotCiAvLyBJbXBsZW1lbnRhdGlvbiBvZiBNYXRyaXhSZXBsYWNlbWVudCAqIEVpZ2VuOjpEZW5zZVZlY3RvciB0aG91Z2ggYSBzcGVjaWFsaXphdGlvbiBvZiBpbnRlcm5hbDo6Z2VuZXJpY19wcm9kdWN0X2ltcGw6CiBuYW1lc3BhY2UgRWlnZW4gewogbmFtZXNwYWNlIGludGVybmFsIHsKIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHM+Ci0gIHN0cnVjdCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxNYXRyaXhSZXBsYWNlbWVudCwgUmhzLCBTcGFyc2VTaGFwZSwgRGVuc2VTaGFwZSwgR2VtdlByb2R1Y3Q+IC8vIEdFTVYgc3RhbmRzIGZvciBtYXRyaXgtdmVjdG9yCi0gIDogZ2VuZXJpY19wcm9kdWN0X2ltcGxfYmFzZTxNYXRyaXhSZXBsYWNlbWVudCxSaHMsZ2VuZXJpY19wcm9kdWN0X2ltcGw8TWF0cml4UmVwbGFjZW1lbnQsUmhzPiA+Ci0gIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFByb2R1Y3Q8TWF0cml4UmVwbGFjZW1lbnQsUmhzPjo6U2NhbGFyIFNjYWxhcjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBSaHM+CitzdHJ1Y3QgZ2VuZXJpY19wcm9kdWN0X2ltcGw8TWF0cml4UmVwbGFjZW1lbnQsIFJocywgU3BhcnNlU2hhcGUsIERlbnNlU2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VtdlByb2R1Y3Q+ICAvLyBHRU1WIHN0YW5kcyBmb3IgbWF0cml4LXZlY3RvcgorICAgIDogZ2VuZXJpY19wcm9kdWN0X2ltcGxfYmFzZTxNYXRyaXhSZXBsYWNlbWVudCwgUmhzLCBnZW5lcmljX3Byb2R1Y3RfaW1wbDxNYXRyaXhSZXBsYWNlbWVudCwgUmhzPiA+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBQcm9kdWN0PE1hdHJpeFJlcGxhY2VtZW50LCBSaHM+OjpTY2FsYXIgU2NhbGFyOwogCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgRGVzdD4KLSAgICBzdGF0aWMgdm9pZCBzY2FsZUFuZEFkZFRvKERlc3QmIGRzdCwgY29uc3QgTWF0cml4UmVwbGFjZW1lbnQmIGxocywgY29uc3QgUmhzJiByaHMsIGNvbnN0IFNjYWxhciYgYWxwaGEpCi0gICAgewotICAgICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGltcGxlbWVudCAiZHN0ICs9IGFscGhhICogbGhzICogcmhzIiBpbnBsYWNlLAotICAgICAgLy8gaG93ZXZlciwgZm9yIGl0ZXJhdGl2ZSBzb2x2ZXJzLCBhbHBoYSBpcyBhbHdheXMgZXF1YWwgdG8gMSwgc28gbGV0J3Mgbm90IGJvdGhlciBhYm91dCBpdC4KLSAgICAgIGVpZ2VuX2Fzc2VydChhbHBoYT09U2NhbGFyKDEpICYmICJzY2FsaW5nIGlzIG5vdCBpbXBsZW1lbnRlZCIpOwotICAgICAgRUlHRU5fT05MWV9VU0VEX0ZPUl9ERUJVRyhhbHBoYSk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXN0PgorICBzdGF0aWMgdm9pZCBzY2FsZUFuZEFkZFRvKERlc3QmIGRzdCwgY29uc3QgTWF0cml4UmVwbGFjZW1lbnQmIGxocywgY29uc3QgUmhzJiByaHMsIGNvbnN0IFNjYWxhciYgYWxwaGEpIHsKKyAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgaW1wbGVtZW50ICJkc3QgKz0gYWxwaGEgKiBsaHMgKiByaHMiIGlucGxhY2UsCisgICAgLy8gaG93ZXZlciwgZm9yIGl0ZXJhdGl2ZSBzb2x2ZXJzLCBhbHBoYSBpcyBhbHdheXMgZXF1YWwgdG8gMSwgc28gbGV0J3Mgbm90IGJvdGhlciBhYm91dCBpdC4KKyAgICBlaWdlbl9hc3NlcnQoYWxwaGEgPT0gU2NhbGFyKDEpICYmICJzY2FsaW5nIGlzIG5vdCBpbXBsZW1lbnRlZCIpOworICAgIEVJR0VOX09OTFlfVVNFRF9GT1JfREVCVUcoYWxwaGEpOwogCi0gICAgICAvLyBIZXJlIHdlIGNvdWxkIHNpbXBseSBjYWxsIGRzdC5ub2FsaWFzKCkgKz0gbGhzLm15X21hdHJpeCgpICogcmhzLAotICAgICAgLy8gYnV0IGxldCdzIGRvIHNvbWV0aGluZyBmYW5jaWVyIChhbmQgbGVzcyBlZmZpY2llbnQpOgotICAgICAgZm9yKEluZGV4IGk9MDsgaTxsaHMuY29scygpOyArK2kpCi0gICAgICAgIGRzdCArPSByaHMoaSkgKiBsaHMubXlfbWF0cml4KCkuY29sKGkpOwotICAgIH0KLSAgfTsKKyAgICAvLyBIZXJlIHdlIGNvdWxkIHNpbXBseSBjYWxsIGRzdC5ub2FsaWFzKCkgKz0gbGhzLm15X21hdHJpeCgpICogcmhzLAorICAgIC8vIGJ1dCBsZXQncyBkbyBzb21ldGhpbmcgZmFuY2llciAoYW5kIGxlc3MgZWZmaWNpZW50KToKKyAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbGhzLmNvbHMoKTsgKytpKSBkc3QgKz0gcmhzKGkpICogbGhzLm15X21hdHJpeCgpLmNvbChpKTsKKyAgfQorfTsKIAotfQotfQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIGludCBuID0gMTA7Ci0gIEVpZ2VuOjpTcGFyc2VNYXRyaXg8ZG91YmxlPiBTID0gRWlnZW46Ok1hdHJpeFhkOjpSYW5kb20obixuKS5zcGFyc2VWaWV3KDAuNSwxKTsKLSAgUyA9IFMudHJhbnNwb3NlKCkqUzsKKyAgRWlnZW46OlNwYXJzZU1hdHJpeDxkb3VibGU+IFMgPSBFaWdlbjo6TWF0cml4WGQ6OlJhbmRvbShuLCBuKS5zcGFyc2VWaWV3KDAuNSwgMSk7CisgIFMgPSBTLnRyYW5zcG9zZSgpICogUzsKIAogICBNYXRyaXhSZXBsYWNlbWVudCBBOwogICBBLmF0dGFjaE15TWF0cml4KFMpOwpAQCAtOTMsNyArODIsNyBAQAogCiAgIC8vIFNvbHZlIEF4ID0gYiB1c2luZyB2YXJpb3VzIGl0ZXJhdGl2ZSBzb2x2ZXIgd2l0aCBtYXRyaXgtZnJlZSB2ZXJzaW9uOgogICB7Ci0gICAgRWlnZW46OkNvbmp1Z2F0ZUdyYWRpZW50PE1hdHJpeFJlcGxhY2VtZW50LCBFaWdlbjo6TG93ZXJ8RWlnZW46OlVwcGVyLCBFaWdlbjo6SWRlbnRpdHlQcmVjb25kaXRpb25lcj4gY2c7CisgICAgRWlnZW46OkNvbmp1Z2F0ZUdyYWRpZW50PE1hdHJpeFJlcGxhY2VtZW50LCBFaWdlbjo6TG93ZXIgfCBFaWdlbjo6VXBwZXIsIEVpZ2VuOjpJZGVudGl0eVByZWNvbmRpdGlvbmVyPiBjZzsKICAgICBjZy5jb21wdXRlKEEpOwogICAgIHggPSBjZy5zb2x2ZShiKTsKICAgICBzdGQ6OmNvdXQgPDwgIkNHOiAgICAgICAjaXRlcmF0aW9uczogIiA8PCBjZy5pdGVyYXRpb25zKCkgPDwgIiwgZXN0aW1hdGVkIGVycm9yOiAiIDw8IGNnLmVycm9yKCkgPDwgc3RkOjplbmRsOwpAQCAtMTIxLDkgKzExMCwxMCBAQAogICB9CiAKICAgewotICAgIEVpZ2VuOjpNSU5SRVM8TWF0cml4UmVwbGFjZW1lbnQsIEVpZ2VuOjpMb3dlcnxFaWdlbjo6VXBwZXIsIEVpZ2VuOjpJZGVudGl0eVByZWNvbmRpdGlvbmVyPiBtaW5yZXM7CisgICAgRWlnZW46Ok1JTlJFUzxNYXRyaXhSZXBsYWNlbWVudCwgRWlnZW46Okxvd2VyIHwgRWlnZW46OlVwcGVyLCBFaWdlbjo6SWRlbnRpdHlQcmVjb25kaXRpb25lcj4gbWlucmVzOwogICAgIG1pbnJlcy5jb21wdXRlKEEpOwogICAgIHggPSBtaW5yZXMuc29sdmUoYik7Ci0gICAgc3RkOjpjb3V0IDw8ICJNSU5SRVM6ICAgI2l0ZXJhdGlvbnM6ICIgPDwgbWlucmVzLml0ZXJhdGlvbnMoKSA8PCAiLCBlc3RpbWF0ZWQgZXJyb3I6ICIgPDwgbWlucmVzLmVycm9yKCkgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAiTUlOUkVTOiAgICNpdGVyYXRpb25zOiAiIDw8IG1pbnJlcy5pdGVyYXRpb25zKCkgPDwgIiwgZXN0aW1hdGVkIGVycm9yOiAiIDw8IG1pbnJlcy5lcnJvcigpCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL251bGxhcnlfaW5kZXhpbmcuY3BwIGIvZG9jL2V4YW1wbGVzL251bGxhcnlfaW5kZXhpbmcuY3BwCmluZGV4IDM4MjYwYWYuLmY5OGU2OTAgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9udWxsYXJ5X2luZGV4aW5nLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvbnVsbGFyeV9pbmRleGluZy5jcHAKQEAgLTIsMjQgKzIsMjIgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KIAogLy8gW2Z1bmN0b3JdCi10ZW1wbGF0ZTxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSb3dJbmRleFR5cGUsIGNsYXNzIENvbEluZGV4VHlwZT4KK3RlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSb3dJbmRleFR5cGUsIGNsYXNzIENvbEluZGV4VHlwZT4KIGNsYXNzIGluZGV4aW5nX2Z1bmN0b3IgewotICBjb25zdCBBcmdUeXBlICZtX2FyZzsKLSAgY29uc3QgUm93SW5kZXhUeXBlICZtX3Jvd0luZGljZXM7Ci0gIGNvbnN0IENvbEluZGV4VHlwZSAmbV9jb2xJbmRpY2VzOwotcHVibGljOgotICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8dHlwZW5hbWUgQXJnVHlwZTo6U2NhbGFyLAotICAgICAgICAgICAgICAgICBSb3dJbmRleFR5cGU6OlNpemVBdENvbXBpbGVUaW1lLAotICAgICAgICAgICAgICAgICBDb2xJbmRleFR5cGU6OlNpemVBdENvbXBpbGVUaW1lLAotICAgICAgICAgICAgICAgICBBcmdUeXBlOjpGbGFncyZFaWdlbjo6Um93TWFqb3JCaXQ/RWlnZW46OlJvd01ham9yOkVpZ2VuOjpDb2xNYWpvciwKLSAgICAgICAgICAgICAgICAgUm93SW5kZXhUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZSwKLSAgICAgICAgICAgICAgICAgQ29sSW5kZXhUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZT4gTWF0cml4VHlwZTsKKyAgY29uc3QgQXJnVHlwZSYgbV9hcmc7CisgIGNvbnN0IFJvd0luZGV4VHlwZSYgbV9yb3dJbmRpY2VzOworICBjb25zdCBDb2xJbmRleFR5cGUmIG1fY29sSW5kaWNlczsKKworIHB1YmxpYzoKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PHR5cGVuYW1lIEFyZ1R5cGU6OlNjYWxhciwgUm93SW5kZXhUeXBlOjpTaXplQXRDb21waWxlVGltZSwgQ29sSW5kZXhUeXBlOjpTaXplQXRDb21waWxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1R5cGU6OkZsYWdzICYgRWlnZW46OlJvd01ham9yQml0ID8gRWlnZW46OlJvd01ham9yIDogRWlnZW46OkNvbE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgUm93SW5kZXhUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZSwgQ29sSW5kZXhUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZT4KKyAgICAgIE1hdHJpeFR5cGU7CiAKICAgaW5kZXhpbmdfZnVuY3Rvcihjb25zdCBBcmdUeXBlJiBhcmcsIGNvbnN0IFJvd0luZGV4VHlwZSYgcm93X2luZGljZXMsIGNvbnN0IENvbEluZGV4VHlwZSYgY29sX2luZGljZXMpCi0gICAgOiBtX2FyZyhhcmcpLCBtX3Jvd0luZGljZXMocm93X2luZGljZXMpLCBtX2NvbEluZGljZXMoY29sX2luZGljZXMpCi0gIHt9CisgICAgICA6IG1fYXJnKGFyZyksIG1fcm93SW5kaWNlcyhyb3dfaW5kaWNlcyksIG1fY29sSW5kaWNlcyhjb2xfaW5kaWNlcykge30KIAotICBjb25zdCB0eXBlbmFtZSBBcmdUeXBlOjpTY2FsYXImIG9wZXJhdG9yKCkgKEVpZ2VuOjpJbmRleCByb3csIEVpZ2VuOjpJbmRleCBjb2wpIGNvbnN0IHsKKyAgY29uc3QgdHlwZW5hbWUgQXJnVHlwZTo6U2NhbGFyJiBvcGVyYXRvcigpKEVpZ2VuOjpJbmRleCByb3csIEVpZ2VuOjpJbmRleCBjb2wpIGNvbnN0IHsKICAgICByZXR1cm4gbV9hcmcobV9yb3dJbmRpY2VzW3Jvd10sIG1fY29sSW5kaWNlc1tjb2xdKTsKICAgfQogfTsKQEAgLTI3LDIyICsyNSwyMSBAQAogCiAvLyBbZnVuY3Rpb25dCiB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZSwgY2xhc3MgUm93SW5kZXhUeXBlLCBjbGFzcyBDb2xJbmRleFR5cGU+Ci1FaWdlbjo6Q3dpc2VOdWxsYXJ5T3A8aW5kZXhpbmdfZnVuY3RvcjxBcmdUeXBlLFJvd0luZGV4VHlwZSxDb2xJbmRleFR5cGU+LCB0eXBlbmFtZSBpbmRleGluZ19mdW5jdG9yPEFyZ1R5cGUsUm93SW5kZXhUeXBlLENvbEluZGV4VHlwZT46Ok1hdHJpeFR5cGU+Ci1tYXRfaW5kZXhpbmcoY29uc3QgRWlnZW46Ok1hdHJpeEJhc2U8QXJnVHlwZT4mIGFyZywgY29uc3QgUm93SW5kZXhUeXBlJiByb3dfaW5kaWNlcywgY29uc3QgQ29sSW5kZXhUeXBlJiBjb2xfaW5kaWNlcykKLXsKLSAgdHlwZWRlZiBpbmRleGluZ19mdW5jdG9yPEFyZ1R5cGUsUm93SW5kZXhUeXBlLENvbEluZGV4VHlwZT4gRnVuYzsKK0VpZ2VuOjpDd2lzZU51bGxhcnlPcDxpbmRleGluZ19mdW5jdG9yPEFyZ1R5cGUsIFJvd0luZGV4VHlwZSwgQ29sSW5kZXhUeXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbmRleGluZ19mdW5jdG9yPEFyZ1R5cGUsIFJvd0luZGV4VHlwZSwgQ29sSW5kZXhUeXBlPjo6TWF0cml4VHlwZT4KK21hdF9pbmRleGluZyhjb25zdCBFaWdlbjo6TWF0cml4QmFzZTxBcmdUeXBlPiYgYXJnLCBjb25zdCBSb3dJbmRleFR5cGUmIHJvd19pbmRpY2VzLCBjb25zdCBDb2xJbmRleFR5cGUmIGNvbF9pbmRpY2VzKSB7CisgIHR5cGVkZWYgaW5kZXhpbmdfZnVuY3RvcjxBcmdUeXBlLCBSb3dJbmRleFR5cGUsIENvbEluZGV4VHlwZT4gRnVuYzsKICAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CiAgIHJldHVybiBNYXRyaXhUeXBlOjpOdWxsYXJ5RXhwcihyb3dfaW5kaWNlcy5zaXplKCksIGNvbF9pbmRpY2VzLnNpemUoKSwgRnVuYyhhcmcuZGVyaXZlZCgpLCByb3dfaW5kaWNlcywgY29sX2luZGljZXMpKTsKIH0KIC8vIFtmdW5jdGlvbl0KIAotCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgc3RkOjpjb3V0IDw8ICJbbWFpbjFdXG4iOwotICBFaWdlbjo6TWF0cml4WGkgQSA9IEVpZ2VuOjpNYXRyaXhYaTo6UmFuZG9tKDQsNCk7Ci0gIEVpZ2VuOjpBcnJheTNpIHJpKDEsMiwxKTsKLSAgRWlnZW46OkFycmF5WGkgY2koNik7IGNpIDw8IDMsMiwxLDAsMCwyOworICBFaWdlbjo6TWF0cml4WGkgQSA9IEVpZ2VuOjpNYXRyaXhYaTo6UmFuZG9tKDQsIDQpOworICBFaWdlbjo6QXJyYXkzaSByaSgxLCAyLCAxKTsKKyAgRWlnZW46OkFycmF5WGkgY2koNik7CisgIGNpIDw8IDMsIDIsIDEsIDAsIDAsIDI7CiAgIEVpZ2VuOjpNYXRyaXhYaSBCID0gbWF0X2luZGV4aW5nKEEsIHJpLCBjaSk7CiAgIHN0ZDo6Y291dCA8PCAiQSA9IiA8PCBzdGQ6OmVuZGw7CiAgIHN0ZDo6Y291dCA8PCBBIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CkBAIC01MSwxMiArNDgsMTMgQEAKICAgc3RkOjpjb3V0IDw8ICJbbWFpbjFdXG4iOwogCiAgIHN0ZDo6Y291dCA8PCAiW21haW4yXVxuIjsKLSAgQiA9ICBtYXRfaW5kZXhpbmcoQSwgcmkrMSwgY2kpOworICBCID0gbWF0X2luZGV4aW5nKEEsIHJpICsgMSwgY2kpOwogICBzdGQ6OmNvdXQgPDwgIkEocmkrMSxjaSkgPSIgPDwgc3RkOjplbmRsOwogICBzdGQ6OmNvdXQgPDwgQiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOwotICBCID0gIG1hdF9pbmRleGluZyhBLCBFaWdlbjo6QXJyYXlYaTo6TGluU3BhY2VkKDEzLDAsMTIpLnVuYXJ5RXhwcihbXShpbnQgeCl7cmV0dXJuIHglNDt9KSwgRWlnZW46OkFycmF5WGk6OkxpblNwYWNlZCg0LDAsMykpOwotICBzdGQ6OmNvdXQgPDwgIkEoQXJyYXlYaTo6TGluU3BhY2VkKDEzLDAsMTIpLnVuYXJ5RXhwcihbXShpbnQgeCl7cmV0dXJuIHglNDt9KSwgQXJyYXlYaTo6TGluU3BhY2VkKDQsMCwzKSkgPSIgPDwgc3RkOjplbmRsOworICBCID0gbWF0X2luZGV4aW5nKEEsIEVpZ2VuOjpBcnJheVhpOjpMaW5TcGFjZWQoMTMsIDAsIDEyKS51bmFyeUV4cHIoW10oaW50IHgpIHsgcmV0dXJuIHggJSA0OyB9KSwKKyAgICAgICAgICAgICAgICAgICBFaWdlbjo6QXJyYXlYaTo6TGluU3BhY2VkKDQsIDAsIDMpKTsKKyAgc3RkOjpjb3V0IDw8ICJBKEFycmF5WGk6OkxpblNwYWNlZCgxMywwLDEyKS51bmFyeUV4cHIoW10oaW50IHgpe3JldHVybiB4JTQ7fSksIEFycmF5WGk6OkxpblNwYWNlZCg0LDAsMykpID0iCisgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CiAgIHN0ZDo6Y291dCA8PCBCIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CiAgIHN0ZDo6Y291dCA8PCAiW21haW4yXVxuIjsKIH0KLQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX2FkZF9zdWIuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX2FkZF9zdWIuY3BwCmluZGV4IDk1MTYyYzAuLmNlYjQzY2EgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19hZGRfc3ViLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfYWRkX3N1Yi5jcHAKQEAgLTEsMjAgKzEsMTcgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIEVpZ2VuOjpNYXRyaXgyZCBhOwotICBhIDw8IDEsIDIsCi0gICAgICAgMywgNDsKLSAgRWlnZW46Ok1hdHJpeFhkIGIoMiwyKTsKLSAgYiA8PCAyLCAzLAotICAgICAgIDEsIDQ7CisgIGEgPDwgMSwgMiwgMywgNDsKKyAgRWlnZW46Ok1hdHJpeFhkIGIoMiwgMik7CisgIGIgPDwgMiwgMywgMSwgNDsKICAgc3RkOjpjb3V0IDw8ICJhICsgYiA9XG4iIDw8IGEgKyBiIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8ICJhIC0gYiA9XG4iIDw8IGEgLSBiIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8ICJEb2luZyBhICs9IGI7IiA8PCBzdGQ6OmVuZGw7CiAgIGEgKz0gYjsKICAgc3RkOjpjb3V0IDw8ICJOb3cgYSA9XG4iIDw8IGEgPDwgc3RkOjplbmRsOwotICBFaWdlbjo6VmVjdG9yM2QgdigxLDIsMyk7Ci0gIEVpZ2VuOjpWZWN0b3IzZCB3KDEsMCwwKTsKKyAgRWlnZW46OlZlY3RvcjNkIHYoMSwgMiwgMyk7CisgIEVpZ2VuOjpWZWN0b3IzZCB3KDEsIDAsIDApOwogICBzdGQ6OmNvdXQgPDwgIi12ICsgdyAtIHYgPVxuIiA8PCAtdiArIHcgLSB2IDw8IHN0ZDo6ZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19kb3RfY3Jvc3MuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX2RvdF9jcm9zcy5jcHAKaW5kZXggZDk1ZTAzYy4uMDllZWEzOSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX2RvdF9jcm9zcy5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX2RvdF9jcm9zcy5jcHAKQEAgLTEsMTggKzEsMTcgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KIAotaW50IG1haW4oKQotewotICBFaWdlbjo6VmVjdG9yM2QgdigxLDIsMyk7Ci0gIEVpZ2VuOjpWZWN0b3IzZCB3KDAsMSwyKTsKK2ludCBtYWluKCkgeworICBFaWdlbjo6VmVjdG9yM2QgdigxLCAyLCAzKTsKKyAgRWlnZW46OlZlY3RvcjNkIHcoMCwgMSwgMik7CiAKICAgc3RkOjpjb3V0IDw8ICJEb3QgcHJvZHVjdDogIiA8PCB2LmRvdCh3KSA8PCBzdGQ6OmVuZGw7Ci0gIGRvdWJsZSBkcCA9IHYuYWRqb2ludCgpKnc7IC8vIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mIHRoZSBpbm5lciBwcm9kdWN0IHRvIGEgc2NhbGFyCisgIGRvdWJsZSBkcCA9IHYuYWRqb2ludCgpICogdzsgIC8vIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mIHRoZSBpbm5lciBwcm9kdWN0IHRvIGEgc2NhbGFyCiAgIHN0ZDo6Y291dCA8PCAiRG90IHByb2R1Y3QgdmlhIGEgbWF0cml4IHByb2R1Y3Q6ICIgPDwgZHAgPDwgc3RkOjplbmRsOwogCiAgIHN0ZDo6Y291dCA8PCAiQ3Jvc3MgcHJvZHVjdDpcbiIgPDwgdi5jcm9zcyh3KSA8PCBzdGQ6OmVuZGw7Ci0gIEVpZ2VuOjpWZWN0b3IyZCB2MigxLDIpOwotICBFaWdlbjo6VmVjdG9yMmQgdzIoMCwxKTsKLSAgZG91YmxlIGNwID0gdjIuY3Jvc3ModzIpOyAvLyByZXR1cm5pbmcgYSBzY2FsYXIgYmV0d2VlbiBzaXplLTIgdmVjdG9ycworICBFaWdlbjo6VmVjdG9yMmQgdjIoMSwgMik7CisgIEVpZ2VuOjpWZWN0b3IyZCB3MigwLCAxKTsKKyAgZG91YmxlIGNwID0gdjIuY3Jvc3ModzIpOyAgLy8gcmV0dXJuaW5nIGEgc2NhbGFyIGJldHdlZW4gc2l6ZS0yIHZlY3RvcnMKICAgc3RkOjpjb3V0IDw8ICJDcm9zcyBwcm9kdWN0IGZvciAyRCB2ZWN0b3JzOiAiIDw8IGNwIDw8IHN0ZDo6ZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19tYXRyaXhfbXVsLmNwcCBiL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19tYXRyaXhfbXVsLmNwcAppbmRleCBjMmQ1ZTJkLi5lYWQ0ODAwIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfbWF0cml4X211bC5jcHAKKysrIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX21hdHJpeF9tdWwuY3BwCkBAIC0xLDE4ICsxLDE2IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CiAKLWludCBtYWluKCkKLXsKK2ludCBtYWluKCkgewogICBFaWdlbjo6TWF0cml4MmQgbWF0OwotICBtYXQgPDwgMSwgMiwKLSAgICAgICAgIDMsIDQ7Ci0gIEVpZ2VuOjpWZWN0b3IyZCB1KC0xLDEpLCB2KDIsMCk7Ci0gIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyBtYXQqbWF0OlxuIiA8PCBtYXQqbWF0IDw8IHN0ZDo6ZW5kbDsKLSAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIG1hdCp1OlxuIiA8PCBtYXQqdSA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB1XlQqbWF0OlxuIiA8PCB1LnRyYW5zcG9zZSgpKm1hdCA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB1XlQqdjpcbiIgPDwgdS50cmFuc3Bvc2UoKSp2IDw8IHN0ZDo6ZW5kbDsKLSAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHUqdl5UOlxuIiA8PCB1KnYudHJhbnNwb3NlKCkgPDwgc3RkOjplbmRsOworICBtYXQgPDwgMSwgMiwgMywgNDsKKyAgRWlnZW46OlZlY3RvcjJkIHUoLTEsIDEpLCB2KDIsIDApOworICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgbWF0Km1hdDpcbiIgPDwgbWF0ICogbWF0IDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIG1hdCp1OlxuIiA8PCBtYXQgKiB1IDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHVeVCptYXQ6XG4iIDw8IHUudHJhbnNwb3NlKCkgKiBtYXQgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIkhlcmUgaXMgdV5UKnY6XG4iIDw8IHUudHJhbnNwb3NlKCkgKiB2IDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJIZXJlIGlzIHUqdl5UOlxuIiA8PCB1ICogdi50cmFuc3Bvc2UoKSA8PCBzdGQ6OmVuZGw7CiAgIHN0ZDo6Y291dCA8PCAiTGV0J3MgbXVsdGlwbHkgbWF0IGJ5IGl0c2VsZiIgPDwgc3RkOjplbmRsOwotICBtYXQgPSBtYXQqbWF0OworICBtYXQgPSBtYXQgKiBtYXQ7CiAgIHN0ZDo6Y291dCA8PCAiTm93IG1hdCBpcyBtYXQ6XG4iIDw8IG1hdCA8PCBzdGQ6OmVuZGw7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfcmVkdXhfYmFzaWMuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX3JlZHV4X2Jhc2ljLmNwcAppbmRleCA1NjMyZmI1Li4zMTQwMjM3IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfcmVkdXhfYmFzaWMuY3BwCisrKyBiL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19yZWR1eF9iYXNpYy5jcHAKQEAgLTIsMTUgKzIsMTMgQEAKICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLWludCBtYWluKCkKLXsKK2ludCBtYWluKCkgewogICBFaWdlbjo6TWF0cml4MmQgbWF0OwotICBtYXQgPDwgMSwgMiwKLSAgICAgICAgIDMsIDQ7Ci0gIGNvdXQgPDwgIkhlcmUgaXMgbWF0LnN1bSgpOiAgICAgICAiIDw8IG1hdC5zdW0oKSAgICAgICA8PCBlbmRsOwotICBjb3V0IDw8ICJIZXJlIGlzIG1hdC5wcm9kKCk6ICAgICAgIiA8PCBtYXQucHJvZCgpICAgICAgPDwgZW5kbDsKLSAgY291dCA8PCAiSGVyZSBpcyBtYXQubWVhbigpOiAgICAgICIgPDwgbWF0Lm1lYW4oKSAgICAgIDw8IGVuZGw7Ci0gIGNvdXQgPDwgIkhlcmUgaXMgbWF0Lm1pbkNvZWZmKCk6ICAiIDw8IG1hdC5taW5Db2VmZigpICA8PCBlbmRsOwotICBjb3V0IDw8ICJIZXJlIGlzIG1hdC5tYXhDb2VmZigpOiAgIiA8PCBtYXQubWF4Q29lZmYoKSAgPDwgZW5kbDsKLSAgY291dCA8PCAiSGVyZSBpcyBtYXQudHJhY2UoKTogICAgICIgPDwgbWF0LnRyYWNlKCkgICAgIDw8IGVuZGw7CisgIG1hdCA8PCAxLCAyLCAzLCA0OworICBjb3V0IDw8ICJIZXJlIGlzIG1hdC5zdW0oKTogICAgICAgIiA8PCBtYXQuc3VtKCkgPDwgZW5kbDsKKyAgY291dCA8PCAiSGVyZSBpcyBtYXQucHJvZCgpOiAgICAgICIgPDwgbWF0LnByb2QoKSA8PCBlbmRsOworICBjb3V0IDw8ICJIZXJlIGlzIG1hdC5tZWFuKCk6ICAgICAgIiA8PCBtYXQubWVhbigpIDw8IGVuZGw7CisgIGNvdXQgPDwgIkhlcmUgaXMgbWF0Lm1pbkNvZWZmKCk6ICAiIDw8IG1hdC5taW5Db2VmZigpIDw8IGVuZGw7CisgIGNvdXQgPDwgIkhlcmUgaXMgbWF0Lm1heENvZWZmKCk6ICAiIDw8IG1hdC5tYXhDb2VmZigpIDw8IGVuZGw7CisgIGNvdXQgPDwgIkhlcmUgaXMgbWF0LnRyYWNlKCk6ICAgICAiIDw8IG1hdC50cmFjZSgpIDw8IGVuZGw7CiB9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfc2NhbGFyX211bF9kaXYuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9hcml0aG1ldGljX3NjYWxhcl9tdWxfZGl2LmNwcAppbmRleCAwYmE4ZDZiLi4wNWYxZWJkIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvdHV0X2FyaXRobWV0aWNfc2NhbGFyX211bF9kaXYuY3BwCisrKyBiL2RvYy9leGFtcGxlcy90dXRfYXJpdGhtZXRpY19zY2FsYXJfbXVsX2Rpdi5jcHAKQEAgLTEsMTIgKzEsMTAgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIEVpZ2VuOjpNYXRyaXgyZCBhOwotICBhIDw8IDEsIDIsCi0gICAgICAgMywgNDsKLSAgRWlnZW46OlZlY3RvcjNkIHYoMSwyLDMpOworICBhIDw8IDEsIDIsIDMsIDQ7CisgIEVpZ2VuOjpWZWN0b3IzZCB2KDEsIDIsIDMpOwogICBzdGQ6OmNvdXQgPDwgImEgKiAyLjUgPVxuIiA8PCBhICogMi41IDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8ICIwLjEgKiB2ID1cbiIgPDwgMC4xICogdiA8PCBzdGQ6OmVuZGw7CiAgIHN0ZDo6Y291dCA8PCAiRG9pbmcgdiAqPSAyOyIgPDwgc3RkOjplbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R1dF9tYXRyaXhfY29lZmZpY2llbnRfYWNjZXNzb3JzLmNwcCBiL2RvYy9leGFtcGxlcy90dXRfbWF0cml4X2NvZWZmaWNpZW50X2FjY2Vzc29ycy5jcHAKaW5kZXggMDQwMDg3Yy4uZTUwOWE5OCAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL3R1dF9tYXRyaXhfY29lZmZpY2llbnRfYWNjZXNzb3JzLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvdHV0X21hdHJpeF9jb2VmZmljaWVudF9hY2Nlc3NvcnMuY3BwCkBAIC0xLDEzICsxLDEyIEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CiAKLWludCBtYWluKCkKLXsKLSAgRWlnZW46Ok1hdHJpeFhkIG0oMiwyKTsKLSAgbSgwLDApID0gMzsKLSAgbSgxLDApID0gMi41OwotICBtKDAsMSkgPSAtMTsKLSAgbSgxLDEpID0gbSgxLDApICsgbSgwLDEpOworaW50IG1haW4oKSB7CisgIEVpZ2VuOjpNYXRyaXhYZCBtKDIsIDIpOworICBtKDAsIDApID0gMzsKKyAgbSgxLCAwKSA9IDIuNTsKKyAgbSgwLCAxKSA9IC0xOworICBtKDEsIDEpID0gbSgxLCAwKSArIG0oMCwgMSk7CiAgIHN0ZDo6Y291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06XG4iIDw8IG0gPDwgc3RkOjplbmRsOwogICBFaWdlbjo6VmVjdG9yWGQgdigyKTsKICAgdigwKSA9IDQ7CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdHV0X21hdHJpeF9yZXNpemUuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9tYXRyaXhfcmVzaXplLmNwcAppbmRleCBhYTgwY2Y1Li42ZTAwOTE5IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvdHV0X21hdHJpeF9yZXNpemUuY3BwCisrKyBiL2RvYy9leGFtcGxlcy90dXRfbWF0cml4X3Jlc2l6ZS5jcHAKQEAgLTEsMTYgKzEsMTMgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxFaWdlbi9EZW5zZT4KIAotaW50IG1haW4oKQotewotICBFaWdlbjo6TWF0cml4WGQgbSgyLDUpOwotICBtLnJlc2l6ZSg0LDMpOwotICBzdGQ6OmNvdXQgPDwgIlRoZSBtYXRyaXggbSBpcyBvZiBzaXplICIKLSAgICAgICAgICAgIDw8IG0ucm93cygpIDw8ICJ4IiA8PCBtLmNvbHMoKSA8PCBzdGQ6OmVuZGw7CitpbnQgbWFpbigpIHsKKyAgRWlnZW46Ok1hdHJpeFhkIG0oMiwgNSk7CisgIG0ucmVzaXplKDQsIDMpOworICBzdGQ6OmNvdXQgPDwgIlRoZSBtYXRyaXggbSBpcyBvZiBzaXplICIgPDwgbS5yb3dzKCkgPDwgIngiIDw8IG0uY29scygpIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8ICJJdCBoYXMgIiA8PCBtLnNpemUoKSA8PCAiIGNvZWZmaWNpZW50cyIgPDwgc3RkOjplbmRsOwogICBFaWdlbjo6VmVjdG9yWGQgdigyKTsKICAgdi5yZXNpemUoNSk7CiAgIHN0ZDo6Y291dCA8PCAiVGhlIHZlY3RvciB2IGlzIG9mIHNpemUgIiA8PCB2LnNpemUoKSA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCAiQXMgYSBtYXRyaXgsIHYgaXMgb2Ygc2l6ZSAiCi0gICAgICAgICAgICA8PCB2LnJvd3MoKSA8PCAieCIgPDwgdi5jb2xzKCkgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIkFzIGEgbWF0cml4LCB2IGlzIG9mIHNpemUgIiA8PCB2LnJvd3MoKSA8PCAieCIgPDwgdi5jb2xzKCkgPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3R1dF9tYXRyaXhfcmVzaXplX2ZpeGVkX3NpemUuY3BwIGIvZG9jL2V4YW1wbGVzL3R1dF9tYXRyaXhfcmVzaXplX2ZpeGVkX3NpemUuY3BwCmluZGV4IDNkZjg3ZDIuLjQ0NjQ1ZDggMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy90dXRfbWF0cml4X3Jlc2l6ZV9maXhlZF9zaXplLmNwcAorKysgYi9kb2MvZXhhbXBsZXMvdHV0X21hdHJpeF9yZXNpemVfZml4ZWRfc2l6ZS5jcHAKQEAgLTEsMTAgKzEsOCBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgogCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgRWlnZW46Ok1hdHJpeDRkIG07Ci0gIG0ucmVzaXplKDQsNCk7IC8vIG5vIG9wZXJhdGlvbgotICBzdGQ6OmNvdXQgPDwgIlRoZSBtYXRyaXggbSBpcyBvZiBzaXplICIKLSAgICAgICAgICAgIDw8IG0ucm93cygpIDw8ICJ4IiA8PCBtLmNvbHMoKSA8PCBzdGQ6OmVuZGw7CisgIG0ucmVzaXplKDQsIDQpOyAgLy8gbm8gb3BlcmF0aW9uCisgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBtIGlzIG9mIHNpemUgIiA8PCBtLnJvd3MoKSA8PCAieCIgPDwgbS5jb2xzKCkgPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0FuZ2xlQXhpc19taW1pY19ldWxlci5jcHAgYi9kb2Mvc25pcHBldHMvQW5nbGVBeGlzX21pbWljX2V1bGVyLmNwcAppbmRleCA0NTZkZTdmLi5lYjI3Y2JmIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQW5nbGVBeGlzX21pbWljX2V1bGVyLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQW5nbGVBeGlzX21pbWljX2V1bGVyLmNwcApAQCAtMSw1ICsxLDQgQEAKIE1hdHJpeDNmIG07Ci1tID0gQW5nbGVBeGlzZigwLjI1Kk1fUEksIFZlY3RvcjNmOjpVbml0WCgpKQotICAqIEFuZ2xlQXhpc2YoMC41Kk1fUEksICBWZWN0b3IzZjo6VW5pdFkoKSkKLSAgKiBBbmdsZUF4aXNmKDAuMzMqTV9QSSwgVmVjdG9yM2Y6OlVuaXRaKCkpOworbSA9IEFuZ2xlQXhpc2YoMC4yNSAqIE1fUEksIFZlY3RvcjNmOjpVbml0WCgpKSAqIEFuZ2xlQXhpc2YoMC41ICogTV9QSSwgVmVjdG9yM2Y6OlVuaXRZKCkpICoKKyAgICBBbmdsZUF4aXNmKDAuMzMgKiBNX1BJLCBWZWN0b3IzZjo6VW5pdFooKSk7CiBjb3V0IDw8IG0gPDwgZW5kbCA8PCAiaXMgdW5pdGFyeTogIiA8PCBtLmlzVW5pdGFyeSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQXJyYXlfaW5pdGlhbGl6ZXJfbGlzdF8yM19jeHgxMS5jcHAgYi9kb2Mvc25pcHBldHMvQXJyYXlfaW5pdGlhbGl6ZXJfbGlzdF8yM19jeHgxMS5jcHAKaW5kZXggMmMyMTY2ZS4uOGY0OTFjYiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0FycmF5X2luaXRpYWxpemVyX2xpc3RfMjNfY3h4MTEuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9BcnJheV9pbml0aWFsaXplcl9saXN0XzIzX2N4eDExLmNwcApAQCAtMSw1ICsxLDIgQEAKLUFycmF5WFhpIGEgewotICB7MSwgMiwgM30sCi0gIHszLCA0LCA1fQotfTsKK0FycmF5WFhpIGF7ezEsIDIsIDN9LCB7MywgNCwgNX19OwogY291dCA8PCBhIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQXJyYXlfaW5pdGlhbGl6ZXJfbGlzdF92ZWN0b3JfY3h4MTEuY3BwIGIvZG9jL3NuaXBwZXRzL0FycmF5X2luaXRpYWxpemVyX2xpc3RfdmVjdG9yX2N4eDExLmNwcAppbmRleCBhNjY4ZDg0Li4zOTg4MzFmIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQXJyYXlfaW5pdGlhbGl6ZXJfbGlzdF92ZWN0b3JfY3h4MTEuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9BcnJheV9pbml0aWFsaXplcl9saXN0X3ZlY3Rvcl9jeHgxMS5jcHAKQEAgLTEsMiArMSwyIEBACi1BcnJheTxpbnQsIER5bmFtaWMsIDE+IHYge3sxLCAyLCAzLCA0LCA1fX07CitBcnJheTxpbnQsIER5bmFtaWMsIDE+IHZ7ezEsIDIsIDMsIDQsIDV9fTsKIGNvdXQgPDwgdiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0FycmF5X3ZhcmlhZGljX2N0b3JfY3h4MTEuY3BwIGIvZG9jL3NuaXBwZXRzL0FycmF5X3ZhcmlhZGljX2N0b3JfY3h4MTEuY3BwCmluZGV4IDBlNGVjNDQuLjZkZjc4YTUgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9BcnJheV92YXJpYWRpY19jdG9yX2N4eDExLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQXJyYXlfdmFyaWFkaWNfY3Rvcl9jeHgxMS5jcHAKQEAgLTEsMyArMSwzIEBACiBBcnJheTxpbnQsIDEsIDY+IGEoMSwgMiwgMywgNCwgNSwgNik7Ci1BcnJheTxpbnQsIDMsIDE+IGIgezEsIDIsIDN9OworQXJyYXk8aW50LCAzLCAxPiBiezEsIDIsIDN9OwogY291dCA8PCBhIDw8ICJcblxuIiA8PCBiIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQmlDR1NUQUJfc2ltcGxlLmNwcCBiL2RvYy9zbmlwcGV0cy9CaUNHU1RBQl9zaW1wbGUuY3BwCmluZGV4IDhjODgyOWYuLjY4ZjA3YzkgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9CaUNHU1RBQl9zaW1wbGUuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9CaUNHU1RBQl9zaW1wbGUuY3BwCkBAIC0xLDExICsxLDExIEBACi0gIGludCBuID0gMTAwMDA7Ci0gIFZlY3RvclhkIHgobiksIGIobik7Ci0gIFNwYXJzZU1hdHJpeDxkb3VibGU+IEEobixuKTsKLSAgLyogLi4uIGZpbGwgQSBhbmQgYiAuLi4gKi8gCi0gIEJpQ0dTVEFCPFNwYXJzZU1hdHJpeDxkb3VibGU+ID4gc29sdmVyOwotICBzb2x2ZXIuY29tcHV0ZShBKTsKLSAgeCA9IHNvbHZlci5zb2x2ZShiKTsKLSAgc3RkOjpjb3V0IDw8ICIjaXRlcmF0aW9uczogICAgICIgPDwgc29sdmVyLml0ZXJhdGlvbnMoKSA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCAiZXN0aW1hdGVkIGVycm9yOiAiIDw8IHNvbHZlci5lcnJvcigpICAgICAgPDwgc3RkOjplbmRsOwotICAvKiAuLi4gdXBkYXRlIGIgLi4uICovCi0gIHggPSBzb2x2ZXIuc29sdmUoYik7IC8vIHNvbHZlIGFnYWluCitpbnQgbiA9IDEwMDAwOworVmVjdG9yWGQgeChuKSwgYihuKTsKK1NwYXJzZU1hdHJpeDxkb3VibGU+IEEobiwgbik7CisvKiAuLi4gZmlsbCBBIGFuZCBiIC4uLiAqLworQmlDR1NUQUI8U3BhcnNlTWF0cml4PGRvdWJsZT4gPiBzb2x2ZXI7Citzb2x2ZXIuY29tcHV0ZShBKTsKK3ggPSBzb2x2ZXIuc29sdmUoYik7CitzdGQ6OmNvdXQgPDwgIiNpdGVyYXRpb25zOiAgICAgIiA8PCBzb2x2ZXIuaXRlcmF0aW9ucygpIDw8IHN0ZDo6ZW5kbDsKK3N0ZDo6Y291dCA8PCAiZXN0aW1hdGVkIGVycm9yOiAiIDw8IHNvbHZlci5lcnJvcigpIDw8IHN0ZDo6ZW5kbDsKKy8qIC4uLiB1cGRhdGUgYiAuLi4gKi8KK3ggPSBzb2x2ZXIuc29sdmUoYik7ICAvLyBzb2x2ZSBhZ2FpbgpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0JpQ0dTVEFCX3N0ZXBfYnlfc3RlcC5jcHAgYi9kb2Mvc25pcHBldHMvQmlDR1NUQUJfc3RlcF9ieV9zdGVwLmNwcAppbmRleCA2Yzk1ZDVhLi43ZmU1M2E1IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQmlDR1NUQUJfc3RlcF9ieV9zdGVwLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQmlDR1NUQUJfc3RlcF9ieV9zdGVwLmNwcApAQCAtMSwxNCArMSwxNCBAQAotICBpbnQgbiA9IDEwMDAwOwotICBWZWN0b3JYZCB4KG4pLCBiKG4pOwotICBTcGFyc2VNYXRyaXg8ZG91YmxlPiBBKG4sbik7Ci0gIC8qIC4uLiBmaWxsIEEgYW5kIGIgLi4uICovIAotICBCaUNHU1RBQjxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IHNvbHZlcihBKTsKLSAgLy8gc3RhcnQgZnJvbSBhIHJhbmRvbSBzb2x1dGlvbgotICB4ID0gVmVjdG9yWGQ6OlJhbmRvbShuKTsKLSAgc29sdmVyLnNldE1heEl0ZXJhdGlvbnMoMSk7Ci0gIGludCBpID0gMDsKLSAgZG8gewotICAgIHggPSBzb2x2ZXIuc29sdmVXaXRoR3Vlc3MoYix4KTsKLSAgICBzdGQ6OmNvdXQgPDwgaSA8PCAiIDogIiA8PCBzb2x2ZXIuZXJyb3IoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgKytpOwotICB9IHdoaWxlIChzb2x2ZXIuaW5mbygpIT1TdWNjZXNzICYmIGk8MTAwKTsKK2ludCBuID0gMTAwMDA7CitWZWN0b3JYZCB4KG4pLCBiKG4pOworU3BhcnNlTWF0cml4PGRvdWJsZT4gQShuLCBuKTsKKy8qIC4uLiBmaWxsIEEgYW5kIGIgLi4uICovCitCaUNHU1RBQjxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IHNvbHZlcihBKTsKKy8vIHN0YXJ0IGZyb20gYSByYW5kb20gc29sdXRpb24KK3ggPSBWZWN0b3JYZDo6UmFuZG9tKG4pOworc29sdmVyLnNldE1heEl0ZXJhdGlvbnMoMSk7CitpbnQgaSA9IDA7CitkbyB7CisgIHggPSBzb2x2ZXIuc29sdmVXaXRoR3Vlc3MoYiwgeCk7CisgIHN0ZDo6Y291dCA8PCBpIDw8ICIgOiAiIDw8IHNvbHZlci5lcnJvcigpIDw8IHN0ZDo6ZW5kbDsKKyAgKytpOworfSB3aGlsZSAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzICYmIGkgPCAxMDApOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0NvbFBpdkhvdXNlaG9sZGVyUVJfc29sdmUuY3BwIGIvZG9jL3NuaXBwZXRzL0NvbFBpdkhvdXNlaG9sZGVyUVJfc29sdmUuY3BwCmluZGV4IGI3YjIwNGEuLmViN2QxZmYgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Db2xQaXZIb3VzZWhvbGRlclFSX3NvbHZlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ29sUGl2SG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAKQEAgLTQsNSArNCw1IEBACiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggeToiIDw8IGVuZGwgPDwgeSA8PCBlbmRsOwogTWF0cml4M2YgeDsKIHggPSBtLmNvbFBpdkhvdXNlaG9sZGVyUXIoKS5zb2x2ZSh5KTsKLWFzc2VydCh5LmlzQXBwcm94KG0qeCkpOworYXNzZXJ0KHkuaXNBcHByb3gobSogeCkpOwogY291dCA8PCAiSGVyZSBpcyBhIHNvbHV0aW9uIHggdG8gdGhlIGVxdWF0aW9uIG14PXk6IiA8PCBlbmRsIDw8IHggPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfY29tcHV0ZS5jcHAgYi9kb2Mvc25pcHBldHMvQ29tcGxleEVpZ2VuU29sdmVyX2NvbXB1dGUuY3BwCmluZGV4IDExZDZiZDMuLmU1NTQwOWQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfY29tcHV0ZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0NvbXBsZXhFaWdlblNvbHZlcl9jb21wdXRlLmNwcApAQCAtMSw0ICsxLDQgQEAKLU1hdHJpeFhjZiBBID0gTWF0cml4WGNmOjpSYW5kb20oNCw0KTsKK01hdHJpeFhjZiBBID0gTWF0cml4WGNmOjpSYW5kb20oNCwgNCk7CiBjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIDR4NCBtYXRyaXgsIEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbCA8PCBlbmRsOwogCiBDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4WGNmPiBjZXM7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ29tcGxleEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcCBiL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCmluZGV4IDU1MDliZDguLmQzYmZmNTEgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCkBAIC0xLDQgKzEsMyBAQAotTWF0cml4WGNmIG9uZXMgPSBNYXRyaXhYY2Y6Ok9uZXMoMywzKTsKK01hdHJpeFhjZiBvbmVzID0gTWF0cml4WGNmOjpPbmVzKDMsIDMpOwogQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFhjZj4gY2VzKG9uZXMsIC8qIGNvbXB1dGVFaWdlbnZlY3RvcnMgPSAqLyBmYWxzZSk7Ci1jb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBhcmU6IiAKLSAgICAgPDwgZW5kbCA8PCBjZXMuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOworY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIHRoZSAzeDMgbWF0cml4IG9mIG9uZXMgYXJlOiIgPDwgZW5kbCA8PCBjZXMuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0NvbXBsZXhFaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwIGIvZG9jL3NuaXBwZXRzL0NvbXBsZXhFaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwCmluZGV4IGFkZWVkOWEuLjQ2YWFiNGEgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Db21wbGV4RWlnZW5Tb2x2ZXJfZWlnZW52ZWN0b3JzLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ29tcGxleEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAKQEAgLTEsNCArMSwzIEBACi1NYXRyaXhYY2Ygb25lcyA9IE1hdHJpeFhjZjo6T25lcygzLDMpOworTWF0cml4WGNmIG9uZXMgPSBNYXRyaXhYY2Y6Ok9uZXMoMywgMyk7CiBDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4WGNmPiBjZXMob25lcyk7Ci1jb3V0IDw8ICJUaGUgZmlyc3QgZWlnZW52ZWN0b3Igb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBpczoiIAotICAgICA8PCBlbmRsIDw8IGNlcy5laWdlbnZlY3RvcnMoKS5jb2woMCkgPDwgZW5kbDsKK2NvdXQgPDwgIlRoZSBmaXJzdCBlaWdlbnZlY3RvciBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGlzOiIgPDwgZW5kbCA8PCBjZXMuZWlnZW52ZWN0b3JzKCkuY29sKDApIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ29tcGxleFNjaHVyX2NvbXB1dGUuY3BwIGIvZG9jL3NuaXBwZXRzL0NvbXBsZXhTY2h1cl9jb21wdXRlLmNwcAppbmRleCAzYTUxNzAxLi41M2I3ZjhiIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ29tcGxleFNjaHVyX2NvbXB1dGUuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Db21wbGV4U2NodXJfY29tcHV0ZS5jcHAKQEAgLTEsNCArMSw0IEBACi1NYXRyaXhYY2YgQSA9IE1hdHJpeFhjZjo6UmFuZG9tKDQsNCk7CitNYXRyaXhYY2YgQSA9IE1hdHJpeFhjZjo6UmFuZG9tKDQsIDQpOwogQ29tcGxleFNjaHVyPE1hdHJpeFhjZj4gc2NodXIoNCk7CiBzY2h1ci5jb21wdXRlKEEpOwogY291dCA8PCAiVGhlIG1hdHJpeCBUIGluIHRoZSBkZWNvbXBvc2l0aW9uIG9mIEEgaXM6IiA8PCBlbmRsIDw8IHNjaHVyLm1hdHJpeFQoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0NvbXBsZXhTY2h1cl9tYXRyaXhULmNwcCBiL2RvYy9zbmlwcGV0cy9Db21wbGV4U2NodXJfbWF0cml4VC5jcHAKaW5kZXggODM4MDU3MS4uZTEwMzNhZCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0NvbXBsZXhTY2h1cl9tYXRyaXhULmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ29tcGxleFNjaHVyX21hdHJpeFQuY3BwCkBAIC0xLDQgKzEsNCBAQAotTWF0cml4WGNmIEEgPSBNYXRyaXhYY2Y6OlJhbmRvbSg0LDQpOworTWF0cml4WGNmIEEgPSBNYXRyaXhYY2Y6OlJhbmRvbSg0LCA0KTsKIGNvdXQgPDwgIkhlcmUgaXMgYSByYW5kb20gNHg0IG1hdHJpeCwgQToiIDw8IGVuZGwgPDwgQSA8PCBlbmRsIDw8IGVuZGw7Ci1Db21wbGV4U2NodXI8TWF0cml4WGNmPiBzY2h1ck9mQShBLCBmYWxzZSk7IC8vIGZhbHNlIG1lYW5zIGRvIG5vdCBjb21wdXRlIFUKK0NvbXBsZXhTY2h1cjxNYXRyaXhYY2Y+IHNjaHVyT2ZBKEEsIGZhbHNlKTsgIC8vIGZhbHNlIG1lYW5zIGRvIG5vdCBjb21wdXRlIFUKIGNvdXQgPDwgIlRoZSB0cmlhbmd1bGFyIG1hdHJpeCBUIGlzOiIgPDwgZW5kbCA8PCBzY2h1ck9mQS5tYXRyaXhUKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Db21wbGV4U2NodXJfbWF0cml4VS5jcHAgYi9kb2Mvc25pcHBldHMvQ29tcGxleFNjaHVyX21hdHJpeFUuY3BwCmluZGV4IGJhM2Q5YzIuLjgxMzgzOTQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Db21wbGV4U2NodXJfbWF0cml4VS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0NvbXBsZXhTY2h1cl9tYXRyaXhVLmNwcApAQCAtMSw0ICsxLDQgQEAKLU1hdHJpeFhjZiBBID0gTWF0cml4WGNmOjpSYW5kb20oNCw0KTsKK01hdHJpeFhjZiBBID0gTWF0cml4WGNmOjpSYW5kb20oNCwgNCk7CiBjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIDR4NCBtYXRyaXgsIEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbCA8PCBlbmRsOwogQ29tcGxleFNjaHVyPE1hdHJpeFhjZj4gc2NodXJPZkEoQSk7CiBjb3V0IDw8ICJUaGUgdW5pdGFyeSBtYXRyaXggVSBpczoiIDw8IGVuZGwgPDwgc2NodXJPZkEubWF0cml4VSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfYWJzLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hYnMuY3BwCmluZGV4IDBhZWVjM2EuLjc0NDg1MWEgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9hYnMuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hYnMuY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KDEsLTIsLTMpOworQXJyYXkzZCB2KDEsIC0yLCAtMyk7CiBjb3V0IDw8IHYuYWJzKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9hYnMyLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hYnMyLmNwcAppbmRleCAyYzRmOWIzLi43MWU1Y2IyIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2VfYWJzMi5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2FiczIuY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KDEsLTIsLTMpOworQXJyYXkzZCB2KDEsIC0yLCAtMyk7CiBjb3V0IDw8IHYuYWJzMigpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfYWNvcy5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYWNvcy5jcHAKaW5kZXggMzQ0MzJjYi4uYmJiYmY1MiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX2Fjb3MuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hY29zLmNwcApAQCAtMSwyICsxLDIgQEAKLUFycmF5M2QgdigwLCBzcXJ0KDIuKS8yLCAxKTsKK0FycmF5M2QgdigwLCBzcXJ0KDIuKSAvIDIsIDEpOwogY291dCA8PCB2LmFjb3MoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2FycmF5X2F0YW4yX2FycmF5LmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hcnJheV9hdGFuMl9hcnJheS5jcHAKaW5kZXggYWNlMDc1YS4uNTc0MmY5YSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX2FycmF5X2F0YW4yX2FycmF5LmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYXJyYXlfYXRhbjJfYXJyYXkuY3BwCkBAIC0xLDQgKzEsMyBAQAotQXJyYXk8ZG91YmxlLDEsMz4geCg4LC0yNSwzKSwKLSAgICAgICAgICAgICAgICAgIHkoMS4vMy4sMC41LC0yLik7Ci1jb3V0IDw8ICJhdGFuMihbIiA8PCB4IDw8ICJdLCBbIiA8PCB5IDw8ICJdKSA9ICIgPDwgeC5hdGFuMih5KSA8PCBlbmRsOyAvLyB1c2luZyBBcnJheUJhc2U6OnBvdwotY291dCA8PCAiYXRhbjIoWyIgPDwgeCA8PCAiXSwgWyIgPDwgeSA8PCAiXSA9ICIgPDwgYXRhbjIoeCx5KSA8PCBlbmRsOyAvLyB1c2luZyBFaWdlbjo6cG93CitBcnJheTxkb3VibGUsIDEsIDM+IHgoOCwgLTI1LCAzKSwgeSgxLiAvIDMuLCAwLjUsIC0yLik7Citjb3V0IDw8ICJhdGFuMihbIiA8PCB4IDw8ICJdLCBbIiA8PCB5IDw8ICJdKSA9ICIgPDwgeC5hdGFuMih5KSA8PCBlbmRsOyAgLy8gdXNpbmcgQXJyYXlCYXNlOjpwb3cKK2NvdXQgPDwgImF0YW4yKFsiIDw8IHggPDwgIl0sIFsiIDw8IHkgPDwgIl0gPSAiIDw8IGF0YW4yKHgsIHkpIDw8IGVuZGw7ICAvLyB1c2luZyBFaWdlbjo6cG93CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfYXJyYXlfcG93ZXJfYXJyYXkuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2FycmF5X3Bvd2VyX2FycmF5LmNwcAppbmRleCA0MzJhNzZlLi5hYjJkODdhIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2VfYXJyYXlfcG93ZXJfYXJyYXkuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hcnJheV9wb3dlcl9hcnJheS5jcHAKQEAgLTEsNCArMSwzIEBACi1BcnJheTxkb3VibGUsMSwzPiB4KDgsMjUsMyksCi0gICAgICAgICAgICAgICAgICBlKDEuLzMuLDAuNSwyLik7Ci1jb3V0IDw8ICJbIiA8PCB4IDw8ICJdXlsiIDw8IGUgPDwgIl0gPSAiIDw8IHgucG93KGUpIDw8IGVuZGw7IC8vIHVzaW5nIEFycmF5QmFzZTo6cG93Ci1jb3V0IDw8ICJbIiA8PCB4IDw8ICJdXlsiIDw8IGUgPDwgIl0gPSAiIDw8IHBvdyh4LGUpIDw8IGVuZGw7IC8vIHVzaW5nIEVpZ2VuOjpwb3cKK0FycmF5PGRvdWJsZSwgMSwgMz4geCg4LCAyNSwgMyksIGUoMS4gLyAzLiwgMC41LCAyLik7Citjb3V0IDw8ICJbIiA8PCB4IDw8ICJdXlsiIDw8IGUgPDwgIl0gPSAiIDw8IHgucG93KGUpIDw8IGVuZGw7ICAgLy8gdXNpbmcgQXJyYXlCYXNlOjpwb3cKK2NvdXQgPDwgIlsiIDw8IHggPDwgIl1eWyIgPDwgZSA8PCAiXSA9ICIgPDwgcG93KHgsIGUpIDw8IGVuZGw7ICAvLyB1c2luZyBFaWdlbjo6cG93CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfYXNpbi5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYXNpbi5jcHAKaW5kZXggOGRhZDgzOC4uM2E2NDY3MSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX2FzaW4uY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9hc2luLmNwcApAQCAtMSwyICsxLDIgQEAKLUFycmF5M2QgdigwLCBzcXJ0KDIuKS8yLCAxKTsKK0FycmF5M2QgdigwLCBzcXJ0KDIuKSAvIDIsIDEpOwogY291dCA8PCB2LmFzaW4oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2F0YW4uY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2F0YW4uY3BwCmluZGV4IDQ0Njg0NDcuLjFiNjBhOWEgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9hdGFuLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYXRhbi5jcHAKQEAgLTEsMiArMSwyIEBACi1BcnJheVhkIHYgPSBBcnJheVhkOjpMaW5TcGFjZWQoNSwwLDEpOworQXJyYXlYZCB2ID0gQXJyYXlYZDo6TGluU3BhY2VkKDUsIDAsIDEpOwogY291dCA8PCB2LmF0YW4oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2Jvb2xlYW5fYW5kLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX2FuZC5jcHAKaW5kZXggZGY2YjYwZC4uMjI3YWMzNiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX2Jvb2xlYW5fYW5kLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYm9vbGVhbl9hbmQuY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KC0xLDIsMSksIHcoLTMsMiwzKTsKLWNvdXQgPDwgKCh2PHcpICYmICh2PDApKSA8PCBlbmRsOworQXJyYXkzZCB2KC0xLCAyLCAxKSwgdygtMywgMiwgMyk7Citjb3V0IDw8ICgodiA8IHcpICYmICh2IDwgMCkpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfYm9vbGVhbl9ub3QuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2Jvb2xlYW5fbm90LmNwcAppbmRleCA0MDAwOWYxLi40MDRmZDk0IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2VfYm9vbGVhbl9ub3QuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX25vdC5jcHAKQEAgLTEsNSArMSw1IEBACi1BcnJheTNkIHYoMSwyLDMpOwotdigxKSAqPSAwLjAvMC4wOworQXJyYXkzZCB2KDEsIDIsIDMpOwordigxKSAqPSAwLjAgLyAwLjA7CiB2KDIpIC89IDAuMDsKIGNvdXQgPDwgdiA8PCBlbmRsIDw8IGVuZGw7CiBjb3V0IDw8ICFpc2Zpbml0ZSh2KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2Jvb2xlYW5fb3IuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2Jvb2xlYW5fb3IuY3BwCmluZGV4IDgzZWIwMDYuLmRmODdmN2EgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9ib29sZWFuX29yLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfYm9vbGVhbl9vci5jcHAKQEAgLTEsMiArMSwyIEBACi1BcnJheTNkIHYoLTEsMiwxKSwgdygtMywyLDMpOwotY291dCA8PCAoKHY8dykgfHwgKHY8MCkpIDw8IGVuZGw7CitBcnJheTNkIHYoLTEsIDIsIDEpLCB3KC0zLCAyLCAzKTsKK2NvdXQgPDwgKCh2IDwgdykgfHwgKHYgPCAwKSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9jYnJ0LmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9jYnJ0LmNwcAppbmRleCBhNThjNzZjLi5iNmRjZGZjIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2VfY2JydC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2NicnQuY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KDEsMiw0KTsKK0FycmF5M2QgdigxLCAyLCA0KTsKIGNvdXQgPDwgdi5jYnJ0KCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9jZWlsLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9jZWlsLmNwcAppbmRleCA3NmNmNjYxLi42MTIzODkxIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2VfY2VpbC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2NlaWwuY3BwCkBAIC0xLDMgKzEsMyBAQAotQXJyYXlYZCB2ID0gQXJyYXlYZDo6TGluU3BhY2VkKDcsLTIsMik7CitBcnJheVhkIHYgPSBBcnJheVhkOjpMaW5TcGFjZWQoNywgLTIsIDIpOwogY291dCA8PCB2IDw8IGVuZGwgPDwgZW5kbDsKIGNvdXQgPDwgY2VpbCh2KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2Nvcy5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfY29zLmNwcAppbmRleCBmNTg5ZjA3Li5mODRmMzI1IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2VfY29zLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfY29zLmNwcApAQCAtMSwyICsxLDIgQEAKLUFycmF5M2QgdihNX1BJLCBNX1BJLzIsIE1fUEkvMyk7CitBcnJheTNkIHYoTV9QSSwgTV9QSSAvIDIsIE1fUEkgLyAzKTsKIGNvdXQgPDwgdi5jb3MoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2Nvc2guY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2Nvc2guY3BwCmluZGV4IDgwZWU3NWQuLjNjZDMzMDQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9jb3NoLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfY29zaC5jcHAKQEAgLTEsMiArMSwyIEBACi1BcnJheVhkIHYgPSBBcnJheVhkOjpMaW5TcGFjZWQoNSwwLDEpOworQXJyYXlYZCB2ID0gQXJyYXlYZDo6TGluU3BhY2VkKDUsIDAsIDEpOwogY291dCA8PCBjb3NoKHYpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfY3ViZS5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfY3ViZS5jcHAKaW5kZXggODVlNDFkYy4uNjlmNGMzNCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX2N1YmUuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9jdWJlLmNwcApAQCAtMSwyICsxLDIgQEAKLUFycmF5M2QgdigyLDMsNCk7CitBcnJheTNkIHYoMiwgMywgNCk7CiBjb3V0IDw8IHYuY3ViZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfZXF1YWxfZXF1YWwuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2VxdWFsX2VxdWFsLmNwcAppbmRleCAwYmE5NmY2Li43ZmRlYWZhIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2VfZXF1YWxfZXF1YWwuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9lcXVhbF9lcXVhbC5jcHAKQEAgLTEsMiArMSwyIEBACi1BcnJheTNkIHYoMSwyLDMpLCB3KDMsMiwxKTsKLWNvdXQgPDwgKHY9PXcpIDw8IGVuZGw7CitBcnJheTNkIHYoMSwgMiwgMyksIHcoMywgMiwgMSk7Citjb3V0IDw8ICh2ID09IHcpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfZXhwLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9leHAuY3BwCmluZGV4IGRiMjM2MTguLjlkNjUyNTkgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9leHAuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9leHAuY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KDEsMiwzKTsKK0FycmF5M2QgdigxLCAyLCAzKTsKIGNvdXQgPDwgdi5leHAoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2Zsb29yLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9mbG9vci5jcHAKaW5kZXggNzM3NTZiNC4uOGYzZWM4NSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX2Zsb29yLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfZmxvb3IuY3BwCkBAIC0xLDMgKzEsMyBAQAotQXJyYXlYZCB2ID0gQXJyYXlYZDo6TGluU3BhY2VkKDcsLTIsMik7CitBcnJheVhkIHYgPSBBcnJheVhkOjpMaW5TcGFjZWQoNywgLTIsIDIpOwogY291dCA8PCB2IDw8IGVuZGwgPDwgZW5kbDsKIGNvdXQgPDwgZmxvb3IodikgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9ncmVhdGVyLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ncmVhdGVyLmNwcAppbmRleCA0MGFkMDI5Li43N2Q0NDhhIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2VfZ3JlYXRlci5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2dyZWF0ZXIuY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KDEsMiwzKSwgdygzLDIsMSk7Ci1jb3V0IDw8ICh2PncpIDw8IGVuZGw7CitBcnJheTNkIHYoMSwgMiwgMyksIHcoMywgMiwgMSk7Citjb3V0IDw8ICh2ID4gdykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9ncmVhdGVyX2VxdWFsLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9ncmVhdGVyX2VxdWFsLmNwcAppbmRleCA2YTA4Zjg5Li44YWE5NGU4IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2VfZ3JlYXRlcl9lcXVhbC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2dyZWF0ZXJfZXF1YWwuY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KDEsMiwzKSwgdygzLDIsMSk7Ci1jb3V0IDw8ICh2Pj13KSA8PCBlbmRsOworQXJyYXkzZCB2KDEsIDIsIDMpLCB3KDMsIDIsIDEpOworY291dCA8PCAodiA+PSB3KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2ludmVyc2UuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2ludmVyc2UuY3BwCmluZGV4IDM5NjdhN2UuLjI5MmRhZWYgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9pbnZlcnNlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfaW52ZXJzZS5jcHAKQEAgLTEsMiArMSwyIEBACi1BcnJheTNkIHYoMiwzLDQpOworQXJyYXkzZCB2KDIsIDMsIDQpOwogY291dCA8PCB2LmludmVyc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2lzRmluaXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9pc0Zpbml0ZS5jcHAKaW5kZXggMWRhNTVmZC4uYzMzMDlmMiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX2lzRmluaXRlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfaXNGaW5pdGUuY3BwCkBAIC0xLDUgKzEsNSBAQAotQXJyYXkzZCB2KDEsMiwzKTsKLXYoMSkgKj0gMC4wLzAuMDsKK0FycmF5M2QgdigxLCAyLCAzKTsKK3YoMSkgKj0gMC4wIC8gMC4wOwogdigyKSAvPSAwLjA7CiBjb3V0IDw8IHYgPDwgZW5kbCA8PCBlbmRsOwogY291dCA8PCBpc2Zpbml0ZSh2KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2lzSW5mLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9pc0luZi5jcHAKaW5kZXggYmU3OTMwOC4uYzk3YjhhNiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX2lzSW5mLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfaXNJbmYuY3BwCkBAIC0xLDUgKzEsNSBAQAotQXJyYXkzZCB2KDEsMiwzKTsKLXYoMSkgKj0gMC4wLzAuMDsKK0FycmF5M2QgdigxLCAyLCAzKTsKK3YoMSkgKj0gMC4wIC8gMC4wOwogdigyKSAvPSAwLjA7CiBjb3V0IDw8IHYgPDwgZW5kbCA8PCBlbmRsOwogY291dCA8PCBpc2luZih2KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2lzTmFOLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9pc05hTi5jcHAKaW5kZXggN2IyYTkzMC4uYWIyYjUyOCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX2lzTmFOLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfaXNOYU4uY3BwCkBAIC0xLDUgKzEsNSBAQAotQXJyYXkzZCB2KDEsMiwzKTsKLXYoMSkgKj0gMC4wLzAuMDsKK0FycmF5M2QgdigxLCAyLCAzKTsKK3YoMSkgKj0gMC4wIC8gMC4wOwogdigyKSAvPSAwLjA7CiBjb3V0IDw8IHYgPDwgZW5kbCA8PCBlbmRsOwogY291dCA8PCBpc25hbih2KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2xlc3MuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2xlc3MuY3BwCmluZGV4IGNhZmQzYjYuLjk1Y2NiMzAgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9sZXNzLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfbGVzcy5jcHAKQEAgLTEsMiArMSwyIEBACi1BcnJheTNkIHYoMSwyLDMpLCB3KDMsMiwxKTsKLWNvdXQgPDwgKHY8dykgPDwgZW5kbDsKK0FycmF5M2QgdigxLCAyLCAzKSwgdygzLCAyLCAxKTsKK2NvdXQgPDwgKHYgPCB3KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2xlc3NfZXF1YWwuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX2xlc3NfZXF1YWwuY3BwCmluZGV4IDE2MDBlMzkuLjA4ZDY1YmUgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9sZXNzX2VxdWFsLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfbGVzc19lcXVhbC5jcHAKQEAgLTEsMiArMSwyIEBACi1BcnJheTNkIHYoMSwyLDMpLCB3KDMsMiwxKTsKLWNvdXQgPDwgKHY8PXcpIDw8IGVuZGw7CitBcnJheTNkIHYoMSwgMiwgMyksIHcoMywgMiwgMSk7Citjb3V0IDw8ICh2IDw9IHcpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfbG9nLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9sb2cuY3BwCmluZGV4IGY3YWNhNzIuLmYzZTEzZDYgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9sb2cuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9sb2cuY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KDEsMiwzKTsKK0FycmF5M2QgdigxLCAyLCAzKTsKIGNvdXQgPDwgdi5sb2coKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX2xvZzEwLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9sb2cxMC5jcHAKaW5kZXggYjdhZTRhOC4uODY1NmY0OCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX2xvZzEwLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfbG9nMTAuY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXk0ZCB2KC0xLDAsMSwyKTsKK0FycmF5NGQgdigtMSwgMCwgMSwgMik7CiBjb3V0IDw8IGxvZzEwKHYpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfbWF4LmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9tYXguY3BwCmluZGV4IDY2MDI4ODEuLmFiOGQzOTcgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9tYXguY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9tYXguY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KDIsMyw0KSwgdyg0LDIsMyk7CitBcnJheTNkIHYoMiwgMywgNCksIHcoNCwgMiwgMyk7CiBjb3V0IDw8IHYubWF4KHcpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfbWluLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9taW4uY3BwCmluZGV4IDFjMDFjNzYuLjc3MWVhZjIgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9taW4uY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9taW4uY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KDIsMyw0KSwgdyg0LDIsMyk7CitBcnJheTNkIHYoMiwgMywgNCksIHcoNCwgMiwgMyk7CiBjb3V0IDw8IHYubWluKHcpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfbWludXMuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX21pbnVzLmNwcAppbmRleCBiODliOWZiLi4xMzg5YjRhIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2VfbWludXMuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9taW51cy5jcHAKQEAgLTEsMiArMSwyIEBACi1BcnJheTNkIHYoMSwyLDMpOwotY291dCA8PCB2LTUgPDwgZW5kbDsKK0FycmF5M2QgdigxLCAyLCAzKTsKK2NvdXQgPDwgdiAtIDUgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9taW51c19lcXVhbC5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfbWludXNfZXF1YWwuY3BwCmluZGV4IGRmZGU0OWQuLjMzNDMzZTAgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9taW51c19lcXVhbC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX21pbnVzX2VxdWFsLmNwcApAQCAtMSwzICsxLDMgQEAKLUFycmF5M2QgdigxLDIsMyk7CitBcnJheTNkIHYoMSwgMiwgMyk7CiB2IC09IDU7CiBjb3V0IDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9ub3RfZXF1YWwuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX25vdF9lcXVhbC5jcHAKaW5kZXggNTdhNDA3YS4uNjBhZWEyYiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX25vdF9lcXVhbC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX25vdF9lcXVhbC5jcHAKQEAgLTEsMiArMSwyIEBACi1BcnJheTNkIHYoMSwyLDMpLCB3KDMsMiwxKTsKLWNvdXQgPDwgKHYhPXcpIDw8IGVuZGw7CitBcnJheTNkIHYoMSwgMiwgMyksIHcoMywgMiwgMSk7Citjb3V0IDw8ICh2ICE9IHcpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfcGx1cy5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfcGx1cy5jcHAKaW5kZXggOWQ0NzMyNy4uN2E4NzhkNiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX3BsdXMuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9wbHVzLmNwcApAQCAtMSwyICsxLDIgQEAKLUFycmF5M2QgdigxLDIsMyk7Ci1jb3V0IDw8IHYrNSA8PCBlbmRsOworQXJyYXkzZCB2KDEsIDIsIDMpOworY291dCA8PCB2ICsgNSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3BsdXNfZXF1YWwuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3BsdXNfZXF1YWwuY3BwCmluZGV4IGQ3NDRiMWUuLjNlMDBiYTIgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9wbHVzX2VxdWFsLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfcGx1c19lcXVhbC5jcHAKQEAgLTEsMyArMSwzIEBACi1BcnJheTNkIHYoMSwyLDMpOworQXJyYXkzZCB2KDEsIDIsIDMpOwogdiArPSA1OwogY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfcG93LmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9wb3cuY3BwCmluZGV4IGE3MjNlZDguLjI4YTlkYzUgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9wb3cuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9wb3cuY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KDgsMjcsNjQpOworQXJyYXkzZCB2KDgsIDI3LCA2NCk7CiBjb3V0IDw8IHYucG93KDAuMzMzMzMzKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3Byb2R1Y3QuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3Byb2R1Y3QuY3BwCmluZGV4IDcxNGQ2NmQuLmNlZTViMjAgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9wcm9kdWN0LmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfcHJvZHVjdC5jcHAKQEAgLTEsNCArMSwzIEBACiBBcnJheTMzaSBhID0gQXJyYXkzM2k6OlJhbmRvbSgpLCBiID0gQXJyYXkzM2k6OlJhbmRvbSgpOwogQXJyYXkzM2kgYyA9IGEgKiBiOwogY291dCA8PCAiYTpcbiIgPDwgYSA8PCAiXG5iOlxuIiA8PCBiIDw8ICJcbmM6XG4iIDw8IGMgPDwgZW5kbDsKLQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3F1b3RpZW50LmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9xdW90aWVudC5jcHAKaW5kZXggN2NiOWY3Zi4uYWI4YjUwNiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX3F1b3RpZW50LmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfcXVvdGllbnQuY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KDIsMyw0KSwgdyg0LDIsMyk7Ci1jb3V0IDw8IHYvdyA8PCBlbmRsOworQXJyYXkzZCB2KDIsIDMsIDQpLCB3KDQsIDIsIDMpOworY291dCA8PCB2IC8gdyA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3JpbnQuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3JpbnQuY3BwCmluZGV4IDFkYzdiMmYuLmViOGJjODQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9yaW50LmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2VfcmludC5jcHAKQEAgLTEsMyArMSwzIEBACi1BcnJheVhkIHYgPSBBcnJheVhkOjpMaW5TcGFjZWQoNywtMiwyKTsKK0FycmF5WGQgdiA9IEFycmF5WGQ6OkxpblNwYWNlZCg3LCAtMiwgMik7CiBjb3V0IDw8IHYgPDwgZW5kbCA8PCBlbmRsOwogY291dCA8PCByaW50KHYpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2Vfcm91bmQuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3JvdW5kLmNwcAppbmRleCBlNWM4ODIzLi5kOWZmNDE3IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2Vfcm91bmQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9yb3VuZC5jcHAKQEAgLTEsMyArMSwzIEBACi1BcnJheVhkIHYgPSBBcnJheVhkOjpMaW5TcGFjZWQoNywtMiwyKTsKK0FycmF5WGQgdiA9IEFycmF5WGQ6OkxpblNwYWNlZCg3LCAtMiwgMik7CiBjb3V0IDw8IHYgPDwgZW5kbCA8PCBlbmRsOwogY291dCA8PCByb3VuZCh2KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3NjYWxhcl9wb3dlcl9hcnJheS5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2Vfc2NhbGFyX3Bvd2VyX2FycmF5LmNwcAppbmRleCBjOTY4YjJjLi42NWJiNDc4IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2Vfc2NhbGFyX3Bvd2VyX2FycmF5LmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2Vfc2NhbGFyX3Bvd2VyX2FycmF5LmNwcApAQCAtMSwyICsxLDIgQEAKLUFycmF5PGRvdWJsZSwxLDM+IGUoMiwtMywxLi8zLik7Ci1jb3V0IDw8ICIxMF5bIiA8PCBlIDw8ICJdID0gIiA8PCBwb3coMTAsZSkgPDwgZW5kbDsKK0FycmF5PGRvdWJsZSwgMSwgMz4gZSgyLCAtMywgMS4gLyAzLik7Citjb3V0IDw8ICIxMF5bIiA8PCBlIDw8ICJdID0gIiA8PCBwb3coMTAsIGUpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2Vfc2lnbi5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2Vfc2lnbi5jcHAKaW5kZXggNDk5MjBlNC4uNTVkMjRhYiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX3NpZ24uY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9zaWduLmNwcApAQCAtMSwyICsxLDIgQEAKLUFycmF5M2QgdigtMyw1LDApOworQXJyYXkzZCB2KC0zLCA1LCAwKTsKIGNvdXQgPDwgdi5zaWduKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9zaW4uY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3Npbi5jcHAKaW5kZXggNDZmYTkwOC4uNDNjNGEwNCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX3Npbi5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3Npbi5jcHAKQEAgLTEsMiArMSwyIEBACi1BcnJheTNkIHYoTV9QSSwgTV9QSS8yLCBNX1BJLzMpOworQXJyYXkzZCB2KE1fUEksIE1fUEkgLyAyLCBNX1BJIC8gMyk7CiBjb3V0IDw8IHYuc2luKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9zaW5oLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9zaW5oLmNwcAppbmRleCBmYWM5YjE5Li5hZWZjZDZkIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2Vfc2luaC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3NpbmguY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXlYZCB2ID0gQXJyYXlYZDo6TGluU3BhY2VkKDUsMCwxKTsKK0FycmF5WGQgdiA9IEFycmF5WGQ6OkxpblNwYWNlZCg1LCAwLCAxKTsKIGNvdXQgPDwgc2luaCh2KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0N3aXNlX3NsYXNoX2VxdWFsLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9zbGFzaF9lcXVhbC5jcHAKaW5kZXggMmVmZDMyZC4uY2I3NzZiOCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX3NsYXNoX2VxdWFsLmNwcAorKysgYi9kb2Mvc25pcHBldHMvQ3dpc2Vfc2xhc2hfZXF1YWwuY3BwCkBAIC0xLDMgKzEsMyBAQAotQXJyYXkzZCB2KDMsMiw0KSwgdyg1LDQsMik7CitBcnJheTNkIHYoMywgMiwgNCksIHcoNSwgNCwgMik7CiB2IC89IHc7CiBjb3V0IDw8IHYgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9zcXJ0LmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV9zcXJ0LmNwcAppbmRleCA5N2JhZmU4Li5lMGU1ZDM2IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvQ3dpc2Vfc3FydC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3NxcnQuY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KDEsMiw0KTsKK0FycmF5M2QgdigxLCAyLCA0KTsKIGNvdXQgPDwgdi5zcXJ0KCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV9zcXVhcmUuY3BwIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3NxdWFyZS5jcHAKaW5kZXggZjcwNGM1ZS4uMmIzMTMyZSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX3NxdWFyZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3NxdWFyZS5jcHAKQEAgLTEsMiArMSwyIEBACi1BcnJheTNkIHYoMiwzLDQpOworQXJyYXkzZCB2KDIsIDMsIDQpOwogY291dCA8PCB2LnNxdWFyZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfdGFuLmNwcCBiL2RvYy9zbmlwcGV0cy9Dd2lzZV90YW4uY3BwCmluZGV4IGI3NThlZjAuLmFiZThkMWMgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV90YW4uY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV90YW4uY3BwCkBAIC0xLDIgKzEsMiBAQAotQXJyYXkzZCB2KE1fUEksIE1fUEkvMiwgTV9QSS8zKTsKK0FycmF5M2QgdihNX1BJLCBNX1BJIC8gMiwgTV9QSSAvIDMpOwogY291dCA8PCB2LnRhbigpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvQ3dpc2VfdGFuaC5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfdGFuaC5jcHAKaW5kZXggMzBjZDA0NS4uYWU4ZmVhNSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0N3aXNlX3RhbmguY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Dd2lzZV90YW5oLmNwcApAQCAtMSwyICsxLDIgQEAKLUFycmF5WGQgdiA9IEFycmF5WGQ6OkxpblNwYWNlZCg1LDAsMSk7CitBcnJheVhkIHYgPSBBcnJheVhkOjpMaW5TcGFjZWQoNSwgMCwgMSk7CiBjb3V0IDw8IHRhbmgodikgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Dd2lzZV90aW1lc19lcXVhbC5jcHAgYi9kb2Mvc25pcHBldHMvQ3dpc2VfdGltZXNfZXF1YWwuY3BwCmluZGV4IDE0NzU1NmMuLjQ1MTUxYmUgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Dd2lzZV90aW1lc19lcXVhbC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0N3aXNlX3RpbWVzX2VxdWFsLmNwcApAQCAtMSwzICsxLDMgQEAKLUFycmF5M2QgdigxLDIsMyksIHcoMiwzLDApOworQXJyYXkzZCB2KDEsIDIsIDMpLCB3KDIsIDMsIDApOwogdiAqPSB3OwogY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX0xpblNwYWNlZC5jcHAgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX0xpblNwYWNlZC5jcHAKaW5kZXggOGU1NGIxNy4uYTU3MDUzZiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9MaW5TcGFjZWQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9EZW5zZUJhc2VfTGluU3BhY2VkLmNwcApAQCAtMSwyICsxLDIgQEAKLWNvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg0LDcsMTApLnRyYW5zcG9zZSgpIDw8IGVuZGw7Ci1jb3V0IDw8IFZlY3RvclhkOjpMaW5TcGFjZWQoNSwwLjAsMS4wKS50cmFuc3Bvc2UoKSA8PCBlbmRsOworY291dCA8PCBWZWN0b3JYaTo6TGluU3BhY2VkKDQsIDcsIDEwKS50cmFuc3Bvc2UoKSA8PCBlbmRsOworY291dCA8PCBWZWN0b3JYZDo6TGluU3BhY2VkKDUsIDAuMCwgMS4wKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9MaW5TcGFjZWRJbnQuY3BwIGIvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9MaW5TcGFjZWRJbnQuY3BwCmluZGV4IDBkN2FlMDYuLjczMmQ3MGEgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9EZW5zZUJhc2VfTGluU3BhY2VkSW50LmNwcAorKysgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX0xpblNwYWNlZEludC5jcHAKQEAgLTEsOCArMSw4IEBACiBjb3V0IDw8ICJFdmVuIHNwYWNpbmcgaW5wdXRzOiIgPDwgZW5kbDsKLWNvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg4LDEsNCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKLWNvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg4LDEsOCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKLWNvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg4LDEsMTUpLnRyYW5zcG9zZSgpIDw8IGVuZGw7Citjb3V0IDw8IFZlY3RvclhpOjpMaW5TcGFjZWQoOCwgMSwgNCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKK2NvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg4LCAxLCA4KS50cmFuc3Bvc2UoKSA8PCBlbmRsOworY291dCA8PCBWZWN0b3JYaTo6TGluU3BhY2VkKDgsIDEsIDE1KS50cmFuc3Bvc2UoKSA8PCBlbmRsOwogY291dCA8PCAiVW5ldmVuIHNwYWNpbmcgaW5wdXRzOiIgPDwgZW5kbDsKLWNvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg4LDEsNykudHJhbnNwb3NlKCkgPDwgZW5kbDsKLWNvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg4LDEsOSkudHJhbnNwb3NlKCkgPDwgZW5kbDsKLWNvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg4LDEsMTYpLnRyYW5zcG9zZSgpIDw8IGVuZGw7Citjb3V0IDw8IFZlY3RvclhpOjpMaW5TcGFjZWQoOCwgMSwgNykudHJhbnNwb3NlKCkgPDwgZW5kbDsKK2NvdXQgPDwgVmVjdG9yWGk6OkxpblNwYWNlZCg4LCAxLCA5KS50cmFuc3Bvc2UoKSA8PCBlbmRsOworY291dCA8PCBWZWN0b3JYaTo6TGluU3BhY2VkKDgsIDEsIDE2KS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9MaW5TcGFjZWRfc2VxX2RlcHJlY2F0ZWQuY3BwIGIvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9MaW5TcGFjZWRfc2VxX2RlcHJlY2F0ZWQuY3BwCmluZGV4IGY1NWM1MDguLjNjNGE1NjUgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9EZW5zZUJhc2VfTGluU3BhY2VkX3NlcV9kZXByZWNhdGVkLmNwcAorKysgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX0xpblNwYWNlZF9zZXFfZGVwcmVjYXRlZC5jcHAKQEAgLTEsMiArMSwyIEBACi1jb3V0IDw8IFZlY3RvclhpOjpMaW5TcGFjZWQoU2VxdWVudGlhbCw0LDcsMTApLnRyYW5zcG9zZSgpIDw8IGVuZGw7Ci1jb3V0IDw8IFZlY3RvclhkOjpMaW5TcGFjZWQoU2VxdWVudGlhbCw1LDAuMCwxLjApLnRyYW5zcG9zZSgpIDw8IGVuZGw7Citjb3V0IDw8IFZlY3RvclhpOjpMaW5TcGFjZWQoU2VxdWVudGlhbCwgNCwgNywgMTApLnRyYW5zcG9zZSgpIDw8IGVuZGw7Citjb3V0IDw8IFZlY3RvclhkOjpMaW5TcGFjZWQoU2VxdWVudGlhbCwgNSwgMC4wLCAxLjApLnRyYW5zcG9zZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX3NldExpblNwYWNlZC5jcHAgYi9kb2Mvc25pcHBldHMvRGVuc2VCYXNlX3NldExpblNwYWNlZC5jcHAKaW5kZXggNDYwNTRmMi4uNmMxZWNhNiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0RlbnNlQmFzZV9zZXRMaW5TcGFjZWQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9EZW5zZUJhc2Vfc2V0TGluU3BhY2VkLmNwcApAQCAtMSwzICsxLDMgQEAKIFZlY3RvclhmIHY7Ci12LnNldExpblNwYWNlZCg1LDAuNWYsMS41Zik7Cit2LnNldExpblNwYWNlZCg1LCAwLjVmLCAxLjVmKTsKIGNvdXQgPDwgdiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0RpcmVjdGlvbldpc2VfaG5vcm1hbGl6ZWQuY3BwIGIvZG9jL3NuaXBwZXRzL0RpcmVjdGlvbldpc2VfaG5vcm1hbGl6ZWQuY3BwCmluZGV4IDI0NTFmNmUuLjhhNDY2NTIgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9EaXJlY3Rpb25XaXNlX2hub3JtYWxpemVkLmNwcAorKysgYi9kb2Mvc25pcHBldHMvRGlyZWN0aW9uV2lzZV9obm9ybWFsaXplZC5jcHAKQEAgLTEsNiArMSw2IEBACi1NYXRyaXg0WGQgTSA9IE1hdHJpeDRYZDo6UmFuZG9tKDQsNSk7CitNYXRyaXg0WGQgTSA9IE1hdHJpeDRYZDo6UmFuZG9tKDQsIDUpOwogUHJvamVjdGl2ZTNkIFAoTWF0cml4NGQ6OlJhbmRvbSgpKTsKIGNvdXQgPDwgIlRoZSBtYXRyaXggTSBpczoiIDw8IGVuZGwgPDwgTSA8PCBlbmRsIDw8IGVuZGw7CiBjb3V0IDw8ICJNLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpOiIgPDwgZW5kbCA8PCBNLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpIDw8IGVuZGwgPDwgZW5kbDsKLWNvdXQgPDwgIlAqTToiIDw8IGVuZGwgPDwgUCpNIDw8IGVuZGwgPDwgZW5kbDsKLWNvdXQgPDwgIihQKk0pLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpOiIgPDwgZW5kbCA8PCAoUCpNKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSA8PCBlbmRsIDw8IGVuZGw7Citjb3V0IDw8ICJQKk06IiA8PCBlbmRsIDw8IFAgKiBNIDw8IGVuZGwgPDwgZW5kbDsKK2NvdXQgPDwgIihQKk0pLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpOiIgPDwgZW5kbCA8PCAoUCAqIE0pLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpIDw8IGVuZGwgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9EaXJlY3Rpb25XaXNlX3JlcGxpY2F0ZS5jcHAgYi9kb2Mvc25pcHBldHMvRGlyZWN0aW9uV2lzZV9yZXBsaWNhdGUuY3BwCmluZGV4IGQ5MmQ0YTMuLmM0NDgzMDcgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9EaXJlY3Rpb25XaXNlX3JlcGxpY2F0ZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0RpcmVjdGlvbldpc2VfcmVwbGljYXRlLmNwcApAQCAtMSw0ICsxLDQgQEAKLU1hdHJpeFhpIG0gPSBNYXRyaXhYaTo6UmFuZG9tKDIsMyk7CitNYXRyaXhYaSBtID0gTWF0cml4WGk6OlJhbmRvbSgyLCAzKTsKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CiBjb3V0IDw8ICJtLmNvbHdpc2UoKS5yZXBsaWNhdGU8Mz4oKSA9IC4uLiIgPDwgZW5kbDsKIGNvdXQgPDwgbS5jb2x3aXNlKCkucmVwbGljYXRlPDM+KCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9FaWdlblNvbHZlcl9NYXRyaXhUeXBlLmNwcCBiL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9FaWdlblNvbHZlcl9NYXRyaXhUeXBlLmNwcAppbmRleCBjMWQ5ZmE4Li5iNTQ0MjVmIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfRWlnZW5Tb2x2ZXJfTWF0cml4VHlwZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX0VpZ2VuU29sdmVyX01hdHJpeFR5cGUuY3BwCkBAIC0xLDQgKzEsNCBAQAotTWF0cml4WGQgQSA9IE1hdHJpeFhkOjpSYW5kb20oNiw2KTsKK01hdHJpeFhkIEEgPSBNYXRyaXhYZDo6UmFuZG9tKDYsIDYpOwogY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSA2eDYgbWF0cml4LCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKIAogRWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVzKEEpOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX2NvbXB1dGUuY3BwIGIvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX2NvbXB1dGUuY3BwCmluZGV4IGE1Yzk2ZTkuLjE2NTI0NjMgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9jb21wdXRlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfY29tcHV0ZS5jcHAKQEAgLTEsNiArMSw2IEBACiBFaWdlblNvbHZlcjxNYXRyaXhYZj4gZXM7Ci1NYXRyaXhYZiBBID0gTWF0cml4WGY6OlJhbmRvbSg0LDQpOworTWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oNCwgNCk7CiBlcy5jb21wdXRlKEEsIC8qIGNvbXB1dGVFaWdlbnZlY3RvcnMgPSAqLyBmYWxzZSk7CiBjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgQSBhcmU6ICIgPDwgZXMuZWlnZW52YWx1ZXMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwotZXMuY29tcHV0ZShBICsgTWF0cml4WGY6OklkZW50aXR5KDQsNCksIGZhbHNlKTsgLy8gcmUtdXNlIGVzIHRvIGNvbXB1dGUgZWlnZW52YWx1ZXMgb2YgQStJCitlcy5jb21wdXRlKEEgKyBNYXRyaXhYZjo6SWRlbnRpdHkoNCwgNCksIGZhbHNlKTsgIC8vIHJlLXVzZSBlcyB0byBjb21wdXRlIGVpZ2VudmFsdWVzIG9mIEErSQogY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIEErSSBhcmU6ICIgPDwgZXMuZWlnZW52YWx1ZXMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcCBiL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9laWdlbnZhbHVlcy5jcHAKaW5kZXggZWQyODg2OS4uODY2MTgzYyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0VpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcAorKysgYi9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCkBAIC0xLDQgKzEsMyBAQAotTWF0cml4WGQgb25lcyA9IE1hdHJpeFhkOjpPbmVzKDMsMyk7CitNYXRyaXhYZCBvbmVzID0gTWF0cml4WGQ6Ok9uZXMoMywgMyk7CiBFaWdlblNvbHZlcjxNYXRyaXhYZD4gZXMob25lcywgZmFsc2UpOwotY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIHRoZSAzeDMgbWF0cml4IG9mIG9uZXMgYXJlOiIgCi0gICAgIDw8IGVuZGwgPDwgZXMuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOworY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIHRoZSAzeDMgbWF0cml4IG9mIG9uZXMgYXJlOiIgPDwgZW5kbCA8PCBlcy5laWdlbnZhbHVlcygpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfZWlnZW52ZWN0b3JzLmNwcCBiL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwCmluZGV4IDgzNTVmNzYuLjZkNDYwNmQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwCkBAIC0xLDQgKzEsMyBAQAotTWF0cml4WGQgb25lcyA9IE1hdHJpeFhkOjpPbmVzKDMsMyk7CitNYXRyaXhYZCBvbmVzID0gTWF0cml4WGQ6Ok9uZXMoMywgMyk7CiBFaWdlblNvbHZlcjxNYXRyaXhYZD4gZXMob25lcyk7Ci1jb3V0IDw8ICJUaGUgZmlyc3QgZWlnZW52ZWN0b3Igb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBpczoiCi0gICAgIDw8IGVuZGwgPDwgZXMuZWlnZW52ZWN0b3JzKCkuY29sKDApIDw8IGVuZGw7Citjb3V0IDw8ICJUaGUgZmlyc3QgZWlnZW52ZWN0b3Igb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBpczoiIDw8IGVuZGwgPDwgZXMuZWlnZW52ZWN0b3JzKCkuY29sKDApIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvRWlnZW5Tb2x2ZXJfcHNldWRvRWlnZW52ZWN0b3JzLmNwcCBiL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9wc2V1ZG9FaWdlbnZlY3RvcnMuY3BwCmluZGV4IDg1ZTI1NjkuLmQ5ZjM2OTggMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9wc2V1ZG9FaWdlbnZlY3RvcnMuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9FaWdlblNvbHZlcl9wc2V1ZG9FaWdlbnZlY3RvcnMuY3BwCkBAIC0xLDQgKzEsNCBAQAotTWF0cml4WGQgQSA9IE1hdHJpeFhkOjpSYW5kb20oNiw2KTsKK01hdHJpeFhkIEEgPSBNYXRyaXhYZDo6UmFuZG9tKDYsIDYpOwogY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSA2eDYgbWF0cml4LCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKIAogRWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVzKEEpOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0Z1bGxQaXZIb3VzZWhvbGRlclFSX3NvbHZlLmNwcCBiL2RvYy9zbmlwcGV0cy9GdWxsUGl2SG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAKaW5kZXggMjNiYzA3NC4uNjIxZDFkMSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0Z1bGxQaXZIb3VzZWhvbGRlclFSX3NvbHZlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvRnVsbFBpdkhvdXNlaG9sZGVyUVJfc29sdmUuY3BwCkBAIC00LDUgKzQsNSBAQAogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IHk6IiA8PCBlbmRsIDw8IHkgPDwgZW5kbDsKIE1hdHJpeDNmIHg7CiB4ID0gbS5mdWxsUGl2SG91c2Vob2xkZXJRcigpLnNvbHZlKHkpOwotYXNzZXJ0KHkuaXNBcHByb3gobSp4KSk7Cithc3NlcnQoeS5pc0FwcHJveChtKiB4KSk7CiBjb3V0IDw8ICJIZXJlIGlzIGEgc29sdXRpb24geCB0byB0aGUgZXF1YXRpb24gbXg9eToiIDw8IGVuZGwgPDwgeCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0Z1bGxQaXZMVV9pbWFnZS5jcHAgYi9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX2ltYWdlLmNwcAppbmRleCA4MTdiYzFlLi5hOGY2NjRlIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX2ltYWdlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX2ltYWdlLmNwcApAQCAtMSw5ICsxLDcgQEAKIE1hdHJpeDNkIG07Ci1tIDw8IDEsMSwwLAotICAgICAxLDMsMiwKLSAgICAgMCwxLDE7CittIDw8IDEsIDEsIDAsIDEsIDMsIDIsIDAsIDEsIDE7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAiTm90aWNlIHRoYXQgdGhlIG1pZGRsZSBjb2x1bW4gaXMgdGhlIHN1bSBvZiB0aGUgdHdvIG90aGVycywgc28gdGhlICIKICAgICAgPDwgImNvbHVtbnMgYXJlIGxpbmVhcmx5IGRlcGVuZGVudC4iIDw8IGVuZGw7Ci1jb3V0IDw8ICJIZXJlIGlzIGEgbWF0cml4IHdob3NlIGNvbHVtbnMgaGF2ZSB0aGUgc2FtZSBzcGFuIGJ1dCBhcmUgbGluZWFybHkgaW5kZXBlbmRlbnQ6IgotICAgICA8PCBlbmRsIDw8IG0uZnVsbFBpdkx1KCkuaW1hZ2UobSkgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgYSBtYXRyaXggd2hvc2UgY29sdW1ucyBoYXZlIHRoZSBzYW1lIHNwYW4gYnV0IGFyZSBsaW5lYXJseSBpbmRlcGVuZGVudDoiIDw8IGVuZGwKKyAgICAgPDwgbS5mdWxsUGl2THUoKS5pbWFnZShtKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0Z1bGxQaXZMVV9rZXJuZWwuY3BwIGIvZG9jL3NuaXBwZXRzL0Z1bGxQaXZMVV9rZXJuZWwuY3BwCmluZGV4IDcwODZlMDEuLjQ0OGE1MTUgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9GdWxsUGl2TFVfa2VybmVsLmNwcAorKysgYi9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX2tlcm5lbC5jcHAKQEAgLTEsNyArMSw1IEBACi1NYXRyaXhYZiBtID0gTWF0cml4WGY6OlJhbmRvbSgzLDUpOworTWF0cml4WGYgbSA9IE1hdHJpeFhmOjpSYW5kb20oMywgNSk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogTWF0cml4WGYga2VyID0gbS5mdWxsUGl2THUoKS5rZXJuZWwoKTsKLWNvdXQgPDwgIkhlcmUgaXMgYSBtYXRyaXggd2hvc2UgY29sdW1ucyBmb3JtIGEgYmFzaXMgb2YgdGhlIGtlcm5lbCBvZiBtOiIKLSAgICAgPDwgZW5kbCA8PCBrZXIgPDwgZW5kbDsKLWNvdXQgPDwgIkJ5IGRlZmluaXRpb24gb2YgdGhlIGtlcm5lbCwgbSprZXIgaXMgemVybzoiCi0gICAgIDw8IGVuZGwgPDwgbSprZXIgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgYSBtYXRyaXggd2hvc2UgY29sdW1ucyBmb3JtIGEgYmFzaXMgb2YgdGhlIGtlcm5lbCBvZiBtOiIgPDwgZW5kbCA8PCBrZXIgPDwgZW5kbDsKK2NvdXQgPDwgIkJ5IGRlZmluaXRpb24gb2YgdGhlIGtlcm5lbCwgbSprZXIgaXMgemVybzoiIDw8IGVuZGwgPDwgbSAqIGtlciA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0Z1bGxQaXZMVV9zb2x2ZS5jcHAgYi9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX3NvbHZlLmNwcAppbmRleCBjMWY4ODIzLi5hNGVjYjgzIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX3NvbHZlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvRnVsbFBpdkxVX3NvbHZlLmNwcApAQCAtMSwxMSArMSw5IEBACi1NYXRyaXg8ZmxvYXQsMiwzPiBtID0gTWF0cml4PGZsb2F0LDIsMz46OlJhbmRvbSgpOworTWF0cml4PGZsb2F0LCAyLCAzPiBtID0gTWF0cml4PGZsb2F0LCAyLCAzPjo6UmFuZG9tKCk7CiBNYXRyaXgyZiB5ID0gTWF0cml4MmY6OlJhbmRvbSgpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCB5OiIgPDwgZW5kbCA8PCB5IDw8IGVuZGw7Ci1NYXRyaXg8ZmxvYXQsMywyPiB4ID0gbS5mdWxsUGl2THUoKS5zb2x2ZSh5KTsKLWlmKChtKngpLmlzQXBwcm94KHkpKQoteworTWF0cml4PGZsb2F0LCAzLCAyPiB4ID0gbS5mdWxsUGl2THUoKS5zb2x2ZSh5KTsKK2lmICgobSAqIHgpLmlzQXBwcm94KHkpKSB7CiAgIGNvdXQgPDwgIkhlcmUgaXMgYSBzb2x1dGlvbiB4IHRvIHRoZSBlcXVhdGlvbiBteD15OiIgPDwgZW5kbCA8PCB4IDw8IGVuZGw7Ci19Ci1lbHNlCit9IGVsc2UKICAgY291dCA8PCAiVGhlIGVxdWF0aW9uIG14PXkgZG9lcyBub3QgaGF2ZSBhbnkgc29sdXRpb24uIiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0dlbmVyYWxpemVkRWlnZW5Tb2x2ZXIuY3BwIGIvZG9jL3NuaXBwZXRzL0dlbmVyYWxpemVkRWlnZW5Tb2x2ZXIuY3BwCmluZGV4IDJhY2RhNDUuLmY3YTcyNTQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9HZW5lcmFsaXplZEVpZ2VuU29sdmVyLmNwcAorKysgYi9kb2Mvc25pcHBldHMvR2VuZXJhbGl6ZWRFaWdlblNvbHZlci5jcHAKQEAgLTEsNiArMSw2IEBACiBHZW5lcmFsaXplZEVpZ2VuU29sdmVyPE1hdHJpeFhmPiBnZXM7Ci1NYXRyaXhYZiBBID0gTWF0cml4WGY6OlJhbmRvbSg0LDQpOwotTWF0cml4WGYgQiA9IE1hdHJpeFhmOjpSYW5kb20oNCw0KTsKK01hdHJpeFhmIEEgPSBNYXRyaXhYZjo6UmFuZG9tKDQsIDQpOworTWF0cml4WGYgQiA9IE1hdHJpeFhmOjpSYW5kb20oNCwgNCk7CiBnZXMuY29tcHV0ZShBLCBCKTsKIGNvdXQgPDwgIlRoZSAoY29tcGxleCkgbnVtZXJhdG9ycyBvZiB0aGUgZ2VuZXJhbHppZWQgZWlnZW52YWx1ZXMgYXJlOiAiIDw8IGdlcy5hbHBoYXMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwogY291dCA8PCAiVGhlIChyZWFsKSBkZW5vbWluYXRvcmUgb2YgdGhlIGdlbmVyYWx6aWVkIGVpZ2VudmFsdWVzIGFyZTogIiA8PCBnZXMuYmV0YXMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX2NvbXB1dGUuY3BwIGIvZG9jL3NuaXBwZXRzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX2NvbXB1dGUuY3BwCmluZGV4IDUwZTM3ODMuLjI5OGI0MGIgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbl9jb21wdXRlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fY29tcHV0ZS5jcHAKQEAgLTEsNiArMSw2IEBACi1NYXRyaXhYY2YgQSA9IE1hdHJpeFhjZjo6UmFuZG9tKDQsNCk7CitNYXRyaXhYY2YgQSA9IE1hdHJpeFhjZjo6UmFuZG9tKDQsIDQpOwogSGVzc2VuYmVyZ0RlY29tcG9zaXRpb248TWF0cml4WGNmPiBoZCg0KTsKIGhkLmNvbXB1dGUoQSk7CiBjb3V0IDw8ICJUaGUgbWF0cml4IEggaW4gdGhlIGRlY29tcG9zaXRpb24gb2YgQSBpczoiIDw8IGVuZGwgPDwgaGQubWF0cml4SCgpIDw8IGVuZGw7Ci1oZC5jb21wdXRlKDIqQSk7IC8vIHJlLXVzZSBoZCB0byBjb21wdXRlIGFuZCBzdG9yZSBkZWNvbXBvc2l0aW9uIG9mIDJBCitoZC5jb21wdXRlKDIgKiBBKTsgIC8vIHJlLXVzZSBoZCB0byBjb21wdXRlIGFuZCBzdG9yZSBkZWNvbXBvc2l0aW9uIG9mIDJBCiBjb3V0IDw8ICJUaGUgbWF0cml4IEggaW4gdGhlIGRlY29tcG9zaXRpb24gb2YgMkEgaXM6IiA8PCBlbmRsIDw8IGhkLm1hdHJpeEgoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX21hdHJpeEguY3BwIGIvZG9jL3NuaXBwZXRzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX21hdHJpeEguY3BwCmluZGV4IGFmMDEzNjYuLjEzODZmZWIgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9IZXNzZW5iZXJnRGVjb21wb3NpdGlvbl9tYXRyaXhILmNwcAorKysgYi9kb2Mvc25pcHBldHMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fbWF0cml4SC5jcHAKQEAgLTEsNCArMSw0IEBACi1NYXRyaXg0ZiBBID0gTWF0cml4WGY6OlJhbmRvbSg0LDQpOworTWF0cml4NGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oNCwgNCk7CiBjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIDR4NCBtYXRyaXg6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPE1hdHJpeFhmPiBoZXNzT2ZBKEEpOwogTWF0cml4WGYgSCA9IGhlc3NPZkEubWF0cml4SCgpOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0hlc3NlbmJlcmdEZWNvbXBvc2l0aW9uX3BhY2tlZE1hdHJpeC5jcHAgYi9kb2Mvc25pcHBldHMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fcGFja2VkTWF0cml4LmNwcAppbmRleCA0ZmE1OTU3Li42NmMxZmQwIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fcGFja2VkTWF0cml4LmNwcAorKysgYi9kb2Mvc25pcHBldHMvSGVzc2VuYmVyZ0RlY29tcG9zaXRpb25fcGFja2VkTWF0cml4LmNwcApAQCAtMSw5ICsxLDggQEAKLU1hdHJpeDRkIEEgPSBNYXRyaXg0ZDo6UmFuZG9tKDQsNCk7CitNYXRyaXg0ZCBBID0gTWF0cml4NGQ6OlJhbmRvbSg0LCA0KTsKIGNvdXQgPDwgIkhlcmUgaXMgYSByYW5kb20gNHg0IG1hdHJpeDoiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOwogSGVzc2VuYmVyZ0RlY29tcG9zaXRpb248TWF0cml4NGQ+IGhlc3NPZkEoQSk7CiBNYXRyaXg0ZCBwbSA9IGhlc3NPZkEucGFja2VkTWF0cml4KCk7CiBjb3V0IDw8ICJUaGUgcGFja2VkIG1hdHJpeCBNIGlzOiIgPDwgZW5kbCA8PCBwbSA8PCBlbmRsOwotY291dCA8PCAiVGhlIHVwcGVyIEhlc3NlbmJlcmcgcGFydCBjb3JyZXNwb25kcyB0byB0aGUgbWF0cml4IEgsIHdoaWNoIGlzOiIgCi0gICAgIDw8IGVuZGwgPDwgaGVzc09mQS5tYXRyaXhIKCkgPDwgZW5kbDsKK2NvdXQgPDwgIlRoZSB1cHBlciBIZXNzZW5iZXJnIHBhcnQgY29ycmVzcG9uZHMgdG8gdGhlIG1hdHJpeCBILCB3aGljaCBpczoiIDw8IGVuZGwgPDwgaGVzc09mQS5tYXRyaXhIKCkgPDwgZW5kbDsKIFZlY3RvcjNkIGhjID0gaGVzc09mQS5ob3VzZWhvbGRlckNvZWZmaWNpZW50cygpOwogY291dCA8PCAiVGhlIHZlY3RvciBvZiBIb3VzZWhvbGRlciBjb2VmZmljaWVudHMgaXM6IiA8PCBlbmRsIDw8IGhjIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvSG91c2Vob2xkZXJRUl9ob3VzZWhvbGRlclEuY3BwIGIvZG9jL3NuaXBwZXRzL0hvdXNlaG9sZGVyUVJfaG91c2Vob2xkZXJRLmNwcAppbmRleCBlODU5Y2U1Li42YjVjYjkyIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvSG91c2Vob2xkZXJRUl9ob3VzZWhvbGRlclEuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Ib3VzZWhvbGRlclFSX2hvdXNlaG9sZGVyUS5jcHAKQEAgLTEsNCArMSw0IEBACi1NYXRyaXhYZiBBKE1hdHJpeFhmOjpSYW5kb20oNSwzKSksIHRoaW5RKE1hdHJpeFhmOjpJZGVudGl0eSg1LDMpKSwgUTsKK01hdHJpeFhmIEEoTWF0cml4WGY6OlJhbmRvbSg1LCAzKSksIHRoaW5RKE1hdHJpeFhmOjpJZGVudGl0eSg1LCAzKSksIFE7CiBBLnNldFJhbmRvbSgpOwogSG91c2Vob2xkZXJRUjxNYXRyaXhYZj4gcXIoQSk7CiBRID0gcXIuaG91c2Vob2xkZXJRKCk7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvSG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAgYi9kb2Mvc25pcHBldHMvSG91c2Vob2xkZXJRUl9zb2x2ZS5jcHAKaW5kZXggOGNjZTZjZS4uMzVkNzBiYSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0hvdXNlaG9sZGVyUVJfc29sdmUuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Ib3VzZWhvbGRlclFSX3NvbHZlLmNwcApAQCAtMSw5ICsxLDkgQEAKLXR5cGVkZWYgTWF0cml4PGZsb2F0LDMsMz4gTWF0cml4M3gzOwordHlwZWRlZiBNYXRyaXg8ZmxvYXQsIDMsIDM+IE1hdHJpeDN4MzsKIE1hdHJpeDN4MyBtID0gTWF0cml4M3gzOjpSYW5kb20oKTsKIE1hdHJpeDNmIHkgPSBNYXRyaXgzZjo6UmFuZG9tKCk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IHk6IiA8PCBlbmRsIDw8IHkgPDwgZW5kbDsKIE1hdHJpeDNmIHg7CiB4ID0gbS5ob3VzZWhvbGRlclFyKCkuc29sdmUoeSk7Ci1hc3NlcnQoeS5pc0FwcHJveChtKngpKTsKK2Fzc2VydCh5LmlzQXBwcm94KG0qIHgpKTsKIGNvdXQgPDwgIkhlcmUgaXMgYSBzb2x1dGlvbiB4IHRvIHRoZSBlcXVhdGlvbiBteD15OiIgPDwgZW5kbCA8PCB4IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvSG91c2Vob2xkZXJTZXF1ZW5jZV9Ib3VzZWhvbGRlclNlcXVlbmNlLmNwcCBiL2RvYy9zbmlwcGV0cy9Ib3VzZWhvbGRlclNlcXVlbmNlX0hvdXNlaG9sZGVyU2VxdWVuY2UuY3BwCmluZGV4IDI2MzJiODMuLmFlMDg4ZTYgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Ib3VzZWhvbGRlclNlcXVlbmNlX0hvdXNlaG9sZGVyU2VxdWVuY2UuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Ib3VzZWhvbGRlclNlcXVlbmNlX0hvdXNlaG9sZGVyU2VxdWVuY2UuY3BwCkBAIC0yLDEwICsyLDEwIEBACiBjb3V0IDw8ICJUaGUgbWF0cml4IHYgaXM6IiA8PCBlbmRsOwogY291dCA8PCB2IDw8IGVuZGw7CiAKLVZlY3RvcjNkIHYwKDEsIHYoMSwwKSwgdigyLDApKTsKK1ZlY3RvcjNkIHYwKDEsIHYoMSwgMCksIHYoMiwgMCkpOwogY291dCA8PCAiVGhlIGZpcnN0IEhvdXNlaG9sZGVyIHZlY3RvciBpczogdl8wID0gIiA8PCB2MC50cmFuc3Bvc2UoKSA8PCBlbmRsOwotVmVjdG9yM2QgdjEoMCwgMSwgdigyLDEpKTsKLWNvdXQgPDwgIlRoZSBzZWNvbmQgSG91c2Vob2xkZXIgdmVjdG9yIGlzOiB2XzEgPSAiIDw8IHYxLnRyYW5zcG9zZSgpICA8PCBlbmRsOworVmVjdG9yM2QgdjEoMCwgMSwgdigyLCAxKSk7Citjb3V0IDw8ICJUaGUgc2Vjb25kIEhvdXNlaG9sZGVyIHZlY3RvciBpczogdl8xID0gIiA8PCB2MS50cmFuc3Bvc2UoKSA8PCBlbmRsOwogVmVjdG9yM2QgdjIoMCwgMCwgMSk7CiBjb3V0IDw8ICJUaGUgdGhpcmQgSG91c2Vob2xkZXIgdmVjdG9yIGlzOiB2XzIgPSAiIDw8IHYyLnRyYW5zcG9zZSgpIDw8IGVuZGw7CiAKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9KYWNvYmlTVkRfYmFzaWMuY3BwIGIvZG9jL3NuaXBwZXRzL0phY29iaVNWRF9iYXNpYy5jcHAKaW5kZXggNmMyMWJhZi4uZjQ1MTcyNyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0phY29iaVNWRF9iYXNpYy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0phY29iaVNWRF9iYXNpYy5jcHAKQEAgLTEsNCArMSw0IEBACi1NYXRyaXhYZiBtID0gTWF0cml4WGY6OlJhbmRvbSgzLDIpOworTWF0cml4WGYgbSA9IE1hdHJpeFhmOjpSYW5kb20oMywgMik7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogSmFjb2JpU1ZEPE1hdHJpeFhmLCBDb21wdXRlVGhpblUgfCBDb21wdXRlVGhpblY+IHN2ZChtKTsKIGNvdXQgPDwgIkl0cyBzaW5ndWxhciB2YWx1ZXMgYXJlOiIgPDwgZW5kbCA8PCBzdmQuc2luZ3VsYXJWYWx1ZXMoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0xMVF9leGFtcGxlLmNwcCBiL2RvYy9zbmlwcGV0cy9MTFRfZXhhbXBsZS5jcHAKaW5kZXggNDZmYjQwNy4uYzQ2NGFjOSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0xMVF9leGFtcGxlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvTExUX2V4YW1wbGUuY3BwCkBAIC0xLDkgKzEsOSBAQAotTWF0cml4WGQgQSgzLDMpOwotQSA8PCA0LC0xLDIsIC0xLDYsMCwgMiwwLDU7CitNYXRyaXhYZCBBKDMsIDMpOworQSA8PCA0LCAtMSwgMiwgLTEsIDYsIDAsIDIsIDAsIDU7CiBjb3V0IDw8ICJUaGUgbWF0cml4IEEgaXMiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOwogCi1MTFQ8TWF0cml4WGQ+IGxsdE9mQShBKTsgLy8gY29tcHV0ZSB0aGUgQ2hvbGVza3kgZGVjb21wb3NpdGlvbiBvZiBBCi1NYXRyaXhYZCBMID0gbGx0T2ZBLm1hdHJpeEwoKTsgLy8gcmV0cmlldmUgZmFjdG9yIEwgIGluIHRoZSBkZWNvbXBvc2l0aW9uCitMTFQ8TWF0cml4WGQ+IGxsdE9mQShBKTsgICAgICAgIC8vIGNvbXB1dGUgdGhlIENob2xlc2t5IGRlY29tcG9zaXRpb24gb2YgQQorTWF0cml4WGQgTCA9IGxsdE9mQS5tYXRyaXhMKCk7ICAvLyByZXRyaWV2ZSBmYWN0b3IgTCAgaW4gdGhlIGRlY29tcG9zaXRpb24KIC8vIFRoZSBwcmV2aW91cyB0d28gbGluZXMgY2FuIGFsc28gYmUgd3JpdHRlbiBhcyAiTCA9IEEubGx0KCkubWF0cml4TCgpIgogCiBjb3V0IDw8ICJUaGUgQ2hvbGVza3kgZmFjdG9yIEwgaXMiIDw8IGVuZGwgPDwgTCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0xMVF9zb2x2ZS5jcHAgYi9kb2Mvc25pcHBldHMvTExUX3NvbHZlLmNwcAppbmRleCA3MDk1ZDJjLi41MjY1OWFiIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTExUX3NvbHZlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvTExUX3NvbHZlLmNwcApAQCAtMSw4ICsxLDcgQEAKLXR5cGVkZWYgTWF0cml4PGZsb2F0LER5bmFtaWMsMj4gRGF0YU1hdHJpeDsKK3R5cGVkZWYgTWF0cml4PGZsb2F0LCBEeW5hbWljLCAyPiBEYXRhTWF0cml4OwogLy8gbGV0J3MgZ2VuZXJhdGUgc29tZSBzYW1wbGVzIG9uIHRoZSAzRCBwbGFuZSBvZiBlcXVhdGlvbiB6ID0gMngrM3kgKHdpdGggc29tZSBub2lzZSkKLURhdGFNYXRyaXggc2FtcGxlcyA9IERhdGFNYXRyaXg6OlJhbmRvbSgxMiwyKTsKLVZlY3RvclhmIGVsZXZhdGlvbnMgPSAyKnNhbXBsZXMuY29sKDApICsgMypzYW1wbGVzLmNvbCgxKSArIFZlY3RvclhmOjpSYW5kb20oMTIpKjAuMTsKK0RhdGFNYXRyaXggc2FtcGxlcyA9IERhdGFNYXRyaXg6OlJhbmRvbSgxMiwgMik7CitWZWN0b3JYZiBlbGV2YXRpb25zID0gMiAqIHNhbXBsZXMuY29sKDApICsgMyAqIHNhbXBsZXMuY29sKDEpICsgVmVjdG9yWGY6OlJhbmRvbSgxMikgKiAwLjE7CiAvLyBhbmQgbGV0J3Mgc29sdmUgc2FtcGxlcyAqIFt4IHldXlQgPSBlbGV2YXRpb25zIGluIGxlYXN0IHNxdWFyZSBzZW5zZToKLU1hdHJpeDxmbG9hdCwyLDE+IHh5Ci0gPSAoc2FtcGxlcy5hZGpvaW50KCkgKiBzYW1wbGVzKS5sbHQoKS5zb2x2ZSgoc2FtcGxlcy5hZGpvaW50KCkqZWxldmF0aW9ucykpOworTWF0cml4PGZsb2F0LCAyLCAxPiB4eSA9IChzYW1wbGVzLmFkam9pbnQoKSAqIHNhbXBsZXMpLmxsdCgpLnNvbHZlKChzYW1wbGVzLmFkam9pbnQoKSAqIGVsZXZhdGlvbnMpKTsKIGNvdXQgPDwgeHkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9MZWFzdFNxdWFyZXNOb3JtYWxFcXVhdGlvbnMuY3BwIGIvZG9jL3NuaXBwZXRzL0xlYXN0U3F1YXJlc05vcm1hbEVxdWF0aW9ucy5jcHAKaW5kZXggOTk3Y2YxNy4uMDA0MzRmNyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0xlYXN0U3F1YXJlc05vcm1hbEVxdWF0aW9ucy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL0xlYXN0U3F1YXJlc05vcm1hbEVxdWF0aW9ucy5jcHAKQEAgLTEsNCArMSwzIEBACiBNYXRyaXhYZiBBID0gTWF0cml4WGY6OlJhbmRvbSgzLCAyKTsKIFZlY3RvclhmIGIgPSBWZWN0b3JYZjo6UmFuZG9tKDMpOwotY291dCA8PCAiVGhlIHNvbHV0aW9uIHVzaW5nIG5vcm1hbCBlcXVhdGlvbnMgaXM6XG4iCi0gICAgIDw8IChBLnRyYW5zcG9zZSgpICogQSkubGRsdCgpLnNvbHZlKEEudHJhbnNwb3NlKCkgKiBiKSA8PCBlbmRsOworY291dCA8PCAiVGhlIHNvbHV0aW9uIHVzaW5nIG5vcm1hbCBlcXVhdGlvbnMgaXM6XG4iIDw8IChBLnRyYW5zcG9zZSgpICogQSkubGRsdCgpLnNvbHZlKEEudHJhbnNwb3NlKCkgKiBiKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL0xlYXN0U3F1YXJlc1FSLmNwcCBiL2RvYy9zbmlwcGV0cy9MZWFzdFNxdWFyZXNRUi5jcHAKaW5kZXggNmM5NzA0NS4uOWY4ZjcyMyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL0xlYXN0U3F1YXJlc1FSLmNwcAorKysgYi9kb2Mvc25pcHBldHMvTGVhc3RTcXVhcmVzUVIuY3BwCkBAIC0xLDQgKzEsMyBAQAogTWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oMywgMik7CiBWZWN0b3JYZiBiID0gVmVjdG9yWGY6OlJhbmRvbSgzKTsKLWNvdXQgPDwgIlRoZSBzb2x1dGlvbiB1c2luZyB0aGUgUVIgZGVjb21wb3NpdGlvbiBpczpcbiIKLSAgICAgPDwgQS5jb2xQaXZIb3VzZWhvbGRlclFyKCkuc29sdmUoYikgPDwgZW5kbDsKK2NvdXQgPDwgIlRoZSBzb2x1dGlvbiB1c2luZyB0aGUgUVIgZGVjb21wb3NpdGlvbiBpczpcbiIgPDwgQS5jb2xQaXZIb3VzZWhvbGRlclFyKCkuc29sdmUoYikgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXBfZ2VuZXJhbF9zdHJpZGUuY3BwIGIvZG9jL3NuaXBwZXRzL01hcF9nZW5lcmFsX3N0cmlkZS5jcHAKaW5kZXggMDY1N2U3Zi4uZTI2NzdmZiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hcF9nZW5lcmFsX3N0cmlkZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hcF9nZW5lcmFsX3N0cmlkZS5jcHAKQEAgLTEsNSArMSwzIEBACiBpbnQgYXJyYXlbMjRdOwotZm9yKGludCBpID0gMDsgaSA8IDI0OyArK2kpIGFycmF5W2ldID0gaTsKLWNvdXQgPDwgTWFwPE1hdHJpeFhpLCAwLCBTdHJpZGU8RHluYW1pYywyPiA+Ci0gICAgICAgICAoYXJyYXksIDMsIDMsIFN0cmlkZTxEeW5hbWljLDI+KDgsIDIpKQotICAgICA8PCBlbmRsOworZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgKytpKSBhcnJheVtpXSA9IGk7Citjb3V0IDw8IE1hcDxNYXRyaXhYaSwgMCwgU3RyaWRlPER5bmFtaWMsIDI+ID4oYXJyYXksIDMsIDMsIFN0cmlkZTxEeW5hbWljLCAyPig4LCAyKSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXBfaW5uZXJfc3RyaWRlLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXBfaW5uZXJfc3RyaWRlLmNwcAppbmRleCBkOTVhZTliLi5mMzE1NzU2IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWFwX2lubmVyX3N0cmlkZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hcF9pbm5lcl9zdHJpZGUuY3BwCkBAIC0xLDUgKzEsNCBAQAogaW50IGFycmF5WzEyXTsKLWZvcihpbnQgaSA9IDA7IGkgPCAxMjsgKytpKSBhcnJheVtpXSA9IGk7Ci1jb3V0IDw8IE1hcDxWZWN0b3JYaSwgMCwgSW5uZXJTdHJpZGU8Mj4gPgotICAgICAgICAgKGFycmF5LCA2KSAvLyB0aGUgaW5uZXIgc3RyaWRlIGhhcyBhbHJlYWR5IGJlZW4gcGFzc2VkIGFzIHRlbXBsYXRlIHBhcmFtZXRlcgorZm9yIChpbnQgaSA9IDA7IGkgPCAxMjsgKytpKSBhcnJheVtpXSA9IGk7Citjb3V0IDw8IE1hcDxWZWN0b3JYaSwgMCwgSW5uZXJTdHJpZGU8Mj4gPihhcnJheSwgNikgIC8vIHRoZSBpbm5lciBzdHJpZGUgaGFzIGFscmVhZHkgYmVlbiBwYXNzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVyCiAgICAgIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWFwX291dGVyX3N0cmlkZS5jcHAgYi9kb2Mvc25pcHBldHMvTWFwX291dGVyX3N0cmlkZS5jcHAKaW5kZXggMmY2ZjA1Mi4uNzViMTY1NSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hcF9vdXRlcl9zdHJpZGUuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXBfb3V0ZXJfc3RyaWRlLmNwcApAQCAtMSwzICsxLDMgQEAKIGludCBhcnJheVsxMl07Ci1mb3IoaW50IGkgPSAwOyBpIDwgMTI7ICsraSkgYXJyYXlbaV0gPSBpOworZm9yIChpbnQgaSA9IDA7IGkgPCAxMjsgKytpKSBhcnJheVtpXSA9IGk7CiBjb3V0IDw8IE1hcDxNYXRyaXhYaSwgMCwgT3V0ZXJTdHJpZGU8PiA+KGFycmF5LCAzLCAzLCBPdXRlclN0cmlkZTw+KDQpKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hcF9wbGFjZW1lbnRfbmV3LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXBfcGxhY2VtZW50X25ldy5jcHAKaW5kZXggODNiODNhOC4uZWI1MjEzZCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hcF9wbGFjZW1lbnRfbmV3LmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWFwX3BsYWNlbWVudF9uZXcuY3BwCkBAIC0xLDUgKzEsNSBAQAotaW50IGRhdGFbXSA9IHsxLDIsMyw0LDUsNiw3LDgsOX07Ci1NYXA8Um93VmVjdG9yWGk+IHYoZGF0YSw0KTsKK2ludCBkYXRhW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOX07CitNYXA8Um93VmVjdG9yWGk+IHYoZGF0YSwgNCk7CiBjb3V0IDw8ICJUaGUgbWFwcGVkIHZlY3RvciB2IGlzOiAiIDw8IHYgPDwgIlxuIjsKLW5ldyAoJnYpIE1hcDxSb3dWZWN0b3JYaT4oZGF0YSs0LDUpOworbmV3ICgmdikgTWFwPFJvd1ZlY3RvclhpPihkYXRhICsgNCwgNSk7CiBjb3V0IDw8ICJOb3cgdiBpczogIiA8PCB2IDw8ICJcbiI7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWFwX3NpbXBsZS5jcHAgYi9kb2Mvc25pcHBldHMvTWFwX3NpbXBsZS5jcHAKaW5kZXggNDIzYmI1Mi4uM2U4ZmE4MSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hcF9zaW1wbGUuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXBfc2ltcGxlLmNwcApAQCAtMSwzICsxLDMgQEAKIGludCBhcnJheVs5XTsKLWZvcihpbnQgaSA9IDA7IGkgPCA5OyArK2kpIGFycmF5W2ldID0gaTsKK2ZvciAoaW50IGkgPSAwOyBpIDwgOTsgKytpKSBhcnJheVtpXSA9IGk7CiBjb3V0IDw8IE1hcDxNYXRyaXgzaT4oYXJyYXkpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hbGwuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYWxsLmNwcAppbmRleCA0NmYyNmYxLi5mMzFkMTBjIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hbGwuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FsbC5jcHAKQEAgLTEsNyArMSw3IEBACiBWZWN0b3IzZiBib3hNaW4oVmVjdG9yM2Y6Olplcm8oKSksIGJveE1heChWZWN0b3IzZjo6T25lcygpKTsKIFZlY3RvcjNmIHAwID0gVmVjdG9yM2Y6OlJhbmRvbSgpLCBwMSA9IFZlY3RvcjNmOjpSYW5kb20oKS5jd2lzZUFicygpOwogLy8gbGV0J3MgY2hlY2sgaWYgcDAgYW5kIHAxIGFyZSBpbnNpZGUgdGhlIGF4aXMgYWxpZ25lZCBib3ggZGVmaW5lZCBieSB0aGUgY29ybmVycyBib3hNaW4sYm94TWF4OgotY291dCA8PCAiSXMgKCIgPDwgcDAudHJhbnNwb3NlKCkgPDwgIikgaW5zaWRlIHRoZSBib3g6ICIKLSAgICAgPDwgKChib3hNaW4uYXJyYXkoKTxwMC5hcnJheSgpKS5hbGwoKSAmJiAoYm94TWF4LmFycmF5KCk+cDAuYXJyYXkoKSkuYWxsKCkpIDw8IGVuZGw7Ci1jb3V0IDw8ICJJcyAoIiA8PCBwMS50cmFuc3Bvc2UoKSA8PCAiKSBpbnNpZGUgdGhlIGJveDogIgotICAgICA8PCAoKGJveE1pbi5hcnJheSgpPHAxLmFycmF5KCkpLmFsbCgpICYmIChib3hNYXguYXJyYXkoKT5wMS5hcnJheSgpKS5hbGwoKSkgPDwgZW5kbDsKK2NvdXQgPDwgIklzICgiIDw8IHAwLnRyYW5zcG9zZSgpCisgICAgIDw8ICIpIGluc2lkZSB0aGUgYm94OiAiIDw8ICgoYm94TWluLmFycmF5KCkgPCBwMC5hcnJheSgpKS5hbGwoKSAmJiAoYm94TWF4LmFycmF5KCkgPiBwMC5hcnJheSgpKS5hbGwoKSkgPDwgZW5kbDsKK2NvdXQgPDwgIklzICgiIDw8IHAxLnRyYW5zcG9zZSgpCisgICAgIDw8ICIpIGluc2lkZSB0aGUgYm94OiAiIDw8ICgoYm94TWluLmFycmF5KCkgPCBwMS5hcnJheSgpKS5hbGwoKSAmJiAoYm94TWF4LmFycmF5KCkgPiBwMS5hcnJheSgpKS5hbGwoKSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FwcGx5T25UaGVMZWZ0LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FwcGx5T25UaGVMZWZ0LmNwcAppbmRleCA2Mzk4Yzg3Li4wMDY3NmEzIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hcHBseU9uVGhlTGVmdC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXBwbHlPblRoZUxlZnQuY3BwCkBAIC0xLDcgKzEsNSBAQAotTWF0cml4M2YgQSA9IE1hdHJpeDNmOjpSYW5kb20oMywzKSwgQjsKLUIgPDwgMCwxLDAsICAKLSAgICAgMCwwLDEsICAKLSAgICAgMSwwLDA7CitNYXRyaXgzZiBBID0gTWF0cml4M2Y6OlJhbmRvbSgzLCAzKSwgQjsKK0IgPDwgMCwgMSwgMCwgMCwgMCwgMSwgMSwgMCwgMDsKIGNvdXQgPDwgIkF0IHN0YXJ0LCBBID0gIiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKLUEuYXBwbHlPblRoZUxlZnQoQik7IAorQS5hcHBseU9uVGhlTGVmdChCKTsKIGNvdXQgPDwgIkFmdGVyIGFwcGx5T25UaGVMZWZ0LCBBID0gIiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FwcGx5T25UaGVSaWdodC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hcHBseU9uVGhlUmlnaHQuY3BwCmluZGV4IGU0YjcxYjIuLmExMDA4YzYgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FwcGx5T25UaGVSaWdodC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXBwbHlPblRoZVJpZ2h0LmNwcApAQCAtMSw3ICsxLDUgQEAKLU1hdHJpeDNmIEEgPSBNYXRyaXgzZjo6UmFuZG9tKDMsMyksIEI7Ci1CIDw8IDAsMSwwLCAgCi0gICAgIDAsMCwxLCAgCi0gICAgIDEsMCwwOworTWF0cml4M2YgQSA9IE1hdHJpeDNmOjpSYW5kb20oMywgMyksIEI7CitCIDw8IDAsIDEsIDAsIDAsIDAsIDEsIDEsIDAsIDA7CiBjb3V0IDw8ICJBdCBzdGFydCwgQSA9ICIgPDwgZW5kbCA8PCBBIDw8IGVuZGw7CiBBICo9IEI7CiBjb3V0IDw8ICJBZnRlciBBICo9IEIsIEEgPSAiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXJyYXkuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXJyYXkuY3BwCmluZGV4IGYyMTUwODYuLjQ1NmQxZDYgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FycmF5LmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hcnJheS5jcHAKQEAgLTEsNCArMSw0IEBACi1WZWN0b3IzZCB2KDEsMiwzKTsKK1ZlY3RvcjNkIHYoMSwgMiwgMyk7CiB2LmFycmF5KCkgKz0gMzsKIHYuYXJyYXkoKSAtPSAyOwogY291dCA8PCB2IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hcnJheV9jb25zdC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hcnJheV9jb25zdC5jcHAKaW5kZXggY2QzYjI2YS4uZTY2MmY2YyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYXJyYXlfY29uc3QuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FycmF5X2NvbnN0LmNwcApAQCAtMSw0ICsxLDQgQEAKLVZlY3RvcjNkIHYoLTEsMiwtMyk7CitWZWN0b3IzZCB2KC0xLCAyLCAtMyk7CiBjb3V0IDw8ICJ0aGUgYWJzb2x1dGUgdmFsdWVzOiIgPDwgZW5kbCA8PCB2LmFycmF5KCkuYWJzKCkgPDwgZW5kbDsKLWNvdXQgPDwgInRoZSBhYnNvbHV0ZSB2YWx1ZXMgcGx1cyBvbmU6IiA8PCBlbmRsIDw8IHYuYXJyYXkoKS5hYnMoKSsxIDw8IGVuZGw7Citjb3V0IDw8ICJ0aGUgYWJzb2x1dGUgdmFsdWVzIHBsdXMgb25lOiIgPDwgZW5kbCA8PCB2LmFycmF5KCkuYWJzKCkgKyAxIDw8IGVuZGw7CiBjb3V0IDw8ICJzdW0gb2YgdGhlIHNxdWFyZXM6ICIgPDwgdi5hcnJheSgpLnNxdWFyZSgpLnN1bSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9hc0RpYWdvbmFsLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FzRGlhZ29uYWwuY3BwCmluZGV4IGIwMTA4MmQuLjYzN2U5NWIgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FzRGlhZ29uYWwuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2FzRGlhZ29uYWwuY3BwCkBAIC0xICsxIEBACi1jb3V0IDw8IE1hdHJpeDNpKFZlY3RvcjNpKDIsNSw2KS5hc0RpYWdvbmFsKCkpIDw8IGVuZGw7Citjb3V0IDw8IE1hdHJpeDNpKFZlY3RvcjNpKDIsIDUsIDYpLmFzRGlhZ29uYWwoKSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2Jsb2NrX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYmxvY2tfaW50X2ludC5jcHAKaW5kZXggZjk5YjZkNC4uYWRlNzNlZSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYmxvY2tfaW50X2ludC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfYmxvY2tfaW50X2ludC5jcHAKQEAgLTEsNSArMSw1IEBACiBNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKLWNvdXQgPDwgIkhlcmUgaXMgbS5ibG9jazwyLDI+KDEsMSk6IiA8PCBlbmRsIDw8IG0uYmxvY2s8MiwyPigxLDEpIDw8IGVuZGw7Ci1tLmJsb2NrPDIsMj4oMSwxKS5zZXRaZXJvKCk7Citjb3V0IDw8ICJIZXJlIGlzIG0uYmxvY2s8MiwyPigxLDEpOiIgPDwgZW5kbCA8PCBtLmJsb2NrPDIsIDI+KDEsIDEpIDw8IGVuZGw7CittLmJsb2NrPDIsIDI+KDEsIDEpLnNldFplcm8oKTsKIGNvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jb2wuY3BwCmluZGV4IDg3YzkxYjEuLmNmMDI0MWUgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29sLmNwcApAQCAtMSwzICsxLDMgQEAKIE1hdHJpeDNkIG0gPSBNYXRyaXgzZDo6SWRlbnRpdHkoKTsKLW0uY29sKDEpID0gVmVjdG9yM2QoNCw1LDYpOworbS5jb2woMSkgPSBWZWN0b3IzZCg0LCA1LCA2KTsKIGNvdXQgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29sd2lzZS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jb2x3aXNlLmNwcAppbmRleCBhMDQ4YmVmLi5hMzEwMzNkIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jb2x3aXNlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jb2x3aXNlLmNwcApAQCAtMSw1ICsxLDQgQEAKIE1hdHJpeDNkIG0gPSBNYXRyaXgzZDo6UmFuZG9tKCk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyB0aGUgc3VtIG9mIGVhY2ggY29sdW1uOiIgPDwgZW5kbCA8PCBtLmNvbHdpc2UoKS5zdW0oKSA8PCBlbmRsOwotY291dCA8PCAiSGVyZSBpcyB0aGUgbWF4aW11bSBhYnNvbHV0ZSB2YWx1ZSBvZiBlYWNoIGNvbHVtbjoiCi0gICAgIDw8IGVuZGwgPDwgbS5jd2lzZUFicygpLmNvbHdpc2UoKS5tYXhDb2VmZigpIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIG9mIGVhY2ggY29sdW1uOiIgPDwgZW5kbCA8PCBtLmN3aXNlQWJzKCkuY29sd2lzZSgpLm1heENvZWZmKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbHdpc2VfaXRlcmF0b3JfY3h4MTEuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29sd2lzZV9pdGVyYXRvcl9jeHgxMS5jcHAKaW5kZXggMTE2MDYzZi4uYzAzMzA0MyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29sd2lzZV9pdGVyYXRvcl9jeHgxMS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29sd2lzZV9pdGVyYXRvcl9jeHgxMS5jcHAKQEAgLTEsMTIgKzEsMTEgQEAKIE1hdHJpeDNpIG0gPSBNYXRyaXgzaTo6UmFuZG9tKCk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBpbml0aWFsIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CiBpbnQgaSA9IC0xOwotZm9yKGF1dG8gYzogbS5jb2x3aXNlKCkpIHsKK2ZvciAoYXV0byBjIDogbS5jb2x3aXNlKCkpIHsKICAgYyAqPSBpOwogICArK2k7CiB9CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbSBhZnRlciB0aGUgZm9yLXJhbmdlLWxvb3A6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKIGF1dG8gY29scyA9IG0uY29sd2lzZSgpOwotYXV0byBpdCA9IHN0ZDo6ZmluZF9pZihjb2xzLmNiZWdpbigpLCBjb2xzLmNlbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgW10oTWF0cml4M2k6OkNvbnN0Q29sWHByIHgpIHsgcmV0dXJuIHguc3F1YXJlZE5vcm0oKSA9PSAwOyB9KTsKLWNvdXQgPDwgIlRoZSBmaXJzdCBlbXB0eSBjb2x1bW4gaXM6ICIgPDwgZGlzdGFuY2UoY29scy5jYmVnaW4oKSxpdCkgPDwgZW5kbDsKK2F1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoY29scy5jYmVnaW4oKSwgY29scy5jZW5kKCksIFtdKE1hdHJpeDNpOjpDb25zdENvbFhwciB4KSB7IHJldHVybiB4LnNxdWFyZWROb3JtKCkgPT0gMDsgfSk7Citjb3V0IDw8ICJUaGUgZmlyc3QgZW1wdHkgY29sdW1uIGlzOiAiIDw8IGRpc3RhbmNlKGNvbHMuY2JlZ2luKCksIGl0KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2suY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2suY3BwCmluZGV4IGE3YjA4NGYuLjc3NGQ0ZDQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbXB1dGVJbnZlcnNlQW5kRGV0V2l0aENoZWNrLmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jb21wdXRlSW52ZXJzZUFuZERldFdpdGhDaGVjay5jcHAKQEAgLTMsMTEgKzMsMTAgQEAKIE1hdHJpeDNkIGludmVyc2U7CiBib29sIGludmVydGlibGU7CiBkb3VibGUgZGV0ZXJtaW5hbnQ7Ci1tLmNvbXB1dGVJbnZlcnNlQW5kRGV0V2l0aENoZWNrKGludmVyc2UsZGV0ZXJtaW5hbnQsaW52ZXJ0aWJsZSk7CittLmNvbXB1dGVJbnZlcnNlQW5kRGV0V2l0aENoZWNrKGludmVyc2UsIGRldGVybWluYW50LCBpbnZlcnRpYmxlKTsKIGNvdXQgPDwgIkl0cyBkZXRlcm1pbmFudCBpcyAiIDw8IGRldGVybWluYW50IDw8IGVuZGw7Ci1pZihpbnZlcnRpYmxlKSB7CitpZiAoaW52ZXJ0aWJsZSkgewogICBjb3V0IDw8ICJJdCBpcyBpbnZlcnRpYmxlLCBhbmQgaXRzIGludmVyc2UgaXM6IiA8PCBlbmRsIDw8IGludmVyc2UgPDwgZW5kbDsKLX0KLWVsc2UgeworfSBlbHNlIHsKICAgY291dCA8PCAiSXQgaXMgbm90IGludmVydGlibGUuIiA8PCBlbmRsOwogfQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29tcHV0ZUludmVyc2VXaXRoQ2hlY2suY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY29tcHV0ZUludmVyc2VXaXRoQ2hlY2suY3BwCmluZGV4IDg3M2E5ZjguLjdjOTUxMDAgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2NvbXB1dGVJbnZlcnNlV2l0aENoZWNrLmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jb21wdXRlSW52ZXJzZVdpdGhDaGVjay5jcHAKQEAgLTIsMTAgKzIsOSBAQAogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKIE1hdHJpeDNkIGludmVyc2U7CiBib29sIGludmVydGlibGU7Ci1tLmNvbXB1dGVJbnZlcnNlV2l0aENoZWNrKGludmVyc2UsaW52ZXJ0aWJsZSk7Ci1pZihpbnZlcnRpYmxlKSB7CittLmNvbXB1dGVJbnZlcnNlV2l0aENoZWNrKGludmVyc2UsIGludmVydGlibGUpOworaWYgKGludmVydGlibGUpIHsKICAgY291dCA8PCAiSXQgaXMgaW52ZXJ0aWJsZSwgYW5kIGl0cyBpbnZlcnNlIGlzOiIgPDwgZW5kbCA8PCBpbnZlcnNlIDw8IGVuZGw7Ci19Ci1lbHNlIHsKK30gZWxzZSB7CiAgIGNvdXQgPDwgIkl0IGlzIG5vdCBpbnZlcnRpYmxlLiIgPDwgZW5kbDsKIH0KZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlQWJzLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlQWJzLmNwcAppbmRleCAyOGEzMTYwLi5lNDI0MTkwIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZUFicy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VBYnMuY3BwCkBAIC0xLDQgKzEsMyBAQAotTWF0cml4WGQgbSgyLDMpOwotbSA8PCAyLCAtNCwgNiwgICAKLSAgICAgLTUsIDEsIDA7CitNYXRyaXhYZCBtKDIsIDMpOworbSA8PCAyLCAtNCwgNiwgLTUsIDEsIDA7CiBjb3V0IDw8IG0uY3dpc2VBYnMoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VBYnMyLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlQWJzMi5jcHAKaW5kZXggODg5YTJlMi4uOTUyYmE5ZCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VBYnMyLmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZUFiczIuY3BwCkBAIC0xLDQgKzEsMyBAQAotTWF0cml4WGQgbSgyLDMpOwotbSA8PCAyLCAtNCwgNiwgICAKLSAgICAgLTUsIDEsIDA7CitNYXRyaXhYZCBtKDIsIDMpOworbSA8PCAyLCAtNCwgNiwgLTUsIDEsIDA7CiBjb3V0IDw8IG0uY3dpc2VBYnMyKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlRXF1YWwuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VFcXVhbC5jcHAKaW5kZXggNDY5YWY2NC4uZGFlNTUzYyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VFcXVhbC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VFcXVhbC5jcHAKQEAgLTEsNyArMSw2IEBACi1NYXRyaXhYaSBtKDIsMik7Ci1tIDw8IDEsIDAsCi0gICAgIDEsIDE7CitNYXRyaXhYaSBtKDIsIDIpOworbSA8PCAxLCAwLCAxLCAxOwogY291dCA8PCAiQ29tcGFyaW5nIG0gd2l0aCBpZGVudGl0eSBtYXRyaXg6IiA8PCBlbmRsOwotY291dCA8PCBtLmN3aXNlRXF1YWwoTWF0cml4WGk6OklkZW50aXR5KDIsMikpIDw8IGVuZGw7Ci1JbmRleCBjb3VudCA9IG0uY3dpc2VFcXVhbChNYXRyaXhYaTo6SWRlbnRpdHkoMiwyKSkuY291bnQoKTsKK2NvdXQgPDwgbS5jd2lzZUVxdWFsKE1hdHJpeFhpOjpJZGVudGl0eSgyLCAyKSkgPDwgZW5kbDsKK0luZGV4IGNvdW50ID0gbS5jd2lzZUVxdWFsKE1hdHJpeFhpOjpJZGVudGl0eSgyLCAyKSkuY291bnQoKTsKIGNvdXQgPDwgIk51bWJlciBvZiBjb2VmZmljaWVudHMgdGhhdCBhcmUgZXF1YWw6ICIgPDwgY291bnQgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlSW52ZXJzZS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZUludmVyc2UuY3BwCmluZGV4IDIzZTA4ZjcuLjc0NTUxY2IgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlSW52ZXJzZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VJbnZlcnNlLmNwcApAQCAtMSw0ICsxLDMgQEAKLU1hdHJpeFhkIG0oMiwzKTsKLW0gPDwgMiwgMC41LCAxLCAgIAotICAgICAzLCAwLjI1LCAxOworTWF0cml4WGQgbSgyLCAzKTsKK20gPDwgMiwgMC41LCAxLCAzLCAwLjI1LCAxOwogY291dCA8PCBtLmN3aXNlSW52ZXJzZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZU1heC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZU1heC5jcHAKaW5kZXggM2M5NTY4MS4uY2Q2MTNiNSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VNYXguY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlTWF4LmNwcApAQCAtMSwyICsxLDIgQEAKLVZlY3RvcjNkIHYoMiwzLDQpLCB3KDQsMiwzKTsKK1ZlY3RvcjNkIHYoMiwgMywgNCksIHcoNCwgMiwgMyk7CiBjb3V0IDw8IHYuY3dpc2VNYXgodykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlTWluLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlTWluLmNwcAppbmRleCA4MmZjNzYxLi42ZmE5M2YzIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZU1pbi5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VNaW4uY3BwCkBAIC0xLDIgKzEsMiBAQAotVmVjdG9yM2QgdigyLDMsNCksIHcoNCwyLDMpOworVmVjdG9yM2QgdigyLCAzLCA0KSwgdyg0LCAyLCAzKTsKIGNvdXQgPDwgdi5jd2lzZU1pbih3KSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VOb3RFcXVhbC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZU5vdEVxdWFsLmNwcAppbmRleCA3ZjBhMTA1Li4xYTNlYzczIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZU5vdEVxdWFsLmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZU5vdEVxdWFsLmNwcApAQCAtMSw3ICsxLDYgQEAKLU1hdHJpeFhpIG0oMiwyKTsKLW0gPDwgMSwgMCwKLSAgICAgMSwgMTsKK01hdHJpeFhpIG0oMiwgMik7CittIDw8IDEsIDAsIDEsIDE7CiBjb3V0IDw8ICJDb21wYXJpbmcgbSB3aXRoIGlkZW50aXR5IG1hdHJpeDoiIDw8IGVuZGw7Ci1jb3V0IDw8IG0uY3dpc2VOb3RFcXVhbChNYXRyaXhYaTo6SWRlbnRpdHkoMiwyKSkgPDwgZW5kbDsKLUluZGV4IGNvdW50ID0gbS5jd2lzZU5vdEVxdWFsKE1hdHJpeFhpOjpJZGVudGl0eSgyLDIpKS5jb3VudCgpOworY291dCA8PCBtLmN3aXNlTm90RXF1YWwoTWF0cml4WGk6OklkZW50aXR5KDIsIDIpKSA8PCBlbmRsOworSW5kZXggY291bnQgPSBtLmN3aXNlTm90RXF1YWwoTWF0cml4WGk6OklkZW50aXR5KDIsIDIpKS5jb3VudCgpOwogY291dCA8PCAiTnVtYmVyIG9mIGNvZWZmaWNpZW50cyB0aGF0IGFyZSBub3QgZXF1YWw6ICIgPDwgY291bnQgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlUHJvZHVjdC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZVByb2R1Y3QuY3BwCmluZGV4IDFkYjNhMTEuLjc5NTQwYTkgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlUHJvZHVjdC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VQcm9kdWN0LmNwcApAQCAtMSw0ICsxLDMgQEAKIE1hdHJpeDNpIGEgPSBNYXRyaXgzaTo6UmFuZG9tKCksIGIgPSBNYXRyaXgzaTo6UmFuZG9tKCk7CiBNYXRyaXgzaSBjID0gYS5jd2lzZVByb2R1Y3QoYik7CiBjb3V0IDw8ICJhOlxuIiA8PCBhIDw8ICJcbmI6XG4iIDw8IGIgPDwgIlxuYzpcbiIgPDwgYyA8PCBlbmRsOwotCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZVF1b3RpZW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlUXVvdGllbnQuY3BwCmluZGV4IDk2OTEyMTIuLmM3ODExMGYgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlUXVvdGllbnQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlUXVvdGllbnQuY3BwCkBAIC0xLDIgKzEsMiBAQAotVmVjdG9yM2QgdigyLDMsNCksIHcoNCwyLDMpOworVmVjdG9yM2QgdigyLCAzLCA0KSwgdyg0LCAyLCAzKTsKIGNvdXQgPDwgdi5jd2lzZVF1b3RpZW50KHcpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZVNpZ24uY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VTaWduLmNwcAppbmRleCBlZmQ3MTc5Li5jMmVlOTRkIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZVNpZ24uY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlU2lnbi5jcHAKQEAgLTEsNCArMSwzIEBACi1NYXRyaXhYZCBtKDIsMyk7Ci1tIDw8ICAyLCAtNCwgNiwKLSAgICAgLTUsICAxLCAwOworTWF0cml4WGQgbSgyLCAzKTsKK20gPDwgMiwgLTQsIDYsIC01LCAxLCAwOwogY291dCA8PCBtLmN3aXNlU2lnbigpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZVNxcnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfY3dpc2VTcXJ0LmNwcAppbmRleCA0YmZkNzVkLi41YmZiNWYzIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9jd2lzZVNxcnQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2N3aXNlU3FydC5jcHAKQEAgLTEsMiArMSwyIEBACi1WZWN0b3IzZCB2KDEsMiw0KTsKK1ZlY3RvcjNkIHYoMSwgMiwgNCk7CiBjb3V0IDw8IHYuY3dpc2VTcXJ0KCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2RpYWdvbmFsLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2RpYWdvbmFsLmNwcAppbmRleCBjZDYzNDEzLi5jMTVkY2YxIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9kaWFnb25hbC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZGlhZ29uYWwuY3BwCkBAIC0xLDQgKzEsMyBAQAogTWF0cml4M2kgbSA9IE1hdHJpeDNpOjpSYW5kb20oKTsKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7Ci1jb3V0IDw8ICJIZXJlIGFyZSB0aGUgY29lZmZpY2llbnRzIG9uIHRoZSBtYWluIGRpYWdvbmFsIG9mIG06IiA8PCBlbmRsCi0gICAgIDw8IG0uZGlhZ29uYWwoKSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBhcmUgdGhlIGNvZWZmaWNpZW50cyBvbiB0aGUgbWFpbiBkaWFnb25hbCBvZiBtOiIgPDwgZW5kbCA8PCBtLmRpYWdvbmFsKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2VpZ2VudmFsdWVzLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2VpZ2VudmFsdWVzLmNwcAppbmRleCAwMzlmODg3Li4wMTBmNDVkIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9laWdlbnZhbHVlcy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZWlnZW52YWx1ZXMuY3BwCkBAIC0xLDMgKzEsMyBAQAotTWF0cml4WGQgb25lcyA9IE1hdHJpeFhkOjpPbmVzKDMsMyk7CitNYXRyaXhYZCBvbmVzID0gTWF0cml4WGQ6Ok9uZXMoMywgMyk7CiBWZWN0b3JYY2QgZWl2YWxzID0gb25lcy5laWdlbnZhbHVlcygpOwogY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIHRoZSAzeDMgbWF0cml4IG9mIG9uZXMgYXJlOiIgPDwgZW5kbCA8PCBlaXZhbHMgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2ZpeGVkQmxvY2tfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9maXhlZEJsb2NrX2ludF9pbnQuY3BwCmluZGV4IDMyMDExMjcuLjZhM2E4Y2IgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2ZpeGVkQmxvY2tfaW50X2ludC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfZml4ZWRCbG9ja19pbnRfaW50LmNwcApAQCAtMSw0ICsxLDQgQEAKLU1hdHJpeDRkIG0gPSBWZWN0b3I0ZCgxLDIsMyw0KS5hc0RpYWdvbmFsKCk7CitNYXRyaXg0ZCBtID0gVmVjdG9yNGQoMSwgMiwgMywgNCkuYXNEaWFnb25hbCgpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKIGNvdXQgPDwgIkhlcmUgaXMgbS5maXhlZDwyLCAyPigyLCAyKToiIDw8IGVuZGwgPDwgbS5ibG9jazwyLCAyPigyLCAyKSA8PCBlbmRsOwogbS5ibG9jazwyLCAyPigyLCAwKSA9IG0uYmxvY2s8MiwgMj4oMiwgMik7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9obm9ybWFsaXplZC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9obm9ybWFsaXplZC5jcHAKaW5kZXggYjcxNGFkYy4uMjMzMzRhYyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaG5vcm1hbGl6ZWQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2hub3JtYWxpemVkLmNwcApAQCAtMiw1ICsyLDUgQEAKIFByb2plY3RpdmUzZCBQKE1hdHJpeDRkOjpSYW5kb20oKSk7CiBjb3V0IDw8ICJ2ICAgICAgICAgICAgICAgICAgID0gIiA8PCB2LnRyYW5zcG9zZSgpIDw8ICJdXlQiIDw8IGVuZGw7CiBjb3V0IDw8ICJ2Lmhub3JtYWxpemVkKCkgICAgID0gIiA8PCB2Lmhub3JtYWxpemVkKCkudHJhbnNwb3NlKCkgPDwgIl1eVCIgPDwgZW5kbDsKLWNvdXQgPDwgIlAqdiAgICAgICAgICAgICAgICAgPSAiIDw8IChQKnYpLnRyYW5zcG9zZSgpIDw8ICJdXlQiIDw8IGVuZGw7Ci1jb3V0IDw8ICIoUCp2KS5obm9ybWFsaXplZCgpID0gIiA8PCAoUCp2KS5obm9ybWFsaXplZCgpLnRyYW5zcG9zZSgpIDw8ICJdXlQiIDw8IGVuZGw7Citjb3V0IDw8ICJQKnYgICAgICAgICAgICAgICAgID0gIiA8PCAoUCAqIHYpLnRyYW5zcG9zZSgpIDw8ICJdXlQiIDw8IGVuZGw7Citjb3V0IDw8ICIoUCp2KS5obm9ybWFsaXplZCgpID0gIiA8PCAoUCAqIHYpLmhub3JtYWxpemVkKCkudHJhbnNwb3NlKCkgPDwgIl1eVCIgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2hvbW9nZW5lb3VzLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2hvbW9nZW5lb3VzLmNwcAppbmRleCAyNjMxOTYwLi42ODE4ZjliIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9ob21vZ2VuZW91cy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaG9tb2dlbmVvdXMuY3BwCkBAIC0zLDQgKzMsNSBAQAogY291dCA8PCAidiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBbIiA8PCB2LnRyYW5zcG9zZSgpIDw8ICJdXlQiIDw8IGVuZGw7CiBjb3V0IDw8ICJoLmhvbW9nZW5lb3VzKCkgICAgICAgICAgICAgICAgICAgICA9IFsiIDw8IHYuaG9tb2dlbmVvdXMoKS50cmFuc3Bvc2UoKSA8PCAiXV5UIiA8PCBlbmRsOwogY291dCA8PCAiKFAgKiB2LmhvbW9nZW5lb3VzKCkpICAgICAgICAgICAgICAgPSBbIiA8PCAoUCAqIHYuaG9tb2dlbmVvdXMoKSkudHJhbnNwb3NlKCkgPDwgIl1eVCIgPDwgZW5kbDsKLWNvdXQgPDwgIihQICogdi5ob21vZ2VuZW91cygpKS5obm9ybWFsaXplZCgpID0gWyIgPDwgKFAgKiB2LmhvbW9nZW5lb3VzKCkpLmV2YWwoKS5obm9ybWFsaXplZCgpLnRyYW5zcG9zZSgpIDw8ICJdXlQiIDw8IGVuZGw7Citjb3V0IDw8ICIoUCAqIHYuaG9tb2dlbmVvdXMoKSkuaG5vcm1hbGl6ZWQoKSA9IFsiIDw8IChQICogdi5ob21vZ2VuZW91cygpKS5ldmFsKCkuaG5vcm1hbGl6ZWQoKS50cmFuc3Bvc2UoKSA8PCAiXV5UIgorICAgICA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNEaWFnb25hbC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc0RpYWdvbmFsLmNwcAppbmRleCA1YjFkNTk5Li4yOTA2NTRmIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc0RpYWdvbmFsLmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc0RpYWdvbmFsLmNwcApAQCAtMSw2ICsxLDUgQEAKIE1hdHJpeDNkIG0gPSAxMDAwMCAqIE1hdHJpeDNkOjpJZGVudGl0eSgpOwotbSgwLDIpID0gMTsKK20oMCwgMikgPSAxOwogY291dCA8PCAiSGVyZSdzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAibS5pc0RpYWdvbmFsKCkgcmV0dXJuczogIiA8PCBtLmlzRGlhZ29uYWwoKSA8PCBlbmRsOwogY291dCA8PCAibS5pc0RpYWdvbmFsKDFlLTMpIHJldHVybnM6ICIgPDwgbS5pc0RpYWdvbmFsKDFlLTMpIDw8IGVuZGw7Ci0KZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzSWRlbnRpdHkuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNJZGVudGl0eS5jcHAKaW5kZXggMTdiNzU2Yy4uZWE1MzVjNyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNJZGVudGl0eS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNJZGVudGl0eS5jcHAKQEAgLTEsNSArMSw1IEBACiBNYXRyaXgzZCBtID0gTWF0cml4M2Q6OklkZW50aXR5KCk7Ci1tKDAsMikgPSAxZS00OworbSgwLCAyKSA9IDFlLTQ7CiBjb3V0IDw8ICJIZXJlJ3MgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CiBjb3V0IDw8ICJtLmlzSWRlbnRpdHkoKSByZXR1cm5zOiAiIDw8IG0uaXNJZGVudGl0eSgpIDw8IGVuZGw7CiBjb3V0IDw8ICJtLmlzSWRlbnRpdHkoMWUtMykgcmV0dXJuczogIiA8PCBtLmlzSWRlbnRpdHkoMWUtMykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzT25lcy5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc09uZXMuY3BwCmluZGV4IGY4MmY2MjguLjg5OTIzMGEgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzT25lcy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNPbmVzLmNwcApAQCAtMSw1ICsxLDUgQEAKIE1hdHJpeDNkIG0gPSBNYXRyaXgzZDo6T25lcygpOwotbSgwLDIpICs9IDFlLTQ7CittKDAsIDIpICs9IDFlLTQ7CiBjb3V0IDw8ICJIZXJlJ3MgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CiBjb3V0IDw8ICJtLmlzT25lcygpIHJldHVybnM6ICIgPDwgbS5pc09uZXMoKSA8PCBlbmRsOwogY291dCA8PCAibS5pc09uZXMoMWUtMykgcmV0dXJuczogIiA8PCBtLmlzT25lcygxZS0zKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNPcnRob2dvbmFsLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzT3J0aG9nb25hbC5jcHAKaW5kZXggYjIyYWYwNi4uM2UwNzliNCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNPcnRob2dvbmFsLmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc09ydGhvZ29uYWwuY3BwCkBAIC0xLDYgKzEsNiBAQAotVmVjdG9yM2QgdigxLDAsMCk7Ci1WZWN0b3IzZCB3KDFlLTQsMCwxKTsKK1ZlY3RvcjNkIHYoMSwgMCwgMCk7CitWZWN0b3IzZCB3KDFlLTQsIDAsIDEpOwogY291dCA8PCAiSGVyZSdzIHRoZSB2ZWN0b3IgdjoiIDw8IGVuZGwgPDwgdiA8PCBlbmRsOwogY291dCA8PCAiSGVyZSdzIHRoZSB2ZWN0b3IgdzoiIDw8IGVuZGwgPDwgdyA8PCBlbmRsOwogY291dCA8PCAidi5pc09ydGhvZ29uYWwodykgcmV0dXJuczogIiA8PCB2LmlzT3J0aG9nb25hbCh3KSA8PCBlbmRsOwotY291dCA8PCAidi5pc09ydGhvZ29uYWwodywxZS0zKSByZXR1cm5zOiAiIDw8IHYuaXNPcnRob2dvbmFsKHcsMWUtMykgPDwgZW5kbDsKK2NvdXQgPDwgInYuaXNPcnRob2dvbmFsKHcsMWUtMykgcmV0dXJuczogIiA8PCB2LmlzT3J0aG9nb25hbCh3LCAxZS0zKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNVbml0YXJ5LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzVW5pdGFyeS5jcHAKaW5kZXggMzg3N2RhMy4uNTZmMWI5NiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNVbml0YXJ5LmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc1VuaXRhcnkuY3BwCkBAIC0xLDUgKzEsNSBAQAogTWF0cml4M2QgbSA9IE1hdHJpeDNkOjpJZGVudGl0eSgpOwotbSgwLDIpID0gMWUtNDsKK20oMCwgMikgPSAxZS00OwogY291dCA8PCAiSGVyZSdzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAibS5pc1VuaXRhcnkoKSByZXR1cm5zOiAiIDw8IG0uaXNVbml0YXJ5KCkgPDwgZW5kbDsKIGNvdXQgPDwgIm0uaXNVbml0YXJ5KDFlLTMpIHJldHVybnM6ICIgPDwgbS5pc1VuaXRhcnkoMWUtMykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzWmVyby5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9pc1plcm8uY3BwCmluZGV4IGMyY2ZlMjIuLmM4NzhmMWMgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX2lzWmVyby5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfaXNaZXJvLmNwcApAQCAtMSw1ICsxLDUgQEAKIE1hdHJpeDNkIG0gPSBNYXRyaXgzZDo6WmVybygpOwotbSgwLDIpID0gMWUtNDsKK20oMCwgMikgPSAxZS00OwogY291dCA8PCAiSGVyZSdzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAibS5pc1plcm8oKSByZXR1cm5zOiAiIDw8IG0uaXNaZXJvKCkgPDwgZW5kbDsKIGNvdXQgPDwgIm0uaXNaZXJvKDFlLTMpIHJldHVybnM6ICIgPDwgbS5pc1plcm8oMWUtMykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX25vYWxpYXMuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfbm9hbGlhcy5jcHAKaW5kZXggM2I1NGE3OS4uNjA3ZDNkNSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfbm9hbGlhcy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfbm9hbGlhcy5jcHAKQEAgLTEsMyArMSw1IEBACi1NYXRyaXgyZCBhLCBiLCBjOyBhIDw8IDEsMiwzLDQ7IGIgPDwgNSw2LDcsODsKLWMubm9hbGlhcygpID0gYSAqIGI7IC8vIHRoaXMgY29tcHV0ZXMgdGhlIHByb2R1Y3QgZGlyZWN0bHkgdG8gYworTWF0cml4MmQgYSwgYiwgYzsKK2EgPDwgMSwgMiwgMywgNDsKK2IgPDwgNSwgNiwgNywgODsKK2Mubm9hbGlhcygpID0gYSAqIGI7ICAvLyB0aGlzIGNvbXB1dGVzIHRoZSBwcm9kdWN0IGRpcmVjdGx5IHRvIGMKIGNvdXQgPDwgYyA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb25lc19pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX29uZXNfaW50X2ludC5jcHAKaW5kZXggNjBmNWEzMS4uMzhiZDhjZiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb25lc19pbnRfaW50LmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9vbmVzX2ludF9pbnQuY3BwCkBAIC0xICsxIEBACi1jb3V0IDw8IE1hdHJpeFhpOjpPbmVzKDIsMykgPDwgZW5kbDsKK2NvdXQgPDwgTWF0cml4WGk6Ok9uZXMoMiwgMykgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX29wZXJhdG9yTm9ybS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9vcGVyYXRvck5vcm0uY3BwCmluZGV4IDM1NTI0NmYuLjk5Y2ExNGQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX29wZXJhdG9yTm9ybS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfb3BlcmF0b3JOb3JtLmNwcApAQCAtMSwzICsxLDIgQEAKLU1hdHJpeFhkIG9uZXMgPSBNYXRyaXhYZDo6T25lcygzLDMpOwotY291dCA8PCAiVGhlIG9wZXJhdG9yIG5vcm0gb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBpcyAiCi0gICAgIDw8IG9uZXMub3BlcmF0b3JOb3JtKCkgPDwgZW5kbDsKK01hdHJpeFhkIG9uZXMgPSBNYXRyaXhYZDo6T25lcygzLCAzKTsKK2NvdXQgPDwgIlRoZSBvcGVyYXRvciBub3JtIG9mIHRoZSAzeDMgbWF0cml4IG9mIG9uZXMgaXMgIiA8PCBvbmVzLm9wZXJhdG9yTm9ybSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yYW5kb21faW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yYW5kb21faW50X2ludC5jcHAKaW5kZXggM2YwZjdkZC4uOTJmODdjOCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmFuZG9tX2ludF9pbnQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JhbmRvbV9pbnRfaW50LmNwcApAQCAtMSArMSBAQAotY291dCA8PCBNYXRyaXhYaTo6UmFuZG9tKDIsMykgPDwgZW5kbDsKK2NvdXQgPDwgTWF0cml4WGk6OlJhbmRvbSgyLCAzKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmVwbGljYXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JlcGxpY2F0ZS5jcHAKaW5kZXggM2NlNTJiYy4uYmZmZDEwMiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmVwbGljYXRlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yZXBsaWNhdGUuY3BwCkBAIC0xLDQgKzEsNCBAQAotTWF0cml4WGkgbSA9IE1hdHJpeFhpOjpSYW5kb20oMiwzKTsKK01hdHJpeFhpIG0gPSBNYXRyaXhYaTo6UmFuZG9tKDIsIDMpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKIGNvdXQgPDwgIm0ucmVwbGljYXRlPDMsMj4oKSA9IC4uLiIgPDwgZW5kbDsKLWNvdXQgPDwgbS5yZXBsaWNhdGU8MywyPigpIDw8IGVuZGw7Citjb3V0IDw8IG0ucmVwbGljYXRlPDMsIDI+KCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JlcGxpY2F0ZV9pbnRfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JlcGxpY2F0ZV9pbnRfaW50LmNwcAppbmRleCBiMWRiYzcwLi4xYWVlMjY1IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yZXBsaWNhdGVfaW50X2ludC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmVwbGljYXRlX2ludF9pbnQuY3BwCkBAIC0xLDQgKzEsNCBAQAogVmVjdG9yM2kgdiA9IFZlY3RvcjNpOjpSYW5kb20oKTsKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciB2OiIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7CiBjb3V0IDw8ICJ2LnJlcGxpY2F0ZSgyLDUpID0gLi4uIiA8PCBlbmRsOwotY291dCA8PCB2LnJlcGxpY2F0ZSgyLDUpIDw8IGVuZGw7Citjb3V0IDw8IHYucmVwbGljYXRlKDIsIDUpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yZXNoYXBlZF9maXhlZC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yZXNoYXBlZF9maXhlZC5jcHAKaW5kZXggM2U5ZTJjZi4uYzFhZTJjMCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfcmVzaGFwZWRfZml4ZWQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3Jlc2hhcGVkX2ZpeGVkLmNwcApAQCAtMSwzICsxLDMgQEAKIE1hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwotY291dCA8PCAiSGVyZSBpcyBtLnJlc2hhcGVkKGZpeDwyPixmaXg8OD4pOiIgPDwgZW5kbCA8PCBtLnJlc2hhcGVkKGZpeDwyPixmaXg8OD4pIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIG0ucmVzaGFwZWQoZml4PDI+LGZpeDw4Pik6IiA8PCBlbmRsIDw8IG0ucmVzaGFwZWQoZml4PDI+LCBmaXg8OD4pIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yZXZlcnNlLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JldmVyc2UuY3BwCmluZGV4IGY1NDVhMjguLmNhMTI1NTggMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JldmVyc2UuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3JldmVyc2UuY3BwCkBAIC0xLDggKzEsNyBAQAotTWF0cml4WGkgbSA9IE1hdHJpeFhpOjpSYW5kb20oMyw0KTsKK01hdHJpeFhpIG0gPSBNYXRyaXhYaTo6UmFuZG9tKDMsIDQpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIHJldmVyc2Ugb2YgbToiIDw8IGVuZGwgPDwgbS5yZXZlcnNlKCkgPDwgZW5kbDsKLWNvdXQgPDwgIkhlcmUgaXMgdGhlIGNvZWZmaWNpZW50ICgxLDApIGluIHRoZSByZXZlcnNlIG9mIG06IiA8PCBlbmRsCi0gICAgIDw8IG0ucmV2ZXJzZSgpKDEsMCkgPDwgZW5kbDsKK2NvdXQgPDwgIkhlcmUgaXMgdGhlIGNvZWZmaWNpZW50ICgxLDApIGluIHRoZSByZXZlcnNlIG9mIG06IiA8PCBlbmRsIDw8IG0ucmV2ZXJzZSgpKDEsIDApIDw8IGVuZGw7CiBjb3V0IDw8ICJMZXQgdXMgb3ZlcndyaXRlIHRoaXMgY29lZmZpY2llbnQgd2l0aCB0aGUgdmFsdWUgNC4iIDw8IGVuZGw7Ci1tLnJldmVyc2UoKSgxLDApID0gNDsKK20ucmV2ZXJzZSgpKDEsIDApID0gNDsKIGNvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3Jvdy5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yb3cuY3BwCmluZGV4IGIxNWU2MjYuLjQ4MWJmZjggMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3Jvdy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfcm93LmNwcApAQCAtMSwzICsxLDMgQEAKIE1hdHJpeDNkIG0gPSBNYXRyaXgzZDo6SWRlbnRpdHkoKTsKLW0ucm93KDEpID0gVmVjdG9yM2QoNCw1LDYpOworbS5yb3coMSkgPSBWZWN0b3IzZCg0LCA1LCA2KTsKIGNvdXQgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfcm93d2lzZS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yb3d3aXNlLmNwcAppbmRleCBhZTkzOTY0Li5iODY5MjI0IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yb3d3aXNlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9yb3d3aXNlLmNwcApAQCAtMSw1ICsxLDQgQEAKIE1hdHJpeDNkIG0gPSBNYXRyaXgzZDo6UmFuZG9tKCk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyB0aGUgc3VtIG9mIGVhY2ggcm93OiIgPDwgZW5kbCA8PCBtLnJvd3dpc2UoKS5zdW0oKSA8PCBlbmRsOwotY291dCA8PCAiSGVyZSBpcyB0aGUgbWF4aW11bSBhYnNvbHV0ZSB2YWx1ZSBvZiBlYWNoIHJvdzoiCi0gICAgIDw8IGVuZGwgPDwgbS5jd2lzZUFicygpLnJvd3dpc2UoKS5tYXhDb2VmZigpIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXhpbXVtIGFic29sdXRlIHZhbHVlIG9mIGVhY2ggcm93OiIgPDwgZW5kbCA8PCBtLmN3aXNlQWJzKCkucm93d2lzZSgpLm1heENvZWZmKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NlbGVjdC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZWxlY3QuY3BwCmluZGV4IGFlNTQ3N2YuLmQxNDk0MWIgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NlbGVjdC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2VsZWN0LmNwcApAQCAtMSw2ICsxLDQgQEAKIE1hdHJpeFhpIG0oMywgMyk7Ci1tIDw8IDEsIDIsIDMsCi0gICAgIDQsIDUsIDYsCi0gICAgIDcsIDgsIDk7CittIDw8IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDk7CiBtID0gKG0uYXJyYXkoKSA+PSA1KS5zZWxlY3QoLW0sIG0pOwogY291dCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2V0LmNwcAppbmRleCA1MGVjZjVmLi5kMzkyYjY4IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldC5jcHAKQEAgLTEsMTMgKzEsMTAgQEAKIE1hdHJpeDNpIG0xOwotbTEgPDwgMSwgMiwgMywKLSAgICAgIDQsIDUsIDYsCi0gICAgICA3LCA4LCA5OworbTEgPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOTsKIGNvdXQgPDwgbTEgPDwgZW5kbCA8PCBlbmRsOwogTWF0cml4M2kgbTIgPSBNYXRyaXgzaTo6SWRlbnRpdHkoKTsKLW0yLmJsb2NrKDAsMCwgMiwyKSA8PCAxMCwgMTEsIDEyLCAxMzsKK20yLmJsb2NrKDAsIDAsIDIsIDIpIDw8IDEwLCAxMSwgMTIsIDEzOwogY291dCA8PCBtMiA8PCBlbmRsIDw8IGVuZGw7CiBWZWN0b3IyaSB2MTsKIHYxIDw8IDE0LCAxNTsKLW0yIDw8IHYxLnRyYW5zcG9zZSgpLCAxNiwKLSAgICAgIHYxLCBtMS5ibG9jaygxLDEsMiwyKTsKK20yIDw8IHYxLnRyYW5zcG9zZSgpLCAxNiwgdjEsIG0xLmJsb2NrKDEsIDEsIDIsIDIpOwogY291dCA8PCBtMiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2V0SWRlbnRpdHkuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2Vfc2V0SWRlbnRpdHkuY3BwCmluZGV4IDRmZDBhYTIuLjkxNmI0NzcgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3NldElkZW50aXR5LmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV9zZXRJZGVudGl0eS5jcHAKQEAgLTEsMyArMSwzIEBACiBNYXRyaXg0aSBtID0gTWF0cml4NGk6Olplcm8oKTsKLW0uYmxvY2s8MywzPigxLDApLnNldElkZW50aXR5KCk7CittLmJsb2NrPDMsIDM+KDEsIDApLnNldElkZW50aXR5KCk7CiBjb3V0IDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tTGVmdENvcm5lci5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbUxlZnRDb3JuZXIuY3BwCmluZGV4IDg0Nzg5MmEuLmJmOWYwYWIgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tTGVmdENvcm5lci5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21MZWZ0Q29ybmVyLmNwcApAQCAtMSw2ICsxLDYgQEAKIE1hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyBtLmJvdHRvbUxlZnRDb3JuZXI8MiwyPigpOiIgPDwgZW5kbDsKLWNvdXQgPDwgbS5ib3R0b21MZWZ0Q29ybmVyPDIsMj4oKSA8PCBlbmRsOwotbS5ib3R0b21MZWZ0Q29ybmVyPDIsMj4oKS5zZXRaZXJvKCk7Citjb3V0IDw8IG0uYm90dG9tTGVmdENvcm5lcjwyLCAyPigpIDw8IGVuZGw7CittLmJvdHRvbUxlZnRDb3JuZXI8MiwgMj4oKS5zZXRaZXJvKCk7CiBjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbUxlZnRDb3JuZXJfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbUxlZnRDb3JuZXJfaW50X2ludC5jcHAKaW5kZXggYTFlZGNjOC4uM2QyMmZjMiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21MZWZ0Q29ybmVyX2ludF9pbnQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tTGVmdENvcm5lcl9pbnRfaW50LmNwcApAQCAtMSw2ICsxLDYgQEAKIE1hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyBtLmJvdHRvbUxlZnRDb3JuZXI8MixEeW5hbWljPigyLDIpOiIgPDwgZW5kbDsKLWNvdXQgPDwgbS5ib3R0b21MZWZ0Q29ybmVyPDIsRHluYW1pYz4oMiwyKSA8PCBlbmRsOwotbS5ib3R0b21MZWZ0Q29ybmVyPDIsRHluYW1pYz4oMiwyKS5zZXRaZXJvKCk7Citjb3V0IDw8IG0uYm90dG9tTGVmdENvcm5lcjwyLCBEeW5hbWljPigyLCAyKSA8PCBlbmRsOworbS5ib3R0b21MZWZ0Q29ybmVyPDIsIER5bmFtaWM+KDIsIDIpLnNldFplcm8oKTsKIGNvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tUmlnaHRDb3JuZXIuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21SaWdodENvcm5lci5jcHAKaW5kZXggYWJhY2IwMS4uNGE3OGJlZCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21SaWdodENvcm5lci5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21SaWdodENvcm5lci5jcHAKQEAgLTEsNiArMSw2IEBACiBNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKIGNvdXQgPDwgIkhlcmUgaXMgbS5ib3R0b21SaWdodENvcm5lcjwyLDI+KCk6IiA8PCBlbmRsOwotY291dCA8PCBtLmJvdHRvbVJpZ2h0Q29ybmVyPDIsMj4oKSA8PCBlbmRsOwotbS5ib3R0b21SaWdodENvcm5lcjwyLDI+KCkuc2V0WmVybygpOworY291dCA8PCBtLmJvdHRvbVJpZ2h0Q29ybmVyPDIsIDI+KCkgPDwgZW5kbDsKK20uYm90dG9tUmlnaHRDb3JuZXI8MiwgMj4oKS5zZXRaZXJvKCk7CiBjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbVJpZ2h0Q29ybmVyX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF9ib3R0b21SaWdodENvcm5lcl9pbnRfaW50LmNwcAppbmRleCBhNjU1MDhmLi43NWEzZTkzIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X2JvdHRvbVJpZ2h0Q29ybmVyX2ludF9pbnQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfYm90dG9tUmlnaHRDb3JuZXJfaW50X2ludC5jcHAKQEAgLTEsNiArMSw2IEBACiBNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKIGNvdXQgPDwgIkhlcmUgaXMgbS5ib3R0b21SaWdodENvcm5lcjwyLER5bmFtaWM+KDIsMik6IiA8PCBlbmRsOwotY291dCA8PCBtLmJvdHRvbVJpZ2h0Q29ybmVyPDIsRHluYW1pYz4oMiwyKSA8PCBlbmRsOwotbS5ib3R0b21SaWdodENvcm5lcjwyLER5bmFtaWM+KDIsMikuc2V0WmVybygpOworY291dCA8PCBtLmJvdHRvbVJpZ2h0Q29ybmVyPDIsIER5bmFtaWM+KDIsIDIpIDw8IGVuZGw7CittLmJvdHRvbVJpZ2h0Q29ybmVyPDIsIER5bmFtaWM+KDIsIDIpLnNldFplcm8oKTsKIGNvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wTGVmdENvcm5lci5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X3RvcExlZnRDb3JuZXIuY3BwCmluZGV4IDE4OTlkOTAuLjdjNzY1ZDQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wTGVmdENvcm5lci5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BMZWZ0Q29ybmVyLmNwcApAQCAtMSw2ICsxLDYgQEAKIE1hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyBtLnRvcExlZnRDb3JuZXI8MiwyPigpOiIgPDwgZW5kbDsKLWNvdXQgPDwgbS50b3BMZWZ0Q29ybmVyPDIsMj4oKSA8PCBlbmRsOwotbS50b3BMZWZ0Q29ybmVyPDIsMj4oKS5zZXRaZXJvKCk7Citjb3V0IDw8IG0udG9wTGVmdENvcm5lcjwyLCAyPigpIDw8IGVuZGw7CittLnRvcExlZnRDb3JuZXI8MiwgMj4oKS5zZXRaZXJvKCk7CiBjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X3RvcExlZnRDb3JuZXJfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X3RvcExlZnRDb3JuZXJfaW50X2ludC5jcHAKaW5kZXggZmFjNzYxZi4uYWU3MjY4NCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BMZWZ0Q29ybmVyX2ludF9pbnQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wTGVmdENvcm5lcl9pbnRfaW50LmNwcApAQCAtMSw2ICsxLDYgQEAKIE1hdHJpeDRpIG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyBtLnRvcExlZnRDb3JuZXI8MixEeW5hbWljPigyLDIpOiIgPDwgZW5kbDsKLWNvdXQgPDwgbS50b3BMZWZ0Q29ybmVyPDIsRHluYW1pYz4oMiwyKSA8PCBlbmRsOwotbS50b3BMZWZ0Q29ybmVyPDIsRHluYW1pYz4oMiwyKS5zZXRaZXJvKCk7Citjb3V0IDw8IG0udG9wTGVmdENvcm5lcjwyLCBEeW5hbWljPigyLCAyKSA8PCBlbmRsOworbS50b3BMZWZ0Q29ybmVyPDIsIER5bmFtaWM+KDIsIDIpLnNldFplcm8oKTsKIGNvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wUmlnaHRDb3JuZXIuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BSaWdodENvcm5lci5jcHAKaW5kZXggYzNhMTc3MS4uOTY5ODUyMSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BSaWdodENvcm5lci5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BSaWdodENvcm5lci5jcHAKQEAgLTEsNiArMSw2IEBACiBNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKIGNvdXQgPDwgIkhlcmUgaXMgbS50b3BSaWdodENvcm5lcjwyLDI+KCk6IiA8PCBlbmRsOwotY291dCA8PCBtLnRvcFJpZ2h0Q29ybmVyPDIsMj4oKSA8PCBlbmRsOwotbS50b3BSaWdodENvcm5lcjwyLDI+KCkuc2V0WmVybygpOworY291dCA8PCBtLnRvcFJpZ2h0Q29ybmVyPDIsIDI+KCkgPDwgZW5kbDsKK20udG9wUmlnaHRDb3JuZXI8MiwgMj4oKS5zZXRaZXJvKCk7CiBjb3V0IDw8ICJOb3cgdGhlIG1hdHJpeCBtIGlzOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X3RvcFJpZ2h0Q29ybmVyX2ludF9pbnQuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdGVtcGxhdGVfaW50X2ludF90b3BSaWdodENvcm5lcl9pbnRfaW50LmNwcAppbmRleCBhMTdhY2MwLi40MTQ0MjQyIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90ZW1wbGF0ZV9pbnRfaW50X3RvcFJpZ2h0Q29ybmVyX2ludF9pbnQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RlbXBsYXRlX2ludF9pbnRfdG9wUmlnaHRDb3JuZXJfaW50X2ludC5jcHAKQEAgLTEsNiArMSw2IEBACiBNYXRyaXg0aSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKIGNvdXQgPDwgIkhlcmUgaXMgbS50b3BSaWdodENvcm5lcjwyLER5bmFtaWM+KDIsMik6IiA8PCBlbmRsOwotY291dCA8PCBtLnRvcFJpZ2h0Q29ybmVyPDIsRHluYW1pYz4oMiwyKSA8PCBlbmRsOwotbS50b3BSaWdodENvcm5lcjwyLER5bmFtaWM+KDIsMikuc2V0WmVybygpOworY291dCA8PCBtLnRvcFJpZ2h0Q29ybmVyPDIsIER5bmFtaWM+KDIsIDIpIDw8IGVuZGw7CittLnRvcFJpZ2h0Q29ybmVyPDIsIER5bmFtaWM+KDIsIDIpLnNldFplcm8oKTsKIGNvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RyYW5zcG9zZS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV90cmFuc3Bvc2UuY3BwCmluZGV4IDg4ZWVhODMuLjhiZjI3MTYgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3RyYW5zcG9zZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfdHJhbnNwb3NlLmNwcApAQCAtMSw4ICsxLDcgQEAKIE1hdHJpeDJpIG0gPSBNYXRyaXgyaTo6UmFuZG9tKCk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyB0aGUgdHJhbnNwb3NlIG9mIG06IiA8PCBlbmRsIDw8IG0udHJhbnNwb3NlKCkgPDwgZW5kbDsKLWNvdXQgPDwgIkhlcmUgaXMgdGhlIGNvZWZmaWNpZW50ICgxLDApIGluIHRoZSB0cmFuc3Bvc2Ugb2YgbToiIDw8IGVuZGwKLSAgICAgPDwgbS50cmFuc3Bvc2UoKSgxLDApIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBjb2VmZmljaWVudCAoMSwwKSBpbiB0aGUgdHJhbnNwb3NlIG9mIG06IiA8PCBlbmRsIDw8IG0udHJhbnNwb3NlKCkoMSwgMCkgPDwgZW5kbDsKIGNvdXQgPDwgIkxldCB1cyBvdmVyd3JpdGUgdGhpcyBjb2VmZmljaWVudCB3aXRoIHRoZSB2YWx1ZSAwLiIgPDwgZW5kbDsKLW0udHJhbnNwb3NlKCkoMSwwKSA9IDA7CittLnRyYW5zcG9zZSgpKDEsIDApID0gMDsKIGNvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3plcm9faW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4QmFzZV96ZXJvX2ludF9pbnQuY3BwCmluZGV4IDQwOTljNWQuLmE1MDA3MjQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhCYXNlX3plcm9faW50X2ludC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeEJhc2VfemVyb19pbnRfaW50LmNwcApAQCAtMSArMSBAQAotY291dCA8PCBNYXRyaXhYaTo6WmVybygyLDMpIDw8IGVuZGw7Citjb3V0IDw8IE1hdHJpeFhpOjpaZXJvKDIsIDMpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X01hcF9zdHJpZGUuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9NYXBfc3RyaWRlLmNwcAppbmRleCBhZTQyYTEyLi41MTI1YjU0IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4X01hcF9zdHJpZGUuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfTWFwX3N0cmlkZS5jcHAKQEAgLTEsNyArMSw0IEBACiBNYXRyaXg0aSBBOwotQSA8PCAxLCAgMiwgIDMsICA0LAotICAgICA1LCAgNiwgIDcsICA4LAotICAgICA5LCAxMCwgMTEsIDEyLAotICAgIDEzLCAxNCwgMTUsIDE2OworQSA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNjsKIAotc3RkOjpjb3V0IDw8IE1hdHJpeDJpOjpNYXAoJkEoMSwxKSxTdHJpZGU8OCwyPigpKSA8PCBzdGQ6OmVuZGw7CitzdGQ6OmNvdXQgPDwgTWF0cml4Mmk6Ok1hcCgmQSgxLCAxKSwgU3RyaWRlPDgsIDI+KCkpIDw8IHN0ZDo6ZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhfaW5pdGlhbGl6ZXJfbGlzdF8yM19jeHgxMS5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4X2luaXRpYWxpemVyX2xpc3RfMjNfY3h4MTEuY3BwCmluZGV4IDYwMjgwYWIuLjhjZGUxY2IgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhfaW5pdGlhbGl6ZXJfbGlzdF8yM19jeHgxMS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9pbml0aWFsaXplcl9saXN0XzIzX2N4eDExLmNwcApAQCAtMSw1ICsxLDIgQEAKLU1hdHJpeFhkIG0gewotICB7MSwgMiwgM30sCi0gIHs0LCA1LCA2fQotfTsKK01hdHJpeFhkIG17ezEsIDIsIDN9LCB7NCwgNSwgNn19OwogY291dCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X2luaXRpYWxpemVyX2xpc3RfdmVjdG9yX2N4eDExLmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfaW5pdGlhbGl6ZXJfbGlzdF92ZWN0b3JfY3h4MTEuY3BwCmluZGV4IDMyNTI1N2MuLjcwOTZkZWIgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhfaW5pdGlhbGl6ZXJfbGlzdF92ZWN0b3JfY3h4MTEuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfaW5pdGlhbGl6ZXJfbGlzdF92ZWN0b3JfY3h4MTEuY3BwCkBAIC0xLDIgKzEsMiBAQAotVmVjdG9yWGkgdiB7ezEsIDJ9fTsKK1ZlY3RvclhpIHZ7ezEsIDJ9fTsKIGNvdXQgPDwgdiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfTm9DaGFuZ2VfaW50LmNwcCBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX05vQ2hhbmdlX2ludC5jcHAKaW5kZXggYWNkZjE4Yy4uYzg2ZWUzMCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfTm9DaGFuZ2VfaW50LmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9Ob0NoYW5nZV9pbnQuY3BwCkBAIC0xLDMgKzEsMyBAQAotTWF0cml4WGQgbSgzLDQpOworTWF0cml4WGQgbSgzLCA0KTsKIG0ucmVzaXplKE5vQ2hhbmdlLCA1KTsKIGNvdXQgPDwgIm06ICIgPDwgbS5yb3dzKCkgPDwgIiByb3dzLCAiIDw8IG0uY29scygpIDw8ICIgY29scyIgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9pbnQuY3BwCmluZGV4IDA0NGM3ODkuLjdmMzRkZjcgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX2ludC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfaW50LmNwcApAQCAtMSw2ICsxLDYgQEAKIFZlY3RvclhkIHYoMTApOwogdi5yZXNpemUoMyk7CiBSb3dWZWN0b3IzZCB3Owotdy5yZXNpemUoMyk7IC8vIHRoaXMgaXMgbGVnYWwsIGJ1dCBoYXMgbm8gZWZmZWN0Cit3LnJlc2l6ZSgzKTsgIC8vIHRoaXMgaXMgbGVnYWwsIGJ1dCBoYXMgbm8gZWZmZWN0CiBjb3V0IDw8ICJ2OiAiIDw8IHYucm93cygpIDw8ICIgcm93cywgIiA8PCB2LmNvbHMoKSA8PCAiIGNvbHMiIDw8IGVuZGw7CiBjb3V0IDw8ICJ3OiAiIDw8IHcucm93cygpIDw8ICIgcm93cywgIiA8PCB3LmNvbHMoKSA8PCAiIGNvbHMiIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9pbnRfTm9DaGFuZ2UuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfaW50X05vQ2hhbmdlLmNwcAppbmRleCA1YzM3YzkwLi5lMzA3NjNkIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9pbnRfTm9DaGFuZ2UuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfcmVzaXplX2ludF9Ob0NoYW5nZS5jcHAKQEAgLTEsMyArMSwzIEBACi1NYXRyaXhYZCBtKDMsNCk7CitNYXRyaXhYZCBtKDMsIDQpOwogbS5yZXNpemUoNSwgTm9DaGFuZ2UpOwogY291dCA8PCAibTogIiA8PCBtLnJvd3MoKSA8PCAiIHJvd3MsICIgPDwgbS5jb2xzKCkgPDwgIiBjb2xzIiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL01hdHJpeF9yZXNpemVfaW50X2ludC5jcHAgYi9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9pbnRfaW50LmNwcAppbmRleCBiZmQ0NzQxLi41NDUzZGJkIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9pbnRfaW50LmNwcAorKysgYi9kb2Mvc25pcHBldHMvTWF0cml4X3Jlc2l6ZV9pbnRfaW50LmNwcApAQCAtMSw5ICsxLDkgQEAKLU1hdHJpeFhkIG0oMiwzKTsKLW0gPDwgMSwyLDMsNCw1LDY7CitNYXRyaXhYZCBtKDIsIDMpOworbSA8PCAxLCAyLCAzLCA0LCA1LCA2OwogY291dCA8PCAiaGVyZSdzIHRoZSAyeDMgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKIGNvdXQgPDwgImxldCdzIHJlc2l6ZSBtIHRvIDN4Mi4gVGhpcyBpcyBhIGNvbnNlcnZhdGl2ZSByZXNpemluZyBiZWNhdXNlIDIqMz09MyoyLiIgPDwgZW5kbDsKLW0ucmVzaXplKDMsMik7CittLnJlc2l6ZSgzLCAyKTsKIGNvdXQgPDwgImhlcmUncyB0aGUgM3gyIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CiBjb3V0IDw8ICJub3cgbGV0J3MgcmVzaXplIG0gdG8gc2l6ZSAyeDIuIFRoaXMgaXMgTk9UIGEgY29uc2VydmF0aXZlIHJlc2l6aW5nLCBzbyBpdCBiZWNvbWVzIHVuaW5pdGlhbGl6ZWQ6IiA8PCBlbmRsOwotbS5yZXNpemUoMiwyKTsKK20ucmVzaXplKDIsIDIpOwogY291dCA8PCBtIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvTWF0cml4X3ZhcmlhZGljX2N0b3JfY3h4MTEuY3BwIGIvZG9jL3NuaXBwZXRzL01hdHJpeF92YXJpYWRpY19jdG9yX2N4eDExLmNwcAppbmRleCAwNmQzM2Y1Li40NWFjZDk5IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvTWF0cml4X3ZhcmlhZGljX2N0b3JfY3h4MTEuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9NYXRyaXhfdmFyaWFkaWNfY3Rvcl9jeHgxMS5jcHAKQEAgLTEsMyArMSwzIEBACiBNYXRyaXg8aW50LCAxLCA2PiBhKDEsIDIsIDMsIDQsIDUsIDYpOwotTWF0cml4PGludCwgMywgMT4gYiB7MSwgMiwgM307CitNYXRyaXg8aW50LCAzLCAxPiBiezEsIDIsIDN9OwogY291dCA8PCBhIDw8ICJcblxuIiA8PCBiIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvUGFydGlhbFBpdkxVX3NvbHZlLmNwcCBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUGl2TFVfc29sdmUuY3BwCmluZGV4IGZhMzU3MGEuLmViZmE1NmQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUGl2TFVfc29sdmUuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9QYXJ0aWFsUGl2TFVfc29sdmUuY3BwCkBAIC0xLDcgKzEsNyBAQAotTWF0cml4WGQgQSA9IE1hdHJpeFhkOjpSYW5kb20oMywzKTsKLU1hdHJpeFhkIEIgPSBNYXRyaXhYZDo6UmFuZG9tKDMsMik7CitNYXRyaXhYZCBBID0gTWF0cml4WGQ6OlJhbmRvbSgzLCAzKTsKK01hdHJpeFhkIEIgPSBNYXRyaXhYZDo6UmFuZG9tKDMsIDIpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgaW52ZXJ0aWJsZSBtYXRyaXggQToiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEI6IiA8PCBlbmRsIDw8IEIgPDwgZW5kbDsKIE1hdHJpeFhkIFggPSBBLmx1KCkuc29sdmUoQik7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSAodW5pcXVlKSBzb2x1dGlvbiBYIHRvIHRoZSBlcXVhdGlvbiBBWD1COiIgPDwgZW5kbCA8PCBYIDw8IGVuZGw7Ci1jb3V0IDw8ICJSZWxhdGl2ZSBlcnJvcjogIiA8PCAoQSpYLUIpLm5vcm0oKSAvIEIubm9ybSgpIDw8IGVuZGw7Citjb3V0IDw8ICJSZWxhdGl2ZSBlcnJvcjogIiA8PCAoQSAqIFggLSBCKS5ub3JtKCkgLyBCLm5vcm0oKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1JlYWxRWl9jb21wdXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9SZWFsUVpfY29tcHV0ZS5jcHAKaW5kZXggYTE4ZGE0Mi4uMTBlZGVmYyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1JlYWxRWl9jb21wdXRlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvUmVhbFFaX2NvbXB1dGUuY3BwCkBAIC0xLDE3ICsxLDI1IEBACi1NYXRyaXhYZiBBID0gTWF0cml4WGY6OlJhbmRvbSg0LDQpOwotTWF0cml4WGYgQiA9IE1hdHJpeFhmOjpSYW5kb20oNCw0KTsKLVJlYWxRWjxNYXRyaXhYZj4gcXooNCk7IC8vIHByZWFsbG9jYXRlIHNwYWNlIGZvciA0eDQgbWF0cmljZXMKLXF6LmNvbXB1dGUoQSxCKTsgIC8vIEEgPSBRIFMgWiwgIEIgPSBRIFQgWgorTWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oNCwgNCk7CitNYXRyaXhYZiBCID0gTWF0cml4WGY6OlJhbmRvbSg0LCA0KTsKK1JlYWxRWjxNYXRyaXhYZj4gcXooNCk7ICAvLyBwcmVhbGxvY2F0ZSBzcGFjZSBmb3IgNHg0IG1hdHJpY2VzCitxei5jb21wdXRlKEEsIEIpOyAgICAgICAgLy8gQSA9IFEgUyBaLCAgQiA9IFEgVCBaCiAKIC8vIHByaW50IG9yaWdpbmFsIG1hdHJpY2VzIGFuZCByZXN1bHQgb2YgZGVjb21wb3NpdGlvbgotY291dCA8PCAiQTpcbiIgPDwgQSA8PCAiXG4iIDw8ICJCOlxuIiA8PCBCIDw8ICJcbiI7Ci1jb3V0IDw8ICJTOlxuIiA8PCBxei5tYXRyaXhTKCkgPDwgIlxuIiA8PCAiVDpcbiIgPDwgcXoubWF0cml4VCgpIDw8ICJcbiI7Ci1jb3V0IDw8ICJROlxuIiA8PCBxei5tYXRyaXhRKCkgPDwgIlxuIiA8PCAiWjpcbiIgPDwgcXoubWF0cml4WigpIDw8ICJcbiI7Citjb3V0IDw8ICJBOlxuIgorICAgICA8PCBBIDw8ICJcbiIKKyAgICAgPDwgIkI6XG4iCisgICAgIDw8IEIgPDwgIlxuIjsKK2NvdXQgPDwgIlM6XG4iCisgICAgIDw8IHF6Lm1hdHJpeFMoKSA8PCAiXG4iCisgICAgIDw8ICJUOlxuIgorICAgICA8PCBxei5tYXRyaXhUKCkgPDwgIlxuIjsKK2NvdXQgPDwgIlE6XG4iCisgICAgIDw8IHF6Lm1hdHJpeFEoKSA8PCAiXG4iCisgICAgIDw8ICJaOlxuIgorICAgICA8PCBxei5tYXRyaXhaKCkgPDwgIlxuIjsKIAogLy8gdmVyaWZ5IHByZWNpc2lvbgogY291dCA8PCAiXG5FcnJvcnM6IgotICA8PCAiXG58QS1RU1p8OiAiIDw8IChBLXF6Lm1hdHJpeFEoKSpxei5tYXRyaXhTKCkqcXoubWF0cml4WigpKS5ub3JtKCkKLSAgPDwgIiwgfEItUVRafDogIiA8PCAoQi1xei5tYXRyaXhRKCkqcXoubWF0cml4VCgpKnF6Lm1hdHJpeFooKSkubm9ybSgpCi0gIDw8ICJcbnxRUSogLSBJfDogIiA8PCAocXoubWF0cml4USgpKnF6Lm1hdHJpeFEoKS5hZGpvaW50KCkgLSBNYXRyaXhYZjo6SWRlbnRpdHkoNCw0KSkubm9ybSgpCi0gIDw8ICIsIHxaWiogLSBJfDogIiA8PCAocXoubWF0cml4WigpKnF6Lm1hdHJpeFooKS5hZGpvaW50KCkgLSBNYXRyaXhYZjo6SWRlbnRpdHkoNCw0KSkubm9ybSgpCi0gIDw8ICJcbiI7CisgICAgIDw8ICJcbnxBLVFTWnw6ICIgPDwgKEEgLSBxei5tYXRyaXhRKCkgKiBxei5tYXRyaXhTKCkgKiBxei5tYXRyaXhaKCkpLm5vcm0oKQorICAgICA8PCAiLCB8Qi1RVFp8OiAiIDw8IChCIC0gcXoubWF0cml4USgpICogcXoubWF0cml4VCgpICogcXoubWF0cml4WigpKS5ub3JtKCkKKyAgICAgPDwgIlxufFFRKiAtIEl8OiAiIDw8IChxei5tYXRyaXhRKCkgKiBxei5tYXRyaXhRKCkuYWRqb2ludCgpIC0gTWF0cml4WGY6OklkZW50aXR5KDQsIDQpKS5ub3JtKCkKKyAgICAgPDwgIiwgfFpaKiAtIEl8OiAiIDw8IChxei5tYXRyaXhaKCkgKiBxei5tYXRyaXhaKCkuYWRqb2ludCgpIC0gTWF0cml4WGY6OklkZW50aXR5KDQsIDQpKS5ub3JtKCkgPDwgIlxuIjsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9SZWFsU2NodXJfUmVhbFNjaHVyX01hdHJpeFR5cGUuY3BwIGIvZG9jL3NuaXBwZXRzL1JlYWxTY2h1cl9SZWFsU2NodXJfTWF0cml4VHlwZS5jcHAKaW5kZXggYTU1MzBkYy4uNDg1YjBlZSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1JlYWxTY2h1cl9SZWFsU2NodXJfTWF0cml4VHlwZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1JlYWxTY2h1cl9SZWFsU2NodXJfTWF0cml4VHlwZS5jcHAKQEAgLTEsNCArMSw0IEBACi1NYXRyaXhYZCBBID0gTWF0cml4WGQ6OlJhbmRvbSg2LDYpOworTWF0cml4WGQgQSA9IE1hdHJpeFhkOjpSYW5kb20oNiwgNik7CiBjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIDZ4NiBtYXRyaXgsIEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbCA8PCBlbmRsOwogCiBSZWFsU2NodXI8TWF0cml4WGQ+IHNjaHVyKEEpOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1JlYWxTY2h1cl9jb21wdXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9SZWFsU2NodXJfY29tcHV0ZS5jcHAKaW5kZXggMjBjMjYxMS4uNzhjNzFjOCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1JlYWxTY2h1cl9jb21wdXRlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvUmVhbFNjaHVyX2NvbXB1dGUuY3BwCkBAIC0xLDQgKzEsNCBAQAotTWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oNCw0KTsKK01hdHJpeFhmIEEgPSBNYXRyaXhYZjo6UmFuZG9tKDQsIDQpOwogUmVhbFNjaHVyPE1hdHJpeFhmPiBzY2h1cig0KTsKIHNjaHVyLmNvbXB1dGUoQSwgLyogY29tcHV0ZVUgPSAqLyBmYWxzZSk7CiBjb3V0IDw8ICJUaGUgbWF0cml4IFQgaW4gdGhlIGRlY29tcG9zaXRpb24gb2YgQSBpczoiIDw8IGVuZGwgPDwgc2NodXIubWF0cml4VCgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyLmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuY3BwCmluZGV4IDczYTdmNjIuLjE2ZjRiMjMgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXIuY3BwCkBAIC0xLDcgKzEsNyBAQAogU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXg0Zj4gZXM7Ci1NYXRyaXg0ZiBYID0gTWF0cml4NGY6OlJhbmRvbSg0LDQpOworTWF0cml4NGYgWCA9IE1hdHJpeDRmOjpSYW5kb20oNCwgNCk7CiBNYXRyaXg0ZiBBID0gWCArIFgudHJhbnNwb3NlKCk7CiBlcy5jb21wdXRlKEEpOwogY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIEEgYXJlOiAiIDw8IGVzLmVpZ2VudmFsdWVzKCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKLWVzLmNvbXB1dGUoQSArIE1hdHJpeDRmOjpJZGVudGl0eSg0LDQpKTsgLy8gcmUtdXNlIGVzIHRvIGNvbXB1dGUgZWlnZW52YWx1ZXMgb2YgQStJCitlcy5jb21wdXRlKEEgKyBNYXRyaXg0Zjo6SWRlbnRpdHkoNCwgNCkpOyAgLy8gcmUtdXNlIGVzIHRvIGNvbXB1dGUgZWlnZW52YWx1ZXMgb2YgQStJCiBjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgQStJIGFyZTogIiA8PCBlcy5laWdlbnZhbHVlcygpLnRyYW5zcG9zZSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01hdHJpeFR5cGUuY3BwIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlcl9NYXRyaXhUeXBlLmNwcAppbmRleCAzNTk5YjE3Li4wZWQ5MDkyIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01hdHJpeFR5cGUuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfTWF0cml4VHlwZS5jcHAKQEAgLTEsNCArMSw0IEBACi1NYXRyaXhYZCBYID0gTWF0cml4WGQ6OlJhbmRvbSg1LDUpOworTWF0cml4WGQgWCA9IE1hdHJpeFhkOjpSYW5kb20oNSwgNSk7CiBNYXRyaXhYZCBBID0gWCArIFgudHJhbnNwb3NlKCk7CiBjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIHN5bW1ldHJpYyA1eDUgbWF0cml4LCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKIApkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfU2VsZkFkam9pbnRFaWdlblNvbHZlcl9NYXRyaXhUeXBlMi5jcHAgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01hdHJpeFR5cGUyLmNwcAppbmRleCBjYzBjNTBlLi5lMjg4OWI3IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01hdHJpeFR5cGUyLmNwcAorKysgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX01hdHJpeFR5cGUyLmNwcApAQCAtMSwxMSArMSwxMSBAQAotTWF0cml4WGQgWCA9IE1hdHJpeFhkOjpSYW5kb20oNSw1KTsKK01hdHJpeFhkIFggPSBNYXRyaXhYZDo6UmFuZG9tKDUsIDUpOwogTWF0cml4WGQgQSA9IFggKyBYLnRyYW5zcG9zZSgpOwogY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSBzeW1tZXRyaWMgbWF0cml4LCBBOiIgPDwgZW5kbCA8PCBBIDw8IGVuZGw7Ci1YID0gTWF0cml4WGQ6OlJhbmRvbSg1LDUpOworWCA9IE1hdHJpeFhkOjpSYW5kb20oNSwgNSk7CiBNYXRyaXhYZCBCID0gWCAqIFgudHJhbnNwb3NlKCk7CiBjb3V0IDw8ICJhbmQgYSByYW5kb20gcG9zaXRpdmUtZGVmaW5pdGUgbWF0cml4LCBCOiIgPDwgZW5kbCA8PCBCIDw8IGVuZGwgPDwgZW5kbDsKIAotR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFhkPiBlcyhBLEIpOworR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFhkPiBlcyhBLCBCKTsKIGNvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgcGVuY2lsIChBLEIpIGFyZToiIDw8IGVuZGwgPDwgZXMuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOwogY291dCA8PCAiVGhlIG1hdHJpeCBvZiBlaWdlbnZlY3RvcnMsIFYsIGlzOiIgPDwgZW5kbCA8PCBlcy5laWdlbnZlY3RvcnMoKSA8PCBlbmRsIDw8IGVuZGw7CiAKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2NvbXB1dGVfTWF0cml4VHlwZS5jcHAgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9jb21wdXRlX01hdHJpeFR5cGUuY3BwCmluZGV4IDI5NzVjYzMuLjkwNzVkYjcgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2NvbXB1dGVfTWF0cml4VHlwZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfY29tcHV0ZV9NYXRyaXhUeXBlLmNwcApAQCAtMSw3ICsxLDcgQEAKIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4WGY+IGVzKDQpOwotTWF0cml4WGYgWCA9IE1hdHJpeFhmOjpSYW5kb20oNCw0KTsKK01hdHJpeFhmIFggPSBNYXRyaXhYZjo6UmFuZG9tKDQsIDQpOwogTWF0cml4WGYgQSA9IFggKyBYLnRyYW5zcG9zZSgpOwogZXMuY29tcHV0ZShBKTsKIGNvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiBBIGFyZTogIiA8PCBlcy5laWdlbnZhbHVlcygpLnRyYW5zcG9zZSgpIDw8IGVuZGw7Ci1lcy5jb21wdXRlKEEgKyBNYXRyaXhYZjo6SWRlbnRpdHkoNCw0KSk7IC8vIHJlLXVzZSBlcyB0byBjb21wdXRlIGVpZ2VudmFsdWVzIG9mIEErSQorZXMuY29tcHV0ZShBICsgTWF0cml4WGY6OklkZW50aXR5KDQsIDQpKTsgIC8vIHJlLXVzZSBlcyB0byBjb21wdXRlIGVpZ2VudmFsdWVzIG9mIEErSQogY291dCA8PCAiVGhlIGVpZ2VudmFsdWVzIG9mIEErSSBhcmU6ICIgPDwgZXMuZWlnZW52YWx1ZXMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfY29tcHV0ZV9NYXRyaXhUeXBlMi5jcHAgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9jb21wdXRlX01hdHJpeFR5cGUyLmNwcAppbmRleCAwN2M5MmExLi44OGQ0NGM2IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9jb21wdXRlX01hdHJpeFR5cGUyLmNwcAorKysgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9jb21wdXRlX01hdHJpeFR5cGUyLmNwcApAQCAtMSw5ICsxLDkgQEAKLU1hdHJpeFhkIFggPSBNYXRyaXhYZDo6UmFuZG9tKDUsNSk7CitNYXRyaXhYZCBYID0gTWF0cml4WGQ6OlJhbmRvbSg1LCA1KTsKIE1hdHJpeFhkIEEgPSBYICogWC50cmFuc3Bvc2UoKTsKLVggPSBNYXRyaXhYZDo6UmFuZG9tKDUsNSk7CitYID0gTWF0cml4WGQ6OlJhbmRvbSg1LCA1KTsKIE1hdHJpeFhkIEIgPSBYICogWC50cmFuc3Bvc2UoKTsKIAotR2VuZXJhbGl6ZWRTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFhkPiBlcyhBLEIsRWlnZW52YWx1ZXNPbmx5KTsKK0dlbmVyYWxpemVkU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhYZD4gZXMoQSwgQiwgRWlnZW52YWx1ZXNPbmx5KTsKIGNvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgcGVuY2lsIChBLEIpIGFyZToiIDw8IGVuZGwgPDwgZXMuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOwotZXMuY29tcHV0ZShCLEEsZmFsc2UpOworZXMuY29tcHV0ZShCLCBBLCBmYWxzZSk7CiBjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgdGhlIHBlbmNpbCAoQixBKSBhcmU6IiA8PCBlbmRsIDw8IGVzLmVpZ2VudmFsdWVzKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2VpZ2VudmFsdWVzLmNwcAppbmRleCAwZmYzM2M2Li5kODBmOTBjIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9laWdlbnZhbHVlcy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfZWlnZW52YWx1ZXMuY3BwCkBAIC0xLDQgKzEsMyBAQAotTWF0cml4WGQgb25lcyA9IE1hdHJpeFhkOjpPbmVzKDMsMyk7CitNYXRyaXhYZCBvbmVzID0gTWF0cml4WGQ6Ok9uZXMoMywgMyk7CiBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFhkPiBlcyhvbmVzKTsKLWNvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGFyZToiIAotICAgICA8PCBlbmRsIDw8IGVzLmVpZ2VudmFsdWVzKCkgPDwgZW5kbDsKK2NvdXQgPDwgIlRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGFyZToiIDw8IGVuZGwgPDwgZXMuZWlnZW52YWx1ZXMoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfZWlnZW52ZWN0b3JzLmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX2VpZ2VudmVjdG9ycy5jcHAKaW5kZXggOTRiMGQ2ZS4uYTkxZGNhMSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfZWlnZW52ZWN0b3JzLmNwcAorKysgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9laWdlbnZlY3RvcnMuY3BwCkBAIC0xLDQgKzEsMyBAQAotTWF0cml4WGQgb25lcyA9IE1hdHJpeFhkOjpPbmVzKDMsMyk7CitNYXRyaXhYZCBvbmVzID0gTWF0cml4WGQ6Ok9uZXMoMywgMyk7CiBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFhkPiBlcyhvbmVzKTsKLWNvdXQgPDwgIlRoZSBmaXJzdCBlaWdlbnZlY3RvciBvZiB0aGUgM3gzIG1hdHJpeCBvZiBvbmVzIGlzOiIgCi0gICAgIDw8IGVuZGwgPDwgZXMuZWlnZW52ZWN0b3JzKCkuY29sKDApIDw8IGVuZGw7Citjb3V0IDw8ICJUaGUgZmlyc3QgZWlnZW52ZWN0b3Igb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBpczoiIDw8IGVuZGwgPDwgZXMuZWlnZW52ZWN0b3JzKCkuY29sKDApIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvckludmVyc2VTcXJ0LmNwcCBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9ySW52ZXJzZVNxcnQuY3BwCmluZGV4IDExNGM2NWYuLjUwZTgzZjMgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9ySW52ZXJzZVNxcnQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9ySW52ZXJzZVNxcnQuY3BwCkBAIC0xLDQgKzEsNCBAQAotTWF0cml4WGQgWCA9IE1hdHJpeFhkOjpSYW5kb20oNCw0KTsKK01hdHJpeFhkIFggPSBNYXRyaXhYZDo6UmFuZG9tKDQsIDQpOwogTWF0cml4WGQgQSA9IFggKiBYLnRyYW5zcG9zZSgpOwogY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSBwb3NpdGl2ZS1kZWZpbml0ZSBtYXRyaXgsIEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbCA8PCBlbmRsOwogCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvclNxcnQuY3BwIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50RWlnZW5Tb2x2ZXJfb3BlcmF0b3JTcXJ0LmNwcAppbmRleCBlZWFjY2E3Li5iY2VkNTY3IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRFaWdlblNvbHZlcl9vcGVyYXRvclNxcnQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludEVpZ2VuU29sdmVyX29wZXJhdG9yU3FydC5jcHAKQEAgLTEsOCArMSw4IEBACi1NYXRyaXhYZCBYID0gTWF0cml4WGQ6OlJhbmRvbSg0LDQpOworTWF0cml4WGQgWCA9IE1hdHJpeFhkOjpSYW5kb20oNCwgNCk7CiBNYXRyaXhYZCBBID0gWCAqIFgudHJhbnNwb3NlKCk7CiBjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIHBvc2l0aXZlLWRlZmluaXRlIG1hdHJpeCwgQToiIDw8IGVuZGwgPDwgQSA8PCBlbmRsIDw8IGVuZGw7CiAKIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVzKEEpOwogTWF0cml4WGQgc3FydEEgPSBlcy5vcGVyYXRvclNxcnQoKTsKIGNvdXQgPDwgIlRoZSBzcXVhcmUgcm9vdCBvZiBBIGlzOiAiIDw8IGVuZGwgPDwgc3FydEEgPDwgZW5kbDsKLWNvdXQgPDwgIklmIHdlIHNxdWFyZSB0aGlzLCB3ZSBnZXQ6ICIgPDwgZW5kbCA8PCBzcXJ0QSpzcXJ0QSA8PCBlbmRsOworY291dCA8PCAiSWYgd2Ugc3F1YXJlIHRoaXMsIHdlIGdldDogIiA8PCBlbmRsIDw8IHNxcnRBICogc3FydEEgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludFZpZXdfZWlnZW52YWx1ZXMuY3BwIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50Vmlld19laWdlbnZhbHVlcy5jcHAKaW5kZXggYmUxOTg2Ny4uOGNlZjZkOCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50Vmlld19laWdlbnZhbHVlcy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50Vmlld19laWdlbnZhbHVlcy5jcHAKQEAgLTEsMyArMSwzIEBACi1NYXRyaXhYZCBvbmVzID0gTWF0cml4WGQ6Ok9uZXMoMywzKTsKK01hdHJpeFhkIG9uZXMgPSBNYXRyaXhYZDo6T25lcygzLCAzKTsKIFZlY3RvclhkIGVpdmFscyA9IG9uZXMuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLmVpZ2VudmFsdWVzKCk7CiBjb3V0IDw8ICJUaGUgZWlnZW52YWx1ZXMgb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBhcmU6IiA8PCBlbmRsIDw8IGVpdmFscyA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50Vmlld19vcGVyYXRvck5vcm0uY3BwIGIvZG9jL3NuaXBwZXRzL1NlbGZBZGpvaW50Vmlld19vcGVyYXRvck5vcm0uY3BwCmluZGV4IGYzODBmNTUuLmMyMjlmYWYgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9TZWxmQWRqb2ludFZpZXdfb3BlcmF0b3JOb3JtLmNwcAorKysgYi9kb2Mvc25pcHBldHMvU2VsZkFkam9pbnRWaWV3X29wZXJhdG9yTm9ybS5jcHAKQEAgLTEsMyArMSwyIEBACi1NYXRyaXhYZCBvbmVzID0gTWF0cml4WGQ6Ok9uZXMoMywzKTsKLWNvdXQgPDwgIlRoZSBvcGVyYXRvciBub3JtIG9mIHRoZSAzeDMgbWF0cml4IG9mIG9uZXMgaXMgIgotICAgICA8PCBvbmVzLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5vcGVyYXRvck5vcm0oKSA8PCBlbmRsOworTWF0cml4WGQgb25lcyA9IE1hdHJpeFhkOjpPbmVzKDMsIDMpOworY291dCA8PCAiVGhlIG9wZXJhdG9yIG5vcm0gb2YgdGhlIDN4MyBtYXRyaXggb2Ygb25lcyBpcyAiIDw8IG9uZXMuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLm9wZXJhdG9yTm9ybSgpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2xpY2luZ19hcnJheWV4cHIuY3BwIGIvZG9jL3NuaXBwZXRzL1NsaWNpbmdfYXJyYXlleHByLmNwcAppbmRleCA2ZDA5OTgwLi5iNzhkYmZhIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvU2xpY2luZ19hcnJheWV4cHIuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9TbGljaW5nX2FycmF5ZXhwci5jcHAKQEAgLTEsNCArMSw1IEBACi1BcnJheVhpIGluZCg1KTsgaW5kPDw0LDIsNSw1LDM7Ci1NYXRyaXhYaSBBID0gTWF0cml4WGk6OlJhbmRvbSg0LDYpOworQXJyYXlYaSBpbmQoNSk7CitpbmQgPDwgNCwgMiwgNSwgNSwgMzsKK01hdHJpeFhpIEEgPSBNYXRyaXhYaTo6UmFuZG9tKDQsIDYpOwogY291dCA8PCAiSW5pdGlhbCBtYXRyaXggQTpcbiIgPDwgQSA8PCAiXG5cbiI7Ci1jb3V0IDw8ICJBKGFsbCxpbmQtMSk6XG4iIDw8IEEoRWlnZW46OnBsYWNlaG9sZGVyczo6YWxsLGluZC0xKSA8PCAiXG5cbiI7Citjb3V0IDw8ICJBKGFsbCxpbmQtMSk6XG4iIDw8IEEoRWlnZW46OnBsYWNlaG9sZGVyczo6YWxsLCBpbmQgLSAxKSA8PCAiXG5cbiI7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU2xpY2luZ19jdXN0b21fcGFkZGluZ19jeHgxMS5jcHAgYi9kb2Mvc25pcHBldHMvU2xpY2luZ19jdXN0b21fcGFkZGluZ19jeHgxMS5jcHAKaW5kZXggMjRkYjk4Yi4uNGQ0ODJmNiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1NsaWNpbmdfY3VzdG9tX3BhZGRpbmdfY3h4MTEuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9TbGljaW5nX2N1c3RvbV9wYWRkaW5nX2N4eDExLmNwcApAQCAtMSwxMiArMSwxMiBAQAogc3RydWN0IHBhZCB7CiAgIEluZGV4IHNpemUoKSBjb25zdCB7IHJldHVybiBvdXRfc2l6ZTsgfQotICBJbmRleCBvcGVyYXRvcltdIChJbmRleCBpKSBjb25zdCB7IHJldHVybiBzdGQ6Om1heDxJbmRleD4oMCxpLShvdXRfc2l6ZS1pbl9zaXplKSk7IH0KKyAgSW5kZXggb3BlcmF0b3JbXShJbmRleCBpKSBjb25zdCB7IHJldHVybiBzdGQ6Om1heDxJbmRleD4oMCwgaSAtIChvdXRfc2l6ZSAtIGluX3NpemUpKTsgfQogICBJbmRleCBpbl9zaXplLCBvdXRfc2l6ZTsKIH07CiAKIE1hdHJpeDNpIEE7Ci1BLnJlc2hhcGVkKCkgPSBWZWN0b3JYaTo6TGluU3BhY2VkKDksMSw5KTsKK0EucmVzaGFwZWQoKSA9IFZlY3RvclhpOjpMaW5TcGFjZWQoOSwgMSwgOSk7CiBjb3V0IDw8ICJJbml0aWFsIG1hdHJpeCBBOlxuIiA8PCBBIDw8ICJcblxuIjsKLU1hdHJpeFhpIEIoNSw1KTsKLUIgPSBBKHBhZHszLDV9LCBwYWR7Myw1fSk7CitNYXRyaXhYaSBCKDUsIDUpOworQiA9IEEocGFkezMsIDV9LCBwYWR7MywgNX0pOwogY291dCA8PCAiQShwYWR7MyxOfSwgcGFkezMsTn0pOlxuIiA8PCBCIDw8ICJcblxuIjsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TbGljaW5nX3Jhd2FycmF5X2N4eDExLmNwcCBiL2RvYy9zbmlwcGV0cy9TbGljaW5nX3Jhd2FycmF5X2N4eDExLmNwcAppbmRleCA3YTNlNmU1Li4wNDk1ZGI2IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvU2xpY2luZ19yYXdhcnJheV9jeHgxMS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1NsaWNpbmdfcmF3YXJyYXlfY3h4MTEuY3BwCkBAIC0xLDMgKzEsMyBAQAotTWF0cml4WGkgQSA9IE1hdHJpeFhpOjpSYW5kb20oNCw2KTsKK01hdHJpeFhpIEEgPSBNYXRyaXhYaTo6UmFuZG9tKDQsIDYpOwogY291dCA8PCAiSW5pdGlhbCBtYXRyaXggQTpcbiIgPDwgQSA8PCAiXG5cbiI7Ci1jb3V0IDw8ICJBKGFsbCx7NCwyLDUsNSwzfSk6XG4iIDw8IEEoRWlnZW46OnBsYWNlaG9sZGVyczo6YWxsLHs0LDIsNSw1LDN9KSA8PCAiXG5cbiI7Citjb3V0IDw8ICJBKGFsbCx7NCwyLDUsNSwzfSk6XG4iIDw8IEEoRWlnZW46OnBsYWNlaG9sZGVyczo6YWxsLCB7NCwgMiwgNSwgNSwgM30pIDw8ICJcblxuIjsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9TbGljaW5nX3N0ZHZlY3Rvcl9jeHgxMS5jcHAgYi9kb2Mvc25pcHBldHMvU2xpY2luZ19zdGR2ZWN0b3JfY3h4MTEuY3BwCmluZGV4IDc0ZjA3MjcuLjdkNWFkMGMgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9TbGljaW5nX3N0ZHZlY3Rvcl9jeHgxMS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1NsaWNpbmdfc3RkdmVjdG9yX2N4eDExLmNwcApAQCAtMSw0ICsxLDQgQEAKLXN0ZDo6dmVjdG9yPGludD4gaW5kezQsMiw1LDUsM307Ci1NYXRyaXhYaSBBID0gTWF0cml4WGk6OlJhbmRvbSg0LDYpOworc3RkOjp2ZWN0b3I8aW50PiBpbmR7NCwgMiwgNSwgNSwgM307CitNYXRyaXhYaSBBID0gTWF0cml4WGk6OlJhbmRvbSg0LCA2KTsKIGNvdXQgPDwgIkluaXRpYWwgbWF0cml4IEE6XG4iIDw8IEEgPDwgIlxuXG4iOwotY291dCA8PCAiQShhbGwsaW5kKTpcbiIgPDwgQShFaWdlbjo6cGxhY2Vob2xkZXJzOjphbGwsaW5kKSA8PCAiXG5cbiI7Citjb3V0IDw8ICJBKGFsbCxpbmQpOlxuIiA8PCBBKEVpZ2VuOjpwbGFjZWhvbGRlcnM6OmFsbCwgaW5kKSA8PCAiXG5cbiI7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvU3BhcnNlTWF0cml4X2NvZWZmcy5jcHAgYi9kb2Mvc25pcHBldHMvU3BhcnNlTWF0cml4X2NvZWZmcy5jcHAKaW5kZXggZjcxYTY5Yi4uMjY2ZTMyZCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1NwYXJzZU1hdHJpeF9jb2VmZnMuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9TcGFyc2VNYXRyaXhfY29lZmZzLmNwcApAQCAtMSw3ICsxLDcgQEAKLVNwYXJzZU1hdHJpeDxkb3VibGU+IEEoMywzKTsKLUEuaW5zZXJ0KDEsMikgPSAwOwotQS5pbnNlcnQoMCwxKSA9IDE7Ci1BLmluc2VydCgyLDApID0gMjsKK1NwYXJzZU1hdHJpeDxkb3VibGU+IEEoMywgMyk7CitBLmluc2VydCgxLCAyKSA9IDA7CitBLmluc2VydCgwLCAxKSA9IDE7CitBLmluc2VydCgyLCAwKSA9IDI7CiBBLm1ha2VDb21wcmVzc2VkKCk7CiBjb3V0IDw8ICJUaGUgbWF0cml4IEEgaXM6IiA8PCBlbmRsIDw8IE1hdHJpeFhkKEEpIDw8IGVuZGw7CiBjb3V0IDw8ICJpdCBoYXMgIiA8PCBBLm5vblplcm9zKCkgPDwgIiBzdG9yZWQgbm9uIHplcm8gY29lZmZpY2llbnRzIHRoYXQgYXJlOiAiIDw8IEEuY29lZmZzKCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrLmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrLmNwcAppbmRleCAwMzI4MmY0Li5iYmI3YzJhIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19ibG9jay5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfYmxvY2suY3BwCkBAIC0xLDcgKzEsNyBAQAotTWF0cml4WGkgbWF0KDMsMyk7IAotbWF0IDw8IDEsIDIsIDMsICAgNCwgNSwgNiwgICA3LCA4LCA5OworTWF0cml4WGkgbWF0KDMsIDMpOworbWF0IDw8IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbWF0OlxuIiA8PCBtYXQgPDwgZW5kbDsKIAogLy8gVGhpcyBhc3NpZ25tZW50IHNob3dzIHRoZSBhbGlhc2luZyBwcm9ibGVtCi1tYXQuYm90dG9tUmlnaHRDb3JuZXIoMiwyKSA9IG1hdC50b3BMZWZ0Q29ybmVyKDIsMik7CittYXQuYm90dG9tUmlnaHRDb3JuZXIoMiwgMikgPSBtYXQudG9wTGVmdENvcm5lcigyLCAyKTsKIGNvdXQgPDwgIkFmdGVyIHRoZSBhc3NpZ25tZW50LCBtYXQgPSBcbiIgPDwgbWF0IDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19ibG9ja19jb3JyZWN0LmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrX2NvcnJlY3QuY3BwCmluZGV4IDZmZWU1ODAuLjZhMzAwMmUgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrX2NvcnJlY3QuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2Jsb2NrX2NvcnJlY3QuY3BwCkBAIC0xLDcgKzEsNyBAQAotTWF0cml4WGkgbWF0KDMsMyk7IAotbWF0IDw8IDEsIDIsIDMsICAgNCwgNSwgNiwgICA3LCA4LCA5OworTWF0cml4WGkgbWF0KDMsIDMpOworbWF0IDw8IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbWF0OlxuIiA8PCBtYXQgPDwgZW5kbDsKIAogLy8gVGhlIGV2YWwoKSBzb2x2ZXMgdGhlIGFsaWFzaW5nIHByb2JsZW0KLW1hdC5ib3R0b21SaWdodENvcm5lcigyLDIpID0gbWF0LnRvcExlZnRDb3JuZXIoMiwyKS5ldmFsKCk7CittYXQuYm90dG9tUmlnaHRDb3JuZXIoMiwgMikgPSBtYXQudG9wTGVmdENvcm5lcigyLCAyKS5ldmFsKCk7CiBjb3V0IDw8ICJBZnRlciB0aGUgYXNzaWdubWVudCwgbWF0ID0gXG4iIDw8IG1hdCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfY3dpc2UuY3BwIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfY3dpc2UuY3BwCmluZGV4IDcwNDlmNmMuLmNiOWQwOGEgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX2N3aXNlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19jd2lzZS5jcHAKQEAgLTEsMjAgKzEsMTggQEAKLU1hdHJpeFhmIG1hdCgyLDIpOyAKLW1hdCA8PCAxLCAyLCAgNCwgNzsKK01hdHJpeFhmIG1hdCgyLCAyKTsKK21hdCA8PCAxLCAyLCA0LCA3OwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG1hdDpcbiIgPDwgbWF0IDw8IGVuZGwgPDwgZW5kbDsKIAogbWF0ID0gMiAqIG1hdDsKIGNvdXQgPDwgIkFmdGVyICdtYXQgPSAyICogbWF0JywgbWF0ID0gXG4iIDw8IG1hdCA8PCBlbmRsIDw8IGVuZGw7CiAKLQotbWF0ID0gbWF0IC0gTWF0cml4WGY6OklkZW50aXR5KDIsMik7CittYXQgPSBtYXQgLSBNYXRyaXhYZjo6SWRlbnRpdHkoMiwgMik7CiBjb3V0IDw8ICJBZnRlciB0aGUgc3VidHJhY3Rpb24sIGl0IGJlY29tZXNcbiIgPDwgbWF0IDw8IGVuZGwgPDwgZW5kbDsKIAotCiBBcnJheVhYZiBhcnIgPSBtYXQ7CiBhcnIgPSBhcnIuc3F1YXJlKCk7CiBjb3V0IDw8ICJBZnRlciBzcXVhcmluZywgaXQgYmVjb21lc1xuIiA8PCBhcnIgPDwgZW5kbCA8PCBlbmRsOwogCiAvLyBDb21iaW5pbmcgYWxsIG9wZXJhdGlvbnMgaW4gb25lIHN0YXRlbWVudDoKLW1hdCA8PCAxLCAyLCAgNCwgNzsKLW1hdCA9ICgyICogbWF0IC0gTWF0cml4WGY6OklkZW50aXR5KDIsMikpLmFycmF5KCkuc3F1YXJlKCk7CittYXQgPDwgMSwgMiwgNCwgNzsKK21hdCA9ICgyICogbWF0IC0gTWF0cml4WGY6OklkZW50aXR5KDIsIDIpKS5hcnJheSgpLnNxdWFyZSgpOwogY291dCA8PCAiRG9pbmcgZXZlcnl0aGluZyBhdCBvbmNlIHlpZWxkc1xuIiA8PCBtYXQgPDwgZW5kbCA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDEuY3BwIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDEuY3BwCmluZGV4IGNkN2U5MDAuLjRhZTJhNDcgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQxLmNwcAorKysgYi9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19tdWx0MS5jcHAKQEAgLTEsNCArMSw0IEBACi1NYXRyaXhYZiBtYXRBKDIsMik7IAotbWF0QSA8PCAyLCAwLCAgMCwgMjsKK01hdHJpeFhmIG1hdEEoMiwgMik7CittYXRBIDw8IDIsIDAsIDAsIDI7CiBtYXRBID0gbWF0QSAqIG1hdEE7CiBjb3V0IDw8IG1hdEE7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19tdWx0Mi5jcHAgYi9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19tdWx0Mi5jcHAKaW5kZXggYTNmZjU2OC4uNTJjOTk4NyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDIuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQyLmNwcApAQCAtMSw1ICsxLDUgQEAKLU1hdHJpeFhmIG1hdEEoMiwyKSwgbWF0QigyLDIpOyAKLW1hdEEgPDwgMiwgMCwgIDAsIDI7CitNYXRyaXhYZiBtYXRBKDIsIDIpLCBtYXRCKDIsIDIpOworbWF0QSA8PCAyLCAwLCAwLCAyOwogCiAvLyBTaW1wbGUgYnV0IG5vdCBxdWl0ZSBhcyBlZmZpY2llbnQKIG1hdEIgPSBtYXRBICogbWF0QTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQzLmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQzLmNwcAppbmRleCAxZDEyYTZjLi5iMmJlZDZmIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19tdWx0My5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDMuY3BwCkBAIC0xLDQgKzEsNCBAQAotTWF0cml4WGYgbWF0QSgyLDIpOyAKLW1hdEEgPDwgMiwgMCwgIDAsIDI7CitNYXRyaXhYZiBtYXRBKDIsIDIpOworbWF0QSA8PCAyLCAwLCAwLCAyOwogbWF0QS5ub2FsaWFzKCkgPSBtYXRBICogbWF0QTsKIGNvdXQgPDwgbWF0QTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQ0LmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQ0LmNwcAppbmRleCAwMWMxYzZkLi45YTgyMzIyIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19tdWx0NC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDQuY3BwCkBAIC0xLDUgKzEsNSBAQAotTWF0cml4WGYgQSgyLDIpLCBCKDMsMik7Ci1CIDw8IDIsIDAsICAwLCAzLCAxLCAxOworTWF0cml4WGYgQSgyLCAyKSwgQigzLCAyKTsKK0IgPDwgMiwgMCwgMCwgMywgMSwgMTsKIEEgPDwgMiwgMCwgMCwgLTI7CiBBID0gKEIgKiBBKS5jd2lzZUFicygpOwogY291dCA8PCBBOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDUuY3BwIGIvZG9jL3NuaXBwZXRzL1RvcGljQWxpYXNpbmdfbXVsdDUuY3BwCmluZGV4IDFhMzZkZWYuLjc5YTk0YzggMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Ub3BpY0FsaWFzaW5nX211bHQ1LmNwcAorKysgYi9kb2Mvc25pcHBldHMvVG9waWNBbGlhc2luZ19tdWx0NS5jcHAKQEAgLTEsNSArMSw1IEBACi1NYXRyaXhYZiBBKDIsMiksIEIoMywyKTsKLUIgPDwgMiwgMCwgIDAsIDMsIDEsIDE7CitNYXRyaXhYZiBBKDIsIDIpLCBCKDMsIDIpOworQiA8PCAyLCAwLCAwLCAzLCAxLCAxOwogQSA8PCAyLCAwLCAwLCAtMjsKIEEgPSAoQiAqIEEpLmV2YWwoKS5jd2lzZUFicygpOwogY291dCA8PCBBOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RvcGljU3RvcmFnZU9yZGVyc19leGFtcGxlLmNwcCBiL2RvYy9zbmlwcGV0cy9Ub3BpY1N0b3JhZ2VPcmRlcnNfZXhhbXBsZS5jcHAKaW5kZXggMDYyM2VmMC4uNjRlMjEyMyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1RvcGljU3RvcmFnZU9yZGVyc19leGFtcGxlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvVG9waWNTdG9yYWdlT3JkZXJzX2V4YW1wbGUuY3BwCkBAIC0xLDE4ICsxLDEzIEBACiBNYXRyaXg8aW50LCAzLCA0LCBDb2xNYWpvcj4gQWNvbG1ham9yOwotQWNvbG1ham9yIDw8IDgsIDIsIDIsIDksCi0gICAgICAgICAgICAgOSwgMSwgNCwgNCwKLQkgICAgIDMsIDUsIDQsIDU7CitBY29sbWFqb3IgPDwgOCwgMiwgMiwgOSwgOSwgMSwgNCwgNCwgMywgNSwgNCwgNTsKIGNvdXQgPDwgIlRoZSBtYXRyaXggQToiIDw8IGVuZGw7Ci1jb3V0IDw8IEFjb2xtYWpvciA8PCBlbmRsIDw8IGVuZGw7IAorY291dCA8PCBBY29sbWFqb3IgPDwgZW5kbCA8PCBlbmRsOwogCiBjb3V0IDw8ICJJbiBtZW1vcnkgKGNvbHVtbi1tYWpvcik6IiA8PCBlbmRsOwotZm9yIChpbnQgaSA9IDA7IGkgPCBBY29sbWFqb3Iuc2l6ZSgpOyBpKyspCi0gIGNvdXQgPDwgKihBY29sbWFqb3IuZGF0YSgpICsgaSkgPDwgIiAgIjsKK2ZvciAoaW50IGkgPSAwOyBpIDwgQWNvbG1ham9yLnNpemUoKTsgaSsrKSBjb3V0IDw8ICooQWNvbG1ham9yLmRhdGEoKSArIGkpIDw8ICIgICI7CiBjb3V0IDw8IGVuZGwgPDwgZW5kbDsKIAogTWF0cml4PGludCwgMywgNCwgUm93TWFqb3I+IEFyb3dtYWpvciA9IEFjb2xtYWpvcjsKIGNvdXQgPDwgIkluIG1lbW9yeSAocm93LW1ham9yKToiIDw8IGVuZGw7Ci1mb3IgKGludCBpID0gMDsgaSA8IEFyb3dtYWpvci5zaXplKCk7IGkrKykKLSAgY291dCA8PCAqKEFyb3dtYWpvci5kYXRhKCkgKyBpKSA8PCAiICAiOworZm9yIChpbnQgaSA9IDA7IGkgPCBBcm93bWFqb3Iuc2l6ZSgpOyBpKyspIGNvdXQgPDwgKihBcm93bWFqb3IuZGF0YSgpICsgaSkgPDwgIiAgIjsKIGNvdXQgPDwgZW5kbDsKLQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RyaWFuZ3VsYXJfc29sdmUuY3BwIGIvZG9jL3NuaXBwZXRzL1RyaWFuZ3VsYXJfc29sdmUuY3BwCmluZGV4IDU0ODQ0MjQuLjJkYTgwNmIgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9Ucmlhbmd1bGFyX3NvbHZlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvVHJpYW5ndWxhcl9zb2x2ZS5jcHAKQEAgLTcsNSArNyw0IEBACiBjb3V0IDw8ICJBbmQgbm93IGhlcmUgaXMgbS5pbnZlcnNlKCkqbiwgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IgogICAgICAgICAiIG0gaXMgdXBwZXItdHJpYW5ndWxhcjpcbiIKICAgICAgPDwgbS50cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkuc29sdmUobikgPDwgZW5kbDsKLWNvdXQgPDwgIkFuZCB0aGlzIGlzIG4qbS5pbnZlcnNlKCk6XG4iCi0gICAgIDw8IG0udHJpYW5ndWxhclZpZXc8RWlnZW46OlVwcGVyPigpLnNvbHZlPEVpZ2VuOjpPblRoZVJpZ2h0PihuKTsKK2NvdXQgPDwgIkFuZCB0aGlzIGlzIG4qbS5pbnZlcnNlKCk6XG4iIDw8IG0udHJpYW5ndWxhclZpZXc8RWlnZW46OlVwcGVyPigpLnNvbHZlPEVpZ2VuOjpPblRoZVJpZ2h0PihuKTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fVHJpZGlhZ29uYWxpemF0aW9uX01hdHJpeFR5cGUuY3BwIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9UcmlkaWFnb25hbGl6YXRpb25fTWF0cml4VHlwZS5jcHAKaW5kZXggYTI2MDEyNC4uMDg3YjFlYyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9UcmlkaWFnb25hbGl6YXRpb25fTWF0cml4VHlwZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9UcmlkaWFnb25hbGl6YXRpb25fTWF0cml4VHlwZS5jcHAKQEAgLTEsNCArMSw0IEBACi1NYXRyaXhYZCBYID0gTWF0cml4WGQ6OlJhbmRvbSg1LDUpOworTWF0cml4WGQgWCA9IE1hdHJpeFhkOjpSYW5kb20oNSwgNSk7CiBNYXRyaXhYZCBBID0gWCArIFgudHJhbnNwb3NlKCk7CiBjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIHN5bW1ldHJpYyA1eDUgbWF0cml4OiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKIFRyaWRpYWdvbmFsaXphdGlvbjxNYXRyaXhYZD4gdHJpT2ZBKEEpOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9jb21wdXRlLmNwcCBiL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fY29tcHV0ZS5jcHAKaW5kZXggMDA2MmE5OS4uZWNhZWUxNSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9jb21wdXRlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX2NvbXB1dGUuY3BwCkBAIC0xLDkgKzEsOSBAQAogVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFhmPiB0cmk7Ci1NYXRyaXhYZiBYID0gTWF0cml4WGY6OlJhbmRvbSg0LDQpOworTWF0cml4WGYgWCA9IE1hdHJpeFhmOjpSYW5kb20oNCwgNCk7CiBNYXRyaXhYZiBBID0gWCArIFgudHJhbnNwb3NlKCk7CiB0cmkuY29tcHV0ZShBKTsKIGNvdXQgPDwgIlRoZSBtYXRyaXggVCBpbiB0aGUgdHJpZGlhZ29uYWwgZGVjb21wb3NpdGlvbiBvZiBBIGlzOiAiIDw8IGVuZGw7CiBjb3V0IDw8IHRyaS5tYXRyaXhUKCkgPDwgZW5kbDsKLXRyaS5jb21wdXRlKDIqQSk7IC8vIHJlLXVzZSB0cmkgdG8gY29tcHV0ZSBlaWdlbnZhbHVlcyBvZiAyQQordHJpLmNvbXB1dGUoMiAqIEEpOyAgLy8gcmUtdXNlIHRyaSB0byBjb21wdXRlIGVpZ2VudmFsdWVzIG9mIDJBCiBjb3V0IDw8ICJUaGUgbWF0cml4IFQgaW4gdGhlIHRyaWRpYWdvbmFsIGRlY29tcG9zaXRpb24gb2YgMkEgaXM6ICIgPDwgZW5kbDsKIGNvdXQgPDwgdHJpLm1hdHJpeFQoKSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9kZWNvbXBvc2VJblBsYWNlLmNwcCBiL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fZGVjb21wb3NlSW5QbGFjZS5jcHAKaW5kZXggOWE2NmJhYS4uYjI4YzkzNSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9kZWNvbXBvc2VJblBsYWNlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX2RlY29tcG9zZUluUGxhY2UuY3BwCkBAIC0xLDQgKzEsNCBAQAotTWF0cml4WGQgWCA9IE1hdHJpeFhkOjpSYW5kb20oNSw1KTsKK01hdHJpeFhkIFggPSBNYXRyaXhYZDo6UmFuZG9tKDUsIDUpOwogTWF0cml4WGQgQSA9IFggKyBYLnRyYW5zcG9zZSgpOwogY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSBzeW1tZXRyaWMgNXg1IG1hdHJpeDoiIDw8IGVuZGwgPDwgQSA8PCBlbmRsIDw8IGVuZGw7CiAKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fZGlhZ29uYWwuY3BwIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9kaWFnb25hbC5jcHAKaW5kZXggNmVlYzgyMS4uMThlZGMxZSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9kaWFnb25hbC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9kaWFnb25hbC5jcHAKQEAgLTEsNCArMSw0IEBACi1NYXRyaXhYY2QgWCA9IE1hdHJpeFhjZDo6UmFuZG9tKDQsNCk7CitNYXRyaXhYY2QgWCA9IE1hdHJpeFhjZDo6UmFuZG9tKDQsIDQpOwogTWF0cml4WGNkIEEgPSBYICsgWC5hZGpvaW50KCk7CiBjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIHNlbGYtYWRqb2ludCA0eDQgbWF0cml4OiIgPDwgZW5kbCA8PCBBIDw8IGVuZGwgPDwgZW5kbDsKIApAQCAtOCw2ICs4LDYgQEAKIAogY291dCA8PCAiV2UgY2FuIGFsc28gZXh0cmFjdCB0aGUgZGlhZ29uYWxzIG9mIFQgZGlyZWN0bHkgLi4uIiA8PCBlbmRsOwogVmVjdG9yWGQgZGlhZyA9IHRyaU9mQS5kaWFnb25hbCgpOwotY291dCA8PCAiVGhlIGRpYWdvbmFsIGlzOiIgPDwgZW5kbCA8PCBkaWFnIDw8IGVuZGw7IAorY291dCA8PCAiVGhlIGRpYWdvbmFsIGlzOiIgPDwgZW5kbCA8PCBkaWFnIDw8IGVuZGw7CiBWZWN0b3JYZCBzdWJkaWFnID0gdHJpT2ZBLnN1YkRpYWdvbmFsKCk7CiBjb3V0IDw8ICJUaGUgc3ViZGlhZ29uYWwgaXM6IiA8PCBlbmRsIDw8IHN1YmRpYWcgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25faG91c2Vob2xkZXJDb2VmZmljaWVudHMuY3BwIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9ob3VzZWhvbGRlckNvZWZmaWNpZW50cy5jcHAKaW5kZXggZTVkODcyOC4uZjg4MGYxZCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9ob3VzZWhvbGRlckNvZWZmaWNpZW50cy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9ob3VzZWhvbGRlckNvZWZmaWNpZW50cy5jcHAKQEAgLTEsNCArMSw0IEBACi1NYXRyaXg0ZCBYID0gTWF0cml4NGQ6OlJhbmRvbSg0LDQpOworTWF0cml4NGQgWCA9IE1hdHJpeDRkOjpSYW5kb20oNCwgNCk7CiBNYXRyaXg0ZCBBID0gWCArIFgudHJhbnNwb3NlKCk7CiBjb3V0IDw8ICJIZXJlIGlzIGEgcmFuZG9tIHN5bW1ldHJpYyA0eDQgbWF0cml4OiIgPDwgZW5kbCA8PCBBIDw8IGVuZGw7CiBUcmlkaWFnb25hbGl6YXRpb248TWF0cml4NGQ+IHRyaU9mQShBKTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fcGFja2VkTWF0cml4LmNwcCBiL2RvYy9zbmlwcGV0cy9UcmlkaWFnb25hbGl6YXRpb25fcGFja2VkTWF0cml4LmNwcAppbmRleCAwZjU1ZDBjLi4zYjE4NmE4IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVHJpZGlhZ29uYWxpemF0aW9uX3BhY2tlZE1hdHJpeC5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1RyaWRpYWdvbmFsaXphdGlvbl9wYWNrZWRNYXRyaXguY3BwCkBAIC0xLDggKzEsNyBAQAotTWF0cml4NGQgWCA9IE1hdHJpeDRkOjpSYW5kb20oNCw0KTsKK01hdHJpeDRkIFggPSBNYXRyaXg0ZDo6UmFuZG9tKDQsIDQpOwogTWF0cml4NGQgQSA9IFggKyBYLnRyYW5zcG9zZSgpOwogY291dCA8PCAiSGVyZSBpcyBhIHJhbmRvbSBzeW1tZXRyaWMgNHg0IG1hdHJpeDoiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOwogVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeDRkPiB0cmlPZkEoQSk7CiBNYXRyaXg0ZCBwbSA9IHRyaU9mQS5wYWNrZWRNYXRyaXgoKTsKIGNvdXQgPDwgIlRoZSBwYWNrZWQgbWF0cml4IE0gaXM6IiA8PCBlbmRsIDw8IHBtIDw8IGVuZGw7Ci1jb3V0IDw8ICJUaGUgZGlhZ29uYWwgYW5kIHN1YmRpYWdvbmFsIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXRyaXggVCwgd2hpY2ggaXM6IiAKLSAgICAgPDwgZW5kbCA8PCB0cmlPZkEubWF0cml4VCgpIDw8IGVuZGw7Citjb3V0IDw8ICJUaGUgZGlhZ29uYWwgYW5kIHN1YmRpYWdvbmFsIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXRyaXggVCwgd2hpY2ggaXM6IiA8PCBlbmRsIDw8IHRyaU9mQS5tYXRyaXhUKCkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0Jsb2NrLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0Jsb2NrLmNwcAppbmRleCA5NmU0MGFjLi43NTJjNTIyIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9CbG9jay5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fQmxvY2suY3BwCkBAIC0xLDUgKzEsNSBAQAogTWF0cml4WGYgbWF0QSgyLCAyKTsKIG1hdEEgPDwgMSwgMiwgMywgNDsKIE1hdHJpeFhmIG1hdEIoNCwgNCk7Ci1tYXRCIDw8IG1hdEEsIG1hdEEvMTAsIG1hdEEvMTAsIG1hdEE7CittYXRCIDw8IG1hdEEsIG1hdEEgLyAxMCwgbWF0QSAvIDEwLCBtYXRBOwogc3RkOjpjb3V0IDw8IG1hdEIgPDwgc3RkOjplbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fQ29tbWFUZW1wb3JhcnkuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fQ29tbWFUZW1wb3JhcnkuY3BwCmluZGV4IDUwY2ZmNGMuLjhhZjNkNzQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX0NvbW1hVGVtcG9yYXJ5LmNwcAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9Db21tYVRlbXBvcmFyeS5jcHAKQEAgLTEsNCArMSw0IEBACiBNYXRyaXhYZiBtYXQgPSBNYXRyaXhYZjo6UmFuZG9tKDIsIDMpOwogc3RkOjpjb3V0IDw8IG1hdCA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOwotbWF0ID0gKE1hdHJpeFhmKDIsMikgPDwgMCwgMSwgMSwgMCkuZmluaXNoZWQoKSAqIG1hdDsKK21hdCA9IChNYXRyaXhYZigyLCAyKSA8PCAwLCAxLCAxLCAwKS5maW5pc2hlZCgpICogbWF0Owogc3RkOjpjb3V0IDw8IG1hdCA8PCBzdGQ6OmVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9UaHJlZVdheXMuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX0FkdmFuY2VkSW5pdGlhbGl6YXRpb25fVGhyZWVXYXlzLmNwcAppbmRleCBjYjc0NTc2Li40ODc4ZGQ3IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9UaHJlZVdheXMuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX1RocmVlV2F5cy5jcHAKQEAgLTEsMjAgKzEsMTkgQEAKIGNvbnN0IGludCBzaXplID0gNjsKIE1hdHJpeFhkIG1hdDEoc2l6ZSwgc2l6ZSk7Ci1tYXQxLnRvcExlZnRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpICAgICA9IE1hdHJpeFhkOjpaZXJvKHNpemUvMiwgc2l6ZS8yKTsKLW1hdDEudG9wUmlnaHRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpICAgID0gTWF0cml4WGQ6OklkZW50aXR5KHNpemUvMiwgc2l6ZS8yKTsKLW1hdDEuYm90dG9tTGVmdENvcm5lcihzaXplLzIsIHNpemUvMikgID0gTWF0cml4WGQ6OklkZW50aXR5KHNpemUvMiwgc2l6ZS8yKTsKLW1hdDEuYm90dG9tUmlnaHRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpID0gTWF0cml4WGQ6Olplcm8oc2l6ZS8yLCBzaXplLzIpOworbWF0MS50b3BMZWZ0Q29ybmVyKHNpemUgLyAyLCBzaXplIC8gMikgPSBNYXRyaXhYZDo6WmVybyhzaXplIC8gMiwgc2l6ZSAvIDIpOworbWF0MS50b3BSaWdodENvcm5lcihzaXplIC8gMiwgc2l6ZSAvIDIpID0gTWF0cml4WGQ6OklkZW50aXR5KHNpemUgLyAyLCBzaXplIC8gMik7CittYXQxLmJvdHRvbUxlZnRDb3JuZXIoc2l6ZSAvIDIsIHNpemUgLyAyKSA9IE1hdHJpeFhkOjpJZGVudGl0eShzaXplIC8gMiwgc2l6ZSAvIDIpOworbWF0MS5ib3R0b21SaWdodENvcm5lcihzaXplIC8gMiwgc2l6ZSAvIDIpID0gTWF0cml4WGQ6Olplcm8oc2l6ZSAvIDIsIHNpemUgLyAyKTsKIHN0ZDo6Y291dCA8PCBtYXQxIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CiAKIE1hdHJpeFhkIG1hdDIoc2l6ZSwgc2l6ZSk7Ci1tYXQyLnRvcExlZnRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpLnNldFplcm8oKTsKLW1hdDIudG9wUmlnaHRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpLnNldElkZW50aXR5KCk7Ci1tYXQyLmJvdHRvbUxlZnRDb3JuZXIoc2l6ZS8yLCBzaXplLzIpLnNldElkZW50aXR5KCk7Ci1tYXQyLmJvdHRvbVJpZ2h0Q29ybmVyKHNpemUvMiwgc2l6ZS8yKS5zZXRaZXJvKCk7CittYXQyLnRvcExlZnRDb3JuZXIoc2l6ZSAvIDIsIHNpemUgLyAyKS5zZXRaZXJvKCk7CittYXQyLnRvcFJpZ2h0Q29ybmVyKHNpemUgLyAyLCBzaXplIC8gMikuc2V0SWRlbnRpdHkoKTsKK21hdDIuYm90dG9tTGVmdENvcm5lcihzaXplIC8gMiwgc2l6ZSAvIDIpLnNldElkZW50aXR5KCk7CittYXQyLmJvdHRvbVJpZ2h0Q29ybmVyKHNpemUgLyAyLCBzaXplIC8gMikuc2V0WmVybygpOwogc3RkOjpjb3V0IDw8IG1hdDIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKIAogTWF0cml4WGQgbWF0MyhzaXplLCBzaXplKTsKLW1hdDMgPDwgTWF0cml4WGQ6Olplcm8oc2l6ZS8yLCBzaXplLzIpLCBNYXRyaXhYZDo6SWRlbnRpdHkoc2l6ZS8yLCBzaXplLzIpLAotICAgICAgICBNYXRyaXhYZDo6SWRlbnRpdHkoc2l6ZS8yLCBzaXplLzIpLCBNYXRyaXhYZDo6WmVybyhzaXplLzIsIHNpemUvMik7CittYXQzIDw8IE1hdHJpeFhkOjpaZXJvKHNpemUgLyAyLCBzaXplIC8gMiksCisgICAgTWF0cml4WGQ6OklkZW50aXR5KHNpemUgLyAyLCBzaXplIC8gMiksIE1hdHJpeFhkOjpJZGVudGl0eShzaXplIC8gMiwgc2l6ZSAvIDIpLCBNYXRyaXhYZDo6WmVybyhzaXplIC8gMiwgc2l6ZSAvIDIpOwogc3RkOjpjb3V0IDw8IG1hdDMgPDwgc3RkOjplbmRsOwotCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfQWR2YW5jZWRJbml0aWFsaXphdGlvbl9aZXJvLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX1plcm8uY3BwCmluZGV4IDc2YTM2YTMuLjAzZmI4OTkgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX1plcm8uY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9BZHZhbmNlZEluaXRpYWxpemF0aW9uX1plcm8uY3BwCkBAIC0yLDEyICsyLDEwIEBACiBBcnJheTMzZiBhMSA9IEFycmF5MzNmOjpaZXJvKCk7CiBzdGQ6OmNvdXQgPDwgYTEgPDwgIlxuXG4iOwogCi0KIHN0ZDo6Y291dCA8PCAiQSBvbmUtZGltZW5zaW9uYWwgZHluYW1pYy1zaXplIGFycmF5OlxuIjsKIEFycmF5WGYgYTIgPSBBcnJheVhmOjpaZXJvKDMpOwogc3RkOjpjb3V0IDw8IGEyIDw8ICJcblxuIjsKIAotCiBzdGQ6OmNvdXQgPDwgIkEgdHdvLWRpbWVuc2lvbmFsIGR5bmFtaWMtc2l6ZSBhcnJheTpcbiI7CiBBcnJheVhYZiBhMyA9IEFycmF5WFhmOjpaZXJvKDMsIDQpOwogc3RkOjpjb3V0IDw8IGEzIDw8ICJcbiI7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfTWFwX3Jvd21ham9yLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9NYXBfcm93bWFqb3IuY3BwCmluZGV4IGZkNDVhY2UuLmYxYjlhMmYgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9NYXBfcm93bWFqb3IuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9NYXBfcm93bWFqb3IuY3BwCkBAIC0xLDcgKzEsNSBAQAogaW50IGFycmF5WzhdOwotZm9yKGludCBpID0gMDsgaSA8IDg7ICsraSkgYXJyYXlbaV0gPSBpOwotY291dCA8PCAiQ29sdW1uLW1ham9yOlxuIiA8PCBNYXA8TWF0cml4PGludCwyLDQ+ID4oYXJyYXkpIDw8IGVuZGw7Ci1jb3V0IDw8ICJSb3ctbWFqb3I6XG4iIDw8IE1hcDxNYXRyaXg8aW50LDIsNCxSb3dNYWpvcj4gPihhcnJheSkgPDwgZW5kbDsKLWNvdXQgPDwgIlJvdy1tYWpvciB1c2luZyBzdHJpZGU6XG4iIDw8Ci0gIE1hcDxNYXRyaXg8aW50LDIsND4sIFVuYWxpZ25lZCwgU3RyaWRlPDEsND4gPihhcnJheSkgPDwgZW5kbDsKLQorZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpIGFycmF5W2ldID0gaTsKK2NvdXQgPDwgIkNvbHVtbi1tYWpvcjpcbiIgPDwgTWFwPE1hdHJpeDxpbnQsIDIsIDQ+ID4oYXJyYXkpIDw8IGVuZGw7Citjb3V0IDw8ICJSb3ctbWFqb3I6XG4iIDw8IE1hcDxNYXRyaXg8aW50LCAyLCA0LCBSb3dNYWpvcj4gPihhcnJheSkgPDwgZW5kbDsKK2NvdXQgPDwgIlJvdy1tYWpvciB1c2luZyBzdHJpZGU6XG4iIDw8IE1hcDxNYXRyaXg8aW50LCAyLCA0PiwgVW5hbGlnbmVkLCBTdHJpZGU8MSwgND4gPihhcnJheSkgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9NYXBfdXNpbmcuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX01hcF91c2luZy5jcHAKaW5kZXggZTVlNDk5Zi4uNmZkNmVhOCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX01hcF91c2luZy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX01hcF91c2luZy5jcHAKQEAgLTEsMjEgKzEsMjAgQEAKLXR5cGVkZWYgTWF0cml4PGZsb2F0LDEsRHluYW1pYz4gTWF0cml4VHlwZTsKK3R5cGVkZWYgTWF0cml4PGZsb2F0LCAxLCBEeW5hbWljPiBNYXRyaXhUeXBlOwogdHlwZWRlZiBNYXA8TWF0cml4VHlwZT4gTWFwVHlwZTsKLXR5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeFR5cGU+IE1hcFR5cGVDb25zdDsgICAvLyBhIHJlYWQtb25seSBtYXAKK3R5cGVkZWYgTWFwPGNvbnN0IE1hdHJpeFR5cGU+IE1hcFR5cGVDb25zdDsgIC8vIGEgcmVhZC1vbmx5IG1hcAogY29uc3QgaW50IG5fZGltcyA9IDU7Ci0gIAorCiBNYXRyaXhUeXBlIG0xKG5fZGltcyksIG0yKG5fZGltcyk7CiBtMS5zZXRSYW5kb20oKTsKIG0yLnNldFJhbmRvbSgpOwotZmxvYXQgKnAgPSAmbTIoMCk7ICAvLyBnZXQgdGhlIGFkZHJlc3Mgc3RvcmluZyB0aGUgZGF0YSBmb3IgbTIKLU1hcFR5cGUgbTJtYXAocCxtMi5zaXplKCkpOyAgIC8vIG0ybWFwIHNoYXJlcyBkYXRhIHdpdGggbTIKLU1hcFR5cGVDb25zdCBtMm1hcGNvbnN0KHAsbTIuc2l6ZSgpKTsgIC8vIGEgcmVhZC1vbmx5IGFjY2Vzc29yIGZvciBtMgorZmxvYXQgKnAgPSAmbTIoMCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYWRkcmVzcyBzdG9yaW5nIHRoZSBkYXRhIGZvciBtMgorTWFwVHlwZSBtMm1hcChwLCBtMi5zaXplKCkpOyAgICAgICAgICAgIC8vIG0ybWFwIHNoYXJlcyBkYXRhIHdpdGggbTIKK01hcFR5cGVDb25zdCBtMm1hcGNvbnN0KHAsIG0yLnNpemUoKSk7ICAvLyBhIHJlYWQtb25seSBhY2Nlc3NvciBmb3IgbTIKIAogY291dCA8PCAibTE6ICIgPDwgbTEgPDwgZW5kbDsKIGNvdXQgPDwgIm0yOiAiIDw8IG0yIDw8IGVuZGw7Ci1jb3V0IDw8ICJTcXVhcmVkIGV1Y2xpZGVhbiBkaXN0YW5jZTogIiA8PCAobTEtbTIpLnNxdWFyZWROb3JtKCkgPDwgZW5kbDsKLWNvdXQgPDwgIlNxdWFyZWQgZXVjbGlkZWFuIGRpc3RhbmNlLCB1c2luZyBtYXA6ICIgPDwKLSAgKG0xLW0ybWFwKS5zcXVhcmVkTm9ybSgpIDw8IGVuZGw7Ci1tMm1hcCgzKSA9IDc7ICAgLy8gdGhpcyB3aWxsIGNoYW5nZSBtMiwgc2luY2UgdGhleSBzaGFyZSB0aGUgc2FtZSBhcnJheQorY291dCA8PCAiU3F1YXJlZCBldWNsaWRlYW4gZGlzdGFuY2U6ICIgPDwgKG0xIC0gbTIpLnNxdWFyZWROb3JtKCkgPDwgZW5kbDsKK2NvdXQgPDwgIlNxdWFyZWQgZXVjbGlkZWFuIGRpc3RhbmNlLCB1c2luZyBtYXA6ICIgPDwgKG0xIC0gbTJtYXApLnNxdWFyZWROb3JtKCkgPDwgZW5kbDsKK20ybWFwKDMpID0gNzsgIC8vIHRoaXMgd2lsbCBjaGFuZ2UgbTIsIHNpbmNlIHRoZXkgc2hhcmUgdGhlIHNhbWUgYXJyYXkKIGNvdXQgPDwgIlVwZGF0ZWQgbTI6ICIgPDwgbTIgPDwgZW5kbDsKIGNvdXQgPDwgIm0yIGNvZWZmaWNpZW50IDIsIGNvbnN0YW50IGFjY2Vzc29yOiAiIDw8IG0ybWFwY29uc3QoMikgPDwgZW5kbDsKLS8qIG0ybWFwY29uc3QoMikgPSA1OyAqLyAgIC8vIHRoaXMgeWllbGRzIGEgY29tcGlsZS10aW1lIGVycm9yCisvKiBtMm1hcGNvbnN0KDIpID0gNTsgKi8gIC8vIHRoaXMgeWllbGRzIGEgY29tcGlsZS10aW1lIGVycm9yCmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfUmVzaGFwZU1hdDJNYXQuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX1Jlc2hhcGVNYXQyTWF0LmNwcAppbmRleCA3MzdhZmVjLi44NTVhZjMxIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfUmVzaGFwZU1hdDJNYXQuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9SZXNoYXBlTWF0Mk1hdC5jcHAKQEAgLTEsNiArMSw1IEBACi1NYXRyaXhYZiBNMSgyLDYpOyAgICAvLyBDb2x1bW4tbWFqb3Igc3RvcmFnZQotTTEgPDwgMSwgMiwgMywgIDQsICA1LCAgNiwKLSAgICAgIDcsIDgsIDksIDEwLCAxMSwgMTI7CitNYXRyaXhYZiBNMSgyLCA2KTsgIC8vIENvbHVtbi1tYWpvciBzdG9yYWdlCitNMSA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyOwogCi1NYXA8TWF0cml4WGY+IE0yKE0xLmRhdGEoKSwgNiwyKTsKK01hcDxNYXRyaXhYZj4gTTIoTTEuZGF0YSgpLCA2LCAyKTsKIGNvdXQgPDwgIk0yOiIgPDwgZW5kbCA8PCBNMiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX1Jlc2hhcGVNYXQyVmVjLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9SZXNoYXBlTWF0MlZlYy5jcHAKaW5kZXggMzI5ODBhNy4uOWEyZGYwMSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX1Jlc2hhcGVNYXQyVmVjLmNwcAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfUmVzaGFwZU1hdDJWZWMuY3BwCkBAIC0xLDExICsxLDkgQEAKLU1hdHJpeFhmIE0xKDMsMyk7ICAgIC8vIENvbHVtbi1tYWpvciBzdG9yYWdlCi1NMSA8PCAxLCAyLCAzLAotICAgICAgNCwgNSwgNiwKLSAgICAgIDcsIDgsIDk7CitNYXRyaXhYZiBNMSgzLCAzKTsgIC8vIENvbHVtbi1tYWpvciBzdG9yYWdlCitNMSA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5OwogCiBNYXA8Um93VmVjdG9yWGY+IHYxKE0xLmRhdGEoKSwgTTEuc2l6ZSgpKTsKIGNvdXQgPDwgInYxOiIgPDwgZW5kbCA8PCB2MSA8PCBlbmRsOwogCi1NYXRyaXg8ZmxvYXQsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPiBNMihNMSk7CitNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPiBNMihNMSk7CiBNYXA8Um93VmVjdG9yWGY+IHYyKE0yLmRhdGEoKSwgTTIuc2l6ZSgpKTsKIGNvdXQgPDwgInYyOiIgPDwgZW5kbCA8PCB2MiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX1NsaWNpbmdDb2wuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX1NsaWNpbmdDb2wuY3BwCmluZGV4IDY5NWQxMzAuLmJmYWVjNTAgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9TbGljaW5nQ29sLmNwcAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfU2xpY2luZ0NvbC5jcHAKQEAgLTEsMTEgKzEsMTEgQEAKLU1hdHJpeFhmIE0xID0gTWF0cml4WGY6OlJhbmRvbSgzLDgpOworTWF0cml4WGYgTTEgPSBNYXRyaXhYZjo6UmFuZG9tKDMsIDgpOwogY291dCA8PCAiQ29sdW1uIG1ham9yIGlucHV0OiIgPDwgZW5kbCA8PCBNMSA8PCAiXG4iOwotTWFwPE1hdHJpeFhmLDAsT3V0ZXJTdHJpZGU8PiA+IE0yKE0xLmRhdGEoKSwgTTEucm93cygpLCAoTTEuY29scygpKzIpLzMsIE91dGVyU3RyaWRlPD4oTTEub3V0ZXJTdHJpZGUoKSozKSk7CitNYXA8TWF0cml4WGYsIDAsIE91dGVyU3RyaWRlPD4gPiBNMihNMS5kYXRhKCksIE0xLnJvd3MoKSwgKE0xLmNvbHMoKSArIDIpIC8gMywgT3V0ZXJTdHJpZGU8PihNMS5vdXRlclN0cmlkZSgpICogMykpOwogY291dCA8PCAiMSBjb2x1bW4gb3ZlciAzOiIgPDwgZW5kbCA8PCBNMiA8PCAiXG4iOwogCi10eXBlZGVmIE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+IFJvd01ham9yTWF0cml4WGY7Cit0eXBlZGVmIE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+IFJvd01ham9yTWF0cml4WGY7CiBSb3dNYWpvck1hdHJpeFhmIE0zKE0xKTsKIGNvdXQgPDwgIlJvdyBtYWpvciBpbnB1dDoiIDw8IGVuZGwgPDwgTTMgPDwgIlxuIjsKLU1hcDxSb3dNYWpvck1hdHJpeFhmLDAsU3RyaWRlPER5bmFtaWMsMz4gPiBNNChNMy5kYXRhKCksIE0zLnJvd3MoKSwgKE0zLmNvbHMoKSsyKS8zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlkZTxEeW5hbWljLDM+KE0zLm91dGVyU3RyaWRlKCksMykpOworTWFwPFJvd01ham9yTWF0cml4WGYsIDAsIFN0cmlkZTxEeW5hbWljLCAzPiA+IE00KE0zLmRhdGEoKSwgTTMucm93cygpLCAoTTMuY29scygpICsgMikgLyAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlkZTxEeW5hbWljLCAzPihNMy5vdXRlclN0cmlkZSgpLCAzKSk7CiBjb3V0IDw8ICIxIGNvbHVtbiBvdmVyIDM6IiA8PCBlbmRsIDw8IE00IDw8ICJcbiI7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfU2xpY2luZ1ZlYy5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfU2xpY2luZ1ZlYy5jcHAKaW5kZXggOWI4MjI0Ni4uZDBjODFjNiAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX1NsaWNpbmdWZWMuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9TbGljaW5nVmVjLmNwcApAQCAtMSw0ICsxLDQgQEAKLVJvd1ZlY3RvclhmIHYgPSBSb3dWZWN0b3JYZjo6TGluU3BhY2VkKDIwLDAsMTkpOworUm93VmVjdG9yWGYgdiA9IFJvd1ZlY3RvclhmOjpMaW5TcGFjZWQoMjAsIDAsIDE5KTsKIGNvdXQgPDwgIklucHV0OiIgPDwgZW5kbCA8PCB2IDw8IGVuZGw7Ci1NYXA8Um93VmVjdG9yWGYsMCxJbm5lclN0cmlkZTwyPiA+IHYyKHYuZGF0YSgpLCB2LnNpemUoKS8yKTsKK01hcDxSb3dWZWN0b3JYZiwgMCwgSW5uZXJTdHJpZGU8Mj4gPiB2Mih2LmRhdGEoKSwgdi5zaXplKCkgLyAyKTsKIGNvdXQgPDwgIkV2ZW46IiA8PCB2MiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX2NvbW1haW5pdF8wMS5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfY29tbWFpbml0XzAxLmNwcAppbmRleCA0N2JhMzFkLi4zNjcyOGE3IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfY29tbWFpbml0XzAxLmNwcAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfY29tbWFpbml0XzAxLmNwcApAQCAtMSw1ICsxLDMgQEAKIE1hdHJpeDNmIG07Ci1tIDw8IDEsIDIsIDMsCi0gICAgIDQsIDUsIDYsCi0gICAgIDcsIDgsIDk7CittIDw8IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDk7CiBzdGQ6OmNvdXQgPDwgbTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9jb21tYWluaXRfMDFiLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9jb21tYWluaXRfMDFiLmNwcAppbmRleCAyYWRiMmUyLi4xMjYyNzdiIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfY29tbWFpbml0XzAxYi5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX2NvbW1haW5pdF8wMWIuY3BwCkBAIC0xLDUgKzEsNSBAQAogTWF0cml4M2YgbTsKIG0ucm93KDApIDw8IDEsIDIsIDM7Ci1tLmJsb2NrKDEsMCwyLDIpIDw8IDQsIDUsIDcsIDg7Ci1tLmNvbCgyKS50YWlsKDIpIDw8IDYsIDk7CQkgICAgCittLmJsb2NrKDEsIDAsIDIsIDIpIDw8IDQsIDUsIDcsIDg7CittLmNvbCgyKS50YWlsKDIpIDw8IDYsIDk7CiBzdGQ6OmNvdXQgPDwgbTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9jb21tYWluaXRfMDIuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX2NvbW1haW5pdF8wMi5jcHAKaW5kZXggYzk2MGQ2YS4uMzQzNzIzNyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX2NvbW1haW5pdF8wMi5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX2NvbW1haW5pdF8wMi5jcHAKQEAgLTEsNyArMSw1IEBACi1pbnQgcm93cz01LCBjb2xzPTU7Ci1NYXRyaXhYZiBtKHJvd3MsY29scyk7CitpbnQgcm93cyA9IDUsIGNvbHMgPSA1OworTWF0cml4WGYgbShyb3dzLCBjb2xzKTsKIG0gPDwgKE1hdHJpeDNmKCkgPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSkuZmluaXNoZWQoKSwKLSAgICAgTWF0cml4WGY6Olplcm8oMyxjb2xzLTMpLAotICAgICBNYXRyaXhYZjo6WmVybyhyb3dzLTMsMyksCi0gICAgIE1hdHJpeFhmOjpJZGVudGl0eShyb3dzLTMsY29scy0zKTsKKyAgICBNYXRyaXhYZjo6WmVybygzLCBjb2xzIC0gMyksIE1hdHJpeFhmOjpaZXJvKHJvd3MgLSAzLCAzKSwgTWF0cml4WGY6OklkZW50aXR5KHJvd3MgLSAzLCBjb2xzIC0gMyk7CiBjb3V0IDw8IG07CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfcmFuZ2VfZm9yX2xvb3BfMWRfY3h4MTEuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3JhbmdlX2Zvcl9sb29wXzFkX2N4eDExLmNwcAppbmRleCBlNzJlNzE1Li5lZTNhZjg2IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfcmFuZ2VfZm9yX2xvb3BfMWRfY3h4MTEuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9yYW5nZV9mb3JfbG9vcF8xZF9jeHgxMS5jcHAKQEAgLTEsNCArMSw0IEBACiBWZWN0b3JYaSB2ID0gVmVjdG9yWGk6OlJhbmRvbSg0KTsKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciB2OlxuIjsKLWZvcihhdXRvIHggOiB2KSBjb3V0IDw8IHggPDwgIiAiOworZm9yIChhdXRvIHggOiB2KSBjb3V0IDw8IHggPDwgIiAiOwogY291dCA8PCAiXG4iOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3JhbmdlX2Zvcl9sb29wXzJkX2N4eDExLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9yYW5nZV9mb3JfbG9vcF8yZF9jeHgxMS5jcHAKaW5kZXggNGExMmQyNi4uMjdlMWY4YSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3JhbmdlX2Zvcl9sb29wXzJkX2N4eDExLmNwcAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfcmFuZ2VfZm9yX2xvb3BfMmRfY3h4MTEuY3BwCkBAIC0xLDUgKzEsNCBAQAogTWF0cml4MmkgQSA9IE1hdHJpeDJpOjpSYW5kb20oKTsKIGNvdXQgPDwgIkhlcmUgYXJlIHRoZSBjb2VmZnMgb2YgdGhlIDJ4MiBtYXRyaXggQTpcbiI7Ci1mb3IoYXV0byB4IDogQS5yZXNoYXBlZCgpKQotICBjb3V0IDw8IHggPDwgIiAiOworZm9yIChhdXRvIHggOiBBLnJlc2hhcGVkKCkpIGNvdXQgPDwgeCA8PCAiICI7CiBjb3V0IDw8ICJcbiI7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfcmVzaGFwZWRfdnNfcmVzaXplXzEuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3Jlc2hhcGVkX3ZzX3Jlc2l6ZV8xLmNwcAppbmRleCBlNTIwZThlLi40MWE1ZDk5IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfcmVzaGFwZWRfdnNfcmVzaXplXzEuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9yZXNoYXBlZF92c19yZXNpemVfMS5jcHAKQEAgLTEsNSArMSw1IEBACiBNYXRyaXhYaSBtID0gTWF0cml4NGk6OlJhbmRvbSgpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKIGNvdXQgPDwgIkhlcmUgaXMgbS5yZXNoYXBlZCgyLCA4KToiIDw8IGVuZGwgPDwgbS5yZXNoYXBlZCgyLCA4KSA8PCBlbmRsOwotbS5yZXNpemUoMiw4KTsKK20ucmVzaXplKDIsIDgpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG0gYWZ0ZXIgbS5yZXNpemUoMiw4KToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3Jlc2hhcGVkX3ZzX3Jlc2l6ZV8yLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9yZXNoYXBlZF92c19yZXNpemVfMi5jcHAKaW5kZXggNTBkYzQ1NC4uYzVkMzkyOSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3Jlc2hhcGVkX3ZzX3Jlc2l6ZV8yLmNwcAorKysgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfcmVzaGFwZWRfdnNfcmVzaXplXzIuY3BwCkBAIC0xLDYgKzEsNiBAQAotTWF0cml4PGludCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+IG0gPSBNYXRyaXg0aTo6UmFuZG9tKCk7CitNYXRyaXg8aW50LCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4gbSA9IE1hdHJpeDRpOjpSYW5kb20oKTsKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CiBjb3V0IDw8ICJIZXJlIGlzIG0ucmVzaGFwZWQoMiwgOCk6IiA8PCBlbmRsIDw8IG0ucmVzaGFwZWQoMiwgOCkgPDwgZW5kbDsKIGNvdXQgPDwgIkhlcmUgaXMgbS5yZXNoYXBlZDxBdXRvT3JkZXI+KDIsIDgpOiIgPDwgZW5kbCA8PCBtLnJlc2hhcGVkPEF1dG9PcmRlcj4oMiwgOCkgPDwgZW5kbDsKLW0ucmVzaXplKDIsOCk7CittLnJlc2l6ZSgyLCA4KTsKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtIGFmdGVyIG0ucmVzaXplKDIsOCk6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9tYXRyaXhfaW52ZXJzZS5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfbWF0cml4X2ludmVyc2UuY3BwCmluZGV4IGZmZjMyNDQuLmUzOTY5NmYgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9tYXRyaXhfaW52ZXJzZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX21hdHJpeF9pbnZlcnNlLmNwcApAQCAtMSw2ICsxLDYgQEAKIE1hdHJpeDNmIEE7CiBWZWN0b3IzZiBiOwotQSA8PCAxLDIsMywgIDQsNSw2LCAgNyw4LDEwOworQSA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAxMDsKIGIgPDwgMywgMywgNDsKIFZlY3RvcjNmIHggPSBBLmludmVyc2UoKSAqIGI7CiBjb3V0IDw8ICJUaGUgc29sdXRpb24gaXM6IiA8PCBlbmRsIDw8IHggPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9tdWx0aXBsZV9yaHMuY3BwIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX211bHRpcGxlX3Jocy5jcHAKaW5kZXggNTQxMWE0NC4uYjA4MTAwYSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX211bHRpcGxlX3Jocy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX211bHRpcGxlX3Jocy5jcHAKQEAgLTEsOCArMSw4IEBACi1NYXRyaXgzZiBBKDMsMyk7Ci1BIDw8IDEsMiwzLCAgNCw1LDYsICA3LDgsMTA7Ci1NYXRyaXg8ZmxvYXQsMywyPiBCOwotQiA8PCAzLDEsIDMsMSwgNCwxOwotTWF0cml4PGZsb2F0LDMsMj4gWDsKK01hdHJpeDNmIEEoMywgMyk7CitBIDw8IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDEwOworTWF0cml4PGZsb2F0LCAzLCAyPiBCOworQiA8PCAzLCAxLCAzLCAxLCA0LCAxOworTWF0cml4PGZsb2F0LCAzLCAyPiBYOwogWCA9IEEuZnVsbFBpdkx1KCkuc29sdmUoQik7CiBjb3V0IDw8ICJUaGUgc29sdXRpb24gd2l0aCByaWdodC1oYW5kIHNpZGUgKDMsMyw0KSBpczoiIDw8IGVuZGw7CiBjb3V0IDw8IFguY29sKDApIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfcmV1c2VfZGVjb21wb3NpdGlvbi5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfcmV1c2VfZGVjb21wb3NpdGlvbi5jcHAKaW5kZXggM2NhMDY0NS4uZDQ3YzZjYSAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3JldXNlX2RlY29tcG9zaXRpb24uY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9yZXVzZV9kZWNvbXBvc2l0aW9uLmNwcApAQCAtMSwxMyArMSwxMyBAQAotTWF0cml4M2YgQSgzLDMpOwotQSA8PCAxLDIsMywgIDQsNSw2LCAgNyw4LDEwOwotUGFydGlhbFBpdkxVPE1hdHJpeDNmPiBsdU9mQShBKTsgLy8gY29tcHV0ZSBMVSBkZWNvbXBvc2l0aW9uIG9mIEEKK01hdHJpeDNmIEEoMywgMyk7CitBIDw8IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDEwOworUGFydGlhbFBpdkxVPE1hdHJpeDNmPiBsdU9mQShBKTsgIC8vIGNvbXB1dGUgTFUgZGVjb21wb3NpdGlvbiBvZiBBCiBWZWN0b3IzZiBiOwotYiA8PCAzLDMsNDsKK2IgPDwgMywgMywgNDsKIFZlY3RvcjNmIHg7CiB4ID0gbHVPZkEuc29sdmUoYik7CiBjb3V0IDw8ICJUaGUgc29sdXRpb24gd2l0aCByaWdodC1oYW5kIHNpZGUgKDMsMyw0KSBpczoiIDw8IGVuZGw7CiBjb3V0IDw8IHggPDwgZW5kbDsKLWIgPDwgMSwxLDE7CitiIDw8IDEsIDEsIDE7CiB4ID0gbHVPZkEuc29sdmUoYik7CiBjb3V0IDw8ICJUaGUgc29sdXRpb24gd2l0aCByaWdodC1oYW5kIHNpZGUgKDEsMSwxKSBpczoiIDw8IGVuZGw7CiBjb3V0IDw8IHggPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9zaW5ndWxhci5jcHAgYi9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfc2luZ3VsYXIuY3BwCmluZGV4IGFiZmYxZWYuLjRkMTY4ZGYgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV9zaW5ndWxhci5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3Npbmd1bGFyLmNwcApAQCAtMSw2ICsxLDYgQEAKIE1hdHJpeDNmIEE7CiBWZWN0b3IzZiBiOwotQSA8PCAxLDIsMywgIDQsNSw2LCAgNyw4LDk7CitBIDw8IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDk7CiBiIDw8IDMsIDMsIDQ7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggQToiIDw8IGVuZGwgPDwgQSA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyB0aGUgdmVjdG9yIGI6IiA8PCBlbmRsIDw8IGIgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV90cmlhbmd1bGFyLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV90cmlhbmd1bGFyLmNwcAppbmRleCA5ZDEzZjIyLi5iNDIyZjI0IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfdHJpYW5ndWxhci5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3NvbHZlX3RyaWFuZ3VsYXIuY3BwCkBAIC0xLDYgKzEsNiBAQAogTWF0cml4M2YgQTsKIFZlY3RvcjNmIGI7Ci1BIDw8IDEsMiwzLCAgMCw1LDYsICAwLDAsMTA7CitBIDw8IDEsIDIsIDMsIDAsIDUsIDYsIDAsIDAsIDEwOwogYiA8PCAzLCAzLCA0OwogY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IEE6IiA8PCBlbmRsIDw8IEEgPDwgZW5kbDsKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIHZlY3RvciBiOiIgPDwgZW5kbCA8PCBiIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc29sdmVfdHJpYW5ndWxhcl9pbnBsYWNlLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV90cmlhbmd1bGFyX2lucGxhY2UuY3BwCmluZGV4IDE2YWU2MzMuLmY5MjhlNzggMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV90cmlhbmd1bGFyX2lucGxhY2UuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zb2x2ZV90cmlhbmd1bGFyX2lucGxhY2UuY3BwCkBAIC0xLDYgKzEsNiBAQAogTWF0cml4M2YgQTsKIFZlY3RvcjNmIGI7Ci1BIDw8IDEsMiwzLCAgMCw1LDYsICAwLDAsMTA7CitBIDw8IDEsIDIsIDMsIDAsIDUsIDYsIDAsIDAsIDEwOwogYiA8PCAzLCAzLCA0OwogQS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZUluUGxhY2UoYik7CiBjb3V0IDw8ICJUaGUgc29sdXRpb24gaXM6IiA8PCBlbmRsIDw8IGIgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zdGRfc29ydF9yb3dzX2N4eDExLmNwcCBiL2RvYy9zbmlwcGV0cy9UdXRvcmlhbF9zdGRfc29ydF9yb3dzX2N4eDExLmNwcAppbmRleCAwMzY0MTYwLi5kOTQ4OTQ5IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVHV0b3JpYWxfc3RkX3NvcnRfcm93c19jeHgxMS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL1R1dG9yaWFsX3N0ZF9zb3J0X3Jvd3NfY3h4MTEuY3BwCkBAIC0xLDUgKzEsNCBAQAotQXJyYXlYWGkgQSA9IEFycmF5WFhpOjpSYW5kb20oNCw0KS5hYnMoKTsKK0FycmF5WFhpIEEgPSBBcnJheVhYaTo6UmFuZG9tKDQsIDQpLmFicygpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgaW5pdGlhbCBtYXRyaXggQTpcbiIgPDwgQSA8PCAiXG4iOwotZm9yKGF1dG8gcm93IDogQS5yb3d3aXNlKCkpCi0gIHN0ZDo6c29ydChyb3cuYmVnaW4oKSwgcm93LmVuZCgpKTsKK2ZvciAoYXV0byByb3cgOiBBLnJvd3dpc2UoKSkgc3RkOjpzb3J0KHJvdy5iZWdpbigpLCByb3cuZW5kKCkpOwogY291dCA8PCAiSGVyZSBpcyB0aGUgc29ydGVkIG1hdHJpeCBBOlxuIiA8PCBBIDw8ICJcbiI7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvVmVjdG9yd2lzZU9wX2hvbW9nZW5lb3VzLmNwcCBiL2RvYy9zbmlwcGV0cy9WZWN0b3J3aXNlT3BfaG9tb2dlbmVvdXMuY3BwCmluZGV4IDY3Y2Y1NzMuLjNkMmM4ZmQgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy9WZWN0b3J3aXNlT3BfaG9tb2dlbmVvdXMuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy9WZWN0b3J3aXNlT3BfaG9tb2dlbmVvdXMuY3BwCkBAIC0xLDYgKzEsOCBAQAotTWF0cml4M1hkIE0gPSBNYXRyaXgzWGQ6OlJhbmRvbSgzLDUpOworTWF0cml4M1hkIE0gPSBNYXRyaXgzWGQ6OlJhbmRvbSgzLCA1KTsKIFByb2plY3RpdmUzZCBQKE1hdHJpeDRkOjpSYW5kb20oKSk7CiBjb3V0IDw8ICJUaGUgbWF0cml4IE0gaXM6IiA8PCBlbmRsIDw8IE0gPDwgZW5kbCA8PCBlbmRsOwogY291dCA8PCAiTS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKToiIDw8IGVuZGwgPDwgTS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSA8PCBlbmRsIDw8IGVuZGw7CiBjb3V0IDw8ICJQICogTS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKToiIDw8IGVuZGwgPDwgUCAqIE0uY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkgPDwgZW5kbCA8PCBlbmRsOwotY291dCA8PCAiUCAqIE0uY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkuaG5vcm1hbGl6ZWQoKTogIiA8PCBlbmRsIDw8IChQICogTS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCkgPDwgZW5kbCA8PCBlbmRsOworY291dCA8PCAiUCAqIE0uY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkuaG5vcm1hbGl6ZWQoKTogIiA8PCBlbmRsCisgICAgIDw8IChQICogTS5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCkgPDwgZW5kbAorICAgICA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL1ZlY3Rvcndpc2VfcmV2ZXJzZS5jcHAgYi9kb2Mvc25pcHBldHMvVmVjdG9yd2lzZV9yZXZlcnNlLmNwcAppbmRleCAyZjZhMzUwLi44NWEwMDY1IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvVmVjdG9yd2lzZV9yZXZlcnNlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvVmVjdG9yd2lzZV9yZXZlcnNlLmNwcApAQCAtMSwxMCArMSw5IEBACi1NYXRyaXhYaSBtID0gTWF0cml4WGk6OlJhbmRvbSgzLDQpOworTWF0cml4WGkgbSA9IE1hdHJpeFhpOjpSYW5kb20oMywgNCk7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggbToiIDw8IGVuZGwgPDwgbSA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyB0aGUgcm93d2lzZSByZXZlcnNlIG9mIG06IiA8PCBlbmRsIDw8IG0ucm93d2lzZSgpLnJldmVyc2UoKSA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyB0aGUgY29sd2lzZSByZXZlcnNlIG9mIG06IiA8PCBlbmRsIDw8IG0uY29sd2lzZSgpLnJldmVyc2UoKSA8PCBlbmRsOwogCi1jb3V0IDw8ICJIZXJlIGlzIHRoZSBjb2VmZmljaWVudCAoMSwwKSBpbiB0aGUgcm93aXNlIHJldmVyc2Ugb2YgbToiIDw8IGVuZGwKLTw8IG0ucm93d2lzZSgpLnJldmVyc2UoKSgxLDApIDw8IGVuZGw7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSBjb2VmZmljaWVudCAoMSwwKSBpbiB0aGUgcm93aXNlIHJldmVyc2Ugb2YgbToiIDw8IGVuZGwgPDwgbS5yb3d3aXNlKCkucmV2ZXJzZSgpKDEsIDApIDw8IGVuZGw7CiBjb3V0IDw8ICJMZXQgdXMgb3ZlcndyaXRlIHRoaXMgY29lZmZpY2llbnQgd2l0aCB0aGUgdmFsdWUgNC4iIDw8IGVuZGw7Ci0vL20uY29sd2lzZSgpLnJldmVyc2UoKSgxLDApID0gNDsKKy8vIG0uY29sd2lzZSgpLnJldmVyc2UoKSgxLDApID0gNDsKIGNvdXQgPDwgIk5vdyB0aGUgbWF0cml4IG0gaXM6IiA8PCBlbmRsIDw8IG0gPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9jbGFzc19GdWxsUGl2TFUuY3BwIGIvZG9jL3NuaXBwZXRzL2NsYXNzX0Z1bGxQaXZMVS5jcHAKaW5kZXggZmNlN2ZhYy4uMjk1MWM4ZCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL2NsYXNzX0Z1bGxQaXZMVS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL2NsYXNzX0Z1bGxQaXZMVS5jcHAKQEAgLTMsMTEgKzMsMTAgQEAKIE1hdHJpeDV4MyBtID0gTWF0cml4NXgzOjpSYW5kb20oKTsKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBtOiIgPDwgZW5kbCA8PCBtIDw8IGVuZGw7CiBFaWdlbjo6RnVsbFBpdkxVPE1hdHJpeDV4Mz4gbHUobSk7Ci1jb3V0IDw8ICJIZXJlIGlzLCB1cCB0byBwZXJtdXRhdGlvbnMsIGl0cyBMVSBkZWNvbXBvc2l0aW9uIG1hdHJpeDoiCi0gICAgIDw8IGVuZGwgPDwgbHUubWF0cml4TFUoKSA8PCBlbmRsOworY291dCA8PCAiSGVyZSBpcywgdXAgdG8gcGVybXV0YXRpb25zLCBpdHMgTFUgZGVjb21wb3NpdGlvbiBtYXRyaXg6IiA8PCBlbmRsIDw8IGx1Lm1hdHJpeExVKCkgPDwgZW5kbDsKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIEwgcGFydDoiIDw8IGVuZGw7CiBNYXRyaXg1eDUgbCA9IE1hdHJpeDV4NTo6SWRlbnRpdHkoKTsKLWwuYmxvY2s8NSwzPigwLDApLnRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkgPSBsdS5tYXRyaXhMVSgpOworbC5ibG9jazw1LCAzPigwLCAwKS50cmlhbmd1bGFyVmlldzxTdHJpY3RseUxvd2VyPigpID0gbHUubWF0cml4TFUoKTsKIGNvdXQgPDwgbCA8PCBlbmRsOwogY291dCA8PCAiSGVyZSBpcyB0aGUgVSBwYXJ0OiIgPDwgZW5kbDsKIE1hdHJpeDV4MyB1ID0gbHUubWF0cml4TFUoKS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy9jb21waWxlX3NuaXBwZXQuY3BwLmluIGIvZG9jL3NuaXBwZXRzL2NvbXBpbGVfc25pcHBldC5jcHAuaW4KaW5kZXggMDRmMjc2ZC4uZTg0MWY0MyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL2NvbXBpbGVfc25pcHBldC5jcHAuaW4KKysrIGIvZG9jL3NuaXBwZXRzL2NvbXBpbGVfc25pcHBldC5jcHAuaW4KQEAgLTEsNSArMSwxMCBAQAogc3RhdGljIGJvb2wgZWlnZW5fZGlkX2Fzc2VydCA9IGZhbHNlOwotI2RlZmluZSBlaWdlbl9hc3NlcnQoWCkgaWYoIWVpZ2VuX2RpZF9hc3NlcnQgJiYgIShYKSl7IHN0ZDo6Y291dCA8PCAiIyMjIEFzc2VydGlvbiByYWlzZWQgaW4gIiA8PCBfX0ZJTEVfXyA8PCAiOiIgPDwgX19MSU5FX18gPDwgIjpcbiIgI1ggPDwgIlxuIyMjIFRoZSBmb2xsb3dpbmcgd291bGQgaGFwcGVuIHdpdGhvdXQgYXNzZXJ0aW9uczpcbiI7IGVpZ2VuX2RpZF9hc3NlcnQgPSB0cnVlO30KKyNkZWZpbmUgZWlnZW5fYXNzZXJ0KFgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCFlaWdlbl9kaWRfYXNzZXJ0ICYmICEoWCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGQ6OmNvdXQgPDwgIiMjIyBBc3NlcnRpb24gcmFpc2VkIGluICIgPDwgX19GSUxFX18gPDwgIjoiIDw8IF9fTElORV9fIDw8ICI6XG4iICNYIFwKKyAgICAgICAgICAgICAgPDwgIlxuIyMjIFRoZSBmb2xsb3dpbmcgd291bGQgaGFwcGVuIHdpdGhvdXQgYXNzZXJ0aW9uczpcbiI7ICAgICAgICAgICAgIFwKKyAgICBlaWdlbl9kaWRfYXNzZXJ0ID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8Y2Fzc2VydD4KQEAgLTksMTIgKzE0LDEwIEBACiAjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1CiAjZW5kaWYKIAotCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi1pbnQgbWFpbihpbnQsIGNoYXIqKikKLXsKK2ludCBtYWluKGludCwgY2hhcioqKSB7CiAgIGNvdXQucHJlY2lzaW9uKDMpOwogLy8gaW50ZW50aW9uYWxseSByZW1vdmUgaW5kZW50YXRpb24gb2Ygc25pcHBldAogewpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3JlZHV4X21pbm1heC5jcHAgYi9kb2Mvc25pcHBldHMvdHV0X2FyaXRobWV0aWNfcmVkdXhfbWlubWF4LmNwcAppbmRleCBmNGFlN2Y0Li5kYzQzMzU4IDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvdHV0X2FyaXRobWV0aWNfcmVkdXhfbWlubWF4LmNwcAorKysgYi9kb2Mvc25pcHBldHMvdHV0X2FyaXRobWV0aWNfcmVkdXhfbWlubWF4LmNwcApAQCAtMSwxMiArMSwxMCBAQAotICBNYXRyaXgzZiBtID0gTWF0cml4M2Y6OlJhbmRvbSgpOwotICBzdGQ6OnB0cmRpZmZfdCBpLCBqOwotICBmbG9hdCBtaW5PZk0gPSBtLm1pbkNvZWZmKCZpLCZqKTsKLSAgY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06XG4iIDw8IG0gPDwgZW5kbDsKLSAgY291dCA8PCAiSXRzIG1pbmltdW0gY29lZmZpY2llbnQgKCIgPDwgbWluT2ZNIAotICAgICAgIDw8ICIpIGlzIGF0IHBvc2l0aW9uICgiIDw8IGkgPDwgIiwiIDw8IGogPDwgIilcblxuIjsKK01hdHJpeDNmIG0gPSBNYXRyaXgzZjo6UmFuZG9tKCk7CitzdGQ6OnB0cmRpZmZfdCBpLCBqOworZmxvYXQgbWluT2ZNID0gbS5taW5Db2VmZigmaSwgJmopOworY291dCA8PCAiSGVyZSBpcyB0aGUgbWF0cml4IG06XG4iIDw8IG0gPDwgZW5kbDsKK2NvdXQgPDwgIkl0cyBtaW5pbXVtIGNvZWZmaWNpZW50ICgiIDw8IG1pbk9mTSA8PCAiKSBpcyBhdCBwb3NpdGlvbiAoIiA8PCBpIDw8ICIsIiA8PCBqIDw8ICIpXG5cbiI7CiAKLSAgUm93VmVjdG9yNGkgdiA9IFJvd1ZlY3RvcjRpOjpSYW5kb20oKTsKLSAgaW50IG1heE9mViA9IHYubWF4Q29lZmYoJmkpOwotICBjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjogIiA8PCB2IDw8IGVuZGw7Ci0gIGNvdXQgPDwgIkl0cyBtYXhpbXVtIGNvZWZmaWNpZW50ICgiIDw8IG1heE9mViAKLSAgICAgICA8PCAiKSBpcyBhdCBwb3NpdGlvbiAiIDw8IGkgPDwgZW5kbDsKK1Jvd1ZlY3RvcjRpIHYgPSBSb3dWZWN0b3I0aTo6UmFuZG9tKCk7CitpbnQgbWF4T2ZWID0gdi5tYXhDb2VmZigmaSk7Citjb3V0IDw8ICJIZXJlIGlzIHRoZSB2ZWN0b3IgdjogIiA8PCB2IDw8IGVuZGw7Citjb3V0IDw8ICJJdHMgbWF4aW11bSBjb2VmZmljaWVudCAoIiA8PCBtYXhPZlYgPDwgIikgaXMgYXQgcG9zaXRpb24gIiA8PCBpIDw8IGVuZGw7CmRpZmYgLS1naXQgYS9kb2Mvc25pcHBldHMvdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2FsaWFzaW5nLmNwcCBiL2RvYy9zbmlwcGV0cy90dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfYWxpYXNpbmcuY3BwCmluZGV4IGY4MmU2ZjIuLjc1ZDQ2Y2YgMTAwNjQ0Ci0tLSBhL2RvYy9zbmlwcGV0cy90dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfYWxpYXNpbmcuY3BwCisrKyBiL2RvYy9zbmlwcGV0cy90dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfYWxpYXNpbmcuY3BwCkBAIC0xLDUgKzEsNiBAQAotTWF0cml4MmkgYTsgYSA8PCAxLCAyLCAzLCA0OworTWF0cml4MmkgYTsKK2EgPDwgMSwgMiwgMywgNDsKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBhOlxuIiA8PCBhIDw8IGVuZGw7CiAKLWEgPSBhLnRyYW5zcG9zZSgpOyAvLyAhISEgZG8gTk9UIGRvIHRoaXMgISEhCithID0gYS50cmFuc3Bvc2UoKTsgIC8vICEhISBkbyBOT1QgZG8gdGhpcyAhISEKIGNvdXQgPDwgImFuZCB0aGUgcmVzdWx0IG9mIHRoZSBhbGlhc2luZyBlZmZlY3Q6XG4iIDw8IGEgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy90dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfY29uanVnYXRlLmNwcCBiL2RvYy9zbmlwcGV0cy90dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfY29uanVnYXRlLmNwcAppbmRleCA4ODQ5NmIyLi4zYjM1NmQyIDEwMDY0NAotLS0gYS9kb2Mvc25pcHBldHMvdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2Nvbmp1Z2F0ZS5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9jb25qdWdhdGUuY3BwCkBAIC0xLDEyICsxLDggQEAKLU1hdHJpeFhjZiBhID0gTWF0cml4WGNmOjpSYW5kb20oMiwyKTsKK01hdHJpeFhjZiBhID0gTWF0cml4WGNmOjpSYW5kb20oMiwgMik7CiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggYVxuIiA8PCBhIDw8IGVuZGw7CiAKIGNvdXQgPDwgIkhlcmUgaXMgdGhlIG1hdHJpeCBhXlRcbiIgPDwgYS50cmFuc3Bvc2UoKSA8PCBlbmRsOwogCi0KIGNvdXQgPDwgIkhlcmUgaXMgdGhlIGNvbmp1Z2F0ZSBvZiBhXG4iIDw8IGEuY29uanVnYXRlKCkgPDwgZW5kbDsKIAotCiBjb3V0IDw8ICJIZXJlIGlzIHRoZSBtYXRyaXggYV4qXG4iIDw8IGEuYWRqb2ludCgpIDw8IGVuZGw7Ci0KLQpkaWZmIC0tZ2l0IGEvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9pbnBsYWNlLmNwcCBiL2RvYy9zbmlwcGV0cy90dXRfYXJpdGhtZXRpY190cmFuc3Bvc2VfaW5wbGFjZS5jcHAKaW5kZXggNWM4MWM5ZS4uZGJmOGJjNCAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL3R1dF9hcml0aG1ldGljX3RyYW5zcG9zZV9pbnBsYWNlLmNwcAorKysgYi9kb2Mvc25pcHBldHMvdHV0X2FyaXRobWV0aWNfdHJhbnNwb3NlX2lucGxhY2UuY3BwCkBAIC0xLDYgKzEsNiBAQAotTWF0cml4WGYgYSgyLDMpOyBhIDw8IDEsIDIsIDMsIDQsIDUsIDY7CitNYXRyaXhYZiBhKDIsIDMpOworYSA8PCAxLCAyLCAzLCA0LCA1LCA2OwogY291dCA8PCAiSGVyZSBpcyB0aGUgaW5pdGlhbCBtYXRyaXggYTpcbiIgPDwgYSA8PCBlbmRsOwogCi0KIGEudHJhbnNwb3NlSW5QbGFjZSgpOwogY291dCA8PCAiYW5kIGFmdGVyIGJlaW5nIHRyYW5zcG9zZWQ6XG4iIDw8IGEgPDwgZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zbmlwcGV0cy90dXRfbWF0cml4X2Fzc2lnbm1lbnRfcmVzaXppbmcuY3BwIGIvZG9jL3NuaXBwZXRzL3R1dF9tYXRyaXhfYXNzaWdubWVudF9yZXNpemluZy5jcHAKaW5kZXggY2YxODk5OC4uOWY1ZGE0MyAxMDA2NDQKLS0tIGEvZG9jL3NuaXBwZXRzL3R1dF9tYXRyaXhfYXNzaWdubWVudF9yZXNpemluZy5jcHAKKysrIGIvZG9jL3NuaXBwZXRzL3R1dF9tYXRyaXhfYXNzaWdubWVudF9yZXNpemluZy5jcHAKQEAgLTEsNSArMSw1IEBACi1NYXRyaXhYZiBhKDIsMik7CitNYXRyaXhYZiBhKDIsIDIpOwogc3RkOjpjb3V0IDw8ICJhIGlzIG9mIHNpemUgIiA8PCBhLnJvd3MoKSA8PCAieCIgPDwgYS5jb2xzKCkgPDwgc3RkOjplbmRsOwotTWF0cml4WGYgYigzLDMpOworTWF0cml4WGYgYigzLCAzKTsKIGEgPSBiOwogc3RkOjpjb3V0IDw8ICJhIGlzIG5vdyBvZiBzaXplICIgPDwgYS5yb3dzKCkgPDwgIngiIDw8IGEuY29scygpIDw8IHN0ZDo6ZW5kbDsKZGlmZiAtLWdpdCBhL2RvYy9zcGVjaWFsX2V4YW1wbGVzL1R1dG9yaWFsX3NwYXJzZV9leGFtcGxlLmNwcCBiL2RvYy9zcGVjaWFsX2V4YW1wbGVzL1R1dG9yaWFsX3NwYXJzZV9leGFtcGxlLmNwcAppbmRleCA4ODUwZGIwLi5iODk5NGJhIDEwMDY0NAotLS0gYS9kb2Mvc3BlY2lhbF9leGFtcGxlcy9UdXRvcmlhbF9zcGFyc2VfZXhhbXBsZS5jcHAKKysrIGIvZG9jL3NwZWNpYWxfZXhhbXBsZXMvVHV0b3JpYWxfc3BhcnNlX2V4YW1wbGUuY3BwCkBAIC0yLDI4ICsyLDI3IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi10eXBlZGVmIEVpZ2VuOjpTcGFyc2VNYXRyaXg8ZG91YmxlPiBTcE1hdDsgLy8gZGVjbGFyZXMgYSBjb2x1bW4tbWFqb3Igc3BhcnNlIG1hdHJpeCB0eXBlIG9mIGRvdWJsZQordHlwZWRlZiBFaWdlbjo6U3BhcnNlTWF0cml4PGRvdWJsZT4gU3BNYXQ7ICAvLyBkZWNsYXJlcyBhIGNvbHVtbi1tYWpvciBzcGFyc2UgbWF0cml4IHR5cGUgb2YgZG91YmxlCiB0eXBlZGVmIEVpZ2VuOjpUcmlwbGV0PGRvdWJsZT4gVDsKIAogdm9pZCBidWlsZFByb2JsZW0oc3RkOjp2ZWN0b3I8VD4mIGNvZWZmaWNpZW50cywgRWlnZW46OlZlY3RvclhkJiBiLCBpbnQgbik7CiB2b2lkIHNhdmVBc0JpdG1hcChjb25zdCBFaWdlbjo6VmVjdG9yWGQmIHgsIGludCBuLCBjb25zdCBjaGFyKiBmaWxlbmFtZSk7CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKLXsKLSAgaWYoYXJnYyE9MikgeworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGlmIChhcmdjICE9IDIpIHsKICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yOiBleHBlY3RlZCBvbmUgYW5kIG9ubHkgb25lIGFyZ3VtZW50LlxuIjsKICAgICByZXR1cm4gLTE7CiAgIH0KLSAgCi0gIGludCBuID0gMzAwOyAgLy8gc2l6ZSBvZiB0aGUgaW1hZ2UKLSAgaW50IG0gPSBuKm47ICAvLyBudW1iZXIgb2YgdW5rbm93bnMgKD1udW1iZXIgb2YgcGl4ZWxzKQorCisgIGludCBuID0gMzAwOyAgICAvLyBzaXplIG9mIHRoZSBpbWFnZQorICBpbnQgbSA9IG4gKiBuOyAgLy8gbnVtYmVyIG9mIHVua25vd25zICg9bnVtYmVyIG9mIHBpeGVscykKIAogICAvLyBBc3NlbWJseToKLSAgc3RkOjp2ZWN0b3I8VD4gY29lZmZpY2llbnRzOyAgICAgICAgICAgIC8vIGxpc3Qgb2Ygbm9uLXplcm9zIGNvZWZmaWNpZW50cwotICBFaWdlbjo6VmVjdG9yWGQgYihtKTsgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJpZ2h0IGhhbmQgc2lkZS12ZWN0b3IgcmVzdWx0aW5nIGZyb20gdGhlIGNvbnN0cmFpbnRzCisgIHN0ZDo6dmVjdG9yPFQ+IGNvZWZmaWNpZW50czsgIC8vIGxpc3Qgb2Ygbm9uLXplcm9zIGNvZWZmaWNpZW50cworICBFaWdlbjo6VmVjdG9yWGQgYihtKTsgICAgICAgICAvLyB0aGUgcmlnaHQgaGFuZCBzaWRlLXZlY3RvciByZXN1bHRpbmcgZnJvbSB0aGUgY29uc3RyYWludHMKICAgYnVpbGRQcm9ibGVtKGNvZWZmaWNpZW50cywgYiwgbik7CiAKLSAgU3BNYXQgQShtLG0pOworICBTcE1hdCBBKG0sIG0pOwogICBBLnNldEZyb21UcmlwbGV0cyhjb2VmZmljaWVudHMuYmVnaW4oKSwgY29lZmZpY2llbnRzLmVuZCgpKTsKIAogICAvLyBTb2x2aW5nOgpAQCAtMzUsNCArMzQsMyBAQAogCiAgIHJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9kb2Mvc3BlY2lhbF9leGFtcGxlcy9UdXRvcmlhbF9zcGFyc2VfZXhhbXBsZV9kZXRhaWxzLmNwcCBiL2RvYy9zcGVjaWFsX2V4YW1wbGVzL1R1dG9yaWFsX3NwYXJzZV9leGFtcGxlX2RldGFpbHMuY3BwCmluZGV4IGJjMThiMDEuLjE4YWJkNmYgMTAwNjQ0Ci0tLSBhL2RvYy9zcGVjaWFsX2V4YW1wbGVzL1R1dG9yaWFsX3NwYXJzZV9leGFtcGxlX2RldGFpbHMuY3BwCisrKyBiL2RvYy9zcGVjaWFsX2V4YW1wbGVzL1R1dG9yaWFsX3NwYXJzZV9leGFtcGxlX2RldGFpbHMuY3BwCkBAIC0yLDQzICsyLDQxIEBACiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPFFJbWFnZT4KIAotdHlwZWRlZiBFaWdlbjo6U3BhcnNlTWF0cml4PGRvdWJsZT4gU3BNYXQ7IC8vIGRlY2xhcmVzIGEgY29sdW1uLW1ham9yIHNwYXJzZSBtYXRyaXggdHlwZSBvZiBkb3VibGUKK3R5cGVkZWYgRWlnZW46OlNwYXJzZU1hdHJpeDxkb3VibGU+IFNwTWF0OyAgLy8gZGVjbGFyZXMgYSBjb2x1bW4tbWFqb3Igc3BhcnNlIG1hdHJpeCB0eXBlIG9mIGRvdWJsZQogdHlwZWRlZiBFaWdlbjo6VHJpcGxldDxkb3VibGU+IFQ7CiAKLXZvaWQgaW5zZXJ0Q29lZmZpY2llbnQoaW50IGlkLCBpbnQgaSwgaW50IGosIGRvdWJsZSB3LCBzdGQ6OnZlY3RvcjxUPiYgY29lZmZzLAotICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6VmVjdG9yWGQmIGIsIGNvbnN0IEVpZ2VuOjpWZWN0b3JYZCYgYm91bmRhcnkpCi17Cit2b2lkIGluc2VydENvZWZmaWNpZW50KGludCBpZCwgaW50IGksIGludCBqLCBkb3VibGUgdywgc3RkOjp2ZWN0b3I8VD4mIGNvZWZmcywgRWlnZW46OlZlY3RvclhkJiBiLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFaWdlbjo6VmVjdG9yWGQmIGJvdW5kYXJ5KSB7CiAgIGludCBuID0gaW50KGJvdW5kYXJ5LnNpemUoKSk7Ci0gIGludCBpZDEgPSBpK2oqbjsKKyAgaW50IGlkMSA9IGkgKyBqICogbjsKIAotICAgICAgICBpZihpPT0tMSB8fCBpPT1uKSBiKGlkKSAtPSB3ICogYm91bmRhcnkoaik7IC8vIGNvbnN0cmFpbmVkIGNvZWZmaWNpZW50Ci0gIGVsc2UgIGlmKGo9PS0xIHx8IGo9PW4pIGIoaWQpIC09IHcgKiBib3VuZGFyeShpKTsgLy8gY29uc3RyYWluZWQgY29lZmZpY2llbnQKLSAgZWxzZSAgY29lZmZzLnB1c2hfYmFjayhUKGlkLGlkMSx3KSk7ICAgICAgICAgICAgICAvLyB1bmtub3duIGNvZWZmaWNpZW50CisgIGlmIChpID09IC0xIHx8IGkgPT0gbikKKyAgICBiKGlkKSAtPSB3ICogYm91bmRhcnkoaik7ICAvLyBjb25zdHJhaW5lZCBjb2VmZmljaWVudAorICBlbHNlIGlmIChqID09IC0xIHx8IGogPT0gbikKKyAgICBiKGlkKSAtPSB3ICogYm91bmRhcnkoaSk7ICAvLyBjb25zdHJhaW5lZCBjb2VmZmljaWVudAorICBlbHNlCisgICAgY29lZmZzLnB1c2hfYmFjayhUKGlkLCBpZDEsIHcpKTsgIC8vIHVua25vd24gY29lZmZpY2llbnQKIH0KIAotdm9pZCBidWlsZFByb2JsZW0oc3RkOjp2ZWN0b3I8VD4mIGNvZWZmaWNpZW50cywgRWlnZW46OlZlY3RvclhkJiBiLCBpbnQgbikKLXsKK3ZvaWQgYnVpbGRQcm9ibGVtKHN0ZDo6dmVjdG9yPFQ+JiBjb2VmZmljaWVudHMsIEVpZ2VuOjpWZWN0b3JYZCYgYiwgaW50IG4pIHsKICAgYi5zZXRaZXJvKCk7Ci0gIEVpZ2VuOjpBcnJheVhkIGJvdW5kYXJ5ID0gRWlnZW46OkFycmF5WGQ6OkxpblNwYWNlZChuLCAwLE1fUEkpLnNpbigpLnBvdygyKTsKLSAgZm9yKGludCBqPTA7IGo8bjsgKytqKQotICB7Ci0gICAgZm9yKGludCBpPTA7IGk8bjsgKytpKQotICAgIHsKLSAgICAgIGludCBpZCA9IGkraipuOwotICAgICAgaW5zZXJ0Q29lZmZpY2llbnQoaWQsIGktMSxqLCAtMSwgY29lZmZpY2llbnRzLCBiLCBib3VuZGFyeSk7Ci0gICAgICBpbnNlcnRDb2VmZmljaWVudChpZCwgaSsxLGosIC0xLCBjb2VmZmljaWVudHMsIGIsIGJvdW5kYXJ5KTsKLSAgICAgIGluc2VydENvZWZmaWNpZW50KGlkLCBpLGotMSwgLTEsIGNvZWZmaWNpZW50cywgYiwgYm91bmRhcnkpOwotICAgICAgaW5zZXJ0Q29lZmZpY2llbnQoaWQsIGksaisxLCAtMSwgY29lZmZpY2llbnRzLCBiLCBib3VuZGFyeSk7Ci0gICAgICBpbnNlcnRDb2VmZmljaWVudChpZCwgaSxqLCAgICA0LCBjb2VmZmljaWVudHMsIGIsIGJvdW5kYXJ5KTsKKyAgRWlnZW46OkFycmF5WGQgYm91bmRhcnkgPSBFaWdlbjo6QXJyYXlYZDo6TGluU3BhY2VkKG4sIDAsIE1fUEkpLnNpbigpLnBvdygyKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyArK2opIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgaW50IGlkID0gaSArIGogKiBuOworICAgICAgaW5zZXJ0Q29lZmZpY2llbnQoaWQsIGkgLSAxLCBqLCAtMSwgY29lZmZpY2llbnRzLCBiLCBib3VuZGFyeSk7CisgICAgICBpbnNlcnRDb2VmZmljaWVudChpZCwgaSArIDEsIGosIC0xLCBjb2VmZmljaWVudHMsIGIsIGJvdW5kYXJ5KTsKKyAgICAgIGluc2VydENvZWZmaWNpZW50KGlkLCBpLCBqIC0gMSwgLTEsIGNvZWZmaWNpZW50cywgYiwgYm91bmRhcnkpOworICAgICAgaW5zZXJ0Q29lZmZpY2llbnQoaWQsIGksIGogKyAxLCAtMSwgY29lZmZpY2llbnRzLCBiLCBib3VuZGFyeSk7CisgICAgICBpbnNlcnRDb2VmZmljaWVudChpZCwgaSwgaiwgNCwgY29lZmZpY2llbnRzLCBiLCBib3VuZGFyeSk7CiAgICAgfQogICB9CiB9CiAKLXZvaWQgc2F2ZUFzQml0bWFwKGNvbnN0IEVpZ2VuOjpWZWN0b3JYZCYgeCwgaW50IG4sIGNvbnN0IGNoYXIqIGZpbGVuYW1lKQotewotICBFaWdlbjo6QXJyYXk8dW5zaWduZWQgY2hhcixFaWdlbjo6RHluYW1pYyxFaWdlbjo6RHluYW1pYz4gYml0cyA9ICh4KjI1NSkuY2FzdDx1bnNpZ25lZCBjaGFyPigpOwotICBRSW1hZ2UgaW1nKGJpdHMuZGF0YSgpLCBuLG4sUUltYWdlOjpGb3JtYXRfSW5kZXhlZDgpOwordm9pZCBzYXZlQXNCaXRtYXAoY29uc3QgRWlnZW46OlZlY3RvclhkJiB4LCBpbnQgbiwgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgRWlnZW46OkFycmF5PHVuc2lnbmVkIGNoYXIsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYz4gYml0cyA9ICh4ICogMjU1KS5jYXN0PHVuc2lnbmVkIGNoYXI+KCk7CisgIFFJbWFnZSBpbWcoYml0cy5kYXRhKCksIG4sIG4sIFFJbWFnZTo6Rm9ybWF0X0luZGV4ZWQ4KTsKICAgaW1nLnNldENvbG9yQ291bnQoMjU2KTsKLSAgZm9yKGludCBpPTA7aTwyNTY7aSsrKSBpbWcuc2V0Q29sb3IoaSxxUmdiKGksaSxpKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIGltZy5zZXRDb2xvcihpLCBxUmdiKGksIGksIGkpKTsKICAgaW1nLnNhdmUoZmlsZW5hbWUpOwogfQpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNpYWxfZXhhbXBsZXMvcmFuZG9tX2NwcDExLmNwcCBiL2RvYy9zcGVjaWFsX2V4YW1wbGVzL3JhbmRvbV9jcHAxMS5jcHAKaW5kZXggYmQ3MzgwMC4uYTU5NjEzYSAxMDA2NDQKLS0tIGEvZG9jL3NwZWNpYWxfZXhhbXBsZXMvcmFuZG9tX2NwcDExLmNwcAorKysgYi9kb2Mvc3BlY2lhbF9leGFtcGxlcy9yYW5kb21fY3BwMTEuY3BwCkBAIC01LDggKzUsOCBAQAogaW50IG1haW4oKSB7CiAgIHN0ZDo6ZGVmYXVsdF9yYW5kb21fZW5naW5lIGdlbmVyYXRvcjsKICAgc3RkOjpwb2lzc29uX2Rpc3RyaWJ1dGlvbjxpbnQ+IGRpc3RyaWJ1dGlvbig0LjEpOwotICBhdXRvIHBvaXNzb24gPSBbJl0gKCkge3JldHVybiBkaXN0cmlidXRpb24oZ2VuZXJhdG9yKTt9OworICBhdXRvIHBvaXNzb24gPSBbJl0oKSB7IHJldHVybiBkaXN0cmlidXRpb24oZ2VuZXJhdG9yKTsgfTsKIAotICBFaWdlbjo6Um93VmVjdG9yWGkgdiA9IEVpZ2VuOjpSb3dWZWN0b3JYaTo6TnVsbGFyeUV4cHIoMTAsIHBvaXNzb24gKTsKKyAgRWlnZW46OlJvd1ZlY3RvclhpIHYgPSBFaWdlbjo6Um93VmVjdG9yWGk6Ok51bGxhcnlFeHByKDEwLCBwb2lzc29uKTsKICAgc3RkOjpjb3V0IDw8IHYgPDwgIlxuIjsKIH0KZGlmZiAtLWdpdCBhL2RvYy90dXRvcmlhbC5jcHAgYi9kb2MvdHV0b3JpYWwuY3BwCmluZGV4IDYyYmU3YzIuLjdlNThiNjEgMTAwNjQ0Ci0tLSBhL2RvYy90dXRvcmlhbC5jcHAKKysrIGIvZG9jL3R1dG9yaWFsLmNwcApAQCAtMSw3ICsxLDYgQEAKICNpbmNsdWRlIDxFaWdlbi9BcnJheT4KIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgc3RkOjpjb3V0LnByZWNpc2lvbigyKTsKIAogICAvLyBkZW1vIHN0YXRpYyBmdW5jdGlvbnMKQEAgLTEzLDI5ICsxMiwyOSBAQAogICAvLyBkZW1vIG5vbi1zdGF0aWMgc2V0Li4uIGZ1bmN0aW9ucwogICBtNC5zZXRaZXJvKCk7CiAgIG0zLmRpYWdvbmFsKCkuc2V0T25lcygpOwotICAKKwogICBzdGQ6OmNvdXQgPDwgIioqKiBTdGVwIDIgKioqXG5tMzpcbiIgPDwgbTMgPDwgIlxubTQ6XG4iIDw8IG00IDw8IHN0ZDo6ZW5kbDsKIAogICAvLyBkZW1vIGZpeGVkLXNpemUgYmxvY2soKSBleHByZXNzaW9uIGFzIGx2YWx1ZSBhbmQgYXMgcnZhbHVlCi0gIG00LmJsb2NrPDMsMz4oMCwxKSA9IG0zOwotICBtMy5yb3coMikgPSBtNC5ibG9jazwxLDM+KDIsMCk7CisgIG00LmJsb2NrPDMsIDM+KDAsIDEpID0gbTM7CisgIG0zLnJvdygyKSA9IG00LmJsb2NrPDEsIDM+KDIsIDApOwogCiAgIHN0ZDo6Y291dCA8PCAiKioqIFN0ZXAgMyAqKipcbm0zOlxuIiA8PCBtMyA8PCAiXG5tNDpcbiIgPDwgbTQgPDwgc3RkOjplbmRsOwogCiAgIC8vIGRlbW8gZHluYW1pYy1zaXplIGJsb2NrKCkKICAgewogICAgIGludCByb3dzID0gMywgY29scyA9IDM7Ci0gICAgbTQuYmxvY2soMCwxLDMsMykuc2V0SWRlbnRpdHkoKTsKKyAgICBtNC5ibG9jaygwLCAxLCAzLCAzKS5zZXRJZGVudGl0eSgpOwogICAgIHN0ZDo6Y291dCA8PCAiKioqIFN0ZXAgNCAqKipcbm00OlxuIiA8PCBtNCA8PCBzdGQ6OmVuZGw7CiAgIH0KIAogICAvLyBkZW1vIHZlY3RvciBibG9ja3MKLSAgbTQuZGlhZ29uYWwoKS5ibG9jaygxLDIpLnNldE9uZXMoKTsKKyAgbTQuZGlhZ29uYWwoKS5ibG9jaygxLCAyKS5zZXRPbmVzKCk7CiAgIHN0ZDo6Y291dCA8PCAiKioqIFN0ZXAgNSAqKipcbm00LmRpYWdvbmFsKCk6XG4iIDw8IG00LmRpYWdvbmFsKCkgPDwgc3RkOjplbmRsOwogICBzdGQ6OmNvdXQgPDwgIm00LmRpYWdvbmFsKCkuc3RhcnQoMylcbiIgPDwgbTQuZGlhZ29uYWwoKS5zdGFydCgzKSA8PCBzdGQ6OmVuZGw7CiAKICAgLy8gZGVtbyBjb2VmZi13aXNlIG9wZXJhdGlvbnMKLSAgbTQgPSBtNC5jd2lzZSgpKm00OworICBtNCA9IG00LmN3aXNlKCkgKiBtNDsKICAgbTMgPSBtMy5jd2lzZSgpLmNvcygpOwogICBzdGQ6OmNvdXQgPDwgIioqKiBTdGVwIDYgKioqXG5tMzpcbiIgPDwgbTMgPDwgIlxubTQ6XG4iIDw8IG00IDw8IHN0ZDo6ZW5kbDsKIApAQCAtNDYsMTcgKzQ1LDE3IEBACiAgIHN0ZDo6Y291dCA8PCAibTQucm93d2lzZSgpLnN1bSgpOlxuIiA8PCBtNC5yb3d3aXNlKCkuc3VtKCkgPDwgc3RkOjplbmRsOwogCiAgIC8vIGRlbW8gaW50ZWxsaWdlbnQgYXV0by1ldmFsdWF0aW9uCi0gIG00ID0gbTQgKiBtNDsgLy8gYXV0by1ldmFsdWF0ZXMgc28gbm8gYWxpYXNpbmcgcHJvYmxlbSAocGVyZm9ybWFuY2UgcGVuYWx0eSBpcyBsb3cpCi0gIEVpZ2VuOjpNYXRyaXg0ZiBvdGhlciA9IChtNCAqIG00KS5sYXp5KCk7IC8vIGZvcmNlcyBsYXp5IGV2YWx1YXRpb24KLSAgbTQgPSBtNCArIG00OyAvLyBoZXJlIEVpZ2VuIGdvZXMgZm9yIGxhenkgZXZhbHVhdGlvbiwgYXMgd2l0aCBtb3N0IGV4cHJlc3Npb25zCi0gIG00ID0gLW00ICsgbTQgKyA1ICogbTQ7IC8vIHNhbWUgaGVyZSwgRWlnZW4gY2hvb3NlcyBsYXp5IGV2YWx1YXRpb24gZm9yIGFsbCB0aGF0LgotICBtNCA9IG00ICogKG00ICsgbTQpOyAvLyBoZXJlIEVpZ2VuIGNob29zZXMgdG8gZmlyc3QgZXZhbHVhdGUgbTQgKyBtNCBpbnRvIGEgdGVtcG9yYXJ5LgotICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRlZWQsIGhlcmUgaXQgaXMgYW4gb3B0aW1pemF0aW9uIHRvIGNhY2hlIHRoaXMgaW50ZXJtZWRpYXRlIHJlc3VsdC4KLSAgbTMgPSBtMyAqIG00LmJsb2NrPDMsMz4oMSwxKTsgLy8gaGVyZSBFaWdlbiBjaG9vc2VzIE5PVCB0byBldmFsdWF0ZSBibG9jaygpIGludG8gYSB0ZW1wb3JhcnkKLSAgICAvLyBiZWNhdXNlIGFjY2Vzc2luZyBjb2VmZmljaWVudHMgb2YgdGhhdCBibG9jayBleHByZXNzaW9uIGlzIG5vdCBtb3JlIGNvc3RseSB0aGFuIGFjY2Vzc2luZwotICAgIC8vIGNvZWZmaWNpZW50cyBvZiBhIHBsYWluIG1hdHJpeC4KLSAgbTQgPSBtNCAqIG00LnRyYW5zcG9zZSgpOyAvLyBzYW1lIGhlcmUsIGxhenkgZXZhbHVhdGlvbiBvZiB0aGUgdHJhbnNwb3NlLgotICBtNCA9IG00ICogbTQudHJhbnNwb3NlKCkuZXZhbCgpOyAvLyBmb3JjZXMgaW1tZWRpYXRlIGV2YWx1YXRpb24gb2YgdGhlIHRyYW5zcG9zZQorICBtNCA9IG00ICogbTQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXV0by1ldmFsdWF0ZXMgc28gbm8gYWxpYXNpbmcgcHJvYmxlbSAocGVyZm9ybWFuY2UgcGVuYWx0eSBpcyBsb3cpCisgIEVpZ2VuOjpNYXRyaXg0ZiBvdGhlciA9IChtNCAqIG00KS5sYXp5KCk7ICAvLyBmb3JjZXMgbGF6eSBldmFsdWF0aW9uCisgIG00ID0gbTQgKyBtNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIEVpZ2VuIGdvZXMgZm9yIGxhenkgZXZhbHVhdGlvbiwgYXMgd2l0aCBtb3N0IGV4cHJlc3Npb25zCisgIG00ID0gLW00ICsgbTQgKyA1ICogbTQ7ICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIGhlcmUsIEVpZ2VuIGNob29zZXMgbGF6eSBldmFsdWF0aW9uIGZvciBhbGwgdGhhdC4KKyAgbTQgPSBtNCAqIChtNCArIG00KTsgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgRWlnZW4gY2hvb3NlcyB0byBmaXJzdCBldmFsdWF0ZSBtNCArIG00IGludG8gYSB0ZW1wb3JhcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRlZWQsIGhlcmUgaXQgaXMgYW4gb3B0aW1pemF0aW9uIHRvIGNhY2hlIHRoaXMgaW50ZXJtZWRpYXRlIHJlc3VsdC4KKyAgbTMgPSBtMyAqIG00LmJsb2NrPDMsIDM+KDEsIDEpOyAgICAgICAgICAgIC8vIGhlcmUgRWlnZW4gY2hvb3NlcyBOT1QgdG8gZXZhbHVhdGUgYmxvY2soKSBpbnRvIGEgdGVtcG9yYXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgYWNjZXNzaW5nIGNvZWZmaWNpZW50cyBvZiB0aGF0IGJsb2NrIGV4cHJlc3Npb24gaXMgbm90IG1vcmUgY29zdGx5IHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjZXNzaW5nIGNvZWZmaWNpZW50cyBvZiBhIHBsYWluIG1hdHJpeC4KKyAgbTQgPSBtNCAqIG00LnRyYW5zcG9zZSgpOyAgICAgICAgIC8vIHNhbWUgaGVyZSwgbGF6eSBldmFsdWF0aW9uIG9mIHRoZSB0cmFuc3Bvc2UuCisgIG00ID0gbTQgKiBtNC50cmFuc3Bvc2UoKS5ldmFsKCk7ICAvLyBmb3JjZXMgaW1tZWRpYXRlIGV2YWx1YXRpb24gb2YgdGhlIHRyYW5zcG9zZQogCiAgIHN0ZDo6Y291dCA8PCAiKioqIFN0ZXAgOCAqKipcbm0zOlxuIiA8PCBtMyA8PCAiXG5tNDpcbiIgPDwgbTQgPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvYmRjc3ZkX2ludC5jcHAgYi9mYWlsdGVzdC9iZGNzdmRfaW50LmNwcAppbmRleCA2NzA3NTJjLi5iNDE5NDU3IDEwMDY0NAotLS0gYS9mYWlsdGVzdC9iZGNzdmRfaW50LmNwcAorKysgYi9mYWlsdGVzdC9iZGNzdmRfaW50LmNwcApAQCAtOCw3ICs4LDQgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi1pbnQgbWFpbigpCi17Ci0gIEJEQ1NWRDxNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz4gPiBxcihNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz46OlJhbmRvbSgxMCwxMCkpOwotfQoraW50IG1haW4oKSB7IEJEQ1NWRDxNYXRyaXg8U0NBTEFSLCBEeW5hbWljLCBEeW5hbWljPiA+IHFyKE1hdHJpeDxTQ0FMQVIsIER5bmFtaWMsIER5bmFtaWM+OjpSYW5kb20oMTAsIDEwKSk7IH0KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2Jsb2NrX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByXzAuY3BwIGIvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMC5jcHAKaW5kZXggNDBiODIwMS4uYjJlMTM0YiAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMC5jcHAKKysrIGIvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMC5jcHAKQEAgLTgsOCArOCw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKXsKLSAgICBCbG9jazxNYXRyaXgzZCwzLDM+IGIobSwwLDApOwotfQordm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKSB7IEJsb2NrPE1hdHJpeDNkLCAzLCAzPiBiKG0sIDAsIDApOyB9CiAKIGludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2Jsb2NrX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByXzEuY3BwIGIvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMS5jcHAKaW5kZXggZWY2ZDUzNy4uYzNkZGM5YSAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMS5jcHAKKysrIGIvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMS5jcHAKQEAgLTgsOCArOCw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKXsKLSAgICBCbG9jazxNYXRyaXgzZD4gYihtLDAsMCwzLDMpOwotfQordm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKSB7IEJsb2NrPE1hdHJpeDNkPiBiKG0sIDAsIDAsIDMsIDMpOyB9CiAKIGludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2Jsb2NrX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByXzIuY3BwIGIvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMi5jcHAKaW5kZXggNDNmMThhZS4uMmExY2U2YyAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMi5jcHAKKysrIGIvZmFpbHRlc3QvYmxvY2tfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHJfMi5jcHAKQEAgLTgsOSArOCw5IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKXsKLSAgICAvLyByb3cvY29sdW1uIGNvbnN0cnVjdG9yCi0gICAgQmxvY2s8TWF0cml4M2QsMywxPiBiKG0sMCk7Cit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0pIHsKKyAgLy8gcm93L2NvbHVtbiBjb25zdHJ1Y3RvcgorICBCbG9jazxNYXRyaXgzZCwgMywgMT4gYihtLCAwKTsKIH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvYmxvY2tfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8wLmNwcCBiL2ZhaWx0ZXN0L2Jsb2NrX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMC5jcHAKaW5kZXggMDA5YmViZS4uMzQ4NmY4NiAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvYmxvY2tfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8wLmNwcAorKysgYi9mYWlsdGVzdC9ibG9ja19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0XzAuY3BwCkBAIC04LDkgKzgsOSBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgZm9vKCl7Ci0gICAgTWF0cml4M2YgbTsKLSAgICBCbG9jazxDVl9RVUFMSUZJRVIgTWF0cml4M2Y+KG0sIDAsIDAsIDMsIDMpLmNvZWZmUmVmKDAsIDApID0gMS4wZjsKK3ZvaWQgZm9vKCkgeworICBNYXRyaXgzZiBtOworICBCbG9jazxDVl9RVUFMSUZJRVIgTWF0cml4M2Y+KG0sIDAsIDAsIDMsIDMpLmNvZWZmUmVmKDAsIDApID0gMS4wZjsKIH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvYmxvY2tfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8xLmNwcCBiL2ZhaWx0ZXN0L2Jsb2NrX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMS5jcHAKaW5kZXggNGMzZTkzZi4uMzQ5MDYxZSAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvYmxvY2tfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8xLmNwcAorKysgYi9mYWlsdGVzdC9ibG9ja19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0XzEuY3BwCkBAIC04LDkgKzgsOSBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgZm9vKCl7Ci0gICAgTWF0cml4WGYgbTsKLSAgICBCbG9jazxDVl9RVUFMSUZJRVIgTWF0cml4WGYsIDMsIDM+KG0sIDAsIDApLmNvZWZmUmVmKDAsIDApID0gMS4wZjsKK3ZvaWQgZm9vKCkgeworICBNYXRyaXhYZiBtOworICBCbG9jazxDVl9RVUFMSUZJRVIgTWF0cml4WGYsIDMsIDM+KG0sIDAsIDApLmNvZWZmUmVmKDAsIDApID0gMS4wZjsKIH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvY29scGl2cXJfaW50LmNwcCBiL2ZhaWx0ZXN0L2NvbHBpdnFyX2ludC5jcHAKaW5kZXggZGIxMTkxMC4uNzJmY2IwNSAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvY29scGl2cXJfaW50LmNwcAorKysgYi9mYWlsdGVzdC9jb2xwaXZxcl9pbnQuY3BwCkBAIC04LDcgKzgsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLWludCBtYWluKCkKLXsKLSAgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz4gPiBxcihNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz46OlJhbmRvbSgxMCwxMCkpOworaW50IG1haW4oKSB7CisgIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PFNDQUxBUiwgRHluYW1pYywgRHluYW1pYz4gPiBxcihNYXRyaXg8U0NBTEFSLCBEeW5hbWljLCBEeW5hbWljPjo6UmFuZG9tKDEwLCAxMCkpOwogfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvY29uc3RfcXVhbGlmaWVkX2Jsb2NrX21ldGhvZF9yZXR2YWxfMC5jcHAgYi9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfYmxvY2tfbWV0aG9kX3JldHZhbF8wLmNwcAppbmRleCBhNmJkNWZlLi4wOGI1ZDNjIDEwMDY0NAotLS0gYS9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfYmxvY2tfbWV0aG9kX3JldHZhbF8wLmNwcAorKysgYi9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfYmxvY2tfbWV0aG9kX3JldHZhbF8wLmNwcApAQCAtOCw4ICs4LDYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi12b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0pewotICAgIEJsb2NrPE1hdHJpeDNkLDMsMz4gYihtLmJsb2NrPDMsMz4oMCwwKSk7Ci19Cit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0pIHsgQmxvY2s8TWF0cml4M2QsIDMsIDM+IGIobS5ibG9jazwzLCAzPigwLCAwKSk7IH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvY29uc3RfcXVhbGlmaWVkX2Jsb2NrX21ldGhvZF9yZXR2YWxfMS5jcHAgYi9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfYmxvY2tfbWV0aG9kX3JldHZhbF8xLmNwcAppbmRleCBlZjQwYzI0Li4wNmUxMmM3IDEwMDY0NAotLS0gYS9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfYmxvY2tfbWV0aG9kX3JldHZhbF8xLmNwcAorKysgYi9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfYmxvY2tfbWV0aG9kX3JldHZhbF8xLmNwcApAQCAtOCw4ICs4LDYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi12b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0pewotICAgIEJsb2NrPE1hdHJpeDNkPiBiKG0uYmxvY2soMCwwLDMsMykpOwotfQordm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKSB7IEJsb2NrPE1hdHJpeDNkPiBiKG0uYmxvY2soMCwgMCwgMywgMykpOyB9CiAKIGludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF9kaWFnb25hbF9tZXRob2RfcmV0dmFsLmNwcCBiL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF9kaWFnb25hbF9tZXRob2RfcmV0dmFsLmNwcAppbmRleCA4MDk1OTRhLi5mM2FjYmE2IDEwMDY0NAotLS0gYS9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfZGlhZ29uYWxfbWV0aG9kX3JldHZhbC5jcHAKKysrIGIvZmFpbHRlc3QvY29uc3RfcXVhbGlmaWVkX2RpYWdvbmFsX21ldGhvZF9yZXR2YWwuY3BwCkBAIC04LDggKzgsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSl7Ci0gICAgRGlhZ29uYWw8TWF0cml4M2Q+IGIobS5kaWFnb25hbCgpKTsKLX0KK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSkgeyBEaWFnb25hbDxNYXRyaXgzZD4gYihtLmRpYWdvbmFsKCkpOyB9CiAKIGludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF90cmFuc3Bvc2VfbWV0aG9kX3JldHZhbC5jcHAgYi9mYWlsdGVzdC9jb25zdF9xdWFsaWZpZWRfdHJhbnNwb3NlX21ldGhvZF9yZXR2YWwuY3BwCmluZGV4IDJkN2YxOWMuLjM5NGY2NGEgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L2NvbnN0X3F1YWxpZmllZF90cmFuc3Bvc2VfbWV0aG9kX3JldHZhbC5jcHAKKysrIGIvZmFpbHRlc3QvY29uc3RfcXVhbGlmaWVkX3RyYW5zcG9zZV9tZXRob2RfcmV0dmFsLmNwcApAQCAtOCw4ICs4LDYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi12b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0pewotICAgIFRyYW5zcG9zZTxNYXRyaXgzZD4gYihtLnRyYW5zcG9zZSgpKTsKLX0KK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSkgeyBUcmFuc3Bvc2U8TWF0cml4M2Q+IGIobS50cmFuc3Bvc2UoKSk7IH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvY3dpc2V1bmFyeXZpZXdfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwIGIvZmFpbHRlc3QvY3dpc2V1bmFyeXZpZXdfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwCmluZGV4IGUyM2NmOGYuLjY0MzMzNWEgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L2N3aXNldW5hcnl2aWV3X25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcAorKysgYi9mYWlsdGVzdC9jd2lzZXVuYXJ5dmlld19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwci5jcHAKQEAgLTgsOCArOCw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKXsKLSAgICBDd2lzZVVuYXJ5VmlldzxpbnRlcm5hbDo6c2NhbGFyX3JlYWxfcmVmX29wPGRvdWJsZT4sTWF0cml4M2Q+IHQobSk7Ci19Cit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0pIHsgQ3dpc2VVbmFyeVZpZXc8aW50ZXJuYWw6OnNjYWxhcl9yZWFsX3JlZl9vcDxkb3VibGU+LCBNYXRyaXgzZD4gdChtKTsgfQogCiBpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9jd2lzZXVuYXJ5dmlld19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcCBiL2ZhaWx0ZXN0L2N3aXNldW5hcnl2aWV3X29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCmluZGV4IGZjZDQxZGYuLjdlY2Y1NDIgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L2N3aXNldW5hcnl2aWV3X29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCisrKyBiL2ZhaWx0ZXN0L2N3aXNldW5hcnl2aWV3X29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCkBAIC04LDkgKzgsOSBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgZm9vKCl7Ci0gICAgTWF0cml4WGYgbTsKLSAgICBDd2lzZVVuYXJ5VmlldzxpbnRlcm5hbDo6c2NhbGFyX3JlYWxfcmVmX29wPGRvdWJsZT4sQ1ZfUVVBTElGSUVSIE1hdHJpeFhmPihtKS5jb2VmZlJlZigwLCAwKSA9IDEuMGY7Cit2b2lkIGZvbygpIHsKKyAgTWF0cml4WGYgbTsKKyAgQ3dpc2VVbmFyeVZpZXc8aW50ZXJuYWw6OnNjYWxhcl9yZWFsX3JlZl9vcDxkb3VibGU+LCBDVl9RVUFMSUZJRVIgTWF0cml4WGY+KG0pLmNvZWZmUmVmKDAsIDApID0gMS4wZjsKIH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvZGlhZ29uYWxfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwIGIvZmFpbHRlc3QvZGlhZ29uYWxfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwCmluZGV4IDc2Mzk4YTIuLjkyNDEyNzAgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L2RpYWdvbmFsX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcAorKysgYi9mYWlsdGVzdC9kaWFnb25hbF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwci5jcHAKQEAgLTgsOCArOCw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKXsKLSAgICBEaWFnb25hbDxNYXRyaXgzZD4gZChtKTsKLX0KK3ZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSkgeyBEaWFnb25hbDxNYXRyaXgzZD4gZChtKTsgfQogCiBpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9kaWFnb25hbF9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcCBiL2ZhaWx0ZXN0L2RpYWdvbmFsX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCmluZGV4IGQ0YjJmZDkuLjIwNGRkNDMgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L2RpYWdvbmFsX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCisrKyBiL2ZhaWx0ZXN0L2RpYWdvbmFsX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCkBAIC04LDkgKzgsOSBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgZm9vKCl7Ci0gICAgTWF0cml4WGYgbTsKLSAgICBEaWFnb25hbDxDVl9RVUFMSUZJRVIgTWF0cml4WGY+KG0pLmNvZWZmUmVmKDApID0gMS4wZjsKK3ZvaWQgZm9vKCkgeworICBNYXRyaXhYZiBtOworICBEaWFnb25hbDxDVl9RVUFMSUZJRVIgTWF0cml4WGY+KG0pLmNvZWZmUmVmKDApID0gMS4wZjsKIH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvZWlnZW5zb2x2ZXJfY3BseC5jcHAgYi9mYWlsdGVzdC9laWdlbnNvbHZlcl9jcGx4LmNwcAppbmRleCBjMmUyMWUxLi40NGFkOGZmIDEwMDY0NAotLS0gYS9mYWlsdGVzdC9laWdlbnNvbHZlcl9jcGx4LmNwcAorKysgYi9mYWlsdGVzdC9laWdlbnNvbHZlcl9jcGx4LmNwcApAQCAtOCw3ICs4LDQgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi1pbnQgbWFpbigpCi17Ci0gIEVpZ2VuU29sdmVyPE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPiA+IGVpZyhNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz46OlJhbmRvbSgxMCwxMCkpOwotfQoraW50IG1haW4oKSB7IEVpZ2VuU29sdmVyPE1hdHJpeDxTQ0FMQVIsIER5bmFtaWMsIER5bmFtaWM+ID4gZWlnKE1hdHJpeDxTQ0FMQVIsIER5bmFtaWMsIER5bmFtaWM+OjpSYW5kb20oMTAsIDEwKSk7IH0KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2VpZ2Vuc29sdmVyX2ludC5jcHAgYi9mYWlsdGVzdC9laWdlbnNvbHZlcl9pbnQuY3BwCmluZGV4IGVkYThkYzIuLmFkMTRjMGYgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L2VpZ2Vuc29sdmVyX2ludC5jcHAKKysrIGIvZmFpbHRlc3QvZWlnZW5zb2x2ZXJfaW50LmNwcApAQCAtOCw3ICs4LDQgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi1pbnQgbWFpbigpCi17Ci0gIEVpZ2VuU29sdmVyPE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPiA+IGVpZyhNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz46OlJhbmRvbSgxMCwxMCkpOwotfQoraW50IG1haW4oKSB7IEVpZ2VuU29sdmVyPE1hdHJpeDxTQ0FMQVIsIER5bmFtaWMsIER5bmFtaWM+ID4gZWlnKE1hdHJpeDxTQ0FMQVIsIER5bmFtaWMsIER5bmFtaWM+OjpSYW5kb20oMTAsIDEwKSk7IH0KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2Z1bGxwaXZsdV9pbnQuY3BwIGIvZmFpbHRlc3QvZnVsbHBpdmx1X2ludC5jcHAKaW5kZXggZTlkMmM2ZS4uYjUyZThjMCAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvZnVsbHBpdmx1X2ludC5jcHAKKysrIGIvZmFpbHRlc3QvZnVsbHBpdmx1X2ludC5jcHAKQEAgLTgsNyArOCw0IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotaW50IG1haW4oKQotewotICBGdWxsUGl2TFU8TWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+ID4gbHUoTWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+OjpSYW5kb20oMTAsMTApKTsKLX0KK2ludCBtYWluKCkgeyBGdWxsUGl2TFU8TWF0cml4PFNDQUxBUiwgRHluYW1pYywgRHluYW1pYz4gPiBsdShNYXRyaXg8U0NBTEFSLCBEeW5hbWljLCBEeW5hbWljPjo6UmFuZG9tKDEwLCAxMCkpOyB9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9mdWxscGl2cXJfaW50LmNwcCBiL2ZhaWx0ZXN0L2Z1bGxwaXZxcl9pbnQuY3BwCmluZGV4IGQxODJhN2IuLjM0ZGRiMmMgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L2Z1bGxwaXZxcl9pbnQuY3BwCisrKyBiL2ZhaWx0ZXN0L2Z1bGxwaXZxcl9pbnQuY3BwCkBAIC04LDcgKzgsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLWludCBtYWluKCkKLXsKLSAgRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+ID4gcXIoTWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+OjpSYW5kb20oMTAsMTApKTsKK2ludCBtYWluKCkgeworICBGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXg8U0NBTEFSLCBEeW5hbWljLCBEeW5hbWljPiA+IHFyKE1hdHJpeDxTQ0FMQVIsIER5bmFtaWMsIER5bmFtaWM+OjpSYW5kb20oMTAsIDEwKSk7CiB9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9pbml0aWFsaXplcl9saXN0XzEuY3BwIGIvZmFpbHRlc3QvaW5pdGlhbGl6ZXJfbGlzdF8xLmNwcAppbmRleCA5MmRmZDFmLi5jOTY4M2ZlIDEwMDY0NAotLS0gYS9mYWlsdGVzdC9pbml0aWFsaXplcl9saXN0XzEuY3BwCisrKyBiL2ZhaWx0ZXN0L2luaXRpYWxpemVyX2xpc3RfMS5jcHAKQEAgLTgsNyArOCw0IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotaW50IG1haW4oKQotewotICBNYXRyaXg8aW50LCBST1dTLCAxPiB7MSwgMiwgM307Ci19CitpbnQgbWFpbigpIHsgTWF0cml4PGludCwgUk9XUywgMT57MSwgMiwgM307IH0KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L2luaXRpYWxpemVyX2xpc3RfMi5jcHAgYi9mYWlsdGVzdC9pbml0aWFsaXplcl9saXN0XzIuY3BwCmluZGV4IDE5OTYwNTAuLjhlYTM0YzkgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L2luaXRpYWxpemVyX2xpc3RfMi5jcHAKKysrIGIvZmFpbHRlc3QvaW5pdGlhbGl6ZXJfbGlzdF8yLmNwcApAQCAtMTAsNyArMTAsNCBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLWludCBtYWluKCkKLXsKLSAgTWF0cml4PGludCwgUk9XUywgQ09MUz4gezEsIDIsIDN9OwotfQoraW50IG1haW4oKSB7IE1hdHJpeDxpbnQsIFJPV1MsIENPTFM+ezEsIDIsIDN9OyB9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9qYWNvYmlzdmRfaW50LmNwcCBiL2ZhaWx0ZXN0L2phY29iaXN2ZF9pbnQuY3BwCmluZGV4IDEyNzkwYWUuLjUyNDMwZjAgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L2phY29iaXN2ZF9pbnQuY3BwCisrKyBiL2ZhaWx0ZXN0L2phY29iaXN2ZF9pbnQuY3BwCkBAIC04LDcgKzgsNCBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLWludCBtYWluKCkKLXsKLSAgSmFjb2JpU1ZEPE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPiA+IHFyKE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPjo6UmFuZG9tKDEwLDEwKSk7Ci19CitpbnQgbWFpbigpIHsgSmFjb2JpU1ZEPE1hdHJpeDxTQ0FMQVIsIER5bmFtaWMsIER5bmFtaWM+ID4gcXIoTWF0cml4PFNDQUxBUiwgRHluYW1pYywgRHluYW1pYz46OlJhbmRvbSgxMCwgMTApKTsgfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvbGRsdF9pbnQuY3BwIGIvZmFpbHRlc3QvbGRsdF9pbnQuY3BwCmluZGV4IDI0M2U0NTcuLjEzNTMxYjYgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L2xkbHRfaW50LmNwcAorKysgYi9mYWlsdGVzdC9sZGx0X2ludC5jcHAKQEAgLTgsNyArOCw0IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotaW50IG1haW4oKQotewotICBMRExUPE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPiA+IGxkbHQoTWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+OjpSYW5kb20oMTAsMTApKTsKLX0KK2ludCBtYWluKCkgeyBMRExUPE1hdHJpeDxTQ0FMQVIsIER5bmFtaWMsIER5bmFtaWM+ID4gbGRsdChNYXRyaXg8U0NBTEFSLCBEeW5hbWljLCBEeW5hbWljPjo6UmFuZG9tKDEwLCAxMCkpOyB9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9sbHRfaW50LmNwcCBiL2ZhaWx0ZXN0L2xsdF9pbnQuY3BwCmluZGV4IGNiMDIwNjUuLjQwYjA1NWMgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L2xsdF9pbnQuY3BwCisrKyBiL2ZhaWx0ZXN0L2xsdF9pbnQuY3BwCkBAIC04LDcgKzgsNCBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLWludCBtYWluKCkKLXsKLSAgTExUPE1hdHJpeDxTQ0FMQVIsRHluYW1pYyxEeW5hbWljPiA+IGxsdChNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz46OlJhbmRvbSgxMCwxMCkpOwotfQoraW50IG1haW4oKSB7IExMVDxNYXRyaXg8U0NBTEFSLCBEeW5hbWljLCBEeW5hbWljPiA+IGxsdChNYXRyaXg8U0NBTEFSLCBEeW5hbWljLCBEeW5hbWljPjo6UmFuZG9tKDEwLCAxMCkpOyB9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfMC5jcHAgYi9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfMC5jcHAKaW5kZXggZDc1Njg2Zi4uNWE3NmNkZSAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzAuY3BwCisrKyBiL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8wLmNwcApAQCAtOCw4ICs4LDYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi12b2lkIGZvbyhDVl9RVUFMSUZJRVIgZmxvYXQgKnB0cil7Ci0gICAgTWFwPE1hdHJpeDNmPiBtKHB0cik7Ci19Cit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgZmxvYXQgKnB0cikgeyBNYXA8TWF0cml4M2Y+IG0ocHRyKTsgfQogCiBpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfMS5jcHAgYi9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfMS5jcHAKaW5kZXggZWRhMTM0ZC4uNDMwNmZiYSAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzEuY3BwCisrKyBiL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8xLmNwcApAQCAtOCw4ICs4LDYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi12b2lkIGZvbyhDVl9RVUFMSUZJRVIgZmxvYXQgKnB0ciwgRGVuc2VJbmRleCBzaXplKXsKLSAgICBNYXA8QXJyYXlYZj4gbShwdHIsIHNpemUpOwotfQordm9pZCBmb28oQ1ZfUVVBTElGSUVSIGZsb2F0ICpwdHIsIERlbnNlSW5kZXggc2l6ZSkgeyBNYXA8QXJyYXlYZj4gbShwdHIsIHNpemUpOyB9CiAKIGludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8yLmNwcCBiL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8yLmNwcAppbmRleCAwNmI0YjYyLi40MTFkOTQyIDEwMDY0NAotLS0gYS9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfMi5jcHAKKysrIGIvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzIuY3BwCkBAIC04LDggKzgsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgZm9vKENWX1FVQUxJRklFUiBmbG9hdCAqcHRyLCBEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXggY29scyl7Ci0gICAgTWFwPE1hdHJpeFhmPiBtKHB0ciwgcm93cywgY29scyk7Ci19Cit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgZmxvYXQgKnB0ciwgRGVuc2VJbmRleCByb3dzLCBEZW5zZUluZGV4IGNvbHMpIHsgTWFwPE1hdHJpeFhmPiBtKHB0ciwgcm93cywgY29scyk7IH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzMuY3BwIGIvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzMuY3BwCmluZGV4IDgzMGY2ZjAuLjRkZjc0MTYgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl8zLmNwcAorKysgYi9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfMy5jcHAKQEAgLTgsOCArOCw4IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBmb28oQ1ZfUVVBTElGSUVSIGZsb2F0ICpwdHIsIERlbnNlSW5kZXggcm93cywgRGVuc2VJbmRleCBjb2xzKXsKLSAgICBNYXA8TWF0cml4WGYsIEFsaWduZWQsIElubmVyU3RyaWRlPDI+ID4gbShwdHIsIHJvd3MsIGNvbHMsIElubmVyU3RyaWRlPDI+KCkpOwordm9pZCBmb28oQ1ZfUVVBTElGSUVSIGZsb2F0ICpwdHIsIERlbnNlSW5kZXggcm93cywgRGVuc2VJbmRleCBjb2xzKSB7CisgIE1hcDxNYXRyaXhYZiwgQWxpZ25lZCwgSW5uZXJTdHJpZGU8Mj4gPiBtKHB0ciwgcm93cywgY29scywgSW5uZXJTdHJpZGU8Mj4oKSk7CiB9CiAKIGludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl80LmNwcCBiL2ZhaWx0ZXN0L21hcF9ub25jb25zdF9jdG9yX29uX2NvbnN0X3B0cl80LmNwcAppbmRleCBjM2U4Yzk1Li45N2E4OTAyIDEwMDY0NAotLS0gYS9mYWlsdGVzdC9tYXBfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF9wdHJfNC5jcHAKKysrIGIvZmFpbHRlc3QvbWFwX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfcHRyXzQuY3BwCkBAIC04LDggKzgsOCBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgZm9vKGNvbnN0IGZsb2F0ICpwdHIsIERlbnNlSW5kZXggcm93cywgRGVuc2VJbmRleCBjb2xzKXsKLSAgICBNYXA8Q1ZfUVVBTElGSUVSIE1hdHJpeFhmLCBVbmFsaWduZWQsIE91dGVyU3RyaWRlPD4gPiBtKHB0ciwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8PigyKSk7Cit2b2lkIGZvbyhjb25zdCBmbG9hdCAqcHRyLCBEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXggY29scykgeworICBNYXA8Q1ZfUVVBTElGSUVSIE1hdHJpeFhmLCBVbmFsaWduZWQsIE91dGVyU3RyaWRlPD4gPiBtKHB0ciwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8PigyKSk7CiB9CiAKIGludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L21hcF9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0XzAuY3BwIGIvZmFpbHRlc3QvbWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMC5jcHAKaW5kZXggOGNiNmFhMC4uOWY0ODVkYiAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvbWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMC5jcHAKKysrIGIvZmFpbHRlc3QvbWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMC5jcHAKQEAgLTgsOCArOCw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBmb28oZmxvYXQgKnB0cil7Ci0gICAgTWFwPENWX1FVQUxJRklFUiBNYXRyaXhYZj4ocHRyLCAxLCAxKS5jb2VmZlJlZigwLDApID0gMS4wZjsKLX0KK3ZvaWQgZm9vKGZsb2F0ICpwdHIpIHsgTWFwPENWX1FVQUxJRklFUiBNYXRyaXhYZj4ocHRyLCAxLCAxKS5jb2VmZlJlZigwLCAwKSA9IDEuMGY7IH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvbWFwX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3RfMS5jcHAgYi9mYWlsdGVzdC9tYXBfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8xLmNwcAppbmRleCAwNGUwNjdjLi5jNWZmMGU2IDEwMDY0NAotLS0gYS9mYWlsdGVzdC9tYXBfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8xLmNwcAorKysgYi9mYWlsdGVzdC9tYXBfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdF8xLmNwcApAQCAtOCw4ICs4LDYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi12b2lkIGZvbyhmbG9hdCAqcHRyKXsKLSAgICBNYXA8Q1ZfUVVBTElGSUVSIFZlY3RvcjNmPihwdHIpLmNvZWZmUmVmKDApID0gMS4wZjsKLX0KK3ZvaWQgZm9vKGZsb2F0ICpwdHIpIHsgTWFwPENWX1FVQUxJRklFUiBWZWN0b3IzZj4ocHRyKS5jb2VmZlJlZigwKSA9IDEuMGY7IH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvcGFydGlhbHBpdmx1X2ludC5jcHAgYi9mYWlsdGVzdC9wYXJ0aWFscGl2bHVfaW50LmNwcAppbmRleCA5OGVmMjgyLi5kZDc5NzM1IDEwMDY0NAotLS0gYS9mYWlsdGVzdC9wYXJ0aWFscGl2bHVfaW50LmNwcAorKysgYi9mYWlsdGVzdC9wYXJ0aWFscGl2bHVfaW50LmNwcApAQCAtOCw3ICs4LDQgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi1pbnQgbWFpbigpCi17Ci0gIFBhcnRpYWxQaXZMVTxNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz4gPiBsdShNYXRyaXg8U0NBTEFSLER5bmFtaWMsRHluYW1pYz46OlJhbmRvbSgxMCwxMCkpOwotfQoraW50IG1haW4oKSB7IFBhcnRpYWxQaXZMVTxNYXRyaXg8U0NBTEFSLCBEeW5hbWljLCBEeW5hbWljPiA+IGx1KE1hdHJpeDxTQ0FMQVIsIER5bmFtaWMsIER5bmFtaWM+OjpSYW5kb20oMTAsIDEwKSk7IH0KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3FyX2ludC5jcHAgYi9mYWlsdGVzdC9xcl9pbnQuY3BwCmluZGV4IGNlMjAwZTguLjU0MWM1NDQgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L3FyX2ludC5jcHAKKysrIGIvZmFpbHRlc3QvcXJfaW50LmNwcApAQCAtOCw3ICs4LDQgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi1pbnQgbWFpbigpCi17Ci0gIEhvdXNlaG9sZGVyUVI8TWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+ID4gcXIoTWF0cml4PFNDQUxBUixEeW5hbWljLER5bmFtaWM+OjpSYW5kb20oMTAsMTApKTsKLX0KK2ludCBtYWluKCkgeyBIb3VzZWhvbGRlclFSPE1hdHJpeDxTQ0FMQVIsIER5bmFtaWMsIER5bmFtaWM+ID4gcXIoTWF0cml4PFNDQUxBUiwgRHluYW1pYywgRHluYW1pYz46OlJhbmRvbSgxMCwgMTApKTsgfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvcmVmXzEuY3BwIGIvZmFpbHRlc3QvcmVmXzEuY3BwCmluZGV4IDhiNzk4ZDUuLjRlNTBkMDUgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L3JlZl8xLmNwcAorKysgYi9mYWlsdGVzdC9yZWZfMS5jcHAKQEAgLTgsMTAgKzgsOSBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgY2FsbF9yZWYoUmVmPFZlY3RvclhmPiBhKSB7IH0KK3ZvaWQgY2FsbF9yZWYoUmVmPFZlY3RvclhmPiBhKSB7fQogCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgVmVjdG9yWGYgYSgxMCk7CiAgIENWX1FVQUxJRklFUiBWZWN0b3JYZiYgYWMoYSk7CiAgIGNhbGxfcmVmKGFjKTsKZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3JlZl8yLmNwcCBiL2ZhaWx0ZXN0L3JlZl8yLmNwcAppbmRleCAwYjc3OWNjLi43ZGI1MDc1IDEwMDY0NAotLS0gYS9mYWlsdGVzdC9yZWZfMi5jcHAKKysrIGIvZmFpbHRlc3QvcmVmXzIuY3BwCkBAIC0yLDExICsyLDEwIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBjYWxsX3JlZihSZWY8VmVjdG9yWGY+IGEpIHsgfQordm9pZCBjYWxsX3JlZihSZWY8VmVjdG9yWGY+IGEpIHt9CiAKLWludCBtYWluKCkKLXsKLSAgTWF0cml4WGYgQSgxMCwxMCk7CitpbnQgbWFpbigpIHsKKyAgTWF0cml4WGYgQSgxMCwgMTApOwogI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECiAgIGNhbGxfcmVmKEEucm93KDMpKTsKICNlbHNlCmRpZmYgLS1naXQgYS9mYWlsdGVzdC9yZWZfMy5jcHAgYi9mYWlsdGVzdC9yZWZfMy5jcHAKaW5kZXggZjQ2MDI3ZC4uNjMxMGQ1ZSAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvcmVmXzMuY3BwCisrKyBiL2ZhaWx0ZXN0L3JlZl8zLmNwcApAQCAtMywxMyArMywxMiBAQAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCiAjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKLXZvaWQgY2FsbF9yZWYoUmVmPFZlY3RvclhmPiBhKSB7IH0KK3ZvaWQgY2FsbF9yZWYoUmVmPFZlY3RvclhmPiBhKSB7fQogI2Vsc2UKLXZvaWQgY2FsbF9yZWYoY29uc3QgUmVmPGNvbnN0IFZlY3RvclhmPiAmYSkgeyB9Cit2b2lkIGNhbGxfcmVmKGNvbnN0IFJlZjxjb25zdCBWZWN0b3JYZj4gJmEpIHt9CiAjZW5kaWYKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIFZlY3RvclhmIGEoMTApOwotICBjYWxsX3JlZihhK2EpOworICBjYWxsX3JlZihhICsgYSk7CiB9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9yZWZfNC5jcHAgYi9mYWlsdGVzdC9yZWZfNC5jcHAKaW5kZXggNmMxMWZhNC4uNDlmOTIzNyAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvcmVmXzQuY3BwCisrKyBiL2ZhaWx0ZXN0L3JlZl80LmNwcApAQCAtMiwxMSArMiwxMCBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgY2FsbF9yZWYoUmVmPE1hdHJpeFhmLDAsT3V0ZXJTdHJpZGU8PiA+IGEpIHt9Cit2b2lkIGNhbGxfcmVmKFJlZjxNYXRyaXhYZiwgMCwgT3V0ZXJTdHJpZGU8PiA+IGEpIHt9CiAKLWludCBtYWluKCkKLXsKLSAgTWF0cml4WGYgQSgxMCwxMCk7CitpbnQgbWFpbigpIHsKKyAgTWF0cml4WGYgQSgxMCwgMTApOwogI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECiAgIGNhbGxfcmVmKEEudHJhbnNwb3NlKCkpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3JlZl81LmNwcCBiL2ZhaWx0ZXN0L3JlZl81LmNwcAppbmRleCA4NDZkNTI3Li4xNzNmNGZhIDEwMDY0NAotLS0gYS9mYWlsdGVzdC9yZWZfNS5jcHAKKysrIGIvZmFpbHRlc3QvcmVmXzUuY3BwCkBAIC0yLDEwICsyLDkgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi12b2lkIGNhbGxfcmVmKFJlZjxWZWN0b3JYZj4gYSkgeyB9Cit2b2lkIGNhbGxfcmVmKFJlZjxWZWN0b3JYZj4gYSkge30KIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIFZlY3RvclhmIGEoMTApOwogICBEZW5zZUJhc2U8VmVjdG9yWGY+ICZhYyhhKTsKICNpZmRlZiBFSUdFTl9TSE9VTERfRkFJTF9UT19CVUlMRApkaWZmIC0tZ2l0IGEvZmFpbHRlc3Qvc2VsZmFkam9pbnR2aWV3X25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcCBiL2ZhaWx0ZXN0L3NlbGZhZGpvaW50dmlld19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwci5jcHAKaW5kZXggYTI0MGY4MS4uY2YwNDk1NyAxMDA2NDQKLS0tIGEvZmFpbHRlc3Qvc2VsZmFkam9pbnR2aWV3X25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcAorKysgYi9mYWlsdGVzdC9zZWxmYWRqb2ludHZpZXdfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwCkBAIC04LDggKzgsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSl7Ci0gICAgU2VsZkFkam9pbnRWaWV3PE1hdHJpeDNkLFVwcGVyPiB0KG0pOwotfQordm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKSB7IFNlbGZBZGpvaW50VmlldzxNYXRyaXgzZCwgVXBwZXI+IHQobSk7IH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3Qvc2VsZmFkam9pbnR2aWV3X29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwIGIvZmFpbHRlc3Qvc2VsZmFkam9pbnR2aWV3X29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCmluZGV4IDE5YWFhZDYuLjcyMDViNTMgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L3NlbGZhZGpvaW50dmlld19vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcAorKysgYi9mYWlsdGVzdC9zZWxmYWRqb2ludHZpZXdfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdC5jcHAKQEAgLTgsOSArOCw5IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBmb28oKXsKLSAgICBNYXRyaXhYZiBtOwotICAgIFNlbGZBZGpvaW50VmlldzxDVl9RVUFMSUZJRVIgTWF0cml4WGYsVXBwZXI+KG0pLmNvZWZmUmVmKDAsIDApID0gMS4wZjsKK3ZvaWQgZm9vKCkgeworICBNYXRyaXhYZiBtOworICBTZWxmQWRqb2ludFZpZXc8Q1ZfUVVBTElGSUVSIE1hdHJpeFhmLCBVcHBlcj4obSkuY29lZmZSZWYoMCwgMCkgPSAxLjBmOwogfQogCiBpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9zcGFyc2VfcmVmXzEuY3BwIGIvZmFpbHRlc3Qvc3BhcnNlX3JlZl8xLmNwcAppbmRleCBkNzhkMWY5Li4zMDc3N2U3IDEwMDY0NAotLS0gYS9mYWlsdGVzdC9zcGFyc2VfcmVmXzEuY3BwCisrKyBiL2ZhaWx0ZXN0L3NwYXJzZV9yZWZfMS5jcHAKQEAgLTgsMTEgKzgsMTAgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi12b2lkIGNhbGxfcmVmKFJlZjxTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4gYSkgeyB9Cit2b2lkIGNhbGxfcmVmKFJlZjxTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4gYSkge30KIAotaW50IG1haW4oKQotewotICBTcGFyc2VNYXRyaXg8ZmxvYXQ+IGEoMTAsMTApOworaW50IG1haW4oKSB7CisgIFNwYXJzZU1hdHJpeDxmbG9hdD4gYSgxMCwgMTApOwogICBDVl9RVUFMSUZJRVIgU3BhcnNlTWF0cml4PGZsb2F0PiYgYWMoYSk7CiAgIGNhbGxfcmVmKGFjKTsKIH0KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3NwYXJzZV9yZWZfMi5jcHAgYi9mYWlsdGVzdC9zcGFyc2VfcmVmXzIuY3BwCmluZGV4IDQ2Yzk0NDAuLmMzNmY2MjkgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L3NwYXJzZV9yZWZfMi5jcHAKKysrIGIvZmFpbHRlc3Qvc3BhcnNlX3JlZl8yLmNwcApAQCAtMiwxMSArMiwxMCBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgY2FsbF9yZWYoUmVmPFNwYXJzZU1hdHJpeDxmbG9hdD4gPiBhKSB7IH0KK3ZvaWQgY2FsbF9yZWYoUmVmPFNwYXJzZU1hdHJpeDxmbG9hdD4gPiBhKSB7fQogCi1pbnQgbWFpbigpCi17Ci0gIFNwYXJzZU1hdHJpeDxmbG9hdD4gQSgxMCwxMCk7CitpbnQgbWFpbigpIHsKKyAgU3BhcnNlTWF0cml4PGZsb2F0PiBBKDEwLCAxMCk7CiAjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKICAgY2FsbF9yZWYoQS5yb3coMykpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3NwYXJzZV9yZWZfMy5jcHAgYi9mYWlsdGVzdC9zcGFyc2VfcmVmXzMuY3BwCmluZGV4IGE5OTQ5YjUuLmU2MmM1NTcgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L3NwYXJzZV9yZWZfMy5jcHAKKysrIGIvZmFpbHRlc3Qvc3BhcnNlX3JlZl8zLmNwcApAQCAtMywxMyArMywxMiBAQAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCiAjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKLXZvaWQgY2FsbF9yZWYoUmVmPFNwYXJzZU1hdHJpeDxmbG9hdD4gPiBhKSB7IH0KK3ZvaWQgY2FsbF9yZWYoUmVmPFNwYXJzZU1hdHJpeDxmbG9hdD4gPiBhKSB7fQogI2Vsc2UKLXZvaWQgY2FsbF9yZWYoY29uc3QgUmVmPGNvbnN0IFNwYXJzZU1hdHJpeDxmbG9hdD4gPiAmYSkgeyB9Cit2b2lkIGNhbGxfcmVmKGNvbnN0IFJlZjxjb25zdCBTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4gJmEpIHt9CiAjZW5kaWYKIAotaW50IG1haW4oKQotewotICBTcGFyc2VNYXRyaXg8ZmxvYXQ+IGEoMTAsMTApOwotICBjYWxsX3JlZihhK2EpOworaW50IG1haW4oKSB7CisgIFNwYXJzZU1hdHJpeDxmbG9hdD4gYSgxMCwgMTApOworICBjYWxsX3JlZihhICsgYSk7CiB9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9zcGFyc2VfcmVmXzQuY3BwIGIvZmFpbHRlc3Qvc3BhcnNlX3JlZl80LmNwcAppbmRleCA1N2JiNmExLi4yZTY3MjQwIDEwMDY0NAotLS0gYS9mYWlsdGVzdC9zcGFyc2VfcmVmXzQuY3BwCisrKyBiL2ZhaWx0ZXN0L3NwYXJzZV9yZWZfNC5jcHAKQEAgLTQsOSArNCw4IEBACiAKIHZvaWQgY2FsbF9yZWYoUmVmPFNwYXJzZU1hdHJpeDxmbG9hdD4gPiBhKSB7fQogCi1pbnQgbWFpbigpCi17Ci0gIFNwYXJzZU1hdHJpeDxmbG9hdD4gQSgxMCwxMCk7CitpbnQgbWFpbigpIHsKKyAgU3BhcnNlTWF0cml4PGZsb2F0PiBBKDEwLCAxMCk7CiAjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKICAgY2FsbF9yZWYoQS50cmFuc3Bvc2UoKSk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3Qvc3BhcnNlX3JlZl81LmNwcCBiL2ZhaWx0ZXN0L3NwYXJzZV9yZWZfNS5jcHAKaW5kZXggNDQ3OGY2Zi4uZjg0MmI1NyAxMDA2NDQKLS0tIGEvZmFpbHRlc3Qvc3BhcnNlX3JlZl81LmNwcAorKysgYi9mYWlsdGVzdC9zcGFyc2VfcmVmXzUuY3BwCkBAIC0yLDExICsyLDEwIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBjYWxsX3JlZihSZWY8U3BhcnNlTWF0cml4PGZsb2F0PiA+IGEpIHsgfQordm9pZCBjYWxsX3JlZihSZWY8U3BhcnNlTWF0cml4PGZsb2F0PiA+IGEpIHt9CiAKLWludCBtYWluKCkKLXsKLSAgU3BhcnNlTWF0cml4PGZsb2F0PiBhKDEwLDEwKTsKK2ludCBtYWluKCkgeworICBTcGFyc2VNYXRyaXg8ZmxvYXQ+IGEoMTAsIDEwKTsKICAgU3BhcnNlTWF0cml4QmFzZTxTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4gJmFjKGEpOwogI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECiAgIGNhbGxfcmVmKGFjKTsKZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3NwYXJzZV9zdG9yYWdlX21pc21hdGNoLmNwcCBiL2ZhaWx0ZXN0L3NwYXJzZV9zdG9yYWdlX21pc21hdGNoLmNwcAppbmRleCA1MTg0MGQ0Li5kZTA1MWFjIDEwMDY0NAotLS0gYS9mYWlsdGVzdC9zcGFyc2Vfc3RvcmFnZV9taXNtYXRjaC5jcHAKKysrIGIvZmFpbHRlc3Qvc3BhcnNlX3N0b3JhZ2VfbWlzbWF0Y2guY3BwCkBAIC0xLDE2ICsxLDE1IEBACiAjaW5jbHVkZSAiLi4vRWlnZW4vU3BhcnNlIgogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi10eXBlZGVmIFNwYXJzZU1hdHJpeDxkb3VibGUsQ29sTWFqb3I+IE1hdDE7Cit0eXBlZGVmIFNwYXJzZU1hdHJpeDxkb3VibGUsIENvbE1ham9yPiBNYXQxOwogI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECi10eXBlZGVmIFNwYXJzZU1hdHJpeDxkb3VibGUsUm93TWFqb3I+IE1hdDI7Cit0eXBlZGVmIFNwYXJzZU1hdHJpeDxkb3VibGUsIFJvd01ham9yPiBNYXQyOwogI2Vsc2UKLXR5cGVkZWYgU3BhcnNlTWF0cml4PGRvdWJsZSxDb2xNYWpvcj4gTWF0MjsKK3R5cGVkZWYgU3BhcnNlTWF0cml4PGRvdWJsZSwgQ29sTWFqb3I+IE1hdDI7CiAjZW5kaWYKIAotaW50IG1haW4oKQotewotICBNYXQxIGEoMTAsMTApOwotICBNYXQyIGIoMTAsMTApOworaW50IG1haW4oKSB7CisgIE1hdDEgYSgxMCwgMTApOworICBNYXQyIGIoMTAsIDEwKTsKICAgYSArPSBiOwogfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3Qvc3dhcF8xLmNwcCBiL2ZhaWx0ZXN0L3N3YXBfMS5jcHAKaW5kZXggMTA2Mzc5Ny4uOGY5NjQ4YSAxMDA2NDQKLS0tIGEvZmFpbHRlc3Qvc3dhcF8xLmNwcAorKysgYi9mYWlsdGVzdC9zd2FwXzEuY3BwCkBAIC0yLDggKzIsNyBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLWludCBtYWluKCkKLXsKK2ludCBtYWluKCkgewogICBWZWN0b3JYZiBhKDEwKSwgYigxMCk7CiAjaWZkZWYgRUlHRU5fU0hPVUxEX0ZBSUxfVE9fQlVJTEQKICAgY29uc3QgRGVuc2VCYXNlPFZlY3RvclhmPiAmYWMoYSk7CmRpZmYgLS1naXQgYS9mYWlsdGVzdC9zd2FwXzIuY3BwIGIvZmFpbHRlc3Qvc3dhcF8yLmNwcAppbmRleCBiMzg2Y2Y0Li41YWQ5MGUzIDEwMDY0NAotLS0gYS9mYWlsdGVzdC9zd2FwXzIuY3BwCisrKyBiL2ZhaWx0ZXN0L3N3YXBfMi5jcHAKQEAgLTIsOCArMiw3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIFZlY3RvclhmIGEoMTApLCBiKDEwKTsKICAgVmVjdG9yWGYgY29uc3QgJmFjKGEpOwogI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECmRpZmYgLS1naXQgYS9mYWlsdGVzdC90ZXJuYXJ5XzEuY3BwIGIvZmFpbHRlc3QvdGVybmFyeV8xLmNwcAppbmRleCBiNDBiY2IwLi40Zjk1N2Y0IDEwMDY0NAotLS0gYS9mYWlsdGVzdC90ZXJuYXJ5XzEuY3BwCisrKyBiL2ZhaWx0ZXN0L3Rlcm5hcnlfMS5jcHAKQEAgLTIsMTIgKzIsMTEgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi1pbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqKQoteworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiopIHsKICAgVmVjdG9yWGYgYSgxMCksIGIoMTApOwogI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECi0gIGIgPSBhcmdjPjEgPyAyKmEgOiAtYTsKKyAgYiA9IGFyZ2MgPiAxID8gMiAqIGEgOiAtYTsKICNlbHNlCi0gIGIgPSBhcmdjPjEgPyAyKmEgOiBWZWN0b3JYZigtYSk7CisgIGIgPSBhcmdjID4gMSA/IDIgKiBhIDogVmVjdG9yWGYoLWEpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC90ZXJuYXJ5XzIuY3BwIGIvZmFpbHRlc3QvdGVybmFyeV8yLmNwcAppbmRleCBhNDZiMTJiLi44MDFkMzlmIDEwMDY0NAotLS0gYS9mYWlsdGVzdC90ZXJuYXJ5XzIuY3BwCisrKyBiL2ZhaWx0ZXN0L3Rlcm5hcnlfMi5jcHAKQEAgLTIsMTIgKzIsMTEgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi1pbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqKQoteworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiopIHsKICAgVmVjdG9yWGYgYSgxMCksIGIoMTApOwogI2lmZGVmIEVJR0VOX1NIT1VMRF9GQUlMX1RPX0JVSUxECi0gIGIgPSBhcmdjPjEgPyAyKmEgOiBhK2E7CisgIGIgPSBhcmdjID4gMSA/IDIgKiBhIDogYSArIGE7CiAjZWxzZQotICBiID0gYXJnYz4xID8gVmVjdG9yWGYoMiphKSA6IFZlY3RvclhmKGErYSk7CisgIGIgPSBhcmdjID4gMSA/IFZlY3RvclhmKDIgKiBhKSA6IFZlY3RvclhmKGEgKyBhKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvdHJhbnNwb3NlX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcCBiL2ZhaWx0ZXN0L3RyYW5zcG9zZV9ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwci5jcHAKaW5kZXggNDIyM2U3Zi4uNzlkMzlhYSAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvdHJhbnNwb3NlX25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcAorKysgYi9mYWlsdGVzdC90cmFuc3Bvc2Vfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwCkBAIC04LDggKzgsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLXZvaWQgZm9vKENWX1FVQUxJRklFUiBNYXRyaXgzZCAmbSl7Ci0gICAgVHJhbnNwb3NlPE1hdHJpeDNkPiB0KG0pOwotfQordm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKSB7IFRyYW5zcG9zZTxNYXRyaXgzZD4gdChtKTsgfQogCiBpbnQgbWFpbigpIHt9CmRpZmYgLS1naXQgYS9mYWlsdGVzdC90cmFuc3Bvc2Vfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdC5jcHAgYi9mYWlsdGVzdC90cmFuc3Bvc2Vfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdC5jcHAKaW5kZXggZDBiN2QwZC4uMjk1MDBkYSAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvdHJhbnNwb3NlX29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwCisrKyBiL2ZhaWx0ZXN0L3RyYW5zcG9zZV9vbl9jb25zdF90eXBlX2FjdHVhbGx5X2NvbnN0LmNwcApAQCAtOCw5ICs4LDkgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi12b2lkIGZvbygpewotICAgIE1hdHJpeFhmIG07Ci0gICAgVHJhbnNwb3NlPENWX1FVQUxJRklFUiBNYXRyaXhYZj4obSkuY29lZmZSZWYoMCwgMCkgPSAxLjBmOwordm9pZCBmb28oKSB7CisgIE1hdHJpeFhmIG07CisgIFRyYW5zcG9zZTxDVl9RVUFMSUZJRVIgTWF0cml4WGY+KG0pLmNvZWZmUmVmKDAsIDApID0gMS4wZjsKIH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvZmFpbHRlc3QvdHJpYW5ndWxhcnZpZXdfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwIGIvZmFpbHRlc3QvdHJpYW5ndWxhcnZpZXdfbm9uY29uc3RfY3Rvcl9vbl9jb25zdF94cHIuY3BwCmluZGV4IDgwNzQ0N2UuLjgxMWVjM2EgMTAwNjQ0Ci0tLSBhL2ZhaWx0ZXN0L3RyaWFuZ3VsYXJ2aWV3X25vbmNvbnN0X2N0b3Jfb25fY29uc3RfeHByLmNwcAorKysgYi9mYWlsdGVzdC90cmlhbmd1bGFydmlld19ub25jb25zdF9jdG9yX29uX2NvbnN0X3hwci5jcHAKQEAgLTgsOCArOCw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBmb28oQ1ZfUVVBTElGSUVSIE1hdHJpeDNkICZtKXsKLSAgVHJpYW5ndWxhclZpZXc8TWF0cml4M2QsVXBwZXI+IHQobSk7Ci19Cit2b2lkIGZvbyhDVl9RVUFMSUZJRVIgTWF0cml4M2QgJm0pIHsgVHJpYW5ndWxhclZpZXc8TWF0cml4M2QsIFVwcGVyPiB0KG0pOyB9CiAKIGludCBtYWluKCkge30KZGlmZiAtLWdpdCBhL2ZhaWx0ZXN0L3RyaWFuZ3VsYXJ2aWV3X29uX2NvbnN0X3R5cGVfYWN0dWFsbHlfY29uc3QuY3BwIGIvZmFpbHRlc3QvdHJpYW5ndWxhcnZpZXdfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdC5jcHAKaW5kZXggMGEzODFhNi4uYjk1YjM3ZCAxMDA2NDQKLS0tIGEvZmFpbHRlc3QvdHJpYW5ndWxhcnZpZXdfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdC5jcHAKKysrIGIvZmFpbHRlc3QvdHJpYW5ndWxhcnZpZXdfb25fY29uc3RfdHlwZV9hY3R1YWxseV9jb25zdC5jcHAKQEAgLTgsOSArOCw5IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotdm9pZCBmb28oKXsKLSAgICBNYXRyaXhYZiBtOwotICAgIFRyaWFuZ3VsYXJWaWV3PENWX1FVQUxJRklFUiBNYXRyaXhYZixVcHBlcj4obSkuY29lZmZSZWYoMCwgMCkgPSAxLjBmOwordm9pZCBmb28oKSB7CisgIE1hdHJpeFhmIG07CisgIFRyaWFuZ3VsYXJWaWV3PENWX1FVQUxJRklFUiBNYXRyaXhYZiwgVXBwZXI+KG0pLmNvZWZmUmVmKDAsIDApID0gMS4wZjsKIH0KIAogaW50IG1haW4oKSB7fQpkaWZmIC0tZ2l0IGEvbGFwYWNrL2NvbXBsZXhfZG91YmxlLmNwcCBiL2xhcGFjay9jb21wbGV4X2RvdWJsZS5jcHAKaW5kZXggNDkyZjc0My4uMTA1Njc2NyAxMDA2NDQKLS0tIGEvbGFwYWNrL2NvbXBsZXhfZG91YmxlLmNwcAorKysgYi9sYXBhY2svY29tcGxleF9kb3VibGUuY3BwCkBAIC03LDExICs3LDExIEBACiAvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKIC8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgogCi0jZGVmaW5lIFNDQUxBUiAgICAgICAgc3RkOjpjb21wbGV4PGRvdWJsZT4KKyNkZWZpbmUgU0NBTEFSIHN0ZDo6Y29tcGxleDxkb3VibGU+CiAjZGVmaW5lIFNDQUxBUl9TVUZGSVggegogI2RlZmluZSBTQ0FMQVJfU1VGRklYX1VQICJaIgogI2RlZmluZSBSRUFMX1NDQUxBUl9TVUZGSVggZAotI2RlZmluZSBJU0NPTVBMRVggICAgIDEKKyNkZWZpbmUgSVNDT01QTEVYIDEKIAogI2luY2x1ZGUgImNob2xlc2t5LmluYyIKICNpbmNsdWRlICJsdS5pbmMiCmRpZmYgLS1naXQgYS9sYXBhY2svY29tcGxleF9zaW5nbGUuY3BwIGIvbGFwYWNrL2NvbXBsZXhfc2luZ2xlLmNwcAppbmRleCBjZGY5ODllLi40MGFiOTEzIDEwMDY0NAotLS0gYS9sYXBhY2svY29tcGxleF9zaW5nbGUuY3BwCisrKyBiL2xhcGFjay9jb21wbGV4X3NpbmdsZS5jcHAKQEAgLTcsMTEgKzcsMTEgQEAKIC8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAogLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCiAKLSNkZWZpbmUgU0NBTEFSICAgICAgICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+CisjZGVmaW5lIFNDQUxBUiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+CiAjZGVmaW5lIFNDQUxBUl9TVUZGSVggYwogI2RlZmluZSBTQ0FMQVJfU1VGRklYX1VQICJDIgogI2RlZmluZSBSRUFMX1NDQUxBUl9TVUZGSVggcwotI2RlZmluZSBJU0NPTVBMRVggICAgIDEKKyNkZWZpbmUgSVNDT01QTEVYIDEKIAogI2luY2x1ZGUgImNob2xlc2t5LmluYyIKICNpbmNsdWRlICJsdS5pbmMiCmRpZmYgLS1naXQgYS9sYXBhY2svZG91YmxlLmNwcCBiL2xhcGFjay9kb3VibGUuY3BwCmluZGV4IGFmYWJjZTMuLjllNTdlOTAgMTAwNjQ0Ci0tLSBhL2xhcGFjay9kb3VibGUuY3BwCisrKyBiL2xhcGFjay9kb3VibGUuY3BwCkBAIC03LDEwICs3LDEwIEBACiAvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKIC8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgogCi0jZGVmaW5lIFNDQUxBUiAgICAgICAgZG91YmxlCisjZGVmaW5lIFNDQUxBUiBkb3VibGUKICNkZWZpbmUgU0NBTEFSX1NVRkZJWCBkCiAjZGVmaW5lIFNDQUxBUl9TVUZGSVhfVVAgIkQiCi0jZGVmaW5lIElTQ09NUExFWCAgICAgMAorI2RlZmluZSBJU0NPTVBMRVggMAogCiAjaW5jbHVkZSAiY2hvbGVza3kuaW5jIgogI2luY2x1ZGUgImx1LmluYyIKZGlmZiAtLWdpdCBhL2xhcGFjay9sYXBhY2suaCBiL2xhcGFjay9sYXBhY2suaAppbmRleCAxMjFkMjMzLi45YmIyMjJiIDEwMDY0NAotLS0gYS9sYXBhY2svbGFwYWNrLmgKKysrIGIvbGFwYWNrL2xhcGFjay5oCkBAIC00LDE0NCArNCwxMjggQEAKICNpbmNsdWRlICIuLi9ibGFzL2JsYXMuaCIKIAogI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17CitleHRlcm4gIkMiIHsKICNlbmRpZgogCi1pbnQgQkxBU0ZVTkMoY3N5bXYpIChjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgZmxvYXQgICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICAqLCBmbG9hdCAgKiwgY29uc3QgaW50ICopOwotaW50IEJMQVNGVU5DKHpzeW12KSAoY29uc3QgY2hhciAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgZG91YmxlICosIGNvbnN0IGludCAqKTsKLWludCBCTEFTRlVOQyh4c3ltdikgKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosIGNvbnN0IGRvdWJsZSAqLCBjb25zdCBpbnQgKiwgY29uc3QgZG91YmxlICosIGRvdWJsZSAqLCBjb25zdCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3N5bXYpKGNvbnN0IGNoYXIgKiwgY29uc3QgaW50ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGZsb2F0ICosIGNvbnN0IGludCAqLCBjb25zdCBmbG9hdCAqLCBjb25zdCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKiwgZmxvYXQgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHpzeW12KShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOworaW50IEJMQVNGVU5DKHhzeW12KShjb25zdCBjaGFyICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICosIGNvbnN0IGludCAqLCBjb25zdCBkb3VibGUgKiwgY29uc3QgaW50ICosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqLCBkb3VibGUgKiwgY29uc3QgaW50ICopOwogCitpbnQgQkxBU0ZVTkMoY3NwbXYpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenNwbXYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4c3BtdikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoY3NwbXYpIChjaGFyICosIGludCAqLCBmbG9hdCAgKiwgZmxvYXQgKiwKLSAgICAgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpzcG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKLSAgICAgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhzcG12KSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwKLSAgICAgICAgIGRvdWJsZSAgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNzeXIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoenN5cikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4c3lyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoY3N5cikgKGNoYXIgKiwgaW50ICosIGZsb2F0ICAgKiwgZmxvYXQgICosIGludCAqLAotICAgICAgICBmbG9hdCAgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpzeXIpIChjaGFyICosIGludCAqLCBkb3VibGUgICosIGRvdWJsZSAqLCBpbnQgKiwKLSAgICAgICAgZG91YmxlICosIGludCAqKTsKLWludCBCTEFTRlVOQyh4c3lyKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCi0gICAgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3NwcikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICopOworaW50IEJMQVNGVU5DKHpzcHIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyh4c3ByKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKik7CiAKLWludCBCTEFTRlVOQyhjc3ByKSAoY2hhciAqLCBpbnQgKiwgZmxvYXQgICAqLCBmbG9hdCAgKiwgaW50ICosCi0gICAgICAgIGZsb2F0ICAqKTsKLWludCBCTEFTRlVOQyh6c3ByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCi0gICAgICAgIGRvdWJsZSAqKTsKLWludCBCTEFTRlVOQyh4c3ByKSAoY2hhciAqLCBpbnQgKiwgZG91YmxlICAqLCBkb3VibGUgKiwgaW50ICosCi0gICAgICAgIGRvdWJsZSAqKTsKK2ludCBCTEFTRlVOQyhzZ2VtdCkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbXQpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW10KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtdCkoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzZ2VtdCkoY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBmbG9hdCAgKiwgaW50ICosCi0gICAgICAgIGZsb2F0ICAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoZGdlbXQpKGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLAotICAgICAgICBkb3VibGUgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNnZW10KShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGZsb2F0ICAqLCBpbnQgKiwKLSAgICAgICAgZmxvYXQgICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6Z2VtdCkoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosCi0gICAgICAgIGRvdWJsZSAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc2dlbWEpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZW1hKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICopOworaW50IEJMQVNGVU5DKGNnZW1hKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VtYSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlICosCisgICAgICAgICAgICAgICAgICAgIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNnZW1hKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwKLSAgICAgICAgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkZ2VtYSkoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosCi0gICAgICAgIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY2dlbWEpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLAotICAgICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHpnZW1hKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKLSAgICAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzZ2VtcykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoZGdlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSAqLAorICAgICAgICAgICAgICAgICAgICBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICosIGludCAqLCBmbG9hdCAqLCBmbG9hdCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHpnZW1zKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGludCAqLCBkb3VibGUgKiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc2dlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICAqLAotICAgICAgICBmbG9hdCAgKiwgaW50ICosIGZsb2F0ICosIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGRnZW1zKShjaGFyICosIGNoYXIgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwKLSAgICAgICAgZG91YmxlICosIGludCAqLCBkb3VibGUqLCBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGludCAqKTsKLWludCBCTEFTRlVOQyhjZ2VtcykoY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosCi0gICAgICAgIGZsb2F0ICAqLCBpbnQgKiwgZmxvYXQgKiwgZmxvYXQgICosIGludCAqLCBmbG9hdCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoemdlbXMpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLAotICAgICAgICBkb3VibGUgKiwgaW50ICosIGRvdWJsZSosIGRvdWJsZSAqLCBpbnQgKiwgZG91YmxlKiwgaW50ICopOwotCi1pbnQgQkxBU0ZVTkMoc2dldGYyKShpbnQgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzZ2V0ZjIpKGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoZGdldGYyKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyhxZ2V0ZjIpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNnZXRmMikoaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dldGYyKShpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHpnZXRmMikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoeGdldGYyKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNnZXRyZikoaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc2dldHJmKShpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKGRnZXRyZikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMocWdldHJmKShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjZ2V0cmYpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXRyZikoaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyh6Z2V0cmYpKGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHhnZXRyZikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzbGFzd3ApKGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzbGFzd3ApKGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKGRsYXN3cCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHFsYXN3cCkoaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNsYXN3cCkoaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNsYXN3cCkoaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoemxhc3dwKShpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoeGxhc3dwKShpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzZ2V0cnMpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzZ2V0cnMpKGNoYXIgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoZGdldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMocWdldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY2dldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2dldHJzKShjaGFyICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHpnZXRycykoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHhnZXRycykoY2hhciAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc2dlc3YpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhkZ2VzdikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHFnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSosIGludCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY2dlc3YpKGludCAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKLWludCBCTEFTRlVOQyh6Z2VzdikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKHhnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc2dlc3YpKGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGRnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHFnZXN2KShpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNnZXN2KShpbnQgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh6Z2VzdikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyh4Z2VzdikoaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNwb3RmMikoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3BvdGYyKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKGRwb3RmMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMocXBvdGYyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjcG90ZjIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNwb3RmMikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyh6cG90ZjIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHhwb3RmMikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzcG90cmYpKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKHNwb3RyZikoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyhkcG90cmYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHFwb3RyZikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7Ci1pbnQgQkxBU0ZVTkMoY3BvdHJmKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjcG90cmYpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoenBvdHJmKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyh4cG90cmYpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc2xhdXUyKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzbGF1dTIpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoZGxhdXUyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyhxbGF1dTIpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNsYXV1MikoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY2xhdXUyKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHpsYXV1MikoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoeGxhdXUyKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHNsYXV1bSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc2xhdXVtKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKGRsYXV1bSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMocWxhdXVtKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjbGF1dW0pKGNoYXIgKiwgaW50ICosIGZsb2F0ICAqLCBpbnQgKiwgaW50ICopOworaW50IEJMQVNGVU5DKGNsYXV1bSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyh6bGF1dW0pKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHhsYXV1bSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiAKLWludCBCTEFTRlVOQyhzdHJ0aTIpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoc3RydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoZHRydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHF0cnRpMikoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKLWludCBCTEFTRlVOQyhjdHJ0aTIpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3RydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoenRydGkyKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHh0cnRpMikoY2hhciAqLCBjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIAotaW50IEJMQVNGVU5DKHN0cnRyaSkoY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzdHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyhkdHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMocXRydHJpKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGN0cnRyaSkoY2hhciAqLCBjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhjdHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZmxvYXQgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyh6dHJ0cmkpKGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoeHRydHJpKShjaGFyICosIGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwogCi1pbnQgQkxBU0ZVTkMoc3BvdHJpKShjaGFyICosIGludCAqLCBmbG9hdCAgKiwgaW50ICosIGludCAqKTsKK2ludCBCTEFTRlVOQyhzcG90cmkpKGNoYXIgKiwgaW50ICosIGZsb2F0ICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoZHBvdHJpKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIGludCBCTEFTRlVOQyhxcG90cmkpKGNoYXIgKiwgaW50ICosIGRvdWJsZSAqLCBpbnQgKiwgaW50ICopOwotaW50IEJMQVNGVU5DKGNwb3RyaSkoY2hhciAqLCBpbnQgKiwgZmxvYXQgICosIGludCAqLCBpbnQgKik7CitpbnQgQkxBU0ZVTkMoY3BvdHJpKShjaGFyICosIGludCAqLCBmbG9hdCAqLCBpbnQgKiwgaW50ICopOwogaW50IEJMQVNGVU5DKHpwb3RyaSkoY2hhciAqLCBpbnQgKiwgZG91YmxlICosIGludCAqLCBpbnQgKik7CiBpbnQgQkxBU0ZVTkMoeHBvdHJpKShjaGFyICosIGludCAqLCBkb3VibGUgKiwgaW50ICosIGludCAqKTsKIApkaWZmIC0tZ2l0IGEvbGFwYWNrL2xhcGFja19jb21tb24uaCBiL2xhcGFjay9sYXBhY2tfY29tbW9uLmgKaW5kZXggNWNhNmRkNy4uMzdkMWYxNCAxMDA2NDQKLS0tIGEvbGFwYWNrL2xhcGFja19jb21tb24uaAorKysgYi9sYXBhY2svbGFwYWNrX2NvbW1vbi5oCkBAIC0xMywxMSArMTMsMTQgQEAKICNpbmNsdWRlICIuLi9ibGFzL2NvbW1vbi5oIgogI2luY2x1ZGUgImxhcGFjay5oIgogCi0jZGVmaW5lIEVJR0VOX0xBUEFDS19GVU5DKEZVTkMsQVJHTElTVCkgICAgICAgICAgICAgICBcCi0gIGV4dGVybiAiQyIgeyBpbnQgRUlHRU5fQkxBU19GVU5DKEZVTkMpIEFSR0xJU1Q7IH0gICBcCi0gIGludCBFSUdFTl9CTEFTX0ZVTkMoRlVOQykgQVJHTElTVAorI2RlZmluZSBFSUdFTl9MQVBBQ0tfRlVOQyhGVU5DLCBBUkdMSVNUKSBcCisgIGV4dGVybiAiQyIgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IEVJR0VOX0JMQVNfRlVOQyhGVU5DKSBBUkdMSVNUOyAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBFSUdFTl9CTEFTX0ZVTkMoRlVOQykgICAgICAgICAgICAgIFwKKyAgQVJHTElTVAogCi10eXBlZGVmIEVpZ2VuOjpNYXA8RWlnZW46OlRyYW5zcG9zaXRpb25zPEVpZ2VuOjpEeW5hbWljLEVpZ2VuOjpEeW5hbWljLGludD4gPiBQaXZvdHNUeXBlOwordHlwZWRlZiBFaWdlbjo6TWFwPEVpZ2VuOjpUcmFuc3Bvc2l0aW9uczxFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWMsIGludD4gPiBQaXZvdHNUeXBlOwogCiAjaWYgSVNDT01QTEVYCiAjZGVmaW5lIEVJR0VOX0xBUEFDS19BUkdfSUZfQ09NUExFWChYKSBYLApAQCAtMjUsNSArMjgsNCBAQAogI2RlZmluZSBFSUdFTl9MQVBBQ0tfQVJHX0lGX0NPTVBMRVgoWCkKICNlbmRpZgogCi0KLSNlbmRpZiAvLyBFSUdFTl9MQVBBQ0tfQ09NTU9OX0gKKyNlbmRpZiAgLy8gRUlHRU5fTEFQQUNLX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9sYXBhY2svc2luZ2xlLmNwcCBiL2xhcGFjay9zaW5nbGUuY3BwCmluZGV4IDI5OTQ0MzYuLjEwYzBhMmIgMTAwNjQ0Ci0tLSBhL2xhcGFjay9zaW5nbGUuY3BwCisrKyBiL2xhcGFjay9zaW5nbGUuY3BwCkBAIC03LDEwICs3LDEwIEBACiAvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKIC8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgogCi0jZGVmaW5lIFNDQUxBUiAgICAgICAgZmxvYXQKKyNkZWZpbmUgU0NBTEFSIGZsb2F0CiAjZGVmaW5lIFNDQUxBUl9TVUZGSVggcwogI2RlZmluZSBTQ0FMQVJfU1VGRklYX1VQICJTIgotI2RlZmluZSBJU0NPTVBMRVggICAgIDAKKyNkZWZpbmUgSVNDT01QTEVYIDAKIAogI2luY2x1ZGUgImNob2xlc2t5LmluYyIKICNpbmNsdWRlICJsdS5pbmMiCmRpZmYgLS1naXQgYS9zY3JpcHRzL2VpZ2VuX2dlbl9jcmVkaXRzLmNwcCBiL3NjcmlwdHMvZWlnZW5fZ2VuX2NyZWRpdHMuY3BwCmluZGV4IGYyZTgxNjMuLmJmOGU0ZGYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZWlnZW5fZ2VuX2NyZWRpdHMuY3BwCisrKyBiL3NjcmlwdHMvZWlnZW5fZ2VuX2NyZWRpdHMuY3BwCkBAIC0xMCwxOSArMTAsMTYgQEAKIAogLy8gdGhpcyBmdW5jdGlvbiB0YWtlcyBhIGxpbmUgdGhhdCBtYXkgY29udGFpbiBhIG5hbWUgYW5kL29yIGVtYWlsIGFkZHJlc3MsCiAvLyBhbmQgcmV0dXJucyBqdXN0IHRoZSBuYW1lLCB3aGlsZSBmaXhpbmcgdGhlICJiYWQgY2FzZXMiLgotc3RkOjpzdHJpbmcgY29udHJpYnV0b3JfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbGluZSkKLXsKK3N0ZDo6c3RyaW5nIGNvbnRyaWJ1dG9yX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUpIHsKICAgc3RyaW5nIHJlc3VsdDsKIAogICAvLyBsZXQncyBmaXJzdCB0YWtlIGNhcmUgb2YgdGhlIGNhc2Ugb2YgaXNvbGF0ZWQgZW1haWwgYWRkcmVzc2VzLCBsaWtlCiAgIC8vICJ1c2VyQGxvY2FsaG9zdC5sb2NhbGRvbWFpbiIgZW50cmllcwotICBpZihsaW5lLmZpbmQoIm1hcmtiQGxvY2FsaG9zdC5sb2NhbGRvbWFpbiIpICE9IHN0cmluZzo6bnBvcykKLSAgeworICBpZiAobGluZS5maW5kKCJtYXJrYkBsb2NhbGhvc3QubG9jYWxkb21haW4iKSAhPSBzdHJpbmc6Om5wb3MpIHsKICAgICByZXR1cm4gIk1hcmsgQm9yZ2VyZGluZyI7CiAgIH0KIAotICBpZihsaW5lLmZpbmQoImtheWhtYW5AY29udGFjdC5pbnRyYS5jZWEuZnIiKSAhPSBzdHJpbmc6Om5wb3MpCi0gIHsKKyAgaWYgKGxpbmUuZmluZCgia2F5aG1hbkBjb250YWN0LmludHJhLmNlYS5mciIpICE9IHN0cmluZzo6bnBvcykgewogICAgIHJldHVybiAiR3VpbGxhdW1lIFNhdXBpbiI7CiAgIH0KIApAQCAtMzEsMjYgKzI4LDIyIEBACiAgIC8vICAgQmxhIGJsaSBCbHVycAogICAvLyBvcjoKICAgLy8gICBCbGEgYmxpIEJsdXJwIDxiYmx1cnBAZW1haWwuY29tPgotICAKKwogICBzaXplX3QgcG9zaXRpb25fb2ZfZW1haWxfYWRkcmVzcyA9IGxpbmUuZmluZF9maXJzdF9vZignPCcpOwotICBpZihwb3NpdGlvbl9vZl9lbWFpbF9hZGRyZXNzICE9IHN0cmluZzo6bnBvcykKLSAgeworICBpZiAocG9zaXRpb25fb2ZfZW1haWxfYWRkcmVzcyAhPSBzdHJpbmc6Om5wb3MpIHsKICAgICAvLyB0aGVyZSBpcyBhbiBlLW1haWwgYWRkcmVzcyBpbiA8Li4uPi4KLSAgICAKKwogICAgIC8vIEhhdWtlIG9uY2UgY29tbWl0dGVkIGFzICJKb2huIFNtaXRoIiwgZml4IHRoYXQuCi0gICAgaWYobGluZS5maW5kKCJoYXVrZS5oZWliZWwiKSAhPSBzdHJpbmc6Om5wb3MpCisgICAgaWYgKGxpbmUuZmluZCgiaGF1a2UuaGVpYmVsIikgIT0gc3RyaW5nOjpucG9zKQogICAgICAgcmVzdWx0ID0gIkhhdWtlIEhlaWJlbCI7Ci0gICAgZWxzZQotICAgIHsKKyAgICBlbHNlIHsKICAgICAgIC8vIGp1c3QgcmVtb3ZlIHRoZSBlLW1haWwgYWRkcmVzcwogICAgICAgcmVzdWx0ID0gbGluZS5zdWJzdHIoMCwgcG9zaXRpb25fb2ZfZW1haWxfYWRkcmVzcyk7CiAgICAgfQotICB9Ci0gIGVsc2UKLSAgeworICB9IGVsc2UgewogICAgIC8vIHRoZXJlIGlzIG5vIGUtbWFpbCBhZGRyZXNzIGluIDwuLi4+LgotICAgIAotICAgIGlmKGxpbmUuZmluZCgiY29udmVydC1yZXBvIikgIT0gc3RyaW5nOjpucG9zKQorCisgICAgaWYgKGxpbmUuZmluZCgiY29udmVydC1yZXBvIikgIT0gc3RyaW5nOjpucG9zKQogICAgICAgcmVzdWx0ID0gIiI7CiAgICAgZWxzZQogICAgICAgcmVzdWx0ID0gbGluZTsKQEAgLTU4LDQ0ICs1MSw0MSBAQAogCiAgIC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMKICAgc2l6ZV90IGxlbmd0aCA9IHJlc3VsdC5sZW5ndGgoKTsKLSAgd2hpbGUobGVuZ3RoID49IDEgJiYgcmVzdWx0W2xlbmd0aC0xXSA9PSAnICcpIHJlc3VsdC5lcmFzZSgtLWxlbmd0aCk7CisgIHdoaWxlIChsZW5ndGggPj0gMSAmJiByZXN1bHRbbGVuZ3RoIC0gMV0gPT0gJyAnKSByZXN1bHQuZXJhc2UoLS1sZW5ndGgpOwogCiAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8vIHBhcnNlcyBoZyBjaHVybiBvdXRwdXQgdG8gZ2VuZXJhdGUgYSBjb250cmlidXRvcnMgbWFwLgotbWFwPHN0cmluZyxpbnQ+IGNvbnRyaWJ1dG9yc19tYXBfZnJvbV9jaHVybl9vdXRwdXQoY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIG1hcDxzdHJpbmcsaW50PiBjb250cmlidXRvcnNfbWFwOworbWFwPHN0cmluZywgaW50PiBjb250cmlidXRvcnNfbWFwX2Zyb21fY2h1cm5fb3V0cHV0KGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7CisgIG1hcDxzdHJpbmcsIGludD4gY29udHJpYnV0b3JzX21hcDsKIAogICBzdHJpbmcgbGluZTsKICAgaWZzdHJlYW0gY2h1cm5fb3V0OwogICBjaHVybl9vdXQub3BlbihmaWxlbmFtZSwgaW9zOjppbik7Ci0gIHdoaWxlKCFnZXRsaW5lKGNodXJuX291dCxsaW5lKS5lb2YoKSkKLSAgeworICB3aGlsZSAoIWdldGxpbmUoY2h1cm5fb3V0LCBsaW5lKS5lb2YoKSkgewogICAgIC8vIHJlbW92ZSB0aGUgaGlzdG9ncmFtcyAiKioqKioqIiB0aGF0IGhnIGNodXJuIG1heSBkcmF3IGF0IHRoZSBlbmQgb2Ygc29tZSBsaW5lcwogICAgIHNpemVfdCBmaXJzdF9zdGFyID0gbGluZS5maW5kX2ZpcnN0X29mKCcqJyk7Ci0gICAgaWYoZmlyc3Rfc3RhciAhPSBzdHJpbmc6Om5wb3MpIGxpbmUuZXJhc2UoZmlyc3Rfc3Rhcik7Ci0gICAgCisgICAgaWYgKGZpcnN0X3N0YXIgIT0gc3RyaW5nOjpucG9zKSBsaW5lLmVyYXNlKGZpcnN0X3N0YXIpOworCiAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcwogICAgIHNpemVfdCBsZW5ndGggPSBsaW5lLmxlbmd0aCgpOwotICAgIHdoaWxlKGxlbmd0aCA+PSAxICYmIGxpbmVbbGVuZ3RoLTFdID09ICcgJykgbGluZS5lcmFzZSgtLWxlbmd0aCk7CisgICAgd2hpbGUgKGxlbmd0aCA+PSAxICYmIGxpbmVbbGVuZ3RoIC0gMV0gPT0gJyAnKSBsaW5lLmVyYXNlKC0tbGVuZ3RoKTsKIAogICAgIC8vIG5vdyB0aGUgbGFzdCBzcGFjZSBpbmRpY2F0ZXMgd2hlcmUgdGhlIG51bWJlciBzdGFydHMKICAgICBzaXplX3QgbGFzdF9zcGFjZSA9IGxpbmUuZmluZF9sYXN0X29mKCcgJyk7Ci0gICAgCisKICAgICAvLyBnZXQgdGhlIG51bWJlciAob2YgY2hhbmdlc2V0cyBvciBvZiBtb2RpZmllZCBsaW5lcyBmb3IgZWFjaCBjb250cmlidXRvcikKICAgICBpbnQgbnVtYmVyOwotICAgIGlzdHJpbmdzdHJlYW0obGluZS5zdWJzdHIobGFzdF9zcGFjZSsxKSkgPj4gbnVtYmVyOworICAgIGlzdHJpbmdzdHJlYW0obGluZS5zdWJzdHIobGFzdF9zcGFjZSArIDEpKSA+PiBudW1iZXI7CiAKICAgICAvLyBnZXQgdGhlIG5hbWUgb2YgdGhlIGNvbnRyaWJ1dG9yCi0gICAgbGluZS5lcmFzZShsYXN0X3NwYWNlKTsgICAgCisgICAgbGluZS5lcmFzZShsYXN0X3NwYWNlKTsKICAgICBzdHJpbmcgbmFtZSA9IGNvbnRyaWJ1dG9yX25hbWUobGluZSk7Ci0gICAgCi0gICAgbWFwPHN0cmluZyxpbnQ+OjppdGVyYXRvciBpdCA9IGNvbnRyaWJ1dG9yc19tYXAuZmluZChuYW1lKTsKKworICAgIG1hcDxzdHJpbmcsIGludD46Oml0ZXJhdG9yIGl0ID0gY29udHJpYnV0b3JzX21hcC5maW5kKG5hbWUpOwogICAgIC8vIGlmIG5ldyBjb250cmlidXRvciwgaW5zZXJ0Ci0gICAgaWYoaXQgPT0gY29udHJpYnV0b3JzX21hcC5lbmQoKSkKLSAgICAgIGNvbnRyaWJ1dG9yc19tYXAuaW5zZXJ0KHBhaXI8c3RyaW5nLGludD4obmFtZSwgbnVtYmVyKSk7CisgICAgaWYgKGl0ID09IGNvbnRyaWJ1dG9yc19tYXAuZW5kKCkpIGNvbnRyaWJ1dG9yc19tYXAuaW5zZXJ0KHBhaXI8c3RyaW5nLCBpbnQ+KG5hbWUsIG51bWJlcikpOwogICAgIC8vIGlmIGR1cGxpY2F0ZSwganVzdCBhZGQgdGhlIG51bWJlcgogICAgIGVsc2UKICAgICAgIGl0LT5zZWNvbmQgKz0gbnVtYmVyOwpAQCAtMTA3LDc1ICs5Nyw2NCBAQAogCiAvLyBmaW5kIHRoZSBsYXN0IG5hbWUsIGkuZS4gdGhlIGxhc3Qgd29yZC4KIC8vIGZvciAidmFuIGRlbiBTY2hibGluZyIgdHlwZXMgb2YgbGFzdCBuYW1lcywgdGhhdCdzIG5vdCBhIHByb2JsZW0sIHRoYXQncyBhY3R1YWxseSB3aGF0IHdlIHdhbnQuCi1zdHJpbmcgbGFzdG5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKQoteworc3RyaW5nIGxhc3RuYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgewogICBzaXplX3QgbGFzdF9zcGFjZSA9IG5hbWUuZmluZF9sYXN0X29mKCcgJyk7Ci0gIGlmKGxhc3Rfc3BhY2UgPj0gbmFtZS5sZW5ndGgoKS0xKSByZXR1cm4gbmFtZTsKLSAgZWxzZSByZXR1cm4gbmFtZS5zdWJzdHIobGFzdF9zcGFjZSsxKTsKKyAgaWYgKGxhc3Rfc3BhY2UgPj0gbmFtZS5sZW5ndGgoKSAtIDEpCisgICAgcmV0dXJuIG5hbWU7CisgIGVsc2UKKyAgICByZXR1cm4gbmFtZS5zdWJzdHIobGFzdF9zcGFjZSArIDEpOwogfQogCi1zdHJ1Y3QgY29udHJpYnV0b3IKLXsKK3N0cnVjdCBjb250cmlidXRvciB7CiAgIHN0cmluZyBuYW1lOwogICBpbnQgY2hhbmdlZGxpbmVzOwogICBpbnQgY2hhbmdlc2V0czsKICAgc3RyaW5nIHVybDsKICAgc3RyaW5nIG1pc2M7Ci0gIAorCiAgIGNvbnRyaWJ1dG9yKCkgOiBjaGFuZ2VkbGluZXMoMCksIGNoYW5nZXNldHMoMCkge30KLSAgCi0gIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgY29udHJpYnV0b3ImIG90aGVyKQotICB7Ci0gICAgcmV0dXJuIGxhc3RuYW1lKG5hbWUpLmNvbXBhcmUobGFzdG5hbWUob3RoZXIubmFtZSkpIDwgMDsKLSAgfQorCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGNvbnRyaWJ1dG9yJiBvdGhlcikgeyByZXR1cm4gbGFzdG5hbWUobmFtZSkuY29tcGFyZShsYXN0bmFtZShvdGhlci5uYW1lKSkgPCAwOyB9CiB9OwogCi12b2lkIGFkZF9vbmxpbmVfaW5mb19pbnRvX2NvbnRyaWJ1dG9yc19saXN0KGxpc3Q8Y29udHJpYnV0b3I+JiBjb250cmlidXRvcnNfbGlzdCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Cit2b2lkIGFkZF9vbmxpbmVfaW5mb19pbnRvX2NvbnRyaWJ1dG9yc19saXN0KGxpc3Q8Y29udHJpYnV0b3I+JiBjb250cmlidXRvcnNfbGlzdCwgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKICAgc3RyaW5nIGxpbmU7CiAgIGlmc3RyZWFtIG9ubGluZV9pbmZvOwogICBvbmxpbmVfaW5mby5vcGVuKGZpbGVuYW1lLCBpb3M6OmluKTsKLSAgd2hpbGUoIWdldGxpbmUob25saW5lX2luZm8sbGluZSkuZW9mKCkpCi0gIHsKKyAgd2hpbGUgKCFnZXRsaW5lKG9ubGluZV9pbmZvLCBsaW5lKS5lb2YoKSkgewogICAgIHN0cmluZyBoZ25hbWUsIHJlYWxuYW1lLCB1cmwsIG1pc2M7Ci0gICAgCisKICAgICBzaXplX3QgbGFzdF9iYXIgPSBsaW5lLmZpbmRfbGFzdF9vZignfCcpOwotICAgIGlmKGxhc3RfYmFyID09IHN0cmluZzo6bnBvcykgY29udGludWU7Ci0gICAgaWYobGFzdF9iYXIgPCBsaW5lLmxlbmd0aCgpKQotICAgICAgbWlzYyA9IGxpbmUuc3Vic3RyKGxhc3RfYmFyKzEpOwotICAgIGxpbmUuZXJhc2UobGFzdF9iYXIpOwotICAgIAotICAgIGxhc3RfYmFyID0gbGluZS5maW5kX2xhc3Rfb2YoJ3wnKTsKLSAgICBpZihsYXN0X2JhciA9PSBzdHJpbmc6Om5wb3MpIGNvbnRpbnVlOwotICAgIGlmKGxhc3RfYmFyIDwgbGluZS5sZW5ndGgoKSkKLSAgICAgIHVybCA9IGxpbmUuc3Vic3RyKGxhc3RfYmFyKzEpOworICAgIGlmIChsYXN0X2JhciA9PSBzdHJpbmc6Om5wb3MpIGNvbnRpbnVlOworICAgIGlmIChsYXN0X2JhciA8IGxpbmUubGVuZ3RoKCkpIG1pc2MgPSBsaW5lLnN1YnN0cihsYXN0X2JhciArIDEpOwogICAgIGxpbmUuZXJhc2UobGFzdF9iYXIpOwogCiAgICAgbGFzdF9iYXIgPSBsaW5lLmZpbmRfbGFzdF9vZignfCcpOwotICAgIGlmKGxhc3RfYmFyID09IHN0cmluZzo6bnBvcykgY29udGludWU7Ci0gICAgaWYobGFzdF9iYXIgPCBsaW5lLmxlbmd0aCgpKQotICAgICAgcmVhbG5hbWUgPSBsaW5lLnN1YnN0cihsYXN0X2JhcisxKTsKKyAgICBpZiAobGFzdF9iYXIgPT0gc3RyaW5nOjpucG9zKSBjb250aW51ZTsKKyAgICBpZiAobGFzdF9iYXIgPCBsaW5lLmxlbmd0aCgpKSB1cmwgPSBsaW5lLnN1YnN0cihsYXN0X2JhciArIDEpOworICAgIGxpbmUuZXJhc2UobGFzdF9iYXIpOworCisgICAgbGFzdF9iYXIgPSBsaW5lLmZpbmRfbGFzdF9vZignfCcpOworICAgIGlmIChsYXN0X2JhciA9PSBzdHJpbmc6Om5wb3MpIGNvbnRpbnVlOworICAgIGlmIChsYXN0X2JhciA8IGxpbmUubGVuZ3RoKCkpIHJlYWxuYW1lID0gbGluZS5zdWJzdHIobGFzdF9iYXIgKyAxKTsKICAgICBsaW5lLmVyYXNlKGxhc3RfYmFyKTsKIAogICAgIGhnbmFtZSA9IGxpbmU7Ci0gICAgCisKICAgICAvLyByZW1vdmUgdGhlIGV4YW1wbGUgbGluZQotICAgIGlmKGhnbmFtZS5maW5kKCJNZXJjdXJpYWxOYW1lIikgIT0gc3RyaW5nOjpucG9zKSBjb250aW51ZTsKLSAgICAKKyAgICBpZiAoaGduYW1lLmZpbmQoIk1lcmN1cmlhbE5hbWUiKSAhPSBzdHJpbmc6Om5wb3MpIGNvbnRpbnVlOworCiAgICAgbGlzdDxjb250cmlidXRvcj46Oml0ZXJhdG9yIGl0OwotICAgIGZvcihpdD1jb250cmlidXRvcnNfbGlzdC5iZWdpbigpOyBpdCAhPSBjb250cmlidXRvcnNfbGlzdC5lbmQoKSAmJiBpdC0+bmFtZSAhPSBoZ25hbWU7ICsraXQpCi0gICAge30KLSAgICAKLSAgICBpZihpdCA9PSBjb250cmlidXRvcnNfbGlzdC5lbmQoKSkKLSAgICB7CisgICAgZm9yIChpdCA9IGNvbnRyaWJ1dG9yc19saXN0LmJlZ2luKCk7IGl0ICE9IGNvbnRyaWJ1dG9yc19saXN0LmVuZCgpICYmIGl0LT5uYW1lICE9IGhnbmFtZTsgKytpdCkgeworICAgIH0KKworICAgIGlmIChpdCA9PSBjb250cmlidXRvcnNfbGlzdC5lbmQoKSkgewogICAgICAgY29udHJpYnV0b3IgYzsKICAgICAgIGMubmFtZSA9IHJlYWxuYW1lOwogICAgICAgYy51cmwgPSB1cmw7CiAgICAgICBjLm1pc2MgPSBtaXNjOwogICAgICAgY29udHJpYnV0b3JzX2xpc3QucHVzaF9iYWNrKGMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICBpdC0+bmFtZSA9IHJlYWxuYW1lOwogICAgICAgaXQtPnVybCA9IHVybDsKICAgICAgIGl0LT5taXNjID0gbWlzYzsKQEAgLTE4MywyOCArMTYyLDI2IEBACiAgIH0KIH0KIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIC8vIHBhcnNlIHRoZSBoZyBjaHVybiBvdXRwdXQgZmlsZXMKLSAgbWFwPHN0cmluZyxpbnQ+IGNvbnRyaWJ1dG9yc19tYXBfZm9yX2NoYW5nZWRsaW5lcyA9IGNvbnRyaWJ1dG9yc19tYXBfZnJvbV9jaHVybl9vdXRwdXQoImNodXJuLWNoYW5nZWRsaW5lcy5vdXQiKTsKLSAgLy9tYXA8c3RyaW5nLGludD4gY29udHJpYnV0b3JzX21hcF9mb3JfY2hhbmdlc2V0cyA9IGNvbnRyaWJ1dG9yc19tYXBfZnJvbV9jaHVybl9vdXRwdXQoImNodXJuLWNoYW5nZXNldHMub3V0Iik7Ci0gIAorICBtYXA8c3RyaW5nLCBpbnQ+IGNvbnRyaWJ1dG9yc19tYXBfZm9yX2NoYW5nZWRsaW5lcyA9IGNvbnRyaWJ1dG9yc19tYXBfZnJvbV9jaHVybl9vdXRwdXQoImNodXJuLWNoYW5nZWRsaW5lcy5vdXQiKTsKKyAgLy8gbWFwPHN0cmluZyxpbnQ+IGNvbnRyaWJ1dG9yc19tYXBfZm9yX2NoYW5nZXNldHMgPSBjb250cmlidXRvcnNfbWFwX2Zyb21fY2h1cm5fb3V0cHV0KCJjaHVybi1jaGFuZ2VzZXRzLm91dCIpOworCiAgIC8vIG1lcmdlIGludG8gdGhlIGNvbnRyaWJ1dG9ycyBsaXN0CiAgIGxpc3Q8Y29udHJpYnV0b3I+IGNvbnRyaWJ1dG9yc19saXN0OwotICBtYXA8c3RyaW5nLGludD46Oml0ZXJhdG9yIGl0OwotICBmb3IoaXQ9Y29udHJpYnV0b3JzX21hcF9mb3JfY2hhbmdlZGxpbmVzLmJlZ2luKCk7IGl0ICE9IGNvbnRyaWJ1dG9yc19tYXBfZm9yX2NoYW5nZWRsaW5lcy5lbmQoKTsgKytpdCkKLSAgeworICBtYXA8c3RyaW5nLCBpbnQ+OjppdGVyYXRvciBpdDsKKyAgZm9yIChpdCA9IGNvbnRyaWJ1dG9yc19tYXBfZm9yX2NoYW5nZWRsaW5lcy5iZWdpbigpOyBpdCAhPSBjb250cmlidXRvcnNfbWFwX2Zvcl9jaGFuZ2VkbGluZXMuZW5kKCk7ICsraXQpIHsKICAgICBjb250cmlidXRvciBjOwogICAgIGMubmFtZSA9IGl0LT5maXJzdDsKICAgICBjLmNoYW5nZWRsaW5lcyA9IGl0LT5zZWNvbmQ7Ci0gICAgYy5jaGFuZ2VzZXRzID0gMDsgLy9jb250cmlidXRvcnNfbWFwX2Zvcl9jaGFuZ2VzZXRzLmZpbmQoaXQtPmZpcnN0KS0+c2Vjb25kOworICAgIGMuY2hhbmdlc2V0cyA9IDA7ICAvLyBjb250cmlidXRvcnNfbWFwX2Zvcl9jaGFuZ2VzZXRzLmZpbmQoaXQtPmZpcnN0KS0+c2Vjb25kOwogICAgIGNvbnRyaWJ1dG9yc19saXN0LnB1c2hfYmFjayhjKTsKICAgfQotICAKKwogICBhZGRfb25saW5lX2luZm9faW50b19jb250cmlidXRvcnNfbGlzdChjb250cmlidXRvcnNfbGlzdCwgIm9ubGluZS1pbmZvLm91dCIpOwotICAKKwogICBjb250cmlidXRvcnNfbGlzdC5zb3J0KCk7Ci0gIAorCiAgIGNvdXQgPDwgInt8IGNlbGxwYWRkaW5nPVwiNVwiXG4iOwogICBjb3V0IDw8ICIhXG4iOwogICBjb3V0IDw8ICIhIExpbmVzIGNoYW5nZWRcbiI7CkBAIC0yMTIsMTYgKzE4OSwxNyBAQAogCiAgIGxpc3Q8Y29udHJpYnV0b3I+OjppdGVyYXRvciBpdGM7CiAgIGludCBpID0gMDsKLSAgZm9yKGl0Yz1jb250cmlidXRvcnNfbGlzdC5iZWdpbigpOyBpdGMgIT0gY29udHJpYnV0b3JzX2xpc3QuZW5kKCk7ICsraXRjKQotICB7Ci0gICAgaWYoaXRjLT5uYW1lLmxlbmd0aCgpID09IDApIGNvbnRpbnVlOwotICAgIGlmKGklMikgY291dCA8PCAifC1cbiI7Ci0gICAgZWxzZSBjb3V0IDw8ICJ8LSBzdHlsZT1cImJhY2tncm91bmQ6I0ZGRkZEMFwiXG4iOwotICAgIGlmKGl0Yy0+dXJsLmxlbmd0aCgpKQorICBmb3IgKGl0YyA9IGNvbnRyaWJ1dG9yc19saXN0LmJlZ2luKCk7IGl0YyAhPSBjb250cmlidXRvcnNfbGlzdC5lbmQoKTsgKytpdGMpIHsKKyAgICBpZiAoaXRjLT5uYW1lLmxlbmd0aCgpID09IDApIGNvbnRpbnVlOworICAgIGlmIChpICUgMikKKyAgICAgIGNvdXQgPDwgInwtXG4iOworICAgIGVsc2UKKyAgICAgIGNvdXQgPDwgInwtIHN0eWxlPVwiYmFja2dyb3VuZDojRkZGRkQwXCJcbiI7CisgICAgaWYgKGl0Yy0+dXJsLmxlbmd0aCgpKQogICAgICAgY291dCA8PCAifCBbIiA8PCBpdGMtPnVybCA8PCAiICIgPDwgaXRjLT5uYW1lIDw8ICJdXG4iOwogICAgIGVsc2UKICAgICAgIGNvdXQgPDwgInwgIiA8PCBpdGMtPm5hbWUgPDwgIlxuIjsKLSAgICBpZihpdGMtPmNoYW5nZWRsaW5lcykKKyAgICBpZiAoaXRjLT5jaGFuZ2VkbGluZXMpCiAgICAgICBjb3V0IDw8ICJ8ICIgPDwgaXRjLT5jaGFuZ2VkbGluZXMgPDwgIlxuIjsKICAgICBlbHNlCiAgICAgICBjb3V0IDw8ICJ8IChubyBpbmZvcm1hdGlvbilcbiI7CmRpZmYgLS1naXQgYS90ZXN0L0Fubm95aW5nU2NhbGFyLmggYi90ZXN0L0Fubm95aW5nU2NhbGFyLmgKaW5kZXggOTRiNTEzYy4uYjRmNzdhZCAxMDA2NDQKLS0tIGEvdGVzdC9Bbm5veWluZ1NjYWxhci5oCisrKyBiL3Rlc3QvQW5ub3lpbmdTY2FsYXIuaApAQCAtMTcsOCArMTcsNyBAQAogI2VuZGlmCiAKICNpZm5kZWYgRUlHRU5fVEVTVF9BTk5PWUlOR19TQ0FMQVJfRE9OVF9USFJPVwotc3RydWN0IG15X2V4Y2VwdGlvbgoteworc3RydWN0IG15X2V4Y2VwdGlvbiB7CiAgIG15X2V4Y2VwdGlvbigpIHt9CiAgIH5teV9leGNlcHRpb24oKSB7fQogfTsKQEAgLTI2LDg4ICsyNSwxMjAgQEAKIAogLy8gQW4gQW5ub3lpbmdTY2FsYXIgaXMgYSBwc2V1ZG8gc2NhbGFyIHR5cGUgdGhhdDoKIC8vIC0gY2FuIHJhbmRvbWx5IHRocm91Z2ggYW4gZXhjZXB0aW9uIGluIG9wZXJhdG9yICsKLS8vIC0gcmFuZG9tbHkgYWxsb2NhdGUgb24gdGhlIGhlYXAgb3IgaW5pdGlhbGl6ZSBhIHJlZmVyZW5jZSB0byBpdHNlbGYgbWFraW5nIGl0IG5vbiB0cml2aWFsbHkgY29weWFibGUsIG5vciBtb3ZhYmxlLCBub3IgcmVsb2NhdGFibGUuCisvLyAtIHJhbmRvbWx5IGFsbG9jYXRlIG9uIHRoZSBoZWFwIG9yIGluaXRpYWxpemUgYSByZWZlcmVuY2UgdG8gaXRzZWxmIG1ha2luZyBpdCBub24gdHJpdmlhbGx5IGNvcHlhYmxlLCBub3IgbW92YWJsZSwKKy8vIG5vciByZWxvY2F0YWJsZS4KIAotY2xhc3MgQW5ub3lpbmdTY2FsYXIKLXsKLSAgcHVibGljOgotICAgIEFubm95aW5nU2NhbGFyKCkgICAgICAgICAgICAgICAgeyBpbml0KCk7ICp2ID0gMDsgIH0KLSAgICBBbm5veWluZ1NjYWxhcihsb25nIGRvdWJsZSBfdikgIHsgaW5pdCgpOyAqdiA9IHN0YXRpY19jYXN0PGZsb2F0Pihfdik7IH0KLSAgICBBbm5veWluZ1NjYWxhcihkb3VibGUgX3YpICAgICAgIHsgaW5pdCgpOyAqdiA9IHN0YXRpY19jYXN0PGZsb2F0Pihfdik7IH0KLSAgICBBbm5veWluZ1NjYWxhcihmbG9hdCBfdikgICAgICAgIHsgaW5pdCgpOyAqdiA9IF92OyB9Ci0gICAgQW5ub3lpbmdTY2FsYXIoaW50IF92KSAgICAgICAgICB7IGluaXQoKTsgKnYgPSBzdGF0aWNfY2FzdDxmbG9hdD4oX3YpOyB9Ci0gICAgQW5ub3lpbmdTY2FsYXIobG9uZyBfdikgICAgICAgICB7IGluaXQoKTsgKnYgPSBzdGF0aWNfY2FzdDxmbG9hdD4oX3YpOyB9Ci0gICAgQW5ub3lpbmdTY2FsYXIobG9uZyBsb25nIF92KSAgICB7IGluaXQoKTsgKnYgPSBzdGF0aWNfY2FzdDxmbG9hdD4oX3YpOyB9Ci0gICAgQW5ub3lpbmdTY2FsYXIoY29uc3QgQW5ub3lpbmdTY2FsYXImIG90aGVyKSB7IGluaXQoKTsgKnYgPSAqKG90aGVyLnYpOyB9Ci0gICAgfkFubm95aW5nU2NhbGFyKCkgewotICAgICAgaWYodiE9JmRhdGEpCi0gICAgICAgIGRlbGV0ZSB2OwotICAgICAgaW5zdGFuY2VzLS07Ci0gICAgfQorY2xhc3MgQW5ub3lpbmdTY2FsYXIgeworIHB1YmxpYzoKKyAgQW5ub3lpbmdTY2FsYXIoKSB7CisgICAgaW5pdCgpOworICAgICp2ID0gMDsKKyAgfQorICBBbm5veWluZ1NjYWxhcihsb25nIGRvdWJsZSBfdikgeworICAgIGluaXQoKTsKKyAgICAqdiA9IHN0YXRpY19jYXN0PGZsb2F0Pihfdik7CisgIH0KKyAgQW5ub3lpbmdTY2FsYXIoZG91YmxlIF92KSB7CisgICAgaW5pdCgpOworICAgICp2ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KF92KTsKKyAgfQorICBBbm5veWluZ1NjYWxhcihmbG9hdCBfdikgeworICAgIGluaXQoKTsKKyAgICAqdiA9IF92OworICB9CisgIEFubm95aW5nU2NhbGFyKGludCBfdikgeworICAgIGluaXQoKTsKKyAgICAqdiA9IHN0YXRpY19jYXN0PGZsb2F0Pihfdik7CisgIH0KKyAgQW5ub3lpbmdTY2FsYXIobG9uZyBfdikgeworICAgIGluaXQoKTsKKyAgICAqdiA9IHN0YXRpY19jYXN0PGZsb2F0Pihfdik7CisgIH0KKyAgQW5ub3lpbmdTY2FsYXIobG9uZyBsb25nIF92KSB7CisgICAgaW5pdCgpOworICAgICp2ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KF92KTsKKyAgfQorICBBbm5veWluZ1NjYWxhcihjb25zdCBBbm5veWluZ1NjYWxhciYgb3RoZXIpIHsKKyAgICBpbml0KCk7CisgICAgKnYgPSAqKG90aGVyLnYpOworICB9CisgIH5Bbm5veWluZ1NjYWxhcigpIHsKKyAgICBpZiAodiAhPSAmZGF0YSkgZGVsZXRlIHY7CisgICAgaW5zdGFuY2VzLS07CisgIH0KIAotICAgIHZvaWQgaW5pdCgpIHsKLSAgICAgIGlmKGludGVybmFsOjpyYW5kb208Ym9vbD4oKSkKLSAgICAgICAgdiA9IG5ldyBmbG9hdDsKLSAgICAgIGVsc2UKLSAgICAgICAgdiA9ICZkYXRhOwotICAgICAgaW5zdGFuY2VzKys7Ci0gICAgfQorICB2b2lkIGluaXQoKSB7CisgICAgaWYgKGludGVybmFsOjpyYW5kb208Ym9vbD4oKSkKKyAgICAgIHYgPSBuZXcgZmxvYXQ7CisgICAgZWxzZQorICAgICAgdiA9ICZkYXRhOworICAgIGluc3RhbmNlcysrOworICB9CiAKLSAgICBBbm5veWluZ1NjYWxhciBvcGVyYXRvcisoY29uc3QgQW5ub3lpbmdTY2FsYXImIG90aGVyKSBjb25zdAotICAgIHsKLSAgICAgICNpZm5kZWYgRUlHRU5fVEVTVF9BTk5PWUlOR19TQ0FMQVJfRE9OVF9USFJPVwotICAgICAgY291bnRkb3duLS07Ci0gICAgICBpZihjb3VudGRvd248PTAgJiYgIWRvbnRfdGhyb3cpCi0gICAgICAgIHRocm93IG15X2V4Y2VwdGlvbigpOwotICAgICAgI2VuZGlmCi0gICAgICByZXR1cm4gQW5ub3lpbmdTY2FsYXIoKnYrKm90aGVyLnYpOwotICAgIH0KLQotICAgIEFubm95aW5nU2NhbGFyIG9wZXJhdG9yLSgpIGNvbnN0Ci0gICAgeyByZXR1cm4gQW5ub3lpbmdTY2FsYXIoLSp2KTsgfQotCi0gICAgQW5ub3lpbmdTY2FsYXIgb3BlcmF0b3ItKGNvbnN0IEFubm95aW5nU2NhbGFyJiBvdGhlcikgY29uc3QKLSAgICB7IHJldHVybiBBbm5veWluZ1NjYWxhcigqdi0qb3RoZXIudik7IH0KLSAgICAKLSAgICBBbm5veWluZ1NjYWxhciBvcGVyYXRvciooY29uc3QgQW5ub3lpbmdTY2FsYXImIG90aGVyKSBjb25zdAotICAgIHsgcmV0dXJuIEFubm95aW5nU2NhbGFyKCgqdikqKCpvdGhlci52KSk7IH0KLQotICAgIEFubm95aW5nU2NhbGFyIG9wZXJhdG9yLyhjb25zdCBBbm5veWluZ1NjYWxhciYgb3RoZXIpIGNvbnN0Ci0gICAgeyByZXR1cm4gQW5ub3lpbmdTY2FsYXIoKCp2KS8oKm90aGVyLnYpKTsgfQotCi0gICAgQW5ub3lpbmdTY2FsYXImIG9wZXJhdG9yKz0oY29uc3QgQW5ub3lpbmdTY2FsYXImIG90aGVyKSB7ICp2ICs9ICpvdGhlci52OyByZXR1cm4gKnRoaXM7IH0KLSAgICBBbm5veWluZ1NjYWxhciYgb3BlcmF0b3ItPShjb25zdCBBbm5veWluZ1NjYWxhciYgb3RoZXIpIHsgKnYgLT0gKm90aGVyLnY7IHJldHVybiAqdGhpczsgfQotICAgIEFubm95aW5nU2NhbGFyJiBvcGVyYXRvcio9KGNvbnN0IEFubm95aW5nU2NhbGFyJiBvdGhlcikgeyAqdiAqPSAqb3RoZXIudjsgcmV0dXJuICp0aGlzOyB9Ci0gICAgQW5ub3lpbmdTY2FsYXImIG9wZXJhdG9yLz0oY29uc3QgQW5ub3lpbmdTY2FsYXImIG90aGVyKSB7ICp2IC89ICpvdGhlci52OyByZXR1cm4gKnRoaXM7IH0KLSAgICBBbm5veWluZ1NjYWxhciYgb3BlcmF0b3I9IChjb25zdCBBbm5veWluZ1NjYWxhciYgb3RoZXIpIHsgKnYgID0gKm90aGVyLnY7IHJldHVybiAqdGhpczsgfQotCi0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFubm95aW5nU2NhbGFyJiBvdGhlcikgY29uc3QgeyByZXR1cm4gbnVtZXh0OjplcXVhbF9zdHJpY3QoKnYsICpvdGhlci52KTsgfQotICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBbm5veWluZ1NjYWxhciYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIG51bWV4dDo6bm90X2VxdWFsX3N0cmljdCgqdiwgKm90aGVyLnYpOyB9Ci0gICAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEFubm95aW5nU2NhbGFyJiBvdGhlcikgY29uc3QgeyByZXR1cm4gKnYgPD0gKm90aGVyLnY7IH0KLSAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgQW5ub3lpbmdTY2FsYXImIG90aGVyKSBjb25zdCB7IHJldHVybiAqdiA8ICAqb3RoZXIudjsgfQotICAgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBBbm5veWluZ1NjYWxhciYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICp2ID49ICpvdGhlci52OyB9Ci0gICAgYm9vbCBvcGVyYXRvcj4gKGNvbnN0IEFubm95aW5nU2NhbGFyJiBvdGhlcikgY29uc3QgeyByZXR1cm4gKnYgPiAgKm90aGVyLnY7IH0KLSAgCi0gICAgZmxvYXQqIHY7Ci0gICAgZmxvYXQgZGF0YTsKLSAgICBzdGF0aWMgaW50IGluc3RhbmNlczsKKyAgQW5ub3lpbmdTY2FsYXIgb3BlcmF0b3IrKGNvbnN0IEFubm95aW5nU2NhbGFyJiBvdGhlcikgY29uc3QgewogI2lmbmRlZiBFSUdFTl9URVNUX0FOTk9ZSU5HX1NDQUxBUl9ET05UX1RIUk9XCi0gICAgc3RhdGljIGludCBjb3VudGRvd247Ci0gICAgc3RhdGljIGJvb2wgZG9udF90aHJvdzsKKyAgICBjb3VudGRvd24tLTsKKyAgICBpZiAoY291bnRkb3duIDw9IDAgJiYgIWRvbnRfdGhyb3cpIHRocm93IG15X2V4Y2VwdGlvbigpOworI2VuZGlmCisgICAgcmV0dXJuIEFubm95aW5nU2NhbGFyKCp2ICsgKm90aGVyLnYpOworICB9CisKKyAgQW5ub3lpbmdTY2FsYXIgb3BlcmF0b3ItKCkgY29uc3QgeyByZXR1cm4gQW5ub3lpbmdTY2FsYXIoLSp2KTsgfQorCisgIEFubm95aW5nU2NhbGFyIG9wZXJhdG9yLShjb25zdCBBbm5veWluZ1NjYWxhciYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIEFubm95aW5nU2NhbGFyKCp2IC0gKm90aGVyLnYpOyB9CisKKyAgQW5ub3lpbmdTY2FsYXIgb3BlcmF0b3IqKGNvbnN0IEFubm95aW5nU2NhbGFyJiBvdGhlcikgY29uc3QgeyByZXR1cm4gQW5ub3lpbmdTY2FsYXIoKCp2KSAqICgqb3RoZXIudikpOyB9CisKKyAgQW5ub3lpbmdTY2FsYXIgb3BlcmF0b3IvKGNvbnN0IEFubm95aW5nU2NhbGFyJiBvdGhlcikgY29uc3QgeyByZXR1cm4gQW5ub3lpbmdTY2FsYXIoKCp2KSAvICgqb3RoZXIudikpOyB9CisKKyAgQW5ub3lpbmdTY2FsYXImIG9wZXJhdG9yKz0oY29uc3QgQW5ub3lpbmdTY2FsYXImIG90aGVyKSB7CisgICAgKnYgKz0gKm90aGVyLnY7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFubm95aW5nU2NhbGFyJiBvcGVyYXRvci09KGNvbnN0IEFubm95aW5nU2NhbGFyJiBvdGhlcikgeworICAgICp2IC09ICpvdGhlci52OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBbm5veWluZ1NjYWxhciYgb3BlcmF0b3IqPShjb25zdCBBbm5veWluZ1NjYWxhciYgb3RoZXIpIHsKKyAgICAqdiAqPSAqb3RoZXIudjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQW5ub3lpbmdTY2FsYXImIG9wZXJhdG9yLz0oY29uc3QgQW5ub3lpbmdTY2FsYXImIG90aGVyKSB7CisgICAgKnYgLz0gKm90aGVyLnY7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFubm95aW5nU2NhbGFyJiBvcGVyYXRvcj0oY29uc3QgQW5ub3lpbmdTY2FsYXImIG90aGVyKSB7CisgICAgKnYgPSAqb3RoZXIudjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQW5ub3lpbmdTY2FsYXImIG90aGVyKSBjb25zdCB7IHJldHVybiBudW1leHQ6OmVxdWFsX3N0cmljdCgqdiwgKm90aGVyLnYpOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBbm5veWluZ1NjYWxhciYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIG51bWV4dDo6bm90X2VxdWFsX3N0cmljdCgqdiwgKm90aGVyLnYpOyB9CisgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBBbm5veWluZ1NjYWxhciYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICp2IDw9ICpvdGhlci52OyB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEFubm95aW5nU2NhbGFyJiBvdGhlcikgY29uc3QgeyByZXR1cm4gKnYgPCAqb3RoZXIudjsgfQorICBib29sIG9wZXJhdG9yPj0oY29uc3QgQW5ub3lpbmdTY2FsYXImIG90aGVyKSBjb25zdCB7IHJldHVybiAqdiA+PSAqb3RoZXIudjsgfQorICBib29sIG9wZXJhdG9yPihjb25zdCBBbm5veWluZ1NjYWxhciYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICp2ID4gKm90aGVyLnY7IH0KKworICBmbG9hdCogdjsKKyAgZmxvYXQgZGF0YTsKKyAgc3RhdGljIGludCBpbnN0YW5jZXM7CisjaWZuZGVmIEVJR0VOX1RFU1RfQU5OT1lJTkdfU0NBTEFSX0RPTlRfVEhST1cKKyAgc3RhdGljIGludCBjb3VudGRvd247CisgIHN0YXRpYyBib29sIGRvbnRfdGhyb3c7CiAjZW5kaWYKIH07CiAKLUFubm95aW5nU2NhbGFyIHJlYWwoY29uc3QgQW5ub3lpbmdTY2FsYXIgJngpIHsgcmV0dXJuIHg7IH0KLUFubm95aW5nU2NhbGFyIGltYWcoY29uc3QgQW5ub3lpbmdTY2FsYXIgJiApIHsgcmV0dXJuIDA7IH0KLUFubm95aW5nU2NhbGFyIGNvbmooY29uc3QgQW5ub3lpbmdTY2FsYXIgJngpIHsgcmV0dXJuIHg7IH0KLUFubm95aW5nU2NhbGFyIHNxcnQoY29uc3QgQW5ub3lpbmdTY2FsYXIgJngpIHsgcmV0dXJuIHN0ZDo6c3FydCgqeC52KTsgfQotQW5ub3lpbmdTY2FsYXIgYWJzIChjb25zdCBBbm5veWluZ1NjYWxhciAmeCkgeyByZXR1cm4gc3RkOjphYnMoKngudik7IH0KLUFubm95aW5nU2NhbGFyIGNvcyAoY29uc3QgQW5ub3lpbmdTY2FsYXIgJngpIHsgcmV0dXJuIHN0ZDo6Y29zKCp4LnYpOyB9Ci1Bbm5veWluZ1NjYWxhciBzaW4gKGNvbnN0IEFubm95aW5nU2NhbGFyICZ4KSB7IHJldHVybiBzdGQ6OnNpbigqeC52KTsgfQotQW5ub3lpbmdTY2FsYXIgYWNvcyhjb25zdCBBbm5veWluZ1NjYWxhciAmeCkgeyByZXR1cm4gc3RkOjphY29zKCp4LnYpOyB9Ci1Bbm5veWluZ1NjYWxhciBhdGFuMihjb25zdCBBbm5veWluZ1NjYWxhciAmeSxjb25zdCBBbm5veWluZ1NjYWxhciAmeCkgeyByZXR1cm4gc3RkOjphdGFuMigqeS52LCp4LnYpOyB9CitBbm5veWluZ1NjYWxhciByZWFsKGNvbnN0IEFubm95aW5nU2NhbGFyJiB4KSB7IHJldHVybiB4OyB9CitBbm5veWluZ1NjYWxhciBpbWFnKGNvbnN0IEFubm95aW5nU2NhbGFyJikgeyByZXR1cm4gMDsgfQorQW5ub3lpbmdTY2FsYXIgY29uaihjb25zdCBBbm5veWluZ1NjYWxhciYgeCkgeyByZXR1cm4geDsgfQorQW5ub3lpbmdTY2FsYXIgc3FydChjb25zdCBBbm5veWluZ1NjYWxhciYgeCkgeyByZXR1cm4gc3RkOjpzcXJ0KCp4LnYpOyB9CitBbm5veWluZ1NjYWxhciBhYnMoY29uc3QgQW5ub3lpbmdTY2FsYXImIHgpIHsgcmV0dXJuIHN0ZDo6YWJzKCp4LnYpOyB9CitBbm5veWluZ1NjYWxhciBjb3MoY29uc3QgQW5ub3lpbmdTY2FsYXImIHgpIHsgcmV0dXJuIHN0ZDo6Y29zKCp4LnYpOyB9CitBbm5veWluZ1NjYWxhciBzaW4oY29uc3QgQW5ub3lpbmdTY2FsYXImIHgpIHsgcmV0dXJuIHN0ZDo6c2luKCp4LnYpOyB9CitBbm5veWluZ1NjYWxhciBhY29zKGNvbnN0IEFubm95aW5nU2NhbGFyJiB4KSB7IHJldHVybiBzdGQ6OmFjb3MoKngudik7IH0KK0Fubm95aW5nU2NhbGFyIGF0YW4yKGNvbnN0IEFubm95aW5nU2NhbGFyJiB5LCBjb25zdCBBbm5veWluZ1NjYWxhciYgeCkgeyByZXR1cm4gc3RkOjphdGFuMigqeS52LCAqeC52KTsgfQogCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBzdHJlYW0sY29uc3QgQW5ub3lpbmdTY2FsYXImIHgpIHsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIHN0cmVhbSwgY29uc3QgQW5ub3lpbmdTY2FsYXImIHgpIHsKICAgc3RyZWFtIDw8ICgqKHgudikpOwogICByZXR1cm4gc3RyZWFtOwogfQpAQCAtMTIwLDkgKzE1MSw4IEBACiAjZW5kaWYKIAogbmFtZXNwYWNlIEVpZ2VuIHsKLXRlbXBsYXRlPD4KLXN0cnVjdCBOdW1UcmFpdHM8QW5ub3lpbmdTY2FsYXI+IDogTnVtVHJhaXRzPGZsb2F0PgotewordGVtcGxhdGUgPD4KK3N0cnVjdCBOdW1UcmFpdHM8QW5ub3lpbmdTY2FsYXI+IDogTnVtVHJhaXRzPGZsb2F0PiB7CiAgIGVudW0gewogICAgIFJlcXVpcmVJbml0aWFsaXphdGlvbiA9IDEsCiAgIH07CkBAIC0xMzIsMzIgKzE2Miw0MiBAQAogICB0eXBlZGVmIEFubm95aW5nU2NhbGFyIE5vbkludGVnZXI7CiB9OwogCi10ZW1wbGF0ZTw+IGlubGluZSBBbm5veWluZ1NjYWxhciB0ZXN0X3ByZWNpc2lvbjxBbm5veWluZ1NjYWxhcj4oKSB7IHJldHVybiB0ZXN0X3ByZWNpc2lvbjxmbG9hdD4oKTsgfQordGVtcGxhdGUgPD4KK2lubGluZSBBbm5veWluZ1NjYWxhciB0ZXN0X3ByZWNpc2lvbjxBbm5veWluZ1NjYWxhcj4oKSB7CisgIHJldHVybiB0ZXN0X3ByZWNpc2lvbjxmbG9hdD4oKTsKK30KIAogbmFtZXNwYWNlIG51bWV4dCB7Ci10ZW1wbGF0ZTw+Ci1FSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FCi1ib29sIChpc2Zpbml0ZSkoY29uc3QgQW5ub3lpbmdTY2FsYXImIHgpIHsKK3RlbXBsYXRlIDw+CitFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIGJvb2woaXNmaW5pdGUpKGNvbnN0IEFubm95aW5nU2NhbGFyJiB4KSB7CiAgIHJldHVybiAobnVtZXh0Ojppc2Zpbml0ZSkoKngudik7CiB9Ci19Cit9ICAvLyBuYW1lc3BhY2UgbnVtZXh0CiAKIG5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0gIHRlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBkb3VibGUgY2FzdChjb25zdCBBbm5veWluZ1NjYWxhciYgeCkgeyByZXR1cm4gZG91YmxlKCp4LnYpOyB9Ci0gIHRlbXBsYXRlPD4gRUlHRU5fU1RST05HX0lOTElORSBmbG9hdCAgY2FzdChjb25zdCBBbm5veWluZ1NjYWxhciYgeCkgeyByZXR1cm4gKngudjsgfQordGVtcGxhdGUgPD4KK0VJR0VOX1NUUk9OR19JTkxJTkUgZG91YmxlIGNhc3QoY29uc3QgQW5ub3lpbmdTY2FsYXImIHgpIHsKKyAgcmV0dXJuIGRvdWJsZSgqeC52KTsKIH0KK3RlbXBsYXRlIDw+CitFSUdFTl9TVFJPTkdfSU5MSU5FIGZsb2F0IGNhc3QoY29uc3QgQW5ub3lpbmdTY2FsYXImIHgpIHsKKyAgcmV0dXJuICp4LnY7Cit9Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIH0gIC8vIG5hbWVzcGFjZSBFaWdlbgogCi1Bbm5veWluZ1NjYWxhciBnZXRfdGVzdF9wcmVjaXNpb24oY29uc3QgQW5ub3lpbmdTY2FsYXImKQoteyByZXR1cm4gRWlnZW46OnRlc3RfcHJlY2lzaW9uPEFubm95aW5nU2NhbGFyPigpOyB9CitBbm5veWluZ1NjYWxhciBnZXRfdGVzdF9wcmVjaXNpb24oY29uc3QgQW5ub3lpbmdTY2FsYXImKSB7IHJldHVybiBFaWdlbjo6dGVzdF9wcmVjaXNpb248QW5ub3lpbmdTY2FsYXI+KCk7IH0KIAotQW5ub3lpbmdTY2FsYXIgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBBbm5veWluZ1NjYWxhciAmYSwgY29uc3QgQW5ub3lpbmdTY2FsYXIgJmIpCi17IHJldHVybiB0ZXN0X3JlbGF0aXZlX2Vycm9yKCphLnYsICpiLnYpOyB9CitBbm5veWluZ1NjYWxhciB0ZXN0X3JlbGF0aXZlX2Vycm9yKGNvbnN0IEFubm95aW5nU2NhbGFyJiBhLCBjb25zdCBBbm5veWluZ1NjYWxhciYgYikgeworICByZXR1cm4gdGVzdF9yZWxhdGl2ZV9lcnJvcigqYS52LCAqYi52KTsKK30KIAotaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBBbm5veWluZ1NjYWxhciAmYSwgY29uc3QgQW5ub3lpbmdTY2FsYXIgJmIpCi17IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goKmEudiwgKmIudiwgdGVzdF9wcmVjaXNpb248ZmxvYXQ+KCkpOyB9CitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94KGNvbnN0IEFubm95aW5nU2NhbGFyJiBhLCBjb25zdCBBbm5veWluZ1NjYWxhciYgYikgeworICByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94KCphLnYsICpiLnYsIHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpKTsKK30KIAotaW5saW5lIGJvb2wgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBBbm5veWluZ1NjYWxhciAmYSwgY29uc3QgQW5ub3lpbmdTY2FsYXIgJmIpCi17IHJldHVybiB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKCphLnYsICpiLnYpOyB9CitpbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IEFubm95aW5nU2NhbGFyJiBhLCBjb25zdCBBbm5veWluZ1NjYWxhciYgYikgeworICByZXR1cm4gdGVzdF9pc011Y2hTbWFsbGVyVGhhbigqYS52LCAqYi52KTsKK30KIAotI2VuZGlmIC8vIEVJR0VOX1RFU1RfQU5OT1lJTkdfU0NBTEFSX0gKKyNlbmRpZiAgLy8gRUlHRU5fVEVTVF9BTk5PWUlOR19TQ0FMQVJfSApkaWZmIC0tZ2l0IGEvdGVzdC9Nb3ZhYmxlU2NhbGFyLmggYi90ZXN0L01vdmFibGVTY2FsYXIuaAppbmRleCA2YTkwZDAzLi41MjU5MWJjIDEwMDY0NAotLS0gYS90ZXN0L01vdmFibGVTY2FsYXIuaAorKysgYi90ZXN0L01vdmFibGVTY2FsYXIuaApAQCAtMTIsMTEgKzEyLDkgQEAKIAogI2luY2x1ZGUgPHZlY3Rvcj4KIAotbmFtZXNwYWNlIEVpZ2VuCi17CituYW1lc3BhY2UgRWlnZW4gewogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgQmFzZSA9IHN0ZDo6dmVjdG9yPFNjYWxhcj4+Ci1zdHJ1Y3QgTW92YWJsZVNjYWxhciA6IHB1YmxpYyBCYXNlCi17CitzdHJ1Y3QgTW92YWJsZVNjYWxhciA6IHB1YmxpYyBCYXNlIHsKICAgTW92YWJsZVNjYWxhcigpID0gZGVmYXVsdDsKICAgfk1vdmFibGVTY2FsYXIoKSA9IGRlZmF1bHQ7CiAgIE1vdmFibGVTY2FsYXIoY29uc3QgTW92YWJsZVNjYWxhciYpID0gZGVmYXVsdDsKQEAgLTI4LDggKzI2LDggQEAKICAgb3BlcmF0b3IgU2NhbGFyKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+c2l6ZSgpID4gMCA/IHRoaXMtPmJhY2soKSA6IFNjYWxhcigpOyB9CiB9OwogCi10ZW1wbGF0ZTw+IHN0cnVjdCBOdW1UcmFpdHM8TW92YWJsZVNjYWxhcjxmbG9hdD4+IDogR2VuZXJpY051bVRyYWl0czxmbG9hdD4ge307Ci19Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IE51bVRyYWl0czxNb3ZhYmxlU2NhbGFyPGZsb2F0Pj4gOiBHZW5lcmljTnVtVHJhaXRzPGZsb2F0PiB7fTsKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgogCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvdGVzdC9PZmZCeU9uZVNjYWxhci5oIGIvdGVzdC9PZmZCeU9uZVNjYWxhci5oCmluZGV4IGRiNTlhYjYuLjgxODQ1NzEgMTAwNjQ0Ci0tLSBhL3Rlc3QvT2ZmQnlPbmVTY2FsYXIuaAorKysgYi90ZXN0L09mZkJ5T25lU2NhbGFyLmgKQEAgLTEsMjQgKzEsMjAgQEAKIAogLy8gQSBTY2FsYXIgd2l0aCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBUKzEgc28gdGhhdCB6ZXJvIGlzIGludGVybmFsbHkKIC8vIHJlcHJlc2VudGVkIGJ5IFQoMSkuIFRoaXMgaXMgdXNlZCB0byB0ZXN0IG1lbW9yeSBmaWxsLgotLy8gCisvLwogI3ByYWdtYSBvbmNlCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBjbGFzcyBPZmZCeU9uZVNjYWxhciB7CiAgcHVibGljOgogICBPZmZCeU9uZVNjYWxhcigpIDogdmFsXygxKSB7fQogICBPZmZCeU9uZVNjYWxhcihjb25zdCBPZmZCeU9uZVNjYWxhciYgb3RoZXIpID0gZGVmYXVsdDsKICAgT2ZmQnlPbmVTY2FsYXImIG9wZXJhdG9yPShjb25zdCBPZmZCeU9uZVNjYWxhciYgb3RoZXIpID0gZGVmYXVsdDsKLSAgCisKICAgT2ZmQnlPbmVTY2FsYXIoVCB2YWwpIDogdmFsXyh2YWwgKyAxKSB7fQotICBPZmZCeU9uZVNjYWxhciYgb3BlcmF0b3I9KFQgdmFsKSB7Ci0gICAgdmFsXyA9IHZhbCArIDE7Ci0gIH0KLSAgCi0gIG9wZXJhdG9yIFQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbF8gLSAxOwotICB9Ci0gCisgIE9mZkJ5T25lU2NhbGFyJiBvcGVyYXRvcj0oVCB2YWwpIHsgdmFsXyA9IHZhbCArIDE7IH0KKworICBvcGVyYXRvciBUKCkgY29uc3QgeyByZXR1cm4gdmFsXyAtIDE7IH0KKwogIHByaXZhdGU6CiAgIFQgdmFsXzsKIH07CmRpZmYgLS1naXQgYS90ZXN0L1NhZmVTY2FsYXIuaCBiL3Rlc3QvU2FmZVNjYWxhci5oCmluZGV4IGM1Y2I3NTcuLjIwNzlhZjQgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2FmZVNjYWxhci5oCisrKyBiL3Rlc3QvU2FmZVNjYWxhci5oCkBAIC0xLDI5ICsxLDI3IEBACiAKIC8vIEEgU2NhbGFyIHRoYXQgYXNzZXJ0cyBmb3IgdW5pbml0aWFsaXplZCBhY2Nlc3MuCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBjbGFzcyBTYWZlU2NhbGFyIHsKICBwdWJsaWM6CiAgIFNhZmVTY2FsYXIoKSA6IGluaXRpYWxpemVkXyhmYWxzZSkge30KLSAgU2FmZVNjYWxhcihjb25zdCBTYWZlU2NhbGFyJiBvdGhlcikgewotICAgICp0aGlzID0gb3RoZXI7Ci0gIH0KKyAgU2FmZVNjYWxhcihjb25zdCBTYWZlU2NhbGFyJiBvdGhlcikgeyAqdGhpcyA9IG90aGVyOyB9CiAgIFNhZmVTY2FsYXImIG9wZXJhdG9yPShjb25zdCBTYWZlU2NhbGFyJiBvdGhlcikgewogICAgIHZhbF8gPSBUKG90aGVyKTsKICAgICBpbml0aWFsaXplZF8gPSB0cnVlOwogICAgIHJldHVybiAqdGhpczsKICAgfQotICAKKwogICBTYWZlU2NhbGFyKFQgdmFsKSA6IHZhbF8odmFsKSwgaW5pdGlhbGl6ZWRfKHRydWUpIHt9CiAgIFNhZmVTY2FsYXImIG9wZXJhdG9yPShUIHZhbCkgewogICAgIHZhbF8gPSB2YWw7CiAgICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKICAgfQotICAKKwogICBvcGVyYXRvciBUKCkgY29uc3QgewogICAgIFZFUklGWShpbml0aWFsaXplZF8gJiYgIlVuaW5pdGlhbGl6ZWQgYWNjZXNzLiIpOwogICAgIHJldHVybiB2YWxfOwogICB9Ci0gCisKICBwcml2YXRlOgogICBUIHZhbF87CiAgIGJvb2wgaW5pdGlhbGl6ZWRfOwpkaWZmIC0tZ2l0IGEvdGVzdC9hY2NlbGVyYXRlX3N1cHBvcnQuY3BwIGIvdGVzdC9hY2NlbGVyYXRlX3N1cHBvcnQuY3BwCmluZGV4IGFjNGJlNjEuLjQ2MjBkNDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvYWNjZWxlcmF0ZV9zdXBwb3J0LmNwcAorKysgYi90ZXN0L2FjY2VsZXJhdGVfc3VwcG9ydC5jcHAKQEAgLTcsNDUgKzcsNDMgQEAKIAogI2luY2x1ZGUgPEVpZ2VuL0FjY2VsZXJhdGVTdXBwb3J0PgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLHR5cGVuYW1lIERlbnNlTWF0PgotaW50IGdlbmVyYXRlX3NwYXJzZV9yZWN0YW5ndWxhcl9wcm9ibGVtKE1hdHJpeFR5cGUmIEEsIERlbnNlTWF0JiBkQSwgaW50IG1heFJvd3MgPSAzMDAsIGludCBtYXhDb2xzID0gMzAwKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIERlbnNlTWF0PgoraW50IGdlbmVyYXRlX3NwYXJzZV9yZWN0YW5ndWxhcl9wcm9ibGVtKE1hdHJpeFR5cGUmIEEsIERlbnNlTWF0JiBkQSwgaW50IG1heFJvd3MgPSAzMDAsIGludCBtYXhDb2xzID0gMzAwKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgaW50IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4Um93cyk7CiAgIGludCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIG1heENvbHMpOwogICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4wIC8gKHJvd3MgKiBjb2xzKSwgMC4wMSk7Ci0gIAotICBBLnJlc2l6ZShyb3dzLGNvbHMpOwotICBkQS5yZXNpemUocm93cyxjb2xzKTsKKworICBBLnJlc2l6ZShyb3dzLCBjb2xzKTsKKyAgZEEucmVzaXplKHJvd3MsIGNvbHMpOwogICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgZEEsIEEsIEZvcmNlTm9uWmVyb0RpYWcpOwogICBBLm1ha2VDb21wcmVzc2VkKCk7CiAgIHJldHVybiByb3dzOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLHR5cGVuYW1lIERlbnNlTWF0PgotaW50IGdlbmVyYXRlX3NwYXJzZV9zcXVhcmVfc3ltbWV0cmljX3Byb2JsZW0oTWF0cml4VHlwZSYgQSwgRGVuc2VNYXQmIGRBLCBpbnQgbWF4U2l6ZSA9IDMwMCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBEZW5zZU1hdD4KK2ludCBnZW5lcmF0ZV9zcGFyc2Vfc3F1YXJlX3N5bW1ldHJpY19wcm9ibGVtKE1hdHJpeFR5cGUmIEEsIERlbnNlTWF0JiBkQSwgaW50IG1heFNpemUgPSAzMDApIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICBpbnQgcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhTaXplKTsKICAgaW50IGNvbHMgPSByb3dzOwogICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4wIC8gKHJvd3MgKiBjb2xzKSwgMC4wMSk7Ci0gIAotICBBLnJlc2l6ZShyb3dzLGNvbHMpOwotICBkQS5yZXNpemUocm93cyxjb2xzKTsKKworICBBLnJlc2l6ZShyb3dzLCBjb2xzKTsKKyAgZEEucmVzaXplKHJvd3MsIGNvbHMpOwogICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgZEEsIEEsIEZvcmNlTm9uWmVyb0RpYWcpOwogICBkQSA9IGRBICogZEEudHJhbnNwb3NlKCk7Ci0gIEEgID0gQSAqIEEudHJhbnNwb3NlKCk7CisgIEEgPSBBICogQS50cmFuc3Bvc2UoKTsKICAgQS5tYWtlQ29tcHJlc3NlZCgpOwogICByZXR1cm4gcm93czsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBTb2x2ZXI+IHZvaWQgdGVzdF9hY2NlbGVyYXRlX2xkbHQoKQotewotICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXI+IE1hdHJpeFR5cGU7IAotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKLSAKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFNvbHZlcj4KK3ZvaWQgdGVzdF9hY2NlbGVyYXRlX2xkbHQoKSB7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcj4gTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBEZW5zZVZlY3RvcjsKKwogICBNYXRyaXhUeXBlIEE7Ci0gIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBkQTsKKyAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gZEE7CiAKICAgZ2VuZXJhdGVfc3BhcnNlX3NxdWFyZV9zeW1tZXRyaWNfcHJvYmxlbShBLCBkQSk7CiAKQEAgLTU0LDggKzUyLDcgQEAKICAgU29sdmVyIHNvbHZlcjsKICAgc29sdmVyLmNvbXB1dGUoQSk7CiAKLSAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykKLSAgeworICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKSB7CiAgICAgc3RkOjpjZXJyIDw8ICJzcGFyc2UgTERMVCBmYWN0b3JpemF0aW9uIGZhaWxlZFxuIjsKICAgICBleGl0KDApOwogICAgIHJldHVybjsKQEAgLTYzLDI1ICs2MCwyNCBAQAogCiAgIERlbnNlVmVjdG9yIHggPSBzb2x2ZXIuc29sdmUoYik7CiAKLSAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykKLSAgeworICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKSB7CiAgICAgc3RkOjpjZXJyIDw8ICJzcGFyc2UgTERMVCBmYWN0b3JpemF0aW9uIGZhaWxlZFxuIjsKICAgICBleGl0KDApOwogICAgIHJldHVybjsKICAgfQogCi0gIC8vQ29tcGFyZSB3aXRoIGEgZGVuc2Ugc29sdmVyCisgIC8vIENvbXBhcmUgd2l0aCBhIGRlbnNlIHNvbHZlcgogICBEZW5zZVZlY3RvciByZWZYID0gZEEubGRsdCgpLnNvbHZlKGIpOwogICBWRVJJRlkoKEEgKiB4KS5pc0FwcHJveChBICogcmVmWCwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgU29sdmVyPiB2b2lkIHRlc3RfYWNjZWxlcmF0ZV9sbHQoKQotewotICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXI+IE1hdHJpeFR5cGU7IAotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKLSAKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFNvbHZlcj4KK3ZvaWQgdGVzdF9hY2NlbGVyYXRlX2xsdCgpIHsKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyPiBNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IERlbnNlVmVjdG9yOworCiAgIE1hdHJpeFR5cGUgQTsKLSAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGRBOworICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBkQTsKIAogICBnZW5lcmF0ZV9zcGFyc2Vfc3F1YXJlX3N5bW1ldHJpY19wcm9ibGVtKEEsIGRBKTsKIApAQCAtOTAsOCArODYsNyBAQAogICBTb2x2ZXIgc29sdmVyOwogICBzb2x2ZXIuY29tcHV0ZShBKTsKIAotICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQotICB7CisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpIHsKICAgICBzdGQ6OmNlcnIgPDwgInNwYXJzZSBMTFQgZmFjdG9yaXphdGlvbiBmYWlsZWRcbiI7CiAgICAgZXhpdCgwKTsKICAgICByZXR1cm47CkBAIC05OSwyNSArOTQsMjQgQEAKIAogICBEZW5zZVZlY3RvciB4ID0gc29sdmVyLnNvbHZlKGIpOwogCi0gIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCi0gIHsKKyAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykgewogICAgIHN0ZDo6Y2VyciA8PCAic3BhcnNlIExMVCBmYWN0b3JpemF0aW9uIGZhaWxlZFxuIjsKICAgICBleGl0KDApOwogICAgIHJldHVybjsKICAgfQogCi0gIC8vQ29tcGFyZSB3aXRoIGEgZGVuc2Ugc29sdmVyCisgIC8vIENvbXBhcmUgd2l0aCBhIGRlbnNlIHNvbHZlcgogICBEZW5zZVZlY3RvciByZWZYID0gZEEubGx0KCkuc29sdmUoYik7CiAgIFZFUklGWSgoQSAqIHgpLmlzQXBwcm94KEEgKiByZWZYLCB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBTb2x2ZXI+IHZvaWQgdGVzdF9hY2NlbGVyYXRlX3FyKCkKLXsKLSAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyPiBNYXRyaXhUeXBlOyAKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7Ci0gCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBTb2x2ZXI+Cit2b2lkIHRlc3RfYWNjZWxlcmF0ZV9xcigpIHsKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyPiBNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IERlbnNlVmVjdG9yOworCiAgIE1hdHJpeFR5cGUgQTsKLSAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGRBOworICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBkQTsKIAogICBnZW5lcmF0ZV9zcGFyc2VfcmVjdGFuZ3VsYXJfcHJvYmxlbShBLCBkQSk7CiAKQEAgLTEyNiw4ICsxMjAsNyBAQAogICBTb2x2ZXIgc29sdmVyOwogICBzb2x2ZXIuY29tcHV0ZShBKTsKIAotICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQotICB7CisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpIHsKICAgICBzdGQ6OmNlcnIgPDwgInNwYXJzZSBRUiBmYWN0b3JpemF0aW9uIGZhaWxlZFxuIjsKICAgICBleGl0KDApOwogICAgIHJldHVybjsKQEAgLTEzNSwyMiArMTI4LDIwIEBACiAKICAgRGVuc2VWZWN0b3IgeCA9IHNvbHZlci5zb2x2ZShiKTsKIAotICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQotICB7CisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpIHsKICAgICBzdGQ6OmNlcnIgPDwgInNwYXJzZSBRUiBmYWN0b3JpemF0aW9uIGZhaWxlZFxuIjsKICAgICBleGl0KDApOwogICAgIHJldHVybjsKICAgfQogCi0gIC8vQ29tcGFyZSB3aXRoIGEgZGVuc2Ugc29sdmVyCisgIC8vIENvbXBhcmUgd2l0aCBhIGRlbnNlIHNvbHZlcgogICBEZW5zZVZlY3RvciByZWZYID0gZEEuY29sUGl2SG91c2Vob2xkZXJRcigpLnNvbHZlKGIpOwogICBWRVJJRlkoKEEgKiB4KS5pc0FwcHJveChBICogcmVmWCwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gCi12b2lkIHJ1bl90ZXN0cygpCi17Ci0gIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcj4gTWF0cml4VHlwZTsgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBydW5fdGVzdHMoKSB7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcj4gTWF0cml4VHlwZTsKIAogICB0ZXN0X2FjY2VsZXJhdGVfbGRsdDxTY2FsYXIsIEFjY2VsZXJhdGVMRExUPE1hdHJpeFR5cGUsIExvd2VyPiA+KCk7CiAgIHRlc3RfYWNjZWxlcmF0ZV9sZGx0PFNjYWxhciwgQWNjZWxlcmF0ZUxETFRVbnBpdm90ZWQ8TWF0cml4VHlwZSwgTG93ZXI+ID4oKTsKQEAgLTE2OSw4ICsxNjAsNyBAQAogICB0ZXN0X2FjY2VsZXJhdGVfcXI8U2NhbGFyLCBBY2NlbGVyYXRlUVI8TWF0cml4VHlwZT4gPigpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoYWNjZWxlcmF0ZV9zdXBwb3J0KQoteworRUlHRU5fREVDTEFSRV9URVNUKGFjY2VsZXJhdGVfc3VwcG9ydCkgewogICBDQUxMX1NVQlRFU1RfMShydW5fdGVzdHM8ZmxvYXQ+KCkpOwogICBDQUxMX1NVQlRFU1RfMihydW5fdGVzdHM8ZG91YmxlPigpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvYWRqb2ludC5jcHAgYi90ZXN0L2Fkam9pbnQuY3BwCmluZGV4IDM3ZDIzYjEuLjYzNjY0NzYgMTAwNjQ0Ci0tLSBhL3Rlc3QvYWRqb2ludC5jcHAKKysrIGIvdGVzdC9hZGpvaW50LmNwcApAQCAtOSwzMCArOSwzNSBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi10ZW1wbGF0ZTxib29sIElzSW50ZWdlcj4gc3RydWN0IGFkam9pbnRfc3BlY2lmaWM7Cit0ZW1wbGF0ZSA8Ym9vbCBJc0ludGVnZXI+CitzdHJ1Y3QgYWRqb2ludF9zcGVjaWZpYzsKIAotdGVtcGxhdGU8PiBzdHJ1Y3QgYWRqb2ludF9zcGVjaWZpYzx0cnVlPiB7Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIFZlYywgdHlwZW5hbWUgTWF0LCB0eXBlbmFtZSBTY2FsYXI+Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGFkam9pbnRfc3BlY2lmaWM8dHJ1ZT4geworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjLCB0eXBlbmFtZSBNYXQsIHR5cGVuYW1lIFNjYWxhcj4KICAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFZlYyYgdjEsIGNvbnN0IFZlYyYgdjIsIFZlYyYgdjMsIGNvbnN0IE1hdCYgc3F1YXJlLCBTY2FsYXIgczEsIFNjYWxhciBzMikgewotICAgIFZFUklGWSh0ZXN0X2lzQXBwcm94V2l0aFJlZigoczEgKiB2MSArIHMyICogdjIpLmRvdCh2MyksICAgICBudW1leHQ6OmNvbmooczEpICogdjEuZG90KHYzKSArIG51bWV4dDo6Y29uaihzMikgKiB2Mi5kb3QodjMpLCAwKSk7Ci0gICAgVkVSSUZZKHRlc3RfaXNBcHByb3hXaXRoUmVmKHYzLmRvdChzMSAqIHYxICsgczIgKiB2MiksICAgICAgIHMxKnYzLmRvdCh2MSkrczIqdjMuZG90KHYyKSwgMCkpOwotICAgIAorICAgIFZFUklGWSh0ZXN0X2lzQXBwcm94V2l0aFJlZigoczEgKiB2MSArIHMyICogdjIpLmRvdCh2MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWV4dDo6Y29uaihzMSkgKiB2MS5kb3QodjMpICsgbnVtZXh0Ojpjb25qKHMyKSAqIHYyLmRvdCh2MyksIDApKTsKKyAgICBWRVJJRlkodGVzdF9pc0FwcHJveFdpdGhSZWYodjMuZG90KHMxICogdjEgKyBzMiAqIHYyKSwgczEgKiB2My5kb3QodjEpICsgczIgKiB2My5kb3QodjIpLCAwKSk7CisKICAgICAvLyBjaGVjayBjb21wYXRpYmlsaXR5IG9mIGRvdCBhbmQgYWRqb2ludAogICAgIFZFUklGWSh0ZXN0X2lzQXBwcm94V2l0aFJlZih2MS5kb3Qoc3F1YXJlICogdjIpLCAoc3F1YXJlLmFkam9pbnQoKSAqIHYxKS5kb3QodjIpLCAwKSk7CiAgIH0KIH07CiAKLXRlbXBsYXRlPD4gc3RydWN0IGFkam9pbnRfc3BlY2lmaWM8ZmFsc2U+IHsKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVmVjLCB0eXBlbmFtZSBNYXQsIHR5cGVuYW1lIFNjYWxhcj4KK3RlbXBsYXRlIDw+CitzdHJ1Y3QgYWRqb2ludF9zcGVjaWZpYzxmYWxzZT4geworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjLCB0eXBlbmFtZSBNYXQsIHR5cGVuYW1lIFNjYWxhcj4KICAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFZlYyYgdjEsIGNvbnN0IFZlYyYgdjIsIFZlYyYgdjMsIGNvbnN0IE1hdCYgc3F1YXJlLCBTY2FsYXIgczEsIFNjYWxhciBzMikgewogICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKICAgICB1c2luZyBzdGQ6OmFiczsKLSAgICAKLSAgICBSZWFsU2NhbGFyIHJlZiA9IE51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIgPyBSZWFsU2NhbGFyKDApIDogKHN0ZDo6bWF4KSgoczEgKiB2MSArIHMyICogdjIpLm5vcm0oKSx2My5ub3JtKCkpOwotICAgIFZFUklGWSh0ZXN0X2lzQXBwcm94V2l0aFJlZigoczEgKiB2MSArIHMyICogdjIpLmRvdCh2MyksICAgICBudW1leHQ6OmNvbmooczEpICogdjEuZG90KHYzKSArIG51bWV4dDo6Y29uaihzMikgKiB2Mi5kb3QodjMpLCByZWYpKTsKLSAgICBWRVJJRlkodGVzdF9pc0FwcHJveFdpdGhSZWYodjMuZG90KHMxICogdjEgKyBzMiAqIHYyKSwgICAgICAgczEqdjMuZG90KHYxKStzMip2My5kb3QodjIpLCByZWYpKTsKLSAgCi0gICAgVkVSSUZZX0lTX0FQUFJPWCh2MS5zcXVhcmVkTm9ybSgpLCAgICAgICAgICAgICAgICB2MS5ub3JtKCkgKiB2MS5ub3JtKCkpOworCisgICAgUmVhbFNjYWxhciByZWYgPSBOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyID8gUmVhbFNjYWxhcigwKSA6IChzdGQ6Om1heCkoKHMxICogdjEgKyBzMiAqIHYyKS5ub3JtKCksIHYzLm5vcm0oKSk7CisgICAgVkVSSUZZKHRlc3RfaXNBcHByb3hXaXRoUmVmKChzMSAqIHYxICsgczIgKiB2MikuZG90KHYzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXh0Ojpjb25qKHMxKSAqIHYxLmRvdCh2MykgKyBudW1leHQ6OmNvbmooczIpICogdjIuZG90KHYzKSwgcmVmKSk7CisgICAgVkVSSUZZKHRlc3RfaXNBcHByb3hXaXRoUmVmKHYzLmRvdChzMSAqIHYxICsgczIgKiB2MiksIHMxICogdjMuZG90KHYxKSArIHMyICogdjMuZG90KHYyKSwgcmVmKSk7CisKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxLnNxdWFyZWROb3JtKCksIHYxLm5vcm0oKSAqIHYxLm5vcm0oKSk7CiAgICAgLy8gY2hlY2sgbm9ybWFsaXplZCgpIGFuZCBub3JtYWxpemUoKQogICAgIFZFUklGWV9JU19BUFBST1godjEsIHYxLm5vcm0oKSAqIHYxLm5vcm1hbGl6ZWQoKSk7CiAgICAgdjMgPSB2MTsKQEAgLTQyLDM5ICs0Nyw0MiBAQAogICAgIFZFUklGWV9JU19BUFBST1godjMubm9ybSgpLCBSZWFsU2NhbGFyKDEpKTsKIAogICAgIC8vIGNoZWNrIG51bGwgaW5wdXRzCi0gICAgVkVSSUZZX0lTX0FQUFJPWCgodjEqMCkubm9ybWFsaXplZCgpLCAodjEqMCkpOworICAgIFZFUklGWV9JU19BUFBST1goKHYxICogMCkubm9ybWFsaXplZCgpLCAodjEgKiAwKSk7CiAjaWYgKCFFSUdFTl9BUkNIX2kzODYpIHx8IGRlZmluZWQoRUlHRU5fVkVDVE9SSVpFKQogICAgIFJlYWxTY2FsYXIgdmVyeV9zbWFsbCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCk7Ci0gICAgVkVSSUZZKCBudW1leHQ6OmlzX2V4YWN0bHlfemVybygodjEqdmVyeV9zbWFsbCkubm9ybSgpKSApOwotICAgIFZFUklGWV9JU19BUFBST1goKHYxKnZlcnlfc21hbGwpLm5vcm1hbGl6ZWQoKSwgKHYxKnZlcnlfc21hbGwpKTsKLSAgICB2MyA9IHYxKnZlcnlfc21hbGw7CisgICAgVkVSSUZZKG51bWV4dDo6aXNfZXhhY3RseV96ZXJvKCh2MSAqIHZlcnlfc21hbGwpLm5vcm0oKSkpOworICAgIFZFUklGWV9JU19BUFBST1goKHYxICogdmVyeV9zbWFsbCkubm9ybWFsaXplZCgpLCAodjEgKiB2ZXJ5X3NtYWxsKSk7CisgICAgdjMgPSB2MSAqIHZlcnlfc21hbGw7CiAgICAgdjMubm9ybWFsaXplKCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCh2MywgKHYxKnZlcnlfc21hbGwpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYzLCAodjEgKiB2ZXJ5X3NtYWxsKSk7CiAjZW5kaWYKLSAgICAKKwogICAgIC8vIGNoZWNrIGNvbXBhdGliaWxpdHkgb2YgZG90IGFuZCBhZGpvaW50Ci0gICAgcmVmID0gTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlciA/IDAgOiAoc3RkOjptYXgpKChzdGQ6Om1heCkodjEubm9ybSgpLHYyLm5vcm0oKSksKHN0ZDo6bWF4KSgoc3F1YXJlICogdjIpLm5vcm0oKSwoc3F1YXJlLmFkam9pbnQoKSAqIHYxKS5ub3JtKCkpKTsKLSAgICBWRVJJRlkoaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGFicyh2MS5kb3Qoc3F1YXJlICogdjIpIC0gKHNxdWFyZS5hZGpvaW50KCkgKiB2MSkuZG90KHYyKSksIHJlZiwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7Ci0gICAgCisgICAgcmVmID0gTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlciA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHN0ZDo6bWF4KSgoc3RkOjptYXgpKHYxLm5vcm0oKSwgdjIubm9ybSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RkOjptYXgpKChzcXVhcmUgKiB2Mikubm9ybSgpLCAoc3F1YXJlLmFkam9pbnQoKSAqIHYxKS5ub3JtKCkpKTsKKyAgICBWRVJJRlkoaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGFicyh2MS5kb3Qoc3F1YXJlICogdjIpIC0gKHNxdWFyZS5hZGpvaW50KCkgKiB2MSkuZG90KHYyKSksIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOworCiAgICAgLy8gY2hlY2sgdGhhdCBSYW5kb20oKS5ub3JtYWxpemVkKCkgd29ya3M6IHRyaWNreSBhcyB0aGUgcmFuZG9tIHhwciBtdXN0IGJlIGV2YWx1YXRlZCBieQogICAgIC8vIG5vcm1hbGl6ZWQoKSBpbiBvcmRlciB0byBwcm9kdWNlIGEgY29uc2lzdGVudCByZXN1bHQuCiAgICAgVkVSSUZZX0lTX0FQUFJPWChWZWM6OlJhbmRvbSh2MS5zaXplKCkpLm5vcm1hbGl6ZWQoKS5ub3JtKCksIFJlYWxTY2FsYXIoMSkpOwogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBTY2FsYXIgPSB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgU2NhbGFyID0gdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPgogTWF0cml4VHlwZSBSYW5kb21NYXRyaXgoSW5kZXggcm93cywgSW5kZXggY29scywgU2NhbGFyIG1pbiwgU2NhbGFyIG1heCkgewogICBNYXRyaXhUeXBlIE0gPSBNYXRyaXhUeXBlKHJvd3MsIGNvbHMpOwotICBmb3IgKEluZGV4IGk9MDsgaTxyb3dzOyArK2kpIHsKLSAgICBmb3IgKEluZGV4IGo9MDsgajxjb2xzOyArK2opIHsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IHJvd3M7ICsraSkgeworICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBjb2xzOyArK2opIHsKICAgICAgIE0oaSwgaikgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KG1pbiwgbWF4KTsKICAgICB9CiAgIH0KICAgcmV0dXJuIE07CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgYWRqb2ludChjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGFkam9pbnQoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CiAgICAgIFRyYW5zcG9zZS5oIENvbmp1Z2F0ZS5oIERvdC5oCiAgICovCkBAIC04NCw3ICs5Miw3IEBACiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBTcXVhcmVNYXRyaXhUeXBlOwogICBjb25zdCBJbmRleCBQYWNrZXRTaXplID0gaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZTsKLSAgCisKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKQEAgLTkzLDc5ICsxMDEsNzMgQEAKICAgUmVhbFNjYWxhciBybWF4ID0gc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlciA/IDEwMCA6IDEpOwogCiAgIE1hdHJpeFR5cGUgbTEgPSBSYW5kb21NYXRyaXg8TWF0cml4VHlwZT4ocm93cywgY29scywgcm1pbiwgcm1heCksCi0gICAgICAgICAgICAgbTIgPSBSYW5kb21NYXRyaXg8TWF0cml4VHlwZT4ocm93cywgY29scywgcm1pbiwgcm1heCksCi0gICAgICAgICAgICAgbTMocm93cywgY29scyksCisgICAgICAgICAgICAgbTIgPSBSYW5kb21NYXRyaXg8TWF0cml4VHlwZT4ocm93cywgY29scywgcm1pbiwgcm1heCksIG0zKHJvd3MsIGNvbHMpLAogICAgICAgICAgICAgIHNxdWFyZSA9IFJhbmRvbU1hdHJpeDxTcXVhcmVNYXRyaXhUeXBlPihyb3dzLCByb3dzLCBybWluLCBybWF4KTsKLSAgVmVjdG9yVHlwZSB2MSA9IFJhbmRvbU1hdHJpeDxWZWN0b3JUeXBlPihyb3dzLCAxLCBybWluLCBybWF4KSwKLSAgICAgICAgICAgICB2MiA9IFJhbmRvbU1hdHJpeDxWZWN0b3JUeXBlPihyb3dzLCAxLCBybWluLCBybWF4KSwKLSAgICAgICAgICAgICB2MyA9IFJhbmRvbU1hdHJpeDxWZWN0b3JUeXBlPihyb3dzLCAxLCBybWluLCBybWF4KSwKLSAgICAgICAgICAgICB2emVybyA9IFZlY3RvclR5cGU6Olplcm8ocm93cyk7CisgIFZlY3RvclR5cGUgdjEgPSBSYW5kb21NYXRyaXg8VmVjdG9yVHlwZT4ocm93cywgMSwgcm1pbiwgcm1heCksIHYyID0gUmFuZG9tTWF0cml4PFZlY3RvclR5cGU+KHJvd3MsIDEsIHJtaW4sIHJtYXgpLAorICAgICAgICAgICAgIHYzID0gUmFuZG9tTWF0cml4PFZlY3RvclR5cGU+KHJvd3MsIDEsIHJtaW4sIHJtYXgpLCB2emVybyA9IFZlY3RvclR5cGU6Olplcm8ocm93cyk7CiAKLSAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KHJtaW4sIHJtYXgpLAotICAgICAgICAgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4ocm1pbiwgcm1heCk7CisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPihybWluLCBybWF4KSwgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4ocm1pbiwgcm1heCk7CiAKICAgLy8gY2hlY2sgYmFzaWMgY29tcGF0aWJpbGl0eSBvZiBhZGpvaW50LCB0cmFuc3Bvc2UsIGNvbmp1Z2F0ZQotICBWRVJJRllfSVNfQVBQUk9YKG0xLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpLmFkam9pbnQoKSwgICAgbTEpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLmFkam9pbnQoKS5jb25qdWdhdGUoKS50cmFuc3Bvc2UoKSwgICAgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpLmFkam9pbnQoKSwgbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmFkam9pbnQoKS5jb25qdWdhdGUoKS50cmFuc3Bvc2UoKSwgbTEpOwogCiAgIC8vIGNoZWNrIG11bHRpcGxpY2F0aXZlIGJlaGF2aW9yCi0gIFZFUklGWV9JU19BUFBST1goKG0xLmFkam9pbnQoKSAqIG0yKS5hZGpvaW50KCksICAgICAgICAgICBtMi5hZGpvaW50KCkgKiBtMSk7Ci0gIFZFUklGWV9JU19BUFBST1goKHMxICogbTEpLmFkam9pbnQoKSwgICAgICAgICAgICAgICAgICAgICBudW1leHQ6OmNvbmooczEpICogbTEuYWRqb2ludCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEuYWRqb2ludCgpICogbTIpLmFkam9pbnQoKSwgbTIuYWRqb2ludCgpICogbTEpOworICBWRVJJRllfSVNfQVBQUk9YKChzMSAqIG0xKS5hZGpvaW50KCksIG51bWV4dDo6Y29uaihzMSkgKiBtMS5hZGpvaW50KCkpOwogCiAgIC8vIGNoZWNrIGJhc2ljIHByb3BlcnRpZXMgb2YgZG90LCBzcXVhcmVkTm9ybQotICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6Y29uaih2MS5kb3QodjIpKSwgICAgICAgICAgICAgICB2Mi5kb3QodjEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnJlYWwodjEuZG90KHYxKSksICAgICAgICAgICAgICAgdjEuc3F1YXJlZE5vcm0oKSk7Ci0gIAorICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6Y29uaih2MS5kb3QodjIpKSwgdjIuZG90KHYxKSk7CisgIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpyZWFsKHYxLmRvdCh2MSkpLCB2MS5zcXVhcmVkTm9ybSgpKTsKKwogICBhZGpvaW50X3NwZWNpZmljPE51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXI+OjpydW4odjEsIHYyLCB2Mywgc3F1YXJlLCBzMSwgczIpOwotICAKLSAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGFicyh2emVyby5kb3QodjEpKSwgIHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KDEpKTsKLSAgCisKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGFicyh2emVyby5kb3QodjEpKSwgc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oMSkpOworCiAgIC8vIGxpa2UgaW4gdGVzdEJhc2ljU3R1ZmYsIHRlc3Qgb3BlcmF0b3IoKSB0byBjaGVjayBjb25zdC1xdWFsaWZpY2F0aW9uCi0gIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpLAotICAgICAgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEuY29uanVnYXRlKCkocixjKSwgbnVtZXh0Ojpjb25qKG0xKHIsYykpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS5hZGpvaW50KCkoYyxyKSwgbnVtZXh0Ojpjb25qKG0xKHIsYykpKTsKKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAxKSwgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb25qdWdhdGUoKShyLCBjKSwgbnVtZXh0Ojpjb25qKG0xKHIsIGMpKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYWRqb2ludCgpKGMsIHIpLCBudW1leHQ6OmNvbmoobTEociwgYykpKTsKIAogICAvLyBjaGVjayBpbnBsYWNlIHRyYW5zcG9zZQogICBtMyA9IG0xOwogICBtMy50cmFuc3Bvc2VJblBsYWNlKCk7Ci0gIFZFUklGWV9JU19BUFBST1gobTMsbTEudHJhbnNwb3NlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMS50cmFuc3Bvc2UoKSk7CiAgIG0zLnRyYW5zcG9zZUluUGxhY2UoKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMSk7Ci0gIAotICBpZihQYWNrZXRTaXplPG0zLnJvd3MoKSAmJiBQYWNrZXRTaXplPG0zLmNvbHMoKSkKLSAgeworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMSk7CisKKyAgaWYgKFBhY2tldFNpemUgPCBtMy5yb3dzKCkgJiYgUGFja2V0U2l6ZSA8IG0zLmNvbHMoKSkgewogICAgIG0zID0gbTE7Ci0gICAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsbTMucm93cygpLVBhY2tldFNpemUpOwotICAgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0zLmNvbHMoKS1QYWNrZXRTaXplKTsKLSAgICBtMy50ZW1wbGF0ZSBibG9jazxQYWNrZXRTaXplLFBhY2tldFNpemU+KGksaikudHJhbnNwb3NlSW5QbGFjZSgpOwotICAgIFZFUklGWV9JU19BUFBST1goIChtMy50ZW1wbGF0ZSBibG9jazxQYWNrZXRTaXplLFBhY2tldFNpemU+KGksaikpLCAobTEudGVtcGxhdGUgYmxvY2s8UGFja2V0U2l6ZSxQYWNrZXRTaXplPihpLGopLnRyYW5zcG9zZSgpKSApOwotICAgIG0zLnRlbXBsYXRlIGJsb2NrPFBhY2tldFNpemUsUGFja2V0U2l6ZT4oaSxqKS50cmFuc3Bvc2VJblBsYWNlKCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMSk7CisgICAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIG0zLnJvd3MoKSAtIFBhY2tldFNpemUpOworICAgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBtMy5jb2xzKCkgLSBQYWNrZXRTaXplKTsKKyAgICBtMy50ZW1wbGF0ZSBibG9jazxQYWNrZXRTaXplLCBQYWNrZXRTaXplPihpLCBqKS50cmFuc3Bvc2VJblBsYWNlKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgobTMudGVtcGxhdGUgYmxvY2s8UGFja2V0U2l6ZSwgUGFja2V0U2l6ZT4oaSwgaikpLAorICAgICAgICAgICAgICAgICAgICAgKG0xLnRlbXBsYXRlIGJsb2NrPFBhY2tldFNpemUsIFBhY2tldFNpemU+KGksIGopLnRyYW5zcG9zZSgpKSk7CisgICAgbTMudGVtcGxhdGUgYmxvY2s8UGFja2V0U2l6ZSwgUGFja2V0U2l6ZT4oaSwgaikudHJhbnNwb3NlSW5QbGFjZSgpOworICAgIFZFUklGWV9JU19BUFBST1gobTMsIG0xKTsKICAgfQogCiAgIC8vIGNoZWNrIGlucGxhY2UgYWRqb2ludAogICBtMyA9IG0xOwogICBtMy5hZGpvaW50SW5QbGFjZSgpOwotICBWRVJJRllfSVNfQVBQUk9YKG0zLG0xLmFkam9pbnQoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xLmFkam9pbnQoKSk7CiAgIG0zLnRyYW5zcG9zZUluUGxhY2UoKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMS5jb25qdWdhdGUoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xLmNvbmp1Z2F0ZSgpKTsKIAogICAvLyBjaGVjayBtaXhlZCBkb3QgcHJvZHVjdAogICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gUmVhbFZlY3RvclR5cGU7CiAgIFJlYWxWZWN0b3JUeXBlIHJ2MSA9IFJhbmRvbU1hdHJpeDxSZWFsVmVjdG9yVHlwZT4ocm93cywgMSwgcm1pbiwgcm1heCk7Ci0gIAorCiAgIFZFUklGWV9JU19BUFBST1godjEuZG90KHJ2MS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSksIHYxLmRvdChydjEpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChydjEudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCkuZG90KHYxKSwgcnYxLmRvdCh2MSkpOwogCi0gIFZFUklGWSggaXNfc2FtZV90eXBlKG0xLG0xLnRlbXBsYXRlIGNvbmp1Z2F0ZUlmPGZhbHNlPigpKSApOwotICBWRVJJRlkoIGlzX3NhbWVfdHlwZShtMS5jb25qdWdhdGUoKSxtMS50ZW1wbGF0ZSBjb25qdWdhdGVJZjx0cnVlPigpKSApOworICBWRVJJRlkoaXNfc2FtZV90eXBlKG0xLCBtMS50ZW1wbGF0ZSBjb25qdWdhdGVJZjxmYWxzZT4oKSkpOworICBWRVJJRlkoaXNfc2FtZV90eXBlKG0xLmNvbmp1Z2F0ZSgpLCBtMS50ZW1wbGF0ZSBjb25qdWdhdGVJZjx0cnVlPigpKSk7CiB9CiAKLXRlbXBsYXRlPGludD4KLXZvaWQgYWRqb2ludF9leHRyYSgpCi17Ci0gIE1hdHJpeFhjZiBhKDEwLDEwKSwgYigxMCwxMCk7Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCBhZGpvaW50X2V4dHJhKCkgeworICBNYXRyaXhYY2YgYSgxMCwgMTApLCBiKDEwLCAxMCk7CiAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGEgPSBhLnRyYW5zcG9zZSgpKTsKICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoYSA9IGEudHJhbnNwb3NlKCkgKyBiKTsKICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoYSA9IGIgKyBhLnRyYW5zcG9zZSgpKTsKQEAgLTE4MywxMSArMTg1LDExIEBACiAgIGEudHJhbnNwb3NlKCkgKz0gYS5hZGpvaW50KCkgKyBiOwogCiAgIC8vIHJlZ3Jlc3Npb24gdGVzdHMgZm9yIGNoZWNrX2Zvcl9hbGlhc2luZwotICBNYXRyaXhYZCBjKDEwLDEwKTsKLSAgYyA9IDEuMCAqIE1hdHJpeFhkOjpPbmVzKDEwLDEwKSArIGM7Ci0gIGMgPSBNYXRyaXhYZDo6T25lcygxMCwxMCkgKiAxLjAgKyBjOwotICBjID0gYyArIE1hdHJpeFhkOjpPbmVzKDEwLDEwKSAuY3dpc2VQcm9kdWN0KCBNYXRyaXhYZDo6WmVybygxMCwxMCkgKTsKLSAgYyA9IE1hdHJpeFhkOjpPbmVzKDEwLDEwKSAqIE1hdHJpeFhkOjpaZXJvKDEwLDEwKTsKKyAgTWF0cml4WGQgYygxMCwgMTApOworICBjID0gMS4wICogTWF0cml4WGQ6Ok9uZXMoMTAsIDEwKSArIGM7CisgIGMgPSBNYXRyaXhYZDo6T25lcygxMCwgMTApICogMS4wICsgYzsKKyAgYyA9IGMgKyBNYXRyaXhYZDo6T25lcygxMCwgMTApLmN3aXNlUHJvZHVjdChNYXRyaXhYZDo6WmVybygxMCwgMTApKTsKKyAgYyA9IE1hdHJpeFhkOjpPbmVzKDEwLCAxMCkgKiBNYXRyaXhYZDo6WmVybygxMCwgMTApOwogCiAgIC8vIHJlZ3Jlc3Npb24gZm9yIGJ1ZyAxNjQ2CiAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7ICsraikgewpAQCAtMTk4LDM2ICsyMDAsMzcgQEAKICAgICBjLmNvbChqKSA9IGMucm93KGopOwogICB9CiAKLSAgYS5jb25zZXJ2YXRpdmVSZXNpemUoMSwxKTsKKyAgYS5jb25zZXJ2YXRpdmVSZXNpemUoMSwgMSk7CiAgIGEgPSBhLnRyYW5zcG9zZSgpOwogCi0gIGEuY29uc2VydmF0aXZlUmVzaXplKDAsMCk7CisgIGEuY29uc2VydmF0aXZlUmVzaXplKDAsIDApOwogICBhID0gYS50cmFuc3Bvc2UoKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGFkam9pbnQpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGFkam9pbnQoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBhZGpvaW50KE1hdHJpeDNkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGFkam9pbnQoTWF0cml4NGYoKSkgKTsKLSAgICAKLSAgICBDQUxMX1NVQlRFU1RfNCggYWRqb2ludChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIGFkam9pbnQoTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggYWRqb2ludChNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIAorRUlHRU5fREVDTEFSRV9URVNUKGFkam9pbnQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoYWRqb2ludChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihhZGpvaW50KE1hdHJpeDNkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhhZGpvaW50KE1hdHJpeDRmKCkpKTsKKworICAgIENBTExfU1VCVEVTVF80KGFkam9pbnQoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShhZGpvaW50KAorICAgICAgICBNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNihhZGpvaW50KAorICAgICAgICBNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKwogICAgIC8vIENvbXBsZW1lbnQgZm9yIDEyOCBiaXRzIHZlY3Rvcml6YXRpb246Ci0gICAgQ0FMTF9TVUJURVNUXzgoIGFkam9pbnQoTWF0cml4MmQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOSggYWRqb2ludChNYXRyaXg8aW50LDQsND4oKSkgKTsKLSAgICAKKyAgICBDQUxMX1NVQlRFU1RfOChhZGpvaW50KE1hdHJpeDJkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfOShhZGpvaW50KE1hdHJpeDxpbnQsIDQsIDQ+KCkpKTsKKwogICAgIC8vIDI1NiBiaXRzIHZlY3Rvcml6YXRpb246Ci0gICAgQ0FMTF9TVUJURVNUXzEwKCBhZGpvaW50KE1hdHJpeDxmbG9hdCw4LDg+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzExKCBhZGpvaW50KE1hdHJpeDxkb3VibGUsNCw0PigpKSApOwotICAgIENBTExfU1VCVEVTVF8xMiggYWRqb2ludChNYXRyaXg8aW50LDgsOD4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMTAoYWRqb2ludChNYXRyaXg8ZmxvYXQsIDgsIDg+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTEoYWRqb2ludChNYXRyaXg8ZG91YmxlLCA0LCA0PigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEyKGFkam9pbnQoTWF0cml4PGludCwgOCwgOD4oKSkpOwogICB9CiAgIC8vIHRlc3QgYSBsYXJnZSBzdGF0aWMgbWF0cml4IG9ubHkgb25jZQotICBDQUxMX1NVQlRFU1RfNyggYWRqb2ludChNYXRyaXg8ZmxvYXQsIDEwMCwgMTAwPigpKSApOworICBDQUxMX1NVQlRFU1RfNyhhZGpvaW50KE1hdHJpeDxmbG9hdCwgMTAwLCAxMDA+KCkpKTsKIAotICBDQUxMX1NVQlRFU1RfMTMoIGFkam9pbnRfZXh0cmE8MD4oKSApOworICBDQUxMX1NVQlRFU1RfMTMoYWRqb2ludF9leHRyYTwwPigpKTsKIH0KLQpkaWZmIC0tZ2l0IGEvdGVzdC9hcnJheV9jd2lzZS5jcHAgYi90ZXN0L2FycmF5X2N3aXNlLmNwcAppbmRleCA5YjYyOTY5Li4wY2ZlYThiIDEwMDY0NAotLS0gYS90ZXN0L2FycmF5X2N3aXNlLmNwcAorKysgYi90ZXN0L2FycmF5X2N3aXNlLmNwcApAQCAtMjUsNyArMjUsNyBAQAogICByZXR1cm4gbmVnYXRpdmVfb3JfemVyb19pbXBsPFNjYWxhcj46OnJ1bihhKTsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgc3RkOjplbmFibGVfaWZfdDxOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyLGludD4gPSAwPgordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgc3RkOjplbmFibGVfaWZfdDxOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyLCBpbnQ+ID0gMD4KIHN0ZDo6dmVjdG9yPFNjYWxhcj4gc3BlY2lhbF92YWx1ZXMoKSB7CiAgIGNvbnN0IFNjYWxhciB6ZXJvID0gU2NhbGFyKDApOwogICBjb25zdCBTY2FsYXIgb25lID0gU2NhbGFyKDEpOwpAQCAtMzMsNyArMzMsNyBAQAogICBjb25zdCBTY2FsYXIgdGhyZWUgPSBTY2FsYXIoMyk7CiAgIGNvbnN0IFNjYWxhciBtaW4gPSAoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptaW4pKCk7CiAgIGNvbnN0IFNjYWxhciBtYXggPSAoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptYXgpKCk7Ci0gIHJldHVybiB7IHplcm8sIG1pbiwgb25lLCB0d28sIHRocmVlLCBtYXggfTsKKyAgcmV0dXJuIHt6ZXJvLCBtaW4sIG9uZSwgdHdvLCB0aHJlZSwgbWF4fTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgc3RkOjplbmFibGVfaWZfdDwhTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlciwgaW50PiA9IDA+CkBAIC00NCwyMiArNDQsMjEgQEAKICAgY29uc3QgU2NhbGFyIHR3byA9IFNjYWxhcigyKTsKICAgY29uc3QgU2NhbGFyIHRocmVlID0gU2NhbGFyKDMpOwogICBjb25zdCBTY2FsYXIgc3FydF9oYWxmID0gU2NhbGFyKHN0ZDo6c3FydCgwLjUpKTsKLSAgY29uc3QgU2NhbGFyIHNxcnQyID0gU2NhbGFyKHN0ZDo6c3FydCgyKSk7ICAgIAorICBjb25zdCBTY2FsYXIgc3FydDIgPSBTY2FsYXIoc3RkOjpzcXJ0KDIpKTsKICAgY29uc3QgU2NhbGFyIGluZiA9IEVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6aW5maW5pdHkoKTsKICAgY29uc3QgU2NhbGFyIG5hbiA9IEVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6cXVpZXRfTmFOKCk7CiAgIGNvbnN0IFNjYWxhciBkZW5vcm1fbWluID0gRUlHRU5fQVJDSF9BUk0gPyB6ZXJvIDogc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjpkZW5vcm1fbWluKCk7CiAgIGNvbnN0IFNjYWxhciBtaW4gPSAoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptaW4pKCk7CiAgIGNvbnN0IFNjYWxhciBtYXggPSAoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptYXgpKCk7CiAgIGNvbnN0IFNjYWxhciBtYXhfZXhwID0gKHN0YXRpY19jYXN0PFNjYWxhcj4oaW50KEVpZ2VuOjpOdW1UcmFpdHM8U2NhbGFyPjo6bWF4X2V4cG9uZW50KCkpKSAqIFNjYWxhcihFSUdFTl9MTjIpKSAvIGVwczsKLSAgcmV0dXJuIHsgemVybywgZGVub3JtX21pbiwgbWluLCBlcHMsIHNxcnRfaGFsZiwgb25lLCBzcXJ0MiwgdHdvLCB0aHJlZSwgbWF4X2V4cCwgbWF4LCBpbmYsIG5hbiB9OworICByZXR1cm4ge3plcm8sIGRlbm9ybV9taW4sIG1pbiwgZXBzLCBzcXJ0X2hhbGYsIG9uZSwgc3FydDIsIHR3bywgdGhyZWUsIG1heF9leHAsIG1heCwgaW5mLCBuYW59OwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIHNwZWNpYWxfdmFsdWVfcGFpcnMoQXJyYXk8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiYgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheTxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+JiB5KSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBzcGVjaWFsX3ZhbHVlX3BhaXJzKEFycmF5PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4mIHgsIEFycmF5PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4mIHkpIHsKICAgc3RkOjp2ZWN0b3I8U2NhbGFyPiBhYnNfdmFscyA9IHNwZWNpYWxfdmFsdWVzPFNjYWxhcj4oKTsKICAgY29uc3QgSW5kZXggYWJzX2Nhc2VzID0gKEluZGV4KWFic192YWxzLnNpemUoKTsKLSAgY29uc3QgSW5kZXggbnVtX2Nhc2VzID0gMiphYnNfY2FzZXMgKiAyKmFic19jYXNlczsKKyAgY29uc3QgSW5kZXggbnVtX2Nhc2VzID0gMiAqIGFic19jYXNlcyAqIDIgKiBhYnNfY2FzZXM7CiAgIC8vIGVuc3VyZSBib3RoIHZlY3Rvcml6ZWQgYW5kIG5vbi12ZWN0b3JpemVkIHBhdGhzIHRha2VuCiAgIGNvbnN0IEluZGV4IG51bV9yZXBlYXRzID0gMiAqIChJbmRleClpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplICsgMTsKICAgeC5yZXNpemUobnVtX3JlcGVhdHMsIG51bV9jYXNlcyk7CkBAIC05NSwzMCArOTQsMzAgQEAKICAgYm9vbCBhbGxfcGFzcyA9IHRydWU7CiAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBsaHMucm93cygpOyArK2kpIHsKICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbGhzLmNvbHMoKTsgKytqKSB7Ci0gICAgICBTY2FsYXIgZSA9IHN0YXRpY19jYXN0PFNjYWxhcj4ocmVmKGxocyhpLGopLCByaHMoaSxqKSkpOworICAgICAgU2NhbGFyIGUgPSBzdGF0aWNfY2FzdDxTY2FsYXI+KHJlZihsaHMoaSwgaiksIHJocyhpLCBqKSkpOwogICAgICAgU2NhbGFyIGEgPSBhY3R1YWwoaSwgaik7Ci0gICAgICAjaWYgRUlHRU5fQVJDSF9BUk0KKyNpZiBFSUdFTl9BUkNIX0FSTQogICAgICAgLy8gV29yayBhcm91bmQgTkVPTiBmbHVzaC10by16ZXJvIG1vZGUKICAgICAgIC8vIGlmIHJlZiByZXR1cm5zIGRlbm9ybWFsaXplZCB2YWx1ZSBhbmQgRWlnZW4gcmV0dXJucyAwLCB0aGVuIHNraXAgdGhlIHRlc3QKICAgICAgIGludCByZWZfZnBjbGFzcyA9IHN0ZDo6ZnBjbGFzc2lmeShlKTsKICAgICAgIGlmIChhID09IFNjYWxhcigwKSAmJiByZWZfZnBjbGFzcyA9PSBGUF9TVUJOT1JNQUwpIGNvbnRpbnVlOwotICAgICAgI2VuZGlmCi0gICAgICBib29sIHN1Y2Nlc3MgPSAoYT09ZSkgfHwgKChudW1leHQ6OmlzZmluaXRlKShlKSAmJiBpbnRlcm5hbDo6aXNBcHByb3goYSwgZSwgdG9sKSkgfHwgKChudW1leHQ6OmlzbmFuKShhKSAmJiAobnVtZXh0Ojppc25hbikoZSkpOworI2VuZGlmCisgICAgICBib29sIHN1Y2Nlc3MgPSAoYSA9PSBlKSB8fCAoKG51bWV4dDo6aXNmaW5pdGUpKGUpICYmIGludGVybmFsOjppc0FwcHJveChhLCBlLCB0b2wpKSB8fAorICAgICAgICAgICAgICAgICAgICAgKChudW1leHQ6OmlzbmFuKShhKSAmJiAobnVtZXh0Ojppc25hbikoZSkpOwogICAgICAgaWYgKChhID09IGEpICYmIChlID09IGUpKSBzdWNjZXNzICY9IChib29sKW51bWV4dDo6c2lnbmJpdChlKSA9PSAoYm9vbCludW1leHQ6OnNpZ25iaXQoYSk7CiAgICAgICBhbGxfcGFzcyAmPSBzdWNjZXNzOwogICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCBuYW1lIDw8ICIoIiA8PCBsaHMoaSxqKSA8PCAiLCIgPDwgcmhzKGksaikgPDwgIikgPSAiIDw8IGEgPDwgIiAhPSAgIiA8PCBlIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8IG5hbWUgPDwgIigiIDw8IGxocyhpLCBqKSA8PCAiLCIgPDwgcmhzKGksIGopIDw8ICIpID0gIiA8PCBhIDw8ICIgIT0gICIgPDwgZSA8PCBzdGQ6OmVuZGw7CiAgICAgICB9CiAgICAgfQogICB9CiAgIFZFUklGWShhbGxfcGFzcyk7CiB9CiAKLSNkZWZpbmUgQklOQVJZX0ZVTkNUT1JfVEVTVF9BUkdTKGZ1bikgI2Z1biwgXAotICAgICAgW10oY29uc3QgYXV0byYgeF8sIGNvbnN0IGF1dG8mIHlfKSB7IHJldHVybiAoRWlnZW46OmZ1bikoeF8sIHlfKTsgfSwgICAgXAorI2RlZmluZSBCSU5BUllfRlVOQ1RPUl9URVNUX0FSR1MoZnVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICNmdW4sIFtdKGNvbnN0IGF1dG8mIHhfLCBjb25zdCBhdXRvJiB5XykgeyByZXR1cm4gKEVpZ2VuOjpmdW4pKHhfLCB5Xyk7IH0sIFwKICAgICAgIFtdKGNvbnN0IGF1dG8mIHhfLCBjb25zdCBhdXRvJiB5XykgeyByZXR1cm4gKHN0ZDo6ZnVuKSh4XywgeV8pOyB9CiAKLQogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KIHZvaWQgYmluYXJ5X29wc190ZXN0KCkgewogICBiaW5hcnlfb3BfdGVzdDxTY2FsYXI+KEJJTkFSWV9GVU5DVE9SX1RFU1RfQVJHUyhwb3cpKTsKQEAgLTE0MCw3ICsxMzksNiBAQAogI2VuZGlmCiB9CiAKLQogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgRm4sIHR5cGVuYW1lIFJlZkZuPgogdm9pZCB1bmFyeV9vcF90ZXN0KHN0ZDo6c3RyaW5nIG5hbWUsIEZuIGZ1biwgUmVmRm4gcmVmKSB7CiAgIGNvbnN0IFNjYWxhciB0b2wgPSB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCk7CkBAIC0xNjMsMTMgKzE2MSwxMSBAQAogICBWRVJJRlkoYWxsX3Bhc3MpOwogfQogCi0jZGVmaW5lIFVOQVJZX0ZVTkNUT1JfVEVTVF9BUkdTKGZ1bikgI2Z1biwgXAotICAgICAgW10oY29uc3QgYXV0byYgeF8pIHsgcmV0dXJuIChFaWdlbjo6ZnVuKSh4Xyk7IH0sICAgIFwKLSAgICAgIFtdKGNvbnN0IGF1dG8mIHlfKSB7IHJldHVybiAoc3RkOjpmdW4pKHlfKTsgfQorI2RlZmluZSBVTkFSWV9GVU5DVE9SX1RFU1RfQVJHUyhmdW4pIFwKKyAgI2Z1biwgW10oY29uc3QgYXV0byYgeF8pIHsgcmV0dXJuIChFaWdlbjo6ZnVuKSh4Xyk7IH0sIFtdKGNvbnN0IGF1dG8mIHlfKSB7IHJldHVybiAoc3RkOjpmdW4pKHlfKTsgfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgogdm9pZCB1bmFyeV9vcHNfdGVzdCgpIHsKLSAgCiAgIHVuYXJ5X29wX3Rlc3Q8U2NhbGFyPihVTkFSWV9GVU5DVE9SX1RFU1RfQVJHUyhzcXJ0KSk7CiAgIHVuYXJ5X29wX3Rlc3Q8U2NhbGFyPihVTkFSWV9GVU5DVE9SX1RFU1RfQVJHUyhjYnJ0KSk7CiAgIHVuYXJ5X29wX3Rlc3Q8U2NhbGFyPihVTkFSWV9GVU5DVE9SX1RFU1RfQVJHUyhleHApKTsKQEAgLTE4Niw5ICsxODIsOSBAQAogICB1bmFyeV9vcF90ZXN0PFNjYWxhcj4oVU5BUllfRlVOQ1RPUl9URVNUX0FSR1MoYXNpbmgpKTsKICAgdW5hcnlfb3BfdGVzdDxTY2FsYXI+KFVOQVJZX0ZVTkNUT1JfVEVTVF9BUkdTKGFjb3NoKSk7CiAgIHVuYXJ5X29wX3Rlc3Q8U2NhbGFyPihVTkFSWV9GVU5DVE9SX1RFU1RfQVJHUyhhdGFuaCkpOwotICAvKiBGSVhNRTogRW5hYmxlIHdoZW4gdGhlIGJlaGF2aW9yIG9mIHJzcXJ0IG9uIGRlbm9ybWFscyBmb3IgaGFsZiBhbmQgZG91YmxlIGlzIGZpeGVkLiAKKyAgLyogRklYTUU6IEVuYWJsZSB3aGVuIHRoZSBiZWhhdmlvciBvZiByc3FydCBvbiBkZW5vcm1hbHMgZm9yIGhhbGYgYW5kIGRvdWJsZSBpcyBmaXhlZC4KICAgdW5hcnlfb3BfdGVzdDxTY2FsYXI+KCJyc3FydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBhdXRvJiB4KSB7IHJldHVybiBFaWdlbjo6cnNxcnQoeCk7IH0sIAorICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgYXV0byYgeCkgeyByZXR1cm4gRWlnZW46OnJzcXJ0KHgpOyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgW10oU2NhbGFyIHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPj0gMCAmJiB4IDwgKHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6bWluKSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnNxcnQgcmV0dXJuICtpbmYgZm9yIHBvc2l0aXZlIHN1Ym5vcm1hbHMuCkBAIC0yNzIsMTkgKzI2OCwxOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBCYXNlIGEgPSBlaWdlblBvdyhqKTsKLSAgICAgICAgICAgICNpZmRlZiBFSUdFTl9DT01QX01TVkMKKyNpZmRlZiBFSUdFTl9DT01QX01TVkMKICAgICAgICAgICAgIC8vIFdvcmsgYXJvdW5kIE1TVkMgcmV0dXJuIHZhbHVlIG9uIHVuZGVyZmxvdy4KICAgICAgICAgICAgIC8vIGlmIHN0ZDo6cG93IHJldHVybnMgMCBhbmQgRWlnZW4gcmV0dXJucyBhIGRlbm9ybWFsaXplZCB2YWx1ZSwgdGhlbiBza2lwIHRoZSB0ZXN0CiAgICAgICAgICAgICBpbnQgZWlnZW5fZnBjbGFzcyA9IHN0ZDo6ZnBjbGFzc2lmeShhKTsKICAgICAgICAgICAgIGlmIChlID09IEJhc2UoMCkgJiYgZWlnZW5fZnBjbGFzcyA9PSBGUF9TVUJOT1JNQUwpIGNvbnRpbnVlOwotICAgICAgICAgICAgI2VuZGlmCisjZW5kaWYKIAotICAgICAgICAgICAgI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRV9ORU9OCisjaWZkZWYgRUlHRU5fVkVDVE9SSVpFX05FT04KICAgICAgICAgICAgIC8vIFdvcmsgYXJvdW5kIE5FT04gZmx1c2gtdG8temVybyBtb2RlCiAgICAgICAgICAgICAvLyBpZiBzdGQ6OnBvdyByZXR1cm5zIGRlbm9ybWFsaXplZCB2YWx1ZSBhbmQgRWlnZW4gcmV0dXJucyAwLCB0aGVuIHNraXAgdGhlIHRlc3QKICAgICAgICAgICAgIGludCByZWZfZnBjbGFzcyA9IHN0ZDo6ZnBjbGFzc2lmeShlKTsKICAgICAgICAgICAgIGlmIChhID09IEJhc2UoMCkgJiYgcmVmX2ZwY2xhc3MgPT0gRlBfU1VCTk9STUFMKSBjb250aW51ZTsKLSAgICAgICAgICAgICNlbmRpZgorI2VuZGlmCiAKICAgICAgICAgICAgIGJvb2wgYm90aF9uYW4gPSAobnVtZXh0Ojppc25hbikoYSkgJiYgKG51bWV4dDo6aXNuYW4pKGUpOwogICAgICAgICAgICAgYm9vbCBleGFjdF9vcl9hcHByb3ggPSAoYSA9PSBlKSB8fCBpbnRlcm5hbDo6aXNBcHByb3goYSwgZSwgdG9sKTsKQEAgLTMwMywyNSArMjk5LDI0IEBACiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFNjYWxhckV4cG9uZW50PgogU2NhbGFyIGNhbGNfb3ZlcmZsb3dfdGhyZXNob2xkKGNvbnN0IFNjYWxhckV4cG9uZW50IGV4cG9uZW50KSB7Ci0gICAgRUlHRU5fVVNJTkdfU1REKGV4cDIpOwotICAgIEVJR0VOX1VTSU5HX1NURChsb2cyKTsKLSAgICBFSUdFTl9TVEFUSUNfQVNTRVJUKChOdW1UcmFpdHM8U2NhbGFyPjo6ZGlnaXRzKCkgPCAyICogTnVtVHJhaXRzPGRvdWJsZT46OmRpZ2l0cygpKSwgQkFTRV9UWVBFX0lTX1RPT19CSUcpOworICBFSUdFTl9VU0lOR19TVEQoZXhwMik7CisgIEVJR0VOX1VTSU5HX1NURChsb2cyKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoTnVtVHJhaXRzPFNjYWxhcj46OmRpZ2l0cygpIDwgMiAqIE51bVRyYWl0czxkb3VibGU+OjpkaWdpdHMoKSksIEJBU0VfVFlQRV9JU19UT09fQklHKTsKIAotICAgIGlmIChleHBvbmVudCA8IDIpCi0gICAgICAgIHJldHVybiBOdW1UcmFpdHM8U2NhbGFyPjo6aGlnaGVzdCgpOwotICAgIGVsc2UgewotICAgICAgICAvLyBiYXNlXmUgPD0gaGlnaGVzdCA9PT4gYmFzZSA8PSAyXihsb2cyKGhpZ2hlc3QpL2UpCi0gICAgICAgIC8vIEZvciBmbG9hdGluZy1wb2ludCB0eXBlcywgY29uc2lkZXIgdGhlIGJvdW5kIGZvciBpbnRlZ2VyIHZhbHVlcyB0aGF0IGNhbiBiZSByZXByb2R1Y2VkIGV4YWN0bHkgPSAyIF4gZGlnaXRzCi0gICAgICAgIGRvdWJsZSBoaWdoZXN0X2JpdHMgPSBudW1leHQ6Om1pbmkoc3RhdGljX2Nhc3Q8ZG91YmxlPihOdW1UcmFpdHM8U2NhbGFyPjo6ZGlnaXRzKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4obG9nMihOdW1UcmFpdHM8U2NhbGFyPjo6aGlnaGVzdCgpKSkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U2NhbGFyPigKLSAgICAgICAgICBudW1leHQ6OmZsb29yKGV4cDIoaGlnaGVzdF9iaXRzIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihleHBvbmVudCkpKSk7Ci0gICAgfQorICBpZiAoZXhwb25lbnQgPCAyKQorICAgIHJldHVybiBOdW1UcmFpdHM8U2NhbGFyPjo6aGlnaGVzdCgpOworICBlbHNlIHsKKyAgICAvLyBiYXNlXmUgPD0gaGlnaGVzdCA9PT4gYmFzZSA8PSAyXihsb2cyKGhpZ2hlc3QpL2UpCisgICAgLy8gRm9yIGZsb2F0aW5nLXBvaW50IHR5cGVzLCBjb25zaWRlciB0aGUgYm91bmQgZm9yIGludGVnZXIgdmFsdWVzIHRoYXQgY2FuIGJlIHJlcHJvZHVjZWQgZXhhY3RseSA9IDIgXiBkaWdpdHMKKyAgICBkb3VibGUgaGlnaGVzdF9iaXRzID0gbnVtZXh0OjptaW5pKHN0YXRpY19jYXN0PGRvdWJsZT4oTnVtVHJhaXRzPFNjYWxhcj46OmRpZ2l0cygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4obG9nMihOdW1UcmFpdHM8U2NhbGFyPjo6aGlnaGVzdCgpKSkpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTY2FsYXI+KG51bWV4dDo6Zmxvb3IoZXhwMihoaWdoZXN0X2JpdHMgLyBzdGF0aWNfY2FzdDxkb3VibGU+KGV4cG9uZW50KSkpKTsKKyAgfQogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzZSwgdHlwZW5hbWUgRXhwb25lbnQ+CiB2b2lkIHRlc3RfZXhwb25lbnQoRXhwb25lbnQgZXhwb25lbnQpIHsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVChOdW1UcmFpdHM8QmFzZT46OklzSW50ZWdlcixUSElTIFRFU1QgSVMgT05MWSBJTlRFTkRFRCBGT1IgQkFTRSBJTlRFR0VSIFRZUEVTKQorICBFSUdFTl9TVEFUSUNfQVNTRVJUKE51bVRyYWl0czxCYXNlPjo6SXNJbnRlZ2VyLCBUSElTIFRFU1QgSVMgT05MWSBJTlRFTkRFRCBGT1IgQkFTRSBJTlRFR0VSIFRZUEVTKQogICBjb25zdCBCYXNlIG1heF9hYnNfYmFzZXMgPSBzdGF0aWNfY2FzdDxCYXNlPigxMDAwMCk7CiAgIC8vIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cgaW4gQmFzZSB0eXBlCiAgIEJhc2UgdGhyZXNob2xkID0gY2FsY19vdmVyZmxvd190aHJlc2hvbGQ8QmFzZSwgRXhwb25lbnQ+KG51bWV4dDo6YWJzKGV4cG9uZW50KSk7CkBAIC00MjAsMTIgKzQxNSwxMSBAQAogfTsKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CiBzdHJ1Y3QgZnVuY3Rvcl90cmFpdHM8dGVzdF9zaWduYml0X29wPFNjYWxhcj4+IHsKLSAgZW51bSB7IENvc3QgPSAxLCBQYWNrZXRBY2Nlc3MgPSB0cnVlIH07IC8vdG9kbzogZGVmaW5lIEhhc1NpZ25iaXQgZmxhZworICBlbnVtIHsgQ29zdCA9IDEsIFBhY2tldEFjY2VzcyA9IHRydWUgfTsgIC8vIHRvZG86IGRlZmluZSBIYXNTaWduYml0IGZsYWcKIH07CiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIH0gIC8vIG5hbWVzcGFjZSBFaWdlbgogCi0KIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CiB2b2lkIHNpZ25iaXRfdGVzdCgpIHsKICAgY29uc3Qgc2l6ZV90IHNpemUgPSAxMDAgKiBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplOwpAQCAtNDU5LDggKzQ1Myw4IEBACiAgIHNpZ25iaXRfdGVzdDxpbnQ2NF90PigpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBBcnJheVR5cGU+IHZvaWQgYXJyYXlfZ2VuZXJpYyhjb25zdCBBcnJheVR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJyYXlUeXBlPgordm9pZCBhcnJheV9nZW5lcmljKGNvbnN0IEFycmF5VHlwZSYgbSkgewogICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKICAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIEFycmF5VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IENvbFZlY3RvclR5cGU7CkBAIC00NzAsMzYgKzQ2NCwzMiBAQAogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKICAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyk7Ci0gIGlmIChOdW1UcmFpdHM8UmVhbFNjYWxhcj46OklzSW50ZWdlciAmJiBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OklzU2lnbmVkCi0gICAgICAmJiAhTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCkgeworICBpZiAoTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpJc0ludGVnZXIgJiYgTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpJc1NpZ25lZCAmJiAhTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCkgewogICAgIC8vIEhlcmUgd2UgY2FwIHRoZSBzaXplIG9mIHRoZSB2YWx1ZXMgaW4gbTEgc3VjaCB0aGF0IHBvdygzKS9jdWJlKCkKICAgICAvLyBkb2Vzbid0IG92ZXJmbG93IGFuZCByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLiBOb3RpY2UgdGhhdCBiZWNhdXNlCiAgICAgLy8gcG93KGludCwgaW50KSBwcm9tb3RlcyBpdHMgaW5wdXRzIGFuZCBvdXRwdXQgdG8gZG91YmxlIChhY2NvcmRpbmcgdG8KICAgICAvLyB0aGUgQysrIHN0YW5kYXJkKSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVzdWx0IGZpdHMgaW4gNTMgYml0cwogICAgIC8vIGZvciBpbnQ2NCwKICAgICBSZWFsU2NhbGFyIG1heF92YWwgPQotICAgICAgICBudW1leHQ6Om1pbmkoUmVhbFNjYWxhcihzdGQ6OmNicnQoTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpoaWdoZXN0KCkpKSwKLSAgICAgICAgICAgICAgICAgICAgIFJlYWxTY2FsYXIoc3RkOjpjYnJ0KDFMTCA8PCA1MykpKS8yOworICAgICAgICBudW1leHQ6Om1pbmkoUmVhbFNjYWxhcihzdGQ6OmNicnQoTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpoaWdoZXN0KCkpKSwgUmVhbFNjYWxhcihzdGQ6OmNicnQoMUxMIDw8IDUzKSkpIC8gMjsKICAgICBtMS5hcnJheSgpID0gKG0xLmFicygpLmFycmF5KCkgPD0gbWF4X3ZhbCkuc2VsZWN0KG0xLCBTY2FsYXIobWF4X3ZhbCkpOwogICB9Ci0gIEFycmF5VHlwZSAgbTIgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKTsKLSAgQXJyYXlUeXBlIG00ID0gbTE7IC8vIGNvcHkgY29uc3RydWN0b3IKKyAgQXJyYXlUeXBlIG0yID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMpOworICBBcnJheVR5cGUgbTQgPSBtMTsgIC8vIGNvcHkgY29uc3RydWN0b3IKICAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTQpOwogCiAgIENvbFZlY3RvclR5cGUgY3YxID0gQ29sVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOwogICBSb3dWZWN0b3JUeXBlIHJ2MSA9IFJvd1ZlY3RvclR5cGU6OlJhbmRvbShjb2xzKTsKIAotICBTY2FsYXIgIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCi0gICAgICAgICAgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksIHMyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAKICAgLy8gc2NhbGFyIGFkZGl0aW9uCiAgIFZFUklGWV9JU19BUFBST1gobTEgKyBzMSwgczEgKyBtMSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEgKyBzMSwgQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsczEpICsgbTEpOwotICBWRVJJRllfSVNfQVBQUk9YKHMxIC0gbTEsICgtbTEpK3MxICk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEgLSBzMSwgbTEgLSBBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxzMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKHMxIC0gbTEsIEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMxKSAtIG0xKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgobTEqU2NhbGFyKDIpKSAtIHMyLCAobTErbTEpIC0gQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsczIpICk7CisgIFZFUklGWV9JU19BUFBST1gobTEgKyBzMSwgQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBzMSkgKyBtMSk7CisgIFZFUklGWV9JU19BUFBST1goczEgLSBtMSwgKC1tMSkgKyBzMSk7CisgIFZFUklGWV9JU19BUFBST1gobTEgLSBzMSwgbTEgLSBBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIHMxKSk7CisgIFZFUklGWV9JU19BUFBST1goczEgLSBtMSwgQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBzMSkgLSBtMSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xICogU2NhbGFyKDIpKSAtIHMyLCAobTEgKyBtMSkgLSBBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIHMyKSk7CiAgIG0zID0gbTE7CiAgIG0zICs9IHMyOwogICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMSArIHMyKTsKQEAgLTUwOCwyMSArNDk4LDI1IEBACiAgIFZFUklGWV9JU19BUFBST1gobTMsIG0xIC0gczEpOwogCiAgIC8vIHNjYWxhciBvcGVyYXRvcnMgdmlhIE1hcHMKLSAgbTMgPSBtMTsgIG00ID0gbTE7CisgIG0zID0gbTE7CisgIG00ID0gbTE7CiAgIEFycmF5VHlwZTo6TWFwKG00LmRhdGEoKSwgbTQucm93cygpLCBtNC5jb2xzKCkpIC09IEFycmF5VHlwZTo6TWFwKG0yLmRhdGEoKSwgbTIucm93cygpLCBtMi5jb2xzKCkpOwogICBWRVJJRllfSVNfQVBQUk9YKG00LCBtMyAtIG0yKTsKIAotICBtMyA9IG0xOyAgbTQgPSBtMTsKKyAgbTMgPSBtMTsKKyAgbTQgPSBtMTsKICAgQXJyYXlUeXBlOjpNYXAobTQuZGF0YSgpLCBtNC5yb3dzKCksIG00LmNvbHMoKSkgKz0gQXJyYXlUeXBlOjpNYXAobTIuZGF0YSgpLCBtMi5yb3dzKCksIG0yLmNvbHMoKSk7CiAgIFZFUklGWV9JU19BUFBST1gobTQsIG0zICsgbTIpOwogCi0gIG0zID0gbTE7IG00ID0gbTE7CisgIG0zID0gbTE7CisgIG00ID0gbTE7CiAgIEFycmF5VHlwZTo6TWFwKG00LmRhdGEoKSwgbTQucm93cygpLCBtNC5jb2xzKCkpICo9IEFycmF5VHlwZTo6TWFwKG0yLmRhdGEoKSwgbTIucm93cygpLCBtMi5jb2xzKCkpOwogICBWRVJJRllfSVNfQVBQUk9YKG00LCBtMyAqIG0yKTsKIAotICBtMyA9IG0xOyBtNCA9IG0xOwotICBtMiA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7Ci0gIG0yID0gKG0yPT0wKS5zZWxlY3QoMSxtMik7CisgIG0zID0gbTE7CisgIG00ID0gbTE7CisgIG0yID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIG0yID0gKG0yID09IDApLnNlbGVjdCgxLCBtMik7CiAgIEFycmF5VHlwZTo6TWFwKG00LmRhdGEoKSwgbTQucm93cygpLCBtNC5jb2xzKCkpIC89IEFycmF5VHlwZTo6TWFwKG0yLmRhdGEoKSwgbTIucm93cygpLCBtMi5jb2xzKCkpOwogICBWRVJJRllfSVNfQVBQUk9YKG00LCBtMyAvIG0yKTsKIApAQCAtNTMyLDkgKzUyNiw5IEBACiAgIHVzaW5nIG51bWV4dDo6YWJzOwogICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oYWJzKG0xLmNvbHdpc2UoKS5zdW0oKS5zdW0oKSAtIG0xLnN1bSgpKSwgbTEuYWJzKCkuc3VtKCkpOwogICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oYWJzKG0xLnJvd3dpc2UoKS5zdW0oKS5zdW0oKSAtIG0xLnN1bSgpKSwgbTEuYWJzKCkuc3VtKCkpOwotICBpZiAoIWludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhYnMobTEuc3VtKCkgLSAobTErbTIpLnN1bSgpKSwgbTEuYWJzKCkuc3VtKCksIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpCi0gICAgICBWRVJJRllfSVNfTk9UX0FQUFJPWCgoKG0xK20yKS5yb3d3aXNlKCkuc3VtKCkpLnN1bSgpLCBtMS5zdW0oKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEuY29sd2lzZSgpLnN1bSgpLCBtMS5jb2x3aXNlKCkucmVkdXgoaW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyLFNjYWxhcj4oKSkpOworICBpZiAoIWludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhYnMobTEuc3VtKCkgLSAobTEgKyBtMikuc3VtKCkpLCBtMS5hYnMoKS5zdW0oKSwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSkKKyAgICBWRVJJRllfSVNfTk9UX0FQUFJPWCgoKG0xICsgbTIpLnJvd3dpc2UoKS5zdW0oKSkuc3VtKCksIG0xLnN1bSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb2x3aXNlKCkuc3VtKCksIG0xLmNvbHdpc2UoKS5yZWR1eChpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXIsIFNjYWxhcj4oKSkpOwogCiAgIC8vIHZlY3Rvci13aXNlIG9wcwogICBtMyA9IG0xOwpAQCAtNTQ3LDIwICs1NDEsMTkgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChtMy5yb3d3aXNlKCkgLT0gcnYxLCBtMS5yb3d3aXNlKCkgLSBydjEpOwogCiAgIC8vIENvbnZlcnNpb24gZnJvbSBzY2FsYXIKLSAgVkVSSUZZX0lTX0FQUFJPWCgobTMgPSBzMSksIEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMxKSk7Ci0gIFZFUklGWV9JU19BUFBST1goKG0zID0gMSksICBBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywxKSk7Ci0gIFZFUklGWV9JU19BUFBST1goKG0zLnRvcExlZnRDb3JuZXIocm93cyxjb2xzKSA9IDEpLCAgQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsMSkpOwotICB0eXBlZGVmIEFycmF5PFNjYWxhciwKLSAgICAgICAgICAgICAgICBBcnJheVR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljPzI6QXJyYXlUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKLSAgICAgICAgICAgICAgICBBcnJheVR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljPzI6QXJyYXlUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKLSAgICAgICAgICAgICAgICBBcnJheVR5cGU6Ok9wdGlvbnM+IEZpeGVkQXJyYXlUeXBlOworICBWRVJJRllfSVNfQVBQUk9YKChtMyA9IHMxKSwgQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBzMSkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMyA9IDEpLCBBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTMudG9wTGVmdENvcm5lcihyb3dzLCBjb2xzKSA9IDEpLCBBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIDEpKTsKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIEFycmF5VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyA/IDIgOiBBcnJheVR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAorICAgICAgICAgICAgICAgIEFycmF5VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyA/IDIgOiBBcnJheVR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCBBcnJheVR5cGU6Ok9wdGlvbnM+CisgICAgICBGaXhlZEFycmF5VHlwZTsKICAgewogICAgIEZpeGVkQXJyYXlUeXBlIGYxKHMxKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKGYxLCBGaXhlZEFycmF5VHlwZTo6Q29uc3RhbnQoczEpKTsKICAgICBGaXhlZEFycmF5VHlwZSBmMihudW1leHQ6OnJlYWwoczEpKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKGYyLCBGaXhlZEFycmF5VHlwZTo6Q29uc3RhbnQobnVtZXh0OjpyZWFsKHMxKSkpOwotICAgIEZpeGVkQXJyYXlUeXBlIGYzKChpbnQpMTAwKm51bWV4dDo6cmVhbChzMSkpOwotICAgIFZFUklGWV9JU19BUFBST1goZjMsIEZpeGVkQXJyYXlUeXBlOjpDb25zdGFudCgoaW50KTEwMCpudW1leHQ6OnJlYWwoczEpKSk7CisgICAgRml4ZWRBcnJheVR5cGUgZjMoKGludCkxMDAgKiBudW1leHQ6OnJlYWwoczEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGYzLCBGaXhlZEFycmF5VHlwZTo6Q29uc3RhbnQoKGludCkxMDAgKiBudW1leHQ6OnJlYWwoczEpKSk7CiAgICAgZjEuc2V0UmFuZG9tKCk7CiAgICAgRml4ZWRBcnJheVR5cGUgZjQoZjEuZGF0YSgpKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKGY0LCBmMSk7CkBAIC01NzAsOCArNTYzLDggQEAKICAgICBWRVJJRllfSVNfQVBQUk9YKGYxLCBGaXhlZEFycmF5VHlwZTo6Q29uc3RhbnQoczEpKTsKICAgICBGaXhlZEFycmF5VHlwZSBmMntudW1leHQ6OnJlYWwoczEpfTsKICAgICBWRVJJRllfSVNfQVBQUk9YKGYyLCBGaXhlZEFycmF5VHlwZTo6Q29uc3RhbnQobnVtZXh0OjpyZWFsKHMxKSkpOwotICAgIEZpeGVkQXJyYXlUeXBlIGYzeyhpbnQpMTAwKm51bWV4dDo6cmVhbChzMSl9OwotICAgIFZFUklGWV9JU19BUFBST1goZjMsIEZpeGVkQXJyYXlUeXBlOjpDb25zdGFudCgoaW50KTEwMCpudW1leHQ6OnJlYWwoczEpKSk7CisgICAgRml4ZWRBcnJheVR5cGUgZjN7KGludCkxMDAgKiBudW1leHQ6OnJlYWwoczEpfTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGYzLCBGaXhlZEFycmF5VHlwZTo6Q29uc3RhbnQoKGludCkxMDAgKiBudW1leHQ6OnJlYWwoczEpKSk7CiAgICAgZjEuc2V0UmFuZG9tKCk7CiAgICAgRml4ZWRBcnJheVR5cGUgZjR7ZjEuZGF0YSgpfTsKICAgICBWRVJJRllfSVNfQVBQUk9YKGY0LCBmMSk7CkBAIC01NzksNjcgKzU3Miw2NyBAQAogCiAgIC8vIHBvdwogICBWRVJJRllfSVNfQVBQUk9YKG0xLnBvdygyKSwgbTEuc3F1YXJlKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHBvdyhtMSwyKSwgbTEuc3F1YXJlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHBvdyhtMSwgMiksIG0xLnNxdWFyZSgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMS5wb3coMyksIG0xLmN1YmUoKSk7Ci0gIFZFUklGWV9JU19BUFBST1gocG93KG0xLDMpLCBtMS5jdWJlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHBvdyhtMSwgMyksIG0xLmN1YmUoKSk7CiAgIFZFUklGWV9JU19BUFBST1goKC1tMSkucG93KDMpLCAtbTEuY3ViZSgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChwb3coMiptMSwzKSwgOCptMS5jdWJlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHBvdygyICogbTEsIDMpLCA4ICogbTEuY3ViZSgpKTsKICAgQXJyYXlUeXBlIGV4cG9uZW50cyA9IEFycmF5VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgUmVhbFNjYWxhcigyKSk7Ci0gIFZFUklGWV9JU19BUFBST1goRWlnZW46OnBvdyhtMSxleHBvbmVudHMpLCBtMS5zcXVhcmUoKSk7CisgIFZFUklGWV9JU19BUFBST1goRWlnZW46OnBvdyhtMSwgZXhwb25lbnRzKSwgbTEuc3F1YXJlKCkpOwogICBWRVJJRllfSVNfQVBQUk9YKG0xLnBvdyhleHBvbmVudHMpLCBtMS5zcXVhcmUoKSk7Ci0gIFZFUklGWV9JU19BUFBST1goRWlnZW46OnBvdygyKm0xLGV4cG9uZW50cyksIDQqbTEuc3F1YXJlKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKCgyKm0xKS5wb3coZXhwb25lbnRzKSwgNCptMS5zcXVhcmUoKSk7Ci0gIFZFUklGWV9JU19BUFBST1goRWlnZW46OnBvdyhtMSwyKmV4cG9uZW50cyksIG0xLnNxdWFyZSgpLnNxdWFyZSgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS5wb3coMipleHBvbmVudHMpLCBtMS5zcXVhcmUoKS5zcXVhcmUoKSk7Ci0gIFZFUklGWV9JU19BUFBST1goRWlnZW46OnBvdyhtMSgwLDApLCBleHBvbmVudHMpLCBBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxtMSgwLDApKm0xKDAsMCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChFaWdlbjo6cG93KDIgKiBtMSwgZXhwb25lbnRzKSwgNCAqIG0xLnNxdWFyZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoMiAqIG0xKS5wb3coZXhwb25lbnRzKSwgNCAqIG0xLnNxdWFyZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChFaWdlbjo6cG93KG0xLCAyICogZXhwb25lbnRzKSwgbTEuc3F1YXJlKCkuc3F1YXJlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnBvdygyICogZXhwb25lbnRzKSwgbTEuc3F1YXJlKCkuc3F1YXJlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKEVpZ2VuOjpwb3cobTEoMCwgMCksIGV4cG9uZW50cyksIEFycmF5VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgbTEoMCwgMCkgKiBtMSgwLCAwKSkpOwogCiAgIC8vIENoZWNrIHBvc3NpYmxlIGNvbmZsaWN0cyB3aXRoIDFEIGN0b3IKICAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIER5bmFtaWMsIDE+IE9uZURBcnJheVR5cGU7CiAgIHsKICAgICBPbmVEQXJyYXlUeXBlIG8xKHJvd3MpOwotICAgIFZFUklGWShvMS5zaXplKCk9PXJvd3MpOworICAgIFZFUklGWShvMS5zaXplKCkgPT0gcm93cyk7CiAgICAgT25lREFycmF5VHlwZSBvMihzdGF0aWNfY2FzdDxpbnQ+KHJvd3MpKTsKLSAgICBWRVJJRlkobzIuc2l6ZSgpPT1yb3dzKTsKKyAgICBWRVJJRlkobzIuc2l6ZSgpID09IHJvd3MpOwogICB9CiAgIHsKICAgICBPbmVEQXJyYXlUeXBlIG8xe3Jvd3N9OwotICAgIFZFUklGWShvMS5zaXplKCk9PXJvd3MpOworICAgIFZFUklGWShvMS5zaXplKCkgPT0gcm93cyk7CiAgICAgT25lREFycmF5VHlwZSBvNHtpbnQocm93cyl9OwotICAgIFZFUklGWShvNC5zaXplKCk9PXJvd3MpOworICAgIFZFUklGWShvNC5zaXplKCkgPT0gcm93cyk7CiAgIH0KICAgLy8gQ2hlY2sgcG9zc2libGUgY29uZmxpY3RzIHdpdGggMkQgY3RvcgogICB0eXBlZGVmIEFycmF5PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gVHdvREFycmF5VHlwZTsKICAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIDIsIDE+IEFycmF5VHlwZTI7CiAgIHsKLSAgICBUd29EQXJyYXlUeXBlIG8xKHJvd3MsY29scyk7Ci0gICAgVkVSSUZZKG8xLnJvd3MoKT09cm93cyk7Ci0gICAgVkVSSUZZKG8xLmNvbHMoKT09Y29scyk7Ci0gICAgVHdvREFycmF5VHlwZSBvMihzdGF0aWNfY2FzdDxpbnQ+KHJvd3MpLHN0YXRpY19jYXN0PGludD4oY29scykpOwotICAgIFZFUklGWShvMi5yb3dzKCk9PXJvd3MpOwotICAgIFZFUklGWShvMi5jb2xzKCk9PWNvbHMpOworICAgIFR3b0RBcnJheVR5cGUgbzEocm93cywgY29scyk7CisgICAgVkVSSUZZKG8xLnJvd3MoKSA9PSByb3dzKTsKKyAgICBWRVJJRlkobzEuY29scygpID09IGNvbHMpOworICAgIFR3b0RBcnJheVR5cGUgbzIoc3RhdGljX2Nhc3Q8aW50Pihyb3dzKSwgc3RhdGljX2Nhc3Q8aW50Pihjb2xzKSk7CisgICAgVkVSSUZZKG8yLnJvd3MoKSA9PSByb3dzKTsKKyAgICBWRVJJRlkobzIuY29scygpID09IGNvbHMpOwogCi0gICAgQXJyYXlUeXBlMiBvMyhyb3dzLGNvbHMpOwotICAgIFZFUklGWShvMygwKT09U2NhbGFyKHJvd3MpICYmIG8zKDEpPT1TY2FsYXIoY29scykpOwotICAgIEFycmF5VHlwZTIgbzQoc3RhdGljX2Nhc3Q8aW50Pihyb3dzKSxzdGF0aWNfY2FzdDxpbnQ+KGNvbHMpKTsKLSAgICBWRVJJRlkobzQoMCk9PVNjYWxhcihyb3dzKSAmJiBvNCgxKT09U2NhbGFyKGNvbHMpKTsKKyAgICBBcnJheVR5cGUyIG8zKHJvd3MsIGNvbHMpOworICAgIFZFUklGWShvMygwKSA9PSBTY2FsYXIocm93cykgJiYgbzMoMSkgPT0gU2NhbGFyKGNvbHMpKTsKKyAgICBBcnJheVR5cGUyIG80KHN0YXRpY19jYXN0PGludD4ocm93cyksIHN0YXRpY19jYXN0PGludD4oY29scykpOworICAgIFZFUklGWShvNCgwKSA9PSBTY2FsYXIocm93cykgJiYgbzQoMSkgPT0gU2NhbGFyKGNvbHMpKTsKICAgfQogICB7Ci0gICAgVHdvREFycmF5VHlwZSBvMXtyb3dzLGNvbHN9OwotICAgIFZFUklGWShvMS5yb3dzKCk9PXJvd3MpOwotICAgIFZFUklGWShvMS5jb2xzKCk9PWNvbHMpOwotICAgIFR3b0RBcnJheVR5cGUgbzJ7aW50KHJvd3MpLGludChjb2xzKX07Ci0gICAgVkVSSUZZKG8yLnJvd3MoKT09cm93cyk7Ci0gICAgVkVSSUZZKG8yLmNvbHMoKT09Y29scyk7CisgICAgVHdvREFycmF5VHlwZSBvMXtyb3dzLCBjb2xzfTsKKyAgICBWRVJJRlkobzEucm93cygpID09IHJvd3MpOworICAgIFZFUklGWShvMS5jb2xzKCkgPT0gY29scyk7CisgICAgVHdvREFycmF5VHlwZSBvMntpbnQocm93cyksIGludChjb2xzKX07CisgICAgVkVSSUZZKG8yLnJvd3MoKSA9PSByb3dzKTsKKyAgICBWRVJJRlkobzIuY29scygpID09IGNvbHMpOwogCi0gICAgQXJyYXlUeXBlMiBvM3tyb3dzLGNvbHN9OwotICAgIFZFUklGWShvMygwKT09U2NhbGFyKHJvd3MpICYmIG8zKDEpPT1TY2FsYXIoY29scykpOwotICAgIEFycmF5VHlwZTIgbzR7aW50KHJvd3MpLGludChjb2xzKX07Ci0gICAgVkVSSUZZKG80KDApPT1TY2FsYXIocm93cykgJiYgbzQoMSk9PVNjYWxhcihjb2xzKSk7CisgICAgQXJyYXlUeXBlMiBvM3tyb3dzLCBjb2xzfTsKKyAgICBWRVJJRlkobzMoMCkgPT0gU2NhbGFyKHJvd3MpICYmIG8zKDEpID09IFNjYWxhcihjb2xzKSk7CisgICAgQXJyYXlUeXBlMiBvNHtpbnQocm93cyksIGludChjb2xzKX07CisgICAgVkVSSUZZKG80KDApID09IFNjYWxhcihyb3dzKSAmJiBvNCgxKSA9PSBTY2FsYXIoY29scykpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEFycmF5VHlwZT4gdm9pZCBjb21wYXJpc29ucyhjb25zdCBBcnJheVR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJyYXlUeXBlPgordm9pZCBjb21wYXJpc29ucyhjb25zdCBBcnJheVR5cGUmIG0pIHsKICAgdXNpbmcgbnVtZXh0OjphYnM7CiAgIHR5cGVkZWYgdHlwZW5hbWUgQXJyYXlUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CkBAIC02NDcsNDQgKzY0MCwzOSBAQAogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKIAotICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKSwKLSAgICAgICAgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMSksIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CiAKLSAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICBtMiA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgbTMocm93cywgY29scyksCi0gICAgICAgICAgICBtNCA9IG0xOworICBBcnJheVR5cGUgbTEgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbTIgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbTMocm93cywgY29scyksIG00ID0gbTE7CiAKLSAgbTQgPSAobTQuYWJzKCk9PVNjYWxhcigwKSkuc2VsZWN0KDEsbTQpOworICBtNCA9IChtNC5hYnMoKSA9PSBTY2FsYXIoMCkpLnNlbGVjdCgxLCBtNCk7CiAKICAgLy8gdXNlIG9wZXJhdG9yIG92ZXJsb2FkcyB3aXRoIGRlZmF1bHQgcmV0dXJuIHR5cGUKIAogICBWRVJJRlkoKChtMSArIFNjYWxhcigxKSkgPiBtMSkuYWxsKCkpOwogICBWRVJJRlkoKChtMSAtIFNjYWxhcigxKSkgPCBtMSkuYWxsKCkpOwotICBpZiAocm93cypjb2xzPjEpCi0gIHsKKyAgaWYgKHJvd3MgKiBjb2xzID4gMSkgewogICAgIG0zID0gbTE7Ci0gICAgbTMocixjKSArPSAxOwotICAgIFZFUklGWSghIChtMSA8IG0zKS5hbGwoKSApOwotICAgIFZFUklGWSghIChtMSA+IG0zKS5hbGwoKSApOworICAgIG0zKHIsIGMpICs9IDE7CisgICAgVkVSSUZZKCEobTEgPCBtMykuYWxsKCkpOworICAgIFZFUklGWSghKG0xID4gbTMpLmFsbCgpKTsKICAgfQogICBWRVJJRlkoIShtMSA+IG0yICYmIG0xIDwgbTIpLmFueSgpKTsKICAgVkVSSUZZKChtMSA8PSBtMiB8fCBtMSA+PSBtMikuYWxsKCkpOwogCiAgIC8vIGNvbXBhcmlzb25zIGFycmF5IHRvIHNjYWxhcgotICBWRVJJRlkoIChtMSAhPSAobTEocixjKSsxKSApLmFueSgpICk7Ci0gIFZFUklGWSggKG0xID4gIChtMShyLGMpLTEpICkuYW55KCkgKTsKLSAgVkVSSUZZKCAobTEgPCAgKG0xKHIsYykrMSkgKS5hbnkoKSApOwotICBWRVJJRlkoIChtMSA9PSAgbTEocixjKSAgICApLmFueSgpICk7CisgIFZFUklGWSgobTEgIT0gKG0xKHIsIGMpICsgMSkpLmFueSgpKTsKKyAgVkVSSUZZKChtMSA+IChtMShyLCBjKSAtIDEpKS5hbnkoKSk7CisgIFZFUklGWSgobTEgPCAobTEociwgYykgKyAxKSkuYW55KCkpOworICBWRVJJRlkoKG0xID09IG0xKHIsIGMpKS5hbnkoKSk7CiAKICAgLy8gY29tcGFyaXNvbnMgc2NhbGFyIHRvIGFycmF5Ci0gIFZFUklGWSggKCAobTEocixjKSsxKSAhPSBtMSkuYW55KCkgKTsKLSAgVkVSSUZZKCAoIChtMShyLGMpLTEpIDwgIG0xKS5hbnkoKSApOwotICBWRVJJRlkoICggKG0xKHIsYykrMSkgPiAgbTEpLmFueSgpICk7Ci0gIFZFUklGWSggKCAgbTEocixjKSAgICA9PSBtMSkuYW55KCkgKTsKKyAgVkVSSUZZKCgobTEociwgYykgKyAxKSAhPSBtMSkuYW55KCkpOworICBWRVJJRlkoKChtMShyLCBjKSAtIDEpIDwgbTEpLmFueSgpKTsKKyAgVkVSSUZZKCgobTEociwgYykgKyAxKSA+IG0xKS5hbnkoKSk7CisgIFZFUklGWSgobTEociwgYykgPT0gbTEpLmFueSgpKTsKIAogICAvLyBjdXJyZW50bHksIGFueSgpIC8gYWxsKCkgYXJlIG5vdCB2ZWN0b3JpemVkLCBzbyB1c2UgVkVSSUZZX0lTX0NXSVNFX0VRVUFMIHRvIHRlc3QgdmVjdG9yaXplZCBwYXRoCi0gICAKKwogICAvLyB1c2UgdHlwZWQgY29tcGFyaXNvbnMsIHJlZ2FyZGxlc3Mgb2Ygb3BlcmF0b3Igb3ZlcmxvYWQgYmVoYXZpb3IKICAgdHlwZW5hbWUgQXJyYXlUeXBlOjpDb25zdGFudFJldHVyblR5cGUgdHlwZWRfdHJ1ZSA9IEFycmF5VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgU2NhbGFyKDEpKTsKICAgLy8gKG0xICsgU2NhbGFyKDEpKSA+IG0xKS5hbGwoKQpAQCAtNzI4LDQwICs3MTYsMzcgQEAKICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKG0xLmFicygpLmN3aXNlR3JlYXRlck9yRXF1YWwoU2NhbGFyKDApKSwgYm9vbF90cnVlKTsKIAogICAvLyB0ZXN0IFNlbGVjdAotICBWRVJJRllfSVNfQVBQUk9YKCAobTE8bTIpLnNlbGVjdChtMSxtMiksIG0xLmN3aXNlTWluKG0yKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAobTE+bTIpLnNlbGVjdChtMSxtMiksIG0xLmN3aXNlTWF4KG0yKSApOwotICBTY2FsYXIgbWlkID0gKG0xLmN3aXNlQWJzKCkubWluQ29lZmYoKSArIG0xLmN3aXNlQWJzKCkubWF4Q29lZmYoKSkvU2NhbGFyKDIpOwotICBmb3IgKGludCBqPTA7IGo8Y29sczsgKytqKQotICBmb3IgKGludCBpPTA7IGk8cm93czsgKytpKQotICAgIG0zKGksaikgPSBhYnMobTEoaSxqKSk8bWlkID8gMCA6IG0xKGksaik7Ci0gIFZFUklGWV9JU19BUFBST1goIChtMS5hYnMoKTxBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxtaWQpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChBcnJheVR5cGU6Olplcm8ocm93cyxjb2xzKSxtMSksIG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEgPCBtMikuc2VsZWN0KG0xLCBtMiksIG0xLmN3aXNlTWluKG0yKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xID4gbTIpLnNlbGVjdChtMSwgbTIpLCBtMS5jd2lzZU1heChtMikpOworICBTY2FsYXIgbWlkID0gKG0xLmN3aXNlQWJzKCkubWluQ29lZmYoKSArIG0xLmN3aXNlQWJzKCkubWF4Q29lZmYoKSkgLyBTY2FsYXIoMik7CisgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgKytqKQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgKytpKSBtMyhpLCBqKSA9IGFicyhtMShpLCBqKSkgPCBtaWQgPyAwIDogbTEoaSwgaik7CisgIFZFUklGWV9JU19BUFBST1goKG0xLmFicygpIDwgQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtaWQpKS5zZWxlY3QoQXJyYXlUeXBlOjpaZXJvKHJvd3MsIGNvbHMpLCBtMSksIG0zKTsKICAgLy8gc2hvcnRlciB2ZXJzaW9uczoKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFicygpPEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLG1pZCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KDAsbTEpLCBtMyk7Ci0gIFZFUklGWV9JU19BUFBST1goIChtMS5hYnMoKT49QXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsbWlkKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QobTEsMCksIG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEuYWJzKCkgPCBBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIG1pZCkpLnNlbGVjdCgwLCBtMSksIG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEuYWJzKCkgPj0gQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtaWQpKS5zZWxlY3QobTEsIDApLCBtMyk7CiAgIC8vIGV2ZW4gc2hvcnRlciB2ZXJzaW9uOgotICBWRVJJRllfSVNfQVBQUk9YKCAobTEuYWJzKCk8bWlkKS5zZWxlY3QoMCxtMSksIG0zKTsgCisgIFZFUklGWV9JU19BUFBST1goKG0xLmFicygpIDwgbWlkKS5zZWxlY3QoMCwgbTEpLCBtMyk7CiAKICAgLy8gY291bnQKLSAgVkVSSUZZKCgobTEuYWJzKCkrMSk+UmVhbFNjYWxhcigwLjEpKS5jb3VudCgpID09IHJvd3MqY29scyk7CisgIFZFUklGWSgoKG0xLmFicygpICsgMSkgPiBSZWFsU2NhbGFyKDAuMSkpLmNvdW50KCkgPT0gcm93cyAqIGNvbHMpOwogCiAgIC8vIGFuZC9vcgotICBWRVJJRlkoIChtMTxSZWFsU2NhbGFyKDApICYmIG0xPlJlYWxTY2FsYXIoMCkpLmNvdW50KCkgPT0gMCk7Ci0gIFZFUklGWSggKG0xPFJlYWxTY2FsYXIoMCkgfHwgbTE+PVJlYWxTY2FsYXIoMCkpLmNvdW50KCkgPT0gcm93cypjb2xzKTsKKyAgVkVSSUZZKChtMSA8IFJlYWxTY2FsYXIoMCkgJiYgbTEgPiBSZWFsU2NhbGFyKDApKS5jb3VudCgpID09IDApOworICBWRVJJRlkoKG0xIDwgUmVhbFNjYWxhcigwKSB8fCBtMSA+PSBSZWFsU2NhbGFyKDApKS5jb3VudCgpID09IHJvd3MgKiBjb2xzKTsKICAgUmVhbFNjYWxhciBhID0gbTEuYWJzKCkubWVhbigpOwotICBWRVJJRlkoIChtMTwtYSB8fCBtMT5hKS5jb3VudCgpID09IChtMS5hYnMoKT5hKS5jb3VudCgpKTsKKyAgVkVSSUZZKChtMSA8IC1hIHx8IG0xID4gYSkuY291bnQoKSA9PSAobTEuYWJzKCkgPiBhKS5jb3VudCgpKTsKIAogICB0eXBlZGVmIEFycmF5PEluZGV4LCBEeW5hbWljLCAxPiBBcnJheU9mSW5kaWNlczsKIAogICAvLyBUT0RPIGFsbG93cyBjb2x3aXNlL3Jvd3dpc2UgZm9yIGFycmF5Ci0gIFZFUklGWV9JU19BUFBST1goKChtMS5hYnMoKSsxKT5SZWFsU2NhbGFyKDAuMSkpLmNvbHdpc2UoKS5jb3VudCgpLCBBcnJheU9mSW5kaWNlczo6Q29uc3RhbnQoY29scyxyb3dzKS50cmFuc3Bvc2UoKSk7Ci0gIFZFUklGWV9JU19BUFBST1goKChtMS5hYnMoKSsxKT5SZWFsU2NhbGFyKDAuMSkpLnJvd3dpc2UoKS5jb3VudCgpLCBBcnJheU9mSW5kaWNlczo6Q29uc3RhbnQocm93cywgY29scykpOworICBWRVJJRllfSVNfQVBQUk9YKCgobTEuYWJzKCkgKyAxKSA+IFJlYWxTY2FsYXIoMC4xKSkuY29sd2lzZSgpLmNvdW50KCksCisgICAgICAgICAgICAgICAgICAgQXJyYXlPZkluZGljZXM6OkNvbnN0YW50KGNvbHMsIHJvd3MpLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKG0xLmFicygpICsgMSkgPiBSZWFsU2NhbGFyKDAuMSkpLnJvd3dpc2UoKS5jb3VudCgpLCBBcnJheU9mSW5kaWNlczo6Q29uc3RhbnQocm93cywgY29scykpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBBcnJheVR5cGU+IHZvaWQgYXJyYXlfcmVhbChjb25zdCBBcnJheVR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJyYXlUeXBlPgordm9pZCBhcnJheV9yZWFsKGNvbnN0IEFycmF5VHlwZSYgbSkgewogICB1c2luZyBudW1leHQ6OmFiczsKICAgdXNpbmcgc3RkOjpzcXJ0OwogICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5VHlwZTo6U2NhbGFyIFNjYWxhcjsKQEAgLTc3MCwxOSArNzU1LDE2IEBACiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwogCi0gIEFycmF5VHlwZSBtMSA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgbTIgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgbTQgPSBtMTsKKyAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0yID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMpLCBtNCA9IG0xOwogCiAgIC8vIGF2b2lkIGRlbm9ybWFsaXplZCB2YWx1ZXMgc28gdmVyaWZpY2F0aW9uIGRvZXNuJ3QgZmFpbCBvbiBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0KICAgLy8gZGVub3JtYWxpemVkIGJlaGF2aW9yIGlzIHRlc3RlZCBlbHNld2hlcmUgKHVuYXJ5X29wX3Rlc3QsIGJpbmFyeV9vcHNfdGVzdCkKICAgY29uc3QgU2NhbGFyIG1pbiA9IChzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1pbikoKTsKLSAgbTEgPSAobTEuYWJzKCk8bWluKS5zZWxlY3QoU2NhbGFyKDApLG0xKTsKLSAgbTIgPSAobTIuYWJzKCk8bWluKS5zZWxlY3QoU2NhbGFyKDApLG0yKTsKLSAgbTQgPSAobTQuYWJzKCk8bWluKS5zZWxlY3QoU2NhbGFyKDEpLG00KTsKKyAgbTEgPSAobTEuYWJzKCkgPCBtaW4pLnNlbGVjdChTY2FsYXIoMCksIG0xKTsKKyAgbTIgPSAobTIuYWJzKCkgPCBtaW4pLnNlbGVjdChTY2FsYXIoMCksIG0yKTsKKyAgbTQgPSAobTQuYWJzKCkgPCBtaW4pLnNlbGVjdChTY2FsYXIoMSksIG00KTsKIAotICBTY2FsYXIgIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwogCiAgIC8vIHRoZXNlIHRlc3RzIGFyZSBtb3N0bHkgdG8gY2hlY2sgcG9zc2libGUgY29tcGlsYXRpb24gaXNzdWVzIHdpdGggZnJlZS1mdW5jdGlvbnMuCiAgIFZFUklGWV9JU19BUFBST1gobTEuc2luKCksIHNpbihtMSkpOwpAQCAtNzk0LDcgKzc3Niw3IEBACiAgIFZFUklGWV9JU19BUFBST1gobTEuc2luaCgpLCBzaW5oKG0xKSk7CiAgIFZFUklGWV9JU19BUFBST1gobTEuY29zaCgpLCBjb3NoKG0xKSk7CiAgIFZFUklGWV9JU19BUFBST1gobTEudGFuaCgpLCB0YW5oKG0xKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEuYXRhbjIobTIpLCBhdGFuMihtMSxtMikpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmF0YW4yKG0yKSwgYXRhbjIobTEsIG0yKSk7CiAKICAgVkVSSUZZX0lTX0FQUFJPWChtMS50YW5oKCkuYXRhbmgoKSwgYXRhbmgodGFuaChtMSkpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMS5zaW5oKCkuYXNpbmgoKSwgYXNpbmgoc2luaChtMSkpKTsKQEAgLTgxNSw3ICs3OTcsNyBAQAogICBWRVJJRllfSVNfQVBQUk9YKG0xLmFiczIoKSwgYWJzMihtMSkpOwogICBWRVJJRllfSVNfQVBQUk9YKG0xLnNxdWFyZSgpLCBzcXVhcmUobTEpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMS5jdWJlKCksIGN1YmUobTEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChjb3MobTErUmVhbFNjYWxhcigzKSptMiksIGNvcygobTErUmVhbFNjYWxhcigzKSptMikuZXZhbCgpKSk7CisgIFZFUklGWV9JU19BUFBST1goY29zKG0xICsgUmVhbFNjYWxhcigzKSAqIG0yKSwgY29zKChtMSArIFJlYWxTY2FsYXIoMykgKiBtMikuZXZhbCgpKSk7CiAgIFZFUklGWV9JU19BUFBST1gobTEuc2lnbigpLCBzaWduKG0xKSk7CiAgIFZFUklGWSgobTEuc3FydCgpLnNpZ24oKS5pc05hTigpID09IChFaWdlbjo6aXNuYW4pKHNpZ24oc3FydChtMSkpKSkuYWxsKCkpOwogCkBAIC04MjQsNDEgKzgwNiw0MiBAQAogCiAgIFZFUklGWV9JU19BUFBST1gobTMuc3FydCgpLCBzcXJ0KGFicyhtMykpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMy5jYnJ0KCksIGNicnQobTMpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMy5yc3FydCgpLCBTY2FsYXIoMSkvc3FydChhYnMobTMpKSk7Ci0gIFZFUklGWV9JU19BUFBST1gocnNxcnQobTMpLCBTY2FsYXIoMSkvc3FydChhYnMobTMpKSk7CisgIFZFUklGWV9JU19BUFBST1gobTMucnNxcnQoKSwgU2NhbGFyKDEpIC8gc3FydChhYnMobTMpKSk7CisgIFZFUklGWV9JU19BUFBST1gocnNxcnQobTMpLCBTY2FsYXIoMSkgLyBzcXJ0KGFicyhtMykpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMy5sb2coKSwgbG9nKG0zKSk7CiAgIFZFUklGWV9JU19BUFBST1gobTMubG9nMXAoKSwgbG9nMXAobTMpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMy5sb2cxMCgpLCBsb2cxMChtMykpOwogICBWRVJJRllfSVNfQVBQUk9YKG0zLmxvZzIoKSwgbG9nMihtMykpOwogCi0KLSAgVkVSSUZZKCghKG0xPm0yKSA9PSAobTE8PW0yKSkuYWxsKCkpOworICBWRVJJRlkoKCEobTEgPiBtMikgPT0gKG0xIDw9IG0yKSkuYWxsKCkpOwogCiAgIFZFUklGWV9JU19BUFBST1goc2luKG0xLmFzaW4oKSksIG0xKTsKICAgVkVSSUZZX0lTX0FQUFJPWChjb3MobTEuYWNvcygpKSwgbTEpOwogICBWRVJJRllfSVNfQVBQUk9YKHRhbihtMS5hdGFuKCkpLCBtMSk7Ci0gIFZFUklGWV9JU19BUFBST1goc2luaChtMSksIFNjYWxhcigwLjUpKihleHAobTEpLWV4cCgtbTEpKSk7Ci0gIFZFUklGWV9JU19BUFBST1goY29zaChtMSksIFNjYWxhcigwLjUpKihleHAobTEpK2V4cCgtbTEpKSk7Ci0gIFZFUklGWV9JU19BUFBST1godGFuaChtMSksIChTY2FsYXIoMC41KSooZXhwKG0xKS1leHAoLW0xKSkpLyhTY2FsYXIoMC41KSooZXhwKG0xKStleHAoLW0xKSkpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChsb2dpc3RpYyhtMSksIChTY2FsYXIoMSkvKFNjYWxhcigxKStleHAoLW0xKSkpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhcmcobTEpLCAoKG0xPFNjYWxhcigwKSkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCkpKlNjYWxhcihzdGQ6OmFjb3MoU2NhbGFyKC0xKSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzaW5oKG0xKSwgU2NhbGFyKDAuNSkgKiAoZXhwKG0xKSAtIGV4cCgtbTEpKSk7CisgIFZFUklGWV9JU19BUFBST1goY29zaChtMSksIFNjYWxhcigwLjUpICogKGV4cChtMSkgKyBleHAoLW0xKSkpOworICBWRVJJRllfSVNfQVBQUk9YKHRhbmgobTEpLCAoU2NhbGFyKDAuNSkgKiAoZXhwKG0xKSAtIGV4cCgtbTEpKSkgLyAoU2NhbGFyKDAuNSkgKiAoZXhwKG0xKSArIGV4cCgtbTEpKSkpOworICBWRVJJRllfSVNfQVBQUk9YKGxvZ2lzdGljKG0xKSwgKFNjYWxhcigxKSAvIChTY2FsYXIoMSkgKyBleHAoLW0xKSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhcmcobTEpLCAoKG0xIDwgU2NhbGFyKDApKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSkgKiBTY2FsYXIoc3RkOjphY29zKFNjYWxhcigtMSkpKSk7CiAgIFZFUklGWSgocm91bmQobTEpIDw9IGNlaWwobTEpICYmIHJvdW5kKG0xKSA+PSBmbG9vcihtMSkpLmFsbCgpKTsKICAgVkVSSUZZKChyaW50KG0xKSA8PSBjZWlsKG0xKSAmJiByaW50KG0xKSA+PSBmbG9vcihtMSkpLmFsbCgpKTsKICAgVkVSSUZZKCgoY2VpbChtMSkgLSByb3VuZChtMSkpIDw9IFNjYWxhcigwLjUpIHx8IChyb3VuZChtMSkgLSBmbG9vcihtMSkpIDw9IFNjYWxhcigwLjUpKS5hbGwoKSk7CiAgIFZFUklGWSgoKGNlaWwobTEpIC0gcm91bmQobTEpKSA8PSBTY2FsYXIoMS4wKSAmJiAocm91bmQobTEpIC0gZmxvb3IobTEpKSA8PSBTY2FsYXIoMS4wKSkuYWxsKCkpOwogICBWRVJJRlkoKChjZWlsKG0xKSAtIHJpbnQobTEpKSA8PSBTY2FsYXIoMC41KSB8fCAocmludChtMSkgLSBmbG9vcihtMSkpIDw9IFNjYWxhcigwLjUpKS5hbGwoKSk7CiAgIFZFUklGWSgoKGNlaWwobTEpIC0gcmludChtMSkpIDw9IFNjYWxhcigxLjApICYmIChyaW50KG0xKSAtIGZsb29yKG0xKSkgPD0gU2NhbGFyKDEuMCkpLmFsbCgpKTsKLSAgVkVSSUZZKChFaWdlbjo6aXNuYW4pKChtMSpTY2FsYXIoMCkpL1NjYWxhcigwKSkuYWxsKCkpOwotICBWRVJJRlkoKEVpZ2VuOjppc2luZikobTQvU2NhbGFyKDApKS5hbGwoKSk7Ci0gIFZFUklGWSgoKEVpZ2VuOjppc2Zpbml0ZSkobTEpICYmICghKEVpZ2VuOjppc2Zpbml0ZSkobTEqU2NhbGFyKDApL1NjYWxhcigwKSkpICYmICghKEVpZ2VuOjppc2Zpbml0ZSkobTQvU2NhbGFyKDApKSkpLmFsbCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChpbnZlcnNlKGludmVyc2UobTQpKSxtNCk7CisgIFZFUklGWSgoRWlnZW46OmlzbmFuKSgobTEgKiBTY2FsYXIoMCkpIC8gU2NhbGFyKDApKS5hbGwoKSk7CisgIFZFUklGWSgoRWlnZW46OmlzaW5mKShtNCAvIFNjYWxhcigwKSkuYWxsKCkpOworICBWRVJJRlkoKChFaWdlbjo6aXNmaW5pdGUpKG0xKSAmJiAoIShFaWdlbjo6aXNmaW5pdGUpKG0xICogU2NhbGFyKDApIC8gU2NhbGFyKDApKSkgJiYKKyAgICAgICAgICAoIShFaWdlbjo6aXNmaW5pdGUpKG00IC8gU2NhbGFyKDApKSkpCisgICAgICAgICAgICAgLmFsbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChpbnZlcnNlKGludmVyc2UobTQpKSwgbTQpOwogICBWRVJJRlkoKGFicyhtMSkgPT0gbTEgfHwgYWJzKG0xKSA9PSAtbTEpLmFsbCgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMywgc3FydChhYnMyKG0zKSkpOwogICBWRVJJRllfSVNfQVBQUk9YKG0xLmFic29sdXRlX2RpZmZlcmVuY2UobTIpLCAobTEgPiBtMikuc2VsZWN0KG0xIC0gbTIsIG0yIC0gbTEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggbTEuc2lnbigpLCAtKC1tMSkuc2lnbigpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIG0xKm0xLnNpZ24oKSxtMS5hYnMoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuc2lnbigpLCAtKC1tMSkuc2lnbigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSAqIG0xLnNpZ24oKSwgbTEuYWJzKCkpOwogICBWRVJJRllfSVNfQVBQUk9YKG0xLnNpZ24oKSAqIG0xLmFicygpLCBtMSk7Ci0gIAorCiAgIEFycmF5VHlwZSB0bXAgPSBtMS5hdGFuMihtMik7CiAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCB0bXAuc2l6ZSgpOyArK2kpIHsKICAgICBTY2FsYXIgYWN0dWFsID0gdG1wLmFycmF5KCkoaSk7CkBAIC04NjgsNDUgKzg1MSw0NCBAQAogCiAgIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjphYnMyKG51bWV4dDo6cmVhbChtMSkpICsgbnVtZXh0OjphYnMyKG51bWV4dDo6aW1hZyhtMSkpLCBudW1leHQ6OmFiczIobTEpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OmFiczIoRWlnZW46OnJlYWwobTEpKSArIG51bWV4dDo6YWJzMihFaWdlbjo6aW1hZyhtMSkpLCBudW1leHQ6OmFiczIobTEpKTsKLSAgaWYoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCi0gICAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnJlYWwobTEpLCBtMSk7CisgIGlmICghTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCkgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnJlYWwobTEpLCBtMSk7CiAKICAgLy8gc2hpZnQgYXJndW1lbnQgb2YgbG9nYXJpdGhtIHNvIHRoYXQgaXQgaXMgbm90IHplcm8KICAgU2NhbGFyIHNtYWxsTnVtYmVyID0gTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpOwotICBWRVJJRllfSVNfQVBQUk9YKChtMyArIHNtYWxsTnVtYmVyKS5sb2coKSAsIGxvZyhhYnMobTMpICsgc21hbGxOdW1iZXIpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgobTMgKyBzbWFsbE51bWJlciArIFNjYWxhcigxKSkubG9nKCkgLCBsb2cxcChhYnMobTMpICsgc21hbGxOdW1iZXIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTMgKyBzbWFsbE51bWJlcikubG9nKCksIGxvZyhhYnMobTMpICsgc21hbGxOdW1iZXIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTMgKyBzbWFsbE51bWJlciArIFNjYWxhcigxKSkubG9nKCksIGxvZzFwKGFicyhtMykgKyBzbWFsbE51bWJlcikpOwogCi0gIFZFUklGWV9JU19BUFBST1gobTEuZXhwKCkgKiBtMi5leHAoKSwgZXhwKG0xK20yKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuZXhwKCkgKiBtMi5leHAoKSwgZXhwKG0xICsgbTIpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMS5leHAoKSwgZXhwKG0xKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEuZXhwKCkgLyBtMi5leHAoKSwobTEtbTIpLmV4cCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5leHAoKSAvIG0yLmV4cCgpLCAobTEgLSBtMikuZXhwKCkpOwogCiAgIFZFUklGWV9JU19BUFBST1gobTEuZXhwbTEoKSwgZXhwbTEobTEpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgobTMgKyBzbWFsbE51bWJlcikuZXhwKCkgLSBTY2FsYXIoMSksIGV4cG0xKGFicyhtMykgKyBzbWFsbE51bWJlcikpOwogCiAgIFZFUklGWV9JU19BUFBST1gobTMucG93KFJlYWxTY2FsYXIoMC41KSksIG0zLnNxcnQoKSk7Ci0gIFZFUklGWV9JU19BUFBST1gocG93KG0zLFJlYWxTY2FsYXIoMC41KSksIG0zLnNxcnQoKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTMucG93KFJlYWxTY2FsYXIoMS4wLzMuMCkpLCBtMy5jYnJ0KCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHBvdyhtMyxSZWFsU2NhbGFyKDEuMC8zLjApKSwgbTMuY2JydCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChwb3cobTMsIFJlYWxTY2FsYXIoMC41KSksIG0zLnNxcnQoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTMucG93KFJlYWxTY2FsYXIoMS4wIC8gMy4wKSksIG0zLmNicnQoKSk7CisgIFZFUklGWV9JU19BUFBST1gocG93KG0zLCBSZWFsU2NhbGFyKDEuMCAvIDMuMCkpLCBtMy5jYnJ0KCkpOwogCiAgIFZFUklGWV9JU19BUFBST1gobTMucG93KFJlYWxTY2FsYXIoLTAuNSkpLCBtMy5yc3FydCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChwb3cobTMsUmVhbFNjYWxhcigtMC41KSksIG0zLnJzcXJ0KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHBvdyhtMywgUmVhbFNjYWxhcigtMC41KSksIG0zLnJzcXJ0KCkpOwogCiAgIC8vIEF2b2lkIGluZiBhbmQgTmFOLgotICBtMyA9IChtMS5zcXVhcmUoKTxOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKS5zZWxlY3QoU2NhbGFyKDEpLG0zKTsKKyAgbTMgPSAobTEuc3F1YXJlKCkgPCBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKS5zZWxlY3QoU2NhbGFyKDEpLCBtMyk7CiAgIFZFUklGWV9JU19BUFBST1gobTMucG93KFJlYWxTY2FsYXIoLTIpKSwgbTMuc3F1YXJlKCkuaW52ZXJzZSgpKTsKIAogICAvLyBUZXN0IHBvdyBhbmQgYXRhbjIgb24gc3BlY2lhbCBJRUVFIHZhbHVlcy4KICAgdW5hcnlfb3BzX3Rlc3Q8U2NhbGFyPigpOwogICBiaW5hcnlfb3BzX3Rlc3Q8U2NhbGFyPigpOwogCi0gIFZFUklGWV9JU19BUFBST1gobG9nMTAobTMpLCBsb2cobTMpL251bWV4dDo6bG9nKFNjYWxhcigxMCkpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChsb2cyKG0zKSwgbG9nKG0zKS9udW1leHQ6OmxvZyhTY2FsYXIoMikpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChsb2cxMChtMyksIGxvZyhtMykgLyBudW1leHQ6OmxvZyhTY2FsYXIoMTApKSk7CisgIFZFUklGWV9JU19BUFBST1gobG9nMihtMyksIGxvZyhtMykgLyBudW1leHQ6OmxvZyhTY2FsYXIoMikpKTsKIAogICAvLyBzY2FsYXIgYnkgYXJyYXkgZGl2aXNpb24KICAgY29uc3QgUmVhbFNjYWxhciB0aW55ID0gc3FydChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkpOwogICBzMSArPSBTY2FsYXIodGlueSk7Ci0gIG0xICs9IEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLFNjYWxhcih0aW55KSk7Ci0gIFZFUklGWV9JU19DV0lTRV9BUFBST1goczEvbTEsIHMxICogbTEuaW52ZXJzZSgpKTsKKyAgbTEgKz0gQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBTY2FsYXIodGlueSkpOworICBWRVJJRllfSVNfQ1dJU0VfQVBQUk9YKHMxIC8gbTEsIHMxICogbTEuaW52ZXJzZSgpKTsKIAogICAvLyBjaGVjayBpbnBsYWNlIHRyYW5zcG9zZQogICBtMyA9IG0xOwpAQCAtOTE2LDI3ICs4OTgsMjMgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEpOwogfQogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIEFycmF5VHlwZT4gdm9pZCBhcnJheV9jb21wbGV4KGNvbnN0IEFycmF5VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBBcnJheVR5cGU+Cit2b2lkIGFycmF5X2NvbXBsZXgoY29uc3QgQXJyYXlUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgQXJyYXlUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CiAKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKLSAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICBtMihyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgIG00ID0gbTE7CisgIEFycmF5VHlwZSBtMSA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMihyb3dzLCBjb2xzKSwgbTQgPSBtMTsKIAotICBtNC5yZWFsKCkgPSAobTQucmVhbCgpLmFicygpPT1SZWFsU2NhbGFyKDApKS5zZWxlY3QoUmVhbFNjYWxhcigxKSxtNC5yZWFsKCkpOwotICBtNC5pbWFnKCkgPSAobTQuaW1hZygpLmFicygpPT1SZWFsU2NhbGFyKDApKS5zZWxlY3QoUmVhbFNjYWxhcigxKSxtNC5pbWFnKCkpOworICBtNC5yZWFsKCkgPSAobTQucmVhbCgpLmFicygpID09IFJlYWxTY2FsYXIoMCkpLnNlbGVjdChSZWFsU2NhbGFyKDEpLCBtNC5yZWFsKCkpOworICBtNC5pbWFnKCkgPSAobTQuaW1hZygpLmFicygpID09IFJlYWxTY2FsYXIoMCkpLnNlbGVjdChSZWFsU2NhbGFyKDEpLCBtNC5pbWFnKCkpOwogCiAgIEFycmF5PFJlYWxTY2FsYXIsIC0xLCAtMT4gbTMocm93cywgY29scyk7CiAKICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG0ucm93cygpOyArK2kpCi0gICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG0uY29scygpOyArK2opCi0gICAgICBtMihpLGopID0gc3FydChtMShpLGopKTsKKyAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbS5jb2xzKCk7ICsraikgbTIoaSwgaikgPSBzcXJ0KG0xKGksIGopKTsKIAogICAvLyB0aGVzZSB0ZXN0cyBhcmUgbW9zdGx5IHRvIGNoZWNrIHBvc3NpYmxlIGNvbXBpbGF0aW9uIGlzc3VlcyB3aXRoIGZyZWUtZnVuY3Rpb25zLgogICBWRVJJRllfSVNfQVBQUk9YKG0xLnNpbigpLCBzaW4obTEpKTsKQEAgLTk2MSwxMiArOTM5LDEyIEBACiAgIFZFUklGWV9JU19BUFBST1gobTEuc3FydCgpLCBzcXJ0KG0xKSk7CiAgIFZFUklGWV9JU19BUFBST1gobTEuc3F1YXJlKCksIHNxdWFyZShtMSkpOwogICBWRVJJRllfSVNfQVBQUk9YKG0xLmN1YmUoKSwgY3ViZShtMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKGNvcyhtMStSZWFsU2NhbGFyKDMpKm0yKSwgY29zKChtMStSZWFsU2NhbGFyKDMpKm0yKS5ldmFsKCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChjb3MobTEgKyBSZWFsU2NhbGFyKDMpICogbTIpLCBjb3MoKG0xICsgUmVhbFNjYWxhcigzKSAqIG0yKS5ldmFsKCkpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMS5zaWduKCksIHNpZ24obTEpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKG0xLmV4cCgpICogbTIuZXhwKCksIGV4cChtMSttMikpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmV4cCgpICogbTIuZXhwKCksIGV4cChtMSArIG0yKSk7CiAgIFZFUklGWV9JU19BUFBST1gobTEuZXhwKCksIGV4cChtMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLmV4cCgpIC8gbTIuZXhwKCksKG0xLW0yKS5leHAoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuZXhwKCkgLyBtMi5leHAoKSwgKG0xIC0gbTIpLmV4cCgpKTsKIAogICBWRVJJRllfSVNfQVBQUk9YKG0xLmV4cG0xKCksIGV4cG0xKG0xKSk7CiAgIFZFUklGWV9JU19BUFBST1goZXhwbTEobTEpLCBleHAobTEpIC0gMS4pOwpAQCAtOTg2LDQ5ICs5NjQsNDYgQEAKICAgfQogCiAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBtLnJvd3MoKTsgKytpKQotICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBtLmNvbHMoKTsgKytqKQotICAgICAgbTMoaSxqKSA9IHN0ZDo6YXRhbjIobTEoaSxqKS5pbWFnKCksIG0xKGksaikucmVhbCgpKTsKKyAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgbS5jb2xzKCk7ICsraikgbTMoaSwgaikgPSBzdGQ6OmF0YW4yKG0xKGksIGopLmltYWcoKSwgbTEoaSwgaikucmVhbCgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChhcmcobTEpLCBtMyk7CiAgIFZFUklGWV9JU19BUFBST1goY2FyZyhtMSksIG0zKTsKIAotICBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gemVybygwLjAsMC4wKTsKLSAgVkVSSUZZKChFaWdlbjo6aXNuYW4pKG0xKnplcm8vemVybykuYWxsKCkpOworICBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gemVybygwLjAsIDAuMCk7CisgIFZFUklGWSgoRWlnZW46OmlzbmFuKShtMSAqIHplcm8gLyB6ZXJvKS5hbGwoKSk7CiAjaWYgRUlHRU5fQ09NUF9NU1ZDCiAgIC8vIG1zdmMgY29tcGxleCBkaXZpc2lvbiBpcyBub3Qgcm9idXN0Ci0gIFZFUklGWSgoRWlnZW46OmlzaW5mKShtNC9SZWFsU2NhbGFyKDApKS5hbGwoKSk7CisgIFZFUklGWSgoRWlnZW46OmlzaW5mKShtNCAvIFJlYWxTY2FsYXIoMCkpLmFsbCgpKTsKICNlbHNlCiAjaWYgRUlHRU5fQ09NUF9DTEFORwogICAvLyBjbGFuZydzIGNvbXBsZXggZGl2aXNpb24gaXMgbm90b3Jpb3VzbHkgYnJva2VuIHRvbwotICBpZigobnVtZXh0Ojppc2luZikobTQoMCwwKS9SZWFsU2NhbGFyKDApKSkgeworICBpZiAoKG51bWV4dDo6aXNpbmYpKG00KDAsIDApIC8gUmVhbFNjYWxhcigwKSkpIHsKICNlbmRpZgotICAgIFZFUklGWSgoRWlnZW46OmlzaW5mKShtNC96ZXJvKS5hbGwoKSk7CisgICAgVkVSSUZZKChFaWdlbjo6aXNpbmYpKG00IC8gemVybykuYWxsKCkpOwogI2lmIEVJR0VOX0NPTVBfQ0xBTkcKLSAgfQotICBlbHNlCi0gIHsKLSAgICBWRVJJRlkoKEVpZ2VuOjppc2luZikobTQucmVhbCgpL3plcm8ucmVhbCgpKS5hbGwoKSk7CisgIH0gZWxzZSB7CisgICAgVkVSSUZZKChFaWdlbjo6aXNpbmYpKG00LnJlYWwoKSAvIHplcm8ucmVhbCgpKS5hbGwoKSk7CiAgIH0KICNlbmRpZgotI2VuZGlmIC8vIE1TVkMKKyNlbmRpZiAgLy8gTVNWQwogCi0gIFZFUklGWSgoKEVpZ2VuOjppc2Zpbml0ZSkobTEpICYmICghKEVpZ2VuOjppc2Zpbml0ZSkobTEqemVyby96ZXJvKSkgJiYgKCEoRWlnZW46OmlzZmluaXRlKShtMS96ZXJvKSkpLmFsbCgpKTsKKyAgVkVSSUZZKCgoRWlnZW46OmlzZmluaXRlKShtMSkgJiYgKCEoRWlnZW46OmlzZmluaXRlKShtMSAqIHplcm8gLyB6ZXJvKSkgJiYgKCEoRWlnZW46OmlzZmluaXRlKShtMSAvIHplcm8pKSkuYWxsKCkpOwogCi0gIFZFUklGWV9JU19BUFBST1goaW52ZXJzZShpbnZlcnNlKG00KSksbTQpOworICBWRVJJRllfSVNfQVBQUk9YKGludmVyc2UoaW52ZXJzZShtNCkpLCBtNCk7CiAgIFZFUklGWV9JU19BUFBST1goY29uaihtMS5jb25qdWdhdGUoKSksIG0xKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYnMobTEpLCBzcXJ0KHNxdWFyZShtMS5yZWFsKCkpK3NxdWFyZShtMS5pbWFnKCkpKSk7CisgIFZFUklGWV9JU19BUFBST1goYWJzKG0xKSwgc3FydChzcXVhcmUobTEucmVhbCgpKSArIHNxdWFyZShtMS5pbWFnKCkpKSk7CiAgIFZFUklGWV9JU19BUFBST1goYWJzKG0xKSwgc3FydChhYnMyKG0xKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKGxvZzEwKG0xKSwgbG9nKG0xKS9sb2coMTApKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChsb2cyKG0xKSwgbG9nKG0xKS9sb2coMikpOworICBWRVJJRllfSVNfQVBQUk9YKGxvZzEwKG0xKSwgbG9nKG0xKSAvIGxvZygxMCkpOworICBWRVJJRllfSVNfQVBQUk9YKGxvZzIobTEpLCBsb2cobTEpIC8gbG9nKDIpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCBtMS5zaWduKCksIC0oLW0xKS5zaWduKCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggbTEuc2lnbigpICogbTEuYWJzKCksIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5zaWduKCksIC0oLW0xKS5zaWduKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLnNpZ24oKSAqIG0xLmFicygpLCBtMSk7CiAKICAgLy8gc2NhbGFyIGJ5IGFycmF5IGRpdmlzaW9uCi0gIFNjYWxhciAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAgIGNvbnN0IFJlYWxTY2FsYXIgdGlueSA9IHN0ZDo6c3FydChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkpOwogICBzMSArPSBTY2FsYXIodGlueSk7Ci0gIG0xICs9IEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLFNjYWxhcih0aW55KSk7Ci0gIFZFUklGWV9JU19BUFBST1goczEvbTEsIHMxICogbTEuaW52ZXJzZSgpKTsKKyAgbTEgKz0gQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBTY2FsYXIodGlueSkpOworICBWRVJJRllfSVNfQVBQUk9YKHMxIC8gbTEsIHMxICogbTEuaW52ZXJzZSgpKTsKIAogICAvLyBjaGVjayBpbnBsYWNlIHRyYW5zcG9zZQogICBtMiA9IG0xOwpAQCAtMTA0Myw4ICsxMDE4LDggQEAKICAgVkVSSUZZX0lTX0FQUFJPWChtNiwgbTUudHJhbnNwb3NlKCkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBBcnJheVR5cGU+IHZvaWQgbWluX21heChjb25zdCBBcnJheVR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJyYXlUeXBlPgordm9pZCBtaW5fbWF4KGNvbnN0IEFycmF5VHlwZSYgbSkgewogICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5VHlwZTo6U2NhbGFyIFNjYWxhcjsKIAogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CkBAIC0xMDU2LDIzICsxMDMxLDIyIEBACiAgIFNjYWxhciBtYXhNMSA9IG0xLm1heENvZWZmKCk7CiAgIFNjYWxhciBtaW5NMSA9IG0xLm1pbkNvZWZmKCk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWluTTEpLCAobTEubWluKShBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWluTTEpKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEsIChtMS5taW4pKEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtYXhNMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIG1pbk0xKSwgKG0xLm1pbikoQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtaW5NMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgKG0xLm1pbikoQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtYXhNMSkpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtYXhNMSksIChtMS5tYXgpKEFycmF5VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtYXhNMSkpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMSwgKG0xLm1heCkoQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1pbk0xKSkpOworICBWRVJJRllfSVNfQVBQUk9YKEFycmF5VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgbWF4TTEpLCAobTEubWF4KShBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIG1heE0xKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLCAobTEubWF4KShBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIG1pbk0xKSkpOwogCiAgIC8vIG1pbi9tYXggd2l0aCBzY2FsYXIgaW5wdXQKLSAgVkVSSUZZX0lTX0FQUFJPWChBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWluTTEpLCAobTEubWluKSggbWluTTEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMSwgKG0xLm1pbikoIG1heE0xKSk7CisgIFZFUklGWV9JU19BUFBST1goQXJyYXlUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtaW5NMSksIChtMS5taW4pKG1pbk0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIChtMS5taW4pKG1heE0xKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWF4TTEpLCAobTEubWF4KSggbWF4TTEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMSwgKG0xLm1heCkoIG1pbk0xKSk7Ci0KKyAgVkVSSUZZX0lTX0FQUFJPWChBcnJheVR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIG1heE0xKSwgKG0xLm1heCkobWF4TTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgKG0xLm1heCkobWluTTEpKTsKIAogICAvLyBtaW4vbWF4IHdpdGggdmFyaW91cyBOYU4gcHJvcGFnYXRpb24gb3B0aW9ucy4KICAgaWYgKG0xLnNpemUoKSA+IDEgJiYgIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpIHsKLSAgICBtMSgwLDApID0gTnVtVHJhaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOworICAgIG0xKDAsIDApID0gTnVtVHJhaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOwogICAgIG1heE0xID0gbTEudGVtcGxhdGUgbWF4Q29lZmY8UHJvcGFnYXRlTmFOPigpOwogICAgIG1pbk0xID0gbTEudGVtcGxhdGUgbWluQ29lZmY8UHJvcGFnYXRlTmFOPigpOwogICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikobWF4TTEpKTsKQEAgLTEwODUsMTcgKzEwNTksMTcgQEAKICAgfQogfQogCi10ZW1wbGF0ZTxpbnQgTj4KK3RlbXBsYXRlIDxpbnQgTj4KIHN0cnVjdCBzaGlmdF9sZWZ0IHsKLSAgdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgogICBTY2FsYXIgb3BlcmF0b3IoKShjb25zdCBTY2FsYXImIHYpIGNvbnN0IHsKICAgICByZXR1cm4gKHYgPDwgTik7CiAgIH0KIH07CiAKLXRlbXBsYXRlPGludCBOPgordGVtcGxhdGUgPGludCBOPgogc3RydWN0IGFyaXRobWV0aWNfc2hpZnRfcmlnaHQgewotICB0ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CiAgIFNjYWxhciBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgdikgY29uc3QgewogICAgIHJldHVybiAodiA+PiBOKTsKICAgfQpAQCAtMTEwOCw3ICsxMDgyLDcgQEAKICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgTWF4U2hpZnQgPSAoQ0hBUl9CSVQgKiBTaXplKSAtIDE7CiAKICAgdGVtcGxhdGUgPHNpemVfdCBOID0gMT4KLSAgc3RhdGljIGlubGluZSBzdGQ6OmVuYWJsZV9pZl90PChOID4gIE1heFNoaWZ0KSwgdm9pZD4gcnVuKGNvbnN0IEFycmF5VHlwZSYgICkge30KKyAgc3RhdGljIGlubGluZSBzdGQ6OmVuYWJsZV9pZl90PChOID4gTWF4U2hpZnQpLCB2b2lkPiBydW4oY29uc3QgQXJyYXlUeXBlJikge30KICAgdGVtcGxhdGUgPHNpemVfdCBOID0gMT4KICAgc3RhdGljIGlubGluZSBzdGQ6OmVuYWJsZV9pZl90PChOIDw9IE1heFNoaWZ0KSwgdm9pZD4gcnVuKGNvbnN0IEFycmF5VHlwZSYgbSkgewogICAgIGNvbnN0IEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKQEAgLTExMjksNyArMTEwMyw3IEBACiB9OwogdGVtcGxhdGUgPHR5cGVuYW1lIEFycmF5VHlwZT4KIHZvaWQgc2lnbmVkX3NoaWZ0X3Rlc3QoY29uc3QgQXJyYXlUeXBlJiBtKSB7Ci0gICAgc2lnbmVkX3NoaWZ0X3Rlc3RfaW1wbDxBcnJheVR5cGU+OjpydW4obSk7CisgIHNpZ25lZF9zaGlmdF90ZXN0X2ltcGw8QXJyYXlUeXBlPjo6cnVuKG0pOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJyYXlUeXBlPgpAQCAtMTEzOSwxMyArMTExMywxOCBAQAogICBzdGF0aWMgYm9vbCBzY2FsYXJfdG9fYm9vbChjb25zdCBTY2FsYXImIHgpIHsgcmV0dXJuIHggIT0gU2NhbGFyKDApOyB9CiAgIHN0YXRpYyBTY2FsYXIgYm9vbF90b19zY2FsYXIoYm9vbCB4KSB7IHJldHVybiB4ID8gU2NhbGFyKDEpIDogU2NhbGFyKDApOyB9CiAKLSAgc3RhdGljIFNjYWxhciBldmFsX2Jvb2xfYW5kKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KSB7IHJldHVybiBib29sX3RvX3NjYWxhcihzY2FsYXJfdG9fYm9vbCh4KSAmJiBzY2FsYXJfdG9fYm9vbCh5KSk7IH0KLSAgc3RhdGljIFNjYWxhciBldmFsX2Jvb2xfb3IoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpIHsgcmV0dXJuIGJvb2xfdG9fc2NhbGFyKHNjYWxhcl90b19ib29sKHgpIHx8IHNjYWxhcl90b19ib29sKHkpKTsgfQotICBzdGF0aWMgU2NhbGFyIGV2YWxfYm9vbF94b3IoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpIHsgcmV0dXJuIGJvb2xfdG9fc2NhbGFyKHNjYWxhcl90b19ib29sKHgpICE9IHNjYWxhcl90b19ib29sKHkpKTsgfQorICBzdGF0aWMgU2NhbGFyIGV2YWxfYm9vbF9hbmQoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpIHsKKyAgICByZXR1cm4gYm9vbF90b19zY2FsYXIoc2NhbGFyX3RvX2Jvb2woeCkgJiYgc2NhbGFyX3RvX2Jvb2woeSkpOworICB9CisgIHN0YXRpYyBTY2FsYXIgZXZhbF9ib29sX29yKGNvbnN0IFNjYWxhciYgeCwgY29uc3QgU2NhbGFyJiB5KSB7CisgICAgcmV0dXJuIGJvb2xfdG9fc2NhbGFyKHNjYWxhcl90b19ib29sKHgpIHx8IHNjYWxhcl90b19ib29sKHkpKTsKKyAgfQorICBzdGF0aWMgU2NhbGFyIGV2YWxfYm9vbF94b3IoY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpIHsKKyAgICByZXR1cm4gYm9vbF90b19zY2FsYXIoc2NhbGFyX3RvX2Jvb2woeCkgIT0gc2NhbGFyX3RvX2Jvb2woeSkpOworICB9CiAgIHN0YXRpYyBTY2FsYXIgZXZhbF9ib29sX25vdChjb25zdCBTY2FsYXImIHgpIHsgcmV0dXJuIGJvb2xfdG9fc2NhbGFyKCFzY2FsYXJfdG9fYm9vbCh4KSk7IH0KIAogICBzdGF0aWMgdm9pZCBydW4oY29uc3QgQXJyYXlUeXBlJiBtKSB7Ci0gICAgICAKICAgICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgICAgSW5kZXggY29scyA9IG0uY29scygpOwogCkBAIC0xMjMyLDI0ICsxMjExLDYzIEBACiB9OwogdGVtcGxhdGUgPHR5cGVuYW1lIEFycmF5VHlwZT4KIHZvaWQgdHlwZWRfbG9naWNhbHNfdGVzdChjb25zdCBBcnJheVR5cGUmIG0pIHsKLSAgICB0eXBlZF9sb2dpY2Fsc190ZXN0X2ltcGw8QXJyYXlUeXBlPjo6cnVuKG0pOworICB0eXBlZF9sb2dpY2Fsc190ZXN0X2ltcGw8QXJyYXlUeXBlPjo6cnVuKG0pOwogfQogCiAvLyBwcmludCBub24tbWFuZ2xlZCB0eXBlbmFtZXMKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgVCYpIHsgcmV0dXJuIHR5cGVpZChUKS5uYW1lKCk7IH0KLXRlbXBsYXRlPD4gc3RkOjpzdHJpbmcgcHJpbnRUeXBlSW5mbyhjb25zdCBpbnQ4X3QmKSB7IHJldHVybiAiaW50OF90IjsgfQotdGVtcGxhdGU8PiBzdGQ6OnN0cmluZyBwcmludFR5cGVJbmZvKGNvbnN0IGludDE2X3QmKSB7IHJldHVybiAiaW50MTZfdCI7IH0KLXRlbXBsYXRlPD4gc3RkOjpzdHJpbmcgcHJpbnRUeXBlSW5mbyhjb25zdCBpbnQzMl90JikgeyByZXR1cm4gImludDMyX3QiOyB9Ci10ZW1wbGF0ZTw+IHN0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgaW50NjRfdCYpIHsgcmV0dXJuICJpbnQ2NF90IjsgfQotdGVtcGxhdGU8PiBzdGQ6OnN0cmluZyBwcmludFR5cGVJbmZvKGNvbnN0IHVpbnQ4X3QmKSB7IHJldHVybiAidWludDhfdCI7IH0KLXRlbXBsYXRlPD4gc3RkOjpzdHJpbmcgcHJpbnRUeXBlSW5mbyhjb25zdCB1aW50MTZfdCYpIHsgcmV0dXJuICJ1aW50MTZfdCI7IH0KLXRlbXBsYXRlPD4gc3RkOjpzdHJpbmcgcHJpbnRUeXBlSW5mbyhjb25zdCB1aW50MzJfdCYpIHsgcmV0dXJuICJ1aW50MzJfdCI7IH0KLXRlbXBsYXRlPD4gc3RkOjpzdHJpbmcgcHJpbnRUeXBlSW5mbyhjb25zdCB1aW50NjRfdCYpIHsgcmV0dXJuICJ1aW50NjRfdCI7IH0KLXRlbXBsYXRlPD4gc3RkOjpzdHJpbmcgcHJpbnRUeXBlSW5mbyhjb25zdCBmbG9hdCYpIHsgcmV0dXJuICJmbG9hdCI7IH0KLXRlbXBsYXRlPD4gc3RkOjpzdHJpbmcgcHJpbnRUeXBlSW5mbyhjb25zdCBkb3VibGUmKSB7IHJldHVybiAiZG91YmxlIjsgfQotLy90ZW1wbGF0ZTw+IHN0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgbG9uZyBkb3VibGUmKSB7IHJldHVybiAibG9uZyBkb3VibGUiOyB9Ci10ZW1wbGF0ZTw+IHN0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgaGFsZiYpIHsgcmV0dXJuICJoYWxmIjsgfQotdGVtcGxhdGU8PiBzdGQ6OnN0cmluZyBwcmludFR5cGVJbmZvKGNvbnN0IGJmbG9hdDE2JikgeyByZXR1cm4gImJmbG9hdDE2IjsgfQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyBwcmludFR5cGVJbmZvKGNvbnN0IFQmKSB7CisgIHJldHVybiB0eXBlaWQoVCkubmFtZSgpOworfQordGVtcGxhdGUgPD4KK3N0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgaW50OF90JikgeworICByZXR1cm4gImludDhfdCI7Cit9Cit0ZW1wbGF0ZSA8Pgorc3RkOjpzdHJpbmcgcHJpbnRUeXBlSW5mbyhjb25zdCBpbnQxNl90JikgeworICByZXR1cm4gImludDE2X3QiOworfQordGVtcGxhdGUgPD4KK3N0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgaW50MzJfdCYpIHsKKyAgcmV0dXJuICJpbnQzMl90IjsKK30KK3RlbXBsYXRlIDw+CitzdGQ6OnN0cmluZyBwcmludFR5cGVJbmZvKGNvbnN0IGludDY0X3QmKSB7CisgIHJldHVybiAiaW50NjRfdCI7Cit9Cit0ZW1wbGF0ZSA8Pgorc3RkOjpzdHJpbmcgcHJpbnRUeXBlSW5mbyhjb25zdCB1aW50OF90JikgeworICByZXR1cm4gInVpbnQ4X3QiOworfQordGVtcGxhdGUgPD4KK3N0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgdWludDE2X3QmKSB7CisgIHJldHVybiAidWludDE2X3QiOworfQordGVtcGxhdGUgPD4KK3N0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgdWludDMyX3QmKSB7CisgIHJldHVybiAidWludDMyX3QiOworfQordGVtcGxhdGUgPD4KK3N0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgdWludDY0X3QmKSB7CisgIHJldHVybiAidWludDY0X3QiOworfQordGVtcGxhdGUgPD4KK3N0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgZmxvYXQmKSB7CisgIHJldHVybiAiZmxvYXQiOworfQordGVtcGxhdGUgPD4KK3N0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgZG91YmxlJikgeworICByZXR1cm4gImRvdWJsZSI7Cit9CisvLyB0ZW1wbGF0ZTw+IHN0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgbG9uZyBkb3VibGUmKSB7IHJldHVybiAibG9uZyBkb3VibGUiOyB9Cit0ZW1wbGF0ZSA8Pgorc3RkOjpzdHJpbmcgcHJpbnRUeXBlSW5mbyhjb25zdCBoYWxmJikgeworICByZXR1cm4gImhhbGYiOworfQordGVtcGxhdGUgPD4KK3N0ZDo6c3RyaW5nIHByaW50VHlwZUluZm8oY29uc3QgYmZsb2F0MTYmKSB7CisgIHJldHVybiAiYmZsb2F0MTYiOworfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjVHlwZSwgdHlwZW5hbWUgRHN0VHlwZSwgaW50IFJvd3NBdENvbXBpbGVUaW1lLCBpbnQgQ29sc0F0Q29tcGlsZVRpbWU+CiBzdHJ1Y3QgY2FzdF90ZXN0X2ltcGwgewpAQCAtMTMxOCw3OSArMTMzNiw5MSBAQAogdGVtcGxhdGUgPGludCBSb3dzQXRDb21waWxlVGltZSwgaW50IENvbHNBdENvbXBpbGVUaW1lPgogdm9pZCBjYXN0X3Rlc3QoKSB7CiAgIGNhc3RfdGVzdHNfaW1wbDxSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUsIGJvb2wsIGludDhfdCwgaW50MTZfdCwgaW50MzJfdCwgaW50NjRfdCwgdWludDhfdCwgdWludDE2X3QsCi0gICAgICAgICAgICAgICAgICB1aW50MzJfdCwgdWludDY0X3QsIGZsb2F0LCBkb3VibGUsIC8qbG9uZyBkb3VibGUsICovaGFsZiwgYmZsb2F0MTY+OjpydW4oKTsKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCB1aW50NjRfdCwgZmxvYXQsIGRvdWJsZSwgLypsb25nIGRvdWJsZSwgKi8gaGFsZiwgYmZsb2F0MTY+OjpydW4oKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGFycmF5X2N3aXNlKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBhcnJheV9nZW5lcmljKEFycmF5PGZsb2F0LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBhcnJheV9nZW5lcmljKEFycmF5MjJmKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGFycmF5X2dlbmVyaWMoQXJyYXk0NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggYXJyYXlfZ2VuZXJpYyhBcnJheVhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNyggYXJyYXlfZ2VuZXJpYyhBcnJheVhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF84KCBhcnJheV9nZW5lcmljKEFycmF5WFhpKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzcoIGFycmF5X2dlbmVyaWMoQXJyYXk8SW5kZXgsRHluYW1pYyxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF84KCBzaWduZWRfc2hpZnRfdGVzdChBcnJheVhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKLSAgICBDQUxMX1NVQlRFU1RfOSggc2lnbmVkX3NoaWZ0X3Rlc3QoQXJyYXk8SW5kZXgsIER5bmFtaWMsIER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwotICAgIENBTExfU1VCVEVTVF8xMCggYXJyYXlfZ2VuZXJpYyhBcnJheTx1aW50MzJfdCwgRHluYW1pYywgRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzExKCBhcnJheV9nZW5lcmljKEFycmF5PHVpbnQ2NF90LCBEeW5hbWljLCBEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKLSAgfQotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBjb21wYXJpc29ucyhBcnJheTxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggY29tcGFyaXNvbnMoQXJyYXkyMmYoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggY29tcGFyaXNvbnMoQXJyYXk0NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNyggY29tcGFyaXNvbnMoQXJyYXlYWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOCggY29tcGFyaXNvbnMoQXJyYXlYWGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgfQotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF82KCBtaW5fbWF4KEFycmF5PGZsb2F0LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF83KCBtaW5fbWF4KEFycmF5MjJmKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzgoIG1pbl9tYXgoQXJyYXk0NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOSggbWluX21heChBcnJheVhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF8xMCggbWluX21heChBcnJheVhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICB9Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzExKCBhcnJheV9yZWFsKEFycmF5PGZsb2F0LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8xMiggYXJyYXlfcmVhbChBcnJheTIyZigpKSApOwotICAgIENBTExfU1VCVEVTVF8xMyggYXJyYXlfcmVhbChBcnJheTQ0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF8xNCggYXJyYXlfcmVhbChBcnJheVhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF8xNSggYXJyYXlfcmVhbChBcnJheTxFaWdlbjo6aGFsZiwgMzIsIDMyPigpKSApOwotICAgIENBTExfU1VCVEVTVF8xNiggYXJyYXlfcmVhbChBcnJheTxFaWdlbjo6YmZsb2F0MTYsIDMyLCAzMj4oKSkgKTsKLSAgfQotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xNyggYXJyYXlfY29tcGxleChBcnJheVhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMTgoIGFycmF5X2NvbXBsZXgoQXJyYXlYWGNkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKLSAgfQotCi0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzE5KCBmbG9hdF9wb3dfdGVzdCgpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIwKCBpbnRfcG93X3Rlc3QoKSApOwotICAgIENBTExfU1VCVEVTVF8yMSggbWl4ZWRfcG93X3Rlc3QoKSApOwotICAgIENBTExfU1VCVEVTVF8yMiggc2lnbmJpdF90ZXN0cygpICk7CitFSUdFTl9ERUNMQVJFX1RFU1QoYXJyYXlfY3dpc2UpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoYXJyYXlfZ2VuZXJpYyhBcnJheTxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKGFycmF5X2dlbmVyaWMoQXJyYXkyMmYoKSkpOworICAgIENBTExfU1VCVEVTVF8zKGFycmF5X2dlbmVyaWMoQXJyYXk0NGQoKSkpOworICAgIENBTExfU1VCVEVTVF80KGFycmF5X2dlbmVyaWMoCisgICAgICAgIEFycmF5WFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNyhhcnJheV9nZW5lcmljKAorICAgICAgICBBcnJheVhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfOChhcnJheV9nZW5lcmljKAorICAgICAgICBBcnJheVhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNyhhcnJheV9nZW5lcmljKEFycmF5PEluZGV4LCBEeW5hbWljLCBEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF84KHNpZ25lZF9zaGlmdF90ZXN0KAorICAgICAgICBBcnJheVhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfOShzaWduZWRfc2hpZnRfdGVzdChBcnJheTxJbmRleCwgRHluYW1pYywgRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEwKGFycmF5X2dlbmVyaWMoQXJyYXk8dWludDMyX3QsIER5bmFtaWMsIER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF8xMShhcnJheV9nZW5lcmljKEFycmF5PHVpbnQ2NF90LCBEeW5hbWljLCBEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKICAgfQogICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMjMoIHR5cGVkX2xvZ2ljYWxzX3Rlc3QoQXJyYXlYPGludD4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMjQoIHR5cGVkX2xvZ2ljYWxzX3Rlc3QoQXJyYXlYPGZsb2F0PihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF8yNSggdHlwZWRfbG9naWNhbHNfdGVzdChBcnJheVg8ZG91YmxlPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF8yNiggdHlwZWRfbG9naWNhbHNfdGVzdChBcnJheVg8c3RkOjpjb21wbGV4PGZsb2F0Pj4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwotICAgIENBTExfU1VCVEVTVF8yNyggdHlwZWRfbG9naWNhbHNfdGVzdChBcnJheVg8c3RkOjpjb21wbGV4PGRvdWJsZT4+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShjb21wYXJpc29ucyhBcnJheTxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKGNvbXBhcmlzb25zKEFycmF5MjJmKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhjb21wYXJpc29ucyhBcnJheTQ0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoY29tcGFyaXNvbnMoCisgICAgICAgIEFycmF5WFhmKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF84KGNvbXBhcmlzb25zKAorICAgICAgICBBcnJheVhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfNihtaW5fbWF4KEFycmF5PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcobWluX21heChBcnJheTIyZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgobWluX21heChBcnJheTQ0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzkobWluX21heCgKKyAgICAgICAgQXJyYXlYWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEwKG1pbl9tYXgoCisgICAgICAgIEFycmF5WFhpKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xMShhcnJheV9yZWFsKEFycmF5PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEyKGFycmF5X3JlYWwoQXJyYXkyMmYoKSkpOworICAgIENBTExfU1VCVEVTVF8xMyhhcnJheV9yZWFsKEFycmF5NDRkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTQoYXJyYXlfcmVhbCgKKyAgICAgICAgQXJyYXlYWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzE1KGFycmF5X3JlYWwoQXJyYXk8RWlnZW46OmhhbGYsIDMyLCAzMj4oKSkpOworICAgIENBTExfU1VCVEVTVF8xNihhcnJheV9yZWFsKEFycmF5PEVpZ2VuOjpiZmxvYXQxNiwgMzIsIDMyPigpKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzE3KGFycmF5X2NvbXBsZXgoCisgICAgICAgIEFycmF5WFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTgoYXJyYXlfY29tcGxleCgKKyAgICAgICAgQXJyYXlYWGNkKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwogICB9CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzI4KCAoY2FzdF90ZXN0PDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzI5KCAoY2FzdF90ZXN0PDMsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMwKCAoY2FzdF90ZXN0PDUsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMxKCAoY2FzdF90ZXN0PDksIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMyKCAoY2FzdF90ZXN0PDE3LCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8zMyggKGNhc3RfdGVzdDxEeW5hbWljLCAxPigpKSApOworICAgIENBTExfU1VCVEVTVF8xOShmbG9hdF9wb3dfdGVzdCgpKTsKKyAgICBDQUxMX1NVQlRFU1RfMjAoaW50X3Bvd190ZXN0KCkpOworICAgIENBTExfU1VCVEVTVF8yMShtaXhlZF9wb3dfdGVzdCgpKTsKKyAgICBDQUxMX1NVQlRFU1RfMjIoc2lnbmJpdF90ZXN0cygpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMjModHlwZWRfbG9naWNhbHNfdGVzdChBcnJheVg8aW50PihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzI0KHR5cGVkX2xvZ2ljYWxzX3Rlc3QoQXJyYXlYPGZsb2F0PihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzI1KHR5cGVkX2xvZ2ljYWxzX3Rlc3QoQXJyYXlYPGRvdWJsZT4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF8yNih0eXBlZF9sb2dpY2Fsc190ZXN0KEFycmF5WDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+PihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzI3KHR5cGVkX2xvZ2ljYWxzX3Rlc3QoQXJyYXlYPHN0ZDo6Y29tcGxleDxkb3VibGU+PihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CiAgIH0KIAotICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6Z2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlPGludD46OnR5cGUsIGludCA+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6Z2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlPGZsb2F0Pjo6dHlwZSwgZmxvYXQgPjo6dmFsdWUpKTsKLSAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6Omdsb2JhbF9tYXRoX2Z1bmN0aW9uc19maWx0ZXJpbmdfYmFzZTxBcnJheTJpPjo6dHlwZSwgQXJyYXlCYXNlPEFycmF5Mmk+ID46OnZhbHVlKSk7Ci0gIHR5cGVkZWYgQ3dpc2VVbmFyeU9wPGludGVybmFsOjpzY2FsYXJfYWJzX29wPGRvdWJsZT4sIEFycmF5WGQgPiBYcHI7Ci0gIFZFUklGWSgoaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjpnbG9iYWxfbWF0aF9mdW5jdGlvbnNfZmlsdGVyaW5nX2Jhc2U8WHByPjo6dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5QmFzZTxYcHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPjo6dmFsdWUpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzI4KChjYXN0X3Rlc3Q8MSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8yOSgoY2FzdF90ZXN0PDMsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMzAoKGNhc3RfdGVzdDw1LCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMxKChjYXN0X3Rlc3Q8OSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8zMigoY2FzdF90ZXN0PDE3LCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMzKChjYXN0X3Rlc3Q8RHluYW1pYywgMT4oKSkpOworICB9CisKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTxpbnRlcm5hbDo6Z2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlPGludD46OnR5cGUsIGludD46OnZhbHVlKSk7CisgIFZFUklGWSgoaW50ZXJuYWw6OmlzX3NhbWU8aW50ZXJuYWw6Omdsb2JhbF9tYXRoX2Z1bmN0aW9uc19maWx0ZXJpbmdfYmFzZTxmbG9hdD46OnR5cGUsIGZsb2F0Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTxpbnRlcm5hbDo6Z2xvYmFsX21hdGhfZnVuY3Rpb25zX2ZpbHRlcmluZ19iYXNlPEFycmF5Mmk+Ojp0eXBlLCBBcnJheUJhc2U8QXJyYXkyaT4+Ojp2YWx1ZSkpOworICB0eXBlZGVmIEN3aXNlVW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX2Fic19vcDxkb3VibGU+LCBBcnJheVhkPiBYcHI7CisgIFZFUklGWSgoaW50ZXJuYWw6OmlzX3NhbWU8aW50ZXJuYWw6Omdsb2JhbF9tYXRoX2Z1bmN0aW9uc19maWx0ZXJpbmdfYmFzZTxYcHI+Ojp0eXBlLCBBcnJheUJhc2U8WHByPj46OnZhbHVlKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2FycmF5X2Zvcl9tYXRyaXguY3BwIGIvdGVzdC9hcnJheV9mb3JfbWF0cml4LmNwcAppbmRleCAzNGQ3MjE1Li5hZmU2ODk0IDEwMDY0NAotLS0gYS90ZXN0L2FycmF5X2Zvcl9tYXRyaXguY3BwCisrKyBiL3Rlc3QvYXJyYXlfZm9yX21hdHJpeC5jcHAKQEAgLTksMjkgKzksMjYgQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBhcnJheV9mb3JfbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgYXJyYXlfZm9yX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gQ29sVmVjdG9yVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gUm93VmVjdG9yVHlwZTsgCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IFJvd1ZlY3RvclR5cGU7CiAKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKLSAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKTsKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMpOwogCiAgIENvbFZlY3RvclR5cGUgY3YxID0gQ29sVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOwogICBSb3dWZWN0b3JUeXBlIHJ2MSA9IFJvd1ZlY3RvclR5cGU6OlJhbmRvbShjb2xzKTsKIAotICBTY2FsYXIgIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCi0gICAgICAgICAgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksIHMyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAKICAgLy8gc2NhbGFyIGFkZGl0aW9uCiAgIFZFUklGWV9JU19BUFBST1gobTEuYXJyYXkoKSArIHMxLCBzMSArIG0xLmFycmF5KCkpOwotICBWRVJJRllfSVNfQVBQUk9YKChtMS5hcnJheSgpICsgczEpLm1hdHJpeCgpLCBNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsczEpICsgbTEpOwotICBWRVJJRllfSVNfQVBQUk9YKCgobTEqU2NhbGFyKDIpKS5hcnJheSgpIC0gczIpLm1hdHJpeCgpLCAobTErbTEpIC0gTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMyKSApOworICBWRVJJRllfSVNfQVBQUk9YKChtMS5hcnJheSgpICsgczEpLm1hdHJpeCgpLCBNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBzMSkgKyBtMSk7CisgIFZFUklGWV9JU19BUFBST1goKChtMSAqIFNjYWxhcigyKSkuYXJyYXkoKSAtIHMyKS5tYXRyaXgoKSwgKG0xICsgbTEpIC0gTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgczIpKTsKICAgbTMgPSBtMTsKICAgbTMuYXJyYXkoKSArPSBzMjsKICAgVkVSSUZZX0lTX0FQUFJPWChtMywgKG0xLmFycmF5KCkgKyBzMikubWF0cml4KCkpOwpAQCAtNDIsOSArMzksMTEgQEAKICAgLy8gcmVkdWN0aW9ucwogICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obTEuY29sd2lzZSgpLnN1bSgpLnN1bSgpIC0gbTEuc3VtKCksIG0xLnNxdWFyZWROb3JtKCkpOwogICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obTEucm93d2lzZSgpLnN1bSgpLnN1bSgpIC0gbTEuc3VtKCksIG0xLnNxdWFyZWROb3JtKCkpOwotICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obTEuY29sd2lzZSgpLnN1bSgpICsgbTIuY29sd2lzZSgpLnN1bSgpIC0gKG0xK20yKS5jb2x3aXNlKCkuc3VtKCksIChtMSttMikuc3F1YXJlZE5vcm0oKSk7Ci0gIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihtMS5yb3d3aXNlKCkuc3VtKCkgLSBtMi5yb3d3aXNlKCkuc3VtKCkgLSAobTEtbTIpLnJvd3dpc2UoKS5zdW0oKSwgKG0xLW0yKS5zcXVhcmVkTm9ybSgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb2x3aXNlKCkuc3VtKCksIG0xLmNvbHdpc2UoKS5yZWR1eChpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXIsU2NhbGFyPigpKSk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihtMS5jb2x3aXNlKCkuc3VtKCkgKyBtMi5jb2x3aXNlKCkuc3VtKCkgLSAobTEgKyBtMikuY29sd2lzZSgpLnN1bSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0xICsgbTIpLnNxdWFyZWROb3JtKCkpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obTEucm93d2lzZSgpLnN1bSgpIC0gbTIucm93d2lzZSgpLnN1bSgpIC0gKG0xIC0gbTIpLnJvd3dpc2UoKS5zdW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtMSAtIG0yKS5zcXVhcmVkTm9ybSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb2x3aXNlKCkuc3VtKCksIG0xLmNvbHdpc2UoKS5yZWR1eChpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXIsIFNjYWxhcj4oKSkpOwogCiAgIC8vIHZlY3Rvci13aXNlIG9wcwogICBtMyA9IG0xOwpAQCAtNTcsMzcgKzU2LDM3IEBACiAgIFZFUklGWV9JU19BUFBST1gobTMucm93d2lzZSgpIC09IHJ2MSwgbTEucm93d2lzZSgpIC0gcnYxKTsKIAogICAvLyBlbXB0eSBvYmplY3RzCi0gIFZFUklGWV9JU19FUVVBTCgobTEudGVtcGxhdGUgYmxvY2s8MCxEeW5hbWljPigwLDAsMCxjb2xzKS5jb2x3aXNlKCkuc3VtKCkpLCBSb3dWZWN0b3JUeXBlOjpaZXJvKGNvbHMpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChtMS50ZW1wbGF0ZSBibG9jazxEeW5hbWljLDA+KDAsMCxyb3dzLDApLnJvd3dpc2UoKS5zdW0oKSksIENvbFZlY3RvclR5cGU6Olplcm8ocm93cykpOwotICBWRVJJRllfSVNfRVFVQUwoKG0xLnRlbXBsYXRlIGJsb2NrPDAsRHluYW1pYz4oMCwwLDAsY29scykuY29sd2lzZSgpLnByb2QoKSksIFJvd1ZlY3RvclR5cGU6Ok9uZXMoY29scykpOwotICBWRVJJRllfSVNfRVFVQUwoKG0xLnRlbXBsYXRlIGJsb2NrPER5bmFtaWMsMD4oMCwwLHJvd3MsMCkucm93d2lzZSgpLnByb2QoKSksIENvbFZlY3RvclR5cGU6Ok9uZXMocm93cykpOworICBWRVJJRllfSVNfRVFVQUwoKG0xLnRlbXBsYXRlIGJsb2NrPDAsIER5bmFtaWM+KDAsIDAsIDAsIGNvbHMpLmNvbHdpc2UoKS5zdW0oKSksIFJvd1ZlY3RvclR5cGU6Olplcm8oY29scykpOworICBWRVJJRllfSVNfRVFVQUwoKG0xLnRlbXBsYXRlIGJsb2NrPER5bmFtaWMsIDA+KDAsIDAsIHJvd3MsIDApLnJvd3dpc2UoKS5zdW0oKSksIENvbFZlY3RvclR5cGU6Olplcm8ocm93cykpOworICBWRVJJRllfSVNfRVFVQUwoKG0xLnRlbXBsYXRlIGJsb2NrPDAsIER5bmFtaWM+KDAsIDAsIDAsIGNvbHMpLmNvbHdpc2UoKS5wcm9kKCkpLCBSb3dWZWN0b3JUeXBlOjpPbmVzKGNvbHMpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtMS50ZW1wbGF0ZSBibG9jazxEeW5hbWljLCAwPigwLCAwLCByb3dzLCAwKS5yb3d3aXNlKCkucHJvZCgpKSwgQ29sVmVjdG9yVHlwZTo6T25lcyhyb3dzKSk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKG0xLmJsb2NrKDAsMCwwLGNvbHMpLmNvbHdpc2UoKS5zdW0oKSwgUm93VmVjdG9yVHlwZTo6WmVybyhjb2xzKSk7Ci0gIFZFUklGWV9JU19FUVVBTChtMS5ibG9jaygwLDAscm93cywwKS5yb3d3aXNlKCkuc3VtKCksIENvbFZlY3RvclR5cGU6Olplcm8ocm93cykpOwotICBWRVJJRllfSVNfRVFVQUwobTEuYmxvY2soMCwwLDAsY29scykuY29sd2lzZSgpLnByb2QoKSwgUm93VmVjdG9yVHlwZTo6T25lcyhjb2xzKSk7Ci0gIFZFUklGWV9JU19FUVVBTChtMS5ibG9jaygwLDAscm93cywwKS5yb3d3aXNlKCkucHJvZCgpLCBDb2xWZWN0b3JUeXBlOjpPbmVzKHJvd3MpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0xLmJsb2NrKDAsIDAsIDAsIGNvbHMpLmNvbHdpc2UoKS5zdW0oKSwgUm93VmVjdG9yVHlwZTo6WmVybyhjb2xzKSk7CisgIFZFUklGWV9JU19FUVVBTChtMS5ibG9jaygwLCAwLCByb3dzLCAwKS5yb3d3aXNlKCkuc3VtKCksIENvbFZlY3RvclR5cGU6Olplcm8ocm93cykpOworICBWRVJJRllfSVNfRVFVQUwobTEuYmxvY2soMCwgMCwgMCwgY29scykuY29sd2lzZSgpLnByb2QoKSwgUm93VmVjdG9yVHlwZTo6T25lcyhjb2xzKSk7CisgIFZFUklGWV9JU19FUVVBTChtMS5ibG9jaygwLCAwLCByb3dzLCAwKS5yb3d3aXNlKCkucHJvZCgpLCBDb2xWZWN0b3JUeXBlOjpPbmVzKHJvd3MpKTsKIAogICAvLyB2ZXJpZnkgdGhlIGNvbnN0IGFjY2Vzc29ycyBleGlzdAogICBjb25zdCBTY2FsYXImIHJlZl9tMSA9IG0ubWF0cml4KCkuYXJyYXkoKS5jb2VmZlJlZigwKTsKLSAgY29uc3QgU2NhbGFyJiByZWZfbTIgPSBtLm1hdHJpeCgpLmFycmF5KCkuY29lZmZSZWYoMCwwKTsKKyAgY29uc3QgU2NhbGFyJiByZWZfbTIgPSBtLm1hdHJpeCgpLmFycmF5KCkuY29lZmZSZWYoMCwgMCk7CiAgIGNvbnN0IFNjYWxhciYgcmVmX2ExID0gbS5hcnJheSgpLm1hdHJpeCgpLmNvZWZmUmVmKDApOwotICBjb25zdCBTY2FsYXImIHJlZl9hMiA9IG0uYXJyYXkoKS5tYXRyaXgoKS5jb2VmZlJlZigwLDApOworICBjb25zdCBTY2FsYXImIHJlZl9hMiA9IG0uYXJyYXkoKS5tYXRyaXgoKS5jb2VmZlJlZigwLCAwKTsKICAgVkVSSUZZKCZyZWZfYTEgPT0gJnJlZl9tMSk7CiAgIFZFUklGWSgmcmVmX2EyID09ICZyZWZfbTIpOwogCiAgIC8vIENoZWNrIHdyaXRlIGFjY2Vzc29yczoKLSAgbTEuYXJyYXkoKS5jb2VmZlJlZigwLDApID0gMTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMSgwLDApLFNjYWxhcigxKSk7Ci0gIG0xLmFycmF5KCkoMCwwKSA9IDI7Ci0gIFZFUklGWV9JU19BUFBST1gobTEoMCwwKSxTY2FsYXIoMikpOwotICBtMS5hcnJheSgpLm1hdHJpeCgpLmNvZWZmUmVmKDAsMCkgPSAzOwotICBWRVJJRllfSVNfQVBQUk9YKG0xKDAsMCksU2NhbGFyKDMpKTsKLSAgbTEuYXJyYXkoKS5tYXRyaXgoKSgwLDApID0gNDsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMSgwLDApLFNjYWxhcig0KSk7CisgIG0xLmFycmF5KCkuY29lZmZSZWYoMCwgMCkgPSAxOworICBWRVJJRllfSVNfQVBQUk9YKG0xKDAsIDApLCBTY2FsYXIoMSkpOworICBtMS5hcnJheSgpKDAsIDApID0gMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSgwLCAwKSwgU2NhbGFyKDIpKTsKKyAgbTEuYXJyYXkoKS5tYXRyaXgoKS5jb2VmZlJlZigwLCAwKSA9IDM7CisgIFZFUklGWV9JU19BUFBST1gobTEoMCwgMCksIFNjYWxhcigzKSk7CisgIG0xLmFycmF5KCkubWF0cml4KCkoMCwgMCkgPSA0OworICBWRVJJRllfSVNfQVBQUk9YKG0xKDAsIDApLCBTY2FsYXIoNCkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNvbXBhcmlzb25zKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY29tcGFyaXNvbnMoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICB1c2luZyBzdGQ6OmFiczsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CkBAIC05NSw4OCArOTQsODEgQEAKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKLSAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksCi0gICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cyAtIDEpLCBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scyAtIDEpOwogCi0gIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTMocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKTsKIAogICBWRVJJRlkoKChtMS5hcnJheSgpICsgU2NhbGFyKDEpKSA+IG0xLmFycmF5KCkpLmFsbCgpKTsKICAgVkVSSUZZKCgobTEuYXJyYXkoKSAtIFNjYWxhcigxKSkgPCBtMS5hcnJheSgpKS5hbGwoKSk7Ci0gIGlmIChyb3dzKmNvbHM+MSkKLSAgeworICBpZiAocm93cyAqIGNvbHMgPiAxKSB7CiAgICAgbTMgPSBtMTsKLSAgICBtMyhyLGMpICs9IDE7Ci0gICAgVkVSSUZZKCEgKG0xLmFycmF5KCkgPCBtMy5hcnJheSgpKS5hbGwoKSApOwotICAgIFZFUklGWSghIChtMS5hcnJheSgpID4gbTMuYXJyYXkoKSkuYWxsKCkgKTsKKyAgICBtMyhyLCBjKSArPSAxOworICAgIFZFUklGWSghKG0xLmFycmF5KCkgPCBtMy5hcnJheSgpKS5hbGwoKSk7CisgICAgVkVSSUZZKCEobTEuYXJyYXkoKSA+IG0zLmFycmF5KCkpLmFsbCgpKTsKICAgfQogCiAgIC8vIGNvbXBhcmlzb25zIHRvIHNjYWxhcgotICBWRVJJRlkoIChtMS5hcnJheSgpICE9IChtMShyLGMpKzEpICkuYW55KCkgKTsKLSAgVkVSSUZZKCAobTEuYXJyYXkoKSA+IChtMShyLGMpLTEpICkuYW55KCkgKTsKLSAgVkVSSUZZKCAobTEuYXJyYXkoKSA8IChtMShyLGMpKzEpICkuYW55KCkgKTsKLSAgVkVSSUZZKCAobTEuYXJyYXkoKSA9PSBtMShyLGMpICkuYW55KCkgKTsKLSAgVkVSSUZZKCBtMS5jd2lzZUVxdWFsKG0xKHIsYykpLmFueSgpICk7CisgIFZFUklGWSgobTEuYXJyYXkoKSAhPSAobTEociwgYykgKyAxKSkuYW55KCkpOworICBWRVJJRlkoKG0xLmFycmF5KCkgPiAobTEociwgYykgLSAxKSkuYW55KCkpOworICBWRVJJRlkoKG0xLmFycmF5KCkgPCAobTEociwgYykgKyAxKSkuYW55KCkpOworICBWRVJJRlkoKG0xLmFycmF5KCkgPT0gbTEociwgYykpLmFueSgpKTsKKyAgVkVSSUZZKG0xLmN3aXNlRXF1YWwobTEociwgYykpLmFueSgpKTsKIAogICAvLyB0ZXN0IFNlbGVjdAotICBWRVJJRllfSVNfQVBQUk9YKCAobTEuYXJyYXkoKTxtMi5hcnJheSgpKS5zZWxlY3QobTEsbTIpLCBtMS5jd2lzZU1pbihtMikgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFycmF5KCk+bTIuYXJyYXkoKSkuc2VsZWN0KG0xLG0yKSwgbTEuY3dpc2VNYXgobTIpICk7Ci0gIFNjYWxhciBtaWQgPSAobTEuY3dpc2VBYnMoKS5taW5Db2VmZigpICsgbTEuY3dpc2VBYnMoKS5tYXhDb2VmZigpKS9TY2FsYXIoMik7Ci0gIGZvciAoaW50IGo9MDsgajxjb2xzOyArK2opCi0gIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCi0gICAgbTMoaSxqKSA9IGFicyhtMShpLGopKTxtaWQgPyAwIDogbTEoaSxqKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFycmF5KCkuYWJzKCk8TWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLG1pZCkuYXJyYXkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpLG0xKSwgbTMpOworICBWRVJJRllfSVNfQVBQUk9YKChtMS5hcnJheSgpIDwgbTIuYXJyYXkoKSkuc2VsZWN0KG0xLCBtMiksIG0xLmN3aXNlTWluKG0yKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xLmFycmF5KCkgPiBtMi5hcnJheSgpKS5zZWxlY3QobTEsIG0yKSwgbTEuY3dpc2VNYXgobTIpKTsKKyAgU2NhbGFyIG1pZCA9IChtMS5jd2lzZUFicygpLm1pbkNvZWZmKCkgKyBtMS5jd2lzZUFicygpLm1heENvZWZmKCkpIC8gU2NhbGFyKDIpOworICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7ICsraikKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7ICsraSkgbTMoaSwgaikgPSBhYnMobTEoaSwgaikpIDwgbWlkID8gMCA6IG0xKGksIGopOworICBWRVJJRllfSVNfQVBQUk9YKAorICAgICAgKG0xLmFycmF5KCkuYWJzKCkgPCBNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtaWQpLmFycmF5KCkpLnNlbGVjdChNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpLCBtMSksIG0zKTsKICAgLy8gc2hvcnRlciB2ZXJzaW9uczoKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFycmF5KCkuYWJzKCk8TWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLG1pZCkuYXJyYXkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoMCxtMSksIG0zKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG0xLmFycmF5KCkuYWJzKCk+PU1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxtaWQpLmFycmF5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KG0xLDApLCBtMyk7CisgIFZFUklGWV9JU19BUFBST1goKG0xLmFycmF5KCkuYWJzKCkgPCBNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtaWQpLmFycmF5KCkpLnNlbGVjdCgwLCBtMSksIG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEuYXJyYXkoKS5hYnMoKSA+PSBNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtaWQpLmFycmF5KCkpLnNlbGVjdChtMSwgMCksIG0zKTsKICAgLy8gZXZlbiBzaG9ydGVyIHZlcnNpb246Ci0gIFZFUklGWV9JU19BUFBST1goIChtMS5hcnJheSgpLmFicygpPG1pZCkuc2VsZWN0KDAsbTEpLCBtMyk7CisgIFZFUklGWV9JU19BUFBST1goKG0xLmFycmF5KCkuYWJzKCkgPCBtaWQpLnNlbGVjdCgwLCBtMSksIG0zKTsKIAogICAvLyBjb3VudAotICBWRVJJRlkoKChtMS5hcnJheSgpLmFicygpKzEpPlJlYWxTY2FsYXIoMC4xKSkuY291bnQoKSA9PSByb3dzKmNvbHMpOworICBWRVJJRlkoKChtMS5hcnJheSgpLmFicygpICsgMSkgPiBSZWFsU2NhbGFyKDAuMSkpLmNvdW50KCkgPT0gcm93cyAqIGNvbHMpOwogCiAgIC8vIGFuZC9vcgotICBWRVJJRlkoICgobTEuYXJyYXkoKTxSZWFsU2NhbGFyKDApKS5tYXRyaXgoKSAmJiAobTEuYXJyYXkoKT5SZWFsU2NhbGFyKDApKS5tYXRyaXgoKSkuY291bnQoKSA9PSAwKTsKLSAgVkVSSUZZKCAoKG0xLmFycmF5KCk8UmVhbFNjYWxhcigwKSkubWF0cml4KCkgfHwgKG0xLmFycmF5KCk+PVJlYWxTY2FsYXIoMCkpLm1hdHJpeCgpKS5jb3VudCgpID09IHJvd3MqY29scyk7CisgIFZFUklGWSgoKG0xLmFycmF5KCkgPCBSZWFsU2NhbGFyKDApKS5tYXRyaXgoKSAmJiAobTEuYXJyYXkoKSA+IFJlYWxTY2FsYXIoMCkpLm1hdHJpeCgpKS5jb3VudCgpID09IDApOworICBWRVJJRlkoKChtMS5hcnJheSgpIDwgUmVhbFNjYWxhcigwKSkubWF0cml4KCkgfHwgKG0xLmFycmF5KCkgPj0gUmVhbFNjYWxhcigwKSkubWF0cml4KCkpLmNvdW50KCkgPT0gcm93cyAqIGNvbHMpOwogICBSZWFsU2NhbGFyIGEgPSBtMS5jd2lzZUFicygpLm1lYW4oKTsKLSAgVkVSSUZZKCAoKG0xLmFycmF5KCk8LWEpLm1hdHJpeCgpIHx8IChtMS5hcnJheSgpPmEpLm1hdHJpeCgpKS5jb3VudCgpID09IChtMS5jd2lzZUFicygpLmFycmF5KCk+YSkuY291bnQoKSk7CisgIFZFUklGWSgoKG0xLmFycmF5KCkgPCAtYSkubWF0cml4KCkgfHwgKG0xLmFycmF5KCkgPiBhKS5tYXRyaXgoKSkuY291bnQoKSA9PSAobTEuY3dpc2VBYnMoKS5hcnJheSgpID4gYSkuY291bnQoKSk7CiAKICAgdHlwZWRlZiBNYXRyaXg8SW5kZXgsIER5bmFtaWMsIDE+IFZlY3Rvck9mSW5kaWNlczsKIAogICAvLyBUT0RPIGFsbG93cyBjb2x3aXNlL3Jvd3dpc2UgZm9yIGFycmF5Ci0gIFZFUklGWV9JU19BUFBST1goKChtMS5hcnJheSgpLmFicygpKzEpPlJlYWxTY2FsYXIoMC4xKSkubWF0cml4KCkuY29sd2lzZSgpLmNvdW50KCksIFZlY3Rvck9mSW5kaWNlczo6Q29uc3RhbnQoY29scyxyb3dzKS50cmFuc3Bvc2UoKSk7Ci0gIFZFUklGWV9JU19BUFBST1goKChtMS5hcnJheSgpLmFicygpKzEpPlJlYWxTY2FsYXIoMC4xKSkubWF0cml4KCkucm93d2lzZSgpLmNvdW50KCksIFZlY3Rvck9mSW5kaWNlczo6Q29uc3RhbnQocm93cywgY29scykpOworICBWRVJJRllfSVNfQVBQUk9YKCgobTEuYXJyYXkoKS5hYnMoKSArIDEpID4gUmVhbFNjYWxhcigwLjEpKS5tYXRyaXgoKS5jb2x3aXNlKCkuY291bnQoKSwKKyAgICAgICAgICAgICAgICAgICBWZWN0b3JPZkluZGljZXM6OkNvbnN0YW50KGNvbHMsIHJvd3MpLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKG0xLmFycmF5KCkuYWJzKCkgKyAxKSA+IFJlYWxTY2FsYXIoMC4xKSkubWF0cml4KCkucm93d2lzZSgpLmNvdW50KCksCisgICAgICAgICAgICAgICAgICAgVmVjdG9yT2ZJbmRpY2VzOjpDb25zdGFudChyb3dzLCBjb2xzKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+IHZvaWQgbHBOb3JtKGNvbnN0IFZlY3RvclR5cGUmIHYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZT4KK3ZvaWQgbHBOb3JtKGNvbnN0IFZlY3RvclR5cGUmIHYpIHsKICAgdXNpbmcgc3RkOjpzcXJ0OwogICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKICAgVmVjdG9yVHlwZSB1ID0gVmVjdG9yVHlwZTo6UmFuZG9tKHYuc2l6ZSgpKTsKIAotICBpZih2LnNpemUoKT09MCkKLSAgeworICBpZiAodi5zaXplKCkgPT0gMCkgewogICAgIFZFUklGWV9JU19BUFBST1godS50ZW1wbGF0ZSBscE5vcm08SW5maW5pdHk+KCksIFJlYWxTY2FsYXIoMCkpOwogICAgIFZFUklGWV9JU19BUFBST1godS50ZW1wbGF0ZSBscE5vcm08MT4oKSwgUmVhbFNjYWxhcigwKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWCh1LnRlbXBsYXRlIGxwTm9ybTwyPigpLCBSZWFsU2NhbGFyKDApKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHUudGVtcGxhdGUgbHBOb3JtPDU+KCksIFJlYWxTY2FsYXIoMCkpOwotICB9Ci0gIGVsc2UKLSAgeworICB9IGVsc2UgewogICAgIFZFUklGWV9JU19BUFBST1godS50ZW1wbGF0ZSBscE5vcm08SW5maW5pdHk+KCksIHUuY3dpc2VBYnMoKS5tYXhDb2VmZigpKTsKICAgfQogCiAgIFZFUklGWV9JU19BUFBST1godS50ZW1wbGF0ZSBscE5vcm08MT4oKSwgdS5jd2lzZUFicygpLnN1bSgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh1LnRlbXBsYXRlIGxwTm9ybTwyPigpLCBzcXJ0KHUuYXJyYXkoKS5hYnMoKS5zcXVhcmUoKS5zdW0oKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6cG93KHUudGVtcGxhdGUgbHBOb3JtPDU+KCksIHR5cGVuYW1lIFZlY3RvclR5cGU6OlJlYWxTY2FsYXIoNSkpLCB1LmFycmF5KCkuYWJzKCkucG93KDUpLnN1bSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnBvdyh1LnRlbXBsYXRlIGxwTm9ybTw1PigpLCB0eXBlbmFtZSBWZWN0b3JUeXBlOjpSZWFsU2NhbGFyKDUpKSwKKyAgICAgICAgICAgICAgICAgICB1LmFycmF5KCkuYWJzKCkucG93KDUpLnN1bSgpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBjd2lzZV9taW5fbWF4KGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY3dpc2VfbWluX21heChjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKIAogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CkBAIC0xODgsNTEgKzE4MCw1NCBAQAogICBTY2FsYXIgbWF4TTEgPSBtMS5tYXhDb2VmZigpOwogICBTY2FsYXIgbWluTTEgPSBtMS5taW5Db2VmZigpOwogCi0gIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtaW5NMSksIG0xLmN3aXNlTWluKE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWluTTEpKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEsIG0xLmN3aXNlTWluKE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWF4TTEpKSk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgbWluTTEpLCBtMS5jd2lzZU1pbihNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtaW5NMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTEuY3dpc2VNaW4oTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgbWF4TTEpKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIG1heE0xKSwgbTEuY3dpc2VNYXgoTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtYXhNMSkpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTEuY3dpc2VNYXgoTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtaW5NMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtYXhNMSksIG0xLmN3aXNlTWF4KE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIG1heE0xKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtMS5jd2lzZU1heChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtaW5NMSkpKTsKIAogICAvLyBtaW4vbWF4IHdpdGggc2NhbGFyIGlucHV0Ci0gIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBtaW5NMSksIG0xLmN3aXNlTWluKCBtaW5NMSkpOworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIG1pbk0xKSwgbTEuY3dpc2VNaW4obWluTTEpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTEuY3dpc2VNaW4obWF4TTEpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgtbTEsICgtbTEpLmN3aXNlTWluKC1taW5NMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKC1tMS5hcnJheSgpLCAoKC1tMSkuYXJyYXkoKS5taW4pKCAtbWluTTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgtbTEuYXJyYXkoKSwgKCgtbTEpLmFycmF5KCkubWluKSgtbWluTTEpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWF4TTEpLCBtMS5jd2lzZU1heCggbWF4TTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtYXhNMSksIG0xLmN3aXNlTWF4KG1heE0xKSk7CiAgIFZFUklGWV9JU19BUFBST1gobTEsIG0xLmN3aXNlTWF4KG1pbk0xKSk7CiAgIFZFUklGWV9JU19BUFBST1goLW0xLCAoLW0xKS5jd2lzZU1heCgtbWF4TTEpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgtbTEuYXJyYXkoKSwgKCgtbTEpLmFycmF5KCkubWF4KSgtbWF4TTEpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWluTTEpLmFycmF5KCksIChtMS5hcnJheSgpLm1pbikoIG1pbk0xKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEuYXJyYXkoKSwgKG0xLmFycmF5KCkubWluKSggbWF4TTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtaW5NMSkuYXJyYXkoKSwgKG0xLmFycmF5KCkubWluKShtaW5NMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmFycmF5KCksIChtMS5hcnJheSgpLm1pbikobWF4TTEpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgbWF4TTEpLmFycmF5KCksIChtMS5hcnJheSgpLm1heCkoIG1heE0xKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEuYXJyYXkoKSwgKG0xLmFycmF5KCkubWF4KSggbWluTTEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBtYXhNMSkuYXJyYXkoKSwgKG0xLmFycmF5KCkubWF4KShtYXhNMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmFycmF5KCksIChtMS5hcnJheSgpLm1heCkobWluTTEpKTsKIAogICAvLyBUZXN0IE5hTiBwcm9wYWdhdGlvbiBmb3IgbWluL21heC4KICAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKSB7Ci0gICAgbTEoMCwwKSA9IE51bVRyYWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKKyAgICBtMSgwLCAwKSA9IE51bVRyYWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKICAgICAvLyBFbGVtZW50d2lzZS4KLSAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKG0xLnRlbXBsYXRlIGN3aXNlTWF4PFByb3BhZ2F0ZU5hTj4oTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBTY2FsYXIoMSkpKSgwLDApKSk7Ci0gICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShtMS50ZW1wbGF0ZSBjd2lzZU1pbjxQcm9wYWdhdGVOYU4+KE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgU2NhbGFyKDEpKSkoMCwwKSkpOwotICAgIFZFUklGWSghKG51bWV4dDo6aXNuYW4pKG0xLnRlbXBsYXRlIGN3aXNlTWF4PFByb3BhZ2F0ZU51bWJlcnM+KE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgU2NhbGFyKDEpKSkoMCwwKSkpOwotICAgIFZFUklGWSghKG51bWV4dDo6aXNuYW4pKG0xLnRlbXBsYXRlIGN3aXNlTWluPFByb3BhZ2F0ZU51bWJlcnM+KE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgU2NhbGFyKDEpKSkoMCwwKSkpOwotICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikobTEudGVtcGxhdGUgY3dpc2VNYXg8UHJvcGFnYXRlTmFOPihTY2FsYXIoMSkpKDAsMCkpKTsKLSAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKG0xLnRlbXBsYXRlIGN3aXNlTWluPFByb3BhZ2F0ZU5hTj4oU2NhbGFyKDEpKSgwLDApKSk7Ci0gICAgVkVSSUZZKCEobnVtZXh0Ojppc25hbikobTEudGVtcGxhdGUgY3dpc2VNYXg8UHJvcGFnYXRlTnVtYmVycz4oU2NhbGFyKDEpKSgwLDApKSk7Ci0gICAgVkVSSUZZKCEobnVtZXh0Ojppc25hbikobTEudGVtcGxhdGUgY3dpc2VNaW48UHJvcGFnYXRlTnVtYmVycz4oU2NhbGFyKDEpKSgwLDApKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShtMS50ZW1wbGF0ZSBjd2lzZU1heDxQcm9wYWdhdGVOYU4+KE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIFNjYWxhcigxKSkpKDAsIDApKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShtMS50ZW1wbGF0ZSBjd2lzZU1pbjxQcm9wYWdhdGVOYU4+KE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIFNjYWxhcigxKSkpKDAsIDApKSk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc25hbikobTEudGVtcGxhdGUgY3dpc2VNYXg8UHJvcGFnYXRlTnVtYmVycz4oTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgU2NhbGFyKDEpKSkoMCwgMCkpKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzbmFuKShtMS50ZW1wbGF0ZSBjd2lzZU1pbjxQcm9wYWdhdGVOdW1iZXJzPihNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBTY2FsYXIoMSkpKSgwLCAwKSkpOworICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikobTEudGVtcGxhdGUgY3dpc2VNYXg8UHJvcGFnYXRlTmFOPihTY2FsYXIoMSkpKDAsIDApKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShtMS50ZW1wbGF0ZSBjd2lzZU1pbjxQcm9wYWdhdGVOYU4+KFNjYWxhcigxKSkoMCwgMCkpKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzbmFuKShtMS50ZW1wbGF0ZSBjd2lzZU1heDxQcm9wYWdhdGVOdW1iZXJzPihTY2FsYXIoMSkpKDAsIDApKSk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc25hbikobTEudGVtcGxhdGUgY3dpc2VNaW48UHJvcGFnYXRlTnVtYmVycz4oU2NhbGFyKDEpKSgwLCAwKSkpOwogCi0KLSAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKG0xLmFycmF5KCkudGVtcGxhdGUgbWF4PFByb3BhZ2F0ZU5hTj4oTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBTY2FsYXIoMSkpLmFycmF5KCkpKDAsMCkpKTsKLSAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKG0xLmFycmF5KCkudGVtcGxhdGUgbWluPFByb3BhZ2F0ZU5hTj4oTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLCBTY2FsYXIoMSkpLmFycmF5KCkpKDAsMCkpKTsKLSAgICBWRVJJRlkoIShudW1leHQ6OmlzbmFuKShtMS5hcnJheSgpLnRlbXBsYXRlIG1heDxQcm9wYWdhdGVOdW1iZXJzPihNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsIFNjYWxhcigxKSkuYXJyYXkoKSkoMCwwKSkpOwotICAgIFZFUklGWSghKG51bWV4dDo6aXNuYW4pKG0xLmFycmF5KCkudGVtcGxhdGUgbWluPFByb3BhZ2F0ZU51bWJlcnM+KE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scywgU2NhbGFyKDEpKS5hcnJheSgpKSgwLDApKSk7Ci0gICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShtMS5hcnJheSgpLnRlbXBsYXRlIG1heDxQcm9wYWdhdGVOYU4+KFNjYWxhcigxKSkoMCwwKSkpOwotICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikobTEuYXJyYXkoKS50ZW1wbGF0ZSBtaW48UHJvcGFnYXRlTmFOPihTY2FsYXIoMSkpKDAsMCkpKTsKLSAgICBWRVJJRlkoIShudW1leHQ6OmlzbmFuKShtMS5hcnJheSgpLnRlbXBsYXRlIG1heDxQcm9wYWdhdGVOdW1iZXJzPihTY2FsYXIoMSkpKDAsMCkpKTsKLSAgICBWRVJJRlkoIShudW1leHQ6OmlzbmFuKShtMS5hcnJheSgpLnRlbXBsYXRlIG1pbjxQcm9wYWdhdGVOdW1iZXJzPihTY2FsYXIoMSkpKDAsMCkpKTsKKyAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKAorICAgICAgICBtMS5hcnJheSgpLnRlbXBsYXRlIG1heDxQcm9wYWdhdGVOYU4+KE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIFNjYWxhcigxKSkuYXJyYXkoKSkoMCwgMCkpKTsKKyAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKAorICAgICAgICBtMS5hcnJheSgpLnRlbXBsYXRlIG1pbjxQcm9wYWdhdGVOYU4+KE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIFNjYWxhcigxKSkuYXJyYXkoKSkoMCwgMCkpKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzbmFuKSgKKyAgICAgICAgbTEuYXJyYXkoKS50ZW1wbGF0ZSBtYXg8UHJvcGFnYXRlTnVtYmVycz4oTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgU2NhbGFyKDEpKS5hcnJheSgpKSgwLCAwKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNuYW4pKAorICAgICAgICBtMS5hcnJheSgpLnRlbXBsYXRlIG1pbjxQcm9wYWdhdGVOdW1iZXJzPihNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBTY2FsYXIoMSkpLmFycmF5KCkpKDAsIDApKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShtMS5hcnJheSgpLnRlbXBsYXRlIG1heDxQcm9wYWdhdGVOYU4+KFNjYWxhcigxKSkoMCwgMCkpKTsKKyAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKG0xLmFycmF5KCkudGVtcGxhdGUgbWluPFByb3BhZ2F0ZU5hTj4oU2NhbGFyKDEpKSgwLCAwKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNuYW4pKG0xLmFycmF5KCkudGVtcGxhdGUgbWF4PFByb3BhZ2F0ZU51bWJlcnM+KFNjYWxhcigxKSkoMCwgMCkpKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzbmFuKShtMS5hcnJheSgpLnRlbXBsYXRlIG1pbjxQcm9wYWdhdGVOdW1iZXJzPihTY2FsYXIoMSkpKDAsIDApKSk7CiAKICAgICAvLyBSZWR1Y3Rpb25zLgogICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikobTEudGVtcGxhdGUgbWF4Q29lZmY8UHJvcGFnYXRlTmFOPigpKSk7CkBAIC0yNDcsNDIgKzI0Miw0MCBAQAogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFRyYWl0cz4gdm9pZCByZXNpemUoY29uc3QgTWF0cml4VHJhaXRzJiB0KQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFRyYWl0cz4KK3ZvaWQgcmVzaXplKGNvbnN0IE1hdHJpeFRyYWl0cyYgdCkgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFRyYWl0czo6U2NhbGFyIFNjYWxhcjsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gTWF0cml4VHlwZTsKLSAgdHlwZWRlZiBBcnJheTxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBBcnJheTJEVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKLSAgdHlwZWRlZiBBcnJheTxTY2FsYXIsRHluYW1pYywxPiBBcnJheTFEVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBNYXRyaXhUeXBlOworICB0eXBlZGVmIEFycmF5PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gQXJyYXkyRFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIER5bmFtaWMsIDE+IEFycmF5MURUeXBlOwogCiAgIEluZGV4IHJvd3MgPSB0LnJvd3MoKSwgY29scyA9IHQuY29scygpOwogCi0gIE1hdHJpeFR5cGUgbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIG0ocm93cywgY29scyk7CiAgIFZlY3RvclR5cGUgdihyb3dzKTsKLSAgQXJyYXkyRFR5cGUgYTIocm93cyxjb2xzKTsKKyAgQXJyYXkyRFR5cGUgYTIocm93cywgY29scyk7CiAgIEFycmF5MURUeXBlIGExKHJvd3MpOwogCi0gIG0uYXJyYXkoKS5yZXNpemUocm93cysxLGNvbHMrMSk7Ci0gIFZFUklGWShtLnJvd3MoKT09cm93cysxICYmIG0uY29scygpPT1jb2xzKzEpOwotICBhMi5tYXRyaXgoKS5yZXNpemUocm93cysxLGNvbHMrMSk7Ci0gIFZFUklGWShhMi5yb3dzKCk9PXJvd3MrMSAmJiBhMi5jb2xzKCk9PWNvbHMrMSk7CisgIG0uYXJyYXkoKS5yZXNpemUocm93cyArIDEsIGNvbHMgKyAxKTsKKyAgVkVSSUZZKG0ucm93cygpID09IHJvd3MgKyAxICYmIG0uY29scygpID09IGNvbHMgKyAxKTsKKyAgYTIubWF0cml4KCkucmVzaXplKHJvd3MgKyAxLCBjb2xzICsgMSk7CisgIFZFUklGWShhMi5yb3dzKCkgPT0gcm93cyArIDEgJiYgYTIuY29scygpID09IGNvbHMgKyAxKTsKICAgdi5hcnJheSgpLnJlc2l6ZShjb2xzKTsKLSAgVkVSSUZZKHYuc2l6ZSgpPT1jb2xzKTsKKyAgVkVSSUZZKHYuc2l6ZSgpID09IGNvbHMpOwogICBhMS5tYXRyaXgoKS5yZXNpemUoY29scyk7Ci0gIFZFUklGWShhMS5zaXplKCk9PWNvbHMpOworICBWRVJJRlkoYTEuc2l6ZSgpID09IGNvbHMpOwogfQogCi10ZW1wbGF0ZTxpbnQ+Ci12b2lkIHJlZ3Jlc3Npb25fYnVnXzY1NCgpCi17Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCByZWdyZXNzaW9uX2J1Z182NTQoKSB7CiAgIEFycmF5WGYgYSA9IFJvd1ZlY3RvclhmKDMpOwotICBWZWN0b3JYZiB2ID0gQXJyYXk8ZmxvYXQsMSxEeW5hbWljPigzKTsKKyAgVmVjdG9yWGYgdiA9IEFycmF5PGZsb2F0LCAxLCBEeW5hbWljPigzKTsKIH0KIAogLy8gQ2hlY2sgcHJvcGFnYXRpb24gb2YgTHZhbHVlQml0IHRocm91Z2ggQXJyYXkvTWF0cml4LVdyYXBwZXIKLXRlbXBsYXRlPGludD4KLXZvaWQgcmVncnJzc2lvbl9idWdfMTQxMCgpCi17Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCByZWdycnNzaW9uX2J1Z18xNDEwKCkgewogICBjb25zdCBNYXRyaXg0aSBNOwogICBjb25zdCBBcnJheTRpIEE7CiAgIEFycmF5V3JhcHBlcjxjb25zdCBNYXRyaXg0aT4gTUEgPSBNLmFycmF5KCk7CkBAIC0yOTAsNTIgKzI4Myw2MSBAQAogICBNYXRyaXhXcmFwcGVyPGNvbnN0IEFycmF5NGk+IEFNID0gQS5tYXRyaXgoKTsKICAgQU0ucm93KDApOwogCi0gIFZFUklGWSgoaW50ZXJuYWw6OnRyYWl0czxBcnJheVdyYXBwZXI8Y29uc3QgTWF0cml4NGk+ID46OkZsYWdzJkx2YWx1ZUJpdCk9PTApOwotICBWRVJJRlkoKGludGVybmFsOjp0cmFpdHM8TWF0cml4V3JhcHBlcjxjb25zdCBBcnJheTRpPiA+OjpGbGFncyZMdmFsdWVCaXQpPT0wKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6dHJhaXRzPEFycmF5V3JhcHBlcjxjb25zdCBNYXRyaXg0aT4gPjo6RmxhZ3MgJiBMdmFsdWVCaXQpID09IDApOworICBWRVJJRlkoKGludGVybmFsOjp0cmFpdHM8TWF0cml4V3JhcHBlcjxjb25zdCBBcnJheTRpPiA+OjpGbGFncyAmIEx2YWx1ZUJpdCkgPT0gMCk7CiAKLSAgVkVSSUZZKChpbnRlcm5hbDo6dHJhaXRzPEFycmF5V3JhcHBlcjxNYXRyaXg0aT4gPjo6RmxhZ3MmTHZhbHVlQml0KT09THZhbHVlQml0KTsKLSAgVkVSSUZZKChpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFdyYXBwZXI8QXJyYXk0aT4gPjo6RmxhZ3MmTHZhbHVlQml0KT09THZhbHVlQml0KTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6dHJhaXRzPEFycmF5V3JhcHBlcjxNYXRyaXg0aT4gPjo6RmxhZ3MgJiBMdmFsdWVCaXQpID09IEx2YWx1ZUJpdCk7CisgIFZFUklGWSgoaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhXcmFwcGVyPEFycmF5NGk+ID46OkZsYWdzICYgTHZhbHVlQml0KSA9PSBMdmFsdWVCaXQpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoYXJyYXlfZm9yX21hdHJpeCkKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggYXJyYXlfZm9yX21hdHJpeChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGFycmF5X2Zvcl9tYXRyaXgoTWF0cml4MmYoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggYXJyYXlfZm9yX21hdHJpeChNYXRyaXg0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBhcnJheV9mb3JfbWF0cml4KE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF81KCBhcnJheV9mb3JfbWF0cml4KE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoIGFycmF5X2Zvcl9tYXRyaXgoTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChhcnJheV9mb3JfbWF0cml4KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKGFycmF5X2Zvcl9tYXRyaXgoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoYXJyYXlfZm9yX21hdHJpeChNYXRyaXgyZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoYXJyYXlfZm9yX21hdHJpeChNYXRyaXg0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoYXJyYXlfZm9yX21hdHJpeCgKKyAgICAgICAgTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF81KGFycmF5X2Zvcl9tYXRyaXgoCisgICAgICAgIE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF82KGFycmF5X2Zvcl9tYXRyaXgoCisgICAgICAgIE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwogICB9Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGNvbXBhcmlzb25zKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggY29tcGFyaXNvbnMoTWF0cml4MmYoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggY29tcGFyaXNvbnMoTWF0cml4NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggY29tcGFyaXNvbnMoTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggY29tcGFyaXNvbnMoTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoY29tcGFyaXNvbnMoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoY29tcGFyaXNvbnMoTWF0cml4MmYoKSkpOworICAgIENBTExfU1VCVEVTVF8zKGNvbXBhcmlzb25zKE1hdHJpeDRkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShjb21wYXJpc29ucygKKyAgICAgICAgTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoY29tcGFyaXNvbnMoCisgICAgICAgIE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwogICB9Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGN3aXNlX21pbl9tYXgoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBjd2lzZV9taW5fbWF4KE1hdHJpeDJmKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGN3aXNlX21pbl9tYXgoTWF0cml4NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggY3dpc2VfbWluX21heChNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF82KCBjd2lzZV9taW5fbWF4KE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKGN3aXNlX21pbl9tYXgoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoY3dpc2VfbWluX21heChNYXRyaXgyZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoY3dpc2VfbWluX21heChNYXRyaXg0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoY3dpc2VfbWluX21heCgKKyAgICAgICAgTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoY3dpc2VfbWluX21heCgKKyAgICAgICAgTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CiAgIH0KLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggbHBOb3JtKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggbHBOb3JtKFZlY3RvcjJmKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzcoIGxwTm9ybShWZWN0b3IzZCgpKSApOwotICAgIENBTExfU1VCVEVTVF84KCBscE5vcm0oVmVjdG9yNGYoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggbHBOb3JtKFZlY3RvclhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggbHBOb3JtKFZlY3RvclhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKGxwTm9ybShNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihscE5vcm0oVmVjdG9yMmYoKSkpOworICAgIENBTExfU1VCVEVTVF83KGxwTm9ybShWZWN0b3IzZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgobHBOb3JtKFZlY3RvcjRmKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShscE5vcm0oVmVjdG9yWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF80KGxwTm9ybShWZWN0b3JYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwogICB9Ci0gIENBTExfU1VCVEVTVF81KCBscE5vcm0oVmVjdG9yWGYoMCkpICk7Ci0gIENBTExfU1VCVEVTVF80KCBscE5vcm0oVmVjdG9yWGNmKDApKSApOwotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF80KCByZXNpemUoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIHJlc2l6ZShNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF82KCByZXNpemUoTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzUobHBOb3JtKFZlY3RvclhmKDApKSk7CisgIENBTExfU1VCVEVTVF80KGxwTm9ybShWZWN0b3JYY2YoMCkpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzQocmVzaXplKAorICAgICAgICBNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoCisgICAgICAgIHJlc2l6ZShNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNigKKyAgICAgICAgcmVzaXplKE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwogICB9Ci0gIENBTExfU1VCVEVTVF82KCByZWdyZXNzaW9uX2J1Z182NTQ8MD4oKSApOwotICBDQUxMX1NVQlRFU1RfNiggcmVncnJzc2lvbl9idWdfMTQxMDwwPigpICk7CisgIENBTExfU1VCVEVTVF82KHJlZ3Jlc3Npb25fYnVnXzY1NDwwPigpKTsKKyAgQ0FMTF9TVUJURVNUXzYocmVncnJzc2lvbl9idWdfMTQxMDwwPigpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvYXJyYXlfb2Zfc3RyaW5nLmNwcCBiL3Rlc3QvYXJyYXlfb2Zfc3RyaW5nLmNwcAppbmRleCAyM2U1MTUyLi5mOTI2MDNmIDEwMDY0NAotLS0gYS90ZXN0L2FycmF5X29mX3N0cmluZy5jcHAKKysrIGIvdGVzdC9hcnJheV9vZl9zdHJpbmcuY3BwCkBAIC05LDkgKzksOCBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi1FSUdFTl9ERUNMQVJFX1RFU1QoYXJyYXlfb2Zfc3RyaW5nKQotewotICB0eXBlZGVmIEFycmF5PHN0ZDo6c3RyaW5nLDEsRHluYW1pYz4gQXJyYXlYczsKK0VJR0VOX0RFQ0xBUkVfVEVTVChhcnJheV9vZl9zdHJpbmcpIHsKKyAgdHlwZWRlZiBBcnJheTxzdGQ6OnN0cmluZywgMSwgRHluYW1pYz4gQXJyYXlYczsKICAgQXJyYXlYcyBhMSgzKSwgYTIoMyksIGEzKDMpLCBhM3JlZigzKTsKICAgYTEgPDwgIm9uZSIsICJ0d28iLCAidGhyZWUiOwogICBhMiA8PCAiMSIsICIyIiwgIjMiOwpAQCAtMjAsMTMgKzE5LDEzIEBACiAgIHMxIDw8IGExOwogICBWRVJJRllfSVNfRVFVQUwoczEuc3RyKCksIHN0ZDo6c3RyaW5nKCIgIG9uZSAgICB0d28gIHRocmVlIikpOwogICBhMyA9IGExICsgc3RkOjpzdHJpbmcoIiAoIikgKyBhMiArIHN0ZDo6c3RyaW5nKCIpIik7Ci0gIFZFUklGWSgoYTM9PWEzcmVmKS5hbGwoKSk7CisgIFZFUklGWSgoYTMgPT0gYTNyZWYpLmFsbCgpKTsKIAogICBhMyA9IGExOwogICBhMyArPSBzdGQ6OnN0cmluZygiICgiKSArIGEyICsgc3RkOjpzdHJpbmcoIikiKTsKLSAgVkVSSUZZKChhMz09YTNyZWYpLmFsbCgpKTsKKyAgVkVSSUZZKChhMyA9PSBhM3JlZikuYWxsKCkpOwogCiAgIGExLnN3YXAoYTMpOwotICBWRVJJRlkoKGExPT1hM3JlZikuYWxsKCkpOwotICBWRVJJRlkoKGEzIT1hM3JlZikuYWxsKCkpOworICBWRVJJRlkoKGExID09IGEzcmVmKS5hbGwoKSk7CisgIFZFUklGWSgoYTMgIT0gYTNyZWYpLmFsbCgpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvYXJyYXlfcmVwbGljYXRlLmNwcCBiL3Rlc3QvYXJyYXlfcmVwbGljYXRlLmNwcAppbmRleCAwNTdjM2M3Li5mNWM5MjQ2IDEwMDY0NAotLS0gYS90ZXN0L2FycmF5X3JlcGxpY2F0ZS5jcHAKKysrIGIvdGVzdC9hcnJheV9yZXBsaWNhdGUuY3BwCkBAIC05LDggKzksOCBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHJlcGxpY2F0ZShjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHJlcGxpY2F0ZShjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgUmVwbGljYXRlLmNwcAogICAqLwpAQCAtMjIsNjAgKzIyLDUyIEBACiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwogCi0gIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOwogCiAgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CiAKICAgTWF0cml4WCB4MSwgeDI7CiAgIFZlY3RvclggdngxOwogCi0gIGludCAgZjEgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCksCi0gICAgICAgZjIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCk7CisgIGludCBmMSA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAxMCksIGYyID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDEwKTsKIAotICB4MS5yZXNpemUocm93cypmMSxjb2xzKmYyKTsKLSAgZm9yKGludCBqPTA7IGo8ZjI7IGorKykKLSAgZm9yKGludCBpPTA7IGk8ZjE7IGkrKykKLSAgICB4MS5ibG9jayhpKnJvd3Msaipjb2xzLHJvd3MsY29scykgPSBtMTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh4MSwgbTEucmVwbGljYXRlKGYxLGYyKSk7CisgIHgxLnJlc2l6ZShyb3dzICogZjEsIGNvbHMgKiBmMik7CisgIGZvciAoaW50IGogPSAwOyBqIDwgZjI7IGorKykKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGYxOyBpKyspIHgxLmJsb2NrKGkgKiByb3dzLCBqICogY29scywgcm93cywgY29scykgPSBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4MSwgbTEucmVwbGljYXRlKGYxLCBmMikpOwogCi0gIHgyLnJlc2l6ZSgyKnJvd3MsMypjb2xzKTsKLSAgeDIgPDwgbTIsIG0yLCBtMiwKLSAgICAgICAgbTIsIG0yLCBtMjsKLSAgVkVSSUZZX0lTX0FQUFJPWCh4MiwgKG0yLnRlbXBsYXRlIHJlcGxpY2F0ZTwyLDM+KCkpKTsKLSAgCi0gIHgyLnJlc2l6ZShyb3dzLDMqY29scyk7CisgIHgyLnJlc2l6ZSgyICogcm93cywgMyAqIGNvbHMpOworICB4MiA8PCBtMiwgbTIsIG0yLCBtMiwgbTIsIG0yOworICBWRVJJRllfSVNfQVBQUk9YKHgyLCAobTIudGVtcGxhdGUgcmVwbGljYXRlPDIsIDM+KCkpKTsKKworICB4Mi5yZXNpemUocm93cywgMyAqIGNvbHMpOwogICB4MiA8PCBtMiwgbTIsIG0yOwotICBWRVJJRllfSVNfQVBQUk9YKHgyLCAobTIudGVtcGxhdGUgcmVwbGljYXRlPDEsMz4oKSkpOwotICAKLSAgdngxLnJlc2l6ZSgzKnJvd3MsY29scyk7Ci0gIHZ4MSA8PCBtMiwgbTIsIG0yOwotICBWRVJJRllfSVNfQVBQUk9YKHZ4MSt2eDEsIHZ4MSsobTIudGVtcGxhdGUgcmVwbGljYXRlPDMsMT4oKSkpOwotICAKLSAgdngxPW0yKyhtMi5jb2x3aXNlKCkucmVwbGljYXRlKDEpKTsKLSAgCi0gIGlmKG0yLmNvbHMoKT09MSkKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmNvZWZmKDApLCAobTIudGVtcGxhdGUgcmVwbGljYXRlPDMsMT4oKS5jb2VmZihtMi5yb3dzKCkpKSk7CisgIFZFUklGWV9JU19BUFBST1goeDIsIChtMi50ZW1wbGF0ZSByZXBsaWNhdGU8MSwgMz4oKSkpOwogCi0gIHgyLnJlc2l6ZShyb3dzLGYxKTsKLSAgZm9yIChpbnQgaj0wOyBqPGYxOyArK2opCi0gICAgeDIuY29sKGopID0gdjE7CisgIHZ4MS5yZXNpemUoMyAqIHJvd3MsIGNvbHMpOworICB2eDEgPDwgbTIsIG0yLCBtMjsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2eDEgKyB2eDEsIHZ4MSArIChtMi50ZW1wbGF0ZSByZXBsaWNhdGU8MywgMT4oKSkpOworCisgIHZ4MSA9IG0yICsgKG0yLmNvbHdpc2UoKS5yZXBsaWNhdGUoMSkpOworCisgIGlmIChtMi5jb2xzKCkgPT0gMSkgVkVSSUZZX0lTX0FQUFJPWChtMi5jb2VmZigwKSwgKG0yLnRlbXBsYXRlIHJlcGxpY2F0ZTwzLCAxPigpLmNvZWZmKG0yLnJvd3MoKSkpKTsKKworICB4Mi5yZXNpemUocm93cywgZjEpOworICBmb3IgKGludCBqID0gMDsgaiA8IGYxOyArK2opIHgyLmNvbChqKSA9IHYxOwogICBWRVJJRllfSVNfQVBQUk9YKHgyLCB2MS5yb3d3aXNlKCkucmVwbGljYXRlKGYxKSk7CiAKLSAgdngxLnJlc2l6ZShyb3dzKmYyKTsKLSAgZm9yIChpbnQgaj0wOyBqPGYyOyArK2opCi0gICAgdngxLnNlZ21lbnQoaipyb3dzLHJvd3MpID0gdjE7CisgIHZ4MS5yZXNpemUocm93cyAqIGYyKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBmMjsgKytqKSB2eDEuc2VnbWVudChqICogcm93cywgcm93cykgPSB2MTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2eDEsIHYxLmNvbHdpc2UoKS5yZXBsaWNhdGUoZjIpKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGFycmF5X3JlcGxpY2F0ZSkKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggcmVwbGljYXRlKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggcmVwbGljYXRlKFZlY3RvcjJmKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIHJlcGxpY2F0ZShWZWN0b3IzZCgpKSApOwotICAgIENBTExfU1VCVEVTVF80KCByZXBsaWNhdGUoVmVjdG9yNGYoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggcmVwbGljYXRlKFZlY3RvclhmKDE2KSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggcmVwbGljYXRlKFZlY3RvclhjZCgxMCkpICk7CitFSUdFTl9ERUNMQVJFX1RFU1QoYXJyYXlfcmVwbGljYXRlKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKHJlcGxpY2F0ZShNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihyZXBsaWNhdGUoVmVjdG9yMmYoKSkpOworICAgIENBTExfU1VCVEVTVF8zKHJlcGxpY2F0ZShWZWN0b3IzZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQocmVwbGljYXRlKFZlY3RvcjRmKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShyZXBsaWNhdGUoVmVjdG9yWGYoMTYpKSk7CisgICAgQ0FMTF9TVUJURVNUXzYocmVwbGljYXRlKFZlY3RvclhjZCgxMCkpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9hcnJheV9yZXZlcnNlLmNwcCBiL3Rlc3QvYXJyYXlfcmV2ZXJzZS5jcHAKaW5kZXggYzc3NTI4YS4uMzEyMGMzYyAxMDA2NDQKLS0tIGEvdGVzdC9hcnJheV9yZXZlcnNlLmNwcAorKysgYi90ZXN0L2FycmF5X3JldmVyc2UuY3BwCkBAIC0xMyw4ICsxMyw4IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcmV2ZXJzZShjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHJldmVyc2UoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CiAKQEAgLTI4LDkzICsyOCw5MiBAQAogCiAgIE1hdHJpeFR5cGUgbTFfciA9IG0xLnJldmVyc2UoKTsKICAgLy8gVmVyaWZ5IHRoYXQgTWF0cml4QmFzZTo6cmV2ZXJzZSgpIHdvcmtzCi0gIGZvciAoIGludCBpID0gMDsgaSA8IHJvd3M7IGkrKyApIHsKLSAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCBjb2xzOyBqKysgKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgIFZFUklGWV9JU19BUFBST1gobTFfcihpLCBqKSwgbTEocm93cyAtIDEgLSBpLCBjb2xzIC0gMSAtIGopKTsKICAgICB9CiAgIH0KIAogICBSZXZlcnNlPE1hdHJpeFR5cGU+IG0xX3JkKG0xKTsKICAgLy8gVmVyaWZ5IHRoYXQgYSBSZXZlcnNlIGRlZmF1bHQgKGluIGJvdGggZGlyZWN0aW9ucykgb2YgYW4gZXhwcmVzc2lvbiB3b3JrcwotICBmb3IgKCBpbnQgaSA9IDA7IGkgPCByb3dzOyBpKysgKSB7Ci0gICAgZm9yICggaW50IGogPSAwOyBqIDwgY29sczsgaisrICkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xX3JkKGksIGopLCBtMShyb3dzIC0gMSAtIGksIGNvbHMgLSAxIC0gaikpOwogICAgIH0KICAgfQogCiAgIFJldmVyc2U8TWF0cml4VHlwZSwgQm90aERpcmVjdGlvbnM+IG0xX3JiKG0xKTsKICAgLy8gVmVyaWZ5IHRoYXQgYSBSZXZlcnNlIGluIGJvdGggZGlyZWN0aW9ucyBvZiBhbiBleHByZXNzaW9uIHdvcmtzCi0gIGZvciAoIGludCBpID0gMDsgaSA8IHJvd3M7IGkrKyApIHsKLSAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCBjb2xzOyBqKysgKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgIFZFUklGWV9JU19BUFBST1gobTFfcmIoaSwgaiksIG0xKHJvd3MgLSAxIC0gaSwgY29scyAtIDEgLSBqKSk7CiAgICAgfQogICB9CiAKICAgUmV2ZXJzZTxNYXRyaXhUeXBlLCBWZXJ0aWNhbD4gbTFfcnYobTEpOwogICAvLyBWZXJpZnkgdGhhdCBhIFJldmVyc2UgaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbnMgb2YgYW4gZXhwcmVzc2lvbiB3b3JrcwotICBmb3IgKCBpbnQgaSA9IDA7IGkgPCByb3dzOyBpKysgKSB7Ci0gICAgZm9yICggaW50IGogPSAwOyBqIDwgY29sczsgaisrICkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xX3J2KGksIGopLCBtMShyb3dzIC0gMSAtIGksIGopKTsKICAgICB9CiAgIH0KIAogICBSZXZlcnNlPE1hdHJpeFR5cGUsIEhvcml6b250YWw+IG0xX3JoKG0xKTsKICAgLy8gVmVyaWZ5IHRoYXQgYSBSZXZlcnNlIGluIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbnMgb2YgYW4gZXhwcmVzc2lvbiB3b3JrcwotICBmb3IgKCBpbnQgaSA9IDA7IGkgPCByb3dzOyBpKysgKSB7Ci0gICAgZm9yICggaW50IGogPSAwOyBqIDwgY29sczsgaisrICkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKSB7CiAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xX3JoKGksIGopLCBtMShpLCBjb2xzIC0gMSAtIGopKTsKICAgICB9CiAgIH0KIAogICBWZWN0b3JUeXBlIHYxX3IgPSB2MS5yZXZlcnNlKCk7CiAgIC8vIFZlcmlmeSB0aGF0IGEgVmVjdG9yVHlwZTo6cmV2ZXJzZSgpIG9mIGFuIGV4cHJlc3Npb24gd29ya3MKLSAgZm9yICggaW50IGkgPSAwOyBpIDwgcm93czsgaSsrICkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgIFZFUklGWV9JU19BUFBST1godjFfcihpKSwgdjEocm93cyAtIDEgLSBpKSk7CiAgIH0KIAogICBNYXRyaXhUeXBlIG0xX2NyID0gbTEuY29sd2lzZSgpLnJldmVyc2UoKTsKICAgLy8gVmVyaWZ5IHRoYXQgUGFydGlhbFJlZHV4OjpyZXZlcnNlKCkgd29ya3MgKGZvciBjb2x3aXNlKCkpCi0gIGZvciAoIGludCBpID0gMDsgaSA8IHJvd3M7IGkrKyApIHsKLSAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCBjb2xzOyBqKysgKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHsKICAgICAgIFZFUklGWV9JU19BUFBST1gobTFfY3IoaSwgaiksIG0xKHJvd3MgLSAxIC0gaSwgaikpOwogICAgIH0KICAgfQogCiAgIE1hdHJpeFR5cGUgbTFfcnIgPSBtMS5yb3d3aXNlKCkucmV2ZXJzZSgpOwogICAvLyBWZXJpZnkgdGhhdCBQYXJ0aWFsUmVkdXg6OnJldmVyc2UoKSB3b3JrcyAoZm9yIHJvd3dpc2UoKSkKLSAgZm9yICggaW50IGkgPSAwOyBpIDwgcm93czsgaSsrICkgewotICAgIGZvciAoIGludCBqID0gMDsgaiA8IGNvbHM7IGorKyApIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMV9ycihpLCBqKSwgbTEoaSwgY29scyAtIDEgLSBqKSk7CiAgICAgfQogICB9CiAKICAgU2NhbGFyIHggPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKIAotICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKSwKLSAgICAgICAgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMSksIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CiAKICAgbTEucmV2ZXJzZSgpKHIsIGMpID0geDsKICAgVkVSSUZZX0lTX0FQUFJPWCh4LCBtMShyb3dzIC0gMSAtIHIsIGNvbHMgLSAxIC0gYykpOwotICAKKwogICBtMiA9IG0xOwogICBtMi5yZXZlcnNlSW5QbGFjZSgpOwotICBWRVJJRllfSVNfQVBQUk9YKG0yLG0xLnJldmVyc2UoKS5ldmFsKCkpOwotICAKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEucmV2ZXJzZSgpLmV2YWwoKSk7CisKICAgbTIgPSBtMTsKICAgbTIuY29sKDApLnJldmVyc2VJblBsYWNlKCk7Ci0gIFZFUklGWV9JU19BUFBST1gobTIuY29sKDApLG0xLmNvbCgwKS5yZXZlcnNlKCkuZXZhbCgpKTsKLSAgCisgIFZFUklGWV9JU19BUFBST1gobTIuY29sKDApLCBtMS5jb2woMCkucmV2ZXJzZSgpLmV2YWwoKSk7CisKICAgbTIgPSBtMTsKICAgbTIucm93KDApLnJldmVyc2VJblBsYWNlKCk7Ci0gIFZFUklGWV9JU19BUFBST1gobTIucm93KDApLG0xLnJvdygwKS5yZXZlcnNlKCkuZXZhbCgpKTsKLSAgCisgIFZFUklGWV9JU19BUFBST1gobTIucm93KDApLCBtMS5yb3coMCkucmV2ZXJzZSgpLmV2YWwoKSk7CisKICAgbTIgPSBtMTsKICAgbTIucm93d2lzZSgpLnJldmVyc2VJblBsYWNlKCk7Ci0gIFZFUklGWV9JU19BUFBST1gobTIsbTEucm93d2lzZSgpLnJldmVyc2UoKS5ldmFsKCkpOwotICAKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEucm93d2lzZSgpLnJldmVyc2UoKS5ldmFsKCkpOworCiAgIG0yID0gbTE7CiAgIG0yLmNvbHdpc2UoKS5yZXZlcnNlSW5QbGFjZSgpOwotICBWRVJJRllfSVNfQVBQUk9YKG0yLG0xLmNvbHdpc2UoKS5yZXZlcnNlKCkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEuY29sd2lzZSgpLnJldmVyc2UoKS5ldmFsKCkpOwogCiAgIG0xLmNvbHdpc2UoKS5yZXZlcnNlKCkociwgYykgPSB4OwogICBWRVJJRllfSVNfQVBQUk9YKHgsIG0xKHJvd3MgLSAxIC0gciwgYykpOwpAQCAtMTIzLDExICsxMjIsMTIgQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh4LCBtMShyLCBjb2xzIC0gMSAtIGMpKTsKIH0KIAotdGVtcGxhdGU8aW50Pgotdm9pZCBhcnJheV9yZXZlcnNlX2V4dHJhKCkKLXsKLSAgVmVjdG9yNGYgeDsgeCA8PCAxLCAyLCAzLCA0OwotICBWZWN0b3I0ZiB5OyB5IDw8IDQsIDMsIDIsIDE7Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCBhcnJheV9yZXZlcnNlX2V4dHJhKCkgeworICBWZWN0b3I0ZiB4OworICB4IDw8IDEsIDIsIDMsIDQ7CisgIFZlY3RvcjRmIHk7CisgIHkgPDwgNCwgMywgMiwgMTsKICAgVkVSSUZZKHgucmV2ZXJzZSgpWzFdID09IDMpOwogICBWRVJJRlkoeC5yZXZlcnNlKCkgPT0geSk7CiB9CkBAIC0xMzYsMzAgKzEzNiwyNCBAQAogLy8gaW4gY2xhbmcgNi83IHdpdGggLU8yIGFuZCBBVlggb3IgQVZYNTEyIGVuYWJsZWQuCiAvLyBUaGlzIHNpbXBsZXIgdmVyc2lvbiBlbnN1cmUgdGhhdCB0aGUgY2xhbmcgYnVnIGlzIG5vdCBzaW1wbHkgaGlkZGVuCiAvLyB0aHJvdWdoIG1pcy1pbmxpbmluZyBvZiByZXZlcnNlSW5QbGFjZSBvciBvdGhlciBtaW5vciBjaGFuZ2VzLgotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KLUVJR0VOX0RPTlRfSU5MSU5FCi12b2lkIGJ1ZzE2ODRfam9iMShNYXRyaXhUeXBlJiBtMSwgTWF0cml4VHlwZSYgbTIpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgYnVnMTY4NF9qb2IxKE1hdHJpeFR5cGUmIG0xLCBNYXRyaXhUeXBlJiBtMikgewogICBtMiA9IG0xOwogICBtMi5jb2woMCkuc3dhcChtMi5jb2woMykpOwogICBtMi5jb2woMSkuc3dhcChtMi5jb2woMikpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotRUlHRU5fRE9OVF9JTkxJTkUKLXZvaWQgYnVnMTY4NF9qb2IyKE1hdHJpeFR5cGUmIG0xLCBNYXRyaXhUeXBlJiBtMikKLXsKLSAgbTIgPSBtMTsgLy8gbG9hZCBtMS9tMiBpbiBBVlggcmVnaXN0ZXJzCi0gIG0xLmNvbCgwKSA9IG0yLmNvbCgzKTsgLy8gcGVyZm9ybSAxMjggYml0cyBtb3ZlcwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGJ1ZzE2ODRfam9iMihNYXRyaXhUeXBlJiBtMSwgTWF0cml4VHlwZSYgbTIpIHsKKyAgbTIgPSBtMTsgICAgICAgICAgICAgICAgLy8gbG9hZCBtMS9tMiBpbiBBVlggcmVnaXN0ZXJzCisgIG0xLmNvbCgwKSA9IG0yLmNvbCgzKTsgIC8vIHBlcmZvcm0gMTI4IGJpdHMgbW92ZXMKICAgbTEuY29sKDEpID0gbTIuY29sKDIpOwogICBtMS5jb2woMikgPSBtMi5jb2woMSk7CiAgIG0xLmNvbCgzKSA9IG0yLmNvbCgwKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KLUVJR0VOX0RPTlRfSU5MSU5FCi12b2lkIGJ1ZzE2ODRfam9iMyhNYXRyaXhUeXBlJiBtMSwgTWF0cml4VHlwZSYgbTIpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgYnVnMTY4NF9qb2IzKE1hdHJpeFR5cGUmIG0xLCBNYXRyaXhUeXBlJiBtMikgewogICBtMiA9IG0xOwogICBWZWN0b3I0ZiB0bXA7CiAgIHRtcCA9IG0yLmNvbCgwKTsKQEAgLTE2OCwxNyArMTYyLDE1IEBACiAgIHRtcCA9IG0yLmNvbCgxKTsKICAgbTIuY29sKDEpID0gbTIuY29sKDIpOwogICBtMi5jb2woMikgPSB0bXA7Ci0gIAogfQogCi10ZW1wbGF0ZTxpbnQ+Ci12b2lkIGJ1ZzE2ODQoKQotewordGVtcGxhdGUgPGludD4KK3ZvaWQgYnVnMTY4NCgpIHsKICAgTWF0cml4NGYgbTEgPSBNYXRyaXg0Zjo6UmFuZG9tKCk7CiAgIE1hdHJpeDRmIG0yID0gTWF0cml4NGY6OlJhbmRvbSgpOwotICBidWcxNjg0X2pvYjEobTEsbTIpOworICBidWcxNjg0X2pvYjEobTEsIG0yKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEucm93d2lzZSgpLnJldmVyc2UoKS5ldmFsKCkpOwotICBidWcxNjg0X2pvYjIobTEsbTIpOworICBidWcxNjg0X2pvYjIobTEsIG0yKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEucm93d2lzZSgpLnJldmVyc2UoKS5ldmFsKCkpOwogICAvLyBUaGlzIG9uZSBzdGlsbCBmYWlsIGFmdGVyIG91ciBzd2FwJ3Mgd29ya2Fyb3VuZCwKICAgLy8gYnV0IEkgZXhwZWN0IHVzZXJzIG5vdCB0byBpbXBsZW1lbnQgdGhlaXIgb3duIHN3YXAuCkBAIC0xODYsMTkgKzE3OCwyMiBAQAogICAvLyBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMS5yb3d3aXNlKCkucmV2ZXJzZSgpLmV2YWwoKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChhcnJheV9yZXZlcnNlKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCByZXZlcnNlKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggcmV2ZXJzZShNYXRyaXgyZigpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCByZXZlcnNlKE1hdHJpeDRmKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIHJldmVyc2UoTWF0cml4NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggcmV2ZXJzZShNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggcmV2ZXJzZShNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF83KCByZXZlcnNlKE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF84KCByZXZlcnNlKE1hdHJpeDxmbG9hdCwgMTAwLCAxMDA+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzkoIHJldmVyc2UoTWF0cml4PGZsb2F0LER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggYnVnMTY4NDwwPigpICk7CitFSUdFTl9ERUNMQVJFX1RFU1QoYXJyYXlfcmV2ZXJzZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShyZXZlcnNlKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKHJldmVyc2UoTWF0cml4MmYoKSkpOworICAgIENBTExfU1VCVEVTVF8zKHJldmVyc2UoTWF0cml4NGYoKSkpOworICAgIENBTExfU1VCVEVTVF80KHJldmVyc2UoTWF0cml4NGQoKSkpOworICAgIENBTExfU1VCVEVTVF81KHJldmVyc2UoCisgICAgICAgIE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNihyZXZlcnNlKAorICAgICAgICBNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNyhyZXZlcnNlKAorICAgICAgICBNYXRyaXhYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgocmV2ZXJzZShNYXRyaXg8ZmxvYXQsIDEwMCwgMTAwPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzkocmV2ZXJzZShNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoYnVnMTY4NDwwPigpKTsKICAgfQotICBDQUxMX1NVQlRFU1RfMyggYXJyYXlfcmV2ZXJzZV9leHRyYTwwPigpICk7CisgIENBTExfU1VCVEVTVF8zKGFycmF5X3JldmVyc2VfZXh0cmE8MD4oKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2JhbmRtYXRyaXguY3BwIGIvdGVzdC9iYW5kbWF0cml4LmNwcAppbmRleCA2NmExYjBkLi4wMjdlYjA2IDEwMDY0NAotLS0gYS90ZXN0L2JhbmRtYXRyaXguY3BwCisrKyBiL3Rlc3QvYmFuZG1hdHJpeC5jcHAKQEAgLTksNjMgKzksNTggQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBiYW5kbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIF9tKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGJhbmRtYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgX20pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBEZW5zZU1hdHJpeFR5cGU7CiAKICAgSW5kZXggcm93cyA9IF9tLnJvd3MoKTsKICAgSW5kZXggY29scyA9IF9tLmNvbHMoKTsKICAgSW5kZXggc3VwZXJzID0gX20uc3VwZXJzKCk7CiAgIEluZGV4IHN1YnMgPSBfbS5zdWJzKCk7CiAKLSAgTWF0cml4VHlwZSBtKHJvd3MsY29scyxzdXBlcnMsc3Vicyk7CisgIE1hdHJpeFR5cGUgbShyb3dzLCBjb2xzLCBzdXBlcnMsIHN1YnMpOwogCi0gIERlbnNlTWF0cml4VHlwZSBkbTEocm93cyxjb2xzKTsKKyAgRGVuc2VNYXRyaXhUeXBlIGRtMShyb3dzLCBjb2xzKTsKICAgZG0xLnNldFplcm8oKTsKIAogICBtLmRpYWdvbmFsKCkuc2V0Q29uc3RhbnQoMTIzKTsKICAgZG0xLmRpYWdvbmFsKCkuc2V0Q29uc3RhbnQoMTIzKTsKLSAgZm9yIChpbnQgaT0xOyBpPD1tLnN1cGVycygpOysraSkKLSAgeworICBmb3IgKGludCBpID0gMTsgaSA8PSBtLnN1cGVycygpOyArK2kpIHsKICAgICBtLmRpYWdvbmFsKGkpLnNldENvbnN0YW50KHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KGkpKTsKICAgICBkbTEuZGlhZ29uYWwoaSkuc2V0Q29uc3RhbnQoc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oaSkpOwogICB9Ci0gIGZvciAoaW50IGk9MTsgaTw9bS5zdWJzKCk7KytpKQotICB7CisgIGZvciAoaW50IGkgPSAxOyBpIDw9IG0uc3VicygpOyArK2kpIHsKICAgICBtLmRpYWdvbmFsKC1pKS5zZXRDb25zdGFudCgtc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oaSkpOwogICAgIGRtMS5kaWFnb25hbCgtaSkuc2V0Q29uc3RhbnQoLXN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KGkpKTsKICAgfQotICAvL3N0ZDo6Y2VyciA8PCBtLm1fZGF0YSA8PCAiXG5cbiIgPDwgbS50b0RlbnNlKCkgPDwgIlxuXG4iIDw8IGRtMSA8PCAiXG5cblxuXG4iOwotICBWRVJJRllfSVNfQVBQUk9YKGRtMSxtLnRvRGVuc2VNYXRyaXgoKSk7CisgIC8vIHN0ZDo6Y2VyciA8PCBtLm1fZGF0YSA8PCAiXG5cbiIgPDwgbS50b0RlbnNlKCkgPDwgIlxuXG4iIDw8IGRtMSA8PCAiXG5cblxuXG4iOworICBWRVJJRllfSVNfQVBQUk9YKGRtMSwgbS50b0RlbnNlTWF0cml4KCkpOwogCi0gIGZvciAoaW50IGk9MDsgaTxjb2xzOyArK2kpCi0gIHsKLSAgICBtLmNvbChpKS5zZXRDb25zdGFudChzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPihpKzEpKTsKLSAgICBkbTEuY29sKGkpLnNldENvbnN0YW50KHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KGkrMSkpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHM7ICsraSkgeworICAgIG0uY29sKGkpLnNldENvbnN0YW50KHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KGkgKyAxKSk7CisgICAgZG0xLmNvbChpKS5zZXRDb25zdGFudChzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPihpICsgMSkpOwogICB9Ci0gIEluZGV4IGQgPSAoc3RkOjptaW4pKHJvd3MsY29scyk7Ci0gIEluZGV4IGEgPSBzdGQ6Om1heDxJbmRleD4oMCxjb2xzLWQtc3VwZXJzKTsKLSAgSW5kZXggYiA9IHN0ZDo6bWF4PEluZGV4PigwLHJvd3MtZC1zdWJzKTsKLSAgaWYoYT4wKSBkbTEuYmxvY2soMCxkK3N1cGVycyxyb3dzLGEpLnNldFplcm8oKTsKLSAgZG0xLmJsb2NrKDAsc3VwZXJzKzEsY29scy1zdXBlcnMtMS1hLGNvbHMtc3VwZXJzLTEtYSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc2V0WmVybygpOwotICBkbTEuYmxvY2soc3VicysxLDAscm93cy1zdWJzLTEtYixyb3dzLXN1YnMtMS1iKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7Ci0gIGlmKGI+MCkgZG0xLmJsb2NrKGQrc3VicywwLGIsY29scykuc2V0WmVybygpOwotICAvL3N0ZDo6Y2VyciA8PCBtLm1fZGF0YSA8PCAiXG5cbiIgPDwgbS50b0RlbnNlKCkgPDwgIlxuXG4iIDw8IGRtMSA8PCAiXG5cbiI7Ci0gIFZFUklGWV9JU19BUFBST1goZG0xLG0udG9EZW5zZU1hdHJpeCgpKTsKLQorICBJbmRleCBkID0gKHN0ZDo6bWluKShyb3dzLCBjb2xzKTsKKyAgSW5kZXggYSA9IHN0ZDo6bWF4PEluZGV4PigwLCBjb2xzIC0gZCAtIHN1cGVycyk7CisgIEluZGV4IGIgPSBzdGQ6Om1heDxJbmRleD4oMCwgcm93cyAtIGQgLSBzdWJzKTsKKyAgaWYgKGEgPiAwKSBkbTEuYmxvY2soMCwgZCArIHN1cGVycywgcm93cywgYSkuc2V0WmVybygpOworICBkbTEuYmxvY2soMCwgc3VwZXJzICsgMSwgY29scyAtIHN1cGVycyAtIDEgLSBhLCBjb2xzIC0gc3VwZXJzIC0gMSAtIGEpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNldFplcm8oKTsKKyAgZG0xLmJsb2NrKHN1YnMgKyAxLCAwLCByb3dzIC0gc3VicyAtIDEgLSBiLCByb3dzIC0gc3VicyAtIDEgLSBiKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zZXRaZXJvKCk7CisgIGlmIChiID4gMCkgZG0xLmJsb2NrKGQgKyBzdWJzLCAwLCBiLCBjb2xzKS5zZXRaZXJvKCk7CisgIC8vIHN0ZDo6Y2VyciA8PCBtLm1fZGF0YSA8PCAiXG5cbiIgPDwgbS50b0RlbnNlKCkgPDwgIlxuXG4iIDw8IGRtMSA8PCAiXG5cbiI7CisgIFZFUklGWV9JU19BUFBST1goZG0xLCBtLnRvRGVuc2VNYXRyaXgoKSk7CiB9CiAKIHVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6QmFuZE1hdHJpeDsKIAotRUlHRU5fREVDTEFSRV9URVNUKGJhbmRtYXRyaXgpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCAxMCpnX3JlcGVhdCA7IGkrKykgewotICAgIEluZGV4IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLDEwKTsKLSAgICBJbmRleCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwxMCk7Ci0gICAgSW5kZXggc3VwcyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsY29scy0xKTsKLSAgICBJbmRleCBzdWJzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOwotICAgIENBTExfU1VCVEVTVChiYW5kbWF0cml4KEJhbmRNYXRyaXg8ZmxvYXQ+KHJvd3MsY29scyxzdXBzLHN1YnMpKSApOworRUlHRU5fREVDTEFSRV9URVNUKGJhbmRtYXRyaXgpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMCAqIGdfcmVwZWF0OyBpKyspIHsKKyAgICBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgMTApOworICAgIEluZGV4IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAxMCk7CisgICAgSW5kZXggc3VwcyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAxKTsKKyAgICBJbmRleCBzdWJzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cyAtIDEpOworICAgIENBTExfU1VCVEVTVChiYW5kbWF0cml4KEJhbmRNYXRyaXg8ZmxvYXQ+KHJvd3MsIGNvbHMsIHN1cHMsIHN1YnMpKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvYmFzaWNzdHVmZi5jcHAgYi90ZXN0L2Jhc2ljc3R1ZmYuY3BwCmluZGV4IDA1Y2Q2YWQuLjQ1NWNiZmQgMTAwNjQ0Ci0tLSBhL3Rlc3QvYmFzaWNzdHVmZi5jcHAKKysrIGIvdGVzdC9iYXNpY3N0dWZmLmNwcApAQCAtMTEsMTggKzExLDE4IEBACiAjaW5jbHVkZSAicmFuZG9tX3dpdGhvdXRfY2FzdF9vdmVyZmxvdy5oIgogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXN0ZDo6ZW5hYmxlX2lmX3Q8KE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT0xIHx8IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPT0xKSx2b2lkPgotY2hlY2tfaW5kZXgoY29uc3QgTWF0cml4VHlwZSYgbSkgeworc3RkOjplbmFibGVfaWZfdDwoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gMSB8fCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSA9PSAxKSwgdm9pZD4gY2hlY2tfaW5kZXgoCisgICAgY29uc3QgTWF0cml4VHlwZSYgbSkgewogICBWRVJJRllfUkFJU0VTX0FTU0VSVChtWzBdKTsKLSAgVkVSSUZZX1JBSVNFU19BU1NFUlQoKG0rbSlbMF0pOworICBWRVJJRllfUkFJU0VTX0FTU0VSVCgobSArIG0pWzBdKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci1zdGQ6OmVuYWJsZV9pZl90PCEoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU9PTEgfHwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU9PTEpLHZvaWQ+Ci1jaGVja19pbmRleChjb25zdCBNYXRyaXhUeXBlJiAvKnVudXNlZCovKSB7fQorc3RkOjplbmFibGVfaWZfdDwhKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID09IDEgfHwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gMSksIHZvaWQ+IGNoZWNrX2luZGV4KAorICAgIGNvbnN0IE1hdHJpeFR5cGUmIC8qdW51c2VkKi8pIHt9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgYmFzaWNTdHVmZihjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGJhc2ljU3R1ZmYoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBTcXVhcmVNYXRyaXhUeXBlOwpAQCAtMzIsMjUgKzMyLDIxIEBACiAKICAgLy8gdGhpcyB0ZXN0IHJlbGllcyBhIGxvdCBvbiBSYW5kb20uaCwgYW5kIHRoZXJlJ3Mgbm90IG11Y2ggbW9yZSB0aGF0IHdlIGNhbiBkbwogICAvLyB0byB0ZXN0IGl0LCBoZW5jZSBJIGNvbnNpZGVyIHRoYXQgd2Ugd2lsbCBoYXZlIHRlc3RlZCBSYW5kb20uaAotICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbTMocm93cywgY29scyksCiAgICAgICAgICAgICAgbXplcm8gPSBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpLAogICAgICAgICAgICAgIHNxdWFyZSA9IE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT46OlJhbmRvbShyb3dzLCByb3dzKTsKLSAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwKLSAgICAgICAgICAgICB2emVybyA9IFZlY3RvclR5cGU6Olplcm8ocm93cyk7Ci0gIFNxdWFyZU1hdHJpeFR5cGUgc20xID0gU3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKHJvd3Mscm93cyksIHNtMihyb3dzLHJvd3MpOworICBWZWN0b3JUeXBlIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLCB2emVybyA9IFZlY3RvclR5cGU6Olplcm8ocm93cyk7CisgIFNxdWFyZU1hdHJpeFR5cGUgc20xID0gU3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIHJvd3MpLCBzbTIocm93cywgcm93cyk7CiAKICAgU2NhbGFyIHggPSAwOwotICB3aGlsZSh4ID09IFNjYWxhcigwKSkgeCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICB3aGlsZSAoeCA9PSBTY2FsYXIoMCkpIHggPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKIAotICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKSwKLSAgICAgICAgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMSksIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CiAKLSAgbTEuY29lZmZSZWYocixjKSA9IHg7Ci0gIFZFUklGWV9JU19BUFBST1goeCwgbTEuY29lZmYocixjKSk7Ci0gIG0xKHIsYykgPSB4OwotICBWRVJJRllfSVNfQVBQUk9YKHgsIG0xKHIsYykpOworICBtMS5jb2VmZlJlZihyLCBjKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1goeCwgbTEuY29lZmYociwgYykpOworICBtMShyLCBjKSA9IHg7CisgIFZFUklGWV9JU19BUFBST1goeCwgbTEociwgYykpOwogICB2MS5jb2VmZlJlZihyKSA9IHg7CiAgIFZFUklGWV9JU19BUFBST1goeCwgdjEuY29lZmYocikpOwogICB2MShyKSA9IHg7CkBAIC01OSw3ICs1NSw3IEBACiAgIFZFUklGWV9JU19BUFBST1goeCwgdjFbcl0pOwogCiAgIC8vIHRlc3QgZmV0Y2hpbmcgd2l0aCB2YXJpb3VzIGluZGV4IHR5cGVzLgotICBJbmRleCByMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIG51bWV4dDo6bWluaShJbmRleCgxMjcpLHJvd3MtMSkpOworICBJbmRleCByMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIG51bWV4dDo6bWluaShJbmRleCgxMjcpLCByb3dzIC0gMSkpOwogICB4ID0gdjEoc3RhdGljX2Nhc3Q8Y2hhcj4ocjEpKTsKICAgeCA9IHYxKHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPihyMSkpOwogICB4ID0gdjEoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocjEpKTsKQEAgLTY5LDIyICs2NSwyMCBAQAogICB4ID0gdjEoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihyMSkpOwogICB4ID0gdjEoc3RhdGljX2Nhc3Q8c2lnbmVkIGxvbmc+KHIxKSk7CiAgIHggPSB2MShzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihyMSkpOwotICBpZihzaXplb2YoSW5kZXgpID49IHNpemVvZihsb25nIGxvbmcgaW50KSkKLSAgICB4ID0gdjEoc3RhdGljX2Nhc3Q8bG9uZyBsb25nIGludD4ocjEpKTsKLSAgaWYoc2l6ZW9mKEluZGV4KSA+PSBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nIGludCkpCi0gICAgeCA9IHYxKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQ+KHIxKSk7CisgIGlmIChzaXplb2YoSW5kZXgpID49IHNpemVvZihsb25nIGxvbmcgaW50KSkgeCA9IHYxKHN0YXRpY19jYXN0PGxvbmcgbG9uZyBpbnQ+KHIxKSk7CisgIGlmIChzaXplb2YoSW5kZXgpID49IHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcgaW50KSkgeCA9IHYxKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQ+KHIxKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWCggICAgICAgICAgICAgICB2MSwgICAgdjEpOwotICBWRVJJRllfSVNfTk9UX0FQUFJPWCggICAgICAgICAgIHYxLCAgICAyKnYxKTsKLSAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCAgICB2emVybywgdjEpOwotICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oICB2emVybywgdjEuc3F1YXJlZE5vcm0oKSk7Ci0gIFZFUklGWV9JU19OT1RfTVVDSF9TTUFMTEVSX1RIQU4odjEsICAgIHYxKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggICAgICAgICAgICAgICB2emVybywgdjEtdjEpOwotICBWRVJJRllfSVNfQVBQUk9YKCAgICAgICAgICAgICAgIG0xLCAgICBtMSk7Ci0gIFZFUklGWV9JU19OT1RfQVBQUk9YKCAgICAgICAgICAgbTEsICAgIDIqbTEpOwotICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oICAgIG16ZXJvLCBtMSk7Ci0gIFZFUklGWV9JU19OT1RfTVVDSF9TTUFMTEVSX1RIQU4obTEsICAgIG0xKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggICAgICAgICAgICAgICBtemVybywgbTEtbTEpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLCB2MSk7CisgIFZFUklGWV9JU19OT1RfQVBQUk9YKHYxLCAyICogdjEpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odnplcm8sIHYxKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHZ6ZXJvLCB2MS5zcXVhcmVkTm9ybSgpKTsKKyAgVkVSSUZZX0lTX05PVF9NVUNIX1NNQUxMRVJfVEhBTih2MSwgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKHZ6ZXJvLCB2MSAtIHYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTEpOworICBWRVJJRllfSVNfTk9UX0FQUFJPWChtMSwgMiAqIG0xKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKG16ZXJvLCBtMSk7CisgIFZFUklGWV9JU19OT1RfTVVDSF9TTUFMTEVSX1RIQU4obTEsIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtemVybywgbTEgLSBtMSk7CiAKICAgLy8gYWx3YXlzIHRlc3Qgb3BlcmF0b3IoKSBvbiBlYWNoIHJlYWQtb25seSBleHByZXNzaW9uIGNsYXNzLAogICAvLyBpbiBvcmRlciB0byBjaGVjayBjb25zdC1xdWFsaWZpZXJzLgpAQCAtOTIsNyArODYsNyBAQAogICAvLyBoZW5jZSBoYXMgbm8gX3dyaXRlKCkgbWV0aG9kLCB0aGUgY29ycmVzcG9uZGluZyBNYXRyaXhCYXNlIG1ldGhvZCAoaGVyZSB6ZXJvKCkpCiAgIC8vIHNob3VsZCByZXR1cm4gYSBjb25zdC1xdWFsaWZpZWQgb2JqZWN0IHNvIHRoYXQgaXQgaXMgdGhlIGNvbnN0LXF1YWxpZmllZAogICAvLyBvcGVyYXRvcigpIHRoYXQgZ2V0cyBjYWxsZWQsIHdoaWNoIGluIHR1cm4gY2FsbHMgX3JlYWQoKS4KLSAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKE1hdHJpeFR5cGU6Olplcm8ocm93cyxjb2xzKShyLGMpLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDEpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scykociwgYyksIHN0YXRpY19jYXN0PFNjYWxhcj4oMSkpOwogCiAgIC8vIG5vdyB0ZXN0IGNvcHlpbmcgYSByb3ctdmVjdG9yIGludG8gYSAoY29sdW1uLSl2ZWN0b3IgYW5kIGNvbnZlcnNlbHkuCiAgIHNxdWFyZS5jb2wocikgPSBzcXVhcmUucm93KHIpLmV2YWwoKTsKQEAgLTEwMyw3MSArOTcsNzEgQEAKIAogICBWRVJJRllfSVNfQVBQUk9YKHJ2LCBjdi50cmFuc3Bvc2UoKSk7CiAKLSAgaWYoY29scyE9MSAmJiByb3dzIT0xICYmIE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lIT1EeW5hbWljKQotICB7Ci0gICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEgPSAobTIuYmxvY2soMCwwLCByb3dzLTEsIGNvbHMtMSkpKTsKKyAgaWYgKGNvbHMgIT0gMSAmJiByb3dzICE9IDEgJiYgTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgIT0gRHluYW1pYykgeworICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xID0gKG0yLmJsb2NrKDAsIDAsIHJvd3MgLSAxLCBjb2xzIC0gMSkpKTsKICAgfQogCi0gIGlmKGNvbHMhPTEgJiYgcm93cyE9MSkKLSAgeworICBpZiAoY29scyAhPSAxICYmIHJvd3MgIT0gMSkgewogICAgIGNoZWNrX2luZGV4KG0xKTsKICAgfQogCi0gIFZFUklGWV9JU19BUFBST1gobTMgPSBtMSxtMSk7CisgIFZFUklGWV9JU19BUFBST1gobTMgPSBtMSwgbTEpOwogICBNYXRyaXhUeXBlIG00OwotICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTEsbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTEsIG0xKTsKIAogICBtMy5yZWFsKCkgPSBtMS5yZWFsKCk7CiAgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8Y29uc3QgTWF0cml4VHlwZSY+KG0zKS5yZWFsKCksIHN0YXRpY19jYXN0PGNvbnN0IE1hdHJpeFR5cGUmPihtMSkucmVhbCgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4obTMpLnJlYWwoKSwgbTEucmVhbCgpKTsKIAogICAvLyBjaGVjayA9PSAvICE9IG9wZXJhdG9ycwotICBWRVJJRlkobTE9PW0xKTsKLSAgVkVSSUZZKG0xIT1tMik7Ci0gIFZFUklGWSghKG0xPT1tMikpOwotICBWRVJJRlkoIShtMSE9bTEpKTsKKyAgVkVSSUZZKG0xID09IG0xKTsKKyAgVkVSSUZZKG0xICE9IG0yKTsKKyAgVkVSSUZZKCEobTEgPT0gbTIpKTsKKyAgVkVSSUZZKCEobTEgIT0gbTEpKTsKICAgbTEgPSBtMjsKLSAgVkVSSUZZKG0xPT1tMik7Ci0gIFZFUklGWSghKG0xIT1tMikpOworICBWRVJJRlkobTEgPT0gbTIpOworICBWRVJJRlkoIShtMSAhPSBtMikpOwogCiAgIC8vIGNoZWNrIGF1dG9tYXRpYyB0cmFuc3Bvc2l0aW9uCiAgIHNtMi5zZXRaZXJvKCk7Ci0gIGZvcihJbmRleCBpPTA7aTxyb3dzOysraSkKLSAgICBzbTIuY29sKGkpID0gc20xLnJvdyhpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzbTIsc20xLnRyYW5zcG9zZSgpKTsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IHJvd3M7ICsraSkgc20yLmNvbChpKSA9IHNtMS5yb3coaSk7CisgIFZFUklGWV9JU19BUFBST1goc20yLCBzbTEudHJhbnNwb3NlKCkpOwogCiAgIHNtMi5zZXRaZXJvKCk7Ci0gIGZvcihJbmRleCBpPTA7aTxyb3dzOysraSkKLSAgICBzbTIuY29sKGkpLm5vYWxpYXMoKSA9IHNtMS5yb3coaSk7Ci0gIFZFUklGWV9JU19BUFBST1goc20yLHNtMS50cmFuc3Bvc2UoKSk7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCByb3dzOyArK2kpIHNtMi5jb2woaSkubm9hbGlhcygpID0gc20xLnJvdyhpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzbTIsIHNtMS50cmFuc3Bvc2UoKSk7CiAKICAgc20yLnNldFplcm8oKTsKLSAgZm9yKEluZGV4IGk9MDtpPHJvd3M7KytpKQotICAgIHNtMi5jb2woaSkubm9hbGlhcygpICs9IHNtMS5yb3coaSk7Ci0gIFZFUklGWV9JU19BUFBST1goc20yLHNtMS50cmFuc3Bvc2UoKSk7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCByb3dzOyArK2kpIHNtMi5jb2woaSkubm9hbGlhcygpICs9IHNtMS5yb3coaSk7CisgIFZFUklGWV9JU19BUFBST1goc20yLCBzbTEudHJhbnNwb3NlKCkpOwogCiAgIHNtMi5zZXRaZXJvKCk7Ci0gIGZvcihJbmRleCBpPTA7aTxyb3dzOysraSkKLSAgICBzbTIuY29sKGkpLm5vYWxpYXMoKSAtPSBzbTEucm93KGkpOwotICBWRVJJRllfSVNfQVBQUk9YKHNtMiwtc20xLnRyYW5zcG9zZSgpKTsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IHJvd3M7ICsraSkgc20yLmNvbChpKS5ub2FsaWFzKCkgLT0gc20xLnJvdyhpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzbTIsIC1zbTEudHJhbnNwb3NlKCkpOwogCiAgIC8vIGNoZWNrIHRlcm5hcnkgdXNhZ2UKICAgewotICAgIGJvb2wgYiA9IGludGVybmFsOjpyYW5kb208aW50PigwLDEwKT41OworICAgIGJvb2wgYiA9IGludGVybmFsOjpyYW5kb208aW50PigwLCAxMCkgPiA1OwogICAgIG0zID0gYiA/IG0xIDogbTI7Ci0gICAgaWYoYikgVkVSSUZZX0lTX0FQUFJPWChtMyxtMSk7Ci0gICAgZWxzZSAgVkVSSUZZX0lTX0FQUFJPWChtMyxtMik7CisgICAgaWYgKGIpCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMSk7CisgICAgZWxzZQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTIpOwogICAgIG0zID0gYiA/IC1tMSA6IG0yOwotICAgIGlmKGIpIFZFUklGWV9JU19BUFBST1gobTMsLW0xKTsKLSAgICBlbHNlICBWRVJJRllfSVNfQVBQUk9YKG0zLG0yKTsKKyAgICBpZiAoYikKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTMsIC1tMSk7CisgICAgZWxzZQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTIpOwogICAgIG0zID0gYiA/IG0xIDogLW0yOwotICAgIGlmKGIpIFZFUklGWV9JU19BUFBST1gobTMsbTEpOwotICAgIGVsc2UgIFZFUklGWV9JU19BUFBST1gobTMsLW0yKTsKKyAgICBpZiAoYikKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTMsIG0xKTsKKyAgICBlbHNlCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0zLCAtbTIpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgYmFzaWNTdHVmZkNvbXBsZXgoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBiYXNpY1N0dWZmQ29tcGxleChjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOwogICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IFJlYWxNYXRyaXhUeXBlOwpAQCAtMTc1LDE5ICsxNjksMTcgQEAKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKLSAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCi0gICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKIAotICBWRVJJRlkobnVtZXh0OjpyZWFsKHMxKT09bnVtZXh0OjpyZWFsX3JlZihzMSkpOwotICBWRVJJRlkobnVtZXh0OjppbWFnKHMxKT09bnVtZXh0OjppbWFnX3JlZihzMSkpOworICBWRVJJRlkobnVtZXh0OjpyZWFsKHMxKSA9PSBudW1leHQ6OnJlYWxfcmVmKHMxKSk7CisgIFZFUklGWShudW1leHQ6OmltYWcoczEpID09IG51bWV4dDo6aW1hZ19yZWYoczEpKTsKICAgbnVtZXh0OjpyZWFsX3JlZihzMSkgPSBudW1leHQ6OnJlYWwoczIpOwogICBudW1leHQ6OmltYWdfcmVmKHMxKSA9IG51bWV4dDo6aW1hZyhzMik7CiAgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3goczEsIHMyLCBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKSkpOwogICAvLyBleHRlbmRlZCBwcmVjaXNpb24gaW4gSW50ZWwgRlBVcyBtZWFucyB0aGF0IHMxID09IHMyIGluIHRoZSBsaW5lIGFib3ZlIGlzIG5vdCBndWFyYW50ZWVkLgogCi0gIFJlYWxNYXRyaXhUeXBlIHJtMSA9IFJlYWxNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSwKLSAgICAgICAgICAgICAgICAgcm0yID0gUmVhbE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICBNYXRyaXhUeXBlIGNtKHJvd3MsY29scyk7CisgIFJlYWxNYXRyaXhUeXBlIHJtMSA9IFJlYWxNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIHJtMiA9IFJlYWxNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgY20ocm93cywgY29scyk7CiAgIGNtLnJlYWwoKSA9IHJtMTsKICAgY20uaW1hZygpID0gcm0yOwogICBWRVJJRllfSVNfQVBQUk9YKHN0YXRpY19jYXN0PGNvbnN0IE1hdHJpeFR5cGUmPihjbSkucmVhbCgpLCBybTEpOwpAQCAtMjAzLDI1ICsxOTUsMjUgQEAKICAgVkVSSUZZKCFzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4oY20pLmltYWcoKS5pc1plcm8oKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNyY1NjYWxhciwgdHlwZW5hbWUgVGd0U2NhbGFyPgordGVtcGxhdGUgPHR5cGVuYW1lIFNyY1NjYWxhciwgdHlwZW5hbWUgVGd0U2NhbGFyPgogc3RydWN0IGNhc3RpbmdfdGVzdCB7CiAgIHN0YXRpYyB2b2lkIHJ1bigpIHsKLSAgICBNYXRyaXg8U3JjU2NhbGFyLDQsND4gbTsKLSAgICBmb3IgKGludCBpPTA7IGk8bS5yb3dzKCk7ICsraSkgewotICAgICAgZm9yIChpbnQgaj0wOyBqPG0uY29scygpOyArK2opIHsKLSAgICAgICAgbShpLCBqKSA9IGludGVybmFsOjpyYW5kb21fd2l0aG91dF9jYXN0X292ZXJmbG93PFNyY1NjYWxhcixUZ3RTY2FsYXI+Ojp2YWx1ZSgpOworICAgIE1hdHJpeDxTcmNTY2FsYXIsIDQsIDQ+IG07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtLnJvd3MoKTsgKytpKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG0uY29scygpOyArK2opIHsKKyAgICAgICAgbShpLCBqKSA9IGludGVybmFsOjpyYW5kb21fd2l0aG91dF9jYXN0X292ZXJmbG93PFNyY1NjYWxhciwgVGd0U2NhbGFyPjo6dmFsdWUoKTsKICAgICAgIH0KICAgICB9Ci0gICAgTWF0cml4PFRndFNjYWxhciw0LDQ+IG4gPSBtLnRlbXBsYXRlIGNhc3Q8VGd0U2NhbGFyPigpOwotICAgIGZvciAoaW50IGk9MDsgaTxtLnJvd3MoKTsgKytpKSB7Ci0gICAgICBmb3IgKGludCBqPTA7IGo8bS5jb2xzKCk7ICsraikgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG4oaSwgaiksIChpbnRlcm5hbDo6Y2FzdDxTcmNTY2FsYXIsVGd0U2NhbGFyPihtKGksIGopKSkpOworICAgIE1hdHJpeDxUZ3RTY2FsYXIsIDQsIDQ+IG4gPSBtLnRlbXBsYXRlIGNhc3Q8VGd0U2NhbGFyPigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbS5yb3dzKCk7ICsraSkgeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtLmNvbHMoKTsgKytqKSB7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobihpLCBqKSwgKGludGVybmFsOjpjYXN0PFNyY1NjYWxhciwgVGd0U2NhbGFyPihtKGksIGopKSkpOwogICAgICAgfQogICAgIH0KICAgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgU3JjU2NhbGFyLCB0eXBlbmFtZSBFbmFibGVJZiA9IHZvaWQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjU2NhbGFyLCB0eXBlbmFtZSBFbmFibGVJZiA9IHZvaWQ+CiBzdHJ1Y3QgY2FzdGluZ190ZXN0X3J1bm5lciB7CiAgIHN0YXRpYyB2b2lkIHJ1bigpIHsKICAgICBjYXN0aW5nX3Rlc3Q8U3JjU2NhbGFyLCBib29sPjo6cnVuKCk7CkBAIC0yMzcsMjAgKzIyOSwxOSBAQAogICAgIGNhc3RpbmdfdGVzdDxTcmNTY2FsYXIsIGJmbG9hdDE2Pjo6cnVuKCk7CiAgICAgY2FzdGluZ190ZXN0PFNyY1NjYWxhciwgZmxvYXQ+OjpydW4oKTsKICAgICBjYXN0aW5nX3Rlc3Q8U3JjU2NhbGFyLCBkb3VibGU+OjpydW4oKTsKLSAgICBjYXN0aW5nX3Rlc3Q8U3JjU2NhbGFyLCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID46OnJ1bigpOwotICAgIGNhc3RpbmdfdGVzdDxTcmNTY2FsYXIsIHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnJ1bigpOworICAgIGNhc3RpbmdfdGVzdDxTcmNTY2FsYXIsIHN0ZDo6Y29tcGxleDxmbG9hdD4+OjpydW4oKTsKKyAgICBjYXN0aW5nX3Rlc3Q8U3JjU2NhbGFyLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPj46OnJ1bigpOwogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTcmNTY2FsYXI+Ci1zdHJ1Y3QgY2FzdGluZ190ZXN0X3J1bm5lcjxTcmNTY2FsYXIsIHN0ZDo6ZW5hYmxlX2lmX3Q8KE51bVRyYWl0czxTcmNTY2FsYXI+OjpJc0NvbXBsZXgpPj4KLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcmNTY2FsYXI+CitzdHJ1Y3QgY2FzdGluZ190ZXN0X3J1bm5lcjxTcmNTY2FsYXIsIHN0ZDo6ZW5hYmxlX2lmX3Q8KE51bVRyYWl0czxTcmNTY2FsYXI+OjpJc0NvbXBsZXgpPj4gewogICBzdGF0aWMgdm9pZCBydW4oKSB7CiAgICAgLy8gT25seSBhIGZldyBjYXN0cyBmcm9tIHN0ZDo6Y29tcGxleDxUPiBhcmUgZGVmaW5lZC4KICAgICBjYXN0aW5nX3Rlc3Q8U3JjU2NhbGFyLCBoYWxmPjo6cnVuKCk7CiAgICAgY2FzdGluZ190ZXN0PFNyY1NjYWxhciwgYmZsb2F0MTY+OjpydW4oKTsKLSAgICBjYXN0aW5nX3Rlc3Q8U3JjU2NhbGFyLCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID46OnJ1bigpOwotICAgIGNhc3RpbmdfdGVzdDxTcmNTY2FsYXIsIHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnJ1bigpOworICAgIGNhc3RpbmdfdGVzdDxTcmNTY2FsYXIsIHN0ZDo6Y29tcGxleDxmbG9hdD4+OjpydW4oKTsKKyAgICBjYXN0aW5nX3Rlc3Q8U3JjU2NhbGFyLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPj46OnJ1bigpOwogICB9CiB9OwogCkBAIC0yNjgsNjEgKzI1OSw1NyBAQAogICBjYXN0aW5nX3Rlc3RfcnVubmVyPGJmbG9hdDE2Pjo6cnVuKCk7CiAgIGNhc3RpbmdfdGVzdF9ydW5uZXI8ZmxvYXQ+OjpydW4oKTsKICAgY2FzdGluZ190ZXN0X3J1bm5lcjxkb3VibGU+OjpydW4oKTsKLSAgY2FzdGluZ190ZXN0X3J1bm5lcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID46OnJ1bigpOwotICBjYXN0aW5nX3Rlc3RfcnVubmVyPHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnJ1bigpOworICBjYXN0aW5nX3Rlc3RfcnVubmVyPHN0ZDo6Y29tcGxleDxmbG9hdD4+OjpydW4oKTsKKyAgY2FzdGluZ190ZXN0X3J1bm5lcjxzdGQ6OmNvbXBsZXg8ZG91YmxlPj46OnJ1bigpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgotdm9pZCBmaXhlZFNpemVNYXRyaXhDb25zdHJ1Y3Rpb24oKQotewordm9pZCBmaXhlZFNpemVNYXRyaXhDb25zdHJ1Y3Rpb24oKSB7CiAgIFNjYWxhciByYXdbNF07Ci0gIGZvcihpbnQgaz0wOyBrPDQ7ICsraykKLSAgICByYXdba10gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCA0OyArK2spIHJhd1trXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwogCiAgIHsKLSAgICBNYXRyaXg8U2NhbGFyLDQsMT4gbShyYXcpOwotICAgIEFycmF5PFNjYWxhciw0LDE+IGEocmF3KTsKLSAgICBmb3IoaW50IGs9MDsgazw0OyArK2spIFZFUklGWShtKGspID09IHJhd1trXSk7Ci0gICAgZm9yKGludCBrPTA7IGs8NDsgKytrKSBWRVJJRlkoYShrKSA9PSByYXdba10pOwotICAgIFZFUklGWV9JU19FUVVBTChtLChNYXRyaXg8U2NhbGFyLDQsMT4ocmF3WzBdLHJhd1sxXSxyYXdbMl0scmF3WzNdKSkpOwotICAgIFZFUklGWSgoYT09KEFycmF5PFNjYWxhciw0LDE+KHJhd1swXSxyYXdbMV0scmF3WzJdLHJhd1szXSkpKS5hbGwoKSk7CisgICAgTWF0cml4PFNjYWxhciwgNCwgMT4gbShyYXcpOworICAgIEFycmF5PFNjYWxhciwgNCwgMT4gYShyYXcpOworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNDsgKytrKSBWRVJJRlkobShrKSA9PSByYXdba10pOworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNDsgKytrKSBWRVJJRlkoYShrKSA9PSByYXdba10pOworICAgIFZFUklGWV9JU19FUVVBTChtLCAoTWF0cml4PFNjYWxhciwgNCwgMT4ocmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdKSkpOworICAgIFZFUklGWSgoYSA9PSAoQXJyYXk8U2NhbGFyLCA0LCAxPihyYXdbMF0sIHJhd1sxXSwgcmF3WzJdLCByYXdbM10pKSkuYWxsKCkpOwogICB9CiAgIHsKLSAgICBNYXRyaXg8U2NhbGFyLDMsMT4gbShyYXcpOwotICAgIEFycmF5PFNjYWxhciwzLDE+IGEocmF3KTsKLSAgICBmb3IoaW50IGs9MDsgazwzOyArK2spIFZFUklGWShtKGspID09IHJhd1trXSk7Ci0gICAgZm9yKGludCBrPTA7IGs8MzsgKytrKSBWRVJJRlkoYShrKSA9PSByYXdba10pOwotICAgIFZFUklGWV9JU19FUVVBTChtLChNYXRyaXg8U2NhbGFyLDMsMT4ocmF3WzBdLHJhd1sxXSxyYXdbMl0pKSk7Ci0gICAgVkVSSUZZKChhPT1BcnJheTxTY2FsYXIsMywxPihyYXdbMF0scmF3WzFdLHJhd1syXSkpLmFsbCgpKTsKKyAgICBNYXRyaXg8U2NhbGFyLCAzLCAxPiBtKHJhdyk7CisgICAgQXJyYXk8U2NhbGFyLCAzLCAxPiBhKHJhdyk7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyArK2spIFZFUklGWShtKGspID09IHJhd1trXSk7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyArK2spIFZFUklGWShhKGspID09IHJhd1trXSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG0sIChNYXRyaXg8U2NhbGFyLCAzLCAxPihyYXdbMF0sIHJhd1sxXSwgcmF3WzJdKSkpOworICAgIFZFUklGWSgoYSA9PSBBcnJheTxTY2FsYXIsIDMsIDE+KHJhd1swXSwgcmF3WzFdLCByYXdbMl0pKS5hbGwoKSk7CiAgIH0KICAgewotICAgIE1hdHJpeDxTY2FsYXIsMiwxPiBtKHJhdyksIG0yKCAoRGVuc2VJbmRleChyYXdbMF0pKSwgKERlbnNlSW5kZXgocmF3WzFdKSkgKTsKLSAgICBBcnJheTxTY2FsYXIsMiwxPiBhKHJhdyksICBhMiggKERlbnNlSW5kZXgocmF3WzBdKSksIChEZW5zZUluZGV4KHJhd1sxXSkpICk7Ci0gICAgZm9yKGludCBrPTA7IGs8MjsgKytrKSBWRVJJRlkobShrKSA9PSByYXdba10pOwotICAgIGZvcihpbnQgaz0wOyBrPDI7ICsraykgVkVSSUZZKGEoaykgPT0gcmF3W2tdKTsKLSAgICBWRVJJRllfSVNfRVFVQUwobSwoTWF0cml4PFNjYWxhciwyLDE+KHJhd1swXSxyYXdbMV0pKSk7Ci0gICAgVkVSSUZZKChhPT1BcnJheTxTY2FsYXIsMiwxPihyYXdbMF0scmF3WzFdKSkuYWxsKCkpOwotICAgIGZvcihpbnQgaz0wOyBrPDI7ICsraykgVkVSSUZZKG0yKGspID09IERlbnNlSW5kZXgocmF3W2tdKSk7Ci0gICAgZm9yKGludCBrPTA7IGs8MjsgKytrKSBWRVJJRlkoYTIoaykgPT0gRGVuc2VJbmRleChyYXdba10pKTsKKyAgICBNYXRyaXg8U2NhbGFyLCAyLCAxPiBtKHJhdyksIG0yKChEZW5zZUluZGV4KHJhd1swXSkpLCAoRGVuc2VJbmRleChyYXdbMV0pKSk7CisgICAgQXJyYXk8U2NhbGFyLCAyLCAxPiBhKHJhdyksIGEyKChEZW5zZUluZGV4KHJhd1swXSkpLCAoRGVuc2VJbmRleChyYXdbMV0pKSk7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIFZFUklGWShtKGspID09IHJhd1trXSk7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIFZFUklGWShhKGspID09IHJhd1trXSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG0sIChNYXRyaXg8U2NhbGFyLCAyLCAxPihyYXdbMF0sIHJhd1sxXSkpKTsKKyAgICBWRVJJRlkoKGEgPT0gQXJyYXk8U2NhbGFyLCAyLCAxPihyYXdbMF0sIHJhd1sxXSkpLmFsbCgpKTsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDI7ICsraykgVkVSSUZZKG0yKGspID09IERlbnNlSW5kZXgocmF3W2tdKSk7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIFZFUklGWShhMihrKSA9PSBEZW5zZUluZGV4KHJhd1trXSkpOwogICB9CiAgIHsKLSAgICBNYXRyaXg8U2NhbGFyLDEsMj4gbShyYXcpLAotICAgICAgICAgICAgICAgICAgICAgICBtMiggKERlbnNlSW5kZXgocmF3WzBdKSksIChEZW5zZUluZGV4KHJhd1sxXSkpICksCi0gICAgICAgICAgICAgICAgICAgICAgIG0zKCAoaW50KHJhd1swXSkpLCAoaW50KHJhd1sxXSkpICksCi0gICAgICAgICAgICAgICAgICAgICAgIG00KCAoZmxvYXQocmF3WzBdKSksIChmbG9hdChyYXdbMV0pKSApOwotICAgIEFycmF5PFNjYWxhciwxLDI+IGEocmF3KSwgIGEyKCAoRGVuc2VJbmRleChyYXdbMF0pKSwgKERlbnNlSW5kZXgocmF3WzFdKSkgKTsKLSAgICBmb3IoaW50IGs9MDsgazwyOyArK2spIFZFUklGWShtKGspID09IHJhd1trXSk7Ci0gICAgZm9yKGludCBrPTA7IGs8MjsgKytrKSBWRVJJRlkoYShrKSA9PSByYXdba10pOwotICAgIFZFUklGWV9JU19FUVVBTChtLChNYXRyaXg8U2NhbGFyLDEsMj4ocmF3WzBdLHJhd1sxXSkpKTsKLSAgICBWRVJJRlkoKGE9PUFycmF5PFNjYWxhciwxLDI+KHJhd1swXSxyYXdbMV0pKS5hbGwoKSk7Ci0gICAgZm9yKGludCBrPTA7IGs8MjsgKytrKSBWRVJJRlkobTIoaykgPT0gRGVuc2VJbmRleChyYXdba10pKTsKLSAgICBmb3IoaW50IGs9MDsgazwyOyArK2spIFZFUklGWShhMihrKSA9PSBEZW5zZUluZGV4KHJhd1trXSkpOwotICAgIGZvcihpbnQgaz0wOyBrPDI7ICsraykgVkVSSUZZKG0zKGspID09IGludChyYXdba10pKTsKLSAgICBmb3IoaW50IGs9MDsgazwyOyArK2spIFZFUklGWSgobTQoaykpID09IFNjYWxhcihmbG9hdChyYXdba10pKSk7CisgICAgTWF0cml4PFNjYWxhciwgMSwgMj4gbShyYXcpLCBtMigoRGVuc2VJbmRleChyYXdbMF0pKSwgKERlbnNlSW5kZXgocmF3WzFdKSkpLCBtMygoaW50KHJhd1swXSkpLCAoaW50KHJhd1sxXSkpKSwKKyAgICAgICAgbTQoKGZsb2F0KHJhd1swXSkpLCAoZmxvYXQocmF3WzFdKSkpOworICAgIEFycmF5PFNjYWxhciwgMSwgMj4gYShyYXcpLCBhMigoRGVuc2VJbmRleChyYXdbMF0pKSwgKERlbnNlSW5kZXgocmF3WzFdKSkpOworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMjsgKytrKSBWRVJJRlkobShrKSA9PSByYXdba10pOworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMjsgKytrKSBWRVJJRlkoYShrKSA9PSByYXdba10pOworICAgIFZFUklGWV9JU19FUVVBTChtLCAoTWF0cml4PFNjYWxhciwgMSwgMj4ocmF3WzBdLCByYXdbMV0pKSk7CisgICAgVkVSSUZZKChhID09IEFycmF5PFNjYWxhciwgMSwgMj4ocmF3WzBdLCByYXdbMV0pKS5hbGwoKSk7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIFZFUklGWShtMihrKSA9PSBEZW5zZUluZGV4KHJhd1trXSkpOworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMjsgKytrKSBWRVJJRlkoYTIoaykgPT0gRGVuc2VJbmRleChyYXdba10pKTsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDI7ICsraykgVkVSSUZZKG0zKGspID09IGludChyYXdba10pKTsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDI7ICsraykgVkVSSUZZKChtNChrKSkgPT0gU2NhbGFyKGZsb2F0KHJhd1trXSkpKTsKICAgfQogICB7Ci0gICAgTWF0cml4PFNjYWxhciwxLDE+IG0ocmF3KSwgbTEocmF3WzBdKSwgbTIoIChEZW5zZUluZGV4KHJhd1swXSkpICksIG0zKCAoaW50KHJhd1swXSkpICk7Ci0gICAgQXJyYXk8U2NhbGFyLDEsMT4gYShyYXcpLCBhMShyYXdbMF0pLCBhMiggKERlbnNlSW5kZXgocmF3WzBdKSkgKTsKKyAgICBNYXRyaXg8U2NhbGFyLCAxLCAxPiBtKHJhdyksIG0xKHJhd1swXSksIG0yKChEZW5zZUluZGV4KHJhd1swXSkpKSwgbTMoKGludChyYXdbMF0pKSk7CisgICAgQXJyYXk8U2NhbGFyLCAxLCAxPiBhKHJhdyksIGExKHJhd1swXSksIGEyKChEZW5zZUluZGV4KHJhd1swXSkpKTsKICAgICBWRVJJRlkobSgwKSA9PSByYXdbMF0pOwogICAgIFZFUklGWShhKDApID09IHJhd1swXSk7CiAgICAgVkVSSUZZKG0xKDApID09IHJhd1swXSk7CkBAIC0zMzAsMjUgKzMxNywzMCBAQAogICAgIFZFUklGWShtMigwKSA9PSBEZW5zZUluZGV4KHJhd1swXSkpOwogICAgIFZFUklGWShhMigwKSA9PSBEZW5zZUluZGV4KHJhd1swXSkpOwogICAgIFZFUklGWShtMygwKSA9PSBpbnQocmF3WzBdKSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKG0sKE1hdHJpeDxTY2FsYXIsMSwxPihyYXdbMF0pKSk7Ci0gICAgVkVSSUZZKChhPT1BcnJheTxTY2FsYXIsMSwxPihyYXdbMF0pKS5hbGwoKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG0sIChNYXRyaXg8U2NhbGFyLCAxLCAxPihyYXdbMF0pKSk7CisgICAgVkVSSUZZKChhID09IEFycmF5PFNjYWxhciwgMSwgMT4ocmF3WzBdKSkuYWxsKCkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChiYXNpY3N0dWZmKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBiYXNpY1N0dWZmKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggYmFzaWNTdHVmZihNYXRyaXg0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBiYXNpY1N0dWZmKE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBiYXNpY1N0dWZmKE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIGJhc2ljU3R1ZmYoTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoIGJhc2ljU3R1ZmYoTWF0cml4PGZsb2F0LCAxMDAsIDEwMD4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNyggYmFzaWNTdHVmZihNYXRyaXg8bG9uZyBkb3VibGUsRHluYW1pYyxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzgoIGNhc3RpbmdfYWxsKCkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChiYXNpY3N0dWZmKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKGJhc2ljU3R1ZmYoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoYmFzaWNTdHVmZihNYXRyaXg0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoYmFzaWNTdHVmZigKKyAgICAgICAgTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF80KGJhc2ljU3R1ZmYoCisgICAgICAgIE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF81KGJhc2ljU3R1ZmYoCisgICAgICAgIE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNihiYXNpY1N0dWZmKE1hdHJpeDxmbG9hdCwgMTAwLCAxMDA+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNyhiYXNpY1N0dWZmKE1hdHJpeDxsb25nIGRvdWJsZSwgRHluYW1pYywgRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgoY2FzdGluZ19hbGwoKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfMyggYmFzaWNTdHVmZkNvbXBsZXgoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIGJhc2ljU3R1ZmZDb21wbGV4KE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworICAgIENBTExfU1VCVEVTVF8zKGJhc2ljU3R1ZmZDb21wbGV4KAorICAgICAgICBNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoYmFzaWNTdHVmZkNvbXBsZXgoCisgICAgICAgIE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKICAgfQogCiAgIENBTExfU1VCVEVTVF8xKGZpeGVkU2l6ZU1hdHJpeENvbnN0cnVjdGlvbjx1bnNpZ25lZCBjaGFyPigpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvYmRjc3ZkLmNwcCBiL3Rlc3QvYmRjc3ZkLmNwcAppbmRleCA0ZjBhMTM3Li5jNTFmMzU0IDEwMDY0NAotLS0gYS90ZXN0L2JkY3N2ZC5jcHAKKysrIGIvdGVzdC9iZGNzdmQuY3BwCkBAIC0yMiw5ICsyMiw4IEBACiAjZGVmaW5lIFNWRF9TVEFUSUNfT1BUSU9OUyhNLCBPKSBCRENTVkQ8TSwgTz4KICNpbmNsdWRlICJzdmRfY29tbW9uLmgiCiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIGJkY3N2ZF9tZXRob2QoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGJkY3N2ZF9tZXRob2QoKSB7CiAgIGVudW0geyBTaXplID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgfTsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIFNpemUsIDE+IFJlYWxWZWNUeXBlOwpAQCAtNDgsMjIgKzQ3LDE2IEBACiB9CiAKIC8vIFZlcmlmaWVzIHRvdGFsIGRlZmxhdGlvbiBpcyAqKm5vdCoqIHRyaWdnZXJlZC4KLXZvaWQgY29tcGFyZV9iZGNfamFjb2JpX2luc3RhbmNlKGJvb2wgc3RydWN0dXJlX2FzX20sIGludCBhbGdvc3dhcCA9IDE2KQotewordm9pZCBjb21wYXJlX2JkY19qYWNvYmlfaW5zdGFuY2UoYm9vbCBzdHJ1Y3R1cmVfYXNfbSwgaW50IGFsZ29zd2FwID0gMTYpIHsKICAgTWF0cml4WGQgbSg0LCAzKTsKICAgaWYgKHN0cnVjdHVyZV9hc19tKSB7CiAgICAgLy8gVGhlIGZpcnN0IDMgcm93cyBhcmUgdGhlIHJlZHVjZWQgZm9ybSBvZiBNYXRyaXggMSBhcyBzaG93biBiZWxvdywgYW5kIGl0CiAgICAgLy8gaGFzIG5vbnplcm8gZWxlbWVudHMgaW4gdGhlIGZpcnN0IGNvbHVtbiBhbmQgZGlhZ29uYWxzIG9ubHkuCi0gICAgbSA8PCAxLjA1NjI5MywgMCwgMCwKLSAgICAgICAgIC0wLjMzNjQ2OCwgMC45MDczNTksIDAsCi0gICAgICAgICAtMS41NjYyNDUsIDAsIDAuMTQ5MTUwLAotICAgICAgICAgLTAuMSwgMCwgMDsKKyAgICBtIDw8IDEuMDU2MjkzLCAwLCAwLCAtMC4zMzY0NjgsIDAuOTA3MzU5LCAwLCAtMS41NjYyNDUsIDAsIDAuMTQ5MTUwLCAtMC4xLCAwLCAwOwogICB9IGVsc2UgewogICAgIC8vIE1hdHJpeCAxLgotICAgIG0gPDwgMC44ODIzMzYsIDE4LjM5MTQsIC0yNi43OTIxLAotICAgICAgICAgLTUuNTgxMzUsIDE3LjE5MzEsIC0yNC4wODkyLAotICAgICAgICAgLTIwLjc5NCwgOC42ODQ5NiwgLTQuODMxMDMsCi0gICAgICAgICAtOC40OTgxLCAtMTAuNTQ1MSwgMjMuOTA3MjsKKyAgICBtIDw8IDAuODgyMzM2LCAxOC4zOTE0LCAtMjYuNzkyMSwgLTUuNTgxMzUsIDE3LjE5MzEsIC0yNC4wODkyLCAtMjAuNzk0LCA4LjY4NDk2LCAtNC44MzEwMywgLTguNDk4MSwgLTEwLjU0NTEsCisgICAgICAgIDIzLjkwNzI7CiAgIH0KICAgY29tcGFyZV9iZGNfamFjb2JpKG0sIGFsZ29zd2FwLCBmYWxzZSk7CiB9CkBAIC04NCw4ICs3Nyw3IEBACiAgIHN2ZF92ZXJpZnlfY29uc3RydWN0b3Jfb3B0aW9uc19hc3NlcnQ8QkRDU1ZEPE1hdHJpeFR5cGU+PihpbnB1dCk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChiZGNzdmQpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoYmRjc3ZkKSB7CiAgIENBTExfU1VCVEVTVF8xKChiZGNzdmRfdmVyaWZ5X2Fzc2VydDxNYXRyaXgzZj4oKSkpOwogICBDQUxMX1NVQlRFU1RfMigoYmRjc3ZkX3ZlcmlmeV9hc3NlcnQ8TWF0cml4NGQ+KCkpKTsKICAgQ0FMTF9TVUJURVNUXzMoKGJkY3N2ZF92ZXJpZnlfYXNzZXJ0PE1hdHJpeDxmbG9hdCwgMTAsIDc+PigpKSk7CkBAIC05OCw4ICs5MCw3IEBACiAgIENBTExfU1VCVEVTVF85KChzdmRfYWxsX3RyaXZpYWxfMngyKGJkY3N2ZF9mdWxsX29wdGlvbnM8TWF0cml4MmQ+KSkpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIGludCByID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksCi0gICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRS8yKTsKKyAgICBpbnQgciA9IGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMiksIGMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDIpOwogCiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShyKQogICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUoYykKQEAgLTEzMCwxMCArMTIxLDE0IEBACiAgICAgQ0FMTF9TVUJURVNUXzMwKChiZGNzdmRfZnVsbF9vcHRpb25zPE1hdHJpeFhjZD4oTWF0cml4WGNkKHIsIGMpKSkpOwogICAgIENBTExfU1VCVEVTVF8zMSgoYmRjc3ZkX3RoaW5fb3B0aW9uczxNYXRyaXhYZD4oTWF0cml4WGQociwgYykpKSk7CiAgICAgQ0FMTF9TVUJURVNUXzMyKChiZGNzdmRfZnVsbF9vcHRpb25zPE1hdHJpeFhkPihNYXRyaXhYZChyLCBjKSkpKTsKLSAgICBDQUxMX1NVQlRFU1RfMzMoKGJkY3N2ZF90aGluX29wdGlvbnM8TWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+PihNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4oMjAsIDI3KSkpKTsKLSAgICBDQUxMX1NVQlRFU1RfMzQoKGJkY3N2ZF9mdWxsX29wdGlvbnM8TWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+PihNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4oMjAsIDI3KSkpKTsKLSAgICBDQUxMX1NVQlRFU1RfMzUoKGJkY3N2ZF90aGluX29wdGlvbnM8TWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+PihNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4oMjcsIDIwKSkpKTsKLSAgICBDQUxMX1NVQlRFU1RfMzYoKGJkY3N2ZF9mdWxsX29wdGlvbnM8TWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+PihNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4oMjcsIDIwKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMzMoKGJkY3N2ZF90aGluX29wdGlvbnM8TWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+PigKKyAgICAgICAgTWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+KDIwLCAyNykpKSk7CisgICAgQ0FMTF9TVUJURVNUXzM0KChiZGNzdmRfZnVsbF9vcHRpb25zPE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPj4oCisgICAgICAgIE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPigyMCwgMjcpKSkpOworICAgIENBTExfU1VCVEVTVF8zNSgoYmRjc3ZkX3RoaW5fb3B0aW9uczxNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4+KAorICAgICAgICBNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4oMjcsIDIwKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMzYoKGJkY3N2ZF9mdWxsX29wdGlvbnM8TWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+PigKKyAgICAgICAgTWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+KDI3LCAyMCkpKSk7CiAgICAgQ0FMTF9TVUJURVNUXzM3KCgKICAgICAgICAgc3ZkX2NoZWNrX21heF9zaXplX21hdHJpeDxNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIENvbE1ham9yLCAyMCwgMzU+LCBDb2xQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+KAogICAgICAgICAgICAgciwgYykpKTsKQEAgLTE0OSwyMyArMTQ0LDIzIEBACiAgIH0KIAogICAvLyB0ZXN0IG1hdHJpeGJhc2UgbWV0aG9kCi0gIENBTExfU1VCVEVTVF80MSgoIGJkY3N2ZF9tZXRob2Q8TWF0cml4MmNkPigpICkpOwotICBDQUxMX1NVQlRFU1RfNDIoKCBiZGNzdmRfbWV0aG9kPE1hdHJpeDNmPigpICkpOworICBDQUxMX1NVQlRFU1RfNDEoKGJkY3N2ZF9tZXRob2Q8TWF0cml4MmNkPigpKSk7CisgIENBTExfU1VCVEVTVF80MigoYmRjc3ZkX21ldGhvZDxNYXRyaXgzZj4oKSkpOwogCiAgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycwotICBDQUxMX1NVQlRFU1RfNDMoIEJEQ1NWRDxNYXRyaXhYZj4oMTAsMTApICk7CisgIENBTExfU1VCVEVTVF80MyhCRENTVkQ8TWF0cml4WGY+KDEwLCAxMCkpOwogCiAgIC8vIENoZWNrIHRoYXQgcHJlYWxsb2NhdGlvbiBhdm9pZHMgc3Vic2VxdWVudCBtYWxsb2NzCiAgIC8vIERpc2FibGVkIGJlY2F1c2Ugbm90IHN1cHBvcnRlZCBieSBCRENTVkQKICAgLy8gQ0FMTF9TVUJURVNUXzkoIHN2ZF9wcmVhbGxvY2F0ZTx2b2lkPigpICk7CiAKLSAgQ0FMTF9TVUJURVNUXzQ0KCBzdmRfdW5kZXJvdmVyZmxvdzx2b2lkPigpICk7CisgIENBTExfU1VCVEVTVF80NChzdmRfdW5kZXJvdmVyZmxvdzx2b2lkPigpKTsKIAogICAvLyBXaXRob3V0IHRvdGFsIGRlZmxhdGlvbiBpc3N1ZXMuCi0gIENBTExfU1VCVEVTVF80NSgoICBjb21wYXJlX2JkY19qYWNvYmlfaW5zdGFuY2UodHJ1ZSkgKSk7Ci0gIENBTExfU1VCVEVTVF80NigoICBjb21wYXJlX2JkY19qYWNvYmlfaW5zdGFuY2UoZmFsc2UpICkpOworICBDQUxMX1NVQlRFU1RfNDUoKGNvbXBhcmVfYmRjX2phY29iaV9pbnN0YW5jZSh0cnVlKSkpOworICBDQUxMX1NVQlRFU1RfNDYoKGNvbXBhcmVfYmRjX2phY29iaV9pbnN0YW5jZShmYWxzZSkpKTsKIAogICAvLyBXaXRoIHRvdGFsIGRlZmxhdGlvbiBpc3N1ZXMgYmVmb3JlLCB3aGVuIGl0IHNob3VsZG4ndCBiZSB0cmlnZ2VyZWQuCi0gIENBTExfU1VCVEVTVF80NygoICBjb21wYXJlX2JkY19qYWNvYmlfaW5zdGFuY2UodHJ1ZSwgMykgKSk7Ci0gIENBTExfU1VCVEVTVF80OCgoICBjb21wYXJlX2JkY19qYWNvYmlfaW5zdGFuY2UoZmFsc2UsIDMpICkpOworICBDQUxMX1NVQlRFU1RfNDcoKGNvbXBhcmVfYmRjX2phY29iaV9pbnN0YW5jZSh0cnVlLCAzKSkpOworICBDQUxMX1NVQlRFU1RfNDgoKGNvbXBhcmVfYmRjX2phY29iaV9pbnN0YW5jZShmYWxzZSwgMykpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvYmZsb2F0MTZfZmxvYXQuY3BwIGIvdGVzdC9iZmxvYXQxNl9mbG9hdC5jcHAKaW5kZXggNWNjNDRhYy4uOTIyYTZkMSAxMDA2NDQKLS0tIGEvdGVzdC9iZmxvYXQxNl9mbG9hdC5jcHAKKysrIGIvdGVzdC9iZmxvYXQxNl9mbG9hdC5jcHAKQEAgLTIxLDQ1ICsyMSwzNyBAQAogCiB1c2luZyBFaWdlbjo6YmZsb2F0MTY7CiAKLWZsb2F0IEJpbmFyeVRvRmxvYXQodWludDMyX3Qgc2lnbiwgdWludDMyX3QgZXhwb25lbnQsIHVpbnQzMl90IGhpZ2hfbWFudGlzc2EsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxvd19tYW50aXNzYSkgeworZmxvYXQgQmluYXJ5VG9GbG9hdCh1aW50MzJfdCBzaWduLCB1aW50MzJfdCBleHBvbmVudCwgdWludDMyX3QgaGlnaF9tYW50aXNzYSwgdWludDMyX3QgbG93X21hbnRpc3NhKSB7CiAgIGZsb2F0IGRlc3Q7CiAgIHVpbnQzMl90IHNyYyA9IChzaWduIDw8IDMxKSArIChleHBvbmVudCA8PCAyMykgKyAoaGlnaF9tYW50aXNzYSA8PCAxNikgKyBsb3dfbWFudGlzc2E7Ci0gIG1lbWNweShzdGF0aWNfY2FzdDx2b2lkKj4oJmRlc3QpLAotICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KCZzcmMpLCBzaXplb2YoZGVzdCkpOworICBtZW1jcHkoc3RhdGljX2Nhc3Q8dm9pZCo+KCZkZXN0KSwgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KCZzcmMpLCBzaXplb2YoZGVzdCkpOwogICByZXR1cm4gZGVzdDsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSB2b2lkIHRlc3Rfcm91bmR0cmlwKCkgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3Rfcm91bmR0cmlwKCkgewogICAvLyBSZXByZXNlbnRhYmxlIFQgcm91bmQgdHJpcCB2aWEgYmZsb2F0MTYKLSAgVkVSSUZZX0lTX0VRVUFMKChpbnRlcm5hbDo6Y2FzdDxiZmxvYXQxNixUPihpbnRlcm5hbDo6Y2FzdDxULGJmbG9hdDE2Pigtc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aW5maW5pdHkoKSkpKSwgLXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmluZmluaXR5KCkpOwotICBWRVJJRllfSVNfRVFVQUwoKGludGVybmFsOjpjYXN0PGJmbG9hdDE2LFQ+KGludGVybmFsOjpjYXN0PFQsYmZsb2F0MTY+KHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmluZmluaXR5KCkpKSksIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmluZmluaXR5KCkpOwotICBWRVJJRllfSVNfRVFVQUwoKGludGVybmFsOjpjYXN0PGJmbG9hdDE2LFQ+KGludGVybmFsOjpjYXN0PFQsYmZsb2F0MTY+KFQoLTEuMCkpKSksIFQoLTEuMCkpOwotICBWRVJJRllfSVNfRVFVQUwoKGludGVybmFsOjpjYXN0PGJmbG9hdDE2LFQ+KGludGVybmFsOjpjYXN0PFQsYmZsb2F0MTY+KFQoLTAuNSkpKSksIFQoLTAuNSkpOwotICBWRVJJRllfSVNfRVFVQUwoKGludGVybmFsOjpjYXN0PGJmbG9hdDE2LFQ+KGludGVybmFsOjpjYXN0PFQsYmZsb2F0MTY+KFQoLTAuMCkpKSksIFQoLTAuMCkpOwotICBWRVJJRllfSVNfRVFVQUwoKGludGVybmFsOjpjYXN0PGJmbG9hdDE2LFQ+KGludGVybmFsOjpjYXN0PFQsYmZsb2F0MTY+KFQoMS4wKSkpKSwgVCgxLjApKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChpbnRlcm5hbDo6Y2FzdDxiZmxvYXQxNixUPihpbnRlcm5hbDo6Y2FzdDxULGJmbG9hdDE2PihUKDAuNSkpKSksIFQoMC41KSk7Ci0gIFZFUklGWV9JU19FUVVBTCgoaW50ZXJuYWw6OmNhc3Q8YmZsb2F0MTYsVD4oaW50ZXJuYWw6OmNhc3Q8VCxiZmxvYXQxNj4oVCgwLjApKSkpLCBUKDAuMCkpOworICBWRVJJRllfSVNfRVFVQUwoKGludGVybmFsOjpjYXN0PGJmbG9hdDE2LCBUPihpbnRlcm5hbDo6Y2FzdDxULCBiZmxvYXQxNj4oLXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmluZmluaXR5KCkpKSksCisgICAgICAgICAgICAgICAgICAtc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aW5maW5pdHkoKSk7CisgIFZFUklGWV9JU19FUVVBTCgoaW50ZXJuYWw6OmNhc3Q8YmZsb2F0MTYsIFQ+KGludGVybmFsOjpjYXN0PFQsIGJmbG9hdDE2PihzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjppbmZpbml0eSgpKSkpLAorICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aW5maW5pdHkoKSk7CisgIFZFUklGWV9JU19FUVVBTCgoaW50ZXJuYWw6OmNhc3Q8YmZsb2F0MTYsIFQ+KGludGVybmFsOjpjYXN0PFQsIGJmbG9hdDE2PihUKC0xLjApKSkpLCBUKC0xLjApKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChpbnRlcm5hbDo6Y2FzdDxiZmxvYXQxNiwgVD4oaW50ZXJuYWw6OmNhc3Q8VCwgYmZsb2F0MTY+KFQoLTAuNSkpKSksIFQoLTAuNSkpOworICBWRVJJRllfSVNfRVFVQUwoKGludGVybmFsOjpjYXN0PGJmbG9hdDE2LCBUPihpbnRlcm5hbDo6Y2FzdDxULCBiZmxvYXQxNj4oVCgtMC4wKSkpKSwgVCgtMC4wKSk7CisgIFZFUklGWV9JU19FUVVBTCgoaW50ZXJuYWw6OmNhc3Q8YmZsb2F0MTYsIFQ+KGludGVybmFsOjpjYXN0PFQsIGJmbG9hdDE2PihUKDEuMCkpKSksIFQoMS4wKSk7CisgIFZFUklGWV9JU19FUVVBTCgoaW50ZXJuYWw6OmNhc3Q8YmZsb2F0MTYsIFQ+KGludGVybmFsOjpjYXN0PFQsIGJmbG9hdDE2PihUKDAuNSkpKSksIFQoMC41KSk7CisgIFZFUklGWV9JU19FUVVBTCgoaW50ZXJuYWw6OmNhc3Q8YmZsb2F0MTYsIFQ+KGludGVybmFsOjpjYXN0PFQsIGJmbG9hdDE2PihUKDAuMCkpKSksIFQoMC4wKSk7CiB9CiAKLXZvaWQgdGVzdF9jb252ZXJzaW9uKCkKLXsKK3ZvaWQgdGVzdF9jb252ZXJzaW9uKCkgewogICB1c2luZyBFaWdlbjo6YmZsb2F0MTZfaW1wbDo6X19iZmxvYXQxNl9yYXc7CiAKICAgLy8gUm91bmQtdHJpcCBjYXN0cwotICBWRVJJRllfSVNfRVFVQUwoCi0gICAgbnVtZXh0OjpiaXRfY2FzdDxiZmxvYXQxNj4obnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihiZmxvYXQxNigxLjBmKSkpLAotICAgIGJmbG9hdDE2KDEuMGYpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKAotICAgIG51bWV4dDo6Yml0X2Nhc3Q8YmZsb2F0MTY+KG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oYmZsb2F0MTYoMC41ZikpKSwKLSAgICBiZmxvYXQxNigwLjVmKSk7Ci0gIFZFUklGWV9JU19FUVVBTCgKLSAgICBudW1leHQ6OmJpdF9jYXN0PGJmbG9hdDE2PihudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KGJmbG9hdDE2KC0wLjMzMzMzZikpKSwKLSAgICBiZmxvYXQxNigtMC4zMzMzM2YpKTsKLSAgIFZFUklGWV9JU19FUVVBTCgKLSAgICBudW1leHQ6OmJpdF9jYXN0PGJmbG9hdDE2PihudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KGJmbG9hdDE2KDAuMGYpKSksCi0gICAgYmZsb2F0MTYoMC4wZikpOworICBWRVJJRllfSVNfRVFVQUwobnVtZXh0OjpiaXRfY2FzdDxiZmxvYXQxNj4obnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihiZmxvYXQxNigxLjBmKSkpLCBiZmxvYXQxNigxLjBmKSk7CisgIFZFUklGWV9JU19FUVVBTChudW1leHQ6OmJpdF9jYXN0PGJmbG9hdDE2PihudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KGJmbG9hdDE2KDAuNWYpKSksIGJmbG9hdDE2KDAuNWYpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG51bWV4dDo6Yml0X2Nhc3Q8YmZsb2F0MTY+KG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oYmZsb2F0MTYoLTAuMzMzMzNmKSkpLAorICAgICAgICAgICAgICAgICAgYmZsb2F0MTYoLTAuMzMzMzNmKSk7CisgIFZFUklGWV9JU19FUVVBTChudW1leHQ6OmJpdF9jYXN0PGJmbG9hdDE2PihudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KGJmbG9hdDE2KDAuMGYpKSksIGJmbG9hdDE2KDAuMGYpKTsKIAogICAvLyBDb252ZXJzaW9uIGZyb20gZmxvYXQuCiAgIFZFUklGWV9CRkxPQVQxNl9CSVRTX0VRVUFMKGJmbG9hdDE2KDEuMGYpLCAweDNmODApOwpAQCAtMTE4LDIzICsxMTAsMjMgQEAKICAgdGVzdF9yb3VuZHRyaXA8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpOwogCiAgIC8vIENvbnZlcnNpb24KLSAgQXJyYXk8ZmxvYXQsMSwxMDA+IGE7CisgIEFycmF5PGZsb2F0LCAxLCAxMDA+IGE7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGEoaSkgPSBpICsgMS4yNTsKLSAgQXJyYXk8YmZsb2F0MTYsMSwxMDA+IGIgPSBhLmNhc3Q8YmZsb2F0MTY+KCk7Ci0gIEFycmF5PGZsb2F0LDEsMTAwPiBjID0gYi5jYXN0PGZsb2F0PigpOworICBBcnJheTxiZmxvYXQxNiwgMSwgMTAwPiBiID0gYS5jYXN0PGJmbG9hdDE2PigpOworICBBcnJheTxmbG9hdCwgMSwgMTAwPiBjID0gYi5jYXN0PGZsb2F0PigpOwogICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7CiAgICAgVkVSSUZZX0xFKG51bWV4dDo6YWJzKGMoaSkgLSBhKGkpKSwgYShpKSAvIDEyOCk7CiAgIH0KIAogICAvLyBFcHNpbG9uCiAgIFZFUklGWV9MRSgxLjBmLCBzdGF0aWNfY2FzdDxmbG9hdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8YmZsb2F0MTY+OjplcHNpbG9uKSgpICsgYmZsb2F0MTYoMS4wZikpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKDEuMGYsIHN0YXRpY19jYXN0PGZsb2F0Pigoc3RkOjpudW1lcmljX2xpbWl0czxiZmxvYXQxNj46OmVwc2lsb24pKCkgLyBiZmxvYXQxNigyLjBmKSArIGJmbG9hdDE2KDEuMGYpKSk7CisgIFZFUklGWV9JU19FUVVBTCgxLjBmLAorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KChzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6ZXBzaWxvbikoKSAvIGJmbG9hdDE2KDIuMGYpICsgYmZsb2F0MTYoMS4wZikpKTsKIAogICAvLyBOZWdhdGUKICAgVkVSSUZZX0lTX0VRVUFMKHN0YXRpY19jYXN0PGZsb2F0PigtYmZsb2F0MTYoMy4wZikpLCAtMy4wZik7CiAgIFZFUklGWV9JU19FUVVBTChzdGF0aWNfY2FzdDxmbG9hdD4oLWJmbG9hdDE2KC00LjVmKSksIDQuNWYpOwogCi0KICNpZiAhRUlHRU5fQ09NUF9NU1ZDCiAgIC8vIFZpc3VhbCBTdHVkaW8gZXJyb3JzIG91dCBvbiBkaXZpc2lvbnMgYnkgMAogICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHN0YXRpY19jYXN0PGZsb2F0PihiZmxvYXQxNigwLjAgLyAwLjApKSkpOwpAQCAtMTY3LDQ2ICsxNTksNTEgQEAKICAgVkVSSUZZX0JGTE9BVDE2X0JJVFNfRVFVQUwoYmZsb2F0MTYoQmluYXJ5VG9GbG9hdCgweDEsIDB4ZmYsIDB4NDAsIDB4MCkpLCAweGZmYzApOwogfQogCi12b2lkIHRlc3RfbnVtdHJhaXRzKCkKLXsKLSAgc3RkOjpjb3V0IDw8ICJlcHNpbG9uICAgICAgID0gIiA8PCBOdW1UcmFpdHM8YmZsb2F0MTY+OjplcHNpbG9uKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KE51bVRyYWl0czxiZmxvYXQxNj46OmVwc2lsb24oKSkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKLSAgc3RkOjpjb3V0IDw8ICJoaWdoZXN0ICAgICAgID0gIiA8PCBOdW1UcmFpdHM8YmZsb2F0MTY+OjpoaWdoZXN0KCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KE51bVRyYWl0czxiZmxvYXQxNj46OmhpZ2hlc3QoKSkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKLSAgc3RkOjpjb3V0IDw8ICJsb3dlc3QgICAgICAgID0gIiA8PCBOdW1UcmFpdHM8YmZsb2F0MTY+Ojpsb3dlc3QoKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4IDw8IG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oTnVtVHJhaXRzPGJmbG9hdDE2Pjo6bG93ZXN0KCkpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCAibWluICAgICAgICAgICA9ICIgPDwgKHN0ZDo6bnVtZXJpY19saW1pdHM8YmZsb2F0MTY+OjptaW4pKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6bWluKSgpKSA8PCAiKSIgPDwgc3RkOjplbmRsOwotICBzdGQ6OmNvdXQgPDwgImRlbm9ybSBtaW4gICAgPSAiIDw8IChzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6ZGVub3JtX21pbikoKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4IDw8IG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8YmZsb2F0MTY+OjpkZW5vcm1fbWluKSgpKSA8PCAiKSIgPDwgc3RkOjplbmRsOwotICBzdGQ6OmNvdXQgPDwgImluZmluaXR5ICAgICAgPSAiIDw8IE51bVRyYWl0czxiZmxvYXQxNj46OmluZmluaXR5KCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KE51bVRyYWl0czxiZmxvYXQxNj46OmluZmluaXR5KCkpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCAicXVpZXQgbmFuICAgICA9ICIgPDwgTnVtVHJhaXRzPGJmbG9hdDE2Pjo6cXVpZXRfTmFOKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KE51bVRyYWl0czxiZmxvYXQxNj46OnF1aWV0X05hTigpKSA8PCAiKSIgPDwgc3RkOjplbmRsOwotICBzdGQ6OmNvdXQgPDwgInNpZ25hbGluZyBuYW4gPSAiIDw8IHN0ZDo6bnVtZXJpY19saW1pdHM8YmZsb2F0MTY+OjpzaWduYWxpbmdfTmFOKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8YmZsb2F0MTY+OjpzaWduYWxpbmdfTmFOKCkpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Cit2b2lkIHRlc3RfbnVtdHJhaXRzKCkgeworICBzdGQ6OmNvdXQgPDwgImVwc2lsb24gICAgICAgPSAiIDw8IE51bVRyYWl0czxiZmxvYXQxNj46OmVwc2lsb24oKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KE51bVRyYWl0czxiZmxvYXQxNj46OmVwc2lsb24oKSkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJoaWdoZXN0ICAgICAgID0gIiA8PCBOdW1UcmFpdHM8YmZsb2F0MTY+OjpoaWdoZXN0KCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgPDwgbnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihOdW1UcmFpdHM8YmZsb2F0MTY+OjpoaWdoZXN0KCkpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAibG93ZXN0ICAgICAgICA9ICIgPDwgTnVtVHJhaXRzPGJmbG9hdDE2Pjo6bG93ZXN0KCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgPDwgbnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihOdW1UcmFpdHM8YmZsb2F0MTY+Ojpsb3dlc3QoKSkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJtaW4gICAgICAgICAgID0gIiA8PCAoc3RkOjpudW1lcmljX2xpbWl0czxiZmxvYXQxNj46Om1pbikoKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6bWluKSgpKSA8PCAiKSIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgImRlbm9ybSBtaW4gICAgPSAiIDw8IChzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6ZGVub3JtX21pbikoKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6ZGVub3JtX21pbikoKSkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJpbmZpbml0eSAgICAgID0gIiA8PCBOdW1UcmFpdHM8YmZsb2F0MTY+OjppbmZpbml0eSgpIDw8ICIgICgweCIgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgIDw8IG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oTnVtVHJhaXRzPGJmbG9hdDE2Pjo6aW5maW5pdHkoKSkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJxdWlldCBuYW4gICAgID0gIiA8PCBOdW1UcmFpdHM8YmZsb2F0MTY+OjpxdWlldF9OYU4oKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KE51bVRyYWl0czxiZmxvYXQxNj46OnF1aWV0X05hTigpKSA8PCAiKSIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgInNpZ25hbGluZyBuYW4gPSAiIDw8IHN0ZDo6bnVtZXJpY19saW1pdHM8YmZsb2F0MTY+OjpzaWduYWxpbmdfTmFOKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgPDwgbnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6c2lnbmFsaW5nX05hTigpKSA8PCAiKSIgPDwgc3RkOjplbmRsOwogCiAgIFZFUklGWShOdW1UcmFpdHM8YmZsb2F0MTY+OjpJc1NpZ25lZCk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKAotICAgIG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oc3RkOjpudW1lcmljX2xpbWl0czxiZmxvYXQxNj46OmluZmluaXR5KCkpLAotICAgIG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oYmZsb2F0MTYoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpKSApOworICBWRVJJRllfSVNfRVFVQUwobnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6aW5maW5pdHkoKSksCisgICAgICAgICAgICAgICAgICBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KGJmbG9hdDE2KHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSkpOwogICAvLyBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYXN0aW5nIGEgMzItYml0IE5hTiB0byBiZmxvYXQxNiBoYXMgYSBwcmVjaXNlCiAgIC8vIGJpdCBwYXR0ZXJuLiAgV2UgdGVzdCB0aGF0IGl0IGlzIGluIGZhY3QgYSBOYU4sIHRoZW4gdGVzdCB0aGUgc2lnbmFsaW5nCiAgIC8vIGJpdCAobXNiIG9mIHNpZ25pZmljYW5kIGlzIDEgZm9yIHF1aWV0LCAwIGZvciBzaWduYWxpbmcpLgogICBjb25zdCBudW1leHQ6OnVpbnQxNl90IEJGTE9BVDE2X1FVSUVUX0JJVCA9IDB4MDA0MDsKLSAgVkVSSUZZKAotICAgIChudW1leHQ6OmlzbmFuKShzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6cXVpZXRfTmFOKCkpCi0gICAgJiYgKG51bWV4dDo6aXNuYW4pKGJmbG9hdDE2KHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKSkpCi0gICAgJiYgKChudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8YmZsb2F0MTY+OjpxdWlldF9OYU4oKSkgJiBCRkxPQVQxNl9RVUlFVF9CSVQpID4gMCkKLSAgICAmJiAoKG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oYmZsb2F0MTYoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpKSkgJiBCRkxPQVQxNl9RVUlFVF9CSVQpID4gMCkgKTsKKyAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6cXVpZXRfTmFOKCkpICYmCisgICAgICAgICAobnVtZXh0Ojppc25hbikoYmZsb2F0MTYoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpKSkgJiYKKyAgICAgICAgICgobnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6cXVpZXRfTmFOKCkpICYgQkZMT0FUMTZfUVVJRVRfQklUKSA+IDApICYmCisgICAgICAgICAoKG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oYmZsb2F0MTYoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpKSkgJiBCRkxPQVQxNl9RVUlFVF9CSVQpID4KKyAgICAgICAgICAwKSk7CiAgIC8vIEFmdGVyIGEgY2FzdCB0byBiZmxvYXQxNiwgYSBzaWduYWxpbmcgTmFOIG1heSBiZWNvbWUgbm9uLXNpZ25hbGluZy4gVGh1cywKICAgLy8gd2UgY2hlY2sgdGhhdCBib3RoIGFyZSBOYU4sIGFuZCB0aGF0IG9ubHkgdGhlIGBudW1lcmljX2xpbWl0c2AgdmVyc2lvbiBpcwogICAvLyBzaWduYWxpbmcuCiAgIFZFUklGWSgKLSAgICAobnVtZXh0Ojppc25hbikoc3RkOjpudW1lcmljX2xpbWl0czxiZmxvYXQxNj46OnNpZ25hbGluZ19OYU4oKSkKLSAgICAmJiAobnVtZXh0Ojppc25hbikoYmZsb2F0MTYoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnNpZ25hbGluZ19OYU4oKSkpCi0gICAgJiYgKChudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8YmZsb2F0MTY+OjpzaWduYWxpbmdfTmFOKCkpICYgQkZMT0FUMTZfUVVJRVRfQklUKSA9PSAwKSApOworICAgICAgKG51bWV4dDo6aXNuYW4pKHN0ZDo6bnVtZXJpY19saW1pdHM8YmZsb2F0MTY+OjpzaWduYWxpbmdfTmFOKCkpICYmCisgICAgICAobnVtZXh0Ojppc25hbikoYmZsb2F0MTYoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnNpZ25hbGluZ19OYU4oKSkpICYmCisgICAgICAoKG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oc3RkOjpudW1lcmljX2xpbWl0czxiZmxvYXQxNj46OnNpZ25hbGluZ19OYU4oKSkgJiBCRkxPQVQxNl9RVUlFVF9CSVQpID09IDApKTsKIAotICBWRVJJRlkoIChzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6bWluKSgpID4gYmZsb2F0MTYoMC5mKSApOwotICBWRVJJRlkoIChzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6ZGVub3JtX21pbikoKSA+IGJmbG9hdDE2KDAuZikgKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCAoc3RkOjpudW1lcmljX2xpbWl0czxiZmxvYXQxNj46OmRlbm9ybV9taW4pKCkvYmZsb2F0MTYoMiksIGJmbG9hdDE2KDAuZikgKTsKKyAgVkVSSUZZKChzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6bWluKSgpID4gYmZsb2F0MTYoMC5mKSk7CisgIFZFUklGWSgoc3RkOjpudW1lcmljX2xpbWl0czxiZmxvYXQxNj46OmRlbm9ybV9taW4pKCkgPiBiZmxvYXQxNigwLmYpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChzdGQ6Om51bWVyaWNfbGltaXRzPGJmbG9hdDE2Pjo6ZGVub3JtX21pbikoKSAvIGJmbG9hdDE2KDIpLCBiZmxvYXQxNigwLmYpKTsKIH0KIAotdm9pZCB0ZXN0X2FyaXRobWV0aWMoKQotewordm9pZCB0ZXN0X2FyaXRobWV0aWMoKSB7CiAgIFZFUklGWV9JU19FUVVBTChzdGF0aWNfY2FzdDxmbG9hdD4oYmZsb2F0MTYoMikgKyBiZmxvYXQxNigyKSksIDQuZik7CiAgIFZFUklGWV9JU19FUVVBTChzdGF0aWNfY2FzdDxmbG9hdD4oYmZsb2F0MTYoMikgKyBiZmxvYXQxNigtMikpLCAwLmYpOwogICBWRVJJRllfSVNfQVBQUk9YKHN0YXRpY19jYXN0PGZsb2F0PihiZmxvYXQxNigwLjMzMzMzZikgKyBiZmxvYXQxNigwLjY2NjY3ZikpLCAxLjBmKTsKQEAgLTIxNiw4ICsyMTMsNyBAQAogICBWRVJJRllfSVNfRVFVQUwoc3RhdGljX2Nhc3Q8ZmxvYXQ+KC1iZmxvYXQxNigtNDA5Ni4wZikpLCA0MDk2LjBmKTsKIH0KIAotdm9pZCB0ZXN0X2NvbXBhcmlzb24oKQotewordm9pZCB0ZXN0X2NvbXBhcmlzb24oKSB7CiAgIFZFUklGWShiZmxvYXQxNigxLjBmKSA+IGJmbG9hdDE2KDAuNWYpKTsKICAgVkVSSUZZKGJmbG9hdDE2KDAuNWYpIDwgYmZsb2F0MTYoMS4wZikpOwogICBWRVJJRlkoIShiZmxvYXQxNigxLjBmKSA8IGJmbG9hdDE2KDAuNWYpKSk7CkBAIC0yNTQsOCArMjUwLDcgQEAKICNlbmRpZgogfQogCi12b2lkIHRlc3RfYmFzaWNfZnVuY3Rpb25zKCkKLXsKK3ZvaWQgdGVzdF9iYXNpY19mdW5jdGlvbnMoKSB7CiAgIFZFUklGWV9JU19FUVVBTChzdGF0aWNfY2FzdDxmbG9hdD4obnVtZXh0OjphYnMoYmZsb2F0MTYoMy41ZikpKSwgMy41Zik7CiAgIFZFUklGWV9JU19FUVVBTChzdGF0aWNfY2FzdDxmbG9hdD4oYWJzKGJmbG9hdDE2KDMuNWYpKSksIDMuNWYpOwogICBWRVJJRllfSVNfRVFVQUwoc3RhdGljX2Nhc3Q8ZmxvYXQ+KG51bWV4dDo6YWJzKGJmbG9hdDE2KC0zLjVmKSkpLCAzLjVmKTsKQEAgLTMwMiw4ICsyOTcsNyBAQAogICBWRVJJRllfSVNfQVBQUk9YKHN0YXRpY19jYXN0PGZsb2F0Pihsb2cxcChiZmxvYXQxNigxMC4wZikpKSwgMi4zOTA2MjVmKTsKIH0KIAotdm9pZCB0ZXN0X3RyaWdvbm9tZXRyaWNfZnVuY3Rpb25zKCkKLXsKK3ZvaWQgdGVzdF90cmlnb25vbWV0cmljX2Z1bmN0aW9ucygpIHsKICAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OmNvcyhiZmxvYXQxNigwLjBmKSksIGJmbG9hdDE2KGNvc2YoMC4wZikpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChjb3MoYmZsb2F0MTYoMC4wZikpLCBiZmxvYXQxNihjb3NmKDAuMGYpKSk7CiAgIFZFUklGWV9JU19BUFBST1gobnVtZXh0Ojpjb3MoYmZsb2F0MTYoRUlHRU5fUEkpKSwgYmZsb2F0MTYoY29zZihFSUdFTl9QSSkpKTsKQEAgLTMxNCw4ICszMDgsOCBAQAogICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6c2luKGJmbG9hdDE2KDAuMGYpKSwgYmZsb2F0MTYoc2luZigwLjBmKSkpOwogICBWRVJJRllfSVNfQVBQUk9YKHNpbihiZmxvYXQxNigwLjBmKSksIGJmbG9hdDE2KHNpbmYoMC4wZikpKTsKICAgLy8gVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnNpbihiZmxvYXQxNihFSUdFTl9QSSkpLCBiZmxvYXQxNihzaW5mKEVJR0VOX1BJKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6c2luKGJmbG9hdDE2KEVJR0VOX1BJLzIpKSwgYmZsb2F0MTYoc2luZihFSUdFTl9QSS8yKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6c2luKGJmbG9hdDE2KDMqRUlHRU5fUEkvMikpLCBiZmxvYXQxNihzaW5mKDMqRUlHRU5fUEkvMikpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnNpbihiZmxvYXQxNihFSUdFTl9QSSAvIDIpKSwgYmZsb2F0MTYoc2luZihFSUdFTl9QSSAvIDIpKSk7CisgIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpzaW4oYmZsb2F0MTYoMyAqIEVJR0VOX1BJIC8gMikpLCBiZmxvYXQxNihzaW5mKDMgKiBFSUdFTl9QSSAvIDIpKSk7CiAgIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpzaW4oYmZsb2F0MTYoMy41ZikpLCBiZmxvYXQxNihzaW5mKDMuNWYpKSk7CiAKICAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnRhbihiZmxvYXQxNigwLjBmKSksIGJmbG9hdDE2KHRhbmYoMC4wZikpKTsKQEAgLTMyNiw0NSArMzIwLDQyIEBACiAgIFZFUklGWV9JU19BUFBST1gobnVtZXh0Ojp0YW4oYmZsb2F0MTYoMy41ZikpLCBiZmxvYXQxNih0YW5mKDMuNWYpKSk7CiB9CiAKLXZvaWQgdGVzdF9hcnJheSgpCi17Ci0gIHR5cGVkZWYgQXJyYXk8YmZsb2F0MTYsMSxEeW5hbWljPiBBcnJheVhoOwotICBJbmRleCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwxMCk7Ci0gIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHNpemUtMSk7Cit2b2lkIHRlc3RfYXJyYXkoKSB7CisgIHR5cGVkZWYgQXJyYXk8YmZsb2F0MTYsIDEsIER5bmFtaWM+IEFycmF5WGg7CisgIEluZGV4IHNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAxMCk7CisgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBzaXplIC0gMSk7CiAgIEFycmF5WGggYTEgPSBBcnJheVhoOjpSYW5kb20oc2l6ZSksIGEyID0gQXJyYXlYaDo6UmFuZG9tKHNpemUpOwotICBWRVJJRllfSVNfQVBQUk9YKCBhMSthMSwgYmZsb2F0MTYoMikqYTEgKTsKLSAgVkVSSUZZKCAoYTEuYWJzKCkgPj0gYmZsb2F0MTYoMCkpLmFsbCgpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIChhMSphMSkuc3FydCgpLCBhMS5hYnMoKSApOworICBWRVJJRllfSVNfQVBQUk9YKGExICsgYTEsIGJmbG9hdDE2KDIpICogYTEpOworICBWRVJJRlkoKGExLmFicygpID49IGJmbG9hdDE2KDApKS5hbGwoKSk7CisgIFZFUklGWV9JU19BUFBST1goKGExICogYTEpLnNxcnQoKSwgYTEuYWJzKCkpOwogCi0gIFZFUklGWSggKChhMS5taW4pKGEyKSA8PSAoYTEubWF4KShhMikpLmFsbCgpICk7CisgIFZFUklGWSgoKGExLm1pbikoYTIpIDw9IChhMS5tYXgpKGEyKSkuYWxsKCkpOwogICBhMShpKSA9IGJmbG9hdDE2KC0xMC4pOwotICBWRVJJRllfSVNfRVFVQUwoIGExLm1pbkNvZWZmKCksIGJmbG9hdDE2KC0xMC4pICk7CisgIFZFUklGWV9JU19FUVVBTChhMS5taW5Db2VmZigpLCBiZmxvYXQxNigtMTAuKSk7CiAgIGExKGkpID0gYmZsb2F0MTYoMTAuKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCBhMS5tYXhDb2VmZigpLCBiZmxvYXQxNigxMC4pICk7CisgIFZFUklGWV9JU19FUVVBTChhMS5tYXhDb2VmZigpLCBiZmxvYXQxNigxMC4pKTsKIAogICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKICAgc3MgPDwgYTE7CiB9CiAKLXZvaWQgdGVzdF9wcm9kdWN0KCkKLXsKLSAgdHlwZWRlZiBNYXRyaXg8YmZsb2F0MTYsRHluYW1pYyxEeW5hbWljPiBNYXRyaXhYaDsKLSAgSW5kZXggcm93cyAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOwotICBJbmRleCBjb2xzICA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSk7Ci0gIEluZGV4IGRlcHRoID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKTsKLSAgTWF0cml4WGggQWggPSBNYXRyaXhYaDo6UmFuZG9tKHJvd3MsZGVwdGgpOwotICBNYXRyaXhYaCBCaCA9IE1hdHJpeFhoOjpSYW5kb20oZGVwdGgsY29scyk7Ci0gIE1hdHJpeFhoIENoID0gTWF0cml4WGg6OlJhbmRvbShyb3dzLGNvbHMpOwordm9pZCB0ZXN0X3Byb2R1Y3QoKSB7CisgIHR5cGVkZWYgTWF0cml4PGJmbG9hdDE2LCBEeW5hbWljLCBEeW5hbWljPiBNYXRyaXhYaDsKKyAgSW5kZXggcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICBJbmRleCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgIEluZGV4IGRlcHRoID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgIE1hdHJpeFhoIEFoID0gTWF0cml4WGg6OlJhbmRvbShyb3dzLCBkZXB0aCk7CisgIE1hdHJpeFhoIEJoID0gTWF0cml4WGg6OlJhbmRvbShkZXB0aCwgY29scyk7CisgIE1hdHJpeFhoIENoID0gTWF0cml4WGg6OlJhbmRvbShyb3dzLCBjb2xzKTsKICAgTWF0cml4WGYgQWYgPSBBaC5jYXN0PGZsb2F0PigpOwogICBNYXRyaXhYZiBCZiA9IEJoLmNhc3Q8ZmxvYXQ+KCk7CiAgIE1hdHJpeFhmIENmID0gQ2guY2FzdDxmbG9hdD4oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChDaC5ub2FsaWFzKCkrPUFoKkJoLCAoQ2Yubm9hbGlhcygpKz1BZipCZikuY2FzdDxiZmxvYXQxNj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goQ2gubm9hbGlhcygpICs9IEFoICogQmgsIChDZi5ub2FsaWFzKCkgKz0gQWYgKiBCZikuY2FzdDxiZmxvYXQxNj4oKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChiZmxvYXQxNl9mbG9hdCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChiZmxvYXQxNl9mbG9hdCkgewogICBDQUxMX1NVQlRFU1QodGVzdF9udW10cmFpdHMoKSk7Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewogICAgIENBTExfU1VCVEVTVCh0ZXN0X2NvbnZlcnNpb24oKSk7CiAgICAgQ0FMTF9TVUJURVNUKHRlc3RfYXJpdGhtZXRpYygpKTsKICAgICBDQUxMX1NVQlRFU1QodGVzdF9jb21wYXJpc29uKCkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9iaWNnc3RhYi5jcHAgYi90ZXN0L2JpY2dzdGFiLmNwcAppbmRleCA1OWM0YjUwLi4zZjUzZTNlIDEwMDY0NAotLS0gYS90ZXN0L2JpY2dzdGFiLmNwcAorKysgYi90ZXN0L2JpY2dzdGFiLmNwcApAQCAtMTAsMjUgKzEwLDI0IEBACiAjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgogI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnM+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIElfPiB2b2lkIHRlc3RfYmljZ3N0YWJfVCgpCi17Ci0gIEJpQ0dTVEFCPFNwYXJzZU1hdHJpeDxULDAsSV8+LCBEaWFnb25hbFByZWNvbmRpdGlvbmVyPFQ+ID4gICAgIGJpY2dzdGFiX2NvbG1ham9yX2RpYWc7Ci0gIEJpQ0dTVEFCPFNwYXJzZU1hdHJpeDxULDAsSV8+LCBJZGVudGl0eVByZWNvbmRpdGlvbmVyICAgID4gICAgIGJpY2dzdGFiX2NvbG1ham9yX0k7Ci0gIEJpQ0dTVEFCPFNwYXJzZU1hdHJpeDxULDAsSV8+LCBJbmNvbXBsZXRlTFVUPFQsSV8+ID4gICAgICAgICAgICAgIGJpY2dzdGFiX2NvbG1ham9yX2lsdXQ7Ci0gIC8vQmlDR1NUQUI8U3BhcnNlTWF0cml4PFQ+LCBTU09SUHJlY29uZGl0aW9uZXI8VD4gPiAgICAgYmljZ3N0YWJfY29sbWFqb3Jfc3NvcjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJXz4KK3ZvaWQgdGVzdF9iaWNnc3RhYl9UKCkgeworICBCaUNHU1RBQjxTcGFyc2VNYXRyaXg8VCwgMCwgSV8+LCBEaWFnb25hbFByZWNvbmRpdGlvbmVyPFQ+ID4gYmljZ3N0YWJfY29sbWFqb3JfZGlhZzsKKyAgQmlDR1NUQUI8U3BhcnNlTWF0cml4PFQsIDAsIElfPiwgSWRlbnRpdHlQcmVjb25kaXRpb25lcj4gYmljZ3N0YWJfY29sbWFqb3JfSTsKKyAgQmlDR1NUQUI8U3BhcnNlTWF0cml4PFQsIDAsIElfPiwgSW5jb21wbGV0ZUxVVDxULCBJXz4gPiBiaWNnc3RhYl9jb2xtYWpvcl9pbHV0OworICAvLyBCaUNHU1RBQjxTcGFyc2VNYXRyaXg8VD4sIFNTT1JQcmVjb25kaXRpb25lcjxUPiA+ICAgICBiaWNnc3RhYl9jb2xtYWpvcl9zc29yOwogCi0gIGJpY2dzdGFiX2NvbG1ham9yX2RpYWcuc2V0VG9sZXJhbmNlKE51bVRyYWl0czxUPjo6ZXBzaWxvbigpKjQpOwotICBiaWNnc3RhYl9jb2xtYWpvcl9pbHV0LnNldFRvbGVyYW5jZShOdW1UcmFpdHM8VD46OmVwc2lsb24oKSo0KTsKLSAgCi0gIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGJpY2dzdGFiX2NvbG1ham9yX2RpYWcpICApOwotLy8gICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhiaWNnc3RhYl9jb2xtYWpvcl9JKSAgICAgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoYmljZ3N0YWJfY29sbWFqb3JfaWx1dCkgICAgICk7Ci0gIC8vQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoYmljZ3N0YWJfY29sbWFqb3Jfc3NvcikgICAgICk7CisgIGJpY2dzdGFiX2NvbG1ham9yX2RpYWcuc2V0VG9sZXJhbmNlKE51bVRyYWl0czxUPjo6ZXBzaWxvbigpICogNCk7CisgIGJpY2dzdGFiX2NvbG1ham9yX2lsdXQuc2V0VG9sZXJhbmNlKE51bVRyYWl0czxUPjo6ZXBzaWxvbigpICogNCk7CisKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhiaWNnc3RhYl9jb2xtYWpvcl9kaWFnKSk7CisgIC8vICAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoYmljZ3N0YWJfY29sbWFqb3JfSSkgICAgICk7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoYmljZ3N0YWJfY29sbWFqb3JfaWx1dCkpOworICAvLyBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhiaWNnc3RhYl9jb2xtYWpvcl9zc29yKSAgICAgKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGJpY2dzdGFiKQotewotICBDQUxMX1NVQlRFU1RfMSgodGVzdF9iaWNnc3RhYl9UPGRvdWJsZSxpbnQ+KCkpICk7CitFSUdFTl9ERUNMQVJFX1RFU1QoYmljZ3N0YWIpIHsKKyAgQ0FMTF9TVUJURVNUXzEoKHRlc3RfYmljZ3N0YWJfVDxkb3VibGUsIGludD4oKSkpOwogICBDQUxMX1NVQlRFU1RfMigodGVzdF9iaWNnc3RhYl9UPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBpbnQ+KCkpKTsKLSAgQ0FMTF9TVUJURVNUXzMoKHRlc3RfYmljZ3N0YWJfVDxkb3VibGUsbG9uZyBpbnQ+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoKHRlc3RfYmljZ3N0YWJfVDxkb3VibGUsIGxvbmcgaW50PigpKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2JsYXN1dGlsLmNwcCBiL3Rlc3QvYmxhc3V0aWwuY3BwCmluZGV4IDJmYzhiNjguLjE5OWI1NzEgMTAwNjQ0Ci0tLSBhL3Rlc3QvYmxhc3V0aWwuY3BwCisrKyBiL3Rlc3QvYmxhc3V0aWwuY3BwCkBAIC0xMywxOTMgKzEzLDE2NiBAQAogLy8gZm9yIHBhY2tldF90cmFpdHM8UGFja2V0Kj4KIC8vID0+IFRoZSBvbmx5IHdvcmthcm91bmQgd291bGQgYmUgdG8gd3JhcCBfbTEyOCBhbmQgdGhlIGxpa2VzCiAvLyAgICB3aXRoaW4gd3JhcHBlcnMuCi0jaWYgRUlHRU5fR05VQ19TVFJJQ1RfQVRfTEVBU1QoNiwwLDApCi0gICAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2lnbm9yZWQtYXR0cmlidXRlcyIKKyNpZiBFSUdFTl9HTlVDX1NUUklDVF9BVF9MRUFTVCg2LCAwLCAwKQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2lnbm9yZWQtYXR0cmlidXRlcyIKICNlbmRpZgogCi0jZGVmaW5lIEdFVChpLGopIChTdG9yYWdlT3JkZXIgPT0gUm93TWFqb3IgPyAoaSkqc3RyaWRlICsgKGopIDogKGkpICsgKGopKnN0cmlkZSkKLSNkZWZpbmUgU0NBVFRFUihpLGosaykgKFN0b3JhZ2VPcmRlciA9PSBSb3dNYWpvciA/ICgoaSkrKGspKSpzdHJpZGUgKyAoaikgOiAoaSkgKyAoKGopKyhrKSkqc3RyaWRlKQorI2RlZmluZSBHRVQoaSwgaikgKFN0b3JhZ2VPcmRlciA9PSBSb3dNYWpvciA/IChpKSAqIHN0cmlkZSArIChqKSA6IChpKSArIChqKSAqIHN0cmlkZSkKKyNkZWZpbmUgU0NBVFRFUihpLCBqLCBrKSAoU3RvcmFnZU9yZGVyID09IFJvd01ham9yID8gKChpKSArIChrKSkgKiBzdHJpZGUgKyAoaikgOiAoaSkgKyAoKGopICsgKGspKSAqIHN0cmlkZSkKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBQYWNrZXQ+Ci12b2lkIGNvbXBhcmUoY29uc3QgUGFja2V0JiBhLCBjb25zdCBQYWNrZXQmIGIpCi17Ci0gICAgaW50IHBrdHN6ID0gaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZTsKLSAgICBTY2FsYXIgKmJ1ZmZBID0gbmV3IFNjYWxhcltwa3Rzel07Ci0gICAgU2NhbGFyICpidWZmQiA9IG5ldyBTY2FsYXJbcGt0c3pdOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUGFja2V0Pgordm9pZCBjb21wYXJlKGNvbnN0IFBhY2tldCYgYSwgY29uc3QgUGFja2V0JiBiKSB7CisgIGludCBwa3RzeiA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU7CisgIFNjYWxhciogYnVmZkEgPSBuZXcgU2NhbGFyW3BrdHN6XTsKKyAgU2NhbGFyKiBidWZmQiA9IG5ldyBTY2FsYXJbcGt0c3pdOwogCi0gICAgaW50ZXJuYWw6OnBzdG9yZXU8U2NhbGFyLCBQYWNrZXQ+KGJ1ZmZBLCBhKTsKLSAgICBpbnRlcm5hbDo6cHN0b3JldTxTY2FsYXIsIFBhY2tldD4oYnVmZkIsIGIpOworICBpbnRlcm5hbDo6cHN0b3JldTxTY2FsYXIsIFBhY2tldD4oYnVmZkEsIGEpOworICBpbnRlcm5hbDo6cHN0b3JldTxTY2FsYXIsIFBhY2tldD4oYnVmZkIsIGIpOwogCi0gICAgZm9yKGludCBpID0gMDsgaSA8IHBrdHN6OyBpKyspCi0gICAgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwoYnVmZkFbaV0sIGJ1ZmZCW2ldKTsKLSAgICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGt0c3o7IGkrKykgeworICAgIFZFUklGWV9JU19FUVVBTChidWZmQVtpXSwgYnVmZkJbaV0pOworICB9CiAKLSAgICBkZWxldGVbXSBidWZmQTsKLSAgICBkZWxldGVbXSBidWZmQjsKKyAgZGVsZXRlW10gYnVmZkE7CisgIGRlbGV0ZVtdIGJ1ZmZCOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBTdG9yYWdlT3JkZXIsIGludCBuPgotc3RydWN0IFBhY2tldEJsb2NrU2V0Ci17Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBTdG9yYWdlT3JkZXIsIGludCBuPgorc3RydWN0IFBhY2tldEJsb2NrU2V0IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKIAotICAgIHZvaWQgc2V0UGFja2V0QmxvY2soaW50ZXJuYWw6OlBhY2tldEJsb2NrPFBhY2tldCxuPiYgYmxvY2ssIFNjYWxhciB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGZvcihpbnQgaWR4ID0gMDsgaWR4IDwgbjsgaWR4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJsb2NrLnBhY2tldFtpZHhdID0gaW50ZXJuYWw6OnBzZXQxPFBhY2tldD4odmFsdWUpOwotICAgICAgICB9CisgIHZvaWQgc2V0UGFja2V0QmxvY2soaW50ZXJuYWw6OlBhY2tldEJsb2NrPFBhY2tldCwgbj4mIGJsb2NrLCBTY2FsYXIgdmFsdWUpIHsKKyAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBuOyBpZHgrKykgeworICAgICAgYmxvY2sucGFja2V0W2lkeF0gPSBpbnRlcm5hbDo6cHNldDE8UGFja2V0Pih2YWx1ZSk7CiAgICAgfQorICB9CiAKLSAgICB2b2lkIGNvbXBhcmVQYWNrZXRCbG9jayhTY2FsYXIgKmRhdGEsIGludCBpLCBpbnQgaiwgaW50IHN0cmlkZSwgaW50ZXJuYWw6OlBhY2tldEJsb2NrPFBhY2tldCwgbj4mIGJsb2NrKQotICAgIHsKLSAgICAgICAgZm9yKGludCBpZHggPSAwOyBpZHggPCBuOyBpZHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgUGFja2V0IGxpbmUgPSBpbnRlcm5hbDo6cGxvYWR1PFBhY2tldD4oZGF0YSArIFNDQVRURVIoaSxqLGlkeCkpOwotICAgICAgICAgICAgY29tcGFyZTxTY2FsYXIsIFBhY2tldD4oYmxvY2sucGFja2V0W2lkeF0sIGxpbmUpOwotICAgICAgICB9CisgIHZvaWQgY29tcGFyZVBhY2tldEJsb2NrKFNjYWxhciogZGF0YSwgaW50IGksIGludCBqLCBpbnQgc3RyaWRlLCBpbnRlcm5hbDo6UGFja2V0QmxvY2s8UGFja2V0LCBuPiYgYmxvY2spIHsKKyAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBuOyBpZHgrKykgeworICAgICAgUGFja2V0IGxpbmUgPSBpbnRlcm5hbDo6cGxvYWR1PFBhY2tldD4oZGF0YSArIFNDQVRURVIoaSwgaiwgaWR4KSk7CisgICAgICBjb21wYXJlPFNjYWxhciwgUGFja2V0PihibG9jay5wYWNrZXRbaWR4XSwgbGluZSk7CiAgICAgfQorICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBTdG9yYWdlT3JkZXIsIGludCBCbG9ja1NpemU+Ci12b2lkIHJ1bl9iZG1wX3NwZWNfMSgpCi17Ci0gICAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc19kYXRhX21hcHBlcjxTY2FsYXIsIGludCwgU3RvcmFnZU9yZGVyPiBCbGFzRGF0YU1hcHBlcjsKLSAgICBpbnQgcGFja2V0U2l6ZSA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU7Ci0gICAgaW50IG1pblNpemUgPSBzdGQ6Om1heDxpbnQ+KHBhY2tldFNpemUsIEJsb2NrU2l6ZSk7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBTdG9yYWdlT3JkZXIsIGludCBCbG9ja1NpemU+Cit2b2lkIHJ1bl9iZG1wX3NwZWNfMSgpIHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6Ymxhc19kYXRhX21hcHBlcjxTY2FsYXIsIGludCwgU3RvcmFnZU9yZGVyPiBCbGFzRGF0YU1hcHBlcjsKKyAgaW50IHBhY2tldFNpemUgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplOworICBpbnQgbWluU2l6ZSA9IHN0ZDo6bWF4PGludD4ocGFja2V0U2l6ZSwgQmxvY2tTaXplKTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlIFBhY2tldDsKIAotICAgIGludCBzem0gPSBpbnRlcm5hbDo6cmFuZG9tPGludD4obWluU2l6ZSw1MDApLCBzem4gPSBpbnRlcm5hbDo6cmFuZG9tPGludD4obWluU2l6ZSw1MDApOwotICAgIGludCBzdHJpZGUgPSBTdG9yYWdlT3JkZXIgPT0gUm93TWFqb3IgPyBzem4gOiBzem07Ci0gICAgU2NhbGFyICpkID0gbmV3IFNjYWxhcltzem4qc3ptXTsKKyAgaW50IHN6bSA9IGludGVybmFsOjpyYW5kb208aW50PihtaW5TaXplLCA1MDApLCBzem4gPSBpbnRlcm5hbDo6cmFuZG9tPGludD4obWluU2l6ZSwgNTAwKTsKKyAgaW50IHN0cmlkZSA9IFN0b3JhZ2VPcmRlciA9PSBSb3dNYWpvciA/IHN6biA6IHN6bTsKKyAgU2NhbGFyKiBkID0gbmV3IFNjYWxhcltzem4gKiBzem1dOwogCi0gICAgLy8gSW5pdGlhbGl6aW5nIHdpdGggcmFuZG9tIGVudHJpZXMKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgc3ptKnN6bjsgaSsrKQotICAgIHsKLSAgICAgICAgZFtpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPihzdGF0aWNfY2FzdDxTY2FsYXI+KDMpLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDEwKSk7CisgIC8vIEluaXRpYWxpemluZyB3aXRoIHJhbmRvbSBlbnRyaWVzCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ptICogc3puOyBpKyspIHsKKyAgICBkW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KHN0YXRpY19jYXN0PFNjYWxhcj4oMyksIHN0YXRpY19jYXN0PFNjYWxhcj4oMTApKTsKKyAgfQorCisgIEJsYXNEYXRhTWFwcGVyIGJkbShkLCBzdHJpZGUpOworCisgIC8vIFRlc3Rpbmcgb3BlcmF0b3IoKQorICBmb3IgKGludCBpID0gMDsgaSA8IHN6bTsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzem47IGorKykgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKGRbR0VUKGksIGopXSwgYmRtKGksIGopKTsKICAgICB9CisgIH0KIAotICAgIEJsYXNEYXRhTWFwcGVyIGJkbShkLCBzdHJpZGUpOworICAvLyBUZXN0aW5nIGdldFN1Yk1hcHBlciBhbmQgZ2V0TGluZWFyTWFwcGVyCisgIGludCBpMCA9IGludGVybmFsOjpyYW5kb208aW50PigwLCBzem0gLSAyKTsKKyAgaW50IGowID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIHN6biAtIDIpOworICBmb3IgKGludCBpID0gaTA7IGkgPCBzem07IGkrKykgeworICAgIGZvciAoaW50IGogPSBqMDsgaiA8IHN6bjsgaisrKSB7CisgICAgICBjb25zdCBCbGFzRGF0YU1hcHBlciYgYmRtU00gPSBiZG0uZ2V0U3ViTWFwcGVyKGkwLCBqMCk7CisgICAgICBjb25zdCBpbnRlcm5hbDo6Qmxhc0xpbmVhck1hcHBlcjxTY2FsYXIsIGludCwgMD4mIGJkbUxNID0gYmRtLmdldExpbmVhck1hcHBlcihpMCwgajApOwogCi0gICAgLy8gVGVzdGluZyBvcGVyYXRvcigpCi0gICAgZm9yKGludCBpID0gMDsgaSA8IHN6bTsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IHN6bjsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoZFtHRVQoaSxqKV0sIGJkbShpLGopKTsKLSAgICAgICAgfQorICAgICAgU2NhbGFyIHYgPSBiZG1TTShpIC0gaTAsIGogLSBqMCk7CisgICAgICBTY2FsYXIgdmQgPSBkW0dFVChpLCBqKV07CisgICAgICBWRVJJRllfSVNfRVFVQUwodmQsIHYpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHZkLCBiZG1MTShHRVQoaSAtIGkwLCBqIC0gajApKSk7CiAgICAgfQorICB9CiAKLSAgICAvLyBUZXN0aW5nIGdldFN1Yk1hcHBlciBhbmQgZ2V0TGluZWFyTWFwcGVyCi0gICAgaW50IGkwID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsc3ptLTIpOwotICAgIGludCBqMCA9IGludGVybmFsOjpyYW5kb208aW50PigwLHN6bi0yKTsKLSAgICBmb3IoaW50IGkgPSBpMDsgaSA8IHN6bTsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yKGludCBqID0gajA7IGogPCBzem47IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgQmxhc0RhdGFNYXBwZXImIGJkbVNNID0gYmRtLmdldFN1Yk1hcHBlcihpMCxqMCk7Ci0gICAgICAgICAgICBjb25zdCBpbnRlcm5hbDo6Qmxhc0xpbmVhck1hcHBlcjxTY2FsYXIsIGludCwgMD4mIGJkbUxNID0gYmRtLmdldExpbmVhck1hcHBlcihpMCxqMCk7CisgIC8vIFRlc3RpbmcgbG9hZFBhY2tldAorICBmb3IgKGludCBpID0gMDsgaSA8IHN6bSAtIG1pblNpemU7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3puIC0gbWluU2l6ZTsgaisrKSB7CisgICAgICBQYWNrZXQgcGt0QkRNID0gYmRtLnRlbXBsYXRlIGxvYWRQYWNrZXQ8UGFja2V0PihpLCBqKTsKKyAgICAgIFBhY2tldCBwa3REID0gaW50ZXJuYWw6OnBsb2FkdTxQYWNrZXQ+KGQgKyBHRVQoaSwgaikpOwogCi0gICAgICAgICAgICBTY2FsYXIgdiA9IGJkbVNNKGkgLSBpMCwgaiAtIGowKTsKLSAgICAgICAgICAgIFNjYWxhciB2ZCA9IGRbR0VUKGksaildOwotICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHZkLCB2KTsKLSAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh2ZCwgYmRtTE0oR0VUKGktaTAsIGotajApKSk7Ci0gICAgICAgIH0KKyAgICAgIGNvbXBhcmU8U2NhbGFyLCBQYWNrZXQ+KHBrdEJETSwgcGt0RCk7CiAgICAgfQorICB9CiAKLSAgICAvLyBUZXN0aW5nIGxvYWRQYWNrZXQKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgc3ptIC0gbWluU2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IHN6biAtIG1pblNpemU7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgUGFja2V0IHBrdEJETSA9IGJkbS50ZW1wbGF0ZSBsb2FkUGFja2V0PFBhY2tldD4oaSxqKTsKLSAgICAgICAgICAgIFBhY2tldCBwa3REID0gaW50ZXJuYWw6OnBsb2FkdTxQYWNrZXQ+KGQgKyBHRVQoaSxqKSk7CisgIC8vIFRlc3RpbmcgZ2F0aGVyUGFja2V0CisgIFNjYWxhciogYnVmZiA9IG5ldyBTY2FsYXJbcGFja2V0U2l6ZV07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ptIC0gbWluU2l6ZTsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzem4gLSBtaW5TaXplOyBqKyspIHsKKyAgICAgIFBhY2tldCBwID0gYmRtLnRlbXBsYXRlIGdhdGhlclBhY2tldDxQYWNrZXQ+KGksIGopOworICAgICAgaW50ZXJuYWw6OnBzdG9yZXU8U2NhbGFyLCBQYWNrZXQ+KGJ1ZmYsIHApOwogCi0gICAgICAgICAgICBjb21wYXJlPFNjYWxhciwgUGFja2V0Pihwa3RCRE0sIHBrdEQpOwotICAgICAgICB9CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IHBhY2tldFNpemU7IGsrKykgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwoZFtTQ0FUVEVSKGksIGosIGspXSwgYnVmZltrXSk7CisgICAgICB9CiAgICAgfQorICB9CisgIGRlbGV0ZVtdIGJ1ZmY7CiAKLSAgICAvLyBUZXN0aW5nIGdhdGhlclBhY2tldAotICAgIFNjYWxhciAqYnVmZiA9IG5ldyBTY2FsYXJbcGFja2V0U2l6ZV07Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IHN6bSAtIG1pblNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBzem4gLSBtaW5TaXplOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhY2tldCBwID0gYmRtLnRlbXBsYXRlIGdhdGhlclBhY2tldDxQYWNrZXQ+KGksaik7Ci0gICAgICAgICAgICBpbnRlcm5hbDo6cHN0b3JldTxTY2FsYXIsIFBhY2tldD4oYnVmZiwgcCk7Ci0KLSAgICAgICAgICAgIGZvcihpbnQgayA9IDA7IGsgPCBwYWNrZXRTaXplOyBrKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGRbU0NBVFRFUihpLGosayldLCBidWZmW2tdKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9CisgIC8vIFRlc3Rpbmcgc2NhdHRlclBhY2tldAorICBmb3IgKGludCBpID0gMDsgaSA8IHN6bSAtIG1pblNpemU7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3puIC0gbWluU2l6ZTsgaisrKSB7CisgICAgICBQYWNrZXQgcCA9IGludGVybmFsOjpwc2V0MTxQYWNrZXQ+KHN0YXRpY19jYXN0PFNjYWxhcj4oMSkpOworICAgICAgYmRtLnRlbXBsYXRlIHNjYXR0ZXJQYWNrZXQ8UGFja2V0PihpLCBqLCBwKTsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcGFja2V0U2l6ZTsgaysrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChkW1NDQVRURVIoaSwgaiwgayldLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDEpKTsKKyAgICAgIH0KICAgICB9Ci0gICAgZGVsZXRlW10gYnVmZjsKKyAgfQogCi0gICAgLy8gVGVzdGluZyBzY2F0dGVyUGFja2V0Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IHN6bSAtIG1pblNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBzem4gLSBtaW5TaXplOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhY2tldCBwID0gaW50ZXJuYWw6OnBzZXQxPFBhY2tldD4oc3RhdGljX2Nhc3Q8U2NhbGFyPigxKSk7Ci0gICAgICAgICAgICBiZG0udGVtcGxhdGUgc2NhdHRlclBhY2tldDxQYWNrZXQ+KGksaixwKTsKLSAgICAgICAgICAgIGZvcihpbnQgayA9IDA7IGsgPCBwYWNrZXRTaXplOyBrKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGRbU0NBVFRFUihpLGosayldLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAvLyBUZXN0aW5nIHN0b3JlUGFja2V0QmxvY2sKKyAgaW50ZXJuYWw6OlBhY2tldEJsb2NrPFBhY2tldCwgQmxvY2tTaXplPiBibG9jazsKKworICBQYWNrZXRCbG9ja1NldDxTY2FsYXIsIFN0b3JhZ2VPcmRlciwgQmxvY2tTaXplPiBwYnM7CisgIHBicy5zZXRQYWNrZXRCbG9jayhibG9jaywgc3RhdGljX2Nhc3Q8U2NhbGFyPigyKSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzem0gLSBtaW5TaXplOyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHN6biAtIG1pblNpemU7IGorKykgeworICAgICAgYmRtLnRlbXBsYXRlIHN0b3JlUGFja2V0QmxvY2s8UGFja2V0LCBCbG9ja1NpemU+KGksIGosIGJsb2NrKTsKKworICAgICAgcGJzLmNvbXBhcmVQYWNrZXRCbG9jayhkLCBpLCBqLCBzdHJpZGUsIGJsb2NrKTsKICAgICB9CisgIH0KIAotICAgIC8vVGVzdGluZyBzdG9yZVBhY2tldEJsb2NrCi0gICAgaW50ZXJuYWw6OlBhY2tldEJsb2NrPFBhY2tldCwgQmxvY2tTaXplPiBibG9jazsKLQotICAgIFBhY2tldEJsb2NrU2V0PFNjYWxhciwgU3RvcmFnZU9yZGVyLCBCbG9ja1NpemU+IHBiczsKLSAgICBwYnMuc2V0UGFja2V0QmxvY2soYmxvY2ssIHN0YXRpY19jYXN0PFNjYWxhcj4oMikpOwotCi0gICAgZm9yKGludCBpID0gMDsgaSA8IHN6bSAtIG1pblNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBzem4gLSBtaW5TaXplOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJkbS50ZW1wbGF0ZSBzdG9yZVBhY2tldEJsb2NrPFBhY2tldCwgQmxvY2tTaXplPihpLCBqLCBibG9jayk7Ci0KLSAgICAgICAgICAgIHBicy5jb21wYXJlUGFja2V0QmxvY2soZCwgaSwgaiwgc3RyaWRlLCBibG9jayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWxldGVbXSBkOworICBkZWxldGVbXSBkOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIHJ1bl90ZXN0KCkKLXsKLSAgICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBSb3dNYWpvciwgMT4oKTsKLSAgICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBDb2xNYWpvciwgMT4oKTsKLSAgICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBSb3dNYWpvciwgMj4oKTsKLSAgICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBDb2xNYWpvciwgMj4oKTsKLSAgICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBSb3dNYWpvciwgND4oKTsKLSAgICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBDb2xNYWpvciwgND4oKTsKLSAgICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBSb3dNYWpvciwgOD4oKTsKLSAgICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBDb2xNYWpvciwgOD4oKTsKLSAgICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBSb3dNYWpvciwgMTY+KCk7Ci0gICAgcnVuX2JkbXBfc3BlY18xPFNjYWxhciwgQ29sTWFqb3IsIDE2PigpOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgcnVuX3Rlc3QoKSB7CisgIHJ1bl9iZG1wX3NwZWNfMTxTY2FsYXIsIFJvd01ham9yLCAxPigpOworICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBDb2xNYWpvciwgMT4oKTsKKyAgcnVuX2JkbXBfc3BlY18xPFNjYWxhciwgUm93TWFqb3IsIDI+KCk7CisgIHJ1bl9iZG1wX3NwZWNfMTxTY2FsYXIsIENvbE1ham9yLCAyPigpOworICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBSb3dNYWpvciwgND4oKTsKKyAgcnVuX2JkbXBfc3BlY18xPFNjYWxhciwgQ29sTWFqb3IsIDQ+KCk7CisgIHJ1bl9iZG1wX3NwZWNfMTxTY2FsYXIsIFJvd01ham9yLCA4PigpOworICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBDb2xNYWpvciwgOD4oKTsKKyAgcnVuX2JkbXBfc3BlY18xPFNjYWxhciwgUm93TWFqb3IsIDE2PigpOworICBydW5fYmRtcF9zcGVjXzE8U2NhbGFyLCBDb2xNYWpvciwgMTY+KCk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChibGFzdXRpbCkKLXsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykKLSAgICB7Ci0gICAgICAgIENBTExfU1VCVEVTVF8xKHJ1bl90ZXN0PG51bWV4dDo6aW50OF90PigpKTsKLSAgICAgICAgQ0FMTF9TVUJURVNUXzIocnVuX3Rlc3Q8bnVtZXh0OjppbnQxNl90PigpKTsKLSAgICAgICAgQ0FMTF9TVUJURVNUXzMocnVuX3Rlc3Q8bnVtZXh0OjppbnQzMl90PigpKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChibGFzdXRpbCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShydW5fdGVzdDxudW1leHQ6OmludDhfdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzIocnVuX3Rlc3Q8bnVtZXh0OjppbnQxNl90PigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhydW5fdGVzdDxudW1leHQ6OmludDMyX3Q+KCkpOwogCi0vLyBUT0RPOiBSZXBsYWNlIHRoaXMgYnkgYSBjYWxsIHRvIG51bWV4dDo6aW50NjRfdCBhcyBzb29uIGFzIHdlIGhhdmUgYSB3YXkgdG8KLS8vIGRldGVjdCB0aGUgdHlwZWRlZiBmb3IgaW50NjRfdCBvbiBhbGwgcGxhdGZvcm1zCi0gICAgICAgIENBTExfU1VCVEVTVF80KHJ1bl90ZXN0PHNpZ25lZCBsb25nIGxvbmc+KCkpOwotICAgICAgICBDQUxMX1NVQlRFU1RfNShydW5fdGVzdDxmbG9hdF90PigpKTsKLSAgICAgICAgQ0FMTF9TVUJURVNUXzYocnVuX3Rlc3Q8ZG91YmxlX3Q+KCkpOwotICAgICAgICBDQUxMX1NVQlRFU1RfNyhydW5fdGVzdDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7Ci0gICAgICAgIENBTExfU1VCVEVTVF84KHJ1bl90ZXN0PHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Ci0gICAgfQorICAgIC8vIFRPRE86IFJlcGxhY2UgdGhpcyBieSBhIGNhbGwgdG8gbnVtZXh0OjppbnQ2NF90IGFzIHNvb24gYXMgd2UgaGF2ZSBhIHdheSB0bworICAgIC8vIGRldGVjdCB0aGUgdHlwZWRlZiBmb3IgaW50NjRfdCBvbiBhbGwgcGxhdGZvcm1zCisgICAgQ0FMTF9TVUJURVNUXzQocnVuX3Rlc3Q8c2lnbmVkIGxvbmcgbG9uZz4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzUocnVuX3Rlc3Q8ZmxvYXRfdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzYocnVuX3Rlc3Q8ZG91YmxlX3Q+KCkpOworICAgIENBTExfU1VCVEVTVF83KHJ1bl90ZXN0PHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfOChydW5fdGVzdDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOworICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2Jsb2NrLmNwcCBiL3Rlc3QvYmxvY2suY3BwCmluZGV4IDg2N2I3NjkuLjlmOTY0OTggMTAwNjQ0Ci0tLSBhL3Rlc3QvYmxvY2suY3BwCisrKyBiL3Rlc3QvYmxvY2suY3BwCkBAIC05LDc4ICs5LDczIEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBTY2FsYXI+Ci1zdGQ6OmVuYWJsZV9pZl90PCFOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6SXNDb21wbGV4LHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj4KLWJsb2NrX3JlYWxfb25seShjb25zdCBNYXRyaXhUeXBlICZtMSwgSW5kZXggcjEsIEluZGV4IHIyLCBJbmRleCBjMSwgSW5kZXggYzIsIGNvbnN0IFNjYWxhciYgczEpIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgU2NhbGFyPgorc3RkOjplbmFibGVfaWZfdDwhTnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OklzQ29tcGxleCwgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPiBibG9ja19yZWFsX29ubHkoCisgICAgY29uc3QgTWF0cml4VHlwZSYgbTEsIEluZGV4IHIxLCBJbmRleCByMiwgSW5kZXggYzEsIEluZGV4IGMyLCBjb25zdCBTY2FsYXImIHMxKSB7CiAgIC8vIGNoZWNrIGN3aXNlLUZ1bmN0aW9uczoKICAgVkVSSUZZX0lTX0FQUFJPWChtMS5yb3cocjEpLmN3aXNlTWF4KHMxKSwgbTEuY3dpc2VNYXgoczEpLnJvdyhyMSkpOwogICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbChjMSkuY3dpc2VNaW4oczEpLCBtMS5jd2lzZU1pbihzMSkuY29sKGMxKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpLmN3aXNlTWluKHMxKSwgbTEuY3dpc2VNaW4oczEpLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkuY3dpc2VNYXgoczEpLCBtMS5jd2lzZU1heChzMSkuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKSk7Ci0gIAorICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKHIxLCBjMSwgcjIgLSByMSArIDEsIGMyIC0gYzEgKyAxKS5jd2lzZU1pbihzMSksCisgICAgICAgICAgICAgICAgICAgbTEuY3dpc2VNaW4oczEpLmJsb2NrKHIxLCBjMSwgcjIgLSByMSArIDEsIGMyIC0gYzEgKyAxKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2socjEsIGMxLCByMiAtIHIxICsgMSwgYzIgLSBjMSArIDEpLmN3aXNlTWF4KHMxKSwKKyAgICAgICAgICAgICAgICAgICBtMS5jd2lzZU1heChzMSkuYmxvY2socjEsIGMxLCByMiAtIHIxICsgMSwgYzIgLSBjMSArIDEpKTsKKwogICByZXR1cm4gU2NhbGFyKDApOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBJbmRleCwgdHlwZW5hbWUgU2NhbGFyPgotc3RkOjplbmFibGVfaWZfdDxOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6SXNDb21wbGV4LHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj4KLWJsb2NrX3JlYWxfb25seShjb25zdCBNYXRyaXhUeXBlICYsIEluZGV4LCBJbmRleCwgSW5kZXgsIEluZGV4LCBjb25zdCBTY2FsYXImKSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIFNjYWxhcj4KK3N0ZDo6ZW5hYmxlX2lmX3Q8TnVtVHJhaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcj46OklzQ29tcGxleCwgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPiBibG9ja19yZWFsX29ubHkoCisgICAgY29uc3QgTWF0cml4VHlwZSYsIEluZGV4LCBJbmRleCwgSW5kZXgsIEluZGV4LCBjb25zdCBTY2FsYXImKSB7CiAgIHJldHVybiBTY2FsYXIoMCk7CiB9CiAKIC8vIENoZWNrIGF0IGNvbXBpbGUtdGltZSB0aGF0IFQxPT1UMiwgYW5kIGF0IHJ1bnRpbWUtdGltZSB0aGF0IGE9PWIKLXRlbXBsYXRlPHR5cGVuYW1lIFQxLHR5cGVuYW1lIFQyPgotc3RkOjplbmFibGVfaWZfdDxpbnRlcm5hbDo6aXNfc2FtZTxUMSxUMj46OnZhbHVlLGJvb2w+Ci1pc19zYW1lX2Jsb2NrKGNvbnN0IFQxJiBhLCBjb25zdCBUMiYgYikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdGQ6OmVuYWJsZV9pZl90PGludGVybmFsOjppc19zYW1lPFQxLCBUMj46OnZhbHVlLCBib29sPiBpc19zYW1lX2Jsb2NrKGNvbnN0IFQxJiBhLCBjb25zdCBUMiYgYikgewogICByZXR1cm4gYS5pc0FwcHJveChiKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci1zdGQ6OmVuYWJsZV9pZl90PCgoTWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpPT0wKSx2b2lkPgotY2hlY2tfbGVmdF90b3AoY29uc3QgTWF0cml4VHlwZSYgbSwgSW5kZXggciwgSW5kZXggYywKLSAgICAgICAgICAgICAgIEluZGV4IHJvd3MsIEluZGV4IC8qdW51c2VkKi8pIHsKLSAgaWYoYyA+IDApIFZFUklGWV9JU19FUVVBTChtLmxlZnRDb2xzKGMpLmNvZWZmKHIrYypyb3dzKSwgbShyLGMpKTsKK3N0ZDo6ZW5hYmxlX2lmX3Q8KChNYXRyaXhUeXBlOjpGbGFncyAmIFJvd01ham9yQml0KSA9PSAwKSwgdm9pZD4gY2hlY2tfbGVmdF90b3AoY29uc3QgTWF0cml4VHlwZSYgbSwgSW5kZXggciwgSW5kZXggYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggcm93cywgSW5kZXggLyp1bnVzZWQqLykgeworICBpZiAoYyA+IDApIFZFUklGWV9JU19FUVVBTChtLmxlZnRDb2xzKGMpLmNvZWZmKHIgKyBjICogcm93cyksIG0ociwgYykpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXN0ZDo6ZW5hYmxlX2lmX3Q8KChNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdCkhPTApLHZvaWQ+Ci1jaGVja19sZWZ0X3RvcChjb25zdCBNYXRyaXhUeXBlJiBtLCAgSW5kZXggciwgSW5kZXggYywKLSAgICAgICAgICAgICAgIEluZGV4IC8qdW51c2VkKi8sIEluZGV4IGNvbHMpIHsKLSAgaWYociA+IDApIFZFUklGWV9JU19FUVVBTChtLnRvcFJvd3MocikuY29lZmYoYytyKmNvbHMpLCBtKHIsYykpOworc3RkOjplbmFibGVfaWZfdDwoKE1hdHJpeFR5cGU6OkZsYWdzICYgUm93TWFqb3JCaXQpICE9IDApLCB2b2lkPiBjaGVja19sZWZ0X3RvcChjb25zdCBNYXRyaXhUeXBlJiBtLCBJbmRleCByLCBJbmRleCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCAvKnVudXNlZCovLCBJbmRleCBjb2xzKSB7CisgIGlmIChyID4gMCkgVkVSSUZZX0lTX0VRVUFMKG0udG9wUm93cyhyKS5jb2VmZihjICsgciAqIGNvbHMpLCBtKHIsIGMpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBibG9jayhjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGJsb2NrKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gUm93VmVjdG9yVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBNYXRyaXhUeXBlOjpJc1Jvd01ham9yP1Jvd01ham9yOkNvbE1ham9yPiBEeW5hbWljTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBNYXRyaXhUeXBlOjpJc1Jvd01ham9yID8gUm93TWFqb3IgOiBDb2xNYWpvcj4gRHluYW1pY01hdHJpeFR5cGU7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gRHluYW1pY1ZlY3RvclR5cGU7Ci0gIAorCiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwogCi0gIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTFfY29weSA9IG0xLAotICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAorICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMV9jb3B5ID0gbTEsIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKSwKICAgICAgICAgICAgICBvbmVzID0gTWF0cml4VHlwZTo6T25lcyhyb3dzLCBjb2xzKTsKICAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKIAogICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKIAotICBJbmRleCByMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0xKTsKLSAgSW5kZXggcjIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihyMSxyb3dzLTEpOwotICBJbmRleCBjMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsY29scy0xKTsKLSAgSW5kZXggYzIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihjMSxjb2xzLTEpOworICBJbmRleCByMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAxKTsKKyAgSW5kZXggcjIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihyMSwgcm93cyAtIDEpOworICBJbmRleCBjMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAxKTsKKyAgSW5kZXggYzIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihjMSwgY29scyAtIDEpOwogCiAgIGJsb2NrX3JlYWxfb25seShtMSwgcjEsIHIyLCBjMSwgYzEsIHMxKTsKIAotICAvL2NoZWNrIHJvdygpIGFuZCBjb2woKQorICAvLyBjaGVjayByb3coKSBhbmQgY29sKCkKICAgVkVSSUZZX0lTX0VRVUFMKG0xLmNvbChjMSkudHJhbnNwb3NlKCksIG0xLnRyYW5zcG9zZSgpLnJvdyhjMSkpOwotICAvL2NoZWNrIG9wZXJhdG9yKCksIGJvdGggY29uc3RhbnQgYW5kIG5vbi1jb25zdGFudCwgb24gcm93KCkgYW5kIGNvbCgpCisgIC8vIGNoZWNrIG9wZXJhdG9yKCksIGJvdGggY29uc3RhbnQgYW5kIG5vbi1jb25zdGFudCwgb24gcm93KCkgYW5kIGNvbCgpCiAgIG0xID0gbTFfY29weTsKICAgbTEucm93KHIxKSArPSBzMSAqIG0xX2NvcHkucm93KHIyKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMS5yb3cocjEpLCBtMV9jb3B5LnJvdyhyMSkgKyBzMSAqIG0xX2NvcHkucm93KHIyKSk7CkBAIC05Myw1OSArODgsNjIgQEAKICAgbTEuY29sKGMxKS5jb2woMCkgKz0gczEgKiBtMV9jb3B5LmNvbChjMik7CiAgIFZFUklGWV9JU19BUFBST1gobTEuY29sKGMxKSwgbTFfY29weS5jb2woYzEpICsgU2NhbGFyKDIpICogczEgKiBtMV9jb3B5LmNvbChjMikpOwogCi0gIGNoZWNrX2xlZnRfdG9wKG0xLHIxLGMxLHJvd3MsY29scyk7Ci0gIAotICAvL2NoZWNrIGJsb2NrKCkKLSAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGIxKDEsMSk7IGIxKDAsMCkgPSBtMShyMSxjMSk7CisgIGNoZWNrX2xlZnRfdG9wKG0xLCByMSwgYzEsIHJvd3MsIGNvbHMpOwogCi0gIFJvd1ZlY3RvclR5cGUgYnIxKG0xLmJsb2NrKHIxLDAsMSxjb2xzKSk7Ci0gIFZlY3RvclR5cGUgYmMxKG0xLmJsb2NrKDAsYzEscm93cywxKSk7Ci0gIFZFUklGWV9JU19FUVVBTChiMSwgbTEuYmxvY2socjEsYzEsMSwxKSk7CisgIC8vIGNoZWNrIGJsb2NrKCkKKyAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gYjEoMSwgMSk7CisgIGIxKDAsIDApID0gbTEocjEsIGMxKTsKKworICBSb3dWZWN0b3JUeXBlIGJyMShtMS5ibG9jayhyMSwgMCwgMSwgY29scykpOworICBWZWN0b3JUeXBlIGJjMShtMS5ibG9jaygwLCBjMSwgcm93cywgMSkpOworICBWRVJJRllfSVNfRVFVQUwoYjEsIG0xLmJsb2NrKHIxLCBjMSwgMSwgMSkpOwogICBWRVJJRllfSVNfRVFVQUwobTEucm93KHIxKSwgYnIxKTsKICAgVkVSSUZZX0lTX0VRVUFMKG0xLmNvbChjMSksIGJjMSk7Ci0gIC8vY2hlY2sgb3BlcmF0b3IoKSwgYm90aCBjb25zdGFudCBhbmQgbm9uLWNvbnN0YW50LCBvbiBibG9jaygpCi0gIG0xLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkgPSBzMSAqIG0yLmJsb2NrKDAsIDAsIHIyLXIxKzEsYzItYzErMSk7Ci0gIG0xLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkocjItcjEsYzItYzEpID0gbTIuYmxvY2soMCwgMCwgcjItcjErMSxjMi1jMSsxKSgwLDApOworICAvLyBjaGVjayBvcGVyYXRvcigpLCBib3RoIGNvbnN0YW50IGFuZCBub24tY29uc3RhbnQsIG9uIGJsb2NrKCkKKyAgbTEuYmxvY2socjEsIGMxLCByMiAtIHIxICsgMSwgYzIgLSBjMSArIDEpID0gczEgKiBtMi5ibG9jaygwLCAwLCByMiAtIHIxICsgMSwgYzIgLSBjMSArIDEpOworICBtMS5ibG9jayhyMSwgYzEsIHIyIC0gcjEgKyAxLCBjMiAtIGMxICsgMSkocjIgLSByMSwgYzIgLSBjMSkgPSBtMi5ibG9jaygwLCAwLCByMiAtIHIxICsgMSwgYzIgLSBjMSArIDEpKDAsIDApOwogCiAgIGNvbnN0IEluZGV4IEJsb2NrUm93cyA9IDI7CiAgIGNvbnN0IEluZGV4IEJsb2NrQ29scyA9IDU7CiAKLSAgaWYgKHJvd3M+PTUgJiYgY29scz49OCkKLSAgeworICBpZiAocm93cyA+PSA1ICYmIGNvbHMgPj0gOCkgewogICAgIC8vIHRlc3QgZml4ZWQgYmxvY2soKSBhcyBsdmFsdWUKLSAgICBtMS50ZW1wbGF0ZSBibG9jazxCbG9ja1Jvd3MsQmxvY2tDb2xzPigxLDEpICo9IHMxOworICAgIG0xLnRlbXBsYXRlIGJsb2NrPEJsb2NrUm93cywgQmxvY2tDb2xzPigxLCAxKSAqPSBzMTsKICAgICAvLyB0ZXN0IG9wZXJhdG9yKCkgb24gZml4ZWQgYmxvY2soKSBib3RoIGFzIGNvbnN0YW50IGFuZCBub24tY29uc3RhbnQKLSAgICBtMS50ZW1wbGF0ZSBibG9jazxCbG9ja1Jvd3MsQmxvY2tDb2xzPigxLDEpKDAsIDMpID0gbTEudGVtcGxhdGUgYmxvY2s8Miw1PigxLDEpKDEsMik7CisgICAgbTEudGVtcGxhdGUgYmxvY2s8QmxvY2tSb3dzLCBCbG9ja0NvbHM+KDEsIDEpKDAsIDMpID0gbTEudGVtcGxhdGUgYmxvY2s8MiwgNT4oMSwgMSkoMSwgMik7CiAgICAgLy8gY2hlY2sgdGhhdCBmaXhlZCBibG9jaygpIGFuZCBibG9jaygpIGFncmVlCi0gICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGIgPSBtMS50ZW1wbGF0ZSBibG9jazxCbG9ja1Jvd3MsQmxvY2tDb2xzPigzLDMpOwotICAgIFZFUklGWV9JU19FUVVBTChiLCBtMS5ibG9jaygzLDMsQmxvY2tSb3dzLEJsb2NrQ29scykpOworICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IGIgPSBtMS50ZW1wbGF0ZSBibG9jazxCbG9ja1Jvd3MsIEJsb2NrQ29scz4oMywgMyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGIsIG0xLmJsb2NrKDMsIDMsIEJsb2NrUm93cywgQmxvY2tDb2xzKSk7CiAKICAgICAvLyBzYW1lIHRlc3RzIHdpdGggbWl4ZWQgZml4ZWQvZHluYW1pYyBzaXplCi0gICAgbTEudGVtcGxhdGUgYmxvY2s8QmxvY2tSb3dzLER5bmFtaWM+KDEsMSxCbG9ja1Jvd3MsQmxvY2tDb2xzKSAqPSBzMTsKLSAgICBtMS50ZW1wbGF0ZSBibG9jazxCbG9ja1Jvd3MsRHluYW1pYz4oMSwxLEJsb2NrUm93cyxCbG9ja0NvbHMpKDAsMykgPSBtMS50ZW1wbGF0ZSBibG9jazwyLDU+KDEsMSkoMSwyKTsKLSAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gYjIgPSBtMS50ZW1wbGF0ZSBibG9jazxEeW5hbWljLEJsb2NrQ29scz4oMywzLDIsNSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKGIyLCBtMS5ibG9jaygzLDMsQmxvY2tSb3dzLEJsb2NrQ29scykpOworICAgIG0xLnRlbXBsYXRlIGJsb2NrPEJsb2NrUm93cywgRHluYW1pYz4oMSwgMSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMpICo9IHMxOworICAgIG0xLnRlbXBsYXRlIGJsb2NrPEJsb2NrUm93cywgRHluYW1pYz4oMSwgMSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMpKDAsIDMpID0gbTEudGVtcGxhdGUgYmxvY2s8MiwgNT4oMSwgMSkoMSwgMik7CisgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gYjIgPSBtMS50ZW1wbGF0ZSBibG9jazxEeW5hbWljLCBCbG9ja0NvbHM+KDMsIDMsIDIsIDUpOworICAgIFZFUklGWV9JU19FUVVBTChiMiwgbTEuYmxvY2soMywgMywgQmxvY2tSb3dzLCBCbG9ja0NvbHMpKTsKIAotICAgIFZFUklGWShpc19zYW1lX2Jsb2NrKG0xLmJsb2NrKDMsMyxCbG9ja1Jvd3MsQmxvY2tDb2xzKSwgbTEuYmxvY2soMywzLGZpeDxEeW5hbWljPihCbG9ja1Jvd3MpLGZpeDxEeW5hbWljPihCbG9ja0NvbHMpKSkpOwotICAgIFZFUklGWShpc19zYW1lX2Jsb2NrKG0xLnRlbXBsYXRlIGJsb2NrPEJsb2NrUm93cyxEeW5hbWljPigxLDEsQmxvY2tSb3dzLEJsb2NrQ29scyksIG0xLmJsb2NrKDEsMSxmaXg8QmxvY2tSb3dzPixCbG9ja0NvbHMpKSk7Ci0gICAgVkVSSUZZKGlzX3NhbWVfYmxvY2sobTEudGVtcGxhdGUgYmxvY2s8QmxvY2tSb3dzLEJsb2NrQ29scz4oMSwxLEJsb2NrUm93cyxCbG9ja0NvbHMpLCBtMS5ibG9jaygxLDEsZml4PEJsb2NrUm93cz4oKSxmaXg8QmxvY2tDb2xzPikpKTsKLSAgICBWRVJJRlkoaXNfc2FtZV9ibG9jayhtMS50ZW1wbGF0ZSBibG9jazxCbG9ja1Jvd3MsQmxvY2tDb2xzPigxLDEsQmxvY2tSb3dzLEJsb2NrQ29scyksIG0xLmJsb2NrKDEsMSxmaXg8QmxvY2tSb3dzPixmaXg8QmxvY2tDb2xzPihCbG9ja0NvbHMpKSkpOworICAgIFZFUklGWShpc19zYW1lX2Jsb2NrKG0xLmJsb2NrKDMsIDMsIEJsb2NrUm93cywgQmxvY2tDb2xzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtMS5ibG9jaygzLCAzLCBmaXg8RHluYW1pYz4oQmxvY2tSb3dzKSwgZml4PER5bmFtaWM+KEJsb2NrQ29scykpKSk7CisgICAgVkVSSUZZKGlzX3NhbWVfYmxvY2sobTEudGVtcGxhdGUgYmxvY2s8QmxvY2tSb3dzLCBEeW5hbWljPigxLCAxLCBCbG9ja1Jvd3MsIEJsb2NrQ29scyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbTEuYmxvY2soMSwgMSwgZml4PEJsb2NrUm93cz4sIEJsb2NrQ29scykpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9ibG9jayhtMS50ZW1wbGF0ZSBibG9jazxCbG9ja1Jvd3MsIEJsb2NrQ29scz4oMSwgMSwgQmxvY2tSb3dzLCBCbG9ja0NvbHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG0xLmJsb2NrKDEsIDEsIGZpeDxCbG9ja1Jvd3M+KCksIGZpeDxCbG9ja0NvbHM+KSkpOworICAgIFZFUklGWShpc19zYW1lX2Jsb2NrKG0xLnRlbXBsYXRlIGJsb2NrPEJsb2NrUm93cywgQmxvY2tDb2xzPigxLCAxLCBCbG9ja1Jvd3MsIEJsb2NrQ29scyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbTEuYmxvY2soMSwgMSwgZml4PEJsb2NrUm93cz4sIGZpeDxCbG9ja0NvbHM+KEJsb2NrQ29scykpKSk7CiAgIH0KIAotICBpZiAocm93cz4yKQotICB7CisgIGlmIChyb3dzID4gMikgewogICAgIC8vIHRlc3Qgc3ViIHZlY3RvcnMKLSAgICBWRVJJRllfSVNfRVFVQUwodjEudGVtcGxhdGUgaGVhZDwyPigpLCB2MS5ibG9jaygwLDAsMiwxKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHYxLnRlbXBsYXRlIGhlYWQ8Mj4oKSwgdjEuYmxvY2soMCwgMCwgMiwgMSkpOwogICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSBoZWFkPDI+KCksIHYxLmhlYWQoMikpOwotICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSBoZWFkPDI+KCksIHYxLnNlZ21lbnQoMCwyKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHYxLnRlbXBsYXRlIGhlYWQ8Mj4oKSwgdjEuc2VnbWVudCgwLCAyKSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHYxLnRlbXBsYXRlIGhlYWQ8Mj4oKSwgdjEudGVtcGxhdGUgc2VnbWVudDwyPigwKSk7Ci0gICAgSW5kZXggaSA9IHJvd3MtMjsKLSAgICBWRVJJRllfSVNfRVFVQUwodjEudGVtcGxhdGUgdGFpbDwyPigpLCB2MS5ibG9jayhpLDAsMiwxKSk7CisgICAgSW5kZXggaSA9IHJvd3MgLSAyOworICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSB0YWlsPDI+KCksIHYxLmJsb2NrKGksIDAsIDIsIDEpKTsKICAgICBWRVJJRllfSVNfRVFVQUwodjEudGVtcGxhdGUgdGFpbDwyPigpLCB2MS50YWlsKDIpKTsKLSAgICBWRVJJRllfSVNfRVFVQUwodjEudGVtcGxhdGUgdGFpbDwyPigpLCB2MS5zZWdtZW50KGksMikpOworICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSB0YWlsPDI+KCksIHYxLnNlZ21lbnQoaSwgMikpOwogICAgIFZFUklGWV9JU19FUVVBTCh2MS50ZW1wbGF0ZSB0YWlsPDI+KCksIHYxLnRlbXBsYXRlIHNlZ21lbnQ8Mj4oaSkpOwotICAgIGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMik7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHYxLnNlZ21lbnQoaSwyKSwgdjEudGVtcGxhdGUgc2VnbWVudDwyPihpKSk7CisgICAgaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAyKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodjEuc2VnbWVudChpLCAyKSwgdjEudGVtcGxhdGUgc2VnbWVudDwyPihpKSk7CiAgIH0KIAogICAvLyBzdHJlc3Mgc29tZSBiYXNpYyBzdHVmZnMgd2l0aCBibG9jayBtYXRyaWNlcwpAQCAtMTU0LDk4ICsxNTIsMTA3IEBACiAKICAgVkVSSUZZX0lTX0VRVUFMKG51bWV4dDo6cmVhbChvbmVzLmNvbChjMSkuZG90KG9uZXMuY29sKGMyKSkpLCBSZWFsU2NhbGFyKHJvd3MpKTsKICAgVkVSSUZZX0lTX0VRVUFMKG51bWV4dDo6cmVhbChvbmVzLnJvdyhyMSkuZG90KG9uZXMucm93KHIyKSkpLCBSZWFsU2NhbGFyKGNvbHMpKTsKLSAgCisKICAgLy8gY2hlY2sgdGhhdCBsaW5lYXIgYWNjY2Vzc29ycyB3b3JrcyBvbiBibG9ja3MKICAgbTEgPSBtMV9jb3B5OwogCiAgIC8vIG5vdyB0ZXN0IHNvbWUgYmxvY2staW5zaWRlLW9mLWJsb2NrLgotICAKKwogICAvLyBleHByZXNzaW9ucyB3aXRoIGRpcmVjdCBhY2Nlc3MKLSAgVkVSSUZZX0lTX0VRVUFMKCAobTEuYmxvY2socjEsYzEscm93cy1yMSxjb2xzLWMxKS5ibG9jayhyMi1yMSxjMi1jMSxyb3dzLXIyLGNvbHMtYzIpKSAsIChtMS5ibG9jayhyMixjMixyb3dzLXIyLGNvbHMtYzIpKSApOwotICBWRVJJRllfSVNfRVFVQUwoIChtMS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpLnJvdygwKSkgLCAobTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpKSApOwotICBWRVJJRllfSVNfRVFVQUwoIChtMS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpLmNvbCgwKSkgLCAobTEuY29sKGMxKS5zZWdtZW50KHIxLHIyLXIxKzEpKSApOwotICBWRVJJRllfSVNfRVFVQUwoIChtMS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpLnRyYW5zcG9zZSgpLmNvbCgwKSkgLCAobTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpKS50cmFuc3Bvc2UoKSApOwotICBWRVJJRllfSVNfRVFVQUwoIChtMS50cmFuc3Bvc2UoKS5ibG9jayhjMSxyMSxjMi1jMSsxLHIyLXIxKzEpLmNvbCgwKSkgLCAobTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpKS50cmFuc3Bvc2UoKSApOworICBWRVJJRllfSVNfRVFVQUwoKG0xLmJsb2NrKHIxLCBjMSwgcm93cyAtIHIxLCBjb2xzIC0gYzEpLmJsb2NrKHIyIC0gcjEsIGMyIC0gYzEsIHJvd3MgLSByMiwgY29scyAtIGMyKSksCisgICAgICAgICAgICAgICAgICAobTEuYmxvY2socjIsIGMyLCByb3dzIC0gcjIsIGNvbHMgLSBjMikpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtMS5ibG9jayhyMSwgYzEsIHIyIC0gcjEgKyAxLCBjMiAtIGMxICsgMSkucm93KDApKSwgKG0xLnJvdyhyMSkuc2VnbWVudChjMSwgYzIgLSBjMSArIDEpKSk7CisgIFZFUklGWV9JU19FUVVBTCgobTEuYmxvY2socjEsIGMxLCByMiAtIHIxICsgMSwgYzIgLSBjMSArIDEpLmNvbCgwKSksIChtMS5jb2woYzEpLnNlZ21lbnQocjEsIHIyIC0gcjEgKyAxKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG0xLmJsb2NrKHIxLCBjMSwgcjIgLSByMSArIDEsIGMyIC0gYzEgKyAxKS50cmFuc3Bvc2UoKS5jb2woMCkpLAorICAgICAgICAgICAgICAgICAgKG0xLnJvdyhyMSkuc2VnbWVudChjMSwgYzIgLSBjMSArIDEpKS50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9JU19FUVVBTCgobTEudHJhbnNwb3NlKCkuYmxvY2soYzEsIHIxLCBjMiAtIGMxICsgMSwgcjIgLSByMSArIDEpLmNvbCgwKSksCisgICAgICAgICAgICAgICAgICAobTEucm93KHIxKS5zZWdtZW50KGMxLCBjMiAtIGMxICsgMSkpLnRyYW5zcG9zZSgpKTsKIAogICAvLyBleHByZXNzaW9ucyB3aXRob3V0IGRpcmVjdCBhY2Nlc3MKLSAgVkVSSUZZX0lTX0FQUFJPWCggKChtMSttMikuYmxvY2socjEsYzEscm93cy1yMSxjb2xzLWMxKS5ibG9jayhyMi1yMSxjMi1jMSxyb3dzLXIyLGNvbHMtYzIpKSAsICgobTErbTIpLmJsb2NrKHIyLGMyLHJvd3MtcjIsY29scy1jMikpICk7Ci0gIFZFUklGWV9JU19BUFBST1goICgobTErbTIpLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkucm93KDApKSAsICgobTErbTIpLnJvdyhyMSkuc2VnbWVudChjMSxjMi1jMSsxKSkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKChtMSttMikuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS5yb3coMCkpICwgKChtMSttMikuZXZhbCgpLnJvdyhyMSkuc2VnbWVudChjMSxjMi1jMSsxKSkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKChtMSttMikuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS5jb2woMCkpICwgKChtMSttMikuY29sKGMxKS5zZWdtZW50KHIxLHIyLXIxKzEpKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAoKG0xK20yKS5ibG9jayhyMSxjMSxyMi1yMSsxLGMyLWMxKzEpLnRyYW5zcG9zZSgpLmNvbCgwKSkgLCAoKG0xK20yKS5yb3cocjEpLnNlZ21lbnQoYzEsYzItYzErMSkpLnRyYW5zcG9zZSgpICk7Ci0gIFZFUklGWV9JU19BUFBST1goICgobTErbTIpLnRyYW5zcG9zZSgpLmJsb2NrKGMxLHIxLGMyLWMxKzEscjItcjErMSkuY29sKDApKSAsICgobTErbTIpLnJvdyhyMSkuc2VnbWVudChjMSxjMi1jMSsxKSkudHJhbnNwb3NlKCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKChtMSttMikudGVtcGxhdGUgYmxvY2s8RHluYW1pYywxPihyMSxjMSxyMi1yMSsxLDEpKSAsICgobTErbTIpLmV2YWwoKS5jb2woYzEpLmV2YWwoKS5zZWdtZW50KHIxLHIyLXIxKzEpKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAoKG0xK20yKS50ZW1wbGF0ZSBibG9jazwxLER5bmFtaWM+KHIxLGMxLDEsYzItYzErMSkpICwgKChtMSttMikuZXZhbCgpLnJvdyhyMSkuZXZhbCgpLnNlZ21lbnQoYzEsYzItYzErMSkpICk7Ci0gIFZFUklGWV9JU19BUFBST1goICgobTErbTIpLnRyYW5zcG9zZSgpLnRlbXBsYXRlIGJsb2NrPDEsRHluYW1pYz4oYzEscjEsMSxyMi1yMSsxKSkgLCAoKG0xK20yKS5ldmFsKCkuY29sKGMxKS5ldmFsKCkuc2VnbWVudChyMSxyMi1yMSsxKSkudHJhbnNwb3NlKCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG0xK20yKS5yb3cocjEpLmV2YWwoKSwgKG0xK20yKS5ldmFsKCkucm93KHIxKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAobTErbTIpLmFkam9pbnQoKS5jb2wocjEpLmV2YWwoKSwgKG0xK20yKS5hZGpvaW50KCkuZXZhbCgpLmNvbChyMSkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG0xK20yKS5hZGpvaW50KCkucm93KGMxKS5ldmFsKCksIChtMSttMikuYWRqb2ludCgpLmV2YWwoKS5yb3coYzEpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIChtMSoxKS5yb3cocjEpLnNlZ21lbnQoYzEsYzItYzErMSkuZXZhbCgpLCBtMS5yb3cocjEpLmV2YWwoKS5zZWdtZW50KGMxLGMyLWMxKzEpLmV2YWwoKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBtMS5jb2woYzEpLnJldmVyc2UoKS5zZWdtZW50KHIxLHIyLXIxKzEpLmV2YWwoKSxtMS5jb2woYzEpLnJldmVyc2UoKS5ldmFsKCkuc2VnbWVudChyMSxyMi1yMSsxKS5ldmFsKCkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKG0xICsgbTIpLmJsb2NrKHIxLCBjMSwgcm93cyAtIHIxLCBjb2xzIC0gYzEpLmJsb2NrKHIyIC0gcjEsIGMyIC0gYzEsIHJvd3MgLSByMiwgY29scyAtIGMyKSksCisgICAgICAgICAgICAgICAgICAgKChtMSArIG0yKS5ibG9jayhyMiwgYzIsIHJvd3MgLSByMiwgY29scyAtIGMyKSkpOworICBWRVJJRllfSVNfQVBQUk9YKCgobTEgKyBtMikuYmxvY2socjEsIGMxLCByMiAtIHIxICsgMSwgYzIgLSBjMSArIDEpLnJvdygwKSksCisgICAgICAgICAgICAgICAgICAgKChtMSArIG0yKS5yb3cocjEpLnNlZ21lbnQoYzEsIGMyIC0gYzEgKyAxKSkpOworICBWRVJJRllfSVNfQVBQUk9YKCgobTEgKyBtMikuYmxvY2socjEsIGMxLCByMiAtIHIxICsgMSwgYzIgLSBjMSArIDEpLnJvdygwKSksCisgICAgICAgICAgICAgICAgICAgKChtMSArIG0yKS5ldmFsKCkucm93KHIxKS5zZWdtZW50KGMxLCBjMiAtIGMxICsgMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKG0xICsgbTIpLmJsb2NrKHIxLCBjMSwgcjIgLSByMSArIDEsIGMyIC0gYzEgKyAxKS5jb2woMCkpLAorICAgICAgICAgICAgICAgICAgICgobTEgKyBtMikuY29sKGMxKS5zZWdtZW50KHIxLCByMiAtIHIxICsgMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKG0xICsgbTIpLmJsb2NrKHIxLCBjMSwgcjIgLSByMSArIDEsIGMyIC0gYzEgKyAxKS50cmFuc3Bvc2UoKS5jb2woMCkpLAorICAgICAgICAgICAgICAgICAgICgobTEgKyBtMikucm93KHIxKS5zZWdtZW50KGMxLCBjMiAtIGMxICsgMSkpLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKG0xICsgbTIpLnRyYW5zcG9zZSgpLmJsb2NrKGMxLCByMSwgYzIgLSBjMSArIDEsIHIyIC0gcjEgKyAxKS5jb2woMCkpLAorICAgICAgICAgICAgICAgICAgICgobTEgKyBtMikucm93KHIxKS5zZWdtZW50KGMxLCBjMiAtIGMxICsgMSkpLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKG0xICsgbTIpLnRlbXBsYXRlIGJsb2NrPER5bmFtaWMsIDE+KHIxLCBjMSwgcjIgLSByMSArIDEsIDEpKSwKKyAgICAgICAgICAgICAgICAgICAoKG0xICsgbTIpLmV2YWwoKS5jb2woYzEpLmV2YWwoKS5zZWdtZW50KHIxLCByMiAtIHIxICsgMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKG0xICsgbTIpLnRlbXBsYXRlIGJsb2NrPDEsIER5bmFtaWM+KHIxLCBjMSwgMSwgYzIgLSBjMSArIDEpKSwKKyAgICAgICAgICAgICAgICAgICAoKG0xICsgbTIpLmV2YWwoKS5yb3cocjEpLmV2YWwoKS5zZWdtZW50KGMxLCBjMiAtIGMxICsgMSkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKG0xICsgbTIpLnRyYW5zcG9zZSgpLnRlbXBsYXRlIGJsb2NrPDEsIER5bmFtaWM+KGMxLCByMSwgMSwgcjIgLSByMSArIDEpKSwKKyAgICAgICAgICAgICAgICAgICAoKG0xICsgbTIpLmV2YWwoKS5jb2woYzEpLmV2YWwoKS5zZWdtZW50KHIxLCByMiAtIHIxICsgMSkpLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEgKyBtMikucm93KHIxKS5ldmFsKCksIChtMSArIG0yKS5ldmFsKCkucm93KHIxKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xICsgbTIpLmFkam9pbnQoKS5jb2wocjEpLmV2YWwoKSwgKG0xICsgbTIpLmFkam9pbnQoKS5ldmFsKCkuY29sKHIxKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xICsgbTIpLmFkam9pbnQoKS5yb3coYzEpLmV2YWwoKSwgKG0xICsgbTIpLmFkam9pbnQoKS5ldmFsKCkucm93KGMxKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xICogMSkucm93KHIxKS5zZWdtZW50KGMxLCBjMiAtIGMxICsgMSkuZXZhbCgpLCBtMS5yb3cocjEpLmV2YWwoKS5zZWdtZW50KGMxLCBjMiAtIGMxICsgMSkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb2woYzEpLnJldmVyc2UoKS5zZWdtZW50KHIxLCByMiAtIHIxICsgMSkuZXZhbCgpLAorICAgICAgICAgICAgICAgICAgIG0xLmNvbChjMSkucmV2ZXJzZSgpLmV2YWwoKS5zZWdtZW50KHIxLCByMiAtIHIxICsgMSkuZXZhbCgpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCAobTEqMSkudG9wUm93cyhyMSksICBtMS50b3BSb3dzKHIxKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAobTEqMSkubGVmdENvbHMoYzEpLCBtMS5sZWZ0Q29scyhjMSkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG0xKjEpLnRyYW5zcG9zZSgpLnRvcFJvd3MoYzEpLCBtMS50cmFuc3Bvc2UoKS50b3BSb3dzKGMxKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAobTEqMSkudHJhbnNwb3NlKCkubGVmdENvbHMocjEpLCBtMS50cmFuc3Bvc2UoKS5sZWZ0Q29scyhyMSkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG0xKjEpLnRyYW5zcG9zZSgpLm1pZGRsZVJvd3MoYzEsYzItYzErMSksIG0xLnRyYW5zcG9zZSgpLm1pZGRsZVJvd3MoYzEsYzItYzErMSkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG0xKjEpLnRyYW5zcG9zZSgpLm1pZGRsZUNvbHMocjEscjItcjErMSksIG0xLnRyYW5zcG9zZSgpLm1pZGRsZUNvbHMocjEscjItcjErMSkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEgKiAxKS50b3BSb3dzKHIxKSwgbTEudG9wUm93cyhyMSkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMSAqIDEpLmxlZnRDb2xzKGMxKSwgbTEubGVmdENvbHMoYzEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEgKiAxKS50cmFuc3Bvc2UoKS50b3BSb3dzKGMxKSwgbTEudHJhbnNwb3NlKCkudG9wUm93cyhjMSkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMSAqIDEpLnRyYW5zcG9zZSgpLmxlZnRDb2xzKHIxKSwgbTEudHJhbnNwb3NlKCkubGVmdENvbHMocjEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEgKiAxKS50cmFuc3Bvc2UoKS5taWRkbGVSb3dzKGMxLCBjMiAtIGMxICsgMSksIG0xLnRyYW5zcG9zZSgpLm1pZGRsZVJvd3MoYzEsIGMyIC0gYzEgKyAxKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xICogMSkudHJhbnNwb3NlKCkubWlkZGxlQ29scyhyMSwgcjIgLSByMSArIDEpLCBtMS50cmFuc3Bvc2UoKS5taWRkbGVDb2xzKHIxLCByMiAtIHIxICsgMSkpOwogCiAgIC8vIGV2YWx1YXRpb24gaW50byBwbGFpbiBtYXRyaWNlcyBmcm9tIGV4cHJlc3Npb25zIHdpdGggZGlyZWN0IGFjY2VzcyAoc3RyZXNzIE1hcEJhc2UpCiAgIER5bmFtaWNNYXRyaXhUeXBlIGRtOwogICBEeW5hbWljVmVjdG9yVHlwZSBkdjsKICAgZG0uc2V0WmVybygpOwotICBkbSA9IG0xLmJsb2NrKHIxLGMxLHJvd3MtcjEsY29scy1jMSkuYmxvY2socjItcjEsYzItYzEscm93cy1yMixjb2xzLWMyKTsKLSAgVkVSSUZZX0lTX0VRVUFMKGRtLCAobTEuYmxvY2socjIsYzIscm93cy1yMixjb2xzLWMyKSkpOworICBkbSA9IG0xLmJsb2NrKHIxLCBjMSwgcm93cyAtIHIxLCBjb2xzIC0gYzEpLmJsb2NrKHIyIC0gcjEsIGMyIC0gYzEsIHJvd3MgLSByMiwgY29scyAtIGMyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGRtLCAobTEuYmxvY2socjIsIGMyLCByb3dzIC0gcjIsIGNvbHMgLSBjMikpKTsKICAgZG0uc2V0WmVybygpOwogICBkdi5zZXRaZXJvKCk7Ci0gIGRtID0gbTEuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS5yb3coMCkudHJhbnNwb3NlKCk7Ci0gIGR2ID0gbTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpOworICBkbSA9IG0xLmJsb2NrKHIxLCBjMSwgcjIgLSByMSArIDEsIGMyIC0gYzEgKyAxKS5yb3coMCkudHJhbnNwb3NlKCk7CisgIGR2ID0gbTEucm93KHIxKS5zZWdtZW50KGMxLCBjMiAtIGMxICsgMSk7CiAgIFZFUklGWV9JU19FUVVBTChkdiwgZG0pOwogICBkbS5zZXRaZXJvKCk7CiAgIGR2LnNldFplcm8oKTsKLSAgZG0gPSBtMS5jb2woYzEpLnNlZ21lbnQocjEscjItcjErMSk7Ci0gIGR2ID0gbTEuYmxvY2socjEsYzEscjItcjErMSxjMi1jMSsxKS5jb2woMCk7CisgIGRtID0gbTEuY29sKGMxKS5zZWdtZW50KHIxLCByMiAtIHIxICsgMSk7CisgIGR2ID0gbTEuYmxvY2socjEsIGMxLCByMiAtIHIxICsgMSwgYzIgLSBjMSArIDEpLmNvbCgwKTsKICAgVkVSSUZZX0lTX0VRVUFMKGR2LCBkbSk7CiAgIGRtLnNldFplcm8oKTsKICAgZHYuc2V0WmVybygpOwotICBkbSA9IG0xLmJsb2NrKHIxLGMxLHIyLXIxKzEsYzItYzErMSkudHJhbnNwb3NlKCkuY29sKDApOwotICBkdiA9IG0xLnJvdyhyMSkuc2VnbWVudChjMSxjMi1jMSsxKTsKKyAgZG0gPSBtMS5ibG9jayhyMSwgYzEsIHIyIC0gcjEgKyAxLCBjMiAtIGMxICsgMSkudHJhbnNwb3NlKCkuY29sKDApOworICBkdiA9IG0xLnJvdyhyMSkuc2VnbWVudChjMSwgYzIgLSBjMSArIDEpOwogICBWRVJJRllfSVNfRVFVQUwoZHYsIGRtKTsKICAgZG0uc2V0WmVybygpOwogICBkdi5zZXRaZXJvKCk7Ci0gIGRtID0gbTEucm93KHIxKS5zZWdtZW50KGMxLGMyLWMxKzEpLnRyYW5zcG9zZSgpOwotICBkdiA9IG0xLnRyYW5zcG9zZSgpLmJsb2NrKGMxLHIxLGMyLWMxKzEscjItcjErMSkuY29sKDApOworICBkbSA9IG0xLnJvdyhyMSkuc2VnbWVudChjMSwgYzIgLSBjMSArIDEpLnRyYW5zcG9zZSgpOworICBkdiA9IG0xLnRyYW5zcG9zZSgpLmJsb2NrKGMxLCByMSwgYzIgLSBjMSArIDEsIHIyIC0gcjEgKyAxKS5jb2woMCk7CiAgIFZFUklGWV9JU19FUVVBTChkdiwgZG0pOwogCi0gIFZFUklGWV9JU19FUVVBTCggKG0xLnRlbXBsYXRlIGJsb2NrPER5bmFtaWMsMT4oMSwwLDAsMSkpLCBtMS5ibG9jaygxLDAsMCwxKSk7Ci0gIFZFUklGWV9JU19FUVVBTCggKG0xLnRlbXBsYXRlIGJsb2NrPDEsRHluYW1pYz4oMCwxLDEsMCkpLCBtMS5ibG9jaygwLDEsMSwwKSk7Ci0gIFZFUklGWV9JU19FUVVBTCggKChtMSoxKS50ZW1wbGF0ZSBibG9jazxEeW5hbWljLDE+KDEsMCwwLDEpKSwgbTEuYmxvY2soMSwwLDAsMSkpOwotICBWRVJJRllfSVNfRVFVQUwoICgobTEqMSkudGVtcGxhdGUgYmxvY2s8MSxEeW5hbWljPigwLDEsMSwwKSksIG0xLmJsb2NrKDAsMSwxLDApKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtMS50ZW1wbGF0ZSBibG9jazxEeW5hbWljLCAxPigxLCAwLCAwLCAxKSksIG0xLmJsb2NrKDEsIDAsIDAsIDEpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtMS50ZW1wbGF0ZSBibG9jazwxLCBEeW5hbWljPigwLCAxLCAxLCAwKSksIG0xLmJsb2NrKDAsIDEsIDEsIDApKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCgobTEgKiAxKS50ZW1wbGF0ZSBibG9jazxEeW5hbWljLCAxPigxLCAwLCAwLCAxKSksIG0xLmJsb2NrKDEsIDAsIDAsIDEpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCgobTEgKiAxKS50ZW1wbGF0ZSBibG9jazwxLCBEeW5hbWljPigwLCAxLCAxLCAwKSksIG0xLmJsb2NrKDAsIDEsIDEsIDApKTsKIAotICBWRVJJRllfSVNfRVFVQUwoIG0xLnRlbXBsYXRlIHN1YlZlY3RvcjxIb3Jpem9udGFsPihyMSksIG0xLnJvdyhyMSkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG0xK20xKS50ZW1wbGF0ZSBzdWJWZWN0b3I8SG9yaXpvbnRhbD4ocjEpLCAobTErbTEpLnJvdyhyMSkgKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCBtMS50ZW1wbGF0ZSBzdWJWZWN0b3I8VmVydGljYWw+KGMxKSwgbTEuY29sKGMxKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAobTErbTEpLnRlbXBsYXRlIHN1YlZlY3RvcjxWZXJ0aWNhbD4oYzEpLCAobTErbTEpLmNvbChjMSkgKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCBtMS50ZW1wbGF0ZSBzdWJWZWN0b3JzPEhvcml6b250YWw+KCksIG0xLnJvd3MoKSApOwotICBWRVJJRllfSVNfRVFVQUwoIG0xLnRlbXBsYXRlIHN1YlZlY3RvcnM8VmVydGljYWw+KCksIG0xLmNvbHMoKSApOworICBWRVJJRllfSVNfRVFVQUwobTEudGVtcGxhdGUgc3ViVmVjdG9yPEhvcml6b250YWw+KHIxKSwgbTEucm93KHIxKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xICsgbTEpLnRlbXBsYXRlIHN1YlZlY3RvcjxIb3Jpem9udGFsPihyMSksIChtMSArIG0xKS5yb3cocjEpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0xLnRlbXBsYXRlIHN1YlZlY3RvcjxWZXJ0aWNhbD4oYzEpLCBtMS5jb2woYzEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEgKyBtMSkudGVtcGxhdGUgc3ViVmVjdG9yPFZlcnRpY2FsPihjMSksIChtMSArIG0xKS5jb2woYzEpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0xLnRlbXBsYXRlIHN1YlZlY3RvcnM8SG9yaXpvbnRhbD4oKSwgbTEucm93cygpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0xLnRlbXBsYXRlIHN1YlZlY3RvcnM8VmVydGljYWw+KCksIG0xLmNvbHMoKSk7CiAKLSAgaWYgKHJvd3M+PTIgfHwgY29scz49MikgewotICAgIFZFUklGWV9JU19FUVVBTCggaW50KG0xLm1pZGRsZUNvbHMoMCwwKS5Jc1Jvd01ham9yKSwgaW50KG0xLklzUm93TWFqb3IpICk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKCBtMS5taWRkbGVDb2xzKDAsMCkub3V0ZXJTaXplKCksIG0xLklzUm93TWFqb3IgPyByb3dzIDogMCk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKCBtMS5taWRkbGVDb2xzKDAsMCkuaW5uZXJTaXplKCksIG0xLklzUm93TWFqb3IgPyAwIDogcm93cyk7CisgIGlmIChyb3dzID49IDIgfHwgY29scyA+PSAyKSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKGludChtMS5taWRkbGVDb2xzKDAsIDApLklzUm93TWFqb3IpLCBpbnQobTEuSXNSb3dNYWpvcikpOworICAgIFZFUklGWV9JU19FUVVBTChtMS5taWRkbGVDb2xzKDAsIDApLm91dGVyU2l6ZSgpLCBtMS5Jc1Jvd01ham9yID8gcm93cyA6IDApOworICAgIFZFUklGWV9JU19FUVVBTChtMS5taWRkbGVDb2xzKDAsIDApLmlubmVyU2l6ZSgpLCBtMS5Jc1Jvd01ham9yID8gMCA6IHJvd3MpOwogCi0gICAgVkVSSUZZX0lTX0VRVUFMKCBpbnQobTEubWlkZGxlUm93cygwLDApLklzUm93TWFqb3IpLCBpbnQobTEuSXNSb3dNYWpvcikgKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoIG0xLm1pZGRsZVJvd3MoMCwwKS5vdXRlclNpemUoKSwgbTEuSXNSb3dNYWpvciA/IDAgOiBjb2xzKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoIG0xLm1pZGRsZVJvd3MoMCwwKS5pbm5lclNpemUoKSwgbTEuSXNSb3dNYWpvciA/IGNvbHMgOiAwKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoaW50KG0xLm1pZGRsZVJvd3MoMCwgMCkuSXNSb3dNYWpvciksIGludChtMS5Jc1Jvd01ham9yKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG0xLm1pZGRsZVJvd3MoMCwgMCkub3V0ZXJTaXplKCksIG0xLklzUm93TWFqb3IgPyAwIDogY29scyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG0xLm1pZGRsZVJvd3MoMCwgMCkuaW5uZXJTaXplKCksIG0xLklzUm93TWFqb3IgPyBjb2xzIDogMCk7CiAgIH0KIH0KIAotCi0KLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci1zdGQ6OmVuYWJsZV9pZl90PE1hdHJpeFR5cGU6OklzVmVjdG9yQXRDb21waWxlVGltZSx2b2lkPgotY29tcGFyZV91c2luZ19kYXRhX2FuZF9zdHJpZGUoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RkOjplbmFibGVfaWZfdDxNYXRyaXhUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsIHZvaWQ+IGNvbXBhcmVfdXNpbmdfZGF0YV9hbmRfc3RyaWRlKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAgIEluZGV4IHNpemUgPSBtLnNpemUoKTsKQEAgLTI1NCwxOSArMjYxLDE1IEBACiAgIEluZGV4IGNvbFN0cmlkZSA9IG0uY29sU3RyaWRlKCk7CiAgIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciogZGF0YSA9IG0uZGF0YSgpOwogCi0gIGZvcihpbnQgaj0wO2o8Y29sczsrK2opCi0gICAgZm9yKGludCBpPTA7aTxyb3dzOysraSkKLSAgICAgIFZFUklGWShtLmNvZWZmKGksaikgPT0gZGF0YVtpKnJvd1N0cmlkZSArIGoqY29sU3RyaWRlXSk7CisgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgKytqKQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgKytpKSBWRVJJRlkobS5jb2VmZihpLCBqKSA9PSBkYXRhW2kgKiByb3dTdHJpZGUgKyBqICogY29sU3RyaWRlXSk7CiAKLSAgVkVSSUZZKGlubmVyU3RyaWRlID09IGludCgoJm0uY29lZmYoMSkpLSgmbS5jb2VmZigwKSkpKTsKLSAgZm9yIChpbnQgaT0wO2k8c2l6ZTsrK2kpCi0gICAgVkVSSUZZKG0uY29lZmYoaSkgPT0gZGF0YVtpKmlubmVyU3RyaWRlXSk7CisgIFZFUklGWShpbm5lclN0cmlkZSA9PSBpbnQoKCZtLmNvZWZmKDEpKSAtICgmbS5jb2VmZigwKSkpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIFZFUklGWShtLmNvZWZmKGkpID09IGRhdGFbaSAqIGlubmVyU3RyaWRlXSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci1zdGQ6OmVuYWJsZV9pZl90PCFNYXRyaXhUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUsdm9pZD4KLWNvbXBhcmVfdXNpbmdfZGF0YV9hbmRfc3RyaWRlKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0ZDo6ZW5hYmxlX2lmX3Q8IU1hdHJpeFR5cGU6OklzVmVjdG9yQXRDb21waWxlVGltZSwgdm9pZD4gY29tcGFyZV91c2luZ19kYXRhX2FuZF9zdHJpZGUoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKICAgSW5kZXggaW5uZXJTdHJpZGUgPSBtLmlubmVyU3RyaWRlKCk7CkBAIC0yNzUsMzggKzI3OCwzNCBAQAogICBJbmRleCBjb2xTdHJpZGUgPSBtLmNvbFN0cmlkZSgpOwogICBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIqIGRhdGEgPSBtLmRhdGEoKTsKIAotICBmb3IoaW50IGo9MDtqPGNvbHM7KytqKQotICAgIGZvcihpbnQgaT0wO2k8cm93czsrK2kpCi0gICAgICBWRVJJRlkobS5jb2VmZihpLGopID09IGRhdGFbaSpyb3dTdHJpZGUgKyBqKmNvbFN0cmlkZV0pOworICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7ICsraikKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7ICsraSkgVkVSSUZZKG0uY29lZmYoaSwgaikgPT0gZGF0YVtpICogcm93U3RyaWRlICsgaiAqIGNvbFN0cmlkZV0pOwogCi0gIGZvcihpbnQgaj0wO2o8Y29sczsrK2opCi0gICAgZm9yKGludCBpPTA7aTxyb3dzOysraSkKLSAgICAgIFZFUklGWShtLmNvZWZmKGksaikgPT0gZGF0YVsoTWF0cml4VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpKm91dGVyU3RyaWRlICsgaippbm5lclN0cmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaipvdXRlclN0cmlkZSArIGkqaW5uZXJTdHJpZGVdKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyArK2opCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyArK2kpCisgICAgICBWRVJJRlkobS5jb2VmZihpLCBqKSA9PSBkYXRhWyhNYXRyaXhUeXBlOjpGbGFncyAmIFJvd01ham9yQml0KSA/IGkgKiBvdXRlclN0cmlkZSArIGogKiBpbm5lclN0cmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBqICogb3V0ZXJTdHJpZGUgKyBpICogaW5uZXJTdHJpZGVdKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXZvaWQgZGF0YV9hbmRfc3RyaWRlKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgZGF0YV9hbmRfc3RyaWRlKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKLSAgSW5kZXggcjEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7Ci0gIEluZGV4IHIyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4ocjEscm93cy0xKTsKLSAgSW5kZXggYzEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7Ci0gIEluZGV4IGMyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oYzEsY29scy0xKTsKKyAgSW5kZXggcjEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMSk7CisgIEluZGV4IHIyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4ocjEsIHJvd3MgLSAxKTsKKyAgSW5kZXggYzEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CisgIEluZGV4IGMyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oYzEsIGNvbHMgLSAxKTsKIAogICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOwotICBjb21wYXJlX3VzaW5nX2RhdGFfYW5kX3N0cmlkZShtMS5ibG9jayhyMSwgYzEsIHIyLXIxKzEsIGMyLWMxKzEpKTsKLSAgY29tcGFyZV91c2luZ19kYXRhX2FuZF9zdHJpZGUobTEudHJhbnNwb3NlKCkuYmxvY2soYzEsIHIxLCBjMi1jMSsxLCByMi1yMSsxKSk7CisgIGNvbXBhcmVfdXNpbmdfZGF0YV9hbmRfc3RyaWRlKG0xLmJsb2NrKHIxLCBjMSwgcjIgLSByMSArIDEsIGMyIC0gYzEgKyAxKSk7CisgIGNvbXBhcmVfdXNpbmdfZGF0YV9hbmRfc3RyaWRlKG0xLnRyYW5zcG9zZSgpLmJsb2NrKGMxLCByMSwgYzIgLSBjMSArIDEsIHIyIC0gcjEgKyAxKSk7CiAgIGNvbXBhcmVfdXNpbmdfZGF0YV9hbmRfc3RyaWRlKG0xLnJvdyhyMSkpOwogICBjb21wYXJlX3VzaW5nX2RhdGFfYW5kX3N0cmlkZShtMS5jb2woYzEpKTsKICAgY29tcGFyZV91c2luZ19kYXRhX2FuZF9zdHJpZGUobTEucm93KHIxKS50cmFuc3Bvc2UoKSk7CiAgIGNvbXBhcmVfdXNpbmdfZGF0YV9hbmRfc3RyaWRlKG0xLmNvbChjMSkudHJhbnNwb3NlKCkpOwogfQogCi0KIHRlbXBsYXRlIDx0eXBlbmFtZSBCYXNlWHByLCB0eXBlbmFtZSBYcHIgPSBCYXNlWHByLCBpbnQgRGVwdGggPSAwPgogc3RydWN0IHVud2luZF90ZXN0X2ltcGwgewogICBzdGF0aWMgdm9pZCBydW4oWHByJiB4cHIpIHsKQEAgLTM0MywyNSArMzQyLDI1IEBACiAgIHVud2luZF90ZXN0X2ltcGw8QmFzZVhwcj46OnJ1bih4cHIpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoYmxvY2spCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGJsb2NrKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggYmxvY2soTWF0cml4PGZsb2F0LCAxLCBEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tKDIsNTApKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggYmxvY2soTWF0cml4PGZsb2F0LCBEeW5hbWljLCAxPihpbnRlcm5hbDo6cmFuZG9tKDIsNTApKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggYmxvY2soTWF0cml4NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggYmxvY2soTWF0cml4WGNmKGludGVybmFsOjpyYW5kb20oMiw1MCksIGludGVybmFsOjpyYW5kb20oMiw1MCkpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBibG9jayhNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tKDIsNTApLCBpbnRlcm5hbDo6cmFuZG9tKDIsNTApKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggYmxvY2soTWF0cml4WGNkKGludGVybmFsOjpyYW5kb20oMiw1MCksIGludGVybmFsOjpyYW5kb20oMiw1MCkpKSApOwotICAgIENBTExfU1VCVEVTVF82KCBibG9jayhNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tKDIsNTApLCBpbnRlcm5hbDo6cmFuZG9tKDIsNTApKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNyggYmxvY2soTWF0cml4PGludCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KGludGVybmFsOjpyYW5kb20oMiw1MCksIGludGVybmFsOjpyYW5kb20oMiw1MCkpKSApOworRUlHRU5fREVDTEFSRV9URVNUKGJsb2NrKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKGJsb2NrKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8xKGJsb2NrKE1hdHJpeDxmbG9hdCwgMSwgRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbSgyLCA1MCkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoYmxvY2soTWF0cml4PGZsb2F0LCBEeW5hbWljLCAxPihpbnRlcm5hbDo6cmFuZG9tKDIsIDUwKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihibG9jayhNYXRyaXg0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoYmxvY2soTWF0cml4WGNmKGludGVybmFsOjpyYW5kb20oMiwgNTApLCBpbnRlcm5hbDo6cmFuZG9tKDIsIDUwKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChibG9jayhNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tKDIsIDUwKSwgaW50ZXJuYWw6OnJhbmRvbSgyLCA1MCkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoYmxvY2soTWF0cml4WGNkKGludGVybmFsOjpyYW5kb20oMiwgNTApLCBpbnRlcm5hbDo6cmFuZG9tKDIsIDUwKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNihibG9jayhNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tKDIsIDUwKSwgaW50ZXJuYWw6OnJhbmRvbSgyLCA1MCkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoYmxvY2soTWF0cml4PGludCwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+KGludGVybmFsOjpyYW5kb20oMiwgNTApLCBpbnRlcm5hbDo6cmFuZG9tKDIsIDUwKSkpKTsKIAotICAgIENBTExfU1VCVEVTVF84KCBibG9jayhNYXRyaXg8ZmxvYXQsRHluYW1pYyw0PigzLCA0KSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOSggdW53aW5kX3Rlc3QoTWF0cml4WGYoKSkpOworICAgIENBTExfU1VCVEVTVF84KGJsb2NrKE1hdHJpeDxmbG9hdCwgRHluYW1pYywgND4oMywgNCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfOSh1bndpbmRfdGVzdChNYXRyaXhYZigpKSk7CiAKICNpZm5kZWYgRUlHRU5fREVGQVVMVF9UT19ST1dfTUFKT1IKLSAgICBDQUxMX1NVQlRFU1RfNiggZGF0YV9hbmRfc3RyaWRlKE1hdHJpeFhmKGludGVybmFsOjpyYW5kb20oNSw1MCksIGludGVybmFsOjpyYW5kb20oNSw1MCkpKSApOwotICAgIENBTExfU1VCVEVTVF83KCBkYXRhX2FuZF9zdHJpZGUoTWF0cml4PGludCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KGludGVybmFsOjpyYW5kb20oNSw1MCksIGludGVybmFsOjpyYW5kb20oNSw1MCkpKSApOworICAgIENBTExfU1VCVEVTVF82KGRhdGFfYW5kX3N0cmlkZShNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tKDUsIDUwKSwgaW50ZXJuYWw6OnJhbmRvbSg1LCA1MCkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoCisgICAgICAgIGRhdGFfYW5kX3N0cmlkZShNYXRyaXg8aW50LCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4oaW50ZXJuYWw6OnJhbmRvbSg1LCA1MCksIGludGVybmFsOjpyYW5kb20oNSwgNTApKSkpOwogI2VuZGlmCiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvYm9vc3RtdWx0aXByZWMuY3BwIGIvdGVzdC9ib29zdG11bHRpcHJlYy5jcHAKaW5kZXggNjY4NGY3NC4uNzZlODBmZSAxMDA2NDQKLS0tIGEvdGVzdC9ib29zdG11bHRpcHJlYy5jcHAKKysrIGIvdGVzdC9ib29zdG11bHRpcHJlYy5jcHAKQEAgLTc3LDc5ICs3Nyw3NCBAQAogdHlwZWRlZiBib29zdDo6bXVsdGlwcmVjaXNpb246Om51bWJlcjxib29zdDo6bXVsdGlwcmVjaXNpb246OmNwcF9kZWNfZmxvYXQ8MTAwPiwgYm9vc3Q6Om11bHRpcHJlY2lzaW9uOjpldF9vbj4gUmVhbDsKIAogbmFtZXNwYWNlIEVpZ2VuIHsKLSAgdGVtcGxhdGU8PiBzdHJ1Y3QgTnVtVHJhaXRzPFJlYWw+IDogR2VuZXJpY051bVRyYWl0czxSZWFsPiB7Ci0gICAgc3RhdGljIGlubGluZSBSZWFsIGR1bW15X3ByZWNpc2lvbigpIHsgcmV0dXJuIDFlLTUwOyB9Ci0gIH07Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IE51bVRyYWl0czxSZWFsPiA6IEdlbmVyaWNOdW1UcmFpdHM8UmVhbD4geworICBzdGF0aWMgaW5saW5lIFJlYWwgZHVtbXlfcHJlY2lzaW9uKCkgeyByZXR1cm4gMWUtNTA7IH0KK307CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsdHlwZW5hbWUgVDIsdHlwZW5hbWUgVDMsdHlwZW5hbWUgVDQsdHlwZW5hbWUgVDU+Ci0gIHN0cnVjdCBOdW1UcmFpdHM8Ym9vc3Q6Om11bHRpcHJlY2lzaW9uOjpkZXRhaWw6OmV4cHJlc3Npb248VDEsVDIsVDMsVDQsVDU+ID4gOiBOdW1UcmFpdHM8UmVhbD4ge307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1Pgorc3RydWN0IE51bVRyYWl0czxib29zdDo6bXVsdGlwcmVjaXNpb246OmRldGFpbDo6ZXhwcmVzc2lvbjxUMSwgVDIsIFQzLCBUNCwgVDU+ID4gOiBOdW1UcmFpdHM8UmVhbD4ge307CiAKLSAgdGVtcGxhdGU8PgotICBSZWFsIHRlc3RfcHJlY2lzaW9uPFJlYWw+KCkgeyByZXR1cm4gMWUtNTA7IH0KLQotICAvLyBuZWVkZWQgaW4gQysrOTMgbW9kZSB3aGVyZSBudW1iZXIgZG9lcyBub3Qgc3VwcG9ydCBleHBsaWNpdCBjYXN0LgotICBuYW1lc3BhY2UgaW50ZXJuYWwgewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5ld1R5cGU+Ci0gICAgc3RydWN0IGNhc3RfaW1wbDxSZWFsLE5ld1R5cGU+IHsKLSAgICAgIHN0YXRpYyBpbmxpbmUgTmV3VHlwZSBydW4oY29uc3QgUmVhbCYgeCkgewotICAgICAgICByZXR1cm4geC50ZW1wbGF0ZSBjb252ZXJ0X3RvPE5ld1R5cGU+KCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlPD4KLSAgICBzdHJ1Y3QgY2FzdF9pbXBsPFJlYWwsc3RkOjpjb21wbGV4PFJlYWw+ID4gewotICAgICAgc3RhdGljIGlubGluZSBzdGQ6OmNvbXBsZXg8UmVhbD4gIHJ1bihjb25zdCBSZWFsJiB4KSB7Ci0gICAgICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8UmVhbD4oeCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQordGVtcGxhdGUgPD4KK1JlYWwgdGVzdF9wcmVjaXNpb248UmVhbD4oKSB7CisgIHJldHVybiAxZS01MDsKIH0KIAorLy8gbmVlZGVkIGluIEMrKzkzIG1vZGUgd2hlcmUgbnVtYmVyIGRvZXMgbm90IHN1cHBvcnQgZXhwbGljaXQgY2FzdC4KK25hbWVzcGFjZSBpbnRlcm5hbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTmV3VHlwZT4KK3N0cnVjdCBjYXN0X2ltcGw8UmVhbCwgTmV3VHlwZT4geworICBzdGF0aWMgaW5saW5lIE5ld1R5cGUgcnVuKGNvbnN0IFJlYWwmIHgpIHsgcmV0dXJuIHgudGVtcGxhdGUgY29udmVydF90bzxOZXdUeXBlPigpOyB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGNhc3RfaW1wbDxSZWFsLCBzdGQ6OmNvbXBsZXg8UmVhbD4gPiB7CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpjb21wbGV4PFJlYWw+IHJ1bihjb25zdCBSZWFsJiB4KSB7IHJldHVybiBzdGQ6OmNvbXBsZXg8UmVhbD4oeCk7IH0KK307Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgorCiBuYW1lc3BhY2UgYm9vc3QgewogbmFtZXNwYWNlIG11bHRpcHJlY2lzaW9uIHsKLSAgLy8gdG8gbWFrZSBBREwgd29ya3MgYXMgZXhwZWN0ZWQ6Ci0gIHVzaW5nIGJvb3N0OjptYXRoOjppc2Zpbml0ZTsKLSAgdXNpbmcgYm9vc3Q6Om1hdGg6OmlzbmFuOwotICB1c2luZyBib29zdDo6bWF0aDo6aXNpbmY7Ci0gIHVzaW5nIGJvb3N0OjptYXRoOjpjb3B5c2lnbjsKLSAgdXNpbmcgYm9vc3Q6Om1hdGg6Omh5cG90OworLy8gdG8gbWFrZSBBREwgd29ya3MgYXMgZXhwZWN0ZWQ6Cit1c2luZyBib29zdDo6bWF0aDo6Y29weXNpZ247Cit1c2luZyBib29zdDo6bWF0aDo6aHlwb3Q7Cit1c2luZyBib29zdDo6bWF0aDo6aXNmaW5pdGU7Cit1c2luZyBib29zdDo6bWF0aDo6aXNpbmY7Cit1c2luZyBib29zdDo6bWF0aDo6aXNuYW47CiAKLSAgLy8gVGhlIGZvbGxvd2luZyBpcyBuZWVkZWQgZm9yIHN0ZDo6Y29tcGxleDxSZWFsPjoKLSAgUmVhbCBmYWJzKGNvbnN0IFJlYWwmIGEpIHsgcmV0dXJuIGFicyBFSUdFTl9OT1RfQV9NQUNSTyAoYSk7IH0KLSAgUmVhbCBmbWF4KGNvbnN0IFJlYWwmIGEsIGNvbnN0IFJlYWwmIGIpIHsgdXNpbmcgc3RkOjptYXg7IHJldHVybiBtYXgoYSxiKTsgfQotCi0gIC8vIHNvbWUgc3BlY2lhbGl6YXRpb24gZm9yIHRoZSB1bml0IHRlc3RzOgotICBpbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IFJlYWwmIGEsIGNvbnN0IFJlYWwmIGIpIHsKLSAgICByZXR1cm4gaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPFJlYWw+KCkpOwotICB9Ci0KLSAgaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBSZWFsJiBhLCBjb25zdCBSZWFsJiBiKSB7Ci0gICAgcmV0dXJuIGludGVybmFsOjppc0FwcHJveChhLCBiLCB0ZXN0X3ByZWNpc2lvbjxSZWFsPigpKTsKLSAgfQotCi0gIGlubGluZSBib29sIHRlc3RfaXNBcHByb3hPckxlc3NUaGFuKGNvbnN0IFJlYWwmIGEsIGNvbnN0IFJlYWwmIGIpIHsKLSAgICByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94T3JMZXNzVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxSZWFsPigpKTsKLSAgfQotCi0gIFJlYWwgZ2V0X3Rlc3RfcHJlY2lzaW9uKGNvbnN0IFJlYWwmKSB7Ci0gICAgcmV0dXJuIHRlc3RfcHJlY2lzaW9uPFJlYWw+KCk7Ci0gIH0KLQotICBSZWFsIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgUmVhbCAmYSwgY29uc3QgUmVhbCAmYikgewotICAgIHVzaW5nIEVpZ2VuOjpudW1leHQ6OmFiczI7Ci0gICAgcmV0dXJuIHNxcnQoYWJzMjxSZWFsPihhLWIpL0VpZ2VuOjpudW1leHQ6Om1pbmk8UmVhbD4oYWJzMihhKSxhYnMyKGIpKSk7Ci0gIH0KLX0KKy8vIFRoZSBmb2xsb3dpbmcgaXMgbmVlZGVkIGZvciBzdGQ6OmNvbXBsZXg8UmVhbD46CitSZWFsIGZhYnMoY29uc3QgUmVhbCYgYSkgeyByZXR1cm4gYWJzIEVJR0VOX05PVF9BX01BQ1JPKGEpOyB9CitSZWFsIGZtYXgoY29uc3QgUmVhbCYgYSwgY29uc3QgUmVhbCYgYikgeworICB1c2luZyBzdGQ6Om1heDsKKyAgcmV0dXJuIG1heChhLCBiKTsKIH0KIAotbmFtZXNwYWNlIEVpZ2VuIHsKLQorLy8gc29tZSBzcGVjaWFsaXphdGlvbiBmb3IgdGhlIHVuaXQgdGVzdHM6CitpbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IFJlYWwmIGEsIGNvbnN0IFJlYWwmIGIpIHsKKyAgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxSZWFsPigpKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGJvb3N0bXVsdGlwcmVjKQotewotICB0eXBlZGVmIE1hdHJpeDxSZWFsLER5bmFtaWMsRHluYW1pYz4gTWF0OwotICB0eXBlZGVmIE1hdHJpeDxzdGQ6OmNvbXBsZXg8UmVhbD4sRHluYW1pYyxEeW5hbWljPiBNYXRDOworaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBSZWFsJiBhLCBjb25zdCBSZWFsJiBiKSB7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248UmVhbD4oKSk7IH0KKworaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveE9yTGVzc1RoYW4oY29uc3QgUmVhbCYgYSwgY29uc3QgUmVhbCYgYikgeworICByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94T3JMZXNzVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxSZWFsPigpKTsKK30KKworUmVhbCBnZXRfdGVzdF9wcmVjaXNpb24oY29uc3QgUmVhbCYpIHsgcmV0dXJuIHRlc3RfcHJlY2lzaW9uPFJlYWw+KCk7IH0KKworUmVhbCB0ZXN0X3JlbGF0aXZlX2Vycm9yKGNvbnN0IFJlYWwmIGEsIGNvbnN0IFJlYWwmIGIpIHsKKyAgdXNpbmcgRWlnZW46Om51bWV4dDo6YWJzMjsKKyAgcmV0dXJuIHNxcnQoYWJzMjxSZWFsPihhIC0gYikgLyBFaWdlbjo6bnVtZXh0OjptaW5pPFJlYWw+KGFiczIoYSksIGFiczIoYikpKTsKK30KK30gIC8vIG5hbWVzcGFjZSBtdWx0aXByZWNpc2lvbgorfSAgLy8gbmFtZXNwYWNlIGJvb3N0CisKK25hbWVzcGFjZSBFaWdlbiB7fQorCitFSUdFTl9ERUNMQVJFX1RFU1QoYm9vc3RtdWx0aXByZWMpIHsKKyAgdHlwZWRlZiBNYXRyaXg8UmVhbCwgRHluYW1pYywgRHluYW1pYz4gTWF0OworICB0eXBlZGVmIE1hdHJpeDxzdGQ6OmNvbXBsZXg8UmVhbD4sIER5bmFtaWMsIER5bmFtaWM+IE1hdEM7CiAKICAgc3RkOjpjb3V0IDw8ICJOdW1UcmFpdHM8UmVhbD46OmVwc2lsb24oKSAgICAgICAgID0gIiA8PCBOdW1UcmFpdHM8UmVhbD46OmVwc2lsb24oKSA8PCBzdGQ6OmVuZGw7CiAgIHN0ZDo6Y291dCA8PCAiTnVtVHJhaXRzPFJlYWw+OjpkdW1teV9wcmVjaXNpb24oKSA9ICIgPDwgTnVtVHJhaXRzPFJlYWw+OjpkdW1teV9wcmVjaXNpb24oKSA8PCBzdGQ6OmVuZGw7CkBAIC0xNjAsNTEgKzE1NSw1OCBAQAogCiAgIC8vIGNoZWNrIHN0cmVhbSBvdXRwdXQKICAgewotICAgIE1hdCBBKDEwLDEwKTsKKyAgICBNYXQgQSgxMCwgMTApOwogICAgIEEuc2V0UmFuZG9tKCk7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAgICAgc3MgPDwgQTsKICAgfQogICB7Ci0gICAgTWF0QyBBKDEwLDEwKTsKKyAgICBNYXRDIEEoMTAsIDEwKTsKICAgICBBLnNldFJhbmRvbSgpOwogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICAgIHNzIDw8IEE7CiAgIH0KIAotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIGludCBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIGludCBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpOwogCi0gICAgQ0FMTF9TVUJURVNUXzEoIGNob2xlc2t5KE1hdChzLHMpKSApOworICAgIENBTExfU1VCVEVTVF8xKGNob2xlc2t5KE1hdChzLCBzKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzIoIGx1X25vbl9pbnZlcnRpYmxlPE1hdD4oKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBsdV9pbnZlcnRpYmxlPE1hdD4oKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBsdV9ub25faW52ZXJ0aWJsZTxNYXRDPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGx1X2ludmVydGlibGU8TWF0Qz4oKSApOworICAgIENBTExfU1VCVEVTVF8yKGx1X25vbl9pbnZlcnRpYmxlPE1hdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzIobHVfaW52ZXJ0aWJsZTxNYXQ+KCkpOworICAgIENBTExfU1VCVEVTVF8yKGx1X25vbl9pbnZlcnRpYmxlPE1hdEM+KCkpOworICAgIENBTExfU1VCVEVTVF8yKGx1X2ludmVydGlibGU8TWF0Qz4oKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfMyggcXIoTWF0KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggcXJfaW52ZXJ0aWJsZTxNYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMygKKyAgICAgICAgcXIoTWF0KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF8zKHFyX2ludmVydGlibGU8TWF0PigpKTsKIAotICAgIENBTExfU1VCVEVTVF80KCBxcjxNYXQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggY29kPE1hdD4oKSApOwotICAgIENBTExfU1VCVEVTVF80KCBxcl9pbnZlcnRpYmxlPE1hdD4oKSApOworICAgIENBTExfU1VCVEVTVF80KHFyPE1hdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoY29kPE1hdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzQocXJfaW52ZXJ0aWJsZTxNYXQ+KCkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzUoIHFyPE1hdD4oKSApOwotICAgIENBTExfU1VCVEVTVF81KCBxcl9pbnZlcnRpYmxlPE1hdD4oKSApOworICAgIENBTExfU1VCVEVTVF81KHFyPE1hdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzUocXJfaW52ZXJ0aWJsZTxNYXQ+KCkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzYoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0KHMscykpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXQocywgcykpKTsKIAotICAgIENBTExfU1VCVEVTVF83KCBlaWdlbnNvbHZlcihNYXQocyxzKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyhlaWdlbnNvbHZlcihNYXQocywgcykpKTsKIAotICAgIENBTExfU1VCVEVTVF84KCBnZW5lcmFsaXplZF9laWdlbnNvbHZlcl9yZWFsKE1hdChzLHMpKSApOworICAgIENBTExfU1VCVEVTVF84KGdlbmVyYWxpemVkX2VpZ2Vuc29sdmVyX3JlYWwoTWF0KHMsIHMpKSk7CiAKICAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCiAgIH0KIAotICBDQUxMX1NVQlRFU1RfOSgoIGphY29iaXN2ZF90aGluX29wdGlvbnMoTWF0KGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFLzQsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oRUlHRU5fVEVTVF9NQVhfU0laRS80LCBFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkgKSk7Ci0gIENBTExfU1VCVEVTVF85KCggamFjb2Jpc3ZkX2Z1bGxfb3B0aW9ucyhNYXQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KEVJR0VOX1RFU1RfTUFYX1NJWkUvNCwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFLzQsIEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpKSApKTsKLSAgQ0FMTF9TVUJURVNUXzEwKCggYmRjc3ZkX3RoaW5fb3B0aW9ucyhNYXQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KEVJR0VOX1RFU1RfTUFYX1NJWkUvNCwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFLzQsIEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpKSApKTsKLSAgQ0FMTF9TVUJURVNUXzEwKCggYmRjc3ZkX2Z1bGxfb3B0aW9ucyhNYXQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KEVJR0VOX1RFU1RfTUFYX1NJWkUvNCwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFLzQsIEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpKSApKTsKKyAgQ0FMTF9TVUJURVNUXzkoCisgICAgICAoamFjb2Jpc3ZkX3RoaW5fb3B0aW9ucyhNYXQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KEVJR0VOX1RFU1RfTUFYX1NJWkUgLyA0LCBFSUdFTl9URVNUX01BWF9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oRUlHRU5fVEVTVF9NQVhfU0laRSAvIDQsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKSkpKSk7CisgIENBTExfU1VCVEVTVF85KAorICAgICAgKGphY29iaXN2ZF9mdWxsX29wdGlvbnMoTWF0KGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFIC8gNCwgRUlHRU5fVEVTVF9NQVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KEVJR0VOX1RFU1RfTUFYX1NJWkUgLyA0LCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMikpKSkpOworICBDQUxMX1NVQlRFU1RfMTAoKGJkY3N2ZF90aGluX29wdGlvbnMoTWF0KGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFIC8gNCwgRUlHRU5fVEVTVF9NQVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KEVJR0VOX1RFU1RfTUFYX1NJWkUgLyA0LCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMikpKSkpOworICBDQUxMX1NVQlRFU1RfMTAoKGJkY3N2ZF9mdWxsX29wdGlvbnMoTWF0KGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFIC8gNCwgRUlHRU5fVEVTVF9NQVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KEVJR0VOX1RFU1RfTUFYX1NJWkUgLyA0LCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMikpKSkpOwogCi0gIENBTExfU1VCVEVTVF8xMSgoIHRlc3Rfc2ltcGxpY2lhbF9jaG9sZXNreV9UPFJlYWwsaW50LENvbE1ham9yPigpICkpOworICBDQUxMX1NVQlRFU1RfMTEoKHRlc3Rfc2ltcGxpY2lhbF9jaG9sZXNreV9UPFJlYWwsIGludCwgQ29sTWFqb3I+KCkpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvYnVnMTIxMy5jcHAgYi90ZXN0L2J1ZzEyMTMuY3BwCmluZGV4IDU4MTc2MGMuLjhkYmUxYTggMTAwNjQ0Ci0tLSBhL3Rlc3QvYnVnMTIxMy5jcHAKKysrIGIvdGVzdC9idWcxMjEzLmNwcApAQCAtMSwxMyArMSw3IEBACiAKIC8vIFRoaXMgYW5vbnltb3VzIGVudW0gaXMgZXNzZW50aWFsIHRvIHRyaWdnZXIgdGhlIGxpbmtpbmcgaXNzdWUKLWVudW0gewotICBGb28KLX07CitlbnVtIHsgRm9vIH07CiAKICNpbmNsdWRlICJidWcxMjEzLmgiCiAKLWJvb2wgYnVnMTIxM18xKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgeCkKLXsKLSAgcmV0dXJuIGJ1ZzEyMTNfMih4KTsKLX0KLQorYm9vbCBidWcxMjEzXzEoY29uc3QgRWlnZW46OlZlY3RvcjNmJiB4KSB7IHJldHVybiBidWcxMjEzXzIoeCk7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvYnVnMTIxMy5oIGIvdGVzdC9idWcxMjEzLmgKaW5kZXggMDQwZTVhNC4uNDk2ODdmMiAxMDA2NDQKLS0tIGEvdGVzdC9idWcxMjEzLmgKKysrIGIvdGVzdC9idWcxMjEzLmgKQEAgLTEsOCArMSw3IEBACiAKICNpbmNsdWRlIDxFaWdlbi9Db3JlPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgZGltPgotYm9vbCBidWcxMjEzXzIoY29uc3QgRWlnZW46Ok1hdHJpeDxULGRpbSwxPiYgeCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IGRpbT4KK2Jvb2wgYnVnMTIxM18yKGNvbnN0IEVpZ2VuOjpNYXRyaXg8VCwgZGltLCAxPiYgeCk7CiAKIGJvb2wgYnVnMTIxM18xKGNvbnN0IEVpZ2VuOjpWZWN0b3IzZiYgeCk7Ci0KZGlmZiAtLWdpdCBhL3Rlc3QvYnVnMTIxM19tYWluLmNwcCBiL3Rlc3QvYnVnMTIxM19tYWluLmNwcAppbmRleCA0ODAyYzAwLi4xNjE1MGNmIDEwMDY0NAotLS0gYS90ZXN0L2J1ZzEyMTNfbWFpbi5jcHAKKysrIGIvdGVzdC9idWcxMjEzX21haW4uY3BwCkBAIC0zLDE2ICszLDExIEBACiAKICNpbmNsdWRlICJidWcxMjEzLmgiCiAKLWludCBtYWluKCkKLXsKLSAgcmV0dXJuIDA7Ci19CitpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgZGltPgotYm9vbCBidWcxMjEzXzIoY29uc3QgRWlnZW46Ok1hdHJpeDxULGRpbSwxPiYgKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBkaW0+Citib29sIGJ1ZzEyMTNfMihjb25zdCBFaWdlbjo6TWF0cml4PFQsIGRpbSwgMT4mKSB7CiAgIHJldHVybiB0cnVlOwogfQogCi10ZW1wbGF0ZSBib29sIGJ1ZzEyMTNfMjxmbG9hdCwzPihjb25zdCBFaWdlbjo6VmVjdG9yM2YmKTsKK3RlbXBsYXRlIGJvb2wgYnVnMTIxM18yPGZsb2F0LCAzPihjb25zdCBFaWdlbjo6VmVjdG9yM2YmKTsKZGlmZiAtLWdpdCBhL3Rlc3QvY2hvbGVza3kuY3BwIGIvdGVzdC9jaG9sZXNreS5jcHAKaW5kZXggMGIxYTdiNC4uMWMxZTE4ZSAxMDA2NDQKLS0tIGEvdGVzdC9jaG9sZXNreS5jcHAKKysrIGIvdGVzdC9jaG9sZXNreS5jcHAKQEAgLTE0LDE1ICsxNCwxNSBAQAogI2luY2x1ZGUgPEVpZ2VuL1FSPgogI2luY2x1ZGUgInNvbHZlcmJhc2UuaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFVwTG8+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFVwTG8+CiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIG1hdHJpeF9sMV9ub3JtKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKLSAgaWYobS5jb2xzKCk9PTApIHJldHVybiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyKDApOworICBpZiAobS5jb2xzKCkgPT0gMCkgcmV0dXJuIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIoMCk7CiAgIE1hdHJpeFR5cGUgc3ltbSA9IG0udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwTG8+KCk7CiAgIHJldHVybiBzeW1tLmN3aXNlQWJzKCkuY29sd2lzZSgpLnN1bSgpLm1heENvZWZmKCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsdGVtcGxhdGUgPHR5cGVuYW1lLGludD4gY2xhc3MgQ2hvbFR5cGU+IHZvaWQgdGVzdF9jaG9sX3VwZGF0ZShjb25zdCBNYXRyaXhUeXBlJiBzeW1tKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHRlbXBsYXRlIDx0eXBlbmFtZSwgaW50PiBjbGFzcyBDaG9sVHlwZT4KK3ZvaWQgdGVzdF9jaG9sX3VwZGF0ZShjb25zdCBNYXRyaXhUeXBlJiBzeW1tKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CkBAIC0zMSwxOSArMzEsMTcgQEAKICAgTWF0cml4VHlwZSBzeW1tVXAgPSBzeW1tLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOwogICBNYXRyaXhUeXBlIHN5bW1DcHkgPSBzeW1tOwogCi0gIENob2xUeXBlPE1hdHJpeFR5cGUsTG93ZXI+IGNob2xsbyhzeW1tTG8pOwotICBDaG9sVHlwZTxNYXRyaXhUeXBlLFVwcGVyPiBjaG9sdXAoc3ltbVVwKTsKKyAgQ2hvbFR5cGU8TWF0cml4VHlwZSwgTG93ZXI+IGNob2xsbyhzeW1tTG8pOworICBDaG9sVHlwZTxNYXRyaXhUeXBlLCBVcHBlcj4gY2hvbHVwKHN5bW1VcCk7CiAKLSAgZm9yIChpbnQgaz0wOyBrPDEwOyArK2spCi0gIHsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCAxMDsgKytrKSB7CiAgICAgVmVjdG9yVHlwZSB2ZWMgPSBWZWN0b3JUeXBlOjpSYW5kb20oc3ltbS5yb3dzKCkpOwogICAgIFJlYWxTY2FsYXIgc2lnbWEgPSBpbnRlcm5hbDo6cmFuZG9tPFJlYWxTY2FsYXI+KCk7CiAgICAgc3ltbUNweSArPSBzaWdtYSAqIHZlYyAqIHZlYy5hZGpvaW50KCk7CiAKICAgICAvLyB3ZSBhcmUgZG9pbmcgc29tZSBkb3duZGF0ZXMsIHNvIGl0IG1pZ2h0IGJlIHRoZSBjYXNlIHRoYXQgdGhlIG1hdHJpeCBpcyBub3QgU1BEIGFueW1vcmUKLSAgICBDaG9sVHlwZTxNYXRyaXhUeXBlLExvd2VyPiBjaG9sKHN5bW1DcHkpOwotICAgIGlmKGNob2wuaW5mbygpIT1TdWNjZXNzKQotICAgICAgYnJlYWs7CisgICAgQ2hvbFR5cGU8TWF0cml4VHlwZSwgTG93ZXI+IGNob2woc3ltbUNweSk7CisgICAgaWYgKGNob2wuaW5mbygpICE9IFN1Y2Nlc3MpIGJyZWFrOwogCiAgICAgY2hvbGxvLnJhbmtVcGRhdGUodmVjLCBzaWdtYSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tQ3B5LCBjaG9sbG8ucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKQEAgLTUzLDggKzUxLDggQEAKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNob2xlc2t5KGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY2hvbGVza3koY29uc3QgTWF0cml4VHlwZSYgbSkgewogICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CiAgICAgIExMVC5oIExETFQuaAogICAqLwpAQCAtNjYsNDAgKzY0LDM5IEBACiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBTcXVhcmVNYXRyaXhUeXBlOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOwogCi0gIE1hdHJpeFR5cGUgYTAgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBhMCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKICAgVmVjdG9yVHlwZSB2ZWNCID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLCB2ZWNYKHJvd3MpOwotICBNYXRyaXhUeXBlIG1hdEIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSwgbWF0WChyb3dzLGNvbHMpOwotICBTcXVhcmVNYXRyaXhUeXBlIHN5bW0gPSAgYTAgKiBhMC5hZGpvaW50KCk7CisgIE1hdHJpeFR5cGUgbWF0QiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbWF0WChyb3dzLCBjb2xzKTsKKyAgU3F1YXJlTWF0cml4VHlwZSBzeW1tID0gYTAgKiBhMC5hZGpvaW50KCk7CiAgIC8vIGxldCdzIG1ha2Ugc3VyZSB0aGUgbWF0cml4IGlzIG5vdCBzaW5ndWxhciBvciBuZWFyIHNpbmd1bGFyCi0gIGZvciAoaW50IGs9MDsgazwzOyArK2spCi0gIHsKLSAgICBNYXRyaXhUeXBlIGExID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgMzsgKytrKSB7CisgICAgTWF0cml4VHlwZSBhMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKICAgICBzeW1tICs9IGExICogYTEuYWRqb2ludCgpOwogICB9CiAKICAgewotICAgIFNUQVRJQ19DSEVDSygoIGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIExMVDxNYXRyaXhUeXBlLExvd2VyPjo6U3RvcmFnZUluZGV4LGludD46OnZhbHVlICkpOwotICAgIFNUQVRJQ19DSEVDSygoIGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIExMVDxNYXRyaXhUeXBlLFVwcGVyPjo6U3RvcmFnZUluZGV4LGludD46OnZhbHVlICkpOworICAgIFNUQVRJQ19DSEVDSygoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgTExUPE1hdHJpeFR5cGUsIExvd2VyPjo6U3RvcmFnZUluZGV4LCBpbnQ+Ojp2YWx1ZSkpOworICAgIFNUQVRJQ19DSEVDSygoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgTExUPE1hdHJpeFR5cGUsIFVwcGVyPjo6U3RvcmFnZUluZGV4LCBpbnQ+Ojp2YWx1ZSkpOwogCiAgICAgU3F1YXJlTWF0cml4VHlwZSBzeW1tVXAgPSBzeW1tLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOwogICAgIFNxdWFyZU1hdHJpeFR5cGUgc3ltbUxvID0gc3ltbS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKIAotICAgIExMVDxTcXVhcmVNYXRyaXhUeXBlLExvd2VyPiBjaG9sbG8oc3ltbUxvKTsKKyAgICBMTFQ8U3F1YXJlTWF0cml4VHlwZSwgTG93ZXI+IGNob2xsbyhzeW1tTG8pOwogICAgIFZFUklGWV9JU19BUFBST1goc3ltbSwgY2hvbGxvLnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CiAKICAgICBjaGVja19zb2x2ZXJiYXNlPFZlY3RvclR5cGUsIFZlY3RvclR5cGU+KHN5bW0sIGNob2xsbywgcm93cywgcm93cywgMSk7CiAgICAgY2hlY2tfc29sdmVyYmFzZTxNYXRyaXhUeXBlLCBNYXRyaXhUeXBlPihzeW1tLCBjaG9sbG8sIHJvd3MsIGNvbHMsIHJvd3MpOwogCi0gICAgY29uc3QgTWF0cml4VHlwZSBzeW1tTG9faW52ZXJzZSA9IGNob2xsby5zb2x2ZShNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLGNvbHMpKTsKLSAgICBSZWFsU2NhbGFyIHJjb25kID0gKFJlYWxTY2FsYXIoMSkgLyBtYXRyaXhfbDFfbm9ybTxNYXRyaXhUeXBlLCBMb3dlcj4oc3ltbUxvKSkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhfbDFfbm9ybTxNYXRyaXhUeXBlLCBMb3dlcj4oc3ltbUxvX2ludmVyc2UpOworICAgIGNvbnN0IE1hdHJpeFR5cGUgc3ltbUxvX2ludmVyc2UgPSBjaG9sbG8uc29sdmUoTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgY29scykpOworICAgIFJlYWxTY2FsYXIgcmNvbmQgPQorICAgICAgICAoUmVhbFNjYWxhcigxKSAvIG1hdHJpeF9sMV9ub3JtPE1hdHJpeFR5cGUsIExvd2VyPihzeW1tTG8pKSAvIG1hdHJpeF9sMV9ub3JtPE1hdHJpeFR5cGUsIExvd2VyPihzeW1tTG9faW52ZXJzZSk7CiAgICAgUmVhbFNjYWxhciByY29uZF9lc3QgPSBjaG9sbG8ucmNvbmQoKTsKICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZXN0aW1hdGVkIGNvbmRpdGlvbiBudW1iZXIgaXMgd2l0aGluIGEgZmFjdG9yIG9mIDEwIG9mIHRoZQogICAgIC8vIHRydXRoLgogICAgIFZFUklGWShyY29uZF9lc3QgPj0gcmNvbmQgLyAxMCAmJiByY29uZF9lc3QgPD0gcmNvbmQgKiAxMCk7CiAKICAgICAvLyB0ZXN0IHRoZSB1cHBlciBtb2RlCi0gICAgTExUPFNxdWFyZU1hdHJpeFR5cGUsVXBwZXI+IGNob2x1cChzeW1tVXApOworICAgIExMVDxTcXVhcmVNYXRyaXhUeXBlLCBVcHBlcj4gY2hvbHVwKHN5bW1VcCk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChzeW1tLCBjaG9sdXAucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKICAgICB2ZWNYID0gY2hvbHVwLnNvbHZlKHZlY0IpOwogICAgIFZFUklGWV9JU19BUFBST1goc3ltbSAqIHZlY1gsIHZlY0IpOwpAQCAtMTA4LDE2ICsxMDUsMTUgQEAKIAogICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBlc3RpbWF0ZWQgY29uZGl0aW9uIG51bWJlciBpcyB3aXRoaW4gYSBmYWN0b3Igb2YgMTAgb2YgdGhlCiAgICAgLy8gdHJ1dGguCi0gICAgY29uc3QgTWF0cml4VHlwZSBzeW1tVXBfaW52ZXJzZSA9IGNob2x1cC5zb2x2ZShNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLGNvbHMpKTsKLSAgICByY29uZCA9IChSZWFsU2NhbGFyKDEpIC8gbWF0cml4X2wxX25vcm08TWF0cml4VHlwZSwgVXBwZXI+KHN5bW1VcCkpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4X2wxX25vcm08TWF0cml4VHlwZSwgVXBwZXI+KHN5bW1VcF9pbnZlcnNlKTsKKyAgICBjb25zdCBNYXRyaXhUeXBlIHN5bW1VcF9pbnZlcnNlID0gY2hvbHVwLnNvbHZlKE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIGNvbHMpKTsKKyAgICByY29uZCA9CisgICAgICAgIChSZWFsU2NhbGFyKDEpIC8gbWF0cml4X2wxX25vcm08TWF0cml4VHlwZSwgVXBwZXI+KHN5bW1VcCkpIC8gbWF0cml4X2wxX25vcm08TWF0cml4VHlwZSwgVXBwZXI+KHN5bW1VcF9pbnZlcnNlKTsKICAgICByY29uZF9lc3QgPSBjaG9sdXAucmNvbmQoKTsKICAgICBWRVJJRlkocmNvbmRfZXN0ID49IHJjb25kIC8gMTAgJiYgcmNvbmRfZXN0IDw9IHJjb25kICogMTApOwogCi0KICAgICBNYXRyaXhUeXBlIG5lZyA9IC1zeW1tTG87CiAgICAgY2hvbGxvLmNvbXB1dGUobmVnKTsKLSAgICBWRVJJRlkobmVnLnNpemUoKT09MCB8fCBjaG9sbG8uaW5mbygpPT1OdW1lcmljYWxJc3N1ZSk7CisgICAgVkVSSUZZKG5lZy5zaXplKCkgPT0gMCB8fCBjaG9sbG8uaW5mbygpID09IE51bWVyaWNhbElzc3VlKTsKIAogICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShjaG9sbG8ubWF0cml4TCgpLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpKSwgTWF0cml4VHlwZShjaG9sbG8ubWF0cml4VSgpKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlKGNob2xsby5tYXRyaXhVKCkudHJhbnNwb3NlKCkuY29uanVnYXRlKCkpLCBNYXRyaXhUeXBlKGNob2xsby5tYXRyaXhMKCkpKTsKQEAgLTEyNSw3ICsxMjEsNyBAQAogICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShjaG9sdXAubWF0cml4VSgpLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpKSwgTWF0cml4VHlwZShjaG9sdXAubWF0cml4TCgpKSk7CiAKICAgICAvLyB0ZXN0IHNvbWUgc3BlY2lhbCB1c2UgY2FzZXMgb2YgU2VsZkN3aXNlQmluYXJ5T3A6Ci0gICAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpLCBtMihyb3dzLGNvbHMpOworICAgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0yKHJvd3MsIGNvbHMpOwogICAgIG0yID0gbTE7CiAgICAgbTIgKz0gc3ltbUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5sbHQoKS5zb2x2ZShtYXRCKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMSArIHN5bW1Mby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkubGx0KCkuc29sdmUobWF0QikpOwpAQCAtMTQyLDM3ICsxMzgsMzUgQEAKIAogICAvLyBMRExUCiAgIHsKLSAgICBTVEFUSUNfQ0hFQ0soKCBpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBMRExUPE1hdHJpeFR5cGUsTG93ZXI+OjpTdG9yYWdlSW5kZXgsaW50Pjo6dmFsdWUgKSk7Ci0gICAgU1RBVElDX0NIRUNLKCggaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgTERMVDxNYXRyaXhUeXBlLFVwcGVyPjo6U3RvcmFnZUluZGV4LGludD46OnZhbHVlICkpOworICAgIFNUQVRJQ19DSEVDSygoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgTERMVDxNYXRyaXhUeXBlLCBMb3dlcj46OlN0b3JhZ2VJbmRleCwgaW50Pjo6dmFsdWUpKTsKKyAgICBTVEFUSUNfQ0hFQ0soKGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIExETFQ8TWF0cml4VHlwZSwgVXBwZXI+OjpTdG9yYWdlSW5kZXgsIGludD46OnZhbHVlKSk7CiAKLSAgICBpbnQgc2lnbiA9IGludGVybmFsOjpyYW5kb208aW50PigpJTIgPyAxIDogLTE7CisgICAgaW50IHNpZ24gPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oKSAlIDIgPyAxIDogLTE7CiAKLSAgICBpZihzaWduID09IC0xKQotICAgIHsKLSAgICAgIHN5bW0gPSAtc3ltbTsgLy8gdGVzdCBhIG5lZ2F0aXZlIG1hdHJpeAorICAgIGlmIChzaWduID09IC0xKSB7CisgICAgICBzeW1tID0gLXN5bW07ICAvLyB0ZXN0IGEgbmVnYXRpdmUgbWF0cml4CiAgICAgfQogCiAgICAgU3F1YXJlTWF0cml4VHlwZSBzeW1tVXAgPSBzeW1tLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOwogICAgIFNxdWFyZU1hdHJpeFR5cGUgc3ltbUxvID0gc3ltbS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKIAotICAgIExETFQ8U3F1YXJlTWF0cml4VHlwZSxMb3dlcj4gbGRsdGxvKHN5bW1Mbyk7Ci0gICAgVkVSSUZZKGxkbHRsby5pbmZvKCk9PVN1Y2Nlc3MpOworICAgIExETFQ8U3F1YXJlTWF0cml4VHlwZSwgTG93ZXI+IGxkbHRsbyhzeW1tTG8pOworICAgIFZFUklGWShsZGx0bG8uaW5mbygpID09IFN1Y2Nlc3MpOwogICAgIFZFUklGWV9JU19BUFBST1goc3ltbSwgbGRsdGxvLnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CiAKICAgICBjaGVja19zb2x2ZXJiYXNlPFZlY3RvclR5cGUsIFZlY3RvclR5cGU+KHN5bW0sIGxkbHRsbywgcm93cywgcm93cywgMSk7CiAgICAgY2hlY2tfc29sdmVyYmFzZTxNYXRyaXhUeXBlLCBNYXRyaXhUeXBlPihzeW1tLCBsZGx0bG8sIHJvd3MsIGNvbHMsIHJvd3MpOwogCi0gICAgY29uc3QgTWF0cml4VHlwZSBzeW1tTG9faW52ZXJzZSA9IGxkbHRsby5zb2x2ZShNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLGNvbHMpKTsKLSAgICBSZWFsU2NhbGFyIHJjb25kID0gKFJlYWxTY2FsYXIoMSkgLyBtYXRyaXhfbDFfbm9ybTxNYXRyaXhUeXBlLCBMb3dlcj4oc3ltbUxvKSkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhfbDFfbm9ybTxNYXRyaXhUeXBlLCBMb3dlcj4oc3ltbUxvX2ludmVyc2UpOworICAgIGNvbnN0IE1hdHJpeFR5cGUgc3ltbUxvX2ludmVyc2UgPSBsZGx0bG8uc29sdmUoTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgY29scykpOworICAgIFJlYWxTY2FsYXIgcmNvbmQgPQorICAgICAgICAoUmVhbFNjYWxhcigxKSAvIG1hdHJpeF9sMV9ub3JtPE1hdHJpeFR5cGUsIExvd2VyPihzeW1tTG8pKSAvIG1hdHJpeF9sMV9ub3JtPE1hdHJpeFR5cGUsIExvd2VyPihzeW1tTG9faW52ZXJzZSk7CiAgICAgUmVhbFNjYWxhciByY29uZF9lc3QgPSBsZGx0bG8ucmNvbmQoKTsKICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZXN0aW1hdGVkIGNvbmRpdGlvbiBudW1iZXIgaXMgd2l0aGluIGEgZmFjdG9yIG9mIDEwIG9mIHRoZQogICAgIC8vIHRydXRoLgogICAgIFZFUklGWShyY29uZF9lc3QgPj0gcmNvbmQgLyAxMCAmJiByY29uZF9lc3QgPD0gcmNvbmQgKiAxMCk7CiAKLQotICAgIExETFQ8U3F1YXJlTWF0cml4VHlwZSxVcHBlcj4gbGRsdHVwKHN5bW1VcCk7Ci0gICAgVkVSSUZZKGxkbHR1cC5pbmZvKCk9PVN1Y2Nlc3MpOworICAgIExETFQ8U3F1YXJlTWF0cml4VHlwZSwgVXBwZXI+IGxkbHR1cChzeW1tVXApOworICAgIFZFUklGWShsZGx0dXAuaW5mbygpID09IFN1Y2Nlc3MpOwogICAgIFZFUklGWV9JU19BUFBST1goc3ltbSwgbGRsdHVwLnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CiAgICAgdmVjWCA9IGxkbHR1cC5zb2x2ZSh2ZWNCKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0gKiB2ZWNYLCB2ZWNCKTsKQEAgLTE4MSw5ICsxNzUsOSBAQAogCiAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGVzdGltYXRlZCBjb25kaXRpb24gbnVtYmVyIGlzIHdpdGhpbiBhIGZhY3RvciBvZiAxMCBvZiB0aGUKICAgICAvLyB0cnV0aC4KLSAgICBjb25zdCBNYXRyaXhUeXBlIHN5bW1VcF9pbnZlcnNlID0gbGRsdHVwLnNvbHZlKE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsY29scykpOwotICAgIHJjb25kID0gKFJlYWxTY2FsYXIoMSkgLyBtYXRyaXhfbDFfbm9ybTxNYXRyaXhUeXBlLCBVcHBlcj4oc3ltbVVwKSkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhfbDFfbm9ybTxNYXRyaXhUeXBlLCBVcHBlcj4oc3ltbVVwX2ludmVyc2UpOworICAgIGNvbnN0IE1hdHJpeFR5cGUgc3ltbVVwX2ludmVyc2UgPSBsZGx0dXAuc29sdmUoTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgY29scykpOworICAgIHJjb25kID0KKyAgICAgICAgKFJlYWxTY2FsYXIoMSkgLyBtYXRyaXhfbDFfbm9ybTxNYXRyaXhUeXBlLCBVcHBlcj4oc3ltbVVwKSkgLyBtYXRyaXhfbDFfbm9ybTxNYXRyaXhUeXBlLCBVcHBlcj4oc3ltbVVwX2ludmVyc2UpOwogICAgIHJjb25kX2VzdCA9IGxkbHR1cC5yY29uZCgpOwogICAgIFZFUklGWShyY29uZF9lc3QgPj0gcmNvbmQgLyAxMCAmJiByY29uZF9lc3QgPD0gcmNvbmQgKiAxMCk7CiAKQEAgLTE5Miw4ICsxODYsNyBAQAogICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShsZGx0dXAubWF0cml4TCgpLnRyYW5zcG9zZSgpLmNvbmp1Z2F0ZSgpKSwgTWF0cml4VHlwZShsZGx0dXAubWF0cml4VSgpKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlKGxkbHR1cC5tYXRyaXhVKCkudHJhbnNwb3NlKCkuY29uanVnYXRlKCkpLCBNYXRyaXhUeXBlKGxkbHR1cC5tYXRyaXhMKCkpKTsKIAotICAgIGlmKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljKQotICAgIHsKKyAgICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykgewogICAgICAgLy8gbm90ZSA6IGVhY2ggaW5wbGFjZSBwZXJtdXRhdGlvbiByZXF1aXJlcyBhIHNtYWxsIHRlbXBvcmFyeSB2ZWN0b3IgKG1hc2spCiAKICAgICAgIC8vIGNoZWNrIGlucGxhY2Ugc29sdmUKQEAgLTIwMSwyMiArMTk0LDE5IEBACiAgICAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtYXRYID0gbGRsdGxvLnNvbHZlKG1hdFgpLCAwKTsKICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0WCwgbGRsdGxvLnNvbHZlKG1hdEIpLmV2YWwoKSk7CiAKLQogICAgICAgbWF0WCA9IG1hdEI7CiAgICAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtYXRYID0gbGRsdHVwLnNvbHZlKG1hdFgpLCAwKTsKICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0WCwgbGRsdHVwLnNvbHZlKG1hdEIpLmV2YWwoKSk7CiAgICAgfQogCiAgICAgLy8gcmVzdG9yZQotICAgIGlmKHNpZ24gPT0gLTEpCi0gICAgICBzeW1tID0gLXN5bW07CisgICAgaWYgKHNpZ24gPT0gLTEpIHN5bW0gPSAtc3ltbTsKIAogICAgIC8vIGNoZWNrIG1hdHJpY2VzIGNvbWluZyBmcm9tIGxpbmVhciBjb25zdHJhaW50cyB3aXRoIExhZ3JhbmdlIG11bHRpcGxpZXJzCi0gICAgaWYocm93cz49MykKLSAgICB7CisgICAgaWYgKHJvd3MgPj0gMykgewogICAgICAgU3F1YXJlTWF0cml4VHlwZSBBID0gc3ltbTsKLSAgICAgIEluZGV4IGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMik7Ci0gICAgICBBLmJvdHRvbVJpZ2h0Q29ybmVyKGMsYykuc2V0WmVybygpOworICAgICAgSW5kZXggYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAyKTsKKyAgICAgIEEuYm90dG9tUmlnaHRDb3JuZXIoYywgYykuc2V0WmVybygpOwogICAgICAgLy8gTWFrZSBzdXJlIGEgc29sdXRpb24gZXhpc3RzOgogICAgICAgdmVjWC5zZXRSYW5kb20oKTsKICAgICAgIHZlY0IgPSBBICogdmVjWDsKQEAgLTIyOCwxMCArMjE4LDkgQEAKICAgICB9CiAKICAgICAvLyBjaGVjayBub24tZnVsbCByYW5rIG1hdHJpY2VzCi0gICAgaWYocm93cz49MykKLSAgICB7Ci0gICAgICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxyb3dzLTEpOwotICAgICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGEgPSBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz46OlJhbmRvbShyb3dzLHIpOworICAgIGlmIChyb3dzID49IDMpIHsKKyAgICAgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCByb3dzIC0gMSk7CisgICAgICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBhID0gTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz46OlJhbmRvbShyb3dzLCByKTsKICAgICAgIFNxdWFyZU1hdHJpeFR5cGUgQSA9IGEgKiBhLmFkam9pbnQoKTsKICAgICAgIC8vIE1ha2Ugc3VyZSBhIHNvbHV0aW9uIGV4aXN0czoKICAgICAgIHZlY1guc2V0UmFuZG9tKCk7CkBAIC0yNDQsMTUgKzIzMywxMyBAQAogICAgIH0KIAogICAgIC8vIGNoZWNrIG1hdHJpY2VzIHdpdGggYSB3aWRlIHNwZWN0cnVtCi0gICAgaWYocm93cz49MykKLSAgICB7CisgICAgaWYgKHJvd3MgPj0gMykgewogICAgICAgdXNpbmcgc3RkOjpwb3c7CiAgICAgICB1c2luZyBzdGQ6OnNxcnQ7Ci0gICAgICBSZWFsU2NhbGFyIHMgPSAoc3RkOjptaW4pKDE2LHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1heF9leHBvbmVudDEwLzgpOwotICAgICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGEgPSBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz46OlJhbmRvbShyb3dzLHJvd3MpOwotICAgICAgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYywxPiBkID0gIE1hdHJpeDxSZWFsU2NhbGFyLER5bmFtaWMsMT46OlJhbmRvbShyb3dzKTsKLSAgICAgIGZvcihJbmRleCBrPTA7IGs8cm93czsgKytrKQotICAgICAgICBkKGspID0gZChrKSpwb3coUmVhbFNjYWxhcigxMCksaW50ZXJuYWw6OnJhbmRvbTxSZWFsU2NhbGFyPigtcyxzKSk7CisgICAgICBSZWFsU2NhbGFyIHMgPSAoc3RkOjptaW4pKDE2LCBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptYXhfZXhwb25lbnQxMCAvIDgpOworICAgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gYSA9IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+OjpSYW5kb20ocm93cywgcm93cyk7CisgICAgICBNYXRyaXg8UmVhbFNjYWxhciwgRHluYW1pYywgMT4gZCA9IE1hdHJpeDxSZWFsU2NhbGFyLCBEeW5hbWljLCAxPjo6UmFuZG9tKHJvd3MpOworICAgICAgZm9yIChJbmRleCBrID0gMDsgayA8IHJvd3M7ICsraykgZChrKSA9IGQoaykgKiBwb3coUmVhbFNjYWxhcigxMCksIGludGVybmFsOjpyYW5kb208UmVhbFNjYWxhcj4oLXMsIHMpKTsKICAgICAgIFNxdWFyZU1hdHJpeFR5cGUgQSA9IGEgKiBkLmFzRGlhZ29uYWwoKSAqIGEuYWRqb2ludCgpOwogICAgICAgLy8gTWFrZSBzdXJlIGEgc29sdXRpb24gZXhpc3RzOgogICAgICAgdmVjWC5zZXRSYW5kb20oKTsKQEAgLTI2MiwyOSArMjQ5LDI2IEBACiAgICAgICBWRVJJRllfSVNfQVBQUk9YKEEsIGxkbHRsby5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOwogICAgICAgdmVjWCA9IGxkbHRsby5zb2x2ZSh2ZWNCKTsKIAotICAgICAgaWYobGRsdGxvLnZlY3RvckQoKS5yZWFsKCkuY3dpc2VBYnMoKS5taW5Db2VmZigpPlJlYWxTY2FsYXIoMCkpCi0gICAgICB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1goQSAqIHZlY1gsdmVjQik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFJlYWxTY2FsYXIgbGFyZ2VfdG9sID0gIHNxcnQodGVzdF9wcmVjaXNpb248UmVhbFNjYWxhcj4oKSk7CisgICAgICBpZiAobGRsdGxvLnZlY3RvckQoKS5yZWFsKCkuY3dpc2VBYnMoKS5taW5Db2VmZigpID4gUmVhbFNjYWxhcigwKSkgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKEEgKiB2ZWNYLCB2ZWNCKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFJlYWxTY2FsYXIgbGFyZ2VfdG9sID0gc3FydCh0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpKTsKICAgICAgICAgVkVSSUZZKChBICogdmVjWCkuaXNBcHByb3godmVjQiwgbGFyZ2VfdG9sKSk7CiAKICAgICAgICAgKytnX3Rlc3RfbGV2ZWw7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1goQSAqIHZlY1gsdmVjQik7CisgICAgICAgIFZFUklGWV9JU19BUFBST1goQSAqIHZlY1gsIHZlY0IpOwogICAgICAgICAtLWdfdGVzdF9sZXZlbDsKICAgICAgIH0KICAgICB9CiAgIH0KIAogICAvLyB1cGRhdGUvZG93bmRhdGUKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9jaG9sX3VwZGF0ZTxTcXVhcmVNYXRyaXhUeXBlLExMVD4oc3ltbSkgICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2Nob2xfdXBkYXRlPFNxdWFyZU1hdHJpeFR5cGUsTERMVD4oc3ltbSkgKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9jaG9sX3VwZGF0ZTxTcXVhcmVNYXRyaXhUeXBlLCBMTFQ+KHN5bW0pKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9jaG9sX3VwZGF0ZTxTcXVhcmVNYXRyaXhUeXBlLCBMRExUPihzeW1tKSkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNob2xlc2t5X2NwbHgoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjaG9sZXNreV9jcGx4KGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgLy8gY2xhc3NpYyB0ZXN0CiAgIGNob2xlc2t5KG0pOwogCkBAIC0yOTgsNTAgKzI4Miw0OCBAQAogICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IFJlYWxNYXRyaXhUeXBlOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOwogCi0gIFJlYWxNYXRyaXhUeXBlIGEwID0gUmVhbE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBSZWFsTWF0cml4VHlwZSBhMCA9IFJlYWxNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CiAgIFZlY3RvclR5cGUgdmVjQiA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwgdmVjWChyb3dzKTsKLSAgTWF0cml4VHlwZSBtYXRCID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIG1hdFgocm93cyxjb2xzKTsKLSAgUmVhbE1hdHJpeFR5cGUgc3ltbSA9ICBhMCAqIGEwLmFkam9pbnQoKTsKKyAgTWF0cml4VHlwZSBtYXRCID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtYXRYKHJvd3MsIGNvbHMpOworICBSZWFsTWF0cml4VHlwZSBzeW1tID0gYTAgKiBhMC5hZGpvaW50KCk7CiAgIC8vIGxldCdzIG1ha2Ugc3VyZSB0aGUgbWF0cml4IGlzIG5vdCBzaW5ndWxhciBvciBuZWFyIHNpbmd1bGFyCi0gIGZvciAoaW50IGs9MDsgazwzOyArK2spCi0gIHsKLSAgICBSZWFsTWF0cml4VHlwZSBhMSA9IFJlYWxNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyArK2spIHsKKyAgICBSZWFsTWF0cml4VHlwZSBhMSA9IFJlYWxNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CiAgICAgc3ltbSArPSBhMSAqIGExLmFkam9pbnQoKTsKICAgfQogCiAgIHsKICAgICBSZWFsTWF0cml4VHlwZSBzeW1tTG8gPSBzeW1tLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOwogCi0gICAgTExUPFJlYWxNYXRyaXhUeXBlLExvd2VyPiBjaG9sbG8oc3ltbUxvKTsKKyAgICBMTFQ8UmVhbE1hdHJpeFR5cGUsIExvd2VyPiBjaG9sbG8oc3ltbUxvKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0sIGNob2xsby5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOwogCiAgICAgY2hlY2tfc29sdmVyYmFzZTxWZWN0b3JUeXBlLCBWZWN0b3JUeXBlPihzeW1tLCBjaG9sbG8sIHJvd3MsIHJvd3MsIDEpOwotICAgIC8vY2hlY2tfc29sdmVyYmFzZTxNYXRyaXhUeXBlLCBNYXRyaXhUeXBlPihzeW1tLCBjaG9sbG8sIHJvd3MsIGNvbHMsIHJvd3MpOworICAgIC8vIGNoZWNrX3NvbHZlcmJhc2U8TWF0cml4VHlwZSwgTWF0cml4VHlwZT4oc3ltbSwgY2hvbGxvLCByb3dzLCBjb2xzLCByb3dzKTsKICAgfQogCiAgIC8vIExETFQKICAgewotICAgIGludCBzaWduID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KCklMiA/IDEgOiAtMTsKKyAgICBpbnQgc2lnbiA9IGludGVybmFsOjpyYW5kb208aW50PigpICUgMiA/IDEgOiAtMTsKIAotICAgIGlmKHNpZ24gPT0gLTEpCi0gICAgewotICAgICAgc3ltbSA9IC1zeW1tOyAvLyB0ZXN0IGEgbmVnYXRpdmUgbWF0cml4CisgICAgaWYgKHNpZ24gPT0gLTEpIHsKKyAgICAgIHN5bW0gPSAtc3ltbTsgIC8vIHRlc3QgYSBuZWdhdGl2ZSBtYXRyaXgKICAgICB9CiAKICAgICBSZWFsTWF0cml4VHlwZSBzeW1tTG8gPSBzeW1tLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOwogCi0gICAgTERMVDxSZWFsTWF0cml4VHlwZSxMb3dlcj4gbGRsdGxvKHN5bW1Mbyk7Ci0gICAgVkVSSUZZKGxkbHRsby5pbmZvKCk9PVN1Y2Nlc3MpOworICAgIExETFQ8UmVhbE1hdHJpeFR5cGUsIExvd2VyPiBsZGx0bG8oc3ltbUxvKTsKKyAgICBWRVJJRlkobGRsdGxvLmluZm8oKSA9PSBTdWNjZXNzKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHN5bW0sIGxkbHRsby5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOwogCiAgICAgY2hlY2tfc29sdmVyYmFzZTxWZWN0b3JUeXBlLCBWZWN0b3JUeXBlPihzeW1tLCBsZGx0bG8sIHJvd3MsIHJvd3MsIDEpOwotICAgIC8vY2hlY2tfc29sdmVyYmFzZTxNYXRyaXhUeXBlLCBNYXRyaXhUeXBlPihzeW1tLCBsZGx0bG8sIHJvd3MsIGNvbHMsIHJvd3MpOworICAgIC8vIGNoZWNrX3NvbHZlcmJhc2U8TWF0cml4VHlwZSwgTWF0cml4VHlwZT4oc3ltbSwgbGRsdGxvLCByb3dzLCBjb2xzLCByb3dzKTsKICAgfQogfQogCiAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyNDEKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgY2hvbGVza3lfYnVnMjQxKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY2hvbGVza3lfYnVnMjQxKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgZWlnZW5fYXNzZXJ0KG0ucm93cygpID09IDIgJiYgbS5jb2xzKCkgPT0gMik7CiAKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwpAQCAtMzU4LDggKzM0MCw4IEBACiAvLyBMRExUIGlzIG5vdCBndWFyYW50ZWVkIHRvIHdvcmsgZm9yIGluZGVmaW5pdGUgbWF0cmljZXMsIGJ1dCBoYXBwZW5zIHRvIHdvcmsgZmluZSBpZiBtYXRyaXggaXMgZGlhZ29uYWwuCiAvLyBUaGlzIHRlc3QgY2hlY2tzIHRoYXQgTERMVCByZXBvcnRzIGNvcnJlY3RseSB0aGF0IG1hdHJpeCBpcyBpbmRlZmluaXRlLgogLy8gU2VlIGh0dHA6Ly9mb3J1bS5rZGUub3JnL3ZpZXd0b3BpYy5waHA/Zj03NCZ0PTEwNjk0MiBhbmQgYnVnIDczNgotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBjaG9sZXNreV9kZWZpbml0ZW5lc3MoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjaG9sZXNreV9kZWZpbml0ZW5lc3MoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICBlaWdlbl9hc3NlcnQobS5yb3dzKCkgPT0gMiAmJiBtLmNvbHMoKSA9PSAyKTsKICAgTWF0cml4VHlwZSBtYXQ7CiAgIExETFQ8TWF0cml4VHlwZT4gbGRsdCgyKTsKQEAgLTM2NywxMDkgKzM0OSw5NiBAQAogICB7CiAgICAgbWF0IDw8IDEsIDAsIDAsIC0xOwogICAgIGxkbHQuY29tcHV0ZShtYXQpOwotICAgIFZFUklGWShsZGx0LmluZm8oKT09U3VjY2Vzcyk7CisgICAgVkVSSUZZKGxkbHQuaW5mbygpID09IFN1Y2Nlc3MpOwogICAgIFZFUklGWSghbGRsdC5pc05lZ2F0aXZlKCkpOwogICAgIFZFUklGWSghbGRsdC5pc1Bvc2l0aXZlKCkpOwotICAgIFZFUklGWV9JU19BUFBST1gobWF0LGxkbHQucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1hdCwgbGRsdC5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOwogICB9CiAgIHsKICAgICBtYXQgPDwgMSwgMiwgMiwgMTsKICAgICBsZGx0LmNvbXB1dGUobWF0KTsKLSAgICBWRVJJRlkobGRsdC5pbmZvKCk9PVN1Y2Nlc3MpOworICAgIFZFUklGWShsZGx0LmluZm8oKSA9PSBTdWNjZXNzKTsKICAgICBWRVJJRlkoIWxkbHQuaXNOZWdhdGl2ZSgpKTsKICAgICBWRVJJRlkoIWxkbHQuaXNQb3NpdGl2ZSgpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG1hdCxsZGx0LnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQsIGxkbHQucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKICAgfQogICB7CiAgICAgbWF0IDw8IDAsIDAsIDAsIDA7CiAgICAgbGRsdC5jb21wdXRlKG1hdCk7Ci0gICAgVkVSSUZZKGxkbHQuaW5mbygpPT1TdWNjZXNzKTsKKyAgICBWRVJJRlkobGRsdC5pbmZvKCkgPT0gU3VjY2Vzcyk7CiAgICAgVkVSSUZZKGxkbHQuaXNOZWdhdGl2ZSgpKTsKICAgICBWRVJJRlkobGRsdC5pc1Bvc2l0aXZlKCkpOwotICAgIFZFUklGWV9JU19BUFBST1gobWF0LGxkbHQucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1hdCwgbGRsdC5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOwogICB9CiAgIHsKICAgICBtYXQgPDwgMCwgMCwgMCwgMTsKICAgICBsZGx0LmNvbXB1dGUobWF0KTsKLSAgICBWRVJJRlkobGRsdC5pbmZvKCk9PVN1Y2Nlc3MpOworICAgIFZFUklGWShsZGx0LmluZm8oKSA9PSBTdWNjZXNzKTsKICAgICBWRVJJRlkoIWxkbHQuaXNOZWdhdGl2ZSgpKTsKICAgICBWRVJJRlkobGRsdC5pc1Bvc2l0aXZlKCkpOwotICAgIFZFUklGWV9JU19BUFBST1gobWF0LGxkbHQucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1hdCwgbGRsdC5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOwogICB9CiAgIHsKICAgICBtYXQgPDwgLTEsIDAsIDAsIDA7CiAgICAgbGRsdC5jb21wdXRlKG1hdCk7Ci0gICAgVkVSSUZZKGxkbHQuaW5mbygpPT1TdWNjZXNzKTsKKyAgICBWRVJJRlkobGRsdC5pbmZvKCkgPT0gU3VjY2Vzcyk7CiAgICAgVkVSSUZZKGxkbHQuaXNOZWdhdGl2ZSgpKTsKICAgICBWRVJJRlkoIWxkbHQuaXNQb3NpdGl2ZSgpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG1hdCxsZGx0LnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQsIGxkbHQucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZT4KLXZvaWQgY2hvbGVza3lfZmFpbGx1cmVfY2FzZXMoKQotewordGVtcGxhdGUgPHR5cGVuYW1lPgordm9pZCBjaG9sZXNreV9mYWlsbHVyZV9jYXNlcygpIHsKICAgTWF0cml4WGQgbWF0OwogICBMRExUPE1hdHJpeFhkPiBsZGx0OwogCiAgIHsKLSAgICBtYXQucmVzaXplKDIsMik7CisgICAgbWF0LnJlc2l6ZSgyLCAyKTsKICAgICBtYXQgPDwgMCwgMSwgMSwgMDsKICAgICBsZGx0LmNvbXB1dGUobWF0KTsKLSAgICBWRVJJRllfSVNfTk9UX0FQUFJPWChtYXQsbGRsdC5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOwotICAgIFZFUklGWShsZGx0LmluZm8oKT09TnVtZXJpY2FsSXNzdWUpOworICAgIFZFUklGWV9JU19OT1RfQVBQUk9YKG1hdCwgbGRsdC5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworICAgIFZFUklGWShsZGx0LmluZm8oKSA9PSBOdW1lcmljYWxJc3N1ZSk7CiAgIH0KICNpZiAoIUVJR0VOX0FSQ0hfaTM4NikgfHwgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfU1NFMikKICAgewotICAgIG1hdC5yZXNpemUoMywzKTsKLSAgICBtYXQgPDwgLTEsIC0zLCAzLAotICAgICAgICAgICAtMywgLTguOTk5OTk5OTk5OTk5OTk5OTk5OSwgMSwKLSAgICAgICAgICAgIDMsIDEsIDA7CisgICAgbWF0LnJlc2l6ZSgzLCAzKTsKKyAgICBtYXQgPDwgLTEsIC0zLCAzLCAtMywgLTguOTk5OTk5OTk5OTk5OTk5OTk5OSwgMSwgMywgMSwgMDsKICAgICBsZGx0LmNvbXB1dGUobWF0KTsKLSAgICBWRVJJRlkobGRsdC5pbmZvKCk9PU51bWVyaWNhbElzc3VlKTsKLSAgICBWRVJJRllfSVNfTk9UX0FQUFJPWChtYXQsbGRsdC5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworICAgIFZFUklGWShsZGx0LmluZm8oKSA9PSBOdW1lcmljYWxJc3N1ZSk7CisgICAgVkVSSUZZX0lTX05PVF9BUFBST1gobWF0LCBsZGx0LnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CiAgIH0KICNlbmRpZgogICB7Ci0gICAgbWF0LnJlc2l6ZSgzLDMpOwotICAgIG1hdCA8PCAgMSwgMiwgMywKLSAgICAgICAgICAgIDIsIDQsIDEsCi0gICAgICAgICAgICAzLCAxLCAwOworICAgIG1hdC5yZXNpemUoMywgMyk7CisgICAgbWF0IDw8IDEsIDIsIDMsIDIsIDQsIDEsIDMsIDEsIDA7CiAgICAgbGRsdC5jb21wdXRlKG1hdCk7Ci0gICAgVkVSSUZZKGxkbHQuaW5mbygpPT1OdW1lcmljYWxJc3N1ZSk7Ci0gICAgVkVSSUZZX0lTX05PVF9BUFBST1gobWF0LGxkbHQucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgICBWRVJJRlkobGRsdC5pbmZvKCkgPT0gTnVtZXJpY2FsSXNzdWUpOworICAgIFZFUklGWV9JU19OT1RfQVBQUk9YKG1hdCwgbGRsdC5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOwogICB9CiAKICAgewotICAgIG1hdC5yZXNpemUoOCw4KTsKLSAgICBtYXQgPDwgIDAuMSwgMCwgLTAuMSwgMCwgMCwgMCwgMSwgMCwKLSAgICAgICAgICAgIDAsIDQuMjQ2NjcsIDAsIDIuMDAzMzMsIDAsIDAsIDAsIDAsCi0gICAgICAgICAgICAtMC4xLCAwLCAwLjIsIDAsIC0wLjEsIDAsIDAsIDAsCi0gICAgICAgICAgICAwLCAyLjAwMzMzLCAwLCA4LjQ5MzMzLCAwLCAyLjAwMzMzLCAwLCAwLAotICAgICAgICAgICAgMCwgMCwgLTAuMSwgMCwgMC4xLCAwLCAwLCAxLAotICAgICAgICAgICAgMCwgMCwgMCwgMi4wMDMzMywgMCwgNC4yNDY2NywgMCwgMCwKLSAgICAgICAgICAgIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgICAgICAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwOworICAgIG1hdC5yZXNpemUoOCwgOCk7CisgICAgbWF0IDw8IDAuMSwgMCwgLTAuMSwgMCwgMCwgMCwgMSwgMCwgMCwgNC4yNDY2NywgMCwgMi4wMDMzMywgMCwgMCwgMCwgMCwgLTAuMSwgMCwgMC4yLCAwLCAtMC4xLCAwLCAwLCAwLCAwLCAyLjAwMzMzLAorICAgICAgICAwLCA4LjQ5MzMzLCAwLCAyLjAwMzMzLCAwLCAwLCAwLCAwLCAtMC4xLCAwLCAwLjEsIDAsIDAsIDEsIDAsIDAsIDAsIDIuMDAzMzMsIDAsIDQuMjQ2NjcsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDA7CiAgICAgbGRsdC5jb21wdXRlKG1hdCk7Ci0gICAgVkVSSUZZKGxkbHQuaW5mbygpPT1OdW1lcmljYWxJc3N1ZSk7Ci0gICAgVkVSSUZZX0lTX05PVF9BUFBST1gobWF0LGxkbHQucmVjb25zdHJ1Y3RlZE1hdHJpeCgpKTsKKyAgICBWRVJJRlkobGRsdC5pbmZvKCkgPT0gTnVtZXJpY2FsSXNzdWUpOworICAgIFZFUklGWV9JU19OT1RfQVBQUk9YKG1hdCwgbGRsdC5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOwogICB9CiAKICAgLy8gYnVnIDE0NzkKICAgewotICAgIG1hdC5yZXNpemUoNCw0KTsKLSAgICBtYXQgPDwgIDEsIDIsIDAsIDEsCi0gICAgICAgICAgICAyLCA0LCAwLCAyLAotICAgICAgICAgICAgMCwgMCwgMCwgMSwKLSAgICAgICAgICAgIDEsIDIsIDEsIDE7CisgICAgbWF0LnJlc2l6ZSg0LCA0KTsKKyAgICBtYXQgPDwgMSwgMiwgMCwgMSwgMiwgNCwgMCwgMiwgMCwgMCwgMCwgMSwgMSwgMiwgMSwgMTsKICAgICBsZGx0LmNvbXB1dGUobWF0KTsKLSAgICBWRVJJRlkobGRsdC5pbmZvKCk9PU51bWVyaWNhbElzc3VlKTsKLSAgICBWRVJJRllfSVNfTk9UX0FQUFJPWChtYXQsbGRsdC5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOworICAgIFZFUklGWShsZGx0LmluZm8oKSA9PSBOdW1lcmljYWxJc3N1ZSk7CisgICAgVkVSSUZZX0lTX05PVF9BUFBST1gobWF0LCBsZGx0LnJlY29uc3RydWN0ZWRNYXRyaXgoKSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBjaG9sZXNreV92ZXJpZnlfYXNzZXJ0KCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjaG9sZXNreV92ZXJpZnlfYXNzZXJ0KCkgewogICBNYXRyaXhUeXBlIHRtcDsKIAogICBMTFQ8TWF0cml4VHlwZT4gbGx0OwpAQCAtNDkyLDQxICs0NjEsNDAgQEAKICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobGRsdC5zb2x2ZUluUGxhY2UodG1wKSkKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGNob2xlc2t5KQoteworRUlHRU5fREVDTEFSRV9URVNUKGNob2xlc2t5KSB7CiAgIGludCBzID0gMDsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggY2hvbGVza3koTWF0cml4PGRvdWJsZSwxLDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGNob2xlc2t5KE1hdHJpeDJkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGNob2xlc2t5X2J1ZzI0MShNYXRyaXgyZCgpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBjaG9sZXNreV9kZWZpbml0ZW5lc3MoTWF0cml4MmQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggY2hvbGVza3koTWF0cml4M2YoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggY2hvbGVza3koTWF0cml4NGQoKSkgKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoY2hvbGVza3koTWF0cml4PGRvdWJsZSwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKGNob2xlc2t5KE1hdHJpeDJkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhjaG9sZXNreV9idWcyNDEoTWF0cml4MmQoKSkpOworICAgIENBTExfU1VCVEVTVF8zKGNob2xlc2t5X2RlZmluaXRlbmVzcyhNYXRyaXgyZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoY2hvbGVza3koTWF0cml4M2YoKSkpOworICAgIENBTExfU1VCVEVTVF81KGNob2xlc2t5KE1hdHJpeDRkKCkpKTsKIAotICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggY2hvbGVza3koTWF0cml4WGQocyxzKSkgKTsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICAgIENBTExfU1VCVEVTVF8yKGNob2xlc2t5KE1hdHJpeFhkKHMsIHMpKSk7CiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQogCi0gICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMik7Ci0gICAgQ0FMTF9TVUJURVNUXzYoIGNob2xlc2t5X2NwbHgoTWF0cml4WGNkKHMscykpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMik7CisgICAgQ0FMTF9TVUJURVNUXzYoY2hvbGVza3lfY3BseChNYXRyaXhYY2QocywgcykpKTsKICAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCiAgIH0KICAgLy8gZW1wdHkgbWF0cml4LCByZWdyZXNzaW9uIHRlc3QgZm9yIEJ1ZyA3ODU6Ci0gIENBTExfU1VCVEVTVF8yKCBjaG9sZXNreShNYXRyaXhYZCgwLDApKSApOworICBDQUxMX1NVQlRFU1RfMihjaG9sZXNreShNYXRyaXhYZCgwLCAwKSkpOwogCiAgIC8vIFRoaXMgZG9lcyBub3Qgd29yayB5ZXQ6CiAgIC8vIENBTExfU1VCVEVTVF8yKCBjaG9sZXNreShNYXRyaXg8ZG91YmxlLDAsMD4oKSkgKTsKIAotICBDQUxMX1NVQlRFU1RfNCggY2hvbGVza3lfdmVyaWZ5X2Fzc2VydDxNYXRyaXgzZj4oKSApOwotICBDQUxMX1NVQlRFU1RfNyggY2hvbGVza3lfdmVyaWZ5X2Fzc2VydDxNYXRyaXgzZD4oKSApOwotICBDQUxMX1NVQlRFU1RfOCggY2hvbGVza3lfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYZj4oKSApOwotICBDQUxMX1NVQlRFU1RfMiggY2hvbGVza3lfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYZD4oKSApOworICBDQUxMX1NVQlRFU1RfNChjaG9sZXNreV92ZXJpZnlfYXNzZXJ0PE1hdHJpeDNmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzcoY2hvbGVza3lfdmVyaWZ5X2Fzc2VydDxNYXRyaXgzZD4oKSk7CisgIENBTExfU1VCVEVTVF84KGNob2xlc2t5X3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGY+KCkpOworICBDQUxMX1NVQlRFU1RfMihjaG9sZXNreV92ZXJpZnlfYXNzZXJ0PE1hdHJpeFhkPigpKTsKIAogICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKLSAgQ0FMTF9TVUJURVNUXzkoIExMVDxNYXRyaXhYZj4oMTApICk7Ci0gIENBTExfU1VCVEVTVF85KCBMRExUPE1hdHJpeFhmPigxMCkgKTsKKyAgQ0FMTF9TVUJURVNUXzkoTExUPE1hdHJpeFhmPigxMCkpOworICBDQUxMX1NVQlRFU1RfOShMRExUPE1hdHJpeFhmPigxMCkpOwogCi0gIENBTExfU1VCVEVTVF8yKCBjaG9sZXNreV9mYWlsbHVyZV9jYXNlczx2b2lkPigpICk7CisgIENBTExfU1VCVEVTVF8yKGNob2xlc2t5X2ZhaWxsdXJlX2Nhc2VzPHZvaWQ+KCkpOwogCiAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUobmJfdGVtcG9yYXJpZXMpCiB9CmRpZmYgLS1naXQgYS90ZXN0L2Nob2xtb2Rfc3VwcG9ydC5jcHAgYi90ZXN0L2Nob2xtb2Rfc3VwcG9ydC5jcHAKaW5kZXggODliOWNmNC4uMjQxMjZhMCAxMDA2NDQKLS0tIGEvdGVzdC9jaG9sbW9kX3N1cHBvcnQuY3BwCisrKyBiL3Rlc3QvY2hvbG1vZF9zdXBwb3J0LmNwcApAQCAtMTIsMTUgKzEyLDIxIEBACiAKICNpbmNsdWRlIDxFaWdlbi9DaG9sbW9kU3VwcG9ydD4KIAotdGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlVHlwZT4gdm9pZCB0ZXN0X2Nob2xtb2RfU1QoKQotewotICBDaG9sbW9kRGVjb21wb3NpdGlvbjxTcGFyc2VUeXBlLCBMb3dlcj4gZ19jaG9sX2NvbG1ham9yX2xvd2VyOyBnX2Nob2xfY29sbWFqb3JfbG93ZXIuc2V0TW9kZShDaG9sbW9kU3VwZXJub2RhbExMdCk7Ci0gIENob2xtb2REZWNvbXBvc2l0aW9uPFNwYXJzZVR5cGUsIFVwcGVyPiBnX2Nob2xfY29sbWFqb3JfdXBwZXI7IGdfY2hvbF9jb2xtYWpvcl91cHBlci5zZXRNb2RlKENob2xtb2RTdXBlcm5vZGFsTEx0KTsKLSAgQ2hvbG1vZERlY29tcG9zaXRpb248U3BhcnNlVHlwZSwgTG93ZXI+IGdfbGx0X2NvbG1ham9yX2xvd2VyOyAgZ19sbHRfY29sbWFqb3JfbG93ZXIuc2V0TW9kZShDaG9sbW9kU2ltcGxpY2lhbExMdCk7Ci0gIENob2xtb2REZWNvbXBvc2l0aW9uPFNwYXJzZVR5cGUsIFVwcGVyPiBnX2xsdF9jb2xtYWpvcl91cHBlcjsgIGdfbGx0X2NvbG1ham9yX3VwcGVyLnNldE1vZGUoQ2hvbG1vZFNpbXBsaWNpYWxMTHQpOwotICBDaG9sbW9kRGVjb21wb3NpdGlvbjxTcGFyc2VUeXBlLCBMb3dlcj4gZ19sZGx0X2NvbG1ham9yX2xvd2VyOyBnX2xkbHRfY29sbWFqb3JfbG93ZXIuc2V0TW9kZShDaG9sbW9kTERMdCk7Ci0gIENob2xtb2REZWNvbXBvc2l0aW9uPFNwYXJzZVR5cGUsIFVwcGVyPiBnX2xkbHRfY29sbWFqb3JfdXBwZXI7IGdfbGRsdF9jb2xtYWpvcl91cHBlci5zZXRNb2RlKENob2xtb2RMREx0KTsKLSAgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BhcnNlVHlwZT4KK3ZvaWQgdGVzdF9jaG9sbW9kX1NUKCkgeworICBDaG9sbW9kRGVjb21wb3NpdGlvbjxTcGFyc2VUeXBlLCBMb3dlcj4gZ19jaG9sX2NvbG1ham9yX2xvd2VyOworICBnX2Nob2xfY29sbWFqb3JfbG93ZXIuc2V0TW9kZShDaG9sbW9kU3VwZXJub2RhbExMdCk7CisgIENob2xtb2REZWNvbXBvc2l0aW9uPFNwYXJzZVR5cGUsIFVwcGVyPiBnX2Nob2xfY29sbWFqb3JfdXBwZXI7CisgIGdfY2hvbF9jb2xtYWpvcl91cHBlci5zZXRNb2RlKENob2xtb2RTdXBlcm5vZGFsTEx0KTsKKyAgQ2hvbG1vZERlY29tcG9zaXRpb248U3BhcnNlVHlwZSwgTG93ZXI+IGdfbGx0X2NvbG1ham9yX2xvd2VyOworICBnX2xsdF9jb2xtYWpvcl9sb3dlci5zZXRNb2RlKENob2xtb2RTaW1wbGljaWFsTEx0KTsKKyAgQ2hvbG1vZERlY29tcG9zaXRpb248U3BhcnNlVHlwZSwgVXBwZXI+IGdfbGx0X2NvbG1ham9yX3VwcGVyOworICBnX2xsdF9jb2xtYWpvcl91cHBlci5zZXRNb2RlKENob2xtb2RTaW1wbGljaWFsTEx0KTsKKyAgQ2hvbG1vZERlY29tcG9zaXRpb248U3BhcnNlVHlwZSwgTG93ZXI+IGdfbGRsdF9jb2xtYWpvcl9sb3dlcjsKKyAgZ19sZGx0X2NvbG1ham9yX2xvd2VyLnNldE1vZGUoQ2hvbG1vZExETHQpOworICBDaG9sbW9kRGVjb21wb3NpdGlvbjxTcGFyc2VUeXBlLCBVcHBlcj4gZ19sZGx0X2NvbG1ham9yX3VwcGVyOworICBnX2xkbHRfY29sbWFqb3JfdXBwZXIuc2V0TW9kZShDaG9sbW9kTERMdCk7CisKICAgQ2hvbG1vZFN1cGVybm9kYWxMTFQ8U3BhcnNlVHlwZSwgTG93ZXI+IGNob2xfY29sbWFqb3JfbG93ZXI7CiAgIENob2xtb2RTdXBlcm5vZGFsTExUPFNwYXJzZVR5cGUsIFVwcGVyPiBjaG9sX2NvbG1ham9yX3VwcGVyOwogICBDaG9sbW9kU2ltcGxpY2lhbExMVDxTcGFyc2VUeXBlLCBMb3dlcj4gbGx0X2NvbG1ham9yX2xvd2VyOwpAQCAtMzQsNyArNDAsNyBAQAogICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoZ19sbHRfY29sbWFqb3JfdXBwZXIpOwogICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoZ19sZGx0X2NvbG1ham9yX2xvd2VyKTsKICAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGdfbGRsdF9jb2xtYWpvcl91cHBlcik7Ci0gIAorCiAgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjaG9sX2NvbG1ham9yX2xvd2VyKTsKICAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNob2xfY29sbWFqb3JfdXBwZXIpOwogICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGx0X2NvbG1ham9yX2xvd2VyKTsKQEAgLTUwLDE5ICs1NiwxOCBAQAogICBjaGVja19zcGFyc2Vfc3BkX2RldGVybWluYW50KGxkbHRfY29sbWFqb3JfdXBwZXIpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgZmxhZ3MsIHR5cGVuYW1lIElkeFR5cGU+IHZvaWQgdGVzdF9jaG9sbW9kX1QoKQotewotICAgIHRlc3RfY2hvbG1vZF9TVDxTcGFyc2VNYXRyaXg8VCwgZmxhZ3MsIElkeFR5cGU+ID4oKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgZmxhZ3MsIHR5cGVuYW1lIElkeFR5cGU+Cit2b2lkIHRlc3RfY2hvbG1vZF9UKCkgeworICB0ZXN0X2Nob2xtb2RfU1Q8U3BhcnNlTWF0cml4PFQsIGZsYWdzLCBJZHhUeXBlPiA+KCk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjaG9sbW9kX3N1cHBvcnQpCi17Ci0gIENBTExfU1VCVEVTVF8xMSggKHRlc3RfY2hvbG1vZF9UPGRvdWJsZSAgICAgICAgICAgICAgLCBDb2xNYWpvciwgaW50ID4oKSkgKTsKLSAgQ0FMTF9TVUJURVNUXzEyKCAodGVzdF9jaG9sbW9kX1Q8ZG91YmxlICAgICAgICAgICAgICAsIENvbE1ham9yLCBsb25nPigpKSApOwotICBDQUxMX1NVQlRFU1RfMTMoICh0ZXN0X2Nob2xtb2RfVDxkb3VibGUgICAgICAgICAgICAgICwgUm93TWFqb3IsIGludCA+KCkpICk7Ci0gIENBTExfU1VCVEVTVF8xNCggKHRlc3RfY2hvbG1vZF9UPGRvdWJsZSAgICAgICAgICAgICAgLCBSb3dNYWpvciwgbG9uZz4oKSkgKTsKLSAgQ0FMTF9TVUJURVNUXzIxKCAodGVzdF9jaG9sbW9kX1Q8c3RkOjpjb21wbGV4PGRvdWJsZT4sIENvbE1ham9yLCBpbnQgPigpKSApOwotICBDQUxMX1NVQlRFU1RfMjIoICh0ZXN0X2Nob2xtb2RfVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgQ29sTWFqb3IsIGxvbmc+KCkpICk7CitFSUdFTl9ERUNMQVJFX1RFU1QoY2hvbG1vZF9zdXBwb3J0KSB7CisgIENBTExfU1VCVEVTVF8xMSgodGVzdF9jaG9sbW9kX1Q8ZG91YmxlLCBDb2xNYWpvciwgaW50PigpKSk7CisgIENBTExfU1VCVEVTVF8xMigodGVzdF9jaG9sbW9kX1Q8ZG91YmxlLCBDb2xNYWpvciwgbG9uZz4oKSkpOworICBDQUxMX1NVQlRFU1RfMTMoKHRlc3RfY2hvbG1vZF9UPGRvdWJsZSwgUm93TWFqb3IsIGludD4oKSkpOworICBDQUxMX1NVQlRFU1RfMTQoKHRlc3RfY2hvbG1vZF9UPGRvdWJsZSwgUm93TWFqb3IsIGxvbmc+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIxKCh0ZXN0X2Nob2xtb2RfVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgQ29sTWFqb3IsIGludD4oKSkpOworICBDQUxMX1NVQlRFU1RfMjIoKHRlc3RfY2hvbG1vZF9UPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBDb2xNYWpvciwgbG9uZz4oKSkpOwogICAvLyBUT0RPIGNvbXBsZXggcm93LW1ham9yIG1hdHJpY2VzIGRvIG5vdCB3b3JrIGF0IHRoZSBtb21lbnQ6CiAgIC8vIENBTExfU1VCVEVTVF8yMyggKHRlc3RfY2hvbG1vZF9UPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBSb3dNYWpvciwgaW50ID4oKSkgKTsKICAgLy8gQ0FMTF9TVUJURVNUXzI0KCAodGVzdF9jaG9sbW9kX1Q8c3RkOjpjb21wbGV4PGRvdWJsZT4sIFJvd01ham9yLCBsb25nPigpKSApOwpkaWZmIC0tZ2l0IGEvdGVzdC9jb21tYWluaXRpYWxpemVyLmNwcCBiL3Rlc3QvY29tbWFpbml0aWFsaXplci5jcHAKaW5kZXggZWIyNzViZS4uNzcxYWI2ZiAxMDA2NDQKLS0tIGEvdGVzdC9jb21tYWluaXRpYWxpemVyLmNwcAorKysgYi90ZXN0L2NvbW1haW5pdGlhbGl6ZXIuY3BwCkBAIC05LDg2ICs5LDc5IEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAKK3RlbXBsYXRlIDxpbnQgTTEsIGludCBNMiwgaW50IE4xLCBpbnQgTjI+Cit2b2lkIHRlc3RfYmxvY2tzKCkgeworICBNYXRyaXg8aW50LCBNMSArIE0yLCBOMSArIE4yPiBtX2ZpeGVkOworICBNYXRyaXhYaSBtX2R5bmFtaWMoTTEgKyBNMiwgTjEgKyBOMik7CiAKLXRlbXBsYXRlPGludCBNMSwgaW50IE0yLCBpbnQgTjEsIGludCBOMj4KLXZvaWQgdGVzdF9ibG9ja3MoKQotewotICBNYXRyaXg8aW50LCBNMStNMiwgTjErTjI+IG1fZml4ZWQ7Ci0gIE1hdHJpeFhpIG1fZHluYW1pYyhNMStNMiwgTjErTjIpOwotCi0gIE1hdHJpeDxpbnQsIE0xLCBOMT4gbWF0MTE7IG1hdDExLnNldFJhbmRvbSgpOwotICBNYXRyaXg8aW50LCBNMSwgTjI+IG1hdDEyOyBtYXQxMi5zZXRSYW5kb20oKTsKLSAgTWF0cml4PGludCwgTTIsIE4xPiBtYXQyMTsgbWF0MjEuc2V0UmFuZG9tKCk7Ci0gIE1hdHJpeDxpbnQsIE0yLCBOMj4gbWF0MjI7IG1hdDIyLnNldFJhbmRvbSgpOworICBNYXRyaXg8aW50LCBNMSwgTjE+IG1hdDExOworICBtYXQxMS5zZXRSYW5kb20oKTsKKyAgTWF0cml4PGludCwgTTEsIE4yPiBtYXQxMjsKKyAgbWF0MTIuc2V0UmFuZG9tKCk7CisgIE1hdHJpeDxpbnQsIE0yLCBOMT4gbWF0MjE7CisgIG1hdDIxLnNldFJhbmRvbSgpOworICBNYXRyaXg8aW50LCBNMiwgTjI+IG1hdDIyOworICBtYXQyMi5zZXRSYW5kb20oKTsKIAogICBNYXRyaXhYaSBtYXR4MTEgPSBtYXQxMSwgbWF0eDEyID0gbWF0MTIsIG1hdHgyMSA9IG1hdDIxLCBtYXR4MjIgPSBtYXQyMjsKIAogICB7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKChtX2ZpeGVkIDw8IG1hdDExLCBtYXQxMiwgbWF0MjEsIG1hdHgyMikuZmluaXNoZWQoKSwgKG1fZHluYW1pYyA8PCBtYXQxMSwgbWF0eDEyLCBtYXQyMSwgbWF0eDIyKS5maW5pc2hlZCgpKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoKG1fZml4ZWQudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxNMSxOMT4oKSksIG1hdDExKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoKG1fZml4ZWQudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8TTEsTjI+KCkpLCBtYXQxMik7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKChtX2ZpeGVkLnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8TTIsTjE+KCkpLCBtYXQyMSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKChtX2ZpeGVkLnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPE0yLE4yPigpKSwgbWF0MjIpOwotICAgIFZFUklGWV9JU19FUVVBTCgobV9maXhlZCA8PCBtYXQxMiwgbWF0MTEsIG1hdHgyMSwgbWF0MjIpLmZpbmlzaGVkKCksIChtX2R5bmFtaWMgPDwgbWF0MTIsIG1hdHgxMSwgbWF0eDIxLCBtYXQyMikuZmluaXNoZWQoKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKChtX2ZpeGVkIDw8IG1hdDExLCBtYXQxMiwgbWF0MjEsIG1hdHgyMikuZmluaXNoZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgKG1fZHluYW1pYyA8PCBtYXQxMSwgbWF0eDEyLCBtYXQyMSwgbWF0eDIyKS5maW5pc2hlZCgpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoKG1fZml4ZWQudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxNMSwgTjE+KCkpLCBtYXQxMSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKChtX2ZpeGVkLnRlbXBsYXRlIHRvcFJpZ2h0Q29ybmVyPE0xLCBOMj4oKSksIG1hdDEyKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoKG1fZml4ZWQudGVtcGxhdGUgYm90dG9tTGVmdENvcm5lcjxNMiwgTjE+KCkpLCBtYXQyMSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKChtX2ZpeGVkLnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPE0yLCBOMj4oKSksIG1hdDIyKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoKG1fZml4ZWQgPDwgbWF0MTIsIG1hdDExLCBtYXR4MjEsIG1hdDIyKS5maW5pc2hlZCgpLAorICAgICAgICAgICAgICAgICAgICAobV9keW5hbWljIDw8IG1hdDEyLCBtYXR4MTEsIG1hdHgyMSwgbWF0MjIpLmZpbmlzaGVkKCkpOwogICB9CiAKLSAgaWYoTjEgPiAwKQotICB7Ci0gICAgaWYoTTEgPiAwKQotICAgIHsKKyAgaWYgKE4xID4gMCkgeworICAgIGlmIChNMSA+IDApIHsKICAgICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKChtX2ZpeGVkIDw8IG1hdDExLCBtYXQxMiwgbWF0MTEsIG1hdDIxLCBtYXQyMikpOwogICAgIH0KLSAgICBpZihNMiA+IDApCi0gICAgeworICAgIGlmIChNMiA+IDApIHsKICAgICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKChtX2ZpeGVkIDw8IG1hdDExLCBtYXQxMiwgbWF0MjEsIG1hdDIxLCBtYXQyMikpOwogICAgIH0KLSAgfQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICAvLyBhbGxvdyBpbnNlcnRpb24gb2YgemVyby1jb2x1bW4gYmxvY2tzOgotICAgIFZFUklGWV9JU19FUVVBTCgobV9maXhlZCA8PCBtYXQxMSwgbWF0MTIsIG1hdDExLCBtYXQxMSwgbWF0MjEsIG1hdDIxLCBtYXQyMikuZmluaXNoZWQoKSwgKG1fZHluYW1pYyA8PCBtYXQxMiwgbWF0MjIpLmZpbmlzaGVkKCkpOworICAgIFZFUklGWV9JU19FUVVBTCgobV9maXhlZCA8PCBtYXQxMSwgbWF0MTIsIG1hdDExLCBtYXQxMSwgbWF0MjEsIG1hdDIxLCBtYXQyMikuZmluaXNoZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgKG1fZHluYW1pYyA8PCBtYXQxMiwgbWF0MjIpLmZpbmlzaGVkKCkpOwogICB9Ci0gIGlmKE0xICE9IE0yKQotICB7CisgIGlmIChNMSAhPSBNMikgewogICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKChtX2ZpeGVkIDw8IG1hdDExLCBtYXQyMSwgbWF0MTIsIG1hdDIyKSk7CiAgIH0KIH0KIAotCi10ZW1wbGF0ZTxpbnQgZGVwdGgsIGludCBOPTA+Ci1zdHJ1Y3QgdGVzdF9ibG9ja19yZWN1cnNpb24KLXsKLSAgc3RhdGljIHZvaWQgcnVuKCkKLSAgewotICAgIHRlc3RfYmxvY2tfcmVjdXJzaW9uPGRlcHRoLTEsIE4+OjpydW4oKTsKLSAgICB0ZXN0X2Jsb2NrX3JlY3Vyc2lvbjxkZXB0aC0xLCBOICsgKDEgPDwgKGRlcHRoLTEpKT46OnJ1bigpOwordGVtcGxhdGUgPGludCBkZXB0aCwgaW50IE4gPSAwPgorc3RydWN0IHRlc3RfYmxvY2tfcmVjdXJzaW9uIHsKKyAgc3RhdGljIHZvaWQgcnVuKCkgeworICAgIHRlc3RfYmxvY2tfcmVjdXJzaW9uPGRlcHRoIC0gMSwgTj46OnJ1bigpOworICAgIHRlc3RfYmxvY2tfcmVjdXJzaW9uPGRlcHRoIC0gMSwgTiArICgxIDw8IChkZXB0aCAtIDEpKT46OnJ1bigpOwogICB9CiB9OwogCi10ZW1wbGF0ZTxpbnQgTj4KLXN0cnVjdCB0ZXN0X2Jsb2NrX3JlY3Vyc2lvbjwwLE4+Ci17Ci0gIHN0YXRpYyB2b2lkIHJ1bigpIHsKLSAgICB0ZXN0X2Jsb2NrczwoTj4+NikmMywgKE4+PjQpJjMsIChOPj4yKSYzLCBOICYgMz4oKTsKLSAgfQordGVtcGxhdGUgPGludCBOPgorc3RydWN0IHRlc3RfYmxvY2tfcmVjdXJzaW9uPDAsIE4+IHsKKyAgc3RhdGljIHZvaWQgcnVuKCkgeyB0ZXN0X2Jsb2NrczwoTiA+PiA2KSAmIDMsIChOID4+IDQpICYgMywgKE4gPj4gMikgJiAzLCBOICYgMz4oKTsgfQogfTsKIAogdm9pZCB0ZXN0X2Jhc2ljcygpIHsKICAgTWF0cml4M2QgbTM7CiAgIE1hdHJpeDRkIG00OwogCi0gIFZFUklGWV9SQUlTRVNfQVNTRVJUKCAobTMgPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCkgKTsKLSAgCi0gICNpZm5kZWYgX01TQ19WRVIKLSAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIChtMyA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCkgKTsKLSAgI2VuZGlmCisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKChtMyA8PCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KSk7CisKKyNpZm5kZWYgX01TQ19WRVIKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoKG0zIDw8IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwKSk7CisjZW5kaWYKIAogICBkb3VibGUgZGF0YVtdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDl9OwotICBNYXRyaXgzZCByZWYgPSBNYXA8TWF0cml4PGRvdWJsZSwzLDMsUm93TWFqb3I+ID4oZGF0YSk7CisgIE1hdHJpeDNkIHJlZiA9IE1hcDxNYXRyaXg8ZG91YmxlLCAzLCAzLCBSb3dNYWpvcj4gPihkYXRhKTsKIAogICBtMyA9IE1hdHJpeDNkOjpSYW5kb20oKTsKICAgbTMgPDwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmICk7CisgIFZFUklGWV9JU19BUFBST1gobTMsIHJlZik7CiAKICAgVmVjdG9yM2QgdmVjWzNdOwogICB2ZWNbMF0gPDwgMSwgNCwgNzsKQEAgLTEwMiwxNSArOTUsMTEgQEAKICAgdmVjWzFdIDw8IDQsIDUsIDY7CiAgIHZlY1syXSA8PCA3LCA4LCA5OwogICBtMyA9IE1hdHJpeDNkOjpSYW5kb20oKTsKLSAgbTMgPDwgdmVjWzBdLnRyYW5zcG9zZSgpLAotICAgICAgICA0LCA1LCA2LAotICAgICAgICB2ZWNbMl0udHJhbnNwb3NlKCk7CisgIG0zIDw8IHZlY1swXS50cmFuc3Bvc2UoKSwgNCwgNSwgNiwgdmVjWzJdLnRyYW5zcG9zZSgpOwogICBWRVJJRllfSVNfQVBQUk9YKG0zLCByZWYpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoY29tbWFpbml0aWFsaXplcikKLXsKLQorRUlHRU5fREVDTEFSRV9URVNUKGNvbW1haW5pdGlhbGl6ZXIpIHsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9iYXNpY3MoKSk7CiAKICAgLy8gcmVjdXJzaXZlbHkgdGVzdCBhbGwgYmxvY2stc2l6ZXMgZnJvbSAwIHRvIDM6CmRpZmYgLS1naXQgYS90ZXN0L2Nvbmp1Z2F0ZV9ncmFkaWVudC5jcHAgYi90ZXN0L2Nvbmp1Z2F0ZV9ncmFkaWVudC5jcHAKaW5kZXggYjA3NmExMi4uODdlMWY4YyAxMDA2NDQKLS0tIGEvdGVzdC9jb25qdWdhdGVfZ3JhZGllbnQuY3BwCisrKyBiL3Rlc3QvY29uanVnYXRlX2dyYWRpZW50LmNwcApAQCAtMTAsMjUgKzEwLDI0IEBACiAjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgogI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZUxpbmVhclNvbHZlcnM+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIElfPiB2b2lkIHRlc3RfY29uanVnYXRlX2dyYWRpZW50X1QoKQotewotICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxULDAsSV8+IFNwYXJzZU1hdHJpeFR5cGU7Ci0gIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeFR5cGUsIExvd2VyICAgICAgPiBjZ19jb2xtYWpvcl9sb3dlcl9kaWFnOwotICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXhUeXBlLCBVcHBlciAgICAgID4gY2dfY29sbWFqb3JfdXBwZXJfZGlhZzsKLSAgQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4VHlwZSwgTG93ZXJ8VXBwZXI+IGNnX2NvbG1ham9yX2xvdXBfZGlhZzsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJXz4KK3ZvaWQgdGVzdF9jb25qdWdhdGVfZ3JhZGllbnRfVCgpIHsKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8VCwgMCwgSV8+IFNwYXJzZU1hdHJpeFR5cGU7CisgIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeFR5cGUsIExvd2VyPiBjZ19jb2xtYWpvcl9sb3dlcl9kaWFnOworICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXhUeXBlLCBVcHBlcj4gY2dfY29sbWFqb3JfdXBwZXJfZGlhZzsKKyAgQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4VHlwZSwgTG93ZXIgfCBVcHBlcj4gY2dfY29sbWFqb3JfbG91cF9kaWFnOwogICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXhUeXBlLCBMb3dlciwgSWRlbnRpdHlQcmVjb25kaXRpb25lcj4gY2dfY29sbWFqb3JfbG93ZXJfSTsKICAgQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4VHlwZSwgVXBwZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXI+IGNnX2NvbG1ham9yX3VwcGVyX0k7CiAKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2dfY29sbWFqb3JfbG93ZXJfZGlhZykgICk7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNnX2NvbG1ham9yX3VwcGVyX2RpYWcpICApOwotICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjZ19jb2xtYWpvcl9sb3VwX2RpYWcpICAgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2dfY29sbWFqb3JfbG93ZXJfSSkgICAgICk7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNnX2NvbG1ham9yX3VwcGVyX0kpICAgICApOworICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNnX2NvbG1ham9yX2xvd2VyX2RpYWcpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjZ19jb2xtYWpvcl91cHBlcl9kaWFnKSk7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2dfY29sbWFqb3JfbG91cF9kaWFnKSk7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2dfY29sbWFqb3JfbG93ZXJfSSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNnX2NvbG1ham9yX3VwcGVyX0kpKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGNvbmp1Z2F0ZV9ncmFkaWVudCkKLXsKLSAgQ0FMTF9TVUJURVNUXzEoKCB0ZXN0X2Nvbmp1Z2F0ZV9ncmFkaWVudF9UPGRvdWJsZSxpbnQ+KCkgKSk7Ci0gIENBTExfU1VCVEVTVF8yKCggdGVzdF9jb25qdWdhdGVfZ3JhZGllbnRfVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgaW50PigpICkpOwotICBDQUxMX1NVQlRFU1RfMygoIHRlc3RfY29uanVnYXRlX2dyYWRpZW50X1Q8ZG91YmxlLGxvbmcgaW50PigpICkpOworRUlHRU5fREVDTEFSRV9URVNUKGNvbmp1Z2F0ZV9ncmFkaWVudCkgeworICBDQUxMX1NVQlRFU1RfMSgodGVzdF9jb25qdWdhdGVfZ3JhZGllbnRfVDxkb3VibGUsIGludD4oKSkpOworICBDQUxMX1NVQlRFU1RfMigodGVzdF9jb25qdWdhdGVfZ3JhZGllbnRfVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgaW50PigpKSk7CisgIENBTExfU1VCVEVTVF8zKCh0ZXN0X2Nvbmp1Z2F0ZV9ncmFkaWVudF9UPGRvdWJsZSwgbG9uZyBpbnQ+KCkpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvY29uc2VydmF0aXZlX3Jlc2l6ZS5jcHAgYi90ZXN0L2NvbnNlcnZhdGl2ZV9yZXNpemUuY3BwCmluZGV4IGQ0OGViMTIuLjczZTM0YTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29uc2VydmF0aXZlX3Jlc2l6ZS5jcHAKKysrIGIvdGVzdC9jb25zZXJ2YXRpdmVfcmVzaXplLmNwcApAQCAtMTUsNTEgKzE1LDQ3IEBACiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBTdG9yYWdlPgotdm9pZCBydW5fbWF0cml4X3Rlc3RzKCkKLXsKK3ZvaWQgcnVuX21hdHJpeF90ZXN0cygpIHsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWMsIFN0b3JhZ2U+IE1hdHJpeFR5cGU7CiAKICAgTWF0cml4VHlwZSBtLCBuOwogCiAgIC8vIGJvdW5kYXJ5IGNhc2VzIC4uLgotICBtID0gbiA9IE1hdHJpeFR5cGU6OlJhbmRvbSg1MCw1MCk7Ci0gIG0uY29uc2VydmF0aXZlUmVzaXplKDEsNTApOwotICBWRVJJRllfSVNfQVBQUk9YKG0sIG4uYmxvY2soMCwwLDEsNTApKTsKKyAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTAsIDUwKTsKKyAgbS5jb25zZXJ2YXRpdmVSZXNpemUoMSwgNTApOworICBWRVJJRllfSVNfQVBQUk9YKG0sIG4uYmxvY2soMCwgMCwgMSwgNTApKTsKIAotICBtID0gbiA9IE1hdHJpeFR5cGU6OlJhbmRvbSg1MCw1MCk7Ci0gIG0uY29uc2VydmF0aXZlUmVzaXplKDUwLDEpOwotICBWRVJJRllfSVNfQVBQUk9YKG0sIG4uYmxvY2soMCwwLDUwLDEpKTsKKyAgbSA9IG4gPSBNYXRyaXhUeXBlOjpSYW5kb20oNTAsIDUwKTsKKyAgbS5jb25zZXJ2YXRpdmVSZXNpemUoNTAsIDEpOworICBWRVJJRllfSVNfQVBQUk9YKG0sIG4uYmxvY2soMCwgMCwgNTAsIDEpKTsKIAotICBtID0gbiA9IE1hdHJpeFR5cGU6OlJhbmRvbSg1MCw1MCk7Ci0gIG0uY29uc2VydmF0aXZlUmVzaXplKDUwLDUwKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLmJsb2NrKDAsMCw1MCw1MCkpOworICBtID0gbiA9IE1hdHJpeFR5cGU6OlJhbmRvbSg1MCwgNTApOworICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZSg1MCwgNTApOworICBWRVJJRllfSVNfQVBQUk9YKG0sIG4uYmxvY2soMCwgMCwgNTAsIDUwKSk7CiAKICAgLy8gcmFuZG9tIHNocmlua2luZyAuLi4KLSAgZm9yIChpbnQgaT0wOyBpPDI1OyArK2kpCi0gIHsKLSAgICBjb25zdCBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSw1MCk7Ci0gICAgY29uc3QgSW5kZXggY29scyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsNTApOwotICAgIG0gPSBuID0gTWF0cml4VHlwZTo6UmFuZG9tKDUwLDUwKTsKLSAgICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZShyb3dzLGNvbHMpOwotICAgIFZFUklGWV9JU19BUFBST1gobSwgbi5ibG9jaygwLDAscm93cyxjb2xzKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU7ICsraSkgeworICAgIGNvbnN0IEluZGV4IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCA1MCk7CisgICAgY29uc3QgSW5kZXggY29scyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIDUwKTsKKyAgICBtID0gbiA9IE1hdHJpeFR5cGU6OlJhbmRvbSg1MCwgNTApOworICAgIG0uY29uc2VydmF0aXZlUmVzaXplKHJvd3MsIGNvbHMpOworICAgIFZFUklGWV9JU19BUFBST1gobSwgbi5ibG9jaygwLCAwLCByb3dzLCBjb2xzKSk7CiAgIH0KIAogICAvLyByYW5kb20gZ3Jvd2luZyB3aXRoIHplcm9pbmcgLi4uCi0gIGZvciAoaW50IGk9MDsgaTwyNTsgKytpKQotICB7Ci0gICAgY29uc3QgSW5kZXggcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDUwLDc1KTsKLSAgICBjb25zdCBJbmRleCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oNTAsNzUpOwotICAgIG0gPSBuID0gTWF0cml4VHlwZTo6UmFuZG9tKDUwLDUwKTsKLSAgICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZUxpa2UoTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soMCwwLG4ucm93cygpLG4uY29scygpKSwgbik7Ci0gICAgVkVSSUZZKCByb3dzPD01MCB8fCBtLmJsb2NrKDUwLDAscm93cy01MCxjb2xzKS5zdW0oKSA9PSBTY2FsYXIoMCkgKTsKLSAgICBWRVJJRlkoIGNvbHM8PTUwIHx8IG0uYmxvY2soMCw1MCxyb3dzLGNvbHMtNTApLnN1bSgpID09IFNjYWxhcigwKSApOworICBmb3IgKGludCBpID0gMDsgaSA8IDI1OyArK2kpIHsKKyAgICBjb25zdCBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oNTAsIDc1KTsKKyAgICBjb25zdCBJbmRleCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oNTAsIDc1KTsKKyAgICBtID0gbiA9IE1hdHJpeFR5cGU6OlJhbmRvbSg1MCwgNTApOworICAgIG0uY29uc2VydmF0aXZlUmVzaXplTGlrZShNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soMCwgMCwgbi5yb3dzKCksIG4uY29scygpKSwgbik7CisgICAgVkVSSUZZKHJvd3MgPD0gNTAgfHwgbS5ibG9jayg1MCwgMCwgcm93cyAtIDUwLCBjb2xzKS5zdW0oKSA9PSBTY2FsYXIoMCkpOworICAgIFZFUklGWShjb2xzIDw9IDUwIHx8IG0uYmxvY2soMCwgNTAsIHJvd3MsIGNvbHMgLSA1MCkuc3VtKCkgPT0gU2NhbGFyKDApKTsKICAgfQogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgotdm9pZCBydW5fdmVjdG9yX3Rlc3RzKCkKLXsKK3ZvaWQgcnVuX3ZlY3Rvcl90ZXN0cygpIHsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBFaWdlbjo6RHluYW1pYz4gVmVjdG9yVHlwZTsKIAogICBWZWN0b3JUeXBlIG0sIG47CkBAIC02Nyw1NCArNjMsNTIgQEAKICAgLy8gYm91bmRhcnkgY2FzZXMgLi4uCiAgIG0gPSBuID0gVmVjdG9yVHlwZTo6UmFuZG9tKDUwKTsKICAgbS5jb25zZXJ2YXRpdmVSZXNpemUoMSk7Ci0gIFZFUklGWV9JU19BUFBST1gobSwgbi5zZWdtZW50KDAsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0sIG4uc2VnbWVudCgwLCAxKSk7CiAKICAgbSA9IG4gPSBWZWN0b3JUeXBlOjpSYW5kb20oNTApOwogICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZSg1MCk7Ci0gIFZFUklGWV9JU19BUFBST1gobSwgbi5zZWdtZW50KDAsNTApKTsKLSAgCi0gIG0gPSBuID0gVmVjdG9yVHlwZTo6UmFuZG9tKDUwKTsKLSAgbS5jb25zZXJ2YXRpdmVSZXNpemUobS5yb3dzKCksMSk7Ci0gIFZFUklGWV9JU19BUFBST1gobSwgbi5zZWdtZW50KDAsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0sIG4uc2VnbWVudCgwLCA1MCkpOwogCiAgIG0gPSBuID0gVmVjdG9yVHlwZTo6UmFuZG9tKDUwKTsKLSAgbS5jb25zZXJ2YXRpdmVSZXNpemUobS5yb3dzKCksNTApOwotICBWRVJJRllfSVNfQVBQUk9YKG0sIG4uc2VnbWVudCgwLDUwKSk7CisgIG0uY29uc2VydmF0aXZlUmVzaXplKG0ucm93cygpLCAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLnNlZ21lbnQoMCwgMSkpOworCisgIG0gPSBuID0gVmVjdG9yVHlwZTo6UmFuZG9tKDUwKTsKKyAgbS5jb25zZXJ2YXRpdmVSZXNpemUobS5yb3dzKCksIDUwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLnNlZ21lbnQoMCwgNTApKTsKIAogICAvLyByYW5kb20gc2hyaW5raW5nIC4uLgotICBmb3IgKGludCBpPTA7IGk8NTA7ICsraSkKLSAgewotICAgIGNvbnN0IGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsNTApOworICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyArK2kpIHsKKyAgICBjb25zdCBpbnQgc2l6ZSA9IGludGVybmFsOjpyYW5kb208aW50PigxLCA1MCk7CiAgICAgbSA9IG4gPSBWZWN0b3JUeXBlOjpSYW5kb20oNTApOwogICAgIG0uY29uc2VydmF0aXZlUmVzaXplKHNpemUpOwotICAgIFZFUklGWV9JU19BUFBST1gobSwgbi5zZWdtZW50KDAsc2l6ZSkpOwotICAgIAorICAgIFZFUklGWV9JU19BUFBST1gobSwgbi5zZWdtZW50KDAsIHNpemUpKTsKKwogICAgIG0gPSBuID0gVmVjdG9yVHlwZTo6UmFuZG9tKDUwKTsKICAgICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZShtLnJvd3MoKSwgc2l6ZSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLnNlZ21lbnQoMCxzaXplKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtLCBuLnNlZ21lbnQoMCwgc2l6ZSkpOwogICB9CiAKICAgLy8gcmFuZG9tIGdyb3dpbmcgd2l0aCB6ZXJvaW5nIC4uLgotICBmb3IgKGludCBpPTA7IGk8NTA7ICsraSkKLSAgewotICAgIGNvbnN0IGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDUwLDEwMCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTA7ICsraSkgeworICAgIGNvbnN0IGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDUwLCAxMDApOwogICAgIG0gPSBuID0gVmVjdG9yVHlwZTo6UmFuZG9tKDUwKTsKICAgICBtLmNvbnNlcnZhdGl2ZVJlc2l6ZUxpa2UoVmVjdG9yVHlwZTo6WmVybyhzaXplKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtLnNlZ21lbnQoMCw1MCksIG4pOwotICAgIFZFUklGWSggc2l6ZTw9NTAgfHwgbS5zZWdtZW50KDUwLHNpemUtNTApLnN1bSgpID09IFNjYWxhcigwKSApOwotICAgIAorICAgIFZFUklGWV9JU19BUFBST1gobS5zZWdtZW50KDAsIDUwKSwgbik7CisgICAgVkVSSUZZKHNpemUgPD0gNTAgfHwgbS5zZWdtZW50KDUwLCBzaXplIC0gNTApLnN1bSgpID09IFNjYWxhcigwKSk7CisKICAgICBtID0gbiA9IFZlY3RvclR5cGU6OlJhbmRvbSg1MCk7Ci0gICAgbS5jb25zZXJ2YXRpdmVSZXNpemVMaWtlKE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPjo6WmVybygxLHNpemUpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0uc2VnbWVudCgwLDUwKSwgbik7Ci0gICAgVkVSSUZZKCBzaXplPD01MCB8fCBtLnNlZ21lbnQoNTAsc2l6ZS01MCkuc3VtKCkgPT0gU2NhbGFyKDApICk7CisgICAgbS5jb25zZXJ2YXRpdmVSZXNpemVMaWtlKE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+OjpaZXJvKDEsIHNpemUpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0uc2VnbWVudCgwLCA1MCksIG4pOworICAgIFZFUklGWShzaXplIDw9IDUwIHx8IG0uc2VnbWVudCg1MCwgc2l6ZSAtIDUwKS5zdW0oKSA9PSBTY2FsYXIoMCkpOwogICB9CiB9CiAKIC8vIEJhc2ljIG1lbW9yeSBsZWFrIGNoZWNrIHdpdGggYSBub24tY29weWFibGUgc2NhbGFyIHR5cGUKLXRlbXBsYXRlPGludD4gdm9pZCBub25jb3B5YWJsZSgpCi17Ci0gIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxBbm5veWluZ1NjYWxhcixEeW5hbWljLDE+IFZlY3RvclR5cGU7Ci0gIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxBbm5veWluZ1NjYWxhcixEeW5hbWljLER5bmFtaWM+IE1hdHJpeFR5cGU7Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCBub25jb3B5YWJsZSgpIHsKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PEFubm95aW5nU2NhbGFyLCBEeW5hbWljLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8QW5ub3lpbmdTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IE1hdHJpeFR5cGU7CiAKICAgewogI2lmbmRlZiBFSUdFTl9URVNUX0FOTk9ZSU5HX1NDQUxBUl9ET05UX1RIUk9XCkBAIC0xMjIsMjQgKzExNiwyNSBAQAogI2VuZGlmCiAgICAgaW50IG4gPSA1MDsKICAgICBWZWN0b3JUeXBlIHYwKG4pLCB2MShuKTsKLSAgICBNYXRyaXhUeXBlIG0wKG4sbiksIG0xKG4sbiksIG0yKG4sbik7Ci0gICAgdjAuc2V0T25lcygpOyB2MS5zZXRPbmVzKCk7Ci0gICAgbTAuc2V0T25lcygpOyBtMS5zZXRPbmVzKCk7IG0yLnNldE9uZXMoKTsKLSAgICBWRVJJRlkobTA9PW0xKTsKLSAgICBtMC5jb25zZXJ2YXRpdmVSZXNpemUoMipuLDIqbik7Ci0gICAgVkVSSUZZKG0wLnRvcExlZnRDb3JuZXIobixuKSA9PSBtMSk7Ci0gICAgCisgICAgTWF0cml4VHlwZSBtMChuLCBuKSwgbTEobiwgbiksIG0yKG4sIG4pOworICAgIHYwLnNldE9uZXMoKTsKKyAgICB2MS5zZXRPbmVzKCk7CisgICAgbTAuc2V0T25lcygpOworICAgIG0xLnNldE9uZXMoKTsKKyAgICBtMi5zZXRPbmVzKCk7CisgICAgVkVSSUZZKG0wID09IG0xKTsKKyAgICBtMC5jb25zZXJ2YXRpdmVSZXNpemUoMiAqIG4sIDIgKiBuKTsKKyAgICBWRVJJRlkobTAudG9wTGVmdENvcm5lcihuLCBuKSA9PSBtMSk7CisKICAgICBWRVJJRlkodjAuaGVhZChuKSA9PSB2MSk7Ci0gICAgdjAuY29uc2VydmF0aXZlUmVzaXplKDIqbik7CisgICAgdjAuY29uc2VydmF0aXZlUmVzaXplKDIgKiBuKTsKICAgICBWRVJJRlkodjAuaGVhZChuKSA9PSB2MSk7CiAgIH0KLSAgVkVSSUZZKEFubm95aW5nU2NhbGFyOjppbnN0YW5jZXM9PTAgJiYgImdsb2JhbCBtZW1vcnkgbGVhayBkZXRlY3RlZCBpbiBub25jb3B5YWJsZSIpOworICBWRVJJRlkoQW5ub3lpbmdTY2FsYXI6Omluc3RhbmNlcyA9PSAwICYmICJnbG9iYWwgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQgaW4gbm9uY29weWFibGUiKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGNvbnNlcnZhdGl2ZV9yZXNpemUpCi17Ci0gIGZvcihpbnQgaT0wOyBpPGdfcmVwZWF0OyArK2kpCi0gIHsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjb25zZXJ2YXRpdmVfcmVzaXplKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7ICsraSkgewogICAgIENBTExfU1VCVEVTVF8xKChydW5fbWF0cml4X3Rlc3RzPGludCwgRWlnZW46OlJvd01ham9yPigpKSk7CiAgICAgQ0FMTF9TVUJURVNUXzEoKHJ1bl9tYXRyaXhfdGVzdHM8aW50LCBFaWdlbjo6Q29sTWFqb3I+KCkpKTsKICAgICBDQUxMX1NVQlRFU1RfMigocnVuX21hdHJpeF90ZXN0czxmbG9hdCwgRWlnZW46OlJvd01ham9yPigpKSk7CkBAIC0xNjEsNyArMTU2LDcgQEAKICNpZm5kZWYgRUlHRU5fVEVTVF9BTk5PWUlOR19TQ0FMQVJfRE9OVF9USFJPVwogICAgIEFubm95aW5nU2NhbGFyOjpkb250X3Rocm93ID0gdHJ1ZTsKICNlbmRpZgotICAgIENBTExfU1VCVEVTVF82KCggcnVuX3ZlY3Rvcl90ZXN0czxBbm5veWluZ1NjYWxhcj4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfNigoIG5vbmNvcHlhYmxlPDA+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoKHJ1bl92ZWN0b3JfdGVzdHM8QW5ub3lpbmdTY2FsYXI+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNigobm9uY29weWFibGU8MD4oKSkpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2NvbnN0ZXhwci5jcHAgYi90ZXN0L2NvbnN0ZXhwci5jcHAKaW5kZXggYjhmMGIwOS4uZWUxNTRmOCAxMDA2NDQKLS0tIGEvdGVzdC9jb25zdGV4cHIuY3BwCisrKyBiL3Rlc3QvY29uc3RleHByLmNwcApAQCAtMTksMjIgKzE5LDIyIEBACiAgIGNvbnN0ZXhwciBNYXRyaXgzaSBtYXQoe3sxLCAyLCAzfSwgezQsIDUsIDZ9LCB7NywgOCwgOX19KTsKICAgVkVSSUZZX0lTX0VRVUFMKG1hdC5zaXplKCksIDkpOwogICBWRVJJRllfSVNfRVFVQUwobWF0KDAsIDApLCAxKTsKLSAgc3RhdGljX2Fzc2VydChtYXQuY29lZmYoMCwxKSA9PSAyKTsKKyAgc3RhdGljX2Fzc2VydChtYXQuY29lZmYoMCwgMSkgPT0gMik7CiAgIGNvbnN0ZXhwciBBcnJheTMzaSBhcnIoe3sxLCAyLCAzfSwgezQsIDUsIDZ9LCB7NywgOCwgOX19KTsKICAgVkVSSUZZX0lTX0VRVUFMKGFycigwLCAwKSwgMSk7CiAgIFZFUklGWV9JU19FUVVBTChhcnIuc2l6ZSgpLCA5KTsKLSAgc3RhdGljX2Fzc2VydChhcnIuY29lZmYoMCwxKSA9PSAyKTsKKyAgc3RhdGljX2Fzc2VydChhcnIuY29lZmYoMCwgMSkgPT0gMik7CiAgIC8vIEFsc28gY2hlY2sgZHluYW1pYyBzaXplIGFycmF5cy9tYXRyaWNlcyB3aXRoIGZpeGVkLXNpemUgc3RvcmFnZSAoY3VycmVudGx5CiAgIC8vIG9ubHkgd29ya3MgaWYgYWxsIGVsZW1lbnRzIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSBjb21waWxlcgogICAvLyBjb21wbGFpbnMgYWJvdXQgdW5pbml0aWFsaXplZCB0cmFpbGluZyBlbGVtZW50cy4KICAgY29uc3RleHByIE1hdHJpeDxpbnQsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYywgMCwgMywgMz4gZHluX21hdCh7ezEsIDIsIDN9LCB7NCwgNSwgNn0sIHs3LCA4LCA5fX0pOwogICBWRVJJRllfSVNfRVFVQUwoZHluX21hdC5zaXplKCksIDkpOwogICBWRVJJRllfSVNfRVFVQUwoZHluX21hdCgwLCAwKSwgMSk7Ci0gIHN0YXRpY19hc3NlcnQoZHluX21hdC5jb2VmZigwLDEpID09IDIpOworICBzdGF0aWNfYXNzZXJ0KGR5bl9tYXQuY29lZmYoMCwgMSkgPT0gMik7CiAgIGNvbnN0ZXhwciBBcnJheTxpbnQsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYywgMCwgMywgMz4gZHluX2Fycih7ezEsIDIsIDN9LCB7NCwgNSwgNn0sIHs3LCA4LCA5fX0pOwogICBWRVJJRllfSVNfRVFVQUwoZHluX2FycigwLCAwKSwgMSk7CiAgIFZFUklGWV9JU19FUVVBTChkeW5fYXJyLnNpemUoKSwgOSk7Ci0gIHN0YXRpY19hc3NlcnQoZHluX2Fyci5jb2VmZigwLDEpID09IDIpOworICBzdGF0aWNfYXNzZXJ0KGR5bl9hcnIuY29lZmYoMCwgMSkgPT0gMik7CiAjZW5kaWYgIC8vIEVJR0VOX0NPTVBfQ1hYVkVSID49IDIwCiB9CiAKQEAgLTQ3LDYgKzQ3LDYgQEAKIEVJR0VOX0RFQ0xBUkVfVEVTVChjb25zdGV4cHJfZ2xvYmFsKSB7CiAgIFZFUklGWV9JU19FUVVBTChnbG9iYWxfbWF0LnNpemUoKSwgNCk7CiAgIFZFUklGWV9JU19FUVVBTChnbG9iYWxfbWF0KDAsIDApLCAxKTsKLSAgc3RhdGljX2Fzc2VydChnbG9iYWxfbWF0LmNvZWZmKDAsMCkgPT0gMSk7CisgIHN0YXRpY19hc3NlcnQoZ2xvYmFsX21hdC5jb2VmZigwLCAwKSA9PSAxKTsKIH0KICNlbmRpZiAgLy8gRUlHRU5fQ09NUF9DWFhWRVIgPj0gMjAKZGlmZiAtLWdpdCBhL3Rlc3QvY29uc3RydWN0b3IuY3BwIGIvdGVzdC9jb25zdHJ1Y3Rvci5jcHAKaW5kZXggZmZkNWU4MC4uZmIxMjVjNCAxMDA2NDQKLS0tIGEvdGVzdC9jb25zdHJ1Y3Rvci5jcHAKKysrIGIvdGVzdC9jb25zdHJ1Y3Rvci5jcHAKQEAgLTcsOTIgKzcsOTEgQEAKIC8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAogLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCiAKLQogI2RlZmluZSBURVNUX0VOQUJMRV9URU1QT1JBUllfVFJBQ0tJTkcKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gc3RydWN0IFdyYXBwZXIKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IFdyYXBwZXIgewogICBNYXRyaXhUeXBlIG1fbWF0OwotICBpbmxpbmUgV3JhcHBlcihjb25zdCBNYXRyaXhUeXBlICZ4KSA6IG1fbWF0KHgpIHt9Ci0gIGlubGluZSBvcGVyYXRvciBjb25zdCBNYXRyaXhUeXBlJiAoKSBjb25zdCB7IHJldHVybiBtX21hdDsgfQotICBpbmxpbmUgb3BlcmF0b3IgTWF0cml4VHlwZSYgKCkgeyByZXR1cm4gbV9tYXQ7IH0KKyAgaW5saW5lIFdyYXBwZXIoY29uc3QgTWF0cml4VHlwZSYgeCkgOiBtX21hdCh4KSB7fQorICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgTWF0cml4VHlwZSYoKSBjb25zdCB7IHJldHVybiBtX21hdDsgfQorICBpbmxpbmUgb3BlcmF0b3IgTWF0cml4VHlwZSYoKSB7IHJldHVybiBtX21hdDsgfQogfTsKIAotZW51bSBteV9zaXplcyB7IE0gPSAxMiwgTiA9IDd9OworZW51bSBteV9zaXplcyB7IE0gPSAxMiwgTiA9IDcgfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBjdG9yX2luaXQxKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY3Rvcl9pbml0MShjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIC8vIENoZWNrIGxvZ2ljIGluIFBsYWluT2JqZWN0QmFzZTo6X2luaXQxCiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwogCi0gIE1hdHJpeFR5cGUgbTAgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBtMCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKIAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggTWF0cml4VHlwZSBtMShtMCksIDEpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggTWF0cml4VHlwZSBtMihtMCttMCksIDEpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggTWF0cml4VHlwZSBtMihtMC5ibG9jaygwLDAscm93cyxjb2xzKSkgLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoTWF0cml4VHlwZSBtMShtMCksIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChNYXRyaXhUeXBlIG0yKG0wICsgbTApLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoTWF0cml4VHlwZSBtMihtMC5ibG9jaygwLCAwLCByb3dzLCBjb2xzKSksIDEpOwogCiAgIFdyYXBwZXI8TWF0cml4VHlwZT4gd3JhcHBlcihtMCk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBNYXRyaXhUeXBlIG0zKHdyYXBwZXIpICwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKE1hdHJpeFR5cGUgbTMod3JhcHBlciksIDEpOwogfQogCi0KLUVJR0VOX0RFQ0xBUkVfVEVTVChjb25zdHJ1Y3RvcikKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggY3Rvcl9pbml0MShNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGN0b3JfaW5pdDEoTWF0cml4NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggY3Rvcl9pbml0MShNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggY3Rvcl9pbml0MShNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworRUlHRU5fREVDTEFSRV9URVNUKGNvbnN0cnVjdG9yKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKGN0b3JfaW5pdDEoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoY3Rvcl9pbml0MShNYXRyaXg0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoY3Rvcl9pbml0MSgKKyAgICAgICAgTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF8xKGN0b3JfaW5pdDEoCisgICAgICAgIE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwogICB9CiAgIHsKLSAgICBNYXRyaXg8SW5kZXgsMSwxPiBhKDEyMyk7CisgICAgTWF0cml4PEluZGV4LCAxLCAxPiBhKDEyMyk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKGFbMF0sIDEyMyk7CiAgIH0KICAgewotICAgIE1hdHJpeDxJbmRleCwxLDE+IGEoMTIzLjApOworICAgIE1hdHJpeDxJbmRleCwgMSwgMT4gYSgxMjMuMCk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKGFbMF0sIDEyMyk7CiAgIH0KICAgewotICAgIE1hdHJpeDxmbG9hdCwxLDE+IGEoMTIzKTsKKyAgICBNYXRyaXg8ZmxvYXQsIDEsIDE+IGEoMTIzKTsKICAgICBWRVJJRllfSVNfRVFVQUwoYVswXSwgMTIzLmYpOwogICB9CiAgIHsKLSAgICBBcnJheTxJbmRleCwxLDE+IGEoMTIzKTsKKyAgICBBcnJheTxJbmRleCwgMSwgMT4gYSgxMjMpOwogICAgIFZFUklGWV9JU19FUVVBTChhWzBdLCAxMjMpOwogICB9CiAgIHsKLSAgICBBcnJheTxJbmRleCwxLDE+IGEoMTIzLjApOworICAgIEFycmF5PEluZGV4LCAxLCAxPiBhKDEyMy4wKTsKICAgICBWRVJJRllfSVNfRVFVQUwoYVswXSwgMTIzKTsKICAgfQogICB7Ci0gICAgQXJyYXk8ZmxvYXQsMSwxPiBhKDEyMyk7CisgICAgQXJyYXk8ZmxvYXQsIDEsIDE+IGEoMTIzKTsKICAgICBWRVJJRllfSVNfRVFVQUwoYVswXSwgMTIzLmYpOwogICB9CiAgIHsKLSAgICBBcnJheTxJbmRleCwzLDM+IGEoMTIzKTsKKyAgICBBcnJheTxJbmRleCwgMywgMz4gYSgxMjMpOwogICAgIFZFUklGWV9JU19FUVVBTChhKDQpLCAxMjMpOwogICB9CiAgIHsKLSAgICBBcnJheTxJbmRleCwzLDM+IGEoMTIzLjApOworICAgIEFycmF5PEluZGV4LCAzLCAzPiBhKDEyMy4wKTsKICAgICBWRVJJRllfSVNfRVFVQUwoYSg0KSwgMTIzKTsKICAgfQogICB7Ci0gICAgQXJyYXk8ZmxvYXQsMywzPiBhKDEyMyk7CisgICAgQXJyYXk8ZmxvYXQsIDMsIDM+IGEoMTIzKTsKICAgICBWRVJJRllfSVNfRVFVQUwoYSg0KSwgMTIzLmYpOwogICB9CiAgIHsKLSAgICBNYXRyaXhYaSBtMShNLE4pOwotICAgIFZFUklGWV9JU19FUVVBTChtMS5yb3dzKCksTSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKG0xLmNvbHMoKSxOKTsKLSAgICBBcnJheVhYaSBhMShNLE4pOwotICAgIFZFUklGWV9JU19FUVVBTChhMS5yb3dzKCksTSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKGExLmNvbHMoKSxOKTsKKyAgICBNYXRyaXhYaSBtMShNLCBOKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobTEucm93cygpLCBNKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobTEuY29scygpLCBOKTsKKyAgICBBcnJheVhYaSBhMShNLCBOKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoYTEucm93cygpLCBNKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoYTEuY29scygpLCBOKTsKICAgICBWZWN0b3JYaSB2MShNKTsKLSAgICBWRVJJRllfSVNfRVFVQUwodjEuc2l6ZSgpLE0pOworICAgIFZFUklGWV9JU19FUVVBTCh2MS5zaXplKCksIE0pOwogICAgIEFycmF5WGkgYTIoTSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKGEyLnNpemUoKSxNKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoYTIuc2l6ZSgpLCBNKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9jb3JuZXJzLmNwcCBiL3Rlc3QvY29ybmVycy5jcHAKaW5kZXggNzMzNDJhOC4uOGJiYjNmOCAxMDA2NDQKLS0tIGEvdGVzdC9jb3JuZXJzLmNwcAorKysgYi90ZXN0L2Nvcm5lcnMuY3BwCkBAIC05LDQxICs5LDQxIEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAKLSNkZWZpbmUgQ09NUEFSRV9DT1JORVIoQSxCKSBcCisjZGVmaW5lIENPTVBBUkVfQ09STkVSKEEsIEIpICAgICAgICAgICBcCiAgIFZFUklGWV9JU19FUVVBTChtYXRyaXguQSwgbWF0cml4LkIpOyBcCiAgIFZFUklGWV9JU19FUVVBTChjb25zdF9tYXRyaXguQSwgY29uc3RfbWF0cml4LkIpOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNvcm5lcnMoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjb3JuZXJzKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKLSAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEscm93cyk7Ci0gIEluZGV4IGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLGNvbHMpOworICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgcm93cyk7CisgIEluZGV4IGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBjb2xzKTsKIAotICBNYXRyaXhUeXBlIG1hdHJpeCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICBjb25zdCBNYXRyaXhUeXBlIGNvbnN0X21hdHJpeCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIG1hdHJpeCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgY29uc3QgTWF0cml4VHlwZSBjb25zdF9tYXRyaXggPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CiAKLSAgQ09NUEFSRV9DT1JORVIodG9wTGVmdENvcm5lcihyLGMpLCBibG9jaygwLDAscixjKSk7Ci0gIENPTVBBUkVfQ09STkVSKHRvcFJpZ2h0Q29ybmVyKHIsYyksIGJsb2NrKDAsY29scy1jLHIsYykpOwotICBDT01QQVJFX0NPUk5FUihib3R0b21MZWZ0Q29ybmVyKHIsYyksIGJsb2NrKHJvd3MtciwwLHIsYykpOwotICBDT01QQVJFX0NPUk5FUihib3R0b21SaWdodENvcm5lcihyLGMpLCBibG9jayhyb3dzLXIsY29scy1jLHIsYykpOworICBDT01QQVJFX0NPUk5FUih0b3BMZWZ0Q29ybmVyKHIsIGMpLCBibG9jaygwLCAwLCByLCBjKSk7CisgIENPTVBBUkVfQ09STkVSKHRvcFJpZ2h0Q29ybmVyKHIsIGMpLCBibG9jaygwLCBjb2xzIC0gYywgciwgYykpOworICBDT01QQVJFX0NPUk5FUihib3R0b21MZWZ0Q29ybmVyKHIsIGMpLCBibG9jayhyb3dzIC0gciwgMCwgciwgYykpOworICBDT01QQVJFX0NPUk5FUihib3R0b21SaWdodENvcm5lcihyLCBjKSwgYmxvY2socm93cyAtIHIsIGNvbHMgLSBjLCByLCBjKSk7CiAKLSAgSW5kZXggc3IgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLHJvd3MpIC0gMTsKLSAgSW5kZXggbnIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLHJvd3Mtc3IpOwotICBJbmRleCBzYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsY29scykgLSAxOwotICBJbmRleCBuYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsY29scy1zYyk7CisgIEluZGV4IHNyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgcm93cykgLSAxOworICBJbmRleCBuciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIHJvd3MgLSBzcik7CisgIEluZGV4IHNjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgY29scykgLSAxOworICBJbmRleCBuYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIGNvbHMgLSBzYyk7CiAKLSAgQ09NUEFSRV9DT1JORVIodG9wUm93cyhyKSwgYmxvY2soMCwwLHIsY29scykpOwotICBDT01QQVJFX0NPUk5FUihtaWRkbGVSb3dzKHNyLG5yKSwgYmxvY2soc3IsMCxucixjb2xzKSk7Ci0gIENPTVBBUkVfQ09STkVSKGJvdHRvbVJvd3MociksIGJsb2NrKHJvd3MtciwwLHIsY29scykpOwotICBDT01QQVJFX0NPUk5FUihsZWZ0Q29scyhjKSwgYmxvY2soMCwwLHJvd3MsYykpOwotICBDT01QQVJFX0NPUk5FUihtaWRkbGVDb2xzKHNjLG5jKSwgYmxvY2soMCxzYyxyb3dzLG5jKSk7Ci0gIENPTVBBUkVfQ09STkVSKHJpZ2h0Q29scyhjKSwgYmxvY2soMCxjb2xzLWMscm93cyxjKSk7CisgIENPTVBBUkVfQ09STkVSKHRvcFJvd3MociksIGJsb2NrKDAsIDAsIHIsIGNvbHMpKTsKKyAgQ09NUEFSRV9DT1JORVIobWlkZGxlUm93cyhzciwgbnIpLCBibG9jayhzciwgMCwgbnIsIGNvbHMpKTsKKyAgQ09NUEFSRV9DT1JORVIoYm90dG9tUm93cyhyKSwgYmxvY2socm93cyAtIHIsIDAsIHIsIGNvbHMpKTsKKyAgQ09NUEFSRV9DT1JORVIobGVmdENvbHMoYyksIGJsb2NrKDAsIDAsIHJvd3MsIGMpKTsKKyAgQ09NUEFSRV9DT1JORVIobWlkZGxlQ29scyhzYywgbmMpLCBibG9jaygwLCBzYywgcm93cywgbmMpKTsKKyAgQ09NUEFSRV9DT1JORVIocmlnaHRDb2xzKGMpLCBibG9jaygwLCBjb2xzIC0gYywgcm93cywgYykpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgQ1Jvd3MsIGludCBDQ29scywgaW50IFNSb3dzLCBpbnQgU0NvbHM+IHZvaWQgY29ybmVyc19maXhlZHNpemUoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBDUm93cywgaW50IENDb2xzLCBpbnQgU1Jvd3MsIGludCBTQ29scz4KK3ZvaWQgY29ybmVyc19maXhlZHNpemUoKSB7CiAgIE1hdHJpeFR5cGUgbWF0cml4ID0gTWF0cml4VHlwZTo6UmFuZG9tKCk7CiAgIGNvbnN0IE1hdHJpeFR5cGUgY29uc3RfbWF0cml4ID0gTWF0cml4VHlwZTo6UmFuZG9tKCk7CiAKQEAgLTUyLDY2ICs1Miw3NCBAQAogICAgIGNvbHMgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKICAgICByID0gQ1Jvd3MsCiAgICAgYyA9IENDb2xzLAotCXNyID0gU1Jvd3MsCi0Jc2MgPSBTQ29scworICAgIHNyID0gU1Jvd3MsCisgICAgc2MgPSBTQ29scwogICB9OwogCi0gIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8cixjPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGM+KDAsMCkpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8cixjPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGM+KDAsY29scy1jKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSBib3R0b21MZWZ0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjPihyb3dzLXIsMCkpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8cixjPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGM+KHJvd3Mtcixjb2xzLWMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8ciwgYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8ciwgYz4oMCwgMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8ciwgYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8ciwgYz4oMCwgY29scyAtIGMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8ciwgYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8ciwgYz4ocm93cyAtIHIsIDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPHIsIGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJsb2NrPHIsIGM+KHJvd3MgLSByLCBjb2xzIC0gYykpKTsKIAotICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxyLER5bmFtaWM+KHIsYykpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8cixjPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxyLER5bmFtaWM+KHIsYykpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgYm90dG9tTGVmdENvcm5lcjxyLGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8cixEeW5hbWljPihyLGMpKSk7Ci0gIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8cixEeW5hbWljPihyLGMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8ciwgYz4oKSksIChtYXRyaXgudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxyLCBEeW5hbWljPihyLCBjKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxyLCBjPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxyLCBEeW5hbWljPihyLCBjKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSBib3R0b21MZWZ0Q29ybmVyPHIsIGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8ciwgRHluYW1pYz4ociwgYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8ciwgYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8ciwgRHluYW1pYz4ociwgYykpKTsKIAotICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxEeW5hbWljLGM+KHIsYykpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8cixjPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxEeW5hbWljLGM+KHIsYykpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgYm90dG9tTGVmdENvcm5lcjxyLGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8RHluYW1pYyxjPihyLGMpKSk7Ci0gIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPHIsYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8RHluYW1pYyxjPihyLGMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8ciwgYz4oKSksIChtYXRyaXgudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxEeW5hbWljLCBjPihyLCBjKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxyLCBjPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxEeW5hbWljLCBjPihyLCBjKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSBib3R0b21MZWZ0Q29ybmVyPHIsIGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8RHluYW1pYywgYz4ociwgYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8ciwgYz4oKSksIChtYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8RHluYW1pYywgYz4ociwgYykpKTsKIAotICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSB0b3BSb3dzPHI+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJsb2NrPHIsY29scz4oMCwwKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSBtaWRkbGVSb3dzPHI+KHNyKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjb2xzPihzciwwKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSBib3R0b21Sb3dzPHI+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJsb2NrPHIsY29scz4ocm93cy1yLDApKSk7Ci0gIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIGxlZnRDb2xzPGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJsb2NrPHJvd3MsYz4oMCwwKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSBtaWRkbGVDb2xzPGM+KHNjKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cm93cyxjPigwLHNjKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSByaWdodENvbHM8Yz4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8cm93cyxjPigwLGNvbHMtYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgdG9wUm93czxyPigpKSwgKG1hdHJpeC50ZW1wbGF0ZSBibG9jazxyLCBjb2xzPigwLCAwKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdHJpeC50ZW1wbGF0ZSBtaWRkbGVSb3dzPHI+KHNyKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8ciwgY29scz4oc3IsIDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIGJvdHRvbVJvd3M8cj4oKSksIChtYXRyaXgudGVtcGxhdGUgYmxvY2s8ciwgY29scz4ocm93cyAtIHIsIDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIGxlZnRDb2xzPGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJsb2NrPHJvd3MsIGM+KDAsIDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0cml4LnRlbXBsYXRlIG1pZGRsZUNvbHM8Yz4oc2MpKSwgKG1hdHJpeC50ZW1wbGF0ZSBibG9jazxyb3dzLCBjPigwLCBzYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXRyaXgudGVtcGxhdGUgcmlnaHRDb2xzPGM+KCkpLCAobWF0cml4LnRlbXBsYXRlIGJsb2NrPHJvd3MsIGM+KDAsIGNvbHMgLSBjKSkpOwogCi0gIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8cixjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGM+KDAsMCkpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8cixjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGM+KDAsY29scy1jKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21MZWZ0Q29ybmVyPHIsYz4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjPihyb3dzLXIsMCkpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8cixjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyLGM+KHJvd3Mtcixjb2xzLWMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8ciwgYz4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8ciwgYz4oMCwgMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8ciwgYz4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8ciwgYz4oMCwgY29scyAtIGMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8ciwgYz4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8ciwgYz4ocm93cyAtIHIsIDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPHIsIGM+KCkpLAorICAgICAgICAgICAgICAgICAgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyLCBjPihyb3dzIC0gciwgY29scyAtIGMpKSk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxyLGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8cixEeW5hbWljPihyLGMpKSk7Ci0gIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIHRvcFJpZ2h0Q29ybmVyPHIsYz4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8cixEeW5hbWljPihyLGMpKSk7Ci0gIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8cixjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21MZWZ0Q29ybmVyPHIsRHluYW1pYz4ocixjKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21SaWdodENvcm5lcjxyLGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPHIsRHluYW1pYz4ocixjKSkpOworICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPHIsIGM+KCkpLAorICAgICAgICAgICAgICAgICAgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPHIsIER5bmFtaWM+KHIsIGMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIHRvcFJpZ2h0Q29ybmVyPHIsIGM+KCkpLAorICAgICAgICAgICAgICAgICAgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxyLCBEeW5hbWljPihyLCBjKSkpOworICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21MZWZ0Q29ybmVyPHIsIGM+KCkpLAorICAgICAgICAgICAgICAgICAgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21MZWZ0Q29ybmVyPHIsIER5bmFtaWM+KHIsIGMpKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJvdHRvbVJpZ2h0Q29ybmVyPHIsIGM+KCkpLAorICAgICAgICAgICAgICAgICAgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21SaWdodENvcm5lcjxyLCBEeW5hbWljPihyLCBjKSkpOwogCi0gIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8cixjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPER5bmFtaWMsYz4ocixjKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxyLGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIHRvcFJpZ2h0Q29ybmVyPER5bmFtaWMsYz4ocixjKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21MZWZ0Q29ybmVyPHIsYz4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYm90dG9tTGVmdENvcm5lcjxEeW5hbWljLGM+KHIsYykpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8cixjPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21SaWdodENvcm5lcjxEeW5hbWljLGM+KHIsYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxyLCBjPigpKSwKKyAgICAgICAgICAgICAgICAgIChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxEeW5hbWljLCBjPihyLCBjKSkpOworICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSB0b3BSaWdodENvcm5lcjxyLCBjPigpKSwKKyAgICAgICAgICAgICAgICAgIChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8RHluYW1pYywgYz4ociwgYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgYm90dG9tTGVmdENvcm5lcjxyLCBjPigpKSwKKyAgICAgICAgICAgICAgICAgIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYm90dG9tTGVmdENvcm5lcjxEeW5hbWljLCBjPihyLCBjKSkpOworICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21SaWdodENvcm5lcjxyLCBjPigpKSwKKyAgICAgICAgICAgICAgICAgIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYm90dG9tUmlnaHRDb3JuZXI8RHluYW1pYywgYz4ociwgYykpKTsKIAotICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSB0b3BSb3dzPHI+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJsb2NrPHIsY29scz4oMCwwKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBtaWRkbGVSb3dzPHI+KHNyKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8cixjb2xzPihzciwwKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBib3R0b21Sb3dzPHI+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJsb2NrPHIsY29scz4ocm93cy1yLDApKSk7Ci0gIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIGxlZnRDb2xzPGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJsb2NrPHJvd3MsYz4oMCwwKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBtaWRkbGVDb2xzPGM+KHNjKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8cm93cyxjPigwLHNjKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSByaWdodENvbHM8Yz4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8cm93cyxjPigwLGNvbHMtYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgdG9wUm93czxyPigpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyLCBjb2xzPigwLCAwKSkpOworICBWRVJJRllfSVNfRVFVQUwoKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBtaWRkbGVSb3dzPHI+KHNyKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8ciwgY29scz4oc3IsIDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJvdHRvbVJvd3M8cj4oKSksIChjb25zdF9tYXRyaXgudGVtcGxhdGUgYmxvY2s8ciwgY29scz4ocm93cyAtIHIsIDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIGxlZnRDb2xzPGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJsb2NrPHJvd3MsIGM+KDAsIDApKSk7CisgIFZFUklGWV9JU19FUVVBTCgoY29uc3RfbWF0cml4LnRlbXBsYXRlIG1pZGRsZUNvbHM8Yz4oc2MpKSwgKGNvbnN0X21hdHJpeC50ZW1wbGF0ZSBibG9jazxyb3dzLCBjPigwLCBzYykpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChjb25zdF9tYXRyaXgudGVtcGxhdGUgcmlnaHRDb2xzPGM+KCkpLCAoY29uc3RfbWF0cml4LnRlbXBsYXRlIGJsb2NrPHJvd3MsIGM+KDAsIGNvbHMgLSBjKSkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoY29ybmVycykKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggY29ybmVycyhNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGNvcm5lcnMoTWF0cml4NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggY29ybmVycyhNYXRyaXg8aW50LDEwLDEyPigpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBjb3JuZXJzKE1hdHJpeFhjZig1LCA3KSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggY29ybmVycyhNYXRyaXhYZigyMSwgMjApKSApOworRUlHRU5fREVDTEFSRV9URVNUKGNvcm5lcnMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoY29ybmVycyhNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihjb3JuZXJzKE1hdHJpeDRkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhjb3JuZXJzKE1hdHJpeDxpbnQsIDEwLCAxMj4oKSkpOworICAgIENBTExfU1VCVEVTVF80KGNvcm5lcnMoTWF0cml4WGNmKDUsIDcpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoY29ybmVycyhNYXRyaXhYZigyMSwgMjApKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfMSgoIGNvcm5lcnNfZml4ZWRzaXplPE1hdHJpeDxmbG9hdCwgMSwgMT4sIDEsIDEsIDAsIDA+KCkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoKCBjb3JuZXJzX2ZpeGVkc2l6ZTxNYXRyaXg0ZCwyLDIsMSwxPigpICkpOwotICAgIENBTExfU1VCVEVTVF8zKCggY29ybmVyc19maXhlZHNpemU8TWF0cml4PGludCwxMCwxMj4sNCw3LDUsMj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgoY29ybmVyc19maXhlZHNpemU8TWF0cml4PGZsb2F0LCAxLCAxPiwgMSwgMSwgMCwgMD4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKChjb3JuZXJzX2ZpeGVkc2l6ZTxNYXRyaXg0ZCwgMiwgMiwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKChjb3JuZXJzX2ZpeGVkc2l6ZTxNYXRyaXg8aW50LCAxMCwgMTI+LCA0LCA3LCA1LCAyPigpKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvY3RvcmxlYWsuY3BwIGIvdGVzdC9jdG9ybGVhay5jcHAKaW5kZXggNzM5MDQxNy4uZWIyNTg5NyAxMDA2NDQKLS0tIGEvdGVzdC9jdG9ybGVhay5jcHAKKysrIGIvdGVzdC9jdG9ybGVhay5jcHAKQEAgLTIsMjUgKzIsMjUgQEAKIAogI2luY2x1ZGUgPGV4Y2VwdGlvbj4gIC8vIHN0ZDo6ZXhjZXB0aW9uCiAKLXN0cnVjdCBGb28KLXsKK3N0cnVjdCBGb28gewogICBzdGF0aWMgSW5kZXggb2JqZWN0X2NvdW50OwogICBzdGF0aWMgSW5kZXggb2JqZWN0X2xpbWl0OwogICBpbnQgZHVtbXk7CiAKLSAgRm9vKCkgOiBkdW1teSgwKQotICB7CisgIEZvbygpIDogZHVtbXkoMCkgewogI2lmZGVmIEVJR0VOX0VYQ0VQVElPTlMKICAgICAvLyBUT0RPOiBJcyB0aGlzIHRoZSBjb3JyZWN0IHdheSB0byBoYW5kbGUgdGhpcz8KLSAgICBpZiAoRm9vOjpvYmplY3RfY291bnQgPiBGb286Om9iamVjdF9saW1pdCkgeyBzdGQ6OmNvdXQgPDwgIlxuVGhyb3chXG4iOyB0aHJvdyBGb286OkZhaWwoKTsgfQorICAgIGlmIChGb286Om9iamVjdF9jb3VudCA+IEZvbzo6b2JqZWN0X2xpbWl0KSB7CisgICAgICBzdGQ6OmNvdXQgPDwgIlxuVGhyb3chXG4iOworICAgICAgdGhyb3cgRm9vOjpGYWlsKCk7CisgICAgfQogI2VuZGlmCi0JICBzdGQ6OmNvdXQgPDwgJysnOworICAgIHN0ZDo6Y291dCA8PCAnKyc7CiAgICAgKytGb286Om9iamVjdF9jb3VudDsKICAgfQogCi0gIH5Gb28oKQotICB7Ci0JICBzdGQ6OmNvdXQgPDwgJy0nOworICB+Rm9vKCkgeworICAgIHN0ZDo6Y291dCA8PCAnLSc7CiAgICAgLS1Gb286Om9iamVjdF9jb3VudDsKICAgfQogCkBAIC0zMyw0NyArMzMsNDUgQEAKICN1bmRlZiBFSUdFTl9URVNUX01BWF9TSVpFCiAjZGVmaW5lIEVJR0VOX1RFU1RfTUFYX1NJWkUgMwogCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3RvcmxlYWspCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3RvcmxlYWspIHsKICAgdHlwZWRlZiBNYXRyaXg8Rm9vLCBEeW5hbWljLCBEeW5hbWljPiBNYXRyaXhYOwogICB0eXBlZGVmIE1hdHJpeDxGb28sIER5bmFtaWMsIDE+IFZlY3Rvclg7Ci0gIAorCiAgIEZvbzo6b2JqZWN0X2NvdW50ID0gMDsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMixFSUdFTl9URVNUX01BWF9TSVpFKSwgY29scyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDIsRUlHRU5fVEVTVF9NQVhfU0laRSk7Ci0gICAgRm9vOjpvYmplY3RfbGltaXQgPSByb3dzKmNvbHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIEluZGV4IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLCBFSUdFTl9URVNUX01BWF9TSVpFKSwKKyAgICAgICAgICBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMiwgRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgICAgRm9vOjpvYmplY3RfbGltaXQgPSByb3dzICogY29sczsKICAgICB7Ci0gICAgTWF0cml4WCByKHJvd3MsIGNvbHMpOwotICAgIEZvbzo6b2JqZWN0X2xpbWl0ID0gci5zaXplKCkraW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cypjb2xzIC0gMik7Ci0gICAgc3RkOjpjb3V0IDw8ICJvYmplY3RfbGltaXQgPSIgPDwgRm9vOjpvYmplY3RfbGltaXQgPDwgc3RkOjplbmRsOworICAgICAgTWF0cml4WCByKHJvd3MsIGNvbHMpOworICAgICAgRm9vOjpvYmplY3RfbGltaXQgPSByLnNpemUoKSArIGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgKiBjb2xzIC0gMik7CisgICAgICBzdGQ6OmNvdXQgPDwgIm9iamVjdF9saW1pdCA9IiA8PCBGb286Om9iamVjdF9saW1pdCA8PCBzdGQ6OmVuZGw7CiAjaWZkZWYgRUlHRU5fRVhDRVBUSU9OUwotICAgIHRyeQotICAgIHsKKyAgICAgIHRyeSB7CiAjZW5kaWYKLSAgICAgIGlmKGludGVybmFsOjpyYW5kb208Ym9vbD4oKSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgICAgICAgIlxuTWF0cml4WCBtKCIgPDwgcm93cyA8PCAiLCAiIDw8IGNvbHMgPDwgIik7XG4iOwotICAgICAgICBNYXRyaXhYIG0ocm93cywgY29scyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICAgICAgICJcbk1hdHJpeFggbShyKTtcbiI7Ci0gICAgICAgIE1hdHJpeFggbShyKTsKLSAgICAgIH0KKyAgICAgICAgaWYgKGludGVybmFsOjpyYW5kb208Ym9vbD4oKSkgeworICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXG5NYXRyaXhYIG0oIiA8PCByb3dzIDw8ICIsICIgPDwgY29scyA8PCAiKTtcbiI7CisgICAgICAgICAgTWF0cml4WCBtKHJvd3MsIGNvbHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXG5NYXRyaXhYIG0ocik7XG4iOworICAgICAgICAgIE1hdHJpeFggbShyKTsKKyAgICAgICAgfQogI2lmZGVmIEVJR0VOX0VYQ0VQVElPTlMKLSAgICAgIFZFUklGWShmYWxzZSk7ICAvLyBub3QgcmVhY2hlZCBpZiBleGNlcHRpb25zIGFyZSBlbmFibGVkCi0gICAgfQotICAgIGNhdGNoIChjb25zdCBGb286OkZhaWwmKSB7IC8qIGlnbm9yZSAqLyB9CisgICAgICAgIFZFUklGWShmYWxzZSk7ICAgICAgICAgICAgIC8vIG5vdCByZWFjaGVkIGlmIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQKKyAgICAgIH0gY2F0Y2ggKGNvbnN0IEZvbzo6RmFpbCYpIHsgLyogaWdub3JlICovCisgICAgICB9CiAjZW5kaWYKICAgICB9CiAgICAgVkVSSUZZX0lTX0VRVUFMKEluZGV4KDApLCBGb286Om9iamVjdF9jb3VudCk7CiAKICAgICB7Ci0gICAgICBGb286Om9iamVjdF9saW1pdCA9IChyb3dzKzEpKihjb2xzKzEpOworICAgICAgRm9vOjpvYmplY3RfbGltaXQgPSAocm93cyArIDEpICogKGNvbHMgKyAxKTsKICAgICAgIE1hdHJpeFggQShyb3dzLCBjb2xzKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTChGb286Om9iamVjdF9jb3VudCwgcm93cypjb2xzKTsKLSAgICAgIFZlY3Rvclggdj1BLnJvdygwKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTChGb286Om9iamVjdF9jb3VudCwgKHJvd3MrMSkqY29scyk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoRm9vOjpvYmplY3RfY291bnQsIHJvd3MgKiBjb2xzKTsKKyAgICAgIFZlY3RvclggdiA9IEEucm93KDApOworICAgICAgVkVSSUZZX0lTX0VRVUFMKEZvbzo6b2JqZWN0X2NvdW50LCAocm93cyArIDEpICogY29scyk7CiAgICAgICB2ID0gQS5jb2woMCk7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwoRm9vOjpvYmplY3RfY291bnQsIHJvd3MqKGNvbHMrMSkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKEZvbzo6b2JqZWN0X2NvdW50LCByb3dzICogKGNvbHMgKyAxKSk7CiAgICAgfQogICAgIFZFUklGWV9JU19FUVVBTChJbmRleCgwKSwgRm9vOjpvYmplY3RfY291bnQpOwogICB9CmRpZmYgLS1naXQgYS90ZXN0L2RlbnNlTE0uY3BwIGIvdGVzdC9kZW5zZUxNLmNwcAppbmRleCBhZmI4MDA0Li40NzFlOTQ2IDEwMDY0NAotLS0gYS90ZXN0L2RlbnNlTE0uY3BwCisrKyBiL3Rlc3QvZGVuc2VMTS5jcHAKQEAgLTE3LDE3NCArMTcsMTU2IEBACiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Ci1zdHJ1Y3QgRGVuc2VMTSA6IERlbnNlRnVuY3RvcjxTY2FsYXI+Ci17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RydWN0IERlbnNlTE0gOiBEZW5zZUZ1bmN0b3I8U2NhbGFyPiB7CiAgIHR5cGVkZWYgRGVuc2VGdW5jdG9yPFNjYWxhcj4gQmFzZTsKICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpKYWNvYmlhblR5cGUgSmFjb2JpYW5UeXBlOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBWZWN0b3JUeXBlOwotICAKLSAgRGVuc2VMTShpbnQgbiwgaW50IG0pIDogRGVuc2VGdW5jdG9yPFNjYWxhcj4obixtKSAKLSAgeyB9Ci0gCi0gIFZlY3RvclR5cGUgbW9kZWwoY29uc3QgVmVjdG9yVHlwZSYgdXYsIFZlY3RvclR5cGUmIHgpCi0gIHsKLSAgICBWZWN0b3JUeXBlIHk7IC8vIFNob3VsZCBjaGFuZ2UgdG8gdXNlIGV4cHJlc3Npb24gdGVtcGxhdGUKLSAgICBpbnQgbSA9IEJhc2U6OnZhbHVlcygpOyAKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBWZWN0b3JUeXBlOworCisgIERlbnNlTE0oaW50IG4sIGludCBtKSA6IERlbnNlRnVuY3RvcjxTY2FsYXI+KG4sIG0pIHt9CisKKyAgVmVjdG9yVHlwZSBtb2RlbChjb25zdCBWZWN0b3JUeXBlJiB1diwgVmVjdG9yVHlwZSYgeCkgeworICAgIFZlY3RvclR5cGUgeTsgIC8vIFNob3VsZCBjaGFuZ2UgdG8gdXNlIGV4cHJlc3Npb24gdGVtcGxhdGUKKyAgICBpbnQgbSA9IEJhc2U6OnZhbHVlcygpOwogICAgIGludCBuID0gQmFzZTo6aW5wdXRzKCk7Ci0gICAgZWlnZW5fYXNzZXJ0KHV2LnNpemUoKSUyID09IDApOworICAgIGVpZ2VuX2Fzc2VydCh1di5zaXplKCkgJSAyID09IDApOwogICAgIGVpZ2VuX2Fzc2VydCh1di5zaXplKCkgPT0gbik7CiAgICAgZWlnZW5fYXNzZXJ0KHguc2l6ZSgpID09IG0pOwogICAgIHkuc2V0WmVybyhtKTsKLSAgICBpbnQgaGFsZiA9IG4vMjsKKyAgICBpbnQgaGFsZiA9IG4gLyAyOwogICAgIFZlY3RvckJsb2NrPGNvbnN0IFZlY3RvclR5cGU+IHUodXYsIDAsIGhhbGYpOwogICAgIFZlY3RvckJsb2NrPGNvbnN0IFZlY3RvclR5cGU+IHYodXYsIGhhbGYsIGhhbGYpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFsZjsgaSsrKQotICAgICAgICB5KGopICs9IHUoaSkqc3RkOjpleHAoLSh4KGopLWkpKih4KGopLWkpLyh2KGkpKnYoaSkpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYWxmOyBpKyspIHkoaikgKz0gdShpKSAqIHN0ZDo6ZXhwKC0oeChqKSAtIGkpICogKHgoaikgLSBpKSAvICh2KGkpICogdihpKSkpOwogICAgIH0KICAgICByZXR1cm4geTsKLSAgICAKICAgfQotICB2b2lkIGluaXRQb2ludHMoVmVjdG9yVHlwZSYgdXZfcmVmLCBWZWN0b3JUeXBlJiB4KQotICB7CisgIHZvaWQgaW5pdFBvaW50cyhWZWN0b3JUeXBlJiB1dl9yZWYsIFZlY3RvclR5cGUmIHgpIHsKICAgICBtX3ggPSB4OwogICAgIG1feSA9IHRoaXMtPm1vZGVsKHV2X3JlZiwgeCk7CiAgIH0KLSAgCi0gIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclR5cGUmIHV2LCBWZWN0b3JUeXBlJiBmdmVjKQotICB7Ci0gICAgCi0gICAgaW50IG0gPSBCYXNlOjp2YWx1ZXMoKTsgCisKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yVHlwZSYgdXYsIFZlY3RvclR5cGUmIGZ2ZWMpIHsKKyAgICBpbnQgbSA9IEJhc2U6OnZhbHVlcygpOwogICAgIGludCBuID0gQmFzZTo6aW5wdXRzKCk7Ci0gICAgZWlnZW5fYXNzZXJ0KHV2LnNpemUoKSUyID09IDApOworICAgIGVpZ2VuX2Fzc2VydCh1di5zaXplKCkgJSAyID09IDApOwogICAgIGVpZ2VuX2Fzc2VydCh1di5zaXplKCkgPT0gbik7CiAgICAgZWlnZW5fYXNzZXJ0KGZ2ZWMuc2l6ZSgpID09IG0pOwotICAgIGludCBoYWxmID0gbi8yOworICAgIGludCBoYWxmID0gbiAvIDI7CiAgICAgVmVjdG9yQmxvY2s8Y29uc3QgVmVjdG9yVHlwZT4gdSh1diwgMCwgaGFsZik7CiAgICAgVmVjdG9yQmxvY2s8Y29uc3QgVmVjdG9yVHlwZT4gdih1diwgaGFsZiwgaGFsZik7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCi0gICAgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKSB7CiAgICAgICBmdmVjKGopID0gbV95KGopOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYWxmOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGZ2ZWMoaikgLT0gdShpKSAqc3RkOjpleHAoLShtX3goaiktaSkqKG1feChqKS1pKS8odihpKSp2KGkpKSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbGY7IGkrKykgeworICAgICAgICBmdmVjKGopIC09IHUoaSkgKiBzdGQ6OmV4cCgtKG1feChqKSAtIGkpICogKG1feChqKSAtIGkpIC8gKHYoaSkgKiB2KGkpKSk7CiAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcmV0dXJuIDA7CiAgIH0KLSAgaW50IGRmKGNvbnN0IFZlY3RvclR5cGUmIHV2LCBKYWNvYmlhblR5cGUmIGZqYWMpCi0gIHsKLSAgICBpbnQgbSA9IEJhc2U6OnZhbHVlcygpOyAKKyAgaW50IGRmKGNvbnN0IFZlY3RvclR5cGUmIHV2LCBKYWNvYmlhblR5cGUmIGZqYWMpIHsKKyAgICBpbnQgbSA9IEJhc2U6OnZhbHVlcygpOwogICAgIGludCBuID0gQmFzZTo6aW5wdXRzKCk7CiAgICAgZWlnZW5fYXNzZXJ0KG4gPT0gdXYuc2l6ZSgpKTsKICAgICBlaWdlbl9hc3NlcnQoZmphYy5yb3dzKCkgPT0gbSk7CiAgICAgZWlnZW5fYXNzZXJ0KGZqYWMuY29scygpID09IG4pOwotICAgIGludCBoYWxmID0gbi8yOworICAgIGludCBoYWxmID0gbiAvIDI7CiAgICAgVmVjdG9yQmxvY2s8Y29uc3QgVmVjdG9yVHlwZT4gdSh1diwgMCwgaGFsZik7CiAgICAgVmVjdG9yQmxvY2s8Y29uc3QgVmVjdG9yVHlwZT4gdih1diwgaGFsZiwgaGFsZik7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYWxmOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGZqYWMuY29lZmZSZWYoaixpKSA9IC1zdGQ6OmV4cCgtKG1feChqKS1pKSoobV94KGopLWkpLyh2KGkpKnYoaSkpKTsKLSAgICAgICAgZmphYy5jb2VmZlJlZihqLGkraGFsZikgPSAtMi4qdShpKSoobV94KGopLWkpKihtX3goaiktaSkvKHN0ZDo6cG93KHYoaSksMykpICogc3RkOjpleHAoLShtX3goaiktaSkqKG1feChqKS1pKS8odihpKSp2KGkpKSk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFsZjsgaSsrKSB7CisgICAgICAgIGZqYWMuY29lZmZSZWYoaiwgaSkgPSAtc3RkOjpleHAoLShtX3goaikgLSBpKSAqIChtX3goaikgLSBpKSAvICh2KGkpICogdihpKSkpOworICAgICAgICBmamFjLmNvZWZmUmVmKGosIGkgKyBoYWxmKSA9IC0yLiAqIHUoaSkgKiAobV94KGopIC0gaSkgKiAobV94KGopIC0gaSkgLyAoc3RkOjpwb3codihpKSwgMykpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmV4cCgtKG1feChqKSAtIGkpICogKG1feChqKSAtIGkpIC8gKHYoaSkgKiB2KGkpKSk7CiAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwogICB9Ci0gIFZlY3RvclR5cGUgbV94LCBtX3k7IC8vRGF0YSBQb2ludHMKKyAgVmVjdG9yVHlwZSBtX3gsIG1feTsgIC8vIERhdGEgUG9pbnRzCiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgVmVjdG9yVHlwZT4KLWludCB0ZXN0X21pbmltaXplTE0oRnVuY3RvclR5cGUmIGZ1bmN0b3IsIFZlY3RvclR5cGUmIHV2KQotewordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBWZWN0b3JUeXBlPgoraW50IHRlc3RfbWluaW1pemVMTShGdW5jdG9yVHlwZSYgZnVuY3RvciwgVmVjdG9yVHlwZSYgdXYpIHsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlPiBsbShmdW5jdG9yKTsKLSAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBpbmZvOyAKLSAgCisgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgaW5mbzsKKwogICBpbmZvID0gbG0ubWluaW1pemUodXYpOwotICAKKwogICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7Ci0gIC8vRklYTUUgQ2hlY2sgb3RoZXIgcGFyYW1ldGVycworICAvLyBGSVhNRSBDaGVjayBvdGhlciBwYXJhbWV0ZXJzCiAgIHJldHVybiBpbmZvOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgVmVjdG9yVHlwZT4KLWludCB0ZXN0X2xtZGVyKEZ1bmN0b3JUeXBlJiBmdW5jdG9yLCBWZWN0b3JUeXBlJiB1dikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgVmVjdG9yVHlwZT4KK2ludCB0ZXN0X2xtZGVyKEZ1bmN0b3JUeXBlJiBmdW5jdG9yLCBWZWN0b3JUeXBlJiB1dikgewogICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7Ci0gIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgaW5mbzsgCisgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgaW5mbzsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlPiBsbShmdW5jdG9yKTsKICAgaW5mbyA9IGxtLmxtZGVyMSh1dik7Ci0gIAorCiAgIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKLSAgLy9GSVhNRSBDaGVjayBvdGhlciBwYXJhbWV0ZXJzCisgIC8vIEZJWE1FIENoZWNrIG90aGVyIHBhcmFtZXRlcnMKICAgcmV0dXJuIGluZm87CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3JUeXBlLCB0eXBlbmFtZSBWZWN0b3JUeXBlPgotaW50IHRlc3RfbWluaW1pemVTdGVwcyhGdW5jdG9yVHlwZSYgZnVuY3RvciwgVmVjdG9yVHlwZSYgdXYpCi17Ci0gIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgaW5mbzsgICAKK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdG9yVHlwZSwgdHlwZW5hbWUgVmVjdG9yVHlwZT4KK2ludCB0ZXN0X21pbmltaXplU3RlcHMoRnVuY3RvclR5cGUmIGZ1bmN0b3IsIFZlY3RvclR5cGUmIHV2KSB7CisgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgaW5mbzsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PEZ1bmN0b3JUeXBlPiBsbShmdW5jdG9yKTsKICAgaW5mbyA9IGxtLm1pbmltaXplSW5pdCh1dik7Ci0gIGlmIChpbmZvPT1MZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnMpCi0gICAgICByZXR1cm4gaW5mbzsKLSAgZG8gCi0gIHsKKyAgaWYgKGluZm8gPT0gTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OkltcHJvcGVySW5wdXRQYXJhbWV0ZXJzKSByZXR1cm4gaW5mbzsKKyAgZG8gewogICAgIGluZm8gPSBsbS5taW5pbWl6ZU9uZVN0ZXAodXYpOwotICB9IHdoaWxlIChpbmZvPT1MZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6UnVubmluZyk7Ci0gIAorICB9IHdoaWxlIChpbmZvID09IExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSdW5uaW5nKTsKKwogICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7Ci0gIC8vRklYTUUgQ2hlY2sgb3RoZXIgcGFyYW1ldGVycworICAvLyBGSVhNRSBDaGVjayBvdGhlciBwYXJhbWV0ZXJzCiAgIHJldHVybiBpbmZvOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9pZCB0ZXN0X2RlbnNlTE1fVCgpCi17Ci0gIHR5cGVkZWYgTWF0cml4PFQsRHluYW1pYywxPiBWZWN0b3JUeXBlOwotICAKLSAgaW50IGlucHV0cyA9IDEwOyAKLSAgaW50IHZhbHVlcyA9IDEwMDA7IAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3RfZGVuc2VMTV9UKCkgeworICB0eXBlZGVmIE1hdHJpeDxULCBEeW5hbWljLCAxPiBWZWN0b3JUeXBlOworCisgIGludCBpbnB1dHMgPSAxMDsKKyAgaW50IHZhbHVlcyA9IDEwMDA7CiAgIERlbnNlTE08VD4gZGVuc2VfZ2F1c3NpYW4oaW5wdXRzLCB2YWx1ZXMpOwotICBWZWN0b3JUeXBlIHV2KGlucHV0cyksdXZfcmVmKGlucHV0cyk7CisgIFZlY3RvclR5cGUgdXYoaW5wdXRzKSwgdXZfcmVmKGlucHV0cyk7CiAgIFZlY3RvclR5cGUgeCh2YWx1ZXMpOwotICAKLSAgLy8gR2VuZXJhdGUgdGhlIHJlZmVyZW5jZSBzb2x1dGlvbiAKLSAgdXZfcmVmIDw8IC0yLCAxLCA0ICw4LCA2LCAxLjgsIDEuMiwgMS4xLCAxLjkgLCAzOwotICAKLSAgLy9HZW5lcmF0ZSB0aGUgcmVmZXJlbmNlIGRhdGEgcG9pbnRzCisKKyAgLy8gR2VuZXJhdGUgdGhlIHJlZmVyZW5jZSBzb2x1dGlvbgorICB1dl9yZWYgPDwgLTIsIDEsIDQsIDgsIDYsIDEuOCwgMS4yLCAxLjEsIDEuOSwgMzsKKworICAvLyBHZW5lcmF0ZSB0aGUgcmVmZXJlbmNlIGRhdGEgcG9pbnRzCiAgIHguc2V0UmFuZG9tKCk7Ci0gIHggPSAxMCp4OworICB4ID0gMTAgKiB4OwogICB4LmFycmF5KCkgKz0gMTA7CiAgIGRlbnNlX2dhdXNzaWFuLmluaXRQb2ludHModXZfcmVmLCB4KTsKLSAgCi0gIC8vIEdlbmVyYXRlIHRoZSBpbml0aWFsIHBhcmFtZXRlcnMgCi0gIFZlY3RvckJsb2NrPFZlY3RvclR5cGU+IHUodXYsIDAsIGlucHV0cy8yKTsgCi0gIFZlY3RvckJsb2NrPFZlY3RvclR5cGU+IHYodXYsIGlucHV0cy8yLCBpbnB1dHMvMik7Ci0gIAorCisgIC8vIEdlbmVyYXRlIHRoZSBpbml0aWFsIHBhcmFtZXRlcnMKKyAgVmVjdG9yQmxvY2s8VmVjdG9yVHlwZT4gdSh1diwgMCwgaW5wdXRzIC8gMik7CisgIFZlY3RvckJsb2NrPFZlY3RvclR5cGU+IHYodXYsIGlucHV0cyAvIDIsIGlucHV0cyAvIDIpOworCiAgIC8vIFNvbHZlIHRoZSBvcHRpbWl6YXRpb24gcHJvYmxlbQotICAKLSAgLy9Tb2x2ZSBpbiBvbmUgZ28KLSAgdS5zZXRPbmVzKCk7IHYuc2V0T25lcygpOworCisgIC8vIFNvbHZlIGluIG9uZSBnbworICB1LnNldE9uZXMoKTsKKyAgdi5zZXRPbmVzKCk7CiAgIHRlc3RfbWluaW1pemVMTShkZW5zZV9nYXVzc2lhbiwgdXYpOwotICAKLSAgLy9Tb2x2ZSB1bnRpbCB0aGUgbWFjaGluZSBwcmVjaXNpb24KLSAgdS5zZXRPbmVzKCk7IHYuc2V0T25lcygpOwotICB0ZXN0X2xtZGVyKGRlbnNlX2dhdXNzaWFuLCB1dik7IAotICAKKworICAvLyBTb2x2ZSB1bnRpbCB0aGUgbWFjaGluZSBwcmVjaXNpb24KKyAgdS5zZXRPbmVzKCk7CisgIHYuc2V0T25lcygpOworICB0ZXN0X2xtZGVyKGRlbnNlX2dhdXNzaWFuLCB1dik7CisKICAgLy8gU29sdmUgc3RlcCBieSBzdGVwCi0gIHYuc2V0T25lcygpOyB1LnNldE9uZXMoKTsKKyAgdi5zZXRPbmVzKCk7CisgIHUuc2V0T25lcygpOwogICB0ZXN0X21pbmltaXplU3RlcHMoZGVuc2VfZ2F1c3NpYW4sIHV2KTsKLSAgCiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChkZW5zZUxNKQoteworRUlHRU5fREVDTEFSRV9URVNUKGRlbnNlTE0pIHsKICAgQ0FMTF9TVUJURVNUXzIodGVzdF9kZW5zZUxNX1Q8ZG91YmxlPigpKTsKLSAgCisKICAgLy8gQ0FMTF9TVUJURVNUXzIodGVzdF9zcGFyc2VMTV9UPHN0ZDo6Y29tcGxleDxkb3VibGU+KCkpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9kZW5zZV9zdG9yYWdlLmNwcCBiL3Rlc3QvZGVuc2Vfc3RvcmFnZS5jcHAKaW5kZXggZWM3OGYwMS4uOGQ2MWU5MiAxMDA2NDQKLS0tIGEvdGVzdC9kZW5zZV9zdG9yYWdlLmNwcAorKysgYi90ZXN0L2RlbnNlX3N0b3JhZ2UuY3BwCkBAIC0xNCwxNzAgKzE0LDE2NyBAQAogI2luY2x1ZGUgPEVpZ2VuL0NvcmU+CiAKIHVzaW5nIERlbnNlU3RvcmFnZUQzeDMgPSBFaWdlbjo6RGVuc2VTdG9yYWdlPGRvdWJsZSwgMywgMywgMywgMz47Ci1zdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5X21vdmVfY29uc3RydWN0aWJsZTxEZW5zZVN0b3JhZ2VEM3gzPjo6dmFsdWUsICJEZW5zZVN0b3JhZ2Ugbm90IHRyaXZpYWxseV9tb3ZlX2NvbnN0cnVjdGlibGUiKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfbW92ZV9jb25zdHJ1Y3RpYmxlPERlbnNlU3RvcmFnZUQzeDM+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIkRlbnNlU3RvcmFnZSBub3QgdHJpdmlhbGx5X21vdmVfY29uc3RydWN0aWJsZSIpOwogc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWxseV9tb3ZlX2Fzc2lnbmFibGU8RGVuc2VTdG9yYWdlRDN4Mz46OnZhbHVlLCAiRGVuc2VTdG9yYWdlIG5vdCB0cml2aWFsbHlfbW92ZV9hc3NpZ25hYmxlIik7CiAjaWYgIWRlZmluZWQoRUlHRU5fREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTikKLXN0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29weV9jb25zdHJ1Y3RpYmxlPERlbnNlU3RvcmFnZUQzeDM+Ojp2YWx1ZSwgIkRlbnNlU3RvcmFnZSBub3QgdHJpdmlhbGx5X2NvcHlfY29uc3RydWN0aWJsZSIpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5X2NvbnN0cnVjdGlibGU8RGVuc2VTdG9yYWdlRDN4Mz46OnZhbHVlLAorICAgICAgICAgICAgICAiRGVuc2VTdG9yYWdlIG5vdCB0cml2aWFsbHlfY29weV9jb25zdHJ1Y3RpYmxlIik7CiBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZTxEZW5zZVN0b3JhZ2VEM3gzPjo6dmFsdWUsICJEZW5zZVN0b3JhZ2Ugbm90IHRyaXZpYWxseV9jb3B5X2Fzc2lnbmFibGUiKTsKIHN0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29weWFibGU8RGVuc2VTdG9yYWdlRDN4Mz46OnZhbHVlLCAiRGVuc2VTdG9yYWdlIG5vdCB0cml2aWFsbHlfY29weWFibGUiKTsKICNlbmRpZgogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IFNpemUsIGludCBSb3dzLCBpbnQgQ29scz4KLXZvaWQgZGVuc2Vfc3RvcmFnZV9jb3B5KGludCByb3dzLCBpbnQgY29scykKLXsKK3ZvaWQgZGVuc2Vfc3RvcmFnZV9jb3B5KGludCByb3dzLCBpbnQgY29scykgewogICB0eXBlZGVmIERlbnNlU3RvcmFnZTxULCBTaXplLCBSb3dzLCBDb2xzLCAwPiBEZW5zZVN0b3JhZ2VUeXBlOwotICAKLSAgY29uc3QgaW50IHNpemUgPSByb3dzKmNvbHM7CisKKyAgY29uc3QgaW50IHNpemUgPSByb3dzICogY29sczsKICAgRGVuc2VTdG9yYWdlVHlwZSByZWZlcmVuY2Uoc2l6ZSwgcm93cywgY29scyk7CiAgIFQqIHJhd19yZWZlcmVuY2UgPSByZWZlcmVuY2UuZGF0YSgpOwotICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQotICAgIHJhd19yZWZlcmVuY2VbaV0gPSBzdGF0aWNfY2FzdDxUPihpKTsKLSAgICAKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHJhd19yZWZlcmVuY2VbaV0gPSBzdGF0aWNfY2FzdDxUPihpKTsKKwogICBEZW5zZVN0b3JhZ2VUeXBlIGNvcGllZF9yZWZlcmVuY2UocmVmZXJlbmNlKTsKICAgY29uc3QgVCogcmF3X2NvcGllZF9yZWZlcmVuY2UgPSBjb3BpZWRfcmVmZXJlbmNlLmRhdGEoKTsKLSAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKLSAgICBWRVJJRllfSVNfRVFVQUwocmF3X3JlZmVyZW5jZVtpXSwgcmF3X2NvcGllZF9yZWZlcmVuY2VbaV0pOworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgVkVSSUZZX0lTX0VRVUFMKHJhd19yZWZlcmVuY2VbaV0sIHJhd19jb3BpZWRfcmVmZXJlbmNlW2ldKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBTaXplLCBpbnQgUm93cywgaW50IENvbHM+Ci12b2lkIGRlbnNlX3N0b3JhZ2VfYXNzaWdubWVudChpbnQgcm93cywgaW50IGNvbHMpCi17Cit2b2lkIGRlbnNlX3N0b3JhZ2VfYXNzaWdubWVudChpbnQgcm93cywgaW50IGNvbHMpIHsKICAgdHlwZWRlZiBEZW5zZVN0b3JhZ2U8VCwgU2l6ZSwgUm93cywgQ29scywgMD4gRGVuc2VTdG9yYWdlVHlwZTsKLSAgCi0gIGNvbnN0IGludCBzaXplID0gcm93cypjb2xzOworCisgIGNvbnN0IGludCBzaXplID0gcm93cyAqIGNvbHM7CiAgIERlbnNlU3RvcmFnZVR5cGUgcmVmZXJlbmNlKHNpemUsIHJvd3MsIGNvbHMpOwogICBUKiByYXdfcmVmZXJlbmNlID0gcmVmZXJlbmNlLmRhdGEoKTsKLSAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKLSAgICByYXdfcmVmZXJlbmNlW2ldID0gc3RhdGljX2Nhc3Q8VD4oaSk7Ci0gICAgCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSByYXdfcmVmZXJlbmNlW2ldID0gc3RhdGljX2Nhc3Q8VD4oaSk7CisKICAgRGVuc2VTdG9yYWdlVHlwZSBjb3BpZWRfcmVmZXJlbmNlOwogICBjb3BpZWRfcmVmZXJlbmNlID0gcmVmZXJlbmNlOwogICBjb25zdCBUKiByYXdfY29waWVkX3JlZmVyZW5jZSA9IGNvcGllZF9yZWZlcmVuY2UuZGF0YSgpOwotICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQotICAgIFZFUklGWV9JU19FUVVBTChyYXdfcmVmZXJlbmNlW2ldLCByYXdfY29waWVkX3JlZmVyZW5jZVtpXSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSBWRVJJRllfSVNfRVFVQUwocmF3X3JlZmVyZW5jZVtpXSwgcmF3X2NvcGllZF9yZWZlcmVuY2VbaV0pOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IFNpemUsIGludCBSb3dzLCBpbnQgQ29scz4KLXZvaWQgZGVuc2Vfc3RvcmFnZV9zd2FwKGludCByb3dzMCwgaW50IGNvbHMwLCBpbnQgcm93czEsIGludCBjb2xzMSkKLXsKK3ZvaWQgZGVuc2Vfc3RvcmFnZV9zd2FwKGludCByb3dzMCwgaW50IGNvbHMwLCBpbnQgcm93czEsIGludCBjb2xzMSkgewogICB0eXBlZGVmIERlbnNlU3RvcmFnZTxULCBTaXplLCBSb3dzLCBDb2xzLCAwPiBEZW5zZVN0b3JhZ2VUeXBlOwotICAKLSAgY29uc3QgaW50IHNpemUwID0gcm93czAqY29sczA7CisKKyAgY29uc3QgaW50IHNpemUwID0gcm93czAgKiBjb2xzMDsKICAgRGVuc2VTdG9yYWdlVHlwZSBhKHNpemUwLCByb3dzMCwgY29sczApOwotICBmb3IgKGludCBpPTA7IGk8c2l6ZTA7ICsraSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemUwOyArK2kpIHsKICAgICBhLmRhdGEoKVtpXSA9IHN0YXRpY19jYXN0PFQ+KGkpOwogICB9Ci0gIAotICBjb25zdCBpbnQgc2l6ZTEgPSByb3dzMSpjb2xzMTsKKworICBjb25zdCBpbnQgc2l6ZTEgPSByb3dzMSAqIGNvbHMxOwogICBEZW5zZVN0b3JhZ2VUeXBlIGIoc2l6ZTEsIHJvd3MxLCBjb2xzMSk7Ci0gIGZvciAoaW50IGk9MDsgaTxzaXplMTsgKytpKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTE7ICsraSkgewogICAgIGIuZGF0YSgpW2ldID0gc3RhdGljX2Nhc3Q8VD4oLWkpOwogICB9Ci0gIAorCiAgIGEuc3dhcChiKTsKLSAgCi0gIGZvciAoaW50IGk9MDsgaTxzaXplMDsgKytpKSB7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMDsgKytpKSB7CiAgICAgVkVSSUZZX0lTX0VRVUFMKGIuZGF0YSgpW2ldLCBzdGF0aWNfY2FzdDxUPihpKSk7CiAgIH0KLSAgCi0gIGZvciAoaW50IGk9MDsgaTxzaXplMTsgKytpKSB7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMTsgKytpKSB7CiAgICAgVkVSSUZZX0lTX0VRVUFMKGEuZGF0YSgpW2ldLCBzdGF0aWNfY2FzdDxUPigtaSkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBTaXplLCBzdGQ6OnNpemVfdCBBbGlnbm1lbnQ+Ci12b2lkIGRlbnNlX3N0b3JhZ2VfYWxpZ25tZW50KCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgU2l6ZSwgc3RkOjpzaXplX3QgQWxpZ25tZW50Pgordm9pZCBkZW5zZV9zdG9yYWdlX2FsaWdubWVudCgpIHsKICAgc3RydWN0IGFsaWduYXMoQWxpZ25tZW50KSBFbXB0eTEge307CiAgIFZFUklGWV9JU19FUVVBTChzdGQ6OmFsaWdubWVudF9vZjxFbXB0eTE+Ojp2YWx1ZSwgQWxpZ25tZW50KTsKIAogICBzdHJ1Y3QgRUlHRU5fQUxJR05fVE9fQk9VTkRBUlkoQWxpZ25tZW50KSBFbXB0eTIge307CiAgIFZFUklGWV9JU19FUVVBTChzdGQ6OmFsaWdubWVudF9vZjxFbXB0eTI+Ojp2YWx1ZSwgQWxpZ25tZW50KTsKIAotICBzdHJ1Y3QgTmVzdGVkMSB7IEVJR0VOX0FMSUdOX1RPX0JPVU5EQVJZKEFsaWdubWVudCkgVCBkYXRhW1NpemVdOyB9OworICBzdHJ1Y3QgTmVzdGVkMSB7CisgICAgRUlHRU5fQUxJR05fVE9fQk9VTkRBUlkoQWxpZ25tZW50KSBUIGRhdGFbU2l6ZV07CisgIH07CiAgIFZFUklGWV9JU19FUVVBTChzdGQ6OmFsaWdubWVudF9vZjxOZXN0ZWQxPjo6dmFsdWUsIEFsaWdubWVudCk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKCAoc3RkOjphbGlnbm1lbnRfb2Y8aW50ZXJuYWw6OnBsYWluX2FycmF5PFQsU2l6ZSxBdXRvQWxpZ24sQWxpZ25tZW50PiA+Ojp2YWx1ZSksIEFsaWdubWVudCk7CisgIFZFUklGWV9JU19FUVVBTCgoc3RkOjphbGlnbm1lbnRfb2Y8aW50ZXJuYWw6OnBsYWluX2FycmF5PFQsIFNpemUsIEF1dG9BbGlnbiwgQWxpZ25tZW50PiA+Ojp2YWx1ZSksIEFsaWdubWVudCk7CiAKLSAgY29uc3Qgc3RkOjpzaXplX3QgZGVmYXVsdF9hbGlnbm1lbnQgPSBpbnRlcm5hbDo6Y29tcHV0ZV9kZWZhdWx0X2FsaWdubWVudDxULFNpemU+Ojp2YWx1ZTsKKyAgY29uc3Qgc3RkOjpzaXplX3QgZGVmYXVsdF9hbGlnbm1lbnQgPSBpbnRlcm5hbDo6Y29tcHV0ZV9kZWZhdWx0X2FsaWdubWVudDxULCBTaXplPjo6dmFsdWU7CiAgIGlmIChkZWZhdWx0X2FsaWdubWVudCA+IDApIHsKLSAgICBWRVJJRllfSVNfRVFVQUwoIChzdGQ6OmFsaWdubWVudF9vZjxEZW5zZVN0b3JhZ2U8VCxTaXplLDEsMSxBdXRvQWxpZ24+ID46OnZhbHVlKSwgZGVmYXVsdF9hbGlnbm1lbnQpOwotICAgIFZFUklGWV9JU19FUVVBTCggKHN0ZDo6YWxpZ25tZW50X29mPE1hdHJpeDxULFNpemUsMSxBdXRvQWxpZ24+ID46OnZhbHVlKSwgZGVmYXVsdF9hbGlnbm1lbnQpOwotICAgIHN0cnVjdCBOZXN0ZWQyIHsgTWF0cml4PFQsU2l6ZSwxLEF1dG9BbGlnbj4gbWF0OyB9OworICAgIFZFUklGWV9JU19FUVVBTCgoc3RkOjphbGlnbm1lbnRfb2Y8RGVuc2VTdG9yYWdlPFQsIFNpemUsIDEsIDEsIEF1dG9BbGlnbj4gPjo6dmFsdWUpLCBkZWZhdWx0X2FsaWdubWVudCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKChzdGQ6OmFsaWdubWVudF9vZjxNYXRyaXg8VCwgU2l6ZSwgMSwgQXV0b0FsaWduPiA+Ojp2YWx1ZSksIGRlZmF1bHRfYWxpZ25tZW50KTsKKyAgICBzdHJ1Y3QgTmVzdGVkMiB7CisgICAgICBNYXRyaXg8VCwgU2l6ZSwgMSwgQXV0b0FsaWduPiBtYXQ7CisgICAgfTsKICAgICBWRVJJRllfSVNfRVFVQUwoc3RkOjphbGlnbm1lbnRfb2Y8TmVzdGVkMj46OnZhbHVlLCBkZWZhdWx0X2FsaWdubWVudCk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogdm9pZCBkZW5zZV9zdG9yYWdlX3Rlc3RzKCkgewogICAvLyBEeW5hbWljIFN0b3JhZ2UuCi0gIGRlbnNlX3N0b3JhZ2VfY29weTxULER5bmFtaWMsRHluYW1pYyxEeW5hbWljPig0LCAzKTsgIAotICBkZW5zZV9zdG9yYWdlX2NvcHk8VCxEeW5hbWljLER5bmFtaWMsMz4oNCwgMyk7Ci0gIGRlbnNlX3N0b3JhZ2VfY29weTxULER5bmFtaWMsNCxEeW5hbWljPig0LCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9jb3B5PFQsIER5bmFtaWMsIER5bmFtaWMsIER5bmFtaWM+KDQsIDMpOworICBkZW5zZV9zdG9yYWdlX2NvcHk8VCwgRHluYW1pYywgRHluYW1pYywgMz4oNCwgMyk7CisgIGRlbnNlX3N0b3JhZ2VfY29weTxULCBEeW5hbWljLCA0LCBEeW5hbWljPig0LCAzKTsKICAgLy8gRml4ZWQgU3RvcmFnZS4KLSAgZGVuc2Vfc3RvcmFnZV9jb3B5PFQsMTIsNCwzPig0LCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9jb3B5PFQsMTIsRHluYW1pYyxEeW5hbWljPig0LCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9jb3B5PFQsMTIsNCxEeW5hbWljPig0LCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9jb3B5PFQsMTIsRHluYW1pYywzPig0LCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9jb3B5PFQsIDEyLCA0LCAzPig0LCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9jb3B5PFQsIDEyLCBEeW5hbWljLCBEeW5hbWljPig0LCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9jb3B5PFQsIDEyLCA0LCBEeW5hbWljPig0LCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9jb3B5PFQsIDEyLCBEeW5hbWljLCAzPig0LCAzKTsKICAgLy8gRml4ZWQgU3RvcmFnZSB3aXRoIFVuaW5pdGlhbGl6ZWQgRWxlbWVudHMuCi0gIGRlbnNlX3N0b3JhZ2VfY29weTxULDE4LER5bmFtaWMsRHluYW1pYz4oNCwgMyk7Ci0gIGRlbnNlX3N0b3JhZ2VfY29weTxULDE4LDQsRHluYW1pYz4oNCwgMyk7Ci0gIGRlbnNlX3N0b3JhZ2VfY29weTxULDE4LER5bmFtaWMsMz4oNCwgMyk7Ci0gIAorICBkZW5zZV9zdG9yYWdlX2NvcHk8VCwgMTgsIER5bmFtaWMsIER5bmFtaWM+KDQsIDMpOworICBkZW5zZV9zdG9yYWdlX2NvcHk8VCwgMTgsIDQsIER5bmFtaWM+KDQsIDMpOworICBkZW5zZV9zdG9yYWdlX2NvcHk8VCwgMTgsIER5bmFtaWMsIDM+KDQsIDMpOworCiAgIC8vIER5bmFtaWMgU3RvcmFnZS4KLSAgZGVuc2Vfc3RvcmFnZV9hc3NpZ25tZW50PFQsRHluYW1pYyxEeW5hbWljLER5bmFtaWM+KDQsIDMpOyAgCi0gIGRlbnNlX3N0b3JhZ2VfYXNzaWdubWVudDxULER5bmFtaWMsRHluYW1pYywzPig0LCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9hc3NpZ25tZW50PFQsRHluYW1pYyw0LER5bmFtaWM+KDQsIDMpOworICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8VCwgRHluYW1pYywgRHluYW1pYywgRHluYW1pYz4oNCwgMyk7CisgIGRlbnNlX3N0b3JhZ2VfYXNzaWdubWVudDxULCBEeW5hbWljLCBEeW5hbWljLCAzPig0LCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9hc3NpZ25tZW50PFQsIER5bmFtaWMsIDQsIER5bmFtaWM+KDQsIDMpOwogICAvLyBGaXhlZCBTdG9yYWdlLgotICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8VCwxMiw0LDM+KDQsIDMpOwotICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8VCwxMixEeW5hbWljLER5bmFtaWM+KDQsIDMpOwotICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8VCwxMiw0LER5bmFtaWM+KDQsIDMpOwotICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8VCwxMixEeW5hbWljLDM+KDQsIDMpOworICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8VCwgMTIsIDQsIDM+KDQsIDMpOworICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8VCwgMTIsIER5bmFtaWMsIER5bmFtaWM+KDQsIDMpOworICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8VCwgMTIsIDQsIER5bmFtaWM+KDQsIDMpOworICBkZW5zZV9zdG9yYWdlX2Fzc2lnbm1lbnQ8VCwgMTIsIER5bmFtaWMsIDM+KDQsIDMpOwogICAvLyBGaXhlZCBTdG9yYWdlIHdpdGggVW5pbml0aWFsaXplZCBFbGVtZW50cy4KLSAgZGVuc2Vfc3RvcmFnZV9hc3NpZ25tZW50PFQsMTgsRHluYW1pYyxEeW5hbWljPig0LCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9hc3NpZ25tZW50PFQsMTgsNCxEeW5hbWljPig0LCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9hc3NpZ25tZW50PFQsMTgsRHluYW1pYywzPig0LCAzKTsKLSAgCisgIGRlbnNlX3N0b3JhZ2VfYXNzaWdubWVudDxULCAxOCwgRHluYW1pYywgRHluYW1pYz4oNCwgMyk7CisgIGRlbnNlX3N0b3JhZ2VfYXNzaWdubWVudDxULCAxOCwgNCwgRHluYW1pYz4oNCwgMyk7CisgIGRlbnNlX3N0b3JhZ2VfYXNzaWdubWVudDxULCAxOCwgRHluYW1pYywgMz4oNCwgMyk7CisKICAgLy8gRHluYW1pYyBTdG9yYWdlLgotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCxEeW5hbWljLER5bmFtaWMsRHluYW1pYz4oNCwgMywgNCwgMyk7IAotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCxEeW5hbWljLER5bmFtaWMsRHluYW1pYz4oNCwgMywgMiwgMSk7ICAKLSAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsRHluYW1pYyxEeW5hbWljLER5bmFtaWM+KDIsIDEsIDQsIDMpOwotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCxEeW5hbWljLER5bmFtaWMsMz4oNCwgMywgNCwgMyk7Ci0gIGRlbnNlX3N0b3JhZ2Vfc3dhcDxULER5bmFtaWMsRHluYW1pYywzPig0LCAzLCAyLCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsRHluYW1pYyxEeW5hbWljLDM+KDIsIDMsIDQsIDMpOwotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCxEeW5hbWljLDQsRHluYW1pYz4oNCwgMywgNCwgMyk7Ci0gIGRlbnNlX3N0b3JhZ2Vfc3dhcDxULER5bmFtaWMsNCxEeW5hbWljPig0LCAzLCA0LCAxKTsKLSAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsRHluYW1pYyw0LER5bmFtaWM+KDQsIDEsIDQsIDMpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgRHluYW1pYywgRHluYW1pYywgRHluYW1pYz4oNCwgMywgNCwgMyk7CisgIGRlbnNlX3N0b3JhZ2Vfc3dhcDxULCBEeW5hbWljLCBEeW5hbWljLCBEeW5hbWljPig0LCAzLCAyLCAxKTsKKyAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsIER5bmFtaWMsIER5bmFtaWMsIER5bmFtaWM+KDIsIDEsIDQsIDMpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgRHluYW1pYywgRHluYW1pYywgMz4oNCwgMywgNCwgMyk7CisgIGRlbnNlX3N0b3JhZ2Vfc3dhcDxULCBEeW5hbWljLCBEeW5hbWljLCAzPig0LCAzLCAyLCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsIER5bmFtaWMsIER5bmFtaWMsIDM+KDIsIDMsIDQsIDMpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgRHluYW1pYywgNCwgRHluYW1pYz4oNCwgMywgNCwgMyk7CisgIGRlbnNlX3N0b3JhZ2Vfc3dhcDxULCBEeW5hbWljLCA0LCBEeW5hbWljPig0LCAzLCA0LCAxKTsKKyAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsIER5bmFtaWMsIDQsIER5bmFtaWM+KDQsIDEsIDQsIDMpOwogICAvLyBGaXhlZCBTdG9yYWdlLgotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwxMiw0LDM+KDQsIDMsIDQsIDMpOwotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwxMixEeW5hbWljLER5bmFtaWM+KDQsIDMsIDQsIDMpOwotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwxMixEeW5hbWljLER5bmFtaWM+KDQsIDMsIDIsIDEpOwotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwxMixEeW5hbWljLER5bmFtaWM+KDIsIDEsIDQsIDMpOwotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwxMiw0LER5bmFtaWM+KDQsIDMsIDQsIDMpOwotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwxMiw0LER5bmFtaWM+KDQsIDMsIDQsIDEpOwotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwxMiw0LER5bmFtaWM+KDQsIDEsIDQsIDMpOwotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwxMixEeW5hbWljLDM+KDQsIDMsIDQsIDMpOwotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwxMixEeW5hbWljLDM+KDQsIDMsIDIsIDMpOwotICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwxMixEeW5hbWljLDM+KDIsIDMsIDQsIDMpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgMTIsIDQsIDM+KDQsIDMsIDQsIDMpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgMTIsIER5bmFtaWMsIER5bmFtaWM+KDQsIDMsIDQsIDMpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgMTIsIER5bmFtaWMsIER5bmFtaWM+KDQsIDMsIDIsIDEpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgMTIsIER5bmFtaWMsIER5bmFtaWM+KDIsIDEsIDQsIDMpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgMTIsIDQsIER5bmFtaWM+KDQsIDMsIDQsIDMpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgMTIsIDQsIER5bmFtaWM+KDQsIDMsIDQsIDEpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgMTIsIDQsIER5bmFtaWM+KDQsIDEsIDQsIDMpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgMTIsIER5bmFtaWMsIDM+KDQsIDMsIDQsIDMpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgMTIsIER5bmFtaWMsIDM+KDQsIDMsIDIsIDMpOworICBkZW5zZV9zdG9yYWdlX3N3YXA8VCwgMTIsIER5bmFtaWMsIDM+KDIsIDMsIDQsIDMpOwogICAvLyBGaXhlZCBTdG9yYWdlIHdpdGggVW5pbml0aWFsaXplZCBFbGVtZW50cy4KLSAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsMTgsRHluYW1pYyxEeW5hbWljPig0LCAzLCA0LCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsMTgsRHluYW1pYyxEeW5hbWljPig0LCAzLCAyLCAxKTsKLSAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsMTgsRHluYW1pYyxEeW5hbWljPigyLCAxLCA0LCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsMTgsNCxEeW5hbWljPig0LCAzLCA0LCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsMTgsNCxEeW5hbWljPig0LCAzLCA0LCAxKTsKLSAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsMTgsNCxEeW5hbWljPig0LCAxLCA0LCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsMTgsRHluYW1pYywzPig0LCAzLCA0LCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsMTgsRHluYW1pYywzPig0LCAzLCAyLCAzKTsKLSAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsMTgsRHluYW1pYywzPigyLCAzLCA0LCAzKTsKLSAgCi0gIGRlbnNlX3N0b3JhZ2VfYWxpZ25tZW50PFQsMTYsOD4oKTsKLSAgZGVuc2Vfc3RvcmFnZV9hbGlnbm1lbnQ8VCwxNiwxNj4oKTsKLSAgZGVuc2Vfc3RvcmFnZV9hbGlnbm1lbnQ8VCwxNiwzMj4oKTsKLSAgZGVuc2Vfc3RvcmFnZV9hbGlnbm1lbnQ8VCwxNiw2ND4oKTsKKyAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsIDE4LCBEeW5hbWljLCBEeW5hbWljPig0LCAzLCA0LCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsIDE4LCBEeW5hbWljLCBEeW5hbWljPig0LCAzLCAyLCAxKTsKKyAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsIDE4LCBEeW5hbWljLCBEeW5hbWljPigyLCAxLCA0LCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsIDE4LCA0LCBEeW5hbWljPig0LCAzLCA0LCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsIDE4LCA0LCBEeW5hbWljPig0LCAzLCA0LCAxKTsKKyAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsIDE4LCA0LCBEeW5hbWljPig0LCAxLCA0LCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsIDE4LCBEeW5hbWljLCAzPig0LCAzLCA0LCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsIDE4LCBEeW5hbWljLCAzPig0LCAzLCAyLCAzKTsKKyAgZGVuc2Vfc3RvcmFnZV9zd2FwPFQsIDE4LCBEeW5hbWljLCAzPigyLCAzLCA0LCAzKTsKKworICBkZW5zZV9zdG9yYWdlX2FsaWdubWVudDxULCAxNiwgOD4oKTsKKyAgZGVuc2Vfc3RvcmFnZV9hbGlnbm1lbnQ8VCwgMTYsIDE2PigpOworICBkZW5zZV9zdG9yYWdlX2FsaWdubWVudDxULCAxNiwgMzI+KCk7CisgIGRlbnNlX3N0b3JhZ2VfYWxpZ25tZW50PFQsIDE2LCA2ND4oKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGRlbnNlX3N0b3JhZ2UpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoZGVuc2Vfc3RvcmFnZSkgewogICBkZW5zZV9zdG9yYWdlX3Rlc3RzPGludD4oKTsKICAgZGVuc2Vfc3RvcmFnZV90ZXN0czxmbG9hdD4oKTsKICAgZGVuc2Vfc3RvcmFnZV90ZXN0czxTYWZlU2NhbGFyPGZsb2F0PiA+KCk7CmRpZmYgLS1naXQgYS90ZXN0L2RldGVybWluYW50LmNwcCBiL3Rlc3QvZGV0ZXJtaW5hbnQuY3BwCmluZGV4IDdkZDMzYzMuLjBmMmQ0ZjggMTAwNjQ0Ci0tLSBhL3Rlc3QvZGV0ZXJtaW5hbnQuY3BwCisrKyBiL3Rlc3QvZGV0ZXJtaW5hbnQuY3BwCkBAIC0xMSw4ICsxMSw4IEBACiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgPEVpZ2VuL0xVPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGRldGVybWluYW50KGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgZGV0ZXJtaW5hbnQoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CiAgICAgIERldGVybWluYW50LmgKICAgKi8KQEAgLTI0LDEzICsyNCwxMyBAQAogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIFNjYWxhciB4ID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6SWRlbnRpdHkoc2l6ZSwgc2l6ZSkuZGV0ZXJtaW5hbnQoKSwgU2NhbGFyKDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgobTEqbTIpLmV2YWwoKS5kZXRlcm1pbmFudCgpLCBtMS5kZXRlcm1pbmFudCgpICogbTIuZGV0ZXJtaW5hbnQoKSk7Ci0gIGlmKHNpemU9PTEpIHJldHVybjsKLSAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHNpemUtMSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xICogbTIpLmV2YWwoKS5kZXRlcm1pbmFudCgpLCBtMS5kZXRlcm1pbmFudCgpICogbTIuZGV0ZXJtaW5hbnQoKSk7CisgIGlmIChzaXplID09IDEpIHJldHVybjsKKyAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHNpemUgLSAxKTsKICAgSW5kZXggajsKICAgZG8gewotICAgIGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBzaXplLTEpOwotICB9IHdoaWxlKGo9PWkpOworICAgIGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBzaXplIC0gMSk7CisgIH0gd2hpbGUgKGogPT0gaSk7CiAgIG0yID0gbTE7CiAgIG0yLnJvdyhpKS5zd2FwKG0yLnJvdyhqKSk7CiAgIFZFUklGWV9JU19BUFBST1gobTIuZGV0ZXJtaW5hbnQoKSwgLW0xLmRldGVybWluYW50KCkpOwpAQCAtNDAsMjcgKzQwLDI2IEBACiAgIFZFUklGWV9JU19BUFBST1gobTIuZGV0ZXJtaW5hbnQoKSwgbTIudHJhbnNwb3NlKCkuZGV0ZXJtaW5hbnQoKSk7CiAgIFZFUklGWV9JU19BUFBST1gobnVtZXh0Ojpjb25qKG0yLmRldGVybWluYW50KCkpLCBtMi5hZGpvaW50KCkuZGV0ZXJtaW5hbnQoKSk7CiAgIG0yID0gbTE7Ci0gIG0yLnJvdyhpKSArPSB4Km0yLnJvdyhqKTsKKyAgbTIucm93KGkpICs9IHggKiBtMi5yb3coaik7CiAgIFZFUklGWV9JU19BUFBST1gobTIuZGV0ZXJtaW5hbnQoKSwgbTEuZGV0ZXJtaW5hbnQoKSk7CiAgIG0yID0gbTE7CiAgIG0yLnJvdyhpKSAqPSB4OwogICBWRVJJRllfSVNfQVBQUk9YKG0yLmRldGVybWluYW50KCksIG0xLmRldGVybWluYW50KCkgKiB4KTsKLSAgCisKICAgLy8gY2hlY2sgZW1wdHkgbWF0cml4Ci0gIFZFUklGWV9JU19BUFBST1gobTIuYmxvY2soMCwwLDAsMCkuZGV0ZXJtaW5hbnQoKSwgU2NhbGFyKDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi5ibG9jaygwLCAwLCAwLCAwKS5kZXRlcm1pbmFudCgpLCBTY2FsYXIoMSkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoZGV0ZXJtaW5hbnQpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CitFSUdFTl9ERUNMQVJFX1RFU1QoZGV0ZXJtaW5hbnQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CiAgICAgaW50IHMgPSAwOwotICAgIENBTExfU1VCVEVTVF8xKCBkZXRlcm1pbmFudChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGRldGVybWluYW50KE1hdHJpeDxkb3VibGUsIDIsIDI+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGRldGVybWluYW50KE1hdHJpeDxkb3VibGUsIDMsIDM+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIGRldGVybWluYW50KE1hdHJpeDxkb3VibGUsIDQsIDQ+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIGRldGVybWluYW50KE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgMTAsIDEwPigpKSApOwotICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpOwotICAgIENBTExfU1VCVEVTVF82KCBkZXRlcm1pbmFudChNYXRyaXhYZChzLCBzKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMShkZXRlcm1pbmFudChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihkZXRlcm1pbmFudChNYXRyaXg8ZG91YmxlLCAyLCAyPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoZGV0ZXJtaW5hbnQoTWF0cml4PGRvdWJsZSwgMywgMz4oKSkpOworICAgIENBTExfU1VCVEVTVF80KGRldGVybWluYW50KE1hdHJpeDxkb3VibGUsIDQsIDQ+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShkZXRlcm1pbmFudChNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIDEwLCAxMD4oKSkpOworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDQpOworICAgIENBTExfU1VCVEVTVF82KGRldGVybWluYW50KE1hdHJpeFhkKHMsIHMpKSk7CiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2RpYWdvbmFsLmNwcCBiL3Rlc3QvZGlhZ29uYWwuY3BwCmluZGV4IDRlOGM0YjMuLmE1NjExOGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlhZ29uYWwuY3BwCisrKyBiL3Rlc3QvZGlhZ29uYWwuY3BwCkBAIC05LDMzICs5LDI3IEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgZGlhZ29uYWwoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBkaWFnb25hbChjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKIAogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKIAotICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKIAogICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKIAotICAvL2NoZWNrIGRpYWdvbmFsKCkKKyAgLy8gY2hlY2sgZGlhZ29uYWwoKQogICBWRVJJRllfSVNfQVBQUk9YKG0xLmRpYWdvbmFsKCksIG0xLnRyYW5zcG9zZSgpLmRpYWdvbmFsKCkpOwogICBtMi5kaWFnb25hbCgpID0gMiAqIG0xLmRpYWdvbmFsKCk7CiAgIG0yLmRpYWdvbmFsKClbMF0gKj0gMzsKIAotICBpZiAocm93cz4yKQotICB7Ci0gICAgZW51bSB7Ci0gICAgICBOMSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPjIgPyAgMiA6IDAsCi0gICAgICBOMiA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPjEgPyAtMSA6IDAKLSAgICB9OworICBpZiAocm93cyA+IDIpIHsKKyAgICBlbnVtIHsgTjEgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSA+IDIgPyAyIDogMCwgTjIgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSA+IDEgPyAtMSA6IDAgfTsKIAogICAgIC8vIGNoZWNrIHN1Yi9zdXBlciBkaWFnb25hbAotICAgIGlmKE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lIT1EeW5hbWljKQotICAgIHsKKyAgICBpZiAoTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgIT0gRHluYW1pYykgewogICAgICAgVkVSSUZZKG0xLnRlbXBsYXRlIGRpYWdvbmFsPE4xPigpLlJvd3NBdENvbXBpbGVUaW1lID09IG0xLmRpYWdvbmFsKE4xKS5zaXplKCkpOwogICAgICAgVkVSSUZZKG0xLnRlbXBsYXRlIGRpYWdvbmFsPE4yPigpLlJvd3NBdENvbXBpbGVUaW1lID09IG0xLmRpYWdvbmFsKE4yKS5zaXplKCkpOwogICAgIH0KQEAgLTQ1LDcgKzM5LDYgQEAKICAgICBtMi50ZW1wbGF0ZSBkaWFnb25hbDxOMT4oKVswXSAqPSAzOwogICAgIFZFUklGWV9JU19BUFBST1gobTIudGVtcGxhdGUgZGlhZ29uYWw8TjE+KClbMF0sIHN0YXRpY19jYXN0PFNjYWxhcj4oNikgKiBtMS50ZW1wbGF0ZSBkaWFnb25hbDxOMT4oKVswXSk7CiAKLQogICAgIG0yLnRlbXBsYXRlIGRpYWdvbmFsPE4yPigpID0gMiAqIG0xLnRlbXBsYXRlIGRpYWdvbmFsPE4yPigpOwogICAgIG0yLnRlbXBsYXRlIGRpYWdvbmFsPE4yPigpWzBdICo9IDM7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBkaWFnb25hbDxOMj4oKVswXSwgc3RhdGljX2Nhc3Q8U2NhbGFyPig2KSAqIG0xLnRlbXBsYXRlIGRpYWdvbmFsPE4yPigpWzBdKTsKQEAgLTYyLDQ0ICs1NSw0OCBAQAogCiAgICAgbTIuZGlhZ29uYWwoTjIpLngoKSA9IHMxOwogICAgIFZFUklGWV9JU19BUFBST1gobTIuZGlhZ29uYWwoTjIpLngoKSwgczEpOwotICAgIG0yLmRpYWdvbmFsKE4yKS5jb2VmZlJlZigwKSA9IFNjYWxhcigyKSpzMTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmRpYWdvbmFsKE4yKS5jb2VmZigwKSwgU2NhbGFyKDIpKnMxKTsKKyAgICBtMi5kaWFnb25hbChOMikuY29lZmZSZWYoMCkgPSBTY2FsYXIoMikgKiBzMTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmRpYWdvbmFsKE4yKS5jb2VmZigwKSwgU2NhbGFyKDIpICogczEpOwogICB9CiAKLSAgVkVSSUZZKCBtMS5kaWFnb25hbCggY29scykuc2l6ZSgpPT0wICk7Ci0gIFZFUklGWSggbTEuZGlhZ29uYWwoLXJvd3MpLnNpemUoKT09MCApOworICBWRVJJRlkobTEuZGlhZ29uYWwoY29scykuc2l6ZSgpID09IDApOworICBWRVJJRlkobTEuZGlhZ29uYWwoLXJvd3MpLnNpemUoKSA9PSAwKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBkaWFnb25hbF9hc3NlcnQoY29uc3QgTWF0cml4VHlwZSYgbSkgewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGRpYWdvbmFsX2Fzc2VydChjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwogCiAgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CiAKLSAgaWYgKHJvd3M+PTIgJiYgY29scz49MikKLSAgewotICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBtMSArPSBtMS5kaWFnb25hbCgpICk7Ci0gICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0xIC09IG0xLmRpYWdvbmFsKCkgKTsKLSAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggbTEuYXJyYXkoKSAqPSBtMS5kaWFnb25hbCgpLmFycmF5KCkgKTsKLSAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggbTEuYXJyYXkoKSAvPSBtMS5kaWFnb25hbCgpLmFycmF5KCkgKTsKKyAgaWYgKHJvd3MgPj0gMiAmJiBjb2xzID49IDIpIHsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMSArPSBtMS5kaWFnb25hbCgpKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMSAtPSBtMS5kaWFnb25hbCgpKTsKKyAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChtMS5hcnJheSgpICo9IG0xLmRpYWdvbmFsKCkuYXJyYXkoKSk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEuYXJyYXkoKSAvPSBtMS5kaWFnb25hbCgpLmFycmF5KCkpOwogICB9CiAKLSAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0xLmRpYWdvbmFsKGNvbHMrMSkgKTsKLSAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0xLmRpYWdvbmFsKC0ocm93cysxKSkgKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEuZGlhZ29uYWwoY29scyArIDEpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEuZGlhZ29uYWwoLShyb3dzICsgMSkpKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGRpYWdvbmFsKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBkaWFnb25hbChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGRpYWdvbmFsKE1hdHJpeDxmbG9hdCwgNCwgOT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggZGlhZ29uYWwoTWF0cml4PGZsb2F0LCA3LCAzPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBkaWFnb25hbChNYXRyaXg0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBkaWFnb25hbChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggZGlhZ29uYWwoTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggZGlhZ29uYWwoTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGRpYWdvbmFsKE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGRpYWdvbmFsKE1hdHJpeDxmbG9hdCxEeW5hbWljLDQ+KDMsIDQpKSApOwotICAgIENBTExfU1VCVEVTVF8xKCBkaWFnb25hbF9hc3NlcnQoTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChkaWFnb25hbCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShkaWFnb25hbChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShkaWFnb25hbChNYXRyaXg8ZmxvYXQsIDQsIDk+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShkaWFnb25hbChNYXRyaXg8ZmxvYXQsIDcsIDM+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihkaWFnb25hbChNYXRyaXg0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoZGlhZ29uYWwoCisgICAgICAgIE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihkaWFnb25hbCgKKyAgICAgICAgTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoZGlhZ29uYWwoCisgICAgICAgIE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShkaWFnb25hbCgKKyAgICAgICAgTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoZGlhZ29uYWwoTWF0cml4PGZsb2F0LCBEeW5hbWljLCA0PigzLCA0KSkpOworICAgIENBTExfU1VCVEVTVF8xKGRpYWdvbmFsX2Fzc2VydCgKKyAgICAgICAgTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlhZ29uYWxfbWF0cml4X3ZhcmlhZGljX2N0b3IuY3BwIGIvdGVzdC9kaWFnb25hbF9tYXRyaXhfdmFyaWFkaWNfY3Rvci5jcHAKaW5kZXggZGI1NjUzOS4uZTNlNTFhYSAxMDA2NDQKLS0tIGEvdGVzdC9kaWFnb25hbF9tYXRyaXhfdmFyaWFkaWNfY3Rvci5jcHAKKysrIGIvdGVzdC9kaWFnb25hbF9tYXRyaXhfdmFyaWFkaWNfY3Rvci5jcHAKQEAgLTMzLDkgKzMzLDggQEAKICAgVkVSSUZZX0lTX0FQUFJPWChEZW5zZSgzLCAzKSwgKFNjYWxhcilWMyk7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFZFUklGWV9JU19BUFBST1goRGVuc2UoNCwgNCksIChTY2FsYXIpVjQpOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIGNvbnN0cnVjdG9yVGVzdCgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBjb25zdHJ1Y3RvclRlc3QoKSB7CiAgIHR5cGVkZWYgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLCAwPiBEaWFnb25hbE1hdHJpeDA7CiAgIHR5cGVkZWYgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLCAzPiBEaWFnb25hbE1hdHJpeDM7CiAgIHR5cGVkZWYgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLCA0PiBEaWFnb25hbE1hdHJpeDQ7CkBAIC00NiwyMSArNDUsMjEgQEAKIAogICAvLyBGaXhlZC1zaXplZCBtYXRyaWNlcwogICB7Ci0gICAgRGlhZ29uYWxNYXRyaXgwIGEge3t9fTsKKyAgICBEaWFnb25hbE1hdHJpeDAgYXt7fX07CiAgICAgVkVSSUZZKGEucm93cygpID09IDApOwogICAgIFZFUklGWShhLmNvbHMoKSA9PSAwKTsKICAgICB0eXBlbmFtZSBEaWFnb25hbE1hdHJpeDA6OkRlbnNlTWF0cml4VHlwZSBtID0gYS50b0RlbnNlTWF0cml4KCk7CiAgICAgZm9yIChJbmRleCBrID0gMDsgayA8IGEucm93cygpOyArK2spIFZFUklGWShtKGssIGspID09IHJhd1trXSk7CiAgIH0KICAgewotICAgIERpYWdvbmFsTWF0cml4MyBhIHt7cmF3WzBdLCByYXdbMV0sIHJhd1syXX19OworICAgIERpYWdvbmFsTWF0cml4MyBhe3tyYXdbMF0sIHJhd1sxXSwgcmF3WzJdfX07CiAgICAgVkVSSUZZKGEucm93cygpID09IDMpOwogICAgIFZFUklGWShhLmNvbHMoKSA9PSAzKTsKICAgICB0eXBlbmFtZSBEaWFnb25hbE1hdHJpeDM6OkRlbnNlTWF0cml4VHlwZSBtID0gYS50b0RlbnNlTWF0cml4KCk7CiAgICAgZm9yIChJbmRleCBrID0gMDsgayA8IGEucm93cygpOyArK2spIFZFUklGWShtKGssIGspID09IHJhd1trXSk7CiAgIH0KICAgewotICAgIERpYWdvbmFsTWF0cml4NCBhIHt7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfX07CisgICAgRGlhZ29uYWxNYXRyaXg0IGF7e3Jhd1swXSwgcmF3WzFdLCByYXdbMl0sIHJhd1szXX19OwogICAgIFZFUklGWShhLnJvd3MoKSA9PSA0KTsKICAgICBWRVJJRlkoYS5jb2xzKCkgPT0gNCk7CiAgICAgdHlwZW5hbWUgRGlhZ29uYWxNYXRyaXg0OjpEZW5zZU1hdHJpeFR5cGUgbSA9IGEudG9EZW5zZU1hdHJpeCgpOwpAQCAtODQsOSArODMsOCBAQAogICB9CiB9CiAKLXRlbXBsYXRlPD4KLXZvaWQgY29uc3RydWN0b3JUZXN0PGZsb2F0PigpCi17Cit0ZW1wbGF0ZSA8Pgordm9pZCBjb25zdHJ1Y3RvclRlc3Q8ZmxvYXQ+KCkgewogICB0eXBlZGVmIGZsb2F0IFNjYWxhcjsKIAogICB0eXBlZGVmIERpYWdvbmFsTWF0cml4PFNjYWxhciwgMD4gRGlhZ29uYWxNYXRyaXgwOwpAQCAtMTAwLDIxICs5OCwyMSBAQAogCiAgIC8vIEZpeGVkLXNpemVkIG1hdHJpY2VzCiAgIHsKLSAgICBEaWFnb25hbE1hdHJpeDAgYSB7e319OworICAgIERpYWdvbmFsTWF0cml4MCBhe3t9fTsKICAgICBWRVJJRlkoYS5yb3dzKCkgPT0gMCk7CiAgICAgVkVSSUZZKGEuY29scygpID09IDApOwogICAgIHR5cGVuYW1lIERpYWdvbmFsTWF0cml4MDo6RGVuc2VNYXRyaXhUeXBlIG0gPSBhLnRvRGVuc2VNYXRyaXgoKTsKICAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgYS5yb3dzKCk7ICsraykgVkVSSUZZKG0oaywgaykgPT0gcmF3W2tdKTsKICAgfQogICB7Ci0gICAgRGlhZ29uYWxNYXRyaXgzIGEge3tyYXdbMF0sIHJhd1sxXSwgcmF3WzJdfX07CisgICAgRGlhZ29uYWxNYXRyaXgzIGF7e3Jhd1swXSwgcmF3WzFdLCByYXdbMl19fTsKICAgICBWRVJJRlkoYS5yb3dzKCkgPT0gMyk7CiAgICAgVkVSSUZZKGEuY29scygpID09IDMpOwogICAgIHR5cGVuYW1lIERpYWdvbmFsTWF0cml4Mzo6RGVuc2VNYXRyaXhUeXBlIG0gPSBhLnRvRGVuc2VNYXRyaXgoKTsKICAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgYS5yb3dzKCk7ICsraykgVkVSSUZZKG0oaywgaykgPT0gcmF3W2tdKTsKICAgfQogICB7Ci0gICAgRGlhZ29uYWxNYXRyaXg0IGEge3tyYXdbMF0sIHJhd1sxXSwgcmF3WzJdLCByYXdbM119fTsKKyAgICBEaWFnb25hbE1hdHJpeDQgYXt7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfX07CiAgICAgVkVSSUZZKGEucm93cygpID09IDQpOwogICAgIFZFUklGWShhLmNvbHMoKSA9PSA0KTsKICAgICB0eXBlbmFtZSBEaWFnb25hbE1hdHJpeDQ6OkRlbnNlTWF0cml4VHlwZSBtID0gYS50b0RlbnNlTWF0cml4KCk7CkBAIC0xNDEsOCArMTM5LDcgQEAKICAgeyBWRVJJRllfSU1QTElDSVRfQ09OVkVSU0lPTl81KERpYWdvbmFsTWF0cml4NSwgMS4yNjQ3LCAyLjU2ZiwgLTMsIDMuMjNmLCAyKTsgfQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoZGlhZ29uYWxfbWF0cml4X3ZhcmlhZGljX2N0b3IpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoZGlhZ29uYWxfbWF0cml4X3ZhcmlhZGljX2N0b3IpIHsKICAgQ0FMTF9TVUJURVNUXzIoY29uc3RydWN0b3JUZXN0PHVuc2lnbmVkIGNoYXI+KCkpOwogICBDQUxMX1NVQlRFU1RfMihjb25zdHJ1Y3RvclRlc3Q8ZmxvYXQ+KCkpOwogICBDQUxMX1NVQlRFU1RfMihjb25zdHJ1Y3RvclRlc3Q8SW5kZXg+KCkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9kaWFnb25hbG1hdHJpY2VzLmNwcCBiL3Rlc3QvZGlhZ29uYWxtYXRyaWNlcy5jcHAKaW5kZXggMTU0OTJhNy4uNjI0NTBhYiAxMDA2NDQKLS0tIGEvdGVzdC9kaWFnb25hbG1hdHJpY2VzLmNwcAorKysgYi90ZXN0L2RpYWdvbmFsbWF0cmljZXMuY3BwCkBAIC03LDcgKzcsNiBAQAogLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCiAvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KIAotCiAvLyBkaXNjYXJkIHN0YWNrIGFsbG9jYXRpb24gYXMgdGhhdCB0b28gYnlwYXNzZXMgbWFsbG9jCiAjZGVmaW5lIEVJR0VOX1NUQUNLX0FMTE9DQVRJT05fTElNSVQgMAogLy8gaGVhcCBhbGxvY2F0aW9uIHdpbGwgcmFpc2UgYW4gYXNzZXJ0IGlmIGVuYWJsZWQgYXQgcnVudGltZQpAQCAtMTUsOCArMTQsOCBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgZGlhZ29uYWxtYXRyaWNlcyhjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGRpYWdvbmFsbWF0cmljZXMoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIGVudW0geyBSb3dzID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIENvbHMgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSB9OwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3MsIDE+IFZlY3RvclR5cGU7CkBAIC0yNSw3NiArMjQsNzMgQEAKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBEeW5NYXRyaXhUeXBlOwogICB0eXBlZGVmIERpYWdvbmFsTWF0cml4PFNjYWxhciwgUm93cz4gTGVmdERpYWdvbmFsTWF0cml4OwogICB0eXBlZGVmIERpYWdvbmFsTWF0cml4PFNjYWxhciwgQ29scz4gUmlnaHREaWFnb25hbE1hdHJpeDsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzPT1EeW5hbWljP0R5bmFtaWM6MipSb3dzLCBDb2xzPT1EeW5hbWljP0R5bmFtaWM6MipDb2xzPiBCaWdNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93cyA9PSBEeW5hbWljID8gRHluYW1pYyA6IDIgKiBSb3dzLCBDb2xzID09IER5bmFtaWMgPyBEeW5hbWljIDogMiAqIENvbHM+IEJpZ01hdHJpeDsKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKLSAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKLSAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwKLSAgICAgICAgICAgICB2MiA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKLSAgUm93VmVjdG9yVHlwZSBydjEgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20oY29scyksCi0gICAgICAgICAgICAgcnYyID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKGNvbHMpOworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwgdjIgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisgIFJvd1ZlY3RvclR5cGUgcnYxID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKGNvbHMpLCBydjIgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20oY29scyk7CiAKICAgTGVmdERpYWdvbmFsTWF0cml4IGxkbTEodjEpLCBsZG0yKHYyKTsKICAgUmlnaHREaWFnb25hbE1hdHJpeCByZG0xKHJ2MSksIHJkbTIocnYyKTsKLSAgCisKICAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAKLSAgU3F1YXJlTWF0cml4VHlwZSBzcV9tMSAodjEuYXNEaWFnb25hbCgpKTsKKyAgU3F1YXJlTWF0cml4VHlwZSBzcV9tMSh2MS5hc0RpYWdvbmFsKCkpOwogICBWRVJJRllfSVNfQVBQUk9YKHNxX20xLCB2MS5hc0RpYWdvbmFsKCkudG9EZW5zZU1hdHJpeCgpKTsKICAgc3FfbTEgPSB2MS5hc0RpYWdvbmFsKCk7CiAgIFZFUklGWV9JU19BUFBST1goc3FfbTEsIHYxLmFzRGlhZ29uYWwoKS50b0RlbnNlTWF0cml4KCkpOwogICBTcXVhcmVNYXRyaXhUeXBlIHNxX20yID0gdjEuYXNEaWFnb25hbCgpOwogICBWRVJJRllfSVNfQVBQUk9YKHNxX20xLCBzcV9tMik7Ci0gIAorCiAgIGxkbTEgPSB2MS5hc0RpYWdvbmFsKCk7CiAgIExlZnREaWFnb25hbE1hdHJpeCBsZG0zKHYxKTsKICAgVkVSSUZZX0lTX0FQUFJPWChsZG0xLmRpYWdvbmFsKCksIGxkbTMuZGlhZ29uYWwoKSk7CiAgIExlZnREaWFnb25hbE1hdHJpeCBsZG00ID0gdjEuYXNEaWFnb25hbCgpOwogICBWRVJJRllfSVNfQVBQUk9YKGxkbTEuZGlhZ29uYWwoKSwgbGRtNC5kaWFnb25hbCgpKTsKLSAgCi0gIHNxX20xLmJsb2NrKDAsMCxyb3dzLHJvd3MpID0gbGRtMTsKKworICBzcV9tMS5ibG9jaygwLCAwLCByb3dzLCByb3dzKSA9IGxkbTE7CiAgIFZFUklGWV9JU19BUFBST1goc3FfbTEsIGxkbTEudG9EZW5zZU1hdHJpeCgpKTsKICAgc3FfbTEudHJhbnNwb3NlKCkgPSBsZG0xOwogICBWRVJJRllfSVNfQVBQUk9YKHNxX20xLCBsZG0xLnRvRGVuc2VNYXRyaXgoKSk7Ci0gIAotICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKTsKLSAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7Ci0gIAorCisgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMSk7CisgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CisKICAgaW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZChmYWxzZSk7Ci0gIFZFUklGWV9JU19BUFBST1goICgobGRtMSAqIG0xKShpLGopKSAgLCBsZG0xLmRpYWdvbmFsKCkoaSkgKiBtMShpLGopICk7Ci0gIFZFUklGWV9JU19BUFBST1goICgobGRtMSAqIChtMSttMikpKGksaikpICAsIGxkbTEuZGlhZ29uYWwoKShpKSAqIChtMSttMikoaSxqKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAoKG0xICogcmRtMSkoaSxqKSkgICwgcmRtMS5kaWFnb25hbCgpKGopICogbTEoaSxqKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAoKHYxLmFzRGlhZ29uYWwoKSAqIG0xKShpLGopKSAgLCB2MShpKSAqIG0xKGksaikgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKChtMSAqIHJ2MS5hc0RpYWdvbmFsKCkpKGksaikpICAsIHJ2MShqKSAqIG0xKGksaikgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKCgodjErdjIpLmFzRGlhZ29uYWwoKSAqIG0xKShpLGopKSAgLCAodjErdjIpKGkpICogbTEoaSxqKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAoKCh2MSt2MikuYXNEaWFnb25hbCgpICogKG0xK20yKSkoaSxqKSkgICwgKHYxK3YyKShpKSAqIChtMSttMikoaSxqKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAoKG0xICogKHJ2MStydjIpLmFzRGlhZ29uYWwoKSkoaSxqKSkgICwgKHJ2MStydjIpKGopICogbTEoaSxqKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAoKChtMSttMikgKiAocnYxK3J2MikuYXNEaWFnb25hbCgpKShpLGopKSAgLCAocnYxK3J2MikoaikgKiAobTErbTIpKGksaikgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKGxkbTEgKiBsZG0xKS5kaWFnb25hbCgpKGkpLCBsZG0xLmRpYWdvbmFsKCkoaSkgKiBsZG0xLmRpYWdvbmFsKCkoaSkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKGxkbTEgKiBsZG0xICogbTEpKGksIGopLCBsZG0xLmRpYWdvbmFsKCkoaSkgKiBsZG0xLmRpYWdvbmFsKCkoaSkgKiBtMShpLCBqKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAoKHYxLmFzRGlhZ29uYWwoKSAqIHYxLmFzRGlhZ29uYWwoKSkuZGlhZ29uYWwoKShpKSksIHYxKGkpICogdjEoaSkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKGxkbTEgKiBtMSkoaSwgaikpLCBsZG0xLmRpYWdvbmFsKCkoaSkgKiBtMShpLCBqKSk7CisgIFZFUklGWV9JU19BUFBST1goKChsZG0xICogKG0xICsgbTIpKShpLCBqKSksIGxkbTEuZGlhZ29uYWwoKShpKSAqIChtMSArIG0yKShpLCBqKSk7CisgIFZFUklGWV9JU19BUFBST1goKChtMSAqIHJkbTEpKGksIGopKSwgcmRtMS5kaWFnb25hbCgpKGopICogbTEoaSwgaikpOworICBWRVJJRllfSVNfQVBQUk9YKCgodjEuYXNEaWFnb25hbCgpICogbTEpKGksIGopKSwgdjEoaSkgKiBtMShpLCBqKSk7CisgIFZFUklGWV9JU19BUFBST1goKChtMSAqIHJ2MS5hc0RpYWdvbmFsKCkpKGksIGopKSwgcnYxKGopICogbTEoaSwgaikpOworICBWRVJJRllfSVNfQVBQUk9YKCgoKHYxICsgdjIpLmFzRGlhZ29uYWwoKSAqIG0xKShpLCBqKSksICh2MSArIHYyKShpKSptMShpLCBqKSk7CisgIFZFUklGWV9JU19BUFBST1goKCgodjEgKyB2MikuYXNEaWFnb25hbCgpICogKG0xICsgbTIpKShpLCBqKSksICh2MSArIHYyKShpKSAqIChtMSArIG0yKShpLCBqKSk7CisgIFZFUklGWV9JU19BUFBST1goKChtMSAqIChydjEgKyBydjIpLmFzRGlhZ29uYWwoKSkoaSwgaikpLCAocnYxICsgcnYyKShqKSptMShpLCBqKSk7CisgIFZFUklGWV9JU19BUFBST1goKCgobTEgKyBtMikgKiAocnYxICsgcnYyKS5hc0RpYWdvbmFsKCkpKGksIGopKSwgKHJ2MSArIHJ2MikoaikgKiAobTEgKyBtMikoaSwgaikpOworICBWRVJJRllfSVNfQVBQUk9YKChsZG0xICogbGRtMSkuZGlhZ29uYWwoKShpKSwgbGRtMS5kaWFnb25hbCgpKGkpICogbGRtMS5kaWFnb25hbCgpKGkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobGRtMSAqIGxkbTEgKiBtMSkoaSwgaiksIGxkbTEuZGlhZ29uYWwoKShpKSAqIGxkbTEuZGlhZ29uYWwoKShpKSAqIG0xKGksIGopKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKHYxLmFzRGlhZ29uYWwoKSAqIHYxLmFzRGlhZ29uYWwoKSkuZGlhZ29uYWwoKShpKSksIHYxKGkpICogdjEoaSkpOwogICBpbnRlcm5hbDo6c2V0X2lzX21hbGxvY19hbGxvd2VkKHRydWUpOwotICAKLSAgaWYocm93cz4xKQotICB7Ci0gICAgRHluTWF0cml4VHlwZSB0bXAgPSBtMS50b3BSb3dzKHJvd3MvMiksIHJlczsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCAocmVzID0gbTEudG9wUm93cyhyb3dzLzIpICogcnYxLmFzRGlhZ29uYWwoKSksIHRtcCAqIHJ2MS5hc0RpYWdvbmFsKCkgKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCAocmVzID0gdjEuaGVhZChyb3dzLzIpLmFzRGlhZ29uYWwoKSptMS50b3BSb3dzKHJvd3MvMikpLCB2MS5oZWFkKHJvd3MvMikuYXNEaWFnb25hbCgpKnRtcCApOworCisgIGlmIChyb3dzID4gMSkgeworICAgIER5bk1hdHJpeFR5cGUgdG1wID0gbTEudG9wUm93cyhyb3dzIC8gMiksIHJlczsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChyZXMgPSBtMS50b3BSb3dzKHJvd3MgLyAyKSAqIHJ2MS5hc0RpYWdvbmFsKCkpLCB0bXAgKiBydjEuYXNEaWFnb25hbCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChyZXMgPSB2MS5oZWFkKHJvd3MgLyAyKS5hc0RpYWdvbmFsKCkgKiBtMS50b3BSb3dzKHJvd3MgLyAyKSksCisgICAgICAgICAgICAgICAgICAgICB2MS5oZWFkKHJvd3MgLyAyKS5hc0RpYWdvbmFsKCkgKiB0bXApOwogICB9CiAKICAgQmlnTWF0cml4IGJpZzsKLSAgYmlnLnNldFplcm8oMipyb3dzLCAyKmNvbHMpOwotICAKLSAgYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpID0gbTE7Ci0gIGJpZy5ibG9jayhpLGoscm93cyxjb2xzKSA9IHYxLmFzRGlhZ29uYWwoKSAqIGJpZy5ibG9jayhpLGoscm93cyxjb2xzKTsKLSAgCi0gIFZFUklGWV9JU19BUFBST1goKGJpZy5ibG9jayhpLGoscm93cyxjb2xzKSkgLCB2MS5hc0RpYWdvbmFsKCkgKiBtMSApOwotICAKLSAgYmlnLmJsb2NrKGksaixyb3dzLGNvbHMpID0gbTE7Ci0gIGJpZy5ibG9jayhpLGoscm93cyxjb2xzKSA9IGJpZy5ibG9jayhpLGoscm93cyxjb2xzKSAqIHJ2MS5hc0RpYWdvbmFsKCk7Ci0gIFZFUklGWV9JU19BUFBST1goKGJpZy5ibG9jayhpLGoscm93cyxjb2xzKSkgLCBtMSAqIHJ2MS5hc0RpYWdvbmFsKCkgKTsKKyAgYmlnLnNldFplcm8oMiAqIHJvd3MsIDIgKiBjb2xzKTsKKworICBiaWcuYmxvY2soaSwgaiwgcm93cywgY29scykgPSBtMTsKKyAgYmlnLmJsb2NrKGksIGosIHJvd3MsIGNvbHMpID0gdjEuYXNEaWFnb25hbCgpICogYmlnLmJsb2NrKGksIGosIHJvd3MsIGNvbHMpOworCisgIFZFUklGWV9JU19BUFBST1goKGJpZy5ibG9jayhpLCBqLCByb3dzLCBjb2xzKSksIHYxLmFzRGlhZ29uYWwoKSAqIG0xKTsKKworICBiaWcuYmxvY2soaSwgaiwgcm93cywgY29scykgPSBtMTsKKyAgYmlnLmJsb2NrKGksIGosIHJvd3MsIGNvbHMpID0gYmlnLmJsb2NrKGksIGosIHJvd3MsIGNvbHMpICogcnYxLmFzRGlhZ29uYWwoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoYmlnLmJsb2NrKGksIGosIHJvd3MsIGNvbHMpKSwgbTEgKiBydjEuYXNEaWFnb25hbCgpKTsKIAogICAvLyBwcm9kdWN0cyBkbyBub3QgYWxsb2NhdGUgbWVtb3J5CiAgIE1hdHJpeFR5cGUgcmVzKHJvd3MsIGNvbHMpOwpAQCAtMTAzLDM0ICs5OSwzNCBAQAogICByZXMubm9hbGlhcygpID0gbTEgKiByZG0xOwogICByZXMubm9hbGlhcygpID0gbGRtMSAqIG0xICogcmRtMTsKICAgcmVzLm5vYWxpYXMoKSA9IExlZnREaWFnb25hbE1hdHJpeDo6SWRlbnRpdHkocm93cykgKiBtMSAqIFJpZ2h0RGlhZ29uYWxNYXRyaXg6Olplcm8oY29scyk7Ci0gIGludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQodHJ1ZSk7ICAKLSAgCisgIGludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQodHJ1ZSk7CisKICAgLy8gc2NhbGFyIG11bHRpcGxlCi0gIFZFUklGWV9JU19BUFBST1goTGVmdERpYWdvbmFsTWF0cml4KGxkbTEqczEpLmRpYWdvbmFsKCksIGxkbTEuZGlhZ29uYWwoKSAqIHMxKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChMZWZ0RGlhZ29uYWxNYXRyaXgoczEqbGRtMSkuZGlhZ29uYWwoKSwgczEgKiBsZG0xLmRpYWdvbmFsKCkpOwotICAKKyAgVkVSSUZZX0lTX0FQUFJPWChMZWZ0RGlhZ29uYWxNYXRyaXgobGRtMSAqIHMxKS5kaWFnb25hbCgpLCBsZG0xLmRpYWdvbmFsKCkgKiBzMSk7CisgIFZFUklGWV9JU19BUFBST1goTGVmdERpYWdvbmFsTWF0cml4KHMxICogbGRtMSkuZGlhZ29uYWwoKSwgczEgKiBsZG0xLmRpYWdvbmFsKCkpOworCiAgIFZFUklGWV9JU19BUFBST1gobTEgKiAocmRtMSAqIHMxKSwgKG0xICogcmRtMSkgKiBzMSk7CiAgIFZFUklGWV9JU19BUFBST1gobTEgKiAoczEgKiByZG0xKSwgKG0xICogcmRtMSkgKiBzMSk7Ci0gIAorCiAgIC8vIERpYWdvbmFsIHRvIGRlbnNlCiAgIHNxX20xLnNldFJhbmRvbSgpOwogICBzcV9tMiA9IHNxX20xOwotICBWRVJJRllfSVNfQVBQUk9YKCAoc3FfbTEgKz0gKHMxKnYxKS5hc0RpYWdvbmFsKCkpLCBzcV9tMiArPSAoczEqdjEpLmFzRGlhZ29uYWwoKS50b0RlbnNlTWF0cml4KCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKHNxX20xIC09IChzMSp2MSkuYXNEaWFnb25hbCgpKSwgc3FfbTIgLT0gKHMxKnYxKS5hc0RpYWdvbmFsKCkudG9EZW5zZU1hdHJpeCgpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIChzcV9tMSA9IChzMSp2MSkuYXNEaWFnb25hbCgpKSwgKHMxKnYxKS5hc0RpYWdvbmFsKCkudG9EZW5zZU1hdHJpeCgpICk7CisgIFZFUklGWV9JU19BUFBST1goKHNxX20xICs9IChzMSAqIHYxKS5hc0RpYWdvbmFsKCkpLCBzcV9tMiArPSAoczEgKiB2MSkuYXNEaWFnb25hbCgpLnRvRGVuc2VNYXRyaXgoKSk7CisgIFZFUklGWV9JU19BUFBST1goKHNxX20xIC09IChzMSAqIHYxKS5hc0RpYWdvbmFsKCkpLCBzcV9tMiAtPSAoczEgKiB2MSkuYXNEaWFnb25hbCgpLnRvRGVuc2VNYXRyaXgoKSk7CisgIFZFUklGWV9JU19BUFBST1goKHNxX20xID0gKHMxICogdjEpLmFzRGlhZ29uYWwoKSksIChzMSAqIHYxKS5hc0RpYWdvbmFsKCkudG9EZW5zZU1hdHJpeCgpKTsKIAogICBzcV9tMS5zZXRSYW5kb20oKTsKICAgc3FfbTIgPSB2MS5hc0RpYWdvbmFsKCk7CiAgIHNxX20yID0gc3FfbTEgKiBzcV9tMjsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKHNxX20xKnYxLmFzRGlhZ29uYWwoKSkuY29sKGkpLCBzcV9tMi5jb2woaSkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKHNxX20xKnYxLmFzRGlhZ29uYWwoKSkucm93KGkpLCBzcV9tMi5yb3coaSkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoc3FfbTEgKiB2MS5hc0RpYWdvbmFsKCkpLmNvbChpKSwgc3FfbTIuY29sKGkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoc3FfbTEgKiB2MS5hc0RpYWdvbmFsKCkpLnJvdyhpKSwgc3FfbTIucm93KGkpKTsKIAogICBzcV9tMSA9IHYxLmFzRGlhZ29uYWwoKTsKICAgc3FfbTIgPSB2Mi5hc0RpYWdvbmFsKCk7CiAgIFNxdWFyZU1hdHJpeFR5cGUgc3FfbTMgPSB2MS5hc0RpYWdvbmFsKCk7Ci0gIFZFUklGWV9JU19BUFBST1goIHNxX20zID0gdjEuYXNEaWFnb25hbCgpICsgdjIuYXNEaWFnb25hbCgpLCBzcV9tMSArIHNxX20yKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc3FfbTMgPSB2MS5hc0RpYWdvbmFsKCkgLSB2Mi5hc0RpYWdvbmFsKCksIHNxX20xIC0gc3FfbTIpOwotICBWRVJJRllfSVNfQVBQUk9YKCBzcV9tMyA9IHYxLmFzRGlhZ29uYWwoKSAtIDIqdjIuYXNEaWFnb25hbCgpICsgdjEuYXNEaWFnb25hbCgpLCBzcV9tMSAtIDIqc3FfbTIgKyBzcV9tMSk7CisgIFZFUklGWV9JU19BUFBST1goc3FfbTMgPSB2MS5hc0RpYWdvbmFsKCkgKyB2Mi5hc0RpYWdvbmFsKCksIHNxX20xICsgc3FfbTIpOworICBWRVJJRllfSVNfQVBQUk9YKHNxX20zID0gdjEuYXNEaWFnb25hbCgpIC0gdjIuYXNEaWFnb25hbCgpLCBzcV9tMSAtIHNxX20yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzcV9tMyA9IHYxLmFzRGlhZ29uYWwoKSAtIDIgKiB2Mi5hc0RpYWdvbmFsKCkgKyB2MS5hc0RpYWdvbmFsKCksIHNxX20xIC0gMiAqIHNxX20yICsgc3FfbTEpOwogCiAgIC8vIFplcm8gYW5kIElkZW50aXR5CiAgIExlZnREaWFnb25hbE1hdHJpeCB6ZXJvID0gTGVmdERpYWdvbmFsTWF0cml4OjpaZXJvKHJvd3MpOwpAQCAtMTQwLDggKzEzNiw4IEBACiAgIFZFUklGWV9JU19BUFBST1goKHplcm8gKyAyICogTGVmdERpYWdvbmFsTWF0cml4OjpJZGVudGl0eShyb3dzKSkuZGlhZ29uYWwoKS5zdW0oKSwgU2NhbGFyKDIgKiByb3dzKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgYXNfc2NhbGFyX3Byb2R1Y3QoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBhc19zY2FsYXJfcHJvZHVjdChjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBEeW5NYXRyaXhUeXBlOwpAQCAtMTQ5LDUxICsxNDUsNTMgQEAKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBEeW5hbWljPiBEeW5Sb3dWZWN0b3JUeXBlOwogCiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKLSAgSW5kZXggZGVwdGggPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICBJbmRleCBkZXB0aCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpOwogCi0gIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7ICAKLSAgRHluVmVjdG9yVHlwZSAgICAgZHYxICA9IER5blZlY3RvclR5cGU6OlJhbmRvbShkZXB0aCk7Ci0gIER5blJvd1ZlY3RvclR5cGUgIGRydjEgPSBEeW5Sb3dWZWN0b3JUeXBlOjpSYW5kb20oZGVwdGgpOwotICBEeW5NYXRyaXhUeXBlICAgICBkbTEgID0gZHYxOwotICBEeW5NYXRyaXhUeXBlICAgICBkcm0xID0gZHJ2MTsKLSAgCisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CisgIER5blZlY3RvclR5cGUgZHYxID0gRHluVmVjdG9yVHlwZTo6UmFuZG9tKGRlcHRoKTsKKyAgRHluUm93VmVjdG9yVHlwZSBkcnYxID0gRHluUm93VmVjdG9yVHlwZTo6UmFuZG9tKGRlcHRoKTsKKyAgRHluTWF0cml4VHlwZSBkbTEgPSBkdjE7CisgIER5bk1hdHJpeFR5cGUgZHJtMSA9IGRydjE7CisKICAgU2NhbGFyIHMgPSB2MSgwKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCB2MS5hc0RpYWdvbmFsKCkgKiBkcnYxLCBzKmRydjEgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggZHYxICogdjEuYXNEaWFnb25hbCgpLCBkdjEqcyApOworICBWRVJJRllfSVNfQVBQUk9YKHYxLmFzRGlhZ29uYWwoKSAqIGRydjEsIHMgKiBkcnYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChkdjEgKiB2MS5hc0RpYWdvbmFsKCksIGR2MSAqIHMpOwogCi0gIFZFUklGWV9JU19BUFBST1goIHYxLmFzRGlhZ29uYWwoKSAqIGRybTEsIHMqZHJtMSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBkbTEgKiB2MS5hc0RpYWdvbmFsKCksIGRtMSpzICk7CisgIFZFUklGWV9JU19BUFBST1godjEuYXNEaWFnb25hbCgpICogZHJtMSwgcyAqIGRybTEpOworICBWRVJJRllfSVNfQVBQUk9YKGRtMSAqIHYxLmFzRGlhZ29uYWwoKSwgZG0xICogcyk7CiB9CiAKLXRlbXBsYXRlPGludD4KLXZvaWQgYnVnOTg3KCkKLXsKK3RlbXBsYXRlIDxpbnQ+Cit2b2lkIGJ1Zzk4NygpIHsKICAgTWF0cml4M1hkIHBvaW50cyA9IE1hdHJpeDNYZDo6UmFuZG9tKDMsIDMpOwogICBWZWN0b3IyZCBkaWFnID0gVmVjdG9yMmQ6OlJhbmRvbSgpOwogICBNYXRyaXgyWGQgdG1wMSA9IHBvaW50cy50b3BSb3dzPDI+KCksIHJlczEsIHJlczI7Ci0gIFZFUklGWV9JU19BUFBST1goIHJlczEgPSBkaWFnLmFzRGlhZ29uYWwoKSAqIHBvaW50cy50b3BSb3dzPDI+KCksIHJlczIgPSBkaWFnLmFzRGlhZ29uYWwoKSAqIHRtcDEgKTsKLSAgTWF0cml4MmQgdG1wMiA9IHBvaW50cy50b3BMZWZ0Q29ybmVyPDIsMj4oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgoIHJlczEgPSBwb2ludHMudG9wTGVmdENvcm5lcjwyLDI+KCkqZGlhZy5hc0RpYWdvbmFsKCkpICwgcmVzMiA9IHRtcDIqZGlhZy5hc0RpYWdvbmFsKCkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMxID0gZGlhZy5hc0RpYWdvbmFsKCkgKiBwb2ludHMudG9wUm93czwyPigpLCByZXMyID0gZGlhZy5hc0RpYWdvbmFsKCkgKiB0bXAxKTsKKyAgTWF0cml4MmQgdG1wMiA9IHBvaW50cy50b3BMZWZ0Q29ybmVyPDIsIDI+KCk7CisgIFZFUklGWV9JU19BUFBST1goKHJlczEgPSBwb2ludHMudG9wTGVmdENvcm5lcjwyLCAyPigpICogZGlhZy5hc0RpYWdvbmFsKCkpLCByZXMyID0gdG1wMiAqIGRpYWcuYXNEaWFnb25hbCgpKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGRpYWdvbmFsbWF0cmljZXMpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGRpYWdvbmFsbWF0cmljZXMoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8xKCBhc19zY2FsYXJfcHJvZHVjdChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7CitFSUdFTl9ERUNMQVJFX1RFU1QoZGlhZ29uYWxtYXRyaWNlcykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShkaWFnb25hbG1hdHJpY2VzKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8xKGFzX3NjYWxhcl9wcm9kdWN0KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzIoIGRpYWdvbmFsbWF0cmljZXMoTWF0cml4M2YoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggZGlhZ29uYWxtYXRyaWNlcyhNYXRyaXg8ZG91YmxlLDMsMyxSb3dNYWpvcj4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggZGlhZ29uYWxtYXRyaWNlcyhNYXRyaXg0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF81KCBkaWFnb25hbG1hdHJpY2VzKE1hdHJpeDxmbG9hdCw0LDQsUm93TWFqb3I+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoIGRpYWdvbmFsbWF0cmljZXMoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoIGFzX3NjYWxhcl9wcm9kdWN0KE1hdHJpeFhjZigxLDEpKSApOwotICAgIENBTExfU1VCVEVTVF83KCBkaWFnb25hbG1hdHJpY2VzKE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzgoIGRpYWdvbmFsbWF0cmljZXMoTWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzkoIGRpYWdvbmFsbWF0cmljZXMoTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOSggZGlhZ29uYWxtYXRyaWNlcyhNYXRyaXhYZigxLDEpKSApOwotICAgIENBTExfU1VCVEVTVF85KCBhc19zY2FsYXJfcHJvZHVjdChNYXRyaXhYZigxLDEpKSApOworICAgIENBTExfU1VCVEVTVF8yKGRpYWdvbmFsbWF0cmljZXMoTWF0cml4M2YoKSkpOworICAgIENBTExfU1VCVEVTVF8zKGRpYWdvbmFsbWF0cmljZXMoTWF0cml4PGRvdWJsZSwgMywgMywgUm93TWFqb3I+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChkaWFnb25hbG1hdHJpY2VzKE1hdHJpeDRkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShkaWFnb25hbG1hdHJpY2VzKE1hdHJpeDxmbG9hdCwgNCwgNCwgUm93TWFqb3I+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNihkaWFnb25hbG1hdHJpY2VzKAorICAgICAgICBNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoYXNfc2NhbGFyX3Byb2R1Y3QoTWF0cml4WGNmKDEsIDEpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoZGlhZ29uYWxtYXRyaWNlcygKKyAgICAgICAgTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgoZGlhZ29uYWxtYXRyaWNlcyhNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4oCisgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF85KGRpYWdvbmFsbWF0cmljZXMoCisgICAgICAgIE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF85KGRpYWdvbmFsbWF0cmljZXMoTWF0cml4WGYoMSwgMSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfOShhc19zY2FsYXJfcHJvZHVjdChNYXRyaXhYZigxLCAxKSkpOwogICB9Ci0gIENBTExfU1VCVEVTVF8xMCggYnVnOTg3PDA+KCkgKTsKKyAgQ0FMTF9TVUJURVNUXzEwKGJ1Zzk4NzwwPigpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZG9udGFsaWduLmNwcCBiL3Rlc3QvZG9udGFsaWduLmNwcAppbmRleCAyZTQxMDJiLi4yMjEwYmFkIDEwMDY0NAotLS0gYS90ZXN0L2RvbnRhbGlnbi5jcHAKKysrIGIvdGVzdC9kb250YWxpZ24uY3BwCkBAIC0xNiw5ICsxNiw4IEBACiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgPEVpZ2VuL0RlbnNlPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCBkb250YWxpZ24oY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBkb250YWxpZ24oY29uc3QgTWF0cml4VHlwZSYgbSkgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBTcXVhcmVNYXRyaXhUeXBlOwpAQCAtMjYsMTQgKzI1LDE0IEBACiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwogCi0gIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICBTcXVhcmVNYXRyaXhUeXBlIHNxdWFyZSA9IFNxdWFyZU1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLHJvd3MpOworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIFNxdWFyZU1hdHJpeFR5cGUgc3F1YXJlID0gU3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIHJvd3MpOwogICBWZWN0b3JUeXBlIHYgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CiAKICAgVkVSSUZZX0lTX0FQUFJPWCh2LCBzcXVhcmUgKiBzcXVhcmUuY29sUGl2SG91c2Vob2xkZXJRcigpLnNvbHZlKHYpKTsKICAgc3F1YXJlID0gc3F1YXJlLmludmVyc2UoKS5ldmFsKCk7CiAgIGEgPSBzcXVhcmUgKiBhOwotICBzcXVhcmUgPSBzcXVhcmUqc3F1YXJlOworICBzcXVhcmUgPSBzcXVhcmUgKiBzcXVhcmU7CiAgIHYgPSBzcXVhcmUgKiB2OwogICB2ID0gYS5hZGpvaW50KCkgKiB2OwogICBWRVJJRlkoc3F1YXJlLmRldGVybWluYW50KCkgIT0gU2NhbGFyKDApKTsKQEAgLTQ0LDggKzQzLDcgQEAKICAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKGFycmF5LCByb3dzKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGRvbnRhbGlnbikKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChkb250YWxpZ24pIHsKICNpZiBkZWZpbmVkIEVJR0VOX1RFU1RfUEFSVF8xIHx8IGRlZmluZWQgRUlHRU5fVEVTVF9QQVJUXzUKICAgZG9udGFsaWduKE1hdHJpeDNkKCkpOwogICBkb250YWxpZ24oTWF0cml4NGYoKSk7CmRpZmYgLS1naXQgYS90ZXN0L2R5bmFsbG9jLmNwcCBiL3Rlc3QvZHluYWxsb2MuY3BwCmluZGV4IGY3NWZmNmMuLjg3MzJmNjggMTAwNjQ0Ci0tLSBhL3Rlc3QvZHluYWxsb2MuY3BwCisrKyBiL3Rlc3QvZHluYWxsb2MuY3BwCkBAIC05LDE3MiArOSwxNjAgQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotI2lmIEVJR0VOX01BWF9BTElHTl9CWVRFUz4wCisjaWYgRUlHRU5fTUFYX0FMSUdOX0JZVEVTID4gMAogI2RlZmluZSBBTElHTk1FTlQgRUlHRU5fTUFYX0FMSUdOX0JZVEVTCiAjZWxzZQogI2RlZmluZSBBTElHTk1FTlQgMQogI2VuZGlmCiAKLXR5cGVkZWYgTWF0cml4PGZsb2F0LDE2LDE+IFZlY3RvcjE2ZjsKLXR5cGVkZWYgTWF0cml4PGZsb2F0LDgsMT4gVmVjdG9yOGY7Cit0eXBlZGVmIE1hdHJpeDxmbG9hdCwgMTYsIDE+IFZlY3RvcjE2ZjsKK3R5cGVkZWYgTWF0cml4PGZsb2F0LCA4LCAxPiBWZWN0b3I4ZjsKIAotdm9pZCBjaGVja19oYW5kbWFkZV9hbGlnbmVkX21hbGxvYygpCi17Cit2b2lkIGNoZWNrX2hhbmRtYWRlX2FsaWduZWRfbWFsbG9jKCkgewogICAvLyBIYW5kLW1ha2UgYWxpZ25tZW50IG5lZWRzIGF0IGxlYXN0IHNpemVvZih2b2lkKikgdG8gc3RvcmUgdGhlIG9mZnNldC4KLSAgY29uc3RleHByIGludCBhbGlnbm1lbnQgPSAoc3RkOjptYXg8aW50PikoRUlHRU5fREVGQVVMVF9BTElHTl9CWVRFUywgc2l6ZW9mKHZvaWQqKSk7Ci0gIAotICBmb3IoaW50IGkgPSAxOyBpIDwgMTAwMDsgaSsrKQotICB7Ci0gICAgY2hhciAqcCA9IChjaGFyKilpbnRlcm5hbDo6aGFuZG1hZGVfYWxpZ25lZF9tYWxsb2MoaSwgYWxpZ25tZW50KTsKLSAgICBWRVJJRlkoc3RkOjp1aW50cHRyX3QocCklQUxJR05NRU5UPT0wKTsKKyAgY29uc3RleHByIGludCBhbGlnbm1lbnQgPSAoc3RkOjptYXg8aW50PikoRUlHRU5fREVGQVVMVF9BTElHTl9CWVRFUywgc2l6ZW9mKHZvaWQgKikpOworCisgIGZvciAoaW50IGkgPSAxOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgY2hhciAqcCA9IChjaGFyICopaW50ZXJuYWw6OmhhbmRtYWRlX2FsaWduZWRfbWFsbG9jKGksIGFsaWdubWVudCk7CisgICAgVkVSSUZZKHN0ZDo6dWludHB0cl90KHApICUgQUxJR05NRU5UID09IDApOwogICAgIC8vIGlmIHRoZSBidWZmZXIgaXMgd3JvbmdseSBhbGxvY2F0ZWQgdGhpcyB3aWxsIGdpdmUgYSBiYWQgd3JpdGUgLS0+IGNoZWNrIHdpdGggdmFsZ3JpbmQKLSAgICBmb3IoaW50IGogPSAwOyBqIDwgaTsgaisrKSBwW2pdPTA7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHBbal0gPSAwOwogICAgIGludGVybmFsOjpoYW5kbWFkZV9hbGlnbmVkX2ZyZWUocCk7CiAgIH0KIH0KIAotdm9pZCBjaGVja19hbGlnbmVkX21hbGxvYygpCi17Ci0gIGZvcihpbnQgaSA9IEFMSUdOTUVOVDsgaSA8IDEwMDA7IGkrKykKLSAgewotICAgIGNoYXIgKnAgPSAoY2hhciopaW50ZXJuYWw6OmFsaWduZWRfbWFsbG9jKGkpOwotICAgIFZFUklGWShzdGQ6OnVpbnRwdHJfdChwKSVBTElHTk1FTlQ9PTApOwordm9pZCBjaGVja19hbGlnbmVkX21hbGxvYygpIHsKKyAgZm9yIChpbnQgaSA9IEFMSUdOTUVOVDsgaSA8IDEwMDA7IGkrKykgeworICAgIGNoYXIgKnAgPSAoY2hhciAqKWludGVybmFsOjphbGlnbmVkX21hbGxvYyhpKTsKKyAgICBWRVJJRlkoc3RkOjp1aW50cHRyX3QocCkgJSBBTElHTk1FTlQgPT0gMCk7CiAgICAgLy8gaWYgdGhlIGJ1ZmZlciBpcyB3cm9uZ2x5IGFsbG9jYXRlZCB0aGlzIHdpbGwgZ2l2ZSBhIGJhZCB3cml0ZSAtLT4gY2hlY2sgd2l0aCB2YWxncmluZAotICAgIGZvcihpbnQgaiA9IDA7IGogPCBpOyBqKyspIHBbal09MDsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgcFtqXSA9IDA7CiAgICAgaW50ZXJuYWw6OmFsaWduZWRfZnJlZShwKTsKICAgfQogfQogCi12b2lkIGNoZWNrX2FsaWduZWRfbmV3KCkKLXsKLSAgZm9yKGludCBpID0gQUxJR05NRU5UOyBpIDwgMTAwMDsgaSsrKQotICB7Cit2b2lkIGNoZWNrX2FsaWduZWRfbmV3KCkgeworICBmb3IgKGludCBpID0gQUxJR05NRU5UOyBpIDwgMTAwMDsgaSsrKSB7CiAgICAgZmxvYXQgKnAgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8ZmxvYXQ+KGkpOwotICAgIFZFUklGWShzdGQ6OnVpbnRwdHJfdChwKSVBTElHTk1FTlQ9PTApOworICAgIFZFUklGWShzdGQ6OnVpbnRwdHJfdChwKSAlIEFMSUdOTUVOVCA9PSAwKTsKICAgICAvLyBpZiB0aGUgYnVmZmVyIGlzIHdyb25nbHkgYWxsb2NhdGVkIHRoaXMgd2lsbCBnaXZlIGEgYmFkIHdyaXRlIC0tPiBjaGVjayB3aXRoIHZhbGdyaW5kCi0gICAgZm9yKGludCBqID0gMDsgaiA8IGk7IGorKykgcFtqXT0wOwotICAgIGludGVybmFsOjphbGlnbmVkX2RlbGV0ZShwLGkpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSBwW2pdID0gMDsKKyAgICBpbnRlcm5hbDo6YWxpZ25lZF9kZWxldGUocCwgaSk7CiAgIH0KIH0KIAotdm9pZCBjaGVja19hbGlnbmVkX3N0YWNrX2FsbG9jKCkKLXsKLSAgZm9yKGludCBpID0gQUxJR05NRU5UOyBpIDwgNDAwOyBpKyspCi0gIHsKLSAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoZmxvYXQscCxpLDApOwotICAgIFZFUklGWShzdGQ6OnVpbnRwdHJfdChwKSVBTElHTk1FTlQ9PTApOwordm9pZCBjaGVja19hbGlnbmVkX3N0YWNrX2FsbG9jKCkgeworICBmb3IgKGludCBpID0gQUxJR05NRU5UOyBpIDwgNDAwOyBpKyspIHsKKyAgICBlaV9kZWNsYXJlX2FsaWduZWRfc3RhY2tfY29uc3RydWN0ZWRfdmFyaWFibGUoZmxvYXQsIHAsIGksIDApOworICAgIFZFUklGWShzdGQ6OnVpbnRwdHJfdChwKSAlIEFMSUdOTUVOVCA9PSAwKTsKICAgICAvLyBpZiB0aGUgYnVmZmVyIGlzIHdyb25nbHkgYWxsb2NhdGVkIHRoaXMgd2lsbCBnaXZlIGEgYmFkIHdyaXRlIC0tPiBjaGVjayB3aXRoIHZhbGdyaW5kCi0gICAgZm9yKGludCBqID0gMDsgaiA8IGk7IGorKykgcFtqXT0wOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSBwW2pdID0gMDsKICAgfQogfQogCi0KIC8vIHRlc3QgY29tcGlsYXRpb24gd2l0aCBib3RoIGEgc3RydWN0IGFuZCBhIGNsYXNzLi4uCi1zdHJ1Y3QgTXlTdHJ1Y3QKLXsKK3N0cnVjdCBNeVN0cnVjdCB7CiAgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcKICAgY2hhciBkdW1teWNoYXI7CiAgIFZlY3RvcjE2ZiBhdmVjOwogfTsKIAotY2xhc3MgTXlDbGFzc0EKLXsKLSAgcHVibGljOgotICAgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcKLSAgICBjaGFyIGR1bW15Y2hhcjsKLSAgICBWZWN0b3IxNmYgYXZlYzsKK2NsYXNzIE15Q2xhc3NBIHsKKyBwdWJsaWM6CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVcKKyAgY2hhciBkdW1teWNoYXI7CisgIFZlY3RvcjE2ZiBhdmVjOwogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBjaGVja19keW5hbGlnbmVkKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBjaGVja19keW5hbGlnbmVkKCkgewogICAvLyBUT0RPIGhhdmUgdG8gYmUgdXBkYXRlZCBvbmNlIHdlIHN1cHBvcnQgbXVsdGlwbGUgYWxpZ25tZW50IHZhbHVlcwotICBpZihUOjpTaXplQXRDb21waWxlVGltZSAlIEFMSUdOTUVOVCA9PSAwKQotICB7Ci0gICAgVCogb2JqID0gbmV3IFQ7Ci0gICAgVkVSSUZZKFQ6Ok5lZWRzVG9BbGlnbj09MSk7Ci0gICAgVkVSSUZZKHN0ZDo6dWludHB0cl90KG9iaiklQUxJR05NRU5UPT0wKTsKKyAgaWYgKFQ6OlNpemVBdENvbXBpbGVUaW1lICUgQUxJR05NRU5UID09IDApIHsKKyAgICBUICpvYmogPSBuZXcgVDsKKyAgICBWRVJJRlkoVDo6TmVlZHNUb0FsaWduID09IDEpOworICAgIFZFUklGWShzdGQ6OnVpbnRwdHJfdChvYmopICUgQUxJR05NRU5UID09IDApOwogICAgIGRlbGV0ZSBvYmo7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBjaGVja19jdXN0b21fbmV3X2RlbGV0ZSgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgY2hlY2tfY3VzdG9tX25ld19kZWxldGUoKSB7CiAgIHsKLSAgICBUKiB0ID0gbmV3IFQ7CisgICAgVCAqdCA9IG5ldyBUOwogICAgIGRlbGV0ZSB0OwogICB9Ci0gIAorCiAgIHsKLSAgICBzdGQ6OnNpemVfdCBOID0gaW50ZXJuYWw6OnJhbmRvbTxzdGQ6OnNpemVfdD4oMSwxMCk7Ci0gICAgVCogdCA9IG5ldyBUW05dOworICAgIHN0ZDo6c2l6ZV90IE4gPSBpbnRlcm5hbDo6cmFuZG9tPHN0ZDo6c2l6ZV90PigxLCAxMCk7CisgICAgVCAqdCA9IG5ldyBUW05dOwogICAgIGRlbGV0ZVtdIHQ7CiAgIH0KLSAgCi0jaWYgRUlHRU5fTUFYX0FMSUdOX0JZVEVTPjAgJiYgKCFFSUdFTl9IQVNfQ1hYMTdfT1ZFUkFMSUdOKQorCisjaWYgRUlHRU5fTUFYX0FMSUdOX0JZVEVTID4gMCAmJiAoIUVJR0VOX0hBU19DWFgxN19PVkVSQUxJR04pCiAgIHsKLSAgICBUKiB0ID0gc3RhdGljX2Nhc3Q8VCAqPigoVDo6b3BlcmF0b3IgbmV3KShzaXplb2YoVCkpKTsKKyAgICBUICp0ID0gc3RhdGljX2Nhc3Q8VCAqPigoVDo6b3BlcmF0b3IgbmV3KShzaXplb2YoVCkpKTsKICAgICAoVDo6b3BlcmF0b3IgZGVsZXRlKSh0LCBzaXplb2YoVCkpOwogICB9Ci0gIAorCiAgIHsKLSAgICBUKiB0ID0gc3RhdGljX2Nhc3Q8VCAqPigoVDo6b3BlcmF0b3IgbmV3KShzaXplb2YoVCkpKTsKKyAgICBUICp0ID0gc3RhdGljX2Nhc3Q8VCAqPigoVDo6b3BlcmF0b3IgbmV3KShzaXplb2YoVCkpKTsKICAgICAoVDo6b3BlcmF0b3IgZGVsZXRlKSh0KTsKICAgfQogI2VuZGlmCiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChkeW5hbGxvYykKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChkeW5hbGxvYykgewogICAvLyBsb3cgbGV2ZWwgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbgogICBDQUxMX1NVQlRFU1QoY2hlY2tfaGFuZG1hZGVfYWxpZ25lZF9tYWxsb2MoKSk7CiAgIENBTExfU1VCVEVTVChjaGVja19hbGlnbmVkX21hbGxvYygpKTsKICAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsaWduZWRfbmV3KCkpOwogICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxpZ25lZF9zdGFja19hbGxvYygpKTsKIAotICBmb3IgKGludCBpPTA7IGk8Z19yZXBlYXQqMTAwOyArK2kpCi0gIHsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2N1c3RvbV9uZXdfZGVsZXRlPFZlY3RvcjRmPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19jdXN0b21fbmV3X2RlbGV0ZTxWZWN0b3IyZj4oKSApOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfY3VzdG9tX25ld19kZWxldGU8TWF0cml4NGY+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2N1c3RvbV9uZXdfZGVsZXRlPE1hdHJpeFhpPigpICk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQgKiAxMDA7ICsraSkgeworICAgIENBTExfU1VCVEVTVChjaGVja19jdXN0b21fbmV3X2RlbGV0ZTxWZWN0b3I0Zj4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2N1c3RvbV9uZXdfZGVsZXRlPFZlY3RvcjJmPigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfY3VzdG9tX25ld19kZWxldGU8TWF0cml4NGY+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19jdXN0b21fbmV3X2RlbGV0ZTxNYXRyaXhYaT4oKSk7CiAgIH0KLSAgCi0gIC8vIGNoZWNrIHN0YXRpYyBhbGxvY2F0aW9uLCB3aG8ga25vd3MgPwotICAjaWYgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUwotICBmb3IgKGludCBpPTA7IGk8Z19yZXBlYXQqMTAwOyArK2kpCi0gIHsKLSAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZHluYWxpZ25lZDxWZWN0b3I0Zj4oKSApOwotICAgIENBTExfU1VCVEVTVChjaGVja19keW5hbGlnbmVkPFZlY3RvcjJkPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUKGNoZWNrX2R5bmFsaWduZWQ8TWF0cml4NGY+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZHluYWxpZ25lZDxWZWN0b3I0ZD4oKSApOwotICAgIENBTExfU1VCVEVTVChjaGVja19keW5hbGlnbmVkPFZlY3RvcjRpPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUKGNoZWNrX2R5bmFsaWduZWQ8VmVjdG9yOGY+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZHluYWxpZ25lZDxWZWN0b3IxNmY+KCkgKTsKKworLy8gY2hlY2sgc3RhdGljIGFsbG9jYXRpb24sIHdobyBrbm93cyA/CisjaWYgRUlHRU5fTUFYX1NUQVRJQ19BTElHTl9CWVRFUworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0ICogMTAwOyArK2kpIHsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZHluYWxpZ25lZDxWZWN0b3I0Zj4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2R5bmFsaWduZWQ8VmVjdG9yMmQ+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19keW5hbGlnbmVkPE1hdHJpeDRmPigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZHluYWxpZ25lZDxWZWN0b3I0ZD4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2R5bmFsaWduZWQ8VmVjdG9yNGk+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19keW5hbGlnbmVkPFZlY3RvcjhmPigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZHluYWxpZ25lZDxWZWN0b3IxNmY+KCkpOwogICB9CiAKICAgewotICAgIE15U3RydWN0IGZvbzA7ICBWRVJJRlkoc3RkOjp1aW50cHRyX3QoZm9vMC5hdmVjLmRhdGEoKSklQUxJR05NRU5UPT0wKTsKLSAgICBNeUNsYXNzQSBmb29BOyAgVkVSSUZZKHN0ZDo6dWludHB0cl90KGZvb0EuYXZlYy5kYXRhKCkpJUFMSUdOTUVOVD09MCk7CisgICAgTXlTdHJ1Y3QgZm9vMDsKKyAgICBWRVJJRlkoc3RkOjp1aW50cHRyX3QoZm9vMC5hdmVjLmRhdGEoKSkgJSBBTElHTk1FTlQgPT0gMCk7CisgICAgTXlDbGFzc0EgZm9vQTsKKyAgICBWRVJJRlkoc3RkOjp1aW50cHRyX3QoZm9vQS5hdmVjLmRhdGEoKSkgJSBBTElHTk1FTlQgPT0gMCk7CiAgIH0KLSAgCisKICAgLy8gZHluYW1pYyBhbGxvY2F0aW9uLCBzaW5nbGUgb2JqZWN0Ci0gIGZvciAoaW50IGk9MDsgaTxnX3JlcGVhdCoxMDA7ICsraSkKLSAgewotICAgIE15U3RydWN0ICpmb28wID0gbmV3IE15U3RydWN0KCk7ICBWRVJJRlkoc3RkOjp1aW50cHRyX3QoZm9vMC0+YXZlYy5kYXRhKCkpJUFMSUdOTUVOVD09MCk7Ci0gICAgTXlDbGFzc0EgKmZvb0EgPSBuZXcgTXlDbGFzc0EoKTsgIFZFUklGWShzdGQ6OnVpbnRwdHJfdChmb29BLT5hdmVjLmRhdGEoKSklQUxJR05NRU5UPT0wKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdCAqIDEwMDsgKytpKSB7CisgICAgTXlTdHJ1Y3QgKmZvbzAgPSBuZXcgTXlTdHJ1Y3QoKTsKKyAgICBWRVJJRlkoc3RkOjp1aW50cHRyX3QoZm9vMC0+YXZlYy5kYXRhKCkpICUgQUxJR05NRU5UID09IDApOworICAgIE15Q2xhc3NBICpmb29BID0gbmV3IE15Q2xhc3NBKCk7CisgICAgVkVSSUZZKHN0ZDo6dWludHB0cl90KGZvb0EtPmF2ZWMuZGF0YSgpKSAlIEFMSUdOTUVOVCA9PSAwKTsKICAgICBkZWxldGUgZm9vMDsKICAgICBkZWxldGUgZm9vQTsKICAgfQogCiAgIC8vIGR5bmFtaWMgYWxsb2NhdGlvbiwgYXJyYXkKICAgY29uc3QgaW50IE4gPSAxMDsKLSAgZm9yIChpbnQgaT0wOyBpPGdfcmVwZWF0KjEwMDsgKytpKQotICB7Ci0gICAgTXlTdHJ1Y3QgKmZvbzAgPSBuZXcgTXlTdHJ1Y3RbTl07ICBWRVJJRlkoc3RkOjp1aW50cHRyX3QoZm9vMC0+YXZlYy5kYXRhKCkpJUFMSUdOTUVOVD09MCk7Ci0gICAgTXlDbGFzc0EgKmZvb0EgPSBuZXcgTXlDbGFzc0FbTl07ICBWRVJJRlkoc3RkOjp1aW50cHRyX3QoZm9vQS0+YXZlYy5kYXRhKCkpJUFMSUdOTUVOVD09MCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQgKiAxMDA7ICsraSkgeworICAgIE15U3RydWN0ICpmb28wID0gbmV3IE15U3RydWN0W05dOworICAgIFZFUklGWShzdGQ6OnVpbnRwdHJfdChmb28wLT5hdmVjLmRhdGEoKSkgJSBBTElHTk1FTlQgPT0gMCk7CisgICAgTXlDbGFzc0EgKmZvb0EgPSBuZXcgTXlDbGFzc0FbTl07CisgICAgVkVSSUZZKHN0ZDo6dWludHB0cl90KGZvb0EtPmF2ZWMuZGF0YSgpKSAlIEFMSUdOTUVOVCA9PSAwKTsKICAgICBkZWxldGVbXSBmb28wOwogICAgIGRlbGV0ZVtdIGZvb0E7CiAgIH0KLSAgI2VuZGlmCi0gIAorI2VuZGlmCiB9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2VuMnN1cHBvcnQuY3BwIGIvdGVzdC9laWdlbjJzdXBwb3J0LmNwcAppbmRleCA0OWQ3MzI4Li44NzgzNTJiIDEwMDY0NAotLS0gYS90ZXN0L2VpZ2VuMnN1cHBvcnQuY3BwCisrKyBiL3Rlc3QvZWlnZW4yc3VwcG9ydC5jcHAKQEAgLTExLDIzICsxMSwyMSBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGVpZ2VuMnN1cHBvcnQoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBlaWdlbjJzdXBwb3J0KGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogCiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwogCi0gIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTMocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMpOwogCi0gIFNjYWxhciAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKLSAgICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKIAogICAvLyBzY2FsYXIgYWRkaXRpb24KICAgVkVSSUZZX0lTX0FQUFJPWChtMS5jd2lzZSgpICsgczEsIHMxICsgbTEuY3dpc2UoKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2UoKSArIHMxLCBNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLGNvbHMsczEpICsgbTEpOwotICBWRVJJRllfSVNfQVBQUk9YKChtMSpTY2FsYXIoMikpLmN3aXNlKCkgLSBzMiwgKG0xK20xKSAtIE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxzMikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5jd2lzZSgpICsgczEsIE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsIGNvbHMsIHMxKSArIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEgKiBTY2FsYXIoMikpLmN3aXNlKCkgLSBzMiwgKG0xICsgbTEpIC0gTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgczIpKTsKICAgbTMgPSBtMTsKICAgbTMuY3dpc2UoKSArPSBzMjsKICAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEuY3dpc2UoKSArIHMyKTsKQEAgLTM1LDMxICszMywzMCBAQAogICBtMy5jd2lzZSgpIC09IHMxOwogICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMS5jd2lzZSgpIC0gczEpOwogCi0gIFZFUklGWV9JU19FUVVBTCgobTEuY29ybmVyKFRvcExlZnQsMSwxKSksIChtMS5ibG9jaygwLDAsMSwxKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKG0xLnRlbXBsYXRlIGNvcm5lcjwxLDE+KFRvcExlZnQpKSwgKG0xLnRlbXBsYXRlIGJsb2NrPDEsMT4oMCwwKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKG0xLmNvbCgwKS5zdGFydCgxKSksIChtMS5jb2woMCkuc2VnbWVudCgwLDEpKSk7Ci0gIFZFUklGWV9JU19FUVVBTCgobTEuY29sKDApLnRlbXBsYXRlIHN0YXJ0PDE+KCkpLCAobTEuY29sKDApLnNlZ21lbnQoMCwxKSkpOwotICBWRVJJRllfSVNfRVFVQUwoKG0xLmNvbCgwKS5lbmQoMSkpLCAobTEuY29sKDApLnNlZ21lbnQocm93cy0xLDEpKSk7Ci0gIFZFUklGWV9JU19FUVVBTCgobTEuY29sKDApLnRlbXBsYXRlIGVuZDwxPigpKSwgKG0xLmNvbCgwKS5zZWdtZW50KHJvd3MtMSwxKSkpOwotICAKLSAgdXNpbmcgc3RkOjpjb3M7Ci0gIHVzaW5nIG51bWV4dDo6cmVhbDsKKyAgVkVSSUZZX0lTX0VRVUFMKChtMS5jb3JuZXIoVG9wTGVmdCwgMSwgMSkpLCAobTEuYmxvY2soMCwgMCwgMSwgMSkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtMS50ZW1wbGF0ZSBjb3JuZXI8MSwgMT4oVG9wTGVmdCkpLCAobTEudGVtcGxhdGUgYmxvY2s8MSwgMT4oMCwgMCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtMS5jb2woMCkuc3RhcnQoMSkpLCAobTEuY29sKDApLnNlZ21lbnQoMCwgMSkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtMS5jb2woMCkudGVtcGxhdGUgc3RhcnQ8MT4oKSksIChtMS5jb2woMCkuc2VnbWVudCgwLCAxKSkpOworICBWRVJJRllfSVNfRVFVQUwoKG0xLmNvbCgwKS5lbmQoMSkpLCAobTEuY29sKDApLnNlZ21lbnQocm93cyAtIDEsIDEpKSk7CisgIFZFUklGWV9JU19FUVVBTCgobTEuY29sKDApLnRlbXBsYXRlIGVuZDwxPigpKSwgKG0xLmNvbCgwKS5zZWdtZW50KHJvd3MgLSAxLCAxKSkpOworCiAgIHVzaW5nIG51bWV4dDo6YWJzMjsKKyAgdXNpbmcgbnVtZXh0OjpyZWFsOworICB1c2luZyBzdGQ6OmNvczsKICAgVkVSSUZZX0lTX0VRVUFMKGVpX2NvcyhzMSksIGNvcyhzMSkpOwogICBWRVJJRllfSVNfRVFVQUwoZWlfcmVhbChzMSksIHJlYWwoczEpKTsKICAgVkVSSUZZX0lTX0VRVUFMKGVpX2FiczIoczEpLCBhYnMyKHMxKSk7CiAKLSAgbTEubWlub3IoMCwwKTsKKyAgbTEubWlub3IoMCwgMCk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChlaWdlbjJzdXBwb3J0KQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBlaWdlbjJzdXBwb3J0KE1hdHJpeDxkb3VibGUsMSwxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBlaWdlbjJzdXBwb3J0KE1hdHJpeFhkKDEsMSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIGVpZ2VuMnN1cHBvcnQoTWF0cml4M2YoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggZWlnZW4yc3VwcG9ydChNYXRyaXg0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBlaWdlbjJzdXBwb3J0KE1hdHJpeFhmKDIwMCwyMDApKSApOwotICAgIENBTExfU1VCVEVTVF82KCBlaWdlbjJzdXBwb3J0KE1hdHJpeFhjZCgxMDAsMTAwKSkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChlaWdlbjJzdXBwb3J0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKGVpZ2VuMnN1cHBvcnQoTWF0cml4PGRvdWJsZSwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKGVpZ2VuMnN1cHBvcnQoTWF0cml4WGQoMSwgMSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChlaWdlbjJzdXBwb3J0KE1hdHJpeDNmKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShlaWdlbjJzdXBwb3J0KE1hdHJpeDRkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihlaWdlbjJzdXBwb3J0KE1hdHJpeFhmKDIwMCwgMjAwKSkpOworICAgIENBTExfU1VCVEVTVF82KGVpZ2VuMnN1cHBvcnQoTWF0cml4WGNkKDEwMCwgMTAwKSkpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2Vuc29sdmVyX2NvbXBsZXguY3BwIGIvdGVzdC9laWdlbnNvbHZlcl9jb21wbGV4LmNwcAppbmRleCBjNTM3M2Y0Li42N2FmZjRiIDEwMDY0NAotLS0gYS90ZXN0L2VpZ2Vuc29sdmVyX2NvbXBsZXguY3BwCisrKyBiL3Rlc3QvZWlnZW5zb2x2ZXJfY29tcGxleC5jcHAKQEAgLTEzLDM1ICsxMywzMCBAQAogI2luY2x1ZGUgPEVpZ2VuL0VpZ2VudmFsdWVzPgogI2luY2x1ZGUgPEVpZ2VuL0xVPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiBib29sIGZpbmRfcGl2b3QodHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIHRvbCwgTWF0cml4VHlwZSAmZGlmZnMsIEluZGV4IGNvbD0wKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Citib29sIGZpbmRfcGl2b3QodHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIHRvbCwgTWF0cml4VHlwZSYgZGlmZnMsIEluZGV4IGNvbCA9IDApIHsKICAgYm9vbCBtYXRjaCA9IGRpZmZzLmRpYWdvbmFsKCkuc3VtKCkgPD0gdG9sOwotICBpZihtYXRjaCB8fCBjb2w9PWRpZmZzLmNvbHMoKSkKLSAgeworICBpZiAobWF0Y2ggfHwgY29sID09IGRpZmZzLmNvbHMoKSkgewogICAgIHJldHVybiBtYXRjaDsKLSAgfQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICBJbmRleCBuID0gZGlmZnMuY29scygpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxJbmRleCxJbmRleD4gPiB0cmFuc3Bvc2l0aW9uczsKLSAgICBmb3IoSW5kZXggaT1jb2w7IGk8bjsgKytpKQotICAgIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8SW5kZXgsIEluZGV4PiA+IHRyYW5zcG9zaXRpb25zOworICAgIGZvciAoSW5kZXggaSA9IGNvbDsgaSA8IG47ICsraSkgewogICAgICAgSW5kZXggYmVzdF9pbmRleCgwKTsKLSAgICAgIGlmKGRpZmZzLmNvbChjb2wpLnNlZ21lbnQoY29sLG4taSkubWluQ29lZmYoJmJlc3RfaW5kZXgpID4gdG9sKQotICAgICAgICBicmVhazsKLSAgICAgIAorICAgICAgaWYgKGRpZmZzLmNvbChjb2wpLnNlZ21lbnQoY29sLCBuIC0gaSkubWluQ29lZmYoJmJlc3RfaW5kZXgpID4gdG9sKSBicmVhazsKKwogICAgICAgYmVzdF9pbmRleCArPSBjb2w7Ci0gICAgICAKKwogICAgICAgZGlmZnMucm93KGNvbCkuc3dhcChkaWZmcy5yb3coYmVzdF9pbmRleCkpOwotICAgICAgaWYoZmluZF9waXZvdCh0b2wsZGlmZnMsY29sKzEpKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChmaW5kX3Bpdm90KHRvbCwgZGlmZnMsIGNvbCArIDEpKSByZXR1cm4gdHJ1ZTsKICAgICAgIGRpZmZzLnJvdyhjb2wpLnN3YXAoZGlmZnMucm93KGJlc3RfaW5kZXgpKTsKLSAgICAgIAorCiAgICAgICAvLyBtb3ZlIGN1cnJlbnQgcGl2b3QgdG8gdGhlIGVuZAotICAgICAgZGlmZnMucm93KG4tKGktY29sKS0xKS5zd2FwKGRpZmZzLnJvdyhiZXN0X2luZGV4KSk7Ci0gICAgICB0cmFuc3Bvc2l0aW9ucy5wdXNoX2JhY2soc3RkOjpwYWlyPEluZGV4LEluZGV4PihuLShpLWNvbCktMSxiZXN0X2luZGV4KSk7CisgICAgICBkaWZmcy5yb3cobiAtIChpIC0gY29sKSAtIDEpLnN3YXAoZGlmZnMucm93KGJlc3RfaW5kZXgpKTsKKyAgICAgIHRyYW5zcG9zaXRpb25zLnB1c2hfYmFjayhzdGQ6OnBhaXI8SW5kZXgsIEluZGV4PihuIC0gKGkgLSBjb2wpIC0gMSwgYmVzdF9pbmRleCkpOwogICAgIH0KICAgICAvLyByZXN0b3JlCi0gICAgZm9yKEluZGV4IGs9dHJhbnNwb3NpdGlvbnMuc2l6ZSgpLTE7IGs+PTA7IC0taykKKyAgICBmb3IgKEluZGV4IGsgPSB0cmFuc3Bvc2l0aW9ucy5zaXplKCkgLSAxOyBrID49IDA7IC0taykKICAgICAgIGRpZmZzLnJvdyh0cmFuc3Bvc2l0aW9uc1trXS5maXJzdCkuc3dhcChkaWZmcy5yb3codHJhbnNwb3NpdGlvbnNba10uc2Vjb25kKSk7CiAgIH0KICAgcmV0dXJuIGZhbHNlOwpAQCAtNTEsMjYgKzQ2LDI2IEBACiAgKiBJbml0aWFsbHksIHRoaXMgbWV0aG9kIGNoZWNrZWQgdGhhdCB0aGUgay10aCBwb3dlciBzdW1zIGFyZSBlcXVhbCBmb3IgYWxsIGsgPSAxLCAuLi4sIHZlYzEucm93cygpLAogICogaG93ZXZlciB0aGlzIHN0cmF0ZWd5IGlzIG51bWVyaWNhbGx5IGluYWN1cmF0ZSBiZWNhdXNlIG9mIG51bWVyaWNhbCBjYW5jZWxsYXRpb24gaXNzdWVzLgogICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgotdm9pZCB2ZXJpZnlfaXNfYXBwcm94X3VwdG9fcGVybXV0YXRpb24oY29uc3QgVmVjdG9yVHlwZSYgdmVjMSwgY29uc3QgVmVjdG9yVHlwZSYgdmVjMikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCB2ZXJpZnlfaXNfYXBwcm94X3VwdG9fcGVybXV0YXRpb24oY29uc3QgVmVjdG9yVHlwZSYgdmVjMSwgY29uc3QgVmVjdG9yVHlwZSYgdmVjMikgewogICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKIAogICBWRVJJRlkodmVjMS5jb2xzKCkgPT0gMSk7CiAgIFZFUklGWSh2ZWMyLmNvbHMoKSA9PSAxKTsKICAgVkVSSUZZKHZlYzEucm93cygpID09IHZlYzIucm93cygpKTsKLSAgCisKICAgSW5kZXggbiA9IHZlYzEucm93cygpOwotICBSZWFsU2NhbGFyIHRvbCA9IHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCkqdGVzdF9wcmVjaXNpb248UmVhbFNjYWxhcj4oKSpudW1leHQ6Om1heGkodmVjMS5zcXVhcmVkTm9ybSgpLHZlYzIuc3F1YXJlZE5vcm0oKSk7Ci0gIE1hdHJpeDxSZWFsU2NhbGFyLER5bmFtaWMsRHluYW1pYz4gZGlmZnMgPSAodmVjMS5yb3d3aXNlKCkucmVwbGljYXRlKG4pIC0gdmVjMi5yb3d3aXNlKCkucmVwbGljYXRlKG4pLnRyYW5zcG9zZSgpKS5jd2lzZUFiczIoKTsKLSAgCi0gIFZFUklGWSggZmluZF9waXZvdCh0b2wsIGRpZmZzKSApOworICBSZWFsU2NhbGFyIHRvbCA9IHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCkgKiB0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpICoKKyAgICAgICAgICAgICAgICAgICBudW1leHQ6Om1heGkodmVjMS5zcXVhcmVkTm9ybSgpLCB2ZWMyLnNxdWFyZWROb3JtKCkpOworICBNYXRyaXg8UmVhbFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gZGlmZnMgPQorICAgICAgKHZlYzEucm93d2lzZSgpLnJlcGxpY2F0ZShuKSAtIHZlYzIucm93d2lzZSgpLnJlcGxpY2F0ZShuKS50cmFuc3Bvc2UoKSkuY3dpc2VBYnMyKCk7CisKKyAgVkVSSUZZKGZpbmRfcGl2b3QodG9sLCBkaWZmcykpOwogfQogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgZWlnZW5zb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBlaWdlbnNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgQ29tcGxleEVpZ2VuU29sdmVyLmgsIGFuZCBpbmRpcmVjdGx5IENvbXBsZXhTY2h1ci5oCiAgICovCkBAIC04MCw4ICs3NSw4IEBACiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOwogCi0gIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICBNYXRyaXhUeXBlIHN5bW1BID0gIGEuYWRqb2ludCgpICogYTsKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICBNYXRyaXhUeXBlIHN5bW1BID0gYS5hZGpvaW50KCkgKiBhOwogCiAgIENvbXBsZXhFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaTAoc3ltbUEpOwogICBWRVJJRllfSVNfRVFVQUwoZWkwLmluZm8oKSwgU3VjY2Vzcyk7CkBAIC0xMTAsMTcgKzEwNSwxNiBAQAogICBWRVJJRllfSVNfQVBQUk9YKGVpMS5laWdlbnZhbHVlcygpLCBlaU5vRWl2ZWNzLmVpZ2VudmFsdWVzKCkpOwogCiAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaXNzdWUgIzY2Ci0gIE1hdHJpeFR5cGUgeiA9IE1hdHJpeFR5cGU6Olplcm8ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSB6ID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKTsKICAgQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpeih6KTsKICAgVkVSSUZZKChlaXouZWlnZW52YWx1ZXMoKS5jd2lzZUVxdWFsKDApKS5hbGwoKSk7CiAKICAgTWF0cml4VHlwZSBpZCA9IE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIGNvbHMpOwogICBWRVJJRllfSVNfQVBQUk9YKGlkLm9wZXJhdG9yTm9ybSgpLCBSZWFsU2NhbGFyKDEpKTsKIAotICBpZiAocm93cyA+IDEgJiYgcm93cyA8IDIwKQotICB7CisgIGlmIChyb3dzID4gMSAmJiByb3dzIDwgMjApIHsKICAgICAvLyBUZXN0IG1hdHJpeCB3aXRoIE5hTgotICAgIGEoMCwwKSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhcj46OnF1aWV0X05hTigpOworICAgIGEoMCwgMCkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXI+OjpxdWlldF9OYU4oKTsKICAgICBDb21wbGV4RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlOYU4oYSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKGVpTmFOLmluZm8oKSwgTm9Db252ZXJnZW5jZSk7CiAgIH0KQEAgLTEzNiw0MSArMTMwLDQwIEBACiAgICAgYS5zZXRaZXJvKCk7CiAgICAgQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpMyhhKTsKICAgICBWRVJJRllfSVNfRVFVQUwoZWkzLmluZm8oKSwgU3VjY2Vzcyk7Ci0gICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGVpMy5laWdlbnZhbHVlcygpLm5vcm0oKSxSZWFsU2NhbGFyKDEpKTsKLSAgICBWRVJJRlkoKGVpMy5laWdlbnZlY3RvcnMoKS50cmFuc3Bvc2UoKSplaTMuZWlnZW52ZWN0b3JzKCkudHJhbnNwb3NlKCkpLmV2YWwoKS5pc0lkZW50aXR5KCkpOworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihlaTMuZWlnZW52YWx1ZXMoKS5ub3JtKCksIFJlYWxTY2FsYXIoMSkpOworICAgIFZFUklGWSgoZWkzLmVpZ2VudmVjdG9ycygpLnRyYW5zcG9zZSgpICogZWkzLmVpZ2VudmVjdG9ycygpLnRyYW5zcG9zZSgpKS5ldmFsKCkuaXNJZGVudGl0eSgpKTsKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGVpZ2Vuc29sdmVyX3ZlcmlmeV9hc3NlcnQoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBlaWdlbnNvbHZlcl92ZXJpZnlfYXNzZXJ0KGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpZzsKICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmVpZ2VudmVjdG9ycygpKTsKICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmVpZ2VudmFsdWVzKCkpOwogCi0gIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShtLnJvd3MoKSxtLmNvbHMoKSk7CisgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShtLnJvd3MoKSwgbS5jb2xzKCkpOwogICBlaWcuY29tcHV0ZShhLCBmYWxzZSk7CiAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5laWdlbnZlY3RvcnMoKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChlaWdlbnNvbHZlcl9jb21wbGV4KQoteworRUlHRU5fREVDTEFSRV9URVNUKGVpZ2Vuc29sdmVyX2NvbXBsZXgpIHsKICAgaW50IHMgPSAwOwotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBlaWdlbnNvbHZlcihNYXRyaXg0Y2YoKSkgKTsKLSAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS80KTsKLSAgICBDQUxMX1NVQlRFU1RfMiggZWlnZW5zb2x2ZXIoTWF0cml4WGNkKHMscykpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGVpZ2Vuc29sdmVyKE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBlaWdlbnNvbHZlcihNYXRyaXgzZigpKSApOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShlaWdlbnNvbHZlcihNYXRyaXg0Y2YoKSkpOworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDQpOworICAgIENBTExfU1VCVEVTVF8yKGVpZ2Vuc29sdmVyKE1hdHJpeFhjZChzLCBzKSkpOworICAgIENBTExfU1VCVEVTVF8zKGVpZ2Vuc29sdmVyKE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoZWlnZW5zb2x2ZXIoTWF0cml4M2YoKSkpOwogICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKICAgfQotICBDQUxMX1NVQlRFU1RfMSggZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXg0Y2YoKSkgKTsKLSAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvNCk7Ci0gIENBTExfU1VCVEVTVF8yKCBlaWdlbnNvbHZlcl92ZXJpZnlfYXNzZXJ0KE1hdHJpeFhjZChzLHMpKSApOwotICBDQUxMX1NVQlRFU1RfMyggZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgMSwgMT4oKSkgKTsKLSAgQ0FMTF9TVUJURVNUXzQoIGVpZ2Vuc29sdmVyX3ZlcmlmeV9hc3NlcnQoTWF0cml4M2YoKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzEoZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXg0Y2YoKSkpOworICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyA0KTsKKyAgQ0FMTF9TVUJURVNUXzIoZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXhYY2QocywgcykpKTsKKyAgQ0FMTF9TVUJURVNUXzMoZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgMSwgMT4oKSkpOworICBDQUxMX1NVQlRFU1RfNChlaWdlbnNvbHZlcl92ZXJpZnlfYXNzZXJ0KE1hdHJpeDNmKCkpKTsKIAogICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKICAgQ0FMTF9TVUJURVNUXzUoQ29tcGxleEVpZ2VuU29sdmVyPE1hdHJpeFhmPiB0bXAocykpOwotICAKKwogICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCiB9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2Vuc29sdmVyX2dlbmVyYWxpemVkX3JlYWwuY3BwIGIvdGVzdC9laWdlbnNvbHZlcl9nZW5lcmFsaXplZF9yZWFsLmNwcAppbmRleCBhMGM5OWIxLi5lYjNmODg0IDEwMDY0NAotLS0gYS90ZXN0L2VpZ2Vuc29sdmVyX2dlbmVyYWxpemVkX3JlYWwuY3BwCisrKyBiL3Rlc3QvZWlnZW5zb2x2ZXJfZ2VuZXJhbGl6ZWRfcmVhbC5jcHAKQEAgLTEzLDggKzEzLDggQEAKICNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KICNpbmNsdWRlIDxFaWdlbi9MVT4KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBnZW5lcmFsaXplZF9laWdlbnNvbHZlcl9yZWFsKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgZ2VuZXJhbGl6ZWRfZWlnZW5zb2x2ZXJfcmVhbChjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgR2VuZXJhbGl6ZWRFaWdlblNvbHZlci5oCiAgICovCkBAIC0yNSwxMiArMjUsMTIgQEAKICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8U2NhbGFyPiBDb21wbGV4U2NhbGFyOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOwogCi0gIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICBNYXRyaXhUeXBlIGIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKLSAgTWF0cml4VHlwZSBhMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICBNYXRyaXhUeXBlIGIxID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7Ci0gIE1hdHJpeFR5cGUgc3BkQSA9ICBhLmFkam9pbnQoKSAqIGEgKyBhMS5hZGpvaW50KCkgKiBhMTsKLSAgTWF0cml4VHlwZSBzcGRCID0gIGIuYWRqb2ludCgpICogYiArIGIxLmFkam9pbnQoKSAqIGIxOworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgYiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgTWF0cml4VHlwZSBhMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgTWF0cml4VHlwZSBiMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgTWF0cml4VHlwZSBzcGRBID0gYS5hZGpvaW50KCkgKiBhICsgYTEuYWRqb2ludCgpICogYTE7CisgIE1hdHJpeFR5cGUgc3BkQiA9IGIuYWRqb2ludCgpICogYiArIGIxLmFkam9pbnQoKSAqIGIxOwogCiAgIC8vIGxldHMgY29tcGFyZSB0byBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXIKICAgewpAQCAtNDAsNDEgKzQwLDQxIEBACiAgICAgVkVSSUZZX0lTX0VRVUFMKGVpZy5laWdlbnZhbHVlcygpLmltYWcoKS5jd2lzZUFicygpLm1heENvZWZmKCksIDApOwogCiAgICAgVmVjdG9yVHlwZSByZWFsRWlnZW52YWx1ZXMgPSBlaWcuZWlnZW52YWx1ZXMoKS5yZWFsKCk7Ci0gICAgc3RkOjpzb3J0KHJlYWxFaWdlbnZhbHVlcy5kYXRhKCksIHJlYWxFaWdlbnZhbHVlcy5kYXRhKCkrcmVhbEVpZ2VudmFsdWVzLnNpemUoKSk7CisgICAgc3RkOjpzb3J0KHJlYWxFaWdlbnZhbHVlcy5kYXRhKCksIHJlYWxFaWdlbnZhbHVlcy5kYXRhKCkgKyByZWFsRWlnZW52YWx1ZXMuc2l6ZSgpKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHJlYWxFaWdlbnZhbHVlcywgc3ltbUVpZy5laWdlbnZhbHVlcygpKTsKIAogICAgIC8vIGNoZWNrIGVpZ2VudmVjdG9ycwogICAgIHR5cGVuYW1lIEdlbmVyYWxpemVkRWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT46OkVpZ2VudmVjdG9yc1R5cGUgRCA9IGVpZy5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKTsKICAgICB0eXBlbmFtZSBHZW5lcmFsaXplZEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+OjpFaWdlbnZlY3RvcnNUeXBlIFYgPSBlaWcuZWlnZW52ZWN0b3JzKCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChzcGRBKlYsIHNwZEIqVipEKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHNwZEEgKiBWLCBzcGRCICogViAqIEQpOwogICB9CiAKICAgLy8gbm9uIHN5bW1ldHJpYyBjYXNlOgogICB7CiAgICAgR2VuZXJhbGl6ZWRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaWcocm93cyk7Ci0gICAgLy8gVE9ETyBlbmFibGUgZnVsbC1wcmVhbG9jYXRpb24gb2YgcmVxdWlyZWQgbWVtb3J5LCB0aGlzIHByb2JhYmx5IHJlcXVpcmVzIGFuIGluLXBsYWNlIG1vZGUgZm9yIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uCi0gICAgLy9FaWdlbjo6aW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZChmYWxzZSk7Ci0gICAgZWlnLmNvbXB1dGUoYSxiKTsKLSAgICAvL0VpZ2VuOjppbnRlcm5hbDo6c2V0X2lzX21hbGxvY19hbGxvd2VkKHRydWUpOwotICAgIGZvcihJbmRleCBrPTA7IGs8Y29sczsgKytrKQotICAgIHsKLSAgICAgIE1hdHJpeDxDb21wbGV4U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gdG1wID0gKGVpZy5iZXRhcygpKGspKmEpLnRlbXBsYXRlIGNhc3Q8Q29tcGxleFNjYWxhcj4oKSAtIGVpZy5hbHBoYXMoKShrKSpiOwotICAgICAgaWYodG1wLnNpemUoKT4xICYmIHRtcC5ub3JtKCk+KHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6bWluKSgpKQotICAgICAgICB0bXAgLz0gdG1wLm5vcm0oKTsKLSAgICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggc3RkOjphYnModG1wLmRldGVybWluYW50KCkpLCBTY2FsYXIoMSkgKTsKKyAgICAvLyBUT0RPIGVuYWJsZSBmdWxsLXByZWFsb2NhdGlvbiBvZiByZXF1aXJlZCBtZW1vcnksIHRoaXMgcHJvYmFibHkgcmVxdWlyZXMgYW4gaW4tcGxhY2UgbW9kZSBmb3IKKyAgICAvLyBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbgorICAgIC8vIEVpZ2VuOjppbnRlcm5hbDo6c2V0X2lzX21hbGxvY19hbGxvd2VkKGZhbHNlKTsKKyAgICBlaWcuY29tcHV0ZShhLCBiKTsKKyAgICAvLyBFaWdlbjo6aW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZCh0cnVlKTsKKyAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgY29sczsgKytrKSB7CisgICAgICBNYXRyaXg8Q29tcGxleFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gdG1wID0KKyAgICAgICAgICAoZWlnLmJldGFzKCkoaykgKiBhKS50ZW1wbGF0ZSBjYXN0PENvbXBsZXhTY2FsYXI+KCkgLSBlaWcuYWxwaGFzKCkoaykgKiBiOworICAgICAgaWYgKHRtcC5zaXplKCkgPiAxICYmIHRtcC5ub3JtKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptaW4pKCkpIHRtcCAvPSB0bXAubm9ybSgpOworICAgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHN0ZDo6YWJzKHRtcC5kZXRlcm1pbmFudCgpKSwgU2NhbGFyKDEpKTsKICAgICB9CiAgICAgLy8gY2hlY2sgZWlnZW52ZWN0b3JzCiAgICAgdHlwZW5hbWUgR2VuZXJhbGl6ZWRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPjo6RWlnZW52ZWN0b3JzVHlwZSBEID0gZWlnLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpOwogICAgIHR5cGVuYW1lIEdlbmVyYWxpemVkRWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT46OkVpZ2VudmVjdG9yc1R5cGUgViA9IGVpZy5laWdlbnZlY3RvcnMoKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGEqViwgYipWKkQpOworICAgIFZFUklGWV9JU19BUFBST1goYSAqIFYsIGIgKiBWICogRCk7CiAgIH0KIAogICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxMDk4CiAgIHsKLSAgICBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlnMShhLmFkam9pbnQoKSAqIGEsYi5hZGpvaW50KCkgKiBiKTsKLSAgICBlaWcxLmNvbXB1dGUoYS5hZGpvaW50KCkgKiBhLGIuYWRqb2ludCgpICogYik7Ci0gICAgR2VuZXJhbGl6ZWRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaWcyKGEuYWRqb2ludCgpICogYSxiLmFkam9pbnQoKSAqIGIpOwotICAgIGVpZzIuY29tcHV0ZShhLmFkam9pbnQoKSAqIGEsYi5hZGpvaW50KCkgKiBiKTsKKyAgICBHZW5lcmFsaXplZFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlnMShhLmFkam9pbnQoKSAqIGEsIGIuYWRqb2ludCgpICogYik7CisgICAgZWlnMS5jb21wdXRlKGEuYWRqb2ludCgpICogYSwgYi5hZGpvaW50KCkgKiBiKTsKKyAgICBHZW5lcmFsaXplZEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpZzIoYS5hZGpvaW50KCkgKiBhLCBiLmFkam9pbnQoKSAqIGIpOworICAgIGVpZzIuY29tcHV0ZShhLmFkam9pbnQoKSAqIGEsIGIuYWRqb2ludCgpICogYik7CiAgIH0KIAogICAvLyBjaGVjayB3aXRob3V0IGVpZ2VudmVjdG9ycwpAQCAtODUsNTYgKzg1LDU1IEBACiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgogdm9pZCBnZW5lcmFsaXplZF9laWdlbnNvbHZlcl9hc3NlcnQoKSB7Ci0gICAgR2VuZXJhbGl6ZWRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaWc7Ci0gICAgLy8gYWxsIHJhaXNlIGFzc2VydCBpZiB1bmluaXRpYWxpemVkCi0gICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmluZm8oKSk7Ci0gICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmVpZ2VudmVjdG9ycygpKTsKLSAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaWcuZWlnZW52YWx1ZXMoKSk7Ci0gICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmFscGhhcygpKTsKLSAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaWcuYmV0YXMoKSk7CisgIEdlbmVyYWxpemVkRWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlnOworICAvLyBhbGwgcmFpc2UgYXNzZXJ0IGlmIHVuaW5pdGlhbGl6ZWQKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmluZm8oKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5laWdlbnZlY3RvcnMoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5laWdlbnZhbHVlcygpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmFscGhhcygpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmJldGFzKCkpOwogCi0gICAgLy8gbm9uZSByYWlzZSBhc3NlcnQgYWZ0ZXIgY29tcHV0ZSBjYWxsZWQKLSAgICBlaWcuY29tcHV0ZShNYXRyaXhUeXBlOjpSYW5kb20oMjAsIDIwKSwgTWF0cml4VHlwZTo6UmFuZG9tKDIwLCAyMCkpOwotICAgIFZFUklGWShlaWcuaW5mbygpID09IFN1Y2Nlc3MpOwotICAgIGVpZy5laWdlbnZlY3RvcnMoKTsKLSAgICBlaWcuZWlnZW52YWx1ZXMoKTsKLSAgICBlaWcuYWxwaGFzKCk7Ci0gICAgZWlnLmJldGFzKCk7CisgIC8vIG5vbmUgcmFpc2UgYXNzZXJ0IGFmdGVyIGNvbXB1dGUgY2FsbGVkCisgIGVpZy5jb21wdXRlKE1hdHJpeFR5cGU6OlJhbmRvbSgyMCwgMjApLCBNYXRyaXhUeXBlOjpSYW5kb20oMjAsIDIwKSk7CisgIFZFUklGWShlaWcuaW5mbygpID09IFN1Y2Nlc3MpOworICBlaWcuZWlnZW52ZWN0b3JzKCk7CisgIGVpZy5laWdlbnZhbHVlcygpOworICBlaWcuYWxwaGFzKCk7CisgIGVpZy5iZXRhcygpOwogCi0gICAgLy8gZWlnZW52ZWN0b3JzKCkgcmFpc2VzIGFzc2VydCwgaWYgZWlnZW52ZWN0b3JzIHdlcmUgbm90IHJlcXVlc3RlZAotICAgIGVpZy5jb21wdXRlKE1hdHJpeFR5cGU6OlJhbmRvbSgyMCwgMjApLCBNYXRyaXhUeXBlOjpSYW5kb20oMjAsIDIwKSwgZmFsc2UpOwotICAgIFZFUklGWShlaWcuaW5mbygpID09IFN1Y2Nlc3MpOwotICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5laWdlbnZlY3RvcnMoKSk7Ci0gICAgZWlnLmVpZ2VudmFsdWVzKCk7Ci0gICAgZWlnLmFscGhhcygpOwotICAgIGVpZy5iZXRhcygpOworICAvLyBlaWdlbnZlY3RvcnMoKSByYWlzZXMgYXNzZXJ0LCBpZiBlaWdlbnZlY3RvcnMgd2VyZSBub3QgcmVxdWVzdGVkCisgIGVpZy5jb21wdXRlKE1hdHJpeFR5cGU6OlJhbmRvbSgyMCwgMjApLCBNYXRyaXhUeXBlOjpSYW5kb20oMjAsIDIwKSwgZmFsc2UpOworICBWRVJJRlkoZWlnLmluZm8oKSA9PSBTdWNjZXNzKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmVpZ2VudmVjdG9ycygpKTsKKyAgZWlnLmVpZ2VudmFsdWVzKCk7CisgIGVpZy5hbHBoYXMoKTsKKyAgZWlnLmJldGFzKCk7CiAKLSAgICAvLyBhbGwgZXhjZXB0IGluZm8gcmFpc2UgYXNzZXJ0IGlmIHJlYWxRWiBkaWQgbm90IGNvbnZlcmdlCi0gICAgZWlnLnNldE1heEl0ZXJhdGlvbnMoMCk7IC8vIGZvcmNlIHJlYWwgUVogdG8gZmFpbC4KLSAgICBlaWcuY29tcHV0ZShNYXRyaXhUeXBlOjpSYW5kb20oMjAsIDIwKSwgTWF0cml4VHlwZTo6UmFuZG9tKDIwLCAyMCkpOwotICAgIFZFUklGWShlaWcuaW5mbygpID09IE5vQ29udmVyZ2VuY2UpOwotICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5laWdlbnZlY3RvcnMoKSk7Ci0gICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmVpZ2VudmFsdWVzKCkpOwotICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5hbHBoYXMoKSk7Ci0gICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmJldGFzKCkpOworICAvLyBhbGwgZXhjZXB0IGluZm8gcmFpc2UgYXNzZXJ0IGlmIHJlYWxRWiBkaWQgbm90IGNvbnZlcmdlCisgIGVpZy5zZXRNYXhJdGVyYXRpb25zKDApOyAgLy8gZm9yY2UgcmVhbCBRWiB0byBmYWlsLgorICBlaWcuY29tcHV0ZShNYXRyaXhUeXBlOjpSYW5kb20oMjAsIDIwKSwgTWF0cml4VHlwZTo6UmFuZG9tKDIwLCAyMCkpOworICBWRVJJRlkoZWlnLmluZm8oKSA9PSBOb0NvbnZlcmdlbmNlKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmVpZ2VudmVjdG9ycygpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmVpZ2VudmFsdWVzKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaWcuYWxwaGFzKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaWcuYmV0YXMoKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChlaWdlbnNvbHZlcl9nZW5lcmFsaXplZF9yZWFsKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworRUlHRU5fREVDTEFSRV9URVNUKGVpZ2Vuc29sdmVyX2dlbmVyYWxpemVkX3JlYWwpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CiAgICAgaW50IHMgPSAwOwotICAgIENBTExfU1VCVEVTVF8xKCBnZW5lcmFsaXplZF9laWdlbnNvbHZlcl9yZWFsKE1hdHJpeDRmKCkpICk7Ci0gICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvNCk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGdlbmVyYWxpemVkX2VpZ2Vuc29sdmVyX3JlYWwoTWF0cml4WGQocyxzKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMShnZW5lcmFsaXplZF9laWdlbnNvbHZlcl9yZWFsKE1hdHJpeDRmKCkpKTsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyA0KTsKKyAgICBDQUxMX1NVQlRFU1RfMihnZW5lcmFsaXplZF9laWdlbnNvbHZlcl9yZWFsKE1hdHJpeFhkKHMsIHMpKSk7CiAKICAgICAvLyBzb21lIHRyaXZpYWwgYnV0IGltcGxlbWVudGF0aW9uLXdpc2Ugc3BlY2lhbCBjYXNlcwotICAgIENBTExfU1VCVEVTVF8yKCBnZW5lcmFsaXplZF9laWdlbnNvbHZlcl9yZWFsKE1hdHJpeFhkKDEsMSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGdlbmVyYWxpemVkX2VpZ2Vuc29sdmVyX3JlYWwoTWF0cml4WGQoMiwyKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggZ2VuZXJhbGl6ZWRfZWlnZW5zb2x2ZXJfcmVhbChNYXRyaXg8ZG91YmxlLDEsMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggZ2VuZXJhbGl6ZWRfZWlnZW5zb2x2ZXJfcmVhbChNYXRyaXgyZCgpKSApOwotICAgIENBTExfU1VCVEVTVF81KCBnZW5lcmFsaXplZF9laWdlbnNvbHZlcl9hc3NlcnQ8TWF0cml4WGQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMihnZW5lcmFsaXplZF9laWdlbnNvbHZlcl9yZWFsKE1hdHJpeFhkKDEsIDEpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoZ2VuZXJhbGl6ZWRfZWlnZW5zb2x2ZXJfcmVhbChNYXRyaXhYZCgyLCAyKSkpOworICAgIENBTExfU1VCVEVTVF8zKGdlbmVyYWxpemVkX2VpZ2Vuc29sdmVyX3JlYWwoTWF0cml4PGRvdWJsZSwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF80KGdlbmVyYWxpemVkX2VpZ2Vuc29sdmVyX3JlYWwoTWF0cml4MmQoKSkpOworICAgIENBTExfU1VCVEVTVF81KGdlbmVyYWxpemVkX2VpZ2Vuc29sdmVyX2Fzc2VydDxNYXRyaXhYZD4oKSk7CiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2VpZ2Vuc29sdmVyX2dlbmVyaWMuY3BwIGIvdGVzdC9laWdlbnNvbHZlcl9nZW5lcmljLmNwcAppbmRleCA3YWRiOTg2Li5jNjY1ZGY4IDEwMDY0NAotLS0gYS90ZXN0L2VpZ2Vuc29sdmVyX2dlbmVyaWMuY3BwCisrKyBiL3Rlc3QvZWlnZW5zb2x2ZXJfZ2VuZXJpYy5jcHAKQEAgLTEyLDkgKzEyLDggQEAKICNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEVpZ1R5cGUsdHlwZW5hbWUgTWF0VHlwZT4KLXZvaWQgY2hlY2tfZWlnZW5zb2x2ZXJfZm9yX2dpdmVuX21hdChjb25zdCBFaWdUeXBlICZlaWcsIGNvbnN0IE1hdFR5cGUmIGEpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWlnVHlwZSwgdHlwZW5hbWUgTWF0VHlwZT4KK3ZvaWQgY2hlY2tfZWlnZW5zb2x2ZXJfZm9yX2dpdmVuX21hdChjb25zdCBFaWdUeXBlJiBlaWcsIGNvbnN0IE1hdFR5cGUmIGEpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOwogICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBNYXRUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gUmVhbFZlY3RvclR5cGU7CiAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXg7CkBAIC0yNyw4ICsyNiw4IEBACiAgIFZFUklGWV9JU19BUFBST1goYS5laWdlbnZhbHVlcygpLCBlaWcuZWlnZW52YWx1ZXMoKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgZWlnZW5zb2x2ZXIoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBlaWdlbnNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgRWlnZW5Tb2x2ZXIuaAogICAqLwpAQCAtMzksMTggKzM4LDE4IEBACiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gQ29tcGxleDsKIAotICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKLSAgTWF0cml4VHlwZSBhMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICBNYXRyaXhUeXBlIHN5bW1BID0gIGEuYWRqb2ludCgpICogYSArIGExLmFkam9pbnQoKSAqIGExOworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgYTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgc3ltbUEgPSBhLmFkam9pbnQoKSAqIGEgKyBhMS5hZGpvaW50KCkgKiBhMTsKIAogICBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaTAoc3ltbUEpOwogICBWRVJJRllfSVNfRVFVQUwoZWkwLmluZm8oKSwgU3VjY2Vzcyk7CiAgIFZFUklGWV9JU19BUFBST1goc3ltbUEgKiBlaTAucHNldWRvRWlnZW52ZWN0b3JzKCksIGVpMC5wc2V1ZG9FaWdlbnZlY3RvcnMoKSAqIGVpMC5wc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCkpOwogICBWRVJJRllfSVNfQVBQUk9YKChzeW1tQS50ZW1wbGF0ZSBjYXN0PENvbXBsZXg+KCkpICogKGVpMC5wc2V1ZG9FaWdlbnZlY3RvcnMoKS50ZW1wbGF0ZSBjYXN0PENvbXBsZXg+KCkpLAotICAgIChlaTAucHNldWRvRWlnZW52ZWN0b3JzKCkudGVtcGxhdGUgY2FzdDxDb21wbGV4PigpKSAqIChlaTAuZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpKTsKKyAgICAgICAgICAgICAgICAgICAoZWkwLnBzZXVkb0VpZ2VudmVjdG9ycygpLnRlbXBsYXRlIGNhc3Q8Q29tcGxleD4oKSkgKiAoZWkwLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpKSk7CiAKICAgRWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWkxKGEpOwotICBDQUxMX1NVQlRFU1QoIGNoZWNrX2VpZ2Vuc29sdmVyX2Zvcl9naXZlbl9tYXQoZWkxLGEpICk7CisgIENBTExfU1VCVEVTVChjaGVja19laWdlbnNvbHZlcl9mb3JfZ2l2ZW5fbWF0KGVpMSwgYSkpOwogCiAgIEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpMjsKICAgZWkyLnNldE1heEl0ZXJhdGlvbnMoUmVhbFNjaHVyPE1hdHJpeFR5cGU+OjptX21heEl0ZXJhdGlvbnNQZXJSb3cgKiByb3dzKS5jb21wdXRlKGEpOwpAQCAtNzEsMTAgKzcwLDkgQEAKICAgTWF0cml4VHlwZSBpZCA9IE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIGNvbHMpOwogICBWRVJJRllfSVNfQVBQUk9YKGlkLm9wZXJhdG9yTm9ybSgpLCBSZWFsU2NhbGFyKDEpKTsKIAotICBpZiAocm93cyA+IDIgJiYgcm93cyA8IDIwKQotICB7CisgIGlmIChyb3dzID4gMiAmJiByb3dzIDwgMjApIHsKICAgICAvLyBUZXN0IG1hdHJpeCB3aXRoIE5hTgotICAgIGEoMCwwKSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhcj46OnF1aWV0X05hTigpOworICAgIGEoMCwgMCkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXI+OjpxdWlldF9OYU4oKTsKICAgICBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaU5hTihhKTsKICAgICBWRVJJRllfSVNfTk9UX0VRVUFMKGVpTmFOLmluZm8oKSwgU3VjY2Vzcyk7CiAgIH0KQEAgLTkwLDE1OCArODgsMTQ2IEBACiAgICAgYS5zZXRaZXJvKCk7CiAgICAgRWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWkzKGEpOwogICAgIFZFUklGWV9JU19FUVVBTChlaTMuaW5mbygpLCBTdWNjZXNzKTsKLSAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oZWkzLmVpZ2VudmFsdWVzKCkubm9ybSgpLFJlYWxTY2FsYXIoMSkpOwotICAgIFZFUklGWSgoZWkzLmVpZ2VudmVjdG9ycygpLnRyYW5zcG9zZSgpKmVpMy5laWdlbnZlY3RvcnMoKS50cmFuc3Bvc2UoKSkuZXZhbCgpLmlzSWRlbnRpdHkoKSk7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGVpMy5laWdlbnZhbHVlcygpLm5vcm0oKSwgUmVhbFNjYWxhcigxKSk7CisgICAgVkVSSUZZKChlaTMuZWlnZW52ZWN0b3JzKCkudHJhbnNwb3NlKCkgKiBlaTMuZWlnZW52ZWN0b3JzKCkudHJhbnNwb3NlKCkpLmV2YWwoKS5pc0lkZW50aXR5KCkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGVpZ2Vuc29sdmVyX3ZlcmlmeV9hc3NlcnQoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICBFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaWc7CiAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5laWdlbnZlY3RvcnMoKSk7CiAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5wc2V1ZG9FaWdlbnZlY3RvcnMoKSk7CiAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGVpZy5wc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCkpOwogICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaWcuZWlnZW52YWx1ZXMoKSk7CiAKLSAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKG0ucm93cygpLG0uY29scygpKTsKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKG0ucm93cygpLCBtLmNvbHMoKSk7CiAgIGVpZy5jb21wdXRlKGEsIGZhbHNlKTsKICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLmVpZ2VudmVjdG9ycygpKTsKICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoZWlnLnBzZXVkb0VpZ2VudmVjdG9ycygpKTsKIH0KIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBDb2VmZlR5cGU+Ci1NYXRyaXg8dHlwZW5hbWUgQ29lZmZUeXBlOjpTY2FsYXIsRHluYW1pYyxEeW5hbWljPgotbWFrZV9jb21wYW5pb24oY29uc3QgQ29lZmZUeXBlJiBjb2VmZnMpCi17Ci0gIEluZGV4IG4gPSBjb2VmZnMuc2l6ZSgpLTE7Ci0gIE1hdHJpeDx0eXBlbmFtZSBDb2VmZlR5cGU6OlNjYWxhcixEeW5hbWljLER5bmFtaWM+IHJlcyhuLG4pOwordGVtcGxhdGUgPHR5cGVuYW1lIENvZWZmVHlwZT4KK01hdHJpeDx0eXBlbmFtZSBDb2VmZlR5cGU6OlNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gbWFrZV9jb21wYW5pb24oY29uc3QgQ29lZmZUeXBlJiBjb2VmZnMpIHsKKyAgSW5kZXggbiA9IGNvZWZmcy5zaXplKCkgLSAxOworICBNYXRyaXg8dHlwZW5hbWUgQ29lZmZUeXBlOjpTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IHJlcyhuLCBuKTsKICAgcmVzLnNldFplcm8oKTsKLQlyZXMucm93KDApID0gLWNvZWZmcy50YWlsKG4pIC8gY29lZmZzKDApOwotCXJlcy5kaWFnb25hbCgtMSkuc2V0T25lcygpOworICByZXMucm93KDApID0gLWNvZWZmcy50YWlsKG4pIC8gY29lZmZzKDApOworICByZXMuZGlhZ29uYWwoLTEpLnNldE9uZXMoKTsKICAgcmV0dXJuIHJlczsKIH0KIAotdGVtcGxhdGU8aW50Pgotdm9pZCBlaWdlbnNvbHZlcl9nZW5lcmljX2V4dHJhKCkKLXsKK3RlbXBsYXRlIDxpbnQ+Cit2b2lkIGVpZ2Vuc29sdmVyX2dlbmVyaWNfZXh0cmEoKSB7CiAgIHsKICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA3OTMKLSAgICBNYXRyaXhYZCBhKDMsMyk7Ci0gICAgYSA8PCAwLCAgMCwgIDEsCi0gICAgICAgIDEsICAxLCAxLAotICAgICAgICAxLCAxZSsyMDAsICAxOworICAgIE1hdHJpeFhkIGEoMywgMyk7CisgICAgYSA8PCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxZSsyMDAsIDE7CiAgICAgRWlnZW46OkVpZ2VuU29sdmVyPE1hdHJpeFhkPiBlaWcoYSk7Ci0gICAgZG91YmxlIHNjYWxlID0gMWUtMjAwOyAvLyBzY2FsZSB0byBhdm9pZCBvdmVyZmxvdyBkdXJpbmcgdGhlIGNvbXBhcmlzb25zCi0gICAgVkVSSUZZX0lTX0FQUFJPWChhICogZWlnLnBzZXVkb0VpZ2VudmVjdG9ycygpKnNjYWxlLCBlaWcucHNldWRvRWlnZW52ZWN0b3JzKCkgKiBlaWcucHNldWRvRWlnZW52YWx1ZU1hdHJpeCgpKnNjYWxlKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGEgKiBlaWcuZWlnZW52ZWN0b3JzKCkqc2NhbGUsIGVpZy5laWdlbnZlY3RvcnMoKSAqIGVpZy5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSpzY2FsZSk7CisgICAgZG91YmxlIHNjYWxlID0gMWUtMjAwOyAgLy8gc2NhbGUgdG8gYXZvaWQgb3ZlcmZsb3cgZHVyaW5nIHRoZSBjb21wYXJpc29ucworICAgIFZFUklGWV9JU19BUFBST1goYSAqIGVpZy5wc2V1ZG9FaWdlbnZlY3RvcnMoKSAqIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgZWlnLnBzZXVkb0VpZ2VudmVjdG9ycygpICogZWlnLnBzZXVkb0VpZ2VudmFsdWVNYXRyaXgoKSAqIHNjYWxlKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGEgKiBlaWcuZWlnZW52ZWN0b3JzKCkgKiBzY2FsZSwgZWlnLmVpZ2VudmVjdG9ycygpICogZWlnLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpICogc2NhbGUpOwogICB9CiAgIHsKICAgICAvLyBjaGVjayBhIGNhc2Ugd2hlcmUgYWxsIGVpZ2VudmFsdWVzIGFyZSBudWxsLgotICAgIE1hdHJpeFhkIGEoMiwyKTsKLSAgICBhIDw8IDEsICAxLAotICAgICAgICAtMSwgLTE7CisgICAgTWF0cml4WGQgYSgyLCAyKTsKKyAgICBhIDw8IDEsIDEsIC0xLCAtMTsKICAgICBFaWdlbjo6RWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IGVpZyhhKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKGVpZy5wc2V1ZG9FaWdlbnZlY3RvcnMoKS5zcXVhcmVkTm9ybSgpLCAyLik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgoYSAqIGVpZy5wc2V1ZG9FaWdlbnZlY3RvcnMoKSkubm9ybSgpKzEuLCAxLik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgoZWlnLnBzZXVkb0VpZ2VudmVjdG9ycygpICogZWlnLnBzZXVkb0VpZ2VudmFsdWVNYXRyaXgoKSkubm9ybSgpKzEuLCAxLik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgoYSAqIGVpZy5laWdlbnZlY3RvcnMoKSkubm9ybSgpKzEuLCAxLik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgoZWlnLmVpZ2VudmVjdG9ycygpICogZWlnLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpKS5ub3JtKCkrMS4sIDEuKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChhICogZWlnLnBzZXVkb0VpZ2VudmVjdG9ycygpKS5ub3JtKCkgKyAxLiwgMS4pOworICAgIFZFUklGWV9JU19BUFBST1goKGVpZy5wc2V1ZG9FaWdlbnZlY3RvcnMoKSAqIGVpZy5wc2V1ZG9FaWdlbnZhbHVlTWF0cml4KCkpLm5vcm0oKSArIDEuLCAxLik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgoYSAqIGVpZy5laWdlbnZlY3RvcnMoKSkubm9ybSgpICsgMS4sIDEuKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChlaWcuZWlnZW52ZWN0b3JzKCkgKiBlaWcuZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpLm5vcm0oKSArIDEuLCAxLik7CiAgIH0KIAogICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA5MzMKICAgewogICAgIHsKLSAgICAgIFZlY3RvclhkIGNvZWZmcyg1KTsgY29lZmZzIDw8IDEsIC0zLCAtMTc1LCAtMjI1LCAyMjUwOworICAgICAgVmVjdG9yWGQgY29lZmZzKDUpOworICAgICAgY29lZmZzIDw8IDEsIC0zLCAtMTc1LCAtMjI1LCAyMjUwOwogICAgICAgTWF0cml4WGQgQyA9IG1ha2VfY29tcGFuaW9uKGNvZWZmcyk7CiAgICAgICBFaWdlblNvbHZlcjxNYXRyaXhYZD4gZWlnKEMpOwotICAgICAgQ0FMTF9TVUJURVNUKCBjaGVja19laWdlbnNvbHZlcl9mb3JfZ2l2ZW5fbWF0KGVpZyxDKSApOworICAgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2VpZ2Vuc29sdmVyX2Zvcl9naXZlbl9tYXQoZWlnLCBDKSk7CiAgICAgfQogICAgIHsKICAgICAgIC8vIHRoaXMgdGVzdCBpcyB0cmlja3kgYmVjYXVzZSBpdCByZXF1aXJlcyBoaWdoIGFjY3VyYWN5IGluIHNtYWxsZXN0IGVpZ2VudmFsdWVzCi0gICAgICBWZWN0b3JYZCBjb2VmZnMoNSk7IGNvZWZmcyA8PCA2LjE1NDY3MWUtMTUsIC0xLjAwMzg3MGUtMTAsIC05LjgxOTU3MGUtMDEsIDMuOTk1NzE1ZSswMywgMi4yMTE1MTFlKzA4OworICAgICAgVmVjdG9yWGQgY29lZmZzKDUpOworICAgICAgY29lZmZzIDw8IDYuMTU0NjcxZS0xNSwgLTEuMDAzODcwZS0xMCwgLTkuODE5NTcwZS0wMSwgMy45OTU3MTVlKzAzLCAyLjIxMTUxMWUrMDg7CiAgICAgICBNYXRyaXhYZCBDID0gbWFrZV9jb21wYW5pb24oY29lZmZzKTsKICAgICAgIEVpZ2VuU29sdmVyPE1hdHJpeFhkPiBlaWcoQyk7Ci0gICAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2VpZ2Vuc29sdmVyX2Zvcl9naXZlbl9tYXQoZWlnLEMpICk7CisgICAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZWlnZW5zb2x2ZXJfZm9yX2dpdmVuX21hdChlaWcsIEMpKTsKICAgICAgIEluZGV4IG4gPSBDLnJvd3MoKTsKLSAgICAgIGZvcihJbmRleCBpPTA7aTxuOysraSkKLSAgICAgIHsKKyAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBDb21wbGV4OwogICAgICAgICBNYXRyaXhYY2QgYWMgPSBDLmNhc3Q8Q29tcGxleD4oKTsKICAgICAgICAgYWMuZGlhZ29uYWwoKS5hcnJheSgpIC09IGVpZy5laWdlbnZhbHVlcygpKGkpOwogICAgICAgICBWZWN0b3JYZCBzdiA9IGFjLmphY29iaVN2ZCgpLnNpbmd1bGFyVmFsdWVzKCk7CiAgICAgICAgIC8vIGNvbXBhcmluZyB0byBzdigwKSBpcyBub3QgZW5vdWdoIGhlcmUgdG8gY2F0Y2ggdGhlICJidWciLAogICAgICAgICAvLyB0aGUgaGFyZC1jb2RlZCAxLjAgaXMgaW1wb3J0YW50IQotICAgICAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oc3Yobi0xKSwgMS4wKTsKKyAgICAgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHN2KG4gLSAxKSwgMS4wKTsKICAgICAgIH0KICAgICB9CiAgIH0KICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTU1NwogICB7CiAgICAgLy8gdGhpcyB0ZXN0IGlzIGludGVyZXN0aW5nIGJlY2F1c2UgaXQgY29udGFpbnMgemVyb3Mgb24gdGhlIGRpYWdvbmFsLgotICAgIE1hdHJpeFhkIEFfYnVnMTU1NygzLDMpOworICAgIE1hdHJpeFhkIEFfYnVnMTU1NygzLCAzKTsKICAgICBBX2J1ZzE1NTcgPDwgMCwgMCwgMCwgMSwgMCwgMC41ODg3OTA3MDY0ODA4NjM1MTI3LCAwLCAxLCAwOwogICAgIEVpZ2VuU29sdmVyPE1hdHJpeFhkPiBlaWcoQV9idWcxNTU3KTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2VpZ2Vuc29sdmVyX2Zvcl9naXZlbl9tYXQoZWlnLEFfYnVnMTU1NykgKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZWlnZW5zb2x2ZXJfZm9yX2dpdmVuX21hdChlaWcsIEFfYnVnMTU1NykpOwogICB9CiAKICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTE3NAogICB7CiAgICAgSW5kZXggbiA9IDEyOwotICAgIE1hdHJpeFhmIEFfYnVnMTE3NChuLG4pOwotICAgIEFfYnVnMTE3NCA8PCAgMjYyMTQ0LCAwLCAwLCAyNjIxNDQsIDc4NjQzMiwgMCwgMCwgMCwgMCwgMCwgMCwgNzg2NDMyLAotICAgICAgICAgICAgICAgICAgMjYyMTQ0LCAwLCAwLCAyNjIxNDQsIDc4NjQzMiwgMCwgMCwgMCwgMCwgMCwgMCwgNzg2NDMyLAotICAgICAgICAgICAgICAgICAgMjYyMTQ0LCAwLCAwLCAyNjIxNDQsIDc4NjQzMiwgMCwgMCwgMCwgMCwgMCwgMCwgNzg2NDMyLAotICAgICAgICAgICAgICAgICAgMjYyMTQ0LCAwLCAwLCAyNjIxNDQsIDc4NjQzMiwgMCwgMCwgMCwgMCwgMCwgMCwgNzg2NDMyLAotICAgICAgICAgICAgICAgICAgMCwgMjYyMTQ0LCAyNjIxNDQsIDAsIDAsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDAsCi0gICAgICAgICAgICAgICAgICAwLCAyNjIxNDQsIDI2MjE0NCwgMCwgMCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMCwKLSAgICAgICAgICAgICAgICAgIDAsIDI2MjE0NCwgMjYyMTQ0LCAwLCAwLCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAwLAotICAgICAgICAgICAgICAgICAgMCwgMjYyMTQ0LCAyNjIxNDQsIDAsIDAsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDAsCi0gICAgICAgICAgICAgICAgICAwLCAyNjIxNDQsIDI2MjE0NCwgMCwgMCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMCwKLSAgICAgICAgICAgICAgICAgIDAsIDI2MjE0NCwgMjYyMTQ0LCAwLCAwLCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAwLAotICAgICAgICAgICAgICAgICAgMCwgMjYyMTQ0LCAyNjIxNDQsIDAsIDAsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDAsCi0gICAgICAgICAgICAgICAgICAwLCAyNjIxNDQsIDI2MjE0NCwgMCwgMCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMDsKKyAgICBNYXRyaXhYZiBBX2J1ZzExNzQobiwgbik7CisgICAgQV9idWcxMTc0IDw8IDI2MjE0NCwgMCwgMCwgMjYyMTQ0LCA3ODY0MzIsIDAsIDAsIDAsIDAsIDAsIDAsIDc4NjQzMiwgMjYyMTQ0LCAwLCAwLCAyNjIxNDQsIDc4NjQzMiwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgNzg2NDMyLCAyNjIxNDQsIDAsIDAsIDI2MjE0NCwgNzg2NDMyLCAwLCAwLCAwLCAwLCAwLCAwLCA3ODY0MzIsIDI2MjE0NCwgMCwgMCwgMjYyMTQ0LCA3ODY0MzIsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDc4NjQzMiwgMCwgMjYyMTQ0LCAyNjIxNDQsIDAsIDAsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDAsIDAsIDI2MjE0NCwgMjYyMTQ0LCAwLCAwLAorICAgICAgICAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAwLCAwLCAyNjIxNDQsIDI2MjE0NCwgMCwgMCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LAorICAgICAgICAyNjIxNDQsIDI2MjE0NCwgMCwgMCwgMjYyMTQ0LCAyNjIxNDQsIDAsIDAsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDAsIDAsIDI2MjE0NCwKKyAgICAgICAgMjYyMTQ0LCAwLCAwLCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAwLCAwLCAyNjIxNDQsIDI2MjE0NCwgMCwgMCwgMjYyMTQ0LCAyNjIxNDQsCisgICAgICAgIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMCwgMCwgMjYyMTQ0LCAyNjIxNDQsIDAsIDAsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDAsCisgICAgICAgIDAsIDI2MjE0NCwgMjYyMTQ0LCAwLCAwLCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAyNjIxNDQsIDI2MjE0NCwgMjYyMTQ0LCAwOwogICAgIEVpZ2VuU29sdmVyPE1hdHJpeFhmPiBlaWcoQV9idWcxMTc0KTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2VpZ2Vuc29sdmVyX2Zvcl9naXZlbl9tYXQoZWlnLEFfYnVnMTE3NCkgKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZWlnZW5zb2x2ZXJfZm9yX2dpdmVuX21hdChlaWcsIEFfYnVnMTE3NCkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChlaWdlbnNvbHZlcl9nZW5lcmljKQoteworRUlHRU5fREVDTEFSRV9URVNUKGVpZ2Vuc29sdmVyX2dlbmVyaWMpIHsKICAgaW50IHMgPSAwOwotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBlaWdlbnNvbHZlcihNYXRyaXg0ZigpKSApOwotICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpOwotICAgIENBTExfU1VCVEVTVF8yKCBlaWdlbnNvbHZlcihNYXRyaXhYZChzLHMpKSApOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShlaWdlbnNvbHZlcihNYXRyaXg0ZigpKSk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gNCk7CisgICAgQ0FMTF9TVUJURVNUXzIoZWlnZW5zb2x2ZXIoTWF0cml4WGQocywgcykpKTsKICAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCiAKICAgICAvLyBzb21lIHRyaXZpYWwgYnV0IGltcGxlbWVudGF0aW9uLXdpc2UgdHJpY2t5IGNhc2VzCi0gICAgQ0FMTF9TVUJURVNUXzIoIGVpZ2Vuc29sdmVyKE1hdHJpeFhkKDEsMSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGVpZ2Vuc29sdmVyKE1hdHJpeFhkKDIsMikpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGVpZ2Vuc29sdmVyKE1hdHJpeDxkb3VibGUsMSwxPigpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBlaWdlbnNvbHZlcihNYXRyaXgyZCgpKSApOworICAgIENBTExfU1VCVEVTVF8yKGVpZ2Vuc29sdmVyKE1hdHJpeFhkKDEsIDEpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoZWlnZW5zb2x2ZXIoTWF0cml4WGQoMiwgMikpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhlaWdlbnNvbHZlcihNYXRyaXg8ZG91YmxlLCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoZWlnZW5zb2x2ZXIoTWF0cml4MmQoKSkpOwogICB9CiAKLSAgQ0FMTF9TVUJURVNUXzEoIGVpZ2Vuc29sdmVyX3ZlcmlmeV9hc3NlcnQoTWF0cml4NGYoKSkgKTsKLSAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvNCk7Ci0gIENBTExfU1VCVEVTVF8yKCBlaWdlbnNvbHZlcl92ZXJpZnlfYXNzZXJ0KE1hdHJpeFhkKHMscykpICk7Ci0gIENBTExfU1VCVEVTVF8zKCBlaWdlbnNvbHZlcl92ZXJpZnlfYXNzZXJ0KE1hdHJpeDxkb3VibGUsMSwxPigpKSApOwotICBDQUxMX1NVQlRFU1RfNCggZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXgyZCgpKSApOworICBDQUxMX1NVQlRFU1RfMShlaWdlbnNvbHZlcl92ZXJpZnlfYXNzZXJ0KE1hdHJpeDRmKCkpKTsKKyAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gNCk7CisgIENBTExfU1VCVEVTVF8yKGVpZ2Vuc29sdmVyX3ZlcmlmeV9hc3NlcnQoTWF0cml4WGQocywgcykpKTsKKyAgQ0FMTF9TVUJURVNUXzMoZWlnZW5zb2x2ZXJfdmVyaWZ5X2Fzc2VydChNYXRyaXg8ZG91YmxlLCAxLCAxPigpKSk7CisgIENBTExfU1VCVEVTVF80KGVpZ2Vuc29sdmVyX3ZlcmlmeV9hc3NlcnQoTWF0cml4MmQoKSkpOwogCiAgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycwogICBDQUxMX1NVQlRFU1RfNShFaWdlblNvbHZlcjxNYXRyaXhYZj4gdG1wKHMpKTsKIAogICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA0MTAKLSAgQ0FMTF9TVUJURVNUXzIoCi0gIHsKLSAgICAgTWF0cml4WGQgQSgxLDEpOwotICAgICBBKDAsMCkgPSBzdGQ6OnNxcnQoLTEuKTsgLy8gaXMgTm90LWEtTnVtYmVyCi0gICAgIEVpZ2VuOjpFaWdlblNvbHZlcjxNYXRyaXhYZD4gc29sdmVyKEEpOwotICAgICBWRVJJRllfSVNfRVFVQUwoc29sdmVyLmluZm8oKSwgTnVtZXJpY2FsSXNzdWUpOwotICB9Ci0gICk7Ci0gIAotICBDQUxMX1NVQlRFU1RfMiggZWlnZW5zb2x2ZXJfZ2VuZXJpY19leHRyYTwwPigpICk7Ci0gIAorICBDQUxMX1NVQlRFU1RfMih7CisgICAgTWF0cml4WGQgQSgxLCAxKTsKKyAgICBBKDAsIDApID0gc3RkOjpzcXJ0KC0xLik7ICAvLyBpcyBOb3QtYS1OdW1iZXIKKyAgICBFaWdlbjo6RWlnZW5Tb2x2ZXI8TWF0cml4WGQ+IHNvbHZlcihBKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc29sdmVyLmluZm8oKSwgTnVtZXJpY2FsSXNzdWUpOworICB9KTsKKworICBDQUxMX1NVQlRFU1RfMihlaWdlbnNvbHZlcl9nZW5lcmljX2V4dHJhPDA+KCkpOworCiAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZWlnZW5zb2x2ZXJfc2VsZmFkam9pbnQuY3BwIGIvdGVzdC9laWdlbnNvbHZlcl9zZWxmYWRqb2ludC5jcHAKaW5kZXggMGZiMmY0ZC4uZmMwYzhkOCAxMDA2NDQKLS0tIGEvdGVzdC9laWdlbnNvbHZlcl9zZWxmYWRqb2ludC5jcHAKKysrIGIvdGVzdC9laWdlbnNvbHZlcl9zZWxmYWRqb2ludC5jcHAKQEAgLTE0LDYwICsxNCw1NCBAQAogI2luY2x1ZGUgPEVpZ2VuL0VpZ2VudmFsdWVzPgogI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZUNvcmU+CiAKLQotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyX2Vzc2VudGlhbF9jaGVjayhjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXJfZXNzZW50aWFsX2NoZWNrKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7Ci0gIFJlYWxTY2FsYXIgZWl2YWxfZXBzID0gbnVtZXh0OjptaW5pPFJlYWxTY2FsYXI+KHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCksICBOdW1UcmFpdHM8U2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkqMjAwMDApOwotICAKKyAgUmVhbFNjYWxhciBlaXZhbF9lcHMgPQorICAgICAgbnVtZXh0OjptaW5pPFJlYWxTY2FsYXI+KHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCksIE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSAqIDIwMDAwKTsKKwogICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpU3ltbShtKTsKICAgVkVSSUZZX0lTX0VRVUFMKGVpU3ltbS5pbmZvKCksIFN1Y2Nlc3MpOwogCiAgIFJlYWxTY2FsYXIgc2NhbGluZyA9IG0uY3dpc2VBYnMoKS5tYXhDb2VmZigpOwogCi0gIGlmKHNjYWxpbmc8KHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbikoKSkKLSAgeworICBpZiAoc2NhbGluZyA8IChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCkpIHsKICAgICBWRVJJRlkoZWlTeW1tLmVpZ2VudmFsdWVzKCkuY3dpc2VBYnMoKS5tYXhDb2VmZigpIDw9IChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCkpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIFZFUklGWV9JU19BUFBST1goKG0udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogZWlTeW1tLmVpZ2VudmVjdG9ycygpKS9zY2FsaW5nLAotICAgICAgICAgICAgICAgICAgICAgKGVpU3ltbS5laWdlbnZlY3RvcnMoKSAqIGVpU3ltbS5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSkvc2NhbGluZyk7CisgIH0gZWxzZSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgobS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiBlaVN5bW0uZWlnZW52ZWN0b3JzKCkpIC8gc2NhbGluZywKKyAgICAgICAgICAgICAgICAgICAgIChlaVN5bW0uZWlnZW52ZWN0b3JzKCkgKiBlaVN5bW0uZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpIC8gc2NhbGluZyk7CiAgIH0KICAgVkVSSUZZX0lTX0FQUFJPWChtLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5laWdlbnZhbHVlcygpLCBlaVN5bW0uZWlnZW52YWx1ZXMoKSk7CiAgIFZFUklGWV9JU19VTklUQVJZKGVpU3ltbS5laWdlbnZlY3RvcnMoKSk7CiAKLSAgaWYobS5jb2xzKCk8PTQpCi0gIHsKKyAgaWYgKG0uY29scygpIDw9IDQpIHsKICAgICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpRGlyZWN0OwotICAgIGVpRGlyZWN0LmNvbXB1dGVEaXJlY3QobSk7ICAKKyAgICBlaURpcmVjdC5jb21wdXRlRGlyZWN0KG0pOwogICAgIFZFUklGWV9JU19FUVVBTChlaURpcmVjdC5pbmZvKCksIFN1Y2Nlc3MpOwotICAgIGlmKCEgZWlTeW1tLmVpZ2VudmFsdWVzKCkuaXNBcHByb3goZWlEaXJlY3QuZWlnZW52YWx1ZXMoKSwgZWl2YWxfZXBzKSApCi0gICAgeworICAgIGlmICghZWlTeW1tLmVpZ2VudmFsdWVzKCkuaXNBcHByb3goZWlEaXJlY3QuZWlnZW52YWx1ZXMoKSwgZWl2YWxfZXBzKSkgewogICAgICAgc3RkOjpjZXJyIDw8ICJyZWZlcmVuY2UgZWlnZW52YWx1ZXM6ICIgPDwgZWlTeW1tLmVpZ2VudmFsdWVzKCkudHJhbnNwb3NlKCkgPDwgIlxuIgogICAgICAgICAgICAgICAgIDw8ICJvYnRhaW5lZCBlaWdlbnZhbHVlczogICIgPDwgZWlEaXJlY3QuZWlnZW52YWx1ZXMoKS50cmFuc3Bvc2UoKSA8PCAiXG4iCi0gICAgICAgICAgICAgICAgPDwgImRpZmY6ICAgICAgICAgICAgICAgICAgIiA8PCAoZWlTeW1tLmVpZ2VudmFsdWVzKCktZWlEaXJlY3QuZWlnZW52YWx1ZXMoKSkudHJhbnNwb3NlKCkgPDwgIlxuIgotICAgICAgICAgICAgICAgIDw8ICJlcnJvciAoZXBzKTogICAgICAgICAgICIgPDwgKGVpU3ltbS5laWdlbnZhbHVlcygpLWVpRGlyZWN0LmVpZ2VudmFsdWVzKCkpLm5vcm0oKSAvIGVpU3ltbS5laWdlbnZhbHVlcygpLm5vcm0oKSA8PCAiICAoIiA8PCBlaXZhbF9lcHMgPDwgIilcbiI7CisgICAgICAgICAgICAgICAgPDwgImRpZmY6ICAgICAgICAgICAgICAgICAgIiA8PCAoZWlTeW1tLmVpZ2VudmFsdWVzKCkgLSBlaURpcmVjdC5laWdlbnZhbHVlcygpKS50cmFuc3Bvc2UoKSA8PCAiXG4iCisgICAgICAgICAgICAgICAgPDwgImVycm9yIChlcHMpOiAgICAgICAgICAgIgorICAgICAgICAgICAgICAgIDw8IChlaVN5bW0uZWlnZW52YWx1ZXMoKSAtIGVpRGlyZWN0LmVpZ2VudmFsdWVzKCkpLm5vcm0oKSAvIGVpU3ltbS5laWdlbnZhbHVlcygpLm5vcm0oKSA8PCAiICAoIgorICAgICAgICAgICAgICAgIDw8IGVpdmFsX2VwcyA8PCAiKVxuIjsKICAgICB9Ci0gICAgaWYoc2NhbGluZzwoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpKQotICAgIHsKKyAgICBpZiAoc2NhbGluZyA8IChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCkpIHsKICAgICAgIFZFUklGWShlaURpcmVjdC5laWdlbnZhbHVlcygpLmN3aXNlQWJzKCkubWF4Q29lZmYoKSA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFZFUklGWV9JU19BUFBST1goZWlTeW1tLmVpZ2VudmFsdWVzKCkvc2NhbGluZywgZWlEaXJlY3QuZWlnZW52YWx1ZXMoKS9zY2FsaW5nKTsKLSAgICAgIFZFUklGWV9JU19BUFBST1goKG0udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogZWlEaXJlY3QuZWlnZW52ZWN0b3JzKCkpL3NjYWxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIChlaURpcmVjdC5laWdlbnZlY3RvcnMoKSAqIGVpRGlyZWN0LmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpKS9zY2FsaW5nKTsKLSAgICAgIFZFUklGWV9JU19BUFBST1gobS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuZWlnZW52YWx1ZXMoKS9zY2FsaW5nLCBlaURpcmVjdC5laWdlbnZhbHVlcygpL3NjYWxpbmcpOworICAgIH0gZWxzZSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKGVpU3ltbS5laWdlbnZhbHVlcygpIC8gc2NhbGluZywgZWlEaXJlY3QuZWlnZW52YWx1ZXMoKSAvIHNjYWxpbmcpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWCgobS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiBlaURpcmVjdC5laWdlbnZlY3RvcnMoKSkgLyBzY2FsaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAoZWlEaXJlY3QuZWlnZW52ZWN0b3JzKCkgKiBlaURpcmVjdC5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSkgLyBzY2FsaW5nKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuZWlnZW52YWx1ZXMoKSAvIHNjYWxpbmcsIGVpRGlyZWN0LmVpZ2VudmFsdWVzKCkgLyBzY2FsaW5nKTsKICAgICB9CiAKICAgICBWRVJJRllfSVNfVU5JVEFSWShlaURpcmVjdC5laWdlbnZlY3RvcnMoKSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgc2VsZmFkam9pbnRlaWdlbnNvbHZlcihjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgRWlnZW5Tb2x2ZXIuaCwgU2VsZkFkam9pbnRFaWdlblNvbHZlci5oIChhbmQgaW5kaXJlY3RseTogVHJpZGlhZ29uYWxpemF0aW9uLmgpCiAgICovCkBAIC03NywyNCArNzEsMjQgQEAKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CiAKLSAgUmVhbFNjYWxhciBsYXJnZXJFcHMgPSAxMCp0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpOworICBSZWFsU2NhbGFyIGxhcmdlckVwcyA9IDEwICogdGVzdF9wcmVjaXNpb248UmVhbFNjYWxhcj4oKTsKIAotICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKLSAgTWF0cml4VHlwZSBhMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICBNYXRyaXhUeXBlIHN5bW1BID0gIGEuYWRqb2ludCgpICogYSArIGExLmFkam9pbnQoKSAqIGExOworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgYTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgc3ltbUEgPSBhLmFkam9pbnQoKSAqIGEgKyBhMS5hZGpvaW50KCkgKiBhMTsKICAgTWF0cml4VHlwZSBzeW1tQyA9IHN5bW1BOwotICAKLSAgc3ZkX2ZpbGxfcmFuZG9tKHN5bW1BLFN5bW1ldHJpYyk7CisKKyAgc3ZkX2ZpbGxfcmFuZG9tKHN5bW1BLCBTeW1tZXRyaWMpOwogCiAgIHN5bW1BLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5VXBwZXI+KCkuc2V0WmVybygpOwogICBzeW1tQy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpLnNldFplcm8oKTsKIAotICBNYXRyaXhUeXBlIGIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKLSAgTWF0cml4VHlwZSBiMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIGIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgYjEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CiAgIE1hdHJpeFR5cGUgc3ltbUIgPSBiLmFkam9pbnQoKSAqIGIgKyBiMS5hZGpvaW50KCkgKiBiMTsKICAgc3ltbUIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlVcHBlcj4oKS5zZXRaZXJvKCk7Ci0gIAotICBDQUxMX1NVQlRFU1QoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXJfZXNzZW50aWFsX2NoZWNrKHN5bW1BKSApOworCisgIENBTExfU1VCVEVTVChzZWxmYWRqb2ludGVpZ2Vuc29sdmVyX2Vzc2VudGlhbF9jaGVjayhzeW1tQSkpOwogCiAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWlTeW1tKHN5bW1BKTsKICAgLy8gZ2VuZXJhbGl6ZWQgZWlnZW4gcGIKQEAgLTEwMywzMCArOTcsMzMgQEAKICAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhUeXBlPiBlaVN5bW1Ob0VpdmVjcyhzeW1tQSwgZmFsc2UpOwogICBWRVJJRllfSVNfRVFVQUwoZWlTeW1tTm9FaXZlY3MuaW5mbygpLCBTdWNjZXNzKTsKICAgVkVSSUZZX0lTX0FQUFJPWChlaVN5bW0uZWlnZW52YWx1ZXMoKSwgZWlTeW1tTm9FaXZlY3MuZWlnZW52YWx1ZXMoKSk7Ci0gIAorCiAgIC8vIGdlbmVyYWxpemVkIGVpZ2VuIHByb2JsZW0gQXggPSBsQngKLSAgZWlTeW1tR2VuLmNvbXB1dGUoc3ltbUMsIHN5bW1CLEF4X2xCeCk7CisgIGVpU3ltbUdlbi5jb21wdXRlKHN5bW1DLCBzeW1tQiwgQXhfbEJ4KTsKICAgVkVSSUZZX0lTX0VRVUFMKGVpU3ltbUdlbi5pbmZvKCksIFN1Y2Nlc3MpOwotICBWRVJJRlkoKHN5bW1DLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIGVpU3ltbUdlbi5laWdlbnZlY3RvcnMoKSkuaXNBcHByb3goCi0gICAgICAgICAgc3ltbUIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKGVpU3ltbUdlbi5laWdlbnZlY3RvcnMoKSAqIGVpU3ltbUdlbi5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSksIGxhcmdlckVwcykpOworICBWRVJJRlkoKHN5bW1DLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIGVpU3ltbUdlbi5laWdlbnZlY3RvcnMoKSkKKyAgICAgICAgICAgICAuaXNBcHByb3goc3ltbUIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChlaVN5bW1HZW4uZWlnZW52ZWN0b3JzKCkgKiBlaVN5bW1HZW4uZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpLAorICAgICAgICAgICAgICAgICAgICAgICBsYXJnZXJFcHMpKTsKIAogICAvLyBnZW5lcmFsaXplZCBlaWdlbiBwcm9ibGVtIEJBeCA9IGx4Ci0gIGVpU3ltbUdlbi5jb21wdXRlKHN5bW1DLCBzeW1tQixCQXhfbHgpOworICBlaVN5bW1HZW4uY29tcHV0ZShzeW1tQywgc3ltbUIsIEJBeF9seCk7CiAgIFZFUklGWV9JU19FUVVBTChlaVN5bW1HZW4uaW5mbygpLCBTdWNjZXNzKTsKLSAgVkVSSUZZKChzeW1tQi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoc3ltbUMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogZWlTeW1tR2VuLmVpZ2VudmVjdG9ycygpKSkuaXNBcHByb3goCi0gICAgICAgICAoZWlTeW1tR2VuLmVpZ2VudmVjdG9ycygpICogZWlTeW1tR2VuLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpKSwgbGFyZ2VyRXBzKSk7CisgIFZFUklGWSgKKyAgICAgIChzeW1tQi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoc3ltbUMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogZWlTeW1tR2VuLmVpZ2VudmVjdG9ycygpKSkKKyAgICAgICAgICAuaXNBcHByb3goKGVpU3ltbUdlbi5laWdlbnZlY3RvcnMoKSAqIGVpU3ltbUdlbi5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSksIGxhcmdlckVwcykpOwogCiAgIC8vIGdlbmVyYWxpemVkIGVpZ2VuIHByb2JsZW0gQUJ4ID0gbHgKLSAgZWlTeW1tR2VuLmNvbXB1dGUoc3ltbUMsIHN5bW1CLEFCeF9seCk7CisgIGVpU3ltbUdlbi5jb21wdXRlKHN5bW1DLCBzeW1tQiwgQUJ4X2x4KTsKICAgVkVSSUZZX0lTX0VRVUFMKGVpU3ltbUdlbi5pbmZvKCksIFN1Y2Nlc3MpOwotICBWRVJJRlkoKHN5bW1DLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChzeW1tQi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiBlaVN5bW1HZW4uZWlnZW52ZWN0b3JzKCkpKS5pc0FwcHJveCgKLSAgICAgICAgIChlaVN5bW1HZW4uZWlnZW52ZWN0b3JzKCkgKiBlaVN5bW1HZW4uZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpLCBsYXJnZXJFcHMpKTsKLQorICBWRVJJRlkoCisgICAgICAoc3ltbUMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHN5bW1CLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIGVpU3ltbUdlbi5laWdlbnZlY3RvcnMoKSkpCisgICAgICAgICAgLmlzQXBwcm94KChlaVN5bW1HZW4uZWlnZW52ZWN0b3JzKCkgKiBlaVN5bW1HZW4uZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkpLCBsYXJnZXJFcHMpKTsKIAogICBlaVN5bW0uY29tcHV0ZShzeW1tQyk7CiAgIE1hdHJpeFR5cGUgc3FydFN5bW1BID0gZWlTeW1tLm9wZXJhdG9yU3FydCgpOwotICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGUoc3ltbUMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKSwgc3FydFN5bW1BKnNxcnRTeW1tQSk7Ci0gIFZFUklGWV9JU19BUFBST1goc3FydFN5bW1BLCBzeW1tQy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkqZWlTeW1tLm9wZXJhdG9ySW52ZXJzZVNxcnQoKSk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShzeW1tQy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkpLCBzcXJ0U3ltbUEgKiBzcXJ0U3ltbUEpOworICBWRVJJRllfSVNfQVBQUk9YKHNxcnRTeW1tQSwgc3ltbUMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogZWlTeW1tLm9wZXJhdG9ySW52ZXJzZVNxcnQoKSk7CiAKICAgTWF0cml4VHlwZSBpZCA9IE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIGNvbHMpOwogICBWRVJJRllfSVNfQVBQUk9YKGlkLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5vcGVyYXRvck5vcm0oKSwgUmVhbFNjYWxhcigxKSk7CkBAIC0xNDcsMjkgKzE0NCwzMSBAQAogICBUcmlkaWFnb25hbGl6YXRpb248TWF0cml4VHlwZT4gdHJpZGlhZyhzeW1tQyk7CiAgIFZFUklGWV9JU19BUFBST1godHJpZGlhZy5kaWFnb25hbCgpLCB0cmlkaWFnLm1hdHJpeFQoKS5kaWFnb25hbCgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh0cmlkaWFnLnN1YkRpYWdvbmFsKCksIHRyaWRpYWcubWF0cml4VCgpLnRlbXBsYXRlIGRpYWdvbmFsPC0xPigpKTsKLSAgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBUID0gdHJpZGlhZy5tYXRyaXhUKCk7Ci0gIGlmKHJvd3M+MSAmJiBjb2xzPjEpIHsKKyAgTWF0cml4PFJlYWxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IFQgPSB0cmlkaWFnLm1hdHJpeFQoKTsKKyAgaWYgKHJvd3MgPiAxICYmIGNvbHMgPiAxKSB7CiAgICAgLy8gRklYTUUgY2hlY2sgdGhhdCB1cHBlciBhbmQgbG93ZXIgcGFydCBhcmUgMDoKLSAgICAvL1ZFUklGWShULnRvcFJpZ2h0Q29ybmVyKHJvd3MtMiwgY29scy0yKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5pc1plcm8oKSk7CisgICAgLy8gVkVSSUZZKFQudG9wUmlnaHRDb3JuZXIocm93cy0yLCBjb2xzLTIpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLmlzWmVybygpKTsKICAgfQogICBWRVJJRllfSVNfQVBQUk9YKHRyaWRpYWcuZGlhZ29uYWwoKSwgVC5kaWFnb25hbCgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh0cmlkaWFnLnN1YkRpYWdvbmFsKCksIFQudGVtcGxhdGUgZGlhZ29uYWw8MT4oKSk7Ci0gIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShzeW1tQy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkpLCB0cmlkaWFnLm1hdHJpeFEoKSAqIHRyaWRpYWcubWF0cml4VCgpLmV2YWwoKSAqIE1hdHJpeFR5cGUodHJpZGlhZy5tYXRyaXhRKCkpLmFkam9pbnQoKSk7Ci0gIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShzeW1tQy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkpLCB0cmlkaWFnLm1hdHJpeFEoKSAqIHRyaWRpYWcubWF0cml4VCgpICogdHJpZGlhZy5tYXRyaXhRKCkuYWRqb2ludCgpKTsKLSAgCisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZShzeW1tQy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkpLAorICAgICAgICAgICAgICAgICAgIHRyaWRpYWcubWF0cml4USgpICogdHJpZGlhZy5tYXRyaXhUKCkuZXZhbCgpICogTWF0cml4VHlwZSh0cmlkaWFnLm1hdHJpeFEoKSkuYWRqb2ludCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlKHN5bW1DLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSksCisgICAgICAgICAgICAgICAgICAgdHJpZGlhZy5tYXRyaXhRKCkgKiB0cmlkaWFnLm1hdHJpeFQoKSAqIHRyaWRpYWcubWF0cml4USgpLmFkam9pbnQoKSk7CisKICAgLy8gVGVzdCBjb21wdXRhdGlvbiBvZiBlaWdlbnZhbHVlcyBmcm9tIHRyaWRpYWdvbmFsIG1hdHJpeAotICBpZihyb3dzID4gMSkKLSAgeworICBpZiAocm93cyA+IDEpIHsKICAgICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpU3ltbVRyaWRpYWc7Ci0gICAgZWlTeW1tVHJpZGlhZy5jb21wdXRlRnJvbVRyaWRpYWdvbmFsKHRyaWRpYWcubWF0cml4VCgpLmRpYWdvbmFsKCksIHRyaWRpYWcubWF0cml4VCgpLmRpYWdvbmFsKC0xKSwgQ29tcHV0ZUVpZ2VudmVjdG9ycyk7CisgICAgZWlTeW1tVHJpZGlhZy5jb21wdXRlRnJvbVRyaWRpYWdvbmFsKHRyaWRpYWcubWF0cml4VCgpLmRpYWdvbmFsKCksIHRyaWRpYWcubWF0cml4VCgpLmRpYWdvbmFsKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZUVpZ2VudmVjdG9ycyk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChlaVN5bW0uZWlnZW52YWx1ZXMoKSwgZWlTeW1tVHJpZGlhZy5laWdlbnZhbHVlcygpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHRyaWRpYWcubWF0cml4VCgpLCBlaVN5bW1UcmlkaWFnLmVpZ2VudmVjdG9ycygpLnJlYWwoKSAqIGVpU3ltbVRyaWRpYWcuZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCkgKiBlaVN5bW1UcmlkaWFnLmVpZ2VudmVjdG9ycygpLnJlYWwoKS50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh0cmlkaWFnLm1hdHJpeFQoKSwgZWlTeW1tVHJpZGlhZy5laWdlbnZlY3RvcnMoKS5yZWFsKCkgKiBlaVN5bW1UcmlkaWFnLmVpZ2VudmFsdWVzKCkuYXNEaWFnb25hbCgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWlTeW1tVHJpZGlhZy5laWdlbnZlY3RvcnMoKS5yZWFsKCkudHJhbnNwb3NlKCkpOwogICB9CiAKLSAgaWYgKHJvd3MgPiAxICYmIHJvd3MgPCAyMCkKLSAgeworICBpZiAocm93cyA+IDEgJiYgcm93cyA8IDIwKSB7CiAgICAgLy8gVGVzdCBtYXRyaXggd2l0aCBOYU4KLSAgICBzeW1tQygwLDApID0gc3RkOjpudW1lcmljX2xpbWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyPjo6cXVpZXRfTmFOKCk7CisgICAgc3ltbUMoMCwgMCkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXI+OjpxdWlldF9OYU4oKTsKICAgICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFR5cGU+IGVpU3ltbU5hTihzeW1tQyk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKGVpU3ltbU5hTi5pbmZvKCksIE5vQ29udmVyZ2VuY2UpOwogICB9CkBAIC0xODUsOTcgKzE4NCw4NiBAQAogICAgIGEuc2V0WmVybygpOwogICAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4VHlwZT4gZWkzKGEpOwogICAgIFZFUklGWV9JU19FUVVBTChlaTMuaW5mbygpLCBTdWNjZXNzKTsKLSAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oZWkzLmVpZ2VudmFsdWVzKCkubm9ybSgpLFJlYWxTY2FsYXIoMSkpOwotICAgIFZFUklGWSgoZWkzLmVpZ2VudmVjdG9ycygpLnRyYW5zcG9zZSgpKmVpMy5laWdlbnZlY3RvcnMoKS50cmFuc3Bvc2UoKSkuZXZhbCgpLmlzSWRlbnRpdHkoKSk7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGVpMy5laWdlbnZhbHVlcygpLm5vcm0oKSwgUmVhbFNjYWxhcigxKSk7CisgICAgVkVSSUZZKChlaTMuZWlnZW52ZWN0b3JzKCkudHJhbnNwb3NlKCkgKiBlaTMuZWlnZW52ZWN0b3JzKCkudHJhbnNwb3NlKCkpLmV2YWwoKS5pc0lkZW50aXR5KCkpOwogICB9CiB9CiAKLXRlbXBsYXRlPGludD4KLXZvaWQgYnVnXzg1NCgpCi17Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCBidWdfODU0KCkgewogICBNYXRyaXgzZCBtOwotICBtIDw8IDg1MC45NjEsIDUxLjk2NiwgMCwKLSAgICAgICA1MS45NjYsIDI1NC44NDEsIDAsCi0gICAgICAgICAgICAwLCAgICAgICAwLCAwOworICBtIDw8IDg1MC45NjEsIDUxLjk2NiwgMCwgNTEuOTY2LCAyNTQuODQxLCAwLCAwLCAwLCAwOwogICBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyX2Vzc2VudGlhbF9jaGVjayhtKTsKIH0KIAotdGVtcGxhdGU8aW50Pgotdm9pZCBidWdfMTAxNCgpCi17Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCBidWdfMTAxNCgpIHsKICAgTWF0cml4M2QgbTsKLSAgbSA8PCAgICAgICAgMC4xMTExMTExMTExMTExMTExNDY1OCwgMCwgMCwKLSAgICAgICAwLCAgICAgMC4xMTExMTExMTExMTExMTEwOTEwNywgMCwKLSAgICAgICAwLCAwLCAgMC4xMTExMTExMTExMTExMTEwNzcxOTsKKyAgbSA8PCAwLjExMTExMTExMTExMTExMTE0NjU4LCAwLCAwLCAwLCAwLjExMTExMTExMTExMTExMTA5MTA3LCAwLCAwLCAwLCAwLjExMTExMTExMTExMTExMTA3NzE5OwogICBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyX2Vzc2VudGlhbF9jaGVjayhtKTsKIH0KIAotdGVtcGxhdGU8aW50Pgotdm9pZCBidWdfMTIyNSgpCi17Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCBidWdfMTIyNSgpIHsKICAgTWF0cml4M2QgbTEsIG0yOwogICBtMS5zZXRSYW5kb20oKTsKLSAgbTEgPSBtMSptMS50cmFuc3Bvc2UoKTsKKyAgbTEgPSBtMSAqIG0xLnRyYW5zcG9zZSgpOwogICBtMiA9IG0xLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOwogICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeDNkPiBlaWcxKG0xKTsKICAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXgzZD4gZWlnMihtMi5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkpOwogICBWRVJJRllfSVNfQVBQUk9YKGVpZzEuZWlnZW52YWx1ZXMoKSwgZWlnMi5laWdlbnZhbHVlcygpKTsKIH0KIAotdGVtcGxhdGU8aW50Pgotdm9pZCBidWdfMTIwNCgpCi17Ci0gIFNwYXJzZU1hdHJpeDxkb3VibGU+IEEoMiwyKTsKK3RlbXBsYXRlIDxpbnQ+Cit2b2lkIGJ1Z18xMjA0KCkgeworICBTcGFyc2VNYXRyaXg8ZG91YmxlPiBBKDIsIDIpOwogICBBLnNldElkZW50aXR5KCk7CiAgIFNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8RWlnZW46OlNwYXJzZU1hdHJpeDxkb3VibGU+ID4gZWlnKEEpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoZWlnZW5zb2x2ZXJfc2VsZmFkam9pbnQpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoZWlnZW5zb2x2ZXJfc2VsZmFkam9pbnQpIHsKICAgaW50IHMgPSAwOwotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewogICAgIC8vIHRyaXZpYWwgdGVzdCBmb3IgMXgxIG1hdHJpY2VzOgotICAgIENBTExfU1VCVEVTVF8xKCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOwotICAgIENBTExfU1VCVEVTVF8xKCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDxkb3VibGUsIDEsIDE+KCkpKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8xKHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4PGRvdWJsZSwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8xKHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCAxLCAxPigpKSk7CiAKICAgICAvLyB2ZXJ5IGltcG9ydGFudCB0byB0ZXN0IDN4MyBhbmQgMngyIG1hdHJpY2VzIHNpbmNlIHdlIHByb3ZpZGUgc3BlY2lhbCBwYXRocyBmb3IgdGhlbQotICAgIENBTExfU1VCVEVTVF8xMiggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXgyZigpKSApOwotICAgIENBTExfU1VCVEVTVF8xMiggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXgyZCgpKSApOwotICAgIENBTExfU1VCVEVTVF8xMiggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXgyY2QoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMTMoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4M2YoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMTMoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4M2QoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMTMoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4M2NkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXg0Y2QoKSkgKTsKLSAgICAKLSAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS80KTsKLSAgICBDQUxMX1NVQlRFU1RfMyggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXhYZihzLHMpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeFhkKHMscykpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4WGNkKHMscykpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzkoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4ocyxzKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMTIoc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXgyZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEyKHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4MmQoKSkpOworICAgIENBTExfU1VCVEVTVF8xMihzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDJjZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEzKHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4M2YoKSkpOworICAgIENBTExfU1VCVEVTVF8xMyhzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDNkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTMoc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXgzY2QoKSkpOworICAgIENBTExfU1VCVEVTVF8yKHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4NGQoKSkpOworICAgIENBTExfU1VCVEVTVF8yKHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4NGNkKCkpKTsKKworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDQpOworICAgIENBTExfU1VCVEVTVF8zKHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4WGYocywgcykpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeFhkKHMsIHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXhYY2QocywgcykpKTsKKyAgICBDQUxMX1NVQlRFU1RfOShzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+KHMsIHMpKSk7CiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQogCiAgICAgLy8gc29tZSB0cml2aWFsIGJ1dCBpbXBsZW1lbnRhdGlvbi13aXNlIHRyaWNreSBjYXNlcwotICAgIENBTExfU1VCVEVTVF80KCBzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeFhkKDEsMSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4WGQoMiwyKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXhYY2QoMSwxKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXhYY2QoMiwyKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXg8ZG91YmxlLDEsMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNyggc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXg8ZG91YmxlLDIsMj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNChzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeFhkKDEsIDEpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXhYZCgyLCAyKSkpOworICAgIENBTExfU1VCVEVTVF81KHNlbGZhZGpvaW50ZWlnZW5zb2x2ZXIoTWF0cml4WGNkKDEsIDEpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoc2VsZmFkam9pbnRlaWdlbnNvbHZlcihNYXRyaXhYY2QoMiwgMikpKTsKKyAgICBDQUxMX1NVQlRFU1RfNihzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDxkb3VibGUsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNyhzZWxmYWRqb2ludGVpZ2Vuc29sdmVyKE1hdHJpeDxkb3VibGUsIDIsIDI+KCkpKTsKICAgfQotICAKLSAgQ0FMTF9TVUJURVNUXzEzKCBidWdfODU0PDA+KCkgKTsKLSAgQ0FMTF9TVUJURVNUXzEzKCBidWdfMTAxNDwwPigpICk7Ci0gIENBTExfU1VCVEVTVF8xMyggYnVnXzEyMDQ8MD4oKSApOwotICBDQUxMX1NVQlRFU1RfMTMoIGJ1Z18xMjI1PDA+KCkgKTsKKworICBDQUxMX1NVQlRFU1RfMTMoYnVnXzg1NDwwPigpKTsKKyAgQ0FMTF9TVUJURVNUXzEzKGJ1Z18xMDE0PDA+KCkpOworICBDQUxMX1NVQlRFU1RfMTMoYnVnXzEyMDQ8MD4oKSk7CisgIENBTExfU1VCVEVTVF8xMyhidWdfMTIyNTwwPigpKTsKIAogICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKLSAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvNCk7CisgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDQpOwogICBDQUxMX1NVQlRFU1RfOChTZWxmQWRqb2ludEVpZ2VuU29sdmVyPE1hdHJpeFhmPiB0bXAxKHMpKTsKICAgQ0FMTF9TVUJURVNUXzgoVHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFhmPiB0bXAyKHMpKTsKLSAgCisKICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQogfQotCmRpZmYgLS1naXQgYS90ZXN0L2V2YWx1YXRvcnMuY3BwIGIvdGVzdC9ldmFsdWF0b3JzLmNwcAppbmRleCAwZjliNmY4Li5kOTZhMGExIDEwMDY0NAotLS0gYS90ZXN0L2V2YWx1YXRvcnMuY3BwCisrKyBiL3Rlc3QvZXZhbHVhdG9ycy5jcHAKQEAgLTMsMTEyICszLDEwNSBAQAogCiBuYW1lc3BhY2UgRWlnZW4gewogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIExocyx0eXBlbmFtZSBSaHM+Ci0gIGNvbnN0IFByb2R1Y3Q8TGhzLFJocz4KLSAgcHJvZChjb25zdCBMaHMmIGxocywgY29uc3QgUmhzJiByaHMpCi0gIHsKLSAgICByZXR1cm4gUHJvZHVjdDxMaHMsUmhzPihsaHMscmhzKTsKLSAgfQotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIExocyx0eXBlbmFtZSBSaHM+Ci0gIGNvbnN0IFByb2R1Y3Q8TGhzLFJocyxMYXp5UHJvZHVjdD4KLSAgbGF6eXByb2QoY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKQotICB7Ci0gICAgcmV0dXJuIFByb2R1Y3Q8TGhzLFJocyxMYXp5UHJvZHVjdD4obGhzLHJocyk7Ci0gIH0KLSAgCi0gIHRlbXBsYXRlPHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwclR5cGU+Ci0gIEVJR0VOX1NUUk9OR19JTkxJTkUKLSAgRHN0WHByVHlwZSYgY29weV91c2luZ19ldmFsdWF0b3IoY29uc3QgRWlnZW5CYXNlPERzdFhwclR5cGU+ICZkc3QsIGNvbnN0IFNyY1hwclR5cGUgJnNyYykKLSAgewotICAgIGNhbGxfYXNzaWdubWVudChkc3QuY29uc3RfY2FzdF9kZXJpdmVkKCksIHNyYy5kZXJpdmVkKCksIGludGVybmFsOjphc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4oKSk7Ci0gICAgcmV0dXJuIGRzdC5jb25zdF9jYXN0X2Rlcml2ZWQoKTsKLSAgfQotICAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBTdG9yYWdlQmFzZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KLSAgRUlHRU5fU1RST05HX0lOTElORQotICBjb25zdCBEc3RYcHJUeXBlJiBjb3B5X3VzaW5nX2V2YWx1YXRvcihjb25zdCBOb0FsaWFzPERzdFhwclR5cGUsIFN0b3JhZ2VCYXNlPiYgZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMpCi0gIHsKLSAgICBjYWxsX2Fzc2lnbm1lbnQoZHN0LCBzcmMuZGVyaXZlZCgpLCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+KCkpOwotICAgIHJldHVybiBkc3QuZXhwcmVzc2lvbigpOwotICB9Ci0gIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlPgotICBFSUdFTl9TVFJPTkdfSU5MSU5FCi0gIERzdFhwclR5cGUmIGNvcHlfdXNpbmdfZXZhbHVhdG9yKGNvbnN0IFBsYWluT2JqZWN0QmFzZTxEc3RYcHJUeXBlPiAmZHN0LCBjb25zdCBTcmNYcHJUeXBlICZzcmMpCi0gIHsKLSAgICAjaWZkZWYgRUlHRU5fTk9fQVVUT01BVElDX1JFU0laSU5HCi0gICAgZWlnZW5fYXNzZXJ0KChkc3Quc2l6ZSgpPT0wIHx8IChJc1ZlY3RvckF0Q29tcGlsZVRpbWUgPyAoZHN0LnNpemUoKSA9PSBzcmMuc2l6ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGRzdC5yb3dzKCkgPT0gc3JjLnJvd3MoKSAmJiBkc3QuY29scygpID09IHNyYy5jb2xzKCkpKSkKLSAgICAgICAgICAgICAgICAmJiAiU2l6ZSBtaXNtYXRjaC4gQXV0b21hdGljIHJlc2l6aW5nIGlzIGRpc2FibGVkIGJlY2F1c2UgRUlHRU5fTk9fQVVUT01BVElDX1JFU0laSU5HIGlzIGRlZmluZWQiKTsKLSAgI2Vsc2UKLSAgICBkc3QuY29uc3RfY2FzdF9kZXJpdmVkKCkucmVzaXplTGlrZShzcmMuZGVyaXZlZCgpKTsKLSAgI2VuZGlmCi0gICAgCi0gICAgY2FsbF9hc3NpZ25tZW50KGRzdC5jb25zdF9jYXN0X2Rlcml2ZWQoKSwgc3JjLmRlcml2ZWQoKSwgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIsdHlwZW5hbWUgU3JjWHByVHlwZTo6U2NhbGFyPigpKTsKLSAgICByZXR1cm4gZHN0LmNvbnN0X2Nhc3RfZGVyaXZlZCgpOwotICB9Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KLSAgdm9pZCBhZGRfYXNzaWduX3VzaW5nX2V2YWx1YXRvcihjb25zdCBEc3RYcHJUeXBlJiBkc3QsIGNvbnN0IFNyY1hwclR5cGUmIHNyYykKLSAgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKLSAgICBjYWxsX2Fzc2lnbm1lbnQoY29uc3RfY2FzdDxEc3RYcHJUeXBlJj4oZHN0KSwgc3JjLmRlcml2ZWQoKSwgaW50ZXJuYWw6OmFkZF9hc3NpZ25fb3A8U2NhbGFyLHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4oKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlPgotICB2b2lkIHN1YnRyYWN0X2Fzc2lnbl91c2luZ19ldmFsdWF0b3IoY29uc3QgRHN0WHByVHlwZSYgZHN0LCBjb25zdCBTcmNYcHJUeXBlJiBzcmMpCi0gIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhciBTY2FsYXI7Ci0gICAgY2FsbF9hc3NpZ25tZW50KGNvbnN0X2Nhc3Q8RHN0WHByVHlwZSY+KGRzdCksIHNyYy5kZXJpdmVkKCksIGludGVybmFsOjpzdWJfYXNzaWduX29wPFNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+KCkpOwotICB9Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KLSAgdm9pZCBtdWx0aXBseV9hc3NpZ25fdXNpbmdfZXZhbHVhdG9yKGNvbnN0IERzdFhwclR5cGUmIGRzdCwgY29uc3QgU3JjWHByVHlwZSYgc3JjKQotICB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBEc3RYcHJUeXBlOjpTY2FsYXIgU2NhbGFyOwotICAgIGNhbGxfYXNzaWdubWVudChkc3QuY29uc3RfY2FzdF9kZXJpdmVkKCksIHNyYy5kZXJpdmVkKCksIGludGVybmFsOjptdWxfYXNzaWduX29wPFNjYWxhcix0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+KCkpOwotICB9Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KLSAgdm9pZCBkaXZpZGVfYXNzaWduX3VzaW5nX2V2YWx1YXRvcihjb25zdCBEc3RYcHJUeXBlJiBkc3QsIGNvbnN0IFNyY1hwclR5cGUmIHNyYykKLSAgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKLSAgICBjYWxsX2Fzc2lnbm1lbnQoZHN0LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLCBzcmMuZGVyaXZlZCgpLCBpbnRlcm5hbDo6ZGl2X2Fzc2lnbl9vcDxTY2FsYXIsdHlwZW5hbWUgU3JjWHByVHlwZTo6U2NhbGFyPigpKTsKLSAgfQotICAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0WHByVHlwZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KLSAgdm9pZCBzd2FwX3VzaW5nX2V2YWx1YXRvcihjb25zdCBEc3RYcHJUeXBlJiBkc3QsIGNvbnN0IFNyY1hwclR5cGUmIHNyYykKLSAgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKLSAgICBjYWxsX2Fzc2lnbm1lbnQoZHN0LmNvbnN0X2Nhc3RfZGVyaXZlZCgpLCBzcmMuY29uc3RfY2FzdF9kZXJpdmVkKCksIGludGVybmFsOjpzd2FwX2Fzc2lnbl9vcDxTY2FsYXI+KCkpOwotICB9Ci0KLSAgbmFtZXNwYWNlIGludGVybmFsIHsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEc3QsIHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgU3RvcmFnZUJhc2UsIHR5cGVuYW1lIFNyYywgdHlwZW5hbWUgRnVuYz4KLSAgICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIGNhbGxfYXNzaWdubWVudChjb25zdCBOb0FsaWFzPERzdCxTdG9yYWdlQmFzZT4mIGRzdCwgY29uc3QgU3JjJiBzcmMsIGNvbnN0IEZ1bmMmIGZ1bmMpCi0gICAgewotICAgICAgY2FsbF9hc3NpZ25tZW50X25vX2FsaWFzKGRzdC5leHByZXNzaW9uKCksIHNyYywgZnVuYyk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgRHN0LCB0ZW1wbGF0ZSA8dHlwZW5hbWU+IGNsYXNzIFN0b3JhZ2VCYXNlLCB0eXBlbmFtZSBTcmMsIHR5cGVuYW1lIEZ1bmM+Ci0gICAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBjYWxsX3Jlc3RyaWN0ZWRfcGFja2V0X2Fzc2lnbm1lbnQoY29uc3QgTm9BbGlhczxEc3QsU3RvcmFnZUJhc2U+JiBkc3QsIGNvbnN0IFNyYyYgc3JjLCBjb25zdCBGdW5jJiBmdW5jKQotICAgIHsKLSAgICAgIGNhbGxfcmVzdHJpY3RlZF9wYWNrZXRfYXNzaWdubWVudF9ub19hbGlhcyhkc3QuZXhwcmVzc2lvbigpLCBzcmMsIGZ1bmMpOwotICAgIH0KLSAgfQotICAKK3RlbXBsYXRlIDx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK2NvbnN0IFByb2R1Y3Q8TGhzLCBSaHM+IHByb2QoY29uc3QgTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKSB7CisgIHJldHVybiBQcm9kdWN0PExocywgUmhzPihsaHMsIHJocyk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+IGxvbmcgZ2V0X2Nvc3QoY29uc3QgWHByVHlwZSYgKSB7IHJldHVybiBFaWdlbjo6aW50ZXJuYWw6OmV2YWx1YXRvcjxYcHJUeXBlPjo6Q29lZmZSZWFkQ29zdDsgfQordGVtcGxhdGUgPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgorY29uc3QgUHJvZHVjdDxMaHMsIFJocywgTGF6eVByb2R1Y3Q+IGxhenlwcm9kKGNvbnN0IExocyYgbGhzLCBjb25zdCBSaHMmIHJocykgeworICByZXR1cm4gUHJvZHVjdDxMaHMsIFJocywgTGF6eVByb2R1Y3Q+KGxocywgcmhzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwclR5cGU+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERzdFhwclR5cGUmIGNvcHlfdXNpbmdfZXZhbHVhdG9yKGNvbnN0IEVpZ2VuQmFzZTxEc3RYcHJUeXBlPiYgZHN0LCBjb25zdCBTcmNYcHJUeXBlJiBzcmMpIHsKKyAgY2FsbF9hc3NpZ25tZW50KGRzdC5jb25zdF9jYXN0X2Rlcml2ZWQoKSwgc3JjLmRlcml2ZWQoKSwKKyAgICAgICAgICAgICAgICAgIGludGVybmFsOjphc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLCB0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+KCkpOworICByZXR1cm4gZHN0LmNvbnN0X2Nhc3RfZGVyaXZlZCgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0WHByVHlwZSwgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBTdG9yYWdlQmFzZSwgdHlwZW5hbWUgU3JjWHByVHlwZT4KK0VJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgRHN0WHByVHlwZSYgY29weV91c2luZ19ldmFsdWF0b3IoY29uc3QgTm9BbGlhczxEc3RYcHJUeXBlLCBTdG9yYWdlQmFzZT4mIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3JjWHByVHlwZSYgc3JjKSB7CisgIGNhbGxfYXNzaWdubWVudChkc3QsIHNyYy5kZXJpdmVkKCksIGludGVybmFsOjphc3NpZ25fb3A8dHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyLCB0eXBlbmFtZSBTcmNYcHJUeXBlOjpTY2FsYXI+KCkpOworICByZXR1cm4gZHN0LmV4cHJlc3Npb24oKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwclR5cGU+CitFSUdFTl9TVFJPTkdfSU5MSU5FIERzdFhwclR5cGUmIGNvcHlfdXNpbmdfZXZhbHVhdG9yKGNvbnN0IFBsYWluT2JqZWN0QmFzZTxEc3RYcHJUeXBlPiYgZHN0LCBjb25zdCBTcmNYcHJUeXBlJiBzcmMpIHsKKyNpZmRlZiBFSUdFTl9OT19BVVRPTUFUSUNfUkVTSVpJTkcKKyAgZWlnZW5fYXNzZXJ0KChkc3Quc2l6ZSgpID09IDAgfHwgKElzVmVjdG9yQXRDb21waWxlVGltZSA/IChkc3Quc2l6ZSgpID09IHNyYy5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZHN0LnJvd3MoKSA9PSBzcmMucm93cygpICYmIGRzdC5jb2xzKCkgPT0gc3JjLmNvbHMoKSkpKSAmJgorICAgICAgICAgICAgICAgIlNpemUgbWlzbWF0Y2guIEF1dG9tYXRpYyByZXNpemluZyBpcyBkaXNhYmxlZCBiZWNhdXNlIEVJR0VOX05PX0FVVE9NQVRJQ19SRVNJWklORyBpcyBkZWZpbmVkIik7CisjZWxzZQorICBkc3QuY29uc3RfY2FzdF9kZXJpdmVkKCkucmVzaXplTGlrZShzcmMuZGVyaXZlZCgpKTsKKyNlbmRpZgorCisgIGNhbGxfYXNzaWdubWVudChkc3QuY29uc3RfY2FzdF9kZXJpdmVkKCksIHNyYy5kZXJpdmVkKCksCisgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdFhwclR5cGU6OlNjYWxhciwgdHlwZW5hbWUgU3JjWHByVHlwZTo6U2NhbGFyPigpKTsKKyAgcmV0dXJuIGRzdC5jb25zdF9jYXN0X2Rlcml2ZWQoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwclR5cGU+Cit2b2lkIGFkZF9hc3NpZ25fdXNpbmdfZXZhbHVhdG9yKGNvbnN0IERzdFhwclR5cGUmIGRzdCwgY29uc3QgU3JjWHByVHlwZSYgc3JjKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgY2FsbF9hc3NpZ25tZW50KGNvbnN0X2Nhc3Q8RHN0WHByVHlwZSY+KGRzdCksIHNyYy5kZXJpdmVkKCksCisgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6YWRkX2Fzc2lnbl9vcDxTY2FsYXIsIHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4oKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlPgordm9pZCBzdWJ0cmFjdF9hc3NpZ25fdXNpbmdfZXZhbHVhdG9yKGNvbnN0IERzdFhwclR5cGUmIGRzdCwgY29uc3QgU3JjWHByVHlwZSYgc3JjKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgY2FsbF9hc3NpZ25tZW50KGNvbnN0X2Nhc3Q8RHN0WHByVHlwZSY+KGRzdCksIHNyYy5kZXJpdmVkKCksCisgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6c3ViX2Fzc2lnbl9vcDxTY2FsYXIsIHR5cGVuYW1lIFNyY1hwclR5cGU6OlNjYWxhcj4oKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEc3RYcHJUeXBlLCB0eXBlbmFtZSBTcmNYcHJUeXBlPgordm9pZCBtdWx0aXBseV9hc3NpZ25fdXNpbmdfZXZhbHVhdG9yKGNvbnN0IERzdFhwclR5cGUmIGRzdCwgY29uc3QgU3JjWHByVHlwZSYgc3JjKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgY2FsbF9hc3NpZ25tZW50KGRzdC5jb25zdF9jYXN0X2Rlcml2ZWQoKSwgc3JjLmRlcml2ZWQoKSwKKyAgICAgICAgICAgICAgICAgIGludGVybmFsOjptdWxfYXNzaWduX29wPFNjYWxhciwgdHlwZW5hbWUgU3JjWHByVHlwZTo6U2NhbGFyPigpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwclR5cGU+Cit2b2lkIGRpdmlkZV9hc3NpZ25fdXNpbmdfZXZhbHVhdG9yKGNvbnN0IERzdFhwclR5cGUmIGRzdCwgY29uc3QgU3JjWHByVHlwZSYgc3JjKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgY2FsbF9hc3NpZ25tZW50KGRzdC5jb25zdF9jYXN0X2Rlcml2ZWQoKSwgc3JjLmRlcml2ZWQoKSwKKyAgICAgICAgICAgICAgICAgIGludGVybmFsOjpkaXZfYXNzaWduX29wPFNjYWxhciwgdHlwZW5hbWUgU3JjWHByVHlwZTo6U2NhbGFyPigpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERzdFhwclR5cGUsIHR5cGVuYW1lIFNyY1hwclR5cGU+Cit2b2lkIHN3YXBfdXNpbmdfZXZhbHVhdG9yKGNvbnN0IERzdFhwclR5cGUmIGRzdCwgY29uc3QgU3JjWHByVHlwZSYgc3JjKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgRHN0WHByVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgY2FsbF9hc3NpZ25tZW50KGRzdC5jb25zdF9jYXN0X2Rlcml2ZWQoKSwgc3JjLmNvbnN0X2Nhc3RfZGVyaXZlZCgpLCBpbnRlcm5hbDo6c3dhcF9hc3NpZ25fb3A8U2NhbGFyPigpKTsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEc3QsIHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgU3RvcmFnZUJhc2UsIHR5cGVuYW1lIFNyYywgdHlwZW5hbWUgRnVuYz4KK0VJR0VOX0RFVklDRV9GVU5DIHZvaWQgY2FsbF9hc3NpZ25tZW50KGNvbnN0IE5vQWxpYXM8RHN0LCBTdG9yYWdlQmFzZT4mIGRzdCwgY29uc3QgU3JjJiBzcmMsIGNvbnN0IEZ1bmMmIGZ1bmMpIHsKKyAgY2FsbF9hc3NpZ25tZW50X25vX2FsaWFzKGRzdC5leHByZXNzaW9uKCksIHNyYywgZnVuYyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEc3QsIHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgU3RvcmFnZUJhc2UsIHR5cGVuYW1lIFNyYywgdHlwZW5hbWUgRnVuYz4KK0VJR0VOX0RFVklDRV9GVU5DIHZvaWQgY2FsbF9yZXN0cmljdGVkX3BhY2tldF9hc3NpZ25tZW50KGNvbnN0IE5vQWxpYXM8RHN0LCBTdG9yYWdlQmFzZT4mIGRzdCwgY29uc3QgU3JjJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jJiBmdW5jKSB7CisgIGNhbGxfcmVzdHJpY3RlZF9wYWNrZXRfYXNzaWdubWVudF9ub19hbGlhcyhkc3QuZXhwcmVzc2lvbigpLCBzcmMsIGZ1bmMpOworfQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgWHByVHlwZT4KK2xvbmcgZ2V0X2Nvc3QoY29uc3QgWHByVHlwZSYpIHsKKyAgcmV0dXJuIEVpZ2VuOjppbnRlcm5hbDo6ZXZhbHVhdG9yPFhwclR5cGU+OjpDb2VmZlJlYWRDb3N0OworfQogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi0jZGVmaW5lIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKERFU1QsRVhQUikgVkVSSUZZX0lTX0FQUFJPWChjb3B5X3VzaW5nX2V2YWx1YXRvcihERVNULChFWFBSKSksIChFWFBSKS5ldmFsKCkpOwotI2RlZmluZSBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIoREVTVCxFWFBSLFJFRikgVkVSSUZZX0lTX0FQUFJPWChjb3B5X3VzaW5nX2V2YWx1YXRvcihERVNULChFWFBSKSksIChSRUYpLmV2YWwoKSk7CisjZGVmaW5lIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKERFU1QsIEVYUFIpIFZFUklGWV9JU19BUFBST1goY29weV91c2luZ19ldmFsdWF0b3IoREVTVCwgKEVYUFIpKSwgKEVYUFIpLmV2YWwoKSk7CisjZGVmaW5lIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihERVNULCBFWFBSLCBSRUYpIFZFUklGWV9JU19BUFBST1goY29weV91c2luZ19ldmFsdWF0b3IoREVTVCwgKEVYUFIpKSwgKFJFRikuZXZhbCgpKTsKIAotRUlHRU5fREVDTEFSRV9URVNUKGV2YWx1YXRvcnMpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoZXZhbHVhdG9ycykgewogICAvLyBUZXN0aW5nIE1hdHJpeCBldmFsdWF0b3IgYW5kIFRyYW5zcG9zZQogICBWZWN0b3IyZCB2ID0gVmVjdG9yMmQ6OlJhbmRvbSgpOwogICBjb25zdCBWZWN0b3IyZCB2X2NvbnN0KHYpOwpAQCAtMTE5LDIwICsxMTIsMjAgQEAKICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IodjIsIHZfY29uc3QpOwogCiAgIC8vIFRlc3RpbmcgVHJhbnNwb3NlCi0gIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKHcsIHYudHJhbnNwb3NlKCkpOyAvLyBUcmFuc3Bvc2UgYXMgcnZhbHVlCisgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKHcsIHYudHJhbnNwb3NlKCkpOyAgLy8gVHJhbnNwb3NlIGFzIHJ2YWx1ZQogICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUih3LCB2X2NvbnN0LnRyYW5zcG9zZSgpKTsKIAotICBjb3B5X3VzaW5nX2V2YWx1YXRvcih3LnRyYW5zcG9zZSgpLCB2KTsgLy8gVHJhbnNwb3NlIGFzIGx2YWx1ZQotICBWRVJJRllfSVNfQVBQUk9YKHcsdi50cmFuc3Bvc2UoKS5ldmFsKCkpOworICBjb3B5X3VzaW5nX2V2YWx1YXRvcih3LnRyYW5zcG9zZSgpLCB2KTsgIC8vIFRyYW5zcG9zZSBhcyBsdmFsdWUKKyAgVkVSSUZZX0lTX0FQUFJPWCh3LCB2LnRyYW5zcG9zZSgpLmV2YWwoKSk7CiAKICAgY29weV91c2luZ19ldmFsdWF0b3Iody50cmFuc3Bvc2UoKSwgdl9jb25zdCk7Ci0gIFZFUklGWV9JU19BUFBST1godyx2X2NvbnN0LnRyYW5zcG9zZSgpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1godywgdl9jb25zdC50cmFuc3Bvc2UoKS5ldmFsKCkpOwogCiAgIC8vIFRlc3RpbmcgQXJyYXkgZXZhbHVhdG9yCiAgIHsKLSAgICBBcnJheVhYZiBhKDIsMyk7Ci0gICAgQXJyYXlYWGYgYigzLDIpOwotICAgIGEgPDwgMSwyLDMsIDQsNSw2OworICAgIEFycmF5WFhmIGEoMiwgMyk7CisgICAgQXJyYXlYWGYgYigzLCAyKTsKKyAgICBhIDw8IDEsIDIsIDMsIDQsIDUsIDY7CiAgICAgY29uc3QgQXJyYXlYWGYgYV9jb25zdChhKTsKIAogICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGIsIGEudHJhbnNwb3NlKCkpOwpAQCAtMTQxLDk5ICsxMzQsMTA4IEBACiAKICAgICAvLyBUZXN0aW5nIEN3aXNlTnVsbGFyeU9wIGV2YWx1YXRvcgogICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yKHcsIFJvd1ZlY3RvcjJkOjpSYW5kb20oKSk7Ci0gICAgVkVSSUZZKCh3LmFycmF5KCkgPj0gLTEpLmFsbCgpICYmICh3LmFycmF5KCkgPD0gMSkuYWxsKCkpOyAvLyBub3QgZWFzeSB0byB0ZXN0IC4uLgorICAgIFZFUklGWSgody5hcnJheSgpID49IC0xKS5hbGwoKSAmJiAody5hcnJheSgpIDw9IDEpLmFsbCgpKTsgIC8vIG5vdCBlYXN5IHRvIHRlc3QgLi4uCiAKICAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUih3LCBSb3dWZWN0b3IyZDo6WmVybygpKTsKIAogICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKHcsIFJvd1ZlY3RvcjJkOjpDb25zdGFudCgzKSk7Ci0gICAgCisKICAgICAvLyBtaXggQ3dpc2VOdWxsYXJ5T3AgYW5kIHRyYW5zcG9zZQogICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKHcsIFZlY3RvcjJkOjpaZXJvKCkudHJhbnNwb3NlKCkpOwogICB9CiAKICAgewogICAgIC8vIHRlc3QgcHJvZHVjdCBleHByZXNzaW9ucwotICAgIGludCBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTAwKTsKLSAgICBNYXRyaXhYZiBhKHMscyksIGIocyxzKSwgYyhzLHMpLCBkKHMscyk7CisgICAgaW50IHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTAwKTsKKyAgICBNYXRyaXhYZiBhKHMsIHMpLCBiKHMsIHMpLCBjKHMsIHMpLCBkKHMsIHMpOwogICAgIGEuc2V0UmFuZG9tKCk7CiAgICAgYi5zZXRSYW5kb20oKTsKICAgICBjLnNldFJhbmRvbSgpOwogICAgIGQuc2V0UmFuZG9tKCk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IoZCwgKGEgKyBiKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IoZCwgKGEgKyBiKS50cmFuc3Bvc2UoKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKGQsIHByb2QoYSxiKSwgYSpiKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIoZC5ub2FsaWFzKCksIHByb2QoYSxiKSwgYSpiKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIoZCwgcHJvZChhLGIpICsgYywgYSpiICsgYyk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKGQsIHMgKiBwcm9kKGEsYiksIHMgKiBhKmIpOwotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihkLCBwcm9kKGEsYikudHJhbnNwb3NlKCksIChhKmIpLnRyYW5zcG9zZSgpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIoZCwgcHJvZChhLGIpICsgcHJvZChiLGMpLCBhKmIgKyBiKmMpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihkLCBwcm9kKGEsIGIpLCBhICogYik7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKGQubm9hbGlhcygpLCBwcm9kKGEsIGIpLCBhICogYik7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKGQsIHByb2QoYSwgYikgKyBjLCBhICogYiArIGMpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihkLCBzICogcHJvZChhLCBiKSwgcyAqIGEgKiBiKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIoZCwgcHJvZChhLCBiKS50cmFuc3Bvc2UoKSwgKGEgKiBiKS50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKGQsIHByb2QoYSwgYikgKyBwcm9kKGIsIGMpLCBhICogYiArIGIgKiBjKTsKIAogICAgIC8vIGNoZWNrIHRoYXQgcHJvZCB3b3JrcyBldmVuIHdpdGggYWxpYXNpbmcgcHJlc2VudAotICAgIGMgPSBhKmE7Ci0gICAgY29weV91c2luZ19ldmFsdWF0b3IoYSwgcHJvZChhLGEpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGEsYyk7CisgICAgYyA9IGEgKiBhOworICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yKGEsIHByb2QoYSwgYSkpOworICAgIFZFUklGWV9JU19BUFBST1goYSwgYyk7CiAKICAgICAvLyBjaGVjayBjb21wb3VuZCBhc3NpZ25tZW50IG9mIHByb2R1Y3RzCiAgICAgZCA9IGM7Ci0gICAgYWRkX2Fzc2lnbl91c2luZ19ldmFsdWF0b3IoYy5ub2FsaWFzKCksIHByb2QoYSxiKSk7Ci0gICAgZC5ub2FsaWFzKCkgKz0gYSpiOworICAgIGFkZF9hc3NpZ25fdXNpbmdfZXZhbHVhdG9yKGMubm9hbGlhcygpLCBwcm9kKGEsIGIpKTsKKyAgICBkLm5vYWxpYXMoKSArPSBhICogYjsKICAgICBWRVJJRllfSVNfQVBQUk9YKGMsIGQpOwogCiAgICAgZCA9IGM7Ci0gICAgc3VidHJhY3RfYXNzaWduX3VzaW5nX2V2YWx1YXRvcihjLm5vYWxpYXMoKSwgcHJvZChhLGIpKTsKLSAgICBkLm5vYWxpYXMoKSAtPSBhKmI7CisgICAgc3VidHJhY3RfYXNzaWduX3VzaW5nX2V2YWx1YXRvcihjLm5vYWxpYXMoKSwgcHJvZChhLCBiKSk7CisgICAgZC5ub2FsaWFzKCkgLT0gYSAqIGI7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChjLCBkKTsKICAgfQogCiAgIHsKICAgICAvLyB0ZXN0IHByb2R1Y3Qgd2l0aCBhbGwgcG9zc2libGUgc2l6ZXMKLSAgICBpbnQgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDEwMCk7Ci0gICAgTWF0cml4PGZsb2F0LCAgICAgIDEsICAgICAgMT4gbTExLCByZXMxMTsgIG0xMS5zZXRSYW5kb20oMSwxKTsKLSAgICBNYXRyaXg8ZmxvYXQsICAgICAgMSwgICAgICA0PiBtMTQsIHJlczE0OyAgbTE0LnNldFJhbmRvbSgxLDQpOwotICAgIE1hdHJpeDxmbG9hdCwgICAgICAxLER5bmFtaWM+IG0xWCwgcmVzMVg7ICBtMVguc2V0UmFuZG9tKDEscyk7Ci0gICAgTWF0cml4PGZsb2F0LCAgICAgIDQsICAgICAgMT4gbTQxLCByZXM0MTsgIG00MS5zZXRSYW5kb20oNCwxKTsKLSAgICBNYXRyaXg8ZmxvYXQsICAgICAgNCwgICAgICA0PiBtNDQsIHJlczQ0OyAgbTQ0LnNldFJhbmRvbSg0LDQpOwotICAgIE1hdHJpeDxmbG9hdCwgICAgICA0LER5bmFtaWM+IG00WCwgcmVzNFg7ICBtNFguc2V0UmFuZG9tKDQscyk7Ci0gICAgTWF0cml4PGZsb2F0LER5bmFtaWMsICAgICAgMT4gbVgxLCByZXNYMTsgIG1YMS5zZXRSYW5kb20ocywxKTsKLSAgICBNYXRyaXg8ZmxvYXQsRHluYW1pYywgICAgICA0PiBtWDQsIHJlc1g0OyAgbVg0LnNldFJhbmRvbShzLDQpOwotICAgIE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWM+IG1YWCwgcmVzWFg7ICBtWFguc2V0UmFuZG9tKHMscyk7CisgICAgaW50IHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTAwKTsKKyAgICBNYXRyaXg8ZmxvYXQsIDEsIDE+IG0xMSwgcmVzMTE7CisgICAgbTExLnNldFJhbmRvbSgxLCAxKTsKKyAgICBNYXRyaXg8ZmxvYXQsIDEsIDQ+IG0xNCwgcmVzMTQ7CisgICAgbTE0LnNldFJhbmRvbSgxLCA0KTsKKyAgICBNYXRyaXg8ZmxvYXQsIDEsIER5bmFtaWM+IG0xWCwgcmVzMVg7CisgICAgbTFYLnNldFJhbmRvbSgxLCBzKTsKKyAgICBNYXRyaXg8ZmxvYXQsIDQsIDE+IG00MSwgcmVzNDE7CisgICAgbTQxLnNldFJhbmRvbSg0LCAxKTsKKyAgICBNYXRyaXg8ZmxvYXQsIDQsIDQ+IG00NCwgcmVzNDQ7CisgICAgbTQ0LnNldFJhbmRvbSg0LCA0KTsKKyAgICBNYXRyaXg8ZmxvYXQsIDQsIER5bmFtaWM+IG00WCwgcmVzNFg7CisgICAgbTRYLnNldFJhbmRvbSg0LCBzKTsKKyAgICBNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIDE+IG1YMSwgcmVzWDE7CisgICAgbVgxLnNldFJhbmRvbShzLCAxKTsKKyAgICBNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIDQ+IG1YNCwgcmVzWDQ7CisgICAgbVg0LnNldFJhbmRvbShzLCA0KTsKKyAgICBNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWM+IG1YWCwgcmVzWFg7CisgICAgbVhYLnNldFJhbmRvbShzLCBzKTsKIAotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXMxMSwgcHJvZChtMTEsbTExKSwgbTExKm0xMSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczExLCBwcm9kKG0xNCxtNDEpLCBtMTQqbTQxKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzMTEsIHByb2QobTFYLG1YMSksIG0xWCptWDEpOwotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXMxNCwgcHJvZChtMTEsbTE0KSwgbTExKm0xNCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczE0LCBwcm9kKG0xNCxtNDQpLCBtMTQqbTQ0KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzMTQsIHByb2QobTFYLG1YNCksIG0xWCptWDQpOwotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXMxWCwgcHJvZChtMTEsbTFYKSwgbTExKm0xWCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczFYLCBwcm9kKG0xNCxtNFgpLCBtMTQqbTRYKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzMVgsIHByb2QobTFYLG1YWCksIG0xWCptWFgpOwotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXM0MSwgcHJvZChtNDEsbTExKSwgbTQxKm0xMSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczQxLCBwcm9kKG00NCxtNDEpLCBtNDQqbTQxKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzNDEsIHByb2QobTRYLG1YMSksIG00WCptWDEpOwotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXM0NCwgcHJvZChtNDEsbTE0KSwgbTQxKm0xNCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczQ0LCBwcm9kKG00NCxtNDQpLCBtNDQqbTQ0KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzNDQsIHByb2QobTRYLG1YNCksIG00WCptWDQpOwotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXM0WCwgcHJvZChtNDEsbTFYKSwgbTQxKm0xWCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczRYLCBwcm9kKG00NCxtNFgpLCBtNDQqbTRYKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzNFgsIHByb2QobTRYLG1YWCksIG00WCptWFgpOwotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXNYMSwgcHJvZChtWDEsbTExKSwgbVgxKm0xMSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlc1gxLCBwcm9kKG1YNCxtNDEpLCBtWDQqbTQxKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzWDEsIHByb2QobVhYLG1YMSksIG1YWCptWDEpOwotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXNYNCwgcHJvZChtWDEsbTE0KSwgbVgxKm0xNCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlc1g0LCBwcm9kKG1YNCxtNDQpLCBtWDQqbTQ0KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzWDQsIHByb2QobVhYLG1YNCksIG1YWCptWDQpOwotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXNYWCwgcHJvZChtWDEsbTFYKSwgbVgxKm0xWCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlc1hYLCBwcm9kKG1YNCxtNFgpLCBtWDQqbTRYKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzWFgsIHByb2QobVhYLG1YWCksIG1YWCptWFgpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXMxMSwgcHJvZChtMTEsIG0xMSksIG0xMSAqIG0xMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczExLCBwcm9kKG0xNCwgbTQxKSwgbTE0ICogbTQxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzMTEsIHByb2QobTFYLCBtWDEpLCBtMVggKiBtWDEpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXMxNCwgcHJvZChtMTEsIG0xNCksIG0xMSAqIG0xNCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczE0LCBwcm9kKG0xNCwgbTQ0KSwgbTE0ICogbTQ0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzMTQsIHByb2QobTFYLCBtWDQpLCBtMVggKiBtWDQpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXMxWCwgcHJvZChtMTEsIG0xWCksIG0xMSAqIG0xWCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczFYLCBwcm9kKG0xNCwgbTRYKSwgbTE0ICogbTRYKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzMVgsIHByb2QobTFYLCBtWFgpLCBtMVggKiBtWFgpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXM0MSwgcHJvZChtNDEsIG0xMSksIG00MSAqIG0xMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczQxLCBwcm9kKG00NCwgbTQxKSwgbTQ0ICogbTQxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzNDEsIHByb2QobTRYLCBtWDEpLCBtNFggKiBtWDEpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXM0NCwgcHJvZChtNDEsIG0xNCksIG00MSAqIG0xNCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczQ0LCBwcm9kKG00NCwgbTQ0KSwgbTQ0ICogbTQ0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzNDQsIHByb2QobTRYLCBtWDQpLCBtNFggKiBtWDQpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXM0WCwgcHJvZChtNDEsIG0xWCksIG00MSAqIG0xWCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlczRYLCBwcm9kKG00NCwgbTRYKSwgbTQ0ICogbTRYKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzNFgsIHByb2QobTRYLCBtWFgpLCBtNFggKiBtWFgpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXNYMSwgcHJvZChtWDEsIG0xMSksIG1YMSAqIG0xMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlc1gxLCBwcm9kKG1YNCwgbTQxKSwgbVg0ICogbTQxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzWDEsIHByb2QobVhYLCBtWDEpLCBtWFggKiBtWDEpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXNYNCwgcHJvZChtWDEsIG0xNCksIG1YMSAqIG0xNCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlc1g0LCBwcm9kKG1YNCwgbTQ0KSwgbVg0ICogbTQ0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzWDQsIHByb2QobVhYLCBtWDQpLCBtWFggKiBtWDQpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihyZXNYWCwgcHJvZChtWDEsIG0xWCksIG1YMSAqIG0xWCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKHJlc1hYLCBwcm9kKG1YNCwgbTRYKSwgbVg0ICogbTRYKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIocmVzWFgsIHByb2QobVhYLCBtWFgpLCBtWFggKiBtWFgpOwogICB9CiAKICAgewotICAgIEFycmF5WFhmIGEoMiwzKTsKLSAgICBBcnJheVhYZiBiKDMsMik7Ci0gICAgYSA8PCAxLDIsMywgNCw1LDY7CisgICAgQXJyYXlYWGYgYSgyLCAzKTsKKyAgICBBcnJheVhYZiBiKDMsIDIpOworICAgIGEgPDwgMSwgMiwgMywgNCwgNSwgNjsKICAgICBjb25zdCBBcnJheVhYZiBhX2NvbnN0KGEpOwotICAgIAotICAgIC8vIHRoaXMgZG9lcyBub3Qgd29yayBiZWNhdXNlIFJhbmRvbSBpcyBldmFsLWJlZm9yZS1uZXN0ZWQ6IAorCisgICAgLy8gdGhpcyBkb2VzIG5vdCB3b3JrIGJlY2F1c2UgUmFuZG9tIGlzIGV2YWwtYmVmb3JlLW5lc3RlZDoKICAgICAvLyBjb3B5X3VzaW5nX2V2YWx1YXRvcih3LCBWZWN0b3IyZDo6UmFuZG9tKCkudHJhbnNwb3NlKCkpOwogCiAgICAgLy8gdGVzdCBDd2lzZVVuYXJ5T3AKQEAgLTI0NywyMCArMjQ5LDIwIEBACiAgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IodywgKHYgKyBWZWN0b3IyZDo6T25lcygpKS50cmFuc3Bvc2UoKS5jd2lzZVByb2R1Y3QoUm93VmVjdG9yMmQ6OkNvbnN0YW50KDMpKSk7CiAKICAgICAvLyBkeW5hbWljIG1hdHJpY2VzIGFuZCBhcnJheXMKLSAgICBNYXRyaXhYZCBtYXQxKDYsNiksIG1hdDIoNiw2KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtYXQxLCBNYXRyaXhYZDo6SWRlbnRpdHkoNiw2KSk7CisgICAgTWF0cml4WGQgbWF0MSg2LCA2KSwgbWF0Mig2LCA2KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtYXQxLCBNYXRyaXhYZDo6SWRlbnRpdHkoNiwgNikpOwogICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG1hdDIsIG1hdDEpOwogICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yKG1hdDIudHJhbnNwb3NlKCksIG1hdDEpOwogICAgIFZFUklGWV9JU19BUFBST1gobWF0Mi50cmFuc3Bvc2UoKSwgbWF0MSk7CiAKLSAgICBBcnJheVhYZCBhcnIxKDYsNiksIGFycjIoNiw2KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihhcnIxLCBBcnJheVhYZDo6Q29uc3RhbnQoNiw2LCAzLjApKTsKKyAgICBBcnJheVhYZCBhcnIxKDYsIDYpLCBhcnIyKDYsIDYpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGFycjEsIEFycmF5WFhkOjpDb25zdGFudCg2LCA2LCAzLjApKTsKICAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihhcnIyLCBhcnIxKTsKLSAgICAKKwogICAgIC8vIHRlc3QgYXV0b21hdGljIHJlc2l6aW5nCi0gICAgbWF0Mi5yZXNpemUoMywzKTsKKyAgICBtYXQyLnJlc2l6ZSgzLCAzKTsKICAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtYXQyLCBtYXQxKTsKLSAgICBhcnIyLnJlc2l6ZSg5LDkpOworICAgIGFycjIucmVzaXplKDksIDkpOwogICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGFycjIsIGFycjEpOwogCiAgICAgLy8gdGVzdCBkaXJlY3QgdHJhdmVyc2FsCkBAIC0yNjgsNDAgKzI3MCw0MCBAQAogICAgIEFycmF5MzNmIGEzOwogICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG0zLCBNYXRyaXgzZjo6SWRlbnRpdHkoKSk7ICAvLyBtYXRyaXgsIG51bGxhcnkKICAgICAvLyBUT0RPOiBmaW5kIGEgd2F5IHRvIHRlc3QgZGlyZWN0IHRyYXZlcnNhbCB3aXRoIGFycmF5Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTMudHJhbnNwb3NlKCksIE1hdHJpeDNmOjpJZGVudGl0eSgpLnRyYW5zcG9zZSgpKTsgIC8vIHRyYW5zcG9zZQotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG0zLCAyICogTWF0cml4M2Y6OklkZW50aXR5KCkpOyAgLy8gdW5hcnkKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtMywgTWF0cml4M2Y6OklkZW50aXR5KCkgKyBNYXRyaXgzZjo6WmVybygpKTsgIC8vIGJpbmFyeQotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG0zLmJsb2NrKDAsMCwyLDIpLCBNYXRyaXgzZjo6SWRlbnRpdHkoKS5ibG9jaygxLDEsMiwyKSk7ICAvLyBibG9jaworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG0zLnRyYW5zcG9zZSgpLCBNYXRyaXgzZjo6SWRlbnRpdHkoKS50cmFuc3Bvc2UoKSk7ICAgICAgICAgICAgICAvLyB0cmFuc3Bvc2UKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtMywgMiAqIE1hdHJpeDNmOjpJZGVudGl0eSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5hcnkKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtMywgTWF0cml4M2Y6OklkZW50aXR5KCkgKyBNYXRyaXgzZjo6WmVybygpKTsgICAgICAgICAgICAgICAgICAgLy8gYmluYXJ5CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTMuYmxvY2soMCwgMCwgMiwgMiksIE1hdHJpeDNmOjpJZGVudGl0eSgpLmJsb2NrKDEsIDEsIDIsIDIpKTsgIC8vIGJsb2NrCiAKICAgICAvLyB0ZXN0IGxpbmVhciB0cmF2ZXJzYWwKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtMywgTWF0cml4M2Y6Olplcm8oKSk7ICAvLyBtYXRyaXgsIG51bGxhcnkKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihhMywgQXJyYXkzM2Y6Olplcm8oKSk7ICAvLyBhcnJheQorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG0zLCBNYXRyaXgzZjo6WmVybygpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdHJpeCwgbnVsbGFyeQorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGEzLCBBcnJheTMzZjo6WmVybygpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTMudHJhbnNwb3NlKCksIE1hdHJpeDNmOjpaZXJvKCkudHJhbnNwb3NlKCkpOyAgLy8gdHJhbnNwb3NlCi0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTMsIDIgKiBNYXRyaXgzZjo6WmVybygpKTsgIC8vIHVuYXJ5Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTMsIE1hdHJpeDNmOjpaZXJvKCkgKyBtMyk7ICAvLyBiaW5hcnkgIAorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG0zLCAyICogTWF0cml4M2Y6Olplcm8oKSk7ICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYXJ5CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTMsIE1hdHJpeDNmOjpaZXJvKCkgKyBtMyk7ICAgICAgICAgICAgICAgICAgICAgLy8gYmluYXJ5CiAKICAgICAvLyB0ZXN0IGlubmVyIHZlY3Rvcml6YXRpb24KICAgICBNYXRyaXg0ZiBtNCwgbTRzcmMgPSBNYXRyaXg0Zjo6UmFuZG9tKCk7CiAgICAgQXJyYXk0NGYgYTQsIGE0c3JjID0gTWF0cml4NGY6OlJhbmRvbSgpOwotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG00LCBtNHNyYyk7ICAvLyBtYXRyaXgKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihhNCwgYTRzcmMpOyAgLy8gYXJyYXkKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtNCwgbTRzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF0cml4CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IoYTQsIGE0c3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5CiAgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTQudHJhbnNwb3NlKCksIG00c3JjLnRyYW5zcG9zZSgpKTsgIC8vIHRyYW5zcG9zZQogICAgIC8vIFRPRE86IGZpbmQgb3V0IHdoeSBNYXRyaXg0Zjo6WmVybygpIGRvZXMgbm90IGFsbG93IGlubmVyIHZlY3Rvcml6YXRpb24KLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtNCwgMiAqIG00c3JjKTsgIC8vIHVuYXJ5CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTQsIDIgKiBtNHNyYyk7ICAgICAgLy8gdW5hcnkKICAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtNCwgbTRzcmMgKyBtNHNyYyk7ICAvLyBiaW5hcnkKIAogICAgIC8vIHRlc3QgbGluZWFyIHZlY3Rvcml6YXRpb24KLSAgICBNYXRyaXhYZiBtWCg2LDYpLCBtWHNyYyA9IE1hdHJpeFhmOjpSYW5kb20oNiw2KTsKLSAgICBBcnJheVhYZiBhWCg2LDYpLCBhWHNyYyA9IEFycmF5WFhmOjpSYW5kb20oNiw2KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtWCwgbVhzcmMpOyAgLy8gbWF0cml4Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IoYVgsIGFYc3JjKTsgIC8vIGFycmF5CisgICAgTWF0cml4WGYgbVgoNiwgNiksIG1Yc3JjID0gTWF0cml4WGY6OlJhbmRvbSg2LCA2KTsKKyAgICBBcnJheVhYZiBhWCg2LCA2KSwgYVhzcmMgPSBBcnJheVhYZjo6UmFuZG9tKDYsIDYpOworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG1YLCBtWHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRyaXgKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihhWCwgYVhzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkKICAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtWC50cmFuc3Bvc2UoKSwgbVhzcmMudHJhbnNwb3NlKCkpOyAgLy8gdHJhbnNwb3NlCi0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobVgsIE1hdHJpeFhmOjpaZXJvKDYsNikpOyAgLy8gbnVsbGFyeQotICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG1YLCAyICogbVhzcmMpOyAgLy8gdW5hcnkKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtWCwgbVhzcmMgKyBtWHNyYyk7ICAvLyBiaW5hcnkKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtWCwgTWF0cml4WGY6Olplcm8oNiwgNikpOyAgICAgICAgICAgLy8gbnVsbGFyeQorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG1YLCAyICogbVhzcmMpOyAgICAgICAgICAgICAgICAgICAgICAvLyB1bmFyeQorICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG1YLCBtWHNyYyArIG1Yc3JjKTsgICAgICAgICAgICAgICAgICAvLyBiaW5hcnkKIAogICAgIC8vIHRlc3QgYmxvY2tzIGFuZCBzbGljZSB2ZWN0b3JpemF0aW9uCi0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobTQsIChtWHNyYy5ibG9jazw0LDQ+KDEsMCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtNCwgKG1Yc3JjLmJsb2NrPDQsIDQ+KDEsIDApKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IoYVgsIEFycmF5WFhmOjpDb25zdGFudCgxMCwgMTAsIDMuMCkuYmxvY2soMiwgMywgNiwgNikpOwogCiAgICAgTWF0cml4NGYgbTRyZWYgPSBtNDsKQEAgLTMwOSwyMSArMzExLDIxIEBACiAgICAgbTRyZWYuYmxvY2soMSwgMSwgMiwgMykgPSBtMy5ib3R0b21Sb3dzKDIpOwogICAgIFZFUklGWV9JU19BUFBST1gobTQsIG00cmVmKTsKIAotICAgIG1YLnNldElkZW50aXR5KDIwLDIwKTsKLSAgICBNYXRyaXhYZiBtWHJlZiA9IE1hdHJpeFhmOjpJZGVudGl0eSgyMCwyMCk7Ci0gICAgbVhzcmMgPSBNYXRyaXhYZjo6UmFuZG9tKDksMTIpOworICAgIG1YLnNldElkZW50aXR5KDIwLCAyMCk7CisgICAgTWF0cml4WGYgbVhyZWYgPSBNYXRyaXhYZjo6SWRlbnRpdHkoMjAsIDIwKTsKKyAgICBtWHNyYyA9IE1hdHJpeFhmOjpSYW5kb20oOSwgMTIpOwogICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yKG1YLmJsb2NrKDQsIDQsIDksIDEyKSwgbVhzcmMpOwogICAgIG1YcmVmLmJsb2NrKDQsIDQsIDksIDEyKSA9IG1Yc3JjOwogICAgIFZFUklGWV9JU19BUFBST1gobVgsIG1YcmVmKTsKIAogICAgIC8vIHRlc3QgTWFwCi0gICAgY29uc3QgZmxvYXQgcmF3WzNdID0gezEsMiwzfTsKLSAgICBmbG9hdCBidWZmZXJbM10gPSB7MCwwLDB9OworICAgIGNvbnN0IGZsb2F0IHJhd1szXSA9IHsxLCAyLCAzfTsKKyAgICBmbG9hdCBidWZmZXJbM10gPSB7MCwgMCwgMH07CiAgICAgVmVjdG9yM2YgdjM7CiAgICAgQXJyYXkzZiBhM2Y7CiAgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IodjMsIE1hcDxjb25zdCBWZWN0b3IzZj4ocmF3KSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IoYTNmLCBNYXA8Y29uc3QgQXJyYXkzZj4ocmF3KSk7Ci0gICAgVmVjdG9yM2Y6Ok1hcChidWZmZXIpID0gMip2MzsKKyAgICBWZWN0b3IzZjo6TWFwKGJ1ZmZlcikgPSAyICogdjM7CiAgICAgVkVSSUZZKGJ1ZmZlclswXSA9PSAyKTsKICAgICBWRVJJRlkoYnVmZmVyWzFdID09IDQpOwogICAgIFZFUklGWShidWZmZXJbMl0gPT0gNik7CkBAIC0zMzEsNyArMzMzLDcgQEAKICAgICAvLyB0ZXN0IEN3aXNlVW5hcnlWaWV3CiAgICAgbWF0MS5zZXRSYW5kb20oKTsKICAgICBtYXQyLnNldElkZW50aXR5KCk7Ci0gICAgTWF0cml4WGNkIG1hdFhjZCg2LDYpLCBtYXRYY2RfcmVmKDYsNik7CisgICAgTWF0cml4WGNkIG1hdFhjZCg2LCA2KSwgbWF0WGNkX3JlZig2LCA2KTsKICAgICBjb3B5X3VzaW5nX2V2YWx1YXRvcihtYXRYY2QucmVhbCgpLCBtYXQxKTsKICAgICBjb3B5X3VzaW5nX2V2YWx1YXRvcihtYXRYY2QuaW1hZygpLCBtYXQyKTsKICAgICBtYXRYY2RfcmVmLnJlYWwoKSA9IG1hdDE7CkBAIC0zNDcsOCArMzQ5LDggQEAKICAgICBtWC5yZXNpemUoNiwgNik7CiAgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobVgsIG1Yc3JjLmNvbHdpc2UoKSArIHZYKTsKICAgICBtYXRYY2QucmVzaXplKDEyLCAxMik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobWF0WGNkLCBtYXRYY2RfcmVmLnJlcGxpY2F0ZSgyLDIpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtYXRYY2QsIChtYXRYY2RfcmVmLnJlcGxpY2F0ZTwyLDI+KCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtYXRYY2QsIG1hdFhjZF9yZWYucmVwbGljYXRlKDIsIDIpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUihtYXRYY2QsIChtYXRYY2RfcmVmLnJlcGxpY2F0ZTwyLCAyPigpKSk7CiAKICAgICAvLyB0ZXN0IHBhcnRpYWwgcmVkdWN0aW9ucwogICAgIFZlY3RvclhkIHZlYzEoNik7CkBAIC0zNTYsMTYgKzM1OCwxNiBAQAogICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKHZlYzEsIG1hdDEuY29sd2lzZSgpLnN1bSgpLnRyYW5zcG9zZSgpKTsKIAogICAgIC8vIHRlc3QgTWF0cml4V3JhcHBlciBhbmQgQXJyYXlXcmFwcGVyCi0gICAgbWF0MS5zZXRSYW5kb20oNiw2KTsKLSAgICBhcnIxLnNldFJhbmRvbSg2LDYpOworICAgIG1hdDEuc2V0UmFuZG9tKDYsIDYpOworICAgIGFycjEuc2V0UmFuZG9tKDYsIDYpOwogICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKG1hdDIsIGFycjEubWF0cml4KCkpOwogICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SKGFycjIsIG1hdDEuYXJyYXkoKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IobWF0MiwgKGFycjEgKyAyKS5tYXRyaXgoKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IoYXJyMiwgbWF0MS5hcnJheSgpICsgMik7CiAgICAgbWF0Mi5hcnJheSgpID0gYXJyMSAqIGFycjE7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQyLCAoYXJyMSAqIGFycjEpLm1hdHJpeCgpKTsKLSAgICBhcnIyLm1hdHJpeCgpID0gTWF0cml4WGQ6OklkZW50aXR5KDYsNik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChhcnIyLCBNYXRyaXhYZDo6SWRlbnRpdHkoNiw2KS5hcnJheSgpKTsKKyAgICBhcnIyLm1hdHJpeCgpID0gTWF0cml4WGQ6OklkZW50aXR5KDYsIDYpOworICAgIFZFUklGWV9JU19BUFBST1goYXJyMiwgTWF0cml4WGQ6OklkZW50aXR5KDYsIDYpLmFycmF5KCkpOwogCiAgICAgLy8gdGVzdCBSZXZlcnNlCiAgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IoYXJyMiwgYXJyMS5yZXZlcnNlKCkpOwpAQCAtMzkyLDcgKzM5NCw3IEBACiAgICAgbWF0Mi5kaWFnb25hbDwtMT4oKSA9IG1hdDIuZGlhZ29uYWwoMSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQxLCBtYXQyKTsKICAgfQotICAKKwogICB7CiAgICAgLy8gdGVzdCBzd2FwcGluZwogICAgIE1hdHJpeFhkIG1hdDEsIG1hdDIsIG1hdDFyZWYsIG1hdDJyZWY7CkBAIC00MTYsMTggKzQxOCwxOCBAQAogCiAgIHsKICAgICAvLyB0ZXN0IGNvbXBvdW5kIGFzc2lnbm1lbnQKLSAgICBjb25zdCBNYXRyaXg0ZCBtYXRfY29uc3QgPSBNYXRyaXg0ZDo6UmFuZG9tKCk7IAorICAgIGNvbnN0IE1hdHJpeDRkIG1hdF9jb25zdCA9IE1hdHJpeDRkOjpSYW5kb20oKTsKICAgICBNYXRyaXg0ZCBtYXQsIG1hdF9yZWY7CiAgICAgbWF0ID0gbWF0X3JlZiA9IE1hdHJpeDRkOjpJZGVudGl0eSgpOwogICAgIGFkZF9hc3NpZ25fdXNpbmdfZXZhbHVhdG9yKG1hdCwgbWF0X2NvbnN0KTsKICAgICBtYXRfcmVmICs9IG1hdF9jb25zdDsKICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdCwgbWF0X3JlZik7CiAKLSAgICBzdWJ0cmFjdF9hc3NpZ25fdXNpbmdfZXZhbHVhdG9yKG1hdC5yb3coMSksIDIqbWF0LnJvdygyKSk7Ci0gICAgbWF0X3JlZi5yb3coMSkgLT0gMiptYXRfcmVmLnJvdygyKTsKKyAgICBzdWJ0cmFjdF9hc3NpZ25fdXNpbmdfZXZhbHVhdG9yKG1hdC5yb3coMSksIDIgKiBtYXQucm93KDIpKTsKKyAgICBtYXRfcmVmLnJvdygxKSAtPSAyICogbWF0X3JlZi5yb3coMik7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQsIG1hdF9yZWYpOwogCi0gICAgY29uc3QgQXJyYXlYWGYgYXJyX2NvbnN0ID0gQXJyYXlYWGY6OlJhbmRvbSg1LDMpOyAKKyAgICBjb25zdCBBcnJheVhYZiBhcnJfY29uc3QgPSBBcnJheVhYZjo6UmFuZG9tKDUsIDMpOwogICAgIEFycmF5WFhmIGFyciwgYXJyX3JlZjsKICAgICBhcnIgPSBhcnJfcmVmID0gQXJyYXlYWGY6OkNvbnN0YW50KDUsIDMsIDAuNSk7CiAgICAgbXVsdGlwbHlfYXNzaWduX3VzaW5nX2V2YWx1YXRvcihhcnIsIGFycl9jb25zdCk7CkBAIC00MzgsNjkgKzQ0MCw3OSBAQAogICAgIGFycl9yZWYucm93KDEpIC89IChhcnJfcmVmLnJvdygyKSArIDEpOwogICAgIFZFUklGWV9JU19BUFBST1goYXJyLCBhcnJfcmVmKTsKICAgfQotICAKKwogICB7CiAgICAgLy8gdGVzdCB0cmlhbmd1bGFyIHNoYXBlcwotICAgIE1hdHJpeFhkIEEgPSBNYXRyaXhYZDo6UmFuZG9tKDYsNiksIEIoNiw2KSwgQyg2LDYpLCBEKDYsNik7Ci0gICAgQS5zZXRSYW5kb20oKTtCLnNldFJhbmRvbSgpOworICAgIE1hdHJpeFhkIEEgPSBNYXRyaXhYZDo6UmFuZG9tKDYsIDYpLCBCKDYsIDYpLCBDKDYsIDYpLCBEKDYsIDYpOworICAgIEEuc2V0UmFuZG9tKCk7CisgICAgQi5zZXRSYW5kb20oKTsKICAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIoQiwgQS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgTWF0cml4WGQoQS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSkpOwotICAgIAotICAgIEEuc2V0UmFuZG9tKCk7Qi5zZXRSYW5kb20oKTsKKworICAgIEEuc2V0UmFuZG9tKCk7CisgICAgQi5zZXRSYW5kb20oKTsKICAgICBWRVJJRllfSVNfQVBQUk9YX0VWQUxVQVRPUjIoQiwgQS50cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCksIE1hdHJpeFhkKEEudHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpKSk7Ci0gICAgCi0gICAgQS5zZXRSYW5kb20oKTtCLnNldFJhbmRvbSgpOworCisgICAgQS5zZXRSYW5kb20oKTsKKyAgICBCLnNldFJhbmRvbSgpOwogICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihCLCBBLnRyaWFuZ3VsYXJWaWV3PFVuaXRVcHBlcj4oKSwgTWF0cml4WGQoQS50cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCkpKTsKLSAgICAKLSAgICBBLnNldFJhbmRvbSgpO0Iuc2V0UmFuZG9tKCk7Ci0gICAgQyA9IEI7IEMudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSBBOworCisgICAgQS5zZXRSYW5kb20oKTsKKyAgICBCLnNldFJhbmRvbSgpOworICAgIEMgPSBCOworICAgIEMudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSBBOwogICAgIGNvcHlfdXNpbmdfZXZhbHVhdG9yKEIudHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIEEpOwogICAgIFZFUklGWShCLmlzQXBwcm94KEMpICYmICJjb3B5X3VzaW5nX2V2YWx1YXRvcihCLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCBBKSIpOwotICAgIAotICAgIEEuc2V0UmFuZG9tKCk7Qi5zZXRSYW5kb20oKTsKLSAgICBDID0gQjsgQy50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSA9IEEudHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisKKyAgICBBLnNldFJhbmRvbSgpOworICAgIEIuc2V0UmFuZG9tKCk7CisgICAgQyA9IEI7CisgICAgQy50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSA9IEEudHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CiAgICAgY29weV91c2luZ19ldmFsdWF0b3IoQi50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgQS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSk7CiAgICAgVkVSSUZZKEIuaXNBcHByb3goQykgJiYgImNvcHlfdXNpbmdfZXZhbHVhdG9yKEIudHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIEEudHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpIik7Ci0gICAgCi0gICAgCi0gICAgQS5zZXRSYW5kb20oKTtCLnNldFJhbmRvbSgpOwotICAgIEMgPSBCOyBDLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpID0gQS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50cmFuc3Bvc2UoKTsKKworICAgIEEuc2V0UmFuZG9tKCk7CisgICAgQi5zZXRSYW5kb20oKTsKKyAgICBDID0gQjsKKyAgICBDLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpID0gQS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50cmFuc3Bvc2UoKTsKICAgICBjb3B5X3VzaW5nX2V2YWx1YXRvcihCLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCBBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRyYW5zcG9zZSgpKTsKICAgICBWRVJJRlkoQi5pc0FwcHJveChDKSAmJiAiY29weV91c2luZ19ldmFsdWF0b3IoQi50cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgQS50cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50cmFuc3Bvc2UoKSkiKTsKLSAgICAKLSAgICAKLSAgICBBLnNldFJhbmRvbSgpO0Iuc2V0UmFuZG9tKCk7IEMgPSBCOyBEID0gQTsKKworICAgIEEuc2V0UmFuZG9tKCk7CisgICAgQi5zZXRSYW5kb20oKTsKKyAgICBDID0gQjsKKyAgICBEID0gQTsKICAgICBDLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnN3YXAoRC50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSk7CiAgICAgc3dhcF91c2luZ19ldmFsdWF0b3IoQi50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgQS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSk7CiAgICAgVkVSSUZZKEIuaXNBcHByb3goQykgJiYgInN3YXBfdXNpbmdfZXZhbHVhdG9yKEIudHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIEEudHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpIik7Ci0gICAgCi0gICAgCi0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKEIsIHByb2QoQS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSxBKSwgTWF0cml4WGQoQS50cmlhbmd1bGFyVmlldzxVcHBlcj4oKSpBKSk7Ci0gICAgCi0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKEIsIHByb2QoQS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksQSksIE1hdHJpeFhkKEEuc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpKkEpKTsKKworICAgIFZFUklGWV9JU19BUFBST1hfRVZBTFVBVE9SMihCLCBwcm9kKEEudHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIEEpLCBNYXRyaXhYZChBLnRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogQSkpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKEIsIHByb2QoQS5zZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksIEEpLCBNYXRyaXhYZChBLnNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqIEEpKTsKICAgfQogCiAgIHsKICAgICAvLyB0ZXN0IGRpYWdvbmFsIHNoYXBlcwogICAgIFZlY3RvclhkIGQgPSBWZWN0b3JYZDo6UmFuZG9tKDYpOwotICAgIE1hdHJpeFhkIEEgPSBNYXRyaXhYZDo6UmFuZG9tKDYsNiksIEIoNiw2KTsKLSAgICBBLnNldFJhbmRvbSgpO0Iuc2V0UmFuZG9tKCk7Ci0gICAgCi0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKEIsIGxhenlwcm9kKGQuYXNEaWFnb25hbCgpLEEpLCBNYXRyaXhYZChkLmFzRGlhZ29uYWwoKSpBKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKEIsIGxhenlwcm9kKEEsZC5hc0RpYWdvbmFsKCkpLCBNYXRyaXhYZChBKmQuYXNEaWFnb25hbCgpKSk7CisgICAgTWF0cml4WGQgQSA9IE1hdHJpeFhkOjpSYW5kb20oNiwgNiksIEIoNiwgNik7CisgICAgQS5zZXRSYW5kb20oKTsKKyAgICBCLnNldFJhbmRvbSgpOworCisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKEIsIGxhenlwcm9kKGQuYXNEaWFnb25hbCgpLCBBKSwgTWF0cml4WGQoZC5hc0RpYWdvbmFsKCkgKiBBKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWF9FVkFMVUFUT1IyKEIsIGxhenlwcm9kKEEsIGQuYXNEaWFnb25hbCgpKSwgTWF0cml4WGQoQSAqIGQuYXNEaWFnb25hbCgpKSk7CiAgIH0KIAogICB7CiAgICAgLy8gdGVzdCBDb2VmZlJlYWRDb3N0CiAgICAgTWF0cml4NGQgYSwgYjsKLSAgICBWRVJJRllfSVNfRVFVQUwoIGdldF9jb3N0KGEpLCAxICk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKCBnZXRfY29zdChhK2IpLCAzKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoIGdldF9jb3N0KDIqYStiKSwgNCk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKCBnZXRfY29zdChhKmIpLCAxKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoIGdldF9jb3N0KGEubGF6eVByb2R1Y3QoYikpLCAxNSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKCBnZXRfY29zdChhKihhKmIpKSwgMSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKCBnZXRfY29zdChhLmxhenlQcm9kdWN0KGEqYikpLCAxNSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKCBnZXRfY29zdChhKihhK2IpKSwgMSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKCBnZXRfY29zdChhLmxhenlQcm9kdWN0KGErYikpLCAxNSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdldF9jb3N0KGEpLCAxKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZ2V0X2Nvc3QoYSArIGIpLCAzKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZ2V0X2Nvc3QoMiAqIGEgKyBiKSwgNCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdldF9jb3N0KGEgKiBiKSwgMSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdldF9jb3N0KGEubGF6eVByb2R1Y3QoYikpLCAxNSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdldF9jb3N0KGEgKiAoYSAqIGIpKSwgMSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdldF9jb3N0KGEubGF6eVByb2R1Y3QoYSAqIGIpKSwgMTUpOworICAgIFZFUklGWV9JU19FUVVBTChnZXRfY29zdChhICogKGEgKyBiKSksIDEpOworICAgIFZFUklGWV9JU19FUVVBTChnZXRfY29zdChhLmxhenlQcm9kdWN0KGEgKyBiKSksIDE1KTsKICAgfQogCiAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgUFIgNTQ0IGFuZCBidWcgMTYyMiAoaW50cm9kdWNlZCBpbiAjNzE2MDljNCkKQEAgLTUwOSwxOSArNTIxLDIxIEBACiAgICAgY29uc3Qgc2l6ZV90IE0gPSAyOwogICAgIGNvbnN0IHNpemVfdCBLID0gMjsKICAgICBjb25zdCBzaXplX3QgTiA9IDU7Ci0gICAgZmxvYXQgKmRlc3RNZW0gPSBuZXcgZmxvYXRbKE0qTikgKyAxXTsKKyAgICBmbG9hdCogZGVzdE1lbSA9IG5ldyBmbG9hdFsoTSAqIE4pICsgMV07CiAgICAgLy8gSW4gY2FzZSBvZiBubyBhbGlnbm1lbnQsIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm8uCiAgICAgY29uc3RleHByIGludCBhbGlnbm1lbnQgPSAoc3RkOjptYXg8aW50PikoRUlHRU5fTUFYX0FMSUdOX0JZVEVTLCAxKTsKLSAgICBmbG9hdCAqZGVzdCA9IChzdGQ6OnVpbnRwdHJfdChkZXN0TWVtKSVhbGlnbm1lbnQpID09IDAgPyBkZXN0TWVtKzEgOiBkZXN0TWVtOworICAgIGZsb2F0KiBkZXN0ID0gKHN0ZDo6dWludHB0cl90KGRlc3RNZW0pICUgYWxpZ25tZW50KSA9PSAwID8gZGVzdE1lbSArIDEgOiBkZXN0TWVtOwogCiAgICAgY29uc3QgTWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4gYSA9IE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+OjpSYW5kb20oTSwgSyk7CiAgICAgY29uc3QgTWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4gYiA9IE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+OjpSYW5kb20oSywgTik7Ci0gICAgCi0gICAgTWFwPE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+ID4geihkZXN0LCBNLCBOKTs7Ci0gICAgUHJvZHVjdDxNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPiwgTWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4sIExhenlQcm9kdWN0PiB0bXAoYSxiKTsKKworICAgIE1hcDxNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPiA+IHooZGVzdCwgTSwgTik7CisgICAgOworICAgIFByb2R1Y3Q8TWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4sIE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+LCBMYXp5UHJvZHVjdD4gdG1wKGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYik7CiAgICAgaW50ZXJuYWw6OmNhbGxfcmVzdHJpY3RlZF9wYWNrZXRfYXNzaWdubWVudCh6Lm5vYWxpYXMoKSwgdG1wLmRlcml2ZWQoKSwgaW50ZXJuYWw6OmFzc2lnbl9vcDxmbG9hdCwgZmxvYXQ+KCkpOwotICAgIAotICAgIFZFUklGWV9JU19BUFBST1goeiwgYSpiKTsKKworICAgIFZFUklGWV9JU19BUFBST1goeiwgYSAqIGIpOwogICAgIGRlbGV0ZVtdIGRlc3RNZW07CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZXhjZXB0aW9ucy5jcHAgYi90ZXN0L2V4Y2VwdGlvbnMuY3BwCmluZGV4IDNkOTMwNjAuLmUzYTU4OTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZXhjZXB0aW9ucy5jcHAKKysrIGIvdGVzdC9leGNlcHRpb25zLmNwcApAQCAtNyw3ICs3LDYgQEAKIC8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAogLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCiAKLQogLy8gVmFyaW91cyBzYW5pdHkgdGVzdHMgd2l0aCBleGNlcHRpb25zIGFuZCBub24gdHJpdmlhbGx5IGNvcHlhYmxlIHNjYWxhciB0eXBlLgogLy8gIC0gbm8gbWVtb3J5IGxlYWsgd2hlbiBhIGN1c3RvbSBzY2FsYXIgdHlwZSB0cm93IGFuIGV4Y2VwdGlvbnMKIC8vICAtIHRvZG86IGNvbXBsZXRlIHRoZSBsaXN0IG9mIHRlc3RzIQpAQCAtMTcsMzMgKzE2LDM3IEBACiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgIkFubm95aW5nU2NhbGFyLmgiCiAKLSNkZWZpbmUgQ0hFQ0tfTUVNTEVBSyhPUCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBbm5veWluZ1NjYWxhcjo6Y291bnRkb3duID0gMTAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgYmVmb3JlID0gQW5ub3lpbmdTY2FsYXI6Omluc3RhbmNlczsgICAgICAgICAgICAgICAgIFwKLSAgICBib29sIGV4Y2VwdGlvbl90aHJvd24gPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0cnkgeyBPUDsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXRjaCAobXlfZXhjZXB0aW9uKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGV4Y2VwdGlvbl90aHJvd24gPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIFZFUklGWShBbm5veWluZ1NjYWxhcjo6aW5zdGFuY2VzPT1iZWZvcmUgJiYgIm1lbW9yeSBsZWFrIGRldGVjdGVkIGluICIgJiYgRUlHRU5fTUFLRVNUUklORyhPUCkpOyBcCi0gICAgfSBcCi0gICAgVkVSSUZZKCAoQW5ub3lpbmdTY2FsYXI6OmRvbnRfdGhyb3cpIHx8IChleGNlcHRpb25fdGhyb3duICYmICIgbm8gZXhjZXB0aW9uIHRocm93biBpbiAiICYmIEVJR0VOX01BS0VTVFJJTkcoT1ApKSApOyBcCisjZGVmaW5lIENIRUNLX01FTUxFQUsoT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBbm5veWluZ1NjYWxhcjo6Y291bnRkb3duID0gMTAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGJlZm9yZSA9IEFubm95aW5nU2NhbGFyOjppbnN0YW5jZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgZXhjZXB0aW9uX3Rocm93biA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBPUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gY2F0Y2ggKG15X2V4Y2VwdGlvbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGV4Y2VwdGlvbl90aHJvd24gPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBWRVJJRlkoQW5ub3lpbmdTY2FsYXI6Omluc3RhbmNlcyA9PSBiZWZvcmUgJiYgIm1lbW9yeSBsZWFrIGRldGVjdGVkIGluICIgJiYgRUlHRU5fTUFLRVNUUklORyhPUCkpOyAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWRVJJRlkoKEFubm95aW5nU2NhbGFyOjpkb250X3Rocm93KSB8fCAoZXhjZXB0aW9uX3Rocm93biAmJiAiIG5vIGV4Y2VwdGlvbiB0aHJvd24gaW4gIiAmJiBFSUdFTl9NQUtFU1RSSU5HKE9QKSkpOyBcCiAgIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGV4Y2VwdGlvbnMpCi17Ci0gIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxBbm5veWluZ1NjYWxhcixEeW5hbWljLDE+IFZlY3RvclR5cGU7Ci0gIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxBbm5veWluZ1NjYWxhcixEeW5hbWljLER5bmFtaWM+IE1hdHJpeFR5cGU7Ci0gIAorRUlHRU5fREVDTEFSRV9URVNUKGV4Y2VwdGlvbnMpIHsKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PEFubm95aW5nU2NhbGFyLCBEeW5hbWljLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8QW5ub3lpbmdTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IE1hdHJpeFR5cGU7CisKICAgewogICAgIEFubm95aW5nU2NhbGFyOjpkb250X3Rocm93ID0gZmFsc2U7CiAgICAgaW50IG4gPSA1MDsKICAgICBWZWN0b3JUeXBlIHYwKG4pLCB2MShuKTsKLSAgICBNYXRyaXhUeXBlIG0wKG4sbiksIG0xKG4sbiksIG0yKG4sbik7Ci0gICAgdjAuc2V0T25lcygpOyB2MS5zZXRPbmVzKCk7Ci0gICAgbTAuc2V0T25lcygpOyBtMS5zZXRPbmVzKCk7IG0yLnNldE9uZXMoKTsKKyAgICBNYXRyaXhUeXBlIG0wKG4sIG4pLCBtMShuLCBuKSwgbTIobiwgbik7CisgICAgdjAuc2V0T25lcygpOworICAgIHYxLnNldE9uZXMoKTsKKyAgICBtMC5zZXRPbmVzKCk7CisgICAgbTEuc2V0T25lcygpOworICAgIG0yLnNldE9uZXMoKTsKICAgICBDSEVDS19NRU1MRUFLKHYwID0gbTAgKiBtMSAqIHYxKTsKICAgICBDSEVDS19NRU1MRUFLKG0yID0gbTAgKiBtMSAqIG0yKTsKLSAgICBDSEVDS19NRU1MRUFLKCh2MCt2MSkuZG90KHYwK3YxKSk7CisgICAgQ0hFQ0tfTUVNTEVBSygodjAgKyB2MSkuZG90KHYwICsgdjEpKTsKICAgfQotICBWRVJJRlkoQW5ub3lpbmdTY2FsYXI6Omluc3RhbmNlcz09MCAmJiAiZ2xvYmFsIG1lbW9yeSBsZWFrIGRldGVjdGVkIGluICIgJiYgRUlHRU5fTUFLRVNUUklORyhPUCkpOworICBWRVJJRlkoQW5ub3lpbmdTY2FsYXI6Omluc3RhbmNlcyA9PSAwICYmICJnbG9iYWwgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQgaW4gIiAmJiBFSUdFTl9NQUtFU1RSSU5HKE9QKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2Zhc3RtYXRoLmNwcCBiL3Rlc3QvZmFzdG1hdGguY3BwCmluZGV4IDkwMmRmZDcuLjZkOTFmZTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvZmFzdG1hdGguY3BwCisrKyBiL3Rlc3QvZmFzdG1hdGguY3BwCkBAIC05LDEwICs5LDkgQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdm9pZCBjaGVjayhib29sIGIsIGJvb2wgcmVmKQotewordm9pZCBjaGVjayhib29sIGIsIGJvb2wgcmVmKSB7CiAgIHN0ZDo6Y291dCA8PCBiOwotICBpZihiPT1yZWYpCisgIGlmIChiID09IHJlZikKICAgICBzdGQ6OmNvdXQgPDwgIiBPSyAgIjsKICAgZWxzZQogICAgIHN0ZDo6Y291dCA8PCAiIEJBRCAiOwpAQCAtMjAsNzggKzE5LDE4OSBAQAogCiAjaWYgRUlHRU5fQ09NUF9NU1ZDICYmIEVJR0VOX0NPTVBfTVNWQyA8IDE4MDAKIG5hbWVzcGFjZSBzdGQgewotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIChpc2Zpbml0ZSkoVCB4KSB7IHJldHVybiBfZmluaXRlKHgpOyB9Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgKGlzbmFuKShUIHgpIHsgcmV0dXJuIF9pc25hbih4KTsgfQotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIChpc2luZikoVCB4KSB7IHJldHVybiBfZnBjbGFzcyh4KT09X0ZQQ0xBU1NfTklORiB8fCBfZnBjbGFzcyh4KT09X0ZQQ0xBU1NfUElORjsgfQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sKGlzZmluaXRlKShUIHgpIHsKKyAgcmV0dXJuIF9maW5pdGUoeCk7CiB9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2woaXNuYW4pKFQgeCkgeworICByZXR1cm4gX2lzbmFuKHgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sKGlzaW5mKShUIHgpIHsKKyAgcmV0dXJuIF9mcGNsYXNzKHgpID09IF9GUENMQVNTX05JTkYgfHwgX2ZwY2xhc3MoeCkgPT0gX0ZQQ0xBU1NfUElORjsKK30KK30gIC8vIG5hbWVzcGFjZSBzdGQKICNlbmRpZgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiB2b2lkIGNoZWNrX2luZl9uYW4oYm9vbCBkcnlydW4pIHsKLSAgTWF0cml4PFQsRHluYW1pYywxPiBtKDEwKTsKKyAgTWF0cml4PFQsIER5bmFtaWMsIDE+IG0oMTApOwogICBtLnNldFJhbmRvbSgpOwogICBtKDMpID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6cXVpZXRfTmFOKCk7CiAKLSAgaWYoZHJ5cnVuKQotICB7Ci0gICAgc3RkOjpjb3V0IDw8ICJzdGQ6OmlzZmluaXRlKCIgPDwgbSgzKSA8PCAiKSA9ICI7IGNoZWNrKChzdGQ6OmlzZmluaXRlKShtKDMpKSxmYWxzZSk7IHN0ZDo6Y291dCA8PCAiICA7IG51bWV4dDo6aXNmaW5pdGUgPSAiOyBjaGVjaygobnVtZXh0Ojppc2Zpbml0ZSkobSgzKSksIGZhbHNlKTsgc3RkOjpjb3V0IDw8ICJcbiI7Ci0gICAgc3RkOjpjb3V0IDw8ICJzdGQ6OmlzaW5mKCIgPDwgbSgzKSA8PCAiKSAgICA9ICI7IGNoZWNrKChzdGQ6OmlzaW5mKShtKDMpKSxmYWxzZSk7ICAgIHN0ZDo6Y291dCA8PCAiICA7IG51bWV4dDo6aXNpbmYgICAgPSAiOyBjaGVjaygobnVtZXh0Ojppc2luZikobSgzKSksIGZhbHNlKTsgc3RkOjpjb3V0IDw8ICJcbiI7Ci0gICAgc3RkOjpjb3V0IDw8ICJzdGQ6OmlzbmFuKCIgPDwgbSgzKSA8PCAiKSAgICA9ICI7IGNoZWNrKChzdGQ6OmlzbmFuKShtKDMpKSx0cnVlKTsgICAgIHN0ZDo6Y291dCA8PCAiICA7IG51bWV4dDo6aXNuYW4gICAgPSAiOyBjaGVjaygobnVtZXh0Ojppc25hbikobSgzKSksIHRydWUpOyBzdGQ6OmNvdXQgPDwgIlxuIjsKLSAgICBzdGQ6OmNvdXQgPDwgImFsbEZpbml0ZTogIjsgY2hlY2sobS5hbGxGaW5pdGUoKSwgMCk7IHN0ZDo6Y291dCA8PCAiXG4iOwotICAgIHN0ZDo6Y291dCA8PCAiaGFzTmFOOiAgICAiOyBjaGVjayhtLmhhc05hTigpLCAxKTsgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgIGlmIChkcnlydW4pIHsKKyAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6aXNmaW5pdGUoIiA8PCBtKDMpIDw8ICIpID0gIjsKKyAgICBjaGVjaygoc3RkOjppc2Zpbml0ZSkobSgzKSksIGZhbHNlKTsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgOyBudW1leHQ6OmlzZmluaXRlID0gIjsKKyAgICBjaGVjaygobnVtZXh0Ojppc2Zpbml0ZSkobSgzKSksIGZhbHNlKTsKICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6aXNpbmYoIiA8PCBtKDMpIDw8ICIpICAgID0gIjsKKyAgICBjaGVjaygoc3RkOjppc2luZikobSgzKSksIGZhbHNlKTsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgOyBudW1leHQ6OmlzaW5mICAgID0gIjsKKyAgICBjaGVjaygobnVtZXh0Ojppc2luZikobSgzKSksIGZhbHNlKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6aXNuYW4oIiA8PCBtKDMpIDw8ICIpICAgID0gIjsKKyAgICBjaGVjaygoc3RkOjppc25hbikobSgzKSksIHRydWUpOworICAgIHN0ZDo6Y291dCA8PCAiICA7IG51bWV4dDo6aXNuYW4gICAgPSAiOworICAgIGNoZWNrKChudW1leHQ6OmlzbmFuKShtKDMpKSwgdHJ1ZSk7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJhbGxGaW5pdGU6ICI7CisgICAgY2hlY2sobS5hbGxGaW5pdGUoKSwgMCk7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJoYXNOYU46ICAgICI7CisgICAgY2hlY2sobS5oYXNOYU4oKSwgMSk7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgIH0gZWxzZSB7CisgICAgaWYgKChzdGQ6OmlzZmluaXRlKShtKDMpKSkgeworICAgICAgZ190ZXN0X2xldmVsID0gMTsKKyAgICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKG0oMykpKTsKKyAgICAgIGdfdGVzdF9sZXZlbCA9IDA7CisgICAgfQorICAgIGlmICgoc3RkOjppc2luZikobSgzKSkpIHsKKyAgICAgIGdfdGVzdF9sZXZlbCA9IDE7CisgICAgICBWRVJJRlkoIShudW1leHQ6OmlzaW5mKShtKDMpKSk7CisgICAgICBnX3Rlc3RfbGV2ZWwgPSAwOworICAgIH0KKyAgICBpZiAoIShzdGQ6OmlzbmFuKShtKDMpKSkgeworICAgICAgZ190ZXN0X2xldmVsID0gMTsKKyAgICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikobSgzKSkpOworICAgICAgZ190ZXN0X2xldmVsID0gMDsKKyAgICB9CisgICAgaWYgKChzdGQ6OmlzZmluaXRlKShtKDMpKSkgeworICAgICAgZ190ZXN0X2xldmVsID0gMTsKKyAgICAgIFZFUklGWSghbS5hbGxGaW5pdGUoKSk7CisgICAgICBnX3Rlc3RfbGV2ZWwgPSAwOworICAgIH0KKyAgICBpZiAoIShzdGQ6OmlzbmFuKShtKDMpKSkgeworICAgICAgZ190ZXN0X2xldmVsID0gMTsKKyAgICAgIFZFUklGWShtLmhhc05hTigpKTsKKyAgICAgIGdfdGVzdF9sZXZlbCA9IDA7CisgICAgfQogICB9Ci0gIGVsc2UKLSAgewotICAgIGlmKCAoc3RkOjppc2Zpbml0ZSkobSgzKSkpIHsgZ190ZXN0X2xldmVsPTE7ICBWRVJJRlkoICEobnVtZXh0Ojppc2Zpbml0ZSkobSgzKSkgKTsgZ190ZXN0X2xldmVsPTA7IH0KLSAgICBpZiggKHN0ZDo6aXNpbmYpICAgKG0oMykpKSB7IGdfdGVzdF9sZXZlbD0xOyAgVkVSSUZZKCAhKG51bWV4dDo6aXNpbmYpKG0oMykpICk7ICAgIGdfdGVzdF9sZXZlbD0wOyB9Ci0gICAgaWYoIShzdGQ6OmlzbmFuKSAgIChtKDMpKSkgeyBnX3Rlc3RfbGV2ZWw9MTsgIFZFUklGWSggIChudW1leHQ6OmlzbmFuKShtKDMpKSApOyAgICBnX3Rlc3RfbGV2ZWw9MDsgfQotICAgIGlmKCAoc3RkOjppc2Zpbml0ZSkobSgzKSkpIHsgZ190ZXN0X2xldmVsPTE7ICBWRVJJRlkoICFtLmFsbEZpbml0ZSgpICk7ICAgICAgICAgICAgZ190ZXN0X2xldmVsPTA7IH0KLSAgICBpZighKHN0ZDo6aXNuYW4pICAgKG0oMykpKSB7IGdfdGVzdF9sZXZlbD0xOyAgVkVSSUZZKCAgbS5oYXNOYU4oKSApOyAgICAgICAgICAgICAgIGdfdGVzdF9sZXZlbD0wOyB9Ci0gIH0KLSAgVCBoaWRkZW5femVybyA9IChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptaW4pKCkqKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbikoKTsKKyAgVCBoaWRkZW5femVybyA9IChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptaW4pKCkgKiAoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKSgpOwogICBtKDQpIC89IGhpZGRlbl96ZXJvOwotICBpZihkcnlydW4pCi0gIHsKLSAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6aXNmaW5pdGUoIiA8PCBtKDQpIDw8ICIpID0gIjsgY2hlY2soKHN0ZDo6aXNmaW5pdGUpKG0oNCkpLGZhbHNlKTsgc3RkOjpjb3V0IDw8ICIgIDsgbnVtZXh0Ojppc2Zpbml0ZSA9ICI7IGNoZWNrKChudW1leHQ6OmlzZmluaXRlKShtKDQpKSwgZmFsc2UpOyBzdGQ6OmNvdXQgPDwgIlxuIjsKLSAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6aXNpbmYoIiA8PCBtKDQpIDw8ICIpICAgID0gIjsgY2hlY2soKHN0ZDo6aXNpbmYpKG0oNCkpLHRydWUpOyAgICAgc3RkOjpjb3V0IDw8ICIgIDsgbnVtZXh0Ojppc2luZiAgICA9ICI7IGNoZWNrKChudW1leHQ6OmlzaW5mKShtKDQpKSwgdHJ1ZSk7IHN0ZDo6Y291dCA8PCAiXG4iOwotICAgIHN0ZDo6Y291dCA8PCAic3RkOjppc25hbigiIDw8IG0oNCkgPDwgIikgICAgPSAiOyBjaGVjaygoc3RkOjppc25hbikobSg0KSksZmFsc2UpOyAgICBzdGQ6OmNvdXQgPDwgIiAgOyBudW1leHQ6OmlzbmFuICAgID0gIjsgY2hlY2soKG51bWV4dDo6aXNuYW4pKG0oNCkpLCBmYWxzZSk7IHN0ZDo6Y291dCA8PCAiXG4iOwotICAgIHN0ZDo6Y291dCA8PCAiYWxsRmluaXRlOiAiOyBjaGVjayhtLmFsbEZpbml0ZSgpLCAwKTsgc3RkOjpjb3V0IDw8ICJcbiI7Ci0gICAgc3RkOjpjb3V0IDw8ICJoYXNOYU46ICAgICI7IGNoZWNrKG0uaGFzTmFOKCksIDEpOyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgaWYgKGRyeXJ1bikgeworICAgIHN0ZDo6Y291dCA8PCAic3RkOjppc2Zpbml0ZSgiIDw8IG0oNCkgPDwgIikgPSAiOworICAgIGNoZWNrKChzdGQ6OmlzZmluaXRlKShtKDQpKSwgZmFsc2UpOworICAgIHN0ZDo6Y291dCA8PCAiICA7IG51bWV4dDo6aXNmaW5pdGUgPSAiOworICAgIGNoZWNrKChudW1leHQ6OmlzZmluaXRlKShtKDQpKSwgZmFsc2UpOwogICAgIHN0ZDo6Y291dCA8PCAiXG4iOwotICB9Ci0gIGVsc2UKLSAgewotICAgIGlmKCAoc3RkOjppc2Zpbml0ZSkobSgzKSkpIHsgZ190ZXN0X2xldmVsPTE7ICBWRVJJRlkoICEobnVtZXh0Ojppc2Zpbml0ZSkobSg0KSkgKTsgIGdfdGVzdF9sZXZlbD0wOyB9Ci0gICAgaWYoIShzdGQ6OmlzaW5mKSAgIChtKDMpKSkgeyBnX3Rlc3RfbGV2ZWw9MTsgIFZFUklGWSggIChudW1leHQ6OmlzaW5mKShtKDQpKSApOyAgICAgZ190ZXN0X2xldmVsPTA7IH0KLSAgICBpZiggKHN0ZDo6aXNuYW4pICAgKG0oMykpKSB7IGdfdGVzdF9sZXZlbD0xOyAgVkVSSUZZKCAhKG51bWV4dDo6aXNuYW4pKG0oNCkpICk7ICAgICBnX3Rlc3RfbGV2ZWw9MDsgfQotICAgIGlmKCAoc3RkOjppc2Zpbml0ZSkobSgzKSkpIHsgZ190ZXN0X2xldmVsPTE7ICBWRVJJRlkoICFtLmFsbEZpbml0ZSgpICk7ICAgICAgICAgICAgIGdfdGVzdF9sZXZlbD0wOyB9Ci0gICAgaWYoIShzdGQ6OmlzbmFuKSAgIChtKDMpKSkgeyBnX3Rlc3RfbGV2ZWw9MTsgIFZFUklGWSggIG0uaGFzTmFOKCkgKTsgICAgICAgICAgICAgICAgZ190ZXN0X2xldmVsPTA7IH0KKyAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6aXNpbmYoIiA8PCBtKDQpIDw8ICIpICAgID0gIjsKKyAgICBjaGVjaygoc3RkOjppc2luZikobSg0KSksIHRydWUpOworICAgIHN0ZDo6Y291dCA8PCAiICA7IG51bWV4dDo6aXNpbmYgICAgPSAiOworICAgIGNoZWNrKChudW1leHQ6OmlzaW5mKShtKDQpKSwgdHJ1ZSk7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJzdGQ6OmlzbmFuKCIgPDwgbSg0KSA8PCAiKSAgICA9ICI7CisgICAgY2hlY2soKHN0ZDo6aXNuYW4pKG0oNCkpLCBmYWxzZSk7CisgICAgc3RkOjpjb3V0IDw8ICIgIDsgbnVtZXh0Ojppc25hbiAgICA9ICI7CisgICAgY2hlY2soKG51bWV4dDo6aXNuYW4pKG0oNCkpLCBmYWxzZSk7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJhbGxGaW5pdGU6ICI7CisgICAgY2hlY2sobS5hbGxGaW5pdGUoKSwgMCk7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJoYXNOYU46ICAgICI7CisgICAgY2hlY2sobS5oYXNOYU4oKSwgMSk7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJcbiI7CisgIH0gZWxzZSB7CisgICAgaWYgKChzdGQ6OmlzZmluaXRlKShtKDMpKSkgeworICAgICAgZ190ZXN0X2xldmVsID0gMTsKKyAgICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKG0oNCkpKTsKKyAgICAgIGdfdGVzdF9sZXZlbCA9IDA7CisgICAgfQorICAgIGlmICghKHN0ZDo6aXNpbmYpKG0oMykpKSB7CisgICAgICBnX3Rlc3RfbGV2ZWwgPSAxOworICAgICAgVkVSSUZZKChudW1leHQ6OmlzaW5mKShtKDQpKSk7CisgICAgICBnX3Rlc3RfbGV2ZWwgPSAwOworICAgIH0KKyAgICBpZiAoKHN0ZDo6aXNuYW4pKG0oMykpKSB7CisgICAgICBnX3Rlc3RfbGV2ZWwgPSAxOworICAgICAgVkVSSUZZKCEobnVtZXh0Ojppc25hbikobSg0KSkpOworICAgICAgZ190ZXN0X2xldmVsID0gMDsKKyAgICB9CisgICAgaWYgKChzdGQ6OmlzZmluaXRlKShtKDMpKSkgeworICAgICAgZ190ZXN0X2xldmVsID0gMTsKKyAgICAgIFZFUklGWSghbS5hbGxGaW5pdGUoKSk7CisgICAgICBnX3Rlc3RfbGV2ZWwgPSAwOworICAgIH0KKyAgICBpZiAoIShzdGQ6OmlzbmFuKShtKDMpKSkgeworICAgICAgZ190ZXN0X2xldmVsID0gMTsKKyAgICAgIFZFUklGWShtLmhhc05hTigpKTsKKyAgICAgIGdfdGVzdF9sZXZlbCA9IDA7CisgICAgfQogICB9CiAgIG0oMykgPSAwOwotICBpZihkcnlydW4pCi0gIHsKLSAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6aXNmaW5pdGUoIiA8PCBtKDMpIDw8ICIpID0gIjsgY2hlY2soKHN0ZDo6aXNmaW5pdGUpKG0oMykpLHRydWUpOyBzdGQ6OmNvdXQgPDwgIiAgOyBudW1leHQ6OmlzZmluaXRlID0gIjsgY2hlY2soKG51bWV4dDo6aXNmaW5pdGUpKG0oMykpLCB0cnVlKTsgc3RkOjpjb3V0IDw8ICJcbiI7Ci0gICAgc3RkOjpjb3V0IDw8ICJzdGQ6OmlzaW5mKCIgPDwgbSgzKSA8PCAiKSAgICA9ICI7IGNoZWNrKChzdGQ6OmlzaW5mKShtKDMpKSxmYWxzZSk7ICAgc3RkOjpjb3V0IDw8ICIgIDsgbnVtZXh0Ojppc2luZiAgICA9ICI7IGNoZWNrKChudW1leHQ6OmlzaW5mKShtKDMpKSwgZmFsc2UpOyBzdGQ6OmNvdXQgPDwgIlxuIjsKLSAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6aXNuYW4oIiA8PCBtKDMpIDw8ICIpICAgID0gIjsgY2hlY2soKHN0ZDo6aXNuYW4pKG0oMykpLGZhbHNlKTsgICBzdGQ6OmNvdXQgPDwgIiAgOyBudW1leHQ6OmlzbmFuICAgID0gIjsgY2hlY2soKG51bWV4dDo6aXNuYW4pKG0oMykpLCBmYWxzZSk7IHN0ZDo6Y291dCA8PCAiXG4iOwotICAgIHN0ZDo6Y291dCA8PCAiYWxsRmluaXRlOiAiOyBjaGVjayhtLmFsbEZpbml0ZSgpLCAwKTsgc3RkOjpjb3V0IDw8ICJcbiI7Ci0gICAgc3RkOjpjb3V0IDw8ICJoYXNOYU46ICAgICI7IGNoZWNrKG0uaGFzTmFOKCksIDApOyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgaWYgKGRyeXJ1bikgeworICAgIHN0ZDo6Y291dCA8PCAic3RkOjppc2Zpbml0ZSgiIDw8IG0oMykgPDwgIikgPSAiOworICAgIGNoZWNrKChzdGQ6OmlzZmluaXRlKShtKDMpKSwgdHJ1ZSk7CisgICAgc3RkOjpjb3V0IDw8ICIgIDsgbnVtZXh0Ojppc2Zpbml0ZSA9ICI7CisgICAgY2hlY2soKG51bWV4dDo6aXNmaW5pdGUpKG0oMykpLCB0cnVlKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6aXNpbmYoIiA8PCBtKDMpIDw8ICIpICAgID0gIjsKKyAgICBjaGVjaygoc3RkOjppc2luZikobSgzKSksIGZhbHNlKTsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgOyBudW1leHQ6OmlzaW5mICAgID0gIjsKKyAgICBjaGVjaygobnVtZXh0Ojppc2luZikobSgzKSksIGZhbHNlKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6aXNuYW4oIiA8PCBtKDMpIDw8ICIpICAgID0gIjsKKyAgICBjaGVjaygoc3RkOjppc25hbikobSgzKSksIGZhbHNlKTsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgOyBudW1leHQ6OmlzbmFuICAgID0gIjsKKyAgICBjaGVjaygobnVtZXh0Ojppc25hbikobSgzKSksIGZhbHNlKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgImFsbEZpbml0ZTogIjsKKyAgICBjaGVjayhtLmFsbEZpbml0ZSgpLCAwKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICBzdGQ6OmNvdXQgPDwgImhhc05hTjogICAgIjsKKyAgICBjaGVjayhtLmhhc05hTigpLCAwKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKICAgICBzdGQ6OmNvdXQgPDwgIlxuXG4iOwotICB9Ci0gIGVsc2UKLSAgewotICAgIGlmKCEoc3RkOjppc2Zpbml0ZSkobSgzKSkpIHsgZ190ZXN0X2xldmVsPTE7ICBWRVJJRlkoICAobnVtZXh0Ojppc2Zpbml0ZSkobSgzKSkgKTsgIGdfdGVzdF9sZXZlbD0wOyB9Ci0gICAgaWYoIChzdGQ6OmlzaW5mKSAgIChtKDMpKSkgeyBnX3Rlc3RfbGV2ZWw9MTsgIFZFUklGWSggIShudW1leHQ6OmlzaW5mKShtKDMpKSApOyAgICAgZ190ZXN0X2xldmVsPTA7IH0KLSAgICBpZiggKHN0ZDo6aXNuYW4pICAgKG0oMykpKSB7IGdfdGVzdF9sZXZlbD0xOyAgVkVSSUZZKCAhKG51bWV4dDo6aXNuYW4pKG0oMykpICk7ICAgICBnX3Rlc3RfbGV2ZWw9MDsgfQotICAgIGlmKCAoc3RkOjppc2Zpbml0ZSkobSgzKSkpIHsgZ190ZXN0X2xldmVsPTE7ICBWRVJJRlkoICFtLmFsbEZpbml0ZSgpICk7ICAgICAgICAgICAgIGdfdGVzdF9sZXZlbD0wOyB9Ci0gICAgaWYoIChzdGQ6OmlzbmFuKSAgIChtKDMpKSkgeyBnX3Rlc3RfbGV2ZWw9MTsgIFZFUklGWSggIW0uaGFzTmFOKCkgKTsgICAgICAgICAgICAgICAgZ190ZXN0X2xldmVsPTA7IH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIShzdGQ6OmlzZmluaXRlKShtKDMpKSkgeworICAgICAgZ190ZXN0X2xldmVsID0gMTsKKyAgICAgIFZFUklGWSgobnVtZXh0Ojppc2Zpbml0ZSkobSgzKSkpOworICAgICAgZ190ZXN0X2xldmVsID0gMDsKKyAgICB9CisgICAgaWYgKChzdGQ6OmlzaW5mKShtKDMpKSkgeworICAgICAgZ190ZXN0X2xldmVsID0gMTsKKyAgICAgIFZFUklGWSghKG51bWV4dDo6aXNpbmYpKG0oMykpKTsKKyAgICAgIGdfdGVzdF9sZXZlbCA9IDA7CisgICAgfQorICAgIGlmICgoc3RkOjppc25hbikobSgzKSkpIHsKKyAgICAgIGdfdGVzdF9sZXZlbCA9IDE7CisgICAgICBWRVJJRlkoIShudW1leHQ6OmlzbmFuKShtKDMpKSk7CisgICAgICBnX3Rlc3RfbGV2ZWwgPSAwOworICAgIH0KKyAgICBpZiAoKHN0ZDo6aXNmaW5pdGUpKG0oMykpKSB7CisgICAgICBnX3Rlc3RfbGV2ZWwgPSAxOworICAgICAgVkVSSUZZKCFtLmFsbEZpbml0ZSgpKTsKKyAgICAgIGdfdGVzdF9sZXZlbCA9IDA7CisgICAgfQorICAgIGlmICgoc3RkOjppc25hbikobSgzKSkpIHsKKyAgICAgIGdfdGVzdF9sZXZlbCA9IDE7CisgICAgICBWRVJJRlkoIW0uaGFzTmFOKCkpOworICAgICAgZ190ZXN0X2xldmVsID0gMDsKKyAgICB9CiAgIH0KIH0KIAogRUlHRU5fREVDTEFSRV9URVNUKGZhc3RtYXRoKSB7Ci0gIHN0ZDo6Y291dCA8PCAiKioqIGZsb2F0ICoqKiBcblxuIjsgY2hlY2tfaW5mX25hbjxmbG9hdD4odHJ1ZSk7Ci0gIHN0ZDo6Y291dCA8PCAiKioqIGRvdWJsZSAqKipcblxuIjsgY2hlY2tfaW5mX25hbjxkb3VibGU+KHRydWUpOwotICBzdGQ6OmNvdXQgPDwgIioqKiBsb25nIGRvdWJsZSAqKiogXG5cbiI7IGNoZWNrX2luZl9uYW48bG9uZyBkb3VibGU+KHRydWUpOworICBzdGQ6OmNvdXQgPDwgIioqKiBmbG9hdCAqKiogXG5cbiI7CisgIGNoZWNrX2luZl9uYW48ZmxvYXQ+KHRydWUpOworICBzdGQ6OmNvdXQgPDwgIioqKiBkb3VibGUgKioqXG5cbiI7CisgIGNoZWNrX2luZl9uYW48ZG91YmxlPih0cnVlKTsKKyAgc3RkOjpjb3V0IDw8ICIqKiogbG9uZyBkb3VibGUgKioqIFxuXG4iOworICBjaGVja19pbmZfbmFuPGxvbmcgZG91YmxlPih0cnVlKTsKIAogICBjaGVja19pbmZfbmFuPGZsb2F0PihmYWxzZSk7CiAgIGNoZWNrX2luZl9uYW48ZG91YmxlPihmYWxzZSk7CmRpZmYgLS1naXQgYS90ZXN0L2ZpcnN0X2FsaWduZWQuY3BwIGIvdGVzdC9maXJzdF9hbGlnbmVkLmNwcAppbmRleCBhYWE0ZDAxLi42Njk1Nzg1IDEwMDY0NAotLS0gYS90ZXN0L2ZpcnN0X2FsaWduZWQuY3BwCisrKyBiL3Rlc3QvZmlyc3RfYWxpZ25lZC5jcHAKQEAgLTksNDIgKzksNDEgQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgotdm9pZCB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKFNjYWxhciAqYXJyYXksIGludCBzaXplKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihTY2FsYXIgKmFycmF5LCBpbnQgc2l6ZSkgewogICBjb25zdCBpbnQgcGFja2V0X3NpemUgPSBzaXplb2YoU2NhbGFyKSAqIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnNpemU7CiAgIFZFUklGWSgoKHNpemVfdChhcnJheSkgKyBzaXplb2YoU2NhbGFyKSAqIGludGVybmFsOjpmaXJzdF9kZWZhdWx0X2FsaWduZWQoYXJyYXksIHNpemUpKSAlIHBhY2tldF9zaXplKSA9PSAwKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgotdm9pZCB0ZXN0X25vbmVfYWxpZ25lZF9oZWxwZXIoU2NhbGFyICphcnJheSwgaW50IHNpemUpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCB0ZXN0X25vbmVfYWxpZ25lZF9oZWxwZXIoU2NhbGFyICphcnJheSwgaW50IHNpemUpIHsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGFycmF5KTsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHNpemUpOwogICBWRVJJRlkoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZSA9PSAxIHx8IGludGVybmFsOjpmaXJzdF9kZWZhdWx0X2FsaWduZWQoYXJyYXksIHNpemUpID09IHNpemUpOwogfQogCi1zdHJ1Y3Qgc29tZV9ub25fdmVjdG9yaXphYmxlX3R5cGUgeyBmbG9hdCB4OyB9Oworc3RydWN0IHNvbWVfbm9uX3ZlY3Rvcml6YWJsZV90eXBlIHsKKyAgZmxvYXQgeDsKK307CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChmaXJzdF9hbGlnbmVkKQoteworRUlHRU5fREVDTEFSRV9URVNUKGZpcnN0X2FsaWduZWQpIHsKICAgRUlHRU5fQUxJR04xNiBmbG9hdCBhcnJheV9mbG9hdFsxMDBdOwogICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2Zsb2F0LCA1MCk7Ci0gIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQrMSwgNTApOwotICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2Zsb2F0KzIsIDUwKTsKLSAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9mbG9hdCszLCA1MCk7Ci0gIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQrNCwgNTApOwotICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2Zsb2F0KzUsIDUwKTsKLSAgCisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQgKyAxLCA1MCk7CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQgKyAyLCA1MCk7CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQgKyAzLCA1MCk7CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQgKyA0LCA1MCk7CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZmxvYXQgKyA1LCA1MCk7CisKICAgRUlHRU5fQUxJR04xNiBkb3VibGUgYXJyYXlfZG91YmxlWzEwMF07CiAgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZG91YmxlLCA1MCk7Ci0gIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZG91YmxlKzEsIDUwKTsKLSAgdGVzdF9maXJzdF9hbGlnbmVkX2hlbHBlcihhcnJheV9kb3VibGUrMiwgNTApOwotICAKLSAgZG91YmxlICphcnJheV9kb3VibGVfcGx1c180X2J5dGVzID0gKGRvdWJsZSopKHN0ZDo6dWludHB0cl90KGFycmF5X2RvdWJsZSkrNCk7CisgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfZG91YmxlICsgMSwgNTApOworICB0ZXN0X2ZpcnN0X2FsaWduZWRfaGVscGVyKGFycmF5X2RvdWJsZSArIDIsIDUwKTsKKworICBkb3VibGUgKmFycmF5X2RvdWJsZV9wbHVzXzRfYnl0ZXMgPSAoZG91YmxlICopKHN0ZDo6dWludHB0cl90KGFycmF5X2RvdWJsZSkgKyA0KTsKICAgdGVzdF9ub25lX2FsaWduZWRfaGVscGVyKGFycmF5X2RvdWJsZV9wbHVzXzRfYnl0ZXMsIDUwKTsKLSAgdGVzdF9ub25lX2FsaWduZWRfaGVscGVyKGFycmF5X2RvdWJsZV9wbHVzXzRfYnl0ZXMrMSwgNTApOwotICAKKyAgdGVzdF9ub25lX2FsaWduZWRfaGVscGVyKGFycmF5X2RvdWJsZV9wbHVzXzRfYnl0ZXMgKyAxLCA1MCk7CisKICAgc29tZV9ub25fdmVjdG9yaXphYmxlX3R5cGUgYXJyYXlfbm9udmVjWzEwMF07CiAgIHRlc3RfZmlyc3RfYWxpZ25lZF9oZWxwZXIoYXJyYXlfbm9udmVjLCAxMDApOwogICB0ZXN0X25vbmVfYWxpZ25lZF9oZWxwZXIoYXJyYXlfbm9udmVjLCAxMDApOwpkaWZmIC0tZ2l0IGEvdGVzdC9mbG9hdF9jb252ZXJzaW9uLmNwcCBiL3Rlc3QvZmxvYXRfY29udmVyc2lvbi5jcHAKaW5kZXggZmQ4ZDQ1ZC4uNmVhOGEzNyAxMDA2NDQKLS0tIGEvdGVzdC9mbG9hdF9jb252ZXJzaW9uLmNwcAorKysgYi90ZXN0L2Zsb2F0X2NvbnZlcnNpb24uY3BwCkBAIC05LDcgKzksNyBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KIHZvaWQgdGVzdF9jb252ZXJzaW9uKCkgewogICB0eXBlZGVmIEFycmF5PEZyb20sIER5bmFtaWMsIDE+IEFycmF5WEZyb207CiAgIHR5cGVkZWYgQXJyYXk8VG8sIER5bmFtaWMsIDE+IEFycmF5WFRvOwpAQCAtMjEsNyArMjEsNyBAQAogCiAgIC8vIEFycmF5WEZyb206OlJhbmRvbSgpIG9ubHkgZ2VuZXJhdGVzIDMyLWJpdCB2YWx1ZXMgKCMyNzQ5KSwgc28gd2UgZ2VuZXJhdGUKICAgLy8gZG91YmxlcyBhbmQgc2NhbGUgdG8gZml0IHRoZSByYW5nZS4KLSAgQXJyYXlYRG91YmxlIGRvdWJsZXMgPSAoQXJyYXlYRG91YmxlOjpSYW5kb20oc2l6ZSkrMS4wKSooZnJvbV9yYW5nZS8yLjApICsgZnJvbV9taW47CisgIEFycmF5WERvdWJsZSBkb3VibGVzID0gKEFycmF5WERvdWJsZTo6UmFuZG9tKHNpemUpICsgMS4wKSAqIChmcm9tX3JhbmdlIC8gMi4wKSArIGZyb21fbWluOwogICBBcnJheVhGcm9tIGZyb20gPSBkb3VibGVzLnRlbXBsYXRlIGNhc3Q8RnJvbT4oKTsKICAgQXJyYXlYVG8gdG8oc2l6ZSk7CiAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKQEAgLTMwLDcgKzMwLDcgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChmcm9tLnRlbXBsYXRlIGNhc3Q8VG8+KCksIHRvKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVG8+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8+CiB2b2lkIHRlc3RfY29udmVyc2lvbl90bygpIHsKICAgQ0FMTF9TVUJURVNUKCh0ZXN0X2NvbnZlcnNpb248aW50NjRfdCwgVG8+KCkpKTsKICAgQ0FMTF9TVUJURVNUKCh0ZXN0X2NvbnZlcnNpb248dWludDY0X3QsIFRvPigpKSk7CkBAIC00Miw5ICs0Miw4IEBACiAgIENBTExfU1VCVEVTVCgodGVzdF9jb252ZXJzaW9uPHVpbnQ4X3QsIFRvPigpKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChmbG9hdF9jb252ZXJzaW9uKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworRUlHRU5fREVDTEFSRV9URVNUKGZsb2F0X2NvbnZlcnNpb24pIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CiAgICAgQ0FMTF9TVUJURVNUKHRlc3RfY29udmVyc2lvbl90bzxmbG9hdD4oKSk7CiAgICAgQ0FMTF9TVUJURVNUKHRlc3RfY29udmVyc2lvbl90bzxkb3VibGU+KCkpOwogICB9CmRpZmYgLS1naXQgYS90ZXN0L2dlb19hbGlnbmVkYm94LmNwcCBiL3Rlc3QvZ2VvX2FsaWduZWRib3guY3BwCmluZGV4IGU0ZGFiMzIuLjI2NmU1OGIgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ2VvX2FsaWduZWRib3guY3BwCisrKyBiL3Rlc3QvZ2VvX2FsaWduZWRib3guY3BwCkBAIC0xNSw4ICsxNSw4IEBACiAvLyBOT1RFIHRoZSBmb2xsb3dpbmcgd29ya2Fyb3VuZCB3YXMgbmVlZGVkIG9uIHNvbWUgMzIgYml0cyBidWlsZHMgdG8ga2lsbCBleHRyYSBwcmVjaXNpb24gb2YgeDg3IHJlZ2lzdGVycy4KIC8vIEl0IHNlZW1zIHRoYXQgaXQgaXMgbm90IG5lZWRlZCBhbnltb3JlLCBidXQgbGV0J3Mga2VlcCBpdCBoZXJlLCBqdXN0IGluIGNhc2UuLi4KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gRUlHRU5fRE9OVF9JTkxJTkUKLXZvaWQga2lsbF9leHRyYV9wcmVjaXNpb24oVCYgLyogeCAqLykgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGtpbGxfZXh0cmFfcHJlY2lzaW9uKFQmIC8qIHggKi8pIHsKICAgLy8gVGhpcyBvbmUgd29ya2VkIGJ1dCB0cmlnZ2VyZWQgYSB3YXJuaW5nOgogICAvKiBlaWdlbl9hc3NlcnQoKHZvaWQqKSgmeCkgIT0gKHZvaWQqKTApOyAqLwogICAvLyBBbiBhbHRlcm5hdGl2ZSBjb3VsZCBiZToKQEAgLTI0LDkgKzI0LDggQEAKICAgLyogeCA9IHRtcDsgKi8KIH0KIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBCb3hUeXBlPiB2b2lkIGFsaWduZWRib3goY29uc3QgQm94VHlwZSYgYm94KQotewordGVtcGxhdGUgPHR5cGVuYW1lIEJveFR5cGU+Cit2b2lkIGFsaWduZWRib3goY29uc3QgQm94VHlwZSYgYm94KSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgQWxpZ25lZEJveC5oCiAgICovCkBAIC0zOSwxMiArMzgsMTMgQEAKIAogICBWZWN0b3JUeXBlIHAwID0gVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSk7CiAgIFZlY3RvclR5cGUgcDEgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKLSAgd2hpbGUoIHAxID09IHAwICl7Ci0gICAgICBwMSA9ICBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsgfQotICBSZWFsU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxSZWFsU2NhbGFyPigwLDEpOworICB3aGlsZSAocDEgPT0gcDApIHsKKyAgICBwMSA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pOworICB9CisgIFJlYWxTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFJlYWxTY2FsYXI+KDAsIDEpOwogCiAgIEJveFR5cGUgYjAoZGltKTsKLSAgQm94VHlwZSBiMShWZWN0b3JUeXBlOjpSYW5kb20oZGltKSxWZWN0b3JUeXBlOjpSYW5kb20oZGltKSk7CisgIEJveFR5cGUgYjEoVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSksIFZlY3RvclR5cGU6OlJhbmRvbShkaW0pKTsKICAgQm94VHlwZSBiMjsKIAogICBraWxsX2V4dHJhX3ByZWNpc2lvbihiMSk7CkBAIC01Myw5ICs1Myw5IEBACiAKICAgYjAuZXh0ZW5kKHAwKTsKICAgYjAuZXh0ZW5kKHAxKTsKLSAgVkVSSUZZKGIwLmNvbnRhaW5zKHAwKnMxKyhTY2FsYXIoMSktczEpKnAxKSk7CisgIFZFUklGWShiMC5jb250YWlucyhwMCAqIHMxICsgKFNjYWxhcigxKSAtIHMxKSAqIHAxKSk7CiAgIFZFUklGWShiMC5jb250YWlucyhiMC5jZW50ZXIoKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKGIwLmNlbnRlcigpLChwMCtwMSkvU2NhbGFyKDIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChiMC5jZW50ZXIoKSwgKHAwICsgcDEpIC8gU2NhbGFyKDIpKTsKIAogICAoYjIgPSBiMCkuZXh0ZW5kKGIxKTsKICAgVkVSSUZZKGIyLmNvbnRhaW5zKGIwKSk7CkBAIC03MSwyMyArNzEsMjEgQEAKICAgVkVSSUZZKGJveDEuaW50ZXJzZWN0cyhib3gyKSA9PSAhYm94MS5pbnRlcnNlY3Rpb24oYm94MikuaXNFbXB0eSgpKTsKIAogICAvLyBhbGlnbm1lbnQgLS0gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG1lbW9yeSBhbGlnbm1lbnQgYXNzZXJ0aW9uCi0gIEJveFR5cGUgKmJwMCA9IG5ldyBCb3hUeXBlKGRpbSk7Ci0gIEJveFR5cGUgKmJwMSA9IG5ldyBCb3hUeXBlKGRpbSk7CisgIEJveFR5cGUqIGJwMCA9IG5ldyBCb3hUeXBlKGRpbSk7CisgIEJveFR5cGUqIGJwMSA9IG5ldyBCb3hUeXBlKGRpbSk7CiAgIGJwMC0+ZXh0ZW5kKCpicDEpOwogICBkZWxldGUgYnAwOwogICBkZWxldGUgYnAxOwogCiAgIC8vIHNhbXBsaW5nCi0gIGZvciggaW50IGk9MDsgaTwxMDsgKytpICkKLSAgewotICAgICAgVmVjdG9yVHlwZSByID0gYjAuc2FtcGxlKCk7Ci0gICAgICBWRVJJRlkoYjAuY29udGFpbnMocikpOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBWZWN0b3JUeXBlIHIgPSBiMC5zYW1wbGUoKTsKKyAgICBWRVJJRlkoYjAuY29udGFpbnMocikpOwogICB9Ci0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgQm94VHlwZT4gdm9pZCBhbGlnbmVkYm94VHJhbnNsYXRhYmxlKGNvbnN0IEJveFR5cGUmIGJveCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBCb3hUeXBlPgordm9pZCBhbGlnbmVkYm94VHJhbnNsYXRhYmxlKGNvbnN0IEJveFR5cGUmIGJveCkgewogICB0eXBlZGVmIHR5cGVuYW1lIEJveFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQm94VHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CiAgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwgQm94VHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWUsIElzb21ldHJ5PiBJc29tZXRyeVRyYW5zZm9ybTsKQEAgLTE1MywxMyArMTUxLDExIEBACiAgIEJveFR5cGUgdHJhbnNmb3JtZWRDID0gYy50cmFuc2Zvcm1lZChJc29tZXRyeVRyYW5zZm9ybTo6SWRlbnRpdHkoKSk7CiAgIFZFUklGWV9JU19BUFBST1godHJhbnNmb3JtZWRDLCBjKTsKIAotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwOyArK2kpCi0gIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDsgKytpKSB7CiAgICAgVmVjdG9yVHlwZSBtaW5Db3JuZXI7CiAgICAgVmVjdG9yVHlwZSBtYXhDb3JuZXI7Ci0gICAgZm9yIChJbmRleCBkID0gMDsgZCA8IGRpbTsgKytkKQotICAgIHsKLSAgICAgIG1pbkNvcm5lcltkXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMTAsMTApOworICAgIGZvciAoSW5kZXggZCA9IDA7IGQgPCBkaW07ICsrZCkgeworICAgICAgbWluQ29ybmVyW2RdID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC0xMCwgMTApOwogICAgICAgbWF4Q29ybmVyW2RdID0gbWluQ29ybmVyW2RdICsgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KDAsIDEwKTsKICAgICB9CiAKQEAgLTE3MywzMSArMTY5LDI5IEBACiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBSb3RhdGlvbj4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFJvdGF0aW9uPgogUm90YXRpb24gcm90YXRlMkQoU2NhbGFyIGFuZ2xlKSB7CiAgIHJldHVybiBSb3RhdGlvbjJEPFNjYWxhcj4oYW5nbGUpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFJvdGF0aW9uPgordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUm90YXRpb24+CiBSb3RhdGlvbiByb3RhdGUyREludGVncmFsKHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpOb25JbnRlZ2VyIGFuZ2xlKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46Ok5vbkludGVnZXIgTm9uSW50ZWdlcjsKLSAgcmV0dXJuIFJvdGF0aW9uMkQ8Tm9uSW50ZWdlcj4oYW5nbGUpLnRvUm90YXRpb25NYXRyaXgoKS4KLSAgICAgIHRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOworICByZXR1cm4gUm90YXRpb24yRDxOb25JbnRlZ2VyPihhbmdsZSkudG9Sb3RhdGlvbk1hdHJpeCgpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFJvdGF0aW9uPgordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUm90YXRpb24+CiBSb3RhdGlvbiByb3RhdGUzRFpBeGlzKFNjYWxhciBhbmdsZSkgewogICByZXR1cm4gQW5nbGVBeGlzPFNjYWxhcj4oYW5nbGUsIE1hdHJpeDxTY2FsYXIsIDMsIDE+KDAsIDAsIDEpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBSb3RhdGlvbj4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFJvdGF0aW9uPgogUm90YXRpb24gcm90YXRlM0RaQXhpc0ludGVncmFsKHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpOb25JbnRlZ2VyIGFuZ2xlKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46Ok5vbkludGVnZXIgTm9uSW50ZWdlcjsKLSAgcmV0dXJuIEFuZ2xlQXhpczxOb25JbnRlZ2VyPihhbmdsZSwgTWF0cml4PE5vbkludGVnZXIsIDMsIDE+KDAsIDAsIDEpKS4KLSAgICAgIHRvUm90YXRpb25NYXRyaXgoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKKyAgcmV0dXJuIEFuZ2xlQXhpczxOb25JbnRlZ2VyPihhbmdsZSwgTWF0cml4PE5vbkludGVnZXIsIDMsIDE+KDAsIDAsIDEpKS50b1JvdGF0aW9uTWF0cml4KCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUm90YXRpb24+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBSb3RhdGlvbj4KIFJvdGF0aW9uIHJvdGF0ZTREWldBeGlzKFNjYWxhciBhbmdsZSkgewogICBSb3RhdGlvbiByZXN1bHQgPSBNYXRyaXg8U2NhbGFyLCA0LCA0Pjo6SWRlbnRpdHkoKTsKICAgcmVzdWx0LmJsb2NrKDAsIDAsIDMsIDMpID0gcm90YXRlM0RaQXhpczxTY2FsYXIsIEFuZ2xlQXhpc2Q+KGFuZ2xlKS50b1JvdGF0aW9uTWF0cml4KCk7CkBAIC0yMDUsOCArMTk5LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci1NYXRyaXhUeXBlIHJhbmRvbVJvdGF0aW9uTWF0cml4KCkKLXsKK01hdHJpeFR5cGUgcmFuZG9tUm90YXRpb25NYXRyaXgoKSB7CiAgIC8vIGFsZ29yaXRobSBmcm9tCiAgIC8vIGh0dHBzOi8vd3d3LmlzcHJzLWFubi1waG90b2dyYW1tLXJlbW90ZS1zZW5zLXNwYXRpYWwtaW5mLXNjaS5uZXQvSUlJLTcvMTAzLzIwMTYvaXNwcnMtYW5uYWxzLUlJSS03LTEwMy0yMDE2LnBkZgogICBjb25zdCBNYXRyaXhUeXBlIHJhbmQgPSBNYXRyaXhUeXBlOjpSYW5kb20oKTsKQEAgLTIyMCwyMSArMjEzLDE3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+Ci1NYXRyaXg8U2NhbGFyLCBEaW0sICgxPDxEaW0pPiBib3hHZXRDb3JuZXJzKGNvbnN0IE1hdHJpeDxTY2FsYXIsIERpbSwgMT4mIG1pbl8sIGNvbnN0IE1hdHJpeDxTY2FsYXIsIERpbSwgMT4mIG1heF8pCi17Ci0gIE1hdHJpeDxTY2FsYXIsIERpbSwgKDE8PERpbSkgPiByZXN1bHQ7Ci0gIGZvcihJbmRleCBpPTA7IGk8KDE8PERpbSk7ICsraSkKLSAgewotICAgIGZvcihJbmRleCBqPTA7IGo8RGltOyArK2opCi0gICAgICByZXN1bHQoaixpKSA9IChpICYgKDE8PGopKSA/IG1pbl8oaikgOiBtYXhfKGopOworTWF0cml4PFNjYWxhciwgRGltLCAoMSA8PCBEaW0pPiBib3hHZXRDb3JuZXJzKGNvbnN0IE1hdHJpeDxTY2FsYXIsIERpbSwgMT4mIG1pbl8sIGNvbnN0IE1hdHJpeDxTY2FsYXIsIERpbSwgMT4mIG1heF8pIHsKKyAgTWF0cml4PFNjYWxhciwgRGltLCAoMSA8PCBEaW0pPiByZXN1bHQ7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCAoMSA8PCBEaW0pOyArK2kpIHsKKyAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgRGltOyArK2opIHJlc3VsdChqLCBpKSA9IChpICYgKDEgPDwgaikpID8gbWluXyhqKSA6IG1heF8oaik7CiAgIH0KICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgQm94VHlwZSwgdHlwZW5hbWUgUm90YXRpb24+IHZvaWQgYWxpZ25lZGJveFJvdGF0YWJsZSgKLSAgICBjb25zdCBCb3hUeXBlJiBib3gsCi0gICAgUm90YXRpb24gKCpyb3RhdGUpKHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBCb3hUeXBlOjpTY2FsYXI+OjpOb25JbnRlZ2VyIC8qX2FuZ2xlKi8pKQotewordGVtcGxhdGUgPHR5cGVuYW1lIEJveFR5cGUsIHR5cGVuYW1lIFJvdGF0aW9uPgordm9pZCBhbGlnbmVkYm94Um90YXRhYmxlKGNvbnN0IEJveFR5cGUmIGJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSb3RhdGlvbiAoKnJvdGF0ZSkodHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIEJveFR5cGU6OlNjYWxhcj46Ok5vbkludGVnZXIgLypfYW5nbGUqLykpIHsKICAgYWxpZ25lZGJveFRyYW5zbGF0YWJsZShib3gpOwogCiAgIHR5cGVkZWYgdHlwZW5hbWUgQm94VHlwZTo6U2NhbGFyIFNjYWxhcjsKQEAgLTMwMSwxMCArMjkwLDkgQEAKICAgVkVSSUZZX0lTX0FQUFJPWCgoYy5tYXgpKCksIE9uZXMgKyBVbml0WCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEJveFR5cGUsIHR5cGVuYW1lIFJvdGF0aW9uPiB2b2lkIGFsaWduZWRib3hOb25JbnRlZ3JhbFJvdGF0YWJsZSgKLSAgICBjb25zdCBCb3hUeXBlJiBib3gsCi0gICAgUm90YXRpb24gKCpyb3RhdGUpKHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBCb3hUeXBlOjpTY2FsYXI+OjpOb25JbnRlZ2VyIC8qX2FuZ2xlKi8pKQotewordGVtcGxhdGUgPHR5cGVuYW1lIEJveFR5cGUsIHR5cGVuYW1lIFJvdGF0aW9uPgordm9pZCBhbGlnbmVkYm94Tm9uSW50ZWdyYWxSb3RhdGFibGUoCisgICAgY29uc3QgQm94VHlwZSYgYm94LCBSb3RhdGlvbiAoKnJvdGF0ZSkodHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIEJveFR5cGU6OlNjYWxhcj46Ok5vbkludGVnZXIgLypfYW5nbGUqLykpIHsKICAgYWxpZ25lZGJveFJvdGF0YWJsZShib3gsIHJvdGF0ZSk7CiAKICAgdHlwZWRlZiB0eXBlbmFtZSBCb3hUeXBlOjpTY2FsYXIgU2NhbGFyOwpAQCAtMzI4LDEwICszMTYsMTIgQEAKIAogICBWZWN0b3JUeXBlIGNvcm5lckJMID0gKGMubWluKSgpOwogICBWZWN0b3JUeXBlIGNvcm5lclRSID0gKGMubWF4KSgpOwotICBWZWN0b3JUeXBlIGNvcm5lckJSID0gKGMubWluKSgpOyBjb3JuZXJCUlswXSA9IGNvcm5lclRSWzBdOwotICBWZWN0b3JUeXBlIGNvcm5lclRMID0gKGMubWF4KSgpOyBjb3JuZXJUTFswXSA9IGNvcm5lckJMWzBdOworICBWZWN0b3JUeXBlIGNvcm5lckJSID0gKGMubWluKSgpOworICBjb3JuZXJCUlswXSA9IGNvcm5lclRSWzBdOworICBWZWN0b3JUeXBlIGNvcm5lclRMID0gKGMubWF4KSgpOworICBjb3JuZXJUTFswXSA9IGNvcm5lckJMWzBdOwogCi0gIE5vbkludGVnZXIgYW5nbGUgPSBOb25JbnRlZ2VyKEVJR0VOX1BJLzMpOworICBOb25JbnRlZ2VyIGFuZ2xlID0gTm9uSW50ZWdlcihFSUdFTl9QSSAvIDMpOwogICBSb3RhdGlvbiByb3QgPSByb3RhdGUoYW5nbGUpOwogICBJc29tZXRyeVRyYW5zZm9ybSB0ZjI7CiAgIHRmMi5zZXRJZGVudGl0eSgpOwpAQCAtMzUyLDI3ICszNDIsMjQgQEAKICAgbWluQ29ybmVyWzFdID0gKG1pbikoKG1pbikoY29ybmVyQkxbMV0sIGNvcm5lckJSWzFdKSwgKG1pbikoY29ybmVyVExbMV0sIGNvcm5lclRSWzFdKSk7CiAgIG1heENvcm5lclsxXSA9IChtYXgpKChtYXgpKGNvcm5lckJMWzFdLCBjb3JuZXJCUlsxXSksIChtYXgpKGNvcm5lclRMWzFdLCBjb3JuZXJUUlsxXSkpOwogCi0gIGZvciAoSW5kZXggZCA9IDI7IGQgPCBkaW07ICsrZCkKLSAgICBWRVJJRllfSVNfQVBQUk9YKGMuc2l6ZXMoKVtkXSwgU2NhbGFyKDIpKTsKKyAgZm9yIChJbmRleCBkID0gMjsgZCA8IGRpbTsgKytkKSBWRVJJRllfSVNfQVBQUk9YKGMuc2l6ZXMoKVtkXSwgU2NhbGFyKDIpKTsKIAogICBWRVJJRllfSVNfQVBQUk9YKChjLm1pbikoKSwgbWluQ29ybmVyKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgoYy5tYXgpKCksIG1heENvcm5lcik7CiAKICAgVmVjdG9yVHlwZSBtaW5Db3JuZXJWYWx1ZSA9IE9uZXMgKiBTY2FsYXIoLTIpOwogICBWZWN0b3JUeXBlIG1heENvcm5lclZhbHVlID0gWmVybzsKLSAgbWluQ29ybmVyVmFsdWVbMF0gPSBTY2FsYXIoU2NhbGFyKC1zcXJ0KDIqMiArIDMqMykpICogU2NhbGFyKGNvcyhTY2FsYXIoYXRhbigyLjAvMy4wKSkgLSBhbmdsZS8yKSkpOwotICBtaW5Db3JuZXJWYWx1ZVsxXSA9IFNjYWxhcihTY2FsYXIoLXNxcnQoMSoxICsgMioyKSkgKiBTY2FsYXIoc2luKFNjYWxhcihhdGFuKDIuMC8xLjApKSAtIGFuZ2xlLzIpKSk7CisgIG1pbkNvcm5lclZhbHVlWzBdID0gU2NhbGFyKFNjYWxhcigtc3FydCgyICogMiArIDMgKiAzKSkgKiBTY2FsYXIoY29zKFNjYWxhcihhdGFuKDIuMCAvIDMuMCkpIC0gYW5nbGUgLyAyKSkpOworICBtaW5Db3JuZXJWYWx1ZVsxXSA9IFNjYWxhcihTY2FsYXIoLXNxcnQoMSAqIDEgKyAyICogMikpICogU2NhbGFyKHNpbihTY2FsYXIoYXRhbigyLjAgLyAxLjApKSAtIGFuZ2xlIC8gMikpKTsKICAgbWF4Q29ybmVyVmFsdWVbMF0gPSBTY2FsYXIoLXNpbihhbmdsZSkpOwogICBtYXhDb3JuZXJWYWx1ZVsxXSA9IFNjYWxhcigzICogY29zKGFuZ2xlKSk7CiAgIFZFUklGWV9JU19BUFBST1goKGMubWluKSgpLCBtaW5Db3JuZXJWYWx1ZSk7CiAgIFZFUklGWV9JU19BUFBST1goKGMubWF4KSgpLCBtYXhDb3JuZXJWYWx1ZSk7CiAKICAgLy8gcmFuZG9taXplZCB0ZXN0IC0gdHJhbnNsYXRlIGFuZCByb3RhdGUgdGhlIGJveCBhbmQgY29tcGFyZSB0byBhIGJveCBtYWRlIG9mIHRyYW5zZm9ybWVkIHZlcnRpY2VzCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTA7ICsraSkKLSAgewotICAgIGZvciAoSW5kZXggZCA9IDA7IGQgPCBkaW07ICsrZCkKLSAgICB7Ci0gICAgICBtaW5Db3JuZXJbZF0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTEwLDEwKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgZm9yIChJbmRleCBkID0gMDsgZCA8IGRpbTsgKytkKSB7CisgICAgICBtaW5Db3JuZXJbZF0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTEwLCAxMCk7CiAgICAgICBtYXhDb3JuZXJbZF0gPSBtaW5Db3JuZXJbZF0gKyBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oMCwgMTApOwogICAgIH0KIApAQCAtMzk4LDExICszODUsOSBAQAogICB9CiAKICAgLy8gcmFuZG9taXplZCB0ZXN0IC0gdHJhbnNmb3JtIHRoZSBib3ggd2l0aCBhIHJhbmRvbSBhZmZpbmUgbWF0cml4IGFuZCBjb21wYXJlIHRvIGEgYm94IG1hZGUgb2YgdHJhbnNmb3JtZWQgdmVydGljZXMKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDsgKytpKQotICB7Ci0gICAgZm9yIChJbmRleCBkID0gMDsgZCA8IGRpbTsgKytkKQotICAgIHsKLSAgICAgIG1pbkNvcm5lcltkXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMTAsMTApOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBmb3IgKEluZGV4IGQgPSAwOyBkIDwgZGltOyArK2QpIHsKKyAgICAgIG1pbkNvcm5lcltkXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMTAsIDEwKTsKICAgICAgIG1heENvcm5lcltkXSA9IG1pbkNvcm5lcltkXSArIGludGVybmFsOjpyYW5kb208U2NhbGFyPigwLCAxMCk7CiAgICAgfQogCkBAIC00MjUsOSArNDEwLDggQEAKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBCb3hUeXBlPgotdm9pZCBhbGlnbmVkYm94Q2FzdFRlc3RzKGNvbnN0IEJveFR5cGUmIGJveCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBCb3hUeXBlPgordm9pZCBhbGlnbmVkYm94Q2FzdFRlc3RzKGNvbnN0IEJveFR5cGUmIGJveCkgewogICAvLyBjYXN0aW5nCiAgIHR5cGVkZWYgdHlwZW5hbWUgQm94VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBCb3hUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKQEAgLTQ0NCw4OCArNDI4LDkwIEBACiAKICAgY29uc3QgaW50IERpbSA9IEJveFR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lOwogICB0eXBlZGVmIHR5cGVuYW1lIEdldERpZmZlcmVudFR5cGU8U2NhbGFyPjo6dHlwZSBPdGhlclNjYWxhcjsKLSAgQWxpZ25lZEJveDxPdGhlclNjYWxhcixEaW0+IGhwMWYgPSBiMC50ZW1wbGF0ZSBjYXN0PE90aGVyU2NhbGFyPigpOwotICBWRVJJRllfSVNfQVBQUk9YKGhwMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksYjApOwotICBBbGlnbmVkQm94PFNjYWxhcixEaW0+IGhwMWQgPSBiMC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChocDFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLGIwKTsKKyAgQWxpZ25lZEJveDxPdGhlclNjYWxhciwgRGltPiBocDFmID0gYjAudGVtcGxhdGUgY2FzdDxPdGhlclNjYWxhcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChocDFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLCBiMCk7CisgIEFsaWduZWRCb3g8U2NhbGFyLCBEaW0+IGhwMWQgPSBiMC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChocDFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLCBiMCk7CiB9CiAKK3ZvaWQgc3BlY2lmaWNUZXN0MSgpIHsKKyAgVmVjdG9yMmYgbTsKKyAgbSA8PCAtMS4wZiwgLTIuMGY7CisgIFZlY3RvcjJmIE07CisgIE0gPDwgMS4wZiwgNS4wZjsKIAotdm9pZCBzcGVjaWZpY1Rlc3QxKCkKLXsKLSAgICBWZWN0b3IyZiBtOyBtIDw8IC0xLjBmLCAtMi4wZjsKLSAgICBWZWN0b3IyZiBNOyBNIDw8ICAxLjBmLCAgNS4wZjsKKyAgdHlwZWRlZiBBbGlnbmVkQm94MmYgQm94VHlwZTsKKyAgQm94VHlwZSBib3gobSwgTSk7CiAKLSAgICB0eXBlZGVmIEFsaWduZWRCb3gyZiAgQm94VHlwZTsKLSAgICBCb3hUeXBlIGJveCggbSwgTSApOworICBWZWN0b3IyZiBzaWRlcyA9IE0gLSBtOworICBWRVJJRllfSVNfQVBQUk9YKHNpZGVzLCBib3guc2l6ZXMoKSk7CisgIFZFUklGWV9JU19BUFBST1goc2lkZXNbMV0sIGJveC5zaXplcygpWzFdKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzaWRlc1sxXSwgYm94LnNpemVzKCkubWF4Q29lZmYoKSk7CisgIFZFUklGWV9JU19BUFBST1goc2lkZXNbMF0sIGJveC5zaXplcygpLm1pbkNvZWZmKCkpOwogCi0gICAgVmVjdG9yMmYgc2lkZXMgPSBNLW07Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChzaWRlcywgYm94LnNpemVzKCkgKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHNpZGVzWzFdLCBib3guc2l6ZXMoKVsxXSApOwotICAgIFZFUklGWV9JU19BUFBST1goc2lkZXNbMV0sIGJveC5zaXplcygpLm1heENvZWZmKCkgKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHNpZGVzWzBdLCBib3guc2l6ZXMoKS5taW5Db2VmZigpICk7CisgIFZFUklGWV9JU19BUFBST1goMTQuMGYsIGJveC52b2x1bWUoKSk7CisgIFZFUklGWV9JU19BUFBST1goNTMuMGYsIGJveC5kaWFnb25hbCgpLnNxdWFyZWROb3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHN0ZDo6c3FydCg1My4wZiksIGJveC5kaWFnb25hbCgpLm5vcm0oKSk7CiAKLSAgICBWRVJJRllfSVNfQVBQUk9YKCAxNC4wZiwgYm94LnZvbHVtZSgpICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggNTMuMGYsIGJveC5kaWFnb25hbCgpLnNxdWFyZWROb3JtKCkgKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCBzdGQ6OnNxcnQoIDUzLjBmICksIGJveC5kaWFnb25hbCgpLm5vcm0oKSApOwotCi0gICAgVkVSSUZZX0lTX0FQUFJPWCggbSwgYm94LmNvcm5lciggQm94VHlwZTo6Qm90dG9tTGVmdCApICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggTSwgYm94LmNvcm5lciggQm94VHlwZTo6VG9wUmlnaHQgKSApOwotICAgIFZlY3RvcjJmIGJvdHRvbVJpZ2h0OyBib3R0b21SaWdodCA8PCBNWzBdLCBtWzFdOwotICAgIFZlY3RvcjJmIHRvcExlZnQ7IHRvcExlZnQgPDwgbVswXSwgTVsxXTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCBib3R0b21SaWdodCwgYm94LmNvcm5lciggQm94VHlwZTo6Qm90dG9tUmlnaHQgKSApOwotICAgIFZFUklGWV9JU19BUFBST1goIHRvcExlZnQsIGJveC5jb3JuZXIoIEJveFR5cGU6OlRvcExlZnQgKSApOworICBWRVJJRllfSVNfQVBQUk9YKG0sIGJveC5jb3JuZXIoQm94VHlwZTo6Qm90dG9tTGVmdCkpOworICBWRVJJRllfSVNfQVBQUk9YKE0sIGJveC5jb3JuZXIoQm94VHlwZTo6VG9wUmlnaHQpKTsKKyAgVmVjdG9yMmYgYm90dG9tUmlnaHQ7CisgIGJvdHRvbVJpZ2h0IDw8IE1bMF0sIG1bMV07CisgIFZlY3RvcjJmIHRvcExlZnQ7CisgIHRvcExlZnQgPDwgbVswXSwgTVsxXTsKKyAgVkVSSUZZX0lTX0FQUFJPWChib3R0b21SaWdodCwgYm94LmNvcm5lcihCb3hUeXBlOjpCb3R0b21SaWdodCkpOworICBWRVJJRllfSVNfQVBQUk9YKHRvcExlZnQsIGJveC5jb3JuZXIoQm94VHlwZTo6VG9wTGVmdCkpOwogfQogCit2b2lkIHNwZWNpZmljVGVzdDIoKSB7CisgIFZlY3RvcjNpIG07CisgIG0gPDwgLTEsIC0yLCAwOworICBWZWN0b3IzaSBNOworICBNIDw8IDEsIDUsIDM7CiAKLXZvaWQgc3BlY2lmaWNUZXN0MigpCi17Ci0gICAgVmVjdG9yM2kgbTsgbSA8PCAtMSwgLTIsIDA7Ci0gICAgVmVjdG9yM2kgTTsgTSA8PCAgMSwgIDUsIDM7CisgIHR5cGVkZWYgQWxpZ25lZEJveDNpIEJveFR5cGU7CisgIEJveFR5cGUgYm94KG0sIE0pOwogCi0gICAgdHlwZWRlZiBBbGlnbmVkQm94M2kgIEJveFR5cGU7Ci0gICAgQm94VHlwZSBib3goIG0sIE0gKTsKKyAgVmVjdG9yM2kgc2lkZXMgPSBNIC0gbTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzaWRlcywgYm94LnNpemVzKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNpZGVzWzFdLCBib3guc2l6ZXMoKVsxXSk7CisgIFZFUklGWV9JU19BUFBST1goc2lkZXNbMV0sIGJveC5zaXplcygpLm1heENvZWZmKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNpZGVzWzBdLCBib3guc2l6ZXMoKS5taW5Db2VmZigpKTsKIAotICAgIFZlY3RvcjNpIHNpZGVzID0gTS1tOwotICAgIFZFUklGWV9JU19BUFBST1goc2lkZXMsIGJveC5zaXplcygpICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChzaWRlc1sxXSwgYm94LnNpemVzKClbMV0gKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHNpZGVzWzFdLCBib3guc2l6ZXMoKS5tYXhDb2VmZigpICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChzaWRlc1swXSwgYm94LnNpemVzKCkubWluQ29lZmYoKSApOworICBWRVJJRllfSVNfQVBQUk9YKDQyLCBib3gudm9sdW1lKCkpOworICBWRVJJRllfSVNfQVBQUk9YKDYyLCBib3guZGlhZ29uYWwoKS5zcXVhcmVkTm9ybSgpKTsKIAotICAgIFZFUklGWV9JU19BUFBST1goIDQyLCBib3gudm9sdW1lKCkgKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCA2MiwgYm94LmRpYWdvbmFsKCkuc3F1YXJlZE5vcm0oKSApOwotCi0gICAgVkVSSUZZX0lTX0FQUFJPWCggbSwgYm94LmNvcm5lciggQm94VHlwZTo6Qm90dG9tTGVmdEZsb29yICkgKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCBNLCBib3guY29ybmVyKCBCb3hUeXBlOjpUb3BSaWdodENlaWwgKSApOwotICAgIFZlY3RvcjNpIGJvdHRvbVJpZ2h0Rmxvb3I7IGJvdHRvbVJpZ2h0Rmxvb3IgPDwgTVswXSwgbVsxXSwgbVsyXTsKLSAgICBWZWN0b3IzaSB0b3BMZWZ0Rmxvb3I7IHRvcExlZnRGbG9vciA8PCBtWzBdLCBNWzFdLCBtWzJdOwotICAgIFZFUklGWV9JU19BUFBST1goIGJvdHRvbVJpZ2h0Rmxvb3IsIGJveC5jb3JuZXIoIEJveFR5cGU6OkJvdHRvbVJpZ2h0Rmxvb3IgKSApOwotICAgIFZFUklGWV9JU19BUFBST1goIHRvcExlZnRGbG9vciwgYm94LmNvcm5lciggQm94VHlwZTo6VG9wTGVmdEZsb29yICkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtLCBib3guY29ybmVyKEJveFR5cGU6OkJvdHRvbUxlZnRGbG9vcikpOworICBWRVJJRllfSVNfQVBQUk9YKE0sIGJveC5jb3JuZXIoQm94VHlwZTo6VG9wUmlnaHRDZWlsKSk7CisgIFZlY3RvcjNpIGJvdHRvbVJpZ2h0Rmxvb3I7CisgIGJvdHRvbVJpZ2h0Rmxvb3IgPDwgTVswXSwgbVsxXSwgbVsyXTsKKyAgVmVjdG9yM2kgdG9wTGVmdEZsb29yOworICB0b3BMZWZ0Rmxvb3IgPDwgbVswXSwgTVsxXSwgbVsyXTsKKyAgVkVSSUZZX0lTX0FQUFJPWChib3R0b21SaWdodEZsb29yLCBib3guY29ybmVyKEJveFR5cGU6OkJvdHRvbVJpZ2h0Rmxvb3IpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0b3BMZWZ0Rmxvb3IsIGJveC5jb3JuZXIoQm94VHlwZTo6VG9wTGVmdEZsb29yKSk7CiB9CiAKK0VJR0VOX0RFQ0xBUkVfVEVTVChnZW9fYWxpZ25lZGJveCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSgoYWxpZ25lZGJveE5vbkludGVncmFsUm90YXRhYmxlPEFsaWduZWRCb3gyZiwgUm90YXRpb24yRGY+KEFsaWduZWRCb3gyZigpLCAmcm90YXRlMkQpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoYWxpZ25lZGJveENhc3RUZXN0cyhBbGlnbmVkQm94MmYoKSkpOwogCi1FSUdFTl9ERUNMQVJFX1RFU1QoZ2VvX2FsaWduZWRib3gpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKQotICB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIChhbGlnbmVkYm94Tm9uSW50ZWdyYWxSb3RhdGFibGU8QWxpZ25lZEJveDJmLCBSb3RhdGlvbjJEZj4oQWxpZ25lZEJveDJmKCksICZyb3RhdGUyRCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGFsaWduZWRib3hDYXN0VGVzdHMoQWxpZ25lZEJveDJmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzMoKGFsaWduZWRib3hOb25JbnRlZ3JhbFJvdGF0YWJsZTxBbGlnbmVkQm94M2YsIEFuZ2xlQXhpc2Y+KEFsaWduZWRCb3gzZigpLCAmcm90YXRlM0RaQXhpcykpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChhbGlnbmVkYm94Q2FzdFRlc3RzKEFsaWduZWRCb3gzZigpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfMyggKGFsaWduZWRib3hOb25JbnRlZ3JhbFJvdGF0YWJsZTxBbGlnbmVkQm94M2YsIEFuZ2xlQXhpc2Y+KEFsaWduZWRCb3gzZigpLCAmcm90YXRlM0RaQXhpcykpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIGFsaWduZWRib3hDYXN0VGVzdHMoQWxpZ25lZEJveDNmKCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoKGFsaWduZWRib3hOb25JbnRlZ3JhbFJvdGF0YWJsZTxBbGlnbmVkQm94NGQsIE1hdHJpeDRkPihBbGlnbmVkQm94NGQoKSwgJnJvdGF0ZTREWldBeGlzKSkpOworICAgIENBTExfU1VCVEVTVF82KGFsaWduZWRib3hDYXN0VGVzdHMoQWxpZ25lZEJveDRkKCkpKTsKIAotICAgIENBTExfU1VCVEVTVF81KCAoYWxpZ25lZGJveE5vbkludGVncmFsUm90YXRhYmxlPEFsaWduZWRCb3g0ZCwgTWF0cml4NGQ+KEFsaWduZWRCb3g0ZCgpLCAmcm90YXRlNERaV0F4aXMpKSApOwotICAgIENBTExfU1VCVEVTVF82KCBhbGlnbmVkYm94Q2FzdFRlc3RzKEFsaWduZWRCb3g0ZCgpKSApOworICAgIENBTExfU1VCVEVTVF83KGFsaWduZWRib3hUcmFuc2xhdGFibGUoQWxpZ25lZEJveDFkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfOChhbGlnbmVkYm94Q2FzdFRlc3RzKEFsaWduZWRCb3gxZCgpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfNyggYWxpZ25lZGJveFRyYW5zbGF0YWJsZShBbGlnbmVkQm94MWQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOCggYWxpZ25lZGJveENhc3RUZXN0cyhBbGlnbmVkQm94MWQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfOShhbGlnbmVkYm94VHJhbnNsYXRhYmxlKEFsaWduZWRCb3gxaSgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEwKChhbGlnbmVkYm94Um90YXRhYmxlPEFsaWduZWRCb3gyaSwgTWF0cml4Mmk+KEFsaWduZWRCb3gyaSgpLCAmcm90YXRlMkRJbnRlZ3JhbDxpbnQsIE1hdHJpeDJpPikpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTEoCisgICAgICAgIChhbGlnbmVkYm94Um90YXRhYmxlPEFsaWduZWRCb3gzaSwgTWF0cml4M2k+KEFsaWduZWRCb3gzaSgpLCAmcm90YXRlM0RaQXhpc0ludGVncmFsPGludCwgTWF0cml4M2k+KSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzkoIGFsaWduZWRib3hUcmFuc2xhdGFibGUoQWxpZ25lZEJveDFpKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEwKCAoYWxpZ25lZGJveFJvdGF0YWJsZTxBbGlnbmVkQm94MmksIE1hdHJpeDJpPihBbGlnbmVkQm94MmkoKSwgJnJvdGF0ZTJESW50ZWdyYWw8aW50LCBNYXRyaXgyaT4pKSApOwotICAgIENBTExfU1VCVEVTVF8xMSggKGFsaWduZWRib3hSb3RhdGFibGU8QWxpZ25lZEJveDNpLCBNYXRyaXgzaT4oQWxpZ25lZEJveDNpKCksICZyb3RhdGUzRFpBeGlzSW50ZWdyYWw8aW50LCBNYXRyaXgzaT4pKSApOwotCi0gICAgQ0FMTF9TVUJURVNUXzE0KCBhbGlnbmVkYm94KEFsaWduZWRCb3g8ZG91YmxlLER5bmFtaWM+KDQpKSApOworICAgIENBTExfU1VCVEVTVF8xNChhbGlnbmVkYm94KEFsaWduZWRCb3g8ZG91YmxlLCBEeW5hbWljPig0KSkpOwogICB9Ci0gIENBTExfU1VCVEVTVF8xMiggc3BlY2lmaWNUZXN0MSgpICk7Ci0gIENBTExfU1VCVEVTVF8xMyggc3BlY2lmaWNUZXN0MigpICk7CisgIENBTExfU1VCVEVTVF8xMihzcGVjaWZpY1Rlc3QxKCkpOworICBDQUxMX1NVQlRFU1RfMTMoc3BlY2lmaWNUZXN0MigpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ2VvX2V1bGVyYW5nbGVzLmNwcCBiL3Rlc3QvZ2VvX2V1bGVyYW5nbGVzLmNwcAppbmRleCAyNzUxNjc1Li4zZDQ0M2RlIDEwMDY0NAotLS0gYS90ZXN0L2dlb19ldWxlcmFuZ2xlcy5jcHAKKysrIGIvdGVzdC9nZW9fZXVsZXJhbmdsZXMuY3BwCkBAIC0xNiwyMCArMTYsMjAgQEAKICNpbmNsdWRlIDxFaWdlbi9MVT4KICNpbmNsdWRlIDxFaWdlbi9TVkQ+CiAKLQotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgotdm9pZCB2ZXJpZnlfZXVsZXIoY29uc3QgTWF0cml4PFNjYWxhciwgMywgMT4mIGVhLCBpbnQgaSwgaW50IGosIGludCBrKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgdmVyaWZ5X2V1bGVyKGNvbnN0IE1hdHJpeDxTY2FsYXIsIDMsIDE+JiBlYSwgaW50IGksIGludCBqLCBpbnQgaykgewogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDM+IE1hdHJpeDM7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMT4gVmVjdG9yMzsKICAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBbmdsZUF4aXN4OwotICBjb25zdCBNYXRyaXgzIG0oQW5nbGVBeGlzeChlYVswXSwgVmVjdG9yMzo6VW5pdChpKSkgKiBBbmdsZUF4aXN4KGVhWzFdLCBWZWN0b3IzOjpVbml0KGopKSAqIEFuZ2xlQXhpc3goZWFbMl0sIFZlY3RvcjM6OlVuaXQoaykpKTsKKyAgY29uc3QgTWF0cml4MyBtKEFuZ2xlQXhpc3goZWFbMF0sIFZlY3RvcjM6OlVuaXQoaSkpICogQW5nbGVBeGlzeChlYVsxXSwgVmVjdG9yMzo6VW5pdChqKSkgKgorICAgICAgICAgICAgICAgICAgQW5nbGVBeGlzeChlYVsyXSwgVmVjdG9yMzo6VW5pdChrKSkpOwogCiAgIC8vIFRlc3Qgbm9uLWNhbm9uaWNhbCBldWxlckFuZ2xlcwogICB7CiAgICAgVmVjdG9yMyBlYWJpcyA9IG0uZXVsZXJBbmdsZXMoaSwgaiwgayk7Ci0gICAgTWF0cml4MyBtYmlzKEFuZ2xlQXhpc3goZWFiaXNbMF0sIFZlY3RvcjM6OlVuaXQoaSkpICogQW5nbGVBeGlzeChlYWJpc1sxXSwgVmVjdG9yMzo6VW5pdChqKSkgKiBBbmdsZUF4aXN4KGVhYmlzWzJdLCBWZWN0b3IzOjpVbml0KGspKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtLCAgbWJpcyk7CisgICAgTWF0cml4MyBtYmlzKEFuZ2xlQXhpc3goZWFiaXNbMF0sIFZlY3RvcjM6OlVuaXQoaSkpICogQW5nbGVBeGlzeChlYWJpc1sxXSwgVmVjdG9yMzo6VW5pdChqKSkgKgorICAgICAgICAgICAgICAgICBBbmdsZUF4aXN4KGVhYmlzWzJdLCBWZWN0b3IzOjpVbml0KGspKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtLCBtYmlzKTsKIAogICAgIC8vIGFwcHJveF9vcl9sZXNzX3RoYW4gZG9lcyBub3Qgd29yayBmb3IgMAogICAgIFZFUklGWSgwIDwgZWFiaXNbMF0gfHwgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihlYWJpc1swXSwgU2NhbGFyKDEpKSk7CkBAIC00MywxOSArNDMsMTcgQEAKICAgLy8gVGVzdCBjYW5vbmljYWxFdWxlckFuZ2xlcwogICB7CiAgICAgVmVjdG9yMyBlYWJpcyA9IG0uY2Fub25pY2FsRXVsZXJBbmdsZXMoaSwgaiwgayk7Ci0gICAgTWF0cml4MyBtYmlzKEFuZ2xlQXhpc3goZWFiaXNbMF0sIFZlY3RvcjM6OlVuaXQoaSkpICogQW5nbGVBeGlzeChlYWJpc1sxXSwgVmVjdG9yMzo6VW5pdChqKSkgKiBBbmdsZUF4aXN4KGVhYmlzWzJdLCBWZWN0b3IzOjpVbml0KGspKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtLCAgbWJpcyk7CisgICAgTWF0cml4MyBtYmlzKEFuZ2xlQXhpc3goZWFiaXNbMF0sIFZlY3RvcjM6OlVuaXQoaSkpICogQW5nbGVBeGlzeChlYWJpc1sxXSwgVmVjdG9yMzo6VW5pdChqKSkgKgorICAgICAgICAgICAgICAgICBBbmdsZUF4aXN4KGVhYmlzWzJdLCBWZWN0b3IzOjpVbml0KGspKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtLCBtYmlzKTsKIAogICAgIFZFUklGWV9JU19BUFBST1hfT1JfTEVTU19USEFOKC1TY2FsYXIoRUlHRU5fUEkpLCBlYWJpc1swXSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWF9PUl9MRVNTX1RIQU4oZWFiaXNbMF0sIFNjYWxhcihFSUdFTl9QSSkpOwotICAgIGlmIChpICE9IGspCi0gICAgeworICAgIGlmIChpICE9IGspIHsKICAgICAgIC8vIFRhaXQtQnJ5YW4gc2VxdWVuY2UKICAgICAgIFZFUklGWV9JU19BUFBST1hfT1JfTEVTU19USEFOKC1TY2FsYXIoRUlHRU5fUEkgLyAyKSwgZWFiaXNbMV0pOwogICAgICAgVkVSSUZZX0lTX0FQUFJPWF9PUl9MRVNTX1RIQU4oZWFiaXNbMV0sIFNjYWxhcihFSUdFTl9QSSAvIDIpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgLy8gUHJvcGVyIEV1bGVyIHNlcXVlbmNlCiAgICAgICAvLyBhcHByb3hfb3JfbGVzc190aGFuIGRvZXMgbm90IHdvcmsgZm9yIDAKICAgICAgIFZFUklGWSgwIDwgZWFiaXNbMV0gfHwgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihlYWJpc1sxXSwgU2NhbGFyKDEpKSk7CkBAIC02NiwxMCArNjQsOSBAQAogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBjaGVja19hbGxfdmFyKGNvbnN0IE1hdHJpeDxTY2FsYXIsIDMsIDE+JiBlYSkKLXsKLSAgYXV0byB2ZXJpZnlfcGVybXV0YXRpb24gPSBbXShjb25zdCBNYXRyaXg8U2NhbGFyLCAzLCAxPiYgZWFwKQotICB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBjaGVja19hbGxfdmFyKGNvbnN0IE1hdHJpeDxTY2FsYXIsIDMsIDE+JiBlYSkgeworICBhdXRvIHZlcmlmeV9wZXJtdXRhdGlvbiA9IFtdKGNvbnN0IE1hdHJpeDxTY2FsYXIsIDMsIDE+JiBlYXApIHsKICAgICB2ZXJpZnlfZXVsZXIoZWFwLCAwLCAxLCAyKTsKICAgICB2ZXJpZnlfZXVsZXIoZWFwLCAwLCAxLCAwKTsKICAgICB2ZXJpZnlfZXVsZXIoZWFwLCAwLCAyLCAxKTsKQEAgLTg5LDE1ICs4NiwxNCBAQAogICBpbnQgaSwgaiwgazsKICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgICAgZm9yIChrID0gMDsgayA8IDM7IGsrKykKLSAgICAgIHsKLSAgICAgICAgTWF0cml4PFNjYWxhciwzLDE+IGVhcChlYShpKSwgZWEoaiksIGVhKGspKTsKKyAgICAgIGZvciAoayA9IDA7IGsgPCAzOyBrKyspIHsKKyAgICAgICAgTWF0cml4PFNjYWxhciwgMywgMT4gZWFwKGVhKGkpLCBlYShqKSwgZWEoaykpOwogICAgICAgICB2ZXJpZnlfcGVybXV0YXRpb24oZWFwKTsKICAgICAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGV1bGVyYW5nbGVzKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGV1bGVyYW5nbGVzKCkgewogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDM+IE1hdHJpeDM7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMT4gVmVjdG9yMzsKICAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIDMsIDE+IEFycmF5MzsKQEAgLTEyNyw4ICsxMjMsNyBAQAogICBlYSA9IEFycmF5Mzo6UmFuZG9tKCkgKiBTY2FsYXIoRUlHRU5fUEkpOwogICBjaGVja19hbGxfdmFyKGVhKTsKIAotICBhdXRvIHRlc3Rfd2l0aF9zb21lX3plcm9zID0gW10oY29uc3QgVmVjdG9yMyYgZWF6KQotICB7CisgIGF1dG8gdGVzdF93aXRoX3NvbWVfemVyb3MgPSBbXShjb25zdCBWZWN0b3IzJiBlYXopIHsKICAgICBjaGVja19hbGxfdmFyKGVheik7CiAgICAgVmVjdG9yMyBlYV9nbHogPSBlYXo7CiAgICAgZWFfZ2x6WzBdID0gU2NhbGFyKDApOwpAQCAtMTQyLDIwICsxMzcsMjAgQEAKICAgfTsKICAgLy8gQ2hlY2sgZ2ltYmFsIGxvY2sgY29uZmlndXJhdGlvbnMgYW5kIGEgYml0IG5vaXN5IGdpbWJhbCBsb2NrcwogICBWZWN0b3IzIGVhX2dsID0gZWE7Ci0gIGVhX2dsWzFdID0gRUlHRU5fUEkvMjsKKyAgZWFfZ2xbMV0gPSBFSUdFTl9QSSAvIDI7CiAgIHRlc3Rfd2l0aF9zb21lX3plcm9zKGVhX2dsKTsKICAgZWFfZ2xbMV0gKz0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC0wLjAwMSwgMC4wMDEpOwogICB0ZXN0X3dpdGhfc29tZV96ZXJvcyhlYV9nbCk7Ci0gIGVhX2dsWzFdID0gLUVJR0VOX1BJLzI7CisgIGVhX2dsWzFdID0gLUVJR0VOX1BJIC8gMjsKICAgdGVzdF93aXRoX3NvbWVfemVyb3MoZWFfZ2wpOwogICBlYV9nbFsxXSArPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTAuMDAxLCAwLjAwMSk7CiAgIHRlc3Rfd2l0aF9zb21lX3plcm9zKGVhX2dsKTsKLSAgZWFfZ2xbMV0gPSBFSUdFTl9QSS8yOworICBlYV9nbFsxXSA9IEVJR0VOX1BJIC8gMjsKICAgZWFfZ2xbMl0gPSBlYV9nbFswXTsKICAgdGVzdF93aXRoX3NvbWVfemVyb3MoZWFfZ2wpOwogICBlYV9nbFsxXSArPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTAuMDAxLCAwLjAwMSk7CiAgIHRlc3Rfd2l0aF9zb21lX3plcm9zKGVhX2dsKTsKLSAgZWFfZ2xbMV0gPSAtRUlHRU5fUEkvMjsKKyAgZWFfZ2xbMV0gPSAtRUlHRU5fUEkgLyAyOwogICB0ZXN0X3dpdGhfc29tZV96ZXJvcyhlYV9nbCk7CiAgIGVhX2dsWzFdICs9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMC4wMDEsIDAuMDAxKTsKICAgdGVzdF93aXRoX3NvbWVfemVyb3MoZWFfZ2wpOwpAQCAtMTk2LDExICsxOTEsOSBAQAogICBjaGVja19hbGxfdmFyKGVhKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGdlb19ldWxlcmFuZ2xlcykKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspCi0gIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggZXVsZXJhbmdsZXM8ZmxvYXQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggZXVsZXJhbmdsZXM8ZG91YmxlPigpICk7CitFSUdFTl9ERUNMQVJFX1RFU1QoZ2VvX2V1bGVyYW5nbGVzKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKGV1bGVyYW5nbGVzPGZsb2F0PigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihldWxlcmFuZ2xlczxkb3VibGU+KCkpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2dlb19ob21vZ2VuZW91cy5jcHAgYi90ZXN0L2dlb19ob21vZ2VuZW91cy5jcHAKaW5kZXggOWFlYmU2Mi4uY2IxNDQxMyAxMDA2NDQKLS0tIGEvdGVzdC9nZW9faG9tb2dlbmVvdXMuY3BwCisrKyBiL3Rlc3QvZ2VvX2hvbW9nZW5lb3VzLmNwcApAQCAtMTAsMjQgKzEwLDIzIEBACiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IFNpemU+IHZvaWQgaG9tb2dlbmVvdXModm9pZCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBTaXplPgordm9pZCBob21vZ2VuZW91cyh2b2lkKSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgSG9tb2dlbmVvdXMuaAogICAqLwogCi0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixTaXplLFNpemU+IE1hdHJpeFR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixTaXplLDEsIENvbE1ham9yPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFNpemUsIFNpemU+IE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgU2l6ZSwgMSwgQ29sTWFqb3I+IFZlY3RvclR5cGU7CiAKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUrMSxTaXplPiBITWF0cml4VHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUrMSwxPiBIVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBTaXplICsgMSwgU2l6ZT4gSE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgU2l6ZSArIDEsIDE+IEhWZWN0b3JUeXBlOwogCi0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixTaXplLFNpemUrMT4gICBUMU1hdHJpeFR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixTaXplKzEsU2l6ZSsxPiBUMk1hdHJpeFR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixTaXplKzEsU2l6ZT4gVDNNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFNpemUsIFNpemUgKyAxPiBUMU1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgU2l6ZSArIDEsIFNpemUgKyAxPiBUMk1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgU2l6ZSArIDEsIFNpemU+IFQzTWF0cml4VHlwZTsKIAotICBWZWN0b3JUeXBlIHYwID0gVmVjdG9yVHlwZTo6UmFuZG9tKCksCi0gICAgICAgICAgICAgb25lcyA9IFZlY3RvclR5cGU6Ok9uZXMoKTsKKyAgVmVjdG9yVHlwZSB2MCA9IFZlY3RvclR5cGU6OlJhbmRvbSgpLCBvbmVzID0gVmVjdG9yVHlwZTo6T25lcygpOwogCiAgIEhWZWN0b3JUeXBlIGh2MCA9IEhWZWN0b3JUeXBlOjpSYW5kb20oKTsKIApAQCAtMzgsNyArMzcsNyBAQAogICBodjAgPDwgdjAsIDE7CiAgIFZFUklGWV9JU19BUFBST1godjAuaG9tb2dlbmVvdXMoKSwgaHYwKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2MCwgaHYwLmhub3JtYWxpemVkKCkpOwotICAKKwogICBWRVJJRllfSVNfQVBQUk9YKHYwLmhvbW9nZW5lb3VzKCkuc3VtKCksIGh2MC5zdW0oKSk7CiAgIFZFUklGWV9JU19BUFBST1godjAuaG9tb2dlbmVvdXMoKS5taW5Db2VmZigpLCBodjAubWluQ29lZmYoKSk7CiAgIFZFUklGWV9JU19BUFBST1godjAuaG9tb2dlbmVvdXMoKS5tYXhDb2VmZigpLCBodjAubWF4Q29lZmYoKSk7CkBAIC00Niw5ICs0NSw4IEBACiAgIGhtMCA8PCBtMCwgb25lcy50cmFuc3Bvc2UoKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMC5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSwgaG0wKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMCwgaG0wLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpKTsKLSAgaG0wLnJvdyhTaXplLTEpLnNldFJhbmRvbSgpOwotICBmb3IoaW50IGo9MDsgajxTaXplOyArK2opCi0gICAgbTAuY29sKGopID0gaG0wLmNvbChqKS5oZWFkKFNpemUpIC8gaG0wKFNpemUsaik7CisgIGhtMC5yb3coU2l6ZSAtIDEpLnNldFJhbmRvbSgpOworICBmb3IgKGludCBqID0gMDsgaiA8IFNpemU7ICsraikgbTAuY29sKGopID0gaG0wLmNvbChqKS5oZWFkKFNpemUpIC8gaG0wKFNpemUsIGopOwogICBWRVJJRllfSVNfQVBQUk9YKG0wLCBobTAuY29sd2lzZSgpLmhub3JtYWxpemVkKCkpOwogCiAgIFQxTWF0cml4VHlwZSB0MSA9IFQxTWF0cml4VHlwZTo6UmFuZG9tKCk7CkBAIC02MSw2NSArNTksNjUgQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh0MiAqICh2MC5ob21vZ2VuZW91cygpLmFzRGlhZ29uYWwoKSksIHQyICogaHYwLmFzRGlhZ29uYWwoKSk7CiAgIFZFUklGWV9JU19BUFBST1goKHYwLmhvbW9nZW5lb3VzKCkuYXNEaWFnb25hbCgpKSAqIHQyLCBodjAuYXNEaWFnb25hbCgpICogdDIpOwogCi0gIFZFUklGWV9JU19BUFBST1goKHYwLnRyYW5zcG9zZSgpLnJvd3dpc2UoKS5ob21vZ2VuZW91cygpLmV2YWwoKSkgKiB0MiwKLSAgICAgICAgICAgICAgICAgICAgdjAudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkgKiB0Mik7Ci0gIFZFUklGWV9JU19BUFBST1goKG0wLnRyYW5zcG9zZSgpLnJvd3dpc2UoKS5ob21vZ2VuZW91cygpLmV2YWwoKSkgKiB0MiwKLSAgICAgICAgICAgICAgICAgICAgbTAudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkgKiB0Mik7CisgIFZFUklGWV9JU19BUFBST1goKHYwLnRyYW5zcG9zZSgpLnJvd3dpc2UoKS5ob21vZ2VuZW91cygpLmV2YWwoKSkgKiB0MiwgdjAudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkgKiB0Mik7CisgIFZFUklGWV9JU19BUFBST1goKG0wLnRyYW5zcG9zZSgpLnJvd3dpc2UoKS5ob21vZ2VuZW91cygpLmV2YWwoKSkgKiB0MiwgbTAudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkgKiB0Mik7CiAKICAgVDNNYXRyaXhUeXBlIHQzID0gVDNNYXRyaXhUeXBlOjpSYW5kb20oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgodjAudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkuZXZhbCgpKSAqIHQzLAotICAgICAgICAgICAgICAgICAgICB2MC50cmFuc3Bvc2UoKS5yb3d3aXNlKCkuaG9tb2dlbmVvdXMoKSAqIHQzKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgobTAudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkuZXZhbCgpKSAqIHQzLAotICAgICAgICAgICAgICAgICAgICBtMC50cmFuc3Bvc2UoKS5yb3d3aXNlKCkuaG9tb2dlbmVvdXMoKSAqIHQzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgodjAudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkuZXZhbCgpKSAqIHQzLCB2MC50cmFuc3Bvc2UoKS5yb3d3aXNlKCkuaG9tb2dlbmVvdXMoKSAqIHQzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTAudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkuZXZhbCgpKSAqIHQzLCBtMC50cmFuc3Bvc2UoKS5yb3d3aXNlKCkuaG9tb2dlbmVvdXMoKSAqIHQzKTsKIAogICAvLyB0ZXN0IHByb2R1Y3Qgd2l0aCBhIFRyYW5zZm9ybSBvYmplY3QKICAgVHJhbnNmb3JtPFNjYWxhciwgU2l6ZSwgQWZmaW5lPiBhZmY7CiAgIFRyYW5zZm9ybTxTY2FsYXIsIFNpemUsIEFmZmluZUNvbXBhY3Q+IGNhZmY7CiAgIFRyYW5zZm9ybTxTY2FsYXIsIFNpemUsIFByb2plY3RpdmU+IHByb2o7Ci0gIE1hdHJpeDxTY2FsYXIsIFNpemUsIER5bmFtaWM+ICAgcHRzOwotICBNYXRyaXg8U2NhbGFyLCBTaXplKzEsIER5bmFtaWM+IHB0czEsIHB0czI7CisgIE1hdHJpeDxTY2FsYXIsIFNpemUsIER5bmFtaWM+IHB0czsKKyAgTWF0cml4PFNjYWxhciwgU2l6ZSArIDEsIER5bmFtaWM+IHB0czEsIHB0czI7CiAKICAgYWZmLmFmZmluZSgpLnNldFJhbmRvbSgpOwogICBwcm9qID0gY2FmZiA9IGFmZjsKLSAgcHRzLnNldFJhbmRvbShTaXplLGludGVybmFsOjpyYW5kb208aW50PigxLDIwKSk7Ci0gIAorICBwdHMuc2V0UmFuZG9tKFNpemUsIGludGVybmFsOjpyYW5kb208aW50PigxLCAyMCkpOworCiAgIHB0czEgPSBwdHMuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCk7Ci0gIFZFUklGWV9JU19BUFBST1goYWZmICAqIHB0cy5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSwgKGFmZiAgKiBwdHMxKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSk7CisgIFZFUklGWV9JU19BUFBST1goYWZmICogcHRzLmNvbHdpc2UoKS5ob21vZ2VuZW91cygpLCAoYWZmICogcHRzMSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCkpOwogICBWRVJJRllfSVNfQVBQUk9YKGNhZmYgKiBwdHMuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCksIChjYWZmICogcHRzMSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCkpOwogICBWRVJJRllfSVNfQVBQUk9YKHByb2ogKiBwdHMuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCksIChwcm9qICogcHRzMSkpOwogCi0gIFZFUklGWV9JU19BUFBST1goKGFmZiAgKiBwdHMxKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSwgIGFmZiAgKiBwdHMpOworICBWRVJJRllfSVNfQVBQUk9YKChhZmYgKiBwdHMxKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSwgYWZmICogcHRzKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgoY2FmZiAqIHB0czEpLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpLCBjYWZmICogcHRzKTsKLSAgCisKICAgcHRzMiA9IHB0czE7CiAgIHB0czIucm93KFNpemUpLnNldFJhbmRvbSgpOwotICBWRVJJRllfSVNfQVBQUk9YKChhZmYgICogcHRzMikuY29sd2lzZSgpLmhub3JtYWxpemVkKCksIGFmZiAgKiBwdHMyLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoYWZmICogcHRzMikuY29sd2lzZSgpLmhub3JtYWxpemVkKCksIGFmZiAqIHB0czIuY29sd2lzZSgpLmhub3JtYWxpemVkKCkpOwogICBWRVJJRllfSVNfQVBQUk9YKChjYWZmICogcHRzMikuY29sd2lzZSgpLmhub3JtYWxpemVkKCksIGNhZmYgKiBwdHMyLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgocHJvaiAqIHB0czIpLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpLCAocHJvaiAqIHB0czIuY29sd2lzZSgpLmhub3JtYWxpemVkKCkuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkpLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpKTsKLSAgCi0gIC8vIFRlc3QgY29tYmluYXRpb24gb2YgaG9tb2dlbmVvdXMKLSAgCi0gIFZFUklGWV9JU19BUFBST1goICh0MiAqIHYwLmhvbW9nZW5lb3VzKCkpLmhub3JtYWxpemVkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICh0Mi50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPFNpemUsU2l6ZT4oKSAqIHYwICsgdDIudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8U2l6ZSwxPigpKQotICAgICAgICAgICAgICAgICAgICAgLyAoKHQyLnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8MSxTaXplPigpKnYwKS52YWx1ZSgpICsgdDIoU2l6ZSxTaXplKSkgKTsKLSAgCi0gIFZFUklGWV9JU19BUFBST1goICh0MiAqIHB0cy5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCksCi0gICAgICAgICAgICAgICAgICAgIChNYXRyaXg8U2NhbGFyLCBTaXplKzEsIER5bmFtaWM+KHQyICogcHRzMSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCkpICk7Ci0gIAotICBWRVJJRllfSVNfQVBQUk9YKCAodDIgLmxhenlQcm9kdWN0KCB2MC5ob21vZ2VuZW91cygpICkpLmhub3JtYWxpemVkKCksICh0MiAqIHYwLmhvbW9nZW5lb3VzKCkpLmhub3JtYWxpemVkKCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKHQyIC5sYXp5UHJvZHVjdCAgKCBwdHMuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkgKSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCksICh0MiAqIHB0czEpLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpICk7Ci0gIAotICBWRVJJRllfSVNfQVBQUk9YKCAodjAudHJhbnNwb3NlKCkuaG9tb2dlbmVvdXMoKSAubGF6eVByb2R1Y3QoIHQyICkpLmhub3JtYWxpemVkKCksICh2MC50cmFuc3Bvc2UoKS5ob21vZ2VuZW91cygpKnQyKS5obm9ybWFsaXplZCgpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIChwdHMudHJhbnNwb3NlKCkucm93d2lzZSgpLmhvbW9nZW5lb3VzKCkgLmxhenlQcm9kdWN0KCB0MiApKS5yb3d3aXNlKCkuaG5vcm1hbGl6ZWQoKSwgKHB0czEudHJhbnNwb3NlKCkqdDIpLnJvd3dpc2UoKS5obm9ybWFsaXplZCgpICk7CisgIFZFUklGWV9JU19BUFBST1goKHByb2ogKiBwdHMyKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAocHJvaiAqIHB0czIuY29sd2lzZSgpLmhub3JtYWxpemVkKCkuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkpLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCAodDIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKiB2MC5ob21vZ2VuZW91cygpKS5ldmFsKCksICh0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSpodjApICk7CisgIC8vIFRlc3QgY29tYmluYXRpb24gb2YgaG9tb2dlbmVvdXMKKworICBWRVJJRllfSVNfQVBQUk9YKCh0MiAqIHYwLmhvbW9nZW5lb3VzKCkpLmhub3JtYWxpemVkKCksCisgICAgICAgICAgICAgICAgICAgKHQyLnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8U2l6ZSwgU2l6ZT4oKSAqIHYwICsgdDIudGVtcGxhdGUgdG9wUmlnaHRDb3JuZXI8U2l6ZSwgMT4oKSkgLworICAgICAgICAgICAgICAgICAgICAgICAoKHQyLnRlbXBsYXRlIGJvdHRvbUxlZnRDb3JuZXI8MSwgU2l6ZT4oKSAqIHYwKS52YWx1ZSgpICsgdDIoU2l6ZSwgU2l6ZSkpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKCh0MiAqIHB0cy5jb2x3aXNlKCkuaG9tb2dlbmVvdXMoKSkuY29sd2lzZSgpLmhub3JtYWxpemVkKCksCisgICAgICAgICAgICAgICAgICAgKE1hdHJpeDxTY2FsYXIsIFNpemUgKyAxLCBEeW5hbWljPih0MiAqIHB0czEpLmNvbHdpc2UoKS5obm9ybWFsaXplZCgpKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCgodDIubGF6eVByb2R1Y3QodjAuaG9tb2dlbmVvdXMoKSkpLmhub3JtYWxpemVkKCksICh0MiAqIHYwLmhvbW9nZW5lb3VzKCkpLmhub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCh0Mi5sYXp5UHJvZHVjdChwdHMuY29sd2lzZSgpLmhvbW9nZW5lb3VzKCkpKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAodDIgKiBwdHMxKS5jb2x3aXNlKCkuaG5vcm1hbGl6ZWQoKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCgodjAudHJhbnNwb3NlKCkuaG9tb2dlbmVvdXMoKS5sYXp5UHJvZHVjdCh0MikpLmhub3JtYWxpemVkKCksCisgICAgICAgICAgICAgICAgICAgKHYwLnRyYW5zcG9zZSgpLmhvbW9nZW5lb3VzKCkgKiB0MikuaG5vcm1hbGl6ZWQoKSk7CisgIFZFUklGWV9JU19BUFBST1goKHB0cy50cmFuc3Bvc2UoKS5yb3d3aXNlKCkuaG9tb2dlbmVvdXMoKS5sYXp5UHJvZHVjdCh0MikpLnJvd3dpc2UoKS5obm9ybWFsaXplZCgpLAorICAgICAgICAgICAgICAgICAgIChwdHMxLnRyYW5zcG9zZSgpICogdDIpLnJvd3dpc2UoKS5obm9ybWFsaXplZCgpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKCh0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSAqIHYwLmhvbW9nZW5lb3VzKCkpLmV2YWwoKSwKKyAgICAgICAgICAgICAgICAgICAodDIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKiBodjApKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGdlb19ob21vZ2VuZW91cykKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSgoIGhvbW9nZW5lb3VzPGZsb2F0LDE+KCkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoKCBob21vZ2VuZW91czxkb3VibGUsMz4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMygoIGhvbW9nZW5lb3VzPGRvdWJsZSw4PigpICkpOworRUlHRU5fREVDTEFSRV9URVNUKGdlb19ob21vZ2VuZW91cykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSgoaG9tb2dlbmVvdXM8ZmxvYXQsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMigoaG9tb2dlbmVvdXM8ZG91YmxlLCAzPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKGhvbW9nZW5lb3VzPGRvdWJsZSwgOD4oKSkpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2dlb19oeXBlcnBsYW5lLmNwcCBiL3Rlc3QvZ2VvX2h5cGVycGxhbmUuY3BwCmluZGV4IDQ0YjJmMmEuLjJlNmI1MDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ2VvX2h5cGVycGxhbmUuY3BwCisrKyBiL3Rlc3QvZ2VvX2h5cGVycGxhbmUuY3BwCkBAIC0xMyw4ICsxMyw4IEBACiAjaW5jbHVkZSA8RWlnZW4vTFU+CiAjaW5jbHVkZSA8RWlnZW4vUVI+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEh5cGVycGxhbmVUeXBlPiB2b2lkIGh5cGVycGxhbmUoY29uc3QgSHlwZXJwbGFuZVR5cGUmIF9wbGFuZSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBIeXBlcnBsYW5lVHlwZT4KK3ZvaWQgaHlwZXJwbGFuZShjb25zdCBIeXBlcnBsYW5lVHlwZSAmX3BsYW5lKSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgSHlwZXJwbGFuZS5oCiAgICovCkBAIC0yNCw4ICsyNCw3IEBACiAgIHR5cGVkZWYgdHlwZW5hbWUgSHlwZXJwbGFuZVR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgSHlwZXJwbGFuZVR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBIeXBlcnBsYW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgSHlwZXJwbGFuZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBIeXBlcnBsYW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWUsIEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gTWF0cml4VHlwZTsKIAogICBWZWN0b3JUeXBlIHAwID0gVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSk7CiAgIFZlY3RvclR5cGUgcDEgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKQEAgLTQwLDcxICszOSw2OSBAQAogICBTY2FsYXIgczAgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKICAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWCggbjEuZG90KG4xKSwgU2NhbGFyKDEpICk7CisgIFZFUklGWV9JU19BUFBST1gobjEuZG90KG4xKSwgU2NhbGFyKDEpKTsKIAotICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIHBsMC5hYnNEaXN0YW5jZShwMCksIFNjYWxhcigxKSApOwotICBpZihudW1leHQ6OmFiczIoczApPlJlYWxTY2FsYXIoMWUtNikpCi0gICAgVkVSSUZZX0lTX0FQUFJPWCggcGwxLnNpZ25lZERpc3RhbmNlKHAxICsgbjEgKiBzMCksIHMwKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHBsMC5hYnNEaXN0YW5jZShwMCksIFNjYWxhcigxKSk7CisgIGlmIChudW1leHQ6OmFiczIoczApID4gUmVhbFNjYWxhcigxZS02KSkKKyAgICBWRVJJRllfSVNfQVBQUk9YKHBsMS5zaWduZWREaXN0YW5jZShwMSArIG4xICogczApLCBzMCk7CiAgIGVsc2UKLSAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIGFicyhwbDEuc2lnbmVkRGlzdGFuY2UocDEgKyBuMSAqIHMwKSAtIHMwKSwgU2NhbGFyKDEpICk7Ci0gIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggcGwxLnNpZ25lZERpc3RhbmNlKHBsMS5wcm9qZWN0aW9uKHAwKSksIFNjYWxhcigxKSApOwotICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIHBsMS5hYnNEaXN0YW5jZShwMSArICBwbDEubm9ybWFsKCkudW5pdE9ydGhvZ29uYWwoKSAqIHMxKSwgU2NhbGFyKDEpICk7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGFicyhwbDEuc2lnbmVkRGlzdGFuY2UocDEgKyBuMSAqIHMwKSAtIHMwKSwgU2NhbGFyKDEpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHBsMS5zaWduZWREaXN0YW5jZShwbDEucHJvamVjdGlvbihwMCkpLCBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4ocGwxLmFic0Rpc3RhbmNlKHAxICsgcGwxLm5vcm1hbCgpLnVuaXRPcnRob2dvbmFsKCkgKiBzMSksIFNjYWxhcigxKSk7CiAKICAgLy8gdHJhbnNmb3JtCi0gIGlmICghTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCkKLSAgewotICAgIE1hdHJpeFR5cGUgcm90ID0gTWF0cml4VHlwZTo6UmFuZG9tKGRpbSxkaW0pLmhvdXNlaG9sZGVyUXIoKS5ob3VzZWhvbGRlclEoKTsKLSAgICBEaWFnb25hbE1hdHJpeDxTY2FsYXIsSHlwZXJwbGFuZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lPiBzY2FsaW5nKFZlY3RvclR5cGU6OlJhbmRvbSgpKTsKLSAgICBUcmFuc2xhdGlvbjxTY2FsYXIsSHlwZXJwbGFuZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lPiB0cmFuc2xhdGlvbihWZWN0b3JUeXBlOjpSYW5kb20oKSk7Ci0gICAgCi0gICAgd2hpbGUoc2NhbGluZy5kaWFnb25hbCgpLmN3aXNlQWJzKCkubWluQ29lZmYoKTxSZWFsU2NhbGFyKDFlLTQpKSBzY2FsaW5nLmRpYWdvbmFsKCkgPSBWZWN0b3JUeXBlOjpSYW5kb20oKTsKKyAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4KSB7CisgICAgTWF0cml4VHlwZSByb3QgPSBNYXRyaXhUeXBlOjpSYW5kb20oZGltLCBkaW0pLmhvdXNlaG9sZGVyUXIoKS5ob3VzZWhvbGRlclEoKTsKKyAgICBEaWFnb25hbE1hdHJpeDxTY2FsYXIsIEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gc2NhbGluZyhWZWN0b3JUeXBlOjpSYW5kb20oKSk7CisgICAgVHJhbnNsYXRpb248U2NhbGFyLCBIeXBlcnBsYW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWU+IHRyYW5zbGF0aW9uKFZlY3RvclR5cGU6OlJhbmRvbSgpKTsKKworICAgIHdoaWxlIChzY2FsaW5nLmRpYWdvbmFsKCkuY3dpc2VBYnMoKS5taW5Db2VmZigpIDwgUmVhbFNjYWxhcigxZS00KSkgc2NhbGluZy5kaWFnb25hbCgpID0gVmVjdG9yVHlwZTo6UmFuZG9tKCk7CiAKICAgICBwbDIgPSBwbDE7Ci0gICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDIudHJhbnNmb3JtKHJvdCkuYWJzRGlzdGFuY2Uocm90ICogcDEpLCBTY2FsYXIoMSkgKTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4ocGwyLnRyYW5zZm9ybShyb3QpLmFic0Rpc3RhbmNlKHJvdCAqIHAxKSwgU2NhbGFyKDEpKTsKICAgICBwbDIgPSBwbDE7Ci0gICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBwbDIudHJhbnNmb3JtKHJvdCxJc29tZXRyeSkuYWJzRGlzdGFuY2Uocm90ICogcDEpLCBTY2FsYXIoMSkgKTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4ocGwyLnRyYW5zZm9ybShyb3QsIElzb21ldHJ5KS5hYnNEaXN0YW5jZShyb3QgKiBwMSksIFNjYWxhcigxKSk7CiAgICAgcGwyID0gcGwxOwotICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggcGwyLnRyYW5zZm9ybShyb3Qqc2NhbGluZykuYWJzRGlzdGFuY2UoKHJvdCpzY2FsaW5nKSAqIHAxKSwgU2NhbGFyKDEpICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggcGwyLm5vcm1hbCgpLm5vcm0oKSwgUmVhbFNjYWxhcigxKSApOworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihwbDIudHJhbnNmb3JtKHJvdCAqIHNjYWxpbmcpLmFic0Rpc3RhbmNlKChyb3QgKiBzY2FsaW5nKSAqIHAxKSwgU2NhbGFyKDEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHBsMi5ub3JtYWwoKS5ub3JtKCksIFJlYWxTY2FsYXIoMSkpOwogICAgIHBsMiA9IHBsMTsKLSAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIHBsMi50cmFuc2Zvcm0ocm90KnNjYWxpbmcqdHJhbnNsYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFic0Rpc3RhbmNlKChyb3Qqc2NhbGluZyp0cmFuc2xhdGlvbikgKiBwMSksIFNjYWxhcigxKSApOwotICAgIFZFUklGWV9JU19BUFBST1goIHBsMi5ub3JtYWwoKS5ub3JtKCksIFJlYWxTY2FsYXIoMSkgKTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oCisgICAgICAgIHBsMi50cmFuc2Zvcm0ocm90ICogc2NhbGluZyAqIHRyYW5zbGF0aW9uKS5hYnNEaXN0YW5jZSgocm90ICogc2NhbGluZyAqIHRyYW5zbGF0aW9uKSAqIHAxKSwgU2NhbGFyKDEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHBsMi5ub3JtYWwoKS5ub3JtKCksIFJlYWxTY2FsYXIoMSkpOwogICAgIHBsMiA9IHBsMTsKLSAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIHBsMi50cmFuc2Zvcm0ocm90KnRyYW5zbGF0aW9uLElzb21ldHJ5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFic0Rpc3RhbmNlKChyb3QqdHJhbnNsYXRpb24pICogcDEpLCBTY2FsYXIoMSkgKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCBwbDIubm9ybWFsKCkubm9ybSgpLCBSZWFsU2NhbGFyKDEpICk7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHBsMi50cmFuc2Zvcm0ocm90ICogdHJhbnNsYXRpb24sIElzb21ldHJ5KS5hYnNEaXN0YW5jZSgocm90ICogdHJhbnNsYXRpb24pICogcDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXIoMSkpOworICAgIFZFUklGWV9JU19BUFBST1gocGwyLm5vcm1hbCgpLm5vcm0oKSwgUmVhbFNjYWxhcigxKSk7CiAgIH0KIAogICAvLyBjYXN0aW5nCiAgIGNvbnN0IGludCBEaW0gPSBIeXBlcnBsYW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWU7CiAgIHR5cGVkZWYgdHlwZW5hbWUgR2V0RGlmZmVyZW50VHlwZTxTY2FsYXI+Ojp0eXBlIE90aGVyU2NhbGFyOwotICBIeXBlcnBsYW5lPE90aGVyU2NhbGFyLERpbSxPcHRpb25zPiBocDFmID0gcGwxLnRlbXBsYXRlIGNhc3Q8T3RoZXJTY2FsYXI+KCk7Ci0gIFZFUklGWV9JU19BUFBST1goaHAxZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxwbDEpOwotICBIeXBlcnBsYW5lPFNjYWxhcixEaW0sT3B0aW9ucz4gaHAxZCA9IHBsMS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChocDFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHBsMSk7CisgIEh5cGVycGxhbmU8T3RoZXJTY2FsYXIsIERpbSwgT3B0aW9ucz4gaHAxZiA9IHBsMS50ZW1wbGF0ZSBjYXN0PE90aGVyU2NhbGFyPigpOworICBWRVJJRllfSVNfQVBQUk9YKGhwMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksIHBsMSk7CisgIEh5cGVycGxhbmU8U2NhbGFyLCBEaW0sIE9wdGlvbnM+IGhwMWQgPSBwbDEudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CisgIFZFUklGWV9JU19BUFBST1goaHAxZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSwgcGwxKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGxpbmVzKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGxpbmVzKCkgewogICB1c2luZyBzdGQ6OmFiczsKICAgdHlwZWRlZiBIeXBlcnBsYW5lPFNjYWxhciwgMj4gSExpbmU7CiAgIHR5cGVkZWYgUGFyYW1ldHJpemVkTGluZTxTY2FsYXIsIDI+IFBMaW5lOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMiwxPiBWZWN0b3I7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IENvZWZmc1R5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMiwgMT4gVmVjdG9yOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDE+IENvZWZmc1R5cGU7CiAKLSAgZm9yKGludCBpID0gMDsgaSA8IDEwOyBpKyspCi0gIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAgICAgVmVjdG9yIGNlbnRlciA9IFZlY3Rvcjo6UmFuZG9tKCk7CiAgICAgVmVjdG9yIHUgPSBWZWN0b3I6OlJhbmRvbSgpOwogICAgIFZlY3RvciB2ID0gVmVjdG9yOjpSYW5kb20oKTsKICAgICBTY2FsYXIgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwotICAgIHdoaWxlIChhYnMoYS0xKSA8IFNjYWxhcigxZS00KSkgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgIHdoaWxlIChhYnMoYSAtIDEpIDwgU2NhbGFyKDFlLTQpKSBhID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAgICAgd2hpbGUgKHUubm9ybSgpIDwgU2NhbGFyKDFlLTQpKSB1ID0gVmVjdG9yOjpSYW5kb20oKTsKICAgICB3aGlsZSAodi5ub3JtKCkgPCBTY2FsYXIoMWUtNCkpIHYgPSBWZWN0b3I6OlJhbmRvbSgpOwogCi0gICAgSExpbmUgbGluZV91ID0gSExpbmU6OlRocm91Z2goY2VudGVyICsgdSwgY2VudGVyICsgYSp1KTsKLSAgICBITGluZSBsaW5lX3YgPSBITGluZTo6VGhyb3VnaChjZW50ZXIgKyB2LCBjZW50ZXIgKyBhKnYpOworICAgIEhMaW5lIGxpbmVfdSA9IEhMaW5lOjpUaHJvdWdoKGNlbnRlciArIHUsIGNlbnRlciArIGEgKiB1KTsKKyAgICBITGluZSBsaW5lX3YgPSBITGluZTo6VGhyb3VnaChjZW50ZXIgKyB2LCBjZW50ZXIgKyBhICogdik7CiAKICAgICAvLyB0aGUgbGluZSBlcXVhdGlvbnMgc2hvdWxkIGJlIG5vcm1hbGl6ZWQgc28gdGhhdCBhXjIrYl4yPTEKICAgICBWRVJJRllfSVNfQVBQUk9YKGxpbmVfdS5ub3JtYWwoKS5ub3JtKCksIFNjYWxhcigxKSk7CkBAIC0xMTMsMzUgKzExMCwzMiBAQAogICAgIFZlY3RvciByZXN1bHQgPSBsaW5lX3UuaW50ZXJzZWN0aW9uKGxpbmVfdik7CiAKICAgICAvLyB0aGUgbGluZXMgc2hvdWxkIGludGVyc2VjdCBhdCB0aGUgcG9pbnQgd2UgY2FsbGVkICJjZW50ZXIiCi0gICAgaWYoYWJzKGEtMSkgPiBTY2FsYXIoMWUtMikgJiYgYWJzKHYubm9ybWFsaXplZCgpLmRvdCh1Lm5vcm1hbGl6ZWQoKSkpPFNjYWxhcigwLjkpKQorICAgIGlmIChhYnMoYSAtIDEpID4gU2NhbGFyKDFlLTIpICYmIGFicyh2Lm5vcm1hbGl6ZWQoKS5kb3QodS5ub3JtYWxpemVkKCkpKSA8IFNjYWxhcigwLjkpKQogICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQsIGNlbnRlcik7CiAKICAgICAvLyBjaGVjayBjb252ZXJzaW9ucyBiZXR3ZWVuIHR3byB0eXBlcyBvZiBsaW5lcwotICAgIFBMaW5lIHBsKGxpbmVfdSk7IC8vIGdjYyAzLjMgd2lsbCBjcmFzaCBpZiB3ZSBkb24ndCBuYW1lIHRoaXMgdmFyaWFibGUuCisgICAgUExpbmUgcGwobGluZV91KTsgIC8vIGdjYyAzLjMgd2lsbCBjcmFzaCBpZiB3ZSBkb24ndCBuYW1lIHRoaXMgdmFyaWFibGUuCiAgICAgSExpbmUgbGluZV91MihwbCk7CiAgICAgQ29lZmZzVHlwZSBjb252ZXJ0ZWRfY29lZmZzID0gbGluZV91Mi5jb2VmZnMoKTsKLSAgICBpZihsaW5lX3UyLm5vcm1hbCgpLmRvdChsaW5lX3Uubm9ybWFsKCkpPFNjYWxhcigwKSkKLSAgICAgIGNvbnZlcnRlZF9jb2VmZnMgPSAtbGluZV91Mi5jb2VmZnMoKTsKKyAgICBpZiAobGluZV91Mi5ub3JtYWwoKS5kb3QobGluZV91Lm5vcm1hbCgpKSA8IFNjYWxhcigwKSkgY29udmVydGVkX2NvZWZmcyA9IC1saW5lX3UyLmNvZWZmcygpOwogICAgIFZFUklGWShsaW5lX3UuY29lZmZzKCkuaXNBcHByb3goY29udmVydGVkX2NvZWZmcykpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBwbGFuZXMoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgcGxhbmVzKCkgewogICB1c2luZyBzdGQ6OmFiczsKICAgdHlwZWRlZiBIeXBlcnBsYW5lPFNjYWxhciwgMz4gUGxhbmU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAzLCAxPiBWZWN0b3I7CiAKLSAgZm9yKGludCBpID0gMDsgaSA8IDEwOyBpKyspCi0gIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAgICAgVmVjdG9yIHYwID0gVmVjdG9yOjpSYW5kb20oKTsKICAgICBWZWN0b3IgdjEodjApLCB2Mih2MCk7Ci0gICAgaWYoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KDAsMSk+MC4yNSkKLSAgICAgIHYxICs9IFZlY3Rvcjo6UmFuZG9tKCk7Ci0gICAgaWYoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KDAsMSk+MC4yNSkKLSAgICAgIHYyICs9IHYxICogc3RkOjpwb3coaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KDAsMSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTYpKTsKLSAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oMCwxKT4wLjI1KQotICAgICAgdjIgKz0gVmVjdG9yOjpSYW5kb20oKSAqIHN0ZDo6cG93KGludGVybmFsOjpyYW5kb208U2NhbGFyPigwLDEpLGludGVybmFsOjpyYW5kb208aW50PigxLDE2KSk7CisgICAgaWYgKGludGVybmFsOjpyYW5kb208ZG91YmxlPigwLCAxKSA+IDAuMjUpIHYxICs9IFZlY3Rvcjo6UmFuZG9tKCk7CisgICAgaWYgKGludGVybmFsOjpyYW5kb208ZG91YmxlPigwLCAxKSA+IDAuMjUpCisgICAgICB2MiArPSB2MSAqIHN0ZDo6cG93KGludGVybmFsOjpyYW5kb208U2NhbGFyPigwLCAxKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDE2KSk7CisgICAgaWYgKGludGVybmFsOjpyYW5kb208ZG91YmxlPigwLCAxKSA+IDAuMjUpCisgICAgICB2MiArPSBWZWN0b3I6OlJhbmRvbSgpICogc3RkOjpwb3coaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KDAsIDEpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTYpKTsKIAogICAgIFBsYW5lIHAwID0gUGxhbmU6OlRocm91Z2godjAsIHYxLCB2Mik7CiAKQEAgLTE1MiwyMCArMTQ2LDIwIEBACiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGh5cGVycGxhbmVfYWxpZ25tZW50KCkKLXsKLSAgdHlwZWRlZiBIeXBlcnBsYW5lPFNjYWxhciwzLEF1dG9BbGlnbj4gUGxhbmUzYTsKLSAgdHlwZWRlZiBIeXBlcnBsYW5lPFNjYWxhciwzLERvbnRBbGlnbj4gUGxhbmUzdTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGh5cGVycGxhbmVfYWxpZ25tZW50KCkgeworICB0eXBlZGVmIEh5cGVycGxhbmU8U2NhbGFyLCAzLCBBdXRvQWxpZ24+IFBsYW5lM2E7CisgIHR5cGVkZWYgSHlwZXJwbGFuZTxTY2FsYXIsIDMsIERvbnRBbGlnbj4gUGxhbmUzdTsKIAogICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5MVs0XTsKICAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBhcnJheTJbNF07Ci0gIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgYXJyYXkzWzQrMV07Ci0gIFNjYWxhciogYXJyYXkzdSA9IGFycmF5MysxOworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5M1s0ICsgMV07CisgIFNjYWxhciAqYXJyYXkzdSA9IGFycmF5MyArIDE7CiAKLSAgUGxhbmUzYSAqcDEgPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTEpKSBQbGFuZTNhOwotICBQbGFuZTN1ICpwMiA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5MikpIFBsYW5lM3U7Ci0gIFBsYW5lM3UgKnAzID0gOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkzdSkpIFBsYW5lM3U7Ci0gIAorICBQbGFuZTNhICpwMSA9IDo6bmV3IChyZWludGVycHJldF9jYXN0PHZvaWQgKj4oYXJyYXkxKSkgUGxhbmUzYTsKKyAgUGxhbmUzdSAqcDIgPSA6Om5ldyAocmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KGFycmF5MikpIFBsYW5lM3U7CisgIFBsYW5lM3UgKnAzID0gOjpuZXcgKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihhcnJheTN1KSkgUGxhbmUzdTsKKwogICBwMS0+Y29lZmZzKCkuc2V0UmFuZG9tKCk7CiAgICpwMiA9ICpwMTsKICAgKnAzID0gKnAxOwpAQCAtMTc0LDE5ICsxNjgsMTcgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChwMS0+Y29lZmZzKCksIHAzLT5jb2VmZnMoKSk7CiB9CiAKLQotRUlHRU5fREVDTEFSRV9URVNUKGdlb19oeXBlcnBsYW5lKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBoeXBlcnBsYW5lKEh5cGVycGxhbmU8ZmxvYXQsMj4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggaHlwZXJwbGFuZShIeXBlcnBsYW5lPGZsb2F0LDM+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGh5cGVycGxhbmUoSHlwZXJwbGFuZTxmbG9hdCwzLERvbnRBbGlnbj4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggaHlwZXJwbGFuZV9hbGlnbm1lbnQ8ZmxvYXQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggaHlwZXJwbGFuZShIeXBlcnBsYW5lPGRvdWJsZSw0PigpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBoeXBlcnBsYW5lKEh5cGVycGxhbmU8c3RkOjpjb21wbGV4PGRvdWJsZT4sNT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggbGluZXM8ZmxvYXQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggbGluZXM8ZG91YmxlPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIHBsYW5lczxmbG9hdD4oKSApOwotICAgIENBTExfU1VCVEVTVF81KCBwbGFuZXM8ZG91YmxlPigpICk7CitFSUdFTl9ERUNMQVJFX1RFU1QoZ2VvX2h5cGVycGxhbmUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoaHlwZXJwbGFuZShIeXBlcnBsYW5lPGZsb2F0LCAyPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoaHlwZXJwbGFuZShIeXBlcnBsYW5lPGZsb2F0LCAzPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoaHlwZXJwbGFuZShIeXBlcnBsYW5lPGZsb2F0LCAzLCBEb250QWxpZ24+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihoeXBlcnBsYW5lX2FsaWdubWVudDxmbG9hdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoaHlwZXJwbGFuZShIeXBlcnBsYW5lPGRvdWJsZSwgND4oKSkpOworICAgIENBTExfU1VCVEVTVF80KGh5cGVycGxhbmUoSHlwZXJwbGFuZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgNT4oKSkpOworICAgIENBTExfU1VCVEVTVF8xKGxpbmVzPGZsb2F0PigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhsaW5lczxkb3VibGU+KCkpOworICAgIENBTExfU1VCVEVTVF8yKHBsYW5lczxmbG9hdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzUocGxhbmVzPGRvdWJsZT4oKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ2VvX29ydGhvbWV0aG9kcy5jcHAgYi90ZXN0L2dlb19vcnRob21ldGhvZHMuY3BwCmluZGV4IDY0YjM5MjcuLjVlZTBmNDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ2VvX29ydGhvbWV0aG9kcy5jcHAKKysrIGIvdGVzdC9nZW9fb3J0aG9tZXRob2RzLmNwcApAQCAtMTYsMTcgKzE2LDE1IEBACiAgICBHZW9tZXRyeS9PcnRob01ldGhvZHMuaAogKi8KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIG9ydGhvbWV0aG9kc18zKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIG9ydGhvbWV0aG9kc18zKCkgewogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDM+IE1hdHJpeDM7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMz4gTWF0cml4MzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAzLCAxPiBWZWN0b3IzOwogCi0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciw0LDE+IFZlY3RvcjQ7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgNCwgMT4gVmVjdG9yNDsKIAotICBWZWN0b3IzIHYwID0gVmVjdG9yMzo6UmFuZG9tKCksCi0gICAgICAgICAgdjEgPSBWZWN0b3IzOjpSYW5kb20oKSwKLSAgICAgICAgICB2MiA9IFZlY3RvcjM6OlJhbmRvbSgpOworICBWZWN0b3IzIHYwID0gVmVjdG9yMzo6UmFuZG9tKCksIHYxID0gVmVjdG9yMzo6UmFuZG9tKCksIHYyID0gVmVjdG9yMzo6UmFuZG9tKCk7CiAKICAgLy8gY3Jvc3MgcHJvZHVjdAogICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odjEuY3Jvc3ModjIpLmRvdCh2MSksIFNjYWxhcigxKSk7CkBAIC0zNSw0MSArMzMsMzggQEAKICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHYyLmRvdCh2MS5jcm9zcyh2MikpLCBTY2FsYXIoMSkpOwogICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odjEuY3Jvc3MoVmVjdG9yMzo6UmFuZG9tKCkpLmRvdCh2MSksIFNjYWxhcigxKSk7CiAgIE1hdHJpeDMgbWF0MzsKLSAgbWF0MyA8PCB2MC5ub3JtYWxpemVkKCksCi0gICAgICAgICAodjAuY3Jvc3ModjEpKS5ub3JtYWxpemVkKCksCi0gICAgICAgICAodjAuY3Jvc3ModjEpLmNyb3NzKHYwKSkubm9ybWFsaXplZCgpOworICBtYXQzIDw8IHYwLm5vcm1hbGl6ZWQoKSwgKHYwLmNyb3NzKHYxKSkubm9ybWFsaXplZCgpLCAodjAuY3Jvc3ModjEpLmNyb3NzKHYwKSkubm9ybWFsaXplZCgpOwogICBWRVJJRlkobWF0My5pc1VuaXRhcnkoKSk7Ci0gIAorCiAgIG1hdDMuc2V0UmFuZG9tKCk7Ci0gIFZFUklGWV9JU19BUFBST1godjAuY3Jvc3MobWF0Myp2MSksIC0obWF0Myp2MSkuY3Jvc3ModjApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MC5jcm9zcyhtYXQzICogdjEpLCAtKG1hdDMgKiB2MSkuY3Jvc3ModjApKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2MC5jcm9zcyhtYXQzLmxhenlQcm9kdWN0KHYxKSksIC0obWF0My5sYXp5UHJvZHVjdCh2MSkpLmNyb3NzKHYwKSk7CiAKICAgLy8gY29sd2lzZS9yb3d3aXNlIGNyb3NzIHByb2R1Y3QKICAgbWF0My5zZXRSYW5kb20oKTsKICAgVmVjdG9yMyB2ZWMzID0gVmVjdG9yMzo6UmFuZG9tKCk7CiAgIE1hdHJpeDMgbWNyb3NzOwotICBpbnQgaSA9IGludGVybmFsOjpyYW5kb208aW50PigwLDIpOworICBpbnQgaSA9IGludGVybmFsOjpyYW5kb208aW50PigwLCAyKTsKICAgbWNyb3NzID0gbWF0My5jb2x3aXNlKCkuY3Jvc3ModmVjMyk7CiAgIFZFUklGWV9JU19BUFBST1gobWNyb3NzLmNvbChpKSwgbWF0My5jb2woaSkuY3Jvc3ModmVjMykpOwotICAKKwogICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oKG1hdDMuYWRqb2ludCgpICogbWF0My5jb2x3aXNlKCkuY3Jvc3ModmVjMykpLmRpYWdvbmFsKCkuY3dpc2VBYnMoKS5zdW0oKSwgU2NhbGFyKDEpKTsKLSAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKChtYXQzLmFkam9pbnQoKSAqIG1hdDMuY29sd2lzZSgpLmNyb3NzKFZlY3RvcjM6OlJhbmRvbSgpKSkuZGlhZ29uYWwoKS5jd2lzZUFicygpLnN1bSgpLCBTY2FsYXIoMSkpOwotICAKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKChtYXQzLmFkam9pbnQoKSAqIG1hdDMuY29sd2lzZSgpLmNyb3NzKFZlY3RvcjM6OlJhbmRvbSgpKSkuZGlhZ29uYWwoKS5jd2lzZUFicygpLnN1bSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyKDEpKTsKKwogICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oKHZlYzMuYWRqb2ludCgpICogbWF0My5jb2x3aXNlKCkuY3Jvc3ModmVjMykpLmN3aXNlQWJzKCkuc3VtKCksIFNjYWxhcigxKSk7CiAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTigodmVjMy5hZGpvaW50KCkgKiBNYXRyaXgzOjpSYW5kb20oKS5jb2x3aXNlKCkuY3Jvc3ModmVjMykpLmN3aXNlQWJzKCkuc3VtKCksIFNjYWxhcigxKSk7Ci0gIAorCiAgIG1jcm9zcyA9IG1hdDMucm93d2lzZSgpLmNyb3NzKHZlYzMpOwogICBWRVJJRllfSVNfQVBQUk9YKG1jcm9zcy5yb3coaSksIG1hdDMucm93KGkpLmNyb3NzKHZlYzMpKTsKIAogICAvLyBjcm9zczMKLSAgVmVjdG9yNCB2NDAgPSBWZWN0b3I0OjpSYW5kb20oKSwKLSAgICAgICAgICB2NDEgPSBWZWN0b3I0OjpSYW5kb20oKSwKLSAgICAgICAgICB2NDIgPSBWZWN0b3I0OjpSYW5kb20oKTsKKyAgVmVjdG9yNCB2NDAgPSBWZWN0b3I0OjpSYW5kb20oKSwgdjQxID0gVmVjdG9yNDo6UmFuZG9tKCksIHY0MiA9IFZlY3RvcjQ6OlJhbmRvbSgpOwogICB2NDAudygpID0gdjQxLncoKSA9IHY0Mi53KCkgPSAwOwogICB2NDIudGVtcGxhdGUgaGVhZDwzPigpID0gdjQwLnRlbXBsYXRlIGhlYWQ8Mz4oKS5jcm9zcyh2NDEudGVtcGxhdGUgaGVhZDwzPigpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2NDAuY3Jvc3MzKHY0MSksIHY0Mik7CiAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTih2NDAuY3Jvc3MzKFZlY3RvcjQ6OlJhbmRvbSgpKS5kb3QodjQwKSwgU2NhbGFyKDEpKTsKLSAgCisKICAgLy8gY2hlY2sgbWl4ZWQgcHJvZHVjdAogICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCAzLCAxPiBSZWFsVmVjdG9yMzsKICAgUmVhbFZlY3RvcjMgcnYxID0gUmVhbFZlY3RvcjM6OlJhbmRvbSgpOwpAQCAtNzgsMjYgKzczLDI1IEBACiAgIFZFUklGWV9JU19BUFBST1godjIuY3Jvc3ModjEpLCBydjEuY3Jvc3ModjEpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIG9ydGhvbWV0aG9kc18yKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIG9ydGhvbWV0aG9kc18yKCkgewogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwyLDE+IFZlY3RvcjI7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMiwgMT4gVmVjdG9yMjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAzLCAxPiBWZWN0b3IzOwogCi0gIFZlY3RvcjMgdjMwID0gVmVjdG9yMzo6UmFuZG9tKCksCi0gICAgICAgICAgdjMxID0gVmVjdG9yMzo6UmFuZG9tKCk7CisgIFZlY3RvcjMgdjMwID0gVmVjdG9yMzo6UmFuZG9tKCksIHYzMSA9IFZlY3RvcjM6OlJhbmRvbSgpOwogICBWZWN0b3IyIHYyMCA9IHYzMC50ZW1wbGF0ZSBoZWFkPDI+KCk7CiAgIFZlY3RvcjIgdjIxID0gdjMxLnRlbXBsYXRlIGhlYWQ8Mj4oKTsKIAogICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odjIwLmNyb3NzKHYyMCksIFNjYWxhcigxKSk7CiAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTih2MjEuY3Jvc3ModjIxKSwgU2NhbGFyKDEpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2MjAuY3Jvc3ModjIxKSwgdjMwLmNyb3NzKHYzMSkueigpKTsKLSAgCisKICAgVmVjdG9yMiB2MjBSb3Q5MChudW1leHQ6OmNvbmooLXYyMC55KCkpLCBudW1leHQ6OmNvbmoodjIwLngoKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKHYyMC5jcm9zcyggdjIwUm90OTApLCAgdjIwLnNxdWFyZWROb3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHYyMC5jcm9zcyh2MjBSb3Q5MCksIHYyMC5zcXVhcmVkTm9ybSgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2MjAuY3Jvc3MoLXYyMFJvdDkwKSwgLXYyMC5zcXVhcmVkTm9ybSgpKTsKICAgVmVjdG9yMiB2MjFSb3Q5MChudW1leHQ6OmNvbmooLXYyMS55KCkpLCBudW1leHQ6OmNvbmoodjIxLngoKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKHYyMS5jcm9zcyggdjIxUm90OTApLCAgdjIxLnNxdWFyZWROb3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHYyMS5jcm9zcyh2MjFSb3Q5MCksIHYyMS5zcXVhcmVkTm9ybSgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2MjEuY3Jvc3MoLXYyMVJvdDkwKSwgLXYyMS5zcXVhcmVkTm9ybSgpKTsKIAogICAvLyBjaGVjayBtaXhlZCBwcm9kdWN0CkBAIC0xMDgsMTMgKzEwMiwxMyBAQAogICBWRVJJRllfSVNfQVBQUk9YKHYyMS5jcm9zcyh2MjApLCBydjIxLmNyb3NzKHYyMCkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBTaXplPiB2b2lkIG9ydGhvbWV0aG9kcyhpbnQgc2l6ZT1TaXplKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IFNpemU+Cit2b2lkIG9ydGhvbWV0aG9kcyhpbnQgc2l6ZSA9IFNpemUpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsU2l6ZSwxPiBWZWN0b3JUeXBlOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMyxTaXplPiBNYXRyaXgzTjsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFNpemUsMz4gTWF0cml4TjM7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgU2l6ZSwgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAzLCBTaXplPiBNYXRyaXgzTjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBTaXplLCAzPiBNYXRyaXhOMzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAzLCAxPiBWZWN0b3IzOwogCiAgIFZlY3RvclR5cGUgdjAgPSBWZWN0b3JUeXBlOjpSYW5kb20oc2l6ZSk7CiAKQEAgLTEyMiwxMCArMTE2LDkgQEAKICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHYwLnVuaXRPcnRob2dvbmFsKCkuZG90KHYwKSwgU2NhbGFyKDEpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2MC51bml0T3J0aG9nb25hbCgpLm5vcm0oKSwgUmVhbFNjYWxhcigxKSk7CiAKLSAgaWYgKHNpemU+PTMpCi0gIHsKKyAgaWYgKHNpemUgPj0gMykgewogICAgIHYwLnRlbXBsYXRlIGhlYWQ8Mj4oKS5zZXRaZXJvKCk7Ci0gICAgdjAudGFpbChzaXplLTIpLnNldFJhbmRvbSgpOworICAgIHYwLnRhaWwoc2l6ZSAtIDIpLnNldFJhbmRvbSgpOwogCiAgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHYwLnVuaXRPcnRob2dvbmFsKCkuZG90KHYwKSwgU2NhbGFyKDEpKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHYwLnVuaXRPcnRob2dvbmFsKCkubm9ybSgpLCBSZWFsU2NhbGFyKDEpKTsKQEAgLTEzMywzNSArMTI2LDM0IEBACiAKICAgLy8gY29sd2lzZS9yb3d3aXNlIGNyb3NzIHByb2R1Y3QKICAgVmVjdG9yMyB2ZWMzID0gVmVjdG9yMzo6UmFuZG9tKCk7Ci0gIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsc2l6ZS0xKTsKKyAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgc2l6ZSAtIDEpOwogCi0gIE1hdHJpeDNOIG1hdDNOKDMsc2l6ZSksIG1jcm9zczNOKDMsc2l6ZSk7CisgIE1hdHJpeDNOIG1hdDNOKDMsIHNpemUpLCBtY3Jvc3MzTigzLCBzaXplKTsKICAgbWF0M04uc2V0UmFuZG9tKCk7CiAgIG1jcm9zczNOID0gbWF0M04uY29sd2lzZSgpLmNyb3NzKHZlYzMpOwogICBWRVJJRllfSVNfQVBQUk9YKG1jcm9zczNOLmNvbChpKSwgbWF0M04uY29sKGkpLmNyb3NzKHZlYzMpKTsKIAotICBNYXRyaXhOMyBtYXROMyhzaXplLDMpLCBtY3Jvc3NOMyhzaXplLDMpOworICBNYXRyaXhOMyBtYXROMyhzaXplLCAzKSwgbWNyb3NzTjMoc2l6ZSwgMyk7CiAgIG1hdE4zLnNldFJhbmRvbSgpOwogICBtY3Jvc3NOMyA9IG1hdE4zLnJvd3dpc2UoKS5jcm9zcyh2ZWMzKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtY3Jvc3NOMy5yb3coaSksIG1hdE4zLnJvdyhpKS5jcm9zcyh2ZWMzKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChnZW9fb3J0aG9tZXRob2RzKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBvcnRob21ldGhvZHNfMjxmbG9hdD4oKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBvcnRob21ldGhvZHNfMjxkb3VibGU+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggb3J0aG9tZXRob2RzXzI8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIG9ydGhvbWV0aG9kc18zPGZsb2F0PigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIG9ydGhvbWV0aG9kc18zPGRvdWJsZT4oKSApOwotICAgIENBTExfU1VCVEVTVF80KCBvcnRob21ldGhvZHNfMzxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggKG9ydGhvbWV0aG9kczxmbG9hdCwyPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCAob3J0aG9tZXRob2RzPGRvdWJsZSwyPigpKSApOwotICAgIENBTExfU1VCVEVTVF8xKCAob3J0aG9tZXRob2RzPGZsb2F0LDM+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIChvcnRob21ldGhvZHM8ZG91YmxlLDM+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIChvcnRob21ldGhvZHM8ZmxvYXQsNz4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggKG9ydGhvbWV0aG9kczxzdGQ6OmNvbXBsZXg8ZG91YmxlPiw4PigpKSApOwotICAgIENBTExfU1VCVEVTVF81KCAob3J0aG9tZXRob2RzPGZsb2F0LER5bmFtaWM+KDM2KSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggKG9ydGhvbWV0aG9kczxkb3VibGUsRHluYW1pYz4oMzUpKSApOworRUlHRU5fREVDTEFSRV9URVNUKGdlb19vcnRob21ldGhvZHMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEob3J0aG9tZXRob2RzXzI8ZmxvYXQ+KCkpOworICAgIENBTExfU1VCVEVTVF8yKG9ydGhvbWV0aG9kc18yPGRvdWJsZT4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzQob3J0aG9tZXRob2RzXzI8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShvcnRob21ldGhvZHNfMzxmbG9hdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzIob3J0aG9tZXRob2RzXzM8ZG91YmxlPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChvcnRob21ldGhvZHNfMzxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOworICAgIENBTExfU1VCVEVTVF8xKChvcnRob21ldGhvZHM8ZmxvYXQsIDI+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMigob3J0aG9tZXRob2RzPGRvdWJsZSwgMj4oKSkpOworICAgIENBTExfU1VCVEVTVF8xKChvcnRob21ldGhvZHM8ZmxvYXQsIDM+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMigob3J0aG9tZXRob2RzPGRvdWJsZSwgMz4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKChvcnRob21ldGhvZHM8ZmxvYXQsIDc+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgob3J0aG9tZXRob2RzPHN0ZDo6Y29tcGxleDxkb3VibGU+LCA4PigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKG9ydGhvbWV0aG9kczxmbG9hdCwgRHluYW1pYz4oMzYpKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoKG9ydGhvbWV0aG9kczxkb3VibGUsIER5bmFtaWM+KDM1KSkpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2dlb19wYXJhbWV0cml6ZWRsaW5lLmNwcCBiL3Rlc3QvZ2VvX3BhcmFtZXRyaXplZGxpbmUuY3BwCmluZGV4IGU0YjE5NGEuLjg1NjI2MWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ2VvX3BhcmFtZXRyaXplZGxpbmUuY3BwCisrKyBiL3Rlc3QvZ2VvX3BhcmFtZXRyaXplZGxpbmUuY3BwCkBAIC0xMyw4ICsxMyw4IEBACiAjaW5jbHVkZSA8RWlnZW4vTFU+CiAjaW5jbHVkZSA8RWlnZW4vUVI+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIExpbmVUeXBlPiB2b2lkIHBhcmFtZXRyaXplZGxpbmUoY29uc3QgTGluZVR5cGUmIF9saW5lKQotewordGVtcGxhdGUgPHR5cGVuYW1lIExpbmVUeXBlPgordm9pZCBwYXJhbWV0cml6ZWRsaW5lKGNvbnN0IExpbmVUeXBlICZfbGluZSkgewogICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CiAgICAgIFBhcmFtZXRyaXplZExpbmUuaAogICAqLwpAQCAtMjMsOSArMjMsOCBAQAogICB0eXBlZGVmIHR5cGVuYW1lIExpbmVUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTGluZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOwotICB0eXBlZGVmIEh5cGVycGxhbmU8U2NhbGFyLExpbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gSHlwZXJwbGFuZVR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgSHlwZXJwbGFuZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBIeXBlcnBsYW5lPFNjYWxhciwgTGluZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lPiBIeXBlcnBsYW5lVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBIeXBlcnBsYW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWUsIEh5cGVycGxhbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gTWF0cml4VHlwZTsKIAogICBWZWN0b3JUeXBlIHAwID0gVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSk7CiAgIFZlY3RvclR5cGUgcDEgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKQEAgLTM3LDI0ICszNiwyNCBAQAogICBTY2FsYXIgczAgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKICAgU2NhbGFyIHMxID0gYWJzKGludGVybmFsOjpyYW5kb208U2NhbGFyPigpKTsKIAotICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIGwwLmRpc3RhbmNlKHAwKSwgUmVhbFNjYWxhcigxKSApOwotICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIGwwLmRpc3RhbmNlKHAwK3MwKmQwKSwgUmVhbFNjYWxhcigxKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCAobDAucHJvamVjdGlvbihwMSktcDEpLm5vcm0oKSwgbDAuZGlzdGFuY2UocDEpICk7Ci0gIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggbDAuZGlzdGFuY2UobDAucHJvamVjdGlvbihwMSkpLCBSZWFsU2NhbGFyKDEpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIFNjYWxhcihsMC5kaXN0YW5jZSgocDArczAqZDApICsgZDAudW5pdE9ydGhvZ29uYWwoKSAqIHMxKSksIHMxICk7CisgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihsMC5kaXN0YW5jZShwMCksIFJlYWxTY2FsYXIoMSkpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obDAuZGlzdGFuY2UocDAgKyBzMCAqIGQwKSwgUmVhbFNjYWxhcigxKSk7CisgIFZFUklGWV9JU19BUFBST1goKGwwLnByb2plY3Rpb24ocDEpIC0gcDEpLm5vcm0oKSwgbDAuZGlzdGFuY2UocDEpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGwwLmRpc3RhbmNlKGwwLnByb2plY3Rpb24ocDEpKSwgUmVhbFNjYWxhcigxKSk7CisgIFZFUklGWV9JU19BUFBST1goU2NhbGFyKGwwLmRpc3RhbmNlKChwMCArIHMwICogZDApICsgZDAudW5pdE9ydGhvZ29uYWwoKSAqIHMxKSksIHMxKTsKIAogICAvLyBjYXN0aW5nCiAgIGNvbnN0IGludCBEaW0gPSBMaW5lVHlwZTo6QW1iaWVudERpbUF0Q29tcGlsZVRpbWU7CiAgIHR5cGVkZWYgdHlwZW5hbWUgR2V0RGlmZmVyZW50VHlwZTxTY2FsYXI+Ojp0eXBlIE90aGVyU2NhbGFyOwotICBQYXJhbWV0cml6ZWRMaW5lPE90aGVyU2NhbGFyLERpbT4gaHAxZiA9IGwwLnRlbXBsYXRlIGNhc3Q8T3RoZXJTY2FsYXI+KCk7Ci0gIFZFUklGWV9JU19BUFBST1goaHAxZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxsMCk7Ci0gIFBhcmFtZXRyaXplZExpbmU8U2NhbGFyLERpbT4gaHAxZCA9IGwwLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOwotICBWRVJJRllfSVNfQVBQUk9YKGhwMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksbDApOworICBQYXJhbWV0cml6ZWRMaW5lPE90aGVyU2NhbGFyLCBEaW0+IGhwMWYgPSBsMC50ZW1wbGF0ZSBjYXN0PE90aGVyU2NhbGFyPigpOworICBWRVJJRllfSVNfQVBQUk9YKGhwMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksIGwwKTsKKyAgUGFyYW1ldHJpemVkTGluZTxTY2FsYXIsIERpbT4gaHAxZCA9IGwwLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOworICBWRVJJRllfSVNfQVBQUk9YKGhwMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksIGwwKTsKIAogICAvLyBpbnRlcnNlY3Rpb25zCiAgIFZlY3RvclR5cGUgcDIgPSBWZWN0b3JUeXBlOjpSYW5kb20oZGltKTsKICAgVmVjdG9yVHlwZSBuMiA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pLm5vcm1hbGl6ZWQoKTsKLSAgSHlwZXJwbGFuZVR5cGUgaHAocDIsbjIpOworICBIeXBlcnBsYW5lVHlwZSBocChwMiwgbjIpOwogICBTY2FsYXIgdCA9IGwwLmludGVyc2VjdGlvblBhcmFtZXRlcihocCk7CiAgIFZlY3RvclR5cGUgcGkgPSBsMC5wb2ludEF0KHQpOwogICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oaHAuc2lnbmVkRGlzdGFuY2UocGkpLCBSZWFsU2NhbGFyKDEpKTsKQEAgLTYyLDQ1ICs2MSw0MyBAQAogICBWRVJJRllfSVNfQVBQUk9YKGwwLmludGVyc2VjdGlvblBvaW50KGhwKSwgcGkpOwogCiAgIC8vIHRyYW5zZm9ybQotICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCi0gIHsKLSAgICBNYXRyaXhUeXBlIHJvdCA9IE1hdHJpeFR5cGU6OlJhbmRvbShkaW0sZGltKS5ob3VzZWhvbGRlclFyKCkuaG91c2Vob2xkZXJRKCk7Ci0gICAgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLExpbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gc2NhbGluZyhWZWN0b3JUeXBlOjpSYW5kb20oKSk7Ci0gICAgVHJhbnNsYXRpb248U2NhbGFyLExpbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gdHJhbnNsYXRpb24oVmVjdG9yVHlwZTo6UmFuZG9tKCkpOworICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpIHsKKyAgICBNYXRyaXhUeXBlIHJvdCA9IE1hdHJpeFR5cGU6OlJhbmRvbShkaW0sIGRpbSkuaG91c2Vob2xkZXJRcigpLmhvdXNlaG9sZGVyUSgpOworICAgIERpYWdvbmFsTWF0cml4PFNjYWxhciwgTGluZVR5cGU6OkFtYmllbnREaW1BdENvbXBpbGVUaW1lPiBzY2FsaW5nKFZlY3RvclR5cGU6OlJhbmRvbSgpKTsKKyAgICBUcmFuc2xhdGlvbjxTY2FsYXIsIExpbmVUeXBlOjpBbWJpZW50RGltQXRDb21waWxlVGltZT4gdHJhbnNsYXRpb24oVmVjdG9yVHlwZTo6UmFuZG9tKCkpOwogCi0gICAgd2hpbGUoc2NhbGluZy5kaWFnb25hbCgpLmN3aXNlQWJzKCkubWluQ29lZmYoKTxSZWFsU2NhbGFyKDFlLTQpKSBzY2FsaW5nLmRpYWdvbmFsKCkgPSBWZWN0b3JUeXBlOjpSYW5kb20oKTsKKyAgICB3aGlsZSAoc2NhbGluZy5kaWFnb25hbCgpLmN3aXNlQWJzKCkubWluQ29lZmYoKSA8IFJlYWxTY2FsYXIoMWUtNCkpIHNjYWxpbmcuZGlhZ29uYWwoKSA9IFZlY3RvclR5cGU6OlJhbmRvbSgpOwogCiAgICAgTGluZVR5cGUgbDEgPSBsMDsKICAgICBWZWN0b3JUeXBlIHAzID0gbDAucG9pbnRBdChTY2FsYXIoMSkpOwotICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggbDEudHJhbnNmb3JtKHJvdCkuZGlzdGFuY2Uocm90ICogcDMpLCBTY2FsYXIoMSkgKTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obDEudHJhbnNmb3JtKHJvdCkuZGlzdGFuY2Uocm90ICogcDMpLCBTY2FsYXIoMSkpOwogICAgIGwxID0gbDA7Ci0gICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBsMS50cmFuc2Zvcm0ocm90LElzb21ldHJ5KS5kaXN0YW5jZShyb3QgKiBwMyksIFNjYWxhcigxKSApOworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihsMS50cmFuc2Zvcm0ocm90LCBJc29tZXRyeSkuZGlzdGFuY2Uocm90ICogcDMpLCBTY2FsYXIoMSkpOwogICAgIGwxID0gbDA7Ci0gICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBsMS50cmFuc2Zvcm0ocm90KnNjYWxpbmcpLmRpc3RhbmNlKChyb3Qqc2NhbGluZykgKiBwMyksIFNjYWxhcigxKSApOworICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihsMS50cmFuc2Zvcm0ocm90ICogc2NhbGluZykuZGlzdGFuY2UoKHJvdCAqIHNjYWxpbmcpICogcDMpLCBTY2FsYXIoMSkpOwogICAgIGwxID0gbDA7Ci0gICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKCBsMS50cmFuc2Zvcm0ocm90KnNjYWxpbmcqdHJhbnNsYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXN0YW5jZSgocm90KnNjYWxpbmcqdHJhbnNsYXRpb24pICogcDMpLCBTY2FsYXIoMSkgKTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obDEudHJhbnNmb3JtKHJvdCAqIHNjYWxpbmcgKiB0cmFuc2xhdGlvbikuZGlzdGFuY2UoKHJvdCAqIHNjYWxpbmcgKiB0cmFuc2xhdGlvbikgKiBwMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhcigxKSk7CiAgICAgbDEgPSBsMDsKLSAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIGwxLnRyYW5zZm9ybShyb3QqdHJhbnNsYXRpb24sSXNvbWV0cnkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXN0YW5jZSgocm90KnRyYW5zbGF0aW9uKSAqIHAzKSwgU2NhbGFyKDEpICk7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGwxLnRyYW5zZm9ybShyb3QgKiB0cmFuc2xhdGlvbiwgSXNvbWV0cnkpLmRpc3RhbmNlKChyb3QgKiB0cmFuc2xhdGlvbikgKiBwMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhcigxKSk7CiAgIH0KLQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgcGFyYW1ldHJpemVkbGluZV9hbGlnbm1lbnQoKQotewotICB0eXBlZGVmIFBhcmFtZXRyaXplZExpbmU8U2NhbGFyLDQsQXV0b0FsaWduPiBMaW5lNGE7Ci0gIHR5cGVkZWYgUGFyYW1ldHJpemVkTGluZTxTY2FsYXIsNCxEb250QWxpZ24+IExpbmU0dTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIHBhcmFtZXRyaXplZGxpbmVfYWxpZ25tZW50KCkgeworICB0eXBlZGVmIFBhcmFtZXRyaXplZExpbmU8U2NhbGFyLCA0LCBBdXRvQWxpZ24+IExpbmU0YTsKKyAgdHlwZWRlZiBQYXJhbWV0cml6ZWRMaW5lPFNjYWxhciwgNCwgRG9udEFsaWduPiBMaW5lNHU7CiAKICAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBhcnJheTFbMTZdOwogICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5MlsxNl07Ci0gIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgYXJyYXkzWzE2KzFdOwotICBTY2FsYXIqIGFycmF5M3UgPSBhcnJheTMrMTsKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBhcnJheTNbMTYgKyAxXTsKKyAgU2NhbGFyICphcnJheTN1ID0gYXJyYXkzICsgMTsKIAotICBMaW5lNGEgKnAxID0gOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkxKSkgTGluZTRhOwotICBMaW5lNHUgKnAyID0gOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkyKSkgTGluZTR1OwotICBMaW5lNHUgKnAzID0gOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkzdSkpIExpbmU0dTsKLSAgCisgIExpbmU0YSAqcDEgPSA6Om5ldyAocmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KGFycmF5MSkpIExpbmU0YTsKKyAgTGluZTR1ICpwMiA9IDo6bmV3IChyZWludGVycHJldF9jYXN0PHZvaWQgKj4oYXJyYXkyKSkgTGluZTR1OworICBMaW5lNHUgKnAzID0gOjpuZXcgKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihhcnJheTN1KSkgTGluZTR1OworCiAgIHAxLT5vcmlnaW4oKS5zZXRSYW5kb20oKTsKICAgcDEtPmRpcmVjdGlvbigpLnNldFJhbmRvbSgpOwogICAqcDIgPSAqcDE7CkBAIC0xMTIsMTQgKzEwOSwxMyBAQAogICBWRVJJRllfSVNfQVBQUk9YKHAxLT5kaXJlY3Rpb24oKSwgcDMtPmRpcmVjdGlvbigpKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGdlb19wYXJhbWV0cml6ZWRsaW5lKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBwYXJhbWV0cml6ZWRsaW5lKFBhcmFtZXRyaXplZExpbmU8ZmxvYXQsMj4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggcGFyYW1ldHJpemVkbGluZShQYXJhbWV0cml6ZWRMaW5lPGZsb2F0LDM+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIHBhcmFtZXRyaXplZGxpbmVfYWxpZ25tZW50PGZsb2F0PigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIHBhcmFtZXRyaXplZGxpbmUoUGFyYW1ldHJpemVkTGluZTxkb3VibGUsND4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggcGFyYW1ldHJpemVkbGluZV9hbGlnbm1lbnQ8ZG91YmxlPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIHBhcmFtZXRyaXplZGxpbmUoUGFyYW1ldHJpemVkTGluZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiw1PigpKSApOworRUlHRU5fREVDTEFSRV9URVNUKGdlb19wYXJhbWV0cml6ZWRsaW5lKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKHBhcmFtZXRyaXplZGxpbmUoUGFyYW1ldHJpemVkTGluZTxmbG9hdCwgMj4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKHBhcmFtZXRyaXplZGxpbmUoUGFyYW1ldHJpemVkTGluZTxmbG9hdCwgMz4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKHBhcmFtZXRyaXplZGxpbmVfYWxpZ25tZW50PGZsb2F0PigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhwYXJhbWV0cml6ZWRsaW5lKFBhcmFtZXRyaXplZExpbmU8ZG91YmxlLCA0PigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMocGFyYW1ldHJpemVkbGluZV9hbGlnbm1lbnQ8ZG91YmxlPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChwYXJhbWV0cml6ZWRsaW5lKFBhcmFtZXRyaXplZExpbmU8c3RkOjpjb21wbGV4PGRvdWJsZT4sIDU+KCkpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9nZW9fcXVhdGVybmlvbi5jcHAgYi90ZXN0L2dlb19xdWF0ZXJuaW9uLmNwcAppbmRleCAyZWVmNDBiLi5iN2U0ZGM1IDEwMDY0NAotLS0gYS90ZXN0L2dlb19xdWF0ZXJuaW9uLmNwcAorKysgYi90ZXN0L2dlb19xdWF0ZXJuaW9uLmNwcApAQCAtMTQsNjYgKzE0LDYyIEBACiAjaW5jbHVkZSA8RWlnZW4vU1ZEPgogI2luY2x1ZGUgIkFubm95aW5nU2NhbGFyLmgiCiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgYm91bmRlZF9hY29zKFQgdikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBib3VuZGVkX2Fjb3MoVCB2KSB7CiAgIHVzaW5nIHN0ZDo6YWNvczsKLSAgdXNpbmcgc3RkOjptaW47CiAgIHVzaW5nIHN0ZDo6bWF4OwotICByZXR1cm4gYWNvcygobWF4KShUKC0xKSwobWluKSh2LFQoMSkpKSk7CisgIHVzaW5nIHN0ZDo6bWluOworICByZXR1cm4gYWNvcygobWF4KShUKC0xKSwgKG1pbikodiwgVCgxKSkpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgUXVhdFR5cGU+IHZvaWQgY2hlY2tfc2xlcnAoY29uc3QgUXVhdFR5cGUmIHEwLCBjb25zdCBRdWF0VHlwZSYgcTEpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUXVhdFR5cGU+Cit2b2lkIGNoZWNrX3NsZXJwKGNvbnN0IFF1YXRUeXBlJiBxMCwgY29uc3QgUXVhdFR5cGUmIHExKSB7CiAgIHVzaW5nIHN0ZDo6YWJzOwogICB0eXBlZGVmIHR5cGVuYW1lIFF1YXRUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIEFuZ2xlQXhpczxTY2FsYXI+IEFBOwogCiAgIFNjYWxhciBsYXJnZUVwcyA9IHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKTsKIAotICBTY2FsYXIgdGhldGFfdG90ID0gQUEocTEqcTAuaW52ZXJzZSgpKS5hbmdsZSgpOwotICBpZih0aGV0YV90b3Q+U2NhbGFyKEVJR0VOX1BJKSkKLSAgICB0aGV0YV90b3QgPSBTY2FsYXIoMi4pKlNjYWxhcihFSUdFTl9QSSktdGhldGFfdG90OwotICBmb3IoU2NhbGFyIHQ9MDsgdDw9U2NhbGFyKDEuMDAxKTsgdCs9U2NhbGFyKDAuMSkpCi0gIHsKLSAgICBRdWF0VHlwZSBxID0gcTAuc2xlcnAodCxxMSk7Ci0gICAgU2NhbGFyIHRoZXRhID0gQUEocSpxMC5pbnZlcnNlKCkpLmFuZ2xlKCk7CisgIFNjYWxhciB0aGV0YV90b3QgPSBBQShxMSAqIHEwLmludmVyc2UoKSkuYW5nbGUoKTsKKyAgaWYgKHRoZXRhX3RvdCA+IFNjYWxhcihFSUdFTl9QSSkpIHRoZXRhX3RvdCA9IFNjYWxhcigyLikgKiBTY2FsYXIoRUlHRU5fUEkpIC0gdGhldGFfdG90OworICBmb3IgKFNjYWxhciB0ID0gMDsgdCA8PSBTY2FsYXIoMS4wMDEpOyB0ICs9IFNjYWxhcigwLjEpKSB7CisgICAgUXVhdFR5cGUgcSA9IHEwLnNsZXJwKHQsIHExKTsKKyAgICBTY2FsYXIgdGhldGEgPSBBQShxICogcTAuaW52ZXJzZSgpKS5hbmdsZSgpOwogICAgIFZFUklGWShhYnMocS5ub3JtKCkgLSAxKSA8IGxhcmdlRXBzKTsKLSAgICBpZih0aGV0YV90b3Q9PTApICBWRVJJRlkodGhldGFfdG90PT0wKTsKLSAgICBlbHNlICAgICAgICAgICAgICBWRVJJRlkoYWJzKHRoZXRhIC0gdCAqIHRoZXRhX3RvdCkgPCBsYXJnZUVwcyk7CisgICAgaWYgKHRoZXRhX3RvdCA9PSAwKQorICAgICAgVkVSSUZZKHRoZXRhX3RvdCA9PSAwKTsKKyAgICBlbHNlCisgICAgICBWRVJJRlkoYWJzKHRoZXRhIC0gdCAqIHRoZXRhX3RvdCkgPCBsYXJnZUVwcyk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgT3B0aW9ucz4gdm9pZCBxdWF0ZXJuaW9uKHZvaWQpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgT3B0aW9ucz4KK3ZvaWQgcXVhdGVybmlvbih2b2lkKSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgUXVhdGVybmlvbi5oCiAgICovCiAgIHVzaW5nIHN0ZDo6YWJzOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXRyaXgzOwotICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyLE9wdGlvbnM+IFF1YXRlcm5pb254OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDE+IFZlY3RvcjM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMz4gTWF0cml4MzsKKyAgdHlwZWRlZiBRdWF0ZXJuaW9uPFNjYWxhciwgT3B0aW9ucz4gUXVhdGVybmlvbng7CiAgIHR5cGVkZWYgQW5nbGVBeGlzPFNjYWxhcj4gQW5nbGVBeGlzeDsKIAogICBTY2FsYXIgbGFyZ2VFcHMgPSB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCk7Ci0gIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSkKLSAgICBsYXJnZUVwcyA9IFNjYWxhcigxZS0zKTsKKyAgaWYgKGludGVybmFsOjppc19zYW1lPFNjYWxhciwgZmxvYXQ+Ojp2YWx1ZSkgbGFyZ2VFcHMgPSBTY2FsYXIoMWUtMyk7CiAKICAgU2NhbGFyIGVwcyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKDFlLTIpOwogCi0gIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwKLSAgICAgICAgICB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpLAotICAgICAgICAgIHYyID0gVmVjdG9yMzo6UmFuZG9tKCksCi0gICAgICAgICAgdjMgPSBWZWN0b3IzOjpSYW5kb20oKTsKKyAgVmVjdG9yMyB2MCA9IFZlY3RvcjM6OlJhbmRvbSgpLCB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpLCB2MiA9IFZlY3RvcjM6OlJhbmRvbSgpLCB2MyA9IFZlY3RvcjM6OlJhbmRvbSgpOwogCi0gIFNjYWxhciAgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKEVJR0VOX1BJKSwgU2NhbGFyKEVJR0VOX1BJKSksCi0gICAgICAgICAgYiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKEVJR0VOX1BJKSwgU2NhbGFyKEVJR0VOX1BJKSk7CisgIFNjYWxhciBhID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC1TY2FsYXIoRUlHRU5fUEkpLCBTY2FsYXIoRUlHRU5fUEkpKSwKKyAgICAgICAgIGIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLVNjYWxhcihFSUdFTl9QSSksIFNjYWxhcihFSUdFTl9QSSkpOwogCiAgIC8vIFF1YXRlcm5pb246IElkZW50aXR5KCksIHNldElkZW50aXR5KCk7CiAgIFF1YXRlcm5pb254IHExLCBxMjsKICAgcTIuc2V0SWRlbnRpdHkoKTsKICAgVkVSSUZZX0lTX0FQUFJPWChRdWF0ZXJuaW9ueChRdWF0ZXJuaW9ueDo6SWRlbnRpdHkoKSkuY29lZmZzKCksIHEyLmNvZWZmcygpKTsKICAgcTEuY29lZmZzKCkuc2V0UmFuZG9tKCk7Ci0gIFZFUklGWV9JU19BUFBST1gocTEuY29lZmZzKCksIChxMSpxMikuY29lZmZzKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHExLmNvZWZmcygpLCAocTEgKiBxMikuY29lZmZzKCkpOwogCiAjaWZuZGVmIEVJR0VOX05PX0lPCiAgIC8vIFByaW50aW5nCkBAIC04OSwxMiArODUsMTAgQEAKICAgcTIgPSBBbmdsZUF4aXN4KGEsIHYxLm5vcm1hbGl6ZWQoKSk7CiAKICAgLy8gYW5ndWxhciBkaXN0YW5jZQotICBTY2FsYXIgcmVmYW5nbGUgPSBhYnMoQW5nbGVBeGlzeChxMS5pbnZlcnNlKCkqcTIpLmFuZ2xlKCkpOwotICBpZiAocmVmYW5nbGU+U2NhbGFyKEVJR0VOX1BJKSkKLSAgICByZWZhbmdsZSA9IFNjYWxhcigyKSpTY2FsYXIoRUlHRU5fUEkpIC0gcmVmYW5nbGU7CisgIFNjYWxhciByZWZhbmdsZSA9IGFicyhBbmdsZUF4aXN4KHExLmludmVyc2UoKSAqIHEyKS5hbmdsZSgpKTsKKyAgaWYgKHJlZmFuZ2xlID4gU2NhbGFyKEVJR0VOX1BJKSkgcmVmYW5nbGUgPSBTY2FsYXIoMikgKiBTY2FsYXIoRUlHRU5fUEkpIC0gcmVmYW5nbGU7CiAKLSAgaWYoKHExLmNvZWZmcygpLXEyLmNvZWZmcygpKS5ub3JtKCkgPiBTY2FsYXIoMTApKmxhcmdlRXBzKQotICB7CisgIGlmICgocTEuY29lZmZzKCkgLSBxMi5jb2VmZnMoKSkubm9ybSgpID4gU2NhbGFyKDEwKSAqIGxhcmdlRXBzKSB7CiAgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGFicyhxMS5hbmd1bGFyRGlzdGFuY2UocTIpIC0gcmVmYW5nbGUpLCBTY2FsYXIoMSkpOwogICB9CiAKQEAgLTEwNCwyMCArOTgsMTggQEAKIAogICAvLyByb3RhdGlvbiBtYXRyaXggY29udmVyc2lvbgogICBWRVJJRllfSVNfQVBQUk9YKHExICogdjIsIHExLnRvUm90YXRpb25NYXRyaXgoKSAqIHYyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChxMSAqIHEyICogdjIsCi0gICAgcTEudG9Sb3RhdGlvbk1hdHJpeCgpICogcTIudG9Sb3RhdGlvbk1hdHJpeCgpICogdjIpOworICBWRVJJRllfSVNfQVBQUk9YKHExICogcTIgKiB2MiwgcTEudG9Sb3RhdGlvbk1hdHJpeCgpICogcTIudG9Sb3RhdGlvbk1hdHJpeCgpICogdjIpOwogCi0gIFZFUklGWSggIChxMipxMSkuaXNBcHByb3gocTEqcTIsIGxhcmdlRXBzKQotICAgICAgICB8fCAhKHEyICogcTEgKiB2MikuaXNBcHByb3gocTEudG9Sb3RhdGlvbk1hdHJpeCgpICogcTIudG9Sb3RhdGlvbk1hdHJpeCgpICogdjIpKTsKKyAgVkVSSUZZKChxMiAqIHExKS5pc0FwcHJveChxMSAqIHEyLCBsYXJnZUVwcykgfHwKKyAgICAgICAgICEocTIgKiBxMSAqIHYyKS5pc0FwcHJveChxMS50b1JvdGF0aW9uTWF0cml4KCkgKiBxMi50b1JvdGF0aW9uTWF0cml4KCkgKiB2MikpOwogCiAgIHEyID0gcTEudG9Sb3RhdGlvbk1hdHJpeCgpOwotICBWRVJJRllfSVNfQVBQUk9YKHExKnYxLHEyKnYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMSAqIHYxLCBxMiAqIHYxKTsKIAogICBNYXRyaXgzIHJvdDEocTEpOwotICBWRVJJRllfSVNfQVBQUk9YKHExKnYxLHJvdDEqdjEpOwotICBRdWF0ZXJuaW9ueCBxMyhyb3QxLnRyYW5zcG9zZSgpKnJvdDEpOwotICBWRVJJRllfSVNfQVBQUk9YKHEzKnYxLHYxKTsKLQorICBWRVJJRllfSVNfQVBQUk9YKHExICogdjEsIHJvdDEgKiB2MSk7CisgIFF1YXRlcm5pb254IHEzKHJvdDEudHJhbnNwb3NlKCkgKiByb3QxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMyAqIHYxLCB2MSk7CiAKICAgLy8gYW5nbGUtYXhpcyBjb252ZXJzaW9uCiAgIEFuZ2xlQXhpc3ggYWEgPSBBbmdsZUF4aXN4KHExKTsKQEAgLTEyNSwzMyArMTE3LDI5IEBACiAKICAgLy8gRG8gbm90IGV4ZWN1dGUgdGhlIHRlc3QgaWYgdGhlIHJvdGF0aW9uIGFuZ2xlIGlzIGFsbW9zdCB6ZXJvLCBvcgogICAvLyB0aGUgcm90YXRpb24gYXhpcyBhbmQgdjEgYXJlIGFsbW9zdCBwYXJhbGxlbC4KLSAgaWYgKGFicyhhYS5hbmdsZSgpKSA+IFNjYWxhcig1KSp0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkKLSAgICAgICYmIChhYS5heGlzKCkgLSB2MS5ub3JtYWxpemVkKCkpLm5vcm0oKSA8IFNjYWxhcigxLjk5KQotICAgICAgJiYgKGFhLmF4aXMoKSArIHYxLm5vcm1hbGl6ZWQoKSkubm9ybSgpIDwgU2NhbGFyKDEuOTkpKQotICB7Ci0gICAgVkVSSUZZX0lTX05PVF9BUFBST1gocTEgKiB2MSwgUXVhdGVybmlvbngoQW5nbGVBeGlzeChhYS5hbmdsZSgpKjIsYWEuYXhpcygpKSkgKiB2MSk7CisgIGlmIChhYnMoYWEuYW5nbGUoKSkgPiBTY2FsYXIoNSkgKiB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkgJiYgKGFhLmF4aXMoKSAtIHYxLm5vcm1hbGl6ZWQoKSkubm9ybSgpIDwgU2NhbGFyKDEuOTkpICYmCisgICAgICAoYWEuYXhpcygpICsgdjEubm9ybWFsaXplZCgpKS5ub3JtKCkgPCBTY2FsYXIoMS45OSkpIHsKKyAgICBWRVJJRllfSVNfTk9UX0FQUFJPWChxMSAqIHYxLCBRdWF0ZXJuaW9ueChBbmdsZUF4aXN4KGFhLmFuZ2xlKCkgKiAyLCBhYS5heGlzKCkpKSAqIHYxKTsKICAgfQogCiAgIC8vIGZyb20gdHdvIHZlY3RvciBjcmVhdGlvbgotICBWRVJJRllfSVNfQVBQUk9YKCB2Mi5ub3JtYWxpemVkKCksKHEyLnNldEZyb21Ud29WZWN0b3JzKHYxLCB2MikqdjEpLm5vcm1hbGl6ZWQoKSk7Ci0gIFZFUklGWV9JU19BUFBST1goIHYxLm5vcm1hbGl6ZWQoKSwocTIuc2V0RnJvbVR3b1ZlY3RvcnModjEsIHYxKSp2MSkubm9ybWFsaXplZCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgtdjEubm9ybWFsaXplZCgpLChxMi5zZXRGcm9tVHdvVmVjdG9ycyh2MSwtdjEpKnYxKS5ub3JtYWxpemVkKCkpOwotICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLGRvdWJsZT46OnZhbHVlKQotICB7Ci0gICAgdjMgPSAodjEuYXJyYXkoKStlcHMpLm1hdHJpeCgpOwotICAgIFZFUklGWV9JU19BUFBST1goIHYzLm5vcm1hbGl6ZWQoKSwocTIuc2V0RnJvbVR3b1ZlY3RvcnModjEsIHYzKSp2MSkubm9ybWFsaXplZCgpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKC12My5ub3JtYWxpemVkKCksKHEyLnNldEZyb21Ud29WZWN0b3JzKHYxLC12MykqdjEpLm5vcm1hbGl6ZWQoKSk7CisgIFZFUklGWV9JU19BUFBST1godjIubm9ybWFsaXplZCgpLCAocTIuc2V0RnJvbVR3b1ZlY3RvcnModjEsIHYyKSAqIHYxKS5ub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLm5vcm1hbGl6ZWQoKSwgKHEyLnNldEZyb21Ud29WZWN0b3JzKHYxLCB2MSkgKiB2MSkubm9ybWFsaXplZCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgtdjEubm9ybWFsaXplZCgpLCAocTIuc2V0RnJvbVR3b1ZlY3RvcnModjEsIC12MSkgKiB2MSkubm9ybWFsaXplZCgpKTsKKyAgaWYgKGludGVybmFsOjppc19zYW1lPFNjYWxhciwgZG91YmxlPjo6dmFsdWUpIHsKKyAgICB2MyA9ICh2MS5hcnJheSgpICsgZXBzKS5tYXRyaXgoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYzLm5vcm1hbGl6ZWQoKSwgKHEyLnNldEZyb21Ud29WZWN0b3JzKHYxLCB2MykgKiB2MSkubm9ybWFsaXplZCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKC12My5ub3JtYWxpemVkKCksIChxMi5zZXRGcm9tVHdvVmVjdG9ycyh2MSwgLXYzKSAqIHYxKS5ub3JtYWxpemVkKCkpOwogICB9CiAKICAgLy8gZnJvbSB0d28gdmVjdG9yIGNyZWF0aW9uIHN0YXRpYyBmdW5jdGlvbgotICBWRVJJRllfSVNfQVBQUk9YKCB2Mi5ub3JtYWxpemVkKCksKFF1YXRlcm5pb254OjpGcm9tVHdvVmVjdG9ycyh2MSwgdjIpKnYxKS5ub3JtYWxpemVkKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKCB2MS5ub3JtYWxpemVkKCksKFF1YXRlcm5pb254OjpGcm9tVHdvVmVjdG9ycyh2MSwgdjEpKnYxKS5ub3JtYWxpemVkKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKC12MS5ub3JtYWxpemVkKCksKFF1YXRlcm5pb254OjpGcm9tVHdvVmVjdG9ycyh2MSwtdjEpKnYxKS5ub3JtYWxpemVkKCkpOwotICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLGRvdWJsZT46OnZhbHVlKQotICB7Ci0gICAgdjMgPSAodjEuYXJyYXkoKStlcHMpLm1hdHJpeCgpOwotICAgIFZFUklGWV9JU19BUFBST1goIHYzLm5vcm1hbGl6ZWQoKSwoUXVhdGVybmlvbng6OkZyb21Ud29WZWN0b3JzKHYxLCB2MykqdjEpLm5vcm1hbGl6ZWQoKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgtdjMubm9ybWFsaXplZCgpLChRdWF0ZXJuaW9ueDo6RnJvbVR3b1ZlY3RvcnModjEsLXYzKSp2MSkubm9ybWFsaXplZCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2Mi5ub3JtYWxpemVkKCksIChRdWF0ZXJuaW9ueDo6RnJvbVR3b1ZlY3RvcnModjEsIHYyKSAqIHYxKS5ub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLm5vcm1hbGl6ZWQoKSwgKFF1YXRlcm5pb254OjpGcm9tVHdvVmVjdG9ycyh2MSwgdjEpICogdjEpLm5vcm1hbGl6ZWQoKSk7CisgIFZFUklGWV9JU19BUFBST1goLXYxLm5vcm1hbGl6ZWQoKSwgKFF1YXRlcm5pb254OjpGcm9tVHdvVmVjdG9ycyh2MSwgLXYxKSAqIHYxKS5ub3JtYWxpemVkKCkpOworICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBkb3VibGU+Ojp2YWx1ZSkgeworICAgIHYzID0gKHYxLmFycmF5KCkgKyBlcHMpLm1hdHJpeCgpOworICAgIFZFUklGWV9JU19BUFBST1godjMubm9ybWFsaXplZCgpLCAoUXVhdGVybmlvbng6OkZyb21Ud29WZWN0b3JzKHYxLCB2MykgKiB2MSkubm9ybWFsaXplZCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKC12My5ub3JtYWxpemVkKCksIChRdWF0ZXJuaW9ueDo6RnJvbVR3b1ZlY3RvcnModjEsIC12MykgKiB2MSkubm9ybWFsaXplZCgpKTsKICAgfQogCiAgIC8vIGludmVyc2UgYW5kIGNvbmp1Z2F0ZQpAQCAtMTYwLDU2ICsxNDgsNTYgQEAKIAogICAvLyB0ZXN0IGNhc3RpbmcKICAgUXVhdGVybmlvbjxmbG9hdD4gcTFmID0gcTEudGVtcGxhdGUgY2FzdDxmbG9hdD4oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChxMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCkscTEpOworICBWRVJJRllfSVNfQVBQUk9YKHExZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSwgcTEpOwogICBRdWF0ZXJuaW9uPGRvdWJsZT4gcTFkID0gcTEudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7Ci0gIFZFUklGWV9JU19BUFBST1gocTFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksIHExKTsKIAogICAvLyB0ZXN0IGJ1ZyAzNjkgLSBpbXByb3BlciBhbGlnbm1lbnQuCi0gIFF1YXRlcm5pb254ICpxID0gbmV3IFF1YXRlcm5pb254OworICBRdWF0ZXJuaW9ueCogcSA9IG5ldyBRdWF0ZXJuaW9ueDsKICAgZGVsZXRlIHE7CiAKICAgcTEgPSBRdWF0ZXJuaW9ueDo6VW5pdFJhbmRvbSgpOwogICBxMiA9IFF1YXRlcm5pb254OjpVbml0UmFuZG9tKCk7Ci0gIGNoZWNrX3NsZXJwKHExLHEyKTsKKyAgY2hlY2tfc2xlcnAocTEsIHEyKTsKIAogICBxMSA9IEFuZ2xlQXhpc3goYiwgdjEubm9ybWFsaXplZCgpKTsKLSAgcTIgPSBBbmdsZUF4aXN4KGIrU2NhbGFyKEVJR0VOX1BJKSwgdjEubm9ybWFsaXplZCgpKTsKLSAgY2hlY2tfc2xlcnAocTEscTIpOworICBxMiA9IEFuZ2xlQXhpc3goYiArIFNjYWxhcihFSUdFTl9QSSksIHYxLm5vcm1hbGl6ZWQoKSk7CisgIGNoZWNrX3NsZXJwKHExLCBxMik7CiAKLSAgcTEgPSBBbmdsZUF4aXN4KGIsICB2MS5ub3JtYWxpemVkKCkpOworICBxMSA9IEFuZ2xlQXhpc3goYiwgdjEubm9ybWFsaXplZCgpKTsKICAgcTIgPSBBbmdsZUF4aXN4KC1iLCAtdjEubm9ybWFsaXplZCgpKTsKLSAgY2hlY2tfc2xlcnAocTEscTIpOworICBjaGVja19zbGVycChxMSwgcTIpOwogCiAgIHExID0gUXVhdGVybmlvbng6OlVuaXRSYW5kb20oKTsKICAgcTIuY29lZmZzKCkgPSAtcTEuY29lZmZzKCk7Ci0gIGNoZWNrX3NsZXJwKHExLHEyKTsKKyAgY2hlY2tfc2xlcnAocTEsIHEyKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIG1hcFF1YXRlcm5pb24odm9pZCl7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBtYXBRdWF0ZXJuaW9uKHZvaWQpIHsKICAgdHlwZWRlZiBNYXA8UXVhdGVybmlvbjxTY2FsYXI+LCBBbGlnbmVkPiBNUXVhdGVybmlvbkE7CiAgIHR5cGVkZWYgTWFwPGNvbnN0IFF1YXRlcm5pb248U2NhbGFyPiwgQWxpZ25lZD4gTUNRdWF0ZXJuaW9uQTsKICAgdHlwZWRlZiBNYXA8UXVhdGVybmlvbjxTY2FsYXI+ID4gTVF1YXRlcm5pb25VQTsKICAgdHlwZWRlZiBNYXA8Y29uc3QgUXVhdGVybmlvbjxTY2FsYXI+ID4gTUNRdWF0ZXJuaW9uVUE7CiAgIHR5cGVkZWYgUXVhdGVybmlvbjxTY2FsYXI+IFF1YXRlcm5pb254OwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDE+IFZlY3RvcjM7CiAgIHR5cGVkZWYgQW5nbGVBeGlzPFNjYWxhcj4gQW5nbGVBeGlzeDsKLSAgCi0gIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwKLSAgICAgICAgICB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpOwotICBTY2FsYXIgIGEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLVNjYWxhcihFSUdFTl9QSSksIFNjYWxhcihFSUdFTl9QSSkpOworCisgIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwgdjEgPSBWZWN0b3IzOjpSYW5kb20oKTsKKyAgU2NhbGFyIGEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLVNjYWxhcihFSUdFTl9QSSksIFNjYWxhcihFSUdFTl9QSSkpOwogCiAgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgYXJyYXkxWzRdOwogICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5Mls0XTsKLSAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBhcnJheTNbNCsxXTsKLSAgU2NhbGFyKiBhcnJheTN1bmFsaWduZWQgPSBhcnJheTMrMTsKLSAgCi0gIE1RdWF0ZXJuaW9uQSAgICBtcTEoYXJyYXkxKTsKLSAgTUNRdWF0ZXJuaW9uQSAgIG1jcTEoYXJyYXkxKTsKLSAgTVF1YXRlcm5pb25BICAgIG1xMihhcnJheTIpOwotICBNUXVhdGVybmlvblVBICAgbXEzKGFycmF5M3VuYWxpZ25lZCk7Ci0gIE1DUXVhdGVybmlvblVBICBtY3EzKGFycmF5M3VuYWxpZ25lZCk7CisgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgYXJyYXkzWzQgKyAxXTsKKyAgU2NhbGFyKiBhcnJheTN1bmFsaWduZWQgPSBhcnJheTMgKyAxOwogCi0vLyAgc3RkOjpjZXJyIDw8IGFycmF5MSA8PCAiICIgPDwgYXJyYXkyIDw8ICIgIiA8PCBhcnJheTMgPDwgIlxuIjsKKyAgTVF1YXRlcm5pb25BIG1xMShhcnJheTEpOworICBNQ1F1YXRlcm5pb25BIG1jcTEoYXJyYXkxKTsKKyAgTVF1YXRlcm5pb25BIG1xMihhcnJheTIpOworICBNUXVhdGVybmlvblVBIG1xMyhhcnJheTN1bmFsaWduZWQpOworICBNQ1F1YXRlcm5pb25VQSBtY3EzKGFycmF5M3VuYWxpZ25lZCk7CisKKyAgLy8gIHN0ZDo6Y2VyciA8PCBhcnJheTEgPDwgIiAiIDw8IGFycmF5MiA8PCAiICIgPDwgYXJyYXkzIDw8ICJcbiI7CiAgIG1xMSA9IEFuZ2xlQXhpc3goYSwgdjAubm9ybWFsaXplZCgpKTsKICAgbXEyID0gbXExOwogICBtcTMgPSBtcTE7CkBAIC0yMjIsNTggKzIxMCw1OSBAQAogICBWRVJJRllfSVNfQVBQUk9YKHExLmNvZWZmcygpLCBxMi5jb2VmZnMoKSk7CiAgIFZFUklGWV9JU19BUFBST1gocTEuY29lZmZzKCksIHEzLmNvZWZmcygpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChxNC5jb2VmZnMoKSwgcTMuY29lZmZzKCkpOwotICAgIAorCiAgIFZFUklGWV9JU19BUFBST1gobXExICogKG1xMS5pbnZlcnNlKCkgKiB2MSksIHYxKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtcTEgKiAobXExLmNvbmp1Z2F0ZSgpICogdjEpLCB2MSk7Ci0gIAorCiAgIFZFUklGWV9JU19BUFBST1gobWNxMSAqIChtY3ExLmludmVyc2UoKSAqIHYxKSwgdjEpOwogICBWRVJJRllfSVNfQVBQUk9YKG1jcTEgKiAobWNxMS5jb25qdWdhdGUoKSAqIHYxKSwgdjEpOwotICAKKwogICBWRVJJRllfSVNfQVBQUk9YKG1xMyAqIChtcTMuaW52ZXJzZSgpICogdjEpLCB2MSk7CiAgIFZFUklGWV9JU19BUFBST1gobXEzICogKG1xMy5jb25qdWdhdGUoKSAqIHYxKSwgdjEpOwotICAKKwogICBWRVJJRllfSVNfQVBQUk9YKG1jcTMgKiAobWNxMy5pbnZlcnNlKCkgKiB2MSksIHYxKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtY3EzICogKG1jcTMuY29uanVnYXRlKCkgKiB2MSksIHYxKTsKLSAgCi0gIFZFUklGWV9JU19BUFBST1gobXExKm1xMiwgcTEqcTIpOwotICBWRVJJRllfSVNfQVBQUk9YKG1xMyptcTIsIHEzKnEyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtY3ExKm1xMiwgcTEqcTIpOwotICBWRVJJRllfSVNfQVBQUk9YKG1jcTMqbXEyLCBxMypxMik7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtcTEgKiBtcTIsIHExICogcTIpOworICBWRVJJRllfSVNfQVBQUk9YKG1xMyAqIG1xMiwgcTMgKiBxMik7CisgIFZFUklGWV9JU19BUFBST1gobWNxMSAqIG1xMiwgcTEgKiBxMik7CisgIFZFUklGWV9JU19BUFBST1gobWNxMyAqIG1xMiwgcTMgKiBxMik7CiAKICAgLy8gQnVnIDE0NjEsIGNvbXBpbGF0aW9uIGlzc3VlIHdpdGggTWFwPGNvbnN0IFF1YXQ+Ojp3KCksIGFuZCBvdGhlciByZWZlcmVuY2UvY29uc3RuZXNzIGNoZWNrczoKICAgVkVSSUZZX0lTX0FQUFJPWChtY3EzLmNvZWZmcygpLngoKSArIG1jcTMuY29lZmZzKCkueSgpICsgbWNxMy5jb2VmZnMoKS56KCkgKyBtY3EzLmNvZWZmcygpLncoKSwgbWNxMy5jb2VmZnMoKS5zdW0oKSk7CiAgIFZFUklGWV9JU19BUFBST1gobWNxMy54KCkgKyBtY3EzLnkoKSArIG1jcTMueigpICsgbWNxMy53KCksIG1jcTMuY29lZmZzKCkuc3VtKCkpOwogICBtcTMudygpID0gMTsKICAgY29uc3QgUXVhdGVybmlvbngmIGNxMyhxMyk7Ci0gIFZFUklGWSggJmNxMy54KCkgPT0gJnEzLngoKSApOworICBWRVJJRlkoJmNxMy54KCkgPT0gJnEzLngoKSk7CiAgIGNvbnN0IE1RdWF0ZXJuaW9uVUEmIGNtcTMobXEzKTsKLSAgVkVSSUZZKCAmY21xMy54KCkgPT0gJm1xMy54KCkgKTsKKyAgVkVSSUZZKCZjbXEzLngoKSA9PSAmbXEzLngoKSk7CiAgIC8vIEZJWE1FIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIG9rLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGN1cnJlbnRseSB0aGUgTFZhbHVlQml0IGZsYWcKICAgLy8gaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBjYW4gcmV0dXJuIGEgY29lZmYgYnkgcmVmZXJlbmNlIG9yIG5vdCwgd2hpY2ggaXMgbm90IGVub3VnaCBmb3IgTWFwPGNvbnN0IC4uLj4uCi0gIC8vY29uc3QgTUNRdWF0ZXJuaW9uVUEmIGNtY3EzKG1jcTMpOwotICAvL1ZFUklGWSggJmNtY3EzLngoKSA9PSAmbWNxMy54KCkgKTsKKyAgLy8gY29uc3QgTUNRdWF0ZXJuaW9uVUEmIGNtY3EzKG1jcTMpOworICAvLyBWRVJJRlkoICZjbWNxMy54KCkgPT0gJm1jcTMueCgpICk7CiAKICAgLy8gdGVzdCBjYXN0CiAgIHsKICAgICBRdWF0ZXJuaW9uPGZsb2F0PiBxMWYgPSBtcTEudGVtcGxhdGUgY2FzdDxmbG9hdD4oKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHExZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSxtcTEpOworICAgIFZFUklGWV9JU19BUFBST1gocTFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLCBtcTEpOwogICAgIFF1YXRlcm5pb248ZG91YmxlPiBxMWQgPSBtcTEudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChxMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksbXExKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHExZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSwgbXExKTsKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgcXVhdGVybmlvbkFsaWdubWVudCh2b2lkKXsKLSAgdHlwZWRlZiBRdWF0ZXJuaW9uPFNjYWxhcixBdXRvQWxpZ24+IFF1YXRlcm5pb25BOwotICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyLERvbnRBbGlnbj4gUXVhdGVybmlvblVBOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgcXVhdGVybmlvbkFsaWdubWVudCh2b2lkKSB7CisgIHR5cGVkZWYgUXVhdGVybmlvbjxTY2FsYXIsIEF1dG9BbGlnbj4gUXVhdGVybmlvbkE7CisgIHR5cGVkZWYgUXVhdGVybmlvbjxTY2FsYXIsIERvbnRBbGlnbj4gUXVhdGVybmlvblVBOwogCiAgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgYXJyYXkxWzRdOwogICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5Mls0XTsKLSAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBhcnJheTNbNCsxXTsKLSAgU2NhbGFyKiBhcnJheXVuYWxpZ25lZCA9IGFycmF5MysxOworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5M1s0ICsgMV07CisgIFNjYWxhciogYXJyYXl1bmFsaWduZWQgPSBhcnJheTMgKyAxOwogCi0gIFF1YXRlcm5pb25BICpxMSA9IDo6bmV3KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5MSkpIFF1YXRlcm5pb25BOwotICBRdWF0ZXJuaW9uVUEgKnEyID0gOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkyKSkgUXVhdGVybmlvblVBOwotICBRdWF0ZXJuaW9uVUEgKnEzID0gOjpuZXcocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXl1bmFsaWduZWQpKSBRdWF0ZXJuaW9uVUE7CisgIFF1YXRlcm5pb25BKiBxMSA9IDo6bmV3IChyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTEpKSBRdWF0ZXJuaW9uQTsKKyAgUXVhdGVybmlvblVBKiBxMiA9IDo6bmV3IChyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTIpKSBRdWF0ZXJuaW9uVUE7CisgIFF1YXRlcm5pb25VQSogcTMgPSA6Om5ldyAocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXl1bmFsaWduZWQpKSBRdWF0ZXJuaW9uVUE7CiAKICAgcTEtPmNvZWZmcygpLnNldFJhbmRvbSgpOwogICAqcTIgPSAqcTE7CkBAIC0yODMsMjQgKzI3MiwyNCBAQAogICBWRVJJRllfSVNfQVBQUk9YKHExLT5jb2VmZnMoKSwgcTMtPmNvZWZmcygpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPiB2b2lkIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKGNvbnN0IFBsYWluT2JqZWN0VHlwZSYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPgordm9pZCBjaGVja19jb25zdF9jb3JyZWN0bmVzcyhjb25zdCBQbGFpbk9iamVjdFR5cGUmKSB7CiAgIC8vIHRoZXJlJ3MgYSBsb3QgdGhhdCB3ZSBjYW4ndCB0ZXN0IGhlcmUgd2hpbGUgc3RpbGwgaGF2aW5nIHRoaXMgdGVzdCBjb21waWxlIQogICAvLyB0aGUgb25seSBwb3NzaWJsZSBhcHByb2FjaCB3b3VsZCBiZSB0byBydW4gYSBzY3JpcHQgdHJ5aW5nIHRvIGNvbXBpbGUgc3R1ZmYgYW5kIGNoZWNraW5nIHRoYXQgaXQgZmFpbHMuCiAgIC8vIENNYWtlIGNhbiBoZWxwIHdpdGggdGhhdC4KIAogICAvLyB2ZXJpZnkgdGhhdCBtYXAtdG8tY29uc3QgZG9uJ3QgaGF2ZSBMdmFsdWVCaXQKICAgdHlwZWRlZiBzdGQ6OmFkZF9jb25zdF90PFBsYWluT2JqZWN0VHlwZT4gQ29uc3RQbGFpbk9iamVjdFR5cGU7Ci0gIFZFUklGWSggIShpbnRlcm5hbDo6dHJhaXRzPE1hcDxDb25zdFBsYWluT2JqZWN0VHlwZT4gPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7Ci0gIFZFUklGWSggIShpbnRlcm5hbDo6dHJhaXRzPE1hcDxDb25zdFBsYWluT2JqZWN0VHlwZSwgQWxpZ25lZD4gPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7Ci0gIFZFUklGWSggIShNYXA8Q29uc3RQbGFpbk9iamVjdFR5cGU+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKLSAgVkVSSUZZKCAhKE1hcDxDb25zdFBsYWluT2JqZWN0VHlwZSwgQWxpZ25lZD46OkZsYWdzICYgTHZhbHVlQml0KSApOworICBWRVJJRlkoIShpbnRlcm5hbDo6dHJhaXRzPE1hcDxDb25zdFBsYWluT2JqZWN0VHlwZT4gPjo6RmxhZ3MgJiBMdmFsdWVCaXQpKTsKKyAgVkVSSUZZKCEoaW50ZXJuYWw6OnRyYWl0czxNYXA8Q29uc3RQbGFpbk9iamVjdFR5cGUsIEFsaWduZWQ+ID46OkZsYWdzICYgTHZhbHVlQml0KSk7CisgIFZFUklGWSghKE1hcDxDb25zdFBsYWluT2JqZWN0VHlwZT46OkZsYWdzICYgTHZhbHVlQml0KSk7CisgIFZFUklGWSghKE1hcDxDb25zdFBsYWluT2JqZWN0VHlwZSwgQWxpZ25lZD46OkZsYWdzICYgTHZhbHVlQml0KSk7CiB9CiAKIC8vIFJlZ3Jlc3Npb24gZm9yIGJ1ZyAxNTczCiBzdHJ1Y3QgTW92YWJsZUNsYXNzIHsKICAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGEgd29ya2Fyb3VuZCBmb3IgZ2NjIDQuNyBhbmQgNC44IChzZWUgYnVnIDE1NzMgY29tbWVudHMpLgotICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfbm90aHJvd19tb3ZlX2NvbnN0cnVjdGlibGU8UXVhdGVybmlvbmY+Ojp2YWx1ZSwiIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZTxRdWF0ZXJuaW9uZj46OnZhbHVlLCAiIik7CiAgIE1vdmFibGVDbGFzcygpID0gZGVmYXVsdDsKICAgTW92YWJsZUNsYXNzKGNvbnN0IE1vdmFibGVDbGFzcyYpID0gZGVmYXVsdDsKICAgTW92YWJsZUNsYXNzKE1vdmFibGVDbGFzcyYmKSBub2V4Y2VwdCA9IGRlZmF1bHQ7CkBAIC0zMDksMjQgKzI5OCwyMyBAQAogICBRdWF0ZXJuaW9uZiBtX3F1YXQ7CiB9OwogCi1FSUdFTl9ERUNMQVJFX1RFU1QoZ2VvX3F1YXRlcm5pb24pCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoKCBxdWF0ZXJuaW9uPGZsb2F0LEF1dG9BbGlnbj4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoUXVhdGVybmlvbmYoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSgoIHF1YXRlcm5pb248ZmxvYXQsRG9udEFsaWduPigpICkpOwotICAgIENBTExfU1VCVEVTVF8xKCggcXVhdGVybmlvbkFsaWdubWVudDxmbG9hdD4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggbWFwUXVhdGVybmlvbjxmbG9hdD4oKSApOworRUlHRU5fREVDTEFSRV9URVNUKGdlb19xdWF0ZXJuaW9uKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKChxdWF0ZXJuaW9uPGZsb2F0LCBBdXRvQWxpZ24+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShjaGVja19jb25zdF9jb3JyZWN0bmVzcyhRdWF0ZXJuaW9uZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoKHF1YXRlcm5pb248ZmxvYXQsIERvbnRBbGlnbj4oKSkpOworICAgIENBTExfU1VCVEVTVF8xKChxdWF0ZXJuaW9uQWxpZ25tZW50PGZsb2F0PigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEobWFwUXVhdGVybmlvbjxmbG9hdD4oKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfMigoIHF1YXRlcm5pb248ZG91YmxlLEF1dG9BbGlnbj4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoUXVhdGVybmlvbmQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMigoIHF1YXRlcm5pb248ZG91YmxlLERvbnRBbGlnbj4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMigoIHF1YXRlcm5pb25BbGlnbm1lbnQ8ZG91YmxlPigpICkpOwotICAgIENBTExfU1VCVEVTVF8yKCBtYXBRdWF0ZXJuaW9uPGRvdWJsZT4oKSApOworICAgIENBTExfU1VCVEVTVF8yKChxdWF0ZXJuaW9uPGRvdWJsZSwgQXV0b0FsaWduPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoUXVhdGVybmlvbmQoKSkpOworICAgIENBTExfU1VCVEVTVF8yKChxdWF0ZXJuaW9uPGRvdWJsZSwgRG9udEFsaWduPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKHF1YXRlcm5pb25BbGlnbm1lbnQ8ZG91YmxlPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIobWFwUXVhdGVybmlvbjxkb3VibGU+KCkpOwogCiAjaWZuZGVmIEVJR0VOX1RFU1RfQU5OT1lJTkdfU0NBTEFSX0RPTlRfVEhST1cKICAgICBBbm5veWluZ1NjYWxhcjo6ZG9udF90aHJvdyA9IHRydWU7CiAjZW5kaWYKLSAgICBDQUxMX1NVQlRFU1RfMygoIHF1YXRlcm5pb248QW5ub3lpbmdTY2FsYXIsQXV0b0FsaWduPigpICkpOworICAgIENBTExfU1VCVEVTVF8zKChxdWF0ZXJuaW9uPEFubm95aW5nU2NhbGFyLCBBdXRvQWxpZ24+KCkpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9nZW9fdHJhbnNmb3JtYXRpb25zLmNwcCBiL3Rlc3QvZ2VvX3RyYW5zZm9ybWF0aW9ucy5jcHAKaW5kZXggNzJjNmVkYS4uMmZkZGY1NSAxMDA2NDQKLS0tIGEvdGVzdC9nZW9fdHJhbnNmb3JtYXRpb25zLmNwcAorKysgYi90ZXN0L2dlb190cmFuc2Zvcm1hdGlvbnMuY3BwCkBAIC0xMiwzMSArMTIsMzEgQEAKICNpbmNsdWRlIDxFaWdlbi9MVT4KICNpbmNsdWRlIDxFaWdlbi9TVkQ+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1NYXRyaXg8VCwyLDE+IGFuZ2xlVG9WZWMoVCBhKQotewotICByZXR1cm4gTWF0cml4PFQsMiwxPihzdGQ6OmNvcyhhKSwgc3RkOjpzaW4oYSkpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitNYXRyaXg8VCwgMiwgMT4gYW5nbGVUb1ZlYyhUIGEpIHsKKyAgcmV0dXJuIE1hdHJpeDxULCAyLCAxPihzdGQ6OmNvcyhhKSwgc3RkOjpzaW4oYSkpOwogfQogCiAvLyBUaGlzIHBlcm1pdHMgdG8gd29ya2Fyb3VuZCBhIGJ1ZyBpbiBjbGFuZy9sbHZtIGNvZGUgZ2VuZXJhdGlvbi4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1FSUdFTl9ET05UX0lOTElORQotdm9pZCBkb250X292ZXJfb3B0aW1pemUoVCYgeCkgeyB2b2xhdGlsZSB0eXBlbmFtZSBUOjpTY2FsYXIgdG1wID0geCgwKTsgeCgwKSA9IHRtcDsgfQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGRvbnRfb3Zlcl9vcHRpbWl6ZShUJiB4KSB7CisgIHZvbGF0aWxlIHR5cGVuYW1lIFQ6OlNjYWxhciB0bXAgPSB4KDApOworICB4KDApID0gdG1wOworfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBNb2RlLCBpbnQgT3B0aW9ucz4gdm9pZCBub25fcHJvamVjdGl2ZV9vbmx5KCkKLXsKLSAgICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6Ci0gICAgIENyb3NzLmggUXVhdGVybmlvbi5oLCBUcmFuc2Zvcm0uY3BwCi0gICovCi0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjM7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+Cit2b2lkIG5vbl9wcm9qZWN0aXZlX29ubHkoKSB7CisgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKyAgIENyb3NzLmggUXVhdGVybmlvbi5oLCBUcmFuc2Zvcm0uY3BwCisqLworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDE+IFZlY3RvcjM7CiAgIHR5cGVkZWYgUXVhdGVybmlvbjxTY2FsYXI+IFF1YXRlcm5pb254OwogICB0eXBlZGVmIEFuZ2xlQXhpczxTY2FsYXI+IEFuZ2xlQXhpc3g7Ci0gIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwzLE1vZGUsT3B0aW9ucz4gVHJhbnNmb3JtMzsKLSAgdHlwZWRlZiBEaWFnb25hbE1hdHJpeDxTY2FsYXIsMz4gQWxpZ25lZFNjYWxpbmczOwotICB0eXBlZGVmIFRyYW5zbGF0aW9uPFNjYWxhciwzPiBUcmFuc2xhdGlvbjM7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwgMywgTW9kZSwgT3B0aW9ucz4gVHJhbnNmb3JtMzsKKyAgdHlwZWRlZiBEaWFnb25hbE1hdHJpeDxTY2FsYXIsIDM+IEFsaWduZWRTY2FsaW5nMzsKKyAgdHlwZWRlZiBUcmFuc2xhdGlvbjxTY2FsYXIsIDM+IFRyYW5zbGF0aW9uMzsKIAotICBWZWN0b3IzIHYwID0gVmVjdG9yMzo6UmFuZG9tKCksCi0gICAgICAgICAgdjEgPSBWZWN0b3IzOjpSYW5kb20oKTsKKyAgVmVjdG9yMyB2MCA9IFZlY3RvcjM6OlJhbmRvbSgpLCB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpOwogCiAgIFRyYW5zZm9ybTMgdDAsIHQxLCB0MjsKIApAQCAtNTQsNyArNTQsNyBAQAogICB2MCA8PCA1MCwgMiwgMTsKICAgdDAuc2NhbGUodjApOwogCi0gIFZFUklGWV9JU19BUFBST1goICh0MCAqIFZlY3RvcjMoMSwwLDApKS50ZW1wbGF0ZSBoZWFkPDM+KCkubm9ybSgpLCB2MC54KCkpOworICBWRVJJRllfSVNfQVBQUk9YKCh0MCAqIFZlY3RvcjMoMSwgMCwgMCkpLnRlbXBsYXRlIGhlYWQ8Mz4oKS5ub3JtKCksIHYwLngoKSk7CiAKICAgdDAuc2V0SWRlbnRpdHkoKTsKICAgdDEuc2V0SWRlbnRpdHkoKTsKQEAgLTcwLDcgKzcwLDcgQEAKIAogICB0MS5mcm9tUG9zaXRpb25PcmllbnRhdGlvblNjYWxlKHYwLCBxMSwgdjEpOwogICBWRVJJRllfSVNfQVBQUk9YKHQxLm1hdHJpeCgpLCB0MC5tYXRyaXgoKSk7Ci0gIFZFUklGWV9JU19BUFBST1godDEqdjEsIHQwKnYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MSAqIHYxLCB0MCAqIHYxKTsKIAogICAvLyB0cmFuc2xhdGlvbiAqIHZlY3RvcgogICB0MC5zZXRJZGVudGl0eSgpOwpAQCAtODMsNDIgKzgzLDQwIEBACiAgIFZFUklGWV9JU19BUFBST1goKHQwICogdjEpLnRlbXBsYXRlIGhlYWQ8Mz4oKSwgQWxpZ25lZFNjYWxpbmczKHYwKSAqIHYxKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+IHZvaWQgdHJhbnNmb3JtYXRpb25zKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBNb2RlLCBpbnQgT3B0aW9ucz4KK3ZvaWQgdHJhbnNmb3JtYXRpb25zKCkgewogICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CiAgICAgIENyb3NzLmggUXVhdGVybmlvbi5oLCBUcmFuc2Zvcm0uY3BwCiAgICovCi0gIHVzaW5nIHN0ZDo6Y29zOwogICB1c2luZyBzdGQ6OmFiczsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMz4gTWF0cml4MzsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQsND4gTWF0cml4NDsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDIsMT4gVmVjdG9yMjsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yMzsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQsMT4gVmVjdG9yNDsKKyAgdXNpbmcgc3RkOjpjb3M7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMz4gTWF0cml4MzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCA0LCA0PiBNYXRyaXg0OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDIsIDE+IFZlY3RvcjI7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMT4gVmVjdG9yMzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCA0LCAxPiBWZWN0b3I0OwogICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9ueDsKICAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBbmdsZUF4aXN4OwotICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsMixNb2RlLE9wdGlvbnM+IFRyYW5zZm9ybTI7Ci0gIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwzLE1vZGUsT3B0aW9ucz4gVHJhbnNmb3JtMzsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLCAyLCBNb2RlLCBPcHRpb25zPiBUcmFuc2Zvcm0yOworICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsIDMsIE1vZGUsIE9wdGlvbnM+IFRyYW5zZm9ybTM7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtMzo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOwotICB0eXBlZGVmIERpYWdvbmFsTWF0cml4PFNjYWxhciwzPiBBbGlnbmVkU2NhbGluZzM7Ci0gIHR5cGVkZWYgVHJhbnNsYXRpb248U2NhbGFyLDI+IFRyYW5zbGF0aW9uMjsKLSAgdHlwZWRlZiBUcmFuc2xhdGlvbjxTY2FsYXIsMz4gVHJhbnNsYXRpb24zOworICB0eXBlZGVmIERpYWdvbmFsTWF0cml4PFNjYWxhciwgMz4gQWxpZ25lZFNjYWxpbmczOworICB0eXBlZGVmIFRyYW5zbGF0aW9uPFNjYWxhciwgMj4gVHJhbnNsYXRpb24yOworICB0eXBlZGVmIFRyYW5zbGF0aW9uPFNjYWxhciwgMz4gVHJhbnNsYXRpb24zOwogCi0gIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwKLSAgICAgICAgICB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpOworICBWZWN0b3IzIHYwID0gVmVjdG9yMzo6UmFuZG9tKCksIHYxID0gVmVjdG9yMzo6UmFuZG9tKCk7CiAgIE1hdHJpeDMgbWF0cm90MSwgbTsKIAogICBTY2FsYXIgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKEVJR0VOX1BJKSwgU2NhbGFyKEVJR0VOX1BJKSk7CiAgIFNjYWxhciBzMCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLCBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwotICAKLSAgd2hpbGUodjAubm9ybSgpIDwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSB2MCA9IFZlY3RvcjM6OlJhbmRvbSgpOwotICB3aGlsZSh2MS5ub3JtKCkgPCB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpIHYxID0gVmVjdG9yMzo6UmFuZG9tKCk7CisKKyAgd2hpbGUgKHYwLm5vcm0oKSA8IHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkgdjAgPSBWZWN0b3IzOjpSYW5kb20oKTsKKyAgd2hpbGUgKHYxLm5vcm0oKSA8IHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkgdjEgPSBWZWN0b3IzOjpSYW5kb20oKTsKIAogICBWRVJJRllfSVNfQVBQUk9YKHYwLCBBbmdsZUF4aXN4KGEsIHYwLm5vcm1hbGl6ZWQoKSkgKiB2MCk7CiAgIFZFUklGWV9JU19BUFBST1goLXYwLCBBbmdsZUF4aXN4KFNjYWxhcihFSUdFTl9QSSksIHYwLnVuaXRPcnRob2dvbmFsKCkpICogdjApOwotICBpZihhYnMoY29zKGEpKSA+IHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkKLSAgewotICAgIFZFUklGWV9JU19BUFBST1goY29zKGEpKnYwLnNxdWFyZWROb3JtKCksIHYwLmRvdChBbmdsZUF4aXN4KGEsIHYwLnVuaXRPcnRob2dvbmFsKCkpICogdjApKTsKKyAgaWYgKGFicyhjb3MoYSkpID4gdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChjb3MoYSkgKiB2MC5zcXVhcmVkTm9ybSgpLCB2MC5kb3QoQW5nbGVBeGlzeChhLCB2MC51bml0T3J0aG9nb25hbCgpKSAqIHYwKSk7CiAgIH0KICAgbSA9IEFuZ2xlQXhpc3goYSwgdjAubm9ybWFsaXplZCgpKS50b1JvdGF0aW9uTWF0cml4KCkuYWRqb2ludCgpOwogICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeDM6OklkZW50aXR5KCksIG0gKiBBbmdsZUF4aXN4KGEsIHYwLm5vcm1hbGl6ZWQoKSkpOwpAQCAtMTI5LDQ3ICsxMjcsNDQgQEAKICAgcTIgPSBBbmdsZUF4aXN4KGEsIHYxLm5vcm1hbGl6ZWQoKSk7CiAKICAgLy8gcm90YXRpb24gbWF0cml4IGNvbnZlcnNpb24KLSAgbWF0cm90MSA9IEFuZ2xlQXhpc3goU2NhbGFyKDAuMSksIFZlY3RvcjM6OlVuaXRYKCkpCi0gICAgICAgICAgKiBBbmdsZUF4aXN4KFNjYWxhcigwLjIpLCBWZWN0b3IzOjpVbml0WSgpKQotICAgICAgICAgICogQW5nbGVBeGlzeChTY2FsYXIoMC4zKSwgVmVjdG9yMzo6VW5pdFooKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0cm90MSAqIHYxLAotICAgICAgIEFuZ2xlQXhpc3goU2NhbGFyKDAuMSksIFZlY3RvcjMoMSwwLDApKS50b1JvdGF0aW9uTWF0cml4KCkKLSAgICAqIChBbmdsZUF4aXN4KFNjYWxhcigwLjIpLCBWZWN0b3IzKDAsMSwwKSkudG9Sb3RhdGlvbk1hdHJpeCgpCi0gICAgKiAoQW5nbGVBeGlzeChTY2FsYXIoMC4zKSwgVmVjdG9yMygwLDAsMSkpLnRvUm90YXRpb25NYXRyaXgoKSAqIHYxKSkpOworICBtYXRyb3QxID0gQW5nbGVBeGlzeChTY2FsYXIoMC4xKSwgVmVjdG9yMzo6VW5pdFgoKSkgKiBBbmdsZUF4aXN4KFNjYWxhcigwLjIpLCBWZWN0b3IzOjpVbml0WSgpKSAqCisgICAgICAgICAgICBBbmdsZUF4aXN4KFNjYWxhcigwLjMpLCBWZWN0b3IzOjpVbml0WigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXRyb3QxICogdjEsIEFuZ2xlQXhpc3goU2NhbGFyKDAuMSksIFZlY3RvcjMoMSwgMCwgMCkpLnRvUm90YXRpb25NYXRyaXgoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFuZ2xlQXhpc3goU2NhbGFyKDAuMiksIFZlY3RvcjMoMCwgMSwgMCkpLnRvUm90YXRpb25NYXRyaXgoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbmdsZUF4aXN4KFNjYWxhcigwLjMpLCBWZWN0b3IzKDAsIDAsIDEpKS50b1JvdGF0aW9uTWF0cml4KCkgKiB2MSkpKTsKIAogICAvLyBhbmdsZS1heGlzIGNvbnZlcnNpb24KICAgQW5nbGVBeGlzeCBhYSA9IEFuZ2xlQXhpc3gocTEpOwogICBWRVJJRllfSVNfQVBQUk9YKHExICogdjEsIFF1YXRlcm5pb254KGFhKSAqIHYxKTsKLSAgCisKICAgLy8gVGhlIGZvbGxvd2luZyB0ZXN0IGlzIHN0YWJsZSBvbmx5IGlmIDIqYW5nbGUgIT0gYW5nbGUgYW5kIHYxIGlzIG5vdCBjb2xpbmVhciB3aXRoIGF4aXMKLSAgaWYoIChhYnMoYWEuYW5nbGUoKSkgPiB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpICYmIChhYnMoYWEuYXhpcygpLmRvdCh2MS5ub3JtYWxpemVkKCkpKTwoU2NhbGFyKDEpLVNjYWxhcig0KSp0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKSApCi0gIHsKLSAgICBWRVJJRlkoICEocTEgKiB2MSkuaXNBcHByb3goUXVhdGVybmlvbngoQW5nbGVBeGlzeChhYS5hbmdsZSgpKjIsYWEuYXhpcygpKSkgKiB2MSkgKTsKKyAgaWYgKChhYnMoYWEuYW5nbGUoKSkgPiB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpICYmCisgICAgICAoYWJzKGFhLmF4aXMoKS5kb3QodjEubm9ybWFsaXplZCgpKSkgPCAoU2NhbGFyKDEpIC0gU2NhbGFyKDQpICogdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSkpIHsKKyAgICBWRVJJRlkoIShxMSAqIHYxKS5pc0FwcHJveChRdWF0ZXJuaW9ueChBbmdsZUF4aXN4KGFhLmFuZ2xlKCkgKiAyLCBhYS5heGlzKCkpKSAqIHYxKSk7CiAgIH0KIAogICBhYS5mcm9tUm90YXRpb25NYXRyaXgoYWEudG9Sb3RhdGlvbk1hdHJpeCgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChxMSAqIHYxLCBRdWF0ZXJuaW9ueChhYSkgKiB2MSk7CiAgIC8vIFRoZSBmb2xsb3dpbmcgdGVzdCBpcyBzdGFibGUgb25seSBpZiAyKmFuZ2xlICE9IGFuZ2xlIGFuZCB2MSBpcyBub3QgY29saW5lYXIgd2l0aCBheGlzCi0gIGlmKCAoYWJzKGFhLmFuZ2xlKCkpID4gdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSAmJiAoYWJzKGFhLmF4aXMoKS5kb3QodjEubm9ybWFsaXplZCgpKSk8KFNjYWxhcigxKS1TY2FsYXIoNCkqdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSkgKQotICB7Ci0gICAgVkVSSUZZKCAhKHExICogdjEpLmlzQXBwcm94KFF1YXRlcm5pb254KEFuZ2xlQXhpc3goYWEuYW5nbGUoKSoyLGFhLmF4aXMoKSkpICogdjEpICk7CisgIGlmICgoYWJzKGFhLmFuZ2xlKCkpID4gdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSAmJgorICAgICAgKGFicyhhYS5heGlzKCkuZG90KHYxLm5vcm1hbGl6ZWQoKSkpIDwgKFNjYWxhcigxKSAtIFNjYWxhcig0KSAqIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpKSB7CisgICAgVkVSSUZZKCEocTEgKiB2MSkuaXNBcHByb3goUXVhdGVybmlvbngoQW5nbGVBeGlzeChhYS5hbmdsZSgpICogMiwgYWEuYXhpcygpKSkgKiB2MSkpOwogICB9CiAKICAgLy8gQW5nbGVBeGlzCi0gIFZFUklGWV9JU19BUFBST1goQW5nbGVBeGlzeChhLHYxLm5vcm1hbGl6ZWQoKSkudG9Sb3RhdGlvbk1hdHJpeCgpLAotICAgIFF1YXRlcm5pb254KEFuZ2xlQXhpc3goYSx2MS5ub3JtYWxpemVkKCkpKS50b1JvdGF0aW9uTWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKEFuZ2xlQXhpc3goYSwgdjEubm9ybWFsaXplZCgpKS50b1JvdGF0aW9uTWF0cml4KCksCisgICAgICAgICAgICAgICAgICAgUXVhdGVybmlvbngoQW5nbGVBeGlzeChhLCB2MS5ub3JtYWxpemVkKCkpKS50b1JvdGF0aW9uTWF0cml4KCkpOwogCiAgIEFuZ2xlQXhpc3ggYWExOwogICBtID0gcTEudG9Sb3RhdGlvbk1hdHJpeCgpOwogICBhYTEgPSBtOwotICBWRVJJRllfSVNfQVBQUk9YKEFuZ2xlQXhpc3gobSkudG9Sb3RhdGlvbk1hdHJpeCgpLAotICAgIFF1YXRlcm5pb254KG0pLnRvUm90YXRpb25NYXRyaXgoKSk7CisgIFZFUklGWV9JU19BUFBST1goQW5nbGVBeGlzeChtKS50b1JvdGF0aW9uTWF0cml4KCksIFF1YXRlcm5pb254KG0pLnRvUm90YXRpb25NYXRyaXgoKSk7CiAKICAgLy8gVHJhbnNmb3JtCiAgIC8vIFRPRE8gY29tcGxldGUgdGhlIHRlc3RzICEKICAgYSA9IDA7Ci0gIHdoaWxlIChhYnMoYSk8U2NhbGFyKDAuMSkpCi0gICAgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKDAuNCkqU2NhbGFyKEVJR0VOX1BJKSwgU2NhbGFyKDAuNCkqU2NhbGFyKEVJR0VOX1BJKSk7CisgIHdoaWxlIChhYnMoYSkgPCBTY2FsYXIoMC4xKSkKKyAgICBhID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC1TY2FsYXIoMC40KSAqIFNjYWxhcihFSUdFTl9QSSksIFNjYWxhcigwLjQpICogU2NhbGFyKEVJR0VOX1BJKSk7CiAgIHExID0gQW5nbGVBeGlzeChhLCB2MC5ub3JtYWxpemVkKCkpOwogICBUcmFuc2Zvcm0zIHQwLCB0MSwgdDI7CiAKQEAgLTE5NSwxMSArMTkwLDE0IEBACiAgIHQxLmZyb21Qb3NpdGlvbk9yaWVudGF0aW9uU2NhbGUodjAsIHExLCB2MSk7CiAgIFZFUklGWV9JU19BUFBST1godDEubWF0cml4KCksIHQwLm1hdHJpeCgpKTsKIAotICB0MC5zZXRJZGVudGl0eSgpOyB0MC5zY2FsZSh2MCkucm90YXRlKHExLnRvUm90YXRpb25NYXRyaXgoKSk7Ci0gIHQxLnNldElkZW50aXR5KCk7IHQxLnNjYWxlKHYwKS5yb3RhdGUocTEpOworICB0MC5zZXRJZGVudGl0eSgpOworICB0MC5zY2FsZSh2MCkucm90YXRlKHExLnRvUm90YXRpb25NYXRyaXgoKSk7CisgIHQxLnNldElkZW50aXR5KCk7CisgIHQxLnNjYWxlKHYwKS5yb3RhdGUocTEpOwogICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CiAKLSAgdDAuc2V0SWRlbnRpdHkoKTsgdDAuc2NhbGUodjApLnJvdGF0ZShBbmdsZUF4aXN4KHExKSk7CisgIHQwLnNldElkZW50aXR5KCk7CisgIHQwLnNjYWxlKHYwKS5yb3RhdGUoQW5nbGVBeGlzeChxMSkpOwogICBWRVJJRllfSVNfQVBQUk9YKHQwLm1hdHJpeCgpLCB0MS5tYXRyaXgoKSk7CiAKICAgVkVSSUZZX0lTX0FQUFJPWCh0MC5zY2FsZShhKS5tYXRyaXgoKSwgdDEuc2NhbGUoVmVjdG9yMzo6Q29uc3RhbnQoYSkpLm1hdHJpeCgpKTsKQEAgLTIwOSwxMCArMjA3LDkgQEAKIAogICBNYXRyaXgzIG1hdDMgPSBNYXRyaXgzOjpSYW5kb20oKTsKICAgTWF0cml4NCBtYXQ0OwotICBtYXQ0IDw8IG1hdDMgLCBWZWN0b3IzOjpaZXJvKCkgLCBWZWN0b3I0OjpaZXJvKCkudHJhbnNwb3NlKCk7CisgIG1hdDQgPDwgbWF0MywgVmVjdG9yMzo6WmVybygpLCBWZWN0b3I0OjpaZXJvKCkudHJhbnNwb3NlKCk7CiAgIFRyYW5zZm9ybTMgdG1hdDMobWF0MyksIHRtYXQ0KG1hdDQpOwotICBpZihNb2RlIT1pbnQoQWZmaW5lQ29tcGFjdCkpCi0gICAgdG1hdDQubWF0cml4KCkoMywzKSA9IFNjYWxhcigxKTsKKyAgaWYgKE1vZGUgIT0gaW50KEFmZmluZUNvbXBhY3QpKSB0bWF0NC5tYXRyaXgoKSgzLCAzKSA9IFNjYWxhcigxKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh0bWF0My5tYXRyaXgoKSwgdG1hdDQubWF0cml4KCkpOwogCiAgIFNjYWxhciBhMyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtU2NhbGFyKEVJR0VOX1BJKSwgU2NhbGFyKEVJR0VOX1BJKSk7CkBAIC0yMjIsNyArMjE5LDcgQEAKICAgVHJhbnNmb3JtMyB0NDsKICAgdDQgPSBhYTM7CiAgIFZFUklGWV9JU19BUFBST1godDMubWF0cml4KCksIHQ0Lm1hdHJpeCgpKTsKLSAgdDQucm90YXRlKEFuZ2xlQXhpc3goLWEzLHYzKSk7CisgIHQ0LnJvdGF0ZShBbmdsZUF4aXN4KC1hMywgdjMpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh0NC5tYXRyaXgoKSwgTWF0cml4VHlwZTo6SWRlbnRpdHkoKSk7CiAgIHQ0ICo9IGFhMzsKICAgVkVSSUZZX0lTX0FQUFJPWCh0My5tYXRyaXgoKSwgdDQubWF0cml4KCkpOwpAQCAtMjMwLDcgKzIyNyw3IEBACiAgIGRvIHsKICAgICB2MyA9IFZlY3RvcjM6OlJhbmRvbSgpOwogICAgIGRvbnRfb3Zlcl9vcHRpbWl6ZSh2Myk7Ci0gIH0gd2hpbGUgKHYzLmN3aXNlQWJzKCkubWluQ29lZmYoKTxOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKTsKKyAgfSB3aGlsZSAodjMuY3dpc2VBYnMoKS5taW5Db2VmZigpIDwgTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSk7CiAgIFRyYW5zbGF0aW9uMyB0djModjMpOwogICBUcmFuc2Zvcm0zIHQ1KHR2Myk7CiAgIHQ0ID0gdHYzOwpAQCAtMjUwLDMxICsyNDcsMzEgQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh0Ni5tYXRyaXgoKSwgdDQubWF0cml4KCkpOwogCiAgIC8vIG1hdHJpeCAqIHRyYW5zZm9ybQotICBWRVJJRllfSVNfQVBQUk9YKCh0My5tYXRyaXgoKSp0NCkubWF0cml4KCksICh0Myp0NCkubWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKCh0My5tYXRyaXgoKSAqIHQ0KS5tYXRyaXgoKSwgKHQzICogdDQpLm1hdHJpeCgpKTsKIAogICAvLyBjaGFpbmVkIFRyYW5zZm9ybSBwcm9kdWN0Ci0gIFZFUklGWV9JU19BUFBST1goKCh0Myp0NCkqdDUpLm1hdHJpeCgpLCAodDMqKHQ0KnQ1KSkubWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKCgodDMgKiB0NCkgKiB0NSkubWF0cml4KCksICh0MyAqICh0NCAqIHQ1KSkubWF0cml4KCkpOwogCiAgIC8vIGNoZWNrIHRoYXQgVHJhbnNmb3JtIHByb2R1Y3QgZG9lc24ndCBoYXZlIGFsaWFzaW5nIHByb2JsZW1zCiAgIHQ1ID0gdDQ7Ci0gIHQ1ID0gdDUqdDU7Ci0gIFZFUklGWV9JU19BUFBST1godDUsIHQ0KnQ0KTsKKyAgdDUgPSB0NSAqIHQ1OworICBWRVJJRllfSVNfQVBQUk9YKHQ1LCB0NCAqIHQ0KTsKIAogICAvLyAyRCB0cmFuc2Zvcm1hdGlvbgogICBUcmFuc2Zvcm0yIHQyMCwgdDIxOwogICBWZWN0b3IyIHYyMCA9IFZlY3RvcjI6OlJhbmRvbSgpOwogICBWZWN0b3IyIHYyMSA9IFZlY3RvcjI6OlJhbmRvbSgpOwotICBmb3IgKGludCBrPTA7IGs8MjsgKytrKQotICAgIGlmIChhYnModjIxW2tdKTxTY2FsYXIoMWUtMykpIHYyMVtrXSA9IFNjYWxhcigxZS0zKTsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spCisgICAgaWYgKGFicyh2MjFba10pIDwgU2NhbGFyKDFlLTMpKSB2MjFba10gPSBTY2FsYXIoMWUtMyk7CiAgIHQyMS5zZXRJZGVudGl0eSgpOwogICB0MjEubGluZWFyKCkgPSBSb3RhdGlvbjJEPFNjYWxhcj4oYSkudG9Sb3RhdGlvbk1hdHJpeCgpOwotICBWRVJJRllfSVNfQVBQUk9YKHQyMC5mcm9tUG9zaXRpb25PcmllbnRhdGlvblNjYWxlKHYyMCxhLHYyMSkubWF0cml4KCksCi0gICAgdDIxLnByZXRyYW5zbGF0ZSh2MjApLnNjYWxlKHYyMSkubWF0cml4KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHQyMC5mcm9tUG9zaXRpb25PcmllbnRhdGlvblNjYWxlKHYyMCwgYSwgdjIxKS5tYXRyaXgoKSwgdDIxLnByZXRyYW5zbGF0ZSh2MjApLnNjYWxlKHYyMSkubWF0cml4KCkpOwogCiAgIHQyMS5zZXRJZGVudGl0eSgpOwogICB0MjEubGluZWFyKCkgPSBSb3RhdGlvbjJEPFNjYWxhcj4oLWEpLnRvUm90YXRpb25NYXRyaXgoKTsKLSAgVkVSSUZZKCAodDIwLmZyb21Qb3NpdGlvbk9yaWVudGF0aW9uU2NhbGUodjIwLGEsdjIxKQotICAgICAgICAqICh0MjEucHJlc2NhbGUodjIxLmN3aXNlSW52ZXJzZSgpKS50cmFuc2xhdGUoLXYyMCkpKS5tYXRyaXgoKS5pc0lkZW50aXR5KHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkgKTsKKyAgVkVSSUZZKCh0MjAuZnJvbVBvc2l0aW9uT3JpZW50YXRpb25TY2FsZSh2MjAsIGEsIHYyMSkgKiAodDIxLnByZXNjYWxlKHYyMS5jd2lzZUludmVyc2UoKSkudHJhbnNsYXRlKC12MjApKSkKKyAgICAgICAgICAgICAubWF0cml4KCkKKyAgICAgICAgICAgICAuaXNJZGVudGl0eSh0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKIAogICAvLyBUcmFuc2Zvcm0gLSBuZXcgQVBJCiAgIC8vIDNECkBAIC0yOTEsNyArMjg4LDYgQEAKICAgdDEgPSBNYXRyaXgzKHExKSAqIChBbGlnbmVkU2NhbGluZzModjApICogVHJhbnNsYXRpb24zKHYwKSk7CiAgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKIAotCiAgIHQwLnNldElkZW50aXR5KCk7CiAgIHQwLnNjYWxlKHMwKS50cmFuc2xhdGUodjApOwogICB0MSA9IEVpZ2VuOjpTY2FsaW5nKHMwKSAqIFRyYW5zbGF0aW9uMyh2MCk7CkBAIC0yOTksMTMgKzI5NSwxMyBAQAogICB0MC5wcmVzY2FsZShzMCk7CiAgIHQxID0gRWlnZW46OlNjYWxpbmcoczApICogdDE7CiAgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKLSAgCisKICAgdDAgPSB0MzsKICAgdDAuc2NhbGUoczApOwotICB0MSA9IHQzICogRWlnZW46OlNjYWxpbmcoczAsczAsczApOworICB0MSA9IHQzICogRWlnZW46OlNjYWxpbmcoczAsIHMwLCBzMCk7CiAgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKICAgdDAucHJlc2NhbGUoczApOwotICB0MSA9IEVpZ2VuOjpTY2FsaW5nKHMwLHMwLHMwKSAqIHQxOworICB0MSA9IEVpZ2VuOjpTY2FsaW5nKHMwLCBzMCwgczApICogdDE7CiAgIFZFUklGWV9JU19BUFBST1godDAubWF0cml4KCksIHQxLm1hdHJpeCgpKTsKIAogICB0MCA9IHQzOwpAQCAtMzgxLDE1OSArMzc3LDE1NiBAQAogICB0MC50cmFuc2xhdGUodjApOwogICBkbyB7CiAgICAgdDAubGluZWFyKCkuc2V0UmFuZG9tKCk7Ci0gIH0gd2hpbGUodDAubGluZWFyKCkuamFjb2JpU3ZkKCkuc2luZ3VsYXJWYWx1ZXMoKSgyKTx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpOworICB9IHdoaWxlICh0MC5saW5lYXIoKS5qYWNvYmlTdmQoKS5zaW5ndWxhclZhbHVlcygpKDIpIDwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKTsKICAgTWF0cml4NCB0MDQ0ID0gTWF0cml4NDo6WmVybygpOwotICB0MDQ0KDMsMykgPSAxOwotICB0MDQ0LmJsb2NrKDAsMCx0MC5tYXRyaXgoKS5yb3dzKCksNCkgPSB0MC5tYXRyaXgoKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh0MC5pbnZlcnNlKEFmZmluZSkubWF0cml4KCksIHQwNDQuaW52ZXJzZSgpLmJsb2NrKDAsMCx0MC5tYXRyaXgoKS5yb3dzKCksNCkpOworICB0MDQ0KDMsIDMpID0gMTsKKyAgdDA0NC5ibG9jaygwLCAwLCB0MC5tYXRyaXgoKS5yb3dzKCksIDQpID0gdDAubWF0cml4KCk7CisgIFZFUklGWV9JU19BUFBST1godDAuaW52ZXJzZShBZmZpbmUpLm1hdHJpeCgpLCB0MDQ0LmludmVyc2UoKS5ibG9jaygwLCAwLCB0MC5tYXRyaXgoKS5yb3dzKCksIDQpKTsKICAgdDAuc2V0SWRlbnRpdHkoKTsKICAgdDAudHJhbnNsYXRlKHYwKS5yb3RhdGUocTEpOwogICB0MDQ0ID0gTWF0cml4NDo6WmVybygpOwotICB0MDQ0KDMsMykgPSAxOwotICB0MDQ0LmJsb2NrKDAsMCx0MC5tYXRyaXgoKS5yb3dzKCksNCkgPSB0MC5tYXRyaXgoKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh0MC5pbnZlcnNlKElzb21ldHJ5KS5tYXRyaXgoKSwgdDA0NC5pbnZlcnNlKCkuYmxvY2soMCwwLHQwLm1hdHJpeCgpLnJvd3MoKSw0KSk7CisgIHQwNDQoMywgMykgPSAxOworICB0MDQ0LmJsb2NrKDAsIDAsIHQwLm1hdHJpeCgpLnJvd3MoKSwgNCkgPSB0MC5tYXRyaXgoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MC5pbnZlcnNlKElzb21ldHJ5KS5tYXRyaXgoKSwgdDA0NC5pbnZlcnNlKCkuYmxvY2soMCwgMCwgdDAubWF0cml4KCkucm93cygpLCA0KSk7CiAKICAgTWF0cml4MyBtYXRfcm90YXRpb24sIG1hdF9zY2FsaW5nOwogICB0MC5zZXRJZGVudGl0eSgpOwogICB0MC50cmFuc2xhdGUodjApLnJvdGF0ZShxMSkuc2NhbGUodjEpOwogICB0MC5jb21wdXRlUm90YXRpb25TY2FsaW5nKCZtYXRfcm90YXRpb24sICZtYXRfc2NhbGluZyk7CiAgIFZFUklGWV9JU19BUFBST1godDAubGluZWFyKCksIG1hdF9yb3RhdGlvbiAqIG1hdF9zY2FsaW5nKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXRfcm90YXRpb24qbWF0X3JvdGF0aW9uLmFkam9pbnQoKSwgTWF0cml4Mzo6SWRlbnRpdHkoKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0X3JvdGF0aW9uICogbWF0X3JvdGF0aW9uLmFkam9pbnQoKSwgTWF0cml4Mzo6SWRlbnRpdHkoKSk7CiAgIFZFUklGWV9JU19BUFBST1gobWF0X3JvdGF0aW9uLmRldGVybWluYW50KCksIFNjYWxhcigxKSk7CiAgIHQwLmNvbXB1dGVTY2FsaW5nUm90YXRpb24oJm1hdF9zY2FsaW5nLCAmbWF0X3JvdGF0aW9uKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh0MC5saW5lYXIoKSwgbWF0X3NjYWxpbmcgKiBtYXRfcm90YXRpb24pOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdF9yb3RhdGlvbiptYXRfcm90YXRpb24uYWRqb2ludCgpLCBNYXRyaXgzOjpJZGVudGl0eSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXRfcm90YXRpb24gKiBtYXRfcm90YXRpb24uYWRqb2ludCgpLCBNYXRyaXgzOjpJZGVudGl0eSgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtYXRfcm90YXRpb24uZGV0ZXJtaW5hbnQoKSwgU2NhbGFyKDEpKTsKIAogICAvLyB0ZXN0IGNhc3RpbmcKLSAgVHJhbnNmb3JtPGZsb2F0LDMsTW9kZT4gdDFmID0gdDEudGVtcGxhdGUgY2FzdDxmbG9hdD4oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh0MWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksdDEpOwotICBUcmFuc2Zvcm08ZG91YmxlLDMsTW9kZT4gdDFkID0gdDEudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7Ci0gIFZFUklGWV9JU19BUFBST1godDFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHQxKTsKKyAgVHJhbnNmb3JtPGZsb2F0LCAzLCBNb2RlPiB0MWYgPSB0MS50ZW1wbGF0ZSBjYXN0PGZsb2F0PigpOworICBWRVJJRllfSVNfQVBQUk9YKHQxZi50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSwgdDEpOworICBUcmFuc2Zvcm08ZG91YmxlLCAzLCBNb2RlPiB0MWQgPSB0MS50ZW1wbGF0ZSBjYXN0PGRvdWJsZT4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0MWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksIHQxKTsKIAogICBUcmFuc2xhdGlvbjMgdHIxKHYwKTsKLSAgVHJhbnNsYXRpb248ZmxvYXQsMz4gdHIxZiA9IHRyMS50ZW1wbGF0ZSBjYXN0PGZsb2F0PigpOwotICBWRVJJRllfSVNfQVBQUk9YKHRyMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksdHIxKTsKLSAgVHJhbnNsYXRpb248ZG91YmxlLDM+IHRyMWQgPSB0cjEudGVtcGxhdGUgY2FzdDxkb3VibGU+KCk7Ci0gIFZFUklGWV9JU19BUFBST1godHIxZC50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSx0cjEpOworICBUcmFuc2xhdGlvbjxmbG9hdCwgMz4gdHIxZiA9IHRyMS50ZW1wbGF0ZSBjYXN0PGZsb2F0PigpOworICBWRVJJRllfSVNfQVBQUk9YKHRyMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksIHRyMSk7CisgIFRyYW5zbGF0aW9uPGRvdWJsZSwgMz4gdHIxZCA9IHRyMS50ZW1wbGF0ZSBjYXN0PGRvdWJsZT4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh0cjFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLCB0cjEpOwogCiAgIEFuZ2xlQXhpczxmbG9hdD4gYWExZiA9IGFhMS50ZW1wbGF0ZSBjYXN0PGZsb2F0PigpOwotICBWRVJJRllfSVNfQVBQUk9YKGFhMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksYWExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYTFmLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLCBhYTEpOwogICBBbmdsZUF4aXM8ZG91YmxlPiBhYTFkID0gYWExLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOwotICBWRVJJRllfSVNfQVBQUk9YKGFhMWQudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksYWExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYTFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLCBhYTEpOwogCiAgIFJvdGF0aW9uMkQ8U2NhbGFyPiByMmQxKGludGVybmFsOjpyYW5kb208U2NhbGFyPigpKTsKICAgUm90YXRpb24yRDxmbG9hdD4gcjJkMWYgPSByMmQxLnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCk7Ci0gIFZFUklGWV9JU19BUFBST1gocjJkMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCkscjJkMSk7CisgIFZFUklGWV9JU19BUFBST1gocjJkMWYudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksIHIyZDEpOwogICBSb3RhdGlvbjJEPGRvdWJsZT4gcjJkMWQgPSByMmQxLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOwotICBWRVJJRllfSVNfQVBQUk9YKHIyZDFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLHIyZDEpOwotICAKLSAgZm9yKGludCBrPTA7IGs8MTAwOyArK2spCi0gIHsKLSAgICBTY2FsYXIgYW5nbGUgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTEwMCwxMDApOwotICAgIFJvdGF0aW9uMkQ8U2NhbGFyPiByb3QyKGFuZ2xlKTsKLSAgICBWRVJJRlkoIHJvdDIuc21hbGxlc3RQb3NpdGl2ZUFuZ2xlKCkgPj0gMCApOwotICAgIFZFUklGWSggcm90Mi5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSA8PSBTY2FsYXIoMikqU2NhbGFyKEVJR0VOX1BJKSApOwotICAgIFZFUklGWV9JU19BUFBST1goIGFuZ2xlVG9WZWMocm90Mi5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSksIGFuZ2xlVG9WZWMocm90Mi5hbmdsZSgpKSApOwotICAgIAotICAgIFZFUklGWSggcm90Mi5zbWFsbGVzdEFuZ2xlKCkgPj0gLVNjYWxhcihFSUdFTl9QSSkgKTsKLSAgICBWRVJJRlkoIHJvdDIuc21hbGxlc3RBbmdsZSgpIDw9ICBTY2FsYXIoRUlHRU5fUEkpICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggYW5nbGVUb1ZlYyhyb3QyLnNtYWxsZXN0QW5nbGUoKSksIGFuZ2xlVG9WZWMocm90Mi5hbmdsZSgpKSApOworICBWRVJJRllfSVNfQVBQUk9YKHIyZDFkLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLCByMmQxKTsKIAotICAgIE1hdHJpeDxTY2FsYXIsMiwyPiByb3QyX2FzX21hdChyb3QyKTsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCAxMDA7ICsraykgeworICAgIFNjYWxhciBhbmdsZSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMTAwLCAxMDApOworICAgIFJvdGF0aW9uMkQ8U2NhbGFyPiByb3QyKGFuZ2xlKTsKKyAgICBWRVJJRlkocm90Mi5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSA+PSAwKTsKKyAgICBWRVJJRlkocm90Mi5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSA8PSBTY2FsYXIoMikgKiBTY2FsYXIoRUlHRU5fUEkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGFuZ2xlVG9WZWMocm90Mi5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSksIGFuZ2xlVG9WZWMocm90Mi5hbmdsZSgpKSk7CisKKyAgICBWRVJJRlkocm90Mi5zbWFsbGVzdEFuZ2xlKCkgPj0gLVNjYWxhcihFSUdFTl9QSSkpOworICAgIFZFUklGWShyb3QyLnNtYWxsZXN0QW5nbGUoKSA8PSBTY2FsYXIoRUlHRU5fUEkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGFuZ2xlVG9WZWMocm90Mi5zbWFsbGVzdEFuZ2xlKCkpLCBhbmdsZVRvVmVjKHJvdDIuYW5nbGUoKSkpOworCisgICAgTWF0cml4PFNjYWxhciwgMiwgMj4gcm90Ml9hc19tYXQocm90Mik7CiAgICAgUm90YXRpb24yRDxTY2FsYXI+IHJvdDMocm90Ml9hc19tYXQpOwotICAgIFZFUklGWV9JU19BUFBST1goIGFuZ2xlVG9WZWMocm90Mi5zbWFsbGVzdEFuZ2xlKCkpLCAgYW5nbGVUb1ZlYyhyb3QzLmFuZ2xlKCkpICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChhbmdsZVRvVmVjKHJvdDIuc21hbGxlc3RBbmdsZSgpKSwgYW5nbGVUb1ZlYyhyb3QzLmFuZ2xlKCkpKTsKICAgfQogCi0gIHMwID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC0xMDAsMTAwKTsKLSAgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTEwMCwxMDApOworICBzMCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMTAwLCAxMDApOworICBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMTAwLCAxMDApOwogICBSb3RhdGlvbjJEPFNjYWxhcj4gUjAoczApLCBSMShzMSk7Ci0gIAorCiAgIHQyMCA9IFRyYW5zbGF0aW9uMih2MjApICogKFIwICogRWlnZW46OlNjYWxpbmcoczApKTsKICAgdDIxID0gVHJhbnNsYXRpb24yKHYyMCkgKiBSMCAqIEVpZ2VuOjpTY2FsaW5nKHMwKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh0MjAsdDIxKTsKLSAgCisgIFZFUklGWV9JU19BUFBST1godDIwLCB0MjEpOworCiAgIHQyMCA9IFRyYW5zbGF0aW9uMih2MjApICogKFIwICogUjAuaW52ZXJzZSgpICogRWlnZW46OlNjYWxpbmcoczApKTsKICAgdDIxID0gVHJhbnNsYXRpb24yKHYyMCkgKiBFaWdlbjo6U2NhbGluZyhzMCk7Ci0gIFZFUklGWV9JU19BUFBST1godDIwLHQyMSk7Ci0gIAorICBWRVJJRllfSVNfQVBQUk9YKHQyMCwgdDIxKTsKKwogICBWRVJJRllfSVNfQVBQUk9YKHMwLCAoUjAuc2xlcnAoMCwgUjEpKS5hbmdsZSgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggYW5nbGVUb1ZlYyhSMS5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSksIGFuZ2xlVG9WZWMoKFIwLnNsZXJwKDEsIFIxKSkuc21hbGxlc3RQb3NpdGl2ZUFuZ2xlKCkpICk7CisgIFZFUklGWV9JU19BUFBST1goYW5nbGVUb1ZlYyhSMS5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSksIGFuZ2xlVG9WZWMoKFIwLnNsZXJwKDEsIFIxKSkuc21hbGxlc3RQb3NpdGl2ZUFuZ2xlKCkpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChSMC5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSwgKFIwLnNsZXJwKDAuNSwgUjApKS5zbWFsbGVzdFBvc2l0aXZlQW5nbGUoKSk7CiAKLSAgaWYoc3RkOjpjb3MoczApPjApCisgIGlmIChzdGQ6OmNvcyhzMCkgPiAwKQogICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTigoUjAuc2xlcnAoMC41LCBSMC5pbnZlcnNlKCkpKS5zbWFsbGVzdEFuZ2xlKCksIFNjYWxhcigxKSk7CiAgIGVsc2UKICAgICBWRVJJRllfSVNfQVBQUk9YKFNjYWxhcihFSUdFTl9QSSksIChSMC5zbGVycCgwLjUsIFIwLmludmVyc2UoKSkpLnNtYWxsZXN0UG9zaXRpdmVBbmdsZSgpKTsKLSAgCisKICAgLy8gQ2hlY2sgcGF0aCBsZW5ndGgKICAgU2NhbGFyIGwgPSAwOwogICBpbnQgcGF0aF9zdGVwcyA9IDEwMDsKLSAgZm9yKGludCBrPTA7IGs8cGF0aF9zdGVwczsgKytrKQotICB7Ci0gICAgU2NhbGFyIGExID0gUjAuc2xlcnAoU2NhbGFyKGspL1NjYWxhcihwYXRoX3N0ZXBzKSwgUjEpLmFuZ2xlKCk7Ci0gICAgU2NhbGFyIGEyID0gUjAuc2xlcnAoU2NhbGFyKGsrMSkvU2NhbGFyKHBhdGhfc3RlcHMpLCBSMSkuYW5nbGUoKTsKLSAgICBsICs9IHN0ZDo6YWJzKGEyLWExKTsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBwYXRoX3N0ZXBzOyArK2spIHsKKyAgICBTY2FsYXIgYTEgPSBSMC5zbGVycChTY2FsYXIoaykgLyBTY2FsYXIocGF0aF9zdGVwcyksIFIxKS5hbmdsZSgpOworICAgIFNjYWxhciBhMiA9IFIwLnNsZXJwKFNjYWxhcihrICsgMSkgLyBTY2FsYXIocGF0aF9zdGVwcyksIFIxKS5hbmdsZSgpOworICAgIGwgKz0gc3RkOjphYnMoYTIgLSBhMSk7CiAgIH0KLSAgVkVSSUZZKGw8PVNjYWxhcihFSUdFTl9QSSkqKFNjYWxhcigxKStOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpKlNjYWxhcihwYXRoX3N0ZXBzLzIpKSk7Ci0gIAorICBWRVJJRlkobCA8PSBTY2FsYXIoRUlHRU5fUEkpICogKFNjYWxhcigxKSArIE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCkgKiBTY2FsYXIocGF0aF9zdGVwcyAvIDIpKSk7CisKICAgLy8gY2hlY2sgYmFzaWMgZmVhdHVyZXMKICAgewotICAgIFJvdGF0aW9uMkQ8U2NhbGFyPiByMTsgICAgICAgICAgIC8vIGRlZmF1bHQgY3RvcgotICAgIHIxID0gUm90YXRpb24yRDxTY2FsYXI+KHMwKTsgICAgIC8vIGNvcHkgYXNzaWdubWVudAotICAgIFZFUklGWV9JU19BUFBST1gocjEuYW5nbGUoKSxzMCk7Ci0gICAgUm90YXRpb24yRDxTY2FsYXI+IHIyKHIxKTsgICAgICAgLy8gY29weSBjdG9yCi0gICAgVkVSSUZZX0lTX0FQUFJPWChyMi5hbmdsZSgpLHMwKTsKKyAgICBSb3RhdGlvbjJEPFNjYWxhcj4gcjE7ICAgICAgICAvLyBkZWZhdWx0IGN0b3IKKyAgICByMSA9IFJvdGF0aW9uMkQ8U2NhbGFyPihzMCk7ICAvLyBjb3B5IGFzc2lnbm1lbnQKKyAgICBWRVJJRllfSVNfQVBQUk9YKHIxLmFuZ2xlKCksIHMwKTsKKyAgICBSb3RhdGlvbjJEPFNjYWxhcj4gcjIocjEpOyAgLy8gY29weSBjdG9yCisgICAgVkVSSUZZX0lTX0FQUFJPWChyMi5hbmdsZSgpLCBzMCk7CiAgIH0KIAogICB7CiAgICAgVHJhbnNmb3JtMyB0MzIoTWF0cml4NDo6UmFuZG9tKCkpLCB0MzMsIHQzNDsKICAgICB0MzQgPSB0MzMgPSB0MzI7CiAgICAgdDMyLnNjYWxlKHYwKTsKLSAgICB0MzMqPUFsaWduZWRTY2FsaW5nMyh2MCk7CisgICAgdDMzICo9IEFsaWduZWRTY2FsaW5nMyh2MCk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWCh0MzIubWF0cml4KCksIHQzMy5tYXRyaXgoKSk7CiAgICAgdDMzID0gdDM0ICogQWxpZ25lZFNjYWxpbmczKHYwKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHQzMi5tYXRyaXgoKSwgdDMzLm1hdHJpeCgpKTsKICAgfQotCiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgUCwgdHlwZW5hbWUgUSwgdHlwZW5hbWUgViwgdHlwZW5hbWUgSD4KLXZvaWQgdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHlfbGVmdChjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgUCYgcCwgY29uc3QgUSYgcSwgY29uc3QgViYgdiwgY29uc3QgSCYgaCkKLXsKLSAgVkVSSUZZX0lTX0FQUFJPWCggcSooYTEqdiksIChxKmExKSp2ICk7Ci0gIFZFUklGWV9JU19BUFBST1goIHEqKGEyKnYpLCAocSphMikqdiApOwotICBWRVJJRllfSVNfQVBQUk9YKCBxKihwKmgpLmhub3JtYWxpemVkKCksICAoKHEqcCkqaCkuaG5vcm1hbGl6ZWQoKSApOwordGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgUCwgdHlwZW5hbWUgUSwgdHlwZW5hbWUgViwgdHlwZW5hbWUgSD4KK3ZvaWQgdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHlfbGVmdChjb25zdCBBMSYgYTEsIGNvbnN0IEEyJiBhMiwgY29uc3QgUCYgcCwgY29uc3QgUSYgcSwgY29uc3QgViYgdiwgY29uc3QgSCYgaCkgeworICBWRVJJRllfSVNfQVBQUk9YKHEgKiAoYTEgKiB2KSwgKHEgKiBhMSkgKiB2KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxICogKGEyICogdiksIChxICogYTIpICogdik7CisgIFZFUklGWV9JU19BUFBST1gocSAqIChwICogaCkuaG5vcm1hbGl6ZWQoKSwgKChxICogcCkgKiBoKS5obm9ybWFsaXplZCgpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBQLCB0eXBlbmFtZSBRLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBIPgotdm9pZCB0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eTIoY29uc3QgQTEmIGExLCBjb25zdCBBMiYgYTIsIGNvbnN0IFAmIHAsIGNvbnN0IFEmIHEsIGNvbnN0IFYmIHYsIGNvbnN0IEgmIGgpCi17Ci0gIFZFUklGWV9JU19BUFBST1goIGExKihxKnYpLCAoYTEqcSkqdiApOwotICBWRVJJRllfSVNfQVBQUk9YKCBhMioocSp2KSwgKGEyKnEpKnYgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggcCAqKHEqdikuaG9tb2dlbmVvdXMoKSwgKHAgKnEpKnYuaG9tb2dlbmVvdXMoKSApOwordGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgUCwgdHlwZW5hbWUgUSwgdHlwZW5hbWUgViwgdHlwZW5hbWUgSD4KK3ZvaWQgdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHkyKGNvbnN0IEExJiBhMSwgY29uc3QgQTImIGEyLCBjb25zdCBQJiBwLCBjb25zdCBRJiBxLCBjb25zdCBWJiB2LCBjb25zdCBIJiBoKSB7CisgIFZFUklGWV9JU19BUFBST1goYTEgKiAocSAqIHYpLCAoYTEgKiBxKSAqIHYpOworICBWRVJJRllfSVNfQVBQUk9YKGEyICogKHEgKiB2KSwgKGEyICogcSkgKiB2KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChwICogKHEgKiB2KS5ob21vZ2VuZW91cygpLCAocCAqIHEpICogdi5ob21vZ2VuZW91cygpKTsKIAotICB0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eV9sZWZ0KGExLCBhMixwLCBxLCB2LCBoKTsKKyAgdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHlfbGVmdChhMSwgYTIsIHAsIHEsIHYsIGgpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0sIGludCBPcHRpb25zLHR5cGVuYW1lIFJvdGF0aW9uVHlwZT4KLXZvaWQgdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHkoY29uc3QgUm90YXRpb25UeXBlJiBSKQotewotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRGltLDE+IFZlY3RvclR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0rMSwxPiBIVmVjdG9yVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLERpbSxEaW0+IExpbmVhclR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEaW0rMSxEaW0rMT4gTWF0cml4VHlwZTsKLSAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxBZmZpbmVDb21wYWN0LE9wdGlvbnM+IEFmZmluZUNvbXBhY3RUeXBlOwotICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLEFmZmluZSxPcHRpb25zPiBBZmZpbmVUeXBlOwotICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsRGltLFByb2plY3RpdmUsT3B0aW9ucz4gUHJvamVjdGl2ZVR5cGU7Ci0gIHR5cGVkZWYgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLERpbT4gU2NhbGluZ1R5cGU7Ci0gIHR5cGVkZWYgVHJhbnNsYXRpb248U2NhbGFyLERpbT4gVHJhbnNsYXRpb25UeXBlOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbSwgaW50IE9wdGlvbnMsIHR5cGVuYW1lIFJvdGF0aW9uVHlwZT4KK3ZvaWQgdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHkoY29uc3QgUm90YXRpb25UeXBlJiBSKSB7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRGltLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERpbSArIDEsIDE+IEhWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERpbSwgRGltPiBMaW5lYXJUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERpbSArIDEsIERpbSArIDE+IE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwgRGltLCBBZmZpbmVDb21wYWN0LCBPcHRpb25zPiBBZmZpbmVDb21wYWN0VHlwZTsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLCBEaW0sIEFmZmluZSwgT3B0aW9ucz4gQWZmaW5lVHlwZTsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLCBEaW0sIFByb2plY3RpdmUsIE9wdGlvbnM+IFByb2plY3RpdmVUeXBlOworICB0eXBlZGVmIERpYWdvbmFsTWF0cml4PFNjYWxhciwgRGltPiBTY2FsaW5nVHlwZTsKKyAgdHlwZWRlZiBUcmFuc2xhdGlvbjxTY2FsYXIsIERpbT4gVHJhbnNsYXRpb25UeXBlOwogCi0gIEFmZmluZUNvbXBhY3RUeXBlIEExYzsgQTFjLm1hdHJpeCgpLnNldFJhbmRvbSgpOwotICBBZmZpbmVDb21wYWN0VHlwZSBBMmM7IEEyYy5tYXRyaXgoKS5zZXRSYW5kb20oKTsKKyAgQWZmaW5lQ29tcGFjdFR5cGUgQTFjOworICBBMWMubWF0cml4KCkuc2V0UmFuZG9tKCk7CisgIEFmZmluZUNvbXBhY3RUeXBlIEEyYzsKKyAgQTJjLm1hdHJpeCgpLnNldFJhbmRvbSgpOwogICBBZmZpbmVUeXBlIEExKEExYyk7CiAgIEFmZmluZVR5cGUgQTIoQTJjKTsKLSAgUHJvamVjdGl2ZVR5cGUgUDE7IFAxLm1hdHJpeCgpLnNldFJhbmRvbSgpOworICBQcm9qZWN0aXZlVHlwZSBQMTsKKyAgUDEubWF0cml4KCkuc2V0UmFuZG9tKCk7CiAgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20oKTsKICAgVmVjdG9yVHlwZSB2MiA9IFZlY3RvclR5cGU6OlJhbmRvbSgpOwogICBIVmVjdG9yVHlwZSBoMSA9IEhWZWN0b3JUeXBlOjpSYW5kb20oKTsKQEAgLTU0MSw4NyArNTM0LDg5IEBACiAgIExpbmVhclR5cGUgTCA9IExpbmVhclR5cGU6OlJhbmRvbSgpOwogICBNYXRyaXhUeXBlIE0gPSBNYXRyaXhUeXBlOjpSYW5kb20oKTsKIAotICBDQUxMX1NVQlRFU1QoIHRyYW5zZm9ybV9hc3NvY2lhdGl2aXR5MihBMWMsIEExLCBQMSwgQTIsIHYyLCBoMSkgKTsKLSAgQ0FMTF9TVUJURVNUKCB0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eTIoQTFjLCBBMSwgUDEsIEEyYywgdjIsIGgxKSApOwotICBDQUxMX1NVQlRFU1QoIHRyYW5zZm9ybV9hc3NvY2lhdGl2aXR5MihBMWMsIEExLCBQMSwgdjEuYXNEaWFnb25hbCgpLCB2MiwgaDEpICk7Ci0gIENBTExfU1VCVEVTVCggdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHkyKEExYywgQTEsIFAxLCBTY2FsaW5nVHlwZSh2MSksIHYyLCBoMSkgKTsKLSAgQ0FMTF9TVUJURVNUKCB0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eTIoQTFjLCBBMSwgUDEsIFNjYWxpbmcodjEpLCB2MiwgaDEpICk7Ci0gIENBTExfU1VCVEVTVCggdHJhbnNmb3JtX2Fzc29jaWF0aXZpdHkyKEExYywgQTEsIFAxLCBTY2FsaW5nKHMxKSwgdjIsIGgxKSApOwotICBDQUxMX1NVQlRFU1QoIHRyYW5zZm9ybV9hc3NvY2lhdGl2aXR5MihBMWMsIEExLCBQMSwgVHJhbnNsYXRpb25UeXBlKHYxKSwgdjIsIGgxKSApOwotICBDQUxMX1NVQlRFU1QoIHRyYW5zZm9ybV9hc3NvY2lhdGl2aXR5X2xlZnQoQTFjLCBBMSwgUDEsIEwsIHYyLCBoMSkgKTsKLSAgQ0FMTF9TVUJURVNUKCB0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eTIoQTFjLCBBMSwgUDEsIFIsIHYyLCBoMSkgKTsKKyAgQ0FMTF9TVUJURVNUKHRyYW5zZm9ybV9hc3NvY2lhdGl2aXR5MihBMWMsIEExLCBQMSwgQTIsIHYyLCBoMSkpOworICBDQUxMX1NVQlRFU1QodHJhbnNmb3JtX2Fzc29jaWF0aXZpdHkyKEExYywgQTEsIFAxLCBBMmMsIHYyLCBoMSkpOworICBDQUxMX1NVQlRFU1QodHJhbnNmb3JtX2Fzc29jaWF0aXZpdHkyKEExYywgQTEsIFAxLCB2MS5hc0RpYWdvbmFsKCksIHYyLCBoMSkpOworICBDQUxMX1NVQlRFU1QodHJhbnNmb3JtX2Fzc29jaWF0aXZpdHkyKEExYywgQTEsIFAxLCBTY2FsaW5nVHlwZSh2MSksIHYyLCBoMSkpOworICBDQUxMX1NVQlRFU1QodHJhbnNmb3JtX2Fzc29jaWF0aXZpdHkyKEExYywgQTEsIFAxLCBTY2FsaW5nKHYxKSwgdjIsIGgxKSk7CisgIENBTExfU1VCVEVTVCh0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eTIoQTFjLCBBMSwgUDEsIFNjYWxpbmcoczEpLCB2MiwgaDEpKTsKKyAgQ0FMTF9TVUJURVNUKHRyYW5zZm9ybV9hc3NvY2lhdGl2aXR5MihBMWMsIEExLCBQMSwgVHJhbnNsYXRpb25UeXBlKHYxKSwgdjIsIGgxKSk7CisgIENBTExfU1VCVEVTVCh0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eV9sZWZ0KEExYywgQTEsIFAxLCBMLCB2MiwgaDEpKTsKKyAgQ0FMTF9TVUJURVNUKHRyYW5zZm9ybV9hc3NvY2lhdGl2aXR5MihBMWMsIEExLCBQMSwgUiwgdjIsIGgxKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWCggQTEqKE0qaDEpLCAoQTEqTSkqaDEgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggQTFjKihNKmgxKSwgKEExYypNKSpoMSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBQMSooTSpoMSksIChQMSpNKSpoMSApOworICBWRVJJRllfSVNfQVBQUk9YKEExICogKE0gKiBoMSksIChBMSAqIE0pICogaDEpOworICBWRVJJRllfSVNfQVBQUk9YKEExYyAqIChNICogaDEpLCAoQTFjICogTSkgKiBoMSk7CisgIFZFUklGWV9JU19BUFBST1goUDEgKiAoTSAqIGgxKSwgKFAxICogTSkgKiBoMSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWCggTSooQTEqaDEpLCAoTSpBMSkqaDEgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggTSooQTFjKmgxKSwgKE0qQTFjKSpoMSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBNKihQMSpoMSksICAoKE0qUDEpKmgxKSApOworICBWRVJJRllfSVNfQVBQUk9YKE0gKiAoQTEgKiBoMSksIChNICogQTEpICogaDEpOworICBWRVJJRllfSVNfQVBQUk9YKE0gKiAoQTFjICogaDEpLCAoTSAqIEExYykgKiBoMSk7CisgIFZFUklGWV9JU19BUFBST1goTSAqIChQMSAqIGgxKSwgKChNICogUDEpICogaDEpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHRyYW5zZm9ybV9hbGlnbm1lbnQoKQotewotICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsMyxQcm9qZWN0aXZlLEF1dG9BbGlnbj4gUHJvamVjdGl2ZTNhOwotICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsMyxQcm9qZWN0aXZlLERvbnRBbGlnbj4gUHJvamVjdGl2ZTN1OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgdHJhbnNmb3JtX2FsaWdubWVudCgpIHsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLCAzLCBQcm9qZWN0aXZlLCBBdXRvQWxpZ24+IFByb2plY3RpdmUzYTsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLCAzLCBQcm9qZWN0aXZlLCBEb250QWxpZ24+IFByb2plY3RpdmUzdTsKIAogICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5MVsxNl07CiAgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgYXJyYXkyWzE2XTsKLSAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBhcnJheTNbMTYrMV07Ci0gIFNjYWxhciogYXJyYXkzdSA9IGFycmF5MysxOworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGFycmF5M1sxNiArIDFdOworICBTY2FsYXIqIGFycmF5M3UgPSBhcnJheTMgKyAxOwogCi0gIFByb2plY3RpdmUzYSAqcDEgPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTEpKSBQcm9qZWN0aXZlM2E7Ci0gIFByb2plY3RpdmUzdSAqcDIgPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTIpKSBQcm9qZWN0aXZlM3U7Ci0gIFByb2plY3RpdmUzdSAqcDMgPSA6Om5ldyhyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTN1KSkgUHJvamVjdGl2ZTN1OwotICAKKyAgUHJvamVjdGl2ZTNhKiBwMSA9IDo6bmV3IChyZWludGVycHJldF9jYXN0PHZvaWQqPihhcnJheTEpKSBQcm9qZWN0aXZlM2E7CisgIFByb2plY3RpdmUzdSogcDIgPSA6Om5ldyAocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXJyYXkyKSkgUHJvamVjdGl2ZTN1OworICBQcm9qZWN0aXZlM3UqIHAzID0gOjpuZXcgKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFycmF5M3UpKSBQcm9qZWN0aXZlM3U7CisKICAgcDEtPm1hdHJpeCgpLnNldFJhbmRvbSgpOwogICAqcDIgPSAqcDE7CiAgICpwMyA9ICpwMTsKIAogICBWRVJJRllfSVNfQVBQUk9YKHAxLT5tYXRyaXgoKSwgcDItPm1hdHJpeCgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChwMS0+bWF0cml4KCksIHAzLT5tYXRyaXgoKSk7Ci0gIAotICBWRVJJRllfSVNfQVBQUk9YKCAoKnAxKSAqICgqcDEpLCAoKnAyKSooKnAzKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCgoKnAxKSAqICgqcDEpLCAoKnAyKSAqICgqcDMpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgT3B0aW9ucz4gdm9pZCB0cmFuc2Zvcm1fcHJvZHVjdHMoKQotewotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRGltKzEsRGltKzE+IE1hdDsKLSAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxQcm9qZWN0aXZlLE9wdGlvbnM+IFByb2o7Ci0gIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhcixEaW0sQWZmaW5lLE9wdGlvbnM+IEFmZjsKLSAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLERpbSxBZmZpbmVDb21wYWN0LE9wdGlvbnM+IEFmZkM7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltLCBpbnQgT3B0aW9ucz4KK3ZvaWQgdHJhbnNmb3JtX3Byb2R1Y3RzKCkgeworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERpbSArIDEsIERpbSArIDE+IE1hdDsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLCBEaW0sIFByb2plY3RpdmUsIE9wdGlvbnM+IFByb2o7CisgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwgRGltLCBBZmZpbmUsIE9wdGlvbnM+IEFmZjsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLCBEaW0sIEFmZmluZUNvbXBhY3QsIE9wdGlvbnM+IEFmZkM7CiAKLSAgUHJvaiBwOyBwLm1hdHJpeCgpLnNldFJhbmRvbSgpOwotICBBZmYgYTsgYS5saW5lYXIoKS5zZXRSYW5kb20oKTsgYS50cmFuc2xhdGlvbigpLnNldFJhbmRvbSgpOworICBQcm9qIHA7CisgIHAubWF0cml4KCkuc2V0UmFuZG9tKCk7CisgIEFmZiBhOworICBhLmxpbmVhcigpLnNldFJhbmRvbSgpOworICBhLnRyYW5zbGF0aW9uKCkuc2V0UmFuZG9tKCk7CiAgIEFmZkMgYWMgPSBhOwogCiAgIE1hdCBwX20ocC5tYXRyaXgoKSksIGFfbShhLm1hdHJpeCgpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKChwKnApLm1hdHJpeCgpLCBwX20qcF9tKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgoYSphKS5tYXRyaXgoKSwgYV9tKmFfbSk7Ci0gIFZFUklGWV9JU19BUFBST1goKHAqYSkubWF0cml4KCksIHBfbSphX20pOwotICBWRVJJRllfSVNfQVBQUk9YKChhKnApLm1hdHJpeCgpLCBhX20qcF9tKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgoYWMqYSkubWF0cml4KCksIGFfbSphX20pOwotICBWRVJJRllfSVNfQVBQUk9YKChhKmFjKS5tYXRyaXgoKSwgYV9tKmFfbSk7Ci0gIFZFUklGWV9JU19BUFBST1goKHAqYWMpLm1hdHJpeCgpLCBwX20qYV9tKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgoYWMqcCkubWF0cml4KCksIGFfbSpwX20pOworICBWRVJJRllfSVNfQVBQUk9YKChwICogcCkubWF0cml4KCksIHBfbSAqIHBfbSk7CisgIFZFUklGWV9JU19BUFBST1goKGEgKiBhKS5tYXRyaXgoKSwgYV9tICogYV9tKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgocCAqIGEpLm1hdHJpeCgpLCBwX20gKiBhX20pOworICBWRVJJRllfSVNfQVBQUk9YKChhICogcCkubWF0cml4KCksIGFfbSAqIHBfbSk7CisgIFZFUklGWV9JU19BUFBST1goKGFjICogYSkubWF0cml4KCksIGFfbSAqIGFfbSk7CisgIFZFUklGWV9JU19BUFBST1goKGEgKiBhYykubWF0cml4KCksIGFfbSAqIGFfbSk7CisgIFZFUklGWV9JU19BUFBST1goKHAgKiBhYykubWF0cml4KCksIHBfbSAqIGFfbSk7CisgIFZFUklGWV9JU19BUFBST1goKGFjICogcCkubWF0cml4KCksIGFfbSAqIHBfbSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGUsIGludCBPcHRpb25zPiB2b2lkIHRyYW5zZm9ybWF0aW9uc19ub19zY2FsZSgpCi17Ci0gICAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKLSAgICAgQ3Jvc3MuaCBRdWF0ZXJuaW9uLmgsIFRyYW5zZm9ybS5oCi0gICovCi0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjM7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciw0LDE+IFZlY3RvcjQ7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZSwgaW50IE9wdGlvbnM+Cit2b2lkIHRyYW5zZm9ybWF0aW9uc19ub19zY2FsZSgpIHsKKyAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgorICBDcm9zcy5oIFF1YXRlcm5pb24uaCwgVHJhbnNmb3JtLmgKKyovCisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMT4gVmVjdG9yMzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCA0LCAxPiBWZWN0b3I0OwogICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9ueDsKICAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBbmdsZUF4aXN4OwotICB0eXBlZGVmIFRyYW5zZm9ybTxTY2FsYXIsMyxNb2RlLE9wdGlvbnM+IFRyYW5zZm9ybTM7Ci0gIHR5cGVkZWYgVHJhbnNsYXRpb248U2NhbGFyLDM+IFRyYW5zbGF0aW9uMzsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQsND4gTWF0cml4NDsKKyAgdHlwZWRlZiBUcmFuc2Zvcm08U2NhbGFyLCAzLCBNb2RlLCBPcHRpb25zPiBUcmFuc2Zvcm0zOworICB0eXBlZGVmIFRyYW5zbGF0aW9uPFNjYWxhciwgMz4gVHJhbnNsYXRpb24zOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDQsIDQ+IE1hdHJpeDQ7CiAKLSAgVmVjdG9yMyB2MCA9IFZlY3RvcjM6OlJhbmRvbSgpLAotICAgICAgICAgIHYxID0gVmVjdG9yMzo6UmFuZG9tKCk7CisgIFZlY3RvcjMgdjAgPSBWZWN0b3IzOjpSYW5kb20oKSwgdjEgPSBWZWN0b3IzOjpSYW5kb20oKTsKIAogICBUcmFuc2Zvcm0zIHQwLCB0MSwgdDI7CiAKQEAgLTY0Niw3ICs2NDEsNyBAQAogCiAgIHQxLmZyb21Qb3NpdGlvbk9yaWVudGF0aW9uU2NhbGUodjAsIHExLCB2MSk7CiAgIFZFUklGWV9JU19BUFBST1godDEubWF0cml4KCksIHQwLm1hdHJpeCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh0MSp2MSwgdDAqdjEpOworICBWRVJJRllfSVNfQVBQUk9YKHQxICogdjEsIHQwICogdjEpOwogCiAgIC8vIHRyYW5zbGF0aW9uICogdmVjdG9yCiAgIHQwLnNldElkZW50aXR5KCk7CkBAIC02NjMsMjEgKzY1OCwxOCBAQAogICBWRVJJRllfSVNfQVBQUk9YKFZlY3RvcjQobTMucm93KDMpKSwgVmVjdG9yNCgwLjAsIDAuMCwgMC4wLCAxLjApKTsKIAogICBWRVJJRllfSVNfQVBQUk9YKHQzLnJvdGF0aW9uKCksIHQzLmxpbmVhcigpKTsKLSAgaWYoTW9kZT09SXNvbWV0cnkpCi0gICAgVkVSSUZZKHQzLnJvdGF0aW9uKCkuZGF0YSgpPT10My5saW5lYXIoKS5kYXRhKCkpOworICBpZiAoTW9kZSA9PSBJc29tZXRyeSkgVkVSSUZZKHQzLnJvdGF0aW9uKCkuZGF0YSgpID09IHQzLmxpbmVhcigpLmRhdGEoKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGUsIGludCBPcHRpb25zPiB2b2lkIHRyYW5zZm9ybWF0aW9uc19jb21wdXRlZF9zY2FsaW5nX2NvbnRpbnVpdHkoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGUsIGludCBPcHRpb25zPgordm9pZCB0cmFuc2Zvcm1hdGlvbnNfY29tcHV0ZWRfc2NhbGluZ19jb250aW51aXR5KCkgewogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDE+IFZlY3RvcjM7CiAgIHR5cGVkZWYgVHJhbnNmb3JtPFNjYWxhciwgMywgTW9kZSwgT3B0aW9ucz4gVHJhbnNmb3JtMzsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAzLCAzPiBNYXRyaXgzOwogCiAgIC8vIEdpdmVuOiB0d28gdHJhbnNmb3JtcyB0aGF0IGRpZmZlciBieSAnMiplcHMnLgogICBTY2FsYXIgZXBzKDFlLTMpOwotICBWZWN0b3IzIHYwID0gVmVjdG9yMzo6UmFuZG9tKCkubm9ybWFsaXplZCgpLAotICAgIHYxID0gVmVjdG9yMzo6UmFuZG9tKCkubm9ybWFsaXplZCgpLAotICAgIHYzID0gVmVjdG9yMzo6UmFuZG9tKCkubm9ybWFsaXplZCgpOworICBWZWN0b3IzIHYwID0gVmVjdG9yMzo6UmFuZG9tKCkubm9ybWFsaXplZCgpLCB2MSA9IFZlY3RvcjM6OlJhbmRvbSgpLm5vcm1hbGl6ZWQoKSwgdjMgPSBWZWN0b3IzOjpSYW5kb20oKS5ub3JtYWxpemVkKCk7CiAgIFRyYW5zZm9ybTMgdDAsIHQxOwogICAvLyBUaGUgaW50ZXJlc3RpbmcgY2FzZSBpcyB3aGVuIHRoZWlyIGRldGVybWluYW50cyBoYXZlIGRpZmZlcmVudCBzaWducy4KICAgTWF0cml4MyByYW5rMiA9IDUwICogdjAgKiB2MC5hZGpvaW50KCkgKyAyMCAqIHYxICogdjEuYWRqb2ludCgpOwpAQCAtNjkwLDQyICs2ODIsNDEgQEAKICAgdDEuY29tcHV0ZVJvdGF0aW9uU2NhbGluZygmcjEsICZzMSk7CiAKICAgLy8gVGhlbjogdGhlIHNjYWxpbmcgcGFydHMgc2hvdWxkIGRpZmZlciBieSBubyBtb3JlIHRoYW4gJzIqZXBzJy4KLSAgY29uc3QgU2NhbGFyIGMoMi4xKTsgLy8gMiArIHJvb20gZm9yIHJvdW5kaW5nIGVycm9ycworICBjb25zdCBTY2FsYXIgYygyLjEpOyAgLy8gMiArIHJvb20gZm9yIHJvdW5kaW5nIGVycm9ycwogICBWRVJJRlkoKHMwIC0gczEpLm5vcm0oKSA8IGMgKiBlcHMpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoZ2VvX3RyYW5zZm9ybWF0aW9ucykKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSgoIHRyYW5zZm9ybWF0aW9uczxkb3VibGUsQWZmaW5lLEF1dG9BbGlnbj4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMSgoIG5vbl9wcm9qZWN0aXZlX29ubHk8ZG91YmxlLEFmZmluZSxBdXRvQWxpZ24+KCkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoKCB0cmFuc2Zvcm1hdGlvbnNfY29tcHV0ZWRfc2NhbGluZ19jb250aW51aXR5PGRvdWJsZSxBZmZpbmUsQXV0b0FsaWduPigpICkpOyAgIAotICAgIAotICAgIENBTExfU1VCVEVTVF8yKCggdHJhbnNmb3JtYXRpb25zPGZsb2F0LEFmZmluZUNvbXBhY3QsQXV0b0FsaWduPigpICkpOwotICAgIENBTExfU1VCVEVTVF8yKCggbm9uX3Byb2plY3RpdmVfb25seTxmbG9hdCxBZmZpbmVDb21wYWN0LEF1dG9BbGlnbj4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMigoIHRyYW5zZm9ybV9hbGlnbm1lbnQ8ZmxvYXQ+KCkgKSk7Ci0gICAgCi0gICAgQ0FMTF9TVUJURVNUXzMoKCB0cmFuc2Zvcm1hdGlvbnM8ZG91YmxlLFByb2plY3RpdmUsQXV0b0FsaWduPigpICkpOwotICAgIENBTExfU1VCVEVTVF8zKCggdHJhbnNmb3JtYXRpb25zPGRvdWJsZSxQcm9qZWN0aXZlLERvbnRBbGlnbj4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMygoIHRyYW5zZm9ybV9hbGlnbm1lbnQ8ZG91YmxlPigpICkpOworRUlHRU5fREVDTEFSRV9URVNUKGdlb190cmFuc2Zvcm1hdGlvbnMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoKHRyYW5zZm9ybWF0aW9uczxkb3VibGUsIEFmZmluZSwgQXV0b0FsaWduPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoKG5vbl9wcm9qZWN0aXZlX29ubHk8ZG91YmxlLCBBZmZpbmUsIEF1dG9BbGlnbj4oKSkpOworICAgIENBTExfU1VCVEVTVF8xKCh0cmFuc2Zvcm1hdGlvbnNfY29tcHV0ZWRfc2NhbGluZ19jb250aW51aXR5PGRvdWJsZSwgQWZmaW5lLCBBdXRvQWxpZ24+KCkpKTsKIAotICAgIENBTExfU1VCVEVTVF80KCggdHJhbnNmb3JtYXRpb25zPGZsb2F0LEFmZmluZSxSb3dNYWpvcnxBdXRvQWxpZ24+KCkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoKCBub25fcHJvamVjdGl2ZV9vbmx5PGZsb2F0LEFmZmluZSxSb3dNYWpvcj4oKSApKTsKLSAgICAKLSAgICBDQUxMX1NVQlRFU1RfNSgoIHRyYW5zZm9ybWF0aW9uczxkb3VibGUsQWZmaW5lQ29tcGFjdCxSb3dNYWpvcnxBdXRvQWxpZ24+KCkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoKCBub25fcHJvamVjdGl2ZV9vbmx5PGRvdWJsZSxBZmZpbmVDb21wYWN0LFJvd01ham9yPigpICkpOworICAgIENBTExfU1VCVEVTVF8yKCh0cmFuc2Zvcm1hdGlvbnM8ZmxvYXQsIEFmZmluZUNvbXBhY3QsIEF1dG9BbGlnbj4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKChub25fcHJvamVjdGl2ZV9vbmx5PGZsb2F0LCBBZmZpbmVDb21wYWN0LCBBdXRvQWxpZ24+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMigodHJhbnNmb3JtX2FsaWdubWVudDxmbG9hdD4oKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzYoKCB0cmFuc2Zvcm1hdGlvbnM8ZG91YmxlLFByb2plY3RpdmUsUm93TWFqb3J8QXV0b0FsaWduPigpICkpOwotICAgIENBTExfU1VCVEVTVF82KCggdHJhbnNmb3JtYXRpb25zPGRvdWJsZSxQcm9qZWN0aXZlLFJvd01ham9yfERvbnRBbGlnbj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMygodHJhbnNmb3JtYXRpb25zPGRvdWJsZSwgUHJvamVjdGl2ZSwgQXV0b0FsaWduPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKHRyYW5zZm9ybWF0aW9uczxkb3VibGUsIFByb2plY3RpdmUsIERvbnRBbGlnbj4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKCh0cmFuc2Zvcm1fYWxpZ25tZW50PGRvdWJsZT4oKSkpOwogCisgICAgQ0FMTF9TVUJURVNUXzQoKHRyYW5zZm9ybWF0aW9uczxmbG9hdCwgQWZmaW5lLCBSb3dNYWpvciB8IEF1dG9BbGlnbj4oKSkpOworICAgIENBTExfU1VCVEVTVF80KChub25fcHJvamVjdGl2ZV9vbmx5PGZsb2F0LCBBZmZpbmUsIFJvd01ham9yPigpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfNygoIHRyYW5zZm9ybV9wcm9kdWN0czxkb3VibGUsMyxSb3dNYWpvcnxBdXRvQWxpZ24+KCkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzcoKCB0cmFuc2Zvcm1fcHJvZHVjdHM8ZmxvYXQsMixBdXRvQWxpZ24+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKHRyYW5zZm9ybWF0aW9uczxkb3VibGUsIEFmZmluZUNvbXBhY3QsIFJvd01ham9yIHwgQXV0b0FsaWduPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKG5vbl9wcm9qZWN0aXZlX29ubHk8ZG91YmxlLCBBZmZpbmVDb21wYWN0LCBSb3dNYWpvcj4oKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzgoKCB0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eTxkb3VibGUsMixDb2xNYWpvcj4oUm90YXRpb24yRDxkb3VibGU+KGludGVybmFsOjpyYW5kb208ZG91YmxlPigpKmRvdWJsZShFSUdFTl9QSSkpKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfOCgoIHRyYW5zZm9ybV9hc3NvY2lhdGl2aXR5PGRvdWJsZSwzLENvbE1ham9yPihRdWF0ZXJuaW9uZDo6VW5pdFJhbmRvbSgpKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNigodHJhbnNmb3JtYXRpb25zPGRvdWJsZSwgUHJvamVjdGl2ZSwgUm93TWFqb3IgfCBBdXRvQWxpZ24+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNigodHJhbnNmb3JtYXRpb25zPGRvdWJsZSwgUHJvamVjdGl2ZSwgUm93TWFqb3IgfCBEb250QWxpZ24+KCkpKTsKIAotICAgIENBTExfU1VCVEVTVF85KCggdHJhbnNmb3JtYXRpb25zX25vX3NjYWxlPGRvdWJsZSxBZmZpbmUsQXV0b0FsaWduPigpICkpOwotICAgIENBTExfU1VCVEVTVF85KCggdHJhbnNmb3JtYXRpb25zX25vX3NjYWxlPGRvdWJsZSxJc29tZXRyeSxBdXRvQWxpZ24+KCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoKHRyYW5zZm9ybV9wcm9kdWN0czxkb3VibGUsIDMsIFJvd01ham9yIHwgQXV0b0FsaWduPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoKHRyYW5zZm9ybV9wcm9kdWN0czxmbG9hdCwgMiwgQXV0b0FsaWduPigpKSk7CisKKyAgICBDQUxMX1NVQlRFU1RfOCgodHJhbnNmb3JtX2Fzc29jaWF0aXZpdHk8ZG91YmxlLCAyLCBDb2xNYWpvcj4oCisgICAgICAgIFJvdGF0aW9uMkQ8ZG91YmxlPihpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKSAqIGRvdWJsZShFSUdFTl9QSSkpKSkpOworICAgIENBTExfU1VCVEVTVF84KCh0cmFuc2Zvcm1fYXNzb2NpYXRpdml0eTxkb3VibGUsIDMsIENvbE1ham9yPihRdWF0ZXJuaW9uZDo6VW5pdFJhbmRvbSgpKSkpOworCisgICAgQ0FMTF9TVUJURVNUXzkoKHRyYW5zZm9ybWF0aW9uc19ub19zY2FsZTxkb3VibGUsIEFmZmluZSwgQXV0b0FsaWduPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzkoKHRyYW5zZm9ybWF0aW9uc19ub19zY2FsZTxkb3VibGUsIElzb21ldHJ5LCBBdXRvQWxpZ24+KCkpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9ncHVfYmFzaWMuY3UgYi90ZXN0L2dwdV9iYXNpYy5jdQppbmRleCA2N2YxNmJmLi4zNTgzOWU0IDEwMDY0NAotLS0gYS90ZXN0L2dwdV9iYXNpYy5jdQorKysgYi90ZXN0L2dwdV9iYXNpYy5jdQpAQCAtOCw5ICs4LDkgQEAKIC8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgogCiAvLyB3b3JrYXJvdW5kIGlzc3VlIGJldHdlZW4gZ2NjID49IDQuNyBhbmQgY3VkYSA1LjUKLSNpZiAoZGVmaW5lZCBfX0dOVUNfXykgJiYgKF9fR05VQ19fPjQgfHwgX19HTlVDX01JTk9SX18+PTcpCi0gICN1bmRlZiBfR0xJQkNYWF9BVE9NSUNfQlVJTFRJTlMKLSAgI3VuZGVmIF9HTElCQ1hYX1VTRV9JTlQxMjgKKyNpZiAoZGVmaW5lZCBfX0dOVUNfXykgJiYgKF9fR05VQ19fID4gNCB8fCBfX0dOVUNfTUlOT1JfXyA+PSA3KQorI3VuZGVmIF9HTElCQ1hYX0FUT01JQ19CVUlMVElOUworI3VuZGVmIF9HTElCQ1hYX1VTRV9JTlQxMjgKICNlbmRpZgogCiAjZGVmaW5lIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQpAQCAtMzksMzEgKzM5LDI3IEBACiAvLyAgIH0KIC8vIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCBjb2VmZl93aXNlIHsKLSAgRUlHRU5fREVWSUNFX0ZVTkMKLSAgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QKLSAgeworICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIG9wZXJhdG9yKCkoaW50IGksIGNvbnN0IHR5cGVuYW1lIFQ6OlNjYWxhciogaW4sIHR5cGVuYW1lIFQ6OlNjYWxhciogb3V0KSBjb25zdCB7CiAgICAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwotICAgIFQgeDEoaW4raSk7Ci0gICAgVCB4MihpbitpKzEpOwotICAgIFQgeDMoaW4raSsyKTsKLSAgICBNYXA8VD4gcmVzKG91dCtpKlQ6Ok1heFNpemVBdENvbXBpbGVUaW1lKTsKLSAgICAKKyAgICBUIHgxKGluICsgaSk7CisgICAgVCB4MihpbiArIGkgKyAxKTsKKyAgICBUIHgzKGluICsgaSArIDIpOworICAgIE1hcDxUPiByZXMob3V0ICsgaSAqIFQ6Ok1heFNpemVBdENvbXBpbGVUaW1lKTsKKwogICAgIHJlcy5hcnJheSgpICs9IChpblswXSAqIHgxICsgeDIpLmFycmF5KCkgKiB4My5hcnJheSgpOwogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzdHJ1Y3QgY29tcGxleF9zcXJ0IHsKLSAgRUlHRU5fREVWSUNFX0ZVTkMKLSAgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QKLSAgeworICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIG9wZXJhdG9yKCkoaW50IGksIGNvbnN0IHR5cGVuYW1lIFQ6OlNjYWxhciogaW4sIHR5cGVuYW1lIFQ6OlNjYWxhciogb3V0KSBjb25zdCB7CiAgICAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogICAgIHR5cGVkZWYgdHlwZW5hbWUgVDo6U2NhbGFyIENvbXBsZXhUeXBlOwogICAgIHR5cGVkZWYgdHlwZW5hbWUgVDo6U2NhbGFyOjp2YWx1ZV90eXBlIFZhbHVlVHlwZTsKICAgICBjb25zdCBpbnQgbnVtX3NwZWNpYWxfaW5wdXRzID0gMTg7Ci0gICAgCisKICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICBjb25zdCBWYWx1ZVR5cGUgbmFuID0gc3RkOjpudW1lcmljX2xpbWl0czxWYWx1ZVR5cGU+OjpxdWlldF9OYU4oKTsKICAgICAgIHR5cGVkZWYgRWlnZW46OlZlY3RvcjxDb21wbGV4VHlwZSwgbnVtX3NwZWNpYWxfaW5wdXRzPiBTcGVjaWFsSW5wdXRzOwpAQCAtNzQsMTIgKzcwLDExIEBACiAgICAgICBzcGVjaWFsX2luW2lkeCsrXSA9IENvbXBsZXhUeXBlKC0wLCAwKTsKICAgICAgIHNwZWNpYWxfaW5baWR4KytdID0gQ29tcGxleFR5cGUoMCwgLTApOwogICAgICAgc3BlY2lhbF9pbltpZHgrK10gPSBDb21wbGV4VHlwZSgtMCwgLTApOwotICAgICAgLy8gR0NDJ3MgZmFsbGJhY2sgc3FydCBpbXBsZW1lbnRhdGlvbiBmYWlscyBmb3IgaW5mIGlucHV0cy4KLSAgICAgIC8vIEl0IGlzIGNhbGxlZCB3aGVuIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWCBpcyBmYWxzZSBvciBpZgotICAgICAgLy8gY2xhbmcgaW5jbHVkZXMgdGhlIEdDQyBoZWFkZXIgKHdoaWNoIHRlbXBvcmFyaWx5IGRpc2FibGVzCi0gICAgICAvLyBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgpCi0gICAgICAjaWYgIWRlZmluZWQoX0dMSUJDWFhfQ09NUExFWCkgfHwgXAotICAgICAgICAoX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYICYmICFkZWZpbmVkKF9fQ0xBTkdfQ1VEQV9XUkFQUEVSU19DT01QTEVYKSkKKy8vIEdDQydzIGZhbGxiYWNrIHNxcnQgaW1wbGVtZW50YXRpb24gZmFpbHMgZm9yIGluZiBpbnB1dHMuCisvLyBJdCBpcyBjYWxsZWQgd2hlbiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVggaXMgZmFsc2Ugb3IgaWYKKy8vIGNsYW5nIGluY2x1ZGVzIHRoZSBHQ0MgaGVhZGVyICh3aGljaCB0ZW1wb3JhcmlseSBkaXNhYmxlcworLy8gX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYKQorI2lmICFkZWZpbmVkKF9HTElCQ1hYX0NPTVBMRVgpIHx8IChfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVggJiYgIWRlZmluZWQoX19DTEFOR19DVURBX1dSQVBQRVJTX0NPTVBMRVgpKQogICAgICAgY29uc3QgVmFsdWVUeXBlIGluZiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VmFsdWVUeXBlPjo6aW5maW5pdHkoKTsKICAgICAgIHNwZWNpYWxfaW5baWR4KytdID0gQ29tcGxleFR5cGUoMS4wLCBpbmYpOwogICAgICAgc3BlY2lhbF9pbltpZHgrK10gPSBDb21wbGV4VHlwZShuYW4sIGluZik7CkBAIC05MSw0MSArODYsMzkgQEAKICAgICAgIHNwZWNpYWxfaW5baWR4KytdID0gQ29tcGxleFR5cGUoaW5mLCAtMS4wKTsKICAgICAgIHNwZWNpYWxfaW5baWR4KytdID0gQ29tcGxleFR5cGUoLWluZiwgbmFuKTsKICAgICAgIHNwZWNpYWxfaW5baWR4KytdID0gQ29tcGxleFR5cGUoaW5mLCBuYW4pOwotICAgICAgI2VuZGlmCisjZW5kaWYKICAgICAgIHNwZWNpYWxfaW5baWR4KytdID0gQ29tcGxleFR5cGUoMS4wLCBuYW4pOwogICAgICAgc3BlY2lhbF9pbltpZHgrK10gPSBDb21wbGV4VHlwZShuYW4sIDEuMCk7CiAgICAgICBzcGVjaWFsX2luW2lkeCsrXSA9IENvbXBsZXhUeXBlKG5hbiwgLTEuMCk7CiAgICAgICBzcGVjaWFsX2luW2lkeCsrXSA9IENvbXBsZXhUeXBlKG5hbiwgbmFuKTsKLSAgICAgIAorCiAgICAgICBNYXA8U3BlY2lhbElucHV0cz4gc3BlY2lhbF9vdXQob3V0KTsKICAgICAgIHNwZWNpYWxfb3V0ID0gc3BlY2lhbF9pbi5jd2lzZVNxcnQoKTsKICAgICB9Ci0gICAgCisKICAgICBUIHgxKGluICsgaSk7Ci0gICAgTWFwPFQ+IHJlcyhvdXQgKyBudW1fc3BlY2lhbF9pbnB1dHMgKyBpKlQ6Ok1heFNpemVBdENvbXBpbGVUaW1lKTsKKyAgICBNYXA8VD4gcmVzKG91dCArIG51bV9zcGVjaWFsX2lucHV0cyArIGkgKiBUOjpNYXhTaXplQXRDb21waWxlVGltZSk7CiAgICAgcmVzID0geDEuY3dpc2VTcXJ0KCk7CiAgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCBjb21wbGV4X29wZXJhdG9ycyB7Ci0gIEVJR0VOX0RFVklDRV9GVU5DCi0gIHZvaWQgb3BlcmF0b3IoKShpbnQgaSwgY29uc3QgdHlwZW5hbWUgVDo6U2NhbGFyKiBpbiwgdHlwZW5hbWUgVDo6U2NhbGFyKiBvdXQpIGNvbnN0Ci0gIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QgewogICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKICAgICB0eXBlZGVmIHR5cGVuYW1lIFQ6OlNjYWxhciBDb21wbGV4VHlwZTsKICAgICB0eXBlZGVmIHR5cGVuYW1lIFQ6OlNjYWxhcjo6dmFsdWVfdHlwZSBWYWx1ZVR5cGU7CiAgICAgY29uc3QgaW50IG51bV9zY2FsYXJfb3BlcmF0b3JzID0gMjQ7CiAgICAgY29uc3QgaW50IG51bV92ZWN0b3Jfb3BlcmF0b3JzID0gMjM7ICAvLyBubyB1bmFyeSArIG9wZXJhdG9yLgogICAgIGludCBvdXRfaWR4ID0gaSAqIChudW1fc2NhbGFyX29wZXJhdG9ycyArIG51bV92ZWN0b3Jfb3BlcmF0b3JzICogVDo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUpOwotICAgIAorCiAgICAgLy8gU2NhbGFyIG9wZXJhdG9ycy4KICAgICBjb25zdCBDb21wbGV4VHlwZSBhID0gaW5baV07CiAgICAgY29uc3QgQ29tcGxleFR5cGUgYiA9IGluW2kgKyAxXTsKLSAgICAKKwogICAgIG91dFtvdXRfaWR4KytdID0gK2E7CiAgICAgb3V0W291dF9pZHgrK10gPSAtYTsKLSAgICAKKwogICAgIG91dFtvdXRfaWR4KytdID0gYSArIGI7CiAgICAgb3V0W291dF9pZHgrK10gPSBhICsgbnVtZXh0OjpyZWFsKGIpOwogICAgIG91dFtvdXRfaWR4KytdID0gbnVtZXh0OjpyZWFsKGEpICsgYjsKQEAgLTEzOCwxNCArMTMxLDE4IEBACiAgICAgb3V0W291dF9pZHgrK10gPSBhIC8gYjsKICAgICBvdXRbb3V0X2lkeCsrXSA9IGEgLyBudW1leHQ6OnJlYWwoYik7CiAgICAgb3V0W291dF9pZHgrK10gPSBudW1leHQ6OnJlYWwoYSkgLyBiOwotICAgIAorCiAjaWYgIUVJR0VOX0NPTVBfTVNWQwotICAgIG91dFtvdXRfaWR4XSA9IGE7IG91dFtvdXRfaWR4KytdICs9IGI7Ci0gICAgb3V0W291dF9pZHhdID0gYTsgb3V0W291dF9pZHgrK10gLT0gYjsKLSAgICBvdXRbb3V0X2lkeF0gPSBhOyBvdXRbb3V0X2lkeCsrXSAqPSBiOwotICAgIG91dFtvdXRfaWR4XSA9IGE7IG91dFtvdXRfaWR4KytdIC89IGI7CisgICAgb3V0W291dF9pZHhdID0gYTsKKyAgICBvdXRbb3V0X2lkeCsrXSArPSBiOworICAgIG91dFtvdXRfaWR4XSA9IGE7CisgICAgb3V0W291dF9pZHgrK10gLT0gYjsKKyAgICBvdXRbb3V0X2lkeF0gPSBhOworICAgIG91dFtvdXRfaWR4KytdICo9IGI7CisgICAgb3V0W291dF9pZHhdID0gYTsKKyAgICBvdXRbb3V0X2lkeCsrXSAvPSBiOwogI2VuZGlmCi0gICAgCisKICAgICBjb25zdCBDb21wbGV4VHlwZSB0cnVlX3ZhbHVlID0gQ29tcGxleFR5cGUoVmFsdWVUeXBlKDEpLCBWYWx1ZVR5cGUoMCkpOwogICAgIGNvbnN0IENvbXBsZXhUeXBlIGZhbHNlX3ZhbHVlID0gQ29tcGxleFR5cGUoVmFsdWVUeXBlKDApLCBWYWx1ZVR5cGUoMCkpOwogICAgIG91dFtvdXRfaWR4KytdID0gKGEgPT0gYiA/IHRydWVfdmFsdWUgOiBmYWxzZV92YWx1ZSk7CkBAIC0xNTQsMTggKzE1MSwxOCBAQAogICAgIG91dFtvdXRfaWR4KytdID0gKGEgIT0gYiA/IHRydWVfdmFsdWUgOiBmYWxzZV92YWx1ZSk7CiAgICAgb3V0W291dF9pZHgrK10gPSAoYSAhPSBudW1leHQ6OnJlYWwoYikgPyB0cnVlX3ZhbHVlIDogZmFsc2VfdmFsdWUpOwogICAgIG91dFtvdXRfaWR4KytdID0gKG51bWV4dDo6cmVhbChhKSAhPSBiID8gdHJ1ZV92YWx1ZSA6IGZhbHNlX3ZhbHVlKTsKLSAgICAKKwogICAgIC8vIFZlY3RvciB2ZXJzaW9ucy4KICAgICBUIHgxKGluICsgaSk7CiAgICAgVCB4MihpbiArIGkgKyAxKTsKICAgICBjb25zdCBpbnQgcmVzX3NpemUgPSBUOjpNYXhTaXplQXRDb21waWxlVGltZSAqIG51bV9zY2FsYXJfb3BlcmF0b3JzOwogICAgIGNvbnN0IGludCBzaXplID0gVDo6TWF4U2l6ZUF0Q29tcGlsZVRpbWU7CiAgICAgaW50IGJsb2NrX2lkeCA9IDA7Ci0gICAgCisKICAgICBNYXA8VmVjdG9yWDxDb21wbGV4VHlwZT4+IHJlcyhvdXQgKyBvdXRfaWR4LCByZXNfc2l6ZSk7CiAgICAgcmVzLnNlZ21lbnQoYmxvY2tfaWR4LCBzaXplKSA9IC14MTsKICAgICBibG9ja19pZHggKz0gc2l6ZTsKLSAgICAKKwogICAgIHJlcy5zZWdtZW50KGJsb2NrX2lkeCwgc2l6ZSkgPSB4MSArIHgyOwogICAgIGJsb2NrX2lkeCArPSBzaXplOwogICAgIHJlcy5zZWdtZW50KGJsb2NrX2lkeCwgc2l6ZSkgPSB4MSArIHgyLnJlYWwoKTsKQEAgLTE5MCwxNSArMTg3LDE5IEBACiAgICAgYmxvY2tfaWR4ICs9IHNpemU7CiAgICAgcmVzLnNlZ21lbnQoYmxvY2tfaWR4LCBzaXplKSA9IHgxLnJlYWwoKS5hcnJheSgpIC8geDIuYXJyYXkoKTsKICAgICBibG9ja19pZHggKz0gc2l6ZTsKLSAgICAKKwogI2lmICFFSUdFTl9DT01QX01TVkMKLSAgICByZXMuc2VnbWVudChibG9ja19pZHgsIHNpemUpID0geDE7IHJlcy5zZWdtZW50KGJsb2NrX2lkeCwgc2l6ZSkgKz0geDI7CisgICAgcmVzLnNlZ21lbnQoYmxvY2tfaWR4LCBzaXplKSA9IHgxOworICAgIHJlcy5zZWdtZW50KGJsb2NrX2lkeCwgc2l6ZSkgKz0geDI7CiAgICAgYmxvY2tfaWR4ICs9IHNpemU7Ci0gICAgcmVzLnNlZ21lbnQoYmxvY2tfaWR4LCBzaXplKSA9IHgxOyByZXMuc2VnbWVudChibG9ja19pZHgsIHNpemUpIC09IHgyOworICAgIHJlcy5zZWdtZW50KGJsb2NrX2lkeCwgc2l6ZSkgPSB4MTsKKyAgICByZXMuc2VnbWVudChibG9ja19pZHgsIHNpemUpIC09IHgyOwogICAgIGJsb2NrX2lkeCArPSBzaXplOwotICAgIHJlcy5zZWdtZW50KGJsb2NrX2lkeCwgc2l6ZSkgPSB4MTsgcmVzLnNlZ21lbnQoYmxvY2tfaWR4LCBzaXplKS5hcnJheSgpICo9IHgyLmFycmF5KCk7CisgICAgcmVzLnNlZ21lbnQoYmxvY2tfaWR4LCBzaXplKSA9IHgxOworICAgIHJlcy5zZWdtZW50KGJsb2NrX2lkeCwgc2l6ZSkuYXJyYXkoKSAqPSB4Mi5hcnJheSgpOwogICAgIGJsb2NrX2lkeCArPSBzaXplOwotICAgIHJlcy5zZWdtZW50KGJsb2NrX2lkeCwgc2l6ZSkgPSB4MTsgcmVzLnNlZ21lbnQoYmxvY2tfaWR4LCBzaXplKS5hcnJheSgpIC89IHgyLmFycmF5KCk7CisgICAgcmVzLnNlZ21lbnQoYmxvY2tfaWR4LCBzaXplKSA9IHgxOworICAgIHJlcy5zZWdtZW50KGJsb2NrX2lkeCwgc2l6ZSkuYXJyYXkoKSAvPSB4Mi5hcnJheSgpOwogICAgIGJsb2NrX2lkeCArPSBzaXplOwogI2VuZGlmCiAKQEAgLTIyMCwxMzggKzIyMSwxMjAgQEAKICAgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RydWN0IHJlcGxpY2F0ZSB7Ci0gIEVJR0VOX0RFVklDRV9GVU5DCi0gIHZvaWQgb3BlcmF0b3IoKShpbnQgaSwgY29uc3QgdHlwZW5hbWUgVDo6U2NhbGFyKiBpbiwgdHlwZW5hbWUgVDo6U2NhbGFyKiBvdXQpIGNvbnN0Ci0gIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QgewogICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKLSAgICBUIHgxKGluK2kpOwotICAgIGludCBzdGVwICAgPSB4MS5zaXplKCkgKiA0OworICAgIFQgeDEoaW4gKyBpKTsKKyAgICBpbnQgc3RlcCA9IHgxLnNpemUoKSAqIDQ7CiAgICAgaW50IHN0cmlkZSA9IDMgKiBzdGVwOwotICAgIAotICAgIHR5cGVkZWYgTWFwPEFycmF5PHR5cGVuYW1lIFQ6OlNjYWxhcixEeW5hbWljLER5bmFtaWM+ID4gTWFwVHlwZTsKLSAgICBNYXBUeXBlKG91dCtpKnN0cmlkZSswKnN0ZXAsIHgxLnJvd3MoKSoyLCB4MS5jb2xzKCkqMikgPSB4MS5yZXBsaWNhdGUoMiwyKTsKLSAgICBNYXBUeXBlKG91dCtpKnN0cmlkZSsxKnN0ZXAsIHgxLnJvd3MoKSozLCB4MS5jb2xzKCkpID0gaW5baV0gKiB4MS5jb2x3aXNlKCkucmVwbGljYXRlKDMpOwotICAgIE1hcFR5cGUob3V0K2kqc3RyaWRlKzIqc3RlcCwgeDEucm93cygpLCB4MS5jb2xzKCkqMykgPSBpbltpXSAqIHgxLnJvd3dpc2UoKS5yZXBsaWNhdGUoMyk7CisKKyAgICB0eXBlZGVmIE1hcDxBcnJheTx0eXBlbmFtZSBUOjpTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+PiBNYXBUeXBlOworICAgIE1hcFR5cGUob3V0ICsgaSAqIHN0cmlkZSArIDAgKiBzdGVwLCB4MS5yb3dzKCkgKiAyLCB4MS5jb2xzKCkgKiAyKSA9IHgxLnJlcGxpY2F0ZSgyLCAyKTsKKyAgICBNYXBUeXBlKG91dCArIGkgKiBzdHJpZGUgKyAxICogc3RlcCwgeDEucm93cygpICogMywgeDEuY29scygpKSA9IGluW2ldICogeDEuY29sd2lzZSgpLnJlcGxpY2F0ZSgzKTsKKyAgICBNYXBUeXBlKG91dCArIGkgKiBzdHJpZGUgKyAyICogc3RlcCwgeDEucm93cygpLCB4MS5jb2xzKCkgKiAzKSA9IGluW2ldICogeDEucm93d2lzZSgpLnJlcGxpY2F0ZSgzKTsKICAgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RydWN0IGFsbG9jX25ld19kZWxldGUgewotICBFSUdFTl9ERVZJQ0VfRlVOQwotICB2b2lkIG9wZXJhdG9yKCkoaW50IGksIGNvbnN0IHR5cGVuYW1lIFQ6OlNjYWxhciogaW4sIHR5cGVuYW1lIFQ6OlNjYWxhciogb3V0KSBjb25zdAotICB7Ci0gICAgaW50IG9mZnNldCA9IDIqaSpUOjpNYXhTaXplQXRDb21waWxlVGltZTsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QgeworICAgIGludCBvZmZzZXQgPSAyICogaSAqIFQ6Ok1heFNpemVBdENvbXBpbGVUaW1lOwogICAgIFQqIHggPSBuZXcgVChpbiArIG9mZnNldCk7CiAgICAgRWlnZW46Ok1hcDxUPiB1KG91dCArIG9mZnNldCk7CiAgICAgdSA9ICp4OwogICAgIGRlbGV0ZSB4OwotICAgIAorCiAgICAgb2Zmc2V0ICs9IFQ6Ok1heFNpemVBdENvbXBpbGVUaW1lOwogICAgIFQqIHkgPSBuZXcgVFsxXTsKICAgICB5WzBdID0gVChpbiArIG9mZnNldCk7CiAgICAgRWlnZW46Ok1hcDxUPiB2KG91dCArIG9mZnNldCk7Ci0gICAgdiA9IHlbMF07ICAgIAorICAgIHYgPSB5WzBdOwogICAgIGRlbGV0ZVtdIHk7CiAgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCByZWR1eCB7Ci0gIEVJR0VOX0RFVklDRV9GVU5DCi0gIHZvaWQgb3BlcmF0b3IoKShpbnQgaSwgY29uc3QgdHlwZW5hbWUgVDo6U2NhbGFyKiBpbiwgdHlwZW5hbWUgVDo6U2NhbGFyKiBvdXQpIGNvbnN0Ci0gIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QgewogICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKICAgICBpbnQgTiA9IDEwOwotICAgIFQgeDEoaW4raSk7Ci0gICAgb3V0W2kqTiswXSA9IHgxLm1pbkNvZWZmKCk7Ci0gICAgb3V0W2kqTisxXSA9IHgxLm1heENvZWZmKCk7Ci0gICAgb3V0W2kqTisyXSA9IHgxLnN1bSgpOwotICAgIG91dFtpKk4rM10gPSB4MS5wcm9kKCk7Ci0gICAgb3V0W2kqTis0XSA9IHgxLm1hdHJpeCgpLnNxdWFyZWROb3JtKCk7Ci0gICAgb3V0W2kqTis1XSA9IHgxLm1hdHJpeCgpLm5vcm0oKTsKLSAgICBvdXRbaSpOKzZdID0geDEuY29sd2lzZSgpLnN1bSgpLm1heENvZWZmKCk7Ci0gICAgb3V0W2kqTis3XSA9IHgxLnJvd3dpc2UoKS5tYXhDb2VmZigpLnN1bSgpOwotICAgIG91dFtpKk4rOF0gPSB4MS5tYXRyaXgoKS5jb2x3aXNlKCkuc3F1YXJlZE5vcm0oKS5zdW0oKTsKKyAgICBUIHgxKGluICsgaSk7CisgICAgb3V0W2kgKiBOICsgMF0gPSB4MS5taW5Db2VmZigpOworICAgIG91dFtpICogTiArIDFdID0geDEubWF4Q29lZmYoKTsKKyAgICBvdXRbaSAqIE4gKyAyXSA9IHgxLnN1bSgpOworICAgIG91dFtpICogTiArIDNdID0geDEucHJvZCgpOworICAgIG91dFtpICogTiArIDRdID0geDEubWF0cml4KCkuc3F1YXJlZE5vcm0oKTsKKyAgICBvdXRbaSAqIE4gKyA1XSA9IHgxLm1hdHJpeCgpLm5vcm0oKTsKKyAgICBvdXRbaSAqIE4gKyA2XSA9IHgxLmNvbHdpc2UoKS5zdW0oKS5tYXhDb2VmZigpOworICAgIG91dFtpICogTiArIDddID0geDEucm93d2lzZSgpLm1heENvZWZmKCkuc3VtKCk7CisgICAgb3V0W2kgKiBOICsgOF0gPSB4MS5tYXRyaXgoKS5jb2x3aXNlKCkuc3F1YXJlZE5vcm0oKS5zdW0oKTsKICAgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KIHN0cnVjdCBwcm9kX3Rlc3QgewotICBFSUdFTl9ERVZJQ0VfRlVOQwotICB2b2lkIG9wZXJhdG9yKCkoaW50IGksIGNvbnN0IHR5cGVuYW1lIFQxOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUMTo6U2NhbGFyKiBvdXQpIGNvbnN0Ci0gIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUMTo6U2NhbGFyKiBpbiwgdHlwZW5hbWUgVDE6OlNjYWxhciogb3V0KSBjb25zdCB7CiAgICAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogICAgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIFQxOjpTY2FsYXIsIFQxOjpSb3dzQXRDb21waWxlVGltZSwgVDI6OkNvbHNBdENvbXBpbGVUaW1lPiBUMzsKLSAgICBUMSB4MShpbitpKTsKLSAgICBUMiB4MihpbitpKzEpOwotICAgIE1hcDxUMz4gcmVzKG91dCtpKlQzOjpNYXhTaXplQXRDb21waWxlVGltZSk7CisgICAgVDEgeDEoaW4gKyBpKTsKKyAgICBUMiB4MihpbiArIGkgKyAxKTsKKyAgICBNYXA8VDM+IHJlcyhvdXQgKyBpICogVDM6Ok1heFNpemVBdENvbXBpbGVUaW1lKTsKICAgICByZXMgKz0gaW5baV0gKiB4MSAqIHgyOwogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgogc3RydWN0IGRpYWdvbmFsIHsKLSAgRUlHRU5fREVWSUNFX0ZVTkMKLSAgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUMTo6U2NhbGFyKiBpbiwgdHlwZW5hbWUgVDE6OlNjYWxhciogb3V0KSBjb25zdAotICB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgb3BlcmF0b3IoKShpbnQgaSwgY29uc3QgdHlwZW5hbWUgVDE6OlNjYWxhciogaW4sIHR5cGVuYW1lIFQxOjpTY2FsYXIqIG91dCkgY29uc3QgewogICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKLSAgICBUMSB4MShpbitpKTsKLSAgICBNYXA8VDI+IHJlcyhvdXQraSpUMjo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUpOworICAgIFQxIHgxKGluICsgaSk7CisgICAgTWFwPFQyPiByZXMob3V0ICsgaSAqIFQyOjpNYXhTaXplQXRDb21waWxlVGltZSk7CiAgICAgcmVzICs9IHgxLmRpYWdvbmFsKCk7CiAgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCBlaWdlbnZhbHVlc19kaXJlY3QgewotICBFSUdFTl9ERVZJQ0VfRlVOQwotICB2b2lkIG9wZXJhdG9yKCkoaW50IGksIGNvbnN0IHR5cGVuYW1lIFQ6OlNjYWxhciogaW4sIHR5cGVuYW1lIFQ6OlNjYWxhciogb3V0KSBjb25zdAotICB7CisgIEVJR0VOX0RFVklDRV9GVU5DIHZvaWQgb3BlcmF0b3IoKShpbnQgaSwgY29uc3QgdHlwZW5hbWUgVDo6U2NhbGFyKiBpbiwgdHlwZW5hbWUgVDo6U2NhbGFyKiBvdXQpIGNvbnN0IHsKICAgICB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAgICAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgVDo6U2NhbGFyLCBUOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjOwotICAgIFQgTShpbitpKTsKLSAgICBNYXA8VmVjPiByZXMob3V0K2kqVmVjOjpNYXhTaXplQXRDb21waWxlVGltZSk7Ci0gICAgVCBBID0gTSpNLmFkam9pbnQoKTsKKyAgICBUIE0oaW4gKyBpKTsKKyAgICBNYXA8VmVjPiByZXMob3V0ICsgaSAqIFZlYzo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUpOworICAgIFQgQSA9IE0gKiBNLmFkam9pbnQoKTsKICAgICBTZWxmQWRqb2ludEVpZ2VuU29sdmVyPFQ+IGVpZzsKICAgICBlaWcuY29tcHV0ZURpcmVjdChBKTsKICAgICByZXMgPSBlaWcuZWlnZW52YWx1ZXMoKTsKICAgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RydWN0IGVpZ2VudmFsdWVzIHsKLSAgRUlHRU5fREVWSUNFX0ZVTkMKLSAgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QKLSAgeworICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIG9wZXJhdG9yKCkoaW50IGksIGNvbnN0IHR5cGVuYW1lIFQ6OlNjYWxhciogaW4sIHR5cGVuYW1lIFQ6OlNjYWxhciogb3V0KSBjb25zdCB7CiAgICAgdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogICAgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIFQ6OlNjYWxhciwgVDo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlYzsKLSAgICBUIE0oaW4raSk7Ci0gICAgTWFwPFZlYz4gcmVzKG91dCtpKlZlYzo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUpOwotICAgIFQgQSA9IE0qTS5hZGpvaW50KCk7CisgICAgVCBNKGluICsgaSk7CisgICAgTWFwPFZlYz4gcmVzKG91dCArIGkgKiBWZWM6Ok1heFNpemVBdENvbXBpbGVUaW1lKTsKKyAgICBUIEEgPSBNICogTS5hZGpvaW50KCk7CiAgICAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxUPiBlaWc7CiAgICAgZWlnLmNvbXB1dGUoQSk7CiAgICAgcmVzID0gZWlnLmVpZ2VudmFsdWVzKCk7CiAgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCBtYXRyaXhfaW52ZXJzZSB7Ci0gIEVJR0VOX0RFVklDRV9GVU5DCi0gIHZvaWQgb3BlcmF0b3IoKShpbnQgaSwgY29uc3QgdHlwZW5hbWUgVDo6U2NhbGFyKiBpbiwgdHlwZW5hbWUgVDo6U2NhbGFyKiBvdXQpIGNvbnN0Ci0gIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QgewogICAgIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKLSAgICBUIE0oaW4raSk7Ci0gICAgTWFwPFQ+IHJlcyhvdXQraSpUOjpNYXhTaXplQXRDb21waWxlVGltZSk7CisgICAgVCBNKGluICsgaSk7CisgICAgTWFwPFQ+IHJlcyhvdXQgKyBpICogVDo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUpOwogICAgIHJlcyA9IE0uaW52ZXJzZSgpOwogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzdHJ1Y3QgbnVtZXJpY19saW1pdHNfdGVzdCB7Ci0gIEVJR0VOX0RFVklDRV9GVU5DCi0gIHZvaWQgb3BlcmF0b3IoKShpbnQgaSwgY29uc3QgdHlwZW5hbWUgVDo6U2NhbGFyKiBpbiwgdHlwZW5hbWUgVDo6U2NhbGFyKiBvdXQpIGNvbnN0Ci0gIHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCBvcGVyYXRvcigpKGludCBpLCBjb25zdCB0eXBlbmFtZSBUOjpTY2FsYXIqIGluLCB0eXBlbmFtZSBUOjpTY2FsYXIqIG91dCkgY29uc3QgewogICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbikKICAgICBpbnQgb3V0X2lkeCA9IGkgKiA1OwogICAgIG91dFtvdXRfaWR4KytdID0gbnVtZXh0OjpudW1lcmljX2xpbWl0czxmbG9hdD46OmVwc2lsb24oKTsKQEAgLTM2Miw4ICszNDUsOSBAQAogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlMSwgdHlwZW5hbWUgVHlwZTI+Ci1ib29sIHZlcmlmeUlzQXBwcm94V2l0aEluZnNOYW5zKGNvbnN0IFR5cGUxJiBhLCBjb25zdCBUeXBlMiYgYiwgdHlwZW5hbWUgVHlwZTE6OlNjYWxhciogPSAwKSAvLyBFbmFibGVkIGZvciBFaWdlbidzIHR5cGUgb25seQordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGUxLCB0eXBlbmFtZSBUeXBlMj4KK2Jvb2wgdmVyaWZ5SXNBcHByb3hXaXRoSW5mc05hbnMoY29uc3QgVHlwZTEmIGEsIGNvbnN0IFR5cGUyJiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUeXBlMTo6U2NhbGFyKiA9IDApICAvLyBFbmFibGVkIGZvciBFaWdlbidzIHR5cGUgb25seQogewogICBpZiAoYS5yb3dzKCkgIT0gYi5yb3dzKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0zNzMsOSArMzU3LDggQEAKICAgfQogICBmb3IgKEluZGV4IHIgPSAwOyByIDwgYS5yb3dzKCk7ICsrcikgewogICAgIGZvciAoSW5kZXggYyA9IDA7IGMgPCBhLmNvbHMoKTsgKytjKSB7Ci0gICAgICBpZiAoYShyLCBjKSAhPSBiKHIsIGMpCi0gICAgICAgICAgJiYgISgobnVtZXh0Ojppc25hbikoYShyLCBjKSkgJiYgKG51bWV4dDo6aXNuYW4pKGIociwgYykpKSAKLSAgICAgICAgICAmJiAhdGVzdF9pc0FwcHJveChhKHIsIGMpLCBiKHIsIGMpKSkgeworICAgICAgaWYgKGEociwgYykgIT0gYihyLCBjKSAmJiAhKChudW1leHQ6OmlzbmFuKShhKHIsIGMpKSAmJiAobnVtZXh0Ojppc25hbikoYihyLCBjKSkpICYmCisgICAgICAgICAgIXRlc3RfaXNBcHByb3goYShyLCBjKSwgYihyLCBjKSkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgIH0KQEAgLTM4Myw0MSArMzY2LDM5IEBACiAgIHJldHVybiB0cnVlOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIHR5cGVuYW1lIElucHV0LCB0eXBlbmFtZSBPdXRwdXQ+Ci12b2lkIHRlc3Rfd2l0aF9pbmZzX25hbnMoY29uc3QgS2VybmVsJiBrZXIsIGludCBuLCBjb25zdCBJbnB1dCYgaW4sIE91dHB1dCYgb3V0KQotewordGVtcGxhdGUgPHR5cGVuYW1lIEtlcm5lbCwgdHlwZW5hbWUgSW5wdXQsIHR5cGVuYW1lIE91dHB1dD4KK3ZvaWQgdGVzdF93aXRoX2luZnNfbmFucyhjb25zdCBLZXJuZWwmIGtlciwgaW50IG4sIGNvbnN0IElucHV0JiBpbiwgT3V0cHV0JiBvdXQpIHsKICAgT3V0cHV0IG91dF9yZWYsIG91dF9ncHU7Ci0gICNpZiAhZGVmaW5lZChFSUdFTl9HUFVfQ09NUElMRV9QSEFTRSkKKyNpZiAhZGVmaW5lZChFSUdFTl9HUFVfQ09NUElMRV9QSEFTRSkKICAgb3V0X3JlZiA9IG91dF9ncHUgPSBvdXQ7Ci0gICNlbHNlCisjZWxzZQogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaW4pOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUob3V0KTsKLSAgI2VuZGlmCi0gIHJ1bl9vbl9jcHUgKGtlciwgbiwgaW4sICBvdXRfcmVmKTsKKyNlbmRpZgorICBydW5fb25fY3B1KGtlciwgbiwgaW4sIG91dF9yZWYpOwogICBydW5fb25fZ3B1KGtlciwgbiwgaW4sIG91dF9ncHUpOwotICAjaWYgIWRlZmluZWQoRUlHRU5fR1BVX0NPTVBJTEVfUEhBU0UpCisjaWYgIWRlZmluZWQoRUlHRU5fR1BVX0NPTVBJTEVfUEhBU0UpCiAgIHZlcmlmeUlzQXBwcm94V2l0aEluZnNOYW5zKG91dF9yZWYsIG91dF9ncHUpOwotICAjZW5kaWYKKyNlbmRpZgogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoZ3B1X2Jhc2ljKQoteworRUlHRU5fREVDTEFSRV9URVNUKGdwdV9iYXNpYykgewogICBlaV90ZXN0X2luaXRfZ3B1KCk7Ci0gIAorCiAgIGludCBudGhyZWFkcyA9IDEwMDsKICAgRWlnZW46OlZlY3RvclhmIGluLCBvdXQ7CiAgIEVpZ2VuOjpWZWN0b3JYY2YgY2ZpbiwgY2ZvdXQ7Ci0gIAotICAjaWYgIWRlZmluZWQoRUlHRU5fR1BVX0NPTVBJTEVfUEhBU0UpCisKKyNpZiAhZGVmaW5lZChFSUdFTl9HUFVfQ09NUElMRV9QSEFTRSkKICAgaW50IGRhdGFfc2l6ZSA9IG50aHJlYWRzICogNTEyOwogICBpbi5zZXRSYW5kb20oZGF0YV9zaXplKTsKICAgb3V0LnNldENvbnN0YW50KGRhdGFfc2l6ZSwgLTEpOwogICBjZmluLnNldFJhbmRvbShkYXRhX3NpemUpOwogICBjZm91dC5zZXRDb25zdGFudChkYXRhX3NpemUsIC0xKTsKLSAgI2VuZGlmCi0gIAotICBDQUxMX1NVQlRFU1QoIHJ1bl9hbmRfY29tcGFyZV90b19ncHUoY29lZmZfd2lzZTxWZWN0b3IzZj4oKSwgbnRocmVhZHMsIGluLCBvdXQpICk7Ci0gIENBTExfU1VCVEVTVCggcnVuX2FuZF9jb21wYXJlX3RvX2dwdShjb2VmZl93aXNlPEFycmF5NDRmPigpLCBudGhyZWFkcywgaW4sIG91dCkgKTsKKyNlbmRpZgorCisgIENBTExfU1VCVEVTVChydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KGNvZWZmX3dpc2U8VmVjdG9yM2Y+KCksIG50aHJlYWRzLCBpbiwgb3V0KSk7CisgIENBTExfU1VCVEVTVChydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KGNvZWZmX3dpc2U8QXJyYXk0NGY+KCksIG50aHJlYWRzLCBpbiwgb3V0KSk7CiAKICNpZiAhZGVmaW5lZChFSUdFTl9VU0VfSElQKQogICAvLyBGSVhNRQpAQCAtNDI1LDQwICs0MDYsNDEgQEAKICAgLy8KICAgLy8gIGVpZ2VuLXVwc3RyZWFtL0VpZ2VuL3NyYy9Db3JlL1JlcGxpY2F0ZS5oOjYxOjY1OiBlcnJvcjoKICAgLy8gICAgICAgICAgIGJhc2UgY2xhc3MgJ2ludGVybmFsOjpkZW5zZV94cHJfYmFzZTxSZXBsaWNhdGU8QXJyYXk8ZmxvYXQsIDQsIDEsIDAsIDQsIDE+LCAtMSwgLTE+ID46OnR5cGUnCi0gIC8vICAgICAgICAgICAoYWthICdBcnJheUJhc2U8RWlnZW46OlJlcGxpY2F0ZTxFaWdlbjo6QXJyYXk8ZmxvYXQsIDQsIDEsIDAsIDQsIDE+LCAtMSwgLTE+ID4nKSBoYXMgcHJvdGVjdGVkIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgQ0FMTF9TVUJURVNUKCBydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KHJlcGxpY2F0ZTxBcnJheTRmPigpLCBudGhyZWFkcywgaW4sIG91dCkgKTsKLSAgQ0FMTF9TVUJURVNUKCBydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KHJlcGxpY2F0ZTxBcnJheTMzZj4oKSwgbnRocmVhZHMsIGluLCBvdXQpICk7CisgIC8vICAgICAgICAgICAoYWthICdBcnJheUJhc2U8RWlnZW46OlJlcGxpY2F0ZTxFaWdlbjo6QXJyYXk8ZmxvYXQsIDQsIDEsIDAsIDQsIDE+LCAtMSwgLTE+ID4nKSBoYXMgcHJvdGVjdGVkIGRlZmF1bHQKKyAgLy8gICAgICAgICAgIGNvbnN0cnVjdG9yCisgIENBTExfU1VCVEVTVChydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KHJlcGxpY2F0ZTxBcnJheTRmPigpLCBudGhyZWFkcywgaW4sIG91dCkpOworICBDQUxMX1NVQlRFU1QocnVuX2FuZF9jb21wYXJlX3RvX2dwdShyZXBsaWNhdGU8QXJyYXkzM2Y+KCksIG50aHJlYWRzLCBpbiwgb3V0KSk7CiAKICAgLy8gSElQIGRvZXMgbm90IHN1cHBvcnQgbmV3L2RlbGV0ZSBvbiBkZXZpY2UuCi0gIENBTExfU1VCVEVTVCggcnVuX2FuZF9jb21wYXJlX3RvX2dwdShhbGxvY19uZXdfZGVsZXRlPFZlY3RvcjNmPigpLCBudGhyZWFkcywgaW4sIG91dCkgKTsKKyAgQ0FMTF9TVUJURVNUKHJ1bl9hbmRfY29tcGFyZV90b19ncHUoYWxsb2NfbmV3X2RlbGV0ZTxWZWN0b3IzZj4oKSwgbnRocmVhZHMsIGluLCBvdXQpKTsKICNlbmRpZgotICAKLSAgQ0FMTF9TVUJURVNUKCBydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KHJlZHV4PEFycmF5NGY+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOwotICBDQUxMX1NVQlRFU1QoIHJ1bl9hbmRfY29tcGFyZV90b19ncHUocmVkdXg8TWF0cml4M2Y+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOwotICAKLSAgQ0FMTF9TVUJURVNUKCBydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KHByb2RfdGVzdDxNYXRyaXgzZixNYXRyaXgzZj4oKSwgbnRocmVhZHMsIGluLCBvdXQpICk7Ci0gIENBTExfU1VCVEVTVCggcnVuX2FuZF9jb21wYXJlX3RvX2dwdShwcm9kX3Rlc3Q8TWF0cml4NGYsVmVjdG9yNGY+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOwotICAKLSAgQ0FMTF9TVUJURVNUKCBydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KGRpYWdvbmFsPE1hdHJpeDNmLFZlY3RvcjNmPigpLCBudGhyZWFkcywgaW4sIG91dCkgKTsKLSAgQ0FMTF9TVUJURVNUKCBydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KGRpYWdvbmFsPE1hdHJpeDRmLFZlY3RvcjRmPigpLCBudGhyZWFkcywgaW4sIG91dCkgKTsKIAotICBDQUxMX1NVQlRFU1QoIHJ1bl9hbmRfY29tcGFyZV90b19ncHUobWF0cml4X2ludmVyc2U8TWF0cml4MmY+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOwotICBDQUxMX1NVQlRFU1QoIHJ1bl9hbmRfY29tcGFyZV90b19ncHUobWF0cml4X2ludmVyc2U8TWF0cml4M2Y+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOwotICBDQUxMX1NVQlRFU1QoIHJ1bl9hbmRfY29tcGFyZV90b19ncHUobWF0cml4X2ludmVyc2U8TWF0cml4NGY+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOwotICAKLSAgQ0FMTF9TVUJURVNUKCBydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KGVpZ2VudmFsdWVzX2RpcmVjdDxNYXRyaXgzZj4oKSwgbnRocmVhZHMsIGluLCBvdXQpICk7Ci0gIENBTExfU1VCVEVTVCggcnVuX2FuZF9jb21wYXJlX3RvX2dwdShlaWdlbnZhbHVlc19kaXJlY3Q8TWF0cml4MmY+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOworICBDQUxMX1NVQlRFU1QocnVuX2FuZF9jb21wYXJlX3RvX2dwdShyZWR1eDxBcnJheTRmPigpLCBudGhyZWFkcywgaW4sIG91dCkpOworICBDQUxMX1NVQlRFU1QocnVuX2FuZF9jb21wYXJlX3RvX2dwdShyZWR1eDxNYXRyaXgzZj4oKSwgbnRocmVhZHMsIGluLCBvdXQpKTsKKworICBDQUxMX1NVQlRFU1QocnVuX2FuZF9jb21wYXJlX3RvX2dwdShwcm9kX3Rlc3Q8TWF0cml4M2YsIE1hdHJpeDNmPigpLCBudGhyZWFkcywgaW4sIG91dCkpOworICBDQUxMX1NVQlRFU1QocnVuX2FuZF9jb21wYXJlX3RvX2dwdShwcm9kX3Rlc3Q8TWF0cml4NGYsIFZlY3RvcjRmPigpLCBudGhyZWFkcywgaW4sIG91dCkpOworCisgIENBTExfU1VCVEVTVChydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KGRpYWdvbmFsPE1hdHJpeDNmLCBWZWN0b3IzZj4oKSwgbnRocmVhZHMsIGluLCBvdXQpKTsKKyAgQ0FMTF9TVUJURVNUKHJ1bl9hbmRfY29tcGFyZV90b19ncHUoZGlhZ29uYWw8TWF0cml4NGYsIFZlY3RvcjRmPigpLCBudGhyZWFkcywgaW4sIG91dCkpOworCisgIENBTExfU1VCVEVTVChydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KG1hdHJpeF9pbnZlcnNlPE1hdHJpeDJmPigpLCBudGhyZWFkcywgaW4sIG91dCkpOworICBDQUxMX1NVQlRFU1QocnVuX2FuZF9jb21wYXJlX3RvX2dwdShtYXRyaXhfaW52ZXJzZTxNYXRyaXgzZj4oKSwgbnRocmVhZHMsIGluLCBvdXQpKTsKKyAgQ0FMTF9TVUJURVNUKHJ1bl9hbmRfY29tcGFyZV90b19ncHUobWF0cml4X2ludmVyc2U8TWF0cml4NGY+KCksIG50aHJlYWRzLCBpbiwgb3V0KSk7CisKKyAgQ0FMTF9TVUJURVNUKHJ1bl9hbmRfY29tcGFyZV90b19ncHUoZWlnZW52YWx1ZXNfZGlyZWN0PE1hdHJpeDNmPigpLCBudGhyZWFkcywgaW4sIG91dCkpOworICBDQUxMX1NVQlRFU1QocnVuX2FuZF9jb21wYXJlX3RvX2dwdShlaWdlbnZhbHVlc19kaXJlY3Q8TWF0cml4MmY+KCksIG50aHJlYWRzLCBpbiwgb3V0KSk7CiAKICAgLy8gVGVzdCBzdGQ6OmNvbXBsZXguCi0gIENBTExfU1VCVEVTVCggcnVuX2FuZF9jb21wYXJlX3RvX2dwdShjb21wbGV4X29wZXJhdG9yczxWZWN0b3IzY2Y+KCksIG50aHJlYWRzLCBjZmluLCBjZm91dCkgKTsKLSAgQ0FMTF9TVUJURVNUKCB0ZXN0X3dpdGhfaW5mc19uYW5zKGNvbXBsZXhfc3FydDxWZWN0b3IzY2Y+KCksIG50aHJlYWRzLCBjZmluLCBjZm91dCkgKTsKKyAgQ0FMTF9TVUJURVNUKHJ1bl9hbmRfY29tcGFyZV90b19ncHUoY29tcGxleF9vcGVyYXRvcnM8VmVjdG9yM2NmPigpLCBudGhyZWFkcywgY2ZpbiwgY2ZvdXQpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfd2l0aF9pbmZzX25hbnMoY29tcGxleF9zcXJ0PFZlY3RvcjNjZj4oKSwgbnRocmVhZHMsIGNmaW4sIGNmb3V0KSk7CiAKICAgLy8gbnVtZXJpY19saW1pdHMKLSAgQ0FMTF9TVUJURVNUKCB0ZXN0X3dpdGhfaW5mc19uYW5zKG51bWVyaWNfbGltaXRzX3Rlc3Q8VmVjdG9yM2Y+KCksIDEsIGluLCBvdXQpICk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3dpdGhfaW5mc19uYW5zKG51bWVyaWNfbGltaXRzX3Rlc3Q8VmVjdG9yM2Y+KCksIDEsIGluLCBvdXQpKTsKIAogICAvLyBUaGVzZSB0ZXN0cyByZXF1aXJlIGR5bmFtaWMtc2l6ZWQgbWF0cml4IG11bHRpcGxjYXRpb24sIHdoaWNoIGlzbid0IGN1cnJlbnRseQogICAvLyBzdXBwb3J0ZWQgb24gR1BVLgotICAKKwogICAvLyBDQUxMX1NVQlRFU1QoIHJ1bl9hbmRfY29tcGFyZV90b19ncHUoZWlnZW52YWx1ZXM8TWF0cml4NGY+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOwogICAvLyB0eXBlZGVmIE1hdHJpeDxmbG9hdCw2LDY+IE1hdHJpeDZmOwogICAvLyBDQUxMX1NVQlRFU1QoIHJ1bl9hbmRfY29tcGFyZV90b19ncHUoZWlnZW52YWx1ZXM8TWF0cml4NmY+KCksIG50aHJlYWRzLCBpbiwgb3V0KSApOwpkaWZmIC0tZ2l0IGEvdGVzdC9ncHVfY29tbW9uLmggYi90ZXN0L2dwdV9jb21tb24uaAppbmRleCA2NTliYWJlLi4wM2I5ZThmIDEwMDY0NAotLS0gYS90ZXN0L2dwdV9jb21tb24uaAorKysgYi90ZXN0L2dwdV9jb21tb24uaApAQCAtMiwxMiArMiwxMiBAQAogI2RlZmluZSBFSUdFTl9URVNUX0dQVV9DT01NT05fSAogCiAjaWZkZWYgRUlHRU5fVVNFX0hJUAotICAjaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+Ci0gICNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWVfYXBpLmg+CisjaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CisjaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lX2FwaS5oPgogI2Vsc2UKLSAgI2luY2x1ZGUgPGN1ZGEuaD4KLSAgI2luY2x1ZGUgPGN1ZGFfcnVudGltZS5oPgotICAjaW5jbHVkZSA8Y3VkYV9ydW50aW1lX2FwaS5oPgorI2luY2x1ZGUgPGN1ZGEuaD4KKyNpbmNsdWRlIDxjdWRhX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxjdWRhX3J1bnRpbWVfYXBpLmg+CiAjZW5kaWYKIAogI2luY2x1ZGUgPGlvc3RyZWFtPgpAQCAtMTYsNTQgKzE2LDQ2IEBACiBkaW0zIHRocmVhZElkeCwgYmxvY2tEaW0sIGJsb2NrSWR4OwogI2VuZGlmCiAKLXRlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbCwgdHlwZW5hbWUgSW5wdXQsIHR5cGVuYW1lIE91dHB1dD4KLXZvaWQgcnVuX29uX2NwdShjb25zdCBLZXJuZWwmIGtlciwgaW50IG4sIGNvbnN0IElucHV0JiBpbiwgT3V0cHV0JiBvdXQpCi17Ci0gIGZvcihpbnQgaT0wOyBpPG47IGkrKykKLSAgICBrZXIoaSwgaW4uZGF0YSgpLCBvdXQuZGF0YSgpKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXJuZWwsIHR5cGVuYW1lIElucHV0LCB0eXBlbmFtZSBPdXRwdXQ+Cit2b2lkIHJ1bl9vbl9jcHUoY29uc3QgS2VybmVsJiBrZXIsIGludCBuLCBjb25zdCBJbnB1dCYgaW4sIE91dHB1dCYgb3V0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSBrZXIoaSwgaW4uZGF0YSgpLCBvdXQuZGF0YSgpKTsKIH0KIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIHR5cGVuYW1lIElucHV0LCB0eXBlbmFtZSBPdXRwdXQ+Ci1fX2dsb2JhbF9fCi1FSUdFTl9ISVBfTEFVTkNIX0JPVU5EU18xMDI0Ci12b2lkIHJ1bl9vbl9ncHVfbWV0YV9rZXJuZWwoY29uc3QgS2VybmVsIGtlciwgaW50IG4sIGNvbnN0IElucHV0KiBpbiwgT3V0cHV0KiBvdXQpCi17Ci0gIGludCBpID0gdGhyZWFkSWR4LnggKyBibG9ja0lkeC54KmJsb2NrRGltLng7Ci0gIGlmKGk8bikgewordGVtcGxhdGUgPHR5cGVuYW1lIEtlcm5lbCwgdHlwZW5hbWUgSW5wdXQsIHR5cGVuYW1lIE91dHB1dD4KK19fZ2xvYmFsX18gRUlHRU5fSElQX0xBVU5DSF9CT1VORFNfMTAyNCB2b2lkIHJ1bl9vbl9ncHVfbWV0YV9rZXJuZWwoY29uc3QgS2VybmVsIGtlciwgaW50IG4sIGNvbnN0IElucHV0KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0KiBvdXQpIHsKKyAgaW50IGkgPSB0aHJlYWRJZHgueCArIGJsb2NrSWR4LnggKiBibG9ja0RpbS54OworICBpZiAoaSA8IG4pIHsKICAgICBrZXIoaSwgaW4sIG91dCk7CiAgIH0KIH0KIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIHR5cGVuYW1lIElucHV0LCB0eXBlbmFtZSBPdXRwdXQ+Ci12b2lkIHJ1bl9vbl9ncHUoY29uc3QgS2VybmVsJiBrZXIsIGludCBuLCBjb25zdCBJbnB1dCYgaW4sIE91dHB1dCYgb3V0KQotewotICB0eXBlbmFtZSBJbnB1dDo6U2NhbGFyKiAgZF9pbjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXJuZWwsIHR5cGVuYW1lIElucHV0LCB0eXBlbmFtZSBPdXRwdXQ+Cit2b2lkIHJ1bl9vbl9ncHUoY29uc3QgS2VybmVsJiBrZXIsIGludCBuLCBjb25zdCBJbnB1dCYgaW4sIE91dHB1dCYgb3V0KSB7CisgIHR5cGVuYW1lIElucHV0OjpTY2FsYXIqIGRfaW47CiAgIHR5cGVuYW1lIE91dHB1dDo6U2NhbGFyKiBkX291dDsKLSAgc3RkOjpwdHJkaWZmX3QgaW5fYnl0ZXMgID0gaW4uc2l6ZSgpICAqIHNpemVvZih0eXBlbmFtZSBJbnB1dDo6U2NhbGFyKTsKKyAgc3RkOjpwdHJkaWZmX3QgaW5fYnl0ZXMgPSBpbi5zaXplKCkgKiBzaXplb2YodHlwZW5hbWUgSW5wdXQ6OlNjYWxhcik7CiAgIHN0ZDo6cHRyZGlmZl90IG91dF9ieXRlcyA9IG91dC5zaXplKCkgKiBzaXplb2YodHlwZW5hbWUgT3V0cHV0OjpTY2FsYXIpOwotICAKLSAgZ3B1TWFsbG9jKCh2b2lkKiopKCZkX2luKSwgIGluX2J5dGVzKTsKKworICBncHVNYWxsb2MoKHZvaWQqKikoJmRfaW4pLCBpbl9ieXRlcyk7CiAgIGdwdU1hbGxvYygodm9pZCoqKSgmZF9vdXQpLCBvdXRfYnl0ZXMpOwotICAKLSAgZ3B1TWVtY3B5KGRfaW4sICBpbi5kYXRhKCksICBpbl9ieXRlcywgIGdwdU1lbWNweUhvc3RUb0RldmljZSk7CisKKyAgZ3B1TWVtY3B5KGRfaW4sIGluLmRhdGEoKSwgaW5fYnl0ZXMsIGdwdU1lbWNweUhvc3RUb0RldmljZSk7CiAgIGdwdU1lbWNweShkX291dCwgb3V0LmRhdGEoKSwgb3V0X2J5dGVzLCBncHVNZW1jcHlIb3N0VG9EZXZpY2UpOwotICAKKwogICAvLyBTaW1wbGUgYW5kIG5vbi1vcHRpbWFsIDFEIG1hcHBpbmcgYXNzdW1pbmcgbiBpcyBub3QgdG9vIGxhcmdlCiAgIC8vIFRoYXQncyBvbmx5IGZvciB1bml0IHRlc3RpbmchCiAgIGRpbTMgQmxvY2tzKDEyOCk7Ci0gIGRpbTMgR3JpZHMoIChuK2ludChCbG9ja3MueCktMSkvaW50KEJsb2Nrcy54KSApOworICBkaW0zIEdyaWRzKChuICsgaW50KEJsb2Nrcy54KSAtIDEpIC8gaW50KEJsb2Nrcy54KSk7CiAKICAgZ3B1RGV2aWNlU3luY2hyb25pemUoKTsKLSAgCisKICNpZmRlZiBFSUdFTl9VU0VfSElQCi0gIGhpcExhdW5jaEtlcm5lbEdHTChISVBfS0VSTkVMX05BTUUocnVuX29uX2dwdV9tZXRhX2tlcm5lbDxLZXJuZWwsCi0JCQkJICAgICB0eXBlbmFtZSBzdGQ6OmRlY2F5PGRlY2x0eXBlKCpkX2luKT46OnR5cGUsCi0JCQkJICAgICB0eXBlbmFtZSBzdGQ6OmRlY2F5PGRlY2x0eXBlKCpkX291dCk+Ojp0eXBlPiksIAotCQkgICAgIGRpbTMoR3JpZHMpLCBkaW0zKEJsb2NrcyksIDAsIDAsIGtlciwgbiwgZF9pbiwgZF9vdXQpOworICBoaXBMYXVuY2hLZXJuZWxHR0woSElQX0tFUk5FTF9OQU1FKHJ1bl9vbl9ncHVfbWV0YV9rZXJuZWw8S2VybmVsLCB0eXBlbmFtZSBzdGQ6OmRlY2F5PGRlY2x0eXBlKCpkX2luKT46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmRlY2F5PGRlY2x0eXBlKCpkX291dCk+Ojp0eXBlPiksCisgICAgICAgICAgICAgICAgICAgICBkaW0zKEdyaWRzKSwgZGltMyhCbG9ja3MpLCAwLCAwLCBrZXIsIG4sIGRfaW4sIGRfb3V0KTsKICNlbHNlCi0gIHJ1bl9vbl9ncHVfbWV0YV9rZXJuZWw8PDxHcmlkcyxCbG9ja3M+Pj4oa2VyLCBuLCBkX2luLCBkX291dCk7CisgIHJ1bl9vbl9ncHVfbWV0YV9rZXJuZWw8PDxHcmlkcywgQmxvY2tzPiA+ID4oa2VyLCBuLCBkX2luLCBkX291dCk7CiAjZW5kaWYKICAgLy8gUHJlLWxhdW5jaCBlcnJvcnMuCiAgIGdwdUVycm9yX3QgZXJyID0gZ3B1R2V0TGFzdEVycm9yKCk7CkBAIC03MSw5MCArNjMsODMgQEAKICAgICBwcmludGYoIiVzOiAlc1xuIiwgZ3B1R2V0RXJyb3JOYW1lKGVyciksIGdwdUdldEVycm9yU3RyaW5nKGVycikpOwogICAgIGdwdV9hc3NlcnQoZmFsc2UpOwogICB9Ci0gIAorCiAgIC8vIEtlcm5lbCBleGVjdXRpb24gZXJyb3JzLgogICBlcnIgPSBncHVEZXZpY2VTeW5jaHJvbml6ZSgpOwogICBpZiAoZXJyICE9IGdwdVN1Y2Nlc3MpIHsKICAgICBwcmludGYoIiVzOiAlc1xuIiwgZ3B1R2V0RXJyb3JOYW1lKGVyciksIGdwdUdldEVycm9yU3RyaW5nKGVycikpOwogICAgIGdwdV9hc3NlcnQoZmFsc2UpOwogICB9Ci0gIAotICAKKwogICAvLyBjaGVjayBpbnB1dHMgaGF2ZSBub3QgYmVlbiBtb2RpZmllZAotICBncHVNZW1jcHkoY29uc3RfY2FzdDx0eXBlbmFtZSBJbnB1dDo6U2NhbGFyKj4oaW4uZGF0YSgpKSwgIGRfaW4sICBpbl9ieXRlcywgIGdwdU1lbWNweURldmljZVRvSG9zdCk7CisgIGdwdU1lbWNweShjb25zdF9jYXN0PHR5cGVuYW1lIElucHV0OjpTY2FsYXIqPihpbi5kYXRhKCkpLCBkX2luLCBpbl9ieXRlcywgZ3B1TWVtY3B5RGV2aWNlVG9Ib3N0KTsKICAgZ3B1TWVtY3B5KG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCk7Ci0gIAorCiAgIGdwdUZyZWUoZF9pbik7CiAgIGdwdUZyZWUoZF9vdXQpOwogfQogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbCwgdHlwZW5hbWUgSW5wdXQsIHR5cGVuYW1lIE91dHB1dD4KLXZvaWQgcnVuX2FuZF9jb21wYXJlX3RvX2dwdShjb25zdCBLZXJuZWwmIGtlciwgaW50IG4sIGNvbnN0IElucHV0JiBpbiwgT3V0cHV0JiBvdXQpCi17Ci0gIElucHV0ICBpbl9yZWYsICBpbl9ncHU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2VybmVsLCB0eXBlbmFtZSBJbnB1dCwgdHlwZW5hbWUgT3V0cHV0Pgordm9pZCBydW5fYW5kX2NvbXBhcmVfdG9fZ3B1KGNvbnN0IEtlcm5lbCYga2VyLCBpbnQgbiwgY29uc3QgSW5wdXQmIGluLCBPdXRwdXQmIG91dCkgeworICBJbnB1dCBpbl9yZWYsIGluX2dwdTsKICAgT3V0cHV0IG91dF9yZWYsIG91dF9ncHU7Ci0gICNpZiAhZGVmaW5lZChFSUdFTl9HUFVfQ09NUElMRV9QSEFTRSkKKyNpZiAhZGVmaW5lZChFSUdFTl9HUFVfQ09NUElMRV9QSEFTRSkKICAgaW5fcmVmID0gaW5fZ3B1ID0gaW47CiAgIG91dF9yZWYgPSBvdXRfZ3B1ID0gb3V0OwotICAjZWxzZQorI2Vsc2UKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGluKTsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKG91dCk7Ci0gICNlbmRpZgotICBydW5fb25fY3B1IChrZXIsIG4sIGluX3JlZiwgIG91dF9yZWYpOworI2VuZGlmCisgIHJ1bl9vbl9jcHUoa2VyLCBuLCBpbl9yZWYsIG91dF9yZWYpOwogICBydW5fb25fZ3B1KGtlciwgbiwgaW5fZ3B1LCBvdXRfZ3B1KTsKLSAgI2lmICFkZWZpbmVkKEVJR0VOX0dQVV9DT01QSUxFX1BIQVNFKQorI2lmICFkZWZpbmVkKEVJR0VOX0dQVV9DT01QSUxFX1BIQVNFKQogICBWRVJJRllfSVNfQVBQUk9YKGluX3JlZiwgaW5fZ3B1KTsKICAgVkVSSUZZX0lTX0FQUFJPWChvdXRfcmVmLCBvdXRfZ3B1KTsKLSAgI2VuZGlmCisjZW5kaWYKIH0KIAogc3RydWN0IGNvbXBpbGVfdGltZV9kZXZpY2VfaW5mbyB7Ci0gIEVJR0VOX0RFVklDRV9GVU5DCi0gIHZvaWQgb3BlcmF0b3IoKShpbnQgaSwgY29uc3QgaW50KiAvKmluKi8sIGludCogaW5mbykgY29uc3QKLSAgeworICBFSUdFTl9ERVZJQ0VfRlVOQyB2b2lkIG9wZXJhdG9yKCkoaW50IGksIGNvbnN0IGludCogLyppbiovLCBpbnQqIGluZm8pIGNvbnN0IHsKICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaW5mbykKLSAgICAgICNpZiBkZWZpbmVkKF9fQ1VEQV9BUkNIX18pCi0gICAgICBpbmZvWzBdID0gaW50KF9fQ1VEQV9BUkNIX18gKzApOwotICAgICAgI2VuZGlmCi0gICAgICAjaWYgZGVmaW5lZChFSUdFTl9ISVBfREVWSUNFX0NPTVBJTEUpCi0gICAgICBpbmZvWzFdID0gaW50KEVJR0VOX0hJUF9ERVZJQ0VfQ09NUElMRSArMCk7Ci0gICAgICAjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQ1VEQV9BUkNIX18pCisgICAgICBpbmZvWzBdID0gaW50KF9fQ1VEQV9BUkNIX18gKyAwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRUlHRU5fSElQX0RFVklDRV9DT01QSUxFKQorICAgICAgaW5mb1sxXSA9IGludChFSUdFTl9ISVBfREVWSUNFX0NPTVBJTEUgKyAwKTsKKyNlbmRpZgogICAgIH0KICAgfQogfTsKIAotdm9pZCBlaV90ZXN0X2luaXRfZ3B1KCkKLXsKK3ZvaWQgZWlfdGVzdF9pbml0X2dwdSgpIHsKICAgaW50IGRldmljZSA9IDA7CiAgIGdwdURldmljZVByb3BfdCBkZXZpY2VQcm9wOwogICBncHVHZXREZXZpY2VQcm9wZXJ0aWVzKCZkZXZpY2VQcm9wLCBkZXZpY2UpOwogCiAgIEFycmF5WGkgZHVtbXkoMSksIGluZm8oMTApOwogICBpbmZvID0gLTE7Ci0gIHJ1bl9vbl9ncHUoY29tcGlsZV90aW1lX2RldmljZV9pbmZvKCksMTAsZHVtbXksaW5mbyk7Ci0KKyAgcnVuX29uX2dwdShjb21waWxlX3RpbWVfZGV2aWNlX2luZm8oKSwgMTAsIGR1bW15LCBpbmZvKTsKIAogICBzdGQ6OmNvdXQgPDwgIkdQVSBjb21waWxlLXRpbWUgaW5mbzpcbiI7Ci0gIAotICAjaWZkZWYgRUlHRU5fQ1VEQUNDCisKKyNpZmRlZiBFSUdFTl9DVURBQ0MKICAgc3RkOjpjb3V0IDw8ICIgIEVJR0VOX0NVREFDQzogICAgICAgICAgICAgICAgICIgPDwgaW50KEVJR0VOX0NVREFDQykgPDwgIlxuIjsKLSAgI2VuZGlmCi0gIAotICAjaWZkZWYgRUlHRU5fQ1VEQV9TREtfVkVSCisjZW5kaWYKKworI2lmZGVmIEVJR0VOX0NVREFfU0RLX1ZFUgogICBzdGQ6OmNvdXQgPDwgIiAgRUlHRU5fQ1VEQV9TREtfVkVSOiAgICAgICAgICAgICAiIDw8IGludChFSUdFTl9DVURBX1NES19WRVIpIDw8ICJcbiI7Ci0gICNlbmRpZgorI2VuZGlmCiAKLSAgI2lmIEVJR0VOX0NPTVBfTlZDQworI2lmIEVJR0VOX0NPTVBfTlZDQwogICBzdGQ6OmNvdXQgPDwgIiAgRUlHRU5fQ09NUF9OVkNDOiAgICAgICAgICAgICAiIDw8IGludChFSUdFTl9DT01QX05WQ0MpIDw8ICJcbiI7Ci0gICNlbmRpZgotICAKLSAgI2lmZGVmIEVJR0VOX0hJUENDCi0gIHN0ZDo6Y291dCA8PCAiICBFSUdFTl9ISVBDQzogICAgICAgICAgICAgICAgICIgPDwgaW50KEVJR0VOX0hJUENDKSA8PCAiXG4iOwotICAjZW5kaWYKKyNlbmRpZgogCi0gIHN0ZDo6Y291dCA8PCAiICBFSUdFTl9DVURBX0FSQ0g6ICAgICAgICAgICAgICIgPDwgaW5mb1swXSA8PCAiXG4iOyAgCisjaWZkZWYgRUlHRU5fSElQQ0MKKyAgc3RkOjpjb3V0IDw8ICIgIEVJR0VOX0hJUENDOiAgICAgICAgICAgICAgICAgIiA8PCBpbnQoRUlHRU5fSElQQ0MpIDw8ICJcbiI7CisjZW5kaWYKKworICBzdGQ6OmNvdXQgPDwgIiAgRUlHRU5fQ1VEQV9BUkNIOiAgICAgICAgICAgICAiIDw8IGluZm9bMF0gPDwgIlxuIjsKICAgc3RkOjpjb3V0IDw8ICIgIEVJR0VOX0hJUF9ERVZJQ0VfQ09NUElMRTogICAgIiA8PCBpbmZvWzFdIDw8ICJcbiI7CiAKICAgc3RkOjpjb3V0IDw8ICJHUFUgZGV2aWNlIGluZm86XG4iOwpAQCAtMTcwLDQgKzE1NSw0IEBACiAgIHN0ZDo6Y291dCA8PCAiICBjb21wdXRlTW9kZTogICAgICAgICAgICAgICAgICIgPDwgZGV2aWNlUHJvcC5jb21wdXRlTW9kZSA8PCAiXG4iOwogfQogCi0jZW5kaWYgLy8gRUlHRU5fVEVTVF9HUFVfQ09NTU9OX0gKKyNlbmRpZiAgLy8gRUlHRU5fVEVTVF9HUFVfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL3Rlc3QvZ3B1X2V4YW1wbGUuY3UgYi90ZXN0L2dwdV9leGFtcGxlLmN1CmluZGV4IGQ0NzE1Y2YuLmNiNWVhMzAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ3B1X2V4YW1wbGUuY3UKKysrIGIvdGVzdC9ncHVfZXhhbXBsZS5jdQpAQCAtMTgsMTEgKzE4LDEwIEBACiBzdHJ1Y3QgQWRkS2VybmVsIHsKICAgLy8gUGFyYW1ldGVycyBtdXN0IGJlIFBPRCBvciBzZXJpYWxpemFibGUgRWlnZW4gdHlwZXMgKGUuZy4gTWF0cml4LAogICAvLyBBcnJheSkuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIFBPRCBvciBzZXJpYWxpemFibGUgdmFsdWUgdHlwZS4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZTEsIHR5cGVuYW1lIFR5cGUyLCB0eXBlbmFtZSBUeXBlMz4KLSAgRUlHRU5fREVWSUNFX0ZVTkMKLSAgVHlwZTMgb3BlcmF0b3IoKShjb25zdCBUeXBlMSYgQSwgY29uc3QgVHlwZTImIEIsIFR5cGUzJiBDKSBjb25zdCB7Ci0gICAgQyA9IEEgKyBCOyAgICAgICAvLyBQb3B1bGF0ZSBvdXRwdXQgcGFyYW1ldGVyLgotICAgIFR5cGUzIEQgPSBBICsgQjsgLy8gUG9wdWxhdGUgcmV0dXJuIHZhbHVlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZTEsIHR5cGVuYW1lIFR5cGUyLCB0eXBlbmFtZSBUeXBlMz4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgVHlwZTMgb3BlcmF0b3IoKShjb25zdCBUeXBlMSYgQSwgY29uc3QgVHlwZTImIEIsIFR5cGUzJiBDKSBjb25zdCB7CisgICAgQyA9IEEgKyBCOyAgICAgICAgLy8gUG9wdWxhdGUgb3V0cHV0IHBhcmFtZXRlci4KKyAgICBUeXBlMyBEID0gQSArIEI7ICAvLyBQb3B1bGF0ZSByZXR1cm4gdmFsdWUuCiAgICAgcmV0dXJuIEQ7CiAgIH0KIH07CkBAIC0zNiw3ICszNSw3IEBACiAgIC8vIENyZWF0ZSByYW5kb20gaW5wdXRzLgogICBjb25zdCBUIEEgPSBUOjpSYW5kb20ocm93cywgY29scyk7CiAgIGNvbnN0IFQgQiA9IFQ6OlJhbmRvbShyb3dzLCBjb2xzKTsKLSAgVCBDOyAvLyBPdXRwdXQgcGFyYW1ldGVyLgorICBUIEM7ICAvLyBPdXRwdXQgcGFyYW1ldGVyLgogCiAgIC8vIENyZWF0ZSBrZXJuZWwuCiAgIEFkZEtlcm5lbCBhZGRfa2VybmVsOwpAQCAtNTQsMTYgKzUzLDE1IEBACiAgIC8vIEluIGEgR1BVLW9ubHkgdGVzdCwgd2UgY2FuIHZlcmlmeSB0aGF0IHRoZSBDUFUgYW5kIEdQVSBwcm9kdWNlIHRoZQogICAvLyBzYW1lIHJlc3VsdHMuCiAgIFQgQ19jcHUsIENfZ3B1OwotICBUIERfY3B1ID0gcnVuX29uX2NwdShhZGRfa2VybmVsLCBBLCBCLCBDX2NwdSk7IC8vIFJ1bnMgb24gQ1BVLgotICBUIERfZ3B1ID0gcnVuX29uX2dwdShhZGRfa2VybmVsLCBBLCBCLCBDX2dwdSk7IC8vIFJ1bnMgb24gR1BVLgorICBUIERfY3B1ID0gcnVuX29uX2NwdShhZGRfa2VybmVsLCBBLCBCLCBDX2NwdSk7ICAvLyBSdW5zIG9uIENQVS4KKyAgVCBEX2dwdSA9IHJ1bl9vbl9ncHUoYWRkX2tlcm5lbCwgQSwgQiwgQ19ncHUpOyAgLy8gUnVucyBvbiBHUFUuCiAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChDX2NwdSwgQ19ncHUpOwogICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwoRF9jcHUsIERfZ3B1KTsKIH07CiAKIHN0cnVjdCBNdWx0aXBseUtlcm5lbCB7Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGUxLCB0eXBlbmFtZSBUeXBlMiwgdHlwZW5hbWUgVHlwZTM+Ci0gIEVJR0VOX0RFVklDRV9GVU5DCi0gIFR5cGUzIG9wZXJhdG9yKCkoY29uc3QgVHlwZTEmIEEsIGNvbnN0IFR5cGUyJiBCLCBUeXBlMyYgQykgY29uc3QgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZTEsIHR5cGVuYW1lIFR5cGUyLCB0eXBlbmFtZSBUeXBlMz4KKyAgRUlHRU5fREVWSUNFX0ZVTkMgVHlwZTMgb3BlcmF0b3IoKShjb25zdCBUeXBlMSYgQSwgY29uc3QgVHlwZTImIEIsIFR5cGUzJiBDKSBjb25zdCB7CiAgICAgQyA9IEEgKiBCOwogICAgIHJldHVybiBBICogQjsKICAgfQpAQCAtODUsOSArODMsOSBAQAogCiAgIC8vIDIgb3V0cHV0cyBvZiBzaXplIChBICogQikuIEZvciBlYWNoIG1hdHJpeCBvdXRwdXQsIHRoZSBidWZmZXIgd2lsbCBzdG9yZQogICAvLyB0aGUgbnVtYmVyIG9mIHJvd3MsIGNvbHVtbnMsIGFuZCB0aGUgZGF0YS4KLSAgc2l6ZV90IGJ1ZmZlcl9jYXBhY2l0eV9oaW50ID0gMiAqICggICAgICAgICAgICAgICAgICAgICAvLyAyIG91dHB1dCBwYXJhbWV0ZXJzCi0gICAgMiAqIHNpemVvZih0eXBlbmFtZSBUMzo6SW5kZXgpICAgICAgICAgICAgICAgICAgICAgICAgLy8gIyBSb3dzLCAjIENvbHMKLSAgICArIEEucm93cygpICogQi5jb2xzKCkgKiBzaXplb2YodHlwZW5hbWUgVDM6OlNjYWxhcikpOyAvLyBPdXRwdXQgZGF0YQorICBzaXplX3QgYnVmZmVyX2NhcGFjaXR5X2hpbnQgPSAyICogKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyIG91dHB1dCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIHNpemVvZih0eXBlbmFtZSBUMzo6SW5kZXgpICAgICAgICAgICAgICAgICAgICAgICAgIC8vICMgUm93cywgIyBDb2xzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBLnJvd3MoKSAqIEIuY29scygpICogc2l6ZW9mKHR5cGVuYW1lIFQzOjpTY2FsYXIpKTsgIC8vIE91dHB1dCBkYXRhCiAKICAgVDMgRCA9IHJ1bl93aXRoX2hpbnQoYnVmZmVyX2NhcGFjaXR5X2hpbnQsIG11bHRpcGx5X2tlcm5lbCwgQSwgQiwgQyk7CiAKQEAgLTk3LDM0ICs5NSwyNiBAQAogCiAgIFQzIENfY3B1LCBDX2dwdTsKICAgVDMgRF9jcHUgPSBydW5fb25fY3B1KG11bHRpcGx5X2tlcm5lbCwgQSwgQiwgQ19jcHUpOwotICBUMyBEX2dwdSA9IHJ1bl9vbl9ncHVfd2l0aF9oaW50KGJ1ZmZlcl9jYXBhY2l0eV9oaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGx5X2tlcm5lbCwgQSwgQiwgQ19ncHUpOworICBUMyBEX2dwdSA9IHJ1bl9vbl9ncHVfd2l0aF9oaW50KGJ1ZmZlcl9jYXBhY2l0eV9oaW50LCBtdWx0aXBseV9rZXJuZWwsIEEsIEIsIENfZ3B1KTsKICAgVkVSSUZZX0lTX0NXSVNFX0FQUFJPWChDX2NwdSwgQ19ncHUpOwogICBWRVJJRllfSVNfQ1dJU0VfQVBQUk9YKERfY3B1LCBEX2dwdSk7CiB9CiAKIC8vIERlY2xhcmUgdGhlIHRlc3QgZml4dHVyZS4KLUVJR0VOX0RFQ0xBUkVfVEVTVChncHVfZXhhbXBsZSkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChncHVfZXhhbXBsZSkgewogICAvLyBGb3IgdGhlIG51bWJlciBvZiByZXBlYXRzLCBjYWxsIHRoZSBkZXNpcmVkIHN1YnRlc3RzLgotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKICAgICAvLyBDYWxsIHN1YnRlc3RzIHdpdGggZGlmZmVyZW50IHNpemVkL3R5cGVkIGlucHV0cy4KLSAgICBDQUxMX1NVQlRFU1QoIHRlc3RfYWRkKEVpZ2VuOjpWZWN0b3IzZigpKSApOwotICAgIENBTExfU1VCVEVTVCggdGVzdF9hZGQoRWlnZW46Ok1hdHJpeDNkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUKCB0ZXN0X2FkZChFaWdlbjo6TWF0cml4WDxpbnQ+KDEwLCAxMCkpICk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3RfYWRkKEVpZ2VuOjpWZWN0b3IzZigpKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3RfYWRkKEVpZ2VuOjpNYXRyaXgzZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3RfYWRkKEVpZ2VuOjpNYXRyaXhYPGludD4oMTAsIDEwKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUKCB0ZXN0X2FkZChFaWdlbjo6QXJyYXk0NGYoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIHRlc3RfYWRkKEVpZ2VuOjpBcnJheVhkKDIwKSkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIHRlc3RfYWRkKEVpZ2VuOjpBcnJheVhYaSgxMywgMTcpKSApOworICAgIENBTExfU1VCVEVTVCh0ZXN0X2FkZChFaWdlbjo6QXJyYXk0NGYoKSkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0X2FkZChFaWdlbjo6QXJyYXlYZCgyMCkpKTsKKyAgICBDQUxMX1NVQlRFU1QodGVzdF9hZGQoRWlnZW46OkFycmF5WFhpKDEzLCAxNykpKTsKIAotICAgIENBTExfU1VCVEVTVCggdGVzdF9tdWx0aXBseShFaWdlbjo6TWF0cml4M2QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWlnZW46Ok1hdHJpeDNkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjpNYXRyaXgzZCgpKSApOwotICAgIENBTExfU1VCVEVTVCggdGVzdF9tdWx0aXBseShFaWdlbjo6TWF0cml4WDxpbnQ+KDEwLCAxMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjpNYXRyaXhYPGludD4oMTAsIDEwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWlnZW46Ok1hdHJpeFg8aW50PigpKSApOwotICAgIENBTExfU1VCVEVTVCggdGVzdF9tdWx0aXBseShFaWdlbjo6TWF0cml4WGYoMTIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6TWF0cml4WGYoMSwgMzIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6TWF0cml4WGYoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1QodGVzdF9tdWx0aXBseShFaWdlbjo6TWF0cml4M2QoKSwgRWlnZW46Ok1hdHJpeDNkKCksIEVpZ2VuOjpNYXRyaXgzZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3RfbXVsdGlwbHkoRWlnZW46Ok1hdHJpeFg8aW50PigxMCwgMTApLCBFaWdlbjo6TWF0cml4WDxpbnQ+KDEwLCAxMCksIEVpZ2VuOjpNYXRyaXhYPGludD4oKSkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0X211bHRpcGx5KEVpZ2VuOjpNYXRyaXhYZigxMiwgMSksIEVpZ2VuOjpNYXRyaXhYZigxLCAzMiksIEVpZ2VuOjpNYXRyaXhYZigpKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ3B1X3Rlc3RfaGVscGVyLmggYi90ZXN0L2dwdV90ZXN0X2hlbHBlci5oCmluZGV4IGNhOTM3OGIuLmJiZjc2NmQgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ3B1X3Rlc3RfaGVscGVyLmgKKysrIGIvdGVzdC9ncHVfdGVzdF9oZWxwZXIuaApAQCAtMjksMjAgKzI5LDIwIEBACiBuYW1lc3BhY2UgdGVzdF9kZXRhaWwgewogLy8gVXNlIHN0ZDo6dHVwbGUgb24gQ1BVLCBvdGhlcndpc2UgdXNlIHRoZSBHUFUtc3BlY2lmaWMgdmVyc2lvbnMuCiAjaWYgIUVJR0VOX1VTRV9DVVNUT01fVFVQTEUKLXVzaW5nIHN0ZDo6dHVwbGU7CiB1c2luZyBzdGQ6OmdldDsKIHVzaW5nIHN0ZDo6bWFrZV90dXBsZTsKIHVzaW5nIHN0ZDo6dGllOwordXNpbmcgc3RkOjp0dXBsZTsKICNlbHNlCi11c2luZyB0dXBsZV9pbXBsOjp0dXBsZTsKIHVzaW5nIHR1cGxlX2ltcGw6OmdldDsKIHVzaW5nIHR1cGxlX2ltcGw6Om1ha2VfdHVwbGU7CiB1c2luZyB0dXBsZV9pbXBsOjp0aWU7Cit1c2luZyB0dXBsZV9pbXBsOjp0dXBsZTsKICNlbmRpZgogI3VuZGVmIEVJR0VOX1VTRV9DVVNUT01fVFVQTEUKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0X2RldGFpbAogCi10ZW1wbGF0ZTxzaXplX3QgTiwgc2l6ZV90IElkeCwgdHlwZW5hbWUgT3V0cHV0SW5kZXhTZXF1ZW5jZSwgdHlwZW5hbWUuLi4gVHM+Cit0ZW1wbGF0ZSA8c2l6ZV90IE4sIHNpemVfdCBJZHgsIHR5cGVuYW1lIE91dHB1dEluZGV4U2VxdWVuY2UsIHR5cGVuYW1lLi4uIFRzPgogc3RydWN0IGV4dHJhY3Rfb3V0cHV0X2luZGljZXNfaGVscGVyOwogCiAvKioKQEAgLTU2LDcwICs1Niw2MyBAQAogICogXHRwYXJhbSBUMSB0aGUgbmV4dCB0eXBlIHRvIGNvbnNpZGVyLCB3aXRoIGluZGV4IElkeC4KICAqIFx0cGFyYW0gVHMgdGhlIHJlbWFpbmluZyB0eXBlcy4KICAqLwotdGVtcGxhdGU8c2l6ZV90IE4sIHNpemVfdCBJZHgsIHNpemVfdC4uLiBPdXRwdXRJbmRpY2VzLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUuLi4gVHM+Cit0ZW1wbGF0ZSA8c2l6ZV90IE4sIHNpemVfdCBJZHgsIHNpemVfdC4uLiBPdXRwdXRJbmRpY2VzLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUuLi4gVHM+CiBzdHJ1Y3QgZXh0cmFjdF9vdXRwdXRfaW5kaWNlc19oZWxwZXI8TiwgSWR4LCBzdGQ6OmluZGV4X3NlcXVlbmNlPE91dHB1dEluZGljZXMuLi4+LCBUMSwgVHMuLi4+IHsKLSAgdXNpbmcgdHlwZSA9IHR5cGVuYW1lCi0gICAgZXh0cmFjdF9vdXRwdXRfaW5kaWNlc19oZWxwZXI8CisgIHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBleHRyYWN0X291dHB1dF9pbmRpY2VzX2hlbHBlcjwKICAgICAgIE4gLSAxLCBJZHggKyAxLAogICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDwKLSAgICAgICAgLy8gSWYgaXMgYSBub24tY29uc3QgbC12YWx1ZSByZWZlcmVuY2UsIGFwcGVuZCBpbmRleC4KLSAgICAgICAgc3RkOjppc19sdmFsdWVfcmVmZXJlbmNlPFQxPjo6dmFsdWUgCi0gICAgICAgICAgJiYgIXN0ZDo6aXNfY29uc3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8VDE+Pjo6dmFsdWUsCi0gICAgICAgIHN0ZDo6aW5kZXhfc2VxdWVuY2U8T3V0cHV0SW5kaWNlcy4uLiwgSWR4PiwKLSAgICAgICAgc3RkOjppbmRleF9zZXF1ZW5jZTxPdXRwdXRJbmRpY2VzLi4uPiA+Ojp0eXBlLAorICAgICAgICAgIC8vIElmIGlzIGEgbm9uLWNvbnN0IGwtdmFsdWUgcmVmZXJlbmNlLCBhcHBlbmQgaW5kZXguCisgICAgICAgICAgc3RkOjppc19sdmFsdWVfcmVmZXJlbmNlPFQxPjo6dmFsdWUgJiYgIXN0ZDo6aXNfY29uc3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8VDE+Pjo6dmFsdWUsCisgICAgICAgICAgc3RkOjppbmRleF9zZXF1ZW5jZTxPdXRwdXRJbmRpY2VzLi4uLCBJZHg+LCBzdGQ6OmluZGV4X3NlcXVlbmNlPE91dHB1dEluZGljZXMuLi4+Pjo6dHlwZSwKICAgICAgIFRzLi4uPjo6dHlwZTsKIH07CiAKIC8vIEJhc2UgY2FzZS4KLXRlbXBsYXRlPHNpemVfdCBJZHgsIHNpemVfdC4uLiBPdXRwdXRJbmRpY2VzPgotc3RydWN0IGV4dHJhY3Rfb3V0cHV0X2luZGljZXNfaGVscGVyPDAsIElkeCwgc3RkOjppbmRleF9zZXF1ZW5jZTxPdXRwdXRJbmRpY2VzLi4uPiA+IHsKK3RlbXBsYXRlIDxzaXplX3QgSWR4LCBzaXplX3QuLi4gT3V0cHV0SW5kaWNlcz4KK3N0cnVjdCBleHRyYWN0X291dHB1dF9pbmRpY2VzX2hlbHBlcjwwLCBJZHgsIHN0ZDo6aW5kZXhfc2VxdWVuY2U8T3V0cHV0SW5kaWNlcy4uLj4+IHsKICAgdXNpbmcgdHlwZSA9IHN0ZDo6aW5kZXhfc2VxdWVuY2U8T3V0cHV0SW5kaWNlcy4uLj47CiB9OwogCiAvLyBFeHRyYWN0cyBhIHNldCBvZiBpbmRpY2VzIGludG8gVHlwZXMuLi4gdGhhdCBjb3JyZXNwb25kIHRvIG5vbi1jb25zdAogLy8gbC12YWx1ZSByZWZlcmVuY2VzLgotdGVtcGxhdGU8dHlwZW5hbWUuLi4gVHlwZXM+Ci11c2luZyBleHRyYWN0X291dHB1dF9pbmRpY2VzID0gdHlwZW5hbWUgZXh0cmFjdF9vdXRwdXRfaW5kaWNlc19oZWxwZXI8c2l6ZW9mLi4uKFR5cGVzKSwgMCwgc3RkOjppbmRleF9zZXF1ZW5jZTw+LCBUeXBlcy4uLj46OnR5cGU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHlwZXM+Cit1c2luZyBleHRyYWN0X291dHB1dF9pbmRpY2VzID0KKyAgICB0eXBlbmFtZSBleHRyYWN0X291dHB1dF9pbmRpY2VzX2hlbHBlcjxzaXplb2YuLi4oVHlwZXMpLCAwLCBzdGQ6OmluZGV4X3NlcXVlbmNlPD4sIFR5cGVzLi4uPjo6dHlwZTsKIAogLy8gSGVscGVyIHN0cnVjdCBmb3IgZGVhbGluZyB3aXRoIEdlbmVyaWMgZnVuY3RvcnMgdGhhdCBtYXkgcmV0dXJuIHZvaWQuCiBzdHJ1Y3Qgdm9pZF9oZWxwZXIgewogICBzdHJ1Y3QgVm9pZCB7fTsKLSAgCisKICAgLy8gQ29udmVydHMgdm9pZCAtPiBWb2lkLCBUIG90aGVyd2lzZS4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgIHVzaW5nIFJldHVyblR5cGUgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPHN0ZDo6aXNfc2FtZTxULCB2b2lkPjo6dmFsdWUsIFZvaWQsIFQ+Ojp0eXBlOwotICAKKwogICAvLyBOb24tdm9pZCByZXR1cm4gdmFsdWUuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gIHN0YXRpYyBFSUdFTl9BTFdBWVNfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DCi0gIGF1dG8gY2FsbChGdW5jJiYgZnVuYywgQXJncyYmLi4uIGFyZ3MpIC0+IAotICAgICAgc3RkOjplbmFibGVfaWZfdDwhc3RkOjppc19zYW1lPGRlY2x0eXBlKGZ1bmMoYXJncy4uLikpLCB2b2lkPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKGZ1bmMoYXJncy4uLikpPiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZS4uLiBBcmdzPgorICBzdGF0aWMgRUlHRU5fQUxXQVlTX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQyBhdXRvIGNhbGwoRnVuYyYmIGZ1bmMsIEFyZ3MmJi4uLiBhcmdzKQorICAgICAgLT4gc3RkOjplbmFibGVfaWZfdDwhc3RkOjppc19zYW1lPGRlY2x0eXBlKGZ1bmMoYXJncy4uLikpLCB2b2lkPjo6dmFsdWUsIGRlY2x0eXBlKGZ1bmMoYXJncy4uLikpPiB7CiAgICAgcmV0dXJuIGZ1bmMoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKICAgfQotICAKKwogICAvLyBWb2lkIHJldHVybiB2YWx1ZS4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUuLi4gQXJncz4KLSAgc3RhdGljIEVJR0VOX0FMV0FZU19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMKLSAgYXV0byBjYWxsKEZ1bmMmJiBmdW5jLCBBcmdzJiYuLi4gYXJncykgLT4gCi0gICAgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoZnVuYyhhcmdzLi4uKSksIHZvaWQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgIFZvaWQ+IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lLi4uIEFyZ3M+CisgIHN0YXRpYyBFSUdFTl9BTFdBWVNfSU5MSU5FIEVJR0VOX0RFVklDRV9GVU5DIGF1dG8gY2FsbChGdW5jJiYgZnVuYywgQXJncyYmLi4uIGFyZ3MpCisgICAgICAtPiBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShmdW5jKGFyZ3MuLi4pKSwgdm9pZD46OnZhbHVlLCBWb2lkPiB7CiAgICAgZnVuYyhzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwogICAgIHJldHVybiBWb2lke307CiAgIH0KLSAgCisKICAgLy8gUmVzdG9yZXMgdGhlIG9yaWdpbmFsIHJldHVybiB0eXBlLCBWb2lkIC0+IHZvaWQsIFQgb3RoZXJ3aXNlLgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgc3RhdGljIEVJR0VOX0FMV0FZU19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMKLSAgc3RkOjplbmFibGVfaWZfdDwhc3RkOjppc19zYW1lPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGUsIFZvaWQ+Ojp2YWx1ZSwgVD4KLSAgcmVzdG9yZShUJiYgdmFsKSB7CisgICAgICBzdGQ6OmVuYWJsZV9pZl90PCFzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgc3RkOjpkZWNheTxUPjo6dHlwZSwgVm9pZD46OnZhbHVlLCBUPgorICAgICAgcmVzdG9yZShUJiYgdmFsKSB7CiAgICAgcmV0dXJuIHZhbDsKICAgfQotICAKKwogICAvLyBWb2lkIGNhc2UuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSB2b2lkPgotICBzdGF0aWMgRUlHRU5fQUxXQVlTX0lOTElORSBFSUdFTl9ERVZJQ0VfRlVOQwotICB2b2lkIHJlc3RvcmUoY29uc3QgVm9pZCYpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gdm9pZD4KKyAgc3RhdGljIEVJR0VOX0FMV0FZU19JTkxJTkUgRUlHRU5fREVWSUNFX0ZVTkMgdm9pZCByZXN0b3JlKGNvbnN0IFZvaWQmKSB7fQogfTsKIAogLy8gUnVucyBhIGtlcm5lbCB2aWEgc2VyaWFsaXplZCBidWZmZXIuICBEb2VzIHRoaXMgYnkgZGVzZXJpYWxpemluZyB0aGUgYnVmZmVyCkBAIC0xMzAsMTAgKzEyMyw5IEBACiAvLyAgICAgWyBvdXRwdXRfYnVmZmVyX3NpemUsIG91dHB1dF9wYXJhbWV0ZXJzLCByZXR1cm5fdmFsdWUgXQogLy8gSWYgdGhlIG91dHB1dF9idWZmZXJfc2l6ZSBleGNlZWRzIHRoZSBidWZmZXIncyBjYXBhY2l0eSwgdGhlbiBvbmx5IHRoZQogLy8gb3V0cHV0X2J1ZmZlcl9zaXplIGlzIHBvcHVsYXRlZC4KLXRlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbCwgdHlwZW5hbWUuLi4gQXJncywgc2l6ZV90Li4uIEluZGljZXMsIHNpemVfdC4uLiBPdXRwdXRJbmRpY2VzPgotRUlHRU5fREVWSUNFX0ZVTkMKLXZvaWQgcnVuX3NlcmlhbGl6ZWQoc3RkOjppbmRleF9zZXF1ZW5jZTxJbmRpY2VzLi4uPiwgc3RkOjppbmRleF9zZXF1ZW5jZTxPdXRwdXRJbmRpY2VzLi4uPiwKLSAgICAgICAgICAgICAgICAgICAgS2VybmVsIGtlcm5lbCwgdWludDhfdCogYnVmZmVyLCBzaXplX3QgY2FwYWNpdHkpIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXJuZWwsIHR5cGVuYW1lLi4uIEFyZ3MsIHNpemVfdC4uLiBJbmRpY2VzLCBzaXplX3QuLi4gT3V0cHV0SW5kaWNlcz4KK0VJR0VOX0RFVklDRV9GVU5DIHZvaWQgcnVuX3NlcmlhbGl6ZWQoc3RkOjppbmRleF9zZXF1ZW5jZTxJbmRpY2VzLi4uPiwgc3RkOjppbmRleF9zZXF1ZW5jZTxPdXRwdXRJbmRpY2VzLi4uPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2VybmVsIGtlcm5lbCwgdWludDhfdCogYnVmZmVyLCBzaXplX3QgY2FwYWNpdHkpIHsKICAgdXNpbmcgdGVzdF9kZXRhaWw6OmdldDsKICAgdXNpbmcgdGVzdF9kZXRhaWw6Om1ha2VfdHVwbGU7CiAgIHVzaW5nIHRlc3RfZGV0YWlsOjp0dXBsZTsKQEAgLTE0NCwxOSArMTM2LDE5IEBACiAgIHJlYWRfcHRyID0gRWlnZW46OmRlc2VyaWFsaXplKHJlYWRfcHRyLCByZWFkX2VuZCwgaW5wdXRfc2l6ZSk7CiAgIC8vIENyZWF0ZSB2YWx1ZS10eXBlIGluc3RhbmNlcyB0byBwb3B1bGF0ZS4KICAgYXV0byBhcmdzID0gbWFrZV90dXBsZSh0eXBlbmFtZSBzdGQ6OmRlY2F5PEFyZ3M+Ojp0eXBle30uLi4pOwotICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoYXJncykgLy8gQXZvaWQgTlZDQyBjb21waWxlIHdhcm5pbmcuCisgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShhcmdzKSAgLy8gQXZvaWQgTlZDQyBjb21waWxlIHdhcm5pbmcuCiAgIC8vIE5WQ0MgOS4xIHJlcXVpcmVzIHVzIHRvIHNwZWxsIG91dCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBleHBsaWNpdGx5LgogICByZWFkX3B0ciA9IEVpZ2VuOjpkZXNlcmlhbGl6ZShyZWFkX3B0ciwgcmVhZF9lbmQsIGdldDxJbmRpY2VzLCB0eXBlbmFtZSBzdGQ6OmRlY2F5PEFyZ3M+Ojp0eXBlLi4uPihhcmdzKS4uLik7Ci0gIAorCiAgIC8vIENhbGwgZnVuY3Rpb24sIHdpdGggdm9pZC0+Vm9pZCBjb252ZXJzaW9uIHNvIHdlIGFyZSBndWFyYW50ZWVkIGEgY29tcGxldGUKICAgLy8gb3V0cHV0IHR5cGUuCiAgIGF1dG8gcmVzdWx0ID0gdm9pZF9oZWxwZXI6OmNhbGwoa2VybmVsLCBnZXQ8SW5kaWNlcywgdHlwZW5hbWUgc3RkOjpkZWNheTxBcmdzPjo6dHlwZS4uLj4oYXJncykuLi4pOwotICAKKwogICAvLyBEZXRlcm1pbmUgcmVxdWlyZWQgb3V0cHV0IHNpemUuCiAgIHNpemVfdCBvdXRwdXRfc2l6ZSA9IEVpZ2VuOjpzZXJpYWxpemVfc2l6ZShjYXBhY2l0eSk7CiAgIG91dHB1dF9zaXplICs9IEVpZ2VuOjpzZXJpYWxpemVfc2l6ZShnZXQ8T3V0cHV0SW5kaWNlcywgdHlwZW5hbWUgc3RkOjpkZWNheTxBcmdzPjo6dHlwZS4uLj4oYXJncykuLi4pOwogICBvdXRwdXRfc2l6ZSArPSBFaWdlbjo6c2VyaWFsaXplX3NpemUocmVzdWx0KTsKLSAgCisKICAgLy8gQWx3YXlzIHNlcmlhbGl6ZSByZXF1aXJlZCBidWZmZXIgc2l6ZS4KICAgdWludDhfdCogd3JpdGVfcHRyID0gYnVmZmVyOwogICB1aW50OF90KiB3cml0ZV9lbmQgPSBidWZmZXIgKyBjYXBhY2l0eTsKQEAgLTE3MCw0OCArMTYyLDQ0IEBACiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsLCB0eXBlbmFtZS4uLiBBcmdzPgotRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORQotdm9pZCBydW5fc2VyaWFsaXplZChLZXJuZWwga2VybmVsLCB1aW50OF90KiBidWZmZXIsIHNpemVfdCBjYXBhY2l0eSkgewotICBydW5fc2VyaWFsaXplZDxLZXJuZWwsIEFyZ3MuLi4+IChzdGQ6Om1ha2VfaW5kZXhfc2VxdWVuY2U8c2l6ZW9mLi4uKEFyZ3MpPnt9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0X291dHB1dF9pbmRpY2VzPEFyZ3MuLi4+e30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbCwgYnVmZmVyLCBjYXBhY2l0eSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2VybmVsLCB0eXBlbmFtZS4uLiBBcmdzPgorRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJ1bl9zZXJpYWxpemVkKEtlcm5lbCBrZXJuZWwsIHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGNhcGFjaXR5KSB7CisgIHJ1bl9zZXJpYWxpemVkPEtlcm5lbCwgQXJncy4uLj4oc3RkOjptYWtlX2luZGV4X3NlcXVlbmNlPHNpemVvZi4uLihBcmdzKT57fSwgZXh0cmFjdF9vdXRwdXRfaW5kaWNlczxBcmdzLi4uPnt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbCwgYnVmZmVyLCBjYXBhY2l0eSk7CiB9CiAKICNpZmRlZiBFSUdFTl9HUFVDQwogCiAvLyBDaGVja3MgZm9yIEdQVSBlcnJvcnMgYW5kIGFzc2VydHMgLyBwcmludHMgdGhlIGVycm9yIG1lc3NhZ2UuCi0jZGVmaW5lIEdQVV9DSEVDSyhleHByKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBncHVFcnJvcl90IGVyciA9IGV4cHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChlcnIgIT0gZ3B1U3VjY2VzcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGYoIiVzOiAlc1xuIiwgZ3B1R2V0RXJyb3JOYW1lKGVyciksIGdwdUdldEVycm9yU3RyaW5nKGVycikpOyAgXAotICAgIGdwdV9hc3NlcnQoZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUoMCkKKyNkZWZpbmUgR1BVX0NIRUNLKGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBncHVFcnJvcl90IGVyciA9IGV4cHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZXJyICE9IGdwdVN1Y2Nlc3MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHByaW50ZigiJXM6ICVzXG4iLCBncHVHZXRFcnJvck5hbWUoZXJyKSwgZ3B1R2V0RXJyb3JTdHJpbmcoZXJyKSk7IFwKKyAgICAgIGdwdV9hc3NlcnQoZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKIAogLy8gQ2FsbHMgcnVuX3NlcmlhbGl6ZWQgb24gdGhlIEdQVS4KLXRlbXBsYXRlPHR5cGVuYW1lIEtlcm5lbCwgdHlwZW5hbWUuLi4gQXJncz4KLV9fZ2xvYmFsX18KLUVJR0VOX0hJUF9MQVVOQ0hfQk9VTkRTXzEwMjQKLXZvaWQgcnVuX3NlcmlhbGl6ZWRfb25fZ3B1X21ldGFfa2VybmVsKGNvbnN0IEtlcm5lbCBrZXJuZWwsIHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGNhcGFjaXR5KSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2VybmVsLCB0eXBlbmFtZS4uLiBBcmdzPgorX19nbG9iYWxfXyBFSUdFTl9ISVBfTEFVTkNIX0JPVU5EU18xMDI0IHZvaWQgcnVuX3NlcmlhbGl6ZWRfb25fZ3B1X21ldGFfa2VybmVsKGNvbnN0IEtlcm5lbCBrZXJuZWwsIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY2FwYWNpdHkpIHsKICAgcnVuX3NlcmlhbGl6ZWQ8S2VybmVsLCBBcmdzLi4uPihrZXJuZWwsIGJ1ZmZlciwgY2FwYWNpdHkpOwogfQogCi0vLyBSdW5zIGtlcm5lbChhcmdzLi4uKSBvbiB0aGUgR1BVIHZpYSB0aGUgc2VyaWFsaXphdGlvbiBtZWNoYW5pc20uIAorLy8gUnVucyBrZXJuZWwoYXJncy4uLikgb24gdGhlIEdQVSB2aWEgdGhlIHNlcmlhbGl6YXRpb24gbWVjaGFuaXNtLgogLy8KIC8vIE5vdGU6IHRoaXMgbWF5IGVuZCB1cCBjYWxsaW5nIHRoZSBrZXJuZWwgbXVsdGlwbGUgdGltZXMgaWYgdGhlIGluaXRpYWwgb3V0cHV0CiAvLyBidWZmZXIgaXMgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBvdXRwdXRzLgotdGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsLCB0eXBlbmFtZS4uLiBBcmdzLCBzaXplX3QuLi4gSW5kaWNlcywgc2l6ZV90Li4uIE91dHB1dEluZGljZXM+Ci1hdXRvIHJ1bl9zZXJpYWxpemVkX29uX2dwdShzaXplX3QgYnVmZmVyX2NhcGFjaXR5X2hpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluZGV4X3NlcXVlbmNlPEluZGljZXMuLi4+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbmRleF9zZXF1ZW5jZTxPdXRwdXRJbmRpY2VzLi4uPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEtlcm5lbCBrZXJuZWwsIEFyZ3MmJi4uLiBhcmdzKSAtPiBkZWNsdHlwZShrZXJuZWwoYXJncy4uLikpIHsgIAordGVtcGxhdGUgPHR5cGVuYW1lIEtlcm5lbCwgdHlwZW5hbWUuLi4gQXJncywgc2l6ZV90Li4uIEluZGljZXMsIHNpemVfdC4uLiBPdXRwdXRJbmRpY2VzPgorYXV0byBydW5fc2VyaWFsaXplZF9vbl9ncHUoc2l6ZV90IGJ1ZmZlcl9jYXBhY2l0eV9oaW50LCBzdGQ6OmluZGV4X3NlcXVlbmNlPEluZGljZXMuLi4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbmRleF9zZXF1ZW5jZTxPdXRwdXRJbmRpY2VzLi4uPiwgS2VybmVsIGtlcm5lbCwgQXJncyYmLi4uIGFyZ3MpCisgICAgLT4gZGVjbHR5cGUoa2VybmVsKGFyZ3MuLi4pKSB7CiAgIC8vIENvbXB1dGUgdGhlIHJlcXVpcmVkIHNlcmlhbGl6YXRpb24gYnVmZmVyIGNhcGFjaXR5LgogICAvLyBSb3VuZCB1cCBpbnB1dCBzaXplIHRvIG5leHQgcG93ZXIgb2YgdHdvIHRvIGdpdmUgYSBsaXR0bGUgZXh0cmEgcm9vbQogICAvLyBmb3Igb3V0cHV0cy4KICAgc2l6ZV90IGlucHV0X2RhdGFfc2l6ZSA9IHNpemVvZihzaXplX3QpICsgRWlnZW46OnNlcmlhbGl6ZV9zaXplKGFyZ3MuLi4pOwotICAKKwogICBzaXplX3QgY2FwYWNpdHk7CiAgIGlmIChidWZmZXJfY2FwYWNpdHlfaGludCA9PSAwKSB7CiAgICAgLy8gRXN0aW1hdGUgYXMgdGhlIHBvd2VyIG9mIHR3byBsYXJnZXIgdGhhbiB0aGUgdG90YWwgaW5wdXQgc2l6ZS4KQEAgLTIyMywxNyArMjExLDE2IEBACiAgICAgLy8gVXNlIHRoZSBsYXJnZXIgb2YgdGhlIGhpbnQgYW5kIHRoZSB0b3RhbCBpbnB1dCBzaXplLgogICAgIC8vIEFkZCBzaXplb2Yoc2l6ZV90KSB0byB0aGUgaGludCB0byBhY2NvdW50IGZvciBzdG9yaW5nIHRoZSBidWZmZXIgY2FwYWNpdHkKICAgICAvLyBpdHNlbGYgc28gdGhlIHVzZXIgZG9lc24ndCBuZWVkIHRvIHRoaW5rIGFib3V0IHRoaXMuCi0gICAgY2FwYWNpdHkgPSBzdGQ6Om1heDxzaXplX3Q+KGJ1ZmZlcl9jYXBhY2l0eV9oaW50ICsgc2l6ZW9mKHNpemVfdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2RhdGFfc2l6ZSk7CisgICAgY2FwYWNpdHkgPSBzdGQ6Om1heDxzaXplX3Q+KGJ1ZmZlcl9jYXBhY2l0eV9oaW50ICsgc2l6ZW9mKHNpemVfdCksIGlucHV0X2RhdGFfc2l6ZSk7CiAgIH0KICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyKGNhcGFjaXR5KTsKLSAgCisKICAgdWludDhfdCogaG9zdF9kYXRhID0gbnVsbHB0cjsKICAgdWludDhfdCogaG9zdF9kYXRhX2VuZCA9IG51bGxwdHI7CiAgIHVpbnQ4X3QqIGhvc3RfcHRyID0gbnVsbHB0cjsKICAgdWludDhfdCogZGV2aWNlX2RhdGEgPSBudWxscHRyOwogICBzaXplX3Qgb3V0cHV0X2RhdGFfc2l6ZSA9IDA7Ci0gIAorCiAgIC8vIEFsbG9jYXRlIGJ1ZmZlcnMgYW5kIGNvcHkgaW5wdXQgZGF0YS4KICAgY2FwYWNpdHkgPSBzdGQ6Om1heDxzaXplX3Q+KGNhcGFjaXR5LCBvdXRwdXRfZGF0YV9zaXplKTsKICAgYnVmZmVyLnJlc2l6ZShjYXBhY2l0eSk7CkBAIC0yNDEsMjEgKzIyOCwxOSBAQAogICBob3N0X2RhdGFfZW5kID0gYnVmZmVyLmRhdGEoKSArIGNhcGFjaXR5OwogICBob3N0X3B0ciA9IEVpZ2VuOjpzZXJpYWxpemUoaG9zdF9kYXRhLCBob3N0X2RhdGFfZW5kLCBpbnB1dF9kYXRhX3NpemUpOwogICBob3N0X3B0ciA9IEVpZ2VuOjpzZXJpYWxpemUoaG9zdF9wdHIsIGhvc3RfZGF0YV9lbmQsIGFyZ3MuLi4pOwotICAKKwogICAvLyBDb3B5IGlucHV0cyB0byBob3N0LgogICBncHVNYWxsb2MoKHZvaWQqKikoJmRldmljZV9kYXRhKSwgY2FwYWNpdHkpOwogICBncHVNZW1jcHkoZGV2aWNlX2RhdGEsIGJ1ZmZlci5kYXRhKCksIGlucHV0X2RhdGFfc2l6ZSwgZ3B1TWVtY3B5SG9zdFRvRGV2aWNlKTsKICAgR1BVX0NIRUNLKGdwdURldmljZVN5bmNocm9uaXplKCkpOwotICAgICAgCi0gIC8vIFJ1biBrZXJuZWwuCi0gICNpZmRlZiBFSUdFTl9VU0VfSElQCi0gICAgaGlwTGF1bmNoS2VybmVsR0dMKAotICAgICAgICBISVBfS0VSTkVMX05BTUUocnVuX3NlcmlhbGl6ZWRfb25fZ3B1X21ldGFfa2VybmVsPEtlcm5lbCwgQXJncy4uLj4pLCAKLSAgICAgICAgMSwgMSwgMCwgMCwga2VybmVsLCBkZXZpY2VfZGF0YSwgY2FwYWNpdHkpOwotICAjZWxzZQotICAgIHJ1bl9zZXJpYWxpemVkX29uX2dwdV9tZXRhX2tlcm5lbDxLZXJuZWwsIEFyZ3MuLi4+PDw8MSwxPj4+KAotICAgICAgICBrZXJuZWwsIGRldmljZV9kYXRhLCBjYXBhY2l0eSk7Ci0gICNlbmRpZgorCisvLyBSdW4ga2VybmVsLgorI2lmZGVmIEVJR0VOX1VTRV9ISVAKKyAgaGlwTGF1bmNoS2VybmVsR0dMKEhJUF9LRVJORUxfTkFNRShydW5fc2VyaWFsaXplZF9vbl9ncHVfbWV0YV9rZXJuZWw8S2VybmVsLCBBcmdzLi4uPiksIDEsIDEsIDAsIDAsIGtlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgIGRldmljZV9kYXRhLCBjYXBhY2l0eSk7CisjZWxzZQorICBydW5fc2VyaWFsaXplZF9vbl9ncHVfbWV0YV9rZXJuZWw8S2VybmVsLCBBcmdzLi4uPjw8PDEsIDE+Pj4oa2VybmVsLCBkZXZpY2VfZGF0YSwgY2FwYWNpdHkpOworI2VuZGlmCiAgIC8vIENoZWNrIHByZS1sYXVuY2ggYW5kIGtlcm5lbCBleGVjdXRpb24gZXJyb3JzLgogICBHUFVfQ0hFQ0soZ3B1R2V0TGFzdEVycm9yKCkpOwogICBHUFVfQ0hFQ0soZ3B1RGV2aWNlU3luY2hyb25pemUoKSk7CkBAIC0yNjMsMzQgKzI0OCwzMiBAQAogICBncHVNZW1jcHkoaG9zdF9kYXRhLCBkZXZpY2VfZGF0YSwgY2FwYWNpdHksIGdwdU1lbWNweURldmljZVRvSG9zdCk7CiAgIGdwdUZyZWUoZGV2aWNlX2RhdGEpOwogICBHUFVfQ0hFQ0soZ3B1RGV2aWNlU3luY2hyb25pemUoKSk7Ci0gIAorCiAgIC8vIERldGVybWluZSBvdXRwdXQgYnVmZmVyIHNpemUuCiAgIGNvbnN0IHVpbnQ4X3QqIGNfaG9zdF9wdHIgPSBFaWdlbjo6ZGVzZXJpYWxpemUoaG9zdF9kYXRhLCBob3N0X2RhdGFfZW5kLCBvdXRwdXRfZGF0YV9zaXplKTsKICAgLy8gSWYgdGhlIG91dHB1dCBkb2Vzbid0IGZpdCBpbiB0aGUgYnVmZmVyLCBzcGl0IG91dCB3YXJuaW5nIGFuZCBmYWlsLgogICBpZiAob3V0cHV0X2RhdGFfc2l6ZSA+IGNhcGFjaXR5KSB7Ci0gICAgc3RkOjpjZXJyIDw8ICJUaGUgc2VyaWFsaXplZCBvdXRwdXQgZG9lcyBub3QgZml0IGluIHRoZSBvdXRwdXQgYnVmZmVyLCAiCi0gICAgICAgICAgICAgIDw8IG91dHB1dF9kYXRhX3NpemUgPDwgIiB2cyBjYXBhY2l0eSAiIDw8IGNhcGFjaXR5IDw8ICIuIgotICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGwKKyAgICBzdGQ6OmNlcnIgPDwgIlRoZSBzZXJpYWxpemVkIG91dHB1dCBkb2VzIG5vdCBmaXQgaW4gdGhlIG91dHB1dCBidWZmZXIsICIgPDwgb3V0cHV0X2RhdGFfc2l6ZSA8PCAiIHZzIGNhcGFjaXR5ICIKKyAgICAgICAgICAgICAgPDwgY2FwYWNpdHkgPDwgIi4iIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICAgICA8PCAiVHJ5IHNwZWNpZnlpbmcgYSBtaW5pbXVtIGJ1ZmZlciBjYXBhY2l0eTogIiA8PCBzdGQ6OmVuZGwKLSAgICAgICAgICAgICAgPDwgIiAgcnVuX3dpdGhfaGludCgiIDw8IG91dHB1dF9kYXRhX3NpemUgPDwgIiwgLi4uKSIKLSAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICA8PCAiICBydW5fd2l0aF9oaW50KCIgPDwgb3V0cHV0X2RhdGFfc2l6ZSA8PCAiLCAuLi4pIiA8PCBzdGQ6OmVuZGw7CiAgICAgVkVSSUZZKGZhbHNlKTsKICAgfQotICAKKwogICAvLyBEZXNlcmlhbGl6ZSBvdXRwdXRzLgogICBhdXRvIGFyZ3NfdHVwbGUgPSB0ZXN0X2RldGFpbDo6dGllKGFyZ3MuLi4pOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoYXJnc190dXBsZSkgIC8vIEF2b2lkIE5WQ0MgY29tcGlsZSB3YXJuaW5nLgogICBjX2hvc3RfcHRyID0gRWlnZW46OmRlc2VyaWFsaXplKGNfaG9zdF9wdHIsIGhvc3RfZGF0YV9lbmQsIHRlc3RfZGV0YWlsOjpnZXQ8T3V0cHV0SW5kaWNlcywgQXJncyYuLi4+KGFyZ3NfdHVwbGUpLi4uKTsKLSAgCisKICAgLy8gTWF5YmUgZGVzZXJpYWxpemUgcmV0dXJuIHZhbHVlLCBwcm9wZXJseSBoYW5kbGluZyB2b2lkLgogICB0eXBlbmFtZSB2b2lkX2hlbHBlcjo6UmV0dXJuVHlwZTxkZWNsdHlwZShrZXJuZWwoYXJncy4uLikpPiByZXN1bHQ7CiAgIGNfaG9zdF9wdHIgPSBFaWdlbjo6ZGVzZXJpYWxpemUoY19ob3N0X3B0ciwgaG9zdF9kYXRhX2VuZCwgcmVzdWx0KTsKICAgcmV0dXJuIHZvaWRfaGVscGVyOjpyZXN0b3JlKHJlc3VsdCk7CiB9CiAKLSNlbmRpZiAvLyBFSUdFTl9HUFVDQworI2VuZGlmICAvLyBFSUdFTl9HUFVDQwogCi19IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCiAKIC8qKgogICogUnVucyBhIGtlcm5lbCBvbiB0aGUgQ1BVLCByZXR1cm5pbmcgdGhlIHJlc3VsdHMuCkBAIC0yOTgsOCArMjgxLDggQEAKICAqIFxwYXJhbSBhcmdzIC4uLiBpbnB1dCBhcmd1bWVudHMuCiAgKiBccmV0dXJuIGtlcm5lbChhcmdzLi4uKS4KICAqLwotdGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsLCB0eXBlbmFtZS4uLiBBcmdzPgotYXV0byBydW5fb25fY3B1KEtlcm5lbCBrZXJuZWwsIEFyZ3MmJi4uLiBhcmdzKSAtPiBkZWNsdHlwZShrZXJuZWwoYXJncy4uLikpeyAgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2VybmVsLCB0eXBlbmFtZS4uLiBBcmdzPgorYXV0byBydW5fb25fY3B1KEtlcm5lbCBrZXJuZWwsIEFyZ3MmJi4uLiBhcmdzKSAtPiBkZWNsdHlwZShrZXJuZWwoYXJncy4uLikpIHsKICAgcmV0dXJuIGtlcm5lbChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwogfQogCkBAIC0zMDcsMjMgKzI5MCwyMSBAQAogCiAvKioKICAqIFJ1bnMgYSBrZXJuZWwgb24gdGhlIEdQVSwgcmV0dXJuaW5nIHRoZSByZXN1bHRzLgotICogCisgKgogICogVGhlIGtlcm5lbCBtdXN0IGJlIGFibGUgdG8gYmUgcGFzc2VkIGRpcmVjdGx5IGFzIGFuIGlucHV0IHRvIGEgZ2xvYmFsCiAgKiBmdW5jdGlvbiAoaS5lLiBlbXB0eSBvciBQT0QpLiAgSXRzIGlucHV0cyBtdXN0IGJlICJTZXJpYWxpemFibGUiIHNvIHdlCiAgKiBjYW4gdHJhbnNmZXIgdGhlbSB0byB0aGUgZGV2aWNlLCBhbmQgdGhlIG91dHB1dCBtdXN0IGJlIGEgU2VyaWFsaXphYmxlIHZhbHVlCiAgKiB0eXBlIHNvIGl0IGNhbiBiZSB0cmFuc2ZlcnJlZCBiYWNrIGZyb20gdGhlIGRldmljZS4KLSAqIAorICoKICAqIFxwYXJhbSBrZXJuZWwga2VybmVsIHRvIHJ1bi4KICAqIFxwYXJhbSBhcmdzIC4uLiBpbnB1dCBhcmd1bWVudHMsIG11c3QgYmUgIlNlcmlhbGl6YWJsZSIuCiAgKiBccmV0dXJuIGtlcm5lbChhcmdzLi4uKS4KICAqLwotdGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsLCB0eXBlbmFtZS4uLiBBcmdzPgotYXV0byBydW5fb25fZ3B1KEtlcm5lbCBrZXJuZWwsIEFyZ3MmJi4uLiBhcmdzKSAtPiBkZWNsdHlwZShrZXJuZWwoYXJncy4uLikpeyAgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2VybmVsLCB0eXBlbmFtZS4uLiBBcmdzPgorYXV0byBydW5fb25fZ3B1KEtlcm5lbCBrZXJuZWwsIEFyZ3MmJi4uLiBhcmdzKSAtPiBkZWNsdHlwZShrZXJuZWwoYXJncy4uLikpIHsKICAgcmV0dXJuIGludGVybmFsOjpydW5fc2VyaWFsaXplZF9vbl9ncHU8S2VybmVsLCBBcmdzLi4uPigKLSAgICAgIC8qYnVmZmVyX2NhcGFjaXR5X2hpbnQ9Ki8gMCwKLSAgICAgIHN0ZDo6bWFrZV9pbmRleF9zZXF1ZW5jZTxzaXplb2YuLi4oQXJncyk+e30sCi0gICAgICBpbnRlcm5hbDo6ZXh0cmFjdF9vdXRwdXRfaW5kaWNlczxBcmdzLi4uPnt9LAotICAgICAga2VybmVsLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgICAgLypidWZmZXJfY2FwYWNpdHlfaGludD0qLzAsIHN0ZDo6bWFrZV9pbmRleF9zZXF1ZW5jZTxzaXplb2YuLi4oQXJncyk+e30sCisgICAgICBpbnRlcm5hbDo6ZXh0cmFjdF9vdXRwdXRfaW5kaWNlczxBcmdzLi4uPnt9LCBrZXJuZWwsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CiB9CiAKIC8qKgpAQCAtMzQwLDEzICszMjEsMTAgQEAKICAqIFxyZXR1cm4ga2VybmVsKGFyZ3MuLi4pLgogICogXHNhIHJ1bl9vbl9ncHUKICAqLwotdGVtcGxhdGU8dHlwZW5hbWUgS2VybmVsLCB0eXBlbmFtZS4uLiBBcmdzPgotYXV0byBydW5fb25fZ3B1X3dpdGhfaGludChzaXplX3QgYnVmZmVyX2NhcGFjaXR5X2hpbnQsIAotICAgIEtlcm5lbCBrZXJuZWwsIEFyZ3MmJi4uLiBhcmdzKSAtPiBkZWNsdHlwZShrZXJuZWwoYXJncy4uLikpeyAgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2VybmVsLCB0eXBlbmFtZS4uLiBBcmdzPgorYXV0byBydW5fb25fZ3B1X3dpdGhfaGludChzaXplX3QgYnVmZmVyX2NhcGFjaXR5X2hpbnQsIEtlcm5lbCBrZXJuZWwsIEFyZ3MmJi4uLiBhcmdzKSAtPiBkZWNsdHlwZShrZXJuZWwoYXJncy4uLikpIHsKICAgcmV0dXJuIGludGVybmFsOjpydW5fc2VyaWFsaXplZF9vbl9ncHU8S2VybmVsLCBBcmdzLi4uPigKLSAgICAgIGJ1ZmZlcl9jYXBhY2l0eV9oaW50LAotICAgICAgc3RkOjptYWtlX2luZGV4X3NlcXVlbmNlPHNpemVvZi4uLihBcmdzKT57fSwKLSAgICAgIGludGVybmFsOjpleHRyYWN0X291dHB1dF9pbmRpY2VzPEFyZ3MuLi4+e30sCisgICAgICBidWZmZXJfY2FwYWNpdHlfaGludCwgc3RkOjptYWtlX2luZGV4X3NlcXVlbmNlPHNpemVvZi4uLihBcmdzKT57fSwgaW50ZXJuYWw6OmV4dHJhY3Rfb3V0cHV0X2luZGljZXM8QXJncy4uLj57fSwKICAgICAgIGtlcm5lbCwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKIH0KIApAQCAtMzU5LDE3ICszMzcsMTUgQEAKICAgICBpbnQgY3VkYTsKICAgICBpbnQgaGlwOwogICB9OwotICAKLSAgRUlHRU5fREVWSUNFX0ZVTkMKLSAgSW5mbyBvcGVyYXRvcigpKCkgY29uc3QKLSAgeworCisgIEVJR0VOX0RFVklDRV9GVU5DIEluZm8gb3BlcmF0b3IoKSgpIGNvbnN0IHsKICAgICBJbmZvIGluZm8gPSB7LTEsIC0xfTsKLSAgICAjaWYgZGVmaW5lZChfX0NVREFfQVJDSF9fKQotICAgIGluZm8uY3VkYSA9IHN0YXRpY19jYXN0PGludD4oX19DVURBX0FSQ0hfXyArMCk7Ci0gICAgI2VuZGlmCi0gICAgI2lmIGRlZmluZWQoRUlHRU5fSElQX0RFVklDRV9DT01QSUxFKQotICAgIGluZm8uaGlwID0gc3RhdGljX2Nhc3Q8aW50PihFSUdFTl9ISVBfREVWSUNFX0NPTVBJTEUgKzApOwotICAgICNlbmRpZgorI2lmIGRlZmluZWQoX19DVURBX0FSQ0hfXykKKyAgICBpbmZvLmN1ZGEgPSBzdGF0aWNfY2FzdDxpbnQ+KF9fQ1VEQV9BUkNIX18gKyAwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoRUlHRU5fSElQX0RFVklDRV9DT01QSUxFKQorICAgIGluZm8uaGlwID0gc3RhdGljX2Nhc3Q8aW50PihFSUdFTl9ISVBfREVWSUNFX0NPTVBJTEUgKyAwKTsKKyNlbmRpZgogICAgIHJldHVybiBpbmZvOwogICB9CiB9OwpAQCAtMzc3LDggKzM1Myw3IEBACiAvKioKICAqIFF1ZXJpZXMgYW5kIHByaW50cyB0aGUgY29tcGlsZS10aW1lIGFuZCBydW50aW1lIEdQVSBpbmZvLgogICovCi12b2lkIHByaW50X2dwdV9kZXZpY2VfaW5mbygpCi17Cit2b2lkIHByaW50X2dwdV9kZXZpY2VfaW5mbygpIHsKICAgaW50IGRldmljZSA9IDA7CiAgIGdwdURldmljZVByb3BfdCBkZXZpY2VQcm9wOwogICBncHVHZXREZXZpY2VQcm9wZXJ0aWVzKCZkZXZpY2VQcm9wLCBkZXZpY2UpOwpAQCAtMzg2LDI0ICszNjEsMjQgQEAKICAgYXV0byBpbmZvID0gcnVuX29uX2dwdShDb21waWxlVGltZURldmljZUluZm9LZXJuZWwoKSk7CiAKICAgc3RkOjpjb3V0IDw8ICJHUFUgY29tcGlsZS10aW1lIGluZm86XG4iOwotICAKLSAgI2lmZGVmIEVJR0VOX0NVREFDQworCisjaWZkZWYgRUlHRU5fQ1VEQUNDCiAgIHN0ZDo6Y291dCA8PCAiICBFSUdFTl9DVURBQ0M6ICAgICAgICAgICAgICAgICIgPDwgaW50KEVJR0VOX0NVREFDQykgPDwgc3RkOjplbmRsOwotICAjZW5kaWYKLSAgCi0gICNpZmRlZiBFSUdFTl9DVURBX1NES19WRVIKKyNlbmRpZgorCisjaWZkZWYgRUlHRU5fQ1VEQV9TREtfVkVSCiAgIHN0ZDo6Y291dCA8PCAiICBFSUdFTl9DVURBX1NES19WRVI6ICAgICAgICAgICIgPDwgaW50KEVJR0VOX0NVREFfU0RLX1ZFUikgPDwgc3RkOjplbmRsOwotICAjZW5kaWYKKyNlbmRpZgogCi0gICNpZiBFSUdFTl9DT01QX05WQ0MKKyNpZiBFSUdFTl9DT01QX05WQ0MKICAgc3RkOjpjb3V0IDw8ICIgIEVJR0VOX0NPTVBfTlZDQzogICAgICAgICAgICAgIiA8PCBpbnQoRUlHRU5fQ09NUF9OVkNDKSA8PCBzdGQ6OmVuZGw7Ci0gICNlbmRpZgotICAKLSAgI2lmZGVmIEVJR0VOX0hJUENDCi0gIHN0ZDo6Y291dCA8PCAiICBFSUdFTl9ISVBDQzogICAgICAgICAgICAgICAgICIgPDwgaW50KEVJR0VOX0hJUENDKSA8PCBzdGQ6OmVuZGw7Ci0gICNlbmRpZgorI2VuZGlmCiAKLSAgc3RkOjpjb3V0IDw8ICIgIEVJR0VOX0NVREFfQVJDSDogICAgICAgICAgICAgIiA8PCBpbmZvLmN1ZGEgPDwgc3RkOjplbmRsOyAgCisjaWZkZWYgRUlHRU5fSElQQ0MKKyAgc3RkOjpjb3V0IDw8ICIgIEVJR0VOX0hJUENDOiAgICAgICAgICAgICAgICAgIiA8PCBpbnQoRUlHRU5fSElQQ0MpIDw8IHN0ZDo6ZW5kbDsKKyNlbmRpZgorCisgIHN0ZDo6Y291dCA8PCAiICBFSUdFTl9DVURBX0FSQ0g6ICAgICAgICAgICAgICIgPDwgaW5mby5jdWRhIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8ICIgIEVJR0VOX0hJUF9ERVZJQ0VfQ09NUElMRTogICAgIiA8PCBpbmZvLmhpcCA8PCBzdGQ6OmVuZGw7CiAKICAgc3RkOjpjb3V0IDw8ICJHUFUgZGV2aWNlIGluZm86XG4iOwpAQCAtNDE5LDI0ICszOTQsMjQgQEAKICAgc3RkOjpjb3V0IDw8ICIgIGNvbXB1dGVNb2RlOiAgICAgICAgICAgICAgICAgIiA8PCBkZXZpY2VQcm9wLmNvbXB1dGVNb2RlIDw8IHN0ZDo6ZW5kbDsKIH0KIAotI2VuZGlmIC8vIEVJR0VOX0dQVUNDCisjZW5kaWYgIC8vIEVJR0VOX0dQVUNDCiAKIC8qKgogICogUnVucyBhIGtlcm5lbCBvbiB0aGUgR1BVIChpZiBFSUdFTl9HUFVDQyksIG9yIENQVSBvdGhlcndpc2UuCi0gKiAKKyAqCiAgKiBUaGlzIGlzIHRvIGJldHRlciBzdXBwb3J0IGNyZWF0aW5nIGdlbmVyaWMgdGVzdHMuCi0gKiAKKyAqCiAgKiBUaGUga2VybmVsIG11c3QgYmUgYWJsZSB0byBiZSBwYXNzZWQgZGlyZWN0bHkgYXMgYW4gaW5wdXQgdG8gYSBnbG9iYWwKICAqIGZ1bmN0aW9uIChpLmUuIGVtcHR5IG9yIFBPRCkuICBJdHMgaW5wdXRzIG11c3QgYmUgIlNlcmlhbGl6YWJsZSIgc28gd2UKICAqIGNhbiB0cmFuc2ZlciB0aGVtIHRvIHRoZSBkZXZpY2UsIGFuZCB0aGUgb3V0cHV0IG11c3QgYmUgYSBTZXJpYWxpemFibGUgdmFsdWUKICAqIHR5cGUgc28gaXQgY2FuIGJlIHRyYW5zZmVycmVkIGJhY2sgZnJvbSB0aGUgZGV2aWNlLgotICogCisgKgogICogXHBhcmFtIGtlcm5lbCBrZXJuZWwgdG8gcnVuLgogICogXHBhcmFtIGFyZ3MgLi4uIGlucHV0IGFyZ3VtZW50cywgbXVzdCBiZSAiU2VyaWFsaXphYmxlIi4KICAqIFxyZXR1cm4ga2VybmVsKGFyZ3MuLi4pLgogICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIHR5cGVuYW1lLi4uIEFyZ3M+Ci1hdXRvIHJ1bihLZXJuZWwga2VybmVsLCBBcmdzJiYuLi4gYXJncykgLT4gZGVjbHR5cGUoa2VybmVsKGFyZ3MuLi4pKXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXJuZWwsIHR5cGVuYW1lLi4uIEFyZ3M+CithdXRvIHJ1bihLZXJuZWwga2VybmVsLCBBcmdzJiYuLi4gYXJncykgLT4gZGVjbHR5cGUoa2VybmVsKGFyZ3MuLi4pKSB7CiAjaWZkZWYgRUlHRU5fR1BVQ0MKICAgcmV0dXJuIHJ1bl9vbl9ncHUoa2VybmVsLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwogI2Vsc2UKQEAgLTQ0Niw3ICs0MjEsNyBAQAogCiAvKioKICAqIFJ1bnMgYSBrZXJuZWwgb24gdGhlIEdQVSAoaWYgRUlHRU5fR1BVQ0MpLCBvciBDUFUgb3RoZXJ3aXNlLgotICogCisgKgogICogVGhpcyB2ZXJzaW9uIGFsbG93cyBzcGVjaWZ5aW5nIGEgbWluaW11bSBidWZmZXIgY2FwYWNpdHkgc2l6ZSByZXF1aXJlZCBmb3IKICAqIHNlcmlhbGl6aW5nIHRoZSBwdXRzIHRvIHRyYW5zZmVyIHJlc3VsdHMgZnJvbSBkZXZpY2UgdG8gaG9zdC4gIFVzZSB0aGlzIHdoZW4KICAqIGBydW4oLi4uKWAgZmFpbHMgdG8gZGV0ZXJtaW5lIGFuIGFwcHJvcHJpYXRlIGNhcGFjaXR5IGJ5IGRlZmF1bHQuCkBAIC00NTgsOSArNDMzLDggQEAKICAqIFxyZXR1cm4ga2VybmVsKGFyZ3MuLi4pLgogICogXHNhIHJ1bgogICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBLZXJuZWwsIHR5cGVuYW1lLi4uIEFyZ3M+Ci1hdXRvIHJ1bl93aXRoX2hpbnQoc2l6ZV90IGJ1ZmZlcl9jYXBhY2l0eV9oaW50LAotICAgIEtlcm5lbCBrZXJuZWwsIEFyZ3MmJi4uLiBhcmdzKSAtPiBkZWNsdHlwZShrZXJuZWwoYXJncy4uLikpewordGVtcGxhdGUgPHR5cGVuYW1lIEtlcm5lbCwgdHlwZW5hbWUuLi4gQXJncz4KK2F1dG8gcnVuX3dpdGhfaGludChzaXplX3QgYnVmZmVyX2NhcGFjaXR5X2hpbnQsIEtlcm5lbCBrZXJuZWwsIEFyZ3MmJi4uLiBhcmdzKSAtPiBkZWNsdHlwZShrZXJuZWwoYXJncy4uLikpIHsKICNpZmRlZiBFSUdFTl9HUFVDQwogICByZXR1cm4gcnVuX29uX2dwdV93aXRoX2hpbnQoYnVmZmVyX2NhcGFjaXR5X2hpbnQsIGtlcm5lbCwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKICNlbHNlCkBAIC00NjksNiArNDQzLDYgQEAKICNlbmRpZgogfQogCi19IC8vIG5hbWVzcGFjZSBFaWdlbgorfSAgLy8gbmFtZXNwYWNlIEVpZ2VuCiAKLSNlbmRpZiAvLyBHUFVfVEVTVF9IRUxQRVJfSAorI2VuZGlmICAvLyBHUFVfVEVTVF9IRUxQRVJfSApkaWZmIC0tZ2l0IGEvdGVzdC9oYWxmX2Zsb2F0LmNwcCBiL3Rlc3QvaGFsZl9mbG9hdC5jcHAKaW5kZXggODNiMDU3ZS4uOTBhYzgyNSAxMDA2NDQKLS0tIGEvdGVzdC9oYWxmX2Zsb2F0LmNwcAorKysgYi90ZXN0L2hhbGZfZmxvYXQuY3BwCkBAIC0xOSwyMyArMTksMTQgQEAKIAogdXNpbmcgRWlnZW46OmhhbGY7CiAKLXZvaWQgdGVzdF9jb252ZXJzaW9uKCkKLXsKK3ZvaWQgdGVzdF9jb252ZXJzaW9uKCkgewogICB1c2luZyBFaWdlbjo6aGFsZl9pbXBsOjpfX2hhbGZfcmF3OwogCiAgIC8vIFJvdW5kLXRyaXAgYml0LWNhc3Qgd2l0aCB1aW50MTYuCi0gIFZFUklGWV9JU19FUVVBTCgKLSAgICBudW1leHQ6OmJpdF9jYXN0PGhhbGY+KG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oaGFsZigxLjBmKSkpLAotICAgIGhhbGYoMS4wZikpOwotICBWRVJJRllfSVNfRVFVQUwoCi0gICAgbnVtZXh0OjpiaXRfY2FzdDxoYWxmPihudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KGhhbGYoMC41ZikpKSwKLSAgICBoYWxmKDAuNWYpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKAotICAgIG51bWV4dDo6Yml0X2Nhc3Q8aGFsZj4obnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihoYWxmKC0wLjMzMzMzZikpKSwKLSAgICBoYWxmKC0wLjMzMzMzZikpOwotICAgVkVSSUZZX0lTX0VRVUFMKAotICAgIG51bWV4dDo6Yml0X2Nhc3Q8aGFsZj4obnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihoYWxmKDAuMGYpKSksCi0gICAgaGFsZigwLjBmKSk7CisgIFZFUklGWV9JU19FUVVBTChudW1leHQ6OmJpdF9jYXN0PGhhbGY+KG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oaGFsZigxLjBmKSkpLCBoYWxmKDEuMGYpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG51bWV4dDo6Yml0X2Nhc3Q8aGFsZj4obnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihoYWxmKDAuNWYpKSksIGhhbGYoMC41ZikpOworICBWRVJJRllfSVNfRVFVQUwobnVtZXh0OjpiaXRfY2FzdDxoYWxmPihudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KGhhbGYoLTAuMzMzMzNmKSkpLCBoYWxmKC0wLjMzMzMzZikpOworICBWRVJJRllfSVNfRVFVQUwobnVtZXh0OjpiaXRfY2FzdDxoYWxmPihudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KGhhbGYoMC4wZikpKSwgaGFsZigwLjBmKSk7CiAKICAgLy8gQ29udmVyc2lvbiBmcm9tIGZsb2F0LgogICBWRVJJRllfSEFMRl9CSVRTX0VRVUFMKGhhbGYoMS4wZiksIDB4M2MwMCk7CkBAIC0xMTgsNTMgKzEwOSw1NiBAQAogICBWRVJJRlkoc3RhdGljX2Nhc3Q8Ym9vbD4oaGFsZigtNS45NjA0NmUtMDhmKSkpOwogfQogCi12b2lkIHRlc3RfbnVtdHJhaXRzKCkKLXsKLSAgc3RkOjpjb3V0IDw8ICJlcHNpbG9uICAgICAgID0gIiA8PCBOdW1UcmFpdHM8aGFsZj46OmVwc2lsb24oKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4IDw8IG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oTnVtVHJhaXRzPGhhbGY+OjplcHNpbG9uKCkpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCAiaGlnaGVzdCAgICAgICA9ICIgPDwgTnVtVHJhaXRzPGhhbGY+OjpoaWdoZXN0KCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KE51bVRyYWl0czxoYWxmPjo6aGlnaGVzdCgpKSA8PCAiKSIgPDwgc3RkOjplbmRsOwotICBzdGQ6OmNvdXQgPDwgImxvd2VzdCAgICAgICAgPSAiIDw8IE51bVRyYWl0czxoYWxmPjo6bG93ZXN0KCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KE51bVRyYWl0czxoYWxmPjo6bG93ZXN0KCkpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCAibWluICAgICAgICAgICA9ICIgPDwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46Om1pbikoKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4IDw8IG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oaGFsZigoc3RkOjpudW1lcmljX2xpbWl0czxoYWxmPjo6bWluKSgpKSkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKLSAgc3RkOjpjb3V0IDw8ICJkZW5vcm0gbWluICAgID0gIiA8PCAoc3RkOjpudW1lcmljX2xpbWl0czxoYWxmPjo6ZGVub3JtX21pbikoKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4IDw8IG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oaGFsZigoc3RkOjpudW1lcmljX2xpbWl0czxoYWxmPjo6ZGVub3JtX21pbikoKSkpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCAiaW5maW5pdHkgICAgICA9ICIgPDwgTnVtVHJhaXRzPGhhbGY+OjppbmZpbml0eSgpIDw8ICIgICgweCIgPDwgc3RkOjpoZXggPDwgbnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihOdW1UcmFpdHM8aGFsZj46OmluZmluaXR5KCkpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Ci0gIHN0ZDo6Y291dCA8PCAicXVpZXQgbmFuICAgICA9ICIgPDwgTnVtVHJhaXRzPGhhbGY+OjpxdWlldF9OYU4oKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4IDw8IG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oTnVtVHJhaXRzPGhhbGY+OjpxdWlldF9OYU4oKSkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKLSAgc3RkOjpjb3V0IDw8ICJzaWduYWxpbmcgbmFuID0gIiA8PCBzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjpzaWduYWxpbmdfTmFOKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleCA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OnNpZ25hbGluZ19OYU4oKSkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKK3ZvaWQgdGVzdF9udW10cmFpdHMoKSB7CisgIHN0ZDo6Y291dCA8PCAiZXBzaWxvbiAgICAgICA9ICIgPDwgTnVtVHJhaXRzPGhhbGY+OjplcHNpbG9uKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgPDwgbnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihOdW1UcmFpdHM8aGFsZj46OmVwc2lsb24oKSkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJoaWdoZXN0ICAgICAgID0gIiA8PCBOdW1UcmFpdHM8aGFsZj46OmhpZ2hlc3QoKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KE51bVRyYWl0czxoYWxmPjo6aGlnaGVzdCgpKSA8PCAiKSIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgImxvd2VzdCAgICAgICAgPSAiIDw8IE51bVRyYWl0czxoYWxmPjo6bG93ZXN0KCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgPDwgbnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihOdW1UcmFpdHM8aGFsZj46Omxvd2VzdCgpKSA8PCAiKSIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgIm1pbiAgICAgICAgICAgPSAiIDw8IChzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjptaW4pKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgPDwgbnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihoYWxmKChzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjptaW4pKCkpKSA8PCAiKSIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgImRlbm9ybSBtaW4gICAgPSAiIDw8IChzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjpkZW5vcm1fbWluKSgpIDw8ICIgICgweCIgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgIDw8IG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oaGFsZigoc3RkOjpudW1lcmljX2xpbWl0czxoYWxmPjo6ZGVub3JtX21pbikoKSkpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiaW5maW5pdHkgICAgICA9ICIgPDwgTnVtVHJhaXRzPGhhbGY+OjppbmZpbml0eSgpIDw8ICIgICgweCIgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgIDw8IG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oTnVtVHJhaXRzPGhhbGY+OjppbmZpbml0eSgpKSA8PCAiKSIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgInF1aWV0IG5hbiAgICAgPSAiIDw8IE51bVRyYWl0czxoYWxmPjo6cXVpZXRfTmFOKCkgPDwgIiAgKDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgPDwgbnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihOdW1UcmFpdHM8aGFsZj46OnF1aWV0X05hTigpKSA8PCAiKSIgPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgInNpZ25hbGluZyBuYW4gPSAiIDw8IHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OnNpZ25hbGluZ19OYU4oKSA8PCAiICAoMHgiIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICA8PCBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OnNpZ25hbGluZ19OYU4oKSkgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKIAogICBWRVJJRlkoTnVtVHJhaXRzPGhhbGY+OjpJc1NpZ25lZCk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKAotICAgIG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oc3RkOjpudW1lcmljX2xpbWl0czxoYWxmPjo6aW5maW5pdHkoKSksCi0gICAgbnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihoYWxmKHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSkgKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oc3RkOjpudW1lcmljX2xpbWl0czxoYWxmPjo6aW5maW5pdHkoKSksCisgICAgICAgICAgICAgICAgICBudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KGhhbGYoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpKSk7CiAgIC8vIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhc3RpbmcgYSAzMi1iaXQgTmFOIHRvIDE2LWJpdCBoYXMgYSBwcmVjaXNlCiAgIC8vIGJpdCBwYXR0ZXJuLiAgV2UgdGVzdCB0aGF0IGl0IGlzIGluIGZhY3QgYSBOYU4sIHRoZW4gdGVzdCB0aGUgc2lnbmFsaW5nCiAgIC8vIGJpdCAobXNiIG9mIHNpZ25pZmljYW5kIGlzIDEgZm9yIHF1aWV0LCAwIGZvciBzaWduYWxpbmcpLgogICBjb25zdCBudW1leHQ6OnVpbnQxNl90IEhBTEZfUVVJRVRfQklUID0gMHgwMjAwOwotICBWRVJJRlkoCi0gICAgKG51bWV4dDo6aXNuYW4pKHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OnF1aWV0X05hTigpKQotICAgICYmIChudW1leHQ6OmlzbmFuKShoYWxmKHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKSkpCi0gICAgJiYgKChudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OnF1aWV0X05hTigpKSAmIEhBTEZfUVVJRVRfQklUKSA+IDApCi0gICAgJiYgKChudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KGhhbGYoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpKSkgJiBIQUxGX1FVSUVUX0JJVCkgPiAwKSApOworICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OnF1aWV0X05hTigpKSAmJgorICAgICAgICAgKG51bWV4dDo6aXNuYW4pKGhhbGYoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpKSkgJiYKKyAgICAgICAgICgobnVtZXh0OjpiaXRfY2FzdDxudW1leHQ6OnVpbnQxNl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjpxdWlldF9OYU4oKSkgJiBIQUxGX1FVSUVUX0JJVCkgPiAwKSAmJgorICAgICAgICAgKChudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KGhhbGYoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpKSkgJiBIQUxGX1FVSUVUX0JJVCkgPiAwKSk7CiAgIC8vIEFmdGVyIGEgY2FzdCB0byBoYWxmLCBhIHNpZ25hbGluZyBOYU4gbWF5IGJlY29tZSBub24tc2lnbmFsaW5nCiAgIC8vIChlLmcuIGluIHRoZSBjYXNlIG9mIGNhc3RpbmcgZmxvYXQgdG8gbmF0aXZlIF9fZnAxNikuIFRodXMsIHdlIGNoZWNrIHRoYXQKICAgLy8gYm90aCBhcmUgTmFOLCBhbmQgdGhhdCBvbmx5IHRoZSBgbnVtZXJpY19saW1pdHNgIHZlcnNpb24gaXMgc2lnbmFsaW5nLgotICBWRVJJRlkoCi0gICAgKG51bWV4dDo6aXNuYW4pKHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OnNpZ25hbGluZ19OYU4oKSkKLSAgICAmJiAobnVtZXh0Ojppc25hbikoaGFsZihzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6c2lnbmFsaW5nX05hTigpKSkKLSAgICAmJiAoKG51bWV4dDo6Yml0X2Nhc3Q8bnVtZXh0Ojp1aW50MTZfdD4oc3RkOjpudW1lcmljX2xpbWl0czxoYWxmPjo6c2lnbmFsaW5nX05hTigpKSAmIEhBTEZfUVVJRVRfQklUKSA9PSAwKSApOworICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OnNpZ25hbGluZ19OYU4oKSkgJiYKKyAgICAgICAgIChudW1leHQ6OmlzbmFuKShoYWxmKHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpzaWduYWxpbmdfTmFOKCkpKSAmJgorICAgICAgICAgKChudW1leHQ6OmJpdF9jYXN0PG51bWV4dDo6dWludDE2X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OnNpZ25hbGluZ19OYU4oKSkgJiBIQUxGX1FVSUVUX0JJVCkgPT0gMCkpOwogCi0gIFZFUklGWSggKHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46Om1pbikoKSA+IGhhbGYoMC5mKSApOwotICBWRVJJRlkoIChzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjpkZW5vcm1fbWluKSgpID4gaGFsZigwLmYpICk7Ci0gIFZFUklGWSggKHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46Om1pbikoKS9oYWxmKDIpID4gaGFsZigwLmYpICk7Ci0gIFZFUklGWV9JU19FUVVBTCggKHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OmRlbm9ybV9taW4pKCkvaGFsZigyKSwgaGFsZigwLmYpICk7CisgIFZFUklGWSgoc3RkOjpudW1lcmljX2xpbWl0czxoYWxmPjo6bWluKSgpID4gaGFsZigwLmYpKTsKKyAgVkVSSUZZKChzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjpkZW5vcm1fbWluKSgpID4gaGFsZigwLmYpKTsKKyAgVkVSSUZZKChzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjptaW4pKCkgLyBoYWxmKDIpID4gaGFsZigwLmYpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChzdGQ6Om51bWVyaWNfbGltaXRzPGhhbGY+OjpkZW5vcm1fbWluKSgpIC8gaGFsZigyKSwgaGFsZigwLmYpKTsKIAogICAvLyBUZXN0IHRvIHNlZSB0aGF0IHdlIGFyZSBhYmxlIHRvIGxpbmsgYWdhaW5zdCB0aGUgc3ltYm9scyBmb3IgZGlnaXRzIGFuZAogICAvLyBkaWdpdHMxMC4KICAgdm9sYXRpbGUgY29uc3QgaW50JiBkaWdpdHMxMCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OmRpZ2l0czEwOwogICB2b2xhdGlsZSBjb25zdCBpbnQmIGRpZ2l0cyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aGFsZj46OmRpZ2l0czsKLSAgVkVSSUZZKCAoZGlnaXRzMTApICE9IChkaWdpdHMpICk7CisgIFZFUklGWSgoZGlnaXRzMTApICE9IChkaWdpdHMpKTsKIH0KIAotdm9pZCB0ZXN0X2FyaXRobWV0aWMoKQotewordm9pZCB0ZXN0X2FyaXRobWV0aWMoKSB7CiAgIFZFUklGWV9JU19FUVVBTChmbG9hdChoYWxmKDIpICsgaGFsZigyKSksIDQpOwogICBWRVJJRllfSVNfRVFVQUwoZmxvYXQoaGFsZigyKSArIGhhbGYoLTIpKSwgMCk7CiAgIFZFUklGWV9JU19BUFBST1goZmxvYXQoaGFsZigwLjMzMzMzZikgKyBoYWxmKDAuNjY2NjdmKSksIDEuMGYpOwpAQCAtMTcyLDcgKzE2Niw3IEBACiAgIFZFUklGWV9JU19BUFBST1goZmxvYXQoaGFsZigxLjBmKSAvIGhhbGYoMy4wZikpLCAwLjMzMzMzZik7CiAgIFZFUklGWV9JU19FUVVBTChmbG9hdCgtaGFsZig0MDk2LjBmKSksIC00MDk2LjBmKTsKICAgVkVSSUZZX0lTX0VRVUFMKGZsb2F0KC1oYWxmKC00MDk2LjBmKSksIDQwOTYuMGYpOwotICAKKwogICBoYWxmIHgoMyk7CiAgIGhhbGYgeSA9ICsreDsKICAgVkVSSUZZX0lTX0VRVUFMKHgsIGhhbGYoNCkpOwpAQCAtMTg4LDggKzE4Miw3IEBACiAgIFZFUklGWV9JU19FUVVBTCh5LCBoYWxmKDQpKTsKIH0KIAotdm9pZCB0ZXN0X2NvbXBhcmlzb24oKQotewordm9pZCB0ZXN0X2NvbXBhcmlzb24oKSB7CiAgIFZFUklGWShoYWxmKDEuMGYpID4gaGFsZigwLjVmKSk7CiAgIFZFUklGWShoYWxmKDAuNWYpIDwgaGFsZigxLjBmKSk7CiAgIFZFUklGWSghKGhhbGYoMS4wZikgPCBoYWxmKDAuNWYpKSk7CkBAIC0yMjYsOCArMjE5LDcgQEAKICNlbmRpZgogfQogCi12b2lkIHRlc3RfYmFzaWNfZnVuY3Rpb25zKCkKLXsKK3ZvaWQgdGVzdF9iYXNpY19mdW5jdGlvbnMoKSB7CiAgIGNvbnN0ZXhwciBmbG9hdCBQSSA9IHN0YXRpY19jYXN0PGZsb2F0PihFSUdFTl9QSSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGZsb2F0KG51bWV4dDo6YWJzKGhhbGYoMy41ZikpKSwgMy41Zik7CkBAIC0yNzQsMTUgKzI2NiwxNCBAQAogICBWRVJJRllfSVNfRVFVQUwoZmxvYXQobG9nMXAoaGFsZigwLjBmKSkpLCAwLjBmKTsKICAgVkVSSUZZX0lTX0FQUFJPWChmbG9hdChudW1leHQ6OmxvZzFwKGhhbGYoMTAuMGYpKSksIDIuMzk3ODk1M2YpOwogICBWRVJJRllfSVNfQVBQUk9YKGZsb2F0KGxvZzFwKGhhbGYoMTAuMGYpKSksIDIuMzk3ODk1M2YpOwotICAKKwogICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6Zm1vZChoYWxmKDUuM2YpLCBoYWxmKDIuMGYpKSwgaGFsZigxLjNmKSk7CiAgIFZFUklGWV9JU19BUFBST1goZm1vZChoYWxmKDUuM2YpLCBoYWxmKDIuMGYpKSwgaGFsZigxLjNmKSk7CiAgIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpmbW9kKGhhbGYoLTE4LjVmKSwgaGFsZigtNC4yZikpLCBoYWxmKC0xLjdmKSk7CiAgIFZFUklGWV9JU19BUFBST1goZm1vZChoYWxmKC0xOC41ZiksIGhhbGYoLTQuMmYpKSwgaGFsZigtMS43ZikpOwogfQogCi12b2lkIHRlc3RfdHJpZ29ub21ldHJpY19mdW5jdGlvbnMoKQotewordm9pZCB0ZXN0X3RyaWdvbm9tZXRyaWNfZnVuY3Rpb25zKCkgewogICBjb25zdGV4cHIgZmxvYXQgUEkgPSBzdGF0aWNfY2FzdDxmbG9hdD4oRUlHRU5fUEkpOwogICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6Y29zKGhhbGYoMC4wZikpLCBoYWxmKGNvc2YoMC4wZikpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChjb3MoaGFsZigwLjBmKSksIGhhbGYoY29zZigwLjBmKSkpOwpAQCAtMjk0LDU3ICsyODUsNTQgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnNpbihoYWxmKDAuMGYpKSwgaGFsZihzaW5mKDAuMGYpKSk7CiAgIFZFUklGWV9JU19BUFBST1goc2luKGhhbGYoMC4wZikpLCBoYWxmKHNpbmYoMC4wZikpKTsKICAgLy8gIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpzaW4oaGFsZihQSSkpLCBoYWxmKHNpbmYoUEkpKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpzaW4oaGFsZihQSS8yKSksIGhhbGYoc2luZihQSS8yKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6c2luKGhhbGYoMypQSS8yKSksIGhhbGYoc2luZigzKlBJLzIpKSk7CisgIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpzaW4oaGFsZihQSSAvIDIpKSwgaGFsZihzaW5mKFBJIC8gMikpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnNpbihoYWxmKDMgKiBQSSAvIDIpKSwgaGFsZihzaW5mKDMgKiBQSSAvIDIpKSk7CiAgIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpzaW4oaGFsZigzLjVmKSksIGhhbGYoc2luZigzLjVmKSkpOwogCiAgIFZFUklGWV9JU19BUFBST1gobnVtZXh0Ojp0YW4oaGFsZigwLjBmKSksIGhhbGYodGFuZigwLjBmKSkpOwogICBWRVJJRllfSVNfQVBQUk9YKHRhbihoYWxmKDAuMGYpKSwgaGFsZih0YW5mKDAuMGYpKSk7CiAgIC8vICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6dGFuKGhhbGYoUEkpKSwgaGFsZih0YW5mKFBJKSkpOwogICAvLyAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnRhbihoYWxmKFBJLzIpKSwgaGFsZih0YW5mKFBJLzIpKSk7Ci0gIC8vVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6OnRhbihoYWxmKDMqUEkvMikpLCBoYWxmKHRhbmYoMypQSS8yKSkpOworICAvLyBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6dGFuKGhhbGYoMypQSS8yKSksIGhhbGYodGFuZigzKlBJLzIpKSk7CiAgIFZFUklGWV9JU19BUFBST1gobnVtZXh0Ojp0YW4oaGFsZigzLjVmKSksIGhhbGYodGFuZigzLjVmKSkpOwogfQogCi12b2lkIHRlc3RfYXJyYXkoKQotewotICB0eXBlZGVmIEFycmF5PGhhbGYsMSxEeW5hbWljPiBBcnJheVhoOwotICBJbmRleCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwxMCk7Ci0gIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHNpemUtMSk7Cit2b2lkIHRlc3RfYXJyYXkoKSB7CisgIHR5cGVkZWYgQXJyYXk8aGFsZiwgMSwgRHluYW1pYz4gQXJyYXlYaDsKKyAgSW5kZXggc2l6ZSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIDEwKTsKKyAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHNpemUgLSAxKTsKICAgQXJyYXlYaCBhMSA9IEFycmF5WGg6OlJhbmRvbShzaXplKSwgYTIgPSBBcnJheVhoOjpSYW5kb20oc2l6ZSk7Ci0gIFZFUklGWV9JU19BUFBST1goIGExK2ExLCBoYWxmKDIpKmExICk7Ci0gIFZFUklGWSggKGExLmFicygpID49IGhhbGYoMCkpLmFsbCgpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIChhMSphMSkuc3FydCgpLCBhMS5hYnMoKSApOworICBWRVJJRllfSVNfQVBQUk9YKGExICsgYTEsIGhhbGYoMikgKiBhMSk7CisgIFZFUklGWSgoYTEuYWJzKCkgPj0gaGFsZigwKSkuYWxsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKChhMSAqIGExKS5zcXJ0KCksIGExLmFicygpKTsKIAotICBWRVJJRlkoICgoYTEubWluKShhMikgPD0gKGExLm1heCkoYTIpKS5hbGwoKSApOworICBWRVJJRlkoKChhMS5taW4pKGEyKSA8PSAoYTEubWF4KShhMikpLmFsbCgpKTsKICAgYTEoaSkgPSBoYWxmKC0xMC4pOwotICBWRVJJRllfSVNfRVFVQUwoIGExLm1pbkNvZWZmKCksIGhhbGYoLTEwLikgKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGExLm1pbkNvZWZmKCksIGhhbGYoLTEwLikpOwogICBhMShpKSA9IGhhbGYoMTAuKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCBhMS5tYXhDb2VmZigpLCBoYWxmKDEwLikgKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGExLm1heENvZWZmKCksIGhhbGYoMTAuKSk7CiAKICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAgIHNzIDw8IGExOwogfQogCi12b2lkIHRlc3RfcHJvZHVjdCgpCi17Ci0gIHR5cGVkZWYgTWF0cml4PGhhbGYsRHluYW1pYyxEeW5hbWljPiBNYXRyaXhYaDsKLSAgSW5kZXggcm93cyAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOwotICBJbmRleCBjb2xzICA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSk7Ci0gIEluZGV4IGRlcHRoID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKTsKLSAgTWF0cml4WGggQWggPSBNYXRyaXhYaDo6UmFuZG9tKHJvd3MsZGVwdGgpOwotICBNYXRyaXhYaCBCaCA9IE1hdHJpeFhoOjpSYW5kb20oZGVwdGgsY29scyk7Ci0gIE1hdHJpeFhoIENoID0gTWF0cml4WGg6OlJhbmRvbShyb3dzLGNvbHMpOwordm9pZCB0ZXN0X3Byb2R1Y3QoKSB7CisgIHR5cGVkZWYgTWF0cml4PGhhbGYsIER5bmFtaWMsIER5bmFtaWM+IE1hdHJpeFhoOworICBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgIEluZGV4IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgSW5kZXggZGVwdGggPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgTWF0cml4WGggQWggPSBNYXRyaXhYaDo6UmFuZG9tKHJvd3MsIGRlcHRoKTsKKyAgTWF0cml4WGggQmggPSBNYXRyaXhYaDo6UmFuZG9tKGRlcHRoLCBjb2xzKTsKKyAgTWF0cml4WGggQ2ggPSBNYXRyaXhYaDo6UmFuZG9tKHJvd3MsIGNvbHMpOwogICBNYXRyaXhYZiBBZiA9IEFoLmNhc3Q8ZmxvYXQ+KCk7CiAgIE1hdHJpeFhmIEJmID0gQmguY2FzdDxmbG9hdD4oKTsKICAgTWF0cml4WGYgQ2YgPSBDaC5jYXN0PGZsb2F0PigpOwotICBWRVJJRllfSVNfQVBQUk9YKENoLm5vYWxpYXMoKSs9QWgqQmgsIChDZi5ub2FsaWFzKCkrPUFmKkJmKS5jYXN0PGhhbGY+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKENoLm5vYWxpYXMoKSArPSBBaCAqIEJoLCAoQ2Yubm9hbGlhcygpICs9IEFmICogQmYpLmNhc3Q8aGFsZj4oKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChoYWxmX2Zsb2F0KQoteworRUlHRU5fREVDTEFSRV9URVNUKGhhbGZfZmxvYXQpIHsKICAgQ0FMTF9TVUJURVNUKHRlc3RfbnVtdHJhaXRzKCkpOwotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKICAgICBDQUxMX1NVQlRFU1QodGVzdF9jb252ZXJzaW9uKCkpOwogICAgIENBTExfU1VCVEVTVCh0ZXN0X2FyaXRobWV0aWMoKSk7CiAgICAgQ0FMTF9TVUJURVNUKHRlc3RfY29tcGFyaXNvbigpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvaGVzc2VuYmVyZy5jcHAgYi90ZXN0L2hlc3NlbmJlcmcuY3BwCmluZGV4IDBlMWIwMDkuLjkwMzY0ZjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvaGVzc2VuYmVyZy5jcHAKKysrIGIvdGVzdC9oZXNzZW5iZXJnLmNwcApAQCAtMTEsMjAgKzExLDIwIEBACiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgPEVpZ2VuL0VpZ2VudmFsdWVzPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IFNpemU+IHZvaWQgaGVzc2VuYmVyZyhpbnQgc2l6ZSA9IFNpemUpCi17Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixTaXplLFNpemU+IE1hdHJpeFR5cGU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgU2l6ZT4KK3ZvaWQgaGVzc2VuYmVyZyhpbnQgc2l6ZSA9IFNpemUpIHsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBTaXplLCBTaXplPiBNYXRyaXhUeXBlOwogCiAgIC8vIFRlc3QgYmFzaWMgZnVuY3Rpb25hbGl0eTogQSA9IFUgSCBVKiBhbmQgSCBpcyBIZXNzZW5iZXJnCi0gIGZvcihpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBnX3JlcGVhdDsgKytjb3VudGVyKSB7Ci0gICAgTWF0cml4VHlwZSBtID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisgIGZvciAoaW50IGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgZ19yZXBlYXQ7ICsrY291bnRlcikgeworICAgIE1hdHJpeFR5cGUgbSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKICAgICBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPiBoZXNzKG0pOwogICAgIE1hdHJpeFR5cGUgUSA9IGhlc3MubWF0cml4USgpOwogICAgIE1hdHJpeFR5cGUgSCA9IGhlc3MubWF0cml4SCgpOwogICAgIFZFUklGWV9JU19BUFBST1gobSwgUSAqIEggKiBRLmFkam9pbnQoKSk7Ci0gICAgZm9yKGludCByb3cgPSAyOyByb3cgPCBzaXplOyArK3JvdykgewotICAgICAgZm9yKGludCBjb2wgPSAwOyBjb2wgPCByb3ctMTsgKytjb2wpIHsKLQlWRVJJRlkoSChyb3csY29sKSA9PSAodHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyKTApOworICAgIGZvciAoaW50IHJvdyA9IDI7IHJvdyA8IHNpemU7ICsrcm93KSB7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCByb3cgLSAxOyArK2NvbCkgeworICAgICAgICBWRVJJRlkoSChyb3csIGNvbCkgPT0gKHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcikwKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTM2LDI2ICszNiwyNSBAQAogICBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPiBjczIoQSk7CiAgIFZFUklGWV9JU19FUVVBTChjczEubWF0cml4SCgpLmV2YWwoKSwgY3MyLm1hdHJpeEgoKS5ldmFsKCkpOwogICBNYXRyaXhUeXBlIGNzMVEgPSBjczEubWF0cml4USgpOwotICBNYXRyaXhUeXBlIGNzMlEgPSBjczIubWF0cml4USgpOyAgCisgIE1hdHJpeFR5cGUgY3MyUSA9IGNzMi5tYXRyaXhRKCk7CiAgIFZFUklGWV9JU19FUVVBTChjczFRLCBjczJRKTsKIAogICAvLyBUZXN0IGFzc2VydGlvbnMgZm9yIHdoZW4gdXNlZCB1bmluaXRpYWxpemVkCiAgIEhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+IGhlc3NVbmluaXRpYWxpemVkOwotICBWRVJJRllfUkFJU0VTX0FTU0VSVCggaGVzc1VuaW5pdGlhbGl6ZWQubWF0cml4SCgpICk7Ci0gIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBoZXNzVW5pbml0aWFsaXplZC5tYXRyaXhRKCkgKTsKLSAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIGhlc3NVbmluaXRpYWxpemVkLmhvdXNlaG9sZGVyQ29lZmZpY2llbnRzKCkgKTsKLSAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIGhlc3NVbmluaXRpYWxpemVkLnBhY2tlZE1hdHJpeCgpICk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGhlc3NVbmluaXRpYWxpemVkLm1hdHJpeEgoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGhlc3NVbmluaXRpYWxpemVkLm1hdHJpeFEoKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGhlc3NVbmluaXRpYWxpemVkLmhvdXNlaG9sZGVyQ29lZmZpY2llbnRzKCkpOworICBWRVJJRllfUkFJU0VTX0FTU0VSVChoZXNzVW5pbml0aWFsaXplZC5wYWNrZWRNYXRyaXgoKSk7CiAKICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBwYWNrZWRNYXRyaXgoKSBhbmQgaG91c2Vob2xkZXJDb2VmZmljaWVudHMoKQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoaGVzc2VuYmVyZykKLXsKLSAgQ0FMTF9TVUJURVNUXzEoKCBoZXNzZW5iZXJnPHN0ZDo6Y29tcGxleDxkb3VibGU+LDE+KCkgKSk7Ci0gIENBTExfU1VCVEVTVF8yKCggaGVzc2VuYmVyZzxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwyPigpICkpOwotICBDQUxMX1NVQlRFU1RfMygoIGhlc3NlbmJlcmc8c3RkOjpjb21wbGV4PGZsb2F0Piw0PigpICkpOwotICBDQUxMX1NVQlRFU1RfNCgoIGhlc3NlbmJlcmc8ZmxvYXQsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpICkpOwotICBDQUxMX1NVQlRFU1RfNSgoIGhlc3NlbmJlcmc8c3RkOjpjb21wbGV4PGRvdWJsZT4sRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpICkpOworRUlHRU5fREVDTEFSRV9URVNUKGhlc3NlbmJlcmcpIHsKKyAgQ0FMTF9TVUJURVNUXzEoKGhlc3NlbmJlcmc8c3RkOjpjb21wbGV4PGRvdWJsZT4sIDE+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoKGhlc3NlbmJlcmc8c3RkOjpjb21wbGV4PGRvdWJsZT4sIDI+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoKGhlc3NlbmJlcmc8c3RkOjpjb21wbGV4PGZsb2F0PiwgND4oKSkpOworICBDQUxMX1NVQlRFU1RfNCgoaGVzc2VuYmVyZzxmbG9hdCwgRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICBDQUxMX1NVQlRFU1RfNSgoaGVzc2VuYmVyZzxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwogCiAgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycwogICBDQUxMX1NVQlRFU1RfNihIZXNzZW5iZXJnRGVjb21wb3NpdGlvbjxNYXRyaXhYZj4oMTApKTsKZGlmZiAtLWdpdCBhL3Rlc3QvaG91c2Vob2xkZXIuY3BwIGIvdGVzdC9ob3VzZWhvbGRlci5jcHAKaW5kZXggM2EzZDA0Ny4uMDEwNzc1OSAxMDA2NDQKLS0tIGEvdGVzdC9ob3VzZWhvbGRlci5jcHAKKysrIGIvdGVzdC9ob3VzZWhvbGRlci5jcHAKQEAgLTEwLDggKzEwLDggQEAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8RWlnZW4vUVI+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgaG91c2Vob2xkZXIoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBob3VzZWhvbGRlcihjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHN0YXRpYyBib29sIGV2ZW4gPSB0cnVlOwogICBldmVuID0gIWV2ZW47CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKQEAgLTI5LDkgKzI5LDEwIEBACiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gSENvZWZmc1ZlY3RvclR5cGU7CiAKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IFRNYXRyaXhUeXBlOwotICAKLSAgTWF0cml4PFNjYWxhciwgaW50ZXJuYWw6Om1heF9zaXplX3ByZWZlcl9keW5hbWljKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lKSwgMT4gX3RtcCgoc3RkOjptYXgpKHJvd3MsY29scykpOwotICBTY2FsYXIqIHRtcCA9ICZfdG1wLmNvZWZmUmVmKDAsMCk7CisKKyAgTWF0cml4PFNjYWxhciwgaW50ZXJuYWw6Om1heF9zaXplX3ByZWZlcl9keW5hbWljKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSksIDE+CisgICAgICBfdG1wKChzdGQ6Om1heCkocm93cywgY29scykpOworICBTY2FsYXIqIHRtcCA9ICZfdG1wLmNvZWZmUmVmKDAsIDApOwogCiAgIFNjYWxhciBiZXRhOwogICBSZWFsU2NhbGFyIGFscGhhOwpAQCAtNDAsMTIgKzQxLDEyIEBACiAgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksIHYyOwogICB2MiA9IHYxOwogICB2MS5tYWtlSG91c2Vob2xkZXIoZXNzZW50aWFsLCBiZXRhLCBhbHBoYSk7Ci0gIHYxLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoZXNzZW50aWFsLGJldGEsdG1wKTsKKyAgdjEuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChlc3NlbnRpYWwsIGJldGEsIHRtcCk7CiAgIFZFUklGWV9JU19BUFBST1godjEubm9ybSgpLCB2Mi5ub3JtKCkpOwotICBpZihyb3dzPj0yKSBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4odjEudGFpbChyb3dzLTEpLm5vcm0oKSwgdjEubm9ybSgpKTsKKyAgaWYgKHJvd3MgPj0gMikgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHYxLnRhaWwocm93cyAtIDEpLm5vcm0oKSwgdjEubm9ybSgpKTsKICAgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CiAgIHYyID0gdjE7Ci0gIHYxLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoZXNzZW50aWFsLGJldGEsdG1wKTsKKyAgdjEuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChlc3NlbnRpYWwsIGJldGEsIHRtcCk7CiAgIFZFUklGWV9JU19BUFBST1godjEubm9ybSgpLCB2Mi5ub3JtKCkpOwogCiAgIC8vIHJlY29uc3RydWN0IGhvdXNlaG9sZGVyIG1hdHJpeDoKQEAgLTU3LDY5ICs1OCw2OCBAQAogICBIMS5hcHBseUhvdXNlaG9sZGVyT25UaGVMZWZ0KGVzc2VudGlhbCwgYmV0YSwgdG1wKTsKICAgSDIuYXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoZXNzZW50aWFsLCBiZXRhLCB0bXApOwogICBWRVJJRllfSVNfQVBQUk9YKEgxLCBIMik7Ci0gIFZFUklGWV9JU19BUFBST1goSDEsIGlkIC0gYmV0YSAqIHZ2KnZ2LmFkam9pbnQoKSk7CisgIFZFUklGWV9JU19BUFBST1goSDEsIGlkIC0gYmV0YSAqIHZ2ICogdnYuYWRqb2ludCgpKTsKIAotICBNYXRyaXhUeXBlIG0xKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG0yKHJvd3MsIGNvbHMpOworICBNYXRyaXhUeXBlIG0xKHJvd3MsIGNvbHMpLCBtMihyb3dzLCBjb2xzKTsKIAogICB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKLSAgaWYoZXZlbikgdjEudGFpbChyb3dzLTEpLnNldFplcm8oKTsKKyAgaWYgKGV2ZW4pIHYxLnRhaWwocm93cyAtIDEpLnNldFplcm8oKTsKICAgbTEuY29sd2lzZSgpID0gdjE7CiAgIG0yID0gbTE7CiAgIG0xLmNvbCgwKS5tYWtlSG91c2Vob2xkZXIoZXNzZW50aWFsLCBiZXRhLCBhbHBoYSk7Ci0gIG0xLmFwcGx5SG91c2Vob2xkZXJPblRoZUxlZnQoZXNzZW50aWFsLGJldGEsdG1wKTsKKyAgbTEuYXBwbHlIb3VzZWhvbGRlck9uVGhlTGVmdChlc3NlbnRpYWwsIGJldGEsIHRtcCk7CiAgIFZFUklGWV9JU19BUFBST1gobTEubm9ybSgpLCBtMi5ub3JtKCkpOwotICBpZihyb3dzPj0yKSBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obTEuYmxvY2soMSwwLHJvd3MtMSxjb2xzKS5ub3JtKCksIG0xLm5vcm0oKSk7Ci0gIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihudW1leHQ6OmltYWcobTEoMCwwKSksIG51bWV4dDo6cmVhbChtMSgwLDApKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpyZWFsKG0xKDAsMCkpLCBhbHBoYSk7CisgIGlmIChyb3dzID49IDIpIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihtMS5ibG9jaygxLCAwLCByb3dzIC0gMSwgY29scykubm9ybSgpLCBtMS5ub3JtKCkpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obnVtZXh0OjppbWFnKG0xKDAsIDApKSwgbnVtZXh0OjpyZWFsKG0xKDAsIDApKSk7CisgIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpyZWFsKG0xKDAsIDApKSwgYWxwaGEpOwogCiAgIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOwotICBpZihldmVuKSB2MS50YWlsKHJvd3MtMSkuc2V0WmVybygpOwotICBTcXVhcmVNYXRyaXhUeXBlIG0zKHJvd3Mscm93cyksIG00KHJvd3Mscm93cyk7CisgIGlmIChldmVuKSB2MS50YWlsKHJvd3MgLSAxKS5zZXRaZXJvKCk7CisgIFNxdWFyZU1hdHJpeFR5cGUgbTMocm93cywgcm93cyksIG00KHJvd3MsIHJvd3MpOwogICBtMy5yb3d3aXNlKCkgPSB2MS50cmFuc3Bvc2UoKTsKICAgbTQgPSBtMzsKICAgbTMucm93KDApLm1ha2VIb3VzZWhvbGRlcihlc3NlbnRpYWwsIGJldGEsIGFscGhhKTsKLSAgbTMuYXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoZXNzZW50aWFsLmNvbmp1Z2F0ZSgpLGJldGEsdG1wKTsKKyAgbTMuYXBwbHlIb3VzZWhvbGRlck9uVGhlUmlnaHQoZXNzZW50aWFsLmNvbmp1Z2F0ZSgpLCBiZXRhLCB0bXApOwogICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vcm0oKSwgbTQubm9ybSgpKTsKLSAgaWYocm93cz49MikgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKG0zLmJsb2NrKDAsMSxyb3dzLHJvd3MtMSkubm9ybSgpLCBtMy5ub3JtKCkpOwotICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obnVtZXh0OjppbWFnKG0zKDAsMCkpLCBudW1leHQ6OnJlYWwobTMoMCwwKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6cmVhbChtMygwLDApKSwgYWxwaGEpOworICBpZiAocm93cyA+PSAyKSBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obTMuYmxvY2soMCwgMSwgcm93cywgcm93cyAtIDEpLm5vcm0oKSwgbTMubm9ybSgpKTsKKyAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKG51bWV4dDo6aW1hZyhtMygwLCAwKSksIG51bWV4dDo6cmVhbChtMygwLCAwKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6cmVhbChtMygwLCAwKSksIGFscGhhKTsKIAogICAvLyB0ZXN0IGhvdXNlaG9sZGVyIHNlcXVlbmNlIG9uIHRoZSBsZWZ0IHdpdGggYSBzaGlmdAogCi0gIEluZGV4IHNoaWZ0ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgc3RkOjptYXg8SW5kZXg+KHJvd3MtMiwwKSk7CisgIEluZGV4IHNoaWZ0ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgc3RkOjptYXg8SW5kZXg+KHJvd3MgLSAyLCAwKSk7CiAgIEluZGV4IGJyb3dzID0gcm93cyAtIHNoaWZ0OwogICBtMS5zZXRSYW5kb20ocm93cywgY29scyk7Ci0gIEhCbG9ja01hdHJpeFR5cGUgaGJtID0gbTEuYmxvY2soc2hpZnQsMCxicm93cyxjb2xzKTsKKyAgSEJsb2NrTWF0cml4VHlwZSBoYm0gPSBtMS5ibG9jayhzaGlmdCwgMCwgYnJvd3MsIGNvbHMpOwogICBIb3VzZWhvbGRlclFSPEhCbG9ja01hdHJpeFR5cGU+IHFyKGhibSk7CiAgIG0yID0gbTE7Ci0gIG0yLmJsb2NrKHNoaWZ0LDAsYnJvd3MsY29scykgPSBxci5tYXRyaXhRUigpOworICBtMi5ibG9jayhzaGlmdCwgMCwgYnJvd3MsIGNvbHMpID0gcXIubWF0cml4UVIoKTsKICAgSENvZWZmc1ZlY3RvclR5cGUgaGMgPSBxci5oQ29lZmZzKCkuY29uanVnYXRlKCk7CiAgIEhvdXNlaG9sZGVyU2VxdWVuY2U8TWF0cml4VHlwZSwgSENvZWZmc1ZlY3RvclR5cGU+IGhzZXEobTIsIGhjKTsKICAgaHNlcS5zZXRMZW5ndGgoaGMuc2l6ZSgpKS5zZXRTaGlmdChzaGlmdCk7CiAgIFZFUklGWShoc2VxLmxlbmd0aCgpID09IGhjLnNpemUoKSk7CiAgIFZFUklGWShoc2VxLnNoaWZ0KCkgPT0gc2hpZnQpOwotICAKKwogICBNYXRyaXhUeXBlIG01ID0gbTI7Ci0gIG01LmJsb2NrKHNoaWZ0LDAsYnJvd3MsY29scykudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKS5zZXRaZXJvKCk7Ci0gIFZFUklGWV9JU19BUFBST1goaHNlcSAqIG01LCBtMSk7IC8vIHRlc3QgYXBwbHlpbmcgaHNlcSBkaXJlY3RseQorICBtNS5ibG9jayhzaGlmdCwgMCwgYnJvd3MsIGNvbHMpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkuc2V0WmVybygpOworICBWRVJJRllfSVNfQVBQUk9YKGhzZXEgKiBtNSwgbTEpOyAgLy8gdGVzdCBhcHBseWluZyBoc2VxIGRpcmVjdGx5CiAgIG0zID0gaHNlcTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMyAqIG01LCBtMSk7IC8vIHRlc3QgZXZhbHVhdGluZyBoc2VxIHRvIGEgZGVuc2UgbWF0cml4LCB0aGVuIGFwcGx5aW5nCi0gIAorICBWRVJJRllfSVNfQVBQUk9YKG0zICogbTUsIG0xKTsgIC8vIHRlc3QgZXZhbHVhdGluZyBoc2VxIHRvIGEgZGVuc2UgbWF0cml4LCB0aGVuIGFwcGx5aW5nCisKICAgU3F1YXJlTWF0cml4VHlwZSBoc2VxX21hdCA9IGhzZXE7CiAgIFNxdWFyZU1hdHJpeFR5cGUgaHNlcV9tYXRfY29uaiA9IGhzZXEuY29uanVnYXRlKCk7CiAgIFNxdWFyZU1hdHJpeFR5cGUgaHNlcV9tYXRfYWRqID0gaHNlcS5hZGpvaW50KCk7CiAgIFNxdWFyZU1hdHJpeFR5cGUgaHNlcV9tYXRfdHJhbnMgPSBoc2VxLnRyYW5zcG9zZSgpOwogICBTcXVhcmVNYXRyaXhUeXBlIG02ID0gU3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIHJvd3MpOwotICBWRVJJRllfSVNfQVBQUk9YKGhzZXFfbWF0LmFkam9pbnQoKSwgICAgaHNlcV9tYXRfYWRqKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChoc2VxX21hdC5jb25qdWdhdGUoKSwgIGhzZXFfbWF0X2NvbmopOwotICBWRVJJRllfSVNfQVBQUk9YKGhzZXFfbWF0LnRyYW5zcG9zZSgpLCAgaHNlcV9tYXRfdHJhbnMpOwotICBWRVJJRllfSVNfQVBQUk9YKGhzZXEgKiBtNiwgICAgICAgICAgICAgaHNlcV9tYXQgKiBtNik7Ci0gIFZFUklGWV9JU19BUFBST1goaHNlcS5hZGpvaW50KCkgKiBtNiwgICBoc2VxX21hdF9hZGogKiBtNik7CisgIFZFUklGWV9JU19BUFBST1goaHNlcV9tYXQuYWRqb2ludCgpLCBoc2VxX21hdF9hZGopOworICBWRVJJRllfSVNfQVBQUk9YKGhzZXFfbWF0LmNvbmp1Z2F0ZSgpLCBoc2VxX21hdF9jb25qKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChoc2VxX21hdC50cmFuc3Bvc2UoKSwgaHNlcV9tYXRfdHJhbnMpOworICBWRVJJRllfSVNfQVBQUk9YKGhzZXEgKiBtNiwgaHNlcV9tYXQgKiBtNik7CisgIFZFUklGWV9JU19BUFBST1goaHNlcS5hZGpvaW50KCkgKiBtNiwgaHNlcV9tYXRfYWRqICogbTYpOwogICBWRVJJRllfSVNfQVBQUk9YKGhzZXEuY29uanVnYXRlKCkgKiBtNiwgaHNlcV9tYXRfY29uaiAqIG02KTsKICAgVkVSSUZZX0lTX0FQUFJPWChoc2VxLnRyYW5zcG9zZSgpICogbTYsIGhzZXFfbWF0X3RyYW5zICogbTYpOwotICBWRVJJRllfSVNfQVBQUk9YKG02ICogaHNlcSwgICAgICAgICAgICAgbTYgKiBoc2VxX21hdCk7Ci0gIFZFUklGWV9JU19BUFBST1gobTYgKiBoc2VxLmFkam9pbnQoKSwgICBtNiAqIGhzZXFfbWF0X2Fkaik7CisgIFZFUklGWV9JU19BUFBST1gobTYgKiBoc2VxLCBtNiAqIGhzZXFfbWF0KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNiAqIGhzZXEuYWRqb2ludCgpLCBtNiAqIGhzZXFfbWF0X2Fkaik7CiAgIFZFUklGWV9JU19BUFBST1gobTYgKiBoc2VxLmNvbmp1Z2F0ZSgpLCBtNiAqIGhzZXFfbWF0X2NvbmopOwogICBWRVJJRllfSVNfQVBQUk9YKG02ICogaHNlcS50cmFuc3Bvc2UoKSwgbTYgKiBoc2VxX21hdF90cmFucyk7CiAKQEAgLTEyOCwxMiArMTI4LDExIEBACiAgIFRNYXRyaXhUeXBlIHRtMiA9IG0yLnRyYW5zcG9zZSgpOwogICBIb3VzZWhvbGRlclNlcXVlbmNlPFRNYXRyaXhUeXBlLCBIQ29lZmZzVmVjdG9yVHlwZSwgT25UaGVSaWdodD4gcmhzZXEodG0yLCBoYyk7CiAgIHJoc2VxLnNldExlbmd0aChoYy5zaXplKCkpLnNldFNoaWZ0KHNoaWZ0KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyaHNlcSAqIG01LCBtMSk7IC8vIHRlc3QgYXBwbHlpbmcgcmhzZXEgZGlyZWN0bHkKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHNlcSAqIG01LCBtMSk7ICAvLyB0ZXN0IGFwcGx5aW5nIHJoc2VxIGRpcmVjdGx5CiAgIG0zID0gcmhzZXE7Ci0gIFZFUklGWV9JU19BUFBST1gobTMgKiBtNSwgbTEpOyAvLyB0ZXN0IGV2YWx1YXRpbmcgcmhzZXEgdG8gYSBkZW5zZSBtYXRyaXgsIHRoZW4gYXBwbHlpbmcKKyAgVkVSSUZZX0lTX0FQUFJPWChtMyAqIG01LCBtMSk7ICAvLyB0ZXN0IGV2YWx1YXRpbmcgcmhzZXEgdG8gYSBkZW5zZSBtYXRyaXgsIHRoZW4gYXBwbHlpbmcKIH0KIAotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KIHZvaWQgaG91c2Vob2xkZXJfdXBkYXRlKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgLy8gVGhpcyB0ZXN0IGlzIGNvdmVyaW5nIHRoZSBpbnRlcm5hbDo6aG91c2Vob2xkZXJfcXJfaW5wbGFjZV91cGRhdGUgZnVuY3Rpb24uCkBAIC0xNTMsNyArMTUyLDcgQEAKICAgU2NhbGFyKiB0bXAgPSB0bXBPd25lci5kYXRhKCk7CiAKICAgLy8gVGhlIG1hdHJpeCB0byBmYWN0b3JpemUuCi0gIGNvbnN0IE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsgCisgIGNvbnN0IE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKIAogICAvLyBtYXRRUiBhbmQgaENvZWZmcyB3aWxsIGhvbGQgdGhlIGZhY3Rvcml6YXRpb24gb2YgQSwKICAgLy8gYnVpbHQgYnkgYSBzZXF1ZW5jZSBvZiBjYWxscyB0byBgdXBkYXRlYC4KQEAgLTE2NCwxMSArMTYzLDEwIEBACiAgIC8vIFdlIHZlcmlmeSB0aGlzIGJ5IHN0YXJ0aW5nIHdpdGggYW4gZW1wdHkgZmFjdG9yaXphdGlvbiBhbmQgJ3VwZGF0aW5nJyBvbmUgY29sdW1uIGF0IGEgdGltZS4KICAgLy8gQWZ0ZXIgZWFjaCBjYWxsIHRvIHVwZGF0ZSwgd2Ugc2hvdWxkIGhhdmUgYSBRUiBmYWN0b3JpemF0aW9uIG9mIHRoZSBjb2x1bW5zIHByZXNlbnRlZCBzbyBmYXIuCiAKLSAgY29uc3QgSW5kZXggc2l6ZSA9IChzdGQ6Om1pbikocm93cywgY29scyk7IC8vIFFSIGNhbiBvbmx5IGdvIHVwIHRvICdzaXplJyBiL2MgdGhhdCdzIGZ1bGwgcmFuay4KLSAgZm9yIChJbmRleCBrID0gMDsgayAhPSBzaXplOyArK2spCi0gIHsKKyAgY29uc3QgSW5kZXggc2l6ZSA9IChzdGQ6Om1pbikocm93cywgY29scyk7ICAvLyBRUiBjYW4gb25seSBnbyB1cCB0byAnc2l6ZScgYi9jIHRoYXQncyBmdWxsIHJhbmsuCisgIGZvciAoSW5kZXggayA9IDA7IGsgIT0gc2l6ZTsgKytrKSB7CiAgICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGNvbHVtbiB0byBwcmV2ZW50IGFueSBwb3NzaWJpbGl0eSBvZiAnbGVha2luZycgb3RoZXIgcGFydHMgb2YgQS4KLSAgICBjb25zdCBWZWN0b3JUeXBlIG5ld0NvbHVtbiA9IEEuY29sKGspOyAKKyAgICBjb25zdCBWZWN0b3JUeXBlIG5ld0NvbHVtbiA9IEEuY29sKGspOwogICAgIGludGVybmFsOjpob3VzZWhvbGRlcl9xcl9pbnBsYWNlX3VwZGF0ZShtYXRRUiwgaENvZWZmcywgbmV3Q29sdW1uLCBrLCB0bXApOwogCiAgICAgLy8gVmVyaWZ5IFByb3BlcnR5OgpAQCAtMTg3LDcgKzE4NSw3IEBACiAgICAgLy8gQSBzZXF1ZW5jZSBvZiBjYWxscyB0byAnaG91c2Vob2xkZXJfcXJfaW5wbGFjZV91cGRhdGUnCiAgICAgLy8gc2hvdWxkIHByb2R1Y2UgdGhlIHNhbWUgcmVzdWx0IGFzICdob3VzZWhvbGRlcl9xcl9pbnBsYWNlX3VuYmxvY2tlZCcuCiAgICAgLy8gVGhpcyBpcyBhIHByb3BlcnR5IG9mIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLgotICAgIC8vIElmIHRoZXNlIGltcGxlbWVudGF0aW9ucyBkaXZlcmdlIGluIHRoZSBmdXR1cmUsIAorICAgIC8vIElmIHRoZXNlIGltcGxlbWVudGF0aW9ucyBkaXZlcmdlIGluIHRoZSBmdXR1cmUsCiAgICAgLy8gdGhlbiBzaW1wbHkgZGVsZXRlIHRoZSB0ZXN0IG9mIHRoaXMgcHJvcGVydHkuCiAgICAgewogICAgICAgTWF0cml4WCBRUl9hdF9vbmNlID0gQS5sZWZ0Q29scyhrICsgMSk7CkBAIC0yMDAsMTAgKzE5OCwxMCBAQAogCiAgIC8vIFZlcmlmeSBQcm9wZXJ0eToKICAgLy8gV2UgY2FuIGdvIGJhY2sgYW5kIHVwZGF0ZSBhbnkgY29sdW1uIHRvIGhhdmUgYSBuZXcgdmFsdWUsCi0gIC8vIGFuZCBnZXQgYSBRUiBmYWN0b3JpemF0aW9uIG9mIHRoZSBjb2x1bW5zIHVwIHRvIHRoYXQgb25lLiAgCisgIC8vIGFuZCBnZXQgYSBRUiBmYWN0b3JpemF0aW9uIG9mIHRoZSBjb2x1bW5zIHVwIHRvIHRoYXQgb25lLgogICB7CiAgICAgY29uc3QgSW5kZXggayA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHNpemUgLSAxKTsKLSAgICBWZWN0b3JUeXBlIG5ld0NvbHVtbiA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsgICAgICAKKyAgICBWZWN0b3JUeXBlIG5ld0NvbHVtbiA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKICAgICBpbnRlcm5hbDo6aG91c2Vob2xkZXJfcXJfaW5wbGFjZV91cGRhdGUobWF0UVIsIGhDb2VmZnMsIG5ld0NvbHVtbiwgaywgdG1wKTsKIAogICAgIGNvbnN0IE1hdHJpeFggbWF0UVJfayA9IG1hdFFSLmxlZnRDb2xzKGsgKyAxKTsKQEAgLTIxMiwyNCArMjEwLDI2IEBACiAgICAgTWF0cml4WCBReFIgPSBob3VzZWhvbGRlclNlcXVlbmNlKG1hdFFSX2ssIGhDb2VmZnNfay5jb25qdWdhdGUoKSkgKiBSOwogICAgIFZFUklGWV9JU19BUFBST1goUXhSLmxlZnRDb2xzKGspLCBBLmxlZnRDb2xzKGspKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKFF4Ui5jb2woayksIG5ld0NvbHVtbik7Ci0gIH0gIAorICB9CiB9CiAKK0VJR0VOX0RFQ0xBUkVfVEVTVChob3VzZWhvbGRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShob3VzZWhvbGRlcihNYXRyaXg8ZG91YmxlLCAyLCAyPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoaG91c2Vob2xkZXIoTWF0cml4PGZsb2F0LCAyLCAzPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoaG91c2Vob2xkZXIoTWF0cml4PGRvdWJsZSwgMywgNT4oKSkpOworICAgIENBTExfU1VCVEVTVF80KGhvdXNlaG9sZGVyKE1hdHJpeDxmbG9hdCwgNCwgND4oKSkpOworICAgIENBTExfU1VCVEVTVF81KGhvdXNlaG9sZGVyKAorICAgICAgICBNYXRyaXhYZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNihob3VzZWhvbGRlcigKKyAgICAgICAgTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF83KGhvdXNlaG9sZGVyKAorICAgICAgICBNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfOChob3VzZWhvbGRlcihNYXRyaXg8ZG91YmxlLCAxLCAxPigpKSk7CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChob3VzZWhvbGRlcikKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggaG91c2Vob2xkZXIoTWF0cml4PGRvdWJsZSwyLDI+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGhvdXNlaG9sZGVyKE1hdHJpeDxmbG9hdCwyLDM+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGhvdXNlaG9sZGVyKE1hdHJpeDxkb3VibGUsMyw1PigpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBob3VzZWhvbGRlcihNYXRyaXg8ZmxvYXQsNCw0PigpKSApOwotICAgIENBTExfU1VCVEVTVF81KCBob3VzZWhvbGRlcihNYXRyaXhYZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoIGhvdXNlaG9sZGVyKE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzcoIGhvdXNlaG9sZGVyKE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOCggaG91c2Vob2xkZXIoTWF0cml4PGRvdWJsZSwxLDE+KCkpICk7Ci0KLSAgICBDQUxMX1NVQlRFU1RfOSggaG91c2Vob2xkZXJfdXBkYXRlKE1hdHJpeDxkb3VibGUsIDMsIDU+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzkoIGhvdXNlaG9sZGVyX3VwZGF0ZShNYXRyaXg8ZmxvYXQsIDQsIDI+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzkoIGhvdXNlaG9sZGVyX3VwZGF0ZShNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzkoaG91c2Vob2xkZXJfdXBkYXRlKE1hdHJpeDxkb3VibGUsIDMsIDU+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfOShob3VzZWhvbGRlcl91cGRhdGUoTWF0cml4PGZsb2F0LCA0LCAyPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzkoaG91c2Vob2xkZXJfdXBkYXRlKAorICAgICAgICBNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2luY29tcGxldGVfY2hvbGVza3kuY3BwIGIvdGVzdC9pbmNvbXBsZXRlX2Nob2xlc2t5LmNwcAppbmRleCA3MjMxNmEyLi4yYjAzYmExIDEwMDY0NAotLS0gYS90ZXN0L2luY29tcGxldGVfY2hvbGVza3kuY3BwCisrKyBiL3Rlc3QvaW5jb21wbGV0ZV9jaG9sZXNreS5jcHAKQEAgLTExLDU4ICsxMSw1MyBAQAogI2luY2x1ZGUgInNwYXJzZV9zb2x2ZXIuaCIKICNpbmNsdWRlIDxFaWdlbi9JdGVyYXRpdmVMaW5lYXJTb2x2ZXJzPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBJXz4gdm9pZCB0ZXN0X2luY29tcGxldGVfY2hvbGVza3lfVCgpCi17Ci0gIHR5cGVkZWYgU3BhcnNlTWF0cml4PFQsMCxJXz4gU3BhcnNlTWF0cml4VHlwZTsKLSAgQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4VHlwZSwgTG93ZXIsIEluY29tcGxldGVDaG9sZXNreTxULCBMb3dlciwgQU1ET3JkZXJpbmc8SV8+ID4gPiAgICAgICAgY2dfaWxsdF9sb3dlcl9hbWQ7Ci0gIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeFR5cGUsIExvd2VyLCBJbmNvbXBsZXRlQ2hvbGVza3k8VCwgTG93ZXIsIE5hdHVyYWxPcmRlcmluZzxJXz4gPiA+ICAgIGNnX2lsbHRfbG93ZXJfbmF0OwotICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXhUeXBlLCBVcHBlciwgSW5jb21wbGV0ZUNob2xlc2t5PFQsIFVwcGVyLCBBTURPcmRlcmluZzxJXz4gPiA+ICAgICAgICBjZ19pbGx0X3VwcGVyX2FtZDsKLSAgQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4VHlwZSwgVXBwZXIsIEluY29tcGxldGVDaG9sZXNreTxULCBVcHBlciwgTmF0dXJhbE9yZGVyaW5nPElfPiA+ID4gICAgY2dfaWxsdF91cHBlcl9uYXQ7Ci0gIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeFR5cGUsIFVwcGVyfExvd2VyLCBJbmNvbXBsZXRlQ2hvbGVza3k8VCwgTG93ZXIsIEFNRE9yZGVyaW5nPElfPiA+ID4gIGNnX2lsbHRfdXBsb19hbWQ7Ci0gIAordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIElfPgordm9pZCB0ZXN0X2luY29tcGxldGVfY2hvbGVza3lfVCgpIHsKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8VCwgMCwgSV8+IFNwYXJzZU1hdHJpeFR5cGU7CisgIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeFR5cGUsIExvd2VyLCBJbmNvbXBsZXRlQ2hvbGVza3k8VCwgTG93ZXIsIEFNRE9yZGVyaW5nPElfPiA+ID4gY2dfaWxsdF9sb3dlcl9hbWQ7CisgIENvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeFR5cGUsIExvd2VyLCBJbmNvbXBsZXRlQ2hvbGVza3k8VCwgTG93ZXIsIE5hdHVyYWxPcmRlcmluZzxJXz4gPiA+IGNnX2lsbHRfbG93ZXJfbmF0OworICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXhUeXBlLCBVcHBlciwgSW5jb21wbGV0ZUNob2xlc2t5PFQsIFVwcGVyLCBBTURPcmRlcmluZzxJXz4gPiA+IGNnX2lsbHRfdXBwZXJfYW1kOworICBDb25qdWdhdGVHcmFkaWVudDxTcGFyc2VNYXRyaXhUeXBlLCBVcHBlciwgSW5jb21wbGV0ZUNob2xlc2t5PFQsIFVwcGVyLCBOYXR1cmFsT3JkZXJpbmc8SV8+ID4gPiBjZ19pbGx0X3VwcGVyX25hdDsKKyAgQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4VHlwZSwgVXBwZXIgfCBMb3dlciwgSW5jb21wbGV0ZUNob2xlc2t5PFQsIExvd2VyLCBBTURPcmRlcmluZzxJXz4gPiA+IGNnX2lsbHRfdXBsb19hbWQ7CiAKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2dfaWxsdF9sb3dlcl9hbWQpICk7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNnX2lsbHRfbG93ZXJfbmF0KSApOwotICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjZ19pbGx0X3VwcGVyX2FtZCkgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2dfaWxsdF91cHBlcl9uYXQpICk7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNnX2lsbHRfdXBsb19hbWQpICk7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2dfaWxsdF9sb3dlcl9hbWQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjZ19pbGx0X2xvd2VyX25hdCkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGNnX2lsbHRfdXBwZXJfYW1kKSk7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcoY2dfaWxsdF91cHBlcl9uYXQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjZ19pbGx0X3VwbG9fYW1kKSk7CiB9CiAKLXRlbXBsYXRlPGludD4KLXZvaWQgYnVnMTE1MCgpCi17Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCBidWcxMTUwKCkgewogICAvLyByZWdyZXNzaW9uIGZvciBidWcgMTE1MAotICBmb3IoaW50IE4gPSAxOyBOPDIwOyArK04pCi0gIHsKLSAgICBFaWdlbjo6TWF0cml4WGQgYiggTiwgTiApOworICBmb3IgKGludCBOID0gMTsgTiA8IDIwOyArK04pIHsKKyAgICBFaWdlbjo6TWF0cml4WGQgYihOLCBOKTsKICAgICBiLnNldE9uZXMoKTsKIAotICAgIEVpZ2VuOjpTcGFyc2VNYXRyaXg8ZG91YmxlPiBtKCBOLCBOICk7Ci0gICAgbS5yZXNlcnZlKEVpZ2VuOjpWZWN0b3JYaTo6Q29uc3RhbnQoTiw0KSk7Ci0gICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBOOyArK2kgKQotICAgIHsKLSAgICAgICAgbS5pbnNlcnQoIGksIGkgKSA9IDE7Ci0gICAgICAgIG0uY29lZmZSZWYoIGksIGkgLyAyICkgPSAyOwotICAgICAgICBtLmNvZWZmUmVmKCBpLCBpIC8gMyApID0gMjsKLSAgICAgICAgbS5jb2VmZlJlZiggaSwgaSAvIDQgKSA9IDI7CisgICAgRWlnZW46OlNwYXJzZU1hdHJpeDxkb3VibGU+IG0oTiwgTik7CisgICAgbS5yZXNlcnZlKEVpZ2VuOjpWZWN0b3JYaTo6Q29uc3RhbnQoTiwgNCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgICBtLmluc2VydChpLCBpKSA9IDE7CisgICAgICBtLmNvZWZmUmVmKGksIGkgLyAyKSA9IDI7CisgICAgICBtLmNvZWZmUmVmKGksIGkgLyAzKSA9IDI7CisgICAgICBtLmNvZWZmUmVmKGksIGkgLyA0KSA9IDI7CiAgICAgfQogCiAgICAgRWlnZW46OlNwYXJzZU1hdHJpeDxkb3VibGU+IEE7CiAgICAgQSA9IG0gKiBtLnRyYW5zcG9zZSgpOwogCi0gICAgRWlnZW46OkNvbmp1Z2F0ZUdyYWRpZW50PEVpZ2VuOjpTcGFyc2VNYXRyaXg8ZG91YmxlPiwKLSAgICAgICAgRWlnZW46Okxvd2VyIHwgRWlnZW46OlVwcGVyLAotICAgICAgICBFaWdlbjo6SW5jb21wbGV0ZUNob2xlc2t5PGRvdWJsZT4gPiBzb2x2ZXIoIEEgKTsKKyAgICBFaWdlbjo6Q29uanVnYXRlR3JhZGllbnQ8RWlnZW46OlNwYXJzZU1hdHJpeDxkb3VibGU+LCBFaWdlbjo6TG93ZXIgfCBFaWdlbjo6VXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjpJbmNvbXBsZXRlQ2hvbGVza3k8ZG91YmxlPiA+CisgICAgICAgIHNvbHZlcihBKTsKICAgICBWRVJJRlkoc29sdmVyLnByZWNvbmRpdGlvbmVyKCkuaW5mbygpID09IEVpZ2VuOjpTdWNjZXNzKTsKICAgICBWRVJJRlkoc29sdmVyLmluZm8oKSA9PSBFaWdlbjo6U3VjY2Vzcyk7CiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGluY29tcGxldGVfY2hvbGVza3kpCi17Ci0gIENBTExfU1VCVEVTVF8xKCggdGVzdF9pbmNvbXBsZXRlX2Nob2xlc2t5X1Q8ZG91YmxlLGludD4oKSApKTsKLSAgQ0FMTF9TVUJURVNUXzIoKCB0ZXN0X2luY29tcGxldGVfY2hvbGVza3lfVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgaW50PigpICkpOwotICBDQUxMX1NVQlRFU1RfMygoIHRlc3RfaW5jb21wbGV0ZV9jaG9sZXNreV9UPGRvdWJsZSxsb25nIGludD4oKSApKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChpbmNvbXBsZXRlX2Nob2xlc2t5KSB7CisgIENBTExfU1VCVEVTVF8xKCh0ZXN0X2luY29tcGxldGVfY2hvbGVza3lfVDxkb3VibGUsIGludD4oKSkpOworICBDQUxMX1NVQlRFU1RfMigodGVzdF9pbmNvbXBsZXRlX2Nob2xlc2t5X1Q8c3RkOjpjb21wbGV4PGRvdWJsZT4sIGludD4oKSkpOworICBDQUxMX1NVQlRFU1RfMygodGVzdF9pbmNvbXBsZXRlX2Nob2xlc2t5X1Q8ZG91YmxlLCBsb25nIGludD4oKSkpOwogCi0gIENBTExfU1VCVEVTVF8xKCggYnVnMTE1MDwwPigpICkpOworICBDQUxMX1NVQlRFU1RfMSgoYnVnMTE1MDwwPigpKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2luZGV4ZWRfdmlldy5jcHAgYi90ZXN0L2luZGV4ZWRfdmlldy5jcHAKaW5kZXggNDFiYTUyMS4uNDk0ZTBkNiAxMDA2NDQKLS0tIGEvdGVzdC9pbmRleGVkX3ZpZXcuY3BwCisrKyBiL3Rlc3QvaW5kZXhlZF92aWV3LmNwcApAQCAtMTMsMjg3ICsxMywyNzkgQEAKIAogdXNpbmcgRWlnZW46OnBsYWNlaG9sZGVyczo6YWxsOwogdXNpbmcgRWlnZW46OnBsYWNlaG9sZGVyczo6bGFzdDsKLXVzaW5nIEVpZ2VuOjpwbGFjZWhvbGRlcnM6Omxhc3RwMTsKIHVzaW5nIEVpZ2VuOjpwbGFjZWhvbGRlcnM6Omxhc3ROOwordXNpbmcgRWlnZW46OnBsYWNlaG9sZGVyczo6bGFzdHAxOwogI2luY2x1ZGUgPGFycmF5PgogCi10eXBlZGVmIHN0ZDo6cGFpcjxJbmRleCxJbmRleD4gSW5kZXhQYWlyOwordHlwZWRlZiBzdGQ6OnBhaXI8SW5kZXgsIEluZGV4PiBJbmRleFBhaXI7CiAKLWludCBlbmNvZGUoSW5kZXggaSwgSW5kZXggaikgewotICByZXR1cm4gaW50KGkqMTAwICsgaik7Ci19CitpbnQgZW5jb2RlKEluZGV4IGksIEluZGV4IGopIHsgcmV0dXJuIGludChpICogMTAwICsgaik7IH0KIAotSW5kZXhQYWlyIGRlY29kZShJbmRleCBpaikgewotICByZXR1cm4gSW5kZXhQYWlyKGlqIC8gMTAwLCBpaiAlIDEwMCk7Ci19CitJbmRleFBhaXIgZGVjb2RlKEluZGV4IGlqKSB7IHJldHVybiBJbmRleFBhaXIoaWogLyAxMDAsIGlqICUgMTAwKTsgfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBib29sIG1hdGNoKGNvbnN0IFQmIHhwciwgc3RkOjpzdHJpbmcgcmVmLCBzdGQ6OnN0cmluZyBzdHJfeHByID0gIiIpIHsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHN0cl94cHIpOwogICBzdGQ6OnN0cmluZ3N0cmVhbSBzdHI7CiAgIHN0ciA8PCB4cHI7Ci0gIGlmKCEoc3RyLnN0cigpID09IHJlZikpCi0gICAgc3RkOjpjb3V0IDw8IHN0cl94cHIgPDwgIlxuIiA8PCB4cHIgPDwgIlxuXG4iOworICBpZiAoIShzdHIuc3RyKCkgPT0gcmVmKSkgc3RkOjpjb3V0IDw8IHN0cl94cHIgPDwgIlxuIiA8PCB4cHIgPDwgIlxuXG4iOwogICByZXR1cm4gc3RyLnN0cigpID09IHJlZjsKIH0KIAotI2RlZmluZSBNQVRDSChYLFIpIG1hdGNoKFgsIFIsICNYKQorI2RlZmluZSBNQVRDSChYLCBSKSBtYXRjaChYLCBSLCAjWCkKIAotdGVtcGxhdGU8dHlwZW5hbWUgVDEsdHlwZW5hbWUgVDI+Ci1zdGQ6OmVuYWJsZV9pZl90PGludGVybmFsOjppc19zYW1lPFQxLFQyPjo6dmFsdWUsYm9vbD4KLWlzX3NhbWVfZXEoY29uc3QgVDEmIGEsIGNvbnN0IFQyJiBiKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0ZDo6ZW5hYmxlX2lmX3Q8aW50ZXJuYWw6OmlzX3NhbWU8VDEsIFQyPjo6dmFsdWUsIGJvb2w+IGlzX3NhbWVfZXEoY29uc3QgVDEmIGEsIGNvbnN0IFQyJiBiKSB7CiAgIHJldHVybiAoYSA9PSBiKS5hbGwoKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVDEsdHlwZW5hbWUgVDI+Ci1ib29sIGlzX3NhbWVfc2VxKGNvbnN0IFQxJiBhLCBjb25zdCBUMiYgYikKLXsKLSAgYm9vbCBvayA9IGEuZmlyc3QoKT09Yi5maXJzdCgpICYmIGEuc2l6ZSgpID09IGIuc2l6ZSgpICYmIEluZGV4KGEuaW5jck9iamVjdCgpKT09SW5kZXgoYi5pbmNyT2JqZWN0KCkpOzsKLSAgaWYoIW9rKQotICB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorYm9vbCBpc19zYW1lX3NlcShjb25zdCBUMSYgYSwgY29uc3QgVDImIGIpIHsKKyAgYm9vbCBvayA9IGEuZmlyc3QoKSA9PSBiLmZpcnN0KCkgJiYgYS5zaXplKCkgPT0gYi5zaXplKCkgJiYgSW5kZXgoYS5pbmNyT2JqZWN0KCkpID09IEluZGV4KGIuaW5jck9iamVjdCgpKTsKKyAgOworICBpZiAoIW9rKSB7CiAgICAgc3RkOjpjZXJyIDw8ICJzZXFOKCIgPDwgYS5maXJzdCgpIDw8ICIsICIgPDwgYS5zaXplKCkgPDwgIiwgIiA8PCBJbmRleChhLmluY3JPYmplY3QoKSkgPDwgIikgIT0gIjsKICAgICBzdGQ6OmNlcnIgPDwgInNlcU4oIiA8PCBiLmZpcnN0KCkgPDwgIiwgIiA8PCBiLnNpemUoKSA8PCAiLCAiIDw8IEluZGV4KGIuaW5jck9iamVjdCgpKSA8PCAiKVxuIjsKICAgfQogICByZXR1cm4gb2s7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQxLHR5cGVuYW1lIFQyPgotc3RkOjplbmFibGVfaWZfdDxpbnRlcm5hbDo6aXNfc2FtZTxUMSxUMj46OnZhbHVlLGJvb2w+Ci1pc19zYW1lX3NlcV90eXBlKGNvbnN0IFQxJiBhLCBjb25zdCBUMiYgYikKLXsKLSAgcmV0dXJuIGlzX3NhbWVfc2VxKGEsYik7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RkOjplbmFibGVfaWZfdDxpbnRlcm5hbDo6aXNfc2FtZTxUMSwgVDI+Ojp2YWx1ZSwgYm9vbD4gaXNfc2FtZV9zZXFfdHlwZShjb25zdCBUMSYgYSwgY29uc3QgVDImIGIpIHsKKyAgcmV0dXJuIGlzX3NhbWVfc2VxKGEsIGIpOwogfQogCi0KLQotI2RlZmluZSBWRVJJRllfRVFfSU5UKEEsQikgVkVSSUZZX0lTX0FQUFJPWChpbnQoQSksaW50KEIpKQorI2RlZmluZSBWRVJJRllfRVFfSU5UKEEsIEIpIFZFUklGWV9JU19BUFBST1goaW50KEEpLCBpbnQoQikpCiAKIC8vIEMrKzAzIGRvZXMgbm90IGFsbG93IGxvY2FsIG9yIHVubmFtZWQgZW51bXMgYXMgaW5kZXgKLWVudW0gRHVtbXlFbnVtIHsgWFg9MCwgWVk9MSB9OworZW51bSBEdW1teUVudW0geyBYWCA9IDAsIFlZID0gMSB9OwogCi12b2lkIGNoZWNrX2luZGV4ZWRfdmlldygpCi17Cit2b2lkIGNoZWNrX2luZGV4ZWRfdmlldygpIHsKICAgSW5kZXggbiA9IDEwOwogCi0gIEFycmF5WGQgYSA9IEFycmF5WGQ6OkxpblNwYWNlZChuLDAsbi0xKTsKLSAgQXJyYXk8ZG91YmxlLDEsRHluYW1pYz4gYiA9IGEudHJhbnNwb3NlKCk7CisgIEFycmF5WGQgYSA9IEFycmF5WGQ6OkxpblNwYWNlZChuLCAwLCBuIC0gMSk7CisgIEFycmF5PGRvdWJsZSwgMSwgRHluYW1pYz4gYiA9IGEudHJhbnNwb3NlKCk7CiAKLSAgQXJyYXlYWGkgQSA9IEFycmF5WFhpOjpOdWxsYXJ5RXhwcihuLG4sIHN0ZDo6cmVmKGVuY29kZSkpOworICBBcnJheVhYaSBBID0gQXJyYXlYWGk6Ok51bGxhcnlFeHByKG4sIG4sIHN0ZDo6cmVmKGVuY29kZSkpOwogCi0gIGZvcihJbmRleCBpPTA7IGk8bjsgKytpKQotICAgIGZvcihJbmRleCBqPTA7IGo8bjsgKytqKQotICAgICAgVkVSSUZZKCBkZWNvZGUoQShpLGopKSA9PSBJbmRleFBhaXIoaSxqKSApOworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbjsgKytpKQorICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBuOyArK2opIFZFUklGWShkZWNvZGUoQShpLCBqKSkgPT0gSW5kZXhQYWlyKGksIGopKTsKIAotICBBcnJheTRpIGVpaSg0KTsgZWlpIDw8IDMsIDEsIDYsIDU7Ci0gIHN0ZDo6dmFsYXJyYXk8aW50PiB2YWxpKDQpOyBNYXA8QXJyYXlYaT4oJnZhbGlbMF0sNCkgPSBlaWk7Ci0gIHN0ZDo6dmVjdG9yPGludD4gdmVjaSg0KTsgTWFwPEFycmF5WGk+KHZlY2kuZGF0YSgpLDQpID0gZWlpOworICBBcnJheTRpIGVpaSg0KTsKKyAgZWlpIDw8IDMsIDEsIDYsIDU7CisgIHN0ZDo6dmFsYXJyYXk8aW50PiB2YWxpKDQpOworICBNYXA8QXJyYXlYaT4oJnZhbGlbMF0sIDQpID0gZWlpOworICBzdGQ6OnZlY3RvcjxpbnQ+IHZlY2koNCk7CisgIE1hcDxBcnJheVhpPih2ZWNpLmRhdGEoKSwgNCkgPSBlaWk7CiAKLSAgVkVSSUZZKCBNQVRDSCggQSgzLCBzZXEoOSwzLC0xKSksCi0gICAgIjMwOSAgMzA4ICAzMDcgIDMwNiAgMzA1ICAzMDQgIDMwMyIpCi0gICk7CisgIFZFUklGWShNQVRDSChBKDMsIHNlcSg5LCAzLCAtMSkpLCAiMzA5ICAzMDggIDMwNyAgMzA2ICAzMDUgIDMwNCAgMzAzIikpOwogCi0gIFZFUklGWSggTUFUQ0goIEEoc2VxTigyLDUpLCBzZXEoOSwzLC0xKSksCi0gICAgIjIwOSAgMjA4ICAyMDcgIDIwNiAgMjA1ICAyMDQgIDIwM1xuIgotICAgICIzMDkgIDMwOCAgMzA3ICAzMDYgIDMwNSAgMzA0ICAzMDNcbiIKLSAgICAiNDA5ICA0MDggIDQwNyAgNDA2ICA0MDUgIDQwNCAgNDAzXG4iCi0gICAgIjUwOSAgNTA4ICA1MDcgIDUwNiAgNTA1ICA1MDQgIDUwM1xuIgotICAgICI2MDkgIDYwOCAgNjA3ICA2MDYgIDYwNSAgNjA0ICA2MDMiKQotICApOworICBWRVJJRlkoTUFUQ0goQShzZXFOKDIsIDUpLCBzZXEoOSwgMywgLTEpKSwKKyAgICAgICAgICAgICAgICIyMDkgIDIwOCAgMjA3ICAyMDYgIDIwNSAgMjA0ICAyMDNcbiIKKyAgICAgICAgICAgICAgICIzMDkgIDMwOCAgMzA3ICAzMDYgIDMwNSAgMzA0ICAzMDNcbiIKKyAgICAgICAgICAgICAgICI0MDkgIDQwOCAgNDA3ICA0MDYgIDQwNSAgNDA0ICA0MDNcbiIKKyAgICAgICAgICAgICAgICI1MDkgIDUwOCAgNTA3ICA1MDYgIDUwNSAgNTA0ICA1MDNcbiIKKyAgICAgICAgICAgICAgICI2MDkgIDYwOCAgNjA3ICA2MDYgIDYwNSAgNjA0ICA2MDMiKSk7CiAKLSAgVkVSSUZZKCBNQVRDSCggQShzZXFOKDIsNSksIDUpLAotICAgICIyMDVcbiIKLSAgICAiMzA1XG4iCi0gICAgIjQwNVxuIgotICAgICI1MDVcbiIKLSAgICAiNjA1IikKLSAgKTsKKyAgVkVSSUZZKE1BVENIKEEoc2VxTigyLCA1KSwgNSksCisgICAgICAgICAgICAgICAiMjA1XG4iCisgICAgICAgICAgICAgICAiMzA1XG4iCisgICAgICAgICAgICAgICAiNDA1XG4iCisgICAgICAgICAgICAgICAiNTA1XG4iCisgICAgICAgICAgICAgICAiNjA1IikpOwogCi0gIFZFUklGWSggTUFUQ0goIEEoc2VxTihsYXN0LDUsLTEpLCBzZXEoMixsYXN0KSksCi0gICAgIjkwMiAgOTAzICA5MDQgIDkwNSAgOTA2ICA5MDcgIDkwOCAgOTA5XG4iCi0gICAgIjgwMiAgODAzICA4MDQgIDgwNSAgODA2ICA4MDcgIDgwOCAgODA5XG4iCi0gICAgIjcwMiAgNzAzICA3MDQgIDcwNSAgNzA2ICA3MDcgIDcwOCAgNzA5XG4iCi0gICAgIjYwMiAgNjAzICA2MDQgIDYwNSAgNjA2ICA2MDcgIDYwOCAgNjA5XG4iCi0gICAgIjUwMiAgNTAzICA1MDQgIDUwNSAgNTA2ICA1MDcgIDUwOCAgNTA5IikKLSAgKTsKKyAgVkVSSUZZKE1BVENIKEEoc2VxTihsYXN0LCA1LCAtMSksIHNlcSgyLCBsYXN0KSksCisgICAgICAgICAgICAgICAiOTAyICA5MDMgIDkwNCAgOTA1ICA5MDYgIDkwNyAgOTA4ICA5MDlcbiIKKyAgICAgICAgICAgICAgICI4MDIgIDgwMyAgODA0ICA4MDUgIDgwNiAgODA3ICA4MDggIDgwOVxuIgorICAgICAgICAgICAgICAgIjcwMiAgNzAzICA3MDQgIDcwNSAgNzA2ICA3MDcgIDcwOCAgNzA5XG4iCisgICAgICAgICAgICAgICAiNjAyICA2MDMgIDYwNCAgNjA1ICA2MDYgIDYwNyAgNjA4ICA2MDlcbiIKKyAgICAgICAgICAgICAgICI1MDIgIDUwMyAgNTA0ICA1MDUgIDUwNiAgNTA3ICA1MDggIDUwOSIpKTsKIAotICBWRVJJRlkoIE1BVENIKCBBKGVpaSwgdmVjaSksCi0gICAgIjMwMyAgMzAxICAzMDYgIDMwNVxuIgotICAgICIxMDMgIDEwMSAgMTA2ICAxMDVcbiIKLSAgICAiNjAzICA2MDEgIDYwNiAgNjA1XG4iCi0gICAgIjUwMyAgNTAxICA1MDYgIDUwNSIpCi0gICk7CisgIFZFUklGWShNQVRDSChBKGVpaSwgdmVjaSksCisgICAgICAgICAgICAgICAiMzAzICAzMDEgIDMwNiAgMzA1XG4iCisgICAgICAgICAgICAgICAiMTAzICAxMDEgIDEwNiAgMTA1XG4iCisgICAgICAgICAgICAgICAiNjAzICA2MDEgIDYwNiAgNjA1XG4iCisgICAgICAgICAgICAgICAiNTAzICA1MDEgIDUwNiAgNTA1IikpOwogCi0gIFZFUklGWSggTUFUQ0goIEEoZWlpLCBhbGwpLAotICAgICIzMDAgIDMwMSAgMzAyICAzMDMgIDMwNCAgMzA1ICAzMDYgIDMwNyAgMzA4ICAzMDlcbiIKLSAgICAiMTAwICAxMDEgIDEwMiAgMTAzICAxMDQgIDEwNSAgMTA2ICAxMDcgIDEwOCAgMTA5XG4iCi0gICAgIjYwMCAgNjAxICA2MDIgIDYwMyAgNjA0ICA2MDUgIDYwNiAgNjA3ICA2MDggIDYwOVxuIgotICAgICI1MDAgIDUwMSAgNTAyICA1MDMgIDUwNCAgNTA1ICA1MDYgIDUwNyAgNTA4ICA1MDkiKQotICApOworICBWRVJJRlkoTUFUQ0goQShlaWksIGFsbCksCisgICAgICAgICAgICAgICAiMzAwICAzMDEgIDMwMiAgMzAzICAzMDQgIDMwNSAgMzA2ICAzMDcgIDMwOCAgMzA5XG4iCisgICAgICAgICAgICAgICAiMTAwICAxMDEgIDEwMiAgMTAzICAxMDQgIDEwNSAgMTA2ICAxMDcgIDEwOCAgMTA5XG4iCisgICAgICAgICAgICAgICAiNjAwICA2MDEgIDYwMiAgNjAzICA2MDQgIDYwNSAgNjA2ICA2MDcgIDYwOCAgNjA5XG4iCisgICAgICAgICAgICAgICAiNTAwICA1MDEgIDUwMiAgNTAzICA1MDQgIDUwNSAgNTA2ICA1MDcgIDUwOCAgNTA5IikpOwogCiAgIC8vIHRha2Ugcm93IG51bWJlciAzLCBhbmQgcmVwZWF0IGl0IDUgdGltZXMKLSAgVkVSSUZZKCBNQVRDSCggQShzZXFOKDMsNSwwKSwgYWxsKSwKLSAgICAiMzAwICAzMDEgIDMwMiAgMzAzICAzMDQgIDMwNSAgMzA2ICAzMDcgIDMwOCAgMzA5XG4iCi0gICAgIjMwMCAgMzAxICAzMDIgIDMwMyAgMzA0ICAzMDUgIDMwNiAgMzA3ICAzMDggIDMwOVxuIgotICAgICIzMDAgIDMwMSAgMzAyICAzMDMgIDMwNCAgMzA1ICAzMDYgIDMwNyAgMzA4ICAzMDlcbiIKLSAgICAiMzAwICAzMDEgIDMwMiAgMzAzICAzMDQgIDMwNSAgMzA2ICAzMDcgIDMwOCAgMzA5XG4iCi0gICAgIjMwMCAgMzAxICAzMDIgIDMwMyAgMzA0ICAzMDUgIDMwNiAgMzA3ICAzMDggIDMwOSIpCi0gICk7CisgIFZFUklGWShNQVRDSChBKHNlcU4oMywgNSwgMCksIGFsbCksCisgICAgICAgICAgICAgICAiMzAwICAzMDEgIDMwMiAgMzAzICAzMDQgIDMwNSAgMzA2ICAzMDcgIDMwOCAgMzA5XG4iCisgICAgICAgICAgICAgICAiMzAwICAzMDEgIDMwMiAgMzAzICAzMDQgIDMwNSAgMzA2ICAzMDcgIDMwOCAgMzA5XG4iCisgICAgICAgICAgICAgICAiMzAwICAzMDEgIDMwMiAgMzAzICAzMDQgIDMwNSAgMzA2ICAzMDcgIDMwOCAgMzA5XG4iCisgICAgICAgICAgICAgICAiMzAwICAzMDEgIDMwMiAgMzAzICAzMDQgIDMwNSAgMzA2ICAzMDcgIDMwOCAgMzA5XG4iCisgICAgICAgICAgICAgICAiMzAwICAzMDEgIDMwMiAgMzAzICAzMDQgIDMwNSAgMzA2ICAzMDcgIDMwOCAgMzA5IikpOwogCi0gIFZFUklGWSggTUFUQ0goIGEoc2VxTigzLDMpLDApLCAiM1xuNFxuNSIgKSApOwotICBWRVJJRlkoIE1BVENIKCBhKHNlcSgzLDUpKSwgIjNcbjRcbjUiICkgKTsKLSAgVkVSSUZZKCBNQVRDSCggYShzZXFOKDMsMywxKSksICIzXG40XG41IiApICk7Ci0gIFZFUklGWSggTUFUQ0goIGEoc2VxTig1LDMsLTEpKSwgIjVcbjRcbjMiICkgKTsKKyAgVkVSSUZZKE1BVENIKGEoc2VxTigzLCAzKSwgMCksICIzXG40XG41IikpOworICBWRVJJRlkoTUFUQ0goYShzZXEoMywgNSkpLCAiM1xuNFxuNSIpKTsKKyAgVkVSSUZZKE1BVENIKGEoc2VxTigzLCAzLCAxKSksICIzXG40XG41IikpOworICBWRVJJRlkoTUFUQ0goYShzZXFOKDUsIDMsIC0xKSksICI1XG40XG4zIikpOwogCi0gIFZFUklGWSggTUFUQ0goIGIoMCxzZXFOKDMsMykpLCAiMyAgNCAgNSIgKSApOwotICBWRVJJRlkoIE1BVENIKCBiKHNlcSgzLDUpKSwgIjMgIDQgIDUiICkgKTsKLSAgVkVSSUZZKCBNQVRDSCggYihzZXFOKDMsMywxKSksICIzICA0ICA1IiApICk7Ci0gIFZFUklGWSggTUFUQ0goIGIoc2VxTig1LDMsLTEpKSwgIjUgIDQgIDMiICkgKTsKKyAgVkVSSUZZKE1BVENIKGIoMCwgc2VxTigzLCAzKSksICIzICA0ICA1IikpOworICBWRVJJRlkoTUFUQ0goYihzZXEoMywgNSkpLCAiMyAgNCAgNSIpKTsKKyAgVkVSSUZZKE1BVENIKGIoc2VxTigzLCAzLCAxKSksICIzICA0ICA1IikpOworICBWRVJJRlkoTUFUQ0goYihzZXFOKDUsIDMsIC0xKSksICI1ICA0ICAzIikpOwogCi0gIFZFUklGWSggTUFUQ0goIGIoYWxsKSwgIjAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkiICkgKTsKLSAgVkVSSUZZKCBNQVRDSCggYihlaWkpLCAiMyAgMSAgNiAgNSIgKSApOworICBWRVJJRlkoTUFUQ0goYihhbGwpLCAiMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSIpKTsKKyAgVkVSSUZZKE1BVENIKGIoZWlpKSwgIjMgIDEgIDYgIDUiKSk7CiAKICAgQXJyYXk0NGkgQjsKICAgQi5zZXRSYW5kb20oKTsKLSAgVkVSSUZZKCAoQShzZXFOKDIsNSksIDUpKS5Db2xzQXRDb21waWxlVGltZSA9PSAxKTsKLSAgVkVSSUZZKCAoQShzZXFOKDIsNSksIDUpKS5Sb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKTsKLSAgVkVSSUZZX0VRX0lOVCggKEEoc2VxTigyLDUpLCA1KSkuSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lICwgQS5Jbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUpOwotICBWRVJJRllfRVFfSU5UKCAoQShzZXFOKDIsNSksIDUpKS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUgLCBBLmNvbCg1KS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpOworICBWRVJJRlkoKEEoc2VxTigyLCA1KSwgNSkpLkNvbHNBdENvbXBpbGVUaW1lID09IDEpOworICBWRVJJRlkoKEEoc2VxTigyLCA1KSwgNSkpLlJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMpOworICBWRVJJRllfRVFfSU5UKChBKHNlcU4oMiwgNSksIDUpKS5Jbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUsIEEuSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lKTsKKyAgVkVSSUZZX0VRX0lOVCgoQShzZXFOKDIsIDUpLCA1KSkuT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lLCBBLmNvbCg1KS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpOwogCi0gIFZFUklGWV9FUV9JTlQoIChBKDUsc2VxTigyLDUpKSkuSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lICwgQS5yb3coNSkuSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lKTsKLSAgVkVSSUZZX0VRX0lOVCggKEEoNSxzZXFOKDIsNSkpKS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUgLCBBLnJvdyg1KS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpOwotICBWRVJJRllfRVFfSU5UKCAoQigxLHNlcU4oMSwyKSkpLklubmVyU3RyaWRlQXRDb21waWxlVGltZSAsIEIucm93KDEpLklubmVyU3RyaWRlQXRDb21waWxlVGltZSk7Ci0gIFZFUklGWV9FUV9JTlQoIChCKDEsc2VxTigxLDIpKSkuT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lICwgQi5yb3coMSkuT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lKTsKKyAgVkVSSUZZX0VRX0lOVCgoQSg1LCBzZXFOKDIsIDUpKSkuSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lLCBBLnJvdyg1KS5Jbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUpOworICBWRVJJRllfRVFfSU5UKChBKDUsIHNlcU4oMiwgNSkpKS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUsIEEucm93KDUpLk91dGVyU3RyaWRlQXRDb21waWxlVGltZSk7CisgIFZFUklGWV9FUV9JTlQoKEIoMSwgc2VxTigxLCAyKSkpLklubmVyU3RyaWRlQXRDb21waWxlVGltZSwgQi5yb3coMSkuSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lKTsKKyAgVkVSSUZZX0VRX0lOVCgoQigxLCBzZXFOKDEsIDIpKSkuT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lLCBCLnJvdygxKS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUpOwogCi0gIFZFUklGWV9FUV9JTlQoIChBKHNlcU4oMiw1KSwgc2VxKDEsMykpKS5Jbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUgLCBBLklubmVyU3RyaWRlQXRDb21waWxlVGltZSk7Ci0gIFZFUklGWV9FUV9JTlQoIChBKHNlcU4oMiw1KSwgc2VxKDEsMykpKS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUgLCBBLk91dGVyU3RyaWRlQXRDb21waWxlVGltZSk7Ci0gIFZFUklGWV9FUV9JTlQoIChCKHNlcU4oMSwyKSwgc2VxKDEsMykpKS5Jbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUgLCBCLklubmVyU3RyaWRlQXRDb21waWxlVGltZSk7Ci0gIFZFUklGWV9FUV9JTlQoIChCKHNlcU4oMSwyKSwgc2VxKDEsMykpKS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUgLCBCLk91dGVyU3RyaWRlQXRDb21waWxlVGltZSk7Ci0gIFZFUklGWV9FUV9JTlQoIChBKHNlcU4oMiw1LDIpLCBzZXEoMSwzLDIpKSkuSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lICwgRHluYW1pYyk7Ci0gIFZFUklGWV9FUV9JTlQoIChBKHNlcU4oMiw1LDIpLCBzZXEoMSwzLDIpKSkuT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lICwgRHluYW1pYyk7Ci0gIFZFUklGWV9FUV9JTlQoIChBKHNlcU4oMiw1LGZpeDwyPiksIHNlcSgxLDMsZml4PDM+KSkpLklubmVyU3RyaWRlQXRDb21waWxlVGltZSAsIDIpOwotICBWRVJJRllfRVFfSU5UKCAoQShzZXFOKDIsNSxmaXg8Mj4pLCBzZXEoMSwzLGZpeDwzPikpKS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUgLCBEeW5hbWljKTsKLSAgVkVSSUZZX0VRX0lOVCggKEIoc2VxTigxLDIsZml4PDI+KSwgc2VxKDEsMyxmaXg8Mz4pKSkuSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lICwgMik7Ci0gIFZFUklGWV9FUV9JTlQoIChCKHNlcU4oMSwyLGZpeDwyPiksIHNlcSgxLDMsZml4PDM+KSkpLk91dGVyU3RyaWRlQXRDb21waWxlVGltZSAsIDMqNCk7CisgIFZFUklGWV9FUV9JTlQoKEEoc2VxTigyLCA1KSwgc2VxKDEsIDMpKSkuSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lLCBBLklubmVyU3RyaWRlQXRDb21waWxlVGltZSk7CisgIFZFUklGWV9FUV9JTlQoKEEoc2VxTigyLCA1KSwgc2VxKDEsIDMpKSkuT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lLCBBLk91dGVyU3RyaWRlQXRDb21waWxlVGltZSk7CisgIFZFUklGWV9FUV9JTlQoKEIoc2VxTigxLCAyKSwgc2VxKDEsIDMpKSkuSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lLCBCLklubmVyU3RyaWRlQXRDb21waWxlVGltZSk7CisgIFZFUklGWV9FUV9JTlQoKEIoc2VxTigxLCAyKSwgc2VxKDEsIDMpKSkuT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lLCBCLk91dGVyU3RyaWRlQXRDb21waWxlVGltZSk7CisgIFZFUklGWV9FUV9JTlQoKEEoc2VxTigyLCA1LCAyKSwgc2VxKDEsIDMsIDIpKSkuSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lLCBEeW5hbWljKTsKKyAgVkVSSUZZX0VRX0lOVCgoQShzZXFOKDIsIDUsIDIpLCBzZXEoMSwgMywgMikpKS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUsIER5bmFtaWMpOworICBWRVJJRllfRVFfSU5UKChBKHNlcU4oMiwgNSwgZml4PDI+KSwgc2VxKDEsIDMsIGZpeDwzPikpKS5Jbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUsIDIpOworICBWRVJJRllfRVFfSU5UKChBKHNlcU4oMiwgNSwgZml4PDI+KSwgc2VxKDEsIDMsIGZpeDwzPikpKS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUsIER5bmFtaWMpOworICBWRVJJRllfRVFfSU5UKChCKHNlcU4oMSwgMiwgZml4PDI+KSwgc2VxKDEsIDMsIGZpeDwzPikpKS5Jbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUsIDIpOworICBWRVJJRllfRVFfSU5UKChCKHNlcU4oMSwgMiwgZml4PDI+KSwgc2VxKDEsIDMsIGZpeDwzPikpKS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUsIDMgKiA0KTsKIAotICBWRVJJRllfRVFfSU5UKCAoQShzZXFOKDIsZml4PDU+KSwgc2VxTigxLGZpeDwzPikpKS5Sb3dzQXRDb21waWxlVGltZSwgNSk7Ci0gIFZFUklGWV9FUV9JTlQoIChBKHNlcU4oMixmaXg8NT4pLCBzZXFOKDEsZml4PDM+KSkpLkNvbHNBdENvbXBpbGVUaW1lLCAzKTsKLSAgVkVSSUZZX0VRX0lOVCggKEEoc2VxTigyLGZpeDw1Pig1KSksIHNlcU4oMSxmaXg8Mz4oMykpKSkuUm93c0F0Q29tcGlsZVRpbWUsIDUpOwotICBWRVJJRllfRVFfSU5UKCAoQShzZXFOKDIsZml4PDU+KDUpKSwgc2VxTigxLGZpeDwzPigzKSkpKS5Db2xzQXRDb21waWxlVGltZSwgMyk7Ci0gIFZFUklGWV9FUV9JTlQoIChBKHNlcU4oMixmaXg8RHluYW1pYz4oNSkpLCBzZXFOKDEsZml4PER5bmFtaWM+KDMpKSkpLlJvd3NBdENvbXBpbGVUaW1lLCBEeW5hbWljKTsKLSAgVkVSSUZZX0VRX0lOVCggKEEoc2VxTigyLGZpeDxEeW5hbWljPig1KSksIHNlcU4oMSxmaXg8RHluYW1pYz4oMykpKSkuQ29sc0F0Q29tcGlsZVRpbWUsIER5bmFtaWMpOwotICBWRVJJRllfRVFfSU5UKCAoQShzZXFOKDIsZml4PER5bmFtaWM+KDUpKSwgc2VxTigxLGZpeDxEeW5hbWljPigzKSkpKS5yb3dzKCksIDUpOwotICBWRVJJRllfRVFfSU5UKCAoQShzZXFOKDIsZml4PER5bmFtaWM+KDUpKSwgc2VxTigxLGZpeDxEeW5hbWljPigzKSkpKS5jb2xzKCksIDMpOworICBWRVJJRllfRVFfSU5UKChBKHNlcU4oMiwgZml4PDU+KSwgc2VxTigxLCBmaXg8Mz4pKSkuUm93c0F0Q29tcGlsZVRpbWUsIDUpOworICBWRVJJRllfRVFfSU5UKChBKHNlcU4oMiwgZml4PDU+KSwgc2VxTigxLCBmaXg8Mz4pKSkuQ29sc0F0Q29tcGlsZVRpbWUsIDMpOworICBWRVJJRllfRVFfSU5UKChBKHNlcU4oMiwgZml4PDU+KDUpKSwgc2VxTigxLCBmaXg8Mz4oMykpKSkuUm93c0F0Q29tcGlsZVRpbWUsIDUpOworICBWRVJJRllfRVFfSU5UKChBKHNlcU4oMiwgZml4PDU+KDUpKSwgc2VxTigxLCBmaXg8Mz4oMykpKSkuQ29sc0F0Q29tcGlsZVRpbWUsIDMpOworICBWRVJJRllfRVFfSU5UKChBKHNlcU4oMiwgZml4PER5bmFtaWM+KDUpKSwgc2VxTigxLCBmaXg8RHluYW1pYz4oMykpKSkuUm93c0F0Q29tcGlsZVRpbWUsIER5bmFtaWMpOworICBWRVJJRllfRVFfSU5UKChBKHNlcU4oMiwgZml4PER5bmFtaWM+KDUpKSwgc2VxTigxLCBmaXg8RHluYW1pYz4oMykpKSkuQ29sc0F0Q29tcGlsZVRpbWUsIER5bmFtaWMpOworICBWRVJJRllfRVFfSU5UKChBKHNlcU4oMiwgZml4PER5bmFtaWM+KDUpKSwgc2VxTigxLCBmaXg8RHluYW1pYz4oMykpKSkucm93cygpLCA1KTsKKyAgVkVSSUZZX0VRX0lOVCgoQShzZXFOKDIsIGZpeDxEeW5hbWljPig1KSksIHNlcU4oMSwgZml4PER5bmFtaWM+KDMpKSkpLmNvbHMoKSwgMyk7CiAKLSAgVkVSSUZZKCBpc19zYW1lX3NlcV90eXBlKCBzZXFOKDIsNSxmaXg8LTE+KSwgc2VxTigyLDUsZml4PC0xPigtMSkpICkgKTsKLSAgVkVSSUZZKCBpc19zYW1lX3NlcV90eXBlKCBzZXFOKDIsNSksIHNlcU4oMiw1LGZpeDwxPigxKSkgKSApOwotICBWRVJJRlkoIGlzX3NhbWVfc2VxX3R5cGUoIHNlcU4oMiw1LDMpLCBzZXFOKDIsNSxmaXg8RHluYW1pY0luZGV4PigzKSkgKSApOwotICBWRVJJRlkoIGlzX3NhbWVfc2VxX3R5cGUoIHNlcSgyLDcsZml4PDM+KSwgc2VxTigyLDIsZml4PDM+KSApICk7Ci0gIFZFUklGWSggaXNfc2FtZV9zZXFfdHlwZSggc2VxTigyLGZpeDxEeW5hbWljPig1KSwzKSwgc2VxTigyLDUsZml4PER5bmFtaWNJbmRleD4oMykpICkgKTsKLSAgVkVSSUZZKCBpc19zYW1lX3NlcV90eXBlKCBzZXFOKDIsZml4PDU+KDUpLGZpeDwtMj4pLCBzZXFOKDIsZml4PDU+LGZpeDwtMj4oKSkgKSApOworICBWRVJJRlkoaXNfc2FtZV9zZXFfdHlwZShzZXFOKDIsIDUsIGZpeDwtMT4pLCBzZXFOKDIsIDUsIGZpeDwtMT4oLTEpKSkpOworICBWRVJJRlkoaXNfc2FtZV9zZXFfdHlwZShzZXFOKDIsIDUpLCBzZXFOKDIsIDUsIGZpeDwxPigxKSkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfc2VxX3R5cGUoc2VxTigyLCA1LCAzKSwgc2VxTigyLCA1LCBmaXg8RHluYW1pY0luZGV4PigzKSkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfc2VxX3R5cGUoc2VxKDIsIDcsIGZpeDwzPiksIHNlcU4oMiwgMiwgZml4PDM+KSkpOworICBWRVJJRlkoaXNfc2FtZV9zZXFfdHlwZShzZXFOKDIsIGZpeDxEeW5hbWljPig1KSwgMyksIHNlcU4oMiwgNSwgZml4PER5bmFtaWNJbmRleD4oMykpKSk7CisgIFZFUklGWShpc19zYW1lX3NlcV90eXBlKHNlcU4oMiwgZml4PDU+KDUpLCBmaXg8LTI+KSwgc2VxTigyLCBmaXg8NT4sIGZpeDwtMj4oKSkpKTsKIAotICBWRVJJRlkoIGlzX3NhbWVfc2VxX3R5cGUoIHNlcSgyLGZpeDw1PiksIHNlcU4oMiw0KSApICk7Ci0gIFZFUklGWSggaXNfc2FtZV9zZXFfdHlwZSggc2VxKGZpeDwyPixmaXg8NT4pLCBzZXFOKGZpeDwyPixmaXg8ND4pICkgKTsKLSAgVkVSSUZZKCBpc19zYW1lX3NlcSggc2VxTigyLHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LDU+KCksc3RkOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsLTI+KCkpLCBzZXFOKDIsZml4PDU+LGZpeDwtMj4oKSkgKSApOwotICBWRVJJRlkoIGlzX3NhbWVfc2VxKCBzZXEoc3RkOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsMT4oKSxzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCw1PigpLHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LDI+KCkpLAotICAgICAgICAgICAgICAgICAgICAgICBzZXEoZml4PDE+LGZpeDw1PixmaXg8Mj4oKSkgKSApOwotICBWRVJJRlkoIGlzX3NhbWVfc2VxX3R5cGUoIHNlcU4oMixzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCw1PigpLHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LC0yPigpKSwgc2VxTigyLGZpeDw1PixmaXg8LTI+KCkpICkgKTsKLSAgVkVSSUZZKCBpc19zYW1lX3NlcV90eXBlKCBzZXEoc3RkOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsMT4oKSxzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCw1PigpLHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LDI+KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcShmaXg8MT4sZml4PDU+LGZpeDwyPigpKSApICk7CisgIFZFUklGWShpc19zYW1lX3NlcV90eXBlKHNlcSgyLCBmaXg8NT4pLCBzZXFOKDIsIDQpKSk7CisgIFZFUklGWShpc19zYW1lX3NlcV90eXBlKHNlcShmaXg8Mj4sIGZpeDw1PiksIHNlcU4oZml4PDI+LCBmaXg8ND4pKSk7CisgIFZFUklGWShpc19zYW1lX3NlcShzZXFOKDIsIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCA1PigpLCBzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCwgLTI+KCkpLAorICAgICAgICAgICAgICAgICAgICAgc2VxTigyLCBmaXg8NT4sIGZpeDwtMj4oKSkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfc2VxKAorICAgICAgc2VxKHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCAxPigpLCBzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCwgNT4oKSwgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsIDI+KCkpLAorICAgICAgc2VxKGZpeDwxPiwgZml4PDU+LCBmaXg8Mj4oKSkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfc2VxX3R5cGUoc2VxTigyLCBzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCwgNT4oKSwgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsIC0yPigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxTigyLCBmaXg8NT4sIGZpeDwtMj4oKSkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfc2VxX3R5cGUoCisgICAgICBzZXEoc3RkOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsIDE+KCksIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCA1PigpLCBzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCwgMj4oKSksCisgICAgICBzZXEoZml4PDE+LCBmaXg8NT4sIGZpeDwyPigpKSkpOwogCi0gIFZFUklGWSggaXNfc2FtZV9zZXFfdHlwZSggc2VxTigyLHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LDU+KCkpLCBzZXFOKDIsZml4PDU+KSApICk7Ci0gIFZFUklGWSggaXNfc2FtZV9zZXFfdHlwZSggc2VxKHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LDE+KCksc3RkOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsNT4oKSksIHNlcShmaXg8MT4sZml4PDU+KSApICk7CisgIFZFUklGWShpc19zYW1lX3NlcV90eXBlKHNlcU4oMiwgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsIDU+KCkpLCBzZXFOKDIsIGZpeDw1PikpKTsKKyAgVkVSSUZZKAorICAgICAgaXNfc2FtZV9zZXFfdHlwZShzZXEoc3RkOjppbnRlZ3JhbF9jb25zdGFudDxpbnQsIDE+KCksIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCA1PigpKSwgc2VxKGZpeDwxPiwgZml4PDU+KSkpOwogCi0gIFZFUklGWSggKEEoc2VxTigyLGZpeDw1PiksIDUpKS5Sb3dzQXRDb21waWxlVGltZSA9PSA1KTsKLSAgVkVSSUZZKCAoQSg0LCBhbGwpKS5Db2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKTsKLSAgVkVSSUZZKCAoQSg0LCBhbGwpKS5Sb3dzQXRDb21waWxlVGltZSA9PSAxKTsKLSAgVkVSSUZZKCAoQigxLCBhbGwpKS5Db2xzQXRDb21waWxlVGltZSA9PSA0KTsKLSAgVkVSSUZZKCAoQigxLCBhbGwpKS5Sb3dzQXRDb21waWxlVGltZSA9PSAxKTsKLSAgVkVSSUZZKCAoQihhbGwsMSkpLkNvbHNBdENvbXBpbGVUaW1lID09IDEpOwotICBWRVJJRlkoIChCKGFsbCwxKSkuUm93c0F0Q29tcGlsZVRpbWUgPT0gNCk7CisgIFZFUklGWSgoQShzZXFOKDIsIGZpeDw1PiksIDUpKS5Sb3dzQXRDb21waWxlVGltZSA9PSA1KTsKKyAgVkVSSUZZKChBKDQsIGFsbCkpLkNvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMpOworICBWRVJJRlkoKEEoNCwgYWxsKSkuUm93c0F0Q29tcGlsZVRpbWUgPT0gMSk7CisgIFZFUklGWSgoQigxLCBhbGwpKS5Db2xzQXRDb21waWxlVGltZSA9PSA0KTsKKyAgVkVSSUZZKChCKDEsIGFsbCkpLlJvd3NBdENvbXBpbGVUaW1lID09IDEpOworICBWRVJJRlkoKEIoYWxsLCAxKSkuQ29sc0F0Q29tcGlsZVRpbWUgPT0gMSk7CisgIFZFUklGWSgoQihhbGwsIDEpKS5Sb3dzQXRDb21waWxlVGltZSA9PSA0KTsKIAotICBWRVJJRlkoaW50KCAoQShhbGwsIGVpaSkpLkNvbHNBdENvbXBpbGVUaW1lKSA9PSBpbnQoZWlpLlNpemVBdENvbXBpbGVUaW1lKSk7Ci0gIFZFUklGWV9FUV9JTlQoIChBKGVpaSwgZWlpKSkuRmxhZ3MmRGlyZWN0QWNjZXNzQml0LCAodW5zaWduZWQgaW50KSgwKSk7Ci0gIFZFUklGWV9FUV9JTlQoIChBKGVpaSwgZWlpKSkuSW5uZXJTdHJpZGVBdENvbXBpbGVUaW1lLCAwKTsKLSAgVkVSSUZZX0VRX0lOVCggKEEoZWlpLCBlaWkpKS5PdXRlclN0cmlkZUF0Q29tcGlsZVRpbWUsIDApOworICBWRVJJRlkoaW50KChBKGFsbCwgZWlpKSkuQ29sc0F0Q29tcGlsZVRpbWUpID09IGludChlaWkuU2l6ZUF0Q29tcGlsZVRpbWUpKTsKKyAgVkVSSUZZX0VRX0lOVCgoQShlaWksIGVpaSkpLkZsYWdzICYgRGlyZWN0QWNjZXNzQml0LCAodW5zaWduZWQgaW50KSgwKSk7CisgIFZFUklGWV9FUV9JTlQoKEEoZWlpLCBlaWkpKS5Jbm5lclN0cmlkZUF0Q29tcGlsZVRpbWUsIDApOworICBWRVJJRllfRVFfSU5UKChBKGVpaSwgZWlpKSkuT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lLCAwKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCBBKHNlcShuLTEsMiwtMiksIHNlcU4obi0xLTYsMywtMSkpLCBBKHNlcShsYXN0LDIsZml4PC0yPiksIHNlcU4obGFzdC02LDMsZml4PC0xPikpICk7CisgIFZFUklGWV9JU19BUFBST1goQShzZXEobiAtIDEsIDIsIC0yKSwgc2VxTihuIC0gMSAtIDYsIDMsIC0xKSksIEEoc2VxKGxhc3QsIDIsIGZpeDwtMj4pLCBzZXFOKGxhc3QgLSA2LCAzLCBmaXg8LTE+KSkpOwogCi0gIFZFUklGWV9JU19BUFBST1goIEEoc2VxKG4tMSwyLC0yKSwgc2VxTihuLTEtNiw0KSksIEEoc2VxKGxhc3QsMiwtMiksIHNlcU4obGFzdC02LDQpKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBBKHNlcShuLTEtNixuLTEtMiksIHNlcU4obi0xLTYsNCkpLCBBKHNlcShsYXN0LTYsbGFzdC0yKSwgc2VxTig2K2xhc3QtNi02LDQpKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBBKHNlcSgobi0xKS8yLChuKS8yKzMpLCBzZXFOKDIsNCkpLCBBKHNlcShsYXN0LzIsKGxhc3QrMSkvMiszKSwgc2VxTihsYXN0KzItbGFzdCw0KSkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggQShzZXEobi0yLDIsLTIpLCBzZXFOKG4tOCw0KSksIEEoc2VxKGxhc3RwMS0yLDIsLTIpLCBzZXFOKGxhc3RwMS04LDQpKSApOworICBWRVJJRllfSVNfQVBQUk9YKEEoc2VxKG4gLSAxLCAyLCAtMiksIHNlcU4obiAtIDEgLSA2LCA0KSksIEEoc2VxKGxhc3QsIDIsIC0yKSwgc2VxTihsYXN0IC0gNiwgNCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChBKHNlcShuIC0gMSAtIDYsIG4gLSAxIC0gMiksIHNlcU4obiAtIDEgLSA2LCA0KSksCisgICAgICAgICAgICAgICAgICAgQShzZXEobGFzdCAtIDYsIGxhc3QgLSAyKSwgc2VxTig2ICsgbGFzdCAtIDYgLSA2LCA0KSkpOworICBWRVJJRllfSVNfQVBQUk9YKEEoc2VxKChuIC0gMSkgLyAyLCAobikgLyAyICsgMyksIHNlcU4oMiwgNCkpLAorICAgICAgICAgICAgICAgICAgIEEoc2VxKGxhc3QgLyAyLCAobGFzdCArIDEpIC8gMiArIDMpLCBzZXFOKGxhc3QgKyAyIC0gbGFzdCwgNCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChBKHNlcShuIC0gMiwgMiwgLTIpLCBzZXFOKG4gLSA4LCA0KSksIEEoc2VxKGxhc3RwMSAtIDIsIDIsIC0yKSwgc2VxTihsYXN0cDEgLSA4LCA0KSkpOwogCiAgIC8vIENoZWNrIGFsbCBjb21iaW5hdGlvbnMgb2Ygc2VxOgotICBWRVJJRllfSVNfQVBQUk9YKCBBKHNlcSgxLG4tMS0yLDIpLCBzZXEoMSxuLTEtMiwyKSksIEEoc2VxKDEsbGFzdC0yLDIpLCBzZXEoMSxsYXN0LTIsZml4PDI+KSkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggQShzZXEobi0xLTUsbi0xLTIsMiksIHNlcShuLTEtNSxuLTEtMiwyKSksIEEoc2VxKGxhc3QtNSxsYXN0LTIsMiksIHNlcShsYXN0LTUsbGFzdC0yLGZpeDwyPikpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIEEoc2VxKG4tMS01LDcsMiksIHNlcShuLTEtNSw3LDIpKSwgQShzZXEobGFzdC01LDcsMiksIHNlcShsYXN0LTUsNyxmaXg8Mj4pKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBBKHNlcSgxLG4tMS0yKSwgc2VxKG4tMS01LDcpKSwgQShzZXEoMSxsYXN0LTIpLCBzZXEobGFzdC01LDcpKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBBKHNlcShuLTEtNSxuLTEtMiksIHNlcShuLTEtNSxuLTEtMikpLCBBKHNlcShsYXN0LTUsbGFzdC0yKSwgc2VxKGxhc3QtNSxsYXN0LTIpKSApOworICBWRVJJRllfSVNfQVBQUk9YKEEoc2VxKDEsIG4gLSAxIC0gMiwgMiksIHNlcSgxLCBuIC0gMSAtIDIsIDIpKSwgQShzZXEoMSwgbGFzdCAtIDIsIDIpLCBzZXEoMSwgbGFzdCAtIDIsIGZpeDwyPikpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChBKHNlcShuIC0gMSAtIDUsIG4gLSAxIC0gMiwgMiksIHNlcShuIC0gMSAtIDUsIG4gLSAxIC0gMiwgMikpLAorICAgICAgICAgICAgICAgICAgIEEoc2VxKGxhc3QgLSA1LCBsYXN0IC0gMiwgMiksIHNlcShsYXN0IC0gNSwgbGFzdCAtIDIsIGZpeDwyPikpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChBKHNlcShuIC0gMSAtIDUsIDcsIDIpLCBzZXEobiAtIDEgLSA1LCA3LCAyKSksIEEoc2VxKGxhc3QgLSA1LCA3LCAyKSwgc2VxKGxhc3QgLSA1LCA3LCBmaXg8Mj4pKSk7CisgIFZFUklGWV9JU19BUFBST1goQShzZXEoMSwgbiAtIDEgLSAyKSwgc2VxKG4gLSAxIC0gNSwgNykpLCBBKHNlcSgxLCBsYXN0IC0gMiksIHNlcShsYXN0IC0gNSwgNykpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChBKHNlcShuIC0gMSAtIDUsIG4gLSAxIC0gMiksIHNlcShuIC0gMSAtIDUsIG4gLSAxIC0gMikpLAorICAgICAgICAgICAgICAgICAgIEEoc2VxKGxhc3QgLSA1LCBsYXN0IC0gMiksIHNlcShsYXN0IC0gNSwgbGFzdCAtIDIpKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWCggQS5jb2woQS5jb2xzKCktMSksIEEoYWxsLGxhc3QpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIEEoQS5yb3dzKCktMiwgQS5jb2xzKCkvMiksIEEobGFzdC0xLCBsYXN0cDEvMikgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggYShhLnNpemUoKS0yKSwgYShsYXN0LTEpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIGEoYS5zaXplKCkvMiksIGEoKGxhc3QrMSkvMikgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChBLmNvbChBLmNvbHMoKSAtIDEpLCBBKGFsbCwgbGFzdCkpOworICBWRVJJRllfSVNfQVBQUk9YKEEoQS5yb3dzKCkgLSAyLCBBLmNvbHMoKSAvIDIpLCBBKGxhc3QgLSAxLCBsYXN0cDEgLyAyKSk7CisgIFZFUklGWV9JU19BUFBST1goYShhLnNpemUoKSAtIDIpLCBhKGxhc3QgLSAxKSk7CisgIFZFUklGWV9JU19BUFBST1goYShhLnNpemUoKSAvIDIpLCBhKChsYXN0ICsgMSkgLyAyKSk7CiAKICAgLy8gQ2hlY2sgZmFsbC1iYWNrIHRvIEJsb2NrCiAgIHsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoQS5jb2woMCksIEEoYWxsLDApKSApOwotICAgIFZFUklGWSggaXNfc2FtZV9lcShBLnJvdygwKSwgQSgwLGFsbCkpICk7Ci0gICAgVkVSSUZZKCBpc19zYW1lX2VxKEEuYmxvY2soMCwwLDIsMiksIEEoc2VxTigwLDIpLHNlcSgwLDEpKSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoQS5taWRkbGVSb3dzKDIsNCksIEEoc2VxTigyLDQpLGFsbCkpICk7Ci0gICAgVkVSSUZZKCBpc19zYW1lX2VxKEEubWlkZGxlQ29scygyLDQpLCBBKGFsbCxzZXFOKDIsNCkpKSApOworICAgIFZFUklGWShpc19zYW1lX2VxKEEuY29sKDApLCBBKGFsbCwgMCkpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLnJvdygwKSwgQSgwLCBhbGwpKSk7CisgICAgVkVSSUZZKGlzX3NhbWVfZXEoQS5ibG9jaygwLCAwLCAyLCAyKSwgQShzZXFOKDAsIDIpLCBzZXEoMCwgMSkpKSk7CisgICAgVkVSSUZZKGlzX3NhbWVfZXEoQS5taWRkbGVSb3dzKDIsIDQpLCBBKHNlcU4oMiwgNCksIGFsbCkpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLm1pZGRsZUNvbHMoMiwgNCksIEEoYWxsLCBzZXFOKDIsIDQpKSkpOwogCi0gICAgVkVSSUZZKCBpc19zYW1lX2VxKEEuY29sKEEuY29scygpLTEpLCBBKGFsbCxsYXN0KSkgKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLmNvbChBLmNvbHMoKSAtIDEpLCBBKGFsbCwgbGFzdCkpKTsKIAogICAgIGNvbnN0IEFycmF5WFhpJiBjQShBKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoY0EuY29sKDApLCBjQShhbGwsMCkpICk7Ci0gICAgVkVSSUZZKCBpc19zYW1lX2VxKGNBLnJvdygwKSwgY0EoMCxhbGwpKSApOwotICAgIFZFUklGWSggaXNfc2FtZV9lcShjQS5ibG9jaygwLDAsMiwyKSwgY0Eoc2VxTigwLDIpLHNlcSgwLDEpKSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoY0EubWlkZGxlUm93cygyLDQpLCBjQShzZXFOKDIsNCksYWxsKSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoY0EubWlkZGxlQ29scygyLDQpLCBjQShhbGwsc2VxTigyLDQpKSkgKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShjQS5jb2woMCksIGNBKGFsbCwgMCkpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShjQS5yb3coMCksIGNBKDAsIGFsbCkpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShjQS5ibG9jaygwLCAwLCAyLCAyKSwgY0Eoc2VxTigwLCAyKSwgc2VxKDAsIDEpKSkpOworICAgIFZFUklGWShpc19zYW1lX2VxKGNBLm1pZGRsZVJvd3MoMiwgNCksIGNBKHNlcU4oMiwgNCksIGFsbCkpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShjQS5taWRkbGVDb2xzKDIsIDQpLCBjQShhbGwsIHNlcU4oMiwgNCkpKSk7CiAKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoYS5oZWFkKDQpLCBhKHNlcSgwLDMpKSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoYS50YWlsKDQpLCBhKHNlcU4obGFzdC0zLDQpKSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoYS50YWlsKDQpLCBhKHNlcShsYXN0cDEtNCxsYXN0KSkpICk7Ci0gICAgVkVSSUZZKCBpc19zYW1lX2VxKGEuc2VnbWVudDw0PigzKSwgYShzZXFOKDMsZml4PDQ+KSkpICk7CisgICAgVkVSSUZZKGlzX3NhbWVfZXEoYS5oZWFkKDQpLCBhKHNlcSgwLCAzKSkpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShhLnRhaWwoNCksIGEoc2VxTihsYXN0IC0gMywgNCkpKSk7CisgICAgVkVSSUZZKGlzX3NhbWVfZXEoYS50YWlsKDQpLCBhKHNlcShsYXN0cDEgLSA0LCBsYXN0KSkpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShhLnNlZ21lbnQ8ND4oMyksIGEoc2VxTigzLCBmaXg8ND4pKSkpOwogICB9CiAKLSAgQXJyYXlYWGkgQTE9QSwgQTIgPSBBcnJheVhYaTo6UmFuZG9tKDQsNCk7Ci0gIEFycmF5WGkgcmFuZ2UyNSg0KTsgcmFuZ2UyNSA8PCAzLDIsNCw1OwotICBBMShzZXFOKDMsNCksc2VxKDIsNSkpID0gQTI7Ci0gIFZFUklGWV9JU19BUFBST1goIEExLmJsb2NrKDMsMiw0LDQpLCBBMiApOworICBBcnJheVhYaSBBMSA9IEEsIEEyID0gQXJyYXlYWGk6OlJhbmRvbSg0LCA0KTsKKyAgQXJyYXlYaSByYW5nZTI1KDQpOworICByYW5nZTI1IDw8IDMsIDIsIDQsIDU7CisgIEExKHNlcU4oMywgNCksIHNlcSgyLCA1KSkgPSBBMjsKKyAgVkVSSUZZX0lTX0FQUFJPWChBMS5ibG9jaygzLCAyLCA0LCA0KSwgQTIpOwogICBBMSA9IEE7CiAgIEEyLnNldE9uZXMoKTsKLSAgQTEoc2VxKDYsMywtMSkscmFuZ2UyNSkgPSBBMjsKLSAgVkVSSUZZX0lTX0FQUFJPWCggQTEuYmxvY2soMywyLDQsNCksIEEyICk7CisgIEExKHNlcSg2LCAzLCAtMSksIHJhbmdlMjUpID0gQTI7CisgIFZFUklGWV9JU19BUFBST1goQTEuYmxvY2soMywgMiwgNCwgNCksIEEyKTsKIAogICAvLyBjaGVjayByZXZlcnNlCiAgIHsKLSAgICBWRVJJRlkoIGlzX3NhbWVfc2VxX3R5cGUoIHNlcSgzLDcpLnJldmVyc2UoKSwgc2VxTig3LDUsZml4PC0xPikgICkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfc2VxX3R5cGUoIHNlcSg3LDMsZml4PC0yPikucmV2ZXJzZSgpLCBzZXFOKDMsMyxmaXg8Mj4pICApICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggYShzZXFOKDIsbGFzdC8yKS5yZXZlcnNlKCkpLCBhKHNlcU4oMisobGFzdC8yLTEpKjEsbGFzdC8yLGZpeDwtMT4pKSApOwotICAgIFZFUklGWV9JU19BUFBST1goIGEoc2VxTihsYXN0LzIsZml4PDQ+KS5yZXZlcnNlKCkpLGEoc2VxTihsYXN0LzIsZml4PDQ+KSkucmV2ZXJzZSgpICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggQShzZXEobGFzdC01LGxhc3QtMSwyKS5yZXZlcnNlKCksIHNlcU4obGFzdC0zLDMsZml4PC0yPikucmV2ZXJzZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICBBKHNlcShsYXN0LTUsbGFzdC0xLDIpLCBzZXFOKGxhc3QtMywzLGZpeDwtMj4pKS5yZXZlcnNlKCkgKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9zZXFfdHlwZShzZXEoMywgNykucmV2ZXJzZSgpLCBzZXFOKDcsIDUsIGZpeDwtMT4pKSk7CisgICAgVkVSSUZZKGlzX3NhbWVfc2VxX3R5cGUoc2VxKDcsIDMsIGZpeDwtMj4pLnJldmVyc2UoKSwgc2VxTigzLCAzLCBmaXg8Mj4pKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChhKHNlcU4oMiwgbGFzdCAvIDIpLnJldmVyc2UoKSksIGEoc2VxTigyICsgKGxhc3QgLyAyIC0gMSkgKiAxLCBsYXN0IC8gMiwgZml4PC0xPikpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGEoc2VxTihsYXN0IC8gMiwgZml4PDQ+KS5yZXZlcnNlKCkpLCBhKHNlcU4obGFzdCAvIDIsIGZpeDw0PikpLnJldmVyc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChBKHNlcShsYXN0IC0gNSwgbGFzdCAtIDEsIDIpLnJldmVyc2UoKSwgc2VxTihsYXN0IC0gMywgMywgZml4PC0yPikucmV2ZXJzZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgIEEoc2VxKGxhc3QgLSA1LCBsYXN0IC0gMSwgMiksIHNlcU4obGFzdCAtIDMsIDMsIGZpeDwtMj4pKS5yZXZlcnNlKCkpOwogICB9CiAKICAgLy8gY2hlY2sgbGFzdE4KLSAgVkVSSUZZX0lTX0FQUFJPWCggYShsYXN0TigzKSksIGEudGFpbCgzKSApOwotICBWRVJJRlkoIE1BVENIKCBhKGxhc3ROKDMpKSwgIjdcbjhcbjkiICkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggYShsYXN0TihmaXg8Mz4oKSkpLCBhLnRhaWw8Mz4oKSApOwotICBWRVJJRlkoIE1BVENIKCBhKGxhc3ROKDMsMikpLCAiNVxuN1xuOSIgKSApOwotICBWRVJJRlkoIE1BVENIKCBhKGxhc3ROKDMsZml4PDI+KCkpKSwgIjVcbjdcbjkiICkgKTsKLSAgVkVSSUZZKCBhKGxhc3ROKGZpeDwzPigpKSkuU2l6ZUF0Q29tcGlsZVRpbWUgPT0gMyApOworICBWRVJJRllfSVNfQVBQUk9YKGEobGFzdE4oMykpLCBhLnRhaWwoMykpOworICBWRVJJRlkoTUFUQ0goYShsYXN0TigzKSksICI3XG44XG45IikpOworICBWRVJJRllfSVNfQVBQUk9YKGEobGFzdE4oZml4PDM+KCkpKSwgYS50YWlsPDM+KCkpOworICBWRVJJRlkoTUFUQ0goYShsYXN0TigzLCAyKSksICI1XG43XG45IikpOworICBWRVJJRlkoTUFUQ0goYShsYXN0TigzLCBmaXg8Mj4oKSkpLCAiNVxuN1xuOSIpKTsKKyAgVkVSSUZZKGEobGFzdE4oZml4PDM+KCkpKS5TaXplQXRDb21waWxlVGltZSA9PSAzKTsKIAotICBWRVJJRlkoIChBKGFsbCwgc3RkOjphcnJheTxpbnQsND57ezEsMywyLDR9fSkpLkNvbHNBdENvbXBpbGVUaW1lID09IDQpOworICBWRVJJRlkoKEEoYWxsLCBzdGQ6OmFycmF5PGludCwgND57ezEsIDMsIDIsIDR9fSkpLkNvbHNBdENvbXBpbGVUaW1lID09IDQpOwogCi0gIFZFUklGWV9JU19BUFBST1goIChBKHN0ZDo6YXJyYXk8aW50LDM+e3sxLDMsNX19LCBzdGQ6OmFycmF5PGludCw0Pnt7OSw2LDMsMH19KSksIEEoc2VxTigxLDMsMiksIHNlcU4oOSw0LC0zKSkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoQShzdGQ6OmFycmF5PGludCwgMz57ezEsIDMsIDV9fSwgc3RkOjphcnJheTxpbnQsIDQ+e3s5LCA2LCAzLCAwfX0pKSwKKyAgICAgICAgICAgICAgICAgICBBKHNlcU4oMSwgMywgMiksIHNlcU4oOSwgNCwgLTMpKSk7CiAgIFZFUklGWV9JU19FUVVBTChBKHN0ZDo6YXJyYXk8aW50LCAzPnsxLCAzLCA1fSwgc3RkOjphcnJheTxpbnQsIDQ+ezMsIDEsIDYsIDV9KS5Sb3dzQXRDb21waWxlVGltZSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTChBKHN0ZDo6YXJyYXk8aW50LCAzPnsxLCAzLCA1fSwgc3RkOjphcnJheTxpbnQsIDQ+ezMsIDEsIDYsIDV9KS5Db2xzQXRDb21waWxlVGltZSwgNCk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKCBhKHN0ZDo6YXJyYXk8aW50LDM+ezEsMyw1fSkuU2l6ZUF0Q29tcGlsZVRpbWUsIDMgKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCBiKHN0ZDo6YXJyYXk8aW50LDM+ezEsMyw1fSkuU2l6ZUF0Q29tcGlsZVRpbWUsIDMgKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGEoc3RkOjphcnJheTxpbnQsIDM+ezEsIDMsIDV9KS5TaXplQXRDb21waWxlVGltZSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChiKHN0ZDo6YXJyYXk8aW50LCAzPnsxLCAzLCA1fSkuU2l6ZUF0Q29tcGlsZVRpbWUsIDMpOwogCiAgIC8vIGNoZWNrIGRpZmZlcmVudCBpbmRleCB0eXBlcyAoQy1zdHlsZSBhcnJheSwgU1RMIGNvbnRhaW5lciwgRWlnZW4gdHlwZSkKICAgewpAQCAtMzAyLDIzICsyOTQsMjMgQEAKICAgICBBcnJheVhpIGlkeCA9IEFycmF5WGk6OkVxdWFsU3BhY2VkKHNpemUsIDAsIDEpOwogICAgIHN0ZDo6c2h1ZmZsZShpZHguYmVnaW4oKSwgaWR4LmVuZCgpLCBzdGQ6OnJhbmRvbV9kZXZpY2UoKSk7CiAKLSAgICBpbnQgY19hcnJheVszXSA9IHsgaWR4WzBdLCBpZHhbMV0sIGlkeFsyXSB9OwotICAgIHN0ZDo6dmVjdG9yPGludD4gc3RkX3ZlY3RvcnsgaWR4WzBdLCBpZHhbMV0sIGlkeFsyXSB9OwotICAgIE1hdHJpeDxpbnQsIDMsIDE+IGVpZ2VuX21hdHJpeHsgaWR4WzBdLCBpZHhbMV0sIGlkeFsyXSB9OworICAgIGludCBjX2FycmF5WzNdID0ge2lkeFswXSwgaWR4WzFdLCBpZHhbMl19OworICAgIHN0ZDo6dmVjdG9yPGludD4gc3RkX3ZlY3RvcntpZHhbMF0sIGlkeFsxXSwgaWR4WzJdfTsKKyAgICBNYXRyaXg8aW50LCAzLCAxPiBlaWdlbl9tYXRyaXh7aWR4WzBdLCBpZHhbMV0sIGlkeFsyXX07CiAKICAgICAvLyBub24tY29uc3QgYWNjZXNzCi0gICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKHIoeyBpZHhbMF0sIGlkeFsxXSwgaWR4WzJdIH0pLCByKGNfYXJyYXkpKTsKLSAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwocih7IGlkeFswXSwgaWR4WzFdLCBpZHhbMl0gfSksIHIoc3RkX3ZlY3RvcikpOwotICAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChyKHsgaWR4WzBdLCBpZHhbMV0sIGlkeFsyXSB9KSwgcihlaWdlbl9tYXRyaXgpKTsKKyAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwocih7aWR4WzBdLCBpZHhbMV0sIGlkeFsyXX0pLCByKGNfYXJyYXkpKTsKKyAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwocih7aWR4WzBdLCBpZHhbMV0sIGlkeFsyXX0pLCByKHN0ZF92ZWN0b3IpKTsKKyAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwocih7aWR4WzBdLCBpZHhbMV0sIGlkeFsyXX0pLCByKGVpZ2VuX21hdHJpeCkpOwogICAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChyKHN0ZF92ZWN0b3IpLCByKGNfYXJyYXkpKTsKICAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwocihzdGRfdmVjdG9yKSwgcihlaWdlbl9tYXRyaXgpKTsKICAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwocihlaWdlbl9tYXRyaXgpLCByKGNfYXJyYXkpKTsKIAogICAgIGNvbnN0IEFycmF5WGQmIHJfcmVmID0gcjsKICAgICAvLyBjb25zdCBhY2Nlc3MKLSAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwocl9yZWYoeyBpZHhbMF0sIGlkeFsxXSwgaWR4WzJdIH0pLCByX3JlZihjX2FycmF5KSk7Ci0gICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKHJfcmVmKHsgaWR4WzBdLCBpZHhbMV0sIGlkeFsyXSB9KSwgcl9yZWYoc3RkX3ZlY3RvcikpOwotICAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChyX3JlZih7IGlkeFswXSwgaWR4WzFdLCBpZHhbMl0gfSksIHJfcmVmKGVpZ2VuX21hdHJpeCkpOworICAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChyX3JlZih7aWR4WzBdLCBpZHhbMV0sIGlkeFsyXX0pLCByX3JlZihjX2FycmF5KSk7CisgICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKHJfcmVmKHtpZHhbMF0sIGlkeFsxXSwgaWR4WzJdfSksIHJfcmVmKHN0ZF92ZWN0b3IpKTsKKyAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwocl9yZWYoe2lkeFswXSwgaWR4WzFdLCBpZHhbMl19KSwgcl9yZWYoZWlnZW5fbWF0cml4KSk7CiAgICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKHJfcmVmKHN0ZF92ZWN0b3IpLCByX3JlZihjX2FycmF5KSk7CiAgICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKHJfcmVmKHN0ZF92ZWN0b3IpLCByX3JlZihlaWdlbl9tYXRyaXgpKTsKICAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwocl9yZWYoZWlnZW5fbWF0cml4KSwgcl9yZWYoY19hcnJheSkpOwpAQCAtMzMzLDI2ICszMjUsMzIgQEAKICAgICBzdGQ6OnNodWZmbGUocl9pZHguYmVnaW4oKSwgcl9pZHguZW5kKCksIHN0ZDo6cmFuZG9tX2RldmljZSgpKTsKICAgICBzdGQ6OnNodWZmbGUoY19pZHguYmVnaW4oKSwgY19pZHguZW5kKCksIHN0ZDo6cmFuZG9tX2RldmljZSgpKTsKIAotICAgIGludCBjX2FycmF5X3Jvd3NbM10gPSB7IHJfaWR4WzBdLCByX2lkeFsxXSwgcl9pZHhbMl0gfTsKLSAgICBpbnQgY19hcnJheV9jb2xzWzRdID0geyBjX2lkeFswXSwgY19pZHhbMV0sIGNfaWR4WzJdLCBjX2lkeFszXSB9OwotICAgIHN0ZDo6dmVjdG9yPGludD4gc3RkX3ZlY3Rvcl9yb3dzeyByX2lkeFswXSwgcl9pZHhbMV0sIHJfaWR4WzJdIH07Ci0gICAgc3RkOjp2ZWN0b3I8aW50PiBzdGRfdmVjdG9yX2NvbHN7IGNfaWR4WzBdLCBjX2lkeFsxXSwgY19pZHhbMl0sIGNfaWR4WzNdIH07Ci0gICAgTWF0cml4PGludCwgMywgMT4gZWlnZW5fbWF0cml4X3Jvd3N7IHJfaWR4WzBdLCByX2lkeFsxXSwgcl9pZHhbMl0gfTsKLSAgICBNYXRyaXg8aW50LCA0LCAxPiBlaWdlbl9tYXRyaXhfY29sc3sgY19pZHhbMF0sIGNfaWR4WzFdLCBjX2lkeFsyXSwgY19pZHhbM10gfTsKKyAgICBpbnQgY19hcnJheV9yb3dzWzNdID0ge3JfaWR4WzBdLCByX2lkeFsxXSwgcl9pZHhbMl19OworICAgIGludCBjX2FycmF5X2NvbHNbNF0gPSB7Y19pZHhbMF0sIGNfaWR4WzFdLCBjX2lkeFsyXSwgY19pZHhbM119OworICAgIHN0ZDo6dmVjdG9yPGludD4gc3RkX3ZlY3Rvcl9yb3dze3JfaWR4WzBdLCByX2lkeFsxXSwgcl9pZHhbMl19OworICAgIHN0ZDo6dmVjdG9yPGludD4gc3RkX3ZlY3Rvcl9jb2xze2NfaWR4WzBdLCBjX2lkeFsxXSwgY19pZHhbMl0sIGNfaWR4WzNdfTsKKyAgICBNYXRyaXg8aW50LCAzLCAxPiBlaWdlbl9tYXRyaXhfcm93c3tyX2lkeFswXSwgcl9pZHhbMV0sIHJfaWR4WzJdfTsKKyAgICBNYXRyaXg8aW50LCA0LCAxPiBlaWdlbl9tYXRyaXhfY29sc3tjX2lkeFswXSwgY19pZHhbMV0sIGNfaWR4WzJdLCBjX2lkeFszXX07CiAKICAgICAvLyBub24tY29uc3QgYWNjZXNzCi0gICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKFIoeyByX2lkeFswXSwgcl9pZHhbMV0sIHJfaWR4WzJdIH0sIHsgY19pZHhbMF0sIGNfaWR4WzFdLCBjX2lkeFsyXSwgY19pZHhbM10gfSksIFIoY19hcnJheV9yb3dzLCBjX2FycmF5X2NvbHMpKTsKLSAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwoUih7IHJfaWR4WzBdLCByX2lkeFsxXSwgcl9pZHhbMl0gfSwgeyBjX2lkeFswXSwgY19pZHhbMV0sIGNfaWR4WzJdLCBjX2lkeFszXSB9KSwgUihzdGRfdmVjdG9yX3Jvd3MsIHN0ZF92ZWN0b3JfY29scykpOwotICAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChSKHsgcl9pZHhbMF0sIHJfaWR4WzFdLCByX2lkeFsyXSB9LCB7IGNfaWR4WzBdLCBjX2lkeFsxXSwgY19pZHhbMl0sIGNfaWR4WzNdIH0pLCBSKGVpZ2VuX21hdHJpeF9yb3dzLCBlaWdlbl9tYXRyaXhfY29scykpOworICAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChSKHtyX2lkeFswXSwgcl9pZHhbMV0sIHJfaWR4WzJdfSwge2NfaWR4WzBdLCBjX2lkeFsxXSwgY19pZHhbMl0sIGNfaWR4WzNdfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFIoY19hcnJheV9yb3dzLCBjX2FycmF5X2NvbHMpKTsKKyAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwoUih7cl9pZHhbMF0sIHJfaWR4WzFdLCByX2lkeFsyXX0sIHtjX2lkeFswXSwgY19pZHhbMV0sIGNfaWR4WzJdLCBjX2lkeFszXX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSKHN0ZF92ZWN0b3Jfcm93cywgc3RkX3ZlY3Rvcl9jb2xzKSk7CisgICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKFIoe3JfaWR4WzBdLCByX2lkeFsxXSwgcl9pZHhbMl19LCB7Y19pZHhbMF0sIGNfaWR4WzFdLCBjX2lkeFsyXSwgY19pZHhbM119KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUihlaWdlbl9tYXRyaXhfcm93cywgZWlnZW5fbWF0cml4X2NvbHMpKTsKICAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwoUihzdGRfdmVjdG9yX3Jvd3MsIHN0ZF92ZWN0b3JfY29scyksIFIoY19hcnJheV9yb3dzLCBjX2FycmF5X2NvbHMpKTsKICAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwoUihzdGRfdmVjdG9yX3Jvd3MsIHN0ZF92ZWN0b3JfY29scyksIFIoZWlnZW5fbWF0cml4X3Jvd3MsIGVpZ2VuX21hdHJpeF9jb2xzKSk7CiAgICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKFIoZWlnZW5fbWF0cml4X3Jvd3MsIGVpZ2VuX21hdHJpeF9jb2xzKSwgUihjX2FycmF5X3Jvd3MsIGNfYXJyYXlfY29scykpOwogCiAgICAgY29uc3QgQXJyYXlYWGQmIFJfcmVmID0gUjsKICAgICAvLyBjb25zdCBhY2Nlc3MKLSAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwoUl9yZWYoeyByX2lkeFswXSwgcl9pZHhbMV0sIHJfaWR4WzJdIH0sIHsgY19pZHhbMF0sIGNfaWR4WzFdLCBjX2lkeFsyXSwgY19pZHhbM10gfSksIFJfcmVmKGNfYXJyYXlfcm93cywgY19hcnJheV9jb2xzKSk7Ci0gICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKFJfcmVmKHsgcl9pZHhbMF0sIHJfaWR4WzFdLCByX2lkeFsyXSB9LCB7IGNfaWR4WzBdLCBjX2lkeFsxXSwgY19pZHhbMl0sIGNfaWR4WzNdIH0pLCBSX3JlZihzdGRfdmVjdG9yX3Jvd3MsIHN0ZF92ZWN0b3JfY29scykpOwotICAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChSX3JlZih7IHJfaWR4WzBdLCByX2lkeFsxXSwgcl9pZHhbMl0gfSwgeyBjX2lkeFswXSwgY19pZHhbMV0sIGNfaWR4WzJdLCBjX2lkeFszXSB9KSwgUl9yZWYoZWlnZW5fbWF0cml4X3Jvd3MsIGVpZ2VuX21hdHJpeF9jb2xzKSk7CisgICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKFJfcmVmKHtyX2lkeFswXSwgcl9pZHhbMV0sIHJfaWR4WzJdfSwge2NfaWR4WzBdLCBjX2lkeFsxXSwgY19pZHhbMl0sIGNfaWR4WzNdfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJfcmVmKGNfYXJyYXlfcm93cywgY19hcnJheV9jb2xzKSk7CisgICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKFJfcmVmKHtyX2lkeFswXSwgcl9pZHhbMV0sIHJfaWR4WzJdfSwge2NfaWR4WzBdLCBjX2lkeFsxXSwgY19pZHhbMl0sIGNfaWR4WzNdfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJfcmVmKHN0ZF92ZWN0b3Jfcm93cywgc3RkX3ZlY3Rvcl9jb2xzKSk7CisgICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKFJfcmVmKHtyX2lkeFswXSwgcl9pZHhbMV0sIHJfaWR4WzJdfSwge2NfaWR4WzBdLCBjX2lkeFsxXSwgY19pZHhbMl0sIGNfaWR4WzNdfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJfcmVmKGVpZ2VuX21hdHJpeF9yb3dzLCBlaWdlbl9tYXRyaXhfY29scykpOwogICAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChSX3JlZihzdGRfdmVjdG9yX3Jvd3MsIHN0ZF92ZWN0b3JfY29scyksIFJfcmVmKGNfYXJyYXlfcm93cywgY19hcnJheV9jb2xzKSk7CiAgICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKFJfcmVmKHN0ZF92ZWN0b3Jfcm93cywgc3RkX3ZlY3Rvcl9jb2xzKSwgUl9yZWYoZWlnZW5fbWF0cml4X3Jvd3MsIGVpZ2VuX21hdHJpeF9jb2xzKSk7CiAgICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKFJfcmVmKGVpZ2VuX21hdHJpeF9yb3dzLCBlaWdlbl9tYXRyaXhfY29scyksIFJfcmVmKGNfYXJyYXlfcm93cywgY19hcnJheV9jb2xzKSk7CkBAIC0zNjAsNjUgKzM1OCw2NSBAQAogCiAgIC8vIGNoZWNrIG1hdChpLGopIHdpdGggd2VpcmQgdHlwZXMgZm9yIGkgYW5kIGoKICAgewotICAgIFZFUklGWV9JU19BUFBST1goIEEoQi5Sb3dzQXRDb21waWxlVGltZS0xLCAxKSwgQSgzLDEpICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggQShCLlJvd3NBdENvbXBpbGVUaW1lLCAxKSwgQSg0LDEpICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggQShCLlJvd3NBdENvbXBpbGVUaW1lLTEsIEIuQ29sc0F0Q29tcGlsZVRpbWUtMSksIEEoMywzKSApOwotICAgIFZFUklGWV9JU19BUFBST1goIEEoQi5Sb3dzQXRDb21waWxlVGltZSwgQi5Db2xzQXRDb21waWxlVGltZSksIEEoNCw0KSApOworICAgIFZFUklGWV9JU19BUFBST1goQShCLlJvd3NBdENvbXBpbGVUaW1lIC0gMSwgMSksIEEoMywgMSkpOworICAgIFZFUklGWV9JU19BUFBST1goQShCLlJvd3NBdENvbXBpbGVUaW1lLCAxKSwgQSg0LCAxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChBKEIuUm93c0F0Q29tcGlsZVRpbWUgLSAxLCBCLkNvbHNBdENvbXBpbGVUaW1lIC0gMSksIEEoMywgMykpOworICAgIFZFUklGWV9JU19BUFBST1goQShCLlJvd3NBdENvbXBpbGVUaW1lLCBCLkNvbHNBdENvbXBpbGVUaW1lKSwgQSg0LCA0KSk7CiAgICAgY29uc3QgSW5kZXggSV8gPSAzLCBKXyA9IDQ7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggQShJXyxKXyksIEEoMyw0KSApOworICAgIFZFUklGWV9JU19BUFBST1goQShJXywgSl8pLCBBKDMsIDQpKTsKICAgfQogCiAgIC8vIGNoZWNrIGV4dGVuZGVkIGJsb2NrIEFQSQogICB7Ci0gICAgVkVSSUZZKCBpc19zYW1lX2VxKCBBLmJsb2NrPDMsND4oMSwxKSwgQS5ibG9jaygxLDEsZml4PDM+LGZpeDw0PikpICk7Ci0gICAgVkVSSUZZKCBpc19zYW1lX2VxKCBBLmJsb2NrPDMsND4oMSwxLDMsNCksIEEuYmxvY2soMSwxLGZpeDwzPigpLGZpeDw0Pig0KSkpICk7Ci0gICAgVkVSSUZZKCBpc19zYW1lX2VxKCBBLmJsb2NrPDMsRHluYW1pYz4oMSwxLDMsNCksIEEuYmxvY2soMSwxLGZpeDwzPiw0KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIEEuYmxvY2s8RHluYW1pYyw0PigxLDEsMyw0KSwgQS5ibG9jaygxLDEsZml4PER5bmFtaWM+KDMpLGZpeDw0PikpICk7Ci0gICAgVkVSSUZZKCBpc19zYW1lX2VxKCBBLmJsb2NrKDEsMSwzLDQpLCBBLmJsb2NrKDEsMSxmaXg8RHluYW1pYz4oMyksZml4PER5bmFtaWM+KDQpKSkgKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLmJsb2NrPDMsIDQ+KDEsIDEpLCBBLmJsb2NrKDEsIDEsIGZpeDwzPiwgZml4PDQ+KSkpOworICAgIFZFUklGWShpc19zYW1lX2VxKEEuYmxvY2s8MywgND4oMSwgMSwgMywgNCksIEEuYmxvY2soMSwgMSwgZml4PDM+KCksIGZpeDw0Pig0KSkpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLmJsb2NrPDMsIER5bmFtaWM+KDEsIDEsIDMsIDQpLCBBLmJsb2NrKDEsIDEsIGZpeDwzPiwgNCkpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLmJsb2NrPER5bmFtaWMsIDQ+KDEsIDEsIDMsIDQpLCBBLmJsb2NrKDEsIDEsIGZpeDxEeW5hbWljPigzKSwgZml4PDQ+KSkpOworICAgIFZFUklGWShpc19zYW1lX2VxKEEuYmxvY2soMSwgMSwgMywgNCksIEEuYmxvY2soMSwgMSwgZml4PER5bmFtaWM+KDMpLCBmaXg8RHluYW1pYz4oNCkpKSk7CiAKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIEEudG9wTGVmdENvcm5lcjwzLDQ+KCksIEEudG9wTGVmdENvcm5lcihmaXg8Mz4sZml4PDQ+KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIEEuYm90dG9tTGVmdENvcm5lcjwzLDQ+KCksIEEuYm90dG9tTGVmdENvcm5lcihmaXg8Mz4sZml4PDQ+KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIEEuYm90dG9tUmlnaHRDb3JuZXI8Myw0PigpLCBBLmJvdHRvbVJpZ2h0Q29ybmVyKGZpeDwzPixmaXg8ND4pKSApOwotICAgIFZFUklGWSggaXNfc2FtZV9lcSggQS50b3BSaWdodENvcm5lcjwzLDQ+KCksIEEudG9wUmlnaHRDb3JuZXIoZml4PDM+LGZpeDw0PikpICk7CisgICAgVkVSSUZZKGlzX3NhbWVfZXEoQS50b3BMZWZ0Q29ybmVyPDMsIDQ+KCksIEEudG9wTGVmdENvcm5lcihmaXg8Mz4sIGZpeDw0PikpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLmJvdHRvbUxlZnRDb3JuZXI8MywgND4oKSwgQS5ib3R0b21MZWZ0Q29ybmVyKGZpeDwzPiwgZml4PDQ+KSkpOworICAgIFZFUklGWShpc19zYW1lX2VxKEEuYm90dG9tUmlnaHRDb3JuZXI8MywgND4oKSwgQS5ib3R0b21SaWdodENvcm5lcihmaXg8Mz4sIGZpeDw0PikpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLnRvcFJpZ2h0Q29ybmVyPDMsIDQ+KCksIEEudG9wUmlnaHRDb3JuZXIoZml4PDM+LCBmaXg8ND4pKSk7CiAKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIEEubGVmdENvbHM8Mz4oKSwgQS5sZWZ0Q29scyhmaXg8Mz4pKSApOwotICAgIFZFUklGWSggaXNfc2FtZV9lcSggQS5yaWdodENvbHM8Mz4oKSwgQS5yaWdodENvbHMoZml4PDM+KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIEEubWlkZGxlQ29sczwzPigxKSwgQS5taWRkbGVDb2xzKDEsZml4PDM+KSkgKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLmxlZnRDb2xzPDM+KCksIEEubGVmdENvbHMoZml4PDM+KSkpOworICAgIFZFUklGWShpc19zYW1lX2VxKEEucmlnaHRDb2xzPDM+KCksIEEucmlnaHRDb2xzKGZpeDwzPikpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLm1pZGRsZUNvbHM8Mz4oMSksIEEubWlkZGxlQ29scygxLCBmaXg8Mz4pKSk7CiAKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIEEudG9wUm93czwzPigpLCBBLnRvcFJvd3MoZml4PDM+KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIEEuYm90dG9tUm93czwzPigpLCBBLmJvdHRvbVJvd3MoZml4PDM+KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIEEubWlkZGxlUm93czwzPigxKSwgQS5taWRkbGVSb3dzKDEsZml4PDM+KSkgKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLnRvcFJvd3M8Mz4oKSwgQS50b3BSb3dzKGZpeDwzPikpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLmJvdHRvbVJvd3M8Mz4oKSwgQS5ib3R0b21Sb3dzKGZpeDwzPikpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShBLm1pZGRsZVJvd3M8Mz4oMSksIEEubWlkZGxlUm93cygxLCBmaXg8Mz4pKSk7CiAKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIGEuc2VnbWVudDwzPigxKSwgYS5zZWdtZW50KDEsZml4PDM+KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIGEuaGVhZDwzPigpLCBhLmhlYWQoZml4PDM+KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIGEudGFpbDwzPigpLCBhLnRhaWwoZml4PDM+KSkgKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShhLnNlZ21lbnQ8Mz4oMSksIGEuc2VnbWVudCgxLCBmaXg8Mz4pKSk7CisgICAgVkVSSUZZKGlzX3NhbWVfZXEoYS5oZWFkPDM+KCksIGEuaGVhZChmaXg8Mz4pKSk7CisgICAgVkVSSUZZKGlzX3NhbWVfZXEoYS50YWlsPDM+KCksIGEudGFpbChmaXg8Mz4pKSk7CiAKICAgICBjb25zdCBBcnJheVhYaSYgY0EoQSk7Ci0gICAgVkVSSUZZKCBpc19zYW1lX2VxKCBjQS5ibG9jazxEeW5hbWljLDQ+KDEsMSwzLDQpLCBjQS5ibG9jaygxLDEsZml4PER5bmFtaWM+KDMpLGZpeDw0PikpICk7CisgICAgVkVSSUZZKGlzX3NhbWVfZXEoY0EuYmxvY2s8RHluYW1pYywgND4oMSwgMSwgMywgNCksIGNBLmJsb2NrKDEsIDEsIGZpeDxEeW5hbWljPigzKSwgZml4PDQ+KSkpOwogCi0gICAgVkVSSUZZKCBpc19zYW1lX2VxKCBjQS50b3BMZWZ0Q29ybmVyPDMsND4oKSwgY0EudG9wTGVmdENvcm5lcihmaXg8Mz4sZml4PDQ+KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIGNBLmJvdHRvbUxlZnRDb3JuZXI8Myw0PigpLCBjQS5ib3R0b21MZWZ0Q29ybmVyKGZpeDwzPixmaXg8ND4pKSApOwotICAgIFZFUklGWSggaXNfc2FtZV9lcSggY0EuYm90dG9tUmlnaHRDb3JuZXI8Myw0PigpLCBjQS5ib3R0b21SaWdodENvcm5lcihmaXg8Mz4sZml4PDQ+KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIGNBLnRvcFJpZ2h0Q29ybmVyPDMsND4oKSwgY0EudG9wUmlnaHRDb3JuZXIoZml4PDM+LGZpeDw0PikpICk7CisgICAgVkVSSUZZKGlzX3NhbWVfZXEoY0EudG9wTGVmdENvcm5lcjwzLCA0PigpLCBjQS50b3BMZWZ0Q29ybmVyKGZpeDwzPiwgZml4PDQ+KSkpOworICAgIFZFUklGWShpc19zYW1lX2VxKGNBLmJvdHRvbUxlZnRDb3JuZXI8MywgND4oKSwgY0EuYm90dG9tTGVmdENvcm5lcihmaXg8Mz4sIGZpeDw0PikpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShjQS5ib3R0b21SaWdodENvcm5lcjwzLCA0PigpLCBjQS5ib3R0b21SaWdodENvcm5lcihmaXg8Mz4sIGZpeDw0PikpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShjQS50b3BSaWdodENvcm5lcjwzLCA0PigpLCBjQS50b3BSaWdodENvcm5lcihmaXg8Mz4sIGZpeDw0PikpKTsKIAotICAgIFZFUklGWSggaXNfc2FtZV9lcSggY0EubGVmdENvbHM8Mz4oKSwgY0EubGVmdENvbHMoZml4PDM+KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIGNBLnJpZ2h0Q29sczwzPigpLCBjQS5yaWdodENvbHMoZml4PDM+KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIGNBLm1pZGRsZUNvbHM8Mz4oMSksIGNBLm1pZGRsZUNvbHMoMSxmaXg8Mz4pKSApOworICAgIFZFUklGWShpc19zYW1lX2VxKGNBLmxlZnRDb2xzPDM+KCksIGNBLmxlZnRDb2xzKGZpeDwzPikpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShjQS5yaWdodENvbHM8Mz4oKSwgY0EucmlnaHRDb2xzKGZpeDwzPikpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShjQS5taWRkbGVDb2xzPDM+KDEpLCBjQS5taWRkbGVDb2xzKDEsIGZpeDwzPikpKTsKIAotICAgIFZFUklGWSggaXNfc2FtZV9lcSggY0EudG9wUm93czwzPigpLCBjQS50b3BSb3dzKGZpeDwzPikpICk7Ci0gICAgVkVSSUZZKCBpc19zYW1lX2VxKCBjQS5ib3R0b21Sb3dzPDM+KCksIGNBLmJvdHRvbVJvd3MoZml4PDM+KSkgKTsKLSAgICBWRVJJRlkoIGlzX3NhbWVfZXEoIGNBLm1pZGRsZVJvd3M8Mz4oMSksIGNBLm1pZGRsZVJvd3MoMSxmaXg8Mz4pKSApOworICAgIFZFUklGWShpc19zYW1lX2VxKGNBLnRvcFJvd3M8Mz4oKSwgY0EudG9wUm93cyhmaXg8Mz4pKSk7CisgICAgVkVSSUZZKGlzX3NhbWVfZXEoY0EuYm90dG9tUm93czwzPigpLCBjQS5ib3R0b21Sb3dzKGZpeDwzPikpKTsKKyAgICBWRVJJRlkoaXNfc2FtZV9lcShjQS5taWRkbGVSb3dzPDM+KDEpLCBjQS5taWRkbGVSb3dzKDEsIGZpeDwzPikpKTsKICAgfQogCiAgIC8vIENoZWNrIGNvbXBpbGF0aW9uIG9mIGVudW1zIGFzIGluZGV4IHR5cGU6CiAgIGEoWFgpID0gMTsKLSAgQShYWCxZWSkgPSAxOworICBBKFhYLCBZWSkgPSAxOwogICAvLyBBbm9ueW1vdXMgZW51bXMgb25seSB3b3JrIHdpdGggQysrMTEKLSAgZW51bSB7IFg9MCwgWT0xIH07CisgIGVudW0geyBYID0gMCwgWSA9IDEgfTsKICAgYShYKSA9IDE7Ci0gIEEoWCxZKSA9IDE7Ci0gIEEoWFgsWSkgPSAxOwotICBBKFgsWVkpID0gMTsKKyAgQShYLCBZKSA9IDE7CisgIEEoWFgsIFkpID0gMTsKKyAgQShYLCBZWSkgPSAxOwogICAvLyBjaGVjayBzeW1ib2xpYyBpbmRpY2VzCiAgIGEobGFzdCkgPSAxLjA7CiAgIEEobGFzdCwgbGFzdCkgPSAxOwpAQCAtNDQ3LDI3ICs0NDUsMjcgQEAKICAgICBWRVJJRllfSVNfRVFVQUwobWF0cml4WHByLmNvZWZmKG1hdHJpeFhwci5yb3dzKCkgLSAxLCBtYXRyaXhYcHIuY29scygpIC0gMSksIG1hdHJpeFhwcihsYXN0LCBsYXN0KSk7CiAgIH0KIAotCiAgIC8vIENoZWNrIGNvbXBpbGF0aW9uIG9mIHZhcnlpbmcgaW50ZWdlciB0eXBlcyBhcyBpbmRleCB0eXBlczoKLSAgSW5kZXggaSA9IG4vMjsKKyAgSW5kZXggaSA9IG4gLyAyOwogICBzaG9ydCBpX3Nob3J0KGkpOwogICBzdGQ6OnNpemVfdCBpX3NpemV0KGkpOwotICBWRVJJRllfSVNfRVFVQUwoIGEoaSksIGEuY29lZmYoaV9zaG9ydCkgKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCBhKGkpLCBhLmNvZWZmKGlfc2l6ZXQpICk7CisgIFZFUklGWV9JU19FUVVBTChhKGkpLCBhLmNvZWZmKGlfc2hvcnQpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGEoaSksIGEuY29lZmYoaV9zaXpldCkpOwogCi0gIFZFUklGWV9JU19FUVVBTCggQShpLGkpLCBBLmNvZWZmKGlfc2hvcnQsIGlfc2hvcnQpICk7Ci0gIFZFUklGWV9JU19FUVVBTCggQShpLGkpLCBBLmNvZWZmKGlfc2hvcnQsIGkpICk7Ci0gIFZFUklGWV9JU19FUVVBTCggQShpLGkpLCBBLmNvZWZmKGksIGlfc2hvcnQpICk7Ci0gIFZFUklGWV9JU19FUVVBTCggQShpLGkpLCBBLmNvZWZmKGksIGlfc2l6ZXQpICk7Ci0gIFZFUklGWV9JU19FUVVBTCggQShpLGkpLCBBLmNvZWZmKGlfc2l6ZXQsIGkpICk7Ci0gIFZFUklGWV9JU19FUVVBTCggQShpLGkpLCBBLmNvZWZmKGlfc2l6ZXQsIGlfc2hvcnQpICk7Ci0gIFZFUklGWV9JU19FUVVBTCggQShpLGkpLCBBLmNvZWZmKDUsIGlfc2l6ZXQpICk7CisgIFZFUklGWV9JU19FUVVBTChBKGksIGkpLCBBLmNvZWZmKGlfc2hvcnQsIGlfc2hvcnQpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKEEoaSwgaSksIEEuY29lZmYoaV9zaG9ydCwgaSkpOworICBWRVJJRllfSVNfRVFVQUwoQShpLCBpKSwgQS5jb2VmZihpLCBpX3Nob3J0KSk7CisgIFZFUklGWV9JU19FUVVBTChBKGksIGkpLCBBLmNvZWZmKGksIGlfc2l6ZXQpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKEEoaSwgaSksIEEuY29lZmYoaV9zaXpldCwgaSkpOworICBWRVJJRllfSVNfRVFVQUwoQShpLCBpKSwgQS5jb2VmZihpX3NpemV0LCBpX3Nob3J0KSk7CisgIFZFUklGWV9JU19FUVVBTChBKGksIGkpLCBBLmNvZWZmKDUsIGlfc2l6ZXQpKTsKIAogICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIE1heHtSb3dzLENvbHN9QXRDb21waWxlVGltZQogICB7CiAgICAgTWF0cml4M2kgQTMgPSBNYXRyaXgzaTo6UmFuZG9tKCk7Ci0gICAgQXJyYXlYaSBpbmQoNSk7IGluZCA8PCAxLDEsMSwxLDE7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKCBBMyhpbmQsaW5kKS5ldmFsKCksIE1hdHJpeFhpOjpDb25zdGFudCg1LDUsQTMoMSwxKSkgKTsKKyAgICBBcnJheVhpIGluZCg1KTsKKyAgICBpbmQgPDwgMSwgMSwgMSwgMSwgMTsKKyAgICBWRVJJRllfSVNfRVFVQUwoQTMoaW5kLCBpbmQpLmV2YWwoKSwgTWF0cml4WGk6OkNvbnN0YW50KDUsIDUsIEEzKDEsIDEpKSk7CiAgIH0KIAogICAvLyBSZWdyZXNzaW9uIGZvciBidWcgMTczNgpAQCAtNDc4LDEyICs0NzYsMTIgQEAKIAogICAvLyBidWcgMTgxNTogSW5kZXhlZFZpZXcgc2hvdWxkIGFsbG93IGxpbmVhciBhY2Nlc3MKICAgewotICAgIFZFUklGWSggTUFUQ0goIGIoZWlpKSgwKSwgIjMiICkgKTsKLSAgICBWRVJJRlkoIE1BVENIKCBhKGVpaSkoMCksICIzIiApICk7Ci0gICAgVkVSSUZZKCBNQVRDSCggQSgxLGVpaSkoMCksICIxMDMiKSk7Ci0gICAgVkVSSUZZKCBNQVRDSCggQShlaWksMSkoMCksICIzMDEiKSk7Ci0gICAgVkVSSUZZKCBNQVRDSCggQSgxLGFsbCkoMSksICIxMDEiKSk7Ci0gICAgVkVSSUZZKCBNQVRDSCggQShhbGwsMSkoMSksICIxMDEiKSk7CisgICAgVkVSSUZZKE1BVENIKGIoZWlpKSgwKSwgIjMiKSk7CisgICAgVkVSSUZZKE1BVENIKGEoZWlpKSgwKSwgIjMiKSk7CisgICAgVkVSSUZZKE1BVENIKEEoMSwgZWlpKSgwKSwgIjEwMyIpKTsKKyAgICBWRVJJRlkoTUFUQ0goQShlaWksIDEpKDApLCAiMzAxIikpOworICAgIFZFUklGWShNQVRDSChBKDEsIGFsbCkoMSksICIxMDEiKSk7CisgICAgVkVSSUZZKE1BVENIKEEoYWxsLCAxKSgxKSwgIjEwMSIpKTsKICAgfQogCiAgIC8vIGJ1ZyAjMjM3NTogaW5kZXhpbmcgb3ZlciBtYXRyaWNlcyBvZiBkaW0gPjEyOCBzaG91bGQgY29tcGlsZSBvbiBnY2MKQEAgLTQ5MSwzMyArNDg5LDMwIEBACiAgICAgTWF0cml4PGRvdWJsZSwgNTEzLCAzPiBsYXJnZV9tYXQgPSBNYXRyaXg8ZG91YmxlLCA1MTMsIDM+OjpSYW5kb20oKTsKICAgICBzdGQ6OmFycmF5PGludCwgMj4gdGVzdF9pbmRpY2VzID0gezAsIDF9OwogICAgIE1hdHJpeDxkb3VibGUsIDUxMywgMj4gdGhpbl9zbGljZSA9IGxhcmdlX21hdChhbGwsIHRlc3RfaW5kaWNlcyk7Ci0gICAgZm9yKGludCBjb2wgPSAwOyBjb2wgPCBpbnQodGVzdF9pbmRpY2VzLnNpemUoKSk7ICsrY29sKQotICAgICAgZm9yKGludCByb3cgPSAwOyByb3cgPCBsYXJnZV9tYXQucm93cygpOyArK3JvdykKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKCB0aGluX3NsaWNlKHJvdywgY29sKSwgbGFyZ2VfbWF0KHJvdywgY29sKSApOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IGludCh0ZXN0X2luZGljZXMuc2l6ZSgpKTsgKytjb2wpCisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBsYXJnZV9tYXQucm93cygpOyArK3JvdykgVkVSSUZZX0lTX0VRVUFMKHRoaW5fc2xpY2Uocm93LCBjb2wpLCBsYXJnZV9tYXQocm93LCBjb2wpKTsKICAgfQogCi0gIC8vQnVnIEluZGV4VmlldyB3aXRoIGEgc2luZ2xlIHN0YXRpYyByb3cgc2hvdWxkIGJlIFJvd01ham9yOgorICAvLyBCdWcgSW5kZXhWaWV3IHdpdGggYSBzaW5nbGUgc3RhdGljIHJvdyBzaG91bGQgYmUgUm93TWFqb3I6CiAgIHsKICAgICAvLyBBKDEsIHNlcSgwLDIsMSkpLmN3aXNlQWJzKCkuY29sd2lzZSgpLnJlcGxpY2F0ZSgyKS5ldmFsKCk7Ci0gICAgU1RBVElDX0NIRUNLKCggKGludGVybmFsOjpldmFsdWF0b3I8ZGVjbHR5cGUoIEEoMSxzZXEoMCwyLDEpKSApPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPT0gUm93TWFqb3JCaXQgKSk7CisgICAgU1RBVElDX0NIRUNLKCgoaW50ZXJuYWw6OmV2YWx1YXRvcjxkZWNsdHlwZShBKDEsIHNlcSgwLCAyLCAxKSkpPjo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPT0gUm93TWFqb3JCaXQpKTsKICAgfQotCiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChpbmRleGVkX3ZpZXcpCi17Ci0vLyAgIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGNoZWNrX2luZGV4ZWRfdmlldygpICk7Ci0vLyAgIH0KK0VJR0VOX0RFQ0xBUkVfVEVTVChpbmRleGVkX3ZpZXcpIHsKKyAgLy8gICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICBDQUxMX1NVQlRFU1RfMShjaGVja19pbmRleGVkX3ZpZXcoKSk7CisgIC8vICAgfQogCiAgIC8vIHN0YXRpYyBjaGVja3Mgb2Ygc29tZSBpbnRlcm5hbHM6Ci0gIFNUQVRJQ19DSEVDSygoIGludGVybmFsOjppc192YWxpZF9pbmRleF90eXBlPGludD46OnZhbHVlICkpOwotICBTVEFUSUNfQ0hFQ0soKCBpbnRlcm5hbDo6aXNfdmFsaWRfaW5kZXhfdHlwZTx1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSApKTsKLSAgU1RBVElDX0NIRUNLKCggaW50ZXJuYWw6OmlzX3ZhbGlkX2luZGV4X3R5cGU8c2hvcnQ+Ojp2YWx1ZSApKTsKLSAgU1RBVElDX0NIRUNLKCggaW50ZXJuYWw6OmlzX3ZhbGlkX2luZGV4X3R5cGU8c3RkOjpwdHJkaWZmX3Q+Ojp2YWx1ZSApKTsKLSAgU1RBVElDX0NIRUNLKCggaW50ZXJuYWw6OmlzX3ZhbGlkX2luZGV4X3R5cGU8c3RkOjpzaXplX3Q+Ojp2YWx1ZSApKTsKLSAgU1RBVElDX0NIRUNLKCggIWludGVybmFsOjp2YWxpZF9pbmRleGVkX3ZpZXdfb3ZlcmxvYWQ8aW50LGludD46OnZhbHVlICkpOwotICBTVEFUSUNfQ0hFQ0soKCAhaW50ZXJuYWw6OnZhbGlkX2luZGV4ZWRfdmlld19vdmVybG9hZDxpbnQsc3RkOjpwdHJkaWZmX3Q+Ojp2YWx1ZSApKTsKLSAgU1RBVElDX0NIRUNLKCggIWludGVybmFsOjp2YWxpZF9pbmRleGVkX3ZpZXdfb3ZlcmxvYWQ8c3RkOjpwdHJkaWZmX3QsaW50Pjo6dmFsdWUgKSk7Ci0gIFNUQVRJQ19DSEVDSygoICFpbnRlcm5hbDo6dmFsaWRfaW5kZXhlZF92aWV3X292ZXJsb2FkPHN0ZDo6c2l6ZV90LGludD46OnZhbHVlICkpOworICBTVEFUSUNfQ0hFQ0soKGludGVybmFsOjppc192YWxpZF9pbmRleF90eXBlPGludD46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoaW50ZXJuYWw6OmlzX3ZhbGlkX2luZGV4X3R5cGU8dW5zaWduZWQgaW50Pjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpbnRlcm5hbDo6aXNfdmFsaWRfaW5kZXhfdHlwZTxzaG9ydD46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoaW50ZXJuYWw6OmlzX3ZhbGlkX2luZGV4X3R5cGU8c3RkOjpwdHJkaWZmX3Q+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKGludGVybmFsOjppc192YWxpZF9pbmRleF90eXBlPHN0ZDo6c2l6ZV90Pjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKCghaW50ZXJuYWw6OnZhbGlkX2luZGV4ZWRfdmlld19vdmVybG9hZDxpbnQsIGludD46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoIWludGVybmFsOjp2YWxpZF9pbmRleGVkX3ZpZXdfb3ZlcmxvYWQ8aW50LCBzdGQ6OnB0cmRpZmZfdD46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoIWludGVybmFsOjp2YWxpZF9pbmRleGVkX3ZpZXdfb3ZlcmxvYWQ8c3RkOjpwdHJkaWZmX3QsIGludD46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoIWludGVybmFsOjp2YWxpZF9pbmRleGVkX3ZpZXdfb3ZlcmxvYWQ8c3RkOjpzaXplX3QsIGludD46OnZhbHVlKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2luaXRpYWxpemVyX2xpc3RfY29uc3RydWN0aW9uLmNwcCBiL3Rlc3QvaW5pdGlhbGl6ZXJfbGlzdF9jb25zdHJ1Y3Rpb24uY3BwCmluZGV4IGI1NzZlYzIuLjJjM2YxODUgMTAwNjQ0Ci0tLSBhL3Rlc3QvaW5pdGlhbGl6ZXJfbGlzdF9jb25zdHJ1Y3Rpb24uY3BwCisrKyBiL3Rlc3QvaW5pdGlhbGl6ZXJfbGlzdF9jb25zdHJ1Y3Rpb24uY3BwCkBAIC0xNiwzNCArMTYsMzMgQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBib29sIGlzX2ludGVnZXIgPSBOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyPgordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBpc19pbnRlZ2VyID0gTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcj4KIHN0cnVjdCBUZXN0TWV0aG9kRGlzcGF0Y2hpbmcgewogICBzdGF0aWMgdm9pZCBydW4oKSB7fQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KIHN0cnVjdCBUZXN0TWV0aG9kRGlzcGF0Y2hpbmc8U2NhbGFyLCAxPiB7Ci0gIHN0YXRpYyB2b2lkIHJ1bigpCi0gIHsKKyAgc3RhdGljIHZvaWQgcnVuKCkgewogICAgIHsKLSAgICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IG0gezMsIDR9OwotICAgICAgQXJyYXk8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBhIHszLCA0fTsKKyAgICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IG17MywgNH07CisgICAgICBBcnJheTxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IGF7MywgNH07CiAgICAgICBWRVJJRlkobS5yb3dzKCkgPT0gMyk7CiAgICAgICBWRVJJRlkobS5jb2xzKCkgPT0gNCk7CiAgICAgICBWRVJJRlkoYS5yb3dzKCkgPT0gMyk7CiAgICAgICBWRVJJRlkoYS5jb2xzKCkgPT0gNCk7CiAgICAgfQogICAgIHsKLSAgICAgIE1hdHJpeDxTY2FsYXIsIDEsIDI+IG0gezMsIDR9OwotICAgICAgQXJyYXk8U2NhbGFyLCAxLCAyPiBhIHszLCA0fTsKKyAgICAgIE1hdHJpeDxTY2FsYXIsIDEsIDI+IG17MywgNH07CisgICAgICBBcnJheTxTY2FsYXIsIDEsIDI+IGF7MywgNH07CiAgICAgICBWRVJJRlkobSgwKSA9PSAzKTsKICAgICAgIFZFUklGWShtKDEpID09IDQpOwogICAgICAgVkVSSUZZKGEoMCkgPT0gMyk7CiAgICAgICBWRVJJRlkoYSgxKSA9PSA0KTsKICAgICB9CiAgICAgewotICAgICAgTWF0cml4PFNjYWxhciwgMiwgMT4gbSB7MywgNH07Ci0gICAgICBBcnJheTxTY2FsYXIsIDIsIDE+IGEgezMsIDR9OworICAgICAgTWF0cml4PFNjYWxhciwgMiwgMT4gbXszLCA0fTsKKyAgICAgIEFycmF5PFNjYWxhciwgMiwgMT4gYXszLCA0fTsKICAgICAgIFZFUklGWShtKDApID09IDMpOwogICAgICAgVkVSSUZZKG0oMSkgPT0gNCk7CiAgICAgICBWRVJJRlkoYSgwKSA9PSAzKTsKQEAgLTUyLDExOSArNTEsMTIwIEBACiAgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFZlYzQsIHR5cGVuYW1lIFZlYzU+IHZvaWQgZml4ZWRzaXplVmFyaWFkaWNWZWN0b3JDb25zdHJ1Y3Rpb24yKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBWZWM0LCB0eXBlbmFtZSBWZWM1Pgordm9pZCBmaXhlZHNpemVWYXJpYWRpY1ZlY3RvckNvbnN0cnVjdGlvbjIoKSB7CiAgIHsKICAgICBWZWM0IHJlZiA9IFZlYzQ6OlJhbmRvbSgpOwotICAgIFZlYzQgdnsgcmVmWzBdLCByZWZbMV0sIHJlZlsyXSwgcmVmWzNdIH07CisgICAgVmVjNCB2e3JlZlswXSwgcmVmWzFdLCByZWZbMl0sIHJlZlszXX07CiAgICAgVkVSSUZZX0lTX0FQUFJPWCh2LCByZWYpOwotICAgIFZFUklGWV9JU19BUFBST1godiwgKFZlYzQoIHJlZlswXSwgcmVmWzFdLCByZWZbMl0sIHJlZlszXSApKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2LCAoVmVjNChyZWZbMF0sIHJlZlsxXSwgcmVmWzJdLCByZWZbM10pKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWCh2LCAoVmVjNCh7cmVmWzBdLCByZWZbMV0sIHJlZlsyXSwgcmVmWzNdfSkpKTsKIAotICAgIFZlYzQgdjIgPSB7IHJlZlswXSwgcmVmWzFdLCByZWZbMl0sIHJlZlszXSB9OworICAgIFZlYzQgdjIgPSB7cmVmWzBdLCByZWZbMV0sIHJlZlsyXSwgcmVmWzNdfTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHYyLCByZWYpOwogICB9CiAgIHsKICAgICBWZWM1IHJlZiA9IFZlYzU6OlJhbmRvbSgpOwotICAgIFZlYzUgdnsgcmVmWzBdLCByZWZbMV0sIHJlZlsyXSwgcmVmWzNdLCByZWZbNF0gfTsKKyAgICBWZWM1IHZ7cmVmWzBdLCByZWZbMV0sIHJlZlsyXSwgcmVmWzNdLCByZWZbNF19OwogICAgIFZFUklGWV9JU19BUFBST1godiwgcmVmKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHYsIChWZWM1KCByZWZbMF0sIHJlZlsxXSwgcmVmWzJdLCByZWZbM10sIHJlZls0XSApKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2LCAoVmVjNShyZWZbMF0sIHJlZlsxXSwgcmVmWzJdLCByZWZbM10sIHJlZls0XSkpKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHYsIChWZWM1KHtyZWZbMF0sIHJlZlsxXSwgcmVmWzJdLCByZWZbM10sIHJlZls0XX0pKSk7CiAKLSAgICBWZWM1IHYyID0geyByZWZbMF0sIHJlZlsxXSwgcmVmWzJdLCByZWZbM10sIHJlZls0XSB9OworICAgIFZlYzUgdjIgPSB7cmVmWzBdLCByZWZbMV0sIHJlZlsyXSwgcmVmWzNdLCByZWZbNF19OwogICAgIFZFUklGWV9JU19BUFBST1godjIsIHJlZik7CiAgIH0KIH0KIAotI2RlZmluZSBDSEVDS19NSVhTQ0FMQVJfVjVfQVBQUk9YKFYsIEEwLCBBMSwgQTIsIEEzLCBBNCkgeyBcCi0gIFZFUklGWV9JU19BUFBST1goVlswXSwgU2NhbGFyKEEwKSApOyBcCi0gIFZFUklGWV9JU19BUFBST1goVlsxXSwgU2NhbGFyKEExKSApOyBcCi0gIFZFUklGWV9JU19BUFBST1goVlsyXSwgU2NhbGFyKEEyKSApOyBcCi0gIFZFUklGWV9JU19BUFBST1goVlszXSwgU2NhbGFyKEEzKSApOyBcCi0gIFZFUklGWV9JU19BUFBST1goVls0XSwgU2NhbGFyKEE0KSApOyBcCi19CisjZGVmaW5lIENIRUNLX01JWFNDQUxBUl9WNV9BUFBST1goViwgQTAsIEExLCBBMiwgQTMsIEE0KSBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVkVSSUZZX0lTX0FQUFJPWChWWzBdLCBTY2FsYXIoQTApKTsgICAgICAgICAgICAgICAgICBcCisgICAgVkVSSUZZX0lTX0FQUFJPWChWWzFdLCBTY2FsYXIoQTEpKTsgICAgICAgICAgICAgICAgICBcCisgICAgVkVSSUZZX0lTX0FQUFJPWChWWzJdLCBTY2FsYXIoQTIpKTsgICAgICAgICAgICAgICAgICBcCisgICAgVkVSSUZZX0lTX0FQUFJPWChWWzNdLCBTY2FsYXIoQTMpKTsgICAgICAgICAgICAgICAgICBcCisgICAgVkVSSUZZX0lTX0FQUFJPWChWWzRdLCBTY2FsYXIoQTQpKTsgICAgICAgICAgICAgICAgICBcCisgIH0KIAotI2RlZmluZSBDSEVDS19NSVhTQ0FMQVJfVjUoVkVDNSwgQTAsIEExLCBBMiwgQTMsIEE0KSB7IFwKLSAgdHlwZWRlZiBWRUM1OjpTY2FsYXIgU2NhbGFyOyBcCi0gIFZFQzUgdiA9IHsgQTAgLCBBMSAsIEEyICwgQTMgLCBBNCB9OyBcCi0gIENIRUNLX01JWFNDQUxBUl9WNV9BUFBST1godiwgQTAgLCBBMSAsIEEyICwgQTMgLCBBNCk7IFwKLX0KKyNkZWZpbmUgQ0hFQ0tfTUlYU0NBTEFSX1Y1KFZFQzUsIEEwLCBBMSwgQTIsIEEzLCBBNCkgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIFZFQzU6OlNjYWxhciBTY2FsYXI7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWRUM1IHYgPSB7QTAsIEExLCBBMiwgQTMsIEE0fTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDSEVDS19NSVhTQ0FMQVJfVjVfQVBQUk9YKHYsIEEwLCBBMSwgQTIsIEEzLCBBNCk7IFwKKyAgfQogCi10ZW1wbGF0ZTxpbnQ+IHZvaWQgZml4ZWRzaXplVmFyaWFkaWNWZWN0b3JDb25zdHJ1Y3Rpb24zKCkKLXsKLSAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLDUsMT4gVmVjNTsKLSAgdHlwZWRlZiBBcnJheTxmbG9hdCw1LDE+IEFycjU7Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCBmaXhlZHNpemVWYXJpYWRpY1ZlY3RvckNvbnN0cnVjdGlvbjMoKSB7CisgIHR5cGVkZWYgTWF0cml4PGRvdWJsZSwgNSwgMT4gVmVjNTsKKyAgdHlwZWRlZiBBcnJheTxmbG9hdCwgNSwgMT4gQXJyNTsKICAgQ0hFQ0tfTUlYU0NBTEFSX1Y1KFZlYzUsIDEsIDIuLCAtMywgNC4xMjEsIDUuNTMyNTIpOwogICBDSEVDS19NSVhTQ0FMQVJfVjUoQXJyNSwgMSwgMi4sIDMuMTJmLCA0LjEyMSwgNS41MzI1Mik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBmaXhlZHNpemVWYXJpYWRpY1ZlY3RvckNvbnN0cnVjdGlvbigpCi17Ci0gIENBTExfU1VCVEVTVCgoIGZpeGVkc2l6ZVZhcmlhZGljVmVjdG9yQ29uc3RydWN0aW9uMjxNYXRyaXg8U2NhbGFyLDQsMT4sIE1hdHJpeDxTY2FsYXIsNSwxPiA+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIGZpeGVkc2l6ZVZhcmlhZGljVmVjdG9yQ29uc3RydWN0aW9uMjxNYXRyaXg8U2NhbGFyLDEsND4sIE1hdHJpeDxTY2FsYXIsMSw1PiA+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIGZpeGVkc2l6ZVZhcmlhZGljVmVjdG9yQ29uc3RydWN0aW9uMjxBcnJheTxTY2FsYXIsNCwxPiwgIEFycmF5PFNjYWxhciw1LDE+ICA+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIGZpeGVkc2l6ZVZhcmlhZGljVmVjdG9yQ29uc3RydWN0aW9uMjxBcnJheTxTY2FsYXIsMSw0PiwgIEFycmF5PFNjYWxhciwxLDU+ICA+KCkgKSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBmaXhlZHNpemVWYXJpYWRpY1ZlY3RvckNvbnN0cnVjdGlvbigpIHsKKyAgQ0FMTF9TVUJURVNUKChmaXhlZHNpemVWYXJpYWRpY1ZlY3RvckNvbnN0cnVjdGlvbjI8TWF0cml4PFNjYWxhciwgNCwgMT4sIE1hdHJpeDxTY2FsYXIsIDUsIDE+PigpKSk7CisgIENBTExfU1VCVEVTVCgoZml4ZWRzaXplVmFyaWFkaWNWZWN0b3JDb25zdHJ1Y3Rpb24yPE1hdHJpeDxTY2FsYXIsIDEsIDQ+LCBNYXRyaXg8U2NhbGFyLCAxLCA1Pj4oKSkpOworICBDQUxMX1NVQlRFU1QoKGZpeGVkc2l6ZVZhcmlhZGljVmVjdG9yQ29uc3RydWN0aW9uMjxBcnJheTxTY2FsYXIsIDQsIDE+LCBBcnJheTxTY2FsYXIsIDUsIDE+PigpKSk7CisgIENBTExfU1VCVEVTVCgoZml4ZWRzaXplVmFyaWFkaWNWZWN0b3JDb25zdHJ1Y3Rpb24yPEFycmF5PFNjYWxhciwgMSwgND4sIEFycmF5PFNjYWxhciwgMSwgNT4+KCkpKTsKIH0KIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgaW5pdGlhbGl6ZXJMaXN0VmVjdG9yQ29uc3RydWN0aW9uKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGluaXRpYWxpemVyTGlzdFZlY3RvckNvbnN0cnVjdGlvbigpIHsKICAgU2NhbGFyIHJhd1s0XTsKLSAgZm9yKGludCBrID0gMDsgayA8IDQ7ICsraykgeworICBmb3IgKGludCBrID0gMDsgayA8IDQ7ICsraykgewogICAgIHJhd1trXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwogICB9CiAgIHsKLSAgICBNYXRyaXg8U2NhbGFyLCA0LCAxPiBtIHsge3Jhd1swXX0sIHtyYXdbMV19LHtyYXdbMl19LHtyYXdbM119IH07Ci0gICAgQXJyYXk8U2NhbGFyLCA0LCAxPiBhIHsge3Jhd1swXX0sIHtyYXdbMV19LCB7cmF3WzJdfSwge3Jhd1szXX0gfTsKLSAgICBmb3IoaW50IGsgPSAwOyBrIDwgNDsgKytrKSB7CisgICAgTWF0cml4PFNjYWxhciwgNCwgMT4gbXt7cmF3WzBdfSwge3Jhd1sxXX0sIHtyYXdbMl19LCB7cmF3WzNdfX07CisgICAgQXJyYXk8U2NhbGFyLCA0LCAxPiBhe3tyYXdbMF19LCB7cmF3WzFdfSwge3Jhd1syXX0sIHtyYXdbM119fTsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7ICsraykgewogICAgICAgVkVSSUZZKG0oaykgPT0gcmF3W2tdKTsKICAgICB9Ci0gICAgZm9yKGludCBrID0gMDsgayA8IDQ7ICsraykgeworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNDsgKytrKSB7CiAgICAgICBWRVJJRlkoYShrKSA9PSByYXdba10pOwogICAgIH0KLSAgICBWRVJJRllfSVNfRVFVQUwobSwgKE1hdHJpeDxTY2FsYXIsNCwxPih7IHtyYXdbMF19LCB7cmF3WzFdfSwge3Jhd1syXX0sIHtyYXdbM119IH0pKSk7Ci0gICAgVkVSSUZZKChhID09IChBcnJheTxTY2FsYXIsNCwxPih7IHtyYXdbMF19LCB7cmF3WzFdfSwge3Jhd1syXX0sIHtyYXdbM119IH0pKSkuYWxsKCkpOworICAgIFZFUklGWV9JU19FUVVBTChtLCAoTWF0cml4PFNjYWxhciwgNCwgMT4oe3tyYXdbMF19LCB7cmF3WzFdfSwge3Jhd1syXX0sIHtyYXdbM119fSkpKTsKKyAgICBWRVJJRlkoKGEgPT0gKEFycmF5PFNjYWxhciwgNCwgMT4oe3tyYXdbMF19LCB7cmF3WzFdfSwge3Jhd1syXX0sIHtyYXdbM119fSkpKS5hbGwoKSk7CiAgIH0KICAgewotICAgIE1hdHJpeDxTY2FsYXIsIDEsIDQ+IG0geyB7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfSB9OwotICAgIEFycmF5PFNjYWxhciwgMSwgND4gYSB7IHtyYXdbMF0sIHJhd1sxXSwgcmF3WzJdLCByYXdbM119IH07Ci0gICAgZm9yKGludCBrID0gMDsgayA8IDQ7ICsraykgeworICAgIE1hdHJpeDxTY2FsYXIsIDEsIDQ+IG17e3Jhd1swXSwgcmF3WzFdLCByYXdbMl0sIHJhd1szXX19OworICAgIEFycmF5PFNjYWxhciwgMSwgND4gYXt7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfX07CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCA0OyArK2spIHsKICAgICAgIFZFUklGWShtKGspID09IHJhd1trXSk7CiAgICAgfQotICAgIGZvcihpbnQgayA9IDA7IGsgPCA0OyArK2spIHsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7ICsraykgewogICAgICAgVkVSSUZZKGEoaykgPT0gcmF3W2tdKTsKICAgICB9Ci0gICAgVkVSSUZZX0lTX0VRVUFMKG0sIChNYXRyaXg8U2NhbGFyLCAxLCA0Pih7e3Jhd1swXSxyYXdbMV0scmF3WzJdLHJhd1szXX19KSkpOwotICAgIFZFUklGWSgoYSA9PSAoQXJyYXk8U2NhbGFyLCAxLCA0Pih7e3Jhd1swXSxyYXdbMV0scmF3WzJdLHJhd1szXX19KSkpLmFsbCgpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobSwgKE1hdHJpeDxTY2FsYXIsIDEsIDQ+KHt7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfX0pKSk7CisgICAgVkVSSUZZKChhID09IChBcnJheTxTY2FsYXIsIDEsIDQ+KHt7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfX0pKSkuYWxsKCkpOwogICB9CiAgIHsKLSAgICBNYXRyaXg8U2NhbGFyLCA0LCBEeW5hbWljPiBtIHsge3Jhd1swXX0sIHtyYXdbMV19LCB7cmF3WzJdfSwge3Jhd1szXX0gfTsKLSAgICBBcnJheTxTY2FsYXIsIDQsIER5bmFtaWM+IGEgeyB7cmF3WzBdfSwge3Jhd1sxXX0sIHtyYXdbMl19LCB7cmF3WzNdfSB9OwotICAgIGZvcihpbnQgaz0wOyBrIDwgNDsgKytrKSB7CisgICAgTWF0cml4PFNjYWxhciwgNCwgRHluYW1pYz4gbXt7cmF3WzBdfSwge3Jhd1sxXX0sIHtyYXdbMl19LCB7cmF3WzNdfX07CisgICAgQXJyYXk8U2NhbGFyLCA0LCBEeW5hbWljPiBhe3tyYXdbMF19LCB7cmF3WzFdfSwge3Jhd1syXX0sIHtyYXdbM119fTsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7ICsraykgewogICAgICAgVkVSSUZZKG0oaykgPT0gcmF3W2tdKTsKICAgICB9Ci0gICAgZm9yKGludCBrPTA7IGsgPCA0OyArK2spIHsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7ICsraykgewogICAgICAgVkVSSUZZKGEoaykgPT0gcmF3W2tdKTsKICAgICB9Ci0gICAgVkVSSUZZX0lTX0VRVUFMKG0sIChNYXRyaXg8U2NhbGFyLCA0LCBEeW5hbWljPih7IHtyYXdbMF19LCB7cmF3WzFdfSwge3Jhd1syXX0sIHtyYXdbM119IH0pKSk7Ci0gICAgVkVSSUZZKChhID09IChBcnJheTxTY2FsYXIsIDQsIER5bmFtaWM+KHsge3Jhd1swXX0sIHtyYXdbMV19LCB7cmF3WzJdfSwge3Jhd1szXX0gfSkpKS5hbGwoKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG0sIChNYXRyaXg8U2NhbGFyLCA0LCBEeW5hbWljPih7e3Jhd1swXX0sIHtyYXdbMV19LCB7cmF3WzJdfSwge3Jhd1szXX19KSkpOworICAgIFZFUklGWSgoYSA9PSAoQXJyYXk8U2NhbGFyLCA0LCBEeW5hbWljPih7e3Jhd1swXX0sIHtyYXdbMV19LCB7cmF3WzJdfSwge3Jhd1szXX19KSkpLmFsbCgpKTsKICAgfQogICB7Ci0gICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgND4gbSB7e3Jhd1swXSxyYXdbMV0scmF3WzJdLHJhd1szXX19OwotICAgIEFycmF5PFNjYWxhciwgRHluYW1pYywgND4gYSB7e3Jhd1swXSxyYXdbMV0scmF3WzJdLHJhd1szXX19OwotICAgIGZvcihpbnQgaz0wOyBrIDwgNDsgKytrKSB7CisgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgND4gbXt7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfX07CisgICAgQXJyYXk8U2NhbGFyLCBEeW5hbWljLCA0PiBhe3tyYXdbMF0sIHJhd1sxXSwgcmF3WzJdLCByYXdbM119fTsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7ICsraykgewogICAgICAgVkVSSUZZKG0oaykgPT0gcmF3W2tdKTsKICAgICB9Ci0gICAgZm9yKGludCBrPTA7IGsgPCA0OyArK2spIHsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7ICsraykgewogICAgICAgVkVSSUZZKGEoaykgPT0gcmF3W2tdKTsKICAgICB9Ci0gICAgVkVSSUZZX0lTX0VRVUFMKG0sIChNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCA0Pih7e3Jhd1swXSxyYXdbMV0scmF3WzJdLHJhd1szXX19KSkpOwotICAgIFZFUklGWSgoYSA9PSAoQXJyYXk8U2NhbGFyLCBEeW5hbWljLCA0Pih7e3Jhd1swXSxyYXdbMV0scmF3WzJdLHJhd1szXX19KSkpLmFsbCgpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobSwgKE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDQ+KHt7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfX0pKSk7CisgICAgVkVSSUZZKChhID09IChBcnJheTxTY2FsYXIsIER5bmFtaWMsIDQ+KHt7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfX0pKSkuYWxsKCkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBpbml0aWFsaXplckxpc3RNYXRyaXhDb25zdHJ1Y3Rpb24oKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgaW5pdGlhbGl6ZXJMaXN0TWF0cml4Q29uc3RydWN0aW9uKCkgewogICBjb25zdCBJbmRleCBSb3dzQXRDb21waWxlVGltZSA9IDU7CiAgIGNvbnN0IEluZGV4IENvbHNBdENvbXBpbGVUaW1lID0gNDsKICAgY29uc3QgSW5kZXggU2l6ZUF0Q29tcGlsZVRpbWUgPSBSb3dzQXRDb21waWxlVGltZSAqIENvbHNBdENvbXBpbGVUaW1lOwpAQCAtMTc0LDI5ICsxNzQsMjQgQEAKICAgICByYXdbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKICAgfQogICB7Ci0gICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gbSB7fTsKKyAgICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBte307CiAgICAgVkVSSUZZKG0uY29scygpID09IDApOwogICAgIFZFUklGWShtLnJvd3MoKSA9PSAwKTsKICAgICBWRVJJRllfSVNfRVFVQUwobSwgKE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+KCkpKTsKICAgfQogICB7Ci0gICAgTWF0cml4PFNjYWxhciwgNSwgND4gbSB7Ci0gICAgICB7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfSwKLSAgICAgIHtyYXdbNF0sIHJhd1s1XSwgcmF3WzZdLCByYXdbN119LAotICAgICAge3Jhd1s4XSwgcmF3WzldLCByYXdbMTBdLCByYXdbMTFdfSwKLSAgICAgIHtyYXdbMTJdLCByYXdbMTNdLCByYXdbMTRdLCByYXdbMTVdfSwKLSAgICAgIHtyYXdbMTZdLCByYXdbMTddLCByYXdbMThdLCByYXdbMTldfQotICAgIH07CisgICAgTWF0cml4PFNjYWxhciwgNSwgND4gbXt7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyYXdbNF0sIHJhd1s1XSwgcmF3WzZdLCByYXdbN119LAorICAgICAgICAgICAgICAgICAgICAgICAgICAge3Jhd1s4XSwgcmF3WzldLCByYXdbMTBdLCByYXdbMTFdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyYXdbMTJdLCByYXdbMTNdLCByYXdbMTRdLCByYXdbMTVdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyYXdbMTZdLCByYXdbMTddLCByYXdbMThdLCByYXdbMTldfX07CiAKICAgICBNYXRyaXg8U2NhbGFyLCA1LCA0PiBtMjsKLSAgICBtMiA8PCByYXdbMF0sIHJhd1sxXSwgcmF3WzJdLCByYXdbM10sCi0gICAgICAgICAgcmF3WzRdLCByYXdbNV0sIHJhd1s2XSwgcmF3WzddLAotICAgICAgICAgIHJhd1s4XSwgcmF3WzldLCByYXdbMTBdLCByYXdbMTFdLAotICAgICAgICAgIHJhd1sxMl0sIHJhd1sxM10sIHJhd1sxNF0sIHJhd1sxNV0sCi0gICAgICAgICAgcmF3WzE2XSwgcmF3WzE3XSwgcmF3WzE4XSwgcmF3WzE5XTsKKyAgICBtMiA8PCByYXdbMF0sIHJhd1sxXSwgcmF3WzJdLCByYXdbM10sIHJhd1s0XSwgcmF3WzVdLCByYXdbNl0sIHJhd1s3XSwgcmF3WzhdLCByYXdbOV0sIHJhd1sxMF0sIHJhd1sxMV0sIHJhd1sxMl0sCisgICAgICAgIHJhd1sxM10sIHJhd1sxNF0sIHJhd1sxNV0sIHJhd1sxNl0sIHJhd1sxN10sIHJhd1sxOF0sIHJhd1sxOV07CiAKICAgICBpbnQgayA9IDA7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IFJvd3NBdENvbXBpbGVUaW1lOyArK2kpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFJvd3NBdENvbXBpbGVUaW1lOyArK2kpIHsKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgQ29sc0F0Q29tcGlsZVRpbWU7ICsraikgewogICAgICAgICBWRVJJRlkobShpLCBqKSA9PSByYXdba10pOwogICAgICAgICArK2s7CkBAIC0yMDUsMTggKzIwMCwxNiBAQAogICAgIFZFUklGWV9JU19FUVVBTChtLCBtMik7CiAgIH0KICAgewotICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IG17Ci0gICAgICB7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfSwKLSAgICAgIHtyYXdbNF0sIHJhd1s1XSwgcmF3WzZdLCByYXdbN119LAotICAgICAge3Jhd1s4XSwgcmF3WzldLCByYXdbMTBdLCByYXdbMTFdfSwKLSAgICAgIHtyYXdbMTJdLCByYXdbMTNdLCByYXdbMTRdLCByYXdbMTVdfSwKLSAgICAgIHtyYXdbMTZdLCByYXdbMTddLCByYXdbMThdLCByYXdbMTldfQotICAgIH07CisgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gbXt7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyYXdbNF0sIHJhd1s1XSwgcmF3WzZdLCByYXdbN119LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Jhd1s4XSwgcmF3WzldLCByYXdbMTBdLCByYXdbMTFdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyYXdbMTJdLCByYXdbMTNdLCByYXdbMTRdLCByYXdbMTVdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyYXdbMTZdLCByYXdbMTddLCByYXdbMThdLCByYXdbMTldfX07CiAKICAgICBWRVJJRlkobS5jb2xzKCkgPT0gNCk7CiAgICAgVkVSSUZZKG0ucm93cygpID09IDUpOwogICAgIGludCBrID0gMDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgUm93c0F0Q29tcGlsZVRpbWU7ICsraSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUm93c0F0Q29tcGlsZVRpbWU7ICsraSkgewogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBDb2xzQXRDb21waWxlVGltZTsgKytqKSB7CiAgICAgICAgIFZFUklGWShtKGksIGopID09IHJhd1trXSk7CiAgICAgICAgICsrazsKQEAgLTIyNSw3ICsyMTgsNyBAQAogCiAgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gbTIoUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lKTsKICAgICBrID0gMDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgUm93c0F0Q29tcGlsZVRpbWU7ICsraSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUm93c0F0Q29tcGlsZVRpbWU7ICsraSkgewogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBDb2xzQXRDb21waWxlVGltZTsgKytqKSB7CiAgICAgICAgIG0yKGksIGopID0gcmF3W2tdOwogICAgICAgICArK2s7CkBAIC0yMzUsOCArMjI4LDggQEAKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgaW5pdGlhbGl6ZXJMaXN0QXJyYXlDb25zdHJ1Y3Rpb24oKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgaW5pdGlhbGl6ZXJMaXN0QXJyYXlDb25zdHJ1Y3Rpb24oKSB7CiAgIGNvbnN0IEluZGV4IFJvd3NBdENvbXBpbGVUaW1lID0gNTsKICAgY29uc3QgSW5kZXggQ29sc0F0Q29tcGlsZVRpbWUgPSA0OwogICBjb25zdCBJbmRleCBTaXplQXRDb21waWxlVGltZSA9IFJvd3NBdENvbXBpbGVUaW1lICogQ29sc0F0Q29tcGlsZVRpbWU7CkBAIC0yNDYsMjggKzIzOSwyMyBAQAogICAgIHJhd1tpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwogICB9CiAgIHsKLSAgICBBcnJheTxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IGEge307CisgICAgQXJyYXk8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBhe307CiAgICAgVkVSSUZZKGEuY29scygpID09IDApOwogICAgIFZFUklGWShhLnJvd3MoKSA9PSAwKTsKICAgfQogICB7Ci0gICAgQXJyYXk8U2NhbGFyLCA1LCA0PiBtIHsKLSAgICAgIHtyYXdbMF0sIHJhd1sxXSwgcmF3WzJdLCByYXdbM119LAotICAgICAge3Jhd1s0XSwgcmF3WzVdLCByYXdbNl0sIHJhd1s3XX0sCi0gICAgICB7cmF3WzhdLCByYXdbOV0sIHJhd1sxMF0sIHJhd1sxMV19LAotICAgICAge3Jhd1sxMl0sIHJhd1sxM10sIHJhd1sxNF0sIHJhd1sxNV19LAotICAgICAge3Jhd1sxNl0sIHJhd1sxN10sIHJhd1sxOF0sIHJhd1sxOV19Ci0gICAgfTsKKyAgICBBcnJheTxTY2FsYXIsIDUsIDQ+IG17e3Jhd1swXSwgcmF3WzFdLCByYXdbMl0sIHJhd1szXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHtyYXdbNF0sIHJhd1s1XSwgcmF3WzZdLCByYXdbN119LAorICAgICAgICAgICAgICAgICAgICAgICAgICB7cmF3WzhdLCByYXdbOV0sIHJhd1sxMF0sIHJhd1sxMV19LAorICAgICAgICAgICAgICAgICAgICAgICAgICB7cmF3WzEyXSwgcmF3WzEzXSwgcmF3WzE0XSwgcmF3WzE1XX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHtyYXdbMTZdLCByYXdbMTddLCByYXdbMThdLCByYXdbMTldfX07CiAKICAgICBBcnJheTxTY2FsYXIsIDUsIDQ+IG0yOwotICAgIG0yIDw8IHJhd1swXSwgcmF3WzFdLCByYXdbMl0sIHJhd1szXSwKLSAgICAgICAgICByYXdbNF0sIHJhd1s1XSwgcmF3WzZdLCByYXdbN10sCi0gICAgICAgICAgcmF3WzhdLCByYXdbOV0sIHJhd1sxMF0sIHJhd1sxMV0sCi0gICAgICAgICAgcmF3WzEyXSwgcmF3WzEzXSwgcmF3WzE0XSwgcmF3WzE1XSwKLSAgICAgICAgICByYXdbMTZdLCByYXdbMTddLCByYXdbMThdLCByYXdbMTldOworICAgIG0yIDw8IHJhd1swXSwgcmF3WzFdLCByYXdbMl0sIHJhd1szXSwgcmF3WzRdLCByYXdbNV0sIHJhd1s2XSwgcmF3WzddLCByYXdbOF0sIHJhd1s5XSwgcmF3WzEwXSwgcmF3WzExXSwgcmF3WzEyXSwKKyAgICAgICAgcmF3WzEzXSwgcmF3WzE0XSwgcmF3WzE1XSwgcmF3WzE2XSwgcmF3WzE3XSwgcmF3WzE4XSwgcmF3WzE5XTsKIAogICAgIGludCBrID0gMDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgUm93c0F0Q29tcGlsZVRpbWU7ICsraSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUm93c0F0Q29tcGlsZVRpbWU7ICsraSkgewogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBDb2xzQXRDb21waWxlVGltZTsgKytqKSB7CiAgICAgICAgIFZFUklGWShtKGksIGopID09IHJhd1trXSk7CiAgICAgICAgICsrazsKQEAgLTI3NiwxOCArMjY0LDE2IEBACiAgICAgVkVSSUZZX0lTX0FQUFJPWChtLCBtMik7CiAgIH0KICAgewotICAgIEFycmF5PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gbSB7Ci0gICAgICB7cmF3WzBdLCByYXdbMV0sIHJhd1syXSwgcmF3WzNdfSwKLSAgICAgIHtyYXdbNF0sIHJhd1s1XSwgcmF3WzZdLCByYXdbN119LAotICAgICAge3Jhd1s4XSwgcmF3WzldLCByYXdbMTBdLCByYXdbMTFdfSwKLSAgICAgIHtyYXdbMTJdLCByYXdbMTNdLCByYXdbMTRdLCByYXdbMTVdfSwKLSAgICAgIHtyYXdbMTZdLCByYXdbMTddLCByYXdbMThdLCByYXdbMTldfQotICAgIH07CisgICAgQXJyYXk8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBte3tyYXdbMF0sIHJhd1sxXSwgcmF3WzJdLCByYXdbM119LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmF3WzRdLCByYXdbNV0sIHJhd1s2XSwgcmF3WzddfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Jhd1s4XSwgcmF3WzldLCByYXdbMTBdLCByYXdbMTFdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Jhd1sxMl0sIHJhd1sxM10sIHJhd1sxNF0sIHJhd1sxNV19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmF3WzE2XSwgcmF3WzE3XSwgcmF3WzE4XSwgcmF3WzE5XX19OwogCiAgICAgVkVSSUZZKG0uY29scygpID09IDQpOwogICAgIFZFUklGWShtLnJvd3MoKSA9PSA1KTsKICAgICBpbnQgayA9IDA7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IFJvd3NBdENvbXBpbGVUaW1lOyArK2kpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFJvd3NBdENvbXBpbGVUaW1lOyArK2kpIHsKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgQ29sc0F0Q29tcGlsZVRpbWU7ICsraikgewogICAgICAgICBWRVJJRlkobShpLCBqKSA9PSByYXdba10pOwogICAgICAgICArK2s7CkBAIC0yOTYsNyArMjgyLDcgQEAKIAogICAgIEFycmF5PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gbTIoUm93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lKTsKICAgICBrID0gMDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgUm93c0F0Q29tcGlsZVRpbWU7ICsraSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUm93c0F0Q29tcGlsZVRpbWU7ICsraSkgewogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBDb2xzQXRDb21waWxlVGltZTsgKytqKSB7CiAgICAgICAgIG0yKGksIGopID0gcmF3W2tdOwogICAgICAgICArK2s7CkBAIC0zMDYsMjkgKzI5MiwyOCBAQAogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBkeW5hbWljVmVjdG9yQ29uc3RydWN0aW9uKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGR5bmFtaWNWZWN0b3JDb25zdHJ1Y3Rpb24oKSB7CiAgIGNvbnN0IEluZGV4IHNpemUgPSA0OwogICBTY2FsYXIgcmF3W3NpemVdOwogICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewogICAgIHJhd1tpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwogICB9CiAKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiAgVmVjdG9yWDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBWZWN0b3JYOwogCiAgIHsKLSAgICBWZWN0b3JYIHYge3tyYXdbMF0sIHJhd1sxXSwgcmF3WzJdLCByYXdbM119fTsKKyAgICBWZWN0b3JYIHZ7e3Jhd1swXSwgcmF3WzFdLCByYXdbMl0sIHJhd1szXX19OwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CiAgICAgICBWRVJJRlkodihpKSA9PSByYXdbaV0pOwogICAgIH0KICAgICBWRVJJRlkodi5yb3dzKCkgPT0gc2l6ZSk7CiAgICAgVkVSSUZZKHYuY29scygpID09IDEpOwotICAgIFZFUklGWV9JU19FUVVBTCh2LCAoVmVjdG9yWCB7e3Jhd1swXSwgcmF3WzFdLCByYXdbMl0sIHJhd1szXX19KSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHYsIChWZWN0b3JYe3tyYXdbMF0sIHJhd1sxXSwgcmF3WzJdLCByYXdbM119fSkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChpbml0aWFsaXplcl9saXN0X2NvbnN0cnVjdGlvbikKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChpbml0aWFsaXplcl9saXN0X2NvbnN0cnVjdGlvbikgewogICBDQUxMX1NVQlRFU1RfMShpbml0aWFsaXplckxpc3RWZWN0b3JDb25zdHJ1Y3Rpb248dW5zaWduZWQgY2hhcj4oKSk7CiAgIENBTExfU1VCVEVTVF8xKGluaXRpYWxpemVyTGlzdFZlY3RvckNvbnN0cnVjdGlvbjxmbG9hdD4oKSk7CiAgIENBTExfU1VCVEVTVF8xKGluaXRpYWxpemVyTGlzdFZlY3RvckNvbnN0cnVjdGlvbjxkb3VibGU+KCkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9pbnBsYWNlX2RlY29tcG9zaXRpb24uY3BwIGIvdGVzdC9pbnBsYWNlX2RlY29tcG9zaXRpb24uY3BwCmluZGV4IGUzYWE5OTUuLmE1NzU5NmMgMTAwNjQ0Ci0tLSBhL3Rlc3QvaW5wbGFjZV9kZWNvbXBvc2l0aW9uLmNwcAorKysgYi90ZXN0L2lucGxhY2VfZGVjb21wb3NpdGlvbi5jcHAKQEAgLTE0LDIxICsxNCwyMiBAQAogCiAvLyBUaGlzIGZpbGUgdGVzdCBpbnBsYWNlIGRlY29tcG9zaXRpb24gdGhyb3VnaCBSZWY8PiwgYXMgc3VwcG9ydGVkIGJ5IENob2xlc2t5LCBMVSwgYW5kIFFSIGRlY29tcG9zaXRpb25zLgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZWNUeXBlLHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgaW5wbGFjZShib29sIHNxdWFyZSA9IGZhbHNlLCBib29sIFNQRCA9IGZhbHNlKQotewordGVtcGxhdGUgPHR5cGVuYW1lIERlY1R5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGlucGxhY2UoYm9vbCBzcXVhcmUgPSBmYWxzZSwgYm9vbCBTUEQgPSBmYWxzZSkgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFJoc1R5cGU7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIDE+IFJlc1R5cGU7CiAKLSAgSW5kZXggcm93cyA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljID8gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMixFSUdFTl9URVNUX01BWF9TSVpFLzIpIDogSW5kZXgoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUpOwotICBJbmRleCBjb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMgPyAoc3F1YXJlP3Jvd3M6aW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMixyb3dzKSkgICAgOiBJbmRleChNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSk7CisgIEluZGV4IHJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljID8gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMiwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSW5kZXgoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUpOworICBJbmRleCBjb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyA/IChzcXVhcmUgPyByb3dzIDogaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMiwgcm93cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSW5kZXgoTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpOwogCi0gIE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIEEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CiAgIFJoc1R5cGUgYiA9IFJoc1R5cGU6OlJhbmRvbShyb3dzKTsKICAgUmVzVHlwZSB4KGNvbHMpOwogCi0gIGlmKFNQRCkKLSAgeworICBpZiAoU1BEKSB7CiAgICAgYXNzZXJ0KHNxdWFyZSk7CiAgICAgQS50b3BSb3dzKGNvbHMpID0gQS50b3BSb3dzKGNvbHMpLmFkam9pbnQoKSAqIEEudG9wUm93cyhjb2xzKTsKICAgICBBLmRpYWdvbmFsKCkuYXJyYXkoKSArPSAxZS0zOwpAQCAtNDAsNzEgKzQxLDYwIEBACiAgIERlY1R5cGUgZGVjKEEpOwogCiAgIC8vIENoZWNrIHRoYXQgdGhlIGNvbnRlbnQgb2YgQSBoYXMgYmVlbiBtb2RpZmllZAotICBWRVJJRllfSVNfTk9UX0FQUFJPWCggQSwgQTAgKTsKKyAgVkVSSUZZX0lTX05PVF9BUFBST1goQSwgQTApOwogCiAgIC8vIENoZWNrIHRoYXQgdGhlIGRlY29tcG9zaXRpb24gaXMgY29ycmVjdDoKLSAgaWYocm93cz09Y29scykKLSAgewotICAgIFZFUklGWV9JU19BUFBST1goIEEwICogKHggPSBkZWMuc29sdmUoYikpLCBiICk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggQTAudHJhbnNwb3NlKCkgKiBBMCAqICh4ID0gZGVjLnNvbHZlKGIpKSwgQTAudHJhbnNwb3NlKCkgKiBiICk7CisgIGlmIChyb3dzID09IGNvbHMpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKEEwICogKHggPSBkZWMuc29sdmUoYikpLCBiKTsKKyAgfSBlbHNlIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKEEwLnRyYW5zcG9zZSgpICogQTAgKiAoeCA9IGRlYy5zb2x2ZShiKSksIEEwLnRyYW5zcG9zZSgpICogYik7CiAgIH0KIAogICAvLyBDaGVjayB0aGF0IG1vZGlmeWluZyBBIGJyZWFrcyB0aGUgY3VycmVudCBkZWM6CiAgIEEuc2V0UmFuZG9tKCk7Ci0gIGlmKHJvd3M9PWNvbHMpCi0gIHsKLSAgICBWRVJJRllfSVNfTk9UX0FQUFJPWCggQTAgKiAoeCA9IGRlYy5zb2x2ZShiKSksIGIgKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBWRVJJRllfSVNfTk9UX0FQUFJPWCggQTAudHJhbnNwb3NlKCkgKiBBMCAqICh4ID0gZGVjLnNvbHZlKGIpKSwgQTAudHJhbnNwb3NlKCkgKiBiICk7CisgIGlmIChyb3dzID09IGNvbHMpIHsKKyAgICBWRVJJRllfSVNfTk9UX0FQUFJPWChBMCAqICh4ID0gZGVjLnNvbHZlKGIpKSwgYik7CisgIH0gZWxzZSB7CisgICAgVkVSSUZZX0lTX05PVF9BUFBST1goQTAudHJhbnNwb3NlKCkgKiBBMCAqICh4ID0gZGVjLnNvbHZlKGIpKSwgQTAudHJhbnNwb3NlKCkgKiBiKTsKICAgfQogCiAgIC8vIENoZWNrIHRoYXQgY2FsbGluZyBjb21wdXRlKEExKSBkb2VzIG5vdCBtb2RpZnkgQTE6CiAgIEEgPSBBMDsKICAgZGVjLmNvbXB1dGUoQTEpOwotICBWRVJJRllfSVNfRVFVQUwoQTAsQTEpOwotICBWRVJJRllfSVNfTk9UX0FQUFJPWCggQSwgQTAgKTsKLSAgaWYocm93cz09Y29scykKLSAgewotICAgIFZFUklGWV9JU19BUFBST1goIEEwICogKHggPSBkZWMuc29sdmUoYikpLCBiICk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggQTAudHJhbnNwb3NlKCkgKiBBMCAqICh4ID0gZGVjLnNvbHZlKGIpKSwgQTAudHJhbnNwb3NlKCkgKiBiICk7CisgIFZFUklGWV9JU19FUVVBTChBMCwgQTEpOworICBWRVJJRllfSVNfTk9UX0FQUFJPWChBLCBBMCk7CisgIGlmIChyb3dzID09IGNvbHMpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKEEwICogKHggPSBkZWMuc29sdmUoYikpLCBiKTsKKyAgfSBlbHNlIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKEEwLnRyYW5zcG9zZSgpICogQTAgKiAoeCA9IGRlYy5zb2x2ZShiKSksIEEwLnRyYW5zcG9zZSgpICogYik7CiAgIH0KIH0KIAorRUlHRU5fREVDTEFSRV9URVNUKGlucGxhY2VfZGVjb21wb3NpdGlvbikgeworICBFSUdFTl9VTlVTRUQgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLCA0LCAzPiBNYXRyaXg0M2Q7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKChpbnBsYWNlPExMVDxSZWY8TWF0cml4WGQ+ID4sIE1hdHJpeFhkPih0cnVlLCB0cnVlKSkpOworICAgIENBTExfU1VCVEVTVF8xKChpbnBsYWNlPExMVDxSZWY8TWF0cml4NGQ+ID4sIE1hdHJpeDRkPih0cnVlLCB0cnVlKSkpOwogCi1FSUdFTl9ERUNMQVJFX1RFU1QoaW5wbGFjZV9kZWNvbXBvc2l0aW9uKQotewotICBFSUdFTl9VTlVTRUQgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLDQsMz4gTWF0cml4NDNkOwotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCggaW5wbGFjZTxMTFQ8UmVmPE1hdHJpeFhkPiA+LCBNYXRyaXhYZD4odHJ1ZSx0cnVlKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMSgoIGlucGxhY2U8TExUPFJlZjxNYXRyaXg0ZD4gPiwgTWF0cml4NGQ+KHRydWUsdHJ1ZSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKGlucGxhY2U8TERMVDxSZWY8TWF0cml4WGQ+ID4sIE1hdHJpeFhkPih0cnVlLCB0cnVlKSkpOworICAgIENBTExfU1VCVEVTVF8yKChpbnBsYWNlPExETFQ8UmVmPE1hdHJpeDRkPiA+LCBNYXRyaXg0ZD4odHJ1ZSwgdHJ1ZSkpKTsKIAotICAgIENBTExfU1VCVEVTVF8yKCggaW5wbGFjZTxMRExUPFJlZjxNYXRyaXhYZD4gPiwgTWF0cml4WGQ+KHRydWUsdHJ1ZSkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoKCBpbnBsYWNlPExETFQ8UmVmPE1hdHJpeDRkPiA+LCBNYXRyaXg0ZD4odHJ1ZSx0cnVlKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoaW5wbGFjZTxQYXJ0aWFsUGl2TFU8UmVmPE1hdHJpeFhkPiA+LCBNYXRyaXhYZD4odHJ1ZSwgZmFsc2UpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKGlucGxhY2U8UGFydGlhbFBpdkxVPFJlZjxNYXRyaXg0ZD4gPiwgTWF0cml4NGQ+KHRydWUsIGZhbHNlKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzMoKCBpbnBsYWNlPFBhcnRpYWxQaXZMVTxSZWY8TWF0cml4WGQ+ID4sIE1hdHJpeFhkPih0cnVlLGZhbHNlKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMygoIGlucGxhY2U8UGFydGlhbFBpdkxVPFJlZjxNYXRyaXg0ZD4gPiwgTWF0cml4NGQ+KHRydWUsZmFsc2UpICkpOworICAgIENBTExfU1VCVEVTVF80KChpbnBsYWNlPEZ1bGxQaXZMVTxSZWY8TWF0cml4WGQ+ID4sIE1hdHJpeFhkPih0cnVlLCBmYWxzZSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgoaW5wbGFjZTxGdWxsUGl2TFU8UmVmPE1hdHJpeDRkPiA+LCBNYXRyaXg0ZD4odHJ1ZSwgZmFsc2UpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfNCgoIGlucGxhY2U8RnVsbFBpdkxVPFJlZjxNYXRyaXhYZD4gPiwgTWF0cml4WGQ+KHRydWUsZmFsc2UpICkpOwotICAgIENBTExfU1VCVEVTVF80KCggaW5wbGFjZTxGdWxsUGl2TFU8UmVmPE1hdHJpeDRkPiA+LCBNYXRyaXg0ZD4odHJ1ZSxmYWxzZSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKGlucGxhY2U8SG91c2Vob2xkZXJRUjxSZWY8TWF0cml4WGQ+ID4sIE1hdHJpeFhkPihmYWxzZSwgZmFsc2UpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKGlucGxhY2U8SG91c2Vob2xkZXJRUjxSZWY8TWF0cml4NDNkPiA+LCBNYXRyaXg0M2Q+KGZhbHNlLCBmYWxzZSkpKTsKIAotICAgIENBTExfU1VCVEVTVF81KCggaW5wbGFjZTxIb3VzZWhvbGRlclFSPFJlZjxNYXRyaXhYZD4gPiwgTWF0cml4WGQ+KGZhbHNlLGZhbHNlKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfNSgoIGlucGxhY2U8SG91c2Vob2xkZXJRUjxSZWY8TWF0cml4NDNkPiA+LCBNYXRyaXg0M2Q+KGZhbHNlLGZhbHNlKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNigoaW5wbGFjZTxDb2xQaXZIb3VzZWhvbGRlclFSPFJlZjxNYXRyaXhYZD4gPiwgTWF0cml4WGQ+KGZhbHNlLCBmYWxzZSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNigoaW5wbGFjZTxDb2xQaXZIb3VzZWhvbGRlclFSPFJlZjxNYXRyaXg0M2Q+ID4sIE1hdHJpeDQzZD4oZmFsc2UsIGZhbHNlKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzYoKCBpbnBsYWNlPENvbFBpdkhvdXNlaG9sZGVyUVI8UmVmPE1hdHJpeFhkPiA+LCBNYXRyaXhYZD4oZmFsc2UsZmFsc2UpICkpOwotICAgIENBTExfU1VCVEVTVF82KCggaW5wbGFjZTxDb2xQaXZIb3VzZWhvbGRlclFSPFJlZjxNYXRyaXg0M2Q+ID4sIE1hdHJpeDQzZD4oZmFsc2UsZmFsc2UpICkpOworICAgIENBTExfU1VCVEVTVF83KChpbnBsYWNlPEZ1bGxQaXZIb3VzZWhvbGRlclFSPFJlZjxNYXRyaXhYZD4gPiwgTWF0cml4WGQ+KGZhbHNlLCBmYWxzZSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNygoaW5wbGFjZTxGdWxsUGl2SG91c2Vob2xkZXJRUjxSZWY8TWF0cml4NDNkPiA+LCBNYXRyaXg0M2Q+KGZhbHNlLCBmYWxzZSkpKTsKIAotICAgIENBTExfU1VCVEVTVF83KCggaW5wbGFjZTxGdWxsUGl2SG91c2Vob2xkZXJRUjxSZWY8TWF0cml4WGQ+ID4sIE1hdHJpeFhkPihmYWxzZSxmYWxzZSkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzcoKCBpbnBsYWNlPEZ1bGxQaXZIb3VzZWhvbGRlclFSPFJlZjxNYXRyaXg0M2Q+ID4sIE1hdHJpeDQzZD4oZmFsc2UsZmFsc2UpICkpOwotCi0gICAgQ0FMTF9TVUJURVNUXzgoKCBpbnBsYWNlPENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb248UmVmPE1hdHJpeFhkPiA+LCBNYXRyaXhYZD4oZmFsc2UsZmFsc2UpICkpOwotICAgIENBTExfU1VCVEVTVF84KCggaW5wbGFjZTxDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPFJlZjxNYXRyaXg0M2Q+ID4sIE1hdHJpeDQzZD4oZmFsc2UsZmFsc2UpICkpOworICAgIENBTExfU1VCVEVTVF84KChpbnBsYWNlPENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb248UmVmPE1hdHJpeFhkPiA+LCBNYXRyaXhYZD4oZmFsc2UsIGZhbHNlKSkpOworICAgIENBTExfU1VCVEVTVF84KChpbnBsYWNlPENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb248UmVmPE1hdHJpeDQzZD4gPiwgTWF0cml4NDNkPihmYWxzZSwgZmFsc2UpKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvaW50ZWdlcl90eXBlcy5jcHAgYi90ZXN0L2ludGVnZXJfdHlwZXMuY3BwCmluZGV4IDEzMjI1MjcuLmEzYmU3NDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvaW50ZWdlcl90eXBlcy5jcHAKKysrIGIvdGVzdC9pbnRlZ2VyX3R5cGVzLmNwcApAQCAtMTAsMTIgKzEwLDEyIEBACiAjaW5jbHVkZSAibWFpbi5oIgogCiAjdW5kZWYgVkVSSUZZX0lTX0FQUFJPWAotI2RlZmluZSBWRVJJRllfSVNfQVBQUk9YKGEsIGIpIFZFUklGWSgoYSk9PShiKSk7CisjZGVmaW5lIFZFUklGWV9JU19BUFBST1goYSwgYikgVkVSSUZZKChhKSA9PSAoYikpOwogI3VuZGVmIFZFUklGWV9JU19OT1RfQVBQUk9YCi0jZGVmaW5lIFZFUklGWV9JU19OT1RfQVBQUk9YKGEsIGIpIFZFUklGWSgoYSkhPShiKSk7CisjZGVmaW5lIFZFUklGWV9JU19OT1RfQVBQUk9YKGEsIGIpIFZFUklGWSgoYSkgIT0gKGIpKTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgc2lnbmVkX2ludGVnZXJfdHlwZV90ZXN0cyhjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKIAogICBlbnVtIHsgaXNfc2lnbmVkID0gKFNjYWxhcigtMSkgPiBTY2FsYXIoMCkpID8gMCA6IDEgfTsKQEAgLTI0LDI4ICsyNCwyNiBAQAogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKIAotICBNYXRyaXhUeXBlIG0xKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG16ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKTsKKyAgTWF0cml4VHlwZSBtMShyb3dzLCBjb2xzKSwgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG16ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKTsKIAogICBkbyB7CiAgICAgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7Ci0gIH0gd2hpbGUobTEgPT0gbXplcm8gfHwgbTEgPT0gbTIpOworICB9IHdoaWxlIChtMSA9PSBtemVybyB8fCBtMSA9PSBtMik7CiAKICAgLy8gY2hlY2sgbGluZWFyIHN0cnVjdHVyZQogCiAgIFNjYWxhciBzMTsKICAgZG8gewogICAgIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7Ci0gIH0gd2hpbGUoczEgPT0gMCk7CisgIH0gd2hpbGUgKHMxID09IDApOwogCi0gIFZFUklGWV9JU19FUVVBTCgtKC1tMSksICAgICAgICAgICAgICAgICAgbTEpOwotICBWRVJJRllfSVNfRVFVQUwoLW0yK20xK20yLCAgICAgICAgICAgICAgIG0xKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCgtbTErbTIpKnMxLCAgICAgICAgICAgICAtczEqbTErczEqbTIpOworICBWRVJJRllfSVNfRVFVQUwoLSgtbTEpLCBtMSk7CisgIFZFUklGWV9JU19FUVVBTCgtbTIgKyBtMSArIG0yLCBtMSk7CisgIFZFUklGWV9JU19FUVVBTCgoLW0xICsgbTIpICogczEsIC1zMSAqIG0xICsgczEgKiBtMik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgaW50ZWdlcl90eXBlX3Rlc3RzKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgaW50ZWdlcl90eXBlX3Rlc3RzKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogCiAgIFZFUklGWShOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKTsKQEAgLTU5LDY3ICs1Nyw2NCBAQAogCiAgIC8vIHRoaXMgdGVzdCByZWxpZXMgYSBsb3Qgb24gUmFuZG9tLmgsIGFuZCB0aGVyZSdzIG5vdCBtdWNoIG1vcmUgdGhhdCB3ZSBjYW4gZG8KICAgLy8gdG8gdGVzdCBpdCwgaGVuY2UgSSBjb25zaWRlciB0aGF0IHdlIHdpbGwgaGF2ZSB0ZXN0ZWQgUmFuZG9tLmgKLSAgTWF0cml4VHlwZSBtMShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtemVybyA9IE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgbTEocm93cywgY29scyksIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKSwgbXplcm8gPSBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpOwogCiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBTcXVhcmVNYXRyaXhUeXBlOwotICBTcXVhcmVNYXRyaXhUeXBlIGlkZW50aXR5ID0gU3F1YXJlTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgcm93cyksCi0gICAgICAgICAgICAgICAgICAgc3F1YXJlID0gU3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIHJvd3MpOwotICBWZWN0b3JUeXBlIHYxKHJvd3MpLAotICAgICAgICAgICAgIHYyID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLAotICAgICAgICAgICAgIHZ6ZXJvID0gVmVjdG9yVHlwZTo6WmVybyhyb3dzKTsKKyAgU3F1YXJlTWF0cml4VHlwZSBpZGVudGl0eSA9IFNxdWFyZU1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIHJvd3MpLCBzcXVhcmUgPSBTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgcm93cyk7CisgIFZlY3RvclR5cGUgdjEocm93cyksIHYyID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLCB2emVybyA9IFZlY3RvclR5cGU6Olplcm8ocm93cyk7CiAKICAgZG8gewogICAgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOwotICB9IHdoaWxlKG0xID09IG16ZXJvIHx8IG0xID09IG0yKTsKKyAgfSB3aGlsZSAobTEgPT0gbXplcm8gfHwgbTEgPT0gbTIpOwogCiAgIGRvIHsKICAgICB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKLSAgfSB3aGlsZSh2MSA9PSB2emVybyB8fCB2MSA9PSB2Mik7CisgIH0gd2hpbGUgKHYxID09IHZ6ZXJvIHx8IHYxID09IHYyKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCAgICAgICAgICAgICAgIHYxLCAgICB2MSk7Ci0gIFZFUklGWV9JU19OT1RfQVBQUk9YKCAgICAgICAgICAgdjEsICAgIDIqdjEpOwotICBWRVJJRllfSVNfQVBQUk9YKCAgICAgICAgICAgICAgIHZ6ZXJvLCB2MS12MSk7Ci0gIFZFUklGWV9JU19BUFBST1goICAgICAgICAgICAgICAgbTEsICAgIG0xKTsKLSAgVkVSSUZZX0lTX05PVF9BUFBST1goICAgICAgICAgICBtMSwgICAgMiptMSk7Ci0gIFZFUklGWV9JU19BUFBST1goICAgICAgICAgICAgICAgbXplcm8sIG0xLW0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MSwgdjEpOworICBWRVJJRllfSVNfTk9UX0FQUFJPWCh2MSwgMiAqIHYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2emVybywgdjEgLSB2MSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIG0xKTsKKyAgVkVSSUZZX0lTX05PVF9BUFBST1gobTEsIDIgKiBtMSk7CisgIFZFUklGWV9JU19BUFBST1gobXplcm8sIG0xIC0gbTEpOwogCi0gIFZFUklGWV9JU19BUFBST1gobTMgPSBtMSxtMSk7CisgIFZFUklGWV9JU19BUFBST1gobTMgPSBtMSwgbTEpOwogICBNYXRyaXhUeXBlIG00OwotICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTEsbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTEsIG0xKTsKIAogICBtMy5yZWFsKCkgPSBtMS5yZWFsKCk7CiAgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8Y29uc3QgTWF0cml4VHlwZSY+KG0zKS5yZWFsKCksIHN0YXRpY19jYXN0PGNvbnN0IE1hdHJpeFR5cGUmPihtMSkucmVhbCgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChzdGF0aWNfY2FzdDxjb25zdCBNYXRyaXhUeXBlJj4obTMpLnJlYWwoKSwgbTEucmVhbCgpKTsKIAogICAvLyBjaGVjayA9PSAvICE9IG9wZXJhdG9ycwotICBWRVJJRlkobTE9PW0xKTsKLSAgVkVSSUZZKG0xIT1tMik7Ci0gIFZFUklGWSghKG0xPT1tMikpOwotICBWRVJJRlkoIShtMSE9bTEpKTsKKyAgVkVSSUZZKG0xID09IG0xKTsKKyAgVkVSSUZZKG0xICE9IG0yKTsKKyAgVkVSSUZZKCEobTEgPT0gbTIpKTsKKyAgVkVSSUZZKCEobTEgIT0gbTEpKTsKICAgbTEgPSBtMjsKLSAgVkVSSUZZKG0xPT1tMik7Ci0gIFZFUklGWSghKG0xIT1tMikpOworICBWRVJJRlkobTEgPT0gbTIpOworICBWRVJJRlkoIShtMSAhPSBtMikpOwogCiAgIC8vIGNoZWNrIGxpbmVhciBzdHJ1Y3R1cmUKIAogICBTY2FsYXIgczE7CiAgIGRvIHsKICAgICBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwotICB9IHdoaWxlKHMxID09IDApOworICB9IHdoaWxlIChzMSA9PSAwKTsKIAotICBWRVJJRllfSVNfRVFVQUwobTErbTEsICAgICAgICAgICAgICAgICAgIDIqbTEpOwotICBWRVJJRllfSVNfRVFVQUwobTErbTItbTEsICAgICAgICAgICAgICAgIG0yKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG0xKnMxLCAgICAgICAgICAgICAgICAgICBzMSptMSk7Ci0gIFZFUklGWV9JU19FUVVBTCgobTErbTIpKnMxLCAgICAgICAgICAgICAgczEqbTErczEqbTIpOwotICBtMyA9IG0yOyBtMyArPSBtMTsKLSAgVkVSSUZZX0lTX0VRVUFMKG0zLCAgICAgICAgICAgICAgICAgICAgICBtMSttMik7Ci0gIG0zID0gbTI7IG0zIC09IG0xOwotICBWRVJJRllfSVNfRVFVQUwobTMsICAgICAgICAgICAgICAgICAgICAgIG0yLW0xKTsKLSAgbTMgPSBtMjsgbTMgKj0gczE7Ci0gIFZFUklGWV9JU19FUVVBTChtMywgICAgICAgICAgICAgICAgICAgICAgczEqbTIpOworICBWRVJJRllfSVNfRVFVQUwobTEgKyBtMSwgMiAqIG0xKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0xICsgbTIgLSBtMSwgbTIpOworICBWRVJJRllfSVNfRVFVQUwobTEgKiBzMSwgczEgKiBtMSk7CisgIFZFUklGWV9JU19FUVVBTCgobTEgKyBtMikgKiBzMSwgczEgKiBtMSArIHMxICogbTIpOworICBtMyA9IG0yOworICBtMyArPSBtMTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0zLCBtMSArIG0yKTsKKyAgbTMgPSBtMjsKKyAgbTMgLT0gbTE7CisgIFZFUklGWV9JU19FUVVBTChtMywgbTIgLSBtMSk7CisgIG0zID0gbTI7CisgIG0zICo9IHMxOworICBWRVJJRllfSVNfRVFVQUwobTMsIHMxICogbTIpOwogCiAgIC8vIGNoZWNrIG1hdHJpeCBwcm9kdWN0LgogCkBAIC0xMjksNDEgKzEyNCwzOSBAQAogICBWRVJJRllfSVNfQVBQUk9YKChtMSAqIG0yLnRyYW5zcG9zZSgpKSAqIG0xLCBtMSAqIChtMi50cmFuc3Bvc2UoKSAqIG0xKSk7CiB9CiAKLXRlbXBsYXRlPGludD4KLXZvaWQgaW50ZWdlcl90eXBlc19leHRyYSgpCi17Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCBpbnRlZ2VyX3R5cGVzX2V4dHJhKCkgewogICBWRVJJRllfSVNfRVFVQUwoaW50KGludGVybmFsOjpzY2FsYXJfZGl2X2Nvc3Q8aW50Pjo6dmFsdWUpLCA4KTsKICAgVkVSSUZZX0lTX0VRVUFMKGludChpbnRlcm5hbDo6c2NhbGFyX2Rpdl9jb3N0PHVuc2lnbmVkIGludD46OnZhbHVlKSwgOCk7Ci0gIGlmKHNpemVvZihsb25nKT5zaXplb2YoaW50KSkgeworICBpZiAoc2l6ZW9mKGxvbmcpID4gc2l6ZW9mKGludCkpIHsKICAgICBWRVJJRlkoaW50KGludGVybmFsOjpzY2FsYXJfZGl2X2Nvc3Q8bG9uZz46OnZhbHVlKSA+IGludChpbnRlcm5hbDo6c2NhbGFyX2Rpdl9jb3N0PGludD46OnZhbHVlKSk7CiAgICAgVkVSSUZZKGludChpbnRlcm5hbDo6c2NhbGFyX2Rpdl9jb3N0PHVuc2lnbmVkIGxvbmc+Ojp2YWx1ZSkgPiBpbnQoaW50ZXJuYWw6OnNjYWxhcl9kaXZfY29zdDxpbnQ+Ojp2YWx1ZSkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChpbnRlZ2VyX3R5cGVzKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PHVuc2lnbmVkIGludCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDx1bnNpZ25lZCBsb25nLCAzLCA0PigpKSApOworRUlHRU5fREVDTEFSRV9URVNUKGludGVnZXJfdHlwZXMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDx1bnNpZ25lZCBpbnQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PHVuc2lnbmVkIGxvbmcsIDMsIDQ+KCkpKTsKIAotICAgIENBTExfU1VCVEVTVF8yKCBpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PGxvbmcsIDIsIDI+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIHNpZ25lZF9pbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PGxvbmcsIDIsIDI+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzIoaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxsb25nLCAyLCAyPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoc2lnbmVkX2ludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8bG9uZywgMiwgMj4oKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzMoIGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8Y2hhciwgMiwgRHluYW1pYz4oMiwgMTApKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxzaWduZWQgY2hhciwgMiwgRHluYW1pYz4oMiwgMTApKSApOworICAgIENBTExfU1VCVEVTVF8zKGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8Y2hhciwgMiwgRHluYW1pYz4oMiwgMTApKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoc2lnbmVkX2ludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8c2lnbmVkIGNoYXIsIDIsIER5bmFtaWM+KDIsIDEwKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzQoIGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8dW5zaWduZWQgY2hhciwgMywgMz4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDx1bnNpZ25lZCBjaGFyLCBEeW5hbWljLCBEeW5hbWljPigyMCwgMjApKSApOworICAgIENBTExfU1VCVEVTVF80KGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8dW5zaWduZWQgY2hhciwgMywgMz4oKSkpOworICAgIENBTExfU1VCVEVTVF80KGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8dW5zaWduZWQgY2hhciwgRHluYW1pYywgRHluYW1pYz4oMjAsIDIwKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzUoIGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8c2hvcnQsIER5bmFtaWMsIDQ+KDcsIDQpKSApOwotICAgIENBTExfU1VCVEVTVF81KCBzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxzaG9ydCwgRHluYW1pYywgND4oNywgNCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxzaG9ydCwgRHluYW1pYywgND4oNywgNCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxzaG9ydCwgRHluYW1pYywgND4oNywgNCkpKTsKIAotICAgIENBTExfU1VCVEVTVF82KCBpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PHVuc2lnbmVkIHNob3J0LCA0LCA0PigpKSApOworICAgIENBTExfU1VCVEVTVF82KGludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8dW5zaWduZWQgc2hvcnQsIDQsIDQ+KCkpKTsKIAotICAgIENBTExfU1VCVEVTVF83KCBpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PGxvbmcgbG9uZywgMTEsIDEzPigpKSApOwotICAgIENBTExfU1VCVEVTVF83KCBzaWduZWRfaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDxsb25nIGxvbmcsIDExLCAxMz4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNyhpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PGxvbmcgbG9uZywgMTEsIDEzPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoc2lnbmVkX2ludGVnZXJfdHlwZV90ZXN0cyhNYXRyaXg8bG9uZyBsb25nLCAxMSwgMTM+KCkpKTsKIAotICAgIENBTExfU1VCVEVTVF84KCBpbnRlZ2VyX3R5cGVfdGVzdHMoTWF0cml4PHVuc2lnbmVkIGxvbmcgbG9uZywgRHluYW1pYywgNT4oMSwgNSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzgoaW50ZWdlcl90eXBlX3Rlc3RzKE1hdHJpeDx1bnNpZ25lZCBsb25nIGxvbmcsIER5bmFtaWMsIDU+KDEsIDUpKSk7CiAgIH0KLSAgQ0FMTF9TVUJURVNUXzkoIGludGVnZXJfdHlwZXNfZXh0cmE8MD4oKSApOworICBDQUxMX1NVQlRFU1RfOShpbnRlZ2VyX3R5cGVzX2V4dHJhPDA+KCkpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9pbnZlcnNlLmNwcCBiL3Rlc3QvaW52ZXJzZS5jcHAKaW5kZXggMjc0OGMzOC4uZDU2NGRiNCAxMDA2NDQKLS0tIGEvdGVzdC9pbnZlcnNlLmNwcAorKysgYi90ZXN0L2ludmVyc2UuY3BwCkBAIC0xMSwxNCArMTEsMTEgQEAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8RWlnZW4vTFU+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIGludmVyc2VfZm9yX2ZpeGVkX3NpemUoY29uc3QgTWF0cml4VHlwZSYsIHN0ZDo6ZW5hYmxlX2lmX3Q8TWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWM+KiA9IDApCi17Ci19Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgaW52ZXJzZV9mb3JfZml4ZWRfc2l6ZShjb25zdCBNYXRyaXhUeXBlJiwgc3RkOjplbmFibGVfaWZfdDxNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljPiogPSAwKSB7fQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCBpbnZlcnNlX2Zvcl9maXhlZF9zaXplKGNvbnN0IE1hdHJpeFR5cGUmIG0xLCBzdGQ6OmVuYWJsZV9pZl90PE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lIT1EeW5hbWljPiogPSAwKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGludmVyc2VfZm9yX2ZpeGVkX3NpemUoY29uc3QgTWF0cml4VHlwZSYgbTEsIHN0ZDo6ZW5hYmxlX2lmX3Q8TWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgIT0gRHluYW1pYz4qID0gMCkgewogICB1c2luZyBzdGQ6OmFiczsKIAogICBNYXRyaXhUeXBlIG0yLCBpZGVudGl0eSA9IE1hdHJpeFR5cGU6OklkZW50aXR5KCk7CkBAIC0yNiw0NCArMjMsNDUgQEAKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7Ci0gIAotICAvL2NvbXB1dGVJbnZlcnNlQW5kRGV0V2l0aENoZWNrIHRlc3RzCi0gIC8vRmlyc3Q6IGFuIGludmVydGlibGUgbWF0cml4CisKKyAgLy8gY29tcHV0ZUludmVyc2VBbmREZXRXaXRoQ2hlY2sgdGVzdHMKKyAgLy8gRmlyc3Q6IGFuIGludmVydGlibGUgbWF0cml4CiAgIGJvb2wgaW52ZXJ0aWJsZTsKICAgU2NhbGFyIGRldDsKIAogICBtMi5zZXRaZXJvKCk7CiAgIG0xLmNvbXB1dGVJbnZlcnNlQW5kRGV0V2l0aENoZWNrKG0yLCBkZXQsIGludmVydGlibGUpOwogICBWRVJJRlkoaW52ZXJ0aWJsZSk7Ci0gIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHksIG0xKm0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChpZGVudGl0eSwgbTEgKiBtMik7CiAgIFZFUklGWV9JU19BUFBST1goZGV0LCBtMS5kZXRlcm1pbmFudCgpKTsKIAogICBtMi5zZXRaZXJvKCk7CiAgIG0xLmNvbXB1dGVJbnZlcnNlV2l0aENoZWNrKG0yLCBpbnZlcnRpYmxlKTsKICAgVkVSSUZZKGludmVydGlibGUpOwotICBWRVJJRllfSVNfQVBQUk9YKGlkZW50aXR5LCBtMSptMik7CisgIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHksIG0xICogbTIpOwogCi0gIC8vU2Vjb25kOiBhIHJhbmsgb25lIG1hdHJpeCAobm90IGludmVydGlibGUsIGV4Y2VwdCBmb3IgMXgxIG1hdHJpY2VzKQorICAvLyBTZWNvbmQ6IGEgcmFuayBvbmUgbWF0cml4IChub3QgaW52ZXJ0aWJsZSwgZXhjZXB0IGZvciAxeDEgbWF0cmljZXMpCiAgIFZlY3RvclR5cGUgdjMgPSBWZWN0b3JUeXBlOjpSYW5kb20oKTsKLSAgTWF0cml4VHlwZSBtMyA9IHYzKnYzLnRyYW5zcG9zZSgpLCBtNDsKKyAgTWF0cml4VHlwZSBtMyA9IHYzICogdjMudHJhbnNwb3NlKCksIG00OwogICBtMy5jb21wdXRlSW52ZXJzZUFuZERldFdpdGhDaGVjayhtNCwgZGV0LCBpbnZlcnRpYmxlKTsKLSAgVkVSSUZZKCBtMS5yb3dzKCk9PTEgPyBpbnZlcnRpYmxlIDogIWludmVydGlibGUgKTsKLSAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGFicyhkZXQtbTMuZGV0ZXJtaW5hbnQoKSksIFJlYWxTY2FsYXIoMSkpOworICBWRVJJRlkobTEucm93cygpID09IDEgPyBpbnZlcnRpYmxlIDogIWludmVydGlibGUpOworICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oYWJzKGRldCAtIG0zLmRldGVybWluYW50KCkpLCBSZWFsU2NhbGFyKDEpKTsKICAgbTMuY29tcHV0ZUludmVyc2VXaXRoQ2hlY2sobTQsIGludmVydGlibGUpOwotICBWRVJJRlkoIG0xLnJvd3MoKT09MSA/IGludmVydGlibGUgOiAhaW52ZXJ0aWJsZSApOwotICAKKyAgVkVSSUZZKG0xLnJvd3MoKSA9PSAxID8gaW52ZXJ0aWJsZSA6ICFpbnZlcnRpYmxlKTsKKwogICAvLyBjaGVjayB3aXRoIHN1Ym1hdHJpY2VzCiAgIHsKLSAgICBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSsxLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSsxLCBNYXRyaXhUeXBlOjpPcHRpb25zPiBtNTsKKyAgICBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSArIDEsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lICsgMSwgTWF0cml4VHlwZTo6T3B0aW9ucz4gbTU7CiAgICAgbTUuc2V0UmFuZG9tKCk7Ci0gICAgbTUudG9wTGVmdENvcm5lcihtMS5yb3dzKCksbTEucm93cygpKSA9IG0xOwotICAgIG0yID0gbTUudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSxNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4oKS5pbnZlcnNlKCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggKG01LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8TWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+KCkpLCBtMi5pbnZlcnNlKCkgKTsKKyAgICBtNS50b3BMZWZ0Q29ybmVyKG0xLnJvd3MoKSwgbTEucm93cygpKSA9IG0xOworICAgIG0yID0gbTUudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+KCkuaW52ZXJzZSgpOworICAgIFZFUklGWV9JU19BUFBST1goKG01LnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8TWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPigpKSwKKyAgICAgICAgICAgICAgICAgICAgIG0yLmludmVyc2UoKSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbnZlcnNlKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgaW52ZXJzZShjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgSW52ZXJzZS5oCiAgICovCkBAIC03MiwxOSArNzAsMTcgQEAKIAogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAKLSAgTWF0cml4VHlwZSBtMShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtMihyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBpZGVudGl0eSA9IE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIHJvd3MpOwotICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyb3dzLHJvd3Mscm93cyxtMSk7CisgIE1hdHJpeFR5cGUgbTEocm93cywgY29scyksIG0yKHJvd3MsIGNvbHMpLCBpZGVudGl0eSA9IE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIHJvd3MpOworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyb3dzLCByb3dzLCByb3dzLCBtMSk7CiAgIG0yID0gbTEuaW52ZXJzZSgpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtMi5pbnZlcnNlKCkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTIuaW52ZXJzZSgpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKChTY2FsYXIoMikqbTIpLmludmVyc2UoKSwgbTIuaW52ZXJzZSgpKlNjYWxhcigwLjUpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoU2NhbGFyKDIpICogbTIpLmludmVyc2UoKSwgbTIuaW52ZXJzZSgpICogU2NhbGFyKDAuNSkpOwogCi0gIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHksIG0xLmludmVyc2UoKSAqIG0xICk7Ci0gIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHksIG0xICogbTEuaW52ZXJzZSgpICk7CisgIFZFUklGWV9JU19BUFBST1goaWRlbnRpdHksIG0xLmludmVyc2UoKSAqIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChpZGVudGl0eSwgbTEgKiBtMS5pbnZlcnNlKCkpOwogCi0gIFZFUklGWV9JU19BUFBST1gobTEsIG0xLmludmVyc2UoKS5pbnZlcnNlKCkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTEuaW52ZXJzZSgpLmludmVyc2UoKSk7CiAKICAgLy8gc2luY2UgZm9yIHRoZSBnZW5lcmFsIGNhc2Ugd2UgaW1wbGVtZW50IHNlcGFyYXRlbHkgcm93LW1ham9yIGFuZCBjb2wtbWFqb3IsIHRlc3QgdGhhdAogICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGUobTEudHJhbnNwb3NlKCkuaW52ZXJzZSgpKSwgTWF0cml4VHlwZShtMS5pbnZlcnNlKCkudHJhbnNwb3NlKCkpKTsKQEAgLTkyLDU5ICs4OCw1NCBAQAogICBpbnZlcnNlX2Zvcl9maXhlZF9zaXplKG0xKTsKIAogICAvLyBjaGVjayBpbi1wbGFjZSBpbnZlcnNpb24KLSAgaWYoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+PTIgJiYgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU8PTQpCi0gIHsKKyAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID49IDIgJiYgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPD0gNCkgewogICAgIC8vIGluLXBsYWNlIGlzIGZvcmJpZGRlbgogICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0xID0gbTEuaW52ZXJzZSgpKTsKLSAgfQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICBtMiA9IG0xLmludmVyc2UoKTsKICAgICBtMSA9IG0xLmludmVyc2UoKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0xLG0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtMik7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgotdm9pZCBpbnZlcnNlX3plcm9zaXplZCgpCi17Ci0gIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBBKDAsMCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBpbnZlcnNlX3plcm9zaXplZCgpIHsKKyAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gQSgwLCAwKTsKICAgewotICAgIE1hdHJpeDxTY2FsYXIsMCwxPiBiLCB4OworICAgIE1hdHJpeDxTY2FsYXIsIDAsIDE+IGIsIHg7CiAgICAgeCA9IEEuaW52ZXJzZSgpICogYjsKICAgfQogICB7Ci0gICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGIoMCwxKSwgeDsKKyAgICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBiKDAsIDEpLCB4OwogICAgIHggPSBBLmludmVyc2UoKSAqIGI7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHgucm93cygpLCAwKTsKICAgICBWRVJJRllfSVNfRVFVQUwoeC5jb2xzKCksIDEpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChpbnZlcnNlKQoteworRUlHRU5fREVDTEFSRV9URVNUKGludmVyc2UpIHsKICAgaW50IHMgPSAwOwotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBpbnZlcnNlKE1hdHJpeDxkb3VibGUsMSwxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBpbnZlcnNlKE1hdHJpeDJkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGludmVyc2UoTWF0cml4M2YoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggaW52ZXJzZShNYXRyaXg0ZigpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBpbnZlcnNlKE1hdHJpeDxmbG9hdCw0LDQsRG9udEFsaWduPigpKSApOwotICAgIAotICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oNTAsMzIwKTsgCi0gICAgQ0FMTF9TVUJURVNUXzUoIGludmVyc2UoTWF0cml4WGYocyxzKSkgKTsKLSAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHMpCi0gICAgQ0FMTF9TVUJURVNUXzUoIGludmVyc2VfemVyb3NpemVkPGZsb2F0PigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIGludmVyc2UoTWF0cml4WGYoMCwgMCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIGludmVyc2UoTWF0cml4WGYoMSwgMSkpICk7Ci0gICAgCi0gICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigyNSwxMDApOwotICAgIENBTExfU1VCVEVTVF82KCBpbnZlcnNlKE1hdHJpeFhjZChzLHMpKSApOwotICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKLSAgICAKLSAgICBDQUxMX1NVQlRFU1RfNyggaW52ZXJzZShNYXRyaXg0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF83KCBpbnZlcnNlKE1hdHJpeDxkb3VibGUsNCw0LERvbnRBbGlnbj4oKSkgKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoaW52ZXJzZShNYXRyaXg8ZG91YmxlLCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoaW52ZXJzZShNYXRyaXgyZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoaW52ZXJzZShNYXRyaXgzZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoaW52ZXJzZShNYXRyaXg0ZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoaW52ZXJzZShNYXRyaXg8ZmxvYXQsIDQsIDQsIERvbnRBbGlnbj4oKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzgoIGludmVyc2UoTWF0cml4NGNkKCkpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50Pig1MCwgMzIwKTsKKyAgICBDQUxMX1NVQlRFU1RfNShpbnZlcnNlKE1hdHJpeFhmKHMsIHMpKSk7CisgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQorICAgIENBTExfU1VCVEVTVF81KGludmVyc2VfemVyb3NpemVkPGZsb2F0PigpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShpbnZlcnNlKE1hdHJpeFhmKDAsIDApKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoaW52ZXJzZShNYXRyaXhYZigxLCAxKSkpOworCisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigyNSwgMTAwKTsKKyAgICBDQUxMX1NVQlRFU1RfNihpbnZlcnNlKE1hdHJpeFhjZChzLCBzKSkpOworICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKKworICAgIENBTExfU1VCVEVTVF83KGludmVyc2UoTWF0cml4NGQoKSkpOworICAgIENBTExfU1VCVEVTVF83KGludmVyc2UoTWF0cml4PGRvdWJsZSwgNCwgNCwgRG9udEFsaWduPigpKSk7CisKKyAgICBDQUxMX1NVQlRFU1RfOChpbnZlcnNlKE1hdHJpeDRjZCgpKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvaW8uY3BwIGIvdGVzdC9pby5jcHAKaW5kZXggYWExNGU3Ni4uMjE5ZTFjYiAxMDA2NDQKLS0tIGEvdGVzdC9pby5jcHAKKysrIGIvdGVzdC9pby5jcHAKQEAgLTExLDUyICsxMSw0NCBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Ci1zdHJ1Y3QgY2hlY2tfb3N0cmVhbV9pbXBsCi17Ci0gIHN0YXRpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBjb25zdCBBcnJheTxTY2FsYXIsMSwxPiBhcnJheSgxMjMpOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBjaGVja19vc3RyZWFtX2ltcGwgeworICBzdGF0aWMgdm9pZCBydW4oKSB7CisgICAgY29uc3QgQXJyYXk8U2NhbGFyLCAxLCAxPiBhcnJheSgxMjMpOwogICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKICAgICBzcyA8PCBhcnJheTsKICAgICBWRVJJRlkoc3Muc3RyKCkgPT0gIjEyMyIpOwogCi0gICAgY2hlY2tfb3N0cmVhbV9pbXBsPCBzdGQ6OmNvbXBsZXg8U2NhbGFyPiA+OjpydW4oKTsKKyAgICBjaGVja19vc3RyZWFtX2ltcGw8c3RkOjpjb21wbGV4PFNjYWxhcj4gPjo6cnVuKCk7CiAgIH07CiB9OwogCi10ZW1wbGF0ZTw+Ci1zdHJ1Y3QgY2hlY2tfb3N0cmVhbV9pbXBsPGJvb2w+Ci17Ci0gIHN0YXRpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBjb25zdCBBcnJheTxib29sLDEsMj4gYXJyYXkoMSwgMCk7Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGNoZWNrX29zdHJlYW1faW1wbDxib29sPiB7CisgIHN0YXRpYyB2b2lkIHJ1bigpIHsKKyAgICBjb25zdCBBcnJheTxib29sLCAxLCAyPiBhcnJheSgxLCAwKTsKICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7CiAgICAgc3MgPDwgYXJyYXk7CiAgICAgVkVSSUZZKHNzLnN0cigpID09ICIxICAwIik7CiAgIH07CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Ci1zdHJ1Y3QgY2hlY2tfb3N0cmVhbV9pbXBsPCBzdGQ6OmNvbXBsZXg8U2NhbGFyPiA+Ci17Ci0gIHN0YXRpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBjb25zdCBBcnJheTxzdGQ6OmNvbXBsZXg8U2NhbGFyPiwxLDE+IGFycmF5KHN0ZDo6Y29tcGxleDxTY2FsYXI+KDEyLCAzNCkpOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0cnVjdCBjaGVja19vc3RyZWFtX2ltcGw8c3RkOjpjb21wbGV4PFNjYWxhcj4gPiB7CisgIHN0YXRpYyB2b2lkIHJ1bigpIHsKKyAgICBjb25zdCBBcnJheTxzdGQ6OmNvbXBsZXg8U2NhbGFyPiwgMSwgMT4gYXJyYXkoc3RkOjpjb21wbGV4PFNjYWxhcj4oMTIsIDM0KSk7CiAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNzOwogICAgIHNzIDw8IGFycmF5OwogICAgIFZFUklGWShzcy5zdHIoKSA9PSAiKDEyLDM0KSIpOwogICB9OwogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgotc3RhdGljIHZvaWQgY2hlY2tfb3N0cmVhbSgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorc3RhdGljIHZvaWQgY2hlY2tfb3N0cmVhbSgpIHsKICAgY2hlY2tfb3N0cmVhbV9pbXBsPFNjYWxhcj46OnJ1bigpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QocmFuZCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChyYW5kKSB7CiAgIENBTExfU1VCVEVTVChjaGVja19vc3RyZWFtPGJvb2w+KCkpOwogICBDQUxMX1NVQlRFU1QoY2hlY2tfb3N0cmVhbTxmbG9hdD4oKSk7CiAgIENBTExfU1VCVEVTVChjaGVja19vc3RyZWFtPGRvdWJsZT4oKSk7CmRpZmYgLS1naXQgYS90ZXN0L2lzX3NhbWVfZGVuc2UuY3BwIGIvdGVzdC9pc19zYW1lX2RlbnNlLmNwcAppbmRleCAyM2RkODA2Li4xOGMwN2U2IDEwMDY0NAotLS0gYS90ZXN0L2lzX3NhbWVfZGVuc2UuY3BwCisrKyBiL3Rlc3QvaXNfc2FtZV9kZW5zZS5jcHAKQEAgLTExLDMwICsxMSwyOCBAQAogCiB1c2luZyBpbnRlcm5hbDo6aXNfc2FtZV9kZW5zZTsKIAotRUlHRU5fREVDTEFSRV9URVNUKGlzX3NhbWVfZGVuc2UpCi17Ci0gIHR5cGVkZWYgTWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+IENvbE1hdHJpeFhkOwotICB0eXBlZGVmIE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+IENvbE1hdHJpeFhjZDsKLSAgQ29sTWF0cml4WGQgbTEoMTAsMTApOwotICBDb2xNYXRyaXhYY2QgbTIoMTAsMTApOworRUlHRU5fREVDTEFSRV9URVNUKGlzX3NhbWVfZGVuc2UpIHsKKyAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljLCBDb2xNYWpvcj4gQ29sTWF0cml4WGQ7CisgIHR5cGVkZWYgTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBEeW5hbWljLCBEeW5hbWljLCBDb2xNYWpvcj4gQ29sTWF0cml4WGNkOworICBDb2xNYXRyaXhYZCBtMSgxMCwgMTApOworICBDb2xNYXRyaXhYY2QgbTIoMTAsIDEwKTsKICAgUmVmPENvbE1hdHJpeFhkPiByZWZfbTEobTEpOwotICBSZWY8Q29sTWF0cml4WGQsMCwgU3RyaWRlPER5bmFtaWMsRHluYW1pYz4gPiAgcmVmX20yX3JlYWwobTIucmVhbCgpKTsKKyAgUmVmPENvbE1hdHJpeFhkLCAwLCBTdHJpZGU8RHluYW1pYywgRHluYW1pYz4gPiByZWZfbTJfcmVhbChtMi5yZWFsKCkpOwogICBSZWY8Y29uc3QgQ29sTWF0cml4WGQ+IGNvbnN0X3JlZl9tMShtMSk7CiAKLSAgVkVSSUZZKGlzX3NhbWVfZGVuc2UobTEsbTEpKTsKLSAgVkVSSUZZKGlzX3NhbWVfZGVuc2UobTEscmVmX20xKSk7Ci0gIFZFUklGWShpc19zYW1lX2RlbnNlKGNvbnN0X3JlZl9tMSxtMSkpOwotICBWRVJJRlkoaXNfc2FtZV9kZW5zZShjb25zdF9yZWZfbTEscmVmX20xKSk7Ci0gIAotICBWRVJJRlkoaXNfc2FtZV9kZW5zZShtMS5ibG9jaygwLDAsbTEucm93cygpLG0xLmNvbHMoKSksbTEpKTsKLSAgVkVSSUZZKCFpc19zYW1lX2RlbnNlKG0xLnJvdygwKSxtMS5jb2woMCkpKTsKLSAgCi0gIFJlZjxjb25zdCBDb2xNYXRyaXhYZD4gY29uc3RfcmVmX20xX3JvdyhtMS5yb3coMSkpOwotICBWRVJJRlkoIWlzX3NhbWVfZGVuc2UobTEucm93KDEpLGNvbnN0X3JlZl9tMV9yb3cpKTsKLSAgCi0gIFJlZjxjb25zdCBDb2xNYXRyaXhYZD4gY29uc3RfcmVmX20xX2NvbChtMS5jb2woMSkpOwotICBWRVJJRlkoaXNfc2FtZV9kZW5zZShtMS5jb2woMSksY29uc3RfcmVmX20xX2NvbCkpOworICBWRVJJRlkoaXNfc2FtZV9kZW5zZShtMSwgbTEpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZGVuc2UobTEsIHJlZl9tMSkpOworICBWRVJJRlkoaXNfc2FtZV9kZW5zZShjb25zdF9yZWZfbTEsIG0xKSk7CisgIFZFUklGWShpc19zYW1lX2RlbnNlKGNvbnN0X3JlZl9tMSwgcmVmX20xKSk7CiAKKyAgVkVSSUZZKGlzX3NhbWVfZGVuc2UobTEuYmxvY2soMCwgMCwgbTEucm93cygpLCBtMS5jb2xzKCkpLCBtMSkpOworICBWRVJJRlkoIWlzX3NhbWVfZGVuc2UobTEucm93KDApLCBtMS5jb2woMCkpKTsKKworICBSZWY8Y29uc3QgQ29sTWF0cml4WGQ+IGNvbnN0X3JlZl9tMV9yb3cobTEucm93KDEpKTsKKyAgVkVSSUZZKCFpc19zYW1lX2RlbnNlKG0xLnJvdygxKSwgY29uc3RfcmVmX20xX3JvdykpOworCisgIFJlZjxjb25zdCBDb2xNYXRyaXhYZD4gY29uc3RfcmVmX20xX2NvbChtMS5jb2woMSkpOworICBWRVJJRlkoaXNfc2FtZV9kZW5zZShtMS5jb2woMSksIGNvbnN0X3JlZl9tMV9jb2wpKTsKIAogICBWRVJJRlkoIWlzX3NhbWVfZGVuc2UobTEsIHJlZl9tMl9yZWFsKSk7CiAgIFZFUklGWSghaXNfc2FtZV9kZW5zZShtMiwgcmVmX20yX3JlYWwpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvamFjb2JpLmNwcCBiL3Rlc3QvamFjb2JpLmNwcAppbmRleCAyNzNiOTRkLi43NjM0NjA0IDEwMDY0NAotLS0gYS90ZXN0L2phY29iaS5jcHAKKysrIGIvdGVzdC9qYWNvYmkuY3BwCkBAIC0xMSwxNiArMTEsMTIgQEAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8RWlnZW4vU1ZEPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBKYWNvYmlTY2FsYXI+Ci12b2lkIGphY29iaShjb25zdCBNYXRyaXhUeXBlJiBtID0gTWF0cml4VHlwZSgpKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIEphY29iaVNjYWxhcj4KK3ZvaWQgamFjb2JpKGNvbnN0IE1hdHJpeFR5cGUmIG0gPSBNYXRyaXhUeXBlKCkpIHsKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKLSAgZW51bSB7Ci0gICAgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKLSAgICBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lCi0gIH07CisgIGVudW0geyBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIH07CiAKICAgdHlwZWRlZiBNYXRyaXg8SmFjb2JpU2NhbGFyLCAyLCAxPiBKYWNvYmlWZWN0b3I7CiAKQEAgLTMxLDEwICsyNywxMCBAQAogICBKYWNvYmlSb3RhdGlvbjxKYWNvYmlTY2FsYXI+IHJvdChjLCBzKTsKIAogICB7Ci0gICAgSW5kZXggcCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSk7CisgICAgSW5kZXggcCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAxKTsKICAgICBJbmRleCBxOwogICAgIGRvIHsKLSAgICAgIHEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpOworICAgICAgcSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAxKTsKICAgICB9IHdoaWxlIChxID09IHApOwogCiAgICAgTWF0cml4VHlwZSBiID0gYTsKQEAgLTQ0LDEwICs0MCwxMCBAQAogICB9CiAKICAgewotICAgIEluZGV4IHAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworICAgIEluZGV4IHAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CiAgICAgSW5kZXggcTsKICAgICBkbyB7Ci0gICAgICBxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKyAgICAgIHEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CiAgICAgfSB3aGlsZSAocSA9PSBwKTsKIAogICAgIE1hdHJpeFR5cGUgYiA9IGE7CkBAIC01NywyOCArNTMsMjggQEAKICAgfQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoamFjb2JpKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCggamFjb2JpPE1hdHJpeDNmLCBmbG9hdD4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMigoIGphY29iaTxNYXRyaXg0ZCwgZG91YmxlPigpICkpOwotICAgIENBTExfU1VCVEVTVF8zKCggamFjb2JpPE1hdHJpeDRjZiwgZmxvYXQ+KCkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoKCBqYWNvYmk8TWF0cml4NGNmLCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSApKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChqYWNvYmkpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoKGphY29iaTxNYXRyaXgzZiwgZmxvYXQ+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMigoamFjb2JpPE1hdHJpeDRkLCBkb3VibGU+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoamFjb2JpPE1hdHJpeDRjZiwgZmxvYXQ+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoamFjb2JpPE1hdHJpeDRjZiwgc3RkOjpjb21wbGV4PGZsb2F0PiA+KCkpKTsKIAotICAgIENBTExfU1VCVEVTVF8xKCggamFjb2JpPE1hdHJpeDxmbG9hdCwgMywgMywgUm93TWFqb3I+LCBmbG9hdD4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMigoIGphY29iaTxNYXRyaXg8ZG91YmxlLCA0LCA0LCBSb3dNYWpvcj4sIGRvdWJsZT4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMygoIGphY29iaTxNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgNCwgNCwgUm93TWFqb3I+LCBmbG9hdD4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMygoIGphY29iaTxNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgNCwgNCwgUm93TWFqb3I+LCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgoamFjb2JpPE1hdHJpeDxmbG9hdCwgMywgMywgUm93TWFqb3I+LCBmbG9hdD4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKChqYWNvYmk8TWF0cml4PGRvdWJsZSwgNCwgNCwgUm93TWFqb3I+LCBkb3VibGU+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoamFjb2JpPE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCA0LCA0LCBSb3dNYWpvcj4sIGZsb2F0PigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKGphY29iaTxNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgNCwgNCwgUm93TWFqb3I+LCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSkpOwogCi0gICAgaW50IHIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkvMiksCi0gICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkvMik7Ci0gICAgQ0FMTF9TVUJURVNUXzQoKCBqYWNvYmk8TWF0cml4WGYsIGZsb2F0PihNYXRyaXhYZihyLGMpKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfNSgoIGphY29iaTxNYXRyaXhYY2QsIGRvdWJsZT4oTWF0cml4WGNkKHIsYykpICkpOwotICAgIENBTExfU1VCVEVTVF81KCggamFjb2JpPE1hdHJpeFhjZCwgc3RkOjpjb21wbGV4PGRvdWJsZT4gPihNYXRyaXhYY2QocixjKSkgKSk7Ci0gICAgLy8gY29tcGxleDxmbG9hdD4gaXMgcmVhbGx5IGltcG9ydGFudCB0byB0ZXN0IGFzIGl0IGlzIHRoZSBvbmx5IHdheSB0byBjb3ZlciBjb25qdWdhdGlvbiBpc3N1ZXMgaW4gY2VydGFpbiB1bmFsaWduZWQgcGF0aHMKLSAgICBDQUxMX1NVQlRFU1RfNigoIGphY29iaTxNYXRyaXhYY2YsIGZsb2F0PihNYXRyaXhYY2YocixjKSkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoKCBqYWNvYmk8TWF0cml4WGNmLCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oTWF0cml4WGNmKHIsYykpICkpOwotICAgIAorICAgIGludCByID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSAvIDIpLAorICAgICAgICBjID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSAvIDIpOworICAgIENBTExfU1VCVEVTVF80KChqYWNvYmk8TWF0cml4WGYsIGZsb2F0PihNYXRyaXhYZihyLCBjKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoamFjb2JpPE1hdHJpeFhjZCwgZG91YmxlPihNYXRyaXhYY2QociwgYykpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKGphY29iaTxNYXRyaXhYY2QsIHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oTWF0cml4WGNkKHIsIGMpKSkpOworICAgIC8vIGNvbXBsZXg8ZmxvYXQ+IGlzIHJlYWxseSBpbXBvcnRhbnQgdG8gdGVzdCBhcyBpdCBpcyB0aGUgb25seSB3YXkgdG8gY292ZXIgY29uanVnYXRpb24gaXNzdWVzIGluIGNlcnRhaW4gdW5hbGlnbmVkCisgICAgLy8gcGF0aHMKKyAgICBDQUxMX1NVQlRFU1RfNigoamFjb2JpPE1hdHJpeFhjZiwgZmxvYXQ+KE1hdHJpeFhjZihyLCBjKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNigoamFjb2JpPE1hdHJpeFhjZiwgc3RkOjpjb21wbGV4PGZsb2F0PiA+KE1hdHJpeFhjZihyLCBjKSkpKTsKKwogICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocik7CiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShjKTsKICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC9qYWNvYmlzdmQuY3BwIGIvdGVzdC9qYWNvYmlzdmQuY3BwCmluZGV4IDk0MTZiODQuLmNmNWNjNWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvamFjb2Jpc3ZkLmNwcAorKysgYi90ZXN0L2phY29iaXN2ZC5jcHAKQEAgLTE1LDEzICsxNSwxMiBAQAogI2luY2x1ZGUgPEVpZ2VuL1NWRD4KIAogI2RlZmluZSBTVkRfREVGQVVMVChNKSBKYWNvYmlTVkQ8TT4KLSNkZWZpbmUgU1ZEX0ZPUl9NSU5fTk9STShNKSBKYWNvYmlTVkQ8TSxDb2xQaXZIb3VzZWhvbGRlclFSUHJlY29uZGl0aW9uZXI+CisjZGVmaW5lIFNWRF9GT1JfTUlOX05PUk0oTSkgSmFjb2JpU1ZEPE0sIENvbFBpdkhvdXNlaG9sZGVyUVJQcmVjb25kaXRpb25lcj4KICNkZWZpbmUgU1ZEX1NUQVRJQ19PUFRJT05TKE0sIE8pIEphY29iaVNWRDxNLCBPPgogI2luY2x1ZGUgInN2ZF9jb21tb24uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXZvaWQgamFjb2Jpc3ZkX21ldGhvZCgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgamFjb2Jpc3ZkX21ldGhvZCgpIHsKICAgZW51bSB7IFNpemUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSB9OwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKICAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhciwgU2l6ZSwgMT4gUmVhbFZlY1R5cGU7CkBAIC05OCwyMSArOTcsMjIgQEAKIG5hbWVzcGFjZSBGb28gewogLy8gb2xkZXIgY29tcGlsZXIgcmVxdWlyZSBhIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIEJhcgogLy8gY2Y6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc0MTE1MTUvCi1jbGFzcyBCYXIge3B1YmxpYzogQmFyKCkge319OworY2xhc3MgQmFyIHsKKyBwdWJsaWM6CisgIEJhcigpIHt9Cit9OwogYm9vbCBvcGVyYXRvcjwoY29uc3QgQmFyJiwgY29uc3QgQmFyJikgeyByZXR1cm4gdHJ1ZTsgfQotfQorfSAgLy8gbmFtZXNwYWNlIEZvbwogLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBhIHZlcnkgc3RyYW5nZSBNU1ZDIGlzc3VlIGZvciB3aGljaCBzaW1wbHkKIC8vIGluY2x1ZGluZyBTVkRCYXNlLmggbWVzc2VzIHVwIHdpdGggc3RkOjptYXggYW5kIGN1c3RvbSBzY2FsYXIgdHlwZQotdm9pZCBtc3ZjX3dvcmthcm91bmQoKQotewordm9pZCBtc3ZjX3dvcmthcm91bmQoKSB7CiAgIGNvbnN0IEZvbzo6QmFyIGE7CiAgIGNvbnN0IEZvbzo6QmFyIGI7Ci0gIGNvbnN0IEZvbzo6QmFyIGMgPSBzdGQ6Om1heCBFSUdFTl9OT1RfQV9NQUNSTyAoYSxiKTsKKyAgY29uc3QgRm9vOjpCYXIgYyA9IHN0ZDo6bWF4IEVJR0VOX05PVF9BX01BQ1JPKGEsIGIpOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoYykKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGphY29iaXN2ZCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChqYWNvYmlzdmQpIHsKICAgQ0FMTF9TVUJURVNUXzEoKGphY29iaXN2ZF92ZXJpZnlfaW5wdXRzPE1hdHJpeDRkPigpKSk7CiAgIENBTExfU1VCVEVTVF8yKChqYWNvYmlzdmRfdmVyaWZ5X2lucHV0cyhNYXRyaXg8ZmxvYXQsIDUsIER5bmFtaWM+KDUsIDYpKSkpOwogICBDQUxMX1NVQlRFU1RfMygoamFjb2Jpc3ZkX3ZlcmlmeV9pbnB1dHM8TWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCA3LCA1Pj4oKSkpOwpAQCAtMTI4LDEyICsxMjgsMTEgQEAKICAgQ0FMTF9TVUJURVNUXzExKHN2ZF9hbGxfdHJpdmlhbF8yeDIoamFjb2Jpc3ZkX3RoaW5fb3B0aW9uczxNYXRyaXgyZD4pKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBpbnQgciA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAzMCksCi0gICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMzApOwotICAgIAorICAgIGludCByID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDMwKSwgYyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAzMCk7CisKICAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKHIpCiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShjKQotICAgIAorCiAgICAgQ0FMTF9TVUJURVNUXzEyKChqYWNvYmlzdmRfdGhpbl9vcHRpb25zPE1hdHJpeDNmPigpKSk7CiAgICAgQ0FMTF9TVUJURVNUXzEzKChqYWNvYmlzdmRfZnVsbF9vcHRpb25zPE1hdHJpeDNmPigpKSk7CiAgICAgQ0FMTF9TVUJURVNUXzE0KChqYWNvYmlzdmRfdGhpbl9vcHRpb25zPE1hdHJpeDRkPigpKSk7CkBAIC0yMDEsMTYgKzIwMCwxNiBAQAogICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PihFSUdFTl9URVNUX01BWF9TSVpFIC8gNCwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDMpKSkpKTsKIAogICAvLyB0ZXN0IG1hdHJpeGJhc2UgbWV0aG9kCi0gIENBTExfU1VCVEVTVF81MSgoIGphY29iaXN2ZF9tZXRob2Q8TWF0cml4MmNkPigpICkpOwotICBDQUxMX1NVQlRFU1RfNTIoKCBqYWNvYmlzdmRfbWV0aG9kPE1hdHJpeDNmPigpICkpOworICBDQUxMX1NVQlRFU1RfNTEoKGphY29iaXN2ZF9tZXRob2Q8TWF0cml4MmNkPigpKSk7CisgIENBTExfU1VCVEVTVF81MigoamFjb2Jpc3ZkX21ldGhvZDxNYXRyaXgzZj4oKSkpOwogCiAgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycwotICBDQUxMX1NVQlRFU1RfNTMoIEphY29iaVNWRDxNYXRyaXhYZj4oMTAsMTApICk7CisgIENBTExfU1VCVEVTVF81MyhKYWNvYmlTVkQ8TWF0cml4WGY+KDEwLCAxMCkpOwogCiAgIC8vIENoZWNrIHRoYXQgcHJlYWxsb2NhdGlvbiBhdm9pZHMgc3Vic2VxdWVudCBtYWxsb2NzCi0gIENBTExfU1VCVEVTVF81NCggc3ZkX3ByZWFsbG9jYXRlPHZvaWQ+KCkgKTsKKyAgQ0FMTF9TVUJURVNUXzU0KHN2ZF9wcmVhbGxvY2F0ZTx2b2lkPigpKTsKIAotICBDQUxMX1NVQlRFU1RfNTUoIHN2ZF91bmRlcm92ZXJmbG93PHZvaWQ+KCkgKTsKKyAgQ0FMTF9TVUJURVNUXzU1KHN2ZF91bmRlcm92ZXJmbG93PHZvaWQ+KCkpOwogCiAgIG1zdmNfd29ya2Fyb3VuZCgpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9rbHVfc3VwcG9ydC5jcHAgYi90ZXN0L2tsdV9zdXBwb3J0LmNwcAppbmRleCBmODA2YWQ1Li5iNGYxZjQzIDEwMDY0NAotLS0gYS90ZXN0L2tsdV9zdXBwb3J0LmNwcAorKysgYi90ZXN0L2tsdV9zdXBwb3J0LmNwcApAQCAtMTIsMjEgKzEyLDE5IEBACiAKICNpbmNsdWRlIDxFaWdlbi9LTFVTdXBwb3J0PgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHRlc3Rfa2x1X3N1cHBvcnRfVCgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdF9rbHVfc3VwcG9ydF9UKCkgewogICBLTFU8U3BhcnNlTWF0cml4PFQsIENvbE1ham9yPiA+IGtsdV9jb2xtYWpvcjsKICAgS0xVPFNwYXJzZU1hdHJpeDxULCBSb3dNYWpvcj4gPiBrbHVfcm93bWFqb3I7Ci0gIAorCiAgIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhrbHVfY29sbWFqb3IpOwogICBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoa2x1X3Jvd21ham9yKTsKLSAgCi0gIC8vY2hlY2tfc3BhcnNlX3NxdWFyZV9kZXRlcm1pbmFudCh1bWZwYWNrX2NvbG1ham9yKTsKLSAgLy9jaGVja19zcGFyc2Vfc3F1YXJlX2RldGVybWluYW50KHVtZnBhY2tfcm93bWFqb3IpOworCisgIC8vIGNoZWNrX3NwYXJzZV9zcXVhcmVfZGV0ZXJtaW5hbnQodW1mcGFja19jb2xtYWpvcik7CisgIC8vIGNoZWNrX3NwYXJzZV9zcXVhcmVfZGV0ZXJtaW5hbnQodW1mcGFja19yb3dtYWpvcik7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChrbHVfc3VwcG9ydCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChrbHVfc3VwcG9ydCkgewogICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2tsdV9zdXBwb3J0X1Q8ZG91YmxlPigpKTsKICAgQ0FMTF9TVUJURVNUXzIodGVzdF9rbHVfc3VwcG9ydF9UPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CiB9Ci0KZGlmZiAtLWdpdCBhL3Rlc3QvbGluZWFyc3RydWN0dXJlLmNwcCBiL3Rlc3QvbGluZWFyc3RydWN0dXJlLmNwcAppbmRleCA0NmVlNTE2Li5lNTY4NGE1IDEwMDY0NAotLS0gYS90ZXN0L2xpbmVhcnN0cnVjdHVyZS5jcHAKKysrIGIvdGVzdC9saW5lYXJzdHJ1Y3R1cmUuY3BwCkBAIC05LDE1ICs5LDE2IEBACiAvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KIAogc3RhdGljIGJvb2wgZ19jYWxsZWQ7Ci0jZGVmaW5lIEVJR0VOX1NDQUxBUl9CSU5BUllfT1BfUExVR0lOIHsgZ19jYWxsZWQgfD0gKCFpbnRlcm5hbDo6aXNfc2FtZTxMaHNTY2FsYXIsUmhzU2NhbGFyPjo6dmFsdWUpOyB9CisjZGVmaW5lIEVJR0VOX1NDQUxBUl9CSU5BUllfT1BfUExVR0lOIFwKKyAgeyBnX2NhbGxlZCB8PSAoIWludGVybmFsOjppc19zYW1lPExoc1NjYWxhciwgUmhzU2NhbGFyPjo6dmFsdWUpOyB9CiAKICNpbmNsdWRlICJtYWluLmgiCiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgbGluZWFyU3RydWN0dXJlKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgbGluZWFyU3RydWN0dXJlKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgdXNpbmcgc3RkOjphYnM7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKLSAgICAgQ3dpc2VVbmFyeU9wLmgsIEN3aXNlQmluYXJ5T3AuaCwgU2VsZkN3aXNlQmluYXJ5T3AuaCAKKyAgICAgQ3dpc2VVbmFyeU9wLmgsIEN3aXNlQmluYXJ5T3AuaCwgU2VsZkN3aXNlQmluYXJ5T3AuaAogICAqLwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOwpAQCAtMjcsMTIxICsyOCwxMjQgQEAKIAogICAvLyB0aGlzIHRlc3QgcmVsaWVzIGEgbG90IG9uIFJhbmRvbS5oLCBhbmQgdGhlcmUncyBub3QgbXVjaCBtb3JlIHRoYXQgd2UgY2FuIGRvCiAgIC8vIHRvIHRlc3QgaXQsIGhlbmNlIEkgY29uc2lkZXIgdGhhdCB3ZSB3aWxsIGhhdmUgdGVzdGVkIFJhbmRvbS5oCi0gIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTMocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKTsKIAogICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKLSAgd2hpbGUgKGFicyhzMSk8UmVhbFNjYWxhcigxZS0zKSkgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgd2hpbGUgKGFicyhzMSkgPCBSZWFsU2NhbGFyKDFlLTMpKSBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwogCi0gIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpLAotICAgICAgICBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAxKSwgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAxKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKC0oLW0xKSwgICAgICAgICAgICAgICAgICBtMSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTErbTEsICAgICAgICAgICAgICAgICAgIDIqbTEpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xK20yLW0xLCAgICAgICAgICAgICAgICBtMik7Ci0gIFZFUklGWV9JU19BUFBST1goLW0yK20xK20yLCAgICAgICAgICAgICAgIG0xKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMSpzMSwgICAgICAgICAgICAgICAgICAgczEqbTEpOwotICBWRVJJRllfSVNfQVBQUk9YKChtMSttMikqczEsICAgICAgICAgICAgICBzMSptMStzMSptMik7Ci0gIFZFUklGWV9JU19BUFBST1goKC1tMSttMikqczEsICAgICAgICAgICAgIC1zMSptMStzMSptMik7Ci0gIG0zID0gbTI7IG0zICs9IG0xOwotICBWRVJJRllfSVNfQVBQUk9YKG0zLCAgICAgICAgICAgICAgICAgICAgICBtMSttMik7Ci0gIG0zID0gbTI7IG0zIC09IG0xOwotICBWRVJJRllfSVNfQVBQUk9YKG0zLCAgICAgICAgICAgICAgICAgICAgICBtMi1tMSk7Ci0gIG0zID0gbTI7IG0zICo9IHMxOwotICBWRVJJRllfSVNfQVBQUk9YKG0zLCAgICAgICAgICAgICAgICAgICAgICBzMSptMik7Ci0gIGlmKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKQotICB7Ci0gICAgbTMgPSBtMjsgbTMgLz0gczE7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtMywgICAgICAgICAgICAgICAgICAgIG0yL3MxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgtKC1tMSksIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSArIG0xLCAyICogbTEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xICsgbTIgLSBtMSwgbTIpOworICBWRVJJRllfSVNfQVBQUk9YKC1tMiArIG0xICsgbTIsIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSAqIHMxLCBzMSAqIG0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEgKyBtMikgKiBzMSwgczEgKiBtMSArIHMxICogbTIpOworICBWRVJJRllfSVNfQVBQUk9YKCgtbTEgKyBtMikgKiBzMSwgLXMxICogbTEgKyBzMSAqIG0yKTsKKyAgbTMgPSBtMjsKKyAgbTMgKz0gbTE7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xICsgbTIpOworICBtMyA9IG0yOworICBtMyAtPSBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTIgLSBtMSk7CisgIG0zID0gbTI7CisgIG0zICo9IHMxOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBzMSAqIG0yKTsKKyAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKSB7CisgICAgbTMgPSBtMjsKKyAgICBtMyAvPSBzMTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMiAvIHMxKTsKICAgfQogCiAgIC8vIGFnYWluLCB0ZXN0IG9wZXJhdG9yKCkgdG8gY2hlY2sgY29uc3QtcXVhbGlmaWNhdGlvbgotICBWRVJJRllfSVNfQVBQUk9YKCgtbTEpKHIsYyksIC0obTEocixjKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKChtMS1tMikocixjKSwgKG0xKHIsYykpLShtMihyLGMpKSk7Ci0gIFZFUklGWV9JU19BUFBST1goKG0xK20yKShyLGMpLCAobTEocixjKSkrKG0yKHIsYykpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgoczEqbTEpKHIsYyksIHMxKihtMShyLGMpKSk7Ci0gIFZFUklGWV9JU19BUFBST1goKG0xKnMxKShyLGMpLCAobTEocixjKSkqczEpOwotICBpZighTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcikKLSAgICBWRVJJRllfSVNfQVBQUk9YKChtMS9zMSkocixjKSwgKG0xKHIsYykpL3MxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgoLW0xKShyLCBjKSwgLShtMShyLCBjKSkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMSAtIG0yKShyLCBjKSwgKG0xKHIsIGMpKSAtIChtMihyLCBjKSkpOworICBWRVJJRllfSVNfQVBQUk9YKChtMSArIG0yKShyLCBjKSwgKG0xKHIsIGMpKSArIChtMihyLCBjKSkpOworICBWRVJJRllfSVNfQVBQUk9YKChzMSAqIG0xKShyLCBjKSwgczEgKiAobTEociwgYykpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEgKiBzMSkociwgYyksIChtMShyLCBjKSkgKiBzMSk7CisgIGlmICghTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcikgVkVSSUZZX0lTX0FQUFJPWCgobTEgLyBzMSkociwgYyksIChtMShyLCBjKSkgLyBzMSk7CiAKICAgLy8gdXNlIC5ibG9jayB0byBkaXNhYmxlIHZlY3Rvcml6YXRpb24gYW5kIGNvbXBhcmUgdG8gdGhlIHZlY3Rvcml6ZWQgdmVyc2lvbgotICBWRVJJRllfSVNfQVBQUk9YKG0xK20xLmJsb2NrKDAsMCxyb3dzLGNvbHMpLCBtMSttMSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2VQcm9kdWN0KG0xLmJsb2NrKDAsMCxyb3dzLGNvbHMpKSwgbTEuY3dpc2VQcm9kdWN0KG0xKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEgLSBtMS5ibG9jaygwLDAscm93cyxjb2xzKSwgbTEgLSBtMSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2soMCwwLHJvd3MsY29scykgKiBzMSwgbTEgKiBzMSk7CisgIFZFUklGWV9JU19BUFBST1gobTEgKyBtMS5ibG9jaygwLCAwLCByb3dzLCBjb2xzKSwgbTEgKyBtMSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2VQcm9kdWN0KG0xLmJsb2NrKDAsIDAsIHJvd3MsIGNvbHMpKSwgbTEuY3dpc2VQcm9kdWN0KG0xKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEgLSBtMS5ibG9jaygwLCAwLCByb3dzLCBjb2xzKSwgbTEgLSBtMSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2soMCwgMCwgcm93cywgY29scykgKiBzMSwgbTEgKiBzMSk7CiB9CiAKIC8vIE1ha2Ugc3VyZSB0aGF0IGNvbXBsZXggKiByZWFsIGFuZCByZWFsICogY29tcGxleCBhcmUgcHJvcGVybHkgb3B0aW1pemVkCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHJlYWxfY29tcGxleChEZW5zZUluZGV4IHJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgRGVuc2VJbmRleCBjb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcmVhbF9jb21wbGV4KERlbnNlSW5kZXggcm93cyA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBEZW5zZUluZGV4IGNvbHMgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSkgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOwotICAKKwogICBSZWFsU2NhbGFyIHMgPSBpbnRlcm5hbDo6cmFuZG9tPFJlYWxTY2FsYXI+KCk7CiAgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7Ci0gIAorCiAgIGdfY2FsbGVkID0gZmFsc2U7Ci0gIFZFUklGWV9JU19BUFBST1gocyptMSwgU2NhbGFyKHMpKm0xKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzICogbTEsIFNjYWxhcihzKSAqIG0xKTsKICAgVkVSSUZZKGdfY2FsbGVkICYmICJyZWFsICogbWF0cml4PGNvbXBsZXg+IG5vdCBwcm9wZXJseSBvcHRpbWl6ZWQiKTsKLSAgCisKICAgZ19jYWxsZWQgPSBmYWxzZTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMSpzLCBtMSpTY2FsYXIocykpOworICBWRVJJRllfSVNfQVBQUk9YKG0xICogcywgbTEgKiBTY2FsYXIocykpOwogICBWRVJJRlkoZ19jYWxsZWQgJiYgIm1hdHJpeDxjb21wbGV4PiAqIHJlYWwgbm90IHByb3Blcmx5IG9wdGltaXplZCIpOwotICAKKwogICBnX2NhbGxlZCA9IGZhbHNlOwotICBWRVJJRllfSVNfQVBQUk9YKG0xL3MsIG0xL1NjYWxhcihzKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEgLyBzLCBtMSAvIFNjYWxhcihzKSk7CiAgIFZFUklGWShnX2NhbGxlZCAmJiAibWF0cml4PGNvbXBsZXg+IC8gcmVhbCBub3QgcHJvcGVybHkgb3B0aW1pemVkIik7CiAKICAgZ19jYWxsZWQgPSBmYWxzZTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzK20xLmFycmF5KCksIFNjYWxhcihzKSttMS5hcnJheSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzICsgbTEuYXJyYXkoKSwgU2NhbGFyKHMpICsgbTEuYXJyYXkoKSk7CiAgIFZFUklGWShnX2NhbGxlZCAmJiAicmVhbCArIG1hdHJpeDxjb21wbGV4PiBub3QgcHJvcGVybHkgb3B0aW1pemVkIik7CiAKICAgZ19jYWxsZWQgPSBmYWxzZTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS5hcnJheSgpK3MsIG0xLmFycmF5KCkrU2NhbGFyKHMpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5hcnJheSgpICsgcywgbTEuYXJyYXkoKSArIFNjYWxhcihzKSk7CiAgIFZFUklGWShnX2NhbGxlZCAmJiAibWF0cml4PGNvbXBsZXg+ICsgcmVhbCBub3QgcHJvcGVybHkgb3B0aW1pemVkIik7CiAKICAgZ19jYWxsZWQgPSBmYWxzZTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzLW0xLmFycmF5KCksIFNjYWxhcihzKS1tMS5hcnJheSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzIC0gbTEuYXJyYXkoKSwgU2NhbGFyKHMpIC0gbTEuYXJyYXkoKSk7CiAgIFZFUklGWShnX2NhbGxlZCAmJiAicmVhbCAtIG1hdHJpeDxjb21wbGV4PiBub3QgcHJvcGVybHkgb3B0aW1pemVkIik7CiAKICAgZ19jYWxsZWQgPSBmYWxzZTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS5hcnJheSgpLXMsIG0xLmFycmF5KCktU2NhbGFyKHMpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5hcnJheSgpIC0gcywgbTEuYXJyYXkoKSAtIFNjYWxhcihzKSk7CiAgIFZFUklGWShnX2NhbGxlZCAmJiAibWF0cml4PGNvbXBsZXg+IC0gcmVhbCBub3QgcHJvcGVybHkgb3B0aW1pemVkIik7CiB9CiAKLXRlbXBsYXRlPGludD4KLXZvaWQgbGluZWFyc3RydWN0dXJlX292ZXJmbG93KCkKLXsKK3RlbXBsYXRlIDxpbnQ+Cit2b2lkIGxpbmVhcnN0cnVjdHVyZV9vdmVyZmxvdygpIHsKICAgLy8gbWFrZSBzdXJlIHRoYXQgLz1zY2FsYXIgYW5kIC9zY2FsYXIgZG8gbm90IG92ZXJmbG93CiAgIC8vIHJhdGlvbmFsOiAxLjAvNC45NGUtMzIwIG92ZXJmbG93LCBidXQgbS80Ljk0ZS0zMjAgc2hvdWxkIG5vdAogICBNYXRyaXg0ZCBtMiwgbTM7Ci0gIG0zID0gbTIgPSAgTWF0cml4NGQ6OlJhbmRvbSgpKjFlLTIwOworICBtMyA9IG0yID0gTWF0cml4NGQ6OlJhbmRvbSgpICogMWUtMjA7CiAgIG0yID0gbTIgLyA0LjllLTMyMDsKICAgVkVSSUZZX0lTX0FQUFJPWChtMi5jd2lzZVF1b3RpZW50KG0yKSwgTWF0cml4NGQ6Ok9uZXMoKSk7CiAgIG0zIC89IDQuOWUtMzIwOwogICBWRVJJRllfSVNfQVBQUk9YKG0zLmN3aXNlUXVvdGllbnQobTMpLCBNYXRyaXg0ZDo6T25lcygpKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGxpbmVhcnN0cnVjdHVyZSkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChsaW5lYXJzdHJ1Y3R1cmUpIHsKICAgZ19jYWxsZWQgPSB0cnVlOwotICBWRVJJRlkoZ19jYWxsZWQpOyAvLyBhdm9pZCBgdW5uZWVkZWQtaW50ZXJuYWwtZGVjbGFyYXRpb25gIHdhcm5pbmcuCi0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGxpbmVhclN0cnVjdHVyZShNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGxpbmVhclN0cnVjdHVyZShNYXRyaXgyZigpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBsaW5lYXJTdHJ1Y3R1cmUoVmVjdG9yM2QoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggbGluZWFyU3RydWN0dXJlKE1hdHJpeDRkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIGxpbmVhclN0cnVjdHVyZShNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoIGxpbmVhclN0cnVjdHVyZShNYXRyaXhYZiAoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNyggbGluZWFyU3RydWN0dXJlKE1hdHJpeFhpIChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF84KCBsaW5lYXJTdHJ1Y3R1cmUoTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpKSApOwotICAgIENBTExfU1VCVEVTVF85KCBsaW5lYXJTdHJ1Y3R1cmUoQXJyYXlYWGYgKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEwKCBsaW5lYXJTdHJ1Y3R1cmUoQXJyYXlYWGNmIChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIAotICAgIENBTExfU1VCVEVTVF8xMSggcmVhbF9jb21wbGV4PE1hdHJpeDRjZD4oKSApOwotICAgIENBTExfU1VCVEVTVF8xMSggcmVhbF9jb21wbGV4PE1hdHJpeFhjZj4oMTAsMTApICk7Ci0gICAgQ0FMTF9TVUJURVNUXzExKCByZWFsX2NvbXBsZXg8QXJyYXlYWGNmPigxMCwxMCkgKTsKKyAgVkVSSUZZKGdfY2FsbGVkKTsgIC8vIGF2b2lkIGB1bm5lZWRlZC1pbnRlcm5hbC1kZWNsYXJhdGlvbmAgd2FybmluZy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEobGluZWFyU3RydWN0dXJlKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKGxpbmVhclN0cnVjdHVyZShNYXRyaXgyZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMobGluZWFyU3RydWN0dXJlKFZlY3RvcjNkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChsaW5lYXJTdHJ1Y3R1cmUoTWF0cml4NGQoKSkpOworICAgIENBTExfU1VCVEVTVF81KGxpbmVhclN0cnVjdHVyZShNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMikpKSk7CisgICAgQ0FMTF9TVUJURVNUXzYobGluZWFyU3RydWN0dXJlKAorICAgICAgICBNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNyhsaW5lYXJTdHJ1Y3R1cmUoCisgICAgICAgIE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF84KGxpbmVhclN0cnVjdHVyZShNYXRyaXhYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMikpKSk7CisgICAgQ0FMTF9TVUJURVNUXzkobGluZWFyU3RydWN0dXJlKAorICAgICAgICBBcnJheVhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTAobGluZWFyU3RydWN0dXJlKAorICAgICAgICBBcnJheVhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisKKyAgICBDQUxMX1NVQlRFU1RfMTEocmVhbF9jb21wbGV4PE1hdHJpeDRjZD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzExKHJlYWxfY29tcGxleDxNYXRyaXhYY2Y+KDEwLCAxMCkpOworICAgIENBTExfU1VCVEVTVF8xMShyZWFsX2NvbXBsZXg8QXJyYXlYWGNmPigxMCwgMTApKTsKICAgfQotICBDQUxMX1NVQlRFU1RfNCggbGluZWFyc3RydWN0dXJlX292ZXJmbG93PDA+KCkgKTsKKyAgQ0FMTF9TVUJURVNUXzQobGluZWFyc3RydWN0dXJlX292ZXJmbG93PDA+KCkpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9sc2NnLmNwcCBiL3Rlc3QvbHNjZy5jcHAKaW5kZXggZmViMjM0Ny4uMWM5NGUwYSAxMDA2NDQKLS0tIGEvdGVzdC9sc2NnLmNwcAorKysgYi90ZXN0L2xzY2cuY3BwCkBAIC0xMCwyOCArMTAsMjcgQEAKICNpbmNsdWRlICJzcGFyc2Vfc29sdmVyLmgiCiAjaW5jbHVkZSA8RWlnZW4vSXRlcmF0aXZlTGluZWFyU29sdmVycz4KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0X2xzY2dfVCgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdF9sc2NnX1QoKSB7CiAgIExlYXN0U3F1YXJlc0Nvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxUPiA+IGxzY2dfY29sbWFqb3JfZGlhZzsKICAgTGVhc3RTcXVhcmVzQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4PFQ+LCBJZGVudGl0eVByZWNvbmRpdGlvbmVyPiBsc2NnX2NvbG1ham9yX0k7Ci0gIExlYXN0U3F1YXJlc0Nvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxULFJvd01ham9yPiA+IGxzY2dfcm93bWFqb3JfZGlhZzsKLSAgTGVhc3RTcXVhcmVzQ29uanVnYXRlR3JhZGllbnQ8U3BhcnNlTWF0cml4PFQsUm93TWFqb3I+LCBJZGVudGl0eVByZWNvbmRpdGlvbmVyPiBsc2NnX3Jvd21ham9yX0k7CisgIExlYXN0U3F1YXJlc0Nvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxULCBSb3dNYWpvcj4gPiBsc2NnX3Jvd21ham9yX2RpYWc7CisgIExlYXN0U3F1YXJlc0Nvbmp1Z2F0ZUdyYWRpZW50PFNwYXJzZU1hdHJpeDxULCBSb3dNYWpvcj4sIElkZW50aXR5UHJlY29uZGl0aW9uZXI+IGxzY2dfcm93bWFqb3JfSTsKIAotICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhsc2NnX2NvbG1ham9yX2RpYWcpICApOwotICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhsc2NnX2NvbG1ham9yX0kpICAgICApOwotICAKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2VfbGVhc3RzcXVhcmVfc29sdmluZyhsc2NnX2NvbG1ham9yX2RpYWcpICApOwotICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9sZWFzdHNxdWFyZV9zb2x2aW5nKGxzY2dfY29sbWFqb3JfSSkgICAgICk7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcobHNjZ19jb2xtYWpvcl9kaWFnKSk7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcobHNjZ19jb2xtYWpvcl9JKSk7CiAKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcobHNjZ19yb3dtYWpvcl9kaWFnKSAgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcobHNjZ19yb3dtYWpvcl9JKSAgICAgKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9sZWFzdHNxdWFyZV9zb2x2aW5nKGxzY2dfY29sbWFqb3JfZGlhZykpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX2xlYXN0c3F1YXJlX3NvbHZpbmcobHNjZ19jb2xtYWpvcl9JKSk7CiAKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2VfbGVhc3RzcXVhcmVfc29sdmluZyhsc2NnX3Jvd21ham9yX2RpYWcpICApOwotICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9sZWFzdHNxdWFyZV9zb2x2aW5nKGxzY2dfcm93bWFqb3JfSSkgICAgICk7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcobHNjZ19yb3dtYWpvcl9kaWFnKSk7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcobHNjZ19yb3dtYWpvcl9JKSk7CisKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9sZWFzdHNxdWFyZV9zb2x2aW5nKGxzY2dfcm93bWFqb3JfZGlhZykpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX2xlYXN0c3F1YXJlX3NvbHZpbmcobHNjZ19yb3dtYWpvcl9JKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChsc2NnKQoteworRUlHRU5fREVDTEFSRV9URVNUKGxzY2cpIHsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9sc2NnX1Q8ZG91YmxlPigpKTsKICAgQ0FMTF9TVUJURVNUXzIodGVzdF9sc2NnX1Q8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvbHUuY3BwIGIvdGVzdC9sdS5jcHAKaW5kZXggMzM2OWY4Mi4uMTc5MmMyYiAxMDA2NDQKLS0tIGEvdGVzdC9sdS5jcHAKKysrIGIvdGVzdC9sdS5jcHAKQEAgLTEyLDU1ICsxMiw0MyBAQAogI2luY2x1ZGUgInNvbHZlcmJhc2UuaCIKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgbWF0cml4X2wxX25vcm0oY29uc3QgTWF0cml4VHlwZSYgbSkgewogICByZXR1cm4gbS5jd2lzZUFicygpLmNvbHdpc2UoKS5zdW0oKS5tYXhDb2VmZigpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGx1X25vbl9pbnZlcnRpYmxlKCkKLXsKLQordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGx1X25vbl9pbnZlcnRpYmxlKCkgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKICAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgogICAgICBMVS5oCiAgICovCiAgIEluZGV4IHJvd3MsIGNvbHMsIGNvbHMyOwotICBpZihNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKLSAgewotICAgIHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLEVJR0VOX1RFU1RfTUFYX1NJWkUpOwotICB9Ci0gIGVsc2UKLSAgeworICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykgeworICAgIHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgfSBlbHNlIHsKICAgICByb3dzID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU7CiAgIH0KLSAgaWYoTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCi0gIHsKLSAgICBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMixFSUdFTl9URVNUX01BWF9TSVpFKTsKLSAgICBjb2xzMiA9IGludGVybmFsOjpyYW5kb208aW50PigyLEVJR0VOX1RFU1RfTUFYX1NJWkUpOwotICB9Ci0gIGVsc2UKLSAgeworICBpZiAoTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykgeworICAgIGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgICBjb2xzMiA9IGludGVybmFsOjpyYW5kb208aW50PigyLCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgfSBlbHNlIHsKICAgICBjb2xzMiA9IGNvbHMgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZTsKICAgfQogCi0gIGVudW0gewotICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCi0gICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZQotICB9OworICBlbnVtIHsgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSB9OwogICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjprZXJuZWxfcmV0dmFsX2Jhc2U8RnVsbFBpdkxVPE1hdHJpeFR5cGU+ID46OlJldHVyblR5cGUgS2VybmVsTWF0cml4VHlwZTsKICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6aW1hZ2VfcmV0dmFsX2Jhc2U8RnVsbFBpdkxVPE1hdHJpeFR5cGU+ID46OlJldHVyblR5cGUgSW1hZ2VNYXRyaXhUeXBlOwotICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZT4KLSAgICAgICAgICBDTWF0cml4VHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZSwgUm93c0F0Q29tcGlsZVRpbWU+Ci0gICAgICAgICAgUk1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lPiBDTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZSwgUm93c0F0Q29tcGlsZVRpbWU+IFJNYXRyaXhUeXBlOwogCi0gIEluZGV4IHJhbmsgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAoc3RkOjptaW4pKHJvd3MsIGNvbHMpLTEpOworICBJbmRleCByYW5rID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgKHN0ZDo6bWluKShyb3dzLCBjb2xzKSAtIDEpOwogCiAgIC8vIFRoZSBpbWFnZSBvZiB0aGUgemVybyBtYXRyaXggc2hvdWxkIGNvbnNpc3Qgb2YgYSBzaW5nbGUgKHplcm8pIGNvbHVtbiB2ZWN0b3IKLSAgVkVSSUZZKChNYXRyaXhUeXBlOjpaZXJvKHJvd3MsY29scykuZnVsbFBpdkx1KCkuaW1hZ2UoTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpKS5jb2xzKCkgPT0gMSkpOworICBWRVJJRlkoKE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scykuZnVsbFBpdkx1KCkuaW1hZ2UoTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKSkuY29scygpID09IDEpKTsKIAogICAvLyBUaGUga2VybmVsIG9mIHRoZSB6ZXJvIG1hdHJpeCBpcyB0aGUgZW50aXJlIHNwYWNlLCBhbmQgdGh1cyBpcyBhbiBpbnZlcnRpYmxlIG1hdHJpeCBvZiBkaW1lbnNpb25zIGNvbHMuCi0gIEtlcm5lbE1hdHJpeFR5cGUga2VybmVsID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpLmZ1bGxQaXZMdSgpLmtlcm5lbCgpOworICBLZXJuZWxNYXRyaXhUeXBlIGtlcm5lbCA9IE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scykuZnVsbFBpdkx1KCkua2VybmVsKCk7CiAgIFZFUklGWSgoa2VybmVsLmZ1bGxQaXZMdSgpLmlzSW52ZXJ0aWJsZSgpKSk7CiAKICAgTWF0cml4VHlwZSBtMShyb3dzLCBjb2xzKSwgbTMocm93cywgY29sczIpOwpAQCAtNzUsMTMgKzYzLDEzIEBACiAgIGx1LnNldFRocmVzaG9sZChSZWFsU2NhbGFyKDAuMDEpKTsKICAgbHUuY29tcHV0ZShtMSk7CiAKLSAgTWF0cml4VHlwZSB1KHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgdShyb3dzLCBjb2xzKTsKICAgdSA9IGx1Lm1hdHJpeExVKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7Ci0gIFJNYXRyaXhUeXBlIGwgPSBSTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cyxyb3dzKTsKLSAgbC5ibG9jaygwLDAscm93cywoc3RkOjptaW4pKHJvd3MsY29scykpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkKLSAgICA9IGx1Lm1hdHJpeExVKCkuYmxvY2soMCwwLHJvd3MsKHN0ZDo6bWluKShyb3dzLGNvbHMpKTsKKyAgUk1hdHJpeFR5cGUgbCA9IFJNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCByb3dzKTsKKyAgbC5ibG9jaygwLCAwLCByb3dzLCAoc3RkOjptaW4pKHJvd3MsIGNvbHMpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseUxvd2VyPigpID0KKyAgICAgIGx1Lm1hdHJpeExVKCkuYmxvY2soMCwgMCwgcm93cywgKHN0ZDo6bWluKShyb3dzLCBjb2xzKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChsdS5wZXJtdXRhdGlvblAoKSAqIG0xICogbHUucGVybXV0YXRpb25RKCksIGwqdSk7CisgIFZFUklGWV9JU19BUFBST1gobHUucGVybXV0YXRpb25QKCkgKiBtMSAqIGx1LnBlcm11dGF0aW9uUSgpLCBsICogdSk7CiAKICAgS2VybmVsTWF0cml4VHlwZSBtMWtlcm5lbCA9IGx1Lmtlcm5lbCgpOwogICBJbWFnZU1hdHJpeFR5cGUgbTFpbWFnZSA9IGx1LmltYWdlKG0xKTsKQEAgLTk4LDM1ICs4NiwzNCBAQAogCiAgIGNoZWNrX3NvbHZlcmJhc2U8Q01hdHJpeFR5cGUsIE1hdHJpeFR5cGU+KG0xLCBsdSwgcm93cywgY29scywgY29sczIpOwogCi0gIG0yID0gQ01hdHJpeFR5cGU6OlJhbmRvbShjb2xzLGNvbHMyKTsKLSAgbTMgPSBtMSptMjsKLSAgbTIgPSBDTWF0cml4VHlwZTo6UmFuZG9tKGNvbHMsY29sczIpOworICBtMiA9IENNYXRyaXhUeXBlOjpSYW5kb20oY29scywgY29sczIpOworICBtMyA9IG0xICogbTI7CisgIG0yID0gQ01hdHJpeFR5cGU6OlJhbmRvbShjb2xzLCBjb2xzMik7CiAgIC8vIHRlc3QgdGhhdCB0aGUgY29kZSwgd2hpY2ggZG9lcyByZXNpemUoKSwgbWF5IGJlIGFwcGxpZWQgdG8gYW4geHByCi0gIG0yLmJsb2NrKDAsMCxtMi5yb3dzKCksbTIuY29scygpKSA9IGx1LnNvbHZlKG0zKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEqbTIpOworICBtMi5ibG9jaygwLCAwLCBtMi5yb3dzKCksIG0yLmNvbHMoKSkgPSBsdS5zb2x2ZShtMyk7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xICogbTIpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGx1X2ludmVydGlibGUoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGx1X2ludmVydGlibGUoKSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgRnVsbFBpdkxVLmgKICAgKi8KICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOwogICBJbmRleCBzaXplID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU7Ci0gIGlmKCBzaXplPT1EeW5hbWljKQotICAgIHNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICBpZiAoc2l6ZSA9PSBEeW5hbWljKSBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSk7CiAKICAgTWF0cml4VHlwZSBtMShzaXplLCBzaXplKSwgbTIoc2l6ZSwgc2l6ZSksIG0zKHNpemUsIHNpemUpOwogICBGdWxsUGl2TFU8TWF0cml4VHlwZT4gbHU7CiAgIGx1LnNldFRocmVzaG9sZChSZWFsU2NhbGFyKDAuMDEpKTsKICAgZG8gewotICAgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisgICAgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CiAgICAgbHUuY29tcHV0ZShtMSk7Ci0gIH0gd2hpbGUoIWx1LmlzSW52ZXJ0aWJsZSgpKTsKKyAgfSB3aGlsZSAoIWx1LmlzSW52ZXJ0aWJsZSgpKTsKIAogICBWRVJJRllfSVNfQVBQUk9YKG0xLCBsdS5yZWNvbnN0cnVjdGVkTWF0cml4KCkpOwogICBWRVJJRlkoMCA9PSBsdS5kaW1lbnNpb25PZktlcm5lbCgpKTsKLSAgVkVSSUZZKGx1Lmtlcm5lbCgpLmNvbHMoKSA9PSAxKTsgLy8gdGhlIGtlcm5lbCgpIHNob3VsZCBjb25zaXN0IG9mIGEgc2luZ2xlICh6ZXJvKSBjb2x1bW4gdmVjdG9yCisgIFZFUklGWShsdS5rZXJuZWwoKS5jb2xzKCkgPT0gMSk7ICAvLyB0aGUga2VybmVsKCkgc2hvdWxkIGNvbnNpc3Qgb2YgYSBzaW5nbGUgKHplcm8pIGNvbHVtbiB2ZWN0b3IKICAgVkVSSUZZKHNpemUgPT0gbHUucmFuaygpKTsKICAgVkVSSUZZKGx1LmlzSW5qZWN0aXZlKCkpOwogICBWRVJJRlkobHUuaXNTdXJqZWN0aXZlKCkpOwpAQCAtMTM2LDkgKzEyMyw5IEBACiAgIGNoZWNrX3NvbHZlcmJhc2U8TWF0cml4VHlwZSwgTWF0cml4VHlwZT4obTEsIGx1LCBzaXplLCBzaXplLCBzaXplKTsKIAogICBNYXRyaXhUeXBlIG0xX2ludmVyc2UgPSBsdS5pbnZlcnNlKCk7Ci0gIG0zID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisgIG0zID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOwogICBtMiA9IGx1LnNvbHZlKG0zKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTFfaW52ZXJzZSptMyk7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xX2ludmVyc2UgKiBtMyk7CiAKICAgUmVhbFNjYWxhciByY29uZCA9IChSZWFsU2NhbGFyKDEpIC8gbWF0cml4X2wxX25vcm0obTEpKSAvIG1hdHJpeF9sMV9ub3JtKG0xX2ludmVyc2UpOwogICBjb25zdCBSZWFsU2NhbGFyIHJjb25kX2VzdCA9IGx1LnJjb25kKCk7CkBAIC0xNDcsMTIgKzEzNCwxMiBAQAogICBWRVJJRlkocmNvbmRfZXN0ID4gcmNvbmQgLyAxMCAmJiByY29uZF9lc3QgPCByY29uZCAqIDEwKTsKIAogICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEJ1ZyAzMDIKLSAgTWF0cml4VHlwZSBtNCA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOwotICBWRVJJRllfSVNfQVBQUk9YKGx1LnNvbHZlKG0zKm00KSwgbHUuc29sdmUobTMpKm00KTsKKyAgTWF0cml4VHlwZSBtNCA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChsdS5zb2x2ZShtMyAqIG00KSwgbHUuc29sdmUobTMpICogbTQpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGx1X3BhcnRpYWxfcGl2KEluZGV4IHNpemUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBsdV9wYXJ0aWFsX3BpdihJbmRleCBzaXplID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUpIHsKICAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgogICAgICBQYXJ0aWFsUGl2TFUuaAogICAqLwpAQCAtMTY3LDkgKzE1NCw5IEBACiAgIGNoZWNrX3NvbHZlcmJhc2U8TWF0cml4VHlwZSwgTWF0cml4VHlwZT4obTEsIHBsdSwgc2l6ZSwgc2l6ZSwgc2l6ZSk7CiAKICAgTWF0cml4VHlwZSBtMV9pbnZlcnNlID0gcGx1LmludmVyc2UoKTsKLSAgbTMgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKTsKKyAgbTMgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CiAgIG0yID0gcGx1LnNvbHZlKG0zKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTFfaW52ZXJzZSptMyk7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0xX2ludmVyc2UgKiBtMyk7CiAKICAgUmVhbFNjYWxhciByY29uZCA9IChSZWFsU2NhbGFyKDEpIC8gbWF0cml4X2wxX25vcm0obTEpKSAvIG1hdHJpeF9sMV9ub3JtKG0xX2ludmVyc2UpOwogICBjb25zdCBSZWFsU2NhbGFyIHJjb25kX2VzdCA9IHBsdS5yY29uZCgpOwpAQCAtMTc3LDggKzE2NCw4IEBACiAgIFZFUklGWShyY29uZF9lc3QgPiByY29uZCAvIDEwICYmIHJjb25kX2VzdCA8IHJjb25kICogMTApOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGx1X3ZlcmlmeV9hc3NlcnQoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGx1X3ZlcmlmeV9hc3NlcnQoKSB7CiAgIE1hdHJpeFR5cGUgdG1wOwogCiAgIEZ1bGxQaXZMVTxNYXRyaXhUeXBlPiBsdTsKQEAgLTIwOCw0MiArMTk1LDQxIEBACiAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHBsdS5pbnZlcnNlKCkpCiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChsdSkKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggbHVfbm9uX2ludmVydGlibGU8TWF0cml4M2Y+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggbHVfaW52ZXJ0aWJsZTxNYXRyaXgzZj4oKSApOwotICAgIENBTExfU1VCVEVTVF8xKCBsdV92ZXJpZnlfYXNzZXJ0PE1hdHJpeDNmPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGx1X3BhcnRpYWxfcGl2PE1hdHJpeDNmPigpICk7CitFSUdFTl9ERUNMQVJFX1RFU1QobHUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEobHVfbm9uX2ludmVydGlibGU8TWF0cml4M2Y+KCkpOworICAgIENBTExfU1VCVEVTVF8xKGx1X2ludmVydGlibGU8TWF0cml4M2Y+KCkpOworICAgIENBTExfU1VCVEVTVF8xKGx1X3ZlcmlmeV9hc3NlcnQ8TWF0cml4M2Y+KCkpOworICAgIENBTExfU1VCVEVTVF8xKGx1X3BhcnRpYWxfcGl2PE1hdHJpeDNmPigpKTsKIAotICAgIENBTExfU1VCVEVTVF8yKCAobHVfbm9uX2ludmVydGlibGU8TWF0cml4PGRvdWJsZSwgNCwgNj4gPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCAobHVfdmVyaWZ5X2Fzc2VydDxNYXRyaXg8ZG91YmxlLCA0LCA2PiA+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGx1X3BhcnRpYWxfcGl2PE1hdHJpeDJkPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGx1X3BhcnRpYWxfcGl2PE1hdHJpeDRkPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIChsdV9wYXJ0aWFsX3BpdjxNYXRyaXg8ZG91YmxlLDYsNj4gPigpKSApOworICAgIENBTExfU1VCVEVTVF8yKChsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXg8ZG91YmxlLCA0LCA2PiA+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMigobHVfdmVyaWZ5X2Fzc2VydDxNYXRyaXg8ZG91YmxlLCA0LCA2PiA+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihsdV9wYXJ0aWFsX3BpdjxNYXRyaXgyZD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzIobHVfcGFydGlhbF9waXY8TWF0cml4NGQ+KCkpOworICAgIENBTExfU1VCVEVTVF8yKChsdV9wYXJ0aWFsX3BpdjxNYXRyaXg8ZG91YmxlLCA2LCA2PiA+KCkpKTsKIAotICAgIENBTExfU1VCVEVTVF8zKCBsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXhYZj4oKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBsdV9pbnZlcnRpYmxlPE1hdHJpeFhmPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGx1X3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGY+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXhYZj4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzMobHVfaW52ZXJ0aWJsZTxNYXRyaXhYZj4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzMobHVfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYZj4oKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfNCggbHVfbm9uX2ludmVydGlibGU8TWF0cml4WGQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggbHVfaW52ZXJ0aWJsZTxNYXRyaXhYZD4oKSApOwotICAgIENBTExfU1VCVEVTVF80KCBsdV9wYXJ0aWFsX3BpdjxNYXRyaXhYZD4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIGx1X3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNChsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXhYZD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzQobHVfaW52ZXJ0aWJsZTxNYXRyaXhYZD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzQobHVfcGFydGlhbF9waXY8TWF0cml4WGQ+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpOworICAgIENBTExfU1VCVEVTVF80KGx1X3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGQ+KCkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzUoIGx1X25vbl9pbnZlcnRpYmxlPE1hdHJpeFhjZj4oKSApOwotICAgIENBTExfU1VCVEVTVF81KCBsdV9pbnZlcnRpYmxlPE1hdHJpeFhjZj4oKSApOwotICAgIENBTExfU1VCVEVTVF81KCBsdV92ZXJpZnlfYXNzZXJ0PE1hdHJpeFhjZj4oKSApOworICAgIENBTExfU1VCVEVTVF81KGx1X25vbl9pbnZlcnRpYmxlPE1hdHJpeFhjZj4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzUobHVfaW52ZXJ0aWJsZTxNYXRyaXhYY2Y+KCkpOworICAgIENBTExfU1VCVEVTVF81KGx1X3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGNmPigpKTsKIAotICAgIENBTExfU1VCVEVTVF82KCBsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXhYY2Q+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggbHVfaW52ZXJ0aWJsZTxNYXRyaXhYY2Q+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggbHVfcGFydGlhbF9waXY8TWF0cml4WGNkPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggbHVfdmVyaWZ5X2Fzc2VydDxNYXRyaXhYY2Q+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNihsdV9ub25faW52ZXJ0aWJsZTxNYXRyaXhYY2Q+KCkpOworICAgIENBTExfU1VCVEVTVF82KGx1X2ludmVydGlibGU8TWF0cml4WGNkPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfNihsdV9wYXJ0aWFsX3BpdjxNYXRyaXhYY2Q+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpOworICAgIENBTExfU1VCVEVTVF82KGx1X3ZlcmlmeV9hc3NlcnQ8TWF0cml4WGNkPigpKTsKIAotICAgIENBTExfU1VCVEVTVF83KCggbHVfbm9uX2ludmVydGlibGU8TWF0cml4PGZsb2F0LER5bmFtaWMsMTY+ID4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNygobHVfbm9uX2ludmVydGlibGU8TWF0cml4PGZsb2F0LCBEeW5hbWljLCAxNj4gPigpKSk7CiAKICAgICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKLSAgICBDQUxMX1NVQlRFU1RfOSggUGFydGlhbFBpdkxVPE1hdHJpeFhmPigxMCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOSggRnVsbFBpdkxVPE1hdHJpeFhmPigxMCwgMjApOyApOworICAgIENBTExfU1VCVEVTVF85KFBhcnRpYWxQaXZMVTxNYXRyaXhYZj4oMTApKTsKKyAgICBDQUxMX1NVQlRFU1RfOShGdWxsUGl2TFU8TWF0cml4WGY+KDEwLCAyMCk7KTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9tYWluLmggYi90ZXN0L21haW4uaAppbmRleCBiZTZmZTE0Li43NzE3MjVmIDEwMDY0NAotLS0gYS90ZXN0L21haW4uaAorKysgYi90ZXN0L21haW4uaApAQCAtNjYsMjQgKzY2LDI0IEBACiAKIC8vIENvbmZpZ3VyZSBHUFUuCiAjaWYgZGVmaW5lZChFSUdFTl9VU0VfSElQKQotICAjaWYgZGVmaW5lZChfX0hJUENDX18pICYmICFkZWZpbmVkKEVJR0VOX05PX0hJUCkKLSAgICAjZGVmaW5lIEVJR0VOX0hJUENDIF9fSElQQ0NfXwotICAgICNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KLSAgICAjaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lX2FwaS5oPgotICAjZW5kaWYKKyNpZiBkZWZpbmVkKF9fSElQQ0NfXykgJiYgIWRlZmluZWQoRUlHRU5fTk9fSElQKQorI2RlZmluZSBFSUdFTl9ISVBDQyBfX0hJUENDX18KKyNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWVfYXBpLmg+CisjZW5kaWYKICNlbGlmIGRlZmluZWQoX19DVURBQ0NfXykgJiYgIWRlZmluZWQoRUlHRU5fTk9fQ1VEQSkKLSAgI2RlZmluZSBFSUdFTl9DVURBQ0MgX19DVURBQ0NfXwotICAjaW5jbHVkZSA8Y3VkYS5oPgotICAjaW5jbHVkZSA8Y3VkYV9ydW50aW1lLmg+Ci0gICNpbmNsdWRlIDxjdWRhX3J1bnRpbWVfYXBpLmg+Ci0gICNpZiBDVURBX1ZFUlNJT04gPj0gNzA1MAotICAgICNpbmNsdWRlIDxjdWRhX2ZwMTYuaD4KLSAgI2VuZGlmCisjZGVmaW5lIEVJR0VOX0NVREFDQyBfX0NVREFDQ19fCisjaW5jbHVkZSA8Y3VkYS5oPgorI2luY2x1ZGUgPGN1ZGFfcnVudGltZS5oPgorI2luY2x1ZGUgPGN1ZGFfcnVudGltZV9hcGkuaD4KKyNpZiBDVURBX1ZFUlNJT04gPj0gNzA1MAorI2luY2x1ZGUgPGN1ZGFfZnAxNi5oPgorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoRUlHRU5fQ1VEQUNDKSB8fCBkZWZpbmVkKEVJR0VOX0hJUENDKQotICAjZGVmaW5lIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQotICAjZGVmaW5lIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSBpbnQKKyNkZWZpbmUgRUlHRU5fVEVTVF9OT19MT05HRE9VQkxFCisjZGVmaW5lIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSBpbnQKICNlbmRpZgogCiAvLyBUbyB0ZXN0IHRoYXQgYWxsIGNhbGxzIGZyb20gRWlnZW4gY29kZSB0byBzdGQ6Om1pbigpIGFuZCBzdGQ6Om1heCgpIGFyZQpAQCAtOTEsMjcgKzkxLDI3IEBACiAvLyBhcmUgZGVmaW5lZCBoZXJlIGFuZCBhbnkgbm90LXBhcmVudGhlc2l6ZWQgbWluL21heCBjYWxsIHdpbGwgY2F1c2UgYQogLy8gY29tcGlsZXIgZXJyb3IuCiAjaWYgIWRlZmluZWQoX19ISVBDQ19fKSAmJiAhZGVmaW5lZChFSUdFTl9VU0VfU1lDTCkgJiYgIWRlZmluZWQoRUlHRU5fUE9DS0VURkZUX0RFRkFVTFQpCi0gIC8vCi0gIC8vIEhJUCBoZWFkZXIgZmlsZXMgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGZpbGVzCi0gIC8vICA8dGhyZWFkPgotICAvLyAgPHJlZ2V4PgotICAvLyAgPHVub3JkZXJlZF9tYXA+Ci0gIC8vIHdoaWNoIHNlZW0gdG8gY29udGFpbiBub3QtcGFyZW50aGVzaXplZCBjYWxscyB0byAibWF4Ii8ibWluIiwgdHJpZ2dlcmluZyB0aGUgZm9sbG93aW5nIGNoZWNrIGFuZCBjYXVzaW5nIHRoZSBjb21waWxlIHRvIGZhaWwKLSAgLy8KLSAgLy8gSW5jbHVkaW5nIHRob3NlIGhlYWRlciBmaWxlcyBiZWZvcmUgdGhlIGZvbGxvd2luZyBtYWNybyBkZWZpbml0aW9uIGZvciAibWluIiAvICJtYXgiLCBvbmx5IHBhcnRpYWxseSByZXNvbHZlcyB0aGUgaXNzdWUKLSAgLy8gVGhpcyBpcyBiZWNhdXNlIG90aGVyIEhJUCBoZWFkZXIgZmlsZXMgYWxzbyBkZWZpbmUgImlzbmFuIiAvICJpc2luZiIgLyAiaXNmaW5pdGUiIGZ1bmN0aW9ucywgd2hpY2ggYXJlIG5lZWRlZCBpbiBvdGhlcgotICAvLyBoZWFkZXJzLgotICAvLwotICAvLyBTbyBpbnN0ZWFkIGNob29zaW5nIHRvIHNpbXBseSBkaXNhYmxlIHRoaXMgY2hlY2sgZm9yIEhJUAotICAvLwotICAjZGVmaW5lIG1pbihBLEIpIHBsZWFzZV9wcm90ZWN0X3lvdXJfbWluX3dpdGhfcGFyZW50aGVzZXMKLSAgI2RlZmluZSBtYXgoQSxCKSBwbGVhc2VfcHJvdGVjdF95b3VyX21heF93aXRoX3BhcmVudGhlc2VzCi0gICNkZWZpbmUgaXNuYW4oWCkgcGxlYXNlX3Byb3RlY3RfeW91cl9pc25hbl93aXRoX3BhcmVudGhlc2VzCi0gICNkZWZpbmUgaXNpbmYoWCkgcGxlYXNlX3Byb3RlY3RfeW91cl9pc2luZl93aXRoX3BhcmVudGhlc2VzCi0gICNkZWZpbmUgaXNmaW5pdGUoWCkgcGxlYXNlX3Byb3RlY3RfeW91cl9pc2Zpbml0ZV93aXRoX3BhcmVudGhlc2VzCisvLworLy8gSElQIGhlYWRlciBmaWxlcyBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgZmlsZXMKKy8vICA8dGhyZWFkPgorLy8gIDxyZWdleD4KKy8vICA8dW5vcmRlcmVkX21hcD4KKy8vIHdoaWNoIHNlZW0gdG8gY29udGFpbiBub3QtcGFyZW50aGVzaXplZCBjYWxscyB0byAibWF4Ii8ibWluIiwgdHJpZ2dlcmluZyB0aGUgZm9sbG93aW5nIGNoZWNrIGFuZCBjYXVzaW5nIHRoZSBjb21waWxlCisvLyB0byBmYWlsCisvLworLy8gSW5jbHVkaW5nIHRob3NlIGhlYWRlciBmaWxlcyBiZWZvcmUgdGhlIGZvbGxvd2luZyBtYWNybyBkZWZpbml0aW9uIGZvciAibWluIiAvICJtYXgiLCBvbmx5IHBhcnRpYWxseSByZXNvbHZlcyB0aGUKKy8vIGlzc3VlIFRoaXMgaXMgYmVjYXVzZSBvdGhlciBISVAgaGVhZGVyIGZpbGVzIGFsc28gZGVmaW5lICJpc25hbiIgLyAiaXNpbmYiIC8gImlzZmluaXRlIiBmdW5jdGlvbnMsIHdoaWNoIGFyZSBuZWVkZWQKKy8vIGluIG90aGVyIGhlYWRlcnMuCisvLworLy8gU28gaW5zdGVhZCBjaG9vc2luZyB0byBzaW1wbHkgZGlzYWJsZSB0aGlzIGNoZWNrIGZvciBISVAKKy8vCisjZGVmaW5lIG1pbihBLCBCKSBwbGVhc2VfcHJvdGVjdF95b3VyX21pbl93aXRoX3BhcmVudGhlc2VzCisjZGVmaW5lIG1heChBLCBCKSBwbGVhc2VfcHJvdGVjdF95b3VyX21heF93aXRoX3BhcmVudGhlc2VzCisjZGVmaW5lIGlzbmFuKFgpIHBsZWFzZV9wcm90ZWN0X3lvdXJfaXNuYW5fd2l0aF9wYXJlbnRoZXNlcworI2RlZmluZSBpc2luZihYKSBwbGVhc2VfcHJvdGVjdF95b3VyX2lzaW5mX3dpdGhfcGFyZW50aGVzZXMKKyNkZWZpbmUgaXNmaW5pdGUoWCkgcGxlYXNlX3Byb3RlY3RfeW91cl9pc2Zpbml0ZV93aXRoX3BhcmVudGhlc2VzCiAjZW5kaWYKIAotCiAvLyB0ZXN0IHBvc3NpYmxlIGNvbmZsaWN0cwogc3RydWN0IHJlYWwge307CiBzdHJ1Y3QgaW1hZyB7fTsKQEAgLTEyMSwxMCArMTIxLDExIEBACiAjZW5kaWYKICNkZWZpbmUgTV9QSSBwbGVhc2VfdXNlX0VJR0VOX1BJX2luc3RlYWRfb2ZfTV9QSQogCi0jZGVmaW5lIEZPUkJJRERFTl9JREVOVElGSUVSICh0aGlzX2lkZW50aWZpZXJfaXNfZm9yYmlkZGVuX3RvX2F2b2lkX2NsYXNoZXMpIHRoaXNfaWRlbnRpZmllcl9pc19mb3JiaWRkZW5fdG9fYXZvaWRfY2xhc2hlcworI2RlZmluZSBGT1JCSURERU5fSURFTlRJRklFUiBcCisgICh0aGlzX2lkZW50aWZpZXJfaXNfZm9yYmlkZGVuX3RvX2F2b2lkX2NsYXNoZXMpIHRoaXNfaWRlbnRpZmllcl9pc19mb3JiaWRkZW5fdG9fYXZvaWRfY2xhc2hlcwogLy8gQjAgaXMgZGVmaW5lZCBpbiBQT1NJWCBoZWFkZXIgdGVybWlvcy5oCiAjZGVmaW5lIEIwIEZPUkJJRERFTl9JREVOVElGSUVSCi0jZGVmaW5lIEkgIEZPUkJJRERFTl9JREVOVElGSUVSCisjZGVmaW5lIEkgRk9SQklEREVOX0lERU5USUZJRVIKIAogLy8gX3JlcyBpcyBkZWZpbmVkIGJ5IHJlc29sdi5oCiAjZGVmaW5lIF9yZXMgRk9SQklEREVOX0lERU5USUZJRVIKQEAgLTE0NSwxNyArMTQ2LDIxIEBACiAKIGlubGluZSB2b2lkIG9uX3RlbXBvcmFyeV9jcmVhdGlvbihsb25nIGludCBzaXplKSB7CiAgIC8vIGhlcmUncyBhIGdyZWF0IHBsYWNlIHRvIHNldCBhIGJyZWFrcG9pbnQgd2hlbiBkZWJ1Z2dpbmcgZmFpbHVyZXMgaW4gdGhpcyB0ZXN0IQotICBpZihzaXplIT0wKSBuYl90ZW1wb3JhcmllcysrOwotICBpZihuYl90ZW1wb3Jhcmllc19vbl9hc3NlcnQ+MCkgYXNzZXJ0KG5iX3RlbXBvcmFyaWVzPG5iX3RlbXBvcmFyaWVzX29uX2Fzc2VydCk7CisgIGlmIChzaXplICE9IDApIG5iX3RlbXBvcmFyaWVzKys7CisgIGlmIChuYl90ZW1wb3Jhcmllc19vbl9hc3NlcnQgPiAwKSBhc3NlcnQobmJfdGVtcG9yYXJpZXMgPCBuYl90ZW1wb3Jhcmllc19vbl9hc3NlcnQpOwogfQogCi0jZGVmaW5lIEVJR0VOX0RFTlNFX1NUT1JBR0VfQ1RPUl9QTFVHSU4geyBvbl90ZW1wb3JhcnlfY3JlYXRpb24oc2l6ZSk7IH0KKyNkZWZpbmUgRUlHRU5fREVOU0VfU1RPUkFHRV9DVE9SX1BMVUdJTiBcCisgIHsgb25fdGVtcG9yYXJ5X2NyZWF0aW9uKHNpemUpOyB9CiAKLSNkZWZpbmUgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoWFBSLE4pIHtcCi0gICAgbmJfdGVtcG9yYXJpZXMgPSAwOyBcCi0gICAgWFBSOyBcCi0gICAgaWYobmJfdGVtcG9yYXJpZXMhPShOKSkgeyBzdGQ6OmNlcnIgPDwgIm5iX3RlbXBvcmFyaWVzID09ICIgPDwgbmJfdGVtcG9yYXJpZXMgPDwgIlxuIjsgfVwKLSAgICBWRVJJRlkoICgjWFBSKSAmJiBuYl90ZW1wb3Jhcmllcz09KE4pICk7IFwKKyNkZWZpbmUgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoWFBSLCBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5iX3RlbXBvcmFyaWVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBYUFI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKG5iX3RlbXBvcmFyaWVzICE9IChOKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RkOjpjZXJyIDw8ICJuYl90ZW1wb3JhcmllcyA9PSAiIDw8IG5iX3RlbXBvcmFyaWVzIDw8ICJcbiI7IFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVkVSSUZZKCgjWFBSKSAmJiBuYl90ZW1wb3JhcmllcyA9PSAoTikpOyAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CiAKICNlbmRpZgpAQCAtMTc4LDE5MyArMTgzLDE3OCBAQAogCiAjZGVmaW5lIERFRkFVTFRfUkVQRUFUIDEwCiAKLW5hbWVzcGFjZSBFaWdlbgotewotICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdfdGVzdF9zdGFjazsKLSAgLy8gbGV2ZWwgPT0gMCA8PT4gYWJvcnQgaWYgdGVzdCBmYWlsCi0gIC8vIGxldmVsID49IDEgPD0+IHdhcm5pbmcgbWVzc2FnZSB0byBzdGQ6OmNlcnIgaWYgdGVzdCBmYWlsCi0gIHN0YXRpYyBpbnQgZ190ZXN0X2xldmVsID0gMDsKLSAgc3RhdGljIGludCBnX3JlcGVhdCA9IDE7Ci0gIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ19zZWVkID0gMDsKLSAgc3RhdGljIGJvb2wgZ19oYXNfc2V0X3JlcGVhdCA9IGZhbHNlLCBnX2hhc19zZXRfc2VlZCA9IGZhbHNlOworbmFtZXNwYWNlIEVpZ2VuIHsKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ190ZXN0X3N0YWNrOworLy8gbGV2ZWwgPT0gMCA8PT4gYWJvcnQgaWYgdGVzdCBmYWlsCisvLyBsZXZlbCA+PSAxIDw9PiB3YXJuaW5nIG1lc3NhZ2UgdG8gc3RkOjpjZXJyIGlmIHRlc3QgZmFpbAorc3RhdGljIGludCBnX3Rlc3RfbGV2ZWwgPSAwOworc3RhdGljIGludCBnX3JlcGVhdCA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50IGdfc2VlZCA9IDA7CitzdGF0aWMgYm9vbCBnX2hhc19zZXRfcmVwZWF0ID0gZmFsc2UsIGdfaGFzX3NldF9zZWVkID0gZmFsc2U7CiAKLSAgY2xhc3MgRWlnZW5UZXN0Ci0gIHsKLSAgcHVibGljOgotICAgIEVpZ2VuVGVzdCgpIDogbV9mdW5jKDApIHt9Ci0gICAgRWlnZW5UZXN0KGNvbnN0IGNoYXIqIGFfbmFtZSwgdm9pZCAoKmZ1bmMpKHZvaWQpKQotICAgICAgOiBtX25hbWUoYV9uYW1lKSwgbV9mdW5jKGZ1bmMpCi0gICAgewotICAgICAgZ2V0X3JlZ2lzdGVyZWRfdGVzdHMoKS5wdXNoX2JhY2sodGhpcyk7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9Ci0gICAgdm9pZCBvcGVyYXRvcigpKCkgY29uc3QgeyBtX2Z1bmMoKTsgfQorY2xhc3MgRWlnZW5UZXN0IHsKKyBwdWJsaWM6CisgIEVpZ2VuVGVzdCgpIDogbV9mdW5jKDApIHt9CisgIEVpZ2VuVGVzdChjb25zdCBjaGFyKiBhX25hbWUsIHZvaWQgKCpmdW5jKSh2b2lkKSkgOiBtX25hbWUoYV9uYW1lKSwgbV9mdW5jKGZ1bmMpIHsKKyAgICBnZXRfcmVnaXN0ZXJlZF90ZXN0cygpLnB1c2hfYmFjayh0aGlzKTsKKyAgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorICB2b2lkIG9wZXJhdG9yKCkoKSBjb25zdCB7IG1fZnVuYygpOyB9CiAKLSAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8RWlnZW5UZXN0Kj4mIGFsbCgpIHsgcmV0dXJuIGdldF9yZWdpc3RlcmVkX3Rlc3RzKCk7IH0KLSAgcHJvdGVjdGVkOgotICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxFaWdlblRlc3QqPiYgZ2V0X3JlZ2lzdGVyZWRfdGVzdHMoKQotICAgIHsKLSAgICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxFaWdlblRlc3QqPiogbXNfcmVnaXN0ZXJlZF90ZXN0cyA9IG5ldyBzdGQ6OnZlY3RvcjxFaWdlblRlc3QqPigpOwotICAgICAgcmV0dXJuICptc19yZWdpc3RlcmVkX3Rlc3RzOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBtX25hbWU7Ci0gICAgdm9pZCAoKm1fZnVuYykodm9pZCk7Ci0gIH07CisgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxFaWdlblRlc3QqPiYgYWxsKCkgeyByZXR1cm4gZ2V0X3JlZ2lzdGVyZWRfdGVzdHMoKTsgfQogCi0gIC8vIERlY2xhcmUgYW5kIHJlZ2lzdGVyIGEgdGVzdCwgZS5nLjoKLSAgLy8gICAgRUlHRU5fREVDTEFSRV9URVNUKG15dGVzdCkgeyAuLi4gfQotICAvLyB3aWxsIGNyZWF0ZSBhIGZ1bmN0aW9uOgotICAvLyAgICB2b2lkIHRlc3RfbXl0ZXN0KCkgeyAuLi4gfQotICAvLyB0aGF0IHdpbGwgYmUgYXV0b21hdGljYWxseSBjYWxsZWQuCi0gICNkZWZpbmUgRUlHRU5fREVDTEFSRV9URVNUKFgpIFwKLSAgICB2b2lkIEVJR0VOX0NBVCh0ZXN0XyxYKSAoKTsgXAotICAgIHN0YXRpYyBFaWdlblRlc3QgRUlHRU5fQ0FUKHRlc3RfaGFuZGxlcl8sWCkgKEVJR0VOX01BS0VTVFJJTkcoWCksICYgRUlHRU5fQ0FUKHRlc3RfLFgpKTsgXAotICAgIHZvaWQgRUlHRU5fQ0FUKHRlc3RfLFgpICgpCi19CisgcHJvdGVjdGVkOgorICBzdGF0aWMgc3RkOjp2ZWN0b3I8RWlnZW5UZXN0Kj4mIGdldF9yZWdpc3RlcmVkX3Rlc3RzKCkgeworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxFaWdlblRlc3QqPiogbXNfcmVnaXN0ZXJlZF90ZXN0cyA9IG5ldyBzdGQ6OnZlY3RvcjxFaWdlblRlc3QqPigpOworICAgIHJldHVybiAqbXNfcmVnaXN0ZXJlZF90ZXN0czsKKyAgfQorICBzdGQ6OnN0cmluZyBtX25hbWU7CisgIHZvaWQgKCptX2Z1bmMpKHZvaWQpOworfTsKKworLy8gRGVjbGFyZSBhbmQgcmVnaXN0ZXIgYSB0ZXN0LCBlLmcuOgorLy8gICAgRUlHRU5fREVDTEFSRV9URVNUKG15dGVzdCkgeyAuLi4gfQorLy8gd2lsbCBjcmVhdGUgYSBmdW5jdGlvbjoKKy8vICAgIHZvaWQgdGVzdF9teXRlc3QoKSB7IC4uLiB9CisvLyB0aGF0IHdpbGwgYmUgYXV0b21hdGljYWxseSBjYWxsZWQuCisjZGVmaW5lIEVJR0VOX0RFQ0xBUkVfVEVTVChYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEVJR0VOX0NBVCh0ZXN0XywgWCkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIEVpZ2VuVGVzdCBFSUdFTl9DQVQodGVzdF9oYW5kbGVyXywgWCkoRUlHRU5fTUFLRVNUUklORyhYKSwgJkVJR0VOX0NBVCh0ZXN0XywgWCkpOyBcCisgIHZvaWQgRUlHRU5fQ0FUKHRlc3RfLCBYKSgpCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KIAogI2RlZmluZSBUUkFDSyBzdGQ6OmNlcnIgPDwgX19GSUxFX18gPDwgIiAiIDw8IF9fTElORV9fIDw8IHN0ZDo6ZW5kbAogLy8gI2RlZmluZSBUUkFDSyB3aGlsZSgpCiAKICNkZWZpbmUgRUlHRU5fREVGQVVMVF9JT19GT1JNQVQgSU9Gb3JtYXQoNCwgMCwgIiAgIiwgIlxuIiwgIiIsICIiLCAiIiwgIiIpCiAKLSNpZiAoZGVmaW5lZChfQ1BQVU5XSU5EKSB8fCBkZWZpbmVkKF9fRVhDRVBUSU9OUykpICYmICFkZWZpbmVkKF9fQ1VEQV9BUkNIX18pICYmICFkZWZpbmVkKF9fSElQX0RFVklDRV9DT01QSUxFX18pICYmICFkZWZpbmVkKF9fU1lDTF9ERVZJQ0VfT05MWV9fKQotICAjZGVmaW5lIEVJR0VOX0VYQ0VQVElPTlMKKyNpZiAoZGVmaW5lZChfQ1BQVU5XSU5EKSB8fCBkZWZpbmVkKF9fRVhDRVBUSU9OUykpICYmICFkZWZpbmVkKF9fQ1VEQV9BUkNIX18pICYmICFkZWZpbmVkKF9fSElQX0RFVklDRV9DT01QSUxFX18pICYmIFwKKyAgICAhZGVmaW5lZChfX1NZQ0xfREVWSUNFX09OTFlfXykKKyNkZWZpbmUgRUlHRU5fRVhDRVBUSU9OUwogI2VuZGlmCiAKICNpZm5kZWYgRUlHRU5fTk9fQVNTRVJUSU9OX0NIRUNLSU5HCiAKLSAgbmFtZXNwYWNlIEVpZ2VuCi0gIHsKLSAgICBzdGF0aWMgY29uc3QgYm9vbCBzaG91bGRfcmFpc2VfYW5fYXNzZXJ0ID0gZmFsc2U7CituYW1lc3BhY2UgRWlnZW4geworc3RhdGljIGNvbnN0IGJvb2wgc2hvdWxkX3JhaXNlX2FuX2Fzc2VydCA9IGZhbHNlOwogCi0gICAgLy8gVXNlZCB0byBhdm9pZCB0byByYWlzZSB0d28gZXhjZXB0aW9ucyBhdCBhIHRpbWUgaW4gd2hpY2gKLSAgICAvLyBjYXNlIHRoZSBleGNlcHRpb24gaXMgbm90IHByb3Blcmx5IGNhdWdodC4KLSAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiBhIHNlY29uZCBleGNlcHRpb25zIGlzIHRyaWdnZXJlZCBpbiBhIGRlc3RydWN0b3IuCi0gICAgc3RhdGljIGJvb2wgbm9fbW9yZV9hc3NlcnQgPSBmYWxzZTsKLSAgICBzdGF0aWMgYm9vbCByZXBvcnRfb25fY2Vycl9vbl9hc3NlcnRfZmFpbHVyZSA9IHRydWU7CisvLyBVc2VkIHRvIGF2b2lkIHRvIHJhaXNlIHR3byBleGNlcHRpb25zIGF0IGEgdGltZSBpbiB3aGljaAorLy8gY2FzZSB0aGUgZXhjZXB0aW9uIGlzIG5vdCBwcm9wZXJseSBjYXVnaHQuCisvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiBhIHNlY29uZCBleGNlcHRpb25zIGlzIHRyaWdnZXJlZCBpbiBhIGRlc3RydWN0b3IuCitzdGF0aWMgYm9vbCBub19tb3JlX2Fzc2VydCA9IGZhbHNlOworc3RhdGljIGJvb2wgcmVwb3J0X29uX2NlcnJfb25fYXNzZXJ0X2ZhaWx1cmUgPSB0cnVlOwogCi0gICAgc3RydWN0IGVpZ2VuX2Fzc2VydF9leGNlcHRpb24KLSAgICB7Ci0gICAgICBlaWdlbl9hc3NlcnRfZXhjZXB0aW9uKHZvaWQpIHt9Ci0gICAgICB+ZWlnZW5fYXNzZXJ0X2V4Y2VwdGlvbigpIHsgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7IH0KLSAgICB9Oworc3RydWN0IGVpZ2VuX2Fzc2VydF9leGNlcHRpb24geworICBlaWdlbl9hc3NlcnRfZXhjZXB0aW9uKHZvaWQpIHt9CisgIH5laWdlbl9hc3NlcnRfZXhjZXB0aW9uKCkgeyBFaWdlbjo6bm9fbW9yZV9hc3NlcnQgPSBmYWxzZTsgfQorfTsKIAotICAgIHN0cnVjdCBlaWdlbl9zdGF0aWNfYXNzZXJ0X2V4Y2VwdGlvbgotICAgIHsKLSAgICAgIGVpZ2VuX3N0YXRpY19hc3NlcnRfZXhjZXB0aW9uKHZvaWQpIHt9Ci0gICAgICB+ZWlnZW5fc3RhdGljX2Fzc2VydF9leGNlcHRpb24oKSB7IEVpZ2VuOjpub19tb3JlX2Fzc2VydCA9IGZhbHNlOyB9Ci0gICAgfTsKK3N0cnVjdCBlaWdlbl9zdGF0aWNfYXNzZXJ0X2V4Y2VwdGlvbiB7CisgIGVpZ2VuX3N0YXRpY19hc3NlcnRfZXhjZXB0aW9uKHZvaWQpIHt9CisgIH5laWdlbl9zdGF0aWNfYXNzZXJ0X2V4Y2VwdGlvbigpIHsgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7IH0KK307Cit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KKy8vIElmIEVJR0VOX0RFQlVHX0FTU0VSVFMgaXMgZGVmaW5lZCBhbmQgaWYgbm8gYXNzZXJ0aW9uIGlzIHRyaWdnZXJlZCB3aGlsZQorLy8gb25lIHNob3VsZCBoYXZlIGJlZW4sIHRoZW4gdGhlIGxpc3Qgb2YgZXhlY3V0ZWQgYXNzZXJ0aW9ucyBpcyBwcmludGVkIG91dC4KKy8vCisvLyBFSUdFTl9ERUJVR19BU1NFUlRTIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgYXMgaXQKKy8vIHNpZ25pZmljYW50bHkgaW5jcmVhc2VzIHRoZSBjb21waWxhdGlvbiB0aW1lCisvLyBhbmQgbWlnaHQgZXZlbiBpbnRyb2R1Y2Ugc2lkZSBlZmZlY3RzIHRoYXQgd291bGQgaGlkZQorLy8gc29tZSBtZW1vcnkgZXJyb3JzLgorI2lmZGVmIEVJR0VOX0RFQlVHX0FTU0VSVFMKKworbmFtZXNwYWNlIEVpZ2VuIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitzdGF0aWMgYm9vbCBwdXNoX2Fzc2VydCA9IGZhbHNlOworfQorc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlaWdlbl9hc3NlcnRfbGlzdDsKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgorI2RlZmluZSBlaWdlbl9hc3NlcnQoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoIShhKSkgJiYgKCFub19tb3JlX2Fzc2VydCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocmVwb3J0X29uX2NlcnJfb25fYXNzZXJ0X2ZhaWx1cmUpIHN0ZDo6Y2VyciA8PCAjYSA8PCAiICIgX19GSUxFX18gPDwgIigiIDw8IF9fTElORV9fIDw8ICIpXG4iOyAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpub19tb3JlX2Fzc2VydCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRUlHRU5fVEhST1dfWChFaWdlbjo6ZWlnZW5fYXNzZXJ0X2V4Y2VwdGlvbigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIGlmIChFaWdlbjo6aW50ZXJuYWw6OnB1c2hfYXNzZXJ0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVpZ2VuX2Fzc2VydF9saXN0LnB1c2hfYmFjayhzdGQ6OnN0cmluZyhFSUdFTl9NQUtFU1RSSU5HKF9fRklMRV9fKSAiICgiIEVJR0VOX01BS0VTVFJJTkcoX19MSU5FX18pICIpIDogIiAjYSkpOyBcCiAgIH0KLSAgLy8gSWYgRUlHRU5fREVCVUdfQVNTRVJUUyBpcyBkZWZpbmVkIGFuZCBpZiBubyBhc3NlcnRpb24gaXMgdHJpZ2dlcmVkIHdoaWxlCi0gIC8vIG9uZSBzaG91bGQgaGF2ZSBiZWVuLCB0aGVuIHRoZSBsaXN0IG9mIGV4ZWN1dGVkIGFzc2VydGlvbnMgaXMgcHJpbnRlZCBvdXQuCi0gIC8vCi0gIC8vIEVJR0VOX0RFQlVHX0FTU0VSVFMgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCBhcyBpdAotICAvLyBzaWduaWZpY2FudGx5IGluY3JlYXNlcyB0aGUgY29tcGlsYXRpb24gdGltZQotICAvLyBhbmQgbWlnaHQgZXZlbiBpbnRyb2R1Y2Ugc2lkZSBlZmZlY3RzIHRoYXQgd291bGQgaGlkZQotICAvLyBzb21lIG1lbW9yeSBlcnJvcnMuCi0gICNpZmRlZiBFSUdFTl9ERUJVR19BU1NFUlRTCiAKLSAgICBuYW1lc3BhY2UgRWlnZW4KLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgaW50ZXJuYWwKLSAgICAgIHsKLSAgICAgICAgc3RhdGljIGJvb2wgcHVzaF9hc3NlcnQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZWlnZW5fYXNzZXJ0X2xpc3Q7Ci0gICAgfQotICAgICNkZWZpbmUgZWlnZW5fYXNzZXJ0KGEpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiggKCEoYSkpICYmICghbm9fbW9yZV9hc3NlcnQpICkgICAgIFwKLSAgICAgIHsgXAotICAgICAgICBpZihyZXBvcnRfb25fY2Vycl9vbl9hc3NlcnRfZmFpbHVyZSkgXAotICAgICAgICAgIHN0ZDo6Y2VyciA8PCAgI2EgPDwgIiAiIF9fRklMRV9fIDw8ICIoIiA8PCBfX0xJTkVfXyA8PCAiKVxuIjsgXAotICAgICAgICBFaWdlbjo6bm9fbW9yZV9hc3NlcnQgPSB0cnVlOyAgICAgICBcCi0gICAgICAgIEVJR0VOX1RIUk9XX1goRWlnZW46OmVpZ2VuX2Fzc2VydF9leGNlcHRpb24oKSk7IFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZWxzZSBpZiAoRWlnZW46OmludGVybmFsOjpwdXNoX2Fzc2VydCkgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGVpZ2VuX2Fzc2VydF9saXN0LnB1c2hfYmFjayhzdGQ6OnN0cmluZyhFSUdFTl9NQUtFU1RSSU5HKF9fRklMRV9fKSAiICgiIEVJR0VOX01BS0VTVFJJTkcoX19MSU5FX18pICIpIDogIiAjYSkgKTsgXAotICAgICAgfQorI2lmZGVmIEVJR0VOX0VYQ0VQVElPTlMKKyNkZWZpbmUgVkVSSUZZX1JBSVNFU19BU1NFUlQoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6ZWlnZW5fYXNzZXJ0X2xpc3QuY2xlYXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjppbnRlcm5hbDo6cHVzaF9hc3NlcnQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRWlnZW46OnJlcG9ydF9vbl9jZXJyX29uX2Fzc2VydF9mYWlsdXJlID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGQ6OmNlcnIgPDwgIk9uZSBvZiB0aGUgZm9sbG93aW5nIGFzc2VydHMgc2hvdWxkIGhhdmUgYmVlbiB0cmlnZ2VyZWQ6XG4iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvciAodWludCBhaSA9IDA7IGFpIDwgZWlnZW5fYXNzZXJ0X2xpc3Quc2l6ZSgpOyArK2FpKSBzdGQ6OmNlcnIgPDwgIiAgIiA8PCBlaWdlbl9hc3NlcnRfbGlzdFthaV0gPDwgIlxuIjsgXAorICAgICAgVkVSSUZZKEVpZ2VuOjpzaG91bGRfcmFpc2VfYW5fYXNzZXJ0JiYgI2EpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBjYXRjaCAoRWlnZW46OmVpZ2VuX2Fzc2VydF9leGNlcHRpb24pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEVpZ2VuOjppbnRlcm5hbDo6cHVzaF9hc3NlcnQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVkVSSUZZKHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6cmVwb3J0X29uX2NlcnJfb25fYXNzZXJ0X2ZhaWx1cmUgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjppbnRlcm5hbDo6cHVzaF9hc3NlcnQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbmRpZiAgLy8gRUlHRU5fRVhDRVBUSU9OUwogCi0gICAgI2lmZGVmIEVJR0VOX0VYQ0VQVElPTlMKLSAgICAjZGVmaW5lIFZFUklGWV9SQUlTRVNfQVNTRVJUKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEVpZ2VuOjpub19tb3JlX2Fzc2VydCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgRWlnZW46OmVpZ2VuX2Fzc2VydF9saXN0LmNsZWFyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBFaWdlbjo6aW50ZXJuYWw6OnB1c2hfYXNzZXJ0ID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEVpZ2VuOjpyZXBvcnRfb25fY2Vycl9vbl9hc3NlcnRfZmFpbHVyZSA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc3RkOjpjZXJyIDw8ICJPbmUgb2YgdGhlIGZvbGxvd2luZyBhc3NlcnRzIHNob3VsZCBoYXZlIGJlZW4gdHJpZ2dlcmVkOlxuIjsgIFwKLSAgICAgICAgICBmb3IgKHVpbnQgYWk9MCA7IGFpPGVpZ2VuX2Fzc2VydF9saXN0LnNpemUoKSA7ICsrYWkpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICIgICIgPDwgZWlnZW5fYXNzZXJ0X2xpc3RbYWldIDw8ICJcbiI7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVkVSSUZZKEVpZ2VuOjpzaG91bGRfcmFpc2VfYW5fYXNzZXJ0ICYmICMgYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSBjYXRjaCAoRWlnZW46OmVpZ2VuX2Fzc2VydF9leGNlcHRpb24pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEVpZ2VuOjppbnRlcm5hbDo6cHVzaF9hc3NlcnQgPSBmYWxzZTsgVkVSSUZZKHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgRWlnZW46OnJlcG9ydF9vbl9jZXJyX29uX2Fzc2VydF9mYWlsdXJlID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBFaWdlbjo6aW50ZXJuYWw6OnB1c2hfYXNzZXJ0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9Ci0gICAgI2VuZGlmIC8vRUlHRU5fRVhDRVBUSU9OUworI2VsaWYgIWRlZmluZWQoX19DVURBQ0NfXykgJiYgIWRlZmluZWQoX19ISVBDQ19fKSAmJiAhZGVmaW5lZChfX1NZQ0xfREVWSUNFX09OTFlfXykgIC8vIEVJR0VOX0RFQlVHX0FTU0VSVFMKKyNkZWZpbmUgZWlnZW5fYXNzZXJ0KGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCghKGEpKSAmJiAoIW5vX21vcmVfYXNzZXJ0KSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6bm9fbW9yZV9hc3NlcnQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocmVwb3J0X29uX2NlcnJfb25fYXNzZXJ0X2ZhaWx1cmUpIHsgICAgICAgICAgIFwKKyAgICAgIGVpZ2VuX3BsYWluX2Fzc2VydChhKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEVJR0VOX1RIUk9XX1goRWlnZW46OmVpZ2VuX2Fzc2VydF9leGNlcHRpb24oKSk7IFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCi0gICNlbGlmICFkZWZpbmVkKF9fQ1VEQUNDX18pICYmICFkZWZpbmVkKF9fSElQQ0NfXykgJiYgIWRlZmluZWQoX19TWUNMX0RFVklDRV9PTkxZX18pIC8vIEVJR0VOX0RFQlVHX0FTU0VSVFMKLSAgICAjZGVmaW5lIGVpZ2VuX2Fzc2VydChhKSBcCi0gICAgICBpZiggKCEoYSkpICYmICghbm9fbW9yZV9hc3NlcnQpICkgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gdHJ1ZTsgICAgICAgICBcCi0gICAgICAgIGlmKHJlcG9ydF9vbl9jZXJyX29uX2Fzc2VydF9mYWlsdXJlKSB7IFwKLSAgICAgICAgICBlaWdlbl9wbGFpbl9hc3NlcnQoYSk7ICAgICAgICAgICAgICBcCi0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBFSUdFTl9USFJPV19YKEVpZ2VuOjplaWdlbl9hc3NlcnRfZXhjZXB0aW9uKCkpOyBcCi0gICAgICAgIH0gXAotICAgICAgfQotCi0gICAgI2lmZGVmIEVJR0VOX0VYQ0VQVElPTlMKLSAgICAgICNkZWZpbmUgVkVSSUZZX1JBSVNFU19BU1NFUlQoYSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgRWlnZW46OnJlcG9ydF9vbl9jZXJyX29uX2Fzc2VydF9mYWlsdXJlID0gZmFsc2U7ICAgICAgICAgIFwKLSAgICAgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBWRVJJRlkoRWlnZW46OnNob3VsZF9yYWlzZV9hbl9hc3NlcnQgJiYgIyBhKTsgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY2F0Y2ggKEVpZ2VuOjplaWdlbl9hc3NlcnRfZXhjZXB0aW9uJikgeyBWRVJJRlkodHJ1ZSk7IH0gIFwKLSAgICAgICAgRWlnZW46OnJlcG9ydF9vbl9jZXJyX29uX2Fzc2VydF9mYWlsdXJlID0gdHJ1ZTsgICAgICAgICAgIFwKLSAgICAgIH0KLSAgICAjZW5kaWYgLy8gRUlHRU5fRVhDRVBUSU9OUwotICAjZW5kaWYgLy8gRUlHRU5fREVCVUdfQVNTRVJUUworI2lmZGVmIEVJR0VOX0VYQ0VQVElPTlMKKyNkZWZpbmUgVkVSSUZZX1JBSVNFU19BU1NFUlQoYSkgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRWlnZW46Om5vX21vcmVfYXNzZXJ0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBFaWdlbjo6cmVwb3J0X29uX2NlcnJfb25fYXNzZXJ0X2ZhaWx1cmUgPSBmYWxzZTsgXAorICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFZFUklGWShFaWdlbjo6c2hvdWxkX3JhaXNlX2FuX2Fzc2VydCYmICNhKTsgICAgXAorICAgIH0gY2F0Y2ggKEVpZ2VuOjplaWdlbl9hc3NlcnRfZXhjZXB0aW9uJikgeyAgICAgICBcCisgICAgICBWRVJJRlkodHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVpZ2VuOjpyZXBvcnRfb25fY2Vycl9vbl9hc3NlcnRfZmFpbHVyZSA9IHRydWU7ICBcCisgIH0KKyNlbmRpZiAgLy8gRUlHRU5fRVhDRVBUSU9OUworI2VuZGlmICAvLyBFSUdFTl9ERUJVR19BU1NFUlRTCiAKICNpZm5kZWYgVkVSSUZZX1JBSVNFU19BU1NFUlQKLSAgI2RlZmluZSBWRVJJRllfUkFJU0VTX0FTU0VSVChhKSBcCi0gICAgc3RkOjpjb3V0IDw8ICJDYW4ndCBWRVJJRllfUkFJU0VTX0FTU0VSVCggIiAjYSAiICkgd2l0aCBleGNlcHRpb25zIGRpc2FibGVkXG4iOworI2RlZmluZSBWRVJJRllfUkFJU0VTX0FTU0VSVChhKSBzdGQ6OmNvdXQgPDwgIkNhbid0IFZFUklGWV9SQUlTRVNfQVNTRVJUKCAiICNhICIgKSB3aXRoIGV4Y2VwdGlvbnMgZGlzYWJsZWRcbiI7CiAjZW5kaWYKIAotICAjaWYgIWRlZmluZWQoX19DVURBQ0NfXykgJiYgIWRlZmluZWQoX19ISVBDQ19fKSAmJiAhZGVmaW5lZChTWUNMX0RFVklDRV9PTkxZKQotICAjZGVmaW5lIEVJR0VOX1VTRV9DVVNUT01fQVNTRVJUCi0gICNlbmRpZgorI2lmICFkZWZpbmVkKF9fQ1VEQUNDX18pICYmICFkZWZpbmVkKF9fSElQQ0NfXykgJiYgIWRlZmluZWQoU1lDTF9ERVZJQ0VfT05MWSkKKyNkZWZpbmUgRUlHRU5fVVNFX0NVU1RPTV9BU1NFUlQKKyNlbmRpZgogCi0jZWxzZSAvLyBFSUdFTl9OT19BU1NFUlRJT05fQ0hFQ0tJTkcKKyNlbHNlICAvLyBFSUdFTl9OT19BU1NFUlRJT05fQ0hFQ0tJTkcKIAotICAjZGVmaW5lIFZFUklGWV9SQUlTRVNfQVNTRVJUKGEpIHt9CisjZGVmaW5lIFZFUklGWV9SQUlTRVNfQVNTRVJUKGEpIFwKKyAge30KIAotI2VuZGlmIC8vIEVJR0VOX05PX0FTU0VSVElPTl9DSEVDS0lORworI2VuZGlmICAvLyBFSUdFTl9OT19BU1NFUlRJT05fQ0hFQ0tJTkcKIAogI2RlZmluZSBFSUdFTl9JTlRFUk5BTF9ERUJVR0dJTkcKLSNpbmNsdWRlIDxFaWdlbi9RUj4gLy8gcmVxdWlyZWQgZm9yIGNyZWF0ZVJhbmRvbVBJTWF0cml4T2ZSYW5rIGFuZCBnZW5lcmF0ZVJhbmRvbU1hdHJpeFN2cworI2luY2x1ZGUgPEVpZ2VuL1FSPiAgLy8gcmVxdWlyZWQgZm9yIGNyZWF0ZVJhbmRvbVBJTWF0cml4T2ZSYW5rIGFuZCBnZW5lcmF0ZVJhbmRvbU1hdHJpeFN2cwogCi1pbmxpbmUgdm9pZCB2ZXJpZnlfaW1wbChib29sIGNvbmRpdGlvbiwgY29uc3QgY2hhciAqdGVzdG5hbWUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpjb25kaXRpb25fYXNfc3RyaW5nKQotewotICBpZiAoIWNvbmRpdGlvbikKLSAgewotICAgIGlmKEVpZ2VuOjpnX3Rlc3RfbGV2ZWw+MCkKLSAgICAgIHN0ZDo6Y2VyciA8PCAiV0FSTklORzogIjsKLSAgICBzdGQ6OmNlcnIgPDwgIlRlc3QgIiA8PCB0ZXN0bmFtZSA8PCAiIGZhaWxlZCBpbiAiIDw8IGZpbGUgPDwgIiAoIiA8PCBsaW5lIDw8ICIpIgotICAgICAgPDwgc3RkOjplbmRsIDw8ICIgICAgIiA8PCBjb25kaXRpb25fYXNfc3RyaW5nIDw8IHN0ZDo6ZW5kbDsKK2lubGluZSB2b2lkIHZlcmlmeV9pbXBsKGJvb2wgY29uZGl0aW9uLCBjb25zdCBjaGFyKiB0ZXN0bmFtZSwgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25kaXRpb25fYXNfc3RyaW5nKSB7CisgIGlmICghY29uZGl0aW9uKSB7CisgICAgaWYgKEVpZ2VuOjpnX3Rlc3RfbGV2ZWwgPiAwKSBzdGQ6OmNlcnIgPDwgIldBUk5JTkc6ICI7CisgICAgc3RkOjpjZXJyIDw8ICJUZXN0ICIgPDwgdGVzdG5hbWUgPDwgIiBmYWlsZWQgaW4gIiA8PCBmaWxlIDw8ICIgKCIgPDwgbGluZSA8PCAiKSIgPDwgc3RkOjplbmRsCisgICAgICAgICAgICAgIDw8ICIgICAgIiA8PCBjb25kaXRpb25fYXNfc3RyaW5nIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIlN0YWNrOlxuIjsKICAgICBjb25zdCBpbnQgdGVzdF9zdGFja19zaXplID0gc3RhdGljX2Nhc3Q8aW50PihFaWdlbjo6Z190ZXN0X3N0YWNrLnNpemUoKSk7Ci0gICAgZm9yKGludCBpPXRlc3Rfc3RhY2tfc2l6ZS0xOyBpPj0wOyAtLWkpCi0gICAgICBzdGQ6OmNlcnIgPDwgIiAgLSAiIDw8IEVpZ2VuOjpnX3Rlc3Rfc3RhY2tbaV0gPDwgIlxuIjsKKyAgICBmb3IgKGludCBpID0gdGVzdF9zdGFja19zaXplIC0gMTsgaSA+PSAwOyAtLWkpIHN0ZDo6Y2VyciA8PCAiICAtICIgPDwgRWlnZW46OmdfdGVzdF9zdGFja1tpXSA8PCAiXG4iOwogICAgIHN0ZDo6Y2VyciA8PCAiXG4iOwotICAgIGlmKEVpZ2VuOjpnX3Rlc3RfbGV2ZWw9PTApCi0gICAgICBhYm9ydCgpOworICAgIGlmIChFaWdlbjo6Z190ZXN0X2xldmVsID09IDApIGFib3J0KCk7CiAgIH0KIH0KIApAQCAtMzczLDcgKzM2Myw2IEBACiAjZGVmaW5lIFZFUklGWV9HRShhLCBiKSA6OnZlcmlmeV9pbXBsKGEgPj0gYiwgZ190ZXN0X3N0YWNrLmJhY2soKS5jX3N0cigpLCBfX0ZJTEVfXywgX19MSU5FX18sIEVJR0VOX01BS0VTVFJJTkcoYSA+PSBiKSkKICNkZWZpbmUgVkVSSUZZX0xFKGEsIGIpIDo6dmVyaWZ5X2ltcGwoYSA8PSBiLCBnX3Rlc3Rfc3RhY2suYmFjaygpLmNfc3RyKCksIF9fRklMRV9fLCBfX0xJTkVfXywgRUlHRU5fTUFLRVNUUklORyhhIDw9IGIpKQogCi0KICNkZWZpbmUgVkVSSUZZX0lTX0VRVUFMKGEsIGIpIFZFUklGWSh0ZXN0X2lzX2VxdWFsKGEsIGIsIHRydWUpKQogI2RlZmluZSBWRVJJRllfSVNfTk9UX0VRVUFMKGEsIGIpIFZFUklGWSh0ZXN0X2lzX2VxdWFsKGEsIGIsIGZhbHNlKSkKICNkZWZpbmUgVkVSSUZZX0lTX0FQUFJPWChhLCBiKSBWRVJJRlkodmVyaWZ5SXNBcHByb3goYSwgYikpCkBAIC0zODcsNjAgKzM3Niw4MSBAQAogCiAjZGVmaW5lIFZFUklGWV9JU19VTklUQVJZKGEpIFZFUklGWSh0ZXN0X2lzVW5pdGFyeShhKSkKIAotI2RlZmluZSBTVEFUSUNfQ0hFQ0soQ09ORCkgRUlHRU5fU1RBVElDX0FTU0VSVCggKENPTkQpICwgRUlHRU5fSU5URVJOQUxfRVJST1JfUExFQVNFX0ZJTEVfQV9CVUdfUkVQT1JUICkKKyNkZWZpbmUgU1RBVElDX0NIRUNLKENPTkQpIEVJR0VOX1NUQVRJQ19BU1NFUlQoKENPTkQpLCBFSUdFTl9JTlRFUk5BTF9FUlJPUl9QTEVBU0VfRklMRV9BX0JVR19SRVBPUlQpCiAKLSNkZWZpbmUgQ0FMTF9TVUJURVNUKEZVTkMpIGRvIHsgXAorI2RlZmluZSBDQUxMX1NVQlRFU1QoRlVOQykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZ190ZXN0X3N0YWNrLnB1c2hfYmFjayhFSUdFTl9NQUtFU1RSSU5HKEZVTkMpKTsgXAotICAgIEZVTkM7IFwKLSAgICBnX3Rlc3Rfc3RhY2sucG9wX2JhY2soKTsgXAorICAgIEZVTkM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnX3Rlc3Rfc3RhY2sucG9wX2JhY2soKTsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gd2hpbGUgKDApCiAKLQogLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgdG8gYXZvaWQgSUNDIHdhcm5pbmdzCiAjaWYgRUlHRU5fQ09NUF9JQ0MKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RkOjpzdHJpbmcgdHlwZV9uYW1lKCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHR5cGVfbmFtZSgpOwogCiBuYW1lc3BhY2UgRWlnZW4gewogCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotYm9vbCB0ZXN0X2lzX2VxdWFsKGNvbnN0IFQmIGFjdHVhbCwgY29uc3QgVSYgZXhwZWN0ZWQsIGJvb2wgZXhwZWN0X2VxdWFsPXRydWUpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Citib29sIHRlc3RfaXNfZXF1YWwoY29uc3QgVCYgYWN0dWFsLCBjb25zdCBVJiBleHBlY3RlZCwgYm9vbCBleHBlY3RfZXF1YWwgPSB0cnVlKTsKIAotfSAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCit9ICAvLyBlbmQgbmFtZXNwYWNlIEVpZ2VuCiAKICNlbmRpZiAgLy8gRUlHRU5fQ09NUF9JQ0MKIAotCiBuYW1lc3BhY2UgRWlnZW4gewogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUMSx0eXBlbmFtZSBUMj4KLXN0ZDo6ZW5hYmxlX2lmX3Q8aW50ZXJuYWw6OmlzX3NhbWU8VDEsVDI+Ojp2YWx1ZSxib29sPgotaXNfc2FtZV90eXBlKGNvbnN0IFQxJiwgY29uc3QgVDImKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0ZDo6ZW5hYmxlX2lmX3Q8aW50ZXJuYWw6OmlzX3NhbWU8VDEsIFQyPjo6dmFsdWUsIGJvb2w+IGlzX3NhbWVfdHlwZShjb25zdCBUMSYsIGNvbnN0IFQyJikgewogICByZXR1cm4gdHJ1ZTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbCB0ZXN0X3ByZWNpc2lvbigpIHsgcmV0dXJuIE51bVRyYWl0czxUPjo6ZHVtbXlfcHJlY2lzaW9uKCk7IH0KLXRlbXBsYXRlPD4gaW5saW5lIGZsb2F0IHRlc3RfcHJlY2lzaW9uPGZsb2F0PigpIHsgcmV0dXJuIDFlLTNmOyB9Ci10ZW1wbGF0ZTw+IGlubGluZSBkb3VibGUgdGVzdF9wcmVjaXNpb248ZG91YmxlPigpIHsgcmV0dXJuIDFlLTY7IH0KLXRlbXBsYXRlPD4gaW5saW5lIGxvbmcgZG91YmxlIHRlc3RfcHJlY2lzaW9uPGxvbmcgZG91YmxlPigpIHsgcmV0dXJuIDFlLTZsOyB9Ci10ZW1wbGF0ZTw+IGlubGluZSBmbG9hdCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSB7IHJldHVybiB0ZXN0X3ByZWNpc2lvbjxmbG9hdD4oKTsgfQotdGVtcGxhdGU8PiBpbmxpbmUgZG91YmxlIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSB7IHJldHVybiB0ZXN0X3ByZWNpc2lvbjxkb3VibGU+KCk7IH0KLXRlbXBsYXRlPD4gaW5saW5lIGxvbmcgZG91YmxlIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4gPigpIHsgcmV0dXJuIHRlc3RfcHJlY2lzaW9uPGxvbmcgZG91YmxlPigpOyB9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB0eXBlbmFtZSBOdW1UcmFpdHM8VD46OlJlYWwgdGVzdF9wcmVjaXNpb24oKSB7CisgIHJldHVybiBOdW1UcmFpdHM8VD46OmR1bW15X3ByZWNpc2lvbigpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBmbG9hdCB0ZXN0X3ByZWNpc2lvbjxmbG9hdD4oKSB7CisgIHJldHVybiAxZS0zZjsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgZG91YmxlIHRlc3RfcHJlY2lzaW9uPGRvdWJsZT4oKSB7CisgIHJldHVybiAxZS02OworfQordGVtcGxhdGUgPD4KK2lubGluZSBsb25nIGRvdWJsZSB0ZXN0X3ByZWNpc2lvbjxsb25nIGRvdWJsZT4oKSB7CisgIHJldHVybiAxZS02bDsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkgeworICByZXR1cm4gdGVzdF9wcmVjaXNpb248ZmxvYXQ+KCk7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGRvdWJsZSB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgeworICByZXR1cm4gdGVzdF9wcmVjaXNpb248ZG91YmxlPigpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBsb25nIGRvdWJsZSB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+ID4oKSB7CisgIHJldHVybiB0ZXN0X3ByZWNpc2lvbjxsb25nIGRvdWJsZT4oKTsKK30KIAotI2RlZmluZSBFSUdFTl9URVNUX1NDQUxBUl9URVNUX09WRVJMT0FEKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSBib29sIHRlc3RfaXNBcHByb3goVFlQRSBhLCBUWVBFIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyByZXR1cm4gbnVtZXh0OjplcXVhbF9zdHJpY3QoYSwgYikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKChudW1leHQ6OmlzbmFuKShhKSAmJiAobnVtZXh0Ojppc25hbikoYikpIHx8ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAoaW50ZXJuYWw6OmlzQXBwcm94KGEsIGIsIHRlc3RfcHJlY2lzaW9uPFRZUEU+KCkpKTsgfSAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIGJvb2wgdGVzdF9pc0N3aXNlQXBwcm94KFRZUEUgYSwgVFlQRSBiLCBib29sIGV4YWN0KSAgICAgICAgICAgICAgXAotICB7IHJldHVybiBudW1leHQ6OmVxdWFsX3N0cmljdChhLCBiKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAoKG51bWV4dDo6aXNuYW4pKGEpICYmIChudW1leHQ6OmlzbmFuKShiKSkgfHwgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICghZXhhY3QgJiYgaW50ZXJuYWw6OmlzQXBwcm94KGEsIGIsIHRlc3RfcHJlY2lzaW9uPFRZUEU+KCkpKTsgfSAgICAgXAotICBpbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKFRZUEUgYSwgVFlQRSBiKSAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxUWVBFPigpKTsgfSAgIFwKLSAgaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveE9yTGVzc1RoYW4oVFlQRSBhLCBUWVBFIGIpICAgICAgICAgICAgICAgICAgICAgXAotICB7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3hPckxlc3NUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPFRZUEU+KCkpOyB9CisjZGVmaW5lIEVJR0VOX1RFU1RfU0NBTEFSX1RFU1RfT1ZFUkxPQUQoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBib29sIHRlc3RfaXNBcHByb3goVFlQRSBhLCBUWVBFIGIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG51bWV4dDo6ZXF1YWxfc3RyaWN0KGEsIGIpIHx8ICgobnVtZXh0Ojppc25hbikoYSkgJiYgKG51bWV4dDo6aXNuYW4pKGIpKSB8fCBcCisgICAgICAgICAgIChpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248VFlQRT4oKSkpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBib29sIHRlc3RfaXNDd2lzZUFwcHJveChUWVBFIGEsIFRZUEUgYiwgYm9vbCBleGFjdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG51bWV4dDo6ZXF1YWxfc3RyaWN0KGEsIGIpIHx8ICgobnVtZXh0Ojppc25hbikoYSkgJiYgKG51bWV4dDo6aXNuYW4pKGIpKSB8fCBcCisgICAgICAgICAgICghZXhhY3QgJiYgaW50ZXJuYWw6OmlzQXBwcm94KGEsIGIsIHRlc3RfcHJlY2lzaW9uPFRZUEU+KCkpKTsgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBib29sIHRlc3RfaXNNdWNoU21hbGxlclRoYW4oVFlQRSBhLCBUWVBFIGIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxUWVBFPigpKTsgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBib29sIHRlc3RfaXNBcHByb3hPckxlc3NUaGFuKFRZUEUgYSwgVFlQRSBiKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGludGVybmFsOjppc0FwcHJveE9yTGVzc1RoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248VFlQRT4oKSk7ICAgICAgICAgICAgICAgICBcCisgIH0KIAogRUlHRU5fVEVTVF9TQ0FMQVJfVEVTVF9PVkVSTE9BRChzaG9ydCkKIEVJR0VOX1RFU1RfU0NBTEFSX1RFU1RfT1ZFUkxPQUQodW5zaWduZWQgc2hvcnQpCkBAIC00NTgsMTY0ICs0NjgsMTY0IEBACiAjdW5kZWYgRUlHRU5fVEVTVF9TQ0FMQVJfVEVTVF9PVkVSTE9BRAogCiAjaWZuZGVmIEVJR0VOX1RFU1RfTk9fQ09NUExFWAotaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBhLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBiKQoteyByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94KGEsIGIsIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpKTsgfQotaW5saW5lIGJvb2wgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBhLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBiKQoteyByZXR1cm4gaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpKTsgfQotCi1pbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94KGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+JiBhLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiYgYikKLXsgcmV0dXJuIGludGVybmFsOjppc0FwcHJveChhLCBiLCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOyB9Ci1pbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+JiBhLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiYgYikKLXsgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOyB9Ci0KLSNpZm5kZWYgRUlHRU5fVEVTVF9OT19MT05HRE9VQkxFCi1pbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94KGNvbnN0IHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4mIGEsIGNvbnN0IHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4mIGIpCi17IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGxvbmcgZG91YmxlPiA+KCkpOyB9Ci1pbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4mIGEsIGNvbnN0IHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4mIGIpCi17IHJldHVybiBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGxvbmcgZG91YmxlPiA+KCkpOyB9Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQotaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBsb25nIGRvdWJsZSYgYSwgY29uc3QgbG9uZyBkb3VibGUmIGIpCi17Ci0gICAgYm9vbCByZXQgPSBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248bG9uZyBkb3VibGU+KCkpOwotICAgIGlmICghcmV0KSBzdGQ6OmNlcnIKLSAgICAgICAgPDwgc3RkOjplbmRsIDw8ICIgICAgYWN0dWFsICAgPSAiIDw8IGEKLSAgICAgICAgPDwgc3RkOjplbmRsIDw8ICIgICAgZXhwZWN0ZWQgPSAiIDw8IGIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gcmV0OworaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBhLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBiKSB7CisgIHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkpOworfQoraW5saW5lIGJvb2wgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBhLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+JiBiKSB7CisgIHJldHVybiBpbnRlcm5hbDo6aXNNdWNoU21hbGxlclRoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkpOwogfQogCi1pbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IGxvbmcgZG91YmxlJiBhLCBjb25zdCBsb25nIGRvdWJsZSYgYikKLXsgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxsb25nIGRvdWJsZT4oKSk7IH0KLWlubGluZSBib29sIHRlc3RfaXNBcHByb3hPckxlc3NUaGFuKGNvbnN0IGxvbmcgZG91YmxlJiBhLCBjb25zdCBsb25nIGRvdWJsZSYgYikKLXsgcmV0dXJuIGludGVybmFsOjppc0FwcHJveE9yTGVzc1RoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248bG9uZyBkb3VibGU+KCkpOyB9Ci0jZW5kaWYgLy8gRUlHRU5fVEVTVF9OT19MT05HRE9VQkxFCitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94KGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+JiBhLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiYgYikgeworICByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94KGEsIGIsIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9CitpbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IHN0ZDo6Y29tcGxleDxkb3VibGU+JiBhLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZG91YmxlPiYgYikgeworICByZXR1cm4gaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGEsIGIsIHRlc3RfcHJlY2lzaW9uPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7Cit9CisKKyNpZm5kZWYgRUlHRU5fVEVTVF9OT19MT05HRE9VQkxFCitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94KGNvbnN0IHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4mIGEsIGNvbnN0IHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4mIGIpIHsKKyAgcmV0dXJuIGludGVybmFsOjppc0FwcHJveChhLCBiLCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+ID4oKSk7Cit9CitpbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4mIGEsIGNvbnN0IHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4mIGIpIHsKKyAgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+ID4oKSk7Cit9CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQoraW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBsb25nIGRvdWJsZSYgYSwgY29uc3QgbG9uZyBkb3VibGUmIGIpIHsKKyAgYm9vbCByZXQgPSBpbnRlcm5hbDo6aXNBcHByb3goYSwgYiwgdGVzdF9wcmVjaXNpb248bG9uZyBkb3VibGU+KCkpOworICBpZiAoIXJldCkKKyAgICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsIDw8ICIgICAgYWN0dWFsICAgPSAiIDw8IGEgPDwgc3RkOjplbmRsIDw8ICIgICAgZXhwZWN0ZWQgPSAiIDw8IGIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgcmV0dXJuIHJldDsKK30KKworaW5saW5lIGJvb2wgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBsb25nIGRvdWJsZSYgYSwgY29uc3QgbG9uZyBkb3VibGUmIGIpIHsKKyAgcmV0dXJuIGludGVybmFsOjppc011Y2hTbWFsbGVyVGhhbihhLCBiLCB0ZXN0X3ByZWNpc2lvbjxsb25nIGRvdWJsZT4oKSk7Cit9CitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94T3JMZXNzVGhhbihjb25zdCBsb25nIGRvdWJsZSYgYSwgY29uc3QgbG9uZyBkb3VibGUmIGIpIHsKKyAgcmV0dXJuIGludGVybmFsOjppc0FwcHJveE9yTGVzc1RoYW4oYSwgYiwgdGVzdF9wcmVjaXNpb248bG9uZyBkb3VibGU+KCkpOworfQorI2VuZGlmICAvLyBFSUdFTl9URVNUX05PX0xPTkdET1VCTEUKIAogLy8gdGVzdF9yZWxhdGl2ZV9lcnJvciByZXR1cm5zIHRoZSByZWxhdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBhbmQgYiBhcyBhIHJlYWwgc2NhbGFyIGFzIHVzZWQgaW4gaXNBcHByb3guCi10ZW1wbGF0ZTx0eXBlbmFtZSBUMSx0eXBlbmFtZSBUMj4KLXR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBUMTo6UmVhbFNjYWxhcj46Ok5vbkludGVnZXIgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBFaWdlbkJhc2U8VDE+ICZhLCBjb25zdCBFaWdlbkJhc2U8VDI+ICZiKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3R5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBUMTo6UmVhbFNjYWxhcj46Ok5vbkludGVnZXIgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBFaWdlbkJhc2U8VDE+JiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVpZ2VuQmFzZTxUMj4mIGIpIHsKICAgdXNpbmcgc3RkOjpzcXJ0OwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBUMTo6UmVhbFNjYWxhcj46Ok5vbkludGVnZXIgUmVhbFNjYWxhcjsKLSAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPFQxLDI+Ojp0eXBlIGVhKGEuZGVyaXZlZCgpKTsKLSAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPFQyLDI+Ojp0eXBlIGViKGIuZGVyaXZlZCgpKTsKLSAgcmV0dXJuIHNxcnQoUmVhbFNjYWxhcigoZWEubWF0cml4KCktZWIubWF0cml4KCkpLmN3aXNlQWJzMigpLnN1bSgpKSAvIFJlYWxTY2FsYXIoKHN0ZDo6bWluKShlYi5jd2lzZUFiczIoKS5zdW0oKSxlYS5jd2lzZUFiczIoKS5zdW0oKSkpKTsKKyAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPFQxLCAyPjo6dHlwZSBlYShhLmRlcml2ZWQoKSk7CisgIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxUMiwgMj46OnR5cGUgZWIoYi5kZXJpdmVkKCkpOworICByZXR1cm4gc3FydChSZWFsU2NhbGFyKChlYS5tYXRyaXgoKSAtIGViLm1hdHJpeCgpKS5jd2lzZUFiczIoKS5zdW0oKSkgLworICAgICAgICAgICAgICBSZWFsU2NhbGFyKChzdGQ6Om1pbikoZWIuY3dpc2VBYnMyKCkuc3VtKCksIGVhLmN3aXNlQWJzMigpLnN1bSgpKSkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUMSx0eXBlbmFtZSBUMj4KLXR5cGVuYW1lIFQxOjpSZWFsU2NhbGFyIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgVDEgJmEsIGNvbnN0IFQyICZiLCBjb25zdCB0eXBlbmFtZSBUMTo6Q29lZmZpY2llbnRzKiA9IDApCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordHlwZW5hbWUgVDE6OlJlYWxTY2FsYXIgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBUMSYgYSwgY29uc3QgVDImIGIsIGNvbnN0IHR5cGVuYW1lIFQxOjpDb2VmZmljaWVudHMqID0gMCkgewogICByZXR1cm4gdGVzdF9yZWxhdGl2ZV9lcnJvcihhLmNvZWZmcygpLCBiLmNvZWZmcygpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVDEsdHlwZW5hbWUgVDI+Ci10eXBlbmFtZSBUMTo6U2NhbGFyIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgVDEgJmEsIGNvbnN0IFQyICZiLCBjb25zdCB0eXBlbmFtZSBUMTo6TWF0cml4VHlwZSogPSAwKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3R5cGVuYW1lIFQxOjpTY2FsYXIgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBUMSYgYSwgY29uc3QgVDImIGIsIGNvbnN0IHR5cGVuYW1lIFQxOjpNYXRyaXhUeXBlKiA9IDApIHsKICAgcmV0dXJuIHRlc3RfcmVsYXRpdmVfZXJyb3IoYS5tYXRyaXgoKSwgYi5tYXRyaXgoKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFMsIGludCBEPgotUyB0ZXN0X3JlbGF0aXZlX2Vycm9yKGNvbnN0IFRyYW5zbGF0aW9uPFMsRD4gJmEsIGNvbnN0IFRyYW5zbGF0aW9uPFMsRD4gJmIpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUywgaW50IEQ+CitTIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgVHJhbnNsYXRpb248UywgRD4mIGEsIGNvbnN0IFRyYW5zbGF0aW9uPFMsIEQ+JiBiKSB7CiAgIHJldHVybiB0ZXN0X3JlbGF0aXZlX2Vycm9yKGEudmVjdG9yKCksIGIudmVjdG9yKCkpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgUywgaW50IEQsIGludCBPPgotUyB0ZXN0X3JlbGF0aXZlX2Vycm9yKGNvbnN0IFBhcmFtZXRyaXplZExpbmU8UyxELE8+ICZhLCBjb25zdCBQYXJhbWV0cml6ZWRMaW5lPFMsRCxPPiAmYikKLXsKK1MgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBQYXJhbWV0cml6ZWRMaW5lPFMsIEQsIE8+JiBhLCBjb25zdCBQYXJhbWV0cml6ZWRMaW5lPFMsIEQsIE8+JiBiKSB7CiAgIHJldHVybiAoc3RkOjptYXgpKHRlc3RfcmVsYXRpdmVfZXJyb3IoYS5vcmlnaW4oKSwgYi5vcmlnaW4oKSksIHRlc3RfcmVsYXRpdmVfZXJyb3IoYS5vcmlnaW4oKSwgYi5vcmlnaW4oKSkpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgUywgaW50IEQ+Ci1TIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgQWxpZ25lZEJveDxTLEQ+ICZhLCBjb25zdCBBbGlnbmVkQm94PFMsRD4gJmIpCi17CitTIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgQWxpZ25lZEJveDxTLCBEPiYgYSwgY29uc3QgQWxpZ25lZEJveDxTLCBEPiYgYikgewogICByZXR1cm4gKHN0ZDo6bWF4KSh0ZXN0X3JlbGF0aXZlX2Vycm9yKChhLm1pbikoKSwgKGIubWluKSgpKSwgdGVzdF9yZWxhdGl2ZV9lcnJvcigoYS5tYXgpKCksIChiLm1heCkoKSkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBTcGFyc2VNYXRyaXhCYXNlOwotdGVtcGxhdGU8dHlwZW5hbWUgVDEsdHlwZW5hbWUgVDI+Ci10eXBlbmFtZSBUMTo6UmVhbFNjYWxhciB0ZXN0X3JlbGF0aXZlX2Vycm9yKGNvbnN0IE1hdHJpeEJhc2U8VDE+ICZhLCBjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFQyPiAmYikKLXsKLSAgcmV0dXJuIHRlc3RfcmVsYXRpdmVfZXJyb3IoYSxiLnRvRGVuc2UoKSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIFNwYXJzZU1hdHJpeEJhc2U7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordHlwZW5hbWUgVDE6OlJlYWxTY2FsYXIgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBNYXRyaXhCYXNlPFQxPiYgYSwgY29uc3QgU3BhcnNlTWF0cml4QmFzZTxUMj4mIGIpIHsKKyAgcmV0dXJuIHRlc3RfcmVsYXRpdmVfZXJyb3IoYSwgYi50b0RlbnNlKCkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBTcGFyc2VNYXRyaXhCYXNlOwotdGVtcGxhdGU8dHlwZW5hbWUgVDEsdHlwZW5hbWUgVDI+Ci10eXBlbmFtZSBUMTo6UmVhbFNjYWxhciB0ZXN0X3JlbGF0aXZlX2Vycm9yKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8VDE+ICZhLCBjb25zdCBNYXRyaXhCYXNlPFQyPiAmYikKLXsKLSAgcmV0dXJuIHRlc3RfcmVsYXRpdmVfZXJyb3IoYS50b0RlbnNlKCksYik7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK2NsYXNzIFNwYXJzZU1hdHJpeEJhc2U7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordHlwZW5hbWUgVDE6OlJlYWxTY2FsYXIgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFQxPiYgYSwgY29uc3QgTWF0cml4QmFzZTxUMj4mIGIpIHsKKyAgcmV0dXJuIHRlc3RfcmVsYXRpdmVfZXJyb3IoYS50b0RlbnNlKCksIGIpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiBjbGFzcyBTcGFyc2VNYXRyaXhCYXNlOwotdGVtcGxhdGU8dHlwZW5hbWUgVDEsdHlwZW5hbWUgVDI+Ci10eXBlbmFtZSBUMTo6UmVhbFNjYWxhciB0ZXN0X3JlbGF0aXZlX2Vycm9yKGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8VDE+ICZhLCBjb25zdCBTcGFyc2VNYXRyaXhCYXNlPFQyPiAmYikKLXsKLSAgcmV0dXJuIHRlc3RfcmVsYXRpdmVfZXJyb3IoYS50b0RlbnNlKCksYi50b0RlbnNlKCkpOwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBTcGFyc2VNYXRyaXhCYXNlOwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3R5cGVuYW1lIFQxOjpSZWFsU2NhbGFyIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgU3BhcnNlTWF0cml4QmFzZTxUMT4mIGEsIGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8VDI+JiBiKSB7CisgIHJldHVybiB0ZXN0X3JlbGF0aXZlX2Vycm9yKGEudG9EZW5zZSgpLCBiLnRvRGVuc2UoKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQxLHR5cGVuYW1lIFQyPgotdHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE51bVRyYWl0czxUMT46OlJlYWw+OjpOb25JbnRlZ2VyIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgVDEgJmEsIGNvbnN0IFQyICZiLCBzdGQ6OmVuYWJsZV9pZl90PGludGVybmFsOjppc19hcml0aG1ldGljPHR5cGVuYW1lIE51bVRyYWl0czxUMT46OlJlYWw+Ojp2YWx1ZSwgVDE+KiA9IDApCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgordHlwZW5hbWUgTnVtVHJhaXRzPHR5cGVuYW1lIE51bVRyYWl0czxUMT46OlJlYWw+OjpOb25JbnRlZ2VyIHRlc3RfcmVsYXRpdmVfZXJyb3IoCisgICAgY29uc3QgVDEmIGEsIGNvbnN0IFQyJiBiLCBzdGQ6OmVuYWJsZV9pZl90PGludGVybmFsOjppc19hcml0aG1ldGljPHR5cGVuYW1lIE51bVRyYWl0czxUMT46OlJlYWw+Ojp2YWx1ZSwgVDE+KiA9IDApIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTnVtVHJhaXRzPFQxPjo6UmVhbD46Ok5vbkludGVnZXIgUmVhbFNjYWxhcjsKLSAgcmV0dXJuIG51bWV4dDo6c3FydChSZWFsU2NhbGFyKG51bWV4dDo6YWJzMihhLWIpKS8obnVtZXh0OjptaW5pKShSZWFsU2NhbGFyKG51bWV4dDo6YWJzMihhKSksUmVhbFNjYWxhcihudW1leHQ6OmFiczIoYikpKSk7CisgIHJldHVybiBudW1leHQ6OnNxcnQoUmVhbFNjYWxhcihudW1leHQ6OmFiczIoYSAtIGIpKSAvCisgICAgICAgICAgICAgICAgICAgICAgKG51bWV4dDo6bWluaSkoUmVhbFNjYWxhcihudW1leHQ6OmFiczIoYSkpLCBSZWFsU2NhbGFyKG51bWV4dDo6YWJzMihiKSkpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLVQgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBSb3RhdGlvbjJEPFQ+ICZhLCBjb25zdCBSb3RhdGlvbjJEPFQ+ICZiKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgUm90YXRpb24yRDxUPiYgYSwgY29uc3QgUm90YXRpb24yRDxUPiYgYikgewogICByZXR1cm4gdGVzdF9yZWxhdGl2ZV9lcnJvcihhLmFuZ2xlKCksIGIuYW5nbGUoKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1UIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgQW5nbGVBeGlzPFQ+ICZhLCBjb25zdCBBbmdsZUF4aXM8VD4gJmIpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgdGVzdF9yZWxhdGl2ZV9lcnJvcihjb25zdCBBbmdsZUF4aXM8VD4mIGEsIGNvbnN0IEFuZ2xlQXhpczxUPiYgYikgewogICByZXR1cm4gKHN0ZDo6bWF4KSh0ZXN0X3JlbGF0aXZlX2Vycm9yKGEuYW5nbGUoKSwgYi5hbmdsZSgpKSwgdGVzdF9yZWxhdGl2ZV9lcnJvcihhLmF4aXMoKSwgYi5heGlzKCkpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVHlwZTEsIHR5cGVuYW1lIFR5cGUyPgotaW5saW5lIGJvb2wgdGVzdF9pc0FwcHJveChjb25zdCBUeXBlMSYgYSwgY29uc3QgVHlwZTImIGIsIHR5cGVuYW1lIFR5cGUxOjpTY2FsYXIqID0gMCkgLy8gRW5hYmxlZCBmb3IgRWlnZW4ncyB0eXBlIG9ubHkKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlMSwgdHlwZW5hbWUgVHlwZTI+CitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94KGNvbnN0IFR5cGUxJiBhLCBjb25zdCBUeXBlMiYgYiwgdHlwZW5hbWUgVHlwZTE6OlNjYWxhciogPSAwKSAgLy8gRW5hYmxlZCBmb3IgRWlnZW4ncyB0eXBlIG9ubHkKIHsKICAgcmV0dXJuIGEuaXNBcHByb3goYiwgdGVzdF9wcmVjaXNpb248dHlwZW5hbWUgVHlwZTE6OlNjYWxhcj4oKSk7CiB9CiAKLS8vIGdldF90ZXN0X3ByZWNpc2lvbiBpcyBhIHNtYWxsIHdyYXBwZXIgdG8gdGVzdF9wcmVjaXNpb24gYWxsb3dpbmcgdG8gcmV0dXJuIHRoZSBzY2FsYXIgcHJlY2lzaW9uIGZvciBlaXRoZXIgc2NhbGFycyBvciBleHByZXNzaW9ucwotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBUOjpTY2FsYXI+OjpSZWFsIGdldF90ZXN0X3ByZWNpc2lvbihjb25zdCBUJiwgY29uc3QgdHlwZW5hbWUgVDo6U2NhbGFyKiA9IDApCi17CisvLyBnZXRfdGVzdF9wcmVjaXNpb24gaXMgYSBzbWFsbCB3cmFwcGVyIHRvIHRlc3RfcHJlY2lzaW9uIGFsbG93aW5nIHRvIHJldHVybiB0aGUgc2NhbGFyIHByZWNpc2lvbiBmb3IgZWl0aGVyIHNjYWxhcnMgb3IKKy8vIGV4cHJlc3Npb25zCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBUOjpTY2FsYXI+OjpSZWFsIGdldF90ZXN0X3ByZWNpc2lvbihjb25zdCBUJiwgY29uc3QgdHlwZW5hbWUgVDo6U2NhbGFyKiA9IDApIHsKICAgcmV0dXJuIHRlc3RfcHJlY2lzaW9uPHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBUOjpTY2FsYXI+OjpSZWFsPigpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdHlwZW5hbWUgTnVtVHJhaXRzPFQ+OjpSZWFsIGdldF90ZXN0X3ByZWNpc2lvbihjb25zdCBUJixzdGQ6OmVuYWJsZV9pZl90PGludGVybmFsOjppc19hcml0aG1ldGljPHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbD46OnZhbHVlLCBUPiogPSAwKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBOdW1UcmFpdHM8VD46OlJlYWwgZ2V0X3Rlc3RfcHJlY2lzaW9uKAorICAgIGNvbnN0IFQmLCBzdGQ6OmVuYWJsZV9pZl90PGludGVybmFsOjppc19hcml0aG1ldGljPHR5cGVuYW1lIE51bVRyYWl0czxUPjo6UmVhbD46OnZhbHVlLCBUPiogPSAwKSB7CiAgIHJldHVybiB0ZXN0X3ByZWNpc2lvbjx0eXBlbmFtZSBOdW1UcmFpdHM8VD46OlJlYWw+KCk7CiB9CiAKIC8vIHZlcmlmeUlzQXBwcm94IGlzIGEgd3JhcHBlciB0byB0ZXN0X2lzQXBwcm94IHRoYXQgb3V0cHV0cyB0aGUgcmVsYXRpdmUgZGlmZmVyZW5jZSBtYWduaXR1ZGUgaWYgdGhlIHRlc3QgZmFpbHMuCi10ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlMSwgdHlwZW5hbWUgVHlwZTI+Ci1pbmxpbmUgYm9vbCB2ZXJpZnlJc0FwcHJveChjb25zdCBUeXBlMSYgYSwgY29uc3QgVHlwZTImIGIpCi17Ci0gIGJvb2wgcmV0ID0gdGVzdF9pc0FwcHJveChhLGIpOwotICBpZighcmV0KQotICB7Ci0gICAgc3RkOjpjZXJyIDw8ICJEaWZmZXJlbmNlIHRvbyBsYXJnZSB3cnQgdG9sZXJhbmNlICIgPDwgZ2V0X3Rlc3RfcHJlY2lzaW9uKGEpICA8PCAiLCByZWxhdGl2ZSBlcnJvciBpczogIiA8PCB0ZXN0X3JlbGF0aXZlX2Vycm9yKGEsYikgPDwgc3RkOjplbmRsOwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGUxLCB0eXBlbmFtZSBUeXBlMj4KK2lubGluZSBib29sIHZlcmlmeUlzQXBwcm94KGNvbnN0IFR5cGUxJiBhLCBjb25zdCBUeXBlMiYgYikgeworICBib29sIHJldCA9IHRlc3RfaXNBcHByb3goYSwgYik7CisgIGlmICghcmV0KSB7CisgICAgc3RkOjpjZXJyIDw8ICJEaWZmZXJlbmNlIHRvbyBsYXJnZSB3cnQgdG9sZXJhbmNlICIgPDwgZ2V0X3Rlc3RfcHJlY2lzaW9uKGEpCisgICAgICAgICAgICAgIDw8ICIsIHJlbGF0aXZlIGVycm9yIGlzOiAiIDw8IHRlc3RfcmVsYXRpdmVfZXJyb3IoYSwgYikgPDwgc3RkOjplbmRsOwogICB9CiAgIHJldHVybiByZXQ7CiB9CiAKLS8vIHZlcmlmeUlzQ3dpc2VBcHByb3ggaXMgYSB3cmFwcGVyIHRvIHRlc3RfaXNDd2lzZUFwcHJveCB0aGF0IG91dHB1dHMgdGhlIHJlbGF0aXZlIGRpZmZlcmVuY2UgbWFnbml0dWRlIGlmIHRoZSB0ZXN0IGZhaWxzLgotdGVtcGxhdGU8dHlwZW5hbWUgVHlwZTEsIHR5cGVuYW1lIFR5cGUyPgotaW5saW5lIGJvb2wgdmVyaWZ5SXNDd2lzZUFwcHJveChjb25zdCBUeXBlMSYgYSwgY29uc3QgVHlwZTImIGIsIGJvb2wgZXhhY3QpCi17Ci0gIGJvb2wgcmV0ID0gdGVzdF9pc0N3aXNlQXBwcm94KGEsYixleGFjdCk7Ci0gIGlmKCFyZXQpIHsKKy8vIHZlcmlmeUlzQ3dpc2VBcHByb3ggaXMgYSB3cmFwcGVyIHRvIHRlc3RfaXNDd2lzZUFwcHJveCB0aGF0IG91dHB1dHMgdGhlIHJlbGF0aXZlIGRpZmZlcmVuY2UgbWFnbml0dWRlIGlmIHRoZSB0ZXN0CisvLyBmYWlscy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlMSwgdHlwZW5hbWUgVHlwZTI+CitpbmxpbmUgYm9vbCB2ZXJpZnlJc0N3aXNlQXBwcm94KGNvbnN0IFR5cGUxJiBhLCBjb25zdCBUeXBlMiYgYiwgYm9vbCBleGFjdCkgeworICBib29sIHJldCA9IHRlc3RfaXNDd2lzZUFwcHJveChhLCBiLCBleGFjdCk7CisgIGlmICghcmV0KSB7CiAgICAgaWYgKGV4YWN0KSB7CiAgICAgICBzdGQ6OmNlcnIgPDwgIlZhbHVlcyBhcmUgbm90IGFuIGV4YWN0IG1hdGNoIjsKICAgICB9IGVsc2UgewogICAgICAgc3RkOjpjZXJyIDw8ICJEaWZmZXJlbmNlIHRvbyBsYXJnZSB3cnQgdG9sZXJhbmNlICIgPDwgZ2V0X3Rlc3RfcHJlY2lzaW9uKGEpOwogICAgIH0KLSAgICBzdGQ6OmNlcnIgPDwgIiwgcmVsYXRpdmUgZXJyb3IgaXM6ICIgPDwgdGVzdF9yZWxhdGl2ZV9lcnJvcihhLGIpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIiwgcmVsYXRpdmUgZXJyb3IgaXM6ICIgPDwgdGVzdF9yZWxhdGl2ZV9lcnJvcihhLCBiKSA8PCBzdGQ6OmVuZGw7CiAgIH0KICAgcmV0dXJuIHJldDsKIH0KQEAgLTYyNywzNyArNjM3LDMwIEBACiAvLyB3ZSB3b24ndCBpc3N1ZSBhIGZhbHNlIG5lZ2F0aXZlLgogLy8gVGhpcyB0ZXN0IGNvdWxkIGJlOiBhYnMoYS1iKSA8PSBlcHMgKiByZWYKIC8vIEhvd2V2ZXIsIGl0IHNlZW1zIHRoYXQgc2ltcGx5IGNvbXBhcmluZyBhK3JlZiBhbmQgYityZWYgaXMgbW9yZSBzZW5zaXRpdmUgdG8gdHJ1ZSBlcnJvci4KLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcix0eXBlbmFtZSBTY2FsYXJSZWY+Ci1pbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94V2l0aFJlZihjb25zdCBTY2FsYXImIGEsIGNvbnN0IFNjYWxhciYgYiwgY29uc3QgU2NhbGFyUmVmJiByZWYpCi17Ci0gIHJldHVybiB0ZXN0X2lzQXBwcm94KGErcmVmLCBiK3JlZik7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBTY2FsYXJSZWY+CitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94V2l0aFJlZihjb25zdCBTY2FsYXImIGEsIGNvbnN0IFNjYWxhciYgYiwgY29uc3QgU2NhbGFyUmVmJiByZWYpIHsKKyAgcmV0dXJuIHRlc3RfaXNBcHByb3goYSArIHJlZiwgYiArIHJlZik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMj4KLWlubGluZSBib29sIHRlc3RfaXNNdWNoU21hbGxlclRoYW4oY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMT4mIG0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQyPiYgbTIpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyPgoraW5saW5lIGJvb2wgdGVzdF9pc011Y2hTbWFsbGVyVGhhbihjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQxPiYgbTEsIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZDI+JiBtMikgewogICByZXR1cm4gbTEuaXNNdWNoU21hbGxlclRoYW4obTIsIHRlc3RfcHJlY2lzaW9uPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8RGVyaXZlZDE+OjpTY2FsYXI+KCkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CiBpbmxpbmUgYm9vbCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4mIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+OjpSZWFsJiBzKQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPjo6UmVhbCYgcykgewogICByZXR1cm4gbS5pc011Y2hTbWFsbGVyVGhhbihzLCB0ZXN0X3ByZWNpc2lvbjx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPERlcml2ZWQ+OjpTY2FsYXI+KCkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgotaW5saW5lIGJvb2wgdGVzdF9pc1VuaXRhcnkoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgoraW5saW5lIGJvb2wgdGVzdF9pc1VuaXRhcnkoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgbSkgewogICByZXR1cm4gbS5pc1VuaXRhcnkodGVzdF9wcmVjaXNpb248dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxEZXJpdmVkPjo6U2NhbGFyPigpKTsKIH0KIAogLy8gQ2hlY2tzIGNvbXBvbmVudC13aXNlLCB3b3JrcyB3aXRoIGluZnMgYW5kIG5hbnMuCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDI+Ci1ib29sIHRlc3RfaXNDd2lzZUFwcHJveChjb25zdCBEZW5zZUJhc2U8RGVyaXZlZDE+JiBtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbnNlQmFzZTxEZXJpdmVkMj4mIG0yLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleGFjdCkgewordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQxLCB0eXBlbmFtZSBEZXJpdmVkMj4KK2Jvb2wgdGVzdF9pc0N3aXNlQXBwcm94KGNvbnN0IERlbnNlQmFzZTxEZXJpdmVkMT4mIG0xLCBjb25zdCBEZW5zZUJhc2U8RGVyaXZlZDI+JiBtMiwgYm9vbCBleGFjdCkgewogICBpZiAobTEucm93cygpICE9IG0yLnJvd3MoKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQpAQCAtNjY2LDkgKzY2OSw4IEBACiAgIH0KICAgZm9yIChJbmRleCByID0gMDsgciA8IG0xLnJvd3MoKTsgKytyKSB7CiAgICAgZm9yIChJbmRleCBjID0gMDsgYyA8IG0xLmNvbHMoKTsgKytjKSB7Ci0gICAgICBpZiAobTEociwgYykgIT0gbTIociwgYykKLSAgICAgICAgICAmJiAhKChudW1leHQ6OmlzbmFuKShtMShyLCBjKSkgJiYgKG51bWV4dDo6aXNuYW4pKG0yKHIsIGMpKSkgCi0gICAgICAgICAgJiYgKGV4YWN0IHx8ICF0ZXN0X2lzQXBwcm94KG0xKHIsIGMpLCBtMihyLCBjKSkpKSB7CisgICAgICBpZiAobTEociwgYykgIT0gbTIociwgYykgJiYgISgobnVtZXh0Ojppc25hbikobTEociwgYykpICYmIChudW1leHQ6OmlzbmFuKShtMihyLCBjKSkpICYmCisgICAgICAgICAgKGV4YWN0IHx8ICF0ZXN0X2lzQXBwcm94KG0xKHIsIGMpLCBtMihyLCBjKSkpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KICAgICB9CkBAIC02NzcsMjUgKzY3OSwxOCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyPgotYm9vbCB0ZXN0X2lzQ3dpc2VBcHByb3goY29uc3QgU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkMT4mIG0xLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BhcnNlTWF0cml4QmFzZTxEZXJpdmVkMj4mIG0yLCBib29sIGV4YWN0KSB7Citib29sIHRlc3RfaXNDd2lzZUFwcHJveChjb25zdCBTcGFyc2VNYXRyaXhCYXNlPERlcml2ZWQxPiYgbTEsIGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8RGVyaXZlZDI+JiBtMiwgYm9vbCBleGFjdCkgewogICByZXR1cm4gdGVzdF9pc0N3aXNlQXBwcm94KG0xLnRvRGVuc2UoKSwgbTIudG9EZW5zZSgpLCBleGFjdCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1ib29sIHRlc3RfaXNfZXF1YWwoY29uc3QgVCYgYWN0dWFsLCBjb25zdCBVJiBleHBlY3RlZCwgYm9vbCBleHBlY3RfZXF1YWwpCi17Ci0gICAgaWYgKG51bWV4dDo6ZXF1YWxfc3RyaWN0KGFjdHVhbCwgZXhwZWN0ZWQpID09IGV4cGVjdF9lcXVhbCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgLy8gZmFsc2U6Ci0gICAgc3RkOjpjZXJyCi0gICAgICAgIDw8ICJcbiAgICBhY3R1YWwgICA9ICIgPDwgYWN0dWFsCi0gICAgICAgIDw8ICJcbiAgICBleHBlY3RlZCAiIDw8IChleHBlY3RfZXF1YWwgPyAiPSAiIDogIiE9IikgPDwgZXhwZWN0ZWQgPDwgIlxuXG4iOwotICAgIHJldHVybiBmYWxzZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorYm9vbCB0ZXN0X2lzX2VxdWFsKGNvbnN0IFQmIGFjdHVhbCwgY29uc3QgVSYgZXhwZWN0ZWQsIGJvb2wgZXhwZWN0X2VxdWFsKSB7CisgIGlmIChudW1leHQ6OmVxdWFsX3N0cmljdChhY3R1YWwsIGV4cGVjdGVkKSA9PSBleHBlY3RfZXF1YWwpIHJldHVybiB0cnVlOworICAvLyBmYWxzZToKKyAgc3RkOjpjZXJyIDw8ICJcbiAgICBhY3R1YWwgICA9ICIgPDwgYWN0dWFsIDw8ICJcbiAgICBleHBlY3RlZCAiIDw8IChleHBlY3RfZXF1YWwgPyAiPSAiIDogIiE9IikgPDwgZXhwZWN0ZWQgPDwgIlxuXG4iOworICByZXR1cm4gZmFsc2U7CiB9CiAKLQotCiAvKioKICAqIENoZWNrIGlmIG51bWJlciBpcyAibm90IGEgbnVtYmVyIiAoTmFOKS4KICAqCkBAIC03MDMsOSArNjk4LDkgQEAKICAqIEBwYXJhbSB4IGlucHV0IHZhbHVlCiAgKiBAcmV0dXJuIHRydWUsIGlmIGlucHV0IHZhbHVlIGlzICJub3QgYSBudW1iZXIiIChOYU4pCiAgKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgaXNOb3ROYU4oY29uc3QgVCYgeCkKLXsKLSAgcmV0dXJuIHg9PXg7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgaXNOb3ROYU4oY29uc3QgVCYgeCkgeworICByZXR1cm4geCA9PSB4OwogfQogCiAvKioKQEAgLTcxNSw4ICs3MTAsOCBAQAogICogQHBhcmFtIHggaW5wdXQgdmFsdWUKICAqIEByZXR1cm4gdHJ1ZSwgaWYgaW5wdXQgdmFsdWUgaXMgcGx1cyBpbmZpbml0eQogICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIGlzUGx1c0luZihjb25zdCBUJiB4KQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIGlzUGx1c0luZihjb25zdCBUJiB4KSB7CiAgIHJldHVybiB4ID4gTnVtVHJhaXRzPFQ+OjpoaWdoZXN0KCk7CiB9CiAKQEAgLTcyNywzMyArNzIyLDY3IEBACiAgKiBAcGFyYW0geCBpbnB1dCB2YWx1ZQogICogQHJldHVybiB0cnVlLCBpZiBpbnB1dCB2YWx1ZSBpcyBtaW51cyBpbmZpbml0eQogICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIGlzTWludXNJbmYoY29uc3QgVCYgeCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBpc01pbnVzSW5mKGNvbnN0IFQmIHgpIHsKICAgcmV0dXJuIHggPCBOdW1UcmFpdHM8VD46Omxvd2VzdCgpOwogfQogCi19IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KLQorfSAgLy8gZW5kIG5hbWVzcGFjZSBFaWdlbgogCiAjaW5jbHVkZSAicmFuZG9tX21hdHJpeF9oZWxwZXIuaCIKIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgR2V0RGlmZmVyZW50VHlwZTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEdldERpZmZlcmVudFR5cGU7Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IEdldERpZmZlcmVudFR5cGU8ZmxvYXQ+IHsKKyAgdHlwZWRlZiBkb3VibGUgdHlwZTsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IEdldERpZmZlcmVudFR5cGU8ZG91YmxlPiB7CisgIHR5cGVkZWYgZmxvYXQgdHlwZTsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBHZXREaWZmZXJlbnRUeXBlPHN0ZDo6Y29tcGxleDxUPiA+IHsKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgR2V0RGlmZmVyZW50VHlwZTxUPjo6dHlwZT4gdHlwZTsKK307CiAKLXRlbXBsYXRlPD4gc3RydWN0IEdldERpZmZlcmVudFR5cGU8ZmxvYXQ+IHsgdHlwZWRlZiBkb3VibGUgdHlwZTsgfTsKLXRlbXBsYXRlPD4gc3RydWN0IEdldERpZmZlcmVudFR5cGU8ZG91YmxlPiB7IHR5cGVkZWYgZmxvYXQgdHlwZTsgfTsKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBHZXREaWZmZXJlbnRUeXBlPHN0ZDo6Y29tcGxleDxUPiA+Ci17IHR5cGVkZWYgc3RkOjpjb21wbGV4PHR5cGVuYW1lIEdldERpZmZlcmVudFR5cGU8VD46OnR5cGU+IHR5cGU7IH07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSgpICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAib3RoZXIiOyB9Ci10ZW1wbGF0ZTw+IHN0ZDo6c3RyaW5nIHR5cGVfbmFtZTxmbG9hdD4oKSAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gImZsb2F0IjsgfQotdGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8ZG91YmxlPigpICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuICJkb3VibGUiOyB9Ci10ZW1wbGF0ZTw+IHN0ZDo6c3RyaW5nIHR5cGVfbmFtZTxsb25nIGRvdWJsZT4oKSAgICAgICAgICAgICAgICAgeyByZXR1cm4gImxvbmcgZG91YmxlIjsgfQotdGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8aW50PigpICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuICJpbnQiOyB9Ci10ZW1wbGF0ZTw+IHN0ZDo6c3RyaW5nIHR5cGVfbmFtZTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSAgICAgICAgeyByZXR1cm4gImNvbXBsZXg8ZmxvYXQ+IjsgfQotdGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpICAgICAgIHsgcmV0dXJuICJjb21wbGV4PGRvdWJsZT4iOyB9Ci10ZW1wbGF0ZTw+IHN0ZDo6c3RyaW5nIHR5cGVfbmFtZTxzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+ID4oKSAgeyByZXR1cm4gImNvbXBsZXg8bG9uZyBkb3VibGU+IjsgfQotdGVtcGxhdGU8PiBzdGQ6OnN0cmluZyB0eXBlX25hbWU8c3RkOjpjb21wbGV4PGludD4gPigpICAgICAgICAgIHsgcmV0dXJuICJjb21wbGV4PGludD4iOyB9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHR5cGVfbmFtZSgpIHsKKyAgcmV0dXJuICJvdGhlciI7Cit9Cit0ZW1wbGF0ZSA8Pgorc3RkOjpzdHJpbmcgdHlwZV9uYW1lPGZsb2F0PigpIHsKKyAgcmV0dXJuICJmbG9hdCI7Cit9Cit0ZW1wbGF0ZSA8Pgorc3RkOjpzdHJpbmcgdHlwZV9uYW1lPGRvdWJsZT4oKSB7CisgIHJldHVybiAiZG91YmxlIjsKK30KK3RlbXBsYXRlIDw+CitzdGQ6OnN0cmluZyB0eXBlX25hbWU8bG9uZyBkb3VibGU+KCkgeworICByZXR1cm4gImxvbmcgZG91YmxlIjsKK30KK3RlbXBsYXRlIDw+CitzdGQ6OnN0cmluZyB0eXBlX25hbWU8aW50PigpIHsKKyAgcmV0dXJuICJpbnQiOworfQordGVtcGxhdGUgPD4KK3N0ZDo6c3RyaW5nIHR5cGVfbmFtZTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSB7CisgIHJldHVybiAiY29tcGxleDxmbG9hdD4iOworfQordGVtcGxhdGUgPD4KK3N0ZDo6c3RyaW5nIHR5cGVfbmFtZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgeworICByZXR1cm4gImNvbXBsZXg8ZG91YmxlPiI7Cit9Cit0ZW1wbGF0ZSA8Pgorc3RkOjpzdHJpbmcgdHlwZV9uYW1lPHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4gPigpIHsKKyAgcmV0dXJuICJjb21wbGV4PGxvbmcgZG91YmxlPiI7Cit9Cit0ZW1wbGF0ZSA8Pgorc3RkOjpzdHJpbmcgdHlwZV9uYW1lPHN0ZDo6Y29tcGxleDxpbnQ+ID4oKSB7CisgIHJldHVybiAiY29tcGxleDxpbnQ+IjsKK30KIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCkBAIC03NjIsMTIgKzc5MSwxMCBAQAogICoKICAqIEBwYXJhbSBzdHIgaW5wdXQgc3RyaW5nCiAgKi8KLWlubGluZSB2b2lkIHNldF9yZXBlYXRfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKQoteworaW5saW5lIHZvaWQgc2V0X3JlcGVhdF9mcm9tX3N0cmluZyhjb25zdCBjaGFyKiBzdHIpIHsKICAgZXJybm8gPSAwOwogICBnX3JlcGVhdCA9IGludChzdHJ0b3VsKHN0ciwgMCwgMTApKTsKLSAgaWYoZXJybm8gfHwgZ19yZXBlYXQgPD0gMCkKLSAgeworICBpZiAoZXJybm8gfHwgZ19yZXBlYXQgPD0gMCkgewogICAgIHN0ZDo6Y291dCA8PCAiSW52YWxpZCByZXBlYXQgdmFsdWUgIiA8PCBzdHIgPDwgc3RkOjplbmRsOwogICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKICAgfQpAQCAtNzc5LDEwNSArODA2LDkxIEBACiAgKgogICogQHBhcmFtIHN0ciBpbnB1dCBzdHJpbmcKICAqLwotaW5saW5lIHZvaWQgc2V0X3NlZWRfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqc3RyKQoteworaW5saW5lIHZvaWQgc2V0X3NlZWRfZnJvbV9zdHJpbmcoY29uc3QgY2hhciogc3RyKSB7CiAgIGVycm5vID0gMDsKICAgZ19zZWVkID0gaW50KHN0cnRvdWwoc3RyLCAwLCAxMCkpOwotICBpZihlcnJubyB8fCBnX3NlZWQgPT0gMCkKLSAgeworICBpZiAoZXJybm8gfHwgZ19zZWVkID09IDApIHsKICAgICBzdGQ6OmNvdXQgPDwgIkludmFsaWQgc2VlZCB2YWx1ZSAiIDw8IHN0ciA8PCBzdGQ6OmVuZGw7CiAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwogICB9CiAgIGdfaGFzX3NldF9zZWVkID0gdHJ1ZTsKIH0KIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBnX2hhc19zZXRfcmVwZWF0ID0gZmFsc2U7Ci0gICAgZ19oYXNfc2V0X3NlZWQgPSBmYWxzZTsKLSAgICBib29sIG5lZWRfaGVscCA9IGZhbHNlOworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBnX2hhc19zZXRfcmVwZWF0ID0gZmFsc2U7CisgIGdfaGFzX3NldF9zZWVkID0gZmFsc2U7CisgIGJvb2wgbmVlZF9oZWxwID0gZmFsc2U7CiAKLSAgICBmb3IoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIHsKLSAgICAgIGlmKGFyZ3ZbaV1bMF0gPT0gJ3InKQotICAgICAgewotICAgICAgICBpZihnX2hhc19zZXRfcmVwZWF0KQotICAgICAgICB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJBcmd1bWVudCAiIDw8IGFyZ3ZbaV0gPDwgIiBjb25mbGljdGluZyB3aXRoIGEgZm9ybWVyIGFyZ3VtZW50IiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0X3JlcGVhdF9mcm9tX3N0cmluZyhhcmd2W2ldKzEpOworICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgIGlmIChhcmd2W2ldWzBdID09ICdyJykgeworICAgICAgaWYgKGdfaGFzX3NldF9yZXBlYXQpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJBcmd1bWVudCAiIDw8IGFyZ3ZbaV0gPDwgIiBjb25mbGljdGluZyB3aXRoIGEgZm9ybWVyIGFyZ3VtZW50IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAxOwogICAgICAgfQotICAgICAgZWxzZSBpZihhcmd2W2ldWzBdID09ICdzJykKLSAgICAgIHsKLSAgICAgICAgaWYoZ19oYXNfc2V0X3NlZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkFyZ3VtZW50ICIgPDwgYXJndltpXSA8PCAiIGNvbmZsaWN0aW5nIHdpdGggYSBmb3JtZXIgYXJndW1lbnQiIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICAgc2V0X3NlZWRfZnJvbV9zdHJpbmcoYXJndltpXSsxKTsKKyAgICAgIHNldF9yZXBlYXRfZnJvbV9zdHJpbmcoYXJndltpXSArIDEpOworICAgIH0gZWxzZSBpZiAoYXJndltpXVswXSA9PSAncycpIHsKKyAgICAgIGlmIChnX2hhc19zZXRfc2VlZCkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIkFyZ3VtZW50ICIgPDwgYXJndltpXSA8PCAiIGNvbmZsaWN0aW5nIHdpdGggYSBmb3JtZXIgYXJndW1lbnQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIDE7CiAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG5lZWRfaGVscCA9IHRydWU7Ci0gICAgICB9CisgICAgICBzZXRfc2VlZF9mcm9tX3N0cmluZyhhcmd2W2ldICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG5lZWRfaGVscCA9IHRydWU7CiAgICAgfQorICB9CiAKLSAgICBpZihuZWVkX2hlbHApCi0gICAgewotICAgICAgc3RkOjpjb3V0IDw8ICJUaGlzIHRlc3QgYXBwbGljYXRpb24gdGFrZXMgdGhlIGZvbGxvd2luZyBvcHRpb25hbCBhcmd1bWVudHM6IiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIiAgck4gICAgIFJlcGVhdCBlYWNoIHRlc3QgTiB0aW1lcyAoZGVmYXVsdDogIiA8PCBERUZBVUxUX1JFUEVBVCA8PCAiKSIgPDwgc3RkOjplbmRsOwotICAgICAgc3RkOjpjb3V0IDw8ICIgIHNOICAgICBVc2UgTiBhcyBzZWVkIGZvciByYW5kb20gbnVtYmVycyAoZGVmYXVsdDogYmFzZWQgb24gY3VycmVudCB0aW1lKSIgPDwgc3RkOjplbmRsOwotICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHN0ZDo6Y291dCA8PCAiSWYgZGVmaW5lZCwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBFSUdFTl9SRVBFQVQgYW5kIEVJR0VOX1NFRUQiIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHN0ZDo6Y291dCA8PCAid2lsbCBiZSB1c2VkIGFzIGRlZmF1bHQgdmFsdWVzIGZvciB0aGVzZSBwYXJhbWV0ZXJzLiIgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQorICBpZiAobmVlZF9oZWxwKSB7CisgICAgc3RkOjpjb3V0IDw8ICJUaGlzIHRlc3QgYXBwbGljYXRpb24gdGFrZXMgdGhlIGZvbGxvd2luZyBvcHRpb25hbCBhcmd1bWVudHM6IiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8ICIgIHJOICAgICBSZXBlYXQgZWFjaCB0ZXN0IE4gdGltZXMgKGRlZmF1bHQ6ICIgPDwgREVGQVVMVF9SRVBFQVQgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIiAgc04gICAgIFVzZSBOIGFzIHNlZWQgZm9yIHJhbmRvbSBudW1iZXJzIChkZWZhdWx0OiBiYXNlZCBvbiBjdXJyZW50IHRpbWUpIiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIklmIGRlZmluZWQsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgRUlHRU5fUkVQRUFUIGFuZCBFSUdFTl9TRUVEIiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8ICJ3aWxsIGJlIHVzZWQgYXMgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZXNlIHBhcmFtZXRlcnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIDE7CisgIH0KIAotICAgIGNoYXIgKmVudl9FSUdFTl9SRVBFQVQgPSBnZXRlbnYoIkVJR0VOX1JFUEVBVCIpOwotICAgIGlmKCFnX2hhc19zZXRfcmVwZWF0ICYmIGVudl9FSUdFTl9SRVBFQVQpCi0gICAgICBzZXRfcmVwZWF0X2Zyb21fc3RyaW5nKGVudl9FSUdFTl9SRVBFQVQpOwotICAgIGNoYXIgKmVudl9FSUdFTl9TRUVEID0gZ2V0ZW52KCJFSUdFTl9TRUVEIik7Ci0gICAgaWYoIWdfaGFzX3NldF9zZWVkICYmIGVudl9FSUdFTl9TRUVEKQotICAgICAgc2V0X3NlZWRfZnJvbV9zdHJpbmcoZW52X0VJR0VOX1NFRUQpOworICBjaGFyKiBlbnZfRUlHRU5fUkVQRUFUID0gZ2V0ZW52KCJFSUdFTl9SRVBFQVQiKTsKKyAgaWYgKCFnX2hhc19zZXRfcmVwZWF0ICYmIGVudl9FSUdFTl9SRVBFQVQpIHNldF9yZXBlYXRfZnJvbV9zdHJpbmcoZW52X0VJR0VOX1JFUEVBVCk7CisgIGNoYXIqIGVudl9FSUdFTl9TRUVEID0gZ2V0ZW52KCJFSUdFTl9TRUVEIik7CisgIGlmICghZ19oYXNfc2V0X3NlZWQgJiYgZW52X0VJR0VOX1NFRUQpIHNldF9zZWVkX2Zyb21fc3RyaW5nKGVudl9FSUdFTl9TRUVEKTsKIAotICAgIGlmKCFnX2hhc19zZXRfc2VlZCkgZ19zZWVkID0gKHVuc2lnbmVkIGludCkgdGltZShOVUxMKTsKLSAgICBpZighZ19oYXNfc2V0X3JlcGVhdCkgZ19yZXBlYXQgPSBERUZBVUxUX1JFUEVBVDsKKyAgaWYgKCFnX2hhc19zZXRfc2VlZCkgZ19zZWVkID0gKHVuc2lnbmVkIGludCl0aW1lKE5VTEwpOworICBpZiAoIWdfaGFzX3NldF9yZXBlYXQpIGdfcmVwZWF0ID0gREVGQVVMVF9SRVBFQVQ7CiAKLSAgICBzdGQ6OmNvdXQgPDwgIkluaXRpYWxpemluZyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB3aXRoIHNlZWQgIiA8PCBnX3NlZWQgPDwgc3RkOjplbmRsOwotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8ICJTZWVkOiAiIDw8IGdfc2VlZDsKLSAgICBnX3Rlc3Rfc3RhY2sucHVzaF9iYWNrKHNzLnN0cigpKTsKLSAgICBzcmFuZChnX3NlZWQpOwotICAgIHN0ZDo6Y291dCA8PCAiUmVwZWF0aW5nIGVhY2ggdGVzdCAiIDw8IGdfcmVwZWF0IDw8ICIgdGltZXMiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJJbml0aWFsaXppbmcgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igd2l0aCBzZWVkICIgPDwgZ19zZWVkIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8ICJTZWVkOiAiIDw8IGdfc2VlZDsKKyAgZ190ZXN0X3N0YWNrLnB1c2hfYmFjayhzcy5zdHIoKSk7CisgIHNyYW5kKGdfc2VlZCk7CisgIHN0ZDo6Y291dCA8PCAiUmVwZWF0aW5nIGVhY2ggdGVzdCAiIDw8IGdfcmVwZWF0IDw8ICIgdGltZXMiIDw8IHN0ZDo6ZW5kbDsKIAotICAgIFZFUklGWShFaWdlblRlc3Q6OmFsbCgpLnNpemUoKT4wKTsKKyAgVkVSSUZZKEVpZ2VuVGVzdDo6YWxsKCkuc2l6ZSgpID4gMCk7CiAKLSAgICBmb3Ioc3RkOjpzaXplX3QgaT0wOyBpPEVpZ2VuVGVzdDo6YWxsKCkuc2l6ZSgpOyArK2kpCi0gICAgewotICAgICAgY29uc3QgRWlnZW5UZXN0JiBjdXJyZW50X3Rlc3QgPSAqRWlnZW5UZXN0OjphbGwoKVtpXTsKLSAgICAgIEVpZ2VuOjpnX3Rlc3Rfc3RhY2sucHVzaF9iYWNrKGN1cnJlbnRfdGVzdC5uYW1lKCkpOwotICAgICAgY3VycmVudF90ZXN0KCk7Ci0gICAgICBFaWdlbjo6Z190ZXN0X3N0YWNrLnBvcF9iYWNrKCk7Ci0gICAgfQorICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgRWlnZW5UZXN0OjphbGwoKS5zaXplKCk7ICsraSkgeworICAgIGNvbnN0IEVpZ2VuVGVzdCYgY3VycmVudF90ZXN0ID0gKkVpZ2VuVGVzdDo6YWxsKClbaV07CisgICAgRWlnZW46OmdfdGVzdF9zdGFjay5wdXNoX2JhY2soY3VycmVudF90ZXN0Lm5hbWUoKSk7CisgICAgY3VycmVudF90ZXN0KCk7CisgICAgRWlnZW46OmdfdGVzdF9zdGFjay5wb3BfYmFjaygpOworICB9CiAKLSAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9CiAKIC8vIFRoZXNlIHdhcm5pbmcgYXJlIGRpc2FibGVkIGhlcmUgc3VjaCB0aGF0IHRoZXkgYXJlIHN0aWxsIE9OIHdoZW4gcGFyc2luZyBFaWdlbidzIGhlYWRlciBmaWxlcy4KICNpZiBkZWZpbmVkIF9fSU5URUxfQ09NUElMRVIKLSAgLy8gcmVtYXJrICMzODM6IHZhbHVlIGNvcGllZCB0byB0ZW1wb3JhcnksIHJlZmVyZW5jZSB0byB0ZW1wb3JhcnkgdXNlZAotICAvLyAgLT4gdGhpcyB3YXJuaW5nIGlzIHJhaXNlZCBldmVuIGZvciBsZWdhbCB1c2FnZSBhczogZ190ZXN0X3N0YWNrLnB1c2hfYmFjaygiZm9vIik7IHdoZXJlIGdfdGVzdF9zdGFjayBpcyBhIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPgotICAvLyByZW1hcmsgIzE0MTg6IGV4dGVybmFsIGZ1bmN0aW9uIGRlZmluaXRpb24gd2l0aCBubyBwcmlvciBkZWNsYXJhdGlvbgotICAvLyAgLT4gdGhpcyB3YXJuaW5nIGlzIHJhaXNlZCBmb3IgYWxsIG91ciB0ZXN0IGZ1bmN0aW9ucy4gRGVjbGFyaW5nIHRoZW0gc3RhdGljIHdvdWxkIGZpeCB0aGUgaXNzdWUuCi0gIC8vIHdhcm5pbmcgIzI3OTogY29udHJvbGxpbmcgZXhwcmVzc2lvbiBpcyBjb25zdGFudAotICAvLyByZW1hcmsgIzE1NzI6IGZsb2F0aW5nLXBvaW50IGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIGFyZSB1bnJlbGlhYmxlCi0gICNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDI3OSAzODMgMTQxOCAxNTcyCisvLyByZW1hcmsgIzM4MzogdmFsdWUgY29waWVkIHRvIHRlbXBvcmFyeSwgcmVmZXJlbmNlIHRvIHRlbXBvcmFyeSB1c2VkCisvLyAgLT4gdGhpcyB3YXJuaW5nIGlzIHJhaXNlZCBldmVuIGZvciBsZWdhbCB1c2FnZSBhczogZ190ZXN0X3N0YWNrLnB1c2hfYmFjaygiZm9vIik7IHdoZXJlIGdfdGVzdF9zdGFjayBpcyBhCisvLyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+CisvLyByZW1hcmsgIzE0MTg6IGV4dGVybmFsIGZ1bmN0aW9uIGRlZmluaXRpb24gd2l0aCBubyBwcmlvciBkZWNsYXJhdGlvbgorLy8gIC0+IHRoaXMgd2FybmluZyBpcyByYWlzZWQgZm9yIGFsbCBvdXIgdGVzdCBmdW5jdGlvbnMuIERlY2xhcmluZyB0aGVtIHN0YXRpYyB3b3VsZCBmaXggdGhlIGlzc3VlLgorLy8gd2FybmluZyAjMjc5OiBjb250cm9sbGluZyBleHByZXNzaW9uIGlzIGNvbnN0YW50CisvLyByZW1hcmsgIzE1NzI6IGZsb2F0aW5nLXBvaW50IGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIGFyZSB1bnJlbGlhYmxlCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAyNzkgMzgzIDE0MTggMTU3MgogI2VuZGlmCiAKICNpZmRlZiBfTVNDX1ZFUgotICAvLyA0NTAzIC0gZGVjb3JhdGVkIG5hbWUgbGVuZ3RoIGV4Y2VlZGVkLCBuYW1lIHdhcyB0cnVuY2F0ZWQKLSAgI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDUwMykKKy8vIDQ1MDMgLSBkZWNvcmF0ZWQgbmFtZSBsZW5ndGggZXhjZWVkZWQsIG5hbWUgd2FzIHRydW5jYXRlZAorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0NTAzKQogI2VuZGlmCiAKICNpbmNsdWRlICJncHVfdGVzdF9oZWxwZXIuaCIKZGlmZiAtLWdpdCBhL3Rlc3QvbWFwcGVkX21hdHJpeC5jcHAgYi90ZXN0L21hcHBlZF9tYXRyaXguY3BwCmluZGV4IGY0NjM4ZjYuLmE4ZDE3ZDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvbWFwcGVkX21hdHJpeC5jcHAKKysrIGIvdGVzdC9tYXBwZWRfbWF0cml4LmNwcApAQCAtMTEsMjQgKzExLDI0IEBACiAKICNkZWZpbmUgRUlHRU5fVEVTVE1BUF9NQVhfU0laRSAyNTYKIAotdGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4gdm9pZCBtYXBfY2xhc3NfdmVjdG9yKGNvbnN0IFZlY3RvclR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZT4KK3ZvaWQgbWFwX2NsYXNzX3ZlY3Rvcihjb25zdCBWZWN0b3JUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKIAogICBJbmRleCBzaXplID0gbS5zaXplKCk7CiAKICAgU2NhbGFyKiBhcnJheTEgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplKTsKICAgU2NhbGFyKiBhcnJheTIgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplKTsKLSAgU2NhbGFyKiBhcnJheTMgPSBuZXcgU2NhbGFyW3NpemUrMV07CisgIFNjYWxhciogYXJyYXkzID0gbmV3IFNjYWxhcltzaXplICsgMV07CiAgIC8vIEluIGNhc2Ugb2Ygbm8gYWxpZ25tZW50LCBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvLgogICBjb25zdGV4cHIgaW50IGFsaWdubWVudCA9IChzdGQ6Om1heDxpbnQ+KShFSUdFTl9NQVhfQUxJR05fQllURVMsIDEpOwotICBTY2FsYXIqIGFycmF5M3VuYWxpZ25lZCA9IChzdGQ6OnVpbnRwdHJfdChhcnJheTMpJWFsaWdubWVudCkgPT0gMCA/IGFycmF5MysxIDogYXJyYXkzOwotICBTY2FsYXIgIGFycmF5NFtFSUdFTl9URVNUTUFQX01BWF9TSVpFXTsKKyAgU2NhbGFyKiBhcnJheTN1bmFsaWduZWQgPSAoc3RkOjp1aW50cHRyX3QoYXJyYXkzKSAlIGFsaWdubWVudCkgPT0gMCA/IGFycmF5MyArIDEgOiBhcnJheTM7CisgIFNjYWxhciBhcnJheTRbRUlHRU5fVEVTVE1BUF9NQVhfU0laRV07CiAKICAgTWFwPFZlY3RvclR5cGUsIEFsaWduZWRNYXg+KGFycmF5MSwgc2l6ZSkgPSBWZWN0b3JUeXBlOjpSYW5kb20oc2l6ZSk7Ci0gIE1hcDxWZWN0b3JUeXBlLCBBbGlnbmVkTWF4PihhcnJheTIsIHNpemUpID0gTWFwPFZlY3RvclR5cGUsQWxpZ25lZE1heD4oYXJyYXkxLCBzaXplKTsKKyAgTWFwPFZlY3RvclR5cGUsIEFsaWduZWRNYXg+KGFycmF5Miwgc2l6ZSkgPSBNYXA8VmVjdG9yVHlwZSwgQWxpZ25lZE1heD4oYXJyYXkxLCBzaXplKTsKICAgTWFwPFZlY3RvclR5cGU+KGFycmF5M3VuYWxpZ25lZCwgc2l6ZSkgPSBNYXA8VmVjdG9yVHlwZT4oYXJyYXkxLCBzaXplKTsKLSAgTWFwPFZlY3RvclR5cGU+KGFycmF5NCwgc2l6ZSkgICAgICAgICAgPSBNYXA8VmVjdG9yVHlwZSxBbGlnbmVkTWF4PihhcnJheTEsIHNpemUpOworICBNYXA8VmVjdG9yVHlwZT4oYXJyYXk0LCBzaXplKSA9IE1hcDxWZWN0b3JUeXBlLCBBbGlnbmVkTWF4PihhcnJheTEsIHNpemUpOwogICBWZWN0b3JUeXBlIG1hMSA9IE1hcDxWZWN0b3JUeXBlLCBBbGlnbmVkTWF4PihhcnJheTEsIHNpemUpOwogICBWZWN0b3JUeXBlIG1hMiA9IE1hcDxWZWN0b3JUeXBlLCBBbGlnbmVkTWF4PihhcnJheTIsIHNpemUpOwogICBWZWN0b3JUeXBlIG1hMyA9IE1hcDxWZWN0b3JUeXBlPihhcnJheTN1bmFsaWduZWQsIHNpemUpOwpAQCAtMzYsNDggKzM2LDQ4IEBACiAgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hMik7CiAgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hMyk7CiAgIFZFUklGWV9JU19FUVVBTChtYTEsIG1hNCk7Ci0gICNpZmRlZiBFSUdFTl9WRUNUT1JJWkUKLSAgaWYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6VmVjdG9yaXphYmxlICYmIHNpemU+PUFsaWduZWRNYXgpCi0gICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoKE1hcDxWZWN0b3JUeXBlLEFsaWduZWRNYXg+KGFycmF5M3VuYWxpZ25lZCwgc2l6ZSkpKQotICAjZW5kaWYKKyNpZmRlZiBFSUdFTl9WRUNUT1JJWkUKKyAgaWYgKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OlZlY3Rvcml6YWJsZSAmJiBzaXplID49IEFsaWduZWRNYXgpCisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoKE1hcDxWZWN0b3JUeXBlLCBBbGlnbmVkTWF4PihhcnJheTN1bmFsaWduZWQsIHNpemUpKSkKKyNlbmRpZgogCiAgIGludGVybmFsOjphbGlnbmVkX2RlbGV0ZShhcnJheTEsIHNpemUpOwogICBpbnRlcm5hbDo6YWxpZ25lZF9kZWxldGUoYXJyYXkyLCBzaXplKTsKICAgZGVsZXRlW10gYXJyYXkzOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIG1hcF9jbGFzc19tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBtYXBfY2xhc3NfbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogCi0gIEluZGV4IHJvd3MgPSBtLnJvd3MoKSwgY29scyA9IG0uY29scygpLCBzaXplID0gcm93cypjb2xzOworICBJbmRleCByb3dzID0gbS5yb3dzKCksIGNvbHMgPSBtLmNvbHMoKSwgc2l6ZSA9IHJvd3MgKiBjb2xzOwogICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKIAogICAvLyBhcnJheTEgYW5kIGFycmF5MiAtPiBhbGlnbmVkIGhlYXAgYWxsb2NhdGlvbgogICBTY2FsYXIqIGFycmF5MSA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KHNpemUpOwotICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSBhcnJheTFbaV0gPSBTY2FsYXIoMSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSBhcnJheTFbaV0gPSBTY2FsYXIoMSk7CiAgIFNjYWxhciogYXJyYXkyID0gaW50ZXJuYWw6OmFsaWduZWRfbmV3PFNjYWxhcj4oc2l6ZSk7Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIGFycmF5MltpXSA9IFNjYWxhcigxKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIGFycmF5MltpXSA9IFNjYWxhcigxKTsKICAgLy8gYXJyYXkzdW5hbGlnbmVkIC0+IHVuYWxpZ25lZCBwb2ludGVyIHRvIGhlYXAKLSAgU2NhbGFyKiBhcnJheTMgPSBuZXcgU2NhbGFyW3NpemUrMV07Ci0gIEluZGV4IHNpemVwMSA9IHNpemUgKyAxOyAvLyA8LSB3aXRob3V0IHRoaXMgdGVtcG9yYXJ5IE1TVkMgMjEwMyBnZW5lcmF0ZXMgYmFkIGNvZGUKLSAgZm9yKEluZGV4IGkgPSAwOyBpIDwgc2l6ZXAxOyBpKyspIGFycmF5M1tpXSA9IFNjYWxhcigxKTsKLSAgICAvLyBJbiBjYXNlIG9mIG5vIGFsaWdubWVudCwgYXZvaWQgZGl2aXNpb24gYnkgemVyby4KKyAgU2NhbGFyKiBhcnJheTMgPSBuZXcgU2NhbGFyW3NpemUgKyAxXTsKKyAgSW5kZXggc2l6ZXAxID0gc2l6ZSArIDE7ICAvLyA8LSB3aXRob3V0IHRoaXMgdGVtcG9yYXJ5IE1TVkMgMjEwMyBnZW5lcmF0ZXMgYmFkIGNvZGUKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IHNpemVwMTsgaSsrKSBhcnJheTNbaV0gPSBTY2FsYXIoMSk7CisgIC8vIEluIGNhc2Ugb2Ygbm8gYWxpZ25tZW50LCBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvLgogICBjb25zdGV4cHIgaW50IGFsaWdubWVudCA9IChzdGQ6Om1heDxpbnQ+KShFSUdFTl9NQVhfQUxJR05fQllURVMsIDEpOwotICBTY2FsYXIqIGFycmF5M3VuYWxpZ25lZCA9IChzdGQ6OnVpbnRwdHJfdChhcnJheTMpJWFsaWdubWVudCkgPT0gMCA/IGFycmF5MysxIDogYXJyYXkzOworICBTY2FsYXIqIGFycmF5M3VuYWxpZ25lZCA9IChzdGQ6OnVpbnRwdHJfdChhcnJheTMpICUgYWxpZ25tZW50KSA9PSAwID8gYXJyYXkzICsgMSA6IGFycmF5MzsKICAgU2NhbGFyIGFycmF5NFsyNTZdOwotICBpZihzaXplPD0yNTYpCi0gICAgZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgYXJyYXk0W2ldID0gU2NhbGFyKDEpOworICBpZiAoc2l6ZSA8PSAyNTYpCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIGFycmF5NFtpXSA9IFNjYWxhcigxKTsKIAogICBNYXA8TWF0cml4VHlwZT4gbWFwMShhcnJheTEsIHJvd3MsIGNvbHMpOwogICBNYXA8TWF0cml4VHlwZSwgQWxpZ25lZE1heD4gbWFwMihhcnJheTIsIHJvd3MsIGNvbHMpOwogICBNYXA8TWF0cml4VHlwZT4gbWFwMyhhcnJheTN1bmFsaWduZWQsIHJvd3MsIGNvbHMpOwogICBNYXA8TWF0cml4VHlwZT4gbWFwNChhcnJheTQsIHJvd3MsIGNvbHMpOwogCi0gIFZFUklGWV9JU19FUVVBTChtYXAxLCBNYXRyaXhUeXBlOjpPbmVzKHJvd3MsY29scykpOwotICBWRVJJRllfSVNfRVFVQUwobWFwMiwgTWF0cml4VHlwZTo6T25lcyhyb3dzLGNvbHMpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hcDMsIE1hdHJpeFR5cGU6Ok9uZXMocm93cyxjb2xzKSk7Ci0gIG1hcDEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hcDEsIE1hdHJpeFR5cGU6Ok9uZXMocm93cywgY29scykpOworICBWRVJJRllfSVNfRVFVQUwobWFwMiwgTWF0cml4VHlwZTo6T25lcyhyb3dzLCBjb2xzKSk7CisgIFZFUklGWV9JU19FUVVBTChtYXAzLCBNYXRyaXhUeXBlOjpPbmVzKHJvd3MsIGNvbHMpKTsKKyAgbWFwMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKICAgbWFwMiA9IG1hcDE7CiAgIG1hcDMgPSBtYXAxOwogICBNYXRyaXhUeXBlIG1hMSA9IG1hcDE7CkBAIC04OSwyOCArODksMjcgQEAKICAgVkVSSUZZX0lTX0VRVUFMKG1hMSwgbWEzKTsKICAgVkVSSUZZX0lTX0VRVUFMKG1hMSwgbWFwMyk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChzMSptYXAxLCBzMSptYXAyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzMSptYTEsIHMxKm1hMik7Ci0gIFZFUklGWV9JU19FUVVBTChzMSptYTEsIHMxKm1hMyk7Ci0gIFZFUklGWV9JU19BUFBST1goczEqbWFwMSwgczEqbWFwMyk7CisgIFZFUklGWV9JU19BUFBST1goczEgKiBtYXAxLCBzMSAqIG1hcDIpOworICBWRVJJRllfSVNfQVBQUk9YKHMxICogbWExLCBzMSAqIG1hMik7CisgIFZFUklGWV9JU19FUVVBTChzMSAqIG1hMSwgczEgKiBtYTMpOworICBWRVJJRllfSVNfQVBQUk9YKHMxICogbWFwMSwgczEgKiBtYXAzKTsKIAogICBtYXAyICo9IHMxOwogICBtYXAzICo9IHMxOwotICBWRVJJRllfSVNfQVBQUk9YKHMxKm1hcDEsIG1hcDIpOwotICBWRVJJRllfSVNfQVBQUk9YKHMxKm1hcDEsIG1hcDMpOworICBWRVJJRllfSVNfQVBQUk9YKHMxICogbWFwMSwgbWFwMik7CisgIFZFUklGWV9JU19BUFBST1goczEgKiBtYXAxLCBtYXAzKTsKIAotICBpZihzaXplPD0yNTYpCi0gIHsKLSAgICBWRVJJRllfSVNfRVFVQUwobWFwNCwgTWF0cml4VHlwZTo6T25lcyhyb3dzLGNvbHMpKTsKKyAgaWYgKHNpemUgPD0gMjU2KSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKG1hcDQsIE1hdHJpeFR5cGU6Ok9uZXMocm93cywgY29scykpOwogICAgIG1hcDQgPSBtYXAxOwogICAgIE1hdHJpeFR5cGUgbWE0ID0gbWFwNDsKICAgICBWRVJJRllfSVNfRVFVQUwobWFwMSwgbWFwNCk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKG1hMSwgbWFwNCk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKG1hMSwgbWE0KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHMxKm1hcDEsIHMxKm1hcDQpOworICAgIFZFUklGWV9JU19BUFBST1goczEgKiBtYXAxLCBzMSAqIG1hcDQpOwogCiAgICAgbWFwNCAqPSBzMTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHMxKm1hcDEsIG1hcDQpOworICAgIFZFUklGWV9JU19BUFBST1goczEgKiBtYXAxLCBtYXA0KTsKICAgfQogCiAgIGludGVybmFsOjphbGlnbmVkX2RlbGV0ZShhcnJheTEsIHNpemUpOwpAQCAtMTE4LDE4ICsxMTcsMTggQEAKICAgZGVsZXRlW10gYXJyYXkzOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPiB2b2lkIG1hcF9zdGF0aWNfbWV0aG9kcyhjb25zdCBWZWN0b3JUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvclR5cGU+Cit2b2lkIG1hcF9zdGF0aWNfbWV0aG9kcyhjb25zdCBWZWN0b3JUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKIAogICBJbmRleCBzaXplID0gbS5zaXplKCk7CiAKICAgU2NhbGFyKiBhcnJheTEgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplKTsKICAgU2NhbGFyKiBhcnJheTIgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihzaXplKTsKLSAgU2NhbGFyKiBhcnJheTMgPSBuZXcgU2NhbGFyW3NpemUrMV07Ci0gICAgLy8gSW4gY2FzZSBvZiBubyBhbGlnbm1lbnQsIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm8uCisgIFNjYWxhciogYXJyYXkzID0gbmV3IFNjYWxhcltzaXplICsgMV07CisgIC8vIEluIGNhc2Ugb2Ygbm8gYWxpZ25tZW50LCBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvLgogICBjb25zdGV4cHIgaW50IGFsaWdubWVudCA9IChzdGQ6Om1heDxpbnQ+KShFSUdFTl9NQVhfQUxJR05fQllURVMsIDEpOwotICBTY2FsYXIqIGFycmF5M3VuYWxpZ25lZCA9IChzdGQ6OnVpbnRwdHJfdChhcnJheTMpJWFsaWdubWVudCkgPT0gMCA/IGFycmF5MysxIDogYXJyYXkzOworICBTY2FsYXIqIGFycmF5M3VuYWxpZ25lZCA9IChzdGQ6OnVpbnRwdHJfdChhcnJheTMpICUgYWxpZ25tZW50KSA9PSAwID8gYXJyYXkzICsgMSA6IGFycmF5MzsKIAogICBWZWN0b3JUeXBlOjpNYXBBbGlnbmVkKGFycmF5MSwgc2l6ZSkgPSBWZWN0b3JUeXBlOjpSYW5kb20oc2l6ZSk7CiAgIFZlY3RvclR5cGU6Ok1hcChhcnJheTIsIHNpemUpID0gVmVjdG9yVHlwZTo6TWFwKGFycmF5MSwgc2l6ZSk7CkBAIC0xNDUsNDMgKzE0NCw0MiBAQAogICBkZWxldGVbXSBhcnJheTM7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4gdm9pZCBjaGVja19jb25zdF9jb3JyZWN0bmVzcyhjb25zdCBQbGFpbk9iamVjdFR5cGUmKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4KK3ZvaWQgY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoY29uc3QgUGxhaW5PYmplY3RUeXBlJikgewogICAvLyB0aGVyZSdzIGEgbG90IHRoYXQgd2UgY2FuJ3QgdGVzdCBoZXJlIHdoaWxlIHN0aWxsIGhhdmluZyB0aGlzIHRlc3QgY29tcGlsZSEKICAgLy8gdGhlIG9ubHkgcG9zc2libGUgYXBwcm9hY2ggd291bGQgYmUgdG8gcnVuIGEgc2NyaXB0IHRyeWluZyB0byBjb21waWxlIHN0dWZmIGFuZCBjaGVja2luZyB0aGF0IGl0IGZhaWxzLgogICAvLyBDTWFrZSBjYW4gaGVscCB3aXRoIHRoYXQuCiAKICAgLy8gdmVyaWZ5IHRoYXQgbWFwLXRvLWNvbnN0IGRvbid0IGhhdmUgTHZhbHVlQml0CiAgIHR5cGVkZWYgc3RkOjphZGRfY29uc3RfdDxQbGFpbk9iamVjdFR5cGU+IENvbnN0UGxhaW5PYmplY3RUeXBlOwotICBWRVJJRlkoICEoaW50ZXJuYWw6OnRyYWl0czxNYXA8Q29uc3RQbGFpbk9iamVjdFR5cGU+ID46OkZsYWdzICYgTHZhbHVlQml0KSApOwotICBWRVJJRlkoICEoaW50ZXJuYWw6OnRyYWl0czxNYXA8Q29uc3RQbGFpbk9iamVjdFR5cGUsIEFsaWduZWRNYXg+ID46OkZsYWdzICYgTHZhbHVlQml0KSApOwotICBWRVJJRlkoICEoTWFwPENvbnN0UGxhaW5PYmplY3RUeXBlPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7Ci0gIFZFUklGWSggIShNYXA8Q29uc3RQbGFpbk9iamVjdFR5cGUsIEFsaWduZWRNYXg+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKKyAgVkVSSUZZKCEoaW50ZXJuYWw6OnRyYWl0czxNYXA8Q29uc3RQbGFpbk9iamVjdFR5cGU+ID46OkZsYWdzICYgTHZhbHVlQml0KSk7CisgIFZFUklGWSghKGludGVybmFsOjp0cmFpdHM8TWFwPENvbnN0UGxhaW5PYmplY3RUeXBlLCBBbGlnbmVkTWF4PiA+OjpGbGFncyAmIEx2YWx1ZUJpdCkpOworICBWRVJJRlkoIShNYXA8Q29uc3RQbGFpbk9iamVjdFR5cGU+OjpGbGFncyAmIEx2YWx1ZUJpdCkpOworICBWRVJJRlkoIShNYXA8Q29uc3RQbGFpbk9iamVjdFR5cGUsIEFsaWduZWRNYXg+OjpGbGFncyAmIEx2YWx1ZUJpdCkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QobWFwcGVkX21hdHJpeCkKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggbWFwX2NsYXNzX3ZlY3RvcihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggbWFwX2NsYXNzX3ZlY3RvcihWZWN0b3I0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBtYXBfY2xhc3NfdmVjdG9yKFZlY3RvclhkKDEzKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoTWF0cml4NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggbWFwX2NsYXNzX3ZlY3RvcihSb3dWZWN0b3I0ZigpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBtYXBfY2xhc3NfdmVjdG9yKFZlY3RvclhjZig4KSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggbWFwX2NsYXNzX3ZlY3RvcihWZWN0b3JYaSgxMikpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKFZlY3RvclhpKDEyKSkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChtYXBwZWRfbWF0cml4KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKG1hcF9jbGFzc192ZWN0b3IoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIobWFwX2NsYXNzX3ZlY3RvcihWZWN0b3I0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIobWFwX2NsYXNzX3ZlY3RvcihWZWN0b3JYZCgxMykpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihjaGVja19jb25zdF9jb3JyZWN0bmVzcyhNYXRyaXg0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMobWFwX2NsYXNzX3ZlY3RvcihSb3dWZWN0b3I0ZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQobWFwX2NsYXNzX3ZlY3RvcihWZWN0b3JYY2YoOCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShtYXBfY2xhc3NfdmVjdG9yKFZlY3RvclhpKDEyKSkpOworICAgIENBTExfU1VCVEVTVF81KGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKFZlY3RvclhpKDEyKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzEoIG1hcF9jbGFzc19tYXRyaXgoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBtYXBfY2xhc3NfbWF0cml4KE1hdHJpeDRkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzExKCBtYXBfY2xhc3NfbWF0cml4KE1hdHJpeDxmbG9hdCwzLDU+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIG1hcF9jbGFzc19tYXRyaXgoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLDEwKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCkpKSApOwotICAgIENBTExfU1VCVEVTVF81KCBtYXBfY2xhc3NfbWF0cml4KE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLDEwKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCkpKSApOworICAgIENBTExfU1VCVEVTVF8xKG1hcF9jbGFzc19tYXRyaXgoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIobWFwX2NsYXNzX21hdHJpeChNYXRyaXg0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzExKG1hcF9jbGFzc19tYXRyaXgoTWF0cml4PGZsb2F0LCAzLCA1PigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQobWFwX2NsYXNzX21hdHJpeChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDEwKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDEwKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShtYXBfY2xhc3NfbWF0cml4KE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLCAxMCksIGludGVybmFsOjpyYW5kb208aW50PigxLCAxMCkpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfNiggbWFwX3N0YXRpY19tZXRob2RzKE1hdHJpeDxkb3VibGUsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzcoIG1hcF9zdGF0aWNfbWV0aG9kcyhWZWN0b3IzZigpKSApOwotICAgIENBTExfU1VCVEVTVF84KCBtYXBfc3RhdGljX21ldGhvZHMoUm93VmVjdG9yM2QoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOSggbWFwX3N0YXRpY19tZXRob2RzKFZlY3RvclhjZCg4KSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMTAoIG1hcF9zdGF0aWNfbWV0aG9kcyhWZWN0b3JYZigxMikpICk7CisgICAgQ0FMTF9TVUJURVNUXzYobWFwX3N0YXRpY19tZXRob2RzKE1hdHJpeDxkb3VibGUsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNyhtYXBfc3RhdGljX21ldGhvZHMoVmVjdG9yM2YoKSkpOworICAgIENBTExfU1VCVEVTVF84KG1hcF9zdGF0aWNfbWV0aG9kcyhSb3dWZWN0b3IzZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzkobWFwX3N0YXRpY19tZXRob2RzKFZlY3RvclhjZCg4KSkpOworICAgIENBTExfU1VCVEVTVF8xMChtYXBfc3RhdGljX21ldGhvZHMoVmVjdG9yWGYoMTIpKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvbWFwc3RhdGljbWV0aG9kcy5jcHAgYi90ZXN0L21hcHN0YXRpY21ldGhvZHMuY3BwCmluZGV4IGQwMTI4YmEuLmFjOTBiZGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvbWFwc3RhdGljbWV0aG9kcy5jcHAKKysrIGIvdGVzdC9tYXBzdGF0aWNtZXRob2RzLmNwcApAQCAtMTIsMjQgKzEyLDIwIEBACiAvLyBHQ0M8PTQuOCBoYXMgc3B1cmlvdXMgc2hhZG93IHdhcm5pbmdzLCBiZWNhdXNlIGBwdHJgIHJlLWFwcGVhcnMgaW5zaWRlIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zCiAvLyB3b3JrYXJvdW5kOiBwdXQgdGhlc2UgaW4gYW4gYW5vbnltb3VzIG5hbWVzcGFjZQogbmFtZXNwYWNlIHsKLWZsb2F0ICpwdHI7Ci1jb25zdCBmbG9hdCAqY29uc3RfcHRyOwotfQorZmxvYXQqIHB0cjsKK2NvbnN0IGZsb2F0KiBjb25zdF9wdHI7Cit9ICAvLyBuYW1lc3BhY2UKIAotdGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlLAotICAgICAgICAgYm9vbCBJc0R5bmFtaWNTaXplID0gUGxhaW5PYmplY3RUeXBlOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljLAotICAgICAgICAgYm9vbCBJc1ZlY3RvciA9IFBsYWluT2JqZWN0VHlwZTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lCi0+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlLCBib29sIElzRHluYW1pY1NpemUgPSBQbGFpbk9iamVjdFR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMsCisgICAgICAgICAgYm9vbCBJc1ZlY3RvciA9IFBsYWluT2JqZWN0VHlwZTo6SXNWZWN0b3JBdENvbXBpbGVUaW1lPgogc3RydWN0IG1hcHN0YXRpY21ldGhvZHNfaW1wbCB7fTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlLCBib29sIElzVmVjdG9yPgotc3RydWN0IG1hcHN0YXRpY21ldGhvZHNfaW1wbDxQbGFpbk9iamVjdFR5cGUsIGZhbHNlLCBJc1ZlY3Rvcj4KLXsKLSAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFBsYWluT2JqZWN0VHlwZSYgbSkKLSAgewordGVtcGxhdGUgPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZSwgYm9vbCBJc1ZlY3Rvcj4KK3N0cnVjdCBtYXBzdGF0aWNtZXRob2RzX2ltcGw8UGxhaW5PYmplY3RUeXBlLCBmYWxzZSwgSXNWZWN0b3I+IHsKKyAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFBsYWluT2JqZWN0VHlwZSYgbSkgewogICAgIG1hcHN0YXRpY21ldGhvZHNfaW1wbDxQbGFpbk9iamVjdFR5cGUsIHRydWUsIElzVmVjdG9yPjo6cnVuKG0pOwogCi0gICAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiw1KSwgaiA9IGludGVybmFsOjpyYW5kb208aW50PigyLDUpOworICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsIDUpLCBqID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsIDUpOwogCiAgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyKS5zZXRaZXJvKCk7CiAgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0cikuc2V0WmVybygpOwpAQCAtNTYsMjYgKzUyLDI0IEBACiAgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAoY29uc3RfcHRyLCBPdXRlclN0cmlkZTw0PigpKS5zdW0oKTsKICAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQoY29uc3RfcHRyLCBPdXRlclN0cmlkZTw1PigpKS5zdW0oKTsKIAotICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0ciwgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+KGksaikpLnNldFplcm8oKTsKLSAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQocHRyLCBTdHJpZGU8MixEeW5hbWljPigyLGkpKS5zZXRaZXJvKCk7Ci0gICAgUGxhaW5PYmplY3RUeXBlOjpNYXAoY29uc3RfcHRyLCBTdHJpZGU8RHluYW1pYywzPihpLDMpKS5zdW0oKTsKLSAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQoY29uc3RfcHRyLCBTdHJpZGU8RHluYW1pYywgRHluYW1pYz4oaSxqKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCBTdHJpZGU8RHluYW1pYywgRHluYW1pYz4oaSwgaikpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQocHRyLCBTdHJpZGU8MiwgRHluYW1pYz4oMiwgaSkpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIsIFN0cmlkZTxEeW5hbWljLCAzPihpLCAzKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+KGksIGopKS5zdW0oKTsKIAotICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0ciwgU3RyaWRlPDIsMz4oKSkuc2V0WmVybygpOwotICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIFN0cmlkZTwzLDQ+KCkpLnNldFplcm8oKTsKLSAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIsIFN0cmlkZTwyLDQ+KCkpLnN1bSgpOwotICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIsIFN0cmlkZTw1LDM+KCkpLnN1bSgpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0ciwgU3RyaWRlPDIsIDM+KCkpLnNldFplcm8oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQocHRyLCBTdHJpZGU8MywgND4oKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgU3RyaWRlPDIsIDQ+KCkpLnN1bSgpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIsIFN0cmlkZTw1LCAzPigpKS5zdW0oKTsKICAgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPgotc3RydWN0IG1hcHN0YXRpY21ldGhvZHNfaW1wbDxQbGFpbk9iamVjdFR5cGUsIHRydWUsIGZhbHNlPgotewotICBzdGF0aWMgdm9pZCBydW4oY29uc3QgUGxhaW5PYmplY3RUeXBlJiBtKQotICB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPgorc3RydWN0IG1hcHN0YXRpY21ldGhvZHNfaW1wbDxQbGFpbk9iamVjdFR5cGUsIHRydWUsIGZhbHNlPiB7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBQbGFpbk9iamVjdFR5cGUmIG0pIHsKICAgICBJbmRleCByb3dzID0gbS5yb3dzKCksIGNvbHMgPSBtLmNvbHMoKTsKIAotICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsNSksIGogPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiw1KTsKKyAgICBpbnQgaSA9IGludGVybmFsOjpyYW5kb208aW50PigyLCA1KSwgaiA9IGludGVybmFsOjpyYW5kb208aW50PigyLCA1KTsKIAogICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKHB0ciwgcm93cywgY29scykuc2V0WmVybygpOwogICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIHJvd3MsIGNvbHMpLnNldFplcm8oKTsKQEAgLTEwMiwyNiArOTYsMjQgQEAKICAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIsIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPDQ+KCkpLnN1bSgpOwogICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIsIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPDU+KCkpLnN1bSgpOwogCi0gICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCByb3dzLCBjb2xzLCBTdHJpZGU8RHluYW1pYywgRHluYW1pYz4oaSxqKSkuc2V0WmVybygpOwotICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIHJvd3MsIGNvbHMsIFN0cmlkZTwyLER5bmFtaWM+KDIsaSkpLnNldFplcm8oKTsKLSAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChjb25zdF9wdHIsIHJvd3MsIGNvbHMsIFN0cmlkZTxEeW5hbWljLDM+KGksMykpLnN1bSgpOwotICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChjb25zdF9wdHIsIHJvd3MsIGNvbHMsIFN0cmlkZTxEeW5hbWljLCBEeW5hbWljPihpLGopKS5zdW0oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcChwdHIsIHJvd3MsIGNvbHMsIFN0cmlkZTxEeW5hbWljLCBEeW5hbWljPihpLCBqKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIHJvd3MsIGNvbHMsIFN0cmlkZTwyLCBEeW5hbWljPigyLCBpKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgcm93cywgY29scywgU3RyaWRlPER5bmFtaWMsIDM+KGksIDMpKS5zdW0oKTsKKyAgICBQbGFpbk9iamVjdFR5cGU6Ok1hcEFsaWduZWQoY29uc3RfcHRyLCByb3dzLCBjb2xzLCBTdHJpZGU8RHluYW1pYywgRHluYW1pYz4oaSwgaikpLnN1bSgpOwogCi0gICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCByb3dzLCBjb2xzLCBTdHJpZGU8MiwzPigpKS5zZXRaZXJvKCk7Ci0gICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgcm93cywgY29scywgU3RyaWRlPDMsND4oKSkuc2V0WmVybygpOwotICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwKGNvbnN0X3B0ciwgcm93cywgY29scywgU3RyaWRlPDIsND4oKSkuc3VtKCk7Ci0gICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgcm93cywgY29scywgU3RyaWRlPDUsMz4oKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCByb3dzLCBjb2xzLCBTdHJpZGU8MiwgMz4oKSkuc2V0WmVybygpOworICAgIFBsYWluT2JqZWN0VHlwZTo6TWFwQWxpZ25lZChwdHIsIHJvd3MsIGNvbHMsIFN0cmlkZTwzLCA0PigpKS5zZXRaZXJvKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAoY29uc3RfcHRyLCByb3dzLCBjb2xzLCBTdHJpZGU8MiwgND4oKSkuc3VtKCk7CisgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKGNvbnN0X3B0ciwgcm93cywgY29scywgU3RyaWRlPDUsIDM+KCkpLnN1bSgpOwogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU+Ci1zdHJ1Y3QgbWFwc3RhdGljbWV0aG9kc19pbXBsPFBsYWluT2JqZWN0VHlwZSwgdHJ1ZSwgdHJ1ZT4KLXsKLSAgc3RhdGljIHZvaWQgcnVuKGNvbnN0IFBsYWluT2JqZWN0VHlwZSYgdikKLSAgewordGVtcGxhdGUgPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4KK3N0cnVjdCBtYXBzdGF0aWNtZXRob2RzX2ltcGw8UGxhaW5PYmplY3RUeXBlLCB0cnVlLCB0cnVlPiB7CisgIHN0YXRpYyB2b2lkIHJ1bihjb25zdCBQbGFpbk9iamVjdFR5cGUmIHYpIHsKICAgICBJbmRleCBzaXplID0gdi5zaXplKCk7CiAKLSAgICBpbnQgaSA9IGludGVybmFsOjpyYW5kb208aW50PigyLDUpOworICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsIDUpOwogCiAgICAgUGxhaW5PYmplY3RUeXBlOjpNYXAocHRyLCBzaXplKS5zZXRaZXJvKCk7CiAgICAgUGxhaW5PYmplY3RUeXBlOjpNYXBBbGlnbmVkKHB0ciwgc2l6ZSkuc2V0WmVybygpOwpAQCAtMTQwLDM4ICsxMzIsMzUgQEAKICAgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgUGxhaW5PYmplY3RUeXBlPgotdm9pZCBtYXBzdGF0aWNtZXRob2RzKGNvbnN0IFBsYWluT2JqZWN0VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU+Cit2b2lkIG1hcHN0YXRpY21ldGhvZHMoY29uc3QgUGxhaW5PYmplY3RUeXBlJiBtKSB7CiAgIG1hcHN0YXRpY21ldGhvZHNfaW1wbDxQbGFpbk9iamVjdFR5cGU+OjpydW4obSk7Ci0gIFZFUklGWSh0cnVlKTsgLy8ganVzdCB0byBhdm9pZCAndW51c2VkIGZ1bmN0aW9uJyB3YXJuaW5nCisgIFZFUklGWSh0cnVlKTsgIC8vIGp1c3QgdG8gYXZvaWQgJ3VudXNlZCBmdW5jdGlvbicgd2FybmluZwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QobWFwc3RhdGljbWV0aG9kcykKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChtYXBzdGF0aWNtZXRob2RzKSB7CiAgIHB0ciA9IGludGVybmFsOjphbGlnbmVkX25ldzxmbG9hdD4oMTAwMCk7Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHB0cltpXSA9IGZsb2F0KGkpOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgcHRyW2ldID0gZmxvYXQoaSk7CiAKICAgY29uc3RfcHRyID0gcHRyOwogCi0gIENBTExfU1VCVEVTVF8xKCggbWFwc3RhdGljbWV0aG9kcyhNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICkpOwotICBDQUxMX1NVQlRFU1RfMSgoIG1hcHN0YXRpY21ldGhvZHMoVmVjdG9yMmYoKSkgKSk7Ci0gIENBTExfU1VCVEVTVF8yKCggbWFwc3RhdGljbWV0aG9kcyhWZWN0b3IzZigpKSApKTsKLSAgQ0FMTF9TVUJURVNUXzIoKCBtYXBzdGF0aWNtZXRob2RzKE1hdHJpeDJmKCkpICkpOwotICBDQUxMX1NVQlRFU1RfMygoIG1hcHN0YXRpY21ldGhvZHMoTWF0cml4NGYoKSkgKSk7Ci0gIENBTExfU1VCVEVTVF8zKCggbWFwc3RhdGljbWV0aG9kcyhBcnJheTRmKCkpICkpOwotICBDQUxMX1NVQlRFU1RfNCgoIG1hcHN0YXRpY21ldGhvZHMoQXJyYXkzZigpKSApKTsKLSAgQ0FMTF9TVUJURVNUXzQoKCBtYXBzdGF0aWNtZXRob2RzKEFycmF5MzNmKCkpICkpOwotICBDQUxMX1NVQlRFU1RfNSgoIG1hcHN0YXRpY21ldGhvZHMoQXJyYXk0NGYoKSkgKSk7Ci0gIENBTExfU1VCVEVTVF81KCggbWFwc3RhdGljbWV0aG9kcyhWZWN0b3JYZigxKSkgKSk7Ci0gIENBTExfU1VCVEVTVF81KCggbWFwc3RhdGljbWV0aG9kcyhWZWN0b3JYZig4KSkgKSk7Ci0gIENBTExfU1VCVEVTVF82KCggbWFwc3RhdGljbWV0aG9kcyhNYXRyaXhYZigxLDEpKSApKTsKLSAgQ0FMTF9TVUJURVNUXzYoKCBtYXBzdGF0aWNtZXRob2RzKE1hdHJpeFhmKDUsNykpICkpOwotICBDQUxMX1NVQlRFU1RfNygoIG1hcHN0YXRpY21ldGhvZHMoQXJyYXlYZigxKSkgKSk7Ci0gIENBTExfU1VCVEVTVF83KCggbWFwc3RhdGljbWV0aG9kcyhBcnJheVhmKDUpKSApKTsKLSAgQ0FMTF9TVUJURVNUXzgoKCBtYXBzdGF0aWNtZXRob2RzKEFycmF5WFhmKDEsMSkpICkpOwotICBDQUxMX1NVQlRFU1RfOCgoIG1hcHN0YXRpY21ldGhvZHMoQXJyYXlYWGYoOCw2KSkgKSk7CisgIENBTExfU1VCVEVTVF8xKChtYXBzdGF0aWNtZXRob2RzKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoKG1hcHN0YXRpY21ldGhvZHMoVmVjdG9yMmYoKSkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoKG1hcHN0YXRpY21ldGhvZHMoVmVjdG9yM2YoKSkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoKG1hcHN0YXRpY21ldGhvZHMoTWF0cml4MmYoKSkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoKG1hcHN0YXRpY21ldGhvZHMoTWF0cml4NGYoKSkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoKG1hcHN0YXRpY21ldGhvZHMoQXJyYXk0ZigpKSkpOworICBDQUxMX1NVQlRFU1RfNCgobWFwc3RhdGljbWV0aG9kcyhBcnJheTNmKCkpKSk7CisgIENBTExfU1VCVEVTVF80KChtYXBzdGF0aWNtZXRob2RzKEFycmF5MzNmKCkpKSk7CisgIENBTExfU1VCVEVTVF81KChtYXBzdGF0aWNtZXRob2RzKEFycmF5NDRmKCkpKSk7CisgIENBTExfU1VCVEVTVF81KChtYXBzdGF0aWNtZXRob2RzKFZlY3RvclhmKDEpKSkpOworICBDQUxMX1NVQlRFU1RfNSgobWFwc3RhdGljbWV0aG9kcyhWZWN0b3JYZig4KSkpKTsKKyAgQ0FMTF9TVUJURVNUXzYoKG1hcHN0YXRpY21ldGhvZHMoTWF0cml4WGYoMSwgMSkpKSk7CisgIENBTExfU1VCVEVTVF82KChtYXBzdGF0aWNtZXRob2RzKE1hdHJpeFhmKDUsIDcpKSkpOworICBDQUxMX1NVQlRFU1RfNygobWFwc3RhdGljbWV0aG9kcyhBcnJheVhmKDEpKSkpOworICBDQUxMX1NVQlRFU1RfNygobWFwc3RhdGljbWV0aG9kcyhBcnJheVhmKDUpKSkpOworICBDQUxMX1NVQlRFU1RfOCgobWFwc3RhdGljbWV0aG9kcyhBcnJheVhYZigxLCAxKSkpKTsKKyAgQ0FMTF9TVUJURVNUXzgoKG1hcHN0YXRpY21ldGhvZHMoQXJyYXlYWGYoOCwgNikpKSk7CiAKICAgaW50ZXJuYWw6OmFsaWduZWRfZGVsZXRlKHB0ciwgMTAwMCk7CiB9Ci0KZGlmZiAtLWdpdCBhL3Rlc3QvbWFwc3RyaWRlLmNwcCBiL3Rlc3QvbWFwc3RyaWRlLmNwcAppbmRleCAxMDdlMWUzLi4yMjQzMTZmIDEwMDY0NAotLS0gYS90ZXN0L21hcHN0cmlkZS5jcHAKKysrIGIvdGVzdC9tYXBzdHJpZGUuY3BwCkBAIC05LDI3ICs5LDI4IEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAKLXRlbXBsYXRlPGludCBBbGlnbm1lbnQsdHlwZW5hbWUgVmVjdG9yVHlwZT4gdm9pZCBtYXBfY2xhc3NfdmVjdG9yKGNvbnN0IFZlY3RvclR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8aW50IEFsaWdubWVudCwgdHlwZW5hbWUgVmVjdG9yVHlwZT4KK3ZvaWQgbWFwX2NsYXNzX3ZlY3Rvcihjb25zdCBWZWN0b3JUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKIAogICBJbmRleCBzaXplID0gbS5zaXplKCk7CiAKICAgVmVjdG9yVHlwZSB2ID0gVmVjdG9yVHlwZTo6UmFuZG9tKHNpemUpOwogCi0gIEluZGV4IGFycmF5c2l6ZSA9IDMqc2l6ZTsKLSAgCi0gIFNjYWxhciogYV9hcnJheSA9IGludGVybmFsOjphbGlnbmVkX25ldzxTY2FsYXI+KGFycmF5c2l6ZSsxKTsKKyAgSW5kZXggYXJyYXlzaXplID0gMyAqIHNpemU7CisKKyAgU2NhbGFyKiBhX2FycmF5ID0gaW50ZXJuYWw6OmFsaWduZWRfbmV3PFNjYWxhcj4oYXJyYXlzaXplICsgMSk7CiAgIFNjYWxhciogYXJyYXkgPSBhX2FycmF5OwotICBpZihBbGlnbm1lbnQhPUFsaWduZWQpCi0gICAgYXJyYXkgPSAoU2NhbGFyKikoc3RkOjppbnRwdHJfdChhX2FycmF5KSArIChpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpBbGlnbmVkT25TY2FsYXI/c2l6ZW9mKFNjYWxhcik6c2l6ZW9mKHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsKSkpOworICBpZiAoQWxpZ25tZW50ICE9IEFsaWduZWQpCisgICAgYXJyYXkgPSAoU2NhbGFyKikoc3RkOjppbnRwdHJfdChhX2FycmF5KSArIChpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpBbGlnbmVkT25TY2FsYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNpemVvZihTY2FsYXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzaXplb2YodHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwpKSk7CiAKICAgewogICAgIE1hcDxWZWN0b3JUeXBlLCBBbGlnbm1lbnQsIElubmVyU3RyaWRlPDM+ID4gbWFwKGFycmF5LCBzaXplKTsKICAgICBtYXAgPSB2OwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpCi0gICAgewotICAgICAgVkVSSUZZX0lTX0VRVUFMKGFycmF5WzMqaV0sIHZbaV0pOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwoYXJyYXlbMyAqIGldLCB2W2ldKTsKICAgICAgIFZFUklGWV9JU19FUVVBTChtYXBbaV0sIHZbaV0pOwogICAgIH0KICAgfQpAQCAtMzcsMjI3ICszOCwyMzAgQEAKICAgewogICAgIE1hcDxWZWN0b3JUeXBlLCBVbmFsaWduZWQsIElubmVyU3RyaWRlPER5bmFtaWM+ID4gbWFwKGFycmF5LCBzaXplLCBJbm5lclN0cmlkZTxEeW5hbWljPigyKSk7CiAgICAgbWFwID0gdjsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQotICAgIHsKLSAgICAgIFZFUklGWV9JU19FUVVBTChhcnJheVsyKmldLCB2W2ldKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKGFycmF5WzIgKiBpXSwgdltpXSk7CiAgICAgICBWRVJJRllfSVNfRVFVQUwobWFwW2ldLCB2W2ldKTsKICAgICB9CiAgIH0KIAotICBpbnRlcm5hbDo6YWxpZ25lZF9kZWxldGUoYV9hcnJheSwgYXJyYXlzaXplKzEpOworICBpbnRlcm5hbDo6YWxpZ25lZF9kZWxldGUoYV9hcnJheSwgYXJyYXlzaXplICsgMSk7CiB9CiAKLXRlbXBsYXRlPGludCBBbGlnbm1lbnQsdHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBtYXBfY2xhc3NfbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIF9tKQotewordGVtcGxhdGUgPGludCBBbGlnbm1lbnQsIHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIG1hcF9jbGFzc19tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgX20pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogCiAgIEluZGV4IHJvd3MgPSBfbS5yb3dzKCksIGNvbHMgPSBfbS5jb2xzKCk7CiAKLSAgTWF0cml4VHlwZSBtID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIE1hdHJpeFR5cGUgbSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKICAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAKLSAgSW5kZXggYXJyYXlzaXplID0gNCoocm93cys0KSooY29scys0KTsKKyAgSW5kZXggYXJyYXlzaXplID0gNCAqIChyb3dzICsgNCkgKiAoY29scyArIDQpOwogCi0gIFNjYWxhciogYV9hcnJheTEgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihhcnJheXNpemUrMSk7CisgIFNjYWxhciogYV9hcnJheTEgPSBpbnRlcm5hbDo6YWxpZ25lZF9uZXc8U2NhbGFyPihhcnJheXNpemUgKyAxKTsKICAgU2NhbGFyKiBhcnJheTEgPSBhX2FycmF5MTsKLSAgaWYoQWxpZ25tZW50IT1BbGlnbmVkKQotICAgIGFycmF5MSA9IChTY2FsYXIqKShzdGQ6OmludHB0cl90KGFfYXJyYXkxKSArIChpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpBbGlnbmVkT25TY2FsYXI/c2l6ZW9mKFNjYWxhcik6c2l6ZW9mKHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsKSkpOworICBpZiAoQWxpZ25tZW50ICE9IEFsaWduZWQpCisgICAgYXJyYXkxID0gKFNjYWxhciopKHN0ZDo6aW50cHRyX3QoYV9hcnJheTEpICsgKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OkFsaWduZWRPblNjYWxhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzaXplb2YoU2NhbGFyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzaXplb2YodHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwpKSk7CiAKICAgU2NhbGFyIGFfYXJyYXkyWzI1Nl07CiAgIFNjYWxhciogYXJyYXkyID0gYV9hcnJheTI7Ci0gIGlmKEFsaWdubWVudCE9QWxpZ25lZCkgewotICAgIGFycmF5MiA9IChTY2FsYXIqKShzdGQ6OmludHB0cl90KGFfYXJyYXkyKSArIChpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpBbGlnbmVkT25TY2FsYXI/c2l6ZW9mKFNjYWxhcik6c2l6ZW9mKHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsKSkpOworICBpZiAoQWxpZ25tZW50ICE9IEFsaWduZWQpIHsKKyAgICBhcnJheTIgPSAoU2NhbGFyKikoc3RkOjppbnRwdHJfdChhX2FycmF5MikgKyAoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6QWxpZ25lZE9uU2NhbGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNpemVvZihTY2FsYXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNpemVvZih0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCkpKTsKICAgfSBlbHNlIHsKICAgICAvLyBJbiBjYXNlIHRoZXJlIGlzIG5vIGFsaWdubWVudCwgZGVmYXVsdCB0byBwb2ludGluZyB0byB0aGUgc3RhcnQuCiAgICAgY29uc3RleHByIGludCBhbGlnbm1lbnQgPSAoc3RkOjptYXg8aW50PikoRUlHRU5fTUFYX0FMSUdOX0JZVEVTLCAxKTsKLSAgICBhcnJheTIgPSAoU2NhbGFyKikoKChzdGQ6OnVpbnRwdHJfdChhX2FycmF5MikrYWxpZ25tZW50LTEpL2FsaWdubWVudCkqYWxpZ25tZW50KTsKKyAgICBhcnJheTIgPSAoU2NhbGFyKikoKChzdGQ6OnVpbnRwdHJfdChhX2FycmF5MikgKyBhbGlnbm1lbnQgLSAxKSAvIGFsaWdubWVudCkgKiBhbGlnbm1lbnQpOwogICB9CiAgIEluZGV4IG1heHNpemUyID0gYV9hcnJheTIgLSBhcnJheTIgKyAyNTY7Ci0gIAorCiAgIC8vIHRlc3Qgbm8gaW5uZXIgc3RyaWRlIGFuZCBzb21lIGR5bmFtaWMgb3V0ZXIgc3RyaWRlCi0gIGZvcihpbnQgaz0wOyBrPDI7ICsraykKLSAgewotICAgIGlmKGs9PTEgJiYgKG0uaW5uZXJTaXplKCkrMSkqbS5vdXRlclNpemUoKSA+IG1heHNpemUyKQotICAgICAgYnJlYWs7Ci0gICAgU2NhbGFyKiBhcnJheSA9IChrPT0wID8gYXJyYXkxIDogYXJyYXkyKTsKLSAgICAKLSAgICBNYXA8TWF0cml4VHlwZSwgQWxpZ25tZW50LCBPdXRlclN0cmlkZTxEeW5hbWljPiA+IG1hcChhcnJheSwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8RHluYW1pYz4obS5pbm5lclNpemUoKSsxKSk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgMjsgKytrKSB7CisgICAgaWYgKGsgPT0gMSAmJiAobS5pbm5lclNpemUoKSArIDEpICogbS5vdXRlclNpemUoKSA+IG1heHNpemUyKSBicmVhazsKKyAgICBTY2FsYXIqIGFycmF5ID0gKGsgPT0gMCA/IGFycmF5MSA6IGFycmF5Mik7CisKKyAgICBNYXA8TWF0cml4VHlwZSwgQWxpZ25tZW50LCBPdXRlclN0cmlkZTxEeW5hbWljPiA+IG1hcChhcnJheSwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8RHluYW1pYz4obS5pbm5lclNpemUoKSArIDEpKTsKICAgICBtYXAgPSBtOwotICAgIFZFUklGWShtYXAub3V0ZXJTdHJpZGUoKSA9PSBtYXAuaW5uZXJTaXplKCkrMSk7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IG0ub3V0ZXJTaXplKCk7ICsraSkKLSAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBtLmlubmVyU2l6ZSgpOyArK2opCi0gICAgICB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChhcnJheVttYXAub3V0ZXJTdHJpZGUoKSppK2pdLCBtLmNvZWZmQnlPdXRlcklubmVyKGksaikpOwotICAgICAgICBWRVJJRllfSVNfRVFVQUwobWFwLmNvZWZmQnlPdXRlcklubmVyKGksaiksIG0uY29lZmZCeU91dGVySW5uZXIoaSxqKSk7CisgICAgVkVSSUZZKG1hcC5vdXRlclN0cmlkZSgpID09IG1hcC5pbm5lclNpemUoKSArIDEpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbS5vdXRlclNpemUoKTsgKytpKQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtLmlubmVyU2l6ZSgpOyArK2opIHsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGFycmF5W21hcC5vdXRlclN0cmlkZSgpICogaSArIGpdLCBtLmNvZWZmQnlPdXRlcklubmVyKGksIGopKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1hcC5jb2VmZkJ5T3V0ZXJJbm5lcihpLCBqKSwgbS5jb2VmZkJ5T3V0ZXJJbm5lcihpLCBqKSk7CiAgICAgICB9Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChzMSptYXAsczEqbSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzMSAqIG1hcCwgczEgKiBtKTsKICAgICBtYXAgKj0gczE7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtYXAsczEqbSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXAsIHMxICogbSk7CiAgIH0KIAogICAvLyB0ZXN0IG5vIGlubmVyIHN0cmlkZSBhbmQgYW4gb3V0ZXIgc3RyaWRlIG9mICs0LiBUaGlzIGlzIHF1aXRlIGltcG9ydGFudCBhcyBmb3IgZml4ZWQtc2l6ZSBtYXRyaWNlcywKICAgLy8gdGhpcyBhbGxvd3MgdG8gaGl0IHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgaXQncyB2ZWN0b3JpemFibGUuCi0gIGZvcihpbnQgaz0wOyBrPDI7ICsraykKLSAgewotICAgIGlmKGs9PTEgJiYgKG0uaW5uZXJTaXplKCkrNCkqbS5vdXRlclNpemUoKSA+IG1heHNpemUyKQotICAgICAgYnJlYWs7Ci0gICAgU2NhbGFyKiBhcnJheSA9IChrPT0wID8gYXJyYXkxIDogYXJyYXkyKTsKLSAgICAKKyAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIHsKKyAgICBpZiAoayA9PSAxICYmIChtLmlubmVyU2l6ZSgpICsgNCkgKiBtLm91dGVyU2l6ZSgpID4gbWF4c2l6ZTIpIGJyZWFrOworICAgIFNjYWxhciogYXJyYXkgPSAoayA9PSAwID8gYXJyYXkxIDogYXJyYXkyKTsKKwogICAgIGVudW0gewogICAgICAgSW5uZXJTaXplID0gTWF0cml4VHlwZTo6SW5uZXJTaXplQXRDb21waWxlVGltZSwKLSAgICAgIE91dGVyU3RyaWRlQXRDb21waWxlVGltZSA9IElubmVyU2l6ZT09RHluYW1pYyA/IER5bmFtaWMgOiBJbm5lclNpemUrNAorICAgICAgT3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lID0gSW5uZXJTaXplID09IER5bmFtaWMgPyBEeW5hbWljIDogSW5uZXJTaXplICsgNAogICAgIH07Ci0gICAgTWFwPE1hdHJpeFR5cGUsIEFsaWdubWVudCwgT3V0ZXJTdHJpZGU8T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lPiA+Ci0gICAgICBtYXAoYXJyYXksIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPE91dGVyU3RyaWRlQXRDb21waWxlVGltZT4obS5pbm5lclNpemUoKSs0KSk7CisgICAgTWFwPE1hdHJpeFR5cGUsIEFsaWdubWVudCwgT3V0ZXJTdHJpZGU8T3V0ZXJTdHJpZGVBdENvbXBpbGVUaW1lPiA+IG1hcCgKKyAgICAgICAgYXJyYXksIHJvd3MsIGNvbHMsIE91dGVyU3RyaWRlPE91dGVyU3RyaWRlQXRDb21waWxlVGltZT4obS5pbm5lclNpemUoKSArIDQpKTsKICAgICBtYXAgPSBtOwotICAgIFZFUklGWShtYXAub3V0ZXJTdHJpZGUoKSA9PSBtYXAuaW5uZXJTaXplKCkrNCk7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IG0ub3V0ZXJTaXplKCk7ICsraSkKLSAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBtLmlubmVyU2l6ZSgpOyArK2opCi0gICAgICB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChhcnJheVttYXAub3V0ZXJTdHJpZGUoKSppK2pdLCBtLmNvZWZmQnlPdXRlcklubmVyKGksaikpOwotICAgICAgICBWRVJJRllfSVNfRVFVQUwobWFwLmNvZWZmQnlPdXRlcklubmVyKGksaiksIG0uY29lZmZCeU91dGVySW5uZXIoaSxqKSk7CisgICAgVkVSSUZZKG1hcC5vdXRlclN0cmlkZSgpID09IG1hcC5pbm5lclNpemUoKSArIDQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbS5vdXRlclNpemUoKTsgKytpKQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtLmlubmVyU2l6ZSgpOyArK2opIHsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGFycmF5W21hcC5vdXRlclN0cmlkZSgpICogaSArIGpdLCBtLmNvZWZmQnlPdXRlcklubmVyKGksIGopKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1hcC5jb2VmZkJ5T3V0ZXJJbm5lcihpLCBqKSwgbS5jb2VmZkJ5T3V0ZXJJbm5lcihpLCBqKSk7CiAgICAgICB9Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChzMSptYXAsczEqbSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzMSAqIG1hcCwgczEgKiBtKTsKICAgICBtYXAgKj0gczE7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtYXAsczEqbSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXAsIHMxICogbSk7CiAgIH0KIAogICAvLyB0ZXN0IGJvdGggaW5uZXIgc3RyaWRlIGFuZCBvdXRlciBzdHJpZGUKLSAgZm9yKGludCBrPTA7IGs8MjsgKytrKQotICB7Ci0gICAgaWYoaz09MSAmJiAoMiptLmlubmVyU2l6ZSgpKzEpKihtLm91dGVyU2l6ZSgpKjIpID4gbWF4c2l6ZTIpCi0gICAgICBicmVhazsKLSAgICBTY2FsYXIqIGFycmF5ID0gKGs9PTAgPyBhcnJheTEgOiBhcnJheTIpOwotICAgIAotICAgIE1hcDxNYXRyaXhUeXBlLCBBbGlnbm1lbnQsIFN0cmlkZTxEeW5hbWljLER5bmFtaWM+ID4gbWFwKGFycmF5LCByb3dzLCBjb2xzLCBTdHJpZGU8RHluYW1pYyxEeW5hbWljPigyKm0uaW5uZXJTaXplKCkrMSwgMikpOworICBmb3IgKGludCBrID0gMDsgayA8IDI7ICsraykgeworICAgIGlmIChrID09IDEgJiYgKDIgKiBtLmlubmVyU2l6ZSgpICsgMSkgKiAobS5vdXRlclNpemUoKSAqIDIpID4gbWF4c2l6ZTIpIGJyZWFrOworICAgIFNjYWxhciogYXJyYXkgPSAoayA9PSAwID8gYXJyYXkxIDogYXJyYXkyKTsKKworICAgIE1hcDxNYXRyaXhUeXBlLCBBbGlnbm1lbnQsIFN0cmlkZTxEeW5hbWljLCBEeW5hbWljPiA+IG1hcChhcnJheSwgcm93cywgY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+KDIgKiBtLmlubmVyU2l6ZSgpICsgMSwgMikpOwogICAgIG1hcCA9IG07Ci0gICAgVkVSSUZZKG1hcC5vdXRlclN0cmlkZSgpID09IDIqbWFwLmlubmVyU2l6ZSgpKzEpOworICAgIFZFUklGWShtYXAub3V0ZXJTdHJpZGUoKSA9PSAyICogbWFwLmlubmVyU2l6ZSgpICsgMSk7CiAgICAgVkVSSUZZKG1hcC5pbm5lclN0cmlkZSgpID09IDIpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtLm91dGVyU2l6ZSgpOyArK2kpCi0gICAgICBmb3IoaW50IGogPSAwOyBqIDwgbS5pbm5lclNpemUoKTsgKytqKQotICAgICAgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwoYXJyYXlbbWFwLm91dGVyU3RyaWRlKCkqaSttYXAuaW5uZXJTdHJpZGUoKSpqXSwgbS5jb2VmZkJ5T3V0ZXJJbm5lcihpLGopKTsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1hcC5jb2VmZkJ5T3V0ZXJJbm5lcihpLGopLCBtLmNvZWZmQnlPdXRlcklubmVyKGksaikpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbS5vdXRlclNpemUoKTsgKytpKQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtLmlubmVyU2l6ZSgpOyArK2opIHsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGFycmF5W21hcC5vdXRlclN0cmlkZSgpICogaSArIG1hcC5pbm5lclN0cmlkZSgpICogal0sIG0uY29lZmZCeU91dGVySW5uZXIoaSwgaikpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwobWFwLmNvZWZmQnlPdXRlcklubmVyKGksIGopLCBtLmNvZWZmQnlPdXRlcklubmVyKGksIGopKTsKICAgICAgIH0KLSAgICBWRVJJRllfSVNfQVBQUk9YKHMxKm1hcCxzMSptKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHMxICogbWFwLCBzMSAqIG0pOwogICAgIG1hcCAqPSBzMTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG1hcCxzMSptKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1hcCwgczEgKiBtKTsKICAgfQogCiAgIC8vIHRlc3QgaW5uZXIgc3RyaWRlIGFuZCBubyBvdXRlciBzdHJpZGUKLSAgZm9yKGludCBrPTA7IGs8MjsgKytrKQotICB7Ci0gICAgaWYoaz09MSAmJiAobS5pbm5lclNpemUoKSoyKSptLm91dGVyU2l6ZSgpID4gbWF4c2l6ZTIpCi0gICAgICBicmVhazsKLSAgICBTY2FsYXIqIGFycmF5ID0gKGs9PTAgPyBhcnJheTEgOiBhcnJheTIpOworICBmb3IgKGludCBrID0gMDsgayA8IDI7ICsraykgeworICAgIGlmIChrID09IDEgJiYgKG0uaW5uZXJTaXplKCkgKiAyKSAqIG0ub3V0ZXJTaXplKCkgPiBtYXhzaXplMikgYnJlYWs7CisgICAgU2NhbGFyKiBhcnJheSA9IChrID09IDAgPyBhcnJheTEgOiBhcnJheTIpOwogCiAgICAgTWFwPE1hdHJpeFR5cGUsIEFsaWdubWVudCwgSW5uZXJTdHJpZGU8RHluYW1pYz4gPiBtYXAoYXJyYXksIHJvd3MsIGNvbHMsIElubmVyU3RyaWRlPER5bmFtaWM+KDIpKTsKICAgICBtYXAgPSBtOwotICAgIFZFUklGWShtYXAub3V0ZXJTdHJpZGUoKSA9PSBtYXAuaW5uZXJTaXplKCkqMik7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IG0ub3V0ZXJTaXplKCk7ICsraSkKLSAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBtLmlubmVyU2l6ZSgpOyArK2opCi0gICAgICB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChhcnJheVttYXAuaW5uZXJTaXplKCkqaSoyK2oqMl0sIG0uY29lZmZCeU91dGVySW5uZXIoaSxqKSk7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChtYXAuY29lZmZCeU91dGVySW5uZXIoaSxqKSwgbS5jb2VmZkJ5T3V0ZXJJbm5lcihpLGopKTsKKyAgICBWRVJJRlkobWFwLm91dGVyU3RyaWRlKCkgPT0gbWFwLmlubmVyU2l6ZSgpICogMik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtLm91dGVyU2l6ZSgpOyArK2kpCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG0uaW5uZXJTaXplKCk7ICsraikgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwoYXJyYXlbbWFwLmlubmVyU2l6ZSgpICogaSAqIDIgKyBqICogMl0sIG0uY29lZmZCeU91dGVySW5uZXIoaSwgaikpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwobWFwLmNvZWZmQnlPdXRlcklubmVyKGksIGopLCBtLmNvZWZmQnlPdXRlcklubmVyKGksIGopKTsKICAgICAgIH0KLSAgICBWRVJJRllfSVNfQVBQUk9YKHMxKm1hcCxzMSptKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHMxICogbWFwLCBzMSAqIG0pOwogICAgIG1hcCAqPSBzMTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG1hcCxzMSptKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1hcCwgczEgKiBtKTsKICAgfQogCiAgIC8vIHRlc3QgbmVnYXRpdmUgc3RyaWRlcwogICB7Ci0gICAgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+OjpNYXAoYV9hcnJheTEsIGFycmF5c2l6ZSsxKS5zZXRSYW5kb20oKTsKLSAgICBJbmRleCBvdXRlcnN0cmlkZSA9IG0uaW5uZXJTaXplKCkrNDsKKyAgICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPjo6TWFwKGFfYXJyYXkxLCBhcnJheXNpemUgKyAxKS5zZXRSYW5kb20oKTsKKyAgICBJbmRleCBvdXRlcnN0cmlkZSA9IG0uaW5uZXJTaXplKCkgKyA0OwogICAgIFNjYWxhciogYXJyYXkgPSBhcnJheTE7CiAKICAgICB7Ci0gICAgICBNYXA8TWF0cml4VHlwZSwgQWxpZ25tZW50LCBPdXRlclN0cmlkZTw+ID4gbWFwMShhcnJheSwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8Piggb3V0ZXJzdHJpZGUpKTsKLSAgICAgIE1hcDxNYXRyaXhUeXBlLCBVbmFsaWduZWQsIE91dGVyU3RyaWRlPD4gPiBtYXAyKGFycmF5KyhtLm91dGVyU2l6ZSgpLTEpKm91dGVyc3RyaWRlLCByb3dzLCBjb2xzLCBPdXRlclN0cmlkZTw+KC1vdXRlcnN0cmlkZSkpOwotICAgICAgaWYoTWF0cml4VHlwZTo6SXNSb3dNYWpvcikgIFZFUklGWV9JU19BUFBST1gobWFwMS5jb2x3aXNlKCkucmV2ZXJzZSgpLCBtYXAyKTsKLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hcDEucm93d2lzZSgpLnJldmVyc2UoKSwgbWFwMik7CisgICAgICBNYXA8TWF0cml4VHlwZSwgQWxpZ25tZW50LCBPdXRlclN0cmlkZTw+ID4gbWFwMShhcnJheSwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8PihvdXRlcnN0cmlkZSkpOworICAgICAgTWFwPE1hdHJpeFR5cGUsIFVuYWxpZ25lZCwgT3V0ZXJTdHJpZGU8PiA+IG1hcDIoYXJyYXkgKyAobS5vdXRlclNpemUoKSAtIDEpICogb3V0ZXJzdHJpZGUsIHJvd3MsIGNvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRlclN0cmlkZTw+KC1vdXRlcnN0cmlkZSkpOworICAgICAgaWYgKE1hdHJpeFR5cGU6OklzUm93TWFqb3IpCisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWFwMS5jb2x3aXNlKCkucmV2ZXJzZSgpLCBtYXAyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXAxLnJvd3dpc2UoKS5yZXZlcnNlKCksIG1hcDIpOwogICAgIH0KIAogICAgIHsKLSAgICAgIE1hcDxNYXRyaXhUeXBlLCBBbGlnbm1lbnQsIE91dGVyU3RyaWRlPD4gPiBtYXAxKGFycmF5LCByb3dzLCBjb2xzLCBPdXRlclN0cmlkZTw+KCBvdXRlcnN0cmlkZSkpOwotICAgICAgTWFwPE1hdHJpeFR5cGUsIFVuYWxpZ25lZCwgU3RyaWRlPER5bmFtaWMsRHluYW1pYz4gPiBtYXAyKGFycmF5KyhtLm91dGVyU2l6ZSgpLTEpKm91dGVyc3RyaWRlK20uaW5uZXJTaXplKCktMSwgcm93cywgY29scywgU3RyaWRlPER5bmFtaWMsRHluYW1pYz4oLW91dGVyc3RyaWRlLC0xKSk7CisgICAgICBNYXA8TWF0cml4VHlwZSwgQWxpZ25tZW50LCBPdXRlclN0cmlkZTw+ID4gbWFwMShhcnJheSwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8PihvdXRlcnN0cmlkZSkpOworICAgICAgTWFwPE1hdHJpeFR5cGUsIFVuYWxpZ25lZCwgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+ID4gbWFwMigKKyAgICAgICAgICBhcnJheSArIChtLm91dGVyU2l6ZSgpIC0gMSkgKiBvdXRlcnN0cmlkZSArIG0uaW5uZXJTaXplKCkgLSAxLCByb3dzLCBjb2xzLAorICAgICAgICAgIFN0cmlkZTxEeW5hbWljLCBEeW5hbWljPigtb3V0ZXJzdHJpZGUsIC0xKSk7CiAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hcDEucmV2ZXJzZSgpLCBtYXAyKTsKICAgICB9CiAKICAgICB7Ci0gICAgICBNYXA8TWF0cml4VHlwZSwgQWxpZ25tZW50LCBPdXRlclN0cmlkZTw+ID4gbWFwMShhcnJheSwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8Piggb3V0ZXJzdHJpZGUpKTsKLSAgICAgIE1hcDxNYXRyaXhUeXBlLCBVbmFsaWduZWQsIFN0cmlkZTxEeW5hbWljLC0xPiA+IG1hcDIoYXJyYXkrKG0ub3V0ZXJTaXplKCktMSkqb3V0ZXJzdHJpZGUrbS5pbm5lclNpemUoKS0xLCByb3dzLCBjb2xzLCBTdHJpZGU8RHluYW1pYywtMT4oLW91dGVyc3RyaWRlLC0xKSk7CisgICAgICBNYXA8TWF0cml4VHlwZSwgQWxpZ25tZW50LCBPdXRlclN0cmlkZTw+ID4gbWFwMShhcnJheSwgcm93cywgY29scywgT3V0ZXJTdHJpZGU8PihvdXRlcnN0cmlkZSkpOworICAgICAgTWFwPE1hdHJpeFR5cGUsIFVuYWxpZ25lZCwgU3RyaWRlPER5bmFtaWMsIC0xPiA+IG1hcDIoCisgICAgICAgICAgYXJyYXkgKyAobS5vdXRlclNpemUoKSAtIDEpICogb3V0ZXJzdHJpZGUgKyBtLmlubmVyU2l6ZSgpIC0gMSwgcm93cywgY29scywKKyAgICAgICAgICBTdHJpZGU8RHluYW1pYywgLTE+KC1vdXRlcnN0cmlkZSwgLTEpKTsKICAgICAgIFZFUklGWV9JU19BUFBST1gobWFwMS5yZXZlcnNlKCksIG1hcDIpOwogICAgIH0KICAgfQogCi0gIGludGVybmFsOjphbGlnbmVkX2RlbGV0ZShhX2FycmF5MSwgYXJyYXlzaXplKzEpOworICBpbnRlcm5hbDo6YWxpZ25lZF9kZWxldGUoYV9hcnJheTEsIGFycmF5c2l6ZSArIDEpOwogfQogCiAvLyBBZGRpdGlvbmFsIHRlc3RzIGZvciBpbm5lci1zdHJpZGUgYnV0IG5vIG91dGVyLXN0cmlkZQotdGVtcGxhdGU8aW50Pgotdm9pZCBidWcxNDUzKCkKLXsKLSAgY29uc3QgaW50IGRhdGFbXSA9IHswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMX07Ci0gIHR5cGVkZWYgTWF0cml4PGludCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+IFJvd01hdHJpeFhpOwotICB0eXBlZGVmIE1hdHJpeDxpbnQsMiwzLENvbE1ham9yPiBDb2xNYXRyaXgyM2k7Ci0gIHR5cGVkZWYgTWF0cml4PGludCwzLDIsQ29sTWFqb3I+IENvbE1hdHJpeDMyaTsKLSAgdHlwZWRlZiBNYXRyaXg8aW50LDIsMyxSb3dNYWpvcj4gUm93TWF0cml4MjNpOwotICB0eXBlZGVmIE1hdHJpeDxpbnQsMywyLFJvd01ham9yPiBSb3dNYXRyaXgzMmk7Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCBidWcxNDUzKCkgeworICBjb25zdCBpbnQgZGF0YVtdID0gezAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAgICAgICAgICAgICAgICAgICAgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxfTsKKyAgdHlwZWRlZiBNYXRyaXg8aW50LCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4gUm93TWF0cml4WGk7CisgIHR5cGVkZWYgTWF0cml4PGludCwgMiwgMywgQ29sTWFqb3I+IENvbE1hdHJpeDIzaTsKKyAgdHlwZWRlZiBNYXRyaXg8aW50LCAzLCAyLCBDb2xNYWpvcj4gQ29sTWF0cml4MzJpOworICB0eXBlZGVmIE1hdHJpeDxpbnQsIDIsIDMsIFJvd01ham9yPiBSb3dNYXRyaXgyM2k7CisgIHR5cGVkZWYgTWF0cml4PGludCwgMywgMiwgUm93TWFqb3I+IFJvd01hdHJpeDMyaTsKIAotICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgSW5uZXJTdHJpZGU8Mj4oKSksIE1hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgU3RyaWRlPDQsMj4oKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgSW5uZXJTdHJpZGU8PigyKSksIE1hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgU3RyaWRlPDQsMj4oKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgSW5uZXJTdHJpZGU8Mj4oKSksIE1hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgU3RyaWRlPDYsMj4oKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgSW5uZXJTdHJpZGU8PigyKSksIE1hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgU3RyaWRlPDYsMj4oKSkpOworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgSW5uZXJTdHJpZGU8Mj4oKSksIE1hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgU3RyaWRlPDQsIDI+KCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhYaTo6TWFwKGRhdGEsIDIsIDMsIElubmVyU3RyaWRlPD4oMikpLCBNYXRyaXhYaTo6TWFwKGRhdGEsIDIsIDMsIFN0cmlkZTw0LCAyPigpKSk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4WGk6Ok1hcChkYXRhLCAzLCAyLCBJbm5lclN0cmlkZTwyPigpKSwgTWF0cml4WGk6Ok1hcChkYXRhLCAzLCAyLCBTdHJpZGU8NiwgMj4oKSkpOworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgSW5uZXJTdHJpZGU8PigyKSksIE1hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgU3RyaWRlPDYsIDI+KCkpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgSW5uZXJTdHJpZGU8Mj4oKSksIFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgU3RyaWRlPDYsMj4oKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgSW5uZXJTdHJpZGU8PigyKSksIFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgU3RyaWRlPDYsMj4oKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgSW5uZXJTdHJpZGU8Mj4oKSksIFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgU3RyaWRlPDQsMj4oKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgSW5uZXJTdHJpZGU8PigyKSksIFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgU3RyaWRlPDQsMj4oKSkpOworICBWRVJJRllfSVNfQVBQUk9YKFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgSW5uZXJTdHJpZGU8Mj4oKSksIFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgU3RyaWRlPDYsIDI+KCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChSb3dNYXRyaXhYaTo6TWFwKGRhdGEsIDIsIDMsIElubmVyU3RyaWRlPD4oMikpLCBSb3dNYXRyaXhYaTo6TWFwKGRhdGEsIDIsIDMsIFN0cmlkZTw2LCAyPigpKSk7CisgIFZFUklGWV9JU19BUFBST1goUm93TWF0cml4WGk6Ok1hcChkYXRhLCAzLCAyLCBJbm5lclN0cmlkZTwyPigpKSwgUm93TWF0cml4WGk6Ok1hcChkYXRhLCAzLCAyLCBTdHJpZGU8NCwgMj4oKSkpOworICBWRVJJRllfSVNfQVBQUk9YKFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgSW5uZXJTdHJpZGU8PigyKSksIFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgU3RyaWRlPDQsIDI+KCkpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKENvbE1hdHJpeDIzaTo6TWFwKGRhdGEsIElubmVyU3RyaWRlPDI+KCkpLCBNYXRyaXhYaTo6TWFwKGRhdGEsIDIsIDMsIFN0cmlkZTw0LDI+KCkpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChDb2xNYXRyaXgyM2k6Ok1hcChkYXRhLCBJbm5lclN0cmlkZTw+KDIpKSwgTWF0cml4WGk6Ok1hcChkYXRhLCAyLCAzLCBTdHJpZGU8NCwyPigpKSk7Ci0gIFZFUklGWV9JU19BUFBST1goQ29sTWF0cml4MzJpOjpNYXAoZGF0YSwgSW5uZXJTdHJpZGU8Mj4oKSksIE1hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgU3RyaWRlPDYsMj4oKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKENvbE1hdHJpeDMyaTo6TWFwKGRhdGEsIElubmVyU3RyaWRlPD4oMikpLCBNYXRyaXhYaTo6TWFwKGRhdGEsIDMsIDIsIFN0cmlkZTw2LDI+KCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChDb2xNYXRyaXgyM2k6Ok1hcChkYXRhLCBJbm5lclN0cmlkZTwyPigpKSwgTWF0cml4WGk6Ok1hcChkYXRhLCAyLCAzLCBTdHJpZGU8NCwgMj4oKSkpOworICBWRVJJRllfSVNfQVBQUk9YKENvbE1hdHJpeDIzaTo6TWFwKGRhdGEsIElubmVyU3RyaWRlPD4oMikpLCBNYXRyaXhYaTo6TWFwKGRhdGEsIDIsIDMsIFN0cmlkZTw0LCAyPigpKSk7CisgIFZFUklGWV9JU19BUFBST1goQ29sTWF0cml4MzJpOjpNYXAoZGF0YSwgSW5uZXJTdHJpZGU8Mj4oKSksIE1hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgU3RyaWRlPDYsIDI+KCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChDb2xNYXRyaXgzMmk6Ok1hcChkYXRhLCBJbm5lclN0cmlkZTw+KDIpKSwgTWF0cml4WGk6Ok1hcChkYXRhLCAzLCAyLCBTdHJpZGU8NiwgMj4oKSkpOwogCi0gIFZFUklGWV9JU19BUFBST1goUm93TWF0cml4MjNpOjpNYXAoZGF0YSwgSW5uZXJTdHJpZGU8Mj4oKSksIFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgU3RyaWRlPDYsMj4oKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKFJvd01hdHJpeDIzaTo6TWFwKGRhdGEsIElubmVyU3RyaWRlPD4oMikpLCBSb3dNYXRyaXhYaTo6TWFwKGRhdGEsIDIsIDMsIFN0cmlkZTw2LDI+KCkpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChSb3dNYXRyaXgzMmk6Ok1hcChkYXRhLCBJbm5lclN0cmlkZTwyPigpKSwgUm93TWF0cml4WGk6Ok1hcChkYXRhLCAzLCAyLCBTdHJpZGU8NCwyPigpKSk7Ci0gIFZFUklGWV9JU19BUFBST1goUm93TWF0cml4MzJpOjpNYXAoZGF0YSwgSW5uZXJTdHJpZGU8PigyKSksIFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMywgMiwgU3RyaWRlPDQsMj4oKSkpOworICBWRVJJRllfSVNfQVBQUk9YKFJvd01hdHJpeDIzaTo6TWFwKGRhdGEsIElubmVyU3RyaWRlPDI+KCkpLCBSb3dNYXRyaXhYaTo6TWFwKGRhdGEsIDIsIDMsIFN0cmlkZTw2LCAyPigpKSk7CisgIFZFUklGWV9JU19BUFBST1goUm93TWF0cml4MjNpOjpNYXAoZGF0YSwgSW5uZXJTdHJpZGU8PigyKSksIFJvd01hdHJpeFhpOjpNYXAoZGF0YSwgMiwgMywgU3RyaWRlPDYsIDI+KCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChSb3dNYXRyaXgzMmk6Ok1hcChkYXRhLCBJbm5lclN0cmlkZTwyPigpKSwgUm93TWF0cml4WGk6Ok1hcChkYXRhLCAzLCAyLCBTdHJpZGU8NCwgMj4oKSkpOworICBWRVJJRllfSVNfQVBQUk9YKFJvd01hdHJpeDMyaTo6TWFwKGRhdGEsIElubmVyU3RyaWRlPD4oMikpLCBSb3dNYXRyaXhYaTo6TWFwKGRhdGEsIDMsIDIsIFN0cmlkZTw0LCAyPigpKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChtYXBzdHJpZGUpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CitFSUdFTl9ERUNMQVJFX1RFU1QobWFwc3RyaWRlKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewogICAgIGludCBtYXhuID0gMzsKLSAgICBDQUxMX1NVQlRFU1RfMSggbWFwX2NsYXNzX3ZlY3RvcjxBbGlnbmVkPihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIG1hcF9jbGFzc192ZWN0b3I8VW5hbGlnbmVkPihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIG1hcF9jbGFzc192ZWN0b3I8QWxpZ25lZD4oVmVjdG9yNGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggbWFwX2NsYXNzX3ZlY3RvcjxVbmFsaWduZWQ+KFZlY3RvcjRkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIG1hcF9jbGFzc192ZWN0b3I8QWxpZ25lZD4oUm93VmVjdG9yNGYoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggbWFwX2NsYXNzX3ZlY3RvcjxVbmFsaWduZWQ+KFJvd1ZlY3RvcjRmKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIG1hcF9jbGFzc192ZWN0b3I8QWxpZ25lZD4oVmVjdG9yWGNmKGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggbWFwX2NsYXNzX3ZlY3RvcjxVbmFsaWduZWQ+KFZlY3RvclhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIG1hcF9jbGFzc192ZWN0b3I8QWxpZ25lZD4oVmVjdG9yWGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4bikpKSApOwotICAgIENBTExfU1VCVEVTVF81KCBtYXBfY2xhc3NfdmVjdG9yPFVuYWxpZ25lZD4oVmVjdG9yWGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4bikpKSApOworICAgIENBTExfU1VCVEVTVF8xKG1hcF9jbGFzc192ZWN0b3I8QWxpZ25lZD4oTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEobWFwX2NsYXNzX3ZlY3RvcjxVbmFsaWduZWQ+KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKG1hcF9jbGFzc192ZWN0b3I8QWxpZ25lZD4oVmVjdG9yNGQoKSkpOworICAgIENBTExfU1VCVEVTVF8yKG1hcF9jbGFzc192ZWN0b3I8VW5hbGlnbmVkPihWZWN0b3I0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMobWFwX2NsYXNzX3ZlY3RvcjxBbGlnbmVkPihSb3dWZWN0b3I0ZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMobWFwX2NsYXNzX3ZlY3RvcjxVbmFsaWduZWQ+KFJvd1ZlY3RvcjRmKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChtYXBfY2xhc3NfdmVjdG9yPEFsaWduZWQ+KFZlY3RvclhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4bikpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQobWFwX2NsYXNzX3ZlY3RvcjxVbmFsaWduZWQ+KFZlY3RvclhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4bikpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUobWFwX2NsYXNzX3ZlY3RvcjxBbGlnbmVkPihWZWN0b3JYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4bikpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUobWFwX2NsYXNzX3ZlY3RvcjxVbmFsaWduZWQ+KFZlY3RvclhpKGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhuKSkpKTsKIAotICAgIENBTExfU1VCVEVTVF8xKCBtYXBfY2xhc3NfbWF0cml4PEFsaWduZWQ+KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggbWFwX2NsYXNzX21hdHJpeDxVbmFsaWduZWQ+KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggbWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXg0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBtYXBfY2xhc3NfbWF0cml4PFVuYWxpZ25lZD4oTWF0cml4NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggbWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXg8ZmxvYXQsMyw1PigpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBtYXBfY2xhc3NfbWF0cml4PFVuYWxpZ25lZD4oTWF0cml4PGZsb2F0LDMsNT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggbWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXg8ZmxvYXQsNCw4PigpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBtYXBfY2xhc3NfbWF0cml4PFVuYWxpZ25lZD4oTWF0cml4PGZsb2F0LDQsOD4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggbWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4biksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4bikpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBtYXBfY2xhc3NfbWF0cml4PFVuYWxpZ25lZD4oTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pLGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggbWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIG1hcF9jbGFzc19tYXRyaXg8VW5hbGlnbmVkPihNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoIG1hcF9jbGFzc19tYXRyaXg8QWxpZ25lZD4oTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pLGludGVybmFsOjpyYW5kb208aW50PigxLG1heG4pKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggbWFwX2NsYXNzX21hdHJpeDxVbmFsaWduZWQ+KE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhuKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEobWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShtYXBfY2xhc3NfbWF0cml4PFVuYWxpZ25lZD4oTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIobWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXg0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIobWFwX2NsYXNzX21hdHJpeDxVbmFsaWduZWQ+KE1hdHJpeDRkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhtYXBfY2xhc3NfbWF0cml4PEFsaWduZWQ+KE1hdHJpeDxmbG9hdCwgMywgNT4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKG1hcF9jbGFzc19tYXRyaXg8VW5hbGlnbmVkPihNYXRyaXg8ZmxvYXQsIDMsIDU+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhtYXBfY2xhc3NfbWF0cml4PEFsaWduZWQ+KE1hdHJpeDxmbG9hdCwgNCwgOD4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKG1hcF9jbGFzc19tYXRyaXg8VW5hbGlnbmVkPihNYXRyaXg8ZmxvYXQsIDQsIDg+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgKKyAgICAgICAgbWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIG1heG4pLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4bikpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoCisgICAgICAgIG1hcF9jbGFzc19tYXRyaXg8VW5hbGlnbmVkPihNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIG1heG4pLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4bikpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUobWFwX2NsYXNzX21hdHJpeDxBbGlnbmVkPihNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4biksIGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhuKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgKKyAgICAgICAgbWFwX2NsYXNzX21hdHJpeDxVbmFsaWduZWQ+KE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhuKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIG1heG4pKSkpOworICAgIENBTExfU1VCVEVTVF82KAorICAgICAgICBtYXBfY2xhc3NfbWF0cml4PEFsaWduZWQ+KE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4biksIGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhuKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNigKKyAgICAgICAgbWFwX2NsYXNzX21hdHJpeDxVbmFsaWduZWQ+KE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4biksIGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhuKSkpKTsKIAotICAgIENBTExfU1VCVEVTVF81KCBidWcxNDUzPDA+KCkgKTsKLSAgICAKKyAgICBDQUxMX1NVQlRFU1RfNShidWcxNDUzPDA+KCkpOworCiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShtYXhuKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9tYXhzaXpldmVjdG9yLmNwcCBiL3Rlc3QvbWF4c2l6ZXZlY3Rvci5jcHAKaW5kZXggMDg0ZWExMy4uN2ZlNjkxYSAxMDA2NDQKLS0tIGEvdGVzdC9tYXhzaXpldmVjdG9yLmNwcAorKysgYi90ZXN0L21heHNpemV2ZWN0b3IuY3BwCkBAIC00LDMxICs0LDMwIEBACiAKICNpbmNsdWRlIDxFaWdlbi9zcmMvQ29yZS91dGlsL01heFNpemVWZWN0b3IuaD4KIAotc3RydWN0IEZvbwoteworc3RydWN0IEZvbyB7CiAgIHN0YXRpYyBJbmRleCBvYmplY3RfY291bnQ7CiAgIHN0YXRpYyBJbmRleCBvYmplY3RfbGltaXQ7CiAgIEVJR0VOX0FMSUdOX1RPX0JPVU5EQVJZKDEyOCkgaW50IGR1bW15OwogCi0gIEZvbyhpbnQgeD0wKSA6IGR1bW15KHgpCi0gIHsKKyAgRm9vKGludCB4ID0gMCkgOiBkdW1teSh4KSB7CiAjaWZkZWYgRUlHRU5fRVhDRVBUSU9OUwogICAgIC8vIFRPRE86IElzIHRoaXMgdGhlIGNvcnJlY3Qgd2F5IHRvIGhhbmRsZSB0aGlzPwotICAgIGlmIChGb286Om9iamVjdF9jb3VudCA+IEZvbzo6b2JqZWN0X2xpbWl0KSB7IHN0ZDo6Y291dCA8PCAiXG5UaHJvdyFcbiI7IHRocm93IEZvbzo6RmFpbCgpOyB9CisgICAgaWYgKEZvbzo6b2JqZWN0X2NvdW50ID4gRm9vOjpvYmplY3RfbGltaXQpIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiXG5UaHJvdyFcbiI7CisgICAgICB0aHJvdyBGb286OkZhaWwoKTsKKyAgICB9CiAjZW5kaWYKICAgICBzdGQ6OmNvdXQgPDwgJysnOwogICAgICsrRm9vOjpvYmplY3RfY291bnQ7CiAgICAgZWlnZW5fYXNzZXJ0KChzdGQ6OnVpbnRwdHJfdCh0aGlzKSAmICgxMjcpKSA9PSAwKTsKICAgfQotICBGb28oY29uc3QgRm9vJikKLSAgeworICBGb28oY29uc3QgRm9vJikgewogICAgIHN0ZDo6Y291dCA8PCAnYyc7CiAgICAgKytGb286Om9iamVjdF9jb3VudDsKICAgICBlaWdlbl9hc3NlcnQoKHN0ZDo6dWludHB0cl90KHRoaXMpICYgKDEyNykpID09IDApOwogICB9CiAKLSAgfkZvbygpCi0gIHsKKyAgfkZvbygpIHsKICAgICBzdGQ6OmNvdXQgPDwgJ34nOwogICAgIC0tRm9vOjpvYmplY3RfY291bnQ7CiAgIH0KQEAgLTM5LDM1ICszOCwzMSBAQAogSW5kZXggRm9vOjpvYmplY3RfY291bnQgPSAwOwogSW5kZXggRm9vOjpvYmplY3RfbGltaXQgPSAwOwogCi0KLQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX21heHNpemV2ZWN0b3IpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfbWF4c2l6ZXZlY3RvcikgewogICB0eXBlZGVmIE1heFNpemVWZWN0b3I8Rm9vPiBWZWN0b3JYOwogICBGb286Om9iamVjdF9jb3VudCA9IDA7Ci0gIGZvcihpbnQgciA9IDA7IHIgPCBnX3JlcGVhdDsgcisrKSB7Ci0gICAgSW5kZXggcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDMsMzApOworICBmb3IgKGludCByID0gMDsgciA8IGdfcmVwZWF0OyByKyspIHsKKyAgICBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMywgMzApOwogICAgIEZvbzo6b2JqZWN0X2xpbWl0ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cyAtIDIpOwogICAgIHN0ZDo6Y291dCA8PCAib2JqZWN0X2xpbWl0ID0gIiA8PCBGb286Om9iamVjdF9saW1pdCA8PCBzdGQ6OmVuZGw7CiAgICAgYm9vbCBleGNlcHRpb25fcmFpc2VkID0gZmFsc2U7CiAjaWZkZWYgRUlHRU5fRVhDRVBUSU9OUwotICAgIHRyeQotICAgIHsKKyAgICB0cnkgewogI2VuZGlmCi0gICAgICBzdGQ6OmNvdXQgPDwgICAgICAgIlxuVmVjdG9yWCBtKCIgPDwgcm93cyA8PCAiKTtcbiI7CisgICAgICBzdGQ6OmNvdXQgPDwgIlxuVmVjdG9yWCBtKCIgPDwgcm93cyA8PCAiKTtcbiI7CiAgICAgICBWZWN0b3JYIHZlY3Qocm93cyk7Ci0gICAgICBmb3IoaW50IGk9MDsgaTxyb3dzOyArK2kpCi0gICAgICAgICAgdmVjdC5wdXNoX2JhY2soRm9vKCkpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyArK2kpIHZlY3QucHVzaF9iYWNrKEZvbygpKTsKICNpZmRlZiBFSUdFTl9FWENFUFRJT05TCiAgICAgICBWRVJJRlkoZmFsc2UpOyAgLy8gbm90IHJlYWNoZWQgaWYgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZAorICAgIH0gY2F0Y2ggKGNvbnN0IEZvbzo6RmFpbCYpIHsKKyAgICAgIGV4Y2VwdGlvbl9yYWlzZWQgPSB0cnVlOwogICAgIH0KLSAgICBjYXRjaCAoY29uc3QgRm9vOjpGYWlsJikgeyBleGNlcHRpb25fcmFpc2VkID0gdHJ1ZTsgfQogICAgIFZFUklGWShleGNlcHRpb25fcmFpc2VkKTsKICNlbmRpZgogICAgIFZFUklGWV9JU19FUVVBTChJbmRleCgwKSwgRm9vOjpvYmplY3RfY291bnQpOwogCiAgICAgewotICAgICAgRm9vOjpvYmplY3RfbGltaXQgPSByb3dzKzE7CisgICAgICBGb286Om9iamVjdF9saW1pdCA9IHJvd3MgKyAxOwogICAgICAgVmVjdG9yWCB2ZWN0Mihyb3dzLCBGb28oKSk7CiAgICAgICBWRVJJRllfSVNfRVFVQUwoRm9vOjpvYmplY3RfY291bnQsIHJvd3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvbWV0YS5jcHAgYi90ZXN0L21ldGEuY3BwCmluZGV4IDdlNzM3MDYuLjQ2MjY5YjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvbWV0YS5jcHAKKysrIGIvdGVzdC9tZXRhLmNwcApAQCAtMTIsMTAgKzEyLDkgQEAKICNpbmNsdWRlIDxhcnJheT4KICNpbmNsdWRlIDxFaWdlbi9zcmMvQ29yZS91dGlsL01ldGEuaD4KIAotdGVtcGxhdGU8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Ci1ib29sIGNoZWNrX2lzX2NvbnZlcnRpYmxlKGNvbnN0IEZyb20mLCBjb25zdCBUbyYpCi17Ci0gIHJldHVybiBpbnRlcm5hbDo6aXNfY29udmVydGlibGU8RnJvbSxUbz46OnZhbHVlOwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorYm9vbCBjaGVja19pc19jb252ZXJ0aWJsZShjb25zdCBGcm9tJiwgY29uc3QgVG8mKSB7CisgIHJldHVybiBpbnRlcm5hbDo6aXNfY29udmVydGlibGU8RnJvbSwgVG8+Ojp2YWx1ZTsKIH0KIAogc3RydWN0IEZvb1JldHVyblR5cGUgewpAQCAtMzAsOTMgKzI5LDkxIEBACiAgIHZvaWQgZnVuYygpIHt9CiB9OwogCi1FSUdFTl9ERUNMQVJFX1RFU1QobWV0YSkKLXsKLSAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsZmxvYXQ+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKCFpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxkb3VibGU+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKCFpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxmbG9hdCY+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKCFpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxjb25zdCBmbG9hdCY+Ojp2YWx1ZSkpOworRUlHRU5fREVDTEFSRV9URVNUKG1ldGEpIHsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCwgZmxvYXQ+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCFpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCwgZG91YmxlPjo6dmFsdWUpKTsKKyAgVkVSSUZZKCghaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsIGZsb2F0Jj46OnZhbHVlKSk7CisgIFZFUklGWSgoIWludGVybmFsOjppc19zYW1lPGZsb2F0LCBjb25zdCBmbG9hdCY+Ojp2YWx1ZSkpOwogCi0gIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPGZsb2F0LGludGVybmFsOjpyZW1vdmVfYWxsX3Q8Y29uc3QgZmxvYXQmPiA+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxpbnRlcm5hbDo6cmVtb3ZlX2FsbF90PGNvbnN0IGZsb2F0Kj4gPjo6dmFsdWUpKTsKLSAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsaW50ZXJuYWw6OnJlbW92ZV9hbGxfdDxjb25zdCBmbG9hdComPiA+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxpbnRlcm5hbDo6cmVtb3ZlX2FsbF90PGZsb2F0Kio+ID46OnZhbHVlKSk7Ci0gIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPGZsb2F0LGludGVybmFsOjpyZW1vdmVfYWxsX3Q8ZmxvYXQqKiY+ID46OnZhbHVlKSk7Ci0gIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPGZsb2F0LGludGVybmFsOjpyZW1vdmVfYWxsX3Q8ZmxvYXQqIGNvbnN0IComPiA+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCxpbnRlcm5hbDo6cmVtb3ZlX2FsbF90PGZsb2F0KiBjb25zdD4gPjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCwgaW50ZXJuYWw6OnJlbW92ZV9hbGxfdDxjb25zdCBmbG9hdCY+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCwgaW50ZXJuYWw6OnJlbW92ZV9hbGxfdDxjb25zdCBmbG9hdCo+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCwgaW50ZXJuYWw6OnJlbW92ZV9hbGxfdDxjb25zdCBmbG9hdComPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsIGludGVybmFsOjpyZW1vdmVfYWxsX3Q8ZmxvYXQqKj4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPGZsb2F0LCBpbnRlcm5hbDo6cmVtb3ZlX2FsbF90PGZsb2F0KiomPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaW50ZXJuYWw6OmlzX3NhbWU8ZmxvYXQsIGludGVybmFsOjpyZW1vdmVfYWxsX3Q8ZmxvYXQqIGNvbnN0KiY+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTxmbG9hdCwgaW50ZXJuYWw6OnJlbW92ZV9hbGxfdDxmbG9hdCogY29uc3Q+Pjo6dmFsdWUpKTsKIAogICAvLyB0ZXN0IGFkZF9jb25zdF9vbl92YWx1ZV90eXBlCi0gIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGVfdDxmbG9hdCY+LCBmbG9hdCBjb25zdCYgPjo6dmFsdWUpKTsKLSAgVkVSSUZZKCggaW50ZXJuYWw6OmlzX3NhbWU8IGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZV90PGZsb2F0Kj4sIGZsb2F0IGNvbnN0KiA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZV90PGZsb2F0Jj4sIGZsb2F0IGNvbnN0Jj46OnZhbHVlKSk7CisgIFZFUklGWSgoaW50ZXJuYWw6OmlzX3NhbWU8aW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlX3Q8ZmxvYXQqPiwgZmxvYXQgY29uc3QqPjo6dmFsdWUpKTsKIAotICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlX3Q8ZmxvYXQ+LCBjb25zdCBmbG9hdCA+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlX3Q8Y29uc3QgZmxvYXQ+LCBjb25zdCBmbG9hdCA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZV90PGZsb2F0PiwgY29uc3QgZmxvYXQ+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZV90PGNvbnN0IGZsb2F0PiwgY29uc3QgZmxvYXQ+Ojp2YWx1ZSkpOwogCi0gIFZFUklGWSgoIGludGVybmFsOjppc19zYW1lPCBpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGVfdDxjb25zdCBmbG9hdCogY29uc3Q+LCBjb25zdCBmbG9hdCogY29uc3Q+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKCBpbnRlcm5hbDo6aXNfc2FtZTwgaW50ZXJuYWw6OmFkZF9jb25zdF9vbl92YWx1ZV90eXBlX3Q8ZmxvYXQqIGNvbnN0PiwgY29uc3QgZmxvYXQqIGNvbnN0Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTxpbnRlcm5hbDo6YWRkX2NvbnN0X29uX3ZhbHVlX3R5cGVfdDxjb25zdCBmbG9hdCogY29uc3Q+LCBjb25zdCBmbG9hdCogY29uc3Q+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPGludGVybmFsOjphZGRfY29uc3Rfb25fdmFsdWVfdHlwZV90PGZsb2F0KiBjb25zdD4sIGNvbnN0IGZsb2F0KiBjb25zdD46OnZhbHVlKSk7CiAKICAgLy8gaXNfY29udmVydGlibGUKLSAgU1RBVElDX0NIRUNLKCggaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPGZsb2F0LGRvdWJsZT46OnZhbHVlICkpOwotICBTVEFUSUNfQ0hFQ0soKCBpbnRlcm5hbDo6aXNfY29udmVydGlibGU8aW50LGRvdWJsZT46OnZhbHVlICkpOwotICBTVEFUSUNfQ0hFQ0soKCBpbnRlcm5hbDo6aXNfY29udmVydGlibGU8aW50LCBzaG9ydD46OnZhbHVlICkpOwotICBTVEFUSUNfQ0hFQ0soKCBpbnRlcm5hbDo6aXNfY29udmVydGlibGU8c2hvcnQsIGludD46OnZhbHVlICkpOwotICBTVEFUSUNfQ0hFQ0soKCBpbnRlcm5hbDo6aXNfY29udmVydGlibGU8ZG91YmxlLGludD46OnZhbHVlICkpOwotICBTVEFUSUNfQ0hFQ0soKCBpbnRlcm5hbDo6aXNfY29udmVydGlibGU8ZG91YmxlLHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnZhbHVlICkpOwotICBTVEFUSUNfQ0hFQ0soKCFpbnRlcm5hbDo6aXNfY29udmVydGlibGU8c3RkOjpjb21wbGV4PGRvdWJsZT4sZG91YmxlPjo6dmFsdWUgKSk7Ci0gIFNUQVRJQ19DSEVDSygoIGludGVybmFsOjppc19jb252ZXJ0aWJsZTxBcnJheTMzZixNYXRyaXgzZj46OnZhbHVlICkpOwotICBTVEFUSUNfQ0hFQ0soKCBpbnRlcm5hbDo6aXNfY29udmVydGlibGU8TWF0cml4M2YmLE1hdHJpeDNmPjo6dmFsdWUgKSk7Ci0gIFNUQVRJQ19DSEVDSygoIGludGVybmFsOjppc19jb252ZXJ0aWJsZTxNYXRyaXgzZiYsTWF0cml4M2YmPjo6dmFsdWUgKSk7Ci0gIFNUQVRJQ19DSEVDSygoIGludGVybmFsOjppc19jb252ZXJ0aWJsZTxNYXRyaXgzZiYsY29uc3QgTWF0cml4M2YmPjo6dmFsdWUgKSk7Ci0gIFNUQVRJQ19DSEVDSygoIGludGVybmFsOjppc19jb252ZXJ0aWJsZTxjb25zdCBNYXRyaXgzZiYsTWF0cml4M2Y+Ojp2YWx1ZSApKTsKLSAgU1RBVElDX0NIRUNLKCggaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPGNvbnN0IE1hdHJpeDNmJixjb25zdCBNYXRyaXgzZiY+Ojp2YWx1ZSApKTsKLSAgU1RBVElDX0NIRUNLKCghaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPGNvbnN0IE1hdHJpeDNmJixNYXRyaXgzZiY+Ojp2YWx1ZSApKTsKLSAgU1RBVElDX0NIRUNLKCghaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPGNvbnN0IE1hdHJpeDNmLE1hdHJpeDNmJj46OnZhbHVlICkpOwotICBTVEFUSUNfQ0hFQ0soISggaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPE1hdHJpeDNmLE1hdHJpeDNmJj46OnZhbHVlICkpOworICBTVEFUSUNfQ0hFQ0soKGludGVybmFsOjppc19jb252ZXJ0aWJsZTxmbG9hdCwgZG91YmxlPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpbnRlcm5hbDo6aXNfY29udmVydGlibGU8aW50LCBkb3VibGU+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKGludGVybmFsOjppc19jb252ZXJ0aWJsZTxpbnQsIHNob3J0Pjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpbnRlcm5hbDo6aXNfY29udmVydGlibGU8c2hvcnQsIGludD46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPGRvdWJsZSwgaW50Pjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpbnRlcm5hbDo6aXNfY29udmVydGlibGU8ZG91YmxlLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPj46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoIWludGVybmFsOjppc19jb252ZXJ0aWJsZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgZG91YmxlPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpbnRlcm5hbDo6aXNfY29udmVydGlibGU8QXJyYXkzM2YsIE1hdHJpeDNmPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpbnRlcm5hbDo6aXNfY29udmVydGlibGU8TWF0cml4M2YmLCBNYXRyaXgzZj46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPE1hdHJpeDNmJiwgTWF0cml4M2YmPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpbnRlcm5hbDo6aXNfY29udmVydGlibGU8TWF0cml4M2YmLCBjb25zdCBNYXRyaXgzZiY+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKGludGVybmFsOjppc19jb252ZXJ0aWJsZTxjb25zdCBNYXRyaXgzZiYsIE1hdHJpeDNmPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpbnRlcm5hbDo6aXNfY29udmVydGlibGU8Y29uc3QgTWF0cml4M2YmLCBjb25zdCBNYXRyaXgzZiY+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKCFpbnRlcm5hbDo6aXNfY29udmVydGlibGU8Y29uc3QgTWF0cml4M2YmLCBNYXRyaXgzZiY+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKCFpbnRlcm5hbDo6aXNfY29udmVydGlibGU8Y29uc3QgTWF0cml4M2YsIE1hdHJpeDNmJj46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSyghKGludGVybmFsOjppc19jb252ZXJ0aWJsZTxNYXRyaXgzZiwgTWF0cml4M2YmPjo6dmFsdWUpKTsKIAotICBTVEFUSUNfQ0hFQ0soISggaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPGludCxpbnQmPjo6dmFsdWUgKSk7Ci0gIFNUQVRJQ19DSEVDSygoIGludGVybmFsOjppc19jb252ZXJ0aWJsZTxjb25zdCBpbnQsY29uc3QgaW50JiA+Ojp2YWx1ZSApKTsKKyAgU1RBVElDX0NIRUNLKCEoaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPGludCwgaW50Jj46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPGNvbnN0IGludCwgY29uc3QgaW50Jj46OnZhbHVlKSk7CiAKLSAgLy9TVEFUSUNfQ0hFQ0soKCFpbnRlcm5hbDo6aXNfY29udmVydGlibGU8TWF0cml4M2YsTWF0cml4M2Q+Ojp2YWx1ZSApKTsgLy9kb2VzIG5vdCBldmVuIGNvbXBpbGUgYmVjYXVzZSB0aGUgY29udmVyc2lvbiBpcyBwcmV2ZW50ZWQgYnkgYSBzdGF0aWMgYXNzZXJ0aW9uCi0gIFNUQVRJQ19DSEVDSygoIWludGVybmFsOjppc19jb252ZXJ0aWJsZTxBcnJheTMzZixpbnQ+Ojp2YWx1ZSApKTsKLSAgU1RBVElDX0NIRUNLKCghaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPE1hdHJpeFhmLGZsb2F0Pjo6dmFsdWUgKSk7CisgIC8vIFNUQVRJQ19DSEVDSygoIWludGVybmFsOjppc19jb252ZXJ0aWJsZTxNYXRyaXgzZixNYXRyaXgzZD46OnZhbHVlICkpOyAvL2RvZXMgbm90IGV2ZW4gY29tcGlsZSBiZWNhdXNlIHRoZQorICAvLyBjb252ZXJzaW9uIGlzIHByZXZlbnRlZCBieSBhIHN0YXRpYyBhc3NlcnRpb24KKyAgU1RBVElDX0NIRUNLKCghaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPEFycmF5MzNmLCBpbnQ+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKCFpbnRlcm5hbDo6aXNfY29udmVydGlibGU8TWF0cml4WGYsIGZsb2F0Pjo6dmFsdWUpKTsKICAgewogICAgIGZsb2F0IGYgPSAwLjBmOwogICAgIE1hdHJpeFhmIEEsIEI7CiAgICAgVmVjdG9yWGYgYSwgYjsKLSAgICBWRVJJRlkoKCBjaGVja19pc19jb252ZXJ0aWJsZShhLmRvdChiKSwgZikgKSk7Ci0gICAgVkVSSUZZKCggY2hlY2tfaXNfY29udmVydGlibGUoYS50cmFuc3Bvc2UoKSpiLCBmKSApKTsKLSAgICBWRVJJRlkoKCFjaGVja19pc19jb252ZXJ0aWJsZShBKkIsIGYpICkpOwotICAgIFZFUklGWSgoIGNoZWNrX2lzX2NvbnZlcnRpYmxlKEEqQiwgQSkgKSk7CisgICAgVkVSSUZZKChjaGVja19pc19jb252ZXJ0aWJsZShhLmRvdChiKSwgZikpKTsKKyAgICBWRVJJRlkoKGNoZWNrX2lzX2NvbnZlcnRpYmxlKGEudHJhbnNwb3NlKCkgKiBiLCBmKSkpOworICAgIFZFUklGWSgoIWNoZWNrX2lzX2NvbnZlcnRpYmxlKEEgKiBCLCBmKSkpOworICAgIFZFUklGWSgoY2hlY2tfaXNfY29udmVydGlibGUoQSAqIEIsIEEpKSk7CiAgIH0KIAotICAjaWYgKEVJR0VOX0NPTVBfR05VQ19TVFJJQ1QgICYmIEVJR0VOX0NPTVBfR05VQyAgPD0gIDk5MCkgXAotICAgfHwgKEVJR0VOX0NPTVBfQ0xBTkdfU1RSSUNUICYmIEVJR0VOX0NPTVBfQ0xBTkcgPD0gIDk5MCkgXAotICAgfHwgKEVJR0VOX0NPTVBfTVNWQyAgICAgICAgICYmIEVJR0VOX0NPTVBfTVNWQyAgPD0gMTkxNCkKKyNpZiAoRUlHRU5fQ09NUF9HTlVDX1NUUklDVCAmJiBFSUdFTl9DT01QX0dOVUMgPD0gOTkwKSB8fCAoRUlHRU5fQ09NUF9DTEFOR19TVFJJQ1QgJiYgRUlHRU5fQ09NUF9DTEFORyA8PSA5OTApIHx8IFwKKyAgICAoRUlHRU5fQ09NUF9NU1ZDICYmIEVJR0VOX0NPTVBfTVNWQyA8PSAxOTE0KQogICAvLyBTZWUgaHR0cDovL2VpZ2VuLnR1eGZhbWlseS5vcmcvYnovc2hvd19idWcuY2dpP2lkPTE3NTIsCiAgIC8vIGJhc2ljYWxseSwgYSBmaXggaW4gdGhlIGMrKyBzdGFuZGFyZCBicmVha3Mgb3VyIGMrKzk4IGltcGxlbWVudGF0aW9uCiAgIC8vIG9mIGlzX2NvbnZlcnRpYmxlIGZvciBhYnN0cmFjdCBjbGFzc2VzLgogICAvLyBTbyB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBleHBlY3RlZCB0byBmYWlsIHdpdGggcmVjZW50IGNvbXBpbGVycy4KIAotICBTVEFUSUNfQ0hFQ0soKCAhaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPE15SW50ZXJmYWNlLCBNeUltcGw+Ojp2YWx1ZSApKTsKLSAgU1RBVElDX0NIRUNLKCggIWludGVybmFsOjppc19jb252ZXJ0aWJsZTxNeUltcGwsIE15SW50ZXJmYWNlPjo6dmFsdWUgKSk7Ci0gIFNUQVRJQ19DSEVDSygoICBpbnRlcm5hbDo6aXNfY29udmVydGlibGU8TXlJbXBsLCBjb25zdCBNeUludGVyZmFjZSY+Ojp2YWx1ZSApKTsKKyAgU1RBVElDX0NIRUNLKCghaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPE15SW50ZXJmYWNlLCBNeUltcGw+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKCFpbnRlcm5hbDo6aXNfY29udmVydGlibGU8TXlJbXBsLCBNeUludGVyZmFjZT46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoaW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPE15SW1wbCwgY29uc3QgTXlJbnRlcmZhY2UmPjo6dmFsdWUpKTsKIAotICAjZW5kaWYKKyNlbmRpZgogCiAgIHsKICAgICBpbnQgaSA9IDA7Ci0gICAgVkVSSUZZKCggY2hlY2tfaXNfY29udmVydGlibGUoZml4PDM+KCksIGkpICkpOwotICAgIFZFUklGWSgoIWNoZWNrX2lzX2NvbnZlcnRpYmxlKGksIGZpeDxEeW5hbWljSW5kZXg+KCkpICkpOworICAgIFZFUklGWSgoY2hlY2tfaXNfY29udmVydGlibGUoZml4PDM+KCksIGkpKSk7CisgICAgVkVSSUZZKCghY2hlY2tfaXNfY29udmVydGlibGUoaSwgZml4PER5bmFtaWNJbmRleD4oKSkpKTsKICAgfQogCi0KLSAgVkVSSUZZKCggIGludGVybmFsOjpoYXNfUmV0dXJuVHlwZTxGb29SZXR1cm5UeXBlPjo6dmFsdWUgKSk7Ci0gIFZFUklGWSgoICBpbnRlcm5hbDo6aGFzX1JldHVyblR5cGU8U2NhbGFyQmluYXJ5T3BUcmFpdHM8aW50LGludD4gPjo6dmFsdWUgKSk7Ci0gIFZFUklGWSgoICFpbnRlcm5hbDo6aGFzX1JldHVyblR5cGU8TWF0cml4WGY+Ojp2YWx1ZSApKTsKLSAgVkVSSUZZKCggIWludGVybmFsOjpoYXNfUmV0dXJuVHlwZTxpbnQ+Ojp2YWx1ZSApKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aGFzX1JldHVyblR5cGU8Rm9vUmV0dXJuVHlwZT46OnZhbHVlKSk7CisgIFZFUklGWSgoaW50ZXJuYWw6Omhhc19SZXR1cm5UeXBlPFNjYWxhckJpbmFyeU9wVHJhaXRzPGludCwgaW50Pj46OnZhbHVlKSk7CisgIFZFUklGWSgoIWludGVybmFsOjpoYXNfUmV0dXJuVHlwZTxNYXRyaXhYZj46OnZhbHVlKSk7CisgIFZFUklGWSgoIWludGVybmFsOjpoYXNfUmV0dXJuVHlwZTxpbnQ+Ojp2YWx1ZSkpOwogCiAgIFZFUklGWShpbnRlcm5hbDo6bWV0YV9zcXJ0PDE+OjpyZXQgPT0gMSk7Ci0gICNkZWZpbmUgVkVSSUZZX01FVEFfU1FSVChYKSBWRVJJRlkoaW50ZXJuYWw6Om1ldGFfc3FydDxYPjo6cmV0ID09IGludChzdGQ6OnNxcnQoZG91YmxlKFgpKSkpCisjZGVmaW5lIFZFUklGWV9NRVRBX1NRUlQoWCkgVkVSSUZZKGludGVybmFsOjptZXRhX3NxcnQ8WD46OnJldCA9PSBpbnQoc3RkOjpzcXJ0KGRvdWJsZShYKSkpKQogICBWRVJJRllfTUVUQV9TUVJUKDIpOwogICBWRVJJRllfTUVUQV9TUVJUKDMpOwogICBWRVJJRllfTUVUQV9TUVJUKDQpOwpAQCAtMTM1LDQwICsxMzIsNDAgQEAKICAgVkVSSUZZX01FVEFfU1FSVCgxMDI1KTsKIH0KIAotdXNpbmcgRWlnZW46OmludGVybmFsOjppc19zYW1lOwotdXNpbmcgRWlnZW46OmludGVybmFsOjp0eXBlX2xpc3Q7Ci11c2luZyBFaWdlbjo6aW50ZXJuYWw6Om51bWVyaWNfbGlzdDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXBwbHlfb3BfZnJvbV9sZWZ0OwordXNpbmcgRWlnZW46OmludGVybmFsOjphcHBseV9vcF9mcm9tX3JpZ2h0OwordXNpbmcgRWlnZW46OmludGVybmFsOjphcmdfcHJvZDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXJnX3N1bTsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfYXBwbHk7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OmFycmF5X2FwcGx5X2FuZF9yZWR1Y2U7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OmFycmF5X3Byb2Q7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OmFycmF5X3JlZHVjZTsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfcmV2ZXJzZTsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfc3VtOwordXNpbmcgRWlnZW46OmludGVybmFsOjphcnJheV96aXA7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OmFycmF5X3ppcF9hbmRfcmVkdWNlOwordXNpbmcgRWlnZW46OmludGVybmFsOjpjb25jYXQ7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OmNvbnRhaW5lZF9pbl9saXN0OwordXNpbmcgRWlnZW46OmludGVybmFsOjpjb250YWluZWRfaW5fbGlzdF9nZjsKIHVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6Z2VuX251bWVyaWNfbGlzdDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6Z2VuX251bWVyaWNfbGlzdF9yZXBlYXRlZDsKIHVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6Z2VuX251bWVyaWNfbGlzdF9yZXZlcnNlZDsKIHVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6Z2VuX251bWVyaWNfbGlzdF9zd2FwcGVkX3BhaXI7Ci11c2luZyBFaWdlbjo6aW50ZXJuYWw6Omdlbl9udW1lcmljX2xpc3RfcmVwZWF0ZWQ7Ci11c2luZyBFaWdlbjo6aW50ZXJuYWw6OmNvbmNhdDsKLXVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6bWNvbmNhdDsKLXVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6dGFrZTsKLXVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6c2tpcDsKLXVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6c2xpY2U7CiB1c2luZyBFaWdlbjo6aW50ZXJuYWw6OmdldDsKIHVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6aWRfbnVtZXJpYzsKIHVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6aWRfdHlwZTsKLXVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6aXNfc2FtZV9nZjsKLXVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXBwbHlfb3BfZnJvbV9sZWZ0OwotdXNpbmcgRWlnZW46OmludGVybmFsOjphcHBseV9vcF9mcm9tX3JpZ2h0OwotdXNpbmcgRWlnZW46OmludGVybmFsOjpjb250YWluZWRfaW5fbGlzdDsKLXVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6Y29udGFpbmVkX2luX2xpc3RfZ2Y7Ci11c2luZyBFaWdlbjo6aW50ZXJuYWw6OmFyZ19wcm9kOwotdXNpbmcgRWlnZW46OmludGVybmFsOjphcmdfc3VtOwotdXNpbmcgRWlnZW46OmludGVybmFsOjpzdW1fb3A7Ci11c2luZyBFaWdlbjo6aW50ZXJuYWw6OnByb2R1Y3Rfb3A7Ci11c2luZyBFaWdlbjo6aW50ZXJuYWw6OmFycmF5X3JldmVyc2U7Ci11c2luZyBFaWdlbjo6aW50ZXJuYWw6OmFycmF5X3N1bTsKLXVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfcHJvZDsKLXVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfcmVkdWNlOwotdXNpbmcgRWlnZW46OmludGVybmFsOjphcnJheV96aXA7Ci11c2luZyBFaWdlbjo6aW50ZXJuYWw6OmFycmF5X3ppcF9hbmRfcmVkdWNlOwotdXNpbmcgRWlnZW46OmludGVybmFsOjphcnJheV9hcHBseTsKLXVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfYXBwbHlfYW5kX3JlZHVjZTsKLXVzaW5nIEVpZ2VuOjppbnRlcm5hbDo6cmVwZWF0OwogdXNpbmcgRWlnZW46OmludGVybmFsOjppbnN0YW50aWF0ZV9ieV9jX2FycmF5OwordXNpbmcgRWlnZW46OmludGVybmFsOjppc19zYW1lOwordXNpbmcgRWlnZW46OmludGVybmFsOjppc19zYW1lX2dmOwordXNpbmcgRWlnZW46OmludGVybmFsOjptY29uY2F0OwordXNpbmcgRWlnZW46OmludGVybmFsOjpudW1lcmljX2xpc3Q7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OnByb2R1Y3Rfb3A7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OnJlcGVhdDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6c2tpcDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6c2xpY2U7Cit1c2luZyBFaWdlbjo6aW50ZXJuYWw6OnN1bV9vcDsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6dGFrZTsKK3VzaW5nIEVpZ2VuOjppbnRlcm5hbDo6dHlwZV9saXN0OwogCiBzdHJ1Y3QgZHVtbXlfYSB7fTsKIHN0cnVjdCBkdW1teV9iIHt9OwpAQCAtMTc3LDI2ICsxNzQsNzQgQEAKIHN0cnVjdCBkdW1teV9lIHt9OwogCiAvLyBkdW1teSBvcGVyYXRpb24gZm9yIHRlc3RpbmcgYXBwbHkKLXRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+IHN0cnVjdCBkdW1teV9vcDsKLXRlbXBsYXRlPD4gc3RydWN0IGR1bW15X29wPGR1bW15X2EsIGR1bW15X2I+IHsgdHlwZWRlZiBkdW1teV9jIHR5cGU7IH07Ci10ZW1wbGF0ZTw+IHN0cnVjdCBkdW1teV9vcDxkdW1teV9iLCBkdW1teV9hPiB7IHR5cGVkZWYgZHVtbXlfZCB0eXBlOyB9OwotdGVtcGxhdGU8PiBzdHJ1Y3QgZHVtbXlfb3A8ZHVtbXlfYiwgZHVtbXlfYz4geyB0eXBlZGVmIGR1bW15X2EgdHlwZTsgfTsKLXRlbXBsYXRlPD4gc3RydWN0IGR1bW15X29wPGR1bW15X2MsIGR1bW15X2I+IHsgdHlwZWRlZiBkdW1teV9kIHR5cGU7IH07Ci10ZW1wbGF0ZTw+IHN0cnVjdCBkdW1teV9vcDxkdW1teV9jLCBkdW1teV9hPiB7IHR5cGVkZWYgZHVtbXlfYiB0eXBlOyB9OwotdGVtcGxhdGU8PiBzdHJ1Y3QgZHVtbXlfb3A8ZHVtbXlfYSwgZHVtbXlfYz4geyB0eXBlZGVmIGR1bW15X2QgdHlwZTsgfTsKLXRlbXBsYXRlPD4gc3RydWN0IGR1bW15X29wPGR1bW15X2EsIGR1bW15X2E+IHsgdHlwZWRlZiBkdW1teV9lIHR5cGU7IH07Ci10ZW1wbGF0ZTw+IHN0cnVjdCBkdW1teV9vcDxkdW1teV9iLCBkdW1teV9iPiB7IHR5cGVkZWYgZHVtbXlfZSB0eXBlOyB9OwotdGVtcGxhdGU8PiBzdHJ1Y3QgZHVtbXlfb3A8ZHVtbXlfYywgZHVtbXlfYz4geyB0eXBlZGVmIGR1bW15X2UgdHlwZTsgfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorc3RydWN0IGR1bW15X29wOwordGVtcGxhdGUgPD4KK3N0cnVjdCBkdW1teV9vcDxkdW1teV9hLCBkdW1teV9iPiB7CisgIHR5cGVkZWYgZHVtbXlfYyB0eXBlOworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZHVtbXlfb3A8ZHVtbXlfYiwgZHVtbXlfYT4geworICB0eXBlZGVmIGR1bW15X2QgdHlwZTsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGR1bW15X29wPGR1bW15X2IsIGR1bW15X2M+IHsKKyAgdHlwZWRlZiBkdW1teV9hIHR5cGU7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBkdW1teV9vcDxkdW1teV9jLCBkdW1teV9iPiB7CisgIHR5cGVkZWYgZHVtbXlfZCB0eXBlOworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZHVtbXlfb3A8ZHVtbXlfYywgZHVtbXlfYT4geworICB0eXBlZGVmIGR1bW15X2IgdHlwZTsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGR1bW15X29wPGR1bW15X2EsIGR1bW15X2M+IHsKKyAgdHlwZWRlZiBkdW1teV9kIHR5cGU7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBkdW1teV9vcDxkdW1teV9hLCBkdW1teV9hPiB7CisgIHR5cGVkZWYgZHVtbXlfZSB0eXBlOworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZHVtbXlfb3A8ZHVtbXlfYiwgZHVtbXlfYj4geworICB0eXBlZGVmIGR1bW15X2UgdHlwZTsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGR1bW15X29wPGR1bW15X2MsIGR1bW15X2M+IHsKKyAgdHlwZWRlZiBkdW1teV9lIHR5cGU7Cit9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPiBzdHJ1Y3QgZHVtbXlfdGVzdCB7IGNvbnN0ZXhwciBzdGF0aWMgYm9vbCB2YWx1ZSA9IGZhbHNlOyBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPSAwOyB9OwotdGVtcGxhdGU8PiBzdHJ1Y3QgZHVtbXlfdGVzdDxkdW1teV9hLCBkdW1teV9hPiAgICAgeyBjb25zdGV4cHIgc3RhdGljIGJvb2wgdmFsdWUgPSB0cnVlOyAgY29uc3RleHByIHN0YXRpYyBpbnQgZ2xvYmFsX2ZsYWdzID0gMTsgfTsKLXRlbXBsYXRlPD4gc3RydWN0IGR1bW15X3Rlc3Q8ZHVtbXlfYiwgZHVtbXlfYj4gICAgIHsgY29uc3RleHByIHN0YXRpYyBib29sIHZhbHVlID0gdHJ1ZTsgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGdsb2JhbF9mbGFncyA9IDI7IH07Ci10ZW1wbGF0ZTw+IHN0cnVjdCBkdW1teV90ZXN0PGR1bW15X2MsIGR1bW15X2M+ICAgICB7IGNvbnN0ZXhwciBzdGF0aWMgYm9vbCB2YWx1ZSA9IHRydWU7ICBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPSA0OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CitzdHJ1Y3QgZHVtbXlfdGVzdCB7CisgIGNvbnN0ZXhwciBzdGF0aWMgYm9vbCB2YWx1ZSA9IGZhbHNlOworICBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPSAwOworfTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZHVtbXlfdGVzdDxkdW1teV9hLCBkdW1teV9hPiB7CisgIGNvbnN0ZXhwciBzdGF0aWMgYm9vbCB2YWx1ZSA9IHRydWU7CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGdsb2JhbF9mbGFncyA9IDE7Cit9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBkdW1teV90ZXN0PGR1bW15X2IsIGR1bW15X2I+IHsKKyAgY29uc3RleHByIHN0YXRpYyBib29sIHZhbHVlID0gdHJ1ZTsKKyAgY29uc3RleHByIHN0YXRpYyBpbnQgZ2xvYmFsX2ZsYWdzID0gMjsKK307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGR1bW15X3Rlc3Q8ZHVtbXlfYywgZHVtbXlfYz4geworICBjb25zdGV4cHIgc3RhdGljIGJvb2wgdmFsdWUgPSB0cnVlOworICBjb25zdGV4cHIgc3RhdGljIGludCBnbG9iYWxfZmxhZ3MgPSA0OworfTsKIAotc3RydWN0IHRpbWVzMl9vcCB7IHRlbXBsYXRlPHR5cGVuYW1lIEE+IHN0YXRpYyBBIHJ1bihBIHYpIHsgcmV0dXJuIHYgKiAyOyB9IH07CitzdHJ1Y3QgdGltZXMyX29wIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEE+CisgIHN0YXRpYyBBIHJ1bihBIHYpIHsKKyAgICByZXR1cm4gdiAqIDI7CisgIH0KK307CiAKLXN0cnVjdCBkdW1teV9pbnN0Ci17CitzdHJ1Y3QgZHVtbXlfaW5zdCB7CiAgIGludCBjOwogCiAgIGR1bW15X2luc3QoKSA6IGMoMCkge30KQEAgLTIwNyw4ICsyNTIsNyBAQAogICBkdW1teV9pbnN0KGludCwgaW50LCBpbnQsIGludCwgaW50KSA6IGMoNSkge30KIH07CiAKLXN0YXRpYyB2b2lkIHRlc3RfZ2VuX251bWVyaWNfbGlzdCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X2dlbl9udW1lcmljX2xpc3QoKSB7CiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0PGludCwgMD46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQ+Pjo6dmFsdWUpKTsKICAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Q8aW50LCAxPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMD4+Ojp2YWx1ZSkpOwogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdDxpbnQsIDI+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAxPj46OnZhbHVlKSk7CkBAIC0yMTksNjggKzI2Myw4OCBAQAogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdDxpbnQsIDEsIDQyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgNDI+Pjo6dmFsdWUpKTsKICAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Q8aW50LCAyLCA0Mj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDQyLCA0Mz4+Ojp2YWx1ZSkpOwogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdDxpbnQsIDUsIDQyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgNDIsIDQzLCA0NCwgNDUsIDQ2Pj46OnZhbHVlKSk7Ci0gIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0PGludCwgMTAsIDQyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTE+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Q8aW50LCAxMCwgNDI+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgbnVtZXJpY19saXN0PGludCwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTE+Pjo6dmFsdWUpKTsKIAogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9yZXZlcnNlZDxpbnQsIDA+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50Pj46OnZhbHVlKSk7CiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JldmVyc2VkPGludCwgMT46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDA+Pjo6dmFsdWUpKTsKICAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3RfcmV2ZXJzZWQ8aW50LCAyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMSwgMD4+Ojp2YWx1ZSkpOwogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9yZXZlcnNlZDxpbnQsIDU+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCA0LCAzLCAyLCAxLCAwPj46OnZhbHVlKSk7Ci0gIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JldmVyc2VkPGludCwgMTA+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JldmVyc2VkPGludCwgMTA+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgbnVtZXJpY19saXN0PGludCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMD4+Ojp2YWx1ZSkpOwogCiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JldmVyc2VkPGludCwgMCwgNDI+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50Pj46OnZhbHVlKSk7CiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JldmVyc2VkPGludCwgMSwgNDI+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCA0Mj4+Ojp2YWx1ZSkpOwogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9yZXZlcnNlZDxpbnQsIDIsIDQyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgNDMsIDQyPj46OnZhbHVlKSk7CiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JldmVyc2VkPGludCwgNSwgNDI+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCA0NiwgNDUsIDQ0LCA0MywgNDI+Pjo6dmFsdWUpKTsKLSAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3RfcmV2ZXJzZWQ8aW50LCAxMCwgNDI+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCA1MSwgNTAsIDQ5LCA0OCwgNDcsIDQ2LCA0NSwgNDQsIDQzLCA0Mj4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9yZXZlcnNlZDxpbnQsIDEwLCA0Mj46OnR5cGUsCisgICAgICAgICAgICAgICAgICBudW1lcmljX2xpc3Q8aW50LCA1MSwgNTAsIDQ5LCA0OCwgNDcsIDQ2LCA0NSwgNDQsIDQzLCA0Mj4+Ojp2YWx1ZSkpOwogCiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3N3YXBwZWRfcGFpcjxpbnQsIDAsIDIsIDM+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50Pj46OnZhbHVlKSk7CiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3N3YXBwZWRfcGFpcjxpbnQsIDEsIDIsIDM+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwPj46OnZhbHVlKSk7CiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3N3YXBwZWRfcGFpcjxpbnQsIDIsIDIsIDM+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAxPj46OnZhbHVlKSk7Ci0gIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3N3YXBwZWRfcGFpcjxpbnQsIDUsIDIsIDM+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAxLCAzLCAyLCA0Pj46OnZhbHVlKSk7Ci0gIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3N3YXBwZWRfcGFpcjxpbnQsIDEwLCAyLCAzPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMCwgMSwgMywgMiwgNCwgNSwgNiwgNywgOCwgOT4+Ojp2YWx1ZSkpOworICBWRVJJRlkoCisgICAgICAoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3N3YXBwZWRfcGFpcjxpbnQsIDUsIDIsIDM+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAxLCAzLCAyLCA0Pj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3N3YXBwZWRfcGFpcjxpbnQsIDEwLCAyLCAzPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgIG51bWVyaWNfbGlzdDxpbnQsIDAsIDEsIDMsIDIsIDQsIDUsIDYsIDcsIDgsIDk+Pjo6dmFsdWUpKTsKIAogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9zd2FwcGVkX3BhaXI8aW50LCAwLCA0NCwgNDUsIDQyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludD4+Ojp2YWx1ZSkpOwogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9zd2FwcGVkX3BhaXI8aW50LCAxLCA0NCwgNDUsIDQyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgNDI+Pjo6dmFsdWUpKTsKICAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Rfc3dhcHBlZF9wYWlyPGludCwgMiwgNDQsIDQ1LCA0Mj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDQyLCA0Mz4+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9zd2FwcGVkX3BhaXI8aW50LCA1LCA0NCwgNDUsIDQyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgNDIsIDQzLCA0NSwgNDQsIDQ2Pj46OnZhbHVlKSk7Ci0gIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3N3YXBwZWRfcGFpcjxpbnQsIDEwLCA0NCwgNDUsIDQyPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgNDIsIDQzLCA0NSwgNDQsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTE+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Rfc3dhcHBlZF9wYWlyPGludCwgNSwgNDQsIDQ1LCA0Mj46OnR5cGUsCisgICAgICAgICAgICAgICAgICBudW1lcmljX2xpc3Q8aW50LCA0MiwgNDMsIDQ1LCA0NCwgNDY+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3Rfc3dhcHBlZF9wYWlyPGludCwgMTAsIDQ0LCA0NSwgNDI+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgbnVtZXJpY19saXN0PGludCwgNDIsIDQzLCA0NSwgNDQsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTE+Pjo6dmFsdWUpKTsKIAogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9yZXBlYXRlZDxpbnQsIDAsIDA+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50Pj46OnZhbHVlKSk7CiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JlcGVhdGVkPGludCwgMSwgMD46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDA+Pjo6dmFsdWUpKTsKICAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGdlbl9udW1lcmljX2xpc3RfcmVwZWF0ZWQ8aW50LCAyLCAwPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMCwgMD4+Ojp2YWx1ZSkpOwogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgZ2VuX251bWVyaWNfbGlzdF9yZXBlYXRlZDxpbnQsIDUsIDA+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAwLCAwLCAwLCAwPj46OnZhbHVlKSk7Ci0gIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JlcGVhdGVkPGludCwgMTAsIDA+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBnZW5fbnVtZXJpY19saXN0X3JlcGVhdGVkPGludCwgMTAsIDA+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgbnVtZXJpY19saXN0PGludCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMD4+Ojp2YWx1ZSkpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X2NvbmNhdCgpCi17Ci0gIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8dHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2E+LCB0eXBlX2xpc3Q8Pj46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hPj46OnZhbHVlKSk7Ci0gIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8dHlwZV9saXN0PD4sIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hPj46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hPj46OnZhbHVlKSk7Ci0gIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8dHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2E+LCB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYT4+Ojp0eXBlLCB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYSwgZHVtbXlfYSwgZHVtbXlfYT4+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgY29uY2F0PHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hPiwgdHlwZV9saXN0PGR1bW15X2IsIGR1bW15X2M+Pjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2EsIGR1bW15X2IsIGR1bW15X2M+Pjo6dmFsdWUpKTsKLSAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGNvbmNhdDx0eXBlX2xpc3Q8ZHVtbXlfYT4sIHR5cGVfbGlzdDxkdW1teV9iLCBkdW1teV9jPj46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9iLCBkdW1teV9jPj46OnZhbHVlKSk7CitzdGF0aWMgdm9pZCB0ZXN0X2NvbmNhdCgpIHsKKyAgVkVSSUZZKAorICAgICAgKGlzX3NhbWU8dHlwZW5hbWUgY29uY2F0PHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hPiwgdHlwZV9saXN0PD4+Ojp0eXBlLCB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYT4+Ojp2YWx1ZSkpOworICBWRVJJRlkoCisgICAgICAoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8dHlwZV9saXN0PD4sIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hPj46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8dHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2E+LCB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYT4+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2EsIGR1bW15X2EsIGR1bW15X2E+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGNvbmNhdDx0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYT4sIHR5cGVfbGlzdDxkdW1teV9iLCBkdW1teV9jPj46OnR5cGUsCisgICAgICAgICAgICAgICAgICB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYSwgZHVtbXlfYiwgZHVtbXlfYz4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgY29uY2F0PHR5cGVfbGlzdDxkdW1teV9hPiwgdHlwZV9saXN0PGR1bW15X2IsIGR1bW15X2M+Pjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9iLCBkdW1teV9jPj46OnZhbHVlKSk7CiAKICAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGNvbmNhdDxudW1lcmljX2xpc3Q8aW50LCAwLCAwPiwgbnVtZXJpY19saXN0PGludD4+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAwPj46OnZhbHVlKSk7CiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8bnVtZXJpY19saXN0PGludD4sIG51bWVyaWNfbGlzdDxpbnQsIDAsIDA+Pjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMCwgMD4+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgY29uY2F0PG51bWVyaWNfbGlzdDxpbnQsIDAsIDA+LCBudW1lcmljX2xpc3Q8aW50LCAwLCAwPj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDAsIDAsIDA+Pjo6dmFsdWUpKTsKLSAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGNvbmNhdDxudW1lcmljX2xpc3Q8aW50LCAwLCAwPiwgbnVtZXJpY19saXN0PGludCwgMSwgMj4+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAwLCAxLCAyPj46OnZhbHVlKSk7Ci0gIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8bnVtZXJpY19saXN0PGludCwgMD4sIG51bWVyaWNfbGlzdDxpbnQsIDEsIDI+Pjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMCwgMSwgMj4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgY29uY2F0PG51bWVyaWNfbGlzdDxpbnQsIDAsIDA+LCBudW1lcmljX2xpc3Q8aW50LCAwLCAwPj46OnR5cGUsCisgICAgICAgICAgICAgICAgICBudW1lcmljX2xpc3Q8aW50LCAwLCAwLCAwLCAwPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBjb25jYXQ8bnVtZXJpY19saXN0PGludCwgMCwgMD4sIG51bWVyaWNfbGlzdDxpbnQsIDEsIDI+Pjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgIG51bWVyaWNfbGlzdDxpbnQsIDAsIDAsIDEsIDI+Pjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIGNvbmNhdDxudW1lcmljX2xpc3Q8aW50LCAwPiwgbnVtZXJpY19saXN0PGludCwgMSwgMj4+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgbnVtZXJpY19saXN0PGludCwgMCwgMSwgMj4+Ojp2YWx1ZSkpOwogCiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PHR5cGVfbGlzdDxkdW1teV9hPj46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hPj46OnZhbHVlKSk7CiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PHR5cGVfbGlzdDxkdW1teV9hPiwgdHlwZV9saXN0PGR1bW15X2I+Pjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2I+Pjo6dmFsdWUpKTsKLSAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIG1jb25jYXQ8dHlwZV9saXN0PGR1bW15X2E+LCB0eXBlX2xpc3Q8ZHVtbXlfYj4sIHR5cGVfbGlzdDxkdW1teV9jPj46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9iLCBkdW1teV9jPj46OnZhbHVlKSk7Ci0gIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PHR5cGVfbGlzdDxkdW1teV9hPiwgdHlwZV9saXN0PGR1bW15X2IsIGR1bW15X2M+Pjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2IsIGR1bW15X2M+Pjo6dmFsdWUpKTsKLSAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIG1jb25jYXQ8dHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2I+LCB0eXBlX2xpc3Q8ZHVtbXlfYz4+Ojp0eXBlLCB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYiwgZHVtbXlfYz4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgbWNvbmNhdDx0eXBlX2xpc3Q8ZHVtbXlfYT4sIHR5cGVfbGlzdDxkdW1teV9iPiwgdHlwZV9saXN0PGR1bW15X2M+Pjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9iLCBkdW1teV9jPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PHR5cGVfbGlzdDxkdW1teV9hPiwgdHlwZV9saXN0PGR1bW15X2IsIGR1bW15X2M+Pjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9iLCBkdW1teV9jPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9iPiwgdHlwZV9saXN0PGR1bW15X2M+Pjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9iLCBkdW1teV9jPj46OnZhbHVlKSk7CiAKICAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIG1jb25jYXQ8bnVtZXJpY19saXN0PGludCwgMD4+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwPj46OnZhbHVlKSk7CiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PG51bWVyaWNfbGlzdDxpbnQsIDA+LCBudW1lcmljX2xpc3Q8aW50LCAxPj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDE+Pjo6dmFsdWUpKTsKLSAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIG1jb25jYXQ8bnVtZXJpY19saXN0PGludCwgMD4sIG51bWVyaWNfbGlzdDxpbnQsIDE+LCBudW1lcmljX2xpc3Q8aW50LCAyPj46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDEsIDI+Pjo6dmFsdWUpKTsKLSAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIG1jb25jYXQ8bnVtZXJpY19saXN0PGludCwgMD4sIG51bWVyaWNfbGlzdDxpbnQsIDEsIDI+Pjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMCwgMSwgMj4+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgbWNvbmNhdDxudW1lcmljX2xpc3Q8aW50LCAwLCAxPiwgbnVtZXJpY19saXN0PGludCwgMj4+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAxLCAyPj46OnZhbHVlKSk7CisgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBtY29uY2F0PG51bWVyaWNfbGlzdDxpbnQsIDA+LCBudW1lcmljX2xpc3Q8aW50LCAxPiwgbnVtZXJpY19saXN0PGludCwgMj4+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgbnVtZXJpY19saXN0PGludCwgMCwgMSwgMj4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgbWNvbmNhdDxudW1lcmljX2xpc3Q8aW50LCAwPiwgbnVtZXJpY19saXN0PGludCwgMSwgMj4+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgbnVtZXJpY19saXN0PGludCwgMCwgMSwgMj4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgbWNvbmNhdDxudW1lcmljX2xpc3Q8aW50LCAwLCAxPiwgbnVtZXJpY19saXN0PGludCwgMj4+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgbnVtZXJpY19saXN0PGludCwgMCwgMSwgMj4+Ojp2YWx1ZSkpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X3NsaWNlKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3Rfc2xpY2UoKSB7CiAgIHR5cGVkZWYgdHlwZV9saXN0PGR1bW15X2EsIGR1bW15X2EsIGR1bW15X2IsIGR1bW15X2IsIGR1bW15X2MsIGR1bW15X2M+IHRsOwogICB0eXBlZGVmIG51bWVyaWNfbGlzdDxpbnQsIDAsIDEsIDIsIDMsIDQsIDU+IGlsOwogCkBAIC0yOTksNyArMzYzLDcgQEAKICAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHRha2U8NCwgaWw+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAwLCAxLCAyLCAzPj46OnZhbHVlKSk7CiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSB0YWtlPDUsIGlsPjo6dHlwZSwgbnVtZXJpY19saXN0PGludCwgMCwgMSwgMiwgMywgND4+Ojp2YWx1ZSkpOwogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgdGFrZTw2LCBpbD46OnR5cGUsIG51bWVyaWNfbGlzdDxpbnQsIDAsIDEsIDIsIDMsIDQsIDU+Pjo6dmFsdWUpKTsKLSAgCisKICAgVkVSSUZZKChpc19zYW1lPHR5cGVuYW1lIHNraXA8MCwgdGw+Ojp0eXBlLCB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYSwgZHVtbXlfYiwgZHVtbXlfYiwgZHVtbXlfYywgZHVtbXlfYz4+Ojp2YWx1ZSkpOwogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgc2tpcDwxLCB0bD46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9iLCBkdW1teV9iLCBkdW1teV9jLCBkdW1teV9jPj46OnZhbHVlKSk7CiAgIFZFUklGWSgoaXNfc2FtZTx0eXBlbmFtZSBza2lwPDIsIHRsPjo6dHlwZSwgdHlwZV9saXN0PGR1bW15X2IsIGR1bW15X2IsIGR1bW15X2MsIGR1bW15X2M+Pjo6dmFsdWUpKTsKQEAgLTMyMiw4ICszODYsNyBAQAogICBWRVJJRlkoKGlzX3NhbWU8dHlwZW5hbWUgc2xpY2U8MSwgMywgaWw+Ojp0eXBlLCBudW1lcmljX2xpc3Q8aW50LCAxLCAyLCAzPj46OnZhbHVlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfZ2V0KCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfZ2V0KCkgewogICB0eXBlZGVmIHR5cGVfbGlzdDxkdW1teV9hLCBkdW1teV9hLCBkdW1teV9iLCBkdW1teV9iLCBkdW1teV9jLCBkdW1teV9jPiB0bDsKICAgdHlwZWRlZiBudW1lcmljX2xpc3Q8aW50LCA0LCA4LCAxNSwgMTYsIDIzLCA0Mj4gaWw7CiAKQEAgLTM0Miw1MCArNDA1LDQ1IEBACiAgIFZFUklGWV9JU19FUVVBTCgoKGludClnZXQ8NSwgaWw+Ojp2YWx1ZSksIDQyKTsKIH0KIAotc3RhdGljIHZvaWQgdGVzdF9pZF9oZWxwZXIoZHVtbXlfYSBhLCBkdW1teV9hIGIsIGR1bW15X2EgYykKLXsKK3N0YXRpYyB2b2lkIHRlc3RfaWRfaGVscGVyKGR1bW15X2EgYSwgZHVtbXlfYSBiLCBkdW1teV9hIGMpIHsKICAgKHZvaWQpYTsKICAgKHZvaWQpYjsKICAgKHZvaWQpYzsKIH0KIAotdGVtcGxhdGU8aW50Li4uIGlpPgotc3RhdGljIHZvaWQgdGVzdF9pZF9udW1lcmljKCkKLXsKK3RlbXBsYXRlIDxpbnQuLi4gaWk+CitzdGF0aWMgdm9pZCB0ZXN0X2lkX251bWVyaWMoKSB7CiAgIHRlc3RfaWRfaGVscGVyKHR5cGVuYW1lIGlkX251bWVyaWM8aW50LCBpaSwgZHVtbXlfYT46OnR5cGUoKS4uLik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lLi4uIHR0Pgotc3RhdGljIHZvaWQgdGVzdF9pZF90eXBlKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiB0dD4KK3N0YXRpYyB2b2lkIHRlc3RfaWRfdHlwZSgpIHsKICAgdGVzdF9pZF9oZWxwZXIodHlwZW5hbWUgaWRfdHlwZTx0dCwgZHVtbXlfYT46OnR5cGUoKS4uLik7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfaWQoKQoteworc3RhdGljIHZvaWQgdGVzdF9pZCgpIHsKICAgLy8gZG9uJ3QgY2FsbCBWRVJJRlkgaGVyZSwganVzdCBhc3N1bWUgaXQgd29ya3MgaWYgaXQgY29tcGlsZXMKICAgLy8gKG90aGVyd2lzZSBpdCB3aWxsIGNvbXBsYWluIHRoYXQgaXQgY2FuJ3QgZmluZCB0aGUgZnVuY3Rpb24pCiAgIHRlc3RfaWRfbnVtZXJpYzwxLCA0LCA2PigpOwogICB0ZXN0X2lkX3R5cGU8ZHVtbXlfYSwgZHVtbXlfYiwgZHVtbXlfYz4oKTsKIH0KIAotc3RhdGljIHZvaWQgdGVzdF9pc19zYW1lX2dmKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfaXNfc2FtZV9nZigpIHsKICAgVkVSSUZZKCghaXNfc2FtZV9nZjxkdW1teV9hLCBkdW1teV9iPjo6dmFsdWUpKTsKICAgVkVSSUZZKCghIWlzX3NhbWVfZ2Y8ZHVtbXlfYSwgZHVtbXlfYT46OnZhbHVlKSk7CiAgIFZFUklGWV9JU19FUVVBTCgoISFpc19zYW1lX2dmPGR1bW15X2EsIGR1bW15X2I+OjpnbG9iYWxfZmxhZ3MpLCBmYWxzZSk7CiAgIFZFUklGWV9JU19FUVVBTCgoISFpc19zYW1lX2dmPGR1bW15X2EsIGR1bW15X2E+OjpnbG9iYWxfZmxhZ3MpLCBmYWxzZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfYXBwbHlfb3AoKQoteworc3RhdGljIHZvaWQgdGVzdF9hcHBseV9vcCgpIHsKICAgdHlwZWRlZiB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYiwgZHVtbXlfYz4gdGw7Ci0gIFZFUklGWSgoISFpc19zYW1lPHR5cGVuYW1lIGFwcGx5X29wX2Zyb21fbGVmdDxkdW1teV9vcCwgZHVtbXlfYSwgdGw+Ojp0eXBlLCB0eXBlX2xpc3Q8ZHVtbXlfZSwgZHVtbXlfYywgZHVtbXlfZD4+Ojp2YWx1ZSkpOwotICBWRVJJRlkoKCEhaXNfc2FtZTx0eXBlbmFtZSBhcHBseV9vcF9mcm9tX3JpZ2h0PGR1bW15X29wLCBkdW1teV9hLCB0bD46OnR5cGUsIHR5cGVfbGlzdDxkdW1teV9lLCBkdW1teV9kLCBkdW1teV9iPj46OnZhbHVlKSk7CisgIFZFUklGWSgoISFpc19zYW1lPHR5cGVuYW1lIGFwcGx5X29wX2Zyb21fbGVmdDxkdW1teV9vcCwgZHVtbXlfYSwgdGw+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICB0eXBlX2xpc3Q8ZHVtbXlfZSwgZHVtbXlfYywgZHVtbXlfZD4+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCEhaXNfc2FtZTx0eXBlbmFtZSBhcHBseV9vcF9mcm9tX3JpZ2h0PGR1bW15X29wLCBkdW1teV9hLCB0bD46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgIHR5cGVfbGlzdDxkdW1teV9lLCBkdW1teV9kLCBkdW1teV9iPj46OnZhbHVlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfY29udGFpbmVkX2luX2xpc3QoKQoteworc3RhdGljIHZvaWQgdGVzdF9jb250YWluZWRfaW5fbGlzdCgpIHsKICAgdHlwZWRlZiB0eXBlX2xpc3Q8ZHVtbXlfYSwgZHVtbXlfYiwgZHVtbXlfYz4gdGw7CiAKICAgVkVSSUZZKCghIWNvbnRhaW5lZF9pbl9saXN0PGlzX3NhbWUsIGR1bW15X2EsIHRsPjo6dmFsdWUpKTsKQEAgLTQwNywxNiArNDY1LDE0IEBACiAgIFZFUklGWV9JU19FUVVBTCgoKGludCljb250YWluZWRfaW5fbGlzdF9nZjxkdW1teV90ZXN0LCBkdW1teV9lLCB0bD46Omdsb2JhbF9mbGFncyksIDApOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X2FyZ19yZWR1Y3Rpb25zKCkKLXsKLSAgVkVSSUZZX0lTX0VRVUFMKGFyZ19zdW0oMSwyLDMsNCksIDEwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKGFyZ19wcm9kKDEsMiwzLDQpLCAyNCk7CitzdGF0aWMgdm9pZCB0ZXN0X2FyZ19yZWR1Y3Rpb25zKCkgeworICBWRVJJRllfSVNfRVFVQUwoYXJnX3N1bSgxLCAyLCAzLCA0KSwgMTApOworICBWRVJJRllfSVNfRVFVQUwoYXJnX3Byb2QoMSwgMiwgMywgNCksIDI0KTsKICAgVkVSSUZZX0lTX0FQUFJPWChhcmdfc3VtKDAuNSwgMiwgNSksIDcuNSk7CiAgIFZFUklGWV9JU19BUFBST1goYXJnX3Byb2QoMC41LCAyLCA1KSwgNS4wKTsKIH0KIAotc3RhdGljIHZvaWQgdGVzdF9hcnJheV9yZXZlcnNlX2FuZF9yZWR1Y2UoKQoteworc3RhdGljIHZvaWQgdGVzdF9hcnJheV9yZXZlcnNlX2FuZF9yZWR1Y2UoKSB7CiAgIGFycmF5PGludCwgNj4gYXt7NCwgOCwgMTUsIDE2LCAyMywgNDJ9fTsKICAgYXJyYXk8aW50LCA2PiBie3s0MiwgMjMsIDE2LCAxNSwgOCwgNH19OwogCkBAIC00MzAsOCArNDg2LDcgQEAKICAgVkVSSUZZX0lTX0VRVUFMKChhcnJheV9wcm9kKGIpKSwgNzQxODg4MCk7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfYXJyYXlfemlwX2FuZF9hcHBseSgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X2FycmF5X3ppcF9hbmRfYXBwbHkoKSB7CiAgIGFycmF5PGludCwgNj4gYXt7NCwgOCwgMTUsIDE2LCAyMywgNDJ9fTsKICAgYXJyYXk8aW50LCA2PiBie3swLCAxLCAyLCAzLCA0LCA1fX07CiAgIGFycmF5PGludCwgNj4gY3t7NCwgOSwgMTcsIDE5LCAyNywgNDd9fTsKQEAgLTQ0NywxNCArNTAyLDEzIEBACiAgIFZFUklGWV9JU19FUVVBTCgoYXJyYXlfemlwX2FuZF9yZWR1Y2U8c3VtX29wLCBwcm9kdWN0X29wPihhLCBiKSksIDM4OCk7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfYXJyYXlfbWlzYygpCi17CitzdGF0aWMgdm9pZCB0ZXN0X2FycmF5X21pc2MoKSB7CiAgIGFycmF5PGludCwgMz4gYTN7ezEsIDEsIDF9fTsKICAgYXJyYXk8aW50LCA2PiBhNnt7MiwgMiwgMiwgMiwgMiwgMn19OwogICBWRVJJRlkoKHJlcGVhdDwzLCBpbnQ+KDEpID09IGEzKSk7CiAgIFZFUklGWSgocmVwZWF0PDYsIGludD4oMikgPT0gYTYpKTsKIAotICBpbnQgZGF0YVs1XSA9IHsgMCwgMSwgMiwgMywgNCB9OworICBpbnQgZGF0YVs1XSA9IHswLCAxLCAyLCAzLCA0fTsKICAgVkVSSUZZX0lTX0VRVUFMKChpbnN0YW50aWF0ZV9ieV9jX2FycmF5PGR1bW15X2luc3QsIGludCwgMD4oZGF0YSkuYyksIDApOwogICBWRVJJRllfSVNfRVFVQUwoKGluc3RhbnRpYXRlX2J5X2NfYXJyYXk8ZHVtbXlfaW5zdCwgaW50LCAxPihkYXRhKS5jKSwgMSk7CiAgIFZFUklGWV9JU19FUVVBTCgoaW5zdGFudGlhdGVfYnlfY19hcnJheTxkdW1teV9pbnN0LCBpbnQsIDI+KGRhdGEpLmMpLCAyKTsKQEAgLTQ2Myw4ICs1MTcsNyBAQAogICBWRVJJRllfSVNfRVFVQUwoKGluc3RhbnRpYXRlX2J5X2NfYXJyYXk8ZHVtbXlfaW5zdCwgaW50LCA1PihkYXRhKS5jKSwgNSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV9tZXRhKQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX21ldGEpIHsKICAgQ0FMTF9TVUJURVNUKHRlc3RfZ2VuX251bWVyaWNfbGlzdCgpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfY29uY2F0KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9zbGljZSgpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvbWV0aXNfc3VwcG9ydC5jcHAgYi90ZXN0L21ldGlzX3N1cHBvcnQuY3BwCmluZGV4IGI0OTBkYWMuLmNmYmVhM2EgMTAwNjQ0Ci0tLSBhL3Rlc3QvbWV0aXNfc3VwcG9ydC5jcHAKKysrIGIvdGVzdC9tZXRpc19zdXBwb3J0LmNwcApAQCAtMTIsMTQgKzEyLDExIEBACiAjaW5jbHVkZSA8RWlnZW4vTWV0aXNTdXBwb3J0PgogI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL1NwYXJzZUV4dHJhPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHRlc3RfbWV0aXNfVCgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdF9tZXRpc19UKCkgewogICBTcGFyc2VMVTxTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+LCBNZXRpc09yZGVyaW5nPGludD4gPiBzcGFyc2VsdV9tZXRpczsKLSAgCi0gIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhzcGFyc2VsdV9tZXRpcyk7IAorCisgIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhzcGFyc2VsdV9tZXRpcyk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChtZXRpc19zdXBwb3J0KQotewotICBDQUxMX1NVQlRFU1RfMSh0ZXN0X21ldGlzX1Q8ZG91YmxlPigpKTsKLX0KK0VJR0VOX0RFQ0xBUkVfVEVTVChtZXRpc19zdXBwb3J0KSB7IENBTExfU1VCVEVTVF8xKHRlc3RfbWV0aXNfVDxkb3VibGU+KCkpOyB9CmRpZmYgLS1naXQgYS90ZXN0L21pc2NtYXRyaWNlcy5jcHAgYi90ZXN0L21pc2NtYXRyaWNlcy5jcHAKaW5kZXggZTcxNzEyZi4uZTM1MDZhZiAxMDA2NDQKLS0tIGEvdGVzdC9taXNjbWF0cmljZXMuY3BwCisrKyBiL3Rlc3QvbWlzY21hdHJpY2VzLmNwcApAQCAtOSw4ICs5LDggQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBtaXNjTWF0cmljZXMoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBtaXNjTWF0cmljZXMoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CiAgICAgIERpYWdvbmFsTWF0cml4LmggT25lcy5oCiAgICovCkBAIC0xOSwyOCArMTksMjkgQEAKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKLSAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksIHIyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKSwgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7Ci0gIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6T25lcyhyb3dzLGNvbHMpKHIsYyksIHN0YXRpY19jYXN0PFNjYWxhcj4oMSkpOwotICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6T25lcyhyb3dzLGNvbHMpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xKHIsYyksIHN0YXRpY19jYXN0PFNjYWxhcj4oMSkpOworICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cyAtIDEpLCByMiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAxKSwKKyAgICAgICAgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlOjpPbmVzKHJvd3MsIGNvbHMpKHIsIGMpLCBzdGF0aWNfY2FzdDxTY2FsYXI+KDEpKTsKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6Ok9uZXMocm93cywgY29scyk7CisgIFZFUklGWV9JU19BUFBST1gobTEociwgYyksIHN0YXRpY19jYXN0PFNjYWxhcj4oMSkpOwogICBWZWN0b3JUeXBlIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOwogICB2MVswXTsKLSAgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPgotICBzcXVhcmUodjEuYXNEaWFnb25hbCgpKTsKLSAgaWYocj09cjIpIFZFUklGWV9JU19BUFBST1goc3F1YXJlKHIscjIpLCB2MVtyXSk7Ci0gIGVsc2UgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHNxdWFyZShyLHIyKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPigxKSk7CisgIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gc3F1YXJlKHYxLmFzRGlhZ29uYWwoKSk7CisgIGlmIChyID09IHIyKQorICAgIFZFUklGWV9JU19BUFBST1goc3F1YXJlKHIsIHIyKSwgdjFbcl0pOworICBlbHNlCisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHNxdWFyZShyLCByMiksIHN0YXRpY19jYXN0PFNjYWxhcj4oMSkpOwogICBzcXVhcmUgPSBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIHJvd3MpOwogICBzcXVhcmUuZGlhZ29uYWwoKSA9IFZlY3RvclR5cGU6Ok9uZXMocm93cyk7CiAgIFZFUklGWV9JU19BUFBST1goc3F1YXJlLCBNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCByb3dzKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChtaXNjbWF0cmljZXMpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIG1pc2NNYXRyaWNlcyhNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIG1pc2NNYXRyaWNlcyhNYXRyaXg0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBtaXNjTWF0cmljZXMoTWF0cml4WGNmKDMsIDMpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBtaXNjTWF0cmljZXMoTWF0cml4WGkoOCwgMTIpKSApOwotICAgIENBTExfU1VCVEVTVF81KCBtaXNjTWF0cmljZXMoTWF0cml4WGNkKDIwLCAyMCkpICk7CitFSUdFTl9ERUNMQVJFX1RFU1QobWlzY21hdHJpY2VzKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKG1pc2NNYXRyaWNlcyhNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihtaXNjTWF0cmljZXMoTWF0cml4NGQoKSkpOworICAgIENBTExfU1VCVEVTVF8zKG1pc2NNYXRyaWNlcyhNYXRyaXhYY2YoMywgMykpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChtaXNjTWF0cmljZXMoTWF0cml4WGkoOCwgMTIpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUobWlzY01hdHJpY2VzKE1hdHJpeFhjZCgyMCwgMjApKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvbWl4aW5ndHlwZXMuY3BwIGIvdGVzdC9taXhpbmd0eXBlcy5jcHAKaW5kZXggZmU3NjBiNy4uOGYwZmZmMyAxMDA2NDQKLS0tIGEvdGVzdC9taXhpbmd0eXBlcy5jcHAKKysrIGIvdGVzdC9taXhpbmd0eXBlcy5jcHAKQEAgLTEzLDE4ICsxMywxNiBAQAogLy8gaWdub3JlIGRvdWJsZS1wcm9tb3Rpb24gZGlhZ25vc3RpYyBmb3IgY2xhbmcgYW5kIGdjYywgaWYgd2UgY2hlY2sgZm9yIHN0YXRpYyBhc3NlcnRpb24gYW55d2F5OgogLy8gVE9ETyBkbyB0aGUgc2FtZSBmb3IgTVNWQz8KICNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgIGlmIChfX2NsYW5nX21ham9yX18gKiAxMDAgKyBfX2NsYW5nX21pbm9yX18pID49IDMwOAotIyAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RvdWJsZS1wcm9tb3Rpb24iCi0jICBlbmRpZgorI2lmIChfX2NsYW5nX21ham9yX18gKiAxMDAgKyBfX2NsYW5nX21pbm9yX18pID49IDMwOAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZG91YmxlLXByb21vdGlvbiIKKyNlbmRpZgogI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKLSAgLy8gVE9ETyBpcyB0aGVyZSBhIG1pbmltYWwgR0NDIHZlcnNpb24gZm9yIHRoaXM/IEF0IGxlYXN0IGcrKy00Ljcgc2VlbXMgdG8gYmUgZmluZSB3aXRoIHRoaXMuCi0jICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkb3VibGUtcHJvbW90aW9uIgorLy8gVE9ETyBpcyB0aGVyZSBhIG1pbmltYWwgR0NDIHZlcnNpb24gZm9yIHRoaXM/IEF0IGxlYXN0IGcrKy00Ljcgc2VlbXMgdG8gYmUgZmluZSB3aXRoIHRoaXMuCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZG91YmxlLXByb21vdGlvbiIKICNlbmRpZgogCiAjZW5kaWYKIAotCi0KICNpZiBkZWZpbmVkKEVJR0VOX1RFU1RfUEFSVF8xKSB8fCBkZWZpbmVkKEVJR0VOX1RFU1RfUEFSVF8yKSB8fCBkZWZpbmVkKEVJR0VOX1RFU1RfUEFSVF8zKQogCiAjaWZuZGVmIEVJR0VOX0RPTlRfVkVDVE9SSVpFCkBAIC0zNCwyMSArMzIsMjIgQEAKICNlbmRpZgogCiBzdGF0aWMgYm9vbCBnX2NhbGxlZDsKLSNkZWZpbmUgRUlHRU5fU0NBTEFSX0JJTkFSWV9PUF9QTFVHSU4geyBnX2NhbGxlZCB8PSAoIWludGVybmFsOjppc19zYW1lPExoc1NjYWxhcixSaHNTY2FsYXI+Ojp2YWx1ZSk7IH0KKyNkZWZpbmUgRUlHRU5fU0NBTEFSX0JJTkFSWV9PUF9QTFVHSU4gXAorICB7IGdfY2FsbGVkIHw9ICghaW50ZXJuYWw6OmlzX3NhbWU8TGhzU2NhbGFyLCBSaHNTY2FsYXI+Ojp2YWx1ZSk7IH0KIAogI2luY2x1ZGUgIm1haW4uaCIKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotI2RlZmluZSBWRVJJRllfTUlYX1NDQUxBUihYUFIsUkVGKSBcCi0gIGdfY2FsbGVkID0gZmFsc2U7IFwKLSAgVkVSSUZZX0lTX0FQUFJPWChYUFIsUkVGKTsgXAotICBWRVJJRlkoIGdfY2FsbGVkICYmICNYUFIiIG5vdCBwcm9wZXJseSBvcHRpbWl6ZWQiKTsKKyNkZWZpbmUgVkVSSUZZX01JWF9TQ0FMQVIoWFBSLCBSRUYpIFwKKyAgZ19jYWxsZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgIFwKKyAgVkVSSUZZX0lTX0FQUFJPWChYUFIsIFJFRik7ICAgICAgIFwKKyAgVkVSSUZZKGdfY2FsbGVkJiYgI1hQUiAiIG5vdCBwcm9wZXJseSBvcHRpbWl6ZWQiKTsKIAotdGVtcGxhdGU8aW50IFNpemVBdENvbXBpbGVUeXBlPiB2b2lkIG1peGluZ3R5cGVzKGludCBzaXplID0gU2l6ZUF0Q29tcGlsZVR5cGUpCi17Ci0gIHR5cGVkZWYgc3RkOjpjb21wbGV4PGZsb2F0PiAgIENGOwotICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxkb3VibGU+ICBDRDsKK3RlbXBsYXRlIDxpbnQgU2l6ZUF0Q29tcGlsZVR5cGU+Cit2b2lkIG1peGluZ3R5cGVzKGludCBzaXplID0gU2l6ZUF0Q29tcGlsZVR5cGUpIHsKKyAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IENGOworICB0eXBlZGVmIHN0ZDo6Y29tcGxleDxkb3VibGU+IENEOwogICB0eXBlZGVmIE1hdHJpeDxmbG9hdCwgU2l6ZUF0Q29tcGlsZVR5cGUsIFNpemVBdENvbXBpbGVUeXBlPiBNYXRfZjsKICAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLCBTaXplQXRDb21waWxlVHlwZSwgU2l6ZUF0Q29tcGlsZVR5cGU+IE1hdF9kOwogICB0eXBlZGVmIE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBTaXplQXRDb21waWxlVHlwZSwgU2l6ZUF0Q29tcGlsZVR5cGU+IE1hdF9jZjsKQEAgLTU4LDY4ICs1Nyw2OCBAQAogICB0eXBlZGVmIE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBTaXplQXRDb21waWxlVHlwZSwgMT4gVmVjX2NmOwogICB0eXBlZGVmIE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgU2l6ZUF0Q29tcGlsZVR5cGUsIDE+IFZlY19jZDsKIAotICBNYXRfZiBtZiAgICA9IE1hdF9mOjpSYW5kb20oc2l6ZSxzaXplKTsKLSAgTWF0X2QgbWQgICAgPSBtZi50ZW1wbGF0ZSBjYXN0PGRvdWJsZT4oKTsKLSAgLy9NYXRfZCByZCAgICA9IG1kOwotICBNYXRfY2YgbWNmICA9IE1hdF9jZjo6UmFuZG9tKHNpemUsc2l6ZSk7Ci0gIE1hdF9jZCBtY2QgID0gbWNmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxkb3VibGU+ID4oKTsKKyAgTWF0X2YgbWYgPSBNYXRfZjo6UmFuZG9tKHNpemUsIHNpemUpOworICBNYXRfZCBtZCA9IG1mLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICAvLyBNYXRfZCByZCAgICA9IG1kOworICBNYXRfY2YgbWNmID0gTWF0X2NmOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CisgIE1hdF9jZCBtY2QgPSBtY2YudGVtcGxhdGUgY2FzdDxjb21wbGV4PGRvdWJsZT4gPigpOwogICBNYXRfY2QgcmNkID0gbWNkOwotICBWZWNfZiB2ZiAgICA9IFZlY19mOjpSYW5kb20oc2l6ZSwxKTsKLSAgVmVjX2QgdmQgICAgPSB2Zi50ZW1wbGF0ZSBjYXN0PGRvdWJsZT4oKTsKLSAgVmVjX2NmIHZjZiAgPSBWZWNfY2Y6OlJhbmRvbShzaXplLDEpOwotICBWZWNfY2QgdmNkICA9IHZjZi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZG91YmxlPiA+KCk7Ci0gIGZsb2F0ICAgICAgICAgICBzZiAgPSBpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigpOwotICBkb3VibGUgICAgICAgICAgc2QgID0gaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCk7Ci0gIGNvbXBsZXg8ZmxvYXQ+ICBzY2YgPSBpbnRlcm5hbDo6cmFuZG9tPGNvbXBsZXg8ZmxvYXQ+ID4oKTsKKyAgVmVjX2YgdmYgPSBWZWNfZjo6UmFuZG9tKHNpemUsIDEpOworICBWZWNfZCB2ZCA9IHZmLnRlbXBsYXRlIGNhc3Q8ZG91YmxlPigpOworICBWZWNfY2YgdmNmID0gVmVjX2NmOjpSYW5kb20oc2l6ZSwgMSk7CisgIFZlY19jZCB2Y2QgPSB2Y2YudGVtcGxhdGUgY2FzdDxjb21wbGV4PGRvdWJsZT4gPigpOworICBmbG9hdCBzZiA9IGludGVybmFsOjpyYW5kb208ZmxvYXQ+KCk7CisgIGRvdWJsZSBzZCA9IGludGVybmFsOjpyYW5kb208ZG91YmxlPigpOworICBjb21wbGV4PGZsb2F0PiBzY2YgPSBpbnRlcm5hbDo6cmFuZG9tPGNvbXBsZXg8ZmxvYXQ+ID4oKTsKICAgY29tcGxleDxkb3VibGU+IHNjZCA9IGludGVybmFsOjpyYW5kb208Y29tcGxleDxkb3VibGU+ID4oKTsKIAotICBtZittZjsKKyAgbWYgKyBtZjsKIAotICBmbG9hdCAgZXBzZiA9IHN0ZDo6c3FydChzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0PiA6Om1pbiBFSUdFTl9FTVBUWSAoKSk7Ci0gIGRvdWJsZSBlcHNkID0gc3RkOjpzcXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWluIEVJR0VOX0VNUFRZICgpKTsKKyAgZmxvYXQgZXBzZiA9IHN0ZDo6c3FydChzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6bWluIEVJR0VOX0VNUFRZKCkpOworICBkb3VibGUgZXBzZCA9IHN0ZDo6c3FydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1pbiBFSUdFTl9FTVBUWSgpKTsKIAotICB3aGlsZShzdGQ6OmFicyhzZiApPGVwc2YpIHNmICA9IGludGVybmFsOjpyYW5kb208ZmxvYXQ+KCk7Ci0gIHdoaWxlKHN0ZDo6YWJzKHNkICk8ZXBzZCkgc2QgID0gaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCk7Ci0gIHdoaWxlKHN0ZDo6YWJzKHNjZik8ZXBzZikgc2NmID0gaW50ZXJuYWw6OnJhbmRvbTxDRj4oKTsKLSAgd2hpbGUoc3RkOjphYnMoc2NkKTxlcHNkKSBzY2QgPSBpbnRlcm5hbDo6cmFuZG9tPENEPigpOworICB3aGlsZSAoc3RkOjphYnMoc2YpIDwgZXBzZikgc2YgPSBpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigpOworICB3aGlsZSAoc3RkOjphYnMoc2QpIDwgZXBzZCkgc2QgPSBpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKTsKKyAgd2hpbGUgKHN0ZDo6YWJzKHNjZikgPCBlcHNmKSBzY2YgPSBpbnRlcm5hbDo6cmFuZG9tPENGPigpOworICB3aGlsZSAoc3RkOjphYnMoc2NkKSA8IGVwc2QpIHNjZCA9IGludGVybmFsOjpyYW5kb208Q0Q+KCk7CiAKICAgLy8gY2hlY2sgc2NhbGFyIHByb2R1Y3RzCi0gIFZFUklGWV9NSVhfU0NBTEFSKHZjZiAqIHNmICwgdmNmICogY29tcGxleDxmbG9hdD4oc2YpKTsKLSAgVkVSSUZZX01JWF9TQ0FMQVIoc2QgKiB2Y2QgLCBjb21wbGV4PGRvdWJsZT4oc2QpICogdmNkKTsKLSAgVkVSSUZZX01JWF9TQ0FMQVIodmYgKiBzY2YgLCB2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKSAqIHNjZik7Ci0gIFZFUklGWV9NSVhfU0NBTEFSKHNjZCAqIHZkICwgc2NkICogdmQudGVtcGxhdGUgY2FzdDxjb21wbGV4PGRvdWJsZT4gPigpKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIodmNmICogc2YsIHZjZiAqIGNvbXBsZXg8ZmxvYXQ+KHNmKSk7CisgIFZFUklGWV9NSVhfU0NBTEFSKHNkICogdmNkLCBjb21wbGV4PGRvdWJsZT4oc2QpICogdmNkKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIodmYgKiBzY2YsIHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpICogc2NmKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIoc2NkICogdmQsIHNjZCAqIHZkLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxkb3VibGU+ID4oKSk7CiAKLSAgVkVSSUZZX01JWF9TQ0FMQVIodmNmICogMiAsIHZjZiAqIGNvbXBsZXg8ZmxvYXQ+KDIpKTsKLSAgVkVSSUZZX01JWF9TQ0FMQVIodmNmICogMi4xICwgdmNmICogY29tcGxleDxmbG9hdD4oMi4xKSk7CisgIFZFUklGWV9NSVhfU0NBTEFSKHZjZiAqIDIsIHZjZiAqIGNvbXBsZXg8ZmxvYXQ+KDIpKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIodmNmICogMi4xLCB2Y2YgKiBjb21wbGV4PGZsb2F0PigyLjEpKTsKICAgVkVSSUZZX01JWF9TQ0FMQVIoMiAqIHZjZiwgdmNmICogY29tcGxleDxmbG9hdD4oMikpOwotICBWRVJJRllfTUlYX1NDQUxBUigyLjEgKiB2Y2YgLCB2Y2YgKiBjb21wbGV4PGZsb2F0PigyLjEpKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIoMi4xICogdmNmLCB2Y2YgKiBjb21wbGV4PGZsb2F0PigyLjEpKTsKIAogICAvLyBjaGVjayBzY2FsYXIgcXVvdGllbnRzCi0gIFZFUklGWV9NSVhfU0NBTEFSKHZjZiAvIHNmICwgdmNmIC8gY29tcGxleDxmbG9hdD4oc2YpKTsKLSAgVkVSSUZZX01JWF9TQ0FMQVIodmYgLyBzY2YgLCB2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKSAvIHNjZik7Ci0gIFZFUklGWV9NSVhfU0NBTEFSKHZmLmFycmF5KCkgIC8gc2NmLCB2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKS5hcnJheSgpIC8gc2NmKTsKLSAgVkVSSUZZX01JWF9TQ0FMQVIoc2NkIC8gdmQuYXJyYXkoKSAsIHNjZCAvIHZkLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxkb3VibGU+ID4oKS5hcnJheSgpKTsKKyAgVkVSSUZZX01JWF9TQ0FMQVIodmNmIC8gc2YsIHZjZiAvIGNvbXBsZXg8ZmxvYXQ+KHNmKSk7CisgIFZFUklGWV9NSVhfU0NBTEFSKHZmIC8gc2NmLCB2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKSAvIHNjZik7CisgIFZFUklGWV9NSVhfU0NBTEFSKHZmLmFycmF5KCkgLyBzY2YsIHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpLmFycmF5KCkgLyBzY2YpOworICBWRVJJRllfTUlYX1NDQUxBUihzY2QgLyB2ZC5hcnJheSgpLCBzY2QgLyB2ZC50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZG91YmxlPiA+KCkuYXJyYXkoKSk7CiAKICAgLy8gY2hlY2sgc2NhbGFyIGluY3JlbWVudAotICBWRVJJRllfTUlYX1NDQUxBUih2Y2YuYXJyYXkoKSArIHNmICwgdmNmLmFycmF5KCkgKyBjb21wbGV4PGZsb2F0PihzZikpOwotICBWRVJJRllfTUlYX1NDQUxBUihzZCAgKyB2Y2QuYXJyYXkoKSwgY29tcGxleDxkb3VibGU+KHNkKSArIHZjZC5hcnJheSgpKTsKLSAgVkVSSUZZX01JWF9TQ0FMQVIodmYuYXJyYXkoKSAgKyBzY2YsIHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpLmFycmF5KCkgKyBzY2YpOwotICBWRVJJRllfTUlYX1NDQUxBUihzY2QgKyB2ZC5hcnJheSgpICwgc2NkICsgdmQudGVtcGxhdGUgY2FzdDxjb21wbGV4PGRvdWJsZT4gPigpLmFycmF5KCkpOworICBWRVJJRllfTUlYX1NDQUxBUih2Y2YuYXJyYXkoKSArIHNmLCB2Y2YuYXJyYXkoKSArIGNvbXBsZXg8ZmxvYXQ+KHNmKSk7CisgIFZFUklGWV9NSVhfU0NBTEFSKHNkICsgdmNkLmFycmF5KCksIGNvbXBsZXg8ZG91YmxlPihzZCkgKyB2Y2QuYXJyYXkoKSk7CisgIFZFUklGWV9NSVhfU0NBTEFSKHZmLmFycmF5KCkgKyBzY2YsIHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpLmFycmF5KCkgKyBzY2YpOworICBWRVJJRllfTUlYX1NDQUxBUihzY2QgKyB2ZC5hcnJheSgpLCBzY2QgKyB2ZC50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZG91YmxlPiA+KCkuYXJyYXkoKSk7CiAKICAgLy8gY2hlY2sgc2NhbGFyIHN1YnRyYWN0aW9ucwotICBWRVJJRllfTUlYX1NDQUxBUih2Y2YuYXJyYXkoKSAtIHNmICwgdmNmLmFycmF5KCkgLSBjb21wbGV4PGZsb2F0PihzZikpOwotICBWRVJJRllfTUlYX1NDQUxBUihzZCAgLSB2Y2QuYXJyYXkoKSwgY29tcGxleDxkb3VibGU+KHNkKSAtIHZjZC5hcnJheSgpKTsKLSAgVkVSSUZZX01JWF9TQ0FMQVIodmYuYXJyYXkoKSAgLSBzY2YsIHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpLmFycmF5KCkgLSBzY2YpOwotICBWRVJJRllfTUlYX1NDQUxBUihzY2QgLSB2ZC5hcnJheSgpICwgc2NkIC0gdmQudGVtcGxhdGUgY2FzdDxjb21wbGV4PGRvdWJsZT4gPigpLmFycmF5KCkpOworICBWRVJJRllfTUlYX1NDQUxBUih2Y2YuYXJyYXkoKSAtIHNmLCB2Y2YuYXJyYXkoKSAtIGNvbXBsZXg8ZmxvYXQ+KHNmKSk7CisgIFZFUklGWV9NSVhfU0NBTEFSKHNkIC0gdmNkLmFycmF5KCksIGNvbXBsZXg8ZG91YmxlPihzZCkgLSB2Y2QuYXJyYXkoKSk7CisgIFZFUklGWV9NSVhfU0NBTEFSKHZmLmFycmF5KCkgLSBzY2YsIHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpLmFycmF5KCkgLSBzY2YpOworICBWRVJJRllfTUlYX1NDQUxBUihzY2QgLSB2ZC5hcnJheSgpLCBzY2QgLSB2ZC50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZG91YmxlPiA+KCkuYXJyYXkoKSk7CiAKICAgLy8gY2hlY2sgc2NhbGFyIHBvd2VycwogICAvLyBOT1RFOiBzY2FsYXIgZXhwb25lbnRzIHVzZSBhIHVuYXJ5IG9wLgotICBWRVJJRllfSVNfQVBQUk9YKCBwb3codmNmLmFycmF5KCksIHNmKSwgICAgICAgIEVpZ2VuOjpwb3codmNmLmFycmF5KCksIGNvbXBsZXg8ZmxvYXQ+KHNmKSkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggdmNmLmFycmF5KCkucG93KHNmKSAsICAgICAgICBFaWdlbjo6cG93KHZjZi5hcnJheSgpLCBjb21wbGV4PGZsb2F0PihzZikpICk7Ci0gIFZFUklGWV9NSVhfU0NBTEFSKCBwb3coc2QsIHZjZC5hcnJheSgpKSwgICAgICAgIEVpZ2VuOjpwb3coY29tcGxleDxkb3VibGU+KHNkKSwgdmNkLmFycmF5KCkpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIEVpZ2VuOjpwb3codmYuYXJyYXkoKSwgc2NmKSwgRWlnZW46OnBvdyh2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKS5hcnJheSgpLCBzY2YpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIHZmLmFycmF5KCkucG93KHNjZikgLCAgICAgICAgRWlnZW46OnBvdyh2Zi50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZmxvYXQ+ID4oKS5hcnJheSgpLCBzY2YpICk7Ci0gIFZFUklGWV9NSVhfU0NBTEFSKCBFaWdlbjo6cG93KHNjZCwgdmQuYXJyYXkoKSksIEVpZ2VuOjpwb3coc2NkLCB2ZC50ZW1wbGF0ZSBjYXN0PGNvbXBsZXg8ZG91YmxlPiA+KCkuYXJyYXkoKSkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChwb3codmNmLmFycmF5KCksIHNmKSwgRWlnZW46OnBvdyh2Y2YuYXJyYXkoKSwgY29tcGxleDxmbG9hdD4oc2YpKSk7CisgIFZFUklGWV9JU19BUFBST1godmNmLmFycmF5KCkucG93KHNmKSwgRWlnZW46OnBvdyh2Y2YuYXJyYXkoKSwgY29tcGxleDxmbG9hdD4oc2YpKSk7CisgIFZFUklGWV9NSVhfU0NBTEFSKHBvdyhzZCwgdmNkLmFycmF5KCkpLCBFaWdlbjo6cG93KGNvbXBsZXg8ZG91YmxlPihzZCksIHZjZC5hcnJheSgpKSk7CisgIFZFUklGWV9JU19BUFBST1goRWlnZW46OnBvdyh2Zi5hcnJheSgpLCBzY2YpLCBFaWdlbjo6cG93KHZmLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxmbG9hdD4gPigpLmFycmF5KCksIHNjZikpOworICBWRVJJRllfSVNfQVBQUk9YKHZmLmFycmF5KCkucG93KHNjZiksIEVpZ2VuOjpwb3codmYudGVtcGxhdGUgY2FzdDxjb21wbGV4PGZsb2F0PiA+KCkuYXJyYXkoKSwgc2NmKSk7CisgIFZFUklGWV9NSVhfU0NBTEFSKEVpZ2VuOjpwb3coc2NkLCB2ZC5hcnJheSgpKSwgRWlnZW46OnBvdyhzY2QsIHZkLnRlbXBsYXRlIGNhc3Q8Y29tcGxleDxkb3VibGU+ID4oKS5hcnJheSgpKSk7CiAKICAgLy8gY2hlY2sgZG90IHByb2R1Y3QKICAgdmYuZG90KHZmKTsKQEAgLTE0Myw3OCArMTQyLDkxIEBACiAKICAgTWF0X2NkIG1jZDIgPSBtY2Q7CiAgIFZFUklGWV9JU19BUFBST1gobWNkLmFycmF5KCkgKj0gbWQuYXJyYXkoKSwgbWNkMi5hcnJheSgpICo9IG1kLmFycmF5KCkudGVtcGxhdGUgY2FzdDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOwotICAKKwogICAvLyBjaGVjayBtYXRyaXgtbWF0cml4IHByb2R1Y3RzCi0gIFZFUklGWV9JU19BUFBST1goc2QqbWQqbWNkLCAoc2QqbWQpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKm1jZCk7Ci0gIFZFUklGWV9JU19BUFBST1goc2QqbWNkKm1kLCBzZCptY2QqbWQudGVtcGxhdGUgY2FzdDxDRD4oKSk7Ci0gIFZFUklGWV9JU19BUFBST1goc2NkKm1kKm1jZCwgc2NkKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKm1jZCk7Ci0gIFZFUklGWV9JU19BUFBST1goc2NkKm1jZCptZCwgc2NkKm1jZCptZC50ZW1wbGF0ZSBjYXN0PENEPigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCAqIG1kICogbWNkLCAoc2QgKiBtZCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkgKiBtY2QpOworICBWRVJJRllfSVNfQVBQUk9YKHNkICogbWNkICogbWQsIHNkICogbWNkICogbWQudGVtcGxhdGUgY2FzdDxDRD4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2NkICogbWQgKiBtY2QsIHNjZCAqIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpICogbWNkKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2QgKiBtY2QgKiBtZCwgc2NkICogbWNkICogbWQudGVtcGxhdGUgY2FzdDxDRD4oKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChzZiptZiptY2YsIHNmKm1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkqbWNmKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzZiptY2YqbWYsIHNmKm1jZiptZi50ZW1wbGF0ZSBjYXN0PENGPigpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzY2YqbWYqbWNmLCBzY2YqbWYudGVtcGxhdGUgY2FzdDxDRj4oKSptY2YpOwotICBWRVJJRllfSVNfQVBQUk9YKHNjZiptY2YqbWYsIHNjZiptY2YqbWYudGVtcGxhdGUgY2FzdDxDRj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2YgKiBtZiAqIG1jZiwgc2YgKiBtZi50ZW1wbGF0ZSBjYXN0PENGPigpICogbWNmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZiAqIG1jZiAqIG1mLCBzZiAqIG1jZiAqIG1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZiAqIG1mICogbWNmLCBzY2YgKiBtZi50ZW1wbGF0ZSBjYXN0PENGPigpICogbWNmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2YgKiBtY2YgKiBtZiwgc2NmICogbWNmICogbWYudGVtcGxhdGUgY2FzdDxDRj4oKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChzZCptZC5hZGpvaW50KCkqbWNkLCAoc2QqbWQpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFkam9pbnQoKSptY2QpOwotICBWRVJJRllfSVNfQVBQUk9YKHNkKm1jZC5hZGpvaW50KCkqbWQsIHNkKm1jZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgY2FzdDxDRD4oKSk7Ci0gIFZFUklGWV9JU19BUFBST1goc2QqbWQuYWRqb2ludCgpKm1jZC5hZGpvaW50KCksIChzZCptZCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYWRqb2ludCgpKm1jZC5hZGpvaW50KCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHNkKm1jZC5hZGpvaW50KCkqbWQuYWRqb2ludCgpLCBzZCptY2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuYWRqb2ludCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzZCptZCptY2QuYWRqb2ludCgpLCAoc2QqbWQpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKm1jZC5hZGpvaW50KCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHNkKm1jZCptZC5hZGpvaW50KCksIHNkKm1jZCptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmFkam9pbnQoKSk7CisgIFZFUklGWV9JU19BUFBST1goc2QgKiBtZC5hZGpvaW50KCkgKiBtY2QsIChzZCAqIG1kKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hZGpvaW50KCkgKiBtY2QpOworICBWRVJJRllfSVNfQVBQUk9YKHNkICogbWNkLmFkam9pbnQoKSAqIG1kLCBzZCAqIG1jZC5hZGpvaW50KCkgKiBtZC50ZW1wbGF0ZSBjYXN0PENEPigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCAqIG1kLmFkam9pbnQoKSAqIG1jZC5hZGpvaW50KCksIChzZCAqIG1kKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hZGpvaW50KCkgKiBtY2QuYWRqb2ludCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCAqIG1jZC5hZGpvaW50KCkgKiBtZC5hZGpvaW50KCksIHNkICogbWNkLmFkam9pbnQoKSAqIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuYWRqb2ludCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCAqIG1kICogbWNkLmFkam9pbnQoKSwgKHNkICogbWQpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpICogbWNkLmFkam9pbnQoKSk7CisgIFZFUklGWV9JU19BUFBST1goc2QgKiBtY2QgKiBtZC5hZGpvaW50KCksIHNkICogbWNkICogbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5hZGpvaW50KCkpOwogCi0gIFZFUklGWV9JU19BUFBST1goc2YqbWYuYWRqb2ludCgpKm1jZiwgKHNmKm1mKS50ZW1wbGF0ZSBjYXN0PENGPigpLmV2YWwoKS5hZGpvaW50KCkqbWNmKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzZiptY2YuYWRqb2ludCgpKm1mLCBzZiptY2YuYWRqb2ludCgpKm1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHNmKm1mLmFkam9pbnQoKSptY2YuYWRqb2ludCgpLCAoc2YqbWYpLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuZXZhbCgpLmFkam9pbnQoKSptY2YuYWRqb2ludCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzZiptY2YuYWRqb2ludCgpKm1mLmFkam9pbnQoKSwgc2YqbWNmLmFkam9pbnQoKSptZi50ZW1wbGF0ZSBjYXN0PENGPigpLmFkam9pbnQoKSk7Ci0gIFZFUklGWV9JU19BUFBST1goc2YqbWYqbWNmLmFkam9pbnQoKSwgKHNmKm1mKS50ZW1wbGF0ZSBjYXN0PENGPigpLmV2YWwoKSptY2YuYWRqb2ludCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzZiptY2YqbWYuYWRqb2ludCgpLCBzZiptY2YqbWYudGVtcGxhdGUgY2FzdDxDRj4oKS5hZGpvaW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNmICogbWYuYWRqb2ludCgpICogbWNmLCAoc2YgKiBtZikudGVtcGxhdGUgY2FzdDxDRj4oKS5ldmFsKCkuYWRqb2ludCgpICogbWNmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZiAqIG1jZi5hZGpvaW50KCkgKiBtZiwgc2YgKiBtY2YuYWRqb2ludCgpICogbWYudGVtcGxhdGUgY2FzdDxDRj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2YgKiBtZi5hZGpvaW50KCkgKiBtY2YuYWRqb2ludCgpLCAoc2YgKiBtZikudGVtcGxhdGUgY2FzdDxDRj4oKS5ldmFsKCkuYWRqb2ludCgpICogbWNmLmFkam9pbnQoKSk7CisgIFZFUklGWV9JU19BUFBST1goc2YgKiBtY2YuYWRqb2ludCgpICogbWYuYWRqb2ludCgpLCBzZiAqIG1jZi5hZGpvaW50KCkgKiBtZi50ZW1wbGF0ZSBjYXN0PENGPigpLmFkam9pbnQoKSk7CisgIFZFUklGWV9JU19BUFBST1goc2YgKiBtZiAqIG1jZi5hZGpvaW50KCksIChzZiAqIG1mKS50ZW1wbGF0ZSBjYXN0PENGPigpLmV2YWwoKSAqIG1jZi5hZGpvaW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNmICogbWNmICogbWYuYWRqb2ludCgpLCBzZiAqIG1jZiAqIG1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuYWRqb2ludCgpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKHNmKm1mKnZjZiwgKHNmKm1mKS50ZW1wbGF0ZSBjYXN0PENGPigpLmV2YWwoKSp2Y2YpOwotICBWRVJJRllfSVNfQVBQUk9YKHNjZiptZip2Y2YsKHNjZiptZi50ZW1wbGF0ZSBjYXN0PENGPigpKS5ldmFsKCkqdmNmKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzZiptY2YqdmYsIHNmKm1jZip2Zi50ZW1wbGF0ZSBjYXN0PENGPigpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzY2YqbWNmKnZmLHNjZiptY2YqdmYudGVtcGxhdGUgY2FzdDxDRj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2YgKiBtZiAqIHZjZiwgKHNmICogbWYpLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuZXZhbCgpICogdmNmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2YgKiBtZiAqIHZjZiwgKHNjZiAqIG1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkpLmV2YWwoKSAqIHZjZik7CisgIFZFUklGWV9JU19BUFBST1goc2YgKiBtY2YgKiB2Ziwgc2YgKiBtY2YgKiB2Zi50ZW1wbGF0ZSBjYXN0PENGPigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2YgKiBtY2YgKiB2Ziwgc2NmICogbWNmICogdmYudGVtcGxhdGUgY2FzdDxDRj4oKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChzZip2Y2YuYWRqb2ludCgpKm1mLCAgc2YqdmNmLmFkam9pbnQoKSptZi50ZW1wbGF0ZSBjYXN0PENGPigpLmV2YWwoKSk7Ci0gIFZFUklGWV9JU19BUFBST1goc2NmKnZjZi5hZGpvaW50KCkqbWYsIHNjZip2Y2YuYWRqb2ludCgpKm1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuZXZhbCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzZip2Zi5hZGpvaW50KCkqbWNmLCAgc2YqdmYuYWRqb2ludCgpLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuZXZhbCgpKm1jZik7Ci0gIFZFUklGWV9JU19BUFBST1goc2NmKnZmLmFkam9pbnQoKSptY2YsIHNjZip2Zi5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRj4oKS5ldmFsKCkqbWNmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZiAqIHZjZi5hZGpvaW50KCkgKiBtZiwgc2YgKiB2Y2YuYWRqb2ludCgpICogbWYudGVtcGxhdGUgY2FzdDxDRj4oKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZiAqIHZjZi5hZGpvaW50KCkgKiBtZiwgc2NmICogdmNmLmFkam9pbnQoKSAqIG1mLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZiAqIHZmLmFkam9pbnQoKSAqIG1jZiwgc2YgKiB2Zi5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRj4oKS5ldmFsKCkgKiBtY2YpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZiAqIHZmLmFkam9pbnQoKSAqIG1jZiwgc2NmICogdmYuYWRqb2ludCgpLnRlbXBsYXRlIGNhc3Q8Q0Y+KCkuZXZhbCgpICogbWNmKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKHNkKm1kKnZjZCwgKHNkKm1kKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSp2Y2QpOwotICBWRVJJRllfSVNfQVBQUk9YKHNjZCptZCp2Y2QsKHNjZCptZC50ZW1wbGF0ZSBjYXN0PENEPigpKS5ldmFsKCkqdmNkKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzZCptY2QqdmQsIHNkKm1jZCp2ZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSk7Ci0gIFZFUklGWV9JU19BUFBST1goc2NkKm1jZCp2ZCxzY2QqbWNkKnZkLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCAqIG1kICogdmNkLCAoc2QgKiBtZCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkgKiB2Y2QpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZCAqIG1kICogdmNkLCAoc2NkICogbWQudGVtcGxhdGUgY2FzdDxDRD4oKSkuZXZhbCgpICogdmNkKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCAqIG1jZCAqIHZkLCBzZCAqIG1jZCAqIHZkLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2QgKiBtY2QgKiB2ZCwgc2NkICogbWNkICogdmQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkpOwogCi0gIFZFUklGWV9JU19BUFBST1goc2QqdmNkLmFkam9pbnQoKSptZCwgIHNkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHNjZCp2Y2QuYWRqb2ludCgpKm1kLCBzY2QqdmNkLmFkam9pbnQoKSptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSk7Ci0gIFZFUklGWV9JU19BUFBST1goc2QqdmQuYWRqb2ludCgpKm1jZCwgIHNkKnZkLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QpOwotICBWRVJJRllfSVNfQVBQUk9YKHNjZCp2ZC5hZGpvaW50KCkqbWNkLCBzY2QqdmQuYWRqb2ludCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKm1jZCk7CisgIFZFUklGWV9JU19BUFBST1goc2QgKiB2Y2QuYWRqb2ludCgpICogbWQsIHNkICogdmNkLmFkam9pbnQoKSAqIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2QgKiB2Y2QuYWRqb2ludCgpICogbWQsIHNjZCAqIHZjZC5hZGpvaW50KCkgKiBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1goc2QgKiB2ZC5hZGpvaW50KCkgKiBtY2QsIHNkICogdmQuYWRqb2ludCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpICogbWNkKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2QgKiB2ZC5hZGpvaW50KCkgKiBtY2QsIHNjZCAqIHZkLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSAqIG1jZCk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWCggc2QqdmNkLmFkam9pbnQoKSptZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgIHNkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHNjZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCBzY2QqdmNkLmFkam9pbnQoKSptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSk7Ci0gIFZFUklGWV9JU19BUFBST1goIHNkKnZjZC5hZGpvaW50KCkqbWQudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksICBzZCp2Y2QuYWRqb2ludCgpKm1kLnRyYW5zcG9zZSgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzY2QqdmNkLmFkam9pbnQoKSptZC50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgc2NkKnZjZC5hZGpvaW50KCkqbWQudHJhbnNwb3NlKCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpOwotICBWRVJJRllfSVNfQVBQUk9YKCBzZCp2ZC5hZGpvaW50KCkqbWNkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCAgc2QqdmQuYWRqb2ludCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKm1jZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSk7Ci0gIFZFUklGWV9JU19BUFBST1goc2NkKnZkLmFkam9pbnQoKSptY2QudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIHNjZCp2ZC5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc2QqdmQuYWRqb2ludCgpKm1jZC50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgIHNkKnZkLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHNjZCp2ZC5hZGpvaW50KCkqbWNkLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCBzY2QqdmQuYWRqb2ludCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKm1jZC50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2QgKiB2Y2QuYWRqb2ludCgpICogbWQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksCisgICAgICAgICAgICAgICAgICAgc2QgKiB2Y2QuYWRqb2ludCgpICogbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZCAqIHZjZC5hZGpvaW50KCkgKiBtZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwKKyAgICAgICAgICAgICAgICAgICBzY2QgKiB2Y2QuYWRqb2ludCgpICogbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNkICogdmNkLmFkam9pbnQoKSAqIG1kLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLAorICAgICAgICAgICAgICAgICAgIHNkICogdmNkLmFkam9pbnQoKSAqIG1kLnRyYW5zcG9zZSgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzY2QgKiB2Y2QuYWRqb2ludCgpICogbWQudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksCisgICAgICAgICAgICAgICAgICAgc2NkICogdmNkLmFkam9pbnQoKSAqIG1kLnRyYW5zcG9zZSgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzZCAqIHZkLmFkam9pbnQoKSAqIG1jZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwKKyAgICAgICAgICAgICAgICAgICBzZCAqIHZkLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSAqIG1jZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2NkICogdmQuYWRqb2ludCgpICogbWNkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLAorICAgICAgICAgICAgICAgICAgIHNjZCAqIHZkLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSAqIG1jZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc2QgKiB2ZC5hZGpvaW50KCkgKiBtY2QudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksCisgICAgICAgICAgICAgICAgICAgc2QgKiB2ZC5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkgKiBtY2QudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNjZCAqIHZkLmFkam9pbnQoKSAqIG1jZC50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwKKyAgICAgICAgICAgICAgICAgICBzY2QgKiB2ZC5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkgKiBtY2QudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpOwogCiAgIC8vIE5vdCBzdXBwb3J0ZWQgeWV0OiB0cm1tCi0vLyAgIFZFUklGWV9JU19BUFBST1goc2QqbWNkKm1kLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCAgc2QqbWNkKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKTsKLS8vICAgVkVSSUZZX0lTX0FQUFJPWChzY2QqbWNkKm1kLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCBzY2QqbWNkKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKTsKLS8vICAgVkVSSUZZX0lTX0FQUFJPWChzZCptZCptY2QudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksICBzZCptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpOwotLy8gICBWRVJJRllfSVNfQVBQUk9YKHNjZCptZCptY2QudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIHNjZCptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpOworICAvLyAgIFZFUklGWV9JU19BUFBST1goc2QqbWNkKm1kLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCAgc2QqbWNkKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLnRlbXBsYXRlCisgIC8vICAgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpOyBWRVJJRllfSVNfQVBQUk9YKHNjZCptY2QqbWQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIHNjZCptY2QqbWQudGVtcGxhdGUKKyAgLy8gICBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSk7IFZFUklGWV9JU19BUFBST1goc2QqbWQqbWNkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLAorICAvLyAgIHNkKm1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKm1jZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSk7IFZFUklGWV9JU19BUFBST1goc2NkKm1kKm1jZC50ZW1wbGF0ZQorICAvLyAgIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCBzY2QqbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKTsKIAogICAvLyBOb3Qgc3VwcG9ydGVkIHlldDogc3ltdgotLy8gICBWRVJJRllfSVNfQVBQUk9YKHNkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLCAgc2QqdmNkLmFkam9pbnQoKSptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkpOwotLy8gICBWRVJJRllfSVNfQVBQUk9YKHNjZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSwgc2NkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKTsKLS8vICAgVkVSSUZZX0lTX0FQUFJPWChzZCp2ZC5hZGpvaW50KCkqbWNkLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSwgIHNkKnZkLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKTsKLS8vICAgVkVSSUZZX0lTX0FQUFJPWChzY2QqdmQuYWRqb2ludCgpKm1jZC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksIHNjZCp2ZC5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSk7CisgIC8vICAgVkVSSUZZX0lTX0FQUFJPWChzZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSwgIHNkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUKKyAgLy8gICBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkpOyBWRVJJRllfSVNfQVBQUk9YKHNjZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlCisgIC8vICAgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLCBzY2QqdmNkLmFkam9pbnQoKSptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkpOworICAvLyAgIFZFUklGWV9JU19BUFBST1goc2QqdmQuYWRqb2ludCgpKm1jZC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCksICBzZCp2ZC5hZGpvaW50KCkudGVtcGxhdGUKKyAgLy8gICBjYXN0PENEPigpLmV2YWwoKSptY2QudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKTsgVkVSSUZZX0lTX0FQUFJPWChzY2QqdmQuYWRqb2ludCgpKm1jZC50ZW1wbGF0ZQorICAvLyAgIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSwgc2NkKnZkLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpKTsKIAogICAvLyBOb3Qgc3VwcG9ydGVkIHlldDogc3ltbQotLy8gICBWRVJJRllfSVNfQVBQUk9YKHNkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLCAgc2QqdmNkLmFkam9pbnQoKSptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkpOwotLy8gICBWRVJJRllfSVNfQVBQUk9YKHNjZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSwgc2NkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpKTsKLS8vICAgVkVSSUZZX0lTX0FQUFJPWChzZCp2ZC5hZGpvaW50KCkqbWNkLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSwgIHNkKnZkLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpKTsKLS8vICAgVkVSSUZZX0lTX0FQUFJPWChzY2QqdmQuYWRqb2ludCgpKm1jZC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksIHNjZCp2ZC5hZGpvaW50KCkudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkqbWNkLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSk7CisgIC8vICAgVkVSSUZZX0lTX0FQUFJPWChzZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSwgIHNkKnZjZC5hZGpvaW50KCkqbWQudGVtcGxhdGUKKyAgLy8gICBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkpOyBWRVJJRllfSVNfQVBQUk9YKHNjZCp2Y2QuYWRqb2ludCgpKm1kLnRlbXBsYXRlCisgIC8vICAgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLCBzY2QqdmNkLmFkam9pbnQoKSptZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkpOworICAvLyAgIFZFUklGWV9JU19BUFBST1goc2QqdmQuYWRqb2ludCgpKm1jZC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksICBzZCp2ZC5hZGpvaW50KCkudGVtcGxhdGUKKyAgLy8gICBjYXN0PENEPigpLmV2YWwoKSptY2QudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpKTsgVkVSSUZZX0lTX0FQUFJPWChzY2QqdmQuYWRqb2ludCgpKm1jZC50ZW1wbGF0ZQorICAvLyAgIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSwgc2NkKnZkLmFkam9pbnQoKS50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSptY2QudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpKTsKIAogICByY2Quc2V0WmVybygpOwogICBWRVJJRllfSVNfQVBQUk9YKE1hdF9jZChyY2QudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSBzZCAqIG1jZCAqIG1kKSwKQEAgLTIyNiw3NCArMjM4LDY5IEBACiAgIFZFUklGWV9JU19BUFBST1goTWF0X2NkKHJjZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSA9IHNjZCAqIG1kICogbWNkKSwKICAgICAgICAgICAgICAgICAgICBNYXRfY2QoKHNjZCAqIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpICogbWNkKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSkpOwogCisgIFZFUklGWV9JU19BUFBST1gobWQuYXJyYXkoKSAqIG1jZC5hcnJheSgpLCBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpICogbWNkLmFycmF5KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1jZC5hcnJheSgpICogbWQuYXJyYXkoKSwgbWNkLmFycmF5KCkgKiBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCBtZC5hcnJheSgpICAqIG1jZC5hcnJheSgpLCBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpICogbWNkLmFycmF5KCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggbWNkLmFycmF5KCkgKiBtZC5hcnJheSgpLCAgbWNkLmFycmF5KCkgKiBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpICk7CisgIFZFUklGWV9JU19BUFBST1gobWQuYXJyYXkoKSArIG1jZC5hcnJheSgpLCBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpICsgbWNkLmFycmF5KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1jZC5hcnJheSgpICsgbWQuYXJyYXkoKSwgbWNkLmFycmF5KCkgKyBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCBtZC5hcnJheSgpICArIG1jZC5hcnJheSgpLCBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpICsgbWNkLmFycmF5KCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggbWNkLmFycmF5KCkgKyBtZC5hcnJheSgpLCAgbWNkLmFycmF5KCkgKyBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpICk7CisgIFZFUklGWV9JU19BUFBST1gobWQuYXJyYXkoKSAtIG1jZC5hcnJheSgpLCBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpIC0gbWNkLmFycmF5KCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1jZC5hcnJheSgpIC0gbWQuYXJyYXkoKSwgbWNkLmFycmF5KCkgLSBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCBtZC5hcnJheSgpICAtIG1jZC5hcnJheSgpLCBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpIC0gbWNkLmFycmF5KCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggbWNkLmFycmF5KCkgLSBtZC5hcnJheSgpLCAgbWNkLmFycmF5KCkgLSBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpICk7Ci0KLSAgaWYobWNkLmFycmF5KCkuYWJzKCkubWluQ29lZmYoKT5lcHNkKQotICB7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggbWQuYXJyYXkoKSAvIG1jZC5hcnJheSgpLCBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpIC8gbWNkLmFycmF5KCkgKTsKKyAgaWYgKG1jZC5hcnJheSgpLmFicygpLm1pbkNvZWZmKCkgPiBlcHNkKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtZC5hcnJheSgpIC8gbWNkLmFycmF5KCksIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFycmF5KCkgLyBtY2QuYXJyYXkoKSk7CiAgIH0KLSAgaWYobWQuYXJyYXkoKS5hYnMoKS5taW5Db2VmZigpPmVwc2QpCi0gIHsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCBtY2QuYXJyYXkoKSAvIG1kLmFycmF5KCksIG1jZC5hcnJheSgpIC8gbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYXJyYXkoKSApOworICBpZiAobWQuYXJyYXkoKS5hYnMoKS5taW5Db2VmZigpID4gZXBzZCkgeworICAgIFZFUklGWV9JU19BUFBST1gobWNkLmFycmF5KCkgLyBtZC5hcnJheSgpLCBtY2QuYXJyYXkoKSAvIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFycmF5KCkpOwogICB9CiAKLSAgaWYobWQuYXJyYXkoKS5hYnMoKS5taW5Db2VmZigpPmVwc2QgfHwgbWNkLmFycmF5KCkuYWJzKCkubWluQ29lZmYoKT5lcHNkKQotICB7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggbWQuYXJyYXkoKS5wb3cobWNkLmFycmF5KCkpLCBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpLnBvdyhtY2QuYXJyYXkoKSkgKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCBtY2QuYXJyYXkoKS5wb3cobWQuYXJyYXkoKSksICBtY2QuYXJyYXkoKS5wb3cobWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYXJyYXkoKSkgKTsKKyAgaWYgKG1kLmFycmF5KCkuYWJzKCkubWluQ29lZmYoKSA+IGVwc2QgfHwgbWNkLmFycmF5KCkuYWJzKCkubWluQ29lZmYoKSA+IGVwc2QpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1kLmFycmF5KCkucG93KG1jZC5hcnJheSgpKSwgbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYXJyYXkoKS5wb3cobWNkLmFycmF5KCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1jZC5hcnJheSgpLnBvdyhtZC5hcnJheSgpKSwgbWNkLmFycmF5KCkucG93KG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFycmF5KCkpKTsKIAotICAgIFZFUklGWV9JU19BUFBST1goIHBvdyhtZC5hcnJheSgpLG1jZC5hcnJheSgpKSwgbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYXJyYXkoKS5wb3cobWNkLmFycmF5KCkpICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggcG93KG1jZC5hcnJheSgpLG1kLmFycmF5KCkpLCAgbWNkLmFycmF5KCkucG93KG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFycmF5KCkpICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChwb3cobWQuYXJyYXkoKSwgbWNkLmFycmF5KCkpLCBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKS5hcnJheSgpLnBvdyhtY2QuYXJyYXkoKSkpOworICAgIFZFUklGWV9JU19BUFBST1gocG93KG1jZC5hcnJheSgpLCBtZC5hcnJheSgpKSwgbWNkLmFycmF5KCkucG93KG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFycmF5KCkpKTsKICAgfQogCiAgIHJjZCA9IG1jZDsKLSAgVkVSSUZZX0lTX0FQUFJPWCggcmNkID0gbWQsIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpICk7CisgIFZFUklGWV9JU19BUFBST1gocmNkID0gbWQsIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKTsKICAgcmNkID0gbWNkOwotICBWRVJJRllfSVNfQVBQUk9YKCByY2QgKz0gbWQsIG1jZCArIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpICk7CisgIFZFUklGWV9JU19BUFBST1gocmNkICs9IG1kLCBtY2QgKyBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSk7CiAgIHJjZCA9IG1jZDsKLSAgVkVSSUZZX0lTX0FQUFJPWCggcmNkIC09IG1kLCBtY2QgLSBtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSApOworICBWRVJJRllfSVNfQVBQUk9YKHJjZCAtPSBtZCwgbWNkIC0gbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkpOwogICByY2QgPSBtY2Q7Ci0gIFZFUklGWV9JU19BUFBST1goIHJjZC5hcnJheSgpICo9IG1kLmFycmF5KCksIG1jZC5hcnJheSgpICogbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYXJyYXkoKSApOworICBWRVJJRllfSVNfQVBQUk9YKHJjZC5hcnJheSgpICo9IG1kLmFycmF5KCksIG1jZC5hcnJheSgpICogbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYXJyYXkoKSk7CiAgIHJjZCA9IG1jZDsKLSAgaWYobWQuYXJyYXkoKS5hYnMoKS5taW5Db2VmZigpPmVwc2QpCi0gIHsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCByY2QuYXJyYXkoKSAvPSBtZC5hcnJheSgpLCBtY2QuYXJyYXkoKSAvIG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpLmFycmF5KCkgKTsKKyAgaWYgKG1kLmFycmF5KCkuYWJzKCkubWluQ29lZmYoKSA+IGVwc2QpIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJjZC5hcnJheSgpIC89IG1kLmFycmF5KCksIG1jZC5hcnJheSgpIC8gbWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkuYXJyYXkoKSk7CiAgIH0KIAogICByY2QgPSBtY2Q7Ci0gIFZFUklGWV9JU19BUFBST1goIHJjZC5ub2FsaWFzKCkgKz0gbWQgKyBtY2QqbWQsIG1jZCArIChtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSkgKyBtY2QqKG1kLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkuZXZhbCgpKSk7CisgIFZFUklGWV9JU19BUFBST1gocmNkLm5vYWxpYXMoKSArPSBtZCArIG1jZCAqIG1kLAorICAgICAgICAgICAgICAgICAgIG1jZCArIChtZC50ZW1wbGF0ZSBjYXN0PENEPigpLmV2YWwoKSkgKyBtY2QgKiAobWQudGVtcGxhdGUgY2FzdDxDRD4oKS5ldmFsKCkpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCByY2Qubm9hbGlhcygpICA9IG1kKm1kLCAgICAgICAoKG1kKm1kKS5ldmFsKCkudGVtcGxhdGUgY2FzdDxDRD4oKSkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyY2Qubm9hbGlhcygpID0gbWQgKiBtZCwgKChtZCAqIG1kKS5ldmFsKCkudGVtcGxhdGUgY2FzdDxDRD4oKSkpOwogICByY2QgPSBtY2Q7Ci0gIFZFUklGWV9JU19BUFBST1goIHJjZC5ub2FsaWFzKCkgKz0gbWQqbWQsIG1jZCArICgobWQqbWQpLmV2YWwoKS50ZW1wbGF0ZSBjYXN0PENEPigpKSApOworICBWRVJJRllfSVNfQVBQUk9YKHJjZC5ub2FsaWFzKCkgKz0gbWQgKiBtZCwgbWNkICsgKChtZCAqIG1kKS5ldmFsKCkudGVtcGxhdGUgY2FzdDxDRD4oKSkpOwogICByY2QgPSBtY2Q7Ci0gIFZFUklGWV9JU19BUFBST1goIHJjZC5ub2FsaWFzKCkgLT0gbWQqbWQsIG1jZCAtICgobWQqbWQpLmV2YWwoKS50ZW1wbGF0ZSBjYXN0PENEPigpKSApOworICBWRVJJRllfSVNfQVBQUk9YKHJjZC5ub2FsaWFzKCkgLT0gbWQgKiBtZCwgbWNkIC0gKChtZCAqIG1kKS5ldmFsKCkudGVtcGxhdGUgY2FzdDxDRD4oKSkpOwogCi0gIFZFUklGWV9JU19BUFBST1goIHJjZC5ub2FsaWFzKCkgID0gbWNkICsgbWQqbWQsICAgICAgIG1jZCArICgobWQqbWQpLmV2YWwoKS50ZW1wbGF0ZSBjYXN0PENEPigpKSApOworICBWRVJJRllfSVNfQVBQUk9YKHJjZC5ub2FsaWFzKCkgPSBtY2QgKyBtZCAqIG1kLCBtY2QgKyAoKG1kICogbWQpLmV2YWwoKS50ZW1wbGF0ZSBjYXN0PENEPigpKSk7CiAgIHJjZCA9IG1jZDsKLSAgVkVSSUZZX0lTX0FQUFJPWCggcmNkLm5vYWxpYXMoKSArPSBtY2QgKyBtZCptZCwgbWNkICsgbWNkICsgKChtZCptZCkuZXZhbCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkpICk7CisgIFZFUklGWV9JU19BUFBST1gocmNkLm5vYWxpYXMoKSArPSBtY2QgKyBtZCAqIG1kLCBtY2QgKyBtY2QgKyAoKG1kICogbWQpLmV2YWwoKS50ZW1wbGF0ZSBjYXN0PENEPigpKSk7CiAgIHJjZCA9IG1jZDsKLSAgVkVSSUZZX0lTX0FQUFJPWCggcmNkLm5vYWxpYXMoKSAtPSBtY2QgKyBtZCptZCwgICAgICAgICAgIC0gKChtZCptZCkuZXZhbCgpLnRlbXBsYXRlIGNhc3Q8Q0Q+KCkpICk7CisgIFZFUklGWV9JU19BUFBST1gocmNkLm5vYWxpYXMoKSAtPSBtY2QgKyBtZCAqIG1kLCAtKChtZCAqIG1kKS5ldmFsKCkudGVtcGxhdGUgY2FzdDxDRD4oKSkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QobWl4aW5ndHlwZXMpCi17Ci0gIGdfY2FsbGVkID0gZmFsc2U7IC8vIFNpbGVuY2UgLVd1bm5lZWRlZC1pbnRlcm5hbC1kZWNsYXJhdGlvbi4KLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKK0VJR0VOX0RFQ0xBUkVfVEVTVChtaXhpbmd0eXBlcykgeworICBnX2NhbGxlZCA9IGZhbHNlOyAgLy8gU2lsZW5jZSAtV3VubmVlZGVkLWludGVybmFsLWRlY2xhcmF0aW9uLgorICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKICAgICBDQUxMX1NVQlRFU1RfMShtaXhpbmd0eXBlczwzPigpKTsKICAgICBDQUxMX1NVQlRFU1RfMihtaXhpbmd0eXBlczw0PigpKTsKLSAgICBDQUxMX1NVQlRFU1RfMyhtaXhpbmd0eXBlczxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpOworICAgIENBTExfU1VCVEVTVF8zKG1peGluZ3R5cGVzPER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpOwogCiAgICAgQ0FMTF9TVUJURVNUXzQobWl4aW5ndHlwZXM8Mz4oKSk7CiAgICAgQ0FMTF9TVUJURVNUXzUobWl4aW5ndHlwZXM8ND4oKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzYobWl4aW5ndHlwZXM8RHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNihtaXhpbmd0eXBlczxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXN0Ynl2YWx1ZS5jcHAgYi90ZXN0L25lc3RieXZhbHVlLmNwcAppbmRleCBjMjVmMGJmLi5mNjU2MjFhIDEwMDY0NAotLS0gYS90ZXN0L25lc3RieXZhbHVlLmNwcAorKysgYi90ZXN0L25lc3RieXZhbHVlLmNwcApAQCAtMTIsMjggKzEyLDI2IEBACiAjaW5jbHVkZSAibWFpbi5oIgogCiB0eXBlZGVmIE5lc3RCeVZhbHVlPE1hdHJpeFhkPiBDcHlNYXRyaXhYZDsKLXR5cGVkZWYgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxkb3VibGUsZG91YmxlPixjb25zdCBDcHlNYXRyaXhYZCxjb25zdCBDcHlNYXRyaXhYZD4gWHByVHlwZTsKK3R5cGVkZWYgQ3dpc2VCaW5hcnlPcDxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxkb3VibGUsIGRvdWJsZT4sIGNvbnN0IENweU1hdHJpeFhkLCBjb25zdCBDcHlNYXRyaXhYZD4gWHByVHlwZTsKIAotWHByVHlwZSBnZXRfeHByX3dpdGhfdGVtcHMoY29uc3QgTWF0cml4WGQmIGEpCi17CitYcHJUeXBlIGdldF94cHJfd2l0aF90ZW1wcyhjb25zdCBNYXRyaXhYZCYgYSkgewogICBNYXRyaXhYZCB0MSA9IGEucm93d2lzZSgpLnJldmVyc2UoKTsKLSAgTWF0cml4WGQgdDIgPSBhK2E7CisgIE1hdHJpeFhkIHQyID0gYSArIGE7CiAgIHJldHVybiB0MS5uZXN0QnlWYWx1ZSgpICsgdDIubmVzdEJ5VmFsdWUoKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKG5lc3RieXZhbHVlKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIEluZGV4IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOwotICAgIEluZGV4IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOwotICAgIE1hdHJpeFhkIGEgPSBNYXRyaXhYZDo6UmFuZG9tKHJvd3MsY29scyk7CitFSUdFTl9ERUNMQVJFX1RFU1QobmVzdGJ5dmFsdWUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgSW5kZXggcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICAgIEluZGV4IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgICBNYXRyaXhYZCBhID0gTWF0cml4WGQ6OlJhbmRvbShyb3dzLCBjb2xzKTsKICAgICBuYl90ZW1wb3JhcmllcyA9IDA7CiAgICAgWHByVHlwZSB4ID0gZ2V0X3hwcl93aXRoX3RlbXBzKGEpOwotICAgIFZFUklGWV9JU19FUVVBTChuYl90ZW1wb3Jhcmllcyw2KTsKKyAgICBWRVJJRllfSVNfRVFVQUwobmJfdGVtcG9yYXJpZXMsIDYpOwogICAgIE1hdHJpeFhkIGIgPSB4OwotICAgIFZFUklGWV9JU19FUVVBTChuYl90ZW1wb3Jhcmllcyw2KzEpOwotICAgIFZFUklGWV9JU19BUFBST1goYiwgYS5yb3d3aXNlKCkucmV2ZXJzZSgpLmV2YWwoKSArIChhK2EpLmV2YWwoKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG5iX3RlbXBvcmFyaWVzLCA2ICsgMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChiLCBhLnJvd3dpc2UoKS5yZXZlcnNlKCkuZXZhbCgpICsgKGEgKyBhKS5ldmFsKCkpOwogICAgIC8vIEJsb2NrIGV4cHJlc3Npb25zIHdvcmsgd2l0aCBkZW5zZSBOZXN0QnlWYWx1ZS4KLSAgICBWRVJJRllfSVNfQVBQUk9YKGIsIGEubmVzdEJ5VmFsdWUoKS5yb3d3aXNlKCkucmV2ZXJzZSgpLmV2YWwoKSArIChhLm5lc3RCeVZhbHVlKCkrYS5uZXN0QnlWYWx1ZSgpKS5ldmFsKCkpOworICAgIFZFUklGWV9JU19BUFBST1goYiwgYS5uZXN0QnlWYWx1ZSgpLnJvd3dpc2UoKS5yZXZlcnNlKCkuZXZhbCgpICsgKGEubmVzdEJ5VmFsdWUoKSArIGEubmVzdEJ5VmFsdWUoKSkuZXZhbCgpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXN0aW5nX29wcy5jcHAgYi90ZXN0L25lc3Rpbmdfb3BzLmNwcAppbmRleCAxMzUwOTk0Li5lYzQ3ZTIxIDEwMDY0NAotLS0gYS90ZXN0L25lc3Rpbmdfb3BzLmNwcAorKysgYi90ZXN0L25lc3Rpbmdfb3BzLmNwcApAQCAtMTMsOTUgKzEzLDg5IEBACiAjaW5jbHVkZSAibWFpbi5oIgogCiB0ZW1wbGF0ZSA8aW50IE4sIHR5cGVuYW1lIFhwclR5cGU+Ci12b2lkIHVzZV9uX3RpbWVzKGNvbnN0IFhwclR5cGUgJnhwcikKLXsKLSAgdHlwZW5hbWUgaW50ZXJuYWw6Om5lc3RlZF9ldmFsPFhwclR5cGUsTj46OnR5cGUgbWF0KHhwcik7Cit2b2lkIHVzZV9uX3RpbWVzKGNvbnN0IFhwclR5cGUmIHhwcikgeworICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8WHByVHlwZSwgTj46OnR5cGUgbWF0KHhwcik7CiAgIHR5cGVuYW1lIFhwclR5cGU6OlBsYWluT2JqZWN0IHJlcyhtYXQucm93cygpLCBtYXQuY29scygpKTsKLSAgbmJfdGVtcG9yYXJpZXMtLTsgLy8gcmVtb3ZlIHJlcworICBuYl90ZW1wb3Jhcmllcy0tOyAgLy8gcmVtb3ZlIHJlcwogICByZXMuc2V0WmVybygpOwotICBmb3IoaW50IGk9MDsgaTxOOyArK2kpCi0gICAgcmVzICs9IG1hdDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHJlcyArPSBtYXQ7CiB9CiAKIHRlbXBsYXRlIDxpbnQgTiwgdHlwZW5hbWUgUmVmZXJlbmNlVHlwZSwgdHlwZW5hbWUgWHByVHlwZT4KLWJvb2wgdmVyaWZ5X2V2YWxfdHlwZShjb25zdCBYcHJUeXBlICYsIGNvbnN0IFJlZmVyZW5jZVR5cGUmKQotewotICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxYcHJUeXBlLE4+Ojp0eXBlIEV2YWxUeXBlOworYm9vbCB2ZXJpZnlfZXZhbF90eXBlKGNvbnN0IFhwclR5cGUmLCBjb25zdCBSZWZlcmVuY2VUeXBlJikgeworICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxYcHJUeXBlLCBOPjo6dHlwZSBFdmFsVHlwZTsKICAgcmV0dXJuIGludGVybmFsOjppc19zYW1lPGludGVybmFsOjpyZW1vdmVfYWxsX3Q8RXZhbFR5cGU+LCBpbnRlcm5hbDo6cmVtb3ZlX2FsbF90PFJlZmVyZW5jZVR5cGU+Pjo6dmFsdWU7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHJ1bl9uZXN0aW5nX29wc18xKGNvbnN0IE1hdHJpeFR5cGUmIF9tKQotewotICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8TWF0cml4VHlwZSwyPjo6dHlwZSBtKF9tKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBydW5fbmVzdGluZ19vcHNfMShjb25zdCBNYXRyaXhUeXBlJiBfbSkgeworICB0eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8TWF0cml4VHlwZSwgMj46OnR5cGUgbShfbSk7CiAKICAgLy8gTWFrZSByZWFsbHkgc3VyZSB0aGF0IHdlIGFyZSBpbiBkZWJ1ZyBtb2RlIQogICBWRVJJRllfUkFJU0VTX0FTU0VSVChlaWdlbl9hc3NlcnQoZmFsc2UpKTsKIAogICAvLyBUaGUgb25seSBpbnRlbnRpb24gb2YgdGhlc2UgdGVzdHMgaXMgdG8gZW5zdXJlIHRoYXQgdGhpcyBjb2RlIGRvZXMKICAgLy8gbm90IHRyaWdnZXIgYW55IGFzc2VydHMgb3Igc2VnbWVudGF0aW9uIGZhdWx0cy4uLiBtb3JlIHRvIGNvbWUuCi0gIFZFUklGWV9JU19BUFBST1goIChtLnRyYW5zcG9zZSgpICogbSkuZGlhZ29uYWwoKS5zdW0oKSwgKG0udHJhbnNwb3NlKCkgKiBtKS5kaWFnb25hbCgpLnN1bSgpICk7Ci0gIFZFUklGWV9JU19BUFBST1goIChtLnRyYW5zcG9zZSgpICogbSkuZGlhZ29uYWwoKS5hcnJheSgpLmFicygpLnN1bSgpLCAobS50cmFuc3Bvc2UoKSAqIG0pLmRpYWdvbmFsKCkuYXJyYXkoKS5hYnMoKS5zdW0oKSApOworICBWRVJJRllfSVNfQVBQUk9YKChtLnRyYW5zcG9zZSgpICogbSkuZGlhZ29uYWwoKS5zdW0oKSwgKG0udHJhbnNwb3NlKCkgKiBtKS5kaWFnb25hbCgpLnN1bSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobS50cmFuc3Bvc2UoKSAqIG0pLmRpYWdvbmFsKCkuYXJyYXkoKS5hYnMoKS5zdW0oKSwKKyAgICAgICAgICAgICAgICAgICAobS50cmFuc3Bvc2UoKSAqIG0pLmRpYWdvbmFsKCkuYXJyYXkoKS5hYnMoKS5zdW0oKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG0udHJhbnNwb3NlKCkgKiBtKS5hcnJheSgpLmFicygpLnN1bSgpLCAobS50cmFuc3Bvc2UoKSAqIG0pLmFycmF5KCkuYWJzKCkuc3VtKCkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgobS50cmFuc3Bvc2UoKSAqIG0pLmFycmF5KCkuYWJzKCkuc3VtKCksIChtLnRyYW5zcG9zZSgpICogbSkuYXJyYXkoKS5hYnMoKS5zdW0oKSk7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHJ1bl9uZXN0aW5nX29wc18yKGNvbnN0IE1hdHJpeFR5cGUmIF9tKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHJ1bl9uZXN0aW5nX29wc18yKGNvbnN0IE1hdHJpeFR5cGUmIF9tKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgSW5kZXggcm93cyA9IF9tLnJvd3MoKTsKICAgSW5kZXggY29scyA9IF9tLmNvbHMoKTsKLSAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICBNYXRyaXg8U2NhbGFyLE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLENvbE1ham9yPiBtMjsKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCBDb2xNYWpvcj4gbTI7CiAKLSAgaWYoKE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lPT1EeW5hbWljKSkKLSAgewotICAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCB1c2Vfbl90aW1lczwxPihtMSArIG0xKm0xKSwgMSApOwotICAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCB1c2Vfbl90aW1lczwxMD4obTEgKyBtMSptMSksIDEgKTsKKyAgaWYgKChNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSkgeworICAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKHVzZV9uX3RpbWVzPDE+KG0xICsgbTEgKiBtMSksIDEpOworICAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKHVzZV9uX3RpbWVzPDEwPihtMSArIG0xICogbTEpLCAxKTsKIAotICAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCB1c2Vfbl90aW1lczwxPihtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZShtMS5jb2woMCkpKSwgMSApOwotICAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCB1c2Vfbl90aW1lczwxMD4obTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUobTEuY29sKDApKSksIDEgKTsKKyAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCh1c2Vfbl90aW1lczwxPihtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZShtMS5jb2woMCkpKSwgMSk7CisgICAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQodXNlX25fdGltZXM8MTA+KG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKG0xLmNvbCgwKSkpLCAxKTsKIAotICAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCB1c2Vfbl90aW1lczwxPihTY2FsYXIoMikqbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUobTEuY29sKDApKSksIDIgKTsgLy8gRklYTUUgY291bGQgYmUgb25lIGJ5IGFwcGx5aW5nIHRoZSBzY2FsaW5nIGluLXBsYWNlIG9uIHRoZSBzb2x2ZSByZXN1bHQKLSAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggdXNlX25fdGltZXM8MT4obTEuY29sKDApK20xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKG0xLmNvbCgwKSkpLCAyICk7IC8vIEZJWE1FIGNvdWxkIGJlIG9uZSBieSBhZGRpbmcgbTEuY29sKCkgaW5wbGFjZQotICAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCB1c2Vfbl90aW1lczwxMD4obTEuY29sKDApK20xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKG0xLmNvbCgwKSkpLCAyICk7CisgICAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQodXNlX25fdGltZXM8MT4oU2NhbGFyKDIpICogbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUobTEuY29sKDApKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7ICAvLyBGSVhNRSBjb3VsZCBiZSBvbmUgYnkgYXBwbHlpbmcgdGhlIHNjYWxpbmcgaW4tcGxhY2Ugb24gdGhlIHNvbHZlIHJlc3VsdAorICAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKHVzZV9uX3RpbWVzPDE+KG0xLmNvbCgwKSArIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKG0xLmNvbCgwKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOyAgLy8gRklYTUUgY291bGQgYmUgb25lIGJ5IGFkZGluZyBtMS5jb2woKSBpbnBsYWNlCisgICAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQodXNlX25fdGltZXM8MTA+KG0xLmNvbCgwKSArIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKG0xLmNvbCgwKSkpLCAyKTsKICAgfQogCiAgIHsKLSAgICBWRVJJRlkoIHZlcmlmeV9ldmFsX3R5cGU8MTA+KG0xLCBtMSkgKTsKLSAgICBpZighTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCkKLSAgICB7Ci0gICAgICBWRVJJRlkoIHZlcmlmeV9ldmFsX3R5cGU8Mz4oMiptMSwgMiptMSkgKTsKLSAgICAgIFZFUklGWSggdmVyaWZ5X2V2YWxfdHlwZTw0PigyKm0xLCBtMSkgKTsKKyAgICBWRVJJRlkodmVyaWZ5X2V2YWxfdHlwZTwxMD4obTEsIG0xKSk7CisgICAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4KSB7CisgICAgICBWRVJJRlkodmVyaWZ5X2V2YWxfdHlwZTwzPigyICogbTEsIDIgKiBtMSkpOworICAgICAgVkVSSUZZKHZlcmlmeV9ldmFsX3R5cGU8ND4oMiAqIG0xLCBtMSkpOworICAgIH0gZWxzZSB7CisgICAgICBWRVJJRlkodmVyaWZ5X2V2YWxfdHlwZTwyPigyICogbTEsIDIgKiBtMSkpOworICAgICAgVkVSSUZZKHZlcmlmeV9ldmFsX3R5cGU8Mz4oMiAqIG0xLCBtMSkpOwogICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgVkVSSUZZKCB2ZXJpZnlfZXZhbF90eXBlPDI+KDIqbTEsIDIqbTEpICk7Ci0gICAgICBWRVJJRlkoIHZlcmlmeV9ldmFsX3R5cGU8Mz4oMiptMSwgbTEpICk7Ci0gICAgfQotICAgIFZFUklGWSggdmVyaWZ5X2V2YWxfdHlwZTwyPihtMSttMSwgbTErbTEpICk7Ci0gICAgVkVSSUZZKCB2ZXJpZnlfZXZhbF90eXBlPDM+KG0xK20xLCBtMSkgKTsKLSAgICBWRVJJRlkoIHZlcmlmeV9ldmFsX3R5cGU8MT4obTEqbTEudHJhbnNwb3NlKCksIG0yKSApOwotICAgIFZFUklGWSggdmVyaWZ5X2V2YWxfdHlwZTwxPihtMSoobTErbTEpLnRyYW5zcG9zZSgpLCBtMikgKTsKLSAgICBWRVJJRlkoIHZlcmlmeV9ldmFsX3R5cGU8Mj4obTEqbTEudHJhbnNwb3NlKCksIG0yKSApOwotICAgIFZFUklGWSggdmVyaWZ5X2V2YWxfdHlwZTwxPihtMSttMSptMSwgbTEpICk7CisgICAgVkVSSUZZKHZlcmlmeV9ldmFsX3R5cGU8Mj4obTEgKyBtMSwgbTEgKyBtMSkpOworICAgIFZFUklGWSh2ZXJpZnlfZXZhbF90eXBlPDM+KG0xICsgbTEsIG0xKSk7CisgICAgVkVSSUZZKHZlcmlmeV9ldmFsX3R5cGU8MT4obTEgKiBtMS50cmFuc3Bvc2UoKSwgbTIpKTsKKyAgICBWRVJJRlkodmVyaWZ5X2V2YWxfdHlwZTwxPihtMSAqIChtMSArIG0xKS50cmFuc3Bvc2UoKSwgbTIpKTsKKyAgICBWRVJJRlkodmVyaWZ5X2V2YWxfdHlwZTwyPihtMSAqIG0xLnRyYW5zcG9zZSgpLCBtMikpOworICAgIFZFUklGWSh2ZXJpZnlfZXZhbF90eXBlPDE+KG0xICsgbTEgKiBtMSwgbTEpKTsKIAotICAgIFZFUklGWSggdmVyaWZ5X2V2YWxfdHlwZTwxPihtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZShtMSksIG0xKSApOwotICAgIFZFUklGWSggdmVyaWZ5X2V2YWxfdHlwZTwxPihtMSttMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZShtMSksIG0xKSApOworICAgIFZFUklGWSh2ZXJpZnlfZXZhbF90eXBlPDE+KG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKG0xKSwgbTEpKTsKKyAgICBWRVJJRlkodmVyaWZ5X2V2YWxfdHlwZTwxPihtMSArIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKG0xKSwgbTEpKTsKICAgfQogfQogCi0KLUVJR0VOX0RFQ0xBUkVfVEVTVChuZXN0aW5nX29wcykKLXsKLSAgQ0FMTF9TVUJURVNUXzEocnVuX25lc3Rpbmdfb3BzXzEoTWF0cml4WGY6OlJhbmRvbSgyNSwyNSkpKTsKLSAgQ0FMTF9TVUJURVNUXzIocnVuX25lc3Rpbmdfb3BzXzEoTWF0cml4WGNkOjpSYW5kb20oMjUsMjUpKSk7CitFSUdFTl9ERUNMQVJFX1RFU1QobmVzdGluZ19vcHMpIHsKKyAgQ0FMTF9TVUJURVNUXzEocnVuX25lc3Rpbmdfb3BzXzEoTWF0cml4WGY6OlJhbmRvbSgyNSwgMjUpKSk7CisgIENBTExfU1VCVEVTVF8yKHJ1bl9uZXN0aW5nX29wc18xKE1hdHJpeFhjZDo6UmFuZG9tKDI1LCAyNSkpKTsKICAgQ0FMTF9TVUJURVNUXzMocnVuX25lc3Rpbmdfb3BzXzEoTWF0cml4NGY6OlJhbmRvbSgpKSk7CiAgIENBTExfU1VCVEVTVF80KHJ1bl9uZXN0aW5nX29wc18xKE1hdHJpeDJkOjpSYW5kb20oKSkpOwogCi0gIEluZGV4IHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKTsKLSAgQ0FMTF9TVUJURVNUXzEoIHJ1bl9uZXN0aW5nX29wc18yKE1hdHJpeFhmKHMscykpICk7Ci0gIENBTExfU1VCVEVTVF8yKCBydW5fbmVzdGluZ19vcHNfMihNYXRyaXhYY2QocyxzKSkgKTsKLSAgQ0FMTF9TVUJURVNUXzMoIHJ1bl9uZXN0aW5nX29wc18yKE1hdHJpeDRmKCkpICk7Ci0gIENBTExfU1VCVEVTVF80KCBydW5fbmVzdGluZ19vcHNfMihNYXRyaXgyZCgpKSApOworICBJbmRleCBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICBDQUxMX1NVQlRFU1RfMShydW5fbmVzdGluZ19vcHNfMihNYXRyaXhYZihzLCBzKSkpOworICBDQUxMX1NVQlRFU1RfMihydW5fbmVzdGluZ19vcHNfMihNYXRyaXhYY2QocywgcykpKTsKKyAgQ0FMTF9TVUJURVNUXzMocnVuX25lc3Rpbmdfb3BzXzIoTWF0cml4NGYoKSkpOworICBDQUxMX1NVQlRFU1RfNChydW5fbmVzdGluZ19vcHNfMihNYXRyaXgyZCgpKSk7CiAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKIH0KZGlmZiAtLWdpdCBhL3Rlc3Qvbm9tYWxsb2MuY3BwIGIvdGVzdC9ub21hbGxvYy5jcHAKaW5kZXggNGI3OTM0Zi4uYzk5NTZkMyAxMDA2NDQKLS0tIGEvdGVzdC9ub21hbGxvYy5jcHAKKysrIGIvdGVzdC9ub21hbGxvYy5jcHAKQEAgLTIwLDI5ICsyMCwyNiBAQAogI2luY2x1ZGUgPEVpZ2VuL1FSPgogI2luY2x1ZGUgPEVpZ2VuL1NWRD4KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBub21hbGxvYyhjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIG5vbWFsbG9jKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgLyogdGhpcyB0ZXN0IGNoZWNrIG5vIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gYXJlIGlzc3VlZCB3aXRoIGZpeGVkLXNpemUgbWF0cmljZXMKLSAgKi8KKyAgICovCiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKIAogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKIAotICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbTMocm93cywgY29scyk7CiAKICAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAKLSAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksCi0gICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cyAtIDEpLCBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scyAtIDEpOwogCi0gIFZFUklGWV9JU19BUFBST1goKG0xK20yKSpzMSwgICAgICAgICAgICAgIHMxKm0xK3MxKm0yKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgobTErbTIpKHIsYyksIChtMShyLGMpKSsobTIocixjKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLmN3aXNlUHJvZHVjdChtMS5ibG9jaygwLDAscm93cyxjb2xzKSksIChtMS5hcnJheSgpKm0xLmFycmF5KCkpLm1hdHJpeCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgobTEqbTEudHJhbnNwb3NlKCkpKm0yLCAgbTEqKG0xLnRyYW5zcG9zZSgpKm0yKSk7Ci0gIAorICBWRVJJRllfSVNfQVBQUk9YKChtMSArIG0yKSAqIHMxLCBzMSAqIG0xICsgczEgKiBtMik7CisgIFZFUklGWV9JU19BUFBST1goKG0xICsgbTIpKHIsIGMpLCAobTEociwgYykpICsgKG0yKHIsIGMpKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2VQcm9kdWN0KG0xLmJsb2NrKDAsIDAsIHJvd3MsIGNvbHMpKSwgKG0xLmFycmF5KCkgKiBtMS5hcnJheSgpKS5tYXRyaXgoKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0xICogbTEudHJhbnNwb3NlKCkpICogbTIsIG0xICogKG0xLnRyYW5zcG9zZSgpICogbTIpKTsKKwogICBtMi5jb2woMCkubm9hbGlhcygpID0gbTEgKiBtMS5jb2woMCk7CiAgIG0yLmNvbCgwKS5ub2FsaWFzKCkgLT0gbTEuYWRqb2ludCgpICogbTEuY29sKDApOwogICBtMi5jb2woMCkubm9hbGlhcygpIC09IG0xICogbTEucm93KDApLmFkam9pbnQoKTsKQEAgLTUyLDggKzQ5LDggQEAKICAgbTIucm93KDApLm5vYWxpYXMoKSAtPSBtMS5yb3coMCkgKiBtMS5hZGpvaW50KCk7CiAgIG0yLnJvdygwKS5ub2FsaWFzKCkgLT0gbTEuY29sKDApLmFkam9pbnQoKSAqIG0xOwogICBtMi5yb3coMCkubm9hbGlhcygpIC09IG0xLmNvbCgwKS5hZGpvaW50KCkgKiBtMS5hZGpvaW50KCk7Ci0gIFZFUklGWV9JU19BUFBST1gobTIsbTIpOwotICAKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTIpOworCiAgIG0yLmNvbCgwKS5ub2FsaWFzKCkgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIG0xLmNvbCgwKTsKICAgbTIuY29sKDApLm5vYWxpYXMoKSAtPSBtMS5hZGpvaW50KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiBtMS5jb2woMCk7CiAgIG0yLmNvbCgwKS5ub2FsaWFzKCkgLT0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiBtMS5yb3coMCkuYWRqb2ludCgpOwpAQCAtNjMsOCArNjAsOCBAQAogICBtMi5yb3coMCkubm9hbGlhcygpIC09IG0xLnJvdygwKSAqIG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKICAgbTIucm93KDApLm5vYWxpYXMoKSAtPSBtMS5jb2woMCkuYWRqb2ludCgpICogbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CiAgIG0yLnJvdygwKS5ub2FsaWFzKCkgLT0gbTEuY29sKDApLmFkam9pbnQoKSAqIG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMixtMik7Ci0gIAorICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMik7CisKICAgbTIuY29sKDApLm5vYWxpYXMoKSA9IG0xLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqIG0xLmNvbCgwKTsKICAgbTIuY29sKDApLm5vYWxpYXMoKSAtPSBtMS5hZGpvaW50KCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogbTEuY29sKDApOwogICBtMi5jb2woMCkubm9hbGlhcygpIC09IG0xLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqIG0xLnJvdygwKS5hZGpvaW50KCk7CkBAIC03NCw4NSArNzEsODkgQEAKICAgbTIucm93KDApLm5vYWxpYXMoKSAtPSBtMS5yb3coMCkgKiBtMS5hZGpvaW50KCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpOwogICBtMi5yb3coMCkubm9hbGlhcygpIC09IG0xLmNvbCgwKS5hZGpvaW50KCkgKiBtMS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7CiAgIG0yLnJvdygwKS5ub2FsaWFzKCkgLT0gbTEuY29sKDApLmFkam9pbnQoKSAqIG0xLmFkam9pbnQoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7Ci0gIFZFUklGWV9JU19BUFBST1gobTIsbTIpOwotICAKLSAgbTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUobTEuY29sKDApLC0xKTsKLSAgbTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUobTEucm93KDApLC0xKTsKLSAgbTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUobTEuY29sKDApLCBtMS5jb2woMCkpOyAvLyByYW5rLTIKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTIpOworCisgIG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0xLmNvbCgwKSwgLTEpOworICBtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShtMS5yb3coMCksIC0xKTsKKyAgbTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUobTEuY29sKDApLCBtMS5jb2woMCkpOyAgLy8gcmFuay0yCiAKICAgLy8gVGhlIGZvbGxvd2luZyBmYW5jeSBtYXRyaXgtbWF0cml4IHByb2R1Y3RzIGFyZSBub3Qgc2FmZSB5ZXQgcmVnYXJkaW5nIHN0YXRpYyBhbGxvY2F0aW9uCiAgIG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0xKTsKICAgbTIgKz0gbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiBtMTsKICAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSBtMiAqIG0yOwogICBtMSArPSBtMS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiBtMjsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMixtMik7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0yKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgotdm9pZCBjdG1zX2RlY29tcG9zaXRpb25zKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGN0bXNfZGVjb21wb3NpdGlvbnMoKSB7CiAgIGNvbnN0IGludCBtYXhTaXplID0gMTY7Ci0gIGNvbnN0IGludCBzaXplICAgID0gMTI7CisgIGNvbnN0IGludCBzaXplID0gMTI7CiAKLSAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYywKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplLCBtYXhTaXplPiBNYXRyaXg7CisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxTY2FsYXIsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYywgMCwgbWF4U2l6ZSwgbWF4U2l6ZT4gTWF0cml4OwogCi0gIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxTY2FsYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6RHluYW1pYywgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplLCAxPiBWZWN0b3I7CisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxTY2FsYXIsIEVpZ2VuOjpEeW5hbWljLCAxLCAwLCBtYXhTaXplLCAxPiBWZWN0b3I7CiAKLSAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PHN0ZDo6Y29tcGxleDxTY2FsYXI+LAotICAgICAgICAgICAgICAgICAgICAgICAgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUsIG1heFNpemU+IENvbXBsZXhNYXRyaXg7CisgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxzdGQ6OmNvbXBsZXg8U2NhbGFyPiwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljLCAwLCBtYXhTaXplLCBtYXhTaXplPiBDb21wbGV4TWF0cml4OwogCiAgIGNvbnN0IE1hdHJpeCBBKE1hdHJpeDo6UmFuZG9tKHNpemUsIHNpemUpKSwgQihNYXRyaXg6OlJhbmRvbShzaXplLCBzaXplKSk7Ci0gIE1hdHJpeCBYKHNpemUsc2l6ZSk7CisgIE1hdHJpeCBYKHNpemUsIHNpemUpOwogICBjb25zdCBDb21wbGV4TWF0cml4IGNvbXBsZXhBKENvbXBsZXhNYXRyaXg6OlJhbmRvbShzaXplLCBzaXplKSk7CiAgIGNvbnN0IE1hdHJpeCBzYUEgPSBBLmFkam9pbnQoKSAqIEE7CiAgIGNvbnN0IFZlY3RvciBiKFZlY3Rvcjo6UmFuZG9tKHNpemUpKTsKICAgVmVjdG9yIHgoc2l6ZSk7CiAKICAgLy8gQ2hvbGVza3kgbW9kdWxlCi0gIEVpZ2VuOjpMTFQ8TWF0cml4PiAgTExUOyAgTExULmNvbXB1dGUoQSk7CisgIEVpZ2VuOjpMTFQ8TWF0cml4PiBMTFQ7CisgIExMVC5jb21wdXRlKEEpOwogICBYID0gTExULnNvbHZlKEIpOwogICB4ID0gTExULnNvbHZlKGIpOwotICBFaWdlbjo6TERMVDxNYXRyaXg+IExETFQ7IExETFQuY29tcHV0ZShBKTsKKyAgRWlnZW46OkxETFQ8TWF0cml4PiBMRExUOworICBMRExULmNvbXB1dGUoQSk7CiAgIFggPSBMRExULnNvbHZlKEIpOwogICB4ID0gTERMVC5zb2x2ZShiKTsKIAogICAvLyBFaWdlbnZhbHVlcyBtb2R1bGUKLSAgRWlnZW46Okhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPENvbXBsZXhNYXRyaXg+IGhlc3NEZWNvbXA7ICAgICAgICBoZXNzRGVjb21wLmNvbXB1dGUoY29tcGxleEEpOwotICBFaWdlbjo6Q29tcGxleFNjaHVyPENvbXBsZXhNYXRyaXg+ICAgICAgICAgICAgY1NjaHVyKHNpemUpOyAgICAgIGNTY2h1ci5jb21wdXRlKGNvbXBsZXhBKTsKLSAgRWlnZW46OkNvbXBsZXhFaWdlblNvbHZlcjxDb21wbGV4TWF0cml4PiAgICAgIGNFaWdTb2x2ZXI7ICAgICAgICBjRWlnU29sdmVyLmNvbXB1dGUoY29tcGxleEEpOwotICBFaWdlbjo6RWlnZW5Tb2x2ZXI8TWF0cml4PiAgICAgICAgICAgICAgICAgICAgZWlnU29sdmVyOyAgICAgICAgIGVpZ1NvbHZlci5jb21wdXRlKEEpOwotICBFaWdlbjo6U2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXg+ICAgICAgICAgc2FFaWdTb2x2ZXIoc2l6ZSk7IHNhRWlnU29sdmVyLmNvbXB1dGUoc2FBKTsKLSAgRWlnZW46OlRyaWRpYWdvbmFsaXphdGlvbjxNYXRyaXg+ICAgICAgICAgICAgIHRyaWRpYWc7ICAgICAgICAgICB0cmlkaWFnLmNvbXB1dGUoc2FBKTsKKyAgRWlnZW46Okhlc3NlbmJlcmdEZWNvbXBvc2l0aW9uPENvbXBsZXhNYXRyaXg+IGhlc3NEZWNvbXA7CisgIGhlc3NEZWNvbXAuY29tcHV0ZShjb21wbGV4QSk7CisgIEVpZ2VuOjpDb21wbGV4U2NodXI8Q29tcGxleE1hdHJpeD4gY1NjaHVyKHNpemUpOworICBjU2NodXIuY29tcHV0ZShjb21wbGV4QSk7CisgIEVpZ2VuOjpDb21wbGV4RWlnZW5Tb2x2ZXI8Q29tcGxleE1hdHJpeD4gY0VpZ1NvbHZlcjsKKyAgY0VpZ1NvbHZlci5jb21wdXRlKGNvbXBsZXhBKTsKKyAgRWlnZW46OkVpZ2VuU29sdmVyPE1hdHJpeD4gZWlnU29sdmVyOworICBlaWdTb2x2ZXIuY29tcHV0ZShBKTsKKyAgRWlnZW46OlNlbGZBZGpvaW50RWlnZW5Tb2x2ZXI8TWF0cml4PiBzYUVpZ1NvbHZlcihzaXplKTsKKyAgc2FFaWdTb2x2ZXIuY29tcHV0ZShzYUEpOworICBFaWdlbjo6VHJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeD4gdHJpZGlhZzsKKyAgdHJpZGlhZy5jb21wdXRlKHNhQSk7CiAKICAgLy8gTFUgbW9kdWxlCi0gIEVpZ2VuOjpQYXJ0aWFsUGl2TFU8TWF0cml4PiBwcExVOyBwcExVLmNvbXB1dGUoQSk7CisgIEVpZ2VuOjpQYXJ0aWFsUGl2TFU8TWF0cml4PiBwcExVOworICBwcExVLmNvbXB1dGUoQSk7CiAgIFggPSBwcExVLnNvbHZlKEIpOwogICB4ID0gcHBMVS5zb2x2ZShiKTsKLSAgRWlnZW46OkZ1bGxQaXZMVTxNYXRyaXg+ICAgIGZwTFU7IGZwTFUuY29tcHV0ZShBKTsKKyAgRWlnZW46OkZ1bGxQaXZMVTxNYXRyaXg+IGZwTFU7CisgIGZwTFUuY29tcHV0ZShBKTsKICAgWCA9IGZwTFUuc29sdmUoQik7CiAgIHggPSBmcExVLnNvbHZlKGIpOwogCiAgIC8vIFFSIG1vZHVsZQotICBFaWdlbjo6SG91c2Vob2xkZXJRUjxNYXRyaXg+ICAgICAgICBoUVI7ICBoUVIuY29tcHV0ZShBKTsKKyAgRWlnZW46OkhvdXNlaG9sZGVyUVI8TWF0cml4PiBoUVI7CisgIGhRUi5jb21wdXRlKEEpOwogICBYID0gaFFSLnNvbHZlKEIpOwogICB4ID0gaFFSLnNvbHZlKGIpOwotICBFaWdlbjo6Q29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXg+ICBjcFFSOyBjcFFSLmNvbXB1dGUoQSk7CisgIEVpZ2VuOjpDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeD4gY3BRUjsKKyAgY3BRUi5jb21wdXRlKEEpOwogICBYID0gY3BRUi5zb2x2ZShCKTsKICAgeCA9IGNwUVIuc29sdmUoYik7Ci0gIEVpZ2VuOjpGdWxsUGl2SG91c2Vob2xkZXJRUjxNYXRyaXg+IGZwUVI7IGZwUVIuY29tcHV0ZShBKTsKKyAgRWlnZW46OkZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeD4gZnBRUjsKKyAgZnBRUi5jb21wdXRlKEEpOwogICAvLyBGSVhNRSBYID0gZnBRUi5zb2x2ZShCKTsKICAgeCA9IGZwUVIuc29sdmUoYik7CiAKICAgLy8gU1ZEIG1vZHVsZQotICBFaWdlbjo6SmFjb2JpU1ZEPE1hdHJpeCwgQ29tcHV0ZUZ1bGxVIHwgQ29tcHV0ZUZ1bGxWPiBqU1ZEOyBqU1ZELmNvbXB1dGUoQSk7CisgIEVpZ2VuOjpKYWNvYmlTVkQ8TWF0cml4LCBDb21wdXRlRnVsbFUgfCBDb21wdXRlRnVsbFY+IGpTVkQ7CisgIGpTVkQuY29tcHV0ZShBKTsKIH0KIAogdm9pZCB0ZXN0X3plcm9zaXplZCgpIHsKQEAgLTE2MCwyOSArMTYxLDMwIEBACiAgIEVpZ2VuOjpNYXRyaXhYZCBBOwogICBFaWdlbjo6VmVjdG9yWGQgdjsKICAgLy8gZXhwbGljaXQgemVyby1zaXplZDoKLSAgRWlnZW46OkFycmF5WFhkIEEwKDAsMCk7CisgIEVpZ2VuOjpBcnJheVhYZCBBMCgwLCAwKTsKICAgRWlnZW46OkFycmF5WGQgdjAoMCk7CiAKICAgLy8gYXNzaWduaW5nIGVtcHR5IG9iamVjdHMgdG8gZWFjaCBvdGhlcjoKLSAgQT1BMDsKLSAgdj12MDsKKyAgQSA9IEEwOworICB2ID0gdjA7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgdGVzdF9yZWZlcmVuY2UoY29uc3QgTWF0cml4VHlwZSYgbSkgewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRlc3RfcmVmZXJlbmNlKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwotICBlbnVtIHsgRmxhZyAgICAgICAgICA9ICBNYXRyaXhUeXBlOjpJc1Jvd01ham9yID8gRWlnZW46OlJvd01ham9yIDogRWlnZW46OkNvbE1ham9yfTsKLSAgZW51bSB7IFRyYW5zcG9zZUZsYWcgPSAhTWF0cml4VHlwZTo6SXNSb3dNYWpvciA/IEVpZ2VuOjpSb3dNYWpvciA6IEVpZ2VuOjpDb2xNYWpvcn07Ci0gIEluZGV4IHJvd3MgPSBtLnJvd3MoKSwgY29scz1tLmNvbHMoKTsKLSAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljLCBGbGFnICAgICAgICAgPiBNYXRyaXhYOworICBlbnVtIHsgRmxhZyA9IE1hdHJpeFR5cGU6OklzUm93TWFqb3IgPyBFaWdlbjo6Um93TWFqb3IgOiBFaWdlbjo6Q29sTWFqb3IgfTsKKyAgZW51bSB7IFRyYW5zcG9zZUZsYWcgPSAhTWF0cml4VHlwZTo6SXNSb3dNYWpvciA/IEVpZ2VuOjpSb3dNYWpvciA6IEVpZ2VuOjpDb2xNYWpvciB9OworICBJbmRleCByb3dzID0gbS5yb3dzKCksIGNvbHMgPSBtLmNvbHMoKTsKKyAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljLCBGbGFnPiBNYXRyaXhYOwogICB0eXBlZGVmIEVpZ2VuOjpNYXRyaXg8U2NhbGFyLCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWMsIFRyYW5zcG9zZUZsYWc+IE1hdHJpeFhUOwogICAvLyBEeW5hbWljIHJlZmVyZW5jZToKLSAgdHlwZWRlZiBFaWdlbjo6UmVmPGNvbnN0IE1hdHJpeFggID4gUmVmOwotICB0eXBlZGVmIEVpZ2VuOjpSZWY8Y29uc3QgTWF0cml4WFQgPiBSZWZUOworICB0eXBlZGVmIEVpZ2VuOjpSZWY8Y29uc3QgTWF0cml4WD4gUmVmOworICB0eXBlZGVmIEVpZ2VuOjpSZWY8Y29uc3QgTWF0cml4WFQ+IFJlZlQ7CiAKICAgUmVmIHIxKG0pOwotICBSZWYgcjIobS5ibG9jayhyb3dzLzMsIGNvbHMvNCwgcm93cy8yLCBjb2xzLzIpKTsKKyAgUmVmIHIyKG0uYmxvY2socm93cyAvIDMsIGNvbHMgLyA0LCByb3dzIC8gMiwgY29scyAvIDIpKTsKICAgUmVmVCByMyhtLnRyYW5zcG9zZSgpKTsKLSAgUmVmVCByNChtLnRvcExlZnRDb3JuZXIocm93cy8yLCBjb2xzLzIpLnRyYW5zcG9zZSgpKTsKKyAgUmVmVCByNChtLnRvcExlZnRDb3JuZXIocm93cyAvIDIsIGNvbHMgLyAyKS50cmFuc3Bvc2UoKSk7CiAKICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoUmVmVCByNShtKSk7CiAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFJlZiByNihtLnRyYW5zcG9zZSgpKSk7CkBAIC0xOTMsMzYgKzE5NSwzNCBAQAogICBSZWZUIHI5ID0gcjM7CiAKICAgLy8gSW5pdGlhbGl6aW5nIGZyb20gYSBjb21wYXRpYmxlIFJlZiBzaGFsbCBhbHNvIG5ldmVyIG1hbGxvYwotICBFaWdlbjo6UmVmPGNvbnN0IE1hdHJpeFgsIFVuYWxpZ25lZCwgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+ID4gcjEwPXI4LCByMTE9bTsKKyAgRWlnZW46OlJlZjxjb25zdCBNYXRyaXhYLCBVbmFsaWduZWQsIFN0cmlkZTxEeW5hbWljLCBEeW5hbWljPiA+IHIxMCA9IHI4LCByMTEgPSBtOwogCiAgIC8vIEluaXRpYWxpemluZyBmcm9tIGFuIGluY29tcGF0aWJsZSBSZWYgd2lsbCBtYWxsb2M6CiAgIHR5cGVkZWYgRWlnZW46OlJlZjxjb25zdCBNYXRyaXhYLCBBbGlnbmVkPiBSZWZBbGlnbmVkOwotICBWRVJJRllfUkFJU0VTX0FTU0VSVChSZWZBbGlnbmVkIHIxMj1yMTApOwotICBWRVJJRllfUkFJU0VTX0FTU0VSVChSZWYgcjEzPXIxMCk7IC8vIHIxMCBoYXMgbW9yZSBkeW5hbWljIHN0cmlkZXMKLQorICBWRVJJRllfUkFJU0VTX0FTU0VSVChSZWZBbGlnbmVkIHIxMiA9IHIxMCk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKFJlZiByMTMgPSByMTApOyAgLy8gcjEwIGhhcyBtb3JlIGR5bmFtaWMgc3RyaWRlcwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1Qobm9tYWxsb2MpCi17CitFSUdFTl9ERUNMQVJFX1RFU1Qobm9tYWxsb2MpIHsKICAgLy8gY3JlYXRlIHNvbWUgZHluYW1pYyBvYmplY3RzCi0gIEVpZ2VuOjpNYXRyaXhYZCBNMSA9IE1hdHJpeFhkOjpSYW5kb20oMywzKTsKLSAgUmVmPGNvbnN0IE1hdHJpeFhkPiBSMSA9IDIuMCpNMTsgLy8gUmVmIHJlcXVpcmVzIHRlbXBvcmFyeQorICBFaWdlbjo6TWF0cml4WGQgTTEgPSBNYXRyaXhYZDo6UmFuZG9tKDMsIDMpOworICBSZWY8Y29uc3QgTWF0cml4WGQ+IFIxID0gMi4wICogTTE7ICAvLyBSZWYgcmVxdWlyZXMgdGVtcG9yYXJ5CiAKICAgLy8gZnJvbSBoZXJlIG9uIHByb2hpYml0IG1hbGxvYzoKICAgRWlnZW46OmludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQoZmFsc2UpOwogCiAgIC8vIGNoZWNrIHRoYXQgb3VyIG9wZXJhdG9yIG5ldyBpcyBpbmRlZWQgY2FsbGVkOgotICBWRVJJRllfUkFJU0VTX0FTU0VSVChNYXRyaXhYZCBkdW1teShNYXRyaXhYZDo6UmFuZG9tKDMsMykpKTsKLSAgQ0FMTF9TVUJURVNUXzEobm9tYWxsb2MoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOwotICBDQUxMX1NVQlRFU1RfMihub21hbGxvYyhNYXRyaXg0ZCgpKSApOwotICBDQUxMX1NVQlRFU1RfMyhub21hbGxvYyhNYXRyaXg8ZmxvYXQsMzIsMzI+KCkpICk7Ci0gIAorICBWRVJJRllfUkFJU0VTX0FTU0VSVChNYXRyaXhYZCBkdW1teShNYXRyaXhYZDo6UmFuZG9tKDMsIDMpKSk7CisgIENBTExfU1VCVEVTVF8xKG5vbWFsbG9jKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICBDQUxMX1NVQlRFU1RfMihub21hbGxvYyhNYXRyaXg0ZCgpKSk7CisgIENBTExfU1VCVEVTVF8zKG5vbWFsbG9jKE1hdHJpeDxmbG9hdCwgMzIsIDMyPigpKSk7CisKICAgLy8gQ2hlY2sgZGVjb21wb3NpdGlvbiBtb2R1bGVzIHdpdGggZHluYW1pYyBtYXRyaWNlcyB0aGF0IGhhdmUgYSBrbm93biBjb21waWxlLXRpbWUgbWF4IHNpemUgKGN0bXMpCiAgIENBTExfU1VCVEVTVF80KGN0bXNfZGVjb21wb3NpdGlvbnM8ZmxvYXQ+KCkpOwogCiAgIENBTExfU1VCVEVTVF81KHRlc3RfemVyb3NpemVkKCkpOwogCi0gIENBTExfU1VCVEVTVF82KHRlc3RfcmVmZXJlbmNlKE1hdHJpeDxmbG9hdCwzMiwzMj4oKSkpOworICBDQUxMX1NVQlRFU1RfNih0ZXN0X3JlZmVyZW5jZShNYXRyaXg8ZmxvYXQsIDMyLCAzMj4oKSkpOwogICBDQUxMX1NVQlRFU1RfNyh0ZXN0X3JlZmVyZW5jZShSMSkpOwogICBDQUxMX1NVQlRFU1RfOChSZWY8TWF0cml4WGQ+IFIyID0gTTEudG9wUm93czwyPigpOyB0ZXN0X3JlZmVyZW5jZShSMikpOwogCmRpZmYgLS1naXQgYS90ZXN0L251bGxhcnkuY3BwIGIvdGVzdC9udWxsYXJ5LmNwcAppbmRleCBlNTI0ODM3Li45ZjljZmVhIDEwMDY0NAotLS0gYS90ZXN0L251bGxhcnkuY3BwCisrKyBiL3Rlc3QvbnVsbGFyeS5jcHAKQEAgLTEwLDEyICsxMCwxMSBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotYm9vbCBlcXVhbHNJZGVudGl0eShjb25zdCBNYXRyaXhUeXBlJiBBKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Citib29sIGVxdWFsc0lkZW50aXR5KGNvbnN0IE1hdHJpeFR5cGUmIEEpIHsKICAgYm9vbCBvZmZEaWFnT0sgPSB0cnVlOwogICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgQS5yb3dzKCk7ICsraSkgewotICAgIGZvciAoSW5kZXggaiA9IGkrMTsgaiA8IEEuY29scygpOyArK2opIHsKKyAgICBmb3IgKEluZGV4IGogPSBpICsgMTsgaiA8IEEuY29scygpOyArK2opIHsKICAgICAgIG9mZkRpYWdPSyA9IG9mZkRpYWdPSyAmJiBudW1leHQ6OmlzX2V4YWN0bHlfemVybyhBKGksIGopKTsKICAgICB9CiAgIH0KQEAgLTI5LDE5MCArMjgsMTgxIEBACiAgIHJldHVybiBvZmZEaWFnT0sgJiYgZGlhZ09LOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgotdm9pZCBjaGVja19leHRyZW1pdHlfYWNjdXJhY3koY29uc3QgVmVjdG9yVHlwZSAmdiwgY29uc3QgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyICZsb3csIGNvbnN0IHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciAmaGlnaCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCBjaGVja19leHRyZW1pdHlfYWNjdXJhY3koY29uc3QgVmVjdG9yVHlwZSYgdiwgY29uc3QgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyJiBsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXImIGhpZ2gpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKIAotICBSZWFsU2NhbGFyIHByZWMgPSBpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLGZsb2F0Pjo6dmFsdWUgPyBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpKjEwIDogTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKS8xMDsKKyAgUmVhbFNjYWxhciBwcmVjID0gaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhciwgZmxvYXQ+Ojp2YWx1ZSA/IE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZHVtbXlfcHJlY2lzaW9uKCkgKiAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSAvIDEwOwogICBJbmRleCBzaXplID0gdi5zaXplKCk7CiAKLSAgaWYoc2l6ZTwyMCkKLSAgICByZXR1cm47CisgIGlmIChzaXplIDwgMjApIHJldHVybjsKIAotICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQotICB7Ci0gICAgaWYoaTw1IHx8IGk+c2l6ZS02KQotICAgIHsKLSAgICAgIFNjYWxhciByZWYgPSAobG93KlJlYWxTY2FsYXIoc2l6ZS1pLTEpKS9SZWFsU2NhbGFyKHNpemUtMSkgKyAoaGlnaCpSZWFsU2NhbGFyKGkpKS9SZWFsU2NhbGFyKHNpemUtMSk7Ci0gICAgICBpZihzdGQ6OmFicyhyZWYpPjEpCi0gICAgICB7Ci0gICAgICAgIGlmKCFpbnRlcm5hbDo6aXNBcHByb3godihpKSwgcmVmLCBwcmVjKSkKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgdihpKSA8PCAiICE9ICIgPDwgcmVmIDw8ICIgIDsgcmVsYXRpdmUgZXJyb3I6ICIgPDwgc3RkOjphYnMoKHYoaSktcmVmKS9yZWYpIDw8ICIgIDsgcmVxdWlyZWQgcHJlY2lzaW9uOiAiIDw8IHByZWMgPDwgIiAgOyByYW5nZTogIiA8PCBsb3cgPDwgIiwiIDw8IGhpZ2ggPDwgIiAgOyBpOiAiIDw8IGkgPDwgIlxuIjsKLSAgICAgICAgVkVSSUZZKGludGVybmFsOjppc0FwcHJveCh2KGkpLCAobG93KlJlYWxTY2FsYXIoc2l6ZS1pLTEpKS9SZWFsU2NhbGFyKHNpemUtMSkgKyAoaGlnaCpSZWFsU2NhbGFyKGkpKS9SZWFsU2NhbGFyKHNpemUtMSksIHByZWMpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBpZiAoaSA8IDUgfHwgaSA+IHNpemUgLSA2KSB7CisgICAgICBTY2FsYXIgcmVmID0KKyAgICAgICAgICAobG93ICogUmVhbFNjYWxhcihzaXplIC0gaSAtIDEpKSAvIFJlYWxTY2FsYXIoc2l6ZSAtIDEpICsgKGhpZ2ggKiBSZWFsU2NhbGFyKGkpKSAvIFJlYWxTY2FsYXIoc2l6ZSAtIDEpOworICAgICAgaWYgKHN0ZDo6YWJzKHJlZikgPiAxKSB7CisgICAgICAgIGlmICghaW50ZXJuYWw6OmlzQXBwcm94KHYoaSksIHJlZiwgcHJlYykpCisgICAgICAgICAgc3RkOjpjb3V0IDw8IHYoaSkgPDwgIiAhPSAiIDw8IHJlZiA8PCAiICA7IHJlbGF0aXZlIGVycm9yOiAiIDw8IHN0ZDo6YWJzKCh2KGkpIC0gcmVmKSAvIHJlZikKKyAgICAgICAgICAgICAgICAgICAgPDwgIiAgOyByZXF1aXJlZCBwcmVjaXNpb246ICIgPDwgcHJlYyA8PCAiICA7IHJhbmdlOiAiIDw8IGxvdyA8PCAiLCIgPDwgaGlnaCA8PCAiICA7IGk6ICIgPDwgaQorICAgICAgICAgICAgICAgICAgICA8PCAiXG4iOworICAgICAgICBWRVJJRlkoaW50ZXJuYWw6OmlzQXBwcm94KAorICAgICAgICAgICAgdihpKSwKKyAgICAgICAgICAgIChsb3cgKiBSZWFsU2NhbGFyKHNpemUgLSBpIC0gMSkpIC8gUmVhbFNjYWxhcihzaXplIC0gMSkgKyAoaGlnaCAqIFJlYWxTY2FsYXIoaSkpIC8gUmVhbFNjYWxhcihzaXplIC0gMSksCisgICAgICAgICAgICBwcmVjKSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+Ci12b2lkIHRlc3RWZWN0b3JUeXBlKGNvbnN0IFZlY3RvclR5cGUmIGJhc2UpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZT4KK3ZvaWQgdGVzdFZlY3RvclR5cGUoY29uc3QgVmVjdG9yVHlwZSYgYmFzZSkgewogICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOwogCiAgIGNvbnN0IEluZGV4IHNpemUgPSBiYXNlLnNpemUoKTsKLSAgCi0gIFNjYWxhciBoaWdoID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC01MDAsNTAwKTsKLSAgU2NhbGFyIGxvdyA9IChzaXplID09IDEgPyBoaWdoIDogaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC01MDAsNTAwKSk7Ci0gIGlmIChudW1leHQ6OnJlYWwobG93KT5udW1leHQ6OnJlYWwoaGlnaCkpIHN0ZDo6c3dhcChsb3csaGlnaCk7CisKKyAgU2NhbGFyIGhpZ2ggPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTUwMCwgNTAwKTsKKyAgU2NhbGFyIGxvdyA9IChzaXplID09IDEgPyBoaWdoIDogaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC01MDAsIDUwMCkpOworICBpZiAobnVtZXh0OjpyZWFsKGxvdykgPiBudW1leHQ6OnJlYWwoaGlnaCkpIHN0ZDo6c3dhcChsb3csIGhpZ2gpOwogCiAgIC8vIGNoZWNrIGxvdz09aGlnaAotICBpZihpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLmYsMS5mKTwwLjA1ZikKLSAgICBsb3cgPSBoaWdoOworICBpZiAoaW50ZXJuYWw6OnJhbmRvbTxmbG9hdD4oMC5mLCAxLmYpIDwgMC4wNWYpIGxvdyA9IGhpZ2g7CiAgIC8vIGNoZWNrIGFicyhsb3cpID4+IGFicyhoaWdoKQotICBlbHNlIGlmKHNpemU+MiAmJiBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptYXhfZXhwb25lbnQxMD4wICYmIGludGVybmFsOjpyYW5kb208ZmxvYXQ+KDAuZiwxLmYpPDAuMWYpCi0gICAgbG93ID0gLWludGVybmFsOjpyYW5kb208U2NhbGFyPigxLDIpICogUmVhbFNjYWxhcihzdGQ6OnBvdyhSZWFsU2NhbGFyKDEwKSxzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptYXhfZXhwb25lbnQxMC8yKSk7CisgIGVsc2UgaWYgKHNpemUgPiAyICYmIHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1heF9leHBvbmVudDEwID4gMCAmJiBpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLmYsIDEuZikgPCAwLjFmKQorICAgIGxvdyA9IC1pbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oMSwgMikgKgorICAgICAgICAgIFJlYWxTY2FsYXIoc3RkOjpwb3coUmVhbFNjYWxhcigxMCksIHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1heF9leHBvbmVudDEwIC8gMikpOwogCi0gIGNvbnN0IFNjYWxhciBzdGVwID0gKChzaXplID09IDEpID8gMSA6IChoaWdoLWxvdykvUmVhbFNjYWxhcihzaXplLTEpKTsKKyAgY29uc3QgU2NhbGFyIHN0ZXAgPSAoKHNpemUgPT0gMSkgPyAxIDogKGhpZ2ggLSBsb3cpIC8gUmVhbFNjYWxhcihzaXplIC0gMSkpOwogCiAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHJlc3VsdCB5aWVsZHMgd2hhdCB3ZSBleHBlY3QgaXQgdG8gZG8KICAgVmVjdG9yVHlwZSBtKGJhc2UpLCBvKGJhc2UpOwotICBtLnNldExpblNwYWNlZChzaXplLGxvdyxoaWdoKTsKKyAgbS5zZXRMaW5TcGFjZWQoc2l6ZSwgbG93LCBoaWdoKTsKICAgby5zZXRFcXVhbFNwYWNlZChzaXplLCBsb3csIHN0ZXApOwogCi0gIGlmKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKQotICB7CisgIGlmICghTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcikgewogICAgIFZlY3RvclR5cGUgbihzaXplKTsKLSAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQotICAgICAgbihpKSA9IGxvdytSZWFsU2NhbGFyKGkpKnN0ZXA7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtLG4pOwotICAgIFZFUklGWV9JU19BUFBST1gobixvKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgbihpKSA9IGxvdyArIFJlYWxTY2FsYXIoaSkgKiBzdGVwOworICAgIFZFUklGWV9JU19BUFBST1gobSwgbik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChuLCBvKTsKIAotICAgIENBTExfU1VCVEVTVCggY2hlY2tfZXh0cmVtaXR5X2FjY3VyYWN5KG0sIGxvdywgaGlnaCkgKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfZXh0cmVtaXR5X2FjY3VyYWN5KG0sIGxvdywgaGlnaCkpOwogICB9CiAKLSAgUmVhbFNjYWxhciByYW5nZV9sZW5ndGggPSBudW1leHQ6OnJlYWwoaGlnaC1sb3cpOwotICBpZigoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpIHx8IChyYW5nZV9sZW5ndGg+PXNpemUgJiYgKEluZGV4KHJhbmdlX2xlbmd0aCklKHNpemUtMSkpPT0wKSB8fCAoSW5kZXgocmFuZ2VfbGVuZ3RoKzEpPHNpemUgJiYgKHNpemUlSW5kZXgocmFuZ2VfbGVuZ3RoKzEpKT09MCkpCi0gIHsKKyAgUmVhbFNjYWxhciByYW5nZV9sZW5ndGggPSBudW1leHQ6OnJlYWwoaGlnaCAtIGxvdyk7CisgIGlmICgoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpIHx8IChyYW5nZV9sZW5ndGggPj0gc2l6ZSAmJiAoSW5kZXgocmFuZ2VfbGVuZ3RoKSAlIChzaXplIC0gMSkpID09IDApIHx8CisgICAgICAoSW5kZXgocmFuZ2VfbGVuZ3RoICsgMSkgPCBzaXplICYmIChzaXplICUgSW5kZXgocmFuZ2VfbGVuZ3RoICsgMSkpID09IDApKSB7CiAgICAgVmVjdG9yVHlwZSBuKHNpemUpOwotICAgIGlmKCghTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcikgfHwgKHJhbmdlX2xlbmd0aD49c2l6ZSkpCi0gICAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQotICAgICAgICBuKGkpID0gc2l6ZT09MSA/IGxvdyA6IChsb3cgKyAoKGhpZ2gtbG93KSpTY2FsYXIoaSkpL1JlYWxTY2FsYXIoc2l6ZS0xKSk7CisgICAgaWYgKCghTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcikgfHwgKHJhbmdlX2xlbmd0aCA+PSBzaXplKSkKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSBuKGkpID0gc2l6ZSA9PSAxID8gbG93IDogKGxvdyArICgoaGlnaCAtIGxvdykgKiBTY2FsYXIoaSkpIC8gUmVhbFNjYWxhcihzaXplIC0gMSkpOwogICAgIGVsc2UKLSAgICAgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCi0gICAgICAgIG4oaSkgPSBzaXplPT0xID8gbG93IDogbG93ICsgU2NhbGFyKChkb3VibGUocmFuZ2VfbGVuZ3RoKzEpKmRvdWJsZShpKSkvZG91YmxlKHNpemUpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0sbik7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgbihpKSA9IHNpemUgPT0gMSA/IGxvdyA6IGxvdyArIFNjYWxhcigoZG91YmxlKHJhbmdlX2xlbmd0aCArIDEpICogZG91YmxlKGkpKSAvIGRvdWJsZShzaXplKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtLCBuKTsKIAogICAgIC8vIHJhbmRvbSBhY2Nlc3MgdmVyc2lvbgotICAgIG0gPSBWZWN0b3JUeXBlOjpMaW5TcGFjZWQoc2l6ZSxsb3csaGlnaCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtLG4pOwotICAgIFZFUklGWSggaW50ZXJuYWw6OmlzQXBwcm94KG0obS5zaXplKCktMSksaGlnaCkgKTsKLSAgICBWRVJJRlkoIHNpemU9PTEgfHwgaW50ZXJuYWw6OmlzQXBwcm94KG0oMCksbG93KSApOwotICAgIFZFUklGWV9JU19FUVVBTChtKG0uc2l6ZSgpLTEpICwgaGlnaCk7Ci0gICAgaWYoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpCi0gICAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2V4dHJlbWl0eV9hY2N1cmFjeShtLCBsb3csIGhpZ2gpICk7CisgICAgbSA9IFZlY3RvclR5cGU6OkxpblNwYWNlZChzaXplLCBsb3csIGhpZ2gpOworICAgIFZFUklGWV9JU19BUFBST1gobSwgbik7CisgICAgVkVSSUZZKGludGVybmFsOjppc0FwcHJveChtKG0uc2l6ZSgpIC0gMSksIGhpZ2gpKTsKKyAgICBWRVJJRlkoc2l6ZSA9PSAxIHx8IGludGVybmFsOjppc0FwcHJveChtKDApLCBsb3cpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobShtLnNpemUoKSAtIDEpLCBoaWdoKTsKKyAgICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpIENBTExfU1VCVEVTVChjaGVja19leHRyZW1pdHlfYWNjdXJhY3kobSwgbG93LCBoaWdoKSk7CiAgIH0KIAotICBWRVJJRlkoIG51bWV4dDo6cmVhbChtKG0uc2l6ZSgpLTEpKSA8PSBudW1leHQ6OnJlYWwoaGlnaCkgKTsKLSAgVkVSSUZZKCAobS5hcnJheSgpLnJlYWwoKSA8PSBudW1leHQ6OnJlYWwoaGlnaCkpLmFsbCgpICk7Ci0gIFZFUklGWSggKG0uYXJyYXkoKS5yZWFsKCkgPj0gbnVtZXh0OjpyZWFsKGxvdykpLmFsbCgpICk7CisgIFZFUklGWShudW1leHQ6OnJlYWwobShtLnNpemUoKSAtIDEpKSA8PSBudW1leHQ6OnJlYWwoaGlnaCkpOworICBWRVJJRlkoKG0uYXJyYXkoKS5yZWFsKCkgPD0gbnVtZXh0OjpyZWFsKGhpZ2gpKS5hbGwoKSk7CisgIFZFUklGWSgobS5hcnJheSgpLnJlYWwoKSA+PSBudW1leHQ6OnJlYWwobG93KSkuYWxsKCkpOwogCi0KLSAgVkVSSUZZKCBudW1leHQ6OnJlYWwobShtLnNpemUoKS0xKSkgPj0gbnVtZXh0OjpyZWFsKGxvdykgKTsKLSAgaWYoc2l6ZT49MSkKLSAgewotICAgIFZFUklGWSggaW50ZXJuYWw6OmlzQXBwcm94KG0oMCksbG93KSApOwotICAgIFZFUklGWV9JU19FUVVBTChtKDApICwgbG93KTsKKyAgVkVSSUZZKG51bWV4dDo6cmVhbChtKG0uc2l6ZSgpIC0gMSkpID49IG51bWV4dDo6cmVhbChsb3cpKTsKKyAgaWYgKHNpemUgPj0gMSkgeworICAgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3gobSgwKSwgbG93KSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG0oMCksIGxvdyk7CiAgIH0KIAogICAvLyBjaGVjayB3aGV0aGVyIGV2ZXJ5dGhpbmcgd29ya3Mgd2l0aCByb3cgYW5kIGNvbCBtYWpvciB2ZWN0b3JzCi0gIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiByb3dfdmVjdG9yKHNpemUpOwotICBNYXRyaXg8U2NhbGFyLDEsRHluYW1pYz4gY29sX3ZlY3RvcihzaXplKTsKLSAgcm93X3ZlY3Rvci5zZXRMaW5TcGFjZWQoc2l6ZSxsb3csaGlnaCk7Ci0gIGNvbF92ZWN0b3Iuc2V0TGluU3BhY2VkKHNpemUsbG93LGhpZ2gpOworICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiByb3dfdmVjdG9yKHNpemUpOworICBNYXRyaXg8U2NhbGFyLCAxLCBEeW5hbWljPiBjb2xfdmVjdG9yKHNpemUpOworICByb3dfdmVjdG9yLnNldExpblNwYWNlZChzaXplLCBsb3csIGhpZ2gpOworICBjb2xfdmVjdG9yLnNldExpblNwYWNlZChzaXplLCBsb3csIGhpZ2gpOwogICAvLyB3aGVuIHVzaW5nIHRoZSBleHRlbmRlZCBwcmVjaXNpb24gKGUuZy4sIEZQVSkgdGhlIHJlbGF0aXZlIGVycm9yIG1pZ2h0IGV4Y2VlZCAxIGJpdAogICAvLyB3aGVuIGNvbXB1dGluZyB0aGUgc3F1YXJlZCBzdW0gaW4gaXNBcHByb3gsIHRodXMgdGhlIDJ4IGZhY3Rvci4KLSAgVkVSSUZZKCByb3dfdmVjdG9yLmlzQXBwcm94KGNvbF92ZWN0b3IudHJhbnNwb3NlKCksIFJlYWxTY2FsYXIoMikqTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSkpOworICBWRVJJRlkocm93X3ZlY3Rvci5pc0FwcHJveChjb2xfdmVjdG9yLnRyYW5zcG9zZSgpLCBSZWFsU2NhbGFyKDIpICogTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKSkpOwogCi0gIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBzaXplX2NoYW5nZXIoc2l6ZSs1MCk7Ci0gIHNpemVfY2hhbmdlci5zZXRMaW5TcGFjZWQoc2l6ZSxsb3csaGlnaCk7Ci0gIFZFUklGWSggc2l6ZV9jaGFuZ2VyLnNpemUoKSA9PSBzaXplICk7CisgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IHNpemVfY2hhbmdlcihzaXplICsgNTApOworICBzaXplX2NoYW5nZXIuc2V0TGluU3BhY2VkKHNpemUsIGxvdywgaGlnaCk7CisgIFZFUklGWShzaXplX2NoYW5nZXIuc2l6ZSgpID09IHNpemUpOwogCi0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwxLDE+IFNjYWxhck1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCAxPiBTY2FsYXJNYXRyaXg7CiAgIFNjYWxhck1hdHJpeCBzY2FsYXI7Ci0gIHNjYWxhci5zZXRMaW5TcGFjZWQoMSxsb3csaGlnaCk7Ci0gIFZFUklGWV9JU19BUFBST1goIHNjYWxhciwgU2NhbGFyTWF0cml4OjpDb25zdGFudChoaWdoKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBTY2FsYXJNYXRyaXg6OkxpblNwYWNlZCgxLGxvdyxoaWdoKSwgU2NhbGFyTWF0cml4OjpDb25zdGFudChoaWdoKSApOworICBzY2FsYXIuc2V0TGluU3BhY2VkKDEsIGxvdywgaGlnaCk7CisgIFZFUklGWV9JU19BUFBST1goc2NhbGFyLCBTY2FsYXJNYXRyaXg6OkNvbnN0YW50KGhpZ2gpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChTY2FsYXJNYXRyaXg6OkxpblNwYWNlZCgxLCBsb3csIGhpZ2gpLCBTY2FsYXJNYXRyaXg6OkNvbnN0YW50KGhpZ2gpKTsKIAogICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA1MjYgKGxpbmVhciB2ZWN0b3JpemVkIHRyYW5zdmVyc2FsKQogICBpZiAoc2l6ZSA+IDEgJiYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKSkgewotICAgIG0udGFpbChzaXplLTEpLnNldExpblNwYWNlZChsb3csIGhpZ2gpOwotICAgIFZFUklGWV9JU19BUFBST1gobShzaXplLTEpLCBoaWdoKTsKKyAgICBtLnRhaWwoc2l6ZSAtIDEpLnNldExpblNwYWNlZChsb3csIGhpZ2gpOworICAgIFZFUklGWV9JU19BUFBST1gobShzaXplIC0gMSksIGhpZ2gpOwogICB9CiAKICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTM4MyAoTGluU3BhY2VkIHdpdGggZW1wdHkgc2l6ZS9yYW5nZSkKICAgewotICAgIEluZGV4IG4wID0gVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMgPyAwIDogVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU7CisgICAgSW5kZXggbjAgPSBWZWN0b3JUeXBlOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljID8gMCA6IFZlY3RvclR5cGU6OlNpemVBdENvbXBpbGVUaW1lOwogICAgIGxvdyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwotICAgIG0gPSBWZWN0b3JUeXBlOjpMaW5TcGFjZWQobjAsbG93LGxvdy1SZWFsU2NhbGFyKDEpKTsKLSAgICBWRVJJRlkobS5zaXplKCk9PW4wKTsKKyAgICBtID0gVmVjdG9yVHlwZTo6TGluU3BhY2VkKG4wLCBsb3csIGxvdyAtIFJlYWxTY2FsYXIoMSkpOworICAgIFZFUklGWShtLnNpemUoKSA9PSBuMCk7CiAKLSAgICBpZihWZWN0b3JUeXBlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYykKLSAgICB7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwoVmVjdG9yVHlwZTo6TGluU3BhY2VkKG4wLDAsU2NhbGFyKG4wLTEpKS5zdW0oKSxTY2FsYXIoMCkpOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKFZlY3RvclR5cGU6OkxpblNwYWNlZChuMCxsb3csbG93LVJlYWxTY2FsYXIoMSkpLnN1bSgpLFNjYWxhcigwKSk7CisgICAgaWYgKFZlY3RvclR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMpIHsKKyAgICAgIFZFUklGWV9JU19FUVVBTChWZWN0b3JUeXBlOjpMaW5TcGFjZWQobjAsIDAsIFNjYWxhcihuMCAtIDEpKS5zdW0oKSwgU2NhbGFyKDApKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChWZWN0b3JUeXBlOjpMaW5TcGFjZWQobjAsIGxvdywgbG93IC0gUmVhbFNjYWxhcigxKSkuc3VtKCksIFNjYWxhcigwKSk7CiAgICAgfQogCi0gICAgbS5zZXRMaW5TcGFjZWQobjAsMCxTY2FsYXIobjAtMSkpOwotICAgIFZFUklGWShtLnNpemUoKT09bjApOwotICAgIG0uc2V0TGluU3BhY2VkKG4wLGxvdyxsb3ctUmVhbFNjYWxhcigxKSk7Ci0gICAgVkVSSUZZKG0uc2l6ZSgpPT1uMCk7CisgICAgbS5zZXRMaW5TcGFjZWQobjAsIDAsIFNjYWxhcihuMCAtIDEpKTsKKyAgICBWRVJJRlkobS5zaXplKCkgPT0gbjApOworICAgIG0uc2V0TGluU3BhY2VkKG4wLCBsb3csIGxvdyAtIFJlYWxTY2FsYXIoMSkpOworICAgIFZFUklGWShtLnNpemUoKSA9PSBuMCk7CiAKICAgICAvLyBlbXB0eSByYW5nZSBvbmx5OgotICAgIFZFUklGWV9JU19BUFBST1goVmVjdG9yVHlwZTo6TGluU3BhY2VkKHNpemUsbG93LGxvdyksVmVjdG9yVHlwZTo6Q29uc3RhbnQoc2l6ZSxsb3cpKTsKLSAgICBtLnNldExpblNwYWNlZChzaXplLGxvdyxsb3cpOwotICAgIFZFUklGWV9JU19BUFBST1gobSxWZWN0b3JUeXBlOjpDb25zdGFudChzaXplLGxvdykpOworICAgIFZFUklGWV9JU19BUFBST1goVmVjdG9yVHlwZTo6TGluU3BhY2VkKHNpemUsIGxvdywgbG93KSwgVmVjdG9yVHlwZTo6Q29uc3RhbnQoc2l6ZSwgbG93KSk7CisgICAgbS5zZXRMaW5TcGFjZWQoc2l6ZSwgbG93LCBsb3cpOworICAgIFZFUklGWV9JU19BUFBST1gobSwgVmVjdG9yVHlwZTo6Q29uc3RhbnQoc2l6ZSwgbG93KSk7CiAKLSAgICBpZihOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKQotICAgIHsKLSAgICAgIFZFUklGWV9JU19BUFBST1goIFZlY3RvclR5cGU6OkxpblNwYWNlZChzaXplLGxvdyxsb3crU2NhbGFyKHNpemUtMSkpLCBWZWN0b3JUeXBlOjpMaW5TcGFjZWQoc2l6ZSxsb3crU2NhbGFyKHNpemUtMSksbG93KS5yZXZlcnNlKCkgKTsKKyAgICBpZiAoTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcikgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChWZWN0b3JUeXBlOjpMaW5TcGFjZWQoc2l6ZSwgbG93LCBsb3cgKyBTY2FsYXIoc2l6ZSAtIDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZTo6TGluU3BhY2VkKHNpemUsIGxvdyArIFNjYWxhcihzaXplIC0gMSksIGxvdykucmV2ZXJzZSgpKTsKIAotICAgICAgaWYoVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCi0gICAgICB7CisgICAgICBpZiAoVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykgewogICAgICAgICAvLyBDaGVjayBuZWdhdGl2ZSBtdWx0aXBsaWNhdG9yIHBhdGg6Ci0gICAgICAgIGZvcihJbmRleCBrPTE7IGs8NTsgKytrKQotICAgICAgICAgIFZFUklGWV9JU19BUFBST1goIFZlY3RvclR5cGU6OkxpblNwYWNlZChzaXplLGxvdyxsb3crU2NhbGFyKChzaXplLTEpKmspKSwgVmVjdG9yVHlwZTo6TGluU3BhY2VkKHNpemUsbG93K1NjYWxhcigoc2l6ZS0xKSprKSxsb3cpLnJldmVyc2UoKSApOworICAgICAgICBmb3IgKEluZGV4IGsgPSAxOyBrIDwgNTsgKytrKQorICAgICAgICAgIFZFUklGWV9JU19BUFBST1goVmVjdG9yVHlwZTo6TGluU3BhY2VkKHNpemUsIGxvdywgbG93ICsgU2NhbGFyKChzaXplIC0gMSkgKiBrKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlOjpMaW5TcGFjZWQoc2l6ZSwgbG93ICsgU2NhbGFyKChzaXplIC0gMSkgKiBrKSwgbG93KS5yZXZlcnNlKCkpOwogICAgICAgICAvLyBDaGVjayBuZWdhdGl2ZSBkaXZpc29yIHBhdGg6Ci0gICAgICAgIGZvcihJbmRleCBrPTE7IGs8NTsgKytrKQotICAgICAgICAgIFZFUklGWV9JU19BUFBST1goIFZlY3RvclR5cGU6OkxpblNwYWNlZChzaXplKmssbG93LGxvdytTY2FsYXIoc2l6ZS0xKSksIFZlY3RvclR5cGU6OkxpblNwYWNlZChzaXplKmssbG93K1NjYWxhcihzaXplLTEpLGxvdykucmV2ZXJzZSgpICk7CisgICAgICAgIGZvciAoSW5kZXggayA9IDE7IGsgPCA1OyArK2spCisgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChWZWN0b3JUeXBlOjpMaW5TcGFjZWQoc2l6ZSAqIGssIGxvdywgbG93ICsgU2NhbGFyKHNpemUgLSAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlOjpMaW5TcGFjZWQoc2l6ZSAqIGssIGxvdyArIFNjYWxhcihzaXplIC0gMSksIGxvdykucmV2ZXJzZSgpKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAogICAvLyB0ZXN0IHNldFVuaXQoKQotICBpZihtLnNpemUoKT4wKQotICB7Ci0gICAgZm9yKEluZGV4IGs9MDsgazwxMDsgKytrKQotICAgIHsKLSAgICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0uc2l6ZSgpLTEpOworICBpZiAobS5zaXplKCkgPiAwKSB7CisgICAgZm9yIChJbmRleCBrID0gMDsgayA8IDEwOyArK2spIHsKKyAgICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBtLnNpemUoKSAtIDEpOwogICAgICAgbS5zZXRVbml0KGkpOwotICAgICAgVkVSSUZZX0lTX0FQUFJPWCggbSwgVmVjdG9yVHlwZTo6VW5pdChtLnNpemUoKSwgaSkgKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobSwgVmVjdG9yVHlwZTo6VW5pdChtLnNpemUoKSwgaSkpOwogICAgIH0KLSAgICBpZihWZWN0b3JUeXBlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYykKLSAgICB7Ci0gICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwyKm0uc2l6ZSgpLTEpOwotICAgICAgbS5zZXRVbml0KDIqbS5zaXplKCksaSk7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKCBtLCBWZWN0b3JUeXBlOjpVbml0KG0uc2l6ZSgpLGkpICk7CisgICAgaWYgKFZlY3RvclR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMpIHsKKyAgICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCAyICogbS5zaXplKCkgLSAxKTsKKyAgICAgIG0uc2V0VW5pdCgyICogbS5zaXplKCksIGkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLCBWZWN0b3JUeXBlOjpVbml0KG0uc2l6ZSgpLCBpKSk7CiAgICAgfQogICB9Ci0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXZvaWQgdGVzdE1hdHJpeFR5cGUoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0TWF0cml4VHlwZShjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHVzaW5nIHN0ZDo6YWJzOwogICBjb25zdCBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIGNvbnN0IEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKQEAgLTIyMiw0MCArMjEyLDM3IEBACiAgIFNjYWxhciBzMTsKICAgZG8gewogICAgIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7Ci0gIH0gd2hpbGUoYWJzKHMxKTxSZWFsU2NhbGFyKDFlLTUpICYmICghTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlcikpOworICB9IHdoaWxlIChhYnMoczEpIDwgUmVhbFNjYWxhcigxZS01KSAmJiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIpKTsKIAogICBNYXRyaXhUeXBlIEE7CiAgIEEuc2V0SWRlbnRpdHkocm93cywgY29scyk7CiAgIFZFUklGWShlcXVhbHNJZGVudGl0eShBKSk7CiAgIFZFUklGWShlcXVhbHNJZGVudGl0eShNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCBjb2xzKSkpOwogCi0KLSAgQSA9IE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxzMSk7Ci0gIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7Ci0gIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7Ci0gIFZFUklGWV9JU19BUFBST1goIE1hdHJpeFR5cGU6OkNvbnN0YW50KHJvd3MsY29scyxzMSkoaSxqKSwgczEgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cyxjb2xzLHMxKS5jb2VmZihpLGopLCBzMSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBBKGksaiksIHMxICk7CisgIEEgPSBNYXRyaXhUeXBlOjpDb25zdGFudChyb3dzLCBjb2xzLCBzMSk7CisgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMSk7CisgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgczEpKGksIGopLCBzMSk7CisgIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6Q29uc3RhbnQocm93cywgY29scywgczEpLmNvZWZmKGksIGopLCBzMSk7CisgIFZFUklGWV9JU19BUFBST1goQShpLCBqKSwgczEpOwogfQogCi10ZW1wbGF0ZTxpbnQ+Ci12b2lkIGJ1Zzc5KCkKLXsKK3RlbXBsYXRlIDxpbnQ+Cit2b2lkIGJ1Zzc5KCkgewogICAvLyBBc3NpZ25tZW50IG9mIGEgUm93VmVjdG9yWGQgdG8gYSBNYXRyaXhYZCAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgIzc5KS4KLSAgVkVSSUZZKCAoTWF0cml4WGQoUm93VmVjdG9yWGQ6OkxpblNwYWNlZCgzLCAwLCAxKSkgLSBSb3dWZWN0b3IzZCgwLCAwLjUsIDEpKS5ub3JtKCkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmVwc2lsb24oKSApOworICBWRVJJRlkoKE1hdHJpeFhkKFJvd1ZlY3RvclhkOjpMaW5TcGFjZWQoMywgMCwgMSkpIC0gUm93VmVjdG9yM2QoMCwgMC41LCAxKSkubm9ybSgpIDwKKyAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKIH0KIAotdGVtcGxhdGU8aW50Pgotdm9pZCBidWcxNjMwKCkKLXsKK3RlbXBsYXRlIDxpbnQ+Cit2b2lkIGJ1ZzE2MzAoKSB7CiAgIEFycmF5NGQgeDQgPSBBcnJheTRkOjpMaW5TcGFjZWQoMC4wLCAxLjApOwogICBBcnJheTNkIHgzKEFycmF5NGQ6OkxpblNwYWNlZCgwLjAsIDEuMCkuaGVhZCgzKSk7CiAgIFZFUklGWV9JU19BUFBST1goeDQuaGVhZCgzKSwgeDMpOwogfQogCi10ZW1wbGF0ZTxpbnQ+Ci12b2lkIG51bGxhcnlfb3ZlcmZsb3coKQotewordGVtcGxhdGUgPGludD4KK3ZvaWQgbnVsbGFyeV9vdmVyZmxvdygpIHsKICAgLy8gQ2hlY2sgcG9zc2libGUgb3ZlcmZsb3cgaXNzdWUKICAgaW50IG4gPSA2MDAwMDsKICAgQXJyYXlYaSBhMShuKSwgYTIobiksIGFfcmVmKG4pOwpAQCAtMjY2LDc1ICsyNTMsNzMgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChhMiwgYV9yZWYpOwogfQogCi10ZW1wbGF0ZTxpbnQ+Ci12b2lkIG51bGxhcnlfaW50ZXJuYWxfbG9naWMoKQotewordGVtcGxhdGUgPGludD4KK3ZvaWQgbnVsbGFyeV9pbnRlcm5hbF9sb2dpYygpIHsKICAgLy8gY2hlY2sgc29tZSBpbnRlcm5hbCBsb2dpYwotICBWRVJJRlkoKCAgaW50ZXJuYWw6Omhhc19udWxsYXJ5X29wZXJhdG9yPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8ZG91YmxlPiA+Ojp2YWx1ZSApKTsKLSAgVkVSSUZZKCggIWludGVybmFsOjpoYXNfdW5hcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxkb3VibGU+ID46OnZhbHVlICkpOwotICBWRVJJRlkoKCAhaW50ZXJuYWw6Omhhc19iaW5hcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxkb3VibGU+ID46OnZhbHVlICkpOwotICBWRVJJRlkoKCAgaW50ZXJuYWw6OmZ1bmN0b3JfaGFzX2xpbmVhcl9hY2Nlc3M8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxkb3VibGU+ID46OnJldCApKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aGFzX251bGxhcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxkb3VibGU+ID46OnZhbHVlKSk7CisgIFZFUklGWSgoIWludGVybmFsOjpoYXNfdW5hcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxkb3VibGU+ID46OnZhbHVlKSk7CisgIFZFUklGWSgoIWludGVybmFsOjpoYXNfYmluYXJ5X29wZXJhdG9yPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8ZG91YmxlPiA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGludGVybmFsOjpmdW5jdG9yX2hhc19saW5lYXJfYWNjZXNzPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8ZG91YmxlPiA+OjpyZXQpKTsKIAotICBWRVJJRlkoKCAhaW50ZXJuYWw6Omhhc19udWxsYXJ5X29wZXJhdG9yPGludGVybmFsOjpzY2FsYXJfaWRlbnRpdHlfb3A8ZG91YmxlPiA+Ojp2YWx1ZSApKTsKLSAgVkVSSUZZKCggIWludGVybmFsOjpoYXNfdW5hcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxkb3VibGU+ID46OnZhbHVlICkpOwotICBWRVJJRlkoKCAgaW50ZXJuYWw6Omhhc19iaW5hcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxkb3VibGU+ID46OnZhbHVlICkpOwotICBWRVJJRlkoKCAhaW50ZXJuYWw6OmZ1bmN0b3JfaGFzX2xpbmVhcl9hY2Nlc3M8aW50ZXJuYWw6OnNjYWxhcl9pZGVudGl0eV9vcDxkb3VibGU+ID46OnJldCApKTsKKyAgVkVSSUZZKCghaW50ZXJuYWw6Omhhc19udWxsYXJ5X29wZXJhdG9yPGludGVybmFsOjpzY2FsYXJfaWRlbnRpdHlfb3A8ZG91YmxlPiA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCFpbnRlcm5hbDo6aGFzX3VuYXJ5X29wZXJhdG9yPGludGVybmFsOjpzY2FsYXJfaWRlbnRpdHlfb3A8ZG91YmxlPiA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGludGVybmFsOjpoYXNfYmluYXJ5X29wZXJhdG9yPGludGVybmFsOjpzY2FsYXJfaWRlbnRpdHlfb3A8ZG91YmxlPiA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCFpbnRlcm5hbDo6ZnVuY3Rvcl9oYXNfbGluZWFyX2FjY2VzczxpbnRlcm5hbDo6c2NhbGFyX2lkZW50aXR5X29wPGRvdWJsZT4gPjo6cmV0KSk7CiAKLSAgVkVSSUZZKCggIWludGVybmFsOjpoYXNfbnVsbGFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6bGluc3BhY2VkX29wPGZsb2F0PiA+Ojp2YWx1ZSApKTsKLSAgVkVSSUZZKCggIGludGVybmFsOjpoYXNfdW5hcnlfb3BlcmF0b3I8aW50ZXJuYWw6OmxpbnNwYWNlZF9vcDxmbG9hdD4gPjo6dmFsdWUgKSk7Ci0gIFZFUklGWSgoICFpbnRlcm5hbDo6aGFzX2JpbmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6bGluc3BhY2VkX29wPGZsb2F0PiA+Ojp2YWx1ZSApKTsKLSAgVkVSSUZZKCggIGludGVybmFsOjpmdW5jdG9yX2hhc19saW5lYXJfYWNjZXNzPGludGVybmFsOjpsaW5zcGFjZWRfb3A8ZmxvYXQ+ID46OnJldCApKTsKKyAgVkVSSUZZKCghaW50ZXJuYWw6Omhhc19udWxsYXJ5X29wZXJhdG9yPGludGVybmFsOjpsaW5zcGFjZWRfb3A8ZmxvYXQ+ID46OnZhbHVlKSk7CisgIFZFUklGWSgoaW50ZXJuYWw6Omhhc191bmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6bGluc3BhY2VkX29wPGZsb2F0PiA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKCFpbnRlcm5hbDo6aGFzX2JpbmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6bGluc3BhY2VkX29wPGZsb2F0PiA+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGludGVybmFsOjpmdW5jdG9yX2hhc19saW5lYXJfYWNjZXNzPGludGVybmFsOjpsaW5zcGFjZWRfb3A8ZmxvYXQ+ID46OnJldCkpOwogCiAgIC8vIFJlZ3Jlc3Npb24gdW5pdCB0ZXN0IGZvciBhIHdlaXJkIE1TVkMgYnVnLgogICAvLyBTZWFyY2ggIm51bGxhcnlfd3JhcHBlcl93b3JrYXJvdW5kX21zdmMiIGluIENvcmVFdmFsdWF0b3JzLmggZm9yIHRoZSBkZXRhaWxzLgogICAvLyBTZWUgYWxzbyB0cmFpdHM8UmVmPjo6bWF0Y2guCiAgIHsKLSAgICBNYXRyaXhYZiBBID0gTWF0cml4WGY6OlJhbmRvbSgzLDMpOwotICAgIFJlZjxjb25zdCBNYXRyaXhYZj4gUiA9IDIuMCpBOwotICAgIFZFUklGWV9JU19BUFBST1goUiwgQStBKTsKKyAgICBNYXRyaXhYZiBBID0gTWF0cml4WGY6OlJhbmRvbSgzLCAzKTsKKyAgICBSZWY8Y29uc3QgTWF0cml4WGY+IFIgPSAyLjAgKiBBOworICAgIFZFUklGWV9JU19BUFBST1goUiwgQSArIEEpOwogCi0gICAgUmVmPGNvbnN0IE1hdHJpeFhmPiBSMSA9IE1hdHJpeFhmOjpSYW5kb20oMywzKStBOworICAgIFJlZjxjb25zdCBNYXRyaXhYZj4gUjEgPSBNYXRyaXhYZjo6UmFuZG9tKDMsIDMpICsgQTsKIAogICAgIFZlY3RvclhpIFYgPSBWZWN0b3JYaTo6UmFuZG9tKDMpOwotICAgIFJlZjxjb25zdCBWZWN0b3JYaT4gUjIgPSBWZWN0b3JYaTo6TGluU3BhY2VkKDMsMSwzKStWOwotICAgIFZFUklGWV9JU19BUFBST1goUjIsIFYrVmVjdG9yM2koMSwyLDMpKTsKKyAgICBSZWY8Y29uc3QgVmVjdG9yWGk+IFIyID0gVmVjdG9yWGk6OkxpblNwYWNlZCgzLCAxLCAzKSArIFY7CisgICAgVkVSSUZZX0lTX0FQUFJPWChSMiwgViArIFZlY3RvcjNpKDEsIDIsIDMpKTsKIAotICAgIFZFUklGWSgoICBpbnRlcm5hbDo6aGFzX251bGxhcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxmbG9hdD4gPjo6dmFsdWUgKSk7Ci0gICAgVkVSSUZZKCggIWludGVybmFsOjpoYXNfdW5hcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxmbG9hdD4gPjo6dmFsdWUgKSk7Ci0gICAgVkVSSUZZKCggIWludGVybmFsOjpoYXNfYmluYXJ5X29wZXJhdG9yPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8ZmxvYXQ+ID46OnZhbHVlICkpOwotICAgIFZFUklGWSgoICBpbnRlcm5hbDo6ZnVuY3Rvcl9oYXNfbGluZWFyX2FjY2VzczxpbnRlcm5hbDo6c2NhbGFyX2NvbnN0YW50X29wPGZsb2F0PiA+OjpyZXQgKSk7CisgICAgVkVSSUZZKChpbnRlcm5hbDo6aGFzX251bGxhcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxmbG9hdD4gPjo6dmFsdWUpKTsKKyAgICBWRVJJRlkoKCFpbnRlcm5hbDo6aGFzX3VuYXJ5X29wZXJhdG9yPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8ZmxvYXQ+ID46OnZhbHVlKSk7CisgICAgVkVSSUZZKCghaW50ZXJuYWw6Omhhc19iaW5hcnlfb3BlcmF0b3I8aW50ZXJuYWw6OnNjYWxhcl9jb25zdGFudF9vcDxmbG9hdD4gPjo6dmFsdWUpKTsKKyAgICBWRVJJRlkoKGludGVybmFsOjpmdW5jdG9yX2hhc19saW5lYXJfYWNjZXNzPGludGVybmFsOjpzY2FsYXJfY29uc3RhbnRfb3A8ZmxvYXQ+ID46OnJldCkpOwogCi0gICAgVkVSSUZZKCggIWludGVybmFsOjpoYXNfbnVsbGFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6bGluc3BhY2VkX29wPGludD4gPjo6dmFsdWUgKSk7Ci0gICAgVkVSSUZZKCggIGludGVybmFsOjpoYXNfdW5hcnlfb3BlcmF0b3I8aW50ZXJuYWw6OmxpbnNwYWNlZF9vcDxpbnQ+ID46OnZhbHVlICkpOwotICAgIFZFUklGWSgoICFpbnRlcm5hbDo6aGFzX2JpbmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6bGluc3BhY2VkX29wPGludD4gPjo6dmFsdWUgKSk7Ci0gICAgVkVSSUZZKCggIGludGVybmFsOjpmdW5jdG9yX2hhc19saW5lYXJfYWNjZXNzPGludGVybmFsOjpsaW5zcGFjZWRfb3A8aW50PiA+OjpyZXQgKSk7CisgICAgVkVSSUZZKCghaW50ZXJuYWw6Omhhc19udWxsYXJ5X29wZXJhdG9yPGludGVybmFsOjpsaW5zcGFjZWRfb3A8aW50PiA+Ojp2YWx1ZSkpOworICAgIFZFUklGWSgoaW50ZXJuYWw6Omhhc191bmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6bGluc3BhY2VkX29wPGludD4gPjo6dmFsdWUpKTsKKyAgICBWRVJJRlkoKCFpbnRlcm5hbDo6aGFzX2JpbmFyeV9vcGVyYXRvcjxpbnRlcm5hbDo6bGluc3BhY2VkX29wPGludD4gPjo6dmFsdWUpKTsKKyAgICBWRVJJRlkoKGludGVybmFsOjpmdW5jdG9yX2hhc19saW5lYXJfYWNjZXNzPGludGVybmFsOjpsaW5zcGFjZWRfb3A8aW50PiA+OjpyZXQpKTsKICAgfQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QobnVsbGFyeSkKLXsKLSAgQ0FMTF9TVUJURVNUXzEoIHRlc3RNYXRyaXhUeXBlKE1hdHJpeDJkKCkpICk7Ci0gIENBTExfU1VCVEVTVF8yKCB0ZXN0TWF0cml4VHlwZShNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwzMDApKSkgKTsKLSAgQ0FMTF9TVUJURVNUXzMoIHRlc3RNYXRyaXhUeXBlKE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLDMwMCksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwKSkpICk7Ci0gIAotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQqMTA7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8zKCB0ZXN0VmVjdG9yVHlwZShWZWN0b3JYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwMDApKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggdGVzdFZlY3RvclR5cGUoVmVjdG9yWGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwMDApKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggdGVzdFZlY3RvclR5cGUoVmVjdG9yNGQoKSkgKTsgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDIzMgotICAgIENBTExfU1VCVEVTVF82KCB0ZXN0VmVjdG9yVHlwZShWZWN0b3IzZCgpKSApOwotICAgIENBTExfU1VCVEVTVF83KCB0ZXN0VmVjdG9yVHlwZShWZWN0b3JYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwzMDAwMCkpKSApOwotICAgIENBTExfU1VCVEVTVF84KCB0ZXN0VmVjdG9yVHlwZShWZWN0b3IzZigpKSApOwotICAgIENBTExfU1VCVEVTVF84KCB0ZXN0VmVjdG9yVHlwZShWZWN0b3I0ZigpKSApOwotICAgIENBTExfU1VCVEVTVF84KCB0ZXN0VmVjdG9yVHlwZShNYXRyaXg8ZmxvYXQsOCwxPigpKSApOwotICAgIENBTExfU1VCVEVTVF84KCB0ZXN0VmVjdG9yVHlwZShNYXRyaXg8ZmxvYXQsMSwxPigpKSApOworRUlHRU5fREVDTEFSRV9URVNUKG51bGxhcnkpIHsKKyAgQ0FMTF9TVUJURVNUXzEodGVzdE1hdHJpeFR5cGUoTWF0cml4MmQoKSkpOworICBDQUxMX1NVQlRFU1RfMih0ZXN0TWF0cml4VHlwZShNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDMwMCksIGludGVybmFsOjpyYW5kb208aW50PigxLCAzMDApKSkpOworICBDQUxMX1NVQlRFU1RfMyh0ZXN0TWF0cml4VHlwZShNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMzAwKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDMwMCkpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfOSggdGVzdFZlY3RvclR5cGUoVmVjdG9yWGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTApKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOSggdGVzdFZlY3RvclR5cGUoVmVjdG9yWGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDksMzAwKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzkoIHRlc3RWZWN0b3JUeXBlKE1hdHJpeDxpbnQsMSwxPigpKSApOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0ICogMTA7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8zKHRlc3RWZWN0b3JUeXBlKFZlY3RvclhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMzAwMDApKSkpOworICAgIENBTExfU1VCVEVTVF80KHRlc3RWZWN0b3JUeXBlKFZlY3RvclhkKGludGVybmFsOjpyYW5kb208aW50PigxLCAzMDAwMCkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUodGVzdFZlY3RvclR5cGUoVmVjdG9yNGQoKSkpOyAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjMyCisgICAgQ0FMTF9TVUJURVNUXzYodGVzdFZlY3RvclR5cGUoVmVjdG9yM2QoKSkpOworICAgIENBTExfU1VCVEVTVF83KHRlc3RWZWN0b3JUeXBlKFZlY3RvclhmKGludGVybmFsOjpyYW5kb208aW50PigxLCAzMDAwMCkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgodGVzdFZlY3RvclR5cGUoVmVjdG9yM2YoKSkpOworICAgIENBTExfU1VCVEVTVF84KHRlc3RWZWN0b3JUeXBlKFZlY3RvcjRmKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfOCh0ZXN0VmVjdG9yVHlwZShNYXRyaXg8ZmxvYXQsIDgsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfOCh0ZXN0VmVjdG9yVHlwZShNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKworICAgIENBTExfU1VCVEVTVF85KHRlc3RWZWN0b3JUeXBlKFZlY3RvclhpKGludGVybmFsOjpyYW5kb208aW50PigxLCAxMCkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzkodGVzdFZlY3RvclR5cGUoVmVjdG9yWGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDksIDMwMCkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzkodGVzdFZlY3RvclR5cGUoTWF0cml4PGludCwgMSwgMT4oKSkpOwogICB9CiAKLSAgQ0FMTF9TVUJURVNUXzYoIGJ1Zzc5PDA+KCkgKTsKLSAgQ0FMTF9TVUJURVNUXzYoIGJ1ZzE2MzA8MD4oKSApOwotICBDQUxMX1NVQlRFU1RfOSggbnVsbGFyeV9vdmVyZmxvdzwwPigpICk7Ci0gIENBTExfU1VCVEVTVF8xMCggbnVsbGFyeV9pbnRlcm5hbF9sb2dpYzwwPigpICk7CisgIENBTExfU1VCVEVTVF82KGJ1Zzc5PDA+KCkpOworICBDQUxMX1NVQlRFU1RfNihidWcxNjMwPDA+KCkpOworICBDQUxMX1NVQlRFU1RfOShudWxsYXJ5X292ZXJmbG93PDA+KCkpOworICBDQUxMX1NVQlRFU1RfMTAobnVsbGFyeV9pbnRlcm5hbF9sb2dpYzwwPigpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvbnVtX2RpbWVuc2lvbnMuY3BwIGIvdGVzdC9udW1fZGltZW5zaW9ucy5jcHAKaW5kZXggNTI4YzhmNi4uZGFjZDhhYyAxMDA2NDQKLS0tIGEvdGVzdC9udW1fZGltZW5zaW9ucy5jcHAKKysrIGIvdGVzdC9udW1fZGltZW5zaW9ucy5jcHAKQEAgLTEwLDE0ICsxMCwxMyBAQAogI2luY2x1ZGUgIm1haW4uaCIKICNpbmNsdWRlIDxFaWdlbi9TcGFyc2VDb3JlPgogCi10ZW1wbGF0ZTxpbnQgRXhwZWN0ZWREaW0sdHlwZW5hbWUgWHByPgotdm9pZCBjaGVja19kaW0oY29uc3QgWHByJiApIHsKLSAgU1RBVElDX0NIRUNLKCBYcHI6Ok51bURpbWVuc2lvbnMgPT0gRXhwZWN0ZWREaW0gKTsKK3RlbXBsYXRlIDxpbnQgRXhwZWN0ZWREaW0sIHR5cGVuYW1lIFhwcj4KK3ZvaWQgY2hlY2tfZGltKGNvbnN0IFhwciYpIHsKKyAgU1RBVElDX0NIRUNLKFhwcjo6TnVtRGltZW5zaW9ucyA9PSBFeHBlY3RlZERpbSk7CiB9CiAKLXRlbXBsYXRlPHRlbXBsYXRlIDx0eXBlbmFtZSxpbnQsaW50PiBjbGFzcyBPYmplY3Q+Ci12b2lkIG1hcF9udW1fZGltZW5zaW9ucygpCi17Cit0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lLCBpbnQsIGludD4gY2xhc3MgT2JqZWN0Pgordm9pZCBtYXBfbnVtX2RpbWVuc2lvbnMoKSB7CiAgIHR5cGVkZWYgT2JqZWN0PGRvdWJsZSwgMSwgMT4gQXJyYXlTY2FsYXJUeXBlOwogICB0eXBlZGVmIE9iamVjdDxkb3VibGUsIDIsIDE+IEFycmF5VmVjdG9yVHlwZTsKICAgdHlwZWRlZiBPYmplY3Q8ZG91YmxlLCAxLCAyPiBUcmFuc3Bvc2VBcnJheVZlY3RvclR5cGU7CkBAIC01MSwzNCArNTAsMzMgQEAKICAgU1RBVElDX0NIRUNLKER5bmFtaWNBcnJheU1hcDo6TnVtRGltZW5zaW9ucyA9PSAyKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgUm93cywgaW50IENvbHM+Ci11c2luZyBUQXJyYXkgPSBBcnJheTxTY2FsYXIsUm93cyxDb2xzPjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBSb3dzLCBpbnQgQ29scz4KK3VzaW5nIFRBcnJheSA9IEFycmF5PFNjYWxhciwgUm93cywgQ29scz47CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IFJvd3MsIGludCBDb2xzPgotdXNpbmcgVE1hdHJpeCA9IE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzPjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBSb3dzLCBpbnQgQ29scz4KK3VzaW5nIFRNYXRyaXggPSBNYXRyaXg8U2NhbGFyLCBSb3dzLCBDb2xzPjsKIAotRUlHRU5fREVDTEFSRV9URVNUKG51bV9kaW1lbnNpb25zKQoteworRUlHRU5fREVDTEFSRV9URVNUKG51bV9kaW1lbnNpb25zKSB7CiAgIGludCBuID0gMTA7Ci0gIEFycmF5WFhkIEEobixuKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19kaW08Mj4oQSkgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19kaW08Mj4oQS5ibG9jaygxLDEsMiwyKSkgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19kaW08MT4oQS5jb2woMSkpICk7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfZGltPDE+KEEucm93KDEpKSApOworICBBcnJheVhYZCBBKG4sIG4pOworICBDQUxMX1NVQlRFU1QoY2hlY2tfZGltPDI+KEEpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2RpbTwyPihBLmJsb2NrKDEsIDEsIDIsIDIpKSk7CisgIENBTExfU1VCVEVTVChjaGVja19kaW08MT4oQS5jb2woMSkpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2RpbTwxPihBLnJvdygxKSkpOwogCi0gIE1hdHJpeFhkIE0obixuKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19kaW08MD4oTS5yb3coMSkqTS5jb2woMSkpICk7CisgIE1hdHJpeFhkIE0obiwgbik7CisgIENBTExfU1VCVEVTVChjaGVja19kaW08MD4oTS5yb3coMSkgKiBNLmNvbCgxKSkpOwogCi0gIFNwYXJzZU1hdHJpeDxkb3VibGU+IFMobixuKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19kaW08Mj4oUykgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19kaW08Mj4oUy5ibG9jaygxLDEsMiwyKSkgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19kaW08MT4oUy5jb2woMSkpICk7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfZGltPDE+KFMucm93KDEpKSApOworICBTcGFyc2VNYXRyaXg8ZG91YmxlPiBTKG4sIG4pOworICBDQUxMX1NVQlRFU1QoY2hlY2tfZGltPDI+KFMpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2RpbTwyPihTLmJsb2NrKDEsIDEsIDIsIDIpKSk7CisgIENBTExfU1VCVEVTVChjaGVja19kaW08MT4oUy5jb2woMSkpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2RpbTwxPihTLnJvdygxKSkpOwogCiAgIFNwYXJzZVZlY3Rvcjxkb3VibGU+IHMobik7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfZGltPDE+KHMpICk7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfZGltPDE+KHMuaGVhZCgyKSkgKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2RpbTwxPihzKSk7CisgIENBTExfU1VCVEVTVChjaGVja19kaW08MT4ocy5oZWFkKDIpKSk7CiAKLSAgQ0FMTF9TVUJURVNUKCBtYXBfbnVtX2RpbWVuc2lvbnM8VEFycmF5PigpICk7Ci0gIENBTExfU1VCVEVTVCggbWFwX251bV9kaW1lbnNpb25zPFRNYXRyaXg+KCkgKTsKKyAgQ0FMTF9TVUJURVNUKG1hcF9udW1fZGltZW5zaW9uczxUQXJyYXk+KCkpOworICBDQUxMX1NVQlRFU1QobWFwX251bV9kaW1lbnNpb25zPFRNYXRyaXg+KCkpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9udW1leHQuY3BwIGIvdGVzdC9udW1leHQuY3BwCmluZGV4IGNjYTA0MTEuLmFjOWI2NmQgMTAwNjQ0Ci0tLSBhL3Rlc3QvbnVtZXh0LmNwcAorKysgYi90ZXN0L251bWV4dC5jcHAKQEAgLTksNzkgKzksNzEgQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgogYm9vbCBjaGVja19pZl9lcXVhbF9vcl9uYW5zKGNvbnN0IFQmIGFjdHVhbCwgY29uc3QgVSYgZXhwZWN0ZWQpIHsKICAgcmV0dXJuIChudW1leHQ6OmVxdWFsX3N0cmljdChhY3R1YWwsIGV4cGVjdGVkKSB8fCAoKG51bWV4dDo6aXNuYW4pKGFjdHVhbCkgJiYgKG51bWV4dDo6aXNuYW4pKGV4cGVjdGVkKSkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CiBib29sIGNoZWNrX2lmX2VxdWFsX29yX25hbnMoY29uc3Qgc3RkOjpjb21wbGV4PFQ+JiBhY3R1YWwsIGNvbnN0IHN0ZDo6Y29tcGxleDxVPiYgZXhwZWN0ZWQpIHsKLSAgcmV0dXJuIGNoZWNrX2lmX2VxdWFsX29yX25hbnMobnVtZXh0OjpyZWFsKGFjdHVhbCksIG51bWV4dDo6cmVhbChleHBlY3RlZCkpCi0gICAgICAgICAmJiBjaGVja19pZl9lcXVhbF9vcl9uYW5zKG51bWV4dDo6aW1hZyhhY3R1YWwpLCBudW1leHQ6OmltYWcoZXhwZWN0ZWQpKTsKKyAgcmV0dXJuIGNoZWNrX2lmX2VxdWFsX29yX25hbnMobnVtZXh0OjpyZWFsKGFjdHVhbCksIG51bWV4dDo6cmVhbChleHBlY3RlZCkpICYmCisgICAgICAgICBjaGVja19pZl9lcXVhbF9vcl9uYW5zKG51bWV4dDo6aW1hZyhhY3R1YWwpLCBudW1leHQ6OmltYWcoZXhwZWN0ZWQpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLWJvb2wgdGVzdF9pc19lcXVhbF9vcl9uYW5zKGNvbnN0IFQmIGFjdHVhbCwgY29uc3QgVSYgZXhwZWN0ZWQpCi17Ci0gICAgaWYgKGNoZWNrX2lmX2VxdWFsX29yX25hbnMoYWN0dWFsLCBleHBlY3RlZCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorYm9vbCB0ZXN0X2lzX2VxdWFsX29yX25hbnMoY29uc3QgVCYgYWN0dWFsLCBjb25zdCBVJiBleHBlY3RlZCkgeworICBpZiAoY2hlY2tfaWZfZXF1YWxfb3JfbmFucyhhY3R1YWwsIGV4cGVjdGVkKSkgeworICAgIHJldHVybiB0cnVlOworICB9CiAKLSAgICAvLyBmYWxzZToKLSAgICBzdGQ6OmNlcnIKLSAgICAgICAgPDwgIlxuICAgIGFjdHVhbCAgID0gIiA8PCBhY3R1YWwKLSAgICAgICAgPDwgIlxuICAgIGV4cGVjdGVkID0gIiA8PCBleHBlY3RlZCA8PCAiXG5cbiI7Ci0gICAgcmV0dXJuIGZhbHNlOworICAvLyBmYWxzZToKKyAgc3RkOjpjZXJyIDw8ICJcbiAgICBhY3R1YWwgICA9ICIgPDwgYWN0dWFsIDw8ICJcbiAgICBleHBlY3RlZCA9ICIgPDwgZXhwZWN0ZWQgPDwgIlxuXG4iOworICByZXR1cm4gZmFsc2U7CiB9CiAKICNkZWZpbmUgVkVSSUZZX0lTX0VRVUFMX09SX05BTlMoYSwgYikgVkVSSUZZKHRlc3RfaXNfZXF1YWxfb3JfbmFucyhhLCBiKSkKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogdm9pZCBjaGVja19hYnMoKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFQ+OjpSZWFsIFJlYWw7CiAgIFJlYWwgemVybygwKTsKIAotICBpZihOdW1UcmFpdHM8VD46OklzU2lnbmVkKQotICAgIFZFUklGWV9JU19FUVVBTChudW1leHQ6OmFicygtVCgxKSksIFQoMSkpOworICBpZiAoTnVtVHJhaXRzPFQ+OjpJc1NpZ25lZCkgVkVSSUZZX0lTX0VRVUFMKG51bWV4dDo6YWJzKC1UKDEpKSwgVCgxKSk7CiAgIFZFUklGWV9JU19FUVVBTChudW1leHQ6OmFicyhUKDApKSwgVCgwKSk7CiAgIFZFUklGWV9JU19FUVVBTChudW1leHQ6OmFicyhUKDEpKSwgVCgxKSk7CiAKLSAgZm9yKGludCBrPTA7IGs8MTAwOyArK2spCi0gIHsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCAxMDA7ICsraykgewogICAgIFQgeCA9IGludGVybmFsOjpyYW5kb208VD4oKTsKLSAgICBpZighaW50ZXJuYWw6OmlzX3NhbWU8VCxib29sPjo6dmFsdWUpCi0gICAgICB4ID0geC9SZWFsKDIpOwotICAgIGlmKE51bVRyYWl0czxUPjo6SXNTaWduZWQpCi0gICAgeworICAgIGlmICghaW50ZXJuYWw6OmlzX3NhbWU8VCwgYm9vbD46OnZhbHVlKSB4ID0geCAvIFJlYWwoMik7CisgICAgaWYgKE51bVRyYWl0czxUPjo6SXNTaWduZWQpIHsKICAgICAgIFZFUklGWV9JU19FUVVBTChudW1leHQ6OmFicyh4KSwgbnVtZXh0OjphYnMoLXgpKTsKLSAgICAgIFZFUklGWSggbnVtZXh0OjphYnMoLXgpID49IHplcm8gKTsKKyAgICAgIFZFUklGWShudW1leHQ6OmFicygteCkgPj0gemVybyk7CiAgICAgfQotICAgIFZFUklGWSggbnVtZXh0OjphYnMoeCkgPj0gemVybyApOwotICAgIFZFUklGWV9JU19BUFBST1goIG51bWV4dDo6YWJzMih4KSwgbnVtZXh0OjphYnMyKG51bWV4dDo6YWJzKHgpKSApOworICAgIFZFUklGWShudW1leHQ6OmFicyh4KSA+PSB6ZXJvKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6YWJzMih4KSwgbnVtZXh0OjphYnMyKG51bWV4dDo6YWJzKHgpKSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogdm9pZCBjaGVja19hcmcoKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFQ+OjpSZWFsIFJlYWw7CiAgIFZFUklGWV9JU19FUVVBTChudW1leHQ6OmFicyhUKDApKSwgVCgwKSk7CiAgIFZFUklGWV9JU19FUVVBTChudW1leHQ6OmFicyhUKDEpKSwgVCgxKSk7CiAKLSAgZm9yKGludCBrPTA7IGs8MTAwOyArK2spCi0gIHsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCAxMDA7ICsraykgewogICAgIFQgeCA9IGludGVybmFsOjpyYW5kb208VD4oKTsKICAgICBSZWFsIHkgPSBudW1leHQ6OmFyZyh4KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCB5LCBzdGQ6OmFyZyh4KSApOworICAgIFZFUklGWV9JU19BUFBST1goeSwgc3RkOjphcmcoeCkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCBjaGVja19zcXJ0X2ltcGwgewogICBzdGF0aWMgdm9pZCBydW4oKSB7Ci0gICAgZm9yIChpbnQgaT0wOyBpPDEwMDA7ICsraSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CiAgICAgICBjb25zdCBUIHggPSBudW1leHQ6OmFicyhpbnRlcm5hbDo6cmFuZG9tPFQ+KCkpOwogICAgICAgY29uc3QgVCBzcXJ0eCA9IG51bWV4dDo6c3FydCh4KTsKLSAgICAgIFZFUklGWV9JU19BUFBST1goc3FydHgqc3FydHgsIHgpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChzcXJ0eCAqIHNxcnR4LCB4KTsKICAgICB9CiAKICAgICAvLyBDb3JuZXIgY2FzZXMuCkBAIC05NiwxNSArODgsMTUgQEAKICAgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBjaGVja19zcXJ0X2ltcGw8c3RkOjpjb21wbGV4PFQ+ICA+IHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGNoZWNrX3NxcnRfaW1wbDxzdGQ6OmNvbXBsZXg8VD4gPiB7CiAgIHN0YXRpYyB2b2lkIHJ1bigpIHsKICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29tcGxleDxUPiBDb21wbGV4VDsKIAotICAgIGZvciAoaW50IGk9MDsgaTwxMDAwOyArK2kpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkgewogICAgICAgY29uc3QgQ29tcGxleFQgeCA9IGludGVybmFsOjpyYW5kb208Q29tcGxleFQ+KCk7CiAgICAgICBjb25zdCBDb21wbGV4VCBzcXJ0eCA9IG51bWV4dDo6c3FydCh4KTsKLSAgICAgIFZFUklGWV9JU19BUFBST1goc3FydHgqc3FydHgsIHgpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChzcXJ0eCAqIHNxcnR4LCB4KTsKICAgICB9CiAKICAgICAvLyBDb3JuZXIgY2FzZXMuCkBAIC0xMTYsMjkgKzEwOCwxOSBAQAogICAgIC8vIFNldCBvZiBjb3JuZXIgY2FzZXMgZnJvbSBodHRwczovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbnVtZXJpYy9jb21wbGV4L3NxcnQKICAgICBjb25zdCBpbnQga051bUNvcm5lcnMgPSAyMDsKICAgICBjb25zdCBDb21wbGV4VCBjb3JuZXJzW2tOdW1Db3JuZXJzXVsyXSA9IHsKLSAgICAgIHtDb21wbGV4VCh6ZXJvLCB6ZXJvKSwgQ29tcGxleFQoemVybywgemVybyl9LAotICAgICAge0NvbXBsZXhUKC16ZXJvLCB6ZXJvKSwgQ29tcGxleFQoemVybywgemVybyl9LAotICAgICAge0NvbXBsZXhUKHplcm8sIC16ZXJvKSwgQ29tcGxleFQoemVybywgemVybyl9LAotICAgICAge0NvbXBsZXhUKC16ZXJvLCAtemVybyksIENvbXBsZXhUKHplcm8sIHplcm8pfSwKLSAgICAgIHtDb21wbGV4VChvbmUsIGluZiksIENvbXBsZXhUKGluZiwgaW5mKX0sCi0gICAgICB7Q29tcGxleFQobmFuLCBpbmYpLCBDb21wbGV4VChpbmYsIGluZil9LAotICAgICAge0NvbXBsZXhUKG9uZSwgLWluZiksIENvbXBsZXhUKGluZiwgLWluZil9LAotICAgICAge0NvbXBsZXhUKG5hbiwgLWluZiksIENvbXBsZXhUKGluZiwgLWluZil9LAotICAgICAge0NvbXBsZXhUKC1pbmYsIG9uZSksIENvbXBsZXhUKHplcm8sIGluZil9LAotICAgICAge0NvbXBsZXhUKGluZiwgb25lKSwgQ29tcGxleFQoaW5mLCB6ZXJvKX0sCi0gICAgICB7Q29tcGxleFQoLWluZiwgLW9uZSksIENvbXBsZXhUKHplcm8sIC1pbmYpfSwKLSAgICAgIHtDb21wbGV4VChpbmYsIC1vbmUpLCBDb21wbGV4VChpbmYsIC16ZXJvKX0sCi0gICAgICB7Q29tcGxleFQoLWluZiwgbmFuKSwgQ29tcGxleFQobmFuLCBpbmYpfSwKLSAgICAgIHtDb21wbGV4VChpbmYsIG5hbiksIENvbXBsZXhUKGluZiwgbmFuKX0sCi0gICAgICB7Q29tcGxleFQoemVybywgbmFuKSwgQ29tcGxleFQobmFuLCBuYW4pfSwKLSAgICAgIHtDb21wbGV4VChvbmUsIG5hbiksIENvbXBsZXhUKG5hbiwgbmFuKX0sCi0gICAgICB7Q29tcGxleFQobmFuLCB6ZXJvKSwgQ29tcGxleFQobmFuLCBuYW4pfSwKLSAgICAgIHtDb21wbGV4VChuYW4sIG9uZSksIENvbXBsZXhUKG5hbiwgbmFuKX0sCi0gICAgICB7Q29tcGxleFQobmFuLCAtb25lKSwgQ29tcGxleFQobmFuLCBuYW4pfSwKLSAgICAgIHtDb21wbGV4VChuYW4sIG5hbiksIENvbXBsZXhUKG5hbiwgbmFuKX0sCisgICAgICAgIHtDb21wbGV4VCh6ZXJvLCB6ZXJvKSwgQ29tcGxleFQoemVybywgemVybyl9LCAge0NvbXBsZXhUKC16ZXJvLCB6ZXJvKSwgQ29tcGxleFQoemVybywgemVybyl9LAorICAgICAgICB7Q29tcGxleFQoemVybywgLXplcm8pLCBDb21wbGV4VCh6ZXJvLCB6ZXJvKX0sIHtDb21wbGV4VCgtemVybywgLXplcm8pLCBDb21wbGV4VCh6ZXJvLCB6ZXJvKX0sCisgICAgICAgIHtDb21wbGV4VChvbmUsIGluZiksIENvbXBsZXhUKGluZiwgaW5mKX0sICAgICAge0NvbXBsZXhUKG5hbiwgaW5mKSwgQ29tcGxleFQoaW5mLCBpbmYpfSwKKyAgICAgICAge0NvbXBsZXhUKG9uZSwgLWluZiksIENvbXBsZXhUKGluZiwgLWluZil9LCAgICB7Q29tcGxleFQobmFuLCAtaW5mKSwgQ29tcGxleFQoaW5mLCAtaW5mKX0sCisgICAgICAgIHtDb21wbGV4VCgtaW5mLCBvbmUpLCBDb21wbGV4VCh6ZXJvLCBpbmYpfSwgICAge0NvbXBsZXhUKGluZiwgb25lKSwgQ29tcGxleFQoaW5mLCB6ZXJvKX0sCisgICAgICAgIHtDb21wbGV4VCgtaW5mLCAtb25lKSwgQ29tcGxleFQoemVybywgLWluZil9LCAge0NvbXBsZXhUKGluZiwgLW9uZSksIENvbXBsZXhUKGluZiwgLXplcm8pfSwKKyAgICAgICAge0NvbXBsZXhUKC1pbmYsIG5hbiksIENvbXBsZXhUKG5hbiwgaW5mKX0sICAgICB7Q29tcGxleFQoaW5mLCBuYW4pLCBDb21wbGV4VChpbmYsIG5hbil9LAorICAgICAgICB7Q29tcGxleFQoemVybywgbmFuKSwgQ29tcGxleFQobmFuLCBuYW4pfSwgICAgIHtDb21wbGV4VChvbmUsIG5hbiksIENvbXBsZXhUKG5hbiwgbmFuKX0sCisgICAgICAgIHtDb21wbGV4VChuYW4sIHplcm8pLCBDb21wbGV4VChuYW4sIG5hbil9LCAgICAge0NvbXBsZXhUKG5hbiwgb25lKSwgQ29tcGxleFQobmFuLCBuYW4pfSwKKyAgICAgICAge0NvbXBsZXhUKG5hbiwgLW9uZSksIENvbXBsZXhUKG5hbiwgbmFuKX0sICAgICB7Q29tcGxleFQobmFuLCBuYW4pLCBDb21wbGV4VChuYW4sIG5hbil9LAogICAgIH07CiAKLSAgICBmb3IgKGludCBpPTA7IGk8a051bUNvcm5lcnM7ICsraSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUNvcm5lcnM7ICsraSkgewogICAgICAgY29uc3QgQ29tcGxleFQmIHggPSBjb3JuZXJzW2ldWzBdOwogICAgICAgY29uc3QgQ29tcGxleFQgc3FydHggPSBjb3JuZXJzW2ldWzFdOwogICAgICAgVkVSSUZZX0lTX0VRVUFMX09SX05BTlMobnVtZXh0OjpzcXJ0KHgpLCBzcXJ0eCk7CkBAIC0xNDYsMTIgKzEyOCwxMiBAQAogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiB2b2lkIGNoZWNrX3NxcnQoKSB7CiAgIGNoZWNrX3NxcnRfaW1wbDxUPjo6cnVuKCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCBjaGVja19yc3FydF9pbXBsIHsKICAgc3RhdGljIHZvaWQgcnVuKCkgewogICAgIGNvbnN0IFQgemVybyA9IFQoMCk7CkBAIC0xNTksMTEgKzE0MSwxMSBAQAogICAgIGNvbnN0IFQgaW5mID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aW5maW5pdHkoKTsKICAgICBjb25zdCBUIG5hbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OnF1aWV0X05hTigpOwogCi0gICAgZm9yIChpbnQgaT0wOyBpPDEwMDA7ICsraSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CiAgICAgICBjb25zdCBUIHggPSBudW1leHQ6OmFicyhpbnRlcm5hbDo6cmFuZG9tPFQ+KCkpOwogICAgICAgY29uc3QgVCByc3FydHggPSBudW1leHQ6OnJzcXJ0KHgpOwogICAgICAgY29uc3QgVCBpbnZ4ID0gb25lIC8geDsKLSAgICAgIFZFUklGWV9JU19BUFBST1gocnNxcnR4KnJzcXJ0eCwgaW52eCk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHJzcXJ0eCAqIHJzcXJ0eCwgaW52eCk7CiAgICAgfQogCiAgICAgLy8gQ29ybmVyIGNhc2VzLgpAQCAtMTc0LDcgKzE1Niw3IEBACiAgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCBjaGVja19yc3FydF9pbXBsPHN0ZDo6Y29tcGxleDxUPiA+IHsKICAgc3RhdGljIHZvaWQgcnVuKCkgewogICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb21wbGV4PFQ+IENvbXBsZXhUOwpAQCAtMTgzLDYzICsxNjUsNjIgQEAKICAgICBjb25zdCBUIGluZiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmluZmluaXR5KCk7CiAgICAgY29uc3QgVCBuYW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpxdWlldF9OYU4oKTsKIAotICAgIGZvciAoaW50IGk9MDsgaTwxMDAwOyArK2kpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkgewogICAgICAgY29uc3QgQ29tcGxleFQgeCA9IGludGVybmFsOjpyYW5kb208Q29tcGxleFQ+KCk7CiAgICAgICBjb25zdCBDb21wbGV4VCBpbnZ4ID0gQ29tcGxleFQob25lLCB6ZXJvKSAvIHg7CiAgICAgICBjb25zdCBDb21wbGV4VCByc3FydHggPSBudW1leHQ6OnJzcXJ0KHgpOwotICAgICAgVkVSSUZZX0lTX0FQUFJPWChyc3FydHgqcnNxcnR4LCBpbnZ4KTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gocnNxcnR4ICogcnNxcnR4LCBpbnZ4KTsKICAgICB9CiAKLSAgICAvLyBHQ0MgYW5kIE1TVkMgZGlmZmVyIGluIHRoZWlyIHRyZWF0bWVudCBvZiAxLygwICsgMGkpCi0gICAgLy8gICBHQ0MvY2xhbmcgPSAoaW5mLCBuYW4pCi0gICAgLy8gICBNU1ZDID0gKG5hbiwgbmFuKQotICAgIC8vIGFuZCAxIC8gKHggKyBpbmYgaSkKLSAgICAvLyAgIEdDQy9jbGFuZyA9ICgwLCAwKQotICAgIC8vICAgTVNWQyA9IChuYW4sIG5hbikKLSAgICAjaWYgKEVJR0VOX0NPTVBfR05VQykKKy8vIEdDQyBhbmQgTVNWQyBkaWZmZXIgaW4gdGhlaXIgdHJlYXRtZW50IG9mIDEvKDAgKyAwaSkKKy8vICAgR0NDL2NsYW5nID0gKGluZiwgbmFuKQorLy8gICBNU1ZDID0gKG5hbiwgbmFuKQorLy8gYW5kIDEgLyAoeCArIGluZiBpKQorLy8gICBHQ0MvY2xhbmcgPSAoMCwgMCkKKy8vICAgTVNWQyA9IChuYW4sIG5hbikKKyNpZiAoRUlHRU5fQ09NUF9HTlVDKQogICAgIHsKICAgICAgIGNvbnN0IGludCBrTnVtQ29ybmVycyA9IDIwOwogICAgICAgY29uc3QgQ29tcGxleFQgY29ybmVyc1trTnVtQ29ybmVyc11bMl0gPSB7Ci0gICAgICAgIC8vIE9ubHkgY29uc2lzdGVudCBhY3Jvc3MgR0NDLCBjbGFuZwotICAgICAgICB7Q29tcGxleFQoemVybywgemVybyksIENvbXBsZXhUKHplcm8sIHplcm8pfSwKLSAgICAgICAge0NvbXBsZXhUKC16ZXJvLCB6ZXJvKSwgQ29tcGxleFQoemVybywgemVybyl9LAotICAgICAgICB7Q29tcGxleFQoemVybywgLXplcm8pLCBDb21wbGV4VCh6ZXJvLCB6ZXJvKX0sCi0gICAgICAgIHtDb21wbGV4VCgtemVybywgLXplcm8pLCBDb21wbGV4VCh6ZXJvLCB6ZXJvKX0sCi0gICAgICAgIHtDb21wbGV4VChvbmUsIGluZiksIENvbXBsZXhUKGluZiwgaW5mKX0sCi0gICAgICAgIHtDb21wbGV4VChuYW4sIGluZiksIENvbXBsZXhUKGluZiwgaW5mKX0sCi0gICAgICAgIHtDb21wbGV4VChvbmUsIC1pbmYpLCBDb21wbGV4VChpbmYsIC1pbmYpfSwKLSAgICAgICAge0NvbXBsZXhUKG5hbiwgLWluZiksIENvbXBsZXhUKGluZiwgLWluZil9LAotICAgICAgICAvLyBDb25zaXN0ZW50IGFjcm9zcyBHQ0MsIGNsYW5nLCBNU1ZDCi0gICAgICAgIHtDb21wbGV4VCgtaW5mLCBvbmUpLCBDb21wbGV4VCh6ZXJvLCBpbmYpfSwKLSAgICAgICAge0NvbXBsZXhUKGluZiwgb25lKSwgQ29tcGxleFQoaW5mLCB6ZXJvKX0sCi0gICAgICAgIHtDb21wbGV4VCgtaW5mLCAtb25lKSwgQ29tcGxleFQoemVybywgLWluZil9LAotICAgICAgICB7Q29tcGxleFQoaW5mLCAtb25lKSwgQ29tcGxleFQoaW5mLCAtemVybyl9LAotICAgICAgICB7Q29tcGxleFQoLWluZiwgbmFuKSwgQ29tcGxleFQobmFuLCBpbmYpfSwKLSAgICAgICAge0NvbXBsZXhUKGluZiwgbmFuKSwgQ29tcGxleFQoaW5mLCBuYW4pfSwKLSAgICAgICAge0NvbXBsZXhUKHplcm8sIG5hbiksIENvbXBsZXhUKG5hbiwgbmFuKX0sCi0gICAgICAgIHtDb21wbGV4VChvbmUsIG5hbiksIENvbXBsZXhUKG5hbiwgbmFuKX0sCi0gICAgICAgIHtDb21wbGV4VChuYW4sIHplcm8pLCBDb21wbGV4VChuYW4sIG5hbil9LAotICAgICAgICB7Q29tcGxleFQobmFuLCBvbmUpLCBDb21wbGV4VChuYW4sIG5hbil9LAotICAgICAgICB7Q29tcGxleFQobmFuLCAtb25lKSwgQ29tcGxleFQobmFuLCBuYW4pfSwKLSAgICAgICAge0NvbXBsZXhUKG5hbiwgbmFuKSwgQ29tcGxleFQobmFuLCBuYW4pfSwKKyAgICAgICAgICAvLyBPbmx5IGNvbnNpc3RlbnQgYWNyb3NzIEdDQywgY2xhbmcKKyAgICAgICAgICB7Q29tcGxleFQoemVybywgemVybyksIENvbXBsZXhUKHplcm8sIHplcm8pfSwKKyAgICAgICAgICB7Q29tcGxleFQoLXplcm8sIHplcm8pLCBDb21wbGV4VCh6ZXJvLCB6ZXJvKX0sCisgICAgICAgICAge0NvbXBsZXhUKHplcm8sIC16ZXJvKSwgQ29tcGxleFQoemVybywgemVybyl9LAorICAgICAgICAgIHtDb21wbGV4VCgtemVybywgLXplcm8pLCBDb21wbGV4VCh6ZXJvLCB6ZXJvKX0sCisgICAgICAgICAge0NvbXBsZXhUKG9uZSwgaW5mKSwgQ29tcGxleFQoaW5mLCBpbmYpfSwKKyAgICAgICAgICB7Q29tcGxleFQobmFuLCBpbmYpLCBDb21wbGV4VChpbmYsIGluZil9LAorICAgICAgICAgIHtDb21wbGV4VChvbmUsIC1pbmYpLCBDb21wbGV4VChpbmYsIC1pbmYpfSwKKyAgICAgICAgICB7Q29tcGxleFQobmFuLCAtaW5mKSwgQ29tcGxleFQoaW5mLCAtaW5mKX0sCisgICAgICAgICAgLy8gQ29uc2lzdGVudCBhY3Jvc3MgR0NDLCBjbGFuZywgTVNWQworICAgICAgICAgIHtDb21wbGV4VCgtaW5mLCBvbmUpLCBDb21wbGV4VCh6ZXJvLCBpbmYpfSwKKyAgICAgICAgICB7Q29tcGxleFQoaW5mLCBvbmUpLCBDb21wbGV4VChpbmYsIHplcm8pfSwKKyAgICAgICAgICB7Q29tcGxleFQoLWluZiwgLW9uZSksIENvbXBsZXhUKHplcm8sIC1pbmYpfSwKKyAgICAgICAgICB7Q29tcGxleFQoaW5mLCAtb25lKSwgQ29tcGxleFQoaW5mLCAtemVybyl9LAorICAgICAgICAgIHtDb21wbGV4VCgtaW5mLCBuYW4pLCBDb21wbGV4VChuYW4sIGluZil9LAorICAgICAgICAgIHtDb21wbGV4VChpbmYsIG5hbiksIENvbXBsZXhUKGluZiwgbmFuKX0sCisgICAgICAgICAge0NvbXBsZXhUKHplcm8sIG5hbiksIENvbXBsZXhUKG5hbiwgbmFuKX0sCisgICAgICAgICAge0NvbXBsZXhUKG9uZSwgbmFuKSwgQ29tcGxleFQobmFuLCBuYW4pfSwKKyAgICAgICAgICB7Q29tcGxleFQobmFuLCB6ZXJvKSwgQ29tcGxleFQobmFuLCBuYW4pfSwKKyAgICAgICAgICB7Q29tcGxleFQobmFuLCBvbmUpLCBDb21wbGV4VChuYW4sIG5hbil9LAorICAgICAgICAgIHtDb21wbGV4VChuYW4sIC1vbmUpLCBDb21wbGV4VChuYW4sIG5hbil9LAorICAgICAgICAgIHtDb21wbGV4VChuYW4sIG5hbiksIENvbXBsZXhUKG5hbiwgbmFuKX0sCiAgICAgICB9OwogCi0gICAgICBmb3IgKGludCBpPTA7IGk8a051bUNvcm5lcnM7ICsraSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQ29ybmVyczsgKytpKSB7CiAgICAgICAgIGNvbnN0IENvbXBsZXhUJiB4ID0gY29ybmVyc1tpXVswXTsKICAgICAgICAgY29uc3QgQ29tcGxleFQgcnNxcnR4ID0gQ29tcGxleFQob25lLCB6ZXJvKSAvIGNvcm5lcnNbaV1bMV07CiAgICAgICAgIFZFUklGWV9JU19FUVVBTF9PUl9OQU5TKG51bWV4dDo6cnNxcnQoeCksIHJzcXJ0eCk7CiAgICAgICB9CiAgICAgfQotICAgICNlbmRpZgorI2VuZGlmCiAgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHZvaWQgY2hlY2tfcnNxcnQoKSB7CiAgIGNoZWNrX3JzcXJ0X2ltcGw8VD46OnJ1bigpOwogfQogCi0KIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RydWN0IGNoZWNrX3NpZ25iaXRfaW1wbCB7CiAgIHN0YXRpYyB2b2lkIHJ1bigpIHsKQEAgLTI1MiwxMCArMjMzLDggQEAKICAgICBzdGQ6OnZlY3RvcjxUPiBub25fbmVnYXRpdmVfdmFsdWVzOwogCiAgICAgaWYgKE51bVRyYWl0czxUPjo6SXNJbnRlZ2VyKSB7Ci0gICAgICBuZWdhdGl2ZV92YWx1ZXMgPSB7c3RhdGljX2Nhc3Q8VD4oLTEpLAotICAgICAgICBzdGF0aWNfY2FzdDxUPihOdW1UcmFpdHM8VD46Omxvd2VzdCgpKX07Ci0gICAgICBub25fbmVnYXRpdmVfdmFsdWVzID0ge3N0YXRpY19jYXN0PFQ+KDApLCBzdGF0aWNfY2FzdDxUPigxKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4oTnVtVHJhaXRzPFQ+OjpoaWdoZXN0KCkpfTsKKyAgICAgIG5lZ2F0aXZlX3ZhbHVlcyA9IHtzdGF0aWNfY2FzdDxUPigtMSksIHN0YXRpY19jYXN0PFQ+KE51bVRyYWl0czxUPjo6bG93ZXN0KCkpfTsKKyAgICAgIG5vbl9uZWdhdGl2ZV92YWx1ZXMgPSB7c3RhdGljX2Nhc3Q8VD4oMCksIHN0YXRpY19jYXN0PFQ+KDEpLCBzdGF0aWNfY2FzdDxUPihOdW1UcmFpdHM8VD46OmhpZ2hlc3QoKSl9OwogICAgIH0gZWxzZSB7CiAgICAgICAvLyBoYXMgc2lnbiBiaXQKICAgICAgIGNvbnN0IFQgbmVnX3plcm8gPSBzdGF0aWNfY2FzdDxUPigtMC4wKTsKQEAgLTI3MSwxNyArMjUwLDEzIEBACiAgICAgICBub25fbmVnYXRpdmVfdmFsdWVzID0ge3Bvc196ZXJvLCBwb3Nfb25lLCBwb3NfaW5mLCBwb3NfbmFufTsKICAgICB9CiAKLQogICAgIGF1dG8gY2hlY2tfYWxsID0gW10oYXV0byB2YWx1ZXMsIGF1dG8gZXhwZWN0ZWQpIHsKICAgICAgIGJvb2wgYWxsX3Bhc3MgPSB0cnVlOwogICAgICAgZm9yIChUIHZhbCA6IHZhbHVlcykgewogICAgICAgICBjb25zdCBUIG51bWV4dF92YWwgPSBudW1leHQ6OnNpZ25iaXQodmFsKTsKLSAgICAgICAgYm9vbCBub3Rfc2FtZSA9IGludGVybmFsOjpwcmVkdXhfYW55KAotICAgICAgICAgICAgaW50ZXJuYWw6OmJpdHdpc2VfaGVscGVyPFQ+OjpiaXR3aXNlX3hvcihleHBlY3RlZCwgbnVtZXh0X3ZhbCkpOworICAgICAgICBib29sIG5vdF9zYW1lID0gaW50ZXJuYWw6OnByZWR1eF9hbnkoaW50ZXJuYWw6OmJpdHdpc2VfaGVscGVyPFQ+OjpiaXR3aXNlX3hvcihleHBlY3RlZCwgbnVtZXh0X3ZhbCkpOwogICAgICAgICBhbGxfcGFzcyA9IGFsbF9wYXNzICYmICFub3Rfc2FtZTsKLSAgICAgICAgaWYgKG5vdF9zYW1lKQotICAgICAgICAgIHN0ZDo6Y291dCA8PCAic2lnbmJpdCgiIDw8IHZhbCA8PCAiKSA9ICIgPDwgbnVtZXh0X3ZhbAotICAgICAgICAgICAgICAgICAgICA8PCAiICE9ICIgPDwgZXhwZWN0ZWQgPDwgc3RkOjplbmRsOworICAgICAgICBpZiAobm90X3NhbWUpIHN0ZDo6Y291dCA8PCAic2lnbmJpdCgiIDw8IHZhbCA8PCAiKSA9ICIgPDwgbnVtZXh0X3ZhbCA8PCAiICE9ICIgPDwgZXhwZWN0ZWQgPDwgc3RkOjplbmRsOwogICAgICAgfQogICAgICAgcmV0dXJuIGFsbF9wYXNzOwogICAgIH07CkBAIC0yOTcsNTEgKzI3Miw1MCBAQAogfQogCiBFSUdFTl9ERUNMQVJFX1RFU1QobnVtZXh0KSB7Ci0gIGZvcihpbnQgaz0wOyBrPGdfcmVwZWF0OyArK2spCi0gIHsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2Ficzxib29sPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19hYnM8c2lnbmVkIGNoYXI+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2Ficzx1bnNpZ25lZCBjaGFyPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19hYnM8c2hvcnQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2Ficzx1bnNpZ25lZCBzaG9ydD4oKSApOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfYWJzPGludD4oKSApOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfYWJzPHVuc2lnbmVkIGludD4oKSApOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfYWJzPGxvbmc+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2Ficzx1bnNpZ25lZCBsb25nPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19hYnM8aGFsZj4oKSApOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfYWJzPGJmbG9hdDE2PigpICk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19hYnM8ZmxvYXQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2Ficzxkb3VibGU+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2Ficzxsb25nIGRvdWJsZT4oKSApOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfYWJzPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19hYnM8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpICk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgZ19yZXBlYXQ7ICsraykgeworICAgIENBTExfU1VCVEVTVChjaGVja19hYnM8Ym9vbD4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2FiczxzaWduZWQgY2hhcj4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2Ficzx1bnNpZ25lZCBjaGFyPigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfYWJzPHNob3J0PigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfYWJzPHVuc2lnbmVkIHNob3J0PigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfYWJzPGludD4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2Ficzx1bnNpZ25lZCBpbnQ+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19hYnM8bG9uZz4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2Ficzx1bnNpZ25lZCBsb25nPigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfYWJzPGhhbGY+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19hYnM8YmZsb2F0MTY+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19hYnM8ZmxvYXQ+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19hYnM8ZG91YmxlPigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfYWJzPGxvbmcgZG91YmxlPigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfYWJzPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfYWJzPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CiAKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2FyZzxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSApOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfYXJnPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSApOworICAgIENBTExfU1VCVEVTVChjaGVja19hcmc8c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19hcmc8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsKIAotICAgIENBTExfU1VCVEVTVCggY2hlY2tfc3FydDxmbG9hdD4oKSApOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfc3FydDxkb3VibGU+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NxcnQ8c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NxcnQ8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpICk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NxcnQ8ZmxvYXQ+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19zcXJ0PGRvdWJsZT4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NxcnQ8c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19zcXJ0PHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CiAKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3JzcXJ0PGZsb2F0PigpICk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19yc3FydDxkb3VibGU+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3JzcXJ0PHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19yc3FydDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfcnNxcnQ8ZmxvYXQ+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19yc3FydDxkb3VibGU+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19yc3FydDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3JzcXJ0PHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CiAKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NpZ25iaXQ8aGFsZj4oKSk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19zaWduYml0PGJmbG9hdDE2PigpKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NpZ25iaXQ8ZmxvYXQ+KCkpOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfc2lnbmJpdDxkb3VibGU+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19zaWduYml0PGhhbGY+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19zaWduYml0PGJmbG9hdDE2PigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfc2lnbmJpdDxmbG9hdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NpZ25iaXQ8ZG91YmxlPigpKTsKIAotICAgIENBTExfU1VCVEVTVCggY2hlY2tfc2lnbmJpdDx1aW50OF90PigpKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NpZ25iaXQ8dWludDE2X3Q+KCkpOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfc2lnbmJpdDx1aW50MzJfdD4oKSk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19zaWduYml0PHVpbnQ2NF90PigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfc2lnbmJpdDx1aW50OF90PigpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfc2lnbmJpdDx1aW50MTZfdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NpZ25iaXQ8dWludDMyX3Q+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19zaWduYml0PHVpbnQ2NF90PigpKTsKIAotICAgIENBTExfU1VCVEVTVCggY2hlY2tfc2lnbmJpdDxpbnQ4X3Q+KCkpOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfc2lnbmJpdDxpbnQxNl90PigpKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NpZ25iaXQ8aW50MzJfdD4oKSk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19zaWduYml0PGludDY0X3Q+KCkpOworICAgIENBTExfU1VCVEVTVChjaGVja19zaWduYml0PGludDhfdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NpZ25iaXQ8aW50MTZfdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NpZ25iaXQ8aW50MzJfdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NpZ25iaXQ8aW50NjRfdD4oKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvcGFja2V0X29zdHJlYW0uaCBiL3Rlc3QvcGFja2V0X29zdHJlYW0uaAppbmRleCBlY2U0OTk1Li40OWUxYmIwIDEwMDY0NAotLS0gYS90ZXN0L3BhY2tldF9vc3RyZWFtLmgKKysrIGIvdGVzdC9wYWNrZXRfb3N0cmVhbS5oCkBAIC02LDEzICs2LDE0IEBACiAKIC8vIEluY2x1ZGUgdGhpcyBoZWFkZXIgdG8gYmUgYWJsZSB0byBwcmludCBQYWNrZXRzIHdoaWxlIGRlYnVnZ2luZy4KIAotdGVtcGxhdGU8dHlwZW5hbWUgUGFja2V0LCB0eXBlbmFtZSBFbmFibGVJZiA9IHN0ZDo6ZW5hYmxlX2lmX3Q8RWlnZW46OmludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dmVjdG9yaXphYmxlPiA+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0LAorICAgICAgICAgIHR5cGVuYW1lIEVuYWJsZUlmID0gc3RkOjplbmFibGVfaWZfdDxFaWdlbjo6aW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXQ+Ojp2ZWN0b3JpemFibGU+ID4KIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBQYWNrZXQmIHBhY2tldCkgewogICB1c2luZyBTY2FsYXIgPSB0eXBlbmFtZSBFaWdlbjo6aW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXQ+Ojp0eXBlOwogICBTY2FsYXIgdltFaWdlbjo6aW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXQ+OjpzaXplXTsKICAgRWlnZW46OmludGVybmFsOjpwc3RvcmV1KHYsIHBhY2tldCk7CiAgIG9zIDw8ICJ7IiA8PCB2WzBdOwotICBmb3IgKGludCBpPTE7IGk8RWlnZW46OmludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6c2l6ZTsgKytpKSB7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgRWlnZW46OmludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6c2l6ZTsgKytpKSB7CiAgICAgb3MgPDwgIiwiIDw8IHZbaV07CiAgIH0KICAgb3MgPDwgIn0iOwpkaWZmIC0tZ2l0IGEvdGVzdC9wYWNrZXRtYXRoLmNwcCBiL3Rlc3QvcGFja2V0bWF0aC5jcHAKaW5kZXggYjViMDQwMS4uYTk3Y2NlNyAxMDA2NDQKLS0tIGEvdGVzdC9wYWNrZXRtYXRoLmNwcAorKysgYi90ZXN0L3BhY2tldG1hdGguY3BwCkBAIC0yNTcsOCArMjU3LDggQEAKICAgICB0ZXN0X2Nhc3RfcnVubmVyPFBhY2tldCwgaW50NjRfdD46OnJ1bigpOwogICAgIHRlc3RfY2FzdF9ydW5uZXI8UGFja2V0LCB1aW50NjRfdD46OnJ1bigpOwogICAgIHRlc3RfY2FzdF9ydW5uZXI8UGFja2V0LCBib29sPjo6cnVuKCk7Ci0gICAgdGVzdF9jYXN0X3J1bm5lcjxQYWNrZXQsIHN0ZDo6Y29tcGxleDxmbG9hdD4gPjo6cnVuKCk7Ci0gICAgdGVzdF9jYXN0X3J1bm5lcjxQYWNrZXQsIHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnJ1bigpOworICAgIHRlc3RfY2FzdF9ydW5uZXI8UGFja2V0LCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+Pjo6cnVuKCk7CisgICAgdGVzdF9jYXN0X3J1bm5lcjxQYWNrZXQsIHN0ZDo6Y29tcGxleDxkb3VibGU+Pjo6cnVuKCk7CiAgICAgdGVzdF9jYXN0X3J1bm5lcjxQYWNrZXQsIGhhbGY+OjpydW4oKTsKICAgICB0ZXN0X2Nhc3RfcnVubmVyPFBhY2tldCwgYmZsb2F0MTY+OjpydW4oKTsKICAgfQpAQCAtMjY4LDggKzI2OCw4IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBQYWNrZXQ+CiBzdHJ1Y3QgcGFja2V0bWF0aF9wY2FzdF9vcHNfcnVubmVyPFNjYWxhciwgUGFja2V0LCBzdGQ6OmVuYWJsZV9pZl90PE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXg+PiB7CiAgIHN0YXRpYyB2b2lkIHJ1bigpIHsKLSAgICB0ZXN0X2Nhc3RfcnVubmVyPFBhY2tldCwgc3RkOjpjb21wbGV4PGZsb2F0PiA+OjpydW4oKTsKLSAgICB0ZXN0X2Nhc3RfcnVubmVyPFBhY2tldCwgc3RkOjpjb21wbGV4PGRvdWJsZT4gPjo6cnVuKCk7CisgICAgdGVzdF9jYXN0X3J1bm5lcjxQYWNrZXQsIHN0ZDo6Y29tcGxleDxmbG9hdD4+OjpydW4oKTsKKyAgICB0ZXN0X2Nhc3RfcnVubmVyPFBhY2tldCwgc3RkOjpjb21wbGV4PGRvdWJsZT4+OjpydW4oKTsKICAgICB0ZXN0X2Nhc3RfcnVubmVyPFBhY2tldCwgaGFsZj46OnJ1bigpOwogICAgIHRlc3RfY2FzdF9ydW5uZXI8UGFja2V0LCBiZmxvYXQxNj46OnJ1bigpOwogICB9CkBAIC0yOTUsMTQgKzI5NSwxNCBAQAogCiAgIENIRUNLX0NXSVNFMl9JRih0cnVlLCBpbnRlcm5hbDo6cGNtcF9lcSwgaW50ZXJuYWw6OnBjbXBfZXEpOwogCi0gIC8vVGVzdCAoLTApID09ICgwKSBmb3Igc2lnbmVkIG9wZXJhdGlvbnMKKyAgLy8gVGVzdCAoLTApID09ICgwKSBmb3Igc2lnbmVkIG9wZXJhdGlvbnMKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKICAgICBkYXRhMVtpXSA9IFNjYWxhcigtMC4wKTsKICAgICBkYXRhMVtpICsgUGFja2V0U2l6ZV0gPSBpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkgPyBkYXRhMVtpXSA6IFNjYWxhcigwKTsKICAgfQogICBDSEVDS19DV0lTRTJfSUYodHJ1ZSwgaW50ZXJuYWw6OnBjbXBfZXEsIGludGVybmFsOjpwY21wX2VxKTsKIAotICAvL1Rlc3QgTmFOCisgIC8vIFRlc3QgTmFOCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CiAgICAgZGF0YTFbaV0gPSBOdW1UcmFpdHM8U2NhbGFyPjo6cXVpZXRfTmFOKCk7CiAgICAgZGF0YTFbaSArIFBhY2tldFNpemVdID0gaW50ZXJuYWw6OnJhbmRvbTxib29sPigpID8gZGF0YTFbaV0gOiBTY2FsYXIoMCk7CkBAIC0zMjUsMTQgKzMyNSwxNCBAQAogCiAgIENIRUNLX0NXSVNFMl9JRih0cnVlLCBpbnRlcm5hbDo6cGNtcF9sdF9vcl9uYW4sIGludGVybmFsOjpwY21wX2x0X29yX25hbik7CiAKLSAgLy9UZXN0ICgtMCkgPD0vPCAoMCkgZm9yIHNpZ25lZCBvcGVyYXRpb25zCisgIC8vIFRlc3QgKC0wKSA8PS88ICgwKSBmb3Igc2lnbmVkIG9wZXJhdGlvbnMKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKICAgICBkYXRhMVtpXSA9IFNjYWxhcigtMC4wKTsKICAgICBkYXRhMVtpICsgUGFja2V0U2l6ZV0gPSBpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkgPyBkYXRhMVtpXSA6IFNjYWxhcigwKTsKICAgfQogICBDSEVDS19DV0lTRTJfSUYodHJ1ZSwgaW50ZXJuYWw6OnBjbXBfbHRfb3JfbmFuLCBpbnRlcm5hbDo6cGNtcF9sdF9vcl9uYW4pOwogCi0gIC8vVGVzdCBOYU4KKyAgLy8gVGVzdCBOYU4KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKICAgICBkYXRhMVtpXSA9IE51bVRyYWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKICAgICBkYXRhMVtpICsgUGFja2V0U2l6ZV0gPSBpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkgPyBkYXRhMVtpXSA6IFNjYWxhcigwKTsKQEAgLTM0OCw4ICszNDgsNyBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUGFja2V0Pgogc3RydWN0IHBhY2tldG1hdGhfYm9vbGVhbl9tYXNrX29wc19ub3Rjb21wbGV4X3Rlc3Q8CiAgICAgU2NhbGFyLCBQYWNrZXQsCi0gICAgc3RkOjplbmFibGVfaWZfdDxpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNDbXAgJiYgCi0gICAgICAgICAgICAgICAgICAgICAhaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBib29sPjo6dmFsdWU+PiB7CisgICAgc3RkOjplbmFibGVfaWZfdDxpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNDbXAgJiYgIWludGVybmFsOjppc19zYW1lPFNjYWxhciwgYm9vbD46OnZhbHVlPj4gewogICBzdGF0aWMgdm9pZCBydW4oKSB7CiAgICAgY29uc3QgaW50IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnNpemU7CiAgICAgY29uc3QgaW50IHNpemUgPSAyICogUGFja2V0U2l6ZTsKQEAgLTM2NSw3ICszNjQsNyBAQAogICAgIENIRUNLX0NXSVNFMl9JRih0cnVlLCBpbnRlcm5hbDo6cGNtcF9sZSwgaW50ZXJuYWw6OnBjbXBfbGUpOwogICAgIENIRUNLX0NXSVNFMl9JRih0cnVlLCBpbnRlcm5hbDo6cGNtcF9sdCwgaW50ZXJuYWw6OnBjbXBfbHQpOwogCi0gIC8vVGVzdCAoLTApIDw9LzwgKDApIGZvciBzaWduZWQgb3BlcmF0aW9ucworICAgIC8vIFRlc3QgKC0wKSA8PS88ICgwKSBmb3Igc2lnbmVkIG9wZXJhdGlvbnMKICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBhY2tldFNpemU7ICsraSkgewogICAgICAgZGF0YTFbaV0gPSBTY2FsYXIoLTAuMCk7CiAgICAgICBkYXRhMVtpICsgUGFja2V0U2l6ZV0gPSBpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkgPyBkYXRhMVtpXSA6IFNjYWxhcigwKTsKQEAgLTM3Myw3ICszNzIsNyBAQAogICAgIENIRUNLX0NXSVNFMl9JRih0cnVlLCBpbnRlcm5hbDo6cGNtcF9sZSwgaW50ZXJuYWw6OnBjbXBfbGUpOwogICAgIENIRUNLX0NXSVNFMl9JRih0cnVlLCBpbnRlcm5hbDo6cGNtcF9sdCwgaW50ZXJuYWw6OnBjbXBfbHQpOwogCi0gIC8vVGVzdCBOYU4KKyAgICAvLyBUZXN0IE5hTgogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CiAgICAgICBkYXRhMVtpXSA9IE51bVRyYWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKICAgICAgIGRhdGExW2kgKyBQYWNrZXRTaXplXSA9IGludGVybmFsOjpyYW5kb208Ym9vbD4oKSA/IGRhdGExW2ldIDogU2NhbGFyKDApOwpAQCAtMzk1LDkgKzM5NCw3IEBACiB9OwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBQYWNrZXQ+Ci1zdHJ1Y3QgcGFja2V0bWF0aF9taW51c196ZXJvX2FkZF90ZXN0PAotICAgIFNjYWxhciwgUGFja2V0LAotICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8IU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXI+PiB7CitzdHJ1Y3QgcGFja2V0bWF0aF9taW51c196ZXJvX2FkZF90ZXN0PFNjYWxhciwgUGFja2V0LCBzdGQ6OmVuYWJsZV9pZl90PCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyPj4gewogICBzdGF0aWMgdm9pZCBydW4oKSB7CiAgICAgY29uc3QgaW50IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldD46OnNpemU7CiAgICAgY29uc3QgaW50IHNpemUgPSAyICogUGFja2V0U2l6ZTsKQEAgLTQxNywxNyArNDE0LDE1IEBACiAvLyBPbmx5IGFwcGxpZXMgdG8gcmF3IHR5cGVzLCBzbyB3aWxsIG5vdCB3b3JrIGZvciBzdGQ6OmNvbXBsZXgsIEVpZ2VuOjpoYWxmCiAvLyBvciBFaWdlbjo6YmZsb2F0MTYuIEZvciB0aG9zZSB5b3Ugd291bGQgbmVlZCB0byByZWZlciB0byBhbiB1bmRlcmx5aW5nCiAvLyBzdG9yYWdlIGVsZW1lbnQuCi10ZW1wbGF0ZTx0eXBlbmFtZSBQYWNrZXQsIHR5cGVuYW1lIEVuYWJsZUlmID0gdm9pZD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQYWNrZXQsIHR5cGVuYW1lIEVuYWJsZUlmID0gdm9pZD4KIHN0cnVjdCBlaWdlbl9vcHRpbWl6YXRpb25fYmFycmllcl90ZXN0IHsKICAgc3RhdGljIHZvaWQgcnVuKCkge30KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KLXN0cnVjdCBlaWdlbl9vcHRpbWl6YXRpb25fYmFycmllcl90ZXN0PFBhY2tldCwgc3RkOjplbmFibGVfaWZfdDwKLSAgICAhTnVtVHJhaXRzPFBhY2tldD46OklzQ29tcGxleCAmJgotICAgICFpbnRlcm5hbDo6aXNfc2FtZTxQYWNrZXQsIEVpZ2VuOjpoYWxmPjo6dmFsdWUgJiYKLSAgICAhaW50ZXJuYWw6OmlzX3NhbWU8UGFja2V0LCBFaWdlbjo6YmZsb2F0MTY+Ojp2YWx1ZQotICA+PiB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFja2V0Pgorc3RydWN0IGVpZ2VuX29wdGltaXphdGlvbl9iYXJyaWVyX3Rlc3Q8CisgICAgUGFja2V0LCBzdGQ6OmVuYWJsZV9pZl90PCFOdW1UcmFpdHM8UGFja2V0Pjo6SXNDb21wbGV4ICYmICFpbnRlcm5hbDo6aXNfc2FtZTxQYWNrZXQsIEVpZ2VuOjpoYWxmPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWludGVybmFsOjppc19zYW1lPFBhY2tldCwgRWlnZW46OmJmbG9hdDE2Pjo6dmFsdWU+PiB7CiAgIHN0YXRpYyB2b2lkIHJ1bigpIHsKICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6dHlwZSBTY2FsYXI7CiAgICAgU2NhbGFyIHMgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKQEAgLTU0OCw3ICs1NDMsNiBAQAogICBDSEVDS19DV0lTRTEobnVtZXh0Ojpjb25qLCBpbnRlcm5hbDo6cGNvbmopOwogICBDSEVDS19DV0lTRTFfSUYoUGFja2V0VHJhaXRzOjpIYXNTaWduLCBudW1leHQ6OnNpZ24sIGludGVybmFsOjpwc2lnbik7CiAKLQogICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCAzOyArK29mZnNldCkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSByZWZbaV0gPSBkYXRhMVtvZmZzZXRdOwogICAgIGludGVybmFsOjpwc3RvcmUoZGF0YTIsIGludGVybmFsOjpwc2V0MTxQYWNrZXQ+KGRhdGExW29mZnNldF0pKTsKQEAgLTYzMCw3ICs2MjQsNyBAQAogCiAgIC8vIEdlbmVyYWxCbG9ja1BhbmVsS2VybmVsIGFsc28gY2hlY2tzIFBhY2tldEJsb2NrPFBhY2tldCwoUGFja2V0U2l6ZSU0KT09MD80OlBhY2tldFNpemU+OwogICBpZiAoUGFja2V0U2l6ZSA+IDQgJiYgUGFja2V0U2l6ZSAlIDQgPT0gMCkgewotICAgIGludGVybmFsOjpQYWNrZXRCbG9jazxQYWNrZXQsIFBhY2tldFNpemUlND09MD80OlBhY2tldFNpemU+IGtlcm5lbDI7CisgICAgaW50ZXJuYWw6OlBhY2tldEJsb2NrPFBhY2tldCwgUGFja2V0U2l6ZSAlIDQgPT0gMCA/IDQgOiBQYWNrZXRTaXplPiBrZXJuZWwyOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICBrZXJuZWwyLnBhY2tldFtpXSA9IGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExICsgaSAqIFBhY2tldFNpemUpOwogICAgIH0KQEAgLTYzOCwxMyArNjMyLDEzIEBACiAgICAgaW50IGRhdGFfY291bnRlciA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgKytqKSB7Ci0gICAgICAgIGRhdGEyW2RhdGFfY291bnRlcisrXSA9IGRhdGExW2oqUGFja2V0U2l6ZSArIGldOworICAgICAgICBkYXRhMltkYXRhX2NvdW50ZXIrK10gPSBkYXRhMVtqICogUGFja2V0U2l6ZSArIGldOwogICAgICAgfQogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgaW50ZXJuYWw6OnBzdG9yZShkYXRhMywga2VybmVsMi5wYWNrZXRbaV0pOwogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBQYWNrZXRTaXplOyArK2opIHsKLSAgICAgICAgVkVSSUZZKHRlc3Q6OmlzQXBwcm94QWJzKGRhdGEzW2pdLCBkYXRhMltpKlBhY2tldFNpemUgKyBqXSwgcmVmdmFsdWUpICYmICJwdHJhbnNwb3NlIik7CisgICAgICAgIFZFUklGWSh0ZXN0Ojppc0FwcHJveEFicyhkYXRhM1tqXSwgZGF0YTJbaSAqIFBhY2tldFNpemUgKyBqXSwgcmVmdmFsdWUpICYmICJwdHJhbnNwb3NlIik7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC03MjcsMTEgKzcyMSwxMSBAQAogLy8gQ3JlYXRlIGEgZnVuY3RvciBvdXQgb2YgYSBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgcGFzc2VkICh3aXRoIG92ZXJsb2FkcykKIC8vIHRvIGFub3RoZXIgZnVuY3Rpb24gYXMgYW4gaW5wdXQgYXJndW1lbnQuCiAjZGVmaW5lIENSRUFURV9GVU5DVE9SKE5hbWUsIEZ1bmMpICAgICBcCi1zdHJ1Y3QgTmFtZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+ICAgICAgICAgICAgICAgICBcCi0gIFQgb3BlcmF0b3IoKShjb25zdCBUJiB2YWwpIGNvbnN0IHsgICBcCi0gICAgcmV0dXJuIEZ1bmModmFsKTsgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBOYW1lIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ICAgICAgICAgICAgICBcCisgICAgVCBvcGVyYXRvcigpKGNvbnN0IFQmIHZhbCkgY29uc3QgeyBcCisgICAgICByZXR1cm4gRnVuYyh2YWwpOyAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0KIAogQ1JFQVRFX0ZVTkNUT1IocHNxcnRfZnVuY3RvciwgaW50ZXJuYWw6OnBzcXJ0KTsKQEAgLTczOSw4ICs3MzMsNyBAQAogCiAvLyBUT0RPKHJtbGFyc2VuKTogUnVuIHRoaXMgdGVzdCBmb3IgbW9yZSBmdW5jdGlvbnMuCiB0ZW1wbGF0ZSA8Ym9vbCBDb25kLCB0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBhY2tldCwgdHlwZW5hbWUgUmVmRnVuY3RvclQsIHR5cGVuYW1lIEZ1bmN0b3JUPgotdm9pZCBwYWNrZXRtYXRoX3Rlc3RfSUVFRV9jb3JuZXJfY2FzZXMoY29uc3QgUmVmRnVuY3RvclQmIHJlZl9mdW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdG9yVCYgZnVuKSB7Cit2b2lkIHBhY2tldG1hdGhfdGVzdF9JRUVFX2Nvcm5lcl9jYXNlcyhjb25zdCBSZWZGdW5jdG9yVCYgcmVmX2Z1biwgY29uc3QgRnVuY3RvclQmIGZ1bikgewogICBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6c2l6ZTsKICAgY29uc3QgU2NhbGFyIG5vcm1fbWluID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6bWluKSgpOwogICBjb25zdCBTY2FsYXIgbm9ybV9tYXggPSAoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptYXgpKCk7CkBAIC03NTUsNyArNzQ4LDYgQEAKIAogICAvLyBUZXN0IGZvciBzdWJub3JtYWxzLgogICBpZiAoQ29uZCAmJiBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Omhhc19kZW5vcm0gPT0gc3RkOjpkZW5vcm1fcHJlc2VudCAmJiAhRUlHRU5fQVJDSF9BUk0pIHsKLQogICAgIGZvciAoaW50IHNjYWxlID0gMTsgc2NhbGUgPCA1OyArK3NjYWxlKSB7CiAgICAgICAvLyBXaGVuIEVJR0VOX0ZBU1RfTUFUSCBpcyAxIHdlIHJlbGF4IHRoZSBjb25kaXRpb25zIHNsaWdodGx5LCBhbmQgYWxsb3cgdGhlIGZ1bmN0aW9uCiAgICAgICAvLyB0byByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZm9yIHN1Ym5vcm1hbHMgYXMgdGhlIHJlZmVyZW5jZSB3b3VsZCByZXR1cm4gZm9yIHplcm8gd2l0aApAQCAtNzY1LDcgKzc1Nyw3IEBACiAgICAgICBkYXRhMVsxXSA9IC1kYXRhMVswXTsKICAgICAgIHRlc3Q6OnBhY2tldF9oZWxwZXI8Q29uZCwgUGFja2V0PiBoOwogICAgICAgaC5zdG9yZShkYXRhMiwgZnVuKGgubG9hZChkYXRhMSkpKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgUGFja2V0U2l6ZTsgKytpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBhY2tldFNpemU7ICsraSkgewogICAgICAgICBjb25zdCBTY2FsYXIgcmVmX3plcm8gPSByZWZfZnVuKGRhdGExW2ldIDwgMCA/IC1TY2FsYXIoMCkgOiBTY2FsYXIoMCkpOwogICAgICAgICBjb25zdCBTY2FsYXIgcmVmX3ZhbCA9IHJlZl9mdW4oZGF0YTFbaV0pOwogICAgICAgICBWRVJJRlkoKChzdGQ6OmlzbmFuKShkYXRhMltpXSkgJiYgKHN0ZDo6aXNuYW4pKHJlZl92YWwpKSB8fCBkYXRhMltpXSA9PSByZWZfemVybyB8fApAQCAtODE1LDEyICs4MDcsMTIgQEAKIAogICAvLyBOZWdhdGUgd2l0aCAtMC4KICAgaWYgKFBhY2tldFRyYWl0czo6SGFzTmVnYXRlKSB7Ci0gICAgdGVzdDo6cGFja2V0X2hlbHBlcjxQYWNrZXRUcmFpdHM6Okhhc05lZ2F0ZSxQYWNrZXQ+IGg7CisgICAgdGVzdDo6cGFja2V0X2hlbHBlcjxQYWNrZXRUcmFpdHM6Okhhc05lZ2F0ZSwgUGFja2V0PiBoOwogICAgIGRhdGExWzBdID0gU2NhbGFyey0wfTsKICAgICBoLnN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cG5lZ2F0ZShoLmxvYWQoZGF0YTEpKSk7CiAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6bWFrZV91bnNpZ25lZDx0eXBlbmFtZSBpbnRlcm5hbDo6bWFrZV9pbnRlZ2VyPFNjYWxhcj46OnR5cGU+Ojp0eXBlIEJpdHM7CiAgICAgQml0cyBiaXRzID0gbnVtZXh0OjpiaXRfY2FzdDxCaXRzPihkYXRhMlswXSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKGJpdHMsIHN0YXRpY19jYXN0PEJpdHM+KEJpdHMoMSk8PChzaXplb2YoU2NhbGFyKSpDSEFSX0JJVCAtIDEpKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGJpdHMsIHN0YXRpY19jYXN0PEJpdHM+KEJpdHMoMSkgPDwgKHNpemVvZihTY2FsYXIpICogQ0hBUl9CSVQgLSAxKSkpOwogICB9CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKQEAgLTg0OCwxNSArODQwLDE0IEBACiAgIENIRUNLX0NXSVNFMV9FWEFDVF9JRihQYWNrZXRUcmFpdHM6Okhhc1JpbnQsIG51bWV4dDo6cmludCwgaW50ZXJuYWw6OnByaW50KTsKICAgQ0hFQ0tfQ1dJU0UxX0lGKFBhY2tldFRyYWl0czo6SGFzU2lnbiwgbnVtZXh0OjpzaWduLCBpbnRlcm5hbDo6cHNpZ24pOwogCi0gIHBhY2tldG1hdGhfYm9vbGVhbl9tYXNrX29wc19yZWFsPFNjYWxhcixQYWNrZXQ+KCk7CisgIHBhY2tldG1hdGhfYm9vbGVhbl9tYXNrX29wc19yZWFsPFNjYWxhciwgUGFja2V0PigpOwogCiAgIC8vIFJvdW5kaW5nIGVkZ2UgY2FzZXMuCiAgIGlmIChQYWNrZXRUcmFpdHM6Okhhc1JvdW5kIHx8IFBhY2tldFRyYWl0czo6SGFzQ2VpbCB8fCBQYWNrZXRUcmFpdHM6Okhhc0Zsb29yIHx8IFBhY2tldFRyYWl0czo6SGFzUmludCkgewogICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Om1ha2VfaW50ZWdlcjxTY2FsYXI+Ojp0eXBlIEludFR5cGU7CiAgICAgLy8gU3RhcnQgd2l0aCB2YWx1ZXMgdGhhdCBjYW5ub3QgZml0IGluc2lkZSBhbiBpbnRlZ2VyLCB3b3JrIGRvd24gdG8gbGVzcyB0aGFuIG9uZS4KLSAgICBTY2FsYXIgdmFsID0gbnVtZXh0OjptaW5pKAotICAgICAgICBTY2FsYXIoMikgKiBzdGF0aWNfY2FzdDxTY2FsYXI+KE51bVRyYWl0czxJbnRUeXBlPjo6aGlnaGVzdCgpKSwKLSAgICAgICAgTnVtVHJhaXRzPFNjYWxhcj46OmhpZ2hlc3QoKSk7CisgICAgU2NhbGFyIHZhbCA9CisgICAgICAgIG51bWV4dDo6bWluaShTY2FsYXIoMikgKiBzdGF0aWNfY2FzdDxTY2FsYXI+KE51bVRyYWl0czxJbnRUeXBlPjo6aGlnaGVzdCgpKSwgTnVtVHJhaXRzPFNjYWxhcj46OmhpZ2hlc3QoKSk7CiAgICAgc3RkOjp2ZWN0b3I8U2NhbGFyPiB2YWx1ZXM7CiAgICAgd2hpbGUgKHZhbCA+IFNjYWxhcigwLjI1KSkgewogICAgICAgLy8gQ292ZXIgYm90aCBldmVuIGFuZCBvZGQsIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBjYXNlcy4KQEAgLTg4Myw3ICs4NzQsNyBAQAogICAgIHZhbHVlcy5wdXNoX2JhY2soLU51bVRyYWl0czxTY2FsYXI+OjppbmZpbml0eSgpKTsKICAgICB2YWx1ZXMucHVzaF9iYWNrKE51bVRyYWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKSk7CiAKLSAgICBmb3IgKHNpemVfdCBrPTA7IGs8dmFsdWVzLnNpemUoKTsgKytrKSB7CisgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCB2YWx1ZXMuc2l6ZSgpOyArK2spIHsKICAgICAgIGRhdGExWzBdID0gdmFsdWVzW2tdOwogICAgICAgQ0hFQ0tfQ1dJU0UxX0VYQUNUX0lGKFBhY2tldFRyYWl0czo6SGFzUm91bmQsIG51bWV4dDo6cm91bmQsIGludGVybmFsOjpwcm91bmQpOwogICAgICAgQ0hFQ0tfQ1dJU0UxX0VYQUNUX0lGKFBhY2tldFRyYWl0czo6SGFzQ2VpbCwgbnVtZXh0OjpjZWlsLCBpbnRlcm5hbDo6cGNlaWwpOwpAQCAtOTAxLDcgKzg5Miw2IEBACiAgIENIRUNLX0NXSVNFMV9JRihQYWNrZXRUcmFpdHM6Okhhc0FUYW4sIHN0ZDo6YXRhbiwgaW50ZXJuYWw6OnBhdGFuKTsKICAgQ0hFQ0tfQ1dJU0UxX0lGKFBhY2tldFRyYWl0czo6SGFzQVRhbmgsIHN0ZDo6YXRhbmgsIGludGVybmFsOjpwYXRhbmgpOwogCi0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKICAgICBkYXRhMVtpXSA9IFNjYWxhcihpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oLTg3LCA4OCkpOwogICAgIGRhdGEyW2ldID0gU2NhbGFyKGludGVybmFsOjpyYW5kb208ZG91YmxlPigtODcsIDg4KSk7CkBAIC05MTEsMjggKzkwMSwyNiBAQAogCiAgIENIRUNLX0NXSVNFMV9CWVJFRjFfSUYoUGFja2V0VHJhaXRzOjpIYXNFeHAsIFJFRl9GUkVYUCwgaW50ZXJuYWw6OnBmcmV4cCk7CiAgIGlmIChQYWNrZXRUcmFpdHM6Okhhc0V4cCkgewotICAgIC8vIENoZWNrIGRlbm9ybWFsczoKLSAgICAjaWYgIUVJR0VOX0FSQ0hfQVJNCi0gICAgZm9yIChpbnQgaj0wOyBqPDM7ICsraikgewotICAgICAgZGF0YTFbMF0gPSBTY2FsYXIoc3RkOjpsZGV4cCgxLCBOdW1UcmFpdHM8U2NhbGFyPjo6bWluX2V4cG9uZW50KCktaikpOworLy8gQ2hlY2sgZGVub3JtYWxzOgorI2lmICFFSUdFTl9BUkNIX0FSTQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICBkYXRhMVswXSA9IFNjYWxhcihzdGQ6OmxkZXhwKDEsIE51bVRyYWl0czxTY2FsYXI+OjptaW5fZXhwb25lbnQoKSAtIGopKTsKICAgICAgIENIRUNLX0NXSVNFMV9CWVJFRjFfSUYoUGFja2V0VHJhaXRzOjpIYXNFeHAsIFJFRl9GUkVYUCwgaW50ZXJuYWw6OnBmcmV4cCk7CiAgICAgICBkYXRhMVswXSA9IC1kYXRhMVswXTsKICAgICAgIENIRUNLX0NXSVNFMV9CWVJFRjFfSUYoUGFja2V0VHJhaXRzOjpIYXNFeHAsIFJFRl9GUkVYUCwgaW50ZXJuYWw6OnBmcmV4cCk7CiAgICAgfQotICAgICNlbmRpZgorI2VuZGlmCiAKICAgICAvLyB6ZXJvCiAgICAgZGF0YTFbMF0gPSBTY2FsYXIoMCk7CiAgICAgQ0hFQ0tfQ1dJU0UxX0JZUkVGMV9JRihQYWNrZXRUcmFpdHM6Okhhc0V4cCwgUkVGX0ZSRVhQLCBpbnRlcm5hbDo6cGZyZXhwKTsKIAogICAgIC8vIGluZiBhbmQgTmFOIG9ubHkgY29tcGFyZSBvdXRwdXQgZnJhY3Rpb24sIG5vdCBleHBvbmVudC4KLSAgICB0ZXN0OjpwYWNrZXRfaGVscGVyPFBhY2tldFRyYWl0czo6SGFzRXhwLFBhY2tldD4gaDsKKyAgICB0ZXN0OjpwYWNrZXRfaGVscGVyPFBhY2tldFRyYWl0czo6SGFzRXhwLCBQYWNrZXQ+IGg7CiAgICAgUGFja2V0IHBvdXQ7CiAgICAgU2NhbGFyIHNvdXQ7Ci0gICAgU2NhbGFyIHNwZWNpYWxbXSA9IHsgTnVtVHJhaXRzPFNjYWxhcj46OmluZmluaXR5KCksIAotICAgICAgICAgICAgICAgICAgICAgICAgLU51bVRyYWl0czxTY2FsYXI+OjppbmZpbml0eSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIE51bVRyYWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKX07Ci0gICAgZm9yIChpbnQgaT0wOyBpPDM7ICsraSkgeworICAgIFNjYWxhciBzcGVjaWFsW10gPSB7TnVtVHJhaXRzPFNjYWxhcj46OmluZmluaXR5KCksIC1OdW1UcmFpdHM8U2NhbGFyPjo6aW5maW5pdHkoKSwgTnVtVHJhaXRzPFNjYWxhcj46OnF1aWV0X05hTigpfTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgZGF0YTFbMF0gPSBzcGVjaWFsW2ldOwogICAgICAgcmVmWzBdID0gU2NhbGFyKFJFRl9GUkVYUChkYXRhMVswXSwgcmVmW1BhY2tldFNpemVdKSk7CiAgICAgICBoLnN0b3JlKGRhdGEyLCBpbnRlcm5hbDo6cGZyZXhwKGgubG9hZChkYXRhMSksIGguZm9yd2FyZF9yZWZlcmVuY2UocG91dCwgc291dCkpKTsKQEAgLTk0NSwxNyArOTMzLDE3IEBACiAgICAgZGF0YTJbaV0gPSBTY2FsYXIoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KC0xLCAxKSk7CiAgIH0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHsKLSAgICBkYXRhMVtpK1BhY2tldFNpemVdID0gU2NhbGFyKGludGVybmFsOjpyYW5kb208aW50PigtNCwgNCkpOwotICAgIGRhdGEyW2krUGFja2V0U2l6ZV0gPSBTY2FsYXIoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KC00LCA0KSk7CisgICAgZGF0YTFbaSArIFBhY2tldFNpemVdID0gU2NhbGFyKGludGVybmFsOjpyYW5kb208aW50PigtNCwgNCkpOworICAgIGRhdGEyW2kgKyBQYWNrZXRTaXplXSA9IFNjYWxhcihpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oLTQsIDQpKTsKICAgfQogICBDSEVDS19DV0lTRTJfSUYoUGFja2V0VHJhaXRzOjpIYXNFeHAsIFJFRl9MREVYUCwgaW50ZXJuYWw6OnBsZGV4cCk7CiAgIGlmIChQYWNrZXRUcmFpdHM6Okhhc0V4cCkgewogICAgIGRhdGExWzBdID0gU2NhbGFyKC0xKTsKICAgICAvLyB1bmRlcmZsb3cgdG8gemVybwotICAgIGRhdGExW1BhY2tldFNpemVdID0gU2NhbGFyKE51bVRyYWl0czxTY2FsYXI+OjptaW5fZXhwb25lbnQoKS01NSk7CisgICAgZGF0YTFbUGFja2V0U2l6ZV0gPSBTY2FsYXIoTnVtVHJhaXRzPFNjYWxhcj46Om1pbl9leHBvbmVudCgpIC0gNTUpOwogICAgIENIRUNLX0NXSVNFMl9JRihQYWNrZXRUcmFpdHM6Okhhc0V4cCwgUkVGX0xERVhQLCBpbnRlcm5hbDo6cGxkZXhwKTsKICAgICAvLyBvdmVyZmxvdyB0byBpbmYKLSAgICBkYXRhMVtQYWNrZXRTaXplXSA9IFNjYWxhcihOdW1UcmFpdHM8U2NhbGFyPjo6bWF4X2V4cG9uZW50KCkrMTApOworICAgIGRhdGExW1BhY2tldFNpemVdID0gU2NhbGFyKE51bVRyYWl0czxTY2FsYXI+OjptYXhfZXhwb25lbnQoKSArIDEwKTsKICAgICBDSEVDS19DV0lTRTJfSUYoUGFja2V0VHJhaXRzOjpIYXNFeHAsIFJFRl9MREVYUCwgaW50ZXJuYWw6OnBsZGV4cCk7CiAgICAgLy8gTmFOIHN0YXlzIE5hTgogICAgIGRhdGExWzBdID0gTnVtVHJhaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOwpAQCAtOTYzLDIxICs5NTEsMTkgQEAKICAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKGRhdGEyWzBdKSk7CiAgICAgLy8gaW5mIHN0YXlzIGluZgogICAgIGRhdGExWzBdID0gTnVtVHJhaXRzPFNjYWxhcj46OmluZmluaXR5KCk7Ci0gICAgZGF0YTFbUGFja2V0U2l6ZV0gPSBTY2FsYXIoTnVtVHJhaXRzPFNjYWxhcj46Om1pbl9leHBvbmVudCgpLTEwKTsKKyAgICBkYXRhMVtQYWNrZXRTaXplXSA9IFNjYWxhcihOdW1UcmFpdHM8U2NhbGFyPjo6bWluX2V4cG9uZW50KCkgLSAxMCk7CiAgICAgQ0hFQ0tfQ1dJU0UyX0lGKFBhY2tldFRyYWl0czo6SGFzRXhwLCBSRUZfTERFWFAsIGludGVybmFsOjpwbGRleHApOwogICAgIC8vIHplcm8gc3RheXMgemVybwogICAgIGRhdGExWzBdID0gU2NhbGFyKDApOwotICAgIGRhdGExW1BhY2tldFNpemVdID0gU2NhbGFyKE51bVRyYWl0czxTY2FsYXI+OjptYXhfZXhwb25lbnQoKSsxMCk7CisgICAgZGF0YTFbUGFja2V0U2l6ZV0gPSBTY2FsYXIoTnVtVHJhaXRzPFNjYWxhcj46Om1heF9leHBvbmVudCgpICsgMTApOwogICAgIENIRUNLX0NXSVNFMl9JRihQYWNrZXRUcmFpdHM6Okhhc0V4cCwgUkVGX0xERVhQLCBpbnRlcm5hbDo6cGxkZXhwKTsKICAgICAvLyBTbWFsbCBudW1iZXIgYmlnIGV4cG9uZW50LgotICAgIGRhdGExWzBdID0gU2NhbGFyKHN0ZDo6bGRleHAoU2NhbGFyKDEuMCksIE51bVRyYWl0czxTY2FsYXI+OjptaW5fZXhwb25lbnQoKS0xKSk7Ci0gICAgZGF0YTFbUGFja2V0U2l6ZV0gPSBTY2FsYXIoLU51bVRyYWl0czxTY2FsYXI+OjptaW5fZXhwb25lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtOdW1UcmFpdHM8U2NhbGFyPjo6bWF4X2V4cG9uZW50KCkpOworICAgIGRhdGExWzBdID0gU2NhbGFyKHN0ZDo6bGRleHAoU2NhbGFyKDEuMCksIE51bVRyYWl0czxTY2FsYXI+OjptaW5fZXhwb25lbnQoKSAtIDEpKTsKKyAgICBkYXRhMVtQYWNrZXRTaXplXSA9IFNjYWxhcigtTnVtVHJhaXRzPFNjYWxhcj46Om1pbl9leHBvbmVudCgpICsgTnVtVHJhaXRzPFNjYWxhcj46Om1heF9leHBvbmVudCgpKTsKICAgICBDSEVDS19DV0lTRTJfSUYoUGFja2V0VHJhaXRzOjpIYXNFeHAsIFJFRl9MREVYUCwgaW50ZXJuYWw6OnBsZGV4cCk7CiAgICAgLy8gQmlnIG51bWJlciBzbWFsbCBleHBvbmVudC4KLSAgICBkYXRhMVswXSA9IFNjYWxhcihzdGQ6OmxkZXhwKFNjYWxhcigxLjApLCBOdW1UcmFpdHM8U2NhbGFyPjo6bWF4X2V4cG9uZW50KCktMSkpOwotICAgIGRhdGExW1BhY2tldFNpemVdID0gU2NhbGFyKCtOdW1UcmFpdHM8U2NhbGFyPjo6bWluX2V4cG9uZW50KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtTnVtVHJhaXRzPFNjYWxhcj46Om1heF9leHBvbmVudCgpKTsKKyAgICBkYXRhMVswXSA9IFNjYWxhcihzdGQ6OmxkZXhwKFNjYWxhcigxLjApLCBOdW1UcmFpdHM8U2NhbGFyPjo6bWF4X2V4cG9uZW50KCkgLSAxKSk7CisgICAgZGF0YTFbUGFja2V0U2l6ZV0gPSBTY2FsYXIoK051bVRyYWl0czxTY2FsYXI+OjptaW5fZXhwb25lbnQoKSAtIE51bVRyYWl0czxTY2FsYXI+OjptYXhfZXhwb25lbnQoKSk7CiAgICAgQ0hFQ0tfQ1dJU0UyX0lGKFBhY2tldFRyYWl0czo6SGFzRXhwLCBSRUZfTERFWFAsIGludGVybmFsOjpwbGRleHApOwogICB9CiAKQEAgLTExMTMsOSArMTA5OSw4IEBACiAgICAgcGFja2V0bWF0aF90ZXN0X0lFRUVfY29ybmVyX2Nhc2VzPFBhY2tldFRyYWl0czo6SGFzUnNxcnQsIFNjYWxhciwgUGFja2V0PihudW1leHQ6OnJzcXJ0PFNjYWxhcj4sIHByc3FydF9mdW5jdG9yKCkpOwogCiAgICAgLy8gVE9ETyhybWxhcnNlbik6IFJlLWVuYWJsZSBmb3IgaGFsZiBhbmQgYmZsb2F0MTYuCi0gICAgaWYgKFBhY2tldFRyYWl0czo6SGFzQ29zCi0gICAgICAgICYmICFpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIGhhbGY+Ojp2YWx1ZQotICAgICAgICAmJiAhaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBiZmxvYXQxNj46OnZhbHVlKSB7CisgICAgaWYgKFBhY2tldFRyYWl0czo6SGFzQ29zICYmICFpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIGhhbGY+Ojp2YWx1ZSAmJgorICAgICAgICAhaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBiZmxvYXQxNj46OnZhbHVlKSB7CiAgICAgICB0ZXN0OjpwYWNrZXRfaGVscGVyPFBhY2tldFRyYWl0czo6SGFzQ29zLCBQYWNrZXQ+IGg7CiAgICAgICBmb3IgKFNjYWxhciBrID0gU2NhbGFyKDEpOyBrIDwgU2NhbGFyKDEwMDAwKSAvIE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCk7IGsgKj0gU2NhbGFyKDIpKSB7CiAgICAgICAgIGZvciAoaW50IGsxID0gMDsgazEgPD0gMTsgKytrMSkgewpAQCAtMTE3Niw0NCArMTE2MSw0MyBAQAogICAgIGguc3RvcmUoZGF0YTIsIGludGVybmFsOjpwcmVjaXByb2NhbChoLmxvYWQoZGF0YTEpKSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKGRhdGEyWzBdLCB6ZXJvKTsKICAgICBWRVJJRllfSVNfRVFVQUwoZGF0YTJbMV0sIC16ZXJvKTsKLQogICB9CiB9CiAKLSNkZWZpbmUgQ0FTVF9DSEVDS19DV0lTRTFfSUYoQ09ORCwgUkVGT1AsIFBPUCwgU0NBTEFSLCBSRUZUWVBFKSBpZihDT05EKSB7IFwKLSAgdGVzdDo6cGFja2V0X2hlbHBlcjxDT05ELFBhY2tldD4gaDsgXAotICBmb3IgKGludCBpPTA7IGk8UGFja2V0U2l6ZTsgKytpKSBcCi0gICAgcmVmW2ldID0gU0NBTEFSKFJFRk9QKHN0YXRpY19jYXN0PFJFRlRZUEU+KGRhdGExW2ldKSkpOyBcCi0gIGguc3RvcmUoZGF0YTIsIFBPUChoLmxvYWQoZGF0YTEpKSk7IFwKLSAgVkVSSUZZKHRlc3Q6OmFyZUFwcHJveChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAjUE9QKTsgXAorI2RlZmluZSBDQVNUX0NIRUNLX0NXSVNFMV9JRihDT05ELCBSRUZPUCwgUE9QLCBTQ0FMQVIsIFJFRlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKENPTkQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVzdDo6cGFja2V0X2hlbHBlcjxDT05ELCBQYWNrZXQ+IGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSByZWZbaV0gPSBTQ0FMQVIoUkVGT1Aoc3RhdGljX2Nhc3Q8UkVGVFlQRT4oZGF0YTFbaV0pKSk7IFwKKyAgICBoLnN0b3JlKGRhdGEyLCBQT1AoaC5sb2FkKGRhdGExKSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVkVSSUZZKHRlc3Q6OmFyZUFwcHJveChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAjUE9QKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CiBTY2FsYXIgcHJvcGFnYXRlX25hbl9tYXgoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBTY2FsYXImIGIpIHsKICAgaWYgKChudW1leHQ6OmlzbmFuKShhKSkgcmV0dXJuIGE7CiAgIGlmICgobnVtZXh0Ojppc25hbikoYikpIHJldHVybiBiOwotICByZXR1cm4gKG51bWV4dDo6bWF4aSkoYSxiKTsKKyAgcmV0dXJuIChudW1leHQ6Om1heGkpKGEsIGIpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgogU2NhbGFyIHByb3BhZ2F0ZV9uYW5fbWluKGNvbnN0IFNjYWxhciYgYSwgY29uc3QgU2NhbGFyJiBiKSB7CiAgIGlmICgobnVtZXh0Ojppc25hbikoYSkpIHJldHVybiBhOwogICBpZiAoKG51bWV4dDo6aXNuYW4pKGIpKSByZXR1cm4gYjsKLSAgcmV0dXJuIChudW1leHQ6Om1pbmkpKGEsYik7CisgIHJldHVybiAobnVtZXh0OjptaW5pKShhLCBiKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KIFNjYWxhciBwcm9wYWdhdGVfbnVtYmVyX21heChjb25zdCBTY2FsYXImIGEsIGNvbnN0IFNjYWxhciYgYikgewogICBpZiAoKG51bWV4dDo6aXNuYW4pKGEpKSByZXR1cm4gYjsKICAgaWYgKChudW1leHQ6OmlzbmFuKShiKSkgcmV0dXJuIGE7Ci0gIHJldHVybiAobnVtZXh0OjptYXhpKShhLGIpOworICByZXR1cm4gKG51bWV4dDo6bWF4aSkoYSwgYik7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CiBTY2FsYXIgcHJvcGFnYXRlX251bWJlcl9taW4oY29uc3QgU2NhbGFyJiBhLCBjb25zdCBTY2FsYXImIGIpIHsKICAgaWYgKChudW1leHQ6OmlzbmFuKShhKSkgcmV0dXJuIGI7CiAgIGlmICgobnVtZXh0Ojppc25hbikoYikpIHJldHVybiBhOwotICByZXR1cm4gKG51bWV4dDo6bWluaSkoYSxiKTsKKyAgcmV0dXJuIChudW1leHQ6Om1pbmkpKGEsIGIpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBQYWNrZXQ+CkBAIC0xMjcxLDI4ICsxMjU1LDMxIEBACiAgICAgfQogICB9CiAKLQogICAvLyBUZXN0IE5hTiBwcm9wYWdhdGlvbi4KICAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyKSB7CiAgICAgLy8gVGVzdCByZWR1Y3Rpb25zIHdpdGggbm8gTmFOcy4KICAgICByZWZbMF0gPSBkYXRhMVswXTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBhY2tldFNpemU7ICsraSkgcmVmWzBdID0gaW50ZXJuYWw6OnBtaW48UHJvcGFnYXRlTnVtYmVycz4ocmVmWzBdLCBkYXRhMVtpXSk7Ci0gICAgVkVSSUZZKGludGVybmFsOjppc0FwcHJveChyZWZbMF0sIGludGVybmFsOjpwcmVkdXhfbWluPFByb3BhZ2F0ZU51bWJlcnM+KGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSkpICYmICJpbnRlcm5hbDo6cHJlZHV4X21pbjxQcm9wYWdhdGVOdW1iZXJzPiIpOworICAgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3gocmVmWzBdLCBpbnRlcm5hbDo6cHJlZHV4X21pbjxQcm9wYWdhdGVOdW1iZXJzPihpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpKSAmJgorICAgICAgICAgICAiaW50ZXJuYWw6OnByZWR1eF9taW48UHJvcGFnYXRlTnVtYmVycz4iKTsKICAgICByZWZbMF0gPSBkYXRhMVswXTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBhY2tldFNpemU7ICsraSkgcmVmWzBdID0gaW50ZXJuYWw6OnBtaW48UHJvcGFnYXRlTmFOPihyZWZbMF0sIGRhdGExW2ldKTsKLSAgICBWRVJJRlkoaW50ZXJuYWw6OmlzQXBwcm94KHJlZlswXSwgaW50ZXJuYWw6OnByZWR1eF9taW48UHJvcGFnYXRlTmFOPihpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpKSAmJiAiaW50ZXJuYWw6OnByZWR1eF9taW48UHJvcGFnYXRlTmFOPiIpOworICAgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3gocmVmWzBdLCBpbnRlcm5hbDo6cHJlZHV4X21pbjxQcm9wYWdhdGVOYU4+KGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSkpICYmCisgICAgICAgICAgICJpbnRlcm5hbDo6cHJlZHV4X21pbjxQcm9wYWdhdGVOYU4+Iik7CiAgICAgcmVmWzBdID0gZGF0YTFbMF07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHJlZlswXSA9IGludGVybmFsOjpwbWF4PFByb3BhZ2F0ZU51bWJlcnM+KHJlZlswXSwgZGF0YTFbaV0pOwotICAgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3gocmVmWzBdLCBpbnRlcm5hbDo6cHJlZHV4X21heDxQcm9wYWdhdGVOdW1iZXJzPihpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpKSAmJiAiaW50ZXJuYWw6OnByZWR1eF9tYXg8UHJvcGFnYXRlTnVtYmVycz4iKTsKKyAgICBWRVJJRlkoaW50ZXJuYWw6OmlzQXBwcm94KHJlZlswXSwgaW50ZXJuYWw6OnByZWR1eF9tYXg8UHJvcGFnYXRlTnVtYmVycz4oaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKSkgJiYKKyAgICAgICAgICAgImludGVybmFsOjpwcmVkdXhfbWF4PFByb3BhZ2F0ZU51bWJlcnM+Iik7CiAgICAgcmVmWzBdID0gZGF0YTFbMF07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHJlZlswXSA9IGludGVybmFsOjpwbWF4PFByb3BhZ2F0ZU5hTj4ocmVmWzBdLCBkYXRhMVtpXSk7Ci0gICAgVkVSSUZZKGludGVybmFsOjppc0FwcHJveChyZWZbMF0sIGludGVybmFsOjpwcmVkdXhfbWF4PFByb3BhZ2F0ZU5hTj4oaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKSkgJiYgImludGVybmFsOjpwcmVkdXhfbWF4PFByb3BhZ2F0ZU51bWJlcnM+Iik7CisgICAgVkVSSUZZKGludGVybmFsOjppc0FwcHJveChyZWZbMF0sIGludGVybmFsOjpwcmVkdXhfbWF4PFByb3BhZ2F0ZU5hTj4oaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKSkgJiYKKyAgICAgICAgICAgImludGVybmFsOjpwcmVkdXhfbWF4PFByb3BhZ2F0ZU51bWJlcnM+Iik7CiAgICAgLy8gQSBzaW5nbGUgTmFOLgogICAgIGNvbnN0IHNpemVfdCBpbmRleCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6cXVpZXRfTmFOKCkgJSBQYWNrZXRTaXplOwogICAgIGRhdGExW2luZGV4XSA9IE51bVRyYWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKLSAgICBWRVJJRlkoUGFja2V0U2l6ZT09MSB8fCAhKG51bWV4dDo6aXNuYW4pKGludGVybmFsOjpwcmVkdXhfbWluPFByb3BhZ2F0ZU51bWJlcnM+KGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSkpKTsKKyAgICBWRVJJRlkoUGFja2V0U2l6ZSA9PSAxIHx8ICEobnVtZXh0Ojppc25hbikoaW50ZXJuYWw6OnByZWR1eF9taW48UHJvcGFnYXRlTnVtYmVycz4oaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKSkpOwogICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikoaW50ZXJuYWw6OnByZWR1eF9taW48UHJvcGFnYXRlTmFOPihpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpKSk7Ci0gICAgVkVSSUZZKFBhY2tldFNpemU9PTEgfHwgIShudW1leHQ6OmlzbmFuKShpbnRlcm5hbDo6cHJlZHV4X21heDxQcm9wYWdhdGVOdW1iZXJzPihpbnRlcm5hbDo6cGxvYWQ8UGFja2V0PihkYXRhMSkpKSk7CisgICAgVkVSSUZZKFBhY2tldFNpemUgPT0gMSB8fCAhKG51bWV4dDo6aXNuYW4pKGludGVybmFsOjpwcmVkdXhfbWF4PFByb3BhZ2F0ZU51bWJlcnM+KGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSkpKTsKICAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKGludGVybmFsOjpwcmVkdXhfbWF4PFByb3BhZ2F0ZU5hTj4oaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKSkpOwogICAgIC8vIEFsbCBOYU5zLgogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNCAqIFBhY2tldFNpemU7ICsraSkgZGF0YTFbaV0gPSBOdW1UcmFpdHM8U2NhbGFyPjo6cXVpZXRfTmFOKCk7CkBAIC0xNTI5LDggKzE1MTYsOCBAQAogICAgIENBTExfU1VCVEVTVF84KHRlc3Q6OnJ1bm5lcjx1aW50MzJfdD46OnJ1bigpKTsKICAgICBDQUxMX1NVQlRFU1RfOSh0ZXN0OjpydW5uZXI8aW50NjRfdD46OnJ1bigpKTsKICAgICBDQUxMX1NVQlRFU1RfMTAodGVzdDo6cnVubmVyPHVpbnQ2NF90Pjo6cnVuKCkpOwotICAgIENBTExfU1VCVEVTVF8xMSh0ZXN0OjpydW5uZXI8c3RkOjpjb21wbGV4PGZsb2F0PiA+OjpydW4oKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzEyKHRlc3Q6OnJ1bm5lcjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+OjpydW4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzExKHRlc3Q6OnJ1bm5lcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+Pjo6cnVuKCkpOworICAgIENBTExfU1VCVEVTVF8xMih0ZXN0OjpydW5uZXI8c3RkOjpjb21wbGV4PGRvdWJsZT4+OjpydW4oKSk7CiAgICAgQ0FMTF9TVUJURVNUXzEzKHRlc3Q6OnJ1bm5lcjxoYWxmPjo6cnVuKCkpOwogICAgIENBTExfU1VCVEVTVF8xNCgocGFja2V0bWF0aDxib29sLCBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxib29sPjo6dHlwZT4oKSkpOwogICAgIENBTExfU1VCVEVTVF8xNSh0ZXN0OjpydW5uZXI8YmZsb2F0MTY+OjpydW4oKSk7CmRpZmYgLS1naXQgYS90ZXN0L3BhY2tldG1hdGhfdGVzdF9zaGFyZWQuaCBiL3Rlc3QvcGFja2V0bWF0aF90ZXN0X3NoYXJlZC5oCmluZGV4IDZmYzQ4OWYuLmUxYWNiNjggMTAwNjQ0Ci0tLSBhL3Rlc3QvcGFja2V0bWF0aF90ZXN0X3NoYXJlZC5oCisrKyBiL3Rlc3QvcGFja2V0bWF0aF90ZXN0X3NoYXJlZC5oCkBAIC0xMSw4ICsxMSw4IEBACiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgPHR5cGVpbmZvPgogCi0jaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXz49NgotICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XaWdub3JlZC1hdHRyaWJ1dGVzIgorI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gNgorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2lnbm9yZWQtYXR0cmlidXRlcyIKICNlbmRpZgogLy8gdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCkBAIC0yMSw3NCArMjEsNzYgQEAKIG5hbWVzcGFjZSBFaWdlbiB7CiBuYW1lc3BhY2UgaW50ZXJuYWwgewogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIG5lZ2F0ZShjb25zdCBUJiB4KSB7IHJldHVybiAteDsgfQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIG5lZ2F0ZShjb25zdCBUJiB4KSB7CisgIHJldHVybiAteDsKK30KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLU1hcDxjb25zdCBBcnJheTx1bnNpZ25lZCBjaGFyLHNpemVvZihUKSwxPiA+Ci1iaXRzKGNvbnN0IFQmIHgpIHsKLSAgcmV0dXJuIE1hcDxjb25zdCBBcnJheTx1bnNpZ25lZCBjaGFyLHNpemVvZihUKSwxPiA+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhciAqPigmeCkpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitNYXA8Y29uc3QgQXJyYXk8dW5zaWduZWQgY2hhciwgc2l6ZW9mKFQpLCAxPiA+IGJpdHMoY29uc3QgVCYgeCkgeworICByZXR1cm4gTWFwPGNvbnN0IEFycmF5PHVuc2lnbmVkIGNoYXIsIHNpemVvZihUKSwgMT4gPihyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPigmeCkpOwogfQogCiAvLyBUaGUgZm9sbG93aW5nIGltcGxlbWVudCBiaXR3aXNlIG9wZXJhdGlvbnMgb24gZmxvYXRpbmcgcG9pbnQgdHlwZXMKLXRlbXBsYXRlPHR5cGVuYW1lIFQsdHlwZW5hbWUgQml0cyx0eXBlbmFtZSBGdW5jPgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEJpdHMsIHR5cGVuYW1lIEZ1bmM+CiBUIGFwcGx5X2JpdF9vcChCaXRzIGEsIEJpdHMgYiwgRnVuYyBmKSB7Ci0gIEFycmF5PHVuc2lnbmVkIGNoYXIsc2l6ZW9mKFQpLDE+IGRhdGE7CisgIEFycmF5PHVuc2lnbmVkIGNoYXIsIHNpemVvZihUKSwgMT4gZGF0YTsKICAgVCByZXM7Ci0gIGZvcihJbmRleCBpID0gMDsgaSA8IGRhdGEuc2l6ZSgpOyArK2kpCi0gICAgZGF0YVtpXSA9IGYoYVtpXSwgYltpXSk7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBkYXRhLnNpemUoKTsgKytpKSBkYXRhW2ldID0gZihhW2ldLCBiW2ldKTsKICAgLy8gTm90ZTogVGhlIHJlaW50ZXJwcmV0X2Nhc3Qgd29ya3MgYXJvdW5kIEdDQydzIGNsYXNzLW1lbWFjY2VzcyB3YXJuaW5nczoKICAgc3RkOjptZW1jcHkocmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oJnJlcyksIGRhdGEuZGF0YSgpLCBzaXplb2YoVCkpOwogICByZXR1cm4gcmVzOwogfQogCi0jZGVmaW5lIEVJR0VOX1RFU1RfTUFLRV9CSVRXSVNFMihPUCxGVU5DLFQpICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGU8PiBUIEVJR0VOX0NBVChwLE9QKShjb25zdCBUJiBhLGNvbnN0IFQmIGIpIHsgXAotICAgIHJldHVybiBhcHBseV9iaXRfb3A8VD4oYml0cyhhKSxiaXRzKGIpLEZVTkMpOyAgICAgXAorI2RlZmluZSBFSUdFTl9URVNUX01BS0VfQklUV0lTRTIoT1AsIEZVTkMsIFQpICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFQgRUlHRU5fQ0FUKHAsIE9QKShjb25zdCBUJiBhLCBjb25zdCBUJiBiKSB7ICAgICAgXAorICAgIHJldHVybiBhcHBseV9iaXRfb3A8VD4oYml0cyhhKSwgYml0cyhiKSwgRlVOQyk7IFwKICAgfQogCi0jZGVmaW5lIEVJR0VOX1RFU1RfTUFLRV9CSVRXSVNFKE9QLEZVTkMpICAgICAgICAgICAgICAgICAgXAotICBFSUdFTl9URVNUX01BS0VfQklUV0lTRTIoT1AsRlVOQyxmbG9hdCkgICAgICAgICAgICAgICAgIFwKLSAgRUlHRU5fVEVTVF9NQUtFX0JJVFdJU0UyKE9QLEZVTkMsZG91YmxlKSAgICAgICAgICAgICAgICBcCi0gIEVJR0VOX1RFU1RfTUFLRV9CSVRXSVNFMihPUCxGVU5DLGhhbGYpICAgICAgICAgICAgICAgICAgXAotICBFSUdFTl9URVNUX01BS0VfQklUV0lTRTIoT1AsRlVOQyxiZmxvYXQxNikgICAgICAgICAgICAgIFwKLSAgRUlHRU5fVEVTVF9NQUtFX0JJVFdJU0UyKE9QLEZVTkMsc3RkOjpjb21wbGV4PGZsb2F0PikgICBcCi0gIEVJR0VOX1RFU1RfTUFLRV9CSVRXSVNFMihPUCxGVU5DLHN0ZDo6Y29tcGxleDxkb3VibGU+KQorI2RlZmluZSBFSUdFTl9URVNUX01BS0VfQklUV0lTRShPUCwgRlVOQykgICAgICAgICAgICAgICAgIFwKKyAgRUlHRU5fVEVTVF9NQUtFX0JJVFdJU0UyKE9QLCBGVU5DLCBmbG9hdCkgICAgICAgICAgICAgICBcCisgIEVJR0VOX1RFU1RfTUFLRV9CSVRXSVNFMihPUCwgRlVOQywgZG91YmxlKSAgICAgICAgICAgICAgXAorICBFSUdFTl9URVNUX01BS0VfQklUV0lTRTIoT1AsIEZVTkMsIGhhbGYpICAgICAgICAgICAgICAgIFwKKyAgRUlHRU5fVEVTVF9NQUtFX0JJVFdJU0UyKE9QLCBGVU5DLCBiZmxvYXQxNikgICAgICAgICAgICBcCisgIEVJR0VOX1RFU1RfTUFLRV9CSVRXSVNFMihPUCwgRlVOQywgc3RkOjpjb21wbGV4PGZsb2F0PikgXAorICBFSUdFTl9URVNUX01BS0VfQklUV0lTRTIoT1AsIEZVTkMsIHN0ZDo6Y29tcGxleDxkb3VibGU+KQogCi1FSUdFTl9URVNUX01BS0VfQklUV0lTRSh4b3Isc3RkOjpiaXRfeG9yPHVuc2lnbmVkIGNoYXI+KCkpCi1FSUdFTl9URVNUX01BS0VfQklUV0lTRShhbmQsc3RkOjpiaXRfYW5kPHVuc2lnbmVkIGNoYXI+KCkpCitFSUdFTl9URVNUX01BS0VfQklUV0lTRSh4b3IsIHN0ZDo6Yml0X3hvcjx1bnNpZ25lZCBjaGFyPigpKQorRUlHRU5fVEVTVF9NQUtFX0JJVFdJU0UoYW5kLCBzdGQ6OmJpdF9hbmQ8dW5zaWduZWQgY2hhcj4oKSkKIEVJR0VOX1RFU1RfTUFLRV9CSVRXSVNFKG9yLCBzdGQ6OmJpdF9vcjx1bnNpZ25lZCBjaGFyPigpKQotc3RydWN0IGJpdF9hbmRub3R7Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFQKLSAgb3BlcmF0b3IoKShUIGEsIFQgYikgY29uc3QgeyByZXR1cm4gYSAmICh+Yik7IH0KK3N0cnVjdCBiaXRfYW5kbm90IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFQgb3BlcmF0b3IoKShUIGEsIFQgYikgY29uc3QgeworICAgIHJldHVybiBhICYgKH5iKTsKKyAgfQogfTsKIEVJR0VOX1RFU1RfTUFLRV9CSVRXSVNFKGFuZG5vdCwgYml0X2FuZG5vdCgpKQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogYm9vbCBiaXRlcShUIGEsIFQgYikgewogICByZXR1cm4gKGJpdHMoYSkgPT0gYml0cyhiKSkuYWxsKCk7CiB9CiAKLX0KK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAogCiBuYW1lc3BhY2UgdGVzdCB7CiAKIC8vIE5PVEU6IHdlIGRpc2FibGUgaW5saW5pbmcgZm9yIHRoaXMgZnVuY3Rpb24gdG8gd29ya2Fyb3VuZCBhIEdDQyBpc3N1ZSB3aGVuIHVzaW5nIC1PMyBhbmQgdGhlIGkzODcgRlBVLgotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBFSUdFTl9ET05UX0lOTElORQotYm9vbCBpc0FwcHJveEFicyhjb25zdCBTY2FsYXImIGEsIGNvbnN0IFNjYWxhciYgYiwgY29uc3QgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwmIHJlZnZhbHVlKQotewotICByZXR1cm4gaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGEtYiwgcmVmdmFsdWUpOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK0VJR0VOX0RPTlRfSU5MSU5FIGJvb2wgaXNBcHByb3hBYnMoY29uc3QgU2NhbGFyJiBhLCBjb25zdCBTY2FsYXImIGIsIGNvbnN0IHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsJiByZWZ2YWx1ZSkgeworICByZXR1cm4gaW50ZXJuYWw6OmlzTXVjaFNtYWxsZXJUaGFuKGEgLSBiLCByZWZ2YWx1ZSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CiBpbmxpbmUgdm9pZCBwcmludF9taXNtYXRjaChjb25zdCBTY2FsYXIqIHJlZiwgY29uc3QgU2NhbGFyKiB2ZWMsIGludCBzaXplKSB7Ci0gIHN0ZDo6Y291dCA8PCAicmVmOiBbIiA8PCBNYXA8Y29uc3QgTWF0cml4PFNjYWxhciwxLER5bmFtaWM+ID4ocmVmLHNpemUpIDw8ICJdIiA8PCAiICE9IHZlYzogWyIgPDwgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsMSxEeW5hbWljPiA+KHZlYyxzaXplKSA8PCAiXVxuIjsKKyAgc3RkOjpjb3V0IDw8ICJyZWY6IFsiIDw8IE1hcDxjb25zdCBNYXRyaXg8U2NhbGFyLCAxLCBEeW5hbWljPiA+KHJlZiwgc2l6ZSkgPDwgIl0iCisgICAgICAgICAgICA8PCAiICE9IHZlYzogWyIgPDwgTWFwPGNvbnN0IE1hdHJpeDxTY2FsYXIsIDEsIER5bmFtaWM+ID4odmVjLCBzaXplKSA8PCAiXVxuIjsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBib29sIGFyZUFwcHJveEFicyhjb25zdCBTY2FsYXIqIGEsIGNvbnN0IFNjYWxhciogYiwgaW50IHNpemUsIGNvbnN0IHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsJiByZWZ2YWx1ZSkKLXsKLSAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKLSAgewotICAgIGlmICghaXNBcHByb3hBYnMoYVtpXSxiW2ldLHJlZnZhbHVlKSkKLSAgICB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorYm9vbCBhcmVBcHByb3hBYnMoY29uc3QgU2NhbGFyKiBhLCBjb25zdCBTY2FsYXIqIGIsIGludCBzaXplLCBjb25zdCB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCYgcmVmdmFsdWUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBpZiAoIWlzQXBwcm94QWJzKGFbaV0sIGJbaV0sIHJlZnZhbHVlKSkgewogICAgICAgcHJpbnRfbWlzbWF0Y2goYSwgYiwgc2l6ZSk7CiAgICAgICBzdGQ6OmNvdXQgPDwgIlZhbHVlcyBkaWZmZXIgaW4gcG9zaXRpb24gIiA8PCBpIDw8ICI6ICIgPDwgYVtpXSA8PCAiIHZzICIgPDwgYltpXSA8PCBzdGQ6OmVuZGw7CiAgICAgICByZXR1cm4gZmFsc2U7CkBAIC05NywxMyArOTksMTEgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gYm9vbCBhcmVBcHByb3goY29uc3QgU2NhbGFyKiBhLCBjb25zdCBTY2FsYXIqIGIsIGludCBzaXplKQotewotICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKQotICB7Ci0gICAgaWYgKCBudW1leHQ6Om5vdF9lcXVhbF9zdHJpY3QoYVtpXSwgYltpXSkgJiYgIWludGVybmFsOjppc0FwcHJveChhW2ldLGJbaV0pCi0gICAgICAgICAmJiAhKChudW1leHQ6OmlzbmFuKShhW2ldKSAmJiAobnVtZXh0Ojppc25hbikoYltpXSkpICkKLSAgICB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorYm9vbCBhcmVBcHByb3goY29uc3QgU2NhbGFyKiBhLCBjb25zdCBTY2FsYXIqIGIsIGludCBzaXplKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgaWYgKG51bWV4dDo6bm90X2VxdWFsX3N0cmljdChhW2ldLCBiW2ldKSAmJiAhaW50ZXJuYWw6OmlzQXBwcm94KGFbaV0sIGJbaV0pICYmCisgICAgICAgICEoKG51bWV4dDo6aXNuYW4pKGFbaV0pICYmIChudW1leHQ6OmlzbmFuKShiW2ldKSkpIHsKICAgICAgIHByaW50X21pc21hdGNoKGEsIGIsIHNpemUpOwogICAgICAgc3RkOjpjb3V0IDw8ICJWYWx1ZXMgZGlmZmVyIGluIHBvc2l0aW9uICIgPDwgaSA8PCAiOiAiIDw8IGFbaV0gPDwgIiB2cyAiIDw8IGJbaV0gPDwgc3RkOjplbmRsOwogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTEyLDEyICsxMTIsMTAgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gYm9vbCBhcmVFcXVhbChjb25zdCBTY2FsYXIqIGEsIGNvbnN0IFNjYWxhciogYiwgaW50IHNpemUpCi17Ci0gIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCi0gIHsKLSAgICBpZiAoIG51bWV4dDo6bm90X2VxdWFsX3N0cmljdChhW2ldLCBiW2ldKSAmJiAhKChudW1leHQ6OmlzbmFuKShhW2ldKSAmJiAobnVtZXh0Ojppc25hbikoYltpXSkpICkKLSAgICB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorYm9vbCBhcmVFcXVhbChjb25zdCBTY2FsYXIqIGEsIGNvbnN0IFNjYWxhciogYiwgaW50IHNpemUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBpZiAobnVtZXh0Ojpub3RfZXF1YWxfc3RyaWN0KGFbaV0sIGJbaV0pICYmICEoKG51bWV4dDo6aXNuYW4pKGFbaV0pICYmIChudW1leHQ6OmlzbmFuKShiW2ldKSkpIHsKICAgICAgIHByaW50X21pc21hdGNoKGEsIGIsIHNpemUpOwogICAgICAgc3RkOjpjb3V0IDw8ICJWYWx1ZXMgZGlmZmVyIGluIHBvc2l0aW9uICIgPDwgaSA8PCAiOiAiIDw8IGFbaV0gPDwgIiB2cyAiIDw8IGJbaV0gPDwgc3RkOjplbmRsOwogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTI2LDE1MyArMTI0LDE2MSBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotI2RlZmluZSBDSEVDS19DV0lTRTEoUkVGT1AsIFBPUCkgeyBcCi0gIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpIFwKLSAgICByZWZbaV0gPSBSRUZPUChkYXRhMVtpXSk7IFwKLSAgaW50ZXJuYWw6OnBzdG9yZShkYXRhMiwgUE9QKGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExKSkpOyBcCi0gIFZFUklGWSh0ZXN0OjphcmVBcHByb3gocmVmLCBkYXRhMiwgUGFja2V0U2l6ZSkgJiYgI1BPUCk7IFwKLX0KKyNkZWZpbmUgQ0hFQ0tfQ1dJU0UxKFJFRk9QLCBQT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSByZWZbaV0gPSBSRUZPUChkYXRhMVtpXSk7IFwKKyAgICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyLCBQT1AoaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEpKSk7ICBcCisgICAgVkVSSUZZKHRlc3Q6OmFyZUFwcHJveChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAjUE9QKTsgICAgICAgXAorICB9CiAKIC8vIENoZWNrcyBjb21wb25lbnQtd2lzZSBmb3IgaW5wdXQgb2Ygc2l6ZSBOLiBBbGwgb2YgZGF0YTEsIGRhdGEyLCBhbmQgcmVmCiAvLyBzaG91bGQgaGF2ZSBzaXplIGF0IGxlYXN0IGNlaWwoTi9QYWNrZXRTaXplKSpQYWNrZXRTaXplIHRvIGF2b2lkIG1lbW9yeQogLy8gYWNjZXNzIGVycm9ycy4KLSNkZWZpbmUgQ0hFQ0tfQ1dJU0UxX04oUkVGT1AsIFBPUCwgTikgeyBcCi0gIGZvciAoaW50IGk9MDsgaTxOOyArK2kpIFwKLSAgICByZWZbaV0gPSBSRUZPUChkYXRhMVtpXSk7IFwKLSAgZm9yIChpbnQgaj0wOyBqPE47IGorPVBhY2tldFNpemUpIFwKLSAgICBpbnRlcm5hbDo6cHN0b3JlKGRhdGEyICsgaiwgUE9QKGludGVybmFsOjpwbG9hZDxQYWNrZXQ+KGRhdGExICsgaikpKTsgXAotICBWRVJJRlkodGVzdDo6YXJlQXBwcm94KHJlZiwgZGF0YTIsIE4pICYmICNQT1ApOyBcCi19CisjZGVmaW5lIENIRUNLX0NXSVNFMV9OKFJFRk9QLCBQT1AsIE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHJlZltpXSA9IFJFRk9QKGRhdGExW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqICs9IFBhY2tldFNpemUpIGludGVybmFsOjpwc3RvcmUoZGF0YTIgKyBqLCBQT1AoaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZGF0YTEgKyBqKSkpOyBcCisgICAgVkVSSUZZKHRlc3Q6OmFyZUFwcHJveChyZWYsIGRhdGEyLCBOKSAmJiAjUE9QKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KIAotdGVtcGxhdGU8Ym9vbCBDb25kLHR5cGVuYW1lIFBhY2tldD4KLXN0cnVjdCBwYWNrZXRfaGVscGVyCi17Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIGlubGluZSBQYWNrZXQgbG9hZChjb25zdCBUKiBmcm9tKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6cGxvYWQ8UGFja2V0Pihmcm9tKTsgfQordGVtcGxhdGUgPGJvb2wgQ29uZCwgdHlwZW5hbWUgUGFja2V0Pgorc3RydWN0IHBhY2tldF9oZWxwZXIgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIFBhY2tldCBsb2FkKGNvbnN0IFQqIGZyb20pIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2FkPFBhY2tldD4oZnJvbSk7CisgIH0KIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICBpbmxpbmUgUGFja2V0IGxvYWR1KGNvbnN0IFQqIGZyb20pIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpwbG9hZHU8UGFja2V0Pihmcm9tKTsgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIFBhY2tldCBsb2FkdShjb25zdCBUKiBmcm9tKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVybmFsOjpwbG9hZHU8UGFja2V0Pihmcm9tKTsKKyAgfQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIGlubGluZSBQYWNrZXQgbG9hZChjb25zdCBUKiBmcm9tLCB1bnNpZ25lZCBsb25nIGxvbmcgdW1hc2spIGNvbnN0IHsgcmV0dXJuIGludGVybmFsOjpwbG9hZHU8UGFja2V0Pihmcm9tLCB1bWFzayk7IH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSBQYWNrZXQgbG9hZChjb25zdCBUKiBmcm9tLCB1bnNpZ25lZCBsb25nIGxvbmcgdW1hc2spIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWw6OnBsb2FkdTxQYWNrZXQ+KGZyb20sIHVtYXNrKTsKKyAgfQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIGlubGluZSB2b2lkIHN0b3JlKFQqIHRvLCBjb25zdCBQYWNrZXQmIHgpIGNvbnN0IHsgaW50ZXJuYWw6OnBzdG9yZSh0byx4KTsgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIHZvaWQgc3RvcmUoVCogdG8sIGNvbnN0IFBhY2tldCYgeCkgY29uc3QgeworICAgIGludGVybmFsOjpwc3RvcmUodG8sIHgpOworICB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgaW5saW5lIHZvaWQgc3RvcmUoVCogdG8sIGNvbnN0IFBhY2tldCYgeCwgdW5zaWduZWQgbG9uZyBsb25nIHVtYXNrKSBjb25zdCB7IGludGVybmFsOjpwc3RvcmV1KHRvLCB4LCB1bWFzayk7IH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSB2b2lkIHN0b3JlKFQqIHRvLCBjb25zdCBQYWNrZXQmIHgsIHVuc2lnbmVkIGxvbmcgbG9uZyB1bWFzaykgY29uc3QgeworICAgIGludGVybmFsOjpwc3RvcmV1KHRvLCB4LCB1bWFzayk7CisgIH0KIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICBpbmxpbmUgUGFja2V0JiBmb3J3YXJkX3JlZmVyZW5jZShQYWNrZXQmIHBhY2tldCwgVCYgLypzY2FsYXIqLykgY29uc3QgeyByZXR1cm4gcGFja2V0OyB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgUGFja2V0JiBmb3J3YXJkX3JlZmVyZW5jZShQYWNrZXQmIHBhY2tldCwgVCYgLypzY2FsYXIqLykgY29uc3QgeworICAgIHJldHVybiBwYWNrZXQ7CisgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFBhY2tldD4KLXN0cnVjdCBwYWNrZXRfaGVscGVyPGZhbHNlLFBhY2tldD4KLXsKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgaW5saW5lIFQgbG9hZChjb25zdCBUKiBmcm9tKSBjb25zdCB7IHJldHVybiAqZnJvbTsgfQordGVtcGxhdGUgPHR5cGVuYW1lIFBhY2tldD4KK3N0cnVjdCBwYWNrZXRfaGVscGVyPGZhbHNlLCBQYWNrZXQ+IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSBUIGxvYWQoY29uc3QgVCogZnJvbSkgY29uc3QgeworICAgIHJldHVybiAqZnJvbTsKKyAgfQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIGlubGluZSBUIGxvYWR1KGNvbnN0IFQqIGZyb20pIGNvbnN0IHsgcmV0dXJuICpmcm9tOyB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgVCBsb2FkdShjb25zdCBUKiBmcm9tKSBjb25zdCB7CisgICAgcmV0dXJuICpmcm9tOworICB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgaW5saW5lIFQgbG9hZChjb25zdCBUKiBmcm9tLCB1bnNpZ25lZCBsb25nIGxvbmcpIGNvbnN0IHsgcmV0dXJuICpmcm9tOyB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBpbmxpbmUgVCBsb2FkKGNvbnN0IFQqIGZyb20sIHVuc2lnbmVkIGxvbmcgbG9uZykgY29uc3QgeworICAgIHJldHVybiAqZnJvbTsKKyAgfQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIGlubGluZSB2b2lkIHN0b3JlKFQqIHRvLCBjb25zdCBUJiB4KSBjb25zdCB7ICp0byA9IHg7IH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSB2b2lkIHN0b3JlKFQqIHRvLCBjb25zdCBUJiB4KSBjb25zdCB7CisgICAgKnRvID0geDsKKyAgfQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIGlubGluZSB2b2lkIHN0b3JlKFQqIHRvLCBjb25zdCBUJiB4LCB1bnNpZ25lZCBsb25nIGxvbmcpIGNvbnN0IHsgKnRvID0geDsgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIHZvaWQgc3RvcmUoVCogdG8sIGNvbnN0IFQmIHgsIHVuc2lnbmVkIGxvbmcgbG9uZykgY29uc3QgeworICAgICp0byA9IHg7CisgIH0KIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICBpbmxpbmUgVCYgZm9yd2FyZF9yZWZlcmVuY2UoUGFja2V0JiAvKnBhY2tldCovLCBUJiBzY2FsYXIpIGNvbnN0IHsgcmV0dXJuIHNjYWxhcjsgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgaW5saW5lIFQmIGZvcndhcmRfcmVmZXJlbmNlKFBhY2tldCYgLypwYWNrZXQqLywgVCYgc2NhbGFyKSBjb25zdCB7CisgICAgcmV0dXJuIHNjYWxhcjsKKyAgfQogfTsKIAotI2RlZmluZSBDSEVDS19DV0lTRTFfSUYoQ09ORCwgUkVGT1AsIFBPUCkgaWYoQ09ORCkgeyBcCi0gIHRlc3Q6OnBhY2tldF9oZWxwZXI8Q09ORCxQYWNrZXQ+IGg7IFwKLSAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemU7ICsraSkgXAotICAgIHJlZltpXSA9IFNjYWxhcihSRUZPUChkYXRhMVtpXSkpOyBcCi0gIGguc3RvcmUoZGF0YTIsIFBPUChoLmxvYWQoZGF0YTEpKSk7IFwKLSAgVkVSSUZZKHRlc3Q6OmFyZUFwcHJveChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAjUE9QKTsgXAotfQorI2RlZmluZSBDSEVDS19DV0lTRTFfSUYoQ09ORCwgUkVGT1AsIFBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoQ09ORCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3Q6OnBhY2tldF9oZWxwZXI8Q09ORCwgUGFja2V0PiBoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSByZWZbaV0gPSBTY2FsYXIoUkVGT1AoZGF0YTFbaV0pKTsgXAorICAgIGguc3RvcmUoZGF0YTIsIFBPUChoLmxvYWQoZGF0YTEpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZFUklGWSh0ZXN0OjphcmVBcHByb3gocmVmLCBkYXRhMiwgUGFja2V0U2l6ZSkgJiYgI1BPUCk7ICAgICAgICAgICAgICAgXAorICB9CiAKLSNkZWZpbmUgQ0hFQ0tfQ1dJU0UxX0VYQUNUX0lGKENPTkQsIFJFRk9QLCBQT1ApIGlmKENPTkQpIHsgXAotICB0ZXN0OjpwYWNrZXRfaGVscGVyPENPTkQsUGFja2V0PiBoOyBcCi0gIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpIFwKLSAgICByZWZbaV0gPSBTY2FsYXIoUkVGT1AoZGF0YTFbaV0pKTsgXAotICBoLnN0b3JlKGRhdGEyLCBQT1AoaC5sb2FkKGRhdGExKSkpOyBcCi0gIFZFUklGWSh0ZXN0OjphcmVFcXVhbChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAjUE9QKTsgXAotfQorI2RlZmluZSBDSEVDS19DV0lTRTFfRVhBQ1RfSUYoQ09ORCwgUkVGT1AsIFBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoQ09ORCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlc3Q6OnBhY2tldF9oZWxwZXI8Q09ORCwgUGFja2V0PiBoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSByZWZbaV0gPSBTY2FsYXIoUkVGT1AoZGF0YTFbaV0pKTsgXAorICAgIGguc3RvcmUoZGF0YTIsIFBPUChoLmxvYWQoZGF0YTEpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZFUklGWSh0ZXN0OjphcmVFcXVhbChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAjUE9QKTsgICAgICAgICAgICAgICAgXAorICB9CiAKLSNkZWZpbmUgQ0hFQ0tfQ1dJU0UyX0lGKENPTkQsIFJFRk9QLCBQT1ApIGlmKENPTkQpIHsgXAotICB0ZXN0OjpwYWNrZXRfaGVscGVyPENPTkQsUGFja2V0PiBoOyBcCi0gIGZvciAoaW50IGk9MDsgaTxQYWNrZXRTaXplOyArK2kpIFwKLSAgICByZWZbaV0gPSBTY2FsYXIoUkVGT1AoZGF0YTFbaV0sIGRhdGExW2krUGFja2V0U2l6ZV0pKTsgICAgIFwKLSAgaC5zdG9yZShkYXRhMiwgUE9QKGgubG9hZChkYXRhMSksaC5sb2FkKGRhdGExK1BhY2tldFNpemUpKSk7IFwKLSAgVkVSSUZZKHRlc3Q6OmFyZUFwcHJveChyZWYsIGRhdGEyLCBQYWNrZXRTaXplKSAmJiAjUE9QKTsgXAotfQorI2RlZmluZSBDSEVDS19DV0lTRTJfSUYoQ09ORCwgUkVGT1AsIFBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChDT05EKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0OjpwYWNrZXRfaGVscGVyPENPTkQsIFBhY2tldD4gaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSByZWZbaV0gPSBTY2FsYXIoUkVGT1AoZGF0YTFbaV0sIGRhdGExW2kgKyBQYWNrZXRTaXplXSkpOyBcCisgICAgaC5zdG9yZShkYXRhMiwgUE9QKGgubG9hZChkYXRhMSksIGgubG9hZChkYXRhMSArIFBhY2tldFNpemUpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWRVJJRlkodGVzdDo6YXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICNQT1ApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKIC8vIE9uZSBpbnB1dCwgb25lIG91dHB1dCBieSByZWZlcmVuY2UuCi0jZGVmaW5lIENIRUNLX0NXSVNFMV9CWVJFRjFfSUYoQ09ORCwgUkVGT1AsIFBPUCkgaWYoQ09ORCkgeyBcCi0gIHRlc3Q6OnBhY2tldF9oZWxwZXI8Q09ORCxQYWNrZXQ+IGg7IFwKLSAgZm9yIChpbnQgaT0wOyBpPFBhY2tldFNpemU7ICsraSkgXAotICAgIHJlZltpXSA9IFNjYWxhcihSRUZPUChkYXRhMVtpXSwgcmVmW2krUGFja2V0U2l6ZV0pKTsgICAgIFwKLSAgUGFja2V0IHBvdXQ7IFwKLSAgU2NhbGFyIHNvdXQ7IFwKLSAgaC5zdG9yZShkYXRhMiwgUE9QKGgubG9hZChkYXRhMSksIGguZm9yd2FyZF9yZWZlcmVuY2UocG91dCwgc291dCkpKTsgXAotICBoLnN0b3JlKGRhdGEyK1BhY2tldFNpemUsIGguZm9yd2FyZF9yZWZlcmVuY2UocG91dCwgc291dCkpOyBcCi0gIFZFUklGWSh0ZXN0OjphcmVBcHByb3gocmVmLCBkYXRhMiwgMiAqIFBhY2tldFNpemUpICYmICNQT1ApOyBcCi19CisjZGVmaW5lIENIRUNLX0NXSVNFMV9CWVJFRjFfSUYoQ09ORCwgUkVGT1AsIFBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChDT05EKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVzdDo6cGFja2V0X2hlbHBlcjxDT05ELCBQYWNrZXQ+IGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQYWNrZXRTaXplOyArK2kpIHJlZltpXSA9IFNjYWxhcihSRUZPUChkYXRhMVtpXSwgcmVmW2kgKyBQYWNrZXRTaXplXSkpOyBcCisgICAgUGFja2V0IHBvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU2NhbGFyIHNvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaC5zdG9yZShkYXRhMiwgUE9QKGgubG9hZChkYXRhMSksIGguZm9yd2FyZF9yZWZlcmVuY2UocG91dCwgc291dCkpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaC5zdG9yZShkYXRhMiArIFBhY2tldFNpemUsIGguZm9yd2FyZF9yZWZlcmVuY2UocG91dCwgc291dCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVkVSSUZZKHRlc3Q6OmFyZUFwcHJveChyZWYsIGRhdGEyLCAyICogUGFja2V0U2l6ZSkgJiYgI1BPUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KIAotI2RlZmluZSBDSEVDS19DV0lTRTNfSUYoQ09ORCwgUkVGT1AsIFBPUCkgaWYgKENPTkQpIHsgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZXN0OjpwYWNrZXRfaGVscGVyPENPTkQsIFBhY2tldD4gaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBmb3IgKGludCBpID0gMDsgaSA8IFBhY2tldFNpemU7ICsraSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJlZltpXSA9IFNjYWxhcihSRUZPUChkYXRhMVtpXSwgZGF0YTFbaSArIFBhY2tldFNpemVdLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMVtpICsgMiAqIFBhY2tldFNpemVdKSk7ICAgICAgICAgICAgICAgICAgICAgXAotICBoLnN0b3JlKGRhdGEyLCBQT1AoaC5sb2FkKGRhdGExKSwgaC5sb2FkKGRhdGExICsgUGFja2V0U2l6ZSksICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgaC5sb2FkKGRhdGExICsgMiAqIFBhY2tldFNpemUpKSk7ICAgICAgICAgICAgICAgICAgICAgXAotICBWRVJJRlkodGVzdDo6YXJlQXBwcm94KHJlZiwgZGF0YTIsIFBhY2tldFNpemUpICYmICNQT1ApOyAgICAgICAgICAgICAgICAgXAotfQorI2RlZmluZSBDSEVDS19DV0lTRTNfSUYoQ09ORCwgUkVGT1AsIFBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKENPTkQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVzdDo6cGFja2V0X2hlbHBlcjxDT05ELCBQYWNrZXQ+IGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUGFja2V0U2l6ZTsgKytpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJlZltpXSA9IFNjYWxhcihSRUZPUChkYXRhMVtpXSwgZGF0YTFbaSArIFBhY2tldFNpemVdLCBkYXRhMVtpICsgMiAqIFBhY2tldFNpemVdKSk7ICAgICAgICAgICBcCisgICAgaC5zdG9yZShkYXRhMiwgUE9QKGgubG9hZChkYXRhMSksIGgubG9hZChkYXRhMSArIFBhY2tldFNpemUpLCBoLmxvYWQoZGF0YTEgKyAyICogUGFja2V0U2l6ZSkpKTsgXAorICAgIFZFUklGWSh0ZXN0OjphcmVBcHByb3gocmVmLCBkYXRhMiwgUGFja2V0U2l6ZSkgJiYgI1BPUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCiAvLyBTcGVjaWFsaXplIHRoZSBydW5hbGwgc3RydWN0IGluIHlvdXIgdGVzdCBmaWxlIGJ5IGRlZmluaW5nIHJ1bigpLgotdGVtcGxhdGU8Ci0gIHR5cGVuYW1lIFNjYWxhciwKLSAgdHlwZW5hbWUgUGFja2V0VHlwZSwKLSAgYm9vbCBJc0NvbXBsZXggPSBOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4LAotICBib29sIElzSW50ZWdlciA9IE51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXI+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBQYWNrZXRUeXBlLCBib29sIElzQ29tcGxleCA9IE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgsCisgICAgICAgICAgYm9vbCBJc0ludGVnZXIgPSBOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyPgogc3RydWN0IHJ1bmFsbDsKIAotdGVtcGxhdGU8Ci0gIHR5cGVuYW1lIFNjYWxhciwKLSAgdHlwZW5hbWUgUGFja2V0VHlwZSA9IHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGUsCi0gIGJvb2wgVmVjdG9yaXplZCA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OlZlY3Rvcml6YWJsZSwKLSAgYm9vbCBIYXNIYWxmID0gIWludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0VHlwZT46OmhhbGYsUGFja2V0VHlwZT46OnZhbHVlID4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBhY2tldFR5cGUgPSB0eXBlbmFtZSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+Ojp0eXBlLAorICAgICAgICAgIGJvb2wgVmVjdG9yaXplZCA9IGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OlZlY3Rvcml6YWJsZSwKKyAgICAgICAgICBib29sIEhhc0hhbGYgPSAhaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxQYWNrZXRUeXBlPjo6aGFsZiwgUGFja2V0VHlwZT46OnZhbHVlPgogc3RydWN0IHJ1bm5lcjsKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIFBhY2tldFR5cGU+Ci1zdHJ1Y3QgcnVubmVyPFNjYWxhcixQYWNrZXRUeXBlLHRydWUsdHJ1ZT4KLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBhY2tldFR5cGU+CitzdHJ1Y3QgcnVubmVyPFNjYWxhciwgUGFja2V0VHlwZSwgdHJ1ZSwgdHJ1ZT4gewogICBzdGF0aWMgdm9pZCBydW4oKSB7Ci0gICAgcnVuYWxsPFNjYWxhcixQYWNrZXRUeXBlPjo6cnVuKCk7Ci0gICAgcnVubmVyPFNjYWxhcix0eXBlbmFtZSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFR5cGU+OjpoYWxmPjo6cnVuKCk7CisgICAgcnVuYWxsPFNjYWxhciwgUGFja2V0VHlwZT46OnJ1bigpOworICAgIHJ1bm5lcjxTY2FsYXIsIHR5cGVuYW1lIGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0VHlwZT46OmhhbGY+OjpydW4oKTsKICAgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIFBhY2tldFR5cGU+Ci1zdHJ1Y3QgcnVubmVyPFNjYWxhcixQYWNrZXRUeXBlLHRydWUsZmFsc2U+Ci17Ci0gIHN0YXRpYyB2b2lkIHJ1bigpIHsKLSAgICBydW5hbGw8U2NhbGFyLFBhY2tldFR5cGU+OjpydW4oKTsKLSAgfQordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUGFja2V0VHlwZT4KK3N0cnVjdCBydW5uZXI8U2NhbGFyLCBQYWNrZXRUeXBlLCB0cnVlLCBmYWxzZT4geworICBzdGF0aWMgdm9pZCBydW4oKSB7IHJ1bmFsbDxTY2FsYXIsIFBhY2tldFR5cGU+OjpydW4oKTsgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIFBhY2tldFR5cGU+Ci1zdHJ1Y3QgcnVubmVyPFNjYWxhcixQYWNrZXRUeXBlLGZhbHNlLGZhbHNlPgotewotICBzdGF0aWMgdm9pZCBydW4oKSB7Ci0gICAgcnVuYWxsPFNjYWxhcixQYWNrZXRUeXBlPjo6cnVuKCk7Ci0gIH0KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFBhY2tldFR5cGU+CitzdHJ1Y3QgcnVubmVyPFNjYWxhciwgUGFja2V0VHlwZSwgZmFsc2UsIGZhbHNlPiB7CisgIHN0YXRpYyB2b2lkIHJ1bigpIHsgcnVuYWxsPFNjYWxhciwgUGFja2V0VHlwZT46OnJ1bigpOyB9CiB9OwogCi19Ci19Cit9ICAvLyBuYW1lc3BhY2UgdGVzdAorfSAgLy8gbmFtZXNwYWNlIEVpZ2VuCmRpZmYgLS1naXQgYS90ZXN0L3BhcmRpc29fc3VwcG9ydC5jcHAgYi90ZXN0L3BhcmRpc29fc3VwcG9ydC5jcHAKaW5kZXggOWMxNmRlZC4uODM1ODU0MSAxMDA2NDQKLS0tIGEvdGVzdC9wYXJkaXNvX3N1cHBvcnQuY3BwCisrKyBiL3Rlc3QvcGFyZGlzb19zdXBwb3J0LmNwcApAQCAtMSwxNyArMSwxNyBAQAotLyogCisvKgogICAgSW50ZWwgQ29weXJpZ2h0IChDKSAuLi4uCiAqLwogCiAjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgogI2luY2x1ZGUgPEVpZ2VuL1BhcmRpc29TdXBwb3J0PgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHRlc3RfcGFyZGlzb19UKCkKLXsKLSAgUGFyZGlzb0xMVCA8IFNwYXJzZU1hdHJpeDxULCBSb3dNYWpvcj4sIExvd2VyPiBwYXJkaXNvX2xsdF9sb3dlcjsKLSAgUGFyZGlzb0xMVCA8IFNwYXJzZU1hdHJpeDxULCBSb3dNYWpvcj4sIFVwcGVyPiBwYXJkaXNvX2xsdF91cHBlcjsKLSAgUGFyZGlzb0xETFQgPCBTcGFyc2VNYXRyaXg8VCwgUm93TWFqb3I+LCBMb3dlcj4gcGFyZGlzb19sZGx0X2xvd2VyOwotICBQYXJkaXNvTERMVCA8IFNwYXJzZU1hdHJpeDxULCBSb3dNYWpvcj4sIFVwcGVyPiBwYXJkaXNvX2xkbHRfdXBwZXI7Ci0gIFBhcmRpc29MVSAgPCBTcGFyc2VNYXRyaXg8VCwgUm93TWFqb3I+ID4gcGFyZGlzb19sdTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCB0ZXN0X3BhcmRpc29fVCgpIHsKKyAgUGFyZGlzb0xMVDxTcGFyc2VNYXRyaXg8VCwgUm93TWFqb3I+LCBMb3dlcj4gcGFyZGlzb19sbHRfbG93ZXI7CisgIFBhcmRpc29MTFQ8U3BhcnNlTWF0cml4PFQsIFJvd01ham9yPiwgVXBwZXI+IHBhcmRpc29fbGx0X3VwcGVyOworICBQYXJkaXNvTERMVDxTcGFyc2VNYXRyaXg8VCwgUm93TWFqb3I+LCBMb3dlcj4gcGFyZGlzb19sZGx0X2xvd2VyOworICBQYXJkaXNvTERMVDxTcGFyc2VNYXRyaXg8VCwgUm93TWFqb3I+LCBVcHBlcj4gcGFyZGlzb19sZGx0X3VwcGVyOworICBQYXJkaXNvTFU8U3BhcnNlTWF0cml4PFQsIFJvd01ham9yPiA+IHBhcmRpc29fbHU7CiAKICAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKHBhcmRpc29fbGx0X2xvd2VyKTsKICAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKHBhcmRpc29fbGx0X3VwcGVyKTsKQEAgLTIwLDEwICsyMCw5IEBACiAgIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhwYXJkaXNvX2x1KTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHBhcmRpc29fc3VwcG9ydCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChwYXJkaXNvX3N1cHBvcnQpIHsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9wYXJkaXNvX1Q8ZmxvYXQ+KCkpOwogICBDQUxMX1NVQlRFU1RfMih0ZXN0X3BhcmRpc29fVDxkb3VibGU+KCkpOwotICBDQUxMX1NVQlRFU1RfMyh0ZXN0X3BhcmRpc29fVDwgc3RkOjpjb21wbGV4PGZsb2F0PiA+KCkpOwotICBDQUxMX1NVQlRFU1RfNCh0ZXN0X3BhcmRpc29fVDwgc3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdF9wYXJkaXNvX1Q8c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkpOworICBDQUxMX1NVQlRFU1RfNCh0ZXN0X3BhcmRpc29fVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9wYXN0aXhfc3VwcG9ydC5jcHAgYi90ZXN0L3Bhc3RpeF9zdXBwb3J0LmNwcAppbmRleCA5YjY0NDE3Li5lNDg3ZGQxIDEwMDY0NAotLS0gYS90ZXN0L3Bhc3RpeF9zdXBwb3J0LmNwcAorKysgYi90ZXN0L3Bhc3RpeF9zdXBwb3J0LmNwcApAQCAtMTMsMTQgKzEzLDEzIEBACiAjaW5jbHVkZSA8RWlnZW4vUGFTdGlYU3VwcG9ydD4KICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9TcGFyc2VFeHRyYT4KIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHRlc3RfcGFzdGl4X1QoKQotewotICBQYXN0aXhMTFQ8IFNwYXJzZU1hdHJpeDxULCBDb2xNYWpvcj4sIEVpZ2VuOjpMb3dlciA+IHBhc3RpeF9sbHRfbG93ZXI7Ci0gIFBhc3RpeExETFQ8IFNwYXJzZU1hdHJpeDxULCBDb2xNYWpvcj4sIEVpZ2VuOjpMb3dlciA+IHBhc3RpeF9sZGx0X2xvd2VyOwotICBQYXN0aXhMTFQ8IFNwYXJzZU1hdHJpeDxULCBDb2xNYWpvcj4sIEVpZ2VuOjpVcHBlciA+IHBhc3RpeF9sbHRfdXBwZXI7Ci0gIFBhc3RpeExETFQ8IFNwYXJzZU1hdHJpeDxULCBDb2xNYWpvcj4sIEVpZ2VuOjpVcHBlciA+IHBhc3RpeF9sZGx0X3VwcGVyOwotICBQYXN0aXhMVTwgU3BhcnNlTWF0cml4PFQsIENvbE1ham9yPiA+IHBhc3RpeF9sdTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCB0ZXN0X3Bhc3RpeF9UKCkgeworICBQYXN0aXhMTFQ8U3BhcnNlTWF0cml4PFQsIENvbE1ham9yPiwgRWlnZW46Okxvd2VyPiBwYXN0aXhfbGx0X2xvd2VyOworICBQYXN0aXhMRExUPFNwYXJzZU1hdHJpeDxULCBDb2xNYWpvcj4sIEVpZ2VuOjpMb3dlcj4gcGFzdGl4X2xkbHRfbG93ZXI7CisgIFBhc3RpeExMVDxTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+LCBFaWdlbjo6VXBwZXI+IHBhc3RpeF9sbHRfdXBwZXI7CisgIFBhc3RpeExETFQ8U3BhcnNlTWF0cml4PFQsIENvbE1ham9yPiwgRWlnZW46OlVwcGVyPiBwYXN0aXhfbGRsdF91cHBlcjsKKyAgUGFzdGl4TFU8U3BhcnNlTWF0cml4PFQsIENvbE1ham9yPiA+IHBhc3RpeF9sdTsKIAogICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcocGFzdGl4X2xsdF9sb3dlcik7CiAgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhwYXN0aXhfbGRsdF9sb3dlcik7CkBAIC0zNywxOCArMzYsMTcgQEAKICAgcGFzdGl4X2x1LmRwYXJtKCk7CiB9CiAKLS8vIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlbGZhZGpvaW50IG1hdHJpY2VzIHdpdGggUGFTdGlYLiAKKy8vIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlbGZhZGpvaW50IG1hdHJpY2VzIHdpdGggUGFTdGlYLgogLy8gQ29tcGxleCBzeW1tZXRyaWMgbWF0cmljZXMgc2hvdWxkIHBhc3MgdGhvdWdoCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHRlc3RfcGFzdGl4X1RfTFUoKQotewotICBQYXN0aXhMVTwgU3BhcnNlTWF0cml4PFQsIENvbE1ham9yPiA+IHBhc3RpeF9sdTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCB0ZXN0X3Bhc3RpeF9UX0xVKCkgeworICBQYXN0aXhMVTxTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+ID4gcGFzdGl4X2x1OwogICBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcocGFzdGl4X2x1KTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHBhc3RpeF9zdXBwb3J0KQoteworRUlHRU5fREVDTEFSRV9URVNUKHBhc3RpeF9zdXBwb3J0KSB7CiAgIENBTExfU1VCVEVTVF8xKHRlc3RfcGFzdGl4X1Q8ZmxvYXQ+KCkpOwogICBDQUxMX1NVQlRFU1RfMih0ZXN0X3Bhc3RpeF9UPGRvdWJsZT4oKSk7Ci0gIENBTExfU1VCVEVTVF8zKCAodGVzdF9wYXN0aXhfVF9MVTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSkgKTsKKyAgQ0FMTF9TVUJURVNUXzMoKHRlc3RfcGFzdGl4X1RfTFU8c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkpKTsKICAgQ0FMTF9TVUJURVNUXzQodGVzdF9wYXN0aXhfVF9MVTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOwotfSAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvcGVybXV0YXRpb25tYXRyaWNlcy5jcHAgYi90ZXN0L3Blcm11dGF0aW9ubWF0cmljZXMuY3BwCmluZGV4IGQ0YjY4YjIuLjJjODM3ODMgMTAwNjQ0Ci0tLSBhL3Rlc3QvcGVybXV0YXRpb25tYXRyaWNlcy5jcHAKKysrIGIvdGVzdC9wZXJtdXRhdGlvbm1hdHJpY2VzLmNwcApAQCAtOCwxNSArOCwxNCBAQAogLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCiAKICNkZWZpbmUgVEVTVF9FTkFCTEVfVEVNUE9SQVJZX1RSQUNLSU5HCi0gIAorCiAjaW5jbHVkZSAibWFpbi5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBwZXJtdXRhdGlvbm1hdHJpY2VzKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcGVybXV0YXRpb25tYXRyaWNlcyhjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKLSAgZW51bSB7IFJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAotICAgICAgICAgT3B0aW9ucyA9IE1hdHJpeFR5cGU6Ok9wdGlvbnMgfTsKKyAgZW51bSB7IFJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCBPcHRpb25zID0gTWF0cml4VHlwZTo6T3B0aW9ucyB9OwogICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PFJvd3M+IExlZnRQZXJtdXRhdGlvblR5cGU7CiAgIHR5cGVkZWYgVHJhbnNwb3NpdGlvbnM8Um93cz4gTGVmdFRyYW5zcG9zaXRpb25zVHlwZTsKICAgdHlwZWRlZiBNYXRyaXg8aW50LCBSb3dzLCAxPiBMZWZ0UGVybXV0YXRpb25WZWN0b3JUeXBlOwpAQCAtMjksNyArMjgsNyBAQAogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKIAotICBNYXRyaXhUeXBlIG1fb3JpZ2luYWwgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBtX29yaWdpbmFsID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOwogICBMZWZ0UGVybXV0YXRpb25WZWN0b3JUeXBlIGx2OwogICByYW5kb21QZXJtdXRhdGlvblZlY3Rvcihsdiwgcm93cyk7CiAgIExlZnRQZXJtdXRhdGlvblR5cGUgbHAobHYpOwpAQCAtMzgsNzggKzM3LDgzIEBACiAgIFJpZ2h0UGVybXV0YXRpb25UeXBlIHJwKHJ2KTsKICAgTGVmdFRyYW5zcG9zaXRpb25zVHlwZSBsdChsdik7CiAgIFJpZ2h0VHJhbnNwb3NpdGlvbnNUeXBlIHJ0KHJ2KTsKLSAgTWF0cml4VHlwZSBtX3Blcm11dGVkID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7Ci0gIAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtX3Blcm11dGVkID0gbHAgKiBtX29yaWdpbmFsICogcnAsIDEpOyAvLyAxIHRlbXAgZm9yIHN1YiBleHByZXNzaW9uICJscCAqIG1fb3JpZ2luYWwiCisgIE1hdHJpeFR5cGUgbV9wZXJtdXRlZCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKIAotICBmb3IgKGludCBpPTA7IGk8cm93czsgaSsrKQotICAgIGZvciAoaW50IGo9MDsgajxjb2xzOyBqKyspCi0gICAgICAgIFZFUklGWV9JU19BUFBST1gobV9wZXJtdXRlZChsdihpKSxqKSwgbV9vcmlnaW5hbChpLHJ2KGopKSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG1fcGVybXV0ZWQgPSBscCAqIG1fb3JpZ2luYWwgKiBycCwgMSk7ICAvLyAxIHRlbXAgZm9yIHN1YiBleHByZXNzaW9uICJscCAqIG1fb3JpZ2luYWwiCiAKLSAgTWF0cml4PFNjYWxhcixSb3dzLFJvd3M+IGxtKGxwKTsKLSAgTWF0cml4PFNjYWxhcixDb2xzLENvbHM+IHJtKHJwKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspIFZFUklGWV9JU19BUFBST1gobV9wZXJtdXRlZChsdihpKSwgaiksIG1fb3JpZ2luYWwoaSwgcnYoaikpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKG1fcGVybXV0ZWQsIGxtKm1fb3JpZ2luYWwqcm0pOwotICAKKyAgTWF0cml4PFNjYWxhciwgUm93cywgUm93cz4gbG0obHApOworICBNYXRyaXg8U2NhbGFyLCBDb2xzLCBDb2xzPiBybShycCk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkLCBsbSAqIG1fb3JpZ2luYWwgKiBybSk7CisKICAgbV9wZXJtdXRlZCA9IG1fb3JpZ2luYWw7CiAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG1fcGVybXV0ZWQgPSBscCAqIG1fcGVybXV0ZWQgKiBycCwgMSk7Ci0gIFZFUklGWV9JU19BUFBST1gobV9wZXJtdXRlZCwgbG0qbV9vcmlnaW5hbCpybSk7CisgIFZFUklGWV9JU19BUFBST1gobV9wZXJtdXRlZCwgbG0gKiBtX29yaWdpbmFsICogcm0pOwogCiAgIExlZnRQZXJtdXRhdGlvblR5cGUgbHBpOwogICBscGkgPSBscC5pbnZlcnNlKCk7Ci0gIFZFUklGWV9JU19BUFBST1gobHBpKm1fcGVybXV0ZWQsbHAuaW52ZXJzZSgpKm1fcGVybXV0ZWQpOworICBWRVJJRllfSVNfQVBQUk9YKGxwaSAqIG1fcGVybXV0ZWQsIGxwLmludmVyc2UoKSAqIG1fcGVybXV0ZWQpOwogCi0gIFZFUklGWV9JU19BUFBST1gobHAuaW52ZXJzZSgpKm1fcGVybXV0ZWQqcnAuaW52ZXJzZSgpLCBtX29yaWdpbmFsKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChsdi5hc1Blcm11dGF0aW9uKCkuaW52ZXJzZSgpKm1fcGVybXV0ZWQqcnYuYXNQZXJtdXRhdGlvbigpLmludmVyc2UoKSwgbV9vcmlnaW5hbCk7Ci0gIFZFUklGWV9JU19BUFBST1goTWFwTGVmdFBlcm0obHYuZGF0YSgpLGx2LnNpemUoKSkuaW52ZXJzZSgpKm1fcGVybXV0ZWQqTWFwUmlnaHRQZXJtKHJ2LmRhdGEoKSxydi5zaXplKCkpLmludmVyc2UoKSwgbV9vcmlnaW5hbCk7Ci0gIAotICBWRVJJRlkoKGxwKmxwLmludmVyc2UoKSkudG9EZW5zZU1hdHJpeCgpLmlzSWRlbnRpdHkoKSk7Ci0gIFZFUklGWSgobHYuYXNQZXJtdXRhdGlvbigpKmx2LmFzUGVybXV0YXRpb24oKS5pbnZlcnNlKCkpLnRvRGVuc2VNYXRyaXgoKS5pc0lkZW50aXR5KCkpOwotICBWRVJJRlkoKE1hcExlZnRQZXJtKGx2LmRhdGEoKSxsdi5zaXplKCkpKk1hcExlZnRQZXJtKGx2LmRhdGEoKSxsdi5zaXplKCkpLmludmVyc2UoKSkudG9EZW5zZU1hdHJpeCgpLmlzSWRlbnRpdHkoKSk7CisgIFZFUklGWV9JU19BUFBST1gobHAuaW52ZXJzZSgpICogbV9wZXJtdXRlZCAqIHJwLmludmVyc2UoKSwgbV9vcmlnaW5hbCk7CisgIFZFUklGWV9JU19BUFBST1gobHYuYXNQZXJtdXRhdGlvbigpLmludmVyc2UoKSAqIG1fcGVybXV0ZWQgKiBydi5hc1Blcm11dGF0aW9uKCkuaW52ZXJzZSgpLCBtX29yaWdpbmFsKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgKKyAgICAgIE1hcExlZnRQZXJtKGx2LmRhdGEoKSwgbHYuc2l6ZSgpKS5pbnZlcnNlKCkgKiBtX3Blcm11dGVkICogTWFwUmlnaHRQZXJtKHJ2LmRhdGEoKSwgcnYuc2l6ZSgpKS5pbnZlcnNlKCksCisgICAgICBtX29yaWdpbmFsKTsKKworICBWRVJJRlkoKGxwICogbHAuaW52ZXJzZSgpKS50b0RlbnNlTWF0cml4KCkuaXNJZGVudGl0eSgpKTsKKyAgVkVSSUZZKChsdi5hc1Blcm11dGF0aW9uKCkgKiBsdi5hc1Blcm11dGF0aW9uKCkuaW52ZXJzZSgpKS50b0RlbnNlTWF0cml4KCkuaXNJZGVudGl0eSgpKTsKKyAgVkVSSUZZKAorICAgICAgKE1hcExlZnRQZXJtKGx2LmRhdGEoKSwgbHYuc2l6ZSgpKSAqIE1hcExlZnRQZXJtKGx2LmRhdGEoKSwgbHYuc2l6ZSgpKS5pbnZlcnNlKCkpLnRvRGVuc2VNYXRyaXgoKS5pc0lkZW50aXR5KCkpOwogCiAgIExlZnRQZXJtdXRhdGlvblZlY3RvclR5cGUgbHYyOwogICByYW5kb21QZXJtdXRhdGlvblZlY3RvcihsdjIsIHJvd3MpOwogICBMZWZ0UGVybXV0YXRpb25UeXBlIGxwMihsdjIpOwotICBNYXRyaXg8U2NhbGFyLFJvd3MsUm93cz4gbG0yKGxwMik7Ci0gIFZFUklGWV9JU19BUFBST1goKGxwKmxwMikudG9EZW5zZU1hdHJpeCgpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLCBsbSpsbTIpOwotICBWRVJJRllfSVNfQVBQUk9YKChsdi5hc1Blcm11dGF0aW9uKCkqbHYyLmFzUGVybXV0YXRpb24oKSkudG9EZW5zZU1hdHJpeCgpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLCBsbSpsbTIpOwotICBWRVJJRllfSVNfQVBQUk9YKChNYXBMZWZ0UGVybShsdi5kYXRhKCksbHYuc2l6ZSgpKSpNYXBMZWZ0UGVybShsdjIuZGF0YSgpLGx2Mi5zaXplKCkpKS50b0RlbnNlTWF0cml4KCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksIGxtKmxtMik7CisgIE1hdHJpeDxTY2FsYXIsIFJvd3MsIFJvd3M+IGxtMihscDIpOworICBWRVJJRllfSVNfQVBQUk9YKChscCAqIGxwMikudG9EZW5zZU1hdHJpeCgpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLCBsbSAqIGxtMik7CisgIFZFUklGWV9JU19BUFBST1goKGx2LmFzUGVybXV0YXRpb24oKSAqIGx2Mi5hc1Blcm11dGF0aW9uKCkpLnRvRGVuc2VNYXRyaXgoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSwgbG0gKiBsbTIpOworICBWRVJJRllfSVNfQVBQUk9YKAorICAgICAgKE1hcExlZnRQZXJtKGx2LmRhdGEoKSwgbHYuc2l6ZSgpKSAqIE1hcExlZnRQZXJtKGx2Mi5kYXRhKCksIGx2Mi5zaXplKCkpKS50b0RlbnNlTWF0cml4KCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksCisgICAgICBsbSAqIGxtMik7CiAKICAgTGVmdFBlcm11dGF0aW9uVHlwZSBpZGVudGl0eXA7CiAgIGlkZW50aXR5cC5zZXRJZGVudGl0eShyb3dzKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtX29yaWdpbmFsLCBpZGVudGl0eXAqbV9vcmlnaW5hbCk7Ci0gIAorICBWRVJJRllfSVNfQVBQUk9YKG1fb3JpZ2luYWwsIGlkZW50aXR5cCAqIG1fb3JpZ2luYWwpOworCiAgIC8vIGNoZWNrIGlucGxhY2UgcGVybXV0YXRpb25zCiAgIG1fcGVybXV0ZWQgPSBtX29yaWdpbmFsOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtX3Blcm11dGVkLm5vYWxpYXMoKT0gbHAuaW52ZXJzZSgpICogbV9wZXJtdXRlZCwgMSk7IC8vIDEgdGVtcCB0byBhbGxvY2F0ZSB0aGUgbWFzawotICBWRVJJRllfSVNfQVBQUk9YKG1fcGVybXV0ZWQsIGxwLmludmVyc2UoKSptX29yaWdpbmFsKTsKLSAgCi0gIG1fcGVybXV0ZWQgPSBtX29yaWdpbmFsOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtX3Blcm11dGVkLm5vYWxpYXMoKSA9IG1fcGVybXV0ZWQgKiBycC5pbnZlcnNlKCksIDEpOyAvLyAxIHRlbXAgdG8gYWxsb2NhdGUgdGhlIG1hc2sKLSAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkLCBtX29yaWdpbmFsKnJwLmludmVyc2UoKSk7Ci0gIAotICBtX3Blcm11dGVkID0gbV9vcmlnaW5hbDsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobV9wZXJtdXRlZC5ub2FsaWFzKCkgPSBscCAqIG1fcGVybXV0ZWQsIDEpOyAvLyAxIHRlbXAgdG8gYWxsb2NhdGUgdGhlIG1hc2sKLSAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkLCBscCptX29yaWdpbmFsKTsKLSAgCi0gIG1fcGVybXV0ZWQgPSBtX29yaWdpbmFsOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtX3Blcm11dGVkLm5vYWxpYXMoKSA9IG1fcGVybXV0ZWQgKiBycCwgMSk7IC8vIDEgdGVtcCB0byBhbGxvY2F0ZSB0aGUgbWFzawotICBWRVJJRllfSVNfQVBQUk9YKG1fcGVybXV0ZWQsIG1fb3JpZ2luYWwqcnApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtX3Blcm11dGVkLm5vYWxpYXMoKSA9IGxwLmludmVyc2UoKSAqIG1fcGVybXV0ZWQsIDEpOyAgLy8gMSB0ZW1wIHRvIGFsbG9jYXRlIHRoZSBtYXNrCisgIFZFUklGWV9JU19BUFBST1gobV9wZXJtdXRlZCwgbHAuaW52ZXJzZSgpICogbV9vcmlnaW5hbCk7CiAKLSAgaWYocm93cz4xICYmIGNvbHM+MSkKLSAgeworICBtX3Blcm11dGVkID0gbV9vcmlnaW5hbDsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobV9wZXJtdXRlZC5ub2FsaWFzKCkgPSBtX3Blcm11dGVkICogcnAuaW52ZXJzZSgpLCAxKTsgIC8vIDEgdGVtcCB0byBhbGxvY2F0ZSB0aGUgbWFzaworICBWRVJJRllfSVNfQVBQUk9YKG1fcGVybXV0ZWQsIG1fb3JpZ2luYWwgKiBycC5pbnZlcnNlKCkpOworCisgIG1fcGVybXV0ZWQgPSBtX29yaWdpbmFsOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtX3Blcm11dGVkLm5vYWxpYXMoKSA9IGxwICogbV9wZXJtdXRlZCwgMSk7ICAvLyAxIHRlbXAgdG8gYWxsb2NhdGUgdGhlIG1hc2sKKyAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkLCBscCAqIG1fb3JpZ2luYWwpOworCisgIG1fcGVybXV0ZWQgPSBtX29yaWdpbmFsOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtX3Blcm11dGVkLm5vYWxpYXMoKSA9IG1fcGVybXV0ZWQgKiBycCwgMSk7ICAvLyAxIHRlbXAgdG8gYWxsb2NhdGUgdGhlIG1hc2sKKyAgVkVSSUZZX0lTX0FQUFJPWChtX3Blcm11dGVkLCBtX29yaWdpbmFsICogcnApOworCisgIGlmIChyb3dzID4gMSAmJiBjb2xzID4gMSkgewogICAgIGxwMiA9IGxwOwotICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpOworICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMSk7CiAgICAgSW5kZXggajsKLSAgICBkbyBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKTsgd2hpbGUoaj09aSk7CisgICAgZG8gaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAxKTsKKyAgICB3aGlsZSAoaiA9PSBpKTsKICAgICBscDIuYXBwbHlUcmFuc3Bvc2l0aW9uT25UaGVMZWZ0KGksIGopOwogICAgIGxtID0gbHA7CiAgICAgbG0ucm93KGkpLnN3YXAobG0ucm93KGopKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKGxtLCBscDIudG9EZW5zZU1hdHJpeCgpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpKTsKIAogICAgIFJpZ2h0UGVybXV0YXRpb25UeXBlIHJwMiA9IHJwOwotICAgIGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOwotICAgIGRvIGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOyB3aGlsZShqPT1pKTsKKyAgICBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scyAtIDEpOworICAgIGRvIGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CisgICAgd2hpbGUgKGogPT0gaSk7CiAgICAgcnAyLmFwcGx5VHJhbnNwb3NpdGlvbk9uVGhlUmlnaHQoaSwgaik7CiAgICAgcm0gPSBycDsKICAgICBybS5jb2woaSkuc3dhcChybS5jb2woaikpOwpAQCAtMTI3LDkgKzEzMSw5IEBACiAgIGxwID0gbHQ7CiAgIHJwID0gcnQ7CiAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG1fcGVybXV0ZWQgPSBsdCAqIG1fcGVybXV0ZWQgKiBydCwgMSk7Ci0gIFZFUklGWV9JU19BUFBST1gobV9wZXJtdXRlZCwgbHAqbV9vcmlnaW5hbCpycC50cmFuc3Bvc2UoKSk7Ci0gIAotICBWRVJJRllfSVNfQVBQUk9YKGx0LmludmVyc2UoKSptX3Blcm11dGVkKnJ0LmludmVyc2UoKSwgbV9vcmlnaW5hbCk7CisgIFZFUklGWV9JU19BUFBST1gobV9wZXJtdXRlZCwgbHAgKiBtX29yaWdpbmFsICogcnAudHJhbnNwb3NlKCkpOworCisgIFZFUklGWV9JU19BUFBST1gobHQuaW52ZXJzZSgpICogbV9wZXJtdXRlZCAqIHJ0LmludmVyc2UoKSwgbV9vcmlnaW5hbCk7CiAKICAgLy8gQ2hlY2sgaW5wbGFjZSB0cmFuc3Bvc2l0aW9ucwogICBtX3Blcm11dGVkID0gbV9vcmlnaW5hbDsKQEAgLTE0Miw0MCArMTQ2LDQwIEBACiAgIFZFUklGWV9JU19BUFBST1gobV9wZXJtdXRlZCA9IG1fcGVybXV0ZWQgKiBydC5pbnZlcnNlKCksIG1fb3JpZ2luYWwgKiBydC5pbnZlcnNlKCkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9pZCBidWc4OTAoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIGJ1Zzg5MCgpIHsKICAgdHlwZWRlZiBNYXRyaXg8VCwgRHluYW1pYywgRHluYW1pYz4gTWF0cml4VHlwZTsKICAgdHlwZWRlZiBNYXRyaXg8VCwgRHluYW1pYywgMT4gVmVjdG9yVHlwZTsKLSAgdHlwZWRlZiBTdHJpZGU8RHluYW1pYyxEeW5hbWljPiBTOworICB0eXBlZGVmIFN0cmlkZTxEeW5hbWljLCBEeW5hbWljPiBTOwogICB0eXBlZGVmIE1hcDxNYXRyaXhUeXBlLCBBbGlnbmVkLCBTPiBNYXBUeXBlOwogICB0eXBlZGVmIFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWM+IFBlcm07Ci0gIAorCiAgIFZlY3RvclR5cGUgdjEoMiksIHYyKDIpLCBvcCg0KSwgcmhzKDIpOwotICB2MSA8PCA2NjYsNjY3OwotICBvcCA8PCAxLDAsMCwxOwotICByaHMgPDwgNDIsNDI7Ci0gIAorICB2MSA8PCA2NjYsIDY2NzsKKyAgb3AgPDwgMSwgMCwgMCwgMTsKKyAgcmhzIDw8IDQyLCA0MjsKKwogICBQZXJtIFAoMik7CiAgIFAuaW5kaWNlcygpIDw8IDEsIDA7CiAKLSAgTWFwVHlwZSh2MS5kYXRhKCksMiwxLFMoMSwxKSkgPSBQICogTWFwVHlwZShyaHMuZGF0YSgpLDIsMSxTKDEsMSkpOworICBNYXBUeXBlKHYxLmRhdGEoKSwgMiwgMSwgUygxLCAxKSkgPSBQICogTWFwVHlwZShyaHMuZGF0YSgpLCAyLCAxLCBTKDEsIDEpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2MSwgKFAgKiByaHMpLmV2YWwoKSk7CiAKLSAgTWFwVHlwZSh2MS5kYXRhKCksMiwxLFMoMSwxKSkgPSBQLmludmVyc2UoKSAqIE1hcFR5cGUocmhzLmRhdGEoKSwyLDEsUygxLDEpKTsKKyAgTWFwVHlwZSh2MS5kYXRhKCksIDIsIDEsIFMoMSwgMSkpID0gUC5pbnZlcnNlKCkgKiBNYXBUeXBlKHJocy5kYXRhKCksIDIsIDEsIFMoMSwgMSkpOwogICBWRVJJRllfSVNfQVBQUk9YKHYxLCAoUC5pbnZlcnNlKCkgKiByaHMpLmV2YWwoKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChwZXJtdXRhdGlvbm1hdHJpY2VzKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBwZXJtdXRhdGlvbm1hdHJpY2VzKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggcGVybXV0YXRpb25tYXRyaWNlcyhNYXRyaXgzZigpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBwZXJtdXRhdGlvbm1hdHJpY2VzKE1hdHJpeDxkb3VibGUsMywzLFJvd01ham9yPigpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBwZXJtdXRhdGlvbm1hdHJpY2VzKE1hdHJpeDRkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIHBlcm11dGF0aW9ubWF0cmljZXMoTWF0cml4PGRvdWJsZSw0MCw2MD4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggcGVybXV0YXRpb25tYXRyaWNlcyhNYXRyaXg8ZG91YmxlLER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNyggcGVybXV0YXRpb25tYXRyaWNlcyhNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChwZXJtdXRhdGlvbm1hdHJpY2VzKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKHBlcm11dGF0aW9ubWF0cmljZXMoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIocGVybXV0YXRpb25tYXRyaWNlcyhNYXRyaXgzZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMocGVybXV0YXRpb25tYXRyaWNlcyhNYXRyaXg8ZG91YmxlLCAzLCAzLCBSb3dNYWpvcj4oKSkpOworICAgIENBTExfU1VCVEVTVF80KHBlcm11dGF0aW9ubWF0cmljZXMoTWF0cml4NGQoKSkpOworICAgIENBTExfU1VCVEVTVF81KHBlcm11dGF0aW9ubWF0cmljZXMoTWF0cml4PGRvdWJsZSwgNDAsIDYwPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzYocGVybXV0YXRpb25tYXRyaWNlcyhNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4oCisgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF83KHBlcm11dGF0aW9ubWF0cmljZXMoCisgICAgICAgIE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKICAgfQotICBDQUxMX1NVQlRFU1RfNSggYnVnODkwPGRvdWJsZT4oKSApOworICBDQUxMX1NVQlRFU1RfNShidWc4OTA8ZG91YmxlPigpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvcHJlY19pbnZlcnNlXzR4NC5jcHAgYi90ZXN0L3ByZWNfaW52ZXJzZV80eDQuY3BwCmluZGV4IDMzMzMyMmYuLmRjOTk2N2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvcHJlY19pbnZlcnNlXzR4NC5jcHAKKysrIGIvdGVzdC9wcmVjX2ludmVyc2VfNHg0LmNwcApAQCAtMTEsMzMgKzExLDMxIEBACiAjaW5jbHVkZSA8RWlnZW4vTFU+CiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGludmVyc2VfcGVybXV0YXRpb25fNHg0KCkKLXsKLSAgVmVjdG9yNGkgaW5kaWNlcygwLDEsMiwzKTsKLSAgZm9yKGludCBpID0gMDsgaSA8IDI0OyArK2kpCi0gIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBpbnZlcnNlX3Blcm11dGF0aW9uXzR4NCgpIHsKKyAgVmVjdG9yNGkgaW5kaWNlcygwLCAxLCAyLCAzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgKytpKSB7CiAgICAgTWF0cml4VHlwZSBtID0gUGVybXV0YXRpb25NYXRyaXg8ND4oaW5kaWNlcyk7CiAgICAgTWF0cml4VHlwZSBpbnYgPSBtLmludmVyc2UoKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0qaW52LCBNYXRyaXhUeXBlOjpJZGVudGl0eSgpKTsKLSAgICBzdGQ6Om5leHRfcGVybXV0YXRpb24oaW5kaWNlcy5kYXRhKCksaW5kaWNlcy5kYXRhKCkrNCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtICogaW52LCBNYXRyaXhUeXBlOjpJZGVudGl0eSgpKTsKKyAgICBzdGQ6Om5leHRfcGVybXV0YXRpb24oaW5kaWNlcy5kYXRhKCksIGluZGljZXMuZGF0YSgpICsgNCk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBpbnZlcnNlX2dlbmVyYWxfNHg0KGludCByZXBlYXQpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgaW52ZXJzZV9nZW5lcmFsXzR4NChpbnQgcmVwZWF0KSB7CiAgIHVzaW5nIHN0ZDo6YWJzOwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIGRvdWJsZSBlcnJvcl9zdW0gPSAwLiwgZXJyb3JfbWF4ID0gMC47Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCByZXBlYXQ7ICsraSkKLSAgeworICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGVhdDsgKytpKSB7CiAgICAgTWF0cml4VHlwZSBtOwogICAgIGJvb2wgaXNfaW52ZXJ0aWJsZTsKICAgICBkbyB7CiAgICAgICBtID0gTWF0cml4VHlwZTo6UmFuZG9tKCk7CiAgICAgICBpc19pbnZlcnRpYmxlID0gRWlnZW46OkZ1bGxQaXZMVTxNYXRyaXhUeXBlPihtKS5pc0ludmVydGlibGUoKTsKLSAgICB9IHdoaWxlKCFpc19pbnZlcnRpYmxlKTsKKyAgICB9IHdoaWxlICghaXNfaW52ZXJ0aWJsZSk7CiAgICAgTWF0cml4VHlwZSBpbnYgPSBtLmludmVyc2UoKTsKLSAgICBkb3VibGUgZXJyb3IgPSBkb3VibGUoIChtKmludi1NYXRyaXhUeXBlOjpJZGVudGl0eSgpKS5ub3JtKCkpOworICAgIGRvdWJsZSBlcnJvciA9IGRvdWJsZSgobSAqIGludiAtIE1hdHJpeFR5cGU6OklkZW50aXR5KCkpLm5vcm0oKSk7CiAgICAgZXJyb3Jfc3VtICs9IGVycm9yOwogICAgIGVycm9yX21heCA9IChzdGQ6Om1heCkoZXJyb3JfbWF4LCBlcnJvcik7CiAgIH0KQEAgLTQ1LDM0ICs0MywzMyBAQAogICBkb3VibGUgZXJyb3JfYXZnID0gZXJyb3Jfc3VtIC8gcmVwZWF0OwogICBFSUdFTl9ERUJVR19WQVIoZXJyb3JfYXZnKTsKICAgRUlHRU5fREVCVUdfVkFSKGVycm9yX21heCk7Ci0gICAvLyBGSVhNRSB0aGF0IDEuMjUgdXNlZCB0byBiZSBhIDEuMCB1bnRpbCB0aGUgTnVtVHJhaXRzIGNoYW5nZXMgb24gMjggQXByaWwgMjAxMCwgd2hhdCdzIGdvaW5nIHdyb25nPz8KLSAgIC8vIEZJWE1FIHRoYXQgMS4yNSB1c2VkIHRvIGJlIDEuMiB1bnRpbCB3ZSB0ZXN0ZWQgZ2NjIDQuMSBvbiAzMCBKdW5lIDIwMTAgYW5kIGdvdCAxLjIxLgorICAvLyBGSVhNRSB0aGF0IDEuMjUgdXNlZCB0byBiZSBhIDEuMCB1bnRpbCB0aGUgTnVtVHJhaXRzIGNoYW5nZXMgb24gMjggQXByaWwgMjAxMCwgd2hhdCdzIGdvaW5nIHdyb25nPz8KKyAgLy8gRklYTUUgdGhhdCAxLjI1IHVzZWQgdG8gYmUgMS4yIHVudGlsIHdlIHRlc3RlZCBnY2MgNC4xIG9uIDMwIEp1bmUgMjAxMCBhbmQgZ290IDEuMjEuCiAgIFZFUklGWShlcnJvcl9hdmcgPCAoTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCA/IDguMCA6IDEuMjUpKTsKICAgVkVSSUZZKGVycm9yX21heCA8IChOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ID8gNjQuMCA6IDIwLjApKTsKIAogICB7Ci0gICAgaW50IHMgPSA1Oy8vaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDQsMTApOwotICAgIGludCBpID0gMDsvL2ludGVybmFsOjpyYW5kb208aW50PigwLHMtNCk7Ci0gICAgaW50IGogPSAwOy8vaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscy00KTsKLSAgICBNYXRyaXg8U2NhbGFyLDUsNT4gbWF0KHMscyk7CisgICAgaW50IHMgPSA1OyAgLy8gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDQsMTApOworICAgIGludCBpID0gMDsgIC8vIGludGVybmFsOjpyYW5kb208aW50PigwLHMtNCk7CisgICAgaW50IGogPSAwOyAgLy8gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscy00KTsKKyAgICBNYXRyaXg8U2NhbGFyLCA1LCA1PiBtYXQocywgcyk7CiAgICAgbWF0LnNldFJhbmRvbSgpOwotICAgIE1hdHJpeFR5cGUgc3VibWF0ID0gbWF0LnRlbXBsYXRlIGJsb2NrPDQsND4oaSxqKTsKLSAgICBNYXRyaXhUeXBlIG1hdF9pbnYgPSBtYXQudGVtcGxhdGUgYmxvY2s8NCw0PihpLGopLmludmVyc2UoKTsKKyAgICBNYXRyaXhUeXBlIHN1Ym1hdCA9IG1hdC50ZW1wbGF0ZSBibG9jazw0LCA0PihpLCBqKTsKKyAgICBNYXRyaXhUeXBlIG1hdF9pbnYgPSBtYXQudGVtcGxhdGUgYmxvY2s8NCwgND4oaSwgaikuaW52ZXJzZSgpOwogICAgIFZFUklGWV9JU19BUFBST1gobWF0X2ludiwgc3VibWF0LmludmVyc2UoKSk7Ci0gICAgbWF0LnRlbXBsYXRlIGJsb2NrPDQsND4oaSxqKSA9IHN1Ym1hdC5pbnZlcnNlKCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtYXRfaW52LCAobWF0LnRlbXBsYXRlIGJsb2NrPDQsND4oaSxqKSkpOworICAgIG1hdC50ZW1wbGF0ZSBibG9jazw0LCA0PihpLCBqKSA9IHN1Ym1hdC5pbnZlcnNlKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtYXRfaW52LCAobWF0LnRlbXBsYXRlIGJsb2NrPDQsIDQ+KGksIGopKSk7CiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHByZWNfaW52ZXJzZV80eDQpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QocHJlY19pbnZlcnNlXzR4NCkgewogICBDQUxMX1NVQlRFU1RfMSgoaW52ZXJzZV9wZXJtdXRhdGlvbl80eDQ8TWF0cml4NGY+KCkpKTsKLSAgQ0FMTF9TVUJURVNUXzEoKCBpbnZlcnNlX2dlbmVyYWxfNHg0PE1hdHJpeDRmPigyMDAwMDAgKiBnX3JlcGVhdCkgKSk7Ci0gIENBTExfU1VCVEVTVF8xKCggaW52ZXJzZV9nZW5lcmFsXzR4NDxNYXRyaXg8ZmxvYXQsNCw0LFJvd01ham9yPiA+KDIwMDAwMCAqIGdfcmVwZWF0KSApKTsKKyAgQ0FMTF9TVUJURVNUXzEoKGludmVyc2VfZ2VuZXJhbF80eDQ8TWF0cml4NGY+KDIwMDAwMCAqIGdfcmVwZWF0KSkpOworICBDQUxMX1NVQlRFU1RfMSgoaW52ZXJzZV9nZW5lcmFsXzR4NDxNYXRyaXg8ZmxvYXQsIDQsIDQsIFJvd01ham9yPiA+KDIwMDAwMCAqIGdfcmVwZWF0KSkpOwogCi0gIENBTExfU1VCVEVTVF8yKChpbnZlcnNlX3Blcm11dGF0aW9uXzR4NDxNYXRyaXg8ZG91YmxlLDQsNCxSb3dNYWpvcj4gPigpKSk7Ci0gIENBTExfU1VCVEVTVF8yKCggaW52ZXJzZV9nZW5lcmFsXzR4NDxNYXRyaXg8ZG91YmxlLDQsNCxDb2xNYWpvcj4gPigyMDAwMDAgKiBnX3JlcGVhdCkgKSk7Ci0gIENBTExfU1VCVEVTVF8yKCggaW52ZXJzZV9nZW5lcmFsXzR4NDxNYXRyaXg8ZG91YmxlLDQsNCxSb3dNYWpvcj4gPigyMDAwMDAgKiBnX3JlcGVhdCkgKSk7CisgIENBTExfU1VCVEVTVF8yKChpbnZlcnNlX3Blcm11dGF0aW9uXzR4NDxNYXRyaXg8ZG91YmxlLCA0LCA0LCBSb3dNYWpvcj4gPigpKSk7CisgIENBTExfU1VCVEVTVF8yKChpbnZlcnNlX2dlbmVyYWxfNHg0PE1hdHJpeDxkb3VibGUsIDQsIDQsIENvbE1ham9yPiA+KDIwMDAwMCAqIGdfcmVwZWF0KSkpOworICBDQUxMX1NVQlRFU1RfMigoaW52ZXJzZV9nZW5lcmFsXzR4NDxNYXRyaXg8ZG91YmxlLCA0LCA0LCBSb3dNYWpvcj4gPigyMDAwMDAgKiBnX3JlcGVhdCkpKTsKIAogICBDQUxMX1NVQlRFU1RfMygoaW52ZXJzZV9wZXJtdXRhdGlvbl80eDQ8TWF0cml4NGNmPigpKSk7CiAgIENBTExfU1VCVEVTVF8zKChpbnZlcnNlX2dlbmVyYWxfNHg0PE1hdHJpeDRjZj4oNTAwMDAgKiBnX3JlcGVhdCkpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvcHJvZHVjdC5oIGIvdGVzdC9wcm9kdWN0LmgKaW5kZXggYjBjZTA2ZC4uOGQ0Njg0NiAxMDA2NDQKLS0tIGEvdGVzdC9wcm9kdWN0LmgKKysrIGIvdGVzdC9wcm9kdWN0LmgKQEAgLTEwLDM5ICsxMCwzNiBAQAogI2luY2x1ZGUgIm1haW4uaCIKICNpbmNsdWRlIDxFaWdlbi9RUj4KIAotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZDEsIHR5cGVuYW1lIERlcml2ZWQyPgotYm9vbCBhcmVOb3RBcHByb3goY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkMT4mIG0xLCBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQyPiYgbTIsIHR5cGVuYW1lIERlcml2ZWQxOjpSZWFsU2NhbGFyIGVwc2lsb24gPSBOdW1UcmFpdHM8dHlwZW5hbWUgRGVyaXZlZDE6OlJlYWxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkKLXsKLSAgcmV0dXJuICEoKG0xLW0yKS5jd2lzZUFiczIoKS5tYXhDb2VmZigpIDwgZXBzaWxvbiAqIGVwc2lsb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoc3RkOjptYXgpKG0xLmN3aXNlQWJzMigpLm1heENvZWZmKCksIG0yLmN3aXNlQWJzMigpLm1heENvZWZmKCkpKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkMSwgdHlwZW5hbWUgRGVyaXZlZDI+Citib29sIGFyZU5vdEFwcHJveChjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQxPiYgbTEsIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZDI+JiBtMiwKKyAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIERlcml2ZWQxOjpSZWFsU2NhbGFyIGVwc2lsb24gPSBOdW1UcmFpdHM8dHlwZW5hbWUgRGVyaXZlZDE6OlJlYWxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKSkgeworICByZXR1cm4gISgobTEgLSBtMikuY3dpc2VBYnMyKCkubWF4Q29lZmYoKSA8CisgICAgICAgICAgIGVwc2lsb24gKiBlcHNpbG9uICogKHN0ZDo6bWF4KShtMS5jd2lzZUFiczIoKS5tYXhDb2VmZigpLCBtMi5jd2lzZUFiczIoKS5tYXhDb2VmZigpKSk7CiB9CiAKIC8vIEFsbG93IHNwZWNpZnlpbmcgdG9sZXJhbmNlIGZvciB2ZXJpZnlpbmcgZXJyb3IuCi10ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlMSwgdHlwZW5hbWUgVHlwZTIsIHR5cGVuYW1lIFRvbD4KLWlubGluZSBib29sIHZlcmlmeUlzQXBwcm94KGNvbnN0IFR5cGUxJiBhLCBjb25zdCBUeXBlMiYgYiwgVG9sIHRvbCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlMSwgdHlwZW5hbWUgVHlwZTIsIHR5cGVuYW1lIFRvbD4KK2lubGluZSBib29sIHZlcmlmeUlzQXBwcm94KGNvbnN0IFR5cGUxJiBhLCBjb25zdCBUeXBlMiYgYiwgVG9sIHRvbCkgewogICBib29sIHJldCA9IGEuaXNBcHByb3goYiwgdG9sKTsKLSAgaWYoIXJldCkKLSAgewotICAgIHN0ZDo6Y2VyciA8PCAiRGlmZmVyZW5jZSB0b28gbGFyZ2Ugd3J0IHRvbGVyYW5jZSAiIDw8IHRvbCAgPDwgIiwgcmVsYXRpdmUgZXJyb3IgaXM6ICIgPDwgdGVzdF9yZWxhdGl2ZV9lcnJvcihhLGIpIDw8IHN0ZDo6ZW5kbDsKKyAgaWYgKCFyZXQpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkRpZmZlcmVuY2UgdG9vIGxhcmdlIHdydCB0b2xlcmFuY2UgIiA8PCB0b2wgPDwgIiwgcmVsYXRpdmUgZXJyb3IgaXM6ICIgPDwgdGVzdF9yZWxhdGl2ZV9lcnJvcihhLCBiKQorICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CiAgIH0KICAgcmV0dXJuIHJldDsKIH0KIAotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzVHlwZSwgdHlwZW5hbWUgUmhzVHlwZT4KLXN0ZDo6ZW5hYmxlX2lmX3Q8UmhzVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMsdm9pZD4KLWNoZWNrX21pc21hdGNoZWRfcHJvZHVjdChMaHNUeXBlJiBsaHMsIGNvbnN0IFJoc1R5cGUmIHJocykgewotICBWRVJJRllfUkFJU0VTX0FTU0VSVChsaHMgPSByaHMqcmhzKTsKK3N0ZDo6ZW5hYmxlX2lmX3Q8UmhzVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgPT0gRHluYW1pYywgdm9pZD4gY2hlY2tfbWlzbWF0Y2hlZF9wcm9kdWN0KExoc1R5cGUmIGxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJoc1R5cGUmIHJocykgeworICBWRVJJRllfUkFJU0VTX0FTU0VSVChsaHMgPSByaHMgKiByaHMpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTGhzVHlwZSwgdHlwZW5hbWUgUmhzVHlwZT4KLXN0ZDo6ZW5hYmxlX2lmX3Q8UmhzVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUhPUR5bmFtaWMsdm9pZD4KLWNoZWNrX21pc21hdGNoZWRfcHJvZHVjdChMaHNUeXBlJiAvKnVudXNlZCovLCBjb25zdCBSaHNUeXBlJiAvKnVudXNlZCovKSB7Ci19CitzdGQ6OmVuYWJsZV9pZl90PFJoc1R5cGU6OlNpemVBdENvbXBpbGVUaW1lICE9IER5bmFtaWMsIHZvaWQ+IGNoZWNrX21pc21hdGNoZWRfcHJvZHVjdChMaHNUeXBlJiAvKnVudXNlZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmhzVHlwZSYgLyp1bnVzZWQqLykge30KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBwcm9kdWN0KGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcHJvZHVjdChjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgSWRlbnRpdHkuaCBQcm9kdWN0LmgKICAgKi8KQEAgLTUzLDcgKzUwLDggQEAKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IFJvd1NxdWFyZU1hdHJpeFR5cGU7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBDb2xTcXVhcmVNYXRyaXhUeXBlOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdD9Db2xNYWpvcjpSb3dNYWpvcj4gT3RoZXJNYWpvck1hdHJpeFR5cGU7CisgICAgICAgICAgICAgICAgIE1hdHJpeFR5cGU6OkZsYWdzICYgUm93TWFqb3JCaXQgPyBDb2xNYWpvciA6IFJvd01ham9yPgorICAgICAgT3RoZXJNYWpvck1hdHJpeFR5cGU7CiAKICAgLy8gV3dlIHdhbnQgYSB0aWdodGVyIGVwc2lsb24gZm9yIG5vdC1hcHByb3ggdGVzdHMuICBPdGhlcndpc2UsIGZvciBjZXJ0YWluCiAgIC8vIGxvdy1wcmVjaXNpb24gdHlwZXMgKGUuZy4gYmZsb2F0MTYpLCB0aGUgYm91bmQgZW5kcyB1cCBiZWluZyByZWxhdGl2ZWx5IGxhcmdlCkBAIC02NSw3MCArNjMsNjEgQEAKIAogICAvLyB0aGlzIHRlc3QgcmVsaWVzIGEgbG90IG9uIFJhbmRvbS5oLCBhbmQgdGhlcmUncyBub3QgbXVjaCBtb3JlIHRoYXQgd2UgY2FuIGRvCiAgIC8vIHRvIHRlc3QgaXQsIGhlbmNlIEkgY29uc2lkZXIgdGhhdCB3ZSB3aWxsIGhhdmUgdGVzdGVkIFJhbmRvbS5oCi0gIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTMocm93cywgY29scyk7Ci0gIFJvd1NxdWFyZU1hdHJpeFR5cGUKLSAgICAgICAgICAgICBpZGVudGl0eSA9IFJvd1NxdWFyZU1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIHJvd3MpLAotICAgICAgICAgICAgIHNxdWFyZSA9IFJvd1NxdWFyZU1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCByb3dzKSwKLSAgICAgICAgICAgICByZXMgPSBSb3dTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgcm93cyk7Ci0gIENvbFNxdWFyZU1hdHJpeFR5cGUKLSAgICAgICAgICAgICBzcXVhcmUyID0gQ29sU3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKGNvbHMsIGNvbHMpLAotICAgICAgICAgICAgIHJlczIgPSBDb2xTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20oY29scywgY29scyk7CisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKTsKKyAgUm93U3F1YXJlTWF0cml4VHlwZSBpZGVudGl0eSA9IFJvd1NxdWFyZU1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIHJvd3MpLAorICAgICAgICAgICAgICAgICAgICAgIHNxdWFyZSA9IFJvd1NxdWFyZU1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCByb3dzKSwgcmVzID0gUm93U3F1YXJlTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIHJvd3MpOworICBDb2xTcXVhcmVNYXRyaXhUeXBlIHNxdWFyZTIgPSBDb2xTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20oY29scywgY29scyksIHJlczIgPSBDb2xTcXVhcmVNYXRyaXhUeXBlOjpSYW5kb20oY29scywgY29scyk7CiAgIFJvd1ZlY3RvclR5cGUgdjEgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CiAgIENvbFZlY3RvclR5cGUgdmMyID0gQ29sVmVjdG9yVHlwZTo6UmFuZG9tKGNvbHMpLCB2Y3Jlcyhjb2xzKTsKICAgT3RoZXJNYWpvck1hdHJpeFR5cGUgdG0xID0gbTE7CiAKICAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAKLSAgSW5kZXggciAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzLTEpLAotICAgICAgICBjICA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSksCi0gICAgICAgIGMyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scy0xKTsKKyAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAxKSwgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAxKSwKKyAgICAgICAgYzIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CiAKICAgLy8gYmVnaW4gdGVzdGluZyBQcm9kdWN0Lmg6IG9ubHkgYXNzb2NpYXRpdml0eSBmb3Igbm93CiAgIC8vICh3ZSB1c2UgVHJhbnNwb3NlLmggYnV0IHRoaXMgZG9lc24ndCBjb3VudCBhcyBhIHRlc3QgZm9yIGl0KQogICB7CiAgICAgLy8gSW5jcmVhc2UgdG9sZXJhbmNlLCBzaW5jZSBjb2VmZmljaWVudHMgaGVyZSBjYW4gZ2V0IHJlbGF0aXZlbHkgbGFyZ2UuCiAgICAgUmVhbFNjYWxhciB0b2wgPSBSZWFsU2NhbGFyKDIpICogZ2V0X3Rlc3RfcHJlY2lzaW9uKG0xKTsKLSAgICBWRVJJRlkodmVyaWZ5SXNBcHByb3goKG0xKm0xLnRyYW5zcG9zZSgpKSptMiwgIG0xKihtMS50cmFuc3Bvc2UoKSptMiksIHRvbCkpOworICAgIFZFUklGWSh2ZXJpZnlJc0FwcHJveCgobTEgKiBtMS50cmFuc3Bvc2UoKSkgKiBtMiwgbTEgKiAobTEudHJhbnNwb3NlKCkgKiBtMiksIHRvbCkpOwogICB9CiAgIG0zID0gbTE7CiAgIG0zICo9IG0xLnRyYW5zcG9zZSgpICogbTI7Ci0gIFZFUklGWV9JU19BUFBST1gobTMsICAgICAgICAgICAgICAgICAgICAgIG0xICogKG0xLnRyYW5zcG9zZSgpKm0yKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTMsICAgICAgICAgICAgICAgICAgICAgIG0xICogKG0xLnRyYW5zcG9zZSgpKm0yKSk7CisgIFZFUklGWV9JU19BUFBST1gobTMsIG0xICogKG0xLnRyYW5zcG9zZSgpICogbTIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTEgKiAobTEudHJhbnNwb3NlKCkgKiBtMikpOwogCiAgIC8vIGNvbnRpbnVlIHRlc3RpbmcgUHJvZHVjdC5oOiBkaXN0cmlidXRpdml0eQotICBWRVJJRllfSVNfQVBQUk9YKHNxdWFyZSoobTEgKyBtMiksICAgICAgICBzcXVhcmUqbTErc3F1YXJlKm0yKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChzcXVhcmUqKG0xIC0gbTIpLCAgICAgICAgc3F1YXJlKm0xLXNxdWFyZSptMik7CisgIFZFUklGWV9JU19BUFBST1goc3F1YXJlICogKG0xICsgbTIpLCBzcXVhcmUgKiBtMSArIHNxdWFyZSAqIG0yKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzcXVhcmUgKiAobTEgLSBtMiksIHNxdWFyZSAqIG0xIC0gc3F1YXJlICogbTIpOwogCiAgIC8vIGNvbnRpbnVlIHRlc3RpbmcgUHJvZHVjdC5oOiBjb21wYXRpYmlsaXR5IHdpdGggU2NhbGFyTXVsdGlwbGUuaAotICBWRVJJRllfSVNfQVBQUk9YKHMxKihzcXVhcmUqbTEpLCAgICAgICAgICAoczEqc3F1YXJlKSptMSk7Ci0gIFZFUklGWV9JU19BUFBST1goczEqKHNxdWFyZSptMSksICAgICAgICAgIHNxdWFyZSoobTEqczEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzMSAqIChzcXVhcmUgKiBtMSksIChzMSAqIHNxdWFyZSkgKiBtMSk7CisgIFZFUklGWV9JU19BUFBST1goczEgKiAoc3F1YXJlICogbTEpLCBzcXVhcmUgKiAobTEgKiBzMSkpOwogCiAgIC8vIHRlc3QgUHJvZHVjdC5oIHRvZ2V0aGVyIHdpdGggSWRlbnRpdHkuaAotICBWRVJJRllfSVNfQVBQUk9YKHYxLCAgICAgICAgICAgICAgICAgICAgICBpZGVudGl0eSp2MSk7Ci0gIFZFUklGWV9JU19BUFBST1godjEudHJhbnNwb3NlKCksICAgICAgICAgIHYxLnRyYW5zcG9zZSgpICogaWRlbnRpdHkpOworICBWRVJJRllfSVNfQVBQUk9YKHYxLCBpZGVudGl0eSAqIHYxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MS50cmFuc3Bvc2UoKSwgdjEudHJhbnNwb3NlKCkgKiBpZGVudGl0eSk7CiAgIC8vIGFnYWluLCB0ZXN0IG9wZXJhdG9yKCkgdG8gY2hlY2sgY29uc3QtcXVhbGlmaWNhdGlvbgotICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIGNvbHMpKHIsYyksIHN0YXRpY19jYXN0PFNjYWxhcj4ocj09YykpOworICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIGNvbHMpKHIsIGMpLCBzdGF0aWNfY2FzdDxTY2FsYXI+KHIgPT0gYykpOwogCi0gIGlmIChyb3dzIT1jb2xzKSB7CisgIGlmIChyb3dzICE9IGNvbHMpIHsKICAgICBjaGVja19taXNtYXRjaGVkX3Byb2R1Y3QobTMsIG0xKTsKICAgfQogCiAgIC8vIHRlc3QgdGhlIHByZXZpb3VzIHRlc3RzIHdlcmUgbm90IHNjcmV3ZWQgdXAgYmVjYXVzZSBvcGVyYXRvciogcmV0dXJucyAwCiAgIC8vICh3ZSB1c2UgdGhlIG1vcmUgYWNjdXJhdGUgZGVmYXVsdCBlcHNpbG9uKQotICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIgJiYgKHN0ZDo6bWluKShyb3dzLGNvbHMpPjEpCi0gIHsKLSAgICBWRVJJRlkoYXJlTm90QXBwcm94KG0xLnRyYW5zcG9zZSgpKm0yLG0yLnRyYW5zcG9zZSgpKm0xLCBub3RfYXBwcm94X2Vwc2lsb24pKTsKKyAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyICYmIChzdGQ6Om1pbikocm93cywgY29scykgPiAxKSB7CisgICAgVkVSSUZZKGFyZU5vdEFwcHJveChtMS50cmFuc3Bvc2UoKSAqIG0yLCBtMi50cmFuc3Bvc2UoKSAqIG0xLCBub3RfYXBwcm94X2Vwc2lsb24pKTsKICAgfQogCiAgIC8vIHRlc3Qgb3B0aW1pemVkIG9wZXJhdG9yKz0gcGF0aAogICByZXMgPSBzcXVhcmU7CiAgIHJlcy5ub2FsaWFzKCkgKz0gbTEgKiBtMi50cmFuc3Bvc2UoKTsKICAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIHNxdWFyZSArIG0xICogbTIudHJhbnNwb3NlKCkpOwotICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIgJiYgKHN0ZDo6bWluKShyb3dzLGNvbHMpPjEpCi0gIHsKLSAgICBWRVJJRlkoYXJlTm90QXBwcm94KHJlcyxzcXVhcmUgKyBtMiAqIG0xLnRyYW5zcG9zZSgpLCBub3RfYXBwcm94X2Vwc2lsb24pKTsKKyAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyICYmIChzdGQ6Om1pbikocm93cywgY29scykgPiAxKSB7CisgICAgVkVSSUZZKGFyZU5vdEFwcHJveChyZXMsIHNxdWFyZSArIG0yICogbTEudHJhbnNwb3NlKCksIG5vdF9hcHByb3hfZXBzaWxvbikpOwogICB9CiAgIHZjcmVzID0gdmMyOwogICB2Y3Jlcy5ub2FsaWFzKCkgKz0gbTEudHJhbnNwb3NlKCkgKiB2MTsKQEAgLTEzOCw5ICsxMjcsOCBAQAogICByZXMgPSBzcXVhcmU7CiAgIHJlcy5ub2FsaWFzKCkgLT0gbTEgKiBtMi50cmFuc3Bvc2UoKTsKICAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIHNxdWFyZSAtIChtMSAqIG0yLnRyYW5zcG9zZSgpKSk7Ci0gIGlmICghTnVtVHJhaXRzPFNjYWxhcj46OklzSW50ZWdlciAmJiAoc3RkOjptaW4pKHJvd3MsY29scyk+MSkKLSAgewotICAgIFZFUklGWShhcmVOb3RBcHByb3gocmVzLHNxdWFyZSAtIG0yICogbTEudHJhbnNwb3NlKCksIG5vdF9hcHByb3hfZXBzaWxvbikpOworICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIgJiYgKHN0ZDo6bWluKShyb3dzLCBjb2xzKSA+IDEpIHsKKyAgICBWRVJJRlkoYXJlTm90QXBwcm94KHJlcywgc3F1YXJlIC0gbTIgKiBtMS50cmFuc3Bvc2UoKSwgbm90X2FwcHJveF9lcHNpbG9uKSk7CiAgIH0KICAgdmNyZXMgPSB2YzI7CiAgIHZjcmVzLm5vYWxpYXMoKSAtPSBtMS50cmFuc3Bvc2UoKSAqIHYxOwpAQCAtMTQ5LDE5ICsxMzcsMTkgQEAKICAgLy8gdGVzdCBzY2FsZWQgcHJvZHVjdHMKICAgcmVzID0gc3F1YXJlOwogICByZXMubm9hbGlhcygpID0gczEgKiBtMSAqIG0yLnRyYW5zcG9zZSgpOwotICBWRVJJRllfSVNfQVBQUk9YKHJlcywgKChzMSptMSkuZXZhbCgpICogbTIudHJhbnNwb3NlKCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMsICgoczEgKiBtMSkuZXZhbCgpICogbTIudHJhbnNwb3NlKCkpKTsKICAgcmVzID0gc3F1YXJlOwogICByZXMubm9hbGlhcygpICs9IHMxICogbTEgKiBtMi50cmFuc3Bvc2UoKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIHNxdWFyZSArICgoczEqbTEpLmV2YWwoKSAqIG0yLnRyYW5zcG9zZSgpKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzLCBzcXVhcmUgKyAoKHMxICogbTEpLmV2YWwoKSAqIG0yLnRyYW5zcG9zZSgpKSk7CiAgIHJlcyA9IHNxdWFyZTsKICAgcmVzLm5vYWxpYXMoKSAtPSBzMSAqIG0xICogbTIudHJhbnNwb3NlKCk7Ci0gIFZFUklGWV9JU19BUFBST1gocmVzLCBzcXVhcmUgLSAoKHMxKm0xKS5ldmFsKCkgKiBtMi50cmFuc3Bvc2UoKSkpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgc3F1YXJlIC0gKChzMSAqIG0xKS5ldmFsKCkgKiBtMi50cmFuc3Bvc2UoKSkpOwogCiAgIC8vIHRlc3QgZCA/PSBhK2IqYyBydWxlcwogICByZXMubm9hbGlhcygpID0gc3F1YXJlICsgbTEgKiBtMi50cmFuc3Bvc2UoKTsKICAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIHNxdWFyZSArIG0xICogbTIudHJhbnNwb3NlKCkpOwogICByZXMubm9hbGlhcygpICs9IHNxdWFyZSArIG0xICogbTIudHJhbnNwb3NlKCk7Ci0gIFZFUklGWV9JU19BUFBST1gocmVzLCBTY2FsYXIoMikqKHNxdWFyZSArIG0xICogbTIudHJhbnNwb3NlKCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIFNjYWxhcigyKSAqIChzcXVhcmUgKyBtMSAqIG0yLnRyYW5zcG9zZSgpKSk7CiAgIHJlcy5ub2FsaWFzKCkgLT0gc3F1YXJlICsgbTEgKiBtMi50cmFuc3Bvc2UoKTsKICAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIHNxdWFyZSArIG0xICogbTIudHJhbnNwb3NlKCkpOwogCkBAIC0xNjksMzAgKzE1NywyNiBAQAogICByZXMubm9hbGlhcygpID0gc3F1YXJlIC0gbTEgKiBtMi50cmFuc3Bvc2UoKTsKICAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIHNxdWFyZSAtIG0xICogbTIudHJhbnNwb3NlKCkpOwogICByZXMubm9hbGlhcygpICs9IHNxdWFyZSAtIG0xICogbTIudHJhbnNwb3NlKCk7Ci0gIFZFUklGWV9JU19BUFBST1gocmVzLCBTY2FsYXIoMikqKHNxdWFyZSAtIG0xICogbTIudHJhbnNwb3NlKCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIFNjYWxhcigyKSAqIChzcXVhcmUgLSBtMSAqIG0yLnRyYW5zcG9zZSgpKSk7CiAgIHJlcy5ub2FsaWFzKCkgLT0gc3F1YXJlIC0gbTEgKiBtMi50cmFuc3Bvc2UoKTsKICAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIHNxdWFyZSAtIG0xICogbTIudHJhbnNwb3NlKCkpOwogCi0KICAgdG0xID0gbTE7CiAgIFZFUklGWV9JU19BUFBST1godG0xLnRyYW5zcG9zZSgpICogdjEsIG0xLnRyYW5zcG9zZSgpICogdjEpOwogICBWRVJJRllfSVNfQVBQUk9YKHYxLnRyYW5zcG9zZSgpICogdG0xLCB2MS50cmFuc3Bvc2UoKSAqIG0xKTsKIAogICAvLyB0ZXN0IHN1Ym1hdHJpeCBhbmQgbWF0cml4L3ZlY3RvciBwcm9kdWN0Ci0gIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCi0gICAgcmVzLnJvdyhpKSA9IG0xLnJvdyhpKSAqIG0yLnRyYW5zcG9zZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7ICsraSkgcmVzLnJvdyhpKSA9IG0xLnJvdyhpKSAqIG0yLnRyYW5zcG9zZSgpOwogICBWRVJJRllfSVNfQVBQUk9YKHJlcywgbTEgKiBtMi50cmFuc3Bvc2UoKSk7CiAgIC8vIHRoZSBvdGhlciB3YXkgcm91bmQ6Ci0gIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCi0gICAgcmVzLmNvbChpKSA9IG0xICogbTIudHJhbnNwb3NlKCkuY29sKGkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7ICsraSkgcmVzLmNvbChpKSA9IG0xICogbTIudHJhbnNwb3NlKCkuY29sKGkpOwogICBWRVJJRllfSVNfQVBQUk9YKHJlcywgbTEgKiBtMi50cmFuc3Bvc2UoKSk7CiAKICAgcmVzMiA9IHNxdWFyZTI7CiAgIHJlczIubm9hbGlhcygpICs9IG0xLnRyYW5zcG9zZSgpICogbTI7CiAgIFZFUklGWV9JU19BUFBST1gocmVzMiwgc3F1YXJlMiArIG0xLnRyYW5zcG9zZSgpICogbTIpOwotICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIgJiYgKHN0ZDo6bWluKShyb3dzLGNvbHMpPjEpCi0gIHsKLSAgICBWRVJJRlkoYXJlTm90QXBwcm94KHJlczIsc3F1YXJlMiArIG0yLnRyYW5zcG9zZSgpICogbTEsIG5vdF9hcHByb3hfZXBzaWxvbikpOworICBpZiAoIU51bVRyYWl0czxTY2FsYXI+OjpJc0ludGVnZXIgJiYgKHN0ZDo6bWluKShyb3dzLCBjb2xzKSA+IDEpIHsKKyAgICBWRVJJRlkoYXJlTm90QXBwcm94KHJlczIsIHNxdWFyZTIgKyBtMi50cmFuc3Bvc2UoKSAqIG0xLCBub3RfYXBwcm94X2Vwc2lsb24pKTsKICAgfQogCiAgIFZFUklGWV9JU19BUFBST1gocmVzLmNvbChyKS5ub2FsaWFzKCkgPSBzcXVhcmUuYWRqb2ludCgpICogc3F1YXJlLmNvbChyKSwgKHNxdWFyZS5hZGpvaW50KCkgKiBzcXVhcmUuY29sKHIpKS5ldmFsKCkpOwpAQCAtMjAzLDM4ICsxODcsNDggQEAKICAgICBSb3dTcXVhcmVNYXRyaXhUeXBlIHJlZihzcXVhcmUpOwogICAgIENvbFNxdWFyZU1hdHJpeFR5cGUgcmVmMihzcXVhcmUyKTsKICAgICByZWYgPSByZXMgPSBzcXVhcmU7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChyZXMuYmxvY2soMCwwLDEscm93cykubm9hbGlhcygpID0gbTEuY29sKDApLnRyYW5zcG9zZSgpICogc3F1YXJlLnRyYW5zcG9zZSgpLCAgICAgICAgICAgIChyZWYucm93KDApID0gbTEuY29sKDApLnRyYW5zcG9zZSgpICogc3F1YXJlLnRyYW5zcG9zZSgpKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChyZXMuYmxvY2soMCwwLDEscm93cykubm9hbGlhcygpID0gbTEuYmxvY2soMCwwLHJvd3MsMSkudHJhbnNwb3NlKCkgKiBzcXVhcmUudHJhbnNwb3NlKCksIChyZWYucm93KDApID0gbTEuY29sKDApLnRyYW5zcG9zZSgpICogc3F1YXJlLnRyYW5zcG9zZSgpKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChyZXMuYmxvY2soMCwwLDEscm93cykubm9hbGlhcygpID0gbTEuY29sKDApLnRyYW5zcG9zZSgpICogc3F1YXJlLCAgICAgICAgICAgICAgICAgICAgICAgIChyZWYucm93KDApID0gbTEuY29sKDApLnRyYW5zcG9zZSgpICogc3F1YXJlKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChyZXMuYmxvY2soMCwwLDEscm93cykubm9hbGlhcygpID0gbTEuYmxvY2soMCwwLHJvd3MsMSkudHJhbnNwb3NlKCkgKiBzcXVhcmUsICAgICAgICAgICAgIChyZWYucm93KDApID0gbTEuY29sKDApLnRyYW5zcG9zZSgpICogc3F1YXJlKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZXMuYmxvY2soMCwgMCwgMSwgcm93cykubm9hbGlhcygpID0gbTEuY29sKDApLnRyYW5zcG9zZSgpICogc3F1YXJlLnRyYW5zcG9zZSgpLAorICAgICAgICAgICAgICAgICAgICAgKHJlZi5yb3coMCkgPSBtMS5jb2woMCkudHJhbnNwb3NlKCkgKiBzcXVhcmUudHJhbnNwb3NlKCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlcy5ibG9jaygwLCAwLCAxLCByb3dzKS5ub2FsaWFzKCkgPSBtMS5ibG9jaygwLCAwLCByb3dzLCAxKS50cmFuc3Bvc2UoKSAqIHNxdWFyZS50cmFuc3Bvc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgIChyZWYucm93KDApID0gbTEuY29sKDApLnRyYW5zcG9zZSgpICogc3F1YXJlLnRyYW5zcG9zZSgpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZXMuYmxvY2soMCwgMCwgMSwgcm93cykubm9hbGlhcygpID0gbTEuY29sKDApLnRyYW5zcG9zZSgpICogc3F1YXJlLAorICAgICAgICAgICAgICAgICAgICAgKHJlZi5yb3coMCkgPSBtMS5jb2woMCkudHJhbnNwb3NlKCkgKiBzcXVhcmUpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlcy5ibG9jaygwLCAwLCAxLCByb3dzKS5ub2FsaWFzKCkgPSBtMS5ibG9jaygwLCAwLCByb3dzLCAxKS50cmFuc3Bvc2UoKSAqIHNxdWFyZSwKKyAgICAgICAgICAgICAgICAgICAgIChyZWYucm93KDApID0gbTEuY29sKDApLnRyYW5zcG9zZSgpICogc3F1YXJlKSk7CiAgICAgcmVmMiA9IHJlczIgPSBzcXVhcmUyOwotICAgIFZFUklGWV9JU19BUFBST1gocmVzMi5ibG9jaygwLDAsMSxjb2xzKS5ub2FsaWFzKCkgPSBtMS5yb3coMCkgKiBzcXVhcmUyLnRyYW5zcG9zZSgpLCAgICAgICAgICAgICAgICAgICAgICAocmVmMi5yb3coMCkgPSBtMS5yb3coMCkgKiBzcXVhcmUyLnRyYW5zcG9zZSgpKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChyZXMyLmJsb2NrKDAsMCwxLGNvbHMpLm5vYWxpYXMoKSA9IG0xLmJsb2NrKDAsMCwxLGNvbHMpICogc3F1YXJlMi50cmFuc3Bvc2UoKSwgICAgICAgICAgIChyZWYyLnJvdygwKSA9IG0xLnJvdygwKSAqIHNxdWFyZTIudHJhbnNwb3NlKCkpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHJlczIuYmxvY2soMCwwLDEsY29scykubm9hbGlhcygpID0gbTEucm93KDApICogc3F1YXJlMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlZjIucm93KDApID0gbTEucm93KDApICogc3F1YXJlMikpOwotICAgIFZFUklGWV9JU19BUFBST1gocmVzMi5ibG9jaygwLDAsMSxjb2xzKS5ub2FsaWFzKCkgPSBtMS5ibG9jaygwLDAsMSxjb2xzKSAqIHNxdWFyZTIsICAgICAgICAgICAgICAgICAgICAgICAocmVmMi5yb3coMCkgPSBtMS5yb3coMCkgKiBzcXVhcmUyKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZXMyLmJsb2NrKDAsIDAsIDEsIGNvbHMpLm5vYWxpYXMoKSA9IG0xLnJvdygwKSAqIHNxdWFyZTIudHJhbnNwb3NlKCksCisgICAgICAgICAgICAgICAgICAgICAocmVmMi5yb3coMCkgPSBtMS5yb3coMCkgKiBzcXVhcmUyLnRyYW5zcG9zZSgpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZXMyLmJsb2NrKDAsIDAsIDEsIGNvbHMpLm5vYWxpYXMoKSA9IG0xLmJsb2NrKDAsIDAsIDEsIGNvbHMpICogc3F1YXJlMi50cmFuc3Bvc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgIChyZWYyLnJvdygwKSA9IG0xLnJvdygwKSAqIHNxdWFyZTIudHJhbnNwb3NlKCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlczIuYmxvY2soMCwgMCwgMSwgY29scykubm9hbGlhcygpID0gbTEucm93KDApICogc3F1YXJlMiwgKHJlZjIucm93KDApID0gbTEucm93KDApICogc3F1YXJlMikpOworICAgIFZFUklGWV9JU19BUFBST1gocmVzMi5ibG9jaygwLCAwLCAxLCBjb2xzKS5ub2FsaWFzKCkgPSBtMS5ibG9jaygwLCAwLCAxLCBjb2xzKSAqIHNxdWFyZTIsCisgICAgICAgICAgICAgICAgICAgICAocmVmMi5yb3coMCkgPSBtMS5yb3coMCkgKiBzcXVhcmUyKSk7CiAgIH0KIAogICAvLyB2ZWN0b3IuYmxvY2soKSAoc2VlIGJ1ZyAxMjgzKQogICB7CiAgICAgUm93VmVjdG9yVHlwZSB3MShyb3dzKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHNxdWFyZSAqIHYxLmJsb2NrKDAsMCxyb3dzLDEpLCBzcXVhcmUgKiB2MSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCh3MS5ub2FsaWFzKCkgPSBzcXVhcmUgKiB2MS5ibG9jaygwLDAscm93cywxKSwgc3F1YXJlICogdjEpOwotICAgIFZFUklGWV9JU19BUFBST1godzEuYmxvY2soMCwwLHJvd3MsMSkubm9hbGlhcygpID0gc3F1YXJlICogdjEuYmxvY2soMCwwLHJvd3MsMSksIHNxdWFyZSAqIHYxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHNxdWFyZSAqIHYxLmJsb2NrKDAsIDAsIHJvd3MsIDEpLCBzcXVhcmUgKiB2MSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3MS5ub2FsaWFzKCkgPSBzcXVhcmUgKiB2MS5ibG9jaygwLCAwLCByb3dzLCAxKSwgc3F1YXJlICogdjEpOworICAgIFZFUklGWV9JU19BUFBST1godzEuYmxvY2soMCwgMCwgcm93cywgMSkubm9hbGlhcygpID0gc3F1YXJlICogdjEuYmxvY2soMCwgMCwgcm93cywgMSksIHNxdWFyZSAqIHYxKTsKIAotICAgIE1hdHJpeDxTY2FsYXIsMSxNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gdzIoY29scyk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCh2YzIuYmxvY2soMCwwLGNvbHMsMSkudHJhbnNwb3NlKCkgKiBzcXVhcmUyLCB2YzIudHJhbnNwb3NlKCkgKiBzcXVhcmUyKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHcyLm5vYWxpYXMoKSA9IHZjMi5ibG9jaygwLDAsY29scywxKS50cmFuc3Bvc2UoKSAqIHNxdWFyZTIsIHZjMi50cmFuc3Bvc2UoKSAqIHNxdWFyZTIpOwotICAgIFZFUklGWV9JU19BUFBST1godzIuYmxvY2soMCwwLDEsY29scykubm9hbGlhcygpID0gdmMyLmJsb2NrKDAsMCxjb2xzLDEpLnRyYW5zcG9zZSgpICogc3F1YXJlMiwgdmMyLnRyYW5zcG9zZSgpICogc3F1YXJlMik7CisgICAgTWF0cml4PFNjYWxhciwgMSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+IHcyKGNvbHMpOworICAgIFZFUklGWV9JU19BUFBST1godmMyLmJsb2NrKDAsIDAsIGNvbHMsIDEpLnRyYW5zcG9zZSgpICogc3F1YXJlMiwgdmMyLnRyYW5zcG9zZSgpICogc3F1YXJlMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3Mi5ub2FsaWFzKCkgPSB2YzIuYmxvY2soMCwgMCwgY29scywgMSkudHJhbnNwb3NlKCkgKiBzcXVhcmUyLCB2YzIudHJhbnNwb3NlKCkgKiBzcXVhcmUyKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHcyLmJsb2NrKDAsIDAsIDEsIGNvbHMpLm5vYWxpYXMoKSA9IHZjMi5ibG9jaygwLCAwLCBjb2xzLCAxKS50cmFuc3Bvc2UoKSAqIHNxdWFyZTIsCisgICAgICAgICAgICAgICAgICAgICB2YzIudHJhbnNwb3NlKCkgKiBzcXVhcmUyKTsKIAotICAgIHZjMiA9IHNxdWFyZTIuYmxvY2soMCwwLDEsY29scykudHJhbnNwb3NlKCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChzcXVhcmUyLmJsb2NrKDAsMCwxLGNvbHMpICogc3F1YXJlMiwgdmMyLnRyYW5zcG9zZSgpICogc3F1YXJlMik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCh3Mi5ub2FsaWFzKCkgPSBzcXVhcmUyLmJsb2NrKDAsMCwxLGNvbHMpICogc3F1YXJlMiwgdmMyLnRyYW5zcG9zZSgpICogc3F1YXJlMik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCh3Mi5ibG9jaygwLDAsMSxjb2xzKS5ub2FsaWFzKCkgPSBzcXVhcmUyLmJsb2NrKDAsMCwxLGNvbHMpICogc3F1YXJlMiwgdmMyLnRyYW5zcG9zZSgpICogc3F1YXJlMik7CisgICAgdmMyID0gc3F1YXJlMi5ibG9jaygwLCAwLCAxLCBjb2xzKS50cmFuc3Bvc2UoKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHNxdWFyZTIuYmxvY2soMCwgMCwgMSwgY29scykgKiBzcXVhcmUyLCB2YzIudHJhbnNwb3NlKCkgKiBzcXVhcmUyKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHcyLm5vYWxpYXMoKSA9IHNxdWFyZTIuYmxvY2soMCwgMCwgMSwgY29scykgKiBzcXVhcmUyLCB2YzIudHJhbnNwb3NlKCkgKiBzcXVhcmUyKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHcyLmJsb2NrKDAsIDAsIDEsIGNvbHMpLm5vYWxpYXMoKSA9IHNxdWFyZTIuYmxvY2soMCwgMCwgMSwgY29scykgKiBzcXVhcmUyLAorICAgICAgICAgICAgICAgICAgICAgdmMyLnRyYW5zcG9zZSgpICogc3F1YXJlMik7CiAKLSAgICB2YzIgPSBzcXVhcmUyLmJsb2NrKDAsMCxjb2xzLDEpOwotICAgIFZFUklGWV9JU19BUFBST1goc3F1YXJlMi5ibG9jaygwLDAsY29scywxKS50cmFuc3Bvc2UoKSAqIHNxdWFyZTIsIHZjMi50cmFuc3Bvc2UoKSAqIHNxdWFyZTIpOwotICAgIFZFUklGWV9JU19BUFBST1godzIubm9hbGlhcygpID0gc3F1YXJlMi5ibG9jaygwLDAsY29scywxKS50cmFuc3Bvc2UoKSAqIHNxdWFyZTIsIHZjMi50cmFuc3Bvc2UoKSAqIHNxdWFyZTIpOwotICAgIFZFUklGWV9JU19BUFBST1godzIuYmxvY2soMCwwLDEsY29scykubm9hbGlhcygpID0gc3F1YXJlMi5ibG9jaygwLDAsY29scywxKS50cmFuc3Bvc2UoKSAqIHNxdWFyZTIsIHZjMi50cmFuc3Bvc2UoKSAqIHNxdWFyZTIpOworICAgIHZjMiA9IHNxdWFyZTIuYmxvY2soMCwgMCwgY29scywgMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzcXVhcmUyLmJsb2NrKDAsIDAsIGNvbHMsIDEpLnRyYW5zcG9zZSgpICogc3F1YXJlMiwgdmMyLnRyYW5zcG9zZSgpICogc3F1YXJlMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3Mi5ub2FsaWFzKCkgPSBzcXVhcmUyLmJsb2NrKDAsIDAsIGNvbHMsIDEpLnRyYW5zcG9zZSgpICogc3F1YXJlMiwgdmMyLnRyYW5zcG9zZSgpICogc3F1YXJlMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh3Mi5ibG9jaygwLCAwLCAxLCBjb2xzKS5ub2FsaWFzKCkgPSBzcXVhcmUyLmJsb2NrKDAsIDAsIGNvbHMsIDEpLnRyYW5zcG9zZSgpICogc3F1YXJlMiwKKyAgICAgICAgICAgICAgICAgICAgIHZjMi50cmFuc3Bvc2UoKSAqIHNxdWFyZTIpOwogICB9CiAKICAgLy8gaW5uZXIgcHJvZHVjdApAQCAtMjQ1LDQ2ICsyMzksNTEgQEAKIAogICAvLyBvdXRlciBwcm9kdWN0CiAgIHsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbChjKSAqIG0xLnJvdyhyKSwgbTEuYmxvY2soMCxjLHJvd3MsMSkgKiBtMS5ibG9jayhyLDAsMSxjb2xzKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtMS5yb3cocikudHJhbnNwb3NlKCkgKiBtMS5jb2woYykudHJhbnNwb3NlKCksIG0xLmJsb2NrKHIsMCwxLGNvbHMpLnRyYW5zcG9zZSgpICogbTEuYmxvY2soMCxjLHJvd3MsMSkudHJhbnNwb3NlKCkpOwotICAgIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2soMCxjLHJvd3MsMSkgKiBtMS5yb3cociksIG0xLmJsb2NrKDAsYyxyb3dzLDEpICogbTEuYmxvY2sociwwLDEsY29scykpOwotICAgIFZFUklGWV9JU19BUFBST1gobTEuY29sKGMpICogbTEuYmxvY2sociwwLDEsY29scyksIG0xLmJsb2NrKDAsYyxyb3dzLDEpICogbTEuYmxvY2sociwwLDEsY29scykpOwotICAgIFZFUklGWV9JU19BUFBST1gobTEubGVmdENvbHMoMSkgKiBtMS5yb3cociksIG0xLmJsb2NrKDAsMCxyb3dzLDEpICogbTEuYmxvY2sociwwLDEsY29scykpOwotICAgIFZFUklGWV9JU19BUFBST1gobTEuY29sKGMpICogbTEudG9wUm93cygxKSwgbTEuYmxvY2soMCxjLHJvd3MsMSkgKiBtMS5ibG9jaygwLDAsMSxjb2xzKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb2woYykgKiBtMS5yb3cociksIG0xLmJsb2NrKDAsIGMsIHJvd3MsIDEpICogbTEuYmxvY2sociwgMCwgMSwgY29scykpOworICAgIFZFUklGWV9JU19BUFBST1gobTEucm93KHIpLnRyYW5zcG9zZSgpICogbTEuY29sKGMpLnRyYW5zcG9zZSgpLAorICAgICAgICAgICAgICAgICAgICAgbTEuYmxvY2sociwgMCwgMSwgY29scykudHJhbnNwb3NlKCkgKiBtMS5ibG9jaygwLCBjLCByb3dzLCAxKS50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5ibG9jaygwLCBjLCByb3dzLCAxKSAqIG0xLnJvdyhyKSwgbTEuYmxvY2soMCwgYywgcm93cywgMSkgKiBtMS5ibG9jayhyLCAwLCAxLCBjb2xzKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb2woYykgKiBtMS5ibG9jayhyLCAwLCAxLCBjb2xzKSwgbTEuYmxvY2soMCwgYywgcm93cywgMSkgKiBtMS5ibG9jayhyLCAwLCAxLCBjb2xzKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5sZWZ0Q29scygxKSAqIG0xLnJvdyhyKSwgbTEuYmxvY2soMCwgMCwgcm93cywgMSkgKiBtMS5ibG9jayhyLCAwLCAxLCBjb2xzKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5jb2woYykgKiBtMS50b3BSb3dzKDEpLCBtMS5ibG9jaygwLCBjLCByb3dzLCAxKSAqIG0xLmJsb2NrKDAsIDAsIDEsIGNvbHMpKTsKICAgfQogCiAgIC8vIEFsaWFzaW5nCiAgIHsKLSAgICBDb2xWZWN0b3JUeXBlIHgoY29scyk7IHguc2V0UmFuZG9tKCk7CisgICAgQ29sVmVjdG9yVHlwZSB4KGNvbHMpOworICAgIHguc2V0UmFuZG9tKCk7CiAgICAgQ29sVmVjdG9yVHlwZSB6KHgpOwotICAgIENvbFZlY3RvclR5cGUgeShjb2xzKTsgeS5zZXRaZXJvKCk7Ci0gICAgQ29sU3F1YXJlTWF0cml4VHlwZSBBKGNvbHMsY29scyk7IEEuc2V0UmFuZG9tKCk7CisgICAgQ29sVmVjdG9yVHlwZSB5KGNvbHMpOworICAgIHkuc2V0WmVybygpOworICAgIENvbFNxdWFyZU1hdHJpeFR5cGUgQShjb2xzLCBjb2xzKTsKKyAgICBBLnNldFJhbmRvbSgpOwogICAgIC8vIEN3aXNlQmluYXJ5T3AKLSAgICBWRVJJRllfSVNfQVBQUk9YKHggPSB5ICsgQSp4LCBBKnopOworICAgIFZFUklGWV9JU19BUFBST1goeCA9IHkgKyBBICogeCwgQSAqIHopOwogICAgIHggPSB6OwotICAgIFZFUklGWV9JU19BUFBST1goeCA9IHkgLSBBKngsIEEqKC16KSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh4ID0geSAtIEEgKiB4LCBBICogKC16KSk7CiAgICAgeCA9IHo7CiAgICAgLy8gQ3dpc2VVbmFyeU9wCi0gICAgVkVSSUZZX0lTX0FQUFJPWCh4ID0gU2NhbGFyKDEuKSooQSp4KSwgQSp6KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHggPSBTY2FsYXIoMS4pICogKEEgKiB4KSwgQSAqIHopOwogICB9CiAKICAgLy8gcmVncmVzc2lvbiBmb3IgYmxhc190cmFpcwogICB7CiAgICAgLy8gSW5jcmVhc2UgdGVzdCB0b2xlcmFuY2UsIHNpbmNlIGNvZWZmaWNpZW50cyBjYW4gZ2V0IHJlbGF0aXZlbHkgbGFyZ2UuCiAgICAgUmVhbFNjYWxhciB0b2wgPSBSZWFsU2NhbGFyKDIpICogZ2V0X3Rlc3RfcHJlY2lzaW9uKHNxdWFyZSk7Ci0gICAgVkVSSUZZKHZlcmlmeUlzQXBwcm94KHNxdWFyZSAqIChzcXVhcmUqc3F1YXJlKS50cmFuc3Bvc2UoKSwgc3F1YXJlICogc3F1YXJlLnRyYW5zcG9zZSgpICogc3F1YXJlLnRyYW5zcG9zZSgpLCB0b2wpKTsKLSAgICBWRVJJRlkodmVyaWZ5SXNBcHByb3goc3F1YXJlICogKC0oc3F1YXJlKnNxdWFyZSkpLCAtc3F1YXJlICogc3F1YXJlICogc3F1YXJlLCB0b2wpKTsKLSAgICBWRVJJRlkodmVyaWZ5SXNBcHByb3goc3F1YXJlICogKHMxKihzcXVhcmUqc3F1YXJlKSksIHMxICogc3F1YXJlICogc3F1YXJlICogc3F1YXJlLCB0b2wpKTsKLSAgICBWRVJJRlkodmVyaWZ5SXNBcHByb3goc3F1YXJlICogKHNxdWFyZSpzcXVhcmUpLmNvbmp1Z2F0ZSgpLCBzcXVhcmUgKiBzcXVhcmUuY29uanVnYXRlKCkgKiBzcXVhcmUuY29uanVnYXRlKCksIHRvbCkpOworICAgIFZFUklGWSgKKyAgICAgICAgdmVyaWZ5SXNBcHByb3goc3F1YXJlICogKHNxdWFyZSAqIHNxdWFyZSkudHJhbnNwb3NlKCksIHNxdWFyZSAqIHNxdWFyZS50cmFuc3Bvc2UoKSAqIHNxdWFyZS50cmFuc3Bvc2UoKSwgdG9sKSk7CisgICAgVkVSSUZZKHZlcmlmeUlzQXBwcm94KHNxdWFyZSAqICgtKHNxdWFyZSAqIHNxdWFyZSkpLCAtc3F1YXJlICogc3F1YXJlICogc3F1YXJlLCB0b2wpKTsKKyAgICBWRVJJRlkodmVyaWZ5SXNBcHByb3goc3F1YXJlICogKHMxICogKHNxdWFyZSAqIHNxdWFyZSkpLCBzMSAqIHNxdWFyZSAqIHNxdWFyZSAqIHNxdWFyZSwgdG9sKSk7CisgICAgVkVSSUZZKAorICAgICAgICB2ZXJpZnlJc0FwcHJveChzcXVhcmUgKiAoc3F1YXJlICogc3F1YXJlKS5jb25qdWdhdGUoKSwgc3F1YXJlICogc3F1YXJlLmNvbmp1Z2F0ZSgpICogc3F1YXJlLmNvbmp1Z2F0ZSgpLCB0b2wpKTsKICAgfQogCiAgIC8vIGRlc3RpbmF0aW9uIHdpdGggYSBub24tZGVmYXVsdCBpbm5lci1zdHJpZGUKICAgLy8gc2VlIGJ1ZyAxNzQxCi0gIGlmKCFNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQotICB7Ci0gICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gTWF0cml4WDsKLSAgICBNYXRyaXhYIGJ1ZmZlcigyKnJvd3MsMipyb3dzKTsKLSAgICBNYXA8Um93U3F1YXJlTWF0cml4VHlwZSwwLFN0cmlkZTxEeW5hbWljLDI+ID4gbWFwMShidWZmZXIuZGF0YSgpLHJvd3Mscm93cyxTdHJpZGU8RHluYW1pYywyPigyKnJvd3MsMikpOworICBpZiAoIU1hdHJpeFR5cGU6OklzUm93TWFqb3IpIHsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IE1hdHJpeFg7CisgICAgTWF0cml4WCBidWZmZXIoMiAqIHJvd3MsIDIgKiByb3dzKTsKKyAgICBNYXA8Um93U3F1YXJlTWF0cml4VHlwZSwgMCwgU3RyaWRlPER5bmFtaWMsIDI+ID4gbWFwMShidWZmZXIuZGF0YSgpLCByb3dzLCByb3dzLCBTdHJpZGU8RHluYW1pYywgMj4oMiAqIHJvd3MsIDIpKTsKICAgICBidWZmZXIuc2V0WmVybygpOwogICAgIFZFUklGWV9JU19BUFBST1gobWFwMSA9IG0xICogbTIudHJhbnNwb3NlKCksIChtMSAqIG0yLnRyYW5zcG9zZSgpKS5ldmFsKCkpOwogICAgIGJ1ZmZlci5zZXRaZXJvKCk7CkBAIC0yOTIsNSArMjkxLDQgQEAKICAgICBidWZmZXIuc2V0WmVybygpOwogICAgIFZFUklGWV9JU19BUFBST1gobWFwMS5ub2FsaWFzKCkgKz0gbTEgKiBtMi50cmFuc3Bvc2UoKSwgKG0xICogbTIudHJhbnNwb3NlKCkpLmV2YWwoKSk7CiAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9wcm9kdWN0X2V4dHJhLmNwcCBiL3Rlc3QvcHJvZHVjdF9leHRyYS5jcHAKaW5kZXggMTVjNjk4OS4uZGRkNzdiNSAxMDA2NDQKLS0tIGEvdGVzdC9wcm9kdWN0X2V4dHJhLmNwcAorKysgYi90ZXN0L3Byb2R1Y3RfZXh0cmEuY3BwCkBAIC05LDE5NCArOSwxODIgQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBwcm9kdWN0X2V4dHJhKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcHJvZHVjdF9leHRyYShjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBEeW5hbWljPiBSb3dWZWN0b3JUeXBlOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IENvbFZlY3RvclR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpGbGFncyZSb3dNYWpvckJpdD4gT3RoZXJNYWpvck1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgTWF0cml4VHlwZTo6RmxhZ3MgJiBSb3dNYWpvckJpdD4gT3RoZXJNYWpvck1hdHJpeFR5cGU7CiAKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKLSAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtemVybyA9IE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scyksCi0gICAgICAgICAgICAgaWRlbnRpdHkgPSBNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCByb3dzKSwKLSAgICAgICAgICAgICBzcXVhcmUgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgcm93cyksCi0gICAgICAgICAgICAgcmVzID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIHJvd3MpLAotICAgICAgICAgICAgIHNxdWFyZTIgPSBNYXRyaXhUeXBlOjpSYW5kb20oY29scywgY29scyksCi0gICAgICAgICAgICAgcmVzMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShjb2xzLCBjb2xzKTsKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIG16ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKSwgaWRlbnRpdHkgPSBNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLCByb3dzKSwKKyAgICAgICAgICAgICBzcXVhcmUgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgcm93cyksIHJlcyA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCByb3dzKSwKKyAgICAgICAgICAgICBzcXVhcmUyID0gTWF0cml4VHlwZTo6UmFuZG9tKGNvbHMsIGNvbHMpLCByZXMyID0gTWF0cml4VHlwZTo6UmFuZG9tKGNvbHMsIGNvbHMpOwogICBSb3dWZWN0b3JUeXBlIHYxID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLCB2cnJlcyhyb3dzKTsKICAgQ29sVmVjdG9yVHlwZSB2YzIgPSBDb2xWZWN0b3JUeXBlOjpSYW5kb20oY29scyksIHZjcmVzKGNvbHMpOwogICBPdGhlck1ham9yTWF0cml4VHlwZSB0bTEgPSBtMTsKIAotICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKLSAgICAgICAgIHMyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCi0gICAgICAgICBzMyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwgczMgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vYWxpYXMoKSA9IG0xICogbTIuYWRqb2ludCgpLCAgICAgICAgICAgICAgICAgbTEgKiBtMi5hZGpvaW50KCkuZXZhbCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub2FsaWFzKCkgPSBtMS5hZGpvaW50KCkgKiBzcXVhcmUuYWRqb2ludCgpLCAgIG0xLmFkam9pbnQoKS5ldmFsKCkgKiBzcXVhcmUuYWRqb2ludCgpLmV2YWwoKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTMubm9hbGlhcygpID0gbTEuYWRqb2ludCgpICogbTIsICAgICAgICAgICAgICAgICBtMS5hZGpvaW50KCkuZXZhbCgpICogbTIpOwotICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vYWxpYXMoKSA9IChzMSAqIG0xLmFkam9pbnQoKSkgKiBtMiwgICAgICAgICAgKHMxICogbTEuYWRqb2ludCgpKS5ldmFsKCkgKiBtMik7Ci0gIFZFUklGWV9JU19BUFBST1gobTMubm9hbGlhcygpID0gKChzMSAqIG0xKS5hZGpvaW50KCkpICogbTIsICAgICAgICAobnVtZXh0Ojpjb25qKHMxKSAqIG0xLmFkam9pbnQoKSkuZXZhbCgpICogbTIpOwotICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vYWxpYXMoKSA9ICgtIG0xLmFkam9pbnQoKSAqIHMxKSAqIChzMyAqIG0yKSwgKC0gbTEuYWRqb2ludCgpICAqIHMxKS5ldmFsKCkgKiAoczMgKiBtMikuZXZhbCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub2FsaWFzKCkgPSAoczIgKiBtMS5hZGpvaW50KCkgKiBzMSkgKiBtMiwgICAgIChzMiAqIG0xLmFkam9pbnQoKSAgKiBzMSkuZXZhbCgpICogbTIpOwotICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vYWxpYXMoKSA9ICgtbTEqczIpICogczEqbTIuYWRqb2ludCgpLCAgICAgICAgKC1tMSpzMikuZXZhbCgpICogKHMxKm0yLmFkam9pbnQoKSkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub2FsaWFzKCkgPSBtMSAqIG0yLmFkam9pbnQoKSwgbTEgKiBtMi5hZGpvaW50KCkuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMy5ub2FsaWFzKCkgPSBtMS5hZGpvaW50KCkgKiBzcXVhcmUuYWRqb2ludCgpLCBtMS5hZGpvaW50KCkuZXZhbCgpICogc3F1YXJlLmFkam9pbnQoKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vYWxpYXMoKSA9IG0xLmFkam9pbnQoKSAqIG0yLCBtMS5hZGpvaW50KCkuZXZhbCgpICogbTIpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vYWxpYXMoKSA9IChzMSAqIG0xLmFkam9pbnQoKSkgKiBtMiwgKHMxICogbTEuYWRqb2ludCgpKS5ldmFsKCkgKiBtMik7CisgIFZFUklGWV9JU19BUFBST1gobTMubm9hbGlhcygpID0gKChzMSAqIG0xKS5hZGpvaW50KCkpICogbTIsIChudW1leHQ6OmNvbmooczEpICogbTEuYWRqb2ludCgpKS5ldmFsKCkgKiBtMik7CisgIFZFUklGWV9JU19BUFBST1gobTMubm9hbGlhcygpID0gKC1tMS5hZGpvaW50KCkgKiBzMSkgKiAoczMgKiBtMiksICgtbTEuYWRqb2ludCgpICogczEpLmV2YWwoKSAqIChzMyAqIG0yKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vYWxpYXMoKSA9IChzMiAqIG0xLmFkam9pbnQoKSAqIHMxKSAqIG0yLCAoczIgKiBtMS5hZGpvaW50KCkgKiBzMSkuZXZhbCgpICogbTIpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vYWxpYXMoKSA9ICgtbTEgKiBzMikgKiBzMSAqIG0yLmFkam9pbnQoKSwgKC1tMSAqIHMyKS5ldmFsKCkgKiAoczEgKiBtMi5hZGpvaW50KCkpLmV2YWwoKSk7CiAKICAgLy8gYSB2ZXJ5IHRyaWNreSBjYXNlIHdoZXJlIGEgc2NhbGUgZmFjdG9yIGhhcyB0byBiZSBhdXRvbWF0aWNhbGx5IGNvbmp1Z2F0ZWQ6Ci0gIFZFUklGWV9JU19BUFBST1goIG0xLmFkam9pbnQoKSAqIChzMSptMikuY29uanVnYXRlKCksIChtMS5hZGpvaW50KCkpLmV2YWwoKSAqICgoczEqbTIpLmNvbmp1Z2F0ZSgpKS5ldmFsKCkpOwotCisgIFZFUklGWV9JU19BUFBST1gobTEuYWRqb2ludCgpICogKHMxICogbTIpLmNvbmp1Z2F0ZSgpLCAobTEuYWRqb2ludCgpKS5ldmFsKCkgKiAoKHMxICogbTIpLmNvbmp1Z2F0ZSgpKS5ldmFsKCkpOwogCiAgIC8vIHRlc3QgYWxsIHBvc3NpYmxlIGNvbmp1Z2F0ZSBjb21iaW5hdGlvbnMgZm9yIHRoZSBmb3VyIG1hdHJpeC12ZWN0b3IgcHJvZHVjdCBjYXNlczoKIAotICBWRVJJRllfSVNfQVBQUk9YKCgtbTEuY29uanVnYXRlKCkgKiBzMikgKiAoczEgKiB2YzIpLAotICAgICAgICAgICAgICAgICAgICgtbTEuY29uanVnYXRlKCkqczIpLmV2YWwoKSAqIChzMSAqIHZjMikuZXZhbCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgoLW0xICogczIpICogKHMxICogdmMyLmNvbmp1Z2F0ZSgpKSwKLSAgICAgICAgICAgICAgICAgICAoLW0xKnMyKS5ldmFsKCkgKiAoczEgKiB2YzIuY29uanVnYXRlKCkpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1goKC1tMS5jb25qdWdhdGUoKSAqIHMyKSAqIChzMSAqIHZjMiksICgtbTEuY29uanVnYXRlKCkgKiBzMikuZXZhbCgpICogKHMxICogdmMyKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKCgtbTEgKiBzMikgKiAoczEgKiB2YzIuY29uanVnYXRlKCkpLCAoLW0xICogczIpLmV2YWwoKSAqIChzMSAqIHZjMi5jb25qdWdhdGUoKSkuZXZhbCgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgoLW0xLmNvbmp1Z2F0ZSgpICogczIpICogKHMxICogdmMyLmNvbmp1Z2F0ZSgpKSwKLSAgICAgICAgICAgICAgICAgICAoLW0xLmNvbmp1Z2F0ZSgpKnMyKS5ldmFsKCkgKiAoczEgKiB2YzIuY29uanVnYXRlKCkpLmV2YWwoKSk7CisgICAgICAgICAgICAgICAgICAgKC1tMS5jb25qdWdhdGUoKSAqIHMyKS5ldmFsKCkgKiAoczEgKiB2YzIuY29uanVnYXRlKCkpLmV2YWwoKSk7CiAKICAgVkVSSUZZX0lTX0FQUFJPWCgoczEgKiB2YzIudHJhbnNwb3NlKCkpICogKC1tMS5hZGpvaW50KCkgKiBzMiksCi0gICAgICAgICAgICAgICAgICAgKHMxICogdmMyLnRyYW5zcG9zZSgpKS5ldmFsKCkgKiAoLW0xLmFkam9pbnQoKSpzMikuZXZhbCgpKTsKKyAgICAgICAgICAgICAgICAgICAoczEgKiB2YzIudHJhbnNwb3NlKCkpLmV2YWwoKSAqICgtbTEuYWRqb2ludCgpICogczIpLmV2YWwoKSk7CiAgIFZFUklGWV9JU19BUFBST1goKHMxICogdmMyLmFkam9pbnQoKSkgKiAoLW0xLnRyYW5zcG9zZSgpICogczIpLAotICAgICAgICAgICAgICAgICAgIChzMSAqIHZjMi5hZGpvaW50KCkpLmV2YWwoKSAqICgtbTEudHJhbnNwb3NlKCkqczIpLmV2YWwoKSk7CisgICAgICAgICAgICAgICAgICAgKHMxICogdmMyLmFkam9pbnQoKSkuZXZhbCgpICogKC1tMS50cmFuc3Bvc2UoKSAqIHMyKS5ldmFsKCkpOwogICBWRVJJRllfSVNfQVBQUk9YKChzMSAqIHZjMi5hZGpvaW50KCkpICogKC1tMS5hZGpvaW50KCkgKiBzMiksCi0gICAgICAgICAgICAgICAgICAgKHMxICogdmMyLmFkam9pbnQoKSkuZXZhbCgpICogKC1tMS5hZGpvaW50KCkqczIpLmV2YWwoKSk7CisgICAgICAgICAgICAgICAgICAgKHMxICogdmMyLmFkam9pbnQoKSkuZXZhbCgpICogKC1tMS5hZGpvaW50KCkgKiBzMikuZXZhbCgpKTsKIAogICBWRVJJRllfSVNfQVBQUk9YKCgtbTEuYWRqb2ludCgpICogczIpICogKHMxICogdjEudHJhbnNwb3NlKCkpLAotICAgICAgICAgICAgICAgICAgICgtbTEuYWRqb2ludCgpKnMyKS5ldmFsKCkgKiAoczEgKiB2MS50cmFuc3Bvc2UoKSkuZXZhbCgpKTsKKyAgICAgICAgICAgICAgICAgICAoLW0xLmFkam9pbnQoKSAqIHMyKS5ldmFsKCkgKiAoczEgKiB2MS50cmFuc3Bvc2UoKSkuZXZhbCgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgoLW0xLnRyYW5zcG9zZSgpICogczIpICogKHMxICogdjEuYWRqb2ludCgpKSwKLSAgICAgICAgICAgICAgICAgICAoLW0xLnRyYW5zcG9zZSgpKnMyKS5ldmFsKCkgKiAoczEgKiB2MS5hZGpvaW50KCkpLmV2YWwoKSk7CisgICAgICAgICAgICAgICAgICAgKC1tMS50cmFuc3Bvc2UoKSAqIHMyKS5ldmFsKCkgKiAoczEgKiB2MS5hZGpvaW50KCkpLmV2YWwoKSk7CiAgIFZFUklGWV9JU19BUFBST1goKC1tMS5hZGpvaW50KCkgKiBzMikgKiAoczEgKiB2MS5hZGpvaW50KCkpLAotICAgICAgICAgICAgICAgICAgICgtbTEuYWRqb2ludCgpKnMyKS5ldmFsKCkgKiAoczEgKiB2MS5hZGpvaW50KCkpLmV2YWwoKSk7CisgICAgICAgICAgICAgICAgICAgKC1tMS5hZGpvaW50KCkgKiBzMikuZXZhbCgpICogKHMxICogdjEuYWRqb2ludCgpKS5ldmFsKCkpOwogCi0gIFZFUklGWV9JU19BUFBST1goKHMxICogdjEpICogKC1tMS5jb25qdWdhdGUoKSAqIHMyKSwKLSAgICAgICAgICAgICAgICAgICAoczEgKiB2MSkuZXZhbCgpICogKC1tMS5jb25qdWdhdGUoKSpzMikuZXZhbCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgoczEgKiB2MS5jb25qdWdhdGUoKSkgKiAoLW0xICogczIpLAotICAgICAgICAgICAgICAgICAgIChzMSAqIHYxLmNvbmp1Z2F0ZSgpKS5ldmFsKCkgKiAoLW0xKnMyKS5ldmFsKCkpOworICBWRVJJRllfSVNfQVBQUk9YKChzMSAqIHYxKSAqICgtbTEuY29uanVnYXRlKCkgKiBzMiksIChzMSAqIHYxKS5ldmFsKCkgKiAoLW0xLmNvbmp1Z2F0ZSgpICogczIpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1goKHMxICogdjEuY29uanVnYXRlKCkpICogKC1tMSAqIHMyKSwgKHMxICogdjEuY29uanVnYXRlKCkpLmV2YWwoKSAqICgtbTEgKiBzMikuZXZhbCgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgoczEgKiB2MS5jb25qdWdhdGUoKSkgKiAoLW0xLmNvbmp1Z2F0ZSgpICogczIpLAotICAgICAgICAgICAgICAgICAgIChzMSAqIHYxLmNvbmp1Z2F0ZSgpKS5ldmFsKCkgKiAoLW0xLmNvbmp1Z2F0ZSgpKnMyKS5ldmFsKCkpOworICAgICAgICAgICAgICAgICAgIChzMSAqIHYxLmNvbmp1Z2F0ZSgpKS5ldmFsKCkgKiAoLW0xLmNvbmp1Z2F0ZSgpICogczIpLmV2YWwoKSk7CiAKICAgVkVSSUZZX0lTX0FQUFJPWCgoLW0xLmFkam9pbnQoKSAqIHMyKSAqIChzMSAqIHYxLmFkam9pbnQoKSksCi0gICAgICAgICAgICAgICAgICAgKC1tMS5hZGpvaW50KCkqczIpLmV2YWwoKSAqIChzMSAqIHYxLmFkam9pbnQoKSkuZXZhbCgpKTsKKyAgICAgICAgICAgICAgICAgICAoLW0xLmFkam9pbnQoKSAqIHMyKS5ldmFsKCkgKiAoczEgKiB2MS5hZGpvaW50KCkpLmV2YWwoKSk7CiAKICAgLy8gdGVzdCB0aGUgdmVjdG9yLW1hdHJpeCBwcm9kdWN0IHdpdGggbm9uIGFsaWduZWQgc3RhcnRzCi0gIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0xLnJvd3MoKS0yKTsKLSAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsbTEuY29scygpLTIpOwotICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxtMS5yb3dzKCktaSk7Ci0gIEluZGV4IGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLG0xLmNvbHMoKS1qKTsKLSAgSW5kZXggaTIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0xLnJvd3MoKS0xKTsKLSAgSW5kZXggajIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0xLmNvbHMoKS0xKTsKKyAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIG0xLnJvd3MoKSAtIDIpOworICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgbTEuY29scygpIC0gMik7CisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBtMS5yb3dzKCkgLSBpKTsKKyAgSW5kZXggYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIG0xLmNvbHMoKSAtIGopOworICBJbmRleCBpMiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIG0xLnJvd3MoKSAtIDEpOworICBJbmRleCBqMiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIG0xLmNvbHMoKSAtIDEpOwogCi0gIFZFUklGWV9JU19BUFBST1gobTEuY29sKGoyKS5hZGpvaW50KCkgKiBtMS5ibG9jaygwLGosbTEucm93cygpLGMpLCBtMS5jb2woajIpLmFkam9pbnQoKS5ldmFsKCkgKiBtMS5ibG9jaygwLGosbTEucm93cygpLGMpLmV2YWwoKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2soaSwwLHIsbTEuY29scygpKSAqIG0xLnJvdyhpMikuYWRqb2ludCgpLCBtMS5ibG9jayhpLDAscixtMS5jb2xzKCkpLmV2YWwoKSAqIG0xLnJvdyhpMikuYWRqb2ludCgpLmV2YWwoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuY29sKGoyKS5hZGpvaW50KCkgKiBtMS5ibG9jaygwLCBqLCBtMS5yb3dzKCksIGMpLAorICAgICAgICAgICAgICAgICAgIG0xLmNvbChqMikuYWRqb2ludCgpLmV2YWwoKSAqIG0xLmJsb2NrKDAsIGosIG0xLnJvd3MoKSwgYykuZXZhbCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5ibG9jayhpLCAwLCByLCBtMS5jb2xzKCkpICogbTEucm93KGkyKS5hZGpvaW50KCksCisgICAgICAgICAgICAgICAgICAgbTEuYmxvY2soaSwgMCwgciwgbTEuY29scygpKS5ldmFsKCkgKiBtMS5yb3coaTIpLmFkam9pbnQoKS5ldmFsKCkpOwogCiAgIC8vIHRlc3QgbmVnYXRpdmUgc3RyaWRlcwogICB7Ci0gICAgTWFwPE1hdHJpeFR5cGUsVW5hbGlnbmVkLFN0cmlkZTxEeW5hbWljLER5bmFtaWM+ID4gbWFwMSgmbTEocm93cy0xLGNvbHMtMSksIHJvd3MsIGNvbHMsIFN0cmlkZTxEeW5hbWljLER5bmFtaWM+KC1tMS5vdXRlclN0cmlkZSgpLC0xKSk7Ci0gICAgTWFwPE1hdHJpeFR5cGUsVW5hbGlnbmVkLFN0cmlkZTxEeW5hbWljLER5bmFtaWM+ID4gbWFwMigmbTIocm93cy0xLGNvbHMtMSksIHJvd3MsIGNvbHMsIFN0cmlkZTxEeW5hbWljLER5bmFtaWM+KC1tMi5vdXRlclN0cmlkZSgpLC0xKSk7Ci0gICAgTWFwPFJvd1ZlY3RvclR5cGUsVW5hbGlnbmVkLElubmVyU3RyaWRlPC0xPiA+IG1hcHYxKCZ2MSh2MS5zaXplKCktMSksIHYxLnNpemUoKSwgSW5uZXJTdHJpZGU8LTE+KC0xKSk7Ci0gICAgTWFwPENvbFZlY3RvclR5cGUsVW5hbGlnbmVkLElubmVyU3RyaWRlPC0xPiA+IG1hcHZjMigmdmMyKHZjMi5zaXplKCktMSksIHZjMi5zaXplKCksIElubmVyU3RyaWRlPC0xPigtMSkpOworICAgIE1hcDxNYXRyaXhUeXBlLCBVbmFsaWduZWQsIFN0cmlkZTxEeW5hbWljLCBEeW5hbWljPiA+IG1hcDEoJm0xKHJvd3MgLSAxLCBjb2xzIC0gMSksIHJvd3MsIGNvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpZGU8RHluYW1pYywgRHluYW1pYz4oLW0xLm91dGVyU3RyaWRlKCksIC0xKSk7CisgICAgTWFwPE1hdHJpeFR5cGUsIFVuYWxpZ25lZCwgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+ID4gbWFwMigmbTIocm93cyAtIDEsIGNvbHMgLSAxKSwgcm93cywgY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlkZTxEeW5hbWljLCBEeW5hbWljPigtbTIub3V0ZXJTdHJpZGUoKSwgLTEpKTsKKyAgICBNYXA8Um93VmVjdG9yVHlwZSwgVW5hbGlnbmVkLCBJbm5lclN0cmlkZTwtMT4gPiBtYXB2MSgmdjEodjEuc2l6ZSgpIC0gMSksIHYxLnNpemUoKSwgSW5uZXJTdHJpZGU8LTE+KC0xKSk7CisgICAgTWFwPENvbFZlY3RvclR5cGUsIFVuYWxpZ25lZCwgSW5uZXJTdHJpZGU8LTE+ID4gbWFwdmMyKCZ2YzIodmMyLnNpemUoKSAtIDEpLCB2YzIuc2l6ZSgpLCBJbm5lclN0cmlkZTwtMT4oLTEpKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFR5cGUobWFwMSksIG0xLnJldmVyc2UoKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhUeXBlKG1hcDIpLCBtMi5yZXZlcnNlKCkpOwotICAgIFZFUklGWV9JU19BUFBST1gobTMubm9hbGlhcygpID0gTWF0cml4VHlwZShtYXAxKSAqIE1hdHJpeFR5cGUobWFwMikuYWRqb2ludCgpLCBtMS5yZXZlcnNlKCkgKiBtMi5yZXZlcnNlKCkuYWRqb2ludCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLm5vYWxpYXMoKSA9IE1hdHJpeFR5cGUobWFwMSkgKiBNYXRyaXhUeXBlKG1hcDIpLmFkam9pbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgIG0xLnJldmVyc2UoKSAqIG0yLnJldmVyc2UoKS5hZGpvaW50KCkpOwogICAgIFZFUklGWV9JU19BUFBST1gobTMubm9hbGlhcygpID0gbWFwMSAqIG1hcDIuYWRqb2ludCgpLCBtMS5yZXZlcnNlKCkgKiBtMi5yZXZlcnNlKCkuYWRqb2ludCgpKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG1hcDEgKiB2YzIsIG0xLnJldmVyc2UoKSAqIHZjMik7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChtMSAqIG1hcHZjMiwgbTEgKiBtYXB2YzIpOwogICAgIFZFUklGWV9JU19BUFBST1gobWFwMS5hZGpvaW50KCkgKiB2MS50cmFuc3Bvc2UoKSwgbTEuYWRqb2ludCgpLnJldmVyc2UoKSAqIHYxLnRyYW5zcG9zZSgpKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmFkam9pbnQoKSAqIG1hcHYxLnRyYW5zcG9zZSgpLCBtMS5hZGpvaW50KCkgKiB2MS5yZXZlcnNlKCkudHJhbnNwb3NlKCkpOwogICB9Ci0gIAorCiAgIC8vIHJlZ3Jlc3Npb24gdGVzdAogICBNYXRyaXhUeXBlIHRtcCA9IG0xICogbTEuYWRqb2ludCgpICogczE7CiAgIFZFUklGWV9JU19BUFBST1godG1wLCBtMSAqIG0xLmFkam9pbnQoKSAqIHMxKTsKIAogICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxMzQzLCBhc3NpZ25tZW50IHRvIGFycmF5cwotICBBcnJheTxTY2FsYXIsRHluYW1pYywxPiBhMSA9IG0xICogdmMyOwotICBWRVJJRllfSVNfQVBQUk9YKGExLm1hdHJpeCgpLG0xKnZjMik7Ci0gIEFycmF5PFNjYWxhcixEeW5hbWljLDE+IGEyID0gczEgKiAobTEgKiB2YzIpOwotICBWRVJJRllfSVNfQVBQUk9YKGEyLm1hdHJpeCgpLHMxKm0xKnZjMik7Ci0gIEFycmF5PFNjYWxhciwxLER5bmFtaWM+IGEzID0gdjEgKiBtMTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhMy5tYXRyaXgoKSx2MSptMSk7Ci0gIEFycmF5PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGE0ID0gbTEgKiBtMi5hZGpvaW50KCk7Ci0gIFZFUklGWV9JU19BUFBST1goYTQubWF0cml4KCksbTEqbTIuYWRqb2ludCgpKTsKKyAgQXJyYXk8U2NhbGFyLCBEeW5hbWljLCAxPiBhMSA9IG0xICogdmMyOworICBWRVJJRllfSVNfQVBQUk9YKGExLm1hdHJpeCgpLCBtMSAqIHZjMik7CisgIEFycmF5PFNjYWxhciwgRHluYW1pYywgMT4gYTIgPSBzMSAqIChtMSAqIHZjMik7CisgIFZFUklGWV9JU19BUFBST1goYTIubWF0cml4KCksIHMxICogbTEgKiB2YzIpOworICBBcnJheTxTY2FsYXIsIDEsIER5bmFtaWM+IGEzID0gdjEgKiBtMTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhMy5tYXRyaXgoKSwgdjEgKiBtMSk7CisgIEFycmF5PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gYTQgPSBtMSAqIG0yLmFkam9pbnQoKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhNC5tYXRyaXgoKSwgbTEgKiBtMi5hZGpvaW50KCkpOwogfQogCiAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyByZXBvcnRlZCBhdCBodHRwOi8vZm9ydW0ua2RlLm9yZy92aWV3dG9waWMucGhwP2Y9NzQmdD05Njk0Nwotdm9pZCBtYXRfbWF0X3NjYWxhcl9zY2FsYXJfcHJvZHVjdCgpCi17Cit2b2lkIG1hdF9tYXRfc2NhbGFyX3NjYWxhcl9wcm9kdWN0KCkgewogICBFaWdlbjo6TWF0cml4MlhkIGROZHh5KDIsIDMpOwotICBkTmR4eSA8PCAtMC41LCAwLjUsIDAsCi0gICAgICAgICAgIC0wLjMsIDAsIDAuMzsKKyAgZE5keHkgPDwgLTAuNSwgMC41LCAwLCAtMC4zLCAwLCAwLjM7CiAgIGRvdWJsZSBkZXQgPSA2LjAsIHd0ID0gMC41OwotICBWRVJJRllfSVNfQVBQUk9YKGROZHh5LnRyYW5zcG9zZSgpKmROZHh5KmRldCp3dCwgZGV0Knd0KmROZHh5LnRyYW5zcG9zZSgpKmROZHh5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChkTmR4eS50cmFuc3Bvc2UoKSAqIGROZHh5ICogZGV0ICogd3QsIGRldCAqIHd0ICogZE5keHkudHJhbnNwb3NlKCkgKiBkTmR4eSk7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPiAKLXZvaWQgemVyb19zaXplZF9vYmplY3RzKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgemVyb19zaXplZF9vYmplY3RzKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwotICBjb25zdCBpbnQgUGFja2V0U2l6ZSAgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplOwotICBjb25zdCBpbnQgUGFja2V0U2l6ZTEgPSBQYWNrZXRTaXplPjEgPyAgUGFja2V0U2l6ZS0xIDogMTsKKyAgY29uc3QgaW50IFBhY2tldFNpemUgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpzaXplOworICBjb25zdCBpbnQgUGFja2V0U2l6ZTEgPSBQYWNrZXRTaXplID4gMSA/IFBhY2tldFNpemUgLSAxIDogMTsKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7Ci0gIAorCiAgIHsKLSAgICBNYXRyaXhUeXBlIHJlcywgYShyb3dzLDApLCBiKDAsY29scyk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggKHJlcz1hKmIpLCBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsY29scykgKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCAocmVzPWEqYS50cmFuc3Bvc2UoKSksIE1hdHJpeFR5cGU6Olplcm8ocm93cyxyb3dzKSApOwotICAgIFZFUklGWV9JU19BUFBST1goIChyZXM9Yi50cmFuc3Bvc2UoKSpiKSwgTWF0cml4VHlwZTo6WmVybyhjb2xzLGNvbHMpICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggKHJlcz1iLnRyYW5zcG9zZSgpKmEudHJhbnNwb3NlKCkpLCBNYXRyaXhUeXBlOjpaZXJvKGNvbHMscm93cykgKTsKKyAgICBNYXRyaXhUeXBlIHJlcywgYShyb3dzLCAwKSwgYigwLCBjb2xzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChyZXMgPSBhICogYiksIE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scykpOworICAgIFZFUklGWV9JU19BUFBST1goKHJlcyA9IGEgKiBhLnRyYW5zcG9zZSgpKSwgTWF0cml4VHlwZTo6WmVybyhyb3dzLCByb3dzKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgocmVzID0gYi50cmFuc3Bvc2UoKSAqIGIpLCBNYXRyaXhUeXBlOjpaZXJvKGNvbHMsIGNvbHMpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChyZXMgPSBiLnRyYW5zcG9zZSgpICogYS50cmFuc3Bvc2UoKSksIE1hdHJpeFR5cGU6Olplcm8oY29scywgcm93cykpOwogICB9Ci0gIAorCiAgIHsKLSAgICBNYXRyaXhUeXBlIHJlcywgYShyb3dzLGNvbHMpLCBiKGNvbHMsMCk7Ci0gICAgcmVzID0gYSpiOwotICAgIFZFUklGWShyZXMucm93cygpPT1yb3dzICYmIHJlcy5jb2xzKCk9PTApOwotICAgIGIucmVzaXplKDAscm93cyk7Ci0gICAgcmVzID0gYiphOwotICAgIFZFUklGWShyZXMucm93cygpPT0wICYmIHJlcy5jb2xzKCk9PWNvbHMpOworICAgIE1hdHJpeFR5cGUgcmVzLCBhKHJvd3MsIGNvbHMpLCBiKGNvbHMsIDApOworICAgIHJlcyA9IGEgKiBiOworICAgIFZFUklGWShyZXMucm93cygpID09IHJvd3MgJiYgcmVzLmNvbHMoKSA9PSAwKTsKKyAgICBiLnJlc2l6ZSgwLCByb3dzKTsKKyAgICByZXMgPSBiICogYTsKKyAgICBWRVJJRlkocmVzLnJvd3MoKSA9PSAwICYmIHJlcy5jb2xzKCkgPT0gY29scyk7CiAgIH0KLSAgCisKICAgewotICAgIE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZSwwPiBhOwotICAgIE1hdHJpeDxTY2FsYXIsMCwxPiBiOwotICAgIE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZSwxPiByZXM7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggKHJlcz1hKmIpLCBNYXRyaXhUeXBlOjpaZXJvKFBhY2tldFNpemUsMSkgKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCAocmVzPWEubGF6eVByb2R1Y3QoYikpLCBNYXRyaXhUeXBlOjpaZXJvKFBhY2tldFNpemUsMSkgKTsKKyAgICBNYXRyaXg8U2NhbGFyLCBQYWNrZXRTaXplLCAwPiBhOworICAgIE1hdHJpeDxTY2FsYXIsIDAsIDE+IGI7CisgICAgTWF0cml4PFNjYWxhciwgUGFja2V0U2l6ZSwgMT4gcmVzOworICAgIFZFUklGWV9JU19BUFBST1goKHJlcyA9IGEgKiBiKSwgTWF0cml4VHlwZTo6WmVybyhQYWNrZXRTaXplLCAxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgocmVzID0gYS5sYXp5UHJvZHVjdChiKSksIE1hdHJpeFR5cGU6Olplcm8oUGFja2V0U2l6ZSwgMSkpOwogICB9Ci0gIAorCiAgIHsKLSAgICBNYXRyaXg8U2NhbGFyLFBhY2tldFNpemUxLDA+IGE7Ci0gICAgTWF0cml4PFNjYWxhciwwLDE+IGI7Ci0gICAgTWF0cml4PFNjYWxhcixQYWNrZXRTaXplMSwxPiByZXM7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggKHJlcz1hKmIpLCBNYXRyaXhUeXBlOjpaZXJvKFBhY2tldFNpemUxLDEpICk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCggKHJlcz1hLmxhenlQcm9kdWN0KGIpKSwgTWF0cml4VHlwZTo6WmVybyhQYWNrZXRTaXplMSwxKSApOworICAgIE1hdHJpeDxTY2FsYXIsIFBhY2tldFNpemUxLCAwPiBhOworICAgIE1hdHJpeDxTY2FsYXIsIDAsIDE+IGI7CisgICAgTWF0cml4PFNjYWxhciwgUGFja2V0U2l6ZTEsIDE+IHJlczsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChyZXMgPSBhICogYiksIE1hdHJpeFR5cGU6Olplcm8oUGFja2V0U2l6ZTEsIDEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChyZXMgPSBhLmxhenlQcm9kdWN0KGIpKSwgTWF0cml4VHlwZTo6WmVybyhQYWNrZXRTaXplMSwgMSkpOwogICB9Ci0gIAorCiAgIHsKLSAgICBNYXRyaXg8U2NhbGFyLFBhY2tldFNpemUsRHluYW1pYz4gYShQYWNrZXRTaXplLDApOwotICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBiKDAsMSk7Ci0gICAgTWF0cml4PFNjYWxhcixQYWNrZXRTaXplLDE+IHJlczsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCAocmVzPWEqYiksIE1hdHJpeFR5cGU6Olplcm8oUGFja2V0U2l6ZSwxKSApOwotICAgIFZFUklGWV9JU19BUFBST1goIChyZXM9YS5sYXp5UHJvZHVjdChiKSksIE1hdHJpeFR5cGU6Olplcm8oUGFja2V0U2l6ZSwxKSApOworICAgIE1hdHJpeDxTY2FsYXIsIFBhY2tldFNpemUsIER5bmFtaWM+IGEoUGFja2V0U2l6ZSwgMCk7CisgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gYigwLCAxKTsKKyAgICBNYXRyaXg8U2NhbGFyLCBQYWNrZXRTaXplLCAxPiByZXM7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgocmVzID0gYSAqIGIpLCBNYXRyaXhUeXBlOjpaZXJvKFBhY2tldFNpemUsIDEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChyZXMgPSBhLmxhenlQcm9kdWN0KGIpKSwgTWF0cml4VHlwZTo6WmVybyhQYWNrZXRTaXplLCAxKSk7CiAgIH0KLSAgCisKICAgewotICAgIE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZTEsRHluYW1pYz4gYShQYWNrZXRTaXplMSwwKTsKLSAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gYigwLDEpOwotICAgIE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZTEsMT4gcmVzOwotICAgIFZFUklGWV9JU19BUFBST1goIChyZXM9YSpiKSwgTWF0cml4VHlwZTo6WmVybyhQYWNrZXRTaXplMSwxKSApOwotICAgIFZFUklGWV9JU19BUFBST1goIChyZXM9YS5sYXp5UHJvZHVjdChiKSksIE1hdHJpeFR5cGU6Olplcm8oUGFja2V0U2l6ZTEsMSkgKTsKKyAgICBNYXRyaXg8U2NhbGFyLCBQYWNrZXRTaXplMSwgRHluYW1pYz4gYShQYWNrZXRTaXplMSwgMCk7CisgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gYigwLCAxKTsKKyAgICBNYXRyaXg8U2NhbGFyLCBQYWNrZXRTaXplMSwgMT4gcmVzOworICAgIFZFUklGWV9JU19BUFBST1goKHJlcyA9IGEgKiBiKSwgTWF0cml4VHlwZTo6WmVybyhQYWNrZXRTaXplMSwgMSkpOworICAgIFZFUklGWV9JU19BUFBST1goKHJlcyA9IGEubGF6eVByb2R1Y3QoYikpLCBNYXRyaXhUeXBlOjpaZXJvKFBhY2tldFNpemUxLCAxKSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8aW50Pgotdm9pZCBidWdfMTI3KCkKLXsKK3RlbXBsYXRlIDxpbnQ+Cit2b2lkIGJ1Z18xMjcoKSB7CiAgIC8vIEJ1ZyAxMjcKICAgLy8KICAgLy8gYSBwcm9kdWN0IG9mIHRoZSBmb3JtIGxocypyaHMgd2l0aApAQCAtMjExLDM1ICsxOTksMzIgQEAKICAgLy8gUm93c0F0Q29tcGlsZVRpbWUgPSAtMSwgQ29sc0F0Q29tcGlsZVRpbWUgPSAtMQogICAvLyBNYXhSb3dzQXRDb21waWxlVGltZSA9IDUsIE1heENvbHNBdENvbXBpbGVUaW1lID0gMQogICAvLwotICAvLyB3YXMgZmFpbGluZyBvbiBhIHJ1bnRpbWUgYXNzZXJ0aW9uLCBiZWNhdXNlIGl0IGhhZCBiZWVuIG1pcy1jb21waWxlZCBhcyBhIGRvdCBwcm9kdWN0IGJlY2F1c2UgUHJvZHVjdC5oIHdhcyB1c2luZyB0aGUKLSAgLy8gbWF4LXNpemVzIHRvIGRldGVjdCBzaXplIDEgaW5kaWNhdGluZyB2ZWN0b3JzLCBhbmQgdGhhdCBkaWRuJ3QgYWNjb3VudCBmb3IgMC1zaXplZCBvYmplY3Qgd2l0aCBtYXgtc2l6ZSAxLgorICAvLyB3YXMgZmFpbGluZyBvbiBhIHJ1bnRpbWUgYXNzZXJ0aW9uLCBiZWNhdXNlIGl0IGhhZCBiZWVuIG1pcy1jb21waWxlZCBhcyBhIGRvdCBwcm9kdWN0IGJlY2F1c2UgUHJvZHVjdC5oIHdhcyB1c2luZworICAvLyB0aGUgbWF4LXNpemVzIHRvIGRldGVjdCBzaXplIDEgaW5kaWNhdGluZyB2ZWN0b3JzLCBhbmQgdGhhdCBkaWRuJ3QgYWNjb3VudCBmb3IgMC1zaXplZCBvYmplY3Qgd2l0aCBtYXgtc2l6ZSAxLgogCi0gIE1hdHJpeDxmbG9hdCwxLER5bmFtaWMsUm93TWFqb3IsMSw1PiBhKDEsNCk7Ci0gIE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsQ29sTWFqb3IsNSwxPiBiKDQsMCk7Ci0gIGEqYjsKKyAgTWF0cml4PGZsb2F0LCAxLCBEeW5hbWljLCBSb3dNYWpvciwgMSwgNT4gYSgxLCA0KTsKKyAgTWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBDb2xNYWpvciwgNSwgMT4gYig0LCAwKTsKKyAgYSogYjsKIH0KIAotdGVtcGxhdGU8aW50PiB2b2lkIGJ1Z184MTcoKQotewotICBBcnJheVhYZiBCID0gQXJyYXlYWGY6OlJhbmRvbSgxMCwxMCksIEM7Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCBidWdfODE3KCkgeworICBBcnJheVhYZiBCID0gQXJyYXlYWGY6OlJhbmRvbSgxMCwgMTApLCBDOwogICBWZWN0b3JYZiB4ID0gVmVjdG9yWGY6OlJhbmRvbSgxMCk7Ci0gIEMgPSAoeC50cmFuc3Bvc2UoKSpCLm1hdHJpeCgpKTsKLSAgQiA9ICh4LnRyYW5zcG9zZSgpKkIubWF0cml4KCkpOwotICBWRVJJRllfSVNfQVBQUk9YKEIsQyk7CisgIEMgPSAoeC50cmFuc3Bvc2UoKSAqIEIubWF0cml4KCkpOworICBCID0gKHgudHJhbnNwb3NlKCkgKiBCLm1hdHJpeCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChCLCBDKTsKIH0KIAotdGVtcGxhdGU8aW50Pgotdm9pZCB1bmFsaWduZWRfb2JqZWN0cygpCi17Cit0ZW1wbGF0ZSA8aW50Pgordm9pZCB1bmFsaWduZWRfb2JqZWN0cygpIHsKICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciB0aGUgYnVnIHJlcG9ydGVkIGhlcmU6CiAgIC8vIGh0dHA6Ly9mb3J1bS5rZGUub3JnL3ZpZXd0b3BpYy5waHA/Zj03NCZ0PTEwNzU0MQogICAvLyBSZWNhbGwgdGhlIG1hdHJpeCp2ZWN0b3Iga2VybmVsIGF2b2lkIHVuYWxpZ25lZCBsb2FkcyBieSBsb2FkaW5nIHR3byBwYWNrZXRzIGFuZCB0aGVuIHJlYXNzZW1ibGUgdGhlbi4KICAgLy8gVGhlcmUgd2FzIGEgbWlzdGFrZSBpbiB0aGUgY29tcHV0YXRpb24gb2YgdGhlIHZhbGlkIHJhbmdlIGZvciBmdWxseSB1bmFsaWduZWQgb2JqZWN0czogaW4gc29tZSByYXJlIGNhc2VzLAogICAvLyBtZW1vcnkgd2FzIHJlYWQgb3V0c2lkZSB0aGUgYWxsb2NhdGVkIG1hdHJpeCBtZW1vcnkuIFRob3VnaCB0aGUgdmFsdWVzIHdlcmUgbm90IHVzZWQsIHRoaXMgbWlnaHQgcmFpc2Ugc2VnZmF1bHQuCi0gIGZvcihpbnQgbT00NTA7bTw0NjA7KyttKQotICB7Ci0gICAgZm9yKGludCBuPTg7bjwxMjsrK24pCi0gICAgeworICBmb3IgKGludCBtID0gNDUwOyBtIDwgNDYwOyArK20pIHsKKyAgICBmb3IgKGludCBuID0gODsgbiA8IDEyOyArK24pIHsKICAgICAgIE1hdHJpeFhmIE0obSwgbik7CiAgICAgICBWZWN0b3JYZiB2MShuKSwgcjEoNTAwKTsKICAgICAgIFJvd1ZlY3RvclhmIHYyKG0pLCByMigxNik7CkBAIC0yNDcsODkgKzIzMiw4MyBAQAogICAgICAgTS5zZXRSYW5kb20oKTsKICAgICAgIHYxLnNldFJhbmRvbSgpOwogICAgICAgdjIuc2V0UmFuZG9tKCk7Ci0gICAgICBmb3IoaW50IG89MDsgbzw0OyArK28pCi0gICAgICB7Ci0gICAgICAgIHIxLnNlZ21lbnQobyxtKS5ub2FsaWFzKCkgPSBNICogdjE7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gocjEuc2VnbWVudChvLG0pLCBNICogTWF0cml4WGYodjEpKTsKLSAgICAgICAgcjIuc2VnbWVudChvLG4pLm5vYWxpYXMoKSA9IHYyICogTTsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChyMi5zZWdtZW50KG8sbiksIE1hdHJpeFhmKHYyKSAqIE0pOworICAgICAgZm9yIChpbnQgbyA9IDA7IG8gPCA0OyArK28pIHsKKyAgICAgICAgcjEuc2VnbWVudChvLCBtKS5ub2FsaWFzKCkgPSBNICogdjE7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gocjEuc2VnbWVudChvLCBtKSwgTSAqIE1hdHJpeFhmKHYxKSk7CisgICAgICAgIHIyLnNlZ21lbnQobywgbikubm9hbGlhcygpID0gdjIgKiBNOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHIyLnNlZ21lbnQobywgbiksIE1hdHJpeFhmKHYyKSAqIE0pOwogICAgICAgfQogICAgIH0KICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotRUlHRU5fRE9OVF9JTkxJTkUKLUluZGV4IHRlc3RfY29tcHV0ZV9ibG9ja19zaXplKEluZGV4IG0sIEluZGV4IG4sIEluZGV4IGspCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0VJR0VOX0RPTlRfSU5MSU5FIEluZGV4IHRlc3RfY29tcHV0ZV9ibG9ja19zaXplKEluZGV4IG0sIEluZGV4IG4sIEluZGV4IGspIHsKICAgSW5kZXggbWMobSksIG5jKG4pLCBrYyhrKTsKLSAgaW50ZXJuYWw6OmNvbXB1dGVQcm9kdWN0QmxvY2tpbmdTaXplczxULFQ+KGtjLCBtYywgbmMpOwotICByZXR1cm4ga2MrbWMrbmM7CisgIGludGVybmFsOjpjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXM8VCwgVD4oa2MsIG1jLCBuYyk7CisgIHJldHVybiBrYyArIG1jICsgbmM7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1JbmRleCBjb21wdXRlX2Jsb2NrX3NpemUoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitJbmRleCBjb21wdXRlX2Jsb2NrX3NpemUoKSB7CiAgIEluZGV4IHJldCA9IDA7Ci0gIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigwLDEsMSk7Ci0gIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigxLDAsMSk7Ci0gIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigxLDEsMCk7Ci0gIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigwLDAsMSk7Ci0gIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigwLDEsMCk7Ci0gIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigxLDAsMCk7Ci0gIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigwLDAsMCk7CisgIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigwLCAxLCAxKTsKKyAgcmV0ICs9IHRlc3RfY29tcHV0ZV9ibG9ja19zaXplPFQ+KDEsIDAsIDEpOworICByZXQgKz0gdGVzdF9jb21wdXRlX2Jsb2NrX3NpemU8VD4oMSwgMSwgMCk7CisgIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigwLCAwLCAxKTsKKyAgcmV0ICs9IHRlc3RfY29tcHV0ZV9ibG9ja19zaXplPFQ+KDAsIDEsIDApOworICByZXQgKz0gdGVzdF9jb21wdXRlX2Jsb2NrX3NpemU8VD4oMSwgMCwgMCk7CisgIHJldCArPSB0ZXN0X2NvbXB1dGVfYmxvY2tfc2l6ZTxUPigwLCAwLCAwKTsKICAgcmV0dXJuIHJldDsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWU+Ci12b2lkIGFsaWFzaW5nX3dpdGhfcmVzaXplKCkKLXsKLSAgSW5kZXggbSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEwLDUwKTsKLSAgSW5kZXggbiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEwLDUwKTsKLSAgTWF0cml4WGQgQSwgQiwgQyhtLG4pLCBEKG0sbSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+Cit2b2lkIGFsaWFzaW5nX3dpdGhfcmVzaXplKCkgeworICBJbmRleCBtID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMTAsIDUwKTsKKyAgSW5kZXggbiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEwLCA1MCk7CisgIE1hdHJpeFhkIEEsIEIsIEMobSwgbiksIEQobSwgbSk7CiAgIFZlY3RvclhkIGEsIGIsIGMobik7CiAgIEMuc2V0UmFuZG9tKCk7CiAgIEQuc2V0UmFuZG9tKCk7CiAgIGMuc2V0UmFuZG9tKCk7Ci0gIGRvdWJsZSBzID0gaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KDEsMTApOworICBkb3VibGUgcyA9IGludGVybmFsOjpyYW5kb208ZG91YmxlPigxLCAxMCk7CiAKICAgQSA9IEM7CiAgIEIgPSBBICogQS50cmFuc3Bvc2UoKTsKICAgQSA9IEEgKiBBLnRyYW5zcG9zZSgpOwotICBWRVJJRllfSVNfQVBQUk9YKEEsQik7CisgIFZFUklGWV9JU19BUFBST1goQSwgQik7CiAKICAgQSA9IEM7Ci0gIEIgPSAoQSAqIEEudHJhbnNwb3NlKCkpL3M7Ci0gIEEgPSAoQSAqIEEudHJhbnNwb3NlKCkpL3M7Ci0gIFZFUklGWV9JU19BUFBST1goQSxCKTsKKyAgQiA9IChBICogQS50cmFuc3Bvc2UoKSkgLyBzOworICBBID0gKEEgKiBBLnRyYW5zcG9zZSgpKSAvIHM7CisgIFZFUklGWV9JU19BUFBST1goQSwgQik7CiAKICAgQSA9IEM7CiAgIEIgPSAoQSAqIEEudHJhbnNwb3NlKCkpICsgRDsKICAgQSA9IChBICogQS50cmFuc3Bvc2UoKSkgKyBEOwotICBWRVJJRllfSVNfQVBQUk9YKEEsQik7CisgIFZFUklGWV9JU19BUFBST1goQSwgQik7CiAKICAgQSA9IEM7CiAgIEIgPSBEICsgKEEgKiBBLnRyYW5zcG9zZSgpKTsKICAgQSA9IEQgKyAoQSAqIEEudHJhbnNwb3NlKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKEEsQik7CisgIFZFUklGWV9JU19BUFBST1goQSwgQik7CiAKICAgQSA9IEM7CiAgIEIgPSBzICogKEEgKiBBLnRyYW5zcG9zZSgpKTsKICAgQSA9IHMgKiAoQSAqIEEudHJhbnNwb3NlKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKEEsQik7CisgIFZFUklGWV9JU19BUFBST1goQSwgQik7CiAKICAgQSA9IEM7CiAgIGEgPSBjOwotICBiID0gKEEgKiBhKS9zOwotICBhID0gKEEgKiBhKS9zOwotICBWRVJJRllfSVNfQVBQUk9YKGEsYik7CisgIGIgPSAoQSAqIGEpIC8gczsKKyAgYSA9IChBICogYSkgLyBzOworICBWRVJJRllfSVNfQVBQUk9YKGEsIGIpOwogfQogCi10ZW1wbGF0ZTxpbnQ+Ci12b2lkIGJ1Z18xMzA4KCkKLXsKK3RlbXBsYXRlIDxpbnQ+Cit2b2lkIGJ1Z18xMzA4KCkgewogICBpbnQgbiA9IDEwOwotICBNYXRyaXhYZCByKG4sbik7CisgIE1hdHJpeFhkIHIobiwgbik7CiAgIFZlY3RvclhkIHYgPSBWZWN0b3JYZDo6UmFuZG9tKG4pOwogICByID0gdiAqIFJvd1ZlY3RvclhkOjpPbmVzKG4pOwogICBWRVJJRllfSVNfQVBQUk9YKHIsIHYucm93d2lzZSgpLnJlcGxpY2F0ZShuKSk7CkBAIC0zMzgsMjUgKzMxNywyNSBAQAogCiAgIE1hdHJpeDRkIG9uZXM0NCA9IE1hdHJpeDRkOjpPbmVzKCk7CiAgIE1hdHJpeDRkIG00NCA9IE1hdHJpeDRkOjpPbmVzKCkgKiBNYXRyaXg0ZDo6T25lcygpOwotICBWRVJJRllfSVNfQVBQUk9YKG00NCxNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOwotICBWRVJJRllfSVNfQVBQUk9YKG00NC5ub2FsaWFzKCk9b25lczQ0Kk1hdHJpeDRkOjpPbmVzKCksIE1hdHJpeDRkOjpDb25zdGFudCg0KSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTQ0Lm5vYWxpYXMoKT1vbmVzNDQudHJhbnNwb3NlKCkqTWF0cml4NGQ6Ok9uZXMoKSwgTWF0cml4NGQ6OkNvbnN0YW50KDQpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtNDQubm9hbGlhcygpPU1hdHJpeDRkOjpPbmVzKCkqb25lczQ0LCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOwotICBWRVJJRllfSVNfQVBQUk9YKG00NC5ub2FsaWFzKCk9TWF0cml4NGQ6Ok9uZXMoKSpvbmVzNDQudHJhbnNwb3NlKCksIE1hdHJpeDRkOjpDb25zdGFudCg0KSk7CisgIFZFUklGWV9JU19BUFBST1gobTQ0LCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOworICBWRVJJRllfSVNfQVBQUk9YKG00NC5ub2FsaWFzKCkgPSBvbmVzNDQgKiBNYXRyaXg0ZDo6T25lcygpLCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOworICBWRVJJRllfSVNfQVBQUk9YKG00NC5ub2FsaWFzKCkgPSBvbmVzNDQudHJhbnNwb3NlKCkgKiBNYXRyaXg0ZDo6T25lcygpLCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOworICBWRVJJRllfSVNfQVBQUk9YKG00NC5ub2FsaWFzKCkgPSBNYXRyaXg0ZDo6T25lcygpICogb25lczQ0LCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOworICBWRVJJRllfSVNfQVBQUk9YKG00NC5ub2FsaWFzKCkgPSBNYXRyaXg0ZDo6T25lcygpICogb25lczQ0LnRyYW5zcG9zZSgpLCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOwogCi0gIHR5cGVkZWYgTWF0cml4PGRvdWJsZSw0LDQsUm93TWFqb3I+IFJNYXRyaXg0ZDsKKyAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLCA0LCA0LCBSb3dNYWpvcj4gUk1hdHJpeDRkOwogICBSTWF0cml4NGQgcjQ0ID0gTWF0cml4NGQ6Ok9uZXMoKSAqIE1hdHJpeDRkOjpPbmVzKCk7Ci0gIFZFUklGWV9JU19BUFBST1gocjQ0LE1hdHJpeDRkOjpDb25zdGFudCg0KSk7Ci0gIFZFUklGWV9JU19BUFBST1gocjQ0Lm5vYWxpYXMoKT1vbmVzNDQqTWF0cml4NGQ6Ok9uZXMoKSwgTWF0cml4NGQ6OkNvbnN0YW50KDQpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyNDQubm9hbGlhcygpPW9uZXM0NC50cmFuc3Bvc2UoKSpNYXRyaXg0ZDo6T25lcygpLCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHI0NC5ub2FsaWFzKCk9TWF0cml4NGQ6Ok9uZXMoKSpvbmVzNDQsIE1hdHJpeDRkOjpDb25zdGFudCg0KSk7Ci0gIFZFUklGWV9JU19BUFBST1gocjQ0Lm5vYWxpYXMoKT1NYXRyaXg0ZDo6T25lcygpKm9uZXM0NC50cmFuc3Bvc2UoKSwgTWF0cml4NGQ6OkNvbnN0YW50KDQpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyNDQubm9hbGlhcygpPW9uZXM0NCpSTWF0cml4NGQ6Ok9uZXMoKSwgTWF0cml4NGQ6OkNvbnN0YW50KDQpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyNDQubm9hbGlhcygpPW9uZXM0NC50cmFuc3Bvc2UoKSpSTWF0cml4NGQ6Ok9uZXMoKSwgTWF0cml4NGQ6OkNvbnN0YW50KDQpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyNDQubm9hbGlhcygpPVJNYXRyaXg0ZDo6T25lcygpKm9uZXM0NCwgTWF0cml4NGQ6OkNvbnN0YW50KDQpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyNDQubm9hbGlhcygpPVJNYXRyaXg0ZDo6T25lcygpKm9uZXM0NC50cmFuc3Bvc2UoKSwgTWF0cml4NGQ6OkNvbnN0YW50KDQpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyNDQsIE1hdHJpeDRkOjpDb25zdGFudCg0KSk7CisgIFZFUklGWV9JU19BUFBST1gocjQ0Lm5vYWxpYXMoKSA9IG9uZXM0NCAqIE1hdHJpeDRkOjpPbmVzKCksIE1hdHJpeDRkOjpDb25zdGFudCg0KSk7CisgIFZFUklGWV9JU19BUFBST1gocjQ0Lm5vYWxpYXMoKSA9IG9uZXM0NC50cmFuc3Bvc2UoKSAqIE1hdHJpeDRkOjpPbmVzKCksIE1hdHJpeDRkOjpDb25zdGFudCg0KSk7CisgIFZFUklGWV9JU19BUFBST1gocjQ0Lm5vYWxpYXMoKSA9IE1hdHJpeDRkOjpPbmVzKCkgKiBvbmVzNDQsIE1hdHJpeDRkOjpDb25zdGFudCg0KSk7CisgIFZFUklGWV9JU19BUFBST1gocjQ0Lm5vYWxpYXMoKSA9IE1hdHJpeDRkOjpPbmVzKCkgKiBvbmVzNDQudHJhbnNwb3NlKCksIE1hdHJpeDRkOjpDb25zdGFudCg0KSk7CisgIFZFUklGWV9JU19BUFBST1gocjQ0Lm5vYWxpYXMoKSA9IG9uZXM0NCAqIFJNYXRyaXg0ZDo6T25lcygpLCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOworICBWRVJJRllfSVNfQVBQUk9YKHI0NC5ub2FsaWFzKCkgPSBvbmVzNDQudHJhbnNwb3NlKCkgKiBSTWF0cml4NGQ6Ok9uZXMoKSwgTWF0cml4NGQ6OkNvbnN0YW50KDQpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyNDQubm9hbGlhcygpID0gUk1hdHJpeDRkOjpPbmVzKCkgKiBvbmVzNDQsIE1hdHJpeDRkOjpDb25zdGFudCg0KSk7CisgIFZFUklGWV9JU19BUFBST1gocjQ0Lm5vYWxpYXMoKSA9IFJNYXRyaXg0ZDo6T25lcygpICogb25lczQ0LnRyYW5zcG9zZSgpLCBNYXRyaXg0ZDo6Q29uc3RhbnQoNCkpOwogCi0vLyAgIFJvd1ZlY3RvcjRkIHI0OworICAvLyAgIFJvd1ZlY3RvcjRkIHI0OwogICBtNDQuc2V0T25lcygpOwogICByNDQuc2V0WmVybygpOwogICBWRVJJRllfSVNfQVBQUk9YKHI0NC5ub2FsaWFzKCkgKz0gbTQ0LnJvdygwKS50cmFuc3Bvc2UoKSAqIFJvd1ZlY3RvcjRkOjpPbmVzKCksIG9uZXM0NCk7CkBAIC0zNjgsMjMgKzM0NywyNiBAQAogICBWRVJJRllfSVNfQVBQUk9YKHI0NC5ub2FsaWFzKCkgKz0gVmVjdG9yNGQ6Ok9uZXMoKSAqIG00NC5jb2woMCkudHJhbnNwb3NlKCksIG9uZXM0NCk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChwcm9kdWN0X2V4dHJhKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBwcm9kdWN0X2V4dHJhKE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIHByb2R1Y3RfZXh0cmEoTWF0cml4WGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggbWF0X21hdF9zY2FsYXJfc2NhbGFyX3Byb2R1Y3QoKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBwcm9kdWN0X2V4dHJhKE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggcHJvZHVjdF9leHRyYShNYXRyaXhYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIHplcm9fc2l6ZWRfb2JqZWN0cyhNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOworRUlHRU5fREVDTEFSRV9URVNUKHByb2R1Y3RfZXh0cmEpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEocHJvZHVjdF9leHRyYSgKKyAgICAgICAgTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIocHJvZHVjdF9leHRyYSgKKyAgICAgICAgTWF0cml4WGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIobWF0X21hdF9zY2FsYXJfc2NhbGFyX3Byb2R1Y3QoKSk7CisgICAgQ0FMTF9TVUJURVNUXzMocHJvZHVjdF9leHRyYShNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDIpKSkpOworICAgIENBTExfU1VCVEVTVF80KHByb2R1Y3RfZXh0cmEoTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMSh6ZXJvX3NpemVkX29iamVjdHMoCisgICAgICAgIE1hdHJpeFhmKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwogICB9Ci0gIENBTExfU1VCVEVTVF81KCBidWdfMTI3PDA+KCkgKTsKLSAgQ0FMTF9TVUJURVNUXzUoIGJ1Z184MTc8MD4oKSApOwotICBDQUxMX1NVQlRFU1RfNSggYnVnXzEzMDg8MD4oKSApOwotICBDQUxMX1NVQlRFU1RfNiggdW5hbGlnbmVkX29iamVjdHM8MD4oKSApOwotICBDQUxMX1NVQlRFU1RfNyggY29tcHV0ZV9ibG9ja19zaXplPGZsb2F0PigpICk7Ci0gIENBTExfU1VCVEVTVF83KCBjb21wdXRlX2Jsb2NrX3NpemU8ZG91YmxlPigpICk7Ci0gIENBTExfU1VCVEVTVF83KCBjb21wdXRlX2Jsb2NrX3NpemU8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpICk7Ci0gIENBTExfU1VCVEVTVF84KCBhbGlhc2luZ193aXRoX3Jlc2l6ZTx2b2lkPigpICk7Ci0KKyAgQ0FMTF9TVUJURVNUXzUoYnVnXzEyNzwwPigpKTsKKyAgQ0FMTF9TVUJURVNUXzUoYnVnXzgxNzwwPigpKTsKKyAgQ0FMTF9TVUJURVNUXzUoYnVnXzEzMDg8MD4oKSk7CisgIENBTExfU1VCVEVTVF82KHVuYWxpZ25lZF9vYmplY3RzPDA+KCkpOworICBDQUxMX1NVQlRFU1RfNyhjb21wdXRlX2Jsb2NrX3NpemU8ZmxvYXQ+KCkpOworICBDQUxMX1NVQlRFU1RfNyhjb21wdXRlX2Jsb2NrX3NpemU8ZG91YmxlPigpKTsKKyAgQ0FMTF9TVUJURVNUXzcoY29tcHV0ZV9ibG9ja19zaXplPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CisgIENBTExfU1VCVEVTVF84KGFsaWFzaW5nX3dpdGhfcmVzaXplPHZvaWQ+KCkpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9wcm9kdWN0X2xhcmdlLmNwcCBiL3Rlc3QvcHJvZHVjdF9sYXJnZS5jcHAKaW5kZXggOGE5ZDdmOC4uYjMyMTNlYyAxMDA2NDQKLS0tIGEvdGVzdC9wcm9kdWN0X2xhcmdlLmNwcAorKysgYi90ZXN0L3Byb2R1Y3RfbGFyZ2UuY3BwCkBAIC0xMCwxMjMgKzEwLDE0MSBAQAogI2luY2x1ZGUgInByb2R1Y3QuaCIKICNpbmNsdWRlIDxFaWdlbi9MVT4KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXZvaWQgdGVzdF9hbGlhc2luZygpCi17Ci0gIGludCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTIpOwotICBpbnQgY29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDEyKTsKLSAgdHlwZWRlZiBNYXRyaXg8VCxEeW5hbWljLER5bmFtaWM+IE1hdHJpeFR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFQsRHluYW1pYywxPiBWZWN0b3JUeXBlOwotICBWZWN0b3JUeXBlIHgoY29scyk7IHguc2V0UmFuZG9tKCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdF9hbGlhc2luZygpIHsKKyAgaW50IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTIpOworICBpbnQgY29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAxMik7CisgIHR5cGVkZWYgTWF0cml4PFQsIER5bmFtaWMsIER5bmFtaWM+IE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFQsIER5bmFtaWMsIDE+IFZlY3RvclR5cGU7CisgIFZlY3RvclR5cGUgeChjb2xzKTsKKyAgeC5zZXRSYW5kb20oKTsKICAgVmVjdG9yVHlwZSB6KHgpOwotICBWZWN0b3JUeXBlIHkocm93cyk7IHkuc2V0WmVybygpOwotICBNYXRyaXhUeXBlIEEocm93cyxjb2xzKTsgQS5zZXRSYW5kb20oKTsKKyAgVmVjdG9yVHlwZSB5KHJvd3MpOworICB5LnNldFplcm8oKTsKKyAgTWF0cml4VHlwZSBBKHJvd3MsIGNvbHMpOworICBBLnNldFJhbmRvbSgpOwogICAvLyBDd2lzZUJpbmFyeU9wCi0gIFZFUklGWV9JU19BUFBST1goeCA9IHkgKyBBKngsIEEqeik7ICAgICAvLyBPSyBiZWNhdXNlICJ5ICsgQSp4IiBpcyBtYXJrZWQgYXMgImFzc3VtZS1hbGlhc2luZyIKKyAgVkVSSUZZX0lTX0FQUFJPWCh4ID0geSArIEEgKiB4LCBBICogeik7ICAvLyBPSyBiZWNhdXNlICJ5ICsgQSp4IiBpcyBtYXJrZWQgYXMgImFzc3VtZS1hbGlhc2luZyIKICAgeCA9IHo7CiAgIC8vIEN3aXNlVW5hcnlPcAotICBWRVJJRllfSVNfQVBQUk9YKHggPSBUKDEuKSooQSp4KSwgQSp6KTsgLy8gT0sgYmVjYXVzZSAxKihBKngpIGlzIHJlcGxhY2VkIGJ5ICgxKkEqeCkgd2hpY2ggaXMgYSBQcm9kdWN0PD4gZXhwcmVzc2lvbgorICBWRVJJRllfSVNfQVBQUk9YKHggPSBUKDEuKSAqIChBICogeCksCisgICAgICAgICAgICAgICAgICAgQSAqIHopOyAgLy8gT0sgYmVjYXVzZSAxKihBKngpIGlzIHJlcGxhY2VkIGJ5ICgxKkEqeCkgd2hpY2ggaXMgYSBQcm9kdWN0PD4gZXhwcmVzc2lvbgogICB4ID0gejsKICAgLy8gVkVSSUZZX0lTX0FQUFJPWCh4ID0geS1BKngsIC1BKnopOyAgIC8vIE5vdCBPSyBpbiAzLjMgYmVjYXVzZSB4IGlzIHJlc2l6ZWQgYmVmb3JlIEEqeCBnZXRzIGV2YWx1YXRlZAogICB4ID0gejsKIH0KIAotdGVtcGxhdGU8aW50Pgotdm9pZCBwcm9kdWN0X2xhcmdlX3JlZ3Jlc3Npb25zKCkKLXsKK3RlbXBsYXRlIDxpbnQ+Cit2b2lkIHByb2R1Y3RfbGFyZ2VfcmVncmVzc2lvbnMoKSB7CiAgIHsKICAgICAvLyB0ZXN0IGEgc3BlY2lmaWMgaXNzdWUgaW4gRGlhZ29uYWxQcm9kdWN0CiAgICAgaW50IE4gPSAxMDAwMDAwOwogICAgIFZlY3RvclhmIHYgPSBWZWN0b3JYZjo6T25lcyhOKTsKLSAgICBNYXRyaXhYZiBtID0gTWF0cml4WGY6Ok9uZXMoTiwzKTsKLSAgICBtID0gKHYrdikuYXNEaWFnb25hbCgpICogbTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0sIE1hdHJpeFhmOjpDb25zdGFudChOLDMsMikpOworICAgIE1hdHJpeFhmIG0gPSBNYXRyaXhYZjo6T25lcyhOLCAzKTsKKyAgICBtID0gKHYgKyB2KS5hc0RpYWdvbmFsKCkgKiBtOworICAgIFZFUklGWV9JU19BUFBST1gobSwgTWF0cml4WGY6OkNvbnN0YW50KE4sIDMsIDIpKTsKICAgfQogCiAgIHsKICAgICAvLyB0ZXN0IGRlZmVycmVkIHJlc2l6aW5nIGluIE1hdHJpeDo6b3BlcmF0b3I9Ci0gICAgTWF0cml4WGYgYSA9IE1hdHJpeFhmOjpSYW5kb20oMTAsNCksIGIgPSBNYXRyaXhYZjo6UmFuZG9tKDQsMTApLCBjID0gYTsKKyAgICBNYXRyaXhYZiBhID0gTWF0cml4WGY6OlJhbmRvbSgxMCwgNCksIGIgPSBNYXRyaXhYZjo6UmFuZG9tKDQsIDEwKSwgYyA9IGE7CiAgICAgVkVSSUZZX0lTX0FQUFJPWCgoYSA9IGEgKiBiKSwgKGMgKiBiKS5ldmFsKCkpOwogICB9CiAKICAgewogICAgIC8vIGNoZWNrIHRoZSBmdW5jdGlvbnMgdG8gc2V0dXAgYmxvY2tpbmcgc2l6ZXMgY29tcGlsZSBhbmQgZG8gbm90IHNlZ2ZhdWx0CiAgICAgLy8gRklYTUUgY2hlY2sgdGhleSBkbyB3aGF0IHRoZXkgYXJlIHN1cHBvc2VkIHRvIGRvICEhCi0gICAgc3RkOjpwdHJkaWZmX3QgbDEgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAwMDAsMjAwMDApOwotICAgIHN0ZDo6cHRyZGlmZl90IGwyID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwMDAwMCwyMDAwMDApOwotICAgIHN0ZDo6cHRyZGlmZl90IGwzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwMDAwMDAsMjAwMDAwMCk7Ci0gICAgc2V0Q3B1Q2FjaGVTaXplcyhsMSxsMixsMyk7Ci0gICAgVkVSSUZZKGwxPT1sMUNhY2hlU2l6ZSgpKTsKLSAgICBWRVJJRlkobDI9PWwyQ2FjaGVTaXplKCkpOwotICAgIHN0ZDo6cHRyZGlmZl90IGsxID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLDEwMCkqMTY7Ci0gICAgc3RkOjpwdHJkaWZmX3QgbTEgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsMTAwKSoxNjsKLSAgICBzdGQ6OnB0cmRpZmZfdCBuMSA9IGludGVybmFsOjpyYW5kb208aW50PigxMCwxMDApKjE2OworICAgIHN0ZDo6cHRyZGlmZl90IGwxID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwMDAwLCAyMDAwMCk7CisgICAgc3RkOjpwdHJkaWZmX3QgbDIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAwMDAwLCAyMDAwMDApOworICAgIHN0ZDo6cHRyZGlmZl90IGwzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwMDAwMDAsIDIwMDAwMDApOworICAgIHNldENwdUNhY2hlU2l6ZXMobDEsIGwyLCBsMyk7CisgICAgVkVSSUZZKGwxID09IGwxQ2FjaGVTaXplKCkpOworICAgIFZFUklGWShsMiA9PSBsMkNhY2hlU2l6ZSgpKTsKKyAgICBzdGQ6OnB0cmRpZmZfdCBrMSA9IGludGVybmFsOjpyYW5kb208aW50PigxMCwgMTAwKSAqIDE2OworICAgIHN0ZDo6cHRyZGlmZl90IG0xID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLCAxMDApICogMTY7CisgICAgc3RkOjpwdHJkaWZmX3QgbjEgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsIDEwMCkgKiAxNjsKICAgICAvLyBvbmx5IG1ha2VzIHN1cmUgaXQgY29tcGlsZXMgZmluZQotICAgIGludGVybmFsOjpjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXM8ZmxvYXQsZmxvYXQsc3RkOjpwdHJkaWZmX3Q+KGsxLG0xLG4xLDEpOworICAgIGludGVybmFsOjpjb21wdXRlUHJvZHVjdEJsb2NraW5nU2l6ZXM8ZmxvYXQsIGZsb2F0LCBzdGQ6OnB0cmRpZmZfdD4oazEsIG0xLCBuMSwgMSk7CiAgIH0KIAogICB7CiAgICAgLy8gdGVzdCByZWdyZXNzaW9uIGluIHJvdy12ZWN0b3IgYnkgbWF0cml4IChiYWQgTWFwIHR5cGUpCi0gICAgTWF0cml4WGYgbWF0MSgxMCwzMik7IG1hdDEuc2V0UmFuZG9tKCk7Ci0gICAgTWF0cml4WGYgbWF0MigzMiwzMik7IG1hdDIuc2V0UmFuZG9tKCk7Ci0gICAgTWF0cml4WGYgcjEgPSBtYXQxLnJvdygyKSptYXQyLnRyYW5zcG9zZSgpOwotICAgIFZFUklGWV9JU19BUFBST1gocjEsIChtYXQxLnJvdygyKSptYXQyLnRyYW5zcG9zZSgpKS5ldmFsKCkpOworICAgIE1hdHJpeFhmIG1hdDEoMTAsIDMyKTsKKyAgICBtYXQxLnNldFJhbmRvbSgpOworICAgIE1hdHJpeFhmIG1hdDIoMzIsIDMyKTsKKyAgICBtYXQyLnNldFJhbmRvbSgpOworICAgIE1hdHJpeFhmIHIxID0gbWF0MS5yb3coMikgKiBtYXQyLnRyYW5zcG9zZSgpOworICAgIFZFUklGWV9JU19BUFBST1gocjEsIChtYXQxLnJvdygyKSAqIG1hdDIudHJhbnNwb3NlKCkpLmV2YWwoKSk7CiAKLSAgICBNYXRyaXhYZiByMiA9IG1hdDEucm93KDIpKm1hdDI7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChyMiwgKG1hdDEucm93KDIpKm1hdDIpLmV2YWwoKSk7CisgICAgTWF0cml4WGYgcjIgPSBtYXQxLnJvdygyKSAqIG1hdDI7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyMiwgKG1hdDEucm93KDIpICogbWF0MikuZXZhbCgpKTsKICAgfQogCiAgIHsKLSAgICBFaWdlbjo6TWF0cml4WGQgQSgxMCwxMCksIEIsIEM7CisgICAgRWlnZW46Ok1hdHJpeFhkIEEoMTAsIDEwKSwgQiwgQzsKICAgICBBLnNldFJhbmRvbSgpOwogICAgIEMgPSBBOwotICAgIGZvcihpbnQgaz0wOyBrPDc5OyArK2spCi0gICAgICBDID0gQyAqIEE7Ci0gICAgQi5ub2FsaWFzKCkgPSAoKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpICogKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKQotICAgICAgICAgICAgICAgICogKCgoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSAqICgoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChCLEMpOworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzk7ICsraykgQyA9IEMgKiBBOworICAgIEIubm9hbGlhcygpID0KKyAgICAgICAgKCgoQSAqIEEpICogKEEgKiBBKSkgKiAoKEEgKiBBKSAqIChBICogQSkpICogKChBICogQSkgKiAoQSAqIEEpKSAqICgoQSAqIEEpICogKEEgKiBBKSkgKiAoKEEgKiBBKSAqIChBICogQSkpICoKKyAgICAgICAgICgoQSAqIEEpICogKEEgKiBBKSkgKiAoKEEgKiBBKSAqIChBICogQSkpICogKChBICogQSkgKiAoQSAqIEEpKSAqICgoQSAqIEEpICogKEEgKiBBKSkgKiAoKEEgKiBBKSAqIChBICogQSkpKSAqCisgICAgICAgICgoKEEgKiBBKSAqIChBICogQSkpICogKChBICogQSkgKiAoQSAqIEEpKSAqICgoQSAqIEEpICogKEEgKiBBKSkgKiAoKEEgKiBBKSAqIChBICogQSkpICogKChBICogQSkgKiAoQSAqIEEpKSAqCisgICAgICAgICAoKEEgKiBBKSAqIChBICogQSkpICogKChBICogQSkgKiAoQSAqIEEpKSAqICgoQSAqIEEpICogKEEgKiBBKSkgKiAoKEEgKiBBKSAqIChBICogQSkpICogKChBICogQSkgKiAoQSAqIEEpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChCLCBDKTsKICAgfQogfQogCi10ZW1wbGF0ZTxpbnQ+Cit0ZW1wbGF0ZSA8aW50Pgogdm9pZCBidWdfMTYyMigpIHsKICAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLCAyLCAtMSwgMCwgMiwgLTE+IE1hdDJYOwotICBNYXQyWCB4KDIsMik7IHguc2V0UmFuZG9tKCk7Ci0gIE1hdHJpeFhkIHkoMiwyKTsgeS5zZXRSYW5kb20oKTsKKyAgTWF0MlggeCgyLCAyKTsKKyAgeC5zZXRSYW5kb20oKTsKKyAgTWF0cml4WGQgeSgyLCAyKTsKKyAgeS5zZXRSYW5kb20oKTsKICAgY29uc3QgTWF0MlggSzEgPSB4ICogeS5pbnZlcnNlKCk7CiAgIGNvbnN0IE1hdHJpeDJkIEsyID0geCAqIHkuaW52ZXJzZSgpOwotICBWRVJJRllfSVNfQVBQUk9YKEsxLEsyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChLMSwgSzIpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QocHJvZHVjdF9sYXJnZSkKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggcHJvZHVjdChNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBwcm9kdWN0KE1hdHJpeFhkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIHByb2R1Y3QoTWF0cml4WGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTApLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCkpKSApOworRUlHRU5fREVDTEFSRV9URVNUKHByb2R1Y3RfbGFyZ2UpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEocHJvZHVjdCgKKyAgICAgICAgTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIocHJvZHVjdCgKKyAgICAgICAgTWF0cml4WGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIocHJvZHVjdChNYXRyaXhYZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTApLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTApKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzMoIHByb2R1Y3QoTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggcHJvZHVjdChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIHByb2R1Y3QoTWF0cml4PGZsb2F0LER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhwcm9kdWN0KAorICAgICAgICBNYXRyaXhYaShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChwcm9kdWN0KE1hdHJpeFhjZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMikpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUocHJvZHVjdChNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfMSggdGVzdF9hbGlhc2luZzxmbG9hdD4oKSApOworICAgIENBTExfU1VCVEVTVF8xKHRlc3RfYWxpYXNpbmc8ZmxvYXQ+KCkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzYoIGJ1Z18xNjIyPDE+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNihidWdfMTYyMjwxPigpKTsKIAotICAgIENBTExfU1VCVEVTVF83KCBwcm9kdWN0KE1hdHJpeFhjZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOCggcHJvZHVjdChNYXRyaXg8ZG91YmxlLER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOSggcHJvZHVjdChNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PixEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEwKCBwcm9kdWN0KE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPixEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzExKCBwcm9kdWN0KE1hdHJpeDxiZmxvYXQxNixEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzcocHJvZHVjdChNYXRyaXhYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDIpKSkpOworICAgIENBTExfU1VCVEVTVF84KHByb2R1Y3QoTWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzkocHJvZHVjdChNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+KAorICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTAocHJvZHVjdChNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPigKKyAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzExKHByb2R1Y3QoTWF0cml4PGJmbG9hdDE2LCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4oCisgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwogICB9CiAKLSAgQ0FMTF9TVUJURVNUXzYoIHByb2R1Y3RfbGFyZ2VfcmVncmVzc2lvbnM8MD4oKSApOworICBDQUxMX1NVQlRFU1RfNihwcm9kdWN0X2xhcmdlX3JlZ3Jlc3Npb25zPDA+KCkpOwogCiAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDcxNDoKICNpZiBkZWZpbmVkIEVJR0VOX0hBU19PUEVOTVAKICAgb21wX3NldF9keW5hbWljKDEpOwotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF82KCBwcm9kdWN0KE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF82KHByb2R1Y3QoTWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKICAgfQogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3RfbW10ci5jcHAgYi90ZXN0L3Byb2R1Y3RfbW10ci5jcHAKaW5kZXggOGY4YzVmZS4uZjE3N2I2OSAxMDA2NDQKLS0tIGEvdGVzdC9wcm9kdWN0X21tdHIuY3BwCisrKyBiL3Rlc3QvcHJvZHVjdF9tbXRyLmNwcApAQCAtOSw2NiArOSw3MiBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi0jZGVmaW5lIENIRUNLX01NVFIoREVTVCwgVFJJLCBPUCkgeyAgICAgICAgICAgICAgICAgICBcCi0gICAgcmVmMyA9IERFU1Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmVmMiA9IHJlZjEgPSBERVNUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgREVTVC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxUUkk+KCkgT1A7ICAgICAgICAgICBcCi0gICAgcmVmMSBPUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmVmMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxUUkk+KCkgICAgICAgICAgICAgICBcCi0gICAgICA9IHJlZjEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VFJJPigpOyAgICAgICAgICBcCi0gICAgVkVSSUZZX0lTX0FQUFJPWChERVNULHJlZjIpOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgXAotICAgIERFU1QgPSByZWYzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJlZjMgPSByZWYyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJlZjMuZGlhZ29uYWwoKSA9IERFU1QuZGlhZ29uYWwoKTsgICAgICAgICAgICAgICAgXAotICAgIERFU1QudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VFJJfFplcm9EaWFnPigpIE9QOyAgXAotICAgIFZFUklGWV9JU19BUFBST1goREVTVCxyZWYzKTsgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBDSEVDS19NTVRSKERFU1QsIFRSSSwgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVmMyA9IERFU1Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlZjIgPSByZWYxID0gREVTVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERVNULnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFRSST4oKSBPUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVmMSBPUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlZjIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VFJJPigpID0gcmVmMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxUUkk+KCk7IFwKKyAgICBWRVJJRllfSVNfQVBQUk9YKERFU1QsIHJlZjIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFU1QgPSByZWYzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWYzID0gcmVmMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVmMy5kaWFnb25hbCgpID0gREVTVC5kaWFnb25hbCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFU1QudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VFJJIHwgWmVyb0RpYWc+KCkgT1A7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWRVJJRllfSVNfQVBQUk9YKERFU1QsIHJlZjMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIG1tdHIoaW50IHNpemUpCi17Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+IE1hdHJpeENvbE1hajsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4gTWF0cml4Um93TWFqOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgbW10cihpbnQgc2l6ZSkgeworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIENvbE1ham9yPiBNYXRyaXhDb2xNYWo7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+IE1hdHJpeFJvd01hajsKIAotICBEZW5zZUluZGV4IG90aGVyc2l6ZSA9IGludGVybmFsOjpyYW5kb208RGVuc2VJbmRleD4oMSwyMDApOwotICAKKyAgRGVuc2VJbmRleCBvdGhlcnNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPERlbnNlSW5kZXg+KDEsIDIwMCk7CisKICAgTWF0cml4Q29sTWFqIG1hdGMgPSBNYXRyaXhDb2xNYWo6Olplcm8oc2l6ZSwgc2l6ZSk7CiAgIE1hdHJpeFJvd01haiBtYXRyID0gTWF0cml4Um93TWFqOjpaZXJvKHNpemUsIHNpemUpOwotICBNYXRyaXhDb2xNYWogcmVmMShzaXplLCBzaXplKSwgcmVmMihzaXplLCBzaXplKSwgcmVmMyhzaXplLHNpemUpOwotICAKLSAgTWF0cml4Q29sTWFqIHNvYyhzaXplLG90aGVyc2l6ZSk7IHNvYy5zZXRSYW5kb20oKTsKLSAgTWF0cml4Q29sTWFqIG9zYyhvdGhlcnNpemUsc2l6ZSk7IG9zYy5zZXRSYW5kb20oKTsKLSAgTWF0cml4Um93TWFqIHNvcihzaXplLG90aGVyc2l6ZSk7IHNvci5zZXRSYW5kb20oKTsKLSAgTWF0cml4Um93TWFqIG9zcihvdGhlcnNpemUsc2l6ZSk7IG9zci5zZXRSYW5kb20oKTsKLSAgTWF0cml4Q29sTWFqIHNxYyhzaXplLHNpemUpOyBzcWMuc2V0UmFuZG9tKCk7Ci0gIE1hdHJpeFJvd01haiBzcXIoc2l6ZSxzaXplKTsgc3FyLnNldFJhbmRvbSgpOwotICAKKyAgTWF0cml4Q29sTWFqIHJlZjEoc2l6ZSwgc2l6ZSksIHJlZjIoc2l6ZSwgc2l6ZSksIHJlZjMoc2l6ZSwgc2l6ZSk7CisKKyAgTWF0cml4Q29sTWFqIHNvYyhzaXplLCBvdGhlcnNpemUpOworICBzb2Muc2V0UmFuZG9tKCk7CisgIE1hdHJpeENvbE1haiBvc2Mob3RoZXJzaXplLCBzaXplKTsKKyAgb3NjLnNldFJhbmRvbSgpOworICBNYXRyaXhSb3dNYWogc29yKHNpemUsIG90aGVyc2l6ZSk7CisgIHNvci5zZXRSYW5kb20oKTsKKyAgTWF0cml4Um93TWFqIG9zcihvdGhlcnNpemUsIHNpemUpOworICBvc3Iuc2V0UmFuZG9tKCk7CisgIE1hdHJpeENvbE1haiBzcWMoc2l6ZSwgc2l6ZSk7CisgIHNxYy5zZXRSYW5kb20oKTsKKyAgTWF0cml4Um93TWFqIHNxcihzaXplLCBzaXplKTsKKyAgc3FyLnNldFJhbmRvbSgpOworCiAgIFNjYWxhciBzID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7Ci0gIAotICBDSEVDS19NTVRSKG1hdGMsIExvd2VyLCA9IHMqc29jKnNvci5hZGpvaW50KCkpOwotICBDSEVDS19NTVRSKG1hdGMsIFVwcGVyLCA9IHMqKHNvYypzb2MuYWRqb2ludCgpKSk7Ci0gIENIRUNLX01NVFIobWF0ciwgTG93ZXIsID0gcypzb2Mqc29jLmFkam9pbnQoKSk7Ci0gIENIRUNLX01NVFIobWF0ciwgVXBwZXIsID0gc29jKihzKnNvci5hZGpvaW50KCkpKTsKLSAgCi0gIENIRUNLX01NVFIobWF0YywgTG93ZXIsICs9IHMqc29jKnNvYy5hZGpvaW50KCkpOwotICBDSEVDS19NTVRSKG1hdGMsIFVwcGVyLCArPSBzKihzb2Mqc29yLnRyYW5zcG9zZSgpKSk7Ci0gIENIRUNLX01NVFIobWF0ciwgTG93ZXIsICs9IHMqc29yKnNvYy5hZGpvaW50KCkpOwotICBDSEVDS19NTVRSKG1hdHIsIFVwcGVyLCArPSBzb2MqKHMqc29jLmFkam9pbnQoKSkpOwotICAKLSAgQ0hFQ0tfTU1UUihtYXRjLCBMb3dlciwgLT0gcypzb2Mqc29jLmFkam9pbnQoKSk7Ci0gIENIRUNLX01NVFIobWF0YywgVXBwZXIsIC09IHMqKG9zYy50cmFuc3Bvc2UoKSpvc2MuY29uanVnYXRlKCkpKTsKLSAgQ0hFQ0tfTU1UUihtYXRyLCBMb3dlciwgLT0gcypzb2Mqc29jLmFkam9pbnQoKSk7Ci0gIENIRUNLX01NVFIobWF0ciwgVXBwZXIsIC09IHNvYyoocypzb2MuYWRqb2ludCgpKSk7Ci0gIAotICBDSEVDS19NTVRSKG1hdGMsIExvd2VyLCAtPSBzKnNxcipzcWMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpOwotICBDSEVDS19NTVRSKG1hdGMsIFVwcGVyLCA9IHMqc3FjKnNxci50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSk7Ci0gIENIRUNLX01NVFIobWF0YywgTG93ZXIsICs9IHMqc3FyKnNxYy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSk7Ci0gIENIRUNLX01NVFIobWF0YywgVXBwZXIsID0gcypzcWMqc3FjLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKTsKLSAgCi0gIENIRUNLX01NVFIobWF0YywgTG93ZXIsID0gKHMqc3FyKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSpzcWMpOwotICBDSEVDS19NTVRSKG1hdGMsIFVwcGVyLCAtPSAocypzcWMpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKnNxYyk7Ci0gIENIRUNLX01NVFIobWF0YywgTG93ZXIsID0gKHMqc3FyKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSpzcWMpOwotICBDSEVDS19NTVRSKG1hdGMsIFVwcGVyLCArPSAocypzcWMpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKnNxYyk7CisKKyAgQ0hFQ0tfTU1UUihtYXRjLCBMb3dlciwgPSBzICogc29jICogc29yLmFkam9pbnQoKSk7CisgIENIRUNLX01NVFIobWF0YywgVXBwZXIsID0gcyAqIChzb2MgKiBzb2MuYWRqb2ludCgpKSk7CisgIENIRUNLX01NVFIobWF0ciwgTG93ZXIsID0gcyAqIHNvYyAqIHNvYy5hZGpvaW50KCkpOworICBDSEVDS19NTVRSKG1hdHIsIFVwcGVyLCA9IHNvYyAqIChzICogc29yLmFkam9pbnQoKSkpOworCisgIENIRUNLX01NVFIobWF0YywgTG93ZXIsICs9IHMgKiBzb2MgKiBzb2MuYWRqb2ludCgpKTsKKyAgQ0hFQ0tfTU1UUihtYXRjLCBVcHBlciwgKz0gcyAqIChzb2MgKiBzb3IudHJhbnNwb3NlKCkpKTsKKyAgQ0hFQ0tfTU1UUihtYXRyLCBMb3dlciwgKz0gcyAqIHNvciAqIHNvYy5hZGpvaW50KCkpOworICBDSEVDS19NTVRSKG1hdHIsIFVwcGVyLCArPSBzb2MgKiAocyAqIHNvYy5hZGpvaW50KCkpKTsKKworICBDSEVDS19NTVRSKG1hdGMsIExvd2VyLCAtPSBzICogc29jICogc29jLmFkam9pbnQoKSk7CisgIENIRUNLX01NVFIobWF0YywgVXBwZXIsIC09IHMgKiAob3NjLnRyYW5zcG9zZSgpICogb3NjLmNvbmp1Z2F0ZSgpKSk7CisgIENIRUNLX01NVFIobWF0ciwgTG93ZXIsIC09IHMgKiBzb2MgKiBzb2MuYWRqb2ludCgpKTsKKyAgQ0hFQ0tfTU1UUihtYXRyLCBVcHBlciwgLT0gc29jICogKHMgKiBzb2MuYWRqb2ludCgpKSk7CisKKyAgQ0hFQ0tfTU1UUihtYXRjLCBMb3dlciwgLT0gcyAqIHNxciAqIHNxYy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSk7CisgIENIRUNLX01NVFIobWF0YywgVXBwZXIsID0gcyAqIHNxYyAqIHNxci50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSk7CisgIENIRUNLX01NVFIobWF0YywgTG93ZXIsICs9IHMgKiBzcXIgKiBzcWMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpOworICBDSEVDS19NTVRSKG1hdGMsIFVwcGVyLCA9IHMgKiBzcWMgKiBzcWMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpOworCisgIENIRUNLX01NVFIobWF0YywgTG93ZXIsID0gKHMgKiBzcXIpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogc3FjKTsKKyAgQ0hFQ0tfTU1UUihtYXRjLCBVcHBlciwgLT0gKHMgKiBzcWMpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogc3FjKTsKKyAgQ0hFQ0tfTU1UUihtYXRjLCBMb3dlciwgPSAocyAqIHNxcikudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKiBzcWMpOworICBDSEVDS19NTVRSKG1hdGMsIFVwcGVyLCArPSAocyAqIHNxYykudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKiBzcWMpOwogCiAgIC8vIGNoZWNrIGFsaWFzaW5nCiAgIHJlZjIgPSByZWYxID0gbWF0YzsKQEAgLTg2LDIxICs5MiwyMCBAQAogICAvLyBkZXN0aW5hdGlvbiB3aXRoIGEgbm9uLWRlZmF1bHQgaW5uZXItc3RyaWRlCiAgIC8vIHNlZSBidWcgMTc0MQogICB7Ci0gICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gTWF0cml4WDsKLSAgICBNYXRyaXhYIGJ1ZmZlcigyKnNpemUsMipzaXplKTsKLSAgICBNYXA8TWF0cml4Q29sTWFqLDAsU3RyaWRlPER5bmFtaWMsRHluYW1pYz4gPiBtYXAxKGJ1ZmZlci5kYXRhKCksc2l6ZSxzaXplLFN0cmlkZTxEeW5hbWljLER5bmFtaWM+KDIqc2l6ZSwyKSk7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBNYXRyaXhYOworICAgIE1hdHJpeFggYnVmZmVyKDIgKiBzaXplLCAyICogc2l6ZSk7CisgICAgTWFwPE1hdHJpeENvbE1haiwgMCwgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+ID4gbWFwMShidWZmZXIuZGF0YSgpLCBzaXplLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+KDIgKiBzaXplLCAyKSk7CiAgICAgYnVmZmVyLnNldFplcm8oKTsKLSAgICBDSEVDS19NTVRSKG1hcDEsIExvd2VyLCA9IHMqc29jKnNvci5hZGpvaW50KCkpOworICAgIENIRUNLX01NVFIobWFwMSwgTG93ZXIsID0gcyAqIHNvYyAqIHNvci5hZGpvaW50KCkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChwcm9kdWN0X21tdHIpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdCA7IGkrKykKLSAgewotICAgIENBTExfU1VCVEVTVF8xKChtbXRyPGZsb2F0PihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKLSAgICBDQUxMX1NVQlRFU1RfMigobW10cjxkb3VibGU+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwotICAgIENBTExfU1VCVEVTVF8zKChtbXRyPHN0ZDo6Y29tcGxleDxmbG9hdD4gPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpKSkpOwotICAgIENBTExfU1VCVEVTVF80KChtbXRyPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChwcm9kdWN0X21tdHIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoKG1tdHI8ZmxvYXQ+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMigobW10cjxkb3VibGU+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMygobW10cjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgobW10cjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMikpKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvcHJvZHVjdF9ub3RlbXBvcmFyeS5jcHAgYi90ZXN0L3Byb2R1Y3Rfbm90ZW1wb3JhcnkuY3BwCmluZGV4IDIwY2I3YzAuLjc3YTI5NjkgMTAwNjQ0Ci0tLSBhL3Rlc3QvcHJvZHVjdF9ub3RlbXBvcmFyeS5jcHAKKysrIGIvdGVzdC9wcm9kdWN0X25vdGVtcG9yYXJ5LmNwcApAQCAtMTEsMzkgKzExLDM2IEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAKLXRlbXBsYXRlPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHM+Ci12b2lkIGNoZWNrX3NjYWxhcl9tdWx0aXBsZTMoRHN0ICZkc3QsIGNvbnN0IExocyYgQSwgY29uc3QgUmhzJiBCKQotewotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggKGRzdC5ub2FsaWFzKCkgID0gQSAqIEIpLCAwKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggZHN0LCAoQS5ldmFsKCkgKiBCLmV2YWwoKSkuZXZhbCgpICk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCAoZHN0Lm5vYWxpYXMoKSArPSBBICogQiksIDApOwotICBWRVJJRllfSVNfQVBQUk9YKCBkc3QsIDIqKEEuZXZhbCgpICogQi5ldmFsKCkpLmV2YWwoKSApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggKGRzdC5ub2FsaWFzKCkgLT0gQSAqIEIpLCAwKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggZHN0LCAoQS5ldmFsKCkgKiBCLmV2YWwoKSkuZXZhbCgpICk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KK3ZvaWQgY2hlY2tfc2NhbGFyX211bHRpcGxlMyhEc3QmIGRzdCwgY29uc3QgTGhzJiBBLCBjb25zdCBSaHMmIEIpIHsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoKGRzdC5ub2FsaWFzKCkgPSBBICogQiksIDApOworICBWRVJJRllfSVNfQVBQUk9YKGRzdCwgKEEuZXZhbCgpICogQi5ldmFsKCkpLmV2YWwoKSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKChkc3Qubm9hbGlhcygpICs9IEEgKiBCKSwgMCk7CisgIFZFUklGWV9JU19BUFBST1goZHN0LCAyICogKEEuZXZhbCgpICogQi5ldmFsKCkpLmV2YWwoKSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKChkc3Qubm9hbGlhcygpIC09IEEgKiBCKSwgMCk7CisgIFZFUklGWV9JU19BUFBST1goZHN0LCAoQS5ldmFsKCkgKiBCLmV2YWwoKSkuZXZhbCgpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgUzI+Ci12b2lkIGNoZWNrX3NjYWxhcl9tdWx0aXBsZTIoRHN0ICZkc3QsIGNvbnN0IExocyYgQSwgY29uc3QgUmhzJiBCLCBTMiBzMikKLXsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zY2FsYXJfbXVsdGlwbGUzKGRzdCwgQSwgICAgQikgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zY2FsYXJfbXVsdGlwbGUzKGRzdCwgQSwgICAtQikgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zY2FsYXJfbXVsdGlwbGUzKGRzdCwgQSwgczIqQikgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zY2FsYXJfbXVsdGlwbGUzKGRzdCwgQSwgQipzMikgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zY2FsYXJfbXVsdGlwbGUzKGRzdCwgQSwgKEIqczIpLmNvbmp1Z2F0ZSgpKSApOwordGVtcGxhdGUgPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFMyPgordm9pZCBjaGVja19zY2FsYXJfbXVsdGlwbGUyKERzdCYgZHN0LCBjb25zdCBMaHMmIEEsIGNvbnN0IFJocyYgQiwgUzIgczIpIHsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NjYWxhcl9tdWx0aXBsZTMoZHN0LCBBLCBCKSk7CisgIENBTExfU1VCVEVTVChjaGVja19zY2FsYXJfbXVsdGlwbGUzKGRzdCwgQSwgLUIpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NjYWxhcl9tdWx0aXBsZTMoZHN0LCBBLCBzMiAqIEIpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NjYWxhcl9tdWx0aXBsZTMoZHN0LCBBLCBCICogczIpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NjYWxhcl9tdWx0aXBsZTMoZHN0LCBBLCAoQiAqIHMyKS5jb25qdWdhdGUoKSkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEc3QsIHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBTMSwgdHlwZW5hbWUgUzI+Ci12b2lkIGNoZWNrX3NjYWxhcl9tdWx0aXBsZTEoRHN0ICZkc3QsIGNvbnN0IExocyYgQSwgY29uc3QgUmhzJiBCLCBTMSBzMSwgUzIgczIpCi17Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfc2NhbGFyX211bHRpcGxlMihkc3QsICAgIEEsIEIsIHMyKSApOwotICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NjYWxhcl9tdWx0aXBsZTIoZHN0LCAgIC1BLCBCLCBzMikgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zY2FsYXJfbXVsdGlwbGUyKGRzdCwgczEqQSwgQiwgczIpICk7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfc2NhbGFyX211bHRpcGxlMihkc3QsIEEqczEsIEIsIHMyKSApOwotICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NjYWxhcl9tdWx0aXBsZTIoZHN0LCAoQSpzMSkuY29uanVnYXRlKCksIEIsIHMyKSApOwordGVtcGxhdGUgPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgTGhzLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIFMxLCB0eXBlbmFtZSBTMj4KK3ZvaWQgY2hlY2tfc2NhbGFyX211bHRpcGxlMShEc3QmIGRzdCwgY29uc3QgTGhzJiBBLCBjb25zdCBSaHMmIEIsIFMxIHMxLCBTMiBzMikgeworICBDQUxMX1NVQlRFU1QoY2hlY2tfc2NhbGFyX211bHRpcGxlMihkc3QsIEEsIEIsIHMyKSk7CisgIENBTExfU1VCVEVTVChjaGVja19zY2FsYXJfbXVsdGlwbGUyKGRzdCwgLUEsIEIsIHMyKSk7CisgIENBTExfU1VCVEVTVChjaGVja19zY2FsYXJfbXVsdGlwbGUyKGRzdCwgczEgKiBBLCBCLCBzMikpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfc2NhbGFyX211bHRpcGxlMihkc3QsIEEgKiBzMSwgQiwgczIpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NjYWxhcl9tdWx0aXBsZTIoZHN0LCAoQSAqIHMxKS5jb25qdWdhdGUoKSwgQiwgczIpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBwcm9kdWN0X25vdGVtcG9yYXJ5KGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcHJvZHVjdF9ub3RlbXBvcmFyeShjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIC8qIFRoaXMgdGVzdCBjaGVja3MgdGhlIG51bWJlciBvZiB0ZW1wb3JhcmllcyBjcmVhdGVkCiAgICAqIGR1cmluZyB0aGUgZXZhbHVhdGlvbiBvZiBhIGNvbXBsZXggZXhwcmVzc2lvbiAqLwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CkBAIC01NiwxNTQgKzUzLDE2NyBAQAogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKIAotICBDb2xNYWpvck1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworICBDb2xNYWpvck1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKTsKICAgUm93VmVjdG9yVHlwZSBydjEgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksIHJ2cmVzKHJvd3MpOwogICBDb2xWZWN0b3JUeXBlIGN2MSA9IENvbFZlY3RvclR5cGU6OlJhbmRvbShjb2xzKSwgY3ZyZXMoY29scyk7CiAgIFJvd01ham9yTWF0cml4VHlwZSBybTMocm93cywgY29scyk7CiAKLSAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCi0gICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAotICAgICAgICAgczMgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksIHMyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksIHMzID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAKLSAgSW5kZXggYzAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4Pig0LGNvbHMtOCksCi0gICAgICAgIGMxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oOCxjb2xzLWMwKSwKLSAgICAgICAgcjAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4Pig0LGNvbHMtOCksCi0gICAgICAgIHIxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oOCxyb3dzLXIwKTsKKyAgSW5kZXggYzAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4Pig0LCBjb2xzIC0gOCksIGMxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oOCwgY29scyAtIGMwKSwKKyAgICAgICAgcjAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4Pig0LCBjb2xzIC0gOCksIHIxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oOCwgcm93cyAtIHIwKTsKIAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMgPSAobTEgKiBtMi5hZGpvaW50KCkpLCAxKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zID0gKG0xICogbTIuYWRqb2ludCgpKS50cmFuc3Bvc2UoKSwgMSk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSBtMSAqIG0yLmFkam9pbnQoKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG0zID0gKG0xICogbTIuYWRqb2ludCgpKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG0zID0gKG0xICogbTIuYWRqb2ludCgpKS50cmFuc3Bvc2UoKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG0zLm5vYWxpYXMoKSA9IG0xICogbTIuYWRqb2ludCgpLCAwKTsKIAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMgPSBzMSAqIChtMSAqIG0yLnRyYW5zcG9zZSgpKSwgMSk7Ci0vLyAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMyA9IG0zICsgczEgKiAobTEgKiBtMi50cmFuc3Bvc2UoKSksIDEpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpID0gczEgKiAobTEgKiBtMi50cmFuc3Bvc2UoKSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtMyA9IHMxICogKG0xICogbTIudHJhbnNwb3NlKCkpLCAxKTsKKyAgLy8gICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMgPSBtMyArIHMxICogKG0xICogbTIudHJhbnNwb3NlKCkpLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTMubm9hbGlhcygpID0gczEgKiAobTEgKiBtMi50cmFuc3Bvc2UoKSksIDApOwogCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMyA9IG0zICsgKG0xICogbTIuYWRqb2ludCgpKSwgMSk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMyA9IG0zIC0gKG0xICogbTIuYWRqb2ludCgpKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG0zID0gbTMgKyAobTEgKiBtMi5hZGpvaW50KCkpLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTMgPSBtMyAtIChtMSAqIG0yLmFkam9pbnQoKSksIDEpOwogCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMyA9IG0zICsgKG0xICogbTIuYWRqb2ludCgpKS50cmFuc3Bvc2UoKSwgMSk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSBtMyArIG0xICogbTIudHJhbnNwb3NlKCksIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpICs9IG0zICsgbTEgKiBtMi50cmFuc3Bvc2UoKSwgMCk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgLT0gbTMgKyBtMSAqIG0yLnRyYW5zcG9zZSgpLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9ICBtMyAtIG0xICogbTIudHJhbnNwb3NlKCksIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpICs9IG0zIC0gbTEgKiBtMi50cmFuc3Bvc2UoKSwgMCk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgLT0gbTMgLSBtMSAqIG0yLnRyYW5zcG9zZSgpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTMgPSBtMyArIChtMSAqIG0yLmFkam9pbnQoKSkudHJhbnNwb3NlKCksIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtMy5ub2FsaWFzKCkgPSBtMyArIG0xICogbTIudHJhbnNwb3NlKCksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtMy5ub2FsaWFzKCkgKz0gbTMgKyBtMSAqIG0yLnRyYW5zcG9zZSgpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTMubm9hbGlhcygpIC09IG0zICsgbTEgKiBtMi50cmFuc3Bvc2UoKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG0zLm5vYWxpYXMoKSA9IG0zIC0gbTEgKiBtMi50cmFuc3Bvc2UoKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG0zLm5vYWxpYXMoKSArPSBtMyAtIG0xICogbTIudHJhbnNwb3NlKCksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtMy5ub2FsaWFzKCkgLT0gbTMgLSBtMSAqIG0yLnRyYW5zcG9zZSgpLCAwKTsKIAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpID0gczEgKiBtMSAqIHMyICogbTIuYWRqb2ludCgpLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9IHMxICogbTEgKiBzMiAqIChtMSpzMyttMipzMikuYWRqb2ludCgpLCAxKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9IChzMSAqIG0xKS5hZGpvaW50KCkgKiBzMiAqIG0yLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSArPSBzMSAqICgtbTEqczMpLmFkam9pbnQoKSAqIChzMiAqIG0yICogczMpLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSAtPSBzMSAqIChtMS50cmFuc3Bvc2UoKSAqIG0yKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG0zLm5vYWxpYXMoKSA9IHMxICogbTEgKiBzMiAqIG0yLmFkam9pbnQoKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG0zLm5vYWxpYXMoKSA9IHMxICogbTEgKiBzMiAqIChtMSAqIHMzICsgbTIgKiBzMikuYWRqb2ludCgpLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTMubm9hbGlhcygpID0gKHMxICogbTEpLmFkam9pbnQoKSAqIHMyICogbTIsIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtMy5ub2FsaWFzKCkgKz0gczEgKiAoLW0xICogczMpLmFkam9pbnQoKSAqIChzMiAqIG0yICogczMpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTMubm9hbGlhcygpIC09IHMxICogKG0xLnRyYW5zcG9zZSgpICogbTIpLCAwKTsKIAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCgoIG0zLmJsb2NrKHIwLHIwLHIxLHIxKS5ub2FsaWFzKCkgKz0gLW0xLmJsb2NrKHIwLGMwLHIxLGMxKSAqIChzMiptMi5ibG9jayhyMCxjMCxyMSxjMSkpLmFkam9pbnQoKSApLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoKCBtMy5ibG9jayhyMCxyMCxyMSxyMSkubm9hbGlhcygpIC09IHMxICogbTEuYmxvY2socjAsYzAscjEsYzEpICogbTIuYmxvY2soYzAscjAsYzEscjEpICksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCgKKyAgICAgIChtMy5ibG9jayhyMCwgcjAsIHIxLCByMSkubm9hbGlhcygpICs9IC1tMS5ibG9jayhyMCwgYzAsIHIxLCBjMSkgKiAoczIgKiBtMi5ibG9jayhyMCwgYzAsIHIxLCBjMSkpLmFkam9pbnQoKSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCgKKyAgICAgIChtMy5ibG9jayhyMCwgcjAsIHIxLCByMSkubm9hbGlhcygpIC09IHMxICogbTEuYmxvY2socjAsIGMwLCByMSwgYzEpICogbTIuYmxvY2soYzAsIHIwLCBjMSwgcjEpKSwgMCk7CiAKICAgLy8gTk9URSB0aGlzIGlzIGJlY2F1c2UgdGhlIEJsb2NrIGV4cHJlc3Npb24gaXMgbm90IGhhbmRsZWQgeWV0IGJ5IG91ciBleHByZXNzaW9uIGFuYWx5c2VyCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCggbTMuYmxvY2socjAscjAscjEscjEpLm5vYWxpYXMoKSA9IHMxICogbTEuYmxvY2socjAsYzAscjEsYzEpICogKHMxKm0yKS5ibG9jayhjMCxyMCxjMSxyMSkgKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKAorICAgICAgKG0zLmJsb2NrKHIwLCByMCwgcjEsIHIxKS5ub2FsaWFzKCkgPSBzMSAqIG0xLmJsb2NrKHIwLCBjMCwgcjEsIGMxKSAqIChzMSAqIG0yKS5ibG9jayhjMCwgcjAsIGMxLCByMSkpLCAxKTsKIAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpIC09IChzMSAqIG0xKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSAqIG0yLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIHJtMy5ub2FsaWFzKCkgPSAoczEgKiBtMS5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogKG0yK20yKSwgMSk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBybTMubm9hbGlhcygpID0gKHMxICogbTEuYWRqb2ludCgpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCkgKiBtMi5hZGpvaW50KCksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtMy5ub2FsaWFzKCkgLT0gKHMxICogbTEpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICogbTIsIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChybTMubm9hbGlhcygpID0gKHMxICogbTEuYWRqb2ludCgpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIChtMiArIG0yKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKHJtMy5ub2FsaWFzKCkgPSAoczEgKiBtMS5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRVcHBlcj4oKSAqIG0yLmFkam9pbnQoKSwgMCk7CiAKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpID0gKG0xICogbTIuYWRqb2ludCgpKSwgMCk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAtPSAobTEgKiBtMi5hZGpvaW50KCkpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSAobTEgKiBtMi5hZGpvaW50KCkpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgLT0gKG0xICogbTIuYWRqb2ludCgpKSwgMCk7CiAKLSAgLy8gTk9URSB0aGlzIGlzIGJlY2F1c2UgdGhlIGJsYXNfdHJhaXRzIHJlcXVpcmUgaW5uZXJzdHJpZGU9PTEgdG8gYXZvaWQgYSB0ZW1wb3JhcnksIGJ1dCB0aGF0IGRvZXNuJ3Qgc2VlbSB0byBiZSBhY3R1YWxseSBuZWVkZWQgZm9yIHRoZSB0cmlhbmd1bGFyIHByb2R1Y3RzCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBybTMuY29sKGMwKS5ub2FsaWFzKCkgPSAoczEgKiBtMS5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRVcHBlcj4oKSAqIChzMiptMi5yb3coYzApKS5hZGpvaW50KCksIDEpOworICAvLyBOT1RFIHRoaXMgaXMgYmVjYXVzZSB0aGUgYmxhc190cmFpdHMgcmVxdWlyZSBpbm5lcnN0cmlkZT09MSB0byBhdm9pZCBhIHRlbXBvcmFyeSwgYnV0IHRoYXQgZG9lc24ndCBzZWVtIHRvIGJlCisgIC8vIGFjdHVhbGx5IG5lZWRlZCBmb3IgdGhlIHRyaWFuZ3VsYXIgcHJvZHVjdHMKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoCisgICAgICBybTMuY29sKGMwKS5ub2FsaWFzKCkgPSAoczEgKiBtMS5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRVcHBlcj4oKSAqIChzMiAqIG0yLnJvdyhjMCkpLmFkam9pbnQoKSwKKyAgICAgIDEpOwogCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2UobTMpLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2UobTMudHJhbnNwb3NlKCkpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmVJblBsYWNlKG0zKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2UobTMudHJhbnNwb3NlKCkpLCAwKTsKIAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpIC09IChzMSAqIG0xKS5hZGpvaW50KCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKC1tMipzMykuYWRqb2ludCgpLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9IHMyICogbTIuYWRqb2ludCgpICogKHMxICogbTEuYWRqb2ludCgpKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggcm0zLm5vYWxpYXMoKSA9IChzMSAqIG0xLmFkam9pbnQoKSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogbTIuYWRqb2ludCgpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTMubm9hbGlhcygpIC09IChzMSAqIG0xKS5hZGpvaW50KCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKC1tMiAqIHMzKS5hZGpvaW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtMy5ub2FsaWFzKCkgPSBzMiAqIG0yLmFkam9pbnQoKSAqIChzMSAqIG0xLmFkam9pbnQoKSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQocm0zLm5vYWxpYXMoKSA9IChzMSAqIG0xLmFkam9pbnQoKSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogbTIuYWRqb2ludCgpLCAwKTsKIAotICAvLyBOT1RFIHRoaXMgaXMgYmVjYXVzZSB0aGUgYmxhc190cmFpdHMgcmVxdWlyZSBpbm5lcnN0cmlkZT09MSB0byBhdm9pZCBhIHRlbXBvcmFyeSwgYnV0IHRoYXQgZG9lc24ndCBzZWVtIHRvIGJlIGFjdHVhbGx5IG5lZWRlZCBmb3IgdGhlIHRyaWFuZ3VsYXIgcHJvZHVjdHMKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLmNvbChjMCkubm9hbGlhcygpID0gKHMxICogbTEpLmFkam9pbnQoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoLW0yLnJvdyhjMCkqczMpLmFkam9pbnQoKSwgMSk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5jb2woYzApLm5vYWxpYXMoKSAtPSAoczEgKiBtMSkuYWRqb2ludCgpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqICgtbTIucm93KGMwKSpzMykuYWRqb2ludCgpLCAxKTsKKyAgLy8gTk9URSB0aGlzIGlzIGJlY2F1c2UgdGhlIGJsYXNfdHJhaXRzIHJlcXVpcmUgaW5uZXJzdHJpZGU9PTEgdG8gYXZvaWQgYSB0ZW1wb3JhcnksIGJ1dCB0aGF0IGRvZXNuJ3Qgc2VlbSB0byBiZQorICAvLyBhY3R1YWxseSBuZWVkZWQgZm9yIHRoZSB0cmlhbmd1bGFyIHByb2R1Y3RzCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKAorICAgICAgbTMuY29sKGMwKS5ub2FsaWFzKCkgPSAoczEgKiBtMSkuYWRqb2ludCgpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqICgtbTIucm93KGMwKSAqIHMzKS5hZGpvaW50KCksIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCgKKyAgICAgIG0zLmNvbChjMCkubm9hbGlhcygpIC09IChzMSAqIG0xKS5hZGpvaW50KCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogKC1tMi5yb3coYzApICogczMpLmFkam9pbnQoKSwgMSk7CiAKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLmJsb2NrKHIwLGMwLHIxLGMxKS5ub2FsaWFzKCkgKz0gbTEuYmxvY2socjAscjAscjEscjEpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqIChzMSptMi5ibG9jayhyMCxjMCxyMSxjMSkpLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLmJsb2NrKHIwLGMwLHIxLGMxKS5ub2FsaWFzKCkgPSBtMS5ibG9jayhyMCxyMCxyMSxyMSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogbTIuYmxvY2socjAsYzAscjEsYzEpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTMuYmxvY2socjAsIGMwLCByMSwgYzEpLm5vYWxpYXMoKSArPQorICAgICAgICAgICAgICAgICAgICAgICAgICBtMS5ibG9jayhyMCwgcjAsIHIxLCByMSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogKHMxICogbTIuYmxvY2socjAsIGMwLCByMSwgYzEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG0zLmJsb2NrKHIwLCBjMCwgcjEsIGMxKS5ub2FsaWFzKCkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTEuYmxvY2socjAsIHIwLCByMSwgcjEpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqIG0yLmJsb2NrKHIwLCBjMCwgcjEsIGMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CiAKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0yLmFkam9pbnQoKSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtMy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShtMi5hZGpvaW50KCkpLCAwKTsKIAotICAvLyBIZXJlIHdlIHdpbGwgZ2V0IDEgdGVtcG9yYXJ5IGZvciBlYWNoIHJlc2l6ZSBvcGVyYXRpb24gb2YgdGhlIGxocyBvcGVyYXRvcjsgcmVzaXplKHIxLGMxKSB3b3VsZCBsZWFkIHRvIHplcm8gdGVtcG9yYXJpZXMKLSAgbTMucmVzaXplKDEsMSk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSBtMS5ibG9jayhyMCxyMCxyMSxyMSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogbTIuYmxvY2socjAsYzAscjEsYzEpLCAxKTsKLSAgbTMucmVzaXplKDEsMSk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSBtMS5ibG9jayhyMCxyMCxyMSxyMSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdFVwcGVyPigpICAqIG0yLmJsb2NrKHIwLGMwLHIxLGMxKSwgMSk7CisgIC8vIEhlcmUgd2Ugd2lsbCBnZXQgMSB0ZW1wb3JhcnkgZm9yIGVhY2ggcmVzaXplIG9wZXJhdGlvbiBvZiB0aGUgbGhzIG9wZXJhdG9yOyByZXNpemUocjEsYzEpIHdvdWxkIGxlYWQgdG8gemVybworICAvLyB0ZW1wb3JhcmllcworICBtMy5yZXNpemUoMSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKAorICAgICAgbTMubm9hbGlhcygpID0gbTEuYmxvY2socjAsIHIwLCByMSwgcjEpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIG0yLmJsb2NrKHIwLCBjMCwgcjEsIGMxKSwgMSk7CisgIG0zLnJlc2l6ZSgxLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoCisgICAgICBtMy5ub2FsaWFzKCkgPSBtMS5ibG9jayhyMCwgcjAsIHIxLCByMSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdFVwcGVyPigpICogbTIuYmxvY2socjAsIGMwLCByMSwgYzEpLCAxKTsKIAogICAvLyBaZXJvIHRlbXBvcmFyaWVzIGZvciBsYXp5IHByb2R1Y3RzIC4uLgotICBtMy5zZXRSYW5kb20ocm93cyxjb2xzKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIFNjYWxhciB0bXAgPSAwOyB0bXAgKz0gU2NhbGFyKFJlYWxTY2FsYXIoMSkpIC8gIChtMy50cmFuc3Bvc2UoKS5sYXp5UHJvZHVjdChtMykpLmRpYWdvbmFsKCkuc3VtKCksIDAgKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLm5vYWxpYXMoKSA9IG0xLmNvbmp1Z2F0ZSgpLmxhenlQcm9kdWN0KG0yLmNvbmp1Z2F0ZSgpKSwgMCk7CisgIG0zLnNldFJhbmRvbShyb3dzLCBjb2xzKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoU2NhbGFyIHRtcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSBTY2FsYXIoUmVhbFNjYWxhcigxKSkgLyAobTMudHJhbnNwb3NlKCkubGF6eVByb2R1Y3QobTMpKS5kaWFnb25hbCgpLnN1bSgpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTMubm9hbGlhcygpID0gbTEuY29uanVnYXRlKCkubGF6eVByb2R1Y3QobTIuY29uanVnYXRlKCkpLCAwKTsKIAogICAvLyAuLi4gYW5kIGV2ZW4gbm8gdGVtcG9yYXJ5IGZvciBldmVuIGRlZXBseSAoPj0yKSBuZXN0ZWQgcHJvZHVjdHMKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIFNjYWxhciB0bXAgPSAwOyB0bXAgKz0gU2NhbGFyKFJlYWxTY2FsYXIoMSkpIC8gIChtMy50cmFuc3Bvc2UoKSAqIG0zKS5kaWFnb25hbCgpLnN1bSgpLCAwICk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBTY2FsYXIgdG1wID0gMDsgdG1wICs9IFNjYWxhcihSZWFsU2NhbGFyKDEpKSAvICAobTMudHJhbnNwb3NlKCkgKiBtMykuZGlhZ29uYWwoKS5hcnJheSgpLmFicygpLnN1bSgpLCAwICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKFNjYWxhciB0bXAgPSAwOyB0bXAgKz0gU2NhbGFyKFJlYWxTY2FsYXIoMSkpIC8gKG0zLnRyYW5zcG9zZSgpICogbTMpLmRpYWdvbmFsKCkuc3VtKCksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChTY2FsYXIgdG1wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IFNjYWxhcihSZWFsU2NhbGFyKDEpKSAvIChtMy50cmFuc3Bvc2UoKSAqIG0zKS5kaWFnb25hbCgpLmFycmF5KCkuYWJzKCkuc3VtKCksIDApOwogCiAgIC8vIFplcm8gdGVtcG9yYXJpZXMgZm9yIC4uLiBDb2VmZkJhc2VkUHJvZHVjdE1vZGUKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0zLmNvbCgwKS50ZW1wbGF0ZSBoZWFkPDU+KCkgKiBtMy5jb2woMCkudHJhbnNwb3NlKCkgKyBtMy5jb2woMCkudGVtcGxhdGUgaGVhZDw1PigpICogbTMuY29sKDApLnRyYW5zcG9zZSgpLCAwICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKAorICAgICAgbTMuY29sKDApLnRlbXBsYXRlIGhlYWQ8NT4oKSAqIG0zLmNvbCgwKS50cmFuc3Bvc2UoKSArIG0zLmNvbCgwKS50ZW1wbGF0ZSBoZWFkPDU+KCkgKiBtMy5jb2woMCkudHJhbnNwb3NlKCksIDApOwogCiAgIC8vIENoZWNrIG1hdHJpeCAqIHZlY3RvcnMKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGN2cmVzLm5vYWxpYXMoKSA9IG0xICogY3YxLCAwICk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjdnJlcy5ub2FsaWFzKCkgLT0gbTEgKiBjdjEsIDAgKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGN2cmVzLm5vYWxpYXMoKSAtPSBtMSAqIG0yLmNvbCgwKSwgMCApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY3ZyZXMubm9hbGlhcygpIC09IG0xICogcnYxLmFkam9pbnQoKSwgMCApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY3ZyZXMubm9hbGlhcygpIC09IG0xICogbTIucm93KDApLnRyYW5zcG9zZSgpLCAwICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGN2cmVzLm5vYWxpYXMoKSA9IG0xICogY3YxLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY3ZyZXMubm9hbGlhcygpIC09IG0xICogY3YxLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY3ZyZXMubm9hbGlhcygpIC09IG0xICogbTIuY29sKDApLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY3ZyZXMubm9hbGlhcygpIC09IG0xICogcnYxLmFkam9pbnQoKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGN2cmVzLm5vYWxpYXMoKSAtPSBtMSAqIG0yLnJvdygwKS50cmFuc3Bvc2UoKSwgMCk7CiAKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGN2cmVzLm5vYWxpYXMoKSA9IChtMSttMSkgKiBjdjEsIDAgKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGN2cmVzLm5vYWxpYXMoKSA9IChybTMrcm0zKSAqIGN2MSwgMCApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY3ZyZXMubm9hbGlhcygpID0gKG0xK20xKSAqIChtMSpjdjEpLCAxICk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjdnJlcy5ub2FsaWFzKCkgPSAocm0zK3JtMykgKiAobTEqY3YxKSwgMSApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjdnJlcy5ub2FsaWFzKCkgPSAobTEgKyBtMSkgKiBjdjEsIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjdnJlcy5ub2FsaWFzKCkgPSAocm0zICsgcm0zKSAqIGN2MSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGN2cmVzLm5vYWxpYXMoKSA9IChtMSArIG0xKSAqIChtMSAqIGN2MSksIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjdnJlcy5ub2FsaWFzKCkgPSAocm0zICsgcm0zKSAqIChtMSAqIGN2MSksIDEpOwogCi0gIC8vIENoZWNrIG91dGVyIHByb2R1Y3RzCi0gICNpZmRlZiBFSUdFTl9BTExPQ0EKLSAgYm9vbCB0ZW1wX3ZpYV9hbGxvY2EgPSBtMy5yb3dzKCkqc2l6ZW9mKFNjYWxhcikgPD0gRUlHRU5fU1RBQ0tfQUxMT0NBVElPTl9MSU1JVDsKLSAgI2Vsc2UKKy8vIENoZWNrIG91dGVyIHByb2R1Y3RzCisjaWZkZWYgRUlHRU5fQUxMT0NBCisgIGJvb2wgdGVtcF92aWFfYWxsb2NhID0gbTMucm93cygpICogc2l6ZW9mKFNjYWxhcikgPD0gRUlHRU5fU1RBQ0tfQUxMT0NBVElPTl9MSU1JVDsKKyNlbHNlCiAgIGJvb2wgdGVtcF92aWFfYWxsb2NhID0gZmFsc2U7Ci0gICNlbmRpZgorI2VuZGlmCiAgIG0zID0gY3YxICogcnYxOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggbTMubm9hbGlhcygpID0gY3YxICogcnYxLCAwICk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSAoY3YxK2N2MSkgKiAocnYxK3J2MSksIHRlbXBfdmlhX2FsbG9jYSA/IDAgOiAxICk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgPSAobTEqY3YxKSAqIChydjEpLCAxICk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBtMy5ub2FsaWFzKCkgKz0gKG0xKmN2MSkgKiAocnYxKSwgMSApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtMy5ub2FsaWFzKCkgPSBjdjEgKiBydjEsIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtMy5ub2FsaWFzKCkgPSAoY3YxICsgY3YxKSAqIChydjEgKyBydjEpLCB0ZW1wX3ZpYV9hbGxvY2EgPyAwIDogMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG0zLm5vYWxpYXMoKSA9IChtMSAqIGN2MSkgKiAocnYxKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG0zLm5vYWxpYXMoKSArPSAobTEgKiBjdjEpICogKHJ2MSksIDEpOwogICBybTMgPSBjdjEgKiBydjE7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBybTMubm9hbGlhcygpID0gY3YxICogcnYxLCAwICk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBybTMubm9hbGlhcygpID0gKGN2MStjdjEpICogKHJ2MStydjEpLCB0ZW1wX3ZpYV9hbGxvY2EgPyAwIDogMSApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggcm0zLm5vYWxpYXMoKSA9IChjdjEpICogKHJ2MSAqIG0xKSwgMSApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggcm0zLm5vYWxpYXMoKSAtPSAoY3YxKSAqIChydjEgKiBtMSksIDEgKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIHJtMy5ub2FsaWFzKCkgPSAobTEqY3YxKSAqIChydjEgKiBtMSksIDIgKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIHJtMy5ub2FsaWFzKCkgKz0gKG0xKmN2MSkgKiAocnYxICogbTEpLCAyICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKHJtMy5ub2FsaWFzKCkgPSBjdjEgKiBydjEsIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChybTMubm9hbGlhcygpID0gKGN2MSArIGN2MSkgKiAocnYxICsgcnYxKSwgdGVtcF92aWFfYWxsb2NhID8gMCA6IDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChybTMubm9hbGlhcygpID0gKGN2MSkgKiAocnYxICogbTEpLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQocm0zLm5vYWxpYXMoKSAtPSAoY3YxKSAqIChydjEgKiBtMSksIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChybTMubm9hbGlhcygpID0gKG0xICogY3YxKSAqIChydjEgKiBtMSksIDIpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChybTMubm9hbGlhcygpICs9IChtMSAqIGN2MSkgKiAocnYxICogbTEpLCAyKTsKIAogICAvLyBDaGVjayBuZXN0ZWQgcHJvZHVjdHMKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGN2cmVzLm5vYWxpYXMoKSA9IG0xLmFkam9pbnQoKSAqIG0xICogY3YxLCAxICk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBydnJlcy5ub2FsaWFzKCkgPSBydjEgKiAobTEgKiBtMi5hZGpvaW50KCkpLCAxICk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGN2cmVzLm5vYWxpYXMoKSA9IG0xLmFkam9pbnQoKSAqIG0xICogY3YxLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQocnZyZXMubm9hbGlhcygpID0gcnYxICogKG0xICogbTIuYWRqb2ludCgpKSwgMSk7CiAKICAgLy8gZXhoYXVzdGl2ZWx5IGNoZWNrIGFsbCBzY2FsYXIgbXVsdGlwbGUgY29tYmluYXRpb25zOgogICB7CiAgICAgLy8gR2VuZXJpYyBwYXRoOgogICAgIGNoZWNrX3NjYWxhcl9tdWx0aXBsZTEobTMsIG0xLCBtMiwgczEsIHMyKTsKICAgICAvLyBGb3JjZSBmYWxsIGJhY2sgdG8gY29lZmYtYmFzZWQ6Ci0gICAgdHlwZW5hbWUgQ29sTWFqb3JNYXRyaXhUeXBlOjpCbG9ja1hwciBtM19ibGNrID0gbTMuYmxvY2socjAscjAsMSwxKTsKLSAgICBjaGVja19zY2FsYXJfbXVsdGlwbGUxKG0zX2JsY2ssIG0xLmJsb2NrKHIwLGMwLDEsMSksIG0yLmJsb2NrKGMwLHIwLDEsMSksIHMxLCBzMik7CisgICAgdHlwZW5hbWUgQ29sTWFqb3JNYXRyaXhUeXBlOjpCbG9ja1hwciBtM19ibGNrID0gbTMuYmxvY2socjAsIHIwLCAxLCAxKTsKKyAgICBjaGVja19zY2FsYXJfbXVsdGlwbGUxKG0zX2JsY2ssIG0xLmJsb2NrKHIwLCBjMCwgMSwgMSksIG0yLmJsb2NrKGMwLCByMCwgMSwgMSksIHMxLCBzMik7CiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHByb2R1Y3Rfbm90ZW1wb3JhcnkpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QocHJvZHVjdF9ub3RlbXBvcmFyeSkgewogICBpbnQgczsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDE2LEVJR0VOX1RFU1RfTUFYX1NJWkUpOwotICAgIENBTExfU1VCVEVTVF8xKCBwcm9kdWN0X25vdGVtcG9yYXJ5KE1hdHJpeFhmKHMsIHMpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBwcm9kdWN0X25vdGVtcG9yYXJ5KE1hdHJpeFhkKHMsIHMpKSApOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDE2LCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgICBDQUxMX1NVQlRFU1RfMShwcm9kdWN0X25vdGVtcG9yYXJ5KE1hdHJpeFhmKHMsIHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIocHJvZHVjdF9ub3RlbXBvcmFyeShNYXRyaXhYZChzLCBzKSkpOwogICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKLSAgICAKLSAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDE2LEVJR0VOX1RFU1RfTUFYX1NJWkUvMik7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIHByb2R1Y3Rfbm90ZW1wb3JhcnkoTWF0cml4WGNmKHMscykpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIHByb2R1Y3Rfbm90ZW1wb3JhcnkoTWF0cml4WGNkKHMscykpICk7CisKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDE2LCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMik7CisgICAgQ0FMTF9TVUJURVNUXzMocHJvZHVjdF9ub3RlbXBvcmFyeShNYXRyaXhYY2YocywgcykpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChwcm9kdWN0X25vdGVtcG9yYXJ5KE1hdHJpeFhjZChzLCBzKSkpOwogICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9wcm9kdWN0X3NlbGZhZGpvaW50LmNwcCBiL3Rlc3QvcHJvZHVjdF9zZWxmYWRqb2ludC5jcHAKaW5kZXggYmRjY2QwNC4uOGQxYmRhNSAxMDA2NDQKLS0tIGEvdGVzdC9wcm9kdWN0X3NlbGZhZGpvaW50LmNwcAorKysgYi90ZXN0L3Byb2R1Y3Rfc2VsZmFkam9pbnQuY3BwCkBAIC05LDggKzksOCBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHByb2R1Y3Rfc2VsZmFkam9pbnQoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBwcm9kdWN0X3NlbGZhZGpvaW50KGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBWZWN0b3JUeXBlOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBSb3dWZWN0b3JUeXBlOwpAQCAtMjAsNjcgKzIwLDY2IEBACiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwogCi0gIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTM7Ci0gIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCi0gICAgICAgICAgICAgdjIgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCi0gICAgICAgICAgICAgdjMocm93cyk7Ci0gIFJvd1ZlY3RvclR5cGUgcjEgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksCi0gICAgICAgICAgICAgICAgcjIgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7Ci0gIFJoc01hdHJpeFR5cGUgbTQgPSBSaHNNYXRyaXhUeXBlOjpSYW5kb20ocm93cywxMCk7CisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMzsKKyAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKSwgdjIgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyksIHYzKHJvd3MpOworICBSb3dWZWN0b3JUeXBlIHIxID0gUm93VmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpLCByMiA9IFJvd1ZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKKyAgUmhzTWF0cml4VHlwZSBtNCA9IFJoc01hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCAxMCk7CiAKLSAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCi0gICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAotICAgICAgICAgczMgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksIHMyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksIHMzID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAKICAgbTEgPSAobTEuYWRqb2ludCgpICsgbTEpLmV2YWwoKTsKIAogICAvLyByYW5rMiB1cGRhdGUKICAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKLSAgbTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUodjEsdjIpOwotICBWRVJJRllfSVNfQVBQUk9YKG0yLCAobTEgKyB2MSAqIHYyLmFkam9pbnQoKSsgdjIgKiB2MS5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSk7CisgIG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKHYxLCB2Mik7CisgIFZFUklGWV9JU19BUFBST1gobTIsIChtMSArIHYxICogdjIuYWRqb2ludCgpICsgdjIgKiB2MS5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSk7CiAKICAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKLSAgbTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUoLXYxLHMyKnYyLHMzKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMiwgKG0xICsgKHMzKigtdjEpKihzMip2MikuYWRqb2ludCgpK251bWV4dDo6Y29uaihzMykqKHMyKnYyKSooLXYxKS5hZGpvaW50KCkpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50b0RlbnNlTWF0cml4KCkpOworICBtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZSgtdjEsIHMyICogdjIsIHMzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgKG0xICsgKHMzICogKC12MSkgKiAoczIgKiB2MikuYWRqb2ludCgpICsgbnVtZXh0Ojpjb25qKHMzKSAqIChzMiAqIHYyKSAqICgtdjEpLmFkam9pbnQoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0RlbnNlTWF0cml4KCkpOwogCiAgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7Ci0gIG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS5yYW5rVXBkYXRlKC1zMipyMS5hZGpvaW50KCkscjIuYWRqb2ludCgpKnMzLHMxKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMiwgKG0xICsgczEqKC1zMipyMS5hZGpvaW50KCkpKihyMi5hZGpvaW50KCkqczMpLmFkam9pbnQoKSArIG51bWV4dDo6Y29uaihzMSkqKHIyLmFkam9pbnQoKSpzMykgKiAoLXMyKnIxLmFkam9pbnQoKSkuYWRqb2ludCgpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50b0RlbnNlTWF0cml4KCkpOworICBtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZSgtczIgKiByMS5hZGpvaW50KCksIHIyLmFkam9pbnQoKSAqIHMzLCBzMSk7CisgIFZFUklGWV9JU19BUFBST1gobTIsIChtMSArIHMxICogKC1zMiAqIHIxLmFkam9pbnQoKSkgKiAocjIuYWRqb2ludCgpICogczMpLmFkam9pbnQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICBudW1leHQ6OmNvbmooczEpICogKHIyLmFkam9pbnQoKSAqIHMzKSAqICgtczIgKiByMS5hZGpvaW50KCkpLmFkam9pbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvRGVuc2VNYXRyaXgoKSk7CiAKLSAgaWYgKHJvd3M+MSkKLSAgeworICBpZiAocm93cyA+IDEpIHsKICAgICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOwotICAgIG0yLmJsb2NrKDEsMSxyb3dzLTEsY29scy0xKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZSh2MS50YWlsKHJvd3MtMSksdjIuaGVhZChjb2xzLTEpKTsKKyAgICBtMi5ibG9jaygxLCAxLCByb3dzIC0gMSwgY29scyAtIDEpCisgICAgICAgIC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkKKyAgICAgICAgLnJhbmtVcGRhdGUodjEudGFpbChyb3dzIC0gMSksIHYyLmhlYWQoY29scyAtIDEpKTsKICAgICBtMyA9IG0xOwotICAgIG0zLmJsb2NrKDEsMSxyb3dzLTEsY29scy0xKSArPSB2MS50YWlsKHJvd3MtMSkgKiB2Mi5oZWFkKGNvbHMtMSkuYWRqb2ludCgpKyB2Mi5oZWFkKGNvbHMtMSkgKiB2MS50YWlsKHJvd3MtMSkuYWRqb2ludCgpOworICAgIG0zLmJsb2NrKDEsIDEsIHJvd3MgLSAxLCBjb2xzIC0gMSkgKz0KKyAgICAgICAgdjEudGFpbChyb3dzIC0gMSkgKiB2Mi5oZWFkKGNvbHMgLSAxKS5hZGpvaW50KCkgKyB2Mi5oZWFkKGNvbHMgLSAxKSAqIHYxLnRhaWwocm93cyAtIDEpLmFkam9pbnQoKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChwcm9kdWN0X3NlbGZhZGpvaW50KQoteworRUlHRU5fREVDTEFSRV9URVNUKHByb2R1Y3Rfc2VsZmFkam9pbnQpIHsKICAgaW50IHMgPSAwOwotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQgOyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggcHJvZHVjdF9zZWxmYWRqb2ludChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIHByb2R1Y3Rfc2VsZmFkam9pbnQoTWF0cml4PGZsb2F0LCAyLCAyPigpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBwcm9kdWN0X3NlbGZhZGpvaW50KE1hdHJpeDNkKCkpICk7Ci0gICAgCi0gICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMik7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIHByb2R1Y3Rfc2VsZmFkam9pbnQoTWF0cml4WGNmKHMsIHMpKSApOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShwcm9kdWN0X3NlbGZhZGpvaW50KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKHByb2R1Y3Rfc2VsZmFkam9pbnQoTWF0cml4PGZsb2F0LCAyLCAyPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMocHJvZHVjdF9zZWxmYWRqb2ludChNYXRyaXgzZCgpKSk7CisKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKTsKKyAgICBDQUxMX1NVQlRFU1RfNChwcm9kdWN0X3NlbGZhZGpvaW50KE1hdHJpeFhjZihzLCBzKSkpOwogICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKLSAgICAKLSAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggcHJvZHVjdF9zZWxmYWRqb2ludChNYXRyaXhYY2QocyxzKSkgKTsKKworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDIpOworICAgIENBTExfU1VCVEVTVF81KHByb2R1Y3Rfc2VsZmFkam9pbnQoTWF0cml4WGNkKHMsIHMpKSk7CiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQotICAgIAotICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggcHJvZHVjdF9zZWxmYWRqb2ludChNYXRyaXhYZChzLHMpKSApOworCisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgICBDQUxMX1NVQlRFU1RfNihwcm9kdWN0X3NlbGZhZGpvaW50KE1hdHJpeFhkKHMsIHMpKSk7CiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQotICAgIAotICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKTsKLSAgICBDQUxMX1NVQlRFU1RfNyggcHJvZHVjdF9zZWxmYWRqb2ludChNYXRyaXg8ZmxvYXQsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPihzLHMpKSApOworCisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgICBDQUxMX1NVQlRFU1RfNyhwcm9kdWN0X3NlbGZhZGpvaW50KE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+KHMsIHMpKSk7CiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3Rfc21hbGwuY3BwIGIvdGVzdC9wcm9kdWN0X3NtYWxsLmNwcAppbmRleCAwZmQ4MmMzLi4xYjFlZWYxIDEwMDY0NAotLS0gYS90ZXN0L3Byb2R1Y3Rfc21hbGwuY3BwCisrKyBiL3Rlc3QvcHJvZHVjdF9zbWFsbC5jcHAKQEAgLTExLDI2MCArMTEsMjUyIEBACiAjaW5jbHVkZSA8RWlnZW4vTFU+CiAKIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDQ0NwotdGVtcGxhdGU8aW50Pgotdm9pZCBwcm9kdWN0MXgxKCkKLXsKLSAgTWF0cml4PGZsb2F0LDEsMz4gbWF0QXN0YXRpYzsKLSAgTWF0cml4PGZsb2F0LDMsMT4gbWF0QnN0YXRpYzsKK3RlbXBsYXRlIDxpbnQ+Cit2b2lkIHByb2R1Y3QxeDEoKSB7CisgIE1hdHJpeDxmbG9hdCwgMSwgMz4gbWF0QXN0YXRpYzsKKyAgTWF0cml4PGZsb2F0LCAzLCAxPiBtYXRCc3RhdGljOwogICBtYXRBc3RhdGljLnNldFJhbmRvbSgpOwogICBtYXRCc3RhdGljLnNldFJhbmRvbSgpOwotICBWRVJJRllfSVNfQVBQUk9YKCAobWF0QXN0YXRpYyAqIG1hdEJzdGF0aWMpLmNvZWZmKDAsMCksIAotICAgICAgICAgICAgICAgICAgICBtYXRBc3RhdGljLmN3aXNlUHJvZHVjdChtYXRCc3RhdGljLnRyYW5zcG9zZSgpKS5zdW0oKSApOworICBWRVJJRllfSVNfQVBQUk9YKChtYXRBc3RhdGljICogbWF0QnN0YXRpYykuY29lZmYoMCwgMCksIG1hdEFzdGF0aWMuY3dpc2VQcm9kdWN0KG1hdEJzdGF0aWMudHJhbnNwb3NlKCkpLnN1bSgpKTsKIAotICBNYXRyaXhYZiBtYXRBZHluYW1pYygxLDMpOwotICBNYXRyaXhYZiBtYXRCZHluYW1pYygzLDEpOworICBNYXRyaXhYZiBtYXRBZHluYW1pYygxLCAzKTsKKyAgTWF0cml4WGYgbWF0QmR5bmFtaWMoMywgMSk7CiAgIG1hdEFkeW5hbWljLnNldFJhbmRvbSgpOwogICBtYXRCZHluYW1pYy5zZXRSYW5kb20oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKG1hdEFkeW5hbWljICogbWF0QmR5bmFtaWMpLmNvZWZmKDAsMCksIAotICAgICAgICAgICAgICAgICAgICBtYXRBZHluYW1pYy5jd2lzZVByb2R1Y3QobWF0QmR5bmFtaWMudHJhbnNwb3NlKCkpLnN1bSgpICk7CisgIFZFUklGWV9JU19BUFBST1goKG1hdEFkeW5hbWljICogbWF0QmR5bmFtaWMpLmNvZWZmKDAsIDApLCBtYXRBZHluYW1pYy5jd2lzZVByb2R1Y3QobWF0QmR5bmFtaWMudHJhbnNwb3NlKCkpLnN1bSgpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQj4KLWNvbnN0IFRDJiByZWZfcHJvZChUQyAmQywgY29uc3QgVEEgJkEsIGNvbnN0IFRCICZCKQotewotICBmb3IoSW5kZXggaT0wO2k8Qy5yb3dzKCk7KytpKQotICAgIGZvcihJbmRleCBqPTA7ajxDLmNvbHMoKTsrK2opCi0gICAgICBmb3IoSW5kZXggaz0wO2s8QS5jb2xzKCk7KytrKQotICAgICAgICBDLmNvZWZmUmVmKGksaikgKz0gQS5jb2VmZihpLGspICogQi5jb2VmZihrLGopOwordGVtcGxhdGUgPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUQSwgdHlwZW5hbWUgVEI+Citjb25zdCBUQyAmcmVmX3Byb2QoVEMgJkMsIGNvbnN0IFRBICZBLCBjb25zdCBUQiAmQikgeworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgQy5yb3dzKCk7ICsraSkKKyAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgQy5jb2xzKCk7ICsraikKKyAgICAgIGZvciAoSW5kZXggayA9IDA7IGsgPCBBLmNvbHMoKTsgKytrKSBDLmNvZWZmUmVmKGksIGopICs9IEEuY29lZmYoaSwgaykgKiBCLmNvZWZmKGssIGopOwogICByZXR1cm4gQzsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IFJvd3MsIGludCBDb2xzLCBpbnQgRGVwdGgsIGludCBPQywgaW50IE9BLCBpbnQgT0I+Ci1zdGQ6OmVuYWJsZV9pZl90PCEgKCAoUm93cyA9PTEmJkRlcHRoIT0xJiZPQT09Q29sTWFqb3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoRGVwdGg9PTEmJlJvd3MgIT0xJiZPQT09Um93TWFqb3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoQ29scyA9PTEmJkRlcHRoIT0xJiZPQj09Um93TWFqb3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoRGVwdGg9PTEmJkNvbHMgIT0xJiZPQj09Q29sTWFqb3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoUm93cyA9PTEmJkNvbHMgIT0xJiZPQz09Q29sTWFqb3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoQ29scyA9PTEmJlJvd3MgIT0xJiZPQz09Um93TWFqb3IpKSx2b2lkPgotdGVzdF9sYXp5X3NpbmdsZShpbnQgcm93cywgaW50IGNvbHMsIGludCBkZXB0aCkKLXsKLSAgTWF0cml4PFQsUm93cyxEZXB0aCxPQT4gQShyb3dzLGRlcHRoKTsgQS5zZXRSYW5kb20oKTsKLSAgTWF0cml4PFQsRGVwdGgsQ29scyxPQj4gQihkZXB0aCxjb2xzKTsgQi5zZXRSYW5kb20oKTsKLSAgTWF0cml4PFQsUm93cyxDb2xzLE9DPiAgQyhyb3dzLGNvbHMpOyAgQy5zZXRSYW5kb20oKTsKLSAgTWF0cml4PFQsUm93cyxDb2xzLE9DPiAgRChDKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChDKz1BLmxhenlQcm9kdWN0KEIpLCByZWZfcHJvZChELEEsQikpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBSb3dzLCBpbnQgQ29scywgaW50IERlcHRoLCBpbnQgT0MsIGludCBPQSwgaW50IE9CPgorc3RkOjplbmFibGVfaWZfdDwhKChSb3dzID09IDEgJiYgRGVwdGggIT0gMSAmJiBPQSA9PSBDb2xNYWpvcikgfHwgKERlcHRoID09IDEgJiYgUm93cyAhPSAxICYmIE9BID09IFJvd01ham9yKSB8fAorICAgICAgICAgICAgICAgICAgIChDb2xzID09IDEgJiYgRGVwdGggIT0gMSAmJiBPQiA9PSBSb3dNYWpvcikgfHwgKERlcHRoID09IDEgJiYgQ29scyAhPSAxICYmIE9CID09IENvbE1ham9yKSB8fAorICAgICAgICAgICAgICAgICAgIChSb3dzID09IDEgJiYgQ29scyAhPSAxICYmIE9DID09IENvbE1ham9yKSB8fCAoQ29scyA9PSAxICYmIFJvd3MgIT0gMSAmJiBPQyA9PSBSb3dNYWpvcikpLAorICAgICAgICAgICAgICAgICB2b2lkPgordGVzdF9sYXp5X3NpbmdsZShpbnQgcm93cywgaW50IGNvbHMsIGludCBkZXB0aCkgeworICBNYXRyaXg8VCwgUm93cywgRGVwdGgsIE9BPiBBKHJvd3MsIGRlcHRoKTsKKyAgQS5zZXRSYW5kb20oKTsKKyAgTWF0cml4PFQsIERlcHRoLCBDb2xzLCBPQj4gQihkZXB0aCwgY29scyk7CisgIEIuc2V0UmFuZG9tKCk7CisgIE1hdHJpeDxULCBSb3dzLCBDb2xzLCBPQz4gQyhyb3dzLCBjb2xzKTsKKyAgQy5zZXRSYW5kb20oKTsKKyAgTWF0cml4PFQsIFJvd3MsIENvbHMsIE9DPiBEKEMpOworICBWRVJJRllfSVNfQVBQUk9YKEMgKz0gQS5sYXp5UHJvZHVjdChCKSwgcmVmX3Byb2QoRCwgQSwgQikpOwogfQogCi12b2lkIHRlc3RfZHluYW1pY19ib29sKCkKLXsKLSAgaW50IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSw2NCk7Ci0gIGludCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsNjQpOwotICBpbnQgZGVwdGggPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSw2NSk7Cit2b2lkIHRlc3RfZHluYW1pY19ib29sKCkgeworICBpbnQgcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCA2NCk7CisgIGludCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDY0KTsKKyAgaW50IGRlcHRoID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDY1KTsKIAotICB0eXBlZGVmIE1hdHJpeDxib29sLER5bmFtaWMsRHluYW1pYz4gTWF0cml4WDsKLSAgTWF0cml4WCBBKHJvd3MsZGVwdGgpOyBBLnNldFJhbmRvbSgpOwotICBNYXRyaXhYIEIoZGVwdGgsY29scyk7IEIuc2V0UmFuZG9tKCk7Ci0gIE1hdHJpeFggQyhyb3dzLGNvbHMpOyAgQy5zZXRSYW5kb20oKTsKKyAgdHlwZWRlZiBNYXRyaXg8Ym9vbCwgRHluYW1pYywgRHluYW1pYz4gTWF0cml4WDsKKyAgTWF0cml4WCBBKHJvd3MsIGRlcHRoKTsKKyAgQS5zZXRSYW5kb20oKTsKKyAgTWF0cml4WCBCKGRlcHRoLCBjb2xzKTsKKyAgQi5zZXRSYW5kb20oKTsKKyAgTWF0cml4WCBDKHJvd3MsIGNvbHMpOworICBDLnNldFJhbmRvbSgpOwogICBNYXRyaXhYIEQoQyk7Ci0gIGZvcihJbmRleCBpPTA7aTxDLnJvd3MoKTsrK2kpCi0gICAgZm9yKEluZGV4IGo9MDtqPEMuY29scygpOysraikKLSAgICAgIGZvcihJbmRleCBrPTA7azxBLmNvbHMoKTsrK2spCi0gICAgICAgRC5jb2VmZlJlZihpLGopIHw9IChBLmNvZWZmKGksaykgJiYgQi5jb2VmZihrLGopKTsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IEMucm93cygpOyArK2kpCisgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IEMuY29scygpOyArK2opCisgICAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgQS5jb2xzKCk7ICsraykgRC5jb2VmZlJlZihpLCBqKSB8PSAoQS5jb2VmZihpLCBrKSAmJiBCLmNvZWZmKGssIGopKTsKICAgQyArPSBBICogQjsKICAgVkVSSUZZX0lTX0VRVUFMKEMsIEQpOwogCiAgIE1hdHJpeFggRSA9IEIudHJhbnNwb3NlKCk7Ci0gIGZvcihJbmRleCBpPTA7aTxCLnJvd3MoKTsrK2kpCi0gICAgZm9yKEluZGV4IGo9MDtqPEIuY29scygpOysraikKLSAgICAgIFZFUklGWV9JU19FUVVBTChCKGksaiksIEUoaixpKSk7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBCLnJvd3MoKTsgKytpKQorICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBCLmNvbHMoKTsgKytqKSBWRVJJRllfSVNfRVFVQUwoQihpLCBqKSwgRShqLCBpKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBSb3dzLCBpbnQgQ29scywgaW50IERlcHRoLCBpbnQgT0MsIGludCBPQSwgaW50IE9CPgotc3RkOjplbmFibGVfaWZfdDwgICggKFJvd3MgPT0xJiZEZXB0aCE9MSYmT0E9PUNvbE1ham9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKERlcHRoPT0xJiZSb3dzICE9MSYmT0E9PVJvd01ham9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKENvbHMgPT0xJiZEZXB0aCE9MSYmT0I9PVJvd01ham9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKERlcHRoPT0xJiZDb2xzICE9MSYmT0I9PUNvbE1ham9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFJvd3MgPT0xJiZDb2xzICE9MSYmT0M9PUNvbE1ham9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKENvbHMgPT0xJiZSb3dzICE9MSYmT0M9PVJvd01ham9yKSksdm9pZD4KLXRlc3RfbGF6eV9zaW5nbGUoaW50LCBpbnQsIGludCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgUm93cywgaW50IENvbHMsIGludCBEZXB0aCwgaW50IE9DLCBpbnQgT0EsIGludCBPQj4KK3N0ZDo6ZW5hYmxlX2lmX3Q8KChSb3dzID09IDEgJiYgRGVwdGggIT0gMSAmJiBPQSA9PSBDb2xNYWpvcikgfHwgKERlcHRoID09IDEgJiYgUm93cyAhPSAxICYmIE9BID09IFJvd01ham9yKSB8fAorICAgICAgICAgICAgICAgICAgKENvbHMgPT0gMSAmJiBEZXB0aCAhPSAxICYmIE9CID09IFJvd01ham9yKSB8fCAoRGVwdGggPT0gMSAmJiBDb2xzICE9IDEgJiYgT0IgPT0gQ29sTWFqb3IpIHx8CisgICAgICAgICAgICAgICAgICAoUm93cyA9PSAxICYmIENvbHMgIT0gMSAmJiBPQyA9PSBDb2xNYWpvcikgfHwgKENvbHMgPT0gMSAmJiBSb3dzICE9IDEgJiYgT0MgPT0gUm93TWFqb3IpKSwKKyAgICAgICAgICAgICAgICAgdm9pZD4KK3Rlc3RfbGF6eV9zaW5nbGUoaW50LCBpbnQsIGludCkge30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBSb3dzLCBpbnQgQ29scywgaW50IERlcHRoPgordm9pZCB0ZXN0X2xhenlfYWxsX2xheW91dChpbnQgcm93cyA9IFJvd3MsIGludCBjb2xzID0gQ29scywgaW50IGRlcHRoID0gRGVwdGgpIHsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfc2luZ2xlPFQsIFJvd3MsIENvbHMsIERlcHRoLCBDb2xNYWpvciwgQ29sTWFqb3IsIENvbE1ham9yPihyb3dzLCBjb2xzLCBkZXB0aCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfc2luZ2xlPFQsIFJvd3MsIENvbHMsIERlcHRoLCBSb3dNYWpvciwgQ29sTWFqb3IsIENvbE1ham9yPihyb3dzLCBjb2xzLCBkZXB0aCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfc2luZ2xlPFQsIFJvd3MsIENvbHMsIERlcHRoLCBDb2xNYWpvciwgUm93TWFqb3IsIENvbE1ham9yPihyb3dzLCBjb2xzLCBkZXB0aCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfc2luZ2xlPFQsIFJvd3MsIENvbHMsIERlcHRoLCBSb3dNYWpvciwgUm93TWFqb3IsIENvbE1ham9yPihyb3dzLCBjb2xzLCBkZXB0aCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfc2luZ2xlPFQsIFJvd3MsIENvbHMsIERlcHRoLCBDb2xNYWpvciwgQ29sTWFqb3IsIFJvd01ham9yPihyb3dzLCBjb2xzLCBkZXB0aCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfc2luZ2xlPFQsIFJvd3MsIENvbHMsIERlcHRoLCBSb3dNYWpvciwgQ29sTWFqb3IsIFJvd01ham9yPihyb3dzLCBjb2xzLCBkZXB0aCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfc2luZ2xlPFQsIFJvd3MsIENvbHMsIERlcHRoLCBDb2xNYWpvciwgUm93TWFqb3IsIFJvd01ham9yPihyb3dzLCBjb2xzLCBkZXB0aCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfc2luZ2xlPFQsIFJvd3MsIENvbHMsIERlcHRoLCBSb3dNYWpvciwgUm93TWFqb3IsIFJvd01ham9yPihyb3dzLCBjb2xzLCBkZXB0aCkpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IFJvd3MsIGludCBDb2xzLCBpbnQgRGVwdGg+Ci12b2lkIHRlc3RfbGF6eV9hbGxfbGF5b3V0KGludCByb3dzPVJvd3MsIGludCBjb2xzPUNvbHMsIGludCBkZXB0aD1EZXB0aCkKLXsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X3NpbmdsZTxULFJvd3MsQ29scyxEZXB0aCxDb2xNYWpvcixDb2xNYWpvcixDb2xNYWpvcj4ocm93cyxjb2xzLGRlcHRoKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X3NpbmdsZTxULFJvd3MsQ29scyxEZXB0aCxSb3dNYWpvcixDb2xNYWpvcixDb2xNYWpvcj4ocm93cyxjb2xzLGRlcHRoKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X3NpbmdsZTxULFJvd3MsQ29scyxEZXB0aCxDb2xNYWpvcixSb3dNYWpvcixDb2xNYWpvcj4ocm93cyxjb2xzLGRlcHRoKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X3NpbmdsZTxULFJvd3MsQ29scyxEZXB0aCxSb3dNYWpvcixSb3dNYWpvcixDb2xNYWpvcj4ocm93cyxjb2xzLGRlcHRoKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X3NpbmdsZTxULFJvd3MsQ29scyxEZXB0aCxDb2xNYWpvcixDb2xNYWpvcixSb3dNYWpvcj4ocm93cyxjb2xzLGRlcHRoKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X3NpbmdsZTxULFJvd3MsQ29scyxEZXB0aCxSb3dNYWpvcixDb2xNYWpvcixSb3dNYWpvcj4ocm93cyxjb2xzLGRlcHRoKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X3NpbmdsZTxULFJvd3MsQ29scyxEZXB0aCxDb2xNYWpvcixSb3dNYWpvcixSb3dNYWpvcj4ocm93cyxjb2xzLGRlcHRoKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X3NpbmdsZTxULFJvd3MsQ29scyxEZXB0aCxSb3dNYWpvcixSb3dNYWpvcixSb3dNYWpvcj4ocm93cyxjb2xzLGRlcHRoKSApKTsKLX0gIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9pZCB0ZXN0X2xhenlfbDEoKQotewotICBpbnQgcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDEyKTsKLSAgaW50IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMik7Ci0gIGludCBkZXB0aCA9IGludGVybmFsOjpyYW5kb208aW50PigxLDEyKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCB0ZXN0X2xhenlfbDEoKSB7CisgIGludCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDEyKTsKKyAgaW50IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTIpOworICBpbnQgZGVwdGggPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTIpOwogCiAgIC8vIElubmVyCi0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwxLDE+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwxLDI+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwxLDM+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwxLDg+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwxLDk+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwxLC0xPigxLDEsZGVwdGgpICkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDEsIDEsIDE+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAxLCAxLCAyPigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgMSwgMSwgMz4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDEsIDEsIDg+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAxLCAxLCA5PigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgMSwgMSwgLTE+KDEsIDEsIGRlcHRoKSkpOwogCiAgIC8vIE91dGVyCi0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMiwxLDE+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwyLDE+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMiwyLDE+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMywzLDE+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCw0LDE+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCw4LDE+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCwtMSwxPig0LGNvbHMpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDcsLTEsMT4oNyxjb2xzKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwtMSw4LDE+KHJvd3MpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULC0xLDMsMT4ocm93cykgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsLTEsLTEsMT4ocm93cyxjb2xzKSApKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAyLCAxLCAxPigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgMSwgMiwgMT4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDIsIDIsIDE+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAzLCAzLCAxPigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgNCwgNCwgMT4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDQsIDgsIDE+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCA0LCAtMSwgMT4oNCwgY29scykpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCA3LCAtMSwgMT4oNywgY29scykpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAtMSwgOCwgMT4ocm93cykpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAtMSwgMywgMT4ocm93cykpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAtMSwgLTEsIDE+KHJvd3MsIGNvbHMpKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci12b2lkIHRlc3RfbGF6eV9sMigpCi17Ci0gIGludCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTIpOwotICBpbnQgY29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDEyKTsKLSAgaW50IGRlcHRoID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTIpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3RfbGF6eV9sMigpIHsKKyAgaW50IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTIpOworICBpbnQgY29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAxMik7CisgIGludCBkZXB0aCA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAxMik7CiAKICAgLy8gbWF0LXZlYwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDIsMSwyPigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDIsMSw0PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsMSwyPigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsMSw0PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDUsMSw0PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsMSw1PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDQsMSw2PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDYsMSw0PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDgsMSw4PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULC0xLDEsND4ocm93cykgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCwxLC0xPig0LDEsZGVwdGgpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULC0xLDEsLTE+KHJvd3MsMSxkZXB0aCkgKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgMiwgMSwgMj4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDIsIDEsIDQ+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCA0LCAxLCAyPigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgNCwgMSwgND4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDUsIDEsIDQ+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCA0LCAxLCA1PigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgNCwgMSwgNj4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDYsIDEsIDQ+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCA4LCAxLCA4PigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgLTEsIDEsIDQ+KHJvd3MpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgNCwgMSwgLTE+KDQsIDEsIGRlcHRoKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIC0xLCAxLCAtMT4ocm93cywgMSwgZGVwdGgpKSk7CiAKICAgLy8gdmVjLW1hdAotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsMiwyPigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsMiw0PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsNCwyPigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsNCw0PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsNSw0PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsNCw1PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsNCw2PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsNiw0PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsOCw4PigpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDEsLTEsIDQ+KDEsY29scykgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMSwgNCwtMT4oMSw0LGRlcHRoKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwxLC0xLC0xPigxLGNvbHMsZGVwdGgpICkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDEsIDIsIDI+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAxLCAyLCA0PigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgMSwgNCwgMj4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDEsIDQsIDQ+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAxLCA1LCA0PigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgMSwgNCwgNT4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDEsIDQsIDY+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAxLCA2LCA0PigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgMSwgOCwgOD4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDEsIC0xLCA0PigxLCBjb2xzKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDEsIDQsIC0xPigxLCA0LCBkZXB0aCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAxLCAtMSwgLTE+KDEsIGNvbHMsIGRlcHRoKSkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9pZCB0ZXN0X2xhenlfbDMoKQotewotICBpbnQgcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDEyKTsKLSAgaW50IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMik7Ci0gIGludCBkZXB0aCA9IGludGVybmFsOjpyYW5kb208aW50PigxLDEyKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCB0ZXN0X2xhenlfbDMoKSB7CisgIGludCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDEyKTsKKyAgaW50IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTIpOworICBpbnQgZGVwdGggPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTIpOwogICAvLyBtYXQtbWF0Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMiw0LDI+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsMiw2LDQ+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCwzLDI+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCw4LDQ+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNSw2LDQ+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCwyLDU+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCw3LDY+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNiw4LDQ+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsOCwzLDg+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsLTEsNiw0Pihyb3dzKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCw0LDMsLTE+KDQsMyxkZXB0aCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsLTEsNiwtMT4ocm93cyw2LGRlcHRoKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCw4LDIsMj4oKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCw1LDIsND4oKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCw0LDQsMj4oKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCw4LDQsND4oKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCw2LDUsND4oKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCw0LDQsNT4oKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwzLDQsNj4oKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwyLDYsND4oKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCw3LDgsOD4oKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggdGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCw4LC0xLCA0Pig4LGNvbHMpICkpOwotICBDQUxMX1NVQlRFU1QoKCB0ZXN0X2xhenlfYWxsX2xheW91dDxULDMsIDQsLTE+KDMsNCxkZXB0aCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsNCwtMSwtMT4oNCxjb2xzLGRlcHRoKSApKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAyLCA0LCAyPigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgMiwgNiwgND4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDQsIDMsIDI+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCA0LCA4LCA0PigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgNSwgNiwgND4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDQsIDIsIDU+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCA0LCA3LCA2PigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgNiwgOCwgND4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDgsIDMsIDg+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAtMSwgNiwgND4ocm93cykpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCA0LCAzLCAtMT4oNCwgMywgZGVwdGgpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgLTEsIDYsIC0xPihyb3dzLCA2LCBkZXB0aCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCA4LCAyLCAyPigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgNSwgMiwgND4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDQsIDQsIDI+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCA4LCA0LCA0PigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgNiwgNSwgND4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDQsIDQsIDU+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAzLCA0LCA2PigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgMiwgNiwgND4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3RfbGF6eV9hbGxfbGF5b3V0PFQsIDcsIDgsIDg+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCA4LCAtMSwgND4oOCwgY29scykpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X2xhenlfYWxsX2xheW91dDxULCAzLCA0LCAtMT4oMywgNCwgZGVwdGgpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9sYXp5X2FsbF9sYXlvdXQ8VCwgNCwgLTEsIC0xPig0LCBjb2xzLCBkZXB0aCkpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVCxpbnQgTixpbnQgTSxpbnQgSz4KLXZvaWQgdGVzdF9saW5lYXJfYnV0X25vdF92ZWN0b3JpemFibGUoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOLCBpbnQgTSwgaW50IEs+Cit2b2lkIHRlc3RfbGluZWFyX2J1dF9ub3RfdmVjdG9yaXphYmxlKCkgewogICAvLyBDaGVjayB0cmlja3kgY2FzZXMgZm9yIHdoaWNoIHRoZSByZXN1bHQgb2YgdGhlIHByb2R1Y3QgaXMgYSB2ZWN0b3IgYW5kIHRodXMgbXVzdCBleGhpYml0IHRoZSBMaW5lYXJCaXQgZmxhZywKICAgLy8gYnV0IGlzIG5vdCB2ZWN0b3JpemFibGUgYWxvbmcgdGhlIGxpbmVhciBkaW1lbnNpb24uCi0gIEluZGV4IG4gPSBOPT1EeW5hbWljID8gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwzMikgOiBOOwotICBJbmRleCBtID0gTT09RHluYW1pYyA/IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsMzIpIDogTTsKLSAgSW5kZXggayA9IEs9PUR5bmFtaWMgPyBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLDMyKSA6IEs7CisgIEluZGV4IG4gPSBOID09IER5bmFtaWMgPyBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAzMikgOiBOOworICBJbmRleCBtID0gTSA9PSBEeW5hbWljID8gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgMzIpIDogTTsKKyAgSW5kZXggayA9IEsgPT0gRHluYW1pYyA/IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIDMyKSA6IEs7CiAKICAgewotICAgIE1hdHJpeDxULE4sTSsxPiBBOyBBLnNldFJhbmRvbShuLG0rMSk7Ci0gICAgTWF0cml4PFQsTSoyLEs+IEI7IEIuc2V0UmFuZG9tKG0qMixrKTsKLSAgICBNYXRyaXg8VCwxLEs+IEM7Ci0gICAgTWF0cml4PFQsMSxLPiBSOworICAgIE1hdHJpeDxULCBOLCBNICsgMT4gQTsKKyAgICBBLnNldFJhbmRvbShuLCBtICsgMSk7CisgICAgTWF0cml4PFQsIE0gKiAyLCBLPiBCOworICAgIEIuc2V0UmFuZG9tKG0gKiAyLCBrKTsKKyAgICBNYXRyaXg8VCwgMSwgSz4gQzsKKyAgICBNYXRyaXg8VCwgMSwgSz4gUjsKIAotICAgIEMubm9hbGlhcygpID0gQS50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPDEsTT4oKSAqIChCLnRlbXBsYXRlIHRvcFJvd3M8TT4oKStCLnRlbXBsYXRlIGJvdHRvbVJvd3M8TT4oKSk7Ci0gICAgUi5ub2FsaWFzKCkgPSBBLnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8MSxNPigpICogKEIudGVtcGxhdGUgdG9wUm93czxNPigpK0IudGVtcGxhdGUgYm90dG9tUm93czxNPigpKS5ldmFsKCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChDLFIpOworICAgIEMubm9hbGlhcygpID0gQS50ZW1wbGF0ZSB0b3BMZWZ0Q29ybmVyPDEsIE0+KCkgKiAoQi50ZW1wbGF0ZSB0b3BSb3dzPE0+KCkgKyBCLnRlbXBsYXRlIGJvdHRvbVJvd3M8TT4oKSk7CisgICAgUi5ub2FsaWFzKCkgPSBBLnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8MSwgTT4oKSAqIChCLnRlbXBsYXRlIHRvcFJvd3M8TT4oKSArIEIudGVtcGxhdGUgYm90dG9tUm93czxNPigpKS5ldmFsKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChDLCBSKTsKICAgfQogCiAgIHsKLSAgICBNYXRyaXg8VCxNKzEsTixSb3dNYWpvcj4gQTsgQS5zZXRSYW5kb20obSsxLG4pOwotICAgIE1hdHJpeDxULEssTSoyLFJvd01ham9yPiBCOyBCLnNldFJhbmRvbShrLG0qMik7Ci0gICAgTWF0cml4PFQsSywxPiBDOwotICAgIE1hdHJpeDxULEssMT4gUjsKKyAgICBNYXRyaXg8VCwgTSArIDEsIE4sIFJvd01ham9yPiBBOworICAgIEEuc2V0UmFuZG9tKG0gKyAxLCBuKTsKKyAgICBNYXRyaXg8VCwgSywgTSAqIDIsIFJvd01ham9yPiBCOworICAgIEIuc2V0UmFuZG9tKGssIG0gKiAyKTsKKyAgICBNYXRyaXg8VCwgSywgMT4gQzsKKyAgICBNYXRyaXg8VCwgSywgMT4gUjsKIAotICAgIEMubm9hbGlhcygpID0gKEIudGVtcGxhdGUgbGVmdENvbHM8TT4oKStCLnRlbXBsYXRlIHJpZ2h0Q29sczxNPigpKSAgICAgICAgKiBBLnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8TSwxPigpOwotICAgIFIubm9hbGlhcygpID0gKEIudGVtcGxhdGUgbGVmdENvbHM8TT4oKStCLnRlbXBsYXRlIHJpZ2h0Q29sczxNPigpKS5ldmFsKCkgKiBBLnRlbXBsYXRlIHRvcExlZnRDb3JuZXI8TSwxPigpOwotICAgIFZFUklGWV9JU19BUFBST1goQyxSKTsKKyAgICBDLm5vYWxpYXMoKSA9IChCLnRlbXBsYXRlIGxlZnRDb2xzPE0+KCkgKyBCLnRlbXBsYXRlIHJpZ2h0Q29sczxNPigpKSAqIEEudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxNLCAxPigpOworICAgIFIubm9hbGlhcygpID0gKEIudGVtcGxhdGUgbGVmdENvbHM8TT4oKSArIEIudGVtcGxhdGUgcmlnaHRDb2xzPE0+KCkpLmV2YWwoKSAqIEEudGVtcGxhdGUgdG9wTGVmdENvcm5lcjxNLCAxPigpOworICAgIFZFUklGWV9JU19BUFBST1goQywgUik7CiAgIH0KIH0KIAotdGVtcGxhdGU8aW50IFJvd3M+Ci12b2lkIGJ1Z18xMzExKCkKLXsKLSAgTWF0cml4PCBkb3VibGUsIFJvd3MsIDIgPiBBOyAgQS5zZXRSYW5kb20oKTsKLSAgVmVjdG9yMmQgYiA9IFZlY3RvcjJkOjpSYW5kb20oKSA7Ci0gIE1hdHJpeDxkb3VibGUsUm93cywxPiByZXM7Cit0ZW1wbGF0ZSA8aW50IFJvd3M+Cit2b2lkIGJ1Z18xMzExKCkgeworICBNYXRyaXg8ZG91YmxlLCBSb3dzLCAyPiBBOworICBBLnNldFJhbmRvbSgpOworICBWZWN0b3IyZCBiID0gVmVjdG9yMmQ6OlJhbmRvbSgpOworICBNYXRyaXg8ZG91YmxlLCBSb3dzLCAxPiByZXM7CiAgIHJlcy5ub2FsaWFzKCkgPSAxLiAqIChBICogYik7Ci0gIFZFUklGWV9JU19BUFBST1gocmVzLCBBKmIpOwotICByZXMubm9hbGlhcygpID0gMS4qQSAqIGI7Ci0gIFZFUklGWV9JU19BUFBST1gocmVzLCBBKmIpOwotICByZXMubm9hbGlhcygpID0gKDEuKkEpLmxhenlQcm9kdWN0KGIpOwotICBWRVJJRllfSVNfQVBQUk9YKHJlcywgQSpiKTsKLSAgcmVzLm5vYWxpYXMoKSA9ICgxLipBKS5sYXp5UHJvZHVjdCgxLipiKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIEEqYik7Ci0gIHJlcy5ub2FsaWFzKCkgPSAoQSkubGF6eVByb2R1Y3QoMS4qYik7Ci0gIFZFUklGWV9JU19BUFBST1gocmVzLCBBKmIpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgQSAqIGIpOworICByZXMubm9hbGlhcygpID0gMS4gKiBBICogYjsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIEEgKiBiKTsKKyAgcmVzLm5vYWxpYXMoKSA9ICgxLiAqIEEpLmxhenlQcm9kdWN0KGIpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgQSAqIGIpOworICByZXMubm9hbGlhcygpID0gKDEuICogQSkubGF6eVByb2R1Y3QoMS4gKiBiKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXMsIEEgKiBiKTsKKyAgcmVzLm5vYWxpYXMoKSA9IChBKS5sYXp5UHJvZHVjdCgxLiAqIGIpOworICBWRVJJRllfSVNfQVBQUk9YKHJlcywgQSAqIGIpOwogfQogCi10ZW1wbGF0ZTxpbnQ+Ci12b2lkIHByb2R1Y3Rfc21hbGxfcmVncmVzc2lvbnMoKQotewordGVtcGxhdGUgPGludD4KK3ZvaWQgcHJvZHVjdF9zbWFsbF9yZWdyZXNzaW9ucygpIHsKICAgewogICAgIC8vIHRlc3QgY29tcGlsYXRpb24gb2YgKG91dGVyX3Byb2R1Y3QpICogdmVjdG9yCiAgICAgVmVjdG9yM2YgdiA9IFZlY3RvcjNmOjpSYW5kb20oKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCAodiAqIHYudHJhbnNwb3NlKCkpICogdiwgKHYgKiB2LnRyYW5zcG9zZSgpKS5ldmFsKCkgKiB2KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCh2ICogdi50cmFuc3Bvc2UoKSkgKiB2LCAodiAqIHYudHJhbnNwb3NlKCkpLmV2YWwoKSAqIHYpOwogICB9Ci0gIAorCiAgIHsKICAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIHB1bGwtcmVxdWVzdCAjOTMKLSAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gQTsgIEEuc2V0UmFuZG9tKCk7Ci0gICAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDE4LCAxPiBCOyBCLnNldFJhbmRvbSgpOwotICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxOD4gQzsgQy5zZXRSYW5kb20oKTsKKyAgICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgMSwgMT4gQTsKKyAgICBBLnNldFJhbmRvbSgpOworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxOCwgMT4gQjsKKyAgICBCLnNldFJhbmRvbSgpOworICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxLCAxOD4gQzsKKyAgICBDLnNldFJhbmRvbSgpOwogICAgIFZFUklGWV9JU19BUFBST1goQiAqIEEuaW52ZXJzZSgpLCBCICogQS5pbnZlcnNlKClbMF0pOwogICAgIFZFUklGWV9JU19BUFBST1goQS5pbnZlcnNlKCkgKiBDLCBBLmludmVyc2UoKVswXSAqIEMpOwogICB9CkBAIC0yNzMsMTUgKzI2NSwxNyBAQAogICAgIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLCAxMCwgMTA+IEEsIEIsIEM7CiAgICAgQS5zZXRSYW5kb20oKTsKICAgICBDID0gQTsKLSAgICBmb3IoaW50IGs9MDsgazw3OTsgKytrKQotICAgICAgQyA9IEMgKiBBOwotICAgIEIubm9hbGlhcygpID0gKCgoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSAqICgoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSkKLSAgICAgICAgICAgICAgICAqICgoKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkgKiAoKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkqKChBKkEpKihBKkEpKSooKEEqQSkqKEEqQSkpKigoQSpBKSooQSpBKSkpOwotICAgIFZFUklGWV9JU19BUFBST1goQixDKTsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IDc5OyArK2spIEMgPSBDICogQTsKKyAgICBCLm5vYWxpYXMoKSA9CisgICAgICAgICgoKEEgKiBBKSAqIChBICogQSkpICogKChBICogQSkgKiAoQSAqIEEpKSAqICgoQSAqIEEpICogKEEgKiBBKSkgKiAoKEEgKiBBKSAqIChBICogQSkpICogKChBICogQSkgKiAoQSAqIEEpKSAqCisgICAgICAgICAoKEEgKiBBKSAqIChBICogQSkpICogKChBICogQSkgKiAoQSAqIEEpKSAqICgoQSAqIEEpICogKEEgKiBBKSkgKiAoKEEgKiBBKSAqIChBICogQSkpICogKChBICogQSkgKiAoQSAqIEEpKSkgKgorICAgICAgICAoKChBICogQSkgKiAoQSAqIEEpKSAqICgoQSAqIEEpICogKEEgKiBBKSkgKiAoKEEgKiBBKSAqIChBICogQSkpICogKChBICogQSkgKiAoQSAqIEEpKSAqICgoQSAqIEEpICogKEEgKiBBKSkgKgorICAgICAgICAgKChBICogQSkgKiAoQSAqIEEpKSAqICgoQSAqIEEpICogKEEgKiBBKSkgKiAoKEEgKiBBKSAqIChBICogQSkpICogKChBICogQSkgKiAoQSAqIEEpKSAqICgoQSAqIEEpICogKEEgKiBBKSkpOworICAgIFZFUklGWV9JU19BUFBST1goQiwgQyk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogdm9pZCBwcm9kdWN0X3N3ZWVwKGludCBtYXhfbSwgaW50IG1heF9rLCBpbnQgbWF4X24pIHsKICAgdXNpbmcgTWF0cml4ID0gRWlnZW46Ok1hdHJpeDxULCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWM+OwogICBmb3IgKGludCBtID0gMTsgbSA8IG1heF9tOyArK20pIHsKQEAgLTI5Nyw1MiArMjkxLDUxIEBACiAgICAgICAgIFZFUklGWV9JU19BUFBST1goQywgQ3JlZik7CiAgICAgICB9CiAgICAgfQotICB9ICAgCisgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHByb2R1Y3Rfc21hbGwpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIHByb2R1Y3QoTWF0cml4PGZsb2F0LCAzLCAyPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBwcm9kdWN0KE1hdHJpeDxpbnQsIDMsIDE3PigpKSApOwotICAgIENBTExfU1VCVEVTVF84KCBwcm9kdWN0KE1hdHJpeDxkb3VibGUsIDMsIDE3PigpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBwcm9kdWN0KE1hdHJpeDNkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIHByb2R1Y3QoTWF0cml4NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggcHJvZHVjdChNYXRyaXg0ZigpKSApOwotICAgIENBTExfU1VCVEVTVF8xMCggcHJvZHVjdChNYXRyaXg8YmZsb2F0MTYsIDMsIDI+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoIHByb2R1Y3QxeDE8MD4oKSApOworRUlHRU5fREVDTEFSRV9URVNUKHByb2R1Y3Rfc21hbGwpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEocHJvZHVjdChNYXRyaXg8ZmxvYXQsIDMsIDI+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihwcm9kdWN0KE1hdHJpeDxpbnQsIDMsIDE3PigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgocHJvZHVjdChNYXRyaXg8ZG91YmxlLCAzLCAxNz4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKHByb2R1Y3QoTWF0cml4M2QoKSkpOworICAgIENBTExfU1VCVEVTVF80KHByb2R1Y3QoTWF0cml4NGQoKSkpOworICAgIENBTExfU1VCVEVTVF81KHByb2R1Y3QoTWF0cml4NGYoKSkpOworICAgIENBTExfU1VCVEVTVF8xMChwcm9kdWN0KE1hdHJpeDxiZmxvYXQxNiwgMywgMj4oKSkpOworICAgIENBTExfU1VCVEVTVF82KHByb2R1Y3QxeDE8MD4oKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfMTEoIHRlc3RfbGF6eV9sMTxmbG9hdD4oKSApOwotICAgIENBTExfU1VCVEVTVF8xMiggdGVzdF9sYXp5X2wyPGZsb2F0PigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEzKCB0ZXN0X2xhenlfbDM8ZmxvYXQ+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMTEodGVzdF9sYXp5X2wxPGZsb2F0PigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTIodGVzdF9sYXp5X2wyPGZsb2F0PigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTModGVzdF9sYXp5X2wzPGZsb2F0PigpKTsKIAotICAgIENBTExfU1VCVEVTVF8yMSggdGVzdF9sYXp5X2wxPGRvdWJsZT4oKSApOwotICAgIENBTExfU1VCVEVTVF8yMiggdGVzdF9sYXp5X2wyPGRvdWJsZT4oKSApOwotICAgIENBTExfU1VCVEVTVF8yMyggdGVzdF9sYXp5X2wzPGRvdWJsZT4oKSApOworICAgIENBTExfU1VCVEVTVF8yMSh0ZXN0X2xhenlfbDE8ZG91YmxlPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMjIodGVzdF9sYXp5X2wyPGRvdWJsZT4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzIzKHRlc3RfbGF6eV9sMzxkb3VibGU+KCkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzMxKCB0ZXN0X2xhenlfbDE8c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMzIoIHRlc3RfbGF6eV9sMjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSApOwotICAgIENBTExfU1VCVEVTVF8zMyggdGVzdF9sYXp5X2wzPHN0ZDo6Y29tcGxleDxmbG9hdD4gPigpICk7CisgICAgQ0FMTF9TVUJURVNUXzMxKHRlc3RfbGF6eV9sMTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzMyKHRlc3RfbGF6eV9sMjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzMzKHRlc3RfbGF6eV9sMzxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfNDEoIHRlc3RfbGF6eV9sMTxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNDIoIHRlc3RfbGF6eV9sMjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNDMoIHRlc3RfbGF6eV9sMzxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNDEodGVzdF9sYXp5X2wxPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzQyKHRlc3RfbGF6eV9sMjxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOworICAgIENBTExfU1VCVEVTVF80Myh0ZXN0X2xhenlfbDM8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsKIAotICAgIENBTExfU1VCVEVTVF83KCggdGVzdF9saW5lYXJfYnV0X25vdF92ZWN0b3JpemFibGU8ZmxvYXQsMiwxLER5bmFtaWM+KCkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzcoKCB0ZXN0X2xpbmVhcl9idXRfbm90X3ZlY3Rvcml6YWJsZTxmbG9hdCwzLDEsRHluYW1pYz4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfNygoIHRlc3RfbGluZWFyX2J1dF9ub3RfdmVjdG9yaXphYmxlPGZsb2F0LDIsMSwxNj4oKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfNygodGVzdF9saW5lYXJfYnV0X25vdF92ZWN0b3JpemFibGU8ZmxvYXQsIDIsIDEsIER5bmFtaWM+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNygodGVzdF9saW5lYXJfYnV0X25vdF92ZWN0b3JpemFibGU8ZmxvYXQsIDMsIDEsIER5bmFtaWM+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNygodGVzdF9saW5lYXJfYnV0X25vdF92ZWN0b3JpemFibGU8ZmxvYXQsIDIsIDEsIDE2PigpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfNiggYnVnXzEzMTE8Mz4oKSApOwotICAgIENBTExfU1VCVEVTVF82KCBidWdfMTMxMTw1PigpICk7CisgICAgQ0FMTF9TVUJURVNUXzYoYnVnXzEzMTE8Mz4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoYnVnXzEzMTE8NT4oKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfOSggdGVzdF9keW5hbWljX2Jvb2woKSApOwotICAgIAorICAgIENBTExfU1VCVEVTVF85KHRlc3RfZHluYW1pY19ib29sKCkpOworCiAgICAgLy8gQ29tbW9ubHkgc3BlY2lhbGl6ZWQgdmVjdG9yaXplZCB0eXBlcy4KLSAgICBDQUxMX1NVQlRFU1RfNTAoIHByb2R1Y3Rfc3dlZXA8ZmxvYXQ+KDEwLCAxMCwgMTApICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUxKCBwcm9kdWN0X3N3ZWVwPGRvdWJsZT4oMTAsIDEwLCAxMCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNTIoIHByb2R1Y3Rfc3dlZXA8RWlnZW46OmhhbGY+KDEwLCAxMCwgMTApICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUzKCBwcm9kdWN0X3N3ZWVwPEVpZ2VuOjpiZmxvYXQxNj4oMTAsIDEwLCAxMCkgKTsKKyAgICBDQUxMX1NVQlRFU1RfNTAocHJvZHVjdF9zd2VlcDxmbG9hdD4oMTAsIDEwLCAxMCkpOworICAgIENBTExfU1VCVEVTVF81MShwcm9kdWN0X3N3ZWVwPGRvdWJsZT4oMTAsIDEwLCAxMCkpOworICAgIENBTExfU1VCVEVTVF81Mihwcm9kdWN0X3N3ZWVwPEVpZ2VuOjpoYWxmPigxMCwgMTAsIDEwKSk7CisgICAgQ0FMTF9TVUJURVNUXzUzKHByb2R1Y3Rfc3dlZXA8RWlnZW46OmJmbG9hdDE2PigxMCwgMTAsIDEwKSk7CiAgIH0KIAotICBDQUxMX1NVQlRFU1RfNiggcHJvZHVjdF9zbWFsbF9yZWdyZXNzaW9uczwwPigpICk7CisgIENBTExfU1VCVEVTVF82KHByb2R1Y3Rfc21hbGxfcmVncmVzc2lvbnM8MD4oKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3Rfc3ltbS5jcHAgYi90ZXN0L3Byb2R1Y3Rfc3ltbS5jcHAKaW5kZXggZWE4ZDRkNS4uN2M2ZGIyZSAxMDA2NDQKLS0tIGEvdGVzdC9wcm9kdWN0X3N5bW0uY3BwCisrKyBiL3Rlc3QvcHJvZHVjdF9zeW1tLmNwcApAQCAtOSwxMTcgKzksMTIxIEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IFNpemUsIGludCBPdGhlclNpemU+IHZvaWQgc3ltbShpbnQgc2l6ZSA9IFNpemUsIGludCBvdGhlcnNpemUgPSBPdGhlclNpemUpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgU2l6ZSwgaW50IE90aGVyU2l6ZT4KK3ZvaWQgc3ltbShpbnQgc2l6ZSA9IFNpemUsIGludCBvdGhlcnNpemUgPSBPdGhlclNpemUpIHsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBTaXplLCBTaXplPiBNYXRyaXhUeXBlOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFNpemUsIE90aGVyU2l6ZT4gUmhzMTsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBPdGhlclNpemUsIFNpemU+IFJoczI7Ci0gIGVudW0geyBvcmRlciA9IE90aGVyU2l6ZT09MSA/IDAgOiBSb3dNYWpvciB9OwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFNpemUsIE90aGVyU2l6ZSxvcmRlcj4gUmhzMzsKKyAgZW51bSB7IG9yZGVyID0gT3RoZXJTaXplID09IDEgPyAwIDogUm93TWFqb3IgfTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBTaXplLCBPdGhlclNpemUsIG9yZGVyPiBSaHMzOwogCiAgIEluZGV4IHJvd3MgPSBzaXplOwogICBJbmRleCBjb2xzID0gc2l6ZTsKIAotICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMzsKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0zOwogCi0gIG0xID0gKG0xK20xLmFkam9pbnQoKSkuZXZhbCgpOworICBtMSA9IChtMSArIG0xLmFkam9pbnQoKSkuZXZhbCgpOwogCiAgIFJoczEgcmhzMSA9IFJoczE6OlJhbmRvbShjb2xzLCBvdGhlcnNpemUpLCByaHMxMihjb2xzLCBvdGhlcnNpemUpLCByaHMxMyhjb2xzLCBvdGhlcnNpemUpOwogICBSaHMyIHJoczIgPSBSaHMyOjpSYW5kb20ob3RoZXJzaXplLCByb3dzKSwgcmhzMjIob3RoZXJzaXplLCByb3dzKSwgcmhzMjMob3RoZXJzaXplLCByb3dzKTsKICAgUmhzMyByaHMzID0gUmhzMzo6UmFuZG9tKGNvbHMsIG90aGVyc2l6ZSksIHJoczMyKGNvbHMsIG90aGVyc2l6ZSksIHJoczMzKGNvbHMsIG90aGVyc2l6ZSk7CiAKLSAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCi0gICAgICAgICBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKIAogICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOwogICBtMyA9IG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKTsKICAgVkVSSUZZX0lTX0VRVUFMKG0xLCBtMyk7Ci0gIFZFUklGWV9JU19BUFBST1gocmhzMTIgPSAoczEqbTIpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChzMipyaHMxKSwKLSAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSptMSkgKiAoczIqcmhzMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHJoczEyID0gKHMxICogbTIpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChzMiAqIHJoczEpLCByaHMxMyA9IChzMSAqIG0xKSAqIChzMiAqIHJoczEpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKHJoczEyID0gKHMxKm0yKS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiAoczIqcmhzMSksCi0gICAgICAgICAgICAgICAgICAgcmhzMTMgPSAoczEqbTEudHJhbnNwb3NlKCkpICogKHMyKnJoczEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSAqIG0yKS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiAoczIgKiByaHMxKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSAqIG0xLnRyYW5zcG9zZSgpKSAqIChzMiAqIHJoczEpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKHJoczEyID0gKHMxKm0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHJhbnNwb3NlKCkgKiAoczIqcmhzMSksCi0gICAgICAgICAgICAgICAgICAgcmhzMTMgPSAoczEqbTEudHJhbnNwb3NlKCkpICogKHMyKnJoczEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSAqIG0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHJhbnNwb3NlKCkgKiAoczIgKiByaHMxKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSAqIG0xLnRyYW5zcG9zZSgpKSAqIChzMiAqIHJoczEpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKHJoczEyID0gKHMxKm0yKS5jb25qdWdhdGUoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoczIqcmhzMSksCi0gICAgICAgICAgICAgICAgICAgcmhzMTMgPSAoczEqbTEpLmNvbmp1Z2F0ZSgpICogKHMyKnJoczEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSAqIG0yKS5jb25qdWdhdGUoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoczIgKiByaHMxKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSAqIG0xKS5jb25qdWdhdGUoKSAqIChzMiAqIHJoczEpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKHJoczEyID0gKHMxKm0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuY29uanVnYXRlKCkgKiAoczIqcmhzMSksCi0gICAgICAgICAgICAgICAgICAgcmhzMTMgPSAoczEqbTEpLmNvbmp1Z2F0ZSgpICogKHMyKnJoczEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSAqIG0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuY29uanVnYXRlKCkgKiAoczIgKiByaHMxKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSAqIG0xKS5jb25qdWdhdGUoKSAqIChzMiAqIHJoczEpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKHJoczEyID0gKHMxKm0yKS5hZGpvaW50KCkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogKHMyKnJoczEpLAotICAgICAgICAgICAgICAgICAgIHJoczEzID0gKHMxKm0xKS5hZGpvaW50KCkgKiAoczIqcmhzMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHJoczEyID0gKHMxICogbTIpLmFkam9pbnQoKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiAoczIgKiByaHMxKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSAqIG0xKS5hZGpvaW50KCkgKiAoczIgKiByaHMxKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLmFkam9pbnQoKSAqIChzMipyaHMxKSwKLSAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSptMSkuYWRqb2ludCgpICogKHMyKnJoczEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSAqIG0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuYWRqb2ludCgpICogKHMyICogcmhzMSksCisgICAgICAgICAgICAgICAgICAgcmhzMTMgPSAoczEgKiBtMSkuYWRqb2ludCgpICogKHMyICogcmhzMSkpOwogCi0gIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7IHJoczEyLnNldFJhbmRvbSgpOyByaHMxMyA9IHJoczEyOworICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICByaHMxMi5zZXRSYW5kb20oKTsKKyAgcmhzMTMgPSByaHMxMjsKICAgbTMgPSBtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7CiAgIFZFUklGWV9JU19FUVVBTChtMSwgbTMpOwotICBWRVJJRllfSVNfQVBQUk9YKHJoczEyICs9IChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogKHMyKnJoczEpLAotICAgICAgICAgICAgICAgICAgIHJoczEzICs9IChzMSptMSkgKiAoczIqcmhzMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHJoczEyICs9IChzMSAqIG0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKiAoczIgKiByaHMxKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyArPSAoczEgKiBtMSkgKiAoczIgKiByaHMxKSk7CiAKICAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyKnJoczIuYWRqb2ludCgpKSwKLSAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSptMSkgKiAoczIqcmhzMi5hZGpvaW50KCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMiA9IChzMSAqIG0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiAoczIgKiByaHMyLmFkam9pbnQoKSksCisgICAgICAgICAgICAgICAgICAgcmhzMTMgPSAoczEgKiBtMSkgKiAoczIgKiByaHMyLmFkam9pbnQoKSkpOwogCiAgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7Ci0gIFZFUklGWV9JU19BUFBST1gocmhzMTIgPSAoczEqbTIpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqIChzMipyaHMyLmFkam9pbnQoKSksCi0gICAgICAgICAgICAgICAgICAgcmhzMTMgPSAoczEqbTEpICogKHMyKnJoczIuYWRqb2ludCgpKSk7CisgIFZFUklGWV9JU19BUFBST1gocmhzMTIgPSAoczEgKiBtMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogKHMyICogcmhzMi5hZGpvaW50KCkpLAorICAgICAgICAgICAgICAgICAgIHJoczEzID0gKHMxICogbTEpICogKHMyICogcmhzMi5hZGpvaW50KCkpKTsKIAogICBtMiA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOwotICBWRVJJRllfSVNfQVBQUk9YKHJoczEyID0gKHMxKm0yLmFkam9pbnQoKSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyKnJoczIuYWRqb2ludCgpKSwKLSAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSptMS5hZGpvaW50KCkpICogKHMyKnJoczIuYWRqb2ludCgpKSk7CisgIFZFUklGWV9JU19BUFBST1gocmhzMTIgPSAoczEgKiBtMi5hZGpvaW50KCkpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChzMiAqIHJoczIuYWRqb2ludCgpKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSAqIG0xLmFkam9pbnQoKSkgKiAoczIgKiByaHMyLmFkam9pbnQoKSkpOwogCiAgIC8vIHRlc3Qgcm93IG1ham9yID0gPC4uLj4KLSAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsgcmhzMzIuc2V0UmFuZG9tKCk7IHJoczEzID0gcmhzMzI7Ci0gIFZFUklGWV9JU19BUFBST1gocmhzMzIubm9hbGlhcygpIC09IChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyKnJoczMpLAotICAgICAgICAgICAgICAgICAgIHJoczEzIC09IChzMSptMSkgKiAoczIgKiByaHMzKSk7CisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CisgIHJoczMyLnNldFJhbmRvbSgpOworICByaHMxMyA9IHJoczMyOworICBWRVJJRllfSVNfQVBQUk9YKHJoczMyLm5vYWxpYXMoKSAtPSAoczEgKiBtMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyICogcmhzMyksCisgICAgICAgICAgICAgICAgICAgcmhzMTMgLT0gKHMxICogbTEpICogKHMyICogcmhzMykpOwogCiAgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7Ci0gIFZFUklGWV9JU19BUFBST1gocmhzMzIubm9hbGlhcygpID0gKHMxKm0yLmFkam9pbnQoKSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyKnJoczMpLmNvbmp1Z2F0ZSgpLAotICAgICAgICAgICAgICAgICAgIHJoczEzID0gKHMxKm0xLmFkam9pbnQoKSkgKiAoczIqcmhzMykuY29uanVnYXRlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHJoczMyLm5vYWxpYXMoKSA9IChzMSAqIG0yLmFkam9pbnQoKSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyICogcmhzMykuY29uanVnYXRlKCksCisgICAgICAgICAgICAgICAgICAgcmhzMTMgPSAoczEgKiBtMS5hZGpvaW50KCkpICogKHMyICogcmhzMykuY29uanVnYXRlKCkpOwogCi0KLSAgbTIgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsgcmhzMTMgPSByaHMxMjsKLSAgVkVSSUZZX0lTX0FQUFJPWChyaHMxMi5ub2FsaWFzKCkgKz0gczEgKiAoKG0yLmFkam9pbnQoKSkudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyKnJoczMpLmNvbmp1Z2F0ZSgpKSwKLSAgICAgICAgICAgICAgICAgICByaHMxMyArPSAoczEqbTEuYWRqb2ludCgpKSAqIChzMipyaHMzKS5jb25qdWdhdGUoKSk7CisgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CisgIHJoczEzID0gcmhzMTI7CisgIFZFUklGWV9JU19BUFBST1gocmhzMTIubm9hbGlhcygpICs9IHMxICogKChtMi5hZGpvaW50KCkpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChzMiAqIHJoczMpLmNvbmp1Z2F0ZSgpKSwKKyAgICAgICAgICAgICAgICAgICByaHMxMyArPSAoczEgKiBtMS5hZGpvaW50KCkpICogKHMyICogcmhzMykuY29uanVnYXRlKCkpOwogCiAgIG0yID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCk7CiAgIFZFUklGWV9JU19BUFBST1gocmhzMjIgPSAocmhzMikgKiAobTIpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSwgcmhzMjMgPSAocmhzMikgKiAobTEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyaHMyMiA9IChzMipyaHMyKSAqIChzMSptMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLCByaHMyMyA9IChzMipyaHMyKSAqIChzMSptMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHJoczIyID0gKHMyICogcmhzMikgKiAoczEgKiBtMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLCByaHMyMyA9IChzMiAqIHJoczIpICogKHMxICogbTEpKTsKIAogICAvLyBkZXN0aW5hdGlvbiB3aXRoIGEgbm9uLWRlZmF1bHQgaW5uZXItc3RyaWRlCiAgIC8vIHNlZSBidWcgMTc0MQogICB7Ci0gICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gTWF0cml4WDsKLSAgICBNYXRyaXhYIGJ1ZmZlcigyKmNvbHMsMipvdGhlcnNpemUpOwotICAgIE1hcDxSaHMxLDAsU3RyaWRlPER5bmFtaWMsMj4gPiBtYXAxKGJ1ZmZlci5kYXRhKCksY29scyxvdGhlcnNpemUsU3RyaWRlPER5bmFtaWMsMj4oMipyb3dzLDIpKTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IE1hdHJpeFg7CisgICAgTWF0cml4WCBidWZmZXIoMiAqIGNvbHMsIDIgKiBvdGhlcnNpemUpOworICAgIE1hcDxSaHMxLCAwLCBTdHJpZGU8RHluYW1pYywgMj4gPiBtYXAxKGJ1ZmZlci5kYXRhKCksIGNvbHMsIG90aGVyc2l6ZSwgU3RyaWRlPER5bmFtaWMsIDI+KDIgKiByb3dzLCAyKSk7CiAgICAgYnVmZmVyLnNldFplcm8oKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCBtYXAxLm5vYWxpYXMoKSAgPSAoczEqbTIpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIChzMipyaHMxKSwKLSAgICAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSptMSkgKiAoczIqcmhzMSkpOworICAgIFZFUklGWV9JU19BUFBST1gobWFwMS5ub2FsaWFzKCkgPSAoczEgKiBtMikudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogKHMyICogcmhzMSksCisgICAgICAgICAgICAgICAgICAgICByaHMxMyA9IChzMSAqIG0xKSAqIChzMiAqIHJoczEpKTsKIAotICAgIE1hcDxSaHMyLDAsU3RyaWRlPER5bmFtaWMsMj4gPiBtYXAyKGJ1ZmZlci5kYXRhKCkscmhzMjIucm93cygpLHJoczIyLmNvbHMoKSxTdHJpZGU8RHluYW1pYywyPigyKnJoczIyLm91dGVyU3RyaWRlKCksMikpOworICAgIE1hcDxSaHMyLCAwLCBTdHJpZGU8RHluYW1pYywgMj4gPiBtYXAyKGJ1ZmZlci5kYXRhKCksIHJoczIyLnJvd3MoKSwgcmhzMjIuY29scygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlkZTxEeW5hbWljLCAyPigyICogcmhzMjIub3V0ZXJTdHJpZGUoKSwgMikpOwogICAgIGJ1ZmZlci5zZXRaZXJvKCk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXAyID0gKHJoczIpICogKG0yKS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCksIHJoczIzID0gKHJoczIpICogKG0xKSk7CiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHByb2R1Y3Rfc3ltbSkKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKQotICB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoKCBzeW1tPGZsb2F0LER5bmFtaWMsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpICkpOwotICAgIENBTExfU1VCVEVTVF8yKCggc3ltbTxkb3VibGUsRHluYW1pYyxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoKCBzeW1tPHN0ZDo6Y29tcGxleDxmbG9hdD4sRHluYW1pYyxEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpLGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMikpICkpOwotICAgIENBTExfU1VCVEVTVF80KCggc3ltbTxzdGQ6OmNvbXBsZXg8ZG91YmxlPixEeW5hbWljLER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkgKSk7CitFSUdFTl9ERUNMQVJFX1RFU1QocHJvZHVjdF9zeW1tKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKChzeW1tPGZsb2F0LCBEeW5hbWljLCBEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMigoc3ltbTxkb3VibGUsIER5bmFtaWMsIER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoc3ltbTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBEeW5hbWljLCBEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMikpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKHN5bW08c3RkOjpjb21wbGV4PGRvdWJsZT4sIER5bmFtaWMsIER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMikpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfNSgoIHN5bW08ZmxvYXQsRHluYW1pYywxPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoKCBzeW1tPGRvdWJsZSxEeW5hbWljLDE+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfNygoIHN5bW08c3RkOjpjb21wbGV4PGZsb2F0PixEeW5hbWljLDE+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfOCgoIHN5bW08c3RkOjpjb21wbGV4PGRvdWJsZT4sRHluYW1pYywxPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKHN5bW08ZmxvYXQsIER5bmFtaWMsIDE+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNigoc3ltbTxkb3VibGUsIER5bmFtaWMsIDE+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNygoc3ltbTxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBEeW5hbWljLCAxPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgoKHN5bW08c3RkOjpjb21wbGV4PGRvdWJsZT4sIER5bmFtaWMsIDE+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9wcm9kdWN0X3N5cmsuY3BwIGIvdGVzdC9wcm9kdWN0X3N5cmsuY3BwCmluZGV4IDE2Y2NiM2EuLmQ1MGY0YzQgMTAwNjQ0Ci0tLSBhL3Rlc3QvcHJvZHVjdF9zeXJrLmNwcAorKysgYi90ZXN0L3Byb2R1Y3Rfc3lyay5jcHAKQEAgLTksNzggKzksNzUgQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBzeXJrKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgc3lyayhjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIFJvd01ham9yPiBSTWF0cml4VHlwZTsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgRHluYW1pYz4gUmhzMTsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gUmhzMjsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgRHluYW1pYyxSb3dNYWpvcj4gUmhzMzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgRHluYW1pYywgUm93TWFqb3I+IFJoczM7CiAKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKLSAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCiAgICAgICAgICAgICAgbTMgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CiAgIFJNYXRyaXhUeXBlIHJtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKIAotICBSaHMxIHJoczEgPSBSaHMxOjpSYW5kb20oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzIwKSwgY29scyk7IFJoczEgcmhzMTEgPSBSaHMxOjpSYW5kb20ocmhzMS5yb3dzKCksIGNvbHMpOwotICBSaHMyIHJoczIgPSBSaHMyOjpSYW5kb20ocm93cywgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzIwKSk7IFJoczIgcmhzMjIgPSBSaHMyOjpSYW5kb20ocm93cywgcmhzMi5jb2xzKCkpOwotICBSaHMzIHJoczMgPSBSaHMzOjpSYW5kb20oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzIwKSwgcm93cyk7CisgIFJoczEgcmhzMSA9IFJoczE6OlJhbmRvbShpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMzIwKSwgY29scyk7CisgIFJoczEgcmhzMTEgPSBSaHMxOjpSYW5kb20ocmhzMS5yb3dzKCksIGNvbHMpOworICBSaHMyIHJoczIgPSBSaHMyOjpSYW5kb20ocm93cywgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDMyMCkpOworICBSaHMyIHJoczIyID0gUmhzMjo6UmFuZG9tKHJvd3MsIHJoczIuY29scygpKTsKKyAgUmhzMyByaHMzID0gUmhzMzo6UmFuZG9tKGludGVybmFsOjpyYW5kb208aW50PigxLCAzMjApLCByb3dzKTsKIAogICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKLSAgCi0gIEluZGV4IGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7CisKKyAgSW5kZXggYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAxKTsKIAogICBtMi5zZXRaZXJvKCk7Ci0gIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKHJoczIsczEpLl9leHByZXNzaW9uKCkpLAorICBWRVJJRllfSVNfQVBQUk9YKChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShyaHMyLCBzMSkuX2V4cHJlc3Npb24oKSksCiAgICAgICAgICAgICAgICAgICAgKChzMSAqIHJoczIgKiByaHMyLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSkpOwogICBtMi5zZXRaZXJvKCk7Ci0gIFZFUklGWV9JU19BUFBST1goKChtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSArPSBzMSAqIHJoczIgICogcmhzMjIuYWRqb2ludCgpKS5uZXN0ZWRFeHByZXNzaW9uKCkpLAorICBWRVJJRllfSVNfQVBQUk9YKCgobTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKz0gczEgKiByaHMyICogcmhzMjIuYWRqb2ludCgpKS5uZXN0ZWRFeHByZXNzaW9uKCkpLAogICAgICAgICAgICAgICAgICAgICgoczEgKiByaHMyICogcmhzMjIuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CiAKLSAgCiAgIG0yLnNldFplcm8oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShyaHMyLHMxKS5fZXhwcmVzc2lvbigpLAorICBWRVJJRllfSVNfQVBQUk9YKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS5yYW5rVXBkYXRlKHJoczIsIHMxKS5fZXhwcmVzc2lvbigpLAogICAgICAgICAgICAgICAgICAgIChzMSAqIHJoczIgKiByaHMyLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSk7CiAgIG0yLnNldFplcm8oKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgobTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKz0gczEgKiByaHMyMiAqIHJoczIuYWRqb2ludCgpKS5uZXN0ZWRFeHByZXNzaW9uKCksCiAgICAgICAgICAgICAgICAgICAgKHMxICogcmhzMjIgKiByaHMyLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSk7CiAKLSAgCiAgIG0yLnNldFplcm8oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShyaHMxLmFkam9pbnQoKSxzMSkuX2V4cHJlc3Npb24oKSwKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShyaHMxLmFkam9pbnQoKSwgczEpLl9leHByZXNzaW9uKCksCiAgICAgICAgICAgICAgICAgICAgKHMxICogcmhzMS5hZGpvaW50KCkgKiByaHMxKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKTsKICAgbTIuc2V0WmVybygpOwogICBWRVJJRllfSVNfQVBQUk9YKChtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSArPSBzMSAqIHJoczExLmFkam9pbnQoKSAqIHJoczEpLm5lc3RlZEV4cHJlc3Npb24oKSwKICAgICAgICAgICAgICAgICAgICAoczEgKiByaHMxMS5hZGpvaW50KCkgKiByaHMxKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKTsKLSAgCi0gIAorCiAgIG0yLnNldFplcm8oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShyaHMxLmFkam9pbnQoKSxzMSkuX2V4cHJlc3Npb24oKSwKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShyaHMxLmFkam9pbnQoKSwgczEpLl9leHByZXNzaW9uKCksCiAgICAgICAgICAgICAgICAgICAgKHMxICogcmhzMS5hZGpvaW50KCkgKiByaHMxKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgobTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgPSBzMSAqIHJoczEuYWRqb2ludCgpICogcmhzMTEpLm5lc3RlZEV4cHJlc3Npb24oKSwKICAgICAgICAgICAgICAgICAgICAoczEgKiByaHMxLmFkam9pbnQoKSAqIHJoczExKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpKTsKIAotICAKICAgbTIuc2V0WmVybygpOwotICBWRVJJRllfSVNfQVBQUk9YKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKHJoczMuYWRqb2ludCgpLHMxKS5fZXhwcmVzc2lvbigpLAorICBWRVJJRllfSVNfQVBQUk9YKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKHJoczMuYWRqb2ludCgpLCBzMSkuX2V4cHJlc3Npb24oKSwKICAgICAgICAgICAgICAgICAgICAoczEgKiByaHMzLmFkam9pbnQoKSAqIHJoczMpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpOwogCiAgIG0yLnNldFplcm8oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShyaHMzLmFkam9pbnQoKSxzMSkuX2V4cHJlc3Npb24oKSwKKyAgVkVSSUZZX0lTX0FQUFJPWChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShyaHMzLmFkam9pbnQoKSwgczEpLl9leHByZXNzaW9uKCksCiAgICAgICAgICAgICAgICAgICAgKHMxICogcmhzMy5hZGpvaW50KCkgKiByaHMzKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpKTsKLSAgICAgICAgICAgICAgICAgICAKKwogICBtMi5zZXRaZXJvKCk7Ci0gIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0xLmNvbChjKSxzMSkuX2V4cHJlc3Npb24oKSksCisgIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0xLmNvbChjKSwgczEpLl9leHByZXNzaW9uKCkpLAogICAgICAgICAgICAgICAgICAgICgoczEgKiBtMS5jb2woYykgKiBtMS5jb2woYykuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgCisKICAgbTIuc2V0WmVybygpOwotICBWRVJJRllfSVNfQVBQUk9YKChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShtMS5jb2woYyksczEpLl9leHByZXNzaW9uKCkpLAorICBWRVJJRllfSVNfQVBQUk9YKChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShtMS5jb2woYyksIHMxKS5fZXhwcmVzc2lvbigpKSwKICAgICAgICAgICAgICAgICAgICAoKHMxICogbTEuY29sKGMpICogbTEuY29sKGMpLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSkpOwogICBybTIuc2V0WmVybygpOwotICBWRVJJRllfSVNfQVBQUk9YKChybTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUobTEuY29sKGMpLHMxKS5fZXhwcmVzc2lvbigpKSwKKyAgVkVSSUZZX0lTX0FQUFJPWCgocm0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS5yYW5rVXBkYXRlKG0xLmNvbChjKSwgczEpLl9leHByZXNzaW9uKCkpLAogICAgICAgICAgICAgICAgICAgICgoczEgKiBtMS5jb2woYykgKiBtMS5jb2woYykuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CiAgIG0yLnNldFplcm8oKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgobTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKz0gczEgKiBtMy5jb2woYykgKiBtMS5jb2woYykuYWRqb2ludCgpKS5uZXN0ZWRFeHByZXNzaW9uKCksCkBAIC04OCw2MCArODUsODAgQEAKICAgcm0yLnNldFplcm8oKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgocm0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICs9IHMxICogbTEuY29sKGMpICogbTMuY29sKGMpLmFkam9pbnQoKSkubmVzdGVkRXhwcmVzc2lvbigpLAogICAgICAgICAgICAgICAgICAgICgoczEgKiBtMS5jb2woYykgKiBtMy5jb2woYykuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7Ci0gIAorCiAgIG0yLnNldFplcm8oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgobTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUobTEuY29sKGMpLmNvbmp1Z2F0ZSgpLHMxKS5fZXhwcmVzc2lvbigpKSwKLSAgICAgICAgICAgICAgICAgICAoKHMxICogbTEuY29sKGMpLmNvbmp1Z2F0ZSgpICogbTEuY29sKGMpLmNvbmp1Z2F0ZSgpLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSkpOwotICAgICAgICAgICAgICAgICAgIAorICBWRVJJRllfSVNfQVBQUk9YKChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShtMS5jb2woYykuY29uanVnYXRlKCksIHMxKS5fZXhwcmVzc2lvbigpKSwKKyAgICAgICAgICAgICAgICAgICAoKHMxICogbTEuY29sKGMpLmNvbmp1Z2F0ZSgpICogbTEuY29sKGMpLmNvbmp1Z2F0ZSgpLmFkam9pbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ldmFsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvRGVuc2VNYXRyaXgoKSkpOworCiAgIG0yLnNldFplcm8oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgobTIudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnJhbmtVcGRhdGUobTEuY29sKGMpLmNvbmp1Z2F0ZSgpLHMxKS5fZXhwcmVzc2lvbigpKSwKLSAgICAgICAgICAgICAgICAgICAoKHMxICogbTEuY29sKGMpLmNvbmp1Z2F0ZSgpICogbTEuY29sKGMpLmNvbmp1Z2F0ZSgpLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSkpOwotICAKLSAgCisgIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS5yYW5rVXBkYXRlKG0xLmNvbChjKS5jb25qdWdhdGUoKSwgczEpLl9leHByZXNzaW9uKCkpLAorICAgICAgICAgICAgICAgICAgICgoczEgKiBtMS5jb2woYykuY29uanVnYXRlKCkgKiBtMS5jb2woYykuY29uanVnYXRlKCkuYWRqb2ludCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmV2YWwoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAgICAgICAgICAgICAgICAgICAgICAudG9EZW5zZU1hdHJpeCgpKSk7CisKICAgbTIuc2V0WmVybygpOwotICBWRVJJRllfSVNfQVBQUk9YKChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShtMS5yb3coYyksczEpLl9leHByZXNzaW9uKCkpLAotICAgICAgICAgICAgICAgICAgICgoczEgKiBtMS5yb3coYykudHJhbnNwb3NlKCkgKiBtMS5yb3coYykudHJhbnNwb3NlKCkuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5yYW5rVXBkYXRlKG0xLnJvdyhjKSwgczEpLl9leHByZXNzaW9uKCkpLAorICAgICAgICAgICAgICAgICAgICgoczEgKiBtMS5yb3coYykudHJhbnNwb3NlKCkgKiBtMS5yb3coYykudHJhbnNwb3NlKCkuYWRqb2ludCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmV2YWwoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpCisgICAgICAgICAgICAgICAgICAgICAgICAudG9EZW5zZU1hdHJpeCgpKSk7CiAgIHJtMi5zZXRaZXJvKCk7Ci0gIFZFUklGWV9JU19BUFBST1goKHJtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShtMS5yb3coYyksczEpLl9leHByZXNzaW9uKCkpLAotICAgICAgICAgICAgICAgICAgICgoczEgKiBtMS5yb3coYykudHJhbnNwb3NlKCkgKiBtMS5yb3coYykudHJhbnNwb3NlKCkuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CisgIFZFUklGWV9JU19BUFBST1goKHJtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkucmFua1VwZGF0ZShtMS5yb3coYyksIHMxKS5fZXhwcmVzc2lvbigpKSwKKyAgICAgICAgICAgICAgICAgICAoKHMxICogbTEucm93KGMpLnRyYW5zcG9zZSgpICogbTEucm93KGMpLnRyYW5zcG9zZSgpLmFkam9pbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ldmFsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvRGVuc2VNYXRyaXgoKSkpOwogICBtMi5zZXRaZXJvKCk7Ci0gIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICs9IHMxICogbTMucm93KGMpLnRyYW5zcG9zZSgpICogbTEucm93KGMpLnRyYW5zcG9zZSgpLmFkam9pbnQoKSkubmVzdGVkRXhwcmVzc2lvbigpLAotICAgICAgICAgICAgICAgICAgICgoczEgKiBtMy5yb3coYykudHJhbnNwb3NlKCkgKiBtMS5yb3coYykudHJhbnNwb3NlKCkuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICs9IHMxICogbTMucm93KGMpLnRyYW5zcG9zZSgpICogbTEucm93KGMpLnRyYW5zcG9zZSgpLmFkam9pbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLm5lc3RlZEV4cHJlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAoKHMxICogbTMucm93KGMpLnRyYW5zcG9zZSgpICogbTEucm93KGMpLnRyYW5zcG9zZSgpLmFkam9pbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ldmFsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvRGVuc2VNYXRyaXgoKSkpOwogICBybTIuc2V0WmVybygpOwotICBWRVJJRllfSVNfQVBQUk9YKChybTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgKz0gczEgKiBtMy5yb3coYykudHJhbnNwb3NlKCkgKiBtMS5yb3coYykudHJhbnNwb3NlKCkuYWRqb2ludCgpKS5uZXN0ZWRFeHByZXNzaW9uKCksCi0gICAgICAgICAgICAgICAgICAgKChzMSAqIG0zLnJvdyhjKS50cmFuc3Bvc2UoKSAqIG0xLnJvdyhjKS50cmFuc3Bvc2UoKS5hZGpvaW50KCkpLmV2YWwoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpKTsKLSAgCi0gIAorICBWRVJJRllfSVNfQVBQUk9YKAorICAgICAgKHJtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSArPSBzMSAqIG0zLnJvdyhjKS50cmFuc3Bvc2UoKSAqIG0xLnJvdyhjKS50cmFuc3Bvc2UoKS5hZGpvaW50KCkpCisgICAgICAgICAgLm5lc3RlZEV4cHJlc3Npb24oKSwKKyAgICAgICgoczEgKiBtMy5yb3coYykudHJhbnNwb3NlKCkgKiBtMS5yb3coYykudHJhbnNwb3NlKCkuYWRqb2ludCgpKQorICAgICAgICAgICAuZXZhbCgpCisgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKQorICAgICAgICAgICAudG9EZW5zZU1hdHJpeCgpKSk7CisKICAgbTIuc2V0WmVybygpOwotICBWRVJJRllfSVNfQVBQUk9YKChtMi50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkucmFua1VwZGF0ZShtMS5yb3coYykuYWRqb2ludCgpLHMxKS5fZXhwcmVzc2lvbigpKSwKLSAgICAgICAgICAgICAgICAgICAoKHMxICogbTEucm93KGMpLmFkam9pbnQoKSAqIG0xLnJvdyhjKS5hZGpvaW50KCkuYWRqb2ludCgpKS5ldmFsKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpKSk7CisgIFZFUklGWV9JU19BUFBST1goKG0yLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS5yYW5rVXBkYXRlKG0xLnJvdyhjKS5hZGpvaW50KCksIHMxKS5fZXhwcmVzc2lvbigpKSwKKyAgICAgICAgICAgICAgICAgICAoKHMxICogbTEucm93KGMpLmFkam9pbnQoKSAqIG0xLnJvdyhjKS5hZGpvaW50KCkuYWRqb2ludCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmV2YWwoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgICAgICAgICAgICAgICAgICAgICAgICAudG9EZW5zZU1hdHJpeCgpKSk7CiAKICAgLy8gZGVzdGluYXRpb24gd2l0aCBhIG5vbi1kZWZhdWx0IGlubmVyLXN0cmlkZQogICAvLyBzZWUgYnVnIDE3NDEKICAgewotICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IE1hdHJpeFg7Ci0gICAgTWF0cml4WCBidWZmZXIoMipyb3dzLDIqY29scyk7Ci0gICAgTWFwPE1hdHJpeFR5cGUsMCxTdHJpZGU8RHluYW1pYywyPiA+IG1hcDEoYnVmZmVyLmRhdGEoKSxyb3dzLGNvbHMsU3RyaWRlPER5bmFtaWMsMj4oMipyb3dzLDIpKTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IE1hdHJpeFg7CisgICAgTWF0cml4WCBidWZmZXIoMiAqIHJvd3MsIDIgKiBjb2xzKTsKKyAgICBNYXA8TWF0cml4VHlwZSwgMCwgU3RyaWRlPER5bmFtaWMsIDI+ID4gbWFwMShidWZmZXIuZGF0YSgpLCByb3dzLCBjb2xzLCBTdHJpZGU8RHluYW1pYywgMj4oMiAqIHJvd3MsIDIpKTsKICAgICBidWZmZXIuc2V0WmVybygpOwotICAgIFZFUklGWV9JU19BUFBST1goKG1hcDEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUocmhzMixzMSkuX2V4cHJlc3Npb24oKSksCi0gICAgICAgICAgICAgICAgICAgICAgKChzMSAqIHJoczIgKiByaHMyLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSkpOworICAgIFZFUklGWV9JU19BUFBST1goKG1hcDEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnJhbmtVcGRhdGUocmhzMiwgczEpLl9leHByZXNzaW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgKChzMSAqIHJoczIgKiByaHMyLmFkam9pbnQoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChwcm9kdWN0X3N5cmspCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdCA7IGkrKykKLSAgeworRUlHRU5fREVDTEFSRV9URVNUKHByb2R1Y3Rfc3lyaykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKICAgICBpbnQgczsKLSAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIHN5cmsoTWF0cml4WGYocywgcykpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIHN5cmsoTWF0cml4WGQocywgcykpICk7CisgICAgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgICBDQUxMX1NVQlRFU1RfMShzeXJrKE1hdHJpeFhmKHMsIHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoc3lyayhNYXRyaXhYZChzLCBzKSkpOwogICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKLSAgICAKLSAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggc3lyayhNYXRyaXhYY2YocywgcykpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIHN5cmsoTWF0cml4WGNkKHMsIHMpKSApOwotICAgIENBTExfU1VCVEVTVF81KCBzeXJrKE1hdHJpeDxiZmxvYXQxNiwgRHluYW1pYywgRHluYW1pYz4ocywgcykpICk7CisKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhzeXJrKE1hdHJpeFhjZihzLCBzKSkpOworICAgIENBTExfU1VCVEVTVF80KHN5cmsoTWF0cml4WGNkKHMsIHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoc3lyayhNYXRyaXg8YmZsb2F0MTYsIER5bmFtaWMsIER5bmFtaWM+KHMsIHMpKSk7CiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3RfdGhyZWFkZWQuY3BwIGIvdGVzdC9wcm9kdWN0X3RocmVhZGVkLmNwcAppbmRleCA5NWRhZDc5Li40MTBmNzY3IDEwMDY0NAotLS0gYS90ZXN0L3Byb2R1Y3RfdGhyZWFkZWQuY3BwCisrKyBiL3Rlc3QvcHJvZHVjdF90aHJlYWRlZC5jcHAKQEAgLTEzLDIxICsxMywxNiBAQAogdm9pZCB0ZXN0X3BhcmFsbGVsaXplX2dlbW0oKSB7CiAgIGNvbnN0ZXhwciBpbnQgbiA9IDEwMjQ7CiAgIGNvbnN0ZXhwciBpbnQgbnVtX3RocmVhZHMgPSA0OwotICBNYXRyaXhYZiBhKG4sbik7Ci0gIE1hdHJpeFhmIGIobixuKTsKLSAgTWF0cml4WGYgYyhuLG4pOwotICBjLm5vYWxpYXMoKSA9IGEqYjsKKyAgTWF0cml4WGYgYShuLCBuKTsKKyAgTWF0cml4WGYgYihuLCBuKTsKKyAgTWF0cml4WGYgYyhuLCBuKTsKKyAgYy5ub2FsaWFzKCkgPSBhICogYjsKIAogICBUaHJlYWRQb29sIHBvb2wobnVtX3RocmVhZHMpOwotICBNYXRyaXhYZiBjX3RocmVhZGVkKG4sbik7Ci0gIGNfdGhyZWFkZWQubm9hbGlhcygpID0gYSpiOworICBNYXRyaXhYZiBjX3RocmVhZGVkKG4sIG4pOworICBjX3RocmVhZGVkLm5vYWxpYXMoKSA9IGEgKiBiOwogCiAgIFZFUklGWV9JU19BUFBST1goYywgY190aHJlYWRlZCk7CiB9CiAKLQotCi1FSUdFTl9ERUNMQVJFX1RFU1QocHJvZHVjdF90aHJlYWRlZCkKLXsKLSAgQ0FMTF9TVUJURVNUKHRlc3RfcGFyYWxsZWxpemVfZ2VtbSgpKTsKLX0KK0VJR0VOX0RFQ0xBUkVfVEVTVChwcm9kdWN0X3RocmVhZGVkKSB7IENBTExfU1VCVEVTVCh0ZXN0X3BhcmFsbGVsaXplX2dlbW0oKSk7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvcHJvZHVjdF90cm1tLmNwcCBiL3Rlc3QvcHJvZHVjdF90cm1tLmNwcAppbmRleCAyYmI0YjllLi5hOGE0MjIwIDEwMDY0NAotLS0gYS90ZXN0L3Byb2R1Y3RfdHJtbS5jcHAKKysrIGIvdGVzdC9wcm9kdWN0X3RybW0uY3BwCkBAIC05LDEyOSArOSwxMzYgQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWludCBnZXRfcmFuZG9tX3NpemUoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbnQgZ2V0X3JhbmRvbV9zaXplKCkgewogICBjb25zdCBpbnQgZmFjdG9yID0gTnVtVHJhaXRzPFQ+OjpSZWFkQ29zdDsKLSAgY29uc3QgaW50IG1heF90ZXN0X3NpemUgPSBFSUdFTl9URVNUX01BWF9TSVpFPjIqZmFjdG9yID8gRUlHRU5fVEVTVF9NQVhfU0laRS9mYWN0b3IgOiBFSUdFTl9URVNUX01BWF9TSVpFOwotICByZXR1cm4gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4X3Rlc3Rfc2l6ZSk7CisgIGNvbnN0IGludCBtYXhfdGVzdF9zaXplID0gRUlHRU5fVEVTVF9NQVhfU0laRSA+IDIgKiBmYWN0b3IgPyBFSUdFTl9URVNUX01BWF9TSVpFIC8gZmFjdG9yIDogRUlHRU5fVEVTVF9NQVhfU0laRTsKKyAgcmV0dXJuIGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhfdGVzdF9zaXplKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZSwgaW50IFRyaU9yZGVyLCBpbnQgT3RoZXJPcmRlciwgaW50IFJlc09yZGVyLCBpbnQgT3RoZXJDb2xzPgotdm9pZCB0cm1tKGludCByb3dzPWdldF9yYW5kb21fc2l6ZTxTY2FsYXI+KCksCi0gICAgICAgICAgaW50IGNvbHM9Z2V0X3JhbmRvbV9zaXplPFNjYWxhcj4oKSwKLSAgICAgICAgICBpbnQgb3RoZXJDb2xzID0gT3RoZXJDb2xzPT1EeW5hbWljP2dldF9yYW5kb21fc2l6ZTxTY2FsYXI+KCk6T3RoZXJDb2xzKQotewotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLFRyaU9yZGVyPiBUcmlNYXRyaXg7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLE90aGVyQ29scyxPdGhlckNvbHM9PTE/Q29sTWFqb3I6T3RoZXJPcmRlcj4gT25UaGVSaWdodDsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLE90aGVyQ29scyxEeW5hbWljLE90aGVyQ29scz09MT9Sb3dNYWpvcjpPdGhlck9yZGVyPiBPblRoZUxlZnQ7Ci0gIAotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxPdGhlckNvbHMsT3RoZXJDb2xzPT0xP0NvbE1ham9yOlJlc09yZGVyPiBSZXNYUzsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLE90aGVyQ29scyxEeW5hbWljLE90aGVyQ29scz09MT9Sb3dNYWpvcjpSZXNPcmRlcj4gUmVzU1g7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTW9kZSwgaW50IFRyaU9yZGVyLCBpbnQgT3RoZXJPcmRlciwgaW50IFJlc09yZGVyLCBpbnQgT3RoZXJDb2xzPgordm9pZCB0cm1tKGludCByb3dzID0gZ2V0X3JhbmRvbV9zaXplPFNjYWxhcj4oKSwgaW50IGNvbHMgPSBnZXRfcmFuZG9tX3NpemU8U2NhbGFyPigpLAorICAgICAgICAgIGludCBvdGhlckNvbHMgPSBPdGhlckNvbHMgPT0gRHluYW1pYyA/IGdldF9yYW5kb21fc2l6ZTxTY2FsYXI+KCkgOiBPdGhlckNvbHMpIHsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBUcmlPcmRlcj4gVHJpTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIE90aGVyQ29scywgT3RoZXJDb2xzID09IDEgPyBDb2xNYWpvciA6IE90aGVyT3JkZXI+IE9uVGhlUmlnaHQ7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgT3RoZXJDb2xzLCBEeW5hbWljLCBPdGhlckNvbHMgPT0gMSA/IFJvd01ham9yIDogT3RoZXJPcmRlcj4gT25UaGVMZWZ0OwogCi0gIFRyaU1hdHJpeCAgbWF0KHJvd3MsY29scyksIHRyaShyb3dzLGNvbHMpLCB0cmlUcihjb2xzLHJvd3MpLCBzMXRyaShyb3dzLGNvbHMpLCBzMXRyaVRyKGNvbHMscm93cyk7Ci0gIAotICBPblRoZVJpZ2h0ICBnZV9yaWdodChjb2xzLG90aGVyQ29scyk7Ci0gIE9uVGhlTGVmdCAgIGdlX2xlZnQob3RoZXJDb2xzLHJvd3MpOwotICBSZXNTWCAgICAgICBnZV9zeCwgZ2Vfc3hfc2F2ZTsKLSAgUmVzWFMgICAgICAgZ2VfeHMsIGdlX3hzX3NhdmU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgT3RoZXJDb2xzLCBPdGhlckNvbHMgPT0gMSA/IENvbE1ham9yIDogUmVzT3JkZXI+IFJlc1hTOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE90aGVyQ29scywgRHluYW1pYywgT3RoZXJDb2xzID09IDEgPyBSb3dNYWpvciA6IFJlc09yZGVyPiBSZXNTWDsKIAotICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKLSAgICAgICAgIHMyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIFRyaU1hdHJpeCBtYXQocm93cywgY29scyksIHRyaShyb3dzLCBjb2xzKSwgdHJpVHIoY29scywgcm93cyksIHMxdHJpKHJvd3MsIGNvbHMpLCBzMXRyaVRyKGNvbHMsIHJvd3MpOworCisgIE9uVGhlUmlnaHQgZ2VfcmlnaHQoY29scywgb3RoZXJDb2xzKTsKKyAgT25UaGVMZWZ0IGdlX2xlZnQob3RoZXJDb2xzLCByb3dzKTsKKyAgUmVzU1ggZ2Vfc3gsIGdlX3N4X3NhdmU7CisgIFJlc1hTIGdlX3hzLCBnZV94c19zYXZlOworCisgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLCBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwogCiAgIG1hdC5zZXRSYW5kb20oKTsKICAgdHJpID0gbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCk7CiAgIHRyaVRyID0gbWF0LnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCk7Ci0gIHMxdHJpID0gKHMxKm1hdCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKTsKLSAgczF0cmlUciA9IChzMSptYXQpLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCk7CisgIHMxdHJpID0gKHMxICogbWF0KS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpOworICBzMXRyaVRyID0gKHMxICogbWF0KS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpOwogICBnZV9yaWdodC5zZXRSYW5kb20oKTsKICAgZ2VfbGVmdC5zZXRSYW5kb20oKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCBnZV94cyA9IG1hdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpICogZ2VfcmlnaHQsIHRyaSAqIGdlX3JpZ2h0KTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggZ2Vfc3ggPSBnZV9sZWZ0ICogbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCksIGdlX2xlZnQgKiB0cmkpOwotICAKLSAgVkVSSUZZX0lTX0FQUFJPWCggZ2VfeHMubm9hbGlhcygpID0gbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkgKiBnZV9yaWdodCwgdHJpICogZ2VfcmlnaHQpOwotICBWRVJJRllfSVNfQVBQUk9YKCBnZV9zeC5ub2FsaWFzKCkgPSBnZV9sZWZ0ICogbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCksIGdlX2xlZnQgKiB0cmkpOworICBWRVJJRllfSVNfQVBQUk9YKGdlX3hzID0gbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkgKiBnZV9yaWdodCwgdHJpICogZ2VfcmlnaHQpOworICBWRVJJRllfSVNfQVBQUk9YKGdlX3N4ID0gZ2VfbGVmdCAqIG1hdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpLCBnZV9sZWZ0ICogdHJpKTsKIAotICBpZigoTW9kZSZVbml0RGlhZyk9PTApCi0gICAgVkVSSUZZX0lTX0FQUFJPWCggZ2VfeHMubm9hbGlhcygpID0gKHMxKm1hdC5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkgKiAoczIqZ2VfbGVmdC50cmFuc3Bvc2UoKSksIHMxKnRyaVRyLmNvbmp1Z2F0ZSgpICogKHMyKmdlX2xlZnQudHJhbnNwb3NlKCkpKTsKLSAgCi0gIFZFUklGWV9JU19BUFBST1goIGdlX3hzLm5vYWxpYXMoKSA9IChzMSptYXQudHJhbnNwb3NlKCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkgKiAoczIqZ2VfbGVmdC50cmFuc3Bvc2UoKSksIHMxdHJpVHIgKiAoczIqZ2VfbGVmdC50cmFuc3Bvc2UoKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKCBnZV9zeC5ub2FsaWFzKCkgPSAoczIqZ2VfbGVmdCkgKiAoczEqbWF0KS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpLCAoczIqZ2VfbGVmdCkqczF0cmkpOworICBWRVJJRllfSVNfQVBQUk9YKGdlX3hzLm5vYWxpYXMoKSA9IG1hdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpICogZ2VfcmlnaHQsIHRyaSAqIGdlX3JpZ2h0KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChnZV9zeC5ub2FsaWFzKCkgPSBnZV9sZWZ0ICogbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCksIGdlX2xlZnQgKiB0cmkpOwogCi0gIFZFUklGWV9JU19BUFBST1goIGdlX3N4Lm5vYWxpYXMoKSA9IGdlX3JpZ2h0LnRyYW5zcG9zZSgpICogbWF0LmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpLCBnZV9yaWdodC50cmFuc3Bvc2UoKSAqIHRyaVRyLmNvbmp1Z2F0ZSgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggZ2Vfc3gubm9hbGlhcygpID0gZ2VfcmlnaHQuYWRqb2ludCgpICogbWF0LmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpLCBnZV9yaWdodC5hZGpvaW50KCkgKiB0cmlUci5jb25qdWdhdGUoKSk7Ci0gIAorICBpZiAoKE1vZGUgJiBVbml0RGlhZykgPT0gMCkKKyAgICBWRVJJRllfSVNfQVBQUk9YKAorICAgICAgICBnZV94cy5ub2FsaWFzKCkgPSAoczEgKiBtYXQuYWRqb2ludCgpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpICogKHMyICogZ2VfbGVmdC50cmFuc3Bvc2UoKSksCisgICAgICAgIHMxICogdHJpVHIuY29uanVnYXRlKCkgKiAoczIgKiBnZV9sZWZ0LnRyYW5zcG9zZSgpKSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWCgKKyAgICAgIGdlX3hzLm5vYWxpYXMoKSA9IChzMSAqIG1hdC50cmFuc3Bvc2UoKSkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSAqIChzMiAqIGdlX2xlZnQudHJhbnNwb3NlKCkpLAorICAgICAgczF0cmlUciAqIChzMiAqIGdlX2xlZnQudHJhbnNwb3NlKCkpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChnZV9zeC5ub2FsaWFzKCkgPSAoczIgKiBnZV9sZWZ0KSAqIChzMSAqIG1hdCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSwKKyAgICAgICAgICAgICAgICAgICAoczIgKiBnZV9sZWZ0KSAqIHMxdHJpKTsKKworICBWRVJJRllfSVNfQVBQUk9YKGdlX3N4Lm5vYWxpYXMoKSA9IGdlX3JpZ2h0LnRyYW5zcG9zZSgpICogbWF0LmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpLAorICAgICAgICAgICAgICAgICAgIGdlX3JpZ2h0LnRyYW5zcG9zZSgpICogdHJpVHIuY29uanVnYXRlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKGdlX3N4Lm5vYWxpYXMoKSA9IGdlX3JpZ2h0LmFkam9pbnQoKSAqIG1hdC5hZGpvaW50KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSwKKyAgICAgICAgICAgICAgICAgICBnZV9yaWdodC5hZGpvaW50KCkgKiB0cmlUci5jb25qdWdhdGUoKSk7CisKICAgZ2VfeHNfc2F2ZSA9IGdlX3hzOwotICBpZigoTW9kZSZVbml0RGlhZyk9PTApCi0gICAgVkVSSUZZX0lTX0FQUFJPWCggKGdlX3hzX3NhdmUgKyBzMSp0cmlUci5jb25qdWdhdGUoKSAqIChzMipnZV9sZWZ0LmFkam9pbnQoKSkpLmV2YWwoKSwgZ2VfeHMubm9hbGlhcygpICs9IChzMSptYXQuYWRqb2ludCgpKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpICogKHMyKmdlX2xlZnQuYWRqb2ludCgpKSApOworICBpZiAoKE1vZGUgJiBVbml0RGlhZykgPT0gMCkKKyAgICBWRVJJRllfSVNfQVBQUk9YKAorICAgICAgICAoZ2VfeHNfc2F2ZSArIHMxICogdHJpVHIuY29uanVnYXRlKCkgKiAoczIgKiBnZV9sZWZ0LmFkam9pbnQoKSkpLmV2YWwoKSwKKyAgICAgICAgZ2VfeHMubm9hbGlhcygpICs9IChzMSAqIG1hdC5hZGpvaW50KCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkgKiAoczIgKiBnZV9sZWZ0LmFkam9pbnQoKSkpOwogICBnZV94c19zYXZlID0gZ2VfeHM7Ci0gIFZFUklGWV9JU19BUFBST1goIChnZV94c19zYXZlICsgczF0cmlUciAqIChzMipnZV9sZWZ0LmFkam9pbnQoKSkpLmV2YWwoKSwgZ2VfeHMubm9hbGlhcygpICs9IChzMSptYXQudHJhbnNwb3NlKCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkgKiAoczIqZ2VfbGVmdC5hZGpvaW50KCkpICk7CisgIFZFUklGWV9JU19BUFBST1goCisgICAgICAoZ2VfeHNfc2F2ZSArIHMxdHJpVHIgKiAoczIgKiBnZV9sZWZ0LmFkam9pbnQoKSkpLmV2YWwoKSwKKyAgICAgIGdlX3hzLm5vYWxpYXMoKSArPSAoczEgKiBtYXQudHJhbnNwb3NlKCkpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkgKiAoczIgKiBnZV9sZWZ0LmFkam9pbnQoKSkpOwogICBnZV9zeC5zZXRSYW5kb20oKTsKICAgZ2Vfc3hfc2F2ZSA9IGdlX3N4OwotICBpZigoTW9kZSZVbml0RGlhZyk9PTApCi0gICAgVkVSSUZZX0lTX0FQUFJPWCggZ2Vfc3hfc2F2ZSAtIChnZV9yaWdodC5hZGpvaW50KCkgKiAoLXMxICogdHJpVHIpLmNvbmp1Z2F0ZSgpKS5ldmFsKCksIGdlX3N4Lm5vYWxpYXMoKSAtPSAoZ2VfcmlnaHQuYWRqb2ludCgpICogKC1zMSAqIG1hdCkuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkpLmV2YWwoKSk7Ci0gIAotICBpZigoTW9kZSZVbml0RGlhZyk9PTApCi0gICAgVkVSSUZZX0lTX0FQUFJPWCggZ2VfeHMgPSAoczEqbWF0KS5hZGpvaW50KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSAqIGdlX2xlZnQuYWRqb2ludCgpLCBudW1leHQ6OmNvbmooczEpICogdHJpVHIuY29uanVnYXRlKCkgKiBnZV9sZWZ0LmFkam9pbnQoKSk7Ci0gIFZFUklGWV9JU19BUFBST1goIGdlX3hzID0gKHMxKm1hdCkudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSAqIGdlX2xlZnQuYWRqb2ludCgpLCBzMXRyaVRyICogZ2VfbGVmdC5hZGpvaW50KCkpOworICBpZiAoKE1vZGUgJiBVbml0RGlhZykgPT0gMCkKKyAgICBWRVJJRllfSVNfQVBQUk9YKAorICAgICAgICBnZV9zeF9zYXZlIC0gKGdlX3JpZ2h0LmFkam9pbnQoKSAqICgtczEgKiB0cmlUcikuY29uanVnYXRlKCkpLmV2YWwoKSwKKyAgICAgICAgZ2Vfc3gubm9hbGlhcygpIC09IChnZV9yaWdodC5hZGpvaW50KCkgKiAoLXMxICogbWF0KS5hZGpvaW50KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSkuZXZhbCgpKTsKKworICBpZiAoKE1vZGUgJiBVbml0RGlhZykgPT0gMCkKKyAgICBWRVJJRllfSVNfQVBQUk9YKGdlX3hzID0gKHMxICogbWF0KS5hZGpvaW50KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSAqIGdlX2xlZnQuYWRqb2ludCgpLAorICAgICAgICAgICAgICAgICAgICAgbnVtZXh0Ojpjb25qKHMxKSAqIHRyaVRyLmNvbmp1Z2F0ZSgpICogZ2VfbGVmdC5hZGpvaW50KCkpOworICBWRVJJRllfSVNfQVBQUk9YKGdlX3hzID0gKHMxICogbWF0KS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpICogZ2VfbGVmdC5hZGpvaW50KCksCisgICAgICAgICAgICAgICAgICAgczF0cmlUciAqIGdlX2xlZnQuYWRqb2ludCgpKTsKIAogICAvLyBUT0RPIGNoZWNrIHdpdGggc3ViLW1hdHJpeCBleHByZXNzaW9ucyA/CiAKICAgLy8gZGVzdGluYXRpb24gd2l0aCBhIG5vbi1kZWZhdWx0IGlubmVyLXN0cmlkZQogICAvLyBzZWUgYnVnIDE3NDEKICAgewotICAgIFZFUklGWV9JU19BUFBST1goIGdlX3hzLm5vYWxpYXMoKSA9IG1hdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpICogZ2VfcmlnaHQsIHRyaSAqIGdlX3JpZ2h0KTsKLSAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBNYXRyaXhYOwotICAgIE1hdHJpeFggYnVmZmVyKDIqZ2VfeHMucm93cygpLDIqZ2VfeHMuY29scygpKTsKLSAgICBNYXA8UmVzWFMsMCxTdHJpZGU8RHluYW1pYywyPiA+IG1hcDEoYnVmZmVyLmRhdGEoKSxnZV94cy5yb3dzKCksZ2VfeHMuY29scygpLFN0cmlkZTxEeW5hbWljLDI+KDIqZ2VfeHMub3V0ZXJTdHJpZGUoKSwyKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChnZV94cy5ub2FsaWFzKCkgPSBtYXQudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TW9kZT4oKSAqIGdlX3JpZ2h0LCB0cmkgKiBnZV9yaWdodCk7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBNYXRyaXhYOworICAgIE1hdHJpeFggYnVmZmVyKDIgKiBnZV94cy5yb3dzKCksIDIgKiBnZV94cy5jb2xzKCkpOworICAgIE1hcDxSZXNYUywgMCwgU3RyaWRlPER5bmFtaWMsIDI+ID4gbWFwMShidWZmZXIuZGF0YSgpLCBnZV94cy5yb3dzKCksIGdlX3hzLmNvbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaWRlPER5bmFtaWMsIDI+KDIgKiBnZV94cy5vdXRlclN0cmlkZSgpLCAyKSk7CiAgICAgYnVmZmVyLnNldFplcm8oKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCBtYXAxLm5vYWxpYXMoKSA9IG1hdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxNb2RlPigpICogZ2VfcmlnaHQsIHRyaSAqIGdlX3JpZ2h0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1hcDEubm9hbGlhcygpID0gbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PE1vZGU+KCkgKiBnZV9yaWdodCwgdHJpICogZ2VfcmlnaHQpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IE1vZGUsIGludCBUcmlPcmRlcj4KLXZvaWQgdHJtdihpbnQgcm93cz1nZXRfcmFuZG9tX3NpemU8U2NhbGFyPigpLCBpbnQgY29scz1nZXRfcmFuZG9tX3NpemU8U2NhbGFyPigpKQotewotICB0cm1tPFNjYWxhcixNb2RlLFRyaU9yZGVyLENvbE1ham9yLENvbE1ham9yLDE+KHJvd3MsY29scywxKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBNb2RlLCBpbnQgVHJpT3JkZXI+Cit2b2lkIHRybXYoaW50IHJvd3MgPSBnZXRfcmFuZG9tX3NpemU8U2NhbGFyPigpLCBpbnQgY29scyA9IGdldF9yYW5kb21fc2l6ZTxTY2FsYXI+KCkpIHsKKyAgdHJtbTxTY2FsYXIsIE1vZGUsIFRyaU9yZGVyLCBDb2xNYWpvciwgQ29sTWFqb3IsIDE+KHJvd3MsIGNvbHMsIDEpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBNb2RlLCBpbnQgVHJpT3JkZXIsIGludCBPdGhlck9yZGVyLCBpbnQgUmVzT3JkZXI+Ci12b2lkIHRybW0oaW50IHJvd3M9Z2V0X3JhbmRvbV9zaXplPFNjYWxhcj4oKSwgaW50IGNvbHM9Z2V0X3JhbmRvbV9zaXplPFNjYWxhcj4oKSwgaW50IG90aGVyQ29scyA9IGdldF9yYW5kb21fc2l6ZTxTY2FsYXI+KCkpCi17Ci0gIHRybW08U2NhbGFyLE1vZGUsVHJpT3JkZXIsT3RoZXJPcmRlcixSZXNPcmRlcixEeW5hbWljPihyb3dzLGNvbHMsb3RoZXJDb2xzKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBNb2RlLCBpbnQgVHJpT3JkZXIsIGludCBPdGhlck9yZGVyLCBpbnQgUmVzT3JkZXI+Cit2b2lkIHRybW0oaW50IHJvd3MgPSBnZXRfcmFuZG9tX3NpemU8U2NhbGFyPigpLCBpbnQgY29scyA9IGdldF9yYW5kb21fc2l6ZTxTY2FsYXI+KCksCisgICAgICAgICAgaW50IG90aGVyQ29scyA9IGdldF9yYW5kb21fc2l6ZTxTY2FsYXI+KCkpIHsKKyAgdHJtbTxTY2FsYXIsIE1vZGUsIFRyaU9yZGVyLCBPdGhlck9yZGVyLCBSZXNPcmRlciwgRHluYW1pYz4ocm93cywgY29scywgb3RoZXJDb2xzKTsKIH0KIAotI2RlZmluZSBDQUxMX0FMTF9PUkRFUlMoTkIsU0NBTEFSLE1PREUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvcixDb2xNYWpvcixDb2xNYWpvcj4oKSkpOyAgXAotICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvcixDb2xNYWpvcixSb3dNYWpvcj4oKSkpOyAgXAotICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvcixSb3dNYWpvcixDb2xNYWpvcj4oKSkpOyAgXAotICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvcixSb3dNYWpvcixSb3dNYWpvcj4oKSkpOyAgXAotICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvcixDb2xNYWpvcixDb2xNYWpvcj4oKSkpOyAgXAotICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvcixDb2xNYWpvcixSb3dNYWpvcj4oKSkpOyAgXAotICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvcixSb3dNYWpvcixDb2xNYWpvcj4oKSkpOyAgXAotICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXyxOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvcixSb3dNYWpvcixSb3dNYWpvcj4oKSkpOyAgXAotICBcCi0gIEVJR0VOX0NBVChDQUxMX1NVQlRFU1RfMSxOQikoKHRybXY8U0NBTEFSLCBNT0RFLCBDb2xNYWpvcj4oKSkpOyAgICAgICAgICAgICAgICAgICBcCi0gIEVJR0VOX0NBVChDQUxMX1NVQlRFU1RfMSxOQikoKHRybXY8U0NBTEFSLCBNT0RFLCBSb3dNYWpvcj4oKSkpOworI2RlZmluZSBDQUxMX0FMTF9PUkRFUlMoTkIsIFNDQUxBUiwgTU9ERSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVJR0VOX0NBVChDQUxMX1NVQlRFU1RfLCBOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvciwgQ29sTWFqb3IsIENvbE1ham9yPigpKSk7IFwKKyAgRUlHRU5fQ0FUKENBTExfU1VCVEVTVF8sIE5CKSgodHJtbTxTQ0FMQVIsIE1PREUsIENvbE1ham9yLCBDb2xNYWpvciwgUm93TWFqb3I+KCkpKTsgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXywgTkIpKCh0cm1tPFNDQUxBUiwgTU9ERSwgQ29sTWFqb3IsIFJvd01ham9yLCBDb2xNYWpvcj4oKSkpOyBcCisgIEVJR0VOX0NBVChDQUxMX1NVQlRFU1RfLCBOQikoKHRybW08U0NBTEFSLCBNT0RFLCBDb2xNYWpvciwgUm93TWFqb3IsIFJvd01ham9yPigpKSk7IFwKKyAgRUlHRU5fQ0FUKENBTExfU1VCVEVTVF8sIE5CKSgodHJtbTxTQ0FMQVIsIE1PREUsIFJvd01ham9yLCBDb2xNYWpvciwgQ29sTWFqb3I+KCkpKTsgXAorICBFSUdFTl9DQVQoQ0FMTF9TVUJURVNUXywgTkIpKCh0cm1tPFNDQUxBUiwgTU9ERSwgUm93TWFqb3IsIENvbE1ham9yLCBSb3dNYWpvcj4oKSkpOyBcCisgIEVJR0VOX0NBVChDQUxMX1NVQlRFU1RfLCBOQikoKHRybW08U0NBTEFSLCBNT0RFLCBSb3dNYWpvciwgUm93TWFqb3IsIENvbE1ham9yPigpKSk7IFwKKyAgRUlHRU5fQ0FUKENBTExfU1VCVEVTVF8sIE5CKSgodHJtbTxTQ0FMQVIsIE1PREUsIFJvd01ham9yLCBSb3dNYWpvciwgUm93TWFqb3I+KCkpKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVJR0VOX0NBVChDQUxMX1NVQlRFU1RfMSwgTkIpKCh0cm12PFNDQUxBUiwgTU9ERSwgQ29sTWFqb3I+KCkpKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgRUlHRU5fQ0FUKENBTExfU1VCVEVTVF8xLCBOQikoKHRybXY8U0NBTEFSLCBNT0RFLCBSb3dNYWpvcj4oKSkpOwogCi0gIAotI2RlZmluZSBDQUxMX0FMTChOQixTQ0FMQVIpICAgICAgICAgICAgICAgICBcCi0gIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMSxOQiksU0NBTEFSLFVwcGVyKSAgICAgICAgICBcCi0gIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMixOQiksU0NBTEFSLFVuaXRVcHBlcikgICAgICBcCi0gIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMyxOQiksU0NBTEFSLFN0cmljdGx5VXBwZXIpICBcCi0gIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMSxOQiksU0NBTEFSLExvd2VyKSAgICAgICAgICBcCi0gIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMixOQiksU0NBTEFSLFVuaXRMb3dlcikgICAgICBcCi0gIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMyxOQiksU0NBTEFSLFN0cmljdGx5TG93ZXIpCi0gIAorI2RlZmluZSBDQUxMX0FMTChOQiwgU0NBTEFSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMSwgTkIpLCBTQ0FMQVIsIFVwcGVyKSAgICAgICAgIFwKKyAgQ0FMTF9BTExfT1JERVJTKEVJR0VOX0NBVCgyLCBOQiksIFNDQUxBUiwgVW5pdFVwcGVyKSAgICAgXAorICBDQUxMX0FMTF9PUkRFUlMoRUlHRU5fQ0FUKDMsIE5CKSwgU0NBTEFSLCBTdHJpY3RseVVwcGVyKSBcCisgIENBTExfQUxMX09SREVSUyhFSUdFTl9DQVQoMSwgTkIpLCBTQ0FMQVIsIExvd2VyKSAgICAgICAgIFwKKyAgQ0FMTF9BTExfT1JERVJTKEVJR0VOX0NBVCgyLCBOQiksIFNDQUxBUiwgVW5pdExvd2VyKSAgICAgXAorICBDQUxMX0FMTF9PUkRFUlMoRUlHRU5fQ0FUKDMsIE5CKSwgU0NBTEFSLCBTdHJpY3RseUxvd2VyKQogCi1FSUdFTl9ERUNMQVJFX1RFU1QocHJvZHVjdF90cm1tKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQgOyBpKyspCi0gIHsKLSAgICBDQUxMX0FMTCgxLGZsb2F0KTsgICAgICAgICAgICAgICAgLy8gIEVJR0VOX1NVRkZJWEVTOzExOzExMTsyMTsxMjE7MzE7MTMxCi0gICAgQ0FMTF9BTEwoMixkb3VibGUpOyAgICAgICAgICAgICAgIC8vICBFSUdFTl9TVUZGSVhFUzsxMjsxMTI7MjI7MTIyOzMyOzEzMgotICAgIENBTExfQUxMKDMsc3RkOjpjb21wbGV4PGZsb2F0Pik7ICAvLyAgRUlHRU5fU1VGRklYRVM7MTM7MTEzOzIzOzEyMzszMzsxMzMKLSAgICBDQUxMX0FMTCg0LHN0ZDo6Y29tcGxleDxkb3VibGU+KTsgLy8gIEVJR0VOX1NVRkZJWEVTOzE0OzExNDsyNDsxMjQ7MzQ7MTM0CitFSUdFTl9ERUNMQVJFX1RFU1QocHJvZHVjdF90cm1tKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfQUxMKDEsIGZsb2F0KTsgICAgICAgICAgICAgICAgIC8vICBFSUdFTl9TVUZGSVhFUzsxMTsxMTE7MjE7MTIxOzMxOzEzMQorICAgIENBTExfQUxMKDIsIGRvdWJsZSk7ICAgICAgICAgICAgICAgIC8vICBFSUdFTl9TVUZGSVhFUzsxMjsxMTI7MjI7MTIyOzMyOzEzMgorICAgIENBTExfQUxMKDMsIHN0ZDo6Y29tcGxleDxmbG9hdD4pOyAgIC8vICBFSUdFTl9TVUZGSVhFUzsxMzsxMTM7MjM7MTIzOzMzOzEzMworICAgIENBTExfQUxMKDQsIHN0ZDo6Y29tcGxleDxkb3VibGU+KTsgIC8vICBFSUdFTl9TVUZGSVhFUzsxNDsxMTQ7MjQ7MTI0OzM0OzEzNAogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3Byb2R1Y3RfdHJtdi5jcHAgYi90ZXN0L3Byb2R1Y3RfdHJtdi5jcHAKaW5kZXggNWViMWI1YS4uNDQ3MjQzZiAxMDA2NDQKLS0tIGEvdGVzdC9wcm9kdWN0X3RybXYuY3BwCisrKyBiL3Rlc3QvcHJvZHVjdF90cm12LmNwcApAQCAtOSwxOSArOSwxOCBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHRybXYoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0cm12KGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIDE+IFZlY3RvclR5cGU7CiAKLSAgUmVhbFNjYWxhciBsYXJnZXJFcHMgPSAxMCp0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpOworICBSZWFsU2NhbGFyIGxhcmdlckVwcyA9IDEwICogdGVzdF9wcmVjaXNpb248UmVhbFNjYWxhcj4oKTsKIAogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKIAotICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpOworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKTsKICAgVmVjdG9yVHlwZSB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKIAogICBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKQEAgLTQwLDkgKzM5LDExIEBACiAKICAgLy8gY2hlY2sgY29uanVnYXRlZCBhbmQgc2NhbGFyIG11bHRpcGxlIGV4cHJlc3Npb25zIChjb2wtbWFqb3IpCiAgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpOwotICBWRVJJRlkoKChzMSptMykuY29uanVnYXRlKCkgKiB2MSkuaXNBcHByb3goKHMxKm0xKS5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkgKiB2MSwgbGFyZ2VyRXBzKSk7CisgIFZFUklGWSgoKHMxICogbTMpLmNvbmp1Z2F0ZSgpICogdjEpCisgICAgICAgICAgICAgLmlzQXBwcm94KChzMSAqIG0xKS5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkgKiB2MSwgbGFyZ2VyRXBzKSk7CiAgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46OlVwcGVyPigpOwotICBWRVJJRlkoKG0zLmNvbmp1Z2F0ZSgpICogdjEuY29uanVnYXRlKCkpLmlzQXBwcm94KG0xLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVcHBlcj4oKSAqIHYxLmNvbmp1Z2F0ZSgpLCBsYXJnZXJFcHMpKTsKKyAgVkVSSUZZKChtMy5jb25qdWdhdGUoKSAqIHYxLmNvbmp1Z2F0ZSgpKQorICAgICAgICAgICAgIC5pc0FwcHJveChtMS5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkgKiB2MS5jb25qdWdhdGUoKSwgbGFyZ2VyRXBzKSk7CiAKICAgLy8gY2hlY2sgd2l0aCBhIHJvdy1tYWpvciBtYXRyaXgKICAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCk7CkBAIC01OCwzMyArNTksMzQgQEAKICAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCk7CiAgIFZFUklGWSgobTMuYWRqb2ludCgpICogdjEpLmlzQXBwcm94KG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkgKiB2MSwgbGFyZ2VyRXBzKSk7CiAgIG0zID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpOwotICBWRVJJRlkoKG0zLmFkam9pbnQoKSAqIChzMSp2MS5jb25qdWdhdGUoKSkpLmlzQXBwcm94KG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkgKiAoczEqdjEuY29uanVnYXRlKCkpLCBsYXJnZXJFcHMpKTsKKyAgVkVSSUZZKChtMy5hZGpvaW50KCkgKiAoczEgKiB2MS5jb25qdWdhdGUoKSkpCisgICAgICAgICAgICAgLmlzQXBwcm94KG0xLmFkam9pbnQoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkgKiAoczEgKiB2MS5jb25qdWdhdGUoKSksIGxhcmdlckVwcykpOwogICBtMyA9IG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVbml0VXBwZXI+KCk7CiAKICAgLy8gY2hlY2sgdHJhbnNwb3NlZCBjYXNlczoKICAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCk7CiAgIFZFUklGWSgodjEudHJhbnNwb3NlKCkgKiBtMykuaXNBcHByb3godjEudHJhbnNwb3NlKCkgKiBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCksIGxhcmdlckVwcykpOwogICBWRVJJRlkoKHYxLmFkam9pbnQoKSAqIG0zKS5pc0FwcHJveCh2MS5hZGpvaW50KCkgKiBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCksIGxhcmdlckVwcykpOwotICBWRVJJRlkoKHYxLmFkam9pbnQoKSAqIG0zLmFkam9pbnQoKSkuaXNBcHByb3godjEuYWRqb2ludCgpICogbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpLmFkam9pbnQoKSwgbGFyZ2VyRXBzKSk7CisgIFZFUklGWSgodjEuYWRqb2ludCgpICogbTMuYWRqb2ludCgpKQorICAgICAgICAgICAgIC5pc0FwcHJveCh2MS5hZGpvaW50KCkgKiBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkuYWRqb2ludCgpLCBsYXJnZXJFcHMpKTsKIAogICAvLyBUT0RPIGNoZWNrIHdpdGggc3ViLW1hdHJpY2VzCiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChwcm9kdWN0X3RybXYpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QocHJvZHVjdF90cm12KSB7CiAgIGludCBzID0gMDsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIHRybXYoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCB0cm12KE1hdHJpeDxmbG9hdCwgMiwgMj4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggdHJtdihNYXRyaXgzZCgpKSApOwotICAgIAotICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzIpOwotICAgIENBTExfU1VCVEVTVF80KCB0cm12KE1hdHJpeFhjZihzLHMpKSApOwotICAgIENBTExfU1VCVEVTVF81KCB0cm12KE1hdHJpeFhjZChzLHMpKSApOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSh0cm12KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKHRybXYoTWF0cml4PGZsb2F0LCAyLCAyPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzModHJtdihNYXRyaXgzZCgpKSk7CisKKyAgICBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKTsKKyAgICBDQUxMX1NVQlRFU1RfNCh0cm12KE1hdHJpeFhjZihzLCBzKSkpOworICAgIENBTExfU1VCVEVTVF81KHRybXYoTWF0cml4WGNkKHMsIHMpKSk7CiAgICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQotICAgIAotICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggdHJtdihNYXRyaXg8ZmxvYXQsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPihzLCBzKSkgKTsKKworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgICAgQ0FMTF9TVUJURVNUXzYodHJtdihNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPihzLCBzKSkpOwogICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9wcm9kdWN0X3Ryc29sdmUuY3BwIGIvdGVzdC9wcm9kdWN0X3Ryc29sdmUuY3BwCmluZGV4IGM1OTc0OGMuLjAzM2FhODYgMTAwNjQ0Ci0tLSBhL3Rlc3QvcHJvZHVjdF90cnNvbHZlLmNwcAorKysgYi90ZXN0L3Byb2R1Y3RfdHJzb2x2ZS5jcHAKQEAgLTksMTE5ICs5LDEyOSBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi0jZGVmaW5lIFZFUklGWV9UUlNNKFRSSSxYQikgeyBcCi0gICAgKFhCKS5zZXRSYW5kb20oKTsgcmVmID0gKFhCKTsgXAotICAgIChUUkkpLnNvbHZlSW5QbGFjZShYQik7IFwKKyNkZWZpbmUgVkVSSUZZX1RSU00oVFJJLCBYQikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoWEIpLnNldFJhbmRvbSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWYgPSAoWEIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoVFJJKS5zb2x2ZUluUGxhY2UoWEIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBWRVJJRllfSVNfQVBQUk9YKChUUkkpLnRvRGVuc2VNYXRyaXgoKSAqIChYQiksIHJlZik7IFwKLSAgICAoWEIpLnNldFJhbmRvbSgpOyByZWYgPSAoWEIpOyBcCi0gICAgKFhCKSA9IChUUkkpLnNvbHZlKFhCKTsgXAorICAgIChYQikuc2V0UmFuZG9tKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlZiA9IChYQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChYQikgPSAoVFJJKS5zb2x2ZShYQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIFZFUklGWV9JU19BUFBST1goKFRSSSkudG9EZW5zZU1hdHJpeCgpICogKFhCKSwgcmVmKTsgXAogICB9CiAKLSNkZWZpbmUgVkVSSUZZX1RSU01fT05USEVSSUdIVChUUkksWEIpIHsgXAotICAgIChYQikuc2V0UmFuZG9tKCk7IHJlZiA9IChYQik7IFwKLSAgICAoVFJJKS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSBzb2x2ZUluUGxhY2U8T25UaGVSaWdodD4oWEIudHJhbnNwb3NlKCkpOyBcCisjZGVmaW5lIFZFUklGWV9UUlNNX09OVEhFUklHSFQoVFJJLCBYQikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKFhCKS5zZXRSYW5kb20oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVmID0gKFhCKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKFRSSSkudHJhbnNwb3NlKCkudGVtcGxhdGUgc29sdmVJblBsYWNlPE9uVGhlUmlnaHQ+KFhCLnRyYW5zcG9zZSgpKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVkVSSUZZX0lTX0FQUFJPWCgoWEIpLnRyYW5zcG9zZSgpICogKFRSSSkudHJhbnNwb3NlKCkudG9EZW5zZU1hdHJpeCgpLCByZWYudHJhbnNwb3NlKCkpOyBcCi0gICAgKFhCKS5zZXRSYW5kb20oKTsgcmVmID0gKFhCKTsgXAotICAgIChYQikudHJhbnNwb3NlKCkgPSAoVFJJKS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSBzb2x2ZTxPblRoZVJpZ2h0PihYQi50cmFuc3Bvc2UoKSk7IFwKKyAgICAoWEIpLnNldFJhbmRvbSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWYgPSAoWEIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoWEIpLnRyYW5zcG9zZSgpID0gKFRSSSkudHJhbnNwb3NlKCkudGVtcGxhdGUgc29sdmU8T25UaGVSaWdodD4oWEIudHJhbnNwb3NlKCkpOyAgICAgICAgIFwKICAgICBWRVJJRllfSVNfQVBQUk9YKChYQikudHJhbnNwb3NlKCkgKiAoVFJJKS50cmFuc3Bvc2UoKS50b0RlbnNlTWF0cml4KCksIHJlZi50cmFuc3Bvc2UoKSk7IFwKICAgfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IFNpemUsIGludCBDb2xzPiB2b2lkIHRyc29sdmUoaW50IHNpemU9U2l6ZSxpbnQgY29scz1Db2xzKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IFNpemUsIGludCBDb2xzPgordm9pZCB0cnNvbHZlKGludCBzaXplID0gU2l6ZSwgaW50IGNvbHMgPSBDb2xzKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKIAotICBNYXRyaXg8U2NhbGFyLFNpemUsU2l6ZSxDb2xNYWpvcj4gY21MaHMoc2l6ZSxzaXplKTsKLSAgTWF0cml4PFNjYWxhcixTaXplLFNpemUsUm93TWFqb3I+IHJtTGhzKHNpemUsc2l6ZSk7CisgIE1hdHJpeDxTY2FsYXIsIFNpemUsIFNpemUsIENvbE1ham9yPiBjbUxocyhzaXplLCBzaXplKTsKKyAgTWF0cml4PFNjYWxhciwgU2l6ZSwgU2l6ZSwgUm93TWFqb3I+IHJtTGhzKHNpemUsIHNpemUpOwogCi0gIGVudW0geyAgY29sbWFqb3IgPSBTaXplPT0xID8gUm93TWFqb3IgOiBDb2xNYWpvciwKLSAgICAgICAgICByb3dtYWpvciA9IENvbHM9PTEgPyBDb2xNYWpvciA6IFJvd01ham9yIH07Ci0gIE1hdHJpeDxTY2FsYXIsU2l6ZSxDb2xzLGNvbG1ham9yPiBjbVJocyhzaXplLGNvbHMpOwotICBNYXRyaXg8U2NhbGFyLFNpemUsQ29scyxyb3dtYWpvcj4gcm1SaHMoc2l6ZSxjb2xzKTsKLSAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsY29sbWFqb3I+IHJlZihzaXplLGNvbHMpOworICBlbnVtIHsgY29sbWFqb3IgPSBTaXplID09IDEgPyBSb3dNYWpvciA6IENvbE1ham9yLCByb3dtYWpvciA9IENvbHMgPT0gMSA/IENvbE1ham9yIDogUm93TWFqb3IgfTsKKyAgTWF0cml4PFNjYWxhciwgU2l6ZSwgQ29scywgY29sbWFqb3I+IGNtUmhzKHNpemUsIGNvbHMpOworICBNYXRyaXg8U2NhbGFyLCBTaXplLCBDb2xzLCByb3dtYWpvcj4gcm1SaHMoc2l6ZSwgY29scyk7CisgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIGNvbG1ham9yPiByZWYoc2l6ZSwgY29scyk7CiAKLSAgY21MaHMuc2V0UmFuZG9tKCk7IGNtTGhzICo9IHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KDAuMSk7IGNtTGhzLmRpYWdvbmFsKCkuYXJyYXkoKSArPSBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigxKTsKLSAgcm1MaHMuc2V0UmFuZG9tKCk7IHJtTGhzICo9IHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KDAuMSk7IHJtTGhzLmRpYWdvbmFsKCkuYXJyYXkoKSArPSBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigxKTsKKyAgY21MaHMuc2V0UmFuZG9tKCk7CisgIGNtTGhzICo9IHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KDAuMSk7CisgIGNtTGhzLmRpYWdvbmFsKCkuYXJyYXkoKSArPSBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigxKTsKKyAgcm1MaHMuc2V0UmFuZG9tKCk7CisgIHJtTGhzICo9IHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KDAuMSk7CisgIHJtTGhzLmRpYWdvbmFsKCkuYXJyYXkoKSArPSBzdGF0aWNfY2FzdDxSZWFsU2NhbGFyPigxKTsKIAogICBWRVJJRllfVFJTTShjbUxocy5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgY21SaHMpOwotICBWRVJJRllfVFJTTShjbUxocy5hZGpvaW50KCkgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgY21SaHMpOwotICBWRVJJRllfVFJTTShjbUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgY21SaHMpOwotICBWRVJJRllfVFJTTShjbUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgcm1SaHMpOworICBWRVJJRllfVFJTTShjbUxocy5hZGpvaW50KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIGNtUmhzKTsKKyAgVkVSSUZZX1RSU00oY21MaHMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIGNtUmhzKTsKKyAgVkVSSUZZX1RSU00oY21MaHMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIHJtUmhzKTsKICAgVkVSSUZZX1RSU00oY21MaHMuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIHJtUmhzKTsKLSAgVkVSSUZZX1RSU00oY21MaHMuYWRqb2ludCgpICAudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIHJtUmhzKTsKKyAgVkVSSUZZX1RSU00oY21MaHMuYWRqb2ludCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCBybVJocyk7CiAKICAgVkVSSUZZX1RSU00oY21MaHMuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VW5pdExvd2VyPigpLCBjbVJocyk7Ci0gIFZFUklGWV9UUlNNKGNtTGhzICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVuaXRVcHBlcj4oKSwgcm1SaHMpOworICBWRVJJRllfVFJTTShjbUxocy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCksIHJtUmhzKTsKIAotICBWRVJJRllfVFJTTShybUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgY21SaHMpOworICBWRVJJRllfVFJTTShybUxocy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgY21SaHMpOwogICBWRVJJRllfVFJTTShybUxocy5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCksIHJtUmhzKTsKIAotCiAgIFZFUklGWV9UUlNNX09OVEhFUklHSFQoY21MaHMuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIGNtUmhzKTsKLSAgVkVSSUZZX1RSU01fT05USEVSSUdIVChjbUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSwgY21SaHMpOwotICBWRVJJRllfVFJTTV9PTlRIRVJJR0hUKGNtTGhzICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCBybVJocyk7CisgIFZFUklGWV9UUlNNX09OVEhFUklHSFQoY21MaHMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIGNtUmhzKTsKKyAgVkVSSUZZX1RSU01fT05USEVSSUdIVChjbUxocy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgcm1SaHMpOwogICBWRVJJRllfVFJTTV9PTlRIRVJJR0hUKGNtTGhzLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCBybVJocyk7CiAKICAgVkVSSUZZX1RSU01fT05USEVSSUdIVChjbUxocy5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCksIGNtUmhzKTsKLSAgVkVSSUZZX1RSU01fT05USEVSSUdIVChjbUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCksIHJtUmhzKTsKKyAgVkVSSUZZX1RSU01fT05USEVSSUdIVChjbUxocy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCksIHJtUmhzKTsKIAotICBWRVJJRllfVFJTTV9PTlRIRVJJR0hUKHJtTGhzICAgICAgICAgICAgLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCBjbVJocyk7CisgIFZFUklGWV9UUlNNX09OVEhFUklHSFQocm1MaHMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIGNtUmhzKTsKICAgVkVSSUZZX1RSU01fT05USEVSSUdIVChybUxocy5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCksIHJtUmhzKTsKIAotICBpbnQgYyA9IGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSk7CisgIGludCBjID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIGNvbHMgLSAxKTsKICAgVkVSSUZZX1RSU00ocm1MaHMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIHJtUmhzLmNvbChjKSk7CiAgIFZFUklGWV9UUlNNKGNtTGhzLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLCBybVJocy5jb2woYykpOwogCiAgIC8vIGRlc3RpbmF0aW9uIHdpdGggYSBub24tZGVmYXVsdCBpbm5lci1zdHJpZGUKICAgLy8gc2VlIGJ1ZyAxNzQxCiAgIHsKLSAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBNYXRyaXhYOwotICAgIE1hdHJpeFggYnVmZmVyKDIqY21SaHMucm93cygpLDIqY21SaHMuY29scygpKTsKLSAgICBNYXA8TWF0cml4PFNjYWxhcixTaXplLENvbHMsY29sbWFqb3I+LDAsU3RyaWRlPER5bmFtaWMsMj4gPiBtYXAxKGJ1ZmZlci5kYXRhKCksY21SaHMucm93cygpLGNtUmhzLmNvbHMoKSxTdHJpZGU8RHluYW1pYywyPigyKmNtUmhzLm91dGVyU3RyaWRlKCksMikpOwotICAgIE1hcDxNYXRyaXg8U2NhbGFyLFNpemUsQ29scyxyb3dtYWpvcj4sMCxTdHJpZGU8RHluYW1pYywyPiA+IG1hcDIoYnVmZmVyLmRhdGEoKSxybVJocy5yb3dzKCkscm1SaHMuY29scygpLFN0cmlkZTxEeW5hbWljLDI+KDIqcm1SaHMub3V0ZXJTdHJpZGUoKSwyKSk7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBNYXRyaXhYOworICAgIE1hdHJpeFggYnVmZmVyKDIgKiBjbVJocy5yb3dzKCksIDIgKiBjbVJocy5jb2xzKCkpOworICAgIE1hcDxNYXRyaXg8U2NhbGFyLCBTaXplLCBDb2xzLCBjb2xtYWpvcj4sIDAsIFN0cmlkZTxEeW5hbWljLCAyPiA+IG1hcDEoCisgICAgICAgIGJ1ZmZlci5kYXRhKCksIGNtUmhzLnJvd3MoKSwgY21SaHMuY29scygpLCBTdHJpZGU8RHluYW1pYywgMj4oMiAqIGNtUmhzLm91dGVyU3RyaWRlKCksIDIpKTsKKyAgICBNYXA8TWF0cml4PFNjYWxhciwgU2l6ZSwgQ29scywgcm93bWFqb3I+LCAwLCBTdHJpZGU8RHluYW1pYywgMj4gPiBtYXAyKAorICAgICAgICBidWZmZXIuZGF0YSgpLCBybVJocy5yb3dzKCksIHJtUmhzLmNvbHMoKSwgU3RyaWRlPER5bmFtaWMsIDI+KDIgKiBybVJocy5vdXRlclN0cmlkZSgpLCAyKSk7CiAgICAgYnVmZmVyLnNldFplcm8oKTsKICAgICBWRVJJRllfVFJTTShjbUxocy5jb25qdWdhdGUoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgbWFwMSk7CiAgICAgYnVmZmVyLnNldFplcm8oKTsKLSAgICBWRVJJRllfVFJTTShjbUxocyAgICAgICAgICAgIC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgbWFwMik7CisgICAgVkVSSUZZX1RSU00oY21MaHMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksIG1hcDIpOwogICB9CiAKLSAgaWYoU2l6ZT09RHluYW1pYykKLSAgewotICAgIGNtTGhzLnJlc2l6ZSgwLDApOwotICAgIGNtUmhzLnJlc2l6ZSgwLGNtUmhzLmNvbHMoKSk7Ci0gICAgTWF0cml4PFNjYWxhcixTaXplLENvbHMsY29sbWFqb3I+IHJlcyA9IGNtTGhzLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKGNtUmhzKTsKLSAgICBWRVJJRllfSVNfRVFVQUwocmVzLnJvd3MoKSwwKTsKLSAgICBWRVJJRllfSVNfRVFVQUwocmVzLmNvbHMoKSxjbVJocy5jb2xzKCkpOworICBpZiAoU2l6ZSA9PSBEeW5hbWljKSB7CisgICAgY21MaHMucmVzaXplKDAsIDApOworICAgIGNtUmhzLnJlc2l6ZSgwLCBjbVJocy5jb2xzKCkpOworICAgIE1hdHJpeDxTY2FsYXIsIFNpemUsIENvbHMsIGNvbG1ham9yPiByZXMgPSBjbUxocy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZShjbVJocyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHJlcy5yb3dzKCksIDApOworICAgIFZFUklGWV9JU19FUVVBTChyZXMuY29scygpLCBjbVJocy5jb2xzKCkpOwogICAgIHJlcyA9IGNtUmhzOwogICAgIGNtTGhzLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlSW5QbGFjZShyZXMpOwotICAgIFZFUklGWV9JU19FUVVBTChyZXMucm93cygpLDApOwotICAgIFZFUklGWV9JU19FUVVBTChyZXMuY29scygpLGNtUmhzLmNvbHMoKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHJlcy5yb3dzKCksIDApOworICAgIFZFUklGWV9JU19FUVVBTChyZXMuY29scygpLCBjbVJocy5jb2xzKCkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChwcm9kdWN0X3Ryc29sdmUpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdCA7IGkrKykKLSAgeworRUlHRU5fREVDTEFSRV9URVNUKHByb2R1Y3RfdHJzb2x2ZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKICAgICAvLyBtYXRyaWNlcwotICAgIENBTExfU1VCVEVTVF8xKCh0cnNvbHZlPGZsb2F0LER5bmFtaWMsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoKHRyc29sdmU8ZG91YmxlLER5bmFtaWMsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoKHRyc29sdmU8c3RkOjpjb21wbGV4PGZsb2F0PixEeW5hbWljLER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpKTsKLSAgICBDQUxMX1NVQlRFU1RfNCgodHJzb2x2ZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPixEeW5hbWljLER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgodHJzb2x2ZTxmbG9hdCwgRHluYW1pYywgRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKHRyc29sdmU8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKHRyc29sdmU8c3RkOjpjb21wbGV4PGZsb2F0PiwgRHluYW1pYywgRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDIpKSkpOworICAgIENBTExfU1VCVEVTVF80KCh0cnNvbHZlPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBEeW5hbWljLCBEeW5hbWljPigKKyAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyAyKSkpKTsKIAogICAgIC8vIHZlY3RvcnMKLSAgICBDQUxMX1NVQlRFU1RfNSgodHJzb2x2ZTxmbG9hdCxEeW5hbWljLDE+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwotICAgIENBTExfU1VCVEVTVF82KCh0cnNvbHZlPGRvdWJsZSxEeW5hbWljLDE+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwotICAgIENBTExfU1VCVEVTVF83KCh0cnNvbHZlPHN0ZDo6Y29tcGxleDxmbG9hdD4sRHluYW1pYywxPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKLSAgICBDQUxMX1NVQlRFU1RfOCgodHJzb2x2ZTxzdGQ6OmNvbXBsZXg8ZG91YmxlPixEeW5hbWljLDE+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwotICAgIAorICAgIENBTExfU1VCVEVTVF81KCh0cnNvbHZlPGZsb2F0LCBEeW5hbWljLCAxPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoKHRyc29sdmU8ZG91YmxlLCBEeW5hbWljLCAxPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcoKHRyc29sdmU8c3RkOjpjb21wbGV4PGZsb2F0PiwgRHluYW1pYywgMT4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICAgIENBTExfU1VCVEVTVF84KCh0cnNvbHZlPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBEeW5hbWljLCAxPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisKICAgICAvLyBtZXRhLXVucm9sbGVycwotICAgIENBTExfU1VCVEVTVF85KCh0cnNvbHZlPGZsb2F0LDQsMT4oKSkpOwotICAgIENBTExfU1VCVEVTVF8xMCgodHJzb2x2ZTxkb3VibGUsNCwxPigpKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzExKCh0cnNvbHZlPHN0ZDo6Y29tcGxleDxmbG9hdD4sNCwxPigpKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzEyKCh0cnNvbHZlPGZsb2F0LDEsMT4oKSkpOwotICAgIENBTExfU1VCVEVTVF8xMygodHJzb2x2ZTxmbG9hdCwxLDI+KCkpKTsKLSAgICBDQUxMX1NVQlRFU1RfMTQoKHRyc29sdmU8ZmxvYXQsMywxPigpKSk7Ci0gICAgCisgICAgQ0FMTF9TVUJURVNUXzkoKHRyc29sdmU8ZmxvYXQsIDQsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTAoKHRyc29sdmU8ZG91YmxlLCA0LCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzExKCh0cnNvbHZlPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDQsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTIoKHRyc29sdmU8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTMoKHRyc29sdmU8ZmxvYXQsIDEsIDI+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTQoKHRyc29sdmU8ZmxvYXQsIDMsIDE+KCkpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9xci5jcHAgYi90ZXN0L3FyLmNwcAppbmRleCAzNmYzMTIxLi5kZTQ3MGNhIDEwMDY0NAotLS0gYS90ZXN0L3FyLmNwcAorKysgYi90ZXN0L3FyLmNwcApAQCAtMTEsMTUgKzExLDE1IEBACiAjaW5jbHVkZSA8RWlnZW4vUVI+CiAjaW5jbHVkZSAic29sdmVyYmFzZS5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHFyKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcXIoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKIAogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBNYXRyaXhRVHlwZTsKIAotICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOwogICBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IHFyT2ZBKGEpOwogCiAgIE1hdHJpeFFUeXBlIHEgPSBxck9mQS5ob3VzZWhvbGRlclEoKTsKQEAgLTI5LDQyICsyOSw0MyBAQAogICBWRVJJRllfSVNfQVBQUk9YKGEsIHFyT2ZBLmhvdXNlaG9sZGVyUSgpICogcik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBDb2xzMj4gdm9pZCBxcl9maXhlZHNpemUoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBDb2xzMj4KK3ZvaWQgcXJfZml4ZWRzaXplKCkgewogICBlbnVtIHsgUm93cyA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBDb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgfTsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwotICBNYXRyaXg8U2NhbGFyLFJvd3MsQ29scz4gbTEgPSBNYXRyaXg8U2NhbGFyLFJvd3MsQ29scz46OlJhbmRvbSgpOwotICBIb3VzZWhvbGRlclFSPE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzPiA+IHFyKG0xKTsKKyAgTWF0cml4PFNjYWxhciwgUm93cywgQ29scz4gbTEgPSBNYXRyaXg8U2NhbGFyLCBSb3dzLCBDb2xzPjo6UmFuZG9tKCk7CisgIEhvdXNlaG9sZGVyUVI8TWF0cml4PFNjYWxhciwgUm93cywgQ29scz4gPiBxcihtMSk7CiAKLSAgTWF0cml4PFNjYWxhcixSb3dzLENvbHM+IHIgPSBxci5tYXRyaXhRUigpOworICBNYXRyaXg8U2NhbGFyLCBSb3dzLCBDb2xzPiByID0gcXIubWF0cml4UVIoKTsKICAgLy8gRklYTUUgbmVlZCBiZXR0ZXIgd2F5IHRvIGNvbnN0cnVjdCB0cmFwZXpvaWQKLSAgZm9yKGludCBpID0gMDsgaSA8IFJvd3M7IGkrKykgZm9yKGludCBqID0gMDsgaiA8IENvbHM7IGorKykgaWYoaT5qKSByKGksaikgPSBTY2FsYXIoMCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgUm93czsgaSsrKQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgQ29sczsgaisrKQorICAgICAgaWYgKGkgPiBqKSByKGksIGopID0gU2NhbGFyKDApOwogCiAgIFZFUklGWV9JU19BUFBST1gobTEsIHFyLmhvdXNlaG9sZGVyUSgpICogcik7CiAKLSAgY2hlY2tfc29sdmVyYmFzZTxNYXRyaXg8U2NhbGFyLENvbHMsQ29sczI+LCBNYXRyaXg8U2NhbGFyLFJvd3MsQ29sczI+ID4obTEsIHFyLCBSb3dzLCBDb2xzLCBDb2xzMik7CisgIGNoZWNrX3NvbHZlcmJhc2U8TWF0cml4PFNjYWxhciwgQ29scywgQ29sczI+LCBNYXRyaXg8U2NhbGFyLCBSb3dzLCBDb2xzMj4gPihtMSwgcXIsIFJvd3MsIENvbHMsIENvbHMyKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBxcl9pbnZlcnRpYmxlKCkKLXsKLSAgdXNpbmcgc3RkOjpsb2c7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcXJfaW52ZXJ0aWJsZSgpIHsKICAgdXNpbmcgc3RkOjphYnM7Ci0gIHVzaW5nIHN0ZDo6cG93OworICB1c2luZyBzdGQ6OmxvZzsKICAgdXNpbmcgc3RkOjptYXg7CisgIHVzaW5nIHN0ZDo6cG93OwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKIAotICBTVEFUSUNfQ0hFQ0soKCBpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+OjpTdG9yYWdlSW5kZXgsaW50Pjo6dmFsdWUgKSk7CisgIFNUQVRJQ19DSEVDSygoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgSG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPjo6U3RvcmFnZUluZGV4LCBpbnQ+Ojp2YWx1ZSkpOwogCi0gIGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLDUwKTsKKyAgaW50IHNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsIDUwKTsKIAogICBNYXRyaXhUeXBlIG0xKHNpemUsIHNpemUpLCBtMihzaXplLCBzaXplKSwgbTMoc2l6ZSwgc2l6ZSk7Ci0gIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7CisgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOwogCi0gIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLGZsb2F0Pjo6dmFsdWUpCi0gIHsKKyAgaWYgKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsIGZsb2F0Pjo6dmFsdWUpIHsKICAgICAvLyBsZXQncyBidWlsZCBhIG1hdHJpeCBtb3JlIHN0YWJsZSB0byBpbnZlcnNlCi0gICAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSo0KTsKKyAgICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSAqIDQpOwogICAgIG0xICs9IGEgKiBhLmFkam9pbnQoKTsKICAgfQogCkBAIC03NCwyMiArNzUsMjMgQEAKIAogICAvLyBub3cgY29uc3RydWN0IGEgbWF0cml4IHdpdGggcHJlc2NyaWJlZCBkZXRlcm1pbmFudAogICBtMS5zZXRaZXJvKCk7Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIG0xKGksaSkgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIG0xKGksIGkpID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAgIFNjYWxhciBkZXQgPSBtMS5kaWFnb25hbCgpLnByb2QoKTsKICAgUmVhbFNjYWxhciBhYnNkZXQgPSBhYnMoZGV0KTsKLSAgbTMgPSBxci5ob3VzZWhvbGRlclEoKTsgLy8gZ2V0IGEgdW5pdGFyeQorICBtMyA9IHFyLmhvdXNlaG9sZGVyUSgpOyAgLy8gZ2V0IGEgdW5pdGFyeQogICBtMSA9IG0zICogbTEgKiBtMy5hZGpvaW50KCk7CiAgIHFyLmNvbXB1dGUobTEpOwogICBWRVJJRllfSVNfQVBQUk9YKGxvZyhhYnNkZXQpLCBxci5sb2dBYnNEZXRlcm1pbmFudCgpKTsKICAgLy8gVGhpcyB0ZXN0IGlzIHRyaWNreSBpZiB0aGUgZGV0ZXJtaW5hbnQgYmVjb21lcyB0b28gc21hbGwuCiAgIC8vIFNpbmNlIHdlIGdlbmVyYXRlIHJhbmRvbSBudW1iZXJzIHdpdGggbWFnbml0dWRlIHJhbmdlIFswLDFdLCB0aGUgYXZlcmFnZSBkZXRlcm1pbmFudCBpcyAwLjVec2l6ZQotICBSZWFsU2NhbGFyIHRvbCA9IG51bWV4dDo6bWF4aShSZWFsU2NhbGFyKHBvdygwLjUsc2l6ZSkpLCBudW1leHQ6Om1heGk8UmVhbFNjYWxhcj4oYWJzKGFic2RldCksIGFicyhxci5hYnNEZXRlcm1pbmFudCgpKSkpOworICBSZWFsU2NhbGFyIHRvbCA9CisgICAgICBudW1leHQ6Om1heGkoUmVhbFNjYWxhcihwb3coMC41LCBzaXplKSksIG51bWV4dDo6bWF4aTxSZWFsU2NhbGFyPihhYnMoYWJzZGV0KSwgYWJzKHFyLmFic0RldGVybWluYW50KCkpKSk7CiAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihhYnMoZGV0IC0gcXIuZGV0ZXJtaW5hbnQoKSksIHRvbCk7CiAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihhYnMoYWJzZGV0IC0gcXIuYWJzRGV0ZXJtaW5hbnQoKSksIHRvbCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXJfdmVyaWZ5X2Fzc2VydCgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcXJfdmVyaWZ5X2Fzc2VydCgpIHsKICAgTWF0cml4VHlwZSB0bXA7CiAKICAgSG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBxcjsKQEAgLTEwMywyMiArMTA1LDIzIEBACiAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHFyLmxvZ0Fic0RldGVybWluYW50KCkpCiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChxcikKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgIENBTExfU1VCVEVTVF8xKCBxcihNYXRyaXhYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gICBDQUxMX1NVQlRFU1RfMiggcXIoTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvMiksaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRS8yKSkpICk7Ci0gICBDQUxMX1NVQlRFU1RfMygoIHFyX2ZpeGVkc2l6ZTxNYXRyaXg8ZmxvYXQsMyw0PiwgMiA+KCkgKSk7Ci0gICBDQUxMX1NVQlRFU1RfNCgoIHFyX2ZpeGVkc2l6ZTxNYXRyaXg8ZG91YmxlLDYsMj4sIDQgPigpICkpOwotICAgQ0FMTF9TVUJURVNUXzUoKCBxcl9maXhlZHNpemU8TWF0cml4PGRvdWJsZSwyLDU+LCA3ID4oKSApKTsKLSAgIENBTExfU1VCVEVTVF8xMSggcXIoTWF0cml4PGZsb2F0LDEsMT4oKSkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChxcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSgKKyAgICAgICAgcXIoTWF0cml4WGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIocXIoTWF0cml4WGNkKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMikpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKHFyX2ZpeGVkc2l6ZTxNYXRyaXg8ZmxvYXQsIDMsIDQ+LCAyPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKHFyX2ZpeGVkc2l6ZTxNYXRyaXg8ZG91YmxlLCA2LCAyPiwgND4oKSkpOworICAgIENBTExfU1VCVEVTVF81KChxcl9maXhlZHNpemU8TWF0cml4PGRvdWJsZSwgMiwgNT4sIDc+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTEocXIoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CiAgIH0KIAotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBxcl9pbnZlcnRpYmxlPE1hdHJpeFhmPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoIHFyX2ludmVydGlibGU8TWF0cml4WGQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNyggcXJfaW52ZXJ0aWJsZTxNYXRyaXhYY2Y+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOCggcXJfaW52ZXJ0aWJsZTxNYXRyaXhYY2Q+KCkgKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEocXJfaW52ZXJ0aWJsZTxNYXRyaXhYZj4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzYocXJfaW52ZXJ0aWJsZTxNYXRyaXhYZD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzcocXJfaW52ZXJ0aWJsZTxNYXRyaXhYY2Y+KCkpOworICAgIENBTExfU1VCVEVTVF84KHFyX2ludmVydGlibGU8TWF0cml4WGNkPigpKTsKICAgfQogCiAgIENBTExfU1VCVEVTVF85KHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4M2Y+KCkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9xcl9jb2xwaXZvdGluZy5jcHAgYi90ZXN0L3FyX2NvbHBpdm90aW5nLmNwcAppbmRleCBiMGNjMDAwLi40Zjg3MTFmIDEwMDY0NAotLS0gYS90ZXN0L3FyX2NvbHBpdm90aW5nLmNwcAorKysgYi90ZXN0L3FyX2NvbHBpdm90aW5nLmNwcApAQCAtMTUsMTYgKzE1LDEzIEBACiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgogdm9pZCBjb2QoKSB7Ci0KICAgSW5kZXggcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDIsIEVJR0VOX1RFU1RfTUFYX1NJWkUpOwogICBJbmRleCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMiwgRUlHRU5fVEVTVF9NQVhfU0laRSk7CiAgIEluZGV4IGNvbHMyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMiwgRUlHRU5fVEVTVF9NQVhfU0laRSk7CiAgIEluZGV4IHJhbmsgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAoc3RkOjptaW4pKHJvd3MsIGNvbHMpIC0gMSk7CiAKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAotICAgICAgICAgICAgICAgICBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4KLSAgICAgIE1hdHJpeFFUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gTWF0cml4UVR5cGU7CiAgIE1hdHJpeFR5cGUgbWF0cml4OwogICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLCByb3dzLCBjb2xzLCBtYXRyaXgpOwogICBDb21wbGV0ZU9ydGhvZ29uYWxEZWNvbXBvc2l0aW9uPE1hdHJpeFR5cGU+IGNvZChtYXRyaXgpOwpAQCAtNDIsOCArMzksNyBAQAogCiAgIE1hdHJpeFR5cGUgdDsKICAgdC5zZXRaZXJvKHJvd3MsIGNvbHMpOwotICB0LnRvcExlZnRDb3JuZXIocmFuaywgcmFuaykgPQotICAgICAgY29kLm1hdHJpeFQoKS50b3BMZWZ0Q29ybmVyKHJhbmssIHJhbmspLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICB0LnRvcExlZnRDb3JuZXIocmFuaywgcmFuaykgPSBjb2QubWF0cml4VCgpLnRvcExlZnRDb3JuZXIocmFuaywgcmFuaykudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CiAKICAgTWF0cml4VHlwZSBjID0gcSAqIHQgKiB6ICogY29kLmNvbHNQZXJtdXRhdGlvbigpLmludmVyc2UoKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtYXRyaXgsIGMpOwpAQCAtNjQsMTAgKzYwLDcgQEAKIAogdGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBDb2xzMj4KIHZvaWQgY29kX2ZpeGVkc2l6ZSgpIHsKLSAgZW51bSB7Ci0gICAgUm93cyA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAotICAgIENvbHMgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZQotICB9OworICBlbnVtIHsgUm93cyA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBDb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgfTsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIENvbXBsZXRlT3J0aG9nb25hbERlY29tcG9zaXRpb248TWF0cml4PFNjYWxhciwgUm93cywgQ29scz4gPiBDT0Q7CiAgIGludCByYW5rID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIChzdGQ6Om1pbikoaW50KFJvd3MpLCBpbnQoQ29scykpIC0gMSk7CkBAIC05NSwxOCArODgsMTkgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChjb2Rfc29sdXRpb24sIHBpbnYgKiByaHMpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHFyKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBxcigpIHsKICAgdXNpbmcgc3RkOjpzcXJ0OwogCi0gIEluZGV4IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMixFSUdFTl9URVNUX01BWF9TSVpFKSwgY29sczIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLEVJR0VOX1RFU1RfTUFYX1NJWkUpOwotICBJbmRleCByYW5rID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgKHN0ZDo6bWluKShyb3dzLCBjb2xzKS0xKTsKKyAgSW5kZXggcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDIsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMiwgRUlHRU5fVEVTVF9NQVhfU0laRSksCisgICAgICAgIGNvbHMyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMiwgRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgIEluZGV4IHJhbmsgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAoc3RkOjptaW4pKHJvd3MsIGNvbHMpIC0gMSk7CiAKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IE1hdHJpeFFUeXBlOwogICBNYXRyaXhUeXBlIG0xOwotICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLHJvd3MsY29scyxtMSk7CisgIGNyZWF0ZVJhbmRvbVBJTWF0cml4T2ZSYW5rKHJhbmssIHJvd3MsIGNvbHMsIG0xKTsKICAgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBxcihtMSk7CiAgIFZFUklGWV9JU19FUVVBTChyYW5rLCBxci5yYW5rKCkpOwogICBWRVJJRllfSVNfRVFVQUwoY29scyAtIHFyLnJhbmsoKSwgcXIuZGltZW5zaW9uT2ZLZXJuZWwoKSk7CkBAIC0xMjMsOCArMTE3LDcgQEAKIAogICAvLyBWZXJpZnkgdGhhdCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGRpYWdvbmFsIGVsZW1lbnRzIGluIFIgYXJlCiAgIC8vIG5vbi1pbmNyZWFzaW5nIHVudGlsIHRoZXkgcmVhY2ggdGhlIHNpbmd1bGFyaXR5IHRocmVzaG9sZC4KLSAgUmVhbFNjYWxhciB0aHJlc2hvbGQgPQotICAgICAgc3FydChSZWFsU2NhbGFyKHJvd3MpKSAqIG51bWV4dDo6YWJzKHIoMCwgMCkpICogTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKTsKKyAgUmVhbFNjYWxhciB0aHJlc2hvbGQgPSBzcXJ0KFJlYWxTY2FsYXIocm93cykpICogbnVtZXh0OjphYnMocigwLCAwKSkgKiBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOwogICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgKHN0ZDo6bWluKShyb3dzLCBjb2xzKSAtIDE7ICsraSkgewogICAgIFJlYWxTY2FsYXIgeCA9IG51bWV4dDo6YWJzKHIoaSwgaSkpOwogICAgIFJlYWxTY2FsYXIgeSA9IG51bWV4dDo6YWJzKHIoaSArIDEsIGkgKyAxKSk7CkBAIC0xMzMsOCArMTI2LDcgQEAKICAgICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCAoc3RkOjptaW4pKHJvd3MsIGNvbHMpOyArK2opIHsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJpID0gIiA8PCBqIDw8ICIsIHxyX2lpfCA9ICIgPDwgbnVtZXh0OjphYnMocihqLCBqKSkgPDwgc3RkOjplbmRsOwogICAgICAgfQotICAgICAgc3RkOjpjb3V0IDw8ICJGYWlsdXJlIGF0IGk9IiA8PCBpIDw8ICIsIHJhbms9IiA8PCByYW5rCi0gICAgICAgICAgICAgICAgPDwgIiwgdGhyZXNob2xkPSIgPDwgdGhyZXNob2xkIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbHVyZSBhdCBpPSIgPDwgaSA8PCAiLCByYW5rPSIgPDwgcmFuayA8PCAiLCB0aHJlc2hvbGQ9IiA8PCB0aHJlc2hvbGQgPDwgc3RkOjplbmRsOwogICAgIH0KICAgICBWRVJJRllfSVNfQVBQUk9YX09SX0xFU1NfVEhBTih5LCB4KTsKICAgfQpAQCAtMTQ1LDQzICsxMzcsNDIgQEAKICAgICBNYXRyaXhUeXBlIG0yLCBtMzsKICAgICBJbmRleCBzaXplID0gcm93czsKICAgICBkbyB7Ci0gICAgICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICAgICAgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CiAgICAgICBxci5jb21wdXRlKG0xKTsKLSAgICB9IHdoaWxlKCFxci5pc0ludmVydGlibGUoKSk7CisgICAgfSB3aGlsZSAoIXFyLmlzSW52ZXJ0aWJsZSgpKTsKICAgICBNYXRyaXhUeXBlIG0xX2ludiA9IHFyLmludmVyc2UoKTsKLSAgICBtMyA9IG0xICogTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsY29sczIpOworICAgIG0zID0gbTEgKiBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgY29sczIpOwogICAgIG0yID0gcXIuc29sdmUobTMpOwotICAgIFZFUklGWV9JU19BUFBST1gobTIsIG0xX2ludiptMyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTFfaW52ICogbTMpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGUsIGludCBDb2xzMj4gdm9pZCBxcl9maXhlZHNpemUoKQotewotICB1c2luZyBzdGQ6OnNxcnQ7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IENvbHMyPgordm9pZCBxcl9maXhlZHNpemUoKSB7CiAgIHVzaW5nIHN0ZDo6YWJzOworICB1c2luZyBzdGQ6OnNxcnQ7CiAgIGVudW0geyBSb3dzID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIENvbHMgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSB9OwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOwotICBpbnQgcmFuayA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAoc3RkOjptaW4pKGludChSb3dzKSwgaW50KENvbHMpKS0xKTsKLSAgTWF0cml4PFNjYWxhcixSb3dzLENvbHM+IG0xOwotICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLFJvd3MsQ29scyxtMSk7Ci0gIENvbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PFNjYWxhcixSb3dzLENvbHM+ID4gcXIobTEpOworICBpbnQgcmFuayA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAoc3RkOjptaW4pKGludChSb3dzKSwgaW50KENvbHMpKSAtIDEpOworICBNYXRyaXg8U2NhbGFyLCBSb3dzLCBDb2xzPiBtMTsKKyAgY3JlYXRlUmFuZG9tUElNYXRyaXhPZlJhbmsocmFuaywgUm93cywgQ29scywgbTEpOworICBDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeDxTY2FsYXIsIFJvd3MsIENvbHM+ID4gcXIobTEpOwogICBWRVJJRllfSVNfRVFVQUwocmFuaywgcXIucmFuaygpKTsKICAgVkVSSUZZX0lTX0VRVUFMKENvbHMgLSBxci5yYW5rKCksIHFyLmRpbWVuc2lvbk9mS2VybmVsKCkpOwogICBWRVJJRllfSVNfRVFVQUwocXIuaXNJbmplY3RpdmUoKSwgKHJhbmsgPT0gUm93cykpOwogICBWRVJJRllfSVNfRVFVQUwocXIuaXNTdXJqZWN0aXZlKCksIChyYW5rID09IENvbHMpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHFyLmlzSW52ZXJ0aWJsZSgpLCAocXIuaXNJbmplY3RpdmUoKSAmJiBxci5pc1N1cmplY3RpdmUoKSkpOwogCi0gIE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzPiByID0gcXIubWF0cml4UVIoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKLSAgTWF0cml4PFNjYWxhcixSb3dzLENvbHM+IGMgPSBxci5ob3VzZWhvbGRlclEoKSAqIHIgKiBxci5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCk7CisgIE1hdHJpeDxTY2FsYXIsIFJvd3MsIENvbHM+IHIgPSBxci5tYXRyaXhRUigpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOworICBNYXRyaXg8U2NhbGFyLCBSb3dzLCBDb2xzPiBjID0gcXIuaG91c2Vob2xkZXJRKCkgKiByICogcXIuY29sc1Blcm11dGF0aW9uKCkuaW52ZXJzZSgpOwogICBWRVJJRllfSVNfQVBQUk9YKG0xLCBjKTsKIAotICBjaGVja19zb2x2ZXJiYXNlPE1hdHJpeDxTY2FsYXIsQ29scyxDb2xzMj4sIE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzMj4gPihtMSwgcXIsIFJvd3MsIENvbHMsIENvbHMyKTsKKyAgY2hlY2tfc29sdmVyYmFzZTxNYXRyaXg8U2NhbGFyLCBDb2xzLCBDb2xzMj4sIE1hdHJpeDxTY2FsYXIsIFJvd3MsIENvbHMyPiA+KG0xLCBxciwgUm93cywgQ29scywgQ29sczIpOwogCiAgIC8vIFZlcmlmeSB0aGF0IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZGlhZ29uYWwgZWxlbWVudHMgaW4gUiBhcmUKICAgLy8gbm9uLWluY3JlYXNpbmcgdW50aWwgdGhleSByZWFjaGUgdGhlIHNpbmd1bGFyaXR5IHRocmVzaG9sZC4KLSAgUmVhbFNjYWxhciB0aHJlc2hvbGQgPQotICAgICAgc3FydChSZWFsU2NhbGFyKFJvd3MpKSAqIChzdGQ6OmFicykocigwLCAwKSkgKiBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworICBSZWFsU2NhbGFyIHRocmVzaG9sZCA9IHNxcnQoUmVhbFNjYWxhcihSb3dzKSkgKiAoc3RkOjphYnMpKHIoMCwgMCkpICogTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKTsKICAgZm9yIChJbmRleCBpID0gMDsgaSA8IChzdGQ6Om1pbikoaW50KFJvd3MpLCBpbnQoQ29scykpIC0gMTsgKytpKSB7CiAgICAgUmVhbFNjYWxhciB4ID0gbnVtZXh0OjphYnMocihpLCBpKSk7CiAgICAgUmVhbFNjYWxhciB5ID0gbnVtZXh0OjphYnMocihpICsgMSwgaSArIDEpKTsKQEAgLTE5MCw4ICsxODEsNyBAQAogICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IChzdGQ6Om1pbikoaW50KFJvd3MpLCBpbnQoQ29scykpOyArK2opIHsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJpID0gIiA8PCBqIDw8ICIsIHxyX2lpfCA9ICIgPDwgbnVtZXh0OjphYnMocihqLCBqKSkgPDwgc3RkOjplbmRsOwogICAgICAgfQotICAgICAgc3RkOjpjb3V0IDw8ICJGYWlsdXJlIGF0IGk9IiA8PCBpIDw8ICIsIHJhbms9IiA8PCByYW5rCi0gICAgICAgICAgICAgICAgPDwgIiwgdGhyZXNob2xkPSIgPDwgdGhyZXNob2xkIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbHVyZSBhdCBpPSIgPDwgaSA8PCAiLCByYW5rPSIgPDwgcmFuayA8PCAiLCB0aHJlc2hvbGQ9IiA8PCB0aHJlc2hvbGQgPDwgc3RkOjplbmRsOwogICAgIH0KICAgICBWRVJJRllfSVNfQVBQUk9YX09SX0xFU1NfVEhBTih5LCB4KTsKICAgfQpAQCAtMjA0LDIwICsxOTQsMjAgQEAKIC8vIGZvciByYW5rLXJldmVhbGluZyBRUi4gU2VlCiAvLyBodHRwOi8vd3d3Lm5ldGxpYi5vcmcvbGFwYWNrL2xhd25zcGRmL2xhd24xNzYucGRmCiAvLyBwYWdlIDMgZm9yIG1vcmUgZGV0YWlsLgotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBxcl9rYWhhbl9tYXRyaXgoKQotewotICB1c2luZyBzdGQ6OnNxcnQ7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcXJfa2FoYW5fbWF0cml4KCkgewogICB1c2luZyBzdGQ6OmFiczsKKyAgdXNpbmcgc3RkOjpzcXJ0OwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOwogCiAgIEluZGV4IHJvd3MgPSAzMDAsIGNvbHMgPSByb3dzOwogCiAgIE1hdHJpeFR5cGUgbTE7Ci0gIG0xLnNldFplcm8ocm93cyxjb2xzKTsKKyAgbTEuc2V0WmVybyhyb3dzLCBjb2xzKTsKICAgUmVhbFNjYWxhciBzID0gc3RkOjpwb3coTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCksIDEuMCAvIHJvd3MpOwotICBSZWFsU2NhbGFyIGMgPSBzdGQ6OnNxcnQoMSAtIHMqcyk7Ci0gIFJlYWxTY2FsYXIgcG93X3NfaSgxLjApOyAvLyBwb3cocyxpKQorICBSZWFsU2NhbGFyIGMgPSBzdGQ6OnNxcnQoMSAtIHMgKiBzKTsKKyAgUmVhbFNjYWxhciBwb3dfc19pKDEuMCk7ICAvLyBwb3cocyxpKQogICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgcm93czsgKytpKSB7CiAgICAgbTEoaSwgaSkgPSBwb3dfc19pOwogICAgIG0xLnJvdyhpKS50YWlsKHJvd3MgLSBpIC0gMSkgPSAtcG93X3NfaSAqIGMgKiBNYXRyaXhUeXBlOjpPbmVzKDEsIHJvd3MgLSBpIC0gMSk7CkBAIC0yMjcsOCArMjE3LDcgQEAKICAgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBxcihtMSk7CiAgIE1hdHJpeFR5cGUgciA9IHFyLm1hdHJpeFFSKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CiAKLSAgUmVhbFNjYWxhciB0aHJlc2hvbGQgPQotICAgICAgc3RkOjpzcXJ0KFJlYWxTY2FsYXIocm93cykpICogbnVtZXh0OjphYnMocigwLCAwKSkgKiBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOworICBSZWFsU2NhbGFyIHRocmVzaG9sZCA9IHN0ZDo6c3FydChSZWFsU2NhbGFyKHJvd3MpKSAqIG51bWV4dDo6YWJzKHIoMCwgMCkpICogTnVtVHJhaXRzPFNjYWxhcj46OmVwc2lsb24oKTsKICAgZm9yIChJbmRleCBpID0gMDsgaSA8IChzdGQ6Om1pbikocm93cywgY29scykgLSAxOyArK2kpIHsKICAgICBSZWFsU2NhbGFyIHggPSBudW1leHQ6OmFicyhyKGksIGkpKTsKICAgICBSZWFsU2NhbGFyIHkgPSBudW1leHQ6OmFicyhyKGkgKyAxLCBpICsgMSkpOwpAQCAtMjM3LDI5ICsyMjYsMjcgQEAKICAgICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCAoc3RkOjptaW4pKHJvd3MsIGNvbHMpOyArK2opIHsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJpID0gIiA8PCBqIDw8ICIsIHxyX2lpfCA9ICIgPDwgbnVtZXh0OjphYnMocihqLCBqKSkgPDwgc3RkOjplbmRsOwogICAgICAgfQotICAgICAgc3RkOjpjb3V0IDw8ICJGYWlsdXJlIGF0IGk9IiA8PCBpIDw8ICIsIHJhbms9IiA8PCBxci5yYW5rKCkKLSAgICAgICAgICAgICAgICA8PCAiLCB0aHJlc2hvbGQ9IiA8PCB0aHJlc2hvbGQgPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICJGYWlsdXJlIGF0IGk9IiA8PCBpIDw8ICIsIHJhbms9IiA8PCBxci5yYW5rKCkgPDwgIiwgdGhyZXNob2xkPSIgPDwgdGhyZXNob2xkIDw8IHN0ZDo6ZW5kbDsKICAgICB9CiAgICAgVkVSSUZZX0lTX0FQUFJPWF9PUl9MRVNTX1RIQU4oeSwgeCk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBxcl9pbnZlcnRpYmxlKCkKLXsKLSAgdXNpbmcgc3RkOjpsb2c7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcXJfaW52ZXJ0aWJsZSgpIHsKICAgdXNpbmcgc3RkOjphYnM7CisgIHVzaW5nIHN0ZDo6bG9nOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKIAotICBpbnQgc2l6ZSA9IGludGVybmFsOjpyYW5kb208aW50PigxMCw1MCk7CisgIGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLCA1MCk7CiAKICAgTWF0cml4VHlwZSBtMShzaXplLCBzaXplKSwgbTIoc2l6ZSwgc2l6ZSksIG0zKHNpemUsIHNpemUpOwotICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKIAotICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhcixmbG9hdD46OnZhbHVlKQotICB7CisgIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLCBmbG9hdD46OnZhbHVlKSB7CiAgICAgLy8gbGV0J3MgYnVpbGQgYSBtYXRyaXggbW9yZSBzdGFibGUgdG8gaW52ZXJzZQotICAgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUqMik7CisgICAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUgKiAyKTsKICAgICBtMSArPSBhICogYS5hZGpvaW50KCk7CiAgIH0KIApAQCAtMjY5LDEwICsyNTYsMTAgQEAKIAogICAvLyBub3cgY29uc3RydWN0IGEgbWF0cml4IHdpdGggcHJlc2NyaWJlZCBkZXRlcm1pbmFudAogICBtMS5zZXRaZXJvKCk7Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIG0xKGksaSkgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIG0xKGksIGkpID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAgIFNjYWxhciBkZXQgPSBtMS5kaWFnb25hbCgpLnByb2QoKTsKICAgUmVhbFNjYWxhciBhYnNkZXQgPSBhYnMoZGV0KTsKLSAgbTMgPSBxci5ob3VzZWhvbGRlclEoKTsgLy8gZ2V0IGEgdW5pdGFyeQorICBtMyA9IHFyLmhvdXNlaG9sZGVyUSgpOyAgLy8gZ2V0IGEgdW5pdGFyeQogICBtMSA9IG0zICogbTEgKiBtMy5hZGpvaW50KCk7CiAgIHFyLmNvbXB1dGUobTEpOwogICBWRVJJRllfSVNfQVBQUk9YKGRldCwgcXIuZGV0ZXJtaW5hbnQoKSk7CkBAIC0yODAsOCArMjY3LDggQEAKICAgVkVSSUZZX0lTX0FQUFJPWChsb2coYWJzZGV0KSwgcXIubG9nQWJzRGV0ZXJtaW5hbnQoKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXJfdmVyaWZ5X2Fzc2VydCgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcXJfdmVyaWZ5X2Fzc2VydCgpIHsKICAgTWF0cml4VHlwZSB0bXA7CiAKICAgQ29sUGl2SG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBxcjsKQEAgLTMwMCw4ICsyODcsOCBAQAogICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5sb2dBYnNEZXRlcm1pbmFudCgpKQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIGNvZF92ZXJpZnlfYXNzZXJ0KCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjb2RfdmVyaWZ5X2Fzc2VydCgpIHsKICAgTWF0cml4VHlwZSB0bXA7CiAKICAgQ29tcGxldGVPcnRob2dvbmFsRGVjb21wb3NpdGlvbjxNYXRyaXhUeXBlPiBjb2Q7CkBAIC0zMjAsMzEgKzMwNywzMCBAQAogICBWRVJJRllfUkFJU0VTX0FTU0VSVChjb2QubG9nQWJzRGV0ZXJtaW5hbnQoKSkKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHFyX2NvbHBpdm90aW5nKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBxcjxNYXRyaXhYZj4oKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBxcjxNYXRyaXhYZD4oKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBxcjxNYXRyaXhYY2Q+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCgoIHFyX2ZpeGVkc2l6ZTxNYXRyaXg8ZmxvYXQsMyw1PiwgNCA+KCkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoKCBxcl9maXhlZHNpemU8TWF0cml4PGRvdWJsZSw2LDI+LCAzID4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfNSgoIHFyX2ZpeGVkc2l6ZTxNYXRyaXg8ZG91YmxlLDEsMT4sIDEgPigpICkpOworRUlHRU5fREVDTEFSRV9URVNUKHFyX2NvbHBpdm90aW5nKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKHFyPE1hdHJpeFhmPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihxcjxNYXRyaXhYZD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzMocXI8TWF0cml4WGNkPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgocXJfZml4ZWRzaXplPE1hdHJpeDxmbG9hdCwgMywgNT4sIDQ+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgocXJfZml4ZWRzaXplPE1hdHJpeDxkb3VibGUsIDYsIDI+LCAzPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKHFyX2ZpeGVkc2l6ZTxNYXRyaXg8ZG91YmxlLCAxLCAxPiwgMT4oKSkpOwogICB9CiAKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggY29kPE1hdHJpeFhmPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGNvZDxNYXRyaXhYZD4oKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBjb2Q8TWF0cml4WGNkPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoKCBjb2RfZml4ZWRzaXplPE1hdHJpeDxmbG9hdCwzLDU+LCA0ID4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfNSgoIGNvZF9maXhlZHNpemU8TWF0cml4PGRvdWJsZSw2LDI+LCAzID4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfNSgoIGNvZF9maXhlZHNpemU8TWF0cml4PGRvdWJsZSwxLDE+LCAxID4oKSApKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoY29kPE1hdHJpeFhmPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihjb2Q8TWF0cml4WGQ+KCkpOworICAgIENBTExfU1VCVEVTVF8zKGNvZDxNYXRyaXhYY2Q+KCkpOworICAgIENBTExfU1VCVEVTVF80KChjb2RfZml4ZWRzaXplPE1hdHJpeDxmbG9hdCwgMywgNT4sIDQ+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoY29kX2ZpeGVkc2l6ZTxNYXRyaXg8ZG91YmxlLCA2LCAyPiwgMz4oKSkpOworICAgIENBTExfU1VCVEVTVF81KChjb2RfZml4ZWRzaXplPE1hdHJpeDxkb3VibGUsIDEsIDE+LCAxPigpKSk7CiAgIH0KIAotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBxcl9pbnZlcnRpYmxlPE1hdHJpeFhmPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIHFyX2ludmVydGlibGU8TWF0cml4WGQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggcXJfaW52ZXJ0aWJsZTxNYXRyaXhYY2Y+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggcXJfaW52ZXJ0aWJsZTxNYXRyaXhYY2Q+KCkgKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEocXJfaW52ZXJ0aWJsZTxNYXRyaXhYZj4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzIocXJfaW52ZXJ0aWJsZTxNYXRyaXhYZD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzYocXJfaW52ZXJ0aWJsZTxNYXRyaXhYY2Y+KCkpOworICAgIENBTExfU1VCVEVTVF8zKHFyX2ludmVydGlibGU8TWF0cml4WGNkPigpKTsKICAgfQogCiAgIENBTExfU1VCVEVTVF83KHFyX3ZlcmlmeV9hc3NlcnQ8TWF0cml4M2Y+KCkpOwpAQCAtMzY0LDYgKzM1MCw2IEBACiAgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycwogICBDQUxMX1NVQlRFU1RfOShDb2xQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFhmPigxMCwgMjApKTsKIAotICBDQUxMX1NVQlRFU1RfMSggcXJfa2FoYW5fbWF0cml4PE1hdHJpeFhmPigpICk7Ci0gIENBTExfU1VCVEVTVF8yKCBxcl9rYWhhbl9tYXRyaXg8TWF0cml4WGQ+KCkgKTsKKyAgQ0FMTF9TVUJURVNUXzEocXJfa2FoYW5fbWF0cml4PE1hdHJpeFhmPigpKTsKKyAgQ0FMTF9TVUJURVNUXzIocXJfa2FoYW5fbWF0cml4PE1hdHJpeFhkPigpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvcXJfZnVsbHBpdm90aW5nLmNwcCBiL3Rlc3QvcXJfZnVsbHBpdm90aW5nLmNwcAppbmRleCBiZDQwODgxLi43MWYzYTUxIDEwMDY0NAotLS0gYS90ZXN0L3FyX2Z1bGxwaXZvdGluZy5jcHAKKysrIGIvdGVzdC9xcl9mdWxscGl2b3RpbmcuY3BwCkBAIC0xMiwyMSArMTIsMjAgQEAKICNpbmNsdWRlIDxFaWdlbi9RUj4KICNpbmNsdWRlICJzb2x2ZXJiYXNlLmgiCiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXIoKQotewotCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcXIoKSB7CiAgIHN0YXRpYyBjb25zdCBpbnQgUm93cyA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBDb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU7CiAgIEluZGV4IG1heF9zaXplID0gRUlHRU5fVEVTVF9NQVhfU0laRTsKLSAgSW5kZXggbWluX3NpemUgPSBudW1leHQ6Om1heGkoMSxFSUdFTl9URVNUX01BWF9TSVpFLzEwKTsKLSAgSW5kZXggcm93cyAgPSBSb3dzID09IER5bmFtaWMgPyBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihtaW5fc2l6ZSxtYXhfc2l6ZSkgOiBSb3dzLAotICAgICAgICBjb2xzICA9IENvbHMgPT0gRHluYW1pYyA/IGludGVybmFsOjpyYW5kb208SW5kZXg+KG1pbl9zaXplLG1heF9zaXplKSA6IENvbHMsCi0gICAgICAgIGNvbHMyID0gQ29scyA9PSBEeW5hbWljID8gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4obWluX3NpemUsbWF4X3NpemUpIDogQ29scywKLSAgICAgICAgcmFuayAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAoc3RkOjptaW4pKHJvd3MsIGNvbHMpLTEpOworICBJbmRleCBtaW5fc2l6ZSA9IG51bWV4dDo6bWF4aSgxLCBFSUdFTl9URVNUX01BWF9TSVpFIC8gMTApOworICBJbmRleCByb3dzID0gUm93cyA9PSBEeW5hbWljID8gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4obWluX3NpemUsIG1heF9zaXplKSA6IFJvd3MsCisgICAgICAgIGNvbHMgPSBDb2xzID09IER5bmFtaWMgPyBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihtaW5fc2l6ZSwgbWF4X3NpemUpIDogQ29scywKKyAgICAgICAgY29sczIgPSBDb2xzID09IER5bmFtaWMgPyBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihtaW5fc2l6ZSwgbWF4X3NpemUpIDogQ29scywKKyAgICAgICAgcmFuayA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIChzdGQ6Om1pbikocm93cywgY29scykgLSAxKTsKIAogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBNYXRyaXhRVHlwZTsKICAgTWF0cml4VHlwZSBtMTsKLSAgY3JlYXRlUmFuZG9tUElNYXRyaXhPZlJhbmsocmFuayxyb3dzLGNvbHMsbTEpOworICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhyYW5rLCByb3dzLCBjb2xzLCBtMSk7CiAgIEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IHFyKG0xKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJhbmssIHFyLnJhbmsoKSk7CiAgIFZFUklGWV9JU19FUVVBTChjb2xzIC0gcXIucmFuaygpLCBxci5kaW1lbnNpb25PZktlcm5lbCgpKTsKQEAgLTM1LDU1ICszNCw1NiBAQAogICBWRVJJRlkoIXFyLmlzU3VyamVjdGl2ZSgpKTsKIAogICBNYXRyaXhUeXBlIHIgPSBxci5tYXRyaXhRUigpOwotICAKKwogICBNYXRyaXhRVHlwZSBxID0gcXIubWF0cml4USgpOwogICBWRVJJRllfSVNfVU5JVEFSWShxKTsKLSAgCisKICAgLy8gRklYTUUgbmVlZCBiZXR0ZXIgd2F5IHRvIGNvbnN0cnVjdCB0cmFwZXpvaWQKLSAgZm9yKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgZm9yKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgaWYoaT5qKSByKGksaikgPSBTY2FsYXIoMCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29sczsgaisrKQorICAgICAgaWYgKGkgPiBqKSByKGksIGopID0gU2NhbGFyKDApOwogCiAgIE1hdHJpeFR5cGUgYyA9IHFyLm1hdHJpeFEoKSAqIHIgKiBxci5jb2xzUGVybXV0YXRpb24oKS5pbnZlcnNlKCk7CiAKICAgVkVSSUZZX0lTX0FQUFJPWChtMSwgYyk7Ci0gIAorCiAgIC8vIHN0cmVzcyB0aGUgUmV0dXJuQnlWYWx1ZSBtZWNoYW5pc20KICAgTWF0cml4VHlwZSB0bXA7CiAgIFZFUklGWV9JU19BUFBST1godG1wLm5vYWxpYXMoKSA9IHFyLm1hdHJpeFEoKSAqIHIsIChxci5tYXRyaXhRKCkgKiByKS5ldmFsKCkpOwotICAKKwogICBjaGVja19zb2x2ZXJiYXNlPE1hdHJpeFR5cGUsIE1hdHJpeFR5cGU+KG0xLCBxciwgcm93cywgY29scywgY29sczIpOwogCiAgIHsKICAgICBNYXRyaXhUeXBlIG0yLCBtMzsKICAgICBJbmRleCBzaXplID0gcm93czsKICAgICBkbyB7Ci0gICAgICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICAgICAgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CiAgICAgICBxci5jb21wdXRlKG0xKTsKLSAgICB9IHdoaWxlKCFxci5pc0ludmVydGlibGUoKSk7CisgICAgfSB3aGlsZSAoIXFyLmlzSW52ZXJ0aWJsZSgpKTsKICAgICBNYXRyaXhUeXBlIG0xX2ludiA9IHFyLmludmVyc2UoKTsKLSAgICBtMyA9IG0xICogTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsY29sczIpOworICAgIG0zID0gbTEgKiBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgY29sczIpOwogICAgIG0yID0gcXIuc29sdmUobTMpOwotICAgIFZFUklGWV9JU19BUFBST1gobTIsIG0xX2ludiptMyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTFfaW52ICogbTMpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXJfaW52ZXJ0aWJsZSgpCi17Ci0gIHVzaW5nIHN0ZDo6bG9nOwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHFyX2ludmVydGlibGUoKSB7CiAgIHVzaW5nIHN0ZDo6YWJzOworICB1c2luZyBzdGQ6OmxvZzsKICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAKLSAgSW5kZXggbWF4X3NpemUgPSBudW1leHQ6Om1pbmkoNTAsRUlHRU5fVEVTVF9NQVhfU0laRSk7Ci0gIEluZGV4IG1pbl9zaXplID0gbnVtZXh0OjptYXhpKDEsRUlHRU5fVEVTVF9NQVhfU0laRS8xMCk7Ci0gIEluZGV4IHNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihtaW5fc2l6ZSxtYXhfc2l6ZSk7CisgIEluZGV4IG1heF9zaXplID0gbnVtZXh0OjptaW5pKDUwLCBFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgSW5kZXggbWluX3NpemUgPSBudW1leHQ6Om1heGkoMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDEwKTsKKyAgSW5kZXggc2l6ZSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KG1pbl9zaXplLCBtYXhfc2l6ZSk7CiAKICAgTWF0cml4VHlwZSBtMShzaXplLCBzaXplKSwgbTIoc2l6ZSwgc2l6ZSksIG0zKHNpemUsIHNpemUpOwotICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUpOworICBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKIAotICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhcixmbG9hdD46OnZhbHVlKQotICB7CisgIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLCBmbG9hdD46OnZhbHVlKSB7CiAgICAgLy8gbGV0J3MgYnVpbGQgYSBtYXRyaXggbW9yZSBzdGFibGUgdG8gaW52ZXJzZQotICAgIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLHNpemUqMik7CisgICAgTWF0cml4VHlwZSBhID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUgKiAyKTsKICAgICBtMSArPSBhICogYS5hZGpvaW50KCk7CiAgIH0KIApAQCAtOTYsMTAgKzk2LDEwIEBACiAKICAgLy8gbm93IGNvbnN0cnVjdCBhIG1hdHJpeCB3aXRoIHByZXNjcmliZWQgZGV0ZXJtaW5hbnQKICAgbTEuc2V0WmVybygpOwotICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSBtMShpLGkpID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSBtMShpLCBpKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwogICBTY2FsYXIgZGV0ID0gbTEuZGlhZ29uYWwoKS5wcm9kKCk7CiAgIFJlYWxTY2FsYXIgYWJzZGV0ID0gYWJzKGRldCk7Ci0gIG0zID0gcXIubWF0cml4USgpOyAvLyBnZXQgYSB1bml0YXJ5CisgIG0zID0gcXIubWF0cml4USgpOyAgLy8gZ2V0IGEgdW5pdGFyeQogICBtMSA9IG0zICogbTEgKiBtMy5hZGpvaW50KCk7CiAgIHFyLmNvbXB1dGUobTEpOwogICBWRVJJRllfSVNfQVBQUk9YKGRldCwgcXIuZGV0ZXJtaW5hbnQoKSk7CkBAIC0xMDcsOCArMTA3LDggQEAKICAgVkVSSUZZX0lTX0FQUFJPWChsb2coYWJzZGV0KSwgcXIubG9nQWJzRGV0ZXJtaW5hbnQoKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgcXJfdmVyaWZ5X2Fzc2VydCgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcXJfdmVyaWZ5X2Fzc2VydCgpIHsKICAgTWF0cml4VHlwZSB0bXA7CiAKICAgRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4VHlwZT4gcXI7CkBAIC0xMjcsMjIgKzEyNywyMSBAQAogICBWRVJJRllfUkFJU0VTX0FTU0VSVChxci5sb2dBYnNEZXRlcm1pbmFudCgpKQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QocXJfZnVsbHBpdm90aW5nKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgMTsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIHFyPE1hdHJpeDNmPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoIHFyPE1hdHJpeDNkPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzgoIHFyPE1hdHJpeDJmPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIHFyPE1hdHJpeFhmPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIHFyPE1hdHJpeFhkPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIHFyPE1hdHJpeFhjZD4oKSApOworRUlHRU5fREVDTEFSRV9URVNUKHFyX2Z1bGxwaXZvdGluZykgeworICBmb3IgKGludCBpID0gMDsgaSA8IDE7IGkrKykgeworICAgIENBTExfU1VCVEVTVF81KHFyPE1hdHJpeDNmPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfNihxcjxNYXRyaXgzZD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzgocXI8TWF0cml4MmY+KCkpOworICAgIENBTExfU1VCVEVTVF8xKHFyPE1hdHJpeFhmPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihxcjxNYXRyaXhYZD4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzMocXI8TWF0cml4WGNkPigpKTsKICAgfQogCi0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIHFyX2ludmVydGlibGU8TWF0cml4WGY+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggcXJfaW52ZXJ0aWJsZTxNYXRyaXhYZD4oKSApOwotICAgIENBTExfU1VCVEVTVF80KCBxcl9pbnZlcnRpYmxlPE1hdHJpeFhjZj4oKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBxcl9pbnZlcnRpYmxlPE1hdHJpeFhjZD4oKSApOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShxcl9pbnZlcnRpYmxlPE1hdHJpeFhmPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihxcl9pbnZlcnRpYmxlPE1hdHJpeFhkPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChxcl9pbnZlcnRpYmxlPE1hdHJpeFhjZj4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzMocXJfaW52ZXJ0aWJsZTxNYXRyaXhYY2Q+KCkpOwogICB9CiAKICAgQ0FMTF9TVUJURVNUXzUocXJfdmVyaWZ5X2Fzc2VydDxNYXRyaXgzZj4oKSk7CkBAIC0xNTQsOCArMTUzLDggQEAKIAogICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKICAgQ0FMTF9TVUJURVNUXzcoRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4WGY+KDEwLCAyMCkpOwotICBDQUxMX1NVQlRFU1RfNygoRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PGZsb2F0LDEwLDIwPiA+KDEwLDIwKSkpOwotICBDQUxMX1NVQlRFU1RfNygoRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PGZsb2F0LDEwLDIwPiA+KE1hdHJpeDxmbG9hdCwxMCwyMD46OlJhbmRvbSgpKSkpOwotICBDQUxMX1NVQlRFU1RfNygoRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PGZsb2F0LDIwLDEwPiA+KDIwLDEwKSkpOwotICBDQUxMX1NVQlRFU1RfNygoRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PGZsb2F0LDIwLDEwPiA+KE1hdHJpeDxmbG9hdCwyMCwxMD46OlJhbmRvbSgpKSkpOworICBDQUxMX1NVQlRFU1RfNygoRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PGZsb2F0LCAxMCwgMjA+ID4oMTAsIDIwKSkpOworICBDQUxMX1NVQlRFU1RfNygoRnVsbFBpdkhvdXNlaG9sZGVyUVI8TWF0cml4PGZsb2F0LCAxMCwgMjA+ID4oTWF0cml4PGZsb2F0LCAxMCwgMjA+OjpSYW5kb20oKSkpKTsKKyAgQ0FMTF9TVUJURVNUXzcoKEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeDxmbG9hdCwgMjAsIDEwPiA+KDIwLCAxMCkpKTsKKyAgQ0FMTF9TVUJURVNUXzcoKEZ1bGxQaXZIb3VzZWhvbGRlclFSPE1hdHJpeDxmbG9hdCwgMjAsIDEwPiA+KE1hdHJpeDxmbG9hdCwgMjAsIDEwPjo6UmFuZG9tKCkpKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L3F0dmVjdG9yLmNwcCBiL3Rlc3QvcXR2ZWN0b3IuY3BwCmluZGV4IDRlYzc5YjEuLjBmMmQ5MDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvcXR2ZWN0b3IuY3BwCisrKyBiL3Rlc3QvcXR2ZWN0b3IuY3BwCkBAIC0xNSw0OSArMTUsNDMgQEAKICNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KICNpbmNsdWRlIDxFaWdlbi9RdEFsaWduZWRNYWxsb2M+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIGNoZWNrX3F0dmVjdG9yX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX3F0dmVjdG9yX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwotICBNYXRyaXhUeXBlIHggPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSwgeSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICBRVmVjdG9yPE1hdHJpeFR5cGU+IHYoMTAsIE1hdHJpeFR5cGUocm93cyxjb2xzKSksIHcoMjAsIHkpOwotICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKLSAgeworICBNYXRyaXhUeXBlIHggPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIFFWZWN0b3I8TWF0cml4VHlwZT4gdigxMCwgTWF0cml4VHlwZShyb3dzLCBjb2xzKSksIHcoMjAsIHkpOworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKICAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHkpOwogICB9CiAgIHZbNV0gPSB4OwogICB3WzZdID0gdls1XTsKICAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKICAgdiA9IHc7Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQotICB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CiAgIH0KIAogICB2LnJlc2l6ZSgyMSk7CiAgIHZbMjBdID0geDsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7Ci0gIHYuZmlsbCh5LDIyKTsKKyAgdi5maWxsKHksIDIyKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CiAgIHYucHVzaF9iYWNrKHgpOwogICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKLSAgVkVSSUZZKChzaXplX3QpJih2WzIyXSkgPT0gKHNpemVfdCkmKHZbMjFdKSArIHNpemVvZihNYXRyaXhUeXBlKSk7CisgIFZFUklGWSgoc2l6ZV90KSAmICh2WzIyXSkgPT0gKHNpemVfdCkgJiAodlsyMV0pICsgc2l6ZW9mKE1hdHJpeFR5cGUpKTsKIAogICAvLyBkbyBhIGxvdCBvZiBwdXNoX2JhY2sgc3VjaCB0aGF0IHRoZSB2ZWN0b3IgZ2V0cyBpbnRlcm5hbGx5IHJlc2l6ZWQKICAgLy8gKHdpdGggbWVtb3J5IHJlYWxsb2NhdGlvbikKICAgTWF0cml4VHlwZSogcmVmID0gJndbMF07Ci0gIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0md1swXSkgJiYgaTwzMDApOyArK2kpCi0gICAgdi5wdXNoX2JhY2sod1tpJXcuc2l6ZSgpXSk7Ci0gIGZvcihpbnQgaT0yMzsgaTx2LnNpemUoKTsgKytpKQotICB7Ci0gICAgVkVSSUZZKHZbaV09PXdbKGktMjMpJXcuc2l6ZSgpXSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzAgfHwgKChyZWYgPT0gJndbMF0pICYmIGkgPCAzMDApOyArK2kpIHYucHVzaF9iYWNrKHdbaSAlIHcuc2l6ZSgpXSk7CisgIGZvciAoaW50IGkgPSAyMzsgaSA8IHYuc2l6ZSgpOyArK2kpIHsKKyAgICBWRVJJRlkodltpXSA9PSB3WyhpIC0gMjMpICUgdy5zaXplKCldKTsKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPgotdm9pZCBjaGVja19xdHZlY3Rvcl90cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtVHlwZSYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KK3ZvaWQgY2hlY2tfcXR2ZWN0b3JfdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybVR5cGUmKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOwogICBUcmFuc2Zvcm1UeXBlIHgoTWF0cml4VHlwZTo6UmFuZG9tKCkpLCB5KE1hdHJpeFR5cGU6OlJhbmRvbSgpKTsKICAgUVZlY3RvcjxUcmFuc2Zvcm1UeXBlPiB2KDEwKSwgdygyMCwgeSk7CkBAIC02NSwzNCArNTksMzAgQEAKICAgd1s2XSA9IHZbNV07CiAgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CiAgIHYgPSB3OwotICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKLSAgeworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKICAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHZbaV0pOwogICB9CiAKICAgdi5yZXNpemUoMjEpOwogICB2WzIwXSA9IHg7CiAgIFZFUklGWV9JU19BUFBST1godlsyMF0sIHgpOwotICB2LmZpbGwoeSwyMik7CisgIHYuZmlsbCh5LCAyMik7CiAgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOwogICB2LnB1c2hfYmFjayh4KTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7Ci0gIFZFUklGWSgoc2l6ZV90KSYodlsyMl0pID09IChzaXplX3QpJih2WzIxXSkgKyBzaXplb2YoVHJhbnNmb3JtVHlwZSkpOworICBWRVJJRlkoKHNpemVfdCkgJiAodlsyMl0pID09IChzaXplX3QpICYgKHZbMjFdKSArIHNpemVvZihUcmFuc2Zvcm1UeXBlKSk7CiAKICAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCiAgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCiAgIFRyYW5zZm9ybVR5cGUqIHJlZiA9ICZ3WzBdOwotICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQotICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOwotICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGludChpKTx2LnNpemUoKTsgKytpKQotICB7Ci0gICAgVkVSSUZZKHZbaV0ubWF0cml4KCk9PXdbKGktMjMpJXcuc2l6ZSgpXS5tYXRyaXgoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzAgfHwgKChyZWYgPT0gJndbMF0pICYmIGkgPCAzMDApOyArK2kpIHYucHVzaF9iYWNrKHdbaSAlIHcuc2l6ZSgpXSk7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAyMzsgaW50KGkpIDwgdi5zaXplKCk7ICsraSkgeworICAgIFZFUklGWSh2W2ldLm1hdHJpeCgpID09IHdbKGkgLSAyMykgJSB3LnNpemUoKV0ubWF0cml4KCkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgotdm9pZCBjaGVja19xdHZlY3Rvcl9xdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb25UeXBlJikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZT4KK3ZvaWQgY2hlY2tfcXR2ZWN0b3JfcXVhdGVybmlvbihjb25zdCBRdWF0ZXJuaW9uVHlwZSYpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZTo6Q29lZmZpY2llbnRzIENvZWZmaWNpZW50czsKICAgUXVhdGVybmlvblR5cGUgeChDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgeShDb2VmZmljaWVudHM6OlJhbmRvbSgpKTsKICAgUVZlY3RvcjxRdWF0ZXJuaW9uVHlwZT4gdigxMCksIHcoMjAsIHkpOwpAQCAtMTAwLDMzICs5MCwyOSBAQAogICB3WzZdID0gdls1XTsKICAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKICAgdiA9IHc7Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQotICB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CiAgIH0KIAogICB2LnJlc2l6ZSgyMSk7CiAgIHZbMjBdID0geDsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7Ci0gIHYuZmlsbCh5LDIyKTsKKyAgdi5maWxsKHksIDIyKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CiAgIHYucHVzaF9iYWNrKHgpOwogICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKLSAgVkVSSUZZKChzaXplX3QpJih2WzIyXSkgPT0gKHNpemVfdCkmKHZbMjFdKSArIHNpemVvZihRdWF0ZXJuaW9uVHlwZSkpOworICBWRVJJRlkoKHNpemVfdCkgJiAodlsyMl0pID09IChzaXplX3QpICYgKHZbMjFdKSArIHNpemVvZihRdWF0ZXJuaW9uVHlwZSkpOwogCiAgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIHZlY3RvciBnZXRzIGludGVybmFsbHkgcmVzaXplZAogICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQogICBRdWF0ZXJuaW9uVHlwZSogcmVmID0gJndbMF07Ci0gIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0md1swXSkgJiYgaTwzMDApOyArK2kpCi0gICAgdi5wdXNoX2JhY2sod1tpJXcuc2l6ZSgpXSk7Ci0gIGZvcih1bnNpZ25lZCBpbnQgaT0yMzsgaW50KGkpPHYuc2l6ZSgpOyArK2kpCi0gIHsKLSAgICBWRVJJRlkodltpXS5jb2VmZnMoKT09d1soaS0yMykldy5zaXplKCldLmNvZWZmcygpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMCB8fCAoKHJlZiA9PSAmd1swXSkgJiYgaSA8IDMwMCk7ICsraSkgdi5wdXNoX2JhY2sod1tpICUgdy5zaXplKCldKTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDIzOyBpbnQoaSkgPCB2LnNpemUoKTsgKytpKSB7CisgICAgVkVSSUZZKHZbaV0uY29lZmZzKCkgPT0gd1soaSAtIDIzKSAlIHcuc2l6ZSgpXS5jb2VmZnMoKSk7CiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHF0dmVjdG9yKQoteworRUlHRU5fREVDTEFSRV9URVNUKHF0dmVjdG9yKSB7CiAgIC8vIHNvbWUgbm9uIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcwogICBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfbWF0cml4KFZlY3RvcjJmKCkpKTsKICAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChNYXRyaXgzZigpKSk7CkBAIC0xMzksMTYgKzEyNSwxNiBAQAogICBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfbWF0cml4KE1hdHJpeDRkKCkpKTsKIAogICAvLyBzb21lIGR5bmFtaWMgc2l6ZXMKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChNYXRyaXhYZCgxLDEpKSk7CisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl9tYXRyaXgoTWF0cml4WGQoMSwgMSkpKTsKICAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChWZWN0b3JYZCgyMCkpKTsKICAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChSb3dWZWN0b3JYZigyMCkpKTsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX21hdHJpeChNYXRyaXhYY2YoMTAsMTApKSk7CisgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl9tYXRyaXgoTWF0cml4WGNmKDEwLCAxMCkpKTsKIAogICAvLyBzb21lIFRyYW5zZm9ybQogICBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfdHJhbnNmb3JtKEFmZmluZTJmKCkpKTsKICAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX3RyYW5zZm9ybShBZmZpbmUzZigpKSk7CiAgIENBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl90cmFuc2Zvcm0oQWZmaW5lM2QoKSkpOwotICAvL0NBTExfU1VCVEVTVChjaGVja19xdHZlY3Rvcl90cmFuc2Zvcm0oVHJhbnNmb3JtNGQoKSkpOworICAvLyBDQUxMX1NVQlRFU1QoY2hlY2tfcXR2ZWN0b3JfdHJhbnNmb3JtKFRyYW5zZm9ybTRkKCkpKTsKIAogICAvLyBzb21lIFF1YXRlcm5pb24KICAgQ0FMTF9TVUJURVNUKGNoZWNrX3F0dmVjdG9yX3F1YXRlcm5pb24oUXVhdGVybmlvbmYoKSkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9yYW5kLmNwcCBiL3Rlc3QvcmFuZC5jcHAKaW5kZXggNGQ2ODZiZi4uMmIxOTNmZiAxMDA2NDQKLS0tIGEvdGVzdC9yYW5kLmNwcAorKysgYi90ZXN0L3JhbmQuY3BwCkBAIC0xMSwxMDkgKzExLDEwNSBAQAogCiB0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NDsKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBTY2FsYXIgY2hlY2tfaW5fcmFuZ2UoU2NhbGFyIHgsIFNjYWxhciB5KQotewotICBTY2FsYXIgciA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPih4LHkpOwotICBWRVJJRlkocj49eCk7Ci0gIGlmKHk+PXgpCi0gIHsKLSAgICBWRVJJRlkocjw9eSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorU2NhbGFyIGNoZWNrX2luX3JhbmdlKFNjYWxhciB4LCBTY2FsYXIgeSkgeworICBTY2FsYXIgciA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPih4LCB5KTsKKyAgVkVSSUZZKHIgPj0geCk7CisgIGlmICh5ID49IHgpIHsKKyAgICBWRVJJRlkociA8PSB5KTsKICAgfQogICByZXR1cm4gcjsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGNoZWNrX2FsbF9pbl9yYW5nZShTY2FsYXIgeCwgU2NhbGFyIHkpCi17Ci0gIEFycmF5PGludCwxLER5bmFtaWM+IG1hc2soeS14KzEpOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgY2hlY2tfYWxsX2luX3JhbmdlKFNjYWxhciB4LCBTY2FsYXIgeSkgeworICBBcnJheTxpbnQsIDEsIER5bmFtaWM+IG1hc2soeSAtIHggKyAxKTsKICAgbWFzay5maWxsKDApOwotICBsb25nIG4gPSAoeS14KzEpKjMyOwotICBmb3IobG9uZyBrPTA7IGs8bjsgKytrKQotICB7Ci0gICAgbWFzayggY2hlY2tfaW5fcmFuZ2UoeCx5KS14ICkrKzsKKyAgbG9uZyBuID0gKHkgLSB4ICsgMSkgKiAzMjsKKyAgZm9yIChsb25nIGsgPSAwOyBrIDwgbjsgKytrKSB7CisgICAgbWFzayhjaGVja19pbl9yYW5nZSh4LCB5KSAtIHgpKys7CiAgIH0KLSAgZm9yKEluZGV4IGk9MDsgaTxtYXNrLnNpemUoKTsgKytpKQotICAgIGlmKG1hc2soaSk9PTApCi0gICAgICBzdGQ6OmNvdXQgPDwgIldBUk5JTkc6IHZhbHVlICIgPDwgeCtpIDw8ICIgbm90IHJlYWNoZWQuIiA8PCBzdGQ6OmVuZGw7Ci0gIFZFUklGWSggKG1hc2s+MCkuYWxsKCkgKTsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IG1hc2suc2l6ZSgpOyArK2kpCisgICAgaWYgKG1hc2soaSkgPT0gMCkgc3RkOjpjb3V0IDw8ICJXQVJOSU5HOiB2YWx1ZSAiIDw8IHggKyBpIDw8ICIgbm90IHJlYWNoZWQuIiA8PCBzdGQ6OmVuZGw7CisgIFZFUklGWSgobWFzayA+IDApLmFsbCgpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGNoZWNrX2hpc3RvZ3JhbShTY2FsYXIgeCwgU2NhbGFyIHksIGludCBiaW5zKQotewotICBBcnJheTxpbnQsMSxEeW5hbWljPiBoaXN0KGJpbnMpOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgY2hlY2tfaGlzdG9ncmFtKFNjYWxhciB4LCBTY2FsYXIgeSwgaW50IGJpbnMpIHsKKyAgQXJyYXk8aW50LCAxLCBEeW5hbWljPiBoaXN0KGJpbnMpOwogICBoaXN0LmZpbGwoMCk7CiAgIGludCBmID0gMTAwMDAwOwotICBpbnQgbiA9IGJpbnMqZjsKLSAgaW50NjQgcmFuZ2UgPSBpbnQ2NCh5KS1pbnQ2NCh4KTsKLSAgaW50IGRpdmlzb3IgPSBpbnQoKHJhbmdlKzEpL2JpbnMpOwotICBhc3NlcnQoKChyYW5nZSsxKSViaW5zKT09MCk7Ci0gIGZvcihpbnQgaz0wOyBrPG47ICsraykKLSAgewotICAgIFNjYWxhciByID0gY2hlY2tfaW5fcmFuZ2UoeCx5KTsKLSAgICBoaXN0KCBpbnQoKGludDY0KHIpLWludDY0KHgpKS9kaXZpc29yKSApKys7CisgIGludCBuID0gYmlucyAqIGY7CisgIGludDY0IHJhbmdlID0gaW50NjQoeSkgLSBpbnQ2NCh4KTsKKyAgaW50IGRpdmlzb3IgPSBpbnQoKHJhbmdlICsgMSkgLyBiaW5zKTsKKyAgYXNzZXJ0KCgocmFuZ2UgKyAxKSAlIGJpbnMpID09IDApOworICBmb3IgKGludCBrID0gMDsgayA8IG47ICsraykgeworICAgIFNjYWxhciByID0gY2hlY2tfaW5fcmFuZ2UoeCwgeSk7CisgICAgaGlzdChpbnQoKGludDY0KHIpIC0gaW50NjQoeCkpIC8gZGl2aXNvcikpKys7CiAgIH0KLSAgVkVSSUZZKCAoKChoaXN0LmNhc3Q8ZG91YmxlPigpL2RvdWJsZShmKSktMS4wKS5hYnMoKTwwLjAzKS5hbGwoKSApOworICBWRVJJRlkoKCgoaGlzdC5jYXN0PGRvdWJsZT4oKSAvIGRvdWJsZShmKSkgLSAxLjApLmFicygpIDwgMC4wMykuYWxsKCkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QocmFuZCkKLXsKLSAgbG9uZyBsb25nX3JlZiA9IE51bVRyYWl0czxsb25nPjo6aGlnaGVzdCgpLzEwOworRUlHRU5fREVDTEFSRV9URVNUKHJhbmQpIHsKKyAgbG9uZyBsb25nX3JlZiA9IE51bVRyYWl0czxsb25nPjo6aGlnaGVzdCgpIC8gMTA7CiAgIC8vIHRoZSBtaW5pbXVtIGd1YXJhbnRlZXMgdGhhdCB0aGVzZSBjb252ZXJzaW9ucyBhcmUgc2FmZQogICBhdXRvIGNoYXJfb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KChzdGQ6Om1pbikoZ19yZXBlYXQsIDY0KSk7CiAgIGF1dG8gc2hvcnRfb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8c2lnbmVkIHNob3J0Pigoc3RkOjptaW4pKGdfcmVwZWF0LCA4MDAwKSk7CiAKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0KjEwMDAwOyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8ZmxvYXQ+KDEwLDExKSk7Ci0gICAgQ0FMTF9TVUJURVNUKGNoZWNrX2luX3JhbmdlPGZsb2F0PigxLjI0MjM0NTIzZiwxLjI0MjM0NTIzZikpOwotICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxmbG9hdD4oLTEsMSkpOwotICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxmbG9hdD4oLTE0MzIuMjM1MmYsLTE0MzIuMjM1MmYpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdCAqIDEwMDAwOyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8ZmxvYXQ+KDEwLCAxMSkpOworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxmbG9hdD4oMS4yNDIzNDUyM2YsIDEuMjQyMzQ1MjNmKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2luX3JhbmdlPGZsb2F0PigtMSwgMSkpOworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxmbG9hdD4oLTE0MzIuMjM1MmYsIC0xNDMyLjIzNTJmKSk7CiAKLSAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8ZG91YmxlPigxMCwxMSkpOwotICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxkb3VibGU+KDEuMjQyMzQ1MjMsMS4yNDIzNDUyMykpOwotICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxkb3VibGU+KC0xLDEpKTsKLSAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8ZG91YmxlPigtMTQzMi4yMzUyLC0xNDMyLjIzNTIpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8ZG91YmxlPigxMCwgMTEpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8ZG91YmxlPigxLjI0MjM0NTIzLCAxLjI0MjM0NTIzKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2luX3JhbmdlPGRvdWJsZT4oLTEsIDEpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8ZG91YmxlPigtMTQzMi4yMzUyLCAtMTQzMi4yMzUyKSk7CiAKLSAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8aW50PigwLC0xKSk7Ci0gICAgQ0FMTF9TVUJURVNUKGNoZWNrX2luX3JhbmdlPHNob3J0PigwLC0xKSk7Ci0gICAgQ0FMTF9TVUJURVNUKGNoZWNrX2luX3JhbmdlPGxvbmc+KDAsLTEpKTsKLSAgICBDQUxMX1NVQlRFU1QoY2hlY2tfaW5fcmFuZ2U8aW50PigtNjczNDU2LDY3MzQ1NikpOwotICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxpbnQ+KC1SQU5EX01BWCsxMCxSQU5EX01BWC0xMCkpOwotICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxzaG9ydD4oLTI0MzQ1LDI0MzQ1KSk7Ci0gICAgQ0FMTF9TVUJURVNUKGNoZWNrX2luX3JhbmdlPGxvbmc+KC1sb25nX3JlZixsb25nX3JlZikpOworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxpbnQ+KDAsIC0xKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2luX3JhbmdlPHNob3J0PigwLCAtMSkpOworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxsb25nPigwLCAtMSkpOworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxpbnQ+KC02NzM0NTYsIDY3MzQ1NikpOworICAgIENBTExfU1VCVEVTVChjaGVja19pbl9yYW5nZTxpbnQ+KC1SQU5EX01BWCArIDEwLCBSQU5EX01BWCAtIDEwKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2luX3JhbmdlPHNob3J0PigtMjQzNDUsIDI0MzQ1KSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2luX3JhbmdlPGxvbmc+KC1sb25nX3JlZiwgbG9uZ19yZWYpKTsKICAgfQogCi0gIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8c2lnbmVkIGNoYXI+KDExLDExKSk7Ci0gIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8c2lnbmVkIGNoYXI+KDExLDExK2NoYXJfb2Zmc2V0KSk7Ci0gIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8c2lnbmVkIGNoYXI+KC01LDUpKTsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxzaWduZWQgY2hhcj4oLTExLWNoYXJfb2Zmc2V0LC0xMSkpOwotICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNpZ25lZCBjaGFyPigtMTI2LC0xMjYrY2hhcl9vZmZzZXQpKTsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxzaWduZWQgY2hhcj4oMTI2LWNoYXJfb2Zmc2V0LDEyNikpOwotICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNpZ25lZCBjaGFyPigtMTI2LDEyNikpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNpZ25lZCBjaGFyPigxMSwgMTEpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxzaWduZWQgY2hhcj4oMTEsIDExICsgY2hhcl9vZmZzZXQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxzaWduZWQgY2hhcj4oLTUsIDUpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxzaWduZWQgY2hhcj4oLTExIC0gY2hhcl9vZmZzZXQsIC0xMSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNpZ25lZCBjaGFyPigtMTI2LCAtMTI2ICsgY2hhcl9vZmZzZXQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxzaWduZWQgY2hhcj4oMTI2IC0gY2hhcl9vZmZzZXQsIDEyNikpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNpZ25lZCBjaGFyPigtMTI2LCAxMjYpKTsKIAotICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigxMSwxMSkpOwotICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigxMSwxMStzaG9ydF9vZmZzZXQpKTsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxzaG9ydD4oLTUsNSkpOwotICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigtMTEtc2hvcnRfb2Zmc2V0LC0xMSkpOwotICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigtMjQzNDUsLTI0MzQ1K3Nob3J0X29mZnNldCkpOwotICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigyNDM0NSwyNDM0NStzaG9ydF9vZmZzZXQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxzaG9ydD4oMTEsIDExKSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8c2hvcnQ+KDExLCAxMSArIHNob3J0X29mZnNldCkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigtNSwgNSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigtMTEgLSBzaG9ydF9vZmZzZXQsIC0xMSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigtMjQzNDUsIC0yNDM0NSArIHNob3J0X29mZnNldCkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPHNob3J0PigyNDM0NSwgMjQzNDUgKyBzaG9ydF9vZmZzZXQpKTsKIAotICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPGludD4oMTEsMTEpKTsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxpbnQ+KDExLDExK2dfcmVwZWF0KSk7Ci0gIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8aW50PigtNSw1KSk7Ci0gIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8aW50PigtMTEtZ19yZXBlYXQsLTExKSk7Ci0gIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8aW50PigtNjczNDU2LC02NzM0NTYrZ19yZXBlYXQpKTsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxpbnQ+KDY3MzQ1Niw2NzM0NTYrZ19yZXBlYXQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxpbnQ+KDExLCAxMSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPGludD4oMTEsIDExICsgZ19yZXBlYXQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxpbnQ+KC01LCA1KSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8aW50PigtMTEgLSBnX3JlcGVhdCwgLTExKSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8aW50PigtNjczNDU2LCAtNjczNDU2ICsgZ19yZXBlYXQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxpbnQ+KDY3MzQ1NiwgNjczNDU2ICsgZ19yZXBlYXQpKTsKIAotICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPGxvbmc+KDExLDExKSk7Ci0gIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8bG9uZz4oMTEsMTErZ19yZXBlYXQpKTsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxsb25nPigtNSw1KSk7Ci0gIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8bG9uZz4oLTExLWdfcmVwZWF0LC0xMSkpOwotICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPGxvbmc+KC1sb25nX3JlZiwtbG9uZ19yZWYrZ19yZXBlYXQpKTsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxsb25nPiggbG9uZ19yZWYsIGxvbmdfcmVmK2dfcmVwZWF0KSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8bG9uZz4oMTEsIDExKSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8bG9uZz4oMTEsIDExICsgZ19yZXBlYXQpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxsb25nPigtNSwgNSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfYWxsX2luX3JhbmdlPGxvbmc+KC0xMSAtIGdfcmVwZWF0LCAtMTEpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2FsbF9pbl9yYW5nZTxsb25nPigtbG9uZ19yZWYsIC1sb25nX3JlZiArIGdfcmVwZWF0KSk7CisgIENBTExfU1VCVEVTVChjaGVja19hbGxfaW5fcmFuZ2U8bG9uZz4obG9uZ19yZWYsIGxvbmdfcmVmICsgZ19yZXBlYXQpKTsKIAotICBDQUxMX1NVQlRFU1QoY2hlY2tfaGlzdG9ncmFtPGludD4oLTUsNSwxMSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfaGlzdG9ncmFtPGludD4oLTUsIDUsIDExKSk7CiAgIGludCBiaW5zID0gMTAwOwotICBDQUxMX1NVQlRFU1QoY2hlY2tfaGlzdG9ncmFtPGludD4oLTMzMzMsLTMzMzMrYmlucyooMzMzMy9iaW5zKS0xLGJpbnMpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2hpc3RvZ3JhbTxpbnQ+KC0zMzMzLCAtMzMzMyArIGJpbnMgKiAoMzMzMyAvIGJpbnMpIC0gMSwgYmlucykpOwogICBiaW5zID0gMTAwMDsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX2hpc3RvZ3JhbTxpbnQ+KC1SQU5EX01BWCsxMCwtUkFORF9NQVgrMTArYmlucyooUkFORF9NQVgvYmlucyktMSxiaW5zKSk7Ci0gIENBTExfU1VCVEVTVChjaGVja19oaXN0b2dyYW08aW50PigtUkFORF9NQVgrMTAsLWludDY0KFJBTkRfTUFYKSsxMCtiaW5zKigyKmludDY0KFJBTkRfTUFYKS9iaW5zKS0xLGJpbnMpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2hpc3RvZ3JhbTxpbnQ+KC1SQU5EX01BWCArIDEwLCAtUkFORF9NQVggKyAxMCArIGJpbnMgKiAoUkFORF9NQVggLyBiaW5zKSAtIDEsIGJpbnMpKTsKKyAgQ0FMTF9TVUJURVNUKAorICAgICAgY2hlY2tfaGlzdG9ncmFtPGludD4oLVJBTkRfTUFYICsgMTAsIC1pbnQ2NChSQU5EX01BWCkgKyAxMCArIGJpbnMgKiAoMiAqIGludDY0KFJBTkRfTUFYKSAvIGJpbnMpIC0gMSwgYmlucykpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9yYW5kb21fbWF0cml4LmNwcCBiL3Rlc3QvcmFuZG9tX21hdHJpeC5jcHAKaW5kZXggYTkxNGFmMS4uZTk1Y2E0NyAxMDA2NDQKLS0tIGEvdGVzdC9yYW5kb21fbWF0cml4LmNwcAorKysgYi90ZXN0L3JhbmRvbV9tYXRyaXguY3BwCkBAIC0xMCwxMDUgKzEwLDk1IEBACiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgPEVpZ2VuL1NWRD4KIAordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX2dlbmVyYXRlUmFuZG9tVW5pdGFyeU1hdHJpeChjb25zdCBJbmRleCBkaW0pIHsKKyAgY29uc3QgTWF0cml4VHlwZSBRID0gZ2VuZXJhdGVSYW5kb21Vbml0YXJ5TWF0cml4PE1hdHJpeFR5cGU+KGRpbSk7CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIGNoZWNrX2dlbmVyYXRlUmFuZG9tVW5pdGFyeU1hdHJpeChjb25zdCBJbmRleCBkaW0pCi17Ci0gICAgY29uc3QgTWF0cml4VHlwZSBRID0gZ2VuZXJhdGVSYW5kb21Vbml0YXJ5TWF0cml4PE1hdHJpeFR5cGU+KGRpbSk7CisgIC8vIHZhbGlkYXRlIGRpbWVuc2lvbnMKKyAgVkVSSUZZX0lTX0VRVUFMKFEucm93cygpLCBkaW0pOworICBWRVJJRllfSVNfRVFVQUwoUS5jb2xzKCksIGRpbSk7CiAKLSAgICAvLyB2YWxpZGF0ZSBkaW1lbnNpb25zCi0gICAgVkVSSUZZX0lTX0VRVUFMKFEucm93cygpLCBkaW0pOwotICAgIFZFUklGWV9JU19FUVVBTChRLmNvbHMoKSwgZGltKTsKLQotICAgIFZFUklGWV9JU19VTklUQVJZKFEpOworICBWRVJJRllfSVNfVU5JVEFSWShRKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZSwgdHlwZW5hbWUgUmVhbFNjYWxhclR5cGU+Ci12b2lkIGNoZWNrX3NldHVwUmFuZG9tU3ZzKGNvbnN0IEluZGV4IGRpbSwgY29uc3QgUmVhbFNjYWxhclR5cGUgbWF4KQotewotICAgIGNvbnN0IFZlY3RvclR5cGUgdiA9IHNldHVwUmFuZG9tU3ZzPFZlY3RvclR5cGUsIFJlYWxTY2FsYXJUeXBlPihkaW0sIG1heCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZSwgdHlwZW5hbWUgUmVhbFNjYWxhclR5cGU+Cit2b2lkIGNoZWNrX3NldHVwUmFuZG9tU3ZzKGNvbnN0IEluZGV4IGRpbSwgY29uc3QgUmVhbFNjYWxhclR5cGUgbWF4KSB7CisgIGNvbnN0IFZlY3RvclR5cGUgdiA9IHNldHVwUmFuZG9tU3ZzPFZlY3RvclR5cGUsIFJlYWxTY2FsYXJUeXBlPihkaW0sIG1heCk7CiAKLSAgICAvLyB2YWxpZGF0ZSBkaW1lbnNpb25zCi0gICAgVkVSSUZZX0lTX0VRVUFMKHYuc2l6ZSgpLCBkaW0pOworICAvLyB2YWxpZGF0ZSBkaW1lbnNpb25zCisgIFZFUklGWV9JU19FUVVBTCh2LnNpemUoKSwgZGltKTsKIAotICAgIC8vIGNoZWNrIGVudHJpZXMKLSAgICBmb3IoSW5kZXggaSA9IDA7IGkgPCB2LnNpemUoKTsgKytpKQotICAgICAgICBWRVJJRllfR0UodihpKSwgMCk7Ci0gICAgZm9yKEluZGV4IGkgPSAwOyBpIDwgdi5zaXplKCktMTsgKytpKQotICAgICAgICBWRVJJRllfR0UodihpKSwgdihpKzEpKTsKKyAgLy8gY2hlY2sgZW50cmllcworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgdi5zaXplKCk7ICsraSkgVkVSSUZZX0dFKHYoaSksIDApOworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgdi5zaXplKCkgLSAxOyArK2kpIFZFUklGWV9HRSh2KGkpLCB2KGkgKyAxKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGUsIHR5cGVuYW1lIFJlYWxTY2FsYXJUeXBlPgotdm9pZCBjaGVja19zZXR1cFJhbmdlU3ZzKGNvbnN0IEluZGV4IGRpbSwgY29uc3QgUmVhbFNjYWxhclR5cGUgbWluLCBjb25zdCBSZWFsU2NhbGFyVHlwZSBtYXgpCi17Ci0gICAgY29uc3QgVmVjdG9yVHlwZSB2ID0gc2V0dXBSYW5nZVN2czxWZWN0b3JUeXBlLCBSZWFsU2NhbGFyVHlwZT4oZGltLCBtaW4sIG1heCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZSwgdHlwZW5hbWUgUmVhbFNjYWxhclR5cGU+Cit2b2lkIGNoZWNrX3NldHVwUmFuZ2VTdnMoY29uc3QgSW5kZXggZGltLCBjb25zdCBSZWFsU2NhbGFyVHlwZSBtaW4sIGNvbnN0IFJlYWxTY2FsYXJUeXBlIG1heCkgeworICBjb25zdCBWZWN0b3JUeXBlIHYgPSBzZXR1cFJhbmdlU3ZzPFZlY3RvclR5cGUsIFJlYWxTY2FsYXJUeXBlPihkaW0sIG1pbiwgbWF4KTsKIAotICAgIC8vIHZhbGlkYXRlIGRpbWVuc2lvbnMKLSAgICBWRVJJRllfSVNfRVFVQUwodi5zaXplKCksIGRpbSk7CisgIC8vIHZhbGlkYXRlIGRpbWVuc2lvbnMKKyAgVkVSSUZZX0lTX0VRVUFMKHYuc2l6ZSgpLCBkaW0pOwogCi0gICAgLy8gY2hlY2sgZW50cmllcwotICAgIGlmKGRpbSA9PSAxKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1godigwKSwgbWluKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHYoMCksIG1heCk7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1godihkaW0tMSksIG1pbik7Ci0gICAgfQotICAgIGZvcihJbmRleCBpID0gMDsgaSA8IHYuc2l6ZSgpLTE7ICsraSkKLSAgICAgICAgVkVSSUZZX0dFKHYoaSksIHYoaSsxKSk7CisgIC8vIGNoZWNrIGVudHJpZXMKKyAgaWYgKGRpbSA9PSAxKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2KDApLCBtaW4pOworICB9IGVsc2UgeworICAgIFZFUklGWV9JU19BUFBST1godigwKSwgbWF4KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYoZGltIC0gMSksIG1pbik7CisgIH0KKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IHYuc2l6ZSgpIC0gMTsgKytpKSBWRVJJRllfR0UodihpKSwgdihpICsgMSkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSZWFsU2NhbGFyLCB0eXBlbmFtZSBSZWFsVmVjdG9yVHlwZT4KLXZvaWQgY2hlY2tfZ2VuZXJhdGVSYW5kb21NYXRyaXhTdnMoY29uc3QgSW5kZXggcm93cywgY29uc3QgSW5kZXggY29scywgY29uc3QgSW5kZXggZGlhZ19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFsU2NhbGFyIG1pbl9zdnMsIGNvbnN0IFJlYWxTY2FsYXIgbWF4X3N2cykKLXsKLSAgICBSZWFsVmVjdG9yVHlwZSBzdnMgPSBzZXR1cFJhbmdlU3ZzPFJlYWxWZWN0b3JUeXBlLCBSZWFsU2NhbGFyPihkaWFnX3NpemUsIG1pbl9zdnMsIG1heF9zdnMpOwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFJlYWxTY2FsYXIsIHR5cGVuYW1lIFJlYWxWZWN0b3JUeXBlPgordm9pZCBjaGVja19nZW5lcmF0ZVJhbmRvbU1hdHJpeFN2cyhjb25zdCBJbmRleCByb3dzLCBjb25zdCBJbmRleCBjb2xzLCBjb25zdCBJbmRleCBkaWFnX3NpemUsIGNvbnN0IFJlYWxTY2FsYXIgbWluX3N2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhbFNjYWxhciBtYXhfc3ZzKSB7CisgIFJlYWxWZWN0b3JUeXBlIHN2cyA9IHNldHVwUmFuZ2VTdnM8UmVhbFZlY3RvclR5cGUsIFJlYWxTY2FsYXI+KGRpYWdfc2l6ZSwgbWluX3N2cywgbWF4X3N2cyk7CiAKLSAgICBNYXRyaXhUeXBlIE0gPSBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpOwotICAgIGdlbmVyYXRlUmFuZG9tTWF0cml4U3ZzKHN2cywgcm93cywgY29scywgTSk7CisgIE1hdHJpeFR5cGUgTSA9IE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scyk7CisgIGdlbmVyYXRlUmFuZG9tTWF0cml4U3ZzKHN2cywgcm93cywgY29scywgTSk7CiAKLSAgICAvLyB2YWxpZGF0ZSBkaW1lbnNpb25zCi0gICAgVkVSSUZZX0lTX0VRVUFMKE0ucm93cygpLCByb3dzKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoTS5jb2xzKCksIGNvbHMpOwotICAgIFZFUklGWV9JU19FUVVBTChzdnMuc2l6ZSgpLCBkaWFnX3NpemUpOworICAvLyB2YWxpZGF0ZSBkaW1lbnNpb25zCisgIFZFUklGWV9JU19FUVVBTChNLnJvd3MoKSwgcm93cyk7CisgIFZFUklGWV9JU19FUVVBTChNLmNvbHMoKSwgY29scyk7CisgIFZFUklGWV9JU19FUVVBTChzdnMuc2l6ZSgpLCBkaWFnX3NpemUpOwogCi0gICAgLy8gdmFsaWRhdGUgc2luZ3VsYXIgdmFsdWVzCi0gICAgRWlnZW46OkphY29iaVNWRDxNYXRyaXhUeXBlPiBTVkQoTSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChzdnMsIFNWRC5zaW5ndWxhclZhbHVlcygpKTsKKyAgLy8gdmFsaWRhdGUgc2luZ3VsYXIgdmFsdWVzCisgIEVpZ2VuOjpKYWNvYmlTVkQ8TWF0cml4VHlwZT4gU1ZEKE0pOworICBWRVJJRllfSVNfQVBQUk9YKHN2cywgU1ZELnNpbmd1bGFyVmFsdWVzKCkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCBjaGVja19yYW5kb21fbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUgJm0pCi17Ci0gICAgZW51bSB7Ci0gICAgICAgIFJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKLSAgICAgICAgQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLAotICAgICAgICBEaWFnU2l6ZSA9IGludGVybmFsOjptaW5fc2l6ZV9wcmVmZXJfZHluYW1pYyhSb3dzLCBDb2xzKQotICAgIH07Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKLSAgICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBEaWFnU2l6ZSwgMT4gUmVhbFZlY3RvclR5cGU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY2hlY2tfcmFuZG9tX21hdHJpeChjb25zdCBNYXRyaXhUeXBlICZtKSB7CisgIGVudW0geworICAgIFJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwKKyAgICBDb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsCisgICAgRGlhZ1NpemUgPSBpbnRlcm5hbDo6bWluX3NpemVfcHJlZmVyX2R5bmFtaWMoUm93cywgQ29scykKKyAgfTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOworICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIERpYWdTaXplLCAxPiBSZWFsVmVjdG9yVHlwZTsKIAotICAgIGNvbnN0IEluZGV4IHJvd3MgPSBtLnJvd3MoKSwgY29scyA9IG0uY29scygpOwotICAgIGNvbnN0IEluZGV4IGRpYWdfc2l6ZSA9IChzdGQ6Om1pbikocm93cywgY29scyk7Ci0gICAgY29uc3QgUmVhbFNjYWxhciBtaW5fc3ZzID0gMS4wLCBtYXhfc3ZzID0gMTAwMC4wOworICBjb25zdCBJbmRleCByb3dzID0gbS5yb3dzKCksIGNvbHMgPSBtLmNvbHMoKTsKKyAgY29uc3QgSW5kZXggZGlhZ19zaXplID0gKHN0ZDo6bWluKShyb3dzLCBjb2xzKTsKKyAgY29uc3QgUmVhbFNjYWxhciBtaW5fc3ZzID0gMS4wLCBtYXhfc3ZzID0gMTAwMC4wOwogCi0gICAgLy8gY2hlY2sgZ2VuZXJhdGlvbiBvZiB1bml0YXJ5IHJhbmRvbSBtYXRyaWNlcwotICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93cywgUm93cz4gTWF0cml4QVR5cGU7Ci0gICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBDb2xzLCBDb2xzPiBNYXRyaXhCVHlwZTsKLSAgICBjaGVja19nZW5lcmF0ZVJhbmRvbVVuaXRhcnlNYXRyaXg8TWF0cml4QVR5cGU+KHJvd3MpOwotICAgIGNoZWNrX2dlbmVyYXRlUmFuZG9tVW5pdGFyeU1hdHJpeDxNYXRyaXhCVHlwZT4oY29scyk7CisgIC8vIGNoZWNrIGdlbmVyYXRpb24gb2YgdW5pdGFyeSByYW5kb20gbWF0cmljZXMKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzLCBSb3dzPiBNYXRyaXhBVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBDb2xzLCBDb2xzPiBNYXRyaXhCVHlwZTsKKyAgY2hlY2tfZ2VuZXJhdGVSYW5kb21Vbml0YXJ5TWF0cml4PE1hdHJpeEFUeXBlPihyb3dzKTsKKyAgY2hlY2tfZ2VuZXJhdGVSYW5kb21Vbml0YXJ5TWF0cml4PE1hdHJpeEJUeXBlPihjb2xzKTsKIAotICAgIC8vIHRlc3QgZ2VuZXJhdG9ycyBmb3Igc2luZ3VsYXIgdmFsdWVzCi0gICAgY2hlY2tfc2V0dXBSYW5kb21TdnM8UmVhbFZlY3RvclR5cGUsIFJlYWxTY2FsYXI+KGRpYWdfc2l6ZSwgbWF4X3N2cyk7Ci0gICAgY2hlY2tfc2V0dXBSYW5nZVN2czxSZWFsVmVjdG9yVHlwZSwgUmVhbFNjYWxhcj4oZGlhZ19zaXplLCBtaW5fc3ZzLCBtYXhfc3ZzKTsKKyAgLy8gdGVzdCBnZW5lcmF0b3JzIGZvciBzaW5ndWxhciB2YWx1ZXMKKyAgY2hlY2tfc2V0dXBSYW5kb21TdnM8UmVhbFZlY3RvclR5cGUsIFJlYWxTY2FsYXI+KGRpYWdfc2l6ZSwgbWF4X3N2cyk7CisgIGNoZWNrX3NldHVwUmFuZ2VTdnM8UmVhbFZlY3RvclR5cGUsIFJlYWxTY2FsYXI+KGRpYWdfc2l6ZSwgbWluX3N2cywgbWF4X3N2cyk7CiAKLSAgICAvLyBjaGVjayBnZW5lcmF0aW9uIG9mIHJhbmRvbSBtYXRyaWNlcwotICAgIGNoZWNrX2dlbmVyYXRlUmFuZG9tTWF0cml4U3ZzPE1hdHJpeFR5cGUsIFJlYWxTY2FsYXIsIFJlYWxWZWN0b3JUeXBlPihyb3dzLCBjb2xzLCBkaWFnX3NpemUsIG1pbl9zdnMsIG1heF9zdnMpOworICAvLyBjaGVjayBnZW5lcmF0aW9uIG9mIHJhbmRvbSBtYXRyaWNlcworICBjaGVja19nZW5lcmF0ZVJhbmRvbU1hdHJpeFN2czxNYXRyaXhUeXBlLCBSZWFsU2NhbGFyLCBSZWFsVmVjdG9yVHlwZT4ocm93cywgY29scywgZGlhZ19zaXplLCBtaW5fc3ZzLCBtYXhfc3ZzKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHJhbmRvbV9tYXRyaXgpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CitFSUdFTl9ERUNMQVJFX1RFU1QocmFuZG9tX21hdHJpeCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKICAgICBDQUxMX1NVQlRFU1RfMShjaGVja19yYW5kb21fbWF0cml4KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOwogICAgIENBTExfU1VCVEVTVF8yKGNoZWNrX3JhbmRvbV9tYXRyaXgoTWF0cml4PGZsb2F0LCA0LCA0PigpKSk7CiAgICAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfcmFuZG9tX21hdHJpeChNYXRyaXg8ZmxvYXQsIDIsIDM+KCkpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvcmFuZG9tX21hdHJpeF9oZWxwZXIuaCBiL3Rlc3QvcmFuZG9tX21hdHJpeF9oZWxwZXIuaAppbmRleCA3MzNkZWM1Li44MThkNjg2IDEwMDY0NAotLS0gYS90ZXN0L3JhbmRvbV9tYXRyaXhfaGVscGVyLmgKKysrIGIvdGVzdC9yYW5kb21fbWF0cml4X2hlbHBlci5oCkBAIC0xMywzOCArMTMsMzUgQEAKICNkZWZpbmUgRUlHRU5fUkFORE9NX01BVFJJWF9IRUxQRVIKIAogI2luY2x1ZGUgPHR5cGVpbmZvPgotI2luY2x1ZGUgPEVpZ2VuL1FSPiAvLyByZXF1aXJlZCBmb3IgY3JlYXRlUmFuZG9tUElNYXRyaXhPZlJhbmsgYW5kIGdlbmVyYXRlUmFuZG9tTWF0cml4U3ZzCi0KKyNpbmNsdWRlIDxFaWdlbi9RUj4gIC8vIHJlcXVpcmVkIGZvciBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayBhbmQgZ2VuZXJhdGVSYW5kb21NYXRyaXhTdnMKIAogLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgdG8gYXZvaWQgSUNDIHdhcm5pbmdzCiAjaWYgRUlHRU5fQ09NUF9JQ0MKIAogbmFtZXNwYWNlIEVpZ2VuIHsKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgogdm9pZCBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhJbmRleCBkZXNpcmVkX3JhbmssIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIE1hdHJpeFR5cGUmIG0pOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBQZXJtdXRhdGlvblZlY3RvclR5cGU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGVybXV0YXRpb25WZWN0b3JUeXBlPgogdm9pZCByYW5kb21QZXJtdXRhdGlvblZlY3RvcihQZXJtdXRhdGlvblZlY3RvclR5cGUmIHYsIEluZGV4IHNpemUpOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CiBNYXRyaXhUeXBlIGdlbmVyYXRlUmFuZG9tVW5pdGFyeU1hdHJpeChjb25zdCBJbmRleCBkaW0pOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBSZWFsU2NhbGFyVmVjdG9yVHlwZT4KLXZvaWQgZ2VuZXJhdGVSYW5kb21NYXRyaXhTdnMoY29uc3QgUmVhbFNjYWxhclZlY3RvclR5cGUgJnN2cywgY29uc3QgSW5kZXggcm93cywgY29uc3QgSW5kZXggY29scywgTWF0cml4VHlwZSYgTSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVhbFNjYWxhclZlY3RvclR5cGU+Cit2b2lkIGdlbmVyYXRlUmFuZG9tTWF0cml4U3ZzKGNvbnN0IFJlYWxTY2FsYXJWZWN0b3JUeXBlJiBzdnMsIGNvbnN0IEluZGV4IHJvd3MsIGNvbnN0IEluZGV4IGNvbHMsIE1hdHJpeFR5cGUmIE0pOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlLCB0eXBlbmFtZSBSZWFsU2NhbGFyPgordGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvclR5cGUsIHR5cGVuYW1lIFJlYWxTY2FsYXI+CiBWZWN0b3JUeXBlIHNldHVwUmFuZG9tU3ZzKGNvbnN0IEluZGV4IGRpbSwgY29uc3QgUmVhbFNjYWxhciBtYXgpOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlLCB0eXBlbmFtZSBSZWFsU2NhbGFyPgordGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvclR5cGUsIHR5cGVuYW1lIFJlYWxTY2FsYXI+CiBWZWN0b3JUeXBlIHNldHVwUmFuZ2VTdnMoY29uc3QgSW5kZXggZGltLCBjb25zdCBSZWFsU2NhbGFyIG1pbiwgY29uc3QgUmVhbFNjYWxhciBtYXgpOwogCi19IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KK30gIC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KIAogI2VuZGlmICAvLyBFSUdFTl9DT01QX0lDQwogCi0KLQogbmFtZXNwYWNlIEVpZ2VuIHsKIAogLyoqCkBAIC01OSw5ICs1Niw4IEBACiAgKiBAcGFyYW0gY29scyBjb2x1bW4gZGltZW5zaW9uIG9mIHJlcXVlc3RlZCByYW5kb20gcGFydGlhbCBpc29tZXRyeSBtYXRyaXgKICAqIEBwYXJhbSBtIHJhbmRvbSBwYXJ0aWFsIGlzb21ldHJ5IG1hdHJpeAogICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhJbmRleCBkZXNpcmVkX3JhbmssIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY3JlYXRlUmFuZG9tUElNYXRyaXhPZlJhbmsoSW5kZXggZGVzaXJlZF9yYW5rLCBJbmRleCByb3dzLCBJbmRleCBjb2xzLCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKICAgZW51bSB7IFJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIH07CiAKQEAgLTY5LDI3ICs2NSwyNSBAQAogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3MsIFJvd3M+IE1hdHJpeEFUeXBlOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHMsIENvbHM+IE1hdHJpeEJUeXBlOwogCi0gIGlmKGRlc2lyZWRfcmFuayA9PSAwKQotICB7Ci0gICAgbS5zZXRaZXJvKHJvd3MsY29scyk7CisgIGlmIChkZXNpcmVkX3JhbmsgPT0gMCkgeworICAgIG0uc2V0WmVybyhyb3dzLCBjb2xzKTsKICAgICByZXR1cm47CiAgIH0KIAotICBpZihkZXNpcmVkX3JhbmsgPT0gMSkKLSAgeworICBpZiAoZGVzaXJlZF9yYW5rID09IDEpIHsKICAgICAvLyBoZXJlIHdlIG5vcm1hbGl6ZSB0aGUgdmVjdG9ycyB0byBnZXQgYSBwYXJ0aWFsIGlzb21ldHJ5CiAgICAgbSA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKS5ub3JtYWxpemVkKCkgKiBWZWN0b3JUeXBlOjpSYW5kb20oY29scykubm9ybWFsaXplZCgpLnRyYW5zcG9zZSgpOwogICAgIHJldHVybjsKICAgfQogCi0gIE1hdHJpeEFUeXBlIGEgPSBNYXRyaXhBVHlwZTo6UmFuZG9tKHJvd3Mscm93cyk7Ci0gIE1hdHJpeFR5cGUgZCA9IE1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsY29scyk7Ci0gIE1hdHJpeEJUeXBlICBiID0gTWF0cml4QlR5cGU6OlJhbmRvbShjb2xzLGNvbHMpOworICBNYXRyaXhBVHlwZSBhID0gTWF0cml4QVR5cGU6OlJhbmRvbShyb3dzLCByb3dzKTsKKyAgTWF0cml4VHlwZSBkID0gTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgY29scyk7CisgIE1hdHJpeEJUeXBlIGIgPSBNYXRyaXhCVHlwZTo6UmFuZG9tKGNvbHMsIGNvbHMpOwogCiAgIC8vIHNldCB0aGUgZGlhZ29uYWwgc3VjaCB0aGF0IG9ubHkgZGVzaXJlZF9yYW5rIG5vbi16ZXJvIGVudHJpZXMgcmVtYWluCi0gIGNvbnN0IEluZGV4IGRpYWdfc2l6ZSA9IChzdGQ6Om1pbikoZC5yb3dzKCksZC5jb2xzKCkpOwotICBpZihkaWFnX3NpemUgIT0gZGVzaXJlZF9yYW5rKQotICAgIGQuZGlhZ29uYWwoKS5zZWdtZW50KGRlc2lyZWRfcmFuaywgZGlhZ19zaXplLWRlc2lyZWRfcmFuaykgPSBWZWN0b3JUeXBlOjpaZXJvKGRpYWdfc2l6ZS1kZXNpcmVkX3JhbmspOworICBjb25zdCBJbmRleCBkaWFnX3NpemUgPSAoc3RkOjptaW4pKGQucm93cygpLCBkLmNvbHMoKSk7CisgIGlmIChkaWFnX3NpemUgIT0gZGVzaXJlZF9yYW5rKQorICAgIGQuZGlhZ29uYWwoKS5zZWdtZW50KGRlc2lyZWRfcmFuaywgZGlhZ19zaXplIC0gZGVzaXJlZF9yYW5rKSA9IFZlY3RvclR5cGU6Olplcm8oZGlhZ19zaXplIC0gZGVzaXJlZF9yYW5rKTsKIAogICBIb3VzZWhvbGRlclFSPE1hdHJpeEFUeXBlPiBxcmEoYSk7CiAgIEhvdXNlaG9sZGVyUVI8TWF0cml4QlR5cGU+IHFyYihiKTsKQEAgLTEwMywxOCArOTcsMTcgQEAKICAqIEBwYXJhbSB2IHBlcm11dGF0aW9uIHZlY3RvcgogICogQHBhcmFtIHNpemUgbGVuZ3RoIG9mIHBlcm11dGF0aW9uIHZlY3RvcgogICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBQZXJtdXRhdGlvblZlY3RvclR5cGU+Ci12b2lkIHJhbmRvbVBlcm11dGF0aW9uVmVjdG9yKFBlcm11dGF0aW9uVmVjdG9yVHlwZSYgdiwgSW5kZXggc2l6ZSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBQZXJtdXRhdGlvblZlY3RvclR5cGU+Cit2b2lkIHJhbmRvbVBlcm11dGF0aW9uVmVjdG9yKFBlcm11dGF0aW9uVmVjdG9yVHlwZSYgdiwgSW5kZXggc2l6ZSkgewogICB0eXBlZGVmIHR5cGVuYW1lIFBlcm11dGF0aW9uVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdi5yZXNpemUoc2l6ZSk7Ci0gIGZvcihJbmRleCBpID0gMDsgaSA8IHNpemU7ICsraSkgdihpKSA9IFNjYWxhcihpKTsKLSAgaWYoc2l6ZSA9PSAxKSByZXR1cm47Ci0gIGZvcihJbmRleCBuID0gMDsgbiA8IDMgKiBzaXplOyArK24pCi0gIHsKLSAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgc2l6ZS0xKTsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IHNpemU7ICsraSkgdihpKSA9IFNjYWxhcihpKTsKKyAgaWYgKHNpemUgPT0gMSkgcmV0dXJuOworICBmb3IgKEluZGV4IG4gPSAwOyBuIDwgMyAqIHNpemU7ICsrbikgeworICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBzaXplIC0gMSk7CiAgICAgSW5kZXggajsKLSAgICBkbyBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgc2l6ZS0xKTsgd2hpbGUoaj09aSk7CisgICAgZG8gaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHNpemUgLSAxKTsKKyAgICB3aGlsZSAoaiA9PSBpKTsKICAgICBzdGQ6OnN3YXAodihpKSwgdihqKSk7CiAgIH0KIH0KQEAgLTEyOSwxNiArMTIyLDE0IEBACiAgKiBAcGFyYW0gZGltIHJvdyBhbmQgY29sdW1uIGRpbWVuc2lvbiBvZiB0aGUgcmVxdWVzdGVkIHNxdWFyZSBtYXRyaXgKICAqIEByZXR1cm4gcmFuZG9tIHVuaXRhcnkgbWF0cml4CiAgKi8KLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci1NYXRyaXhUeXBlIGdlbmVyYXRlUmFuZG9tVW5pdGFyeU1hdHJpeChjb25zdCBJbmRleCBkaW0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK01hdHJpeFR5cGUgZ2VuZXJhdGVSYW5kb21Vbml0YXJ5TWF0cml4KGNvbnN0IEluZGV4IGRpbSkgewogICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gVmVjdG9yVHlwZTsKIAogICBNYXRyaXhUeXBlIHYgPSBNYXRyaXhUeXBlOjpJZGVudGl0eShkaW0sIGRpbSk7CiAgIFZlY3RvclR5cGUgaCA9IFZlY3RvclR5cGU6Olplcm8oZGltKTsKLSAgZm9yIChJbmRleCBpID0gMDsgaSA8IGRpbTsgKytpKQotICB7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBkaW07ICsraSkgewogICAgIHYuY29sKGkpLnRhaWwoZGltIC0gaSAtIDEpID0gVmVjdG9yVHlwZTo6UmFuZG9tKGRpbSAtIGkgLSAxKTsKICAgICBoKGkpID0gMiAvIHYuY29sKGkpLnRhaWwoZGltIC0gaSkuc3F1YXJlZE5vcm0oKTsKICAgfQpAQCAtMTc0LDkgKzE2NSw4IEBACiAgKiBAcGFyYW0gY29scyBjb2x1bW4gZGltZW5zaW9uIG9mIHJlcXVlc3RlZCByYW5kb20gbWF0cml4CiAgKiBAcGFyYW0gTSBnZW5lcmF0ZWQgbWF0cml4IHdpdGggcHJlc2NyaWJlZCBzaW5ndWxhciB2YWx1ZXMKICAqLwotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVhbFNjYWxhclZlY3RvclR5cGU+Ci12b2lkIGdlbmVyYXRlUmFuZG9tTWF0cml4U3ZzKGNvbnN0IFJlYWxTY2FsYXJWZWN0b3JUeXBlICZzdnMsIGNvbnN0IEluZGV4IHJvd3MsIGNvbnN0IEluZGV4IGNvbHMsIE1hdHJpeFR5cGUmIE0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgUmVhbFNjYWxhclZlY3RvclR5cGU+Cit2b2lkIGdlbmVyYXRlUmFuZG9tTWF0cml4U3ZzKGNvbnN0IFJlYWxTY2FsYXJWZWN0b3JUeXBlJiBzdnMsIGNvbnN0IEluZGV4IHJvd3MsIGNvbnN0IEluZGV4IGNvbHMsIE1hdHJpeFR5cGUmIE0pIHsKICAgZW51bSB7IFJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIH07CiAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzLCBSb3dzPiBNYXRyaXhBVHlwZTsKQEAgLTIwNiw5ICsxOTYsOCBAQAogICogQHBhcmFtIG1heCB1cHBlciBib3VuZCBmb3Igc2luZ3VsYXIgdmFsdWVzCiAgKiBAcmV0dXJuIHZlY3RvciBvZiBzaW5ndWxhciB2YWx1ZXMKICAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZSwgdHlwZW5hbWUgUmVhbFNjYWxhcj4KLVZlY3RvclR5cGUgc2V0dXBSYW5kb21TdnMoY29uc3QgSW5kZXggZGltLCBjb25zdCBSZWFsU2NhbGFyIG1heCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JUeXBlLCB0eXBlbmFtZSBSZWFsU2NhbGFyPgorVmVjdG9yVHlwZSBzZXR1cFJhbmRvbVN2cyhjb25zdCBJbmRleCBkaW0sIGNvbnN0IFJlYWxTY2FsYXIgbWF4KSB7CiAgIFZlY3RvclR5cGUgc3ZzID0gbWF4IC8gUmVhbFNjYWxhcigyKSAqIChWZWN0b3JUeXBlOjpSYW5kb20oZGltKSArIFZlY3RvclR5cGU6Ok9uZXMoZGltKSk7CiAgIHN0ZDo6c29ydChzdnMuYmVnaW4oKSwgc3ZzLmVuZCgpLCBzdGQ6OmdyZWF0ZXI8UmVhbFNjYWxhcj4oKSk7CiAgIHJldHVybiBzdnM7CkBAIC0yMzIsMTQgKzIyMSwxMSBAQAogICogQHBhcmFtIG1heCBsYXJnZXN0IHNpbmd1bGFyIHZhbHVlIHRvIHVzZQogICogQHJldHVybiB2ZWN0b3Igb2Ygc2luZ3VsYXIgdmFsdWVzCiAgKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGUsIHR5cGVuYW1lIFJlYWxTY2FsYXI+Ci1WZWN0b3JUeXBlIHNldHVwUmFuZ2VTdnMoY29uc3QgSW5kZXggZGltLCBjb25zdCBSZWFsU2NhbGFyIG1pbiwgY29uc3QgUmVhbFNjYWxhciBtYXgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZSwgdHlwZW5hbWUgUmVhbFNjYWxhcj4KK1ZlY3RvclR5cGUgc2V0dXBSYW5nZVN2cyhjb25zdCBJbmRleCBkaW0sIGNvbnN0IFJlYWxTY2FsYXIgbWluLCBjb25zdCBSZWFsU2NhbGFyIG1heCkgewogICBWZWN0b3JUeXBlIHN2cyA9IFZlY3RvclR5cGU6OlJhbmRvbShkaW0pOwotICBpZihkaW0gPT0gMCkKLSAgICByZXR1cm4gc3ZzOwotICBpZihkaW0gPT0gMSkKLSAgeworICBpZiAoZGltID09IDApIHJldHVybiBzdnM7CisgIGlmIChkaW0gPT0gMSkgewogICAgIHN2cygwKSA9IG1pbjsKICAgICByZXR1cm4gc3ZzOwogICB9CkBAIC0yNTEsNiArMjM3LDYgQEAKICAgcmV0dXJuIG1pbiAqIChWZWN0b3JUeXBlOjpPbmVzKGRpbSkgLSBzdnMpICsgbWF4ICogc3ZzOwogfQogCi19IC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KK30gIC8vIGVuZCBuYW1lc3BhY2UgRWlnZW4KIAotI2VuZGlmIC8vIEVJR0VOX1JBTkRPTV9NQVRSSVhfSEVMUEVSCisjZW5kaWYgIC8vIEVJR0VOX1JBTkRPTV9NQVRSSVhfSEVMUEVSCmRpZmYgLS1naXQgYS90ZXN0L3JhbmRvbV93aXRob3V0X2Nhc3Rfb3ZlcmZsb3cuaCBiL3Rlc3QvcmFuZG9tX3dpdGhvdXRfY2FzdF9vdmVyZmxvdy5oCmluZGV4IDcxNWJiOGUuLjQxOGYyMWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvcmFuZG9tX3dpdGhvdXRfY2FzdF9vdmVyZmxvdy5oCisrKyBiL3Rlc3QvcmFuZG9tX3dpdGhvdXRfY2FzdF9vdmVyZmxvdy5oCkBAIC0yMywxMSArMjMsMTEgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTcmNTY2FsYXIsIHR5cGVuYW1lIFRndFNjYWxhcj4KIHN0cnVjdCByYW5kb21fd2l0aG91dF9jYXN0X292ZXJmbG93PAogICAgIFNyY1NjYWxhciwgVGd0U2NhbGFyLAotICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8TnVtVHJhaXRzPFNyY1NjYWxhcj46OklzSW50ZWdlciAmJiBOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNTaWduZWQgJiYgTnVtVHJhaXRzPFRndFNjYWxhcj46OklzSW50ZWdlciAmJgotICAgICAgICAgICAgICAgICAgICFOdW1UcmFpdHM8VGd0U2NhbGFyPjo6SXNTaWduZWQgJiYKLSAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxTcmNTY2FsYXI+OjpkaWdpdHMgPCBzdGQ6Om51bWVyaWNfbGltaXRzPFRndFNjYWxhcj46OmRpZ2l0cyB8fAotICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxTcmNTY2FsYXI+OjpkaWdpdHMgPT0gc3RkOjpudW1lcmljX2xpbWl0czxUZ3RTY2FsYXI+OjpkaWdpdHMgJiYKLSAgICAgICAgICAgICAgICAgICAgIE51bVRyYWl0czxTcmNTY2FsYXI+OjpJc1NpZ25lZCkpPj4geworICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8TnVtVHJhaXRzPFNyY1NjYWxhcj46OklzSW50ZWdlciAmJiBOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNTaWduZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgIE51bVRyYWl0czxUZ3RTY2FsYXI+OjpJc0ludGVnZXIgJiYgIU51bVRyYWl0czxUZ3RTY2FsYXI+OjpJc1NpZ25lZCAmJgorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8U3JjU2NhbGFyPjo6ZGlnaXRzIDwgc3RkOjpudW1lcmljX2xpbWl0czxUZ3RTY2FsYXI+OjpkaWdpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxTcmNTY2FsYXI+OjpkaWdpdHMgPT0gc3RkOjpudW1lcmljX2xpbWl0czxUZ3RTY2FsYXI+OjpkaWdpdHMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgTnVtVHJhaXRzPFNyY1NjYWxhcj46OklzU2lnbmVkKSk+PiB7CiAgIHN0YXRpYyBTcmNTY2FsYXIgdmFsdWUoKSB7CiAgICAgU3JjU2NhbGFyIGEgPSBpbnRlcm5hbDo6cmFuZG9tPFNyY1NjYWxhcj4oKTsKICAgICByZXR1cm4gYSA8IFNyY1NjYWxhcigwKSA/IC0oYSArIDEpIDogYTsKQEAgLTM4LDExICszOCwxMSBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIFNyY1NjYWxhciwgdHlwZW5hbWUgVGd0U2NhbGFyPgogc3RydWN0IHJhbmRvbV93aXRob3V0X2Nhc3Rfb3ZlcmZsb3c8CiAgICAgU3JjU2NhbGFyLCBUZ3RTY2FsYXIsCi0gICAgc3RkOjplbmFibGVfaWZfdDxOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNJbnRlZ2VyICYmICFOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNTaWduZWQgJiYgTnVtVHJhaXRzPFRndFNjYWxhcj46OklzSW50ZWdlciAmJgotICAgICAgICAgICAgICAgICAgICFOdW1UcmFpdHM8VGd0U2NhbGFyPjo6SXNTaWduZWQgJiYKLSAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxTcmNTY2FsYXI+OjpkaWdpdHMgPCBzdGQ6Om51bWVyaWNfbGltaXRzPFRndFNjYWxhcj46OmRpZ2l0cyB8fAotICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxTcmNTY2FsYXI+OjpkaWdpdHMgPT0gc3RkOjpudW1lcmljX2xpbWl0czxUZ3RTY2FsYXI+OjpkaWdpdHMgJiYKLSAgICAgICAgICAgICAgICAgICAgIE51bVRyYWl0czxTcmNTY2FsYXI+OjpJc1NpZ25lZCkpPj4geworICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8TnVtVHJhaXRzPFNyY1NjYWxhcj46OklzSW50ZWdlciAmJiAhTnVtVHJhaXRzPFNyY1NjYWxhcj46OklzU2lnbmVkICYmCisgICAgICAgICAgICAgICAgICAgICBOdW1UcmFpdHM8VGd0U2NhbGFyPjo6SXNJbnRlZ2VyICYmICFOdW1UcmFpdHM8VGd0U2NhbGFyPjo6SXNTaWduZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPFNyY1NjYWxhcj46OmRpZ2l0cyA8IHN0ZDo6bnVtZXJpY19saW1pdHM8VGd0U2NhbGFyPjo6ZGlnaXRzIHx8CisgICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8U3JjU2NhbGFyPjo6ZGlnaXRzID09IHN0ZDo6bnVtZXJpY19saW1pdHM8VGd0U2NhbGFyPjo6ZGlnaXRzICYmCisgICAgICAgICAgICAgICAgICAgICAgIE51bVRyYWl0czxTcmNTY2FsYXI+OjpJc1NpZ25lZCkpPj4gewogICBzdGF0aWMgU3JjU2NhbGFyIHZhbHVlKCkgewogICAgIFNyY1NjYWxhciBhID0gaW50ZXJuYWw6OnJhbmRvbTxTcmNTY2FsYXI+KCk7CiAgICAgcmV0dXJuIGE7CkBAIC01Myw5ICs1Myw5IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjU2NhbGFyLCB0eXBlbmFtZSBUZ3RTY2FsYXI+CiBzdHJ1Y3QgcmFuZG9tX3dpdGhvdXRfY2FzdF9vdmVyZmxvdzwKICAgICBTcmNTY2FsYXIsIFRndFNjYWxhciwKLSAgICBzdGQ6OmVuYWJsZV9pZl90PAotICAgICAgICBOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNJbnRlZ2VyICYmIE51bVRyYWl0czxUZ3RTY2FsYXI+OjpJc0ludGVnZXIgJiYgTnVtVHJhaXRzPFRndFNjYWxhcj46OklzU2lnbmVkICYmICFOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNTaWduZWQgJiYKLSAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8U3JjU2NhbGFyPjo6ZGlnaXRzID4gc3RkOjpudW1lcmljX2xpbWl0czxUZ3RTY2FsYXI+OjpkaWdpdHMpPj4geworICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8TnVtVHJhaXRzPFNyY1NjYWxhcj46OklzSW50ZWdlciAmJiBOdW1UcmFpdHM8VGd0U2NhbGFyPjo6SXNJbnRlZ2VyICYmCisgICAgICAgICAgICAgICAgICAgICBOdW1UcmFpdHM8VGd0U2NhbGFyPjo6SXNTaWduZWQgJiYgIU51bVRyYWl0czxTcmNTY2FsYXI+OjpJc1NpZ25lZCAmJgorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8U3JjU2NhbGFyPjo6ZGlnaXRzID4gc3RkOjpudW1lcmljX2xpbWl0czxUZ3RTY2FsYXI+OjpkaWdpdHMpPj4gewogICBzdGF0aWMgU3JjU2NhbGFyIHZhbHVlKCkgewogICAgIFRndFNjYWxhciBiID0gaW50ZXJuYWw6OnJhbmRvbTxUZ3RTY2FsYXI+KCk7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFNyY1NjYWxhcj4oYiA8IFRndFNjYWxhcigwKSA/IC0oYiArIDEpIDogYik7CkBAIC02Niw5ICs2Niw5IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjU2NhbGFyLCB0eXBlbmFtZSBUZ3RTY2FsYXI+CiBzdHJ1Y3QgcmFuZG9tX3dpdGhvdXRfY2FzdF9vdmVyZmxvdzwKICAgICBTcmNTY2FsYXIsIFRndFNjYWxhciwKLSAgICBzdGQ6OmVuYWJsZV9pZl90PAotICAgICAgICBOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNJbnRlZ2VyICYmIE51bVRyYWl0czxUZ3RTY2FsYXI+OjpJc0ludGVnZXIgJiYgIU51bVRyYWl0czxUZ3RTY2FsYXI+OjpJc1NpZ25lZCAmJiAhTnVtVHJhaXRzPFNyY1NjYWxhcj46OklzU2lnbmVkICYmCi0gICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPFNyY1NjYWxhcj46OmRpZ2l0cyA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VGd0U2NhbGFyPjo6ZGlnaXRzKT4+IHsKKyAgICBzdGQ6OmVuYWJsZV9pZl90PE51bVRyYWl0czxTcmNTY2FsYXI+OjpJc0ludGVnZXIgJiYgTnVtVHJhaXRzPFRndFNjYWxhcj46OklzSW50ZWdlciAmJgorICAgICAgICAgICAgICAgICAgICAgIU51bVRyYWl0czxUZ3RTY2FsYXI+OjpJc1NpZ25lZCAmJiAhTnVtVHJhaXRzPFNyY1NjYWxhcj46OklzU2lnbmVkICYmCisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxTcmNTY2FsYXI+OjpkaWdpdHMgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFRndFNjYWxhcj46OmRpZ2l0cyk+PiB7CiAgIHN0YXRpYyBTcmNTY2FsYXIgdmFsdWUoKSB7CiAgICAgVGd0U2NhbGFyIGIgPSBpbnRlcm5hbDo6cmFuZG9tPFRndFNjYWxhcj4oKTsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3JjU2NhbGFyPihiKTsKQEAgLTc5LDkgKzc5LDkgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTcmNTY2FsYXIsIHR5cGVuYW1lIFRndFNjYWxhcj4KIHN0cnVjdCByYW5kb21fd2l0aG91dF9jYXN0X292ZXJmbG93PAogICAgIFNyY1NjYWxhciwgVGd0U2NhbGFyLAotICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8Ci0gICAgICAgIE51bVRyYWl0czxTcmNTY2FsYXI+OjpJc0ludGVnZXIgJiYgTnVtVHJhaXRzPFRndFNjYWxhcj46OklzSW50ZWdlciAmJiBOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNTaWduZWQgJiYKLSAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8U3JjU2NhbGFyPjo6ZGlnaXRzID4gc3RkOjpudW1lcmljX2xpbWl0czxUZ3RTY2FsYXI+OjpkaWdpdHMpPj4geworICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8TnVtVHJhaXRzPFNyY1NjYWxhcj46OklzSW50ZWdlciAmJiBOdW1UcmFpdHM8VGd0U2NhbGFyPjo6SXNJbnRlZ2VyICYmCisgICAgICAgICAgICAgICAgICAgICBOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNTaWduZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPFNyY1NjYWxhcj46OmRpZ2l0cyA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VGd0U2NhbGFyPjo6ZGlnaXRzKT4+IHsKICAgc3RhdGljIFNyY1NjYWxhciB2YWx1ZSgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFNyY1NjYWxhcj4oaW50ZXJuYWw6OnJhbmRvbTxUZ3RTY2FsYXI+KCkpOyB9CiB9OwogCkBAIC05MSw4ICs5MSw3IEBACiAgICAgU3JjU2NhbGFyLCBUZ3RTY2FsYXIsCiAgICAgc3RkOjplbmFibGVfaWZfdDxOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNJbnRlZ2VyICYmIE51bVRyYWl0czxUZ3RTY2FsYXI+OjpJc0ludGVnZXIgJiYKICAgICAgICAgICAgICAgICAgICAgICFOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNTaWduZWQgJiYgTnVtVHJhaXRzPFRndFNjYWxhcj46OklzU2lnbmVkICYmCi0gICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxTcmNTY2FsYXI+OjpkaWdpdHMgPT0KLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPFRndFNjYWxhcj46OmRpZ2l0cyk+PiB7CisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxTcmNTY2FsYXI+OjpkaWdpdHMgPT0gc3RkOjpudW1lcmljX2xpbWl0czxUZ3RTY2FsYXI+OjpkaWdpdHMpPj4gewogICBzdGF0aWMgU3JjU2NhbGFyIHZhbHVlKCkgeyByZXR1cm4gaW50ZXJuYWw6OnJhbmRvbTxTcmNTY2FsYXI+KCkgLyAyOyB9CiB9OwogCkBAIC0xMDAsOSArOTksOSBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIFNyY1NjYWxhciwgdHlwZW5hbWUgVGd0U2NhbGFyPgogc3RydWN0IHJhbmRvbV93aXRob3V0X2Nhc3Rfb3ZlcmZsb3c8CiAgICAgU3JjU2NhbGFyLCBUZ3RTY2FsYXIsCi0gICAgc3RkOjplbmFibGVfaWZfdDwKLSAgICAgICAgIU51bVRyYWl0czxTcmNTY2FsYXI+OjpJc0ludGVnZXIgJiYgIU51bVRyYWl0czxTcmNTY2FsYXI+OjpJc0NvbXBsZXggJiYgTnVtVHJhaXRzPFRndFNjYWxhcj46OklzSW50ZWdlciAmJgotICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxUZ3RTY2FsYXI+OjpkaWdpdHMgPD0gc3RkOjpudW1lcmljX2xpbWl0czxTcmNTY2FsYXI+OjpkaWdpdHMpPj4geworICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8IU51bVRyYWl0czxTcmNTY2FsYXI+OjpJc0ludGVnZXIgJiYgIU51bVRyYWl0czxTcmNTY2FsYXI+OjpJc0NvbXBsZXggJiYKKyAgICAgICAgICAgICAgICAgICAgIE51bVRyYWl0czxUZ3RTY2FsYXI+OjpJc0ludGVnZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPFRndFNjYWxhcj46OmRpZ2l0cyA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPFNyY1NjYWxhcj46OmRpZ2l0cyk+PiB7CiAgIHN0YXRpYyBTcmNTY2FsYXIgdmFsdWUoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxTcmNTY2FsYXI+KGludGVybmFsOjpyYW5kb208VGd0U2NhbGFyPigpKTsgfQogfTsKIApAQCAtMTEwLDkgKzEwOSw5IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjU2NhbGFyLCB0eXBlbmFtZSBUZ3RTY2FsYXI+CiBzdHJ1Y3QgcmFuZG9tX3dpdGhvdXRfY2FzdF9vdmVyZmxvdzwKICAgICBTcmNTY2FsYXIsIFRndFNjYWxhciwKLSAgICBzdGQ6OmVuYWJsZV9pZl90PAotICAgICAgICAhTnVtVHJhaXRzPFNyY1NjYWxhcj46OklzSW50ZWdlciAmJiAhTnVtVHJhaXRzPFNyY1NjYWxhcj46OklzQ29tcGxleCAmJiBOdW1UcmFpdHM8VGd0U2NhbGFyPjo6SXNJbnRlZ2VyICYmIE51bVRyYWl0czxUZ3RTY2FsYXI+OjpJc1NpZ25lZCAmJgotICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxUZ3RTY2FsYXI+OjpkaWdpdHMgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFNyY1NjYWxhcj46OmRpZ2l0cyk+PiB7CisgICAgc3RkOjplbmFibGVfaWZfdDwhTnVtVHJhaXRzPFNyY1NjYWxhcj46OklzSW50ZWdlciAmJiAhTnVtVHJhaXRzPFNyY1NjYWxhcj46OklzQ29tcGxleCAmJgorICAgICAgICAgICAgICAgICAgICAgTnVtVHJhaXRzPFRndFNjYWxhcj46OklzSW50ZWdlciAmJiBOdW1UcmFpdHM8VGd0U2NhbGFyPjo6SXNTaWduZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPFRndFNjYWxhcj46OmRpZ2l0cyA+IHN0ZDo6bnVtZXJpY19saW1pdHM8U3JjU2NhbGFyPjo6ZGlnaXRzKT4+IHsKICAgc3RhdGljIFNyY1NjYWxhciB2YWx1ZSgpIHsKICAgICAvLyBOT1RFOiBpbnRlcm5hbDo6cmFuZG9tPFQ+KCkgaXMgbGltaXRlZCBieSBSQU5EX01BWCwgc28gcmFuZG9tPGludDY0X3Q+IGlzIGFsd2F5cyB3aXRoaW4gdGhhdCByYW5nZS4KICAgICAvLyBUaGlzIHByZXZlbnRzIHVzIGZyb20gc2ltcGx5IHNoaWZ0aW5nIGJpdHMsIHdoaWNoIHdvdWxkIHJlc3VsdCBpbiBvbmx5IDAgb3IgLTEuCkBAIC0xMjYsOSArMTI1LDkgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTcmNTY2FsYXIsIHR5cGVuYW1lIFRndFNjYWxhcj4KIHN0cnVjdCByYW5kb21fd2l0aG91dF9jYXN0X292ZXJmbG93PAogICAgIFNyY1NjYWxhciwgVGd0U2NhbGFyLAotICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8Ci0gICAgICAgICFOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNJbnRlZ2VyICYmICFOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNDb21wbGV4ICYmIE51bVRyYWl0czxUZ3RTY2FsYXI+OjpJc0ludGVnZXIgJiYgIU51bVRyYWl0czxUZ3RTY2FsYXI+OjpJc1NpZ25lZCAmJgotICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxUZ3RTY2FsYXI+OjpkaWdpdHMgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFNyY1NjYWxhcj46OmRpZ2l0cyk+PiB7CisgICAgc3RkOjplbmFibGVfaWZfdDwhTnVtVHJhaXRzPFNyY1NjYWxhcj46OklzSW50ZWdlciAmJiAhTnVtVHJhaXRzPFNyY1NjYWxhcj46OklzQ29tcGxleCAmJgorICAgICAgICAgICAgICAgICAgICAgTnVtVHJhaXRzPFRndFNjYWxhcj46OklzSW50ZWdlciAmJiAhTnVtVHJhaXRzPFRndFNjYWxhcj46OklzU2lnbmVkICYmCisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxUZ3RTY2FsYXI+OjpkaWdpdHMgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFNyY1NjYWxhcj46OmRpZ2l0cyk+PiB7CiAgIHN0YXRpYyBTcmNTY2FsYXIgdmFsdWUoKSB7CiAgICAgLy8gTk9URTogaW50ZXJuYWw6OnJhbmRvbTxUPigpIGlzIGxpbWl0ZWQgYnkgUkFORF9NQVgsIHNvIHJhbmRvbTxpbnQ2NF90PiBpcyBhbHdheXMgd2l0aGluIHRoYXQgcmFuZ2UuCiAgICAgLy8gVGhpcyBwcmV2ZW50cyB1cyBmcm9tIHNpbXBseSBzaGlmdGluZyBiaXRzLCB3aGljaCB3b3VsZCByZXN1bHQgaW4gb25seSAwIG9yIC0xLgpAQCAtMTU2LDE2ICsxNTUsMTQgQEAKICAgICBTcmNTY2FsYXIsIFRndFNjYWxhciwKICAgICBzdGQ6OmVuYWJsZV9pZl90PCFOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNJbnRlZ2VyICYmICFOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNDb21wbGV4ICYmCiAgICAgICAgICAgICAgICAgICAgICAhTnVtVHJhaXRzPFRndFNjYWxhcj46OklzSW50ZWdlciAmJiAhTnVtVHJhaXRzPFRndFNjYWxhcj46OklzQ29tcGxleCAmJgotICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8U3JjU2NhbGFyPjo6ZGlnaXRzID4KLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPFRndFNjYWxhcj46OmRpZ2l0cyk+PiB7CisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxTcmNTY2FsYXI+OjpkaWdpdHMgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFRndFNjYWxhcj46OmRpZ2l0cyk+PiB7CiAgIHN0YXRpYyBTcmNTY2FsYXIgdmFsdWUoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxTcmNTY2FsYXI+KGludGVybmFsOjpyYW5kb208VGd0U2NhbGFyPigpKTsgfQogfTsKIAogLy8gQ29tcGxleCB0byBub24tY29tcGxleC4KIHRlbXBsYXRlIDx0eXBlbmFtZSBTcmNTY2FsYXIsIHR5cGVuYW1lIFRndFNjYWxhcj4KIHN0cnVjdCByYW5kb21fd2l0aG91dF9jYXN0X292ZXJmbG93PAotICAgIFNyY1NjYWxhciwgVGd0U2NhbGFyLAotICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8TnVtVHJhaXRzPFNyY1NjYWxhcj46OklzQ29tcGxleCAmJiAhTnVtVHJhaXRzPFRndFNjYWxhcj46OklzQ29tcGxleD4+IHsKKyAgICBTcmNTY2FsYXIsIFRndFNjYWxhciwgc3RkOjplbmFibGVfaWZfdDxOdW1UcmFpdHM8U3JjU2NhbGFyPjo6SXNDb21wbGV4ICYmICFOdW1UcmFpdHM8VGd0U2NhbGFyPjo6SXNDb21wbGV4Pj4gewogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTcmNTY2FsYXI+OjpSZWFsIFNyY1JlYWw7CiAgIHN0YXRpYyBTcmNTY2FsYXIgdmFsdWUoKSB7IHJldHVybiBTcmNTY2FsYXIocmFuZG9tX3dpdGhvdXRfY2FzdF9vdmVyZmxvdzxTcmNSZWFsLCBUZ3RTY2FsYXI+Ojp2YWx1ZSgpLCAwKTsgfQogfTsKQEAgLTE3Myw4ICsxNzAsNyBAQAogLy8gTm9uLWNvbXBsZXggdG8gY29tcGxleC4KIHRlbXBsYXRlIDx0eXBlbmFtZSBTcmNTY2FsYXIsIHR5cGVuYW1lIFRndFNjYWxhcj4KIHN0cnVjdCByYW5kb21fd2l0aG91dF9jYXN0X292ZXJmbG93PAotICAgIFNyY1NjYWxhciwgVGd0U2NhbGFyLAotICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8IU51bVRyYWl0czxTcmNTY2FsYXI+OjpJc0NvbXBsZXggJiYgTnVtVHJhaXRzPFRndFNjYWxhcj46OklzQ29tcGxleD4+IHsKKyAgICBTcmNTY2FsYXIsIFRndFNjYWxhciwgc3RkOjplbmFibGVfaWZfdDwhTnVtVHJhaXRzPFNyY1NjYWxhcj46OklzQ29tcGxleCAmJiBOdW1UcmFpdHM8VGd0U2NhbGFyPjo6SXNDb21wbGV4Pj4gewogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxUZ3RTY2FsYXI+OjpSZWFsIFRndFJlYWw7CiAgIHN0YXRpYyBTcmNTY2FsYXIgdmFsdWUoKSB7IHJldHVybiByYW5kb21fd2l0aG91dF9jYXN0X292ZXJmbG93PFNyY1NjYWxhciwgVGd0UmVhbD46OnZhbHVlKCk7IH0KIH07CkBAIC0xODIsOCArMTc4LDcgQEAKIC8vIENvbXBsZXggdG8gY29tcGxleC4KIHRlbXBsYXRlIDx0eXBlbmFtZSBTcmNTY2FsYXIsIHR5cGVuYW1lIFRndFNjYWxhcj4KIHN0cnVjdCByYW5kb21fd2l0aG91dF9jYXN0X292ZXJmbG93PAotICAgIFNyY1NjYWxhciwgVGd0U2NhbGFyLAotICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8TnVtVHJhaXRzPFNyY1NjYWxhcj46OklzQ29tcGxleCAmJiBOdW1UcmFpdHM8VGd0U2NhbGFyPjo6SXNDb21wbGV4Pj4geworICAgIFNyY1NjYWxhciwgVGd0U2NhbGFyLCBzdGQ6OmVuYWJsZV9pZl90PE51bVRyYWl0czxTcmNTY2FsYXI+OjpJc0NvbXBsZXggJiYgTnVtVHJhaXRzPFRndFNjYWxhcj46OklzQ29tcGxleD4+IHsKICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U3JjU2NhbGFyPjo6UmVhbCBTcmNSZWFsOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxUZ3RTY2FsYXI+OjpSZWFsIFRndFJlYWw7CiAgIHN0YXRpYyBTcmNTY2FsYXIgdmFsdWUoKSB7CmRpZmYgLS1naXQgYS90ZXN0L3JlYWxfcXouY3BwIGIvdGVzdC9yZWFsX3F6LmNwcAppbmRleCBlYTRhMjcwLi41MGMxZTYwIDEwMDY0NAotLS0gYS90ZXN0L3JlYWxfcXouY3BwCisrKyBiL3Rlc3QvcmVhbF9xei5jcHAKQEAgLTEyLDgzICsxMiw4MyBAQAogI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxFaWdlbi9FaWdlbnZhbHVlcz4KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCByZWFsX3F6KGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcmVhbF9xeihjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIC8qIHRoaXMgdGVzdCBjb3ZlcnMgdGhlIGZvbGxvd2luZyBmaWxlczoKICAgICAgUmVhbFFaLmgKICAgKi8KICAgdXNpbmcgc3RkOjphYnM7Ci0gIAotICBJbmRleCBkaW0gPSBtLmNvbHMoKTsKLSAgCi0gIE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6OlJhbmRvbShkaW0sZGltKSwKLSAgICAgICAgICAgICBCID0gTWF0cml4VHlwZTo6UmFuZG9tKGRpbSxkaW0pOwogCisgIEluZGV4IGRpbSA9IG0uY29scygpOworCisgIE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6OlJhbmRvbShkaW0sIGRpbSksIEIgPSBNYXRyaXhUeXBlOjpSYW5kb20oZGltLCBkaW0pOwogCiAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDk4NTogUmFuZG9tbHkgc2V0IHJvd3Mgb3IgY29sdW1ucyB0byB6ZXJvCi0gIEluZGV4IGs9aW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgZGltLTEpOwotICBzd2l0Y2goaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsMTApKSB7Ci0gIGNhc2UgMDoKLSAgICBBLnJvdyhrKS5zZXRaZXJvKCk7IGJyZWFrOwotICBjYXNlIDE6Ci0gICAgQS5jb2woaykuc2V0WmVybygpOyBicmVhazsKLSAgY2FzZSAyOgotICAgIEIucm93KGspLnNldFplcm8oKTsgYnJlYWs7Ci0gIGNhc2UgMzoKLSAgICBCLmNvbChrKS5zZXRaZXJvKCk7IGJyZWFrOwotICBkZWZhdWx0OgotICAgIGJyZWFrOworICBJbmRleCBrID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgZGltIC0gMSk7CisgIHN3aXRjaCAoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIDEwKSkgeworICAgIGNhc2UgMDoKKyAgICAgIEEucm93KGspLnNldFplcm8oKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIEEuY29sKGspLnNldFplcm8oKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIEIucm93KGspLnNldFplcm8oKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIEIuY29sKGspLnNldFplcm8oKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgfQogCiAgIFJlYWxRWjxNYXRyaXhUeXBlPiBxeihkaW0pOwotICAvLyBUT0RPIGVuYWJsZSBmdWxsLXByZWFsb2NhdGlvbiBvZiByZXF1aXJlZCBtZW1vcnksIHRoaXMgcHJvYmFibHkgcmVxdWlyZXMgYW4gaW4tcGxhY2UgbW9kZSBmb3IgSGVzc2VuYmVyZ0RlY29tcG9zaXRpb24KLSAgLy9FaWdlbjo6aW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZChmYWxzZSk7Ci0gIHF6LmNvbXB1dGUoQSxCKTsKLSAgLy9FaWdlbjo6aW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZCh0cnVlKTsKLSAgCisgIC8vIFRPRE8gZW5hYmxlIGZ1bGwtcHJlYWxvY2F0aW9uIG9mIHJlcXVpcmVkIG1lbW9yeSwgdGhpcyBwcm9iYWJseSByZXF1aXJlcyBhbiBpbi1wbGFjZSBtb2RlIGZvcgorICAvLyBIZXNzZW5iZXJnRGVjb21wb3NpdGlvbgorICAvLyBFaWdlbjo6aW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZChmYWxzZSk7CisgIHF6LmNvbXB1dGUoQSwgQik7CisgIC8vIEVpZ2VuOjppbnRlcm5hbDo6c2V0X2lzX21hbGxvY19hbGxvd2VkKHRydWUpOworCiAgIFZFUklGWV9JU19FUVVBTChxei5pbmZvKCksIFN1Y2Nlc3MpOwogICAvLyBjaGVjayBmb3IgemVyb3MKICAgYm9vbCBhbGxfemVyb3MgPSB0cnVlOwotICBmb3IgKEluZGV4IGk9MDsgaTxBLmNvbHMoKTsgaSsrKQotICAgIGZvciAoSW5kZXggaj0wOyBqPGk7IGorKykgewotICAgICAgaWYgKCFudW1leHQ6OmlzX2V4YWN0bHlfemVybyhhYnMocXoubWF0cml4VCgpKGksIGopKSkpCi0gICAgICB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3I6IFQoIiA8PCBpIDw8ICIsIiA8PCBqIDw8ICIpID0gIiA8PCBxei5tYXRyaXhUKCkoaSxqKSA8PCBzdGQ6OmVuZGw7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBBLmNvbHMoKTsgaSsrKQorICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgIGlmICghbnVtZXh0Ojppc19leGFjdGx5X3plcm8oYWJzKHF6Lm1hdHJpeFQoKShpLCBqKSkpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3I6IFQoIiA8PCBpIDw8ICIsIiA8PCBqIDw8ICIpID0gIiA8PCBxei5tYXRyaXhUKCkoaSwgaikgPDwgc3RkOjplbmRsOwogICAgICAgICBhbGxfemVyb3MgPSBmYWxzZTsKICAgICAgIH0KLSAgICAgIGlmIChqPGktMSAmJiAhbnVtZXh0Ojppc19leGFjdGx5X3plcm8oYWJzKHF6Lm1hdHJpeFMoKShpLCBqKSkpKQotICAgICAgewotICAgICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yOiBTKCIgPDwgaSA8PCAiLCIgPDwgaiA8PCAiKSA9ICIgPDwgcXoubWF0cml4UygpKGksaikgPDwgc3RkOjplbmRsOworICAgICAgaWYgKGogPCBpIC0gMSAmJiAhbnVtZXh0Ojppc19leGFjdGx5X3plcm8oYWJzKHF6Lm1hdHJpeFMoKShpLCBqKSkpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXJyb3I6IFMoIiA8PCBpIDw8ICIsIiA8PCBqIDw8ICIpID0gIiA8PCBxei5tYXRyaXhTKCkoaSwgaikgPDwgc3RkOjplbmRsOwogICAgICAgICBhbGxfemVyb3MgPSBmYWxzZTsKICAgICAgIH0KLSAgICAgIGlmIChqPT1pLTEgJiYgaj4wICYmICFudW1leHQ6OmlzX2V4YWN0bHlfemVybyhhYnMocXoubWF0cml4UygpKGksIGopKSkgJiYKLSAgICAgICAgICAgICAgIW51bWV4dDo6aXNfZXhhY3RseV96ZXJvKGFicyhxei5tYXRyaXhTKCkoaSAtIDEsIGogLSAxKSkpKQotICAgICAgewotICAgICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yOiBTKCIgPDwgaSA8PCAiLCIgPDwgaiA8PCAiKSA9ICIgPDwgcXoubWF0cml4UygpKGksaikgIDw8ICIgJiYgUygiIDw8IGktMSA8PCAiLCIgPDwgai0xIDw8ICIpID0gIiA8PCBxei5tYXRyaXhTKCkoaS0xLGotMSkgPDwgc3RkOjplbmRsOworICAgICAgaWYgKGogPT0gaSAtIDEgJiYgaiA+IDAgJiYgIW51bWV4dDo6aXNfZXhhY3RseV96ZXJvKGFicyhxei5tYXRyaXhTKCkoaSwgaikpKSAmJgorICAgICAgICAgICFudW1leHQ6OmlzX2V4YWN0bHlfemVybyhhYnMocXoubWF0cml4UygpKGkgLSAxLCBqIC0gMSkpKSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yOiBTKCIgPDwgaSA8PCAiLCIgPDwgaiA8PCAiKSA9ICIgPDwgcXoubWF0cml4UygpKGksIGopIDw8ICIgJiYgUygiIDw8IGkgLSAxIDw8ICIsIiA8PCBqIC0gMQorICAgICAgICAgICAgICAgICAgPDwgIikgPSAiIDw8IHF6Lm1hdHJpeFMoKShpIC0gMSwgaiAtIDEpIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgYWxsX3plcm9zID0gZmFsc2U7CiAgICAgICB9CiAgICAgfQogICBWRVJJRllfSVNfRVFVQUwoYWxsX3plcm9zLCB0cnVlKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChxei5tYXRyaXhRKCkqcXoubWF0cml4UygpKnF6Lm1hdHJpeFooKSwgQSk7Ci0gIFZFUklGWV9JU19BUFBST1gocXoubWF0cml4USgpKnF6Lm1hdHJpeFQoKSpxei5tYXRyaXhaKCksIEIpOwotICBWRVJJRllfSVNfQVBQUk9YKHF6Lm1hdHJpeFEoKSpxei5tYXRyaXhRKCkuYWRqb2ludCgpLCBNYXRyaXhUeXBlOjpJZGVudGl0eShkaW0sZGltKSk7Ci0gIFZFUklGWV9JU19BUFBST1gocXoubWF0cml4WigpKnF6Lm1hdHJpeFooKS5hZGpvaW50KCksIE1hdHJpeFR5cGU6OklkZW50aXR5KGRpbSxkaW0pKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxei5tYXRyaXhRKCkgKiBxei5tYXRyaXhTKCkgKiBxei5tYXRyaXhaKCksIEEpOworICBWRVJJRllfSVNfQVBQUk9YKHF6Lm1hdHJpeFEoKSAqIHF6Lm1hdHJpeFQoKSAqIHF6Lm1hdHJpeFooKSwgQik7CisgIFZFUklGWV9JU19BUFBST1gocXoubWF0cml4USgpICogcXoubWF0cml4USgpLmFkam9pbnQoKSwgTWF0cml4VHlwZTo6SWRlbnRpdHkoZGltLCBkaW0pKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChxei5tYXRyaXhaKCkgKiBxei5tYXRyaXhaKCkuYWRqb2ludCgpLCBNYXRyaXhUeXBlOjpJZGVudGl0eShkaW0sIGRpbSkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QocmVhbF9xeikKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChyZWFsX3F6KSB7CiAgIGludCBzID0gMDsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggcmVhbF9xeihNYXRyaXg0ZigpKSApOwotICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFLzQpOwotICAgIENBTExfU1VCVEVTVF8yKCByZWFsX3F6KE1hdHJpeFhkKHMscykpICk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKHJlYWxfcXooTWF0cml4NGYoKSkpOworICAgIHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSAvIDQpOworICAgIENBTExfU1VCVEVTVF8yKHJlYWxfcXooTWF0cml4WGQocywgcykpKTsKIAogICAgIC8vIHNvbWUgdHJpdmlhbCBidXQgaW1wbGVtZW50YXRpb24td2lzZSB0cmlja3kgY2FzZXMKLSAgICBDQUxMX1NVQlRFU1RfMiggcmVhbF9xeihNYXRyaXhYZCgxLDEpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCByZWFsX3F6KE1hdHJpeFhkKDIsMikpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIHJlYWxfcXooTWF0cml4PGRvdWJsZSwxLDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIHJlYWxfcXooTWF0cml4MmQoKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMihyZWFsX3F6KE1hdHJpeFhkKDEsIDEpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIocmVhbF9xeihNYXRyaXhYZCgyLCAyKSkpOworICAgIENBTExfU1VCVEVTVF8zKHJlYWxfcXooTWF0cml4PGRvdWJsZSwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF80KHJlYWxfcXooTWF0cml4MmQoKSkpOwogICB9Ci0gIAorCiAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvcmVkdXguY3BwIGIvdGVzdC9yZWR1eC5jcHAKaW5kZXggZmRiYWI3Ny4uOGE4MTM4ZCAxMDA2NDQKLS0tIGEvdGVzdC9yZWR1eC5jcHAKKysrIGIvdGVzdC9yZWR1eC5jcHAKQEAgLTE0LDggKzE0LDggQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBtYXRyaXhSZWR1eChjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIG1hdHJpeFJlZHV4KGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKIApAQCAtMjgsNzYgKzI4LDc4IEBACiAgIC8vIGZhaWx1cmVzIGlmIHdlIHVuZGVyZmxvdyBpbnRvIGRlbm9ybWFscy4gVGh1cywgd2Ugc2NhbGUgc28gdGhhdCBlbnRyaWVzIGFyZSBjbG9zZSB0byAxLgogICBNYXRyaXhUeXBlIG0xX2Zvcl9wcm9kID0gTWF0cml4VHlwZTo6T25lcyhyb3dzLCBjb2xzKSArIFJlYWxTY2FsYXIoMC4yKSAqIG0xOwogCi0gIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gbTIocm93cyxyb3dzKTsKKyAgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBtMihyb3dzLCByb3dzKTsKICAgbTIuc2V0UmFuZG9tKCk7CiAKICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scykuc3VtKCksIFNjYWxhcigxKSk7Ci0gIFZFUklGWV9JU19BUFBST1goTWF0cml4VHlwZTo6T25lcyhyb3dzLCBjb2xzKS5zdW0oKSwgU2NhbGFyKGZsb2F0KHJvd3MqY29scykpKTsgLy8gdGhlIGZsb2F0KCkgaGVyZSB0byBzaHV0IHVwIGV4Y2Vzc2l2ZSBNU1ZDIHdhcm5pbmcgYWJvdXQgaW50LT5jb21wbGV4IGNvbnZlcnNpb24gYmVpbmcgbG9zc3kKKyAgVkVSSUZZX0lTX0FQUFJPWCgKKyAgICAgIE1hdHJpeFR5cGU6Ok9uZXMocm93cywgY29scykuc3VtKCksCisgICAgICBTY2FsYXIoZmxvYXQoCisgICAgICAgICAgcm93cyAqCisgICAgICAgICAgY29scykpKTsgIC8vIHRoZSBmbG9hdCgpIGhlcmUgdG8gc2h1dCB1cCBleGNlc3NpdmUgTVNWQyB3YXJuaW5nIGFib3V0IGludC0+Y29tcGxleCBjb252ZXJzaW9uIGJlaW5nIGxvc3N5CiAgIFNjYWxhciBzKDApLCBwKDEpLCBtaW5jKG51bWV4dDo6cmVhbChtMS5jb2VmZigwKSkpLCBtYXhjKG51bWV4dDo6cmVhbChtMS5jb2VmZigwKSkpOwotICBmb3IoaW50IGogPSAwOyBqIDwgY29sczsgaisrKQotICBmb3IoaW50IGkgPSAwOyBpIDwgcm93czsgaSsrKQotICB7Ci0gICAgcyArPSBtMShpLGopOwotICAgIHAgKj0gbTFfZm9yX3Byb2QoaSxqKTsKLSAgICBtaW5jID0gKHN0ZDo6bWluKShudW1leHQ6OnJlYWwobWluYyksIG51bWV4dDo6cmVhbChtMShpLGopKSk7Ci0gICAgbWF4YyA9IChzdGQ6Om1heCkobnVtZXh0OjpyZWFsKG1heGMpLCBudW1leHQ6OnJlYWwobTEoaSxqKSkpOwotICB9Ci0gIGNvbnN0IFNjYWxhciBtZWFuID0gcy9TY2FsYXIoUmVhbFNjYWxhcihyb3dzKmNvbHMpKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBjb2xzOyBqKyspCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKKyAgICAgIHMgKz0gbTEoaSwgaik7CisgICAgICBwICo9IG0xX2Zvcl9wcm9kKGksIGopOworICAgICAgbWluYyA9IChzdGQ6Om1pbikobnVtZXh0OjpyZWFsKG1pbmMpLCBudW1leHQ6OnJlYWwobTEoaSwgaikpKTsKKyAgICAgIG1heGMgPSAoc3RkOjptYXgpKG51bWV4dDo6cmVhbChtYXhjKSwgbnVtZXh0OjpyZWFsKG0xKGksIGopKSk7CisgICAgfQorICBjb25zdCBTY2FsYXIgbWVhbiA9IHMgLyBTY2FsYXIoUmVhbFNjYWxhcihyb3dzICogY29scykpOwogCiAgIFZFUklGWV9JU19BUFBST1gobTEuc3VtKCksIHMpOwogICBWRVJJRllfSVNfQVBQUk9YKG0xLm1lYW4oKSwgbWVhbik7CiAgIFZFUklGWV9JU19BUFBST1gobTFfZm9yX3Byb2QucHJvZCgpLCBwKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMS5yZWFsKCkubWluQ29lZmYoKSwgbnVtZXh0OjpyZWFsKG1pbmMpKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtMS5yZWFsKCkubWF4Q29lZmYoKSwgbnVtZXh0OjpyZWFsKG1heGMpKTsKLSAgCisKICAgLy8gdGVzdCB0aGF0IHBhcnRpYWwgcmVkdWN0aW9uIHdvcmtzIGlmIG5lc3RlZCBleHByZXNzaW9ucyBpcyBmb3JjZWQgdG8gZXZhbHVhdGUgZWFybHkKLSAgVkVSSUZZX0lTX0FQUFJPWCgobTEubWF0cml4KCkgKiBtMS5tYXRyaXgoKS50cmFuc3Bvc2UoKSkgICAgICAgLmN3aXNlUHJvZHVjdChtMi5tYXRyaXgoKSkucm93d2lzZSgpLnN1bSgpLnN1bSgpLCAKKyAgVkVSSUZZX0lTX0FQUFJPWCgobTEubWF0cml4KCkgKiBtMS5tYXRyaXgoKS50cmFuc3Bvc2UoKSkuY3dpc2VQcm9kdWN0KG0yLm1hdHJpeCgpKS5yb3d3aXNlKCkuc3VtKCkuc3VtKCksCiAgICAgICAgICAgICAgICAgICAgKG0xLm1hdHJpeCgpICogbTEubWF0cml4KCkudHJhbnNwb3NlKCkpLmV2YWwoKS5jd2lzZVByb2R1Y3QobTIubWF0cml4KCkpLnJvd3dpc2UoKS5zdW0oKS5zdW0oKSk7CiAKICAgLy8gdGVzdCBzbGljZSB2ZWN0b3JpemF0aW9uIGFzc3VtaW5nIGFzc2lnbiBpcyBvawotICBJbmRleCByMCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0xKTsKLSAgSW5kZXggYzAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7Ci0gIEluZGV4IHIxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4ocjArMSxyb3dzKS1yMDsKLSAgSW5kZXggYzEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihjMCsxLGNvbHMpLWMwOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKHIwLGMwLHIxLGMxKS5zdW0oKSwgbTEuYmxvY2socjAsYzAscjEsYzEpLmV2YWwoKS5zdW0oKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2socjAsYzAscjEsYzEpLm1lYW4oKSwgbTEuYmxvY2socjAsYzAscjEsYzEpLmV2YWwoKS5tZWFuKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xX2Zvcl9wcm9kLmJsb2NrKHIwLGMwLHIxLGMxKS5wcm9kKCksIG0xX2Zvcl9wcm9kLmJsb2NrKHIwLGMwLHIxLGMxKS5ldmFsKCkucHJvZCgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS5ibG9jayhyMCxjMCxyMSxjMSkucmVhbCgpLm1pbkNvZWZmKCksIG0xLmJsb2NrKHIwLGMwLHIxLGMxKS5yZWFsKCkuZXZhbCgpLm1pbkNvZWZmKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKHIwLGMwLHIxLGMxKS5yZWFsKCkubWF4Q29lZmYoKSwgbTEuYmxvY2socjAsYzAscjEsYzEpLnJlYWwoKS5ldmFsKCkubWF4Q29lZmYoKSk7CisgIEluZGV4IHIwID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cyAtIDEpOworICBJbmRleCBjMCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAxKTsKKyAgSW5kZXggcjEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihyMCArIDEsIHJvd3MpIC0gcjA7CisgIEluZGV4IGMxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oYzAgKyAxLCBjb2xzKSAtIGMwOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKHIwLCBjMCwgcjEsIGMxKS5zdW0oKSwgbTEuYmxvY2socjAsIGMwLCByMSwgYzEpLmV2YWwoKS5zdW0oKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2socjAsIGMwLCByMSwgYzEpLm1lYW4oKSwgbTEuYmxvY2socjAsIGMwLCByMSwgYzEpLmV2YWwoKS5tZWFuKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xX2Zvcl9wcm9kLmJsb2NrKHIwLCBjMCwgcjEsIGMxKS5wcm9kKCksIG0xX2Zvcl9wcm9kLmJsb2NrKHIwLCBjMCwgcjEsIGMxKS5ldmFsKCkucHJvZCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5ibG9jayhyMCwgYzAsIHIxLCBjMSkucmVhbCgpLm1pbkNvZWZmKCksIG0xLmJsb2NrKHIwLCBjMCwgcjEsIGMxKS5yZWFsKCkuZXZhbCgpLm1pbkNvZWZmKCkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKHIwLCBjMCwgcjEsIGMxKS5yZWFsKCkubWF4Q29lZmYoKSwgbTEuYmxvY2socjAsIGMwLCByMSwgYzEpLnJlYWwoKS5ldmFsKCkubWF4Q29lZmYoKSk7CiAKICAgLy8gcmVncmVzc2lvbiBmb3IgYnVnIDEwOTAKLSAgY29uc3QgaW50IFIxID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+PTIgPyBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZS8yIDogNjsKLSAgY29uc3QgaW50IEMxID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+PTIgPyBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZS8yIDogNjsKLSAgaWYoUjE8PXJvd3MtcjAgJiYgQzE8PWNvbHMtYzApCi0gIHsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCAobTEudGVtcGxhdGUgYmxvY2s8UjEsQzE+KHIwLGMwKS5zdW0oKSksIG0xLmJsb2NrKHIwLGMwLFIxLEMxKS5zdW0oKSApOworICBjb25zdCBpbnQgUjEgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSA+PSAyID8gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgLyAyIDogNjsKKyAgY29uc3QgaW50IEMxID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPj0gMiA/IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIC8gMiA6IDY7CisgIGlmIChSMSA8PSByb3dzIC0gcjAgJiYgQzEgPD0gY29scyAtIGMwKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgobTEudGVtcGxhdGUgYmxvY2s8UjEsIEMxPihyMCwgYzApLnN1bSgpKSwgbTEuYmxvY2socjAsIGMwLCBSMSwgQzEpLnN1bSgpKTsKICAgfQotICAKKwogICAvLyB0ZXN0IGVtcHR5IG9iamVjdHMKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS5ibG9jayhyMCxjMCwwLDApLnN1bSgpLCAgIFNjYWxhcigwKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2socjAsYzAsMCwwKS5wcm9kKCksICBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLmJsb2NrKHIwLCBjMCwgMCwgMCkuc3VtKCksIFNjYWxhcigwKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEuYmxvY2socjAsIGMwLCAwLCAwKS5wcm9kKCksIFNjYWxhcigxKSk7CiAKICAgLy8gdGVzdCBuZXN0aW5nIGNvbXBsZXggZXhwcmVzc2lvbgotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggKG0xLm1hdHJpeCgpKm0xLm1hdHJpeCgpLnRyYW5zcG9zZSgpKS5zdW0oKSwgKE1hdHJpeFR5cGU6OklzVmVjdG9yQXRDb21waWxlVGltZSAmJiBNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSE9MSA/IDAgOiAxKSApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggKChtMS5tYXRyaXgoKSptMS5tYXRyaXgoKS50cmFuc3Bvc2UoKSkrbTIpLnN1bSgpLChNYXRyaXhUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgJiYgTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUhPTEgPyAwIDogMSkpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCgobTEubWF0cml4KCkgKiBtMS5tYXRyaXgoKS50cmFuc3Bvc2UoKSkuc3VtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXRyaXhUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgJiYgTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgIT0gMSA/IDAgOiAxKSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCgobTEubWF0cml4KCkgKiBtMS5tYXRyaXgoKS50cmFuc3Bvc2UoKSkgKyBtMikuc3VtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXRyaXhUeXBlOjpJc1ZlY3RvckF0Q29tcGlsZVRpbWUgJiYgTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgIT0gMSA/IDAgOiAxKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+IHZvaWQgdmVjdG9yUmVkdXgoY29uc3QgVmVjdG9yVHlwZSYgdykKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCB2ZWN0b3JSZWR1eChjb25zdCBWZWN0b3JUeXBlJiB3KSB7CiAgIHVzaW5nIHN0ZDo6YWJzOwogICB0eXBlZGVmIHR5cGVuYW1lIFZlY3RvclR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKICAgSW5kZXggc2l6ZSA9IHcuc2l6ZSgpOwogCiAgIFZlY3RvclR5cGUgdiA9IFZlY3RvclR5cGU6OlJhbmRvbShzaXplKTsKLSAgVmVjdG9yVHlwZSB2X2Zvcl9wcm9kID0gVmVjdG9yVHlwZTo6T25lcyhzaXplKSArIFNjYWxhcigwLjIpICogdjsgLy8gc2VlIGNvbW1lbnQgYWJvdmUgZGVjbGFyYXRpb24gb2YgbTFfZm9yX3Byb2QKKyAgVmVjdG9yVHlwZSB2X2Zvcl9wcm9kID0gVmVjdG9yVHlwZTo6T25lcyhzaXplKSArIFNjYWxhcigwLjIpICogdjsgIC8vIHNlZSBjb21tZW50IGFib3ZlIGRlY2xhcmF0aW9uIG9mIG0xX2Zvcl9wcm9kCiAKLSAgZm9yKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykKLSAgeworICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgewogICAgIFNjYWxhciBzKDApLCBwKDEpOwogICAgIFJlYWxTY2FsYXIgbWluYyhudW1leHQ6OnJlYWwodi5jb2VmZigwKSkpLCBtYXhjKG51bWV4dDo6cmVhbCh2LmNvZWZmKDApKSk7Ci0gICAgZm9yKGludCBqID0gMDsgaiA8IGk7IGorKykKLSAgICB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKICAgICAgIHMgKz0gdltqXTsKICAgICAgIHAgKj0gdl9mb3JfcHJvZFtqXTsKICAgICAgIG1pbmMgPSAoc3RkOjptaW4pKG1pbmMsIG51bWV4dDo6cmVhbCh2W2pdKSk7CkBAIC0xMDksNzUgKzExMSw3MCBAQAogICAgIFZFUklGWV9JU19BUFBST1gobWF4Yywgdi5yZWFsKCkuaGVhZChpKS5tYXhDb2VmZigpKTsKICAgfQogCi0gIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplLTE7IGkrKykKLSAgeworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLSAxOyBpKyspIHsKICAgICBTY2FsYXIgcygwKSwgcCgxKTsKICAgICBSZWFsU2NhbGFyIG1pbmMobnVtZXh0OjpyZWFsKHYuY29lZmYoaSkpKSwgbWF4YyhudW1leHQ6OnJlYWwodi5jb2VmZihpKSkpOwotICAgIGZvcihpbnQgaiA9IGk7IGogPCBzaXplOyBqKyspCi0gICAgeworICAgIGZvciAoaW50IGogPSBpOyBqIDwgc2l6ZTsgaisrKSB7CiAgICAgICBzICs9IHZbal07CiAgICAgICBwICo9IHZfZm9yX3Byb2Rbal07CiAgICAgICBtaW5jID0gKHN0ZDo6bWluKShtaW5jLCBudW1leHQ6OnJlYWwodltqXSkpOwogICAgICAgbWF4YyA9IChzdGQ6Om1heCkobWF4YywgbnVtZXh0OjpyZWFsKHZbal0pKTsKICAgICB9Ci0gICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKGFicyhzIC0gdi50YWlsKHNpemUtaSkuc3VtKCkpLCBTY2FsYXIoMSkpOwotICAgIFZFUklGWV9JU19BUFBST1gocCwgdl9mb3JfcHJvZC50YWlsKHNpemUtaSkucHJvZCgpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG1pbmMsIHYucmVhbCgpLnRhaWwoc2l6ZS1pKS5taW5Db2VmZigpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG1heGMsIHYucmVhbCgpLnRhaWwoc2l6ZS1pKS5tYXhDb2VmZigpKTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oYWJzKHMgLSB2LnRhaWwoc2l6ZSAtIGkpLnN1bSgpKSwgU2NhbGFyKDEpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHAsIHZfZm9yX3Byb2QudGFpbChzaXplIC0gaSkucHJvZCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1pbmMsIHYucmVhbCgpLnRhaWwoc2l6ZSAtIGkpLm1pbkNvZWZmKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobWF4Yywgdi5yZWFsKCkudGFpbChzaXplIC0gaSkubWF4Q29lZmYoKSk7CiAgIH0KIAotICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZS8yOyBpKyspCi0gIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC8gMjsgaSsrKSB7CiAgICAgU2NhbGFyIHMoMCksIHAoMSk7CiAgICAgUmVhbFNjYWxhciBtaW5jKG51bWV4dDo6cmVhbCh2LmNvZWZmKGkpKSksIG1heGMobnVtZXh0OjpyZWFsKHYuY29lZmYoaSkpKTsKLSAgICBmb3IoaW50IGogPSBpOyBqIDwgc2l6ZS1pOyBqKyspCi0gICAgeworICAgIGZvciAoaW50IGogPSBpOyBqIDwgc2l6ZSAtIGk7IGorKykgewogICAgICAgcyArPSB2W2pdOwogICAgICAgcCAqPSB2X2Zvcl9wcm9kW2pdOwogICAgICAgbWluYyA9IChzdGQ6Om1pbikobWluYywgbnVtZXh0OjpyZWFsKHZbal0pKTsKICAgICAgIG1heGMgPSAoc3RkOjptYXgpKG1heGMsIG51bWV4dDo6cmVhbCh2W2pdKSk7CiAgICAgfQotICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTihhYnMocyAtIHYuc2VnbWVudChpLCBzaXplLTIqaSkuc3VtKCkpLCBTY2FsYXIoMSkpOwotICAgIFZFUklGWV9JU19BUFBST1gocCwgdl9mb3JfcHJvZC5zZWdtZW50KGksIHNpemUtMippKS5wcm9kKCkpOwotICAgIFZFUklGWV9JU19BUFBST1gobWluYywgdi5yZWFsKCkuc2VnbWVudChpLCBzaXplLTIqaSkubWluQ29lZmYoKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtYXhjLCB2LnJlYWwoKS5zZWdtZW50KGksIHNpemUtMippKS5tYXhDb2VmZigpKTsKKyAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oYWJzKHMgLSB2LnNlZ21lbnQoaSwgc2l6ZSAtIDIgKiBpKS5zdW0oKSksIFNjYWxhcigxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChwLCB2X2Zvcl9wcm9kLnNlZ21lbnQoaSwgc2l6ZSAtIDIgKiBpKS5wcm9kKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobWluYywgdi5yZWFsKCkuc2VnbWVudChpLCBzaXplIC0gMiAqIGkpLm1pbkNvZWZmKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobWF4Yywgdi5yZWFsKCkuc2VnbWVudChpLCBzaXplIC0gMiAqIGkpLm1heENvZWZmKCkpOwogICB9Ci0gIAorCiAgIC8vIHRlc3QgZW1wdHkgb2JqZWN0cwotICBWRVJJRllfSVNfQVBQUk9YKHYuaGVhZCgwKS5zdW0oKSwgICBTY2FsYXIoMCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHYudGFpbCgwKS5wcm9kKCksICBTY2FsYXIoMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHYuaGVhZCgwKS5zdW0oKSwgU2NhbGFyKDApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2LnRhaWwoMCkucHJvZCgpLCBTY2FsYXIoMSkpOwogICBWRVJJRllfUkFJU0VTX0FTU0VSVCh2LmhlYWQoMCkubWVhbigpKTsKICAgVkVSSUZZX1JBSVNFU19BU1NFUlQodi5oZWFkKDApLm1pbkNvZWZmKCkpOwogICBWRVJJRllfUkFJU0VTX0FTU0VSVCh2LmhlYWQoMCkubWF4Q29lZmYoKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChyZWR1eCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChyZWR1eCkgewogICAvLyB0aGUgbWF4IHNpemUgY2Fubm90IGJlIHRvbyBsYXJnZSwgb3RoZXJ3aXNlIHJlZHV4aW9uIG9wZXJhdGlvbnMgb2J2aW91c2x5IGdlbmVyYXRlIGxhcmdlIGVycm9ycy4KLSAgaW50IG1heHNpemUgPSAoc3RkOjptaW4pKDEwMCxFSUdFTl9URVNUX01BWF9TSVpFKTsKKyAgaW50IG1heHNpemUgPSAoc3RkOjptaW4pKDEwMCwgRUlHRU5fVEVTVF9NQVhfU0laRSk7CiAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUobWF4c2l6ZSk7Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIG1hdHJpeFJlZHV4KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggbWF0cml4UmVkdXgoQXJyYXk8ZmxvYXQsIDEsIDE+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIG1hdHJpeFJlZHV4KE1hdHJpeDJmKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIG1hdHJpeFJlZHV4KEFycmF5MmYoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggbWF0cml4UmVkdXgoQXJyYXkyMmYoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggbWF0cml4UmVkdXgoTWF0cml4NGQoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggbWF0cml4UmVkdXgoQXJyYXk0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBtYXRyaXhSZWR1eChBcnJheTQ0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBtYXRyaXhSZWR1eChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSksIGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggbWF0cml4UmVkdXgoQXJyYXlYWGNmKGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhzaXplKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIG1hdHJpeFJlZHV4KE1hdHJpeFhkIChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhzaXplKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSkpKSApOwotICAgIENBTExfU1VCVEVTVF81KCBtYXRyaXhSZWR1eChBcnJheVhYZCAoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSksIGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggbWF0cml4UmVkdXgoTWF0cml4WGkgKGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhzaXplKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzYoIG1hdHJpeFJlZHV4KEFycmF5WFhpIChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhzaXplKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSkpKSApOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShtYXRyaXhSZWR1eChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShtYXRyaXhSZWR1eChBcnJheTxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKG1hdHJpeFJlZHV4KE1hdHJpeDJmKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihtYXRyaXhSZWR1eChBcnJheTJmKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihtYXRyaXhSZWR1eChBcnJheTIyZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMobWF0cml4UmVkdXgoTWF0cml4NGQoKSkpOworICAgIENBTExfU1VCVEVTVF8zKG1hdHJpeFJlZHV4KEFycmF5NGQoKSkpOworICAgIENBTExfU1VCVEVTVF8zKG1hdHJpeFJlZHV4KEFycmF5NDRkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChtYXRyaXhSZWR1eChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIG1heHNpemUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4c2l6ZSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQobWF0cml4UmVkdXgoQXJyYXlYWGNmKGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhzaXplKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIG1heHNpemUpKSkpOworICAgIENBTExfU1VCVEVTVF81KG1hdHJpeFJlZHV4KE1hdHJpeFhkKGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhzaXplKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIG1heHNpemUpKSkpOworICAgIENBTExfU1VCVEVTVF81KG1hdHJpeFJlZHV4KEFycmF5WFhkKGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhzaXplKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIG1heHNpemUpKSkpOworICAgIENBTExfU1VCVEVTVF82KG1hdHJpeFJlZHV4KE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhzaXplKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIG1heHNpemUpKSkpOworICAgIENBTExfU1VCVEVTVF82KG1hdHJpeFJlZHV4KEFycmF5WFhpKGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhzaXplKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIG1heHNpemUpKSkpOwogICB9Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzcoIHZlY3RvclJlZHV4KFZlY3RvcjRmKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzcoIHZlY3RvclJlZHV4KEFycmF5NGYoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggdmVjdG9yUmVkdXgoVmVjdG9yWGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSkpKSApOwotICAgIENBTExfU1VCVEVTVF81KCB2ZWN0b3JSZWR1eChBcnJheVhkKGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOCggdmVjdG9yUmVkdXgoVmVjdG9yWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4c2l6ZSkpKSApOwotICAgIENBTExfU1VCVEVTVF84KCB2ZWN0b3JSZWR1eChBcnJheVhmKGludGVybmFsOjpyYW5kb208aW50PigxLG1heHNpemUpKSkgKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzcodmVjdG9yUmVkdXgoVmVjdG9yNGYoKSkpOworICAgIENBTExfU1VCVEVTVF83KHZlY3RvclJlZHV4KEFycmF5NGYoKSkpOworICAgIENBTExfU1VCVEVTVF81KHZlY3RvclJlZHV4KFZlY3RvclhkKGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhzaXplKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSh2ZWN0b3JSZWR1eChBcnJheVhkKGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhzaXplKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfOCh2ZWN0b3JSZWR1eChWZWN0b3JYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4c2l6ZSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgodmVjdG9yUmVkdXgoQXJyYXlYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4c2l6ZSkpKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvcmVmLmNwcCBiL3Rlc3QvcmVmLmNwcAppbmRleCBmMGZhYTk0Li5kZWIyMzhmIDEwMDY0NAotLS0gYS90ZXN0L3JlZi5jcHAKKysrIGIvdGVzdC9yZWYuY3BwCkBAIC0yMiw1NCArMjIsNTMgQEAKICNpZiBFSUdFTl9BUkNIX2kzODYgJiYgIShFSUdFTl9BUkNIX3g4Nl82NCkKIAogI2lmIEVJR0VOX0NPTVBfR05VQ19TVFJJQ1QKLSNwcmFnbWEgR0NDIG9wdGltaXplICgiLWZmbG9hdC1zdG9yZSIpCisjcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZmbG9hdC1zdG9yZSIpCiAjZWxzZQogI3VuZGVmIFZFUklGWV9JU19FUVVBTAotI2RlZmluZSBWRVJJRllfSVNfRVFVQUwoWCxZKSBWRVJJRllfSVNfQVBQUk9YKFgsWSkKKyNkZWZpbmUgVkVSSUZZX0lTX0VRVUFMKFgsIFkpIFZFUklGWV9JU19BUFBST1goWCwgWSkKICNlbmRpZgogCiAjZW5kaWYKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCByZWZfbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgcmVmX21hdHJpeChjb25zdCBNYXRyaXhUeXBlICZtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsTWF0cml4VHlwZTo6T3B0aW9ucz4gRHluTWF0cml4VHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhcixEeW5hbWljLER5bmFtaWMsTWF0cml4VHlwZTo6T3B0aW9ucz4gUmVhbER5bk1hdHJpeFR5cGU7Ci0gIAorICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIE1hdHJpeFR5cGU6Ok9wdGlvbnM+IER5bk1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIE1hdHJpeFR5cGU6Ok9wdGlvbnM+IFJlYWxEeW5NYXRyaXhUeXBlOworCiAgIHR5cGVkZWYgUmVmPE1hdHJpeFR5cGU+IFJlZk1hdDsKICAgdHlwZWRlZiBSZWY8RHluTWF0cml4VHlwZT4gUmVmRHluTWF0OwogICB0eXBlZGVmIFJlZjxjb25zdCBEeW5NYXRyaXhUeXBlPiBDb25zdFJlZkR5bk1hdDsKLSAgdHlwZWRlZiBSZWY8UmVhbER5bk1hdHJpeFR5cGUgLCAwLCBTdHJpZGU8RHluYW1pYyxEeW5hbWljPiA+IFJlZlJlYWxNYXRXaXRoU3RyaWRlOworICB0eXBlZGVmIFJlZjxSZWFsRHluTWF0cml4VHlwZSwgMCwgU3RyaWRlPER5bmFtaWMsIER5bmFtaWM+PiBSZWZSZWFsTWF0V2l0aFN0cmlkZTsKIAogICBJbmRleCByb3dzID0gbS5yb3dzKCksIGNvbHMgPSBtLmNvbHMoKTsKLSAgCi0gIE1hdHJpeFR5cGUgIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgICBtMiA9IG0xOwotICAKLSAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0xKTsKLSAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsY29scy0xKTsKLSAgSW5kZXggYnJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLHJvd3MtaSk7Ci0gIEluZGV4IGJjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxjb2xzLWopOwotICAKKworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMiA9IG0xOworCisgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMSk7CisgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CisgIEluZGV4IGJyb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgcm93cyAtIGkpOworICBJbmRleCBiY29scyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIGNvbHMgLSBqKTsKKwogICBSZWZNYXQgcm0wID0gbTE7CiAgIFZFUklGWV9JU19FUVVBTChybTAsIG0xKTsKICAgUmVmRHluTWF0IHJtMSA9IG0xOwogICBWRVJJRllfSVNfRVFVQUwocm0xLCBtMSk7Ci0gIFJlZkR5bk1hdCBybTIgPSBtMS5ibG9jayhpLGosYnJvd3MsYmNvbHMpOwotICBWRVJJRllfSVNfRVFVQUwocm0yLCBtMS5ibG9jayhpLGosYnJvd3MsYmNvbHMpKTsKKyAgUmVmRHluTWF0IHJtMiA9IG0xLmJsb2NrKGksIGosIGJyb3dzLCBiY29scyk7CisgIFZFUklGWV9JU19FUVVBTChybTIsIG0xLmJsb2NrKGksIGosIGJyb3dzLCBiY29scykpOwogICBybTIuc2V0T25lcygpOwotICBtMi5ibG9jayhpLGosYnJvd3MsYmNvbHMpLnNldE9uZXMoKTsKKyAgbTIuYmxvY2soaSwgaiwgYnJvd3MsIGJjb2xzKS5zZXRPbmVzKCk7CiAgIFZFUklGWV9JU19FUVVBTChtMSwgbTIpOwotICAKLSAgbTIuYmxvY2soaSxqLGJyb3dzLGJjb2xzKS5zZXRSYW5kb20oKTsKLSAgcm0yID0gbTIuYmxvY2soaSxqLGJyb3dzLGJjb2xzKTsKKworICBtMi5ibG9jayhpLCBqLCBicm93cywgYmNvbHMpLnNldFJhbmRvbSgpOworICBybTIgPSBtMi5ibG9jayhpLCBqLCBicm93cywgYmNvbHMpOwogICBWRVJJRllfSVNfRVFVQUwobTEsIG0yKTsKLSAgCi0gIENvbnN0UmVmRHluTWF0IHJtMyA9IG0xLmJsb2NrKGksaixicm93cyxiY29scyk7Ci0gIG0xLmJsb2NrKGksaixicm93cyxiY29scykgKj0gMjsKLSAgbTIuYmxvY2soaSxqLGJyb3dzLGJjb2xzKSAqPSAyOwotICBWRVJJRllfSVNfRVFVQUwocm0zLCBtMi5ibG9jayhpLGosYnJvd3MsYmNvbHMpKTsKKworICBDb25zdFJlZkR5bk1hdCBybTMgPSBtMS5ibG9jayhpLCBqLCBicm93cywgYmNvbHMpOworICBtMS5ibG9jayhpLCBqLCBicm93cywgYmNvbHMpICo9IDI7CisgIG0yLmJsb2NrKGksIGosIGJyb3dzLCBiY29scykgKj0gMjsKKyAgVkVSSUZZX0lTX0VRVUFMKHJtMywgbTIuYmxvY2soaSwgaiwgYnJvd3MsIGJjb2xzKSk7CiAgIFJlZlJlYWxNYXRXaXRoU3RyaWRlIHJtNCA9IG0xLnJlYWwoKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJtNCwgbTIucmVhbCgpKTsKICAgcm00LmFycmF5KCkgKz0gMTsKQEAgLTc3LDU3ICs3Niw2NiBAQAogICBWRVJJRllfSVNfRVFVQUwobTEsIG0yKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4gdm9pZCByZWZfdmVjdG9yKGNvbnN0IFZlY3RvclR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZT4KK3ZvaWQgcmVmX3ZlY3Rvcihjb25zdCBWZWN0b3JUeXBlICZtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDEsVmVjdG9yVHlwZTo6T3B0aW9ucz4gRHluTWF0cml4VHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxDb2xNYWpvcj4gTWF0cml4VHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhcixEeW5hbWljLDEsVmVjdG9yVHlwZTo6T3B0aW9ucz4gUmVhbER5bk1hdHJpeFR5cGU7Ci0gIAorICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDEsIFZlY3RvclR5cGU6Ok9wdGlvbnM+IER5bk1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgQ29sTWFqb3I+IE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIER5bmFtaWMsIDEsIFZlY3RvclR5cGU6Ok9wdGlvbnM+IFJlYWxEeW5NYXRyaXhUeXBlOworCiAgIHR5cGVkZWYgUmVmPFZlY3RvclR5cGU+IFJlZk1hdDsKICAgdHlwZWRlZiBSZWY8RHluTWF0cml4VHlwZT4gUmVmRHluTWF0OwogICB0eXBlZGVmIFJlZjxjb25zdCBEeW5NYXRyaXhUeXBlPiBDb25zdFJlZkR5bk1hdDsKLSAgdHlwZWRlZiBSZWY8UmVhbER5bk1hdHJpeFR5cGUgLCAwLCBJbm5lclN0cmlkZTw+ID4gUmVmUmVhbE1hdFdpdGhTdHJpZGU7Ci0gIHR5cGVkZWYgUmVmPER5bk1hdHJpeFR5cGUgLCAwLCBJbm5lclN0cmlkZTw+ID4gUmVmTWF0V2l0aFN0cmlkZTsKKyAgdHlwZWRlZiBSZWY8UmVhbER5bk1hdHJpeFR5cGUsIDAsIElubmVyU3RyaWRlPD4+IFJlZlJlYWxNYXRXaXRoU3RyaWRlOworICB0eXBlZGVmIFJlZjxEeW5NYXRyaXhUeXBlLCAwLCBJbm5lclN0cmlkZTw+PiBSZWZNYXRXaXRoU3RyaWRlOwogCiAgIEluZGV4IHNpemUgPSBtLnNpemUoKTsKLSAgCi0gIFZlY3RvclR5cGUgIHYxID0gVmVjdG9yVHlwZTo6UmFuZG9tKHNpemUpLAotICAgICAgICAgICAgICB2MiA9IHYxOwotICBNYXRyaXhUeXBlIG1hdDEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSxzaXplKSwKLSAgICAgICAgICAgICBtYXQyID0gbWF0MSwKLSAgICAgICAgICAgICBtYXQzID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsc2l6ZSk7Ci0gIAotICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxzaXplLTEpOwotICBJbmRleCBic2l6ZSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsc2l6ZS1pKTsKLSAgCi0gIHsgUmVmTWF0ICAgIHJtMCA9IHYxOyAgICAgICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocm0wLCB2MSk7IH0KLSAgeyBSZWZNYXQgICAgcm0wID0gdjEuYmxvY2soMCwwLHNpemUsMSk7IFZFUklGWV9JU19FUVVBTChybTAsIHYxKTsgfQotICB7IFJlZkR5bk1hdCBydjEgPSB2MTsgICAgICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJ2MSwgdjEpOyB9Ci0gIHsgUmVmRHluTWF0IHJ2MSA9IHYxLmJsb2NrKDAsMCxzaXplLDEpOyBWRVJJRllfSVNfRVFVQUwocnYxLCB2MSk7IH0KIAotICBSZWZEeW5NYXQgcnYyID0gdjEuc2VnbWVudChpLGJzaXplKTsKLSAgVkVSSUZZX0lTX0VRVUFMKHJ2MiwgdjEuc2VnbWVudChpLGJzaXplKSk7CisgIFZlY3RvclR5cGUgdjEgPSBWZWN0b3JUeXBlOjpSYW5kb20oc2l6ZSksIHYyID0gdjE7CisgIE1hdHJpeFR5cGUgbWF0MSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKSwgbWF0MiA9IG1hdDEsIG1hdDMgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CisKKyAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHNpemUgLSAxKTsKKyAgSW5kZXggYnNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBzaXplIC0gaSk7CisKKyAgeworICAgIFJlZk1hdCBybTAgPSB2MTsKKyAgICBWRVJJRllfSVNfRVFVQUwocm0wLCB2MSk7CisgIH0KKyAgeworICAgIFJlZk1hdCBybTAgPSB2MS5ibG9jaygwLCAwLCBzaXplLCAxKTsKKyAgICBWRVJJRllfSVNfRVFVQUwocm0wLCB2MSk7CisgIH0KKyAgeworICAgIFJlZkR5bk1hdCBydjEgPSB2MTsKKyAgICBWRVJJRllfSVNfRVFVQUwocnYxLCB2MSk7CisgIH0KKyAgeworICAgIFJlZkR5bk1hdCBydjEgPSB2MS5ibG9jaygwLCAwLCBzaXplLCAxKTsKKyAgICBWRVJJRllfSVNfRVFVQUwocnYxLCB2MSk7CisgIH0KKworICBSZWZEeW5NYXQgcnYyID0gdjEuc2VnbWVudChpLCBic2l6ZSk7CisgIFZFUklGWV9JU19FUVVBTChydjIsIHYxLnNlZ21lbnQoaSwgYnNpemUpKTsKICAgcnYyLnNldE9uZXMoKTsKLSAgdjIuc2VnbWVudChpLGJzaXplKS5zZXRPbmVzKCk7CisgIHYyLnNlZ21lbnQoaSwgYnNpemUpLnNldE9uZXMoKTsKICAgVkVSSUZZX0lTX0VRVUFMKHYxLCB2Mik7Ci0gIAotICB2Mi5zZWdtZW50KGksYnNpemUpLnNldFJhbmRvbSgpOwotICBydjIgPSB2Mi5zZWdtZW50KGksYnNpemUpOworCisgIHYyLnNlZ21lbnQoaSwgYnNpemUpLnNldFJhbmRvbSgpOworICBydjIgPSB2Mi5zZWdtZW50KGksIGJzaXplKTsKICAgVkVSSUZZX0lTX0VRVUFMKHYxLCB2Mik7Ci0gIAotICBDb25zdFJlZkR5bk1hdCBybTMgPSB2MS5zZWdtZW50KGksYnNpemUpOwotICB2MS5zZWdtZW50KGksYnNpemUpICo9IDI7Ci0gIHYyLnNlZ21lbnQoaSxic2l6ZSkgKj0gMjsKLSAgVkVSSUZZX0lTX0VRVUFMKHJtMywgdjIuc2VnbWVudChpLGJzaXplKSk7Ci0gIAorCisgIENvbnN0UmVmRHluTWF0IHJtMyA9IHYxLnNlZ21lbnQoaSwgYnNpemUpOworICB2MS5zZWdtZW50KGksIGJzaXplKSAqPSAyOworICB2Mi5zZWdtZW50KGksIGJzaXplKSAqPSAyOworICBWRVJJRllfSVNfRVFVQUwocm0zLCB2Mi5zZWdtZW50KGksIGJzaXplKSk7CisKICAgUmVmUmVhbE1hdFdpdGhTdHJpZGUgcm00ID0gdjEucmVhbCgpOwogICBWRVJJRllfSVNfRVFVQUwocm00LCB2Mi5yZWFsKCkpOwogICBybTQuYXJyYXkoKSArPSAxOwogICB2Mi5yZWFsKCkuYXJyYXkoKSArPSAxOwogICBWRVJJRllfSVNfRVFVQUwodjEsIHYyKTsKLSAgCisKICAgUmVmTWF0V2l0aFN0cmlkZSBybTUgPSBtYXQxLnJvdyhpKS50cmFuc3Bvc2UoKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJtNSwgbWF0MS5yb3coaSkudHJhbnNwb3NlKCkpOwogICBybTUuYXJyYXkoKSArPSAxOwpAQCAtMTM4LDIyICsxNDYsMjEgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChtYXQxLCBtYXQyKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgUm93cywgaW50IENvbHM+Ci12b2lkIHJlZl92ZWN0b3JfZml4ZWRfc2l6ZXMoKQotewotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsUm93cyxDb2xzLFJvd01ham9yPiBSb3dNYWpvck1hdHJpeFR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixSb3dzLENvbHMsQ29sTWFqb3I+IENvbE1ham9yTWF0cml4VHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDEsQ29scz4gUm93VmVjdG9yVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFJvd3MsMT4gQ29sVmVjdG9yVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLENvbHMsMT4gUm93VmVjdG9yVHJhbnNwb3NlVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDEsUm93cz4gQ29sVmVjdG9yVHJhbnNwb3NlVHlwZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBSb3dzLCBpbnQgQ29scz4KK3ZvaWQgcmVmX3ZlY3Rvcl9maXhlZF9zaXplcygpIHsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzLCBDb2xzLCBSb3dNYWpvcj4gUm93TWFqb3JNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3MsIENvbHMsIENvbE1ham9yPiBDb2xNYWpvck1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgQ29scz4gUm93VmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzLCAxPiBDb2xWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHMsIDE+IFJvd1ZlY3RvclRyYW5zcG9zZVR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgUm93cz4gQ29sVmVjdG9yVHJhbnNwb3NlVHlwZTsKICAgdHlwZWRlZiBTdHJpZGU8RHluYW1pYywgRHluYW1pYz4gRHluYW1pY1N0cmlkZTsKIAogICBSb3dNYWpvck1hdHJpeFR5cGUgbXIgPSBSb3dNYWpvck1hdHJpeFR5cGU6OlJhbmRvbSgpOwogICBDb2xNYWpvck1hdHJpeFR5cGUgbWMgPSBDb2xNYWpvck1hdHJpeFR5cGU6OlJhbmRvbSgpOwogCi0gIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLFJvd3MtMSk7Ci0gIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLENvbHMtMSk7CisgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBSb3dzIC0gMSk7CisgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBDb2xzIC0gMSk7CiAKICAgLy8gUmVmZXJlbmNlIGl0aCByb3cuCiAgIFJlZjxSb3dWZWN0b3JUeXBlLCAwLCBEeW5hbWljU3RyaWRlPiBtcl9yaSA9IG1yLnJvdyhpKTsKQEAgLTE3OCw3ICsxODUsNyBAQAogICBWRVJJRllfSVNfRVFVQUwobXJfY2p0LCBtci5jb2woaikudHJhbnNwb3NlKCkpOwogICBSZWY8Q29sVmVjdG9yVHJhbnNwb3NlVHlwZSwgMCwgRHluYW1pY1N0cmlkZT4gbWNfY2p0ID0gbWMuY29sKGopOwogICBWRVJJRllfSVNfRVFVQUwobWNfY2p0LCBtYy5jb2woaikudHJhbnNwb3NlKCkpOwotICAKKwogICAvLyBDb25zdCByZWZlcmVuY2VzIHdpdGhvdXQgc3RyaWRlcy4KICAgUmVmPGNvbnN0IFJvd1ZlY3RvclR5cGU+IGNtcl9yaSA9IG1yLnJvdyhpKTsKICAgVkVSSUZZX0lTX0VRVUFMKGNtcl9yaSwgbXIucm93KGkpKTsKQEAgLTIwMSwxNDIgKzIwOCwxNTIgQEAKICAgVkVSSUZZX0lTX0VRVUFMKGNtY19janQsIG1jLmNvbChqKS50cmFuc3Bvc2UoKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4gdm9pZCBjaGVja19jb25zdF9jb3JyZWN0bmVzcyhjb25zdCBQbGFpbk9iamVjdFR5cGUmKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFBsYWluT2JqZWN0VHlwZT4KK3ZvaWQgY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoY29uc3QgUGxhaW5PYmplY3RUeXBlICYpIHsKICAgLy8gdmVyaWZ5IHRoYXQgcmVmLXRvLWNvbnN0IGRvbid0IGhhdmUgTHZhbHVlQml0CiAgIHR5cGVkZWYgc3RkOjphZGRfY29uc3RfdDxQbGFpbk9iamVjdFR5cGU+IENvbnN0UGxhaW5PYmplY3RUeXBlOwotICBWRVJJRlkoICEoaW50ZXJuYWw6OnRyYWl0czxSZWY8Q29uc3RQbGFpbk9iamVjdFR5cGU+ID46OkZsYWdzICYgTHZhbHVlQml0KSApOwotICBWRVJJRlkoICEoaW50ZXJuYWw6OnRyYWl0czxSZWY8Q29uc3RQbGFpbk9iamVjdFR5cGUsIEFsaWduZWQ+ID46OkZsYWdzICYgTHZhbHVlQml0KSApOwotICBWRVJJRlkoICEoUmVmPENvbnN0UGxhaW5PYmplY3RUeXBlPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7Ci0gIFZFUklGWSggIShSZWY8Q29uc3RQbGFpbk9iamVjdFR5cGUsIEFsaWduZWQ+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKKyAgVkVSSUZZKCEoaW50ZXJuYWw6OnRyYWl0czxSZWY8Q29uc3RQbGFpbk9iamVjdFR5cGU+Pjo6RmxhZ3MgJiBMdmFsdWVCaXQpKTsKKyAgVkVSSUZZKCEoaW50ZXJuYWw6OnRyYWl0czxSZWY8Q29uc3RQbGFpbk9iamVjdFR5cGUsIEFsaWduZWQ+Pjo6RmxhZ3MgJiBMdmFsdWVCaXQpKTsKKyAgVkVSSUZZKCEoUmVmPENvbnN0UGxhaW5PYmplY3RUeXBlPjo6RmxhZ3MgJiBMdmFsdWVCaXQpKTsKKyAgVkVSSUZZKCEoUmVmPENvbnN0UGxhaW5PYmplY3RUeXBlLCBBbGlnbmVkPjo6RmxhZ3MgJiBMdmFsdWVCaXQpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgQj4KLUVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfMShSZWY8VmVjdG9yWGY+IGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEsYik7IH0KLXRlbXBsYXRlPHR5cGVuYW1lIEI+Ci1FSUdFTl9ET05UX0lOTElORSB2b2lkIGNhbGxfcmVmXzIoY29uc3QgUmVmPGNvbnN0IFZlY3RvclhmPiYgYSwgY29uc3QgQiAmYikgeyBWRVJJRllfSVNfRVFVQUwoYSxiKTsgfQotdGVtcGxhdGU8dHlwZW5hbWUgQj4KLUVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfMyhSZWY8VmVjdG9yWGYsMCxJbm5lclN0cmlkZTw+ID4gYSwgY29uc3QgQiAmYikgeyBWRVJJRllfSVNfRVFVQUwoYSxiKTsgfQotdGVtcGxhdGU8dHlwZW5hbWUgQj4KLUVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfNChjb25zdCBSZWY8Y29uc3QgVmVjdG9yWGYsMCxJbm5lclN0cmlkZTw+ID4mIGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEsYik7IH0KLXRlbXBsYXRlPHR5cGVuYW1lIEI+Ci1FSUdFTl9ET05UX0lOTElORSB2b2lkIGNhbGxfcmVmXzUoUmVmPE1hdHJpeFhmLDAsT3V0ZXJTdHJpZGU8PiA+IGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEsYik7IH0KLXRlbXBsYXRlPHR5cGVuYW1lIEI+Ci1FSUdFTl9ET05UX0lOTElORSB2b2lkIGNhbGxfcmVmXzYoY29uc3QgUmVmPGNvbnN0IE1hdHJpeFhmLDAsT3V0ZXJTdHJpZGU8PiA+JiBhLCBjb25zdCBCICZiKSB7IFZFUklGWV9JU19FUVVBTChhLGIpOyB9Ci10ZW1wbGF0ZTx0eXBlbmFtZSBCPgotRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl83KFJlZjxNYXRyaXg8ZmxvYXQsRHluYW1pYywzPiA+IGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEsYik7IH0KK3RlbXBsYXRlIDx0eXBlbmFtZSBCPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl8xKFJlZjxWZWN0b3JYZj4gYSwgY29uc3QgQiAmYikgeworICBWRVJJRllfSVNfRVFVQUwoYSwgYik7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfMihjb25zdCBSZWY8Y29uc3QgVmVjdG9yWGY+ICZhLCBjb25zdCBCICZiKSB7CisgIFZFUklGWV9JU19FUVVBTChhLCBiKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBCPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl8zKFJlZjxWZWN0b3JYZiwgMCwgSW5uZXJTdHJpZGU8Pj4gYSwgY29uc3QgQiAmYikgeworICBWRVJJRllfSVNfRVFVQUwoYSwgYik7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfNChjb25zdCBSZWY8Y29uc3QgVmVjdG9yWGYsIDAsIElubmVyU3RyaWRlPD4+ICZhLCBjb25zdCBCICZiKSB7CisgIFZFUklGWV9JU19FUVVBTChhLCBiKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBCPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl81KFJlZjxNYXRyaXhYZiwgMCwgT3V0ZXJTdHJpZGU8Pj4gYSwgY29uc3QgQiAmYikgeworICBWRVJJRllfSVNfRVFVQUwoYSwgYik7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQj4KK0VJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfNihjb25zdCBSZWY8Y29uc3QgTWF0cml4WGYsIDAsIE91dGVyU3RyaWRlPD4+ICZhLCBjb25zdCBCICZiKSB7CisgIFZFUklGWV9JU19FUVVBTChhLCBiKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBCPgorRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl83KFJlZjxNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIDM+PiBhLCBjb25zdCBCICZiKSB7CisgIFZFUklGWV9JU19FUVVBTChhLCBiKTsKK30KIAotdm9pZCBjYWxsX3JlZigpCi17Ci0gIFZlY3RvclhjZiBjYSAgPSBWZWN0b3JYY2Y6OlJhbmRvbSgxMCk7Ci0gIFZlY3RvclhmIGEgICAgPSBWZWN0b3JYZjo6UmFuZG9tKDEwKTsKK3ZvaWQgY2FsbF9yZWYoKSB7CisgIFZlY3RvclhjZiBjYSA9IFZlY3RvclhjZjo6UmFuZG9tKDEwKTsKKyAgVmVjdG9yWGYgYSA9IFZlY3RvclhmOjpSYW5kb20oMTApOwogICBSb3dWZWN0b3JYZiBiID0gUm93VmVjdG9yWGY6OlJhbmRvbSgxMCk7Ci0gIE1hdHJpeFhmIEEgICAgPSBNYXRyaXhYZjo6UmFuZG9tKDEwLDEwKTsKKyAgTWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oMTAsIDEwKTsKICAgUm93VmVjdG9yM2YgYyA9IFJvd1ZlY3RvcjNmOjpSYW5kb20oKTsKLSAgY29uc3QgVmVjdG9yWGYmIGFjKGEpOwotICBWZWN0b3JCbG9jazxWZWN0b3JYZj4gYWIoYSwwLDMpOwotICBjb25zdCBWZWN0b3JCbG9jazxWZWN0b3JYZj4gYWJjKGEsMCwzKTsKLSAgCisgIGNvbnN0IFZlY3RvclhmICZhYyhhKTsKKyAgVmVjdG9yQmxvY2s8VmVjdG9yWGY+IGFiKGEsIDAsIDMpOworICBjb25zdCBWZWN0b3JCbG9jazxWZWN0b3JYZj4gYWJjKGEsIDAsIDMpOwogCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8xKGEsYSksIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMShiLGIudHJhbnNwb3NlKCkpLCAwKTsKLS8vICAgY2FsbF9yZWZfMShhYyxhPGMpOyAgICAgICAgICAgLy8gZG9lcyBub3QgY29tcGlsZSBiZWNhdXNlIGFjIGlzIGNvbnN0Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8xKGFiLGFiKSwgMCk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8xKGEuaGVhZCg0KSxhLmhlYWQoNCkpLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzEoYWJjLGFiYyksIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMShBLmNvbCgzKSxBLmNvbCgzKSksIDApOwotLy8gICBjYWxsX3JlZl8xKEEucm93KDMpLEEucm93KDMpKTsgICAgLy8gZG9lcyBub3QgY29tcGlsZSBiZWNhdXNlIGlubmVyc3RyaWRlIT0xCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8zKEEucm93KDMpLEEucm93KDMpLnRyYW5zcG9zZSgpKSwgMCk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl80KEEucm93KDMpLEEucm93KDMpLnRyYW5zcG9zZSgpKSwgMCk7Ci0vLyAgIGNhbGxfcmVmXzEoYSthLCBhK2EpOyAgICAgICAgICAvLyBkb2VzIG5vdCBjb21waWxlIGZvciBvYnZpb3VzIHJlYXNvbgorICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl8xKGEsIGEpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMShiLCBiLnRyYW5zcG9zZSgpKSwgMCk7CisgIC8vICAgY2FsbF9yZWZfMShhYyxhPGMpOyAgICAgICAgICAgLy8gZG9lcyBub3QgY29tcGlsZSBiZWNhdXNlIGFjIGlzIGNvbnN0CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzEoYWIsIGFiKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzEoYS5oZWFkKDQpLCBhLmhlYWQoNCkpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMShhYmMsIGFiYyksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl8xKEEuY29sKDMpLCBBLmNvbCgzKSksIDApOworICAvLyAgIGNhbGxfcmVmXzEoQS5yb3coMyksQS5yb3coMykpOyAgICAvLyBkb2VzIG5vdCBjb21waWxlIGJlY2F1c2UgaW5uZXJzdHJpZGUhPTEKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMyhBLnJvdygzKSwgQS5yb3coMykudHJhbnNwb3NlKCkpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfNChBLnJvdygzKSwgQS5yb3coMykudHJhbnNwb3NlKCkpLCAwKTsKKyAgLy8gICBjYWxsX3JlZl8xKGErYSwgYSthKTsgICAgICAgICAgLy8gZG9lcyBub3QgY29tcGlsZSBmb3Igb2J2aW91cyByZWFzb24KIAotICBNYXRyaXhYZiB0bXAgPSBBKkEuY29sKDEpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBKkEuY29sKDEpLCB0bXApLCAxKTsgICAgIC8vIGV2YWx1YXRlZCBpbnRvIGEgdGVtcAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihhYy5oZWFkKDUpLGFjLmhlYWQoNSkpLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzIoYWMsYWMpLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzIoYSxhKSwgMCk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKGFiLGFiKSwgMCk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKGEuaGVhZCg0KSxhLmhlYWQoNCkpLCAwKTsKLSAgdG1wID0gYSthOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihhK2EsdG1wKSwgMSk7ICAgICAgICAgICAgLy8gZXZhbHVhdGVkIGludG8gYSB0ZW1wCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKGNhLmltYWcoKSxjYS5pbWFnKCkpLCAxKTsgICAgICAvLyBldmFsdWF0ZWQgaW50byBhIHRlbXAKKyAgTWF0cml4WGYgdG1wID0gQSAqIEEuY29sKDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl8yKEEgKiBBLmNvbCgxKSwgdG1wKSwgMSk7ICAvLyBldmFsdWF0ZWQgaW50byBhIHRlbXAKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMihhYy5oZWFkKDUpLCBhYy5oZWFkKDUpKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzIoYWMsIGFjKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzIoYSwgYSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl8yKGFiLCBhYiksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl8yKGEuaGVhZCg0KSwgYS5oZWFkKDQpKSwgMCk7CisgIHRtcCA9IGEgKyBhOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl8yKGEgKyBhLCB0bXApLCAxKTsgICAgICAgICAgICAvLyBldmFsdWF0ZWQgaW50byBhIHRlbXAKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMihjYS5pbWFnKCksIGNhLmltYWcoKSksIDEpOyAgLy8gZXZhbHVhdGVkIGludG8gYSB0ZW1wCiAKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzQoYWMuaGVhZCg1KSxhYy5oZWFkKDUpKSwgMCk7Ci0gIHRtcCA9IGErYTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzQoYSthLHRtcCksIDEpOyAgICAgICAgICAgLy8gZXZhbHVhdGVkIGludG8gYSB0ZW1wCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl80KGNhLmltYWcoKSxjYS5pbWFnKCkpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfNChhYy5oZWFkKDUpLCBhYy5oZWFkKDUpKSwgMCk7CisgIHRtcCA9IGEgKyBhOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl80KGEgKyBhLCB0bXApLCAxKTsgIC8vIGV2YWx1YXRlZCBpbnRvIGEgdGVtcAorICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl80KGNhLmltYWcoKSwgY2EuaW1hZygpKSwgMCk7CiAKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzUoYSxhKSwgMCk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl81KGEuaGVhZCgzKSxhLmhlYWQoMykpLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzUoQSxBKSwgMCk7Ci0vLyAgIGNhbGxfcmVmXzUoQS50cmFuc3Bvc2UoKSxBLnRyYW5zcG9zZSgpKTsgICAvLyBkb2VzIG5vdCBjb21waWxlIGJlY2F1c2Ugc3RvcmFnZSBvcmRlciBkb2VzIG5vdCBtYXRjaAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNShBLmJsb2NrKDEsMSwyLDIpLEEuYmxvY2soMSwxLDIsMikpLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzUoYixiKSwgMCk7ICAgICAgICAgICAgIC8vIHN0b3JhZ2Ugb3JkZXIgZG8gbm90IG1hdGNoLCBidXQgdGhpcyBpcyBhIGRlZ2VuZXJhdGUgY2FzZSB0aGF0IHNob3VsZCB3b3JrCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl81KGEucm93KDMpLGEucm93KDMpKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzUoYSwgYSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl81KGEuaGVhZCgzKSwgYS5oZWFkKDMpKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzUoQSwgQSksIDApOworICAvLyAgIGNhbGxfcmVmXzUoQS50cmFuc3Bvc2UoKSxBLnRyYW5zcG9zZSgpKTsgICAvLyBkb2VzIG5vdCBjb21waWxlIGJlY2F1c2Ugc3RvcmFnZSBvcmRlciBkb2VzIG5vdCBtYXRjaAorICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl81KEEuYmxvY2soMSwgMSwgMiwgMiksIEEuYmxvY2soMSwgMSwgMiwgMikpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfNShiLCBiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAvLyBzdG9yYWdlIG9yZGVyIGRvIG5vdCBtYXRjaCwgYnV0IHRoaXMgaXMgYSBkZWdlbmVyYXRlIGNhc2UgdGhhdCBzaG91bGQgd29yaworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl81KGEucm93KDMpLCBhLnJvdygzKSksIDApOwogCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl82KGEsYSksIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNihhLmhlYWQoMyksYS5oZWFkKDMpKSwgMCk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl82KEEucm93KDMpLEEucm93KDMpKSwgMSk7ICAgICAgICAgICAvLyBldmFsdWF0ZWQgaW50byBhIHRlbXAgdGhvdXRoIGl0IGNvdWxkIGJlIGF2b2lkZWQgYnkgdmlld2luZyBpdCBhcyBhIDF4biBtYXRyaXgKLSAgdG1wID0gQStBOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNihBK0EsdG1wKSwgMSk7ICAgICAgICAgICAgICAgIC8vIGV2YWx1YXRlZCBpbnRvIGEgdGVtcAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNihBLEEpLCAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzYoQS50cmFuc3Bvc2UoKSxBLnRyYW5zcG9zZSgpKSwgMSk7ICAgICAgLy8gZXZhbHVhdGVkIGludG8gYSB0ZW1wIGJlY2F1c2UgdGhlIHN0b3JhZ2Ugb3JkZXJzIGRvIG5vdCBtYXRjaAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNihBLmJsb2NrKDEsMSwyLDIpLEEuYmxvY2soMSwxLDIsMikpLCAwKTsKLSAgCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl83KGMsYyksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl82KGEsIGEpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfNihhLmhlYWQoMyksIGEuaGVhZCgzKSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl82KEEucm93KDMpLCBBLnJvdygzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAgLy8gZXZhbHVhdGVkIGludG8gYSB0ZW1wIHRob3V0aCBpdCBjb3VsZCBiZSBhdm9pZGVkIGJ5IHZpZXdpbmcgaXQgYXMgYSAxeG4gbWF0cml4CisgIHRtcCA9IEEgKyBBOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl82KEEgKyBBLCB0bXApLCAxKTsgIC8vIGV2YWx1YXRlZCBpbnRvIGEgdGVtcAorICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl82KEEsIEEpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfNihBLnRyYW5zcG9zZSgpLCBBLnRyYW5zcG9zZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7ICAvLyBldmFsdWF0ZWQgaW50byBhIHRlbXAgYmVjYXVzZSB0aGUgc3RvcmFnZSBvcmRlcnMgZG8gbm90IG1hdGNoCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzYoQS5ibG9jaygxLCAxLCAyLCAyKSwgQS5ibG9jaygxLCAxLCAyLCAyKSksIDApOworCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzcoYywgYyksIDApOwogfQogCi10eXBlZGVmIE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPiBSb3dNYXRyaXhYZDsKLWludCB0ZXN0X3JlZl9vdmVybG9hZF9mdW4xKFJlZjxNYXRyaXhYZD4gKSAgICAgICB7IHJldHVybiAxOyB9Ci1pbnQgdGVzdF9yZWZfb3ZlcmxvYWRfZnVuMShSZWY8Um93TWF0cml4WGQ+ICkgICAgeyByZXR1cm4gMjsgfQotaW50IHRlc3RfcmVmX292ZXJsb2FkX2Z1bjEoUmVmPE1hdHJpeFhmPiApICAgICAgIHsgcmV0dXJuIDM7IH0KK3R5cGVkZWYgTWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+IFJvd01hdHJpeFhkOworaW50IHRlc3RfcmVmX292ZXJsb2FkX2Z1bjEoUmVmPE1hdHJpeFhkPikgeyByZXR1cm4gMTsgfQoraW50IHRlc3RfcmVmX292ZXJsb2FkX2Z1bjEoUmVmPFJvd01hdHJpeFhkPikgeyByZXR1cm4gMjsgfQoraW50IHRlc3RfcmVmX292ZXJsb2FkX2Z1bjEoUmVmPE1hdHJpeFhmPikgeyByZXR1cm4gMzsgfQogCi1pbnQgdGVzdF9yZWZfb3ZlcmxvYWRfZnVuMihSZWY8Y29uc3QgTWF0cml4WGQ+ICkgeyByZXR1cm4gNDsgfQotaW50IHRlc3RfcmVmX292ZXJsb2FkX2Z1bjIoUmVmPGNvbnN0IE1hdHJpeFhmPiApIHsgcmV0dXJuIDU7IH0KK2ludCB0ZXN0X3JlZl9vdmVybG9hZF9mdW4yKFJlZjxjb25zdCBNYXRyaXhYZD4pIHsgcmV0dXJuIDQ7IH0KK2ludCB0ZXN0X3JlZl9vdmVybG9hZF9mdW4yKFJlZjxjb25zdCBNYXRyaXhYZj4pIHsgcmV0dXJuIDU7IH0KIAotdm9pZCB0ZXN0X3JlZl9hbWJpZ3VvdXMoY29uc3QgUmVmPGNvbnN0IEFycmF5WGQ+ICZBLCBSZWY8QXJyYXlYZD4gQikKLXsKK3ZvaWQgdGVzdF9yZWZfYW1iaWd1b3VzKGNvbnN0IFJlZjxjb25zdCBBcnJheVhkPiAmQSwgUmVmPEFycmF5WGQ+IEIpIHsKICAgQiA9IEE7CiAgIEIgPSBBIC0gQTsKIH0KIAogLy8gU2VlIGFsc28gYnVnIDk2OQotdm9pZCB0ZXN0X3JlZl9vdmVybG9hZHMoKQotewordm9pZCB0ZXN0X3JlZl9vdmVybG9hZHMoKSB7CiAgIE1hdHJpeFhkIEFkLCBCZDsKICAgUm93TWF0cml4WGQgckFkLCByQmQ7Ci0gIFZFUklGWSggdGVzdF9yZWZfb3ZlcmxvYWRfZnVuMShBZCk9PTEgKTsKLSAgVkVSSUZZKCB0ZXN0X3JlZl9vdmVybG9hZF9mdW4xKHJBZCk9PTIgKTsKLSAgCisgIFZFUklGWSh0ZXN0X3JlZl9vdmVybG9hZF9mdW4xKEFkKSA9PSAxKTsKKyAgVkVSSUZZKHRlc3RfcmVmX292ZXJsb2FkX2Z1bjEockFkKSA9PSAyKTsKKwogICBNYXRyaXhYZiBBZiwgQmY7Ci0gIFZFUklGWSggdGVzdF9yZWZfb3ZlcmxvYWRfZnVuMihBZCk9PTQgKTsKLSAgVkVSSUZZKCB0ZXN0X3JlZl9vdmVybG9hZF9mdW4yKEFkK0JkKT09NCApOwotICBWRVJJRlkoIHRlc3RfcmVmX292ZXJsb2FkX2Z1bjIoQWYrQmYpPT01ICk7Ci0gIAorICBWRVJJRlkodGVzdF9yZWZfb3ZlcmxvYWRfZnVuMihBZCkgPT0gNCk7CisgIFZFUklGWSh0ZXN0X3JlZl9vdmVybG9hZF9mdW4yKEFkICsgQmQpID09IDQpOworICBWRVJJRlkodGVzdF9yZWZfb3ZlcmxvYWRfZnVuMihBZiArIEJmKSA9PSA1KTsKKwogICBBcnJheVhkIEEsIEI7CiAgIHRlc3RfcmVmX2FtYmlndW91cyhBLCBCKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgUmVmXz4KLXN0cnVjdCBSZWZEZXJpdmVkCi0gIDogUmVmXwotewordGVtcGxhdGUgPHR5cGVuYW1lIFJlZl8+CitzdHJ1Y3QgUmVmRGVyaXZlZCA6IFJlZl8gewogICB1c2luZyBSZWZfOjptX29iamVjdDsKIH07CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBEZXJpdmVkPiB2b2lkIHRlc3RfY3JlZl9tb3ZlX2N0b3IoY29uc3QgRGVuc2VCYXNlPERlcml2ZWQ+ICZleHByKSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgdHlwZW5hbWUgRGVyaXZlZD4KK3ZvaWQgdGVzdF9jcmVmX21vdmVfY3Rvcihjb25zdCBEZW5zZUJhc2U8RGVyaXZlZD4gJmV4cHIpIHsKICAgdHlwZWRlZiBSZWY8Y29uc3QgTWF0cml4VHlwZT4gQ1JlZjsKICAgdHlwZWRlZiBSZWZEZXJpdmVkPENSZWY+IENSZWZEZXJpdmVkOwogCiAgIGNvbnN0IGJvb2wgb3duc19kYXRhID0gIWJvb2woaW50ZXJuYWw6OnRyYWl0czxDUmVmPjo6dGVtcGxhdGUgbWF0Y2g8RGVyaXZlZD46OnR5cGU6OnZhbHVlKTsKICAgQ1JlZiBjcmVmMShleHByKTsKLSAgY29uc3QgZG91YmxlICpkYXRhMSA9IGNyZWYxLmRhdGEoKSwKLSAgICAgICAgICAgICAgICpvYmpfZGF0YTEgPSBzdGF0aWNfY2FzdDxDUmVmRGVyaXZlZCAmPihjcmVmMSkubV9vYmplY3QuZGF0YSgpOworICBjb25zdCBkb3VibGUgKmRhdGExID0gY3JlZjEuZGF0YSgpLCAqb2JqX2RhdGExID0gc3RhdGljX2Nhc3Q8Q1JlZkRlcml2ZWQgJj4oY3JlZjEpLm1fb2JqZWN0LmRhdGEoKTsKICAgVkVSSUZZKHRlc3RfaXNfZXF1YWwoZGF0YTEsIG9ial9kYXRhMSwgb3duc19kYXRhKSk7CiAgIENSZWYgY3JlZjIoc3RkOjptb3ZlKGNyZWYxKSk7CiAgIFZFUklGWV9JU19FUVVBTChkYXRhMSwgY3JlZjEuZGF0YSgpKTsKLSAgY29uc3QgZG91YmxlICpkYXRhMiA9IGNyZWYyLmRhdGEoKSwKLSAgICAgICAgICAgICAgICpvYmpfZGF0YTIgPSBzdGF0aWNfY2FzdDxDUmVmRGVyaXZlZCAmPihjcmVmMikubV9vYmplY3QuZGF0YSgpOworICBjb25zdCBkb3VibGUgKmRhdGEyID0gY3JlZjIuZGF0YSgpLCAqb2JqX2RhdGEyID0gc3RhdGljX2Nhc3Q8Q1JlZkRlcml2ZWQgJj4oY3JlZjIpLm1fb2JqZWN0LmRhdGEoKTsKICAgVkVSSUZZKHRlc3RfaXNfZXF1YWwoZGF0YTEsIGRhdGEyLCBNYXRyaXhUeXBlOjpNYXhTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljIHx8ICFvd25zX2RhdGEpKTsKICAgVkVSSUZZKHRlc3RfaXNfZXF1YWwoZGF0YTEsIG9ial9kYXRhMiwgTWF0cml4VHlwZTo6TWF4U2l6ZUF0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyAmJiBvd25zX2RhdGEpKTsKIH0KQEAgLTM1Miw0MCArMzY5LDM5IEBACiAgIFZFUklGWSh0ZXN0X2lzX2VxdWFsKGNyZWYuZGF0YSgpLCBtLmRhdGEoKSwgdHJ1ZSkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QocmVmKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCByZWZfdmVjdG9yKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCByZWZfdmVjdG9yKFZlY3RvcjRkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKE1hdHJpeDRkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIHJlZl92ZWN0b3IoVmVjdG9yNGNmKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIHJlZl92ZWN0b3IoVmVjdG9yWGNmKDgpKSApOwotICAgIENBTExfU1VCVEVTVF81KCByZWZfdmVjdG9yKFZlY3RvclhpKDEyKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoVmVjdG9yWGkoMTIpKSApOworRUlHRU5fREVDTEFSRV9URVNUKHJlZikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShyZWZfdmVjdG9yKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8xKGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKHJlZl92ZWN0b3IoVmVjdG9yNGQoKSkpOworICAgIENBTExfU1VCVEVTVF8yKGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKE1hdHJpeDRkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhyZWZfdmVjdG9yKFZlY3RvcjRjZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQocmVmX3ZlY3RvcihWZWN0b3JYY2YoOCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShyZWZfdmVjdG9yKFZlY3RvclhpKDEyKSkpOworICAgIENBTExfU1VCVEVTVF81KGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKFZlY3RvclhpKDEyKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzEoIHJlZl9tYXRyaXgoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCByZWZfbWF0cml4KE1hdHJpeDRkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIHJlZl9tYXRyaXgoTWF0cml4PGZsb2F0LDMsNT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggcmVmX21hdHJpeChNYXRyaXhYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTApLGludGVybmFsOjpyYW5kb208aW50PigxLDEwKSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIHJlZl9tYXRyaXgoTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LDEwLDE1PigpKSApOwotICAgIENBTExfU1VCVEVTVF81KCByZWZfbWF0cml4KE1hdHJpeFhpKGludGVybmFsOjpyYW5kb208aW50PigxLDEwKSxpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMCkpKSApOwotICAgIENBTExfU1VCVEVTVF82KCBjYWxsX3JlZigpICk7CisgICAgQ0FMTF9TVUJURVNUXzEocmVmX21hdHJpeChNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihyZWZfbWF0cml4KE1hdHJpeDRkKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShyZWZfbWF0cml4KE1hdHJpeDxmbG9hdCwgMywgNT4oKSkpOworICAgIENBTExfU1VCVEVTVF80KHJlZl9tYXRyaXgoTWF0cml4WGNmKGludGVybmFsOjpyYW5kb208aW50PigxLCAxMCksIGludGVybmFsOjpyYW5kb208aW50PigxLCAxMCkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQocmVmX21hdHJpeChNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIDEwLCAxNT4oKSkpOworICAgIENBTExfU1VCVEVTVF81KHJlZl9tYXRyaXgoTWF0cml4WGkoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDEwKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDEwKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNihjYWxsX3JlZigpKTsKIAotICAgIENBTExfU1VCVEVTVF84KCAocmVmX3ZlY3Rvcl9maXhlZF9zaXplczxmbG9hdCwzLDU+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzgoIChyZWZfdmVjdG9yX2ZpeGVkX3NpemVzPGZsb2F0LDE1LDEwPigpKSApOworICAgIENBTExfU1VCVEVTVF84KChyZWZfdmVjdG9yX2ZpeGVkX3NpemVzPGZsb2F0LCAzLCA1PigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzgoKHJlZl92ZWN0b3JfZml4ZWRfc2l6ZXM8ZmxvYXQsIDE1LCAxMD4oKSkpOwogICB9Ci0gIAotICBDQUxMX1NVQlRFU1RfNyggdGVzdF9yZWZfb3ZlcmxvYWRzKCkgKTsKIAotICBDQUxMX1NVQlRFU1RfOSggdGVzdF9jcmVmX21vdmVfY3RvcjxWZWN0b3JYZD4oVmVjdG9yWGQ6Ok9uZXMoOSkpICk7Ci0gIENBTExfU1VCVEVTVF85KCB0ZXN0X2NyZWZfbW92ZV9jdG9yPFZlY3RvclhkPihWZWN0b3JYZCg5KSkgKTsKLSAgQ0FMTF9TVUJURVNUXzkoIHRlc3RfY3JlZl9tb3ZlX2N0b3I8VmVjdG9yM2Q+KFZlY3RvcjNkOjpPbmVzKCkpICk7Ci0gIENBTExfU1VCVEVTVF85KCB0ZXN0X2NyZWZfbW92ZV9jdG9yPFZlY3RvcjNkPihWZWN0b3IzZCgpKSApOwotICBDQUxMX1NVQlRFU1RfOSggdGVzdF9jcmVmX21vdmVfY3RvcjxNYXRyaXhYZD4oTWF0cml4WGQ6Ok9uZXMoOSwgNSkpICk7Ci0gIENBTExfU1VCVEVTVF85KCB0ZXN0X2NyZWZfbW92ZV9jdG9yPE1hdHJpeFhkPihNYXRyaXhYZCg5LCA1KSkgKTsKLSAgQ0FMTF9TVUJURVNUXzkoIHRlc3RfY3JlZl9tb3ZlX2N0b3I8TWF0cml4M2Q+KE1hdHJpeDNkOjpPbmVzKCkpICk7Ci0gIENBTExfU1VCVEVTVF85KCB0ZXN0X2NyZWZfbW92ZV9jdG9yPE1hdHJpeDNkPihNYXRyaXgzZCgpKSApOworICBDQUxMX1NVQlRFU1RfNyh0ZXN0X3JlZl9vdmVybG9hZHMoKSk7CisKKyAgQ0FMTF9TVUJURVNUXzkodGVzdF9jcmVmX21vdmVfY3RvcjxWZWN0b3JYZD4oVmVjdG9yWGQ6Ok9uZXMoOSkpKTsKKyAgQ0FMTF9TVUJURVNUXzkodGVzdF9jcmVmX21vdmVfY3RvcjxWZWN0b3JYZD4oVmVjdG9yWGQoOSkpKTsKKyAgQ0FMTF9TVUJURVNUXzkodGVzdF9jcmVmX21vdmVfY3RvcjxWZWN0b3IzZD4oVmVjdG9yM2Q6Ok9uZXMoKSkpOworICBDQUxMX1NVQlRFU1RfOSh0ZXN0X2NyZWZfbW92ZV9jdG9yPFZlY3RvcjNkPihWZWN0b3IzZCgpKSk7CisgIENBTExfU1VCVEVTVF85KHRlc3RfY3JlZl9tb3ZlX2N0b3I8TWF0cml4WGQ+KE1hdHJpeFhkOjpPbmVzKDksIDUpKSk7CisgIENBTExfU1VCVEVTVF85KHRlc3RfY3JlZl9tb3ZlX2N0b3I8TWF0cml4WGQ+KE1hdHJpeFhkKDksIDUpKSk7CisgIENBTExfU1VCVEVTVF85KHRlc3RfY3JlZl9tb3ZlX2N0b3I8TWF0cml4M2Q+KE1hdHJpeDNkOjpPbmVzKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzkodGVzdF9jcmVmX21vdmVfY3RvcjxNYXRyaXgzZD4oTWF0cml4M2QoKSkpOwogICBDQUxMX1NVQlRFU1RfMTAodGVzdF9jb250aWd1b3VzX3JlZl9ub19jb3B5KFZlY3RvclhkKDkpKSk7CiAgIENBTExfU1VCVEVTVF8xMCh0ZXN0X2NvbnRpZ3VvdXNfcmVmX25vX2NvcHkoVmVjdG9yM2QoKSkpOwogICBDQUxMX1NVQlRFU1RfMTAodGVzdF9jb250aWd1b3VzX3JlZl9ub19jb3B5KE1hdHJpeFhkKDksIDUpKSk7CmRpZmYgLS1naXQgYS90ZXN0L3Jlc2hhcGUuY3BwIGIvdGVzdC9yZXNoYXBlLmNwcAppbmRleCBjYTdhNzNlLi43Yzc2Y2Q1IDEwMDY0NAotLS0gYS90ZXN0L3Jlc2hhcGUuY3BwCisrKyBiL3Rlc3QvcmVzaGFwZS5jcHAKQEAgLTEwLDIxNCArMTAsMjAxIEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAKLXVzaW5nIEVpZ2VuOjpwbGFjZWhvbGRlcnM6Omxhc3Q7CiB1c2luZyBFaWdlbjo6cGxhY2Vob2xkZXJzOjphbGw7Cit1c2luZyBFaWdlbjo6cGxhY2Vob2xkZXJzOjpsYXN0OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUMSx0eXBlbmFtZSBUMj4KLXN0ZDo6ZW5hYmxlX2lmX3Q8aW50ZXJuYWw6OmlzX3NhbWU8VDEsVDI+Ojp2YWx1ZSxib29sPgotaXNfc2FtZV9lcShjb25zdCBUMSYgYSwgY29uc3QgVDImIGIpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RkOjplbmFibGVfaWZfdDxpbnRlcm5hbDo6aXNfc2FtZTxUMSwgVDI+Ojp2YWx1ZSwgYm9vbD4gaXNfc2FtZV9lcShjb25zdCBUMSYgYSwgY29uc3QgVDImIGIpIHsKICAgcmV0dXJuIChhLmFycmF5KCkgPT0gYi5hcnJheSgpKS5hbGwoKTsKIH0KIAotdGVtcGxhdGUgPGludCBPcmRlcix0eXBlbmFtZSBNYXRUeXBlPgotdm9pZCBjaGVja19hdXRvX3Jlc2hhcGU0eDQoTWF0VHlwZSBtKQotewotICBpbnRlcm5hbDo6VmFyaWFibGVBbmRGaXhlZEludDxNYXRUeXBlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYz8tMTogMT4gIHYxKCAxKTsKLSAgaW50ZXJuYWw6OlZhcmlhYmxlQW5kRml4ZWRJbnQ8TWF0VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWM/LTE6IDI+ICB2MiggMik7Ci0gIGludGVybmFsOjpWYXJpYWJsZUFuZEZpeGVkSW50PE1hdFR5cGU6OlNpemVBdENvbXBpbGVUaW1lPT1EeW5hbWljPy0xOiA0PiAgdjQoIDQpOwotICBpbnRlcm5hbDo6VmFyaWFibGVBbmRGaXhlZEludDxNYXRUeXBlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYz8tMTogOD4gIHY4KCA4KTsKLSAgaW50ZXJuYWw6OlZhcmlhYmxlQW5kRml4ZWRJbnQ8TWF0VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWM/LTE6MTY+IHYxNigxNik7Cit0ZW1wbGF0ZSA8aW50IE9yZGVyLCB0eXBlbmFtZSBNYXRUeXBlPgordm9pZCBjaGVja19hdXRvX3Jlc2hhcGU0eDQoTWF0VHlwZSBtKSB7CisgIGludGVybmFsOjpWYXJpYWJsZUFuZEZpeGVkSW50PE1hdFR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMgPyAtMSA6IDE+IHYxKDEpOworICBpbnRlcm5hbDo6VmFyaWFibGVBbmRGaXhlZEludDxNYXRUeXBlOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljID8gLTEgOiAyPiB2MigyKTsKKyAgaW50ZXJuYWw6OlZhcmlhYmxlQW5kRml4ZWRJbnQ8TWF0VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyA/IC0xIDogND4gdjQoNCk7CisgIGludGVybmFsOjpWYXJpYWJsZUFuZEZpeGVkSW50PE1hdFR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMgPyAtMSA6IDg+IHY4KDgpOworICBpbnRlcm5hbDo6VmFyaWFibGVBbmRGaXhlZEludDxNYXRUeXBlOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljID8gLTEgOiAxNj4gdjE2KDE2KTsKIAotICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPiggMSwgICAgICAgQXV0b1NpemUpLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPiggMSwgMTYpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KEF1dG9TaXplLCAxNiAgICAgICksIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KCAxLCAxNikpKTsKLSAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oIDIsICAgICAgIEF1dG9TaXplKSwgbS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oIDIsICA4KSkpOwotICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihBdXRvU2l6ZSwgOCAgICAgICApLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPiggMiwgIDgpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KCA0LCAgICAgICBBdXRvU2l6ZSksIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KCA0LCAgNCkpKTsKLSAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oQXV0b1NpemUsIDQgICAgICAgKSwgbS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oIDQsICA0KSkpOwotICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPiggOCwgICAgICAgQXV0b1NpemUpLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPiggOCwgIDIpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KEF1dG9TaXplLCAyICAgICAgICksIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KCA4LCAgMikpKTsKLSAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oMTYsICAgICAgIEF1dG9TaXplKSwgbS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oMTYsICAxKSkpOwotICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihBdXRvU2l6ZSwgMSAgICAgICApLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPigxNiwgIDEpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KDEsIEF1dG9TaXplKSwgbS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oMSwgMTYpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KEF1dG9TaXplLCAxNiksIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KDEsIDE2KSkpOworICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPigyLCBBdXRvU2l6ZSksIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KDIsIDgpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KEF1dG9TaXplLCA4KSwgbS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oMiwgOCkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oNCwgQXV0b1NpemUpLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPig0LCA0KSkpOworICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihBdXRvU2l6ZSwgNCksIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KDQsIDQpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KDgsIEF1dG9TaXplKSwgbS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oOCwgMikpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oQXV0b1NpemUsIDIpLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPig4LCAyKSkpOworICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPigxNiwgQXV0b1NpemUpLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPigxNiwgMSkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oQXV0b1NpemUsIDEpLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPigxNiwgMSkpKTsKIAotICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihmaXg8IDE+LCAgIEF1dG9TaXplKSwgIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KGZpeDwgMT4sIHYxNiAgICApKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KEF1dG9TaXplLCAgZml4PDE2PiApLCAgbS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oIHYxLCAgICAgZml4PDE2PikpKTsKLSAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oZml4PCAyPiwgICBBdXRvU2l6ZSksICBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihmaXg8IDI+LCB2OCAgICAgKSkpOwotICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihBdXRvU2l6ZSwgIGZpeDwgOD4gKSwgIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KCB2MiwgICAgIGZpeDwgOD4pKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KGZpeDwgND4sICAgQXV0b1NpemUpLCAgbS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oZml4PCA0PiwgdjQgICAgICkpKTsKLSAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oQXV0b1NpemUsICBmaXg8IDQ+ICksICBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPiggdjQsICAgICBmaXg8IDQ+KSkpOwotICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihmaXg8IDg+LCAgIEF1dG9TaXplKSwgIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KGZpeDwgOD4sIHYyICAgICApKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KEF1dG9TaXplLCAgZml4PCAyPiApLCAgbS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oIHY4LCAgICAgZml4PCAyPikpKTsKLSAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oZml4PDE2PiwgICBBdXRvU2l6ZSksICBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihmaXg8MTY+LCB2MSAgICAgKSkpOwotICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihBdXRvU2l6ZSwgIGZpeDwgMT4gKSwgIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KHYxNiwgICAgIGZpeDwgMT4pKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KGZpeDwxPiwgQXV0b1NpemUpLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihmaXg8MT4sIHYxNikpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oQXV0b1NpemUsIGZpeDwxNj4pLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPih2MSwgZml4PDE2PikpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oZml4PDI+LCBBdXRvU2l6ZSksIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KGZpeDwyPiwgdjgpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KEF1dG9TaXplLCBmaXg8OD4pLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPih2MiwgZml4PDg+KSkpOworICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihmaXg8ND4sIEF1dG9TaXplKSwgbS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oZml4PDQ+LCB2NCkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oQXV0b1NpemUsIGZpeDw0PiksIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KHY0LCBmaXg8ND4pKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KGZpeDw4PiwgQXV0b1NpemUpLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihmaXg8OD4sIHYyKSkpOworICBWRVJJRlkoaXNfc2FtZV9lcShtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihBdXRvU2l6ZSwgZml4PDI+KSwgbS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4odjgsIGZpeDwyPikpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oZml4PDE2PiwgQXV0b1NpemUpLCBtLnRlbXBsYXRlIHJlc2hhcGVkPE9yZGVyPihmaXg8MTY+LCB2MSkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS50ZW1wbGF0ZSByZXNoYXBlZDxPcmRlcj4oQXV0b1NpemUsIGZpeDwxPiksIG0udGVtcGxhdGUgcmVzaGFwZWQ8T3JkZXI+KHYxNiwgZml4PDE+KSkpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0VHlwZT4KLXZvaWQgY2hlY2tfZGlyZWN0X2FjY2Vzc19yZXNoYXBlNHg0KE1hdFR5cGUgLCBpbnRlcm5hbDo6Rml4ZWRJbnQ8Um93TWFqb3JCaXQ+KSB7fQordm9pZCBjaGVja19kaXJlY3RfYWNjZXNzX3Jlc2hhcGU0eDQoTWF0VHlwZSwgaW50ZXJuYWw6OkZpeGVkSW50PFJvd01ham9yQml0Pikge30KIAogdGVtcGxhdGUgPHR5cGVuYW1lIE1hdFR5cGU+CiB2b2lkIGNoZWNrX2RpcmVjdF9hY2Nlc3NfcmVzaGFwZTR4NChNYXRUeXBlIG0sIGludGVybmFsOjpGaXhlZEludDwwPikgewotICBWRVJJRllfSVNfRVFVQUwobS5yZXNoYXBlZCggMSwgMTYpLmRhdGEoKSwgbS5kYXRhKCkpOwotICBWRVJJRllfSVNfRVFVQUwobS5yZXNoYXBlZCggMSwgMTYpLmlubmVyU3RyaWRlKCksIDEpOworICBWRVJJRllfSVNfRVFVQUwobS5yZXNoYXBlZCgxLCAxNikuZGF0YSgpLCBtLmRhdGEoKSk7CisgIFZFUklGWV9JU19FUVVBTChtLnJlc2hhcGVkKDEsIDE2KS5pbm5lclN0cmlkZSgpLCAxKTsKIAotICBWRVJJRllfSVNfRVFVQUwobS5yZXNoYXBlZCggMiwgOCkuZGF0YSgpLCBtLmRhdGEoKSk7Ci0gIFZFUklGWV9JU19FUVVBTChtLnJlc2hhcGVkKCAyLCA4KS5pbm5lclN0cmlkZSgpLCAxKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG0ucmVzaGFwZWQoIDIsIDgpLm91dGVyU3RyaWRlKCksIDIpOworICBWRVJJRllfSVNfRVFVQUwobS5yZXNoYXBlZCgyLCA4KS5kYXRhKCksIG0uZGF0YSgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0ucmVzaGFwZWQoMiwgOCkuaW5uZXJTdHJpZGUoKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChtLnJlc2hhcGVkKDIsIDgpLm91dGVyU3RyaWRlKCksIDIpOwogfQogCiAvLyBqdXN0IHRlc3QgYSA0eDQgbWF0cml4LCBlbnVtZXJhdGUgYWxsIGNvbWJpbmF0aW9uIG1hbnVhbGx5CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0VHlwZT4KLXZvaWQgcmVzaGFwZTR4NChNYXRUeXBlIG0pCi17Cit2b2lkIHJlc2hhcGU0eDQoTWF0VHlwZSBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0VHlwZTo6U2NhbGFyIFNjYWxhcjsKIAotICBpbnRlcm5hbDo6VmFyaWFibGVBbmRGaXhlZEludDxNYXRUeXBlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYz8tMTogMT4gIHYxKCAxKTsKLSAgaW50ZXJuYWw6OlZhcmlhYmxlQW5kRml4ZWRJbnQ8TWF0VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWM/LTE6IDI+ICB2MiggMik7Ci0gIGludGVybmFsOjpWYXJpYWJsZUFuZEZpeGVkSW50PE1hdFR5cGU6OlNpemVBdENvbXBpbGVUaW1lPT1EeW5hbWljPy0xOiA0PiAgdjQoIDQpOwotICBpbnRlcm5hbDo6VmFyaWFibGVBbmRGaXhlZEludDxNYXRUeXBlOjpTaXplQXRDb21waWxlVGltZT09RHluYW1pYz8tMTogOD4gIHY4KCA4KTsKLSAgaW50ZXJuYWw6OlZhcmlhYmxlQW5kRml4ZWRJbnQ8TWF0VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWM/LTE6MTY+IHYxNigxNik7CisgIGludGVybmFsOjpWYXJpYWJsZUFuZEZpeGVkSW50PE1hdFR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMgPyAtMSA6IDE+IHYxKDEpOworICBpbnRlcm5hbDo6VmFyaWFibGVBbmRGaXhlZEludDxNYXRUeXBlOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljID8gLTEgOiAyPiB2MigyKTsKKyAgaW50ZXJuYWw6OlZhcmlhYmxlQW5kRml4ZWRJbnQ8TWF0VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyA/IC0xIDogND4gdjQoNCk7CisgIGludGVybmFsOjpWYXJpYWJsZUFuZEZpeGVkSW50PE1hdFR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMgPyAtMSA6IDg+IHY4KDgpOworICBpbnRlcm5hbDo6VmFyaWFibGVBbmRGaXhlZEludDxNYXRUeXBlOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljID8gLTEgOiAxNj4gdjE2KDE2KTsKIAotICBpZigoTWF0VHlwZTo6RmxhZ3MmUm93TWFqb3JCaXQpPT0wKQotICB7CisgIGlmICgoTWF0VHlwZTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPT0gMCkgewogICAgIHR5cGVkZWYgTWFwPE1hdHJpeFhpPiBNYXBNYXQ7CiAgICAgLy8gZHluYW1pYwotICAgIFZFUklGWV9JU19FUVVBTCgobS5yZXNoYXBlZCggMSwgMTYpKSwgTWFwTWF0KG0uZGF0YSgpLCAgMSwgMTYpKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoKG0ucmVzaGFwZWQoIDIsICA4KSksIE1hcE1hdChtLmRhdGEoKSwgIDIsICA4KSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKChtLnJlc2hhcGVkKCA0LCAgNCkpLCBNYXBNYXQobS5kYXRhKCksICA0LCAgNCkpOwotICAgIFZFUklGWV9JU19FUVVBTCgobS5yZXNoYXBlZCggOCwgIDIpKSwgTWFwTWF0KG0uZGF0YSgpLCAgOCwgIDIpKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoKG0ucmVzaGFwZWQoMTYsICAxKSksIE1hcE1hdChtLmRhdGEoKSwgMTYsICAxKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKChtLnJlc2hhcGVkKDEsIDE2KSksIE1hcE1hdChtLmRhdGEoKSwgMSwgMTYpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoKG0ucmVzaGFwZWQoMiwgOCkpLCBNYXBNYXQobS5kYXRhKCksIDIsIDgpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoKG0ucmVzaGFwZWQoNCwgNCkpLCBNYXBNYXQobS5kYXRhKCksIDQsIDQpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoKG0ucmVzaGFwZWQoOCwgMikpLCBNYXBNYXQobS5kYXRhKCksIDgsIDIpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoKG0ucmVzaGFwZWQoMTYsIDEpKSwgTWFwTWF0KG0uZGF0YSgpLCAxNiwgMSkpOwogCiAgICAgLy8gc3RhdGljCi0gICAgVkVSSUZZX0lTX0VRVUFMKG0ucmVzaGFwZWQoZml4PCAxPiwgZml4PDE2PiksIE1hcE1hdChtLmRhdGEoKSwgIDEsIDE2KSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKG0ucmVzaGFwZWQoZml4PCAyPiwgZml4PCA4PiksIE1hcE1hdChtLmRhdGEoKSwgIDIsICA4KSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKG0ucmVzaGFwZWQoZml4PCA0PiwgZml4PCA0PiksIE1hcE1hdChtLmRhdGEoKSwgIDQsICA0KSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKG0ucmVzaGFwZWQoZml4PCA4PiwgZml4PCAyPiksIE1hcE1hdChtLmRhdGEoKSwgIDgsICAyKSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKG0ucmVzaGFwZWQoZml4PDE2PiwgZml4PCAxPiksIE1hcE1hdChtLmRhdGEoKSwgMTYsICAxKSk7Ci0KKyAgICBWRVJJRllfSVNfRVFVQUwobS5yZXNoYXBlZChmaXg8MT4sIGZpeDwxNj4pLCBNYXBNYXQobS5kYXRhKCksIDEsIDE2KSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG0ucmVzaGFwZWQoZml4PDI+LCBmaXg8OD4pLCBNYXBNYXQobS5kYXRhKCksIDIsIDgpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobS5yZXNoYXBlZChmaXg8ND4sIGZpeDw0PiksIE1hcE1hdChtLmRhdGEoKSwgNCwgNCkpOworICAgIFZFUklGWV9JU19FUVVBTChtLnJlc2hhcGVkKGZpeDw4PiwgZml4PDI+KSwgTWFwTWF0KG0uZGF0YSgpLCA4LCAyKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG0ucmVzaGFwZWQoZml4PDE2PiwgZml4PDE+KSwgTWFwTWF0KG0uZGF0YSgpLCAxNiwgMSkpOwogCiAgICAgLy8gcmVzaGFwZSBjaGFpbgotICAgIFZFUklGWV9JU19FUVVBTCgKLSAgICAgIChtCi0gICAgICAucmVzaGFwZWQoIDEsIDE2KQotICAgICAgLnJlc2hhcGVkKGZpeDwgMj4sZml4PCA4PikKLSAgICAgIC5yZXNoYXBlZCgxNiwgIDEpCi0gICAgICAucmVzaGFwZWQoZml4PCA4PixmaXg8IDI+KQotICAgICAgLnJlc2hhcGVkKCAyLCAgOCkKLSAgICAgIC5yZXNoYXBlZChmaXg8IDE+LGZpeDwxNj4pCi0gICAgICAucmVzaGFwZWQoIDQsICA0KQotICAgICAgLnJlc2hhcGVkKGZpeDwxNj4sZml4PCAxPikKLSAgICAgIC5yZXNoYXBlZCggOCwgIDIpCi0gICAgICAucmVzaGFwZWQoZml4PCA0PixmaXg8IDQ+KQotICAgICAgKSwKLSAgICAgIE1hcE1hdChtLmRhdGEoKSwgNCwgIDQpCi0gICAgKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoKG0ucmVzaGFwZWQoMSwgMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc2hhcGVkKGZpeDwyPiwgZml4PDg+KQorICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNoYXBlZCgxNiwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAucmVzaGFwZWQoZml4PDg+LCBmaXg8Mj4pCisgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc2hhcGVkKDIsIDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc2hhcGVkKGZpeDwxPiwgZml4PDE2PikKKyAgICAgICAgICAgICAgICAgICAgICAgICAucmVzaGFwZWQoNCwgNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAucmVzaGFwZWQoZml4PDE2PiwgZml4PDE+KQorICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNoYXBlZCg4LCAyKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNoYXBlZChmaXg8ND4sIGZpeDw0PikpLAorICAgICAgICAgICAgICAgICAgICBNYXBNYXQobS5kYXRhKCksIDQsIDQpKTsKICAgfQogCi0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoIDEsICAgICAgIEF1dG9TaXplKSwgbS5yZXNoYXBlZCggMSwgMTYpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoQXV0b1NpemUsIDE2KSwgICAgICAgbS5yZXNoYXBlZCggMSwgMTYpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoIDIsICAgICAgIEF1dG9TaXplKSwgbS5yZXNoYXBlZCggMiwgIDgpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoQXV0b1NpemUsIDgpLCAgICAgICAgbS5yZXNoYXBlZCggMiwgIDgpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoIDQsICAgICAgIEF1dG9TaXplKSwgbS5yZXNoYXBlZCggNCwgIDQpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoQXV0b1NpemUsIDQpLCAgICAgICAgbS5yZXNoYXBlZCggNCwgIDQpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoIDgsICAgICAgIEF1dG9TaXplKSwgbS5yZXNoYXBlZCggOCwgIDIpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoQXV0b1NpemUsIDIpLCAgICAgICAgbS5yZXNoYXBlZCggOCwgIDIpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoMTYsICAgICAgIEF1dG9TaXplKSwgbS5yZXNoYXBlZCgxNiwgIDEpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoQXV0b1NpemUsICAxKSwgICAgICAgbS5yZXNoYXBlZCgxNiwgIDEpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoMSwgQXV0b1NpemUpLCBtLnJlc2hhcGVkKDEsIDE2KSkpOworICBWRVJJRlkoaXNfc2FtZV9lcShtLnJlc2hhcGVkKEF1dG9TaXplLCAxNiksIG0ucmVzaGFwZWQoMSwgMTYpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoMiwgQXV0b1NpemUpLCBtLnJlc2hhcGVkKDIsIDgpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoQXV0b1NpemUsIDgpLCBtLnJlc2hhcGVkKDIsIDgpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoNCwgQXV0b1NpemUpLCBtLnJlc2hhcGVkKDQsIDQpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoQXV0b1NpemUsIDQpLCBtLnJlc2hhcGVkKDQsIDQpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoOCwgQXV0b1NpemUpLCBtLnJlc2hhcGVkKDgsIDIpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoQXV0b1NpemUsIDIpLCBtLnJlc2hhcGVkKDgsIDIpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoMTYsIEF1dG9TaXplKSwgbS5yZXNoYXBlZCgxNiwgMSkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS5yZXNoYXBlZChBdXRvU2l6ZSwgMSksIG0ucmVzaGFwZWQoMTYsIDEpKSk7CiAKLSAgVkVSSUZZKGlzX3NhbWVfZXEobS5yZXNoYXBlZChmaXg8IDE+LCAgIEF1dG9TaXplKSwgIG0ucmVzaGFwZWQoZml4PCAxPiwgdjE2KSkpOwotICBWRVJJRlkoaXNfc2FtZV9lcShtLnJlc2hhcGVkKEF1dG9TaXplLCAgZml4PDE2PiksICAgbS5yZXNoYXBlZCggdjEsICAgICBmaXg8MTY+KSkpOwotICBWRVJJRlkoaXNfc2FtZV9lcShtLnJlc2hhcGVkKGZpeDwgMj4sICAgQXV0b1NpemUpLCAgbS5yZXNoYXBlZChmaXg8IDI+LCB2OCkpKTsKLSAgVkVSSUZZKGlzX3NhbWVfZXEobS5yZXNoYXBlZChBdXRvU2l6ZSwgIGZpeDwgOD4pLCAgIG0ucmVzaGFwZWQoIHYyLCAgICAgZml4PCA4PikpKTsKLSAgVkVSSUZZKGlzX3NhbWVfZXEobS5yZXNoYXBlZChmaXg8IDQ+LCAgIEF1dG9TaXplKSwgIG0ucmVzaGFwZWQoZml4PCA0PiwgdjQpKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoQXV0b1NpemUsICBmaXg8IDQ+KSwgICBtLnJlc2hhcGVkKCB2NCwgICAgIGZpeDwgND4pKSk7Ci0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoZml4PCA4PiwgICBBdXRvU2l6ZSksICBtLnJlc2hhcGVkKGZpeDwgOD4sIHYyKSkpOwotICBWRVJJRlkoaXNfc2FtZV9lcShtLnJlc2hhcGVkKEF1dG9TaXplLCAgZml4PCAyPiksICAgbS5yZXNoYXBlZCggdjgsICAgICBmaXg8IDI+KSkpOwotICBWRVJJRlkoaXNfc2FtZV9lcShtLnJlc2hhcGVkKGZpeDwxNj4sICAgQXV0b1NpemUpLCAgbS5yZXNoYXBlZChmaXg8MTY+LCB2MSkpKTsKLSAgVkVSSUZZKGlzX3NhbWVfZXEobS5yZXNoYXBlZChBdXRvU2l6ZSwgIGZpeDwgMT4pLCAgIG0ucmVzaGFwZWQodjE2LCAgICAgZml4PCAxPikpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS5yZXNoYXBlZChmaXg8MT4sIEF1dG9TaXplKSwgbS5yZXNoYXBlZChmaXg8MT4sIHYxNikpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS5yZXNoYXBlZChBdXRvU2l6ZSwgZml4PDE2PiksIG0ucmVzaGFwZWQodjEsIGZpeDwxNj4pKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoZml4PDI+LCBBdXRvU2l6ZSksIG0ucmVzaGFwZWQoZml4PDI+LCB2OCkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS5yZXNoYXBlZChBdXRvU2l6ZSwgZml4PDg+KSwgbS5yZXNoYXBlZCh2MiwgZml4PDg+KSkpOworICBWRVJJRlkoaXNfc2FtZV9lcShtLnJlc2hhcGVkKGZpeDw0PiwgQXV0b1NpemUpLCBtLnJlc2hhcGVkKGZpeDw0PiwgdjQpKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoQXV0b1NpemUsIGZpeDw0PiksIG0ucmVzaGFwZWQodjQsIGZpeDw0PikpKTsKKyAgVkVSSUZZKGlzX3NhbWVfZXEobS5yZXNoYXBlZChmaXg8OD4sIEF1dG9TaXplKSwgbS5yZXNoYXBlZChmaXg8OD4sIHYyKSkpOworICBWRVJJRlkoaXNfc2FtZV9lcShtLnJlc2hhcGVkKEF1dG9TaXplLCBmaXg8Mj4pLCBtLnJlc2hhcGVkKHY4LCBmaXg8Mj4pKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoZml4PDE2PiwgQXV0b1NpemUpLCBtLnJlc2hhcGVkKGZpeDwxNj4sIHYxKSkpOworICBWRVJJRlkoaXNfc2FtZV9lcShtLnJlc2hhcGVkKEF1dG9TaXplLCBmaXg8MT4pLCBtLnJlc2hhcGVkKHYxNiwgZml4PDE+KSkpOwogCi0gIGNoZWNrX2F1dG9fcmVzaGFwZTR4NDxDb2xNYWpvcj4gKG0pOwotICBjaGVja19hdXRvX3Jlc2hhcGU0eDQ8Um93TWFqb3I+IChtKTsKKyAgY2hlY2tfYXV0b19yZXNoYXBlNHg0PENvbE1ham9yPihtKTsKKyAgY2hlY2tfYXV0b19yZXNoYXBlNHg0PFJvd01ham9yPihtKTsKICAgY2hlY2tfYXV0b19yZXNoYXBlNHg0PEF1dG9PcmRlcj4obSk7Ci0gIGNoZWNrX2F1dG9fcmVzaGFwZTR4NDxDb2xNYWpvcj4gKG0udHJhbnNwb3NlKCkpOwotICBjaGVja19hdXRvX3Jlc2hhcGU0eDQ8Q29sTWFqb3I+IChtLnRyYW5zcG9zZSgpKTsKKyAgY2hlY2tfYXV0b19yZXNoYXBlNHg0PENvbE1ham9yPihtLnRyYW5zcG9zZSgpKTsKKyAgY2hlY2tfYXV0b19yZXNoYXBlNHg0PENvbE1ham9yPihtLnRyYW5zcG9zZSgpKTsKICAgY2hlY2tfYXV0b19yZXNoYXBlNHg0PEF1dG9PcmRlcj4obS50cmFuc3Bvc2UoKSk7CiAKLSAgY2hlY2tfZGlyZWN0X2FjY2Vzc19yZXNoYXBlNHg0KG0sZml4PE1hdFR5cGU6OkZsYWdzJlJvd01ham9yQml0Pik7CisgIGNoZWNrX2RpcmVjdF9hY2Nlc3NfcmVzaGFwZTR4NChtLCBmaXg8TWF0VHlwZTo6RmxhZ3MgJiBSb3dNYWpvckJpdD4pOwogCi0gIGlmKChNYXRUeXBlOjpGbGFncyZSb3dNYWpvckJpdCk9PTApCi0gIHsKLSAgICBWRVJJRllfSVNfRVFVQUwobS50ZW1wbGF0ZSByZXNoYXBlZDxDb2xNYWpvcj4oMiw4KSxtLnJlc2hhcGVkKDIsOCkpOwotICAgIFZFUklGWV9JU19FUVVBTChtLnRlbXBsYXRlIHJlc2hhcGVkPENvbE1ham9yPigyLDgpLG0udGVtcGxhdGUgcmVzaGFwZWQ8QXV0b09yZGVyPigyLDgpKTsKLSAgICBWRVJJRllfSVNfRVFVQUwobS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSByZXNoYXBlZDxSb3dNYWpvcj4oMiw4KSxtLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHJlc2hhcGVkPEF1dG9PcmRlcj4oMiw4KSk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKG0udGVtcGxhdGUgcmVzaGFwZWQ8Q29sTWFqb3I+KDIsOCksbS5yZXNoYXBlZCgyLDgpKTsKLSAgICBWRVJJRllfSVNfRVFVQUwobS50ZW1wbGF0ZSByZXNoYXBlZDxSb3dNYWpvcj4oMiw4KSxtLnRlbXBsYXRlIHJlc2hhcGVkPEF1dG9PcmRlcj4oMiw4KSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKG0udHJhbnNwb3NlKCkudGVtcGxhdGUgcmVzaGFwZWQ8Q29sTWFqb3I+KDIsOCksbS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSByZXNoYXBlZDxBdXRvT3JkZXI+KDIsOCkpOwotICAgIFZFUklGWV9JU19FUVVBTChtLnRyYW5zcG9zZSgpLnJlc2hhcGVkKDIsOCksbS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSByZXNoYXBlZDxBdXRvT3JkZXI+KDIsOCkpOworICBpZiAoKE1hdFR5cGU6OkZsYWdzICYgUm93TWFqb3JCaXQpID09IDApIHsKKyAgICBWRVJJRllfSVNfRVFVQUwobS50ZW1wbGF0ZSByZXNoYXBlZDxDb2xNYWpvcj4oMiwgOCksIG0ucmVzaGFwZWQoMiwgOCkpOworICAgIFZFUklGWV9JU19FUVVBTChtLnRlbXBsYXRlIHJlc2hhcGVkPENvbE1ham9yPigyLCA4KSwgbS50ZW1wbGF0ZSByZXNoYXBlZDxBdXRvT3JkZXI+KDIsIDgpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobS50cmFuc3Bvc2UoKS50ZW1wbGF0ZSByZXNoYXBlZDxSb3dNYWpvcj4oMiwgOCksIG0udHJhbnNwb3NlKCkudGVtcGxhdGUgcmVzaGFwZWQ8QXV0b09yZGVyPigyLCA4KSk7CisgIH0gZWxzZSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKG0udGVtcGxhdGUgcmVzaGFwZWQ8Q29sTWFqb3I+KDIsIDgpLCBtLnJlc2hhcGVkKDIsIDgpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobS50ZW1wbGF0ZSByZXNoYXBlZDxSb3dNYWpvcj4oMiwgOCksIG0udGVtcGxhdGUgcmVzaGFwZWQ8QXV0b09yZGVyPigyLCA4KSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG0udHJhbnNwb3NlKCkudGVtcGxhdGUgcmVzaGFwZWQ8Q29sTWFqb3I+KDIsIDgpLCBtLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHJlc2hhcGVkPEF1dG9PcmRlcj4oMiwgOCkpOworICAgIFZFUklGWV9JU19FUVVBTChtLnRyYW5zcG9zZSgpLnJlc2hhcGVkKDIsIDgpLCBtLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHJlc2hhcGVkPEF1dG9PcmRlcj4oMiwgOCkpOwogICB9CiAKLSAgTWF0cml4WGkgbTI4cjEgPSBtLnRlbXBsYXRlIHJlc2hhcGVkPFJvd01ham9yPigyLDgpOwotICBNYXRyaXhYaSBtMjhyMiA9IG0udHJhbnNwb3NlKCkudGVtcGxhdGUgcmVzaGFwZWQ8Q29sTWFqb3I+KDgsMikudHJhbnNwb3NlKCk7Ci0gIFZFUklGWV9JU19FUVVBTCggbTI4cjEsIG0yOHIyKTsKKyAgTWF0cml4WGkgbTI4cjEgPSBtLnRlbXBsYXRlIHJlc2hhcGVkPFJvd01ham9yPigyLCA4KTsKKyAgTWF0cml4WGkgbTI4cjIgPSBtLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHJlc2hhcGVkPENvbE1ham9yPig4LCAyKS50cmFuc3Bvc2UoKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0yOHIxLCBtMjhyMik7CiAKLSAgVkVSSUZZKGlzX3NhbWVfZXEobS5yZXNoYXBlZCh2MTYsZml4PDE+KSwgbS5yZXNoYXBlZCgpKSk7Ci0gIFZFUklGWV9JU19FUVVBTChtLnJlc2hhcGVkKDE2LDEpLmV2YWwoKSwgbS5yZXNoYXBlZCgpLmV2YWwoKSk7Ci0gIFZFUklGWV9JU19FUVVBTChtLnJlc2hhcGVkKDEsMTYpLmV2YWwoKSwgbS5yZXNoYXBlZCgpLnRyYW5zcG9zZSgpLmV2YWwoKSk7Ci0gIFZFUklGWV9JU19FUVVBTChtLnJlc2hhcGVkKCkucmVzaGFwZWQoMiw4KSwgbS5yZXNoYXBlZCgyLDgpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG0ucmVzaGFwZWQoKS5yZXNoYXBlZCg0LDQpLCBtLnJlc2hhcGVkKDQsNCkpOwotICBWRVJJRllfSVNfRVFVQUwobS5yZXNoYXBlZCgpLnJlc2hhcGVkKDgsMiksIG0ucmVzaGFwZWQoOCwyKSk7CisgIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQodjE2LCBmaXg8MT4pLCBtLnJlc2hhcGVkKCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0ucmVzaGFwZWQoMTYsIDEpLmV2YWwoKSwgbS5yZXNoYXBlZCgpLmV2YWwoKSk7CisgIFZFUklGWV9JU19FUVVBTChtLnJlc2hhcGVkKDEsIDE2KS5ldmFsKCksIG0ucmVzaGFwZWQoKS50cmFuc3Bvc2UoKS5ldmFsKCkpOworICBWRVJJRllfSVNfRVFVQUwobS5yZXNoYXBlZCgpLnJlc2hhcGVkKDIsIDgpLCBtLnJlc2hhcGVkKDIsIDgpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0ucmVzaGFwZWQoKS5yZXNoYXBlZCg0LCA0KSwgbS5yZXNoYXBlZCg0LCA0KSk7CisgIFZFUklGWV9JU19FUVVBTChtLnJlc2hhcGVkKCkucmVzaGFwZWQoOCwgMiksIG0ucmVzaGFwZWQoOCwgMikpOwogCiAgIFZFUklGWV9JU19FUVVBTChtLnJlc2hhcGVkKCksIG0udGVtcGxhdGUgcmVzaGFwZWQ8Q29sTWFqb3I+KCkpOwogICBWRVJJRllfSVNfRVFVQUwobS50cmFuc3Bvc2UoKS5yZXNoYXBlZCgpLCBtLnRlbXBsYXRlIHJlc2hhcGVkPFJvd01ham9yPigpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG0udGVtcGxhdGUgcmVzaGFwZWQ8Um93TWFqb3I+KEF1dG9TaXplLGZpeDwxPiksIG0udGVtcGxhdGUgcmVzaGFwZWQ8Um93TWFqb3I+KCkpOwotICBWRVJJRllfSVNfRVFVQUwobS50ZW1wbGF0ZSByZXNoYXBlZDxBdXRvT3JkZXI+KEF1dG9TaXplLGZpeDwxPiksIG0udGVtcGxhdGUgcmVzaGFwZWQ8QXV0b09yZGVyPigpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0udGVtcGxhdGUgcmVzaGFwZWQ8Um93TWFqb3I+KEF1dG9TaXplLCBmaXg8MT4pLCBtLnRlbXBsYXRlIHJlc2hhcGVkPFJvd01ham9yPigpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0udGVtcGxhdGUgcmVzaGFwZWQ8QXV0b09yZGVyPihBdXRvU2l6ZSwgZml4PDE+KSwgbS50ZW1wbGF0ZSByZXNoYXBlZDxBdXRvT3JkZXI+KCkpOwogCi0gIFZFUklGWShpc19zYW1lX2VxKG0ucmVzaGFwZWQoQXV0b1NpemUsZml4PDE+KSwgbS5yZXNoYXBlZCgpKSk7Ci0gIFZFUklGWV9JU19FUVVBTChtLnRlbXBsYXRlIHJlc2hhcGVkPFJvd01ham9yPihmaXg8MT4sQXV0b1NpemUpLCBtLnRyYW5zcG9zZSgpLnJlc2hhcGVkKCkudHJhbnNwb3NlKCkpOworICBWRVJJRlkoaXNfc2FtZV9lcShtLnJlc2hhcGVkKEF1dG9TaXplLCBmaXg8MT4pLCBtLnJlc2hhcGVkKCkpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0udGVtcGxhdGUgcmVzaGFwZWQ8Um93TWFqb3I+KGZpeDwxPiwgQXV0b1NpemUpLCBtLnRyYW5zcG9zZSgpLnJlc2hhcGVkKCkudHJhbnNwb3NlKCkpOwogCiAgIC8vIGNoZWNrIGFzc2lnbm1lbnQKICAgewotICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBtMXgobS5zaXplKCkpOyBtMXguc2V0UmFuZG9tKCk7CisgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gbTF4KG0uc2l6ZSgpKTsKKyAgICBtMXguc2V0UmFuZG9tKCk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChtLnJlc2hhcGVkKCkgPSBtMXgsIG0xeCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtLCBtMXgucmVzaGFwZWQoNCw0KSk7Ci0gICAgCi0gICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IG0yOCgyLDgpOyBtMjguc2V0UmFuZG9tKCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtLnJlc2hhcGVkKDIsOCkgPSBtMjgsIG0yOCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtLCBtMjgucmVzaGFwZWQoNCw0KSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtLnRlbXBsYXRlIHJlc2hhcGVkPFJvd01ham9yPigyLDgpID0gbTI4LCBtMjgpOworICAgIFZFUklGWV9JU19BUFBST1gobSwgbTF4LnJlc2hhcGVkKDQsIDQpKTsKIAotICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBtMjQoMiw0KTsgbTI0LnNldFJhbmRvbSgpOwotICAgIFZFUklGWV9JU19BUFBST1gobShzZXEoMCxsYXN0LDIpLGFsbCkucmVzaGFwZWQoMiw0KSA9IG0yNCwgbTI0KTsKKyAgICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBtMjgoMiwgOCk7CisgICAgbTI4LnNldFJhbmRvbSgpOworICAgIFZFUklGWV9JU19BUFBST1gobS5yZXNoYXBlZCgyLCA4KSA9IG0yOCwgbTI4KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0sIG0yOC5yZXNoYXBlZCg0LCA0KSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtLnRlbXBsYXRlIHJlc2hhcGVkPFJvd01ham9yPigyLCA4KSA9IG0yOCwgbTI4KTsKKworICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IG0yNCgyLCA0KTsKKyAgICBtMjQuc2V0UmFuZG9tKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtKHNlcSgwLCBsYXN0LCAyKSwgYWxsKS5yZXNoYXBlZCgyLCA0KSA9IG0yNCwgbTI0KTsKIAogICAgIC8vIGNoZWNrIGNvbnN0bmVzczoKLSAgICBtLnJlc2hhcGVkKDIsOCkubmVzdGVkRXhwcmVzc2lvbigpID0gbTsKKyAgICBtLnJlc2hhcGVkKDIsIDgpLm5lc3RlZEV4cHJlc3Npb24oKSA9IG07CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgQmxvY2tUeXBlPgordGVtcGxhdGUgPHR5cGVuYW1lIEJsb2NrVHlwZT4KIHZvaWQgcmVzaGFwZV9ibG9jayhjb25zdCBCbG9ja1R5cGUmIE0pIHsKICAgYXV0byBkZW5zZSA9IE0uZXZhbCgpOwogICBJbmRleCByb3dzID0gTS5zaXplKCkgLyAyOwogICBJbmRleCBjb2xzID0gTS5zaXplKCkgLyByb3dzOwogICBWRVJJRllfSVNfRVFVQUwoZGVuc2UucmVzaGFwZWQocm93cywgY29scyksIE0ucmVzaGFwZWQocm93cywgY29scykpOwotICAKLSAgZm9yIChJbmRleCBpPTA7IGk8cm93czsgKytpKSB7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKGRlbnNlLnJlc2hhcGVkKHJvd3MsIGNvbHMpLnJvdyhpKSwKLSAgICAgICAgICAgICAgICAgICAgTS5yZXNoYXBlZChyb3dzLCBjb2xzKS5yb3coaSkpOworCisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCByb3dzOyArK2kpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwoZGVuc2UucmVzaGFwZWQocm93cywgY29scykucm93KGkpLCBNLnJlc2hhcGVkKHJvd3MsIGNvbHMpLnJvdyhpKSk7CiAgIH0KLSAgCi0gIGZvciAoSW5kZXggaiA9IDA7IGo8Y29sczsgKytqKSB7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKGRlbnNlLnJlc2hhcGVkKHJvd3MsIGNvbHMpLmNvbChqKSwKLSAgICAgICAgICAgICAgICAgICAgTS5yZXNoYXBlZChyb3dzLCBjb2xzKS5jb2woaikpOworCisgIGZvciAoSW5kZXggaiA9IDA7IGogPCBjb2xzOyArK2opIHsKKyAgICBWRVJJRllfSVNfRVFVQUwoZGVuc2UucmVzaGFwZWQocm93cywgY29scykuY29sKGopLCBNLnJlc2hhcGVkKHJvd3MsIGNvbHMpLmNvbChqKSk7CiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHJlc2hhcGUpCi17Ci0gIHR5cGVkZWYgTWF0cml4PGludCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+IFJvd01hdHJpeFhpOwotICB0eXBlZGVmIE1hdHJpeDxpbnQsNCw0LFJvd01ham9yPiBSb3dNYXRyaXg0aTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChyZXNoYXBlKSB7CisgIHR5cGVkZWYgTWF0cml4PGludCwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+IFJvd01hdHJpeFhpOworICB0eXBlZGVmIE1hdHJpeDxpbnQsIDQsIDQsIFJvd01ham9yPiBSb3dNYXRyaXg0aTsKICAgTWF0cml4WGkgbXggPSBNYXRyaXhYaTo6UmFuZG9tKDQsIDQpOwogICBNYXRyaXg0aSBtNCA9IE1hdHJpeDRpOjpSYW5kb20oNCwgNCk7CiAgIFJvd01hdHJpeFhpIHJteCA9IFJvd01hdHJpeFhpOjpSYW5kb20oNCwgNCk7CmRpZmYgLS1naXQgYS90ZXN0L3Jlc2l6ZS5jcHAgYi90ZXN0L3Jlc2l6ZS5jcHAKaW5kZXggNjQ2YTc1Yi4uNjlkYjliNCAxMDA2NDQKLS0tIGEvdGVzdC9yZXNpemUuY3BwCisrKyBiL3Rlc3QvcmVzaXplLmNwcApAQCAtOSw5ICs5LDggQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8RGVuc2VJbmRleCByb3dzLCBEZW5zZUluZGV4IGNvbHM+Ci12b2lkIHJlc2l6ZUxpa2VUZXN0KCkKLXsKK3RlbXBsYXRlIDxEZW5zZUluZGV4IHJvd3MsIERlbnNlSW5kZXggY29scz4KK3ZvaWQgcmVzaXplTGlrZVRlc3QoKSB7CiAgIE1hdHJpeFhmIEEocm93cywgY29scyk7CiAgIE1hdHJpeFhmIEI7CiAgIE1hdHJpeDxkb3VibGUsIHJvd3MsIGNvbHM+IEM7CkBAIC0yOSwxMyArMjgsMTIgQEAKICAgVkVSSUZZKHgucm93cygpID09IGNvbHMgJiYgeC5jb2xzKCkgPT0gMSk7CiB9CiAKLXZvaWQgcmVzaXplTGlrZVRlc3QxMigpIHsgcmVzaXplTGlrZVRlc3Q8MSwyPigpOyB9Ci12b2lkIHJlc2l6ZUxpa2VUZXN0MTAyMCgpIHsgcmVzaXplTGlrZVRlc3Q8MTAsMjA+KCk7IH0KLXZvaWQgcmVzaXplTGlrZVRlc3QzMSgpIHsgcmVzaXplTGlrZVRlc3Q8MywxPigpOyB9Cit2b2lkIHJlc2l6ZUxpa2VUZXN0MTIoKSB7IHJlc2l6ZUxpa2VUZXN0PDEsIDI+KCk7IH0KK3ZvaWQgcmVzaXplTGlrZVRlc3QxMDIwKCkgeyByZXNpemVMaWtlVGVzdDwxMCwgMjA+KCk7IH0KK3ZvaWQgcmVzaXplTGlrZVRlc3QzMSgpIHsgcmVzaXplTGlrZVRlc3Q8MywgMT4oKTsgfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QocmVzaXplKQotewotICBDQUxMX1NVQlRFU1QocmVzaXplTGlrZVRlc3QxMigpICk7Ci0gIENBTExfU1VCVEVTVChyZXNpemVMaWtlVGVzdDEwMjAoKSApOwotICBDQUxMX1NVQlRFU1QocmVzaXplTGlrZVRlc3QzMSgpICk7CitFSUdFTl9ERUNMQVJFX1RFU1QocmVzaXplKSB7CisgIENBTExfU1VCVEVTVChyZXNpemVMaWtlVGVzdDEyKCkpOworICBDQUxMX1NVQlRFU1QocmVzaXplTGlrZVRlc3QxMDIwKCkpOworICBDQUxMX1NVQlRFU1QocmVzaXplTGlrZVRlc3QzMSgpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvcnZhbHVlX3R5cGVzLmNwcCBiL3Rlc3QvcnZhbHVlX3R5cGVzLmNwcAppbmRleCAwMWRmMjFiLi41ZGIyOGI4IDEwMDY0NAotLS0gYS90ZXN0L3J2YWx1ZV90eXBlcy5jcHAKKysrIGIvdGVzdC9ydmFsdWVfdHlwZXMuY3BwCkBAIC0xNiwyMSArMTYsMTggQEAKICNpbmNsdWRlIDxFaWdlbi9Db3JlPgogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXZvaWQgcnZhbHVlX2NvcHlhc3NpZ24oY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKLQordm9pZCBydmFsdWVfY29weWFzc2lnbihjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyIFNjYWxhcjsKLSAgCisKICAgLy8gY3JlYXRlIGEgdGVtcG9yYXJ5IHdoaWNoIHdlIGFyZSBhYm91dCB0byBkZXN0cm95IGJ5IG1vdmluZwogICBNYXRyaXhUeXBlIHRtcCA9IG07CiAgIHN0ZDo6dWludHB0cl90IHNyY19hZGRyZXNzID0gcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnVpbnRwdHJfdD4odG1wLmRhdGEoKSk7Ci0gIAotICBFaWdlbjo6aW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZChmYWxzZSk7IC8vIG1vdmluZyBmcm9tIGFuIHJ2YWx1ZSByZWZlcmVuY2Ugc2hhbGwgbmV2ZXIgYWxsb2NhdGUKKworICBFaWdlbjo6aW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZChmYWxzZSk7ICAvLyBtb3ZpbmcgZnJvbSBhbiBydmFsdWUgcmVmZXJlbmNlIHNoYWxsIG5ldmVyIGFsbG9jYXRlCiAgIC8vIG1vdmUgdGhlIHRlbXBvcmFyeSB0byBuCiAgIE1hdHJpeFR5cGUgbiA9IHN0ZDo6bW92ZSh0bXApOwogICBzdGQ6OnVpbnRwdHJfdCBkc3RfYWRkcmVzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjp1aW50cHRyX3Q+KG4uZGF0YSgpKTsKLSAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljfHwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCi0gIHsKKyAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMgfHwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykgewogICAgIC8vIHZlcmlmeSB0aGF0IHdlIGFjdHVhbGx5IG1vdmVkIHRoZSBndXRzCiAgICAgVkVSSUZZX0lTX0VRVUFMKHNyY19hZGRyZXNzLCBkc3RfYWRkcmVzcyk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHRtcC5zaXplKCksIDApOwpAQCAtMzgsMjAgKzM1LDE5IEBACiAgIH0KIAogICAvLyB2ZXJpZnkgdGhhdCB0aGUgY29udGVudCBkaWQgbm90IGNoYW5nZQotICBTY2FsYXIgYWJzX2RpZmYgPSAobS1uKS5hcnJheSgpLmFicygpLnN1bSgpOworICBTY2FsYXIgYWJzX2RpZmYgPSAobSAtIG4pLmFycmF5KCkuYWJzKCkuc3VtKCk7CiAgIFZFUklGWV9JU19FUVVBTChhYnNfZGlmZiwgU2NhbGFyKDApKTsKICAgRWlnZW46OmludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQodHJ1ZSk7CiB9Ci10ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uc1R5cGU+Ci12b2lkIHJ2YWx1ZV90cmFuc3Bvc2l0aW9ucyhJbmRleCByb3dzKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFRyYW5zcG9zaXRpb25zVHlwZT4KK3ZvaWQgcnZhbHVlX3RyYW5zcG9zaXRpb25zKEluZGV4IHJvd3MpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc3Bvc2l0aW9uc1R5cGU6OkluZGljZXNUeXBlIFBlcm11dGF0aW9uVmVjdG9yVHlwZTsKIAogICBQZXJtdXRhdGlvblZlY3RvclR5cGUgdmVjOwogICByYW5kb21QZXJtdXRhdGlvblZlY3Rvcih2ZWMsIHJvd3MpOwogICBUcmFuc3Bvc2l0aW9uc1R5cGUgdDAodmVjKTsKIAotICBFaWdlbjo6aW50ZXJuYWw6OnNldF9pc19tYWxsb2NfYWxsb3dlZChmYWxzZSk7IC8vIG1vdmluZyBmcm9tIGFuIHJ2YWx1ZSByZWZlcmVuY2Ugc2hhbGwgbmV2ZXIgYWxsb2NhdGUKKyAgRWlnZW46OmludGVybmFsOjpzZXRfaXNfbWFsbG9jX2FsbG93ZWQoZmFsc2UpOyAgLy8gbW92aW5nIGZyb20gYW4gcnZhbHVlIHJlZmVyZW5jZSBzaGFsbCBuZXZlciBhbGxvY2F0ZQogCiAgIHN0ZDo6dWludHB0cl90IHQwX2FkZHJlc3MgPSByZWludGVycHJldF9jYXN0PHN0ZDo6dWludHB0cl90Pih0MC5pbmRpY2VzKCkuZGF0YSgpKTsKIApAQCAtNjMsNyArNTksNiBAQAogICBWRVJJRllfSVNfRVFVQUwodDAuc2l6ZSgpLCAwKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjp1aW50cHRyX3Q+KHQwLmluZGljZXMoKS5kYXRhKCkpLCBzdGQ6OnVpbnRwdHJfdCgwKSk7CiAKLQogICAvLyBNb3ZlIGFzc2lnbm1lbnQ6CiAgIHQwID0gc3RkOjptb3ZlKHQxKTsKICAgdDBfYWRkcmVzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjp1aW50cHRyX3Q+KHQwLmluZGljZXMoKS5kYXRhKCkpOwpAQCAtNzYsNjcgKzcxLDY5IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCBydmFsdWVfbW92ZShjb25zdCBNYXRyaXhUeXBlJiBtKQotewotICAgIC8vIGx2YWx1ZSByZWZlcmVuY2UgaXMgY29waWVkCi0gICAgTWF0cml4VHlwZSBiKG0pOwotICAgIFZFUklGWV9JU19FUVVBTChiLCBtKTsKK3ZvaWQgcnZhbHVlX21vdmUoY29uc3QgTWF0cml4VHlwZSYgbSkgeworICAvLyBsdmFsdWUgcmVmZXJlbmNlIGlzIGNvcGllZAorICBNYXRyaXhUeXBlIGIobSk7CisgIFZFUklGWV9JU19FUVVBTChiLCBtKTsKIAotICAgIC8vIGx2YWx1ZSByZWZlcmVuY2UgaXMgY29waWVkCi0gICAgTWF0cml4VHlwZSBje219OwotICAgIFZFUklGWV9JU19FUVVBTChjLCBtKTsKKyAgLy8gbHZhbHVlIHJlZmVyZW5jZSBpcyBjb3BpZWQKKyAgTWF0cml4VHlwZSBje219OworICBWRVJJRllfSVNfRVFVQUwoYywgbSk7CiAKLSAgICAvLyBsdmFsdWUgcmVmZXJlbmNlIGlzIGNvcGllZAotICAgIE1hdHJpeFR5cGUgZCA9IG07Ci0gICAgVkVSSUZZX0lTX0VRVUFMKGQsIG0pOworICAvLyBsdmFsdWUgcmVmZXJlbmNlIGlzIGNvcGllZAorICBNYXRyaXhUeXBlIGQgPSBtOworICBWRVJJRllfSVNfRVFVQUwoZCwgbSk7CiAKLSAgICAvLyBydmFsdWUgcmVmZXJlbmNlIGlzIG1vdmVkIC0gY29weSBjb25zdHJ1Y3Rvci4KLSAgICBNYXRyaXhUeXBlIGVfc3JjKG0pOwotICAgIFZFUklGWV9JU19FUVVBTChlX3NyYywgbSk7Ci0gICAgTWF0cml4VHlwZSBlX2RzdChzdGQ6Om1vdmUoZV9zcmMpKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoZV9kc3QsIG0pOworICAvLyBydmFsdWUgcmVmZXJlbmNlIGlzIG1vdmVkIC0gY29weSBjb25zdHJ1Y3Rvci4KKyAgTWF0cml4VHlwZSBlX3NyYyhtKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVfc3JjLCBtKTsKKyAgTWF0cml4VHlwZSBlX2RzdChzdGQ6Om1vdmUoZV9zcmMpKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVfZHN0LCBtKTsKIAotICAgIC8vIHJ2YWx1ZSByZWZlcmVuY2UgaXMgbW92ZWQgLSBjb3B5IGNvbnN0cnVjdG9yLgotICAgIE1hdHJpeFR5cGUgZl9zcmMobSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKGZfc3JjLCBtKTsKLSAgICBNYXRyaXhUeXBlIGZfZHN0ID0gc3RkOjptb3ZlKGZfc3JjKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoZl9kc3QsIG0pOwotICAgIAotICAgIC8vIHJ2YWx1ZSByZWZlcmVuY2UgaXMgbW92ZWQgLSBjb3B5IGFzc2lnbm1lbnQuCi0gICAgTWF0cml4VHlwZSBnX3NyYyhtKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoZ19zcmMsIG0pOwotICAgIE1hdHJpeFR5cGUgZ19kc3Q7Ci0gICAgZ19kc3QgPSBzdGQ6Om1vdmUoZ19zcmMpOwotICAgIFZFUklGWV9JU19FUVVBTChnX2RzdCwgbSk7CisgIC8vIHJ2YWx1ZSByZWZlcmVuY2UgaXMgbW92ZWQgLSBjb3B5IGNvbnN0cnVjdG9yLgorICBNYXRyaXhUeXBlIGZfc3JjKG0pOworICBWRVJJRllfSVNfRVFVQUwoZl9zcmMsIG0pOworICBNYXRyaXhUeXBlIGZfZHN0ID0gc3RkOjptb3ZlKGZfc3JjKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGZfZHN0LCBtKTsKKworICAvLyBydmFsdWUgcmVmZXJlbmNlIGlzIG1vdmVkIC0gY29weSBhc3NpZ25tZW50LgorICBNYXRyaXhUeXBlIGdfc3JjKG0pOworICBWRVJJRllfSVNfRVFVQUwoZ19zcmMsIG0pOworICBNYXRyaXhUeXBlIGdfZHN0OworICBnX2RzdCA9IHN0ZDo6bW92ZShnX3NyYyk7CisgIFZFUklGWV9JU19FUVVBTChnX2RzdCwgbSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChydmFsdWVfdHlwZXMpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEocnZhbHVlX2NvcHlhc3NpZ24oIE1hdHJpeFhmOjpSYW5kb20oNTAsNTApLmV2YWwoKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMShydmFsdWVfY29weWFzc2lnbiggQXJyYXlYWGY6OlJhbmRvbSg1MCw1MCkuZXZhbCgpICkpOworRUlHRU5fREVDTEFSRV9URVNUKHJ2YWx1ZV90eXBlcykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShydmFsdWVfY29weWFzc2lnbihNYXRyaXhYZjo6UmFuZG9tKDUwLCA1MCkuZXZhbCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEocnZhbHVlX2NvcHlhc3NpZ24oQXJyYXlYWGY6OlJhbmRvbSg1MCwgNTApLmV2YWwoKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzEocnZhbHVlX2NvcHlhc3NpZ24oIE1hdHJpeDxmbG9hdCwxLER5bmFtaWM+OjpSYW5kb20oNTApLmV2YWwoKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMShydmFsdWVfY29weWFzc2lnbiggQXJyYXk8ZmxvYXQsMSxEeW5hbWljPjo6UmFuZG9tKDUwKS5ldmFsKCkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzEocnZhbHVlX2NvcHlhc3NpZ24oTWF0cml4PGZsb2F0LCAxLCBEeW5hbWljPjo6UmFuZG9tKDUwKS5ldmFsKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShydmFsdWVfY29weWFzc2lnbihBcnJheTxmbG9hdCwgMSwgRHluYW1pYz46OlJhbmRvbSg1MCkuZXZhbCgpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfMShydmFsdWVfY29weWFzc2lnbiggTWF0cml4PGZsb2F0LER5bmFtaWMsMT46OlJhbmRvbSg1MCkuZXZhbCgpICkpOwotICAgIENBTExfU1VCVEVTVF8xKHJ2YWx1ZV9jb3B5YXNzaWduKCBBcnJheTxmbG9hdCxEeW5hbWljLDE+OjpSYW5kb20oNTApLmV2YWwoKSApKTsKKyAgICBDQUxMX1NVQlRFU1RfMShydmFsdWVfY29weWFzc2lnbihNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIDE+OjpSYW5kb20oNTApLmV2YWwoKSkpOworICAgIENBTExfU1VCVEVTVF8xKHJ2YWx1ZV9jb3B5YXNzaWduKEFycmF5PGZsb2F0LCBEeW5hbWljLCAxPjo6UmFuZG9tKDUwKS5ldmFsKCkpKTsKIAotICAgIENBTExfU1VCVEVTVF8yKHJ2YWx1ZV9jb3B5YXNzaWduKCBBcnJheTxmbG9hdCwyLDE+OjpSYW5kb20oKS5ldmFsKCkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzIocnZhbHVlX2NvcHlhc3NpZ24oIEFycmF5PGZsb2F0LDMsMT46OlJhbmRvbSgpLmV2YWwoKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMihydmFsdWVfY29weWFzc2lnbiggQXJyYXk8ZmxvYXQsNCwxPjo6UmFuZG9tKCkuZXZhbCgpICkpOworICAgIENBTExfU1VCVEVTVF8yKHJ2YWx1ZV9jb3B5YXNzaWduKEFycmF5PGZsb2F0LCAyLCAxPjo6UmFuZG9tKCkuZXZhbCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIocnZhbHVlX2NvcHlhc3NpZ24oQXJyYXk8ZmxvYXQsIDMsIDE+OjpSYW5kb20oKS5ldmFsKCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihydmFsdWVfY29weWFzc2lnbihBcnJheTxmbG9hdCwgNCwgMT46OlJhbmRvbSgpLmV2YWwoKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzIocnZhbHVlX2NvcHlhc3NpZ24oIEFycmF5PGZsb2F0LDIsMj46OlJhbmRvbSgpLmV2YWwoKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMihydmFsdWVfY29weWFzc2lnbiggQXJyYXk8ZmxvYXQsMywzPjo6UmFuZG9tKCkuZXZhbCgpICkpOwotICAgIENBTExfU1VCVEVTVF8yKHJ2YWx1ZV9jb3B5YXNzaWduKCBBcnJheTxmbG9hdCw0LDQ+OjpSYW5kb20oKS5ldmFsKCkgKSk7Ci0gIAotICAgIENBTExfU1VCVEVTVF8zKChydmFsdWVfdHJhbnNwb3NpdGlvbnM8UGVybXV0YXRpb25NYXRyaXg8RHluYW1pYywgRHluYW1pYywgaW50PiA+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwotICAgIENBTExfU1VCVEVTVF8zKChydmFsdWVfdHJhbnNwb3NpdGlvbnM8UGVybXV0YXRpb25NYXRyaXg8RHluYW1pYywgRHluYW1pYywgSW5kZXg+ID4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoKHJ2YWx1ZV90cmFuc3Bvc2l0aW9uczxUcmFuc3Bvc2l0aW9uczxEeW5hbWljLCBEeW5hbWljLCBpbnQ+ID4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoKHJ2YWx1ZV90cmFuc3Bvc2l0aW9uczxUcmFuc3Bvc2l0aW9uczxEeW5hbWljLCBEeW5hbWljLCBJbmRleD4gPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihydmFsdWVfY29weWFzc2lnbihBcnJheTxmbG9hdCwgMiwgMj46OlJhbmRvbSgpLmV2YWwoKSkpOworICAgIENBTExfU1VCVEVTVF8yKHJ2YWx1ZV9jb3B5YXNzaWduKEFycmF5PGZsb2F0LCAzLCAzPjo6UmFuZG9tKCkuZXZhbCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIocnZhbHVlX2NvcHlhc3NpZ24oQXJyYXk8ZmxvYXQsIDQsIDQ+OjpSYW5kb20oKS5ldmFsKCkpKTsKIAotICAgIENBTExfU1VCVEVTVF81KHJ2YWx1ZV9tb3ZlKEVpZ2VuOjpNYXRyaXg8TW92YWJsZVNjYWxhcjxmbG9hdD4sMSwzPjo6UmFuZG9tKCkuZXZhbCgpKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzUocnZhbHVlX21vdmUoRWlnZW46Ok1hdHJpeDxTYWZlU2NhbGFyPGZsb2F0PiwxLDM+OjpSYW5kb20oKS5ldmFsKCkpKTsKLSAgICBDQUxMX1NVQlRFU1RfNShydmFsdWVfbW92ZShFaWdlbjo6TWF0cml4PFNhZmVTY2FsYXI8ZmxvYXQ+LEVpZ2VuOjpEeW5hbWljLEVpZ2VuOjpEeW5hbWljPjo6UmFuZG9tKDEsMykuZXZhbCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKHJ2YWx1ZV90cmFuc3Bvc2l0aW9uczxQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLCBEeW5hbWljLCBpbnQ+ID4oCisgICAgICAgIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMygocnZhbHVlX3RyYW5zcG9zaXRpb25zPFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsIER5bmFtaWMsIEluZGV4PiA+KAorICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoCisgICAgICAgIChydmFsdWVfdHJhbnNwb3NpdGlvbnM8VHJhbnNwb3NpdGlvbnM8RHluYW1pYywgRHluYW1pYywgaW50PiA+KGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgocnZhbHVlX3RyYW5zcG9zaXRpb25zPFRyYW5zcG9zaXRpb25zPER5bmFtaWMsIER5bmFtaWMsIEluZGV4PiA+KAorICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisKKyAgICBDQUxMX1NVQlRFU1RfNShydmFsdWVfbW92ZShFaWdlbjo6TWF0cml4PE1vdmFibGVTY2FsYXI8ZmxvYXQ+LCAxLCAzPjo6UmFuZG9tKCkuZXZhbCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUocnZhbHVlX21vdmUoRWlnZW46Ok1hdHJpeDxTYWZlU2NhbGFyPGZsb2F0PiwgMSwgMz46OlJhbmRvbSgpLmV2YWwoKSkpOworICAgIENBTExfU1VCVEVTVF81KHJ2YWx1ZV9tb3ZlKEVpZ2VuOjpNYXRyaXg8U2FmZVNjYWxhcjxmbG9hdD4sIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYz46OlJhbmRvbSgxLCAzKS5ldmFsKCkpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9zY2h1cl9jb21wbGV4LmNwcCBiL3Rlc3Qvc2NodXJfY29tcGxleC5jcHAKaW5kZXggMjZhY2I4Yy4uMDQ0OTg5NiAxMDA2NDQKLS0tIGEvdGVzdC9zY2h1cl9jb21wbGV4LmNwcAorKysgYi90ZXN0L3NjaHVyX2NvbXBsZXguY3BwCkBAIC0xMSwyMSArMTEsMjEgQEAKICNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgc2NodXIoaW50IHNpemUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBzY2h1cihpbnQgc2l6ZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+OjpDb21wbGV4U2NhbGFyIENvbXBsZXhTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+OjpDb21wbGV4TWF0cml4VHlwZSBDb21wbGV4TWF0cml4VHlwZTsKIAogICAvLyBUZXN0IGJhc2ljIGZ1bmN0aW9uYWxpdHk6IFQgaXMgdHJpYW5ndWxhciBhbmQgQSA9IFUgVCBVKgotICBmb3IoaW50IGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgZ19yZXBlYXQ7ICsrY291bnRlcikgeworICBmb3IgKGludCBjb3VudGVyID0gMDsgY291bnRlciA8IGdfcmVwZWF0OyArK2NvdW50ZXIpIHsKICAgICBNYXRyaXhUeXBlIEEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CiAgICAgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+IHNjaHVyT2ZBKEEpOwogICAgIFZFUklGWV9JU19FUVVBTChzY2h1ck9mQS5pbmZvKCksIFN1Y2Nlc3MpOwogICAgIENvbXBsZXhNYXRyaXhUeXBlIFUgPSBzY2h1ck9mQS5tYXRyaXhVKCk7CiAgICAgQ29tcGxleE1hdHJpeFR5cGUgVCA9IHNjaHVyT2ZBLm1hdHJpeFQoKTsKLSAgICBmb3IoaW50IHJvdyA9IDE7IHJvdyA8IHNpemU7ICsrcm93KSB7Ci0gICAgICBmb3IoaW50IGNvbCA9IDA7IGNvbCA8IHJvdzsgKytjb2wpIHsKLSAgICAgICAgVkVSSUZZKFQocm93LGNvbCkgPT0gKHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcikwKTsKKyAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPCBzaXplOyArK3JvdykgeworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcm93OyArK2NvbCkgeworICAgICAgICBWRVJJRlkoVChyb3csIGNvbCkgPT0gKHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhcikwKTsKICAgICAgIH0KICAgICB9CiAgICAgVkVSSUZZX0lTX0FQUFJPWChBLnRlbXBsYXRlIGNhc3Q8Q29tcGxleFNjYWxhcj4oKSwgVSAqIFQgKiBVLmFkam9pbnQoKSk7CkBAIC0zNiw3ICszNiw3IEBACiAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKGNzVW5pbml0aWFsaXplZC5tYXRyaXhUKCkpOwogICBWRVJJRllfUkFJU0VTX0FTU0VSVChjc1VuaW5pdGlhbGl6ZWQubWF0cml4VSgpKTsKICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoY3NVbmluaXRpYWxpemVkLmluZm8oKSk7Ci0gIAorCiAgIC8vIFRlc3Qgd2hldGhlciBjb21wdXRlKCkgYW5kIGNvbnN0cnVjdG9yIHJldHVybnMgc2FtZSByZXN1bHQKICAgTWF0cml4VHlwZSBBID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOwogICBDb21wbGV4U2NodXI8TWF0cml4VHlwZT4gY3MxOwpAQCAtNTksOCArNTksOCBAQAogICBWRVJJRllfSVNfRVFVQUwoY3MzLmdldE1heEl0ZXJhdGlvbnMoKSwgMSk7CiAKICAgTWF0cml4VHlwZSBBdHJpYW5ndWxhciA9IEE7Ci0gIEF0cmlhbmd1bGFyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkuc2V0WmVybygpOyAKLSAgY3MzLnNldE1heEl0ZXJhdGlvbnMoMSkuY29tcHV0ZShBdHJpYW5ndWxhcik7IC8vIHRyaWFuZ3VsYXIgbWF0cmljZXMgZG8gbm90IG5lZWQgYW55IGl0ZXJhdGlvbnMKKyAgQXRyaWFuZ3VsYXIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKS5zZXRaZXJvKCk7CisgIGNzMy5zZXRNYXhJdGVyYXRpb25zKDEpLmNvbXB1dGUoQXRyaWFuZ3VsYXIpOyAgLy8gdHJpYW5ndWxhciBtYXRyaWNlcyBkbyBub3QgbmVlZCBhbnkgaXRlcmF0aW9ucwogICBWRVJJRllfSVNfRVFVQUwoY3MzLmluZm8oKSwgU3VjY2Vzcyk7CiAgIFZFUklGWV9JU19FUVVBTChjczMubWF0cml4VCgpLCBBdHJpYW5ndWxhci50ZW1wbGF0ZSBjYXN0PENvbXBsZXhTY2FsYXI+KCkpOwogICBWRVJJRllfSVNfRVFVQUwoY3MzLm1hdHJpeFUoKSwgQ29tcGxleE1hdHJpeFR5cGU6OklkZW50aXR5KHNpemUsIHNpemUpKTsKQEAgLTcxLDIxICs3MSwxOSBAQAogICBWRVJJRllfSVNfRVFVQUwoY3MxLm1hdHJpeFQoKSwgY3NPbmx5VC5tYXRyaXhUKCkpOwogICBWRVJJRllfUkFJU0VTX0FTU0VSVChjc09ubHlULm1hdHJpeFUoKSk7CiAKLSAgaWYgKHNpemUgPiAxICYmIHNpemUgPCAyMCkKLSAgeworICBpZiAoc2l6ZSA+IDEgJiYgc2l6ZSA8IDIwKSB7CiAgICAgLy8gVGVzdCBtYXRyaXggd2l0aCBOYU4KLSAgICBBKDAsMCkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXI+OjpxdWlldF9OYU4oKTsKKyAgICBBKDAsIDApID0gc3RkOjpudW1lcmljX2xpbWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyPjo6cXVpZXRfTmFOKCk7CiAgICAgQ29tcGxleFNjaHVyPE1hdHJpeFR5cGU+IGNzTmFOKEEpOwogICAgIFZFUklGWV9JU19FUVVBTChjc05hTi5pbmZvKCksIE5vQ29udmVyZ2VuY2UpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChzY2h1cl9jb21wbGV4KQotewotICBDQUxMX1NVQlRFU1RfMSgoIHNjaHVyPE1hdHJpeDRjZD4oKSApKTsKLSAgQ0FMTF9TVUJURVNUXzIoKCBzY2h1cjxNYXRyaXhYY2Y+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvNCkpICkpOwotICBDQUxMX1NVQlRFU1RfMygoIHNjaHVyPE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCAxPiA+KCkgKSk7Ci0gIENBTExfU1VCVEVTVF80KCggc2NodXI8TWF0cml4PGZsb2F0LCAzLCAzLCBFaWdlbjo6Um93TWFqb3I+ID4oKSApKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChzY2h1cl9jb21wbGV4KSB7CisgIENBTExfU1VCVEVTVF8xKChzY2h1cjxNYXRyaXg0Y2Q+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIoKHNjaHVyPE1hdHJpeFhjZj4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyA0KSkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoKHNjaHVyPE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCAxPiA+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzQoKHNjaHVyPE1hdHJpeDxmbG9hdCwgMywgMywgRWlnZW46OlJvd01ham9yPiA+KCkpKTsKIAogICAvLyBUZXN0IHByb2JsZW0gc2l6ZSBjb25zdHJ1Y3RvcnMKICAgQ0FMTF9TVUJURVNUXzUoQ29tcGxleFNjaHVyPE1hdHJpeFhmPigxMCkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9zY2h1cl9yZWFsLmNwcCBiL3Rlc3Qvc2NodXJfcmVhbC5jcHAKaW5kZXggOGI0MGRkZC4uY2QwYmU5MiAxMDA2NDQKLS0tIGEvdGVzdC9zY2h1cl9yZWFsLmNwcAorKysgYi90ZXN0L3NjaHVyX3JlYWwuY3BwCkBAIC0xMSwzNCArMTEsMzQgQEAKICNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8RWlnZW4vRWlnZW52YWx1ZXM+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgdmVyaWZ5SXNRdWFzaVRyaWFuZ3VsYXIoY29uc3QgTWF0cml4VHlwZSYgVCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB2ZXJpZnlJc1F1YXNpVHJpYW5ndWxhcihjb25zdCBNYXRyaXhUeXBlJiBUKSB7CiAgIGNvbnN0IEluZGV4IHNpemUgPSBULmNvbHMoKTsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogCiAgIC8vIENoZWNrIFQgaXMgbG93ZXIgSGVzc2VuYmVyZwotICBmb3IoaW50IHJvdyA9IDI7IHJvdyA8IHNpemU7ICsrcm93KSB7Ci0gICAgZm9yKGludCBjb2wgPSAwOyBjb2wgPCByb3cgLSAxOyArK2NvbCkgewotICAgICAgVkVSSUZZX0lTX0VRVUFMKFQocm93LGNvbCksIFNjYWxhcigwKSk7CisgIGZvciAoaW50IHJvdyA9IDI7IHJvdyA8IHNpemU7ICsrcm93KSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcm93IC0gMTsgKytjb2wpIHsKKyAgICAgIFZFUklGWV9JU19FUVVBTChUKHJvdywgY29sKSwgU2NhbGFyKDApKTsKICAgICB9CiAgIH0KIAogICAvLyBDaGVjayB0aGF0IGFueSBub24temVybyBvbiB0aGUgc3ViZGlhZ29uYWwgaXMgZm9sbG93ZWQgYnkgYSB6ZXJvIGFuZCBpcwogICAvLyBwYXJ0IG9mIGEgMngyIGRpYWdvbmFsIGJsb2NrIHdpdGggaW1hZ2luYXJ5IGVpZ2VudmFsdWVzLgotICBmb3IoaW50IHJvdyA9IDE7IHJvdyA8IHNpemU7ICsrcm93KSB7CisgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IHNpemU7ICsrcm93KSB7CiAgICAgaWYgKCFudW1leHQ6OmlzX2V4YWN0bHlfemVybyhUKHJvdywgcm93IC0gMSkpKSB7Ci0gICAgICBWRVJJRlkocm93ID09IHNpemUtMSB8fCBudW1leHQ6OmlzX2V4YWN0bHlfemVybyhUKHJvdyArIDEsIHJvdykpKTsKLSAgICAgIFNjYWxhciB0ciA9IFQocm93LTEscm93LTEpICsgVChyb3cscm93KTsKLSAgICAgIFNjYWxhciBkZXQgPSBUKHJvdy0xLHJvdy0xKSAqIFQocm93LHJvdykgLSBUKHJvdy0xLHJvdykgKiBUKHJvdyxyb3ctMSk7CisgICAgICBWRVJJRlkocm93ID09IHNpemUgLSAxIHx8IG51bWV4dDo6aXNfZXhhY3RseV96ZXJvKFQocm93ICsgMSwgcm93KSkpOworICAgICAgU2NhbGFyIHRyID0gVChyb3cgLSAxLCByb3cgLSAxKSArIFQocm93LCByb3cpOworICAgICAgU2NhbGFyIGRldCA9IFQocm93IC0gMSwgcm93IC0gMSkgKiBUKHJvdywgcm93KSAtIFQocm93IC0gMSwgcm93KSAqIFQocm93LCByb3cgLSAxKTsKICAgICAgIFZFUklGWSg0ICogZGV0ID4gdHIgKiB0cik7CiAgICAgfQogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgc2NodXIoaW50IHNpemUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBzY2h1cihpbnQgc2l6ZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lKSB7CiAgIC8vIFRlc3QgYmFzaWMgZnVuY3Rpb25hbGl0eTogVCBpcyBxdWFzaS10cmlhbmd1bGFyIGFuZCBBID0gVSBUIFUqCi0gIGZvcihpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBnX3JlcGVhdDsgKytjb3VudGVyKSB7CisgIGZvciAoaW50IGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgZ19yZXBlYXQ7ICsrY291bnRlcikgewogICAgIE1hdHJpeFR5cGUgQSA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKICAgICBSZWFsU2NodXI8TWF0cml4VHlwZT4gc2NodXJPZkEoQSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHNjaHVyT2ZBLmluZm8oKSwgU3VjY2Vzcyk7CkBAIC01Myw3ICs1Myw3IEBACiAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKHJzVW5pbml0aWFsaXplZC5tYXRyaXhUKCkpOwogICBWRVJJRllfUkFJU0VTX0FTU0VSVChyc1VuaW5pdGlhbGl6ZWQubWF0cml4VSgpKTsKICAgVkVSSUZZX1JBSVNFU19BU1NFUlQocnNVbmluaXRpYWxpemVkLmluZm8oKSk7Ci0gIAorCiAgIC8vIFRlc3Qgd2hldGhlciBjb21wdXRlKCkgYW5kIGNvbnN0cnVjdG9yIHJldHVybnMgc2FtZSByZXN1bHQKICAgTWF0cml4VHlwZSBBID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOwogICBSZWFsU2NodXI8TWF0cml4VHlwZT4gcnMxOwpAQCAtNzcsMTAgKzc3LDEwIEBACiAgIH0KIAogICBNYXRyaXhUeXBlIEF0cmlhbmd1bGFyID0gQTsKLSAgQXRyaWFuZ3VsYXIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlMb3dlcj4oKS5zZXRaZXJvKCk7IAotICByczMuc2V0TWF4SXRlcmF0aW9ucygxKS5jb21wdXRlKEF0cmlhbmd1bGFyKTsgLy8gdHJpYW5ndWxhciBtYXRyaWNlcyBkbyBub3QgbmVlZCBhbnkgaXRlcmF0aW9ucworICBBdHJpYW5ndWxhci50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseUxvd2VyPigpLnNldFplcm8oKTsKKyAgcnMzLnNldE1heEl0ZXJhdGlvbnMoMSkuY29tcHV0ZShBdHJpYW5ndWxhcik7ICAvLyB0cmlhbmd1bGFyIG1hdHJpY2VzIGRvIG5vdCBuZWVkIGFueSBpdGVyYXRpb25zCiAgIFZFUklGWV9JU19FUVVBTChyczMuaW5mbygpLCBTdWNjZXNzKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyczMubWF0cml4VCgpLCBBdHJpYW5ndWxhcik7IC8vIGFwcHJveCBiZWNhdXNlIG9mIHNjYWxpbmcuLi4KKyAgVkVSSUZZX0lTX0FQUFJPWChyczMubWF0cml4VCgpLCBBdHJpYW5ndWxhcik7ICAvLyBhcHByb3ggYmVjYXVzZSBvZiBzY2FsaW5nLi4uCiAgIFZFUklGWV9JU19FUVVBTChyczMubWF0cml4VSgpLCBNYXRyaXhUeXBlOjpJZGVudGl0eShzaXplLCBzaXplKSk7CiAKICAgLy8gVGVzdCBjb21wdXRhdGlvbiBvZiBvbmx5IFQsIG5vdCBVCkBAIC04OSwyMSArODksMTkgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHJzMS5tYXRyaXhUKCksIHJzT25seVQubWF0cml4VCgpKTsKICAgVkVSSUZZX1JBSVNFU19BU1NFUlQocnNPbmx5VC5tYXRyaXhVKCkpOwogCi0gIGlmIChzaXplID4gMiAmJiBzaXplIDwgMjApCi0gIHsKKyAgaWYgKHNpemUgPiAyICYmIHNpemUgPCAyMCkgewogICAgIC8vIFRlc3QgbWF0cml4IHdpdGggTmFOCi0gICAgQSgwLDApID0gc3RkOjpudW1lcmljX2xpbWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpxdWlldF9OYU4oKTsKKyAgICBBKDAsIDApID0gc3RkOjpudW1lcmljX2xpbWl0czx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXI+OjpxdWlldF9OYU4oKTsKICAgICBSZWFsU2NodXI8TWF0cml4VHlwZT4gcnNOYU4oQSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHJzTmFOLmluZm8oKSwgTm9Db252ZXJnZW5jZSk7CiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHNjaHVyX3JlYWwpCi17Ci0gIENBTExfU1VCVEVTVF8xKCggc2NodXI8TWF0cml4NGY+KCkgKSk7Ci0gIENBTExfU1VCVEVTVF8yKCggc2NodXI8TWF0cml4WGQ+KGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUvNCkpICkpOwotICBDQUxMX1NVQlRFU1RfMygoIHNjaHVyPE1hdHJpeDxmbG9hdCwgMSwgMT4gPigpICkpOwotICBDQUxMX1NVQlRFU1RfNCgoIHNjaHVyPE1hdHJpeDxkb3VibGUsIDMsIDMsIEVpZ2VuOjpSb3dNYWpvcj4gPigpICkpOworRUlHRU5fREVDTEFSRV9URVNUKHNjaHVyX3JlYWwpIHsKKyAgQ0FMTF9TVUJURVNUXzEoKHNjaHVyPE1hdHJpeDRmPigpKSk7CisgIENBTExfU1VCVEVTVF8yKChzY2h1cjxNYXRyaXhYZD4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUgLyA0KSkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoKHNjaHVyPE1hdHJpeDxmbG9hdCwgMSwgMT4gPigpKSk7CisgIENBTExfU1VCVEVTVF80KChzY2h1cjxNYXRyaXg8ZG91YmxlLCAzLCAzLCBFaWdlbjo6Um93TWFqb3I+ID4oKSkpOwogCiAgIC8vIFRlc3QgcHJvYmxlbSBzaXplIGNvbnN0cnVjdG9ycwogICBDQUxMX1NVQlRFU1RfNShSZWFsU2NodXI8TWF0cml4WGY+KDEwKSk7CmRpZmYgLS1naXQgYS90ZXN0L3NlbGZhZGpvaW50LmNwcCBiL3Rlc3Qvc2VsZmFkam9pbnQuY3BwCmluZGV4IDc0NDk1ZmIuLjM4MDc1ZWUgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2VsZmFkam9pbnQuY3BwCisrKyBiL3Rlc3Qvc2VsZmFkam9pbnQuY3BwCkBAIC0xMywxNyArMTMsMTQgQEAKIC8vIFRoaXMgZmlsZSB0ZXN0cyB0aGUgYmFzaWMgc2VsZmFkam9pbnRWaWV3IEFQSSwKIC8vIHRoZSByZWxhdGVkIHByb2R1Y3RzIGFuZCBkZWNvbXBvc2l0aW9ucyBhcmUgdGVzdGVkIGluIHNwZWNpZmljIGZpbGVzLgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHNlbGZhZGpvaW50KGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgc2VsZmFkam9pbnQoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAKLSAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtMyhyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICBtNChyb3dzLCBjb2xzKTsKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0zKHJvd3MsIGNvbHMpLCBtNChyb3dzLCBjb2xzKTsKIAogICBtMS5kaWFnb25hbCgpID0gbTEuZGlhZ29uYWwoKS5yZWFsKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCk7CiAKQEAgLTM5LDM0ICszNiwzMSBAQAogICBtMyA9IG0xLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKTsKICAgbTQgPSBtMjsKICAgbTQgKz0gbTEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpOwotICBWRVJJRllfSVNfQVBQUk9YKG00LCBtMittMyk7CisgIFZFUklGWV9JU19BUFBST1gobTQsIG0yICsgbTMpOwogCiAgIG0zID0gbTEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpOwogICBtNCA9IG0yOwogICBtNCAtPSBtMS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCk7Ci0gIFZFUklGWV9JU19BUFBST1gobTQsIG0yLW0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNCwgbTIgLSBtMyk7CiB9CiAKLXZvaWQgYnVnXzE1OSgpCi17Cit2b2lkIGJ1Z18xNTkoKSB7CiAgIE1hdHJpeDNkIG0gPSBNYXRyaXgzZDo6UmFuZG9tKCkuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUobSkKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHNlbGZhZGpvaW50KQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQgOyBpKyspCi0gIHsKLSAgICBpbnQgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpOworRUlHRU5fREVDTEFSRV9URVNUKHNlbGZhZGpvaW50KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIGludCBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpOwogCi0gICAgQ0FMTF9TVUJURVNUXzEoIHNlbGZhZGpvaW50KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggc2VsZmFkam9pbnQoTWF0cml4PGZsb2F0LCAyLCAyPigpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBzZWxmYWRqb2ludChNYXRyaXgzY2YoKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggc2VsZmFkam9pbnQoTWF0cml4WGNkKHMscykpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIHNlbGZhZGpvaW50KE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KHMsIHMpKSApOwotICAgIAorICAgIENBTExfU1VCVEVTVF8xKHNlbGZhZGpvaW50KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKHNlbGZhZGpvaW50KE1hdHJpeDxmbG9hdCwgMiwgMj4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKHNlbGZhZGpvaW50KE1hdHJpeDNjZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoc2VsZmFkam9pbnQoTWF0cml4WGNkKHMsIHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoc2VsZmFkam9pbnQoTWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4ocywgcykpKTsKKwogICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocykKICAgfQotICAKLSAgQ0FMTF9TVUJURVNUXzEoIGJ1Z18xNTkoKSApOworCisgIENBTExfU1VCVEVTVF8xKGJ1Z18xNTkoKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L3NlcmlhbGl6ZXIuY3BwIGIvdGVzdC9zZXJpYWxpemVyLmNwcAppbmRleCBkM2U3YmE1Li4wYzg0MTZmIDEwMDY0NAotLS0gYS90ZXN0L3NlcmlhbGl6ZXIuY3BwCisrKyBiL3Rlc3Qvc2VyaWFsaXplci5jcHAKQEAgLTE1LDkgKzE1LDcgQEAKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzdHJ1Y3QgUmFuZG9tSW1wbCB7Ci0gIHN0YXRpYyBhdXRvIENyZWF0ZShFaWdlbjo6SW5kZXggcm93cywgRWlnZW46OkluZGV4IGNvbHMpIHsKLSAgICByZXR1cm4gVDo6UmFuZG9tKHJvd3MsIGNvbHMpOwotICB9CisgIHN0YXRpYyBhdXRvIENyZWF0ZShFaWdlbjo6SW5kZXggcm93cywgRWlnZW46OkluZGV4IGNvbHMpIHsgcmV0dXJuIFQ6OlJhbmRvbShyb3dzLCBjb2xzKTsgfQogfTsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IE9wdGlvbnMsIHR5cGVuYW1lIERlbnNlSW5kZXg+CkBAIC04NSwxMyArODMsMTMgQEAKIHZvaWQgdGVzdF9wb2RfdHlwZSgpIHsKICAgTXlQb2RUeXBlIGluaXRpYWwgPSB7MS4zLCAxNywgMS45Zn07CiAgIE15UG9kVHlwZSBjbG9uZSA9IHstMSwgLTEsIC0xfTsKLSAgCisKICAgRWlnZW46OlNlcmlhbGl6ZXI8TXlQb2RUeXBlPiBzZXJpYWxpemVyOwotICAKKwogICAvLyBEZXRlcm1pbmUgcmVxdWlyZWQgc2l6ZS4KICAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gc2VyaWFsaXplci5zaXplKGluaXRpYWwpOwogICBWRVJJRllfSVNfRVFVQUwoYnVmZmVyX3NpemUsIHNpemVvZihNeVBvZFR5cGUpKTsKLSAgCisKICAgLy8gU2VyaWFsaXplLgogICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIoYnVmZmVyX3NpemUpOwogICB1aW50OF90KiBiZWdpbiA9IGJ1ZmZlci5kYXRhKCk7CkBAIC05OSw3ICs5Nyw3IEBACiAgIHVpbnQ4X3QqIGRlc3QgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShiZWdpbiwgZW5kLCBpbml0aWFsKTsKICAgVkVSSUZZKGRlc3QgIT0gbnVsbHB0cik7CiAgIFZFUklGWV9JU19FUVVBTChkZXN0IC0gYmVnaW4sIGJ1ZmZlcl9zaXplKTsKLSAgCisKICAgLy8gRGVzZXJpYWxpemUuCiAgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYmVnaW4sIGVuZCwgY2xvbmUpOwogICBWRVJJRlkoc3JjICE9IG51bGxwdHIpOwpAQCAtMTI2LDcgKzEyNCw3IEBACiB9CiAKIC8vIE1hdHJpeCwgVmVjdG9yLCBBcnJheQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogdm9pZCB0ZXN0X2VpZ2VuX3R5cGUoY29uc3QgVCYgdHlwZSkgewogICBjb25zdCBJbmRleCByb3dzID0gdHlwZS5yb3dzKCk7CiAgIGNvbnN0IEluZGV4IGNvbHMgPSB0eXBlLmNvbHMoKTsKQEAgLTE0Miw3ICsxNDAsNyBAQAogICB1aW50OF90KiBkZXN0ID0gc2VyaWFsaXplci5zZXJpYWxpemUoYmVnaW4sIGVuZCwgaW5pdGlhbCk7CiAgIFZFUklGWShkZXN0ICE9IG51bGxwdHIpOwogICBWRVJJRllfSVNfRVFVQUwoZGVzdCAtIGJlZ2luLCBidWZmZXJfc2l6ZSk7Ci0gIAorCiAgIC8vIERlc2VyaWFsaXplLgogICBUIGNsb25lOwogICBjb25zdCB1aW50OF90KiBzcmMgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGJlZ2luLCBlbmQsIGNsb25lKTsKQEAgLTE2OCwxNCArMTY2LDEzIEBACiB9CiAKIC8vIFRlc3QgYSBjb2xsZWN0aW9uIG9mIGRlbnNlIHR5cGVzLgotdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgogdm9pZCB0ZXN0X2RlbnNlX3R5cGVzKGNvbnN0IFQxJiB0eXBlMSwgY29uc3QgVDImIHR5cGUyLCBjb25zdCBUMyYgdHlwZTMpIHsKLSAgCiAgIC8vIE1ha2UgcmFuZG9tIGlucHV0cy4KICAgY29uc3QgVDEgeDEgPSBUMTo6UmFuZG9tKHR5cGUxLnJvd3MoKSwgdHlwZTEuY29scygpKTsKICAgY29uc3QgVDIgeDIgPSBUMjo6UmFuZG9tKHR5cGUyLnJvd3MoKSwgdHlwZTIuY29scygpKTsKICAgY29uc3QgVDMgeDMgPSBUMzo6UmFuZG9tKHR5cGUzLnJvd3MoKSwgdHlwZTMuY29scygpKTsKLSAgCisKICAgLy8gQWxsb2NhdGUgYnVmZmVyIGFuZCBzZXJpYWxpemUuCiAgIHNpemVfdCBidWZmZXJfc2l6ZSA9IEVpZ2VuOjpzZXJpYWxpemVfc2l6ZSh4MSwgeDIsIHgzKTsKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyKGJ1ZmZlcl9zaXplKTsKQEAgLTE4Myw3ICsxODAsNyBAQAogICB1aW50OF90KiBlbmQgPSBidWZmZXIuZGF0YSgpICsgYnVmZmVyLnNpemUoKTsKICAgdWludDhfdCogZGVzdCA9IEVpZ2VuOjpzZXJpYWxpemUoYmVnaW4sIGVuZCwgeDEsIHgyLCB4Myk7CiAgIFZFUklGWShkZXN0ICE9IG51bGxwdHIpOwotICAKKwogICAvLyBDbG9uZSBldmVyeXRoaW5nLgogICBUMSB5MTsKICAgVDIgeTI7CkBAIC0yMTMsMjEgKzIxMCwxOCBAQAogICBWRVJJRlkoc3JjID09IG51bGxwdHIpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1Qoc2VyaWFsaXplcikKLXsKLSAgQ0FMTF9TVUJURVNUKCB0ZXN0X3BvZF90eXBlKCkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChzZXJpYWxpemVyKSB7CisgIENBTExfU1VCVEVTVCh0ZXN0X3BvZF90eXBlKCkpOwogCi0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUKCB0ZXN0X2VpZ2VuX3R5cGUoRWlnZW46OkFycmF5MzNmKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUKCB0ZXN0X2VpZ2VuX3R5cGUoRWlnZW46OkFycmF5WGQoMTApKSApOwotICAgIENBTExfU1VCVEVTVCggdGVzdF9laWdlbl90eXBlKEVpZ2VuOjpWZWN0b3IzZigpKSApOwotICAgIENBTExfU1VCVEVTVCggdGVzdF9laWdlbl90eXBlKEVpZ2VuOjpNYXRyaXg0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVCggdGVzdF9laWdlbl90eXBlKEVpZ2VuOjpNYXRyaXhYZCgxNSwgMTcpKSApOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1QodGVzdF9laWdlbl90eXBlKEVpZ2VuOjpBcnJheTMzZigpKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3RfZWlnZW5fdHlwZShFaWdlbjo6QXJyYXlYZCgxMCkpKTsKKyAgICBDQUxMX1NVQlRFU1QodGVzdF9laWdlbl90eXBlKEVpZ2VuOjpWZWN0b3IzZigpKSk7CisgICAgQ0FMTF9TVUJURVNUKHRlc3RfZWlnZW5fdHlwZShFaWdlbjo6TWF0cml4NGQoKSkpOworICAgIENBTExfU1VCVEVTVCh0ZXN0X2VpZ2VuX3R5cGUoRWlnZW46Ok1hdHJpeFhkKDE1LCAxNykpKTsKICAgICBDQUxMX1NVQlRFU1QodGVzdF9laWdlbl90eXBlKEVpZ2VuOjpTcGFyc2VNYXRyaXg8ZmxvYXQ+KDEzLCAxMikpKTsKICAgICBDQUxMX1NVQlRFU1QodGVzdF9laWdlbl90eXBlKEVpZ2VuOjpTcGFyc2VWZWN0b3I8ZmxvYXQ+KDE3KSkpOwogCi0gICAgQ0FMTF9TVUJURVNUKCB0ZXN0X2RlbnNlX3R5cGVzKCBFaWdlbjo6QXJyYXkzM2YoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjpBcnJheVhkKDEwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjpNYXRyaXhYZCgxNSwgMTcpKSApOworICAgIENBTExfU1VCVEVTVCh0ZXN0X2RlbnNlX3R5cGVzKEVpZ2VuOjpBcnJheTMzZigpLCBFaWdlbjo6QXJyYXlYZCgxMCksIEVpZ2VuOjpNYXRyaXhYZCgxNSwgMTcpKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3Qvc2ltcGxpY2lhbF9jaG9sZXNreS5jcHAgYi90ZXN0L3NpbXBsaWNpYWxfY2hvbGVza3kuY3BwCmluZGV4IDUzOGQwMWEuLmNhNjc0OTYgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltcGxpY2lhbF9jaG9sZXNreS5jcHAKKysrIGIvdGVzdC9zaW1wbGljaWFsX2Nob2xlc2t5LmNwcApAQCAtOSwxNyArOSwxNyBAQAogCiAjaW5jbHVkZSAic3BhcnNlX3NvbHZlci5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBJXywgaW50IGZsYWc+IHZvaWQgdGVzdF9zaW1wbGljaWFsX2Nob2xlc2t5X1QoKQotewotICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxULGZsYWcsSV8+IFNwYXJzZU1hdHJpeFR5cGU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgSV8sIGludCBmbGFnPgordm9pZCB0ZXN0X3NpbXBsaWNpYWxfY2hvbGVza3lfVCgpIHsKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8VCwgZmxhZywgSV8+IFNwYXJzZU1hdHJpeFR5cGU7CiAgIFNpbXBsaWNpYWxDaG9sZXNreTxTcGFyc2VNYXRyaXhUeXBlLCBMb3dlcj4gY2hvbF9jb2xtYWpvcl9sb3dlcl9hbWQ7CiAgIFNpbXBsaWNpYWxDaG9sZXNreTxTcGFyc2VNYXRyaXhUeXBlLCBVcHBlcj4gY2hvbF9jb2xtYWpvcl91cHBlcl9hbWQ7Ci0gIFNpbXBsaWNpYWxMTFQ8ICAgICBTcGFyc2VNYXRyaXhUeXBlLCBMb3dlcj4gbGx0X2NvbG1ham9yX2xvd2VyX2FtZDsKLSAgU2ltcGxpY2lhbExMVDwgICAgIFNwYXJzZU1hdHJpeFR5cGUsIFVwcGVyPiBsbHRfY29sbWFqb3JfdXBwZXJfYW1kOwotICBTaW1wbGljaWFsTERMVDwgICAgU3BhcnNlTWF0cml4VHlwZSwgTG93ZXI+IGxkbHRfY29sbWFqb3JfbG93ZXJfYW1kOwotICBTaW1wbGljaWFsTERMVDwgICAgU3BhcnNlTWF0cml4VHlwZSwgVXBwZXI+IGxkbHRfY29sbWFqb3JfdXBwZXJfYW1kOwotICBTaW1wbGljaWFsTERMVDwgICAgU3BhcnNlTWF0cml4VHlwZSwgTG93ZXIsIE5hdHVyYWxPcmRlcmluZzxJXz4gPiBsZGx0X2NvbG1ham9yX2xvd2VyX25hdDsKLSAgU2ltcGxpY2lhbExETFQ8ICAgIFNwYXJzZU1hdHJpeFR5cGUsIFVwcGVyLCBOYXR1cmFsT3JkZXJpbmc8SV8+ID4gbGRsdF9jb2xtYWpvcl91cHBlcl9uYXQ7CisgIFNpbXBsaWNpYWxMTFQ8U3BhcnNlTWF0cml4VHlwZSwgTG93ZXI+IGxsdF9jb2xtYWpvcl9sb3dlcl9hbWQ7CisgIFNpbXBsaWNpYWxMTFQ8U3BhcnNlTWF0cml4VHlwZSwgVXBwZXI+IGxsdF9jb2xtYWpvcl91cHBlcl9hbWQ7CisgIFNpbXBsaWNpYWxMRExUPFNwYXJzZU1hdHJpeFR5cGUsIExvd2VyPiBsZGx0X2NvbG1ham9yX2xvd2VyX2FtZDsKKyAgU2ltcGxpY2lhbExETFQ8U3BhcnNlTWF0cml4VHlwZSwgVXBwZXI+IGxkbHRfY29sbWFqb3JfdXBwZXJfYW1kOworICBTaW1wbGljaWFsTERMVDxTcGFyc2VNYXRyaXhUeXBlLCBMb3dlciwgTmF0dXJhbE9yZGVyaW5nPElfPiA+IGxkbHRfY29sbWFqb3JfbG93ZXJfbmF0OworICBTaW1wbGljaWFsTERMVDxTcGFyc2VNYXRyaXhUeXBlLCBVcHBlciwgTmF0dXJhbE9yZGVyaW5nPElfPiA+IGxkbHRfY29sbWFqb3JfdXBwZXJfbmF0OwogCiAgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjaG9sX2NvbG1ham9yX2xvd2VyX2FtZCk7CiAgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhjaG9sX2NvbG1ham9yX3VwcGVyX2FtZCk7CkBAIC0yNywyNCArMjcsMjMgQEAKICAgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKGxsdF9jb2xtYWpvcl91cHBlcl9hbWQpOwogICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGRsdF9jb2xtYWpvcl9sb3dlcl9hbWQpOwogICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGRsdF9jb2xtYWpvcl91cHBlcl9hbWQpOwotICAKKwogICBjaGVja19zcGFyc2Vfc3BkX2RldGVybWluYW50KGNob2xfY29sbWFqb3JfbG93ZXJfYW1kKTsKICAgY2hlY2tfc3BhcnNlX3NwZF9kZXRlcm1pbmFudChjaG9sX2NvbG1ham9yX3VwcGVyX2FtZCk7CiAgIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQobGx0X2NvbG1ham9yX2xvd2VyX2FtZCk7CiAgIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQobGx0X2NvbG1ham9yX3VwcGVyX2FtZCk7CiAgIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQobGRsdF9jb2xtYWpvcl9sb3dlcl9hbWQpOwogICBjaGVja19zcGFyc2Vfc3BkX2RldGVybWluYW50KGxkbHRfY29sbWFqb3JfdXBwZXJfYW1kKTsKLSAgCi0gIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhsZGx0X2NvbG1ham9yX2xvd2VyX25hdCwgKHN0ZDo6bWluKSgzMDAsRUlHRU5fVEVTVF9NQVhfU0laRSksIDEwMDApOwotICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGRsdF9jb2xtYWpvcl91cHBlcl9uYXQsIChzdGQ6Om1pbikoMzAwLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCAxMDAwKTsKKworICBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobGRsdF9jb2xtYWpvcl9sb3dlcl9uYXQsIChzdGQ6Om1pbikoMzAwLCBFSUdFTl9URVNUX01BWF9TSVpFKSwgMTAwMCk7CisgIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhsZGx0X2NvbG1ham9yX3VwcGVyX25hdCwgKHN0ZDo6bWluKSgzMDAsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCAxMDAwKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHNpbXBsaWNpYWxfY2hvbGVza3kpCi17Ci0gIENBTExfU1VCVEVTVF8xMSgoIHRlc3Rfc2ltcGxpY2lhbF9jaG9sZXNreV9UPGRvdWJsZSwgICAgICAgICAgICAgICBpbnQsIENvbE1ham9yPigpICkpOwotICBDQUxMX1NVQlRFU1RfMTIoKCB0ZXN0X3NpbXBsaWNpYWxfY2hvbGVza3lfVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgaW50LCBDb2xNYWpvcj4oKSApKTsKLSAgQ0FMTF9TVUJURVNUXzEzKCggdGVzdF9zaW1wbGljaWFsX2Nob2xlc2t5X1Q8ZG91YmxlLCAgICAgICAgICBsb25nIGludCwgQ29sTWFqb3I+KCkgKSk7Ci0gIENBTExfU1VCVEVTVF8yMSgoIHRlc3Rfc2ltcGxpY2lhbF9jaG9sZXNreV9UPGRvdWJsZSwgICAgICAgICAgICAgICBpbnQsIFJvd01ham9yPigpICkpOwotICBDQUxMX1NVQlRFU1RfMjIoKCB0ZXN0X3NpbXBsaWNpYWxfY2hvbGVza3lfVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgaW50LCBSb3dNYWpvcj4oKSApKTsKLSAgQ0FMTF9TVUJURVNUXzIzKCggdGVzdF9zaW1wbGljaWFsX2Nob2xlc2t5X1Q8ZG91YmxlLCAgICAgICAgICBsb25nIGludCwgUm93TWFqb3I+KCkgKSk7CitFSUdFTl9ERUNMQVJFX1RFU1Qoc2ltcGxpY2lhbF9jaG9sZXNreSkgeworICBDQUxMX1NVQlRFU1RfMTEoKHRlc3Rfc2ltcGxpY2lhbF9jaG9sZXNreV9UPGRvdWJsZSwgaW50LCBDb2xNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1RfMTIoKHRlc3Rfc2ltcGxpY2lhbF9jaG9sZXNreV9UPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBpbnQsIENvbE1ham9yPigpKSk7CisgIENBTExfU1VCVEVTVF8xMygodGVzdF9zaW1wbGljaWFsX2Nob2xlc2t5X1Q8ZG91YmxlLCBsb25nIGludCwgQ29sTWFqb3I+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIxKCh0ZXN0X3NpbXBsaWNpYWxfY2hvbGVza3lfVDxkb3VibGUsIGludCwgUm93TWFqb3I+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzIyKCh0ZXN0X3NpbXBsaWNpYWxfY2hvbGVza3lfVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgaW50LCBSb3dNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1RfMjMoKHRlc3Rfc2ltcGxpY2lhbF9jaG9sZXNreV9UPGRvdWJsZSwgbG9uZyBpbnQsIFJvd01ham9yPigpKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L3NpemVvZi5jcHAgYi90ZXN0L3NpemVvZi5jcHAKaW5kZXggYWYzNGU5Ny4uNDgyMGVlOCAxMDA2NDQKLS0tIGEvdGVzdC9zaXplb2YuY3BwCisrKyBiL3Rlc3Qvc2l6ZW9mLmNwcApAQCAtOSwzOSArOSwzOSBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHZlcmlmeVNpemVPZihjb25zdCBNYXRyaXhUeXBlJikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB2ZXJpZnlTaXplT2YoY29uc3QgTWF0cml4VHlwZSYpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwotICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUhPUR5bmFtaWMgJiYgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUhPUR5bmFtaWMpCi0gICAgVkVSSUZZX0lTX0VRVUFMKHN0ZDo6cHRyZGlmZl90KHNpemVvZihNYXRyaXhUeXBlKSksc3RkOjpwdHJkaWZmX3Qoc2l6ZW9mKFNjYWxhcikpKnN0ZDo6cHRyZGlmZl90KE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lKSk7CisgIGlmIChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSAhPSBEeW5hbWljICYmIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lICE9IER5bmFtaWMpCisgICAgVkVSSUZZX0lTX0VRVUFMKHN0ZDo6cHRyZGlmZl90KHNpemVvZihNYXRyaXhUeXBlKSksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6cHRyZGlmZl90KHNpemVvZihTY2FsYXIpKSAqIHN0ZDo6cHRyZGlmZl90KE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lKSk7CiAgIGVsc2UKLSAgICBWRVJJRllfSVNfRVFVQUwoc2l6ZW9mKE1hdHJpeFR5cGUpLHNpemVvZihTY2FsYXIqKSArIDIgKiBzaXplb2YoSW5kZXgpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2l6ZW9mKE1hdHJpeFR5cGUpLCBzaXplb2YoU2NhbGFyKikgKyAyICogc2l6ZW9mKEluZGV4KSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChzaXplb2YpCi17Ci0gIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOwotICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCAyLCAxPigpKSApOwotICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCAzLCAxPigpKSApOwotICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCA0LCAxPigpKSApOwotICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCA1LCAxPigpKSApOwotICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCA2LCAxPigpKSApOwotICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCA3LCAxPigpKSApOwotICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCA4LCAxPigpKSApOwotICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCA5LCAxPigpKSApOwotICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCAxMCwgMT4oKSkgKTsKLSAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihBcnJheTxmbG9hdCwgMTEsIDE+KCkpICk7Ci0gIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDEyLCAxPigpKSApOwotICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKFZlY3RvcjJkKCkpICk7Ci0gIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoVmVjdG9yNGYoKSkgKTsKLSAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihNYXRyaXg0ZCgpKSApOwotICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKE1hdHJpeDxkb3VibGUsIDQsIDI+KCkpICk7Ci0gIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoTWF0cml4PGJvb2wsIDcsIDU+KCkpICk7Ci0gIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoTWF0cml4WGNmKDMsIDMpKSApOwotICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKE1hdHJpeFhpKDgsIDEyKSkgKTsKLSAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihNYXRyaXhYY2QoMjAsIDIwKSkgKTsKLSAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihNYXRyaXg8ZmxvYXQsIDEwMCwgMTAwPigpKSApOwotICAKLSAgVkVSSUZZKHNpemVvZihzdGQ6OmNvbXBsZXg8ZmxvYXQ+KSA9PSAyKnNpemVvZihmbG9hdCkpOwotICBWRVJJRlkoc2l6ZW9mKHN0ZDo6Y29tcGxleDxkb3VibGU+KSA9PSAyKnNpemVvZihkb3VibGUpKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChzaXplb2YpIHsKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihBcnJheTxmbG9hdCwgMiwgMT4oKSkpOworICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCAzLCAxPigpKSk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDQsIDE+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihBcnJheTxmbG9hdCwgNSwgMT4oKSkpOworICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCA2LCAxPigpKSk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDcsIDE+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihBcnJheTxmbG9hdCwgOCwgMT4oKSkpOworICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKEFycmF5PGZsb2F0LCA5LCAxPigpKSk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDEwLCAxPigpKSk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDExLCAxPigpKSk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoQXJyYXk8ZmxvYXQsIDEyLCAxPigpKSk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoVmVjdG9yMmQoKSkpOworICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKFZlY3RvcjRmKCkpKTsKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihNYXRyaXg0ZCgpKSk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoTWF0cml4PGRvdWJsZSwgNCwgMj4oKSkpOworICBDQUxMX1NVQlRFU1QodmVyaWZ5U2l6ZU9mKE1hdHJpeDxib29sLCA3LCA1PigpKSk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoTWF0cml4WGNmKDMsIDMpKSk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoTWF0cml4WGkoOCwgMTIpKSk7CisgIENBTExfU1VCVEVTVCh2ZXJpZnlTaXplT2YoTWF0cml4WGNkKDIwLCAyMCkpKTsKKyAgQ0FMTF9TVUJURVNUKHZlcmlmeVNpemVPZihNYXRyaXg8ZmxvYXQsIDEwMCwgMTAwPigpKSk7CisKKyAgVkVSSUZZKHNpemVvZihzdGQ6OmNvbXBsZXg8ZmxvYXQ+KSA9PSAyICogc2l6ZW9mKGZsb2F0KSk7CisgIFZFUklGWShzaXplb2Yoc3RkOjpjb21wbGV4PGRvdWJsZT4pID09IDIgKiBzaXplb2YoZG91YmxlKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L3NpemVvdmVyZmxvdy5jcHAgYi90ZXN0L3NpemVvdmVyZmxvdy5jcHAKaW5kZXggNDIxMzUxMi4uNjZmODIwZiAxMDA2NDQKLS0tIGEvdGVzdC9zaXplb3ZlcmZsb3cuY3BwCisrKyBiL3Rlc3Qvc2l6ZW92ZXJmbG93LmNwcApAQCAtOSwzOCArOSwzNyBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi0jZGVmaW5lIFZFUklGWV9USFJPV1NfQkFEQUxMT0MoYSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBib29sIHRocmV3ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhdGNoIChzdGQ6OmJhZF9hbGxvYyYpIHsgdGhyZXcgPSB0cnVlOyB9ICAgICAgICAgICAgICAgICBcCi0gICAgVkVSSUZZKHRocmV3ICYmICJzaG91bGQgaGF2ZSB0aHJvd24gYmFkX2FsbG9jOiAiICNhKTsgICAgIFwKKyNkZWZpbmUgVkVSSUZZX1RIUk9XU19CQURBTExPQyhhKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgdGhyZXcgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gY2F0Y2ggKHN0ZDo6YmFkX2FsbG9jJikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRocmV3ID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZFUklGWSh0aHJldyAmJiAic2hvdWxkIGhhdmUgdGhyb3duIGJhZF9hbGxvYzogIiAjYSk7IFwKICAgfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCB0cmlnZ2VyTWF0cml4QmFkQWxsb2MoSW5kZXggcm93cywgSW5kZXggY29scykKLXsKLSAgVkVSSUZZX1RIUk9XU19CQURBTExPQyggTWF0cml4VHlwZSBtKHJvd3MsIGNvbHMpICk7Ci0gIFZFUklGWV9USFJPV1NfQkFEQUxMT0MoIE1hdHJpeFR5cGUgbTsgbS5yZXNpemUocm93cywgY29scykgKTsKLSAgVkVSSUZZX1RIUk9XU19CQURBTExPQyggTWF0cml4VHlwZSBtOyBtLmNvbnNlcnZhdGl2ZVJlc2l6ZShyb3dzLCBjb2xzKSApOwordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRyaWdnZXJNYXRyaXhCYWRBbGxvYyhJbmRleCByb3dzLCBJbmRleCBjb2xzKSB7CisgIFZFUklGWV9USFJPV1NfQkFEQUxMT0MoTWF0cml4VHlwZSBtKHJvd3MsIGNvbHMpKTsKKyAgVkVSSUZZX1RIUk9XU19CQURBTExPQyhNYXRyaXhUeXBlIG07IG0ucmVzaXplKHJvd3MsIGNvbHMpKTsKKyAgVkVSSUZZX1RIUk9XU19CQURBTExPQyhNYXRyaXhUeXBlIG07IG0uY29uc2VydmF0aXZlUmVzaXplKHJvd3MsIGNvbHMpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4KLXZvaWQgdHJpZ2dlclZlY3RvckJhZEFsbG9jKEluZGV4IHNpemUpCi17Ci0gIFZFUklGWV9USFJPV1NfQkFEQUxMT0MoIFZlY3RvclR5cGUgdihzaXplKSApOwotICBWRVJJRllfVEhST1dTX0JBREFMTE9DKCBWZWN0b3JUeXBlIHY7IHYucmVzaXplKHNpemUpICk7Ci0gIFZFUklGWV9USFJPV1NfQkFEQUxMT0MoIFZlY3RvclR5cGUgdjsgdi5jb25zZXJ2YXRpdmVSZXNpemUoc2l6ZSkgKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCB0cmlnZ2VyVmVjdG9yQmFkQWxsb2MoSW5kZXggc2l6ZSkgeworICBWRVJJRllfVEhST1dTX0JBREFMTE9DKFZlY3RvclR5cGUgdihzaXplKSk7CisgIFZFUklGWV9USFJPV1NfQkFEQUxMT0MoVmVjdG9yVHlwZSB2OyB2LnJlc2l6ZShzaXplKSk7CisgIFZFUklGWV9USFJPV1NfQkFEQUxMT0MoVmVjdG9yVHlwZSB2OyB2LmNvbnNlcnZhdGl2ZVJlc2l6ZShzaXplKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChzaXplb3ZlcmZsb3cpCi17Ci0gIC8vIHRoZXJlIGFyZSAyIGxldmVscyBvZiBvdmVyZmxvdyBjaGVja2luZy4gZmlyc3QgaW4gUGxhaW5PYmplY3RCYXNlLmggd2UgY2hlY2sgZm9yIG92ZXJmbG93IGluIHJvd3MqY29scyBjb21wdXRhdGlvbnMuCi0gIC8vIHRoaXMgaXMgdGVzdGVkIGluIHRlc3RzIG9mIHRoZSBmb3JtIHRpbWVzX2l0c2VsZl9naXZlc18wICogdGltZXNfaXRzZWxmX2dpdmVzXzAKLSAgLy8gVGhlbiBpbiBNZW1vcnkuaCB3ZSBjaGVjayBmb3Igb3ZlcmZsb3cgaW4gc2l6ZSAqIHNpemVvZihUKSBjb21wdXRhdGlvbnMuCi0gIC8vIHRoaXMgaXMgdGVzdGVkIGluIHRlc3RzIG9mIHRoZSBmb3JtIHRpbWVzXzRfZ2l2ZXNfMCAqIHNpemVvZihmbG9hdCkKLSAgCitFSUdFTl9ERUNMQVJFX1RFU1Qoc2l6ZW92ZXJmbG93KSB7CisgIC8vIHRoZXJlIGFyZSAyIGxldmVscyBvZiBvdmVyZmxvdyBjaGVja2luZy4gZmlyc3QgaW4gUGxhaW5PYmplY3RCYXNlLmggd2UgY2hlY2sgZm9yIG92ZXJmbG93IGluIHJvd3MqY29scworICAvLyBjb21wdXRhdGlvbnMuIHRoaXMgaXMgdGVzdGVkIGluIHRlc3RzIG9mIHRoZSBmb3JtIHRpbWVzX2l0c2VsZl9naXZlc18wICogdGltZXNfaXRzZWxmX2dpdmVzXzAgVGhlbiBpbiBNZW1vcnkuaCB3ZQorICAvLyBjaGVjayBmb3Igb3ZlcmZsb3cgaW4gc2l6ZSAqIHNpemVvZihUKSBjb21wdXRhdGlvbnMuIHRoaXMgaXMgdGVzdGVkIGluIHRlc3RzIG9mIHRoZSBmb3JtIHRpbWVzXzRfZ2l2ZXNfMCAqCisgIC8vIHNpemVvZihmbG9hdCkKKwogICBzaXplX3QgdGltZXNfaXRzZWxmX2dpdmVzXzAgPSBzaXplX3QoMSkgPDwgKDggKiBzaXplb2YoSW5kZXgpIC8gMik7CiAgIFZFUklGWSh0aW1lc19pdHNlbGZfZ2l2ZXNfMCAqIHRpbWVzX2l0c2VsZl9naXZlc18wID09IDApOwogCkBAIC01Nyw4ICs1Niw4IEBACiAgIHRyaWdnZXJNYXRyaXhCYWRBbGxvYzxNYXRyaXhYZD4odGltZXNfaXRzZWxmX2dpdmVzXzAsIHRpbWVzX2l0c2VsZl9naXZlc18wKTsKICAgdHJpZ2dlck1hdHJpeEJhZEFsbG9jPE1hdHJpeFhkPih0aW1lc19pdHNlbGZfZ2l2ZXNfMCAvIDgsIHRpbWVzX2l0c2VsZl9naXZlc18wKTsKICAgdHJpZ2dlck1hdHJpeEJhZEFsbG9jPE1hdHJpeFhkPih0aW1lc184X2dpdmVzXzAsIDEpOwotICAKKwogICB0cmlnZ2VyVmVjdG9yQmFkQWxsb2M8VmVjdG9yWGY+KHRpbWVzXzRfZ2l2ZXNfMCk7Ci0gIAorCiAgIHRyaWdnZXJWZWN0b3JCYWRBbGxvYzxWZWN0b3JYZD4odGltZXNfOF9naXZlc18wKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3Qvc2tld19zeW1tZXRyaWNfbWF0cml4My5jcHAgYi90ZXN0L3NrZXdfc3ltbWV0cmljX21hdHJpeDMuY3BwCmluZGV4IDZkYWQwMDMuLmQ0NTI2MmYgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2tld19zeW1tZXRyaWNfbWF0cml4My5jcHAKKysrIGIvdGVzdC9za2V3X3N5bW1ldHJpY19tYXRyaXgzLmNwcApAQCAtNzQsMTYgKzc0LDE1IEBACiAgIFZFUklGWV9JU19BUFBST1goKHNrMSAtIHNrMikudG9EZW5zZU1hdHJpeCgpLCBzcTEgLSBzcTIpOwogCiAgIFNxdWFyZU1hdHJpeCBzcTMgPSB2MS5hc1NrZXdTeW1tZXRyaWMoKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc3EzID0gdjEuYXNTa2V3U3ltbWV0cmljKCkgKyB2Mi5hc1NrZXdTeW1tZXRyaWMoKSwgc3ExICsgc3EyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc3EzID0gdjEuYXNTa2V3U3ltbWV0cmljKCkgLSB2Mi5hc1NrZXdTeW1tZXRyaWMoKSwgc3ExIC0gc3EyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc3EzID0gdjEuYXNTa2V3U3ltbWV0cmljKCkgLSAyKnYyLmFzU2tld1N5bW1ldHJpYygpICsgdjEuYXNTa2V3U3ltbWV0cmljKCksIHNxMSAtIDIqc3EyICsgc3ExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzcTMgPSB2MS5hc1NrZXdTeW1tZXRyaWMoKSArIHYyLmFzU2tld1N5bW1ldHJpYygpLCBzcTEgKyBzcTIpOworICBWRVJJRllfSVNfQVBQUk9YKHNxMyA9IHYxLmFzU2tld1N5bW1ldHJpYygpIC0gdjIuYXNTa2V3U3ltbWV0cmljKCksIHNxMSAtIHNxMik7CisgIFZFUklGWV9JU19BUFBST1goc3EzID0gdjEuYXNTa2V3U3ltbWV0cmljKCkgLSAyICogdjIuYXNTa2V3U3ltbWV0cmljKCkgKyB2MS5hc1NrZXdTeW1tZXRyaWMoKSwgc3ExIC0gMiAqIHNxMiArIHNxMSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWCgoc2sxICsgc2sxKS52ZWN0b3IoKSwgMip2MSk7CisgIFZFUklGWV9JU19BUFBST1goKHNrMSArIHNrMSkudmVjdG9yKCksIDIgKiB2MSk7CiAgIFZFUklGWSgoc2sxIC0gc2sxKS52ZWN0b3IoKS5pc1plcm8oKSk7CiAgIFZFUklGWSgoc2sxIC0gc2sxKS50b0RlbnNlTWF0cml4KCkuaXNaZXJvKCkpOwogfQogCi0KIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CiB2b2lkIG11bHRpcGx5U2NhbGUoKSB7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMT4gVmVjdG9yOwpAQCAtOTYsOCArOTUsOCBAQAogICBzazEgPSB2MS5hc1NrZXdTeW1tZXRyaWMoKTsKIAogICBjb25zdCBTY2FsYXIgczEgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChTa2V3U3ltbWV0cmljTWF0cml4MzxTY2FsYXI+KHNrMSpzMSkudmVjdG9yKCksIHNrMS52ZWN0b3IoKSAqIHMxKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChTa2V3U3ltbWV0cmljTWF0cml4MzxTY2FsYXI+KHMxKnNrMSkudmVjdG9yKCksIHMxICogc2sxLnZlY3RvcigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChTa2V3U3ltbWV0cmljTWF0cml4MzxTY2FsYXI+KHNrMSAqIHMxKS52ZWN0b3IoKSwgc2sxLnZlY3RvcigpICogczEpOworICBWRVJJRllfSVNfQVBQUk9YKFNrZXdTeW1tZXRyaWNNYXRyaXgzPFNjYWxhcj4oczEgKiBzazEpLnZlY3RvcigpLCBzMSAqIHNrMS52ZWN0b3IoKSk7CiAgIFZFUklGWV9JU19BUFBST1goc3ExICogKHNrMSAqIHMxKSwgKHNxMSAqIHNrMSkgKiBzMSk7CiAKICAgY29uc3QgVmVjdG9yIHYyID0gVmVjdG9yOjpSYW5kb20oKTsKQEAgLTEwNSwxNCArMTA0LDE0IEBACiAgIHNxMiA9IHYyLmFzU2tld1N5bW1ldHJpYygpOwogICBTa2V3U3ltbWV0cmljTWF0cml4MzxTY2FsYXI+IHNrMjsKICAgc2syID0gdjIuYXNTa2V3U3ltbWV0cmljKCk7Ci0gIFZFUklGWV9JU19BUFBST1goc2sxKnNrMiwgc3ExKnNxMik7CisgIFZFUklGWV9JU19BUFBST1goc2sxICogc2syLCBzcTEgKiBzcTIpOwogCiAgIC8vIG51bGwgc3BhY2UKLSAgVkVSSUZZKChzazEqdjEpLmlzWmVybygpKTsKLSAgVkVSSUZZKChzazIqdjIpLmlzWmVybygpKTsKKyAgVkVSSUZZKChzazEgKiB2MSkuaXNaZXJvKCkpOworICBWRVJJRlkoKHNrMiAqIHYyKS5pc1plcm8oKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXg+CiB2b2lkIHNrZXdTeW1tZXRyaWNNdWx0aXBsaWNhdGlvbihjb25zdCBNYXRyaXgmIG0pIHsKICAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PHR5cGVuYW1lIE1hdHJpeDo6U2NhbGFyLCAzLCAxPiBWZWN0b3I7CiAgIGNvbnN0IFZlY3RvciB2ID0gVmVjdG9yOjpSYW5kb20oKTsKQEAgLTEyNyw3ICsxMjYsNyBAQAogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDE+IFZlY3RvcjsKICAgY29uc3QgVmVjdG9yIHYgPSBWZWN0b3I6OlJhbmRvbSgpOwogICAvLyB0aGlzIGRvZXMgbm90IHdvcmssIHZhbHVlcyBsYXJnZXIgdGhhbiAxLmUtMDggY2FuIGJlIHNlZW4KLSAgLy9WRVJJRllfSVNfQVBQUk9YKHNxLmRldGVybWluYW50KCksIHN0YXRpY19jYXN0PFNjYWxhcj4oMCkpOworICAvLyBWRVJJRllfSVNfQVBQUk9YKHNxLmRldGVybWluYW50KCksIHN0YXRpY19jYXN0PFNjYWxhcj4oMCkpOwogICBWRVJJRllfSVNfQVBQUk9YKHYuYXNTa2V3U3ltbWV0cmljKCkuZGV0ZXJtaW5hbnQoKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPigwKSk7CiAgIFZFUklGWV9JU19BUFBST1godi5hc1NrZXdTeW1tZXRyaWMoKS50b0RlbnNlTWF0cml4KCkudHJhY2UoKSwgc3RhdGljX2Nhc3Q8U2NhbGFyPigwKSk7CiB9CkBAIC0xNDksMTAgKzE0OCwxMCBAQAogCiAgIFZlY3RvciB2MiA9IFZlY3Rvcjo6UmFuZG9tKCk7CiAgIHYyLm5vcm1hbGl6ZSgpOwotICBWRVJJRlkoKDIqRUlHRU5fUEkqdjIpLmFzU2tld1N5bW1ldHJpYygpLmV4cG9uZW50aWFsKCkuaXNJZGVudGl0eSgpKTsKKyAgVkVSSUZZKCgyICogRUlHRU5fUEkgKiB2MikuYXNTa2V3U3ltbWV0cmljKCkuZXhwb25lbnRpYWwoKS5pc0lkZW50aXR5KCkpOwogCiAgIFZlY3RvciB2MzsKLSAgY29uc3QgYXV0byBwcmVjaXNpb24gPSBzdGF0aWNfY2FzdDxTY2FsYXI+KDEuMSkqTnVtVHJhaXRzPFNjYWxhcj46OmR1bW15X3ByZWNpc2lvbigpOworICBjb25zdCBhdXRvIHByZWNpc2lvbiA9IHN0YXRpY19jYXN0PFNjYWxhcj4oMS4xKSAqIE51bVRyYWl0czxTY2FsYXI+OjpkdW1teV9wcmVjaXNpb24oKTsKICAgdjMgPDwgMCwgMCwgcHJlY2lzaW9uOwogICBWRVJJRlkodjMuYXNTa2V3U3ltbWV0cmljKCkuZXhwb25lbnRpYWwoKS5pc0lkZW50aXR5KHByZWNpc2lvbikpOwogfQpAQCAtMTc0LDIzICsxNzMsMjAgQEAKICAgLy8gcm90YXRpb24gYXhpcyBpcyBpbnZhcmlhbnQKICAgY29uc3QgVmVjdG9yIHYxID0gVmVjdG9yOjpSYW5kb20oKTsKICAgY29uc3QgU3F1YXJlTWF0cml4IHIxID0gdjEuYXNTa2V3U3ltbWV0cmljKCkuZXhwb25lbnRpYWwoKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyMSp2MSwgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKHIxICogdjEsIHYxKTsKIAogICAvLyByb3RhdGUgYXJvdW5kIHotYXhpcwogICBWZWN0b3IgdjI7CiAgIHYyIDw8IDAsIDAsIEVJR0VOX1BJOwogICBjb25zdCBTcXVhcmVNYXRyaXggcjIgPSB2Mi5hc1NrZXdTeW1tZXRyaWMoKS5leHBvbmVudGlhbCgpOwotICBWRVJJRllfSVNfQVBQUk9YKHIyKihWZWN0b3IoKSA8PCAxLDAsMCkuZmluaXNoZWQoKSwgKFZlY3RvcigpIDw8IC0xLDAsMCkuZmluaXNoZWQoKSk7Ci0gIFZFUklGWV9JU19BUFBST1gocjIqKFZlY3RvcigpIDw8IDAsMSwwKS5maW5pc2hlZCgpLCAoVmVjdG9yKCkgPDwgMCwtMSwwKS5maW5pc2hlZCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyMiAqIChWZWN0b3IoKSA8PCAxLCAwLCAwKS5maW5pc2hlZCgpLCAoVmVjdG9yKCkgPDwgLTEsIDAsIDApLmZpbmlzaGVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHIyICogKFZlY3RvcigpIDw8IDAsIDEsIDApLmZpbmlzaGVkKCksIChWZWN0b3IoKSA8PCAwLCAtMSwgMCkuZmluaXNoZWQoKSk7CiB9CiAKK30gIC8vIG5hbWVzcGFjZQogCi19IC8vIG5hbWVzcGFjZQotCi0KLUVJR0VOX0RFQ0xBUkVfVEVTVChza2V3X3N5bW1ldHJpY19tYXRyaXgzKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworRUlHRU5fREVDTEFSRV9URVNUKHNrZXdfc3ltbWV0cmljX21hdHJpeDMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CiAgICAgQ0FMTF9TVUJURVNUXzEoY29uc3RydWN0b3JzPGZsb2F0PigpKTsKICAgICBDQUxMX1NVQlRFU1RfMShjb25zdHJ1Y3RvcnM8ZG91YmxlPigpKTsKICAgICBDQUxMX1NVQlRFU1RfMShhc3NpZ25tZW50czxmbG9hdD4oKSk7CkBAIC0yMDAsOCArMTk2LDggQEAKICAgICBDQUxMX1NVQlRFU1RfMihwbHVzTWludXM8ZG91YmxlPigpKTsKICAgICBDQUxMX1NVQlRFU1RfMihtdWx0aXBseVNjYWxlPGZsb2F0PigpKTsKICAgICBDQUxMX1NVQlRFU1RfMihtdWx0aXBseVNjYWxlPGRvdWJsZT4oKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoc2tld1N5bW1ldHJpY011bHRpcGxpY2F0aW9uKE1hdHJpeFhmKDMsaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoc2tld1N5bW1ldHJpY011bHRpcGxpY2F0aW9uKE1hdHJpeFhkKDMsaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoc2tld1N5bW1ldHJpY011bHRpcGxpY2F0aW9uKE1hdHJpeFhmKDMsIGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMihza2V3U3ltbWV0cmljTXVsdGlwbGljYXRpb24oTWF0cml4WGQoMywgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOwogICAgIENBTExfU1VCVEVTVF8yKHRyYWNlQW5kRGV0PGZsb2F0PigpKTsKICAgICBDQUxMX1NVQlRFU1RfMih0cmFjZUFuZERldDxkb3VibGU+KCkpOwogICAgIENBTExfU1VCVEVTVF8yKHRyYW5zcG9zZTxmbG9hdD4oKSk7CmRpZmYgLS1naXQgYS90ZXN0L3NtYWxsdmVjdG9ycy5jcHAgYi90ZXN0L3NtYWxsdmVjdG9ycy5jcHAKaW5kZXggZDU4MDM4Zi4uNjgyYjExOCAxMDA2NDQKLS0tIGEvdGVzdC9zbWFsbHZlY3RvcnMuY3BwCisrKyBiL3Rlc3Qvc21hbGx2ZWN0b3JzLmNwcApAQCAtOSwxNSArOSwxMyBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgc21hbGxWZWN0b3JzKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIHNtYWxsVmVjdG9ycygpIHsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCAyPiBWMjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAzLCAxPiBWMzsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCA0PiBWNDsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBWWDsKLSAgU2NhbGFyIHgxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCi0gICAgICAgICB4MiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpLAotICAgICAgICAgeDMgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSwKKyAgU2NhbGFyIHgxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksIHgyID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksIHgzID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCksCiAgICAgICAgICB4NCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwogICBWMiB2Mih4MSwgeDIpOwogICBWMyB2Myh4MSwgeDIsIHgzKTsKQEAgLTM5LDExICszNywxMCBAQAogICBWRVJJRllfUkFJU0VTX0FTU0VSVChWWCgzLCAyKSkKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHNtYWxsdmVjdG9ycykKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1Qoc21hbGxWZWN0b3JzPGludD4oKSApOwotICAgIENBTExfU1VCVEVTVChzbWFsbFZlY3RvcnM8ZmxvYXQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1Qoc21hbGxWZWN0b3JzPGRvdWJsZT4oKSApOworRUlHRU5fREVDTEFSRV9URVNUKHNtYWxsdmVjdG9ycykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1Qoc21hbGxWZWN0b3JzPGludD4oKSk7CisgICAgQ0FMTF9TVUJURVNUKHNtYWxsVmVjdG9yczxmbG9hdD4oKSk7CisgICAgQ0FMTF9TVUJURVNUKHNtYWxsVmVjdG9yczxkb3VibGU+KCkpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3NvbHZlcmJhc2UuaCBiL3Rlc3Qvc29sdmVyYmFzZS5oCmluZGV4IGJhNzZiYTQuLmYzNTM5NDMgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc29sdmVyYmFzZS5oCisrKyBiL3Rlc3Qvc29sdmVyYmFzZS5oCkBAIC0xLDQwICsxLDM5IEBACiAjaWZuZGVmIFRFU1RfU09MVkVSQkFTRV9ICiAjZGVmaW5lIFRFU1RfU09MVkVSQkFTRV9ICiAKLXRlbXBsYXRlPHR5cGVuYW1lIERzdFR5cGUsIHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFNvbHZlclR5cGU+Ci12b2lkIGNoZWNrX3NvbHZlcmJhc2UoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBjb25zdCBTb2x2ZXJUeXBlJiBzb2x2ZXIsIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIEluZGV4IGNvbHMyKQotewordGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5cGUsIHR5cGVuYW1lIFJoc1R5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFNvbHZlclR5cGU+Cit2b2lkIGNoZWNrX3NvbHZlcmJhc2UoY29uc3QgTWF0cml4VHlwZSYgbWF0cml4LCBjb25zdCBTb2x2ZXJUeXBlJiBzb2x2ZXIsIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIEluZGV4IGNvbHMyKSB7CiAgIC8vIHNvbHZlCi0gIERzdFR5cGUgbTIgICAgICAgICAgICAgICA9IERzdFR5cGU6OlJhbmRvbShjb2xzLGNvbHMyKTsKLSAgUmhzVHlwZSBtMyAgICAgICAgICAgICAgID0gbWF0cml4Km0yOwotICBEc3RUeXBlIHNvbHZlcl9zb2x1dGlvbiAgPSBEc3RUeXBlOjpSYW5kb20oY29scyxjb2xzMik7CisgIERzdFR5cGUgbTIgPSBEc3RUeXBlOjpSYW5kb20oY29scywgY29sczIpOworICBSaHNUeXBlIG0zID0gbWF0cml4ICogbTI7CisgIERzdFR5cGUgc29sdmVyX3NvbHV0aW9uID0gRHN0VHlwZTo6UmFuZG9tKGNvbHMsIGNvbHMyKTsKICAgc29sdmVyLl9zb2x2ZV9pbXBsKG0zLCBzb2x2ZXJfc29sdXRpb24pOwotICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtYXRyaXgqc29sdmVyX3NvbHV0aW9uKTsKLSAgc29sdmVyX3NvbHV0aW9uICAgICAgICAgID0gRHN0VHlwZTo6UmFuZG9tKGNvbHMsY29sczIpOwotICBzb2x2ZXJfc29sdXRpb24gICAgICAgICAgPSBzb2x2ZXIuc29sdmUobTMpOwotICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtYXRyaXgqc29sdmVyX3NvbHV0aW9uKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbWF0cml4ICogc29sdmVyX3NvbHV0aW9uKTsKKyAgc29sdmVyX3NvbHV0aW9uID0gRHN0VHlwZTo6UmFuZG9tKGNvbHMsIGNvbHMyKTsKKyAgc29sdmVyX3NvbHV0aW9uID0gc29sdmVyLnNvbHZlKG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbWF0cml4ICogc29sdmVyX3NvbHV0aW9uKTsKICAgLy8gdGVzdCBzb2x2ZSB3aXRoIHRyYW5zcG9zZWQKLSAgbTMgICAgICAgICAgICAgICAgICAgICAgID0gUmhzVHlwZTo6UmFuZG9tKHJvd3MsY29sczIpOwotICBtMiAgICAgICAgICAgICAgICAgICAgICAgPSBtYXRyaXgudHJhbnNwb3NlKCkqbTM7Ci0gIFJoc1R5cGUgc29sdmVyX3NvbHV0aW9uMiA9IFJoc1R5cGU6OlJhbmRvbShyb3dzLGNvbHMyKTsKKyAgbTMgPSBSaHNUeXBlOjpSYW5kb20ocm93cywgY29sczIpOworICBtMiA9IG1hdHJpeC50cmFuc3Bvc2UoKSAqIG0zOworICBSaHNUeXBlIHNvbHZlcl9zb2x1dGlvbjIgPSBSaHNUeXBlOjpSYW5kb20ocm93cywgY29sczIpOwogICBzb2x2ZXIudGVtcGxhdGUgX3NvbHZlX2ltcGxfdHJhbnNwb3NlZDxmYWxzZT4obTIsIHNvbHZlcl9zb2x1dGlvbjIpOwotICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtYXRyaXgudHJhbnNwb3NlKCkqc29sdmVyX3NvbHV0aW9uMik7Ci0gIHNvbHZlcl9zb2x1dGlvbjIgICAgICAgICA9IFJoc1R5cGU6OlJhbmRvbShyb3dzLGNvbHMyKTsKLSAgc29sdmVyX3NvbHV0aW9uMiAgICAgICAgID0gc29sdmVyLnRyYW5zcG9zZSgpLnNvbHZlKG0yKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbWF0cml4LnRyYW5zcG9zZSgpKnNvbHZlcl9zb2x1dGlvbjIpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtYXRyaXgudHJhbnNwb3NlKCkgKiBzb2x2ZXJfc29sdXRpb24yKTsKKyAgc29sdmVyX3NvbHV0aW9uMiA9IFJoc1R5cGU6OlJhbmRvbShyb3dzLCBjb2xzMik7CisgIHNvbHZlcl9zb2x1dGlvbjIgPSBzb2x2ZXIudHJhbnNwb3NlKCkuc29sdmUobTIpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtYXRyaXgudHJhbnNwb3NlKCkgKiBzb2x2ZXJfc29sdXRpb24yKTsKICAgLy8gdGVzdCBzb2x2ZSB3aXRoIGNvbmp1Z2F0ZSB0cmFuc3Bvc2VkCi0gIG0zICAgICAgICAgICAgICAgICAgICAgICA9IFJoc1R5cGU6OlJhbmRvbShyb3dzLGNvbHMyKTsKLSAgbTIgICAgICAgICAgICAgICAgICAgICAgID0gbWF0cml4LmFkam9pbnQoKSptMzsKLSAgc29sdmVyX3NvbHV0aW9uMiAgICAgICAgID0gUmhzVHlwZTo6UmFuZG9tKHJvd3MsY29sczIpOworICBtMyA9IFJoc1R5cGU6OlJhbmRvbShyb3dzLCBjb2xzMik7CisgIG0yID0gbWF0cml4LmFkam9pbnQoKSAqIG0zOworICBzb2x2ZXJfc29sdXRpb24yID0gUmhzVHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMyKTsKICAgc29sdmVyLnRlbXBsYXRlIF9zb2x2ZV9pbXBsX3RyYW5zcG9zZWQ8dHJ1ZT4obTIsIHNvbHZlcl9zb2x1dGlvbjIpOwotICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtYXRyaXguYWRqb2ludCgpKnNvbHZlcl9zb2x1dGlvbjIpOwotICBzb2x2ZXJfc29sdXRpb24yICAgICAgICAgPSBSaHNUeXBlOjpSYW5kb20ocm93cyxjb2xzMik7Ci0gIHNvbHZlcl9zb2x1dGlvbjIgICAgICAgICA9IHNvbHZlci5hZGpvaW50KCkuc29sdmUobTIpOwotICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtYXRyaXguYWRqb2ludCgpKnNvbHZlcl9zb2x1dGlvbjIpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtYXRyaXguYWRqb2ludCgpICogc29sdmVyX3NvbHV0aW9uMik7CisgIHNvbHZlcl9zb2x1dGlvbjIgPSBSaHNUeXBlOjpSYW5kb20ocm93cywgY29sczIpOworICBzb2x2ZXJfc29sdXRpb24yID0gc29sdmVyLmFkam9pbnQoKS5zb2x2ZShtMik7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG1hdHJpeC5hZGpvaW50KCkgKiBzb2x2ZXJfc29sdXRpb24yKTsKICAgLy8gdGVzdCB3aXRoIHRlbXBvcmFyeSBleHByZXNzaW9uIGFzIHJocwotICBtMiA9IERzdFR5cGU6OlJhbmRvbShjb2xzLGNvbHMyKTsKLSAgc29sdmVyX3NvbHV0aW9uID0gc29sdmVyLnNvbHZlKG1hdHJpeCptMik7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0cml4Km0yLCBtYXRyaXgqc29sdmVyX3NvbHV0aW9uKTsKKyAgbTIgPSBEc3RUeXBlOjpSYW5kb20oY29scywgY29sczIpOworICBzb2x2ZXJfc29sdXRpb24gPSBzb2x2ZXIuc29sdmUobWF0cml4ICogbTIpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdHJpeCAqIG0yLCBtYXRyaXggKiBzb2x2ZXJfc29sdXRpb24pOwogfQogCi0jZW5kaWYgLy8gVEVTVF9TT0xWRVJCQVNFX0gKKyNlbmRpZiAgLy8gVEVTVF9TT0xWRVJCQVNFX0gKZGlmZiAtLWdpdCBhL3Rlc3Qvc3BhcnNlLmggYi90ZXN0L3NwYXJzZS5oCmluZGV4IDc4ZTY2MTkuLjFmNGExNjYgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3BhcnNlLmgKKysrIGIvdGVzdC9zcGFyc2UuaApAQCAtMjksMTIgKzI5LDcgQEAKICNpbmNsdWRlIDxFaWdlbi9MVT4KICNpbmNsdWRlIDxFaWdlbi9TcGFyc2U+CiAKLWVudW0gewotICBGb3JjZU5vblplcm9EaWFnID0gMSwKLSAgTWFrZUxvd2VyVHJpYW5ndWxhciA9IDIsCi0gIE1ha2VVcHBlclRyaWFuZ3VsYXIgPSA0LAotICBGb3JjZVJlYWxEaWFnID0gOAotfTsKK2VudW0geyBGb3JjZU5vblplcm9EaWFnID0gMSwgTWFrZUxvd2VyVHJpYW5ndWxhciA9IDIsIE1ha2VVcHBlclRyaWFuZ3VsYXIgPSA0LCBGb3JjZVJlYWxEaWFnID0gOCB9OwogCiAvKiBJbml0aWFsaXplcyBib3RoIGEgc3BhcnNlIGFuZCBkZW5zZSBtYXRyaXggd2l0aCBzYW1lIHJhbmRvbSB2YWx1ZXMsCiAgKiBhbmQgYSByYXRpbyBvZiBcYSBkZW5zaXR5IG5vbiB6ZXJvIGVudHJpZXMuCkBAIC00MywxMTMgKzM4LDg3IEBACiAgKiBccGFyYW0gemVyb0Nvb3JkcyBhbmQgbm9uemVyb0Nvb3JkcyBhbGxvd3MgdG8gZ2V0IHRoZSBjb29yZGluYXRlIGxpc3RzIG9mIHRoZSBub24gemVybywKICAqICAgICAgICBhbmQgemVybyBjb2VmZmljaWVudHMgcmVzcGVjdGl2ZWx5LgogICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsaW50IE9wdDEsaW50IE9wdDIsdHlwZW5hbWUgU3RvcmFnZUluZGV4PiB2b2lkCi1pbml0U3BhcnNlKGRvdWJsZSBkZW5zaXR5LAotICAgICAgICAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYyxPcHQxPiYgcmVmTWF0LAotICAgICAgICAgICBTcGFyc2VNYXRyaXg8U2NhbGFyLE9wdDIsU3RvcmFnZUluZGV4PiYgc3BhcnNlTWF0LAotICAgICAgICAgICBpbnQgZmxhZ3MgPSAwLAotICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYXRyaXg8U3RvcmFnZUluZGV4LDIsMT4gPiogemVyb0Nvb3JkcyA9IDAsCi0gICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hdHJpeDxTdG9yYWdlSW5kZXgsMiwxPiA+KiBub256ZXJvQ29vcmRzID0gMCkKLXsKLSAgZW51bSB7IElzUm93TWFqb3IgPSBTcGFyc2VNYXRyaXg8U2NhbGFyLE9wdDIsU3RvcmFnZUluZGV4Pjo6SXNSb3dNYWpvciB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IE9wdDEsIGludCBPcHQyLCB0eXBlbmFtZSBTdG9yYWdlSW5kZXg+Cit2b2lkIGluaXRTcGFyc2UoZG91YmxlIGRlbnNpdHksIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIE9wdDE+JiByZWZNYXQsCisgICAgICAgICAgICAgICAgU3BhcnNlTWF0cml4PFNjYWxhciwgT3B0MiwgU3RvcmFnZUluZGV4PiYgc3BhcnNlTWF0LCBpbnQgZmxhZ3MgPSAwLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hdHJpeDxTdG9yYWdlSW5kZXgsIDIsIDE+ID4qIHplcm9Db29yZHMgPSAwLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hdHJpeDxTdG9yYWdlSW5kZXgsIDIsIDE+ID4qIG5vbnplcm9Db29yZHMgPSAwKSB7CisgIGVudW0geyBJc1Jvd01ham9yID0gU3BhcnNlTWF0cml4PFNjYWxhciwgT3B0MiwgU3RvcmFnZUluZGV4Pjo6SXNSb3dNYWpvciB9OwogICBzcGFyc2VNYXQuc2V0WmVybygpOwotICAvL3NwYXJzZU1hdC5yZXNlcnZlKGludChyZWZNYXQucm93cygpKnJlZk1hdC5jb2xzKCkqZGVuc2l0eSkpOworICAvLyBzcGFyc2VNYXQucmVzZXJ2ZShpbnQocmVmTWF0LnJvd3MoKSpyZWZNYXQuY29scygpKmRlbnNpdHkpKTsKICAgaW50IG5ueiA9IHN0YXRpY19jYXN0PGludD4oKDEuNSAqIGRlbnNpdHkpICogc3RhdGljX2Nhc3Q8ZG91YmxlPihJc1Jvd01ham9yID8gcmVmTWF0LmNvbHMoKSA6IHJlZk1hdC5yb3dzKCkpKTsKICAgc3BhcnNlTWF0LnJlc2VydmUoVmVjdG9yWGk6OkNvbnN0YW50KElzUm93TWFqb3IgPyByZWZNYXQucm93cygpIDogcmVmTWF0LmNvbHMoKSwgbm56KSk7CiAKICAgSW5kZXggaW5zZXJ0X2NvdW50ID0gMDsKLSAgZm9yKEluZGV4IGo9MDsgajxzcGFyc2VNYXQub3V0ZXJTaXplKCk7IGorKykKLSAgewotICAgIC8vc3BhcnNlTWF0LnN0YXJ0VmVjKGopOwotICAgIGZvcihJbmRleCBpPTA7IGk8c3BhcnNlTWF0LmlubmVyU2l6ZSgpOyBpKyspCi0gICAgeworICBmb3IgKEluZGV4IGogPSAwOyBqIDwgc3BhcnNlTWF0Lm91dGVyU2l6ZSgpOyBqKyspIHsKKyAgICAvLyBzcGFyc2VNYXQuc3RhcnRWZWMoaik7CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IHNwYXJzZU1hdC5pbm5lclNpemUoKTsgaSsrKSB7CiAgICAgICBJbmRleCBhaShpKSwgYWooaik7Ci0gICAgICBpZihJc1Jvd01ham9yKQotICAgICAgICBzdGQ6OnN3YXAoYWksYWopOwotICAgICAgU2NhbGFyIHYgPSAoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KDAsMSkgPCBkZW5zaXR5KSA/IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpIDogU2NhbGFyKDApOwotICAgICAgaWYgKChmbGFncyZGb3JjZU5vblplcm9EaWFnKSAmJiAoaT09aikpCi0gICAgICB7CisgICAgICBpZiAoSXNSb3dNYWpvcikgc3RkOjpzd2FwKGFpLCBhaik7CisgICAgICBTY2FsYXIgdiA9IChpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oMCwgMSkgPCBkZW5zaXR5KSA/IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpIDogU2NhbGFyKDApOworICAgICAgaWYgKChmbGFncyAmIEZvcmNlTm9uWmVyb0RpYWcpICYmIChpID09IGopKSB7CiAgICAgICAgIC8vIEZJWE1FOiB0aGUgZm9sbG93aW5nIGlzIHRvbyBjb25zZXJ2YXRpdmUKLSAgICAgICAgdiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpKlNjYWxhcigzLik7Ci0gICAgICAgIHYgPSB2KnY7Ci0gICAgICAgIGlmKG51bWV4dDo6cmVhbCh2KT4wKSB2ICs9IFNjYWxhcig1KTsKLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgIHYgLT0gU2NhbGFyKDUpOworICAgICAgICB2ID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgKiBTY2FsYXIoMy4pOworICAgICAgICB2ID0gdiAqIHY7CisgICAgICAgIGlmIChudW1leHQ6OnJlYWwodikgPiAwKQorICAgICAgICAgIHYgKz0gU2NhbGFyKDUpOworICAgICAgICBlbHNlCisgICAgICAgICAgdiAtPSBTY2FsYXIoNSk7CiAgICAgICB9Ci0gICAgICBpZiAoKGZsYWdzICYgTWFrZUxvd2VyVHJpYW5ndWxhcikgJiYgYWo+YWkpCisgICAgICBpZiAoKGZsYWdzICYgTWFrZUxvd2VyVHJpYW5ndWxhcikgJiYgYWogPiBhaSkKICAgICAgICAgdiA9IFNjYWxhcigwKTsKLSAgICAgIGVsc2UgaWYgKChmbGFncyAmIE1ha2VVcHBlclRyaWFuZ3VsYXIpICYmIGFqPGFpKQorICAgICAgZWxzZSBpZiAoKGZsYWdzICYgTWFrZVVwcGVyVHJpYW5ndWxhcikgJiYgYWogPCBhaSkKICAgICAgICAgdiA9IFNjYWxhcigwKTsKIAotICAgICAgaWYgKChmbGFncyZGb3JjZVJlYWxEaWFnKSAmJiAoaT09aikpCi0gICAgICAgIHYgPSBudW1leHQ6OnJlYWwodik7CisgICAgICBpZiAoKGZsYWdzICYgRm9yY2VSZWFsRGlhZykgJiYgKGkgPT0gaikpIHYgPSBudW1leHQ6OnJlYWwodik7CiAKLSAgICAgIGlmICghbnVtZXh0Ojppc19leGFjdGx5X3plcm8odikpCi0gICAgICB7Ci0gICAgICAgIC8vc3BhcnNlTWF0Lmluc2VydEJhY2tCeU91dGVySW5uZXIoaixpKSA9IHY7Ci0gICAgICAgIHNwYXJzZU1hdC5pbnNlcnRCeU91dGVySW5uZXIoaixpKSA9IHY7CisgICAgICBpZiAoIW51bWV4dDo6aXNfZXhhY3RseV96ZXJvKHYpKSB7CisgICAgICAgIC8vIHNwYXJzZU1hdC5pbnNlcnRCYWNrQnlPdXRlcklubmVyKGosaSkgPSB2OworICAgICAgICBzcGFyc2VNYXQuaW5zZXJ0QnlPdXRlcklubmVyKGosIGkpID0gdjsKICAgICAgICAgKytpbnNlcnRfY291bnQ7Ci0gICAgICAgIGlmIChub256ZXJvQ29vcmRzKQotICAgICAgICAgIG5vbnplcm9Db29yZHMtPnB1c2hfYmFjayhNYXRyaXg8U3RvcmFnZUluZGV4LDIsMT4gKGFpLGFqKSk7CisgICAgICAgIGlmIChub256ZXJvQ29vcmRzKSBub256ZXJvQ29vcmRzLT5wdXNoX2JhY2soTWF0cml4PFN0b3JhZ2VJbmRleCwgMiwgMT4oYWksIGFqKSk7CisgICAgICB9IGVsc2UgaWYgKHplcm9Db29yZHMpIHsKKyAgICAgICAgemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKE1hdHJpeDxTdG9yYWdlSW5kZXgsIDIsIDE+KGFpLCBhaikpOwogICAgICAgfQotICAgICAgZWxzZSBpZiAoemVyb0Nvb3JkcykKLSAgICAgIHsKLSAgICAgICAgemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKE1hdHJpeDxTdG9yYWdlSW5kZXgsMiwxPiAoYWksYWopKTsKLSAgICAgIH0KLSAgICAgIHJlZk1hdChhaSxhaikgPSB2OworICAgICAgcmVmTWF0KGFpLCBhaikgPSB2OwogCiAgICAgICAvLyBtYWtlIHN1cmUgd2Ugb25seSBpbnNlcnQgYXMgbWFueSBhcyB0aGUgc3BhcnNlIG1hdHJpeCBzdXBwb3J0cwotICAgICAgaWYoaW5zZXJ0X2NvdW50ID09IE51bVRyYWl0czxTdG9yYWdlSW5kZXg+OjpoaWdoZXN0KCkpIHJldHVybjsKKyAgICAgIGlmIChpbnNlcnRfY291bnQgPT0gTnVtVHJhaXRzPFN0b3JhZ2VJbmRleD46OmhpZ2hlc3QoKSkgcmV0dXJuOwogICAgIH0KICAgfQotICAvL3NwYXJzZU1hdC5maW5hbGl6ZSgpOworICAvLyBzcGFyc2VNYXQuZmluYWxpemUoKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLGludCBPcHRpb25zLHR5cGVuYW1lIEluZGV4PiB2b2lkCi1pbml0U3BhcnNlKGRvdWJsZSBkZW5zaXR5LAotICAgICAgICAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4mIHJlZlZlYywKLSAgICAgICAgICAgU3BhcnNlVmVjdG9yPFNjYWxhcixPcHRpb25zLEluZGV4PiYgc3BhcnNlVmVjLAotICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+KiB6ZXJvQ29vcmRzID0gMCwKLSAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50Piogbm9uemVyb0Nvb3JkcyA9IDApCi17Ci0gIHNwYXJzZVZlYy5yZXNlcnZlKGludChyZWZWZWMuc2l6ZSgpKmRlbnNpdHkpKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBPcHRpb25zLCB0eXBlbmFtZSBJbmRleD4KK3ZvaWQgaW5pdFNwYXJzZShkb3VibGUgZGVuc2l0eSwgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4mIHJlZlZlYywgU3BhcnNlVmVjdG9yPFNjYWxhciwgT3B0aW9ucywgSW5kZXg+JiBzcGFyc2VWZWMsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiogemVyb0Nvb3JkcyA9IDAsIHN0ZDo6dmVjdG9yPGludD4qIG5vbnplcm9Db29yZHMgPSAwKSB7CisgIHNwYXJzZVZlYy5yZXNlcnZlKGludChyZWZWZWMuc2l6ZSgpICogZGVuc2l0eSkpOwogICBzcGFyc2VWZWMuc2V0WmVybygpOwotICBmb3IoaW50IGk9MDsgaTxyZWZWZWMuc2l6ZSgpOyBpKyspCi0gIHsKLSAgICBTY2FsYXIgdiA9IChpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oMCwxKSA8IGRlbnNpdHkpID8gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgOiBTY2FsYXIoMCk7Ci0gICAgaWYgKCFudW1leHQ6OmlzX2V4YWN0bHlfemVybyh2KSkKLSAgICB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmVmVjLnNpemUoKTsgaSsrKSB7CisgICAgU2NhbGFyIHYgPSAoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KDAsIDEpIDwgZGVuc2l0eSkgPyBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSA6IFNjYWxhcigwKTsKKyAgICBpZiAoIW51bWV4dDo6aXNfZXhhY3RseV96ZXJvKHYpKSB7CiAgICAgICBzcGFyc2VWZWMuaW5zZXJ0QmFjayhpKSA9IHY7Ci0gICAgICBpZiAobm9uemVyb0Nvb3JkcykKLSAgICAgICAgbm9uemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKGkpOwotICAgIH0KLSAgICBlbHNlIGlmICh6ZXJvQ29vcmRzKQotICAgICAgICB6ZXJvQ29vcmRzLT5wdXNoX2JhY2soaSk7CisgICAgICBpZiAobm9uemVyb0Nvb3Jkcykgbm9uemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKGkpOworICAgIH0gZWxzZSBpZiAoemVyb0Nvb3JkcykKKyAgICAgIHplcm9Db29yZHMtPnB1c2hfYmFjayhpKTsKICAgICByZWZWZWNbaV0gPSB2OwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcixpbnQgT3B0aW9ucyx0eXBlbmFtZSBJbmRleD4gdm9pZAotaW5pdFNwYXJzZShkb3VibGUgZGVuc2l0eSwKLSAgICAgICAgICAgTWF0cml4PFNjYWxhciwxLER5bmFtaWM+JiByZWZWZWMsCi0gICAgICAgICAgIFNwYXJzZVZlY3RvcjxTY2FsYXIsT3B0aW9ucyxJbmRleD4mIHNwYXJzZVZlYywKLSAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiogemVyb0Nvb3JkcyA9IDAsCi0gICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4qIG5vbnplcm9Db29yZHMgPSAwKQotewotICBzcGFyc2VWZWMucmVzZXJ2ZShpbnQocmVmVmVjLnNpemUoKSpkZW5zaXR5KSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgT3B0aW9ucywgdHlwZW5hbWUgSW5kZXg+Cit2b2lkIGluaXRTcGFyc2UoZG91YmxlIGRlbnNpdHksIE1hdHJpeDxTY2FsYXIsIDEsIER5bmFtaWM+JiByZWZWZWMsIFNwYXJzZVZlY3RvcjxTY2FsYXIsIE9wdGlvbnMsIEluZGV4PiYgc3BhcnNlVmVjLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4qIHplcm9Db29yZHMgPSAwLCBzdGQ6OnZlY3RvcjxpbnQ+KiBub256ZXJvQ29vcmRzID0gMCkgeworICBzcGFyc2VWZWMucmVzZXJ2ZShpbnQocmVmVmVjLnNpemUoKSAqIGRlbnNpdHkpKTsKICAgc3BhcnNlVmVjLnNldFplcm8oKTsKLSAgZm9yKGludCBpPTA7IGk8cmVmVmVjLnNpemUoKTsgaSsrKQotICB7Ci0gICAgU2NhbGFyIHYgPSAoaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KDAsMSkgPCBkZW5zaXR5KSA/IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpIDogU2NhbGFyKDApOwotICAgIGlmICh2IT1TY2FsYXIoMCkpCi0gICAgeworICBmb3IgKGludCBpID0gMDsgaSA8IHJlZlZlYy5zaXplKCk7IGkrKykgeworICAgIFNjYWxhciB2ID0gKGludGVybmFsOjpyYW5kb208ZG91YmxlPigwLCAxKSA8IGRlbnNpdHkpID8gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgOiBTY2FsYXIoMCk7CisgICAgaWYgKHYgIT0gU2NhbGFyKDApKSB7CiAgICAgICBzcGFyc2VWZWMuaW5zZXJ0QmFjayhpKSA9IHY7Ci0gICAgICBpZiAobm9uemVyb0Nvb3JkcykKLSAgICAgICAgbm9uemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKGkpOwotICAgIH0KLSAgICBlbHNlIGlmICh6ZXJvQ29vcmRzKQotICAgICAgICB6ZXJvQ29vcmRzLT5wdXNoX2JhY2soaSk7CisgICAgICBpZiAobm9uemVyb0Nvb3Jkcykgbm9uemVyb0Nvb3Jkcy0+cHVzaF9iYWNrKGkpOworICAgIH0gZWxzZSBpZiAoemVyb0Nvb3JkcykKKyAgICAgIHplcm9Db29yZHMtPnB1c2hfYmFjayhpKTsKICAgICByZWZWZWNbaV0gPSB2OwogICB9CiB9CiAKLSNlbmRpZiAvLyBFSUdFTl9URVNUU1BBUlNFX0gKKyNlbmRpZiAgLy8gRUlHRU5fVEVTVFNQQVJTRV9ICmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZUxNLmNwcCBiL3Rlc3Qvc3BhcnNlTE0uY3BwCmluZGV4IGE0OGZjYjYuLjBjYjRkM2EgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3BhcnNlTE0uY3BwCisrKyBiL3Rlc3Qvc3BhcnNlTE0uY3BwCkBAIC0xOCwxNTkgKzE4LDEzNSBAQAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgotc3RydWN0IHNwYXJzZUdhdXNzaWFuVGVzdCA6IFNwYXJzZUZ1bmN0b3I8U2NhbGFyLCBpbnQ+Ci17Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IFZlY3RvclR5cGU7Ci0gIHR5cGVkZWYgU3BhcnNlRnVuY3RvcjxTY2FsYXIsaW50PiBCYXNlOworc3RydWN0IHNwYXJzZUdhdXNzaWFuVGVzdCA6IFNwYXJzZUZ1bmN0b3I8U2NhbGFyLCBpbnQ+IHsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBWZWN0b3JUeXBlOworICB0eXBlZGVmIFNwYXJzZUZ1bmN0b3I8U2NhbGFyLCBpbnQ+IEJhc2U7CiAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6SmFjb2JpYW5UeXBlIEphY29iaWFuVHlwZTsKLSAgc3BhcnNlR2F1c3NpYW5UZXN0KGludCBpbnB1dHMsIGludCB2YWx1ZXMpIDogU3BhcnNlRnVuY3RvcjxTY2FsYXIsaW50PihpbnB1dHMsdmFsdWVzKQotICB7IH0KLSAgCi0gIFZlY3RvclR5cGUgbW9kZWwoY29uc3QgVmVjdG9yVHlwZSYgdXYsIFZlY3RvclR5cGUmIHgpCi0gIHsKLSAgICBWZWN0b3JUeXBlIHk7IC8vQ2hhbmdlIHRoaXMgdG8gdXNlIGV4cHJlc3Npb24gdGVtcGxhdGUKLSAgICBpbnQgbSA9IEJhc2U6OnZhbHVlcygpOyAKKyAgc3BhcnNlR2F1c3NpYW5UZXN0KGludCBpbnB1dHMsIGludCB2YWx1ZXMpIDogU3BhcnNlRnVuY3RvcjxTY2FsYXIsIGludD4oaW5wdXRzLCB2YWx1ZXMpIHt9CisKKyAgVmVjdG9yVHlwZSBtb2RlbChjb25zdCBWZWN0b3JUeXBlJiB1diwgVmVjdG9yVHlwZSYgeCkgeworICAgIFZlY3RvclR5cGUgeTsgIC8vIENoYW5nZSB0aGlzIHRvIHVzZSBleHByZXNzaW9uIHRlbXBsYXRlCisgICAgaW50IG0gPSBCYXNlOjp2YWx1ZXMoKTsKICAgICBpbnQgbiA9IEJhc2U6OmlucHV0cygpOwotICAgIGVpZ2VuX2Fzc2VydCh1di5zaXplKCklMiA9PSAwKTsKKyAgICBlaWdlbl9hc3NlcnQodXYuc2l6ZSgpICUgMiA9PSAwKTsKICAgICBlaWdlbl9hc3NlcnQodXYuc2l6ZSgpID09IG4pOwogICAgIGVpZ2VuX2Fzc2VydCh4LnNpemUoKSA9PSBtKTsKICAgICB5LnNldFplcm8obSk7Ci0gICAgaW50IGhhbGYgPSBuLzI7CisgICAgaW50IGhhbGYgPSBuIC8gMjsKICAgICBWZWN0b3JCbG9jazxjb25zdCBWZWN0b3JUeXBlPiB1KHV2LCAwLCBoYWxmKTsKICAgICBWZWN0b3JCbG9jazxjb25zdCBWZWN0b3JUeXBlPiB2KHV2LCBoYWxmLCBoYWxmKTsKICAgICBTY2FsYXIgY29lZmY7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYWxmOyBpKyspIAotICAgICAgewotICAgICAgICBjb2VmZiA9ICh4KGopLWkpL3YoaSk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFsZjsgaSsrKSB7CisgICAgICAgIGNvZWZmID0gKHgoaikgLSBpKSAvIHYoaSk7CiAgICAgICAgIGNvZWZmICo9IGNvZWZmOwotICAgICAgICBpZiAoY29lZmYgPCAxLiAmJiBjb2VmZiA+IDAuKQotICAgICAgICAgIHkoaikgKz0gdShpKSpzdGQ6OnBvdygoMS1jb2VmZiksIDIpOworICAgICAgICBpZiAoY29lZmYgPCAxLiAmJiBjb2VmZiA+IDAuKSB5KGopICs9IHUoaSkgKiBzdGQ6OnBvdygoMSAtIGNvZWZmKSwgMik7CiAgICAgICB9CiAgICAgfQogICAgIHJldHVybiB5OwogICB9Ci0gIHZvaWQgaW5pdFBvaW50cyhWZWN0b3JUeXBlJiB1dl9yZWYsIFZlY3RvclR5cGUmIHgpCi0gIHsKKyAgdm9pZCBpbml0UG9pbnRzKFZlY3RvclR5cGUmIHV2X3JlZiwgVmVjdG9yVHlwZSYgeCkgewogICAgIG1feCA9IHg7Ci0gICAgbV95ID0gdGhpcy0+bW9kZWwodXZfcmVmLHgpOworICAgIG1feSA9IHRoaXMtPm1vZGVsKHV2X3JlZiwgeCk7CiAgIH0KLSAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yVHlwZSYgdXYsIFZlY3RvclR5cGUmIGZ2ZWMpCi0gIHsKLSAgICBpbnQgbSA9IEJhc2U6OnZhbHVlcygpOyAKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yVHlwZSYgdXYsIFZlY3RvclR5cGUmIGZ2ZWMpIHsKKyAgICBpbnQgbSA9IEJhc2U6OnZhbHVlcygpOwogICAgIGludCBuID0gQmFzZTo6aW5wdXRzKCk7Ci0gICAgZWlnZW5fYXNzZXJ0KHV2LnNpemUoKSUyID09IDApOworICAgIGVpZ2VuX2Fzc2VydCh1di5zaXplKCkgJSAyID09IDApOwogICAgIGVpZ2VuX2Fzc2VydCh1di5zaXplKCkgPT0gbik7Ci0gICAgaW50IGhhbGYgPSBuLzI7CisgICAgaW50IGhhbGYgPSBuIC8gMjsKICAgICBWZWN0b3JCbG9jazxjb25zdCBWZWN0b3JUeXBlPiB1KHV2LCAwLCBoYWxmKTsKICAgICBWZWN0b3JCbG9jazxjb25zdCBWZWN0b3JUeXBlPiB2KHV2LCBoYWxmLCBoYWxmKTsKICAgICBmdmVjID0gbV95OwogICAgIFNjYWxhciBjb2VmZjsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbGY7IGkrKykKLSAgICAgIHsKLSAgICAgICAgY29lZmYgPSAobV94KGopLWkpL3YoaSk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFsZjsgaSsrKSB7CisgICAgICAgIGNvZWZmID0gKG1feChqKSAtIGkpIC8gdihpKTsKICAgICAgICAgY29lZmYgKj0gY29lZmY7Ci0gICAgICAgIGlmIChjb2VmZiA8IDEuICYmIGNvZWZmID4gMC4pCi0gICAgICAgICAgZnZlYyhqKSAtPSB1KGkpKnN0ZDo6cG93KCgxLWNvZWZmKSwgMik7CisgICAgICAgIGlmIChjb2VmZiA8IDEuICYmIGNvZWZmID4gMC4pIGZ2ZWMoaikgLT0gdShpKSAqIHN0ZDo6cG93KCgxIC0gY29lZmYpLCAyKTsKICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CiAgIH0KLSAgCi0gIGludCBkZihjb25zdCBWZWN0b3JUeXBlJiB1diwgSmFjb2JpYW5UeXBlJiBmamFjKQotICB7Ci0gICAgaW50IG0gPSBCYXNlOjp2YWx1ZXMoKTsgCisKKyAgaW50IGRmKGNvbnN0IFZlY3RvclR5cGUmIHV2LCBKYWNvYmlhblR5cGUmIGZqYWMpIHsKKyAgICBpbnQgbSA9IEJhc2U6OnZhbHVlcygpOwogICAgIGludCBuID0gQmFzZTo6aW5wdXRzKCk7CiAgICAgZWlnZW5fYXNzZXJ0KG4gPT0gdXYuc2l6ZSgpKTsKICAgICBlaWdlbl9hc3NlcnQoZmphYy5yb3dzKCkgPT0gbSk7CiAgICAgZWlnZW5fYXNzZXJ0KGZqYWMuY29scygpID09IG4pOwotICAgIGludCBoYWxmID0gbi8yOworICAgIGludCBoYWxmID0gbiAvIDI7CiAgICAgVmVjdG9yQmxvY2s8Y29uc3QgVmVjdG9yVHlwZT4gdSh1diwgMCwgaGFsZik7CiAgICAgVmVjdG9yQmxvY2s8Y29uc3QgVmVjdG9yVHlwZT4gdih1diwgaGFsZiwgaGFsZik7CiAgICAgU2NhbGFyIGNvZWZmOwotICAgIAotICAgIC8vRGVyaXZhdGl2ZXMgd2l0aCByZXNwZWN0IHRvIHUKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBoYWxmOyBjb2wrKykKLSAgICB7Ci0gICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtOyByb3crKykKLSAgICAgIHsKLSAgICAgICAgY29lZmYgPSAobV94KHJvdyktY29sKS92KGNvbCk7Ci0gICAgICAgICAgY29lZmYgPSBjb2VmZipjb2VmZjsKLSAgICAgICAgaWYoY29lZmYgPCAxLiAmJiBjb2VmZiA+IDAuKQotICAgICAgICB7Ci0gICAgICAgICAgZmphYy5jb2VmZlJlZihyb3csY29sKSA9IC0oMS1jb2VmZikqKDEtY29lZmYpOworCisgICAgLy8gRGVyaXZhdGl2ZXMgd2l0aCByZXNwZWN0IHRvIHUKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBoYWxmOyBjb2wrKykgeworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbTsgcm93KyspIHsKKyAgICAgICAgY29lZmYgPSAobV94KHJvdykgLSBjb2wpIC8gdihjb2wpOworICAgICAgICBjb2VmZiA9IGNvZWZmICogY29lZmY7CisgICAgICAgIGlmIChjb2VmZiA8IDEuICYmIGNvZWZmID4gMC4pIHsKKyAgICAgICAgICBmamFjLmNvZWZmUmVmKHJvdywgY29sKSA9IC0oMSAtIGNvZWZmKSAqICgxIC0gY29lZmYpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIC8vRGVyaXZhdGl2ZXMgd2l0aCByZXNwZWN0IHRvIHYKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBoYWxmOyBjb2wrKykKLSAgICB7Ci0gICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtOyByb3crKykKLSAgICAgIHsKLSAgICAgICAgY29lZmYgPSAobV94KHJvdyktY29sKS92KGNvbCk7Ci0gICAgICAgIGNvZWZmID0gY29lZmYqY29lZmY7Ci0gICAgICAgIGlmKGNvZWZmIDwgMS4gJiYgY29lZmYgPiAwLikKLSAgICAgICAgewotICAgICAgICAgIGZqYWMuY29lZmZSZWYocm93LGNvbCtoYWxmKSA9IC00ICogKHUoY29sKS92KGNvbCkpKmNvZWZmKigxLWNvZWZmKTsKKyAgICAvLyBEZXJpdmF0aXZlcyB3aXRoIHJlc3BlY3QgdG8gdgorICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IGhhbGY7IGNvbCsrKSB7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtOyByb3crKykgeworICAgICAgICBjb2VmZiA9IChtX3gocm93KSAtIGNvbCkgLyB2KGNvbCk7CisgICAgICAgIGNvZWZmID0gY29lZmYgKiBjb2VmZjsKKyAgICAgICAgaWYgKGNvZWZmIDwgMS4gJiYgY29lZmYgPiAwLikgeworICAgICAgICAgIGZqYWMuY29lZmZSZWYocm93LCBjb2wgKyBoYWxmKSA9IC00ICogKHUoY29sKSAvIHYoY29sKSkgKiBjb2VmZiAqICgxIC0gY29lZmYpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwogICB9Ci0gIAotICBWZWN0b3JUeXBlIG1feCwgbV95OyAvL0RhdGEgcG9pbnRzCisKKyAgVmVjdG9yVHlwZSBtX3gsIG1feTsgIC8vIERhdGEgcG9pbnRzCiB9OwogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdF9zcGFyc2VMTV9UKCkgeworICB0eXBlZGVmIE1hdHJpeDxULCBEeW5hbWljLCAxPiBWZWN0b3JUeXBlOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9pZCB0ZXN0X3NwYXJzZUxNX1QoKQotewotICB0eXBlZGVmIE1hdHJpeDxULER5bmFtaWMsMT4gVmVjdG9yVHlwZTsKLSAgCiAgIGludCBpbnB1dHMgPSAxMDsKICAgaW50IHZhbHVlcyA9IDIwMDA7CiAgIHNwYXJzZUdhdXNzaWFuVGVzdDxUPiBzcGFyc2VfZ2F1c3NpYW4oaW5wdXRzLCB2YWx1ZXMpOwotICBWZWN0b3JUeXBlIHV2KGlucHV0cyksdXZfcmVmKGlucHV0cyk7CisgIFZlY3RvclR5cGUgdXYoaW5wdXRzKSwgdXZfcmVmKGlucHV0cyk7CiAgIFZlY3RvclR5cGUgeCh2YWx1ZXMpOwotICAvLyBHZW5lcmF0ZSB0aGUgcmVmZXJlbmNlIHNvbHV0aW9uIAotICB1dl9yZWYgPDwgLTIsIDEsIDQgLDgsIDYsIDEuOCwgMS4yLCAxLjEsIDEuOSAsIDM7Ci0gIC8vR2VuZXJhdGUgdGhlIHJlZmVyZW5jZSBkYXRhIHBvaW50cworICAvLyBHZW5lcmF0ZSB0aGUgcmVmZXJlbmNlIHNvbHV0aW9uCisgIHV2X3JlZiA8PCAtMiwgMSwgNCwgOCwgNiwgMS44LCAxLjIsIDEuMSwgMS45LCAzOworICAvLyBHZW5lcmF0ZSB0aGUgcmVmZXJlbmNlIGRhdGEgcG9pbnRzCiAgIHguc2V0UmFuZG9tKCk7Ci0gIHggPSAxMCp4OworICB4ID0gMTAgKiB4OwogICB4LmFycmF5KCkgKz0gMTA7CiAgIHNwYXJzZV9nYXVzc2lhbi5pbml0UG9pbnRzKHV2X3JlZiwgeCk7Ci0gIAotICAKLSAgLy8gR2VuZXJhdGUgdGhlIGluaXRpYWwgcGFyYW1ldGVycyAKLSAgVmVjdG9yQmxvY2s8VmVjdG9yVHlwZT4gdSh1diwgMCwgaW5wdXRzLzIpOyAKLSAgVmVjdG9yQmxvY2s8VmVjdG9yVHlwZT4gdih1diwgaW5wdXRzLzIsIGlucHV0cy8yKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgaW5pdGlhbCBwYXJhbWV0ZXJzCisgIFZlY3RvckJsb2NrPFZlY3RvclR5cGU+IHUodXYsIDAsIGlucHV0cyAvIDIpOworICBWZWN0b3JCbG9jazxWZWN0b3JUeXBlPiB2KHV2LCBpbnB1dHMgLyAyLCBpbnB1dHMgLyAyKTsKICAgdi5zZXRPbmVzKCk7Ci0gIC8vR2VuZXJhdGUgdSBvciBTb2x2ZSBmb3IgdSBmcm9tIHYKKyAgLy8gR2VuZXJhdGUgdSBvciBTb2x2ZSBmb3IgdSBmcm9tIHYKICAgdS5zZXRPbmVzKCk7Ci0gIAorCiAgIC8vIFNvbHZlIHRoZSBvcHRpbWl6YXRpb24gcHJvYmxlbQogICBMZXZlbmJlcmdNYXJxdWFyZHQ8c3BhcnNlR2F1c3NpYW5UZXN0PFQ+ID4gbG0oc3BhcnNlX2dhdXNzaWFuKTsKICAgaW50IGluZm87Ci0vLyAgIGluZm8gPSBsbS5taW5pbWl6ZSh1dik7Ci0gIAotICBWRVJJRllfSVNfRVFVQUwoaW5mbywxKTsKLSAgICAvLyBEbyBhIHN0ZXAgYnkgc3RlcCBzb2x1dGlvbiBhbmQgc2F2ZSB0aGUgcmVzaWR1YWwgCisgIC8vICAgaW5mbyA9IGxtLm1pbmltaXplKHV2KTsKKworICBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CisgIC8vIERvIGEgc3RlcCBieSBzdGVwIHNvbHV0aW9uIGFuZCBzYXZlIHRoZSByZXNpZHVhbAogICBpbnQgbWF4aXRlciA9IDIwMDsKICAgaW50IGl0ZXIgPSAwOwogICBNYXRyaXhYZCBFcnIodmFsdWVzLCBtYXhpdGVyKTsKICAgTWF0cml4WGQgTW9kKHZhbHVlcywgbWF4aXRlcik7Ci0gIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgc3RhdHVzOyAKKyAgTGV2ZW5iZXJnTWFycXVhcmR0U3BhY2U6OlN0YXR1cyBzdGF0dXM7CiAgIHN0YXR1cyA9IGxtLm1pbmltaXplSW5pdCh1dik7Ci0gIGlmIChzdGF0dXM9PUxldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpJbXByb3BlcklucHV0UGFyYW1ldGVycykKLSAgICAgIHJldHVybiA7Ci0KKyAgaWYgKHN0YXR1cyA9PSBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6SW1wcm9wZXJJbnB1dFBhcmFtZXRlcnMpIHJldHVybjsKIH0KLUVJR0VOX0RFQ0xBUkVfVEVTVChzcGFyc2VMTSkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChzcGFyc2VMTSkgewogICBDQUxMX1NVQlRFU1RfMSh0ZXN0X3NwYXJzZUxNX1Q8ZG91YmxlPigpKTsKLSAgCisKICAgLy8gQ0FMTF9TVUJURVNUXzIodGVzdF9zcGFyc2VMTV9UPHN0ZDo6Y29tcGxleDxkb3VibGU+KCkpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcGFyc2VfYmFzaWMuY3BwIGIvdGVzdC9zcGFyc2VfYmFzaWMuY3BwCmluZGV4IDI5ODYxOWUuLjM2NGFhYzAgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3BhcnNlX2Jhc2ljLmNwcAorKysgYi90ZXN0L3NwYXJzZV9iYXNpYy5jcHAKQEAgLTE1LDE3ICsxNSwxNyBAQAogCiBzdGF0aWMgbG9uZyBnX2RlbnNlX29wX3NwYXJzZV9jb3VudCA9IDA7CiAjZGVmaW5lIEVJR0VOX1NQQVJTRV9BU1NJR05NRU5UX0ZST01fREVOU0VfT1BfU1BBUlNFX1BMVUdJTiBnX2RlbnNlX29wX3NwYXJzZV9jb3VudCsrOwotI2RlZmluZSBFSUdFTl9TUEFSU0VfQVNTSUdOTUVOVF9GUk9NX1NQQVJTRV9BRERfREVOU0VfUExVR0lOIGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50Kz0xMDsKLSNkZWZpbmUgRUlHRU5fU1BBUlNFX0FTU0lHTk1FTlRfRlJPTV9TUEFSU0VfU1VCX0RFTlNFX1BMVUdJTiBnX2RlbnNlX29wX3NwYXJzZV9jb3VudCs9MjA7CisjZGVmaW5lIEVJR0VOX1NQQVJTRV9BU1NJR05NRU5UX0ZST01fU1BBUlNFX0FERF9ERU5TRV9QTFVHSU4gZ19kZW5zZV9vcF9zcGFyc2VfY291bnQgKz0gMTA7CisjZGVmaW5lIEVJR0VOX1NQQVJTRV9BU1NJR05NRU5UX0ZST01fU1BBUlNFX1NVQl9ERU5TRV9QTFVHSU4gZ19kZW5zZV9vcF9zcGFyc2VfY291bnQgKz0gMjA7CiAjZW5kaWYKIAogI2luY2x1ZGUgInNwYXJzZS5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlPiB2b2lkIHNwYXJzZV9iYXNpYyhjb25zdCBTcGFyc2VNYXRyaXhUeXBlJiByZWYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZT4KK3ZvaWQgc3BhcnNlX2Jhc2ljKGNvbnN0IFNwYXJzZU1hdHJpeFR5cGUmIHJlZikgewogICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7Ci0gIHR5cGVkZWYgTWF0cml4PFN0b3JhZ2VJbmRleCwyLDE+IFZlY3RvcjI7Ci0gIAorICB0eXBlZGVmIE1hdHJpeDxTdG9yYWdlSW5kZXgsIDIsIDE+IFZlY3RvcjI7CisKICAgY29uc3QgSW5kZXggcm93cyA9IHJlZi5yb3dzKCk7CiAgIGNvbnN0IEluZGV4IGNvbHMgPSByZWYuY29scygpOwogICBjb25zdCBJbmRleCBpbm5lciA9IHJlZi5pbm5lclNpemUoKTsKQEAgLTM1LDkgKzM1LDkgQEAKICAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CiAgIGVudW0geyBGbGFncyA9IFNwYXJzZU1hdHJpeFR5cGU6OkZsYWdzIH07CiAKLSAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguLyhyb3dzKmNvbHMpLCAwLjAxKTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXg7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IERlbnNlVmVjdG9yOworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4gLyAocm93cyAqIGNvbHMpLCAwLjAxKTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBEZW5zZVZlY3RvcjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljLCBTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yID8gUm93TWFqb3IgOiBDb2xNYWpvcj4gQ29tcGF0aWJsZURlbnNlTWF0cml4OwogICBTY2FsYXIgZXBzID0gMWUtNjsKIApAQCAtNTIsMjQzICs1MiwyMzAgQEAKICAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0LCBtLCAwLCAmemVyb0Nvb3JkcywgJm5vbnplcm9Db29yZHMpOwogCiAgICAgLy8gdGVzdCBjb2VmZiBhbmQgY29lZmZSZWYKLSAgICBmb3IgKHN0ZDo6c2l6ZV90IGk9MDsgaTx6ZXJvQ29vcmRzLnNpemUoKTsgKytpKQotICAgIHsKLSAgICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggbS5jb2VmZih6ZXJvQ29vcmRzW2ldLngoKSx6ZXJvQ29vcmRzW2ldLnkoKSksIGVwcyApOwotICAgICAgaWYoaW50ZXJuYWw6OmlzX3NhbWU8U3BhcnNlTWF0cml4VHlwZSxTcGFyc2VNYXRyaXg8U2NhbGFyLEZsYWdzPiA+Ojp2YWx1ZSkKLSAgICAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0uY29lZmZSZWYoemVyb0Nvb3Jkc1tpXS54KCksemVyb0Nvb3Jkc1tpXS55KCkpID0gNSApOworICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB6ZXJvQ29vcmRzLnNpemUoKTsgKytpKSB7CisgICAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4obS5jb2VmZih6ZXJvQ29vcmRzW2ldLngoKSwgemVyb0Nvb3Jkc1tpXS55KCkpLCBlcHMpOworICAgICAgaWYgKGludGVybmFsOjppc19zYW1lPFNwYXJzZU1hdHJpeFR5cGUsIFNwYXJzZU1hdHJpeDxTY2FsYXIsIEZsYWdzPj46OnZhbHVlKQorICAgICAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChtLmNvZWZmUmVmKHplcm9Db29yZHNbaV0ueCgpLCB6ZXJvQ29vcmRzW2ldLnkoKSkgPSA1KTsKICAgICB9CiAgICAgVkVSSUZZX0lTX0FQUFJPWChtLCByZWZNYXQpOwogCi0gICAgaWYoIW5vbnplcm9Db29yZHMuZW1wdHkoKSkgeworICAgIGlmICghbm9uemVyb0Nvb3Jkcy5lbXB0eSgpKSB7CiAgICAgICBtLmNvZWZmUmVmKG5vbnplcm9Db29yZHNbMF0ueCgpLCBub256ZXJvQ29vcmRzWzBdLnkoKSkgPSBTY2FsYXIoNSk7CiAgICAgICByZWZNYXQuY29lZmZSZWYobm9uemVyb0Nvb3Jkc1swXS54KCksIG5vbnplcm9Db29yZHNbMF0ueSgpKSA9IFNjYWxhcig1KTsKICAgICB9CiAKICAgICBWRVJJRllfSVNfQVBQUk9YKG0sIHJlZk1hdCk7CiAKLSAgICAgIC8vIHRlc3QgYXNzZXJ0aW9uCi0gICAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggbS5jb2VmZlJlZigtMSwxKSA9IDAgKTsKLSAgICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBtLmNvZWZmUmVmKDAsbS5jb2xzKCkpID0gMCApOwotICAgIH0KKyAgICAvLyB0ZXN0IGFzc2VydGlvbgorICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0uY29lZmZSZWYoLTEsIDEpID0gMCk7CisgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobS5jb2VmZlJlZigwLCBtLmNvbHMoKSkgPSAwKTsKKyAgfQogCi0gICAgLy8gdGVzdCBpbnNlcnQgKGlubmVyIHJhbmRvbSkKLSAgICB7Ci0gICAgICBEZW5zZU1hdHJpeCBtMShyb3dzLGNvbHMpOwotICAgICAgbTEuc2V0WmVybygpOwotICAgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLGNvbHMpOwotICAgICAgYm9vbCBjYWxsX3Jlc2VydmUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oKSUyOwotICAgICAgSW5kZXggbm56ID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsaW50KHJvd3MpLzIpOwotICAgICAgaWYoY2FsbF9yZXNlcnZlKQotICAgICAgewotICAgICAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGludD4oKSUyKQotICAgICAgICAgIG0yLnJlc2VydmUoVmVjdG9yWGk6OkNvbnN0YW50KG0yLm91dGVyU2l6ZSgpLCBpbnQobm56KSkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbTIucmVzZXJ2ZShtMi5vdXRlclNpemUoKSAqIG5ueik7Ci0gICAgICB9Ci0gICAgICBnX3JlYWxsb2NfY291bnQgPSAwOwotICAgICAgZm9yIChJbmRleCBqPTA7IGo8Y29sczsgKytqKQotICAgICAgewotICAgICAgICBmb3IgKEluZGV4IGs9MDsgazxubno7ICsraykKLSAgICAgICAgewotICAgICAgICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7Ci0gICAgICAgICAgaWYgKG0xLmNvZWZmKGksIGopID09IFNjYWxhcigwKSkgewotICAgICAgICAgICAgU2NhbGFyIHYgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKLSAgICAgICAgICAgIGlmICh2ID09IFNjYWxhcigwKSkgdiA9IFNjYWxhcigxKTsKLSAgICAgICAgICAgIG0xKGksIGopID0gdjsKLSAgICAgICAgICAgIG0yLmluc2VydChpLCBqKSA9IHY7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmKGNhbGxfcmVzZXJ2ZSAmJiAhU3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcikKLSAgICAgIHsKLSAgICAgICAgVkVSSUZZKGdfcmVhbGxvY19jb3VudD09MCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFZFUklGWV9JU19BUFBST1gobTIsbTEpOworICAvLyB0ZXN0IGluc2VydCAoaW5uZXIgcmFuZG9tKQorICB7CisgICAgRGVuc2VNYXRyaXggbTEocm93cywgY29scyk7CisgICAgbTEuc2V0WmVybygpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgY29scyk7CisgICAgYm9vbCBjYWxsX3Jlc2VydmUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oKSAlIDI7CisgICAgSW5kZXggbm56ID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIGludChyb3dzKSAvIDIpOworICAgIGlmIChjYWxsX3Jlc2VydmUpIHsKKyAgICAgIGlmIChpbnRlcm5hbDo6cmFuZG9tPGludD4oKSAlIDIpCisgICAgICAgIG0yLnJlc2VydmUoVmVjdG9yWGk6OkNvbnN0YW50KG0yLm91dGVyU2l6ZSgpLCBpbnQobm56KSkpOworICAgICAgZWxzZQorICAgICAgICBtMi5yZXNlcnZlKG0yLm91dGVyU2l6ZSgpICogbm56KTsKICAgICB9Ci0KLSAgICAvLyB0ZXN0IGluc2VydCAoZnVsbHkgcmFuZG9tKQotICAgIHsKLSAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsY29scyk7Ci0gICAgICBtMS5zZXRaZXJvKCk7Ci0gICAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsY29scyk7Ci0gICAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGludD4oKSUyKQotICAgICAgICBtMi5yZXNlcnZlKFZlY3RvclhpOjpDb25zdGFudChtMi5vdXRlclNpemUoKSwgMikpOwotICAgICAgZm9yIChpbnQgaz0wOyBrPHJvd3MqY29sczsgKytrKQotICAgICAgewotICAgICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOwotICAgICAgICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTEpOwotICAgICAgICBpZiAoKG0xLmNvZWZmKGksIGopID09IFNjYWxhcigwKSkgJiYgKGludGVybmFsOjpyYW5kb208aW50PigpICUgMikpIHsKLSAgICAgICAgICBTY2FsYXIgdiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwotICAgICAgICAgIGlmICh2ID09IFNjYWxhcigwKSkgdiA9IFNjYWxhcigxKTsKLSAgICAgICAgICBtMShpLCBqKSA9IHY7Ci0gICAgICAgICAgbTIuaW5zZXJ0KGksIGopID0gdjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBTY2FsYXIgdiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwotICAgICAgICAgIGlmICh2ID09IFNjYWxhcigwKSkgdiA9IFNjYWxhcigxKTsKLSAgICAgICAgICBtMShpLCBqKSA9IHY7Ci0gICAgICAgICAgbTIuY29lZmZSZWYoaSwgaikgPSB2OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLG0xKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gdGVzdCBpbnNlcnQgKHVuLWNvbXByZXNzZWQpCi0gICAgZm9yKGludCBtb2RlPTA7bW9kZTw0OysrbW9kZSkKLSAgICB7Ci0gICAgICBEZW5zZU1hdHJpeCBtMShyb3dzLGNvbHMpOwotICAgICAgbTEuc2V0WmVybygpOwotICAgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLGNvbHMpOwotICAgICAgVmVjdG9yWGkgcihWZWN0b3JYaTo6Q29uc3RhbnQobTIub3V0ZXJTaXplKCksICgobW9kZSUyKT09MCkgPyBpbnQobTIuaW5uZXJTaXplKCkpIDogc3RkOjptYXg8aW50PigxLGludChtMi5pbm5lclNpemUoKSkvOCkpKTsKLSAgICAgIG0yLnJlc2VydmUocik7Ci0gICAgICBmb3IgKEluZGV4IGs9MDsgazxyb3dzKmNvbHM7ICsraykKLSAgICAgIHsKLSAgICAgICAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0xKTsKLSAgICAgICAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsY29scy0xKTsKKyAgICBnX3JlYWxsb2NfY291bnQgPSAwOworICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBjb2xzOyArK2opIHsKKyAgICAgIGZvciAoSW5kZXggayA9IDA7IGsgPCBubno7ICsraykgeworICAgICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cyAtIDEpOwogICAgICAgICBpZiAobTEuY29lZmYoaSwgaikgPT0gU2NhbGFyKDApKSB7CiAgICAgICAgICAgU2NhbGFyIHYgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKICAgICAgICAgICBpZiAodiA9PSBTY2FsYXIoMCkpIHYgPSBTY2FsYXIoMSk7CiAgICAgICAgICAgbTEoaSwgaikgPSB2OwogICAgICAgICAgIG0yLmluc2VydChpLCBqKSA9IHY7CiAgICAgICAgIH0KLSAgICAgICAgaWYobW9kZT09MykKLSAgICAgICAgICBtMi5yZXNlcnZlKHIpOwotICAgICAgfQotICAgICAgaWYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KCklMikKLSAgICAgICAgbTIubWFrZUNvbXByZXNzZWQoKTsKLSAgICAgIFZFUklGWV9JU19BUFBST1gobTIsbTEpOwotICAgIH0KLQotICAgIC8vIHRlc3QgcmVtb3ZlT3V0ZXJWZWN0b3JzIC8gaW5zZXJ0RW1wdHlPdXRlclZlY3RvcnMKLSAgICB7Ci0gICAgICBmb3IgKGludCBtb2RlID0gMDsgbW9kZSA8IDQ7IG1vZGUrKykgewotICAgICAgICBDb21wYXRpYmxlRGVuc2VNYXRyaXggbTEocm93cywgY29scyk7Ci0gICAgICAgIG0xLnNldFplcm8oKTsKLSAgICAgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCBjb2xzKTsKLSAgICAgICAgVmVjdG9yPEluZGV4LCBEeW5hbWljPiByZXNlcnZlU2l6ZXMob3V0ZXIpOwotICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgb3V0ZXI7IGorKykgcmVzZXJ2ZVNpemVzKGopID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgaW5uZXIgLSAxKTsKLSAgICAgICAgbTIucmVzZXJ2ZShyZXNlcnZlU2l6ZXMpOwotICAgICAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgb3V0ZXI7IGorKykgewotICAgICAgICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBpbm5lciAtIDEpOwotICAgICAgICAgIFNjYWxhciB2YWwgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKLSAgICAgICAgICBtMS5jb2VmZlJlZkJ5T3V0ZXJJbm5lcihqLCBpKSA9IHZhbDsKLSAgICAgICAgICBtMi5pbnNlcnRCeU91dGVySW5uZXIoaiwgaSkgPSB2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGUgJSAyID09IDApIG0yLm1ha2VDb21wcmVzc2VkKCk7Ci0KLSAgICAgICAgaWYgKG1vZGUgPCAyKSB7Ci0gICAgICAgICAgSW5kZXggbnVtID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgb3V0ZXIgLSAxKTsKLSAgICAgICAgICBJbmRleCBzdGFydCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIG91dGVyIC0gbnVtKTsKLQotICAgICAgICAgIEluZGV4IG5ld1Jvd3MgPSBTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yID8gcm93cyAtIG51bSA6IHJvd3M7Ci0gICAgICAgICAgSW5kZXggbmV3Q29scyA9IFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IgPyBjb2xzIDogY29scyAtIG51bTsKLQotICAgICAgICAgIENvbXBhdGlibGVEZW5zZU1hdHJpeCBtMyhuZXdSb3dzLCBuZXdDb2xzKTsKLSAgICAgICAgICBtMy5zZXRDb25zdGFudChTY2FsYXIoTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpxdWlldF9OYU4oKSkpOwotCi0gICAgICAgICAgaWYgKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpIHsKLSAgICAgICAgICAgIG0zLnRvcFJvd3Moc3RhcnQpID0gbTEudG9wUm93cyhzdGFydCk7Ci0gICAgICAgICAgICBtMy5ib3R0b21Sb3dzKG5ld1Jvd3MgLSBzdGFydCkgPSBtMS5ib3R0b21Sb3dzKG5ld1Jvd3MgLSBzdGFydCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG0zLmxlZnRDb2xzKHN0YXJ0KSA9IG0xLmxlZnRDb2xzKHN0YXJ0KTsKLSAgICAgICAgICAgIG0zLnJpZ2h0Q29scyhuZXdDb2xzIC0gc3RhcnQpID0gbTEucmlnaHRDb2xzKG5ld0NvbHMgLSBzdGFydCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgU3BhcnNlTWF0cml4VHlwZSBtNCA9IG0yOwotICAgICAgICAgIG00LnJlbW92ZU91dGVyVmVjdG9ycyhzdGFydCwgbnVtKTsKLQotICAgICAgICAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChtMywgbTQudG9EZW5zZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBJbmRleCBudW0gPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBvdXRlciAtIDEpOwotICAgICAgICAgIEluZGV4IHN0YXJ0ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgb3V0ZXIgLSAxKTsKLQotICAgICAgICAgIEluZGV4IG5ld1Jvd3MgPSBTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yID8gcm93cyArIG51bSA6IHJvd3M7Ci0gICAgICAgICAgSW5kZXggbmV3Q29scyA9IFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IgPyBjb2xzIDogY29scyArIG51bTsKLQotICAgICAgICAgIENvbXBhdGlibGVEZW5zZU1hdHJpeCBtMyhuZXdSb3dzLCBuZXdDb2xzKTsKLSAgICAgICAgICBtMy5zZXRDb25zdGFudChTY2FsYXIoTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpxdWlldF9OYU4oKSkpOwotCi0gICAgICAgICAgaWYgKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpIHsKLSAgICAgICAgICAgIG0zLnRvcFJvd3Moc3RhcnQpID0gbTEudG9wUm93cyhzdGFydCk7Ci0gICAgICAgICAgICBtMy5taWRkbGVSb3dzKHN0YXJ0LCBudW0pLnNldFplcm8oKTsKLSAgICAgICAgICAgIG0zLmJvdHRvbVJvd3Mocm93cyAtIHN0YXJ0KSA9IG0xLmJvdHRvbVJvd3Mocm93cyAtIHN0YXJ0KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbTMubGVmdENvbHMoc3RhcnQpID0gbTEubGVmdENvbHMoc3RhcnQpOwotICAgICAgICAgICAgbTMubWlkZGxlQ29scyhzdGFydCwgbnVtKS5zZXRaZXJvKCk7Ci0gICAgICAgICAgICBtMy5yaWdodENvbHMoY29scyAtIHN0YXJ0KSA9IG0xLnJpZ2h0Q29scyhjb2xzIC0gc3RhcnQpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFNwYXJzZU1hdHJpeFR5cGUgbTQgPSBtMjsKLSAgICAgICAgICBtNC5pbnNlcnRFbXB0eU91dGVyVmVjdG9ycyhzdGFydCwgbnVtKTsKLQotICAgICAgICAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChtMywgbTQudG9EZW5zZSgpKTsKLSAgICAgICAgfQogICAgICAgfQogICAgIH0KIAorICAgIGlmIChjYWxsX3Jlc2VydmUgJiYgIVNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpIHsKKyAgICAgIFZFUklGWShnX3JlYWxsb2NfY291bnQgPT0gMCk7CisgICAgfQogCi0gICAgLy8gdGVzdCBzb3J0Ci0gICAgaWYgKGlubmVyID4gMSkgewotICAgICAgYm9vbCBTdG9yYWdlT3JkZXJzTWF0Y2ggPSBpbnQoRGVuc2VNYXRyaXg6OklzUm93TWFqb3IpID09IGludChTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKTsKLSAgICAgIERlbnNlTWF0cml4IG0xKHJvd3MsIGNvbHMpOworICAgIFZFUklGWV9JU19BUFBST1gobTIsIG0xKTsKKyAgfQorCisgIC8vIHRlc3QgaW5zZXJ0IChmdWxseSByYW5kb20pCisgIHsKKyAgICBEZW5zZU1hdHJpeCBtMShyb3dzLCBjb2xzKTsKKyAgICBtMS5zZXRaZXJvKCk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCBjb2xzKTsKKyAgICBpZiAoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KCkgJSAyKSBtMi5yZXNlcnZlKFZlY3RvclhpOjpDb25zdGFudChtMi5vdXRlclNpemUoKSwgMikpOworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcm93cyAqIGNvbHM7ICsraykgeworICAgICAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAxKTsKKyAgICAgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CisgICAgICBpZiAoKG0xLmNvZWZmKGksIGopID09IFNjYWxhcigwKSkgJiYgKGludGVybmFsOjpyYW5kb208aW50PigpICUgMikpIHsKKyAgICAgICAgU2NhbGFyIHYgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgICAgICAgaWYgKHYgPT0gU2NhbGFyKDApKSB2ID0gU2NhbGFyKDEpOworICAgICAgICBtMShpLCBqKSA9IHY7CisgICAgICAgIG0yLmluc2VydChpLCBqKSA9IHY7CisgICAgICB9IGVsc2UgeworICAgICAgICBTY2FsYXIgdiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgICAgICBpZiAodiA9PSBTY2FsYXIoMCkpIHYgPSBTY2FsYXIoMSk7CisgICAgICAgIG0xKGksIGopID0gdjsKKyAgICAgICAgbTIuY29lZmZSZWYoaSwgaikgPSB2OworICAgICAgfQorICAgIH0KKyAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMSk7CisgIH0KKworICAvLyB0ZXN0IGluc2VydCAodW4tY29tcHJlc3NlZCkKKyAgZm9yIChpbnQgbW9kZSA9IDA7IG1vZGUgPCA0OyArK21vZGUpIHsKKyAgICBEZW5zZU1hdHJpeCBtMShyb3dzLCBjb2xzKTsKKyAgICBtMS5zZXRaZXJvKCk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCBjb2xzKTsKKyAgICBWZWN0b3JYaSByKFZlY3RvclhpOjpDb25zdGFudChtMi5vdXRlclNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1vZGUgJSAyKSA9PSAwKSA/IGludChtMi5pbm5lclNpemUoKSkgOiBzdGQ6Om1heDxpbnQ+KDEsIGludChtMi5pbm5lclNpemUoKSkgLyA4KSkpOworICAgIG0yLnJlc2VydmUocik7CisgICAgZm9yIChJbmRleCBrID0gMDsgayA8IHJvd3MgKiBjb2xzOyArK2spIHsKKyAgICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMSk7CisgICAgICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scyAtIDEpOworICAgICAgaWYgKG0xLmNvZWZmKGksIGopID09IFNjYWxhcigwKSkgeworICAgICAgICBTY2FsYXIgdiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgICAgICBpZiAodiA9PSBTY2FsYXIoMCkpIHYgPSBTY2FsYXIoMSk7CisgICAgICAgIG0xKGksIGopID0gdjsKKyAgICAgICAgbTIuaW5zZXJ0KGksIGopID0gdjsKKyAgICAgIH0KKyAgICAgIGlmIChtb2RlID09IDMpIG0yLnJlc2VydmUocik7CisgICAgfQorICAgIGlmIChpbnRlcm5hbDo6cmFuZG9tPGludD4oKSAlIDIpIG0yLm1ha2VDb21wcmVzc2VkKCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEpOworICB9CisKKyAgLy8gdGVzdCByZW1vdmVPdXRlclZlY3RvcnMgLyBpbnNlcnRFbXB0eU91dGVyVmVjdG9ycworICB7CisgICAgZm9yIChpbnQgbW9kZSA9IDA7IG1vZGUgPCA0OyBtb2RlKyspIHsKKyAgICAgIENvbXBhdGlibGVEZW5zZU1hdHJpeCBtMShyb3dzLCBjb2xzKTsKICAgICAgIG0xLnNldFplcm8oKTsKICAgICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgY29scyk7Ci0gICAgICAvLyBnZW5lcmF0ZSByYW5kb20gaW5uZXIgaW5kaWNlcyB3aXRoIG5vIHJlcGVhdHMKLSAgICAgIFZlY3RvcjxJbmRleCwgRHluYW1pYz4gaW5uZXJJbmRpY2VzKGlubmVyKTsKLSAgICAgIGlubmVySW5kaWNlcy5zZXRMaW5TcGFjZWQoaW5uZXIsIDAsIGlubmVyIC0gMSk7Ci0gICAgICBzdGQ6OnJhbmRvbV9kZXZpY2UgcmQ7Ci0gICAgICBzdGQ6Om10MTk5MzcgZyhyZCgpKTsKKyAgICAgIFZlY3RvcjxJbmRleCwgRHluYW1pYz4gcmVzZXJ2ZVNpemVzKG91dGVyKTsKKyAgICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBvdXRlcjsgaisrKSByZXNlcnZlU2l6ZXMoaikgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBpbm5lciAtIDEpOworICAgICAgbTIucmVzZXJ2ZShyZXNlcnZlU2l6ZXMpOwogICAgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG91dGVyOyBqKyspIHsKLSAgICAgICAgc3RkOjpzaHVmZmxlKGlubmVySW5kaWNlcy5iZWdpbigpLCBpbm5lckluZGljZXMuZW5kKCksIGcpOwotICAgICAgICBJbmRleCBuemogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigyLCBpbm5lciAvIDIpOwotICAgICAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgbnpqOyBrKyspIHsKLSAgICAgICAgICBJbmRleCBpID0gaW5uZXJJbmRpY2VzW2tdOwotICAgICAgICAgIFNjYWxhciB2YWwgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKLSAgICAgICAgICBtMS5jb2VmZlJlZkJ5T3V0ZXJJbm5lcihTdG9yYWdlT3JkZXJzTWF0Y2ggPyBqIDogaSwgU3RvcmFnZU9yZGVyc01hdGNoID8gaSA6IGopID0gdmFsOwotICAgICAgICAgIG0yLmluc2VydEJ5T3V0ZXJJbm5lcihqLCBpKSA9IHZhbDsKLSAgICAgICAgfQorICAgICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgaW5uZXIgLSAxKTsKKyAgICAgICAgU2NhbGFyIHZhbCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgICAgICBtMS5jb2VmZlJlZkJ5T3V0ZXJJbm5lcihqLCBpKSA9IHZhbDsKKyAgICAgICAgbTIuaW5zZXJ0QnlPdXRlcklubmVyKGosIGkpID0gdmFsOwogICAgICAgfQorICAgICAgaWYgKG1vZGUgJSAyID09IDApIG0yLm1ha2VDb21wcmVzc2VkKCk7CiAKLSAgICAgIFZFUklGWV9JU19BUFBST1gobTIsIG0xKTsKLSAgICAgIC8vIHNvcnQgd3J0IGdyZWF0ZXIKLSAgICAgIG0yLnRlbXBsYXRlIHNvcnRJbm5lckluZGljZXM8c3RkOjpncmVhdGVyPD4+KCk7Ci0gICAgICAvLyB2ZXJpZnkgdGhhdCBhbGwgaW5uZXIgdmVjdG9ycyBhcmUgbm90IHNvcnRlZCB3cnQgbGVzcwotICAgICAgVkVSSUZZX0lTX0VRVUFMKG0yLnRlbXBsYXRlIGlubmVySW5kaWNlc0FyZVNvcnRlZDxzdGQ6Omxlc3M8Pj4oKSwgMCk7Ci0gICAgICAvLyB2ZXJpZnkgdGhhdCBhbGwgaW5uZXIgdmVjdG9ycyBhcmUgc29ydGVkIHdydCBncmVhdGVyCi0gICAgICBWRVJJRllfSVNfRVFVQUwobTIudGVtcGxhdGUgaW5uZXJJbmRpY2VzQXJlU29ydGVkPHN0ZDo6Z3JlYXRlcjw+PigpLCBtMi5vdXRlclNpemUoKSk7Ci0gICAgICAvLyB2ZXJpZnkgdGhhdCBzb3J0IGRvZXMgbm90IGNoYW5nZSBldmFsdWF0aW9uCi0gICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMSk7Ci0gICAgICAvLyBzb3J0IHdydCBsZXNzCi0gICAgICBtMi50ZW1wbGF0ZSBzb3J0SW5uZXJJbmRpY2VzPHN0ZDo6bGVzczw+PigpOwotICAgICAgLy8gdmVyaWZ5IHRoYXQgYWxsIGlubmVyIHZlY3RvcnMgYXJlIHNvcnRlZCB3cnQgbGVzcwotICAgICAgVkVSSUZZX0lTX0VRVUFMKG0yLnRlbXBsYXRlIGlubmVySW5kaWNlc0FyZVNvcnRlZDxzdGQ6Omxlc3M8Pj4oKSwgbTIub3V0ZXJTaXplKCkpOwotICAgICAgLy8gdmVyaWZ5IHRoYXQgYWxsIGlubmVyIHZlY3RvcnMgYXJlIG5vdCBzb3J0ZWQgd3J0IGdyZWF0ZXIKLSAgICAgIFZFUklGWV9JU19FUVVBTChtMi50ZW1wbGF0ZSBpbm5lckluZGljZXNBcmVTb3J0ZWQ8c3RkOjpncmVhdGVyPD4+KCksIDApOwotICAgICAgLy8gdmVyaWZ5IHRoYXQgc29ydCBkb2VzIG5vdCBjaGFuZ2UgZXZhbHVhdGlvbgotICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEpOworICAgICAgaWYgKG1vZGUgPCAyKSB7CisgICAgICAgIEluZGV4IG51bSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIG91dGVyIC0gMSk7CisgICAgICAgIEluZGV4IHN0YXJ0ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgb3V0ZXIgLSBudW0pOwogCi0gICAgICBtMi5tYWtlQ29tcHJlc3NlZCgpOwotICAgICAgLy8gc29ydCB3cnQgZ3JlYXRlcgotICAgICAgbTIudGVtcGxhdGUgc29ydElubmVySW5kaWNlczxzdGQ6OmdyZWF0ZXI8Pj4oKTsKLSAgICAgIC8vIHZlcmlmeSB0aGF0IGFsbCBpbm5lciB2ZWN0b3JzIGFyZSBub3Qgc29ydGVkIHdydCBsZXNzCi0gICAgICBWRVJJRllfSVNfRVFVQUwobTIudGVtcGxhdGUgaW5uZXJJbmRpY2VzQXJlU29ydGVkPHN0ZDo6bGVzczw+PigpLCAwKTsKLSAgICAgIC8vIHZlcmlmeSB0aGF0IGFsbCBpbm5lciB2ZWN0b3JzIGFyZSBzb3J0ZWQgd3J0IGdyZWF0ZXIKLSAgICAgIFZFUklGWV9JU19FUVVBTChtMi50ZW1wbGF0ZSBpbm5lckluZGljZXNBcmVTb3J0ZWQ8c3RkOjpncmVhdGVyPD4+KCksIG0yLm91dGVyU2l6ZSgpKTsKLSAgICAgIC8vIHZlcmlmeSB0aGF0IHNvcnQgZG9lcyBub3QgY2hhbmdlIGV2YWx1YXRpb24KLSAgICAgIFZFUklGWV9JU19BUFBST1gobTIsIG0xKTsKLSAgICAgIC8vIHNvcnQgd3J0IGxlc3MKLSAgICAgIG0yLnRlbXBsYXRlIHNvcnRJbm5lckluZGljZXM8c3RkOjpsZXNzPD4+KCk7Ci0gICAgICAvLyB2ZXJpZnkgdGhhdCBhbGwgaW5uZXIgdmVjdG9ycyBhcmUgc29ydGVkIHdydCBsZXNzCi0gICAgICBWRVJJRllfSVNfRVFVQUwobTIudGVtcGxhdGUgaW5uZXJJbmRpY2VzQXJlU29ydGVkPHN0ZDo6bGVzczw+PigpLCBtMi5vdXRlclNpemUoKSk7Ci0gICAgICAvLyB2ZXJpZnkgdGhhdCBhbGwgaW5uZXIgdmVjdG9ycyBhcmUgbm90IHNvcnRlZCB3cnQgZ3JlYXRlcgotICAgICAgVkVSSUZZX0lTX0VRVUFMKG0yLnRlbXBsYXRlIGlubmVySW5kaWNlc0FyZVNvcnRlZDxzdGQ6OmdyZWF0ZXI8Pj4oKSwgMCk7Ci0gICAgICAvLyB2ZXJpZnkgdGhhdCBzb3J0IGRvZXMgbm90IGNoYW5nZSBldmFsdWF0aW9uCi0gICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMSk7CisgICAgICAgIEluZGV4IG5ld1Jvd3MgPSBTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yID8gcm93cyAtIG51bSA6IHJvd3M7CisgICAgICAgIEluZGV4IG5ld0NvbHMgPSBTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yID8gY29scyA6IGNvbHMgLSBudW07CisKKyAgICAgICAgQ29tcGF0aWJsZURlbnNlTWF0cml4IG0zKG5ld1Jvd3MsIG5ld0NvbHMpOworICAgICAgICBtMy5zZXRDb25zdGFudChTY2FsYXIoTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpxdWlldF9OYU4oKSkpOworCisgICAgICAgIGlmIChTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKSB7CisgICAgICAgICAgbTMudG9wUm93cyhzdGFydCkgPSBtMS50b3BSb3dzKHN0YXJ0KTsKKyAgICAgICAgICBtMy5ib3R0b21Sb3dzKG5ld1Jvd3MgLSBzdGFydCkgPSBtMS5ib3R0b21Sb3dzKG5ld1Jvd3MgLSBzdGFydCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbTMubGVmdENvbHMoc3RhcnQpID0gbTEubGVmdENvbHMoc3RhcnQpOworICAgICAgICAgIG0zLnJpZ2h0Q29scyhuZXdDb2xzIC0gc3RhcnQpID0gbTEucmlnaHRDb2xzKG5ld0NvbHMgLSBzdGFydCk7CisgICAgICAgIH0KKworICAgICAgICBTcGFyc2VNYXRyaXhUeXBlIG00ID0gbTI7CisgICAgICAgIG00LnJlbW92ZU91dGVyVmVjdG9ycyhzdGFydCwgbnVtKTsKKworICAgICAgICBWRVJJRllfSVNfQ1dJU0VfRVFVQUwobTMsIG00LnRvRGVuc2UoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBJbmRleCBudW0gPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBvdXRlciAtIDEpOworICAgICAgICBJbmRleCBzdGFydCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIG91dGVyIC0gMSk7CisKKyAgICAgICAgSW5kZXggbmV3Um93cyA9IFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IgPyByb3dzICsgbnVtIDogcm93czsKKyAgICAgICAgSW5kZXggbmV3Q29scyA9IFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IgPyBjb2xzIDogY29scyArIG51bTsKKworICAgICAgICBDb21wYXRpYmxlRGVuc2VNYXRyaXggbTMobmV3Um93cywgbmV3Q29scyk7CisgICAgICAgIG0zLnNldENvbnN0YW50KFNjYWxhcihOdW1UcmFpdHM8UmVhbFNjYWxhcj46OnF1aWV0X05hTigpKSk7CisKKyAgICAgICAgaWYgKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpIHsKKyAgICAgICAgICBtMy50b3BSb3dzKHN0YXJ0KSA9IG0xLnRvcFJvd3Moc3RhcnQpOworICAgICAgICAgIG0zLm1pZGRsZVJvd3Moc3RhcnQsIG51bSkuc2V0WmVybygpOworICAgICAgICAgIG0zLmJvdHRvbVJvd3Mocm93cyAtIHN0YXJ0KSA9IG0xLmJvdHRvbVJvd3Mocm93cyAtIHN0YXJ0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtMy5sZWZ0Q29scyhzdGFydCkgPSBtMS5sZWZ0Q29scyhzdGFydCk7CisgICAgICAgICAgbTMubWlkZGxlQ29scyhzdGFydCwgbnVtKS5zZXRaZXJvKCk7CisgICAgICAgICAgbTMucmlnaHRDb2xzKGNvbHMgLSBzdGFydCkgPSBtMS5yaWdodENvbHMoY29scyAtIHN0YXJ0KTsKKyAgICAgICAgfQorCisgICAgICAgIFNwYXJzZU1hdHJpeFR5cGUgbTQgPSBtMjsKKyAgICAgICAgbTQuaW5zZXJ0RW1wdHlPdXRlclZlY3RvcnMoc3RhcnQsIG51bSk7CisKKyAgICAgICAgVkVSSUZZX0lTX0NXSVNFX0VRVUFMKG0zLCBtNC50b0RlbnNlKCkpOworICAgICAgfQogICAgIH0KKyAgfQorCisgIC8vIHRlc3Qgc29ydAorICBpZiAoaW5uZXIgPiAxKSB7CisgICAgYm9vbCBTdG9yYWdlT3JkZXJzTWF0Y2ggPSBpbnQoRGVuc2VNYXRyaXg6OklzUm93TWFqb3IpID09IGludChTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKTsKKyAgICBEZW5zZU1hdHJpeCBtMShyb3dzLCBjb2xzKTsKKyAgICBtMS5zZXRaZXJvKCk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCBjb2xzKTsKKyAgICAvLyBnZW5lcmF0ZSByYW5kb20gaW5uZXIgaW5kaWNlcyB3aXRoIG5vIHJlcGVhdHMKKyAgICBWZWN0b3I8SW5kZXgsIER5bmFtaWM+IGlubmVySW5kaWNlcyhpbm5lcik7CisgICAgaW5uZXJJbmRpY2VzLnNldExpblNwYWNlZChpbm5lciwgMCwgaW5uZXIgLSAxKTsKKyAgICBzdGQ6OnJhbmRvbV9kZXZpY2UgcmQ7CisgICAgc3RkOjptdDE5OTM3IGcocmQoKSk7CisgICAgZm9yIChJbmRleCBqID0gMDsgaiA8IG91dGVyOyBqKyspIHsKKyAgICAgIHN0ZDo6c2h1ZmZsZShpbm5lckluZGljZXMuYmVnaW4oKSwgaW5uZXJJbmRpY2VzLmVuZCgpLCBnKTsKKyAgICAgIEluZGV4IG56aiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDIsIGlubmVyIC8gMik7CisgICAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgbnpqOyBrKyspIHsKKyAgICAgICAgSW5kZXggaSA9IGlubmVySW5kaWNlc1trXTsKKyAgICAgICAgU2NhbGFyIHZhbCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOworICAgICAgICBtMS5jb2VmZlJlZkJ5T3V0ZXJJbm5lcihTdG9yYWdlT3JkZXJzTWF0Y2ggPyBqIDogaSwgU3RvcmFnZU9yZGVyc01hdGNoID8gaSA6IGopID0gdmFsOworICAgICAgICBtMi5pbnNlcnRCeU91dGVySW5uZXIoaiwgaSkgPSB2YWw7CisgICAgICB9CisgICAgfQorCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEpOworICAgIC8vIHNvcnQgd3J0IGdyZWF0ZXIKKyAgICBtMi50ZW1wbGF0ZSBzb3J0SW5uZXJJbmRpY2VzPHN0ZDo6Z3JlYXRlcjw+PigpOworICAgIC8vIHZlcmlmeSB0aGF0IGFsbCBpbm5lciB2ZWN0b3JzIGFyZSBub3Qgc29ydGVkIHdydCBsZXNzCisgICAgVkVSSUZZX0lTX0VRVUFMKG0yLnRlbXBsYXRlIGlubmVySW5kaWNlc0FyZVNvcnRlZDxzdGQ6Omxlc3M8Pj4oKSwgMCk7CisgICAgLy8gdmVyaWZ5IHRoYXQgYWxsIGlubmVyIHZlY3RvcnMgYXJlIHNvcnRlZCB3cnQgZ3JlYXRlcgorICAgIFZFUklGWV9JU19FUVVBTChtMi50ZW1wbGF0ZSBpbm5lckluZGljZXNBcmVTb3J0ZWQ8c3RkOjpncmVhdGVyPD4+KCksIG0yLm91dGVyU2l6ZSgpKTsKKyAgICAvLyB2ZXJpZnkgdGhhdCBzb3J0IGRvZXMgbm90IGNoYW5nZSBldmFsdWF0aW9uCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEpOworICAgIC8vIHNvcnQgd3J0IGxlc3MKKyAgICBtMi50ZW1wbGF0ZSBzb3J0SW5uZXJJbmRpY2VzPHN0ZDo6bGVzczw+PigpOworICAgIC8vIHZlcmlmeSB0aGF0IGFsbCBpbm5lciB2ZWN0b3JzIGFyZSBzb3J0ZWQgd3J0IGxlc3MKKyAgICBWRVJJRllfSVNfRVFVQUwobTIudGVtcGxhdGUgaW5uZXJJbmRpY2VzQXJlU29ydGVkPHN0ZDo6bGVzczw+PigpLCBtMi5vdXRlclNpemUoKSk7CisgICAgLy8gdmVyaWZ5IHRoYXQgYWxsIGlubmVyIHZlY3RvcnMgYXJlIG5vdCBzb3J0ZWQgd3J0IGdyZWF0ZXIKKyAgICBWRVJJRllfSVNfRVFVQUwobTIudGVtcGxhdGUgaW5uZXJJbmRpY2VzQXJlU29ydGVkPHN0ZDo6Z3JlYXRlcjw+PigpLCAwKTsKKyAgICAvLyB2ZXJpZnkgdGhhdCBzb3J0IGRvZXMgbm90IGNoYW5nZSBldmFsdWF0aW9uCisgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTEpOworCisgICAgbTIubWFrZUNvbXByZXNzZWQoKTsKKyAgICAvLyBzb3J0IHdydCBncmVhdGVyCisgICAgbTIudGVtcGxhdGUgc29ydElubmVySW5kaWNlczxzdGQ6OmdyZWF0ZXI8Pj4oKTsKKyAgICAvLyB2ZXJpZnkgdGhhdCBhbGwgaW5uZXIgdmVjdG9ycyBhcmUgbm90IHNvcnRlZCB3cnQgbGVzcworICAgIFZFUklGWV9JU19FUVVBTChtMi50ZW1wbGF0ZSBpbm5lckluZGljZXNBcmVTb3J0ZWQ8c3RkOjpsZXNzPD4+KCksIDApOworICAgIC8vIHZlcmlmeSB0aGF0IGFsbCBpbm5lciB2ZWN0b3JzIGFyZSBzb3J0ZWQgd3J0IGdyZWF0ZXIKKyAgICBWRVJJRllfSVNfRVFVQUwobTIudGVtcGxhdGUgaW5uZXJJbmRpY2VzQXJlU29ydGVkPHN0ZDo6Z3JlYXRlcjw+PigpLCBtMi5vdXRlclNpemUoKSk7CisgICAgLy8gdmVyaWZ5IHRoYXQgc29ydCBkb2VzIG5vdCBjaGFuZ2UgZXZhbHVhdGlvbgorICAgIFZFUklGWV9JU19BUFBST1gobTIsIG0xKTsKKyAgICAvLyBzb3J0IHdydCBsZXNzCisgICAgbTIudGVtcGxhdGUgc29ydElubmVySW5kaWNlczxzdGQ6Omxlc3M8Pj4oKTsKKyAgICAvLyB2ZXJpZnkgdGhhdCBhbGwgaW5uZXIgdmVjdG9ycyBhcmUgc29ydGVkIHdydCBsZXNzCisgICAgVkVSSUZZX0lTX0VRVUFMKG0yLnRlbXBsYXRlIGlubmVySW5kaWNlc0FyZVNvcnRlZDxzdGQ6Omxlc3M8Pj4oKSwgbTIub3V0ZXJTaXplKCkpOworICAgIC8vIHZlcmlmeSB0aGF0IGFsbCBpbm5lciB2ZWN0b3JzIGFyZSBub3Qgc29ydGVkIHdydCBncmVhdGVyCisgICAgVkVSSUZZX0lTX0VRVUFMKG0yLnRlbXBsYXRlIGlubmVySW5kaWNlc0FyZVNvcnRlZDxzdGQ6OmdyZWF0ZXI8Pj4oKSwgMCk7CisgICAgLy8gdmVyaWZ5IHRoYXQgc29ydCBkb2VzIG5vdCBjaGFuZ2UgZXZhbHVhdGlvbgorICAgIFZFUklGWV9JU19BUFBST1gobTIsIG0xKTsKKyAgfQogCiAgIC8vIHRlc3QgYmFzaWMgY29tcHV0YXRpb25zCiAgIHsKQEAgLTMwNSwyOSArMjkyLDI4IEBACiAgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk0zLCBtMyk7CiAgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk00LCBtNCk7CiAKLSAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpCi0gICAgICBtMS5tYWtlQ29tcHJlc3NlZCgpOworICAgIGlmIChpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpIG0xLm1ha2VDb21wcmVzc2VkKCk7CiAKICAgICBJbmRleCBtMV9ubnogPSBtMS5ub25aZXJvcygpOwogCi0gICAgVkVSSUZZX0lTX0FQUFJPWChtMSpzMSwgcmVmTTEqczEpOwotICAgIFZFUklGWV9JU19BUFBST1gobTErbTIsIHJlZk0xK3JlZk0yKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0xK20yK20zLCByZWZNMStyZWZNMityZWZNMyk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtMy5jd2lzZVByb2R1Y3QobTErbTIpLCByZWZNMy5jd2lzZVByb2R1Y3QocmVmTTErcmVmTTIpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0xKnMxLW0yLCByZWZNMSpzMS1yZWZNMik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtND1tMS9zMSwgcmVmTTEvczEpOworICAgIFZFUklGWV9JU19BUFBST1gobTEgKiBzMSwgcmVmTTEgKiBzMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSArIG0yLCByZWZNMSArIHJlZk0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xICsgbTIgKyBtMywgcmVmTTEgKyByZWZNMiArIHJlZk0zKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zLmN3aXNlUHJvZHVjdChtMSArIG0yKSwgcmVmTTMuY3dpc2VQcm9kdWN0KHJlZk0xICsgcmVmTTIpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xICogczEgLSBtMiwgcmVmTTEgKiBzMSAtIHJlZk0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTEgLyBzMSwgcmVmTTEgLyBzMSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKG00Lm5vblplcm9zKCksIG0xX25ueik7CiAKLSAgICBpZihTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQorICAgIGlmIChTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQogICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMS5pbm5lclZlY3RvcigwKS5kb3QocmVmTTIucm93KDApKSwgcmVmTTEucm93KDApLmRvdChyZWZNMi5yb3coMCkpKTsKICAgICBlbHNlCiAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmlubmVyVmVjdG9yKDApLmRvdChyZWZNMi5jb2woMCkpLCByZWZNMS5jb2woMCkuZG90KHJlZk0yLmNvbCgwKSkpOwogCiAgICAgRGVuc2VWZWN0b3IgcnYgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKG0xLmNvbHMoKSk7CiAgICAgRGVuc2VWZWN0b3IgY3YgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKG0xLnJvd3MoKSk7Ci0gICAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsbTEucm93cygpLTIpOwotICAgIEluZGV4IGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0xLmNvbHMoKS0xKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKCggbTEudGVtcGxhdGUgYmxvY2s8MSxEeW5hbWljPihyLDAsMSxtMS5jb2xzKCkpLmRvdChydikpICwgcmVmTTEucm93KHIpLmRvdChydikpOworICAgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBtMS5yb3dzKCkgLSAyKTsKKyAgICBJbmRleCBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgbTEuY29scygpIC0gMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgobTEudGVtcGxhdGUgYmxvY2s8MSwgRHluYW1pYz4ociwgMCwgMSwgbTEuY29scygpKS5kb3QocnYpKSwgcmVmTTEucm93KHIpLmRvdChydikpOwogICAgIFZFUklGWV9JU19BUFBST1gobTEucm93KHIpLmRvdChydiksIHJlZk0xLnJvdyhyKS5kb3QocnYpKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvbChjKS5kb3QoY3YpLCByZWZNMS5jb2woYykuZG90KGN2KSk7CiAKQEAgLTMzOSw4NyArMzI1LDExOCBAQAogICAgIFZFUklGWV9JU19BUFBST1gobTMuY3dpc2VQcm9kdWN0KHJlZk00KSwgcmVmTTMuY3dpc2VQcm9kdWN0KHJlZk00KSk7CiAgICAgLy8gZGVuc2UgY3dpc2UqIHNwYXJzZQogICAgIFZFUklGWV9JU19BUFBST1gocmVmTTQuY3dpc2VQcm9kdWN0KG0zKSwgcmVmTTQuY3dpc2VQcm9kdWN0KHJlZk0zKSk7Ci0vLyAgICAgVkVSSUZZX0lTX0FQUFJPWChtMy5jd2lzZSgpL3JlZk00LCByZWZNMy5jd2lzZSgpL3JlZk00KTsKKyAgICAvLyAgICAgVkVSSUZZX0lTX0FQUFJPWChtMy5jd2lzZSgpL3JlZk00LCByZWZNMy5jd2lzZSgpL3JlZk00KTsKIAogICAgIC8vIG1peGVkIHNwYXJzZS1kZW5zZQogICAgIFZFUklGWV9JU19BUFBST1gocmVmTTQgKyBtMywgcmVmTTQgKyByZWZNMyk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChtMyArIHJlZk00LCByZWZNMyArIHJlZk00KTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk00IC0gbTMsIHJlZk00IC0gcmVmTTMpOwogICAgIFZFUklGWV9JU19BUFBST1gobTMgLSByZWZNNCwgcmVmTTMgLSByZWZNNCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgoUmVhbFNjYWxhcigwLjUpKnJlZk00ICsgUmVhbFNjYWxhcigwLjUpKm0zKS5ldmFsKCksIFJlYWxTY2FsYXIoMC41KSpyZWZNNCArIFJlYWxTY2FsYXIoMC41KSpyZWZNMyk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgoUmVhbFNjYWxhcigwLjUpKnJlZk00ICsgbTMqUmVhbFNjYWxhcigwLjUpKS5ldmFsKCksIFJlYWxTY2FsYXIoMC41KSpyZWZNNCArIFJlYWxTY2FsYXIoMC41KSpyZWZNMyk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgoUmVhbFNjYWxhcigwLjUpKnJlZk00ICsgbTMuY3dpc2VQcm9kdWN0KG0zKSkuZXZhbCgpLCBSZWFsU2NhbGFyKDAuNSkqcmVmTTQgKyByZWZNMy5jd2lzZVByb2R1Y3QocmVmTTMpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChSZWFsU2NhbGFyKDAuNSkgKiByZWZNNCArIFJlYWxTY2FsYXIoMC41KSAqIG0zKS5ldmFsKCksCisgICAgICAgICAgICAgICAgICAgICBSZWFsU2NhbGFyKDAuNSkgKiByZWZNNCArIFJlYWxTY2FsYXIoMC41KSAqIHJlZk0zKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChSZWFsU2NhbGFyKDAuNSkgKiByZWZNNCArIG0zICogUmVhbFNjYWxhcigwLjUpKS5ldmFsKCksCisgICAgICAgICAgICAgICAgICAgICBSZWFsU2NhbGFyKDAuNSkgKiByZWZNNCArIFJlYWxTY2FsYXIoMC41KSAqIHJlZk0zKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChSZWFsU2NhbGFyKDAuNSkgKiByZWZNNCArIG0zLmN3aXNlUHJvZHVjdChtMykpLmV2YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgIFJlYWxTY2FsYXIoMC41KSAqIHJlZk00ICsgcmVmTTMuY3dpc2VQcm9kdWN0KHJlZk0zKSk7CiAKLSAgICBWRVJJRllfSVNfQVBQUk9YKChSZWFsU2NhbGFyKDAuNSkqcmVmTTQgKyBSZWFsU2NhbGFyKDAuNSkqbTMpLmV2YWwoKSwgUmVhbFNjYWxhcigwLjUpKnJlZk00ICsgUmVhbFNjYWxhcigwLjUpKnJlZk0zKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKChSZWFsU2NhbGFyKDAuNSkqcmVmTTQgKyBtMypSZWFsU2NhbGFyKDAuNSkpLmV2YWwoKSwgUmVhbFNjYWxhcigwLjUpKnJlZk00ICsgUmVhbFNjYWxhcigwLjUpKnJlZk0zKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKChSZWFsU2NhbGFyKDAuNSkqcmVmTTQgKyAobTMrbTMpKS5ldmFsKCksIFJlYWxTY2FsYXIoMC41KSpyZWZNNCArIChyZWZNMytyZWZNMykpOwotICAgIFZFUklGWV9JU19BUFBST1goKChyZWZNMyttMykrUmVhbFNjYWxhcigwLjUpKm0zKS5ldmFsKCksIFJlYWxTY2FsYXIoMC41KSpyZWZNMyArIChyZWZNMytyZWZNMykpOwotICAgIFZFUklGWV9JU19BUFBST1goKFJlYWxTY2FsYXIoMC41KSpyZWZNNCArIChyZWZNMyttMykpLmV2YWwoKSwgUmVhbFNjYWxhcigwLjUpKnJlZk00ICsgKHJlZk0zK3JlZk0zKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgoUmVhbFNjYWxhcigwLjUpKnJlZk00ICsgKG0zK3JlZk0zKSkuZXZhbCgpLCBSZWFsU2NhbGFyKDAuNSkqcmVmTTQgKyAocmVmTTMrcmVmTTMpKTsKLQorICAgIFZFUklGWV9JU19BUFBST1goKFJlYWxTY2FsYXIoMC41KSAqIHJlZk00ICsgUmVhbFNjYWxhcigwLjUpICogbTMpLmV2YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgIFJlYWxTY2FsYXIoMC41KSAqIHJlZk00ICsgUmVhbFNjYWxhcigwLjUpICogcmVmTTMpOworICAgIFZFUklGWV9JU19BUFBST1goKFJlYWxTY2FsYXIoMC41KSAqIHJlZk00ICsgbTMgKiBSZWFsU2NhbGFyKDAuNSkpLmV2YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgIFJlYWxTY2FsYXIoMC41KSAqIHJlZk00ICsgUmVhbFNjYWxhcigwLjUpICogcmVmTTMpOworICAgIFZFUklGWV9JU19BUFBST1goKFJlYWxTY2FsYXIoMC41KSAqIHJlZk00ICsgKG0zICsgbTMpKS5ldmFsKCksIFJlYWxTY2FsYXIoMC41KSAqIHJlZk00ICsgKHJlZk0zICsgcmVmTTMpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKCgocmVmTTMgKyBtMykgKyBSZWFsU2NhbGFyKDAuNSkgKiBtMykuZXZhbCgpLCBSZWFsU2NhbGFyKDAuNSkgKiByZWZNMyArIChyZWZNMyArIHJlZk0zKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgoUmVhbFNjYWxhcigwLjUpICogcmVmTTQgKyAocmVmTTMgKyBtMykpLmV2YWwoKSwgUmVhbFNjYWxhcigwLjUpICogcmVmTTQgKyAocmVmTTMgKyByZWZNMykpOworICAgIFZFUklGWV9JU19BUFBST1goKFJlYWxTY2FsYXIoMC41KSAqIHJlZk00ICsgKG0zICsgcmVmTTMpKS5ldmFsKCksIFJlYWxTY2FsYXIoMC41KSAqIHJlZk00ICsgKHJlZk0zICsgcmVmTTMpKTsKIAogICAgIFZFUklGWV9JU19BUFBST1gobTEuc3VtKCksIHJlZk0xLnN1bSgpKTsKIAotICAgIG00ID0gbTE7IHJlZk00ID0gbTQ7CisgICAgbTQgPSBtMTsKKyAgICByZWZNNCA9IG00OwogCi0gICAgVkVSSUZZX0lTX0FQUFJPWChtMSo9czEsIHJlZk0xKj1zMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMSAqPSBzMSwgcmVmTTEgKj0gczEpOwogICAgIFZFUklGWV9JU19FUVVBTChtMS5ub25aZXJvcygpLCBtMV9ubnopOwotICAgIFZFUklGWV9JU19BUFBST1gobTEvPXMxLCByZWZNMS89czEpOworICAgIFZFUklGWV9JU19BUFBST1gobTEgLz0gczEsIHJlZk0xIC89IHMxKTsKICAgICBWRVJJRllfSVNfRVFVQUwobTEubm9uWmVyb3MoKSwgbTFfbm56KTsKIAotICAgIFZFUklGWV9JU19BUFBST1gobTErPW0yLCByZWZNMSs9cmVmTTIpOwotICAgIFZFUklGWV9JU19BUFBST1gobTEtPW0yLCByZWZNMS09cmVmTTIpOworICAgIFZFUklGWV9JU19BUFBST1gobTEgKz0gbTIsIHJlZk0xICs9IHJlZk0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0xIC09IG0yLCByZWZNMSAtPSByZWZNMik7CiAKICAgICByZWZNMyA9IHJlZk0xOwotICAgIAotICAgIFZFUklGWV9JU19BUFBST1gocmVmTTErPW0yLCByZWZNMys9cmVmTTIpOwotICAgIFZFUklGWV9JU19BUFBST1gocmVmTTEtPW0yLCByZWZNMy09cmVmTTIpOwogCi0gICAgZ19kZW5zZV9vcF9zcGFyc2VfY291bnQ9MDsgVkVSSUZZX0lTX0FQUFJPWChyZWZNMSA9bTIrcmVmTTQsIHJlZk0zID1yZWZNMityZWZNNCk7ICBWRVJJRllfSVNfRVFVQUwoZ19kZW5zZV9vcF9zcGFyc2VfY291bnQsMTApOwotICAgIGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50PTA7IFZFUklGWV9JU19BUFBST1gocmVmTTErPW0yK3JlZk00LCByZWZNMys9cmVmTTIrcmVmTTQpOyAgVkVSSUZZX0lTX0VRVUFMKGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50LDEpOwotICAgIGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50PTA7IFZFUklGWV9JU19BUFBST1gocmVmTTEtPW0yK3JlZk00LCByZWZNMy09cmVmTTIrcmVmTTQpOyAgVkVSSUZZX0lTX0VRVUFMKGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50LDEpOwotICAgIGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50PTA7IFZFUklGWV9JU19BUFBST1gocmVmTTEgPXJlZk00K20yLCByZWZNMyA9cmVmTTIrcmVmTTQpOyAgVkVSSUZZX0lTX0VRVUFMKGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50LDEpOwotICAgIGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50PTA7IFZFUklGWV9JU19BUFBST1gocmVmTTErPXJlZk00K20yLCByZWZNMys9cmVmTTIrcmVmTTQpOyAgVkVSSUZZX0lTX0VRVUFMKGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50LDEpOwotICAgIGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50PTA7IFZFUklGWV9JU19BUFBST1gocmVmTTEtPXJlZk00K20yLCByZWZNMy09cmVmTTIrcmVmTTQpOyAgVkVSSUZZX0lTX0VRVUFMKGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50LDEpOworICAgIFZFUklGWV9JU19BUFBST1gocmVmTTEgKz0gbTIsIHJlZk0zICs9IHJlZk0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk0xIC09IG0yLCByZWZNMyAtPSByZWZNMik7CiAKLSAgICBnX2RlbnNlX29wX3NwYXJzZV9jb3VudD0wOyBWRVJJRllfSVNfQVBQUk9YKHJlZk0xID1tMi1yZWZNNCwgcmVmTTMgPXJlZk0yLXJlZk00KTsgIFZFUklGWV9JU19FUVVBTChnX2RlbnNlX29wX3NwYXJzZV9jb3VudCwyMCk7Ci0gICAgZ19kZW5zZV9vcF9zcGFyc2VfY291bnQ9MDsgVkVSSUZZX0lTX0FQUFJPWChyZWZNMSs9bTItcmVmTTQsIHJlZk0zKz1yZWZNMi1yZWZNNCk7ICBWRVJJRllfSVNfRVFVQUwoZ19kZW5zZV9vcF9zcGFyc2VfY291bnQsMSk7Ci0gICAgZ19kZW5zZV9vcF9zcGFyc2VfY291bnQ9MDsgVkVSSUZZX0lTX0FQUFJPWChyZWZNMS09bTItcmVmTTQsIHJlZk0zLT1yZWZNMi1yZWZNNCk7ICBWRVJJRllfSVNfRVFVQUwoZ19kZW5zZV9vcF9zcGFyc2VfY291bnQsMSk7Ci0gICAgZ19kZW5zZV9vcF9zcGFyc2VfY291bnQ9MDsgVkVSSUZZX0lTX0FQUFJPWChyZWZNMSA9cmVmTTQtbTIsIHJlZk0zID1yZWZNNC1yZWZNMik7ICBWRVJJRllfSVNfRVFVQUwoZ19kZW5zZV9vcF9zcGFyc2VfY291bnQsMSk7Ci0gICAgZ19kZW5zZV9vcF9zcGFyc2VfY291bnQ9MDsgVkVSSUZZX0lTX0FQUFJPWChyZWZNMSs9cmVmTTQtbTIsIHJlZk0zKz1yZWZNNC1yZWZNMik7ICBWRVJJRllfSVNfRVFVQUwoZ19kZW5zZV9vcF9zcGFyc2VfY291bnQsMSk7Ci0gICAgZ19kZW5zZV9vcF9zcGFyc2VfY291bnQ9MDsgVkVSSUZZX0lTX0FQUFJPWChyZWZNMS09cmVmTTQtbTIsIHJlZk0zLT1yZWZNNC1yZWZNMik7ICBWRVJJRllfSVNfRVFVQUwoZ19kZW5zZV9vcF9zcGFyc2VfY291bnQsMSk7CisgICAgZ19kZW5zZV9vcF9zcGFyc2VfY291bnQgPSAwOworICAgIFZFUklGWV9JU19BUFBST1gocmVmTTEgPSBtMiArIHJlZk00LCByZWZNMyA9IHJlZk0yICsgcmVmTTQpOworICAgIFZFUklGWV9JU19FUVVBTChnX2RlbnNlX29wX3NwYXJzZV9jb3VudCwgMTApOworICAgIGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50ID0gMDsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk0xICs9IG0yICsgcmVmTTQsIHJlZk0zICs9IHJlZk0yICsgcmVmTTQpOworICAgIFZFUklGWV9JU19FUVVBTChnX2RlbnNlX29wX3NwYXJzZV9jb3VudCwgMSk7CisgICAgZ19kZW5zZV9vcF9zcGFyc2VfY291bnQgPSAwOworICAgIFZFUklGWV9JU19BUFBST1gocmVmTTEgLT0gbTIgKyByZWZNNCwgcmVmTTMgLT0gcmVmTTIgKyByZWZNNCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50LCAxKTsKKyAgICBnX2RlbnNlX29wX3NwYXJzZV9jb3VudCA9IDA7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNMSA9IHJlZk00ICsgbTIsIHJlZk0zID0gcmVmTTIgKyByZWZNNCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50LCAxKTsKKyAgICBnX2RlbnNlX29wX3NwYXJzZV9jb3VudCA9IDA7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNMSArPSByZWZNNCArIG0yLCByZWZNMyArPSByZWZNMiArIHJlZk00KTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZ19kZW5zZV9vcF9zcGFyc2VfY291bnQsIDEpOworICAgIGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50ID0gMDsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk0xIC09IHJlZk00ICsgbTIsIHJlZk0zIC09IHJlZk0yICsgcmVmTTQpOworICAgIFZFUklGWV9JU19FUVVBTChnX2RlbnNlX29wX3NwYXJzZV9jb3VudCwgMSk7CisKKyAgICBnX2RlbnNlX29wX3NwYXJzZV9jb3VudCA9IDA7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNMSA9IG0yIC0gcmVmTTQsIHJlZk0zID0gcmVmTTIgLSByZWZNNCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50LCAyMCk7CisgICAgZ19kZW5zZV9vcF9zcGFyc2VfY291bnQgPSAwOworICAgIFZFUklGWV9JU19BUFBST1gocmVmTTEgKz0gbTIgLSByZWZNNCwgcmVmTTMgKz0gcmVmTTIgLSByZWZNNCk7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50LCAxKTsKKyAgICBnX2RlbnNlX29wX3NwYXJzZV9jb3VudCA9IDA7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNMSAtPSBtMiAtIHJlZk00LCByZWZNMyAtPSByZWZNMiAtIHJlZk00KTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZ19kZW5zZV9vcF9zcGFyc2VfY291bnQsIDEpOworICAgIGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50ID0gMDsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk0xID0gcmVmTTQgLSBtMiwgcmVmTTMgPSByZWZNNCAtIHJlZk0yKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZ19kZW5zZV9vcF9zcGFyc2VfY291bnQsIDEpOworICAgIGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50ID0gMDsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk0xICs9IHJlZk00IC0gbTIsIHJlZk0zICs9IHJlZk00IC0gcmVmTTIpOworICAgIFZFUklGWV9JU19FUVVBTChnX2RlbnNlX29wX3NwYXJzZV9jb3VudCwgMSk7CisgICAgZ19kZW5zZV9vcF9zcGFyc2VfY291bnQgPSAwOworICAgIFZFUklGWV9JU19BUFBST1gocmVmTTEgLT0gcmVmTTQgLSBtMiwgcmVmTTMgLT0gcmVmTTQgLSByZWZNMik7CisgICAgVkVSSUZZX0lTX0VRVUFMKGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50LCAxKTsKICAgICByZWZNMyA9IG0zOwogCi0gICAgaWYgKHJvd3M+PTIgJiYgY29scz49MikKLSAgICB7Ci0gICAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggbTEgKz0gbTEuaW5uZXJWZWN0b3IoMCkgKTsKLSAgICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBtMSAtPSBtMS5pbm5lclZlY3RvcigwKSApOwotICAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIHJlZk0xIC09IG0xLmlubmVyVmVjdG9yKDApICk7Ci0gICAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggcmVmTTEgKz0gbTEuaW5uZXJWZWN0b3IoMCkgKTsKKyAgICBpZiAocm93cyA+PSAyICYmIGNvbHMgPj0gMikgeworICAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEgKz0gbTEuaW5uZXJWZWN0b3IoMCkpOworICAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEgLT0gbTEuaW5uZXJWZWN0b3IoMCkpOworICAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQocmVmTTEgLT0gbTEuaW5uZXJWZWN0b3IoMCkpOworICAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQocmVmTTEgKz0gbTEuaW5uZXJWZWN0b3IoMCkpOwogICAgIH0KLSAgICBtMSA9IG00OyByZWZNMSA9IHJlZk00OworICAgIG0xID0gbTQ7CisgICAgcmVmTTEgPSByZWZNNDsKIAogICAgIC8vIHRlc3QgYWxpYXNpbmcKICAgICBWRVJJRllfSVNfQVBQUk9YKChtMSA9IC1tMSksIChyZWZNMSA9IC1yZWZNMSkpOwogICAgIFZFUklGWV9JU19FUVVBTChtMS5ub25aZXJvcygpLCBtMV9ubnopOwotICAgIG0xID0gbTQ7IHJlZk0xID0gcmVmTTQ7CisgICAgbTEgPSBtNDsKKyAgICByZWZNMSA9IHJlZk00OwogICAgIFZFUklGWV9JU19BUFBST1goKG0xID0gbTEudHJhbnNwb3NlKCkpLCAocmVmTTEgPSByZWZNMS50cmFuc3Bvc2UoKS5ldmFsKCkpKTsKICAgICBWRVJJRllfSVNfRVFVQUwobTEubm9uWmVyb3MoKSwgbTFfbm56KTsKLSAgICBtMSA9IG00OyByZWZNMSA9IHJlZk00OworICAgIG0xID0gbTQ7CisgICAgcmVmTTEgPSByZWZNNDsKICAgICBWRVJJRllfSVNfQVBQUk9YKChtMSA9IC1tMS50cmFuc3Bvc2UoKSksIChyZWZNMSA9IC1yZWZNMS50cmFuc3Bvc2UoKS5ldmFsKCkpKTsKICAgICBWRVJJRllfSVNfRVFVQUwobTEubm9uWmVyb3MoKSwgbTFfbm56KTsKLSAgICBtMSA9IG00OyByZWZNMSA9IHJlZk00OworICAgIG0xID0gbTQ7CisgICAgcmVmTTEgPSByZWZNNDsKICAgICBWRVJJRllfSVNfQVBQUk9YKChtMSArPSAtbTEpLCAocmVmTTEgKz0gLXJlZk0xKSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKG0xLm5vblplcm9zKCksIG0xX25ueik7Ci0gICAgbTEgPSBtNDsgcmVmTTEgPSByZWZNNDsKKyAgICBtMSA9IG00OworICAgIHJlZk0xID0gcmVmTTQ7CiAKLSAgICBpZihtMS5pc0NvbXByZXNzZWQoKSkKLSAgICB7CisgICAgaWYgKG0xLmlzQ29tcHJlc3NlZCgpKSB7CiAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmNvZWZmcygpLnN1bSgpLCBtMS5zdW0oKSk7CiAgICAgICBtMS5jb2VmZnMoKSArPSBzMTsKLSAgICAgIGZvcihJbmRleCBqID0gMDsgajxtMS5vdXRlclNpemUoKTsgKytqKQotICAgICAgICBmb3IodHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBpdChtMSxqKTsgaXQ7ICsraXQpCi0gICAgICAgICAgcmVmTTEoaXQucm93KCksIGl0LmNvbCgpKSArPSBzMTsKKyAgICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBtMS5vdXRlclNpemUoKTsgKytqKQorICAgICAgICBmb3IgKHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQobTEsIGopOyBpdDsgKytpdCkgcmVmTTEoaXQucm93KCksIGl0LmNvbCgpKSArPSBzMTsKICAgICAgIFZFUklGWV9JU19BUFBST1gobTEsIHJlZk0xKTsKICAgICB9CiAKQEAgLTQyOSwxMiArNDQ2LDE0IEBACiAgICAgICBTcEJvb2wgbWIxID0gbTEucmVhbCgpLnRlbXBsYXRlIGNhc3Q8Ym9vbD4oKTsKICAgICAgIFNwQm9vbCBtYjIgPSBtMi5yZWFsKCkudGVtcGxhdGUgY2FzdDxib29sPigpOwogICAgICAgVkVSSUZZX0lTX0VRVUFMKG1iMS50ZW1wbGF0ZSBjYXN0PGludD4oKS5zdW0oKSwgcmVmTTEucmVhbCgpLnRlbXBsYXRlIGNhc3Q8Ym9vbD4oKS5jb3VudCgpKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTCgobWIxICYmIG1iMikudGVtcGxhdGUgY2FzdDxpbnQ+KCkuc3VtKCksIChyZWZNMS5yZWFsKCkudGVtcGxhdGUgY2FzdDxib29sPigpICYmIHJlZk0yLnJlYWwoKS50ZW1wbGF0ZSBjYXN0PGJvb2w+KCkpLmNvdW50KCkpOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKChtYjEgfHwgbWIyKS50ZW1wbGF0ZSBjYXN0PGludD4oKS5zdW0oKSwgKHJlZk0xLnJlYWwoKS50ZW1wbGF0ZSBjYXN0PGJvb2w+KCkgfHwgcmVmTTIucmVhbCgpLnRlbXBsYXRlIGNhc3Q8Ym9vbD4oKSkuY291bnQoKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoKG1iMSAmJiBtYjIpLnRlbXBsYXRlIGNhc3Q8aW50PigpLnN1bSgpLAorICAgICAgICAgICAgICAgICAgICAgIChyZWZNMS5yZWFsKCkudGVtcGxhdGUgY2FzdDxib29sPigpICYmIHJlZk0yLnJlYWwoKS50ZW1wbGF0ZSBjYXN0PGJvb2w+KCkpLmNvdW50KCkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKChtYjEgfHwgbWIyKS50ZW1wbGF0ZSBjYXN0PGludD4oKS5zdW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAocmVmTTEucmVhbCgpLnRlbXBsYXRlIGNhc3Q8Ym9vbD4oKSB8fCByZWZNMi5yZWFsKCkudGVtcGxhdGUgY2FzdDxib29sPigpKS5jb3VudCgpKTsKICAgICAgIFNwQm9vbCBtYjMgPSBtYjEgJiYgbWIyOwotICAgICAgaWYobWIxLmNvZWZmcygpLmFsbCgpICYmIG1iMi5jb2VmZnMoKS5hbGwoKSkKLSAgICAgIHsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1iMy5ub25aZXJvcygpLCAocmVmTTEucmVhbCgpLnRlbXBsYXRlIGNhc3Q8Ym9vbD4oKSAmJiByZWZNMi5yZWFsKCkudGVtcGxhdGUgY2FzdDxib29sPigpKS5jb3VudCgpKTsKKyAgICAgIGlmIChtYjEuY29lZmZzKCkuYWxsKCkgJiYgbWIyLmNvZWZmcygpLmFsbCgpKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChtYjMubm9uWmVyb3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWZNMS5yZWFsKCkudGVtcGxhdGUgY2FzdDxib29sPigpICYmIHJlZk0yLnJlYWwoKS50ZW1wbGF0ZSBjYXN0PGJvb2w+KCkpLmNvdW50KCkpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNDQ2LDIzICs0NjUsMjAgQEAKICAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIpOwogICAgIHN0ZDo6dmVjdG9yPFNjYWxhcj4gcmVmX3ZhbHVlKG0yLmlubmVyU2l6ZSgpKTsKICAgICBzdGQ6OnZlY3RvcjxJbmRleD4gcmVmX2luZGV4KG0yLmlubmVyU2l6ZSgpKTsKLSAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpCi0gICAgICBtMi5tYWtlQ29tcHJlc3NlZCgpOwotICAgIGZvcihJbmRleCBqID0gMDsgajxtMi5vdXRlclNpemUoKTsgKytqKQotICAgIHsKKyAgICBpZiAoaW50ZXJuYWw6OnJhbmRvbTxib29sPigpKSBtMi5tYWtlQ29tcHJlc3NlZCgpOworICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBtMi5vdXRlclNpemUoKTsgKytqKSB7CiAgICAgICBJbmRleCBjb3VudF9mb3J3YXJkID0gMDsKIAotICAgICAgZm9yKHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQobTIsaik7IGl0OyArK2l0KQotICAgICAgewotICAgICAgICByZWZfdmFsdWVbcmVmX3ZhbHVlLnNpemUoKS0xLWNvdW50X2ZvcndhcmRdID0gaXQudmFsdWUoKTsKLSAgICAgICAgcmVmX2luZGV4W3JlZl9pbmRleC5zaXplKCktMS1jb3VudF9mb3J3YXJkXSA9IGl0LmluZGV4KCk7CisgICAgICBmb3IgKHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQobTIsIGopOyBpdDsgKytpdCkgeworICAgICAgICByZWZfdmFsdWVbcmVmX3ZhbHVlLnNpemUoKSAtIDEgLSBjb3VudF9mb3J3YXJkXSA9IGl0LnZhbHVlKCk7CisgICAgICAgIHJlZl9pbmRleFtyZWZfaW5kZXguc2l6ZSgpIC0gMSAtIGNvdW50X2ZvcndhcmRdID0gaXQuaW5kZXgoKTsKICAgICAgICAgY291bnRfZm9yd2FyZCsrOwogICAgICAgfQogICAgICAgSW5kZXggY291bnRfcmV2ZXJzZSA9IDA7Ci0gICAgICBmb3IodHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6UmV2ZXJzZUlubmVySXRlcmF0b3IgaXQobTIsaik7IGl0OyAtLWl0KQotICAgICAgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKCBzdGQ6OmFicyhyZWZfdmFsdWVbcmVmX3ZhbHVlLnNpemUoKS1jb3VudF9mb3J3YXJkK2NvdW50X3JldmVyc2VdKSsxLCBzdGQ6OmFicyhpdC52YWx1ZSgpKSsxKTsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKCByZWZfaW5kZXhbcmVmX2luZGV4LnNpemUoKS1jb3VudF9mb3J3YXJkK2NvdW50X3JldmVyc2VdICwgaXQuaW5kZXgoKSk7CisgICAgICBmb3IgKHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlJldmVyc2VJbm5lckl0ZXJhdG9yIGl0KG0yLCBqKTsgaXQ7IC0taXQpIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChzdGQ6OmFicyhyZWZfdmFsdWVbcmVmX3ZhbHVlLnNpemUoKSAtIGNvdW50X2ZvcndhcmQgKyBjb3VudF9yZXZlcnNlXSkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWJzKGl0LnZhbHVlKCkpICsgMSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChyZWZfaW5kZXhbcmVmX2luZGV4LnNpemUoKSAtIGNvdW50X2ZvcndhcmQgKyBjb3VudF9yZXZlcnNlXSwgaXQuaW5kZXgoKSk7CiAgICAgICAgIGNvdW50X3JldmVyc2UrKzsKICAgICAgIH0KICAgICAgIFZFUklGWV9JU19FUVVBTChjb3VudF9mb3J3YXJkLCBjb3VudF9yZXZlcnNlKTsKQEAgLTQ3OCw3ICs0OTQsNyBAQAogICAgIFZFUklGWV9JU19BUFBST1gobTIudHJhbnNwb3NlKCksIHJlZk1hdDIudHJhbnNwb3NlKCkpOwogCiAgICAgVkVSSUZZX0lTX0FQUFJPWChTcGFyc2VNYXRyaXhUeXBlKG0yLmFkam9pbnQoKSksIHJlZk1hdDIuYWRqb2ludCgpKTsKLSAgICAKKwogICAgIC8vIGNoZWNrIGlzQXBwcm94IGhhbmRsZXMgb3Bwb3NpdGUgc3RvcmFnZSBvcmRlcgogICAgIHR5cGVuYW1lIFRyYW5zcG9zZTxTcGFyc2VNYXRyaXhUeXBlPjo6UGxhaW5PYmplY3QgbTMobTIpOwogICAgIFZFUklGWShtMi5pc0FwcHJveChtMykpOwpAQCAtNDkyLDQ5ICs1MDgsNDAgQEAKICAgICBpbnQgY291bnRGYWxzZU5vblplcm8gPSAwOwogICAgIGludCBjb3VudFRydWVOb25aZXJvID0gMDsKICAgICBtMi5yZXNlcnZlKFZlY3RvclhpOjpDb25zdGFudChtMi5vdXRlclNpemUoKSwgaW50KG0yLmlubmVyU2l6ZSgpKSkpOwotICAgIGZvciAoSW5kZXggaj0wOyBqPG0yLmNvbHMoKTsgKytqKQotICAgIHsKLSAgICAgIGZvciAoSW5kZXggaT0wOyBpPG0yLnJvd3MoKTsgKytpKQotICAgICAgewotICAgICAgICBmbG9hdCB4ID0gaW50ZXJuYWw6OnJhbmRvbTxmbG9hdD4oMCwxKTsKLSAgICAgICAgaWYgKHg8MC4xZikKLSAgICAgICAgeworICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBtMi5jb2xzKCk7ICsraikgeworICAgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IG0yLnJvd3MoKTsgKytpKSB7CisgICAgICAgIGZsb2F0IHggPSBpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLCAxKTsKKyAgICAgICAgaWYgKHggPCAwLjFmKSB7CiAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHg8MC41ZikKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgaWYgKHggPCAwLjVmKSB7CiAgICAgICAgICAgY291bnRGYWxzZU5vblplcm8rKzsKLSAgICAgICAgICBtMi5pbnNlcnQoaSxqKSA9IFNjYWxhcigwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgICBtMi5pbnNlcnQoaSwgaikgPSBTY2FsYXIoMCk7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgY291bnRUcnVlTm9uWmVybysrOwotICAgICAgICAgIG0yLmluc2VydChpLGopID0gU2NhbGFyKDEpOwotICAgICAgICAgIHJlZk0yKGksaikgPSBTY2FsYXIoMSk7CisgICAgICAgICAgbTIuaW5zZXJ0KGksIGopID0gU2NhbGFyKDEpOworICAgICAgICAgIHJlZk0yKGksIGopID0gU2NhbGFyKDEpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIGlmKGludGVybmFsOjpyYW5kb208Ym9vbD4oKSkKLSAgICAgIG0yLm1ha2VDb21wcmVzc2VkKCk7Ci0gICAgVkVSSUZZKGNvdW50RmFsc2VOb25aZXJvK2NvdW50VHJ1ZU5vblplcm8gPT0gbTIubm9uWmVyb3MoKSk7Ci0gICAgaWYoY291bnRUcnVlTm9uWmVybz4wKQotICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTTIpOworICAgIGlmIChpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpIG0yLm1ha2VDb21wcmVzc2VkKCk7CisgICAgVkVSSUZZKGNvdW50RmFsc2VOb25aZXJvICsgY291bnRUcnVlTm9uWmVybyA9PSBtMi5ub25aZXJvcygpKTsKKyAgICBpZiAoY291bnRUcnVlTm9uWmVybyA+IDApIFZFUklGWV9JU19BUFBST1gobTIsIHJlZk0yKTsKICAgICBtMi5wcnVuZShTY2FsYXIoMSkpOwotICAgIFZFUklGWShjb3VudFRydWVOb25aZXJvPT1tMi5ub25aZXJvcygpKTsKKyAgICBWRVJJRlkoY291bnRUcnVlTm9uWmVybyA9PSBtMi5ub25aZXJvcygpKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNMik7CiAgIH0KIAogICAvLyB0ZXN0IHNldEZyb21UcmlwbGV0cyAvIGluc2VydEZyb21UcmlwbGV0cwogICB7Ci0gICAgdHlwZWRlZiBUcmlwbGV0PFNjYWxhcixTdG9yYWdlSW5kZXg+IFRyaXBsZXRUeXBlOworICAgIHR5cGVkZWYgVHJpcGxldDxTY2FsYXIsIFN0b3JhZ2VJbmRleD4gVHJpcGxldFR5cGU7CiAgICAgSW5kZXggbnRyaXBsZXRzID0gcm93cyAqIGNvbHM7CiAKICAgICBzdGQ6OnZlY3RvcjxUcmlwbGV0VHlwZT4gdHJpcGxldHM7CiAKICAgICB0cmlwbGV0cy5yZXNlcnZlKG50cmlwbGV0cyk7Ci0gICAgRGVuc2VNYXRyaXggcmVmTWF0X3N1bSAgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLGNvbHMpOwotICAgIERlbnNlTWF0cml4IHJlZk1hdF9wcm9kID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cyxjb2xzKTsKLSAgICBEZW5zZU1hdHJpeCByZWZNYXRfbGFzdCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsY29scyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0X3N1bSA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOworICAgIERlbnNlTWF0cml4IHJlZk1hdF9wcm9kID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0X2xhc3QgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKIAogICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBudHJpcGxldHM7ICsraSkgewogICAgICAgU3RvcmFnZUluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPFN0b3JhZ2VJbmRleD4oMCwgU3RvcmFnZUluZGV4KHJvd3MgLSAxKSk7CkBAIC01NjgsNyArNTc1LDcgQEAKICAgICAgIHJlZk1hdF9sYXN0X21vcmUociwgYykgPSB2OwogICAgIH0KIAotICAgIFNwYXJzZU1hdHJpeFR5cGUgbShyb3dzLGNvbHMpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbShyb3dzLCBjb2xzKTsKIAogICAgIC8vIHRlc3Qgc2V0RnJvbVRyaXBsZXRzIC8gaW5zZXJ0RnJvbVRyaXBsZXRzCiAKQEAgLTU4OCw3ICs1OTUsNyBAQAogICAgIFZFUklGWV9JU19BUFBST1gobSwgcmVmTWF0X3Byb2RfbW9yZSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKG0uaW5uZXJJbmRpY2VzQXJlU29ydGVkKCksIG0ub3V0ZXJTaXplKCkpOwogCi0gICAgbS5zZXRGcm9tVHJpcGxldHModHJpcGxldHMuYmVnaW4oKSwgdHJpcGxldHMuZW5kKCksIFtdIChTY2FsYXIsU2NhbGFyIGIpIHsgcmV0dXJuIGI7IH0pOworICAgIG0uc2V0RnJvbVRyaXBsZXRzKHRyaXBsZXRzLmJlZ2luKCksIHRyaXBsZXRzLmVuZCgpLCBbXShTY2FsYXIsIFNjYWxhciBiKSB7IHJldHVybiBiOyB9KTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG0sIHJlZk1hdF9sYXN0KTsKICAgICBWRVJJRllfSVNfRVFVQUwobS5pbm5lckluZGljZXNBcmVTb3J0ZWQoKSwgbS5vdXRlclNpemUoKSk7CiAgICAgbS5zZXRGcm9tVHJpcGxldHModHJpcGxldHMuYmVnaW4oKSwgdHJpcGxldHMuZW5kKCksIFtdKFNjYWxhciwgU2NhbGFyIGIpIHsgcmV0dXJuIGI7IH0pOwpAQCAtNjg2LDcgKzY5Myw3IEBACiAgICAgVkVSSUZZX0lTX0FQUFJPWChtLCByZWZNYXRfbGFzdF9tb3JlKTsKICAgICBWRVJJRllfSVNfRVFVQUwobS5pbm5lckluZGljZXNBcmVTb3J0ZWQoKSwgbS5vdXRlclNpemUoKSk7CiAgIH0KLSAgCisKICAgLy8gdGVzdCBNYXAKICAgewogICAgIERlbnNlTWF0cml4IHJlZk1hdDIocm93cywgY29scyksIHJlZk1hdDMocm93cywgY29scyk7CkBAIC02OTQsMjIgKzcwMSwyNCBAQAogICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CiAgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDMsIG0zKTsKICAgICB7Ci0gICAgICBNYXA8U3BhcnNlTWF0cml4VHlwZT4gbWFwTWF0MihtMi5yb3dzKCksIG0yLmNvbHMoKSwgbTIubm9uWmVyb3MoKSwgbTIub3V0ZXJJbmRleFB0cigpLCBtMi5pbm5lckluZGV4UHRyKCksIG0yLnZhbHVlUHRyKCksIG0yLmlubmVyTm9uWmVyb1B0cigpKTsKLSAgICAgIE1hcDxTcGFyc2VNYXRyaXhUeXBlPiBtYXBNYXQzKG0zLnJvd3MoKSwgbTMuY29scygpLCBtMy5ub25aZXJvcygpLCBtMy5vdXRlckluZGV4UHRyKCksIG0zLmlubmVySW5kZXhQdHIoKSwgbTMudmFsdWVQdHIoKSwgbTMuaW5uZXJOb25aZXJvUHRyKCkpOwotICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXBNYXQyK21hcE1hdDMsIHJlZk1hdDIrcmVmTWF0Myk7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKG1hcE1hdDIrbWFwTWF0MywgcmVmTWF0MityZWZNYXQzKTsKKyAgICAgIE1hcDxTcGFyc2VNYXRyaXhUeXBlPiBtYXBNYXQyKG0yLnJvd3MoKSwgbTIuY29scygpLCBtMi5ub25aZXJvcygpLCBtMi5vdXRlckluZGV4UHRyKCksIG0yLmlubmVySW5kZXhQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0yLnZhbHVlUHRyKCksIG0yLmlubmVyTm9uWmVyb1B0cigpKTsKKyAgICAgIE1hcDxTcGFyc2VNYXRyaXhUeXBlPiBtYXBNYXQzKG0zLnJvd3MoKSwgbTMuY29scygpLCBtMy5ub25aZXJvcygpLCBtMy5vdXRlckluZGV4UHRyKCksIG0zLmlubmVySW5kZXhQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0zLnZhbHVlUHRyKCksIG0zLmlubmVyTm9uWmVyb1B0cigpKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobWFwTWF0MiArIG1hcE1hdDMsIHJlZk1hdDIgKyByZWZNYXQzKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobWFwTWF0MiArIG1hcE1hdDMsIHJlZk1hdDIgKyByZWZNYXQzKTsKICAgICB9CiAKLSAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOwotICAgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7Ci0gICAgbTIuY29lZmZSZWYoaSxqKSA9IDEyMzsKLSAgICBpZihpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpCi0gICAgICBtMi5tYWtlQ29tcHJlc3NlZCgpOwotICAgIE1hcDxTcGFyc2VNYXRyaXhUeXBlPiBtYXBNYXQyKHJvd3MsIGNvbHMsIG0yLm5vblplcm9zKCksIG0yLm91dGVySW5kZXhQdHIoKSwgbTIuaW5uZXJJbmRleFB0cigpLCBtMi52YWx1ZVB0cigpLCAgbTIuaW5uZXJOb25aZXJvUHRyKCkpOwotICAgIFZFUklGWV9JU19FUVVBTChtMi5jb2VmZihpLGopLFNjYWxhcigxMjMpKTsKLSAgICBWRVJJRllfSVNfRVFVQUwobWFwTWF0Mi5jb2VmZihpLGopLFNjYWxhcigxMjMpKTsKLSAgICBtYXBNYXQyLmNvZWZmUmVmKGksaikgPSAtMTIzOwotICAgIFZFUklGWV9JU19FUVVBTChtMi5jb2VmZihpLGopLFNjYWxhcigtMTIzKSk7CisgICAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAxKTsKKyAgICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scyAtIDEpOworICAgIG0yLmNvZWZmUmVmKGksIGopID0gMTIzOworICAgIGlmIChpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpIG0yLm1ha2VDb21wcmVzc2VkKCk7CisgICAgTWFwPFNwYXJzZU1hdHJpeFR5cGU+IG1hcE1hdDIocm93cywgY29scywgbTIubm9uWmVyb3MoKSwgbTIub3V0ZXJJbmRleFB0cigpLCBtMi5pbm5lckluZGV4UHRyKCksIG0yLnZhbHVlUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTIuaW5uZXJOb25aZXJvUHRyKCkpOworICAgIFZFUklGWV9JU19FUVVBTChtMi5jb2VmZihpLCBqKSwgU2NhbGFyKDEyMykpOworICAgIFZFUklGWV9JU19FUVVBTChtYXBNYXQyLmNvZWZmKGksIGopLCBTY2FsYXIoMTIzKSk7CisgICAgbWFwTWF0Mi5jb2VmZlJlZihpLCBqKSA9IC0xMjM7CisgICAgVkVSSUZZX0lTX0VRVUFMKG0yLmNvZWZmKGksIGopLCBTY2FsYXIoLTEyMykpOwogICB9CiAKICAgLy8gdGVzdCB0cmlhbmd1bGFyVmlldwpAQCAtNzUyLDEwICs3NjEsOSBAQAogICAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0TG93ZXI+KCkudG9EZW5zZSgpLCBEZW5zZU1hdHJpeDo6SWRlbnRpdHkocm93cywgY29scykpOwogICAgIFZFUklGWV9JU19DV0lTRV9FUVVBTChtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCkudG9EZW5zZSgpLCBEZW5zZU1hdHJpeDo6SWRlbnRpdHkocm93cywgY29scykpOwogICB9Ci0gIAorCiAgIC8vIHRlc3Qgc2VsZmFkam9pbnRWaWV3Ci0gIGlmKCFTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQotICB7CisgIGlmICghU3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcikgewogICAgIERlbnNlTWF0cml4IHJlZk1hdDIocm93cywgcm93cyksIHJlZk1hdDMocm93cywgcm93cyk7CiAgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCByb3dzKSwgbTMocm93cywgcm93cyk7CiAgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yKTsKQEAgLTc3MiwxMSArNzgwLDExIEBACiAgICAgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmTWF0Myk7CiAKICAgICAvLyBzZWxmYWRqb2ludFZpZXcgb25seSB3b3JrcyBmb3Igc3F1YXJlIG1hdHJpY2VzOgotICAgIFNwYXJzZU1hdHJpeFR5cGUgbTQocm93cywgcm93cysxKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG00KHJvd3MsIHJvd3MgKyAxKTsKICAgICBWRVJJRllfUkFJU0VTX0FTU0VSVChtNC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkpOwogICAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG00LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSk7CiAgIH0KLSAgCisKICAgLy8gdGVzdCBzcGFyc2VWaWV3CiAgIHsKICAgICBEZW5zZU1hdHJpeCByZWZNYXQyID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CkBAIC03ODUsMTAgKzc5MywxMCBAQAogICAgIFZFUklGWV9JU19BUFBST1gobTIuZXZhbCgpLCByZWZNYXQyLnNwYXJzZVZpZXcoKS5ldmFsKCkpOwogCiAgICAgLy8gc3BhcnNlIHZpZXcgb24gZXhwcmVzc2lvbnM6Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgoczEqbTIpLmV2YWwoKSwgKHMxKnJlZk1hdDIpLnNwYXJzZVZpZXcoKS5ldmFsKCkpOwotICAgIFZFUklGWV9JU19BUFBST1goKG0yK20yKS5ldmFsKCksIChyZWZNYXQyK3JlZk1hdDIpLnNwYXJzZVZpZXcoKS5ldmFsKCkpOwotICAgIFZFUklGWV9JU19BUFBST1goKG0yKm0yKS5ldmFsKCksIChyZWZNYXQyLmxhenlQcm9kdWN0KHJlZk1hdDIpKS5zcGFyc2VWaWV3KCkuZXZhbCgpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKChtMiptMikuZXZhbCgpLCAocmVmTWF0MipyZWZNYXQyKS5zcGFyc2VWaWV3KCkuZXZhbCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChzMSAqIG0yKS5ldmFsKCksIChzMSAqIHJlZk1hdDIpLnNwYXJzZVZpZXcoKS5ldmFsKCkpOworICAgIFZFUklGWV9JU19BUFBST1goKG0yICsgbTIpLmV2YWwoKSwgKHJlZk1hdDIgKyByZWZNYXQyKS5zcGFyc2VWaWV3KCkuZXZhbCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChtMiAqIG0yKS5ldmFsKCksIChyZWZNYXQyLmxhenlQcm9kdWN0KHJlZk1hdDIpKS5zcGFyc2VWaWV3KCkuZXZhbCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChtMiAqIG0yKS5ldmFsKCksIChyZWZNYXQyICogcmVmTWF0Mikuc3BhcnNlVmlldygpLmV2YWwoKSk7CiAgIH0KIAogICAvLyB0ZXN0IGRpYWdvbmFsCkBAIC04MDIsMTMgKzgxMCwxMyBAQAogICAgIGQgPSBtMi5kaWFnb25hbCgpLmFycmF5KCk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChkLCByZWZNYXQyLmRpYWdvbmFsKCkuZXZhbCgpKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKGNvbnN0X2Nhc3Q8Y29uc3QgU3BhcnNlTWF0cml4VHlwZSY+KG0yKS5kaWFnb25hbCgpLCByZWZNYXQyLmRpYWdvbmFsKCkuZXZhbCgpKTsKLSAgICAKKwogICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMiwgRm9yY2VOb25aZXJvRGlhZyk7Ci0gICAgbTIuZGlhZ29uYWwoKSAgICAgICs9IHJlZk1hdDIuZGlhZ29uYWwoKTsKKyAgICBtMi5kaWFnb25hbCgpICs9IHJlZk1hdDIuZGlhZ29uYWwoKTsKICAgICByZWZNYXQyLmRpYWdvbmFsKCkgKz0gcmVmTWF0Mi5kaWFnb25hbCgpOwogICAgIFZFUklGWV9JU19BUFBST1gobTIsIHJlZk1hdDIpOwogICB9Ci0gIAorCiAgIC8vIHRlc3QgZGlhZ29uYWwgdG8gc3BhcnNlCiAgIHsKICAgICBEZW5zZVZlY3RvciBkID0gRGVuc2VWZWN0b3I6OlJhbmRvbShyb3dzKTsKQEAgLTgyMSwxMSArODI5LDE1IEBACiAgICAgcmVmTWF0MiArPSBkLmFzRGlhZ29uYWwoKTsKICAgICBtMiArPSBkLmFzRGlhZ29uYWwoKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNYXQyKTsKLSAgICBtMi5zZXRaZXJvKCk7ICAgICAgIG0yICs9IGQuYXNEaWFnb25hbCgpOwotICAgIHJlZk1hdDIuc2V0WmVybygpOyAgcmVmTWF0MiArPSBkLmFzRGlhZ29uYWwoKTsKKyAgICBtMi5zZXRaZXJvKCk7CisgICAgbTIgKz0gZC5hc0RpYWdvbmFsKCk7CisgICAgcmVmTWF0Mi5zZXRaZXJvKCk7CisgICAgcmVmTWF0MiArPSBkLmFzRGlhZ29uYWwoKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNYXQyKTsKLSAgICBtMi5zZXRaZXJvKCk7ICAgICAgIG0yIC09IGQuYXNEaWFnb25hbCgpOwotICAgIHJlZk1hdDIuc2V0WmVybygpOyAgcmVmTWF0MiAtPSBkLmFzRGlhZ29uYWwoKTsKKyAgICBtMi5zZXRaZXJvKCk7CisgICAgbTIgLT0gZC5hc0RpYWdvbmFsKCk7CisgICAgcmVmTWF0Mi5zZXRaZXJvKCk7CisgICAgcmVmTWF0MiAtPSBkLmFzRGlhZ29uYWwoKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNYXQyKTsKIAogICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CkBAIC04MzcsNTYgKzg0OSw1MCBAQAogICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CiAgICAgbTIubWFrZUNvbXByZXNzZWQoKTsKICAgICBWZWN0b3JYaSByZXMocm93cyk7Ci0gICAgZm9yKEluZGV4IGk9MDsgaTxyb3dzOyArK2kpCi0gICAgICByZXMoaSkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwzKTsKKyAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgcm93czsgKytpKSByZXMoaSkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgMyk7CiAgICAgbTIucmVzZXJ2ZShyZXMpOwogICAgIG0yIC09IGQuYXNEaWFnb25hbCgpOwogICAgIHJlZk1hdDIgLT0gZC5hc0RpYWdvbmFsKCk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0Mik7CiAgIH0KLSAgCisKICAgLy8gdGVzdCBjb25zZXJ2YXRpdmUgcmVzaXplCiAgIHsKLSAgICAgIHN0ZDo6dmVjdG9yPCBzdGQ6OnBhaXI8U3RvcmFnZUluZGV4LFN0b3JhZ2VJbmRleD4gPiBpbmM7Ci0gICAgICBpZihyb3dzID4gMyAmJiBjb2xzID4gMikKLSAgICAgICAgaW5jLnB1c2hfYmFjayhzdGQ6OnBhaXI8U3RvcmFnZUluZGV4LFN0b3JhZ2VJbmRleD4oLTMsLTIpKTsKLSAgICAgIGluYy5wdXNoX2JhY2soc3RkOjpwYWlyPFN0b3JhZ2VJbmRleCxTdG9yYWdlSW5kZXg+KDAsMCkpOwotICAgICAgaW5jLnB1c2hfYmFjayhzdGQ6OnBhaXI8U3RvcmFnZUluZGV4LFN0b3JhZ2VJbmRleD4oMywyKSk7Ci0gICAgICBpbmMucHVzaF9iYWNrKHN0ZDo6cGFpcjxTdG9yYWdlSW5kZXgsU3RvcmFnZUluZGV4PigzLDApKTsKLSAgICAgIGluYy5wdXNoX2JhY2soc3RkOjpwYWlyPFN0b3JhZ2VJbmRleCxTdG9yYWdlSW5kZXg+KDAsMykpOwotICAgICAgaW5jLnB1c2hfYmFjayhzdGQ6OnBhaXI8U3RvcmFnZUluZGV4LFN0b3JhZ2VJbmRleD4oMCwtMSkpOwotICAgICAgaW5jLnB1c2hfYmFjayhzdGQ6OnBhaXI8U3RvcmFnZUluZGV4LFN0b3JhZ2VJbmRleD4oLTEsMCkpOwotICAgICAgaW5jLnB1c2hfYmFjayhzdGQ6OnBhaXI8U3RvcmFnZUluZGV4LFN0b3JhZ2VJbmRleD4oLTEsLTEpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8U3RvcmFnZUluZGV4LCBTdG9yYWdlSW5kZXg+PiBpbmM7CisgICAgaWYgKHJvd3MgPiAzICYmIGNvbHMgPiAyKSBpbmMucHVzaF9iYWNrKHN0ZDo6cGFpcjxTdG9yYWdlSW5kZXgsIFN0b3JhZ2VJbmRleD4oLTMsIC0yKSk7CisgICAgaW5jLnB1c2hfYmFjayhzdGQ6OnBhaXI8U3RvcmFnZUluZGV4LCBTdG9yYWdlSW5kZXg+KDAsIDApKTsKKyAgICBpbmMucHVzaF9iYWNrKHN0ZDo6cGFpcjxTdG9yYWdlSW5kZXgsIFN0b3JhZ2VJbmRleD4oMywgMikpOworICAgIGluYy5wdXNoX2JhY2soc3RkOjpwYWlyPFN0b3JhZ2VJbmRleCwgU3RvcmFnZUluZGV4PigzLCAwKSk7CisgICAgaW5jLnB1c2hfYmFjayhzdGQ6OnBhaXI8U3RvcmFnZUluZGV4LCBTdG9yYWdlSW5kZXg+KDAsIDMpKTsKKyAgICBpbmMucHVzaF9iYWNrKHN0ZDo6cGFpcjxTdG9yYWdlSW5kZXgsIFN0b3JhZ2VJbmRleD4oMCwgLTEpKTsKKyAgICBpbmMucHVzaF9iYWNrKHN0ZDo6cGFpcjxTdG9yYWdlSW5kZXgsIFN0b3JhZ2VJbmRleD4oLTEsIDApKTsKKyAgICBpbmMucHVzaF9iYWNrKHN0ZDo6cGFpcjxTdG9yYWdlSW5kZXgsIFN0b3JhZ2VJbmRleD4oLTEsIC0xKSk7CiAKLSAgICAgIGZvcihzaXplX3QgaSA9IDA7IGk8IGluYy5zaXplKCk7IGkrKykgewotICAgICAgICBTdG9yYWdlSW5kZXggaW5jUm93cyA9IGluY1tpXS5maXJzdDsKLSAgICAgICAgU3RvcmFnZUluZGV4IGluY0NvbHMgPSBpbmNbaV0uc2Vjb25kOwotICAgICAgICBTcGFyc2VNYXRyaXhUeXBlIG0xKHJvd3MsIGNvbHMpOwotICAgICAgICBEZW5zZU1hdHJpeCByZWZNYXQxID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7Ci0gICAgICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQxLCBtMSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIFN0b3JhZ2VJbmRleCBpbmNSb3dzID0gaW5jW2ldLmZpcnN0OworICAgICAgU3RvcmFnZUluZGV4IGluY0NvbHMgPSBpbmNbaV0uc2Vjb25kOworICAgICAgU3BhcnNlTWF0cml4VHlwZSBtMShyb3dzLCBjb2xzKTsKKyAgICAgIERlbnNlTWF0cml4IHJlZk1hdDEgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKKyAgICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQxLCBtMSk7CiAKLSAgICAgICAgU3BhcnNlTWF0cml4VHlwZSBtMiA9IG0xOwotICAgICAgICBtMi5tYWtlQ29tcHJlc3NlZCgpOworICAgICAgU3BhcnNlTWF0cml4VHlwZSBtMiA9IG0xOworICAgICAgbTIubWFrZUNvbXByZXNzZWQoKTsKIAotICAgICAgICBtMS5jb25zZXJ2YXRpdmVSZXNpemUocm93cytpbmNSb3dzLCBjb2xzK2luY0NvbHMpOwotICAgICAgICBtMi5jb25zZXJ2YXRpdmVSZXNpemUocm93cytpbmNSb3dzLCBjb2xzK2luY0NvbHMpOwotICAgICAgICByZWZNYXQxLmNvbnNlcnZhdGl2ZVJlc2l6ZShyb3dzK2luY1Jvd3MsIGNvbHMraW5jQ29scyk7Ci0gICAgICAgIGlmIChpbmNSb3dzID4gMCkgcmVmTWF0MS5ib3R0b21Sb3dzKGluY1Jvd3MpLnNldFplcm8oKTsKLSAgICAgICAgaWYgKGluY0NvbHMgPiAwKSByZWZNYXQxLnJpZ2h0Q29scyhpbmNDb2xzKS5zZXRaZXJvKCk7CisgICAgICBtMS5jb25zZXJ2YXRpdmVSZXNpemUocm93cyArIGluY1Jvd3MsIGNvbHMgKyBpbmNDb2xzKTsKKyAgICAgIG0yLmNvbnNlcnZhdGl2ZVJlc2l6ZShyb3dzICsgaW5jUm93cywgY29scyArIGluY0NvbHMpOworICAgICAgcmVmTWF0MS5jb25zZXJ2YXRpdmVSZXNpemUocm93cyArIGluY1Jvd3MsIGNvbHMgKyBpbmNDb2xzKTsKKyAgICAgIGlmIChpbmNSb3dzID4gMCkgcmVmTWF0MS5ib3R0b21Sb3dzKGluY1Jvd3MpLnNldFplcm8oKTsKKyAgICAgIGlmIChpbmNDb2xzID4gMCkgcmVmTWF0MS5yaWdodENvbHMoaW5jQ29scykuc2V0WmVybygpOwogCi0gICAgICAgIFZFUklGWV9JU19BUFBST1gobTEsIHJlZk1hdDEpOwotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNYXQxKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTEsIHJlZk1hdDEpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0MSk7CiAKLSAgICAgICAgLy8gSW5zZXJ0IG5ldyB2YWx1ZXMKLSAgICAgICAgaWYgKGluY1Jvd3MgPiAwKSAKLSAgICAgICAgICBtMS5pbnNlcnQobTEucm93cygpLTEsIDApID0gcmVmTWF0MShyZWZNYXQxLnJvd3MoKS0xLCAwKSA9IDE7Ci0gICAgICAgIGlmIChpbmNDb2xzID4gMCkgCi0gICAgICAgICAgbTEuaW5zZXJ0KDAsIG0xLmNvbHMoKS0xKSA9IHJlZk1hdDEoMCwgcmVmTWF0MS5jb2xzKCktMSkgPSAxOworICAgICAgLy8gSW5zZXJ0IG5ldyB2YWx1ZXMKKyAgICAgIGlmIChpbmNSb3dzID4gMCkgbTEuaW5zZXJ0KG0xLnJvd3MoKSAtIDEsIDApID0gcmVmTWF0MShyZWZNYXQxLnJvd3MoKSAtIDEsIDApID0gMTsKKyAgICAgIGlmIChpbmNDb2xzID4gMCkgbTEuaW5zZXJ0KDAsIG0xLmNvbHMoKSAtIDEpID0gcmVmTWF0MSgwLCByZWZNYXQxLmNvbHMoKSAtIDEpID0gMTsKIAotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLCByZWZNYXQxKTsKLQotCi0gICAgICB9CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLCByZWZNYXQxKTsKKyAgICB9CiAgIH0KIAogICAvLyB0ZXN0IElkZW50aXR5IG1hdHJpeApAQCAtODk1LDE2ICs5MDEsMTQgQEAKICAgICBTcGFyc2VNYXRyaXhUeXBlIG0xKHJvd3MsIHJvd3MpOwogICAgIG0xLnNldElkZW50aXR5KCk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChtMSwgcmVmTWF0MSk7Ci0gICAgZm9yKGludCBrPTA7IGs8cm93cypyb3dzLzQ7ICsraykKLSAgICB7Ci0gICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOwotICAgICAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0xKTsKKyAgICBmb3IgKGludCBrID0gMDsgayA8IHJvd3MgKiByb3dzIC8gNDsgKytrKSB7CisgICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cyAtIDEpOworICAgICAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAxKTsKICAgICAgIFNjYWxhciB2ID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7Ci0gICAgICBtMS5jb2VmZlJlZihpLGopID0gdjsKLSAgICAgIHJlZk1hdDEuY29lZmZSZWYoaSxqKSA9IHY7CisgICAgICBtMS5jb2VmZlJlZihpLCBqKSA9IHY7CisgICAgICByZWZNYXQxLmNvZWZmUmVmKGksIGopID0gdjsKICAgICAgIFZFUklGWV9JU19BUFBST1gobTEsIHJlZk1hdDEpOwotICAgICAgaWYoaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwxMCk8MikKLSAgICAgICAgbTEubWFrZUNvbXByZXNzZWQoKTsKKyAgICAgIGlmIChpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCAxMCkgPCAyKSBtMS5tYWtlQ29tcHJlc3NlZCgpOwogICAgIH0KICAgICBtMS5zZXRJZGVudGl0eSgpOwogICAgIHJlZk1hdDEuc2V0SWRlbnRpdHkoKTsKQEAgLTkxOSwxMTEgKzkyMywxMDUgQEAKICAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIGNvbHMpOwogICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7CiAgICAgSXRlcmF0b3JUeXBlIHN0YXRpY19hcnJheVsyXTsKLSAgICBzdGF0aWNfYXJyYXlbMF0gPSBJdGVyYXRvclR5cGUobTIsMCk7Ci0gICAgc3RhdGljX2FycmF5WzFdID0gSXRlcmF0b3JUeXBlKG0yLG0yLm91dGVyU2l6ZSgpLTEpOwotICAgIFZFUklGWSggc3RhdGljX2FycmF5WzBdIHx8IG0yLmlubmVyVmVjdG9yKHN0YXRpY19hcnJheVswXS5vdXRlcigpKS5ub25aZXJvcygpID09IDAgKTsKLSAgICBWRVJJRlkoIHN0YXRpY19hcnJheVsxXSB8fCBtMi5pbm5lclZlY3RvcihzdGF0aWNfYXJyYXlbMV0ub3V0ZXIoKSkubm9uWmVyb3MoKSA9PSAwICk7Ci0gICAgaWYoc3RhdGljX2FycmF5WzBdICYmIHN0YXRpY19hcnJheVsxXSkKLSAgICB7CisgICAgc3RhdGljX2FycmF5WzBdID0gSXRlcmF0b3JUeXBlKG0yLCAwKTsKKyAgICBzdGF0aWNfYXJyYXlbMV0gPSBJdGVyYXRvclR5cGUobTIsIG0yLm91dGVyU2l6ZSgpIC0gMSk7CisgICAgVkVSSUZZKHN0YXRpY19hcnJheVswXSB8fCBtMi5pbm5lclZlY3RvcihzdGF0aWNfYXJyYXlbMF0ub3V0ZXIoKSkubm9uWmVyb3MoKSA9PSAwKTsKKyAgICBWRVJJRlkoc3RhdGljX2FycmF5WzFdIHx8IG0yLmlubmVyVmVjdG9yKHN0YXRpY19hcnJheVsxXS5vdXRlcigpKS5ub25aZXJvcygpID09IDApOworICAgIGlmIChzdGF0aWNfYXJyYXlbMF0gJiYgc3RhdGljX2FycmF5WzFdKSB7CiAgICAgICArKyhzdGF0aWNfYXJyYXlbMV0pOwotICAgICAgc3RhdGljX2FycmF5WzFdID0gSXRlcmF0b3JUeXBlKG0yLDApOwotICAgICAgVkVSSUZZKCBzdGF0aWNfYXJyYXlbMV0gKTsKLSAgICAgIFZFUklGWSggc3RhdGljX2FycmF5WzFdLmluZGV4KCkgPT0gc3RhdGljX2FycmF5WzBdLmluZGV4KCkgKTsKLSAgICAgIFZFUklGWSggc3RhdGljX2FycmF5WzFdLm91dGVyKCkgPT0gc3RhdGljX2FycmF5WzBdLm91dGVyKCkgKTsKLSAgICAgIFZFUklGWSggc3RhdGljX2FycmF5WzFdLnZhbHVlKCkgPT0gc3RhdGljX2FycmF5WzBdLnZhbHVlKCkgKTsKKyAgICAgIHN0YXRpY19hcnJheVsxXSA9IEl0ZXJhdG9yVHlwZShtMiwgMCk7CisgICAgICBWRVJJRlkoc3RhdGljX2FycmF5WzFdKTsKKyAgICAgIFZFUklGWShzdGF0aWNfYXJyYXlbMV0uaW5kZXgoKSA9PSBzdGF0aWNfYXJyYXlbMF0uaW5kZXgoKSk7CisgICAgICBWRVJJRlkoc3RhdGljX2FycmF5WzFdLm91dGVyKCkgPT0gc3RhdGljX2FycmF5WzBdLm91dGVyKCkpOworICAgICAgVkVSSUZZKHN0YXRpY19hcnJheVsxXS52YWx1ZSgpID09IHN0YXRpY19hcnJheVswXS52YWx1ZSgpKTsKICAgICB9CiAKICAgICBzdGQ6OnZlY3RvcjxJdGVyYXRvclR5cGU+IGl0ZXJzKDIpOwotICAgIGl0ZXJzWzBdID0gSXRlcmF0b3JUeXBlKG0yLDApOwotICAgIGl0ZXJzWzFdID0gSXRlcmF0b3JUeXBlKG0yLG0yLm91dGVyU2l6ZSgpLTEpOworICAgIGl0ZXJzWzBdID0gSXRlcmF0b3JUeXBlKG0yLCAwKTsKKyAgICBpdGVyc1sxXSA9IEl0ZXJhdG9yVHlwZShtMiwgbTIub3V0ZXJTaXplKCkgLSAxKTsKICAgfQogCiAgIC8vIHRlc3QgcmVzZXJ2ZSB3aXRoIGVtcHR5IHJvd3MvY29sdW1ucwogICB7Ci0gICAgU3BhcnNlTWF0cml4VHlwZSBtMSgwLGNvbHMpOwotICAgIG0xLnJlc2VydmUoQXJyYXlYaTo6Q29uc3RhbnQobTEub3V0ZXJTaXplKCksMSkpOwotICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywwKTsKLSAgICBtMi5yZXNlcnZlKEFycmF5WGk6OkNvbnN0YW50KG0yLm91dGVyU2l6ZSgpLDEpKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0xKDAsIGNvbHMpOworICAgIG0xLnJlc2VydmUoQXJyYXlYaTo6Q29uc3RhbnQobTEub3V0ZXJTaXplKCksIDEpKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIDApOworICAgIG0yLnJlc2VydmUoQXJyYXlYaTo6Q29uc3RhbnQobTIub3V0ZXJTaXplKCksIDEpKTsKICAgfQogfQogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZT4KIHZvaWQgYmlnX3NwYXJzZV90cmlwbGV0KEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIGRvdWJsZSBkZW5zaXR5KSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKICAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwotICB0eXBlZGVmIFRyaXBsZXQ8U2NhbGFyLEluZGV4PiBUcmlwbGV0VHlwZTsKKyAgdHlwZWRlZiBUcmlwbGV0PFNjYWxhciwgSW5kZXg+IFRyaXBsZXRUeXBlOwogICBzdGQ6OnZlY3RvcjxUcmlwbGV0VHlwZT4gdHJpcGxldHM7Ci0gIGRvdWJsZSBuZWxlbWVudHMgPSBkZW5zaXR5ICogc3RhdGljX2Nhc3Q8ZG91YmxlPihyb3dzKmNvbHMpOwotICBWRVJJRlkobmVsZW1lbnRzPj0wICYmIG5lbGVtZW50cyA8IHN0YXRpY19jYXN0PGRvdWJsZT4oTnVtVHJhaXRzPFN0b3JhZ2VJbmRleD46OmhpZ2hlc3QoKSkpOworICBkb3VibGUgbmVsZW1lbnRzID0gZGVuc2l0eSAqIHN0YXRpY19jYXN0PGRvdWJsZT4ocm93cyAqIGNvbHMpOworICBWRVJJRlkobmVsZW1lbnRzID49IDAgJiYgbmVsZW1lbnRzIDwgc3RhdGljX2Nhc3Q8ZG91YmxlPihOdW1UcmFpdHM8U3RvcmFnZUluZGV4Pjo6aGlnaGVzdCgpKSk7CiAgIEluZGV4IG50cmlwbGV0cyA9IEluZGV4KG5lbGVtZW50cyk7CiAgIHRyaXBsZXRzLnJlc2VydmUobnRyaXBsZXRzKTsKICAgU2NhbGFyIHN1bSA9IFNjYWxhcigwKTsKLSAgZm9yKEluZGV4IGk9MDtpPG50cmlwbGV0czsrK2kpCi0gIHsKLSAgICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOwotICAgIEluZGV4IGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBudHJpcGxldHM7ICsraSkgeworICAgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMSk7CisgICAgSW5kZXggYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAxKTsKICAgICAvLyB1c2UgcG9zaXRpdmUgdmFsdWVzIHRvIHByZXZlbnQgbnVtZXJpY2FsIGNhbmNlbGxhdGlvbiBlcnJvcnMgaW4gc3VtCiAgICAgU2NhbGFyIHYgPSBudW1leHQ6OmFicyhpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKSk7Ci0gICAgdHJpcGxldHMucHVzaF9iYWNrKFRyaXBsZXRUeXBlKHIsYyx2KSk7CisgICAgdHJpcGxldHMucHVzaF9iYWNrKFRyaXBsZXRUeXBlKHIsIGMsIHYpKTsKICAgICBzdW0gKz0gdjsKICAgfQotICBTcGFyc2VNYXRyaXhUeXBlIG0ocm93cyxjb2xzKTsKKyAgU3BhcnNlTWF0cml4VHlwZSBtKHJvd3MsIGNvbHMpOwogICBtLnNldEZyb21UcmlwbGV0cyh0cmlwbGV0cy5iZWdpbigpLCB0cmlwbGV0cy5lbmQoKSk7CiAgIFZFUklGWShtLm5vblplcm9zKCkgPD0gbnRyaXBsZXRzKTsKICAgVkVSSUZZX0lTX0FQUFJPWChzdW0sIG0uc3VtKCkpOwogfQogCi10ZW1wbGF0ZTxpbnQ+Ci12b2lkIGJ1ZzExMDUoKQotewordGVtcGxhdGUgPGludD4KK3ZvaWQgYnVnMTEwNSgpIHsKICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTEwNQotICBpbnQgbiA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMjAwLDYwMCk7Ci0gIFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwwLCBsb25nPiBtYXQobiwgbik7CisgIGludCBuID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigyMDAsIDYwMCk7CisgIFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgMCwgbG9uZz4gbWF0KG4sIG4pOwogICBzdGQ6OmNvbXBsZXg8ZG91YmxlPiB2YWw7CiAKLSAgZm9yKGludCBpPTA7IGk8bjsgKytpKQotICB7Ci0gICAgbWF0LmNvZWZmUmVmKGksIGklKG4vMTApKSA9IHZhbDsKLSAgICBWRVJJRlkobWF0LmRhdGEoKS5hbGxvY2F0ZWRTaXplKCk8MjAqbik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgbWF0LmNvZWZmUmVmKGksIGkgJSAobiAvIDEwKSkgPSB2YWw7CisgICAgVkVSSUZZKG1hdC5kYXRhKCkuYWxsb2NhdGVkU2l6ZSgpIDwgMjAgKiBuKTsKICAgfQogfQogCiAjaWZuZGVmIEVJR0VOX1NQQVJTRV9URVNUX0lOQ0xVREVEX0ZST01fU1BBUlNFX0VYVFJBCiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChzcGFyc2VfYmFzaWMpCi17CitFSUdFTl9ERUNMQVJFX1RFU1Qoc3BhcnNlX2Jhc2ljKSB7CiAgIGdfZGVuc2Vfb3Bfc3BhcnNlX2NvdW50ID0gMDsgIC8vIFN1cHByZXNzZXMgY29tcGlsZXIgd2FybmluZy4KLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBpbnQgciA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSwyMDApLCBjID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDIwMCk7Ci0gICAgaWYoRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigwLDQpID09IDApIHsKLSAgICAgIHIgPSBjOyAvLyBjaGVjayBzcXVhcmUgbWF0cmljZXMgaW4gMjUlIG9mIHRyaWVzCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIGludCByID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLCAyMDApLCBjID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLCAyMDApOworICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIDQpID09IDApIHsKKyAgICAgIHIgPSBjOyAgLy8gY2hlY2sgc3F1YXJlIG1hdHJpY2VzIGluIDI1JSBvZiB0cmllcwogICAgIH0KLSAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUocitjKTsKLSAgICBDQUxMX1NVQlRFU1RfMSgoIHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8ZG91YmxlPigxLCAxKSkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoKCBzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGRvdWJsZT4oOCwgOCkpICkpOwotICAgIENBTExfU1VCVEVTVF8yKCggc3BhcnNlX2Jhc2ljKFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgQ29sTWFqb3I+KHIsIGMpKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMigoIHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIFJvd01ham9yPihyLCBjKSkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoKCBzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGZsb2F0LCAgUm93TWFqb3I+KHIsIGMpKSkpOwotICAgIENBTExfU1VCVEVTVF8yKCggc3BhcnNlX2Jhc2ljKFNwYXJzZU1hdHJpeDxmbG9hdCwgIENvbE1ham9yPihyLCBjKSkpKTsKLSAgICBDQUxMX1NVQlRFU1RfMygoIHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8ZG91YmxlLCBDb2xNYWpvcj4ociwgYykpKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoKCBzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGRvdWJsZSwgUm93TWFqb3I+KHIsIGMpKSkpOwotICAgIENBTExfU1VCVEVTVF80KCggc3BhcnNlX2Jhc2ljKFNwYXJzZU1hdHJpeDxkb3VibGUsIENvbE1ham9yLGxvbmcgaW50PihyLCBjKSkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoKCBzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGRvdWJsZSwgUm93TWFqb3IsbG9uZyBpbnQ+KHIsIGMpKSApKTsKLSAgICAKLSAgICByID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDEwMCk7Ci0gICAgYyA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMDApOwotICAgIGlmKEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMCw0KSA9PSAwKSB7Ci0gICAgICByID0gYzsgLy8gY2hlY2sgc3F1YXJlIG1hdHJpY2VzIGluIDI1JSBvZiB0cmllcworICAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShyICsgYyk7CisgICAgQ0FMTF9TVUJURVNUXzEoKHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8ZG91YmxlPigxLCAxKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgoc3BhcnNlX2Jhc2ljKFNwYXJzZU1hdHJpeDxkb3VibGU+KDgsIDgpKSkpOworICAgIENBTExfU1VCVEVTVF8yKChzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBDb2xNYWpvcj4ociwgYykpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIFJvd01ham9yPihyLCBjKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMigoc3BhcnNlX2Jhc2ljKFNwYXJzZU1hdHJpeDxmbG9hdCwgUm93TWFqb3I+KHIsIGMpKSkpOworICAgIENBTExfU1VCVEVTVF8yKChzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGZsb2F0LCBDb2xNYWpvcj4ociwgYykpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8ZG91YmxlLCBDb2xNYWpvcj4ociwgYykpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8ZG91YmxlLCBSb3dNYWpvcj4ociwgYykpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKHNwYXJzZV9iYXNpYyhTcGFyc2VNYXRyaXg8ZG91YmxlLCBDb2xNYWpvciwgbG9uZyBpbnQ+KHIsIGMpKSkpOworICAgIENBTExfU1VCVEVTVF80KChzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGRvdWJsZSwgUm93TWFqb3IsIGxvbmcgaW50PihyLCBjKSkpKTsKKworICAgIHIgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDEwMCk7CisgICAgYyA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTAwKTsKKyAgICBpZiAoRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigwLCA0KSA9PSAwKSB7CisgICAgICByID0gYzsgIC8vIGNoZWNrIHNxdWFyZSBtYXRyaWNlcyBpbiAyNSUgb2YgdHJpZXMKICAgICB9Ci0gICAgCi0gICAgQ0FMTF9TVUJURVNUXzUoKCBzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGRvdWJsZSxDb2xNYWpvcixzaG9ydCBpbnQ+KHNob3J0KHIpLCBzaG9ydChjKSkpICkpOwotICAgIENBTExfU1VCVEVTVF81KCggc3BhcnNlX2Jhc2ljKFNwYXJzZU1hdHJpeDxkb3VibGUsUm93TWFqb3Isc2hvcnQgaW50PihzaG9ydChyKSwgc2hvcnQoYykpKSApKTsKKworICAgIENBTExfU1VCVEVTVF81KChzcGFyc2VfYmFzaWMoU3BhcnNlTWF0cml4PGRvdWJsZSwgQ29sTWFqb3IsIHNob3J0IGludD4oc2hvcnQociksIHNob3J0KGMpKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoc3BhcnNlX2Jhc2ljKFNwYXJzZU1hdHJpeDxkb3VibGUsIFJvd01ham9yLCBzaG9ydCBpbnQ+KHNob3J0KHIpLCBzaG9ydChjKSkpKSk7CiAgIH0KIAogICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA5MDA6IChtYW51YWxseSBpbnNlcnQgaGlnaGVyIHZhbHVlcyBoZXJlLCBpZiB5b3UgaGF2ZSBlbm91Z2ggUkFNKToKLSAgQ0FMTF9TVUJURVNUXzUoKCBiaWdfc3BhcnNlX3RyaXBsZXQ8U3BhcnNlTWF0cml4PGZsb2F0LCBSb3dNYWpvciwgaW50Pj4oMTAwMDAsIDEwMDAwLCAwLjEyNSkpKTsKLSAgQ0FMTF9TVUJURVNUXzUoKCBiaWdfc3BhcnNlX3RyaXBsZXQ8U3BhcnNlTWF0cml4PGRvdWJsZSwgQ29sTWFqb3IsIGxvbmcgaW50Pj4oMTAwMDAsIDEwMDAwLCAwLjEyNSkpKTsKKyAgQ0FMTF9TVUJURVNUXzUoKGJpZ19zcGFyc2VfdHJpcGxldDxTcGFyc2VNYXRyaXg8ZmxvYXQsIFJvd01ham9yLCBpbnQ+PigxMDAwMCwgMTAwMDAsIDAuMTI1KSkpOworICBDQUxMX1NVQlRFU1RfNSgoYmlnX3NwYXJzZV90cmlwbGV0PFNwYXJzZU1hdHJpeDxkb3VibGUsIENvbE1ham9yLCBsb25nIGludD4+KDEwMDAwLCAxMDAwMCwgMC4xMjUpKSk7CiAKICAgQ0FMTF9TVUJURVNUXzUoYnVnMTEwNTwwPigpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3Qvc3BhcnNlX2Jsb2NrLmNwcCBiL3Rlc3Qvc3BhcnNlX2Jsb2NrLmNwcAppbmRleCA5NTVhYTYwLi5kNGQwMzZhIDEwMDY0NAotLS0gYS90ZXN0L3NwYXJzZV9ibG9jay5jcHAKKysrIGIvdGVzdC9zcGFyc2VfYmxvY2suY3BwCkBAIC0xMCwyMiArMTAsMTggQEAKICNpbmNsdWRlICJzcGFyc2UuaCIKICNpbmNsdWRlICJBbm5veWluZ1NjYWxhci5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RkOjplbmFibGVfaWZfdDwoVDo6RmxhZ3MmUm93TWFqb3JCaXQpPT1Sb3dNYWpvckJpdCwgdHlwZW5hbWUgVDo6Um93WHByPgotaW5uZXJ2ZWMoVCYgQSwgSW5kZXggaSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjplbmFibGVfaWZfdDwoVDo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPT0gUm93TWFqb3JCaXQsIHR5cGVuYW1lIFQ6OlJvd1hwcj4gaW5uZXJ2ZWMoVCYgQSwgSW5kZXggaSkgewogICByZXR1cm4gQS5yb3coaSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdGQ6OmVuYWJsZV9pZl90PChUOjpGbGFncyZSb3dNYWpvckJpdCk9PTAsIHR5cGVuYW1lIFQ6OkNvbFhwcj4KLWlubmVydmVjKFQmIEEsIEluZGV4IGkpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6ZW5hYmxlX2lmX3Q8KFQ6OkZsYWdzICYgUm93TWFqb3JCaXQpID09IDAsIHR5cGVuYW1lIFQ6OkNvbFhwcj4gaW5uZXJ2ZWMoVCYgQSwgSW5kZXggaSkgewogICByZXR1cm4gQS5jb2woaSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+IHZvaWQgc3BhcnNlX2Jsb2NrKGNvbnN0IFNwYXJzZU1hdHJpeFR5cGUmIHJlZikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlPgordm9pZCBzcGFyc2VfYmxvY2soY29uc3QgU3BhcnNlTWF0cml4VHlwZSYgcmVmKSB7CiAgIGNvbnN0IEluZGV4IHJvd3MgPSByZWYucm93cygpOwogICBjb25zdCBJbmRleCBjb2xzID0gcmVmLmNvbHMoKTsKICAgY29uc3QgSW5kZXggaW5uZXIgPSByZWYuaW5uZXJTaXplKCk7CkBAIC0zNSwxMCArMzEsMTAgQEAKICAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKIAotICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKHJvd3MqY29scyksIDAuMDEpOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljLFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3I/Um93TWFqb3I6Q29sTWFqb3I+IERlbnNlTWF0cml4OwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDEsRHluYW1pYz4gUm93RGVuc2VWZWN0b3I7CisgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4LiAvIChyb3dzICogY29scyksIDAuMDEpOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IgPyBSb3dNYWpvciA6IENvbE1ham9yPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBEZW5zZVZlY3RvcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBEeW5hbWljPiBSb3dEZW5zZVZlY3RvcjsKICAgdHlwZWRlZiBTcGFyc2VWZWN0b3I8U2NhbGFyPiBTcGFyc2VWZWN0b3JUeXBlOwogCiAgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwpAQCAtNTAsNzEgKzQ2LDU5IEBACiAgICAgVkVSSUZZX0lTX0FQUFJPWChtLCByZWZNYXQpOwogCiAgICAgLy8gdGVzdCBJbm5lckl0ZXJhdG9ycyBhbmQgQmxvY2sgZXhwcmVzc2lvbnMKLSAgICBmb3IgKGludCB0PTA7IHQ8MTA7ICsrdCkKLSAgICB7Ci0gICAgICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTIpOwotICAgICAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAscm93cy0yKTsKLSAgICAgIEluZGV4IHcgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLGNvbHMtaik7Ci0gICAgICBJbmRleCBoID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxyb3dzLWkpOworICAgIGZvciAoaW50IHQgPSAwOyB0IDwgMTA7ICsrdCkgeworICAgICAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAyKTsKKyAgICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMik7CisgICAgICBJbmRleCB3ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgY29scyAtIGopOworICAgICAgSW5kZXggaCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIHJvd3MgLSBpKTsKIAotICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmJsb2NrKGksaixoLHcpLCByZWZNYXQuYmxvY2soaSxqLGgsdykpOwotICAgICAgZm9yKEluZGV4IGM9MDsgYzx3OyBjKyspCi0gICAgICB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gobS5ibG9jayhpLGosaCx3KS5jb2woYyksIHJlZk1hdC5ibG9jayhpLGosaCx3KS5jb2woYykpOwotICAgICAgICBmb3IoSW5kZXggcj0wOyByPGg7IHIrKykKLSAgICAgICAgewotICAgICAgICAgIFZFUklGWV9JU19BUFBST1gobS5ibG9jayhpLGosaCx3KS5jb2woYykuY29lZmYociksIHJlZk1hdC5ibG9jayhpLGosaCx3KS5jb2woYykuY29lZmYocikpOwotICAgICAgICAgIFZFUklGWV9JU19BUFBST1gobS5ibG9jayhpLGosaCx3KS5jb2VmZihyLGMpLCByZWZNYXQuYmxvY2soaSxqLGgsdykuY29lZmYocixjKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soaSwgaiwgaCwgdyksIHJlZk1hdC5ibG9jayhpLCBqLCBoLCB3KSk7CisgICAgICBmb3IgKEluZGV4IGMgPSAwOyBjIDwgdzsgYysrKSB7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobS5ibG9jayhpLCBqLCBoLCB3KS5jb2woYyksIHJlZk1hdC5ibG9jayhpLCBqLCBoLCB3KS5jb2woYykpOworICAgICAgICBmb3IgKEluZGV4IHIgPSAwOyByIDwgaDsgcisrKSB7CisgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmJsb2NrKGksIGosIGgsIHcpLmNvbChjKS5jb2VmZihyKSwgcmVmTWF0LmJsb2NrKGksIGosIGgsIHcpLmNvbChjKS5jb2VmZihyKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmJsb2NrKGksIGosIGgsIHcpLmNvZWZmKHIsIGMpLCByZWZNYXQuYmxvY2soaSwgaiwgaCwgdykuY29lZmYociwgYykpOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBmb3IoSW5kZXggcj0wOyByPGg7IHIrKykKLSAgICAgIHsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmJsb2NrKGksaixoLHcpLnJvdyhyKSwgcmVmTWF0LmJsb2NrKGksaixoLHcpLnJvdyhyKSk7Ci0gICAgICAgIGZvcihJbmRleCBjPTA7IGM8dzsgYysrKQotICAgICAgICB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmJsb2NrKGksaixoLHcpLnJvdyhyKS5jb2VmZihjKSwgcmVmTWF0LmJsb2NrKGksaixoLHcpLnJvdyhyKS5jb2VmZihjKSk7Ci0gICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmJsb2NrKGksaixoLHcpLmNvZWZmKHIsYyksIHJlZk1hdC5ibG9jayhpLGosaCx3KS5jb2VmZihyLGMpKTsKKyAgICAgIGZvciAoSW5kZXggciA9IDA7IHIgPCBoOyByKyspIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmJsb2NrKGksIGosIGgsIHcpLnJvdyhyKSwgcmVmTWF0LmJsb2NrKGksIGosIGgsIHcpLnJvdyhyKSk7CisgICAgICAgIGZvciAoSW5kZXggYyA9IDA7IGMgPCB3OyBjKyspIHsKKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soaSwgaiwgaCwgdykucm93KHIpLmNvZWZmKGMpLCByZWZNYXQuYmxvY2soaSwgaiwgaCwgdykucm93KHIpLmNvZWZmKGMpKTsKKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYmxvY2soaSwgaiwgaCwgdykuY29lZmYociwgYyksIHJlZk1hdC5ibG9jayhpLCBqLCBoLCB3KS5jb2VmZihyLCBjKSk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIAotICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLm1pZGRsZUNvbHMoaix3KSwgcmVmTWF0Lm1pZGRsZUNvbHMoaix3KSk7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKG0ubWlkZGxlUm93cyhpLGgpLCByZWZNYXQubWlkZGxlUm93cyhpLGgpKTsKLSAgICAgIGZvcihJbmRleCByPTA7IHI8aDsgcisrKQotICAgICAgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0ubWlkZGxlQ29scyhqLHcpLnJvdyhyKSwgcmVmTWF0Lm1pZGRsZUNvbHMoaix3KS5yb3cocikpOwotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0ubWlkZGxlUm93cyhpLGgpLnJvdyhyKSwgcmVmTWF0Lm1pZGRsZVJvd3MoaSxoKS5yb3cocikpOwotICAgICAgICBmb3IoSW5kZXggYz0wOyBjPHc7IGMrKykKLSAgICAgICAgeworCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0ubWlkZGxlQ29scyhqLCB3KSwgcmVmTWF0Lm1pZGRsZUNvbHMoaiwgdykpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLm1pZGRsZVJvd3MoaSwgaCksIHJlZk1hdC5taWRkbGVSb3dzKGksIGgpKTsKKyAgICAgIGZvciAoSW5kZXggciA9IDA7IHIgPCBoOyByKyspIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLm1pZGRsZUNvbHMoaiwgdykucm93KHIpLCByZWZNYXQubWlkZGxlQ29scyhqLCB3KS5yb3cocikpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0ubWlkZGxlUm93cyhpLCBoKS5yb3cociksIHJlZk1hdC5taWRkbGVSb3dzKGksIGgpLnJvdyhyKSk7CisgICAgICAgIGZvciAoSW5kZXggYyA9IDA7IGMgPCB3OyBjKyspIHsKICAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0uY29sKGMpLmNvZWZmKHIpLCByZWZNYXQuY29sKGMpLmNvZWZmKHIpKTsKICAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0ucm93KHIpLmNvZWZmKGMpLCByZWZNYXQucm93KHIpLmNvZWZmKGMpKTsKLSAgICAgICAgICAKLSAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0ubWlkZGxlQ29scyhqLHcpLmNvZWZmKHIsYyksIHJlZk1hdC5taWRkbGVDb2xzKGosdykuY29lZmYocixjKSk7Ci0gICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLm1pZGRsZVJvd3MoaSxoKS5jb2VmZihyLGMpLCByZWZNYXQubWlkZGxlUm93cyhpLGgpLmNvZWZmKHIsYykpOwotICAgICAgICAgIGlmKCFudW1leHQ6OmlzX2V4YWN0bHlfemVybyhtLm1pZGRsZUNvbHMoaiwgdykuY29lZmYociwgYykpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFZFUklGWV9JU19BUFBST1gobS5taWRkbGVDb2xzKGosdykuY29lZmZSZWYocixjKSwgcmVmTWF0Lm1pZGRsZUNvbHMoaix3KS5jb2VmZihyLGMpKTsKKworICAgICAgICAgIFZFUklGWV9JU19BUFBST1gobS5taWRkbGVDb2xzKGosIHcpLmNvZWZmKHIsIGMpLCByZWZNYXQubWlkZGxlQ29scyhqLCB3KS5jb2VmZihyLCBjKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLm1pZGRsZVJvd3MoaSwgaCkuY29lZmYociwgYyksIHJlZk1hdC5taWRkbGVSb3dzKGksIGgpLmNvZWZmKHIsIGMpKTsKKyAgICAgICAgICBpZiAoIW51bWV4dDo6aXNfZXhhY3RseV96ZXJvKG0ubWlkZGxlQ29scyhqLCB3KS5jb2VmZihyLCBjKSkpIHsKKyAgICAgICAgICAgIFZFUklGWV9JU19BUFBST1gobS5taWRkbGVDb2xzKGosIHcpLmNvZWZmUmVmKHIsIGMpLCByZWZNYXQubWlkZGxlQ29scyhqLCB3KS5jb2VmZihyLCBjKSk7CiAgICAgICAgICAgfQotICAgICAgICAgIGlmKCFudW1leHQ6OmlzX2V4YWN0bHlfemVybyhtLm1pZGRsZVJvd3MoaSwgaCkuY29lZmYociwgYykpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFZFUklGWV9JU19BUFBST1gobS5taWRkbGVSb3dzKGksaCkuY29lZmYocixjKSwgcmVmTWF0Lm1pZGRsZVJvd3MoaSxoKS5jb2VmZihyLGMpKTsKKyAgICAgICAgICBpZiAoIW51bWV4dDo6aXNfZXhhY3RseV96ZXJvKG0ubWlkZGxlUm93cyhpLCBoKS5jb2VmZihyLCBjKSkpIHsKKyAgICAgICAgICAgIFZFUklGWV9JU19BUFBST1gobS5taWRkbGVSb3dzKGksIGgpLmNvZWZmKHIsIGMpLCByZWZNYXQubWlkZGxlUm93cyhpLCBoKS5jb2VmZihyLCBjKSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBmb3IoSW5kZXggYz0wOyBjPHc7IGMrKykKLSAgICAgIHsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLm1pZGRsZUNvbHMoaix3KS5jb2woYyksIHJlZk1hdC5taWRkbGVDb2xzKGosdykuY29sKGMpKTsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLm1pZGRsZVJvd3MoaSxoKS5jb2woYyksIHJlZk1hdC5taWRkbGVSb3dzKGksaCkuY29sKGMpKTsKKyAgICAgIGZvciAoSW5kZXggYyA9IDA7IGMgPCB3OyBjKyspIHsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLm1pZGRsZUNvbHMoaiwgdykuY29sKGMpLCByZWZNYXQubWlkZGxlQ29scyhqLCB3KS5jb2woYykpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0ubWlkZGxlUm93cyhpLCBoKS5jb2woYyksIHJlZk1hdC5taWRkbGVSb3dzKGksIGgpLmNvbChjKSk7CiAgICAgICB9CiAgICAgfQogCi0gICAgZm9yKEluZGV4IGM9MDsgYzxjb2xzOyBjKyspCi0gICAgeworICAgIGZvciAoSW5kZXggYyA9IDA7IGMgPCBjb2xzOyBjKyspIHsKICAgICAgIFZFUklGWV9JU19BUFBST1gobS5jb2woYykgKyBtLmNvbChjKSwgKG0gKyBtKS5jb2woYykpOwogICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLmNvbChjKSArIG0uY29sKGMpLCByZWZNYXQuY29sKGMpICsgcmVmTWF0LmNvbChjKSk7CiAgICAgfQogCi0gICAgZm9yKEluZGV4IHI9MDsgcjxyb3dzOyByKyspCi0gICAgeworICAgIGZvciAoSW5kZXggciA9IDA7IHIgPCByb3dzOyByKyspIHsKICAgICAgIFZFUklGWV9JU19BUFBST1gobS5yb3cocikgKyBtLnJvdyhyKSwgKG0gKyBtKS5yb3cocikpOwogICAgICAgVkVSSUZZX0lTX0FQUFJPWChtLnJvdyhyKSArIG0ucm93KHIpLCByZWZNYXQucm93KHIpICsgcmVmTWF0LnJvdyhyKSk7CiAgICAgfQpAQCAtMTI1LDE2ICsxMDksMTYgQEAKICAgICBEZW5zZU1hdHJpeCByZWZNYXQyID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CiAgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCBjb2xzKTsKICAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIpOwotICAgIEluZGV4IGowID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxvdXRlci0xKTsKLSAgICBJbmRleCBqMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsb3V0ZXItMSk7Ci0gICAgSW5kZXggcjAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHJvd3MtMSk7Ci0gICAgSW5kZXggYzAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7CisgICAgSW5kZXggajAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBvdXRlciAtIDEpOworICAgIEluZGV4IGoxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgb3V0ZXIgLSAxKTsKKyAgICBJbmRleCByMCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAxKTsKKyAgICBJbmRleCBjMCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAxKTsKIAotICAgIFZFUklGWV9JU19BUFBST1gobTIuaW5uZXJWZWN0b3IoajApLCBpbm5lcnZlYyhyZWZNYXQyLGowKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcihqMCkrbTIuaW5uZXJWZWN0b3IoajEpLCBpbm5lcnZlYyhyZWZNYXQyLGowKStpbm5lcnZlYyhyZWZNYXQyLGoxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcihqMCksIGlubmVydmVjKHJlZk1hdDIsIGowKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcihqMCkgKyBtMi5pbm5lclZlY3RvcihqMSksIGlubmVydmVjKHJlZk1hdDIsIGowKSArIGlubmVydmVjKHJlZk1hdDIsIGoxKSk7CiAKICAgICBtMi5pbm5lclZlY3RvcihqMCkgKj0gU2NhbGFyKDIpOwotICAgIGlubmVydmVjKHJlZk1hdDIsajApICo9IFNjYWxhcigyKTsKKyAgICBpbm5lcnZlYyhyZWZNYXQyLCBqMCkgKj0gU2NhbGFyKDIpOwogICAgIFZFUklGWV9JU19BUFBST1gobTIsIHJlZk1hdDIpOwogCiAgICAgbTIucm93KHIwKSAqPSBTY2FsYXIoMyk7CkBAIC0xNTQsMzMgKzEzOCwyOSBAQAogICAgIFZFUklGWV9JU19BUFBST1gobTIsIHJlZk1hdDIpOwogCiAgICAgU3BhcnNlVmVjdG9yVHlwZSB2MTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHYxID0gbTIuY29sKGMwKSAqIDQsIHJlZk1hdDIuY29sKGMwKSo0KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHYxID0gbTIucm93KHIwKSAqIDQsIHJlZk1hdDIucm93KHIwKS50cmFuc3Bvc2UoKSo0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxID0gbTIuY29sKGMwKSAqIDQsIHJlZk1hdDIuY29sKGMwKSAqIDQpOworICAgIFZFUklGWV9JU19BUFBST1godjEgPSBtMi5yb3cocjApICogNCwgcmVmTWF0Mi5yb3cocjApLnRyYW5zcG9zZSgpICogNCk7CiAKLSAgICBTcGFyc2VNYXRyaXhUeXBlIG0zKHJvd3MsY29scyk7Ci0gICAgbTMucmVzZXJ2ZShWZWN0b3JYaTo6Q29uc3RhbnQob3V0ZXIsaW50KGlubmVyLzIpKSk7Ci0gICAgZm9yKEluZGV4IGo9MDsgajxvdXRlcjsgKytqKQotICAgICAgZm9yKEluZGV4IGs9MDsgazwoc3RkOjptaW4pKGosaW5uZXIpOyArK2spCi0gICAgICAgIG0zLmluc2VydEJ5T3V0ZXJJbm5lcihqLGspID0gaW50ZXJuYWw6OmNvbnZlcnRfaW5kZXg8U3RvcmFnZUluZGV4PihrKzEpOwotICAgIGZvcihJbmRleCBqPTA7IGo8KHN0ZDo6bWluKShvdXRlciwgaW5uZXIpOyArK2opCi0gICAgewotICAgICAgVkVSSUZZKGo9PW51bWV4dDo6cmVhbChtMy5pbm5lclZlY3RvcihqKS5ub25aZXJvcygpKSk7Ci0gICAgICBpZihqPjApCi0gICAgICAgIFZFUklGWV9JU19FUVVBTChSZWFsU2NhbGFyKGopLCBudW1leHQ6OnJlYWwobTMuaW5uZXJWZWN0b3IoaikubGFzdENvZWZmKCkpKTsKKyAgICBTcGFyc2VNYXRyaXhUeXBlIG0zKHJvd3MsIGNvbHMpOworICAgIG0zLnJlc2VydmUoVmVjdG9yWGk6OkNvbnN0YW50KG91dGVyLCBpbnQoaW5uZXIgLyAyKSkpOworICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBvdXRlcjsgKytqKQorICAgICAgZm9yIChJbmRleCBrID0gMDsgayA8IChzdGQ6Om1pbikoaiwgaW5uZXIpOyArK2spCisgICAgICAgIG0zLmluc2VydEJ5T3V0ZXJJbm5lcihqLCBrKSA9IGludGVybmFsOjpjb252ZXJ0X2luZGV4PFN0b3JhZ2VJbmRleD4oayArIDEpOworICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCAoc3RkOjptaW4pKG91dGVyLCBpbm5lcik7ICsraikgeworICAgICAgVkVSSUZZKGogPT0gbnVtZXh0OjpyZWFsKG0zLmlubmVyVmVjdG9yKGopLm5vblplcm9zKCkpKTsKKyAgICAgIGlmIChqID4gMCkgVkVSSUZZX0lTX0VRVUFMKFJlYWxTY2FsYXIoaiksIG51bWV4dDo6cmVhbChtMy5pbm5lclZlY3RvcihqKS5sYXN0Q29lZmYoKSkpOwogICAgIH0KICAgICBtMy5tYWtlQ29tcHJlc3NlZCgpOwotICAgIGZvcihJbmRleCBqPTA7IGo8KHN0ZDo6bWluKShvdXRlciwgaW5uZXIpOyArK2opCi0gICAgewotICAgICAgVkVSSUZZKGo9PW51bWV4dDo6cmVhbChtMy5pbm5lclZlY3RvcihqKS5ub25aZXJvcygpKSk7Ci0gICAgICBpZihqPjApCi0gICAgICAgIFZFUklGWV9JU19FUVVBTChSZWFsU2NhbGFyKGopLCBudW1leHQ6OnJlYWwobTMuaW5uZXJWZWN0b3IoaikubGFzdENvZWZmKCkpKTsKKyAgICBmb3IgKEluZGV4IGogPSAwOyBqIDwgKHN0ZDo6bWluKShvdXRlciwgaW5uZXIpOyArK2opIHsKKyAgICAgIFZFUklGWShqID09IG51bWV4dDo6cmVhbChtMy5pbm5lclZlY3RvcihqKS5ub25aZXJvcygpKSk7CisgICAgICBpZiAoaiA+IDApIFZFUklGWV9JU19FUVVBTChSZWFsU2NhbGFyKGopLCBudW1leHQ6OnJlYWwobTMuaW5uZXJWZWN0b3IoaikubGFzdENvZWZmKCkpKTsKICAgICB9CiAKICAgICBWRVJJRlkobTMuaW5uZXJWZWN0b3IoajApLm5vblplcm9zKCkgPT0gbTMudHJhbnNwb3NlKCkuaW5uZXJWZWN0b3IoajApLm5vblplcm9zKCkpOwogCi0vLyAgICAgbTIuaW5uZXJWZWN0b3IoajApID0gMiptMi5pbm5lclZlY3RvcihqMSk7Ci0vLyAgICAgcmVmTWF0Mi5jb2woajApID0gMipyZWZNYXQyLmNvbChqMSk7Ci0vLyAgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0Mik7CisgICAgLy8gICAgIG0yLmlubmVyVmVjdG9yKGowKSA9IDIqbTIuaW5uZXJWZWN0b3IoajEpOworICAgIC8vICAgICByZWZNYXQyLmNvbChqMCkgPSAyKnJlZk1hdDIuY29sKGoxKTsKKyAgICAvLyAgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0Mik7CiAgIH0KIAogICAvLyB0ZXN0IGlubmVyVmVjdG9ycygpCkBAIC0xODgsMzEgKzE2OCwzMSBAQAogICAgIERlbnNlTWF0cml4IHJlZk1hdDIgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKICAgICBTcGFyc2VNYXRyaXhUeXBlIG0yKHJvd3MsIGNvbHMpOwogICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMik7Ci0gICAgaWYoaW50ZXJuYWw6OnJhbmRvbTxmbG9hdD4oMCwxKT4wLjVmKSBtMi5tYWtlQ29tcHJlc3NlZCgpOwotICAgIEluZGV4IGowID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxvdXRlci0yKTsKLSAgICBJbmRleCBqMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsb3V0ZXItMik7Ci0gICAgSW5kZXggbjAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLG91dGVyLShzdGQ6Om1heCkoajAsajEpKTsKLSAgICBpZihTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQotICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcnMoajAsbjApLCByZWZNYXQyLmJsb2NrKGowLDAsbjAsY29scykpOworICAgIGlmIChpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigwLCAxKSA+IDAuNWYpIG0yLm1ha2VDb21wcmVzc2VkKCk7CisgICAgSW5kZXggajAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBvdXRlciAtIDIpOworICAgIEluZGV4IGoxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgb3V0ZXIgLSAyKTsKKyAgICBJbmRleCBuMCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIG91dGVyIC0gKHN0ZDo6bWF4KShqMCwgajEpKTsKKyAgICBpZiAoU3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcikKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIuaW5uZXJWZWN0b3JzKGowLCBuMCksIHJlZk1hdDIuYmxvY2soajAsIDAsIG4wLCBjb2xzKSk7CiAgICAgZWxzZQotICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcnMoajAsbjApLCByZWZNYXQyLmJsb2NrKDAsajAscm93cyxuMCkpOwotICAgIGlmKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpCi0gICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmlubmVyVmVjdG9ycyhqMCxuMCkrbTIuaW5uZXJWZWN0b3JzKGoxLG4wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcmVmTWF0Mi5taWRkbGVSb3dzKGowLG4wKStyZWZNYXQyLm1pZGRsZVJvd3MoajEsbjApKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIuaW5uZXJWZWN0b3JzKGowLCBuMCksIHJlZk1hdDIuYmxvY2soMCwgajAsIHJvd3MsIG4wKSk7CisgICAgaWYgKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmlubmVyVmVjdG9ycyhqMCwgbjApICsgbTIuaW5uZXJWZWN0b3JzKGoxLCBuMCksCisgICAgICAgICAgICAgICAgICAgICAgIHJlZk1hdDIubWlkZGxlUm93cyhqMCwgbjApICsgcmVmTWF0Mi5taWRkbGVSb3dzKGoxLCBuMCkpOwogICAgIGVsc2UKLSAgICAgIFZFUklGWV9JU19BUFBST1gobTIuaW5uZXJWZWN0b3JzKGowLG4wKSttMi5pbm5lclZlY3RvcnMoajEsbjApLAotICAgICAgICAgICAgICAgICAgICAgIHJlZk1hdDIuYmxvY2soMCxqMCxyb3dzLG4wKStyZWZNYXQyLmJsb2NrKDAsajEscm93cyxuMCkpOwotICAgIAorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5pbm5lclZlY3RvcnMoajAsIG4wKSArIG0yLmlubmVyVmVjdG9ycyhqMSwgbjApLAorICAgICAgICAgICAgICAgICAgICAgICByZWZNYXQyLmJsb2NrKDAsIGowLCByb3dzLCBuMCkgKyByZWZNYXQyLmJsb2NrKDAsIGoxLCByb3dzLCBuMCkpOworCiAgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0Mik7Ci0gICAgCi0gICAgVkVSSUZZKG0yLmlubmVyVmVjdG9ycyhqMCxuMCkubm9uWmVyb3MoKSA9PSBtMi50cmFuc3Bvc2UoKS5pbm5lclZlY3RvcnMoajAsbjApLm5vblplcm9zKCkpOwotICAgIAotICAgIG0yLmlubmVyVmVjdG9ycyhqMCxuMCkgPSBtMi5pbm5lclZlY3RvcnMoajAsbjApICsgbTIuaW5uZXJWZWN0b3JzKGoxLG4wKTsKLSAgICBpZihTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQotICAgICAgcmVmTWF0Mi5taWRkbGVSb3dzKGowLG4wKSA9IChyZWZNYXQyLm1pZGRsZVJvd3MoajAsbjApICsgcmVmTWF0Mi5taWRkbGVSb3dzKGoxLG4wKSkuZXZhbCgpOworCisgICAgVkVSSUZZKG0yLmlubmVyVmVjdG9ycyhqMCwgbjApLm5vblplcm9zKCkgPT0gbTIudHJhbnNwb3NlKCkuaW5uZXJWZWN0b3JzKGowLCBuMCkubm9uWmVyb3MoKSk7CisKKyAgICBtMi5pbm5lclZlY3RvcnMoajAsIG4wKSA9IG0yLmlubmVyVmVjdG9ycyhqMCwgbjApICsgbTIuaW5uZXJWZWN0b3JzKGoxLCBuMCk7CisgICAgaWYgKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpCisgICAgICByZWZNYXQyLm1pZGRsZVJvd3MoajAsIG4wKSA9IChyZWZNYXQyLm1pZGRsZVJvd3MoajAsIG4wKSArIHJlZk1hdDIubWlkZGxlUm93cyhqMSwgbjApKS5ldmFsKCk7CiAgICAgZWxzZQotICAgICAgcmVmTWF0Mi5taWRkbGVDb2xzKGowLG4wKSA9IChyZWZNYXQyLm1pZGRsZUNvbHMoajAsbjApICsgcmVmTWF0Mi5taWRkbGVDb2xzKGoxLG4wKSkuZXZhbCgpOwotICAgIAorICAgICAgcmVmTWF0Mi5taWRkbGVDb2xzKGowLCBuMCkgPSAocmVmTWF0Mi5taWRkbGVDb2xzKGowLCBuMCkgKyByZWZNYXQyLm1pZGRsZUNvbHMoajEsIG4wKSkuZXZhbCgpOworCiAgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0Mik7CiAgIH0KIApAQCAtMjIxLDgzICsyMDEsNzcgQEAKICAgICBEZW5zZU1hdHJpeCByZWZNYXQyID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CiAgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCBjb2xzKTsKICAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIpOwotICAgIEluZGV4IGowID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxvdXRlci0yKTsKLSAgICBJbmRleCBqMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsb3V0ZXItMik7Ci0gICAgSW5kZXggbjAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLG91dGVyLShzdGQ6Om1heCkoajAsajEpKTsKLSAgICBpZihTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQotICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5ibG9jayhqMCwwLG4wLGNvbHMpLCByZWZNYXQyLmJsb2NrKGowLDAsbjAsY29scykpOworICAgIEluZGV4IGowID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgb3V0ZXIgLSAyKTsKKyAgICBJbmRleCBqMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIG91dGVyIC0gMik7CisgICAgSW5kZXggbjAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBvdXRlciAtIChzdGQ6Om1heCkoajAsIGoxKSk7CisgICAgaWYgKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpCisgICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmJsb2NrKGowLCAwLCBuMCwgY29scyksIHJlZk1hdDIuYmxvY2soajAsIDAsIG4wLCBjb2xzKSk7CiAgICAgZWxzZQotICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5ibG9jaygwLGowLHJvd3MsbjApLCByZWZNYXQyLmJsb2NrKDAsajAscm93cyxuMCkpOwotICAgIAotICAgIGlmKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpCi0gICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmJsb2NrKGowLDAsbjAsY29scykrbTIuYmxvY2soajEsMCxuMCxjb2xzKSwKLSAgICAgICAgICAgICAgICAgICAgICByZWZNYXQyLmJsb2NrKGowLDAsbjAsY29scykrcmVmTWF0Mi5ibG9jayhqMSwwLG4wLGNvbHMpKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIuYmxvY2soMCwgajAsIHJvd3MsIG4wKSwgcmVmTWF0Mi5ibG9jaygwLCBqMCwgcm93cywgbjApKTsKKworICAgIGlmIChTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMi5ibG9jayhqMCwgMCwgbjAsIGNvbHMpICsgbTIuYmxvY2soajEsIDAsIG4wLCBjb2xzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVmTWF0Mi5ibG9jayhqMCwgMCwgbjAsIGNvbHMpICsgcmVmTWF0Mi5ibG9jayhqMSwgMCwgbjAsIGNvbHMpKTsKICAgICBlbHNlCi0gICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmJsb2NrKDAsajAscm93cyxuMCkrbTIuYmxvY2soMCxqMSxyb3dzLG4wKSwKLSAgICAgICAgICAgICAgICAgICAgICByZWZNYXQyLmJsb2NrKDAsajAscm93cyxuMCkrcmVmTWF0Mi5ibG9jaygwLGoxLHJvd3MsbjApKTsKLSAgICAgIAotICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0yLm91dGVyU2l6ZSgpLTEpOwotICAgIGlmKFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3IpIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIuYmxvY2soMCwgajAsIHJvd3MsIG4wKSArIG0yLmJsb2NrKDAsIGoxLCByb3dzLCBuMCksCisgICAgICAgICAgICAgICAgICAgICAgIHJlZk1hdDIuYmxvY2soMCwgajAsIHJvd3MsIG4wKSArIHJlZk1hdDIuYmxvY2soMCwgajEsIHJvd3MsIG4wKSk7CisKKyAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgbTIub3V0ZXJTaXplKCkgLSAxKTsKKyAgICBpZiAoU3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcikgewogICAgICAgbTIuaW5uZXJWZWN0b3IoaSkgPSBtMi5pbm5lclZlY3RvcihpKSAqIHMxOwogICAgICAgcmVmTWF0Mi5yb3coaSkgPSByZWZNYXQyLnJvdyhpKSAqIHMxOwotICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMixyZWZNYXQyKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTIsIHJlZk1hdDIpOwogICAgIH0gZWxzZSB7CiAgICAgICBtMi5pbm5lclZlY3RvcihpKSA9IG0yLmlubmVyVmVjdG9yKGkpICogczE7CiAgICAgICByZWZNYXQyLmNvbChpKSA9IHJlZk1hdDIuY29sKGkpICogczE7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLHJlZk1hdDIpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtMiwgcmVmTWF0Mik7CiAgICAgfQotICAgIAotICAgIEluZGV4IHIwID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTIpOwotICAgIEluZGV4IGMwID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTIpOwotICAgIEluZGV4IHIxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxyb3dzLXIwKTsKLSAgICBJbmRleCBjMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsY29scy1jMCk7Ci0gICAgCisKKyAgICBJbmRleCByMCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MgLSAyKTsKKyAgICBJbmRleCBjMCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAyKTsKKyAgICBJbmRleCByMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIHJvd3MgLSByMCk7CisgICAgSW5kZXggYzEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBjb2xzIC0gYzApOworCiAgICAgVkVSSUZZX0lTX0FQUFJPWChEZW5zZVZlY3RvcihtMi5jb2woYzApKSwgcmVmTWF0Mi5jb2woYzApKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmNvbChjMCksIHJlZk1hdDIuY29sKGMwKSk7Ci0gICAgCisKICAgICBWRVJJRllfSVNfQVBQUk9YKFJvd0RlbnNlVmVjdG9yKG0yLnJvdyhyMCkpLCByZWZNYXQyLnJvdyhyMCkpOwogICAgIFZFUklGWV9JU19BUFBST1gobTIucm93KHIwKSwgcmVmTWF0Mi5yb3cocjApKTsKIAotICAgIFZFUklGWV9JU19BUFBST1gobTIuYmxvY2socjAsYzAscjEsYzEpLCByZWZNYXQyLmJsb2NrKHIwLGMwLHIxLGMxKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgoMiptMikuYmxvY2socjAsYzAscjEsYzEpLCAoMipyZWZNYXQyKS5ibG9jayhyMCxjMCxyMSxjMSkpOworICAgIFZFUklGWV9JU19BUFBST1gobTIuYmxvY2socjAsIGMwLCByMSwgYzEpLCByZWZNYXQyLmJsb2NrKHIwLCBjMCwgcjEsIGMxKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCgoMiAqIG0yKS5ibG9jayhyMCwgYzAsIHIxLCBjMSksICgyICogcmVmTWF0MikuYmxvY2socjAsIGMwLCByMSwgYzEpKTsKIAotICAgIGlmKG0yLm5vblplcm9zKCk+MCkKLSAgICB7CisgICAgaWYgKG0yLm5vblplcm9zKCkgPiAwKSB7CiAgICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCByZWZNYXQyKTsKICAgICAgIFNwYXJzZU1hdHJpeFR5cGUgbTMocm93cywgY29scyk7Ci0gICAgICBEZW5zZU1hdHJpeCByZWZNYXQzKHJvd3MsIGNvbHMpOyByZWZNYXQzLnNldFplcm8oKTsKLSAgICAgIEluZGV4IG4gPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLDEwKTsKLSAgICAgIGZvcihJbmRleCBrPTA7IGs8bjsgKytrKQotICAgICAgewotICAgICAgICBJbmRleCBvMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsb3V0ZXItMSk7Ci0gICAgICAgIEluZGV4IG8yID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxvdXRlci0xKTsKLSAgICAgICAgaWYoU3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcikKLSAgICAgICAgeworICAgICAgRGVuc2VNYXRyaXggcmVmTWF0Myhyb3dzLCBjb2xzKTsKKyAgICAgIHJlZk1hdDMuc2V0WmVybygpOworICAgICAgSW5kZXggbiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIDEwKTsKKyAgICAgIGZvciAoSW5kZXggayA9IDA7IGsgPCBuOyArK2spIHsKKyAgICAgICAgSW5kZXggbzEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBvdXRlciAtIDEpOworICAgICAgICBJbmRleCBvMiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIG91dGVyIC0gMSk7CisgICAgICAgIGlmIChTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKSB7CiAgICAgICAgICAgbTMuaW5uZXJWZWN0b3IobzEpID0gbTIucm93KG8yKTsKICAgICAgICAgICByZWZNYXQzLnJvdyhvMSkgPSByZWZNYXQyLnJvdyhvMik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgbTMuaW5uZXJWZWN0b3IobzEpID0gbTIuY29sKG8yKTsKICAgICAgICAgICByZWZNYXQzLmNvbChvMSkgPSByZWZNYXQyLmNvbChvMik7CiAgICAgICAgIH0KLSAgICAgICAgaWYoaW50ZXJuYWw6OnJhbmRvbTxib29sPigpKQotICAgICAgICAgIG0zLm1ha2VDb21wcmVzc2VkKCk7CisgICAgICAgIGlmIChpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpIG0zLm1ha2VDb21wcmVzc2VkKCk7CiAgICAgICB9Ci0gICAgICBpZihtMy5ub25aZXJvcygpPjApCi0gICAgICBWRVJJRllfSVNfQVBQUk9YKG0zLCByZWZNYXQzKTsKKyAgICAgIGlmIChtMy5ub25aZXJvcygpID4gMCkgVkVSSUZZX0lTX0FQUFJPWChtMywgcmVmTWF0Myk7CiAgICAgfQogICB9Ci0gIAorCiAgIC8vIEV4cGxpY2l0IGlubmVyIGl0ZXJhdG9yLgogICB7CiAgICAgRGVuc2VNYXRyaXggcmVmTWF0MiA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOwogICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgY29scyk7CiAgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yKTsKLSAgICAKLSAgICBJbmRleCBqMCA9aW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgb3V0ZXIgLSAxKTsKKworICAgIEluZGV4IGowID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgb3V0ZXIgLSAxKTsKICAgICBhdXRvIHYgPSBpbm5lcnZlYyhtMiwgajApOwotICAgIAorCiAgICAgdHlwZW5hbWUgZGVjbHR5cGUodik6OklubmVySXRlcmF0b3IgYmxvY2tfaXRlcmF0b3Iodik7CiAgICAgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6SW5uZXJJdGVyYXRvciBtYXRyaXhfaXRlcmF0b3IobTIsIGowKTsKICAgICB3aGlsZSAoYmxvY2tfaXRlcmF0b3IpIHsKQEAgLTMwNSwzOCArMjc5LDM2IEBACiAgICAgICArK2Jsb2NrX2l0ZXJhdG9yOwogICAgICAgKyttYXRyaXhfaXRlcmF0b3I7CiAgICAgfQotCiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHNwYXJzZV9ibG9jaykKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBpbnQgciA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSwyMDApLCBjID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDIwMCk7Ci0gICAgaWYoRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigwLDQpID09IDApIHsKLSAgICAgIHIgPSBjOyAvLyBjaGVjayBzcXVhcmUgbWF0cmljZXMgaW4gMjUlIG9mIHRyaWVzCitFSUdFTl9ERUNMQVJFX1RFU1Qoc3BhcnNlX2Jsb2NrKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIGludCByID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLCAyMDApLCBjID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLCAyMDApOworICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIDQpID09IDApIHsKKyAgICAgIHIgPSBjOyAgLy8gY2hlY2sgc3F1YXJlIG1hdHJpY2VzIGluIDI1JSBvZiB0cmllcwogICAgIH0KLSAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUocitjKTsKLSAgICBDQUxMX1NVQlRFU1RfMSgoIHNwYXJzZV9ibG9jayhTcGFyc2VNYXRyaXg8ZG91YmxlPigxLCAxKSkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoKCBzcGFyc2VfYmxvY2soU3BhcnNlTWF0cml4PGRvdWJsZT4oOCwgOCkpICkpOwotICAgIENBTExfU1VCVEVTVF8xKCggc3BhcnNlX2Jsb2NrKFNwYXJzZU1hdHJpeDxkb3VibGU+KHIsIGMpKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMigoIHNwYXJzZV9ibG9jayhTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIENvbE1ham9yPihyLCBjKSkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoKCBzcGFyc2VfYmxvY2soU3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBSb3dNYWpvcj4ociwgYykpICkpOwotICAgIAotICAgIENBTExfU1VCVEVTVF8zKCggc3BhcnNlX2Jsb2NrKFNwYXJzZU1hdHJpeDxkb3VibGUsQ29sTWFqb3IsbG9uZyBpbnQ+KHIsIGMpKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMygoIHNwYXJzZV9ibG9jayhTcGFyc2VNYXRyaXg8ZG91YmxlLFJvd01ham9yLGxvbmcgaW50PihyLCBjKSkgKSk7Ci0gICAgCi0gICAgciA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxMDApOwotICAgIGMgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTAwKTsKLSAgICBpZihFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsNCkgPT0gMCkgewotICAgICAgciA9IGM7IC8vIGNoZWNrIHNxdWFyZSBtYXRyaWNlcyBpbiAyNSUgb2YgdHJpZXMKKyAgICBFSUdFTl9VTlVTRURfVkFSSUFCTEUociArIGMpOworICAgIENBTExfU1VCVEVTVF8xKChzcGFyc2VfYmxvY2soU3BhcnNlTWF0cml4PGRvdWJsZT4oMSwgMSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoKHNwYXJzZV9ibG9jayhTcGFyc2VNYXRyaXg8ZG91YmxlPig4LCA4KSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgoc3BhcnNlX2Jsb2NrKFNwYXJzZU1hdHJpeDxkb3VibGU+KHIsIGMpKSkpOworICAgIENBTExfU1VCVEVTVF8yKChzcGFyc2VfYmxvY2soU3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBDb2xNYWpvcj4ociwgYykpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKHNwYXJzZV9ibG9jayhTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIFJvd01ham9yPihyLCBjKSkpKTsKKworICAgIENBTExfU1VCVEVTVF8zKChzcGFyc2VfYmxvY2soU3BhcnNlTWF0cml4PGRvdWJsZSwgQ29sTWFqb3IsIGxvbmcgaW50PihyLCBjKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoc3BhcnNlX2Jsb2NrKFNwYXJzZU1hdHJpeDxkb3VibGUsIFJvd01ham9yLCBsb25nIGludD4ociwgYykpKSk7CisKKyAgICByID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLCAxMDApOworICAgIGMgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDEwMCk7CisgICAgaWYgKEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgNCkgPT0gMCkgeworICAgICAgciA9IGM7ICAvLyBjaGVjayBzcXVhcmUgbWF0cmljZXMgaW4gMjUlIG9mIHRyaWVzCiAgICAgfQotICAgIAotICAgIENBTExfU1VCVEVTVF80KCggc3BhcnNlX2Jsb2NrKFNwYXJzZU1hdHJpeDxkb3VibGUsQ29sTWFqb3Isc2hvcnQgaW50PihzaG9ydChyKSwgc2hvcnQoYykpKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfNCgoIHNwYXJzZV9ibG9jayhTcGFyc2VNYXRyaXg8ZG91YmxlLFJvd01ham9yLHNob3J0IGludD4oc2hvcnQociksIHNob3J0KGMpKSkgKSk7CisKKyAgICBDQUxMX1NVQlRFU1RfNCgoc3BhcnNlX2Jsb2NrKFNwYXJzZU1hdHJpeDxkb3VibGUsIENvbE1ham9yLCBzaG9ydCBpbnQ+KHNob3J0KHIpLCBzaG9ydChjKSkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKHNwYXJzZV9ibG9jayhTcGFyc2VNYXRyaXg8ZG91YmxlLCBSb3dNYWpvciwgc2hvcnQgaW50PihzaG9ydChyKSwgc2hvcnQoYykpKSkpOwogI2lmbmRlZiBFSUdFTl9URVNUX0FOTk9ZSU5HX1NDQUxBUl9ET05UX1RIUk9XCiAgICAgQW5ub3lpbmdTY2FsYXI6OmRvbnRfdGhyb3cgPSB0cnVlOwogI2VuZGlmCi0gICAgQ0FMTF9TVUJURVNUXzUoKCAgc3BhcnNlX2Jsb2NrKFNwYXJzZU1hdHJpeDxBbm5veWluZ1NjYWxhcj4ocixjKSkgKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKHNwYXJzZV9ibG9jayhTcGFyc2VNYXRyaXg8QW5ub3lpbmdTY2FsYXI+KHIsIGMpKSkpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZV9wZXJtdXRhdGlvbnMuY3BwIGIvdGVzdC9zcGFyc2VfcGVybXV0YXRpb25zLmNwcAppbmRleCAzZTQ2YmZhLi4xNjU3MjM2IDEwMDY0NAotLS0gYS90ZXN0L3NwYXJzZV9wZXJtdXRhdGlvbnMuY3BwCisrKyBiL3Rlc3Qvc3BhcnNlX3Blcm11dGF0aW9ucy5jcHAKQEAgLTcsMTU1ICs3LDE1MSBAQAogLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCiAvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KIAotCiBzdGF0aWMgbG9uZyBpbnQgbmJfdHJhbnNwb3NlZF9jb3BpZXM7Ci0jZGVmaW5lIEVJR0VOX1NQQVJTRV9UUkFOU1BPU0VEX0NPUFlfUExVR0lOIHtuYl90cmFuc3Bvc2VkX2NvcGllcysrO30KLSNkZWZpbmUgVkVSSUZZX1RSQU5TUE9TSVRJT05fQ09VTlQoWFBSLE4pIHtcCi0gICAgbmJfdHJhbnNwb3NlZF9jb3BpZXMgPSAwOyBcCi0gICAgWFBSOyBcCi0gICAgaWYobmJfdHJhbnNwb3NlZF9jb3BpZXMhPU4pIHN0ZDo6Y2VyciA8PCAibmJfdHJhbnNwb3NlZF9jb3BpZXMgPT0gIiA8PCBuYl90cmFuc3Bvc2VkX2NvcGllcyA8PCAiXG4iOyBcCi0gICAgVkVSSUZZKCAoI1hQUikgJiYgbmJfdHJhbnNwb3NlZF9jb3BpZXM9PU4gKTsgXAorI2RlZmluZSBFSUdFTl9TUEFSU0VfVFJBTlNQT1NFRF9DT1BZX1BMVUdJTiBcCisgIHsgbmJfdHJhbnNwb3NlZF9jb3BpZXMrKzsgfQorI2RlZmluZSBWRVJJRllfVFJBTlNQT1NJVElPTl9DT1VOVChYUFIsIE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5iX3RyYW5zcG9zZWRfY29waWVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFhQUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChuYl90cmFuc3Bvc2VkX2NvcGllcyAhPSBOKSBzdGQ6OmNlcnIgPDwgIm5iX3RyYW5zcG9zZWRfY29waWVzID09ICIgPDwgbmJfdHJhbnNwb3NlZF9jb3BpZXMgPDwgIlxuIjsgXAorICAgIFZFUklGWSgoI1hQUikgJiYgbmJfdHJhbnNwb3NlZF9jb3BpZXMgPT0gTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CiAKIHN0YXRpYyBsb25nIGludCBuYl90ZW1wb3JhcmllczsKLSNkZWZpbmUgRUlHRU5fU1BBUlNFX0NSRUFURV9URU1QT1JBUllfUExVR0lOIHtuYl90ZW1wb3JhcmllcysrO30KLSNkZWZpbmUgVkVSSUZZX1RFTVBPUkFSWV9DT1VOVChYUFIsTikge1wKLSAgICBuYl90ZW1wb3JhcmllcyA9IDA7IFwKLSAgICBYUFI7IFwKLSAgICBpZihuYl90ZW1wb3JhcmllcyE9Tikgc3RkOjpjZXJyIDw8ICJuYl90ZW1wb3JhcmllcyA9PSAiIDw8IG5iX3RlbXBvcmFyaWVzIDw8ICJcbiI7IFwKLSAgICBWRVJJRlkoICgjWFBSKSAmJiBuYl90ZW1wb3Jhcmllcz09TiApOyBcCisjZGVmaW5lIEVJR0VOX1NQQVJTRV9DUkVBVEVfVEVNUE9SQVJZX1BMVUdJTiBcCisgIHsgbmJfdGVtcG9yYXJpZXMrKzsgfQorI2RlZmluZSBWRVJJRllfVEVNUE9SQVJZX0NPVU5UKFhQUiwgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5iX3RlbXBvcmFyaWVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFhQUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChuYl90ZW1wb3JhcmllcyAhPSBOKSBzdGQ6OmNlcnIgPDwgIm5iX3RlbXBvcmFyaWVzID09ICIgPDwgbmJfdGVtcG9yYXJpZXMgPDwgIlxuIjsgXAorICAgIFZFUklGWSgoI1hQUikgJiYgbmJfdGVtcG9yYXJpZXMgPT0gTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CiAKICNpbmNsdWRlICJzcGFyc2UuaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogYm9vbCBpc19zb3J0ZWQoY29uc3QgVCYgbWF0KSB7Ci0gIGZvcihJbmRleCBrID0gMDsgazxtYXQub3V0ZXJTaXplKCk7ICsraykKLSAgeworICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgbWF0Lm91dGVyU2l6ZSgpOyArK2spIHsKICAgICBJbmRleCBwcmV2ID0gLTE7Ci0gICAgZm9yKHR5cGVuYW1lIFQ6OklubmVySXRlcmF0b3IgaXQobWF0LGspOyBpdDsgKytpdCkKLSAgICB7Ci0gICAgICBpZihwcmV2Pj1pdC5pbmRleCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgZm9yICh0eXBlbmFtZSBUOjpJbm5lckl0ZXJhdG9yIGl0KG1hdCwgayk7IGl0OyArK2l0KSB7CisgICAgICBpZiAocHJldiA+PSBpdC5pbmRleCgpKSByZXR1cm4gZmFsc2U7CiAgICAgICBwcmV2ID0gaXQuaW5kZXgoKTsKICAgICB9CiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8VCwxPjo6dHlwZSBldmFsKGNvbnN0IFQgJnhwcikKLXsKLSAgVkVSSUZZKCBpbnQoaW50ZXJuYWw6Om5lc3RlZF9ldmFsPFQsMT46OnR5cGU6OkZsYWdzJlJvd01ham9yQml0KSA9PSBpbnQoaW50ZXJuYWw6OmV2YWx1YXRvcjxUPjo6RmxhZ3MmUm93TWFqb3JCaXQpICk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIGludGVybmFsOjpuZXN0ZWRfZXZhbDxULCAxPjo6dHlwZSBldmFsKGNvbnN0IFQmIHhwcikgeworICBWRVJJRlkoaW50KGludGVybmFsOjpuZXN0ZWRfZXZhbDxULCAxPjo6dHlwZTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPT0KKyAgICAgICAgIGludChpbnRlcm5hbDo6ZXZhbHVhdG9yPFQ+OjpGbGFncyAmIFJvd01ham9yQml0KSk7CiAgIHJldHVybiB4cHI7CiB9CiAKLXRlbXBsYXRlPGludCBPdGhlclN0b3JhZ2UsIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+IHZvaWQgc3BhcnNlX3Blcm11dGF0aW9ucyhjb25zdCBTcGFyc2VNYXRyaXhUeXBlJiByZWYpCi17Cit0ZW1wbGF0ZSA8aW50IE90aGVyU3RvcmFnZSwgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZT4KK3ZvaWQgc3BhcnNlX3Blcm11dGF0aW9ucyhjb25zdCBTcGFyc2VNYXRyaXhUeXBlJiByZWYpIHsKICAgY29uc3QgSW5kZXggcm93cyA9IHJlZi5yb3dzKCk7CiAgIGNvbnN0IEluZGV4IGNvbHMgPSByZWYuY29scygpOwogICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLCBPdGhlclN0b3JhZ2UsIFN0b3JhZ2VJbmRleD4gT3RoZXJTcGFyc2VNYXRyaXhUeXBlOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdHJpeDsKLSAgdHlwZWRlZiBNYXRyaXg8U3RvcmFnZUluZGV4LER5bmFtaWMsMT4gVmVjdG9ySTsKLS8vICAgYm9vbCBJc1Jvd01ham9yMSA9IFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3I7Ci0vLyAgIGJvb2wgSXNSb3dNYWpvcjIgPSBPdGhlclNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3I7Ci0gIAotICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vc3RhdGljX2Nhc3Q8ZG91YmxlPihyb3dzKmNvbHMpLCAwLjAxKTsKLSAgCi0gIFNwYXJzZU1hdHJpeFR5cGUgbWF0KHJvd3MsIGNvbHMpLCB1cChyb3dzLGNvbHMpLCBsbyhyb3dzLGNvbHMpOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTdG9yYWdlSW5kZXgsIER5bmFtaWMsIDE+IFZlY3Rvckk7CisgIC8vICAgYm9vbCBJc1Jvd01ham9yMSA9IFNwYXJzZU1hdHJpeFR5cGU6OklzUm93TWFqb3I7CisgIC8vICAgYm9vbCBJc1Jvd01ham9yMiA9IE90aGVyU3BhcnNlTWF0cml4VHlwZTo6SXNSb3dNYWpvcjsKKworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4gLyBzdGF0aWNfY2FzdDxkb3VibGU+KHJvd3MgKiBjb2xzKSwgMC4wMSk7CisKKyAgU3BhcnNlTWF0cml4VHlwZSBtYXQocm93cywgY29scyksIHVwKHJvd3MsIGNvbHMpLCBsbyhyb3dzLCBjb2xzKTsKICAgT3RoZXJTcGFyc2VNYXRyaXhUeXBlIHJlczsKICAgRGVuc2VNYXRyaXggbWF0X2QgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKSwgdXBfc3ltX2QsIGxvX3N5bV9kLCByZXNfZDsKLSAgCisKICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIG1hdF9kLCBtYXQsIDApOwogCiAgIHVwID0gbWF0LnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOwogICBsbyA9IG1hdC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKLSAgCisKICAgdXBfc3ltX2QgPSBtYXRfZC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCk7CiAgIGxvX3N5bV9kID0gbWF0X2QudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpOwotICAKKwogICBWRVJJRllfSVNfQVBQUk9YKG1hdCwgbWF0X2QpOwogICBWRVJJRllfSVNfQVBQUk9YKHVwLCBEZW5zZU1hdHJpeChtYXRfZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSkpOwogICBWRVJJRllfSVNfQVBQUk9YKGxvLCBEZW5zZU1hdHJpeChtYXRfZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSkpOwotICAKKwogICBQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljPiBwLCBwX251bGw7CiAgIFZlY3RvckkgcGk7CiAgIHJhbmRvbVBlcm11dGF0aW9uVmVjdG9yKHBpLCBjb2xzKTsKICAgcC5pbmRpY2VzKCkgPSBwaTsKIAotICBWRVJJRlkoIGlzX3NvcnRlZCggOjpldmFsKG1hdCpwKSApKTsKLSAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IG1hdCpwICkpOwotICBWRVJJRllfVFJBTlNQT1NJVElPTl9DT1VOVCggOjpldmFsKG1hdCpwKSwgMCk7Ci0gIFZFUklGWV9URU1QT1JBUllfQ09VTlQoICAgICA6OmV2YWwobWF0KnApLCAxKQotICByZXNfZCA9IG1hdF9kKnA7CisgIFZFUklGWShpc19zb3J0ZWQoOjpldmFsKG1hdCAqIHApKSk7CisgIFZFUklGWShpc19zb3J0ZWQocmVzID0gbWF0ICogcCkpOworICBWRVJJRllfVFJBTlNQT1NJVElPTl9DT1VOVCg6OmV2YWwobWF0ICogcCksIDApOworICBWRVJJRllfVEVNUE9SQVJZX0NPVU5UKDo6ZXZhbChtYXQgKiBwKSwgMSkKKyAgcmVzX2QgPSBtYXRfZCAqIHA7CiAgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJtYXQqcCIpOwogCi0gIFZFUklGWSggaXNfc29ydGVkKCA6OmV2YWwocCptYXQpICkpOwotICBWRVJJRlkoIGlzX3NvcnRlZCggcmVzID0gcCptYXQgKSk7Ci0gIFZFUklGWV9UUkFOU1BPU0lUSU9OX0NPVU5UKCA6OmV2YWwocCptYXQpLCAwKTsKLSAgVkVSSUZZX1RFTVBPUkFSWV9DT1VOVCggICAgIDo6ZXZhbChwKm1hdCksIDEpOwotICByZXNfZCA9IHAqbWF0X2Q7CisgIFZFUklGWShpc19zb3J0ZWQoOjpldmFsKHAgKiBtYXQpKSk7CisgIFZFUklGWShpc19zb3J0ZWQocmVzID0gcCAqIG1hdCkpOworICBWRVJJRllfVFJBTlNQT1NJVElPTl9DT1VOVCg6OmV2YWwocCAqIG1hdCksIDApOworICBWRVJJRllfVEVNUE9SQVJZX0NPVU5UKDo6ZXZhbChwICogbWF0KSwgMSk7CisgIHJlc19kID0gcCAqIG1hdF9kOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAicCptYXQiKTsKIAotICBWRVJJRlkoIGlzX3NvcnRlZCggKG1hdCpwKS5ldmFsKCkgKSk7Ci0gIFZFUklGWSggaXNfc29ydGVkKCByZXMgPSBtYXQqcC5pbnZlcnNlKCkgKSk7Ci0gIFZFUklGWV9UUkFOU1BPU0lUSU9OX0NPVU5UKCA6OmV2YWwobWF0KnAuaW52ZXJzZSgpKSwgMCk7Ci0gIFZFUklGWV9URU1QT1JBUllfQ09VTlQoICAgICA6OmV2YWwobWF0KnAuaW52ZXJzZSgpKSwgMSk7Ci0gIHJlc19kID0gbWF0KnAuaW52ZXJzZSgpOworICBWRVJJRlkoaXNfc29ydGVkKChtYXQgKiBwKS5ldmFsKCkpKTsKKyAgVkVSSUZZKGlzX3NvcnRlZChyZXMgPSBtYXQgKiBwLmludmVyc2UoKSkpOworICBWRVJJRllfVFJBTlNQT1NJVElPTl9DT1VOVCg6OmV2YWwobWF0ICogcC5pbnZlcnNlKCkpLCAwKTsKKyAgVkVSSUZZX1RFTVBPUkFSWV9DT1VOVCg6OmV2YWwobWF0ICogcC5pbnZlcnNlKCkpLCAxKTsKKyAgcmVzX2QgPSBtYXQgKiBwLmludmVyc2UoKTsKICAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgIm1hdCppbnYocCkiKTsKIAotICBWRVJJRlkoIGlzX3NvcnRlZCggKHAqbWF0K3AqbWF0KS5ldmFsKCkgKSk7Ci0gIFZFUklGWSggaXNfc29ydGVkKCByZXMgPSBwLmludmVyc2UoKSptYXQgKSk7Ci0gIFZFUklGWV9UUkFOU1BPU0lUSU9OX0NPVU5UKCA6OmV2YWwocC5pbnZlcnNlKCkqbWF0KSwgMCk7Ci0gIFZFUklGWV9URU1QT1JBUllfQ09VTlQoICAgICA6OmV2YWwocC5pbnZlcnNlKCkqbWF0KSwgMSk7Ci0gIHJlc19kID0gcC5pbnZlcnNlKCkqbWF0X2Q7CisgIFZFUklGWShpc19zb3J0ZWQoKHAgKiBtYXQgKyBwICogbWF0KS5ldmFsKCkpKTsKKyAgVkVSSUZZKGlzX3NvcnRlZChyZXMgPSBwLmludmVyc2UoKSAqIG1hdCkpOworICBWRVJJRllfVFJBTlNQT1NJVElPTl9DT1VOVCg6OmV2YWwocC5pbnZlcnNlKCkgKiBtYXQpLCAwKTsKKyAgVkVSSUZZX1RFTVBPUkFSWV9DT1VOVCg6OmV2YWwocC5pbnZlcnNlKCkgKiBtYXQpLCAxKTsKKyAgcmVzX2QgPSBwLmludmVyc2UoKSAqIG1hdF9kOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiaW52KHApKm1hdCIpOwogCiAgIC8vCiAKLSAgVkVSSUZZKCBpc19zb3J0ZWQoIChwICogbWF0ICogcC5pbnZlcnNlKCkpLmV2YWwoKSApKTsKLSAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IG1hdC50d2lzdGVkQnkocCkgKSk7Ci0gIFZFUklGWV9UUkFOU1BPU0lUSU9OX0NPVU5UKCA6OmV2YWwocCAqIG1hdCAqIHAuaW52ZXJzZSgpKSwgMCk7CisgIFZFUklGWShpc19zb3J0ZWQoKHAgKiBtYXQgKiBwLmludmVyc2UoKSkuZXZhbCgpKSk7CisgIFZFUklGWShpc19zb3J0ZWQocmVzID0gbWF0LnR3aXN0ZWRCeShwKSkpOworICBWRVJJRllfVFJBTlNQT1NJVElPTl9DT1VOVCg6OmV2YWwocCAqIG1hdCAqIHAuaW52ZXJzZSgpKSwgMCk7CiAgIHJlc19kID0gKHAgKiBtYXRfZCkgKiBwLmludmVyc2UoKTsKICAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgInAqbWF0KmludihwKSIpOwogCi0gIAotICBWRVJJRlkoIGlzX3NvcnRlZCggcmVzID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkocF9udWxsKSApKTsKLSAgcmVzX2QgPSB1cF9zeW1fZDsKLSAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgdXBwZXIgdG8gZnVsbCIpOwotICAKLSAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KHBfbnVsbCkgKSk7Ci0gIHJlc19kID0gbG9fc3ltX2Q7Ci0gIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJmdWxsIHNlbGZhZGpvaW50IGxvd2VyIHRvIGZ1bGwiKTsKLSAgCi0gIAotICBWRVJJRlkoIGlzX3NvcnRlZCggcmVzID0gdXAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShwX251bGwpICkpOwotICByZXNfZCA9IHVwX3N5bV9kOwotICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAidXBwZXIgc2VsZmFkam9pbnQgdG8gZnVsbCIpOwotICAKLSAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IGxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS50d2lzdGVkQnkocF9udWxsKSApKTsKLSAgcmVzX2QgPSBsb19zeW1fZDsKLSAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImxvd2VyIHNlbGZhZGpvaW50IGZ1bGwiKTsKLQotCi0gIFZFUklGWSggaXNfc29ydGVkKCByZXMgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICkpOworICBWRVJJRlkoaXNfc29ydGVkKHJlcyA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkudHdpc3RlZEJ5KHBfbnVsbCkpKTsKICAgcmVzX2QgPSB1cF9zeW1fZDsKICAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgdXBwZXIgdG8gZnVsbCIpOwogCi0gIFZFUklGWSggaXNfc29ydGVkKCByZXMgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICkpOworICBWRVJJRlkoaXNfc29ydGVkKHJlcyA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KHBfbnVsbCkpKTsKICAgcmVzX2QgPSBsb19zeW1fZDsKICAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgbG93ZXIgdG8gZnVsbCIpOwogCi0gIFZFUklGWSggaXNfc29ydGVkKCByZXMgPSB1cC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgKSk7CisgIFZFUklGWShpc19zb3J0ZWQocmVzID0gdXAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShwX251bGwpKSk7CiAgIHJlc19kID0gdXBfc3ltX2Q7CiAgIFZFUklGWShyZXMuaXNBcHByb3gocmVzX2QpICYmICJ1cHBlciBzZWxmYWRqb2ludCB0byBmdWxsIik7CiAKLSAgVkVSSUZZKCBpc19zb3J0ZWQoIHJlcyA9IGxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSApKTsKKyAgVkVSSUZZKGlzX3NvcnRlZChyZXMgPSBsby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KHBfbnVsbCkpKTsKICAgcmVzX2QgPSBsb19zeW1fZDsKICAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImxvd2VyIHNlbGZhZGpvaW50IGZ1bGwiKTsKIAorICBWRVJJRlkoaXNfc29ydGVkKHJlcyA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkpKTsKKyAgcmVzX2QgPSB1cF9zeW1fZDsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgdXBwZXIgdG8gZnVsbCIpOworCisgIFZFUklGWShpc19zb3J0ZWQocmVzID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSkpOworICByZXNfZCA9IGxvX3N5bV9kOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCBsb3dlciB0byBmdWxsIik7CisKKyAgVkVSSUZZKGlzX3NvcnRlZChyZXMgPSB1cC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkpKTsKKyAgcmVzX2QgPSB1cF9zeW1fZDsKKyAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgInVwcGVyIHNlbGZhZGpvaW50IHRvIGZ1bGwiKTsKKworICBWRVJJRlkoaXNfc29ydGVkKHJlcyA9IGxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSkpOworICByZXNfZCA9IGxvX3N5bV9kOworICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAibG93ZXIgc2VsZmFkam9pbnQgZnVsbCIpOwogCiAgIHJlcy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpOwogICByZXNfZCA9IHVwX3N5bV9kLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOwpAQCAtMTczLDc4ICsxNjksNzcgQEAKICAgcmVzX2QgPSBsb19zeW1fZC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKTsKICAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgbG93ZXIgdG8gbG93ZXIiKTsKIAotICAKLSAgCiAgIHJlcy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShwKTsKICAgcmVzX2QgPSAoKHAgKiB1cF9zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCB1cHBlciB0d2lzdGVkIHRvIHVwcGVyIik7Ci0gIAorCiAgIHJlcy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnR3aXN0ZWRCeShwKTsKICAgcmVzX2QgPSAoKHAgKiBsb19zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCBsb3dlciB0d2lzdGVkIHRvIHVwcGVyIik7Ci0gIAorCiAgIHJlcy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnR3aXN0ZWRCeShwKTsKICAgcmVzX2QgPSAoKHAgKiBsb19zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCBsb3dlciB0d2lzdGVkIHRvIGxvd2VyIik7Ci0gIAorCiAgIHJlcy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShwKTsKICAgcmVzX2QgPSAoKHAgKiB1cF9zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCB1cHBlciB0d2lzdGVkIHRvIGxvd2VyIik7Ci0gIAotICAKKwogICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpID0gdXAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShwKTsKICAgcmVzX2QgPSAoKHAgKiB1cF9zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAidXBwZXIgc2VsZmFkam9pbnQgdHdpc3RlZCB0byB1cHBlciIpOwotICAKKwogICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpID0gbG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnR3aXN0ZWRCeShwKTsKICAgcmVzX2QgPSAoKHAgKiBsb19zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAibG93ZXIgc2VsZmFkam9pbnQgdHdpc3RlZCB0byB1cHBlciIpOwotICAKKwogICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gbG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnR3aXN0ZWRCeShwKTsKICAgcmVzX2QgPSAoKHAgKiBsb19zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAibG93ZXIgc2VsZmFkam9pbnQgdHdpc3RlZCB0byBsb3dlciIpOwotICAKKwogICByZXMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpID0gdXAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShwKTsKICAgcmVzX2QgPSAoKHAgKiB1cF9zeW1fZCkgKiBwLmludmVyc2UoKSkuZXZhbCgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAidXBwZXIgc2VsZmFkam9pbnQgdHdpc3RlZCB0byBsb3dlciIpOwogCi0gIAotICBWRVJJRlkoIGlzX3NvcnRlZCggcmVzID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkocCkgKSk7CisgIFZFUklGWShpc19zb3J0ZWQocmVzID0gbWF0LnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkocCkpKTsKICAgcmVzX2QgPSAocCAqIHVwX3N5bV9kKSAqIHAuaW52ZXJzZSgpOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAiZnVsbCBzZWxmYWRqb2ludCB1cHBlciB0d2lzdGVkIHRvIGZ1bGwiKTsKLSAgCi0gIFZFUklGWSggaXNfc29ydGVkKCByZXMgPSBtYXQudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnR3aXN0ZWRCeShwKSApKTsKKworICBWRVJJRlkoaXNfc29ydGVkKHJlcyA9IG1hdC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudHdpc3RlZEJ5KHApKSk7CiAgIHJlc19kID0gKHAgKiBsb19zeW1fZCkgKiBwLmludmVyc2UoKTsKICAgVkVSSUZZKHJlcy5pc0FwcHJveChyZXNfZCkgJiYgImZ1bGwgc2VsZmFkam9pbnQgbG93ZXIgdHdpc3RlZCB0byBmdWxsIik7Ci0gIAotICBWRVJJRlkoIGlzX3NvcnRlZCggcmVzID0gdXAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnR3aXN0ZWRCeShwKSApKTsKKworICBWRVJJRlkoaXNfc29ydGVkKHJlcyA9IHVwLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS50d2lzdGVkQnkocCkpKTsKICAgcmVzX2QgPSAocCAqIHVwX3N5bV9kKSAqIHAuaW52ZXJzZSgpOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAidXBwZXIgc2VsZmFkam9pbnQgdHdpc3RlZCB0byBmdWxsIik7Ci0gIAotICBWRVJJRlkoIGlzX3NvcnRlZCggcmVzID0gbG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnR3aXN0ZWRCeShwKSApKTsKKworICBWRVJJRlkoaXNfc29ydGVkKHJlcyA9IGxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS50d2lzdGVkQnkocCkpKTsKICAgcmVzX2QgPSAocCAqIGxvX3N5bV9kKSAqIHAuaW52ZXJzZSgpOwogICBWRVJJRlkocmVzLmlzQXBwcm94KHJlc19kKSAmJiAibG93ZXIgc2VsZmFkam9pbnQgdHdpc3RlZCB0byBmdWxsIik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBzcGFyc2VfcGVybXV0YXRpb25zX2FsbChpbnQgc2l6ZSkKLXsKLSAgQ0FMTF9TVUJURVNUKCggc3BhcnNlX3Blcm11dGF0aW9uczxDb2xNYWpvcj4oU3BhcnNlTWF0cml4PFNjYWxhciwgQ29sTWFqb3I+KHNpemUsc2l6ZSkpICkpOwotICBDQUxMX1NVQlRFU1QoKCBzcGFyc2VfcGVybXV0YXRpb25zPENvbE1ham9yPihTcGFyc2VNYXRyaXg8U2NhbGFyLCBSb3dNYWpvcj4oc2l6ZSxzaXplKSkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHNwYXJzZV9wZXJtdXRhdGlvbnM8Um93TWFqb3I+KFNwYXJzZU1hdHJpeDxTY2FsYXIsIENvbE1ham9yPihzaXplLHNpemUpKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggc3BhcnNlX3Blcm11dGF0aW9uczxSb3dNYWpvcj4oU3BhcnNlTWF0cml4PFNjYWxhciwgUm93TWFqb3I+KHNpemUsc2l6ZSkpICkpOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgc3BhcnNlX3Blcm11dGF0aW9uc19hbGwoaW50IHNpemUpIHsKKyAgQ0FMTF9TVUJURVNUKChzcGFyc2VfcGVybXV0YXRpb25zPENvbE1ham9yPihTcGFyc2VNYXRyaXg8U2NhbGFyLCBDb2xNYWpvcj4oc2l6ZSwgc2l6ZSkpKSk7CisgIENBTExfU1VCVEVTVCgoc3BhcnNlX3Blcm11dGF0aW9uczxDb2xNYWpvcj4oU3BhcnNlTWF0cml4PFNjYWxhciwgUm93TWFqb3I+KHNpemUsIHNpemUpKSkpOworICBDQUxMX1NVQlRFU1QoKHNwYXJzZV9wZXJtdXRhdGlvbnM8Um93TWFqb3I+KFNwYXJzZU1hdHJpeDxTY2FsYXIsIENvbE1ham9yPihzaXplLCBzaXplKSkpKTsKKyAgQ0FMTF9TVUJURVNUKChzcGFyc2VfcGVybXV0YXRpb25zPFJvd01ham9yPihTcGFyc2VNYXRyaXg8U2NhbGFyLCBSb3dNYWpvcj4oc2l6ZSwgc2l6ZSkpKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChzcGFyc2VfcGVybXV0YXRpb25zKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIGludCBzID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDUwKTsKLSAgICBDQUxMX1NVQlRFU1RfMSgoICBzcGFyc2VfcGVybXV0YXRpb25zX2FsbDxkb3VibGU+KHMpICkpOwotICAgIENBTExfU1VCVEVTVF8yKCggIHNwYXJzZV9wZXJtdXRhdGlvbnNfYWxsPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4ocykgKSk7CitFSUdFTl9ERUNMQVJFX1RFU1Qoc3BhcnNlX3Blcm11dGF0aW9ucykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBpbnQgcyA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgNTApOworICAgIENBTExfU1VCVEVTVF8xKChzcGFyc2VfcGVybXV0YXRpb25zX2FsbDxkb3VibGU+KHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKHNwYXJzZV9wZXJtdXRhdGlvbnNfYWxsPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4ocykpKTsKICAgfQogCi0gIFZFUklGWSgoaW50ZXJuYWw6OmlzX3NhbWU8aW50ZXJuYWw6OnBlcm11dGF0aW9uX21hdHJpeF9wcm9kdWN0PFNwYXJzZU1hdHJpeDxkb3VibGU+LE9uVGhlUmlnaHQsZmFsc2UsU3BhcnNlU2hhcGU+OjpSZXR1cm5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpuZXN0ZWRfZXZhbDxQcm9kdWN0PFNwYXJzZU1hdHJpeDxkb3VibGU+LFBlcm11dGF0aW9uTWF0cml4PER5bmFtaWMsRHluYW1pYz4sQWxpYXNGcmVlUHJvZHVjdD4sMT46OnR5cGU+Ojp2YWx1ZSkpOworICBWRVJJRlkoKGludGVybmFsOjppc19zYW1lPAorICAgICAgICAgIGludGVybmFsOjpwZXJtdXRhdGlvbl9tYXRyaXhfcHJvZHVjdDxTcGFyc2VNYXRyaXg8ZG91YmxlPiwgT25UaGVSaWdodCwgZmFsc2UsIFNwYXJzZVNoYXBlPjo6UmV0dXJuVHlwZSwKKyAgICAgICAgICBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8UHJvZHVjdDxTcGFyc2VNYXRyaXg8ZG91YmxlPiwgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYywgRHluYW1pYz4sIEFsaWFzRnJlZVByb2R1Y3Q+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6dHlwZT46OnZhbHVlKSk7CiAKLSAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTxpbnRlcm5hbDo6cGVybXV0YXRpb25fbWF0cml4X3Byb2R1Y3Q8U3BhcnNlTWF0cml4PGRvdWJsZT4sT25UaGVMZWZ0LGZhbHNlLFNwYXJzZVNoYXBlPjo6UmV0dXJuVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8UHJvZHVjdDxQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLER5bmFtaWM+LFNwYXJzZU1hdHJpeDxkb3VibGU+LEFsaWFzRnJlZVByb2R1Y3Q+LDE+Ojp0eXBlPjo6dmFsdWUpKTsKKyAgVkVSSUZZKChpbnRlcm5hbDo6aXNfc2FtZTwKKyAgICAgICAgICBpbnRlcm5hbDo6cGVybXV0YXRpb25fbWF0cml4X3Byb2R1Y3Q8U3BhcnNlTWF0cml4PGRvdWJsZT4sIE9uVGhlTGVmdCwgZmFsc2UsIFNwYXJzZVNoYXBlPjo6UmV0dXJuVHlwZSwKKyAgICAgICAgICBpbnRlcm5hbDo6bmVzdGVkX2V2YWw8UHJvZHVjdDxQZXJtdXRhdGlvbk1hdHJpeDxEeW5hbWljLCBEeW5hbWljPiwgU3BhcnNlTWF0cml4PGRvdWJsZT4sIEFsaWFzRnJlZVByb2R1Y3Q+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPjo6dHlwZT46OnZhbHVlKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZV9wcm9kdWN0LmNwcCBiL3Rlc3Qvc3BhcnNlX3Byb2R1Y3QuY3BwCmluZGV4IGRiZjU0OWEuLjEwODNmM2YgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3BhcnNlX3Byb2R1Y3QuY3BwCisrKyBiL3Rlc3Qvc3BhcnNlX3Byb2R1Y3QuY3BwCkBAIC03LDEwICs3LDEwIEBACiAvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKIC8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgogCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSPT0xODAwKQorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA9PSAxODAwKQogLy8gVGhpcyB1bml0IHRlc3QgdGFrZXMgZm9yZXZlciB0byBjb21waWxlIGluIFJlbGVhc2UgbW9kZSB3aXRoIE1TVkMgMjAxMywKIC8vIG11bHRpcGxlIGhvdXJzLiBTbyBsZXQncyBzd2l0Y2ggb2ZmIG9wdGltaXphdGlvbiBmb3IgdGhpcyBvbmUuCi0jcHJhZ21hIG9wdGltaXplKCIiLG9mZikKKyNwcmFnbWEgb3B0aW1pemUoIiIsIG9mZikKICNlbmRpZgogCiBzdGF0aWMgbG9uZyBpbnQgbmJfdGVtcG9yYXJpZXM7CkBAIC0yMCwyMTQgKzIwLDIyOSBAQAogICBuYl90ZW1wb3JhcmllcysrOwogfQogCi0jZGVmaW5lIEVJR0VOX1NQQVJTRV9DUkVBVEVfVEVNUE9SQVJZX1BMVUdJTiB7IG9uX3RlbXBvcmFyeV9jcmVhdGlvbigpOyB9CisjZGVmaW5lIEVJR0VOX1NQQVJTRV9DUkVBVEVfVEVNUE9SQVJZX1BMVUdJTiBcCisgIHsgb25fdGVtcG9yYXJ5X2NyZWF0aW9uKCk7IH0KIAogI2luY2x1ZGUgInNwYXJzZS5oIgogCi0jZGVmaW5lIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKFhQUixOKSB7XAotICAgIG5iX3RlbXBvcmFyaWVzID0gMDsgXAotICAgIENBTExfU1VCVEVTVCggWFBSICk7IFwKLSAgICBpZihuYl90ZW1wb3JhcmllcyE9Tikgc3RkOjpjZXJyIDw8ICJuYl90ZW1wb3JhcmllcyA9PSAiIDw8IG5iX3RlbXBvcmFyaWVzIDw8ICJcbiI7IFwKLSAgICBWRVJJRlkoICgjWFBSKSAmJiBuYl90ZW1wb3Jhcmllcz09TiApOyBcCisjZGVmaW5lIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKFhQUiwgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmJfdGVtcG9yYXJpZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0FMTF9TVUJURVNUKFhQUik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKG5iX3RlbXBvcmFyaWVzICE9IE4pIHN0ZDo6Y2VyciA8PCAibmJfdGVtcG9yYXJpZXMgPT0gIiA8PCBuYl90ZW1wb3JhcmllcyA8PCAiXG4iOyBcCisgICAgVkVSSUZZKCgjWFBSKSAmJiBuYl90ZW1wb3JhcmllcyA9PSBOKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0KIAotCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+IHZvaWQgc3BhcnNlX3Byb2R1Y3QoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+Cit2b2lkIHNwYXJzZV9wcm9kdWN0KCkgewogICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7CiAgIEluZGV4IG4gPSAxMDA7Ci0gIGNvbnN0IEluZGV4IHJvd3MgID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSxuKTsKLSAgY29uc3QgSW5kZXggY29scyAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLG4pOwotICBjb25zdCBJbmRleCBkZXB0aCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsbik7CisgIGNvbnN0IEluZGV4IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBuKTsKKyAgY29uc3QgSW5kZXggY29scyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIG4pOworICBjb25zdCBJbmRleCBkZXB0aCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIG4pOwogICB0eXBlZGVmIHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIGVudW0geyBGbGFncyA9IFNwYXJzZU1hdHJpeFR5cGU6OkZsYWdzIH07CiAKLSAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguLyhyb3dzKmNvbHMpLCAwLjIpOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdHJpeDsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwxLER5bmFtaWM+IFJvd0RlbnNlVmVjdG9yOwotICB0eXBlZGVmIFNwYXJzZVZlY3RvcjxTY2FsYXIsMCxTdG9yYWdlSW5kZXg+IENvbFNwVmVjdG9yOwotICB0eXBlZGVmIFNwYXJzZVZlY3RvcjxTY2FsYXIsUm93TWFqb3IsU3RvcmFnZUluZGV4PiBSb3dTcFZlY3RvcjsKKyAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguIC8gKHJvd3MgKiBjb2xzKSwgMC4yKTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBEZW5zZVZlY3RvcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBEeW5hbWljPiBSb3dEZW5zZVZlY3RvcjsKKyAgdHlwZWRlZiBTcGFyc2VWZWN0b3I8U2NhbGFyLCAwLCBTdG9yYWdlSW5kZXg+IENvbFNwVmVjdG9yOworICB0eXBlZGVmIFNwYXJzZVZlY3RvcjxTY2FsYXIsIFJvd01ham9yLCBTdG9yYWdlSW5kZXg+IFJvd1NwVmVjdG9yOwogCiAgIFNjYWxhciBzMSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwogICBTY2FsYXIgczIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKIAogICAvLyB0ZXN0IG1hdHJpeC1tYXRyaXggcHJvZHVjdAogICB7Ci0gICAgRGVuc2VNYXRyaXggcmVmTWF0MiAgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBkZXB0aCk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0MiA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGRlcHRoKTsKICAgICBEZW5zZU1hdHJpeCByZWZNYXQydCA9IERlbnNlTWF0cml4OjpaZXJvKGRlcHRoLCByb3dzKTsKLSAgICBEZW5zZU1hdHJpeCByZWZNYXQzICA9IERlbnNlTWF0cml4OjpaZXJvKGRlcHRoLCBjb2xzKTsKKyAgICBEZW5zZU1hdHJpeCByZWZNYXQzID0gRGVuc2VNYXRyaXg6Olplcm8oZGVwdGgsIGNvbHMpOwogICAgIERlbnNlTWF0cml4IHJlZk1hdDN0ID0gRGVuc2VNYXRyaXg6Olplcm8oY29scywgZGVwdGgpOwotICAgIERlbnNlTWF0cml4IHJlZk1hdDQgID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0NCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOwogICAgIERlbnNlTWF0cml4IHJlZk1hdDR0ID0gRGVuc2VNYXRyaXg6Olplcm8oY29scywgcm93cyk7Ci0gICAgRGVuc2VNYXRyaXggcmVmTWF0NSAgPSBEZW5zZU1hdHJpeDo6UmFuZG9tKGRlcHRoLCBjb2xzKTsKLSAgICBEZW5zZU1hdHJpeCByZWZNYXQ2ICA9IERlbnNlTWF0cml4OjpSYW5kb20ocm93cywgcm93cyk7CisgICAgRGVuc2VNYXRyaXggcmVmTWF0NSA9IERlbnNlTWF0cml4OjpSYW5kb20oZGVwdGgsIGNvbHMpOworICAgIERlbnNlTWF0cml4IHJlZk1hdDYgPSBEZW5zZU1hdHJpeDo6UmFuZG9tKHJvd3MsIHJvd3MpOwogICAgIERlbnNlTWF0cml4IGRtNCA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIHJvd3MpOwotLy8gICAgIERlbnNlVmVjdG9yIGR2MSA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyk7Ci0gICAgU3BhcnNlTWF0cml4VHlwZSBtMiAocm93cywgZGVwdGgpOworICAgIC8vICAgICBEZW5zZVZlY3RvciBkdjEgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKHJvd3MpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTIocm93cywgZGVwdGgpOwogICAgIFNwYXJzZU1hdHJpeFR5cGUgbTJ0KGRlcHRoLCByb3dzKTsKLSAgICBTcGFyc2VNYXRyaXhUeXBlIG0zIChkZXB0aCwgY29scyk7CisgICAgU3BhcnNlTWF0cml4VHlwZSBtMyhkZXB0aCwgY29scyk7CiAgICAgU3BhcnNlTWF0cml4VHlwZSBtM3QoY29scywgZGVwdGgpOwotICAgIFNwYXJzZU1hdHJpeFR5cGUgbTQgKHJvd3MsIGNvbHMpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbTQocm93cywgY29scyk7CiAgICAgU3BhcnNlTWF0cml4VHlwZSBtNHQoY29scywgcm93cyk7CiAgICAgU3BhcnNlTWF0cml4VHlwZSBtNihyb3dzLCByb3dzKTsKLSAgICBpbml0U3BhcnNlKGRlbnNpdHksIHJlZk1hdDIsICBtMik7CisgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQyLCBtMik7CiAgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQydCwgbTJ0KTsKLSAgICBpbml0U3BhcnNlKGRlbnNpdHksIHJlZk1hdDMsICBtMyk7CisgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQzLCBtMyk7CiAgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQzdCwgbTN0KTsKLSAgICBpbml0U3BhcnNlKGRlbnNpdHksIHJlZk1hdDQsICBtNCk7CisgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQ0LCBtNCk7CiAgICAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQ0dCwgbTR0KTsKICAgICBpbml0U3BhcnNlKGRlbnNpdHksIHJlZk1hdDYsIG02KTsKIAotLy8gICAgIGludCBjID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsZGVwdGgtMSk7CisgICAgLy8gICAgIGludCBjID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsZGVwdGgtMSk7CiAKICAgICAvLyBzcGFyc2UgKiBzcGFyc2UKLSAgICBWRVJJRllfSVNfQVBQUk9YKG00PW0yKm0zLCByZWZNYXQ0PXJlZk1hdDIqcmVmTWF0Myk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtND1tMnQudHJhbnNwb3NlKCkqbTMsIHJlZk1hdDQ9cmVmTWF0MnQudHJhbnNwb3NlKCkqcmVmTWF0Myk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtND1tMnQudHJhbnNwb3NlKCkqbTN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG00PW0yKm0zdC50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTIgKiBtMywgcmVmTWF0NCA9IHJlZk1hdDIgKiByZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTJ0LnRyYW5zcG9zZSgpICogbTMsIHJlZk1hdDQgPSByZWZNYXQydC50cmFuc3Bvc2UoKSAqIHJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1gobTQgPSBtMnQudHJhbnNwb3NlKCkgKiBtM3QudHJhbnNwb3NlKCksIHJlZk1hdDQgPSByZWZNYXQydC50cmFuc3Bvc2UoKSAqIHJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTIgKiBtM3QudHJhbnNwb3NlKCksIHJlZk1hdDQgPSByZWZNYXQyICogcmVmTWF0M3QudHJhbnNwb3NlKCkpOwogCi0gICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IG0yKm0zL3MxLCByZWZNYXQ0ID0gcmVmTWF0MipyZWZNYXQzL3MxKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTIqbTMqczEsIHJlZk1hdDQgPSByZWZNYXQyKnJlZk1hdDMqczEpOwotICAgIFZFUklGWV9JU19BUFBST1gobTQgPSBzMiptMiptMypzMSwgcmVmTWF0NCA9IHMyKnJlZk1hdDIqcmVmTWF0MypzMSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IChtMittMikqbTMsIHJlZk1hdDQgPSAocmVmTWF0MityZWZNYXQyKSpyZWZNYXQzKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTIqbTMubGVmdENvbHMoY29scy8yKSwgcmVmTWF0NCA9IHJlZk1hdDIqcmVmTWF0My5sZWZ0Q29scyhjb2xzLzIpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTIqKG0zK20zKS5sZWZ0Q29scyhjb2xzLzIpLCByZWZNYXQ0ID0gcmVmTWF0MioocmVmTWF0MytyZWZNYXQzKS5sZWZ0Q29scyhjb2xzLzIpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTIgKiBtMyAvIHMxLCByZWZNYXQ0ID0gcmVmTWF0MiAqIHJlZk1hdDMgLyBzMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IG0yICogbTMgKiBzMSwgcmVmTWF0NCA9IHJlZk1hdDIgKiByZWZNYXQzICogczEpOworICAgIFZFUklGWV9JU19BUFBST1gobTQgPSBzMiAqIG0yICogbTMgKiBzMSwgcmVmTWF0NCA9IHMyICogcmVmTWF0MiAqIHJlZk1hdDMgKiBzMSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IChtMiArIG0yKSAqIG0zLCByZWZNYXQ0ID0gKHJlZk1hdDIgKyByZWZNYXQyKSAqIHJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1gobTQgPSBtMiAqIG0zLmxlZnRDb2xzKGNvbHMgLyAyKSwgcmVmTWF0NCA9IHJlZk1hdDIgKiByZWZNYXQzLmxlZnRDb2xzKGNvbHMgLyAyKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IG0yICogKG0zICsgbTMpLmxlZnRDb2xzKGNvbHMgLyAyKSwKKyAgICAgICAgICAgICAgICAgICAgIHJlZk1hdDQgPSByZWZNYXQyICogKHJlZk1hdDMgKyByZWZNYXQzKS5sZWZ0Q29scyhjb2xzIC8gMikpOwogCi0gICAgVkVSSUZZX0lTX0FQUFJPWChtND0obTIqbTMpLnBydW5lZCgwKSwgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1gobTQ9KG0ydC50cmFuc3Bvc2UoKSptMykucHJ1bmVkKDApLCByZWZNYXQ0PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1gobTQ9KG0ydC50cmFuc3Bvc2UoKSptM3QudHJhbnNwb3NlKCkpLnBydW5lZCgwKSwgcmVmTWF0ND1yZWZNYXQydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtND0obTIqbTN0LnRyYW5zcG9zZSgpKS5wcnVuZWQoMCksIHJlZk1hdDQ9cmVmTWF0MipyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IChtMiAqIG0zKS5wcnVuZWQoMCksIHJlZk1hdDQgPSByZWZNYXQyICogcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IChtMnQudHJhbnNwb3NlKCkgKiBtMykucHJ1bmVkKDApLCByZWZNYXQ0ID0gcmVmTWF0MnQudHJhbnNwb3NlKCkgKiByZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gKG0ydC50cmFuc3Bvc2UoKSAqIG0zdC50cmFuc3Bvc2UoKSkucHJ1bmVkKDApLAorICAgICAgICAgICAgICAgICAgICAgcmVmTWF0NCA9IHJlZk1hdDJ0LnRyYW5zcG9zZSgpICogcmVmTWF0M3QudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobTQgPSAobTIgKiBtM3QudHJhbnNwb3NlKCkpLnBydW5lZCgwKSwgcmVmTWF0NCA9IHJlZk1hdDIgKiByZWZNYXQzdC50cmFuc3Bvc2UoKSk7CiAKICNpZm5kZWYgRUlHRU5fU1BBUlNFX1BST0RVQ1RfSUdOT1JFX1RFTVBPUkFSWV9DT1VOVAogICAgIC8vIG1ha2Ugc3VyZSB0aGUgcmlnaHQgcHJvZHVjdCBpbXBsZW1lbnRhdGlvbiBpcyBjYWxsZWQ6Ci0gICAgaWYoKCFTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKSAmJiBtMi5yb3dzKCk8PW0zLmNvbHMoKSkKLSAgICB7Ci0gICAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtNCA9IG0yKm0zLCAyKTsgLy8gMiBmb3IgdHJhbnNwb3NpbmcgYW5kIGdldCBhIHNvcnRlZCByZXN1bHQuCi0gICAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtNCA9IChtMiptMykucHJ1bmVkKDApLCAxKTsKLSAgICAgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKG00ID0gKG0yKm0zKS5ldmFsKCkucHJ1bmVkKDApLCA0KTsKKyAgICBpZiAoKCFTcGFyc2VNYXRyaXhUeXBlOjpJc1Jvd01ham9yKSAmJiBtMi5yb3dzKCkgPD0gbTMuY29scygpKSB7CisgICAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtNCA9IG0yICogbTMsIDIpOyAgLy8gMiBmb3IgdHJhbnNwb3NpbmcgYW5kIGdldCBhIHNvcnRlZCByZXN1bHQuCisgICAgICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChtNCA9IChtMiAqIG0zKS5wcnVuZWQoMCksIDEpOworICAgICAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTQgPSAobTIgKiBtMykuZXZhbCgpLnBydW5lZCgwKSwgNCk7CiAgICAgfQogI2VuZGlmCiAKICAgICAvLyBhbmQgdGhhdCBwcnVuaW5nIGlzIGVmZmVjdGl2ZToKICAgICB7Ci0gICAgICBEZW5zZU1hdHJpeCBBZCgyLDIpOworICAgICAgRGVuc2VNYXRyaXggQWQoMiwgMik7CiAgICAgICBBZCA8PCAtMSwgMSwgMSwgMTsKLSAgICAgIFNwYXJzZU1hdHJpeFR5cGUgQXMoQWQuc3BhcnNlVmlldygpKSwgQigyLDIpOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKCAoQXMqQXMudHJhbnNwb3NlKCkpLmV2YWwoKS5ub25aZXJvcygpLCA0KTsKLSAgICAgIFZFUklGWV9JU19FUVVBTCggKEFkKkFkLnRyYW5zcG9zZSgpKS5ldmFsKCkuc3BhcnNlVmlldygpLmV2YWwoKS5ub25aZXJvcygpLCAyKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTCggKEFzKkFzLnRyYW5zcG9zZSgpKS5wcnVuZWQoMWUtNikuZXZhbCgpLm5vblplcm9zKCksIDIpOworICAgICAgU3BhcnNlTWF0cml4VHlwZSBBcyhBZC5zcGFyc2VWaWV3KCkpLCBCKDIsIDIpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKChBcyAqIEFzLnRyYW5zcG9zZSgpKS5ldmFsKCkubm9uWmVyb3MoKSwgNCk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoKEFkICogQWQudHJhbnNwb3NlKCkpLmV2YWwoKS5zcGFyc2VWaWV3KCkuZXZhbCgpLm5vblplcm9zKCksIDIpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKChBcyAqIEFzLnRyYW5zcG9zZSgpKS5wcnVuZWQoMWUtNikuZXZhbCgpLm5vblplcm9zKCksIDIpOwogICAgIH0KIAogICAgIC8vIGRlbnNlID89IHNwYXJzZSAqIHNwYXJzZQotICAgIFZFUklGWV9JU19BUFBST1goZG00ID1tMiptMywgcmVmTWF0NCA9cmVmTWF0MipyZWZNYXQzKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCs9bTIqbTMsIHJlZk1hdDQrPXJlZk1hdDIqcmVmTWF0Myk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChkbTQtPW0yKm0zLCByZWZNYXQ0LT1yZWZNYXQyKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00ID1tMnQudHJhbnNwb3NlKCkqbTMsIHJlZk1hdDQgPXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00Kz1tMnQudHJhbnNwb3NlKCkqbTMsIHJlZk1hdDQrPXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00LT1tMnQudHJhbnNwb3NlKCkqbTMsIHJlZk1hdDQtPXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00ID1tMnQudHJhbnNwb3NlKCkqbTN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0ID1yZWZNYXQydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChkbTQrPW0ydC50cmFuc3Bvc2UoKSptM3QudHJhbnNwb3NlKCksIHJlZk1hdDQrPXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGRtNC09bTJ0LnRyYW5zcG9zZSgpKm0zdC50cmFuc3Bvc2UoKSwgcmVmTWF0NC09cmVmTWF0MnQudHJhbnNwb3NlKCkqcmVmTWF0M3QudHJhbnNwb3NlKCkpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00ID1tMiptM3QudHJhbnNwb3NlKCksIHJlZk1hdDQgPXJlZk1hdDIqcmVmTWF0M3QudHJhbnNwb3NlKCkpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00Kz1tMiptM3QudHJhbnNwb3NlKCksIHJlZk1hdDQrPXJlZk1hdDIqcmVmTWF0M3QudHJhbnNwb3NlKCkpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00LT1tMiptM3QudHJhbnNwb3NlKCksIHJlZk1hdDQtPXJlZk1hdDIqcmVmTWF0M3QudHJhbnNwb3NlKCkpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00ID0gbTIqbTMqczEsIHJlZk1hdDQgPSByZWZNYXQyKnJlZk1hdDMqczEpOworICAgIFZFUklGWV9JU19BUFBST1goZG00ID0gbTIgKiBtMywgcmVmTWF0NCA9IHJlZk1hdDIgKiByZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCArPSBtMiAqIG0zLCByZWZNYXQ0ICs9IHJlZk1hdDIgKiByZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCAtPSBtMiAqIG0zLCByZWZNYXQ0IC09IHJlZk1hdDIgKiByZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCA9IG0ydC50cmFuc3Bvc2UoKSAqIG0zLCByZWZNYXQ0ID0gcmVmTWF0MnQudHJhbnNwb3NlKCkgKiByZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCArPSBtMnQudHJhbnNwb3NlKCkgKiBtMywgcmVmTWF0NCArPSByZWZNYXQydC50cmFuc3Bvc2UoKSAqIHJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00IC09IG0ydC50cmFuc3Bvc2UoKSAqIG0zLCByZWZNYXQ0IC09IHJlZk1hdDJ0LnRyYW5zcG9zZSgpICogcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgPSBtMnQudHJhbnNwb3NlKCkgKiBtM3QudHJhbnNwb3NlKCksIHJlZk1hdDQgPSByZWZNYXQydC50cmFuc3Bvc2UoKSAqIHJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCArPSBtMnQudHJhbnNwb3NlKCkgKiBtM3QudHJhbnNwb3NlKCksIHJlZk1hdDQgKz0gcmVmTWF0MnQudHJhbnNwb3NlKCkgKiByZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgLT0gbTJ0LnRyYW5zcG9zZSgpICogbTN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0IC09IHJlZk1hdDJ0LnRyYW5zcG9zZSgpICogcmVmTWF0M3QudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1goZG00ID0gbTIgKiBtM3QudHJhbnNwb3NlKCksIHJlZk1hdDQgPSByZWZNYXQyICogcmVmTWF0M3QudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1goZG00ICs9IG0yICogbTN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0ICs9IHJlZk1hdDIgKiByZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgLT0gbTIgKiBtM3QudHJhbnNwb3NlKCksIHJlZk1hdDQgLT0gcmVmTWF0MiAqIHJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCA9IG0yICogbTMgKiBzMSwgcmVmTWF0NCA9IHJlZk1hdDIgKiByZWZNYXQzICogczEpOwogCiAgICAgLy8gdGVzdCBhbGlhc2luZwotICAgIG00ID0gbTI7IHJlZk1hdDQgPSByZWZNYXQyOwotICAgIFZFUklGWV9JU19BUFBST1gobTQ9bTQqbTMsIHJlZk1hdDQ9cmVmTWF0NCpyZWZNYXQzKTsKKyAgICBtNCA9IG0yOworICAgIHJlZk1hdDQgPSByZWZNYXQyOworICAgIFZFUklGWV9JU19BUFBST1gobTQgPSBtNCAqIG0zLCByZWZNYXQ0ID0gcmVmTWF0NCAqIHJlZk1hdDMpOwogCiAgICAgLy8gc3BhcnNlICogZGVuc2UgbWF0cml4Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTIqcmVmTWF0MywgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00PW0yKnJlZk1hdDN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDIqcmVmTWF0M3QudHJhbnNwb3NlKCkpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00PW0ydC50cmFuc3Bvc2UoKSpyZWZNYXQzLCByZWZNYXQ0PXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00PW0ydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgPSBtMiAqIHJlZk1hdDMsIHJlZk1hdDQgPSByZWZNYXQyICogcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgPSBtMiAqIHJlZk1hdDN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0ID0gcmVmTWF0MiAqIHJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCA9IG0ydC50cmFuc3Bvc2UoKSAqIHJlZk1hdDMsIHJlZk1hdDQgPSByZWZNYXQydC50cmFuc3Bvc2UoKSAqIHJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00ID0gbTJ0LnRyYW5zcG9zZSgpICogcmVmTWF0M3QudHJhbnNwb3NlKCksCisgICAgICAgICAgICAgICAgICAgICByZWZNYXQ0ID0gcmVmTWF0MnQudHJhbnNwb3NlKCkgKiByZWZNYXQzdC50cmFuc3Bvc2UoKSk7CiAKLSAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1tMipyZWZNYXQzLCByZWZNYXQ0PXJlZk1hdDIqcmVmTWF0Myk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9ZG00K20yKnJlZk1hdDMsIHJlZk1hdDQ9cmVmTWF0NCtyZWZNYXQyKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00Kz1tMipyZWZNYXQzLCByZWZNYXQ0Kz1yZWZNYXQyKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00LT1tMipyZWZNYXQzLCByZWZNYXQ0LT1yZWZNYXQyKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00Lm5vYWxpYXMoKSs9bTIqcmVmTWF0MywgcmVmTWF0NCs9cmVmTWF0MipyZWZNYXQzKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGRtNC5ub2FsaWFzKCktPW0yKnJlZk1hdDMsIHJlZk1hdDQtPXJlZk1hdDIqcmVmTWF0Myk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTIqKHJlZk1hdDMrcmVmTWF0MyksIHJlZk1hdDQ9cmVmTWF0MioocmVmTWF0MytyZWZNYXQzKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChkbTQ9bTJ0LnRyYW5zcG9zZSgpKihyZWZNYXQzK3JlZk1hdDUpKjAuNSwgcmVmTWF0ND1yZWZNYXQydC50cmFuc3Bvc2UoKSoocmVmTWF0MytyZWZNYXQ1KSowLjUpOworICAgIFZFUklGWV9JU19BUFBST1goZG00ID0gbTIgKiByZWZNYXQzLCByZWZNYXQ0ID0gcmVmTWF0MiAqIHJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00ID0gZG00ICsgbTIgKiByZWZNYXQzLCByZWZNYXQ0ID0gcmVmTWF0NCArIHJlZk1hdDIgKiByZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCArPSBtMiAqIHJlZk1hdDMsIHJlZk1hdDQgKz0gcmVmTWF0MiAqIHJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00IC09IG0yICogcmVmTWF0MywgcmVmTWF0NCAtPSByZWZNYXQyICogcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQubm9hbGlhcygpICs9IG0yICogcmVmTWF0MywgcmVmTWF0NCArPSByZWZNYXQyICogcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQubm9hbGlhcygpIC09IG0yICogcmVmTWF0MywgcmVmTWF0NCAtPSByZWZNYXQyICogcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgPSBtMiAqIChyZWZNYXQzICsgcmVmTWF0MyksIHJlZk1hdDQgPSByZWZNYXQyICogKHJlZk1hdDMgKyByZWZNYXQzKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgPSBtMnQudHJhbnNwb3NlKCkgKiAocmVmTWF0MyArIHJlZk1hdDUpICogMC41LAorICAgICAgICAgICAgICAgICAgICAgcmVmTWF0NCA9IHJlZk1hdDJ0LnRyYW5zcG9zZSgpICogKHJlZk1hdDMgKyByZWZNYXQ1KSAqIDAuNSk7CiAKICAgICAvLyBzcGFyc2UgKiBkZW5zZSB2ZWN0b3IKLSAgICBWRVJJRllfSVNfQVBQUk9YKGRtNC5jb2woMCk9bTIqcmVmTWF0My5jb2woMCksIHJlZk1hdDQuY29sKDApPXJlZk1hdDIqcmVmTWF0My5jb2woMCkpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00LmNvbCgwKT1tMipyZWZNYXQzdC50cmFuc3Bvc2UoKS5jb2woMCksIHJlZk1hdDQuY29sKDApPXJlZk1hdDIqcmVmTWF0M3QudHJhbnNwb3NlKCkuY29sKDApKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGRtNC5jb2woMCk9bTJ0LnRyYW5zcG9zZSgpKnJlZk1hdDMuY29sKDApLCByZWZNYXQ0LmNvbCgwKT1yZWZNYXQydC50cmFuc3Bvc2UoKSpyZWZNYXQzLmNvbCgwKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChkbTQuY29sKDApPW0ydC50cmFuc3Bvc2UoKSpyZWZNYXQzdC50cmFuc3Bvc2UoKS5jb2woMCksIHJlZk1hdDQuY29sKDApPXJlZk1hdDJ0LnRyYW5zcG9zZSgpKnJlZk1hdDN0LnRyYW5zcG9zZSgpLmNvbCgwKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQuY29sKDApID0gbTIgKiByZWZNYXQzLmNvbCgwKSwgcmVmTWF0NC5jb2woMCkgPSByZWZNYXQyICogcmVmTWF0My5jb2woMCkpOworICAgIFZFUklGWV9JU19BUFBST1goZG00LmNvbCgwKSA9IG0yICogcmVmTWF0M3QudHJhbnNwb3NlKCkuY29sKDApLAorICAgICAgICAgICAgICAgICAgICAgcmVmTWF0NC5jb2woMCkgPSByZWZNYXQyICogcmVmTWF0M3QudHJhbnNwb3NlKCkuY29sKDApKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNC5jb2woMCkgPSBtMnQudHJhbnNwb3NlKCkgKiByZWZNYXQzLmNvbCgwKSwKKyAgICAgICAgICAgICAgICAgICAgIHJlZk1hdDQuY29sKDApID0gcmVmTWF0MnQudHJhbnNwb3NlKCkgKiByZWZNYXQzLmNvbCgwKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQuY29sKDApID0gbTJ0LnRyYW5zcG9zZSgpICogcmVmTWF0M3QudHJhbnNwb3NlKCkuY29sKDApLAorICAgICAgICAgICAgICAgICAgICAgcmVmTWF0NC5jb2woMCkgPSByZWZNYXQydC50cmFuc3Bvc2UoKSAqIHJlZk1hdDN0LnRyYW5zcG9zZSgpLmNvbCgwKSk7CiAKICAgICAvLyBkZW5zZSAqIHNwYXJzZQotICAgIFZFUklGWV9JU19BUFBST1goZG00PXJlZk1hdDIqbTMsIHJlZk1hdDQ9cmVmTWF0MipyZWZNYXQzKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1kbTQrcmVmTWF0MiptMywgcmVmTWF0ND1yZWZNYXQ0K3JlZk1hdDIqcmVmTWF0Myk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChkbTQrPXJlZk1hdDIqbTMsIHJlZk1hdDQrPXJlZk1hdDIqcmVmTWF0Myk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChkbTQtPXJlZk1hdDIqbTMsIHJlZk1hdDQtPXJlZk1hdDIqcmVmTWF0Myk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChkbTQubm9hbGlhcygpKz1yZWZNYXQyKm0zLCByZWZNYXQ0Kz1yZWZNYXQyKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1goZG00Lm5vYWxpYXMoKS09cmVmTWF0MiptMywgcmVmTWF0NC09cmVmTWF0MipyZWZNYXQzKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1yZWZNYXQyKm0zdC50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQyKnJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1yZWZNYXQydC50cmFuc3Bvc2UoKSptMywgcmVmTWF0ND1yZWZNYXQydC50cmFuc3Bvc2UoKSpyZWZNYXQzKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1yZWZNYXQydC50cmFuc3Bvc2UoKSptM3QudHJhbnNwb3NlKCksIHJlZk1hdDQ9cmVmTWF0MnQudHJhbnNwb3NlKCkqcmVmTWF0M3QudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1goZG00ID0gcmVmTWF0MiAqIG0zLCByZWZNYXQ0ID0gcmVmTWF0MiAqIHJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00ID0gZG00ICsgcmVmTWF0MiAqIG0zLCByZWZNYXQ0ID0gcmVmTWF0NCArIHJlZk1hdDIgKiByZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCArPSByZWZNYXQyICogbTMsIHJlZk1hdDQgKz0gcmVmTWF0MiAqIHJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00IC09IHJlZk1hdDIgKiBtMywgcmVmTWF0NCAtPSByZWZNYXQyICogcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQubm9hbGlhcygpICs9IHJlZk1hdDIgKiBtMywgcmVmTWF0NCArPSByZWZNYXQyICogcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQubm9hbGlhcygpIC09IHJlZk1hdDIgKiBtMywgcmVmTWF0NCAtPSByZWZNYXQyICogcmVmTWF0Myk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgPSByZWZNYXQyICogbTN0LnRyYW5zcG9zZSgpLCByZWZNYXQ0ID0gcmVmTWF0MiAqIHJlZk1hdDN0LnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCA9IHJlZk1hdDJ0LnRyYW5zcG9zZSgpICogbTMsIHJlZk1hdDQgPSByZWZNYXQydC50cmFuc3Bvc2UoKSAqIHJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1goZG00ID0gcmVmTWF0MnQudHJhbnNwb3NlKCkgKiBtM3QudHJhbnNwb3NlKCksCisgICAgICAgICAgICAgICAgICAgICByZWZNYXQ0ID0gcmVmTWF0MnQudHJhbnNwb3NlKCkgKiByZWZNYXQzdC50cmFuc3Bvc2UoKSk7CiAKICAgICAvLyBzcGFyc2UgKiBkZW5zZSBhbmQgZGVuc2UgKiBzcGFyc2Ugb3V0ZXIgcHJvZHVjdAogICAgIHsKLSAgICAgIEluZGV4IGMgID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxkZXB0aC0xKTsKLSAgICAgIEluZGV4IHIgID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOwotICAgICAgSW5kZXggYzEgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGNvbHMtMSk7Ci0gICAgICBJbmRleCByMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsZGVwdGgtMSk7Ci0gICAgICBEZW5zZU1hdHJpeCBkbTUgID0gRGVuc2VNYXRyaXg6OlJhbmRvbShkZXB0aCwgY29scyk7CisgICAgICBJbmRleCBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgZGVwdGggLSAxKTsKKyAgICAgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMSk7CisgICAgICBJbmRleCBjMSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMgLSAxKTsKKyAgICAgIEluZGV4IHIxID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgZGVwdGggLSAxKTsKKyAgICAgIERlbnNlTWF0cml4IGRtNSA9IERlbnNlTWF0cml4OjpSYW5kb20oZGVwdGgsIGNvbHMpOwogCi0gICAgICBWRVJJRllfSVNfQVBQUk9YKCBtND1tMi5jb2woYykqZG01LmNvbChjMSkudHJhbnNwb3NlKCksIHJlZk1hdDQ9cmVmTWF0Mi5jb2woYykqZG01LmNvbChjMSkudHJhbnNwb3NlKCkpOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKG00Lm5vblplcm9zKCksIChyZWZNYXQ0LmFycmF5KCkhPTApLmNvdW50KCkpOwotICAgICAgVkVSSUZZX0lTX0FQUFJPWCggbTQ9bTIubWlkZGxlQ29scyhjLDEpKmRtNS5jb2woYzEpLnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDIuY29sKGMpKmRtNS5jb2woYzEpLnRyYW5zcG9zZSgpKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTChtNC5ub25aZXJvcygpLCAocmVmTWF0NC5hcnJheSgpIT0wKS5jb3VudCgpKTsKLSAgICAgIFZFUklGWV9JU19BUFBST1goZG00PW0yLmNvbChjKSpkbTUuY29sKGMxKS50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQyLmNvbChjKSpkbTUuY29sKGMxKS50cmFuc3Bvc2UoKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gbTIuY29sKGMpICogZG01LmNvbChjMSkudHJhbnNwb3NlKCksIHJlZk1hdDQgPSByZWZNYXQyLmNvbChjKSAqIGRtNS5jb2woYzEpLnRyYW5zcG9zZSgpKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChtNC5ub25aZXJvcygpLCAocmVmTWF0NC5hcnJheSgpICE9IDApLmNvdW50KCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IG0yLm1pZGRsZUNvbHMoYywgMSkgKiBkbTUuY29sKGMxKS50cmFuc3Bvc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVmTWF0NCA9IHJlZk1hdDIuY29sKGMpICogZG01LmNvbChjMSkudHJhbnNwb3NlKCkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKG00Lm5vblplcm9zKCksIChyZWZNYXQ0LmFycmF5KCkgIT0gMCkuY291bnQoKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCA9IG0yLmNvbChjKSAqIGRtNS5jb2woYzEpLnRyYW5zcG9zZSgpLCByZWZNYXQ0ID0gcmVmTWF0Mi5jb2woYykgKiBkbTUuY29sKGMxKS50cmFuc3Bvc2UoKSk7CiAKLSAgICAgIFZFUklGWV9JU19BUFBST1gobTQ9ZG01LmNvbChjMSkqbTIuY29sKGMpLnRyYW5zcG9zZSgpLCByZWZNYXQ0PWRtNS5jb2woYzEpKnJlZk1hdDIuY29sKGMpLnRyYW5zcG9zZSgpKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTChtNC5ub25aZXJvcygpLCAocmVmTWF0NC5hcnJheSgpIT0wKS5jb3VudCgpKTsKLSAgICAgIFZFUklGWV9JU19BUFBST1gobTQ9ZG01LmNvbChjMSkqbTIubWlkZGxlQ29scyhjLDEpLnRyYW5zcG9zZSgpLCByZWZNYXQ0PWRtNS5jb2woYzEpKnJlZk1hdDIuY29sKGMpLnRyYW5zcG9zZSgpKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTChtNC5ub25aZXJvcygpLCAocmVmTWF0NC5hcnJheSgpIT0wKS5jb3VudCgpKTsKLSAgICAgIFZFUklGWV9JU19BUFBST1goZG00PWRtNS5jb2woYzEpKm0yLmNvbChjKS50cmFuc3Bvc2UoKSwgcmVmTWF0ND1kbTUuY29sKGMxKSpyZWZNYXQyLmNvbChjKS50cmFuc3Bvc2UoKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gZG01LmNvbChjMSkgKiBtMi5jb2woYykudHJhbnNwb3NlKCksIHJlZk1hdDQgPSBkbTUuY29sKGMxKSAqIHJlZk1hdDIuY29sKGMpLnRyYW5zcG9zZSgpKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChtNC5ub25aZXJvcygpLCAocmVmTWF0NC5hcnJheSgpICE9IDApLmNvdW50KCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IGRtNS5jb2woYzEpICogbTIubWlkZGxlQ29scyhjLCAxKS50cmFuc3Bvc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVmTWF0NCA9IGRtNS5jb2woYzEpICogcmVmTWF0Mi5jb2woYykudHJhbnNwb3NlKCkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKG00Lm5vblplcm9zKCksIChyZWZNYXQ0LmFycmF5KCkgIT0gMCkuY291bnQoKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCA9IGRtNS5jb2woYzEpICogbTIuY29sKGMpLnRyYW5zcG9zZSgpLCByZWZNYXQ0ID0gZG01LmNvbChjMSkgKiByZWZNYXQyLmNvbChjKS50cmFuc3Bvc2UoKSk7CiAKLSAgICAgIFZFUklGWV9JU19BUFBST1goIG00PWRtNS5yb3cocjEpLnRyYW5zcG9zZSgpKm0yLmNvbChjKS50cmFuc3Bvc2UoKSwgcmVmTWF0ND1kbTUucm93KHIxKS50cmFuc3Bvc2UoKSpyZWZNYXQyLmNvbChjKS50cmFuc3Bvc2UoKSk7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwobTQubm9uWmVyb3MoKSwgKHJlZk1hdDQuYXJyYXkoKSE9MCkuY291bnQoKSk7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1kbTUucm93KHIxKS50cmFuc3Bvc2UoKSptMi5jb2woYykudHJhbnNwb3NlKCksIHJlZk1hdDQ9ZG01LnJvdyhyMSkudHJhbnNwb3NlKCkqcmVmTWF0Mi5jb2woYykudHJhbnNwb3NlKCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IGRtNS5yb3cocjEpLnRyYW5zcG9zZSgpICogbTIuY29sKGMpLnRyYW5zcG9zZSgpLAorICAgICAgICAgICAgICAgICAgICAgICByZWZNYXQ0ID0gZG01LnJvdyhyMSkudHJhbnNwb3NlKCkgKiByZWZNYXQyLmNvbChjKS50cmFuc3Bvc2UoKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwobTQubm9uWmVyb3MoKSwgKHJlZk1hdDQuYXJyYXkoKSAhPSAwKS5jb3VudCgpKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1goZG00ID0gZG01LnJvdyhyMSkudHJhbnNwb3NlKCkgKiBtMi5jb2woYykudHJhbnNwb3NlKCksCisgICAgICAgICAgICAgICAgICAgICAgIHJlZk1hdDQgPSBkbTUucm93KHIxKS50cmFuc3Bvc2UoKSAqIHJlZk1hdDIuY29sKGMpLnRyYW5zcG9zZSgpKTsKIAotICAgICAgVkVSSUZZX0lTX0FQUFJPWCggbTQ9bTIucm93KHIpLnRyYW5zcG9zZSgpKmRtNS5jb2woYzEpLnRyYW5zcG9zZSgpLCByZWZNYXQ0PXJlZk1hdDIucm93KHIpLnRyYW5zcG9zZSgpKmRtNS5jb2woYzEpLnRyYW5zcG9zZSgpKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTChtNC5ub25aZXJvcygpLCAocmVmTWF0NC5hcnJheSgpIT0wKS5jb3VudCgpKTsKLSAgICAgIFZFUklGWV9JU19BUFBST1goIG00PW0yLm1pZGRsZVJvd3MociwxKS50cmFuc3Bvc2UoKSpkbTUuY29sKGMxKS50cmFuc3Bvc2UoKSwgcmVmTWF0ND1yZWZNYXQyLnJvdyhyKS50cmFuc3Bvc2UoKSpkbTUuY29sKGMxKS50cmFuc3Bvc2UoKSk7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwobTQubm9uWmVyb3MoKSwgKHJlZk1hdDQuYXJyYXkoKSE9MCkuY291bnQoKSk7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1tMi5yb3cocikudHJhbnNwb3NlKCkqZG01LmNvbChjMSkudHJhbnNwb3NlKCksIHJlZk1hdDQ9cmVmTWF0Mi5yb3cocikudHJhbnNwb3NlKCkqZG01LmNvbChjMSkudHJhbnNwb3NlKCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IG0yLnJvdyhyKS50cmFuc3Bvc2UoKSAqIGRtNS5jb2woYzEpLnRyYW5zcG9zZSgpLAorICAgICAgICAgICAgICAgICAgICAgICByZWZNYXQ0ID0gcmVmTWF0Mi5yb3cocikudHJhbnNwb3NlKCkgKiBkbTUuY29sKGMxKS50cmFuc3Bvc2UoKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwobTQubm9uWmVyb3MoKSwgKHJlZk1hdDQuYXJyYXkoKSAhPSAwKS5jb3VudCgpKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gobTQgPSBtMi5taWRkbGVSb3dzKHIsIDEpLnRyYW5zcG9zZSgpICogZG01LmNvbChjMSkudHJhbnNwb3NlKCksCisgICAgICAgICAgICAgICAgICAgICAgIHJlZk1hdDQgPSByZWZNYXQyLnJvdyhyKS50cmFuc3Bvc2UoKSAqIGRtNS5jb2woYzEpLnRyYW5zcG9zZSgpKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChtNC5ub25aZXJvcygpLCAocmVmTWF0NC5hcnJheSgpICE9IDApLmNvdW50KCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChkbTQgPSBtMi5yb3cocikudHJhbnNwb3NlKCkgKiBkbTUuY29sKGMxKS50cmFuc3Bvc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVmTWF0NCA9IHJlZk1hdDIucm93KHIpLnRyYW5zcG9zZSgpICogZG01LmNvbChjMSkudHJhbnNwb3NlKCkpOwogCi0gICAgICBWRVJJRllfSVNfQVBQUk9YKCBtND1kbTUuY29sKGMxKSptMi5yb3cociksIHJlZk1hdDQ9ZG01LmNvbChjMSkqcmVmTWF0Mi5yb3cocikpOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKG00Lm5vblplcm9zKCksIChyZWZNYXQ0LmFycmF5KCkhPTApLmNvdW50KCkpOwotICAgICAgVkVSSUZZX0lTX0FQUFJPWCggbTQ9ZG01LmNvbChjMSkqbTIubWlkZGxlUm93cyhyLDEpLCByZWZNYXQ0PWRtNS5jb2woYzEpKnJlZk1hdDIucm93KHIpKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTChtNC5ub25aZXJvcygpLCAocmVmTWF0NC5hcnJheSgpIT0wKS5jb3VudCgpKTsKLSAgICAgIFZFUklGWV9JU19BUFBST1goZG00PWRtNS5jb2woYzEpKm0yLnJvdyhyKSwgcmVmTWF0ND1kbTUuY29sKGMxKSpyZWZNYXQyLnJvdyhyKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG00ID0gZG01LmNvbChjMSkgKiBtMi5yb3cociksIHJlZk1hdDQgPSBkbTUuY29sKGMxKSAqIHJlZk1hdDIucm93KHIpKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChtNC5ub25aZXJvcygpLCAocmVmTWF0NC5hcnJheSgpICE9IDApLmNvdW50KCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IGRtNS5jb2woYzEpICogbTIubWlkZGxlUm93cyhyLCAxKSwgcmVmTWF0NCA9IGRtNS5jb2woYzEpICogcmVmTWF0Mi5yb3cocikpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKG00Lm5vblplcm9zKCksIChyZWZNYXQ0LmFycmF5KCkgIT0gMCkuY291bnQoKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKGRtNCA9IGRtNS5jb2woYzEpICogbTIucm93KHIpLCByZWZNYXQ0ID0gZG01LmNvbChjMSkgKiByZWZNYXQyLnJvdyhyKSk7CiAKLSAgICAgIFZFUklGWV9JU19BUFBST1goIG00PWRtNS5yb3cocjEpLnRyYW5zcG9zZSgpKm0yLnJvdyhyKSwgcmVmTWF0ND1kbTUucm93KHIxKS50cmFuc3Bvc2UoKSpyZWZNYXQyLnJvdyhyKSk7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwobTQubm9uWmVyb3MoKSwgKHJlZk1hdDQuYXJyYXkoKSE9MCkuY291bnQoKSk7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKGRtND1kbTUucm93KHIxKS50cmFuc3Bvc2UoKSptMi5yb3cociksIHJlZk1hdDQ9ZG01LnJvdyhyMSkudHJhbnNwb3NlKCkqcmVmTWF0Mi5yb3cocikpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtNCA9IGRtNS5yb3cocjEpLnRyYW5zcG9zZSgpICogbTIucm93KHIpLCByZWZNYXQ0ID0gZG01LnJvdyhyMSkudHJhbnNwb3NlKCkgKiByZWZNYXQyLnJvdyhyKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwobTQubm9uWmVyb3MoKSwgKHJlZk1hdDQuYXJyYXkoKSAhPSAwKS5jb3VudCgpKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1goZG00ID0gZG01LnJvdyhyMSkudHJhbnNwb3NlKCkgKiBtMi5yb3cociksIHJlZk1hdDQgPSBkbTUucm93KHIxKS50cmFuc3Bvc2UoKSAqIHJlZk1hdDIucm93KHIpKTsKICAgICB9CiAKLSAgICBWRVJJRllfSVNfQVBQUk9YKG02PW02Km02LCByZWZNYXQ2PXJlZk1hdDYqcmVmTWF0Nik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtNiA9IG02ICogbTYsIHJlZk1hdDYgPSByZWZNYXQ2ICogcmVmTWF0Nik7CiAKICAgICAvLyBzcGFyc2UgbWF0cml4ICogc3BhcnNlIHZlY3RvcgogICAgIENvbFNwVmVjdG9yIGN2MChjb2xzKSwgY3YxOwogICAgIERlbnNlVmVjdG9yIGRjdjAoY29scyksIGRjdjE7Ci0gICAgaW5pdFNwYXJzZSgyKmRlbnNpdHksZGN2MCwgY3YwKTsKKyAgICBpbml0U3BhcnNlKDIgKiBkZW5zaXR5LCBkY3YwLCBjdjApOwogCiAgICAgUm93U3BWZWN0b3IgcnYwKGRlcHRoKSwgcnYxOwogICAgIFJvd0RlbnNlVmVjdG9yIGRydjAoZGVwdGgpLCBkcnYxKHJ2MSk7Ci0gICAgaW5pdFNwYXJzZSgyKmRlbnNpdHksZHJ2MCwgcnYwKTsKKyAgICBpbml0U3BhcnNlKDIgKiBkZW5zaXR5LCBkcnYwLCBydjApOwogCi0gICAgVkVSSUZZX0lTX0FQUFJPWChjdjE9bTMqY3YwLCBkY3YxPXJlZk1hdDMqZGN2MCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChydjE9cnYwKm0zLCBkcnYxPWRydjAqcmVmTWF0Myk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChjdjE9bTN0LmFkam9pbnQoKSpjdjAsIGRjdjE9cmVmTWF0M3QuYWRqb2ludCgpKmRjdjApOwotICAgIFZFUklGWV9JU19BUFBST1goY3YxPXJ2MCptMywgZGN2MT1kcnYwKnJlZk1hdDMpOwotICAgIFZFUklGWV9JU19BUFBST1gocnYxPW0zKmN2MCwgZHJ2MT1yZWZNYXQzKmRjdjApOworICAgIFZFUklGWV9JU19BUFBST1goY3YxID0gbTMgKiBjdjAsIGRjdjEgPSByZWZNYXQzICogZGN2MCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChydjEgPSBydjAgKiBtMywgZHJ2MSA9IGRydjAgKiByZWZNYXQzKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGN2MSA9IG0zdC5hZGpvaW50KCkgKiBjdjAsIGRjdjEgPSByZWZNYXQzdC5hZGpvaW50KCkgKiBkY3YwKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGN2MSA9IHJ2MCAqIG0zLCBkY3YxID0gZHJ2MCAqIHJlZk1hdDMpOworICAgIFZFUklGWV9JU19BUFBST1gocnYxID0gbTMgKiBjdjAsIGRydjEgPSByZWZNYXQzICogZGN2MCk7CiAgIH0KIAogICAvLyB0ZXN0IG1hdHJpeCAtIGRpYWdvbmFsIHByb2R1Y3QKQEAgLTIzNSwzNiArMjUwLDM2IEBACiAgICAgRGVuc2VNYXRyaXggcmVmTTIgPSBEZW5zZU1hdHJpeDo6WmVybyhyb3dzLCBjb2xzKTsKICAgICBEZW5zZU1hdHJpeCByZWZNMyA9IERlbnNlTWF0cml4OjpaZXJvKHJvd3MsIGNvbHMpOwogICAgIERlbnNlTWF0cml4IGQzID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7Ci0gICAgRGlhZ29uYWxNYXRyaXg8U2NhbGFyLER5bmFtaWM+IGQxKERlbnNlVmVjdG9yOjpSYW5kb20oY29scykpOwotICAgIERpYWdvbmFsTWF0cml4PFNjYWxhcixEeW5hbWljPiBkMihEZW5zZVZlY3Rvcjo6UmFuZG9tKHJvd3MpKTsKKyAgICBEaWFnb25hbE1hdHJpeDxTY2FsYXIsIER5bmFtaWM+IGQxKERlbnNlVmVjdG9yOjpSYW5kb20oY29scykpOworICAgIERpYWdvbmFsTWF0cml4PFNjYWxhciwgRHluYW1pYz4gZDIoRGVuc2VWZWN0b3I6OlJhbmRvbShyb3dzKSk7CiAgICAgU3BhcnNlTWF0cml4VHlwZSBtMihyb3dzLCBjb2xzKTsKICAgICBTcGFyc2VNYXRyaXhUeXBlIG0zKHJvd3MsIGNvbHMpOwogICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNMiwgbTIpOwogICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNMywgbTMpOwotICAgIFZFUklGWV9JU19BUFBST1gobTM9bTIqZDEsIHJlZk0zPXJlZk0yKmQxKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0zPW0yLnRyYW5zcG9zZSgpKmQyLCByZWZNMz1yZWZNMi50cmFuc3Bvc2UoKSpkMik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtMz1kMiptMiwgcmVmTTM9ZDIqcmVmTTIpOwotICAgIFZFUklGWV9JU19BUFBST1gobTM9ZDEqbTIudHJhbnNwb3NlKCksIHJlZk0zPWQxKnJlZk0yLnRyYW5zcG9zZSgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zID0gbTIgKiBkMSwgcmVmTTMgPSByZWZNMiAqIGQxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zID0gbTIudHJhbnNwb3NlKCkgKiBkMiwgcmVmTTMgPSByZWZNMi50cmFuc3Bvc2UoKSAqIGQyKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zID0gZDIgKiBtMiwgcmVmTTMgPSBkMiAqIHJlZk0yKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zID0gZDEgKiBtMi50cmFuc3Bvc2UoKSwgcmVmTTMgPSBkMSAqIHJlZk0yLnRyYW5zcG9zZSgpKTsKIAogICAgIC8vIGFsc28gY2hlY2sgd2l0aCBhIFNwYXJzZVdyYXBwZXI6CiAgICAgRGVuc2VWZWN0b3IgdjEgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKGNvbHMpOwogICAgIERlbnNlVmVjdG9yIHYyID0gRGVuc2VWZWN0b3I6OlJhbmRvbShyb3dzKTsKICAgICBEZW5zZVZlY3RvciB2MyA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtMz1tMip2MS5hc0RpYWdvbmFsKCksIHJlZk0zPXJlZk0yKnYxLmFzRGlhZ29uYWwoKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtMz1tMi50cmFuc3Bvc2UoKSp2Mi5hc0RpYWdvbmFsKCksIHJlZk0zPXJlZk0yLnRyYW5zcG9zZSgpKnYyLmFzRGlhZ29uYWwoKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtMz12Mi5hc0RpYWdvbmFsKCkqbTIsIHJlZk0zPXYyLmFzRGlhZ29uYWwoKSpyZWZNMik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtMz12MS5hc0RpYWdvbmFsKCkqbTIudHJhbnNwb3NlKCksIHJlZk0zPXYxLmFzRGlhZ29uYWwoKSpyZWZNMi50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMyA9IG0yICogdjEuYXNEaWFnb25hbCgpLCByZWZNMyA9IHJlZk0yICogdjEuYXNEaWFnb25hbCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0zID0gbTIudHJhbnNwb3NlKCkgKiB2Mi5hc0RpYWdvbmFsKCksIHJlZk0zID0gcmVmTTIudHJhbnNwb3NlKCkgKiB2Mi5hc0RpYWdvbmFsKCkpOworICAgIFZFUklGWV9JU19BUFBST1gobTMgPSB2Mi5hc0RpYWdvbmFsKCkgKiBtMiwgcmVmTTMgPSB2Mi5hc0RpYWdvbmFsKCkgKiByZWZNMik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMyA9IHYxLmFzRGlhZ29uYWwoKSAqIG0yLnRyYW5zcG9zZSgpLCByZWZNMyA9IHYxLmFzRGlhZ29uYWwoKSAqIHJlZk0yLnRyYW5zcG9zZSgpKTsKIAotICAgIFZFUklGWV9JU19BUFBST1gobTM9djIuYXNEaWFnb25hbCgpKm0yKnYxLmFzRGlhZ29uYWwoKSwgcmVmTTM9djIuYXNEaWFnb25hbCgpKnJlZk0yKnYxLmFzRGlhZ29uYWwoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtMyA9IHYyLmFzRGlhZ29uYWwoKSAqIG0yICogdjEuYXNEaWFnb25hbCgpLCByZWZNMyA9IHYyLmFzRGlhZ29uYWwoKSAqIHJlZk0yICogdjEuYXNEaWFnb25hbCgpKTsKIAotICAgIFZFUklGWV9JU19BUFBST1godjI9bTIqdjEuYXNEaWFnb25hbCgpKnYxLCByZWZNMip2MS5hc0RpYWdvbmFsKCkqdjEpOwotICAgIFZFUklGWV9JU19BUFBST1godjM9djIuYXNEaWFnb25hbCgpKm0yKnYxLCB2Mi5hc0RpYWdvbmFsKCkqcmVmTTIqdjEpOworICAgIFZFUklGWV9JU19BUFBST1godjIgPSBtMiAqIHYxLmFzRGlhZ29uYWwoKSAqIHYxLCByZWZNMiAqIHYxLmFzRGlhZ29uYWwoKSAqIHYxKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYzID0gdjIuYXNEaWFnb25hbCgpICogbTIgKiB2MSwgdjIuYXNEaWFnb25hbCgpICogcmVmTTIgKiB2MSk7CiAKICAgICAvLyBldmFsdWF0ZSB0byBhIGRlbnNlIG1hdHJpeCB0byBjaGVjayB0aGUgLnJvdygpIGFuZCAuY29sKCkgaXRlcmF0b3IgZnVuY3Rpb25zCi0gICAgVkVSSUZZX0lTX0FQUFJPWChkMz1tMipkMSwgcmVmTTM9cmVmTTIqZDEpOwotICAgIFZFUklGWV9JU19BUFBST1goZDM9bTIudHJhbnNwb3NlKCkqZDIsIHJlZk0zPXJlZk0yLnRyYW5zcG9zZSgpKmQyKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGQzPWQyKm0yLCByZWZNMz1kMipyZWZNMik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChkMz1kMSptMi50cmFuc3Bvc2UoKSwgcmVmTTM9ZDEqcmVmTTIudHJhbnNwb3NlKCkpOworICAgIFZFUklGWV9JU19BUFBST1goZDMgPSBtMiAqIGQxLCByZWZNMyA9IHJlZk0yICogZDEpOworICAgIFZFUklGWV9JU19BUFBST1goZDMgPSBtMi50cmFuc3Bvc2UoKSAqIGQyLCByZWZNMyA9IHJlZk0yLnRyYW5zcG9zZSgpICogZDIpOworICAgIFZFUklGWV9JU19BUFBST1goZDMgPSBkMiAqIG0yLCByZWZNMyA9IGQyICogcmVmTTIpOworICAgIFZFUklGWV9JU19BUFBST1goZDMgPSBkMSAqIG0yLnRyYW5zcG9zZSgpLCByZWZNMyA9IGQxICogcmVmTTIudHJhbnNwb3NlKCkpOwogICB9CiAKICAgLy8gdGVzdCBzZWxmLWFkam9pbnQgYW5kIHRyaWFuZ3VsYXItdmlldyBwcm9kdWN0cwpAQCAtMjgyLDcgKzI5Nyw3IEBACiAgICAgU3BhcnNlTWF0cml4VHlwZSBtQShyb3dzLCByb3dzKTsKICAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmQSwgbUEpOwogICAgIGRvIHsKLSAgICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZVcCwgbVVwLCBGb3JjZVJlYWxEaWFnfC8qRm9yY2VOb25aZXJvRGlhZ3wqL01ha2VVcHBlclRyaWFuZ3VsYXIpOworICAgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZlVwLCBtVXAsIEZvcmNlUmVhbERpYWcgfCAvKkZvcmNlTm9uWmVyb0RpYWd8Ki8gTWFrZVVwcGVyVHJpYW5ndWxhcik7CiAgICAgfSB3aGlsZSAocmVmVXAuaXNaZXJvKCkpOwogICAgIHJlZkxvID0gcmVmVXAuYWRqb2ludCgpOwogICAgIG1MbyA9IG1VcC5hZGpvaW50KCk7CkBAIC0yOTAsMTgyICszMDUsMTg5IEBACiAgICAgcmVmUy5kaWFnb25hbCgpICo9IDAuNTsKICAgICBtUyA9IG1VcCArIG1MbzsKICAgICAvLyBUT0RPIGJlIGFibGUgdG8gYWRkcmVzcyB0aGUgZGlhZ29uYWwuLi4uCi0gICAgZm9yIChpbnQgaz0wOyBrPG1TLm91dGVyU2l6ZSgpOyArK2spCi0gICAgICBmb3IgKHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU6OklubmVySXRlcmF0b3IgaXQobVMsayk7IGl0OyArK2l0KQotICAgICAgICBpZiAoaXQuaW5kZXgoKSA9PSBrKQotICAgICAgICAgIGl0LnZhbHVlUmVmKCkgKj0gU2NhbGFyKDAuNSk7CisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBtUy5vdXRlclNpemUoKTsgKytrKQorICAgICAgZm9yICh0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpJbm5lckl0ZXJhdG9yIGl0KG1TLCBrKTsgaXQ7ICsraXQpCisgICAgICAgIGlmIChpdC5pbmRleCgpID09IGspIGl0LnZhbHVlUmVmKCkgKj0gU2NhbGFyKDAuNSk7CiAKICAgICBWRVJJRllfSVNfQVBQUk9YKHJlZlMuYWRqb2ludCgpLCByZWZTKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG1TLmFkam9pbnQoKSwgbVMpOwogICAgIFZFUklGWV9JU19BUFBST1gobVMsIHJlZlMpOwotICAgIFZFUklGWV9JU19BUFBST1goeD1tUypiLCByZWZYPXJlZlMqYik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh4ID0gbVMgKiBiLCByZWZYID0gcmVmUyAqIGIpOwogCiAgICAgLy8gc3BhcnNlIHNlbGZhZGpvaW50VmlldyB3aXRoIGRlbnNlIG1hdHJpY2VzCi0gICAgVkVSSUZZX0lTX0FQUFJPWCh4PW1VcC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkqYiwgcmVmWD1yZWZTKmIpOwotICAgIFZFUklGWV9JU19BUFBST1goeD1tTG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKmIsIHJlZlg9cmVmUypiKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHg9bVMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyfExvd2VyPigpKmIsIHJlZlg9cmVmUypiKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHggPSBtVXAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpICogYiwgcmVmWCA9IHJlZlMgKiBiKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHggPSBtTG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpICogYiwgcmVmWCA9IHJlZlMgKiBiKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHggPSBtUy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXIgfCBMb3dlcj4oKSAqIGIsIHJlZlggPSByZWZTICogYik7CiAKLSAgICBWRVJJRllfSVNfQVBQUk9YKHg9YiAqIG1VcC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCksICAgICAgIHJlZlg9YipyZWZTKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHg9YiAqIG1Mby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCksICAgICAgIHJlZlg9YipyZWZTKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHg9YiAqIG1TLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcnxMb3dlcj4oKSwgIHJlZlg9YipyZWZTKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHggPSBiICogbVVwLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSwgcmVmWCA9IGIgKiByZWZTKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHggPSBiICogbUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSwgcmVmWCA9IGIgKiByZWZTKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHggPSBiICogbVMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyIHwgTG93ZXI+KCksIHJlZlggPSBiICogcmVmUyk7CiAKLSAgICBWRVJJRllfSVNfQVBQUk9YKHgubm9hbGlhcygpKz1tVXAudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpKmIsIHJlZlgrPXJlZlMqYik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCh4Lm5vYWxpYXMoKS09bUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSpiLCByZWZYLT1yZWZTKmIpOwotICAgIFZFUklGWV9JU19BUFBST1goeC5ub2FsaWFzKCkrPW1TLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcnxMb3dlcj4oKSpiLCByZWZYKz1yZWZTKmIpOworICAgIFZFUklGWV9JU19BUFBST1goeC5ub2FsaWFzKCkgKz0gbVVwLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKSAqIGIsIHJlZlggKz0gcmVmUyAqIGIpOworICAgIFZFUklGWV9JU19BUFBST1goeC5ub2FsaWFzKCkgLT0gbUxvLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIGIsIHJlZlggLT0gcmVmUyAqIGIpOworICAgIFZFUklGWV9JU19BUFBST1goeC5ub2FsaWFzKCkgKz0gbVMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyIHwgTG93ZXI+KCkgKiBiLCByZWZYICs9IHJlZlMgKiBiKTsKIAogICAgIC8vIHNwYXJzZSBzZWxmYWRqb2ludFZpZXcgd2l0aCBzcGFyc2UgbWF0cmljZXMKLSAgICBTcGFyc2VNYXRyaXhUeXBlIG1TcmVzKHJvd3Mscm93cyk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtU3JlcyA9IG1Mby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkqbVMsCi0gICAgICAgICAgICAgICAgICAgICByZWZYID0gcmVmTG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKnJlZlMpOworICAgIFNwYXJzZU1hdHJpeFR5cGUgbVNyZXMocm93cywgcm93cyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtU3JlcyA9IG1Mby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiBtUywKKyAgICAgICAgICAgICAgICAgICAgIHJlZlggPSByZWZMby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiByZWZTKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG1TcmVzID0gbVMgKiBtTG8udGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLAogICAgICAgICAgICAgICAgICAgICAgcmVmWCA9IHJlZlMgKiByZWZMby50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkpOwogCiAgICAgLy8gc3BhcnNlIHRyaWFuZ3VsYXJWaWV3IHdpdGggZGVuc2UgbWF0cmljZXMKLSAgICBWRVJJRllfSVNfQVBQUk9YKHg9bUEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkqYiwgcmVmWD1yZWZBLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKmIpOwotICAgIFZFUklGWV9JU19BUFBST1goeD1tQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSpiLCByZWZYPXJlZkEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkqYik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCh4PWIqbUEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIHJlZlg9YipyZWZBLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHg9YiptQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgcmVmWD1iKnJlZkEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkpOworICAgIFZFUklGWV9JU19BUFBST1goeCA9IG1BLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogYiwgcmVmWCA9IHJlZkEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiBiKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHggPSBtQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSAqIGIsIHJlZlggPSByZWZBLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICogYik7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh4ID0gYiAqIG1BLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCByZWZYID0gYiAqIHJlZkEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpOworICAgIFZFUklGWV9JU19BUFBST1goeCA9IGIgKiBtQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgcmVmWCA9IGIgKiByZWZBLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKTsKIAogICAgIC8vIHNwYXJzZSB0cmlhbmd1bGFyVmlldyB3aXRoIHNwYXJzZSBtYXRyaWNlcwotICAgIFZFUklGWV9JU19BUFBST1gobVNyZXMgPSBtQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSptUywgICByZWZYID0gcmVmQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSpyZWZTKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG1TcmVzID0gbVMgKiBtQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSwgcmVmWCA9IHJlZlMgKiByZWZBLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG1TcmVzID0gbUEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkqbVMsICAgcmVmWCA9IHJlZkEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkqcmVmUyk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChtU3JlcyA9IG1TICogbUEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIHJlZlggPSByZWZTICogcmVmQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtU3JlcyA9IG1BLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpICogbVMsCisgICAgICAgICAgICAgICAgICAgICByZWZYID0gcmVmQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKSAqIHJlZlMpOworICAgIFZFUklGWV9JU19BUFBST1gobVNyZXMgPSBtUyAqIG1BLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLAorICAgICAgICAgICAgICAgICAgICAgcmVmWCA9IHJlZlMgKiByZWZBLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG1TcmVzID0gbUEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKiBtUywKKyAgICAgICAgICAgICAgICAgICAgIHJlZlggPSByZWZBLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICogcmVmUyk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChtU3JlcyA9IG1TICogbUEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksCisgICAgICAgICAgICAgICAgICAgICByZWZYID0gcmVmUyAqIHJlZkEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpOwogICB9CiB9CiAKIC8vIE5ldyB0ZXN0IGZvciBCdWcgaW4gU3BhcnNlVGltZURlbnNlUHJvZHVjdAotdGVtcGxhdGU8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZSwgdHlwZW5hbWUgRGVuc2VNYXRyaXhUeXBlPiB2b2lkIHNwYXJzZV9wcm9kdWN0X3JlZ3Jlc3Npb25fdGVzdCgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZSwgdHlwZW5hbWUgRGVuc2VNYXRyaXhUeXBlPgordm9pZCBzcGFyc2VfcHJvZHVjdF9yZWdyZXNzaW9uX3Rlc3QoKSB7CiAgIC8vIFRoaXMgY29kZSBkb2VzIG5vdCBjb21waWxlIHdpdGggYWZmbGljdGVkIHZlcnNpb25zIG9mIHRoZSBidWcKLSAgU3BhcnNlTWF0cml4VHlwZSBzbTEoMywyKTsKLSAgRGVuc2VNYXRyaXhUeXBlIG0yKDIsMik7CisgIFNwYXJzZU1hdHJpeFR5cGUgc20xKDMsIDIpOworICBEZW5zZU1hdHJpeFR5cGUgbTIoMiwgMik7CiAgIHNtMS5zZXRaZXJvKCk7CiAgIG0yLnNldFplcm8oKTsKIAotICBEZW5zZU1hdHJpeFR5cGUgbTMgPSBzbTEqbTI7Ci0KKyAgRGVuc2VNYXRyaXhUeXBlIG0zID0gc20xICogbTI7CiAKICAgLy8gVGhpcyBjb2RlIHByb2R1Y2VzIGEgc2VnZmF1bHQgd2l0aCBhZmZsaWN0ZWQgdmVyc2lvbnMgb2YgYW5vdGhlciBTcGFyc2VUaW1lRGVuc2VQcm9kdWN0CiAgIC8vIGJ1ZwogCi0gIFNwYXJzZU1hdHJpeFR5cGUgc20yKDIwMDAwLDIpOworICBTcGFyc2VNYXRyaXhUeXBlIHNtMigyMDAwMCwgMik7CiAgIHNtMi5zZXRaZXJvKCk7Ci0gIERlbnNlTWF0cml4VHlwZSBtNChzbTIqbTIpOworICBEZW5zZU1hdHJpeFR5cGUgbTQoc20yICogbTIpOwogCi0gIFZFUklGWV9JU19BUFBST1goIG00KDAsMCksIDAuMCApOworICBWRVJJRllfSVNfQVBQUk9YKG00KDAsIDApLCAwLjApOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIGJ1Z185NDIoKQotewotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+ICAgICBWZWN0b3I7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBidWdfOTQyKCkgeworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IFZlY3RvcjsKICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLCBDb2xNYWpvcj4gQ29sU3BNYXQ7CiAgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhciwgUm93TWFqb3I+IFJvd1NwTWF0OwotICBDb2xTcE1hdCBjbUEoMSwxKTsKLSAgY21BLmluc2VydCgwLDApID0gMTsKKyAgQ29sU3BNYXQgY21BKDEsIDEpOworICBjbUEuaW5zZXJ0KDAsIDApID0gMTsKIAotICBSb3dTcE1hdCBybUEoMSwxKTsKLSAgcm1BLmluc2VydCgwLDApID0gMTsKKyAgUm93U3BNYXQgcm1BKDEsIDEpOworICBybUEuaW5zZXJ0KDAsIDApID0gMTsKIAogICBWZWN0b3IgZCgxKTsKICAgZFswXSA9IDI7CiAKICAgZG91YmxlIHJlcyA9IDI7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWCggKCBjbUEqZC5hc0RpYWdvbmFsKCkgKS5ldmFsKCkuY29lZmYoMCwwKSwgcmVzICk7Ci0gIFZFUklGWV9JU19BUFBST1goICggZC5hc0RpYWdvbmFsKCkqcm1BICkuZXZhbCgpLmNvZWZmKDAsMCksIHJlcyApOwotICBWRVJJRllfSVNfQVBQUk9YKCAoIHJtQSpkLmFzRGlhZ29uYWwoKSApLmV2YWwoKS5jb2VmZigwLDApLCByZXMgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggKCBkLmFzRGlhZ29uYWwoKSpjbUEgKS5ldmFsKCkuY29lZmYoMCwwKSwgcmVzICk7CisgIFZFUklGWV9JU19BUFBST1goKGNtQSAqIGQuYXNEaWFnb25hbCgpKS5ldmFsKCkuY29lZmYoMCwgMCksIHJlcyk7CisgIFZFUklGWV9JU19BUFBST1goKGQuYXNEaWFnb25hbCgpICogcm1BKS5ldmFsKCkuY29lZmYoMCwgMCksIHJlcyk7CisgIFZFUklGWV9JU19BUFBST1goKHJtQSAqIGQuYXNEaWFnb25hbCgpKS5ldmFsKCkuY29lZmYoMCwgMCksIHJlcyk7CisgIFZFUklGWV9JU19BUFBST1goKGQuYXNEaWFnb25hbCgpICogY21BKS5ldmFsKCkuY29lZmYoMCwgMCksIHJlcyk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFJlYWw+Ci12b2lkIHRlc3RfbWl4aW5nX3R5cGVzKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZWFsPgordm9pZCB0ZXN0X21peGluZ190eXBlcygpIHsKICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8UmVhbD4gQ3BseDsKICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8UmVhbD4gU3BNYXRSZWFsOwogICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxDcGx4PiBTcE1hdENwbHg7Ci0gIHR5cGVkZWYgU3BhcnNlTWF0cml4PENwbHgsUm93TWFqb3I+IFNwUm93TWF0Q3BseDsKLSAgdHlwZWRlZiBNYXRyaXg8UmVhbCxEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0UmVhbDsKLSAgdHlwZWRlZiBNYXRyaXg8Q3BseCxEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0Q3BseDsKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8Q3BseCwgUm93TWFqb3I+IFNwUm93TWF0Q3BseDsKKyAgdHlwZWRlZiBNYXRyaXg8UmVhbCwgRHluYW1pYywgRHluYW1pYz4gRGVuc2VNYXRSZWFsOworICB0eXBlZGVmIE1hdHJpeDxDcGx4LCBEeW5hbWljLCBEeW5hbWljPiBEZW5zZU1hdENwbHg7CiAKLSAgSW5kZXggbiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsMTAwKTsKLSAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguL3N0YXRpY19jYXN0PGRvdWJsZT4obipuKSwgMC4yKTsKKyAgSW5kZXggbiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIDEwMCk7CisgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4LiAvIHN0YXRpY19jYXN0PGRvdWJsZT4obiAqIG4pLCAwLjIpOwogCi0gIFNwTWF0UmVhbCBzUjEobixuKTsKLSAgU3BNYXRDcGx4IHNDMShuLG4pLCBzQzIobixuKSwgc0MzKG4sbik7Ci0gIFNwUm93TWF0Q3BseCBzQ1IobixuKTsKLSAgRGVuc2VNYXRSZWFsIGRSMShuLG4pOwotICBEZW5zZU1hdENwbHggZEMxKG4sbiksIGRDMihuLG4pLCBkQzMobixuKTsKKyAgU3BNYXRSZWFsIHNSMShuLCBuKTsKKyAgU3BNYXRDcGx4IHNDMShuLCBuKSwgc0MyKG4sIG4pLCBzQzMobiwgbik7CisgIFNwUm93TWF0Q3BseCBzQ1Iobiwgbik7CisgIERlbnNlTWF0UmVhbCBkUjEobiwgbik7CisgIERlbnNlTWF0Q3BseCBkQzEobiwgbiksIGRDMihuLCBuKSwgZEMzKG4sIG4pOwogCiAgIGluaXRTcGFyc2U8UmVhbD4oZGVuc2l0eSwgZFIxLCBzUjEpOwogICBpbml0U3BhcnNlPENwbHg+KGRlbnNpdHksIGRDMSwgc0MxKTsKICAgaW5pdFNwYXJzZTxDcGx4PihkZW5zaXR5LCBkQzIsIHNDMik7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNSMSAqIHNDMSksICAgICAgICAgICAgICAgICAgICAgICAgIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKiBkQzEgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNDMSAqIHNSMSksICAgICAgICAgICAgICAgICAgICAgICAgIGRDMyA9IGRDMSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNSMS50cmFuc3Bvc2UoKSAqIHNDMSksICAgICAgICAgICAgIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkgKiBkQzEgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNDMS50cmFuc3Bvc2UoKSAqIHNSMSksICAgICAgICAgICAgIGRDMyA9IGRDMS50cmFuc3Bvc2UoKSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNSMSAqIHNDMS50cmFuc3Bvc2UoKSksICAgICAgICAgICAgIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKiBkQzEudHJhbnNwb3NlKCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNDMSAqIHNSMS50cmFuc3Bvc2UoKSksICAgICAgICAgICAgIGRDMyA9IGRDMSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNSMS50cmFuc3Bvc2UoKSAqIHNDMS50cmFuc3Bvc2UoKSksIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkgKiBkQzEudHJhbnNwb3NlKCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNDMS50cmFuc3Bvc2UoKSAqIHNSMS50cmFuc3Bvc2UoKSksIGRDMyA9IGRDMS50cmFuc3Bvc2UoKSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzQzIgPSAoc1IxICogc0MxKSwgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMSk7CisgIFZFUklGWV9JU19BUFBST1goc0MyID0gKHNDMSAqIHNSMSksIGRDMyA9IGRDMSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNDMiA9IChzUjEudHJhbnNwb3NlKCkgKiBzQzEpLCBkQzMgPSBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpLnRyYW5zcG9zZSgpICogZEMxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzQzIgPSAoc0MxLnRyYW5zcG9zZSgpICogc1IxKSwgZEMzID0gZEMxLnRyYW5zcG9zZSgpICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc0MyID0gKHNSMSAqIHNDMS50cmFuc3Bvc2UoKSksIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKiBkQzEudHJhbnNwb3NlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNDMiA9IChzQzEgKiBzUjEudHJhbnNwb3NlKCkpLCBkQzMgPSBkQzEgKiBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzQzIgPSAoc1IxLnRyYW5zcG9zZSgpICogc0MxLnRyYW5zcG9zZSgpKSwKKyAgICAgICAgICAgICAgICAgICBkQzMgPSBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpLnRyYW5zcG9zZSgpICogZEMxLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzQzIgPSAoc0MxLnRyYW5zcG9zZSgpICogc1IxLnRyYW5zcG9zZSgpKSwKKyAgICAgICAgICAgICAgICAgICBkQzMgPSBkQzEudHJhbnNwb3NlKCkgKiBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpLnRyYW5zcG9zZSgpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc1IxICogc0MxKSwgICAgICAgICAgICAgICAgICAgICAgICAgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc0MxICogc1IxKSwgICAgICAgICAgICAgICAgICAgICAgICAgZEMzID0gZEMxICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc1IxLnRyYW5zcG9zZSgpICogc0MxKSwgICAgICAgICAgICAgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSAqIGRDMSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc0MxLnRyYW5zcG9zZSgpICogc1IxKSwgICAgICAgICAgICAgZEMzID0gZEMxLnRyYW5zcG9zZSgpICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc1IxICogc0MxLnRyYW5zcG9zZSgpKSwgICAgICAgICAgICAgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMS50cmFuc3Bvc2UoKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc0MxICogc1IxLnRyYW5zcG9zZSgpKSwgICAgICAgICAgICAgZEMzID0gZEMxICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc1IxLnRyYW5zcG9zZSgpICogc0MxLnRyYW5zcG9zZSgpKSwgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSAqIGRDMS50cmFuc3Bvc2UoKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc0MxLnRyYW5zcG9zZSgpICogc1IxLnRyYW5zcG9zZSgpKSwgZEMzID0gZEMxLnRyYW5zcG9zZSgpICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSApOworICBWRVJJRllfSVNfQVBQUk9YKHNDUiA9IChzUjEgKiBzQzEpLCBkQzMgPSBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpICogZEMxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzQ1IgPSAoc0MxICogc1IxKSwgZEMzID0gZEMxICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc0NSID0gKHNSMS50cmFuc3Bvc2UoKSAqIHNDMSksIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkgKiBkQzEpOworICBWRVJJRllfSVNfQVBQUk9YKHNDUiA9IChzQzEudHJhbnNwb3NlKCkgKiBzUjEpLCBkQzMgPSBkQzEudHJhbnNwb3NlKCkgKiBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzQ1IgPSAoc1IxICogc0MxLnRyYW5zcG9zZSgpKSwgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMS50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9JU19BUFBST1goc0NSID0gKHNDMSAqIHNSMS50cmFuc3Bvc2UoKSksIGRDMyA9IGRDMSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNDUiA9IChzUjEudHJhbnNwb3NlKCkgKiBzQzEudHJhbnNwb3NlKCkpLAorICAgICAgICAgICAgICAgICAgIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkgKiBkQzEudHJhbnNwb3NlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNDUiA9IChzQzEudHJhbnNwb3NlKCkgKiBzUjEudHJhbnNwb3NlKCkpLAorICAgICAgICAgICAgICAgICAgIGRDMyA9IGRDMS50cmFuc3Bvc2UoKSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkpOwogCisgIFZFUklGWV9JU19BUFBST1goc0MyID0gKHNSMSAqIHNDMSkucHJ1bmVkKCksIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKiBkQzEpOworICBWRVJJRllfSVNfQVBQUk9YKHNDMiA9IChzQzEgKiBzUjEpLnBydW5lZCgpLCBkQzMgPSBkQzEgKiBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzQzIgPSAoc1IxLnRyYW5zcG9zZSgpICogc0MxKS5wcnVuZWQoKSwgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSAqIGRDMSk7CisgIFZFUklGWV9JU19BUFBST1goc0MyID0gKHNDMS50cmFuc3Bvc2UoKSAqIHNSMSkucHJ1bmVkKCksIGRDMyA9IGRDMS50cmFuc3Bvc2UoKSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNDMiA9IChzUjEgKiBzQzEudHJhbnNwb3NlKCkpLnBydW5lZCgpLCBkQzMgPSBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpICogZEMxLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzQzIgPSAoc0MxICogc1IxLnRyYW5zcG9zZSgpKS5wcnVuZWQoKSwgZEMzID0gZEMxICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9JU19BUFBST1goc0MyID0gKHNSMS50cmFuc3Bvc2UoKSAqIHNDMS50cmFuc3Bvc2UoKSkucHJ1bmVkKCksCisgICAgICAgICAgICAgICAgICAgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSAqIGRDMS50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9JU19BUFBST1goc0MyID0gKHNDMS50cmFuc3Bvc2UoKSAqIHNSMS50cmFuc3Bvc2UoKSkucHJ1bmVkKCksCisgICAgICAgICAgICAgICAgICAgZEMzID0gZEMxLnRyYW5zcG9zZSgpICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNSMSAqIHNDMSkucHJ1bmVkKCksICAgICAgICAgICAgICAgICAgICAgICAgIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKiBkQzEgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNDMSAqIHNSMSkucHJ1bmVkKCksICAgICAgICAgICAgICAgICAgICAgICAgIGRDMyA9IGRDMSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNSMS50cmFuc3Bvc2UoKSAqIHNDMSkucHJ1bmVkKCksICAgICAgICAgICAgIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkgKiBkQzEgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNDMS50cmFuc3Bvc2UoKSAqIHNSMSkucHJ1bmVkKCksICAgICAgICAgICAgIGRDMyA9IGRDMS50cmFuc3Bvc2UoKSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNSMSAqIHNDMS50cmFuc3Bvc2UoKSkucHJ1bmVkKCksICAgICAgICAgICAgIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKiBkQzEudHJhbnNwb3NlKCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNDMSAqIHNSMS50cmFuc3Bvc2UoKSkucHJ1bmVkKCksICAgICAgICAgICAgIGRDMyA9IGRDMSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNSMS50cmFuc3Bvc2UoKSAqIHNDMS50cmFuc3Bvc2UoKSkucHJ1bmVkKCksIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkgKiBkQzEudHJhbnNwb3NlKCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggc0MyID0gKHNDMS50cmFuc3Bvc2UoKSAqIHNSMS50cmFuc3Bvc2UoKSkucHJ1bmVkKCksIGRDMyA9IGRDMS50cmFuc3Bvc2UoKSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzQ1IgPSAoc1IxICogc0MxKS5wcnVuZWQoKSwgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMSk7CisgIFZFUklGWV9JU19BUFBST1goc0NSID0gKHNDMSAqIHNSMSkucHJ1bmVkKCksIGRDMyA9IGRDMSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNDUiA9IChzUjEudHJhbnNwb3NlKCkgKiBzQzEpLnBydW5lZCgpLCBkQzMgPSBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpLnRyYW5zcG9zZSgpICogZEMxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzQ1IgPSAoc0MxLnRyYW5zcG9zZSgpICogc1IxKS5wcnVuZWQoKSwgZEMzID0gZEMxLnRyYW5zcG9zZSgpICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSk7CisgIFZFUklGWV9JU19BUFBST1goc0NSID0gKHNSMSAqIHNDMS50cmFuc3Bvc2UoKSkucHJ1bmVkKCksIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKiBkQzEudHJhbnNwb3NlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHNDUiA9IChzQzEgKiBzUjEudHJhbnNwb3NlKCkpLnBydW5lZCgpLCBkQzMgPSBkQzEgKiBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzQ1IgPSAoc1IxLnRyYW5zcG9zZSgpICogc0MxLnRyYW5zcG9zZSgpKS5wcnVuZWQoKSwKKyAgICAgICAgICAgICAgICAgICBkQzMgPSBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpLnRyYW5zcG9zZSgpICogZEMxLnRyYW5zcG9zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChzQ1IgPSAoc0MxLnRyYW5zcG9zZSgpICogc1IxLnRyYW5zcG9zZSgpKS5wcnVuZWQoKSwKKyAgICAgICAgICAgICAgICAgICBkQzMgPSBkQzEudHJhbnNwb3NlKCkgKiBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpLnRyYW5zcG9zZSgpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc1IxICogc0MxKS5wcnVuZWQoKSwgICAgICAgICAgICAgICAgICAgICAgICAgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc0MxICogc1IxKS5wcnVuZWQoKSwgICAgICAgICAgICAgICAgICAgICAgICAgZEMzID0gZEMxICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc1IxLnRyYW5zcG9zZSgpICogc0MxKS5wcnVuZWQoKSwgICAgICAgICAgICAgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSAqIGRDMSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc0MxLnRyYW5zcG9zZSgpICogc1IxKS5wcnVuZWQoKSwgICAgICAgICAgICAgZEMzID0gZEMxLnRyYW5zcG9zZSgpICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc1IxICogc0MxLnRyYW5zcG9zZSgpKS5wcnVuZWQoKSwgICAgICAgICAgICAgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMS50cmFuc3Bvc2UoKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc0MxICogc1IxLnRyYW5zcG9zZSgpKS5wcnVuZWQoKSwgICAgICAgICAgICAgZEMzID0gZEMxICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc1IxLnRyYW5zcG9zZSgpICogc0MxLnRyYW5zcG9zZSgpKS5wcnVuZWQoKSwgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSAqIGRDMS50cmFuc3Bvc2UoKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBzQ1IgPSAoc0MxLnRyYW5zcG9zZSgpICogc1IxLnRyYW5zcG9zZSgpKS5wcnVuZWQoKSwgZEMzID0gZEMxLnRyYW5zcG9zZSgpICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSApOworICBWRVJJRllfSVNfQVBQUk9YKGRDMiA9IChzUjEgKiBzQzEpLCBkQzMgPSBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpICogZEMxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChkQzIgPSAoc0MxICogc1IxKSwgZEMzID0gZEMxICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSk7CisgIFZFUklGWV9JU19BUFBST1goZEMyID0gKHNSMS50cmFuc3Bvc2UoKSAqIHNDMSksIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkgKiBkQzEpOworICBWRVJJRllfSVNfQVBQUk9YKGRDMiA9IChzQzEudHJhbnNwb3NlKCkgKiBzUjEpLCBkQzMgPSBkQzEudHJhbnNwb3NlKCkgKiBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChkQzIgPSAoc1IxICogc0MxLnRyYW5zcG9zZSgpKSwgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMS50cmFuc3Bvc2UoKSk7CisgIFZFUklGWV9JU19BUFBST1goZEMyID0gKHNDMSAqIHNSMS50cmFuc3Bvc2UoKSksIGRDMyA9IGRDMSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKGRDMiA9IChzUjEudHJhbnNwb3NlKCkgKiBzQzEudHJhbnNwb3NlKCkpLAorICAgICAgICAgICAgICAgICAgIGRDMyA9IGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkgKiBkQzEudHJhbnNwb3NlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKGRDMiA9IChzQzEudHJhbnNwb3NlKCkgKiBzUjEudHJhbnNwb3NlKCkpLAorICAgICAgICAgICAgICAgICAgIGRDMyA9IGRDMS50cmFuc3Bvc2UoKSAqIGRSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkudHJhbnNwb3NlKCkpOwogCisgIFZFUklGWV9JU19BUFBST1goZEMyID0gZFIxICogc0MxLCBkQzMgPSBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpICogc0MxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChkQzIgPSBzUjEgKiBkQzEsIGRDMyA9IHNSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKiBkQzEpOworICBWRVJJRllfSVNfQVBQUk9YKGRDMiA9IGRDMSAqIHNSMSwgZEMzID0gZEMxICogc1IxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSk7CisgIFZFUklGWV9JU19BUFBST1goZEMyID0gc0MxICogZFIxLCBkQzMgPSBzQzEgKiBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKCBkQzIgPSAoc1IxICogc0MxKSwgICAgICAgICAgICAgICAgICAgICAgICAgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBkQzIgPSAoc0MxICogc1IxKSwgICAgICAgICAgICAgICAgICAgICAgICAgZEMzID0gZEMxICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBkQzIgPSAoc1IxLnRyYW5zcG9zZSgpICogc0MxKSwgICAgICAgICAgICAgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSAqIGRDMSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBkQzIgPSAoc0MxLnRyYW5zcG9zZSgpICogc1IxKSwgICAgICAgICAgICAgZEMzID0gZEMxLnRyYW5zcG9zZSgpICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBkQzIgPSAoc1IxICogc0MxLnRyYW5zcG9zZSgpKSwgICAgICAgICAgICAgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMS50cmFuc3Bvc2UoKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBkQzIgPSAoc0MxICogc1IxLnRyYW5zcG9zZSgpKSwgICAgICAgICAgICAgZEMzID0gZEMxICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBkQzIgPSAoc1IxLnRyYW5zcG9zZSgpICogc0MxLnRyYW5zcG9zZSgpKSwgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSAqIGRDMS50cmFuc3Bvc2UoKSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBkQzIgPSAoc0MxLnRyYW5zcG9zZSgpICogc1IxLnRyYW5zcG9zZSgpKSwgZEMzID0gZEMxLnRyYW5zcG9zZSgpICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS50cmFuc3Bvc2UoKSApOwotCi0KLSAgVkVSSUZZX0lTX0FQUFJPWCggZEMyID0gZFIxICogc0MxLCBkQzMgPSBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpICogc0MxICk7Ci0gIFZFUklGWV9JU19BUFBST1goIGRDMiA9IHNSMSAqIGRDMSwgZEMzID0gc1IxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMSApOwotICBWRVJJRllfSVNfQVBQUk9YKCBkQzIgPSBkQzEgKiBzUjEsIGRDMyA9IGRDMSAqIHNSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggZEMyID0gc0MxICogZFIxLCBkQzMgPSBzQzEgKiBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpICk7Ci0KLSAgVkVSSUZZX0lTX0FQUFJPWCggZEMyID0gZFIxLnJvdygwKSAqIHNDMSwgZEMzID0gZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS5yb3coMCkgKiBzQzEgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggZEMyID0gc1IxICogZEMxLmNvbCgwKSwgZEMzID0gc1IxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMS5jb2woMCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggZEMyID0gZEMxLnJvdygwKSAqIHNSMSwgZEMzID0gZEMxLnJvdygwKSAqIHNSMS50ZW1wbGF0ZSBjYXN0PENwbHg+KCkgKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggZEMyID0gc0MxICogZFIxLmNvbCgwKSwgZEMzID0gc0MxICogZFIxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKS5jb2woMCkgKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChkQzIgPSBkUjEucm93KDApICogc0MxLCBkQzMgPSBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpLnJvdygwKSAqIHNDMSk7CisgIFZFUklGWV9JU19BUFBST1goZEMyID0gc1IxICogZEMxLmNvbCgwKSwgZEMzID0gc1IxLnRlbXBsYXRlIGNhc3Q8Q3BseD4oKSAqIGRDMS5jb2woMCkpOworICBWRVJJRllfSVNfQVBQUk9YKGRDMiA9IGRDMS5yb3coMCkgKiBzUjEsIGRDMyA9IGRDMS5yb3coMCkgKiBzUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChkQzIgPSBzQzEgKiBkUjEuY29sKDApLCBkQzMgPSBzQzEgKiBkUjEudGVtcGxhdGUgY2FzdDxDcGx4PigpLmNvbCgwKSk7CiB9CiAKIC8vIFRlc3QgbWl4ZWQgc3RvcmFnZSB0eXBlcwotdGVtcGxhdGU8aW50IE9yZGVyQSwgaW50IE9yZGVyQiwgaW50IE9yZGVyQz4KK3RlbXBsYXRlIDxpbnQgT3JkZXJBLCBpbnQgT3JkZXJCLCBpbnQgT3JkZXJDPgogdm9pZCB0ZXN0X21peGVkX3N0b3JhZ2VfaW1wKCkgewogICB0eXBlZGVmIGZsb2F0IFJlYWw7Ci0gIHR5cGVkZWYgTWF0cml4PFJlYWwsRHluYW1pYyxEeW5hbWljPiBEZW5zZU1hdDsKKyAgdHlwZWRlZiBNYXRyaXg8UmVhbCwgRHluYW1pYywgRHluYW1pYz4gRGVuc2VNYXQ7CiAKICAgLy8gQ2FzZTogTGFyZ2UgaW5wdXRzIGJ1dCBzbWFsbCByZXN1bHQKICAgewpAQCAtNDgxLDcgKzUwMyw3IEBACiAgICAgU3BhcnNlTWF0cml4PFJlYWwsIE9yZGVyQz4gcmVzdWx0X2xhcmdlOwogICAgIERlbnNlTWF0IHJlZlJlc3VsdDsKIAotICAgIFZFUklGWV9JU19BUFBST1goIHJlc3VsdCA9IChBICogQiksIHJlZlJlc3VsdCA9IHJlZkEgKiByZWZCICk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQgPSAoQSAqIEIpLCByZWZSZXN1bHQgPSByZWZBICogcmVmQik7CiAgIH0KIAogICAvLyBDYXNlOiBTbWFsbCBpbnB1dCBidXQgbGFyZ2UgcmVzdWx0CkBAIC00OTgsNyArNTIwLDcgQEAKICAgICBTcGFyc2VNYXRyaXg8UmVhbCwgT3JkZXJDPiByZXN1bHRfbGFyZ2U7CiAgICAgRGVuc2VNYXQgcmVmUmVzdWx0OwogCi0gICAgVkVSSUZZX0lTX0FQUFJPWCggcmVzdWx0ID0gKEEgKiBCKSwgcmVmUmVzdWx0ID0gcmVmQSAqIHJlZkIgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCA9IChBICogQiksIHJlZlJlc3VsdCA9IHJlZkEgKiByZWZCKTsKICAgfQogfQogCkBAIC01MTMsMTggKzUzNSwxOCBAQAogICB0ZXN0X21peGVkX3N0b3JhZ2VfaW1wPENvbE1ham9yLCBDb2xNYWpvciwgQ29sTWFqb3I+KCk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChzcGFyc2VfcHJvZHVjdCkKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggKHNwYXJzZV9wcm9kdWN0PFNwYXJzZU1hdHJpeDxkb3VibGUsQ29sTWFqb3I+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggKHNwYXJzZV9wcm9kdWN0PFNwYXJzZU1hdHJpeDxkb3VibGUsUm93TWFqb3I+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMSggKGJ1Z185NDI8ZG91YmxlPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCAoc3BhcnNlX3Byb2R1Y3Q8U3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBDb2xNYWpvciA+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggKHNwYXJzZV9wcm9kdWN0PFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgUm93TWFqb3IgPiA+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIChzcGFyc2VfcHJvZHVjdDxTcGFyc2VNYXRyaXg8ZmxvYXQsQ29sTWFqb3IsbG9uZyBpbnQ+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggKHNwYXJzZV9wcm9kdWN0X3JlZ3Jlc3Npb25fdGVzdDxTcGFyc2VNYXRyaXg8ZG91YmxlLFJvd01ham9yPiwgTWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+ID4oKSkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChzcGFyc2VfcHJvZHVjdCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSgoc3BhcnNlX3Byb2R1Y3Q8U3BhcnNlTWF0cml4PGRvdWJsZSwgQ29sTWFqb3I+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF8xKChzcGFyc2VfcHJvZHVjdDxTcGFyc2VNYXRyaXg8ZG91YmxlLCBSb3dNYWpvcj4gPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoKGJ1Z185NDI8ZG91YmxlPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKHNwYXJzZV9wcm9kdWN0PFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwgQ29sTWFqb3I+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKChzcGFyc2VfcHJvZHVjdDxTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIFJvd01ham9yPiA+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoc3BhcnNlX3Byb2R1Y3Q8U3BhcnNlTWF0cml4PGZsb2F0LCBDb2xNYWpvciwgbG9uZyBpbnQ+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF80KCgKKyAgICAgICAgc3BhcnNlX3Byb2R1Y3RfcmVncmVzc2lvbl90ZXN0PFNwYXJzZU1hdHJpeDxkb3VibGUsIFJvd01ham9yPiwgTWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+ID4oKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzUoICh0ZXN0X21peGluZ190eXBlczxmbG9hdD4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggKHRlc3RfbWl4ZWRfc3RvcmFnZSgpKSApOworICAgIENBTExfU1VCVEVTVF81KCh0ZXN0X21peGluZ190eXBlczxmbG9hdD4oKSkpOworICAgIENBTExfU1VCVEVTVF81KCh0ZXN0X21peGVkX3N0b3JhZ2UoKSkpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZV9yZWYuY3BwIGIvdGVzdC9zcGFyc2VfcmVmLmNwcAppbmRleCAwOTgzMzFlLi5iZmVkY2Q5IDEwMDY0NAotLS0gYS90ZXN0L3NwYXJzZV9yZWYuY3BwCisrKyBiL3Rlc3Qvc3BhcnNlX3JlZi5jcHAKQEAgLTE5LDEyMSArMTksMTI5IEBACiAgIG5iX3RlbXBvcmFyaWVzKys7CiB9CiAKLSNkZWZpbmUgRUlHRU5fU1BBUlNFX0NSRUFURV9URU1QT1JBUllfUExVR0lOIHsgb25fdGVtcG9yYXJ5X2NyZWF0aW9uKCk7IH0KKyNkZWZpbmUgRUlHRU5fU1BBUlNFX0NSRUFURV9URU1QT1JBUllfUExVR0lOIFwKKyAgeyBvbl90ZW1wb3JhcnlfY3JlYXRpb24oKTsgfQogCiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgPEVpZ2VuL1NwYXJzZUNvcmU+CiAKLSNkZWZpbmUgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoWFBSLE4pIHtcCi0gICAgbmJfdGVtcG9yYXJpZXMgPSAwOyBcCi0gICAgQ0FMTF9TVUJURVNUKCBYUFIgKTsgXAotICAgIGlmKG5iX3RlbXBvcmFyaWVzIT1OKSBzdGQ6OmNlcnIgPDwgIm5iX3RlbXBvcmFyaWVzID09ICIgPDwgbmJfdGVtcG9yYXJpZXMgPDwgIlxuIjsgXAotICAgIFZFUklGWSggKCNYUFIpICYmIG5iX3RlbXBvcmFyaWVzPT1OICk7IFwKKyNkZWZpbmUgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoWFBSLCBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuYl90ZW1wb3JhcmllcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDQUxMX1NVQlRFU1QoWFBSKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobmJfdGVtcG9yYXJpZXMgIT0gTikgc3RkOjpjZXJyIDw8ICJuYl90ZW1wb3JhcmllcyA9PSAiIDw8IG5iX3RlbXBvcmFyaWVzIDw8ICJcbiI7IFwKKyAgICBWRVJJRlkoKCNYUFIpICYmIG5iX3RlbXBvcmFyaWVzID09IE4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU+IHZvaWQgY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoY29uc3QgUGxhaW5PYmplY3RUeXBlJikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBQbGFpbk9iamVjdFR5cGU+Cit2b2lkIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKGNvbnN0IFBsYWluT2JqZWN0VHlwZSAmKSB7CiAgIC8vIHZlcmlmeSB0aGF0IHJlZi10by1jb25zdCBkb24ndCBoYXZlIEx2YWx1ZUJpdAogICB0eXBlZGVmIHN0ZDo6YWRkX2NvbnN0X3Q8UGxhaW5PYmplY3RUeXBlPiBDb25zdFBsYWluT2JqZWN0VHlwZTsKLSAgVkVSSUZZKCAhKGludGVybmFsOjp0cmFpdHM8UmVmPENvbnN0UGxhaW5PYmplY3RUeXBlPiA+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKLSAgVkVSSUZZKCAhKGludGVybmFsOjp0cmFpdHM8UmVmPENvbnN0UGxhaW5PYmplY3RUeXBlLCBBbGlnbmVkPiA+OjpGbGFncyAmIEx2YWx1ZUJpdCkgKTsKLSAgVkVSSUZZKCAhKFJlZjxDb25zdFBsYWluT2JqZWN0VHlwZT46OkZsYWdzICYgTHZhbHVlQml0KSApOwotICBWRVJJRlkoICEoUmVmPENvbnN0UGxhaW5PYmplY3RUeXBlLCBBbGlnbmVkPjo6RmxhZ3MgJiBMdmFsdWVCaXQpICk7CisgIFZFUklGWSghKGludGVybmFsOjp0cmFpdHM8UmVmPENvbnN0UGxhaW5PYmplY3RUeXBlPiA+OjpGbGFncyAmIEx2YWx1ZUJpdCkpOworICBWRVJJRlkoIShpbnRlcm5hbDo6dHJhaXRzPFJlZjxDb25zdFBsYWluT2JqZWN0VHlwZSwgQWxpZ25lZD4gPjo6RmxhZ3MgJiBMdmFsdWVCaXQpKTsKKyAgVkVSSUZZKCEoUmVmPENvbnN0UGxhaW5PYmplY3RUeXBlPjo6RmxhZ3MgJiBMdmFsdWVCaXQpKTsKKyAgVkVSSUZZKCEoUmVmPENvbnN0UGxhaW5PYmplY3RUeXBlLCBBbGlnbmVkPjo6RmxhZ3MgJiBMdmFsdWVCaXQpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgQj4KLUVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfMShSZWY8U3BhcnNlTWF0cml4PGZsb2F0PiA+IGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEudG9EZW5zZSgpLGIudG9EZW5zZSgpKTsgfQordGVtcGxhdGUgPHR5cGVuYW1lIEI+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGNhbGxfcmVmXzEoUmVmPFNwYXJzZU1hdHJpeDxmbG9hdD4gPiBhLCBjb25zdCBCICZiKSB7CisgIFZFUklGWV9JU19FUVVBTChhLnRvRGVuc2UoKSwgYi50b0RlbnNlKCkpOworfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBCPgotRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl8yKGNvbnN0IFJlZjxjb25zdCBTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4mIGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEudG9EZW5zZSgpLGIudG9EZW5zZSgpKTsgfQordGVtcGxhdGUgPHR5cGVuYW1lIEI+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGNhbGxfcmVmXzIoY29uc3QgUmVmPGNvbnN0IFNwYXJzZU1hdHJpeDxmbG9hdD4gPiAmYSwgY29uc3QgQiAmYikgeworICBWRVJJRllfSVNfRVFVQUwoYS50b0RlbnNlKCksIGIudG9EZW5zZSgpKTsKK30KIAotdGVtcGxhdGU8dHlwZW5hbWUgQj4KLUVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfMyhjb25zdCBSZWY8Y29uc3QgU3BhcnNlTWF0cml4PGZsb2F0PiwgU3RhbmRhcmRDb21wcmVzc2VkRm9ybWF0PiYgYSwgY29uc3QgQiAmYikgewordGVtcGxhdGUgPHR5cGVuYW1lIEI+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGNhbGxfcmVmXzMoY29uc3QgUmVmPGNvbnN0IFNwYXJzZU1hdHJpeDxmbG9hdD4sIFN0YW5kYXJkQ29tcHJlc3NlZEZvcm1hdD4gJmEsIGNvbnN0IEIgJmIpIHsKICAgVkVSSUZZKGEuaXNDb21wcmVzc2VkKCkpOwotICBWRVJJRllfSVNfRVFVQUwoYS50b0RlbnNlKCksYi50b0RlbnNlKCkpOworICBWRVJJRllfSVNfRVFVQUwoYS50b0RlbnNlKCksIGIudG9EZW5zZSgpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgQj4KLUVJR0VOX0RPTlRfSU5MSU5FIHZvaWQgY2FsbF9yZWZfNChSZWY8U3BhcnNlVmVjdG9yPGZsb2F0PiA+IGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEudG9EZW5zZSgpLGIudG9EZW5zZSgpKTsgfQordGVtcGxhdGUgPHR5cGVuYW1lIEI+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGNhbGxfcmVmXzQoUmVmPFNwYXJzZVZlY3RvcjxmbG9hdD4gPiBhLCBjb25zdCBCICZiKSB7CisgIFZFUklGWV9JU19FUVVBTChhLnRvRGVuc2UoKSwgYi50b0RlbnNlKCkpOworfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBCPgotRUlHRU5fRE9OVF9JTkxJTkUgdm9pZCBjYWxsX3JlZl81KGNvbnN0IFJlZjxjb25zdCBTcGFyc2VWZWN0b3I8ZmxvYXQ+ID4mIGEsIGNvbnN0IEIgJmIpIHsgVkVSSUZZX0lTX0VRVUFMKGEudG9EZW5zZSgpLGIudG9EZW5zZSgpKTsgfQordGVtcGxhdGUgPHR5cGVuYW1lIEI+CitFSUdFTl9ET05UX0lOTElORSB2b2lkIGNhbGxfcmVmXzUoY29uc3QgUmVmPGNvbnN0IFNwYXJzZVZlY3RvcjxmbG9hdD4gPiAmYSwgY29uc3QgQiAmYikgeworICBWRVJJRllfSVNfRVFVQUwoYS50b0RlbnNlKCksIGIudG9EZW5zZSgpKTsKK30KIAotdm9pZCBjYWxsX3JlZigpCi17Ci0gIFNwYXJzZU1hdHJpeDxmbG9hdD4gICAgICAgICAgICAgICBBID0gTWF0cml4WGY6OlJhbmRvbSgxMCwxMCkuc3BhcnNlVmlldygwLjUsMSk7Ci0gIFNwYXJzZU1hdHJpeDxmbG9hdCxSb3dNYWpvcj4gICAgICBCID0gTWF0cml4WGY6OlJhbmRvbSgxMCwxMCkuc3BhcnNlVmlldygwLjUsMSk7Ci0gIFNwYXJzZU1hdHJpeDxmbG9hdD4gICAgICAgICAgICAgICBDID0gTWF0cml4WGY6OlJhbmRvbSgxMCwxMCkuc3BhcnNlVmlldygwLjUsMSk7Cit2b2lkIGNhbGxfcmVmKCkgeworICBTcGFyc2VNYXRyaXg8ZmxvYXQ+IEEgPSBNYXRyaXhYZjo6UmFuZG9tKDEwLCAxMCkuc3BhcnNlVmlldygwLjUsIDEpOworICBTcGFyc2VNYXRyaXg8ZmxvYXQsIFJvd01ham9yPiBCID0gTWF0cml4WGY6OlJhbmRvbSgxMCwgMTApLnNwYXJzZVZpZXcoMC41LCAxKTsKKyAgU3BhcnNlTWF0cml4PGZsb2F0PiBDID0gTWF0cml4WGY6OlJhbmRvbSgxMCwgMTApLnNwYXJzZVZpZXcoMC41LCAxKTsKICAgQy5yZXNlcnZlKFZlY3RvclhpOjpDb25zdGFudChDLm91dGVyU2l6ZSgpLCAyKSk7Ci0gIGNvbnN0IFNwYXJzZU1hdHJpeDxmbG9hdD4mICAgICAgICBBYyhBKTsKLSAgQmxvY2s8U3BhcnNlTWF0cml4PGZsb2F0PiA+ICAgICAgIEFiKEEsMCwxLCAzLDMpOwotICBjb25zdCBCbG9jazxTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4gQWJjKEEsMCwxLDMsMyk7Ci0gIFNwYXJzZVZlY3RvcjxmbG9hdD4gICAgICAgICAgICAgICB2YyA9ICBWZWN0b3JYZjo6UmFuZG9tKDEwKS5zcGFyc2VWaWV3KDAuNSwxKTsKLSAgU3BhcnNlVmVjdG9yPGZsb2F0LFJvd01ham9yPiAgICAgIHZyID0gIFZlY3RvclhmOjpSYW5kb20oMTApLnNwYXJzZVZpZXcoMC41LDEpOwotICBTcGFyc2VNYXRyaXg8ZmxvYXQ+IEFBID0gQSpBOwotICAKKyAgY29uc3QgU3BhcnNlTWF0cml4PGZsb2F0PiAmQWMoQSk7CisgIEJsb2NrPFNwYXJzZU1hdHJpeDxmbG9hdD4gPiBBYihBLCAwLCAxLCAzLCAzKTsKKyAgY29uc3QgQmxvY2s8U3BhcnNlTWF0cml4PGZsb2F0PiA+IEFiYyhBLCAwLCAxLCAzLCAzKTsKKyAgU3BhcnNlVmVjdG9yPGZsb2F0PiB2YyA9IFZlY3RvclhmOjpSYW5kb20oMTApLnNwYXJzZVZpZXcoMC41LCAxKTsKKyAgU3BhcnNlVmVjdG9yPGZsb2F0LCBSb3dNYWpvcj4gdnIgPSBWZWN0b3JYZjo6UmFuZG9tKDEwKS5zcGFyc2VWaWV3KDAuNSwgMSk7CisgIFNwYXJzZU1hdHJpeDxmbG9hdD4gQUEgPSBBICogQTsKIAotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMShBLCBBKSwgIDApOwotLy8gICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMShBYywgQWMpLCAgMCk7IC8vIGRvZXMgbm90IGNvbXBpbGUgb24gcHVycG9zZQotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBLCBBKSwgIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhBLCBBKSwgIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBLnRyYW5zcG9zZSgpLCBBLnRyYW5zcG9zZSgpKSwgIDEpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhBLnRyYW5zcG9zZSgpLCBBLnRyYW5zcG9zZSgpKSwgIDEpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBYyxBYyksIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhBYyxBYyksIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBK0EsMipBYyksIDEpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhBK0EsMipBYyksIDEpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihCLCBCKSwgIDEpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhCLCBCKSwgIDEpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihCLnRyYW5zcG9zZSgpLCBCLnRyYW5zcG9zZSgpKSwgIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhCLnRyYW5zcG9zZSgpLCBCLnRyYW5zcG9zZSgpKSwgIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBKkEsIEFBKSwgIDMpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMyhBKkEsIEFBKSwgIDMpOwotICAKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMShBLCBBKSwgMCk7CisgIC8vICAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzEoQWMsIEFjKSwgIDApOyAvLyBkb2VzIG5vdCBjb21waWxlIG9uIHB1cnBvc2UKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMihBLCBBKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzMoQSwgQSksIDApOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl8yKEEudHJhbnNwb3NlKCksIEEudHJhbnNwb3NlKCkpLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMyhBLnRyYW5zcG9zZSgpLCBBLnRyYW5zcG9zZSgpKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzIoQWMsIEFjKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzMoQWMsIEFjKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzIoQSArIEEsIDIgKiBBYyksIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl8zKEEgKyBBLCAyICogQWMpLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMihCLCBCKSwgMSk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzMoQiwgQiksIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl8yKEIudHJhbnNwb3NlKCksIEIudHJhbnNwb3NlKCkpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMyhCLnRyYW5zcG9zZSgpLCBCLnRyYW5zcG9zZSgpKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzIoQSAqIEEsIEFBKSwgMyk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzMoQSAqIEEsIEFBKSwgMyk7CisKICAgVkVSSUZZKCFDLmlzQ29tcHJlc3NlZCgpKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzMoQywgQyksICAxKTsKLSAgCi0gIFJlZjxTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4gQXIoQSk7Ci0gIFZFUklGWV9JU19BUFBST1goQXIrQXIsIEErQSk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8xKEFyLCBBKSwgIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBciwgQSksICAwKTsKLSAgCi0gIFJlZjxTcGFyc2VNYXRyaXg8ZmxvYXQsUm93TWFqb3I+ID4gQnIoQik7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8xKEJyLnRyYW5zcG9zZSgpLCBCci50cmFuc3Bvc2UoKSksICAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzIoQnIsIEJyKSwgIDEpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihCci50cmFuc3Bvc2UoKSwgQnIudHJhbnNwb3NlKCkpLCAgMCk7Ci0gIAotICBSZWY8Y29uc3QgU3BhcnNlTWF0cml4PGZsb2F0PiA+IEFyYyhBKTsKLS8vICAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzEoQXJjLCBBcmMpLCAgMCk7IC8vIGRvZXMgbm90IGNvbXBpbGUgb24gcHVycG9zZQotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMihBcmMsIEFyYyksICAwKTsKLSAgCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKEEubWlkZGxlQ29scygxLDMpLCBBLm1pZGRsZUNvbHMoMSwzKSksICAwKTsKLSAgCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKEEuY29sKDIpLCBBLmNvbCgyKSksICAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzIodmMsIHZjKSwgIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMih2ci50cmFuc3Bvc2UoKSwgdnIudHJhbnNwb3NlKCkpLCAgMCk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKHZyLCB2ci50cmFuc3Bvc2UoKSksICAwKTsKLSAgCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl8yKEEuYmxvY2soMSwxLDMsMyksIEEuYmxvY2soMSwxLDMsMykpLCAgMSk7IC8vIHNob3VsZCBiZSAwIChhbGxvY2F0ZSBzdGFydHMvbm56IG9ubHkpCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzMoQywgQyksIDEpOwogCi0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl80KHZjLCB2YyksICAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzQodnIsIHZyLnRyYW5zcG9zZSgpKSwgIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNSh2YywgdmMpLCAgMCk7Ci0gIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKCBjYWxsX3JlZl81KHZyLCB2ci50cmFuc3Bvc2UoKSksICAwKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzQoQS5jb2woMiksIEEuY29sKDIpKSwgIDApOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfNShBLmNvbCgyKSwgQS5jb2woMikpLCAgMCk7CisgIFJlZjxTcGFyc2VNYXRyaXg8ZmxvYXQ+ID4gQXIoQSk7CisgIFZFUklGWV9JU19BUFBST1goQXIgKyBBciwgQSArIEEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl8xKEFyLCBBKSwgMCk7CisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzIoQXIsIEEpLCAwKTsKKworICBSZWY8U3BhcnNlTWF0cml4PGZsb2F0LCBSb3dNYWpvcj4gPiBCcihCKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMShCci50cmFuc3Bvc2UoKSwgQnIudHJhbnNwb3NlKCkpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMihCciwgQnIpLCAxKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMihCci50cmFuc3Bvc2UoKSwgQnIudHJhbnNwb3NlKCkpLCAwKTsKKworICBSZWY8Y29uc3QgU3BhcnNlTWF0cml4PGZsb2F0PiA+IEFyYyhBKTsKKyAgLy8gICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggY2FsbF9yZWZfMShBcmMsIEFyYyksICAwKTsgLy8gZG9lcyBub3QgY29tcGlsZSBvbiBwdXJwb3NlCisgIFZFUklGWV9FVkFMVUFUSU9OX0NPVU5UKGNhbGxfcmVmXzIoQXJjLCBBcmMpLCAwKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl8yKEEubWlkZGxlQ29scygxLCAzKSwgQS5taWRkbGVDb2xzKDEsIDMpKSwgMCk7CisKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMihBLmNvbCgyKSwgQS5jb2woMikpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMih2YywgdmMpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMih2ci50cmFuc3Bvc2UoKSwgdnIudHJhbnNwb3NlKCkpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfMih2ciwgdnIudHJhbnNwb3NlKCkpLCAwKTsKKworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl8yKEEuYmxvY2soMSwgMSwgMywgMyksIEEuYmxvY2soMSwgMSwgMywgMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsgIC8vIHNob3VsZCBiZSAwIChhbGxvY2F0ZSBzdGFydHMvbm56IG9ubHkpCisKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfNCh2YywgdmMpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfNCh2ciwgdnIudHJhbnNwb3NlKCkpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfNSh2YywgdmMpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfNSh2ciwgdnIudHJhbnNwb3NlKCkpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfNChBLmNvbCgyKSwgQS5jb2woMikpLCAwKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoY2FsbF9yZWZfNShBLmNvbCgyKSwgQS5jb2woMikpLCAwKTsKICAgLy8gVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzQoQS5yb3coMiksIEEucm93KDIpLnRyYW5zcG9zZSgpKSwgIDEpOyAvLyBkb2VzIG5vdCBjb21waWxlIG9uIHB1cnBvc2UKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIGNhbGxfcmVmXzUoQS5yb3coMiksIEEucm93KDIpLnRyYW5zcG9zZSgpKSwgIDEpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVChjYWxsX3JlZl81KEEucm93KDIpLCBBLnJvdygyKS50cmFuc3Bvc2UoKSksIDEpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1Qoc3BhcnNlX3JlZikKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoU3BhcnNlTWF0cml4PGZsb2F0PigpKSApOwotICAgIENBTExfU1VCVEVTVF8xKCBjaGVja19jb25zdF9jb3JyZWN0bmVzcyhTcGFyc2VNYXRyaXg8ZG91YmxlLFJvd01ham9yPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBjYWxsX3JlZigpICk7CitFSUdFTl9ERUNMQVJFX1RFU1Qoc3BhcnNlX3JlZikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShjaGVja19jb25zdF9jb3JyZWN0bmVzcyhTcGFyc2VNYXRyaXg8ZmxvYXQ+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShjaGVja19jb25zdF9jb3JyZWN0bmVzcyhTcGFyc2VNYXRyaXg8ZG91YmxlLCBSb3dNYWpvcj4oKSkpOworICAgIENBTExfU1VCVEVTVF8yKGNhbGxfcmVmKCkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzMoIGNoZWNrX2NvbnN0X2NvcnJlY3RuZXNzKFNwYXJzZVZlY3RvcjxmbG9hdD4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggY2hlY2tfY29uc3RfY29ycmVjdG5lc3MoU3BhcnNlVmVjdG9yPGRvdWJsZSxSb3dNYWpvcj4oKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhjaGVja19jb25zdF9jb3JyZWN0bmVzcyhTcGFyc2VWZWN0b3I8ZmxvYXQ+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhjaGVja19jb25zdF9jb3JyZWN0bmVzcyhTcGFyc2VWZWN0b3I8ZG91YmxlLCBSb3dNYWpvcj4oKSkpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZV9zb2x2ZXIuaCBiL3Rlc3Qvc3BhcnNlX3NvbHZlci5oCmluZGV4IDAxODQ2ZTIuLmU3NTE4ZTQgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3BhcnNlX3NvbHZlci5oCisrKyBiL3Rlc3Qvc3BhcnNlX3NvbHZlci5oCkBAIC0xMiwzNiArMTIsMzMgQEAKICNpbmNsdWRlIDxFaWdlbi9TcGFyc2VMVT4KICNpbmNsdWRlIDxzc3RyZWFtPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgR3Vlc3MsdHlwZW5hbWUgUmVzdWx0Pgotdm9pZCBzb2x2ZV93aXRoX2d1ZXNzKEl0ZXJhdGl2ZVNvbHZlckJhc2U8U29sdmVyPiYgc29sdmVyLCBjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIsIGNvbnN0IEd1ZXNzJiBnLCBSZXN1bHQgJngpIHsKLSAgaWYoaW50ZXJuYWw6OnJhbmRvbTxib29sPigpKQotICB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIEd1ZXNzLCB0eXBlbmFtZSBSZXN1bHQ+Cit2b2lkIHNvbHZlX3dpdGhfZ3Vlc3MoSXRlcmF0aXZlU29sdmVyQmFzZTxTb2x2ZXI+JiBzb2x2ZXIsIGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYiwgY29uc3QgR3Vlc3MmIGcsIFJlc3VsdCYgeCkgeworICBpZiAoaW50ZXJuYWw6OnJhbmRvbTxib29sPigpKSB7CiAgICAgLy8gV2l0aCBhIHRlbXBvcmFyeSB0aHJvdWdoIGV2YWx1YXRvcjxTb2x2ZVdpdGhHdWVzcz4KLSAgICB4ID0gc29sdmVyLmRlcml2ZWQoKS5zb2x2ZVdpdGhHdWVzcyhiLGcpICsgUmVzdWx0OjpaZXJvKHgucm93cygpLCB4LmNvbHMoKSk7Ci0gIH0KLSAgZWxzZQotICB7CisgICAgeCA9IHNvbHZlci5kZXJpdmVkKCkuc29sdmVXaXRoR3Vlc3MoYiwgZykgKyBSZXN1bHQ6Olplcm8oeC5yb3dzKCksIHguY29scygpKTsKKyAgfSBlbHNlIHsKICAgICAvLyBkaXJlY3QgZXZhbHVhdGlvbiB3aXRoaW4geCB0aHJvdWdoIEFzc2lnbm1lbnQ8UmVzdWx0LFNvbHZlV2l0aEd1ZXNzPgotICAgIHggPSBzb2x2ZXIuZGVyaXZlZCgpLnNvbHZlV2l0aEd1ZXNzKGIuZGVyaXZlZCgpLGcpOworICAgIHggPSBzb2x2ZXIuZGVyaXZlZCgpLnNvbHZlV2l0aEd1ZXNzKGIuZGVyaXZlZCgpLCBnKTsKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIFJocywgdHlwZW5hbWUgR3Vlc3MsdHlwZW5hbWUgUmVzdWx0Pgotdm9pZCBzb2x2ZV93aXRoX2d1ZXNzKFNwYXJzZVNvbHZlckJhc2U8U29sdmVyPiYgc29sdmVyLCBjb25zdCBNYXRyaXhCYXNlPFJocz4mIGIsIGNvbnN0IEd1ZXNzJiAsIFJlc3VsdCYgeCkgewotICBpZihpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIEd1ZXNzLCB0eXBlbmFtZSBSZXN1bHQ+Cit2b2lkIHNvbHZlX3dpdGhfZ3Vlc3MoU3BhcnNlU29sdmVyQmFzZTxTb2x2ZXI+JiBzb2x2ZXIsIGNvbnN0IE1hdHJpeEJhc2U8UmhzPiYgYiwgY29uc3QgR3Vlc3MmLCBSZXN1bHQmIHgpIHsKKyAgaWYgKGludGVybmFsOjpyYW5kb208Ym9vbD4oKSkKICAgICB4ID0gc29sdmVyLmRlcml2ZWQoKS5zb2x2ZShiKSArIFJlc3VsdDo6WmVybyh4LnJvd3MoKSwgeC5jb2xzKCkpOwogICBlbHNlCiAgICAgeCA9IHNvbHZlci5kZXJpdmVkKCkuc29sdmUoYik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBHdWVzcyx0eXBlbmFtZSBSZXN1bHQ+Ci12b2lkIHNvbHZlX3dpdGhfZ3Vlc3MoU3BhcnNlU29sdmVyQmFzZTxTb2x2ZXI+JiBzb2x2ZXIsIGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8UmhzPiYgYiwgY29uc3QgR3Vlc3MmICwgUmVzdWx0JiB4KSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIEd1ZXNzLCB0eXBlbmFtZSBSZXN1bHQ+Cit2b2lkIHNvbHZlX3dpdGhfZ3Vlc3MoU3BhcnNlU29sdmVyQmFzZTxTb2x2ZXI+JiBzb2x2ZXIsIGNvbnN0IFNwYXJzZU1hdHJpeEJhc2U8UmhzPiYgYiwgY29uc3QgR3Vlc3MmLCBSZXN1bHQmIHgpIHsKICAgeCA9IHNvbHZlci5kZXJpdmVkKCkuc29sdmUoYik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZW5zZU1hdCwgdHlwZW5hbWUgRGVuc2VSaHM+Ci12b2lkIGNoZWNrX3NwYXJzZV9zb2x2aW5nKFNvbHZlciYgc29sdmVyLCBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIGNvbnN0IFJocyYgYiwgY29uc3QgRGVuc2VNYXQmIGRBLCBjb25zdCBEZW5zZVJocyYgZGIpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlbnNlTWF0LCB0eXBlbmFtZSBEZW5zZVJocz4KK3ZvaWQgY2hlY2tfc3BhcnNlX3NvbHZpbmcoU29sdmVyJiBzb2x2ZXIsIGNvbnN0IHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwgY29uc3QgUmhzJiBiLCBjb25zdCBEZW5zZU1hdCYgZEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbnNlUmhzJiBkYikgewogICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSBNYXQ7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0OjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKQEAgLTUyLDMwICs0OSwyOCBAQAogICAgIFJocyBvbGRiID0gYjsKIAogICAgIHNvbHZlci5jb21wdXRlKEEpOwotICAgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCi0gICAgeworICAgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpIHsKICAgICAgIHN0ZDo6Y2VyciA8PCAiRVJST1IgfCBzcGFyc2Ugc29sdmVyIHRlc3RpbmcsIGZhY3Rvcml6YXRpb24gZmFpbGVkICgiIDw8IHR5cGVpZChTb2x2ZXIpLm5hbWUoKSA8PCAiKVxuIjsKICAgICAgIFZFUklGWShzb2x2ZXIuaW5mbygpID09IFN1Y2Nlc3MpOwogICAgIH0KICAgICB4ID0gc29sdmVyLnNvbHZlKGIpOwotICAgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCi0gICAgeworICAgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpIHsKICAgICAgIHN0ZDo6Y2VyciA8PCAiV0FSTklORzogc3BhcnNlIHNvbHZlciB0ZXN0aW5nOiBzb2x2aW5nIGZhaWxlZCAoIiA8PCB0eXBlaWQoU29sdmVyKS5uYW1lKCkgPDwgIilcbiI7CiAgICAgICAvLyBkdW1wIGNhbGwgc3RhY2s6Ci0gICAgICBnX3Rlc3RfbGV2ZWwrKzsgCisgICAgICBnX3Rlc3RfbGV2ZWwrKzsKICAgICAgIFZFUklGWShzb2x2ZXIuaW5mbygpID09IFN1Y2Nlc3MpOwogICAgICAgZ190ZXN0X2xldmVsLS07CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIFZFUklGWShvbGRiLmlzQXBwcm94KGIpICYmICJzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHRoZSByaHMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCEiKTsKLSAgICBWRVJJRlkoeC5pc0FwcHJveChyZWZYLHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOworICAgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgsIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOwogCiAgICAgeC5zZXRaZXJvKCk7CiAgICAgc29sdmVfd2l0aF9ndWVzcyhzb2x2ZXIsIGIsIHgsIHgpOwogICAgIFZFUklGWShzb2x2ZXIuaW5mbygpID09IFN1Y2Nlc3MgJiYgInNvbHZpbmcgZmFpbGVkIHdoZW4gdXNpbmcgc29sdmVfd2l0aF9ndWVzcyBBUEkiKTsKICAgICBWRVJJRlkob2xkYi5pc0FwcHJveChiKSAmJiAic3BhcnNlIHNvbHZlciB0ZXN0aW5nOiB0aGUgcmhzIHNob3VsZCBub3QgYmUgbW9kaWZpZWQhIik7Ci0gICAgVkVSSUZZKHguaXNBcHByb3gocmVmWCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKLSAgICAKKyAgICBWRVJJRlkoeC5pc0FwcHJveChyZWZYLCB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKwogICAgIHguc2V0WmVybygpOwogICAgIC8vIHRlc3QgdGhlIGFuYWx5emUvZmFjdG9yaXplIEFQSQogICAgIHNvbHZlci5hbmFseXplUGF0dGVybihBKTsKQEAgLTg0LDExICs3OSwxMyBAQAogICAgIHggPSBzb2x2ZXIuc29sdmUoYik7CiAgICAgVkVSSUZZKHNvbHZlci5pbmZvKCkgPT0gU3VjY2VzcyAmJiAic29sdmluZyBmYWlsZWQgd2hlbiB1c2luZyBhbmFseXplUGF0dGVybi9mYWN0b3JpemUgQVBJIik7CiAgICAgVkVSSUZZKG9sZGIuaXNBcHByb3goYikgJiYgInNwYXJzZSBzb2x2ZXIgdGVzdGluZzogdGhlIHJocyBzaG91bGQgbm90IGJlIG1vZGlmaWVkISIpOwotICAgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7Ci0gICAgCisgICAgVkVSSUZZKHguaXNBcHByb3gocmVmWCwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisKICAgICB4LnNldFplcm8oKTsKICAgICAvLyB0ZXN0IHdpdGggTWFwCi0gICAgTWFwPFNwYXJzZU1hdHJpeDxTY2FsYXIsTWF0OjpPcHRpb25zLFN0b3JhZ2VJbmRleD4+IEFtKEEucm93cygpLCBBLmNvbHMoKSwgQS5ub25aZXJvcygpLCBjb25zdF9jYXN0PFN0b3JhZ2VJbmRleCo+KEEub3V0ZXJJbmRleFB0cigpKSwgY29uc3RfY2FzdDxTdG9yYWdlSW5kZXgqPihBLmlubmVySW5kZXhQdHIoKSksIGNvbnN0X2Nhc3Q8U2NhbGFyKj4oQS52YWx1ZVB0cigpKSk7CisgICAgTWFwPFNwYXJzZU1hdHJpeDxTY2FsYXIsIE1hdDo6T3B0aW9ucywgU3RvcmFnZUluZGV4Pj4gQW0oCisgICAgICAgIEEucm93cygpLCBBLmNvbHMoKSwgQS5ub25aZXJvcygpLCBjb25zdF9jYXN0PFN0b3JhZ2VJbmRleCo+KEEub3V0ZXJJbmRleFB0cigpKSwKKyAgICAgICAgY29uc3RfY2FzdDxTdG9yYWdlSW5kZXgqPihBLmlubmVySW5kZXhQdHIoKSksIGNvbnN0X2Nhc3Q8U2NhbGFyKj4oQS52YWx1ZVB0cigpKSk7CiAgICAgc29sdmVyLmNvbXB1dGUoQW0pOwogICAgIFZFUklGWShzb2x2ZXIuaW5mbygpID09IFN1Y2Nlc3MgJiYgImZhY3Rvcml6YXRpb24gZmFpbGVkIHdoZW4gdXNpbmcgTWFwIik7CiAgICAgRGVuc2VSaHMgZHgocmVmWCk7CkBAIC05OCwyNiArOTUsMjYgQEAKICAgICB4bSA9IHNvbHZlci5zb2x2ZShibSk7CiAgICAgVkVSSUZZKHNvbHZlci5pbmZvKCkgPT0gU3VjY2VzcyAmJiAic29sdmluZyBmYWlsZWQgd2hlbiB1c2luZyBNYXAiKTsKICAgICBWRVJJRlkob2xkYi5pc0FwcHJveChibSkgJiYgInNwYXJzZSBzb2x2ZXIgdGVzdGluZzogdGhlIHJocyBzaG91bGQgbm90IGJlIG1vZGlmaWVkISIpOwotICAgIFZFUklGWSh4bS5pc0FwcHJveChyZWZYLHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOwotICAgIAorICAgIFZFUklGWSh4bS5pc0FwcHJveChyZWZYLCB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKwogICAgIC8vIFRlc3Qgd2l0aCBhIE1hcCBhbmQgbm9uLXVuaXQgc3RyaWRlLgotICAgIEVpZ2VuOjpNYXRyaXg8U2NhbGFyLCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWM+IG91dCgyKnhtLnJvd3MoKSwgMip4bS5jb2xzKCkpOworICAgIEVpZ2VuOjpNYXRyaXg8U2NhbGFyLCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWM+IG91dCgyICogeG0ucm93cygpLCAyICogeG0uY29scygpKTsKICAgICBvdXQuc2V0WmVybygpOwotICAgIEVpZ2VuOjpNYXA8RGVuc2VSaHMsIDAsIFN0cmlkZTxFaWdlbjo6RHluYW1pYywgMj4+IG91dG0ob3V0LmRhdGEoKSwgeG0ucm93cygpLCB4bS5jb2xzKCksIFN0cmlkZTxFaWdlbjo6RHluYW1pYywgMj4oMiAqIHhtLnJvd3MoKSwgMikpOworICAgIEVpZ2VuOjpNYXA8RGVuc2VSaHMsIDAsIFN0cmlkZTxFaWdlbjo6RHluYW1pYywgMj4+IG91dG0ob3V0LmRhdGEoKSwgeG0ucm93cygpLCB4bS5jb2xzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpZGU8RWlnZW46OkR5bmFtaWMsIDI+KDIgKiB4bS5yb3dzKCksIDIpKTsKICAgICBvdXRtID0gc29sdmVyLnNvbHZlKGJtKTsKLSAgICBWRVJJRlkob3V0bS5pc0FwcHJveChyZWZYLHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOworICAgIFZFUklGWShvdXRtLmlzQXBwcm94KHJlZlgsIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOwogICB9Ci0gIAorCiAgIC8vIGlmIG5vdCB0b28gbGFyZ2UsIGRvIHNvbWUgZXh0cmEgY2hlY2s6Ci0gIGlmKEEucm93cygpPDIwMDApCi0gIHsKKyAgaWYgKEEucm93cygpIDwgMjAwMCkgewogICAgIC8vIHRlc3QgaW5pdGlhbGl6YXRpb24gY3RvcgogICAgIHsKICAgICAgIFJocyB4KGIucm93cygpLCBiLmNvbHMoKSk7CiAgICAgICBTb2x2ZXIgc29sdmVyMihBKTsKICAgICAgIFZFUklGWShzb2x2ZXIyLmluZm8oKSA9PSBTdWNjZXNzKTsKICAgICAgIHggPSBzb2x2ZXIyLnNvbHZlKGIpOwotICAgICAgVkVSSUZZKHguaXNBcHByb3gocmVmWCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKyAgICAgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgsIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOwogICAgIH0KIAogICAgIC8vIHRlc3QgZGVuc2UgQmxvY2sgYXMgdGhlIHJlc3VsdCBhbmQgcmhzOgpAQCAtMTI1LDQ2ICsxMjIsNDYgQEAKICAgICAgIERlbnNlUmhzIHgocmVmWC5yb3dzKCksIHJlZlguY29scygpKTsKICAgICAgIERlbnNlUmhzIG9sZGIoZGIpOwogICAgICAgeC5zZXRaZXJvKCk7Ci0gICAgICB4LmJsb2NrKDAsMCx4LnJvd3MoKSx4LmNvbHMoKSkgPSBzb2x2ZXIuc29sdmUoZGIuYmxvY2soMCwwLGRiLnJvd3MoKSxkYi5jb2xzKCkpKTsKKyAgICAgIHguYmxvY2soMCwgMCwgeC5yb3dzKCksIHguY29scygpKSA9IHNvbHZlci5zb2x2ZShkYi5ibG9jaygwLCAwLCBkYi5yb3dzKCksIGRiLmNvbHMoKSkpOwogICAgICAgVkVSSUZZKG9sZGIuaXNBcHByb3goZGIpICYmICJzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHRoZSByaHMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCEiKTsKLSAgICAgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisgICAgICBWRVJJRlkoeC5pc0FwcHJveChyZWZYLCB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKICAgICB9CiAKICAgICAvLyB0ZXN0IHVuY29tcHJlc3NlZCBpbnB1dHMKICAgICB7CiAgICAgICBNYXQgQTIgPSBBOwotICAgICAgQTIucmVzZXJ2ZSgoQXJyYXlYZjo6UmFuZG9tKEEub3V0ZXJTaXplKCkpKzIpLnRlbXBsYXRlIGNhc3Q8dHlwZW5hbWUgTWF0OjpTdG9yYWdlSW5kZXg+KCkuZXZhbCgpKTsKKyAgICAgIEEyLnJlc2VydmUoKEFycmF5WGY6OlJhbmRvbShBLm91dGVyU2l6ZSgpKSArIDIpLnRlbXBsYXRlIGNhc3Q8dHlwZW5hbWUgTWF0OjpTdG9yYWdlSW5kZXg+KCkuZXZhbCgpKTsKICAgICAgIHNvbHZlci5jb21wdXRlKEEyKTsKICAgICAgIFJocyB4ID0gc29sdmVyLnNvbHZlKGIpOwotICAgICAgVkVSSUZZKHguaXNBcHByb3gocmVmWCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKyAgICAgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgsIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOwogICAgIH0KIAogICAgIC8vIHRlc3QgZXhwcmVzc2lvbiBhcyBpbnB1dAogICAgIHsKLSAgICAgIHNvbHZlci5jb21wdXRlKDAuNSooQStBKSk7CisgICAgICBzb2x2ZXIuY29tcHV0ZSgwLjUgKiAoQSArIEEpKTsKICAgICAgIFJocyB4ID0gc29sdmVyLnNvbHZlKGIpOwotICAgICAgVkVSSUZZKHguaXNBcHByb3gocmVmWCx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKyAgICAgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgsIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOwogCi0gICAgICBTb2x2ZXIgc29sdmVyMigwLjUqKEErQSkpOworICAgICAgU29sdmVyIHNvbHZlcjIoMC41ICogKEEgKyBBKSk7CiAgICAgICBSaHMgeDIgPSBzb2x2ZXIyLnNvbHZlKGIpOwotICAgICAgVkVSSUZZKHgyLmlzQXBwcm94KHJlZlgsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisgICAgICBWRVJJRlkoeDIuaXNBcHByb3gocmVmWCwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CiAgICAgfQogICB9CiB9CiAKIC8vIHNwZWNpYWxpemF0aW9uIG9mIGdlbmVyaWMgY2hlY2tfc3BhcnNlX3NvbHZpbmcgZm9yIFN1cGVyTFUgaW4gb3JkZXIgdG8gYWxzbyB0ZXN0IGFkam9pbnQgYW5kIHRyYW5zcG9zZSBzb2x2ZXMKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUmhzLCB0eXBlbmFtZSBEZW5zZU1hdCwgdHlwZW5hbWUgRGVuc2VSaHM+Ci12b2lkIGNoZWNrX3NwYXJzZV9zb2x2aW5nKEVpZ2VuOjpTcGFyc2VMVTxFaWdlbjo6U3BhcnNlTWF0cml4PFNjYWxhcj4gPiYgc29sdmVyLCBjb25zdCB0eXBlbmFtZSBFaWdlbjo6U3BhcnNlTWF0cml4PFNjYWxhcj4mIEEsIGNvbnN0IFJocyYgYiwgY29uc3QgRGVuc2VNYXQmIGRBLCBjb25zdCBEZW5zZVJocyYgZGIpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBSaHMsIHR5cGVuYW1lIERlbnNlTWF0LCB0eXBlbmFtZSBEZW5zZVJocz4KK3ZvaWQgY2hlY2tfc3BhcnNlX3NvbHZpbmcoRWlnZW46OlNwYXJzZUxVPEVpZ2VuOjpTcGFyc2VNYXRyaXg8U2NhbGFyPj4mIHNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgRWlnZW46OlNwYXJzZU1hdHJpeDxTY2FsYXI+JiBBLCBjb25zdCBSaHMmIGIsIGNvbnN0IERlbnNlTWF0JiBkQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVuc2VSaHMmIGRiKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OlNwYXJzZU1hdHJpeDxTY2FsYXI+IE1hdDsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlN0b3JhZ2VJbmRleCBTdG9yYWdlSW5kZXg7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OlNwYXJzZUxVPEVpZ2VuOjpTcGFyc2VNYXRyaXg8U2NhbGFyPiA+IFNvbHZlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBFaWdlbjo6U3BhcnNlTFU8RWlnZW46OlNwYXJzZU1hdHJpeDxTY2FsYXI+PiBTb2x2ZXI7CiAKICAgLy8gcmVmZXJlbmNlIHNvbHV0aW9ucyBjb21wdXRlZCBieSBkZW5zZSBRUiBzb2x2ZXIKLSAgRGVuc2VSaHMgcmVmWDEgPSBkQS5ob3VzZWhvbGRlclFyKCkuc29sdmUoZGIpOyAvLyBzb2x1dGlvbiBvZiBBIHggPSBkYgotICBEZW5zZVJocyByZWZYMiA9IGRBLnRyYW5zcG9zZSgpLmhvdXNlaG9sZGVyUXIoKS5zb2x2ZShkYik7IC8vIHNvbHV0aW9uIG9mIEFeVCAqIHggPSBkYiAodXNlIHRyYW5zcG9zZWQgbWF0cml4IEFeVCkKLSAgRGVuc2VSaHMgcmVmWDMgPSBkQS5hZGpvaW50KCkuaG91c2Vob2xkZXJRcigpLnNvbHZlKGRiKTsgIC8vIHNvbHV0aW9uIG9mIEFeKiAqIHggPSBkYiAodXNlIGFkam9pbnQgbWF0cml4IEFeKikKLQorICBEZW5zZVJocyByZWZYMSA9IGRBLmhvdXNlaG9sZGVyUXIoKS5zb2x2ZShkYik7ICAgICAgICAgICAgICAvLyBzb2x1dGlvbiBvZiBBIHggPSBkYgorICBEZW5zZVJocyByZWZYMiA9IGRBLnRyYW5zcG9zZSgpLmhvdXNlaG9sZGVyUXIoKS5zb2x2ZShkYik7ICAvLyBzb2x1dGlvbiBvZiBBXlQgKiB4ID0gZGIgKHVzZSB0cmFuc3Bvc2VkIG1hdHJpeCBBXlQpCisgIERlbnNlUmhzIHJlZlgzID0gZEEuYWRqb2ludCgpLmhvdXNlaG9sZGVyUXIoKS5zb2x2ZShkYik7ICAgIC8vIHNvbHV0aW9uIG9mIEFeKiAqIHggPSBkYiAodXNlIGFkam9pbnQgbWF0cml4IEFeKikKIAogICB7CiAgICAgUmhzIHgxKEEuY29scygpLCBiLmNvbHMoKSk7CkBAIC0xNzMsMzcgKzE3MCwzNCBAQAogICAgIFJocyBvbGRiID0gYjsKIAogICAgIHNvbHZlci5jb21wdXRlKEEpOwotICAgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCi0gICAgeworICAgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpIHsKICAgICAgIHN0ZDo6Y2VyciA8PCAiRVJST1IgfCBzcGFyc2Ugc29sdmVyIHRlc3RpbmcsIGZhY3Rvcml6YXRpb24gZmFpbGVkICgiIDw8IHR5cGVpZChTb2x2ZXIpLm5hbWUoKSA8PCAiKVxuIjsKICAgICAgIFZFUklGWShzb2x2ZXIuaW5mbygpID09IFN1Y2Nlc3MpOwogICAgIH0KICAgICB4MSA9IHNvbHZlci5zb2x2ZShiKTsKLSAgICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQotICAgIHsKKyAgICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKSB7CiAgICAgICBzdGQ6OmNlcnIgPDwgIldBUk5JTkcgfCBzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHNvbHZpbmcgZmFpbGVkICgiIDw8IHR5cGVpZChTb2x2ZXIpLm5hbWUoKSA8PCAiKVxuIjsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgVkVSSUZZKG9sZGIuaXNBcHByb3goYiwwLjApICYmICJzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHRoZSByaHMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCEiKTsKLSAgICBWRVJJRlkoeDEuaXNBcHByb3gocmVmWDEsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisgICAgVkVSSUZZKG9sZGIuaXNBcHByb3goYiwgMC4wKSAmJiAic3BhcnNlIHNvbHZlciB0ZXN0aW5nOiB0aGUgcmhzIHNob3VsZCBub3QgYmUgbW9kaWZpZWQhIik7CisgICAgVkVSSUZZKHgxLmlzQXBwcm94KHJlZlgxLCB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKIAogICAgIC8vIHRlc3Qgc29sdmUgd2l0aCB0cmFuc3Bvc2VkCiAgICAgeDIgPSBzb2x2ZXIudHJhbnNwb3NlKCkuc29sdmUoYik7CiAgICAgVkVSSUZZKG9sZGIuaXNBcHByb3goYikgJiYgInNwYXJzZSBzb2x2ZXIgdGVzdGluZzogdGhlIHJocyBzaG91bGQgbm90IGJlIG1vZGlmaWVkISIpOwotICAgIFZFUklGWSh4Mi5pc0FwcHJveChyZWZYMix0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKLQorICAgIFZFUklGWSh4Mi5pc0FwcHJveChyZWZYMiwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CiAKICAgICAvLyB0ZXN0IHNvbHZlIHdpdGggYWRqb2ludAotICAgIC8vc29sdmVyLnRlbXBsYXRlIF9zb2x2ZV9pbXBsX3RyYW5zcG9zZWQ8dHJ1ZT4oYiwgeDMpOworICAgIC8vIHNvbHZlci50ZW1wbGF0ZSBfc29sdmVfaW1wbF90cmFuc3Bvc2VkPHRydWU+KGIsIHgzKTsKICAgICB4MyA9IHNvbHZlci5hZGpvaW50KCkuc29sdmUoYik7Ci0gICAgVkVSSUZZKG9sZGIuaXNBcHByb3goYiwwLjApICYmICJzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHRoZSByaHMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCEiKTsKLSAgICBWRVJJRlkoeDMuaXNBcHByb3gocmVmWDMsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisgICAgVkVSSUZZKG9sZGIuaXNBcHByb3goYiwgMC4wKSAmJiAic3BhcnNlIHNvbHZlciB0ZXN0aW5nOiB0aGUgcmhzIHNob3VsZCBub3QgYmUgbW9kaWZpZWQhIik7CisgICAgVkVSSUZZKHgzLmlzQXBwcm94KHJlZlgzLCB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKIAogICAgIHgxLnNldFplcm8oKTsKICAgICBzb2x2ZV93aXRoX2d1ZXNzKHNvbHZlciwgYiwgeDEsIHgxKTsKICAgICBWRVJJRlkoc29sdmVyLmluZm8oKSA9PSBTdWNjZXNzICYmICJzb2x2aW5nIGZhaWxlZCB3aGVuIHVzaW5nIGFuYWx5emVQYXR0ZXJuL2ZhY3Rvcml6ZSBBUEkiKTsKLSAgICBWRVJJRlkob2xkYi5pc0FwcHJveChiLDAuMCkgJiYgInNwYXJzZSBzb2x2ZXIgdGVzdGluZzogdGhlIHJocyBzaG91bGQgbm90IGJlIG1vZGlmaWVkISIpOwotICAgIFZFUklGWSh4MS5pc0FwcHJveChyZWZYMSx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKyAgICBWRVJJRlkob2xkYi5pc0FwcHJveChiLCAwLjApICYmICJzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHRoZSByaHMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCEiKTsKKyAgICBWRVJJRlkoeDEuaXNBcHByb3gocmVmWDEsIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOwogCiAgICAgeDEuc2V0WmVybygpOwogICAgIHgyLnNldFplcm8oKTsKQEAgLTIxNywxNCArMjExLDE2IEBACiAgICAgeDMgPSBzb2x2ZXIuYWRqb2ludCgpLnNvbHZlKGIpOwogCiAgICAgVkVSSUZZKHNvbHZlci5pbmZvKCkgPT0gU3VjY2VzcyAmJiAic29sdmluZyBmYWlsZWQgd2hlbiB1c2luZyBhbmFseXplUGF0dGVybi9mYWN0b3JpemUgQVBJIik7Ci0gICAgVkVSSUZZKG9sZGIuaXNBcHByb3goYiwwLjApICYmICJzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHRoZSByaHMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCEiKTsKLSAgICBWRVJJRlkoeDEuaXNBcHByb3gocmVmWDEsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7Ci0gICAgVkVSSUZZKHgyLmlzQXBwcm94KHJlZlgyLHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOwotICAgIFZFUklGWSh4My5pc0FwcHJveChyZWZYMyx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKKyAgICBWRVJJRlkob2xkYi5pc0FwcHJveChiLCAwLjApICYmICJzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHRoZSByaHMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCEiKTsKKyAgICBWRVJJRlkoeDEuaXNBcHByb3gocmVmWDEsIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOworICAgIFZFUklGWSh4Mi5pc0FwcHJveChyZWZYMiwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisgICAgVkVSSUZZKHgzLmlzQXBwcm94KHJlZlgzLCB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKTsKIAogICAgIHgxLnNldFplcm8oKTsKICAgICAvLyB0ZXN0IHdpdGggTWFwCi0gICAgTWFwPFNwYXJzZU1hdHJpeDxTY2FsYXIsTWF0OjpPcHRpb25zLFN0b3JhZ2VJbmRleD4gPiBBbShBLnJvd3MoKSwgQS5jb2xzKCksIEEubm9uWmVyb3MoKSwgY29uc3RfY2FzdDxTdG9yYWdlSW5kZXgqPihBLm91dGVySW5kZXhQdHIoKSksIGNvbnN0X2Nhc3Q8U3RvcmFnZUluZGV4Kj4oQS5pbm5lckluZGV4UHRyKCkpLCBjb25zdF9jYXN0PFNjYWxhcio+KEEudmFsdWVQdHIoKSkpOworICAgIE1hcDxTcGFyc2VNYXRyaXg8U2NhbGFyLCBNYXQ6Ok9wdGlvbnMsIFN0b3JhZ2VJbmRleD4+IEFtKAorICAgICAgICBBLnJvd3MoKSwgQS5jb2xzKCksIEEubm9uWmVyb3MoKSwgY29uc3RfY2FzdDxTdG9yYWdlSW5kZXgqPihBLm91dGVySW5kZXhQdHIoKSksCisgICAgICAgIGNvbnN0X2Nhc3Q8U3RvcmFnZUluZGV4Kj4oQS5pbm5lckluZGV4UHRyKCkpLCBjb25zdF9jYXN0PFNjYWxhcio+KEEudmFsdWVQdHIoKSkpOwogICAgIHNvbHZlci5jb21wdXRlKEFtKTsKICAgICBWRVJJRlkoc29sdmVyLmluZm8oKSA9PSBTdWNjZXNzICYmICJmYWN0b3JpemF0aW9uIGZhaWxlZCB3aGVuIHVzaW5nIE1hcCIpOwogICAgIERlbnNlUmhzIGR4KHJlZlgxKTsKQEAgLTIzMywyMCArMjI5LDE5IEBACiAgICAgTWFwPGNvbnN0IERlbnNlUmhzPiBibShkYi5kYXRhKCksIGRiLnJvd3MoKSwgZGIuY29scygpKTsKICAgICB4bSA9IHNvbHZlci5zb2x2ZShibSk7CiAgICAgVkVSSUZZKHNvbHZlci5pbmZvKCkgPT0gU3VjY2VzcyAmJiAic29sdmluZyBmYWlsZWQgd2hlbiB1c2luZyBNYXAiKTsKLSAgICBWRVJJRlkob2xkYi5pc0FwcHJveChibSwwLjApICYmICJzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHRoZSByaHMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCEiKTsKLSAgICBWRVJJRlkoeG0uaXNBcHByb3gocmVmWDEsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisgICAgVkVSSUZZKG9sZGIuaXNBcHByb3goYm0sIDAuMCkgJiYgInNwYXJzZSBzb2x2ZXIgdGVzdGluZzogdGhlIHJocyBzaG91bGQgbm90IGJlIG1vZGlmaWVkISIpOworICAgIFZFUklGWSh4bS5pc0FwcHJveChyZWZYMSwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CiAgIH0KIAogICAvLyBpZiBub3QgdG9vIGxhcmdlLCBkbyBzb21lIGV4dHJhIGNoZWNrOgotICBpZihBLnJvd3MoKTwyMDAwKQotICB7CisgIGlmIChBLnJvd3MoKSA8IDIwMDApIHsKICAgICAvLyB0ZXN0IGluaXRpYWxpemF0aW9uIGN0b3IKICAgICB7CiAgICAgICBSaHMgeChiLnJvd3MoKSwgYi5jb2xzKCkpOwogICAgICAgU29sdmVyIHNvbHZlcjIoQSk7CiAgICAgICBWRVJJRlkoc29sdmVyMi5pbmZvKCkgPT0gU3VjY2Vzcyk7CiAgICAgICB4ID0gc29sdmVyMi5zb2x2ZShiKTsKLSAgICAgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgxLHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOworICAgICAgVkVSSUZZKHguaXNBcHByb3gocmVmWDEsIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOwogICAgIH0KIAogICAgIC8vIHRlc3QgZGVuc2UgQmxvY2sgYXMgdGhlIHJlc3VsdCBhbmQgcmhzOgpAQCAtMjU0LDExMCArMjQ5LDEwMCBAQAogICAgICAgRGVuc2VSaHMgeChyZWZYMS5yb3dzKCksIHJlZlgxLmNvbHMoKSk7CiAgICAgICBEZW5zZVJocyBvbGRiKGRiKTsKICAgICAgIHguc2V0WmVybygpOwotICAgICAgeC5ibG9jaygwLDAseC5yb3dzKCkseC5jb2xzKCkpID0gc29sdmVyLnNvbHZlKGRiLmJsb2NrKDAsMCxkYi5yb3dzKCksZGIuY29scygpKSk7Ci0gICAgICBWRVJJRlkob2xkYi5pc0FwcHJveChkYiwwLjApICYmICJzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IHRoZSByaHMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCEiKTsKLSAgICAgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgxLHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOworICAgICAgeC5ibG9jaygwLCAwLCB4LnJvd3MoKSwgeC5jb2xzKCkpID0gc29sdmVyLnNvbHZlKGRiLmJsb2NrKDAsIDAsIGRiLnJvd3MoKSwgZGIuY29scygpKSk7CisgICAgICBWRVJJRlkob2xkYi5pc0FwcHJveChkYiwgMC4wKSAmJiAic3BhcnNlIHNvbHZlciB0ZXN0aW5nOiB0aGUgcmhzIHNob3VsZCBub3QgYmUgbW9kaWZpZWQhIik7CisgICAgICBWRVJJRlkoeC5pc0FwcHJveChyZWZYMSwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CiAgICAgfQogCiAgICAgLy8gdGVzdCB1bmNvbXByZXNzZWQgaW5wdXRzCiAgICAgewogICAgICAgTWF0IEEyID0gQTsKLSAgICAgIEEyLnJlc2VydmUoKEFycmF5WGY6OlJhbmRvbShBLm91dGVyU2l6ZSgpKSsyKS50ZW1wbGF0ZSBjYXN0PHR5cGVuYW1lIE1hdDo6U3RvcmFnZUluZGV4PigpLmV2YWwoKSk7CisgICAgICBBMi5yZXNlcnZlKChBcnJheVhmOjpSYW5kb20oQS5vdXRlclNpemUoKSkgKyAyKS50ZW1wbGF0ZSBjYXN0PHR5cGVuYW1lIE1hdDo6U3RvcmFnZUluZGV4PigpLmV2YWwoKSk7CiAgICAgICBzb2x2ZXIuY29tcHV0ZShBMik7CiAgICAgICBSaHMgeCA9IHNvbHZlci5zb2x2ZShiKTsKLSAgICAgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgxLHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOworICAgICAgVkVSSUZZKHguaXNBcHByb3gocmVmWDEsIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOwogICAgIH0KIAogICAgIC8vIHRlc3QgZXhwcmVzc2lvbiBhcyBpbnB1dAogICAgIHsKLSAgICAgIHNvbHZlci5jb21wdXRlKDAuNSooQStBKSk7CisgICAgICBzb2x2ZXIuY29tcHV0ZSgwLjUgKiAoQSArIEEpKTsKICAgICAgIFJocyB4ID0gc29sdmVyLnNvbHZlKGIpOwotICAgICAgVkVSSUZZKHguaXNBcHByb3gocmVmWDEsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisgICAgICBWRVJJRlkoeC5pc0FwcHJveChyZWZYMSwgdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CiAKLSAgICAgIFNvbHZlciBzb2x2ZXIyKDAuNSooQStBKSk7CisgICAgICBTb2x2ZXIgc29sdmVyMigwLjUgKiAoQSArIEEpKTsKICAgICAgIFJocyB4MiA9IHNvbHZlcjIuc29sdmUoYik7Ci0gICAgICBWRVJJRlkoeDIuaXNBcHByb3gocmVmWDEsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisgICAgICBWRVJJRlkoeDIuaXNBcHByb3gocmVmWDEsIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOwogICAgIH0KICAgfQogfQogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgUmhzPgotdm9pZCBjaGVja19zcGFyc2Vfc29sdmluZ19yZWFsX2Nhc2VzKFNvbHZlciYgc29sdmVyLCBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIGNvbnN0IFJocyYgYiwgY29uc3QgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlJiBmdWxsQSwgY29uc3QgUmhzJiByZWZYKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgUmhzPgordm9pZCBjaGVja19zcGFyc2Vfc29sdmluZ19yZWFsX2Nhc2VzKFNvbHZlciYgc29sdmVyLCBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIGNvbnN0IFJocyYgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIGZ1bGxBLCBjb25zdCBSaHMmIHJlZlgpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKLSAgCisKICAgUmhzIHgoQS5jb2xzKCksIGIuY29scygpKTsKIAogICBzb2x2ZXIuY29tcHV0ZShBKTsKLSAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykKLSAgeworICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKSB7CiAgICAgc3RkOjpjZXJyIDw8ICJFUlJPUiB8IHNwYXJzZSBzb2x2ZXIgdGVzdGluZywgZmFjdG9yaXphdGlvbiBmYWlsZWQgKCIgPDwgdHlwZWlkKFNvbHZlcikubmFtZSgpIDw8ICIpXG4iOwogICAgIFZFUklGWShzb2x2ZXIuaW5mbygpID09IFN1Y2Nlc3MpOwogICB9CiAgIHggPSBzb2x2ZXIuc29sdmUoYik7Ci0gIAotICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQotICB7CisKKyAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykgewogICAgIHN0ZDo6Y2VyciA8PCAiV0FSTklORyB8IHNwYXJzZSBzb2x2ZXIgdGVzdGluZywgc29sdmluZyBmYWlsZWQgKCIgPDwgdHlwZWlkKFNvbHZlcikubmFtZSgpIDw8ICIpXG4iOwogICAgIHJldHVybjsKICAgfQotICAKLSAgUmVhbFNjYWxhciByZXNfZXJyb3IgPSAoZnVsbEEqeC1iKS5ub3JtKCkvYi5ub3JtKCk7ICAKLSAgVkVSSUZZKCAocmVzX2Vycm9yIDw9IHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSApICYmICJzcGFyc2Ugc29sdmVyIGZhaWxlZCB3aXRob3V0IG5vdGljaW5nIGl0Iik7IAogCi0gIAotICBpZihyZWZYLnNpemUoKSAhPSAwICYmIChyZWZYIC0geCkubm9ybSgpL3JlZlgubm9ybSgpID4gdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKQotICB7CisgIFJlYWxTY2FsYXIgcmVzX2Vycm9yID0gKGZ1bGxBICogeCAtIGIpLm5vcm0oKSAvIGIubm9ybSgpOworICBWRVJJRlkoKHJlc19lcnJvciA8PSB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpICYmICJzcGFyc2Ugc29sdmVyIGZhaWxlZCB3aXRob3V0IG5vdGljaW5nIGl0Iik7CisKKyAgaWYgKHJlZlguc2l6ZSgpICE9IDAgJiYgKHJlZlggLSB4KS5ub3JtKCkgLyByZWZYLm5vcm0oKSA+IHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkgewogICAgIHN0ZDo6Y2VyciA8PCAiV0FSTklORyB8IGZvdW5kIHNvbHV0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBwcm92aWRlZCByZWZlcmVuY2Ugb25lXG4iOwogICB9Ci0gIAogfQotdGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBEZW5zZU1hdD4KLXZvaWQgY2hlY2tfc3BhcnNlX2RldGVybWluYW50KFNvbHZlciYgc29sdmVyLCBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIGNvbnN0IERlbnNlTWF0JiBkQSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIERlbnNlTWF0Pgordm9pZCBjaGVja19zcGFyc2VfZGV0ZXJtaW5hbnQoU29sdmVyJiBzb2x2ZXIsIGNvbnN0IHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwgY29uc3QgRGVuc2VNYXQmIGRBKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlIE1hdDsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlNjYWxhciBTY2FsYXI7Ci0gIAorCiAgIHNvbHZlci5jb21wdXRlKEEpOwotICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQotICB7CisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpIHsKICAgICBzdGQ6OmNlcnIgPDwgIldBUk5JTkcgfCBzcGFyc2Ugc29sdmVyIHRlc3Rpbmc6IGZhY3Rvcml6YXRpb24gZmFpbGVkIChjaGVja19zcGFyc2VfZGV0ZXJtaW5hbnQpXG4iOwogICAgIHJldHVybjsKICAgfQogCiAgIFNjYWxhciByZWZEZXQgPSBkQS5kZXRlcm1pbmFudCgpOwotICBWRVJJRllfSVNfQVBQUk9YKHJlZkRldCxzb2x2ZXIuZGV0ZXJtaW5hbnQoKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVmRGV0LCBzb2x2ZXIuZGV0ZXJtaW5hbnQoKSk7CiB9Ci10ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIERlbnNlTWF0Pgotdm9pZCBjaGVja19zcGFyc2VfYWJzX2RldGVybWluYW50KFNvbHZlciYgc29sdmVyLCBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIGNvbnN0IERlbnNlTWF0JiBkQSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIERlbnNlTWF0Pgordm9pZCBjaGVja19zcGFyc2VfYWJzX2RldGVybWluYW50KFNvbHZlciYgc29sdmVyLCBjb25zdCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIGNvbnN0IERlbnNlTWF0JiBkQSkgewogICB1c2luZyBzdGQ6OmFiczsKICAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKLSAgCisKICAgc29sdmVyLmNvbXB1dGUoQSk7Ci0gIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpCi0gIHsKKyAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykgewogICAgIHN0ZDo6Y2VyciA8PCAiV0FSTklORyB8IHNwYXJzZSBzb2x2ZXIgdGVzdGluZzogZmFjdG9yaXphdGlvbiBmYWlsZWQgKGNoZWNrX3NwYXJzZV9hYnNfZGV0ZXJtaW5hbnQpXG4iOwogICAgIHJldHVybjsKICAgfQogCiAgIFNjYWxhciByZWZEZXQgPSBhYnMoZEEuZGV0ZXJtaW5hbnQoKSk7Ci0gIFZFUklGWV9JU19BUFBST1gocmVmRGV0LHNvbHZlci5hYnNEZXRlcm1pbmFudCgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZWZEZXQsIHNvbHZlci5hYnNEZXRlcm1pbmFudCgpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBEZW5zZU1hdD4KLWludCBnZW5lcmF0ZV9zcGFyc2Vfc3BkX3Byb2JsZW0oU29sdmVyJiAsIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlJiBoYWxmQSwgRGVuc2VNYXQmIGRBLCBpbnQgbWF4U2l6ZSA9IDMwMCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIERlbnNlTWF0PgoraW50IGdlbmVyYXRlX3NwYXJzZV9zcGRfcHJvYmxlbShTb2x2ZXImLCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgaGFsZkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWF0JiBkQSwgaW50IG1heFNpemUgPSAzMDApIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gRGVuc2VNYXRyaXg7CiAKLSAgaW50IHNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhTaXplKTsKLSAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguL3N0YXRpY19jYXN0PGRvdWJsZT4oc2l6ZSpzaXplKSwgMC4wMSk7CisgIGludCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIG1heFNpemUpOworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4gLyBzdGF0aWNfY2FzdDxkb3VibGU+KHNpemUgKiBzaXplKSwgMC4wMSk7CiAKICAgTWF0IE0oc2l6ZSwgc2l6ZSk7CiAgIERlbnNlTWF0cml4IGRNKHNpemUsIHNpemUpOwpAQCAtMzY2LDU3ICszNTEsNTMgQEAKIAogICBBID0gTSAqIE0uYWRqb2ludCgpOwogICBkQSA9IGRNICogZE0uYWRqb2ludCgpOwotICAKLSAgaGFsZkEucmVzaXplKHNpemUsc2l6ZSk7Ci0gIGlmKFNvbHZlcjo6VXBMbz09KExvd2VyfFVwcGVyKSkKKworICBoYWxmQS5yZXNpemUoc2l6ZSwgc2l6ZSk7CisgIGlmIChTb2x2ZXI6OlVwTG8gPT0gKExvd2VyIHwgVXBwZXIpKQogICAgIGhhbGZBID0gQTsKICAgZWxzZQogICAgIGhhbGZBLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxTb2x2ZXI6OlVwTG8+KCkucmFua1VwZGF0ZShNKTsKLSAgCisKICAgcmV0dXJuIHNpemU7CiB9CiAKLQogI2lmZGVmIFRFU1RfUkVBTF9DQVNFUwotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgotaW5saW5lIHN0ZDo6c3RyaW5nIGdldF9tYXRyaXhmb2xkZXIoKQotewotICBzdGQ6OnN0cmluZyBtYXRfZm9sZGVyID0gVEVTVF9SRUFMX0NBU0VTOyAKLSAgaWYoIGludGVybmFsOjppc19zYW1lPFNjYWxhciwgc3RkOjpjb21wbGV4PGZsb2F0PiA+Ojp2YWx1ZSB8fCBpbnRlcm5hbDo6aXNfc2FtZTxTY2FsYXIsIHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnZhbHVlICkKLSAgICBtYXRfZm9sZGVyICA9IG1hdF9mb2xkZXIgKyBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZz4oIi9jb21wbGV4LyIpOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK2lubGluZSBzdGQ6OnN0cmluZyBnZXRfbWF0cml4Zm9sZGVyKCkgeworICBzdGQ6OnN0cmluZyBtYXRfZm9sZGVyID0gVEVTVF9SRUFMX0NBU0VTOworICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+Pjo6dmFsdWUgfHwgaW50ZXJuYWw6OmlzX3NhbWU8U2NhbGFyLCBzdGQ6OmNvbXBsZXg8ZG91YmxlPj46OnZhbHVlKQorICAgIG1hdF9mb2xkZXIgPSBtYXRfZm9sZGVyICsgc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc+KCIvY29tcGxleC8iKTsKICAgZWxzZQogICAgIG1hdF9mb2xkZXIgPSBtYXRfZm9sZGVyICsgc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc+KCIvcmVhbC8iKTsKICAgcmV0dXJuIG1hdF9mb2xkZXI7CiB9Ci1zdGQ6OnN0cmluZyBzeW1fdG9fc3RyaW5nKGludCBzeW0pCi17Ci0gIGlmKHN5bT09U3ltbWV0cmljKSByZXR1cm4gIlN5bW1ldHJpYyAiOwotICBpZihzeW09PVNQRCkgICAgICAgcmV0dXJuICJTUEQgIjsKK3N0ZDo6c3RyaW5nIHN5bV90b19zdHJpbmcoaW50IHN5bSkgeworICBpZiAoc3ltID09IFN5bW1ldHJpYykgcmV0dXJuICJTeW1tZXRyaWMgIjsKKyAgaWYgKHN5bSA9PSBTUEQpIHJldHVybiAiU1BEICI7CiAgIHJldHVybiAiIjsKIH0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1zdGQ6OnN0cmluZyBzb2x2ZXJfc3RhdHMoY29uc3QgSXRlcmF0aXZlU29sdmVyQmFzZTxEZXJpdmVkPiAmc29sdmVyKQotewordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CitzdGQ6OnN0cmluZyBzb2x2ZXJfc3RhdHMoY29uc3QgSXRlcmF0aXZlU29sdmVyQmFzZTxEZXJpdmVkPiYgc29sdmVyKSB7CiAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICBzcyA8PCBzb2x2ZXIuaXRlcmF0aW9ucygpIDw8ICIgaXRlcnMsIGVycm9yOiAiIDw8IHNvbHZlci5lcnJvcigpOwogICByZXR1cm4gc3Muc3RyKCk7CiB9Ci10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgotc3RkOjpzdHJpbmcgc29sdmVyX3N0YXRzKGNvbnN0IFNwYXJzZVNvbHZlckJhc2U8RGVyaXZlZD4gJi8qc29sdmVyKi8pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK3N0ZDo6c3RyaW5nIHNvbHZlcl9zdGF0cyhjb25zdCBTcGFyc2VTb2x2ZXJCYXNlPERlcml2ZWQ+JiAvKnNvbHZlciovKSB7CiAgIHJldHVybiAiIjsKIH0KICNlbmRpZgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXI+IHZvaWQgY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKFNvbHZlciYgc29sdmVyLCBpbnQgbWF4U2l6ZSA9IChzdGQ6Om1pbikoMzAwLEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnQgbWF4UmVhbFdvcmxkU2l6ZSA9IDEwMDAwMCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb2x2ZXI+Cit2b2lkIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhTb2x2ZXImIHNvbHZlciwgaW50IG1heFNpemUgPSAoc3RkOjptaW4pKDMwMCwgRUlHRU5fVEVTVF9NQVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4UmVhbFdvcmxkU2l6ZSA9IDEwMDAwMCkgewogICB0eXBlZGVmIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSBNYXQ7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0OjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U3RvcmFnZUluZGV4IFN0b3JhZ2VJbmRleDsKLSAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLENvbE1ham9yLCBTdG9yYWdlSW5kZXg+IFNwTWF0OworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsIENvbE1ham9yLCBTdG9yYWdlSW5kZXg+IFNwTWF0OwogICB0eXBlZGVmIFNwYXJzZVZlY3RvcjxTY2FsYXIsIDAsIFN0b3JhZ2VJbmRleD4gU3BWZWM7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBEZW5zZVZlY3RvcjsKIAogICAvLyBnZW5lcmF0ZSB0aGUgcHJvYmxlbQogICBNYXQgQSwgaGFsZkE7CkBAIC00MjUsNjQgKzQwNiw1NyBAQAogICAgIGludCBzaXplID0gZ2VuZXJhdGVfc3BhcnNlX3NwZF9wcm9ibGVtKHNvbHZlciwgQSwgaGFsZkEsIGRBLCBtYXhTaXplKTsKIAogICAgIC8vIGdlbmVyYXRlIHRoZSByaWdodCBoYW5kIHNpZGVzCi0gICAgaW50IHJoc0NvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwxNik7Ci0gICAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguL3N0YXRpY19jYXN0PGRvdWJsZT4oc2l6ZSpyaHNDb2xzKSwgMC4xKTsKLSAgICBTcE1hdCBCKHNpemUscmhzQ29scyk7CisgICAgaW50IHJoc0NvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTYpOworICAgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4LiAvIHN0YXRpY19jYXN0PGRvdWJsZT4oc2l6ZSAqIHJoc0NvbHMpLCAwLjEpOworICAgIFNwTWF0IEIoc2l6ZSwgcmhzQ29scyk7CiAgICAgRGVuc2VWZWN0b3IgYiA9IERlbnNlVmVjdG9yOjpSYW5kb20oc2l6ZSk7Ci0gICAgRGVuc2VNYXRyaXggZEIoc2l6ZSxyaHNDb2xzKTsKKyAgICBEZW5zZU1hdHJpeCBkQihzaXplLCByaHNDb2xzKTsKICAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgZEIsIEIsIEZvcmNlTm9uWmVyb0RpYWcpOwogICAgIFNwVmVjIGMgPSBCLmNvbCgwKTsKICAgICBEZW5zZVZlY3RvciBkYyA9IGRCLmNvbCgwKTsKLSAgCi0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsICAgICBiLCAgZEEsIGIpICApOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBoYWxmQSwgYiwgIGRBLCBiKSAgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgICAgIGRCLCBkQSwgZEIpICk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIGhhbGZBLCBkQiwgZEEsIGRCKSApOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBBLCAgICAgQiwgIGRBLCBkQikgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgaGFsZkEsIEIsICBkQSwgZEIpICk7Ci0gICAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsICAgICBjLCAgZEEsIGRjKSApOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBoYWxmQSwgYywgIGRBLCBkYykgKTsKLSAgICAKKworICAgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsIGIsIGRBLCBiKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgaGFsZkEsIGIsIGRBLCBiKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgZEIsIGRBLCBkQikpOworICAgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIGhhbGZBLCBkQiwgZEEsIGRCKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgQiwgZEEsIGRCKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgaGFsZkEsIEIsIGRBLCBkQikpOworICAgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsIGMsIGRBLCBkYykpOworICAgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIGhhbGZBLCBjLCBkQSwgZGMpKTsKKwogICAgIC8vIGNoZWNrIG9ubHkgb25jZQotICAgIGlmKGk9PTApCi0gICAgeworICAgIGlmIChpID09IDApIHsKICAgICAgIGIgPSBEZW5zZVZlY3Rvcjo6WmVybyhzaXplKTsKICAgICAgIGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgYiwgZEEsIGIpOwogICAgIH0KICAgfQotICAKLSAgLy8gRmlyc3QsIGdldCB0aGUgZm9sZGVyIAorCisgIC8vIEZpcnN0LCBnZXQgdGhlIGZvbGRlcgogI2lmZGVmIFRFU1RfUkVBTF9DQVNFUwogICAvLyBUZXN0IHJlYWwgcHJvYmxlbXMgd2l0aCBkb3VibGUgcHJlY2lzaW9uIG9ubHkKLSAgaWYgKGludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsLCBkb3VibGU+Ojp2YWx1ZSkKLSAgeworICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwsIGRvdWJsZT46OnZhbHVlKSB7CiAgICAgc3RkOjpzdHJpbmcgbWF0X2ZvbGRlciA9IGdldF9tYXRyaXhmb2xkZXI8U2NhbGFyPigpOwogICAgIE1hdHJpeE1hcmtldEl0ZXJhdG9yPFNjYWxhcj4gaXQobWF0X2ZvbGRlcik7Ci0gICAgZm9yICg7IGl0OyArK2l0KQotICAgIHsKLSAgICAgIGlmIChpdC5zeW0oKSA9PSBTUEQpeworICAgIGZvciAoOyBpdDsgKytpdCkgeworICAgICAgaWYgKGl0LnN5bSgpID09IFNQRCkgewogICAgICAgICBBID0gaXQubWF0cml4KCk7Ci0gICAgICAgIGlmKEEuZGlhZ29uYWwoKS5zaXplKCkgPD0gbWF4UmVhbFdvcmxkU2l6ZSkKLSAgICAgICAgeworICAgICAgICBpZiAoQS5kaWFnb25hbCgpLnNpemUoKSA8PSBtYXhSZWFsV29ybGRTaXplKSB7CiAgICAgICAgICAgRGVuc2VWZWN0b3IgYiA9IGl0LnJocygpOwogICAgICAgICAgIERlbnNlVmVjdG9yIHJlZlggPSBpdC5yZWZYKCk7CiAgICAgICAgICAgUGVybXV0YXRpb25NYXRyaXg8RHluYW1pYywgRHluYW1pYywgU3RvcmFnZUluZGV4PiBwbnVsbDsKICAgICAgICAgICBoYWxmQS5yZXNpemUoQS5yb3dzKCksIEEuY29scygpKTsKLSAgICAgICAgICBpZihTb2x2ZXI6OlVwTG8gPT0gKExvd2VyfFVwcGVyKSkKKyAgICAgICAgICBpZiAoU29sdmVyOjpVcExvID09IChMb3dlciB8IFVwcGVyKSkKICAgICAgICAgICAgIGhhbGZBID0gQTsKICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICBoYWxmQS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8U29sdmVyOjpVcExvPigpID0gQS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6TG93ZXI+KCkudHdpc3RlZEJ5KHBudWxsKTsKLSAgICAgICAgICAKLSAgICAgICAgICBzdGQ6OmNvdXQgPDwgIklORk8gfCBUZXN0aW5nICIgPDwgc3ltX3RvX3N0cmluZyhpdC5zeW0oKSkgPDwgInNwYXJzZSBwcm9ibGVtICIgPDwgaXQubWF0bmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiICgiIDw8IEEucm93cygpIDw8ICJ4IiA8PCBBLmNvbHMoKSA8PCAiKSB1c2luZyAiIDw8IHR5cGVpZChTb2x2ZXIpLm5hbWUoKSA8PCAiLi4uIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc29sdmluZ19yZWFsX2Nhc2VzKHNvbHZlciwgQSwgICAgIGIsIEEsIHJlZlgpICk7CisKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIklORk8gfCBUZXN0aW5nICIgPDwgc3ltX3RvX3N0cmluZyhpdC5zeW0oKSkgPDwgInNwYXJzZSBwcm9ibGVtICIgPDwgaXQubWF0bmFtZSgpIDw8ICIgKCIKKyAgICAgICAgICAgICAgICAgICAgPDwgQS5yb3dzKCkgPDwgIngiIDw8IEEuY29scygpIDw8ICIpIHVzaW5nICIgPDwgdHlwZWlkKFNvbHZlcikubmFtZSgpIDw8ICIuLi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NvbHZpbmdfcmVhbF9jYXNlcyhzb2x2ZXIsIEEsIGIsIEEsIHJlZlgpKTsKICAgICAgICAgICBzdGQ6OnN0cmluZyBzdGF0cyA9IHNvbHZlcl9zdGF0cyhzb2x2ZXIpOwotICAgICAgICAgIGlmKHN0YXRzLnNpemUoKT4wKQotICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJJTkZPIHwgICIgPDwgc3RhdHMgPDwgc3RkOjplbmRsOwotICAgICAgICAgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NvbHZpbmdfcmVhbF9jYXNlcyhzb2x2ZXIsIGhhbGZBLCBiLCBBLCByZWZYKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICAgIGlmIChzdGF0cy5zaXplKCkgPiAwKSBzdGQ6OmNvdXQgPDwgIklORk8gfCAgIiA8PCBzdGF0cyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zb2x2aW5nX3JlYWxfY2FzZXMoc29sdmVyLCBoYWxmQSwgYiwgQSwgcmVmWCkpOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHN0ZDo6Y291dCA8PCAiSU5GTyB8IFNraXAgc3BhcnNlIHByb2JsZW0gXCIiIDw8IGl0Lm1hdG5hbWUoKSA8PCAiXCIgKHRvbyBsYXJnZSkiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgfQogICAgICAgfQpAQCAtNDkzLDYxICs0NjcsNjAgQEAKICNlbmRpZgogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXI+IHZvaWQgY2hlY2tfc3BhcnNlX3NwZF9kZXRlcm1pbmFudChTb2x2ZXImIHNvbHZlcikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb2x2ZXI+Cit2b2lkIGNoZWNrX3NwYXJzZV9zcGRfZGV0ZXJtaW5hbnQoU29sdmVyJiBzb2x2ZXIpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gRGVuc2VNYXRyaXg7CiAKICAgLy8gZ2VuZXJhdGUgdGhlIHByb2JsZW0KICAgTWF0IEEsIGhhbGZBOwogICBEZW5zZU1hdHJpeCBkQTsKICAgZ2VuZXJhdGVfc3BhcnNlX3NwZF9wcm9ibGVtKHNvbHZlciwgQSwgaGFsZkEsIGRBLCAzMCk7Ci0gIAorCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIGNoZWNrX3NwYXJzZV9kZXRlcm1pbmFudChzb2x2ZXIsIEEsICAgICBkQSk7Ci0gICAgY2hlY2tfc3BhcnNlX2RldGVybWluYW50KHNvbHZlciwgaGFsZkEsIGRBICk7CisgICAgY2hlY2tfc3BhcnNlX2RldGVybWluYW50KHNvbHZlciwgQSwgZEEpOworICAgIGNoZWNrX3NwYXJzZV9kZXRlcm1pbmFudChzb2x2ZXIsIGhhbGZBLCBkQSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyLCB0eXBlbmFtZSBEZW5zZU1hdD4KLUluZGV4IGdlbmVyYXRlX3NwYXJzZV9zcXVhcmVfcHJvYmxlbShTb2x2ZXImLCB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUmIEEsIERlbnNlTWF0JiBkQSwgaW50IG1heFNpemUgPSAzMDAsIGludCBvcHRpb25zID0gRm9yY2VOb25aZXJvRGlhZykKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb2x2ZXIsIHR5cGVuYW1lIERlbnNlTWF0PgorSW5kZXggZ2VuZXJhdGVfc3BhcnNlX3NxdWFyZV9wcm9ibGVtKFNvbHZlciYsIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwgRGVuc2VNYXQmIGRBLCBpbnQgbWF4U2l6ZSA9IDMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3B0aW9ucyA9IEZvcmNlTm9uWmVyb0RpYWcpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKIAotICBJbmRleCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsbWF4U2l6ZSk7Ci0gIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4Li9zdGF0aWNfY2FzdDxkb3VibGU+KHNpemUqc2l6ZSksIDAuMDEpOwotICAKLSAgQS5yZXNpemUoc2l6ZSxzaXplKTsKLSAgZEEucmVzaXplKHNpemUsc2l6ZSk7CisgIEluZGV4IHNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4U2l6ZSk7CisgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4LiAvIHN0YXRpY19jYXN0PGRvdWJsZT4oc2l6ZSAqIHNpemUpLCAwLjAxKTsKKworICBBLnJlc2l6ZShzaXplLCBzaXplKTsKKyAgZEEucmVzaXplKHNpemUsIHNpemUpOwogCiAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCBkQSwgQSwgb3B0aW9ucyk7Ci0gIAorCiAgIHJldHVybiBzaXplOwogfQogCi0KIHN0cnVjdCBwcnVuZV9jb2x1bW4gewogICBJbmRleCBtX2NvbDsKICAgcHJ1bmVfY29sdW1uKEluZGV4IGNvbCkgOiBtX2NvbChjb2wpIHt9Ci0gIHRlbXBsYXRlPGNsYXNzIFNjYWxhcj4KKyAgdGVtcGxhdGUgPGNsYXNzIFNjYWxhcj4KICAgYm9vbCBvcGVyYXRvcigpKEluZGV4LCBJbmRleCBjb2wsIGNvbnN0IFNjYWxhciYpIGNvbnN0IHsKICAgICByZXR1cm4gY29sICE9IG1fY29sOwogICB9CiB9OwogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFNvbHZlcj4gdm9pZCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoU29sdmVyJiBzb2x2ZXIsIGludCBtYXhTaXplID0gMzAwLCBpbnQgbWF4UmVhbFdvcmxkU2l6ZSA9IDEwMDAwMCwgYm9vbCBjaGVja0RlZmljaWVudCA9IGZhbHNlKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNvbHZlcj4KK3ZvaWQgY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKFNvbHZlciYgc29sdmVyLCBpbnQgbWF4U2l6ZSA9IDMwMCwgaW50IG1heFJlYWxXb3JsZFNpemUgPSAxMDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNoZWNrRGVmaWNpZW50ID0gZmFsc2UpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKLSAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLENvbE1ham9yLCB0eXBlbmFtZSBNYXQ6OlN0b3JhZ2VJbmRleD4gU3BNYXQ7CisgIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhciwgQ29sTWFqb3IsIHR5cGVuYW1lIE1hdDo6U3RvcmFnZUluZGV4PiBTcE1hdDsKICAgdHlwZWRlZiBTcGFyc2VWZWN0b3I8U2NhbGFyLCAwLCB0eXBlbmFtZSBNYXQ6OlN0b3JhZ2VJbmRleD4gU3BWZWM7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBEZW5zZVZlY3RvcjsKIAotICBpbnQgcmhzQ29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDE2KTsKKyAgaW50IHJoc0NvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMTYpOwogCiAgIE1hdCBBOwogICBEZW5zZU1hdHJpeCBkQTsKQEAgLTU1Niw1NSArNTI5LDQ4IEBACiAKICAgICBBLm1ha2VDb21wcmVzc2VkKCk7CiAgICAgRGVuc2VWZWN0b3IgYiA9IERlbnNlVmVjdG9yOjpSYW5kb20oc2l6ZSk7Ci0gICAgRGVuc2VNYXRyaXggZEIoc2l6ZSxyaHNDb2xzKTsKLSAgICBTcE1hdCBCKHNpemUscmhzQ29scyk7Ci0gICAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguL2RvdWJsZShzaXplKnJoc0NvbHMpLCAwLjEpOworICAgIERlbnNlTWF0cml4IGRCKHNpemUsIHJoc0NvbHMpOworICAgIFNwTWF0IEIoc2l6ZSwgcmhzQ29scyk7CisgICAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguIC8gZG91YmxlKHNpemUgKiByaHNDb2xzKSwgMC4xKTsKICAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgZEIsIEIsIEZvcmNlTm9uWmVyb0RpYWcpOwogICAgIEIubWFrZUNvbXByZXNzZWQoKTsKICAgICBTcFZlYyBjID0gQi5jb2woMCk7CiAgICAgRGVuc2VWZWN0b3IgZGMgPSBkQi5jb2woMCk7Ci0gICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgYiwgIGRBLCBiKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgYiwgZEEsIGIpKTsKICAgICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBBLCBkQiwgZEEsIGRCKSk7Ci0gICAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgQiwgIGRBLCBkQikpOwotICAgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsIGMsICBkQSwgZGMpKTsKLSAgICAKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBBLCBCLCBkQSwgZEIpKTsKKyAgICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBBLCBjLCBkQSwgZGMpKTsKKwogICAgIC8vIGNoZWNrIG9ubHkgb25jZQotICAgIGlmKGk9PTApCi0gICAgeworICAgIGlmIChpID09IDApIHsKICAgICAgIENBTExfU1VCVEVTVChiID0gRGVuc2VWZWN0b3I6Olplcm8oc2l6ZSk7IGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgYiwgZEEsIGIpKTsKICAgICB9CiAgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBCdWcgNzkyIChzdHJ1Y3R1cmFsbHkgcmFuayBkZWZpY2llbnQgbWF0cmljZXMpOgotICAgIGlmKGNoZWNrRGVmaWNpZW50ICYmIHNpemU+MSkgewotICAgICAgSW5kZXggY29sID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsaW50KHNpemUtMSkpOworICAgIGlmIChjaGVja0RlZmljaWVudCAmJiBzaXplID4gMSkgeworICAgICAgSW5kZXggY29sID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIGludChzaXplIC0gMSkpOwogICAgICAgQS5wcnVuZShwcnVuZV9jb2x1bW4oY29sKSk7CiAgICAgICBzb2x2ZXIuY29tcHV0ZShBKTsKICAgICAgIFZFUklGWV9JU19FUVVBTChzb2x2ZXIuaW5mbygpLCBOdW1lcmljYWxJc3N1ZSk7CiAgICAgfQogICB9Ci0gIAotICAvLyBGaXJzdCwgZ2V0IHRoZSBmb2xkZXIgCisKKyAgLy8gRmlyc3QsIGdldCB0aGUgZm9sZGVyCiAjaWZkZWYgVEVTVF9SRUFMX0NBU0VTCiAgIC8vIFRlc3QgcmVhbCBwcm9ibGVtcyB3aXRoIGRvdWJsZSBwcmVjaXNpb24gb25seQotICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8dHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwsIGRvdWJsZT46OnZhbHVlKQotICB7CisgIGlmIChpbnRlcm5hbDo6aXNfc2FtZTx0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCwgZG91YmxlPjo6dmFsdWUpIHsKICAgICBzdGQ6OnN0cmluZyBtYXRfZm9sZGVyID0gZ2V0X21hdHJpeGZvbGRlcjxTY2FsYXI+KCk7CiAgICAgTWF0cml4TWFya2V0SXRlcmF0b3I8U2NhbGFyPiBpdChtYXRfZm9sZGVyKTsKLSAgICBmb3IgKDsgaXQ7ICsraXQpCi0gICAgeworICAgIGZvciAoOyBpdDsgKytpdCkgewogICAgICAgQSA9IGl0Lm1hdHJpeCgpOwotICAgICAgaWYoQS5kaWFnb25hbCgpLnNpemUoKSA8PSBtYXhSZWFsV29ybGRTaXplKQotICAgICAgeworICAgICAgaWYgKEEuZGlhZ29uYWwoKS5zaXplKCkgPD0gbWF4UmVhbFdvcmxkU2l6ZSkgewogICAgICAgICBEZW5zZVZlY3RvciBiID0gaXQucmhzKCk7CiAgICAgICAgIERlbnNlVmVjdG9yIHJlZlggPSBpdC5yZWZYKCk7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiSU5GTyB8IFRlc3RpbmcgIiA8PCBzeW1fdG9fc3RyaW5nKGl0LnN5bSgpKSA8PCAic3BhcnNlIHByb2JsZW0gIiA8PCBpdC5tYXRuYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICIgKCIgPDwgQS5yb3dzKCkgPDwgIngiIDw8IEEuY29scygpIDw8ICIpIHVzaW5nICIgPDwgdHlwZWlkKFNvbHZlcikubmFtZSgpIDw8ICIuLi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJJTkZPIHwgVGVzdGluZyAiIDw8IHN5bV90b19zdHJpbmcoaXQuc3ltKCkpIDw8ICJzcGFyc2UgcHJvYmxlbSAiIDw8IGl0Lm1hdG5hbWUoKSA8PCAiICgiCisgICAgICAgICAgICAgICAgICA8PCBBLnJvd3MoKSA8PCAieCIgPDwgQS5jb2xzKCkgPDwgIikgdXNpbmcgIiA8PCB0eXBlaWQoU29sdmVyKS5uYW1lKCkgPDwgIi4uLiIgPDwgc3RkOjplbmRsOwogICAgICAgICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NvbHZpbmdfcmVhbF9jYXNlcyhzb2x2ZXIsIEEsIGIsIEEsIHJlZlgpKTsKICAgICAgICAgc3RkOjpzdHJpbmcgc3RhdHMgPSBzb2x2ZXJfc3RhdHMoc29sdmVyKTsKLSAgICAgICAgaWYoc3RhdHMuc2l6ZSgpPjApCi0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJJTkZPIHwgICIgPDwgc3RhdHMgPDwgc3RkOjplbmRsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeworICAgICAgICBpZiAoc3RhdHMuc2l6ZSgpID4gMCkgc3RkOjpjb3V0IDw8ICJJTkZPIHwgICIgPDwgc3RhdHMgPDwgc3RkOjplbmRsOworICAgICAgfSBlbHNlIHsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJJTkZPIHwgU0tJUCBzcGFyc2UgcHJvYmxlbSBcIiIgPDwgaXQubWF0bmFtZSgpIDw8ICJcIiAodG9vIGxhcmdlKSIgPDwgc3RkOjplbmRsOwogICAgICAgfQogICAgIH0KQEAgLTYxMiwzNyArNTc4LDM2IEBACiAjZWxzZQogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUobWF4UmVhbFdvcmxkU2l6ZSk7CiAjZW5kaWYKLQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTb2x2ZXI+IHZvaWQgY2hlY2tfc3BhcnNlX3NxdWFyZV9kZXRlcm1pbmFudChTb2x2ZXImIHNvbHZlcikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb2x2ZXI+Cit2b2lkIGNoZWNrX3NwYXJzZV9zcXVhcmVfZGV0ZXJtaW5hbnQoU29sdmVyJiBzb2x2ZXIpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXg7Ci0gIAorICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IERlbnNlTWF0cml4OworCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewogICAgIC8vIGdlbmVyYXRlIHRoZSBwcm9ibGVtCiAgICAgTWF0IEE7CiAgICAgRGVuc2VNYXRyaXggZEE7Ci0gICAgCi0gICAgaW50IHNpemUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwzMCk7Ci0gICAgZEEuc2V0UmFuZG9tKHNpemUsc2l6ZSk7Ci0gICAgCi0gICAgZEEgPSAoZEEuYXJyYXkoKS5hYnMoKTwwLjMpLnNlbGVjdCgwLGRBKTsKLSAgICBkQS5kaWFnb25hbCgpID0gKGRBLmRpYWdvbmFsKCkuYXJyYXkoKT09MCkuc2VsZWN0KDEsZEEuZGlhZ29uYWwoKSk7CisKKyAgICBpbnQgc2l6ZSA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAzMCk7CisgICAgZEEuc2V0UmFuZG9tKHNpemUsIHNpemUpOworCisgICAgZEEgPSAoZEEuYXJyYXkoKS5hYnMoKSA8IDAuMykuc2VsZWN0KDAsIGRBKTsKKyAgICBkQS5kaWFnb25hbCgpID0gKGRBLmRpYWdvbmFsKCkuYXJyYXkoKSA9PSAwKS5zZWxlY3QoMSwgZEEuZGlhZ29uYWwoKSk7CiAgICAgQSA9IGRBLnNwYXJzZVZpZXcoKTsKICAgICBBLm1ha2VDb21wcmVzc2VkKCk7Ci0gIAorCiAgICAgY2hlY2tfc3BhcnNlX2RldGVybWluYW50KHNvbHZlciwgQSwgZEEpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNvbHZlcj4gdm9pZCBjaGVja19zcGFyc2Vfc3F1YXJlX2Fic19kZXRlcm1pbmFudChTb2x2ZXImIHNvbHZlcikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb2x2ZXI+Cit2b2lkIGNoZWNrX3NwYXJzZV9zcXVhcmVfYWJzX2RldGVybWluYW50KFNvbHZlciYgc29sdmVyKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlIE1hdDsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlNjYWxhciBTY2FsYXI7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IERlbnNlTWF0cml4OwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewogICAgIC8vIGdlbmVyYXRlIHRoZSBwcm9ibGVtCkBAIC02NTQsMzEgKzYxOSwzMSBAQAogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgRGVuc2VNYXQ+Ci12b2lkIGdlbmVyYXRlX3NwYXJzZV9sZWFzdHNxdWFyZV9wcm9ibGVtKFNvbHZlciYsIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwgRGVuc2VNYXQmIGRBLCBpbnQgbWF4U2l6ZSA9IDMwMCwgaW50IG9wdGlvbnMgPSBGb3JjZU5vblplcm9EaWFnKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNvbHZlciwgdHlwZW5hbWUgRGVuc2VNYXQ+Cit2b2lkIGdlbmVyYXRlX3NwYXJzZV9sZWFzdHNxdWFyZV9wcm9ibGVtKFNvbHZlciYsIHR5cGVuYW1lIFNvbHZlcjo6TWF0cml4VHlwZSYgQSwgRGVuc2VNYXQmIGRBLCBpbnQgbWF4U2l6ZSA9IDMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wdGlvbnMgPSBGb3JjZU5vblplcm9EaWFnKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgU29sdmVyOjpNYXRyaXhUeXBlIE1hdDsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXQ6OlNjYWxhciBTY2FsYXI7CiAKLSAgaW50IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxtYXhTaXplKTsKLSAgaW50IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxyb3dzKTsKLSAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguLyhyb3dzKmNvbHMpLCAwLjAxKTsKLSAgCi0gIEEucmVzaXplKHJvd3MsY29scyk7Ci0gIGRBLnJlc2l6ZShyb3dzLGNvbHMpOworICBpbnQgcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCBtYXhTaXplKTsKKyAgaW50IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgcm93cyk7CisgIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4LiAvIChyb3dzICogY29scyksIDAuMDEpOworCisgIEEucmVzaXplKHJvd3MsIGNvbHMpOworICBkQS5yZXNpemUocm93cywgY29scyk7CiAKICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIGRBLCBBLCBvcHRpb25zKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU29sdmVyPiB2b2lkIGNoZWNrX3NwYXJzZV9sZWFzdHNxdWFyZV9zb2x2aW5nKFNvbHZlciYgc29sdmVyKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNvbHZlcj4KK3ZvaWQgY2hlY2tfc3BhcnNlX2xlYXN0c3F1YXJlX3NvbHZpbmcoU29sdmVyJiBzb2x2ZXIpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBTb2x2ZXI6Ok1hdHJpeFR5cGUgTWF0OwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdDo6U2NhbGFyIFNjYWxhcjsKLSAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLENvbE1ham9yLCB0eXBlbmFtZSBNYXQ6OlN0b3JhZ2VJbmRleD4gU3BNYXQ7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLCBDb2xNYWpvciwgdHlwZW5hbWUgTWF0OjpTdG9yYWdlSW5kZXg+IFNwTWF0OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IERlbnNlTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IERlbnNlVmVjdG9yOwogCi0gIGludCByaHNDb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTYpOworICBpbnQgcmhzQ29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAxNik7CiAKICAgTWF0IEE7CiAgIERlbnNlTWF0cml4IGRBOwpAQCAtNjg3LDE4ICs2NTIsMTcgQEAKIAogICAgIEEubWFrZUNvbXByZXNzZWQoKTsKICAgICBEZW5zZVZlY3RvciBiID0gRGVuc2VWZWN0b3I6OlJhbmRvbShBLnJvd3MoKSk7Ci0gICAgRGVuc2VNYXRyaXggZEIoQS5yb3dzKCkscmhzQ29scyk7Ci0gICAgU3BNYXQgQihBLnJvd3MoKSxyaHNDb2xzKTsKLSAgICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKEEucm93cygpKnJoc0NvbHMpLCAwLjEpOworICAgIERlbnNlTWF0cml4IGRCKEEucm93cygpLCByaHNDb2xzKTsKKyAgICBTcE1hdCBCKEEucm93cygpLCByaHNDb2xzKTsKKyAgICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4gLyAoQS5yb3dzKCkgKiByaHNDb2xzKSwgMC4xKTsKICAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgZEIsIEIsIEZvcmNlTm9uWmVyb0RpYWcpOwogICAgIEIubWFrZUNvbXByZXNzZWQoKTsKLSAgICBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsIGIsICBkQSwgYik7CisgICAgY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBBLCBiLCBkQSwgYik7CiAgICAgY2hlY2tfc3BhcnNlX3NvbHZpbmcoc29sdmVyLCBBLCBkQiwgZEEsIGRCKTsKLSAgICBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsIEIsICBkQSwgZEIpOwotICAgIAorICAgIGNoZWNrX3NwYXJzZV9zb2x2aW5nKHNvbHZlciwgQSwgQiwgZEEsIGRCKTsKKwogICAgIC8vIGNoZWNrIG9ubHkgb25jZQotICAgIGlmKGk9PTApCi0gICAgeworICAgIGlmIChpID09IDApIHsKICAgICAgIGIgPSBEZW5zZVZlY3Rvcjo6WmVybyhBLnJvd3MoKSk7CiAgICAgICBjaGVja19zcGFyc2Vfc29sdmluZyhzb2x2ZXIsIEEsIGIsIGRBLCBiKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3NwYXJzZV9zb2x2ZXJzLmNwcCBiL3Rlc3Qvc3BhcnNlX3NvbHZlcnMuY3BwCmluZGV4IDFmNDk0OGEuLjE5OWRmZmYgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3BhcnNlX3NvbHZlcnMuY3BwCisrKyBiL3Rlc3Qvc3BhcnNlX3NvbHZlcnMuY3BwCkBAIC05LDMyICs5LDI3IEBACiAKICNpbmNsdWRlICJzcGFyc2UuaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkCi1pbml0U1BEKGRvdWJsZSBkZW5zaXR5LAotICAgICAgICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4mIHJlZk1hdCwKLSAgICAgICAgU3BhcnNlTWF0cml4PFNjYWxhcj4mIHNwYXJzZU1hdCkKLXsKLSAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IGF1eChyZWZNYXQucm93cygpLHJlZk1hdC5jb2xzKCkpOwotICBpbml0U3BhcnNlKGRlbnNpdHkscmVmTWF0LHNwYXJzZU1hdCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBpbml0U1BEKGRvdWJsZSBkZW5zaXR5LCBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiYgcmVmTWF0LCBTcGFyc2VNYXRyaXg8U2NhbGFyPiYgc3BhcnNlTWF0KSB7CisgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IGF1eChyZWZNYXQucm93cygpLCByZWZNYXQuY29scygpKTsKKyAgaW5pdFNwYXJzZShkZW5zaXR5LCByZWZNYXQsIHNwYXJzZU1hdCk7CiAgIHJlZk1hdCA9IHJlZk1hdCAqIHJlZk1hdC5hZGpvaW50KCk7Ci0gIGZvciAoaW50IGs9MDsgazwyOyArK2spCi0gIHsKLSAgICBpbml0U3BhcnNlKGRlbnNpdHksYXV4LHNwYXJzZU1hdCxGb3JjZU5vblplcm9EaWFnKTsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCAyOyArK2spIHsKKyAgICBpbml0U3BhcnNlKGRlbnNpdHksIGF1eCwgc3BhcnNlTWF0LCBGb3JjZU5vblplcm9EaWFnKTsKICAgICByZWZNYXQgKz0gYXV4ICogYXV4LmFkam9pbnQoKTsKICAgfQogICBzcGFyc2VNYXQuc2V0WmVybygpOwotICBmb3IgKGludCBqPTAgOyBqPHNwYXJzZU1hdC5jb2xzKCk7ICsraikKLSAgICBmb3IgKGludCBpPWogOyBpPHNwYXJzZU1hdC5yb3dzKCk7ICsraSkKLSAgICAgIGlmIChyZWZNYXQoaSxqKSE9U2NhbGFyKDApKQotICAgICAgICBzcGFyc2VNYXQuaW5zZXJ0KGksaikgPSByZWZNYXQoaSxqKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBzcGFyc2VNYXQuY29scygpOyArK2opCisgICAgZm9yIChpbnQgaSA9IGo7IGkgPCBzcGFyc2VNYXQucm93cygpOyArK2kpCisgICAgICBpZiAocmVmTWF0KGksIGopICE9IFNjYWxhcigwKSkgc3BhcnNlTWF0Lmluc2VydChpLCBqKSA9IHJlZk1hdChpLCBqKTsKICAgc3BhcnNlTWF0LmZpbmFsaXplKCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBzcGFyc2Vfc29sdmVycyhpbnQgcm93cywgaW50IGNvbHMpCi17Ci0gIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4Li8ocm93cypjb2xzKSwgMC4wMSk7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIHNwYXJzZV9zb2x2ZXJzKGludCByb3dzLCBpbnQgY29scykgeworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4gLyAocm93cyAqIGNvbHMpLCAwLjAxKTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBEZW5zZU1hdHJpeDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBEZW5zZVZlY3RvcjsKICAgLy8gU2NhbGFyIGVwcyA9IDFlLTY7CiAKICAgRGVuc2VWZWN0b3IgdmVjMSA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyk7CkBAIC00OSwzMSArNDQsMzIgQEAKICAgICBEZW5zZU1hdHJpeCByZWZNYXQyID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgY29scyk7CiAKICAgICAvLyBsb3dlciAtIGRlbnNlCi0gICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VMb3dlclRyaWFuZ3VsYXIsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnIHwgTWFrZUxvd2VyVHJpYW5ndWxhciwgJnplcm9Db29yZHMsICZub256ZXJvQ29vcmRzKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk1hdDIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUodmVjMiksCiAgICAgICAgICAgICAgICAgICAgICBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZSh2ZWMzKSk7CiAKICAgICAvLyB1cHBlciAtIGRlbnNlCi0gICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VVcHBlclRyaWFuZ3VsYXIsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnIHwgTWFrZVVwcGVyVHJpYW5ndWxhciwgJnplcm9Db29yZHMsICZub256ZXJvQ29vcmRzKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk1hdDIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUodmVjMiksCiAgICAgICAgICAgICAgICAgICAgICBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZSh2ZWMzKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKHZlYzIpLAogICAgICAgICAgICAgICAgICAgICAgbTIuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUodmVjMykpOwogICAgIHsKICAgICAgIFNwYXJzZU1hdHJpeDxTY2FsYXI+IGNtMihtMik7Ci0gICAgICAvL0luZGV4IHJvd3MsIEluZGV4IGNvbHMsIEluZGV4IG5ueiwgSW5kZXgqIG91dGVySW5kZXhQdHIsIEluZGV4KiBpbm5lckluZGV4UHRyLCBTY2FsYXIqIHZhbHVlUHRyCi0gICAgICBNYXA8U3BhcnNlTWF0cml4PFNjYWxhcj4gPiBtbTIocm93cywgY29scywgY20yLm5vblplcm9zKCksIGNtMi5vdXRlckluZGV4UHRyKCksIGNtMi5pbm5lckluZGV4UHRyKCksIGNtMi52YWx1ZVB0cigpKTsKKyAgICAgIC8vIEluZGV4IHJvd3MsIEluZGV4IGNvbHMsIEluZGV4IG5ueiwgSW5kZXgqIG91dGVySW5kZXhQdHIsIEluZGV4KiBpbm5lckluZGV4UHRyLCBTY2FsYXIqIHZhbHVlUHRyCisgICAgICBNYXA8U3BhcnNlTWF0cml4PFNjYWxhcj4gPiBtbTIocm93cywgY29scywgY20yLm5vblplcm9zKCksIGNtMi5vdXRlckluZGV4UHRyKCksIGNtMi5pbm5lckluZGV4UHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20yLnZhbHVlUHRyKCkpOwogICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlKHZlYzIpLAogICAgICAgICAgICAgICAgICAgICAgICBtbTIuY29uanVnYXRlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUodmVjMykpOwogICAgIH0KIAogICAgIC8vIGxvd2VyIC0gdHJhbnNwb3NlCi0gICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnfE1ha2VMb3dlclRyaWFuZ3VsYXIsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnIHwgTWFrZUxvd2VyVHJpYW5ndWxhciwgJnplcm9Db29yZHMsICZub256ZXJvQ29vcmRzKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHJlZk1hdDIudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmUodmVjMiksCiAgICAgICAgICAgICAgICAgICAgICBtMi50cmFuc3Bvc2UoKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zb2x2ZSh2ZWMzKSk7CiAKICAgICAvLyB1cHBlciAtIHRyYW5zcG9zZQotICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMiwgRm9yY2VOb25aZXJvRGlhZ3xNYWtlVXBwZXJUcmlhbmd1bGFyLCAmemVyb0Nvb3JkcywgJm5vbnplcm9Db29yZHMpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMiwgRm9yY2VOb25aZXJvRGlhZyB8IE1ha2VVcHBlclRyaWFuZ3VsYXIsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLnRyYW5zcG9zZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKHZlYzIpLAogICAgICAgICAgICAgICAgICAgICAgbTIudHJhbnNwb3NlKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUodmVjMykpOwogCkBAIC04MSw0NSArNzcsNDQgQEAKICAgICBEZW5zZU1hdHJpeCByZWZNYXRCID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7CiAKICAgICAvLyBsb3dlciAtIHNwYXJzZQotICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMiwgRm9yY2VOb25aZXJvRGlhZ3xNYWtlTG93ZXJUcmlhbmd1bGFyKTsKKyAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIsIEZvcmNlTm9uWmVyb0RpYWcgfCBNYWtlTG93ZXJUcmlhbmd1bGFyKTsKICAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0QiwgbWF0Qik7CiAgICAgcmVmTWF0Mi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2UocmVmTWF0Qik7CiAgICAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmVJblBsYWNlKG1hdEIpOwogICAgIFZFUklGWV9JU19BUFBST1gobWF0Qi50b0RlbnNlKCksIHJlZk1hdEIpOwogCiAgICAgLy8gdXBwZXIgLSBzcGFyc2UKLSAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgcmVmTWF0MiwgbTIsIEZvcmNlTm9uWmVyb0RpYWd8TWFrZVVwcGVyVHJpYW5ndWxhcik7CisgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdDIsIG0yLCBGb3JjZU5vblplcm9EaWFnIHwgTWFrZVVwcGVyVHJpYW5ndWxhcik7CiAgICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdEIsIG1hdEIpOwogICAgIHJlZk1hdDIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc29sdmVJblBsYWNlKHJlZk1hdEIpOwogICAgIG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNvbHZlSW5QbGFjZShtYXRCKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdEIsIHJlZk1hdEIpOwogCiAgICAgLy8gdGVzdCBkZXByZWNhdGVkIEFQSQotICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMiwgRm9yY2VOb25aZXJvRGlhZ3xNYWtlTG93ZXJUcmlhbmd1bGFyLCAmemVyb0Nvb3JkcywgJm5vbnplcm9Db29yZHMpOworICAgIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCByZWZNYXQyLCBtMiwgRm9yY2VOb25aZXJvRGlhZyB8IE1ha2VMb3dlclRyaWFuZ3VsYXIsICZ6ZXJvQ29vcmRzLCAmbm9uemVyb0Nvb3Jkcyk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChyZWZNYXQyLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnNvbHZlKHZlYzIpLAogICAgICAgICAgICAgICAgICAgICAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuc29sdmUodmVjMykpOwogCiAgICAgLy8gdGVzdCBlbXB0eSB0cmlhbmd1bGFyIG1hdHJpeAogICAgIHsKLSAgICAgIG0yLnJlc2l6ZSgwLDApOwotICAgICAgcmVmTWF0Qi5yZXNpemUoMCxyZWZNYXRCLmNvbHMoKSk7CisgICAgICBtMi5yZXNpemUoMCwgMCk7CisgICAgICByZWZNYXRCLnJlc2l6ZSgwLCByZWZNYXRCLmNvbHMoKSk7CiAgICAgICBEZW5zZU1hdHJpeCByZXMgPSBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZShyZWZNYXRCKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTChyZXMucm93cygpLDApOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlcy5jb2xzKCkscmVmTWF0Qi5jb2xzKCkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlcy5yb3dzKCksIDApOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlcy5jb2xzKCksIHJlZk1hdEIuY29scygpKTsKICAgICAgIHJlcyA9IHJlZk1hdEI7CiAgICAgICBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxMb3dlcj4oKS5zb2x2ZUluUGxhY2UocmVzKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTChyZXMucm93cygpLDApOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlcy5jb2xzKCkscmVmTWF0Qi5jb2xzKCkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlcy5yb3dzKCksIDApOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlcy5jb2xzKCksIHJlZk1hdEIuY29scygpKTsKICAgICB9CiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHNwYXJzZV9zb2x2ZXJzKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKHNwYXJzZV9zb2x2ZXJzPGRvdWJsZT4oOCwgOCkgKTsKLSAgICBpbnQgcyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDMwMCk7Ci0gICAgQ0FMTF9TVUJURVNUXzIoc3BhcnNlX3NvbHZlcnM8c3RkOjpjb21wbGV4PGRvdWJsZT4gPihzLHMpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoc3BhcnNlX3NvbHZlcnM8ZG91YmxlPihzLHMpICk7CitFSUdFTl9ERUNMQVJFX1RFU1Qoc3BhcnNlX3NvbHZlcnMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoc3BhcnNlX3NvbHZlcnM8ZG91YmxlPig4LCA4KSk7CisgICAgaW50IHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMzAwKTsKKyAgICBDQUxMX1NVQlRFU1RfMihzcGFyc2Vfc29sdmVyczxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KHMsIHMpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShzcGFyc2Vfc29sdmVyczxkb3VibGU+KHMsIHMpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9zcGFyc2VfdmVjdG9yLmNwcCBiL3Rlc3Qvc3BhcnNlX3ZlY3Rvci5jcHAKaW5kZXggMGY5OTg3OS4uODNhZDMyNCAxMDA2NDQKLS0tIGEvdGVzdC9zcGFyc2VfdmVjdG9yLmNwcAorKysgYi90ZXN0L3NwYXJzZV92ZWN0b3IuY3BwCkBAIC05LDIzICs5LDIxIEBACiAKICNpbmNsdWRlICJzcGFyc2UuaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIFN0b3JhZ2VJbmRleD4gdm9pZCBzcGFyc2VfdmVjdG9yKGludCByb3dzLCBpbnQgY29scykKLXsKLSAgZG91YmxlIGRlbnNpdHlNYXQgPSAoc3RkOjptYXgpKDguLyhyb3dzKmNvbHMpLCAwLjAxKTsKLSAgZG91YmxlIGRlbnNpdHlWZWMgPSAoc3RkOjptYXgpKDguLyhyb3dzKSwgMC4xKTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXRyaXg7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IERlbnNlVmVjdG9yOwotICB0eXBlZGVmIE1hdHJpeDxEZW5zZUluZGV4LER5bmFtaWMsMT4gRGVuc2VJbmRleFZlY3RvcjsKLSAgdHlwZWRlZiBTcGFyc2VWZWN0b3I8U2NhbGFyLDAsU3RvcmFnZUluZGV4PiBTcGFyc2VWZWN0b3JUeXBlOwotICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsMCxTdG9yYWdlSW5kZXg+IFNwYXJzZU1hdHJpeFR5cGU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBTdG9yYWdlSW5kZXg+Cit2b2lkIHNwYXJzZV92ZWN0b3IoaW50IHJvd3MsIGludCBjb2xzKSB7CisgIGRvdWJsZSBkZW5zaXR5TWF0ID0gKHN0ZDo6bWF4KSg4LiAvIChyb3dzICogY29scyksIDAuMDEpOworICBkb3VibGUgZGVuc2l0eVZlYyA9IChzdGQ6Om1heCkoOC4gLyAocm93cyksIDAuMSk7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gRGVuc2VNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gRGVuc2VWZWN0b3I7CisgIHR5cGVkZWYgTWF0cml4PERlbnNlSW5kZXgsIER5bmFtaWMsIDE+IERlbnNlSW5kZXhWZWN0b3I7CisgIHR5cGVkZWYgU3BhcnNlVmVjdG9yPFNjYWxhciwgMCwgU3RvcmFnZUluZGV4PiBTcGFyc2VWZWN0b3JUeXBlOworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsIDAsIFN0b3JhZ2VJbmRleD4gU3BhcnNlTWF0cml4VHlwZTsKICAgU2NhbGFyIGVwcyA9IDFlLTY7CiAKLSAgU3BhcnNlTWF0cml4VHlwZSBtMShyb3dzLHJvd3MpOworICBTcGFyc2VNYXRyaXhUeXBlIG0xKHJvd3MsIHJvd3MpOwogICBTcGFyc2VWZWN0b3JUeXBlIHYxKHJvd3MpLCB2Mihyb3dzKSwgdjMocm93cyk7CiAgIERlbnNlTWF0cml4IHJlZk0xID0gRGVuc2VNYXRyaXg6Olplcm8ocm93cywgcm93cyk7Ci0gIERlbnNlVmVjdG9yIHJlZlYxID0gRGVuc2VWZWN0b3I6OlJhbmRvbShyb3dzKSwKLSAgICAgICAgICAgICAgcmVmVjIgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKHJvd3MpLAotICAgICAgICAgICAgICByZWZWMyA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyk7CisgIERlbnNlVmVjdG9yIHJlZlYxID0gRGVuc2VWZWN0b3I6OlJhbmRvbShyb3dzKSwgcmVmVjIgPSBEZW5zZVZlY3Rvcjo6UmFuZG9tKHJvd3MpLCByZWZWMyA9IERlbnNlVmVjdG9yOjpSYW5kb20ocm93cyk7CiAKICAgc3RkOjp2ZWN0b3I8aW50PiB6ZXJvY29vcmRzLCBub256ZXJvY29vcmRzOwogICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eVZlYywgcmVmVjEsIHYxLCAmemVyb2Nvb3JkcywgJm5vbnplcm9jb29yZHMpOwpAQCAtMzcsMTE2ICszNSwxMDkgQEAKICAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAKICAgLy8gdGVzdCBjb2VmZiBhbmQgY29lZmZSZWYKLSAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpPHplcm9jb29yZHMuc2l6ZSgpOyArK2kpCi0gIHsKLSAgICBWRVJJRllfSVNfTVVDSF9TTUFMTEVSX1RIQU4oIHYxLmNvZWZmKHplcm9jb29yZHNbaV0pLCBlcHMgKTsKLSAgICAvL1ZFUklGWV9SQUlTRVNfQVNTRVJUKCB2MS5jb2VmZlJlZih6ZXJvY29vcmRzW2ldKSA9IDUgKTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB6ZXJvY29vcmRzLnNpemUoKTsgKytpKSB7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHYxLmNvZWZmKHplcm9jb29yZHNbaV0pLCBlcHMpOworICAgIC8vIFZFUklGWV9SQUlTRVNfQVNTRVJUKCB2MS5jb2VmZlJlZih6ZXJvY29vcmRzW2ldKSA9IDUgKTsKICAgfQogICB7CiAgICAgVkVSSUZZKGludChub256ZXJvY29vcmRzLnNpemUoKSkgPT0gdjEubm9uWmVyb3MoKSk7Ci0gICAgaW50IGo9MDsKLSAgICBmb3IgKHR5cGVuYW1lIFNwYXJzZVZlY3RvclR5cGU6OklubmVySXRlcmF0b3IgaXQodjEpOyBpdDsgKytpdCwrK2opCi0gICAgewotICAgICAgVkVSSUZZKG5vbnplcm9jb29yZHNbal09PWl0LmluZGV4KCkpOworICAgIGludCBqID0gMDsKKyAgICBmb3IgKHR5cGVuYW1lIFNwYXJzZVZlY3RvclR5cGU6OklubmVySXRlcmF0b3IgaXQodjEpOyBpdDsgKytpdCwgKytqKSB7CisgICAgICBWRVJJRlkobm9uemVyb2Nvb3Jkc1tqXSA9PSBpdC5pbmRleCgpKTsKICAgICAgIFZFUklGWV9JU19FUVVBTChpdC52YWx1ZSgpLCB2MS5jb2VmZihpdC5pbmRleCgpKSk7CiAgICAgICBWRVJJRllfSVNfRVFVQUwoaXQudmFsdWUoKSwgcmVmVjEuY29lZmYoaXQuaW5kZXgoKSkpOwogICAgIH0KICAgfQogICBWRVJJRllfSVNfQVBQUk9YKHYxLCByZWZWMSk7Ci0gIAorCiAgIC8vIHRlc3QgY29lZmZSZWYgd2l0aCByZWFsbG9jYXRpb24KICAgewogICAgIFNwYXJzZVZlY3RvclR5cGUgdjQocm93cyk7CiAgICAgRGVuc2VWZWN0b3IgdjUgPSBEZW5zZVZlY3Rvcjo6WmVybyhyb3dzKTsKLSAgICBmb3IoaW50IGs9MDsgazxyb3dzOyArK2spCi0gICAgewotICAgICAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxyb3dzLTEpOworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcm93czsgKytrKSB7CisgICAgICBpbnQgaSA9IGludGVybmFsOjpyYW5kb208aW50PigwLCByb3dzIC0gMSk7CiAgICAgICBTY2FsYXIgdiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwogICAgICAgdjQuY29lZmZSZWYoaSkgKz0gdjsKICAgICAgIHY1LmNvZWZmUmVmKGkpICs9IHY7CiAgICAgfQotICAgIFZFUklGWV9JU19BUFBST1godjQsdjUpOworICAgIFZFUklGWV9JU19BUFBST1godjQsIHY1KTsKICAgfQogCiAgIHYxLmNvZWZmUmVmKG5vbnplcm9jb29yZHNbMF0pID0gU2NhbGFyKDUpOwogICByZWZWMS5jb2VmZlJlZihub256ZXJvY29vcmRzWzBdKSA9IFNjYWxhcig1KTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2MSwgcmVmVjEpOwogCi0gIFZFUklGWV9JU19BUFBST1godjErdjIsIHJlZlYxK3JlZlYyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh2MSt2Mit2MywgcmVmVjErcmVmVjIrcmVmVjMpOworICBWRVJJRllfSVNfQVBQUk9YKHYxICsgdjIsIHJlZlYxICsgcmVmVjIpOworICBWRVJJRllfSVNfQVBQUk9YKHYxICsgdjIgKyB2MywgcmVmVjEgKyByZWZWMiArIHJlZlYzKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKHYxKnMxLXYyLCByZWZWMSpzMS1yZWZWMik7CisgIFZFUklGWV9JU19BUFBST1godjEgKiBzMSAtIHYyLCByZWZWMSAqIHMxIC0gcmVmVjIpOwogCi0gIFZFUklGWV9JU19BUFBST1godjEqPXMxLCByZWZWMSo9czEpOwotICBWRVJJRllfSVNfQVBQUk9YKHYxLz1zMSwgcmVmVjEvPXMxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MSAqPSBzMSwgcmVmVjEgKj0gczEpOworICBWRVJJRllfSVNfQVBQUk9YKHYxIC89IHMxLCByZWZWMSAvPSBzMSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWCh2MSs9djIsIHJlZlYxKz1yZWZWMik7Ci0gIFZFUklGWV9JU19BUFBST1godjEtPXYyLCByZWZWMS09cmVmVjIpOworICBWRVJJRllfSVNfQVBQUk9YKHYxICs9IHYyLCByZWZWMSArPSByZWZWMik7CisgIFZFUklGWV9JU19BUFBST1godjEgLT0gdjIsIHJlZlYxIC09IHJlZlYyKTsKIAogICBWRVJJRllfSVNfQVBQUk9YKHYxLmRvdCh2MiksIHJlZlYxLmRvdChyZWZWMikpOwogICBWRVJJRllfSVNfQVBQUk9YKHYxLmRvdChyZWZWMiksIHJlZlYxLmRvdChyZWZWMikpOwogCi0gIFZFUklGWV9JU19BUFBST1gobTEqdjIsIHJlZk0xKnJlZlYyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh2MS5kb3QobTEqdjIpLCByZWZWMS5kb3QocmVmTTEqcmVmVjIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMSAqIHYyLCByZWZNMSAqIHJlZlYyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2MS5kb3QobTEgKiB2MiksIHJlZlYxLmRvdChyZWZNMSAqIHJlZlYyKSk7CiAgIHsKLSAgICBpbnQgaSA9IGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSk7CisgICAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgcm93cyAtIDEpOwogICAgIFZFUklGWV9JU19BUFBST1godjEuZG90KG0xLmNvbChpKSksIHJlZlYxLmRvdChyZWZNMS5jb2woaSkpKTsKICAgfQogCi0KICAgVkVSSUZZX0lTX0FQUFJPWCh2MS5zcXVhcmVkTm9ybSgpLCByZWZWMS5zcXVhcmVkTm9ybSgpKTsKLSAgCisKICAgVkVSSUZZX0lTX0FQUFJPWCh2MS5ibHVlTm9ybSgpLCByZWZWMS5ibHVlTm9ybSgpKTsKIAogICAvLyB0ZXN0IGFsaWFzaW5nCiAgIFZFUklGWV9JU19BUFBST1goKHYxID0gLXYxKSwgKHJlZlYxID0gLXJlZlYxKSk7CiAgIFZFUklGWV9JU19BUFBST1goKHYxID0gdjEudHJhbnNwb3NlKCkpLCAocmVmVjEgPSByZWZWMS50cmFuc3Bvc2UoKS5ldmFsKCkpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCgodjEgKz0gLXYxKSwgKHJlZlYxICs9IC1yZWZWMSkpOwotICAKKwogICAvLyBzcGFyc2UgbWF0cml4IHRvIHNwYXJzZSB2ZWN0b3IKICAgU3BhcnNlTWF0cml4VHlwZSBtdjE7Ci0gIFZFUklGWV9JU19BUFBST1goKG12MT12MSksdjEpOwotICBWRVJJRllfSVNfQVBQUk9YKG12MSwodjE9bXYxKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobXYxLCh2MT1tdjEudHJhbnNwb3NlKCkpKTsKLSAgCisgIFZFUklGWV9JU19BUFBST1goKG12MSA9IHYxKSwgdjEpOworICBWRVJJRllfSVNfQVBQUk9YKG12MSwgKHYxID0gbXYxKSk7CisgIFZFUklGWV9JU19BUFBST1gobXYxLCAodjEgPSBtdjEudHJhbnNwb3NlKCkpKTsKKwogICAvLyBjaGVjayBjb3B5IHRvIGRlbnNlIHZlY3RvciB3aXRoIHRyYW5zcG9zZQogICByZWZWMy5yZXNpemUoMCk7Ci0gIFZFUklGWV9JU19BUFBST1gocmVmVjMgPSB2MS50cmFuc3Bvc2UoKSx2MS50b0RlbnNlKCkpOyAKLSAgVkVSSUZZX0lTX0FQUFJPWChEZW5zZVZlY3Rvcih2MSksdjEudG9EZW5zZSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZWZWMyA9IHYxLnRyYW5zcG9zZSgpLCB2MS50b0RlbnNlKCkpOworICBWRVJJRllfSVNfQVBQUk9YKERlbnNlVmVjdG9yKHYxKSwgdjEudG9EZW5zZSgpKTsKIAogICAvLyB0ZXN0IGNvbnNlcnZhdGl2ZSByZXNpemUKICAgewogICAgIHN0ZDo6dmVjdG9yPFN0b3JhZ2VJbmRleD4gaW5jOwotICAgIGlmKHJvd3MgPiAzKQotICAgICAgaW5jLnB1c2hfYmFjaygtMyk7CisgICAgaWYgKHJvd3MgPiAzKSBpbmMucHVzaF9iYWNrKC0zKTsKICAgICBpbmMucHVzaF9iYWNrKDApOwogICAgIGluYy5wdXNoX2JhY2soMyk7CiAgICAgaW5jLnB1c2hfYmFjaygxKTsKICAgICBpbmMucHVzaF9iYWNrKDEwKTsKIAotICAgIGZvcihzdGQ6OnNpemVfdCBpID0gMDsgaTwgaW5jLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGluYy5zaXplKCk7IGkrKykgewogICAgICAgU3RvcmFnZUluZGV4IGluY1Jvd3MgPSBpbmNbaV07CiAgICAgICBTcGFyc2VWZWN0b3JUeXBlIHZlYzEocm93cyk7CiAgICAgICBEZW5zZVZlY3RvciByZWZWZWMxID0gRGVuc2VWZWN0b3I6Olplcm8ocm93cyk7CiAgICAgICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eVZlYywgcmVmVmVjMSwgdmVjMSk7CiAKLSAgICAgIHZlYzEuY29uc2VydmF0aXZlUmVzaXplKHJvd3MraW5jUm93cyk7Ci0gICAgICByZWZWZWMxLmNvbnNlcnZhdGl2ZVJlc2l6ZShyb3dzK2luY1Jvd3MpOworICAgICAgdmVjMS5jb25zZXJ2YXRpdmVSZXNpemUocm93cyArIGluY1Jvd3MpOworICAgICAgcmVmVmVjMS5jb25zZXJ2YXRpdmVSZXNpemUocm93cyArIGluY1Jvd3MpOwogICAgICAgaWYgKGluY1Jvd3MgPiAwKSByZWZWZWMxLnRhaWwoaW5jUm93cykuc2V0WmVybygpOwogCiAgICAgICBWRVJJRllfSVNfQVBQUk9YKHZlYzEsIHJlZlZlYzEpOwogCiAgICAgICAvLyBJbnNlcnQgbmV3IHZhbHVlcwotICAgICAgaWYgKGluY1Jvd3MgPiAwKQotICAgICAgICB2ZWMxLmluc2VydCh2ZWMxLnJvd3MoKS0xKSA9IHJlZlZlYzEocmVmVmVjMS5yb3dzKCktMSkgPSAxOworICAgICAgaWYgKGluY1Jvd3MgPiAwKSB2ZWMxLmluc2VydCh2ZWMxLnJvd3MoKSAtIDEpID0gcmVmVmVjMShyZWZWZWMxLnJvd3MoKSAtIDEpID0gMTsKIAogICAgICAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMxLCByZWZWZWMxKTsKICAgICB9CiAgIH0KIAogICAvLyB0ZXN0IHNvcnQKLSAgaWYocm93cyA+IDEpCi0gIHsKKyAgaWYgKHJvd3MgPiAxKSB7CiAgICAgU3BhcnNlVmVjdG9yVHlwZSB2ZWMxKHJvd3MpOwogICAgIERlbnNlVmVjdG9yIHJlZlZlYzEgPSBEZW5zZVZlY3Rvcjo6WmVybyhyb3dzKTsKICAgICBEZW5zZUluZGV4VmVjdG9yIGlubmVySW5kaWNlcyhyb3dzKTsKQEAgLTE1NSwxMiArMTQ2LDExIEBACiAgICAgc3RkOjptdDE5OTM3IGcocmQoKSk7CiAgICAgc3RkOjpzaHVmZmxlKGlubmVySW5kaWNlcy5iZWdpbigpLCBpbm5lckluZGljZXMuZW5kKCksIGcpOwogICAgIEluZGV4IG56ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMiwgcm93cyAvIDIpOwotICAgIGZvciAoSW5kZXggayA9IDA7IGsgPCBuejsgaysrKQotICAgIHsKLSAgICAgICAgSW5kZXggaSA9IGlubmVySW5kaWNlc1trXTsKLSAgICAgICAgU2NhbGFyIHZhbCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwotICAgICAgICByZWZWZWMxLmNvZWZmUmVmKGkpID0gdmFsOwotICAgICAgICB2ZWMxLmluc2VydChpKSA9IHZhbDsKKyAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgbno7IGsrKykgeworICAgICAgSW5kZXggaSA9IGlubmVySW5kaWNlc1trXTsKKyAgICAgIFNjYWxhciB2YWwgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgICAgIHJlZlZlYzEuY29lZmZSZWYoaSkgPSB2YWw7CisgICAgICB2ZWMxLmluc2VydChpKSA9IHZhbDsKICAgICB9CiAKICAgICB2ZWMxLnRlbXBsYXRlIHNvcnRJbm5lckluZGljZXM8c3RkOjpncmVhdGVyPD4+KCk7CkBAIC0xNzIsNDkgKzE2Miw0NyBAQAogICAgIFZFUklGWV9JU19FUVVBTCh2ZWMxLnRlbXBsYXRlIGlubmVySW5kaWNlc0FyZVNvcnRlZDxzdGQ6OmdyZWF0ZXI8Pj4oKSwgMCk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHZlYzEudGVtcGxhdGUgaW5uZXJJbmRpY2VzQXJlU29ydGVkPHN0ZDo6bGVzczw+PigpLCAxKTsKICAgfQotCiB9CiB2b2lkIHRlc3RfcHJ1bmluZygpIHsKLSAgICB1c2luZyBTcGFyc2VWZWN0b3JUeXBlID0gU3BhcnNlVmVjdG9yPGRvdWJsZSwgMCwgaW50PjsKKyAgdXNpbmcgU3BhcnNlVmVjdG9yVHlwZSA9IFNwYXJzZVZlY3Rvcjxkb3VibGUsIDAsIGludD47CiAKLSAgICBTcGFyc2VWZWN0b3JUeXBlIHZlYzsKLSAgICBhdXRvIGluaXRfdmVjID0gWyZdKCl7OwotICAgICAgICB2ZWMucmVzaXplKDEwKTsKLSAgICAgICAgdmVjLmluc2VydCgzKSA9IDAuMTsKLSAgICAgICAgdmVjLmluc2VydCg1KSA9IDEuMDsKLSAgICAgICAgdmVjLmluc2VydCg4KSA9IC0wLjE7Ci0gICAgICAgIHZlYy5pbnNlcnQoOSkgPSAtMC4yOwotICAgIH07Ci0gICAgaW5pdF92ZWMoKTsKKyAgU3BhcnNlVmVjdG9yVHlwZSB2ZWM7CisgIGF1dG8gaW5pdF92ZWMgPSBbJl0oKSB7CisgICAgOworICAgIHZlYy5yZXNpemUoMTApOworICAgIHZlYy5pbnNlcnQoMykgPSAwLjE7CisgICAgdmVjLmluc2VydCg1KSA9IDEuMDsKKyAgICB2ZWMuaW5zZXJ0KDgpID0gLTAuMTsKKyAgICB2ZWMuaW5zZXJ0KDkpID0gLTAuMjsKKyAgfTsKKyAgaW5pdF92ZWMoKTsKIAotICAgIFZFUklGWV9JU19FUVVBTCh2ZWMubm9uWmVyb3MoKSwgNCk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHZlYy5wcnVuZSgwLjEsIDEuMCksIDIpOwotICAgIFZFUklGWV9JU19FUVVBTCh2ZWMubm9uWmVyb3MoKSwgMik7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHZlYy5jb2VmZig1KSwgMS4wKTsKLSAgICBWRVJJRllfSVNfRVFVQUwodmVjLmNvZWZmKDkpLCAtMC4yKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYy5ub25aZXJvcygpLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHZlYy5wcnVuZSgwLjEsIDEuMCksIDIpOworICBWRVJJRllfSVNfRVFVQUwodmVjLm5vblplcm9zKCksIDIpOworICBWRVJJRllfSVNfRVFVQUwodmVjLmNvZWZmKDUpLCAxLjApOworICBWRVJJRllfSVNfRVFVQUwodmVjLmNvZWZmKDkpLCAtMC4yKTsKIAotICAgIGluaXRfdmVjKCk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHZlYy5wcnVuZShbXShkb3VibGUgdikgeyByZXR1cm4gdiA+PSAwOyB9KSwgMik7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHZlYy5ub25aZXJvcygpLCAyKTsKLSAgICBWRVJJRllfSVNfRVFVQUwodmVjLmNvZWZmKDMpLCAwLjEpOwotICAgIFZFUklGWV9JU19FUVVBTCh2ZWMuY29lZmYoNSksIDEuMCk7CisgIGluaXRfdmVjKCk7CisgIFZFUklGWV9JU19FUVVBTCh2ZWMucHJ1bmUoW10oZG91YmxlIHYpIHsgcmV0dXJuIHYgPj0gMDsgfSksIDIpOworICBWRVJJRllfSVNfRVFVQUwodmVjLm5vblplcm9zKCksIDIpOworICBWRVJJRllfSVNfRVFVQUwodmVjLmNvZWZmKDMpLCAwLjEpOworICBWRVJJRllfSVNfRVFVQUwodmVjLmNvZWZmKDUpLCAxLjApOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1Qoc3BhcnNlX3ZlY3RvcikKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBpbnQgciA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSw1MDApLCBjID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDUwMCk7Ci0gICAgaWYoRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigwLDQpID09IDApIHsKLSAgICAgIHIgPSBjOyAvLyBjaGVjayBzcXVhcmUgbWF0cmljZXMgaW4gMjUlIG9mIHRyaWVzCitFSUdFTl9ERUNMQVJFX1RFU1Qoc3BhcnNlX3ZlY3RvcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBpbnQgciA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgNTAwKSwgYyA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgNTAwKTsKKyAgICBpZiAoRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigwLCA0KSA9PSAwKSB7CisgICAgICByID0gYzsgIC8vIGNoZWNrIHNxdWFyZSBtYXRyaWNlcyBpbiAyNSUgb2YgdHJpZXMKICAgICB9Ci0gICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHIrYyk7CisgICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHIgKyBjKTsKIAotICAgIENBTExfU1VCVEVTVF8xKCggc3BhcnNlX3ZlY3Rvcjxkb3VibGUsaW50Pig4LCA4KSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMigoIHNwYXJzZV92ZWN0b3I8c3RkOjpjb21wbGV4PGRvdWJsZT4sIGludD4ociwgYykgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoKCBzcGFyc2VfdmVjdG9yPGRvdWJsZSxsb25nIGludD4ociwgYykgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoKCBzcGFyc2VfdmVjdG9yPGRvdWJsZSxzaG9ydD4ociwgYykgKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoKHNwYXJzZV92ZWN0b3I8ZG91YmxlLCBpbnQ+KDgsIDgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoKHNwYXJzZV92ZWN0b3I8c3RkOjpjb21wbGV4PGRvdWJsZT4sIGludD4ociwgYykpKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgoc3BhcnNlX3ZlY3Rvcjxkb3VibGUsIGxvbmcgaW50PihyLCBjKSkpOworICAgIENBTExfU1VCVEVTVF8xKChzcGFyc2VfdmVjdG9yPGRvdWJsZSwgc2hvcnQ+KHIsIGMpKSk7CiAgIH0KIAogICBDQUxMX1NVQlRFU1RfMSh0ZXN0X3BydW5pbmcoKSk7CiB9Ci0KZGlmZiAtLWdpdCBhL3Rlc3Qvc3BhcnNlbHUuY3BwIGIvdGVzdC9zcGFyc2VsdS5jcHAKaW5kZXggMGY5ZDI1Zi4uZDkzMzEzNiAxMDA2NDQKLS0tIGEvdGVzdC9zcGFyc2VsdS5jcHAKKysrIGIvdGVzdC9zcGFyc2VsdS5jcHAKQEAgLTE4LDI3ICsxOCwyNiBAQAogI2luY2x1ZGUgInNwYXJzZV9zb2x2ZXIuaCIKICNpbmNsdWRlIDxFaWdlbi9TcGFyc2VMVT4KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0X3NwYXJzZWx1X1QoKQotewotICBTcGFyc2VMVTxTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+IC8qLCBDT0xBTURPcmRlcmluZzxpbnQ+Ki8gPiBzcGFyc2VsdV9jb2xhbWQ7IC8vIENPTEFNRE9yZGVyaW5nIGlzIHRoZSBkZWZhdWx0Ci0gIFNwYXJzZUxVPFNwYXJzZU1hdHJpeDxULCBDb2xNYWpvcj4sIEFNRE9yZGVyaW5nPGludD4gPiBzcGFyc2VsdV9hbWQ7IAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3Rfc3BhcnNlbHVfVCgpIHsKKyAgU3BhcnNlTFU8U3BhcnNlTWF0cml4PFQsIENvbE1ham9yPiAvKiwgQ09MQU1ET3JkZXJpbmc8aW50PiovPiBzcGFyc2VsdV9jb2xhbWQ7ICAvLyBDT0xBTURPcmRlcmluZyBpcyB0aGUgZGVmYXVsdAorICBTcGFyc2VMVTxTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3I+LCBBTURPcmRlcmluZzxpbnQ+ID4gc3BhcnNlbHVfYW1kOwogICBTcGFyc2VMVTxTcGFyc2VNYXRyaXg8VCwgQ29sTWFqb3IsIGxvbmcgaW50PiwgTmF0dXJhbE9yZGVyaW5nPGxvbmcgaW50PiA+IHNwYXJzZWx1X25hdHVyYWw7Ci0gIAotICBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoc3BhcnNlbHVfY29sYW1kLCAgMzAwLCAxMDAwMDAsIHRydWUpOyAKLSAgY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKHNwYXJzZWx1X2FtZCwgICAgIDMwMCwgIDEwMDAwLCB0cnVlKTsKLSAgY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKHNwYXJzZWx1X25hdHVyYWwsIDMwMCwgICAyMDAwLCB0cnVlKTsKLSAgCisKKyAgY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKHNwYXJzZWx1X2NvbGFtZCwgMzAwLCAxMDAwMDAsIHRydWUpOworICBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoc3BhcnNlbHVfYW1kLCAzMDAsIDEwMDAwLCB0cnVlKTsKKyAgY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKHNwYXJzZWx1X25hdHVyYWwsIDMwMCwgMjAwMCwgdHJ1ZSk7CisKICAgY2hlY2tfc3BhcnNlX3NxdWFyZV9hYnNfZGV0ZXJtaW5hbnQoc3BhcnNlbHVfY29sYW1kKTsKICAgY2hlY2tfc3BhcnNlX3NxdWFyZV9hYnNfZGV0ZXJtaW5hbnQoc3BhcnNlbHVfYW1kKTsKLSAgCisKICAgY2hlY2tfc3BhcnNlX3NxdWFyZV9kZXRlcm1pbmFudChzcGFyc2VsdV9jb2xhbWQpOwogICBjaGVja19zcGFyc2Vfc3F1YXJlX2RldGVybWluYW50KHNwYXJzZWx1X2FtZCk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChzcGFyc2VsdSkKLXsKLSAgQ0FMTF9TVUJURVNUXzEodGVzdF9zcGFyc2VsdV9UPGZsb2F0PigpKTsgCitFSUdFTl9ERUNMQVJFX1RFU1Qoc3BhcnNlbHUpIHsKKyAgQ0FMTF9TVUJURVNUXzEodGVzdF9zcGFyc2VsdV9UPGZsb2F0PigpKTsKICAgQ0FMTF9TVUJURVNUXzIodGVzdF9zcGFyc2VsdV9UPGRvdWJsZT4oKSk7Ci0gIENBTExfU1VCVEVTVF8zKHRlc3Rfc3BhcnNlbHVfVDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7IAorICBDQUxMX1NVQlRFU1RfMyh0ZXN0X3NwYXJzZWx1X1Q8c3RkOjpjb21wbGV4PGZsb2F0PiA+KCkpOwogICBDQUxMX1NVQlRFU1RfNCh0ZXN0X3NwYXJzZWx1X1Q8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3Qvc3BhcnNlcXIuY3BwIGIvdGVzdC9zcGFyc2Vxci5jcHAKaW5kZXggMzU3NmNjNi4uNTFlZDM5OCAxMDA2NDQKLS0tIGEvdGVzdC9zcGFyc2Vxci5jcHAKKysrIGIvdGVzdC9zcGFyc2Vxci5jcHAKQEAgLTksNTAgKzksNDggQEAKICNpbmNsdWRlICJzcGFyc2UuaCIKICNpbmNsdWRlIDxFaWdlbi9TcGFyc2VRUj4KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSx0eXBlbmFtZSBEZW5zZU1hdD4KLWludCBnZW5lcmF0ZV9zcGFyc2VfcmVjdGFuZ3VsYXJfcHJvYmxlbShNYXRyaXhUeXBlJiBBLCBEZW5zZU1hdCYgZEEsIGludCBtYXhSb3dzID0gMzAwLCBpbnQgbWF4Q29scyA9IDE1MCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBEZW5zZU1hdD4KK2ludCBnZW5lcmF0ZV9zcGFyc2VfcmVjdGFuZ3VsYXJfcHJvYmxlbShNYXRyaXhUeXBlJiBBLCBEZW5zZU1hdCYgZEEsIGludCBtYXhSb3dzID0gMzAwLCBpbnQgbWF4Q29scyA9IDE1MCkgewogICBlaWdlbl9hc3NlcnQobWF4Um93cyA+PSBtYXhDb2xzKTsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwotICBpbnQgcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxLG1heFJvd3MpOwotICBpbnQgY29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLG1heENvbHMpOwotICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKHJvd3MqY29scyksIDAuMDEpOwotICAKLSAgQS5yZXNpemUocm93cyxjb2xzKTsKLSAgZEEucmVzaXplKHJvd3MsY29scyk7Ci0gIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCBkQSwgQSxGb3JjZU5vblplcm9EaWFnKTsKKyAgaW50IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4Um93cyk7CisgIGludCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIG1heENvbHMpOworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4gLyAocm93cyAqIGNvbHMpLCAwLjAxKTsKKworICBBLnJlc2l6ZShyb3dzLCBjb2xzKTsKKyAgZEEucmVzaXplKHJvd3MsIGNvbHMpOworICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgZEEsIEEsIEZvcmNlTm9uWmVyb0RpYWcpOwogICBBLm1ha2VDb21wcmVzc2VkKCk7Ci0gIGludCBub3AgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KDAsMSkgPiAwLjUgPyBjb2xzLzIgOiAwKTsKLSAgZm9yKGludCBrPTA7IGs8bm9wOyArK2spCi0gIHsKLSAgICBpbnQgajAgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxjb2xzLTEpOwotICAgIGludCBqMSA9IGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSk7CisgIGludCBub3AgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KDAsIDEpID4gMC41ID8gY29scyAvIDIgOiAwKTsKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBub3A7ICsraykgeworICAgIGludCBqMCA9IGludGVybmFsOjpyYW5kb208aW50PigwLCBjb2xzIC0gMSk7CisgICAgaW50IGoxID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIGNvbHMgLSAxKTsKICAgICBTY2FsYXIgcyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwotICAgIEEuY29sKGowKSAgPSBzICogQS5jb2woajEpOworICAgIEEuY29sKGowKSA9IHMgKiBBLmNvbChqMSk7CiAgICAgZEEuY29sKGowKSA9IHMgKiBkQS5jb2woajEpOwogICB9Ci0gIAotLy8gICBpZihyb3dzPGNvbHMpIHsKLS8vICAgICBBLmNvbnNlcnZhdGl2ZVJlc2l6ZShjb2xzLGNvbHMpOwotLy8gICAgIGRBLmNvbnNlcnZhdGl2ZVJlc2l6ZShjb2xzLGNvbHMpOwotLy8gICAgIGRBLmJvdHRvbVJvd3MoY29scy1yb3dzKS5zZXRaZXJvKCk7Ci0vLyAgIH0KLSAgCisKKyAgLy8gICBpZihyb3dzPGNvbHMpIHsKKyAgLy8gICAgIEEuY29uc2VydmF0aXZlUmVzaXplKGNvbHMsY29scyk7CisgIC8vICAgICBkQS5jb25zZXJ2YXRpdmVSZXNpemUoY29scyxjb2xzKTsKKyAgLy8gICAgIGRBLmJvdHRvbVJvd3MoY29scy1yb3dzKS5zZXRaZXJvKCk7CisgIC8vICAgfQorCiAgIHJldHVybiByb3dzOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgdGVzdF9zcGFyc2Vxcl9zY2FsYXIoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgdGVzdF9zcGFyc2Vxcl9zY2FsYXIoKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKLSAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyLENvbE1ham9yPiBNYXRyaXhUeXBlOyAKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gRGVuc2VNYXQ7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IERlbnNlVmVjdG9yOworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsIENvbE1ham9yPiBNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IERlbnNlTWF0OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IERlbnNlVmVjdG9yOwogICBNYXRyaXhUeXBlIEE7CiAgIERlbnNlTWF0IGRBOwotICBEZW5zZVZlY3RvciByZWZYLHgsYjsgCi0gIFNwYXJzZVFSPE1hdHJpeFR5cGUsIENPTEFNRE9yZGVyaW5nPGludD4gPiBzb2x2ZXI7IAotICBnZW5lcmF0ZV9zcGFyc2VfcmVjdGFuZ3VsYXJfcHJvYmxlbShBLGRBKTsKLSAgCisgIERlbnNlVmVjdG9yIHJlZlgsIHgsIGI7CisgIFNwYXJzZVFSPE1hdHJpeFR5cGUsIENPTEFNRE9yZGVyaW5nPGludD4gPiBzb2x2ZXI7CisgIGdlbmVyYXRlX3NwYXJzZV9yZWN0YW5ndWxhcl9wcm9ibGVtKEEsIGRBKTsKKwogICBiID0gZEEgKiBEZW5zZVZlY3Rvcjo6UmFuZG9tKEEuY29scygpKTsKICAgc29sdmVyLmNvbXB1dGUoQSk7CiAKQEAgLTY1LDI5ICs2MywyNSBAQAogICBWRVJJRllfSVNfRVFVQUwoc29sdmVyLm1hdHJpeFIoKS5jb2xzKCksIEEuY29scygpKTsKIAogICAvLyBRIGFuZCBSIGNhbiBiZSBtdWx0aXBsaWVkCi0gIERlbnNlTWF0IHJlY292ZXJlZEEgPSBzb2x2ZXIubWF0cml4USgpCi0gICAgICAgICAgICAgICAgICAgICAgKiBEZW5zZU1hdChzb2x2ZXIubWF0cml4UigpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKQotICAgICAgICAgICAgICAgICAgICAgICogc29sdmVyLmNvbHNQZXJtdXRhdGlvbigpLnRyYW5zcG9zZSgpOworICBEZW5zZU1hdCByZWNvdmVyZWRBID0gc29sdmVyLm1hdHJpeFEoKSAqIERlbnNlTWF0KHNvbHZlci5tYXRyaXhSKCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvbHZlci5jb2xzUGVybXV0YXRpb24oKS50cmFuc3Bvc2UoKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlY292ZXJlZEEucm93cygpLCBBLnJvd3MoKSk7CiAgIFZFUklGWV9JU19FUVVBTChyZWNvdmVyZWRBLmNvbHMoKSwgQS5jb2xzKCkpOwogCiAgIC8vIGFuZCBpbiB0aGUgZnVsbCByYW5rIGNhc2UgdGhlIG9yaWdpbmFsIG1hdHJpeCBpcyByZWNvdmVyZWQKLSAgaWYgKHNvbHZlci5yYW5rKCkgPT0gQS5jb2xzKCkpCi0gIHsKLSAgICAgIFZFUklGWV9JU19BUFBST1goQSwgcmVjb3ZlcmVkQSk7CisgIGlmIChzb2x2ZXIucmFuaygpID09IEEuY29scygpKSB7CisgICAgVkVSSUZZX0lTX0FQUFJPWChBLCByZWNvdmVyZWRBKTsKICAgfQogCi0gIGlmKGludGVybmFsOjpyYW5kb208ZmxvYXQ+KDAsMSk+MC41ZikKKyAgaWYgKGludGVybmFsOjpyYW5kb208ZmxvYXQ+KDAsIDEpID4gMC41ZikKICAgICBzb2x2ZXIuZmFjdG9yaXplKEEpOyAgLy8gdGhpcyBjaGVja3MgdGhhdCBjYWxsaW5nIGFuYWx5emVQYXR0ZXJuIGlzIG5vdCBuZWVkZWQgaWYgdGhlIHBhdHRlcm4gZG8gbm90IGNoYW5nZS4KLSAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykKLSAgeworICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKSB7CiAgICAgc3RkOjpjZXJyIDw8ICJzcGFyc2UgUVIgZmFjdG9yaXphdGlvbiBmYWlsZWRcbiI7CiAgICAgZXhpdCgwKTsKICAgICByZXR1cm47CiAgIH0KICAgeCA9IHNvbHZlci5zb2x2ZShiKTsKLSAgaWYgKHNvbHZlci5pbmZvKCkgIT0gU3VjY2VzcykKLSAgeworICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKSB7CiAgICAgc3RkOjpjZXJyIDw8ICJzcGFyc2UgUVIgZmFjdG9yaXphdGlvbiBmYWlsZWRcbiI7CiAgICAgZXhpdCgwKTsKICAgICByZXR1cm47CkBAIC05NiwxNSArOTAsMTQgQEAKICAgLy8gQ29tcGFyZSB3aXRoIGEgZGVuc2UgUVIgc29sdmVyCiAgIENvbFBpdkhvdXNlaG9sZGVyUVI8RGVuc2VNYXQ+IGRxcihkQSk7CiAgIHJlZlggPSBkcXIuc29sdmUoYik7Ci0gIAotICBib29sIHJhbmtfZGVmaWNpZW50ID0gQS5jb2xzKCk+QS5yb3dzKCkgfHwgZHFyLnJhbmsoKTxBLmNvbHMoKTsKLSAgaWYocmFua19kZWZpY2llbnQpCi0gIHsKKworICBib29sIHJhbmtfZGVmaWNpZW50ID0gQS5jb2xzKCkgPiBBLnJvd3MoKSB8fCBkcXIucmFuaygpIDwgQS5jb2xzKCk7CisgIGlmIChyYW5rX2RlZmljaWVudCkgewogICAgIC8vIHJhbmsgZGVmaWNpZW50IHByb2JsZW0gLT4gd2UgbWlnaHQgaGF2ZSB0byBpbmNyZWFzZSB0aGUgdGhyZXNob2xkCiAgICAgLy8gdG8gZ2V0IGEgY29ycmVjdCBzb2x1dGlvbi4KLSAgICBSZWFsU2NhbGFyIHRoID0gUmVhbFNjYWxhcigyMCkqZEEuY29sd2lzZSgpLm5vcm0oKS5tYXhDb2VmZigpKihBLnJvd3MoKStBLmNvbHMoKSkgKiBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKTsKLSAgICBmb3IoSW5kZXggaz0wOyAoazwxNikgJiYgIXRlc3RfaXNBcHByb3goQSp4LGIpOyArK2spCi0gICAgeworICAgIFJlYWxTY2FsYXIgdGggPQorICAgICAgICBSZWFsU2NhbGFyKDIwKSAqIGRBLmNvbHdpc2UoKS5ub3JtKCkubWF4Q29lZmYoKSAqIChBLnJvd3MoKSArIEEuY29scygpKSAqIE51bVRyYWl0czxSZWFsU2NhbGFyPjo6ZXBzaWxvbigpOworICAgIGZvciAoSW5kZXggayA9IDA7IChrIDwgMTYpICYmICF0ZXN0X2lzQXBwcm94KEEgKiB4LCBiKTsgKytrKSB7CiAgICAgICB0aCAqPSBSZWFsU2NhbGFyKDEwKTsKICAgICAgIHNvbHZlci5zZXRQaXZvdFRocmVzaG9sZCh0aCk7CiAgICAgICBzb2x2ZXIuY29tcHV0ZShBKTsKQEAgLTExMywzNyArMTA2LDM1IEBACiAgIH0KIAogICBWRVJJRllfSVNfQVBQUk9YKEEgKiB4LCBiKTsKLSAgCisKICAgLy8gRm9yIHJhbmsgZGVmaWNpZW50IHByb2JsZW0sIHRoZSBlc3RpbWF0ZWQgcmFuayBtaWdodAogICAvLyBiZSBzbGlnaHRseSBvZmYsIHNvIGxldCdzIG9ubHkgcmFpc2UgYSB3YXJuaW5nIGluIHN1Y2ggY2FzZXMuCi0gIGlmKHJhbmtfZGVmaWNpZW50KSArK2dfdGVzdF9sZXZlbDsKKyAgaWYgKHJhbmtfZGVmaWNpZW50KSArK2dfdGVzdF9sZXZlbDsKICAgVkVSSUZZX0lTX0VRVUFMKHNvbHZlci5yYW5rKCksIGRxci5yYW5rKCkpOwotICBpZihyYW5rX2RlZmljaWVudCkgLS1nX3Rlc3RfbGV2ZWw7CisgIGlmIChyYW5rX2RlZmljaWVudCkgLS1nX3Rlc3RfbGV2ZWw7CiAKLSAgaWYoc29sdmVyLnJhbmsoKT09QS5jb2xzKCkpIC8vIGZ1bGwgcmFuaworICBpZiAoc29sdmVyLnJhbmsoKSA9PSBBLmNvbHMoKSkgIC8vIGZ1bGwgcmFuawogICAgIFZFUklGWV9JU19BUFBST1goeCwgcmVmWCk7Ci0vLyAgIGVsc2UKLS8vICAgICBWRVJJRlkoKGRBICogcmVmWCAtIGIpLm5vcm0oKSAqIDIgPiAoQSAqIHggLSBiKS5ub3JtKCkgKTsKKyAgLy8gICBlbHNlCisgIC8vICAgICBWRVJJRlkoKGRBICogcmVmWCAtIGIpLm5vcm0oKSAqIDIgPiAoQSAqIHggLSBiKS5ub3JtKCkgKTsKIAogICAvLyBDb21wdXRlIGV4cGxpY2l0bHkgdGhlIG1hdHJpeCBRCiAgIE1hdHJpeFR5cGUgUSwgUXRRLCBpZE07CiAgIFEgPSBzb2x2ZXIubWF0cml4USgpOwotICAvL0NoZWNrICB8fFEnICogUSAtIEkgfHwKKyAgLy8gQ2hlY2sgIHx8UScgKiBRIC0gSSB8fAogICBRdFEgPSBRICogUS5hZGpvaW50KCk7Ci0gIGlkTS5yZXNpemUoUS5yb3dzKCksIFEucm93cygpKTsgaWRNLnNldElkZW50aXR5KCk7CisgIGlkTS5yZXNpemUoUS5yb3dzKCksIFEucm93cygpKTsKKyAgaWRNLnNldElkZW50aXR5KCk7CiAgIFZFUklGWShpZE0uaXNBcHByb3goUXRRKSk7Ci0gIAorCiAgIC8vIFEgdG8gZGVuc2UKICAgRGVuc2VNYXQgZFE7CiAgIGRRID0gc29sdmVyLm1hdHJpeFEoKTsKICAgVkVSSUZZX0lTX0FQUFJPWChRLCBkUSk7CiB9Ci1FSUdFTl9ERUNMQVJFX1RFU1Qoc3BhcnNlcXIpCi17Ci0gIGZvcihpbnQgaT0wOyBpPGdfcmVwZWF0OyArK2kpCi0gIHsKK0VJR0VOX0RFQ0xBUkVfVEVTVChzcGFyc2VxcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyArK2kpIHsKICAgICBDQUxMX1NVQlRFU1RfMSh0ZXN0X3NwYXJzZXFyX3NjYWxhcjxkb3VibGU+KCkpOwogICAgIENBTExfU1VCVEVTVF8yKHRlc3Rfc3BhcnNlcXJfc2NhbGFyPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CiAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvdGVzdC9zcGVjaWFsX251bWJlcnMuY3BwIGIvdGVzdC9zcGVjaWFsX251bWJlcnMuY3BwCmluZGV4IDFlMWE2MzYuLjk0M2Y2NTAgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3BlY2lhbF9udW1iZXJzLmNwcAorKysgYi90ZXN0L3NwZWNpYWxfbnVtYmVycy5jcHAKQEAgLTksNTAgKzksNDYgQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIHNwZWNpYWxfbnVtYmVycygpCi17Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYyxEeW5hbWljPiBNYXRUeXBlOwotICBpbnQgcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxLDMwMCk7Ci0gIGludCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMzAwKTsKLSAgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBzcGVjaWFsX251bWJlcnMoKSB7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gTWF0VHlwZTsKKyAgaW50IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMzAwKTsKKyAgaW50IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMzAwKTsKKwogICBTY2FsYXIgbmFuID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKICAgU2NhbGFyIGluZiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6aW5maW5pdHkoKTsKICAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7Ci0gIAotICBNYXRUeXBlIG0xICAgID0gTWF0VHlwZTo6UmFuZG9tKHJvd3MsY29scyksCi0gICAgICAgICAgbW5hbiAgPSBNYXRUeXBlOjpSYW5kb20ocm93cyxjb2xzKSwKLSAgICAgICAgICBtaW5mICA9IE1hdFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpLAotICAgICAgICAgIG1ib3RoID0gTWF0VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7Ci0gICAgICAgICAgCi0gIGludCBuID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsMTApOwotICBmb3IoaW50IGs9MDsgazxuOyArK2spCi0gIHsKLSAgICBtbmFuKGludGVybmFsOjpyYW5kb208aW50PigwLHJvd3MtMSksIGludGVybmFsOjpyYW5kb208aW50PigwLGNvbHMtMSkpID0gbmFuOwotICAgIG1pbmYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscm93cy0xKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsY29scy0xKSkgPSBpbmY7CisKKyAgTWF0VHlwZSBtMSA9IE1hdFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbW5hbiA9IE1hdFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbWluZiA9IE1hdFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKKyAgICAgICAgICBtYm90aCA9IE1hdFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKworICBpbnQgbiA9IGludGVybmFsOjpyYW5kb208aW50PigxLCAxMCk7CisgIGZvciAoaW50IGsgPSAwOyBrIDwgbjsgKytrKSB7CisgICAgbW5hbihpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgcm93cyAtIDEpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgY29scyAtIDEpKSA9IG5hbjsKKyAgICBtaW5mKGludGVybmFsOjpyYW5kb208aW50PigwLCByb3dzIC0gMSksIGludGVybmFsOjpyYW5kb208aW50PigwLCBjb2xzIC0gMSkpID0gaW5mOwogICB9CiAgIG1ib3RoID0gbW5hbiArIG1pbmY7Ci0gIAorCiAgIFZFUklGWSghbTEuaGFzTmFOKCkpOwogICBWRVJJRlkobTEuYWxsRmluaXRlKCkpOwotICAKKwogICBWRVJJRlkobW5hbi5oYXNOYU4oKSk7Ci0gIFZFUklGWSgoczEqbW5hbikuaGFzTmFOKCkpOworICBWRVJJRlkoKHMxICogbW5hbikuaGFzTmFOKCkpOwogICBWRVJJRlkoIW1pbmYuaGFzTmFOKCkpOwotICBWRVJJRlkoISgyKm1pbmYpLmhhc05hTigpKTsKKyAgVkVSSUZZKCEoMiAqIG1pbmYpLmhhc05hTigpKTsKICAgVkVSSUZZKG1ib3RoLmhhc05hTigpKTsKICAgVkVSSUZZKG1ib3RoLmFycmF5KCkuaGFzTmFOKCkpOwotICAKKwogICBWRVJJRlkoIW1uYW4uYWxsRmluaXRlKCkpOwogICBWRVJJRlkoIW1pbmYuYWxsRmluaXRlKCkpOwotICBWRVJJRlkoIShtaW5mLW1ib3RoKS5hbGxGaW5pdGUoKSk7CisgIFZFUklGWSghKG1pbmYgLSBtYm90aCkuYWxsRmluaXRlKCkpOwogICBWRVJJRlkoIW1ib3RoLmFsbEZpbml0ZSgpKTsKICAgVkVSSUZZKCFtYm90aC5hcnJheSgpLmFsbEZpbml0ZSgpKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHNwZWNpYWxfbnVtYmVycykKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IDEwKmdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggc3BlY2lhbF9udW1iZXJzPGZsb2F0PigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIHNwZWNpYWxfbnVtYmVyczxkb3VibGU+KCkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChzcGVjaWFsX251bWJlcnMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMCAqIGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMShzcGVjaWFsX251bWJlcnM8ZmxvYXQ+KCkpOworICAgIENBTExfU1VCVEVTVF8xKHNwZWNpYWxfbnVtYmVyczxkb3VibGU+KCkpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3NwbGl0X3Rlc3RfaGVscGVyLmggYi90ZXN0L3NwbGl0X3Rlc3RfaGVscGVyLmgKaW5kZXggODJlODJhYS4uNjNjODA5YyAxMDA2NDQKLS0tIGEvdGVzdC9zcGxpdF90ZXN0X2hlbHBlci5oCisrKyBiL3Rlc3Qvc3BsaXRfdGVzdF9oZWxwZXIuaApAQCAtNTk5MSw0ICs1OTkxLDMgQEAKICNlbHNlCiAjZGVmaW5lIENBTExfU1VCVEVTVF85OTkoRlVOQykKICNlbmRpZgotCmRpZmYgLS1naXQgYS90ZXN0L3NwcXJfc3VwcG9ydC5jcHAgYi90ZXN0L3NwcXJfc3VwcG9ydC5jcHAKaW5kZXggNzljMmMxMi4uY2Q3NTgyNSAxMDA2NDQKLS0tIGEvdGVzdC9zcHFyX3N1cHBvcnQuY3BwCisrKyBiL3Rlc3Qvc3Bxcl9zdXBwb3J0LmNwcApAQCAtMTAsNTUgKzEwLDUwIEBACiAjaW5jbHVkZSAic3BhcnNlLmgiCiAjaW5jbHVkZSA8RWlnZW4vU1BRUlN1cHBvcnQ+CiAKLQotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZSx0eXBlbmFtZSBEZW5zZU1hdD4KLWludCBnZW5lcmF0ZV9zcGFyc2VfcmVjdGFuZ3VsYXJfcHJvYmxlbShNYXRyaXhUeXBlJiBBLCBEZW5zZU1hdCYgZEEsIGludCBtYXhSb3dzID0gMzAwLCBpbnQgbWF4Q29scyA9IDMwMCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBEZW5zZU1hdD4KK2ludCBnZW5lcmF0ZV9zcGFyc2VfcmVjdGFuZ3VsYXJfcHJvYmxlbShNYXRyaXhUeXBlJiBBLCBEZW5zZU1hdCYgZEEsIGludCBtYXhSb3dzID0gMzAwLCBpbnQgbWF4Q29scyA9IDMwMCkgewogICBlaWdlbl9hc3NlcnQobWF4Um93cyA+PSBtYXhDb2xzKTsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwotICBpbnQgcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxLG1heFJvd3MpOwotICBpbnQgY29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxLHJvd3MpOwotICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4vKHJvd3MqY29scyksIDAuMDEpOwotICAKLSAgQS5yZXNpemUocm93cyxjb2xzKTsKLSAgZEEucmVzaXplKHJvd3MsY29scyk7Ci0gIGluaXRTcGFyc2U8U2NhbGFyPihkZW5zaXR5LCBkQSwgQSxGb3JjZU5vblplcm9EaWFnKTsKKyAgaW50IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgbWF4Um93cyk7CisgIGludCBjb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIHJvd3MpOworICBkb3VibGUgZGVuc2l0eSA9IChzdGQ6Om1heCkoOC4gLyAocm93cyAqIGNvbHMpLCAwLjAxKTsKKworICBBLnJlc2l6ZShyb3dzLCBjb2xzKTsKKyAgZEEucmVzaXplKHJvd3MsIGNvbHMpOworICBpbml0U3BhcnNlPFNjYWxhcj4oZGVuc2l0eSwgZEEsIEEsIEZvcmNlTm9uWmVyb0RpYWcpOwogICBBLm1ha2VDb21wcmVzc2VkKCk7CiAgIHJldHVybiByb3dzOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgdGVzdF9zcHFyX3NjYWxhcigpCi17Ci0gIHR5cGVkZWYgU3BhcnNlTWF0cml4PFNjYWxhcixDb2xNYWpvcj4gTWF0cml4VHlwZTsgCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCB0ZXN0X3NwcXJfc2NhbGFyKCkgeworICB0eXBlZGVmIFNwYXJzZU1hdHJpeDxTY2FsYXIsIENvbE1ham9yPiBNYXRyaXhUeXBlOwogICBNYXRyaXhUeXBlIEE7Ci0gIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBkQTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gRGVuc2VWZWN0b3I7Ci0gIERlbnNlVmVjdG9yIHJlZlgseCxiOyAKLSAgU1BRUjxNYXRyaXhUeXBlPiBzb2x2ZXI7IAotICBnZW5lcmF0ZV9zcGFyc2VfcmVjdGFuZ3VsYXJfcHJvYmxlbShBLGRBKTsKLSAgCisgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IGRBOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IERlbnNlVmVjdG9yOworICBEZW5zZVZlY3RvciByZWZYLCB4LCBiOworICBTUFFSPE1hdHJpeFR5cGU+IHNvbHZlcjsKKyAgZ2VuZXJhdGVfc3BhcnNlX3JlY3Rhbmd1bGFyX3Byb2JsZW0oQSwgZEEpOworCiAgIEluZGV4IG0gPSBBLnJvd3MoKTsKICAgYiA9IERlbnNlVmVjdG9yOjpSYW5kb20obSk7CiAgIHNvbHZlci5jb21wdXRlKEEpOwotICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQotICB7CisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpIHsKICAgICBzdGQ6OmNlcnIgPDwgInNwYXJzZSBRUiBmYWN0b3JpemF0aW9uIGZhaWxlZFxuIjsKICAgICBleGl0KDApOwogICAgIHJldHVybjsKICAgfQogICB4ID0gc29sdmVyLnNvbHZlKGIpOwotICBpZiAoc29sdmVyLmluZm8oKSAhPSBTdWNjZXNzKQotICB7CisgIGlmIChzb2x2ZXIuaW5mbygpICE9IFN1Y2Nlc3MpIHsKICAgICBzdGQ6OmNlcnIgPDwgInNwYXJzZSBRUiBmYWN0b3JpemF0aW9uIGZhaWxlZFxuIjsKICAgICBleGl0KDApOwogICAgIHJldHVybjsKLSAgfSAgCi0gIC8vQ29tcGFyZSB3aXRoIGEgZGVuc2Ugc29sdmVyCisgIH0KKyAgLy8gQ29tcGFyZSB3aXRoIGEgZGVuc2Ugc29sdmVyCiAgIHJlZlggPSBkQS5jb2xQaXZIb3VzZWhvbGRlclFyKCkuc29sdmUoYik7Ci0gIFZFUklGWSh4LmlzQXBwcm94KHJlZlgsdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSk7CisgIFZFUklGWSh4LmlzQXBwcm94KHJlZlgsIHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkpOwogfQotRUlHRU5fREVDTEFSRV9URVNUKHNwcXJfc3VwcG9ydCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChzcHFyX3N1cHBvcnQpIHsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9zcHFyX3NjYWxhcjxkb3VibGU+KCkpOwogICBDQUxMX1NVQlRFU1RfMih0ZXN0X3NwcXJfc2NhbGFyPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L3N0YWJsZV9ub3JtLmNwcCBiL3Rlc3Qvc3RhYmxlX25vcm0uY3BwCmluZGV4IGNiOGE4MGMuLjEzMDI4NGEgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3RhYmxlX25vcm0uY3BwCisrKyBiL3Rlc3Qvc3RhYmxlX25vcm0uY3BwCkBAIC05LDIxICs5LDIxIEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IEVJR0VOX0RPTlRfSU5MSU5FIFQgY29weShjb25zdCBUJiB4KQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFSUdFTl9ET05UX0lOTElORSBUIGNvcHkoY29uc3QgVCYgeCkgewogICByZXR1cm4geDsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBzdGFibGVfbm9ybShjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHN0YWJsZV9ub3JtKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgLyogdGhpcyB0ZXN0IGNvdmVycyB0aGUgZm9sbG93aW5nIGZpbGVzOgogICAgICBTdGFibGVOb3JtLmgKICAgKi8KLSAgdXNpbmcgc3RkOjpzcXJ0OwogICB1c2luZyBzdGQ6OmFiczsKKyAgdXNpbmcgc3RkOjpzcXJ0OwogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKLSAgCisKICAgYm9vbCBjb21wbGV4X3JlYWxfcHJvZHVjdF9vayA9IHRydWU7CiAKICAgLy8gQ2hlY2sgdGhlIGJhc2ljIG1hY2hpbmUtZGVwZW5kZW50IGNvbnN0YW50cy4KQEAgLTMxLDE1MSArMzEsMTY1IEBACiAgICAgaW50IGliZXRhLCBpdCwgaWVtaW4sIGllbWF4OwogCiAgICAgaWJldGEgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpyYWRpeDsgICAgICAgICAvLyBiYXNlIGZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzCi0gICAgaXQgICAgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpkaWdpdHM7ICAgICAgICAvLyBudW1iZXIgb2YgYmFzZS1iZXRhIGRpZ2l0cyBpbiBtYW50aXNzYQorICAgIGl0ID0gc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6ZGlnaXRzOyAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJhc2UtYmV0YSBkaWdpdHMgaW4gbWFudGlzc2EKICAgICBpZW1pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbl9leHBvbmVudDsgIC8vIG1pbmltdW0gZXhwb25lbnQKICAgICBpZW1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1heF9leHBvbmVudDsgIC8vIG1heGltdW0gZXhwb25lbnQKIAotICAgIFZFUklGWSggKCEoaWVtaW4gPiAxIC0gMippdCB8fCAxK2l0PmllbWF4IHx8IChpdD09MiAmJiBpYmV0YTw1KSB8fCAoaXQ8PTQgJiYgaWJldGEgPD0gMyApIHx8IGl0PDIpKQotICAgICAgICAgICAmJiAidGhlIHN0YWJsZSBub3JtIGFsZ29yaXRobSBjYW5ub3QgYmUgZ3VhcmFudGVlZCBvbiB0aGlzIGNvbXB1dGVyIik7Ci0gICAgCisgICAgVkVSSUZZKCghKGllbWluID4gMSAtIDIgKiBpdCB8fCAxICsgaXQgPiBpZW1heCB8fCAoaXQgPT0gMiAmJiBpYmV0YSA8IDUpIHx8IChpdCA8PSA0ICYmIGliZXRhIDw9IDMpIHx8IGl0IDwgMikpICYmCisgICAgICAgICAgICJ0aGUgc3RhYmxlIG5vcm0gYWxnb3JpdGhtIGNhbm5vdCBiZSBndWFyYW50ZWVkIG9uIHRoaXMgY29tcHV0ZXIiKTsKKwogICAgIFNjYWxhciBpbmYgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjppbmZpbml0eSgpOwotICAgIGlmKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXggJiYgKG51bWV4dDo6aXNuYW4pKGluZipSZWFsU2NhbGFyKDEpKSApCi0gICAgeworICAgIGlmIChOdW1UcmFpdHM8U2NhbGFyPjo6SXNDb21wbGV4ICYmIChudW1leHQ6OmlzbmFuKShpbmYgKiBSZWFsU2NhbGFyKDEpKSkgewogICAgICAgY29tcGxleF9yZWFsX3Byb2R1Y3Rfb2sgPSBmYWxzZTsKICAgICAgIHN0YXRpYyBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGlmKGZpcnN0KQotICAgICAgICBzdGQ6OmNlcnIgPDwgIldBUk5JTkc6IGNvbXBpbGVyIG1lc3MgdXAgY29tcGxleCpyZWFsIHByb2R1Y3QsICIgPDwgaW5mIDw8ICIgKiAiIDw8IDEuMCA8PCAiID0gIiA8PCBpbmYqUmVhbFNjYWxhcigxKSA8PCBzdGQ6OmVuZGw7CisgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHN0ZDo6Y2VyciA8PCAiV0FSTklORzogY29tcGlsZXIgbWVzcyB1cCBjb21wbGV4KnJlYWwgcHJvZHVjdCwgIiA8PCBpbmYgPDwgIiAqICIgPDwgMS4wIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICA8PCBpbmYgKiBSZWFsU2NhbGFyKDEpIDw8IHN0ZDo6ZW5kbDsKICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgfQogICB9CiAKLQogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKIAogICAvLyBnZXQgYSBub24temVybyByYW5kb20gZmFjdG9yCiAgIFNjYWxhciBmYWN0b3IgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKLSAgd2hpbGUobnVtZXh0OjphYnMyKGZhY3Rvcik8UmVhbFNjYWxhcigxZS00KSkKLSAgICBmYWN0b3IgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgd2hpbGUgKG51bWV4dDo6YWJzMihmYWN0b3IpIDwgUmVhbFNjYWxhcigxZS00KSkgZmFjdG9yID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAgIFNjYWxhciBiaWcgPSBmYWN0b3IgKiAoKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1heCkoKSAqIFJlYWxTY2FsYXIoMWUtNCkpOwotICAKKwogICBmYWN0b3IgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKLSAgd2hpbGUobnVtZXh0OjphYnMyKGZhY3Rvcik8UmVhbFNjYWxhcigxZS00KSkKLSAgICBmYWN0b3IgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgd2hpbGUgKG51bWV4dDo6YWJzMihmYWN0b3IpIDwgUmVhbFNjYWxhcigxZS00KSkgZmFjdG9yID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAgIFNjYWxhciBzbWFsbCA9IGZhY3RvciAqICgoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpICogUmVhbFNjYWxhcigxZTQpKTsKIAogICBTY2FsYXIgb25lKDEpOwogCi0gIE1hdHJpeFR5cGUgIHZ6ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgICAgdnJhbmQgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgIHZiaWcocm93cywgY29scyksCi0gICAgICAgICAgICAgIHZzbWFsbChyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIHZ6ZXJvID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKSwgdnJhbmQgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIHZiaWcocm93cywgY29scyksCisgICAgICAgICAgICAgdnNtYWxsKHJvd3MsIGNvbHMpOwogCiAgIHZiaWcuZmlsbChiaWcpOwogICB2c21hbGwuZmlsbChzbWFsbCk7CiAKICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKHZ6ZXJvLm5vcm0oKSwgc3RhdGljX2Nhc3Q8UmVhbFNjYWxhcj4oMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLnN0YWJsZU5vcm0oKSwgICAgICB2cmFuZC5ub3JtKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLmJsdWVOb3JtKCksICAgICAgICB2cmFuZC5ub3JtKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLmh5cG90Tm9ybSgpLCAgICAgICB2cmFuZC5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLnN0YWJsZU5vcm0oKSwgdnJhbmQubm9ybSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2cmFuZC5ibHVlTm9ybSgpLCB2cmFuZC5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLmh5cG90Tm9ybSgpLCB2cmFuZC5ub3JtKCkpOwogCiAgIC8vIHRlc3Qgd2l0aCBleHByZXNzaW9ucyBhcyBpbnB1dAotICBWRVJJRllfSVNfQVBQUk9YKChvbmUqdnJhbmQpLnN0YWJsZU5vcm0oKSwgICAgICB2cmFuZC5ub3JtKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKChvbmUqdnJhbmQpLmJsdWVOb3JtKCksICAgICAgICB2cmFuZC5ub3JtKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKChvbmUqdnJhbmQpLmh5cG90Tm9ybSgpLCAgICAgICB2cmFuZC5ub3JtKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKChvbmUqdnJhbmQrb25lKnZyYW5kLW9uZSp2cmFuZCkuc3RhYmxlTm9ybSgpLCAgICAgIHZyYW5kLm5vcm0oKSk7Ci0gIFZFUklGWV9JU19BUFBST1goKG9uZSp2cmFuZCtvbmUqdnJhbmQtb25lKnZyYW5kKS5ibHVlTm9ybSgpLCAgICAgICAgdnJhbmQubm9ybSgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCgob25lKnZyYW5kK29uZSp2cmFuZC1vbmUqdnJhbmQpLmh5cG90Tm9ybSgpLCAgICAgICB2cmFuZC5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKChvbmUgKiB2cmFuZCkuc3RhYmxlTm9ybSgpLCB2cmFuZC5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKChvbmUgKiB2cmFuZCkuYmx1ZU5vcm0oKSwgdnJhbmQubm9ybSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgob25lICogdnJhbmQpLmh5cG90Tm9ybSgpLCB2cmFuZC5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKChvbmUgKiB2cmFuZCArIG9uZSAqIHZyYW5kIC0gb25lICogdnJhbmQpLnN0YWJsZU5vcm0oKSwgdnJhbmQubm9ybSgpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCgob25lICogdnJhbmQgKyBvbmUgKiB2cmFuZCAtIG9uZSAqIHZyYW5kKS5ibHVlTm9ybSgpLCB2cmFuZC5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKChvbmUgKiB2cmFuZCArIG9uZSAqIHZyYW5kIC0gb25lICogdnJhbmQpLmh5cG90Tm9ybSgpLCB2cmFuZC5ub3JtKCkpOwogCiAgIFJlYWxTY2FsYXIgc2l6ZSA9IHN0YXRpY19jYXN0PFJlYWxTY2FsYXI+KG0uc2l6ZSgpKTsKIAogICAvLyB0ZXN0IG51bWV4dDo6aXNmaW5pdGUKLSAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkoIHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OmluZmluaXR5KCkpKTsKKyAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6aW5maW5pdHkoKSkpOwogICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKShzcXJ0KC1hYnMoYmlnKSkpKTsKIAogICAvLyB0ZXN0IG92ZXJmbG93Ci0gIFZFUklGWSgobnVtZXh0Ojppc2Zpbml0ZSkoc3FydChzaXplKSphYnMoYmlnKSkpOwotICBWRVJJRllfSVNfTk9UX0FQUFJPWChzcXJ0KGNvcHkodmJpZy5zcXVhcmVkTm9ybSgpKSksIGFicyhzcXJ0KHNpemUpKmJpZykpOyAvLyBoZXJlIHRoZSBkZWZhdWx0IG5vcm0gbXVzdCBmYWlsCi0gIFZFUklGWV9JU19BUFBST1godmJpZy5zdGFibGVOb3JtKCksIHNxcnQoc2l6ZSkqYWJzKGJpZykpOwotICBWRVJJRllfSVNfQVBQUk9YKHZiaWcuYmx1ZU5vcm0oKSwgICBzcXJ0KHNpemUpKmFicyhiaWcpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh2YmlnLmh5cG90Tm9ybSgpLCAgc3FydChzaXplKSphYnMoYmlnKSk7CisgIFZFUklGWSgobnVtZXh0Ojppc2Zpbml0ZSkoc3FydChzaXplKSAqIGFicyhiaWcpKSk7CisgIFZFUklGWV9JU19OT1RfQVBQUk9YKHNxcnQoY29weSh2YmlnLnNxdWFyZWROb3JtKCkpKSwgYWJzKHNxcnQoc2l6ZSkgKiBiaWcpKTsgIC8vIGhlcmUgdGhlIGRlZmF1bHQgbm9ybSBtdXN0IGZhaWwKKyAgVkVSSUZZX0lTX0FQUFJPWCh2YmlnLnN0YWJsZU5vcm0oKSwgc3FydChzaXplKSAqIGFicyhiaWcpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2YmlnLmJsdWVOb3JtKCksIHNxcnQoc2l6ZSkgKiBhYnMoYmlnKSk7CisgIFZFUklGWV9JU19BUFBST1godmJpZy5oeXBvdE5vcm0oKSwgc3FydChzaXplKSAqIGFicyhiaWcpKTsKIAogICAvLyB0ZXN0IHVuZGVyZmxvdwotICBWRVJJRlkoKG51bWV4dDo6aXNmaW5pdGUpKHNxcnQoc2l6ZSkqYWJzKHNtYWxsKSkpOwotICBWRVJJRllfSVNfTk9UX0FQUFJPWChzcXJ0KGNvcHkodnNtYWxsLnNxdWFyZWROb3JtKCkpKSwgICBhYnMoc3FydChzaXplKSpzbWFsbCkpOyAvLyBoZXJlIHRoZSBkZWZhdWx0IG5vcm0gbXVzdCBmYWlsCi0gIFZFUklGWV9JU19BUFBST1godnNtYWxsLnN0YWJsZU5vcm0oKSwgc3FydChzaXplKSphYnMoc21hbGwpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh2c21hbGwuYmx1ZU5vcm0oKSwgICBzcXJ0KHNpemUpKmFicyhzbWFsbCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHZzbWFsbC5oeXBvdE5vcm0oKSwgIHNxcnQoc2l6ZSkqYWJzKHNtYWxsKSk7CisgIFZFUklGWSgobnVtZXh0Ojppc2Zpbml0ZSkoc3FydChzaXplKSAqIGFicyhzbWFsbCkpKTsKKyAgVkVSSUZZX0lTX05PVF9BUFBST1goc3FydChjb3B5KHZzbWFsbC5zcXVhcmVkTm9ybSgpKSksIGFicyhzcXJ0KHNpemUpICogc21hbGwpKTsgIC8vIGhlcmUgdGhlIGRlZmF1bHQgbm9ybSBtdXN0IGZhaWwKKyAgVkVSSUZZX0lTX0FQUFJPWCh2c21hbGwuc3RhYmxlTm9ybSgpLCBzcXJ0KHNpemUpICogYWJzKHNtYWxsKSk7CisgIFZFUklGWV9JU19BUFBST1godnNtYWxsLmJsdWVOb3JtKCksIHNxcnQoc2l6ZSkgKiBhYnMoc21hbGwpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh2c21hbGwuaHlwb3ROb3JtKCksIHNxcnQoc2l6ZSkgKiBhYnMoc21hbGwpKTsKIAogICAvLyBUZXN0IGNvbXBpbGF0aW9uIG9mIGN3aXNlKCkgdmVyc2lvbgotICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLmNvbHdpc2UoKS5zdGFibGVOb3JtKCksICAgICAgdnJhbmQuY29sd2lzZSgpLm5vcm0oKSk7Ci0gIFZFUklGWV9JU19BUFBST1godnJhbmQuY29sd2lzZSgpLmJsdWVOb3JtKCksICAgICAgICB2cmFuZC5jb2x3aXNlKCkubm9ybSgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh2cmFuZC5jb2x3aXNlKCkuaHlwb3ROb3JtKCksICAgICAgIHZyYW5kLmNvbHdpc2UoKS5ub3JtKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLnJvd3dpc2UoKS5zdGFibGVOb3JtKCksICAgICAgdnJhbmQucm93d2lzZSgpLm5vcm0oKSk7Ci0gIFZFUklGWV9JU19BUFBST1godnJhbmQucm93d2lzZSgpLmJsdWVOb3JtKCksICAgICAgICB2cmFuZC5yb3d3aXNlKCkubm9ybSgpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh2cmFuZC5yb3d3aXNlKCkuaHlwb3ROb3JtKCksICAgICAgIHZyYW5kLnJvd3dpc2UoKS5ub3JtKCkpOwotICAKLSAgLy8gdGVzdCBOYU4sICtpbmYsIC1pbmYgCisgIFZFUklGWV9JU19BUFBST1godnJhbmQuY29sd2lzZSgpLnN0YWJsZU5vcm0oKSwgdnJhbmQuY29sd2lzZSgpLm5vcm0oKSk7CisgIFZFUklGWV9JU19BUFBST1godnJhbmQuY29sd2lzZSgpLmJsdWVOb3JtKCksIHZyYW5kLmNvbHdpc2UoKS5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLmNvbHdpc2UoKS5oeXBvdE5vcm0oKSwgdnJhbmQuY29sd2lzZSgpLm5vcm0oKSk7CisgIFZFUklGWV9JU19BUFBST1godnJhbmQucm93d2lzZSgpLnN0YWJsZU5vcm0oKSwgdnJhbmQucm93d2lzZSgpLm5vcm0oKSk7CisgIFZFUklGWV9JU19BUFBST1godnJhbmQucm93d2lzZSgpLmJsdWVOb3JtKCksIHZyYW5kLnJvd3dpc2UoKS5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKHZyYW5kLnJvd3dpc2UoKS5oeXBvdE5vcm0oKSwgdnJhbmQucm93d2lzZSgpLm5vcm0oKSk7CisKKyAgLy8gdGVzdCBOYU4sICtpbmYsIC1pbmYKICAgTWF0cml4VHlwZSB2OwotICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOwotICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTEpOworICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cyAtIDEpOworICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scyAtIDEpOwogCiAgIC8vIE5hTgogICB7CiAgICAgdiA9IHZyYW5kOwotICAgIHYoaSxqKSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OnF1aWV0X05hTigpOwotICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuc3F1YXJlZE5vcm0oKSkpOyAgIFZFUklGWSgobnVtZXh0Ojppc25hbikodi5zcXVhcmVkTm9ybSgpKSk7Ci0gICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5ub3JtKCkpKTsgICAgICAgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKSh2Lm5vcm0oKSkpOwotICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuc3RhYmxlTm9ybSgpKSk7ICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikodi5zdGFibGVOb3JtKCkpKTsKLSAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2LmJsdWVOb3JtKCkpKTsgICAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHYuYmx1ZU5vcm0oKSkpOwotICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuaHlwb3ROb3JtKCkpKTsgICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikodi5oeXBvdE5vcm0oKSkpOworICAgIHYoaSwgaikgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpxdWlldF9OYU4oKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2LnNxdWFyZWROb3JtKCkpKTsKKyAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHYuc3F1YXJlZE5vcm0oKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYubm9ybSgpKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKSh2Lm5vcm0oKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuc3RhYmxlTm9ybSgpKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKSh2LnN0YWJsZU5vcm0oKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuYmx1ZU5vcm0oKSkpOworICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikodi5ibHVlTm9ybSgpKSk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5oeXBvdE5vcm0oKSkpOworICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikodi5oeXBvdE5vcm0oKSkpOwogICB9Ci0gIAorCiAgIC8vICtpbmYKICAgewogICAgIHYgPSB2cmFuZDsKLSAgICB2KGksaikgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjppbmZpbml0eSgpOwotICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuc3F1YXJlZE5vcm0oKSkpOyAgIFZFUklGWShpc1BsdXNJbmYodi5zcXVhcmVkTm9ybSgpKSk7Ci0gICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5ub3JtKCkpKTsgICAgICAgICAgVkVSSUZZKGlzUGx1c0luZih2Lm5vcm0oKSkpOworICAgIHYoaSwgaikgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjppbmZpbml0eSgpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuc3F1YXJlZE5vcm0oKSkpOworICAgIFZFUklGWShpc1BsdXNJbmYodi5zcXVhcmVkTm9ybSgpKSk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5ub3JtKCkpKTsKKyAgICBWRVJJRlkoaXNQbHVzSW5mKHYubm9ybSgpKSk7CiAgICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5zdGFibGVOb3JtKCkpKTsKLSAgICBpZihjb21wbGV4X3JlYWxfcHJvZHVjdF9vayl7CisgICAgaWYgKGNvbXBsZXhfcmVhbF9wcm9kdWN0X29rKSB7CiAgICAgICBWRVJJRlkoaXNQbHVzSW5mKHYuc3RhYmxlTm9ybSgpKSk7CiAgICAgfQotICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuYmx1ZU5vcm0oKSkpOyAgICAgIFZFUklGWShpc1BsdXNJbmYodi5ibHVlTm9ybSgpKSk7Ci0gICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5oeXBvdE5vcm0oKSkpOyAgICAgVkVSSUZZKGlzUGx1c0luZih2Lmh5cG90Tm9ybSgpKSk7CisgICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5ibHVlTm9ybSgpKSk7CisgICAgVkVSSUZZKGlzUGx1c0luZih2LmJsdWVOb3JtKCkpKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2Lmh5cG90Tm9ybSgpKSk7CisgICAgVkVSSUZZKGlzUGx1c0luZih2Lmh5cG90Tm9ybSgpKSk7CiAgIH0KLSAgCisKICAgLy8gLWluZgogICB7CiAgICAgdiA9IHZyYW5kOwotICAgIHYoaSxqKSA9IC1zdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjppbmZpbml0eSgpOwotICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuc3F1YXJlZE5vcm0oKSkpOyAgIFZFUklGWShpc1BsdXNJbmYodi5zcXVhcmVkTm9ybSgpKSk7Ci0gICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5ub3JtKCkpKTsgICAgICAgICAgVkVSSUZZKGlzUGx1c0luZih2Lm5vcm0oKSkpOworICAgIHYoaSwgaikgPSAtc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6aW5maW5pdHkoKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2LnNxdWFyZWROb3JtKCkpKTsKKyAgICBWRVJJRlkoaXNQbHVzSW5mKHYuc3F1YXJlZE5vcm0oKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYubm9ybSgpKSk7CisgICAgVkVSSUZZKGlzUGx1c0luZih2Lm5vcm0oKSkpOwogICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuc3RhYmxlTm9ybSgpKSk7Ci0gICAgaWYoY29tcGxleF9yZWFsX3Byb2R1Y3Rfb2spIHsKKyAgICBpZiAoY29tcGxleF9yZWFsX3Byb2R1Y3Rfb2spIHsKICAgICAgIFZFUklGWShpc1BsdXNJbmYodi5zdGFibGVOb3JtKCkpKTsKICAgICB9Ci0gICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5ibHVlTm9ybSgpKSk7ICAgICAgVkVSSUZZKGlzUGx1c0luZih2LmJsdWVOb3JtKCkpKTsKLSAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2Lmh5cG90Tm9ybSgpKSk7ICAgICBWRVJJRlkoaXNQbHVzSW5mKHYuaHlwb3ROb3JtKCkpKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2LmJsdWVOb3JtKCkpKTsKKyAgICBWRVJJRlkoaXNQbHVzSW5mKHYuYmx1ZU5vcm0oKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuaHlwb3ROb3JtKCkpKTsKKyAgICBWRVJJRlkoaXNQbHVzSW5mKHYuaHlwb3ROb3JtKCkpKTsKICAgfQotICAKKwogICAvLyBtaXgKICAgewotICAgIEluZGV4IGkyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxyb3dzLTEpOwotICAgIEluZGV4IGoyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxjb2xzLTEpOworICAgIEluZGV4IGkyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cyAtIDEpOworICAgIEluZGV4IGoyID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scyAtIDEpOwogICAgIHYgPSB2cmFuZDsKLSAgICB2KGksaikgPSAtc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6aW5maW5pdHkoKTsKLSAgICB2KGkyLGoyKSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OnF1aWV0X05hTigpOwotICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuc3F1YXJlZE5vcm0oKSkpOyAgIFZFUklGWSgobnVtZXh0Ojppc25hbikodi5zcXVhcmVkTm9ybSgpKSk7Ci0gICAgVkVSSUZZKCEobnVtZXh0Ojppc2Zpbml0ZSkodi5ub3JtKCkpKTsgICAgICAgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKSh2Lm5vcm0oKSkpOwotICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuc3RhYmxlTm9ybSgpKSk7ICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikodi5zdGFibGVOb3JtKCkpKTsKLSAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2LmJsdWVOb3JtKCkpKTsgICAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHYuYmx1ZU5vcm0oKSkpOworICAgIHYoaSwgaikgPSAtc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6aW5maW5pdHkoKTsKKyAgICB2KGkyLCBqMikgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjpxdWlldF9OYU4oKTsKKyAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2LnNxdWFyZWROb3JtKCkpKTsKKyAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHYuc3F1YXJlZE5vcm0oKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYubm9ybSgpKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKSh2Lm5vcm0oKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuc3RhYmxlTm9ybSgpKSk7CisgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKSh2LnN0YWJsZU5vcm0oKSkpOworICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuYmx1ZU5vcm0oKSkpOworICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikodi5ibHVlTm9ybSgpKSk7CiAgICAgaWYgKGkyICE9IGkgfHwgajIgIT0gaikgewogICAgICAgLy8gaHlwb3QgcHJvcGFnYXRlcyBpbmYgb3ZlciBOYU4uCi0gICAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2Lmh5cG90Tm9ybSgpKSk7ICAgICBWRVJJRlkoKG51bWV4dDo6aXNpbmYpKHYuaHlwb3ROb3JtKCkpKTsKKyAgICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuaHlwb3ROb3JtKCkpKTsKKyAgICAgIFZFUklGWSgobnVtZXh0Ojppc2luZikodi5oeXBvdE5vcm0oKSkpOwogICAgIH0gZWxzZSB7CiAgICAgICAvLyBpbmYgaXMgb3ZlcndyaXR0ZW4gYnkgTmFOLCBleHBlY3Qgbm9ybSB0byBiZSBOYU4uCi0gICAgICBWRVJJRlkoIShudW1leHQ6OmlzZmluaXRlKSh2Lmh5cG90Tm9ybSgpKSk7ICAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHYuaHlwb3ROb3JtKCkpKTsKKyAgICAgIFZFUklGWSghKG51bWV4dDo6aXNmaW5pdGUpKHYuaHlwb3ROb3JtKCkpKTsKKyAgICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikodi5oeXBvdE5vcm0oKSkpOwogICAgIH0KICAgfQogCkBAIC0xOTAsNTYgKzIwNCw0OSBAQAogICAgIFZFUklGWV9JU19BUFBST1goKHZiaWcuc3RhYmxlTm9ybWFsaXplZCgpKS5ub3JtKCksIFJlYWxTY2FsYXIoMSkpOwogICAgIFZFUklGWV9JU19BUFBST1goKHZzbWFsbC5zdGFibGVOb3JtYWxpemVkKCkpLm5vcm0oKSwgUmVhbFNjYWxhcigxKSk7CiAgICAgUmVhbFNjYWxhciBiaWdfc2NhbGluZyA9ICgoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWF4KSgpICogUmVhbFNjYWxhcigxZS00KSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCh2YmlnL2JpZ19zY2FsaW5nLCAodmJpZy5zdGFibGVOb3JtKCkgKiB2YmlnLnN0YWJsZU5vcm1hbGl6ZWQoKSkuZXZhbCgpL2JpZ19zY2FsaW5nKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHZiaWcgLyBiaWdfc2NhbGluZywgKHZiaWcuc3RhYmxlTm9ybSgpICogdmJpZy5zdGFibGVOb3JtYWxpemVkKCkpLmV2YWwoKSAvIGJpZ19zY2FsaW5nKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKHZzbWFsbCwgdnNtYWxsLnN0YWJsZU5vcm0oKSAqIHZzbWFsbC5zdGFibGVOb3JtYWxpemVkKCkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KLXZvaWQgdGVzdF9oeXBvdCgpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCB0ZXN0X2h5cG90KCkgewogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CiAgIFNjYWxhciBmYWN0b3IgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKLSAgd2hpbGUobnVtZXh0OjphYnMyKGZhY3Rvcik8UmVhbFNjYWxhcigxZS00KSkKLSAgICBmYWN0b3IgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgd2hpbGUgKG51bWV4dDo6YWJzMihmYWN0b3IpIDwgUmVhbFNjYWxhcigxZS00KSkgZmFjdG9yID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAgIFNjYWxhciBiaWcgPSBmYWN0b3IgKiAoKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1heCkoKSAqIFJlYWxTY2FsYXIoMWUtNCkpOwotICAKKwogICBmYWN0b3IgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKLSAgd2hpbGUobnVtZXh0OjphYnMyKGZhY3Rvcik8UmVhbFNjYWxhcigxZS00KSkKLSAgICBmYWN0b3IgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKKyAgd2hpbGUgKG51bWV4dDo6YWJzMihmYWN0b3IpIDwgUmVhbFNjYWxhcigxZS00KSkgZmFjdG9yID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAgIFNjYWxhciBzbWFsbCA9IGZhY3RvciAqICgoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpICogUmVhbFNjYWxhcigxZTQpKTsKIAotICBTY2FsYXIgIG9uZSAgICgxKSwKLSAgICAgICAgICB6ZXJvICAoMCksCi0gICAgICAgICAgc3FydDIgKHN0ZDo6c3FydCgyKSksCi0gICAgICAgICAgbmFuICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OnF1aWV0X05hTigpKTsKKyAgU2NhbGFyIG9uZSgxKSwgemVybygwKSwgc3FydDIoc3RkOjpzcXJ0KDIpKSwgbmFuKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46OnF1aWV0X05hTigpKTsKIAotICBTY2FsYXIgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMSwxKTsKLSAgU2NhbGFyIGIgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTEsMSk7Ci0gIFZFUklGWV9JU19BUFBST1gobnVtZXh0OjpoeXBvdChhLGIpLHN0ZDo6c3FydChudW1leHQ6OmFiczIoYSkrbnVtZXh0OjphYnMyKGIpKSk7Ci0gIFZFUklGWV9JU19FUVVBTChudW1leHQ6Omh5cG90KHplcm8semVybyksIHplcm8pOworICBTY2FsYXIgYSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigtMSwgMSk7CisgIFNjYWxhciBiID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC0xLCAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6Omh5cG90KGEsIGIpLCBzdGQ6OnNxcnQobnVtZXh0OjphYnMyKGEpICsgbnVtZXh0OjphYnMyKGIpKSk7CisgIFZFUklGWV9JU19FUVVBTChudW1leHQ6Omh5cG90KHplcm8sIHplcm8pLCB6ZXJvKTsKICAgVkVSSUZZX0lTX0FQUFJPWChudW1leHQ6Omh5cG90KG9uZSwgb25lKSwgc3FydDIpOwotICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6aHlwb3QoYmlnLGJpZyksIHNxcnQyKm51bWV4dDo6YWJzKGJpZykpOwotICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6aHlwb3Qoc21hbGwsc21hbGwpLCBzcXJ0MipudW1leHQ6OmFicyhzbWFsbCkpOwotICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6aHlwb3Qoc21hbGwsYmlnKSwgbnVtZXh0OjphYnMoYmlnKSk7Ci0gIFZFUklGWSgobnVtZXh0Ojppc25hbikobnVtZXh0OjpoeXBvdChuYW4sYSkpKTsKLSAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShudW1leHQ6Omh5cG90KGEsbmFuKSkpOworICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6aHlwb3QoYmlnLCBiaWcpLCBzcXJ0MiAqIG51bWV4dDo6YWJzKGJpZykpOworICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6aHlwb3Qoc21hbGwsIHNtYWxsKSwgc3FydDIgKiBudW1leHQ6OmFicyhzbWFsbCkpOworICBWRVJJRllfSVNfQVBQUk9YKG51bWV4dDo6aHlwb3Qoc21hbGwsIGJpZyksIG51bWV4dDo6YWJzKGJpZykpOworICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKG51bWV4dDo6aHlwb3QobmFuLCBhKSkpOworICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKG51bWV4dDo6aHlwb3QoYSwgbmFuKSkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1Qoc3RhYmxlX25vcm0pCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIHRlc3RfaHlwb3Q8ZG91YmxlPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIHRlc3RfaHlwb3Q8ZmxvYXQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggdGVzdF9oeXBvdDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggdGVzdF9oeXBvdDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSApOworRUlHRU5fREVDTEFSRV9URVNUKHN0YWJsZV9ub3JtKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8zKHRlc3RfaHlwb3Q8ZG91YmxlPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCh0ZXN0X2h5cG90PGZsb2F0PigpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSh0ZXN0X2h5cG90PHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzYodGVzdF9oeXBvdDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+ID4oKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfMSggc3RhYmxlX25vcm0oTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCBzdGFibGVfbm9ybShWZWN0b3I0ZCgpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBzdGFibGVfbm9ybShWZWN0b3JYZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsMjAwMCkpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBzdGFibGVfbm9ybShNYXRyaXhYZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsMjAwKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLDIwMCkpKSApOwotICAgIENBTExfU1VCVEVTVF80KCBzdGFibGVfbm9ybShWZWN0b3JYZihpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsMjAwMCkpKSApOwotICAgIENBTExfU1VCVEVTVF81KCBzdGFibGVfbm9ybShWZWN0b3JYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLDIwMDApKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggc3RhYmxlX25vcm0oVmVjdG9yWGNmKGludGVybmFsOjpyYW5kb208aW50PigxMCwyMDAwKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzEoc3RhYmxlX25vcm0oTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoc3RhYmxlX25vcm0oVmVjdG9yNGQoKSkpOworICAgIENBTExfU1VCVEVTVF8zKHN0YWJsZV9ub3JtKFZlY3RvclhkKGludGVybmFsOjpyYW5kb208aW50PigxMCwgMjAwMCkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoc3RhYmxlX25vcm0oTWF0cml4WGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLCAyMDApLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsIDIwMCkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoc3RhYmxlX25vcm0oVmVjdG9yWGYoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLCAyMDAwKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShzdGFibGVfbm9ybShWZWN0b3JYY2QoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLCAyMDAwKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNihzdGFibGVfbm9ybShWZWN0b3JYY2YoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLCAyMDAwKSkpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9zdGRkZXF1ZS5jcHAgYi90ZXN0L3N0ZGRlcXVlLmNwcAppbmRleCBlYTg1ZWE5Li40NTYwOGQ3IDEwMDY0NAotLS0gYS90ZXN0L3N0ZGRlcXVlLmNwcAorKysgYi90ZXN0L3N0ZGRlcXVlLmNwcApAQCAtMTIsOTYgKzEyLDg5IEBACiAjaW5jbHVkZSA8RWlnZW4vU3RkRGVxdWU+CiAjaW5jbHVkZSA8RWlnZW4vR2VvbWV0cnk+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIGNoZWNrX3N0ZGRlcXVlX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX3N0ZGRlcXVlX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwotICBNYXRyaXhUeXBlIHggPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSwgeSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICBzdGQ6OmRlcXVlPE1hdHJpeFR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPE1hdHJpeFR5cGU+ID4gdigxMCwgTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpKSwgdygyMCwgeSk7CisgIE1hdHJpeFR5cGUgeCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgeSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgc3RkOjpkZXF1ZTxNYXRyaXhUeXBlLCBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8TWF0cml4VHlwZT4gPiB2KDEwLCBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpKSwgdygyMCwgeSk7CiAgIHYuZnJvbnQoKSA9IHg7CiAgIHcuZnJvbnQoKSA9IHcuYmFjaygpOwogICBWRVJJRllfSVNfQVBQUk9YKHcuZnJvbnQoKSwgdy5iYWNrKCkpOwogICB2ID0gdzsKIAotICB0eXBlbmFtZSBzdGQ6OmRlcXVlPE1hdHJpeFR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPE1hdHJpeFR5cGU+ID46Oml0ZXJhdG9yIHZpID0gdi5iZWdpbigpOwotICB0eXBlbmFtZSBzdGQ6OmRlcXVlPE1hdHJpeFR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPE1hdHJpeFR5cGU+ID46Oml0ZXJhdG9yIHdpID0gdy5iZWdpbigpOwotICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKLSAgeworICB0eXBlbmFtZSBzdGQ6OmRlcXVlPE1hdHJpeFR5cGUsIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxNYXRyaXhUeXBlPiA+OjppdGVyYXRvciB2aSA9IHYuYmVnaW4oKTsKKyAgdHlwZW5hbWUgc3RkOjpkZXF1ZTxNYXRyaXhUeXBlLCBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8TWF0cml4VHlwZT4gPjo6aXRlcmF0b3Igd2kgPSB3LmJlZ2luKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgIFZFUklGWV9JU19BUFBST1goKnZpLCAqd2kpOwogICAgICsrdmk7CiAgICAgKyt3aTsKICAgfQogCi0gIHYucmVzaXplKDIxLE1hdHJpeFR5cGU6Olplcm8ocm93cyxjb2xzKSk7ICAKKyAgdi5yZXNpemUoMjEsIE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scykpOwogICB2LmJhY2soKSA9IHg7CiAgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOwotICB2LnJlc2l6ZSgyMix5KTsKKyAgdi5yZXNpemUoMjIsIHkpOwogICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB5KTsKICAgdi5wdXNoX2JhY2soeCk7CiAgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPgotdm9pZCBjaGVja19zdGRkZXF1ZV90cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtVHlwZSYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KK3ZvaWQgY2hlY2tfc3RkZGVxdWVfdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybVR5cGUmKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOwotICBUcmFuc2Zvcm1UeXBlIHgoTWF0cml4VHlwZTo6UmFuZG9tKCkpLCB5KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgdGk9VHJhbnNmb3JtVHlwZTo6SWRlbnRpdHkoKTsKLSAgc3RkOjpkZXF1ZTxUcmFuc2Zvcm1UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+IHYoMTAsdGkpLCB3KDIwLCB5KTsKKyAgVHJhbnNmb3JtVHlwZSB4KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgeShNYXRyaXhUeXBlOjpSYW5kb20oKSksIHRpID0gVHJhbnNmb3JtVHlwZTo6SWRlbnRpdHkoKTsKKyAgc3RkOjpkZXF1ZTxUcmFuc2Zvcm1UeXBlLCBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8VHJhbnNmb3JtVHlwZT4gPiB2KDEwLCB0aSksIHcoMjAsIHkpOwogICB2LmZyb250KCkgPSB4OwogICB3LmZyb250KCkgPSB3LmJhY2soKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh3LmZyb250KCksIHcuYmFjaygpKTsKICAgdiA9IHc7CiAKLSAgdHlwZW5hbWUgc3RkOjpkZXF1ZTxUcmFuc2Zvcm1UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+OjppdGVyYXRvciB2aSA9IHYuYmVnaW4oKTsKLSAgdHlwZW5hbWUgc3RkOjpkZXF1ZTxUcmFuc2Zvcm1UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+OjppdGVyYXRvciB3aSA9IHcuYmVnaW4oKTsKLSAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCi0gIHsKKyAgdHlwZW5hbWUgc3RkOjpkZXF1ZTxUcmFuc2Zvcm1UeXBlLCBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8VHJhbnNmb3JtVHlwZT4gPjo6aXRlcmF0b3IgdmkgPSB2LmJlZ2luKCk7CisgIHR5cGVuYW1lIHN0ZDo6ZGVxdWU8VHJhbnNmb3JtVHlwZSwgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFRyYW5zZm9ybVR5cGU+ID46Oml0ZXJhdG9yIHdpID0gdy5iZWdpbigpOworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKICAgICBWRVJJRllfSVNfQVBQUk9YKCp2aSwgKndpKTsKICAgICArK3ZpOwogICAgICsrd2k7CiAgIH0KIAotICB2LnJlc2l6ZSgyMSx0aSk7CisgIHYucmVzaXplKDIxLCB0aSk7CiAgIHYuYmFjaygpID0geDsKICAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeCk7Ci0gIHYucmVzaXplKDIyLHkpOworICB2LnJlc2l6ZSgyMiwgeSk7CiAgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHkpOwogICB2LnB1c2hfYmFjayh4KTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgotdm9pZCBjaGVja19zdGRkZXF1ZV9xdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb25UeXBlJikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZT4KK3ZvaWQgY2hlY2tfc3RkZGVxdWVfcXVhdGVybmlvbihjb25zdCBRdWF0ZXJuaW9uVHlwZSYpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZTo6Q29lZmZpY2llbnRzIENvZWZmaWNpZW50czsKLSAgUXVhdGVybmlvblR5cGUgeChDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgeShDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgcWk9UXVhdGVybmlvblR5cGU6OklkZW50aXR5KCk7Ci0gIHN0ZDo6ZGVxdWU8UXVhdGVybmlvblR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFF1YXRlcm5pb25UeXBlPiA+IHYoMTAscWkpLCB3KDIwLCB5KTsKKyAgUXVhdGVybmlvblR5cGUgeChDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgeShDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgcWkgPSBRdWF0ZXJuaW9uVHlwZTo6SWRlbnRpdHkoKTsKKyAgc3RkOjpkZXF1ZTxRdWF0ZXJuaW9uVHlwZSwgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFF1YXRlcm5pb25UeXBlPiA+IHYoMTAsIHFpKSwgdygyMCwgeSk7CiAgIHYuZnJvbnQoKSA9IHg7CiAgIHcuZnJvbnQoKSA9IHcuYmFjaygpOwogICBWRVJJRllfSVNfQVBQUk9YKHcuZnJvbnQoKSwgdy5iYWNrKCkpOwogICB2ID0gdzsKIAotICB0eXBlbmFtZSBzdGQ6OmRlcXVlPFF1YXRlcm5pb25UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxRdWF0ZXJuaW9uVHlwZT4gPjo6aXRlcmF0b3IgdmkgPSB2LmJlZ2luKCk7Ci0gIHR5cGVuYW1lIHN0ZDo6ZGVxdWU8UXVhdGVybmlvblR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFF1YXRlcm5pb25UeXBlPiA+OjppdGVyYXRvciB3aSA9IHcuYmVnaW4oKTsKLSAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCi0gIHsKKyAgdHlwZW5hbWUgc3RkOjpkZXF1ZTxRdWF0ZXJuaW9uVHlwZSwgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFF1YXRlcm5pb25UeXBlPiA+OjppdGVyYXRvciB2aSA9IHYuYmVnaW4oKTsKKyAgdHlwZW5hbWUgc3RkOjpkZXF1ZTxRdWF0ZXJuaW9uVHlwZSwgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFF1YXRlcm5pb25UeXBlPiA+OjppdGVyYXRvciB3aSA9IHcuYmVnaW4oKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CiAgICAgVkVSSUZZX0lTX0FQUFJPWCgqdmksICp3aSk7CiAgICAgKyt2aTsKICAgICArK3dpOwogICB9CiAKLSAgdi5yZXNpemUoMjEscWkpOworICB2LnJlc2l6ZSgyMSwgcWkpOwogICB2LmJhY2soKSA9IHg7CiAgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOwotICB2LnJlc2l6ZSgyMix5KTsKKyAgdi5yZXNpemUoMjIsIHkpOwogICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB5KTsKICAgdi5wdXNoX2JhY2soeCk7CiAgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1Qoc3RkZGVxdWUpCi17CitFSUdFTl9ERUNMQVJFX1RFU1Qoc3RkZGVxdWUpIHsKICAgLy8gc29tZSBub24gdmVjdG9yaXphYmxlIGZpeGVkIHNpemVzCiAgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChWZWN0b3IyZigpKSk7CiAgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChNYXRyaXgzZigpKSk7CkBAIC0xMTQsMTAgKzEwNywxMCBAQAogICBDQUxMX1NVQlRFU1RfMihjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4NGQoKSkpOwogCiAgIC8vIHNvbWUgZHluYW1pYyBzaXplcwotICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4WGQoMSwxKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4WGQoMSwgMSkpKTsKICAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkZGVxdWVfbWF0cml4KFZlY3RvclhkKDIwKSkpOwogICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRkZXF1ZV9tYXRyaXgoUm93VmVjdG9yWGYoMjApKSk7Ci0gIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChNYXRyaXhYY2YoMTAsMTApKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChNYXRyaXhYY2YoMTAsIDEwKSkpOwogCiAgIC8vIHNvbWUgVHJhbnNmb3JtCiAgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZGRlcXVlX3RyYW5zZm9ybShBZmZpbmUyZigpKSk7CmRpZmYgLS1naXQgYS90ZXN0L3N0ZGRlcXVlX292ZXJsb2FkLmNwcCBiL3Rlc3Qvc3RkZGVxdWVfb3ZlcmxvYWQuY3BwCmluZGV4IDBmNTlmMDYuLmQwZmIyNjEgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3RkZGVxdWVfb3ZlcmxvYWQuY3BwCisrKyBiL3Rlc3Qvc3RkZGVxdWVfb3ZlcmxvYWQuY3BwCkBAIC0yNSwyNiArMjUsMjQgQEAKIEVJR0VOX0RFRklORV9TVExfREVRVUVfU1BFQ0lBTElaQVRJT04oUXVhdGVybmlvbmYpCiBFSUdFTl9ERUZJTkVfU1RMX0RFUVVFX1NQRUNJQUxJWkFUSU9OKFF1YXRlcm5pb25kKQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCBjaGVja19zdGRkZXF1ZV9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBjaGVja19zdGRkZXF1ZV9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKLSAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKLSAgc3RkOjpkZXF1ZTxNYXRyaXhUeXBlPiB2KDEwLCBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsY29scykpLCB3KDIwLCB5KTsKKyAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCB5ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICBzdGQ6OmRlcXVlPE1hdHJpeFR5cGU+IHYoMTAsIE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scykpLCB3KDIwLCB5KTsKICAgdls1XSA9IHg7CiAgIHdbNl0gPSB2WzVdOwogICBWRVJJRllfSVNfQVBQUk9YKHdbNl0sIHZbNV0pOwogICB2ID0gdzsKLSAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCi0gIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CiAgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKICAgfQogCiAgIHYucmVzaXplKDIxKTsKICAgdlsyMF0gPSB4OwogICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKLSAgdi5yZXNpemUoMjIseSk7CisgIHYucmVzaXplKDIyLCB5KTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CiAgIHYucHVzaF9iYWNrKHgpOwogICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKQEAgLTUyLDMzICs1MCwyOSBAQAogICAvLyBkbyBhIGxvdCBvZiBwdXNoX2JhY2sgc3VjaCB0aGF0IHRoZSBkZXF1ZSBnZXRzIGludGVybmFsbHkgcmVzaXplZAogICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQogICBNYXRyaXhUeXBlKiByZWYgPSAmd1swXTsKLSAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKLSAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKLSAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCi0gIHsKLSAgICBWRVJJRlkodltpXT09d1soaS0yMykldy5zaXplKCldKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMCB8fCAoKHJlZiA9PSAmd1swXSkgJiYgaSA8IDMwMCk7ICsraSkgdi5wdXNoX2JhY2sod1tpICUgdy5zaXplKCldKTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDIzOyBpIDwgdi5zaXplKCk7ICsraSkgeworICAgIFZFUklGWSh2W2ldID09IHdbKGkgLSAyMykgJSB3LnNpemUoKV0pOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU+Ci12b2lkIGNoZWNrX3N0ZGRlcXVlX3RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1UeXBlJikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPgordm9pZCBjaGVja19zdGRkZXF1ZV90cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtVHlwZSYpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7Ci0gIFRyYW5zZm9ybVR5cGUgeChNYXRyaXhUeXBlOjpSYW5kb20oKSksIHkoTWF0cml4VHlwZTo6UmFuZG9tKCkpLCB0aT1UcmFuc2Zvcm1UeXBlOjpJZGVudGl0eSgpOwotICBzdGQ6OmRlcXVlPFRyYW5zZm9ybVR5cGU+IHYoMTAsdGkpLCB3KDIwLCB5KTsKKyAgVHJhbnNmb3JtVHlwZSB4KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgeShNYXRyaXhUeXBlOjpSYW5kb20oKSksIHRpID0gVHJhbnNmb3JtVHlwZTo6SWRlbnRpdHkoKTsKKyAgc3RkOjpkZXF1ZTxUcmFuc2Zvcm1UeXBlPiB2KDEwLCB0aSksIHcoMjAsIHkpOwogICB2WzVdID0geDsKICAgd1s2XSA9IHZbNV07CiAgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CiAgIHYgPSB3OwotICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKLSAgeworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKICAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHZbaV0pOwogICB9CiAKLSAgdi5yZXNpemUoMjEsdGkpOworICB2LnJlc2l6ZSgyMSwgdGkpOwogICB2WzIwXSA9IHg7CiAgIFZFUklGWV9JU19BUFBST1godlsyMF0sIHgpOwotICB2LnJlc2l6ZSgyMix5KTsKKyAgdi5yZXNpemUoMjIsIHkpOwogICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKICAgdi5wdXNoX2JhY2soeCk7CiAgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOwpAQCAtODYsMzMgKzgwLDI5IEBACiAgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIGRlcXVlIGdldHMgaW50ZXJuYWxseSByZXNpemVkCiAgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCiAgIFRyYW5zZm9ybVR5cGUqIHJlZiA9ICZ3WzBdOwotICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQotICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOwotICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKLSAgewotICAgIFZFUklGWSh2W2ldLm1hdHJpeCgpPT13WyhpLTIzKSV3LnNpemUoKV0ubWF0cml4KCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IDMwIHx8ICgocmVmID09ICZ3WzBdKSAmJiBpIDwgMzAwKTsgKytpKSB2LnB1c2hfYmFjayh3W2kgJSB3LnNpemUoKV0pOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMjM7IGkgPCB2LnNpemUoKTsgKytpKSB7CisgICAgVkVSSUZZKHZbaV0ubWF0cml4KCkgPT0gd1soaSAtIDIzKSAlIHcuc2l6ZSgpXS5tYXRyaXgoKSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgUXVhdGVybmlvblR5cGU+Ci12b2lkIGNoZWNrX3N0ZGRlcXVlX3F1YXRlcm5pb24oY29uc3QgUXVhdGVybmlvblR5cGUmKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgordm9pZCBjaGVja19zdGRkZXF1ZV9xdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb25UeXBlJikgewogICB0eXBlZGVmIHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlOjpDb2VmZmljaWVudHMgQ29lZmZpY2llbnRzOwotICBRdWF0ZXJuaW9uVHlwZSB4KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCB5KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCBxaT1RdWF0ZXJuaW9uVHlwZTo6SWRlbnRpdHkoKTsKLSAgc3RkOjpkZXF1ZTxRdWF0ZXJuaW9uVHlwZT4gdigxMCxxaSksIHcoMjAsIHkpOworICBRdWF0ZXJuaW9uVHlwZSB4KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCB5KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCBxaSA9IFF1YXRlcm5pb25UeXBlOjpJZGVudGl0eSgpOworICBzdGQ6OmRlcXVlPFF1YXRlcm5pb25UeXBlPiB2KDEwLCBxaSksIHcoMjAsIHkpOwogICB2WzVdID0geDsKICAgd1s2XSA9IHZbNV07CiAgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CiAgIHYgPSB3OwotICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKLSAgeworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKICAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHZbaV0pOwogICB9CiAKLSAgdi5yZXNpemUoMjEscWkpOworICB2LnJlc2l6ZSgyMSwgcWkpOwogICB2WzIwXSA9IHg7CiAgIFZFUklGWV9JU19BUFBST1godlsyMF0sIHgpOwotICB2LnJlc2l6ZSgyMix5KTsKKyAgdi5yZXNpemUoMjIsIHkpOwogICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKICAgdi5wdXNoX2JhY2soeCk7CiAgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOwpAQCAtMTIwLDE2ICsxMTAsMTMgQEAKICAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgZGVxdWUgZ2V0cyBpbnRlcm5hbGx5IHJlc2l6ZWQKICAgLy8gKHdpdGggbWVtb3J5IHJlYWxsb2NhdGlvbikKICAgUXVhdGVybmlvblR5cGUqIHJlZiA9ICZ3WzBdOwotICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQotICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOwotICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKLSAgewotICAgIFZFUklGWSh2W2ldLmNvZWZmcygpPT13WyhpLTIzKSV3LnNpemUoKV0uY29lZmZzKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IDMwIHx8ICgocmVmID09ICZ3WzBdKSAmJiBpIDwgMzAwKTsgKytpKSB2LnB1c2hfYmFjayh3W2kgJSB3LnNpemUoKV0pOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMjM7IGkgPCB2LnNpemUoKTsgKytpKSB7CisgICAgVkVSSUZZKHZbaV0uY29lZmZzKCkgPT0gd1soaSAtIDIzKSAlIHcuc2l6ZSgpXS5jb2VmZnMoKSk7CiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHN0ZGRlcXVlX292ZXJsb2FkKQoteworRUlHRU5fREVDTEFSRV9URVNUKHN0ZGRlcXVlX292ZXJsb2FkKSB7CiAgIC8vIHNvbWUgbm9uIHZlY3Rvcml6YWJsZSBmaXhlZCBzaXplcwogICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRkZXF1ZV9tYXRyaXgoVmVjdG9yMmYoKSkpOwogICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4M2YoKSkpOwpAQCAtMTQyLDEzICsxMjksMTMgQEAKICAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkZGVxdWVfbWF0cml4KE1hdHJpeDRkKCkpKTsKIAogICAvLyBzb21lIGR5bmFtaWMgc2l6ZXMKLSAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkZGVxdWVfbWF0cml4KE1hdHJpeFhkKDEsMSkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkZGVxdWVfbWF0cml4KE1hdHJpeFhkKDEsIDEpKSk7CiAgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGRlcXVlX21hdHJpeChWZWN0b3JYZCgyMCkpKTsKICAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkZGVxdWVfbWF0cml4KFJvd1ZlY3RvclhmKDIwKSkpOwotICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4WGNmKDEwLDEwKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRkZXF1ZV9tYXRyaXgoTWF0cml4WGNmKDEwLCAxMCkpKTsKIAogICAvLyBzb21lIFRyYW5zZm9ybQotICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGRkZXF1ZV90cmFuc2Zvcm0oQWZmaW5lMmYoKSkpOyAvLyBkb2VzIG5vdCBuZWVkIHRoZSBzcGVjaWFsaXphdGlvbiAoMisxKV4yID0gOQorICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGRkZXF1ZV90cmFuc2Zvcm0oQWZmaW5lMmYoKSkpOyAgLy8gZG9lcyBub3QgbmVlZCB0aGUgc3BlY2lhbGl6YXRpb24gKDIrMSleMiA9IDkKICAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkZGVxdWVfdHJhbnNmb3JtKEFmZmluZTNmKCkpKTsKICAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkZGVxdWVfdHJhbnNmb3JtKEFmZmluZTNkKCkpKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9zdGRsaXN0LmNwcCBiL3Rlc3Qvc3RkbGlzdC5jcHAKaW5kZXggMWFmOWU2ZS4uZmUzMjA2NyAxMDA2NDQKLS0tIGEvdGVzdC9zdGRsaXN0LmNwcAorKysgYi90ZXN0L3N0ZGxpc3QuY3BwCkBAIC0xMiw1MSArMTIsNDcgQEAKICNpbmNsdWRlIDxFaWdlbi9TdGRMaXN0PgogI2luY2x1ZGUgPEVpZ2VuL0dlb21ldHJ5PgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCBjaGVja19zdGRsaXN0X21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX3N0ZGxpc3RfbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7Ci0gIE1hdHJpeFR5cGUgeCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpLCB5ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7Ci0gIHN0ZDo6bGlzdDxNYXRyaXhUeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxNYXRyaXhUeXBlPiA+IHYoMTAsIE1hdHJpeFR5cGU6Olplcm8ocm93cyxjb2xzKSksIHcoMjAsIHkpOworICBNYXRyaXhUeXBlIHggPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgIHN0ZDo6bGlzdDxNYXRyaXhUeXBlLCBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8TWF0cml4VHlwZT4gPiB2KDEwLCBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpKSwgdygyMCwgeSk7CiAgIHYuZnJvbnQoKSA9IHg7CiAgIHcuZnJvbnQoKSA9IHcuYmFjaygpOwogICBWRVJJRllfSVNfQVBQUk9YKHcuZnJvbnQoKSwgdy5iYWNrKCkpOwogICB2ID0gdzsKIAotICB0eXBlbmFtZSBzdGQ6Omxpc3Q8TWF0cml4VHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8TWF0cml4VHlwZT4gPjo6aXRlcmF0b3IgdmkgPSB2LmJlZ2luKCk7Ci0gIHR5cGVuYW1lIHN0ZDo6bGlzdDxNYXRyaXhUeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxNYXRyaXhUeXBlPiA+OjppdGVyYXRvciB3aSA9IHcuYmVnaW4oKTsKLSAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCi0gIHsKKyAgdHlwZW5hbWUgc3RkOjpsaXN0PE1hdHJpeFR5cGUsIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxNYXRyaXhUeXBlPiA+OjppdGVyYXRvciB2aSA9IHYuYmVnaW4oKTsKKyAgdHlwZW5hbWUgc3RkOjpsaXN0PE1hdHJpeFR5cGUsIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxNYXRyaXhUeXBlPiA+OjppdGVyYXRvciB3aSA9IHcuYmVnaW4oKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CiAgICAgVkVSSUZZX0lTX0FQUFJPWCgqdmksICp3aSk7CiAgICAgKyt2aTsKICAgICArK3dpOwogICB9CiAKLSAgdi5yZXNpemUoMjEsIE1hdHJpeFR5cGU6Olplcm8ocm93cyxjb2xzKSk7ICAKKyAgdi5yZXNpemUoMjEsIE1hdHJpeFR5cGU6Olplcm8ocm93cywgY29scykpOwogICB2LmJhY2soKSA9IHg7CiAgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOwotICB2LnJlc2l6ZSgyMix5KTsKKyAgdi5yZXNpemUoMjIsIHkpOwogICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB5KTsKICAgdi5wdXNoX2JhY2soeCk7CiAgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHgpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPgotdm9pZCBjaGVja19zdGRsaXN0X3RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1UeXBlJikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPgordm9pZCBjaGVja19zdGRsaXN0X3RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1UeXBlJikgewogICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU6Ok1hdHJpeFR5cGUgTWF0cml4VHlwZTsKLSAgVHJhbnNmb3JtVHlwZSB4KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgeShNYXRyaXhUeXBlOjpSYW5kb20oKSksIHRpPVRyYW5zZm9ybVR5cGU6OklkZW50aXR5KCk7Ci0gIHN0ZDo6bGlzdDxUcmFuc2Zvcm1UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+IHYoMTAsdGkpLCB3KDIwLCB5KTsKKyAgVHJhbnNmb3JtVHlwZSB4KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgeShNYXRyaXhUeXBlOjpSYW5kb20oKSksIHRpID0gVHJhbnNmb3JtVHlwZTo6SWRlbnRpdHkoKTsKKyAgc3RkOjpsaXN0PFRyYW5zZm9ybVR5cGUsIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+IHYoMTAsIHRpKSwgdygyMCwgeSk7CiAgIHYuZnJvbnQoKSA9IHg7CiAgIHcuZnJvbnQoKSA9IHcuYmFjaygpOwogICBWRVJJRllfSVNfQVBQUk9YKHcuZnJvbnQoKSwgdy5iYWNrKCkpOwogICB2ID0gdzsKIAotICB0eXBlbmFtZSBzdGQ6Omxpc3Q8VHJhbnNmb3JtVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8VHJhbnNmb3JtVHlwZT4gPjo6aXRlcmF0b3IgdmkgPSB2LmJlZ2luKCk7Ci0gIHR5cGVuYW1lIHN0ZDo6bGlzdDxUcmFuc2Zvcm1UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+OjppdGVyYXRvciB3aSA9IHcuYmVnaW4oKTsKLSAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCi0gIHsKKyAgdHlwZW5hbWUgc3RkOjpsaXN0PFRyYW5zZm9ybVR5cGUsIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+OjppdGVyYXRvciB2aSA9IHYuYmVnaW4oKTsKKyAgdHlwZW5hbWUgc3RkOjpsaXN0PFRyYW5zZm9ybVR5cGUsIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+OjppdGVyYXRvciB3aSA9IHcuYmVnaW4oKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CiAgICAgVkVSSUZZX0lTX0FQUFJPWCgqdmksICp3aSk7CiAgICAgKyt2aTsKICAgICArK3dpOwpAQCAtNjUsNDMgKzYxLDQwIEBACiAgIHYucmVzaXplKDIxLCB0aSk7CiAgIHYuYmFjaygpID0geDsKICAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeCk7Ci0gIHYucmVzaXplKDIyLHkpOworICB2LnJlc2l6ZSgyMiwgeSk7CiAgIFZFUklGWV9JU19BUFBST1godi5iYWNrKCksIHkpOwogICB2LnB1c2hfYmFjayh4KTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgotdm9pZCBjaGVja19zdGRsaXN0X3F1YXRlcm5pb24oY29uc3QgUXVhdGVybmlvblR5cGUmKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgordm9pZCBjaGVja19zdGRsaXN0X3F1YXRlcm5pb24oY29uc3QgUXVhdGVybmlvblR5cGUmKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgUXVhdGVybmlvblR5cGU6OkNvZWZmaWNpZW50cyBDb2VmZmljaWVudHM7Ci0gIFF1YXRlcm5pb25UeXBlIHgoQ29lZmZpY2llbnRzOjpSYW5kb20oKSksIHkoQ29lZmZpY2llbnRzOjpSYW5kb20oKSksIHFpPVF1YXRlcm5pb25UeXBlOjpJZGVudGl0eSgpOwotICBzdGQ6Omxpc3Q8UXVhdGVybmlvblR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFF1YXRlcm5pb25UeXBlPiA+IHYoMTAscWkpLCB3KDIwLCB5KTsKKyAgUXVhdGVybmlvblR5cGUgeChDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgeShDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgcWkgPSBRdWF0ZXJuaW9uVHlwZTo6SWRlbnRpdHkoKTsKKyAgc3RkOjpsaXN0PFF1YXRlcm5pb25UeXBlLCBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8UXVhdGVybmlvblR5cGU+ID4gdigxMCwgcWkpLCB3KDIwLCB5KTsKICAgdi5mcm9udCgpID0geDsKICAgdy5mcm9udCgpID0gdy5iYWNrKCk7CiAgIFZFUklGWV9JU19BUFBST1gody5mcm9udCgpLCB3LmJhY2soKSk7CiAgIHYgPSB3OwogCi0gIHR5cGVuYW1lIHN0ZDo6bGlzdDxRdWF0ZXJuaW9uVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8UXVhdGVybmlvblR5cGU+ID46Oml0ZXJhdG9yIHZpID0gdi5iZWdpbigpOwotICB0eXBlbmFtZSBzdGQ6Omxpc3Q8UXVhdGVybmlvblR5cGUsRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFF1YXRlcm5pb25UeXBlPiA+OjppdGVyYXRvciB3aSA9IHcuYmVnaW4oKTsKLSAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCi0gIHsKKyAgdHlwZW5hbWUgc3RkOjpsaXN0PFF1YXRlcm5pb25UeXBlLCBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8UXVhdGVybmlvblR5cGU+ID46Oml0ZXJhdG9yIHZpID0gdi5iZWdpbigpOworICB0eXBlbmFtZSBzdGQ6Omxpc3Q8UXVhdGVybmlvblR5cGUsIEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxRdWF0ZXJuaW9uVHlwZT4gPjo6aXRlcmF0b3Igd2kgPSB3LmJlZ2luKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgIFZFUklGWV9JU19BUFBST1goKnZpLCAqd2kpOwogICAgICsrdmk7CiAgICAgKyt3aTsKICAgfQogCi0gIHYucmVzaXplKDIxLHFpKTsKKyAgdi5yZXNpemUoMjEsIHFpKTsKICAgdi5iYWNrKCkgPSB4OwogICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB4KTsKLSAgdi5yZXNpemUoMjIseSk7CisgIHYucmVzaXplKDIyLCB5KTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2LmJhY2soKSwgeSk7CiAgIHYucHVzaF9iYWNrKHgpOwogICBWRVJJRllfSVNfQVBQUk9YKHYuYmFjaygpLCB4KTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHN0ZGxpc3QpCi17CitFSUdFTl9ERUNMQVJFX1RFU1Qoc3RkbGlzdCkgewogICAvLyBzb21lIG5vbiB2ZWN0b3JpemFibGUgZml4ZWQgc2l6ZXMKICAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkbGlzdF9tYXRyaXgoVmVjdG9yMmYoKSkpOwogICBDQUxMX1NVQlRFU1RfMShjaGVja19zdGRsaXN0X21hdHJpeChNYXRyaXgzZigpKSk7CkBAIC0xMTQsMTAgKzEwNywxMCBAQAogICBDQUxMX1NVQlRFU1RfMihjaGVja19zdGRsaXN0X21hdHJpeChNYXRyaXg0ZCgpKSk7CiAKICAgLy8gc29tZSBkeW5hbWljIHNpemVzCi0gIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGxpc3RfbWF0cml4KE1hdHJpeFhkKDEsMSkpKTsKKyAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkbGlzdF9tYXRyaXgoTWF0cml4WGQoMSwgMSkpKTsKICAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkbGlzdF9tYXRyaXgoVmVjdG9yWGQoMjApKSk7CiAgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGxpc3RfbWF0cml4KFJvd1ZlY3RvclhmKDIwKSkpOwotICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRsaXN0X21hdHJpeChNYXRyaXhYY2YoMTAsMTApKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGxpc3RfbWF0cml4KE1hdHJpeFhjZigxMCwgMTApKSk7CiAKICAgLy8gc29tZSBUcmFuc2Zvcm0KICAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkbGlzdF90cmFuc2Zvcm0oQWZmaW5lMmYoKSkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9zdGRsaXN0X292ZXJsb2FkLmNwcCBiL3Rlc3Qvc3RkbGlzdF9vdmVybG9hZC5jcHAKaW5kZXggYTc4NTE2ZS4uNzc3ODFkYiAxMDA2NDQKLS0tIGEvdGVzdC9zdGRsaXN0X292ZXJsb2FkLmNwcAorKysgYi90ZXN0L3N0ZGxpc3Rfb3ZlcmxvYWQuY3BwCkBAIC0yNiwyOCArMjYsMjUgQEAKIEVJR0VOX0RFRklORV9TVExfTElTVF9TUEVDSUFMSVpBVElPTihRdWF0ZXJuaW9uZCkKIAogdGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lciwgY2xhc3MgUG9zaXRpb24+Ci10eXBlbmFtZSBDb250YWluZXI6Oml0ZXJhdG9yIGdldChDb250YWluZXIgJiBjLCBQb3NpdGlvbiBwb3NpdGlvbikKLXsKK3R5cGVuYW1lIENvbnRhaW5lcjo6aXRlcmF0b3IgZ2V0KENvbnRhaW5lciYgYywgUG9zaXRpb24gcG9zaXRpb24pIHsKICAgdHlwZW5hbWUgQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IGMuYmVnaW4oKTsKICAgc3RkOjphZHZhbmNlKGl0LCBwb3NpdGlvbik7CiAgIHJldHVybiBpdDsKIH0KIAogdGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lciwgY2xhc3MgUG9zaXRpb24sIGNsYXNzIFZhbHVlPgotdm9pZCBzZXQoQ29udGFpbmVyICYgYywgUG9zaXRpb24gcG9zaXRpb24sIGNvbnN0IFZhbHVlICYgdmFsdWUpCi17Cit2b2lkIHNldChDb250YWluZXImIGMsIFBvc2l0aW9uIHBvc2l0aW9uLCBjb25zdCBWYWx1ZSYgdmFsdWUpIHsKICAgdHlwZW5hbWUgQ29udGFpbmVyOjppdGVyYXRvciBpdCA9IGMuYmVnaW4oKTsKICAgc3RkOjphZHZhbmNlKGl0LCBwb3NpdGlvbik7CiAgICppdCA9IHZhbHVlOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCBjaGVja19zdGRsaXN0X21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX3N0ZGxpc3RfbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7Ci0gIE1hdHJpeFR5cGUgeCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpLCB5ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7Ci0gIHN0ZDo6bGlzdDxNYXRyaXhUeXBlPiB2KDEwLCBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsY29scykpLCB3KDIwLCB5KTsKKyAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCB5ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICBzdGQ6Omxpc3Q8TWF0cml4VHlwZT4gdigxMCwgTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKSksIHcoMjAsIHkpOwogICB0eXBlbmFtZSBzdGQ6Omxpc3Q8TWF0cml4VHlwZT46Oml0ZXJhdG9yIGl0diA9IGdldCh2LCA1KTsKICAgdHlwZW5hbWUgc3RkOjpsaXN0PE1hdHJpeFR5cGU+OjppdGVyYXRvciBpdHcgPSBnZXQodywgNik7CiAgICppdHYgPSB4OwpAQCAtNTYsOCArNTMsNyBAQAogICB2ID0gdzsKICAgaXR2ID0gdi5iZWdpbigpOwogICBpdHcgPSB3LmJlZ2luKCk7Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQotICB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgIFZFUklGWV9JU19BUFBST1goKml0dywgKml0dik7CiAgICAgKytpdHY7CiAgICAgKytpdHc7CkBAIC02Niw3ICs2Miw3IEBACiAgIHYucmVzaXplKDIxKTsKICAgc2V0KHYsIDIwLCB4KTsKICAgVkVSSUZZX0lTX0FQUFJPWCgqZ2V0KHYsIDIwKSwgeCk7Ci0gIHYucmVzaXplKDIyLHkpOworICB2LnJlc2l6ZSgyMiwgeSk7CiAgIFZFUklGWV9JU19BUFBST1goKmdldCh2LCAyMSksIHkpOwogICB2LnB1c2hfYmFjayh4KTsKICAgVkVSSUZZX0lTX0FQUFJPWCgqZ2V0KHYsIDIyKSwgeCk7CkBAIC03NCwyMCArNzAsMTcgQEAKICAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgbGlzdCBnZXRzIGludGVybmFsbHkgcmVzaXplZAogICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQogICBNYXRyaXhUeXBlKiByZWYgPSAmKCpnZXQodywgMCkpOwotICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JigqZ2V0KHcsIDApKSkgJiYgaTwzMDApOyArK2kpCi0gICAgdi5wdXNoX2JhY2soKmdldCh3LCBpJXcuc2l6ZSgpKSk7Ci0gIGZvcih1bnNpZ25lZCBpbnQgaT0yMzsgaTx2LnNpemUoKTsgKytpKQotICB7Ci0gICAgVkVSSUZZKCgqZ2V0KHYsIGkpKT09KCpnZXQodywgKGktMjMpJXcuc2l6ZSgpKSkpOworICBmb3IgKGludCBpID0gMDsgaSA8IDMwIHx8ICgocmVmID09ICYoKmdldCh3LCAwKSkpICYmIGkgPCAzMDApOyArK2kpIHYucHVzaF9iYWNrKCpnZXQodywgaSAlIHcuc2l6ZSgpKSk7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAyMzsgaSA8IHYuc2l6ZSgpOyArK2kpIHsKKyAgICBWRVJJRlkoKCpnZXQodiwgaSkpID09ICgqZ2V0KHcsIChpIC0gMjMpICUgdy5zaXplKCkpKSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KLXZvaWQgY2hlY2tfc3RkbGlzdF90cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtVHlwZSYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KK3ZvaWQgY2hlY2tfc3RkbGlzdF90cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtVHlwZSYpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7Ci0gIFRyYW5zZm9ybVR5cGUgeChNYXRyaXhUeXBlOjpSYW5kb20oKSksIHkoTWF0cml4VHlwZTo6UmFuZG9tKCkpLCB0aT1UcmFuc2Zvcm1UeXBlOjpJZGVudGl0eSgpOwotICBzdGQ6Omxpc3Q8VHJhbnNmb3JtVHlwZT4gdigxMCx0aSksIHcoMjAsIHkpOworICBUcmFuc2Zvcm1UeXBlIHgoTWF0cml4VHlwZTo6UmFuZG9tKCkpLCB5KE1hdHJpeFR5cGU6OlJhbmRvbSgpKSwgdGkgPSBUcmFuc2Zvcm1UeXBlOjpJZGVudGl0eSgpOworICBzdGQ6Omxpc3Q8VHJhbnNmb3JtVHlwZT4gdigxMCwgdGkpLCB3KDIwLCB5KTsKICAgdHlwZW5hbWUgc3RkOjpsaXN0PFRyYW5zZm9ybVR5cGU+OjppdGVyYXRvciBpdHYgPSBnZXQodiwgNSk7CiAgIHR5cGVuYW1lIHN0ZDo6bGlzdDxUcmFuc2Zvcm1UeXBlPjo6aXRlcmF0b3IgaXR3ID0gZ2V0KHcsIDYpOwogICAqaXR2ID0geDsKQEAgLTk2LDggKzg5LDcgQEAKICAgdiA9IHc7CiAgIGl0diA9IHYuYmVnaW4oKTsKICAgaXR3ID0gdy5iZWdpbigpOwotICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKLSAgeworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKICAgICBWRVJJRllfSVNfQVBQUk9YKCppdHcsICppdHYpOwogICAgICsraXR2OwogICAgICsraXR3OwpAQCAtMTA2LDcgKzk4LDcgQEAKICAgdi5yZXNpemUoMjEsIHRpKTsKICAgc2V0KHYsIDIwLCB4KTsKICAgVkVSSUZZX0lTX0FQUFJPWCgqZ2V0KHYsIDIwKSwgeCk7Ci0gIHYucmVzaXplKDIyLHkpOworICB2LnJlc2l6ZSgyMiwgeSk7CiAgIFZFUklGWV9JU19BUFBST1goKmdldCh2LCAyMSksIHkpOwogICB2LnB1c2hfYmFjayh4KTsKICAgVkVSSUZZX0lTX0FQUFJPWCgqZ2V0KHYsIDIyKSwgeCk7CkBAIC0xMTQsMjAgKzEwNiwxNyBAQAogICAvLyBkbyBhIGxvdCBvZiBwdXNoX2JhY2sgc3VjaCB0aGF0IHRoZSBsaXN0IGdldHMgaW50ZXJuYWxseSByZXNpemVkCiAgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCiAgIFRyYW5zZm9ybVR5cGUqIHJlZiA9ICYoKmdldCh3LCAwKSk7Ci0gIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0mKCpnZXQodywgMCkpKSAmJiBpPDMwMCk7ICsraSkKLSAgICB2LnB1c2hfYmFjaygqZ2V0KHcsIGkldy5zaXplKCkpKTsKLSAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCi0gIHsKLSAgICBWRVJJRlkoZ2V0KHYsIGkpLT5tYXRyaXgoKT09Z2V0KHcsIChpLTIzKSV3LnNpemUoKSktPm1hdHJpeCgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMCB8fCAoKHJlZiA9PSAmKCpnZXQodywgMCkpKSAmJiBpIDwgMzAwKTsgKytpKSB2LnB1c2hfYmFjaygqZ2V0KHcsIGkgJSB3LnNpemUoKSkpOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMjM7IGkgPCB2LnNpemUoKTsgKytpKSB7CisgICAgVkVSSUZZKGdldCh2LCBpKS0+bWF0cml4KCkgPT0gZ2V0KHcsIChpIC0gMjMpICUgdy5zaXplKCkpLT5tYXRyaXgoKSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgUXVhdGVybmlvblR5cGU+Ci12b2lkIGNoZWNrX3N0ZGxpc3RfcXVhdGVybmlvbihjb25zdCBRdWF0ZXJuaW9uVHlwZSYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUXVhdGVybmlvblR5cGU+Cit2b2lkIGNoZWNrX3N0ZGxpc3RfcXVhdGVybmlvbihjb25zdCBRdWF0ZXJuaW9uVHlwZSYpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZTo6Q29lZmZpY2llbnRzIENvZWZmaWNpZW50czsKLSAgUXVhdGVybmlvblR5cGUgeChDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgeShDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgcWk9UXVhdGVybmlvblR5cGU6OklkZW50aXR5KCk7Ci0gIHN0ZDo6bGlzdDxRdWF0ZXJuaW9uVHlwZT4gdigxMCxxaSksIHcoMjAsIHkpOworICBRdWF0ZXJuaW9uVHlwZSB4KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCB5KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCBxaSA9IFF1YXRlcm5pb25UeXBlOjpJZGVudGl0eSgpOworICBzdGQ6Omxpc3Q8UXVhdGVybmlvblR5cGU+IHYoMTAsIHFpKSwgdygyMCwgeSk7CiAgIHR5cGVuYW1lIHN0ZDo6bGlzdDxRdWF0ZXJuaW9uVHlwZT46Oml0ZXJhdG9yIGl0diA9IGdldCh2LCA1KTsKICAgdHlwZW5hbWUgc3RkOjpsaXN0PFF1YXRlcm5pb25UeXBlPjo6aXRlcmF0b3IgaXR3ID0gZ2V0KHcsIDYpOwogICAqaXR2ID0geDsKQEAgLTEzNiwxNyArMTI1LDE2IEBACiAgIHYgPSB3OwogICBpdHYgPSB2LmJlZ2luKCk7CiAgIGl0dyA9IHcuYmVnaW4oKTsKLSAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCi0gIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CiAgICAgVkVSSUZZX0lTX0FQUFJPWCgqaXR3LCAqaXR2KTsKICAgICArK2l0djsKICAgICArK2l0dzsKICAgfQogCi0gIHYucmVzaXplKDIxLHFpKTsKKyAgdi5yZXNpemUoMjEsIHFpKTsKICAgc2V0KHYsIDIwLCB4KTsKICAgVkVSSUZZX0lTX0FQUFJPWCgqZ2V0KHYsIDIwKSwgeCk7Ci0gIHYucmVzaXplKDIyLHkpOworICB2LnJlc2l6ZSgyMiwgeSk7CiAgIFZFUklGWV9JU19BUFBST1goKmdldCh2LCAyMSksIHkpOwogICB2LnB1c2hfYmFjayh4KTsKICAgVkVSSUZZX0lTX0FQUFJPWCgqZ2V0KHYsIDIyKSwgeCk7CkBAIC0xNTQsMTYgKzE0MiwxMyBAQAogICAvLyBkbyBhIGxvdCBvZiBwdXNoX2JhY2sgc3VjaCB0aGF0IHRoZSBsaXN0IGdldHMgaW50ZXJuYWxseSByZXNpemVkCiAgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCiAgIFF1YXRlcm5pb25UeXBlKiByZWYgPSAmKCpnZXQodywgMCkpOwotICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JigqZ2V0KHcsIDApKSkgJiYgaTwzMDApOyArK2kpCi0gICAgdi5wdXNoX2JhY2soKmdldCh3LCBpJXcuc2l6ZSgpKSk7Ci0gIGZvcih1bnNpZ25lZCBpbnQgaT0yMzsgaTx2LnNpemUoKTsgKytpKQotICB7Ci0gICAgVkVSSUZZKGdldCh2LCBpKS0+Y29lZmZzKCk9PWdldCh3LCAoaS0yMykldy5zaXplKCkpLT5jb2VmZnMoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzAgfHwgKChyZWYgPT0gJigqZ2V0KHcsIDApKSkgJiYgaSA8IDMwMCk7ICsraSkgdi5wdXNoX2JhY2soKmdldCh3LCBpICUgdy5zaXplKCkpKTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDIzOyBpIDwgdi5zaXplKCk7ICsraSkgeworICAgIFZFUklGWShnZXQodiwgaSktPmNvZWZmcygpID09IGdldCh3LCAoaSAtIDIzKSAlIHcuc2l6ZSgpKS0+Y29lZmZzKCkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChzdGRsaXN0X292ZXJsb2FkKQoteworRUlHRU5fREVDTEFSRV9URVNUKHN0ZGxpc3Rfb3ZlcmxvYWQpIHsKICAgLy8gc29tZSBub24gdmVjdG9yaXphYmxlIGZpeGVkIHNpemVzCiAgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZGxpc3RfbWF0cml4KFZlY3RvcjJmKCkpKTsKICAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkbGlzdF9tYXRyaXgoTWF0cml4M2YoKSkpOwpAQCAtMTc2LDEzICsxNjEsMTMgQEAKICAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkbGlzdF9tYXRyaXgoTWF0cml4NGQoKSkpOwogCiAgIC8vIHNvbWUgZHluYW1pYyBzaXplcwotICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRsaXN0X21hdHJpeChNYXRyaXhYZCgxLDEpKSk7CisgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGxpc3RfbWF0cml4KE1hdHJpeFhkKDEsIDEpKSk7CiAgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZGxpc3RfbWF0cml4KFZlY3RvclhkKDIwKSkpOwogICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRsaXN0X21hdHJpeChSb3dWZWN0b3JYZigyMCkpKTsKLSAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfc3RkbGlzdF9tYXRyaXgoTWF0cml4WGNmKDEwLDEwKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGRsaXN0X21hdHJpeChNYXRyaXhYY2YoMTAsIDEwKSkpOwogCiAgIC8vIHNvbWUgVHJhbnNmb3JtCi0gIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZGxpc3RfdHJhbnNmb3JtKEFmZmluZTJmKCkpKTsgLy8gZG9lcyBub3QgbmVlZCB0aGUgc3BlY2lhbGl6YXRpb24gKDIrMSleMiA9IDkKKyAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkbGlzdF90cmFuc2Zvcm0oQWZmaW5lMmYoKSkpOyAgLy8gZG9lcyBub3QgbmVlZCB0aGUgc3BlY2lhbGl6YXRpb24gKDIrMSleMiA9IDkKICAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkbGlzdF90cmFuc2Zvcm0oQWZmaW5lM2YoKSkpOwogICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGRsaXN0X3RyYW5zZm9ybShBZmZpbmUzZCgpKSk7CiAKZGlmZiAtLWdpdCBhL3Rlc3Qvc3RkdmVjdG9yLmNwcCBiL3Rlc3Qvc3RkdmVjdG9yLmNwcAppbmRleCAxZDQ0ZTQyLi45M2FjZmE1IDEwMDY0NAotLS0gYS90ZXN0L3N0ZHZlY3Rvci5jcHAKKysrIGIvdGVzdC9zdGR2ZWN0b3IuY3BwCkBAIC0xMSwxMjQgKzExLDExMCBAQAogI2luY2x1ZGUgPEVpZ2VuL1N0ZFZlY3Rvcj4KICNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXZvaWQgY2hlY2tfc3RkdmVjdG9yX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKLSAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKLSAgc3RkOjp2ZWN0b3I8TWF0cml4VHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8TWF0cml4VHlwZT4gPiB2KDEwLCBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsY29scykpLCB3KDIwLCB5KTsKKyAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCB5ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICBzdGQ6OnZlY3RvcjxNYXRyaXhUeXBlLCBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8TWF0cml4VHlwZT4gPiB2KDEwLCBNYXRyaXhUeXBlOjpaZXJvKHJvd3MsIGNvbHMpKSwgdygyMCwgeSk7CiAgIHZbNV0gPSB4OwogICB3WzZdID0gdls1XTsKICAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKICAgdiA9IHc7Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQotICB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CiAgIH0KIAogICB2LnJlc2l6ZSgyMSk7CiAgIHZbMjBdID0geDsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7Ci0gIHYucmVzaXplKDIyLHkpOworICB2LnJlc2l6ZSgyMiwgeSk7CiAgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOwogICB2LnB1c2hfYmFjayh4KTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7Ci0gIFZFUklGWSgoc3RkOjp1aW50cHRyX3QpJih2WzIyXSkgPT0gKHN0ZDo6dWludHB0cl90KSYodlsyMV0pICsgc2l6ZW9mKE1hdHJpeFR5cGUpKTsKKyAgVkVSSUZZKChzdGQ6OnVpbnRwdHJfdCkgJiAodlsyMl0pID09IChzdGQ6OnVpbnRwdHJfdCkgJiAodlsyMV0pICsgc2l6ZW9mKE1hdHJpeFR5cGUpKTsKIAogICAvLyBkbyBhIGxvdCBvZiBwdXNoX2JhY2sgc3VjaCB0aGF0IHRoZSB2ZWN0b3IgZ2V0cyBpbnRlcm5hbGx5IHJlc2l6ZWQKICAgLy8gKHdpdGggbWVtb3J5IHJlYWxsb2NhdGlvbikKICAgTWF0cml4VHlwZSogcmVmID0gJndbMF07Ci0gIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0md1swXSkgJiYgaTwzMDApOyArK2kpCi0gICAgdi5wdXNoX2JhY2sod1tpJXcuc2l6ZSgpXSk7Ci0gIGZvcih1bnNpZ25lZCBpbnQgaT0yMzsgaTx2LnNpemUoKTsgKytpKQotICB7Ci0gICAgVkVSSUZZKHZbaV09PXdbKGktMjMpJXcuc2l6ZSgpXSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzAgfHwgKChyZWYgPT0gJndbMF0pICYmIGkgPCAzMDApOyArK2kpIHYucHVzaF9iYWNrKHdbaSAlIHcuc2l6ZSgpXSk7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAyMzsgaSA8IHYuc2l6ZSgpOyArK2kpIHsKKyAgICBWRVJJRlkodltpXSA9PSB3WyhpIC0gMjMpICUgdy5zaXplKCldKTsKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPgotdm9pZCBjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybVR5cGUmKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFRyYW5zZm9ybVR5cGU+Cit2b2lkIGNoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtVHlwZSYpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlOjpNYXRyaXhUeXBlIE1hdHJpeFR5cGU7CiAgIFRyYW5zZm9ybVR5cGUgeChNYXRyaXhUeXBlOjpSYW5kb20oKSksIHkoTWF0cml4VHlwZTo6UmFuZG9tKCkpOwotICBzdGQ6OnZlY3RvcjxUcmFuc2Zvcm1UeXBlLEVpZ2VuOjphbGlnbmVkX2FsbG9jYXRvcjxUcmFuc2Zvcm1UeXBlPiA+IHYoMTApLCB3KDIwLCB5KTsKKyAgc3RkOjp2ZWN0b3I8VHJhbnNmb3JtVHlwZSwgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFRyYW5zZm9ybVR5cGU+ID4gdigxMCksIHcoMjAsIHkpOwogICB2WzVdID0geDsKICAgd1s2XSA9IHZbNV07CiAgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CiAgIHYgPSB3OwotICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKLSAgeworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKICAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHZbaV0pOwogICB9CiAKICAgdi5yZXNpemUoMjEpOwogICB2WzIwXSA9IHg7CiAgIFZFUklGWV9JU19BUFBST1godlsyMF0sIHgpOwotICB2LnJlc2l6ZSgyMix5KTsKKyAgdi5yZXNpemUoMjIsIHkpOwogICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKICAgdi5wdXNoX2JhY2soeCk7CiAgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOwotICBWRVJJRlkoKHN0ZDo6dWludHB0cl90KSYodlsyMl0pID09IChzdGQ6OnVpbnRwdHJfdCkmKHZbMjFdKSArIHNpemVvZihUcmFuc2Zvcm1UeXBlKSk7CisgIFZFUklGWSgoc3RkOjp1aW50cHRyX3QpICYgKHZbMjJdKSA9PSAoc3RkOjp1aW50cHRyX3QpICYgKHZbMjFdKSArIHNpemVvZihUcmFuc2Zvcm1UeXBlKSk7CiAKICAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCiAgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCiAgIFRyYW5zZm9ybVR5cGUqIHJlZiA9ICZ3WzBdOwotICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQotICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOwotICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKLSAgewotICAgIFZFUklGWSh2W2ldLm1hdHJpeCgpPT13WyhpLTIzKSV3LnNpemUoKV0ubWF0cml4KCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IDMwIHx8ICgocmVmID09ICZ3WzBdKSAmJiBpIDwgMzAwKTsgKytpKSB2LnB1c2hfYmFjayh3W2kgJSB3LnNpemUoKV0pOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMjM7IGkgPCB2LnNpemUoKTsgKytpKSB7CisgICAgVkVSSUZZKHZbaV0ubWF0cml4KCkgPT0gd1soaSAtIDIzKSAlIHcuc2l6ZSgpXS5tYXRyaXgoKSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgUXVhdGVybmlvblR5cGU+Ci12b2lkIGNoZWNrX3N0ZHZlY3Rvcl9xdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb25UeXBlJikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBRdWF0ZXJuaW9uVHlwZT4KK3ZvaWQgY2hlY2tfc3RkdmVjdG9yX3F1YXRlcm5pb24oY29uc3QgUXVhdGVybmlvblR5cGUmKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgUXVhdGVybmlvblR5cGU6OkNvZWZmaWNpZW50cyBDb2VmZmljaWVudHM7Ci0gIFF1YXRlcm5pb25UeXBlIHgoQ29lZmZpY2llbnRzOjpSYW5kb20oKSksIHkoQ29lZmZpY2llbnRzOjpSYW5kb20oKSksIHFpPVF1YXRlcm5pb25UeXBlOjpJZGVudGl0eSgpOwotICBzdGQ6OnZlY3RvcjxRdWF0ZXJuaW9uVHlwZSxFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8UXVhdGVybmlvblR5cGU+ID4gdigxMCxxaSksIHcoMjAsIHkpOworICBRdWF0ZXJuaW9uVHlwZSB4KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCB5KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCBxaSA9IFF1YXRlcm5pb25UeXBlOjpJZGVudGl0eSgpOworICBzdGQ6OnZlY3RvcjxRdWF0ZXJuaW9uVHlwZSwgRWlnZW46OmFsaWduZWRfYWxsb2NhdG9yPFF1YXRlcm5pb25UeXBlPiA+IHYoMTAsIHFpKSwgdygyMCwgeSk7CiAgIHZbNV0gPSB4OwogICB3WzZdID0gdls1XTsKICAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKICAgdiA9IHc7Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQotICB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CiAgIH0KIAogICB2LnJlc2l6ZSgyMSk7CiAgIHZbMjBdID0geDsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7Ci0gIHYucmVzaXplKDIyLHkpOworICB2LnJlc2l6ZSgyMiwgeSk7CiAgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOwogICB2LnB1c2hfYmFjayh4KTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7Ci0gIFZFUklGWSgoc3RkOjp1aW50cHRyX3QpJih2WzIyXSkgPT0gKHN0ZDo6dWludHB0cl90KSYodlsyMV0pICsgc2l6ZW9mKFF1YXRlcm5pb25UeXBlKSk7CisgIFZFUklGWSgoc3RkOjp1aW50cHRyX3QpICYgKHZbMjJdKSA9PSAoc3RkOjp1aW50cHRyX3QpICYgKHZbMjFdKSArIHNpemVvZihRdWF0ZXJuaW9uVHlwZSkpOwogCiAgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIHZlY3RvciBnZXRzIGludGVybmFsbHkgcmVzaXplZAogICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQogICBRdWF0ZXJuaW9uVHlwZSogcmVmID0gJndbMF07Ci0gIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0md1swXSkgJiYgaTwzMDApOyArK2kpCi0gICAgdi5wdXNoX2JhY2sod1tpJXcuc2l6ZSgpXSk7Ci0gIGZvcih1bnNpZ25lZCBpbnQgaT0yMzsgaTx2LnNpemUoKTsgKytpKQotICB7Ci0gICAgVkVSSUZZKHZbaV0uY29lZmZzKCk9PXdbKGktMjMpJXcuc2l6ZSgpXS5jb2VmZnMoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzAgfHwgKChyZWYgPT0gJndbMF0pICYmIGkgPCAzMDApOyArK2kpIHYucHVzaF9iYWNrKHdbaSAlIHcuc2l6ZSgpXSk7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAyMzsgaSA8IHYuc2l6ZSgpOyArK2kpIHsKKyAgICBWRVJJRlkodltpXS5jb2VmZnMoKSA9PSB3WyhpIC0gMjMpICUgdy5zaXplKCldLmNvZWZmcygpKTsKICAgfQogfQogCiAvLyB0aGUgY29kZSBiZWxvdyB0cmlnZ2VyZWQgYW4gaW52YWxpZCB3YXJuaW5nIHdpdGggZ2NjID49IDcKLS8vIGVpZ2VuL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTWVtb3J5Lmg6MTg5OjEyOiB3YXJuaW5nOiBhcmd1bWVudCAxIHZhbHVlICcxODQ0Njc0NDA3MzcwOTU1MTYxMicgZXhjZWVkcyBtYXhpbXVtIG9iamVjdCBzaXplIDkyMjMzNzIwMzY4NTQ3NzU4MDcKLS8vIFRoaXMgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gZ2NjIHRoZXJlOiBodHRwczovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD04NzU0NAotdm9pZCBzdGRfdmVjdG9yX2djY193YXJuaW5nKCkKLXsKKy8vIGVpZ2VuL0VpZ2VuL3NyYy9Db3JlL3V0aWwvTWVtb3J5Lmg6MTg5OjEyOiB3YXJuaW5nOiBhcmd1bWVudCAxIHZhbHVlICcxODQ0Njc0NDA3MzcwOTU1MTYxMicgZXhjZWVkcyBtYXhpbXVtIG9iamVjdAorLy8gc2l6ZSA5MjIzMzcyMDM2ODU0Nzc1ODA3IFRoaXMgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gZ2NjIHRoZXJlOiBodHRwczovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD04NzU0NAordm9pZCBzdGRfdmVjdG9yX2djY193YXJuaW5nKCkgewogICB0eXBlZGVmIEVpZ2VuOjpWZWN0b3IzZiBUOwogICBzdGQ6OnZlY3RvcjxULCBFaWdlbjo6YWxpZ25lZF9hbGxvY2F0b3I8VD4gPiB2OwotICB2LnB1c2hfYmFjayhUKDEuMGYsMi4wZiwzLjBmKSk7CisgIHYucHVzaF9iYWNrKFQoMS4wZiwgMi4wZiwgMy4wZikpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1Qoc3RkdmVjdG9yKQoteworRUlHRU5fREVDTEFSRV9URVNUKHN0ZHZlY3RvcikgewogICAvLyBzb21lIG5vbiB2ZWN0b3JpemFibGUgZml4ZWQgc2l6ZXMKICAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChWZWN0b3IyZigpKSk7CiAgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4M2YoKSkpOwpAQCAtMTQxLDE2ICsxMjcsMTYgQEAKICAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXg0ZCgpKSk7CiAKICAgLy8gc29tZSBkeW5hbWljIHNpemVzCi0gIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4WGQoMSwxKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeFhkKDEsIDEpKSk7CiAgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoVmVjdG9yWGQoMjApKSk7CiAgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoUm93VmVjdG9yWGYoMjApKSk7Ci0gIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4WGNmKDEwLDEwKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeFhjZigxMCwgMTApKSk7CiAKICAgLy8gc29tZSBUcmFuc2Zvcm0KICAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkdmVjdG9yX3RyYW5zZm9ybShQcm9qZWN0aXZlMmYoKSkpOwogICBDQUxMX1NVQlRFU1RfNChjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKFByb2plY3RpdmUzZigpKSk7CiAgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oUHJvamVjdGl2ZTNkKCkpKTsKLSAgLy9DQUxMX1NVQlRFU1QoaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKFByb2plY3RpdmU0ZCgpKSk7CisgIC8vIENBTExfU1VCVEVTVChoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oUHJvamVjdGl2ZTRkKCkpKTsKIAogICAvLyBzb21lIFF1YXRlcm5pb24KICAgQ0FMTF9TVUJURVNUXzUoY2hlY2tfc3RkdmVjdG9yX3F1YXRlcm5pb24oUXVhdGVybmlvbmYoKSkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9zdGR2ZWN0b3Jfb3ZlcmxvYWQuY3BwIGIvdGVzdC9zdGR2ZWN0b3Jfb3ZlcmxvYWQuY3BwCmluZGV4IDJmYmJiMzEuLjU3ZDA2Y2EgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc3RkdmVjdG9yX292ZXJsb2FkLmNwcAorKysgYi90ZXN0L3N0ZHZlY3Rvcl9vdmVybG9hZC5jcHAKQEAgLTI1LDQ1ICsyNSw0MCBAQAogRUlHRU5fREVGSU5FX1NUTF9WRUNUT1JfU1BFQ0lBTElaQVRJT04oUXVhdGVybmlvbmYpCiBFSUdFTl9ERUZJTkVfU1RMX1ZFQ1RPUl9TUEVDSUFMSVpBVElPTihRdWF0ZXJuaW9uZCkKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXZvaWQgY2hlY2tfc3RkdmVjdG9yX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKLSAgTWF0cml4VHlwZSB4ID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyksIHkgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKLSAgc3RkOjp2ZWN0b3I8TWF0cml4VHlwZT4gdigxMCwgTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpKSwgdygyMCwgeSk7CisgIE1hdHJpeFR5cGUgeCA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgeSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgc3RkOjp2ZWN0b3I8TWF0cml4VHlwZT4gdigxMCwgTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKSksIHcoMjAsIHkpOwogICB2WzVdID0geDsKICAgd1s2XSA9IHZbNV07CiAgIFZFUklGWV9JU19BUFBST1god1s2XSwgdls1XSk7CiAgIHYgPSB3OwotICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykKLSAgeworICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKICAgICBWRVJJRllfSVNfQVBQUk9YKHdbaV0sIHZbaV0pOwogICB9CiAKICAgdi5yZXNpemUoMjEpOwogICB2WzIwXSA9IHg7CiAgIFZFUklGWV9JU19BUFBST1godlsyMF0sIHgpOwotICB2LnJlc2l6ZSgyMix5KTsKKyAgdi5yZXNpemUoMjIsIHkpOwogICBWRVJJRllfSVNfQVBQUk9YKHZbMjFdLCB5KTsKICAgdi5wdXNoX2JhY2soeCk7CiAgIFZFUklGWV9JU19BUFBST1godlsyMl0sIHgpOwotICBWRVJJRlkoKHN0ZDo6dWludHB0cl90KSYodlsyMl0pID09IChzdGQ6OnVpbnRwdHJfdCkmKHZbMjFdKSArIHNpemVvZihNYXRyaXhUeXBlKSk7CisgIFZFUklGWSgoc3RkOjp1aW50cHRyX3QpICYgKHZbMjJdKSA9PSAoc3RkOjp1aW50cHRyX3QpICYgKHZbMjFdKSArIHNpemVvZihNYXRyaXhUeXBlKSk7CiAKICAgLy8gZG8gYSBsb3Qgb2YgcHVzaF9iYWNrIHN1Y2ggdGhhdCB0aGUgdmVjdG9yIGdldHMgaW50ZXJuYWxseSByZXNpemVkCiAgIC8vICh3aXRoIG1lbW9yeSByZWFsbG9jYXRpb24pCiAgIE1hdHJpeFR5cGUqIHJlZiA9ICZ3WzBdOwotICBmb3IoaW50IGk9MDsgaTwzMCB8fCAoKHJlZj09JndbMF0pICYmIGk8MzAwKTsgKytpKQotICAgIHYucHVzaF9iYWNrKHdbaSV3LnNpemUoKV0pOwotICBmb3IodW5zaWduZWQgaW50IGk9MjM7IGk8di5zaXplKCk7ICsraSkKLSAgewotICAgIFZFUklGWSh2W2ldPT13WyhpLTIzKSV3LnNpemUoKV0pOworICBmb3IgKGludCBpID0gMDsgaSA8IDMwIHx8ICgocmVmID09ICZ3WzBdKSAmJiBpIDwgMzAwKTsgKytpKSB2LnB1c2hfYmFjayh3W2kgJSB3LnNpemUoKV0pOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMjM7IGkgPCB2LnNpemUoKTsgKytpKSB7CisgICAgVkVSSUZZKHZbaV0gPT0gd1soaSAtIDIzKSAlIHcuc2l6ZSgpXSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVHJhbnNmb3JtVHlwZT4KLXZvaWQgY2hlY2tfc3RkdmVjdG9yX3RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1UeXBlJikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUcmFuc2Zvcm1UeXBlPgordm9pZCBjaGVja19zdGR2ZWN0b3JfdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybVR5cGUmKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVHJhbnNmb3JtVHlwZTo6TWF0cml4VHlwZSBNYXRyaXhUeXBlOwogICBUcmFuc2Zvcm1UeXBlIHgoTWF0cml4VHlwZTo6UmFuZG9tKCkpLCB5KE1hdHJpeFR5cGU6OlJhbmRvbSgpKTsKICAgc3RkOjp2ZWN0b3I8VHJhbnNmb3JtVHlwZT4gdigxMCksIHcoMjAsIHkpOwpAQCAtNzEsNjggKzY2LDYwIEBACiAgIHdbNl0gPSB2WzVdOwogICBWRVJJRllfSVNfQVBQUk9YKHdbNl0sIHZbNV0pOwogICB2ID0gdzsKLSAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspCi0gIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CiAgICAgVkVSSUZZX0lTX0FQUFJPWCh3W2ldLCB2W2ldKTsKICAgfQogCiAgIHYucmVzaXplKDIxKTsKICAgdlsyMF0gPSB4OwogICBWRVJJRllfSVNfQVBQUk9YKHZbMjBdLCB4KTsKLSAgdi5yZXNpemUoMjIseSk7CisgIHYucmVzaXplKDIyLCB5KTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIxXSwgeSk7CiAgIHYucHVzaF9iYWNrKHgpOwogICBWRVJJRllfSVNfQVBQUk9YKHZbMjJdLCB4KTsKLSAgVkVSSUZZKChzdGQ6OnVpbnRwdHJfdCkmKHZbMjJdKSA9PSAoc3RkOjp1aW50cHRyX3QpJih2WzIxXSkgKyBzaXplb2YoVHJhbnNmb3JtVHlwZSkpOworICBWRVJJRlkoKHN0ZDo6dWludHB0cl90KSAmICh2WzIyXSkgPT0gKHN0ZDo6dWludHB0cl90KSAmICh2WzIxXSkgKyBzaXplb2YoVHJhbnNmb3JtVHlwZSkpOwogCiAgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIHZlY3RvciBnZXRzIGludGVybmFsbHkgcmVzaXplZAogICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQogICBUcmFuc2Zvcm1UeXBlKiByZWYgPSAmd1swXTsKLSAgZm9yKGludCBpPTA7IGk8MzAgfHwgKChyZWY9PSZ3WzBdKSAmJiBpPDMwMCk7ICsraSkKLSAgICB2LnB1c2hfYmFjayh3W2kldy5zaXplKCldKTsKLSAgZm9yKHVuc2lnbmVkIGludCBpPTIzOyBpPHYuc2l6ZSgpOyArK2kpCi0gIHsKLSAgICBWRVJJRlkodltpXS5tYXRyaXgoKT09d1soaS0yMykldy5zaXplKCldLm1hdHJpeCgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMCB8fCAoKHJlZiA9PSAmd1swXSkgJiYgaSA8IDMwMCk7ICsraSkgdi5wdXNoX2JhY2sod1tpICUgdy5zaXplKCldKTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDIzOyBpIDwgdi5zaXplKCk7ICsraSkgeworICAgIFZFUklGWSh2W2ldLm1hdHJpeCgpID09IHdbKGkgLSAyMykgJSB3LnNpemUoKV0ubWF0cml4KCkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlPgotdm9pZCBjaGVja19zdGR2ZWN0b3JfcXVhdGVybmlvbihjb25zdCBRdWF0ZXJuaW9uVHlwZSYpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUXVhdGVybmlvblR5cGU+Cit2b2lkIGNoZWNrX3N0ZHZlY3Rvcl9xdWF0ZXJuaW9uKGNvbnN0IFF1YXRlcm5pb25UeXBlJikgewogICB0eXBlZGVmIHR5cGVuYW1lIFF1YXRlcm5pb25UeXBlOjpDb2VmZmljaWVudHMgQ29lZmZpY2llbnRzOwotICBRdWF0ZXJuaW9uVHlwZSB4KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCB5KENvZWZmaWNpZW50czo6UmFuZG9tKCkpLCBxaT1RdWF0ZXJuaW9uVHlwZTo6SWRlbnRpdHkoKTsKLSAgc3RkOjp2ZWN0b3I8UXVhdGVybmlvblR5cGU+IHYoMTAscWkpLCB3KDIwLCB5KTsKKyAgUXVhdGVybmlvblR5cGUgeChDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgeShDb2VmZmljaWVudHM6OlJhbmRvbSgpKSwgcWkgPSBRdWF0ZXJuaW9uVHlwZTo6SWRlbnRpdHkoKTsKKyAgc3RkOjp2ZWN0b3I8UXVhdGVybmlvblR5cGU+IHYoMTAsIHFpKSwgdygyMCwgeSk7CiAgIHZbNV0gPSB4OwogICB3WzZdID0gdls1XTsKICAgVkVSSUZZX0lTX0FQUFJPWCh3WzZdLCB2WzVdKTsKICAgdiA9IHc7Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKQotICB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgIFZFUklGWV9JU19BUFBST1god1tpXSwgdltpXSk7CiAgIH0KIAogICB2LnJlc2l6ZSgyMSk7CiAgIHZbMjBdID0geDsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIwXSwgeCk7Ci0gIHYucmVzaXplKDIyLHkpOworICB2LnJlc2l6ZSgyMiwgeSk7CiAgIFZFUklGWV9JU19BUFBST1godlsyMV0sIHkpOwogICB2LnB1c2hfYmFjayh4KTsKICAgVkVSSUZZX0lTX0FQUFJPWCh2WzIyXSwgeCk7Ci0gIFZFUklGWSgoc3RkOjp1aW50cHRyX3QpJih2WzIyXSkgPT0gKHN0ZDo6dWludHB0cl90KSYodlsyMV0pICsgc2l6ZW9mKFF1YXRlcm5pb25UeXBlKSk7CisgIFZFUklGWSgoc3RkOjp1aW50cHRyX3QpICYgKHZbMjJdKSA9PSAoc3RkOjp1aW50cHRyX3QpICYgKHZbMjFdKSArIHNpemVvZihRdWF0ZXJuaW9uVHlwZSkpOwogCiAgIC8vIGRvIGEgbG90IG9mIHB1c2hfYmFjayBzdWNoIHRoYXQgdGhlIHZlY3RvciBnZXRzIGludGVybmFsbHkgcmVzaXplZAogICAvLyAod2l0aCBtZW1vcnkgcmVhbGxvY2F0aW9uKQogICBRdWF0ZXJuaW9uVHlwZSogcmVmID0gJndbMF07Ci0gIGZvcihpbnQgaT0wOyBpPDMwIHx8ICgocmVmPT0md1swXSkgJiYgaTwzMDApOyArK2kpCi0gICAgdi5wdXNoX2JhY2sod1tpJXcuc2l6ZSgpXSk7Ci0gIGZvcih1bnNpZ25lZCBpbnQgaT0yMzsgaTx2LnNpemUoKTsgKytpKQotICB7Ci0gICAgVkVSSUZZKHZbaV0uY29lZmZzKCk9PXdbKGktMjMpJXcuc2l6ZSgpXS5jb2VmZnMoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzAgfHwgKChyZWYgPT0gJndbMF0pICYmIGkgPCAzMDApOyArK2kpIHYucHVzaF9iYWNrKHdbaSAlIHcuc2l6ZSgpXSk7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAyMzsgaSA8IHYuc2l6ZSgpOyArK2kpIHsKKyAgICBWRVJJRlkodltpXS5jb2VmZnMoKSA9PSB3WyhpIC0gMjMpICUgdy5zaXplKCldLmNvZWZmcygpKTsKICAgfQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1Qoc3RkdmVjdG9yX292ZXJsb2FkKQoteworRUlHRU5fREVDTEFSRV9URVNUKHN0ZHZlY3Rvcl9vdmVybG9hZCkgewogICAvLyBzb21lIG5vbiB2ZWN0b3JpemFibGUgZml4ZWQgc2l6ZXMKICAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChWZWN0b3IyZigpKSk7CiAgIENBTExfU1VCVEVTVF8xKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4M2YoKSkpOwpAQCAtMTQ1LDEzICsxMzIsMTMgQEAKICAgQ0FMTF9TVUJURVNUXzIoY2hlY2tfc3RkdmVjdG9yX21hdHJpeChNYXRyaXg0ZCgpKSk7CiAKICAgLy8gc29tZSBkeW5hbWljIHNpemVzCi0gIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4WGQoMSwxKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeFhkKDEsIDEpKSk7CiAgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoVmVjdG9yWGQoMjApKSk7CiAgIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoUm93VmVjdG9yWGYoMjApKSk7Ci0gIENBTExfU1VCVEVTVF8zKGNoZWNrX3N0ZHZlY3Rvcl9tYXRyaXgoTWF0cml4WGNmKDEwLDEwKSkpOworICBDQUxMX1NVQlRFU1RfMyhjaGVja19zdGR2ZWN0b3JfbWF0cml4KE1hdHJpeFhjZigxMCwgMTApKSk7CiAKICAgLy8gc29tZSBUcmFuc2Zvcm0KLSAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkdmVjdG9yX3RyYW5zZm9ybShBZmZpbmUyZigpKSk7IC8vIGRvZXMgbm90IG5lZWQgdGhlIHNwZWNpYWxpemF0aW9uICgyKzEpXjIgPSA5CisgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oQWZmaW5lMmYoKSkpOyAgLy8gZG9lcyBub3QgbmVlZCB0aGUgc3BlY2lhbGl6YXRpb24gKDIrMSleMiA9IDkKICAgQ0FMTF9TVUJURVNUXzQoY2hlY2tfc3RkdmVjdG9yX3RyYW5zZm9ybShBZmZpbmUzZigpKSk7CiAgIENBTExfU1VCVEVTVF80KGNoZWNrX3N0ZHZlY3Rvcl90cmFuc2Zvcm0oQWZmaW5lM2QoKSkpOwogCmRpZmYgLS1naXQgYS90ZXN0L3N0bF9pdGVyYXRvcnMuY3BwIGIvdGVzdC9zdGxfaXRlcmF0b3JzLmNwcAppbmRleCAxMjFlYjg2Li43YTYyNjczIDEwMDY0NAotLS0gYS90ZXN0L3N0bF9pdGVyYXRvcnMuY3BwCisrKyBiL3Rlc3Qvc3RsX2l0ZXJhdG9ycy5jcHAKQEAgLTExLDQ4ICsxMSw1NiBAQAogI2luY2x1ZGUgPGl0ZXJhdG9yPgogI2luY2x1ZGUgPG51bWVyaWM+CiAKLXRlbXBsYXRlPCBjbGFzcyBJdGVyYXRvciA+Ci1zdGQ6OnJldmVyc2VfaXRlcmF0b3I8SXRlcmF0b3I+Ci1tYWtlX3JldmVyc2VfaXRlcmF0b3IoIEl0ZXJhdG9yIGkgKQotewordGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPgorc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPEl0ZXJhdG9yPiBtYWtlX3JldmVyc2VfaXRlcmF0b3IoSXRlcmF0b3IgaSkgewogICByZXR1cm4gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPEl0ZXJhdG9yPihpKTsKIH0KIAogdXNpbmcgc3RkOjppc19zb3J0ZWQ7CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFhwclR5cGU+Ci1ib29sIGlzX3BvaW50ZXJfYmFzZWRfc3RsX2l0ZXJhdG9yKGNvbnN0IGludGVybmFsOjpwb2ludGVyX2Jhc2VkX3N0bF9pdGVyYXRvcjxYcHJUeXBlPiAmKSB7IHJldHVybiB0cnVlOyB9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgWHByVHlwZT4KK2Jvb2wgaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoY29uc3QgaW50ZXJuYWw6OnBvaW50ZXJfYmFzZWRfc3RsX2l0ZXJhdG9yPFhwclR5cGU+JikgeworICByZXR1cm4gdHJ1ZTsKK30KIAotdGVtcGxhdGU8dHlwZW5hbWUgWHByVHlwZT4KLWJvb2wgaXNfZ2VuZXJpY19yYW5kYWNjZXNzX3N0bF9pdGVyYXRvcihjb25zdCBpbnRlcm5hbDo6Z2VuZXJpY19yYW5kYWNjZXNzX3N0bF9pdGVyYXRvcjxYcHJUeXBlPiAmKSB7IHJldHVybiB0cnVlOyB9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgWHByVHlwZT4KK2Jvb2wgaXNfZ2VuZXJpY19yYW5kYWNjZXNzX3N0bF9pdGVyYXRvcihjb25zdCBpbnRlcm5hbDo6Z2VuZXJpY19yYW5kYWNjZXNzX3N0bF9pdGVyYXRvcjxYcHJUeXBlPiYpIHsKKyAgcmV0dXJuIHRydWU7Cit9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEl0ZXI+Ci1ib29sIGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9hbmRfYXNzaWduYWJsZShjb25zdCBJdGVyJiBpdCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgorYm9vbCBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfYW5kX2Fzc2lnbmFibGUoY29uc3QgSXRlciYgaXQpIHsKICAgVkVSSUZZKHN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPEl0ZXI+Ojp2YWx1ZSk7CiAgIFZFUklGWShzdGQ6OmlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPEl0ZXI+Ojp2YWx1ZSk7CiAgIEl0ZXIgaXQyOwogICBpdDIgPSBpdDsKLSAgcmV0dXJuIChpdD09aXQyKTsKKyAgcmV0dXJuIChpdCA9PSBpdDIpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBYcHI+Ci12b2lkIGNoZWNrX2JlZ2luX2VuZF9mb3JfbG9vcChYcHIgeHByKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFhwcj4KK3ZvaWQgY2hlY2tfYmVnaW5fZW5kX2Zvcl9sb29wKFhwciB4cHIpIHsKICAgY29uc3QgWHByJiBjeHByKHhwcik7CiAgIEluZGV4IGkgPSAwOwogCiAgIGkgPSAwOwotICBmb3IodHlwZW5hbWUgWHByOjppdGVyYXRvciBpdCA9IHhwci5iZWdpbigpOyBpdCE9eHByLmVuZCgpOyArK2l0KSB7IFZFUklGWV9JU19FUVVBTCgqaXQseHByW2krK10pOyB9CisgIGZvciAodHlwZW5hbWUgWHByOjppdGVyYXRvciBpdCA9IHhwci5iZWdpbigpOyBpdCAhPSB4cHIuZW5kKCk7ICsraXQpIHsKKyAgICBWRVJJRllfSVNfRVFVQUwoKml0LCB4cHJbaSsrXSk7CisgIH0KIAogICBpID0gMDsKLSAgZm9yKHR5cGVuYW1lIFhwcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB4cHIuY2JlZ2luKCk7IGl0IT14cHIuY2VuZCgpOyArK2l0KSB7IFZFUklGWV9JU19FUVVBTCgqaXQseHByW2krK10pOyB9CisgIGZvciAodHlwZW5hbWUgWHByOjpjb25zdF9pdGVyYXRvciBpdCA9IHhwci5jYmVnaW4oKTsgaXQgIT0geHByLmNlbmQoKTsgKytpdCkgeworICAgIFZFUklGWV9JU19FUVVBTCgqaXQsIHhwcltpKytdKTsKKyAgfQogCiAgIGkgPSAwOwotICBmb3IodHlwZW5hbWUgWHByOjpjb25zdF9pdGVyYXRvciBpdCA9IGN4cHIuYmVnaW4oKTsgaXQhPWN4cHIuZW5kKCk7ICsraXQpIHsgVkVSSUZZX0lTX0VRVUFMKCppdCx4cHJbaSsrXSk7IH0KKyAgZm9yICh0eXBlbmFtZSBYcHI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY3hwci5iZWdpbigpOyBpdCAhPSBjeHByLmVuZCgpOyArK2l0KSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKCppdCwgeHByW2krK10pOworICB9CiAKICAgaSA9IDA7Ci0gIGZvcih0eXBlbmFtZSBYcHI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0geHByLmJlZ2luKCk7IGl0IT14cHIuZW5kKCk7ICsraXQpIHsgVkVSSUZZX0lTX0VRVUFMKCppdCx4cHJbaSsrXSk7IH0KKyAgZm9yICh0eXBlbmFtZSBYcHI6OmNvbnN0X2l0ZXJhdG9yIGl0ID0geHByLmJlZ2luKCk7IGl0ICE9IHhwci5lbmQoKTsgKytpdCkgeworICAgIFZFUklGWV9JU19FUVVBTCgqaXQsIHhwcltpKytdKTsKKyAgfQogCiAgIHsKICAgICAvLyBzaW1wbGUgQVBJIGNoZWNrCkBAIC02MCwyNCArNjgsMjQgQEAKICAgICBjaXQgPSB4cHIuY2JlZ2luKCk7CiAKICAgICBhdXRvIHRtcDEgPSB4cHIuYmVnaW4oKTsKLSAgICBWRVJJRlkodG1wMT09eHByLmJlZ2luKCkpOworICAgIFZFUklGWSh0bXAxID09IHhwci5iZWdpbigpKTsKICAgICBhdXRvIHRtcDIgPSB4cHIuY2JlZ2luKCk7Ci0gICAgVkVSSUZZKHRtcDI9PXhwci5jYmVnaW4oKSk7CisgICAgVkVSSUZZKHRtcDIgPT0geHByLmNiZWdpbigpKTsKICAgfQogCi0gIFZFUklGWSggeHByLmVuZCgpIC14cHIuYmVnaW4oKSAgPT0geHByLnNpemUoKSApOwotICBWRVJJRlkoIHhwci5jZW5kKCkteHByLmJlZ2luKCkgID09IHhwci5zaXplKCkgKTsKLSAgVkVSSUZZKCB4cHIuZW5kKCkgLXhwci5jYmVnaW4oKSA9PSB4cHIuc2l6ZSgpICk7Ci0gIFZFUklGWSggeHByLmNlbmQoKS14cHIuY2JlZ2luKCkgPT0geHByLnNpemUoKSApOworICBWRVJJRlkoeHByLmVuZCgpIC0geHByLmJlZ2luKCkgPT0geHByLnNpemUoKSk7CisgIFZFUklGWSh4cHIuY2VuZCgpIC0geHByLmJlZ2luKCkgPT0geHByLnNpemUoKSk7CisgIFZFUklGWSh4cHIuZW5kKCkgLSB4cHIuY2JlZ2luKCkgPT0geHByLnNpemUoKSk7CisgIFZFUklGWSh4cHIuY2VuZCgpIC0geHByLmNiZWdpbigpID09IHhwci5zaXplKCkpOwogCi0gIGlmKHhwci5zaXplKCk+MCkgeworICBpZiAoeHByLnNpemUoKSA+IDApIHsKICAgICBWRVJJRlkoeHByLmJlZ2luKCkgIT0geHByLmVuZCgpKTsKICAgICBWRVJJRlkoeHByLmJlZ2luKCkgPCB4cHIuZW5kKCkpOwogICAgIFZFUklGWSh4cHIuYmVnaW4oKSA8PSB4cHIuZW5kKCkpOwogICAgIFZFUklGWSghKHhwci5iZWdpbigpID09IHhwci5lbmQoKSkpOwogICAgIFZFUklGWSghKHhwci5iZWdpbigpID4geHByLmVuZCgpKSk7CiAgICAgVkVSSUZZKCEoeHByLmJlZ2luKCkgPj0geHByLmVuZCgpKSk7Ci0gICAgCisKICAgICBWRVJJRlkoeHByLmNiZWdpbigpICE9IHhwci5lbmQoKSk7CiAgICAgVkVSSUZZKHhwci5jYmVnaW4oKSA8IHhwci5lbmQoKSk7CiAgICAgVkVSSUZZKHhwci5jYmVnaW4oKSA8PSB4cHIuZW5kKCkpOwpAQCAtOTQsNzQgKzEwMiw3MyBAQAogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IFJvd3MsIGludCBDb2xzPgotdm9pZCB0ZXN0X3N0bF9pdGVyYXRvcnMoaW50IHJvd3M9Um93cywgaW50IGNvbHM9Q29scykKLXsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFJvd3MsMT4gVmVjdG9yVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDEsQ29scz4gUm93VmVjdG9yVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFJvd3MsQ29scyxDb2xNYWpvcj4gQ29sTWF0cml4VHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFJvd3MsQ29scyxSb3dNYWpvcj4gUm93TWF0cml4VHlwZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBSb3dzLCBpbnQgQ29scz4KK3ZvaWQgdGVzdF9zdGxfaXRlcmF0b3JzKGludCByb3dzID0gUm93cywgaW50IGNvbHMgPSBDb2xzKSB7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93cywgMT4gVmVjdG9yVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCBDb2xzPiBSb3dWZWN0b3JUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3MsIENvbHMsIENvbE1ham9yPiBDb2xNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3MsIENvbHMsIFJvd01ham9yPiBSb3dNYXRyaXhUeXBlOwogICBWZWN0b3JUeXBlIHYgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cyk7CiAgIGNvbnN0IFZlY3RvclR5cGUmIGN2KHYpOwotICBDb2xNYXRyaXhUeXBlIEEgPSBDb2xNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgQ29sTWF0cml4VHlwZSBBID0gQ29sTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOwogICBjb25zdCBDb2xNYXRyaXhUeXBlJiBjQShBKTsKLSAgUm93TWF0cml4VHlwZSBCID0gUm93TWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7CisgIFJvd01hdHJpeFR5cGUgQiA9IFJvd01hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKICAgdXNpbmcgRWlnZW46OnBsYWNlaG9sZGVyczo6bGFzdDsKLSAgCisKICAgSW5kZXggaSwgajsKIAogICAvLyBWZXJpZnkgdGhhdCBpdGVyYXRvcnMgYXJlIGRlZmF1bHQgY29uc3RydWN0aWJsZSAoU2VlIGJ1ZyAjMTkwMCkKICAgewotICAgIFZFUklGWSggaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2FuZF9hc3NpZ25hYmxlKHYuYmVnaW4oKSkpOwotICAgIFZFUklGWSggaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2FuZF9hc3NpZ25hYmxlKHYuZW5kKCkpKTsKLSAgICBWRVJJRlkoIGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9hbmRfYXNzaWduYWJsZShjdi5iZWdpbigpKSk7Ci0gICAgVkVSSUZZKCBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfYW5kX2Fzc2lnbmFibGUoY3YuZW5kKCkpKTsKKyAgICBWRVJJRlkoaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2FuZF9hc3NpZ25hYmxlKHYuYmVnaW4oKSkpOworICAgIFZFUklGWShpc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfYW5kX2Fzc2lnbmFibGUodi5lbmQoKSkpOworICAgIFZFUklGWShpc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfYW5kX2Fzc2lnbmFibGUoY3YuYmVnaW4oKSkpOworICAgIFZFUklGWShpc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfYW5kX2Fzc2lnbmFibGUoY3YuZW5kKCkpKTsKIAotICAgIFZFUklGWSggaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2FuZF9hc3NpZ25hYmxlKEEucm93KDApLmJlZ2luKCkpKTsKLSAgICBWRVJJRlkoIGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9hbmRfYXNzaWduYWJsZShBLnJvdygwKS5lbmQoKSkpOwotICAgIFZFUklGWSggaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2FuZF9hc3NpZ25hYmxlKGNBLnJvdygwKS5iZWdpbigpKSk7Ci0gICAgVkVSSUZZKCBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfYW5kX2Fzc2lnbmFibGUoY0Eucm93KDApLmVuZCgpKSk7CisgICAgVkVSSUZZKGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9hbmRfYXNzaWduYWJsZShBLnJvdygwKS5iZWdpbigpKSk7CisgICAgVkVSSUZZKGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9hbmRfYXNzaWduYWJsZShBLnJvdygwKS5lbmQoKSkpOworICAgIFZFUklGWShpc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfYW5kX2Fzc2lnbmFibGUoY0Eucm93KDApLmJlZ2luKCkpKTsKKyAgICBWRVJJRlkoaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2FuZF9hc3NpZ25hYmxlKGNBLnJvdygwKS5lbmQoKSkpOwogCi0gICAgVkVSSUZZKCBpc19kZWZhdWx0X2NvbnN0cnVjdGlibGVfYW5kX2Fzc2lnbmFibGUoQi5yb3coMCkuYmVnaW4oKSkpOwotICAgIFZFUklGWSggaXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlX2FuZF9hc3NpZ25hYmxlKEIucm93KDApLmVuZCgpKSk7CisgICAgVkVSSUZZKGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9hbmRfYXNzaWduYWJsZShCLnJvdygwKS5iZWdpbigpKSk7CisgICAgVkVSSUZZKGlzX2RlZmF1bHRfY29uc3RydWN0aWJsZV9hbmRfYXNzaWduYWJsZShCLnJvdygwKS5lbmQoKSkpOwogICB9CiAKICAgLy8gQ2hlY2sgd2UgZ290IGEgZmFzdCBwb2ludGVyLWJhc2VkIGl0ZXJhdG9yIHdoZW4gZXhwZWN0ZWQKICAgewotICAgIFZFUklGWSggaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3Iodi5iZWdpbigpKSApOwotICAgIFZFUklGWSggaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3Iodi5lbmQoKSkgKTsKLSAgICBWRVJJRlkoIGlzX3BvaW50ZXJfYmFzZWRfc3RsX2l0ZXJhdG9yKGN2LmJlZ2luKCkpICk7Ci0gICAgVkVSSUZZKCBpc19wb2ludGVyX2Jhc2VkX3N0bF9pdGVyYXRvcihjdi5lbmQoKSkgKTsKKyAgICBWRVJJRlkoaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3Iodi5iZWdpbigpKSk7CisgICAgVkVSSUZZKGlzX3BvaW50ZXJfYmFzZWRfc3RsX2l0ZXJhdG9yKHYuZW5kKCkpKTsKKyAgICBWRVJJRlkoaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoY3YuYmVnaW4oKSkpOworICAgIFZFUklGWShpc19wb2ludGVyX2Jhc2VkX3N0bF9pdGVyYXRvcihjdi5lbmQoKSkpOwogCi0gICAgaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsQS5jb2xzKCktMSk7Ci0gICAgVkVSSUZZKCBpc19wb2ludGVyX2Jhc2VkX3N0bF9pdGVyYXRvcihBLmNvbChqKS5iZWdpbigpKSApOwotICAgIFZFUklGWSggaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoQS5jb2woaikuZW5kKCkpICk7Ci0gICAgVkVSSUZZKCBpc19wb2ludGVyX2Jhc2VkX3N0bF9pdGVyYXRvcihjQS5jb2woaikuYmVnaW4oKSkgKTsKLSAgICBWRVJJRlkoIGlzX3BvaW50ZXJfYmFzZWRfc3RsX2l0ZXJhdG9yKGNBLmNvbChqKS5lbmQoKSkgKTsKKyAgICBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgQS5jb2xzKCkgLSAxKTsKKyAgICBWRVJJRlkoaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoQS5jb2woaikuYmVnaW4oKSkpOworICAgIFZFUklGWShpc19wb2ludGVyX2Jhc2VkX3N0bF9pdGVyYXRvcihBLmNvbChqKS5lbmQoKSkpOworICAgIFZFUklGWShpc19wb2ludGVyX2Jhc2VkX3N0bF9pdGVyYXRvcihjQS5jb2woaikuYmVnaW4oKSkpOworICAgIFZFUklGWShpc19wb2ludGVyX2Jhc2VkX3N0bF9pdGVyYXRvcihjQS5jb2woaikuZW5kKCkpKTsKIAotICAgIGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLEEucm93cygpLTEpOwotICAgIFZFUklGWSggaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoQS5yb3coaSkuYmVnaW4oKSkgKTsKLSAgICBWRVJJRlkoIGlzX3BvaW50ZXJfYmFzZWRfc3RsX2l0ZXJhdG9yKEEucm93KGkpLmVuZCgpKSApOwotICAgIFZFUklGWSggaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoY0Eucm93KGkpLmJlZ2luKCkpICk7Ci0gICAgVkVSSUZZKCBpc19wb2ludGVyX2Jhc2VkX3N0bF9pdGVyYXRvcihjQS5yb3coaSkuZW5kKCkpICk7CisgICAgaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIEEucm93cygpIC0gMSk7CisgICAgVkVSSUZZKGlzX3BvaW50ZXJfYmFzZWRfc3RsX2l0ZXJhdG9yKEEucm93KGkpLmJlZ2luKCkpKTsKKyAgICBWRVJJRlkoaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoQS5yb3coaSkuZW5kKCkpKTsKKyAgICBWRVJJRlkoaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoY0Eucm93KGkpLmJlZ2luKCkpKTsKKyAgICBWRVJJRlkoaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoY0Eucm93KGkpLmVuZCgpKSk7CiAKLSAgICBWRVJJRlkoIGlzX3BvaW50ZXJfYmFzZWRfc3RsX2l0ZXJhdG9yKEEucmVzaGFwZWQoKS5iZWdpbigpKSApOwotICAgIFZFUklGWSggaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoQS5yZXNoYXBlZCgpLmVuZCgpKSApOwotICAgIFZFUklGWSggaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoY0EucmVzaGFwZWQoKS5iZWdpbigpKSApOwotICAgIFZFUklGWSggaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoY0EucmVzaGFwZWQoKS5lbmQoKSkgKTsKKyAgICBWRVJJRlkoaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoQS5yZXNoYXBlZCgpLmJlZ2luKCkpKTsKKyAgICBWRVJJRlkoaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoQS5yZXNoYXBlZCgpLmVuZCgpKSk7CisgICAgVkVSSUZZKGlzX3BvaW50ZXJfYmFzZWRfc3RsX2l0ZXJhdG9yKGNBLnJlc2hhcGVkKCkuYmVnaW4oKSkpOworICAgIFZFUklGWShpc19wb2ludGVyX2Jhc2VkX3N0bF9pdGVyYXRvcihjQS5yZXNoYXBlZCgpLmVuZCgpKSk7CiAKLSAgICBWRVJJRlkoIGlzX3BvaW50ZXJfYmFzZWRfc3RsX2l0ZXJhdG9yKEIudGVtcGxhdGUgcmVzaGFwZWQ8QXV0b09yZGVyPigpLmJlZ2luKCkpICk7Ci0gICAgVkVSSUZZKCBpc19wb2ludGVyX2Jhc2VkX3N0bF9pdGVyYXRvcihCLnRlbXBsYXRlIHJlc2hhcGVkPEF1dG9PcmRlcj4oKS5lbmQoKSkgKTsKKyAgICBWRVJJRlkoaXNfcG9pbnRlcl9iYXNlZF9zdGxfaXRlcmF0b3IoQi50ZW1wbGF0ZSByZXNoYXBlZDxBdXRvT3JkZXI+KCkuYmVnaW4oKSkpOworICAgIFZFUklGWShpc19wb2ludGVyX2Jhc2VkX3N0bF9pdGVyYXRvcihCLnRlbXBsYXRlIHJlc2hhcGVkPEF1dG9PcmRlcj4oKS5lbmQoKSkpOwogCi0gICAgVkVSSUZZKCBpc19nZW5lcmljX3JhbmRhY2Nlc3Nfc3RsX2l0ZXJhdG9yKEEudGVtcGxhdGUgcmVzaGFwZWQ8Um93TWFqb3I+KCkuYmVnaW4oKSkgKTsKLSAgICBWRVJJRlkoIGlzX2dlbmVyaWNfcmFuZGFjY2Vzc19zdGxfaXRlcmF0b3IoQS50ZW1wbGF0ZSByZXNoYXBlZDxSb3dNYWpvcj4oKS5lbmQoKSkgKTsKKyAgICBWRVJJRlkoaXNfZ2VuZXJpY19yYW5kYWNjZXNzX3N0bF9pdGVyYXRvcihBLnRlbXBsYXRlIHJlc2hhcGVkPFJvd01ham9yPigpLmJlZ2luKCkpKTsKKyAgICBWRVJJRlkoaXNfZ2VuZXJpY19yYW5kYWNjZXNzX3N0bF9pdGVyYXRvcihBLnRlbXBsYXRlIHJlc2hhcGVkPFJvd01ham9yPigpLmVuZCgpKSk7CiAgIH0KIAogICB7CiAgICAgY2hlY2tfYmVnaW5fZW5kX2Zvcl9sb29wKHYpOwotICAgIGNoZWNrX2JlZ2luX2VuZF9mb3JfbG9vcChBLmNvbChpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLEEuY29scygpLTEpKSk7Ci0gICAgY2hlY2tfYmVnaW5fZW5kX2Zvcl9sb29wKEEucm93KGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsQS5yb3dzKCktMSkpKTsKLSAgICBjaGVja19iZWdpbl9lbmRfZm9yX2xvb3Aodit2KTsKKyAgICBjaGVja19iZWdpbl9lbmRfZm9yX2xvb3AoQS5jb2woaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgQS5jb2xzKCkgLSAxKSkpOworICAgIGNoZWNrX2JlZ2luX2VuZF9mb3JfbG9vcChBLnJvdyhpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBBLnJvd3MoKSAtIDEpKSk7CisgICAgY2hlY2tfYmVnaW5fZW5kX2Zvcl9sb29wKHYgKyB2KTsKICAgfQogCiAgIC8vIGNoZWNrIHN3YXBwYWJsZQpAQCAtMTcxLDEzICsxNzgsMTMgQEAKICAgICB7CiAgICAgICBWZWN0b3JUeXBlIHZfY29weSA9IHY7CiAgICAgICBhdXRvIGEgPSB2LmJlZ2luKCk7Ci0gICAgICBhdXRvIGIgPSB2LmVuZCgpLTE7Ci0gICAgICBzd2FwKGEsYik7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwodix2X2NvcHkpOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKCpiLCp2LmJlZ2luKCkpOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKCpiLHYoMCkpOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKCphLHYuZW5kKClbLTFdKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTCgqYSx2KGxhc3QpKTsKKyAgICAgIGF1dG8gYiA9IHYuZW5kKCkgLSAxOworICAgICAgc3dhcChhLCBiKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTCh2LCB2X2NvcHkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKCpiLCAqdi5iZWdpbigpKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTCgqYiwgdigwKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoKmEsIHYuZW5kKClbLTFdKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTCgqYSwgdihsYXN0KSk7CiAgICAgfQogCiAgICAgLy8gZ2VuZXJpYwpAQCAtMTg1LDE3OCArMTkyLDIwMCBAQAogICAgICAgUm93TWF0cml4VHlwZSBCX2NvcHkgPSBCOwogICAgICAgYXV0byBCciA9IEIucmVzaGFwZWQoKTsKICAgICAgIGF1dG8gYSA9IEJyLmJlZ2luKCk7Ci0gICAgICBhdXRvIGIgPSBCci5lbmQoKS0xOwotICAgICAgc3dhcChhLGIpOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKEIsQl9jb3B5KTsKLSAgICAgIFZFUklGWV9JU19FUVVBTCgqYiwqQnIuYmVnaW4oKSk7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwoKmIsQnIoMCkpOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKCphLEJyLmVuZCgpWy0xXSk7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwoKmEsQnIobGFzdCkpOworICAgICAgYXV0byBiID0gQnIuZW5kKCkgLSAxOworICAgICAgc3dhcChhLCBiKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChCLCBCX2NvcHkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKCpiLCAqQnIuYmVnaW4oKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoKmIsIEJyKDApKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTCgqYSwgQnIuZW5kKClbLTFdKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTCgqYSwgQnIobGFzdCkpOwogICAgIH0KICAgfQogCiAgIC8vIGNoZWNrIG5vbi1jb25zdCBpdGVyYXRvciB3aXRoIGZvci1yYW5nZSBsb29wcwogICB7CiAgICAgaSA9IDA7Ci0gICAgZm9yKGF1dG8geCA6IHYpIHsgVkVSSUZZX0lTX0VRVUFMKHgsdltpKytdKTsgfQorICAgIGZvciAoYXV0byB4IDogdikgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKHgsIHZbaSsrXSk7CisgICAgfQogCi0gICAgaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsQS5jb2xzKCktMSk7CisgICAgaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIEEuY29scygpIC0gMSk7CiAgICAgaSA9IDA7Ci0gICAgZm9yKGF1dG8geCA6IEEuY29sKGopKSB7IFZFUklGWV9JU19FUVVBTCh4LEEoaSsrLGopKTsgfQorICAgIGZvciAoYXV0byB4IDogQS5jb2woaikpIHsKKyAgICAgIFZFUklGWV9JU19FUVVBTCh4LCBBKGkrKywgaikpOworICAgIH0KIAogICAgIGkgPSAwOwotICAgIGZvcihhdXRvIHggOiAoditBLmNvbChqKSkpIHsgVkVSSUZZX0lTX0FQUFJPWCh4LHYoaSkrQShpLGopKTsgKytpOyB9CisgICAgZm9yIChhdXRvIHggOiAodiArIEEuY29sKGopKSkgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWCh4LCB2KGkpICsgQShpLCBqKSk7CisgICAgICArK2k7CisgICAgfQogCiAgICAgaiA9IDA7Ci0gICAgaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsQS5yb3dzKCktMSk7Ci0gICAgZm9yKGF1dG8geCA6IEEucm93KGkpKSB7IFZFUklGWV9JU19FUVVBTCh4LEEoaSxqKyspKTsgfQorICAgIGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBBLnJvd3MoKSAtIDEpOworICAgIGZvciAoYXV0byB4IDogQS5yb3coaSkpIHsKKyAgICAgIFZFUklGWV9JU19FUVVBTCh4LCBBKGksIGorKykpOworICAgIH0KIAogICAgIGkgPSAwOwotICAgIGZvcihhdXRvIHggOiBBLnJlc2hhcGVkKCkpIHsgVkVSSUZZX0lTX0VRVUFMKHgsQShpKyspKTsgfQorICAgIGZvciAoYXV0byB4IDogQS5yZXNoYXBlZCgpKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwoeCwgQShpKyspKTsKKyAgICB9CiAgIH0KIAogICAvLyBzYW1lIGZvciBjb25zdF9pdGVyYXRvcgogICB7CiAgICAgaSA9IDA7Ci0gICAgZm9yKGF1dG8geCA6IGN2KSB7IFZFUklGWV9JU19FUVVBTCh4LHZbaSsrXSk7IH0KKyAgICBmb3IgKGF1dG8geCA6IGN2KSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwoeCwgdltpKytdKTsKKyAgICB9CiAKICAgICBpID0gMDsKLSAgICBmb3IoYXV0byB4IDogY0EucmVzaGFwZWQoKSkgeyBWRVJJRllfSVNfRVFVQUwoeCxBKGkrKykpOyB9CisgICAgZm9yIChhdXRvIHggOiBjQS5yZXNoYXBlZCgpKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwoeCwgQShpKyspKTsKKyAgICB9CiAKICAgICBqID0gMDsKLSAgICBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxBLnJvd3MoKS0xKTsKLSAgICBmb3IoYXV0byB4IDogY0Eucm93KGkpKSB7IFZFUklGWV9JU19FUVVBTCh4LEEoaSxqKyspKTsgfQorICAgIGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBBLnJvd3MoKSAtIDEpOworICAgIGZvciAoYXV0byB4IDogY0Eucm93KGkpKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwoeCwgQShpLCBqKyspKTsKKyAgICB9CiAgIH0KIAogICAvLyBjaGVjayByZXNoYXBlZCgpIG9uIHJvdy1tYWpvcgogICB7CiAgICAgaSA9IDA7Ci0gICAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWMsQ29sTWFqb3I+IEJjID0gQjsKLSAgICBmb3IoYXV0byB4IDogQi5yZXNoYXBlZCgpKSB7IFZFUklGWV9JU19FUVVBTCh4LEJjKGkrKykpOyB9CisgICAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYywgQ29sTWFqb3I+IEJjID0gQjsKKyAgICBmb3IgKGF1dG8geCA6IEIucmVzaGFwZWQoKSkgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKHgsIEJjKGkrKykpOworICAgIH0KICAgfQogCiAgIC8vIGNoZWNrIHdyaXRlIGFjY2VzcwogICB7CiAgICAgVmVjdG9yVHlwZSB3KHYuc2l6ZSgpKTsKICAgICBpID0gMDsKLSAgICBmb3IoYXV0byYgeCA6IHcpIHsgeCA9IHYoaSsrKTsgfQotICAgIFZFUklGWV9JU19FUVVBTCh2LHcpOworICAgIGZvciAoYXV0byYgeCA6IHcpIHsKKyAgICAgIHggPSB2KGkrKyk7CisgICAgfQorICAgIFZFUklGWV9JU19FUVVBTCh2LCB3KTsKICAgfQogCiAgIC8vIGNoZWNrIGZvciBkYW5nbGluZyBwb2ludGVycwogICB7CiAgICAgLy8gbm8gZGFuZ2xpbmcgYmVjYXVzZSBwb2ludGVyLWJhc2VkCiAgICAgewotICAgICAgaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsQS5jb2xzKCktMSk7CisgICAgICBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgQS5jb2xzKCkgLSAxKTsKICAgICAgIGF1dG8gaXQgPSBBLmNvbChqKS5iZWdpbigpOwotICAgICAgZm9yKGk9MDtpPHJvd3M7KytpKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChpdFtpXSxBKGksaikpOworICAgICAgZm9yIChpID0gMDsgaSA8IHJvd3M7ICsraSkgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwoaXRbaV0sIEEoaSwgaikpOwogICAgICAgfQogICAgIH0KIAogICAgIC8vIG5vIGRhbmdsaW5nIGJlY2F1c2UgcG9pbnRlci1iYXNlZAogICAgIHsKLSAgICAgIGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLEEucm93cygpLTEpOworICAgICAgaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIEEucm93cygpIC0gMSk7CiAgICAgICBhdXRvIGl0ID0gQS5yb3coaSkuYmVnaW4oKTsKLSAgICAgIGZvcihqPTA7ajxjb2xzOysraikgeyBWRVJJRllfSVNfRVFVQUwoaXRbal0sQShpLGopKTsgfQorICAgICAgZm9yIChqID0gMDsgaiA8IGNvbHM7ICsraikgeworICAgICAgICBWRVJJRllfSVNfRVFVQUwoaXRbal0sIEEoaSwgaikpOworICAgICAgfQogICAgIH0KIAogICAgIHsKLSAgICAgIGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLEEuY29scygpLTEpOworICAgICAgaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIEEuY29scygpIC0gMSk7CiAgICAgICAvLyB0aGlzIHdvdWxkIHByb2R1Y2UgYSBkYW5nbGluZyBwb2ludGVyOgotICAgICAgLy8gYXV0byBpdCA9IChBKzIqQSkuY29sKGopLmJlZ2luKCk7IAorICAgICAgLy8gYXV0byBpdCA9IChBKzIqQSkuY29sKGopLmJlZ2luKCk7CiAgICAgICAvLyB3ZSBuZWVkIHRvIG5hbWUgdGhlIHRlbXBvcmFyeSBleHByZXNzaW9uOgotICAgICAgYXV0byB0bXAgPSAoQSsyKkEpLmNvbChqKTsKKyAgICAgIGF1dG8gdG1wID0gKEEgKyAyICogQSkuY29sKGopOwogICAgICAgYXV0byBpdCA9IHRtcC5iZWdpbigpOwotICAgICAgZm9yKGk9MDtpPHJvd3M7KytpKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1goaXRbaV0sMypBKGksaikpOworICAgICAgZm9yIChpID0gMDsgaSA8IHJvd3M7ICsraSkgeworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKGl0W2ldLCAzICogQShpLCBqKSk7CiAgICAgICB9CiAgICAgfQogICB9CiAKICAgewogICAgIC8vIGNoZWNrIGJhc2ljIGZvciBsb29wIG9uIHZlY3Rvci13aXNlIGl0ZXJhdG9ycwotICAgIGo9MDsKKyAgICBqID0gMDsKICAgICBmb3IgKGF1dG8gaXQgPSBBLmNvbHdpc2UoKS5jYmVnaW4oKTsgaXQgIT0gQS5jb2x3aXNlKCkuY2VuZCgpOyArK2l0LCArK2opIHsKLSAgICAgIFZFUklGWV9JU19BUFBST1goIGl0LT5jb2VmZigwKSwgQSgwLGopICk7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKCAoKml0KS5jb2VmZigwKSwgQSgwLGopICk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKGl0LT5jb2VmZigwKSwgQSgwLCBqKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKCgqaXQpLmNvZWZmKDApLCBBKDAsIGopKTsKICAgICB9Ci0gICAgaj0wOworICAgIGogPSAwOwogICAgIGZvciAoYXV0byBpdCA9IEEuY29sd2lzZSgpLmJlZ2luKCk7IGl0ICE9IEEuY29sd2lzZSgpLmVuZCgpOyArK2l0LCArK2opIHsKLSAgICAgICgqaXQpLmNvZWZmUmVmKDApID0gKCppdCkuY29lZmYoMCk7IC8vIGNvbXBpbGF0aW9uIGNoZWNrCi0gICAgICBpdC0+Y29lZmZSZWYoMCkgPSBpdC0+Y29lZmYoMCk7ICAgICAvLyBjb21waWxhdGlvbiBjaGVjawotICAgICAgVkVSSUZZX0lTX0FQUFJPWCggaXQtPmNvZWZmKDApLCBBKDAsaikgKTsKLSAgICAgIFZFUklGWV9JU19BUFBST1goICgqaXQpLmNvZWZmKDApLCBBKDAsaikgKTsKKyAgICAgICgqaXQpLmNvZWZmUmVmKDApID0gKCppdCkuY29lZmYoMCk7ICAvLyBjb21waWxhdGlvbiBjaGVjaworICAgICAgaXQtPmNvZWZmUmVmKDApID0gaXQtPmNvZWZmKDApOyAgICAgIC8vIGNvbXBpbGF0aW9uIGNoZWNrCisgICAgICBWRVJJRllfSVNfQVBQUk9YKGl0LT5jb2VmZigwKSwgQSgwLCBqKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKCgqaXQpLmNvZWZmKDApLCBBKDAsIGopKTsKICAgICB9CiAKICAgICAvLyBjaGVjayB2YWx1ZXR5cGUgZ2l2ZXMgdXMgYSBjb3B5Ci0gICAgaj0wOworICAgIGogPSAwOwogICAgIGZvciAoYXV0byBpdCA9IEEuY29sd2lzZSgpLmNiZWdpbigpOyBpdCAhPSBBLmNvbHdpc2UoKS5jZW5kKCk7ICsraXQsICsraikgewogICAgICAgdHlwZW5hbWUgZGVjbHR5cGUoaXQpOjp2YWx1ZV90eXBlIHRtcCA9ICppdDsKLSAgICAgIFZFUklGWV9JU19OT1RfRVFVQUwoIHRtcC5kYXRhKCkgLCBpdC0+ZGF0YSgpICk7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKCB0bXAsIEEuY29sKGopICk7CisgICAgICBWRVJJRllfSVNfTk9UX0VRVUFMKHRtcC5kYXRhKCksIGl0LT5kYXRhKCkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWCh0bXAsIEEuY29sKGopKTsKICAgICB9CiAgIH0KIAotICBpZihyb3dzPj0zKSB7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKCh2LmJlZ2luKCkrcm93cy8yKVsxXSwgdihyb3dzLzIrMSkpOworICBpZiAocm93cyA+PSAzKSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKCh2LmJlZ2luKCkgKyByb3dzIC8gMilbMV0sIHYocm93cyAvIDIgKyAxKSk7CiAKLSAgICBWRVJJRllfSVNfRVFVQUwoKEEucm93d2lzZSgpLmJlZ2luKCkrcm93cy8yKVsxXSwgQS5yb3cocm93cy8yKzEpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoKEEucm93d2lzZSgpLmJlZ2luKCkgKyByb3dzIC8gMilbMV0sIEEucm93KHJvd3MgLyAyICsgMSkpOwogICB9CiAKLSAgaWYoY29scz49MykgewotICAgIFZFUklGWV9JU19FUVVBTCgoQS5jb2x3aXNlKCkuYmVnaW4oKStjb2xzLzIpWzFdLCBBLmNvbChjb2xzLzIrMSkpOworICBpZiAoY29scyA+PSAzKSB7CisgICAgVkVSSUZZX0lTX0VRVUFMKChBLmNvbHdpc2UoKS5iZWdpbigpICsgY29scyAvIDIpWzFdLCBBLmNvbChjb2xzIC8gMiArIDEpKTsKICAgfQogCiAgIC8vIGNoZWNrIHN0ZDo6c29ydAogICB7CiAgICAgLy8gZmlyc3QgY2hlY2sgdGhhdCBpc19zb3J0ZWQgcmV0dXJucyBmYWxzZSB3aGVuIHJlcXVpcmVkCi0gICAgaWYocm93cz49MikKLSAgICB7Ci0gICAgICB2KDEpID0gdigwKS1TY2FsYXIoMSk7Ci0gICAgICBWRVJJRlkoIWlzX3NvcnRlZChzdGQ6OmJlZ2luKHYpLHN0ZDo6ZW5kKHYpKSk7CisgICAgaWYgKHJvd3MgPj0gMikgeworICAgICAgdigxKSA9IHYoMCkgLSBTY2FsYXIoMSk7CisgICAgICBWRVJJRlkoIWlzX3NvcnRlZChzdGQ6OmJlZ2luKHYpLCBzdGQ6OmVuZCh2KSkpOwogICAgIH0KIAogICAgIC8vIG9uIGEgdmVjdG9yCiAgICAgewotICAgICAgc3RkOjpzb3J0KHYuYmVnaW4oKSx2LmVuZCgpKTsKLSAgICAgIFZFUklGWShpc19zb3J0ZWQodi5iZWdpbigpLHYuZW5kKCkpKTsKLSAgICAgIFZFUklGWSghOjppc19zb3J0ZWQobWFrZV9yZXZlcnNlX2l0ZXJhdG9yKHYuZW5kKCkpLG1ha2VfcmV2ZXJzZV9pdGVyYXRvcih2LmJlZ2luKCkpKSk7CisgICAgICBzdGQ6OnNvcnQodi5iZWdpbigpLCB2LmVuZCgpKTsKKyAgICAgIFZFUklGWShpc19zb3J0ZWQodi5iZWdpbigpLCB2LmVuZCgpKSk7CisgICAgICBWRVJJRlkoITo6aXNfc29ydGVkKG1ha2VfcmV2ZXJzZV9pdGVyYXRvcih2LmVuZCgpKSwgbWFrZV9yZXZlcnNlX2l0ZXJhdG9yKHYuYmVnaW4oKSkpKTsKICAgICB9CiAKICAgICAvLyBvbiBhIGNvbHVtbiBvZiBhIGNvbHVtbi1tYWpvciBtYXRyaXggLT4gcG9pbnRlci1iYXNlZCBpdGVyYXRvciBhbmQgZGVmYXVsdCBpbmNyZW1lbnQKICAgICB7Ci0gICAgICBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxBLmNvbHMoKS0xKTsKKyAgICAgIGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBBLmNvbHMoKSAtIDEpOwogICAgICAgLy8gc3RkOjpzb3J0KGJlZ2luKEEuY29sKGopKSxlbmQoQS5jb2woaikpKTsgLy8gZG9lcyBub3QgY29tcGlsZSBiZWNhdXNlIHRoaXMgcmV0dXJucyBjb25zdCBpdGVyYXRvcnMKICAgICAgIHR5cGVuYW1lIENvbE1hdHJpeFR5cGU6OkNvbFhwciBBY29sID0gQS5jb2woaik7Ci0gICAgICBzdGQ6OnNvcnQoQWNvbC5iZWdpbigpLEFjb2wuZW5kKCkpOwotICAgICAgVkVSSUZZKGlzX3NvcnRlZChBY29sLmNiZWdpbigpLEFjb2wuY2VuZCgpKSk7CisgICAgICBzdGQ6OnNvcnQoQWNvbC5iZWdpbigpLCBBY29sLmVuZCgpKTsKKyAgICAgIFZFUklGWShpc19zb3J0ZWQoQWNvbC5jYmVnaW4oKSwgQWNvbC5jZW5kKCkpKTsKICAgICAgIEEuc2V0UmFuZG9tKCk7CiAKLSAgICAgIHN0ZDo6c29ydChBLmNvbChqKS5iZWdpbigpLEEuY29sKGopLmVuZCgpKTsKLSAgICAgIFZFUklGWShpc19zb3J0ZWQoQS5jb2woaikuY2JlZ2luKCksQS5jb2woaikuY2VuZCgpKSk7CisgICAgICBzdGQ6OnNvcnQoQS5jb2woaikuYmVnaW4oKSwgQS5jb2woaikuZW5kKCkpOworICAgICAgVkVSSUZZKGlzX3NvcnRlZChBLmNvbChqKS5jYmVnaW4oKSwgQS5jb2woaikuY2VuZCgpKSk7CiAgICAgICBBLnNldFJhbmRvbSgpOwogICAgIH0KIAogICAgIC8vIG9uIGEgcm93IG9mIGEgcm93bWFqb3IgbWF0cml4IC0+IHBvaW50ZXItYmFzZWQgaXRlcmF0b3IgYW5kIHJ1bnRpbWUgaW5jcmVtZW50CiAgICAgewotICAgICAgaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsQS5yb3dzKCktMSk7CisgICAgICBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgQS5yb3dzKCkgLSAxKTsKICAgICAgIHR5cGVuYW1lIENvbE1hdHJpeFR5cGU6OlJvd1hwciBBcm93ID0gQS5yb3coaSk7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwoIHN0ZDo6ZGlzdGFuY2UoQXJvdy5iZWdpbigpLEFyb3cuZW5kKCkpLCBjb2xzKTsKLSAgICAgIHN0ZDo6c29ydChBcm93LmJlZ2luKCksQXJvdy5lbmQoKSk7Ci0gICAgICBWRVJJRlkoaXNfc29ydGVkKEFyb3cuY2JlZ2luKCksQXJvdy5jZW5kKCkpKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChzdGQ6OmRpc3RhbmNlKEFyb3cuYmVnaW4oKSwgQXJvdy5lbmQoKSksIGNvbHMpOworICAgICAgc3RkOjpzb3J0KEFyb3cuYmVnaW4oKSwgQXJvdy5lbmQoKSk7CisgICAgICBWRVJJRlkoaXNfc29ydGVkKEFyb3cuY2JlZ2luKCksIEFyb3cuY2VuZCgpKSk7CiAgICAgICBBLnNldFJhbmRvbSgpOwogCi0gICAgICBzdGQ6OnNvcnQoQS5yb3coaSkuYmVnaW4oKSxBLnJvdyhpKS5lbmQoKSk7Ci0gICAgICBWRVJJRlkoaXNfc29ydGVkKEEucm93KGkpLmNiZWdpbigpLEEucm93KGkpLmNlbmQoKSkpOworICAgICAgc3RkOjpzb3J0KEEucm93KGkpLmJlZ2luKCksIEEucm93KGkpLmVuZCgpKTsKKyAgICAgIFZFUklGWShpc19zb3J0ZWQoQS5yb3coaSkuY2JlZ2luKCksIEEucm93KGkpLmNlbmQoKSkpOwogICAgICAgQS5zZXRSYW5kb20oKTsKICAgICB9CiAKICAgICAvLyB3aXRoIGEgZ2VuZXJpYyBpdGVyYXRvcgogICAgIHsKLSAgICAgIFJlc2hhcGVkPFJvd01hdHJpeFR5cGUsUm93TWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsMT4gQjEgPSBCLnJlc2hhcGVkKCk7Ci0gICAgICBzdGQ6OnNvcnQoQjEuYmVnaW4oKSxCMS5lbmQoKSk7Ci0gICAgICBWRVJJRlkoaXNfc29ydGVkKEIxLmNiZWdpbigpLEIxLmNlbmQoKSkpOworICAgICAgUmVzaGFwZWQ8Um93TWF0cml4VHlwZSwgUm93TWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUsIDE+IEIxID0gQi5yZXNoYXBlZCgpOworICAgICAgc3RkOjpzb3J0KEIxLmJlZ2luKCksIEIxLmVuZCgpKTsKKyAgICAgIFZFUklGWShpc19zb3J0ZWQoQjEuY2JlZ2luKCksIEIxLmNlbmQoKSkpOwogICAgICAgQi5zZXRSYW5kb20oKTsKIAogICAgICAgLy8gYXNzZXJ0aW9uIGJlY2F1c2UgbmVzdGVkIGV4cHJlc3Npb25zIGFyZSBkaWZmZXJlbnQKQEAgLTM2OCwxMCArMzk3LDEwIEBACiAKICAgLy8gY2hlY2sgd2l0aCBwYXJ0aWFsX3N1bQogICB7Ci0gICAgaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsQS5jb2xzKCktMSk7CisgICAgaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIEEuY29scygpIC0gMSk7CiAgICAgdHlwZW5hbWUgQ29sTWF0cml4VHlwZTo6Q29sWHByIEFjb2wgPSBBLmNvbChqKTsKICAgICBzdGQ6OnBhcnRpYWxfc3VtKEFjb2wuYmVnaW4oKSwgQWNvbC5lbmQoKSwgdi5iZWdpbigpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHYoc2VxKDEsbGFzdCkpLCB2KHNlcSgwLGxhc3QtMSkpK0Fjb2woc2VxKDEsbGFzdCkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYoc2VxKDEsIGxhc3QpKSwgdihzZXEoMCwgbGFzdCAtIDEpKSArIEFjb2woc2VxKDEsIGxhc3QpKSk7CiAKICAgICAvLyBpbnBsYWNlCiAgICAgc3RkOjpwYXJ0aWFsX3N1bShBY29sLmJlZ2luKCksIEFjb2wuZW5kKCksIEFjb2wuYmVnaW4oKSk7CkBAIC0zNzksODUgKzQwOCwxMjMgQEAKICAgfQogCiAgIC8vIHN0cmVzcyByYW5kb20gYWNjZXNzIGFzIHJlcXVpcmVkIGJ5IHN0ZDo6bnRoX2VsZW1lbnQKLSAgaWYocm93cz49MykKLSAgeworICBpZiAocm93cyA+PSAzKSB7CiAgICAgdi5zZXRSYW5kb20oKTsKICAgICBWZWN0b3JUeXBlIHYxID0gdjsKLSAgICBzdGQ6OnNvcnQodjEuYmVnaW4oKSx2MS5lbmQoKSk7Ci0gICAgc3RkOjpudGhfZWxlbWVudCh2LmJlZ2luKCksIHYuYmVnaW4oKStyb3dzLzIsIHYuZW5kKCkpOwotICAgIFZFUklGWV9JU19BUFBST1godjEocm93cy8yKSwgdihyb3dzLzIpKTsKKyAgICBzdGQ6OnNvcnQodjEuYmVnaW4oKSwgdjEuZW5kKCkpOworICAgIHN0ZDo6bnRoX2VsZW1lbnQodi5iZWdpbigpLCB2LmJlZ2luKCkgKyByb3dzIC8gMiwgdi5lbmQoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWCh2MShyb3dzIC8gMiksIHYocm93cyAvIDIpKTsKIAogICAgIHYuc2V0UmFuZG9tKCk7CiAgICAgdjEgPSB2OwotICAgIHN0ZDo6c29ydCh2MS5iZWdpbigpK3Jvd3MvMix2MS5lbmQoKSk7Ci0gICAgc3RkOjpudGhfZWxlbWVudCh2LmJlZ2luKCkrcm93cy8yLCB2LmJlZ2luKCkrcm93cy80LCB2LmVuZCgpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKHYxKHJvd3MvNCksIHYocm93cy80KSk7CisgICAgc3RkOjpzb3J0KHYxLmJlZ2luKCkgKyByb3dzIC8gMiwgdjEuZW5kKCkpOworICAgIHN0ZDo6bnRoX2VsZW1lbnQodi5iZWdpbigpICsgcm93cyAvIDIsIHYuYmVnaW4oKSArIHJvd3MgLyA0LCB2LmVuZCgpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHYxKHJvd3MgLyA0KSwgdihyb3dzIC8gNCkpOwogICB9CiAKICAgLy8gY2hlY2sgcm93cy9jb2xzIGl0ZXJhdG9ycyB3aXRoIHJhbmdlLWZvciBsb29wcwogICB7CiAgICAgaiA9IDA7Ci0gICAgZm9yKGF1dG8gYyA6IEEuY29sd2lzZSgpKSB7IFZFUklGWV9JU19BUFBST1goYy5zdW0oKSwgQS5jb2woaikuc3VtKCkpOyArK2o7IH0KKyAgICBmb3IgKGF1dG8gYyA6IEEuY29sd2lzZSgpKSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKGMuc3VtKCksIEEuY29sKGopLnN1bSgpKTsKKyAgICAgICsrajsKKyAgICB9CiAgICAgaiA9IDA7Ci0gICAgZm9yKGF1dG8gYyA6IEIuY29sd2lzZSgpKSB7IFZFUklGWV9JU19BUFBST1goYy5zdW0oKSwgQi5jb2woaikuc3VtKCkpOyArK2o7IH0KKyAgICBmb3IgKGF1dG8gYyA6IEIuY29sd2lzZSgpKSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKGMuc3VtKCksIEIuY29sKGopLnN1bSgpKTsKKyAgICAgICsrajsKKyAgICB9CiAKICAgICBqID0gMDsKLSAgICBmb3IoYXV0byBjIDogQi5jb2x3aXNlKCkpIHsKKyAgICBmb3IgKGF1dG8gYyA6IEIuY29sd2lzZSgpKSB7CiAgICAgICBpID0gMDsKLSAgICAgIGZvcihhdXRvJiB4IDogYykgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwoeCwgQihpLGopKTsKLSAgICAgICAgeCA9IEEoaSxqKTsKKyAgICAgIGZvciAoYXV0byYgeCA6IGMpIHsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHgsIEIoaSwgaikpOworICAgICAgICB4ID0gQShpLCBqKTsKICAgICAgICAgKytpOwogICAgICAgfQogICAgICAgKytqOwogICAgIH0KLSAgICBWRVJJRllfSVNfQVBQUk9YKEEsQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChBLCBCKTsKICAgICBCLnNldFJhbmRvbSgpOwotICAgIAotICAgIGkgPSAwOwotICAgIGZvcihhdXRvIHIgOiBBLnJvd3dpc2UoKSkgeyBWRVJJRllfSVNfQVBQUk9YKHIuc3VtKCksIEEucm93KGkpLnN1bSgpKTsgKytpOyB9Ci0gICAgaSA9IDA7Ci0gICAgZm9yKGF1dG8gciA6IEIucm93d2lzZSgpKSB7IFZFUklGWV9JU19BUFBST1goci5zdW0oKSwgQi5yb3coaSkuc3VtKCkpOyArK2k7IH0KLSAgfQogCisgICAgaSA9IDA7CisgICAgZm9yIChhdXRvIHIgOiBBLnJvd3dpc2UoKSkgeworICAgICAgVkVSSUZZX0lTX0FQUFJPWChyLnN1bSgpLCBBLnJvdyhpKS5zdW0oKSk7CisgICAgICArK2k7CisgICAgfQorICAgIGkgPSAwOworICAgIGZvciAoYXV0byByIDogQi5yb3d3aXNlKCkpIHsKKyAgICAgIFZFUklGWV9JU19BUFBST1goci5zdW0oKSwgQi5yb3coaSkuc3VtKCkpOworICAgICAgKytpOworICAgIH0KKyAgfQogCiAgIC8vIGNoZWNrIHJvd3MvY29scyBpdGVyYXRvcnMgd2l0aCBTVEwgYWxnb3JpdGhtcwogICB7CiAgICAgUm93VmVjdG9yVHlwZSByb3cgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20oY29scyk7CiAgICAgQS5yb3d3aXNlKCkgPSByb3c7Ci0gICAgVkVSSUZZKCBzdGQ6OmFsbF9vZihBLnJvd3dpc2UoKS5iZWdpbigpLCAgQS5yb3d3aXNlKCkuZW5kKCksICBbJnJvd10odHlwZW5hbWUgQ29sTWF0cml4VHlwZTo6Um93WHByIHgpIHsgcmV0dXJuIGludGVybmFsOjppc0FwcHJveCh4LnNxdWFyZWROb3JtKCkscm93LnNxdWFyZWROb3JtKCkpOyB9KSApOwotICAgIFZFUklGWSggc3RkOjphbGxfb2YoQS5yb3d3aXNlKCkucmJlZ2luKCksIEEucm93d2lzZSgpLnJlbmQoKSwgWyZyb3ddKHR5cGVuYW1lIENvbE1hdHJpeFR5cGU6OlJvd1hwciB4KSB7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goeC5zcXVhcmVkTm9ybSgpLHJvdy5zcXVhcmVkTm9ybSgpKTsgfSkgKTsKKyAgICBWRVJJRlkoc3RkOjphbGxfb2YoQS5yb3d3aXNlKCkuYmVnaW4oKSwgQS5yb3d3aXNlKCkuZW5kKCksIFsmcm93XSh0eXBlbmFtZSBDb2xNYXRyaXhUeXBlOjpSb3dYcHIgeCkgeworICAgICAgcmV0dXJuIGludGVybmFsOjppc0FwcHJveCh4LnNxdWFyZWROb3JtKCksIHJvdy5zcXVhcmVkTm9ybSgpKTsKKyAgICB9KSk7CisgICAgVkVSSUZZKHN0ZDo6YWxsX29mKEEucm93d2lzZSgpLnJiZWdpbigpLCBBLnJvd3dpc2UoKS5yZW5kKCksIFsmcm93XSh0eXBlbmFtZSBDb2xNYXRyaXhUeXBlOjpSb3dYcHIgeCkgeworICAgICAgcmV0dXJuIGludGVybmFsOjppc0FwcHJveCh4LnNxdWFyZWROb3JtKCksIHJvdy5zcXVhcmVkTm9ybSgpKTsKKyAgICB9KSk7CiAKICAgICBWZWN0b3JUeXBlIGNvbCA9IFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKICAgICBBLmNvbHdpc2UoKSA9IGNvbDsKLSAgICBWRVJJRlkoIHN0ZDo6YWxsX29mKEEuY29sd2lzZSgpLmJlZ2luKCksICAgQS5jb2x3aXNlKCkuZW5kKCksICAgWyZjb2xdKHR5cGVuYW1lIENvbE1hdHJpeFR5cGU6OkNvbFhwciB4KSB7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goeC5zcXVhcmVkTm9ybSgpLGNvbC5zcXVhcmVkTm9ybSgpKTsgfSkgKTsKLSAgICBWRVJJRlkoIHN0ZDo6YWxsX29mKEEuY29sd2lzZSgpLnJiZWdpbigpLCAgQS5jb2x3aXNlKCkucmVuZCgpLCAgWyZjb2xdKHR5cGVuYW1lIENvbE1hdHJpeFR5cGU6OkNvbFhwciB4KSB7IHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goeC5zcXVhcmVkTm9ybSgpLGNvbC5zcXVhcmVkTm9ybSgpKTsgfSkgKTsKLSAgICBWRVJJRlkoIHN0ZDo6YWxsX29mKEEuY29sd2lzZSgpLmNiZWdpbigpLCAgQS5jb2x3aXNlKCkuY2VuZCgpLCAgWyZjb2xdKHR5cGVuYW1lIENvbE1hdHJpeFR5cGU6OkNvbnN0Q29sWHByIHgpIHsgcmV0dXJuIGludGVybmFsOjppc0FwcHJveCh4LnNxdWFyZWROb3JtKCksY29sLnNxdWFyZWROb3JtKCkpOyB9KSApOwotICAgIFZFUklGWSggc3RkOjphbGxfb2YoQS5jb2x3aXNlKCkuY3JiZWdpbigpLCBBLmNvbHdpc2UoKS5jcmVuZCgpLCBbJmNvbF0odHlwZW5hbWUgQ29sTWF0cml4VHlwZTo6Q29uc3RDb2xYcHIgeCkgeyByZXR1cm4gaW50ZXJuYWw6OmlzQXBwcm94KHguc3F1YXJlZE5vcm0oKSxjb2wuc3F1YXJlZE5vcm0oKSk7IH0pICk7CisgICAgVkVSSUZZKHN0ZDo6YWxsX29mKEEuY29sd2lzZSgpLmJlZ2luKCksIEEuY29sd2lzZSgpLmVuZCgpLCBbJmNvbF0odHlwZW5hbWUgQ29sTWF0cml4VHlwZTo6Q29sWHByIHgpIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goeC5zcXVhcmVkTm9ybSgpLCBjb2wuc3F1YXJlZE5vcm0oKSk7CisgICAgfSkpOworICAgIFZFUklGWShzdGQ6OmFsbF9vZihBLmNvbHdpc2UoKS5yYmVnaW4oKSwgQS5jb2x3aXNlKCkucmVuZCgpLCBbJmNvbF0odHlwZW5hbWUgQ29sTWF0cml4VHlwZTo6Q29sWHByIHgpIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goeC5zcXVhcmVkTm9ybSgpLCBjb2wuc3F1YXJlZE5vcm0oKSk7CisgICAgfSkpOworICAgIFZFUklGWShzdGQ6OmFsbF9vZihBLmNvbHdpc2UoKS5jYmVnaW4oKSwgQS5jb2x3aXNlKCkuY2VuZCgpLCBbJmNvbF0odHlwZW5hbWUgQ29sTWF0cml4VHlwZTo6Q29uc3RDb2xYcHIgeCkgeworICAgICAgcmV0dXJuIGludGVybmFsOjppc0FwcHJveCh4LnNxdWFyZWROb3JtKCksIGNvbC5zcXVhcmVkTm9ybSgpKTsKKyAgICB9KSk7CisgICAgVkVSSUZZKHN0ZDo6YWxsX29mKEEuY29sd2lzZSgpLmNyYmVnaW4oKSwgQS5jb2x3aXNlKCkuY3JlbmQoKSwgWyZjb2xdKHR5cGVuYW1lIENvbE1hdHJpeFR5cGU6OkNvbnN0Q29sWHByIHgpIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6aXNBcHByb3goeC5zcXVhcmVkTm9ybSgpLCBjb2wuc3F1YXJlZE5vcm0oKSk7CisgICAgfSkpOwogCi0gICAgaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsQS5yb3dzKCktMSk7CisgICAgaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIEEucm93cygpIC0gMSk7CiAgICAgQS5zZXRSYW5kb20oKTsKICAgICBBLnJvdyhpKS5zZXRaZXJvKCk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHN0ZDo6ZmluZF9pZihBLnJvd3dpc2UoKS5iZWdpbigpLCAgQS5yb3d3aXNlKCkuZW5kKCksICBbXSh0eXBlbmFtZSBDb2xNYXRyaXhUeXBlOjpSb3dYcHIgeCkgeyByZXR1cm4gbnVtZXh0Ojppc19leGFjdGx5X3plcm8oeC5zcXVhcmVkTm9ybSgpKTsgfSkgLSBBLnJvd3dpc2UoKS5iZWdpbigpLCBpICk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHN0ZDo6ZmluZF9pZihBLnJvd3dpc2UoKS5yYmVnaW4oKSwgQS5yb3d3aXNlKCkucmVuZCgpLCBbXSh0eXBlbmFtZSBDb2xNYXRyaXhUeXBlOjpSb3dYcHIgeCkgeyByZXR1cm4gbnVtZXh0Ojppc19leGFjdGx5X3plcm8oeC5zcXVhcmVkTm9ybSgpKTsgfSkgLSBBLnJvd3dpc2UoKS5yYmVnaW4oKSwgKEEucm93cygpIC0gMSkgLSBpICk7CisgICAgVkVSSUZZX0lTX0VRVUFMKAorICAgICAgICBzdGQ6OmZpbmRfaWYoQS5yb3d3aXNlKCkuYmVnaW4oKSwgQS5yb3d3aXNlKCkuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICBbXSh0eXBlbmFtZSBDb2xNYXRyaXhUeXBlOjpSb3dYcHIgeCkgeyByZXR1cm4gbnVtZXh0Ojppc19leGFjdGx5X3plcm8oeC5zcXVhcmVkTm9ybSgpKTsgfSkgLQorICAgICAgICAgICAgQS5yb3d3aXNlKCkuYmVnaW4oKSwKKyAgICAgICAgaSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKAorICAgICAgICBzdGQ6OmZpbmRfaWYoQS5yb3d3aXNlKCkucmJlZ2luKCksIEEucm93d2lzZSgpLnJlbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgIFtdKHR5cGVuYW1lIENvbE1hdHJpeFR5cGU6OlJvd1hwciB4KSB7IHJldHVybiBudW1leHQ6OmlzX2V4YWN0bHlfemVybyh4LnNxdWFyZWROb3JtKCkpOyB9KSAtCisgICAgICAgICAgICBBLnJvd3dpc2UoKS5yYmVnaW4oKSwKKyAgICAgICAgKEEucm93cygpIC0gMSkgLSBpKTsKIAotICAgIGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLEEuY29scygpLTEpOworICAgIGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBBLmNvbHMoKSAtIDEpOwogICAgIEEuc2V0UmFuZG9tKCk7CiAgICAgQS5jb2woaikuc2V0WmVybygpOwotICAgIFZFUklGWV9JU19FUVVBTChzdGQ6OmZpbmRfaWYoQS5jb2x3aXNlKCkuYmVnaW4oKSwgIEEuY29sd2lzZSgpLmVuZCgpLCAgW10odHlwZW5hbWUgQ29sTWF0cml4VHlwZTo6Q29sWHByIHgpIHsgcmV0dXJuIG51bWV4dDo6aXNfZXhhY3RseV96ZXJvKHguc3F1YXJlZE5vcm0oKSk7IH0pIC0gQS5jb2x3aXNlKCkuYmVnaW4oKSwgaiApOwotICAgIFZFUklGWV9JU19FUVVBTChzdGQ6OmZpbmRfaWYoQS5jb2x3aXNlKCkucmJlZ2luKCksIEEuY29sd2lzZSgpLnJlbmQoKSwgW10odHlwZW5hbWUgQ29sTWF0cml4VHlwZTo6Q29sWHByIHgpIHsgcmV0dXJuIG51bWV4dDo6aXNfZXhhY3RseV96ZXJvKHguc3F1YXJlZE5vcm0oKSk7IH0pIC0gQS5jb2x3aXNlKCkucmJlZ2luKCksIChBLmNvbHMoKSAtIDEpIC0gaiApOworICAgIFZFUklGWV9JU19FUVVBTCgKKyAgICAgICAgc3RkOjpmaW5kX2lmKEEuY29sd2lzZSgpLmJlZ2luKCksIEEuY29sd2lzZSgpLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgW10odHlwZW5hbWUgQ29sTWF0cml4VHlwZTo6Q29sWHByIHgpIHsgcmV0dXJuIG51bWV4dDo6aXNfZXhhY3RseV96ZXJvKHguc3F1YXJlZE5vcm0oKSk7IH0pIC0KKyAgICAgICAgICAgIEEuY29sd2lzZSgpLmJlZ2luKCksCisgICAgICAgIGopOworICAgIFZFUklGWV9JU19FUVVBTCgKKyAgICAgICAgc3RkOjpmaW5kX2lmKEEuY29sd2lzZSgpLnJiZWdpbigpLCBBLmNvbHdpc2UoKS5yZW5kKCksCisgICAgICAgICAgICAgICAgICAgICBbXSh0eXBlbmFtZSBDb2xNYXRyaXhUeXBlOjpDb2xYcHIgeCkgeyByZXR1cm4gbnVtZXh0Ojppc19leGFjdGx5X3plcm8oeC5zcXVhcmVkTm9ybSgpKTsgfSkgLQorICAgICAgICAgICAgQS5jb2x3aXNlKCkucmJlZ2luKCksCisgICAgICAgIChBLmNvbHMoKSAtIDEpIC0gaik7CiAgIH0KIAogICB7CiAgICAgdXNpbmcgVmVjT3AgPSBWZWN0b3J3aXNlT3A8QXJyYXlYWGksIDA+OwotICAgIFNUQVRJQ19DSEVDSygoIGludGVybmFsOjppc19zYW1lPFZlY09wOjpjb25zdF9pdGVyYXRvciwgZGVjbHR5cGUoc3RkOjpkZWNsdmFsPGNvbnN0IFZlY09wJj4oKS5jYmVnaW4oKSk+Ojp2YWx1ZSApKTsKLSAgICBTVEFUSUNfQ0hFQ0soKCBpbnRlcm5hbDo6aXNfc2FtZTxWZWNPcDo6Y29uc3RfaXRlcmF0b3IsIGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxjb25zdCBWZWNPcCY+KCkuY2VuZCAgKCkpPjo6dmFsdWUgKSk7Ci0gICAgU1RBVElDX0NIRUNLKCggaW50ZXJuYWw6OmlzX3NhbWU8VmVjT3A6OmNvbnN0X2l0ZXJhdG9yLCBkZWNsdHlwZShzdGQ6OmNiZWdpbihzdGQ6OmRlY2x2YWw8Y29uc3QgVmVjT3AmPigpKSk+Ojp2YWx1ZSApKTsKLSAgICBTVEFUSUNfQ0hFQ0soKCBpbnRlcm5hbDo6aXNfc2FtZTxWZWNPcDo6Y29uc3RfaXRlcmF0b3IsIGRlY2x0eXBlKHN0ZDo6Y2VuZCAgKHN0ZDo6ZGVjbHZhbDxjb25zdCBWZWNPcCY+KCkpKT46OnZhbHVlICkpOworICAgIFNUQVRJQ19DSEVDSygoaW50ZXJuYWw6OmlzX3NhbWU8VmVjT3A6OmNvbnN0X2l0ZXJhdG9yLCBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8Y29uc3QgVmVjT3AmPigpLmNiZWdpbigpKT46OnZhbHVlKSk7CisgICAgU1RBVElDX0NIRUNLKChpbnRlcm5hbDo6aXNfc2FtZTxWZWNPcDo6Y29uc3RfaXRlcmF0b3IsIGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxjb25zdCBWZWNPcCY+KCkuY2VuZCgpKT46OnZhbHVlKSk7CisgICAgU1RBVElDX0NIRUNLKAorICAgICAgICAoaW50ZXJuYWw6OmlzX3NhbWU8VmVjT3A6OmNvbnN0X2l0ZXJhdG9yLCBkZWNsdHlwZShzdGQ6OmNiZWdpbihzdGQ6OmRlY2x2YWw8Y29uc3QgVmVjT3AmPigpKSk+Ojp2YWx1ZSkpOworICAgIFNUQVRJQ19DSEVDSygoaW50ZXJuYWw6OmlzX3NhbWU8VmVjT3A6OmNvbnN0X2l0ZXJhdG9yLCBkZWNsdHlwZShzdGQ6OmNlbmQoc3RkOjpkZWNsdmFsPGNvbnN0IFZlY09wJj4oKSkpPjo6dmFsdWUpKTsKICAgfQogfQogCi0KIC8vIFdoZW4gdGhlIGNvbXBpbGVyIHNlZXMgZXhwcmVzc2lvbiBJc0NvbnRhaW5lclRlc3Q8Qz4oMCksIGlmIEMgaXMgYW4KIC8vIFNUTC1zdHlsZSBjb250YWluZXIgY2xhc3MsIHRoZSBmaXJzdCBvdmVybG9hZCBvZiBJc0NvbnRhaW5lclRlc3QKIC8vIHdpbGwgYmUgdmlhYmxlIChzaW5jZSBib3RoIEM6Oml0ZXJhdG9yKiBhbmQgQzo6Y29uc3RfaXRlcmF0b3IqIGFyZQpAQCAtNDY2LDIzICs1MzMsMjMgQEAKIC8vIHRoZSB0eXBlIG9mIGFyZ3VtZW50IDAuICBJZiBDOjppdGVyYXRvciBvciBDOjpjb25zdF9pdGVyYXRvciBpcyBub3QKIC8vIGEgdmFsaWQgdHlwZSwgdGhlIGZpcnN0IG92ZXJsb2FkIGlzIG5vdCB2aWFibGUsIGFuZCB0aGUgc2Vjb25kCiAvLyBvdmVybG9hZCB3aWxsIGJlIHBpY2tlZC4KLXRlbXBsYXRlIDxjbGFzcyBDLAotICAgICAgICAgIGNsYXNzIEl0ZXJhdG9yID0gZGVjbHR5cGUoOjpzdGQ6OmRlY2x2YWw8Y29uc3QgQyY+KCkuYmVnaW4oKSksCi0gICAgICAgICAgY2xhc3MgPSBkZWNsdHlwZSg6OnN0ZDo6ZGVjbHZhbDxjb25zdCBDJj4oKS5lbmQoKSksCi0gICAgICAgICAgY2xhc3MgPSBkZWNsdHlwZSgrKzo6c3RkOjpkZWNsdmFsPEl0ZXJhdG9yJj4oKSksCi0gICAgICAgICAgY2xhc3MgPSBkZWNsdHlwZSgqOjpzdGQ6OmRlY2x2YWw8SXRlcmF0b3I+KCkpLAotICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3I+Ci1ib29sIElzQ29udGFpbmVyVHlwZShpbnQgLyogZHVtbXkgKi8pIHsgcmV0dXJuIHRydWU7IH0KK3RlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBJdGVyYXRvciA9IGRlY2x0eXBlKDo6c3RkOjpkZWNsdmFsPGNvbnN0IEMmPigpLmJlZ2luKCkpLAorICAgICAgICAgIGNsYXNzID0gZGVjbHR5cGUoOjpzdGQ6OmRlY2x2YWw8Y29uc3QgQyY+KCkuZW5kKCkpLCBjbGFzcyA9IGRlY2x0eXBlKCsrOjpzdGQ6OmRlY2x2YWw8SXRlcmF0b3ImPigpKSwKKyAgICAgICAgICBjbGFzcyA9IGRlY2x0eXBlKCo6OnN0ZDo6ZGVjbHZhbDxJdGVyYXRvcj4oKSksIGNsYXNzID0gdHlwZW5hbWUgQzo6Y29uc3RfaXRlcmF0b3I+Citib29sIElzQ29udGFpbmVyVHlwZShpbnQgLyogZHVtbXkgKi8pIHsKKyAgcmV0dXJuIHRydWU7Cit9CiAKIHRlbXBsYXRlIDxjbGFzcyBDPgotYm9vbCBJc0NvbnRhaW5lclR5cGUobG9uZyAvKiBkdW1teSAqLykgeyByZXR1cm4gZmFsc2U7IH0KK2Jvb2wgSXNDb250YWluZXJUeXBlKGxvbmcgLyogZHVtbXkgKi8pIHsKKyAgcmV0dXJuIGZhbHNlOworfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgUm93cywgaW50IENvbHM+Ci12b2lkIHRlc3Rfc3RsX2NvbnRhaW5lcl9kZXRlY3Rpb24oaW50IHJvd3M9Um93cywgaW50IGNvbHM9Q29scykKLXsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFJvd3MsMT4gVmVjdG9yVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFJvd3MsQ29scyxDb2xNYWpvcj4gQ29sTWF0cml4VHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFJvd3MsQ29scyxSb3dNYWpvcj4gUm93TWF0cml4VHlwZTsKK3ZvaWQgdGVzdF9zdGxfY29udGFpbmVyX2RldGVjdGlvbihpbnQgcm93cyA9IFJvd3MsIGludCBjb2xzID0gQ29scykgeworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3MsIDE+IFZlY3RvclR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93cywgQ29scywgQ29sTWFqb3I+IENvbE1hdHJpeFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93cywgQ29scywgUm93TWFqb3I+IFJvd01hdHJpeFR5cGU7CiAKICAgQ29sTWF0cml4VHlwZSBBID0gQ29sTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOwogICBSb3dNYXRyaXhUeXBlIEIgPSBSb3dNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CkBAIC01MDYsMTUgKzU3MywxNiBAQAogICBWRVJJRllfSVNfRVFVQUwoSXNDb250YWluZXJUeXBlPFJvd01hdHJpeFR5cGU+KDApLCByb3dzID09IDEgfHwgY29scyA9PSAxKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHN0bF9pdGVyYXRvcnMpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoKCB0ZXN0X3N0bF9pdGVyYXRvcnM8ZG91YmxlLDIsMz4oKSApKTsKLSAgICBDQUxMX1NVQlRFU1RfMSgoIHRlc3Rfc3RsX2l0ZXJhdG9yczxmbG9hdCw3LDU+KCkgKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoKCB0ZXN0X3N0bF9pdGVyYXRvcnM8aW50LER5bmFtaWMsRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDUsMTApLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oNSwxMCkpICkpOwotICAgIENBTExfU1VCVEVTVF8xKCggdGVzdF9zdGxfaXRlcmF0b3JzPGludCxEeW5hbWljLER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxMCwyMDApLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsMjAwKSkgKSk7CitFSUdFTl9ERUNMQVJFX1RFU1Qoc3RsX2l0ZXJhdG9ycykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSgodGVzdF9zdGxfaXRlcmF0b3JzPGRvdWJsZSwgMiwgMz4oKSkpOworICAgIENBTExfU1VCVEVTVF8xKCh0ZXN0X3N0bF9pdGVyYXRvcnM8ZmxvYXQsIDcsIDU+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMSgKKyAgICAgICAgKHRlc3Rfc3RsX2l0ZXJhdG9yczxpbnQsIER5bmFtaWMsIER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50Pig1LCAxMCksIGludGVybmFsOjpyYW5kb208aW50Pig1LCAxMCkpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoCisgICAgICAgICh0ZXN0X3N0bF9pdGVyYXRvcnM8aW50LCBEeW5hbWljLCBEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsIDIwMCksIGludGVybmFsOjpyYW5kb208aW50PigxMCwgMjAwKSkpKTsKICAgfQogCi0gIENBTExfU1VCVEVTVF8xKCggdGVzdF9zdGxfY29udGFpbmVyX2RldGVjdGlvbjxmbG9hdCwxLDE+KCkgKSk7Ci0gIENBTExfU1VCVEVTVF8xKCggdGVzdF9zdGxfY29udGFpbmVyX2RldGVjdGlvbjxmbG9hdCw1LDU+KCkgKSk7CisgIENBTExfU1VCVEVTVF8xKCh0ZXN0X3N0bF9jb250YWluZXJfZGV0ZWN0aW9uPGZsb2F0LCAxLCAxPigpKSk7CisgIENBTExfU1VCVEVTVF8xKCh0ZXN0X3N0bF9jb250YWluZXJfZGV0ZWN0aW9uPGZsb2F0LCA1LCA1PigpKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L3N1cGVybHVfc3VwcG9ydC5jcHAgYi90ZXN0L3N1cGVybHVfc3VwcG9ydC5jcHAKaW5kZXggNTU0NTBjOC4uNTFjYzNkZiAxMDA2NDQKLS0tIGEvdGVzdC9zdXBlcmx1X3N1cHBvcnQuY3BwCisrKyBiL3Rlc3Qvc3VwZXJsdV9zdXBwb3J0LmNwcApAQCAtMTIsMTIgKzEyLDExIEBACiAKICNpbmNsdWRlIDxFaWdlbi9TdXBlckxVU3VwcG9ydD4KIAotRUlHRU5fREVDTEFSRV9URVNUKHN1cGVybHVfc3VwcG9ydCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChzdXBlcmx1X3N1cHBvcnQpIHsKICAgU3VwZXJMVTxTcGFyc2VNYXRyaXg8ZG91YmxlPiA+IHN1cGVybHVfZG91YmxlX2NvbG1ham9yOwogICBTdXBlckxVPFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+ID4gc3VwZXJsdV9jcGx4ZG91YmxlX2NvbG1ham9yOwotICBDQUxMX1NVQlRFU1RfMSggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKHN1cGVybHVfZG91YmxlX2NvbG1ham9yKSAgICAgICk7Ci0gIENBTExfU1VCVEVTVF8yKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoc3VwZXJsdV9jcGx4ZG91YmxlX2NvbG1ham9yKSAgKTsKLSAgQ0FMTF9TVUJURVNUXzEoIGNoZWNrX3NwYXJzZV9zcXVhcmVfZGV0ZXJtaW5hbnQoc3VwZXJsdV9kb3VibGVfY29sbWFqb3IpICAgICAgKTsKLSAgQ0FMTF9TVUJURVNUXzIoIGNoZWNrX3NwYXJzZV9zcXVhcmVfZGV0ZXJtaW5hbnQoc3VwZXJsdV9jcGx4ZG91YmxlX2NvbG1ham9yKSAgKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKHN1cGVybHVfZG91YmxlX2NvbG1ham9yKSk7CisgIENBTExfU1VCVEVTVF8yKGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhzdXBlcmx1X2NwbHhkb3VibGVfY29sbWFqb3IpKTsKKyAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3BhcnNlX3NxdWFyZV9kZXRlcm1pbmFudChzdXBlcmx1X2RvdWJsZV9jb2xtYWpvcikpOworICBDQUxMX1NVQlRFU1RfMihjaGVja19zcGFyc2Vfc3F1YXJlX2RldGVybWluYW50KHN1cGVybHVfY3BseGRvdWJsZV9jb2xtYWpvcikpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9zdmRfY29tbW9uLmggYi90ZXN0L3N2ZF9jb21tb24uaAppbmRleCBlNDNhZGM0Li5kZDUyMGY1IDEwMDY0NAotLS0gYS90ZXN0L3N2ZF9jb21tb24uaAorKysgYi90ZXN0L3N2ZF9jb21tb24uaApAQCAtMjUsMzQgKzI1LDI3IEBACiAKIC8vIENoZWNrIHRoYXQgdGhlIG1hdHJpeCBtIGlzIHByb3Blcmx5IHJlY29uc3RydWN0ZWQgYW5kIHRoYXQgdGhlIFUgYW5kIFYgZmFjdG9ycyBhcmUgdW5pdGFyeQogLy8gVGhlIFNWRCBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIGNvbXB1dGVkLgotdGVtcGxhdGU8dHlwZW5hbWUgU3ZkVHlwZSwgdHlwZW5hbWUgTWF0cml4VHlwZT4KLXZvaWQgc3ZkX2NoZWNrX2Z1bGwoY29uc3QgTWF0cml4VHlwZSYgbSwgY29uc3QgU3ZkVHlwZSYgc3ZkKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFN2ZFR5cGUsIHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHN2ZF9jaGVja19mdWxsKGNvbnN0IE1hdHJpeFR5cGUmIG0sIGNvbnN0IFN2ZFR5cGUmIHN2ZCkgewogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKIAotICBlbnVtIHsKLSAgICBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLAotICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUKLSAgfTsKKyAgZW51bSB7IFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgfTsKIAogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFJvd3NBdENvbXBpbGVUaW1lLCBSb3dzQXRDb21waWxlVGltZT4gTWF0cml4VVR5cGU7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIENvbHNBdENvbXBpbGVUaW1lPiBNYXRyaXhWVHlwZTsKIAotICBNYXRyaXhUeXBlIHNpZ21hID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIHNpZ21hID0gTWF0cml4VHlwZTo6WmVybyhyb3dzLCBjb2xzKTsKICAgc2lnbWEuZGlhZ29uYWwoKSA9IHN2ZC5zaW5ndWxhclZhbHVlcygpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpOwogICBNYXRyaXhVVHlwZSB1ID0gc3ZkLm1hdHJpeFUoKTsKICAgTWF0cml4VlR5cGUgdiA9IHN2ZC5tYXRyaXhWKCk7CiAgIFJlYWxTY2FsYXIgc2NhbGluZyA9IG0uY3dpc2VBYnMoKS5tYXhDb2VmZigpOwotICBpZihzY2FsaW5nPChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCkpCi0gIHsKKyAgaWYgKHNjYWxpbmcgPCAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpKSB7CiAgICAgVkVSSUZZKHNpZ21hLmN3aXNlQWJzKCkubWF4Q29lZmYoKSA8PSAoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0vc2NhbGluZywgdSAqIChzaWdtYS9zY2FsaW5nKSAqIHYuYWRqb2ludCgpKTsKKyAgfSBlbHNlIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG0gLyBzY2FsaW5nLCB1ICogKHNpZ21hIC8gc2NhbGluZykgKiB2LmFkam9pbnQoKSk7CiAgIH0KICAgVkVSSUZZX0lTX1VOSVRBUlkodSk7CiAgIFZFUklGWV9JU19VTklUQVJZKHYpOwpAQCAtNzIsMTUgKzY1LDIwIEBACiAgIFZFUklGWV9JU19BUFBST1goc3ZkLnNpbmd1bGFyVmFsdWVzKCksIHJlZmVyZW5jZVN2ZC5zaW5ndWxhclZhbHVlcygpKTsKIAogICBpZiAoT3B0aW9ucyAmIChDb21wdXRlRnVsbFYgfCBDb21wdXRlVGhpblYpKSB7Ci0gICAgVkVSSUZZKCAoc3ZkLm1hdHJpeFYoKS5hZGpvaW50KCkqc3ZkLm1hdHJpeFYoKSkuaXNJZGVudGl0eShwcmVjKSApOwotICAgIFZFUklGWV9JU19BUFBST1goIHN2ZC5tYXRyaXhWKCkubGVmdENvbHMoZGlhZ1NpemUpICogc3ZkLnNpbmd1bGFyVmFsdWVzKCkuYXNEaWFnb25hbCgpICogc3ZkLm1hdHJpeFYoKS5sZWZ0Q29scyhkaWFnU2l6ZSkuYWRqb2ludCgpLAotICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVN2ZC5tYXRyaXhWKCkubGVmdENvbHMoZGlhZ1NpemUpICogcmVmZXJlbmNlU3ZkLnNpbmd1bGFyVmFsdWVzKCkuYXNEaWFnb25hbCgpICogcmVmZXJlbmNlU3ZkLm1hdHJpeFYoKS5sZWZ0Q29scyhkaWFnU2l6ZSkuYWRqb2ludCgpKTsKKyAgICBWRVJJRlkoKHN2ZC5tYXRyaXhWKCkuYWRqb2ludCgpICogc3ZkLm1hdHJpeFYoKSkuaXNJZGVudGl0eShwcmVjKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzdmQubWF0cml4VigpLmxlZnRDb2xzKGRpYWdTaXplKSAqIHN2ZC5zaW5ndWxhclZhbHVlcygpLmFzRGlhZ29uYWwoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgc3ZkLm1hdHJpeFYoKS5sZWZ0Q29scyhkaWFnU2l6ZSkuYWRqb2ludCgpLAorICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlU3ZkLm1hdHJpeFYoKS5sZWZ0Q29scyhkaWFnU2l6ZSkgKiByZWZlcmVuY2VTdmQuc2luZ3VsYXJWYWx1ZXMoKS5hc0RpYWdvbmFsKCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVN2ZC5tYXRyaXhWKCkubGVmdENvbHMoZGlhZ1NpemUpLmFkam9pbnQoKSk7CiAgIH0KIAogICBpZiAoT3B0aW9ucyAmIChDb21wdXRlRnVsbFUgfCBDb21wdXRlVGhpblUpKSB7Ci0gICAgVkVSSUZZKCAoc3ZkLm1hdHJpeFUoKS5hZGpvaW50KCkqc3ZkLm1hdHJpeFUoKSkuaXNJZGVudGl0eShwcmVjKSApOwotICAgIFZFUklGWV9JU19BUFBST1goIHN2ZC5tYXRyaXhVKCkubGVmdENvbHMoZGlhZ1NpemUpICogc3ZkLnNpbmd1bGFyVmFsdWVzKCkuY3dpc2VBYnMyKCkuYXNEaWFnb25hbCgpICogc3ZkLm1hdHJpeFUoKS5sZWZ0Q29scyhkaWFnU2l6ZSkuYWRqb2ludCgpLAotICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVN2ZC5tYXRyaXhVKCkubGVmdENvbHMoZGlhZ1NpemUpICogcmVmZXJlbmNlU3ZkLnNpbmd1bGFyVmFsdWVzKCkuY3dpc2VBYnMyKCkuYXNEaWFnb25hbCgpICogcmVmZXJlbmNlU3ZkLm1hdHJpeFUoKS5sZWZ0Q29scyhkaWFnU2l6ZSkuYWRqb2ludCgpKTsKKyAgICBWRVJJRlkoKHN2ZC5tYXRyaXhVKCkuYWRqb2ludCgpICogc3ZkLm1hdHJpeFUoKSkuaXNJZGVudGl0eShwcmVjKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChzdmQubWF0cml4VSgpLmxlZnRDb2xzKGRpYWdTaXplKSAqIHN2ZC5zaW5ndWxhclZhbHVlcygpLmN3aXNlQWJzMigpLmFzRGlhZ29uYWwoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgc3ZkLm1hdHJpeFUoKS5sZWZ0Q29scyhkaWFnU2l6ZSkuYWRqb2ludCgpLAorICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlU3ZkLm1hdHJpeFUoKS5sZWZ0Q29scyhkaWFnU2l6ZSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVN2ZC5zaW5ndWxhclZhbHVlcygpLmN3aXNlQWJzMigpLmFzRGlhZ29uYWwoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlU3ZkLm1hdHJpeFUoKS5sZWZ0Q29scyhkaWFnU2l6ZSkuYWRqb2ludCgpKTsKICAgfQogCiAgIC8vIFRoZSBmb2xsb3dpbmcgY2hlY2tzIGFyZSBub3QgY3JpdGljYWwuCkBAIC0xMDIsMTAgKzEwMCw3IEBACiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwogCi0gIGVudW0gewotICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCi0gICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZQotICB9OworICBlbnVtIHsgUm93c0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSB9OwogCiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUsIER5bmFtaWM+IFJoc1R5cGU7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgQ29sc0F0Q29tcGlsZVRpbWUsIER5bmFtaWM+IFNvbHV0aW9uVHlwZTsKQEAgLTExMyw0OSArMTA4LDQ4IEBACiAgIFJoc1R5cGUgcmhzID0gUmhzVHlwZTo6UmFuZG9tKHJvd3MsIGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIGNvbHMpKTsKICAgU3ZkVHlwZSBzdmQobSk7CiAKLSAgaWYgKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsIGRvdWJsZT46OnZhbHVlKSAgc3ZkLnNldFRocmVzaG9sZChSZWFsU2NhbGFyKDFlLTgpKTsKLSAgZWxzZSBpZihpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLGZsb2F0Pjo6dmFsdWUpICBzdmQuc2V0VGhyZXNob2xkKFJlYWxTY2FsYXIoMmUtNCkpOworICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhciwgZG91YmxlPjo6dmFsdWUpCisgICAgc3ZkLnNldFRocmVzaG9sZChSZWFsU2NhbGFyKDFlLTgpKTsKKyAgZWxzZSBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhciwgZmxvYXQ+Ojp2YWx1ZSkKKyAgICBzdmQuc2V0VGhyZXNob2xkKFJlYWxTY2FsYXIoMmUtNCkpOwogCiAgIFNvbHV0aW9uVHlwZSB4ID0gc3ZkLnNvbHZlKHJocyk7Ci0gICAKLSAgUmVhbFNjYWxhciByZXNpZHVhbCA9IChtKngtcmhzKS5ub3JtKCk7CisKKyAgUmVhbFNjYWxhciByZXNpZHVhbCA9IChtICogeCAtIHJocykubm9ybSgpOwogICBSZWFsU2NhbGFyIHJoc19ub3JtID0gcmhzLm5vcm0oKTsKLSAgaWYoIXRlc3RfaXNNdWNoU21hbGxlclRoYW4ocmVzaWR1YWwscmhzLm5vcm0oKSkpCi0gIHsKKyAgaWYgKCF0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKHJlc2lkdWFsLCByaHMubm9ybSgpKSkgewogICAgIC8vIF5eXiBJZiB0aGUgcmVzaWR1YWwgaXMgdmVyeSBzbWFsbCwgdGhlbiB3ZSBoYXZlIGFuIGV4YWN0IHNvbHV0aW9uLCBzbyB3ZSBhcmUgYWxyZWFkeSBnb29kLgotICAgIAorCiAgICAgLy8gZXZhbHVhdGUgbm9ybWFsIGVxdWF0aW9uIHdoaWNoIHdvcmtzIGFsc28gZm9yIGxlYXN0LXNxdWFyZXMgc29sdXRpb25zCi0gICAgaWYoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhcixkb3VibGU+Ojp2YWx1ZSB8fCBzdmQucmFuaygpPT1tLmRpYWdvbmFsKCkuc2l6ZSgpKQotICAgIHsKKyAgICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhciwgZG91YmxlPjo6dmFsdWUgfHwgc3ZkLnJhbmsoKSA9PSBtLmRpYWdvbmFsKCkuc2l6ZSgpKSB7CiAgICAgICB1c2luZyBzdGQ6OnNxcnQ7CiAgICAgICAvLyBUaGlzIHRlc3QgaXMgbm90IHN0YWJsZSB3aXRoIHNpbmdsZSBwcmVjaXNpb24uCi0gICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGJlY2F1c2Ugc3F1YXJpbmcgbSBzaWduaWNhbnRseSBhZmZlY3RzIHRoZSBwcmVjaXNpb24uICAgICAgCi0gICAgICBpZihpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLGZsb2F0Pjo6dmFsdWUpICsrZ190ZXN0X2xldmVsOwotICAgICAgCi0gICAgICBWRVJJRllfSVNfQVBQUk9YKG0uYWRqb2ludCgpKihtKngpLG0uYWRqb2ludCgpKnJocyk7Ci0gICAgICAKLSAgICAgIGlmKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSkgLS1nX3Rlc3RfbGV2ZWw7CisgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGJlY2F1c2Ugc3F1YXJpbmcgbSBzaWduaWNhbnRseSBhZmZlY3RzIHRoZSBwcmVjaXNpb24uCisgICAgICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhciwgZmxvYXQ+Ojp2YWx1ZSkgKytnX3Rlc3RfbGV2ZWw7CisKKyAgICAgIFZFUklGWV9JU19BUFBST1gobS5hZGpvaW50KCkgKiAobSAqIHgpLCBtLmFkam9pbnQoKSAqIHJocyk7CisKKyAgICAgIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLCBmbG9hdD46OnZhbHVlKSAtLWdfdGVzdF9sZXZlbDsKICAgICB9Ci0gICAgCisKICAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGlzIG5vIHNpZ25pZmljYW50bHkgYmV0dGVyIHNvbHV0aW9uIGluIHRoZSBuZWlnaGJvcmhvb2Qgb2YgeAotICAgIGZvcihJbmRleCBrPTA7azx4LnJvd3MoKTsrK2spCi0gICAgeworICAgIGZvciAoSW5kZXggayA9IDA7IGsgPCB4LnJvd3MoKTsgKytrKSB7CiAgICAgICB1c2luZyBzdGQ6OmFiczsKLSAgICAgIAorCiAgICAgICBTb2x1dGlvblR5cGUgeSh4KTsKLSAgICAgIHkucm93KGspID0gKFJlYWxTY2FsYXIoMSkrMipOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKSkqeC5yb3coayk7Ci0gICAgICBSZWFsU2NhbGFyIHJlc2lkdWFsX3kgPSAobSp5LXJocykubm9ybSgpOwotICAgICAgVkVSSUZZKCB0ZXN0X2lzTXVjaFNtYWxsZXJUaGFuKGFicyhyZXNpZHVhbF95LXJlc2lkdWFsKSwgcmhzX25vcm0pIHx8IHJlc2lkdWFsIDwgcmVzaWR1YWxfeSApOwotICAgICAgaWYoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhcixmbG9hdD46OnZhbHVlKSArK2dfdGVzdF9sZXZlbDsKLSAgICAgIFZFUklGWSggdGVzdF9pc0FwcHJveChyZXNpZHVhbF95LHJlc2lkdWFsKSB8fCByZXNpZHVhbCA8IHJlc2lkdWFsX3kgKTsKLSAgICAgIGlmKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSkgLS1nX3Rlc3RfbGV2ZWw7Ci0gICAgICAKLSAgICAgIHkucm93KGspID0gKFJlYWxTY2FsYXIoMSktMipOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKSkqeC5yb3coayk7Ci0gICAgICByZXNpZHVhbF95ID0gKG0qeS1yaHMpLm5vcm0oKTsKLSAgICAgIFZFUklGWSggdGVzdF9pc011Y2hTbWFsbGVyVGhhbihhYnMocmVzaWR1YWxfeS1yZXNpZHVhbCksIHJoc19ub3JtKSB8fCByZXNpZHVhbCA8IHJlc2lkdWFsX3kgKTsKLSAgICAgIGlmKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsZmxvYXQ+Ojp2YWx1ZSkgKytnX3Rlc3RfbGV2ZWw7Ci0gICAgICBWRVJJRlkoIHRlc3RfaXNBcHByb3gocmVzaWR1YWxfeSxyZXNpZHVhbCkgfHwgcmVzaWR1YWwgPCByZXNpZHVhbF95ICk7Ci0gICAgICBpZihpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLGZsb2F0Pjo6dmFsdWUpIC0tZ190ZXN0X2xldmVsOworICAgICAgeS5yb3coaykgPSAoUmVhbFNjYWxhcigxKSArIDIgKiBOdW1UcmFpdHM8UmVhbFNjYWxhcj46OmVwc2lsb24oKSkgKiB4LnJvdyhrKTsKKyAgICAgIFJlYWxTY2FsYXIgcmVzaWR1YWxfeSA9IChtICogeSAtIHJocykubm9ybSgpOworICAgICAgVkVSSUZZKHRlc3RfaXNNdWNoU21hbGxlclRoYW4oYWJzKHJlc2lkdWFsX3kgLSByZXNpZHVhbCksIHJoc19ub3JtKSB8fCByZXNpZHVhbCA8IHJlc2lkdWFsX3kpOworICAgICAgaWYgKGludGVybmFsOjppc19zYW1lPFJlYWxTY2FsYXIsIGZsb2F0Pjo6dmFsdWUpICsrZ190ZXN0X2xldmVsOworICAgICAgVkVSSUZZKHRlc3RfaXNBcHByb3gocmVzaWR1YWxfeSwgcmVzaWR1YWwpIHx8IHJlc2lkdWFsIDwgcmVzaWR1YWxfeSk7CisgICAgICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhciwgZmxvYXQ+Ojp2YWx1ZSkgLS1nX3Rlc3RfbGV2ZWw7CisKKyAgICAgIHkucm93KGspID0gKFJlYWxTY2FsYXIoMSkgLSAyICogTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjplcHNpbG9uKCkpICogeC5yb3coayk7CisgICAgICByZXNpZHVhbF95ID0gKG0gKiB5IC0gcmhzKS5ub3JtKCk7CisgICAgICBWRVJJRlkodGVzdF9pc011Y2hTbWFsbGVyVGhhbihhYnMocmVzaWR1YWxfeSAtIHJlc2lkdWFsKSwgcmhzX25vcm0pIHx8IHJlc2lkdWFsIDwgcmVzaWR1YWxfeSk7CisgICAgICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8UmVhbFNjYWxhciwgZmxvYXQ+Ojp2YWx1ZSkgKytnX3Rlc3RfbGV2ZWw7CisgICAgICBWRVJJRlkodGVzdF9pc0FwcHJveChyZXNpZHVhbF95LCByZXNpZHVhbCkgfHwgcmVzaWR1YWwgPCByZXNpZHVhbF95KTsKKyAgICAgIGlmIChpbnRlcm5hbDo6aXNfc2FtZTxSZWFsU2NhbGFyLCBmbG9hdD46OnZhbHVlKSAtLWdfdGVzdF9sZXZlbDsKICAgICB9CiAgIH0KIH0KQEAgLTE2Niw4MyArMTYwLDg0IEBACiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgSW5kZXggY29scyA9IG0uY29scygpOwogCi0gIGVudW0gewotICAgIENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUKLSAgfTsKKyAgZW51bSB7IENvbHNBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgfTsKIAogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBEeW5hbWljPiBTb2x1dGlvblR5cGU7CiAKICAgLy8gZ2VuZXJhdGUgYSBmdWxsLXJhbmsgbSB4IG4gcHJvYmxlbSB3aXRoIG08bgogICBlbnVtIHsKLSAgICBSYW5rQXRDb21waWxlVGltZTIgPSBDb2xzQXRDb21waWxlVGltZT09RHluYW1pYyA/IER5bmFtaWMgOiAoQ29sc0F0Q29tcGlsZVRpbWUpLzIrMSwKLSAgICBSb3dzQXRDb21waWxlVGltZTMgPSBDb2xzQXRDb21waWxlVGltZT09RHluYW1pYyA/IER5bmFtaWMgOiBDb2xzQXRDb21waWxlVGltZSsxCisgICAgUmFua0F0Q29tcGlsZVRpbWUyID0gQ29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyA/IER5bmFtaWMgOiAoQ29sc0F0Q29tcGlsZVRpbWUpIC8gMiArIDEsCisgICAgUm93c0F0Q29tcGlsZVRpbWUzID0gQ29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyA/IER5bmFtaWMgOiBDb2xzQXRDb21waWxlVGltZSArIDEKICAgfTsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSYW5rQXRDb21waWxlVGltZTIsIENvbHNBdENvbXBpbGVUaW1lPiBNYXRyaXhUeXBlMjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSYW5rQXRDb21waWxlVGltZTIsIDE+IFJoc1R5cGUyOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIENvbHNBdENvbXBpbGVUaW1lLCBSYW5rQXRDb21waWxlVGltZTI+IE1hdHJpeFR5cGUyVDsKLSAgSW5kZXggcmFuayA9IFJhbmtBdENvbXBpbGVUaW1lMj09RHluYW1pYyA/IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsY29scykgOiBJbmRleChSYW5rQXRDb21waWxlVGltZTIpOwotICBNYXRyaXhUeXBlMiBtMihyYW5rLGNvbHMpOworICBJbmRleCByYW5rID0gUmFua0F0Q29tcGlsZVRpbWUyID09IER5bmFtaWMgPyBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBjb2xzKSA6IEluZGV4KFJhbmtBdENvbXBpbGVUaW1lMik7CisgIE1hdHJpeFR5cGUyIG0yKHJhbmssIGNvbHMpOwogICBpbnQgZ3VhcmQgPSAwOwogICBkbyB7CiAgICAgbTIuc2V0UmFuZG9tKCk7Ci0gIH0gd2hpbGUoU1ZEX0ZPUl9NSU5fTk9STShNYXRyaXhUeXBlMikobTIpLnNldFRocmVzaG9sZCh0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpLnJhbmsoKSE9cmFuayAmJiAoKytndWFyZCk8MTApOwotICBWRVJJRlkoZ3VhcmQ8MTApOworICB9IHdoaWxlIChTVkRfRk9SX01JTl9OT1JNKE1hdHJpeFR5cGUyKShtMikuc2V0VGhyZXNob2xkKHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSkucmFuaygpICE9IHJhbmsgJiYgKCsrZ3VhcmQpIDwgMTApOworICBWRVJJRlkoZ3VhcmQgPCAxMCk7CiAKICAgUmhzVHlwZTIgcmhzMiA9IFJoc1R5cGUyOjpSYW5kb20ocmFuayk7CiAgIC8vIHVzZSBRUiB0byBmaW5kIGEgcmVmZXJlbmNlIG1pbmltYWwgbm9ybSBzb2x1dGlvbgogICBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGUyVD4gcXIobTIuYWRqb2ludCgpKTsKLSAgTWF0cml4PFNjYWxhcixEeW5hbWljLDE+IHRtcCA9IHFyLm1hdHJpeFFSKCkudG9wTGVmdENvcm5lcihyYW5rLHJhbmspLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLmFkam9pbnQoKS5zb2x2ZShyaHMyKTsKKyAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gdG1wID0KKyAgICAgIHFyLm1hdHJpeFFSKCkudG9wTGVmdENvcm5lcihyYW5rLCByYW5rKS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5hZGpvaW50KCkuc29sdmUocmhzMik7CiAgIHRtcC5jb25zZXJ2YXRpdmVSZXNpemUoY29scyk7Ci0gIHRtcC50YWlsKGNvbHMtcmFuaykuc2V0WmVybygpOworICB0bXAudGFpbChjb2xzIC0gcmFuaykuc2V0WmVybygpOwogICBTb2x1dGlvblR5cGUgeDIxID0gcXIuaG91c2Vob2xkZXJRKCkgKiB0bXA7CiAgIC8vIG5vdyBjaGVjayB3aXRoIFNWRAogICBTVkRfU1RBVElDX09QVElPTlMoTWF0cml4VHlwZTIsIE9wdGlvbnMpIHN2ZDIobTIpOwogICBTb2x1dGlvblR5cGUgeDIyID0gc3ZkMi5zb2x2ZShyaHMyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMip4MjEsIHJoczIpOwotICBWRVJJRllfSVNfQVBQUk9YKG0yKngyMiwgcmhzMik7CisgIFZFUklGWV9JU19BUFBST1gobTIgKiB4MjEsIHJoczIpOworICBWRVJJRllfSVNfQVBQUk9YKG0yICogeDIyLCByaHMyKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh4MjEsIHgyMik7CiAKICAgLy8gTm93IGNoZWNrIHdpdGggYSByYW5rIGRlZmljaWVudCBtYXRyaXgKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZTMsIENvbHNBdENvbXBpbGVUaW1lPiBNYXRyaXhUeXBlMzsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZTMsIDE+IFJoc1R5cGUzOwotICBJbmRleCByb3dzMyA9IFJvd3NBdENvbXBpbGVUaW1lMz09RHluYW1pYyA/IGludGVybmFsOjpyYW5kb208SW5kZXg+KHJhbmsrMSwyKmNvbHMpIDogSW5kZXgoUm93c0F0Q29tcGlsZVRpbWUzKTsKLSAgTWF0cml4PFNjYWxhcixSb3dzQXRDb21waWxlVGltZTMsRHluYW1pYz4gQyA9IE1hdHJpeDxTY2FsYXIsUm93c0F0Q29tcGlsZVRpbWUzLER5bmFtaWM+OjpSYW5kb20ocm93czMscmFuayk7CisgIEluZGV4IHJvd3MzID0gUm93c0F0Q29tcGlsZVRpbWUzID09IER5bmFtaWMgPyBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PihyYW5rICsgMSwgMiAqIGNvbHMpIDogSW5kZXgoUm93c0F0Q29tcGlsZVRpbWUzKTsKKyAgTWF0cml4PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUzLCBEeW5hbWljPiBDID0gTWF0cml4PFNjYWxhciwgUm93c0F0Q29tcGlsZVRpbWUzLCBEeW5hbWljPjo6UmFuZG9tKHJvd3MzLCByYW5rKTsKICAgTWF0cml4VHlwZTMgbTMgPSBDICogbTI7CiAgIFJoc1R5cGUzIHJoczMgPSBDICogcmhzMjsKICAgU1ZEX1NUQVRJQ19PUFRJT05TKE1hdHJpeFR5cGUzLCBPcHRpb25zKSBzdmQzKG0zKTsKICAgU29sdXRpb25UeXBlIHgzID0gc3ZkMy5zb2x2ZShyaHMzKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMyp4MywgcmhzMyk7Ci0gIFZFUklGWV9JU19BUFBST1gobTMqeDIxLCByaHMzKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMip4MywgcmhzMik7CisgIFZFUklGWV9JU19BUFBST1gobTMgKiB4MywgcmhzMyk7CisgIFZFUklGWV9JU19BUFBST1gobTMgKiB4MjEsIHJoczMpOworICBWRVJJRllfSVNfQVBQUk9YKG0yICogeDMsIHJoczIpOwogICBWRVJJRllfSVNfQVBQUk9YKHgyMSwgeDMpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBTb2x2ZXJUeXBlPgordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGUsIHR5cGVuYW1lIFNvbHZlclR5cGU+CiB2b2lkIHN2ZF90ZXN0X3NvbHZlcnMoY29uc3QgTWF0cml4VHlwZSYgbSwgY29uc3QgU29sdmVyVHlwZSYgc29sdmVyKSB7Ci0gICAgSW5kZXggcm93cywgY29scywgY29sczI7CisgIEluZGV4IHJvd3MsIGNvbHMsIGNvbHMyOwogCi0gICAgcm93cyA9IG0ucm93cygpOwotICAgIGNvbHMgPSBtLmNvbHMoKTsKKyAgcm93cyA9IG0ucm93cygpOworICBjb2xzID0gbS5jb2xzKCk7CiAKLSAgICBpZihNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT09RHluYW1pYykKLSAgICB7Ci0gICAgICBjb2xzMiA9IGludGVybmFsOjpyYW5kb208aW50PigyLEVJR0VOX1RFU1RfTUFYX1NJWkUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29sczIgPSBjb2xzOwotICAgIH0KLSAgICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gQ01hdHJpeFR5cGU7Ci0gICAgY2hlY2tfc29sdmVyYmFzZTxDTWF0cml4VHlwZSwgTWF0cml4VHlwZT4obSwgc29sdmVyLCByb3dzLCBjb2xzLCBjb2xzMik7CisgIGlmIChNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSB7CisgICAgY29sczIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiwgRUlHRU5fVEVTVF9NQVhfU0laRSk7CisgIH0gZWxzZSB7CisgICAgY29sczIgPSBjb2xzOworICB9CisgIHR5cGVkZWYgTWF0cml4PHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBDTWF0cml4VHlwZTsKKyAgY2hlY2tfc29sdmVyYmFzZTxDTWF0cml4VHlwZSwgTWF0cml4VHlwZT4obSwgc29sdmVyLCByb3dzLCBjb2xzLCBjb2xzMik7CiB9CiAKIC8vIHdvcmsgYXJvdW5kIHN0dXBpZCBtc3ZjIGVycm9yIHdoZW4gY29uc3RydWN0aW5nIGF0IGNvbXBpbGUgdGltZSBhbiBleHByZXNzaW9uIHRoYXQgaW52b2x2ZXMKIC8vIGEgZGl2aXNpb24gYnkgemVybywgZXZlbiBpZiB0aGUgbnVtZXJpYyB0eXBlIGhhcyBmbG9hdGluZyBwb2ludAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgotRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyIHplcm8oKSB7IHJldHVybiBTY2FsYXIoMCk7IH0KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitFSUdFTl9ET05UX0lOTElORSBTY2FsYXIgemVybygpIHsKKyAgcmV0dXJuIFNjYWxhcigwKTsKK30KIAogLy8gd29ya2Fyb3VuZCBhZ2dyZXNzaXZlIG9wdGltaXphdGlvbiBpbiBJQ0MKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IEVJR0VOX0RPTlRfSU5MSU5FICBUIHN1YihUIGEsIFQgYikgeyByZXR1cm4gYSAtIGI7IH0KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRUlHRU5fRE9OVF9JTkxJTkUgVCBzdWIoVCBhLCBUIGIpIHsKKyAgcmV0dXJuIGEgLSBiOworfQogCiAvLyBUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHdlIGRvbid0IGl0ZXJhdGUgaW5maW5pdGVseSBvbiBuYW4vaW5mIHZhbHVlcywKIC8vIGFuZCB0aGF0IGluZm8oKSByZXR1cm5zIEludmFsaWRJbnB1dC4KQEAgLTI1OCw4NyArMjUzLDc4IEBACiAgIFNjYWxhciBuYW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOwogICBWRVJJRlkobmFuICE9IG5hbik7CiAgIHN2ZC5jb21wdXRlKE1hdHJpeFR5cGU6OkNvbnN0YW50KDEwLCAxMCwgbmFuKSk7Ci0gIFZFUklGWShzdmQuaW5mbygpID09IEludmFsaWRJbnB1dCk7ICAKKyAgVkVSSUZZKHN2ZC5pbmZvKCkgPT0gSW52YWxpZElucHV0KTsKIAotICBNYXRyaXhUeXBlIG0gPSBNYXRyaXhUeXBlOjpaZXJvKDEwLDEwKTsKLSAgbShpbnRlcm5hbDo6cmFuZG9tPGludD4oMCw5KSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsOSkpID0gc29tZV9pbmY7CisgIE1hdHJpeFR5cGUgbSA9IE1hdHJpeFR5cGU6Olplcm8oMTAsIDEwKTsKKyAgbShpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgOSksIGludGVybmFsOjpyYW5kb208aW50PigwLCA5KSkgPSBzb21lX2luZjsKICAgc3ZkLmNvbXB1dGUobSk7CiAgIFZFUklGWShzdmQuaW5mbygpID09IEludmFsaWRJbnB1dCk7CiAKLSAgbSA9IE1hdHJpeFR5cGU6Olplcm8oMTAsMTApOwotICBtKGludGVybmFsOjpyYW5kb208aW50PigwLDkpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCw5KSkgPSBuYW47CisgIG0gPSBNYXRyaXhUeXBlOjpaZXJvKDEwLCAxMCk7CisgIG0oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIDkpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgOSkpID0gbmFuOwogICBzdmQuY29tcHV0ZShtKTsKICAgVkVSSUZZKHN2ZC5pbmZvKCkgPT0gSW52YWxpZElucHV0KTsKLSAgCisKICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNzkxCi0gIG0ucmVzaXplKDMsMyk7Ci0gIG0gPDwgMCwgICAgMipOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpLCAgMC41LAotICAgICAgIDAsICAgLTAuNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgbmFuLCAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDsKKyAgbS5yZXNpemUoMywgMyk7CisgIG0gPDwgMCwgMiAqIE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCksIDAuNSwgMCwgLTAuNSwgMCwgbmFuLCAwLCAwOwogICBzdmQuY29tcHV0ZShtKTsKICAgVkVSSUZZKHN2ZC5pbmZvKCkgPT0gSW52YWxpZElucHV0KTsKLSAgCisKICAgU2NhbGFyIG1pbiA9IChzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1pbikoKTsKLSAgbS5yZXNpemUoNCw0KTsKLSAgbSA8PCAgMSwgMCwgMCwgMCwKLSAgICAgICAgMCwgMywgMSwgbWluLAotICAgICAgICAxLCAwLCAxLCBuYW4sCi0gICAgICAgIDAsIG5hbiwgbmFuLCAwOworICBtLnJlc2l6ZSg0LCA0KTsKKyAgbSA8PCAxLCAwLCAwLCAwLCAwLCAzLCAxLCBtaW4sIDEsIDAsIDEsIG5hbiwgMCwgbmFuLCBuYW4sIDA7CiAgIHN2ZC5jb21wdXRlKG0pOwogICBWRVJJRlkoc3ZkLmluZm8oKSA9PSBJbnZhbGlkSW5wdXQpOwogfQogCiAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyODY6IEphY29iaVNWRCBsb29wcyBpbmRlZmluaXRlbHkgd2l0aCBzb21lCiAvLyBtYXRyaWNlcyBjb250YWluaW5nIGRlbm9ybWFsIG51bWJlcnMuCi10ZW1wbGF0ZTx0eXBlbmFtZT4KLXZvaWQgc3ZkX3VuZGVyb3ZlcmZsb3coKQotewordGVtcGxhdGUgPHR5cGVuYW1lPgordm9pZCBzdmRfdW5kZXJvdmVyZmxvdygpIHsKICNpZiBkZWZpbmVkIF9fSU5URUxfQ09NUElMRVIKIC8vIHNodXQgdXAgd2FybmluZyAjMjM5OiBmbG9hdGluZyBwb2ludCB1bmRlcmZsb3cKICNwcmFnbWEgd2FybmluZyBwdXNoCiAjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAyMzkKICNlbmRpZgogICBNYXRyaXgyZCBNOwotICBNIDw8IC03LjkwODg0ZS0zMTMsIC00Ljk0ZS0zMjQsCi0gICAgICAgICAgICAgICAgIDAsIDUuNjA4NDRlLTMxMzsKKyAgTSA8PCAtNy45MDg4NGUtMzEzLCAtNC45NGUtMzI0LCAwLCA1LjYwODQ0ZS0zMTM7CiAgIFNWRF9TVEFUSUNfT1BUSU9OUyhNYXRyaXgyZCwgQ29tcHV0ZUZ1bGxVIHwgQ29tcHV0ZUZ1bGxWKSBzdmQ7CiAgIHN2ZC5jb21wdXRlKE0pOwotICBDQUxMX1NVQlRFU1QoIHN2ZF9jaGVja19mdWxsKE0sc3ZkKSApOwotICAKKyAgQ0FMTF9TVUJURVNUKHN2ZF9jaGVja19mdWxsKE0sIHN2ZCkpOworCiAgIC8vIENoZWNrIGFsbCAyeDIgbWF0cmljZXMgbWFkZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29lZmZpY2llbnRzOgogICBWZWN0b3JYZCB2YWx1ZV9zZXQoOSk7CiAgIHZhbHVlX3NldCA8PCAwLCAxLCAtMSwgNS42MDg0NGUtMzEzLCAtNS42MDg0NGUtMzEzLCA0Ljk0ZS0zMjQsIC00Ljk0ZS0zMjQsIC00Ljk0ZS0yMjMsIDQuOTRlLTIyMzsKLSAgQXJyYXk0aSBpZCgwLDAsMCwwKTsKKyAgQXJyYXk0aSBpZCgwLCAwLCAwLCAwKTsKICAgaW50IGsgPSAwOwotICBkbwotICB7CisgIGRvIHsKICAgICBNIDw8IHZhbHVlX3NldChpZCgwKSksIHZhbHVlX3NldChpZCgxKSksIHZhbHVlX3NldChpZCgyKSksIHZhbHVlX3NldChpZCgzKSk7CiAgICAgc3ZkLmNvbXB1dGUoTSk7Ci0gICAgQ0FMTF9TVUJURVNUKCBzdmRfY2hlY2tfZnVsbChNLHN2ZCkgKTsKKyAgICBDQUxMX1NVQlRFU1Qoc3ZkX2NoZWNrX2Z1bGwoTSwgc3ZkKSk7CiAKICAgICBpZChrKSsrOwotICAgIGlmKGlkKGspPj12YWx1ZV9zZXQuc2l6ZSgpKQotICAgIHsKLSAgICAgIHdoaWxlKGs8MyAmJiBpZChrKT49dmFsdWVfc2V0LnNpemUoKSkgaWQoKytrKSsrOworICAgIGlmIChpZChrKSA+PSB2YWx1ZV9zZXQuc2l6ZSgpKSB7CisgICAgICB3aGlsZSAoayA8IDMgJiYgaWQoaykgPj0gdmFsdWVfc2V0LnNpemUoKSkgaWQoKytrKSsrOwogICAgICAgaWQuaGVhZChrKS5zZXRaZXJvKCk7Ci0gICAgICBrPTA7CisgICAgICBrID0gMDsKICAgICB9CiAKLSAgfSB3aGlsZSgoaWQ8aW50KHZhbHVlX3NldC5zaXplKCkpKS5hbGwoKSk7Ci0gIAorICB9IHdoaWxlICgoaWQgPCBpbnQodmFsdWVfc2V0LnNpemUoKSkpLmFsbCgpKTsKKwogI2lmIGRlZmluZWQgX19JTlRFTF9DT01QSUxFUgogI3ByYWdtYSB3YXJuaW5nIHBvcAogI2VuZGlmCi0gIAorCiAgIC8vIENoZWNrIGZvciBvdmVyZmxvdzoKICAgTWF0cml4M2QgTTM7Ci0gIE0zIDw8IDQuNDMzMTk3ODQ0MjUwMjk0NGUrMzA3LCAtNS44NTg1MzYzNzUyMDI4NjgwZSszMDcsICA2LjQ1MjcwMTc0NDM0MTI5NjRlKzMwNywKLSAgICAgICAgMy43ODQxNjk1NjAxNDA2MzU4ZSszMDcsICAyLjQzMzE3MDI3ODk3NDA2MTdlKzMwNiwgLTMuNTIzNTcwNzE0MDI3MjkwNWUrMzA3LAotICAgICAgIC04LjcxOTA4ODc2MTgwMjgzNTVlKzMwNywgLTcuMzQ1MzIxMzcwOTIzMjE5M2UrMzA3LCAtMi40MzY3MzYzNjg0NDcyMTA1ZSszMDc7CisgIE0zIDw8IDQuNDMzMTk3ODQ0MjUwMjk0NGUrMzA3LCAtNS44NTg1MzYzNzUyMDI4NjgwZSszMDcsIDYuNDUyNzAxNzQ0MzQxMjk2NGUrMzA3LCAzLjc4NDE2OTU2MDE0MDYzNThlKzMwNywKKyAgICAgIDIuNDMzMTcwMjc4OTc0MDYxN2UrMzA2LCAtMy41MjM1NzA3MTQwMjcyOTA1ZSszMDcsIC04LjcxOTA4ODc2MTgwMjgzNTVlKzMwNywgLTcuMzQ1MzIxMzcwOTIzMjE5M2UrMzA3LAorICAgICAgLTIuNDM2NzM2MzY4NDQ3MjEwNWUrMzA3OwogCiAgIFNWRF9TVEFUSUNfT1BUSU9OUyhNYXRyaXgzZCwgQ29tcHV0ZUZ1bGxVIHwgQ29tcHV0ZUZ1bGxWKSBzdmQzOwogICBzdmQzLmNvbXB1dGUoTTMpOyAgLy8ganVzdCBjaGVjayB3ZSBkb24ndCBsb29wIGluZGVmaW5pdGVseQotICBDQUxMX1NVQlRFU1QoIHN2ZF9jaGVja19mdWxsKE0zLHN2ZDMpICk7CisgIENBTExfU1VCVEVTVChzdmRfY2hlY2tfZnVsbChNMywgc3ZkMykpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KQEAgLTM0NiwyOCArMzMyLDI1IEBACiAgIE1hdHJpeFR5cGUgTTsKICAgVmVjdG9yWGQgdmFsdWVfc2V0KDMpOwogICB2YWx1ZV9zZXQgPDwgMCwgMSwgLTE7Ci0gIEFycmF5NGkgaWQoMCwwLDAsMCk7CisgIEFycmF5NGkgaWQoMCwgMCwgMCwgMCk7CiAgIGludCBrID0gMDsKLSAgZG8KLSAgeworICBkbyB7CiAgICAgTSA8PCB2YWx1ZV9zZXQoaWQoMCkpLCB2YWx1ZV9zZXQoaWQoMSkpLCB2YWx1ZV9zZXQoaWQoMikpLCB2YWx1ZV9zZXQoaWQoMykpOwogCiAgICAgY2IoTSk7CiAKICAgICBpZChrKSsrOwotICAgIGlmKGlkKGspPj12YWx1ZV9zZXQuc2l6ZSgpKQotICAgIHsKLSAgICAgIHdoaWxlKGs8MyAmJiBpZChrKT49dmFsdWVfc2V0LnNpemUoKSkgaWQoKytrKSsrOworICAgIGlmIChpZChrKSA+PSB2YWx1ZV9zZXQuc2l6ZSgpKSB7CisgICAgICB3aGlsZSAoayA8IDMgJiYgaWQoaykgPj0gdmFsdWVfc2V0LnNpemUoKSkgaWQoKytrKSsrOwogICAgICAgaWQuaGVhZChrKS5zZXRaZXJvKCk7Ci0gICAgICBrPTA7CisgICAgICBrID0gMDsKICAgICB9Ci0gICAgCi0gIH0gd2hpbGUoKGlkPGludCh2YWx1ZV9zZXQuc2l6ZSgpKSkuYWxsKCkpOworCisgIH0gd2hpbGUgKChpZCA8IGludCh2YWx1ZV9zZXQuc2l6ZSgpKSkuYWxsKCkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZT4KLXZvaWQgc3ZkX3ByZWFsbG9jYXRlKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZT4KK3ZvaWQgc3ZkX3ByZWFsbG9jYXRlKCkgewogICBWZWN0b3IzZiB2KDMuZiwgMi5mLCAxLmYpOwogICBNYXRyaXhYZiBtID0gdi5hc0RpYWdvbmFsKCk7CiAKQEAgLTM5NSwxMiArMzc4LDEyIEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IFFSUHJlY29uZGl0aW9uZXIgPSAwPgogdm9pZCBzdmRfdmVyaWZ5X2Fzc2VydF9mdWxsX29ubHkoY29uc3QgTWF0cml4VHlwZSYgaW5wdXQgPSBNYXRyaXhUeXBlKCkpIHsKICAgZW51bSB7IFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgfTsKLSAgCisKICAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZSwgMT4gUmhzVHlwZTsKICAgUmhzVHlwZSByaHMgPSBSaHNUeXBlOjpaZXJvKGlucHV0LnJvd3MoKSk7CiAgIE1hdHJpeFR5cGUgbShpbnB1dC5yb3dzKCksIGlucHV0LmNvbHMoKSk7CiAgIHN2ZF9maWxsX3JhbmRvbShtKTsKLSAgCisKICAgU1ZEX1NUQVRJQ19PUFRJT05TKE1hdHJpeFR5cGUsIFFSUHJlY29uZGl0aW9uZXIpIHN2ZDA7CiAgIFZFUklGWV9SQUlTRVNfQVNTRVJUKChzdmQwLm1hdHJpeFUoKSkpOwogICBWRVJJRllfUkFJU0VTX0FTU0VSVCgoc3ZkMC5zaW5ndWxhclZhbHVlcygpKSk7CkBAIC01NTAsMTEgKzUzMyw4IEBACiB2b2lkIHN2ZF92ZXJpZnlfY29uc3RydWN0b3Jfb3B0aW9uc19hc3NlcnQoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKLSAgCi0gIGVudW0gewotICAgIFJvd3NBdENvbXBpbGVUaW1lID0gTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsCi0gICAgQ29sc0F0Q29tcGlsZVRpbWUgPSBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZQotICB9OworCisgIGVudW0geyBSb3dzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBDb2xzQXRDb21waWxlVGltZSA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lIH07CiAKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBSb3dzQXRDb21waWxlVGltZSwgMT4gUmhzVHlwZTsKICAgUmhzVHlwZSByaHMocm93cyk7CmRpZmYgLS1naXQgYS90ZXN0L3N2ZF9maWxsLmggYi90ZXN0L3N2ZF9maWxsLmgKaW5kZXggNjQxMWY1Ny4uZDA5MmU4MyAxMDA2NDQKLS0tIGEvdGVzdC9zdmRfZmlsbC5oCisrKyBiL3Rlc3Qvc3ZkX2ZpbGwuaApAQCAtNywxMTUgKzcsMTAzIEBACiAvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKIC8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotQXJyYXk8VCw0LDE+IGZvdXJfZGVub3JtcygpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitBcnJheTxULCA0LCAxPiBmb3VyX2Rlbm9ybXMoKTsKIAotdGVtcGxhdGU8PgotQXJyYXk0ZiBmb3VyX2Rlbm9ybXMoKSB7IHJldHVybiBBcnJheTRmKDUuNjA4NDRlLTM5ZiwgLTUuNjA4NDRlLTM5ZiwgNC45NGUtNDRmLCAtNC45NGUtNDRmKTsgfQotdGVtcGxhdGU8PgotQXJyYXk0ZCBmb3VyX2Rlbm9ybXMoKSB7IHJldHVybiBBcnJheTRkKDUuNjA4NDRlLTMxMywgLTUuNjA4NDRlLTMxMywgNC45NGUtMzI0LCAtNC45NGUtMzI0KTsgfQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLUFycmF5PFQsNCwxPiBmb3VyX2Rlbm9ybXMoKSB7IHJldHVybiBmb3VyX2Rlbm9ybXM8ZG91YmxlPigpLmNhc3Q8VD4oKTsgfQordGVtcGxhdGUgPD4KK0FycmF5NGYgZm91cl9kZW5vcm1zKCkgeworICByZXR1cm4gQXJyYXk0Zig1LjYwODQ0ZS0zOWYsIC01LjYwODQ0ZS0zOWYsIDQuOTRlLTQ0ZiwgLTQuOTRlLTQ0Zik7Cit9Cit0ZW1wbGF0ZSA8PgorQXJyYXk0ZCBmb3VyX2Rlbm9ybXMoKSB7CisgIHJldHVybiBBcnJheTRkKDUuNjA4NDRlLTMxMywgLTUuNjA4NDRlLTMxMywgNC45NGUtMzI0LCAtNC45NGUtMzI0KTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorQXJyYXk8VCwgNCwgMT4gZm91cl9kZW5vcm1zKCkgeworICByZXR1cm4gZm91cl9kZW5vcm1zPGRvdWJsZT4oKS5jYXN0PFQ+KCk7Cit9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIHN2ZF9maWxsX3JhbmRvbShNYXRyaXhUeXBlICZtLCBpbnQgT3B0aW9uID0gMCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBzdmRfZmlsbF9yYW5kb20oTWF0cml4VHlwZSAmbSwgaW50IE9wdGlvbiA9IDApIHsKICAgdXNpbmcgc3RkOjpwb3c7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyIFJlYWxTY2FsYXI7CiAgIEluZGV4IGRpYWdTaXplID0gKHN0ZDo6bWluKShtLnJvd3MoKSwgbS5jb2xzKCkpOwotICBSZWFsU2NhbGFyIHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptYXhfZXhwb25lbnQxMC80OwotICBzID0gaW50ZXJuYWw6OnJhbmRvbTxSZWFsU2NhbGFyPigxLHMpOwotICBNYXRyaXg8UmVhbFNjYWxhcixEeW5hbWljLDE+IGQgPSAgTWF0cml4PFJlYWxTY2FsYXIsRHluYW1pYywxPjo6UmFuZG9tKGRpYWdTaXplKTsKLSAgZm9yKEluZGV4IGs9MDsgazxkaWFnU2l6ZTsgKytrKQotICAgIGQoaykgPSBkKGspKnBvdyhSZWFsU2NhbGFyKDEwKSxpbnRlcm5hbDo6cmFuZG9tPFJlYWxTY2FsYXI+KC1zLHMpKTsKKyAgUmVhbFNjYWxhciBzID0gc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWF4X2V4cG9uZW50MTAgLyA0OworICBzID0gaW50ZXJuYWw6OnJhbmRvbTxSZWFsU2NhbGFyPigxLCBzKTsKKyAgTWF0cml4PFJlYWxTY2FsYXIsIER5bmFtaWMsIDE+IGQgPSBNYXRyaXg8UmVhbFNjYWxhciwgRHluYW1pYywgMT46OlJhbmRvbShkaWFnU2l6ZSk7CisgIGZvciAoSW5kZXggayA9IDA7IGsgPCBkaWFnU2l6ZTsgKytrKSBkKGspID0gZChrKSAqIHBvdyhSZWFsU2NhbGFyKDEwKSwgaW50ZXJuYWw6OnJhbmRvbTxSZWFsU2NhbGFyPigtcywgcykpOwogCi0gIGJvb2wgZHVwICAgICA9IGludGVybmFsOjpyYW5kb208aW50PigwLDEwKSA8IDM7Ci0gIGJvb2wgdW5pdF91diA9IGludGVybmFsOjpyYW5kb208aW50PigwLDEwKSA8IChkdXA/NzozKTsgLy8gaWYgd2UgZHVwbGljYXRlIHNvbWUgZGlhZ29uYWwgZW50cmllcywgdGhlbiBpbmNyZWFzZSB0aGUgY2hhbmNlIHRvIHByZXNlcnZlIHRoZW0gdXNpbmcgdW5pdGFyeSBVIGFuZCBWIGZhY3RvcnMKLSAgCisgIGJvb2wgZHVwID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAsIDEwKSA8IDM7CisgIGJvb2wgdW5pdF91diA9CisgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgMTApIDwgKGR1cCA/IDcgOiAzKTsgIC8vIGlmIHdlIGR1cGxpY2F0ZSBzb21lIGRpYWdvbmFsIGVudHJpZXMsIHRoZW4gaW5jcmVhc2UgdGhlIGNoYW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBwcmVzZXJ2ZSB0aGVtIHVzaW5nIHVuaXRhcnkgVSBhbmQgViBmYWN0b3JzCisKICAgLy8gZHVwbGljYXRlIHNvbWUgc2luZ3VsYXIgdmFsdWVzCi0gIGlmKGR1cCkKLSAgewotICAgIEluZGV4IG4gPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGQuc2l6ZSgpLTEpOwotICAgIGZvcihJbmRleCBpPTA7IGk8bjsgKytpKQotICAgICAgZChpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLGQuc2l6ZSgpLTEpKSA9IGQoaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxkLnNpemUoKS0xKSk7CisgIGlmIChkdXApIHsKKyAgICBJbmRleCBuID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgZC5zaXplKCkgLSAxKTsKKyAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgbjsgKytpKQorICAgICAgZChpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBkLnNpemUoKSAtIDEpKSA9IGQoaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgZC5zaXplKCkgLSAxKSk7CiAgIH0KLSAgCi0gIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBVKG0ucm93cygpLGRpYWdTaXplKTsKLSAgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IFZUKGRpYWdTaXplLG0uY29scygpKTsKLSAgaWYodW5pdF91dikKLSAgeworCisgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IFUobS5yb3dzKCksIGRpYWdTaXplKTsKKyAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gVlQoZGlhZ1NpemUsIG0uY29scygpKTsKKyAgaWYgKHVuaXRfdXYpIHsKICAgICAvLyBpbiB2ZXJ5IHJhcmUgY2FzZXMgbGV0J3MgdHJ5IHdpdGggYSBwdXJlIGRpYWdvbmFsIG1hdHJpeAotICAgIGlmKGludGVybmFsOjpyYW5kb208aW50PigwLDEwKSA8IDEpCi0gICAgeworICAgIGlmIChpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgMTApIDwgMSkgewogICAgICAgVS5zZXRJZGVudGl0eSgpOwogICAgICAgVlQuc2V0SWRlbnRpdHkoKTsKKyAgICB9IGVsc2UgeworICAgICAgY3JlYXRlUmFuZG9tUElNYXRyaXhPZlJhbmsoZGlhZ1NpemUsIFUucm93cygpLCBVLmNvbHMoKSwgVSk7CisgICAgICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhkaWFnU2l6ZSwgVlQucm93cygpLCBWVC5jb2xzKCksIFZUKTsKICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNyZWF0ZVJhbmRvbVBJTWF0cml4T2ZSYW5rKGRpYWdTaXplLFUucm93cygpLCBVLmNvbHMoKSwgVSk7Ci0gICAgICBjcmVhdGVSYW5kb21QSU1hdHJpeE9mUmFuayhkaWFnU2l6ZSxWVC5yb3dzKCksIFZULmNvbHMoKSwgVlQpOwotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKKyAgfSBlbHNlIHsKICAgICBVLnNldFJhbmRvbSgpOwogICAgIFZULnNldFJhbmRvbSgpOwogICB9Ci0gIAotICBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gc2FtcGxlcyg5KTsKLSAgc2FtcGxlcyA8PCBTY2FsYXIoMCksIGZvdXJfZGVub3JtczxSZWFsU2NhbGFyPigpLAotICAgICAgICAgICAgLVJlYWxTY2FsYXIoMSkvTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpoaWdoZXN0KCksCi0gICAgICAgICAgICBSZWFsU2NhbGFyKDEpL051bVRyYWl0czxSZWFsU2NhbGFyPjo6aGlnaGVzdCgpLAotICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbikoKSwKLSAgICAgICAgICAgIHBvdygoc3RkOjpudW1lcmljX2xpbWl0czxSZWFsU2NhbGFyPjo6bWluKSgpLCBSZWFsU2NhbGFyKDAuOCkpOwotICAKLSAgaWYoT3B0aW9uPT1TeW1tZXRyaWMpCi0gIHsKKworICBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCAxPiBzYW1wbGVzKDkpOworICBzYW1wbGVzIDw8IFNjYWxhcigwKSwgZm91cl9kZW5vcm1zPFJlYWxTY2FsYXI+KCksIC1SZWFsU2NhbGFyKDEpIC8gTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpoaWdoZXN0KCksCisgICAgICBSZWFsU2NhbGFyKDEpIC8gTnVtVHJhaXRzPFJlYWxTY2FsYXI+OjpoaWdoZXN0KCksIChzdGQ6Om51bWVyaWNfbGltaXRzPFJlYWxTY2FsYXI+OjptaW4pKCksCisgICAgICBwb3coKHN0ZDo6bnVtZXJpY19saW1pdHM8UmVhbFNjYWxhcj46Om1pbikoKSwgUmVhbFNjYWxhcigwLjgpKTsKKworICBpZiAoT3B0aW9uID09IFN5bW1ldHJpYykgewogICAgIG0gPSBVICogZC5hc0RpYWdvbmFsKCkgKiBVLnRyYW5zcG9zZSgpOwotICAgIAorCiAgICAgLy8gcmFuZG9tbHkgbnVsbGlmeSBzb21lIHJvd3MvY29sdW1ucwogICAgIHsKLSAgICAgIEluZGV4IGNvdW50ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oLWRpYWdTaXplLGRpYWdTaXplKTsKLSAgICAgIGZvcihJbmRleCBrPTA7IGs8Y291bnQ7ICsraykKLSAgICAgIHsKLSAgICAgICAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsZGlhZ1NpemUtMSk7CisgICAgICBJbmRleCBjb3VudCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KC1kaWFnU2l6ZSwgZGlhZ1NpemUpOworICAgICAgZm9yIChJbmRleCBrID0gMDsgayA8IGNvdW50OyArK2spIHsKKyAgICAgICAgSW5kZXggaSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGRpYWdTaXplIC0gMSk7CiAgICAgICAgIG0ucm93KGkpLnNldFplcm8oKTsKICAgICAgICAgbS5jb2woaSkuc2V0WmVybygpOwogICAgICAgfQotICAgICAgaWYoY291bnQ8MCkKLSAgICAgIC8vIChwYXJ0bHkpIGNhbmNlbCBzb21lIGNvZWZmcwotICAgICAgaWYoIShkdXAgJiYgdW5pdF91dikpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgICBJbmRleCBuID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxtLnNpemUoKS0xKTsKLSAgICAgICAgZm9yKEluZGV4IGs9MDsgazxuOyArK2spCi0gICAgICAgIHsKLSAgICAgICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxtLnJvd3MoKS0xKTsKLSAgICAgICAgICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxtLmNvbHMoKS0xKTsKLSAgICAgICAgICBtKGosaSkgPSBtKGksaikgPSBzYW1wbGVzKGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsc2FtcGxlcy5zaXplKCktMSkpOwotICAgICAgICAgIGlmKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCi0gICAgICAgICAgICAqKCZudW1leHQ6OnJlYWxfcmVmKG0oaixpKSkrMSkgPSAqKCZudW1leHQ6OnJlYWxfcmVmKG0oaSxqKSkrMSkgPSBzYW1wbGVzLnJlYWwoKShpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHNhbXBsZXMuc2l6ZSgpLTEpKTsKKyAgICAgIGlmIChjb3VudCA8IDApCisgICAgICAgIC8vIChwYXJ0bHkpIGNhbmNlbCBzb21lIGNvZWZmcworICAgICAgICBpZiAoIShkdXAgJiYgdW5pdF91dikpIHsKKyAgICAgICAgICBJbmRleCBuID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgbS5zaXplKCkgLSAxKTsKKyAgICAgICAgICBmb3IgKEluZGV4IGsgPSAwOyBrIDwgbjsgKytrKSB7CisgICAgICAgICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgbS5yb3dzKCkgLSAxKTsKKyAgICAgICAgICAgIEluZGV4IGogPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBtLmNvbHMoKSAtIDEpOworICAgICAgICAgICAgbShqLCBpKSA9IG0oaSwgaikgPSBzYW1wbGVzKGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHNhbXBsZXMuc2l6ZSgpIC0gMSkpOworICAgICAgICAgICAgaWYgKE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXgpCisgICAgICAgICAgICAgICooJm51bWV4dDo6cmVhbF9yZWYobShqLCBpKSkgKyAxKSA9ICooJm51bWV4dDo6cmVhbF9yZWYobShpLCBqKSkgKyAxKSA9CisgICAgICAgICAgICAgICAgICBzYW1wbGVzLnJlYWwoKShpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBzYW1wbGVzLnNpemUoKSAtIDEpKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0KICAgICB9Ci0gIH0KLSAgZWxzZQotICB7CisgIH0gZWxzZSB7CiAgICAgbSA9IFUgKiBkLmFzRGlhZ29uYWwoKSAqIFZUOwogICAgIC8vIChwYXJ0bHkpIGNhbmNlbCBzb21lIGNvZWZmcwotICAgIGlmKCEoZHVwICYmIHVuaXRfdXYpKQotICAgIHsKLSAgICAgIEluZGV4IG4gPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0uc2l6ZSgpLTEpOwotICAgICAgZm9yKEluZGV4IGs9MDsgazxuOyArK2spCi0gICAgICB7Ci0gICAgICAgIEluZGV4IGkgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLG0ucm93cygpLTEpOwotICAgICAgICBJbmRleCBqID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxtLmNvbHMoKS0xKTsKLSAgICAgICAgbShpLGopID0gc2FtcGxlcyhpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHNhbXBsZXMuc2l6ZSgpLTEpKTsKLSAgICAgICAgaWYoTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCkKLSAgICAgICAgICAqKCZudW1leHQ6OnJlYWxfcmVmKG0oaSxqKSkrMSkgPSBzYW1wbGVzLnJlYWwoKShpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLHNhbXBsZXMuc2l6ZSgpLTEpKTsKKyAgICBpZiAoIShkdXAgJiYgdW5pdF91dikpIHsKKyAgICAgIEluZGV4IG4gPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBtLnNpemUoKSAtIDEpOworICAgICAgZm9yIChJbmRleCBrID0gMDsgayA8IG47ICsraykgeworICAgICAgICBJbmRleCBpID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgbS5yb3dzKCkgLSAxKTsKKyAgICAgICAgSW5kZXggaiA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIG0uY29scygpIC0gMSk7CisgICAgICAgIG0oaSwgaikgPSBzYW1wbGVzKGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHNhbXBsZXMuc2l6ZSgpIC0gMSkpOworICAgICAgICBpZiAoTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCkKKyAgICAgICAgICAqKCZudW1leHQ6OnJlYWxfcmVmKG0oaSwgaikpICsgMSkgPSBzYW1wbGVzLnJlYWwoKShpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBzYW1wbGVzLnNpemUoKSAtIDEpKTsKICAgICAgIH0KICAgICB9CiAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvdGVzdC9zd2FwLmNwcCBiL3Rlc3Qvc3dhcC5jcHAKaW5kZXggZThkNjg4MS4uYmMyOTcwNCAxMDA2NDQKLS0tIGEvdGVzdC9zd2FwLmNwcAorKysgYi90ZXN0L3N3YXAuY3BwCkBAIC05LDIyICs5LDE5IEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3Qgb3RoZXJfbWF0cml4X3R5cGUKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IG90aGVyX21hdHJpeF90eXBlIHsKICAgdHlwZWRlZiBpbnQgdHlwZTsKIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcl8sIGludCBSb3dzXywgaW50IENvbHNfLCBpbnQgT3B0aW9uc18sIGludCBNYXhSb3dzXywgaW50IE1heENvbHNfPgotc3RydWN0IG90aGVyX21hdHJpeF90eXBlPE1hdHJpeDxTY2FsYXJfLCBSb3dzXywgQ29sc18sIE9wdGlvbnNfLCBNYXhSb3dzXywgTWF4Q29sc18+ID4KLXsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyXywgUm93c18sIENvbHNfLCBPcHRpb25zX15Sb3dNYWpvciwgTWF4Um93c18sIE1heENvbHNfPiB0eXBlOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcl8sIGludCBSb3dzXywgaW50IENvbHNfLCBpbnQgT3B0aW9uc18sIGludCBNYXhSb3dzXywgaW50IE1heENvbHNfPgorc3RydWN0IG90aGVyX21hdHJpeF90eXBlPE1hdHJpeDxTY2FsYXJfLCBSb3dzXywgQ29sc18sIE9wdGlvbnNfLCBNYXhSb3dzXywgTWF4Q29sc18+ID4geworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXJfLCBSb3dzXywgQ29sc18sIE9wdGlvbnNfIF4gUm93TWFqb3IsIE1heFJvd3NfLCBNYXhDb2xzXz4gdHlwZTsKIH07CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgotc3RkOjplbmFibGVfaWZfdDwoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU9PTEgfHwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU9PUR5bmFtaWMpLCB2b2lkPgotY2hlY2tfcm93X3N3YXAoTWF0cml4VHlwZSYgbTEpIHsKLSAgCitzdGQ6OmVuYWJsZV9pZl90PChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSA9PSAxIHx8IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMpLCB2b2lkPiBjaGVja19yb3dfc3dhcCgKKyAgICBNYXRyaXhUeXBlJiBtMSkgewogICBpZiAobTEucm93cygpICE9IDEpIHsKICAgICAvLyB0ZXN0IGFzc2VydGlvbiBvbiBtaXNtYXRjaGluZyBzaXplIC0tIG1hdHJpeCBjYXNlCiAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobTEuc3dhcChtMS5yb3coMCkpKTsKQEAgLTM0LDcxICszMSw2OCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXN0ZDo6ZW5hYmxlX2lmX3Q8IShNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09MSB8fCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYyksIHZvaWQ+Ci1jaGVja19yb3dfc3dhcChNYXRyaXhUeXBlJiAvKiB1bnVzZWQgKi8pIHsKLX0KK3N0ZDo6ZW5hYmxlX2lmX3Q8IShNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSA9PSAxIHx8IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMpLCB2b2lkPgorY2hlY2tfcm93X3N3YXAoTWF0cml4VHlwZSYgLyogdW51c2VkICovKSB7fQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHN3YXAoY29uc3QgTWF0cml4VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCBzd2FwKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBvdGhlcl9tYXRyaXhfdHlwZTxNYXRyaXhUeXBlPjo6dHlwZSBPdGhlck1hdHJpeFR5cGU7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKIAotICBlaWdlbl9hc3NlcnQoKCFpbnRlcm5hbDo6aXNfc2FtZTxNYXRyaXhUeXBlLE90aGVyTWF0cml4VHlwZT46OnZhbHVlKSk7CisgIGVpZ2VuX2Fzc2VydCgoIWludGVybmFsOjppc19zYW1lPE1hdHJpeFR5cGUsIE90aGVyTWF0cml4VHlwZT46OnZhbHVlKSk7CiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwotICAKKwogICAvLyBjb25zdHJ1Y3QgMyBtYXRyaXggZ3VhcmFudGVlZCB0byBiZSBkaXN0aW5jdAotICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7Ci0gIE1hdHJpeFR5cGUgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSArIFNjYWxhcigxMDApICogTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cyxjb2xzKTsKLSAgT3RoZXJNYXRyaXhUeXBlIG0zID0gT3RoZXJNYXRyaXhUeXBlOjpSYW5kb20ocm93cyxjb2xzKSArIFNjYWxhcigyMDApICogT3RoZXJNYXRyaXhUeXBlOjpJZGVudGl0eShyb3dzLGNvbHMpOwotICAKKyAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKKyAgTWF0cml4VHlwZSBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSArIFNjYWxhcigxMDApICogTWF0cml4VHlwZTo6SWRlbnRpdHkocm93cywgY29scyk7CisgIE90aGVyTWF0cml4VHlwZSBtMyA9IE90aGVyTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpICsgU2NhbGFyKDIwMCkgKiBPdGhlck1hdHJpeFR5cGU6OklkZW50aXR5KHJvd3MsIGNvbHMpOworCiAgIE1hdHJpeFR5cGUgbTFfY29weSA9IG0xOwogICBNYXRyaXhUeXBlIG0yX2NvcHkgPSBtMjsKICAgT3RoZXJNYXRyaXhUeXBlIG0zX2NvcHkgPSBtMzsKLSAgCisKICAgLy8gdGVzdCBzd2FwcGluZyAyIG1hdHJpY2VzIG9mIHNhbWUgdHlwZQotICBTY2FsYXIgKmQxPW0xLmRhdGEoKSwgKmQyPW0yLmRhdGEoKTsKKyAgU2NhbGFyICpkMSA9IG0xLmRhdGEoKSwgKmQyID0gbTIuZGF0YSgpOwogICBtMS5zd2FwKG0yKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMSxtMl9jb3B5KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMixtMV9jb3B5KTsKLSAgaWYoTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PUR5bmFtaWMpCi0gIHsKLSAgICBWRVJJRlkobTEuZGF0YSgpPT1kMik7Ci0gICAgVkVSSUZZKG0yLmRhdGEoKT09ZDEpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtMl9jb3B5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTFfY29weSk7CisgIGlmIChNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSB7CisgICAgVkVSSUZZKG0xLmRhdGEoKSA9PSBkMik7CisgICAgVkVSSUZZKG0yLmRhdGEoKSA9PSBkMSk7CiAgIH0KICAgbTEgPSBtMV9jb3B5OwogICBtMiA9IG0yX2NvcHk7Ci0gIAorCiAgIC8vIHRlc3Qgc3dhcHBpbmcgMiBtYXRyaWNlcyBvZiBkaWZmZXJlbnQgdHlwZXMKICAgbTEuc3dhcChtMyk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEsbTNfY29weSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTMsbTFfY29weSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIG0zX2NvcHkpOworICBWRVJJRllfSVNfQVBQUk9YKG0zLCBtMV9jb3B5KTsKICAgbTEgPSBtMV9jb3B5OwogICBtMyA9IG0zX2NvcHk7Ci0gIAorCiAgIC8vIHRlc3Qgc3dhcHBpbmcgbWF0cml4IHdpdGggZXhwcmVzc2lvbgotICBtMS5zd2FwKG0yLmJsb2NrKDAsMCxyb3dzLGNvbHMpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMSxtMl9jb3B5KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMixtMV9jb3B5KTsKKyAgbTEuc3dhcChtMi5ibG9jaygwLCAwLCByb3dzLCBjb2xzKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIG0yX2NvcHkpOworICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMV9jb3B5KTsKICAgbTEgPSBtMV9jb3B5OwogICBtMiA9IG0yX2NvcHk7CiAKICAgLy8gdGVzdCBzd2FwcGluZyB0d28gZXhwcmVzc2lvbnMgb2YgZGlmZmVyZW50IHR5cGVzCiAgIG0xLnRyYW5zcG9zZSgpLnN3YXAobTMudHJhbnNwb3NlKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLG0zX2NvcHkpOwotICBWRVJJRllfSVNfQVBQUk9YKG0zLG0xX2NvcHkpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtM19jb3B5KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMywgbTFfY29weSk7CiAgIG0xID0gbTFfY29weTsKICAgbTMgPSBtM19jb3B5OwogCiAgIGNoZWNrX3Jvd19zd2FwKG0xKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHN3YXApCi17Ci0gIGludCBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSk7Ci0gIENBTExfU1VCVEVTVF8xKCBzd2FwKE1hdHJpeDNmKCkpICk7IC8vIGZpeGVkIHNpemUsIG5vIHZlY3Rvcml6YXRpb24gCi0gIENBTExfU1VCVEVTVF8yKCBzd2FwKE1hdHJpeDRkKCkpICk7IC8vIGZpeGVkIHNpemUsIHBvc3NpYmxlIHZlY3Rvcml6YXRpb24gCi0gIENBTExfU1VCVEVTVF8zKCBzd2FwKE1hdHJpeFhkKHMscykpICk7IC8vIGR5biBzaXplLCBubyB2ZWN0b3JpemF0aW9uIAotICBDQUxMX1NVQlRFU1RfNCggc3dhcChNYXRyaXhYZihzLHMpKSApOyAvLyBkeW4gc2l6ZSwgcG9zc2libGUgdmVjdG9yaXphdGlvbiAKK0VJR0VOX0RFQ0xBUkVfVEVTVChzd2FwKSB7CisgIGludCBzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpOworICBDQUxMX1NVQlRFU1RfMShzd2FwKE1hdHJpeDNmKCkpKTsgICAgICAvLyBmaXhlZCBzaXplLCBubyB2ZWN0b3JpemF0aW9uCisgIENBTExfU1VCVEVTVF8yKHN3YXAoTWF0cml4NGQoKSkpOyAgICAgIC8vIGZpeGVkIHNpemUsIHBvc3NpYmxlIHZlY3Rvcml6YXRpb24KKyAgQ0FMTF9TVUJURVNUXzMoc3dhcChNYXRyaXhYZChzLCBzKSkpOyAgLy8gZHluIHNpemUsIG5vIHZlY3Rvcml6YXRpb24KKyAgQ0FMTF9TVUJURVNUXzQoc3dhcChNYXRyaXhYZihzLCBzKSkpOyAgLy8gZHluIHNpemUsIHBvc3NpYmxlIHZlY3Rvcml6YXRpb24KICAgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShzKQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9zeW1ib2xpY19pbmRleC5jcHAgYi90ZXN0L3N5bWJvbGljX2luZGV4LmNwcAppbmRleCA1M2ViNTVkLi4xYmQ1YmQ4IDEwMDY0NAotLS0gYS90ZXN0L3N5bWJvbGljX2luZGV4LmNwcAorKysgYi90ZXN0L3N5bWJvbGljX2luZGV4LmNwcApAQCAtOSw2NyArOSw2NSBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCit1c2luZyBFaWdlbjo6cGxhY2Vob2xkZXJzOjphbGw7CiB1c2luZyBFaWdlbjo6cGxhY2Vob2xkZXJzOjpsYXN0OwogdXNpbmcgRWlnZW46OnBsYWNlaG9sZGVyczo6bGFzdHAxOwotdXNpbmcgRWlnZW46OnBsYWNlaG9sZGVyczo6YWxsOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUMSx0eXBlbmFtZSBUMj4KLWJvb2wgaXNfc2FtZV9zeW1iKGNvbnN0IFQxJiBhLCBjb25zdCBUMiYgYiwgSW5kZXggc2l6ZSkKLXsKLSAgcmV0dXJuIGEuZXZhbChsYXN0PXNpemUtMSkgPT0gYi5ldmFsKGxhc3Q9c2l6ZS0xKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Citib29sIGlzX3NhbWVfc3ltYihjb25zdCBUMSYgYSwgY29uc3QgVDImIGIsIEluZGV4IHNpemUpIHsKKyAgcmV0dXJuIGEuZXZhbChsYXN0ID0gc2l6ZSAtIDEpID09IGIuZXZhbChsYXN0ID0gc2l6ZSAtIDEpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiB2b2lkIGNoZWNrX2lzX3N5bWJvbGljKGNvbnN0IFQmKSB7Ci0gIFNUQVRJQ19DSEVDSygoIHN5bWJvbGljOjppc19zeW1ib2xpYzxUPjo6dmFsdWUgKSkKKyAgU1RBVElDX0NIRUNLKChzeW1ib2xpYzo6aXNfc3ltYm9saWM8VD46OnZhbHVlKSkKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogdm9pZCBjaGVja19pc25vdF9zeW1ib2xpYyhjb25zdCBUJikgewotICBTVEFUSUNfQ0hFQ0soKCAhc3ltYm9saWM6OmlzX3N5bWJvbGljPFQ+Ojp2YWx1ZSApKQorICBTVEFUSUNfQ0hFQ0soKCFzeW1ib2xpYzo6aXNfc3ltYm9saWM8VD46OnZhbHVlKSkKIH0KIAotI2RlZmluZSBWRVJJRllfRVFfSU5UKEEsQikgVkVSSUZZX0lTX0FQUFJPWChpbnQoQSksaW50KEIpKQorI2RlZmluZSBWRVJJRllfRVFfSU5UKEEsIEIpIFZFUklGWV9JU19BUFBST1goaW50KEEpLCBpbnQoQikpCiAKLXZvaWQgY2hlY2tfc3ltYm9saWNfaW5kZXgoKQotewordm9pZCBjaGVja19zeW1ib2xpY19pbmRleCgpIHsKICAgY2hlY2tfaXNfc3ltYm9saWMobGFzdCk7CiAgIGNoZWNrX2lzX3N5bWJvbGljKGxhc3RwMSk7Ci0gIGNoZWNrX2lzX3N5bWJvbGljKGxhc3QrMSk7Ci0gIGNoZWNrX2lzX3N5bWJvbGljKGxhc3QtbGFzdHAxKTsKLSAgY2hlY2tfaXNfc3ltYm9saWMoMipsYXN0LWxhc3RwMS8yKTsKKyAgY2hlY2tfaXNfc3ltYm9saWMobGFzdCArIDEpOworICBjaGVja19pc19zeW1ib2xpYyhsYXN0IC0gbGFzdHAxKTsKKyAgY2hlY2tfaXNfc3ltYm9saWMoMiAqIGxhc3QgLSBsYXN0cDEgLyAyKTsKICAgY2hlY2tfaXNub3Rfc3ltYm9saWMoZml4PDM+KCkpOwogCi0gIEluZGV4IHNpemU9MTAwOworICBJbmRleCBzaXplID0gMTAwOwogCiAgIC8vIEZpcnN0LCBsZXQncyBjaGVjayBGaXhlZEludCBhcml0aG1ldGljOgotICBWRVJJRlkoIGlzX3NhbWVfdHlwZSggKGZpeDw1PigpLWZpeDwzPigpKSpmaXg8OT4oKS8oLWZpeDwzPigpKSwgZml4PC0oNS0zKSo5LzM+KCkgKSApOwotICBWRVJJRlkoIGlzX3NhbWVfdHlwZSggKGZpeDw1PigpLWZpeDwzPigpKSpmaXg8OT4oKS9maXg8Mj4oKSwgZml4PCg1LTMpKjkvMj4oKSApICk7Ci0gIFZFUklGWSggaXNfc2FtZV90eXBlKCBmaXg8OT4oKS9maXg8Mj4oKSwgZml4PDkvMj4oKSApICk7Ci0gIFZFUklGWSggaXNfc2FtZV90eXBlKCBmaXg8OT4oKSVmaXg8Mj4oKSwgZml4PDklMj4oKSApICk7Ci0gIFZFUklGWSggaXNfc2FtZV90eXBlKCBmaXg8OT4oKSZmaXg8Mj4oKSwgZml4PDkmMj4oKSApICk7Ci0gIFZFUklGWSggaXNfc2FtZV90eXBlKCBmaXg8OT4oKXxmaXg8Mj4oKSwgZml4PDl8Mj4oKSApICk7Ci0gIFZFUklGWSggaXNfc2FtZV90eXBlKCBmaXg8OT4oKS8yLCBpbnQoOS8yKSApICk7CisgIFZFUklGWShpc19zYW1lX3R5cGUoKGZpeDw1PigpIC0gZml4PDM+KCkpICogZml4PDk+KCkgLyAoLWZpeDwzPigpKSwgZml4PC0oNSAtIDMpICogOSAvIDM+KCkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfdHlwZSgoZml4PDU+KCkgLSBmaXg8Mz4oKSkgKiBmaXg8OT4oKSAvIGZpeDwyPigpLCBmaXg8KDUgLSAzKSAqIDkgLyAyPigpKSk7CisgIFZFUklGWShpc19zYW1lX3R5cGUoZml4PDk+KCkgLyBmaXg8Mj4oKSwgZml4PDkgLyAyPigpKSk7CisgIFZFUklGWShpc19zYW1lX3R5cGUoZml4PDk+KCkgJSBmaXg8Mj4oKSwgZml4PDkgJSAyPigpKSk7CisgIFZFUklGWShpc19zYW1lX3R5cGUoZml4PDk+KCkgJiBmaXg8Mj4oKSwgZml4PDkgJiAyPigpKSk7CisgIFZFUklGWShpc19zYW1lX3R5cGUoZml4PDk+KCkgfCBmaXg8Mj4oKSwgZml4PDkgfCAyPigpKSk7CisgIFZFUklGWShpc19zYW1lX3R5cGUoZml4PDk+KCkgLyAyLCBpbnQoOSAvIDIpKSk7CiAKLSAgVkVSSUZZKCBpc19zYW1lX3N5bWIoIGxhc3RwMS0xLCBsYXN0LCBzaXplKSApOwotICBWRVJJRlkoIGlzX3NhbWVfc3ltYiggbGFzdHAxLWZpeDwxPigpLCBsYXN0LCBzaXplKSApOworICBWRVJJRlkoaXNfc2FtZV9zeW1iKGxhc3RwMSAtIDEsIGxhc3QsIHNpemUpKTsKKyAgVkVSSUZZKGlzX3NhbWVfc3ltYihsYXN0cDEgLSBmaXg8MT4oKSwgbGFzdCwgc2l6ZSkpOwogCi0gIFZFUklGWV9JU19FUVVBTCggKCAobGFzdCo1LTIpLzMgKS5ldmFsKGxhc3Q9c2l6ZS0xKSwgKChzaXplLTEpKjUtMikvMyApOwotICBWRVJJRllfSVNfRVFVQUwoICggKGxhc3QqZml4PDU+KCktZml4PDI+KCkpL2ZpeDwzPigpICkuZXZhbChsYXN0PXNpemUtMSksICgoc2l6ZS0xKSo1LTIpLzMgKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCAoIC1sYXN0Kmxhc3RwMSAgKS5ldmFsKGxhc3Q9c2l6ZS0xKSwgLShzaXplLTEpKnNpemUgKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCAoIGxhc3RwMS0zKmxhc3QgICkuZXZhbChsYXN0PXNpemUtMSksIHNpemUtIDMqKHNpemUtMSkgKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCAoIChsYXN0cDEtMypsYXN0KS9sYXN0cDEgICkuZXZhbChsYXN0PXNpemUtMSksIChzaXplLSAzKihzaXplLTEpKS9zaXplICk7CisgIFZFUklGWV9JU19FUVVBTCgoKGxhc3QgKiA1IC0gMikgLyAzKS5ldmFsKGxhc3QgPSBzaXplIC0gMSksICgoc2l6ZSAtIDEpICogNSAtIDIpIC8gMyk7CisgIFZFUklGWV9JU19FUVVBTCgoKGxhc3QgKiBmaXg8NT4oKSAtIGZpeDwyPigpKSAvIGZpeDwzPigpKS5ldmFsKGxhc3QgPSBzaXplIC0gMSksICgoc2l6ZSAtIDEpICogNSAtIDIpIC8gMyk7CisgIFZFUklGWV9JU19FUVVBTCgoLWxhc3QgKiBsYXN0cDEpLmV2YWwobGFzdCA9IHNpemUgLSAxKSwgLShzaXplIC0gMSkgKiBzaXplKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChsYXN0cDEgLSAzICogbGFzdCkuZXZhbChsYXN0ID0gc2l6ZSAtIDEpLCBzaXplIC0gMyAqIChzaXplIC0gMSkpOworICBWRVJJRllfSVNfRVFVQUwoKChsYXN0cDEgLSAzICogbGFzdCkgLyBsYXN0cDEpLmV2YWwobGFzdCA9IHNpemUgLSAxKSwgKHNpemUgLSAzICogKHNpemUgLSAxKSkgLyBzaXplKTsKIAogICB7Ci0gICAgc3RydWN0IHhfdGFnIHt9OyAgc3RhdGljIGNvbnN0IHN5bWJvbGljOjpTeW1ib2xFeHByPHhfdGFnPiB4OwotICAgIHN0cnVjdCB5X3RhZyB7fTsgIHN0YXRpYyBjb25zdCBzeW1ib2xpYzo6U3ltYm9sRXhwcjx5X3RhZz4geTsKLSAgICBzdHJ1Y3Qgel90YWcge307ICBzdGF0aWMgY29uc3Qgc3ltYm9saWM6OlN5bWJvbEV4cHI8el90YWc+IHo7CisgICAgc3RydWN0IHhfdGFnIHt9OworICAgIHN0YXRpYyBjb25zdCBzeW1ib2xpYzo6U3ltYm9sRXhwcjx4X3RhZz4geDsKKyAgICBzdHJ1Y3QgeV90YWcge307CisgICAgc3RhdGljIGNvbnN0IHN5bWJvbGljOjpTeW1ib2xFeHByPHlfdGFnPiB5OworICAgIHN0cnVjdCB6X3RhZyB7fTsKKyAgICBzdGF0aWMgY29uc3Qgc3ltYm9saWM6OlN5bWJvbEV4cHI8el90YWc+IHo7CiAKLSAgICBWRVJJRllfSVNfQVBQUk9YKCBpbnQoKCh4KzMpL3kreikuZXZhbCh4PTYseT0zLHo9LTEzKSksICg2KzMpLzMrKC0xMykgKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGludCgoKHggKyAzKSAvIHkgKyB6KS5ldmFsKHggPSA2LCB5ID0gMywgeiA9IC0xMykpLCAoNiArIDMpIC8gMyArICgtMTMpKTsKICAgfQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1Qoc3ltYm9saWNfaW5kZXgpCi17Ci0gIENBTExfU1VCVEVTVF8xKCBjaGVja19zeW1ib2xpY19pbmRleCgpICk7Ci19CitFSUdFTl9ERUNMQVJFX1RFU1Qoc3ltYm9saWNfaW5kZXgpIHsgQ0FMTF9TVUJURVNUXzEoY2hlY2tfc3ltYm9saWNfaW5kZXgoKSk7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvdGhyZWFkc19ldmVudGNvdW50LmNwcCBiL3Rlc3QvdGhyZWFkc19ldmVudGNvdW50LmNwcAppbmRleCA3NmZhYjMxLi5iZDZlOWE4IDEwMDY0NAotLS0gYS90ZXN0L3RocmVhZHNfZXZlbnRjb3VudC5jcHAKKysrIGIvdGVzdC90aHJlYWRzX2V2ZW50Y291bnQuY3BwCkBAIC0yMyw4ICsyMyw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgdGVzdF9iYXNpY19ldmVudGNvdW50KCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfYmFzaWNfZXZlbnRjb3VudCgpIHsKICAgTWF4U2l6ZVZlY3RvcjxFdmVudENvdW50OjpXYWl0ZXI+IHdhaXRlcnMoMSk7CiAgIHdhaXRlcnMucmVzaXplKDEpOwogICBFdmVudENvdW50IGVjKHdhaXRlcnMpOwpAQCAtNTIsOCArNTEsNyBAQAogICAgICAgVkVSSUZZX0dFKHZhbCwgMCk7CiAgICAgICBWRVJJRllfTEUodmFsLCBrUXVldWVTaXplKTsKICAgICAgIGlmICh2YWwgPT0ga1F1ZXVlU2l6ZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHZhbF8uY29tcGFyZV9leGNoYW5nZV93ZWFrKHZhbCwgdmFsICsgMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpCi0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKHZhbF8uY29tcGFyZV9leGNoYW5nZV93ZWFrKHZhbCwgdmFsICsgMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpIHJldHVybiB0cnVlOwogICAgIH0KICAgfQogCkBAIC02Myw4ICs2MSw3IEBACiAgICAgICBWRVJJRllfR0UodmFsLCAwKTsKICAgICAgIFZFUklGWV9MRSh2YWwsIGtRdWV1ZVNpemUpOwogICAgICAgaWYgKHZhbCA9PSAwKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAodmFsXy5jb21wYXJlX2V4Y2hhbmdlX3dlYWsodmFsLCB2YWwgLSAxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSkKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBpZiAodmFsXy5jb21wYXJlX2V4Y2hhbmdlX3dlYWsodmFsLCB2YWwgLSAxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSkgcmV0dXJuIHRydWU7CiAgICAgfQogICB9CiAKQEAgLTc2LDggKzczLDcgQEAKIC8vIEEgbnVtYmVyIG9mIHByb2R1Y2VycyBzZW5kIG1lc3NhZ2VzIHRvIGEgc2V0IG9mIGNvbnN1bWVycyB1c2luZyBhIHNldCBvZgogLy8gZmFrZSBxdWV1ZXMuIEVuc3VyZSB0aGF0IGl0IGRvZXMgbm90IGNyYXNoLCBjb25zdW1lcnMgZG9uJ3QgZGVhZGxvY2sgYW5kCiAvLyBudW1iZXIgb2YgYmxvY2tlZCBhbmQgdW5ibG9ja2VkIHRocmVhZHMgbWF0Y2guCi1zdGF0aWMgdm9pZCB0ZXN0X3N0cmVzc19ldmVudGNvdW50KCkKLXsKK3N0YXRpYyB2b2lkIHRlc3Rfc3RyZXNzX2V2ZW50Y291bnQoKSB7CiAgIGNvbnN0IGludCBrVGhyZWFkcyA9IHN0ZDo6dGhyZWFkOjpoYXJkd2FyZV9jb25jdXJyZW5jeSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtFdmVudHMgPSAxIDw8IDE2OwogICBzdGF0aWMgY29uc3QgaW50IGtRdWV1ZXMgPSAxMDsKQEAgLTEzNSw4ICsxMzEsNyBAQAogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV9ldmVudGNvdW50KQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX2V2ZW50Y291bnQpIHsKICAgQ0FMTF9TVUJURVNUKHRlc3RfYmFzaWNfZXZlbnRjb3VudCgpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3Rfc3RyZXNzX2V2ZW50Y291bnQoKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L3RocmVhZHNfbm9uX2Jsb2NraW5nX3RocmVhZF9wb29sLmNwcCBiL3Rlc3QvdGhyZWFkc19ub25fYmxvY2tpbmdfdGhyZWFkX3Bvb2wuY3BwCmluZGV4IDI1YmE5NmMuLjJmMGNmNTggMTAwNjQ0Ci0tLSBhL3Rlc3QvdGhyZWFkc19ub25fYmxvY2tpbmdfdGhyZWFkX3Bvb2wuY3BwCisrKyBiL3Rlc3QvdGhyZWFkc19ub25fYmxvY2tpbmdfdGhyZWFkX3Bvb2wuY3BwCkBAIC0xMiw4ICsxMiw3IEBACiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgIkVpZ2VuL1RocmVhZFBvb2wiCiAKLXN0YXRpYyB2b2lkIHRlc3RfY3JlYXRlX2Rlc3Ryb3lfZW1wdHlfcG9vbCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X2NyZWF0ZV9kZXN0cm95X2VtcHR5X3Bvb2woKSB7CiAgIC8vIEp1c3QgY3JlYXRlIGFuZCBkZXN0cm95IHRoZSBwb29sLiBUaGlzIHdpbGwgd2luZCB1cCBhbmQgdGVhciBkb3duIHdvcmtlcgogICAvLyB0aHJlYWRzLiBFbnN1cmUgdGhlcmUgYXJlIG5vIGlzc3VlcyBpbiB0aGF0IGxvZ2ljLgogICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKQEAgLTIxLDkgKzIwLDcgQEAKICAgfQogfQogCi0KLXN0YXRpYyB2b2lkIHRlc3RfcGFyYWxsZWxpc20oYm9vbCBhbGxvd19zcGlubmluZykKLXsKK3N0YXRpYyB2b2lkIHRlc3RfcGFyYWxsZWxpc20oYm9vbCBhbGxvd19zcGlubmluZykgewogICAvLyBUZXN0IHdlIG5ldmVyLWV2ZXIgZmFpbCB0byBtYXRjaCBhdmFpbGFibGUgdGFza3Mgd2l0aCBpZGxlIHRocmVhZHMuCiAgIGNvbnN0IGludCBrVGhyZWFkcyA9IDE2OyAgLy8gY29kZSBiZWxvdyBleHBlY3RzIHRoYXQgdGhpcyBpcyBhIG11bHRpcGxlIG9mIDQKICAgVGhyZWFkUG9vbCB0cChrVGhyZWFkcywgYWxsb3dfc3Bpbm5pbmcpOwpAQCAtMTAwLDE3ICs5NywxMyBAQAogICB9CiB9CiAKLQotc3RhdGljIHZvaWQgdGVzdF9jYW5jZWwoKQoteworc3RhdGljIHZvaWQgdGVzdF9jYW5jZWwoKSB7CiAgIFRocmVhZFBvb2wgdHAoMik7CiAKICAgLy8gU2NoZWR1bGUgYSBsYXJnZSBudW1iZXIgb2YgY2xvc3VyZSB0aGF0IGVhY2ggc2xlZXBzIGZvciBvbmUgc2Vjb25kLiBUaGlzCiAgIC8vIHdpbGwga2VlcCB0aGUgdGhyZWFkIHBvb2wgYnVzeSBmb3IgbXVjaCBsb25nZXIgdGhhbiB0aGUgZGVmYXVsdCB0ZXN0IHRpbWVvdXQuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7Ci0gICAgdHAuU2NoZWR1bGUoW10oKSB7Ci0gICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDAwKSk7Ci0gICAgfSk7CisgICAgdHAuU2NoZWR1bGUoW10oKSB7IHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMDApKTsgfSk7CiAgIH0KIAogICAvLyBDYW5jZWwgdGhlIHByb2Nlc3Npbmcgb2YgYWxsIHRoZSBjbG9zdXJlcyB0aGF0IGFyZSBzdGlsbCBwZW5kaW5nLgpAQCAtMTY4LDkgKzE2MSw3IEBACiAgIHBoYXNlID0gMjsKIH0KIAotCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfbm9uX2Jsb2NraW5nX3RocmVhZF9wb29sKQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX25vbl9ibG9ja2luZ190aHJlYWRfcG9vbCkgewogICBDQUxMX1NVQlRFU1QodGVzdF9jcmVhdGVfZGVzdHJveV9lbXB0eV9wb29sKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9wYXJhbGxlbGlzbSh0cnVlKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3BhcmFsbGVsaXNtKGZhbHNlKSk7CmRpZmYgLS1naXQgYS90ZXN0L3RocmVhZHNfcnVucXVldWUuY3BwIGIvdGVzdC90aHJlYWRzX3J1bnF1ZXVlLmNwcAppbmRleCA5OTY2OGU3Li40ODQ3ZWFlIDEwMDY0NAotLS0gYS90ZXN0L3RocmVhZHNfcnVucXVldWUuY3BwCisrKyBiL3Rlc3QvdGhyZWFkc19ydW5xdWV1ZS5jcHAKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8RWlnZW4vVGhyZWFkUG9vbD4KIAotCiAvLyBWaXN1YWwgc3R1ZGlvIGRvZXNuJ3QgaW1wbGVtZW50IGEgcmFuZF9yKCkgZnVuY3Rpb24gc2luY2UgaXRzCiAvLyBpbXBsZW1lbnRhdGlvbiBvZiByYW5kKCkgaXMgYWxyZWFkeSB0aHJlYWQgc2FmZQogaW50IHJhbmRfcmVlbnRyYW50KHVuc2lnbmVkIGludCogcykgewpAQCAtMjUsOCArMjQsNyBAQAogI2VuZGlmCiB9CiAKLXZvaWQgdGVzdF9iYXNpY19ydW5xdWV1ZSgpCi17Cit2b2lkIHRlc3RfYmFzaWNfcnVucXVldWUoKSB7CiAgIFJ1blF1ZXVlPGludCwgND4gcTsKICAgLy8gQ2hlY2sgZW1wdHkgc3RhdGUuCiAgIFZFUklGWShxLkVtcHR5KCkpOwpAQCAtMTE3LDggKzExNSw3IEBACiAvLyAxIGVsZW1lbnQgKGVpdGhlciBmcm9udCBvciBiYWNrIGF0IHJhbmRvbSkuIFNvIHF1ZXVlIGFsd2F5cyBjb250YWlucyBhdCBsZWFzdAogLy8gMSBlbGVtZW50LCBidXQgb3RoZXJ3aXNlIGNoYW5nZXMgY2hhb3RpY2FsbHkuIEFub3RoZXIgdGhyZWFkIGNvbnN0YW50bHkgdGVzdHMKIC8vIHRoYXQgdGhlIHF1ZXVlIGlzIG5vdCBjbGFpbWVkIHRvIGJlIGVtcHR5Lgotdm9pZCB0ZXN0X2VtcHR5X3J1bnF1ZXVlKCkKLXsKK3ZvaWQgdGVzdF9lbXB0eV9ydW5xdWV1ZSgpIHsKICAgUnVuUXVldWU8aW50LCA0PiBxOwogICBxLlB1c2hGcm9udCgxKTsKICAgc3RkOjphdG9taWM8Ym9vbD4gZG9uZShmYWxzZSk7CkBAIC0xNTcsOCArMTU0LDcgQEAKIC8vIFN0cmVzcyBpcyBhIGNoYW90aWMgcmFuZG9tIHRlc3QuCiAvLyBPbmUgdGhyZWFkIChvd25lcikgY2FsbHMgUHVzaEZyb250L1BvcEZyb250LCBvdGhlciB0aHJlYWRzIGNhbGwgUHVzaEJhY2svCiAvLyBQb3BCYWNrLiBFbnN1cmUgdGhhdCB3ZSBkb24ndCBjcmFzaCwgZGVhZGxvY2ssIGFuZCBhbGwgc2FuaXR5IGNoZWNrcyBwYXNzLgotdm9pZCB0ZXN0X3N0cmVzc19ydW5xdWV1ZSgpCi17Cit2b2lkIHRlc3Rfc3RyZXNzX3J1bnF1ZXVlKCkgewogICBzdGF0aWMgY29uc3QgaW50IGtFdmVudHMgPSAxIDw8IDE4OwogICBSdW5RdWV1ZTxpbnQsIDg+IHE7CiAgIHN0ZDo6YXRvbWljPGludD4gdG90YWwoMCk7CkBAIC0yMjcsOCArMjIzLDcgQEAKICAgVkVSSUZZKHRvdGFsLmxvYWQoKSA9PSAwKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3J1bnF1ZXVlKQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3J1bnF1ZXVlKSB7CiAgIENBTExfU1VCVEVTVF8xKHRlc3RfYmFzaWNfcnVucXVldWUoKSk7CiAgIENBTExfU1VCVEVTVF8yKHRlc3RfZW1wdHlfcnVucXVldWUoKSk7CiAgIENBTExfU1VCVEVTVF8zKHRlc3Rfc3RyZXNzX3J1bnF1ZXVlKCkpOwpkaWZmIC0tZ2l0IGEvdGVzdC90cmlhbmd1bGFyLmNwcCBiL3Rlc3QvdHJpYW5ndWxhci5jcHAKaW5kZXggMDU3OGIwOC4uNjJiYjc3NCAxMDA2NDQKLS0tIGEvdGVzdC90cmlhbmd1bGFyLmNwcAorKysgYi90ZXN0L3RyaWFuZ3VsYXIuY3BwCkBAIC04LDczICs4LDY3IEBACiAvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KIAogI2lmIGRlZmluZWQoRUlHRU5fVEVTVF9QQVJUXzEwMCkgfHwgZGVmaW5lZChFSUdFTl9URVNUX1BBUlRfQUxMKQotIyAgZGVmaW5lIEVJR0VOX05PX0RFUFJFQ0FURURfV0FSTklORworI2RlZmluZSBFSUdFTl9OT19ERVBSRUNBVEVEX1dBUk5JTkcKICNlbmRpZgogCiAjaW5jbHVkZSAibWFpbi5oIgogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgdHJpYW5ndWxhcl9kZXByZWNhdGVkKGNvbnN0IE1hdHJpeFR5cGUgJm0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdHJpYW5ndWxhcl9kZXByZWNhdGVkKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgSW5kZXggcm93cyA9IG0ucm93cygpOwogICBJbmRleCBjb2xzID0gbS5jb2xzKCk7CiAgIE1hdHJpeFR5cGUgbTEsIG0yLCBtMywgbTQ7Ci0gIG0xLnNldFJhbmRvbShyb3dzLGNvbHMpOwotICBtMi5zZXRSYW5kb20ocm93cyxjb2xzKTsKLSAgbTMgPSBtMTsgbTQgPSBtMjsKKyAgbTEuc2V0UmFuZG9tKHJvd3MsIGNvbHMpOworICBtMi5zZXRSYW5kb20ocm93cywgY29scyk7CisgIG0zID0gbTE7CisgIG00ID0gbTI7CiAgIC8vIGRlcHJlY2F0ZWQgbWV0aG9kOgogICBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkuc3dhcChtMik7CiAgIC8vIHVzZSB0aGlzIG1ldGhvZCBpbnN0ZWFkOgogICBtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkuc3dhcChtNC50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLG0zKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMixtNCk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTQpOwogICAvLyBkZXByZWNhdGVkIG1ldGhvZDoKICAgbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpLnN3YXAobTQpOwogICAvLyB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZDoKICAgbTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpLnN3YXAobTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8RWlnZW46Okxvd2VyPigpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMSxtMyk7Ci0gIFZFUklGWV9JU19BUFBST1gobTIsbTQpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLCBtMyk7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG00KTsKIH0KIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHRyaWFuZ3VsYXJfc3F1YXJlKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdHJpYW5ndWxhcl9zcXVhcmUoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcj46OlJlYWwgUmVhbFNjYWxhcjsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gVmVjdG9yVHlwZTsKIAotICBSZWFsU2NhbGFyIGxhcmdlckVwcyA9IDEwKnRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCk7CisgIFJlYWxTY2FsYXIgbGFyZ2VyRXBzID0gMTAgKiB0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpOwogCiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwogCi0gIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTIgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksCi0gICAgICAgICAgICAgbTMocm93cywgY29scyksCi0gICAgICAgICAgICAgbTQocm93cywgY29scyksCi0gICAgICAgICAgICAgcjEocm93cywgY29scyksCi0gICAgICAgICAgICAgcjIocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKSwgbTQocm93cywgY29scyksCisgICAgICAgICAgICAgcjEocm93cywgY29scyksIHIyKHJvd3MsIGNvbHMpOwogICBWZWN0b3JUeXBlIHYyID0gVmVjdG9yVHlwZTo6UmFuZG9tKHJvd3MpOwogICBWZWN0b3JUeXBlIHYzID0gVmVjdG9yVHlwZTo6WmVybyhyb3dzKTsKIAogICBNYXRyaXhUeXBlIG0xdXAgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKICAgTWF0cml4VHlwZSBtMnVwID0gbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CiAKLSAgaWYgKHJvd3MqY29scz4xKQotICB7CisgIGlmIChyb3dzICogY29scyA+IDEpIHsKICAgICBWRVJJRlkobTF1cC5pc1VwcGVyVHJpYW5ndWxhcigpKTsKICAgICBWRVJJRlkobTJ1cC50cmFuc3Bvc2UoKS5pc0xvd2VyVHJpYW5ndWxhcigpKTsKICAgICBWRVJJRlkoIW0yLmlzTG93ZXJUcmlhbmd1bGFyKCkpOwogICB9CiAKLS8vICAgVkVSSUZZX0lTX0FQUFJPWChtMXVwLnRyYW5zcG9zZSgpICogbTIsIG0xLnVwcGVyKCkudHJhbnNwb3NlKCkubG93ZXIoKSAqIG0yKTsKKyAgLy8gICBWRVJJRllfSVNfQVBQUk9YKG0xdXAudHJhbnNwb3NlKCkgKiBtMiwgbTEudXBwZXIoKS50cmFuc3Bvc2UoKS5sb3dlcigpICogbTIpOwogCiAgIC8vIHRlc3Qgb3ZlcmxvYWRlZCBvcGVyYXRvcis9CiAgIHIxLnNldFplcm8oKTsKICAgcjIuc2V0WmVybygpOwotICByMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSArPSAgbTE7CisgIHIxLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpICs9IG0xOwogICByMiArPSBtMXVwOwotICBWRVJJRllfSVNfQVBQUk9YKHIxLHIyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyMSwgcjIpOwogCiAgIC8vIHRlc3Qgb3ZlcmxvYWRlZCBvcGVyYXRvcj0KICAgbTEuc2V0WmVybygpOwpAQCAtOTEsOCArODUsOCBAQAogICAgICAgICAgICAgICAgICAgIG0zLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSk7CiAKICAgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7Ci0gIGZvciAoaW50IGk9MDsgaTxyb3dzOyArK2kpCi0gICAgd2hpbGUgKG51bWV4dDo6YWJzMihtMShpLGkpKTxSZWFsU2NhbGFyKDFlLTEpKSBtMShpLGkpID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgKytpKQorICAgIHdoaWxlIChudW1leHQ6OmFiczIobTEoaSwgaSkpIDwgUmVhbFNjYWxhcigxZS0xKSkgbTEoaSwgaSkgPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oKTsKIAogICBUcmFuc3Bvc2U8TWF0cml4VHlwZT4gdHJtNChtNCk7CiAgIC8vIHRlc3QgYmFjayBhbmQgZm9yd2FyZCBzdWJzdGl0dXRpb24gd2l0aCBhIHZlY3RvciBhcyB0aGUgcmhzCkBAIC0xMzgsOCArMTMyLDggQEAKICAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCk7CiAgIFZFUklGWShtMi5pc0FwcHJveChtMyAqIChtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVbml0VXBwZXI+KCkuc29sdmUobTIpKSwgbGFyZ2VyRXBzKSk7CiAKLS8vICAgVkVSSUZZKCggIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCi0vLyAgICAgICAgICAgKiBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSkuaXNVcHBlclRyaWFuZ3VsYXIoKSk7CisgIC8vICAgVkVSSUZZKCggIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpCisgIC8vICAgICAgICAgICAqIG0yLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpKS5pc1VwcGVyVHJpYW5ndWxhcigpKTsKIAogICAvLyB0ZXN0IHN3YXAKICAgbTEuc2V0T25lcygpOwpAQCAtMTQ3LDYzICsxNDEsNjQgQEAKICAgbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc3dhcChtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxFaWdlbjo6VXBwZXI+KCkpOwogICBtMy5zZXRaZXJvKCk7CiAgIG0zLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnNldE9uZXMoKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMixtMyk7CisgIFZFUklGWV9JU19BUFBST1gobTIsIG0zKTsKIAogICBtMS5zZXRSYW5kb20oKTsKICAgbTMgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKLSAgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIER5bmFtaWM+IG01KGNvbHMsIGludGVybmFsOjpyYW5kb208aW50PigxLDIwKSk7ICBtNS5zZXRSYW5kb20oKTsKLSAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IG02KGludGVybmFsOjpyYW5kb208aW50PigxLDIwKSwgcm93cyk7ICBtNi5zZXRSYW5kb20oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIG01LCBtMyptNSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTYqbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCksIG02Km0zKTsKKyAgTWF0cml4PFNjYWxhciwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIER5bmFtaWM+IG01KGNvbHMsIGludGVybmFsOjpyYW5kb208aW50PigxLCAyMCkpOworICBtNS5zZXRSYW5kb20oKTsKKyAgTWF0cml4PFNjYWxhciwgRHluYW1pYywgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IG02KGludGVybmFsOjpyYW5kb208aW50PigxLCAyMCksIHJvd3MpOworICBtNi5zZXRSYW5kb20oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSAqIG01LCBtMyAqIG01KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtNiAqIG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLCBtNiAqIG0zKTsKIAogICBtMXVwID0gbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CiAgIFZFUklGWV9JU19BUFBST1gobTEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSwgbTF1cCk7CiAgIFZFUklGWV9JU19BUFBST1gobTF1cC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkudG9EZW5zZU1hdHJpeCgpLCBtMXVwKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpLCBtMXVwLmFkam9pbnQoKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTF1cC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpLCBtMXVwLmFkam9pbnQoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PFVwcGVyPigpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSwKKyAgICAgICAgICAgICAgICAgICBtMXVwLmFkam9pbnQoKSk7CisgIFZFUklGWV9JU19BUFBST1gobTF1cC50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8VXBwZXI+KCkudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpLAorICAgICAgICAgICAgICAgICAgIG0xdXAuYWRqb2ludCgpKTsKIAogICBWRVJJRllfSVNfQVBQUk9YKG0xLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxVcHBlcj4oKS5kaWFnb25hbCgpLCBtMS5kaWFnb25hbCgpKTsKIAogICBtMy5zZXRSYW5kb20oKTsKICAgY29uc3QgTWF0cml4VHlwZSYgbTNjKG0zKTsKLSAgVkVSSUZZKCBpc19zYW1lX3R5cGUobTNjLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLG0zLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRlbXBsYXRlIGNvbmp1Z2F0ZUlmPGZhbHNlPigpKSApOwotICBWRVJJRlkoIGlzX3NhbWVfdHlwZShtM2MudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuY29uanVnYXRlKCksbTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudGVtcGxhdGUgY29uanVnYXRlSWY8dHJ1ZT4oKSkgKTsKKyAgVkVSSUZZKGlzX3NhbWVfdHlwZShtM2MudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCksCisgICAgICAgICAgICAgICAgICAgICAgbTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudGVtcGxhdGUgY29uanVnYXRlSWY8ZmFsc2U+KCkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfdHlwZShtM2MudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkuY29uanVnYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgbTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudGVtcGxhdGUgY29uanVnYXRlSWY8dHJ1ZT4oKSkpOwogICBWRVJJRllfSVNfQVBQUk9YKG0zLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRlbXBsYXRlIGNvbmp1Z2F0ZUlmPHRydWU+KCkudG9EZW5zZU1hdHJpeCgpLAogICAgICAgICAgICAgICAgICAgIG0zLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSk7CiAgIFZFUklGWV9JU19BUFBST1gobTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudGVtcGxhdGUgY29uanVnYXRlSWY8ZmFsc2U+KCkudG9EZW5zZU1hdHJpeCgpLAogICAgICAgICAgICAgICAgICAgIG0zLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSk7CiAKLSAgVkVSSUZZKCBpc19zYW1lX3R5cGUobTNjLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSxtMy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudGVtcGxhdGUgY29uanVnYXRlSWY8ZmFsc2U+KCkpICk7Ci0gIFZFUklGWSggaXNfc2FtZV90eXBlKG0zYy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuY29uanVnYXRlKCksbTMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnRlbXBsYXRlIGNvbmp1Z2F0ZUlmPHRydWU+KCkpICk7CisgIFZFUklGWShpc19zYW1lX3R5cGUobTNjLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICBtMy50ZW1wbGF0ZSBzZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkudGVtcGxhdGUgY29uanVnYXRlSWY8ZmFsc2U+KCkpKTsKKyAgVkVSSUZZKGlzX3NhbWVfdHlwZShtM2MudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLmNvbmp1Z2F0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIG0zLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS50ZW1wbGF0ZSBjb25qdWdhdGVJZjx0cnVlPigpKSk7CiAgIFZFUklGWV9JU19BUFBST1gobTMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnRlbXBsYXRlIGNvbmp1Z2F0ZUlmPHRydWU+KCkudG9EZW5zZU1hdHJpeCgpLAogICAgICAgICAgICAgICAgICAgIG0zLmNvbmp1Z2F0ZSgpLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS50b0RlbnNlTWF0cml4KCkpOwogICBWRVJJRllfSVNfQVBQUk9YKG0zLnRlbXBsYXRlIHNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS50ZW1wbGF0ZSBjb25qdWdhdGVJZjxmYWxzZT4oKS50b0RlbnNlTWF0cml4KCksCiAgICAgICAgICAgICAgICAgICAgbTMudGVtcGxhdGUgc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLnRvRGVuc2VNYXRyaXgoKSk7Ci0KIH0KIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHRyaWFuZ3VsYXJfcmVjdChjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRyaWFuZ3VsYXJfcmVjdChjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOwotICBlbnVtIHsgUm93cyA9ICBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgQ29scyA9ICBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSB9OworICBlbnVtIHsgUm93cyA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBDb2xzID0gTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgfTsKIAogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKIAotICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG0yID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG0zKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIG00KHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIHIxKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgIHIyKHJvd3MsIGNvbHMpOworICBNYXRyaXhUeXBlIG0xID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLCBtMiA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwgbTMocm93cywgY29scyksIG00KHJvd3MsIGNvbHMpLAorICAgICAgICAgICAgIHIxKHJvd3MsIGNvbHMpLCByMihyb3dzLCBjb2xzKTsKIAogICBNYXRyaXhUeXBlIG0xdXAgPSBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKTsKICAgTWF0cml4VHlwZSBtMnVwID0gbTIudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCk7CiAKLSAgaWYgKHJvd3M+MSAmJiBjb2xzPjEpCi0gIHsKKyAgaWYgKHJvd3MgPiAxICYmIGNvbHMgPiAxKSB7CiAgICAgVkVSSUZZKG0xdXAuaXNVcHBlclRyaWFuZ3VsYXIoKSk7CiAgICAgVkVSSUZZKG0ydXAudHJhbnNwb3NlKCkuaXNMb3dlclRyaWFuZ3VsYXIoKSk7CiAgICAgVkVSSUZZKCFtMi5pc0xvd2VyVHJpYW5ndWxhcigpKTsKQEAgLTIxMiw5ICsyMDcsOSBAQAogICAvLyB0ZXN0IG92ZXJsb2FkZWQgb3BlcmF0b3IrPQogICByMS5zZXRaZXJvKCk7CiAgIHIyLnNldFplcm8oKTsKLSAgcjEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkgKz0gIG0xOworICByMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKSArPSBtMTsKICAgcjIgKz0gbTF1cDsKLSAgVkVSSUZZX0lTX0FQUFJPWChyMSxyMik7CisgIFZFUklGWV9JU19BUFBST1gocjEsIHIyKTsKIAogICAvLyB0ZXN0IG92ZXJsb2FkZWQgb3BlcmF0b3I9CiAgIG0xLnNldFplcm8oKTsKQEAgLTIyMiw3ICsyMTcsNiBAQAogICBtMyA9IDMgKiBtMjsKICAgVkVSSUZZX0lTX0FQUFJPWChtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS50b0RlbnNlTWF0cml4KCksIG0xKTsKIAotCiAgIG0xLnNldFplcm8oKTsKICAgbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkgPSAzICogbTI7CiAgIFZFUklGWV9JU19BUFBST1gobTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpLCBtMSk7CkBAIC0yMzEsNyArMjI1LDYgQEAKICAgbTEudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8U3RyaWN0bHlVcHBlcj4oKSA9IDMgKiBtMjsKICAgVkVSSUZZX0lTX0FQUFJPWChtMy50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseVVwcGVyPigpLnRvRGVuc2VNYXRyaXgoKSwgbTEpOwogCi0KICAgbTEuc2V0WmVybygpOwogICBtMS50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxTdHJpY3RseUxvd2VyPigpID0gMyAqIG0yOwogICBWRVJJRllfSVNfQVBQUk9YKG0zLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PFN0cmljdGx5TG93ZXI+KCkudG9EZW5zZU1hdHJpeCgpLCBtMSk7CkBAIC0yNjIsMzkgKzI1NSwzOCBAQAogICBtMi50ZW1wbGF0ZSB0cmlhbmd1bGFyVmlldzxVcHBlcj4oKS5zd2FwKG0xLnRlbXBsYXRlIHRyaWFuZ3VsYXJWaWV3PEVpZ2VuOjpVcHBlcj4oKSk7CiAgIG0zLnNldFplcm8oKTsKICAgbTMudGVtcGxhdGUgdHJpYW5ndWxhclZpZXc8VXBwZXI+KCkuc2V0T25lcygpOwotICBWRVJJRllfSVNfQVBQUk9YKG0yLG0zKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMiwgbTMpOwogfQogCi12b2lkIGJ1Z18xNTkoKQotewordm9pZCBidWdfMTU5KCkgewogICBNYXRyaXgzZCBtID0gTWF0cml4M2Q6OlJhbmRvbSgpLnRyaWFuZ3VsYXJWaWV3PExvd2VyPigpOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUobSkKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHRyaWFuZ3VsYXIpCi17Ci0gIGludCBtYXhzaXplID0gKHN0ZDo6bWluKShFSUdFTl9URVNUX01BWF9TSVpFLDIwKTsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0IDsgaSsrKQotICB7Ci0gICAgaW50IHIgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMixtYXhzaXplKTsgVEVTVF9TRVRfQlVUX1VOVVNFRF9WQVJJQUJMRShyKQotICAgIGludCBjID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsbWF4c2l6ZSk7IFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUoYykKK0VJR0VOX0RFQ0xBUkVfVEVTVCh0cmlhbmd1bGFyKSB7CisgIGludCBtYXhzaXplID0gKHN0ZDo6bWluKShFSUdFTl9URVNUX01BWF9TSVpFLCAyMCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIGludCByID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsIG1heHNpemUpOworICAgIFRFU1RfU0VUX0JVVF9VTlVTRURfVkFSSUFCTEUocikKKyAgICBpbnQgYyA9IGludGVybmFsOjpyYW5kb208aW50PigyLCBtYXhzaXplKTsKKyAgICBURVNUX1NFVF9CVVRfVU5VU0VEX1ZBUklBQkxFKGMpCiAKLSAgICBDQUxMX1NVQlRFU1RfMSggdHJpYW5ndWxhcl9zcXVhcmUoTWF0cml4PGZsb2F0LCAxLCAxPigpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCB0cmlhbmd1bGFyX3NxdWFyZShNYXRyaXg8ZmxvYXQsIDIsIDI+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIHRyaWFuZ3VsYXJfc3F1YXJlKE1hdHJpeDNkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIHRyaWFuZ3VsYXJfc3F1YXJlKE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LDgsIDg+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIHRyaWFuZ3VsYXJfc3F1YXJlKE1hdHJpeFhjZChyLHIpKSApOwotICAgIENBTExfU1VCVEVTVF82KCB0cmlhbmd1bGFyX3NxdWFyZShNYXRyaXg8ZmxvYXQsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPihyLCByKSkgKTsKKyAgICBDQUxMX1NVQlRFU1RfMSh0cmlhbmd1bGFyX3NxdWFyZShNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMih0cmlhbmd1bGFyX3NxdWFyZShNYXRyaXg8ZmxvYXQsIDIsIDI+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyh0cmlhbmd1bGFyX3NxdWFyZShNYXRyaXgzZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQodHJpYW5ndWxhcl9zcXVhcmUoTWF0cml4PHN0ZDo6Y29tcGxleDxmbG9hdD4sIDgsIDg+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSh0cmlhbmd1bGFyX3NxdWFyZShNYXRyaXhYY2QociwgcikpKTsKKyAgICBDQUxMX1NVQlRFU1RfNih0cmlhbmd1bGFyX3NxdWFyZShNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPihyLCByKSkpOwogCi0gICAgQ0FMTF9TVUJURVNUXzcoIHRyaWFuZ3VsYXJfcmVjdChNYXRyaXg8ZmxvYXQsIDQsIDU+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzgoIHRyaWFuZ3VsYXJfcmVjdChNYXRyaXg8ZG91YmxlLCA2LCAyPigpKSApOwotICAgIENBTExfU1VCVEVTVF85KCB0cmlhbmd1bGFyX3JlY3QoTWF0cml4WGNmKHIsIGMpKSApOwotICAgIENBTExfU1VCVEVTVF81KCB0cmlhbmd1bGFyX3JlY3QoTWF0cml4WGNkKHIsIGMpKSApOwotICAgIENBTExfU1VCVEVTVF82KCB0cmlhbmd1bGFyX3JlY3QoTWF0cml4PGZsb2F0LER5bmFtaWMsRHluYW1pYyxSb3dNYWpvcj4ociwgYykpICk7CisgICAgQ0FMTF9TVUJURVNUXzcodHJpYW5ndWxhcl9yZWN0KE1hdHJpeDxmbG9hdCwgNCwgNT4oKSkpOworICAgIENBTExfU1VCVEVTVF84KHRyaWFuZ3VsYXJfcmVjdChNYXRyaXg8ZG91YmxlLCA2LCAyPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzkodHJpYW5ndWxhcl9yZWN0KE1hdHJpeFhjZihyLCBjKSkpOworICAgIENBTExfU1VCVEVTVF81KHRyaWFuZ3VsYXJfcmVjdChNYXRyaXhYY2QociwgYykpKTsKKyAgICBDQUxMX1NVQlRFU1RfNih0cmlhbmd1bGFyX3JlY3QoTWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBSb3dNYWpvcj4ociwgYykpKTsKIAotICAgIENBTExfU1VCVEVTVF8xMDAoIHRyaWFuZ3VsYXJfZGVwcmVjYXRlZChNYXRyaXg8ZmxvYXQsIDUsIDc+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEwMCggdHJpYW5ndWxhcl9kZXByZWNhdGVkKE1hdHJpeFhkKHIsYykpICk7CisgICAgQ0FMTF9TVUJURVNUXzEwMCh0cmlhbmd1bGFyX2RlcHJlY2F0ZWQoTWF0cml4PGZsb2F0LCA1LCA3PigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEwMCh0cmlhbmd1bGFyX2RlcHJlY2F0ZWQoTWF0cml4WGQociwgYykpKTsKICAgfQotICAKLSAgQ0FMTF9TVUJURVNUXzEoIGJ1Z18xNTkoKSApOworCisgIENBTExfU1VCVEVTVF8xKGJ1Z18xNTkoKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L3R1cGxlX3Rlc3QuY3BwIGIvdGVzdC90dXBsZV90ZXN0LmNwcAppbmRleCBjM2JiZTM3Li4zM2JlYmQyIDEwMDY0NAotLS0gYS90ZXN0L3R1cGxlX3Rlc3QuY3BwCisrKyBiL3Rlc3QvdHVwbGVfdGVzdC5jcHAKQEAgLTE0LDEzICsxNCwxMyBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW46OmludGVybmFsOwogdXNpbmcgRWlnZW46OmludGVybmFsOjp0dXBsZV9pbXBsOjp0dXBsZTsKLSAgCi12b2lkIGJhc2ljX3R1cGxlX3Rlc3QoKSB7ICAKKwordm9pZCBiYXNpY190dXBsZV90ZXN0KCkgewogICAvLyBDb25zdHJ1Y3Rpb24uCi0gIHR1cGxlPD4gdHVwbGUwIHt9OwotICB0dXBsZTxpbnQ+IHR1cGxlMSB7MX07Ci0gIHR1cGxlPGludCwgZmxvYXQ+IHR1cGxlMiB7MywgNS4wZn07Ci0gIHR1cGxlPGludCwgZmxvYXQsIGRvdWJsZT4gdHVwbGUzIHs3LCAxMS4wZiwgMTMuMH07CisgIHR1cGxlPD4gdHVwbGUwe307CisgIHR1cGxlPGludD4gdHVwbGUxezF9OworICB0dXBsZTxpbnQsIGZsb2F0PiB0dXBsZTJ7MywgNS4wZn07CisgIHR1cGxlPGludCwgZmxvYXQsIGRvdWJsZT4gdHVwbGUzezcsIDExLjBmLCAxMy4wfTsKICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rpb24uCiAgIHR1cGxlPD4gdHVwbGUwZGVmYXVsdDsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKHR1cGxlMGRlZmF1bHQpCkBAIC0zMCw3ICszMCw3IEBACiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRSh0dXBsZTJkZWZhdWx0KQogICB0dXBsZTxpbnQsIGZsb2F0LCBkb3VibGU+IHR1cGxlM2RlZmF1bHQ7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRSh0dXBsZTNkZWZhdWx0KQotICAKKwogICAvLyBBc3NpZ25tZW50LgogICB0dXBsZTw+IHR1cGxlMGIgPSB0dXBsZTA7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRSh0dXBsZTBiKQpAQCAtNDAsMTggKzQwLDE4IEBACiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRSh0dXBsZTJiKQogICBkZWNsdHlwZSh0dXBsZTMpIHR1cGxlM2IgPSB0dXBsZTM7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRSh0dXBsZTNiKQotICAKKwogICAvLyBnZXQuCiAgIFZFUklGWV9JU19FUVVBTCh0dXBsZV9pbXBsOjpnZXQ8MD4odHVwbGUzKSwgNyk7CiAgIFZFUklGWV9JU19FUVVBTCh0dXBsZV9pbXBsOjpnZXQ8MT4odHVwbGUzKSwgMTEuMGYpOwogICBWRVJJRllfSVNfRVFVQUwodHVwbGVfaW1wbDo6Z2V0PDI+KHR1cGxlMyksIDEzLjApOwotICAKKwogICAvLyB0dXBsZV9pbXBsOjp0dXBsZV9zaXplLgogICBWRVJJRllfSVNfRVFVQUwodHVwbGVfaW1wbDo6dHVwbGVfc2l6ZTxkZWNsdHlwZSh0dXBsZTApPjo6dmFsdWUsIHNpemVfdCgwKSk7CiAgIFZFUklGWV9JU19FUVVBTCh0dXBsZV9pbXBsOjp0dXBsZV9zaXplPGRlY2x0eXBlKHR1cGxlMSk+Ojp2YWx1ZSwgc2l6ZV90KDEpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHR1cGxlX2ltcGw6OnR1cGxlX3NpemU8ZGVjbHR5cGUodHVwbGUyKT46OnZhbHVlLCBzaXplX3QoMikpOwogICBWRVJJRllfSVNfRVFVQUwodHVwbGVfaW1wbDo6dHVwbGVfc2l6ZTxkZWNsdHlwZSh0dXBsZTMpPjo6dmFsdWUsIHNpemVfdCgzKSk7Ci0gIAorCiAgIC8vIHR1cGxlX2ltcGw6OnR1cGxlX2NhdC4KICAgYXV0byB0dXBsZTJjYXQzID0gdHVwbGVfaW1wbDo6dHVwbGVfY2F0KHR1cGxlMiwgdHVwbGUzKTsKICAgVkVSSUZZX0lTX0VRVUFMKHR1cGxlX2ltcGw6OnR1cGxlX3NpemU8ZGVjbHR5cGUodHVwbGUyY2F0Myk+Ojp2YWx1ZSwgc2l6ZV90KDUpKTsKQEAgLTY1LDMyICs2NSwyOSBAQAogICBWRVJJRllfSVNfRVFVQUwodHVwbGVfaW1wbDo6dHVwbGVfc2l6ZTxkZWNsdHlwZShlbXB0eWNhdCk+Ojp2YWx1ZSwgc2l6ZV90KDApKTsKICAgYXV0byB0dXBsZTBjYXQxY2F0MmNhdDMgPSB0dXBsZV9pbXBsOjp0dXBsZV9jYXQodHVwbGUwLCB0dXBsZTEsIHR1cGxlMiwgdHVwbGUzKTsKICAgVkVSSUZZX0lTX0VRVUFMKHR1cGxlX2ltcGw6OnR1cGxlX3NpemU8ZGVjbHR5cGUodHVwbGUwY2F0MWNhdDJjYXQzKT46OnZhbHVlLCBzaXplX3QoNikpOwotICAKKwogICAvLyBtYWtlX3R1cGxlLgogICAvLyBUaGUgdHVwbGUgdHlwZXMgc2hvdWxkIHVzZXMgdmFsdWVzIGZvciB0aGUgc2Vjb25kIGFuZCBmb3VydGggcGFyYW1ldGVycy4KICAgZG91YmxlIHRtcCA9IDIwOwogICBhdXRvIHR1cGxlX21ha2UgPSB0dXBsZV9pbXBsOjptYWtlX3R1cGxlKGludCgxMCksIHRtcCwgZmxvYXQoMjAuMGYpLCB0dXBsZTApOwotICBWRVJJRlkoIChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUodHVwbGVfbWFrZSksIHR1cGxlPGludCwgZG91YmxlLCBmbG9hdCwgdHVwbGU8PiA+ID46OnZhbHVlKSApOworICBWRVJJRlkoKHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSh0dXBsZV9tYWtlKSwgdHVwbGU8aW50LCBkb3VibGUsIGZsb2F0LCB0dXBsZTw+ID4gPjo6dmFsdWUpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHR1cGxlX2ltcGw6OmdldDwxPih0dXBsZV9tYWtlKSwgdG1wKTsKLSAgCisKICAgLy8gZm9yd2FyZF9hc190dXBsZS4KICAgLy8gVGhlIHR1cGxlIHR5cGVzIHNob3VsZCB1c2VzIHJlZmVyZW5jZXMgZm9yIHRoZSBzZWNvbmQgYW5kIGZvdXJ0aCBwYXJhbWV0ZXJzLgogICBhdXRvIHR1cGxlX2ZvcndhcmQgPSB0dXBsZV9pbXBsOjpmb3J3YXJkX2FzX3R1cGxlKGludCgxMCksIHRtcCwgZmxvYXQoMjAuMGYpLCB0dXBsZTApOwotICBWRVJJRlkoIChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUodHVwbGVfZm9yd2FyZCksIHR1cGxlPGludCwgZG91YmxlJiwgZmxvYXQsIHR1cGxlPD4mID4gPjo6dmFsdWUpICk7CisgIFZFUklGWSgoc3RkOjppc19zYW1lPGRlY2x0eXBlKHR1cGxlX2ZvcndhcmQpLCB0dXBsZTxpbnQsIGRvdWJsZSYsIGZsb2F0LCB0dXBsZTw+Jj4gPjo6dmFsdWUpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHR1cGxlX2ltcGw6OmdldDwxPih0dXBsZV9mb3J3YXJkKSwgdG1wKTsKLSAgCisKICAgLy8gdGllLgogICBhdXRvIHR1cGxlX3RpZSA9IHR1cGxlX2ltcGw6OnRpZSh0dXBsZTAsIHR1cGxlMSwgdHVwbGUyLCB0dXBsZTMpOwotICBWRVJJRlkoIChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUodHVwbGVfdGllKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICB0dXBsZTxkZWNsdHlwZSh0dXBsZTApJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKHR1cGxlMSkmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHR5cGUodHVwbGUyKSYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZSh0dXBsZTMpJj4gPjo6dmFsdWUpICk7Ci0gIFZFUklGWV9JU19FUVVBTCggKHR1cGxlX2ltcGw6OmdldDwxPih0dXBsZV9pbXBsOjpnZXQ8Mj4odHVwbGVfdGllKSkpLCA1LjBmICk7CisgIFZFUklGWSgoc3RkOjppc19zYW1lPGRlY2x0eXBlKHR1cGxlX3RpZSksCisgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlPGRlY2x0eXBlKHR1cGxlMCkmLCBkZWNsdHlwZSh0dXBsZTEpJiwgZGVjbHR5cGUodHVwbGUyKSYsIGRlY2x0eXBlKHR1cGxlMykmPiA+Ojp2YWx1ZSkpOworICBWRVJJRllfSVNfRVFVQUwoKHR1cGxlX2ltcGw6OmdldDwxPih0dXBsZV9pbXBsOjpnZXQ8Mj4odHVwbGVfdGllKSkpLCA1LjBmKTsKICAgLy8gTW9kaWZ5IHZhbHVlIGFuZCBlbnN1cmUgdHVwbGUyIGlzIHVwZGF0ZWQuCiAgIHR1cGxlX2ltcGw6OmdldDwxPih0dXBsZV9pbXBsOjpnZXQ8Mj4odHVwbGVfdGllKSkgPSAxMC4wZjsKLSAgVkVSSUZZX0lTX0VRVUFMKCAodHVwbGVfaW1wbDo6Z2V0PDE+KHR1cGxlMikpLCAxMC4wZiApOwotICAKKyAgVkVSSUZZX0lTX0VRVUFMKCh0dXBsZV9pbXBsOjpnZXQ8MT4odHVwbGUyKSksIDEwLjBmKTsKKwogICAvLyBBc3NpZ25tZW50LgogICBpbnQgeCA9IC0xOwogICBmbG9hdCB5ID0gLTE7CkBAIC0xMTAsMTQgKzEwNywxMyBAQAogICB0dXBsZTxFaWdlbjo6TWF0cml4M2QsIEVpZ2VuOjpNYXRyaXhYZD4gdHVwbGU7CiAgIHR1cGxlX2ltcGw6OmdldDwwPih0dXBsZSkuc2V0UmFuZG9tKCk7CiAgIHR1cGxlX2ltcGw6OmdldDwxPih0dXBsZSkuc2V0UmFuZG9tKDEwLCAxMCk7Ci0gIAorCiAgIGF1dG8gdHVwbGVfdGllID0gdHVwbGVfaW1wbDo6dGllKHR1cGxlX2ltcGw6OmdldDwwPih0dXBsZSksIHR1cGxlX2ltcGw6OmdldDwxPih0dXBsZSkpOwogICB0dXBsZV9pbXBsOjpnZXQ8MT4odHVwbGVfdGllKS5zZXRJZGVudGl0eSgpOwogICBWRVJJRlkodHVwbGVfaW1wbDo6Z2V0PDE+KHR1cGxlKS5pc0lkZW50aXR5KCkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QodHVwbGUpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QodHVwbGUpIHsKICAgQ0FMTF9TVUJURVNUKGJhc2ljX3R1cGxlX3Rlc3QoKSk7CiAgIENBTExfU1VCVEVTVChlaWdlbl90dXBsZV90ZXN0KCkpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC90eXBlX2FsaWFzLmNwcCBiL3Rlc3QvdHlwZV9hbGlhcy5jcHAKaW5kZXggMGEyMjNkOS4uMTYxOWQ4MyAxMDA2NDQKLS0tIGEvdGVzdC90eXBlX2FsaWFzLmNwcAorKysgYi90ZXN0L3R5cGVfYWxpYXMuY3BwCkBAIC05LDM1ICs5LDMzIEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAKLUVJR0VOX0RFQ0xBUkVfVEVTVCh0eXBlX2FsaWFzKQoteworRUlHRU5fREVDTEFSRV9URVNUKHR5cGVfYWxpYXMpIHsKICAgdXNpbmcgbmFtZXNwYWNlIGludGVybmFsOwogCiAgIC8vIFRvIHdhcm0gdXAsIHNvbWUgYmFzaWMgY2hlY2tzOgotICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8TWF0cml4WGQsTWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWM+ID46OnZhbHVlKSk7Ci0gIFNUQVRJQ19DSEVDSygoaXNfc2FtZTxNYXRyaXgyZixNYXRyaXg8ZmxvYXQsMiwyPiA+Ojp2YWx1ZSkpOwotICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8QXJyYXkzM2ksQXJyYXk8aW50LDMsMz4gPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpc19zYW1lPE1hdHJpeFhkLCBNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljPiA+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8TWF0cml4MmYsIE1hdHJpeDxmbG9hdCwgMiwgMj4gPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpc19zYW1lPEFycmF5MzNpLCBBcnJheTxpbnQsIDMsIDM+ID46OnZhbHVlKSk7CiAKLSAgU1RBVElDX0NIRUNLKChpc19zYW1lPE1hdHJpeFg8ZG91YmxlPiwgICAgTWF0cml4WGQ+Ojp2YWx1ZSkpOwotICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8TWF0cml4WDxpbnQ+LCAgICAgICBNYXRyaXhYaT46OnZhbHVlKSk7Ci0gIFNUQVRJQ19DSEVDSygoaXNfc2FtZTxNYXRyaXgyPGludD4sICAgICAgIE1hdHJpeDJpPjo6dmFsdWUpKTsKLSAgU1RBVElDX0NIRUNLKChpc19zYW1lPE1hdHJpeDJYPGZsb2F0PiwgICAgTWF0cml4MlhmPjo6dmFsdWUpKTsKLSAgU1RBVElDX0NIRUNLKChpc19zYW1lPE1hdHJpeFg0PGRvdWJsZT4sICAgTWF0cml4WDRkPjo6dmFsdWUpKTsKLSAgU1RBVElDX0NIRUNLKChpc19zYW1lPFZlY3Rvclg8aW50PiwgICAgICAgVmVjdG9yWGk+Ojp2YWx1ZSkpOwotICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8VmVjdG9yMjxmbG9hdD4sICAgICBWZWN0b3IyZj46OnZhbHVlKSk7Ci0gIFNUQVRJQ19DSEVDSygoaXNfc2FtZTxSb3dWZWN0b3JYPGludD4sICAgIFJvd1ZlY3RvclhpPjo6dmFsdWUpKTsKLSAgU1RBVElDX0NIRUNLKChpc19zYW1lPFJvd1ZlY3RvcjI8ZmxvYXQ+LCAgUm93VmVjdG9yMmY+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8TWF0cml4WDxkb3VibGU+LCBNYXRyaXhYZD46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoaXNfc2FtZTxNYXRyaXhYPGludD4sIE1hdHJpeFhpPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpc19zYW1lPE1hdHJpeDI8aW50PiwgTWF0cml4Mmk+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8TWF0cml4Mlg8ZmxvYXQ+LCBNYXRyaXgyWGY+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8TWF0cml4WDQ8ZG91YmxlPiwgTWF0cml4WDRkPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpc19zYW1lPFZlY3Rvclg8aW50PiwgVmVjdG9yWGk+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8VmVjdG9yMjxmbG9hdD4sIFZlY3RvcjJmPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpc19zYW1lPFJvd1ZlY3Rvclg8aW50PiwgUm93VmVjdG9yWGk+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8Um93VmVjdG9yMjxmbG9hdD4sIFJvd1ZlY3RvcjJmPjo6dmFsdWUpKTsKIAotICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8QXJyYXlYWDxmbG9hdD4sICAgICBBcnJheVhYZj46OnZhbHVlKSk7Ci0gIFNUQVRJQ19DSEVDSygoaXNfc2FtZTxBcnJheTMzPGludD4sICAgICAgIEFycmF5MzNpPjo6dmFsdWUpKTsKLSAgU1RBVElDX0NIRUNLKChpc19zYW1lPEFycmF5Mlg8ZmxvYXQ+LCAgICAgQXJyYXkyWGY+Ojp2YWx1ZSkpOwotICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8QXJyYXlYNDxkb3VibGU+LCAgICBBcnJheVg0ZD46OnZhbHVlKSk7Ci0gIFNUQVRJQ19DSEVDSygoaXNfc2FtZTxBcnJheVg8ZG91YmxlPiwgICAgIEFycmF5WGQ+Ojp2YWx1ZSkpOwotICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8QXJyYXk0PGRvdWJsZT4sICAgICBBcnJheTRkPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpc19zYW1lPEFycmF5WFg8ZmxvYXQ+LCBBcnJheVhYZj46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoaXNfc2FtZTxBcnJheTMzPGludD4sIEFycmF5MzNpPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpc19zYW1lPEFycmF5Mlg8ZmxvYXQ+LCBBcnJheTJYZj46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoaXNfc2FtZTxBcnJheVg0PGRvdWJsZT4sIEFycmF5WDRkPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpc19zYW1lPEFycmF5WDxkb3VibGU+LCBBcnJheVhkPjo6dmFsdWUpKTsKKyAgU1RBVElDX0NIRUNLKChpc19zYW1lPEFycmF5NDxkb3VibGU+LCBBcnJheTRkPjo6dmFsdWUpKTsKIAotICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8VmVjdG9yPGZsb2F0LDM+LCAgICAgICAgVmVjdG9yM2Y+Ojp2YWx1ZSkpOwotICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8VmVjdG9yPGludCxEeW5hbWljPiwgICAgVmVjdG9yWGk+Ojp2YWx1ZSkpOwotICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8Um93VmVjdG9yPGZsb2F0LDM+LCAgICAgUm93VmVjdG9yM2Y+Ojp2YWx1ZSkpOwotICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8Um93VmVjdG9yPGludCxEeW5hbWljPiwgUm93VmVjdG9yWGk+Ojp2YWx1ZSkpOwotCisgIFNUQVRJQ19DSEVDSygoaXNfc2FtZTxWZWN0b3I8ZmxvYXQsIDM+LCBWZWN0b3IzZj46OnZhbHVlKSk7CisgIFNUQVRJQ19DSEVDSygoaXNfc2FtZTxWZWN0b3I8aW50LCBEeW5hbWljPiwgVmVjdG9yWGk+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8Um93VmVjdG9yPGZsb2F0LCAzPiwgUm93VmVjdG9yM2Y+Ojp2YWx1ZSkpOworICBTVEFUSUNfQ0hFQ0soKGlzX3NhbWU8Um93VmVjdG9yPGludCwgRHluYW1pYz4sIFJvd1ZlY3RvclhpPjo6dmFsdWUpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW1leWFtYS5jcHAgYi90ZXN0L3VtZXlhbWEuY3BwCmluZGV4IDE3MGMyOGEuLjJmNmZlMzQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW1leWFtYS5jcHAKKysrIGIvdGVzdC91bWV5YW1hLmNwcApAQCAtMTIsMTUgKzEyLDE0IEBACiAjaW5jbHVkZSA8RWlnZW4vQ29yZT4KICNpbmNsdWRlIDxFaWdlbi9HZW9tZXRyeT4KIAotI2luY2x1ZGUgPEVpZ2VuL0xVPiAvLyByZXF1aXJlZCBmb3IgTWF0cml4QmFzZTo6ZGV0ZXJtaW5hbnQKLSNpbmNsdWRlIDxFaWdlbi9TVkQ+IC8vIHJlcXVpcmVkIGZvciBTVkQKKyNpbmNsdWRlIDxFaWdlbi9MVT4gICAvLyByZXF1aXJlZCBmb3IgTWF0cml4QmFzZTo6ZGV0ZXJtaW5hbnQKKyNpbmNsdWRlIDxFaWdlbi9TVkQ+ICAvLyByZXF1aXJlZCBmb3IgU1ZECiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAogLy8gIENvbnN0cnVjdHMgYSByYW5kb20gbWF0cml4IGZyb20gdGhlIHVuaXRhcnkgZ3JvdXAgVShzaXplKS4KIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotRWlnZW46Ok1hdHJpeDxULCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWM+IHJhbmRNYXRyaXhVbml0YXJ5KGludCBzaXplKQoteworRWlnZW46Ok1hdHJpeDxULCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWM+IHJhbmRNYXRyaXhVbml0YXJ5KGludCBzaXplKSB7CiAgIHR5cGVkZWYgVCBTY2FsYXI7CiAgIHR5cGVkZWYgRWlnZW46Ok1hdHJpeDxTY2FsYXIsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYz4gTWF0cml4VHlwZTsKIApAQCAtMjksMzIgKzI4LDI3IEBACiAgIGludCBtYXhfdHJpZXMgPSA0MDsKICAgYm9vbCBpc191bml0YXJ5ID0gZmFsc2U7CiAKLSAgd2hpbGUgKCFpc191bml0YXJ5ICYmIG1heF90cmllcyA+IDApCi0gIHsKKyAgd2hpbGUgKCFpc191bml0YXJ5ICYmIG1heF90cmllcyA+IDApIHsKICAgICAvLyBpbml0aWFsaXplIHJhbmRvbSBtYXRyaXgKICAgICBRID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOwogCiAgICAgLy8gb3J0aG9nb25hbGl6ZSBjb2x1bW5zIHVzaW5nIHRoZSBHcmFtLVNjaG1pZHQgYWxnb3JpdGhtCi0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgc2l6ZTsgKytjb2wpCi0gICAgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHNpemU7ICsrY29sKSB7CiAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpDb2xYcHIgY29sVmVjID0gUS5jb2woY29sKTsKLSAgICAgIGZvciAoaW50IHByZXZDb2wgPSAwOyBwcmV2Q29sIDwgY29sOyArK3ByZXZDb2wpCi0gICAgICB7CisgICAgICBmb3IgKGludCBwcmV2Q29sID0gMDsgcHJldkNvbCA8IGNvbDsgKytwcmV2Q29sKSB7CiAgICAgICAgIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkNvbFhwciBwcmV2Q29sVmVjID0gUS5jb2wocHJldkNvbCk7Ci0gICAgICAgIGNvbFZlYyAtPSBjb2xWZWMuZG90KHByZXZDb2xWZWMpKnByZXZDb2xWZWM7CisgICAgICAgIGNvbFZlYyAtPSBjb2xWZWMuZG90KHByZXZDb2xWZWMpICogcHJldkNvbFZlYzsKICAgICAgIH0KICAgICAgIFEuY29sKGNvbCkgPSBjb2xWZWMubm9ybWFsaXplZCgpOwogICAgIH0KIAogICAgIC8vIHRoaXMgYWRkaXRpb25hbCBvcnRob2dvbmFsaXphdGlvbiBpcyBub3QgbmVjZXNzYXJ5IGluIHRoZW9yeSBidXQgc2hvdWxkIGVuaGFuY2UKICAgICAvLyB0aGUgbnVtZXJpY2FsIG9ydGhvZ29uYWxpdHkgb2YgdGhlIG1hdHJpeAotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHNpemU7ICsrcm93KQotICAgIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBzaXplOyArK3JvdykgewogICAgICAgdHlwZW5hbWUgTWF0cml4VHlwZTo6Um93WHByIHJvd1ZlYyA9IFEucm93KHJvdyk7Ci0gICAgICBmb3IgKGludCBwcmV2Um93ID0gMDsgcHJldlJvdyA8IHJvdzsgKytwcmV2Um93KQotICAgICAgeworICAgICAgZm9yIChpbnQgcHJldlJvdyA9IDA7IHByZXZSb3cgPCByb3c7ICsrcHJldlJvdykgewogICAgICAgICB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSb3dYcHIgcHJldlJvd1ZlYyA9IFEucm93KHByZXZSb3cpOwotICAgICAgICByb3dWZWMgLT0gcm93VmVjLmRvdChwcmV2Um93VmVjKSpwcmV2Um93VmVjOworICAgICAgICByb3dWZWMgLT0gcm93VmVjLmRvdChwcmV2Um93VmVjKSAqIHByZXZSb3dWZWM7CiAgICAgICB9CiAgICAgICBRLnJvdyhyb3cpID0gcm93VmVjLm5vcm1hbGl6ZWQoKTsKICAgICB9CkBAIC02NCwxNiArNTgsMTQgQEAKICAgICAtLW1heF90cmllczsKICAgfQogCi0gIGlmIChtYXhfdHJpZXMgPT0gMCkKLSAgICBlaWdlbl9hc3NlcnQoZmFsc2UgJiYgInJhbmRNYXRyaXhVbml0YXJ5OiBDb3VsZCBub3QgY29uc3RydWN0IHVuaXRhcnkgbWF0cml4ISIpOworICBpZiAobWF4X3RyaWVzID09IDApIGVpZ2VuX2Fzc2VydChmYWxzZSAmJiAicmFuZE1hdHJpeFVuaXRhcnk6IENvdWxkIG5vdCBjb25zdHJ1Y3QgdW5pdGFyeSBtYXRyaXghIik7CiAKICAgcmV0dXJuIFE7CiB9CiAKIC8vICBDb25zdHJ1Y3RzIGEgcmFuZG9tIG1hdHJpeCBmcm9tIHRoZSBzcGVjaWFsIHVuaXRhcnkgZ3JvdXAgU1Uoc2l6ZSkuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLUVpZ2VuOjpNYXRyaXg8VCwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljPiByYW5kTWF0cml4U3BlY2lhbFVuaXRhcnkoaW50IHNpemUpCi17CitFaWdlbjo6TWF0cml4PFQsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYz4gcmFuZE1hdHJpeFNwZWNpYWxVbml0YXJ5KGludCBzaXplKSB7CiAgIHR5cGVkZWYgVCBTY2FsYXI7CiAKICAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwgRWlnZW46OkR5bmFtaWMsIEVpZ2VuOjpEeW5hbWljPiBNYXRyaXhUeXBlOwpAQCAtODgsOCArODAsNyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXZvaWQgcnVuX3Rlc3QoaW50IGRpbSwgaW50IG51bV9lbGVtZW50cykKLXsKK3ZvaWQgcnVuX3Rlc3QoaW50IGRpbSwgaW50IG51bV9lbGVtZW50cykgewogICB1c2luZyBzdGQ6OmFiczsKICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYz4gTWF0cml4WDsKQEAgLTEwMCwyOSArOTEsMjggQEAKICAgY29uc3QgU2NhbGFyIGMgPSBhYnMoaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkpOwogCiAgIE1hdHJpeFggUiA9IHJhbmRNYXRyaXhTcGVjaWFsVW5pdGFyeTxTY2FsYXI+KGRpbSk7Ci0gIFZlY3RvclggdCA9IFNjYWxhcig1MCkqVmVjdG9yWDo6UmFuZG9tKGRpbSwxKTsKKyAgVmVjdG9yWCB0ID0gU2NhbGFyKDUwKSAqIFZlY3Rvclg6OlJhbmRvbShkaW0sIDEpOwogCi0gIE1hdHJpeFggY1JfdCA9IE1hdHJpeFg6OklkZW50aXR5KGRpbSsxLGRpbSsxKTsKLSAgY1JfdC5ibG9jaygwLDAsZGltLGRpbSkgPSBjKlI7Ci0gIGNSX3QuYmxvY2soMCxkaW0sZGltLDEpID0gdDsKKyAgTWF0cml4WCBjUl90ID0gTWF0cml4WDo6SWRlbnRpdHkoZGltICsgMSwgZGltICsgMSk7CisgIGNSX3QuYmxvY2soMCwgMCwgZGltLCBkaW0pID0gYyAqIFI7CisgIGNSX3QuYmxvY2soMCwgZGltLCBkaW0sIDEpID0gdDsKIAotICBNYXRyaXhYIHNyYyA9IE1hdHJpeFg6OlJhbmRvbShkaW0rMSwgbnVtX2VsZW1lbnRzKTsKKyAgTWF0cml4WCBzcmMgPSBNYXRyaXhYOjpSYW5kb20oZGltICsgMSwgbnVtX2VsZW1lbnRzKTsKICAgc3JjLnJvdyhkaW0pID0gTWF0cml4PFNjYWxhciwgMSwgRHluYW1pYz46OkNvbnN0YW50KG51bV9lbGVtZW50cywgU2NhbGFyKDEpKTsKIAotICBNYXRyaXhYIGRzdCA9IGNSX3Qqc3JjOworICBNYXRyaXhYIGRzdCA9IGNSX3QgKiBzcmM7CiAKLSAgTWF0cml4WCBjUl90X3VtZXlhbWEgPSB1bWV5YW1hKHNyYy5ibG9jaygwLDAsZGltLG51bV9lbGVtZW50cyksIGRzdC5ibG9jaygwLDAsZGltLG51bV9lbGVtZW50cykpOworICBNYXRyaXhYIGNSX3RfdW1leWFtYSA9IHVtZXlhbWEoc3JjLmJsb2NrKDAsIDAsIGRpbSwgbnVtX2VsZW1lbnRzKSwgZHN0LmJsb2NrKDAsIDAsIGRpbSwgbnVtX2VsZW1lbnRzKSk7CiAKLSAgY29uc3QgU2NhbGFyIGVycm9yID0gKCBjUl90X3VtZXlhbWEqc3JjIC0gZHN0ICkubm9ybSgpIC8gZHN0Lm5vcm0oKTsKLSAgVkVSSUZZKGVycm9yIDwgU2NhbGFyKDQwKSpzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OmVwc2lsb24oKSk7CisgIGNvbnN0IFNjYWxhciBlcnJvciA9IChjUl90X3VtZXlhbWEgKiBzcmMgLSBkc3QpLm5vcm0oKSAvIGRzdC5ub3JtKCk7CisgIFZFUklGWShlcnJvciA8IFNjYWxhcig0MCkgKiBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OmVwc2lsb24oKSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbWVuc2lvbj4KLXZvaWQgcnVuX2ZpeGVkX3NpemVfdGVzdChpbnQgbnVtX2VsZW1lbnRzKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IERpbWVuc2lvbj4KK3ZvaWQgcnVuX2ZpeGVkX3NpemVfdGVzdChpbnQgbnVtX2VsZW1lbnRzKSB7CiAgIHVzaW5nIHN0ZDo6YWJzOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERpbWVuc2lvbisxLCBEeW5hbWljPiBNYXRyaXhYOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERpbWVuc2lvbisxLCBEaW1lbnNpb24rMT4gSG9tTWF0cml4OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERpbWVuc2lvbiArIDEsIER5bmFtaWM+IE1hdHJpeFg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRGltZW5zaW9uICsgMSwgRGltZW5zaW9uICsgMT4gSG9tTWF0cml4OwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIERpbWVuc2lvbiwgRGltZW5zaW9uPiBGaXhlZE1hdHJpeDsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEaW1lbnNpb24sIDE+IEZpeGVkVmVjdG9yOwogCkBAIC0xMzQsMzYgKzEyNCwzMyBAQAogICBjb25zdCBTY2FsYXIgYyA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigwLjUsIDIuMCk7CiAKICAgRml4ZWRNYXRyaXggUiA9IHJhbmRNYXRyaXhTcGVjaWFsVW5pdGFyeTxTY2FsYXI+KGRpbSk7Ci0gIEZpeGVkVmVjdG9yIHQgPSBTY2FsYXIoMzIpKkZpeGVkVmVjdG9yOjpSYW5kb20oZGltLDEpOworICBGaXhlZFZlY3RvciB0ID0gU2NhbGFyKDMyKSAqIEZpeGVkVmVjdG9yOjpSYW5kb20oZGltLCAxKTsKIAotICBIb21NYXRyaXggY1JfdCA9IEhvbU1hdHJpeDo6SWRlbnRpdHkoZGltKzEsZGltKzEpOwotICBjUl90LmJsb2NrKDAsMCxkaW0sZGltKSA9IGMqUjsKLSAgY1JfdC5ibG9jaygwLGRpbSxkaW0sMSkgPSB0OworICBIb21NYXRyaXggY1JfdCA9IEhvbU1hdHJpeDo6SWRlbnRpdHkoZGltICsgMSwgZGltICsgMSk7CisgIGNSX3QuYmxvY2soMCwgMCwgZGltLCBkaW0pID0gYyAqIFI7CisgIGNSX3QuYmxvY2soMCwgZGltLCBkaW0sIDEpID0gdDsKIAotICBNYXRyaXhYIHNyYyA9IE1hdHJpeFg6OlJhbmRvbShkaW0rMSwgbnVtX2VsZW1lbnRzKTsKKyAgTWF0cml4WCBzcmMgPSBNYXRyaXhYOjpSYW5kb20oZGltICsgMSwgbnVtX2VsZW1lbnRzKTsKICAgc3JjLnJvdyhkaW0pID0gTWF0cml4PFNjYWxhciwgMSwgRHluYW1pYz46OkNvbnN0YW50KG51bV9lbGVtZW50cywgU2NhbGFyKDEpKTsKIAotICBNYXRyaXhYIGRzdCA9IGNSX3Qqc3JjOworICBNYXRyaXhYIGRzdCA9IGNSX3QgKiBzcmM7CiAKLSAgQmxvY2s8TWF0cml4WCwgRGltZW5zaW9uLCBEeW5hbWljPiBzcmNfYmxvY2soc3JjLDAsMCxkaW0sbnVtX2VsZW1lbnRzKTsKLSAgQmxvY2s8TWF0cml4WCwgRGltZW5zaW9uLCBEeW5hbWljPiBkc3RfYmxvY2soZHN0LDAsMCxkaW0sbnVtX2VsZW1lbnRzKTsKKyAgQmxvY2s8TWF0cml4WCwgRGltZW5zaW9uLCBEeW5hbWljPiBzcmNfYmxvY2soc3JjLCAwLCAwLCBkaW0sIG51bV9lbGVtZW50cyk7CisgIEJsb2NrPE1hdHJpeFgsIERpbWVuc2lvbiwgRHluYW1pYz4gZHN0X2Jsb2NrKGRzdCwgMCwgMCwgZGltLCBudW1fZWxlbWVudHMpOwogCiAgIEhvbU1hdHJpeCBjUl90X3VtZXlhbWEgPSB1bWV5YW1hKHNyY19ibG9jaywgZHN0X2Jsb2NrKTsKIAotICBjb25zdCBTY2FsYXIgZXJyb3IgPSAoIGNSX3RfdW1leWFtYSpzcmMgLSBkc3QgKS5zcXVhcmVkTm9ybSgpOworICBjb25zdCBTY2FsYXIgZXJyb3IgPSAoY1JfdF91bWV5YW1hICogc3JjIC0gZHN0KS5zcXVhcmVkTm9ybSgpOwogCi0gIFZFUklGWShlcnJvciA8IFNjYWxhcigxNikqc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjplcHNpbG9uKCkpOworICBWRVJJRlkoZXJyb3IgPCBTY2FsYXIoMTYpICogc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjplcHNpbG9uKCkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QodW1leWFtYSkKLXsKLSAgZm9yIChpbnQgaT0wOyBpPGdfcmVwZWF0OyArK2kpCi0gIHsKLSAgICBjb25zdCBpbnQgbnVtX2VsZW1lbnRzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDQwLDUwMCk7CitFSUdFTl9ERUNMQVJFX1RFU1QodW1leWFtYSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyArK2kpIHsKKyAgICBjb25zdCBpbnQgbnVtX2VsZW1lbnRzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDQwLCA1MDApOwogCiAgICAgLy8gd29ya3MgYWxzbyBmb3IgZGltZW5zaW9ucyBiaWdnZXIgdGhhbiAzLi4uCi0gICAgZm9yIChpbnQgZGltPTI7IGRpbTw4OyArK2RpbSkKLSAgICB7CisgICAgZm9yIChpbnQgZGltID0gMjsgZGltIDwgODsgKytkaW0pIHsKICAgICAgIENBTExfU1VCVEVTVF8xKHJ1bl90ZXN0PE1hdHJpeFhkPihkaW0sIG51bV9lbGVtZW50cykpOwogICAgICAgQ0FMTF9TVUJURVNUXzIocnVuX3Rlc3Q8TWF0cml4WGY+KGRpbSwgbnVtX2VsZW1lbnRzKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bWZwYWNrX3N1cHBvcnQuY3BwIGIvdGVzdC91bWZwYWNrX3N1cHBvcnQuY3BwCmluZGV4IGQ4ZjJhNmYuLjk0YWE1Y2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW1mcGFja19zdXBwb3J0LmNwcAorKysgYi90ZXN0L3VtZnBhY2tfc3VwcG9ydC5jcHAKQEAgLTEyLDIzICsxMiwyMSBAQAogCiAjaW5jbHVkZSA8RWlnZW4vVW1mUGFja1N1cHBvcnQ+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4gdm9pZCB0ZXN0X3VtZnBhY2tfc3VwcG9ydF9UKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Cit2b2lkIHRlc3RfdW1mcGFja19zdXBwb3J0X1QoKSB7CiAgIFVtZlBhY2tMVTxTcGFyc2VNYXRyaXg8VDEsIENvbE1ham9yLCBUMj4gPiB1bWZwYWNrX2NvbG1ham9yOwogICBVbWZQYWNrTFU8U3BhcnNlTWF0cml4PFQxLCBSb3dNYWpvciwgVDI+ID4gdW1mcGFja19yb3dtYWpvcjsKLSAgCisKICAgY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKHVtZnBhY2tfY29sbWFqb3IpOwogICBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcodW1mcGFja19yb3dtYWpvcik7Ci0gIAorCiAgIGNoZWNrX3NwYXJzZV9zcXVhcmVfZGV0ZXJtaW5hbnQodW1mcGFja19jb2xtYWpvcik7CiAgIGNoZWNrX3NwYXJzZV9zcXVhcmVfZGV0ZXJtaW5hbnQodW1mcGFja19yb3dtYWpvcik7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVCh1bWZwYWNrX3N1cHBvcnQpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QodW1mcGFja19zdXBwb3J0KSB7CiAgIENBTExfU1VCVEVTVF8xKCh0ZXN0X3VtZnBhY2tfc3VwcG9ydF9UPGRvdWJsZSwgaW50PigpKSk7CiAgIENBTExfU1VCVEVTVF8yKCh0ZXN0X3VtZnBhY2tfc3VwcG9ydF9UPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBpbnQ+KCkpKTsKLSAgQ0FMTF9TVUJURVNUXzMoKHRlc3RfdW1mcGFja19zdXBwb3J0X1Q8ZG91YmxlLCBsb25nID4oKSkpOworICBDQUxMX1NVQlRFU1RfMygodGVzdF91bWZwYWNrX3N1cHBvcnRfVDxkb3VibGUsIGxvbmc+KCkpKTsKICAgQ0FMTF9TVUJURVNUXzQoKHRlc3RfdW1mcGFja19zdXBwb3J0X1Q8c3RkOjpjb21wbGV4PGRvdWJsZT4sIGxvbmc+KCkpKTsKIH0KLQpkaWZmIC0tZ2l0IGEvdGVzdC91bmFsaWduZWRjb3VudC5jcHAgYi90ZXN0L3VuYWxpZ25lZGNvdW50LmNwcAppbmRleCA0MGI5YWI4Li5mNTA4YjFhIDEwMDY0NAotLS0gYS90ZXN0L3VuYWxpZ25lZGNvdW50LmNwcAorKysgYi90ZXN0L3VuYWxpZ25lZGNvdW50LmNwcApAQCAtMTIsNTIgKzEyLDU4IEBACiBzdGF0aWMgaW50IG5iX3N0b3JlOwogc3RhdGljIGludCBuYl9zdG9yZXU7CiAKLSNkZWZpbmUgRUlHRU5fREVCVUdfQUxJR05FRF9MT0FEICAgIHsgbmJfbG9hZCsrOyAgICB9Ci0jZGVmaW5lIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FEICB7IG5iX2xvYWR1Kys7ICAgfQotI2RlZmluZSBFSUdFTl9ERUJVR19BTElHTkVEX1NUT1JFICAgeyBuYl9zdG9yZSsrOyAgIH0KLSNkZWZpbmUgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIHsgbmJfc3RvcmV1Kys7ICB9CisjZGVmaW5lIEVJR0VOX0RFQlVHX0FMSUdORURfTE9BRCBcCisgIHsgbmJfbG9hZCsrOyB9CisjZGVmaW5lIEVJR0VOX0RFQlVHX1VOQUxJR05FRF9MT0FEIFwKKyAgeyBuYl9sb2FkdSsrOyB9CisjZGVmaW5lIEVJR0VOX0RFQlVHX0FMSUdORURfU1RPUkUgXAorICB7IG5iX3N0b3JlKys7IH0KKyNkZWZpbmUgRUlHRU5fREVCVUdfVU5BTElHTkVEX1NUT1JFIFwKKyAgeyBuYl9zdG9yZXUrKzsgfQogCi0jZGVmaW5lIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChYUFIsQUwsVUwsQVMsVVMpIHtcCi0gICAgbmJfbG9hZCA9IG5iX2xvYWR1ID0gbmJfc3RvcmUgPSBuYl9zdG9yZXUgPSAwOyBcCi0gICAgWFBSOyBcCi0gICAgaWYoIShuYl9sb2FkPT1BTCAmJiBuYl9sb2FkdT09VUwgJiYgbmJfc3RvcmU9PUFTICYmIG5iX3N0b3JldT09VVMpKSBcCisjZGVmaW5lIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChYUFIsIEFMLCBVTCwgQVMsIFVTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5iX2xvYWQgPSBuYl9sb2FkdSA9IG5iX3N0b3JlID0gbmJfc3RvcmV1ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgWFBSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShuYl9sb2FkID09IEFMICYmIG5iX2xvYWR1ID09IFVMICYmIG5iX3N0b3JlID09IEFTICYmIG5iX3N0b3JldSA9PSBVUykpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgc3RkOjpjZXJyIDw8ICIgPj4gIiA8PCBuYl9sb2FkIDw8ICIsICIgPDwgbmJfbG9hZHUgPDwgIiwgIiA8PCBuYl9zdG9yZSA8PCAiLCAiIDw8IG5iX3N0b3JldSA8PCAiXG4iOyBcCi0gICAgVkVSSUZZKCAoI1hQUikgJiYgbmJfbG9hZD09QUwgJiYgbmJfbG9hZHU9PVVMICYmIG5iX3N0b3JlPT1BUyAmJiBuYl9zdG9yZXU9PVVTICk7IFwKKyAgICBWRVJJRlkoKCNYUFIpICYmIG5iX2xvYWQgPT0gQUwgJiYgbmJfbG9hZHUgPT0gVUwgJiYgbmJfc3RvcmUgPT0gQVMgJiYgbmJfc3RvcmV1ID09IFVTKTsgICAgICAgICAgICAgICAgXAogICB9CiAKLQogI2luY2x1ZGUgIm1haW4uaCIKIAotRUlHRU5fREVDTEFSRV9URVNUKHVuYWxpZ25lZGNvdW50KQotewotICAjaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfQVZYNTEyKQorRUlHRU5fREVDTEFSRV9URVNUKHVuYWxpZ25lZGNvdW50KSB7CisjaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfQVZYNTEyKQogICBWZWN0b3JYZiBhKDQ4KSwgYig0OCk7Ci0gIGEuZmlsbCgwKTsgYi5maWxsKDEpOworICBhLmZpbGwoMCk7CisgIGIuZmlsbCgxKTsKICAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEgKz0gYiwgNiwgMCwgMywgMCk7Ci0gIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCw0OCkgKz0gYi5zZWdtZW50KDAsNDgpLCAzLCAzLCAzLCAwKTsKLSAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEuc2VnbWVudCgwLDQ4KSAtPSBiLnNlZ21lbnQoMCw0OCksIDMsIDMsIDMsIDApOwotICBWRVJJRllfQUxJR05FRF9VTkFMSUdORURfQ09VTlQoYS5zZWdtZW50KDAsNDgpICo9IDMuNSwgMywgMCwgMywgMCk7Ci0gIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCw0OCkgLz0gMy41LCAzLCAwLCAzLCAwKTsKLSAgI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfQVZYKQorICBWRVJJRllfQUxJR05FRF9VTkFMSUdORURfQ09VTlQoYS5zZWdtZW50KDAsIDQ4KSArPSBiLnNlZ21lbnQoMCwgNDgpLCAzLCAzLCAzLCAwKTsKKyAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEuc2VnbWVudCgwLCA0OCkgLT0gYi5zZWdtZW50KDAsIDQ4KSwgMywgMywgMywgMCk7CisgIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCwgNDgpICo9IDMuNSwgMywgMCwgMywgMCk7CisgIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCwgNDgpIC89IDMuNSwgMywgMCwgMywgMCk7CisjZWxpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9BVlgpCiAgIFZlY3RvclhmIGEoNDApLCBiKDQwKTsKLSAgYS5maWxsKDApOyBiLmZpbGwoMSk7CisgIGEuZmlsbCgwKTsKKyAgYi5maWxsKDEpOwogICBWRVJJRllfQUxJR05FRF9VTkFMSUdORURfQ09VTlQoYSArPSBiLCAxMCwgMCwgNSwgMCk7Ci0gIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCw0MCkgKz0gYi5zZWdtZW50KDAsNDApLCA1LCA1LCA1LCAwKTsKLSAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEuc2VnbWVudCgwLDQwKSAtPSBiLnNlZ21lbnQoMCw0MCksIDUsIDUsIDUsIDApOwotICBWRVJJRllfQUxJR05FRF9VTkFMSUdORURfQ09VTlQoYS5zZWdtZW50KDAsNDApICo9IDMuNSwgNSwgMCwgNSwgMCk7Ci0gIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCw0MCkgLz0gMy41LCA1LCAwLCA1LCAwKTsKLSAgI2VsaWYgZGVmaW5lZChFSUdFTl9WRUNUT1JJWkVfU1NFKQorICBWRVJJRllfQUxJR05FRF9VTkFMSUdORURfQ09VTlQoYS5zZWdtZW50KDAsIDQwKSArPSBiLnNlZ21lbnQoMCwgNDApLCA1LCA1LCA1LCAwKTsKKyAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEuc2VnbWVudCgwLCA0MCkgLT0gYi5zZWdtZW50KDAsIDQwKSwgNSwgNSwgNSwgMCk7CisgIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCwgNDApICo9IDMuNSwgNSwgMCwgNSwgMCk7CisgIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCwgNDApIC89IDMuNSwgNSwgMCwgNSwgMCk7CisjZWxpZiBkZWZpbmVkKEVJR0VOX1ZFQ1RPUklaRV9TU0UpCiAgIFZlY3RvclhmIGEoNDApLCBiKDQwKTsKLSAgYS5maWxsKDApOyBiLmZpbGwoMSk7CisgIGEuZmlsbCgwKTsKKyAgYi5maWxsKDEpOwogICBWRVJJRllfQUxJR05FRF9VTkFMSUdORURfQ09VTlQoYSArPSBiLCAyMCwgMCwgMTAsIDApOwotICBWRVJJRllfQUxJR05FRF9VTkFMSUdORURfQ09VTlQoYS5zZWdtZW50KDAsNDApICs9IGIuc2VnbWVudCgwLDQwKSwgMTAsIDEwLCAxMCwgMCk7Ci0gIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCw0MCkgLT0gYi5zZWdtZW50KDAsNDApLCAxMCwgMTAsIDEwLCAwKTsKLSAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEuc2VnbWVudCgwLDQwKSAqPSAzLjUsIDEwLCAwLCAxMCwgMCk7Ci0gIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCw0MCkgLz0gMy41LCAxMCwgMCwgMTAsIDApOwotICAjZWxzZQorICBWRVJJRllfQUxJR05FRF9VTkFMSUdORURfQ09VTlQoYS5zZWdtZW50KDAsIDQwKSArPSBiLnNlZ21lbnQoMCwgNDApLCAxMCwgMTAsIDEwLCAwKTsKKyAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEuc2VnbWVudCgwLCA0MCkgLT0gYi5zZWdtZW50KDAsIDQwKSwgMTAsIDEwLCAxMCwgMCk7CisgIFZFUklGWV9BTElHTkVEX1VOQUxJR05FRF9DT1VOVChhLnNlZ21lbnQoMCwgNDApICo9IDMuNSwgMTAsIDAsIDEwLCAwKTsKKyAgVkVSSUZZX0FMSUdORURfVU5BTElHTkVEX0NPVU5UKGEuc2VnbWVudCgwLCA0MCkgLz0gMy41LCAxMCwgMCwgMTAsIDApOworI2Vsc2UKICAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIGlzIHRvIGVsaW1pbmF0ZSAidmFyaWFibGUgbm90IHVzZWQiIHdhcm5pbmdzCiAgIG5iX2xvYWQgPSBuYl9sb2FkdSA9IG5iX3N0b3JlID0gbmJfc3RvcmV1ID0gMDsKICAgaW50IGEoMCksIGIoMCk7Ci0gIFZFUklGWShhPT1iKTsKLSAgI2VuZGlmCisgIFZFUklGWShhID09IGIpOworI2VuZGlmCiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuYXJ5dmlld3N0cmlkZS5jcHAgYi90ZXN0L3VuYXJ5dmlld3N0cmlkZS5jcHAKaW5kZXggMDNhNzcwYi4uNDkwYTViNyAxMDA2NDQKLS0tIGEvdGVzdC91bmFyeXZpZXdzdHJpZGUuY3BwCisrKyBiL3Rlc3QvdW5hcnl2aWV3c3RyaWRlLmNwcApAQCAtOSwzMCArOSwyNyBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi10ZW1wbGF0ZTxpbnQgT3V0ZXJTdHJpZGUsaW50IElubmVyU3RyaWRlLHR5cGVuYW1lIFZlY3RvclR5cGU+IHZvaWQgdW5hcnl2aWV3X3N0cmlkZShjb25zdCBWZWN0b3JUeXBlJiBtKQotewordGVtcGxhdGUgPGludCBPdXRlclN0cmlkZSwgaW50IElubmVyU3RyaWRlLCB0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCB1bmFyeXZpZXdfc3RyaWRlKGNvbnN0IFZlY3RvclR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3JUeXBlOjpTY2FsYXIgU2NhbGFyOwogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKICAgVmVjdG9yVHlwZSB2ZWMgPSBWZWN0b3JUeXBlOjpSYW5kb20ocm93cywgY29scyk7CiAKICAgc3RydWN0IHZpZXdfb3AgewotICAgIEVJR0VOX0RFVklDRV9GVU5DCi0gICAgRUlHRU5fU1RST05HX0lOTElORSBjb25zdCBTY2FsYXImCi0gICAgICBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgdikgY29uc3QgeyByZXR1cm4gdjsgfQorICAgIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgY29uc3QgU2NhbGFyJiBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciYgdikgY29uc3QgeyByZXR1cm4gdjsgfQogICB9OwogCi0gIEN3aXNlVW5hcnlWaWV3PHZpZXdfb3AsIFZlY3RvclR5cGUsIFN0cmlkZTxPdXRlclN0cmlkZSxJbm5lclN0cmlkZT4+IHZlY192aWV3KHZlYyk7CisgIEN3aXNlVW5hcnlWaWV3PHZpZXdfb3AsIFZlY3RvclR5cGUsIFN0cmlkZTxPdXRlclN0cmlkZSwgSW5uZXJTdHJpZGU+PiB2ZWNfdmlldyh2ZWMpOwogICBWRVJJRlkodmVjX3ZpZXcub3V0ZXJTdHJpZGUoKSA9PSAoT3V0ZXJTdHJpZGUgPT0gMCA/IDAgOiBPdXRlclN0cmlkZSkpOwogICBWRVJJRlkodmVjX3ZpZXcuaW5uZXJTdHJpZGUoKSA9PSAoSW5uZXJTdHJpZGUgPT0gMCA/IDEgOiBJbm5lclN0cmlkZSkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QodW5hcnl2aWV3c3RyaWRlKQotewotICAgIENBTExfU1VCVEVTVF8xKCggdW5hcnl2aWV3X3N0cmlkZTwxLDI+KE1hdHJpeFhmKCkpICkpOwotICAgIENBTExfU1VCVEVTVF8xKCggdW5hcnl2aWV3X3N0cmlkZTwwLDA+KE1hdHJpeFhmKCkpICkpOwotICAgIENBTExfU1VCVEVTVF8yKCggdW5hcnl2aWV3X3N0cmlkZTwxLDI+KFZlY3RvclhmKCkpICkpOwotICAgIENBTExfU1VCVEVTVF8yKCggdW5hcnl2aWV3X3N0cmlkZTwwLDA+KFZlY3RvclhmKCkpICkpOwotICAgIENBTExfU1VCVEVTVF8zKCggdW5hcnl2aWV3X3N0cmlkZTwxLDI+KFJvd1ZlY3RvclhmKCkpICkpOwotICAgIENBTExfU1VCVEVTVF8zKCggdW5hcnl2aWV3X3N0cmlkZTwwLDA+KFJvd1ZlY3RvclhmKCkpICkpOworRUlHRU5fREVDTEFSRV9URVNUKHVuYXJ5dmlld3N0cmlkZSkgeworICBDQUxMX1NVQlRFU1RfMSgodW5hcnl2aWV3X3N0cmlkZTwxLCAyPihNYXRyaXhYZigpKSkpOworICBDQUxMX1NVQlRFU1RfMSgodW5hcnl2aWV3X3N0cmlkZTwwLCAwPihNYXRyaXhYZigpKSkpOworICBDQUxMX1NVQlRFU1RfMigodW5hcnl2aWV3X3N0cmlkZTwxLCAyPihWZWN0b3JYZigpKSkpOworICBDQUxMX1NVQlRFU1RfMigodW5hcnl2aWV3X3N0cmlkZTwwLCAwPihWZWN0b3JYZigpKSkpOworICBDQUxMX1NVQlRFU1RfMygodW5hcnl2aWV3X3N0cmlkZTwxLCAyPihSb3dWZWN0b3JYZigpKSkpOworICBDQUxMX1NVQlRFU1RfMygodW5hcnl2aWV3X3N0cmlkZTwwLCAwPihSb3dWZWN0b3JYZigpKSkpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC91cHBlcmJpZGlhZ29uYWxpemF0aW9uLmNwcCBiL3Rlc3QvdXBwZXJiaWRpYWdvbmFsaXphdGlvbi5jcHAKaW5kZXggOTQ1Yzk5OS4uY2U0NjQ3ZiAxMDA2NDQKLS0tIGEvdGVzdC91cHBlcmJpZGlhZ29uYWxpemF0aW9uLmNwcAorKysgYi90ZXN0L3VwcGVyYmlkaWFnb25hbGl6YXRpb24uY3BwCkBAIC0xMCwzNCArMTAsMzUgQEAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8RWlnZW4vU1ZEPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHVwcGVyYmlkaWFnKGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdXBwZXJiaWRpYWcoY29uc3QgTWF0cml4VHlwZSYgbSkgewogICBjb25zdCBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIGNvbnN0IEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKIAotICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBSZWFsTWF0cml4VHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPiBUcmFuc3Bvc2VNYXRyaXhUeXBlOworICB0eXBlZGVmIE1hdHJpeDx0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+CisgICAgICBSZWFsTWF0cml4VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+CisgICAgICBUcmFuc3Bvc2VNYXRyaXhUeXBlOwogCi0gIE1hdHJpeFR5cGUgYSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBNYXRyaXhUeXBlIGEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CiAgIGludGVybmFsOjpVcHBlckJpZGlhZ29uYWxpemF0aW9uPE1hdHJpeFR5cGU+IHViZChhKTsKICAgUmVhbE1hdHJpeFR5cGUgYihyb3dzLCBjb2xzKTsKICAgYi5zZXRaZXJvKCk7Ci0gIGIuYmxvY2soMCwwLGNvbHMsY29scykgPSB1YmQuYmlkaWFnb25hbCgpOworICBiLmJsb2NrKDAsIDAsIGNvbHMsIGNvbHMpID0gdWJkLmJpZGlhZ29uYWwoKTsKICAgTWF0cml4VHlwZSBjID0gdWJkLmhvdXNlaG9sZGVyVSgpICogYiAqIHViZC5ob3VzZWhvbGRlclYoKS5hZGpvaW50KCk7Ci0gIFZFUklGWV9JU19BUFBST1goYSxjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhLCBjKTsKICAgVHJhbnNwb3NlTWF0cml4VHlwZSBkID0gdWJkLmhvdXNlaG9sZGVyVigpICogYi5hZGpvaW50KCkgKiB1YmQuaG91c2Vob2xkZXJVKCkuYWRqb2ludCgpOwotICBWRVJJRllfSVNfQVBQUk9YKGEuYWRqb2ludCgpLGQpOworICBWRVJJRllfSVNfQVBQUk9YKGEuYWRqb2ludCgpLCBkKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHVwcGVyYmlkaWFnb25hbGl6YXRpb24pCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICBDQUxMX1NVQlRFU1RfMSggdXBwZXJiaWRpYWcoTWF0cml4WGYoMywzKSkgKTsKLSAgIENBTExfU1VCVEVTVF8yKCB1cHBlcmJpZGlhZyhNYXRyaXhYZCgxNywxMikpICk7Ci0gICBDQUxMX1NVQlRFU1RfMyggdXBwZXJiaWRpYWcoTWF0cml4WGNmKDIwLDIwKSkgKTsKLSAgIENBTExfU1VCVEVTVF80KCB1cHBlcmJpZGlhZyhNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sRHluYW1pYyxEeW5hbWljLFJvd01ham9yPigxNiwxNSkpICk7Ci0gICBDQUxMX1NVQlRFU1RfNSggdXBwZXJiaWRpYWcoTWF0cml4PGZsb2F0LDYsND4oKSkgKTsKLSAgIENBTExfU1VCVEVTVF82KCB1cHBlcmJpZGlhZyhNYXRyaXg8ZmxvYXQsNSw1PigpKSApOwotICAgQ0FMTF9TVUJURVNUXzcoIHVwcGVyYmlkaWFnKE1hdHJpeDxkb3VibGUsNCwzPigpKSApOworRUlHRU5fREVDTEFSRV9URVNUKHVwcGVyYmlkaWFnb25hbGl6YXRpb24pIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEodXBwZXJiaWRpYWcoTWF0cml4WGYoMywgMykpKTsKKyAgICBDQUxMX1NVQlRFU1RfMih1cHBlcmJpZGlhZyhNYXRyaXhYZCgxNywgMTIpKSk7CisgICAgQ0FMTF9TVUJURVNUXzModXBwZXJiaWRpYWcoTWF0cml4WGNmKDIwLCAyMCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCh1cHBlcmJpZGlhZyhNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPigxNiwgMTUpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUodXBwZXJiaWRpYWcoTWF0cml4PGZsb2F0LCA2LCA0PigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzYodXBwZXJiaWRpYWcoTWF0cml4PGZsb2F0LCA1LCA1PigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcodXBwZXJiaWRpYWcoTWF0cml4PGRvdWJsZSwgNCwgMz4oKSkpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3ZlY3Rvcml6YXRpb25fbG9naWMuY3BwIGIvdGVzdC92ZWN0b3JpemF0aW9uX2xvZ2ljLmNwcAppbmRleCBhNjZlOWM4Li5hYWM3MjQ4IDEwMDY0NAotLS0gYS90ZXN0L3ZlY3Rvcml6YXRpb25fbG9naWMuY3BwCisrKyBiL3Rlc3QvdmVjdG9yaXphdGlvbl9sb2dpYy5jcHAKQEAgLTI2LDM1NCArMjYsMzk2IEBACiAvLyBmb3IgcGFja2V0X3RyYWl0czxQYWNrZXQqPgogLy8gPT4gVGhlIG9ubHkgd29ya2Fyb3VuZCB3b3VsZCBiZSB0byB3cmFwIF9tMTI4IGFuZCB0aGUgbGlrZXMKIC8vICAgIHdpdGhpbiB3cmFwcGVycy4KLSNpZiBFSUdFTl9HTlVDX1NUUklDVF9BVF9MRUFTVCg2LDAsMCkKLSAgICAjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XaWdub3JlZC1hdHRyaWJ1dGVzIgorI2lmIEVJR0VOX0dOVUNfU1RSSUNUX0FUX0xFQVNUKDYsIDAsIDApCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XaWdub3JlZC1hdHRyaWJ1dGVzIgogI2VuZGlmCiAKIHVzaW5nIGludGVybmFsOjpkZW1hbmdsZV9mbGFnczsKIHVzaW5nIGludGVybmFsOjpkZW1hbmdsZV90cmF2ZXJzYWw7CiB1c2luZyBpbnRlcm5hbDo6ZGVtYW5nbGVfdW5yb2xsaW5nOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEc3QsIHR5cGVuYW1lIFNyYz4KLWJvb2wgdGVzdF9hc3NpZ24oY29uc3QgRHN0JiwgY29uc3QgU3JjJiwgaW50IHRyYXZlcnNhbCwgaW50IHVucm9sbGluZykKLXsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX01BVFJJWF9TSVpFKERzdCxTcmMpOwotICB0eXBlZGVmIGludGVybmFsOjpjb3B5X3VzaW5nX2V2YWx1YXRvcl90cmFpdHM8aW50ZXJuYWw6OmV2YWx1YXRvcjxEc3Q+LGludGVybmFsOjpldmFsdWF0b3I8U3JjPiwgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3Q6OlNjYWxhcix0eXBlbmFtZSBTcmM6OlNjYWxhcj4gPiB0cmFpdHM7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBTcmM+Citib29sIHRlc3RfYXNzaWduKGNvbnN0IERzdCYsIGNvbnN0IFNyYyYsIGludCB0cmF2ZXJzYWwsIGludCB1bnJvbGxpbmcpIHsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVF9TQU1FX01BVFJJWF9TSVpFKERzdCwgU3JjKTsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6Y29weV91c2luZ19ldmFsdWF0b3JfdHJhaXRzPGludGVybmFsOjpldmFsdWF0b3I8RHN0PiwgaW50ZXJuYWw6OmV2YWx1YXRvcjxTcmM+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OmFzc2lnbl9vcDx0eXBlbmFtZSBEc3Q6OlNjYWxhciwgdHlwZW5hbWUgU3JjOjpTY2FsYXI+ID4KKyAgICAgIHRyYWl0czsKICAgLy8gSWYgdHJhdmVyc2FsIG9yIHVucm9sbGluZyBhcmUgbmVnYXRpdmUsIGlnbm9yZS4KLSAgYm9vbCByZXMgPSB0cmF2ZXJzYWwgPiAtMSA/IHRyYWl0czo6VHJhdmVyc2FsPT10cmF2ZXJzYWwgOiB0cnVlOworICBib29sIHJlcyA9IHRyYXZlcnNhbCA+IC0xID8gdHJhaXRzOjpUcmF2ZXJzYWwgPT0gdHJhdmVyc2FsIDogdHJ1ZTsKICAgaWYgKHVucm9sbGluZyA+IC0xKSB7Ci0gICAgaWYodW5yb2xsaW5nPT1Jbm5lclVucm9sbGluZytDb21wbGV0ZVVucm9sbGluZykgewotICAgICAgcmVzID0gcmVzICYmIChpbnQodHJhaXRzOjpVbnJvbGxpbmcpPT1Jbm5lclVucm9sbGluZyB8fCBpbnQodHJhaXRzOjpVbnJvbGxpbmcpPT1Db21wbGV0ZVVucm9sbGluZyk7CisgICAgaWYgKHVucm9sbGluZyA9PSBJbm5lclVucm9sbGluZyArIENvbXBsZXRlVW5yb2xsaW5nKSB7CisgICAgICByZXMgPSByZXMgJiYgKGludCh0cmFpdHM6OlVucm9sbGluZykgPT0gSW5uZXJVbnJvbGxpbmcgfHwgaW50KHRyYWl0czo6VW5yb2xsaW5nKSA9PSBDb21wbGV0ZVVucm9sbGluZyk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJlcyA9IHJlcyAmJiBpbnQodHJhaXRzOjpVbnJvbGxpbmcpPT11bnJvbGxpbmc7CisgICAgICByZXMgPSByZXMgJiYgaW50KHRyYWl0czo6VW5yb2xsaW5nKSA9PSB1bnJvbGxpbmc7CiAgICAgfQogICB9Ci0gIGlmKCFyZXMpCi0gIHsKKyAgaWYgKCFyZXMpIHsKICAgICBzdGQ6OmNlcnIgPDwgIlNyYzogIiA8PCBkZW1hbmdsZV9mbGFncyhTcmM6OkZsYWdzKSA8PCBzdGQ6OmVuZGw7CiAgICAgc3RkOjpjZXJyIDw8ICIgICAgICIgPDwgZGVtYW5nbGVfZmxhZ3MoaW50ZXJuYWw6OmV2YWx1YXRvcjxTcmM+OjpGbGFncykgPDwgc3RkOjplbmRsOwogICAgIHN0ZDo6Y2VyciA8PCAiRHN0OiAiIDw8IGRlbWFuZ2xlX2ZsYWdzKERzdDo6RmxhZ3MpIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIiAgICAgIiA8PCBkZW1hbmdsZV9mbGFncyhpbnRlcm5hbDo6ZXZhbHVhdG9yPERzdD46OkZsYWdzKSA8PCBzdGQ6OmVuZGw7CiAgICAgdHJhaXRzOjpkZWJ1ZygpOwotICAgIHN0ZDo6Y2VyciA8PCAiIEV4cGVjdGVkIFRyYXZlcnNhbCA9PSAiIDw8IGRlbWFuZ2xlX3RyYXZlcnNhbCh0cmF2ZXJzYWwpCi0gICAgICAgICAgICAgIDw8ICIgZ290ICIgPDwgZGVtYW5nbGVfdHJhdmVyc2FsKHRyYWl0czo6VHJhdmVyc2FsKSA8PCAiXG4iOwotICAgIHN0ZDo6Y2VyciA8PCAiIEV4cGVjdGVkIFVucm9sbGluZyA9PSAiIDw8IGRlbWFuZ2xlX3Vucm9sbGluZyh1bnJvbGxpbmcpCi0gICAgICAgICAgICAgIDw8ICIgZ290ICIgPDwgZGVtYW5nbGVfdW5yb2xsaW5nKHRyYWl0czo6VW5yb2xsaW5nKSA8PCAiXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiIEV4cGVjdGVkIFRyYXZlcnNhbCA9PSAiIDw8IGRlbWFuZ2xlX3RyYXZlcnNhbCh0cmF2ZXJzYWwpIDw8ICIgZ290ICIKKyAgICAgICAgICAgICAgPDwgZGVtYW5nbGVfdHJhdmVyc2FsKHRyYWl0czo6VHJhdmVyc2FsKSA8PCAiXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiIEV4cGVjdGVkIFVucm9sbGluZyA9PSAiIDw8IGRlbWFuZ2xlX3Vucm9sbGluZyh1bnJvbGxpbmcpIDw8ICIgZ290ICIKKyAgICAgICAgICAgICAgPDwgZGVtYW5nbGVfdW5yb2xsaW5nKHRyYWl0czo6VW5yb2xsaW5nKSA8PCAiXG4iOwogICB9CiAgIHJldHVybiByZXM7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgU3JjPgotYm9vbCB0ZXN0X2Fzc2lnbihpbnQgdHJhdmVyc2FsLCBpbnQgdW5yb2xsaW5nKQotewotICBFSUdFTl9TVEFUSUNfQVNTRVJUX1NBTUVfTUFUUklYX1NJWkUoRHN0LFNyYyk7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OmNvcHlfdXNpbmdfZXZhbHVhdG9yX3RyYWl0czxpbnRlcm5hbDo6ZXZhbHVhdG9yPERzdD4saW50ZXJuYWw6OmV2YWx1YXRvcjxTcmM+LCBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdDo6U2NhbGFyLHR5cGVuYW1lIFNyYzo6U2NhbGFyPiA+IHRyYWl0czsKLSAgYm9vbCByZXMgPSB0cmFpdHM6OlRyYXZlcnNhbD09dHJhdmVyc2FsICYmIHRyYWl0czo6VW5yb2xsaW5nPT11bnJvbGxpbmc7Ci0gIGlmKCFyZXMpCi0gIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEc3QsIHR5cGVuYW1lIFNyYz4KK2Jvb2wgdGVzdF9hc3NpZ24oaW50IHRyYXZlcnNhbCwgaW50IHVucm9sbGluZykgeworICBFSUdFTl9TVEFUSUNfQVNTRVJUX1NBTUVfTUFUUklYX1NJWkUoRHN0LCBTcmMpOworICB0eXBlZGVmIGludGVybmFsOjpjb3B5X3VzaW5nX2V2YWx1YXRvcl90cmFpdHM8aW50ZXJuYWw6OmV2YWx1YXRvcjxEc3Q+LCBpbnRlcm5hbDo6ZXZhbHVhdG9yPFNyYz4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6YXNzaWduX29wPHR5cGVuYW1lIERzdDo6U2NhbGFyLCB0eXBlbmFtZSBTcmM6OlNjYWxhcj4gPgorICAgICAgdHJhaXRzOworICBib29sIHJlcyA9IHRyYWl0czo6VHJhdmVyc2FsID09IHRyYXZlcnNhbCAmJiB0cmFpdHM6OlVucm9sbGluZyA9PSB1bnJvbGxpbmc7CisgIGlmICghcmVzKSB7CiAgICAgc3RkOjpjZXJyIDw8ICJTcmM6ICIgPDwgZGVtYW5nbGVfZmxhZ3MoU3JjOjpGbGFncykgPDwgc3RkOjplbmRsOwogICAgIHN0ZDo6Y2VyciA8PCAiICAgICAiIDw8IGRlbWFuZ2xlX2ZsYWdzKGludGVybmFsOjpldmFsdWF0b3I8U3JjPjo6RmxhZ3MpIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIkRzdDogIiA8PCBkZW1hbmdsZV9mbGFncyhEc3Q6OkZsYWdzKSA8PCBzdGQ6OmVuZGw7CiAgICAgc3RkOjpjZXJyIDw8ICIgICAgICIgPDwgZGVtYW5nbGVfZmxhZ3MoaW50ZXJuYWw6OmV2YWx1YXRvcjxEc3Q+OjpGbGFncykgPDwgc3RkOjplbmRsOwogICAgIHRyYWl0czo6ZGVidWcoKTsKLSAgICBzdGQ6OmNlcnIgPDwgIiBFeHBlY3RlZCBUcmF2ZXJzYWwgPT0gIiA8PCBkZW1hbmdsZV90cmF2ZXJzYWwodHJhdmVyc2FsKQotICAgICAgICAgICAgICA8PCAiIGdvdCAiIDw8IGRlbWFuZ2xlX3RyYXZlcnNhbCh0cmFpdHM6OlRyYXZlcnNhbCkgPDwgIlxuIjsKLSAgICBzdGQ6OmNlcnIgPDwgIiBFeHBlY3RlZCBVbnJvbGxpbmcgPT0gIiA8PCBkZW1hbmdsZV91bnJvbGxpbmcodW5yb2xsaW5nKQotICAgICAgICAgICAgICA8PCAiIGdvdCAiIDw8IGRlbWFuZ2xlX3Vucm9sbGluZyh0cmFpdHM6OlVucm9sbGluZykgPDwgIlxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIiBFeHBlY3RlZCBUcmF2ZXJzYWwgPT0gIiA8PCBkZW1hbmdsZV90cmF2ZXJzYWwodHJhdmVyc2FsKSA8PCAiIGdvdCAiCisgICAgICAgICAgICAgIDw8IGRlbWFuZ2xlX3RyYXZlcnNhbCh0cmFpdHM6OlRyYXZlcnNhbCkgPDwgIlxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIiBFeHBlY3RlZCBVbnJvbGxpbmcgPT0gIiA8PCBkZW1hbmdsZV91bnJvbGxpbmcodW5yb2xsaW5nKSA8PCAiIGdvdCAiCisgICAgICAgICAgICAgIDw8IGRlbWFuZ2xlX3Vucm9sbGluZyh0cmFpdHM6OlVucm9sbGluZykgPDwgIlxuIjsKICAgfQogICByZXR1cm4gcmVzOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBYcHI+Ci1ib29sIHRlc3RfcmVkdXgoY29uc3QgWHByJiwgaW50IHRyYXZlcnNhbCwgaW50IHVucm9sbGluZykKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBYcHI+Citib29sIHRlc3RfcmVkdXgoY29uc3QgWHByJiwgaW50IHRyYXZlcnNhbCwgaW50IHVucm9sbGluZykgewogICB0eXBlZGVmIHR5cGVuYW1lIFhwcjo6U2NhbGFyIFNjYWxhcjsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6cmVkdXhfdHJhaXRzPGludGVybmFsOjpzY2FsYXJfc3VtX29wPFNjYWxhcixTY2FsYXI+LGludGVybmFsOjpyZWR1eF9ldmFsdWF0b3I8WHByPiA+IHRyYWl0czsKLSAgCi0gIGJvb2wgcmVzID0gdHJhaXRzOjpUcmF2ZXJzYWw9PXRyYXZlcnNhbCAmJiB0cmFpdHM6OlVucm9sbGluZz09dW5yb2xsaW5nOwotICBpZighcmVzKQotICB7CisgIHR5cGVkZWYgaW50ZXJuYWw6OnJlZHV4X3RyYWl0czxpbnRlcm5hbDo6c2NhbGFyX3N1bV9vcDxTY2FsYXIsIFNjYWxhcj4sIGludGVybmFsOjpyZWR1eF9ldmFsdWF0b3I8WHByPiA+IHRyYWl0czsKKworICBib29sIHJlcyA9IHRyYWl0czo6VHJhdmVyc2FsID09IHRyYXZlcnNhbCAmJiB0cmFpdHM6OlVucm9sbGluZyA9PSB1bnJvbGxpbmc7CisgIGlmICghcmVzKSB7CiAgICAgc3RkOjpjZXJyIDw8IGRlbWFuZ2xlX2ZsYWdzKFhwcjo6RmxhZ3MpIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgZGVtYW5nbGVfZmxhZ3MoaW50ZXJuYWw6OmV2YWx1YXRvcjxYcHI+OjpGbGFncykgPDwgc3RkOjplbmRsOwogICAgIHRyYWl0czo6ZGVidWcoKTsKLSAgICAKLSAgICBzdGQ6OmNlcnIgPDwgIiBFeHBlY3RlZCBUcmF2ZXJzYWwgPT0gIiA8PCBkZW1hbmdsZV90cmF2ZXJzYWwodHJhdmVyc2FsKQotICAgICAgICAgICAgICA8PCAiIGdvdCAiIDw8IGRlbWFuZ2xlX3RyYXZlcnNhbCh0cmFpdHM6OlRyYXZlcnNhbCkgPDwgIlxuIjsKLSAgICBzdGQ6OmNlcnIgPDwgIiBFeHBlY3RlZCBVbnJvbGxpbmcgPT0gIiA8PCBkZW1hbmdsZV91bnJvbGxpbmcodW5yb2xsaW5nKQotICAgICAgICAgICAgICA8PCAiIGdvdCAiIDw8IGRlbWFuZ2xlX3Vucm9sbGluZyh0cmFpdHM6OlVucm9sbGluZykgPDwgIlxuIjsKKworICAgIHN0ZDo6Y2VyciA8PCAiIEV4cGVjdGVkIFRyYXZlcnNhbCA9PSAiIDw8IGRlbWFuZ2xlX3RyYXZlcnNhbCh0cmF2ZXJzYWwpIDw8ICIgZ290ICIKKyAgICAgICAgICAgICAgPDwgZGVtYW5nbGVfdHJhdmVyc2FsKHRyYWl0czo6VHJhdmVyc2FsKSA8PCAiXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiIEV4cGVjdGVkIFVucm9sbGluZyA9PSAiIDw8IGRlbWFuZ2xlX3Vucm9sbGluZyh1bnJvbGxpbmcpIDw8ICIgZ290ICIKKyAgICAgICAgICAgICAgPDwgZGVtYW5nbGVfdW5yb2xsaW5nKHRyYWl0czo6VW5yb2xsaW5nKSA8PCAiXG4iOwogICB9CiAgIHJldHVybiByZXM7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBFbmFibGUgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpWZWN0b3JpemFibGU+Ci1zdHJ1Y3QgdmVjdG9yaXphdGlvbl9sb2dpYwotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgYm9vbCBFbmFibGUgPSBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpWZWN0b3JpemFibGU+CitzdHJ1Y3QgdmVjdG9yaXphdGlvbl9sb2dpYyB7CiAgIHR5cGVkZWYgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPiBQYWNrZXRUcmFpdHM7Ci0gIAorCiAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZSBQYWNrZXRUeXBlOwogICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0VHlwZT46OmhhbGYgSGFsZlBhY2tldFR5cGU7CiAgIGVudW0gewogICAgIFBhY2tldFNpemUgPSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPFBhY2tldFR5cGU+OjpzaXplLAogICAgIEhhbGZQYWNrZXRTaXplID0gaW50ZXJuYWw6OnVucGFja2V0X3RyYWl0czxIYWxmUGFja2V0VHlwZT46OnNpemUKICAgfTsKLSAgc3RhdGljIHZvaWQgcnVuKCkKLSAgewotICAgIAotICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhcixQYWNrZXRTaXplLDE+IFZlY3RvcjE7Ci0gICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yWDsKLSAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBNYXRyaXhYWDsKLSAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZSxQYWNrZXRTaXplPiBNYXRyaXgxMTsKLSAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsKE1hdHJpeDExOjpGbGFncyZSb3dNYWpvckJpdCk/ODoyKlBhY2tldFNpemUsKE1hdHJpeDExOjpGbGFncyZSb3dNYWpvckJpdCk/MipQYWNrZXRTaXplOjg+ICAgTWF0cml4MjI7Ci0gICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLChNYXRyaXgxMTo6RmxhZ3MmUm93TWFqb3JCaXQpPzE2OjQqUGFja2V0U2l6ZSwoTWF0cml4MTE6OkZsYWdzJlJvd01ham9yQml0KT80KlBhY2tldFNpemU6MTY+IE1hdHJpeDQ0OwotICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwoTWF0cml4MTE6OkZsYWdzJlJvd01ham9yQml0KT8xNjo0KlBhY2tldFNpemUsKE1hdHJpeDExOjpGbGFncyZSb3dNYWpvckJpdCk/NCpQYWNrZXRTaXplOjE2LERvbnRBbGlnbnxFSUdFTl9ERUZBVUxUX01BVFJJWF9TVE9SQUdFX09SREVSX09QVElPTj4gTWF0cml4NDR1OwotICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciw0KlBhY2tldFNpemUsNCpQYWNrZXRTaXplLENvbE1ham9yPiBNYXRyaXg0NGM7Ci0gICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDQqUGFja2V0U2l6ZSw0KlBhY2tldFNpemUsUm93TWFqb3I+IE1hdHJpeDQ0cjsKKyAgc3RhdGljIHZvaWQgcnVuKCkgeworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgUGFja2V0U2l6ZSwgMT4gVmVjdG9yMTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IFZlY3Rvclg7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBNYXRyaXhYWDsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFBhY2tldFNpemUsIFBhY2tldFNpemU+IE1hdHJpeDExOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgKE1hdHJpeDExOjpGbGFncyAmIFJvd01ham9yQml0KSA/IDggOiAyICogUGFja2V0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAoTWF0cml4MTE6OkZsYWdzICYgUm93TWFqb3JCaXQpID8gMiAqIFBhY2tldFNpemUgOiA4PgorICAgICAgICBNYXRyaXgyMjsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIChNYXRyaXgxMTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPyAxNiA6IDQgKiBQYWNrZXRTaXplLAorICAgICAgICAgICAgICAgICAgIChNYXRyaXgxMTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPyA0ICogUGFja2V0U2l6ZSA6IDE2PgorICAgICAgICBNYXRyaXg0NDsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIChNYXRyaXgxMTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPyAxNiA6IDQgKiBQYWNrZXRTaXplLAorICAgICAgICAgICAgICAgICAgIChNYXRyaXgxMTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPyA0ICogUGFja2V0U2l6ZSA6IDE2LAorICAgICAgICAgICAgICAgICAgIERvbnRBbGlnbiB8IEVJR0VOX0RFRkFVTFRfTUFUUklYX1NUT1JBR0VfT1JERVJfT1BUSU9OPgorICAgICAgICBNYXRyaXg0NHU7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCA0ICogUGFja2V0U2l6ZSwgNCAqIFBhY2tldFNpemUsIENvbE1ham9yPiBNYXRyaXg0NGM7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCA0ICogUGFja2V0U2l6ZSwgNCAqIFBhY2tldFNpemUsIFJvd01ham9yPiBNYXRyaXg0NHI7CiAKICAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsCi0gICAgICAgIChQYWNrZXRTaXplPT0xNiA/IDggOiBQYWNrZXRTaXplPT04ID8gNCA6IFBhY2tldFNpemU9PTQgPyAyIDogUGFja2V0U2l6ZT09MiA/IDEgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpLAotICAgICAgICAoUGFja2V0U2l6ZT09MTYgPyAyIDogUGFja2V0U2l6ZT09OCA/IDIgOiBQYWNrZXRTaXplPT00ID8gMiA6IFBhY2tldFNpemU9PTIgPyAyIDogLypQYWNrZXRTaXplPT0xID8qLyAxKQotICAgICAgPiBNYXRyaXgxOworICAgICAgICAgICAgICAgICAgIChQYWNrZXRTaXplID09IDE2ICA/IDgKKyAgICAgICAgICAgICAgICAgICAgOiBQYWNrZXRTaXplID09IDggPyA0CisgICAgICAgICAgICAgICAgICAgIDogUGFja2V0U2l6ZSA9PSA0ID8gMgorICAgICAgICAgICAgICAgICAgICA6IFBhY2tldFNpemUgPT0gMiA/IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpLAorICAgICAgICAgICAgICAgICAgIChQYWNrZXRTaXplID09IDE2ICA/IDIKKyAgICAgICAgICAgICAgICAgICAgOiBQYWNrZXRTaXplID09IDggPyAyCisgICAgICAgICAgICAgICAgICAgIDogUGFja2V0U2l6ZSA9PSA0ID8gMgorICAgICAgICAgICAgICAgICAgICA6IFBhY2tldFNpemUgPT0gMiA/IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpPgorICAgICAgICBNYXRyaXgxOwogCiAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLAotICAgICAgICAoUGFja2V0U2l6ZT09MTYgPyA4IDogUGFja2V0U2l6ZT09OCA/IDQgOiBQYWNrZXRTaXplPT00ID8gMiA6IFBhY2tldFNpemU9PTIgPyAxIDogLypQYWNrZXRTaXplPT0xID8qLyAxKSwKLSAgICAgICAgKFBhY2tldFNpemU9PTE2ID8gMiA6IFBhY2tldFNpemU9PTggPyAyIDogUGFja2V0U2l6ZT09NCA/IDIgOiBQYWNrZXRTaXplPT0yID8gMiA6IC8qUGFja2V0U2l6ZT09MSA/Ki8gMSksCi0gICAgICBEb250QWxpZ258KChNYXRyaXgxOjpGbGFncyZSb3dNYWpvckJpdCk/Um93TWFqb3I6Q29sTWFqb3IpPiBNYXRyaXgxdTsKKyAgICAgICAgICAgICAgICAgICAoUGFja2V0U2l6ZSA9PSAxNiAgPyA4CisgICAgICAgICAgICAgICAgICAgIDogUGFja2V0U2l6ZSA9PSA4ID8gNAorICAgICAgICAgICAgICAgICAgICA6IFBhY2tldFNpemUgPT0gNCA/IDIKKyAgICAgICAgICAgICAgICAgICAgOiBQYWNrZXRTaXplID09IDIgPyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLypQYWNrZXRTaXplPT0xID8qLyAxKSwKKyAgICAgICAgICAgICAgICAgICAoUGFja2V0U2l6ZSA9PSAxNiAgPyAyCisgICAgICAgICAgICAgICAgICAgIDogUGFja2V0U2l6ZSA9PSA4ID8gMgorICAgICAgICAgICAgICAgICAgICA6IFBhY2tldFNpemUgPT0gNCA/IDIKKyAgICAgICAgICAgICAgICAgICAgOiBQYWNrZXRTaXplID09IDIgPyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLypQYWNrZXRTaXplPT0xID8qLyAxKSwKKyAgICAgICAgICAgICAgICAgICBEb250QWxpZ24gfCAoKE1hdHJpeDE6OkZsYWdzICYgUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvcik+CisgICAgICAgIE1hdHJpeDF1OwogCiAgICAgLy8gdGhpcyB0eXBlIGlzIG1hZGUgc3VjaCB0aGF0IGl0IGNhbiBvbmx5IGJlIHZlY3Rvcml6ZWQgd2hlbiB2aWV3ZWQgYXMgYSBsaW5lYXIgMUQgdmVjdG9yCiAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLAotICAgICAgICAoUGFja2V0U2l6ZT09MTYgPyAgNCA6IFBhY2tldFNpemU9PTggPyA0IDogUGFja2V0U2l6ZT09NCA/IDYgOiBQYWNrZXRTaXplPT0yID8gKChNYXRyaXgxMTo6RmxhZ3MmUm93TWFqb3JCaXQpPzI6MykgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpLAotICAgICAgICAoUGFja2V0U2l6ZT09MTYgPyAxMiA6IFBhY2tldFNpemU9PTggPyA2IDogUGFja2V0U2l6ZT09NCA/IDIgOiBQYWNrZXRTaXplPT0yID8gKChNYXRyaXgxMTo6RmxhZ3MmUm93TWFqb3JCaXQpPzM6MikgOiAvKlBhY2tldFNpemU9PTEgPyovIDMpCi0gICAgICA+IE1hdHJpeDM7Ci0gICAgCi0gICAgI2lmICFFSUdFTl9HQ0NfQU5EX0FSQ0hfRE9FU05UX1dBTlRfU1RBQ0tfQUxJR05NRU5UCi0gICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxWZWN0b3IxKCksCi0gICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKLSAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLFZlY3RvcjEoKStWZWN0b3IxKCksCi0gICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKLSAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLFZlY3RvcjEoKS5jd2lzZVByb2R1Y3QoVmVjdG9yMSgpKSwKLSAgICAgIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOwotICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksVmVjdG9yMSgpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLAotICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgICAgICAgICAgICAgICAgKFBhY2tldFNpemUgPT0gMTYgID8gNAorICAgICAgICAgICAgICAgICAgICA6IFBhY2tldFNpemUgPT0gOCA/IDQKKyAgICAgICAgICAgICAgICAgICAgOiBQYWNrZXRTaXplID09IDQgPyA2CisgICAgICAgICAgICAgICAgICAgIDogUGFja2V0U2l6ZSA9PSAyID8gKChNYXRyaXgxMTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPyAyIDogMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpLAorICAgICAgICAgICAgICAgICAgIChQYWNrZXRTaXplID09IDE2ICA/IDEyCisgICAgICAgICAgICAgICAgICAgIDogUGFja2V0U2l6ZSA9PSA4ID8gNgorICAgICAgICAgICAgICAgICAgICA6IFBhY2tldFNpemUgPT0gNCA/IDIKKyAgICAgICAgICAgICAgICAgICAgOiBQYWNrZXRTaXplID09IDIgPyAoKE1hdHJpeDExOjpGbGFncyAmIFJvd01ham9yQml0KSA/IDMgOiAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC8qUGFja2V0U2l6ZT09MSA/Ki8gMyk+CisgICAgICAgIE1hdHJpeDM7CiAKLSAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4NDQoKSxNYXRyaXg0NCgpK01hdHJpeDQ0KCksCi0gICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsSW5uZXJVbnJvbGxpbmcpKTsKKyNpZiAhRUlHRU5fR0NDX0FORF9BUkNIX0RPRVNOVF9XQU5UX1NUQUNLX0FMSUdOTUVOVAorICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksIFZlY3RvcjEoKSwgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksIFZlY3RvcjEoKSArIFZlY3RvcjEoKSwgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksIFZlY3RvcjEoKS5jd2lzZVByb2R1Y3QoVmVjdG9yMSgpKSwgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksIFZlY3RvcjEoKS50ZW1wbGF0ZSBjYXN0PFNjYWxhcj4oKSwgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZykpOwogCi0gICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDQ0dSgpLE1hdHJpeDQ0KCkrTWF0cml4NDQoKSwKLSAgICAgIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUgPyBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJUcmF2ZXJzYWwsCi0gICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJVbnJvbGxpbmcgOiBOb1Vucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXg0NCgpLCBNYXRyaXg0NCgpICsgTWF0cml4NDQoKSwgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLCBJbm5lclVucm9sbGluZykpOwogCi0gICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDEoKSxNYXRyaXgxKCkrTWF0cml4MSgpLAotICAgICAgKGludChNYXRyaXgxOjpJbm5lclNpemVBdENvbXBpbGVUaW1lKSAlIGludChQYWNrZXRTaXplKSk9PTAgPyBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLAotICAgICAgQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4NDR1KCksIE1hdHJpeDQ0KCkgKyBNYXRyaXg0NCgpLAorICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIDogTGluZWFyVHJhdmVyc2FsLAorICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJVbnJvbGxpbmcgOiBOb1Vucm9sbGluZykpOwogCi0gICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDF1KCksTWF0cml4MSgpK01hdHJpeDEoKSwKLSAgICAgIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUgPyAoKGludChNYXRyaXgxOjpJbm5lclNpemVBdENvbXBpbGVUaW1lKSAlIGludChQYWNrZXRTaXplKSk9PTAgPyBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IExpbmVhclRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MSgpLCBNYXRyaXgxKCkgKyBNYXRyaXgxKCksCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQoTWF0cml4MTo6SW5uZXJTaXplQXRDb21waWxlVGltZSkgJSBpbnQoUGFja2V0U2l6ZSkpID09IDAgPyBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsCisgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRlVW5yb2xsaW5nKSk7CiAKLSAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4NDRjKCkuY29sKDEpLE1hdHJpeDQ0YygpLmNvbCgyKStNYXRyaXg0NGMoKS5jb2woMyksCi0gICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MXUoKSwgTWF0cml4MSgpICsgTWF0cml4MSgpLAorICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFCisgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgoaW50KE1hdHJpeDE6OklubmVyU2l6ZUF0Q29tcGlsZVRpbWUpICUgaW50KFBhY2tldFNpemUpKSA9PSAwID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTGluZWFyVHJhdmVyc2FsLAorICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZVVucm9sbGluZykpOwogCi0gICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDQ0cigpLnJvdygyKSxNYXRyaXg0NHIoKS5yb3coMSkrTWF0cml4NDRyKCkucm93KDEpLAotICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDQ0YygpLmNvbCgxKSwgTWF0cml4NDRjKCkuY29sKDIpICsgTWF0cml4NDRjKCkuY29sKDMpLCBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsCisgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRlVW5yb2xsaW5nKSk7CiAKLSAgICBpZihQYWNrZXRTaXplPjEpCi0gICAgewotICAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMyxDb2xNYWpvcj4gTWF0cml4MzNjOwotICAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMSxDb2xNYWpvcj4gVmVjdG9yMzsKLSAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgzM2MoKS5yb3coMiksTWF0cml4MzNjKCkucm93KDEpK01hdHJpeDMzYygpLnJvdygxKSwKLSAgICAgICAgTGluZWFyVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDQ0cigpLnJvdygyKSwgTWF0cml4NDRyKCkucm93KDEpICsgTWF0cml4NDRyKCkucm93KDEpLCBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsCisgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRlVW5yb2xsaW5nKSk7CisKKyAgICBpZiAoUGFja2V0U2l6ZSA+IDEpIHsKKyAgICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMywgQ29sTWFqb3I+IE1hdHJpeDMzYzsKKyAgICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMSwgQ29sTWFqb3I+IFZlY3RvcjM7CisgICAgICBWRVJJRlkoCisgICAgICAgICAgdGVzdF9hc3NpZ24oTWF0cml4MzNjKCkucm93KDIpLCBNYXRyaXgzM2MoKS5yb3coMSkgKyBNYXRyaXgzM2MoKS5yb3coMSksIExpbmVhclRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKICAgICAgIC8vIFZlY3Rvcml6YXRpb24gZGVwZW5kcyBvbiB0b28gbWFueSBmYWN0b3JzIC0gaWdub3JlLgotICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjMoKSxWZWN0b3IzKCkrVmVjdG9yMygpLCAtMSwgQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IzKCksIFZlY3RvcjMoKSArIFZlY3RvcjMoKSwgLTEsIENvbXBsZXRlVW5yb2xsaW5nKSk7CiAKLSAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgzKCksTWF0cml4MygpLmN3aXNlUHJvZHVjdChNYXRyaXgzKCkpLAotICAgICAgICBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MygpLCBNYXRyaXgzKCkuY3dpc2VQcm9kdWN0KE1hdHJpeDMoKSksIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nKSk7CiAKICAgICAgIC8vIFZlY3Rvcml6YXRpb24gZGVwZW5kcyBvbiB0b28gbWFueSBmYWN0b3JzIC0gaWdub3JlLgotICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDxTY2FsYXIsMTcsMTc+KCksTWF0cml4PFNjYWxhciwxNywxNz4oKStNYXRyaXg8U2NhbGFyLDE3LDE3PigpLAotICAgICAgICAtMSwgTm9VbnJvbGxpbmcpKTsKKyAgICAgIFZFUklGWSgKKyAgICAgICAgICB0ZXN0X2Fzc2lnbihNYXRyaXg8U2NhbGFyLCAxNywgMTc+KCksIE1hdHJpeDxTY2FsYXIsIDE3LCAxNz4oKSArIE1hdHJpeDxTY2FsYXIsIDE3LCAxNz4oKSwgLTEsIE5vVW5yb2xsaW5nKSk7CiAKLSAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgxMSgpLCBNYXRyaXgxMSgpK01hdHJpeDExKCksSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MTEoKSwgTWF0cml4MTEoKSArIE1hdHJpeDExKCksIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKIAorICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDExKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4PFNjYWxhciwgMjEsIDIxPigpLnRlbXBsYXRlIGJsb2NrPFBhY2tldFNpemUsIFBhY2tldFNpemU+KDIsIDMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4PFNjYWxhciwgMjEsIDIxPigpLnRlbXBsYXRlIGJsb2NrPFBhY2tldFNpemUsIFBhY2tldFNpemU+KDMsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFKSA/IElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCA6IERlZmF1bHRUcmF2ZXJzYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGVVbnJvbGxpbmcgfCBJbm5lclVucm9sbGluZykpOwogCi0gICAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MTEoKSxNYXRyaXg8U2NhbGFyLDIxLDIxPigpLnRlbXBsYXRlIGJsb2NrPFBhY2tldFNpemUsUGFja2V0U2l6ZT4oMiwzKStNYXRyaXg8U2NhbGFyLDIxLDIxPigpLnRlbXBsYXRlIGJsb2NrPFBhY2tldFNpemUsUGFja2V0U2l6ZT4oMywyKSwKLSAgICAgICAgKEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUpID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIDogRGVmYXVsdFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmd8SW5uZXJVbnJvbGxpbmcpKTsKKyAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksIE1hdHJpeDExKCkgKiBWZWN0b3IxKCksIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKIAotICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxNYXRyaXgxMSgpKlZlY3RvcjEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKLQotICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDExKCksTWF0cml4MTEoKS5sYXp5UHJvZHVjdChNYXRyaXgxMSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsSW5uZXJVbnJvbGxpbmcrQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgxMSgpLCBNYXRyaXgxMSgpLmxhenlQcm9kdWN0KE1hdHJpeDExKCkpLCBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgSW5uZXJVbnJvbGxpbmcgKyBDb21wbGV0ZVVucm9sbGluZykpOwogICAgIH0KIAotICAgIFZFUklGWSh0ZXN0X3JlZHV4KFZlY3RvcjEoKSwKLSAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9yZWR1eChWZWN0b3IxKCksIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nKSk7CiAKLSAgICBWRVJJRlkodGVzdF9yZWR1eChWZWN0b3IxKCkuYXJyYXkoKSpWZWN0b3IxKCkuYXJyYXkoKSwKLSAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9yZWR1eChWZWN0b3IxKCkuYXJyYXkoKSAqIFZlY3RvcjEoKS5hcnJheSgpLCBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZykpOwogCi0gICAgVkVSSUZZKHRlc3RfcmVkdXgoKFZlY3RvcjEoKS5hcnJheSgpKlZlY3RvcjEoKS5hcnJheSgpKS5jb2woMCksCi0gICAgICBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfcmVkdXgoKFZlY3RvcjEoKS5hcnJheSgpICogVmVjdG9yMSgpLmFycmF5KCkpLmNvbCgwKSwgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKIAotICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZSwzPigpLAotICAgICAgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDxTY2FsYXIsIFBhY2tldFNpemUsIDM+KCksIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nKSk7CiAKLSAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXgzKCksCi0gICAgICBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfcmVkdXgoTWF0cml4MygpLCBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZykpOwogCi0gICAgVkVSSUZZKHRlc3RfcmVkdXgoTWF0cml4NDQoKSwKLSAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsTm9VbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXg0NCgpLCBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLCBOb1Vucm9sbGluZykpOwogCi0gICAgaWYoUGFja2V0U2l6ZT4xKSB7Ci0gICAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXg0NCgpLnRlbXBsYXRlIGJsb2NrPChNYXRyaXgxOjpGbGFncyZSb3dNYWpvckJpdCk/NDpQYWNrZXRTaXplLChNYXRyaXgxOjpGbGFncyZSb3dNYWpvckJpdCk/UGFja2V0U2l6ZTo0PigxLDIpLAotICAgICAgICBTbGljZVZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBpZiAoUGFja2V0U2l6ZSA+IDEpIHsKKyAgICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDQ0KCkudGVtcGxhdGUgYmxvY2sgPCAoTWF0cml4MTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPyA0IDogUGFja2V0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChNYXRyaXgxOjpGbGFncyAmIFJvd01ham9yQml0KSA/IFBhY2tldFNpemUgOiA0ID4gKDEsIDIpLCBTbGljZVZlY3Rvcml6ZWRUcmF2ZXJzYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZVVucm9sbGluZykpOwogCi0gICAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXg0NCgpLnRlbXBsYXRlIGJsb2NrPChNYXRyaXgxOjpGbGFncyZSb3dNYWpvckJpdCk/MjpQYWNrZXRTaXplLChNYXRyaXgxOjpGbGFncyZSb3dNYWpvckJpdCk/UGFja2V0U2l6ZToyPigxLDIpLAotICAgICAgICBEZWZhdWx0VHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXg0NCgpLnRlbXBsYXRlIGJsb2NrIDwgKE1hdHJpeDE6OkZsYWdzICYgUm93TWFqb3JCaXQpID8gMiA6IFBhY2tldFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAoTWF0cml4MTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPyBQYWNrZXRTaXplIDogMiA+ICgxLCAyKSwgRGVmYXVsdFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKICAgICB9CiAKLSAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXg0NGMoKS50ZW1wbGF0ZSBibG9jazwyKlBhY2tldFNpemUsMT4oMSwyKSwKLSAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkoCisgICAgICAgIHRlc3RfcmVkdXgoTWF0cml4NDRjKCkudGVtcGxhdGUgYmxvY2s8MiAqIFBhY2tldFNpemUsIDE+KDEsIDIpLCBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZykpOwogCi0gICAgVkVSSUZZKHRlc3RfcmVkdXgoTWF0cml4NDRyKCkudGVtcGxhdGUgYmxvY2s8MSwyKlBhY2tldFNpemU+KDIsMSksCi0gICAgICBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKAorICAgICAgICB0ZXN0X3JlZHV4KE1hdHJpeDQ0cigpLnRlbXBsYXRlIGJsb2NrPDEsIDIgKiBQYWNrZXRTaXplPigyLCAxKSwgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSgodGVzdF9hc3NpZ248TWFwPE1hdHJpeDIyLCBBbGlnbmVkTWF4LCBPdXRlclN0cmlkZTwzICogUGFja2V0U2l6ZT4gPiwgTWF0cml4MjI+KElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZVVucm9sbGluZykpKTsKIAogICAgIFZFUklGWSgodGVzdF9hc3NpZ248Ci0gICAgICAgICAgICBNYXA8TWF0cml4MjIsIEFsaWduZWRNYXgsIE91dGVyU3RyaWRlPDMqUGFja2V0U2l6ZT4gPiwKLSAgICAgICAgICAgIE1hdHJpeDIyCi0gICAgICAgICAgICA+KElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpKTsKKyAgICAgICAgICAgIE1hcDxNYXRyaXg8U2NhbGFyLCBpbnRlcm5hbDo6cGxhaW5fZW51bV9tYXgoMiwgUGFja2V0U2l6ZSksIGludGVybmFsOjpwbGFpbl9lbnVtX21heCgyLCBQYWNrZXRTaXplKT4sCisgICAgICAgICAgICAgICAgQWxpZ25lZE1heCwgSW5uZXJTdHJpZGU8MyAqIFBhY2tldFNpemU+ID4sCisgICAgICAgICAgICBNYXRyaXg8U2NhbGFyLCBpbnRlcm5hbDo6cGxhaW5fZW51bV9tYXgoMiwgUGFja2V0U2l6ZSksIGludGVybmFsOjpwbGFpbl9lbnVtX21heCgyLCBQYWNrZXRTaXplKT4gPigKKyAgICAgICAgRGVmYXVsdFRyYXZlcnNhbCwgUGFja2V0U2l6ZSA+PSA4ID8gSW5uZXJVbnJvbGxpbmcgOiBDb21wbGV0ZVVucm9sbGluZykpKTsKIAotICAgIFZFUklGWSgodGVzdF9hc3NpZ248Ci0gICAgICAgICAgICBNYXA8TWF0cml4PFNjYWxhciwgaW50ZXJuYWw6OnBsYWluX2VudW1fbWF4KDIsUGFja2V0U2l6ZSksIGludGVybmFsOjpwbGFpbl9lbnVtX21heCgyLCBQYWNrZXRTaXplKT4sIEFsaWduZWRNYXgsIElubmVyU3RyaWRlPDMqUGFja2V0U2l6ZT4gPiwKLSAgICAgICAgICAgIE1hdHJpeDxTY2FsYXIsIGludGVybmFsOjpwbGFpbl9lbnVtX21heCgyLCBQYWNrZXRTaXplKSwgaW50ZXJuYWw6OnBsYWluX2VudW1fbWF4KDIsIFBhY2tldFNpemUpPgotICAgICAgICAgICAgPihEZWZhdWx0VHJhdmVyc2FsLFBhY2tldFNpemU+PTg/SW5uZXJVbnJvbGxpbmc6Q29tcGxldGVVbnJvbGxpbmcpKSk7Ci0KLSAgICBWRVJJRlkoKHRlc3RfYXNzaWduKE1hdHJpeDExKCksIE1hdHJpeDxTY2FsYXIsUGFja2V0U2l6ZSwgaW50ZXJuYWw6OnBsYWluX2VudW1fbWluKDIsIFBhY2tldFNpemUpPigpKk1hdHJpeDxTY2FsYXIsIGludGVybmFsOjpwbGFpbl9lbnVtX21pbigyLCBQYWNrZXRTaXplKSxQYWNrZXRTaXplPigpLAorICAgIFZFUklGWSgodGVzdF9hc3NpZ24oTWF0cml4MTEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJpeDxTY2FsYXIsIFBhY2tldFNpemUsIGludGVybmFsOjpwbGFpbl9lbnVtX21pbigyLCBQYWNrZXRTaXplKT4oKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4PFNjYWxhciwgaW50ZXJuYWw6OnBsYWluX2VudW1fbWluKDIsIFBhY2tldFNpemUpLCBQYWNrZXRTaXplPigpLAogICAgICAgICAgICAgICAgICAgICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZykpKTsKLSAgICAjZW5kaWYKKyNlbmRpZgogCi0gICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeFhYKDEwLDEwKSxNYXRyaXhYWCgyMCwyMCkuYmxvY2soMTAsMTAsMiwzKSwKLSAgICAgIFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCxOb1Vucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXhYWCgxMCwgMTApLCBNYXRyaXhYWCgyMCwgMjApLmJsb2NrKDEwLCAxMCwgMiwgMyksIFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCwgTm9VbnJvbGxpbmcpKTsKIAotICAgIFZFUklGWSh0ZXN0X3JlZHV4KFZlY3RvclgoMTApLAotICAgICAgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxOb1Vucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X3JlZHV4KFZlY3RvclgoMTApLCBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLCBOb1Vucm9sbGluZykpOwogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHN0cnVjdCB2ZWN0b3JpemF0aW9uX2xvZ2ljPFNjYWxhcixmYWxzZT4KLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgdmVjdG9yaXphdGlvbl9sb2dpYzxTY2FsYXIsIGZhbHNlPiB7CiAgIHN0YXRpYyB2b2lkIHJ1bigpIHt9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGJvb2wgRW5hYmxlID0gIWludGVybmFsOjppc19zYW1lPHR5cGVuYW1lIGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZT46OmhhbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGU+Ojp2YWx1ZSA+Ci1zdHJ1Y3QgdmVjdG9yaXphdGlvbl9sb2dpY19oYWxmCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBib29sIEVuYWJsZSA9ICFpbnRlcm5hbDo6aXNfc2FtZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpbnRlcm5hbDo6dW5wYWNrZXRfdHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGU+OjpoYWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46OnR5cGU+Ojp2YWx1ZT4KK3N0cnVjdCB2ZWN0b3JpemF0aW9uX2xvZ2ljX2hhbGYgewogICB0eXBlZGVmIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj4gUGFja2V0VHJhaXRzOwogICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6dHlwZT46OmhhbGYgUGFja2V0VHlwZTsKICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0VHlwZT46OnNpemU7CiAKLSAgc3RhdGljIHZvaWQgcnVuKCkKLSAgeworICBzdGF0aWMgdm9pZCBydW4oKSB7CiAgICAgLy8gU29tZSBoYWxmLXBhY2tldHMgaGF2ZSBhIGJ5dGUgc2l6ZSA8IEVJR0VOX01JTl9BTElHTl9CWVRFUyAoZS5nLiBQYWNrZXQyZiksCiAgICAgLy8gd2hpY2ggY2F1c2VzIG1hbnkgb2YgdGhlc2UgdGVzdHMgdG8gZmFpbCBzaW5jZSB0aGV5IGRvbid0IHZlY3Rvcml6ZSBpZgogICAgIC8vIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUgaXMgMCAodGhlIG1hdHJpeCBpcyBhc3N1bWVkIHVuYWxpZ25lZCkuCiAgICAgLy8gQWRqdXN0IHRoZSBtYXRyaXggc2l6ZXMgdG8gYWNjb3VudCBmb3IgdGhlc2UgYWxpZ25tZW50IGlzc3Vlcy4KLSAgICBjb25zdGV4cHIgaW50IFBhY2tldEJ5dGVzID0gc2l6ZW9mKFNjYWxhcikqUGFja2V0U2l6ZTsKKyAgICBjb25zdGV4cHIgaW50IFBhY2tldEJ5dGVzID0gc2l6ZW9mKFNjYWxhcikgKiBQYWNrZXRTaXplOwogICAgIGNvbnN0ZXhwciBpbnQgTWluVlNpemUgPSBpbnQoRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSkgPyBQYWNrZXRTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUGFja2V0Qnl0ZXMgPj0gRUlHRU5fTUlOX0FMSUdOX0JZVEVTID8gUGFja2V0U2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChFSUdFTl9NSU5fQUxJR05fQllURVMgKyBzaXplb2YoU2NhbGFyKSAtIDEpIC8gc2l6ZW9mKFNjYWxhcik7Ci0gICAgCi0gICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLE1pblZTaXplLDE+IFZlY3RvcjE7Ci0gICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLE1pblZTaXplLE1pblZTaXplPiBNYXRyaXgxMTsKLSAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsNSpNaW5WU2l6ZSw3LENvbE1ham9yPiBNYXRyaXg1NzsKLSAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMypNaW5WU2l6ZSw1LENvbE1ham9yPiBNYXRyaXgzNTsKLSAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsNSpNaW5WU2l6ZSw3LERvbnRBbGlnbnxDb2xNYWpvcj4gTWF0cml4NTd1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBhY2tldEJ5dGVzID49IEVJR0VOX01JTl9BTElHTl9CWVRFUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQYWNrZXRTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChFSUdFTl9NSU5fQUxJR05fQllURVMgKyBzaXplb2YoU2NhbGFyKSAtIDEpIC8gc2l6ZW9mKFNjYWxhcik7CisKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1pblZTaXplLCAxPiBWZWN0b3IxOworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgTWluVlNpemUsIE1pblZTaXplPiBNYXRyaXgxMTsKKyAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDUgKiBNaW5WU2l6ZSwgNywgQ29sTWFqb3I+IE1hdHJpeDU3OworICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMyAqIE1pblZTaXplLCA1LCBDb2xNYWpvcj4gTWF0cml4MzU7CisgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCA1ICogTWluVlNpemUsIDcsIERvbnRBbGlnbiB8IENvbE1ham9yPiBNYXRyaXg1N3U7CiAKICAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsCi0gICAgICAgIChQYWNrZXRTaXplPT0xNiA/IDggOiBQYWNrZXRTaXplPT04ID8gNCA6IFBhY2tldFNpemU9PTQgPyAyIDogUGFja2V0U2l6ZT09MiA/IDEgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpLAotICAgICAgICAoUGFja2V0U2l6ZT09MTYgPyAyIDogUGFja2V0U2l6ZT09OCA/IDIgOiBQYWNrZXRTaXplPT00ID8gMiA6IFBhY2tldFNpemU9PTIgPyAyIDogLypQYWNrZXRTaXplPT0xID8qLyAxKQotICAgICAgPiBNYXRyaXgxOworICAgICAgICAgICAgICAgICAgIChQYWNrZXRTaXplID09IDE2ICA/IDgKKyAgICAgICAgICAgICAgICAgICAgOiBQYWNrZXRTaXplID09IDggPyA0CisgICAgICAgICAgICAgICAgICAgIDogUGFja2V0U2l6ZSA9PSA0ID8gMgorICAgICAgICAgICAgICAgICAgICA6IFBhY2tldFNpemUgPT0gMiA/IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpLAorICAgICAgICAgICAgICAgICAgIChQYWNrZXRTaXplID09IDE2ICA/IDIKKyAgICAgICAgICAgICAgICAgICAgOiBQYWNrZXRTaXplID09IDggPyAyCisgICAgICAgICAgICAgICAgICAgIDogUGFja2V0U2l6ZSA9PSA0ID8gMgorICAgICAgICAgICAgICAgICAgICA6IFBhY2tldFNpemUgPT0gMiA/IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAvKlBhY2tldFNpemU9PTEgPyovIDEpPgorICAgICAgICBNYXRyaXgxOwogCiAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLAotICAgICAgICAoUGFja2V0U2l6ZT09MTYgPyA4IDogUGFja2V0U2l6ZT09OCA/IDQgOiBQYWNrZXRTaXplPT00ID8gMiA6IFBhY2tldFNpemU9PTIgPyAxIDogLypQYWNrZXRTaXplPT0xID8qLyAxKSwKLSAgICAgICAgKFBhY2tldFNpemU9PTE2ID8gMiA6IFBhY2tldFNpemU9PTggPyAyIDogUGFja2V0U2l6ZT09NCA/IDIgOiBQYWNrZXRTaXplPT0yID8gMiA6IC8qUGFja2V0U2l6ZT09MSA/Ki8gMSksCi0gICAgICBEb250QWxpZ258KChNYXRyaXgxOjpGbGFncyZSb3dNYWpvckJpdCk/Um93TWFqb3I6Q29sTWFqb3IpPiBNYXRyaXgxdTsKKyAgICAgICAgICAgICAgICAgICAoUGFja2V0U2l6ZSA9PSAxNiAgPyA4CisgICAgICAgICAgICAgICAgICAgIDogUGFja2V0U2l6ZSA9PSA4ID8gNAorICAgICAgICAgICAgICAgICAgICA6IFBhY2tldFNpemUgPT0gNCA/IDIKKyAgICAgICAgICAgICAgICAgICAgOiBQYWNrZXRTaXplID09IDIgPyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLypQYWNrZXRTaXplPT0xID8qLyAxKSwKKyAgICAgICAgICAgICAgICAgICAoUGFja2V0U2l6ZSA9PSAxNiAgPyAyCisgICAgICAgICAgICAgICAgICAgIDogUGFja2V0U2l6ZSA9PSA4ID8gMgorICAgICAgICAgICAgICAgICAgICA6IFBhY2tldFNpemUgPT0gNCA/IDIKKyAgICAgICAgICAgICAgICAgICAgOiBQYWNrZXRTaXplID09IDIgPyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLypQYWNrZXRTaXplPT0xID8qLyAxKSwKKyAgICAgICAgICAgICAgICAgICBEb250QWxpZ24gfCAoKE1hdHJpeDE6OkZsYWdzICYgUm93TWFqb3JCaXQpID8gUm93TWFqb3IgOiBDb2xNYWpvcik+CisgICAgICAgIE1hdHJpeDF1OwogCiAgICAgLy8gdGhpcyB0eXBlIGlzIG1hZGUgc3VjaCB0aGF0IGl0IGNhbiBvbmx5IGJlIHZlY3Rvcml6ZWQgd2hlbiB2aWV3ZWQgYXMgYSBsaW5lYXIgMUQgdmVjdG9yCiAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLAotICAgICAgICAoTWluVlNpemU9PTE2ID8gIDQgOiBNaW5WU2l6ZT09OCA/IDQgOiBNaW5WU2l6ZT09NCA/IDYgOiBNaW5WU2l6ZT09MiA/ICgoTWF0cml4MTE6OkZsYWdzJlJvd01ham9yQml0KT8yOjMpIDogLypQYWNrZXRTaXplPT0xID8qLyAxKSwKLSAgICAgICAgKE1pblZTaXplPT0xNiA/IDEyIDogTWluVlNpemU9PTggPyA2IDogTWluVlNpemU9PTQgPyAyIDogTWluVlNpemU9PTIgPyAoKE1hdHJpeDExOjpGbGFncyZSb3dNYWpvckJpdCk/MzoyKSA6IC8qUGFja2V0U2l6ZT09MSA/Ki8gMykKLSAgICAgID4gTWF0cml4MzsKLSAgICAKKyAgICAgICAgICAgICAgICAgICAoTWluVlNpemUgPT0gMTYgID8gNAorICAgICAgICAgICAgICAgICAgICA6IE1pblZTaXplID09IDggPyA0CisgICAgICAgICAgICAgICAgICAgIDogTWluVlNpemUgPT0gNCA/IDYKKyAgICAgICAgICAgICAgICAgICAgOiBNaW5WU2l6ZSA9PSAyID8gKChNYXRyaXgxMTo6RmxhZ3MgJiBSb3dNYWpvckJpdCkgPyAyIDogMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLypQYWNrZXRTaXplPT0xID8qLyAxKSwKKyAgICAgICAgICAgICAgICAgICAoTWluVlNpemUgPT0gMTYgID8gMTIKKyAgICAgICAgICAgICAgICAgICAgOiBNaW5WU2l6ZSA9PSA4ID8gNgorICAgICAgICAgICAgICAgICAgICA6IE1pblZTaXplID09IDQgPyAyCisgICAgICAgICAgICAgICAgICAgIDogTWluVlNpemUgPT0gMiA/ICgoTWF0cml4MTE6OkZsYWdzICYgUm93TWFqb3JCaXQpID8gMyA6IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC8qUGFja2V0U2l6ZT09MSA/Ki8gMyk+CisgICAgICAgIE1hdHJpeDM7CisKICNpZiAhRUlHRU5fR0NDX0FORF9BUkNIX0RPRVNOVF9XQU5UX1NUQUNLX0FMSUdOTUVOVAotICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksVmVjdG9yMSgpLAotICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7Ci0gICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxWZWN0b3IxKCkrVmVjdG9yMSgpLAotICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7Ci0gICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxWZWN0b3IxKCkudGVtcGxhdGUgc2VnbWVudDxNaW5WU2l6ZT4oMCkuZGVyaXZlZCgpLAotICAgICAgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSA/IElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKLSAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLFNjYWxhcigyLjEpKlZlY3RvcjEoKS1WZWN0b3IxKCksCi0gICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKLSAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLChTY2FsYXIoMi4xKSpWZWN0b3IxKCkudGVtcGxhdGUgc2VnbWVudDxNaW5WU2l6ZT4oMCktVmVjdG9yMSgpLnRlbXBsYXRlIHNlZ21lbnQ8TWluVlNpemU+KDApKS5kZXJpdmVkKCksCi0gICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIDogTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOwotICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksVmVjdG9yMSgpLmN3aXNlUHJvZHVjdChWZWN0b3IxKCkpLAotICAgICAgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7Ci0gICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxWZWN0b3IxKCkudGVtcGxhdGUgY2FzdDxTY2FsYXI+KCksCi0gICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLCBWZWN0b3IxKCksIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLCBWZWN0b3IxKCkgKyBWZWN0b3IxKCksIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLCBWZWN0b3IxKCkudGVtcGxhdGUgc2VnbWVudDxNaW5WU2l6ZT4oMCkuZGVyaXZlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIDogTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oVmVjdG9yMSgpLCBTY2FsYXIoMi4xKSAqIFZlY3RvcjEoKSAtIFZlY3RvcjEoKSwgSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsLCBDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbigKKyAgICAgICAgVmVjdG9yMSgpLAorICAgICAgICAoU2NhbGFyKDIuMSkgKiBWZWN0b3IxKCkudGVtcGxhdGUgc2VnbWVudDxNaW5WU2l6ZT4oMCkgLSBWZWN0b3IxKCkudGVtcGxhdGUgc2VnbWVudDxNaW5WU2l6ZT4oMCkpLmRlcml2ZWQoKSwKKyAgICAgICAgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSA/IElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSwgVmVjdG9yMSgpLmN3aXNlUHJvZHVjdChWZWN0b3IxKCkpLCBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSwgVmVjdG9yMSgpLnRlbXBsYXRlIGNhc3Q8U2NhbGFyPigpLCBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nKSk7CiAKLSAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4NTcoKSxNYXRyaXg1NygpK01hdHJpeDU3KCksCi0gICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsSW5uZXJVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4NTcoKSwgTWF0cml4NTcoKSArIE1hdHJpeDU3KCksIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwgSW5uZXJVbnJvbGxpbmcpKTsKIAotICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXg1N3UoKSxNYXRyaXg1NygpK01hdHJpeDU3KCksCi0gICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIDogTGluZWFyVHJhdmVyc2FsLAotICAgICAgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSA/IElubmVyVW5yb2xsaW5nIDogTm9VbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4NTd1KCksIE1hdHJpeDU3KCkgKyBNYXRyaXg1NygpLAorICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIDogTGluZWFyVHJhdmVyc2FsLAorICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJVbnJvbGxpbmcgOiBOb1Vucm9sbGluZykpOwogCi0gICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDF1KCksTWF0cml4MSgpK01hdHJpeDEoKSwKLSAgICAgIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUgPyAoKGludChNYXRyaXgxOjpJbm5lclNpemVBdENvbXBpbGVUaW1lKSAlIGludChQYWNrZXRTaXplKSk9PTAgPyBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsKSA6IExpbmVhclRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOwotICAgICAgICAKLSAgICBpZihQYWNrZXRTaXplPjEpCi0gICAgewotICAgICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMyxDb2xNYWpvcj4gTWF0cml4MzNjOwotICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDMzYygpLnJvdygyKSxNYXRyaXgzM2MoKS5yb3coMSkrTWF0cml4MzNjKCkucm93KDEpLAotICAgICAgICBMaW5lYXJUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MXUoKSwgTWF0cml4MSgpICsgTWF0cml4MSgpLAorICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFCisgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgoaW50KE1hdHJpeDE6OklubmVyU2l6ZUF0Q29tcGlsZVRpbWUpICUgaW50KFBhY2tldFNpemUpKSA9PSAwID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTGluZWFyVHJhdmVyc2FsLAorICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZVVucm9sbGluZykpOwogCi0gICAgICAvLyBVbnJvbGxpbmcgZGVwZW5kcyBvbiByZWFkIGNvc3RzIGFuZCB1bnJvbGwgbGltaXRzLCB3aGljaCB2YXJ5IC0gaWdub3JlLiAgIAotICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDMoKSxNYXRyaXgzKCkuY3dpc2VRdW90aWVudChNYXRyaXgzKCkpLAotICAgICAgICBQYWNrZXRUcmFpdHM6Okhhc0RpdiA/IExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJUcmF2ZXJzYWwsIC0xKSk7Ci0gICAgICAgIAotICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDxTY2FsYXIsMTcsMTc+KCksTWF0cml4PFNjYWxhciwxNywxNz4oKStNYXRyaXg8U2NhbGFyLDE3LDE3PigpLAotICAgICAgICBzaXplb2YoU2NhbGFyKT09MTYgPyBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiAoRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSA/IExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJUcmF2ZXJzYWwpLAotICAgICAgICBOb1Vucm9sbGluZykpOwotICAgICAgICAKLSAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXgxMSgpLE1hdHJpeDxTY2FsYXIsMTcsMTc+KCkudGVtcGxhdGUgYmxvY2s8TWluVlNpemUsTWluVlNpemU+KDIsMykrTWF0cml4PFNjYWxhciwxNywxNz4oKS50ZW1wbGF0ZSBibG9jazxNaW5WU2l6ZSxNaW5WU2l6ZT4oOCw0KSwKLSAgICAgICAgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSA/IElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCA6IERlZmF1bHRUcmF2ZXJzYWwsSW5uZXJVbnJvbGxpbmcrQ29tcGxldGVVbnJvbGxpbmcpKTsKLSAgCisgICAgaWYgKFBhY2tldFNpemUgPiAxKSB7CisgICAgICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDMsIENvbE1ham9yPiBNYXRyaXgzM2M7CisgICAgICBWRVJJRlkoCisgICAgICAgICAgdGVzdF9hc3NpZ24oTWF0cml4MzNjKCkucm93KDIpLCBNYXRyaXgzM2MoKS5yb3coMSkgKyBNYXRyaXgzM2MoKS5yb3coMSksIExpbmVhclRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKIAotICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKFZlY3RvcjEoKSxNYXRyaXgxMSgpKlZlY3RvcjEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICAgIC8vIFVucm9sbGluZyBkZXBlbmRzIG9uIHJlYWQgY29zdHMgYW5kIHVucm9sbCBsaW1pdHMsIHdoaWNoIHZhcnkgLSBpZ25vcmUuCisgICAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4MygpLCBNYXRyaXgzKCkuY3dpc2VRdW90aWVudChNYXRyaXgzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldFRyYWl0czo6SGFzRGl2ID8gTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclRyYXZlcnNhbCwgLTEpKTsKIAotICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDExKCksTWF0cml4MTEoKS5sYXp5UHJvZHVjdChNYXRyaXgxMSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJbm5lclZlY3Rvcml6ZWRUcmF2ZXJzYWwsSW5uZXJVbnJvbGxpbmcrQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXg8U2NhbGFyLCAxNywgMTc+KCksIE1hdHJpeDxTY2FsYXIsIDE3LCAxNz4oKSArIE1hdHJpeDxTY2FsYXIsIDE3LCAxNz4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU2NhbGFyKSA9PSAxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IElubmVyVmVjdG9yaXplZFRyYXZlcnNhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclRyYXZlcnNhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTm9VbnJvbGxpbmcpKTsKKworICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDExKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4PFNjYWxhciwgMTcsIDE3PigpLnRlbXBsYXRlIGJsb2NrPE1pblZTaXplLCBNaW5WU2l6ZT4oMiwgMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXg8U2NhbGFyLCAxNywgMTc+KCkudGVtcGxhdGUgYmxvY2s8TWluVlNpemUsIE1pblZTaXplPig4LCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gSW5uZXJWZWN0b3JpemVkVHJhdmVyc2FsIDogRGVmYXVsdFRyYXZlcnNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbm5lclVucm9sbGluZyArIENvbXBsZXRlVW5yb2xsaW5nKSk7CisKKyAgICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihWZWN0b3IxKCksIE1hdHJpeDExKCkgKiBWZWN0b3IxKCksIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDExKCksIE1hdHJpeDExKCkubGF6eVByb2R1Y3QoTWF0cml4MTEoKSksIElubmVyVmVjdG9yaXplZFRyYXZlcnNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbm5lclVucm9sbGluZyArIENvbXBsZXRlVW5yb2xsaW5nKSk7CiAgICAgfQotICAgIAotICAgIFZFUklGWSh0ZXN0X3JlZHV4KFZlY3RvcjEoKSwKLSAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKIAotICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDxTY2FsYXIsTWluVlNpemUsMz4oKSwKLSAgICAgIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKKyAgICBWRVJJRlkodGVzdF9yZWR1eChWZWN0b3IxKCksIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nKSk7CiAKLSAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXgzKCksCi0gICAgICBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfcmVkdXgoTWF0cml4PFNjYWxhciwgTWluVlNpemUsIDM+KCksIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nKSk7CiAKLSAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXgzNSgpLAotICAgICAgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDMoKSwgTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKIAotICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDU3KCkudGVtcGxhdGUgYmxvY2s8UGFja2V0U2l6ZT09MT8yOlBhY2tldFNpemUsMz4oMSwwKSwKLSAgICAgIFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOworICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDM1KCksIExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwsIENvbXBsZXRlVW5yb2xsaW5nKSk7CiAKLSAgICBpZihQYWNrZXRTaXplPjEpIHsKLSAgICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDU3KCkudGVtcGxhdGUgYmxvY2s8UGFja2V0U2l6ZSwyPigxLDApLAotICAgICAgICBEZWZhdWx0VHJhdmVyc2FsLENvbXBsZXRlVW5yb2xsaW5nKSk7CisgICAgVkVSSUZZKHRlc3RfcmVkdXgoTWF0cml4NTcoKS50ZW1wbGF0ZSBibG9jayA8IFBhY2tldFNpemUgPT0gMSA/IDIgOiBQYWNrZXRTaXplLCAzID4gKDEsIDApLAorICAgICAgICAgICAgICAgICAgICAgIFNsaWNlVmVjdG9yaXplZFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgIGlmIChQYWNrZXRTaXplID4gMSkgeworICAgICAgVkVSSUZZKHRlc3RfcmVkdXgoTWF0cml4NTcoKS50ZW1wbGF0ZSBibG9jazxQYWNrZXRTaXplLCAyPigxLCAwKSwgRGVmYXVsdFRyYXZlcnNhbCwgQ29tcGxldGVVbnJvbGxpbmcpKTsKICAgICB9CiAKICAgICBWRVJJRlkoKHRlc3RfYXNzaWduPApAQCAtMzg4LDQ1ICs0MzAsNTIgQEAKICAgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiBzdHJ1Y3QgdmVjdG9yaXphdGlvbl9sb2dpY19oYWxmPFNjYWxhcixmYWxzZT4KLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdHJ1Y3QgdmVjdG9yaXphdGlvbl9sb2dpY19oYWxmPFNjYWxhciwgZmFsc2U+IHsKICAgc3RhdGljIHZvaWQgcnVuKCkge30KIH07CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVCh2ZWN0b3JpemF0aW9uX2xvZ2ljKQotewotCitFSUdFTl9ERUNMQVJFX1RFU1QodmVjdG9yaXphdGlvbl9sb2dpYykgewogI2lmZGVmIEVJR0VOX1ZFQ1RPUklaRQogCi0gIENBTExfU1VCVEVTVCggdmVjdG9yaXphdGlvbl9sb2dpYzxpbnQ+OjpydW4oKSApOwotICBDQUxMX1NVQlRFU1QoIHZlY3Rvcml6YXRpb25fbG9naWM8ZmxvYXQ+OjpydW4oKSApOwotICBDQUxMX1NVQlRFU1QoIHZlY3Rvcml6YXRpb25fbG9naWM8ZG91YmxlPjo6cnVuKCkgKTsKLSAgQ0FMTF9TVUJURVNUKCB2ZWN0b3JpemF0aW9uX2xvZ2ljPHN0ZDo6Y29tcGxleDxmbG9hdD4gPjo6cnVuKCkgKTsKLSAgQ0FMTF9TVUJURVNUKCB2ZWN0b3JpemF0aW9uX2xvZ2ljPHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnJ1bigpICk7Ci0gIAotICBDQUxMX1NVQlRFU1QoIHZlY3Rvcml6YXRpb25fbG9naWNfaGFsZjxpbnQ+OjpydW4oKSApOwotICBDQUxMX1NVQlRFU1QoIHZlY3Rvcml6YXRpb25fbG9naWNfaGFsZjxmbG9hdD46OnJ1bigpICk7Ci0gIENBTExfU1VCVEVTVCggdmVjdG9yaXphdGlvbl9sb2dpY19oYWxmPGRvdWJsZT46OnJ1bigpICk7Ci0gIENBTExfU1VCVEVTVCggdmVjdG9yaXphdGlvbl9sb2dpY19oYWxmPHN0ZDo6Y29tcGxleDxmbG9hdD4gPjo6cnVuKCkgKTsKLSAgQ0FMTF9TVUJURVNUKCB2ZWN0b3JpemF0aW9uX2xvZ2ljX2hhbGY8c3RkOjpjb21wbGV4PGRvdWJsZT4gPjo6cnVuKCkgKTsKLSAgCi0gIGlmKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPGZsb2F0Pjo6VmVjdG9yaXphYmxlKQotICB7Ci0gICAgVkVSSUZZKHRlc3RfYXNzaWduKE1hdHJpeDxmbG9hdCwzLDM+KCksTWF0cml4PGZsb2F0LDMsMz4oKStNYXRyaXg8ZmxvYXQsMywzPigpLAotICAgICAgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8ZmxvYXQ+OjpWZWN0b3JpemFibGUgJiYgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSA/IExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKLSAgICAgIAotICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDxmbG9hdCw1LDI+KCksCi0gICAgICBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxmbG9hdD46OlZlY3Rvcml6YWJsZSAmJiBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOwotICB9Ci0gIAotICBpZihpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxkb3VibGU+OjpWZWN0b3JpemFibGUpCi0gIHsKLSAgICBWRVJJRlkodGVzdF9hc3NpZ24oTWF0cml4PGRvdWJsZSwzLDM+KCksTWF0cml4PGRvdWJsZSwzLDM+KCkrTWF0cml4PGRvdWJsZSwzLDM+KCksCi0gICAgICBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxkb3VibGU+OjpWZWN0b3JpemFibGUgJiYgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRSA/IExpbmVhclZlY3Rvcml6ZWRUcmF2ZXJzYWwgOiBMaW5lYXJUcmF2ZXJzYWwsQ29tcGxldGVVbnJvbGxpbmcpKTsKLSAgICAKLSAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXg8ZG91YmxlLDcsMz4oKSwKLSAgICAgIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPGRvdWJsZT46OlZlY3Rvcml6YWJsZSAmJiBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFID8gTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbCA6IExpbmVhclRyYXZlcnNhbCxDb21wbGV0ZVVucm9sbGluZykpOwotICB9Ci0jZW5kaWYgLy8gRUlHRU5fVkVDVE9SSVpFCisgIENBTExfU1VCVEVTVCh2ZWN0b3JpemF0aW9uX2xvZ2ljPGludD46OnJ1bigpKTsKKyAgQ0FMTF9TVUJURVNUKHZlY3Rvcml6YXRpb25fbG9naWM8ZmxvYXQ+OjpydW4oKSk7CisgIENBTExfU1VCVEVTVCh2ZWN0b3JpemF0aW9uX2xvZ2ljPGRvdWJsZT46OnJ1bigpKTsKKyAgQ0FMTF9TVUJURVNUKHZlY3Rvcml6YXRpb25fbG9naWM8c3RkOjpjb21wbGV4PGZsb2F0PiA+OjpydW4oKSk7CisgIENBTExfU1VCVEVTVCh2ZWN0b3JpemF0aW9uX2xvZ2ljPHN0ZDo6Y29tcGxleDxkb3VibGU+ID46OnJ1bigpKTsKIAorICBDQUxMX1NVQlRFU1QodmVjdG9yaXphdGlvbl9sb2dpY19oYWxmPGludD46OnJ1bigpKTsKKyAgQ0FMTF9TVUJURVNUKHZlY3Rvcml6YXRpb25fbG9naWNfaGFsZjxmbG9hdD46OnJ1bigpKTsKKyAgQ0FMTF9TVUJURVNUKHZlY3Rvcml6YXRpb25fbG9naWNfaGFsZjxkb3VibGU+OjpydW4oKSk7CisgIENBTExfU1VCVEVTVCh2ZWN0b3JpemF0aW9uX2xvZ2ljX2hhbGY8c3RkOjpjb21wbGV4PGZsb2F0PiA+OjpydW4oKSk7CisgIENBTExfU1VCVEVTVCh2ZWN0b3JpemF0aW9uX2xvZ2ljX2hhbGY8c3RkOjpjb21wbGV4PGRvdWJsZT4gPjo6cnVuKCkpOworCisgIGlmIChpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxmbG9hdD46OlZlY3Rvcml6YWJsZSkgeworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXg8ZmxvYXQsIDMsIDM+KCksIE1hdHJpeDxmbG9hdCwgMywgMz4oKSArIE1hdHJpeDxmbG9hdCwgMywgMz4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8ZmxvYXQ+OjpWZWN0b3JpemFibGUgJiYgRUlHRU5fVU5BTElHTkVEX1ZFQ1RPUklaRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBMaW5lYXJWZWN0b3JpemVkVHJhdmVyc2FsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IExpbmVhclRyYXZlcnNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGVVbnJvbGxpbmcpKTsKKworICAgIFZFUklGWSh0ZXN0X3JlZHV4KE1hdHJpeDxmbG9hdCwgNSwgMj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxmbG9hdD46OlZlY3Rvcml6YWJsZSAmJiBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbAorICAgICAgICAgICAgICAgICAgICAgICAgICA6IExpbmVhclRyYXZlcnNhbCwKKyAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZVVucm9sbGluZykpOworICB9CisKKyAgaWYgKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPGRvdWJsZT46OlZlY3Rvcml6YWJsZSkgeworICAgIFZFUklGWSh0ZXN0X2Fzc2lnbihNYXRyaXg8ZG91YmxlLCAzLCAzPigpLCBNYXRyaXg8ZG91YmxlLCAzLCAzPigpICsgTWF0cml4PGRvdWJsZSwgMywgMz4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8ZG91YmxlPjo6VmVjdG9yaXphYmxlICYmIEVJR0VOX1VOQUxJR05FRF9WRUNUT1JJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBMaW5lYXJUcmF2ZXJzYWwsCisgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRlVW5yb2xsaW5nKSk7CisKKyAgICBWRVJJRlkodGVzdF9yZWR1eChNYXRyaXg8ZG91YmxlLCA3LCAzPigpLAorICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPGRvdWJsZT46OlZlY3Rvcml6YWJsZSAmJiBFSUdFTl9VTkFMSUdORURfVkVDVE9SSVpFCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gTGluZWFyVmVjdG9yaXplZFRyYXZlcnNhbAorICAgICAgICAgICAgICAgICAgICAgICAgICA6IExpbmVhclRyYXZlcnNhbCwKKyAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZVVucm9sbGluZykpOworICB9CisjZW5kaWYgIC8vIEVJR0VOX1ZFQ1RPUklaRQogfQpkaWZmIC0tZ2l0IGEvdGVzdC92ZWN0b3J3aXNlb3AuY3BwIGIvdGVzdC92ZWN0b3J3aXNlb3AuY3BwCmluZGV4IDQzNjk3ODkuLjBkMTg5NmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdmVjdG9yd2lzZW9wLmNwcAorKysgYi90ZXN0L3ZlY3Rvcndpc2VvcC5jcHAKQEAgLTEyLDIwICsxMiwxNyBAQAogCiAjaW5jbHVkZSAibWFpbi5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBBcnJheVR5cGU+IHZvaWQgdmVjdG9yd2lzZW9wX2FycmF5KGNvbnN0IEFycmF5VHlwZSYgbSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBBcnJheVR5cGU+Cit2b2lkIHZlY3Rvcndpc2VvcF9hcnJheShjb25zdCBBcnJheVR5cGUmIG0pIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBBcnJheVR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgQXJyYXk8U2NhbGFyLCBBcnJheVR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBDb2xWZWN0b3JUeXBlOwogICB0eXBlZGVmIEFycmF5PFNjYWxhciwgMSwgQXJyYXlUeXBlOjpDb2xzQXRDb21waWxlVGltZT4gUm93VmVjdG9yVHlwZTsKIAogICBJbmRleCByb3dzID0gbS5yb3dzKCk7CiAgIEluZGV4IGNvbHMgPSBtLmNvbHMoKTsKLSAgSW5kZXggciA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHJvd3MtMSksCi0gICAgICAgIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzLTEpOworICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cyAtIDEpLCBjID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgY29scyAtIDEpOwogCi0gIEFycmF5VHlwZSBtMSA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgbTIocm93cywgY29scyksCi0gICAgICAgICAgICBtMyhyb3dzLCBjb2xzKTsKKyAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0yKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKTsKIAogICBDb2xWZWN0b3JUeXBlIGNvbHZlYyA9IENvbFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKICAgUm93VmVjdG9yVHlwZSByb3d2ZWMgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20oY29scyk7CkBAIC03OCw0MyArNzUsMzkgQEAKICAgLy8geWVzLCB0aGVyZSBtaWdodCBiZSBhbiBhbGlhc2luZyBpc3N1ZSB0aGVyZSBidXQgIi5yb3d3aXNlKCkgLz0iCiAgIC8vIGlzIHN1cHBvc2VkIHRvIGV2YWx1YXRlICIgbTIuY29sd2lzZSgpLnN1bSgpIiBpbnRvIGEgdGVtcG9yYXJ5IHRvIGF2b2lkCiAgIC8vIGV2YWx1YXRpbmcgdGhlIHJlZHVjdGlvbiBtdWx0aXBsZSB0aW1lcwotICBpZihBcnJheVR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPjIgfHwgQXJyYXlUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYykKLSAgeworICBpZiAoQXJyYXlUeXBlOjpSb3dzQXRDb21waWxlVGltZSA+IDIgfHwgQXJyYXlUeXBlOjpSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSB7CiAgICAgbTIucm93d2lzZSgpIC89IG0yLmNvbHdpc2UoKS5zdW0oKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMS5yb3d3aXNlKCkgLyBtMS5jb2x3aXNlKCkuc3VtKCkpOwogICB9CiAKICAgLy8gYWxsL2FueQotICBBcnJheTxib29sLER5bmFtaWMsRHluYW1pYz4gbWIocm93cyxjb2xzKTsKLSAgbWIgPSAobTEucmVhbCgpPD0wLjcpLmNvbHdpc2UoKS5hbGwoKTsKLSAgVkVSSUZZKCAobWIuY29sKGMpID09IChtMS5yZWFsKCkuY29sKGMpPD0wLjcpLmFsbCgpKS5hbGwoKSApOwotICBtYiA9IChtMS5yZWFsKCk8PTAuNykucm93d2lzZSgpLmFsbCgpOwotICBWRVJJRlkoIChtYi5yb3cocikgPT0gKG0xLnJlYWwoKS5yb3cocik8PTAuNykuYWxsKCkpLmFsbCgpICk7CisgIEFycmF5PGJvb2wsIER5bmFtaWMsIER5bmFtaWM+IG1iKHJvd3MsIGNvbHMpOworICBtYiA9IChtMS5yZWFsKCkgPD0gMC43KS5jb2x3aXNlKCkuYWxsKCk7CisgIFZFUklGWSgobWIuY29sKGMpID09IChtMS5yZWFsKCkuY29sKGMpIDw9IDAuNykuYWxsKCkpLmFsbCgpKTsKKyAgbWIgPSAobTEucmVhbCgpIDw9IDAuNykucm93d2lzZSgpLmFsbCgpOworICBWRVJJRlkoKG1iLnJvdyhyKSA9PSAobTEucmVhbCgpLnJvdyhyKSA8PSAwLjcpLmFsbCgpKS5hbGwoKSk7CiAKLSAgbWIgPSAobTEucmVhbCgpPj0wLjcpLmNvbHdpc2UoKS5hbnkoKTsKLSAgVkVSSUZZKCAobWIuY29sKGMpID09IChtMS5yZWFsKCkuY29sKGMpPj0wLjcpLmFueSgpKS5hbGwoKSApOwotICBtYiA9IChtMS5yZWFsKCk+PTAuNykucm93d2lzZSgpLmFueSgpOwotICBWRVJJRlkoIChtYi5yb3cocikgPT0gKG0xLnJlYWwoKS5yb3cocik+PTAuNykuYW55KCkpLmFsbCgpICk7CisgIG1iID0gKG0xLnJlYWwoKSA+PSAwLjcpLmNvbHdpc2UoKS5hbnkoKTsKKyAgVkVSSUZZKChtYi5jb2woYykgPT0gKG0xLnJlYWwoKS5jb2woYykgPj0gMC43KS5hbnkoKSkuYWxsKCkpOworICBtYiA9IChtMS5yZWFsKCkgPj0gMC43KS5yb3d3aXNlKCkuYW55KCk7CisgIFZFUklGWSgobWIucm93KHIpID09IChtMS5yZWFsKCkucm93KHIpID49IDAuNykuYW55KCkpLmFsbCgpKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCB2ZWN0b3J3aXNlb3BfbWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIG0pCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdmVjdG9yd2lzZW9wX21hdHJpeChjb25zdCBNYXRyaXhUeXBlJiBtKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8U2NhbGFyPjo6UmVhbCBSZWFsU2NhbGFyOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAxPiBDb2xWZWN0b3JUeXBlOwogICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDEsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBSb3dWZWN0b3JUeXBlOwogICB0eXBlZGVmIE1hdHJpeDxSZWFsU2NhbGFyLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwgMT4gUmVhbENvbFZlY3RvclR5cGU7CiAgIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsIDEsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPiBSZWFsUm93VmVjdG9yVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsRHluYW1pYz4gTWF0cml4WDsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBNYXRyaXhYOwogCiAgIEluZGV4IHJvd3MgPSBtLnJvd3MoKTsKICAgSW5kZXggY29scyA9IG0uY29scygpOwotICBJbmRleCByID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgcm93cy0xKSwKLSAgICAgICAgYyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIGNvbHMtMSk7CisgIEluZGV4IHIgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCByb3dzIC0gMSksIGMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBjb2xzIC0gMSk7CiAKLSAgTWF0cml4VHlwZSBtMSA9IE1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKSwKLSAgICAgICAgICAgIG0yKHJvd3MsIGNvbHMpLAotICAgICAgICAgICAgbTMocm93cywgY29scyk7CisgIE1hdHJpeFR5cGUgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyksIG0yKHJvd3MsIGNvbHMpLCBtMyhyb3dzLCBjb2xzKTsKIAogICBDb2xWZWN0b3JUeXBlIGNvbHZlYyA9IENvbFZlY3RvclR5cGU6OlJhbmRvbShyb3dzKTsKICAgUm93VmVjdG9yVHlwZSByb3d2ZWMgPSBSb3dWZWN0b3JUeXBlOjpSYW5kb20oY29scyk7CkBAIC0xMjQsMTEgKzExNyw5IEBACiAgIC8vIHRlc3QgYnJvYWRjYXN0IGFzc2lnbm1lbnQKICAgbTIgPSBtMTsKICAgbTIuY29sd2lzZSgpID0gY29sdmVjOwotICBmb3IoSW5kZXggaj0wOyBqPGNvbHM7ICsraikKLSAgICBWRVJJRllfSVNfQVBQUk9YKG0yLmNvbChqKSwgY29sdmVjKTsKKyAgZm9yIChJbmRleCBqID0gMDsgaiA8IGNvbHM7ICsraikgVkVSSUZZX0lTX0FQUFJPWChtMi5jb2woaiksIGNvbHZlYyk7CiAgIG0yLnJvd3dpc2UoKSA9IHJvd3ZlYzsKLSAgZm9yKEluZGV4IGk9MDsgaTxyb3dzOyArK2kpCi0gICAgVkVSSUZZX0lTX0FQUFJPWChtMi5yb3coaSksIHJvd3ZlYyk7CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCByb3dzOyArK2kpIFZFUklGWV9JU19BUFBST1gobTIucm93KGkpLCByb3d2ZWMpOwogCiAgIC8vIHRlc3QgYWRkaXRpb24KICAgbTIgPSBtMTsKQEAgLTE0MSw3ICsxMzIsNiBAQAogICBWRVJJRllfSVNfQVBQUk9YKG0yLCBtMS5yb3d3aXNlKCkgKyByb3d2ZWMpOwogICBWRVJJRllfSVNfQVBQUk9YKG0yLnJvdyhyKSwgbTEucm93KHIpICsgcm93dmVjKTsKIAotCiAgIC8vIHRlc3Qgc3VidHJhY3Rpb24KICAgbTIgPSBtMTsKICAgbTIuY29sd2lzZSgpIC09IGNvbHZlYzsKQEAgLTE1MywyNCArMTQzLDI0IEBACiAgIFZFUklGWV9JU19BUFBST1gobTIsIG0xLnJvd3dpc2UoKSAtIHJvd3ZlYyk7CiAgIFZFUklGWV9JU19BUFBST1gobTIucm93KHIpLCBtMS5yb3cocikgLSByb3d2ZWMpOwogCi0KICAgLy8gLS0tLS0tIHBhcnRpYWwgcmVkdWN0aW9ucyAtLS0tLS0KIAotICAjZGVmaW5lIFRFU1RfUEFSVElBTF9SRURVWF9CQVNJQyhGVU5DLFJPVyxDT0wsUFJFUFJPQ0VTUykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFJPVyA9IG0xIFBSRVBST0NFU1MgLmNvbHdpc2UoKS5GVU5DIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvcihJbmRleCBrPTA7IGs8Y29sczsgKytrKSBWRVJJRllfSVNfQVBQUk9YKFJPVyhrKSwgbTEuY29sKGspIFBSRVBST0NFU1MgLkZVTkMgKTsgXAotICAgIENPTCA9IG0xIFBSRVBST0NFU1MgLnJvd3dpc2UoKS5GVU5DIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvcihJbmRleCBrPTA7IGs8cm93czsgKytrKSBWRVJJRllfSVNfQVBQUk9YKENPTChrKSwgbTEucm93KGspIFBSRVBST0NFU1MgLkZVTkMgKTsgXAorI2RlZmluZSBURVNUX1BBUlRJQUxfUkVEVVhfQkFTSUMoRlVOQywgUk9XLCBDT0wsIFBSRVBST0NFU1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJPVyA9IG0xIFBSRVBST0NFU1MuY29sd2lzZSgpLkZVTkM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoSW5kZXggayA9IDA7IGsgPCBjb2xzOyArK2spIFZFUklGWV9JU19BUFBST1goUk9XKGspLCBtMS5jb2woaykgUFJFUFJPQ0VTUy5GVU5DKTsgXAorICAgIENPTCA9IG0xIFBSRVBST0NFU1Mucm93d2lzZSgpLkZVTkM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoSW5kZXggayA9IDA7IGsgPCByb3dzOyArK2spIFZFUklGWV9JU19BUFBST1goQ09MKGspLCBtMS5yb3coaykgUFJFUFJPQ0VTUy5GVU5DKTsgXAogICB9CiAKLSAgVEVTVF9QQVJUSUFMX1JFRFVYX0JBU0lDKHN1bSgpLCAgICAgICAgcm93dmVjLGNvbHZlYyxFSUdFTl9FTVBUWSk7Ci0gIFRFU1RfUEFSVElBTF9SRURVWF9CQVNJQyhwcm9kKCksICAgICAgIHJvd3ZlYyxjb2x2ZWMsRUlHRU5fRU1QVFkpOwotICBURVNUX1BBUlRJQUxfUkVEVVhfQkFTSUMobWVhbigpLCAgICAgICByb3d2ZWMsY29sdmVjLEVJR0VOX0VNUFRZKTsKLSAgVEVTVF9QQVJUSUFMX1JFRFVYX0JBU0lDKG1pbkNvZWZmKCksICAgcnJyZXMsIHJjcmVzLCAucmVhbCgpKTsKLSAgVEVTVF9QQVJUSUFMX1JFRFVYX0JBU0lDKG1heENvZWZmKCksICAgcnJyZXMsIHJjcmVzLCAucmVhbCgpKTsKLSAgVEVTVF9QQVJUSUFMX1JFRFVYX0JBU0lDKG5vcm0oKSwgICAgICAgcnJyZXMsIHJjcmVzLCBFSUdFTl9FTVBUWSk7Ci0gIFRFU1RfUEFSVElBTF9SRURVWF9CQVNJQyhzcXVhcmVkTm9ybSgpLHJycmVzLCByY3JlcywgRUlHRU5fRU1QVFkpOwotICBURVNUX1BBUlRJQUxfUkVEVVhfQkFTSUMocmVkdXgoaW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyLFNjYWxhcj4oKSkscm93dmVjLGNvbHZlYyxFSUdFTl9FTVBUWSk7CisgIFRFU1RfUEFSVElBTF9SRURVWF9CQVNJQyhzdW0oKSwgcm93dmVjLCBjb2x2ZWMsIEVJR0VOX0VNUFRZKTsKKyAgVEVTVF9QQVJUSUFMX1JFRFVYX0JBU0lDKHByb2QoKSwgcm93dmVjLCBjb2x2ZWMsIEVJR0VOX0VNUFRZKTsKKyAgVEVTVF9QQVJUSUFMX1JFRFVYX0JBU0lDKG1lYW4oKSwgcm93dmVjLCBjb2x2ZWMsIEVJR0VOX0VNUFRZKTsKKyAgVEVTVF9QQVJUSUFMX1JFRFVYX0JBU0lDKG1pbkNvZWZmKCksIHJycmVzLCByY3JlcywgLnJlYWwoKSk7CisgIFRFU1RfUEFSVElBTF9SRURVWF9CQVNJQyhtYXhDb2VmZigpLCBycnJlcywgcmNyZXMsIC5yZWFsKCkpOworICBURVNUX1BBUlRJQUxfUkVEVVhfQkFTSUMobm9ybSgpLCBycnJlcywgcmNyZXMsIEVJR0VOX0VNUFRZKTsKKyAgVEVTVF9QQVJUSUFMX1JFRFVYX0JBU0lDKHNxdWFyZWROb3JtKCksIHJycmVzLCByY3JlcywgRUlHRU5fRU1QVFkpOworICBURVNUX1BBUlRJQUxfUkVEVVhfQkFTSUMocmVkdXgoaW50ZXJuYWw6OnNjYWxhcl9zdW1fb3A8U2NhbGFyLCBTY2FsYXI+KCkpLCByb3d2ZWMsIGNvbHZlYywgRUlHRU5fRU1QVFkpOwogCiAgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2VBYnMoKS5jb2x3aXNlKCkuc3VtKCksIG0xLmNvbHdpc2UoKS50ZW1wbGF0ZSBscE5vcm08MT4oKSk7CiAgIFZFUklGWV9JU19BUFBST1gobTEuY3dpc2VBYnMoKS5yb3d3aXNlKCkuc3VtKCksIG0xLnJvd3dpc2UoKS50ZW1wbGF0ZSBscE5vcm08MT4oKSk7CkBAIC0xOTUsNDQgKzE4NSw0NSBAQAogICBWRVJJRllfSVNfQVBQUk9YKG0yLnJvdyhyKSwgbTEucm93KHIpLm5vcm1hbGl6ZWQoKSk7CiAKICAgLy8gdGVzdCB3aXRoIHBhcnRpYWwgcmVkdWN0aW9uIG9mIHByb2R1Y3RzCi0gIE1hdHJpeDxTY2FsYXIsTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWU+IG0xbTEgPSBtMSAqIG0xLnRyYW5zcG9zZSgpOwotICBWRVJJRllfSVNfQVBQUk9YKCAobTEgKiBtMS50cmFuc3Bvc2UoKSkuY29sd2lzZSgpLnN1bSgpLCBtMW0xLmNvbHdpc2UoKS5zdW0oKSk7Ci0gIE1hdHJpeDxTY2FsYXIsMSxNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gdG1wKHJvd3MpOwotICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCggdG1wID0gKG0xICogbTEudHJhbnNwb3NlKCkpLmNvbHdpc2UoKS5zdW0oKSwgMSk7CisgIE1hdHJpeDxTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gbTFtMSA9IG0xICogbTEudHJhbnNwb3NlKCk7CisgIFZFUklGWV9JU19BUFBST1goKG0xICogbTEudHJhbnNwb3NlKCkpLmNvbHdpc2UoKS5zdW0oKSwgbTFtMS5jb2x3aXNlKCkuc3VtKCkpOworICBNYXRyaXg8U2NhbGFyLCAxLCBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT4gdG1wKHJvd3MpOworICBWRVJJRllfRVZBTFVBVElPTl9DT1VOVCh0bXAgPSAobTEgKiBtMS50cmFuc3Bvc2UoKSkuY29sd2lzZSgpLnN1bSgpLCAxKTsKIAotICBtMiA9IG0xLnJvd3dpc2UoKSAtIChtMS5jb2x3aXNlKCkuc3VtKCkvUmVhbFNjYWxhcihtMS5yb3dzKCkpKS5ldmFsKCk7Ci0gIG0xID0gbTEucm93d2lzZSgpIC0gKG0xLmNvbHdpc2UoKS5zdW0oKS9SZWFsU2NhbGFyKG0xLnJvd3MoKSkpOwotICBWRVJJRllfSVNfQVBQUk9YKCBtMSwgbTIgKTsKLSAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQoIG0yID0gKG0xLnJvd3dpc2UoKSAtIG0xLmNvbHdpc2UoKS5zdW0oKS9SZWFsU2NhbGFyKG0xLnJvd3MoKSkpLCAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUhPTEgPyAxIDogMCkgKTsKKyAgbTIgPSBtMS5yb3d3aXNlKCkgLSAobTEuY29sd2lzZSgpLnN1bSgpIC8gUmVhbFNjYWxhcihtMS5yb3dzKCkpKS5ldmFsKCk7CisgIG0xID0gbTEucm93d2lzZSgpIC0gKG0xLmNvbHdpc2UoKS5zdW0oKSAvIFJlYWxTY2FsYXIobTEucm93cygpKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEsIG0yKTsKKyAgVkVSSUZZX0VWQUxVQVRJT05fQ09VTlQobTIgPSAobTEucm93d2lzZSgpIC0gbTEuY29sd2lzZSgpLnN1bSgpIC8gUmVhbFNjYWxhcihtMS5yb3dzKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lICE9IDEgPyAxIDogMCkpOwogCiAgIC8vIHRlc3QgZW1wdHkgZXhwcmVzc2lvbnMKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS5tYXRyaXgoKS5taWRkbGVDb2xzKDAsMCkucm93d2lzZSgpLnN1bSgpLmV2YWwoKSwgTWF0cml4WDo6WmVybyhyb3dzLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS5tYXRyaXgoKS5taWRkbGVSb3dzKDAsMCkuY29sd2lzZSgpLnN1bSgpLmV2YWwoKSwgTWF0cml4WDo6WmVybygxLGNvbHMpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS5tYXRyaXgoKS5taWRkbGVDb2xzKDAsZml4PDA+KS5yb3d3aXNlKCkuc3VtKCkuZXZhbCgpLCBNYXRyaXhYOjpaZXJvKHJvd3MsMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLm1hdHJpeCgpLm1pZGRsZVJvd3MoMCxmaXg8MD4pLmNvbHdpc2UoKS5zdW0oKS5ldmFsKCksIE1hdHJpeFg6Olplcm8oMSxjb2xzKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEubWF0cml4KCkubWlkZGxlQ29scygwLCAwKS5yb3d3aXNlKCkuc3VtKCkuZXZhbCgpLCBNYXRyaXhYOjpaZXJvKHJvd3MsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5tYXRyaXgoKS5taWRkbGVSb3dzKDAsIDApLmNvbHdpc2UoKS5zdW0oKS5ldmFsKCksIE1hdHJpeFg6Olplcm8oMSwgY29scykpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLm1hdHJpeCgpLm1pZGRsZUNvbHMoMCwgZml4PDA+KS5yb3d3aXNlKCkuc3VtKCkuZXZhbCgpLCBNYXRyaXhYOjpaZXJvKHJvd3MsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5tYXRyaXgoKS5taWRkbGVSb3dzKDAsIGZpeDwwPikuY29sd2lzZSgpLnN1bSgpLmV2YWwoKSwgTWF0cml4WDo6WmVybygxLCBjb2xzKSk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChtMS5tYXRyaXgoKS5taWRkbGVDb2xzKDAsMCkucm93d2lzZSgpLnByb2QoKS5ldmFsKCksIE1hdHJpeFg6Ok9uZXMocm93cywxKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobTEubWF0cml4KCkubWlkZGxlUm93cygwLDApLmNvbHdpc2UoKS5wcm9kKCkuZXZhbCgpLCBNYXRyaXhYOjpPbmVzKDEsY29scykpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLm1hdHJpeCgpLm1pZGRsZUNvbHMoMCxmaXg8MD4pLnJvd3dpc2UoKS5wcm9kKCkuZXZhbCgpLCBNYXRyaXhYOjpPbmVzKHJvd3MsMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLm1hdHJpeCgpLm1pZGRsZVJvd3MoMCxmaXg8MD4pLmNvbHdpc2UoKS5wcm9kKCkuZXZhbCgpLCBNYXRyaXhYOjpPbmVzKDEsY29scykpOwotICBWRVJJRllfSVNfQVBQUk9YKG0xLm1hdHJpeCgpLm1pZGRsZUNvbHMoMCwwKS5yb3d3aXNlKCkuc3F1YXJlZE5vcm0oKS5ldmFsKCksIE1hdHJpeFg6Olplcm8ocm93cywxKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEubWF0cml4KCkubWlkZGxlQ29scygwLCAwKS5yb3d3aXNlKCkucHJvZCgpLmV2YWwoKSwgTWF0cml4WDo6T25lcyhyb3dzLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEubWF0cml4KCkubWlkZGxlUm93cygwLCAwKS5jb2x3aXNlKCkucHJvZCgpLmV2YWwoKSwgTWF0cml4WDo6T25lcygxLCBjb2xzKSk7CisgIFZFUklGWV9JU19BUFBST1gobTEubWF0cml4KCkubWlkZGxlQ29scygwLCBmaXg8MD4pLnJvd3dpc2UoKS5wcm9kKCkuZXZhbCgpLCBNYXRyaXhYOjpPbmVzKHJvd3MsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtMS5tYXRyaXgoKS5taWRkbGVSb3dzKDAsIGZpeDwwPikuY29sd2lzZSgpLnByb2QoKS5ldmFsKCksIE1hdHJpeFg6Ok9uZXMoMSwgY29scykpOworICBWRVJJRllfSVNfQVBQUk9YKG0xLm1hdHJpeCgpLm1pZGRsZUNvbHMoMCwgMCkucm93d2lzZSgpLnNxdWFyZWROb3JtKCkuZXZhbCgpLCBNYXRyaXhYOjpaZXJvKHJvd3MsIDEpKTsKIAotICBWRVJJRllfSVNfRVFVQUwobTEucmVhbCgpLm1pZGRsZVJvd3MoMCwwKS5yb3d3aXNlKCkubWF4Q29lZmYoKS5ldmFsKCkucm93cygpLDApOwotICBWRVJJRllfSVNfRVFVQUwobTEucmVhbCgpLm1pZGRsZUNvbHMoMCwwKS5jb2x3aXNlKCkubWF4Q29lZmYoKS5ldmFsKCkuY29scygpLDApOwotICBWRVJJRllfSVNfRVFVQUwobTEucmVhbCgpLm1pZGRsZVJvd3MoMCxmaXg8MD4pLnJvd3dpc2UoKS5tYXhDb2VmZigpLmV2YWwoKS5yb3dzKCksMCk7Ci0gIFZFUklGWV9JU19FUVVBTChtMS5yZWFsKCkubWlkZGxlQ29scygwLGZpeDwwPikuY29sd2lzZSgpLm1heENvZWZmKCkuZXZhbCgpLmNvbHMoKSwwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG0xLnJlYWwoKS5taWRkbGVSb3dzKDAsIDApLnJvd3dpc2UoKS5tYXhDb2VmZigpLmV2YWwoKS5yb3dzKCksIDApOworICBWRVJJRllfSVNfRVFVQUwobTEucmVhbCgpLm1pZGRsZUNvbHMoMCwgMCkuY29sd2lzZSgpLm1heENvZWZmKCkuZXZhbCgpLmNvbHMoKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTChtMS5yZWFsKCkubWlkZGxlUm93cygwLCBmaXg8MD4pLnJvd3dpc2UoKS5tYXhDb2VmZigpLmV2YWwoKS5yb3dzKCksIDApOworICBWRVJJRllfSVNfRVFVQUwobTEucmVhbCgpLm1pZGRsZUNvbHMoMCwgZml4PDA+KS5jb2x3aXNlKCkubWF4Q29lZmYoKS5ldmFsKCkuY29scygpLCAwKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHZlY3Rvcndpc2VvcCkKLXsKLSAgQ0FMTF9TVUJURVNUXzEoIHZlY3Rvcndpc2VvcF9hcnJheShBcnJheTIyY2QoKSkgKTsKLSAgQ0FMTF9TVUJURVNUXzIoIHZlY3Rvcndpc2VvcF9hcnJheShBcnJheTxkb3VibGUsIDMsIDI+KCkpICk7Ci0gIENBTExfU1VCVEVTVF8zKCB2ZWN0b3J3aXNlb3BfYXJyYXkoQXJyYXlYWGYoMywgNCkpICk7Ci0gIENBTExfU1VCVEVTVF80KCB2ZWN0b3J3aXNlb3BfbWF0cml4KE1hdHJpeDRjZigpKSApOwotICBDQUxMX1NVQlRFU1RfNSggdmVjdG9yd2lzZW9wX21hdHJpeChNYXRyaXg0ZigpKSApOwotICBDQUxMX1NVQlRFU1RfNSggdmVjdG9yd2lzZW9wX21hdHJpeChWZWN0b3I0ZigpKSApOwotICBDQUxMX1NVQlRFU1RfNSggdmVjdG9yd2lzZW9wX21hdHJpeChNYXRyaXg8ZmxvYXQsNCw1PigpKSApOwotICBDQUxMX1NVQlRFU1RfNiggdmVjdG9yd2lzZW9wX21hdHJpeChNYXRyaXhYZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsRUlHRU5fVEVTVF9NQVhfU0laRSkpKSApOwotICBDQUxMX1NVQlRFU1RfNyggdmVjdG9yd2lzZW9wX21hdHJpeChWZWN0b3JYZChpbnRlcm5hbDo6cmFuZG9tPGludD4oMSxFSUdFTl9URVNUX01BWF9TSVpFKSkpICk7Ci0gIENBTExfU1VCVEVTVF83KCB2ZWN0b3J3aXNlb3BfbWF0cml4KFJvd1ZlY3RvclhkKGludGVybmFsOjpyYW5kb208aW50PigxLEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVCh2ZWN0b3J3aXNlb3ApIHsKKyAgQ0FMTF9TVUJURVNUXzEodmVjdG9yd2lzZW9wX2FycmF5KEFycmF5MjJjZCgpKSk7CisgIENBTExfU1VCVEVTVF8yKHZlY3Rvcndpc2VvcF9hcnJheShBcnJheTxkb3VibGUsIDMsIDI+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzModmVjdG9yd2lzZW9wX2FycmF5KEFycmF5WFhmKDMsIDQpKSk7CisgIENBTExfU1VCVEVTVF80KHZlY3Rvcndpc2VvcF9tYXRyaXgoTWF0cml4NGNmKCkpKTsKKyAgQ0FMTF9TVUJURVNUXzUodmVjdG9yd2lzZW9wX21hdHJpeChNYXRyaXg0ZigpKSk7CisgIENBTExfU1VCVEVTVF81KHZlY3Rvcndpc2VvcF9tYXRyaXgoVmVjdG9yNGYoKSkpOworICBDQUxMX1NVQlRFU1RfNSh2ZWN0b3J3aXNlb3BfbWF0cml4KE1hdHJpeDxmbG9hdCwgNCwgNT4oKSkpOworICBDQUxMX1NVQlRFU1RfNih2ZWN0b3J3aXNlb3BfbWF0cml4KAorICAgICAgTWF0cml4WGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgRUlHRU5fVEVTVF9NQVhfU0laRSkpKSk7CisgIENBTExfU1VCVEVTVF83KHZlY3Rvcndpc2VvcF9tYXRyaXgoVmVjdG9yWGQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIEVJR0VOX1RFU1RfTUFYX1NJWkUpKSkpOworICBDQUxMX1NVQlRFU1RfNyh2ZWN0b3J3aXNlb3BfbWF0cml4KFJvd1ZlY3RvclhkKGludGVybmFsOjpyYW5kb208aW50PigxLCBFSUdFTl9URVNUX01BWF9TSVpFKSkpKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdmlzaXRvci5jcHAgYi90ZXN0L3Zpc2l0b3IuY3BwCmluZGV4IGNhOTdjNmYuLmEzN2IzNTggMTAwNjQ0Ci0tLSBhL3Rlc3QvdmlzaXRvci5jcHAKKysrIGIvdGVzdC92aXNpdG9yLmNwcApAQCAtOSw4ICs5LDggQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4gdm9pZCBtYXRyaXhWaXNpdG9yKGNvbnN0IE1hdHJpeFR5cGUmIHApCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgbWF0cml4VmlzaXRvcihjb25zdCBNYXRyaXhUeXBlJiBwKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKIAogICBJbmRleCByb3dzID0gcC5yb3dzKCk7CkBAIC0xOSwzMyArMTksMzAgQEAKICAgLy8gY29uc3RydWN0IGEgcmFuZG9tIG1hdHJpeCB3aGVyZSBhbGwgY29lZmZpY2llbnRzIGFyZSBkaWZmZXJlbnQKICAgTWF0cml4VHlwZSBtOwogICBtID0gTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOwotICBmb3IoSW5kZXggaSA9IDA7IGkgPCBtLnNpemUoKTsgaSsrKQotICAgIGZvcihJbmRleCBpMiA9IDA7IGkyIDwgaTsgaTIrKykKLSAgICAgIHdoaWxlKG51bWV4dDo6ZXF1YWxfc3RyaWN0KG0oaSksIG0oaTIpKSkgLy8geWVzLCBzdHJpY3QgZXF1YWxpdHkKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IG0uc2l6ZSgpOyBpKyspCisgICAgZm9yIChJbmRleCBpMiA9IDA7IGkyIDwgaTsgaTIrKykKKyAgICAgIHdoaWxlIChudW1leHQ6OmVxdWFsX3N0cmljdChtKGkpLCBtKGkyKSkpICAvLyB5ZXMsIHN0cmljdCBlcXVhbGl0eQogICAgICAgICBtKGkpID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7Ci0gIAorCiAgIFNjYWxhciBtaW5jID0gU2NhbGFyKDEwMDApLCBtYXhjID0gU2NhbGFyKC0xMDAwKTsKLSAgSW5kZXggbWlucm93PTAsbWluY29sPTAsbWF4cm93PTAsbWF4Y29sPTA7Ci0gIGZvcihJbmRleCBqID0gMDsgaiA8IGNvbHM7IGorKykKLSAgZm9yKEluZGV4IGkgPSAwOyBpIDwgcm93czsgaSsrKQotICB7Ci0gICAgaWYobShpLGopIDwgbWluYykKLSAgICB7Ci0gICAgICBtaW5jID0gbShpLGopOwotICAgICAgbWlucm93ID0gaTsKLSAgICAgIG1pbmNvbCA9IGo7CisgIEluZGV4IG1pbnJvdyA9IDAsIG1pbmNvbCA9IDAsIG1heHJvdyA9IDAsIG1heGNvbCA9IDA7CisgIGZvciAoSW5kZXggaiA9IDA7IGogPCBjb2xzOyBqKyspCisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IHJvd3M7IGkrKykgeworICAgICAgaWYgKG0oaSwgaikgPCBtaW5jKSB7CisgICAgICAgIG1pbmMgPSBtKGksIGopOworICAgICAgICBtaW5yb3cgPSBpOworICAgICAgICBtaW5jb2wgPSBqOworICAgICAgfQorICAgICAgaWYgKG0oaSwgaikgPiBtYXhjKSB7CisgICAgICAgIG1heGMgPSBtKGksIGopOworICAgICAgICBtYXhyb3cgPSBpOworICAgICAgICBtYXhjb2wgPSBqOworICAgICAgfQogICAgIH0KLSAgICBpZihtKGksaikgPiBtYXhjKQotICAgIHsKLSAgICAgIG1heGMgPSBtKGksaik7Ci0gICAgICBtYXhyb3cgPSBpOwotICAgICAgbWF4Y29sID0gajsKLSAgICB9Ci0gIH0KICAgSW5kZXggZWlnZW5fbWlucm93LCBlaWdlbl9taW5jb2wsIGVpZ2VuX21heHJvdywgZWlnZW5fbWF4Y29sOwogICBTY2FsYXIgZWlnZW5fbWluYywgZWlnZW5fbWF4YzsKLSAgZWlnZW5fbWluYyA9IG0ubWluQ29lZmYoJmVpZ2VuX21pbnJvdywmZWlnZW5fbWluY29sKTsKLSAgZWlnZW5fbWF4YyA9IG0ubWF4Q29lZmYoJmVpZ2VuX21heHJvdywmZWlnZW5fbWF4Y29sKTsKKyAgZWlnZW5fbWluYyA9IG0ubWluQ29lZmYoJmVpZ2VuX21pbnJvdywgJmVpZ2VuX21pbmNvbCk7CisgIGVpZ2VuX21heGMgPSBtLm1heENvZWZmKCZlaWdlbl9tYXhyb3csICZlaWdlbl9tYXhjb2wpOwogICBWRVJJRlkobWlucm93ID09IGVpZ2VuX21pbnJvdyk7CiAgIFZFUklGWShtYXhyb3cgPT0gZWlnZW5fbWF4cm93KTsKICAgVkVSSUZZKG1pbmNvbCA9PSBlaWdlbl9taW5jb2wpOwpAQCAtNTUsOSArNTIsOSBAQAogICBWRVJJRllfSVNfQVBQUk9YKG1pbmMsIG0ubWluQ29lZmYoKSk7CiAgIFZFUklGWV9JU19BUFBST1gobWF4YywgbS5tYXhDb2VmZigpKTsKIAotICBlaWdlbl9tYXhjID0gKG0uYWRqb2ludCgpKm0pLm1heENvZWZmKCZlaWdlbl9tYXhyb3csJmVpZ2VuX21heGNvbCk7Ci0gIEluZGV4IG1heHJvdzI9MCxtYXhjb2wyPTA7Ci0gIGVpZ2VuX21heGMgPSAobS5hZGpvaW50KCkqbSkuZXZhbCgpLm1heENvZWZmKCZtYXhyb3cyLCZtYXhjb2wyKTsKKyAgZWlnZW5fbWF4YyA9IChtLmFkam9pbnQoKSAqIG0pLm1heENvZWZmKCZlaWdlbl9tYXhyb3csICZlaWdlbl9tYXhjb2wpOworICBJbmRleCBtYXhyb3cyID0gMCwgbWF4Y29sMiA9IDA7CisgIGVpZ2VuX21heGMgPSAobS5hZGpvaW50KCkgKiBtKS5ldmFsKCkubWF4Q29lZmYoJm1heHJvdzIsICZtYXhjb2wyKTsKICAgVkVSSUZZKG1heHJvdzIgPT0gZWlnZW5fbWF4cm93KTsKICAgVkVSSUZZKG1heGNvbDIgPT0gZWlnZW5fbWF4Y29sKTsKIApAQCAtNjYsOSArNjMsOCBAQAogICAgIGJvb2wgc3RvcCA9IGZhbHNlOwogICAgIGZvciAoSW5kZXggaiA9IDA7IGogPCBjb2xzICYmICFzdG9wOyArK2opIHsKICAgICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCByb3dzICYmICFzdG9wOyArK2kpIHsKLSAgICAgICAgaWYgKCEoaiA9PSBtaW5jb2wgJiYgaSA9PSBtaW5yb3cpICYmCi0gICAgICAgICAgICAhKGogPT0gbWF4Y29sICYmIGkgPT0gbWF4cm93KSkgewotICAgICAgICAgIG0oaSxqKSA9IE51bVRyYWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKKyAgICAgICAgaWYgKCEoaiA9PSBtaW5jb2wgJiYgaSA9PSBtaW5yb3cpICYmICEoaiA9PSBtYXhjb2wgJiYgaSA9PSBtYXhyb3cpKSB7CisgICAgICAgICAgbShpLCBqKSA9IE51bVRyYWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKICAgICAgICAgICBzdG9wID0gdHJ1ZTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTI0LDggKzEyMCw4IEBACiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yVHlwZT4gdm9pZCB2ZWN0b3JWaXNpdG9yKGNvbnN0IFZlY3RvclR5cGUmIHcpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVHlwZT4KK3ZvaWQgdmVjdG9yVmlzaXRvcihjb25zdCBWZWN0b3JUeXBlJiB3KSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yVHlwZTo6U2NhbGFyIFNjYWxhcjsKIAogICBJbmRleCBzaXplID0gdy5zaXplKCk7CkBAIC0xMzMsMjIgKzEyOSwxOSBAQAogICAvLyBjb25zdHJ1Y3QgYSByYW5kb20gdmVjdG9yIHdoZXJlIGFsbCBjb2VmZmljaWVudHMgYXJlIGRpZmZlcmVudAogICBWZWN0b3JUeXBlIHY7CiAgIHYgPSBWZWN0b3JUeXBlOjpSYW5kb20oc2l6ZSk7Ci0gIGZvcihJbmRleCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICBmb3IoSW5kZXggaTIgPSAwOyBpMiA8IGk7IGkyKyspCi0gICAgICB3aGlsZSh2KGkpID09IHYoaTIpKSAvLyB5ZXMsID09CisgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgZm9yIChJbmRleCBpMiA9IDA7IGkyIDwgaTsgaTIrKykKKyAgICAgIHdoaWxlICh2KGkpID09IHYoaTIpKSAgLy8geWVzLCA9PQogICAgICAgICB2KGkpID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7Ci0gIAorCiAgIFNjYWxhciBtaW5jID0gdigwKSwgbWF4YyA9IHYoMCk7Ci0gIEluZGV4IG1pbmlkeD0wLCBtYXhpZHg9MDsKLSAgZm9yKEluZGV4IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICB7Ci0gICAgaWYodihpKSA8IG1pbmMpCi0gICAgeworICBJbmRleCBtaW5pZHggPSAwLCBtYXhpZHggPSAwOworICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYgKHYoaSkgPCBtaW5jKSB7CiAgICAgICBtaW5jID0gdihpKTsKICAgICAgIG1pbmlkeCA9IGk7CiAgICAgfQotICAgIGlmKHYoaSkgPiBtYXhjKQotICAgIHsKKyAgICBpZiAodihpKSA+IG1heGMpIHsKICAgICAgIG1heGMgPSB2KGkpOwogICAgICAgbWF4aWR4ID0gaTsKICAgICB9CkBAIC0xNjMsOCArMTU2LDggQEAKICAgVkVSSUZZX0lTX0FQUFJPWChtYXhjLCBlaWdlbl9tYXhjKTsKICAgVkVSSUZZX0lTX0FQUFJPWChtaW5jLCB2Lm1pbkNvZWZmKCkpOwogICBWRVJJRllfSVNfQVBQUk9YKG1heGMsIHYubWF4Q29lZmYoKSk7Ci0gIAotICBJbmRleCBpZHgwID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCxzaXplLTEpOworCisgIEluZGV4IGlkeDAgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBzaXplIC0gMSk7CiAgIEluZGV4IGlkeDEgPSBlaWdlbl9taW5pZHg7CiAgIEluZGV4IGlkeDIgPSBlaWdlbl9tYXhpZHg7CiAgIFZlY3RvclR5cGUgdjEodiksIHYyKHYpOwpAQCAtMTcyLDggKzE2NSw4IEBACiAgIHYyKGlkeDApID0gdjIoaWR4Mik7CiAgIHYxLm1pbkNvZWZmKCZlaWdlbl9taW5pZHgpOwogICB2Mi5tYXhDb2VmZigmZWlnZW5fbWF4aWR4KTsKLSAgVkVSSUZZKGVpZ2VuX21pbmlkeCA9PSAoc3RkOjptaW4pKGlkeDAsaWR4MSkpOwotICBWRVJJRlkoZWlnZW5fbWF4aWR4ID09IChzdGQ6Om1pbikoaWR4MCxpZHgyKSk7CisgIFZFUklGWShlaWdlbl9taW5pZHggPT0gKHN0ZDo6bWluKShpZHgwLCBpZHgxKSk7CisgIFZFUklGWShlaWdlbl9tYXhpZHggPT0gKHN0ZDo6bWluKShpZHgwLCBpZHgyKSk7CiAKICAgaWYgKCFOdW1UcmFpdHM8U2NhbGFyPjo6SXNJbnRlZ2VyICYmIHNpemUgPiAyKSB7CiAgICAgLy8gVGVzdCBOYU4gcHJvcGFnYXRpb24gYnkgcmVwbGFjaW5nIGFuIGVsZW1lbnQgd2l0aCBOYU4uCkBAIC0yMzYsOCArMjI5LDggQEAKIG5hbWVzcGFjZSBFaWdlbiB7CiBuYW1lc3BhY2UgaW50ZXJuYWwgewogCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIFZlY3Rvcml6YWJsZT4KLXN0cnVjdCBmdW5jdG9yX3RyYWl0czxUcmFja2VkVmlzaXRvcjxULCBWZWN0b3JpemFibGU+ID4gewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGJvb2wgVmVjdG9yaXphYmxlPgorc3RydWN0IGZ1bmN0b3JfdHJhaXRzPFRyYWNrZWRWaXNpdG9yPFQsIFZlY3Rvcml6YWJsZT4+IHsKICAgZW51bSB7IFBhY2tldEFjY2VzcyA9IFZlY3Rvcml6YWJsZSwgTGluZWFyQWNjZXNzID0gZmFsc2UsIENvc3QgPSAxIH07CiB9OwogCkBAIC0yNzEsNyArMjY0LDYgQEAKIH0KIAogdm9pZCBjaGVja09wdGltYWxUcmF2ZXJzYWwoKSB7Ci0gICAgCiAgIHVzaW5nIFNjYWxhciA9IGZsb2F0OwogICBjb25zdGV4cHIgaW50IFBhY2tldFNpemUgPSBFaWdlbjo6aW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6c2l6ZTsKICAgLy8gdXNlIHNpemVzIHRoYXQgbWl4IHZlY3RvciBhbmQgc2NhbGFyIG9wcwpAQCAtMjg2LDcgKzI3OCw3IEBACiAgIHVzaW5nIER5bmFtaWNSb3dNYWpvciA9IE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPjsKIAogICAvLyBTY2FsYXItb25seSB2aXNpdG9ycwotICBjaGVja09wdGltYWxUcmF2ZXJzYWxfaW1wbDxVbnJvbGxDb2xNYWpvciwgZmFsc2U+KFVucm9sbENvbE1ham9yKFJvd3MsQ29scykpOworICBjaGVja09wdGltYWxUcmF2ZXJzYWxfaW1wbDxVbnJvbGxDb2xNYWpvciwgZmFsc2U+KFVucm9sbENvbE1ham9yKFJvd3MsIENvbHMpKTsKICAgY2hlY2tPcHRpbWFsVHJhdmVyc2FsX2ltcGw8VW5yb2xsUm93TWFqb3IsIGZhbHNlPihVbnJvbGxSb3dNYWpvcihSb3dzLCBDb2xzKSk7CiAgIGNoZWNrT3B0aW1hbFRyYXZlcnNhbF9pbXBsPER5bmFtaWNDb2xNYWpvciwgZmFsc2U+KER5bmFtaWNDb2xNYWpvcihyb3dzLCBjb2xzKSk7CiAgIGNoZWNrT3B0aW1hbFRyYXZlcnNhbF9pbXBsPER5bmFtaWNSb3dNYWpvciwgZmFsc2U+KER5bmFtaWNSb3dNYWpvcihyb3dzLCBjb2xzKSk7CkBAIC0yOTgsMjIgKzI5MCwyMSBAQAogICBjaGVja09wdGltYWxUcmF2ZXJzYWxfaW1wbDxEeW5hbWljUm93TWFqb3IsIHRydWU+KER5bmFtaWNSb3dNYWpvcihyb3dzLCBjb2xzKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVCh2aXNpdG9yKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF8xKCBtYXRyaXhWaXNpdG9yKE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggbWF0cml4VmlzaXRvcihNYXRyaXgyZigpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCBtYXRyaXhWaXNpdG9yKE1hdHJpeDRkKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIG1hdHJpeFZpc2l0b3IoTWF0cml4WGQoOCwgMTIpKSApOwotICAgIENBTExfU1VCVEVTVF81KCBtYXRyaXhWaXNpdG9yKE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljLFJvd01ham9yPigyMCwgMjApKSApOwotICAgIENBTExfU1VCVEVTVF82KCBtYXRyaXhWaXNpdG9yKE1hdHJpeFhpKDgsIDEyKSkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVCh2aXNpdG9yKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKG1hdHJpeFZpc2l0b3IoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIobWF0cml4VmlzaXRvcihNYXRyaXgyZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMobWF0cml4VmlzaXRvcihNYXRyaXg0ZCgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQobWF0cml4VmlzaXRvcihNYXRyaXhYZCg4LCAxMikpKTsKKyAgICBDQUxMX1NVQlRFU1RfNShtYXRyaXhWaXNpdG9yKE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPigyMCwgMjApKSk7CisgICAgQ0FMTF9TVUJURVNUXzYobWF0cml4VmlzaXRvcihNYXRyaXhYaSg4LCAxMikpKTsKICAgfQotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVF83KCB2ZWN0b3JWaXNpdG9yKFZlY3RvcjRmKCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzcoIHZlY3RvclZpc2l0b3IoTWF0cml4PGludCwxMiwxPigpKSApOwotICAgIENBTExfU1VCVEVTVF84KCB2ZWN0b3JWaXNpdG9yKFZlY3RvclhkKDEwKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfOSggdmVjdG9yVmlzaXRvcihSb3dWZWN0b3JYZCgxMCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEwKCB2ZWN0b3JWaXNpdG9yKFZlY3RvclhmKDMzKSkgKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzcodmVjdG9yVmlzaXRvcihWZWN0b3I0ZigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzcodmVjdG9yVmlzaXRvcihNYXRyaXg8aW50LCAxMiwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF84KHZlY3RvclZpc2l0b3IoVmVjdG9yWGQoMTApKSk7CisgICAgQ0FMTF9TVUJURVNUXzkodmVjdG9yVmlzaXRvcihSb3dWZWN0b3JYZCgxMCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTAodmVjdG9yVmlzaXRvcihWZWN0b3JYZigzMykpKTsKICAgfQogICBDQUxMX1NVQlRFU1RfMTEoY2hlY2tPcHRpbWFsVHJhdmVyc2FsKCkpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC96ZXJvc2l6ZWQuY3BwIGIvdGVzdC96ZXJvc2l6ZWQuY3BwCmluZGV4IDg2YWE1ZWIuLjcwMDEzMjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvemVyb3NpemVkLmNwcAorKysgYi90ZXN0L3plcm9zaXplZC5jcHAKQEAgLTksODkgKzksODMgQEAKIAogI2luY2x1ZGUgIm1haW4uaCIKIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPiB2b2lkIHplcm9SZWR1Y3Rpb24oY29uc3QgTWF0cml4VHlwZSYgbSkgewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHplcm9SZWR1Y3Rpb24oY29uc3QgTWF0cml4VHlwZSYgbSkgewogICAvLyBSZWR1Y3Rpb25zIHRoYXQgbXVzdCBob2xkIGZvciB6ZXJvIHNpemVkIG9iamVjdHMKICAgVkVSSUZZKG0uYWxsKCkpOwogICBWRVJJRlkoIW0uYW55KCkpOwotICBWRVJJRlkobS5wcm9kKCk9PTEpOwotICBWRVJJRlkobS5zdW0oKT09MCk7Ci0gIFZFUklGWShtLm5vcm0oKT09MCk7Ci0gIFZFUklGWShtLnNxdWFyZWROb3JtKCk9PTApOwotICBWRVJJRlkobS5jb3VudCgpPT0wKTsKKyAgVkVSSUZZKG0ucHJvZCgpID09IDEpOworICBWRVJJRlkobS5zdW0oKSA9PSAwKTsKKyAgVkVSSUZZKG0ubm9ybSgpID09IDApOworICBWRVJJRlkobS5zcXVhcmVkTm9ybSgpID09IDApOworICBWRVJJRlkobS5jb3VudCgpID09IDApOwogICBWRVJJRlkobS5hbGxGaW5pdGUoKSk7CiAgIFZFUklGWSghbS5oYXNOYU4oKSk7Ci0gIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBtLm1pbkNvZWZmKCkgKTsKLSAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0ubWF4Q29lZmYoKSApOwotICBJbmRleCBpLGo7Ci0gIFZFUklGWV9SQUlTRVNfQVNTRVJUKCBtLm1pbkNvZWZmKCZpLCZqKSApOwotICBWRVJJRllfUkFJU0VTX0FTU0VSVCggbS5tYXhDb2VmZigmaSwmaikgKTsKLSAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0ucmVzaGFwZWQoKS5taW5Db2VmZigmaSkgKTsKLSAgVkVSSUZZX1JBSVNFU19BU1NFUlQoIG0ucmVzaGFwZWQoKS5tYXhDb2VmZigmaSkgKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobS5taW5Db2VmZigpKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobS5tYXhDb2VmZigpKTsKKyAgSW5kZXggaSwgajsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobS5taW5Db2VmZigmaSwgJmopKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobS5tYXhDb2VmZigmaSwgJmopKTsKKyAgVkVSSUZZX1JBSVNFU19BU1NFUlQobS5yZXNoYXBlZCgpLm1pbkNvZWZmKCZpKSk7CisgIFZFUklGWV9SQUlTRVNfQVNTRVJUKG0ucmVzaGFwZWQoKS5tYXhDb2VmZigmaSkpOwogfQogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+IHZvaWQgemVyb1NpemVkTWF0cml4KCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB6ZXJvU2l6ZWRNYXRyaXgoKSB7CiAgIE1hdHJpeFR5cGUgdDE7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKIAotICBpZiAoTWF0cml4VHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyB8fCBNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSA9PSAwKQotICB7CisgIGlmIChNYXRyaXhUeXBlOjpTaXplQXRDb21waWxlVGltZSA9PSBEeW5hbWljIHx8IE1hdHJpeFR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IDApIHsKICAgICB6ZXJvUmVkdWN0aW9uKHQxKTsKLSAgICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykKLSAgICAgIFZFUklGWSh0MS5yb3dzKCkgPT0gMCk7Ci0gICAgaWYgKE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMpCi0gICAgICBWRVJJRlkodDEuY29scygpID09IDApOworICAgIGlmIChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSBWRVJJRlkodDEucm93cygpID09IDApOworICAgIGlmIChNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSBWRVJJRlkodDEuY29scygpID09IDApOwogCi0gICAgaWYgKE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lID09IER5bmFtaWMgJiYgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykKLSAgICB7Ci0KKyAgICBpZiAoTWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYyAmJiBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSB7CiAgICAgICBNYXRyaXhUeXBlIHQyKDAsIDApOwogICAgICAgVkVSSUZZKHQyLnJvd3MoKSA9PSAwKTsKICAgICAgIFZFUklGWSh0Mi5jb2xzKCkgPT0gMCk7CiAKICAgICAgIHplcm9SZWR1Y3Rpb24odDIpOwotICAgICAgVkVSSUZZKHQxPT10Mik7CisgICAgICBWRVJJRlkodDEgPT0gdDIpOwogICAgIH0KICAgfQogCi0gIGlmKE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lIT0wICYmIE1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lIT0wKQotICB7Ci0gICAgSW5kZXggcm93cyA9IE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljID8gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwxMCkgOiBJbmRleChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSk7Ci0gICAgSW5kZXggY29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljID8gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwxMCkgOiBJbmRleChNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSk7Ci0gICAgTWF0cml4VHlwZSBtKHJvd3MsY29scyk7Ci0gICAgemVyb1JlZHVjdGlvbihtLnRlbXBsYXRlIGJsb2NrPDAsTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+KDAsMCwwLGNvbHMpKTsKLSAgICB6ZXJvUmVkdWN0aW9uKG0udGVtcGxhdGUgYmxvY2s8TWF0cml4VHlwZTo6Um93c0F0Q29tcGlsZVRpbWUsMD4oMCwwLHJvd3MsMCkpOwotICAgIHplcm9SZWR1Y3Rpb24obS50ZW1wbGF0ZSBibG9jazwwLDE+KDAsMCkpOwotICAgIHplcm9SZWR1Y3Rpb24obS50ZW1wbGF0ZSBibG9jazwxLDA+KDAsMCkpOwotICAgIE1hdHJpeDxTY2FsYXIsRHluYW1pYyxEeW5hbWljPiBwcm9kID0gbS50ZW1wbGF0ZSBibG9jazxNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSwwPigwLDAscm93cywwKSAqIG0udGVtcGxhdGUgYmxvY2s8MCxNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT4oMCwwLDAsY29scyk7Ci0gICAgVkVSSUZZKHByb2Qucm93cygpPT1yb3dzICYmIHByb2QuY29scygpPT1jb2xzKTsKKyAgaWYgKE1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lICE9IDAgJiYgTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUgIT0gMCkgeworICAgIEluZGV4IHJvd3MgPSBNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljID8gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwgMTApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJbmRleChNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSk7CisgICAgSW5kZXggY29scyA9IE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lID09IER5bmFtaWMgPyBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEluZGV4KE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lKTsKKyAgICBNYXRyaXhUeXBlIG0ocm93cywgY29scyk7CisgICAgemVyb1JlZHVjdGlvbihtLnRlbXBsYXRlIGJsb2NrPDAsIE1hdHJpeFR5cGU6OkNvbHNBdENvbXBpbGVUaW1lPigwLCAwLCAwLCBjb2xzKSk7CisgICAgemVyb1JlZHVjdGlvbihtLnRlbXBsYXRlIGJsb2NrPE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAwPigwLCAwLCByb3dzLCAwKSk7CisgICAgemVyb1JlZHVjdGlvbihtLnRlbXBsYXRlIGJsb2NrPDAsIDE+KDAsIDApKTsKKyAgICB6ZXJvUmVkdWN0aW9uKG0udGVtcGxhdGUgYmxvY2s8MSwgMD4oMCwgMCkpOworICAgIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIER5bmFtaWM+IHByb2QgPSBtLnRlbXBsYXRlIGJsb2NrPE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAwPigwLCAwLCByb3dzLCAwKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0udGVtcGxhdGUgYmxvY2s8MCwgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWU+KDAsIDAsIDAsIGNvbHMpOworICAgIFZFUklGWShwcm9kLnJvd3MoKSA9PSByb3dzICYmIHByb2QuY29scygpID09IGNvbHMpOwogICAgIFZFUklGWShwcm9kLmlzWmVybygpKTsKLSAgICBwcm9kID0gbS50ZW1wbGF0ZSBibG9jazwxLDA+KDAsMCkgKiBtLnRlbXBsYXRlIGJsb2NrPDAsMT4oMCwwKTsKLSAgICBWRVJJRlkocHJvZC5zaXplKCk9PTEpOworICAgIHByb2QgPSBtLnRlbXBsYXRlIGJsb2NrPDEsIDA+KDAsIDApICogbS50ZW1wbGF0ZSBibG9jazwwLCAxPigwLCAwKTsKKyAgICBWRVJJRlkocHJvZC5zaXplKCkgPT0gMSk7CiAgICAgVkVSSUZZKHByb2QuaXNaZXJvKCkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFZlY3RvclR5cGU+IHZvaWQgemVyb1NpemVkVmVjdG9yKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3JUeXBlPgordm9pZCB6ZXJvU2l6ZWRWZWN0b3IoKSB7CiAgIFZlY3RvclR5cGUgdDE7CiAKLSAgaWYgKFZlY3RvclR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMgfHwgVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWU9PTApCi0gIHsKKyAgaWYgKFZlY3RvclR5cGU6OlNpemVBdENvbXBpbGVUaW1lID09IER5bmFtaWMgfHwgVmVjdG9yVHlwZTo6U2l6ZUF0Q29tcGlsZVRpbWUgPT0gMCkgewogICAgIHplcm9SZWR1Y3Rpb24odDEpOwogICAgIFZFUklGWSh0MS5zaXplKCkgPT0gMCk7Ci0gICAgVmVjdG9yVHlwZSB0MihEZW5zZUluZGV4KDApKTsgLy8gRGVuc2VJbmRleCBkaXNhbWJpZ3VhdGVzIHdpdGggMC10aGUtbnVsbC1wb2ludGVyIChlcnJvciB3aXRoIGdjYyA0LjQgYW5kIE1TVkM4KQorICAgIFZlY3RvclR5cGUgdDIoRGVuc2VJbmRleCgwKSk7ICAvLyBEZW5zZUluZGV4IGRpc2FtYmlndWF0ZXMgd2l0aCAwLXRoZS1udWxsLXBvaW50ZXIgKGVycm9yIHdpdGggZ2NjIDQuNCBhbmQgTVNWQzgpCiAgICAgVkVSSUZZKHQyLnNpemUoKSA9PSAwKTsKICAgICB6ZXJvUmVkdWN0aW9uKHQyKTsKIAotICAgIFZFUklGWSh0MT09dDIpOworICAgIFZFUklGWSh0MSA9PSB0Mik7CiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHplcm9zaXplZCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVCh6ZXJvc2l6ZWQpIHsKICAgemVyb1NpemVkTWF0cml4PE1hdHJpeDJkPigpOwogICB6ZXJvU2l6ZWRNYXRyaXg8TWF0cml4M2k+KCk7CiAgIHplcm9TaXplZE1hdHJpeDxNYXRyaXg8ZmxvYXQsIDIsIER5bmFtaWM+ID4oKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2JlbmNoL2JlbmNoX3N2ZC5jcHAgYi91bnN1cHBvcnRlZC9iZW5jaC9iZW5jaF9zdmQuY3BwCmluZGV4IGU3MDI4YTIuLjQwYTk4OWIgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL2JlbmNoL2JlbmNoX3N2ZC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvYmVuY2gvYmVuY2hfc3ZkLmNwcApAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGJlbmNoL0JlbmNoVGltZXIuaD4KICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9TVkQ+CiAKLQogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApAQCAtMzAsOTQgKzI5LDgzIEBACiAjZGVmaW5lIE5VTUJFUl9TQU1QTEUgMgogI2VuZGlmCiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIGJlbmNoX3N2ZChjb25zdCBNYXRyaXhUeXBlJiBhID0gTWF0cml4VHlwZSgpKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGJlbmNoX3N2ZChjb25zdCBNYXRyaXhUeXBlJiBhID0gTWF0cml4VHlwZSgpKSB7CiAgIE1hdHJpeFR5cGUgbSA9IE1hdHJpeFR5cGU6OlJhbmRvbShhLnJvd3MoKSwgYS5jb2xzKCkpOwogICBCZW5jaFRpbWVyIHRpbWVySmFjb2JpOwogICBCZW5jaFRpbWVyIHRpbWVyQkRDOwogICB0aW1lckphY29iaS5yZXNldCgpOwogICB0aW1lckJEQy5yZXNldCgpOwogCi0gIGNvdXQgPDwgIiBPbmx5IGNvbXB1dGUgU2luZ3VsYXIgVmFsdWVzIiA8PGVuZGw7Ci0gIGZvciAoaW50IGs9MTsgazw9TlVNQkVSX1NBTVBMRTsgKytrKQotICB7CisgIGNvdXQgPDwgIiBPbmx5IGNvbXB1dGUgU2luZ3VsYXIgVmFsdWVzIiA8PCBlbmRsOworICBmb3IgKGludCBrID0gMTsgayA8PSBOVU1CRVJfU0FNUExFOyArK2spIHsKICAgICB0aW1lckJEQy5zdGFydCgpOwotICAgIGZvciAoaW50IGk9MDsgaTxSRVBFQVQ7ICsraSkgCi0gICAgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkVQRUFUOyArK2kpIHsKICAgICAgIEJEQ1NWRDxNYXRyaXhUeXBlPiBiZGNfbWF0cml4KG0pOwogICAgIH0KICAgICB0aW1lckJEQy5zdG9wKCk7Ci0gICAgCisKICAgICB0aW1lckphY29iaS5zdGFydCgpOwotICAgIGZvciAoaW50IGk9MDsgaTxSRVBFQVQ7ICsraSkgCi0gICAgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkVQRUFUOyArK2kpIHsKICAgICAgIEphY29iaVNWRDxNYXRyaXhUeXBlPiBqYWNvYmlfbWF0cml4KG0pOwogICAgIH0KICAgICB0aW1lckphY29iaS5zdG9wKCk7CiAKLQogICAgIGNvdXQgPDwgIlNhbXBsZSAiIDw8IGsgPDwgIiA6ICIgPDwgUkVQRUFUIDw8ICIgY29tcHV0YXRpb25zIDogIEphY29iaSA6ICIgPDwgZml4ZWQgPDwgdGltZXJKYWNvYmkudmFsdWUoKSA8PCAicyAiOwotICAgIGNvdXQgPDwgIiB8fCAiIDw8ICIgQkRDIDogIiA8PCB0aW1lckJEQy52YWx1ZSgpIDw8ICJzICIgPDxlbmRsIDw8ZW5kbDsKLSAgICAgIAotICAgIGlmICh0aW1lckJEQy52YWx1ZSgpID49IHRpbWVySmFjb2JpLnZhbHVlKCkpICAKLSAgICAgIGNvdXQgPDwgIktPIDogQkRDIGlzICIgPDwgIHRpbWVySmFjb2JpLnZhbHVlKCkgLyB0aW1lckJEQy52YWx1ZSgpIDw8ICIgIHRpbWVzIGZhc3RlciB0aGFuIEphY29iaSIgPDxlbmRsOwotICAgIGVsc2UgCi0gICAgICBjb3V0IDw8ICJPSyA6IEJEQyBpcyAiIDw8IHRpbWVySmFjb2JpLnZhbHVlKCkgLyB0aW1lckJEQy52YWx1ZSgpIDw8ICIgIHRpbWVzIGZhc3RlciB0aGFuIEphY29iaSIgIDw8ZW5kbDsKLSAgICAgIAorICAgIGNvdXQgPDwgIiB8fCAiCisgICAgICAgICA8PCAiIEJEQyA6ICIgPDwgdGltZXJCREMudmFsdWUoKSA8PCAicyAiIDw8IGVuZGwKKyAgICAgICAgIDw8IGVuZGw7CisKKyAgICBpZiAodGltZXJCREMudmFsdWUoKSA+PSB0aW1lckphY29iaS52YWx1ZSgpKQorICAgICAgY291dCA8PCAiS08gOiBCREMgaXMgIiA8PCB0aW1lckphY29iaS52YWx1ZSgpIC8gdGltZXJCREMudmFsdWUoKSA8PCAiICB0aW1lcyBmYXN0ZXIgdGhhbiBKYWNvYmkiIDw8IGVuZGw7CisgICAgZWxzZQorICAgICAgY291dCA8PCAiT0sgOiBCREMgaXMgIiA8PCB0aW1lckphY29iaS52YWx1ZSgpIC8gdGltZXJCREMudmFsdWUoKSA8PCAiICB0aW1lcyBmYXN0ZXIgdGhhbiBKYWNvYmkiIDw8IGVuZGw7CiAgIH0KLSAgY291dCA8PCAiICAgICAgID09PT09PT09PT09PT09PT09IiA8PGVuZGw7Ci0gIHN0ZDo6Y291dDw8IHN0ZDo6ZW5kbDsKKyAgY291dCA8PCAiICAgICAgID09PT09PT09PT09PT09PT09IiA8PCBlbmRsOworICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICB0aW1lckphY29iaS5yZXNldCgpOwogICB0aW1lckJEQy5yZXNldCgpOwotICBjb3V0IDw8ICIgQ29tcHV0ZXMgcm90YXRpb24gbWF0cml4IiA8PGVuZGw7Ci0gIGZvciAoaW50IGs9MTsgazw9TlVNQkVSX1NBTVBMRTsgKytrKQotICB7CisgIGNvdXQgPDwgIiBDb21wdXRlcyByb3RhdGlvbiBtYXRyaXgiIDw8IGVuZGw7CisgIGZvciAoaW50IGsgPSAxOyBrIDw9IE5VTUJFUl9TQU1QTEU7ICsraykgewogICAgIHRpbWVyQkRDLnN0YXJ0KCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPFJFUEVBVDsgKytpKSAKLSAgICB7Ci0gICAgICBCRENTVkQ8TWF0cml4VHlwZT4gYmRjX21hdHJpeChtLCBDb21wdXRlRnVsbFV8Q29tcHV0ZUZ1bGxWKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFJFUEVBVDsgKytpKSB7CisgICAgICBCRENTVkQ8TWF0cml4VHlwZT4gYmRjX21hdHJpeChtLCBDb21wdXRlRnVsbFUgfCBDb21wdXRlRnVsbFYpOwogICAgIH0KICAgICB0aW1lckJEQy5zdG9wKCk7Ci0gICAgCisKICAgICB0aW1lckphY29iaS5zdGFydCgpOwotICAgIGZvciAoaW50IGk9MDsgaTxSRVBFQVQ7ICsraSkgCi0gICAgewotICAgICAgSmFjb2JpU1ZEPE1hdHJpeFR5cGU+IGphY29iaV9tYXRyaXgobSwgQ29tcHV0ZUZ1bGxVfENvbXB1dGVGdWxsVik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSRVBFQVQ7ICsraSkgeworICAgICAgSmFjb2JpU1ZEPE1hdHJpeFR5cGU+IGphY29iaV9tYXRyaXgobSwgQ29tcHV0ZUZ1bGxVIHwgQ29tcHV0ZUZ1bGxWKTsKICAgICB9CiAgICAgdGltZXJKYWNvYmkuc3RvcCgpOwogCi0KICAgICBjb3V0IDw8ICJTYW1wbGUgIiA8PCBrIDw8ICIgOiAiIDw8IFJFUEVBVCA8PCAiIGNvbXB1dGF0aW9ucyA6ICBKYWNvYmkgOiAiIDw8IGZpeGVkIDw8IHRpbWVySmFjb2JpLnZhbHVlKCkgPDwgInMgIjsKLSAgICBjb3V0IDw8ICIgfHwgIiA8PCAiIEJEQyA6ICIgPDwgdGltZXJCREMudmFsdWUoKSA8PCAicyAiIDw8ZW5kbCA8PGVuZGw7Ci0gICAgICAKLSAgICBpZiAodGltZXJCREMudmFsdWUoKSA+PSB0aW1lckphY29iaS52YWx1ZSgpKSAgCi0gICAgICBjb3V0IDw8ICJLTyA6IEJEQyBpcyAiIDw8ICB0aW1lckphY29iaS52YWx1ZSgpIC8gdGltZXJCREMudmFsdWUoKSA8PCAiICB0aW1lcyBmYXN0ZXIgdGhhbiBKYWNvYmkiIDw8ZW5kbDsKLSAgICBlbHNlIAotICAgICAgY291dCA8PCAiT0sgOiBCREMgaXMgIiA8PCB0aW1lckphY29iaS52YWx1ZSgpIC8gdGltZXJCREMudmFsdWUoKSA8PCAiICB0aW1lcyBmYXN0ZXIgdGhhbiBKYWNvYmkiICA8PGVuZGw7Ci0gICAgICAKKyAgICBjb3V0IDw8ICIgfHwgIgorICAgICAgICAgPDwgIiBCREMgOiAiIDw8IHRpbWVyQkRDLnZhbHVlKCkgPDwgInMgIiA8PCBlbmRsCisgICAgICAgICA8PCBlbmRsOworCisgICAgaWYgKHRpbWVyQkRDLnZhbHVlKCkgPj0gdGltZXJKYWNvYmkudmFsdWUoKSkKKyAgICAgIGNvdXQgPDwgIktPIDogQkRDIGlzICIgPDwgdGltZXJKYWNvYmkudmFsdWUoKSAvIHRpbWVyQkRDLnZhbHVlKCkgPDwgIiAgdGltZXMgZmFzdGVyIHRoYW4gSmFjb2JpIiA8PCBlbmRsOworICAgIGVsc2UKKyAgICAgIGNvdXQgPDwgIk9LIDogQkRDIGlzICIgPDwgdGltZXJKYWNvYmkudmFsdWUoKSAvIHRpbWVyQkRDLnZhbHVlKCkgPDwgIiAgdGltZXMgZmFzdGVyIHRoYW4gSmFjb2JpIiA8PCBlbmRsOwogICB9Ci0gIHN0ZDo6Y291dDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKIH0KIAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogCisgIHN0ZDo6Y291dCA8PCAiT24gYSAoRHluYW1pYywgRHluYW1pYykgKDYsIDYpIE1hdHJpeCIgPDwgc3RkOjplbmRsOworICBiZW5jaF9zdmQ8TWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYz4gPihNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljPig2LCA2KSk7CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCi17Ci0gIHN0ZDo6Y291dDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJPbiBhIChEeW5hbWljLCBEeW5hbWljKSAoMzIsIDMyKSBNYXRyaXgiIDw8IHN0ZDo6ZW5kbDsKKyAgYmVuY2hfc3ZkPE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIER5bmFtaWM+ID4oTWF0cml4PGRvdWJsZSwgRHluYW1pYywgRHluYW1pYz4oMzIsIDMyKSk7CiAKLSAgc3RkOjpjb3V0PDwiT24gYSAoRHluYW1pYywgRHluYW1pYykgKDYsIDYpIE1hdHJpeCIgPDxzdGQ6OmVuZGw7Ci0gIGJlbmNoX3N2ZDxNYXRyaXg8ZG91YmxlLER5bmFtaWMsRHluYW1pYz4gPihNYXRyaXg8ZG91YmxlLER5bmFtaWMsRHluYW1pYz4oNiwgNikpOwotICAKLSAgc3RkOjpjb3V0PDwiT24gYSAoRHluYW1pYywgRHluYW1pYykgKDMyLCAzMikgTWF0cml4IiA8PHN0ZDo6ZW5kbDsKLSAgYmVuY2hfc3ZkPE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljPiA+KE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljPigzMiwgMzIpKTsKKyAgLy8gc3RkOjpjb3V0PDwiT24gYSAoRHluYW1pYywgRHluYW1pYykgKDEyOCwgMTI4KSBNYXRyaXgiIDw8c3RkOjplbmRsOworICAvLyBiZW5jaF9zdmQ8TWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWM+ID4oTWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWM+KDEyOCwgMTI4KSk7CiAKLSAgLy9zdGQ6OmNvdXQ8PCJPbiBhIChEeW5hbWljLCBEeW5hbWljKSAoMTI4LCAxMjgpIE1hdHJpeCIgPDxzdGQ6OmVuZGw7Ci0gIC8vYmVuY2hfc3ZkPE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljPiA+KE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljPigxMjgsIDEyOCkpOworICBzdGQ6OmNvdXQgPDwgIk9uIGEgKER5bmFtaWMsIER5bmFtaWMpICgxNjAsIDE2MCkgTWF0cml4IiA8PCBzdGQ6OmVuZGw7CisgIGJlbmNoX3N2ZDxNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljPiA+KE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIER5bmFtaWM+KDE2MCwgMTYwKSk7CiAKLSAgc3RkOjpjb3V0PDwiT24gYSAoRHluYW1pYywgRHluYW1pYykgKDE2MCwgMTYwKSBNYXRyaXgiIDw8c3RkOjplbmRsOwotICBiZW5jaF9zdmQ8TWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWM+ID4oTWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWM+KDE2MCwgMTYwKSk7Ci0gIAotICBzdGQ6OmNvdXQ8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iPDwgc3RkOjplbmRsOwotICAgICAgICAgICAKKyAgc3RkOjpjb3V0IDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgPDwgc3RkOjplbmRsOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL0JWSF9FeGFtcGxlLmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9CVkhfRXhhbXBsZS5jcHAKaW5kZXggYWZiMGM5NC4uOGMzN2Q3MSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL0JWSF9FeGFtcGxlLmNwcAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvQlZIX0V4YW1wbGUuY3BwCkBAIC02LDI3ICs2LDM4IEBACiB0eXBlZGVmIEFsaWduZWRCb3g8ZG91YmxlLCAyPiBCb3gyZDsKIAogbmFtZXNwYWNlIEVpZ2VuIHsKLSAgQm94MmQgYm91bmRpbmdfYm94KGNvbnN0IFZlY3RvcjJkICZ2KSB7IHJldHVybiBCb3gyZCh2LCB2KTsgfSAvL2NvbXB1dGUgdGhlIGJvdW5kaW5nIGJveCBvZiBhIHNpbmdsZSBwb2ludAotfQorQm94MmQgYm91bmRpbmdfYm94KGNvbnN0IFZlY3RvcjJkICZ2KSB7IHJldHVybiBCb3gyZCh2LCB2KTsgfSAgLy8gY29tcHV0ZSB0aGUgYm91bmRpbmcgYm94IG9mIGEgc2luZ2xlIHBvaW50Cit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KIAotc3RydWN0IFBvaW50UG9pbnRNaW5pbWl6ZXIgLy9ob3cgdG8gY29tcHV0ZSBzcXVhcmVkIGRpc3RhbmNlcyBiZXR3ZWVuIHBvaW50cyBhbmQgcmVjdGFuZ2xlcworc3RydWN0IFBvaW50UG9pbnRNaW5pbWl6ZXIgIC8vIGhvdyB0byBjb21wdXRlIHNxdWFyZWQgZGlzdGFuY2VzIGJldHdlZW4gcG9pbnRzIGFuZCByZWN0YW5nbGVzCiB7CiAgIFBvaW50UG9pbnRNaW5pbWl6ZXIoKSA6IGNhbGxzKDApIHt9CiAgIHR5cGVkZWYgZG91YmxlIFNjYWxhcjsKIAotICBkb3VibGUgbWluaW11bU9uVm9sdW1lVm9sdW1lKGNvbnN0IEJveDJkICZyMSwgY29uc3QgQm94MmQgJnIyKSB7ICsrY2FsbHM7IHJldHVybiByMS5zcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZShyMik7IH0KLSAgZG91YmxlIG1pbmltdW1PblZvbHVtZU9iamVjdChjb25zdCBCb3gyZCAmciwgY29uc3QgVmVjdG9yMmQgJnYpIHsgKytjYWxsczsgcmV0dXJuIHIuc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2Uodik7IH0KLSAgZG91YmxlIG1pbmltdW1Pbk9iamVjdFZvbHVtZShjb25zdCBWZWN0b3IyZCAmdiwgY29uc3QgQm94MmQgJnIpIHsgKytjYWxsczsgcmV0dXJuIHIuc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2Uodik7IH0KLSAgZG91YmxlIG1pbmltdW1Pbk9iamVjdE9iamVjdChjb25zdCBWZWN0b3IyZCAmdjEsIGNvbnN0IFZlY3RvcjJkICZ2MikgeyArK2NhbGxzOyByZXR1cm4gKHYxIC0gdjIpLnNxdWFyZWROb3JtKCk7IH0KKyAgZG91YmxlIG1pbmltdW1PblZvbHVtZVZvbHVtZShjb25zdCBCb3gyZCAmcjEsIGNvbnN0IEJveDJkICZyMikgeworICAgICsrY2FsbHM7CisgICAgcmV0dXJuIHIxLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKHIyKTsKKyAgfQorICBkb3VibGUgbWluaW11bU9uVm9sdW1lT2JqZWN0KGNvbnN0IEJveDJkICZyLCBjb25zdCBWZWN0b3IyZCAmdikgeworICAgICsrY2FsbHM7CisgICAgcmV0dXJuIHIuc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2Uodik7CisgIH0KKyAgZG91YmxlIG1pbmltdW1Pbk9iamVjdFZvbHVtZShjb25zdCBWZWN0b3IyZCAmdiwgY29uc3QgQm94MmQgJnIpIHsKKyAgICArK2NhbGxzOworICAgIHJldHVybiByLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKHYpOworICB9CisgIGRvdWJsZSBtaW5pbXVtT25PYmplY3RPYmplY3QoY29uc3QgVmVjdG9yMmQgJnYxLCBjb25zdCBWZWN0b3IyZCAmdjIpIHsKKyAgICArK2NhbGxzOworICAgIHJldHVybiAodjEgLSB2Mikuc3F1YXJlZE5vcm0oKTsKKyAgfQogCiAgIGludCBjYWxsczsKIH07CiAKLWludCBtYWluKCkKLXsKK2ludCBtYWluKCkgewogICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFZlY3RvcjJkLCBhbGlnbmVkX2FsbG9jYXRvcjxWZWN0b3IyZD4gPiBTdGRWZWN0b3JPZlZlY3RvcjJkOwogICBTdGRWZWN0b3JPZlZlY3RvcjJkIHJlZFBvaW50cywgYmx1ZVBvaW50czsKLSAgZm9yKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7IC8vaW5pdGlhbGl6ZSByYW5kb20gc2V0IG9mIHJlZCBwb2ludHMgYW5kIGJsdWUgcG9pbnRzCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsgIC8vIGluaXRpYWxpemUgcmFuZG9tIHNldCBvZiByZWQgcG9pbnRzIGFuZCBibHVlIHBvaW50cwogICAgIHJlZFBvaW50cy5wdXNoX2JhY2soVmVjdG9yMmQ6OlJhbmRvbSgpKTsKICAgICBibHVlUG9pbnRzLnB1c2hfYmFjayhWZWN0b3IyZDo6UmFuZG9tKCkpOwogICB9CkBAIC0zNCwxNiArNDUsMTcgQEAKICAgUG9pbnRQb2ludE1pbmltaXplciBtaW5pbWl6ZXI7CiAgIGRvdWJsZSBtaW5EaXN0U3EgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpOwogCi0gIC8vYnJ1dGUgZm9yY2UgdG8gZmluZCBjbG9zZXN0IHJlZC1ibHVlIHBhaXIKLSAgZm9yKGludCBpID0gMDsgaSA8IChpbnQpcmVkUG9pbnRzLnNpemUoKTsgKytpKQotICAgIGZvcihpbnQgaiA9IDA7IGogPCAoaW50KWJsdWVQb2ludHMuc2l6ZSgpOyArK2opCisgIC8vIGJydXRlIGZvcmNlIHRvIGZpbmQgY2xvc2VzdCByZWQtYmx1ZSBwYWlyCisgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClyZWRQb2ludHMuc2l6ZSgpOyArK2kpCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAoaW50KWJsdWVQb2ludHMuc2l6ZSgpOyArK2opCiAgICAgICBtaW5EaXN0U3EgPSBzdGQ6Om1pbihtaW5EaXN0U3EsIG1pbmltaXplci5taW5pbXVtT25PYmplY3RPYmplY3QocmVkUG9pbnRzW2ldLCBibHVlUG9pbnRzW2pdKSk7CiAgIHN0ZDo6Y291dCA8PCAiQnJ1dGUgZm9yY2UgZGlzdGFuY2UgPSAiIDw8IHNxcnQobWluRGlzdFNxKSA8PCAiLCBjYWxscyA9ICIgPDwgbWluaW1pemVyLmNhbGxzIDw8IHN0ZDo6ZW5kbDsKIAotICAvL3VzaW5nIEJWSCB0byBmaW5kIGNsb3Nlc3QgcmVkLWJsdWUgcGFpcgorICAvLyB1c2luZyBCVkggdG8gZmluZCBjbG9zZXN0IHJlZC1ibHVlIHBhaXIKICAgbWluaW1pemVyLmNhbGxzID0gMDsKLSAgS2RCVkg8ZG91YmxlLCAyLCBWZWN0b3IyZD4gcmVkVHJlZShyZWRQb2ludHMuYmVnaW4oKSwgcmVkUG9pbnRzLmVuZCgpKSwgYmx1ZVRyZWUoYmx1ZVBvaW50cy5iZWdpbigpLCBibHVlUG9pbnRzLmVuZCgpKTsgLy9jb25zdHJ1Y3QgdGhlIHRyZWVzCi0gIG1pbkRpc3RTcSA9IEJWTWluaW1pemUocmVkVHJlZSwgYmx1ZVRyZWUsIG1pbmltaXplcik7IC8vYWN0dWFsIEJWSCBtaW5pbWl6YXRpb24gY2FsbAorICBLZEJWSDxkb3VibGUsIDIsIFZlY3RvcjJkPiByZWRUcmVlKHJlZFBvaW50cy5iZWdpbigpLCByZWRQb2ludHMuZW5kKCkpLAorICAgICAgYmx1ZVRyZWUoYmx1ZVBvaW50cy5iZWdpbigpLCBibHVlUG9pbnRzLmVuZCgpKTsgICAgLy8gY29uc3RydWN0IHRoZSB0cmVlcworICBtaW5EaXN0U3EgPSBCVk1pbmltaXplKHJlZFRyZWUsIGJsdWVUcmVlLCBtaW5pbWl6ZXIpOyAgLy8gYWN0dWFsIEJWSCBtaW5pbWl6YXRpb24gY2FsbAogICBzdGQ6OmNvdXQgPDwgIkJWSCBkaXN0YW5jZSAgICAgICAgID0gIiA8PCBzcXJ0KG1pbkRpc3RTcSkgPDwgIiwgY2FsbHMgPSAiIDw8IG1pbmltaXplci5jYWxscyA8PCBzdGQ6OmVuZGw7CiAKICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvRXVsZXJBbmdsZXMuY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL0V1bGVyQW5nbGVzLmNwcAppbmRleCAzZjhjYThjLi41Njk0NzcwIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvRXVsZXJBbmdsZXMuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9FdWxlckFuZ2xlcy5jcHAKQEAgLTMsOCArMyw3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIC8vIEEgY29tbW9uIEV1bGVyIHN5c3RlbSBieSBtYW55IGFybWllcyBhcm91bmQgdGhlIHdvcmxkLAogICAvLyAgd2hlcmUgdGhlIGZpcnN0IG9uZSBpcyB0aGUgYXppbXV0aCh0aGUgYW5nbGUgZnJvbSB0aGUgbm9ydGggLQogICAvLyAgIHRoZSBzYW1lIGFuZ2xlIHRoYXQgaXMgc2hvdyBpbiBjb21wYXNzKQpAQCAtMTQsMzMgKzEzLDMyIEBACiAgIC8vIEtlZXAgcmVtZW1iZXJpbmcgd2UncmUgdXNpbmcgcmFkaWFuIGFuZ2xlcyBoZXJlIQogICB0eXBlZGVmIEV1bGVyU3lzdGVtPC1FVUxFUl9aLCBFVUxFUl9ZLCBFVUxFUl9YPiBNeUFybXlTeXN0ZW07CiAgIHR5cGVkZWYgRXVsZXJBbmdsZXM8ZG91YmxlLCBNeUFybXlTeXN0ZW0+IE15QXJteUFuZ2xlczsKLSAgCi0gIE15QXJteUFuZ2xlcyB2ZWhpY2xlQW5nbGVzKAotICAgIDMuMTQvKlBJKi8gLyAyLCAvKiBoZWFkaW5nIHRvIGVhc3QsIG5vdGljZSB0aGF0IHRoaXMgYW5nbGUgaXMgY291bnRlci1jbG9ja3dpc2UgKi8KLSAgICAtMC4zLCAvKiBnb2luZyBkb3duIGZyb20gYSBtb3VudGFpbiAqLwotICAgIDAuMSk7IC8qIHNsaWdodGx5IHJvbGxlZCB0byB0aGUgcmlnaHQgKi8KLSAgCisKKyAgTXlBcm15QW5nbGVzIHZlaGljbGVBbmdsZXMoMy4xNCAvKlBJKi8gLyAyLCAvKiBoZWFkaW5nIHRvIGVhc3QsIG5vdGljZSB0aGF0IHRoaXMgYW5nbGUgaXMgY291bnRlci1jbG9ja3dpc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMywgICAgICAgICAgICAvKiBnb2luZyBkb3duIGZyb20gYSBtb3VudGFpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEpOyAgICAgICAgICAgIC8qIHNsaWdodGx5IHJvbGxlZCB0byB0aGUgcmlnaHQgKi8KKwogICAvLyBTb21lIEV1bGVyIGFuZ2xlcyByZXByZXNlbnRhdGlvbiB0aGF0IG91ciBwbGFuZSB1c2UuCiAgIEV1bGVyQW5nbGVzWllaZCBwbGFuZUFuZ2xlcygwLjc4NDc0LCAwLjUyNzEsIC0wLjUxMzc5NCk7Ci0gIAorCiAgIE15QXJteUFuZ2xlcyBwbGFuZUFuZ2xlc0luTXlBcm15QW5nbGVzKHBsYW5lQW5nbGVzKTsKLSAgCisKICAgc3RkOjpjb3V0IDw8ICJ2ZWhpY2xlIGFuZ2xlcyhNeUFybXkpOiAgICAgIiA8PCB2ZWhpY2xlQW5nbGVzIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8ICJwbGFuZSBhbmdsZXMoWllaKTogICAgICAgICIgPDwgcGxhbmVBbmdsZXMgPDwgc3RkOjplbmRsOwogICBzdGQ6OmNvdXQgPDwgInBsYW5lIGFuZ2xlcyhNeUFybXkpOiAgICAgIiA8PCBwbGFuZUFuZ2xlc0luTXlBcm15QW5nbGVzIDw8IHN0ZDo6ZW5kbDsKLSAgCisKICAgLy8gTm93IGxldHMgcm90YXRlIHRoZSBwbGFuZSBhIGxpdHRsZSBiaXQKICAgc3RkOjpjb3V0IDw8ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwogICBzdGQ6OmNvdXQgPDwgInJvdGF0aW5nIHBsYW5lIG5vdyFcbiI7CiAgIHN0ZDo6Y291dCA8PCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKLSAgCisKICAgUXVhdGVybmlvbmQgcGxhbmVSb3RhdGVkID0gQW5nbGVBeGlzZCgtMC4zNDIsIFZlY3RvcjNkOjpVbml0WSgpKSAqIHBsYW5lQW5nbGVzOwotICAKKwogICBwbGFuZUFuZ2xlcyA9IHBsYW5lUm90YXRlZDsKICAgcGxhbmVBbmdsZXNJbk15QXJteUFuZ2xlcyA9IHBsYW5lUm90YXRlZDsKLSAgCisKICAgc3RkOjpjb3V0IDw8ICJuZXcgcGxhbmUgYW5nbGVzKFpZWik6ICAgICAiIDw8IHBsYW5lQW5nbGVzIDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8ICJuZXcgcGxhbmUgYW5nbGVzKE15QXJteSk6ICIgPDwgcGxhbmVBbmdsZXNJbk15QXJteUFuZ2xlcyA8PCBzdGQ6OmVuZGw7Ci0gIAorCiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL0ZGVC5jcHAgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvRkZULmNwcAppbmRleCA4NWU4YTAyLi5iZjI0ZGU1IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvRkZULmNwcAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvRkZULmNwcApAQCAtMSw1ICsxLDUgQEAKIC8vICBUbyB1c2UgdGhlIHNpbXBsZSBGRlQgaW1wbGVtZW50YXRpb24KLS8vICBnKysgLW8gZGVtb2ZmdCAtSS4uIC1XYWxsIC1PMyBGRlQuY3BwIAorLy8gIGcrKyAtbyBkZW1vZmZ0IC1JLi4gLVdhbGwgLU8zIEZGVC5jcHAKIAogLy8gIFRvIHVzZSB0aGUgRkZUVyBpbXBsZW1lbnRhdGlvbgogLy8gIGcrKyAtbyBkZW1vZmZ0IC1JLi4gLURVU0VfRkZUVyAtV2FsbCAtTzMgRkZULmNwcCAtbGZmdHczIC1sZmZ0dzNmIC1sZmZ0dzNsCkBAIC0yMCw5OSArMjAsODQgQEAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1UIG1hZzIoVCBhKQotewotICAgIHJldHVybiBhKmE7CitUIG1hZzIoVCBhKSB7CisgIHJldHVybiBhICogYTsKIH0KIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotVCBtYWcyKHN0ZDo6Y29tcGxleDxUPiBhKQotewotICAgIHJldHVybiBub3JtKGEpOworVCBtYWcyKHN0ZDo6Y29tcGxleDxUPiBhKSB7CisgIHJldHVybiBub3JtKGEpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVQgbWFnMihjb25zdCBzdGQ6OnZlY3RvcjxUPiAmIHZlYykKLXsKLSAgICBUIG91dD0wOwotICAgIGZvciAoc2l6ZV90IGs9MDtrPHZlYy5zaXplKCk7KytrKQotICAgICAgICBvdXQgKz0gbWFnMih2ZWNba10pOwotICAgIHJldHVybiBvdXQ7CitUIG1hZzIoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHZlYykgeworICBUIG91dCA9IDA7CisgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgdmVjLnNpemUoKTsgKytrKSBvdXQgKz0gbWFnMih2ZWNba10pOworICByZXR1cm4gb3V0OwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVQgbWFnMihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OmNvbXBsZXg8VD4gPiAmIHZlYykKLXsKLSAgICBUIG91dD0wOwotICAgIGZvciAoc2l6ZV90IGs9MDtrPHZlYy5zaXplKCk7KytrKQotICAgICAgICBvdXQgKz0gbWFnMih2ZWNba10pOwotICAgIHJldHVybiBvdXQ7CitUIG1hZzIoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpjb21wbGV4PFQ+ID4mIHZlYykgeworICBUIG91dCA9IDA7CisgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgdmVjLnNpemUoKTsgKytrKSBvdXQgKz0gbWFnMih2ZWNba10pOworICByZXR1cm4gb3V0OwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZlY3RvcjxUPiBvcGVyYXRvci0oY29uc3QgdmVjdG9yPFQ+ICYgYSxjb25zdCB2ZWN0b3I8VD4gJiBiICkKLXsKLSAgICB2ZWN0b3I8VD4gYyhhKTsKLSAgICBmb3IgKHNpemVfdCBrPTA7azxiLnNpemUoKTsrK2spIAotICAgICAgICBjW2tdIC09IGJba107Ci0gICAgcmV0dXJuIGM7Cit2ZWN0b3I8VD4gb3BlcmF0b3ItKGNvbnN0IHZlY3RvcjxUPiYgYSwgY29uc3QgdmVjdG9yPFQ+JiBiKSB7CisgIHZlY3RvcjxUPiBjKGEpOworICBmb3IgKHNpemVfdCBrID0gMDsgayA8IGIuc2l6ZSgpOyArK2spIGNba10gLT0gYltrXTsKKyAgcmV0dXJuIGM7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBSYW5kb21GaWxsKHN0ZDo6dmVjdG9yPFQ+ICYgdmVjKQotewotICAgIGZvciAoc2l6ZV90IGs9MDtrPHZlYy5zaXplKCk7KytrKQotICAgICAgICB2ZWNba10gPSBUKCByYW5kKCkgKS9UKFJBTkRfTUFYKSAtIFQoLjUpOwordm9pZCBSYW5kb21GaWxsKHN0ZDo6dmVjdG9yPFQ+JiB2ZWMpIHsKKyAgZm9yIChzaXplX3QgayA9IDA7IGsgPCB2ZWMuc2l6ZSgpOyArK2spIHZlY1trXSA9IFQocmFuZCgpKSAvIFQoUkFORF9NQVgpIC0gVCguNSk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBSYW5kb21GaWxsKHN0ZDo6dmVjdG9yPHN0ZDo6Y29tcGxleDxUPiA+ICYgdmVjKQotewotICAgIGZvciAoc2l6ZV90IGs9MDtrPHZlYy5zaXplKCk7KytrKQotICAgICAgICB2ZWNba10gPSBzdGQ6OmNvbXBsZXg8VD4gKCBUKCByYW5kKCkgKS9UKFJBTkRfTUFYKSAtIFQoLjUpLCBUKCByYW5kKCkgKS9UKFJBTkRfTUFYKSAtIFQoLjUpKTsKK3ZvaWQgUmFuZG9tRmlsbChzdGQ6OnZlY3RvcjxzdGQ6OmNvbXBsZXg8VD4gPiYgdmVjKSB7CisgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgdmVjLnNpemUoKTsgKytrKQorICAgIHZlY1trXSA9IHN0ZDo6Y29tcGxleDxUPihUKHJhbmQoKSkgLyBUKFJBTkRfTUFYKSAtIFQoLjUpLCBUKHJhbmQoKSkgLyBUKFJBTkRfTUFYKSAtIFQoLjUpKTsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFRfdGltZSx0eXBlbmFtZSBUX2ZyZXE+Ci12b2lkIGZ3ZF9pbnYoc2l6ZV90IG5mZnQpCi17Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBOdW1UcmFpdHM8VF9mcmVxPjo6UmVhbCBTY2FsYXI7Ci0gICAgdmVjdG9yPFRfdGltZT4gdGltZWJ1ZihuZmZ0KTsKLSAgICBSYW5kb21GaWxsKHRpbWVidWYpOwordGVtcGxhdGUgPHR5cGVuYW1lIFRfdGltZSwgdHlwZW5hbWUgVF9mcmVxPgordm9pZCBmd2RfaW52KHNpemVfdCBuZmZ0KSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFRfZnJlcT46OlJlYWwgU2NhbGFyOworICB2ZWN0b3I8VF90aW1lPiB0aW1lYnVmKG5mZnQpOworICBSYW5kb21GaWxsKHRpbWVidWYpOwogCi0gICAgdmVjdG9yPFRfZnJlcT4gZnJlcWJ1ZjsKLSAgICBzdGF0aWMgRkZUPFNjYWxhcj4gZmZ0OwotICAgIGZmdC5md2QoZnJlcWJ1Zix0aW1lYnVmKTsKKyAgdmVjdG9yPFRfZnJlcT4gZnJlcWJ1ZjsKKyAgc3RhdGljIEZGVDxTY2FsYXI+IGZmdDsKKyAgZmZ0LmZ3ZChmcmVxYnVmLCB0aW1lYnVmKTsKIAotICAgIHZlY3RvcjxUX3RpbWU+IHRpbWVidWYyOwotICAgIGZmdC5pbnYodGltZWJ1ZjIsZnJlcWJ1Zik7CisgIHZlY3RvcjxUX3RpbWU+IHRpbWVidWYyOworICBmZnQuaW52KHRpbWVidWYyLCBmcmVxYnVmKTsKIAotICAgIFRfdGltZSBybXNlID0gbWFnMih0aW1lYnVmIC0gdGltZWJ1ZjIpIC8gbWFnMih0aW1lYnVmKTsKLSAgICBjb3V0IDw8ICJyb3VuZHRyaXAgcm1zZTogIiA8PCBybXNlIDw8IGVuZGw7CisgIFRfdGltZSBybXNlID0gbWFnMih0aW1lYnVmIC0gdGltZWJ1ZjIpIC8gbWFnMih0aW1lYnVmKTsKKyAgY291dCA8PCAicm91bmR0cmlwIHJtc2U6ICIgPDwgcm1zZSA8PCBlbmRsOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVF9zY2FsYXI+Ci12b2lkIHR3b19kZW1vcyhpbnQgbmZmdCkKLXsKLSAgICBjb3V0IDw8ICIgICAgIHNjYWxhciAiOwotICAgIGZ3ZF9pbnY8VF9zY2FsYXIsc3RkOjpjb21wbGV4PFRfc2NhbGFyPiA+KG5mZnQpOwotICAgIGNvdXQgPDwgIiAgICBjb21wbGV4ICI7Ci0gICAgZndkX2ludjxzdGQ6OmNvbXBsZXg8VF9zY2FsYXI+LHN0ZDo6Y29tcGxleDxUX3NjYWxhcj4gPihuZmZ0KTsKK3ZvaWQgdHdvX2RlbW9zKGludCBuZmZ0KSB7CisgIGNvdXQgPDwgIiAgICAgc2NhbGFyICI7CisgIGZ3ZF9pbnY8VF9zY2FsYXIsIHN0ZDo6Y29tcGxleDxUX3NjYWxhcj4gPihuZmZ0KTsKKyAgY291dCA8PCAiICAgIGNvbXBsZXggIjsKKyAgZndkX2ludjxzdGQ6OmNvbXBsZXg8VF9zY2FsYXI+LCBzdGQ6OmNvbXBsZXg8VF9zY2FsYXI+ID4obmZmdCk7CiB9CiAKLXZvaWQgZGVtb19hbGxfdHlwZXMoaW50IG5mZnQpCi17Ci0gICAgY291dCA8PCAibmZmdD0iIDw8IG5mZnQgPDwgZW5kbDsKLSAgICBjb3V0IDw8ICIgICBmbG9hdCIgPDwgZW5kbDsKLSAgICB0d29fZGVtb3M8ZmxvYXQ+KG5mZnQpOwotICAgIGNvdXQgPDwgIiAgIGRvdWJsZSIgPDwgZW5kbDsKLSAgICB0d29fZGVtb3M8ZG91YmxlPihuZmZ0KTsKLSAgICBjb3V0IDw8ICIgICBsb25nIGRvdWJsZSIgPDwgZW5kbDsKLSAgICB0d29fZGVtb3M8bG9uZyBkb3VibGU+KG5mZnQpOwordm9pZCBkZW1vX2FsbF90eXBlcyhpbnQgbmZmdCkgeworICBjb3V0IDw8ICJuZmZ0PSIgPDwgbmZmdCA8PCBlbmRsOworICBjb3V0IDw8ICIgICBmbG9hdCIgPDwgZW5kbDsKKyAgdHdvX2RlbW9zPGZsb2F0PihuZmZ0KTsKKyAgY291dCA8PCAiICAgZG91YmxlIiA8PCBlbmRsOworICB0d29fZGVtb3M8ZG91YmxlPihuZmZ0KTsKKyAgY291dCA8PCAiICAgbG9uZyBkb3VibGUiIDw8IGVuZGw7CisgIHR3b19kZW1vczxsb25nIGRvdWJsZT4obmZmdCk7CiB9CiAKLWludCBtYWluKCkKLXsKLSAgICBkZW1vX2FsbF90eXBlcyggMiozKjQqNSo3ICk7Ci0gICAgZGVtb19hbGxfdHlwZXMoIDIqOSoxNioyNSApOwotICAgIGRlbW9fYWxsX3R5cGVzKCAxMDI0ICk7Ci0gICAgcmV0dXJuIDA7CitpbnQgbWFpbigpIHsKKyAgZGVtb19hbGxfdHlwZXMoMiAqIDMgKiA0ICogNSAqIDcpOworICBkZW1vX2FsbF90eXBlcygyICogOSAqIDE2ICogMjUpOworICBkZW1vX2FsbF90eXBlcygxMDI0KTsKKyAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4RXhwb25lbnRpYWwuY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeEV4cG9uZW50aWFsLmNwcAppbmRleCBlYmQzYjk2Li5lYWI3YTVlIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4RXhwb25lbnRpYWwuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhFeHBvbmVudGlhbC5jcHAKQEAgLTMsMTQgKzMsMTEgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgY29uc3QgZG91YmxlIHBpID0gc3RkOjphY29zKC0xLjApOwogCi0gIE1hdHJpeFhkIEEoMywzKTsKLSAgQSA8PCAwLCAgICAtcGkvNCwgMCwKLSAgICAgICBwaS80LCAwLCAgICAgMCwKLSAgICAgICAwLCAgICAwLCAgICAgMDsKKyAgTWF0cml4WGQgQSgzLCAzKTsKKyAgQSA8PCAwLCAtcGkgLyA0LCAwLCBwaSAvIDQsIDAsIDAsIDAsIDAsIDA7CiAgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBBIGlzOlxuIiA8PCBBIDw8ICJcblxuIjsKICAgc3RkOjpjb3V0IDw8ICJUaGUgbWF0cml4IGV4cG9uZW50aWFsIG9mIEEgaXM6XG4iIDw8IEEuZXhwKCkgPDwgIlxuXG4iOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeEZ1bmN0aW9uLmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhGdW5jdGlvbi5jcHAKaW5kZXggYTQxNzJlNC4uZDcyZjYyYSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeEZ1bmN0aW9uLmNwcAorKysgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4RnVuY3Rpb24uY3BwCkBAIC0zLDIxICszLDE0IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotc3RkOjpjb21wbGV4PGRvdWJsZT4gZXhwZm4oc3RkOjpjb21wbGV4PGRvdWJsZT4geCwgaW50KQotewotICByZXR1cm4gc3RkOjpleHAoeCk7Ci19CitzdGQ6OmNvbXBsZXg8ZG91YmxlPiBleHBmbihzdGQ6OmNvbXBsZXg8ZG91YmxlPiB4LCBpbnQpIHsgcmV0dXJuIHN0ZDo6ZXhwKHgpOyB9CiAKLWludCBtYWluKCkKLXsKK2ludCBtYWluKCkgewogICBjb25zdCBkb3VibGUgcGkgPSBzdGQ6OmFjb3MoLTEuMCk7CiAKLSAgTWF0cml4WGQgQSgzLDMpOwotICBBIDw8IDAsICAgIC1waS80LCAwLAotICAgICAgIHBpLzQsIDAsICAgICAwLAotICAgICAgIDAsICAgIDAsICAgICAwOworICBNYXRyaXhYZCBBKDMsIDMpOworICBBIDw8IDAsIC1waSAvIDQsIDAsIHBpIC8gNCwgMCwgMCwgMCwgMCwgMDsKIAogICBzdGQ6OmNvdXQgPDwgIlRoZSBtYXRyaXggQSBpczpcbiIgPDwgQSA8PCAiXG5cbiI7Ci0gIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBleHBvbmVudGlhbCBvZiBBIGlzOlxuIiAKLSAgICAgICAgICAgIDw8IEEubWF0cml4RnVuY3Rpb24oZXhwZm4pIDw8ICJcblxuIjsKKyAgc3RkOjpjb3V0IDw8ICJUaGUgbWF0cml4IGV4cG9uZW50aWFsIG9mIEEgaXM6XG4iIDw8IEEubWF0cml4RnVuY3Rpb24oZXhwZm4pIDw8ICJcblxuIjsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhMb2dhcml0aG0uY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeExvZ2FyaXRobS5jcHAKaW5kZXggOGM1ZDk3MC4uNDFiN2ZmNiAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeExvZ2FyaXRobS5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeExvZ2FyaXRobS5jcHAKQEAgLTMsMTMgKzMsMTAgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgdXNpbmcgc3RkOjpzcXJ0OwotICBNYXRyaXhYZCBBKDMsMyk7Ci0gIEEgPDwgMC41KnNxcnQoMiksIC0wLjUqc3FydCgyKSwgMCwKLSAgICAgICAwLjUqc3FydCgyKSwgIDAuNSpzcXJ0KDIpLCAwLAotICAgICAgIDAsICAgICAgICAgICAgMCwgICAgICAgICAgIDE7CisgIE1hdHJpeFhkIEEoMywgMyk7CisgIEEgPDwgMC41ICogc3FydCgyKSwgLTAuNSAqIHNxcnQoMiksIDAsIDAuNSAqIHNxcnQoMiksIDAuNSAqIHNxcnQoMiksIDAsIDAsIDAsIDE7CiAgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBBIGlzOlxuIiA8PCBBIDw8ICJcblxuIjsKICAgc3RkOjpjb3V0IDw8ICJUaGUgbWF0cml4IGxvZ2FyaXRobSBvZiBBIGlzOlxuIiA8PCBBLmxvZygpIDw8ICJcbiI7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4UG93ZXIuY3BwIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFBvd2VyLmNwcAppbmRleCAyMjI0NTI0Li4zNTUwMWI2IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4UG93ZXIuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhQb3dlci5jcHAKQEAgLTMsMTQgKzMsMTQgQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgY29uc3QgZG91YmxlIHBpID0gc3RkOjphY29zKC0xLjApOwogICBNYXRyaXgzZCBBOwotICBBIDw8IGNvcygxKSwgLXNpbigxKSwgMCwKLSAgICAgICBzaW4oMSksICBjb3MoMSksIDAsCi0JICAgMCAsICAgICAgMCAsIDE7Ci0gIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBBIGlzOlxuIiA8PCBBIDw8ICJcblxuIgotCSAgICAgICAiVGhlIG1hdHJpeCBwb3dlciBBXihwaS80KSBpczpcbiIgPDwgQS5wb3cocGkvNCkgPDwgc3RkOjplbmRsOworICBBIDw8IGNvcygxKSwgLXNpbigxKSwgMCwgc2luKDEpLCBjb3MoMSksIDAsIDAsIDAsIDE7CisgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBBIGlzOlxuIgorICAgICAgICAgICAgPDwgQQorICAgICAgICAgICAgPDwgIlxuXG4iCisgICAgICAgICAgICAgICAiVGhlIG1hdHJpeCBwb3dlciBBXihwaS80KSBpczpcbiIKKyAgICAgICAgICAgIDw8IEEucG93KHBpIC8gNCkgPDwgc3RkOjplbmRsOwogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhQb3dlcl9vcHRpbWFsLmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhQb3dlcl9vcHRpbWFsLmNwcAppbmRleCA4NjQ3MGJhLi41ZjVmM2U0IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4UG93ZXJfb3B0aW1hbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFBvd2VyX29wdGltYWwuY3BwCkBAIC0zLDE1ICszLDIzIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIE1hdHJpeDRjZCBBID0gTWF0cml4NGNkOjpSYW5kb20oKTsKICAgTWF0cml4UG93ZXI8TWF0cml4NGNkPiBBcG93KEEpOwogCi0gIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBBIGlzOlxuIiA8PCBBIDw8ICJcblxuIgotCSAgICAgICAiQV4zLjEgaXM6XG4iIDw8IEFwb3coMy4xKSA8PCAiXG5cbiIKLQkgICAgICAgIkFeMy4zIGlzOlxuIiA8PCBBcG93KDMuMykgPDwgIlxuXG4iCi0JICAgICAgICJBXjMuNyBpczpcbiIgPDwgQXBvdygzLjcpIDw8ICJcblxuIgotCSAgICAgICAiQV4zLjkgaXM6XG4iIDw8IEFwb3coMy45KSA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBBIGlzOlxuIgorICAgICAgICAgICAgPDwgQQorICAgICAgICAgICAgPDwgIlxuXG4iCisgICAgICAgICAgICAgICAiQV4zLjEgaXM6XG4iCisgICAgICAgICAgICA8PCBBcG93KDMuMSkKKyAgICAgICAgICAgIDw8ICJcblxuIgorICAgICAgICAgICAgICAgIkFeMy4zIGlzOlxuIgorICAgICAgICAgICAgPDwgQXBvdygzLjMpCisgICAgICAgICAgICA8PCAiXG5cbiIKKyAgICAgICAgICAgICAgICJBXjMuNyBpczpcbiIKKyAgICAgICAgICAgIDw8IEFwb3coMy43KQorICAgICAgICAgICAgPDwgIlxuXG4iCisgICAgICAgICAgICAgICAiQV4zLjkgaXM6XG4iCisgICAgICAgICAgICA8PCBBcG93KDMuOSkgPDwgc3RkOjplbmRsOwogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhTaW5lLmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhTaW5lLmNwcAppbmRleCA5ZWVhOWEwLi5lZWFmYTUwIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4U2luZS5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFNpbmUuY3BwCkBAIC0zLDkgKzMsOCBAQAogCiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLWludCBtYWluKCkKLXsKLSAgTWF0cml4WGQgQSA9IE1hdHJpeFhkOjpSYW5kb20oMywzKTsKK2ludCBtYWluKCkgeworICBNYXRyaXhYZCBBID0gTWF0cml4WGQ6OlJhbmRvbSgzLCAzKTsKICAgc3RkOjpjb3V0IDw8ICJBID0gXG4iIDw8IEEgPDwgIlxuXG4iOwogCiAgIE1hdHJpeFhkIHNpbkEgPSBBLnNpbigpOwpAQCAtMTMsOCArMTIsOCBAQAogCiAgIE1hdHJpeFhkIGNvc0EgPSBBLmNvcygpOwogICBzdGQ6OmNvdXQgPDwgImNvcyhBKSA9IFxuIiA8PCBjb3NBIDw8ICJcblxuIjsKLSAgCi0gIC8vIFRoZSBtYXRyaXggZnVuY3Rpb25zIHNhdGlzZnkgc2luXjIoQSkgKyBjb3NeMihBKSA9IEksIAorCisgIC8vIFRoZSBtYXRyaXggZnVuY3Rpb25zIHNhdGlzZnkgc2luXjIoQSkgKyBjb3NeMihBKSA9IEksCiAgIC8vIGxpa2UgdGhlIHNjYWxhciBmdW5jdGlvbnMuCi0gIHN0ZDo6Y291dCA8PCAic2luXjIoQSkgKyBjb3NeMihBKSA9IFxuIiA8PCBzaW5BKnNpbkEgKyBjb3NBKmNvc0EgPDwgIlxuXG4iOworICBzdGQ6OmNvdXQgPDwgInNpbl4yKEEpICsgY29zXjIoQSkgPSBcbiIgPDwgc2luQSAqIHNpbkEgKyBjb3NBICogY29zQSA8PCAiXG5cbiI7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4U2luaC5jcHAgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4U2luaC5jcHAKaW5kZXggZjc3MTg2Ny4uMWFhYmJiMyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFNpbmguY3BwCisrKyBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhTaW5oLmNwcApAQCAtMyw5ICszLDggQEAKIAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogCi1pbnQgbWFpbigpCi17Ci0gIE1hdHJpeFhmIEEgPSBNYXRyaXhYZjo6UmFuZG9tKDMsMyk7CitpbnQgbWFpbigpIHsKKyAgTWF0cml4WGYgQSA9IE1hdHJpeFhmOjpSYW5kb20oMywgMyk7CiAgIHN0ZDo6Y291dCA8PCAiQSA9IFxuIiA8PCBBIDw8ICJcblxuIjsKIAogICBNYXRyaXhYZiBzaW5oQSA9IEEuc2luaCgpOwpAQCAtMTMsOCArMTIsOCBAQAogCiAgIE1hdHJpeFhmIGNvc2hBID0gQS5jb3NoKCk7CiAgIHN0ZDo6Y291dCA8PCAiY29zaChBKSA9IFxuIiA8PCBjb3NoQSA8PCAiXG5cbiI7Ci0gIAotICAvLyBUaGUgbWF0cml4IGZ1bmN0aW9ucyBzYXRpc2Z5IGNvc2heMihBKSAtIHNpbmheMihBKSA9IEksIAorCisgIC8vIFRoZSBtYXRyaXggZnVuY3Rpb25zIHNhdGlzZnkgY29zaF4yKEEpIC0gc2luaF4yKEEpID0gSSwKICAgLy8gbGlrZSB0aGUgc2NhbGFyIGZ1bmN0aW9ucy4KLSAgc3RkOjpjb3V0IDw8ICJjb3NoXjIoQSkgLSBzaW5oXjIoQSkgPSBcbiIgPDwgY29zaEEqY29zaEEgLSBzaW5oQSpzaW5oQSA8PCAiXG5cbiI7CisgIHN0ZDo6Y291dCA8PCAiY29zaF4yKEEpIC0gc2luaF4yKEEpID0gXG4iIDw8IGNvc2hBICogY29zaEEgLSBzaW5oQSAqIHNpbmhBIDw8ICJcblxuIjsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhTcXVhcmVSb290LmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9NYXRyaXhTcXVhcmVSb290LmNwcAppbmRleCA4OGU3NTU3Li4wYWM0ZmRjIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvTWF0cml4U3F1YXJlUm9vdC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL01hdHJpeFNxdWFyZVJvb3QuY3BwCkBAIC0zLDEzICszLDExIEBACiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotaW50IG1haW4oKQoteworaW50IG1haW4oKSB7CiAgIGNvbnN0IGRvdWJsZSBwaSA9IHN0ZDo6YWNvcygtMS4wKTsKIAotICBNYXRyaXhYZCBBKDIsMik7Ci0gIEEgPDwgY29zKHBpLzMpLCAtc2luKHBpLzMpLCAKLSAgICAgICBzaW4ocGkvMyksICBjb3MocGkvMyk7CisgIE1hdHJpeFhkIEEoMiwgMik7CisgIEEgPDwgY29zKHBpIC8gMyksIC1zaW4ocGkgLyAzKSwgc2luKHBpIC8gMyksIGNvcyhwaSAvIDMpOwogICBzdGQ6OmNvdXQgPDwgIlRoZSBtYXRyaXggQSBpczpcbiIgPDwgQSA8PCAiXG5cbiI7CiAgIHN0ZDo6Y291dCA8PCAiVGhlIG1hdHJpeCBzcXVhcmUgcm9vdCBvZiBBIGlzOlxuIiA8PCBBLnNxcnQoKSA8PCAiXG5cbiI7CiAgIHN0ZDo6Y291dCA8PCAiVGhlIHNxdWFyZSBvZiB0aGUgbGFzdCBtYXRyaXggaXM6XG4iIDw8IEEuc3FydCgpICogQS5zcXJ0KCkgPDwgIlxuIjsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9Qb2x5bm9taWFsU29sdmVyMS5jcHAgYi91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvUG9seW5vbWlhbFNvbHZlcjEuY3BwCmluZGV4IGNkNzc3YTQuLmMxYmY5NzYgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9Qb2x5bm9taWFsU29sdmVyMS5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL1BvbHlub21pYWxTb2x2ZXIxLmNwcApAQCAtNSw0OSArNSw0OCBAQAogdXNpbmcgbmFtZXNwYWNlIEVpZ2VuOwogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAotaW50IG1haW4oKQotewotICB0eXBlZGVmIE1hdHJpeDxkb3VibGUsNSwxPiBWZWN0b3I1ZDsKK2ludCBtYWluKCkgeworICB0eXBlZGVmIE1hdHJpeDxkb3VibGUsIDUsIDE+IFZlY3RvcjVkOwogCiAgIFZlY3RvcjVkIHJvb3RzID0gVmVjdG9yNWQ6OlJhbmRvbSgpOwogICBjb3V0IDw8ICJSb290czogIiA8PCByb290cy50cmFuc3Bvc2UoKSA8PCBlbmRsOwotICBFaWdlbjo6TWF0cml4PGRvdWJsZSw2LDE+IHBvbHlub21pYWw7Ci0gIHJvb3RzX3RvX21vbmljUG9seW5vbWlhbCggcm9vdHMsIHBvbHlub21pYWwgKTsKKyAgRWlnZW46Ok1hdHJpeDxkb3VibGUsIDYsIDE+IHBvbHlub21pYWw7CisgIHJvb3RzX3RvX21vbmljUG9seW5vbWlhbChyb290cywgcG9seW5vbWlhbCk7CiAKLSAgUG9seW5vbWlhbFNvbHZlcjxkb3VibGUsNT4gcHNvbHZlKCBwb2x5bm9taWFsICk7CisgIFBvbHlub21pYWxTb2x2ZXI8ZG91YmxlLCA1PiBwc29sdmUocG9seW5vbWlhbCk7CiAgIGNvdXQgPDwgIkNvbXBsZXggcm9vdHM6ICIgPDwgcHNvbHZlLnJvb3RzKCkudHJhbnNwb3NlKCkgPDwgZW5kbDsKIAogICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHJlYWxSb290czsKLSAgcHNvbHZlLnJlYWxSb290cyggcmVhbFJvb3RzICk7Ci0gIE1hcDxWZWN0b3I1ZD4gbWFwUlIoICZyZWFsUm9vdHNbMF0gKTsKKyAgcHNvbHZlLnJlYWxSb290cyhyZWFsUm9vdHMpOworICBNYXA8VmVjdG9yNWQ+IG1hcFJSKCZyZWFsUm9vdHNbMF0pOwogICBjb3V0IDw8ICJSZWFsIHJvb3RzOiAiIDw8IG1hcFJSLnRyYW5zcG9zZSgpIDw8IGVuZGw7CiAKICAgY291dCA8PCBlbmRsOwogICBjb3V0IDw8ICJJbGx1c3RyYXRpb24gb2YgdGhlIGNvbnZlcmdlbmNlIHByb2JsZW0gd2l0aCB0aGUgUVIgYWxnb3JpdGhtOiAiIDw8IGVuZGw7CiAgIGNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgPDwgZW5kbDsKLSAgRWlnZW46Ok1hdHJpeDxmbG9hdCw3LDE+IGhhcmRDYXNlX3BvbHlub21pYWw7Ci0gIGhhcmRDYXNlX3BvbHlub21pYWwgPDwKLSAgLTAuOTU3LCAwLjkyMTksIDAuMzUxNiwgMC45NDUzLCAtMC40MDIzLCAtMC41NTA4LCAtMC4wMzEyNTsKKyAgRWlnZW46Ok1hdHJpeDxmbG9hdCwgNywgMT4gaGFyZENhc2VfcG9seW5vbWlhbDsKKyAgaGFyZENhc2VfcG9seW5vbWlhbCA8PCAtMC45NTcsIDAuOTIxOSwgMC4zNTE2LCAwLjk0NTMsIC0wLjQwMjMsIC0wLjU1MDgsIC0wLjAzMTI1OwogICBjb3V0IDw8ICJIYXJkIGNhc2UgcG9seW5vbWlhbCBkZWZpbmVkIGJ5IGZsb2F0czogIiA8PCBoYXJkQ2FzZV9wb2x5bm9taWFsLnRyYW5zcG9zZSgpIDw8IGVuZGw7Ci0gIFBvbHlub21pYWxTb2x2ZXI8ZmxvYXQsNj4gcHNvbHZlZiggaGFyZENhc2VfcG9seW5vbWlhbCApOworICBQb2x5bm9taWFsU29sdmVyPGZsb2F0LCA2PiBwc29sdmVmKGhhcmRDYXNlX3BvbHlub21pYWwpOwogICBjb3V0IDw8ICJDb21wbGV4IHJvb3RzOiAiIDw8IHBzb2x2ZWYucm9vdHMoKS50cmFuc3Bvc2UoKSA8PCBlbmRsOwotICBFaWdlbjo6TWF0cml4PGZsb2F0LDYsMT4gZXZhbHM7Ci0gIGZvciggaW50IGk9MDsgaTw2OyArK2kgKXsgZXZhbHNbaV0gPSBzdGQ6OmFicyggcG9seV9ldmFsKCBoYXJkQ2FzZV9wb2x5bm9taWFsLCBwc29sdmVmLnJvb3RzKClbaV0gKSApOyB9CisgIEVpZ2VuOjpNYXRyaXg8ZmxvYXQsIDYsIDE+IGV2YWxzOworICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgIGV2YWxzW2ldID0gc3RkOjphYnMocG9seV9ldmFsKGhhcmRDYXNlX3BvbHlub21pYWwsIHBzb2x2ZWYucm9vdHMoKVtpXSkpOworICB9CiAgIGNvdXQgPDwgIk5vcm1zIG9mIHRoZSBldmFsdWF0aW9ucyBvZiB0aGUgcG9seW5vbWlhbCBhdCB0aGUgcm9vdHM6ICIgPDwgZXZhbHMudHJhbnNwb3NlKCkgPDwgZW5kbCA8PCBlbmRsOwogCiAgIGNvdXQgPDwgIlVzaW5nIGRvdWJsZSdzIGFsbW9zdCBhbHdheXMgc29sdmVzIHRoZSBwcm9ibGVtIGZvciBzbWFsbCBkZWdyZWVzOiAiIDw8IGVuZGw7CiAgIGNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDw8IGVuZGw7Ci0gIFBvbHlub21pYWxTb2x2ZXI8ZG91YmxlLDY+IHBzb2x2ZTZkKCBoYXJkQ2FzZV9wb2x5bm9taWFsLmNhc3Q8ZG91YmxlPigpICk7CisgIFBvbHlub21pYWxTb2x2ZXI8ZG91YmxlLCA2PiBwc29sdmU2ZChoYXJkQ2FzZV9wb2x5bm9taWFsLmNhc3Q8ZG91YmxlPigpKTsKICAgY291dCA8PCAiQ29tcGxleCByb290czogIiA8PCBwc29sdmU2ZC5yb290cygpLnRyYW5zcG9zZSgpIDw8IGVuZGw7Ci0gIGZvciggaW50IGk9MDsgaTw2OyArK2kgKQotICB7Ci0gICAgc3RkOjpjb21wbGV4PGZsb2F0PiBjYXN0ZWRSb290KCBwc29sdmU2ZC5yb290cygpW2ldLnJlYWwoKSwgcHNvbHZlNmQucm9vdHMoKVtpXS5pbWFnKCkgKTsKLSAgICBldmFsc1tpXSA9IHN0ZDo6YWJzKCBwb2x5X2V2YWwoIGhhcmRDYXNlX3BvbHlub21pYWwsIGNhc3RlZFJvb3QgKSApOworICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgeworICAgIHN0ZDo6Y29tcGxleDxmbG9hdD4gY2FzdGVkUm9vdChwc29sdmU2ZC5yb290cygpW2ldLnJlYWwoKSwgcHNvbHZlNmQucm9vdHMoKVtpXS5pbWFnKCkpOworICAgIGV2YWxzW2ldID0gc3RkOjphYnMocG9seV9ldmFsKGhhcmRDYXNlX3BvbHlub21pYWwsIGNhc3RlZFJvb3QpKTsKICAgfQogICBjb3V0IDw8ICJOb3JtcyBvZiB0aGUgZXZhbHVhdGlvbnMgb2YgdGhlIHBvbHlub21pYWwgYXQgdGhlIHJvb3RzOiAiIDw8IGV2YWxzLnRyYW5zcG9zZSgpIDw8IGVuZGwgPDwgZW5kbDsKIAogICBjb3V0LnByZWNpc2lvbigxMCk7CiAgIGNvdXQgPDwgIlRoZSBsYXN0IHJvb3QgaW4gZmxvYXQgdGhlbiBpbiBkb3VibGU6ICIgPDwgcHNvbHZlZi5yb290cygpWzVdIDw8ICJcdCIgPDwgcHNvbHZlNmQucm9vdHMoKVs1XSA8PCBlbmRsOwotICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGNhc3RlZFJvb3QoIHBzb2x2ZTZkLnJvb3RzKClbNV0ucmVhbCgpLCBwc29sdmU2ZC5yb290cygpWzVdLmltYWcoKSApOwotICBjb3V0IDw8ICJOb3JtIG9mIHRoZSBkaWZmZXJlbmNlOiAiIDw8IHN0ZDo6YWJzKCBwc29sdmVmLnJvb3RzKClbNV0gLSBjYXN0ZWRSb290ICkgPDwgZW5kbDsKKyAgc3RkOjpjb21wbGV4PGZsb2F0PiBjYXN0ZWRSb290KHBzb2x2ZTZkLnJvb3RzKClbNV0ucmVhbCgpLCBwc29sdmU2ZC5yb290cygpWzVdLmltYWcoKSk7CisgIGNvdXQgPDwgIk5vcm0gb2YgdGhlIGRpZmZlcmVuY2U6ICIgPDwgc3RkOjphYnMocHNvbHZlZi5yb290cygpWzVdIC0gY2FzdGVkUm9vdCkgPDwgZW5kbDsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9Qb2x5bm9taWFsVXRpbHMxLmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9Qb2x5bm9taWFsVXRpbHMxLmNwcAppbmRleCBkYmZlNTIwLi5hMDUwYjAxIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvUG9seW5vbWlhbFV0aWxzMS5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL1BvbHlub21pYWxVdGlsczEuY3BwCkBAIC00LDE3ICs0LDE5IEBACiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCi1pbnQgbWFpbigpCi17CitpbnQgbWFpbigpIHsKICAgVmVjdG9yNGQgcm9vdHMgPSBWZWN0b3I0ZDo6UmFuZG9tKCk7CiAgIGNvdXQgPDwgIlJvb3RzOiAiIDw8IHJvb3RzLnRyYW5zcG9zZSgpIDw8IGVuZGw7Ci0gIEVpZ2VuOjpNYXRyaXg8ZG91YmxlLDUsMT4gcG9seW5vbWlhbDsKLSAgcm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsKCByb290cywgcG9seW5vbWlhbCApOworICBFaWdlbjo6TWF0cml4PGRvdWJsZSwgNSwgMT4gcG9seW5vbWlhbDsKKyAgcm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsKHJvb3RzLCBwb2x5bm9taWFsKTsKICAgY291dCA8PCAiUG9seW5vbWlhbDogIjsKLSAgZm9yKCBpbnQgaT0wOyBpPDQ7ICsraSApeyBjb3V0IDw8IHBvbHlub21pYWxbaV0gPDwgIi54XiIgPDwgaSA8PCAiKyAiOyB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgY291dCA8PCBwb2x5bm9taWFsW2ldIDw8ICIueF4iIDw8IGkgPDwgIisgIjsKKyAgfQogICBjb3V0IDw8IHBvbHlub21pYWxbNF0gPDwgIi54XjQiIDw8IGVuZGw7CiAgIFZlY3RvcjRkIGV2YWx1YXRpb247Ci0gIGZvciggaW50IGk9MDsgaTw0OyArK2kgKXsKLSAgICBldmFsdWF0aW9uW2ldID0gcG9seV9ldmFsKCBwb2x5bm9taWFsLCByb290c1tpXSApOyB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgZXZhbHVhdGlvbltpXSA9IHBvbHlfZXZhbChwb2x5bm9taWFsLCByb290c1tpXSk7CisgIH0KICAgY291dCA8PCAiRXZhbHVhdGlvbiBvZiB0aGUgcG9seW5vbWlhbCBhdCB0aGUgcm9vdHM6ICIgPDwgZXZhbHVhdGlvbi50cmFuc3Bvc2UoKTsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9TWUNML0N3aXNlTXVsLmNwcCBiL3Vuc3VwcG9ydGVkL2RvYy9leGFtcGxlcy9TWUNML0N3aXNlTXVsLmNwcAppbmRleCBhN2MzMzE0Li5lYWM1YjQ2IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC9kb2MvZXhhbXBsZXMvU1lDTC9Dd2lzZU11bC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvZG9jL2V4YW1wbGVzL1NZQ0wvQ3dpc2VNdWwuY3BwCkBAIC03LDggKzcsNyBAQAogdXNpbmcgRWlnZW46OlRlbnNvcjsKIHVzaW5nIEVpZ2VuOjpUZW5zb3JNYXA7CiAKLWludCBtYWluKCkKLXsKK2ludCBtYWluKCkgewogICB1c2luZyBEYXRhVHlwZSA9IGZsb2F0OwogICB1c2luZyBJbmRleFR5cGUgPSBpbnQ2NF90OwogICBjb25zdGV4cHIgYXV0byBEYXRhTGF5b3V0ID0gRWlnZW46OlJvd01ham9yOwpAQCAtMTcsNyArMTYsNyBAQAogICBjb25zdCBhdXRvIGRldmljZV9zZWxlY3RvciA9ICpkZXZpY2VzLmJlZ2luKCk7CiAgIEVpZ2VuOjpRdWV1ZUludGVyZmFjZSBxdWV1ZUludGVyZmFjZShkZXZpY2Vfc2VsZWN0b3IpOwogICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKLSAgCisKICAgLy8gY3JlYXRlIHRoZSB0ZW5zb3JzIHRvIGJlIHVzZWQgaW4gdGhlIG9wZXJhdGlvbgogICBJbmRleFR5cGUgc2l6ZURpbTEgPSAzOwogICBJbmRleFR5cGUgc2l6ZURpbTIgPSAzOwpAQCAtMjUsMzcgKzI0LDM4IEBACiAgIGFycmF5PEluZGV4VHlwZSwgMz4gdGVuc29yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTN9fTsKIAogICAvLyBpbml0aWFsaXplIHRoZSB0ZW5zb3JzIHdpdGggdGhlIGRhdGEgd2Ugd2FudCBtYW5pcHVsYXRlIHRvCi0gIFRlbnNvcjxEYXRhVHlwZSwgMyxEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGluMSh0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMyxEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGluMih0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMyxEYXRhTGF5b3V0LCBJbmRleFR5cGU+IG91dCh0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBpbjEodGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW4yKHRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IG91dCh0ZW5zb3JSYW5nZSk7CiAKICAgLy8gc2V0IHVwIHNvbWUgcmFuZG9tIGRhdGEgaW4gdGhlIHRlbnNvcnMgdG8gYmUgbXVsdGlwbGllZAogICBpbjEgPSBpbjEucmFuZG9tKCk7CiAgIGluMiA9IGluMi5yYW5kb20oKTsKIAogICAvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0ZW5zb3JzCi0gIERhdGFUeXBlICogZ3B1X2luMV9kYXRhICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4xLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlICogZ3B1X2luMl9kYXRhICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlICogZ3B1X291dF9kYXRhID0gIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0LnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW4xX2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluMS5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW4yX2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluMi5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG91dC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAKLSAgLy8gCisgIC8vCiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9pbjEoZ3B1X2luMV9kYXRhLCB0ZW5zb3JSYW5nZSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9pbjIoZ3B1X2luMl9kYXRhLCB0ZW5zb3JSYW5nZSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9vdXQoZ3B1X291dF9kYXRhLCB0ZW5zb3JSYW5nZSk7CiAKICAgLy8gY29weSB0aGUgbWVtb3J5IHRvIHRoZSBkZXZpY2UgYW5kIGRvIHRoZSBjPWEqYiBjYWxjdWxhdGlvbgotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luMV9kYXRhLCBpbjEuZGF0YSgpLChpbjEuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjJfZGF0YSwgaW4yLmRhdGEoKSwoaW4yLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW4xX2RhdGEsIGluMS5kYXRhKCksIChpbjEuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luMl9kYXRhLCBpbjIuZGF0YSgpLCAoaW4yLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgZ3B1X291dC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2luMSAqIGdwdV9pbjI7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfb3V0X2RhdGEsKG91dC5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X291dF9kYXRhLCAob3V0LnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgc3ljbF9kZXZpY2Uuc3luY2hyb25pemUoKTsKIAogICAvLyBwcmludCBvdXQgdGhlIHJlc3VsdHMKLSAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgc2l6ZURpbTE7ICsraSkgeworICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IHNpemVEaW0xOyArK2kpIHsKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IHNpemVEaW0yOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgc2l6ZURpbTM7ICsraykgewotICAgICAgICBzdGQ6OmNvdXQgPDwgImRldmljZV9vdXQiIDw8ICIoIiA8PCBpIDw8ICIsICIgPDwgaiA8PCAiLCAiIDw8IGsgPDwgIikgOiAiIDw8IG91dChpLGosaykgCi0gICAgICAgICAgICAgICAgICA8PCAiIHZzIGhvc3Rfb3V0IiA8PCAiKCIgPDwgaSA8PCAiLCAiIDw8IGogPDwgIiwgIiA8PCBrIDw8ICIpIDogIiA8PCBpbjEoaSxqLGspICogaW4yKGksaixrKSA8PCAiXG4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgImRldmljZV9vdXQiCisgICAgICAgICAgICAgICAgICA8PCAiKCIgPDwgaSA8PCAiLCAiIDw8IGogPDwgIiwgIiA8PCBrIDw8ICIpIDogIiA8PCBvdXQoaSwgaiwgaykgPDwgIiB2cyBob3N0X291dCIKKyAgICAgICAgICAgICAgICAgIDw8ICIoIiA8PCBpIDw8ICIsICIgPDwgaiA8PCAiLCAiIDw8IGsgPDwgIikgOiAiIDw8IGluMShpLCBqLCBrKSAqIGluMihpLCBqLCBrKSA8PCAiXG4iOwogICAgICAgfQogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9CVkguY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9CVkguY3BwCmluZGV4IGQ4YzM5ZDUuLjU0ZWNjNWMgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvQlZILmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L0JWSC5jcHAKQEAgLTE0LDE1ICsxNCwxNiBAQAogCiBuYW1lc3BhY2UgRWlnZW4gewogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBEaW0+IEFsaWduZWRCb3g8U2NhbGFyLCBEaW0+IGJvdW5kaW5nX2JveChjb25zdCBNYXRyaXg8U2NhbGFyLCBEaW0sIDE+ICZ2KSB7IHJldHVybiBBbGlnbmVkQm94PFNjYWxhciwgRGltPih2KTsgfQotCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGltPgorQWxpZ25lZEJveDxTY2FsYXIsIERpbT4gYm91bmRpbmdfYm94KGNvbnN0IE1hdHJpeDxTY2FsYXIsIERpbSwgMT4gJnYpIHsKKyAgcmV0dXJuIEFsaWduZWRCb3g8U2NhbGFyLCBEaW0+KHYpOwogfQogCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KIAotdGVtcGxhdGU8aW50IERpbT4KLXN0cnVjdCBCYWxsCi17Ci1FSUdFTl9NQUtFX0FMSUdORURfT1BFUkFUT1JfTkVXX0lGX1ZFQ1RPUklaQUJMRV9GSVhFRF9TSVpFKGRvdWJsZSwgRGltKQordGVtcGxhdGUgPGludCBEaW0+CitzdHJ1Y3QgQmFsbCB7CisgIEVJR0VOX01BS0VfQUxJR05FRF9PUEVSQVRPUl9ORVdfSUZfVkVDVE9SSVpBQkxFX0ZJWEVEX1NJWkUoZG91YmxlLCBEaW0pCiAKICAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLCBEaW0sIDE+IFZlY3RvclR5cGU7CiAKQEAgLTMyLDEzICszMywxNiBAQAogICBWZWN0b3JUeXBlIGNlbnRlcjsKICAgZG91YmxlIHJhZGl1czsKIH07Ci10ZW1wbGF0ZTxpbnQgRGltPiBBbGlnbmVkQm94PGRvdWJsZSwgRGltPiBib3VuZGluZ19ib3goY29uc3QgQmFsbDxEaW0+ICZiKQoteyByZXR1cm4gQWxpZ25lZEJveDxkb3VibGUsIERpbT4oYi5jZW50ZXIuYXJyYXkoKSAtIGIucmFkaXVzLCBiLmNlbnRlci5hcnJheSgpICsgYi5yYWRpdXMpOyB9Cit0ZW1wbGF0ZSA8aW50IERpbT4KK0FsaWduZWRCb3g8ZG91YmxlLCBEaW0+IGJvdW5kaW5nX2JveChjb25zdCBCYWxsPERpbT4gJmIpIHsKKyAgcmV0dXJuIEFsaWduZWRCb3g8ZG91YmxlLCBEaW0+KGIuY2VudGVyLmFycmF5KCkgLSBiLnJhZGl1cywgYi5jZW50ZXIuYXJyYXkoKSArIGIucmFkaXVzKTsKK30KIAogaW5saW5lIGRvdWJsZSBTUVIoZG91YmxlIHgpIHsgcmV0dXJuIHggKiB4OyB9CiAKLXRlbXBsYXRlPGludCBEaW0+Ci1zdHJ1Y3QgQmFsbFBvaW50U3R1ZmYgLy90aGlzIGNsYXNzIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBiZSBib3RoIGFuIGludGVyc2VjdG9yIGFuZCBhIG1pbmltaXplciwgYm90aCBmb3IgYSBiYWxsIGFuZCBhIHBvaW50IGFuZCBmb3IgdHdvIHRyZWVzCit0ZW1wbGF0ZSA8aW50IERpbT4KK3N0cnVjdCBCYWxsUG9pbnRTdHVmZiAgLy8gdGhpcyBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbnMgdG8gYmUgYm90aCBhbiBpbnRlcnNlY3RvciBhbmQgYSBtaW5pbWl6ZXIsIGJvdGggZm9yIGEgYmFsbCBhbmQgYQorICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCBhbmQgZm9yIHR3byB0cmVlcwogewogICB0eXBlZGVmIGRvdWJsZSBTY2FsYXI7CiAgIHR5cGVkZWYgTWF0cml4PGRvdWJsZSwgRGltLCAxPiBWZWN0b3JUeXBlOwpAQCAtNDgsODAgKzUyLDExMCBAQAogICBCYWxsUG9pbnRTdHVmZigpIDogY2FsbHMoMCksIGNvdW50KDApIHt9CiAgIEJhbGxQb2ludFN0dWZmKGNvbnN0IFZlY3RvclR5cGUgJmluUCkgOiBwKGluUCksIGNhbGxzKDApLCBjb3VudCgwKSB7fQogCi0KLSAgYm9vbCBpbnRlcnNlY3RWb2x1bWUoY29uc3QgQm94VHlwZSAmcikgeyArK2NhbGxzOyByZXR1cm4gci5jb250YWlucyhwKTsgfQorICBib29sIGludGVyc2VjdFZvbHVtZShjb25zdCBCb3hUeXBlICZyKSB7CisgICAgKytjYWxsczsKKyAgICByZXR1cm4gci5jb250YWlucyhwKTsKKyAgfQogICBib29sIGludGVyc2VjdE9iamVjdChjb25zdCBCYWxsVHlwZSAmYikgewogICAgICsrY2FsbHM7Ci0gICAgaWYoKGIuY2VudGVyIC0gcCkuc3F1YXJlZE5vcm0oKSA8IFNRUihiLnJhZGl1cykpCi0gICAgICArK2NvdW50OwotICAgIHJldHVybiBmYWxzZTsgLy9jb250aW51ZQorICAgIGlmICgoYi5jZW50ZXIgLSBwKS5zcXVhcmVkTm9ybSgpIDwgU1FSKGIucmFkaXVzKSkgKytjb3VudDsKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBjb250aW51ZQogICB9CiAKLSAgYm9vbCBpbnRlcnNlY3RWb2x1bWVWb2x1bWUoY29uc3QgQm94VHlwZSAmcjEsIGNvbnN0IEJveFR5cGUgJnIyKSB7ICsrY2FsbHM7IHJldHVybiAhKHIxLmludGVyc2VjdGlvbihyMikpLmlzTnVsbCgpOyB9Ci0gIGJvb2wgaW50ZXJzZWN0Vm9sdW1lT2JqZWN0KGNvbnN0IEJveFR5cGUgJnIsIGNvbnN0IEJhbGxUeXBlICZiKSB7ICsrY2FsbHM7IHJldHVybiByLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKGIuY2VudGVyKSA8IFNRUihiLnJhZGl1cyk7IH0KLSAgYm9vbCBpbnRlcnNlY3RPYmplY3RWb2x1bWUoY29uc3QgQmFsbFR5cGUgJmIsIGNvbnN0IEJveFR5cGUgJnIpIHsgKytjYWxsczsgcmV0dXJuIHIuc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UoYi5jZW50ZXIpIDwgU1FSKGIucmFkaXVzKTsgfQotICBib29sIGludGVyc2VjdE9iamVjdE9iamVjdChjb25zdCBCYWxsVHlwZSAmYjEsIGNvbnN0IEJhbGxUeXBlICZiMil7CisgIGJvb2wgaW50ZXJzZWN0Vm9sdW1lVm9sdW1lKGNvbnN0IEJveFR5cGUgJnIxLCBjb25zdCBCb3hUeXBlICZyMikgewogICAgICsrY2FsbHM7Ci0gICAgaWYoKGIxLmNlbnRlciAtIGIyLmNlbnRlcikubm9ybSgpIDwgYjEucmFkaXVzICsgYjIucmFkaXVzKQotICAgICAgKytjb3VudDsKKyAgICByZXR1cm4gIShyMS5pbnRlcnNlY3Rpb24ocjIpKS5pc051bGwoKTsKKyAgfQorICBib29sIGludGVyc2VjdFZvbHVtZU9iamVjdChjb25zdCBCb3hUeXBlICZyLCBjb25zdCBCYWxsVHlwZSAmYikgeworICAgICsrY2FsbHM7CisgICAgcmV0dXJuIHIuc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UoYi5jZW50ZXIpIDwgU1FSKGIucmFkaXVzKTsKKyAgfQorICBib29sIGludGVyc2VjdE9iamVjdFZvbHVtZShjb25zdCBCYWxsVHlwZSAmYiwgY29uc3QgQm94VHlwZSAmcikgeworICAgICsrY2FsbHM7CisgICAgcmV0dXJuIHIuc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UoYi5jZW50ZXIpIDwgU1FSKGIucmFkaXVzKTsKKyAgfQorICBib29sIGludGVyc2VjdE9iamVjdE9iamVjdChjb25zdCBCYWxsVHlwZSAmYjEsIGNvbnN0IEJhbGxUeXBlICZiMikgeworICAgICsrY2FsbHM7CisgICAgaWYgKChiMS5jZW50ZXIgLSBiMi5jZW50ZXIpLm5vcm0oKSA8IGIxLnJhZGl1cyArIGIyLnJhZGl1cykgKytjb3VudDsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgYm9vbCBpbnRlcnNlY3RWb2x1bWVPYmplY3QoY29uc3QgQm94VHlwZSAmciwgY29uc3QgVmVjdG9yVHlwZSAmdikgeyArK2NhbGxzOyByZXR1cm4gci5jb250YWlucyh2KTsgfQotICBib29sIGludGVyc2VjdE9iamVjdE9iamVjdChjb25zdCBCYWxsVHlwZSAmYiwgY29uc3QgVmVjdG9yVHlwZSAmdil7CisgIGJvb2wgaW50ZXJzZWN0Vm9sdW1lT2JqZWN0KGNvbnN0IEJveFR5cGUgJnIsIGNvbnN0IFZlY3RvclR5cGUgJnYpIHsKICAgICArK2NhbGxzOwotICAgIGlmKChiLmNlbnRlciAtIHYpLnNxdWFyZWROb3JtKCkgPCBTUVIoYi5yYWRpdXMpKQotICAgICAgKytjb3VudDsKKyAgICByZXR1cm4gci5jb250YWlucyh2KTsKKyAgfQorICBib29sIGludGVyc2VjdE9iamVjdE9iamVjdChjb25zdCBCYWxsVHlwZSAmYiwgY29uc3QgVmVjdG9yVHlwZSAmdikgeworICAgICsrY2FsbHM7CisgICAgaWYgKChiLmNlbnRlciAtIHYpLnNxdWFyZWROb3JtKCkgPCBTUVIoYi5yYWRpdXMpKSArK2NvdW50OwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGRvdWJsZSBtaW5pbXVtT25Wb2x1bWUoY29uc3QgQm94VHlwZSAmcikgeyArK2NhbGxzOyByZXR1cm4gci5zcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZShwKTsgfQotICBkb3VibGUgbWluaW11bU9uT2JqZWN0KGNvbnN0IEJhbGxUeXBlICZiKSB7ICsrY2FsbHM7IHJldHVybiAoc3RkOjptYXgpKDAuLCAoYi5jZW50ZXIgLSBwKS5zcXVhcmVkTm9ybSgpIC0gU1FSKGIucmFkaXVzKSk7IH0KLSAgZG91YmxlIG1pbmltdW1PblZvbHVtZVZvbHVtZShjb25zdCBCb3hUeXBlICZyMSwgY29uc3QgQm94VHlwZSAmcjIpIHsgKytjYWxsczsgcmV0dXJuIHIxLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKHIyKTsgfQotICBkb3VibGUgbWluaW11bU9uVm9sdW1lT2JqZWN0KGNvbnN0IEJveFR5cGUgJnIsIGNvbnN0IEJhbGxUeXBlICZiKSB7ICsrY2FsbHM7IHJldHVybiBTUVIoKHN0ZDo6bWF4KSgwLiwgci5leHRlcmlvckRpc3RhbmNlKGIuY2VudGVyKSAtIGIucmFkaXVzKSk7IH0KLSAgZG91YmxlIG1pbmltdW1Pbk9iamVjdFZvbHVtZShjb25zdCBCYWxsVHlwZSAmYiwgY29uc3QgQm94VHlwZSAmcikgeyArK2NhbGxzOyByZXR1cm4gU1FSKChzdGQ6Om1heCkoMC4sIHIuZXh0ZXJpb3JEaXN0YW5jZShiLmNlbnRlcikgLSBiLnJhZGl1cykpOyB9Ci0gIGRvdWJsZSBtaW5pbXVtT25PYmplY3RPYmplY3QoY29uc3QgQmFsbFR5cGUgJmIxLCBjb25zdCBCYWxsVHlwZSAmYjIpeyArK2NhbGxzOyByZXR1cm4gU1FSKChzdGQ6Om1heCkoMC4sIChiMS5jZW50ZXIgLSBiMi5jZW50ZXIpLm5vcm0oKSAtIGIxLnJhZGl1cyAtIGIyLnJhZGl1cykpOyB9Ci0gIGRvdWJsZSBtaW5pbXVtT25Wb2x1bWVPYmplY3QoY29uc3QgQm94VHlwZSAmciwgY29uc3QgVmVjdG9yVHlwZSAmdikgeyArK2NhbGxzOyByZXR1cm4gci5zcXVhcmVkRXh0ZXJpb3JEaXN0YW5jZSh2KTsgfQotICBkb3VibGUgbWluaW11bU9uT2JqZWN0T2JqZWN0KGNvbnN0IEJhbGxUeXBlICZiLCBjb25zdCBWZWN0b3JUeXBlICZ2KXsgKytjYWxsczsgcmV0dXJuIFNRUigoc3RkOjptYXgpKDAuLCAoYi5jZW50ZXIgLSB2KS5ub3JtKCkgLSBiLnJhZGl1cykpOyB9CisgIGRvdWJsZSBtaW5pbXVtT25Wb2x1bWUoY29uc3QgQm94VHlwZSAmcikgeworICAgICsrY2FsbHM7CisgICAgcmV0dXJuIHIuc3F1YXJlZEV4dGVyaW9yRGlzdGFuY2UocCk7CisgIH0KKyAgZG91YmxlIG1pbmltdW1Pbk9iamVjdChjb25zdCBCYWxsVHlwZSAmYikgeworICAgICsrY2FsbHM7CisgICAgcmV0dXJuIChzdGQ6Om1heCkoMC4sIChiLmNlbnRlciAtIHApLnNxdWFyZWROb3JtKCkgLSBTUVIoYi5yYWRpdXMpKTsKKyAgfQorICBkb3VibGUgbWluaW11bU9uVm9sdW1lVm9sdW1lKGNvbnN0IEJveFR5cGUgJnIxLCBjb25zdCBCb3hUeXBlICZyMikgeworICAgICsrY2FsbHM7CisgICAgcmV0dXJuIHIxLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKHIyKTsKKyAgfQorICBkb3VibGUgbWluaW11bU9uVm9sdW1lT2JqZWN0KGNvbnN0IEJveFR5cGUgJnIsIGNvbnN0IEJhbGxUeXBlICZiKSB7CisgICAgKytjYWxsczsKKyAgICByZXR1cm4gU1FSKChzdGQ6Om1heCkoMC4sIHIuZXh0ZXJpb3JEaXN0YW5jZShiLmNlbnRlcikgLSBiLnJhZGl1cykpOworICB9CisgIGRvdWJsZSBtaW5pbXVtT25PYmplY3RWb2x1bWUoY29uc3QgQmFsbFR5cGUgJmIsIGNvbnN0IEJveFR5cGUgJnIpIHsKKyAgICArK2NhbGxzOworICAgIHJldHVybiBTUVIoKHN0ZDo6bWF4KSgwLiwgci5leHRlcmlvckRpc3RhbmNlKGIuY2VudGVyKSAtIGIucmFkaXVzKSk7CisgIH0KKyAgZG91YmxlIG1pbmltdW1Pbk9iamVjdE9iamVjdChjb25zdCBCYWxsVHlwZSAmYjEsIGNvbnN0IEJhbGxUeXBlICZiMikgeworICAgICsrY2FsbHM7CisgICAgcmV0dXJuIFNRUigoc3RkOjptYXgpKDAuLCAoYjEuY2VudGVyIC0gYjIuY2VudGVyKS5ub3JtKCkgLSBiMS5yYWRpdXMgLSBiMi5yYWRpdXMpKTsKKyAgfQorICBkb3VibGUgbWluaW11bU9uVm9sdW1lT2JqZWN0KGNvbnN0IEJveFR5cGUgJnIsIGNvbnN0IFZlY3RvclR5cGUgJnYpIHsKKyAgICArK2NhbGxzOworICAgIHJldHVybiByLnNxdWFyZWRFeHRlcmlvckRpc3RhbmNlKHYpOworICB9CisgIGRvdWJsZSBtaW5pbXVtT25PYmplY3RPYmplY3QoY29uc3QgQmFsbFR5cGUgJmIsIGNvbnN0IFZlY3RvclR5cGUgJnYpIHsKKyAgICArK2NhbGxzOworICAgIHJldHVybiBTUVIoKHN0ZDo6bWF4KSgwLiwgKGIuY2VudGVyIC0gdikubm9ybSgpIC0gYi5yYWRpdXMpKTsKKyAgfQogCiAgIFZlY3RvclR5cGUgcDsKICAgaW50IGNhbGxzOwogICBpbnQgY291bnQ7CiB9OwogCi0KLXRlbXBsYXRlPGludCBEaW0+Ci1zdHJ1Y3QgVHJlZVRlc3QKLXsKK3RlbXBsYXRlIDxpbnQgRGltPgorc3RydWN0IFRyZWVUZXN0IHsKICAgdHlwZWRlZiBNYXRyaXg8ZG91YmxlLCBEaW0sIDE+IFZlY3RvclR5cGU7CiAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VmVjdG9yVHlwZSwgYWxpZ25lZF9hbGxvY2F0b3I8VmVjdG9yVHlwZT4gPiBWZWN0b3JUeXBlTGlzdDsKICAgdHlwZWRlZiBCYWxsPERpbT4gQmFsbFR5cGU7CiAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8QmFsbFR5cGUsIGFsaWduZWRfYWxsb2NhdG9yPEJhbGxUeXBlPiA+IEJhbGxUeXBlTGlzdDsKICAgdHlwZWRlZiBBbGlnbmVkQm94PGRvdWJsZSwgRGltPiBCb3hUeXBlOwogCi0gIHZvaWQgdGVzdEludGVyc2VjdDEoKQotICB7CisgIHZvaWQgdGVzdEludGVyc2VjdDEoKSB7CiAgICAgQmFsbFR5cGVMaXN0IGI7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IDUwMDsgKytpKSB7Ci0gICAgICAgIGIucHVzaF9iYWNrKEJhbGxUeXBlKFZlY3RvclR5cGU6OlJhbmRvbSgpLCAwLjUgKiBpbnRlcm5hbDo6cmFuZG9tKDAuLCAxLikpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgKytpKSB7CisgICAgICBiLnB1c2hfYmFjayhCYWxsVHlwZShWZWN0b3JUeXBlOjpSYW5kb20oKSwgMC41ICogaW50ZXJuYWw6OnJhbmRvbSgwLiwgMS4pKSk7CiAgICAgfQogICAgIEtkQlZIPGRvdWJsZSwgRGltLCBCYWxsVHlwZT4gdHJlZShiLmJlZ2luKCksIGIuZW5kKCkpOwogCiAgICAgVmVjdG9yVHlwZSBwdCA9IFZlY3RvclR5cGU6OlJhbmRvbSgpOwogICAgIEJhbGxQb2ludFN0dWZmPERpbT4gaTEocHQpLCBpMihwdCk7CiAKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgKGludCliLnNpemUoKTsgKytpKQotICAgICAgaTEuaW50ZXJzZWN0T2JqZWN0KGJbaV0pOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCliLnNpemUoKTsgKytpKSBpMS5pbnRlcnNlY3RPYmplY3QoYltpXSk7CiAKICAgICBCVkludGVyc2VjdCh0cmVlLCBpMik7CiAKICAgICBWRVJJRlkoaTEuY291bnQgPT0gaTIuY291bnQpOwogICB9CiAKLSAgdm9pZCB0ZXN0TWluaW1pemUxKCkKLSAgeworICB2b2lkIHRlc3RNaW5pbWl6ZTEoKSB7CiAgICAgQmFsbFR5cGVMaXN0IGI7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IDUwMDsgKytpKSB7Ci0gICAgICAgIGIucHVzaF9iYWNrKEJhbGxUeXBlKFZlY3RvclR5cGU6OlJhbmRvbSgpLCAwLjAxICogaW50ZXJuYWw6OnJhbmRvbSgwLiwgMS4pKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDA7ICsraSkgeworICAgICAgYi5wdXNoX2JhY2soQmFsbFR5cGUoVmVjdG9yVHlwZTo6UmFuZG9tKCksIDAuMDEgKiBpbnRlcm5hbDo6cmFuZG9tKDAuLCAxLikpKTsKICAgICB9CiAgICAgS2RCVkg8ZG91YmxlLCBEaW0sIEJhbGxUeXBlPiB0cmVlKGIuYmVnaW4oKSwgYi5lbmQoKSk7CiAKQEAgLTEzMCwyMyArMTY0LDIwIEBACiAKICAgICBkb3VibGUgbTEgPSAoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgpKCksIG0yID0gbTE7CiAKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgKGludCliLnNpemUoKTsgKytpKQotICAgICAgbTEgPSAoc3RkOjptaW4pKG0xLCBpMS5taW5pbXVtT25PYmplY3QoYltpXSkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCliLnNpemUoKTsgKytpKSBtMSA9IChzdGQ6Om1pbikobTEsIGkxLm1pbmltdW1Pbk9iamVjdChiW2ldKSk7CiAKICAgICBtMiA9IEJWTWluaW1pemUodHJlZSwgaTIpOwogCiAgICAgVkVSSUZZX0lTX0FQUFJPWChtMSwgbTIpOwogICB9CiAKLSAgdm9pZCB0ZXN0SW50ZXJzZWN0MigpCi0gIHsKKyAgdm9pZCB0ZXN0SW50ZXJzZWN0MigpIHsKICAgICBCYWxsVHlwZUxpc3QgYjsKICAgICBWZWN0b3JUeXBlTGlzdCB2OwogCi0gICAgZm9yKGludCBpID0gMDsgaSA8IDUwOyArK2kpIHsKLSAgICAgICAgYi5wdXNoX2JhY2soQmFsbFR5cGUoVmVjdG9yVHlwZTo6UmFuZG9tKCksIDAuNSAqIGludGVybmFsOjpyYW5kb20oMC4sIDEuKSkpOwotICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgMzsgKytqKQotICAgICAgICAgICAgdi5wdXNoX2JhY2soVmVjdG9yVHlwZTo6UmFuZG9tKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTA7ICsraSkgeworICAgICAgYi5wdXNoX2JhY2soQmFsbFR5cGUoVmVjdG9yVHlwZTo6UmFuZG9tKCksIDAuNSAqIGludGVybmFsOjpyYW5kb20oMC4sIDEuKSkpOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHYucHVzaF9iYWNrKFZlY3RvclR5cGU6OlJhbmRvbSgpKTsKICAgICB9CiAKICAgICBLZEJWSDxkb3VibGUsIERpbSwgQmFsbFR5cGU+IHRyZWUoYi5iZWdpbigpLCBiLmVuZCgpKTsKQEAgLTE1NCwyNCArMTg1LDIxIEBACiAKICAgICBCYWxsUG9pbnRTdHVmZjxEaW0+IGkxLCBpMjsKIAotICAgIGZvcihpbnQgaSA9IDA7IGkgPCAoaW50KWIuc2l6ZSgpOyArK2kpCi0gICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCAoaW50KXYuc2l6ZSgpOyArK2opCi0gICAgICAgICAgICBpMS5pbnRlcnNlY3RPYmplY3RPYmplY3QoYltpXSwgdltqXSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KWIuc2l6ZSgpOyArK2kpCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IChpbnQpdi5zaXplKCk7ICsraikgaTEuaW50ZXJzZWN0T2JqZWN0T2JqZWN0KGJbaV0sIHZbal0pOwogCiAgICAgQlZJbnRlcnNlY3QodHJlZSwgdlRyZWUsIGkyKTsKIAogICAgIFZFUklGWShpMS5jb3VudCA9PSBpMi5jb3VudCk7CiAgIH0KIAotICB2b2lkIHRlc3RNaW5pbWl6ZTIoKQotICB7CisgIHZvaWQgdGVzdE1pbmltaXplMigpIHsKICAgICBCYWxsVHlwZUxpc3QgYjsKICAgICBWZWN0b3JUeXBlTGlzdCB2OwogCi0gICAgZm9yKGludCBpID0gMDsgaSA8IDUwOyArK2kpIHsKLSAgICAgICAgYi5wdXNoX2JhY2soQmFsbFR5cGUoVmVjdG9yVHlwZTo6UmFuZG9tKCksIDFlLTcgKyAxZS02ICogaW50ZXJuYWw6OnJhbmRvbSgwLiwgMS4pKSk7Ci0gICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCAzOyArK2opCi0gICAgICAgICAgICB2LnB1c2hfYmFjayhWZWN0b3JUeXBlOjpSYW5kb20oKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgKytpKSB7CisgICAgICBiLnB1c2hfYmFjayhCYWxsVHlwZShWZWN0b3JUeXBlOjpSYW5kb20oKSwgMWUtNyArIDFlLTYgKiBpbnRlcm5hbDo6cmFuZG9tKDAuLCAxLikpKTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB2LnB1c2hfYmFjayhWZWN0b3JUeXBlOjpSYW5kb20oKSk7CiAgICAgfQogCiAgICAgS2RCVkg8ZG91YmxlLCBEaW0sIEJhbGxUeXBlPiB0cmVlKGIuYmVnaW4oKSwgYi5lbmQoKSk7CkBAIC0xODEsOSArMjA5LDggQEAKIAogICAgIGRvdWJsZSBtMSA9IChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCkoKSwgbTIgPSBtMTsKIAotICAgIGZvcihpbnQgaSA9IDA7IGkgPCAoaW50KWIuc2l6ZSgpOyArK2kpCi0gICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCAoaW50KXYuc2l6ZSgpOyArK2opCi0gICAgICAgICAgICBtMSA9IChzdGQ6Om1pbikobTEsIGkxLm1pbmltdW1Pbk9iamVjdE9iamVjdChiW2ldLCB2W2pdKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KWIuc2l6ZSgpOyArK2kpCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IChpbnQpdi5zaXplKCk7ICsraikgbTEgPSAoc3RkOjptaW4pKG0xLCBpMS5taW5pbXVtT25PYmplY3RPYmplY3QoYltpXSwgdltqXSkpOwogCiAgICAgbTIgPSBCVk1pbmltaXplKHRyZWUsIHZUcmVlLCBpMik7CiAKQEAgLTE5MSwxMCArMjE4LDggQEAKICAgfQogfTsKIAotCi1FSUdFTl9ERUNMQVJFX1RFU1QoQlZIKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworRUlHRU5fREVDTEFSRV9URVNUKEJWSCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKICNpZmRlZiBFSUdFTl9URVNUX1BBUlRfMQogICAgIFRyZWVUZXN0PDI+IHRlc3QyOwogICAgIENBTExfU1VCVEVTVCh0ZXN0Mi50ZXN0SW50ZXJzZWN0MSgpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvRXVsZXJBbmdsZXMuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9FdWxlckFuZ2xlcy5jcHAKaW5kZXggODQ1MjU3Ny4uYTY1ZTVmNSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9FdWxlckFuZ2xlcy5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9FdWxlckFuZ2xlcy5jcHAKQEAgLTE3LDY3ICsxNyw1NSBAQAogCiAvLyBVbmZvcnR1bmF0ZWx5LCB3ZSBuZWVkIHRvIHNwZWNpYWxpemUgaXQgaW4gb3JkZXIgdG8gd29yay4gKFdlIGNvdWxkIGFkZCBpdCBpbiBtYWluLmggdGVzdCBmcmFtZXdvcmspCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBjbGFzcyBTeXN0ZW0+Ci1ib29sIHZlcmlmeUlzQXBwcm94KGNvbnN0IEVpZ2VuOjpFdWxlckFuZ2xlczxTY2FsYXIsIFN5c3RlbT4mIGEsIGNvbnN0IEVpZ2VuOjpFdWxlckFuZ2xlczxTY2FsYXIsIFN5c3RlbT4mIGIpCi17Citib29sIHZlcmlmeUlzQXBwcm94KGNvbnN0IEVpZ2VuOjpFdWxlckFuZ2xlczxTY2FsYXIsIFN5c3RlbT4mIGEsIGNvbnN0IEVpZ2VuOjpFdWxlckFuZ2xlczxTY2FsYXIsIFN5c3RlbT4mIGIpIHsKICAgcmV0dXJuIHZlcmlmeUlzQXBwcm94KGEuYW5nbGVzKCksIGIuYW5nbGVzKCkpOwogfQogCiAvLyBWZXJpZnkgdGhhdCB4IGlzIGluIHRoZSBhcHByb3hlZCByYW5nZSBbYSwgYl0KLSNkZWZpbmUgVkVSSUZZX0FQUFJPWEVEX1JBTkdFKGEsIHgsIGIpIFwKLSAgZG8geyBcCi0gIFZFUklGWV9JU19BUFBST1hfT1JfTEVTU19USEFOKGEsIHgpOyBcCi0gIFZFUklGWV9JU19BUFBST1hfT1JfTEVTU19USEFOKHgsIGIpOyBcCi0gIH0gd2hpbGUoMCkKKyNkZWZpbmUgVkVSSUZZX0FQUFJPWEVEX1JBTkdFKGEsIHgsIGIpICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVkVSSUZZX0lTX0FQUFJPWF9PUl9MRVNTX1RIQU4oYSwgeCk7IFwKKyAgICBWRVJJRllfSVNfQVBQUk9YX09SX0xFU1NfVEhBTih4LCBiKTsgXAorICB9IHdoaWxlICgwKQogCiBjb25zdCBjaGFyIFggPSBFVUxFUl9YOwogY29uc3QgY2hhciBZID0gRVVMRVJfWTsKIGNvbnN0IGNoYXIgWiA9IEVVTEVSX1o7CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgY2xhc3MgRXVsZXJTeXN0ZW0+Ci12b2lkIHZlcmlmeV9ldWxlcihjb25zdCBFdWxlckFuZ2xlczxTY2FsYXIsIEV1bGVyU3lzdGVtPiYgZSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGNsYXNzIEV1bGVyU3lzdGVtPgordm9pZCB2ZXJpZnlfZXVsZXIoY29uc3QgRXVsZXJBbmdsZXM8U2NhbGFyLCBFdWxlclN5c3RlbT4mIGUpIHsKICAgdHlwZWRlZiBFdWxlckFuZ2xlczxTY2FsYXIsIEV1bGVyU3lzdGVtPiBFdWxlckFuZ2xlc1R5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDM+IE1hdHJpeDM7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhciwzLDE+IFZlY3RvcjM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMz4gTWF0cml4MzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAzLCAxPiBWZWN0b3IzOwogICB0eXBlZGVmIFF1YXRlcm5pb248U2NhbGFyPiBRdWF0ZXJuaW9uVHlwZTsKICAgdHlwZWRlZiBBbmdsZUF4aXM8U2NhbGFyPiBBbmdsZUF4aXNUeXBlOwotICAKKwogICBjb25zdCBTY2FsYXIgT05FID0gU2NhbGFyKDEpOwogICBjb25zdCBTY2FsYXIgSEFMRl9QSSA9IFNjYWxhcihFSUdFTl9QSSAvIDIpOwogICBjb25zdCBTY2FsYXIgUEkgPSBTY2FsYXIoRUlHRU5fUEkpOwotICAKKwogICAvLyBJdCdzIHZlcnkgaW1wb3J0YW50IGNhbGMgdGhlIGFjY2VwdGFibGUgcHJlY2lzaW9uIGRlcGVuZGluZyBvbiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgcG9sZS4KLSAgY29uc3QgU2NhbGFyIGxvbmdpdHVkZVJhZGl1cyA9IHN0ZDo6YWJzKAotICAgIEV1bGVyU3lzdGVtOjpJc1RhaXRCcnlhbiA/Ci0gICAgc3RkOjpjb3MoZS5iZXRhKCkpIDoKLSAgICBzdGQ6OnNpbihlLmJldGEoKSkKLSAgICApOworICBjb25zdCBTY2FsYXIgbG9uZ2l0dWRlUmFkaXVzID0gc3RkOjphYnMoRXVsZXJTeXN0ZW06OklzVGFpdEJyeWFuID8gc3RkOjpjb3MoZS5iZXRhKCkpIDogc3RkOjpzaW4oZS5iZXRhKCkpKTsKICAgU2NhbGFyIHByZWNpc2lvbiA9IHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSAvIGxvbmdpdHVkZVJhZGl1czsKLSAgCisKICAgU2NhbGFyIGJldGFSYW5nZVN0YXJ0LCBiZXRhUmFuZ2VFbmQ7Ci0gIGlmIChFdWxlclN5c3RlbTo6SXNUYWl0QnJ5YW4pCi0gIHsKKyAgaWYgKEV1bGVyU3lzdGVtOjpJc1RhaXRCcnlhbikgewogICAgIGJldGFSYW5nZVN0YXJ0ID0gLUhBTEZfUEk7CiAgICAgYmV0YVJhbmdlRW5kID0gSEFMRl9QSTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBpZiAoIUV1bGVyU3lzdGVtOjpJc0JldGFPcHBvc2l0ZSkKLSAgICB7CisgIH0gZWxzZSB7CisgICAgaWYgKCFFdWxlclN5c3RlbTo6SXNCZXRhT3Bwb3NpdGUpIHsKICAgICAgIGJldGFSYW5nZVN0YXJ0ID0gMDsKICAgICAgIGJldGFSYW5nZUVuZCA9IFBJOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICBiZXRhUmFuZ2VTdGFydCA9IC1QSTsKICAgICAgIGJldGFSYW5nZUVuZCA9IDA7CiAgICAgfQogICB9Ci0gIAorCiAgIGNvbnN0IFZlY3RvcjMgSV8gPSBFdWxlckFuZ2xlc1R5cGU6OkFscGhhQXhpc1ZlY3RvcigpOwogICBjb25zdCBWZWN0b3IzIEpfID0gRXVsZXJBbmdsZXNUeXBlOjpCZXRhQXhpc1ZlY3RvcigpOwogICBjb25zdCBWZWN0b3IzIEtfID0gRXVsZXJBbmdsZXNUeXBlOjpHYW1tYUF4aXNWZWN0b3IoKTsKLSAgCisKICAgLy8gSXMgYXBwcm94IGNoZWNrcwogICBWRVJJRlkoZS5pc0FwcHJveChlKSk7CiAgIFZFUklGWV9JU19BUFBST1goZSwgZSk7CkBAIC04NywxOSArNzUsMTkgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChTY2FsYXIobS5kZXRlcm1pbmFudCgpKSwgT05FKTsKIAogICBFdWxlckFuZ2xlc1R5cGUgZWJpcyhtKTsKLSAgCisKICAgLy8gV2hlbiBubyByb2xsKGFjdGluZyBsaWtlIHBvbGFyIHJlcHJlc2VudGF0aW9uKSwgd2UgaGF2ZSB0aGUgYmVzdCBwcmVjaXNpb24uCiAgIC8vIE9uZSBvZiB0aG9zZSBjYXNlcyBpcyB3aGVuIHRoZSBFdWxlciBhbmdsZXMgYXJlIG9uIHRoZSBwb2xlLCBhbmQgYmVjYXVzZSBpdCdzIHNpbmd1bGFyIGNhc2UsCiAgIC8vICB0aGUgY29tcHV0YXRpb24gcmV0dXJucyBubyByb2xsLgotICBpZiAoZWJpcy5iZXRhKCkgPT0gMCkKLSAgICBwcmVjaXNpb24gPSB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCk7Ci0gIAorICBpZiAoZWJpcy5iZXRhKCkgPT0gMCkgcHJlY2lzaW9uID0gdGVzdF9wcmVjaXNpb248U2NhbGFyPigpOworCiAgIC8vIENoZWNrIHRoYXQgZWFiaXMgaW4gcmFuZ2UKICAgVkVSSUZZX0FQUFJPWEVEX1JBTkdFKC1QSSwgZWJpcy5hbHBoYSgpLCBQSSk7CiAgIFZFUklGWV9BUFBST1hFRF9SQU5HRShiZXRhUmFuZ2VTdGFydCwgZWJpcy5iZXRhKCksIGJldGFSYW5nZUVuZCk7CiAgIFZFUklGWV9BUFBST1hFRF9SQU5HRSgtUEksIGViaXMuZ2FtbWEoKSwgUEkpOwogCi0gIGNvbnN0IE1hdHJpeDMgbWJpcyhBbmdsZUF4aXNUeXBlKGViaXMuYWxwaGEoKSwgSV8pICogQW5nbGVBeGlzVHlwZShlYmlzLmJldGEoKSwgSl8pICogQW5nbGVBeGlzVHlwZShlYmlzLmdhbW1hKCksIEtfKSk7CisgIGNvbnN0IE1hdHJpeDMgbWJpcyhBbmdsZUF4aXNUeXBlKGViaXMuYWxwaGEoKSwgSV8pICogQW5nbGVBeGlzVHlwZShlYmlzLmJldGEoKSwgSl8pICoKKyAgICAgICAgICAgICAgICAgICAgIEFuZ2xlQXhpc1R5cGUoZWJpcy5nYW1tYSgpLCBLXykpOwogICBWRVJJRllfSVNfQVBQUk9YKFNjYWxhcihtYmlzLmRldGVybWluYW50KCkpLCBPTkUpOwogICBWRVJJRllfSVNfQVBQUk9YKG1iaXMsIGViaXMudG9Sb3RhdGlvbk1hdHJpeCgpKTsKICAgLypzdGQ6OmNvdXQgPDwgIj09PT09PT09PT09PT09PT09PT1cbiIgPDwKQEAgLTEyMCwxMDQgKzEwOCwxMDEgQEAKICAgLy8gVE9ETzogTWFrZSB0aGlzIHRlc3Qgd29yayB3ZWxsLCBhbmQgdXNlIHJhbmdlIHNhdHVyYXRpb24gZnVuY3Rpb24uCiAgIC8qLy8gSWYgST09SywgYW5kIGVhWzFdPT0wLCB0aGVuIHRoZXJlIG5vIHVuaXF1ZSBzb2x1dGlvbi4KICAgLy8gVGhlIHJlbWFyayBhcHBseSBpbiB0aGUgY2FzZSB3aGVyZSBJIT1LLCBhbmQgfGVhWzFdfCBpcyBjbG9zZSB0byArLXBpLzIuCi0gIGlmKCAoaSE9ayB8fCBlYVsxXSE9MCkgJiYgKGk9PWsgfHwgIWludGVybmFsOjppc0FwcHJveChhYnMoZWFbMV0pLFNjYWxhcihFSUdFTl9QSS8yKSx0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkpKSApIAorICBpZiggKGkhPWsgfHwgZWFbMV0hPTApICYmIChpPT1rIHx8ICFpbnRlcm5hbDo6aXNBcHByb3goYWJzKGVhWzFdKSxTY2FsYXIoRUlHRU5fUEkvMiksdGVzdF9wcmVjaXNpb248U2NhbGFyPigpKSkgKQogICAgICAgVkVSSUZZX0lTX0FQUFJPWChlYSwgZWFiaXMpOyovCi0gIAorCiAgIC8vIFF1YXRlcm5pb25zCiAgIGNvbnN0IFF1YXRlcm5pb25UeXBlIHEoZSk7CiAgIGViaXMgPSBxOwogICBjb25zdCBRdWF0ZXJuaW9uVHlwZSBxYmlzKGViaXMpOwogICBWRVJJRlkoaW50ZXJuYWw6OmlzQXBwcm94PFNjYWxhcj4oc3RkOjphYnMocS5kb3QocWJpcykpLCBPTkUsIHByZWNpc2lvbikpOwotICAvL1ZFUklGWV9JU19BUFBST1goZWFiaXMsIGVhYmlzMik7Ly8gVmVyaWZ5IHRoYXQgdGhlIGV1bGVyIGFuZ2xlcyBhcmUgc3RpbGwgdGhlIHNhbWUKLSAgCisgIC8vIFZFUklGWV9JU19BUFBST1goZWFiaXMsIGVhYmlzMik7Ly8gVmVyaWZ5IHRoYXQgdGhlIGV1bGVyIGFuZ2xlcyBhcmUgc3RpbGwgdGhlIHNhbWUKKwogICAvLyBBIHN1Z2dlc3Rpb24gZm9yIHNpbXBsZSBwcm9kdWN0IHRlc3Qgd2hlbiB3aWxsIGJlIHN1cHBvcnRlZC4KICAgLypFdWxlckFuZ2xlc1R5cGUgZTIoUEkvMiwgUEkvMiwgUEkvMik7CiAgIE1hdHJpeDMgbTIoZTIpOwogICBWRVJJRllfSVNfQVBQUk9YKGUqZTIsIG0qbTIpOyovCiB9CiAKLXRlbXBsYXRlPHNpZ25lZCBjaGFyIEEsIHNpZ25lZCBjaGFyIEIsIHNpZ25lZCBjaGFyIEMsIHR5cGVuYW1lIFNjYWxhcj4KLXZvaWQgdmVyaWZ5X2V1bGVyX3ZlYyhjb25zdCBNYXRyaXg8U2NhbGFyLDMsMT4mIGVhKQotewordGVtcGxhdGUgPHNpZ25lZCBjaGFyIEEsIHNpZ25lZCBjaGFyIEIsIHNpZ25lZCBjaGFyIEMsIHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgdmVyaWZ5X2V1bGVyX3ZlYyhjb25zdCBNYXRyaXg8U2NhbGFyLCAzLCAxPiYgZWEpIHsKICAgdmVyaWZ5X2V1bGVyKEV1bGVyQW5nbGVzPFNjYWxhciwgRXVsZXJTeXN0ZW08QSwgQiwgQz4gPihlYVswXSwgZWFbMV0sIGVhWzJdKSk7CiB9CiAKLXRlbXBsYXRlPHNpZ25lZCBjaGFyIEEsIHNpZ25lZCBjaGFyIEIsIHNpZ25lZCBjaGFyIEMsIHR5cGVuYW1lIFNjYWxhcj4KLXZvaWQgdmVyaWZ5X2V1bGVyX2FsbF9uZWcoY29uc3QgTWF0cml4PFNjYWxhciwzLDE+JiBlYSkKLXsKLSAgdmVyaWZ5X2V1bGVyX3ZlYzwrQSwrQiwrQz4oZWEpOwotICB2ZXJpZnlfZXVsZXJfdmVjPCtBLCtCLC1DPihlYSk7Ci0gIHZlcmlmeV9ldWxlcl92ZWM8K0EsLUIsK0M+KGVhKTsKLSAgdmVyaWZ5X2V1bGVyX3ZlYzwrQSwtQiwtQz4oZWEpOwotICAKLSAgdmVyaWZ5X2V1bGVyX3ZlYzwtQSwrQiwrQz4oZWEpOwotICB2ZXJpZnlfZXVsZXJfdmVjPC1BLCtCLC1DPihlYSk7Ci0gIHZlcmlmeV9ldWxlcl92ZWM8LUEsLUIsK0M+KGVhKTsKLSAgdmVyaWZ5X2V1bGVyX3ZlYzwtQSwtQiwtQz4oZWEpOwordGVtcGxhdGUgPHNpZ25lZCBjaGFyIEEsIHNpZ25lZCBjaGFyIEIsIHNpZ25lZCBjaGFyIEMsIHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgdmVyaWZ5X2V1bGVyX2FsbF9uZWcoY29uc3QgTWF0cml4PFNjYWxhciwgMywgMT4mIGVhKSB7CisgIHZlcmlmeV9ldWxlcl92ZWM8K0EsICtCLCArQz4oZWEpOworICB2ZXJpZnlfZXVsZXJfdmVjPCtBLCArQiwgLUM+KGVhKTsKKyAgdmVyaWZ5X2V1bGVyX3ZlYzwrQSwgLUIsICtDPihlYSk7CisgIHZlcmlmeV9ldWxlcl92ZWM8K0EsIC1CLCAtQz4oZWEpOworCisgIHZlcmlmeV9ldWxlcl92ZWM8LUEsICtCLCArQz4oZWEpOworICB2ZXJpZnlfZXVsZXJfdmVjPC1BLCArQiwgLUM+KGVhKTsKKyAgdmVyaWZ5X2V1bGVyX3ZlYzwtQSwgLUIsICtDPihlYSk7CisgIHZlcmlmeV9ldWxlcl92ZWM8LUEsIC1CLCAtQz4oZWEpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgY2hlY2tfYWxsX3Zhcihjb25zdCBNYXRyaXg8U2NhbGFyLDMsMT4mIGVhKQotewotICB2ZXJpZnlfZXVsZXJfYWxsX25lZzxYLFksWj4oZWEpOwotICB2ZXJpZnlfZXVsZXJfYWxsX25lZzxYLFksWD4oZWEpOwotICB2ZXJpZnlfZXVsZXJfYWxsX25lZzxYLFosWT4oZWEpOwotICB2ZXJpZnlfZXVsZXJfYWxsX25lZzxYLFosWD4oZWEpOwotICAKLSAgdmVyaWZ5X2V1bGVyX2FsbF9uZWc8WSxaLFg+KGVhKTsKLSAgdmVyaWZ5X2V1bGVyX2FsbF9uZWc8WSxaLFk+KGVhKTsKLSAgdmVyaWZ5X2V1bGVyX2FsbF9uZWc8WSxYLFo+KGVhKTsKLSAgdmVyaWZ5X2V1bGVyX2FsbF9uZWc8WSxYLFk+KGVhKTsKLSAgCi0gIHZlcmlmeV9ldWxlcl9hbGxfbmVnPFosWCxZPihlYSk7Ci0gIHZlcmlmeV9ldWxlcl9hbGxfbmVnPFosWCxaPihlYSk7Ci0gIHZlcmlmeV9ldWxlcl9hbGxfbmVnPFosWSxYPihlYSk7Ci0gIHZlcmlmeV9ldWxlcl9hbGxfbmVnPFosWSxaPihlYSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBjaGVja19hbGxfdmFyKGNvbnN0IE1hdHJpeDxTY2FsYXIsIDMsIDE+JiBlYSkgeworICB2ZXJpZnlfZXVsZXJfYWxsX25lZzxYLCBZLCBaPihlYSk7CisgIHZlcmlmeV9ldWxlcl9hbGxfbmVnPFgsIFksIFg+KGVhKTsKKyAgdmVyaWZ5X2V1bGVyX2FsbF9uZWc8WCwgWiwgWT4oZWEpOworICB2ZXJpZnlfZXVsZXJfYWxsX25lZzxYLCBaLCBYPihlYSk7CisKKyAgdmVyaWZ5X2V1bGVyX2FsbF9uZWc8WSwgWiwgWD4oZWEpOworICB2ZXJpZnlfZXVsZXJfYWxsX25lZzxZLCBaLCBZPihlYSk7CisgIHZlcmlmeV9ldWxlcl9hbGxfbmVnPFksIFgsIFo+KGVhKTsKKyAgdmVyaWZ5X2V1bGVyX2FsbF9uZWc8WSwgWCwgWT4oZWEpOworCisgIHZlcmlmeV9ldWxlcl9hbGxfbmVnPFosIFgsIFk+KGVhKTsKKyAgdmVyaWZ5X2V1bGVyX2FsbF9uZWc8WiwgWCwgWj4oZWEpOworICB2ZXJpZnlfZXVsZXJfYWxsX25lZzxaLCBZLCBYPihlYSk7CisgIHZlcmlmeV9ldWxlcl9hbGxfbmVnPFosIFksIFo+KGVhKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPiB2b2lkIGNoZWNrX3Npbmd1bGFyX2Nhc2VzKGNvbnN0IFNjYWxhciYgc2luZ3VsYXJCZXRhKQotewotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBWZWN0b3IzOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgY2hlY2tfc2luZ3VsYXJfY2FzZXMoY29uc3QgU2NhbGFyJiBzaW5ndWxhckJldGEpIHsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAzLCAxPiBWZWN0b3IzOwogICBjb25zdCBTY2FsYXIgUEkgPSBTY2FsYXIoRUlHRU5fUEkpOwotICAKLSAgZm9yIChTY2FsYXIgZXBzaWxvbiA9IE51bVRyYWl0czxTY2FsYXI+OjplcHNpbG9uKCk7IGVwc2lsb24gPCAxOyBlcHNpbG9uICo9IFNjYWxhcigxLjIpKQotICB7Ci0gICAgY2hlY2tfYWxsX3ZhcihWZWN0b3IzKFBJLzQsIHNpbmd1bGFyQmV0YSwgUEkvMykpOwotICAgIGNoZWNrX2FsbF92YXIoVmVjdG9yMyhQSS80LCBzaW5ndWxhckJldGEgLSBlcHNpbG9uLCBQSS8zKSk7Ci0gICAgY2hlY2tfYWxsX3ZhcihWZWN0b3IzKFBJLzQsIHNpbmd1bGFyQmV0YSAtIFNjYWxhcigxLjUpKmVwc2lsb24sIFBJLzMpKTsKLSAgICBjaGVja19hbGxfdmFyKFZlY3RvcjMoUEkvNCwgc2luZ3VsYXJCZXRhIC0gMiplcHNpbG9uLCBQSS8zKSk7Ci0gICAgY2hlY2tfYWxsX3ZhcihWZWN0b3IzKFBJKlNjYWxhcigwLjgpLCBzaW5ndWxhckJldGEgLSBlcHNpbG9uLCBTY2FsYXIoMC45KSpQSSkpOwotICAgIGNoZWNrX2FsbF92YXIoVmVjdG9yMyhQSSpTY2FsYXIoLTAuOSksIHNpbmd1bGFyQmV0YSArIGVwc2lsb24sIFBJKlNjYWxhcigwLjMpKSk7Ci0gICAgY2hlY2tfYWxsX3ZhcihWZWN0b3IzKFBJKlNjYWxhcigtMC42KSwgc2luZ3VsYXJCZXRhICsgU2NhbGFyKDEuNSkqZXBzaWxvbiwgUEkqU2NhbGFyKDAuMykpKTsKLSAgICBjaGVja19hbGxfdmFyKFZlY3RvcjMoUEkqU2NhbGFyKC0wLjUpLCBzaW5ndWxhckJldGEgKyAyKmVwc2lsb24sIFBJKlNjYWxhcigwLjQpKSk7Ci0gICAgY2hlY2tfYWxsX3ZhcihWZWN0b3IzKFBJKlNjYWxhcigwLjkpLCBzaW5ndWxhckJldGEgKyBlcHNpbG9uLCBTY2FsYXIoMC44KSpQSSkpOworCisgIGZvciAoU2NhbGFyIGVwc2lsb24gPSBOdW1UcmFpdHM8U2NhbGFyPjo6ZXBzaWxvbigpOyBlcHNpbG9uIDwgMTsgZXBzaWxvbiAqPSBTY2FsYXIoMS4yKSkgeworICAgIGNoZWNrX2FsbF92YXIoVmVjdG9yMyhQSSAvIDQsIHNpbmd1bGFyQmV0YSwgUEkgLyAzKSk7CisgICAgY2hlY2tfYWxsX3ZhcihWZWN0b3IzKFBJIC8gNCwgc2luZ3VsYXJCZXRhIC0gZXBzaWxvbiwgUEkgLyAzKSk7CisgICAgY2hlY2tfYWxsX3ZhcihWZWN0b3IzKFBJIC8gNCwgc2luZ3VsYXJCZXRhIC0gU2NhbGFyKDEuNSkgKiBlcHNpbG9uLCBQSSAvIDMpKTsKKyAgICBjaGVja19hbGxfdmFyKFZlY3RvcjMoUEkgLyA0LCBzaW5ndWxhckJldGEgLSAyICogZXBzaWxvbiwgUEkgLyAzKSk7CisgICAgY2hlY2tfYWxsX3ZhcihWZWN0b3IzKFBJICogU2NhbGFyKDAuOCksIHNpbmd1bGFyQmV0YSAtIGVwc2lsb24sIFNjYWxhcigwLjkpICogUEkpKTsKKyAgICBjaGVja19hbGxfdmFyKFZlY3RvcjMoUEkgKiBTY2FsYXIoLTAuOSksIHNpbmd1bGFyQmV0YSArIGVwc2lsb24sIFBJICogU2NhbGFyKDAuMykpKTsKKyAgICBjaGVja19hbGxfdmFyKFZlY3RvcjMoUEkgKiBTY2FsYXIoLTAuNiksIHNpbmd1bGFyQmV0YSArIFNjYWxhcigxLjUpICogZXBzaWxvbiwgUEkgKiBTY2FsYXIoMC4zKSkpOworICAgIGNoZWNrX2FsbF92YXIoVmVjdG9yMyhQSSAqIFNjYWxhcigtMC41KSwgc2luZ3VsYXJCZXRhICsgMiAqIGVwc2lsb24sIFBJICogU2NhbGFyKDAuNCkpKTsKKyAgICBjaGVja19hbGxfdmFyKFZlY3RvcjMoUEkgKiBTY2FsYXIoMC45KSwgc2luZ3VsYXJCZXRhICsgZXBzaWxvbiwgU2NhbGFyKDAuOCkgKiBQSSkpOwogICB9Ci0gIAorCiAgIC8vIFRoaXMgb25lIGZvciBzYW5pdHksIGl0IGhhZCBhIHByb2JsZW0gd2l0aCBuZWFyIHBvbGUgY2FzZXMgaW4gZmxvYXQgc2NhbGFyLgotICBjaGVja19hbGxfdmFyKFZlY3RvcjMoUEkqU2NhbGFyKDAuOCksIHNpbmd1bGFyQmV0YSAtIFNjYWxhcigxRS02KSwgU2NhbGFyKDAuOSkqUEkpKTsKKyAgY2hlY2tfYWxsX3ZhcihWZWN0b3IzKFBJICogU2NhbGFyKDAuOCksIHNpbmd1bGFyQmV0YSAtIFNjYWxhcigxRS02KSwgU2NhbGFyKDAuOSkgKiBQSSkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgZXVsZXJhbmdsZXNfbWFudWFsKCkKLXsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yMzsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLER5bmFtaWMsMT4gVmVjdG9yWDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Cit2b2lkIGV1bGVyYW5nbGVzX21hbnVhbCgpIHsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAzLCAxPiBWZWN0b3IzOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIER5bmFtaWMsIDE+IFZlY3Rvclg7CiAgIGNvbnN0IFZlY3RvcjMgWmVybyA9IFZlY3RvcjM6Olplcm8oKTsKICAgY29uc3QgU2NhbGFyIFBJID0gU2NhbGFyKEVJR0VOX1BJKTsKLSAgCisKICAgY2hlY2tfYWxsX3ZhcihaZXJvKTsKLSAgCisKICAgLy8gc2luZ3VsYXIgY2FzZXMKLSAgY2hlY2tfc2luZ3VsYXJfY2FzZXMoUEkvMik7Ci0gIGNoZWNrX3Npbmd1bGFyX2Nhc2VzKC1QSS8yKTsKLSAgCisgIGNoZWNrX3Npbmd1bGFyX2Nhc2VzKFBJIC8gMik7CisgIGNoZWNrX3Npbmd1bGFyX2Nhc2VzKC1QSSAvIDIpOworCiAgIGNoZWNrX3Npbmd1bGFyX2Nhc2VzKFNjYWxhcigwKSk7CiAgIGNoZWNrX3Npbmd1bGFyX2Nhc2VzKFNjYWxhcigtMCkpOwotICAKKwogICBjaGVja19zaW5ndWxhcl9jYXNlcyhQSSk7CiAgIGNoZWNrX3Npbmd1bGFyX2Nhc2VzKC1QSSk7Ci0gIAorCiAgIC8vIG5vbi1zaW5ndWxhciBjYXNlcwogICBWZWN0b3JYIGFscGhhID0gVmVjdG9yWDo6TGluU3BhY2VkKDIwLCBTY2FsYXIoLTAuOTkpICogUEksIFBJKTsKLSAgVmVjdG9yWCBiZXRhID0gIFZlY3Rvclg6OkxpblNwYWNlZCgyMCwgU2NhbGFyKC0wLjQ5KSAqIFBJLCBTY2FsYXIoMC40OSkgKiBQSSk7CisgIFZlY3RvclggYmV0YSA9IFZlY3Rvclg6OkxpblNwYWNlZCgyMCwgU2NhbGFyKC0wLjQ5KSAqIFBJLCBTY2FsYXIoMC40OSkgKiBQSSk7CiAgIFZlY3RvclggZ2FtbWEgPSBWZWN0b3JYOjpMaW5TcGFjZWQoMjAsIFNjYWxhcigtMC45OSkgKiBQSSwgUEkpOwogICBmb3IgKGludCBpID0gMDsgaSA8IGFscGhhLnNpemUoKTsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBiZXRhLnNpemUoKTsgKytqKSB7CkBAIC0yMjgsMTEgKzIxMywxMSBAQAogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4gdm9pZCBldWxlcmFuZ2xlc19yYW5kKCkKLXsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMz4gTWF0cml4MzsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLDMsMT4gVmVjdG9yMzsKLSAgdHlwZWRlZiBBcnJheTxTY2FsYXIsMywxPiBBcnJheTM7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBldWxlcmFuZ2xlc19yYW5kKCkgeworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDM+IE1hdHJpeDM7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMywgMT4gVmVjdG9yMzsKKyAgdHlwZWRlZiBBcnJheTxTY2FsYXIsIDMsIDE+IEFycmF5MzsKICAgdHlwZWRlZiBRdWF0ZXJuaW9uPFNjYWxhcj4gUXVhdGVybmlvbng7CiAgIHR5cGVkZWYgQW5nbGVBeGlzPFNjYWxhcj4gQW5nbGVBeGlzVHlwZTsKIApAQCAtMjQxLDQyICsyMjYsNDEgQEAKICAgcTEgPSBBbmdsZUF4aXNUeXBlKGEsIFZlY3RvcjM6OlJhbmRvbSgpLm5vcm1hbGl6ZWQoKSk7CiAgIE1hdHJpeDMgbTsKICAgbSA9IHExOwotICAKLSAgVmVjdG9yMyBlYSA9IG0uZXVsZXJBbmdsZXMoMCwxLDIpOworCisgIFZlY3RvcjMgZWEgPSBtLmV1bGVyQW5nbGVzKDAsIDEsIDIpOwogICBjaGVja19hbGxfdmFyKGVhKTsKLSAgZWEgPSBtLmV1bGVyQW5nbGVzKDAsMSwwKTsKKyAgZWEgPSBtLmV1bGVyQW5nbGVzKDAsIDEsIDApOwogICBjaGVja19hbGxfdmFyKGVhKTsKLSAgCisKICAgLy8gQ2hlY2sgd2l0aCBwdXJlbHkgcmFuZG9tIFF1YXRlcm5pb246CiAgIHExLmNvZWZmcygpID0gUXVhdGVybmlvbng6OkNvZWZmaWNpZW50czo6UmFuZG9tKCkubm9ybWFsaXplZCgpOwogICBtID0gcTE7Ci0gIGVhID0gbS5ldWxlckFuZ2xlcygwLDEsMik7CisgIGVhID0gbS5ldWxlckFuZ2xlcygwLCAxLCAyKTsKICAgY2hlY2tfYWxsX3ZhcihlYSk7Ci0gIGVhID0gbS5ldWxlckFuZ2xlcygwLDEsMCk7CisgIGVhID0gbS5ldWxlckFuZ2xlcygwLCAxLCAwKTsKICAgY2hlY2tfYWxsX3ZhcihlYSk7Ci0gIAorCiAgIC8vIENoZWNrIHdpdGggcmFuZG9tIGFuZ2xlcyBpbiByYW5nZSBbMDpwaV14Wy1waTpwaV14Wy1waTpwaV0uCi0gIGVhID0gKEFycmF5Mzo6UmFuZG9tKCkgKyBBcnJheTMoMSwwLDApKSpTY2FsYXIoRUlHRU5fUEkpKkFycmF5MygwLjUsMSwxKTsKKyAgZWEgPSAoQXJyYXkzOjpSYW5kb20oKSArIEFycmF5MygxLCAwLCAwKSkgKiBTY2FsYXIoRUlHRU5fUEkpICogQXJyYXkzKDAuNSwgMSwgMSk7CiAgIGNoZWNrX2FsbF92YXIoZWEpOwotICAKLSAgZWFbMl0gPSBlYVswXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigwLFNjYWxhcihFSUdFTl9QSSkpOworCisgIGVhWzJdID0gZWFbMF0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oMCwgU2NhbGFyKEVJR0VOX1BJKSk7CiAgIGNoZWNrX2FsbF92YXIoZWEpOwotICAKLSAgZWFbMF0gPSBlYVsxXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigwLFNjYWxhcihFSUdFTl9QSSkpOworCisgIGVhWzBdID0gZWFbMV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oMCwgU2NhbGFyKEVJR0VOX1BJKSk7CiAgIGNoZWNrX2FsbF92YXIoZWEpOwotICAKKwogICBlYVsxXSA9IDA7CiAgIGNoZWNrX2FsbF92YXIoZWEpOwotICAKKwogICBlYS5oZWFkKDIpLnNldFplcm8oKTsKICAgY2hlY2tfYWxsX3ZhcihlYSk7Ci0gIAorCiAgIGVhLnNldFplcm8oKTsKICAgY2hlY2tfYWxsX3ZhcihlYSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChFdWxlckFuZ2xlcykKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChFdWxlckFuZ2xlcykgewogICAvLyBTaW1wbGUgY2FzdCB0ZXN0CiAgIEV1bGVyQW5nbGVzWFlaZCBvbmVzRWQoMSwgMSwgMSk7CiAgIEV1bGVyQW5nbGVzWFlaZiBvbmVzRWYgPSBvbmVzRWQuY2FzdDxmbG9hdD4oKTsKQEAgLTI4NCwxNSArMjY4LDE1IEBACiAKICAgLy8gU2ltcGxlIENvbnN0cnVjdGlvbiBmcm9tIFZlY3RvcjMgdGVzdAogICBWRVJJRllfSVNfQVBQUk9YKG9uZXNFZCwgRXVsZXJBbmdsZXNYWVpkKFZlY3RvcjNkOjpPbmVzKCkpKTsKLSAgCi0gIENBTExfU1VCVEVTVF8xKCBldWxlcmFuZ2xlc19tYW51YWw8ZmxvYXQ+KCkgKTsKLSAgQ0FMTF9TVUJURVNUXzIoIGV1bGVyYW5nbGVzX21hbnVhbDxkb3VibGU+KCkgKTsKLSAgCi0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGV1bGVyYW5nbGVzX3JhbmQ8ZmxvYXQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggZXVsZXJhbmdsZXNfcmFuZDxkb3VibGU+KCkgKTsKKworICBDQUxMX1NVQlRFU1RfMShldWxlcmFuZ2xlc19tYW51YWw8ZmxvYXQ+KCkpOworICBDQUxMX1NVQlRFU1RfMihldWxlcmFuZ2xlc19tYW51YWw8ZG91YmxlPigpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMyhldWxlcmFuZ2xlc19yYW5kPGZsb2F0PigpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChldWxlcmFuZ2xlc19yYW5kPGRvdWJsZT4oKSk7CiAgIH0KLSAgCisKICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBhdXRvIGRpZmYKICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBjb21wbGV4IG51bWJlcnMKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvRkZUVy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L0ZGVFcuY3BwCmluZGV4IGQ2OTg2N2MuLjczMDIxOTYgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvRkZUVy5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9GRlRXLmNwcApAQCAtMSwyICsxLDIgQEAKLSNkZWZpbmUgRUlHRU5fRkZUV19ERUZBVUxUIDEgCisjZGVmaW5lIEVJR0VOX0ZGVFdfREVGQVVMVCAxCiAjaW5jbHVkZSAiZmZ0X3Rlc3Rfc2hhcmVkLmgiCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L05OTFMuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9OTkxTLmNwcAppbmRleCA1ODA5MmVmLi5mMDFiNTYyIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L05OTFMuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvTk5MUy5jcHAKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTk5MUz4KIAotCiAvLy8gQ2hlY2sgdGhhdCAneCcgc29sdmVzIHRoZSBOTkxTIG9wdGltaXphdGlvbiBwcm9ibGVtIGBtaW4gfHxBKngtYnx8IHMudC4gMCA8PSB4YC4KIC8vLyBUaGUgXHAgdG9sZXJhbmNlIHBhcmFtZXRlciBpcyB0aGUgYWJzb2x1dGUgdG9sZXJhbmNlIG9uIHRoZSBncmFkaWVudCwgQScqKEEqeC1iKS4KIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCB0eXBlbmFtZSBWZWN0b3JCLCB0eXBlbmFtZSBWZWN0b3JYLCB0eXBlbmFtZSBTY2FsYXI+CkBAIC01NCw3ICs1Myw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCB0ZXN0X25ubHNfcmFuZG9tX3Byb2JsZW0oY29uc3QgTWF0cml4VHlwZSYpIHsKK3ZvaWQgdGVzdF9ubmxzX3JhbmRvbV9wcm9ibGVtKGNvbnN0IE1hdHJpeFR5cGUgJikgewogICAvLwogICAvLyBTRVRVUAogICAvLwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9Ob25MaW5lYXJPcHRpbWl6YXRpb24uY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9Ob25MaW5lYXJPcHRpbWl6YXRpb24uY3BwCmluZGV4IGFhYTk2ZWMuLmM4NDc0MjAgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvTm9uTGluZWFyT3B0aW1pemF0aW9uLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L05vbkxpbmVhck9wdGltaXphdGlvbi5jcHAKQEAgLTE1LDU5ICsxNSw1NiBAQAogLy8gdG9sZXJhbmNlIGZvciBjaGVja2luZyBudW1iZXIgb2YgaXRlcmF0aW9ucwogI2RlZmluZSBMTV9FVkFMX0NPVU5UX1RPTCAyCiAKLSNkZWZpbmUgTE1fQ0hFQ0tfTl9JVEVSUyhTT0xWRVIsTkZFVixOSkVWKSB7IFwKLSAgICAgICAgICAgIFZFUklGWShTT0xWRVIubmZldiA8PSBORkVWICogTE1fRVZBTF9DT1VOVF9UT0wpOyBcCi0gICAgICAgICAgICBWRVJJRlkoU09MVkVSLm5qZXYgPD0gTkpFViAqIExNX0VWQUxfQ09VTlRfVE9MKTsgXAotICAgICAgICB9CisjZGVmaW5lIExNX0NIRUNLX05fSVRFUlMoU09MVkVSLCBORkVWLCBOSkVWKSAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZFUklGWShTT0xWRVIubmZldiA8PSBORkVWICogTE1fRVZBTF9DT1VOVF9UT0wpOyBcCisgICAgVkVSSUZZKFNPTFZFUi5uamV2IDw9IE5KRVYgKiBMTV9FVkFMX0NPVU5UX1RPTCk7IFwKKyAgfQogCi1pbnQgZmNuX2Noa2Rlcihjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMsIE1hdHJpeFhkICZmamFjLCBpbnQgaWZsYWcpCi17Ci0gICAgLyogICAgICBzdWJyb3V0aW5lIGZjbiBmb3IgY2hrZGVyIGV4YW1wbGUuICovCitpbnQgZmNuX2Noa2Rlcihjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMsIE1hdHJpeFhkICZmamFjLCBpbnQgaWZsYWcpIHsKKyAgLyogICAgICBzdWJyb3V0aW5lIGZjbiBmb3IgY2hrZGVyIGV4YW1wbGUuICovCiAKLSAgICBpbnQgaTsKLSAgICBhc3NlcnQoMTUgPT0gIGZ2ZWMuc2l6ZSgpKTsKLSAgICBhc3NlcnQoMyA9PSAgeC5zaXplKCkpOwotICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNV09ezEuNGUtMSwgMS44ZS0xLCAyLjJlLTEsIDIuNWUtMSwgMi45ZS0xLCAzLjJlLTEsIDMuNWUtMSwKLSAgICAgICAgMy45ZS0xLCAzLjdlLTEsIDUuOGUtMSwgNy4zZS0xLCA5LjZlLTEsIDEuMzQsIDIuMSwgNC4zOX07CisgIGludCBpOworICBhc3NlcnQoMTUgPT0gZnZlYy5zaXplKCkpOworICBhc3NlcnQoMyA9PSB4LnNpemUoKSk7CisgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTVdID0gezEuNGUtMSwgMS44ZS0xLCAyLjJlLTEsIDIuNWUtMSwgMi45ZS0xLCAzLjJlLTEsIDMuNWUtMSwgMy45ZS0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuN2UtMSwgNS44ZS0xLCA3LjNlLTEsIDkuNmUtMSwgMS4zNCwgICAyLjEsICAgIDQuMzl9OwogCisgIGlmIChpZmxhZyA9PSAwKSByZXR1cm4gMDsKIAotICAgIGlmIChpZmxhZyA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChpZmxhZyAhPSAyKQotICAgICAgICBmb3IgKGk9MDsgaTwxNTsgaSsrKSB7Ci0gICAgICAgICAgICB0bXAxID0gaSsxOwotICAgICAgICAgICAgdG1wMiA9IDE2LWktMTsKLSAgICAgICAgICAgIHRtcDMgPSB0bXAxOwotICAgICAgICAgICAgaWYgKGkgPj0gOCkgdG1wMyA9IHRtcDI7Ci0gICAgICAgICAgICBmdmVjW2ldID0geVtpXSAtICh4WzBdICsgdG1wMS8oeFsxXSp0bXAyICsgeFsyXSp0bXAzKSk7Ci0gICAgICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKLSAgICAgICAgICAgIHRtcDEgPSBpKzE7Ci0gICAgICAgICAgICB0bXAyID0gMTYtaS0xOwotCi0gICAgICAgICAgICAvKiBlcnJvciBpbnRyb2R1Y2VkIGludG8gbmV4dCBzdGF0ZW1lbnQgZm9yIGlsbHVzdHJhdGlvbi4gKi8KLSAgICAgICAgICAgIC8qIGNvcnJlY3RlZCBzdGF0ZW1lbnQgc2hvdWxkIHJlYWQgICAgdG1wMyA9IHRtcDEgLiAqLwotCi0gICAgICAgICAgICB0bXAzID0gdG1wMjsKLSAgICAgICAgICAgIGlmIChpID49IDgpIHRtcDMgPSB0bXAyOwotICAgICAgICAgICAgdG1wNCA9ICh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpOyB0bXA0PXRtcDQqdG1wNDsKLSAgICAgICAgICAgIGZqYWMoaSwwKSA9IC0xLjsKLSAgICAgICAgICAgIGZqYWMoaSwxKSA9IHRtcDEqdG1wMi90bXA0OwotICAgICAgICAgICAgZmphYyhpLDIpID0gdG1wMSp0bXAzL3RtcDQ7Ci0gICAgICAgIH0KKyAgaWYgKGlmbGFnICE9IDIpCisgICAgZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKKyAgICAgIHRtcDEgPSBpICsgMTsKKyAgICAgIHRtcDIgPSAxNiAtIGkgLSAxOworICAgICAgdG1wMyA9IHRtcDE7CisgICAgICBpZiAoaSA+PSA4KSB0bXAzID0gdG1wMjsKKyAgICAgIGZ2ZWNbaV0gPSB5W2ldIC0gKHhbMF0gKyB0bXAxIC8gKHhbMV0gKiB0bXAyICsgeFsyXSAqIHRtcDMpKTsKICAgICB9Ci0gICAgcmV0dXJuIDA7CisgIGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisgICAgICB0bXAxID0gaSArIDE7CisgICAgICB0bXAyID0gMTYgLSBpIC0gMTsKKworICAgICAgLyogZXJyb3IgaW50cm9kdWNlZCBpbnRvIG5leHQgc3RhdGVtZW50IGZvciBpbGx1c3RyYXRpb24uICovCisgICAgICAvKiBjb3JyZWN0ZWQgc3RhdGVtZW50IHNob3VsZCByZWFkICAgIHRtcDMgPSB0bXAxIC4gKi8KKworICAgICAgdG1wMyA9IHRtcDI7CisgICAgICBpZiAoaSA+PSA4KSB0bXAzID0gdG1wMjsKKyAgICAgIHRtcDQgPSAoeFsxXSAqIHRtcDIgKyB4WzJdICogdG1wMyk7CisgICAgICB0bXA0ID0gdG1wNCAqIHRtcDQ7CisgICAgICBmamFjKGksIDApID0gLTEuOworICAgICAgZmphYyhpLCAxKSA9IHRtcDEgKiB0bXAyIC8gdG1wNDsKKyAgICAgIGZqYWMoaSwgMikgPSB0bXAxICogdG1wMyAvIHRtcDQ7CisgICAgfQorICB9CisgIHJldHVybiAwOwogfQogCi0KLXZvaWQgdGVzdENoa2RlcigpCi17Ci0gIGNvbnN0IGludCBtPTE1LCBuPTM7Cit2b2lkIHRlc3RDaGtkZXIoKSB7CisgIGNvbnN0IGludCBtID0gMTUsIG4gPSAzOwogICBWZWN0b3JYZCB4KG4pLCBmdmVjKG0pLCB4cCwgZnZlY3AobSksIGVycjsKLSAgTWF0cml4WGQgZmphYyhtLG4pOworICBNYXRyaXhYZCBmamFjKG0sIG4pOwogICBWZWN0b3JYaSBpcHZ0OwogCiAgIC8qICAgICAgdGhlIGZvbGxvd2luZyB2YWx1ZXMgc2hvdWxkIGJlIHN1aXRhYmxlIGZvciAqLwpAQCAtODQsMjQgKzgxLDExIEBACiAKICAgLy8gY2hlY2sgdGhvc2UKICAgVmVjdG9yWGQgZnZlY19yZWYobSksIGZ2ZWNwX3JlZihtKSwgZXJyX3JlZihtKTsKLSAgZnZlY19yZWYgPDwKLSAgICAgIC0xLjE4MTYwNiwgLTEuNDI5NjU1LCAtMS42MDYzNDQsCi0gICAgICAtMS43NDUyNjksIC0xLjg0MDY1NCwgLTEuOTIxNTg2LAotICAgICAgLTEuOTg0MTQxLCAtMi4wMjI1MzcsIC0yLjQ2ODk3NywKLSAgICAgIC0yLjgyNzU2MiwgLTMuNDczNTgyLCAtNC40Mzc2MTIsCi0gICAgICAtNi4wNDc2NjIsIC05LjI2Nzc2MSwgLTE4LjkxODA2OwotICBmdmVjcF9yZWYgPDwKLSAgICAgIC03LjcyNDY2NmUtMDksIC0zLjQzMjQwNmUtMDksIC0yLjAzNDg0M2UtMTAsCi0gICAgICAyLjMxMzY4NWUtMDksICA0LjMzMTA3OGUtMDksICA1Ljk4NDA5NmUtMDksCi0gICAgICA3LjM2MzI4MWUtMDksICAgOC41MzE0N2UtMDksICAxLjQ4ODU5MWUtMDgsCi0gICAgICAyLjMzNTg1ZS0wOCwgIDMuNTIyMDEyZS0wOCwgIDUuMzAxMjU1ZS0wOCwKLSAgICAgIDguMjY2NjZlLTA4LCAgMS40MTk3NDdlLTA3LCAgIDMuMTk4OTllLTA3OwotICBlcnJfcmVmIDw8Ci0gICAgICAwLjExNDEzOTcsICAwLjA5OTQzNTE2LCAgMC4wOTY3NDQ3NCwKLSAgICAgIDAuMDk5ODA0NDcsICAwLjEwNzMxMTYsIDAuMTIyMDQ0NSwKLSAgICAgIDAuMTUyNjgxNCwgMSwgMSwKLSAgICAgIDEsIDEsIDEsCi0gICAgICAxLCAxLCAxOworICBmdmVjX3JlZiA8PCAtMS4xODE2MDYsIC0xLjQyOTY1NSwgLTEuNjA2MzQ0LCAtMS43NDUyNjksIC0xLjg0MDY1NCwgLTEuOTIxNTg2LCAtMS45ODQxNDEsIC0yLjAyMjUzNywgLTIuNDY4OTc3LAorICAgICAgLTIuODI3NTYyLCAtMy40NzM1ODIsIC00LjQzNzYxMiwgLTYuMDQ3NjYyLCAtOS4yNjc3NjEsIC0xOC45MTgwNjsKKyAgZnZlY3BfcmVmIDw8IC03LjcyNDY2NmUtMDksIC0zLjQzMjQwNmUtMDksIC0yLjAzNDg0M2UtMTAsIDIuMzEzNjg1ZS0wOSwgNC4zMzEwNzhlLTA5LCA1Ljk4NDA5NmUtMDksIDcuMzYzMjgxZS0wOSwKKyAgICAgIDguNTMxNDdlLTA5LCAxLjQ4ODU5MWUtMDgsIDIuMzM1ODVlLTA4LCAzLjUyMjAxMmUtMDgsIDUuMzAxMjU1ZS0wOCwgOC4yNjY2NmUtMDgsIDEuNDE5NzQ3ZS0wNywgMy4xOTg5OWUtMDc7CisgIGVycl9yZWYgPDwgMC4xMTQxMzk3LCAwLjA5OTQzNTE2LCAwLjA5Njc0NDc0LCAwLjA5OTgwNDQ3LCAwLjEwNzMxMTYsIDAuMTIyMDQ0NSwgMC4xNTI2ODE0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxOwogCiAgIFZFUklGWV9JU19BUFBST1goZnZlYywgZnZlY19yZWYpOwogICBWRVJJRllfSVNfQVBQUk9YKGZ2ZWNwLCBmdmVjcF9yZWYpOwpAQCAtMTA5LDE3ICs5MywxMyBAQAogfQogCiAvLyBHZW5lcmljIGZ1bmN0b3IKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcl8sIGludCBOWD1EeW5hbWljLCBpbnQgTlk9RHluYW1pYz4KLXN0cnVjdCBGdW5jdG9yCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyXywgaW50IE5YID0gRHluYW1pYywgaW50IE5ZID0gRHluYW1pYz4KK3N0cnVjdCBGdW5jdG9yIHsKICAgdHlwZWRlZiBTY2FsYXJfIFNjYWxhcjsKLSAgZW51bSB7Ci0gICAgSW5wdXRzQXRDb21waWxlVGltZSA9IE5YLAotICAgIFZhbHVlc0F0Q29tcGlsZVRpbWUgPSBOWQotICB9OwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsSW5wdXRzQXRDb21waWxlVGltZSwxPiBJbnB1dFR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixWYWx1ZXNBdENvbXBpbGVUaW1lLDE+IFZhbHVlVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFZhbHVlc0F0Q29tcGlsZVRpbWUsSW5wdXRzQXRDb21waWxlVGltZT4gSmFjb2JpYW5UeXBlOworICBlbnVtIHsgSW5wdXRzQXRDb21waWxlVGltZSA9IE5YLCBWYWx1ZXNBdENvbXBpbGVUaW1lID0gTlkgfTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBJbnB1dHNBdENvbXBpbGVUaW1lLCAxPiBJbnB1dFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgVmFsdWVzQXRDb21waWxlVGltZSwgMT4gVmFsdWVUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFZhbHVlc0F0Q29tcGlsZVRpbWUsIElucHV0c0F0Q29tcGlsZVRpbWU+IEphY29iaWFuVHlwZTsKIAogICBjb25zdCBpbnQgbV9pbnB1dHMsIG1fdmFsdWVzOwogCkBAIC0xMzAsNDggKzExMCw0MyBAQAogICBpbnQgdmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZXM7IH0KIAogICAvLyB5b3Ugc2hvdWxkIGRlZmluZSB0aGF0IGluIHRoZSBzdWJjbGFzcyA6Ci0vLyAgdm9pZCBvcGVyYXRvcigpIChjb25zdCBJbnB1dFR5cGUmIHgsIFZhbHVlVHlwZSogdiwgSmFjb2JpYW5UeXBlKiBfaj0wKSBjb25zdDsKKyAgLy8gIHZvaWQgb3BlcmF0b3IoKSAoY29uc3QgSW5wdXRUeXBlJiB4LCBWYWx1ZVR5cGUqIHYsIEphY29iaWFuVHlwZSogX2o9MCkgY29uc3Q7CiB9OwogCi1zdHJ1Y3QgbG1kZXJfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgotewotICAgIGxtZGVyX2Z1bmN0b3Iodm9pZCk6IEZ1bmN0b3I8ZG91YmxlPigzLDE1KSB7fQotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykgY29uc3QKLSAgICB7Ci0gICAgICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzOwotICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTVdID0gezEuNGUtMSwgMS44ZS0xLCAyLjJlLTEsIDIuNWUtMSwgMi45ZS0xLCAzLjJlLTEsIDMuNWUtMSwKLSAgICAgICAgICAgIDMuOWUtMSwgMy43ZS0xLCA1LjhlLTEsIDcuM2UtMSwgOS42ZS0xLCAxLjM0LCAyLjEsIDQuMzl9Oworc3RydWN0IGxtZGVyX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4geworICBsbWRlcl9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDMsIDE1KSB7fQorICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMpIGNvbnN0IHsKKyAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTVdID0gezEuNGUtMSwgMS44ZS0xLCAyLjJlLTEsIDIuNWUtMSwgMi45ZS0xLCAzLjJlLTEsIDMuNWUtMSwgMy45ZS0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy43ZS0xLCA1LjhlLTEsIDcuM2UtMSwgOS42ZS0xLCAxLjM0LCAgIDIuMSwgICAgNC4zOX07CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAxID0gaSsxOwotICAgICAgICAgICAgdG1wMiA9IDE2IC0gaSAtIDE7Ci0gICAgICAgICAgICB0bXAzID0gKGk+PTgpPyB0bXAyIDogdG1wMTsKLSAgICAgICAgICAgIGZ2ZWNbaV0gPSB5W2ldIC0gKHhbMF0gKyB0bXAxLyh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcygpOyBpKyspIHsKKyAgICAgIHRtcDEgPSBpICsgMTsKKyAgICAgIHRtcDIgPSAxNiAtIGkgLSAxOworICAgICAgdG1wMyA9IChpID49IDgpID8gdG1wMiA6IHRtcDE7CisgICAgICBmdmVjW2ldID0geVtpXSAtICh4WzBdICsgdG1wMSAvICh4WzFdICogdG1wMiArIHhbMl0gKiB0bXAzKSk7CiAgICAgfQorICAgIHJldHVybiAwOworICB9CiAKLSAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJngsIE1hdHJpeFhkICZmamFjKSBjb25zdAotICAgIHsKLSAgICAgICAgZG91YmxlIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMSA9IGkrMTsKLSAgICAgICAgICAgIHRtcDIgPSAxNiAtIGkgLSAxOwotICAgICAgICAgICAgdG1wMyA9IChpPj04KT8gdG1wMiA6IHRtcDE7Ci0gICAgICAgICAgICB0bXA0ID0gKHhbMV0qdG1wMiArIHhbMl0qdG1wMyk7IHRtcDQgPSB0bXA0KnRtcDQ7Ci0gICAgICAgICAgICBmamFjKGksMCkgPSAtMTsKLSAgICAgICAgICAgIGZqYWMoaSwxKSA9IHRtcDEqdG1wMi90bXA0OwotICAgICAgICAgICAgZmphYyhpLDIpID0gdG1wMSp0bXAzL3RtcDQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmeCwgTWF0cml4WGQgJmZqYWMpIGNvbnN0IHsKKyAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcygpOyBpKyspIHsKKyAgICAgIHRtcDEgPSBpICsgMTsKKyAgICAgIHRtcDIgPSAxNiAtIGkgLSAxOworICAgICAgdG1wMyA9IChpID49IDgpID8gdG1wMiA6IHRtcDE7CisgICAgICB0bXA0ID0gKHhbMV0gKiB0bXAyICsgeFsyXSAqIHRtcDMpOworICAgICAgdG1wNCA9IHRtcDQgKiB0bXA0OworICAgICAgZmphYyhpLCAwKSA9IC0xOworICAgICAgZmphYyhpLCAxKSA9IHRtcDEgKiB0bXAyIC8gdG1wNDsKKyAgICAgIGZqYWMoaSwgMikgPSB0bXAxICogdG1wMyAvIHRtcDQ7CiAgICAgfQorICAgIHJldHVybiAwOworICB9CiB9OwogCi12b2lkIHRlc3RMbWRlcjEoKQotewotICBpbnQgbj0zLCBpbmZvOwordm9pZCB0ZXN0TG1kZXIxKCkgeworICBpbnQgbiA9IDMsIGluZm87CiAKICAgVmVjdG9yWGQgeDsKIApAQCAtMTk3LDkgKzE3Miw4IEBACiAgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOwogfQogCi12b2lkIHRlc3RMbWRlcigpCi17Ci0gIGNvbnN0IGludCBtPTE1LCBuPTM7Cit2b2lkIHRlc3RMbWRlcigpIHsKKyAgY29uc3QgaW50IG0gPSAxNSwgbiA9IDM7CiAgIGludCBpbmZvOwogICBkb3VibGUgZm5vcm0sIGNvdmZhYzsKICAgVmVjdG9yWGQgeDsKQEAgLTIyNyw2NSArMjAxLDU1IEBACiAgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOwogCiAgIC8vIGNoZWNrIGNvdmFyaWFuY2UKLSAgY292ZmFjID0gZm5vcm0qZm5vcm0vKG0tbik7Ci0gIGludGVybmFsOjpjb3ZhcihsbS5mamFjLCBsbS5wZXJtdXRhdGlvbi5pbmRpY2VzKCkpOyAvLyBUT0RPIDogbW92ZSB0aGlzIGFzIGEgZnVuY3Rpb24gb2YgbG0KKyAgY292ZmFjID0gZm5vcm0gKiBmbm9ybSAvIChtIC0gbik7CisgIGludGVybmFsOjpjb3ZhcihsbS5mamFjLCBsbS5wZXJtdXRhdGlvbi5pbmRpY2VzKCkpOyAgLy8gVE9ETyA6IG1vdmUgdGhpcyBhcyBhIGZ1bmN0aW9uIG9mIGxtCiAKLSAgTWF0cml4WGQgY292X3JlZihuLG4pOwotICBjb3ZfcmVmIDw8Ci0gICAgICAwLjAwMDE1MzEyMDIsICAgMC4wMDI4Njk5NDEsICAtMC4wMDI2NTY2NjIsCi0gICAgICAwLjAwMjg2OTk0MSwgICAgMC4wOTQ4MDkzNSwgICAtMC4wOTA5ODk5NSwKLSAgICAgIC0wLjAwMjY1NjY2MiwgICAtMC4wOTA5ODk5NSwgICAgMC4wODc3ODcyNzsKKyAgTWF0cml4WGQgY292X3JlZihuLCBuKTsKKyAgY292X3JlZiA8PCAwLjAwMDE1MzEyMDIsIDAuMDAyODY5OTQxLCAtMC4wMDI2NTY2NjIsIDAuMDAyODY5OTQxLCAwLjA5NDgwOTM1LCAtMC4wOTA5ODk5NSwgLTAuMDAyNjU2NjYyLCAtMC4wOTA5ODk5NSwKKyAgICAgIDAuMDg3Nzg3Mjc7CiAKLS8vICBzdGQ6OmNvdXQgPDwgZmphYypjb3ZmYWMgPDwgc3RkOjplbmRsOworICAvLyAgc3RkOjpjb3V0IDw8IGZqYWMqY292ZmFjIDw8IHN0ZDo6ZW5kbDsKIAogICBNYXRyaXhYZCBjb3Y7Ci0gIGNvdiA9ICBjb3ZmYWMqbG0uZmphYy50b3BMZWZ0Q29ybmVyPG4sbj4oKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCggY292LCBjb3ZfcmVmKTsKKyAgY292ID0gY292ZmFjICogbG0uZmphYy50b3BMZWZ0Q29ybmVyPG4sIG4+KCk7CisgIFZFUklGWV9JU19BUFBST1goY292LCBjb3ZfcmVmKTsKICAgLy8gVE9ETzogd2h5IGlzbid0IHRoaXMgYWxsb3dlZCA/IDoKICAgLy8gVkVSSUZZX0lTX0FQUFJPWCggY292ZmFjKmZqYWMudG9wTGVmdENvcm5lcjxuLG4+KCkgLCBjb3ZfcmVmKTsKIH0KIAotc3RydWN0IGh5YnJqX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KLXsKLSAgICBoeWJyal9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDksOSkge30KK3N0cnVjdCBoeWJyal9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+IHsKKyAgaHlicmpfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPig5LCA5KSB7fQogCi0gICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJngsIFZlY3RvclhkICZmdmVjKQotICAgIHsKLSAgICAgICAgZG91YmxlIHRlbXAsIHRlbXAxLCB0ZW1wMjsKLSAgICAgICAgY29uc3QgVmVjdG9yWGQ6OkluZGV4IG4gPSB4LnNpemUoKTsKLSAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT1uKTsKLSAgICAgICAgZm9yIChWZWN0b3JYZDo6SW5kZXggayA9IDA7IGsgPCBuOyBrKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXAgPSAoMy4gLSAyLip4W2tdKSp4W2tdOwotICAgICAgICAgICAgdGVtcDEgPSAwLjsKLSAgICAgICAgICAgIGlmIChrKSB0ZW1wMSA9IHhbay0xXTsKLSAgICAgICAgICAgIHRlbXAyID0gMC47Ci0gICAgICAgICAgICBpZiAoayAhPSBuLTEpIHRlbXAyID0geFtrKzFdOwotICAgICAgICAgICAgZnZlY1trXSA9IHRlbXAgLSB0ZW1wMSAtIDIuKnRlbXAyICsgMS47Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykgeworICAgIGRvdWJsZSB0ZW1wLCB0ZW1wMSwgdGVtcDI7CisgICAgY29uc3QgVmVjdG9yWGQ6OkluZGV4IG4gPSB4LnNpemUoKTsKKyAgICBhc3NlcnQoZnZlYy5zaXplKCkgPT0gbik7CisgICAgZm9yIChWZWN0b3JYZDo6SW5kZXggayA9IDA7IGsgPCBuOyBrKyspIHsKKyAgICAgIHRlbXAgPSAoMy4gLSAyLiAqIHhba10pICogeFtrXTsKKyAgICAgIHRlbXAxID0gMC47CisgICAgICBpZiAoaykgdGVtcDEgPSB4W2sgLSAxXTsKKyAgICAgIHRlbXAyID0gMC47CisgICAgICBpZiAoayAhPSBuIC0gMSkgdGVtcDIgPSB4W2sgKyAxXTsKKyAgICAgIGZ2ZWNba10gPSB0ZW1wIC0gdGVtcDEgLSAyLiAqIHRlbXAyICsgMS47CiAgICAgfQotICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmeCwgTWF0cml4WGQgJmZqYWMpCi0gICAgewotICAgICAgICBjb25zdCBWZWN0b3JYZDo6SW5kZXggbiA9IHguc2l6ZSgpOwotICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PW4pOwotICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PW4pOwotICAgICAgICBmb3IgKFZlY3RvclhkOjpJbmRleCBrID0gMDsgayA8IG47IGsrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChWZWN0b3JYZDo6SW5kZXggaiA9IDA7IGogPCBuOyBqKyspCi0gICAgICAgICAgICAgICAgZmphYyhrLGopID0gMC47Ci0gICAgICAgICAgICBmamFjKGssaykgPSAzLi0gNC4qeFtrXTsKLSAgICAgICAgICAgIGlmIChrKSBmamFjKGssay0xKSA9IC0xLjsKLSAgICAgICAgICAgIGlmIChrICE9IG4tMSkgZmphYyhrLGsrMSkgPSAtMi47Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZ4LCBNYXRyaXhYZCAmZmphYykgeworICAgIGNvbnN0IFZlY3RvclhkOjpJbmRleCBuID0geC5zaXplKCk7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IG4pOworICAgIGFzc2VydChmamFjLmNvbHMoKSA9PSBuKTsKKyAgICBmb3IgKFZlY3RvclhkOjpJbmRleCBrID0gMDsgayA8IG47IGsrKykgeworICAgICAgZm9yIChWZWN0b3JYZDo6SW5kZXggaiA9IDA7IGogPCBuOyBqKyspIGZqYWMoaywgaikgPSAwLjsKKyAgICAgIGZqYWMoaywgaykgPSAzLiAtIDQuICogeFtrXTsKKyAgICAgIGlmIChrKSBmamFjKGssIGsgLSAxKSA9IC0xLjsKKyAgICAgIGlmIChrICE9IG4gLSAxKSBmamFjKGssIGsgKyAxKSA9IC0yLjsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIH07CiAKLQotdm9pZCB0ZXN0SHlicmoxKCkKLXsKLSAgY29uc3QgaW50IG49OTsKK3ZvaWQgdGVzdEh5YnJqMSgpIHsKKyAgY29uc3QgaW50IG4gPSA5OwogICBpbnQgaW5mbzsKICAgVmVjdG9yWGQgeChuKTsKIApAQCAtMzA1LDI2ICsyNjksMjAgQEAKICAgLy8gY2hlY2sgbm9ybQogICBWRVJJRllfSVNfQVBQUk9YKHNvbHZlci5mdmVjLmJsdWVOb3JtKCksIDEuMTkyNjM2ZS0wOCk7CiAKLQotLy8gY2hlY2sgeAorICAvLyBjaGVjayB4CiAgIFZlY3RvclhkIHhfcmVmKG4pOwotICB4X3JlZiA8PAotICAgICAtMC41NzA2NTQ1LCAgICAtMC42ODE2MjgzLCAgICAtMC43MDE3MzI1LAotICAgICAtMC43MDQyMTI5LCAgICAgLTAuNzAxMzY5LCAgICAtMC42OTE4NjU2LAotICAgICAtMC42NjU3OTIsICAgIC0wLjU5NjAzNDIsICAgIC0wLjQxNjQxMjE7CisgIHhfcmVmIDw8IC0wLjU3MDY1NDUsIC0wLjY4MTYyODMsIC0wLjcwMTczMjUsIC0wLjcwNDIxMjksIC0wLjcwMTM2OSwgLTAuNjkxODY1NiwgLTAuNjY1NzkyLCAtMC41OTYwMzQyLCAtMC40MTY0MTIxOwogICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKIH0KIAotdm9pZCB0ZXN0SHlicmooKQotewotICBjb25zdCBpbnQgbj05Owordm9pZCB0ZXN0SHlicmooKSB7CisgIGNvbnN0IGludCBuID0gOTsKICAgaW50IGluZm87CiAgIFZlY3RvclhkIHgobik7CiAKICAgLyogdGhlIGZvbGxvd2luZyBzdGFydGluZyB2YWx1ZXMgcHJvdmlkZSBhIHJvdWdoIGZpdC4gKi8KICAgeC5zZXRDb25zdGFudChuLCAtMS4pOwogCi0KICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGh5YnJqX2Z1bmN0b3IgZnVuY3RvcjsKICAgSHlicmlkTm9uTGluZWFyU29sdmVyPGh5YnJqX2Z1bmN0b3I+IHNvbHZlcihmdW5jdG9yKTsKQEAgLTM0MCw0MiArMjk4LDMzIEBACiAgIC8vIGNoZWNrIG5vcm0KICAgVkVSSUZZX0lTX0FQUFJPWChzb2x2ZXIuZnZlYy5ibHVlTm9ybSgpLCAxLjE5MjYzNmUtMDgpOwogCi0KLS8vIGNoZWNrIHgKKyAgLy8gY2hlY2sgeAogICBWZWN0b3JYZCB4X3JlZihuKTsKLSAgeF9yZWYgPDwKLSAgICAgLTAuNTcwNjU0NSwgICAgLTAuNjgxNjI4MywgICAgLTAuNzAxNzMyNSwKLSAgICAgLTAuNzA0MjEyOSwgICAgIC0wLjcwMTM2OSwgICAgLTAuNjkxODY1NiwKLSAgICAgLTAuNjY1NzkyLCAgICAtMC41OTYwMzQyLCAgICAtMC40MTY0MTIxOworICB4X3JlZiA8PCAtMC41NzA2NTQ1LCAtMC42ODE2MjgzLCAtMC43MDE3MzI1LCAtMC43MDQyMTI5LCAtMC43MDEzNjksIC0wLjY5MTg2NTYsIC0wLjY2NTc5MiwgLTAuNTk2MDM0MiwgLTAuNDE2NDEyMTsKICAgVkVSSUZZX0lTX0FQUFJPWCh4LCB4X3JlZik7Ci0KIH0KIAotc3RydWN0IGh5YnJkX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KLXsKLSAgICBoeWJyZF9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDksOSkge30KLSAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMpIGNvbnN0Ci0gICAgewotICAgICAgICBkb3VibGUgdGVtcCwgdGVtcDEsIHRlbXAyOwotICAgICAgICBjb25zdCBWZWN0b3JYZDo6SW5kZXggbiA9IHguc2l6ZSgpOworc3RydWN0IGh5YnJkX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4geworICBoeWJyZF9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDksIDkpIHt9CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykgY29uc3QgeworICAgIGRvdWJsZSB0ZW1wLCB0ZW1wMSwgdGVtcDI7CisgICAgY29uc3QgVmVjdG9yWGQ6OkluZGV4IG4gPSB4LnNpemUoKTsKIAotICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PW4pOwotICAgICAgICBmb3IgKFZlY3RvclhkOjpJbmRleCBrPTA7IGsgPCBuOyBrKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXAgPSAoMy4gLSAyLip4W2tdKSp4W2tdOwotICAgICAgICAgICAgdGVtcDEgPSAwLjsKLSAgICAgICAgICAgIGlmIChrKSB0ZW1wMSA9IHhbay0xXTsKLSAgICAgICAgICAgIHRlbXAyID0gMC47Ci0gICAgICAgICAgICBpZiAoayAhPSBuLTEpIHRlbXAyID0geFtrKzFdOwotICAgICAgICAgICAgZnZlY1trXSA9IHRlbXAgLSB0ZW1wMSAtIDIuKnRlbXAyICsgMS47Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpID09IG4pOworICAgIGZvciAoVmVjdG9yWGQ6OkluZGV4IGsgPSAwOyBrIDwgbjsgaysrKSB7CisgICAgICB0ZW1wID0gKDMuIC0gMi4gKiB4W2tdKSAqIHhba107CisgICAgICB0ZW1wMSA9IDAuOworICAgICAgaWYgKGspIHRlbXAxID0geFtrIC0gMV07CisgICAgICB0ZW1wMiA9IDAuOworICAgICAgaWYgKGsgIT0gbiAtIDEpIHRlbXAyID0geFtrICsgMV07CisgICAgICBmdmVjW2tdID0gdGVtcCAtIHRlbXAxIC0gMi4gKiB0ZW1wMiArIDEuOwogICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKIAotdm9pZCB0ZXN0SHlicmQxKCkKLXsKLSAgaW50IG49OSwgaW5mbzsKK3ZvaWQgdGVzdEh5YnJkMSgpIHsKKyAgaW50IG4gPSA5LCBpbmZvOwogICBWZWN0b3JYZCB4KG4pOwogCiAgIC8qIHRoZSBmb2xsb3dpbmcgc3RhcnRpbmcgdmFsdWVzIHByb3ZpZGUgYSByb3VnaCBzb2x1dGlvbi4gKi8KQEAgLTM4OSw3ICszMzgsNyBAQAogCiAgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQogICAvLyBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7Ci0gIFZFUklGWShzb2x2ZXIubmZldiA8PSAyMCpMTV9FVkFMX0NPVU5UX1RPTCk7CisgIFZFUklGWShzb2x2ZXIubmZldiA8PSAyMCAqIExNX0VWQUxfQ09VTlRfVE9MKTsKIAogICAvLyBjaGVjayBub3JtCiAgIFZFUklGWV9JU19BUFBST1goc29sdmVyLmZ2ZWMuYmx1ZU5vcm0oKSwgMS4xOTI2MzZlLTA4KTsKQEAgLTQwMCw5ICszNDksOCBAQAogICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKIH0KIAotdm9pZCB0ZXN0SHlicmQoKQotewotICBjb25zdCBpbnQgbj05Owordm9pZCB0ZXN0SHlicmQoKSB7CisgIGNvbnN0IGludCBuID0gOTsKICAgaW50IGluZm87CiAgIFZlY3RvclhkIHg7CiAKQEAgLTQyMSw2MyArMzY5LDU2IEBACiAKICAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCiAgIC8vIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKLSAgVkVSSUZZKHNvbHZlci5uZmV2IDw9IDE0KkxNX0VWQUxfQ09VTlRfVE9MKTsKKyAgVkVSSUZZKHNvbHZlci5uZmV2IDw9IDE0ICogTE1fRVZBTF9DT1VOVF9UT0wpOwogCiAgIC8vIGNoZWNrIG5vcm0KICAgVkVSSUZZX0lTX0FQUFJPWChzb2x2ZXIuZnZlYy5ibHVlTm9ybSgpLCAxLjE5MjYzNmUtMDgpOwogCiAgIC8vIGNoZWNrIHgKICAgVmVjdG9yWGQgeF9yZWYobik7Ci0gIHhfcmVmIDw8Ci0gICAgICAtMC41NzA2NTQ1LCAgICAtMC42ODE2MjgzLCAgICAtMC43MDE3MzI1LAotICAgICAgLTAuNzA0MjEyOSwgICAgIC0wLjcwMTM2OSwgICAgLTAuNjkxODY1NiwKLSAgICAgIC0wLjY2NTc5MiwgICAgLTAuNTk2MDM0MiwgICAgLTAuNDE2NDEyMTsKKyAgeF9yZWYgPDwgLTAuNTcwNjU0NSwgLTAuNjgxNjI4MywgLTAuNzAxNzMyNSwgLTAuNzA0MjEyOSwgLTAuNzAxMzY5LCAtMC42OTE4NjU2LCAtMC42NjU3OTIsIC0wLjU5NjAzNDIsIC0wLjQxNjQxMjE7CiAgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOwogfQogCi1zdHJ1Y3QgbG1zdHJfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgotewotICAgIGxtc3RyX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywxNSkge30KLSAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMpCi0gICAgewotICAgICAgICAvKiAgc3Vicm91dGluZSBmY24gZm9yIGxtc3RyMSBleGFtcGxlLiAqLwotICAgICAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMzsKLSAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzE1XT17MS40ZS0xLCAxLjhlLTEsIDIuMmUtMSwgMi41ZS0xLCAyLjllLTEsIDMuMmUtMSwgMy41ZS0xLAotICAgICAgICAgICAgMy45ZS0xLCAzLjdlLTEsIDUuOGUtMSwgNy4zZS0xLCA5LjZlLTEsIDEuMzQsIDIuMSwgNC4zOX07CitzdHJ1Y3QgbG1zdHJfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPiB7CisgIGxtc3RyX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywgMTUpIHt9CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykgeworICAgIC8qICBzdWJyb3V0aW5lIGZjbiBmb3IgbG1zdHIxIGV4YW1wbGUuICovCisgICAgZG91YmxlIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzE1XSA9IHsxLjRlLTEsIDEuOGUtMSwgMi4yZS0xLCAyLjVlLTEsIDIuOWUtMSwgMy4yZS0xLCAzLjVlLTEsIDMuOWUtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuN2UtMSwgNS44ZS0xLCA3LjNlLTEsIDkuNmUtMSwgMS4zNCwgICAyLjEsICAgIDQuMzl9OwogCi0gICAgICAgIGFzc2VydCgxNT09ZnZlYy5zaXplKCkpOwotICAgICAgICBhc3NlcnQoMz09eC5zaXplKCkpOworICAgIGFzc2VydCgxNSA9PSBmdmVjLnNpemUoKSk7CisgICAgYXNzZXJ0KDMgPT0geC5zaXplKCkpOwogCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTwxNTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAxID0gaSsxOwotICAgICAgICAgICAgdG1wMiA9IDE2IC0gaSAtIDE7Ci0gICAgICAgICAgICB0bXAzID0gKGk+PTgpPyB0bXAyIDogdG1wMTsKLSAgICAgICAgICAgIGZ2ZWNbaV0gPSB5W2ldIC0gKHhbMF0gKyB0bXAxLyh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE1OyBpKyspIHsKKyAgICAgIHRtcDEgPSBpICsgMTsKKyAgICAgIHRtcDIgPSAxNiAtIGkgLSAxOworICAgICAgdG1wMyA9IChpID49IDgpID8gdG1wMiA6IHRtcDE7CisgICAgICBmdmVjW2ldID0geVtpXSAtICh4WzBdICsgdG1wMSAvICh4WzFdICogdG1wMiArIHhbMl0gKiB0bXAzKSk7CiAgICAgfQotICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmphY19yb3csIFZlY3RvclhkOjpJbmRleCByb3duYikKLSAgICB7Ci0gICAgICAgIGFzc2VydCh4LnNpemUoKT09Myk7Ci0gICAgICAgIGFzc2VydChqYWNfcm93LnNpemUoKT09eC5zaXplKCkpOwotICAgICAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJngsIFZlY3RvclhkICZqYWNfcm93LCBWZWN0b3JYZDo6SW5kZXggcm93bmIpIHsKKyAgICBhc3NlcnQoeC5zaXplKCkgPT0gMyk7CisgICAgYXNzZXJ0KGphY19yb3cuc2l6ZSgpID09IHguc2l6ZSgpKTsKKyAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKIAotICAgICAgICBWZWN0b3JYZDo6SW5kZXggaSA9IHJvd25iLTI7Ci0gICAgICAgIHRtcDEgPSBpKzE7Ci0gICAgICAgIHRtcDIgPSAxNiAtIGkgLSAxOwotICAgICAgICB0bXAzID0gKGk+PTgpPyB0bXAyIDogdG1wMTsKLSAgICAgICAgdG1wNCA9ICh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpOyB0bXA0ID0gdG1wNCp0bXA0OwotICAgICAgICBqYWNfcm93WzBdID0gLTE7Ci0gICAgICAgIGphY19yb3dbMV0gPSB0bXAxKnRtcDIvdG1wNDsKLSAgICAgICAgamFjX3Jvd1syXSA9IHRtcDEqdG1wMy90bXA0OwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgVmVjdG9yWGQ6OkluZGV4IGkgPSByb3duYiAtIDI7CisgICAgdG1wMSA9IGkgKyAxOworICAgIHRtcDIgPSAxNiAtIGkgLSAxOworICAgIHRtcDMgPSAoaSA+PSA4KSA/IHRtcDIgOiB0bXAxOworICAgIHRtcDQgPSAoeFsxXSAqIHRtcDIgKyB4WzJdICogdG1wMyk7CisgICAgdG1wNCA9IHRtcDQgKiB0bXA0OworICAgIGphY19yb3dbMF0gPSAtMTsKKyAgICBqYWNfcm93WzFdID0gdG1wMSAqIHRtcDIgLyB0bXA0OworICAgIGphY19yb3dbMl0gPSB0bXAxICogdG1wMyAvIHRtcDQ7CisgICAgcmV0dXJuIDA7CisgIH0KIH07CiAKLXZvaWQgdGVzdExtc3RyMSgpCi17Ci0gIGNvbnN0IGludCBuPTM7Cit2b2lkIHRlc3RMbXN0cjEoKSB7CisgIGNvbnN0IGludCBuID0gMzsKICAgaW50IGluZm87CiAKICAgVmVjdG9yWGQgeChuKTsKQEAgLTUwMCwxMyArNDQxLDEyIEBACiAKICAgLy8gY2hlY2sgeAogICBWZWN0b3JYZCB4X3JlZihuKTsKLSAgeF9yZWYgPDwgMC4wODI0MTA1OCwgMS4xMzMwMzcsIDIuMzQzNjk1IDsKKyAgeF9yZWYgPDwgMC4wODI0MTA1OCwgMS4xMzMwMzcsIDIuMzQzNjk1OwogICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKIH0KIAotdm9pZCB0ZXN0TG1zdHIoKQotewotICBjb25zdCBpbnQgbj0zOwordm9pZCB0ZXN0TG1zdHIoKSB7CisgIGNvbnN0IGludCBuID0gMzsKICAgaW50IGluZm87CiAgIGRvdWJsZSBmbm9ybTsKICAgVmVjdG9yWGQgeChuKTsKQEAgLTUzMiwzNyArNDcyLDMyIEBACiAgIFZlY3RvclhkIHhfcmVmKG4pOwogICB4X3JlZiA8PCAwLjA4MjQxMDU4LCAxLjEzMzAzNywgMi4zNDM2OTU7CiAgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOwotCiB9CiAKLXN0cnVjdCBsbWRpZl9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Ci17Ci0gICAgbG1kaWZfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPigzLDE1KSB7fQotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykgY29uc3QKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBkb3VibGUgdG1wMSx0bXAyLHRtcDM7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNV09ezEuNGUtMSwxLjhlLTEsMi4yZS0xLDIuNWUtMSwyLjllLTEsMy4yZS0xLDMuNWUtMSwzLjllLTEsCi0gICAgICAgICAgICAzLjdlLTEsNS44ZS0xLDcuM2UtMSw5LjZlLTEsMS4zNGUwLDIuMWUwLDQuMzllMH07CitzdHJ1Y3QgbG1kaWZfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPiB7CisgIGxtZGlmX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywgMTUpIHt9CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykgY29uc3QgeworICAgIGludCBpOworICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNV0gPSB7MS40ZS0xLCAxLjhlLTEsIDIuMmUtMSwgMi41ZS0xLCAyLjllLTEsIDMuMmUtMSwgMy41ZS0xLCAzLjllLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjdlLTEsIDUuOGUtMSwgNy4zZS0xLCA5LjZlLTEsIDEuMzRlMCwgMi4xZTAsICA0LjM5ZTB9OwogCi0gICAgICAgIGFzc2VydCh4LnNpemUoKT09Myk7Ci0gICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTUpOwotICAgICAgICBmb3IgKGk9MDsgaTwxNTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAxID0gaSsxOwotICAgICAgICAgICAgdG1wMiA9IDE1IC0gaTsKLSAgICAgICAgICAgIHRtcDMgPSB0bXAxOworICAgIGFzc2VydCh4LnNpemUoKSA9PSAzKTsKKyAgICBhc3NlcnQoZnZlYy5zaXplKCkgPT0gMTUpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisgICAgICB0bXAxID0gaSArIDE7CisgICAgICB0bXAyID0gMTUgLSBpOworICAgICAgdG1wMyA9IHRtcDE7CiAKLSAgICAgICAgICAgIGlmIChpID49IDgpIHRtcDMgPSB0bXAyOwotICAgICAgICAgICAgZnZlY1tpXSA9IHlbaV0gLSAoeFswXSArIHRtcDEvKHhbMV0qdG1wMiArIHhbMl0qdG1wMykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgICAgaWYgKGkgPj0gOCkgdG1wMyA9IHRtcDI7CisgICAgICBmdmVjW2ldID0geVtpXSAtICh4WzBdICsgdG1wMSAvICh4WzFdICogdG1wMiArIHhbMl0gKiB0bXAzKSk7CiAgICAgfQorICAgIHJldHVybiAwOworICB9CiB9OwogCi12b2lkIHRlc3RMbWRpZjEoKQotewotICBjb25zdCBpbnQgbj0zOwordm9pZCB0ZXN0TG1kaWYxKCkgeworICBjb25zdCBpbnQgbiA9IDM7CiAgIGludCBpbmZvOwogCiAgIFZlY3RvclhkIHgobiksIGZ2ZWMoMTUpOwpAQCAtNTcyLDEzICs1MDcsMTMgQEAKIAogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgbG1kaWZfZnVuY3RvciBmdW5jdG9yOwotICBEZW5zZUluZGV4IG5mZXYgPSAtMTsgLy8gaW5pdGlhbGl6ZSB0byBhdm9pZCBtYXliZS11bmluaXRpYWxpemVkIHdhcm5pbmcKKyAgRGVuc2VJbmRleCBuZmV2ID0gLTE7ICAvLyBpbml0aWFsaXplIHRvIGF2b2lkIG1heWJlLXVuaW5pdGlhbGl6ZWQgd2FybmluZwogICBpbmZvID0gTGV2ZW5iZXJnTWFycXVhcmR0PGxtZGlmX2Z1bmN0b3I+OjpsbWRpZjEoZnVuY3RvciwgeCwgJm5mZXYpOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaW5mbykKIAogICAvLyBjaGVjayByZXR1cm4gdmFsdWUKICAgLy8gVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOwotICBWRVJJRlkoIG5mZXYgPD0gMjYqTE1fRVZBTF9DT1VOVF9UT0wpOworICBWRVJJRlkobmZldiA8PSAyNiAqIExNX0VWQUxfQ09VTlRfVE9MKTsKIAogICAvLyBjaGVjayBub3JtCiAgIGZ1bmN0b3IoeCwgZnZlYyk7CkBAIC01ODgsMTIgKzUyMywxMCBAQAogICBWZWN0b3JYZCB4X3JlZihuKTsKICAgeF9yZWYgPDwgMC4wODI0MTA2LCAxLjEzMzAzNjYsIDIuMzQzNjk0NzsKICAgVkVSSUZZX0lTX0FQUFJPWCh4LCB4X3JlZik7Ci0KIH0KIAotdm9pZCB0ZXN0TG1kaWYoKQotewotICBjb25zdCBpbnQgbT0xNSwgbj0zOwordm9pZCB0ZXN0TG1kaWYoKSB7CisgIGNvbnN0IGludCBtID0gMTUsIG4gPSAzOwogICBpbnQgaW5mbzsKICAgZG91YmxlIGZub3JtLCBjb3ZmYWM7CiAgIFZlY3RvclhkIHgobik7CkBAIC02MTAsNyArNTQzLDcgQEAKIAogICAvLyBjaGVjayByZXR1cm4gdmFsdWVzCiAgIC8vIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKLSAgVkVSSUZZKGxtLm5mZXYgPD0gMjYqTE1fRVZBTF9DT1VOVF9UT0wpOworICBWRVJJRlkobG0ubmZldiA8PSAyNiAqIExNX0VWQUxfQ09VTlRfVE9MKTsKIAogICAvLyBjaGVjayBub3JtCiAgIGZub3JtID0gbG0uZnZlYy5ibHVlTm9ybSgpOwpAQCAtNjIyLDY0ICs1NTUsNjkgQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh4LCB4X3JlZik7CiAKICAgLy8gY2hlY2sgY292YXJpYW5jZQotICBjb3ZmYWMgPSBmbm9ybSpmbm9ybS8obS1uKTsKLSAgaW50ZXJuYWw6OmNvdmFyKGxtLmZqYWMsIGxtLnBlcm11dGF0aW9uLmluZGljZXMoKSk7IC8vIFRPRE8gOiBtb3ZlIHRoaXMgYXMgYSBmdW5jdGlvbiBvZiBsbQorICBjb3ZmYWMgPSBmbm9ybSAqIGZub3JtIC8gKG0gLSBuKTsKKyAgaW50ZXJuYWw6OmNvdmFyKGxtLmZqYWMsIGxtLnBlcm11dGF0aW9uLmluZGljZXMoKSk7ICAvLyBUT0RPIDogbW92ZSB0aGlzIGFzIGEgZnVuY3Rpb24gb2YgbG0KIAotICBNYXRyaXhYZCBjb3ZfcmVmKG4sbik7Ci0gIGNvdl9yZWYgPDwKLSAgICAgIDAuMDAwMTUzMTIwMiwgICAwLjAwMjg2OTk0MiwgIC0wLjAwMjY1NjY2MiwKLSAgICAgIDAuMDAyODY5OTQyLCAgICAwLjA5NDgwOTM3LCAgIC0wLjA5MDk4OTk3LAotICAgICAgLTAuMDAyNjU2NjYyLCAgIC0wLjA5MDk4OTk3LCAgICAwLjA4Nzc4NzI5OworICBNYXRyaXhYZCBjb3ZfcmVmKG4sIG4pOworICBjb3ZfcmVmIDw8IDAuMDAwMTUzMTIwMiwgMC4wMDI4Njk5NDIsIC0wLjAwMjY1NjY2MiwgMC4wMDI4Njk5NDIsIDAuMDk0ODA5MzcsIC0wLjA5MDk4OTk3LCAtMC4wMDI2NTY2NjIsIC0wLjA5MDk4OTk3LAorICAgICAgMC4wODc3ODcyOTsKIAotLy8gIHN0ZDo6Y291dCA8PCBmamFjKmNvdmZhYyA8PCBzdGQ6OmVuZGw7CisgIC8vICBzdGQ6OmNvdXQgPDwgZmphYypjb3ZmYWMgPDwgc3RkOjplbmRsOwogCiAgIE1hdHJpeFhkIGNvdjsKLSAgY292ID0gIGNvdmZhYypsbS5mamFjLnRvcExlZnRDb3JuZXI8bixuPigpOwotICBWRVJJRllfSVNfQVBQUk9YKCBjb3YsIGNvdl9yZWYpOworICBjb3YgPSBjb3ZmYWMgKiBsbS5mamFjLnRvcExlZnRDb3JuZXI8biwgbj4oKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChjb3YsIGNvdl9yZWYpOwogICAvLyBUT0RPOiB3aHkgaXNuJ3QgdGhpcyBhbGxvd2VkID8gOgogICAvLyBWRVJJRllfSVNfQVBQUk9YKCBjb3ZmYWMqZmphYy50b3BMZWZ0Q29ybmVyPG4sbj4oKSAsIGNvdl9yZWYpOwogfQogCi1zdHJ1Y3QgY2h3aXJ1dDJfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgotewotICAgIGNod2lydXQyX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMyw1NCkge30KLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIG1feFs1NF07Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3lbNTRdOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIGludCBpOworc3RydWN0IGNod2lydXQyX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4geworICBjaHdpcnV0Ml9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDMsIDU0KSB7fQorICBzdGF0aWMgY29uc3QgZG91YmxlIG1feFs1NF07CisgIHN0YXRpYyBjb25zdCBkb3VibGUgbV95WzU0XTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgaW50IGk7CiAKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKLSAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT01NCk7Ci0gICAgICAgIGZvcihpPTA7IGk8NTQ7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIHggPSBtX3hbaV07Ci0gICAgICAgICAgICBmdmVjW2ldID0gZXhwKC1iWzBdKngpLyhiWzFdK2JbMl0qeCkgLSBtX3lbaV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDMpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSA1NCk7CisgICAgZm9yIChpID0gMDsgaSA8IDU0OyBpKyspIHsKKyAgICAgIGRvdWJsZSB4ID0gbV94W2ldOworICAgICAgZnZlY1tpXSA9IGV4cCgtYlswXSAqIHgpIC8gKGJbMV0gKyBiWzJdICogeCkgLSBtX3lbaV07CiAgICAgfQotICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOwotICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTU0KTsKLSAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0zKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8NTQ7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIHggPSBtX3hbaV07Ci0gICAgICAgICAgICBkb3VibGUgZmFjdG9yID0gMS4vKGJbMV0rYlsyXSp4KTsKLSAgICAgICAgICAgIGRvdWJsZSBlID0gZXhwKC1iWzBdKngpOwotICAgICAgICAgICAgZmphYyhpLDApID0gLXgqZSpmYWN0b3I7Ci0gICAgICAgICAgICBmamFjKGksMSkgPSAtZSpmYWN0b3IqZmFjdG9yOwotICAgICAgICAgICAgZmphYyhpLDIpID0gLXgqZSpmYWN0b3IqZmFjdG9yOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAwOworICB9CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gMyk7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDU0KTsKKyAgICBhc3NlcnQoZmphYy5jb2xzKCkgPT0gMyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1NDsgaSsrKSB7CisgICAgICBkb3VibGUgeCA9IG1feFtpXTsKKyAgICAgIGRvdWJsZSBmYWN0b3IgPSAxLiAvIChiWzFdICsgYlsyXSAqIHgpOworICAgICAgZG91YmxlIGUgPSBleHAoLWJbMF0gKiB4KTsKKyAgICAgIGZqYWMoaSwgMCkgPSAteCAqIGUgKiBmYWN0b3I7CisgICAgICBmamFjKGksIDEpID0gLWUgKiBmYWN0b3IgKiBmYWN0b3I7CisgICAgICBmamFjKGksIDIpID0gLXggKiBlICogZmFjdG9yICogZmFjdG9yOwogICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKLWNvbnN0IGRvdWJsZSBjaHdpcnV0Ml9mdW5jdG9yOjptX3hbNTRdID0geyAwLjUwMEUwLCAxLjAwMEUwLCAxLjc1MEUwLCAzLjc1MEUwLCA1Ljc1MEUwLCAwLjg3NUUwLCAyLjI1MEUwLCAzLjI1MEUwLCA1LjI1MEUwLCAwLjc1MEUwLCAxLjc1MEUwLCAyLjc1MEUwLCA0Ljc1MEUwLCAwLjYyNUUwLCAxLjI1MEUwLCAyLjI1MEUwLCA0LjI1MEUwLCAuNTAwRTAsIDMuMDAwRTAsIC43NTBFMCwgMy4wMDBFMCwgMS41MDBFMCwgNi4wMDBFMCwgMy4wMDBFMCwgNi4wMDBFMCwgMS41MDBFMCwgMy4wMDBFMCwgLjUwMEUwLCAyLjAwMEUwLCA0LjAwMEUwLCAuNzUwRTAsIDIuMDAwRTAsIDUuMDAwRTAsIC43NTBFMCwgMi4yNTBFMCwgMy43NTBFMCwgNS43NTBFMCwgMy4wMDBFMCwgLjc1MEUwLCAyLjUwMEUwLCA0LjAwMEUwLCAuNzUwRTAsIDIuNTAwRTAsIDQuMDAwRTAsIC43NTBFMCwgMi41MDBFMCwgNC4wMDBFMCwgLjUwMEUwLCA2LjAwMEUwLCAzLjAwMEUwLCAuNTAwRTAsIDIuNzUwRTAsIC41MDBFMCwgMS43NTBFMH07Ci1jb25zdCBkb3VibGUgY2h3aXJ1dDJfZnVuY3Rvcjo6bV95WzU0XSA9IHsgOTIuOTAwMEUwICw1Ny4xMDAwRTAgLDMxLjA1MDBFMCAsMTEuNTg3NUUwICw4LjAyNTBFMCAsNjMuNjAwMEUwICwyMS40MDAwRTAgLDE0LjI1MDBFMCAsOC40NzUwRTAgLDYzLjgwMDBFMCAsMjYuODAwMEUwICwxNi40NjI1RTAgLDcuMTI1MEUwICw2Ny4zMDAwRTAgLDQxLjAwMDBFMCAsMjEuMTUwMEUwICw4LjE3NTBFMCAsODEuNTAwMEUwICwxMy4xMjAwRTAgLDU5LjkwMDBFMCAsMTQuNjIwMEUwICwzMi45MDAwRTAgLDUuNDQwMEUwICwxMi41NjAwRTAgLDUuNDQwMEUwICwzMi4wMDAwRTAgLDEzLjk1MDBFMCAsNzUuODAwMEUwICwyMC4wMDAwRTAgLDEwLjQyMDBFMCAsNTkuNTAwMEUwICwyMS42NzAwRTAgLDguNTUwMEUwICw2Mi4wMDAwRTAgLDIwLjIwMDBFMCAsNy43NjAwRTAgLDMuNzUwMEUwICwxMS44MTAwRTAgLDU0LjcwMDBFMCAsMjMuNzAwMEUwICwxMS41NTAwRTAgLDYxLjMwMDBFMCAsMTcuNzAwMEUwICw4Ljc0MDBFMCAsNTkuMjAwMEUwICwxNi4zMDAwRTAgLDguNjIwMEUwICw4MS4wMDAwRTAgLDQuODcwMEUwICwxNC42MjAwRTAgLDgxLjcwMDBFMCAsMTcuMTcwMEUwICw4MS4zMDAwRTAgLDI4LjkwMDBFMCAgfTsKK2NvbnN0IGRvdWJsZSBjaHdpcnV0Ml9mdW5jdG9yOjptX3hbNTRdID0geworICAgIDAuNTAwRTAsIDEuMDAwRTAsIDEuNzUwRTAsIDMuNzUwRTAsIDUuNzUwRTAsIDAuODc1RTAsIDIuMjUwRTAsIDMuMjUwRTAsIDUuMjUwRTAsIDAuNzUwRTAsIDEuNzUwRTAsCisgICAgMi43NTBFMCwgNC43NTBFMCwgMC42MjVFMCwgMS4yNTBFMCwgMi4yNTBFMCwgNC4yNTBFMCwgLjUwMEUwLCAgMy4wMDBFMCwgLjc1MEUwLCAgMy4wMDBFMCwgMS41MDBFMCwKKyAgICA2LjAwMEUwLCAzLjAwMEUwLCA2LjAwMEUwLCAxLjUwMEUwLCAzLjAwMEUwLCAuNTAwRTAsICAyLjAwMEUwLCA0LjAwMEUwLCAuNzUwRTAsICAyLjAwMEUwLCA1LjAwMEUwLAorICAgIC43NTBFMCwgIDIuMjUwRTAsIDMuNzUwRTAsIDUuNzUwRTAsIDMuMDAwRTAsIC43NTBFMCwgIDIuNTAwRTAsIDQuMDAwRTAsIC43NTBFMCwgIDIuNTAwRTAsIDQuMDAwRTAsCisgICAgLjc1MEUwLCAgMi41MDBFMCwgNC4wMDBFMCwgLjUwMEUwLCAgNi4wMDBFMCwgMy4wMDBFMCwgLjUwMEUwLCAgMi43NTBFMCwgLjUwMEUwLCAgMS43NTBFMH07Citjb25zdCBkb3VibGUgY2h3aXJ1dDJfZnVuY3Rvcjo6bV95WzU0XSA9IHsKKyAgICA5Mi45MDAwRTAsIDU3LjEwMDBFMCwgMzEuMDUwMEUwLCAxMS41ODc1RTAsIDguMDI1MEUwLCAgNjMuNjAwMEUwLCAyMS40MDAwRTAsIDE0LjI1MDBFMCwgOC40NzUwRTAsCisgICAgNjMuODAwMEUwLCAyNi44MDAwRTAsIDE2LjQ2MjVFMCwgNy4xMjUwRTAsICA2Ny4zMDAwRTAsIDQxLjAwMDBFMCwgMjEuMTUwMEUwLCA4LjE3NTBFMCwgIDgxLjUwMDBFMCwKKyAgICAxMy4xMjAwRTAsIDU5LjkwMDBFMCwgMTQuNjIwMEUwLCAzMi45MDAwRTAsIDUuNDQwMEUwLCAgMTIuNTYwMEUwLCA1LjQ0MDBFMCwgIDMyLjAwMDBFMCwgMTMuOTUwMEUwLAorICAgIDc1LjgwMDBFMCwgMjAuMDAwMEUwLCAxMC40MjAwRTAsIDU5LjUwMDBFMCwgMjEuNjcwMEUwLCA4LjU1MDBFMCwgIDYyLjAwMDBFMCwgMjAuMjAwMEUwLCA3Ljc2MDBFMCwKKyAgICAzLjc1MDBFMCwgIDExLjgxMDBFMCwgNTQuNzAwMEUwLCAyMy43MDAwRTAsIDExLjU1MDBFMCwgNjEuMzAwMEUwLCAxNy43MDAwRTAsIDguNzQwMEUwLCAgNTkuMjAwMEUwLAorICAgIDE2LjMwMDBFMCwgOC42MjAwRTAsICA4MS4wMDAwRTAsIDQuODcwMEUwLCAgMTQuNjIwMEUwLCA4MS43MDAwRTAsIDE3LjE3MDBFMCwgODEuMzAwMEUwLCAyOC45MDAwRTB9OwogCiAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9jaHdpcnV0Mi5zaHRtbAotdm9pZCB0ZXN0TmlzdENod2lydXQyKHZvaWQpCi17Ci0gIGNvbnN0IGludCBuPTM7Cit2b2lkIHRlc3ROaXN0Q2h3aXJ1dDIodm9pZCkgeworICBjb25zdCBpbnQgbiA9IDM7CiAgIGludCBpbmZvOwogCiAgIFZlY3RvclhkIHgobik7CkBAIC02ODcsNyArNjI1LDcgQEAKICAgLyoKICAgICogRmlyc3QgdHJ5CiAgICAqLwotICB4PDwgMC4xLCAwLjAxLCAwLjAyOworICB4IDw8IDAuMSwgMC4wMSwgMC4wMjsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGNod2lydXQyX2Z1bmN0b3IgZnVuY3RvcjsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PGNod2lydXQyX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOwpAQCAtNzA3LDExICs2NDUsMTEgQEAKICAgLyoKICAgICogU2Vjb25kIHRyeQogICAgKi8KLSAgeDw8IDAuMTUsIDAuMDA4LCAwLjAxMDsKKyAgeCA8PCAwLjE1LCAwLjAwOCwgMC4wMTA7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBsbS5yZXNldFBhcmFtZXRlcnMoKTsKLSAgbG0ucGFyYW1ldGVycy5mdG9sID0gMS5FNipOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOwotICBsbS5wYXJhbWV0ZXJzLnh0b2wgPSAxLkU2Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGxtLnBhcmFtZXRlcnMuZnRvbCA9IDEuRTYgKiBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBsbS5wYXJhbWV0ZXJzLnh0b2wgPSAxLkU2ICogTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKICAgaW5mbyA9IGxtLm1pbmltaXplKHgpOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaW5mbykKIApAQCAtNzI2LDQwICs2NjQsMzcgQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAxLjIxNTAwMDcwOTZFLTAyKTsKIH0KIAotCi1zdHJ1Y3QgbWlzcmExYV9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Ci17Ci0gICAgbWlzcmExYV9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDIsMTQpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3hbMTRdOwotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgbV95WzE0XTsKLSAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTIpOwotICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTE0KTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8MTQ7IGkrKykgewotICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0qKDEuLWV4cCgtYlsxXSptX3hbaV0pKSAtIG1feVtpXSA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CitzdHJ1Y3QgbWlzcmExYV9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+IHsKKyAgbWlzcmExYV9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDIsIDE0KSB7fQorICBzdGF0aWMgY29uc3QgZG91YmxlIG1feFsxNF07CisgIHN0YXRpYyBjb25zdCBkb3VibGUgbV95WzE0XTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDIpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSAxNCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNDsgaSsrKSB7CisgICAgICBmdmVjW2ldID0gYlswXSAqICgxLiAtIGV4cCgtYlsxXSAqIG1feFtpXSkpIC0gbV95W2ldOwogICAgIH0KLSAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0yKTsKLSAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0xNCk7Ci0gICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Mik7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDE0OyBpKyspIHsKLSAgICAgICAgICAgIGZqYWMoaSwwKSA9ICgxLi1leHAoLWJbMV0qbV94W2ldKSk7Ci0gICAgICAgICAgICBmamFjKGksMSkgPSAoYlswXSptX3hbaV0qZXhwKC1iWzFdKm1feFtpXSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAwOworICB9CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gMik7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDE0KTsKKyAgICBhc3NlcnQoZmphYy5jb2xzKCkgPT0gMik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNDsgaSsrKSB7CisgICAgICBmamFjKGksIDApID0gKDEuIC0gZXhwKC1iWzFdICogbV94W2ldKSk7CisgICAgICBmamFjKGksIDEpID0gKGJbMF0gKiBtX3hbaV0gKiBleHAoLWJbMV0gKiBtX3hbaV0pKTsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIH07Ci1jb25zdCBkb3VibGUgbWlzcmExYV9mdW5jdG9yOjptX3hbMTRdID0geyA3Ny42RTAsIDExNC45RTAsIDE0MS4xRTAsIDE5MC44RTAsIDIzOS45RTAsIDI4OS4wRTAsIDMzMi44RTAsIDM3OC40RTAsIDQzNC44RTAsIDQ3Ny4zRTAsIDUzNi44RTAsIDU5My4xRTAsIDY4OS4xRTAsIDc2MC4wRTB9OwotY29uc3QgZG91YmxlIG1pc3JhMWFfZnVuY3Rvcjo6bV95WzE0XSA9IHsgMTAuMDdFMCwgMTQuNzNFMCwgMTcuOTRFMCwgMjMuOTNFMCwgMjkuNjFFMCwgMzUuMThFMCwgNDAuMDJFMCwgNDQuODJFMCwgNTAuNzZFMCwgNTUuMDVFMCwgNjEuMDFFMCwgNjYuNDBFMCwgNzUuNDdFMCwgODEuNzhFMH07Citjb25zdCBkb3VibGUgbWlzcmExYV9mdW5jdG9yOjptX3hbMTRdID0gezc3LjZFMCwgIDExNC45RTAsIDE0MS4xRTAsIDE5MC44RTAsIDIzOS45RTAsIDI4OS4wRTAsIDMzMi44RTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3OC40RTAsIDQzNC44RTAsIDQ3Ny4zRTAsIDUzNi44RTAsIDU5My4xRTAsIDY4OS4xRTAsIDc2MC4wRTB9OworY29uc3QgZG91YmxlIG1pc3JhMWFfZnVuY3Rvcjo6bV95WzE0XSA9IHsxMC4wN0UwLCAxNC43M0UwLCAxNy45NEUwLCAyMy45M0UwLCAyOS42MUUwLCAzNS4xOEUwLCA0MC4wMkUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NC44MkUwLCA1MC43NkUwLCA1NS4wNUUwLCA2MS4wMUUwLCA2Ni40MEUwLCA3NS40N0UwLCA4MS43OEUwfTsKIAogLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvbWlzcmExYS5zaHRtbAotdm9pZCB0ZXN0TmlzdE1pc3JhMWEodm9pZCkKLXsKLSAgY29uc3QgaW50IG49MjsKK3ZvaWQgdGVzdE5pc3RNaXNyYTFhKHZvaWQpIHsKKyAgY29uc3QgaW50IG4gPSAyOwogICBpbnQgaW5mbzsKIAogICBWZWN0b3JYZCB4KG4pOwpAQCAtNzY3LDcgKzcwMiw3IEBACiAgIC8qCiAgICAqIEZpcnN0IHRyeQogICAgKi8KLSAgeDw8IDUwMC4sIDAuMDAwMTsKKyAgeCA8PCA1MDAuLCAwLjAwMDE7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBtaXNyYTFhX2Z1bmN0b3IgZnVuY3RvcjsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PG1pc3JhMWFfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CkBAIC03ODYsNyArNzIxLDcgQEAKICAgLyoKICAgICogU2Vjb25kIHRyeQogICAgKi8KLSAgeDw8IDI1MC4sIDAuMDAwNTsKKyAgeCA8PCAyNTAuLCAwLjAwMDU7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbmZvKQpAQCAtODAxLDU1ICs3MzYsOTIgQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA1LjUwMTU2NDMxODFFLTA0KTsKIH0KIAotc3RydWN0IGhhaG4xX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KLXsKLSAgICBoYWhuMV9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDcsMjM2KSB7fQotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgbV94WzIzNl07Ci0gICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3lbMjM2XSA9IHsgLjU5MUUwICwgMS41NDdFMCAsIDIuOTAyRTAgLCAyLjg5NEUwICwgNC43MDNFMCAsIDYuMzA3RTAgLCA3LjAzRTAgICwgNy44OThFMCAsIDkuNDcwRTAgLCA5LjQ4NEUwICwgMTAuMDcyRTAgLCAxMC4xNjNFMCAsIDExLjYxNUUwICwgMTIuMDA1RTAgLCAxMi40NzhFMCAsIDEyLjk4MkUwICwgMTIuOTcwRTAgLCAxMy45MjZFMCAsIDE0LjQ1MkUwICwgMTQuNDA0RTAgLCAxNS4xOTBFMCAsIDE1LjU1MEUwICwgMTUuNTI4RTAgLCAxNS40OTlFMCAsIDE2LjEzMUUwICwgMTYuNDM4RTAgLCAxNi4zODdFMCAsIDE2LjU0OUUwICwgMTYuODcyRTAgLCAxNi44MzBFMCAsIDE2LjkyNkUwICwgMTYuOTA3RTAgLCAxNi45NjZFMCAsIDE3LjA2MEUwICwgMTcuMTIyRTAgLCAxNy4zMTFFMCAsIDE3LjM1NUUwICwgMTcuNjY4RTAgLCAxNy43NjdFMCAsIDE3LjgwM0UwICwgMTcuNzY1RTAgLCAxNy43NjhFMCAsIDE3LjczNkUwICwgMTcuODU4RTAgLCAxNy44NzdFMCAsIDE3LjkxMkUwICwgMTguMDQ2RTAgLCAxOC4wODVFMCAsIDE4LjI5MUUwICwgMTguMzU3RTAgLCAxOC40MjZFMCAsIDE4LjU4NEUwICwgMTguNjEwRTAgLCAxOC44NzBFMCAsIDE4Ljc5NUUwICwgMTkuMTExRTAgLCAuMzY3RTAgLCAuNzk2RTAgLCAwLjg5MkUwICwgMS45MDNFMCAsIDIuMTUwRTAgLCAzLjY5N0UwICwgNS44NzBFMCAsIDYuNDIxRTAgLCA3LjQyMkUwICwgOS45NDRFMCAsIDExLjAyM0UwICwgMTEuODdFMCAgLCAxMi43ODZFMCAsIDE0LjA2N0UwICwgMTMuOTc0RTAgLCAxNC40NjJFMCAsIDE0LjQ2NEUwICwgMTUuMzgxRTAgLCAxNS40ODNFMCAsIDE1LjU5RTAgICwgMTYuMDc1RTAgLCAxNi4zNDdFMCAsIDE2LjE4MUUwICwgMTYuOTE1RTAgLCAxNy4wMDNFMCAsIDE2Ljk3OEUwICwgMTcuNzU2RTAgLCAxNy44MDhFMCAsIDE3Ljg2OEUwICwgMTguNDgxRTAgLCAxOC40ODZFMCAsIDE5LjA5MEUwICwgMTYuMDYyRTAgLCAxNi4zMzdFMCAsIDE2LjM0NUUwICwKLSAgICAgICAgMTYuMzg4RTAgLCAxNy4xNTlFMCAsIDE3LjExNkUwICwgMTcuMTY0RTAgLCAxNy4xMjNFMCAsIDE3Ljk3OUUwICwgMTcuOTc0RTAgLCAxOC4wMDdFMCAsIDE3Ljk5M0UwICwgMTguNTIzRTAgLCAxOC42NjlFMCAsIDE4LjYxN0UwICwgMTkuMzcxRTAgLCAxOS4zMzBFMCAsIDAuMDgwRTAgLCAwLjI0OEUwICwgMS4wODlFMCAsIDEuNDE4RTAgLCAyLjI3OEUwICwgMy42MjRFMCAsIDQuNTc0RTAgLCA1LjU1NkUwICwgNy4yNjdFMCAsIDcuNjk1RTAgLCA5LjEzNkUwICwgOS45NTlFMCAsIDkuOTU3RTAgLCAxMS42MDBFMCAsIDEzLjEzOEUwICwgMTMuNTY0RTAgLCAxMy44NzFFMCAsIDEzLjk5NEUwICwgMTQuOTQ3RTAgLCAxNS40NzNFMCAsIDE1LjM3OUUwICwgMTUuNDU1RTAgLCAxNS45MDhFMCAsIDE2LjExNEUwICwgMTcuMDcxRTAgLCAxNy4xMzVFMCAsIDE3LjI4MkUwICwgMTcuMzY4RTAgLCAxNy40ODNFMCAsIDE3Ljc2NEUwICwgMTguMTg1RTAgLCAxOC4yNzFFMCAsIDE4LjIzNkUwICwgMTguMjM3RTAgLCAxOC41MjNFMCAsIDE4LjYyN0UwICwgMTguNjY1RTAgLCAxOS4wODZFMCAsIDAuMjE0RTAgLCAwLjk0M0UwICwgMS40MjlFMCAsIDIuMjQxRTAgLCAyLjk1MUUwICwgMy43ODJFMCAsIDQuNzU3RTAgLCA1LjYwMkUwICwgNy4xNjlFMCAsIDguOTIwRTAgLCAxMC4wNTVFMCAsIDEyLjAzNUUwICwgMTIuODYxRTAgLCAxMy40MzZFMCAsIDE0LjE2N0UwICwgMTQuNzU1RTAgLCAxNS4xNjhFMCAsIDE1LjY1MUUwICwgMTUuNzQ2RTAgLCAxNi4yMTZFMCAsIDE2LjQ0NUUwICwgMTYuOTY1RTAgLCAxNy4xMjFFMCAsIDE3LjIwNkUwICwgMTcuMjUwRTAgLCAxNy4zMzlFMCAsIDE3Ljc5M0UwICwgMTguMTIzRTAgLCAxOC40OUUwICAsIDE4LjU2NkUwICwgMTguNjQ1RTAgLCAxOC43MDZFMCAsIDE4LjkyNEUwICwgMTkuMUUwICAgLCAwLjM3NUUwICwgMC40NzFFMCAsIDEuNTA0RTAgLCAyLjIwNEUwICwgMi44MTNFMCAsIDQuNzY1RTAgLCA5LjgzNUUwICwgMTAuMDQwRTAgLCAxMS45NDZFMCAsIDEyLjU5NkUwICwgCi0xMy4zMDNFMCAsIDEzLjkyMkUwICwgMTQuNDQwRTAgLCAxNC45NTFFMCAsIDE1LjYyN0UwICwgMTUuNjM5RTAgLCAxNS44MTRFMCAsIDE2LjMxNUUwICwgMTYuMzM0RTAgLCAxNi40MzBFMCAsIDE2LjQyM0UwICwgMTcuMDI0RTAgLCAxNy4wMDlFMCAsIDE3LjE2NUUwICwgMTcuMTM0RTAgLCAxNy4zNDlFMCAsIDE3LjU3NkUwICwgMTcuODQ4RTAgLCAxOC4wOTBFMCAsIDE4LjI3NkUwICwgMTguNDA0RTAgLCAxOC41MTlFMCAsIDE5LjEzM0UwICwgMTkuMDc0RTAgLCAxOS4yMzlFMCAsIDE5LjI4MEUwICwgMTkuMTAxRTAgLCAxOS4zOThFMCAsIDE5LjI1MkUwICwgMTkuODlFMCAgLCAyMC4wMDdFMCAsIDE5LjkyOUUwICwgMTkuMjY4RTAgLCAxOS4zMjRFMCAsIDIwLjA0OUUwICwgMjAuMTA3RTAgLCAyMC4wNjJFMCAsIDIwLjA2NUUwICwgMTkuMjg2RTAgLCAxOS45NzJFMCAsIDIwLjA4OEUwICwgMjAuNzQzRTAgLCAyMC44M0UwICAsIDIwLjkzNUUwICwgMjEuMDM1RTAgLCAyMC45M0UwICAsIDIxLjA3NEUwICwgMjEuMDg1RTAgLCAyMC45MzVFMCB9Oworc3RydWN0IGhhaG4xX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4geworICBoYWhuMV9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDcsIDIzNikge30KKyAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3hbMjM2XTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3lbMjM2XSA9IHsKKyAgICAgICAgLjU5MUUwLCAgIDEuNTQ3RTAsICAyLjkwMkUwLCAgMi44OTRFMCwgIDQuNzAzRTAsICA2LjMwN0UwLCAgNy4wM0UwLCAgIDcuODk4RTAsICA5LjQ3MEUwLCAgOS40ODRFMCwgIDEwLjA3MkUwLAorICAgICAgICAxMC4xNjNFMCwgMTEuNjE1RTAsIDEyLjAwNUUwLCAxMi40NzhFMCwgMTIuOTgyRTAsIDEyLjk3MEUwLCAxMy45MjZFMCwgMTQuNDUyRTAsIDE0LjQwNEUwLCAxNS4xOTBFMCwgMTUuNTUwRTAsCisgICAgICAgIDE1LjUyOEUwLCAxNS40OTlFMCwgMTYuMTMxRTAsIDE2LjQzOEUwLCAxNi4zODdFMCwgMTYuNTQ5RTAsIDE2Ljg3MkUwLCAxNi44MzBFMCwgMTYuOTI2RTAsIDE2LjkwN0UwLCAxNi45NjZFMCwKKyAgICAgICAgMTcuMDYwRTAsIDE3LjEyMkUwLCAxNy4zMTFFMCwgMTcuMzU1RTAsIDE3LjY2OEUwLCAxNy43NjdFMCwgMTcuODAzRTAsIDE3Ljc2NUUwLCAxNy43NjhFMCwgMTcuNzM2RTAsIDE3Ljg1OEUwLAorICAgICAgICAxNy44NzdFMCwgMTcuOTEyRTAsIDE4LjA0NkUwLCAxOC4wODVFMCwgMTguMjkxRTAsIDE4LjM1N0UwLCAxOC40MjZFMCwgMTguNTg0RTAsIDE4LjYxMEUwLCAxOC44NzBFMCwgMTguNzk1RTAsCisgICAgICAgIDE5LjExMUUwLCAuMzY3RTAsICAgLjc5NkUwLCAgIDAuODkyRTAsICAxLjkwM0UwLCAgMi4xNTBFMCwgIDMuNjk3RTAsICA1Ljg3MEUwLCAgNi40MjFFMCwgIDcuNDIyRTAsICA5Ljk0NEUwLAorICAgICAgICAxMS4wMjNFMCwgMTEuODdFMCwgIDEyLjc4NkUwLCAxNC4wNjdFMCwgMTMuOTc0RTAsIDE0LjQ2MkUwLCAxNC40NjRFMCwgMTUuMzgxRTAsIDE1LjQ4M0UwLCAxNS41OUUwLCAgMTYuMDc1RTAsCisgICAgICAgIDE2LjM0N0UwLCAxNi4xODFFMCwgMTYuOTE1RTAsIDE3LjAwM0UwLCAxNi45NzhFMCwgMTcuNzU2RTAsIDE3LjgwOEUwLCAxNy44NjhFMCwgMTguNDgxRTAsIDE4LjQ4NkUwLCAxOS4wOTBFMCwKKyAgICAgICAgMTYuMDYyRTAsIDE2LjMzN0UwLCAxNi4zNDVFMCwgMTYuMzg4RTAsIDE3LjE1OUUwLCAxNy4xMTZFMCwgMTcuMTY0RTAsIDE3LjEyM0UwLCAxNy45NzlFMCwgMTcuOTc0RTAsIDE4LjAwN0UwLAorICAgICAgICAxNy45OTNFMCwgMTguNTIzRTAsIDE4LjY2OUUwLCAxOC42MTdFMCwgMTkuMzcxRTAsIDE5LjMzMEUwLCAwLjA4MEUwLCAgMC4yNDhFMCwgIDEuMDg5RTAsICAxLjQxOEUwLCAgMi4yNzhFMCwKKyAgICAgICAgMy42MjRFMCwgIDQuNTc0RTAsICA1LjU1NkUwLCAgNy4yNjdFMCwgIDcuNjk1RTAsICA5LjEzNkUwLCAgOS45NTlFMCwgIDkuOTU3RTAsICAxMS42MDBFMCwgMTMuMTM4RTAsIDEzLjU2NEUwLAorICAgICAgICAxMy44NzFFMCwgMTMuOTk0RTAsIDE0Ljk0N0UwLCAxNS40NzNFMCwgMTUuMzc5RTAsIDE1LjQ1NUUwLCAxNS45MDhFMCwgMTYuMTE0RTAsIDE3LjA3MUUwLCAxNy4xMzVFMCwgMTcuMjgyRTAsCisgICAgICAgIDE3LjM2OEUwLCAxNy40ODNFMCwgMTcuNzY0RTAsIDE4LjE4NUUwLCAxOC4yNzFFMCwgMTguMjM2RTAsIDE4LjIzN0UwLCAxOC41MjNFMCwgMTguNjI3RTAsIDE4LjY2NUUwLCAxOS4wODZFMCwKKyAgICAgICAgMC4yMTRFMCwgIDAuOTQzRTAsICAxLjQyOUUwLCAgMi4yNDFFMCwgIDIuOTUxRTAsICAzLjc4MkUwLCAgNC43NTdFMCwgIDUuNjAyRTAsICA3LjE2OUUwLCAgOC45MjBFMCwgIDEwLjA1NUUwLAorICAgICAgICAxMi4wMzVFMCwgMTIuODYxRTAsIDEzLjQzNkUwLCAxNC4xNjdFMCwgMTQuNzU1RTAsIDE1LjE2OEUwLCAxNS42NTFFMCwgMTUuNzQ2RTAsIDE2LjIxNkUwLCAxNi40NDVFMCwgMTYuOTY1RTAsCisgICAgICAgIDE3LjEyMUUwLCAxNy4yMDZFMCwgMTcuMjUwRTAsIDE3LjMzOUUwLCAxNy43OTNFMCwgMTguMTIzRTAsIDE4LjQ5RTAsICAxOC41NjZFMCwgMTguNjQ1RTAsIDE4LjcwNkUwLCAxOC45MjRFMCwKKyAgICAgICAgMTkuMUUwLCAgIDAuMzc1RTAsICAwLjQ3MUUwLCAgMS41MDRFMCwgIDIuMjA0RTAsICAyLjgxM0UwLCAgNC43NjVFMCwgIDkuODM1RTAsICAxMC4wNDBFMCwgMTEuOTQ2RTAsIDEyLjU5NkUwLAorICAgICAgICAxMy4zMDNFMCwgMTMuOTIyRTAsIDE0LjQ0MEUwLCAxNC45NTFFMCwgMTUuNjI3RTAsIDE1LjYzOUUwLCAxNS44MTRFMCwgMTYuMzE1RTAsIDE2LjMzNEUwLCAxNi40MzBFMCwgMTYuNDIzRTAsCisgICAgICAgIDE3LjAyNEUwLCAxNy4wMDlFMCwgMTcuMTY1RTAsIDE3LjEzNEUwLCAxNy4zNDlFMCwgMTcuNTc2RTAsIDE3Ljg0OEUwLCAxOC4wOTBFMCwgMTguMjc2RTAsIDE4LjQwNEUwLCAxOC41MTlFMCwKKyAgICAgICAgMTkuMTMzRTAsIDE5LjA3NEUwLCAxOS4yMzlFMCwgMTkuMjgwRTAsIDE5LjEwMUUwLCAxOS4zOThFMCwgMTkuMjUyRTAsIDE5Ljg5RTAsICAyMC4wMDdFMCwgMTkuOTI5RTAsIDE5LjI2OEUwLAorICAgICAgICAxOS4zMjRFMCwgMjAuMDQ5RTAsIDIwLjEwN0UwLCAyMC4wNjJFMCwgMjAuMDY1RTAsIDE5LjI4NkUwLCAxOS45NzJFMCwgMjAuMDg4RTAsIDIwLjc0M0UwLCAyMC44M0UwLCAgMjAuOTM1RTAsCisgICAgICAgIDIxLjAzNUUwLCAyMC45M0UwLCAgMjEuMDc0RTAsIDIxLjA4NUUwLCAyMC45MzVFMH07CiAKLSAgICAgICAgLy8gICAgICAgIGludCBjYWxsZWQ9MDsgcHJpbnRmKCJjYWxsIGhhaG4xX2Z1bmN0b3Igd2l0aCAgaWZsYWc9JWQsIGNhbGxlZD0lZFxuIiwgaWZsYWcsIGNhbGxlZCk7IGlmIChpZmxhZz09MSkgY2FsbGVkKys7CisgICAgLy8gICAgICAgIGludCBjYWxsZWQ9MDsgcHJpbnRmKCJjYWxsIGhhaG4xX2Z1bmN0b3Igd2l0aCAgaWZsYWc9JWQsIGNhbGxlZD0lZFxuIiwgaWZsYWcsIGNhbGxlZCk7IGlmIChpZmxhZz09MSkKKyAgICAvLyAgICAgICAgY2FsbGVkKys7CiAKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT03KTsKLSAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0yMzYpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwyMzY7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIHg9bV94W2ldLCB4eD14KngsIHh4eD14eCp4OwotICAgICAgICAgICAgZnZlY1tpXSA9IChiWzBdK2JbMV0qeCtiWzJdKnh4K2JbM10qeHh4KSAvICgxLitiWzRdKngrYls1XSp4eCtiWzZdKnh4eCkgLSBtX3lbaV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDcpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSAyMzYpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjM2OyBpKyspIHsKKyAgICAgIGRvdWJsZSB4ID0gbV94W2ldLCB4eCA9IHggKiB4LCB4eHggPSB4eCAqIHg7CisgICAgICBmdmVjW2ldID0gKGJbMF0gKyBiWzFdICogeCArIGJbMl0gKiB4eCArIGJbM10gKiB4eHgpIC8gKDEuICsgYls0XSAqIHggKyBiWzVdICogeHggKyBiWzZdICogeHh4KSAtIG1feVtpXTsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIAotICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTcpOwotICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTIzNik7Ci0gICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Nyk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDIzNjsgaSsrKSB7Ci0gICAgICAgICAgICBkb3VibGUgeD1tX3hbaV0sIHh4PXgqeCwgeHh4PXh4Kng7Ci0gICAgICAgICAgICBkb3VibGUgZmFjdCA9IDEuLygxLitiWzRdKngrYls1XSp4eCtiWzZdKnh4eCk7Ci0gICAgICAgICAgICBmamFjKGksMCkgPSAxLipmYWN0OwotICAgICAgICAgICAgZmphYyhpLDEpID0geCpmYWN0OwotICAgICAgICAgICAgZmphYyhpLDIpID0geHgqZmFjdDsKLSAgICAgICAgICAgIGZqYWMoaSwzKSA9IHh4eCpmYWN0OwotICAgICAgICAgICAgZmFjdCA9IC0gKGJbMF0rYlsxXSp4K2JbMl0qeHgrYlszXSp4eHgpICogZmFjdCAqIGZhY3Q7Ci0gICAgICAgICAgICBmamFjKGksNCkgPSB4KmZhY3Q7Ci0gICAgICAgICAgICBmamFjKGksNSkgPSB4eCpmYWN0OwotICAgICAgICAgICAgZmphYyhpLDYpID0geHh4KmZhY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gNyk7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDIzNik7CisgICAgYXNzZXJ0KGZqYWMuY29scygpID09IDcpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjM2OyBpKyspIHsKKyAgICAgIGRvdWJsZSB4ID0gbV94W2ldLCB4eCA9IHggKiB4LCB4eHggPSB4eCAqIHg7CisgICAgICBkb3VibGUgZmFjdCA9IDEuIC8gKDEuICsgYls0XSAqIHggKyBiWzVdICogeHggKyBiWzZdICogeHh4KTsKKyAgICAgIGZqYWMoaSwgMCkgPSAxLiAqIGZhY3Q7CisgICAgICBmamFjKGksIDEpID0geCAqIGZhY3Q7CisgICAgICBmamFjKGksIDIpID0geHggKiBmYWN0OworICAgICAgZmphYyhpLCAzKSA9IHh4eCAqIGZhY3Q7CisgICAgICBmYWN0ID0gLShiWzBdICsgYlsxXSAqIHggKyBiWzJdICogeHggKyBiWzNdICogeHh4KSAqIGZhY3QgKiBmYWN0OworICAgICAgZmphYyhpLCA0KSA9IHggKiBmYWN0OworICAgICAgZmphYyhpLCA1KSA9IHh4ICogZmFjdDsKKyAgICAgIGZqYWMoaSwgNikgPSB4eHggKiBmYWN0OwogICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKLWNvbnN0IGRvdWJsZSBoYWhuMV9mdW5jdG9yOjptX3hbMjM2XSA9IHsgMjQuNDFFMCAsIDM0LjgyRTAgLCA0NC4wOUUwICwgNDUuMDdFMCAsIDU0Ljk4RTAgLCA2NS41MUUwICwgNzAuNTNFMCAsIDc1LjcwRTAgLCA4OS41N0UwICwgOTEuMTRFMCAsIDk2LjQwRTAgLCA5Ny4xOUUwICwgMTE0LjI2RTAgLCAxMjAuMjVFMCAsIDEyNy4wOEUwICwgMTMzLjU1RTAgLCAxMzMuNjFFMCAsIDE1OC42N0UwICwgMTcyLjc0RTAgLCAxNzEuMzFFMCAsIDIwMi4xNEUwICwgMjIwLjU1RTAgLCAyMjEuMDVFMCAsIDIyMS4zOUUwICwgMjUwLjk5RTAgLCAyNjguOTlFMCAsIDI3MS44MEUwICwgMjcxLjk3RTAgLCAzMjEuMzFFMCAsIDMyMS42OUUwICwgMzMwLjE0RTAgLCAzMzMuMDNFMCAsIDMzMy40N0UwICwgMzQwLjc3RTAgLCAzNDUuNjVFMCAsIDM3My4xMUUwICwgMzczLjc5RTAgLCA0MTEuODJFMCAsIDQxOS41MUUwICwgNDIxLjU5RTAgLCA0MjIuMDJFMCAsIDQyMi40N0UwICwgNDIyLjYxRTAgLCA0NDEuNzVFMCAsIDQ0Ny40MUUwICwgNDQ4LjdFMCAgLCA0NzIuODlFMCAsIDQ3Ni42OUUwICwgNTIyLjQ3RTAgLCA1MjIuNjJFMCAsIDUyNC40M0UwICwgNTQ2Ljc1RTAgLCA1NDkuNTNFMCAsIDU3NS4yOUUwICwgNTc2LjAwRTAgLCA2MjUuNTVFMCAsIDIwLjE1RTAgLCAyOC43OEUwICwgMjkuNTdFMCAsIDM3LjQxRTAgLCAzOS4xMkUwICwgNTAuMjRFMCAsIDYxLjM4RTAgLCA2Ni4yNUUwICwgNzMuNDJFMCAsIDk1LjUyRTAgLCAxMDcuMzJFMCAsIDEyMi4wNEUwICwgMTM0LjAzRTAgLCAxNjMuMTlFMCAsIDE2My40OEUwICwgMTc1LjcwRTAgLCAxNzkuODZFMCAsIDIxMS4yN0UwICwgMjE3Ljc4RTAgLCAyMTkuMTRFMCAsIDI2Mi41MkUwICwgMjY4LjAxRTAgLCAyNjguNjJFMCAsIDMzNi4yNUUwICwgMzM3LjIzRTAgLCAzMzkuMzNFMCAsIDQyNy4zOEUwICwgNDI4LjU4RTAgLCA0MzIuNjhFMCAsIDUyOC45OUUwICwgNTMxLjA4RTAgLCA2MjguMzRFMCAsIDI1My4yNEUwICwgMjczLjEzRTAgLCAyNzMuNjZFMCAsCi0yODIuMTBFMCAsIDM0Ni42MkUwICwgMzQ3LjE5RTAgLCAzNDguNzhFMCAsIDM1MS4xOEUwICwgNDUwLjEwRTAgLCA0NTAuMzVFMCAsIDQ1MS45MkUwICwgNDU1LjU2RTAgLCA1NTIuMjJFMCAsIDU1My41NkUwICwgNTU1Ljc0RTAgLCA2NTIuNTlFMCAsIDY1Ni4yMEUwICwgMTQuMTNFMCAsIDIwLjQxRTAgLCAzMS4zMEUwICwgMzMuODRFMCAsIDM5LjcwRTAgLCA0OC44M0UwICwgNTQuNTBFMCAsIDYwLjQxRTAgLCA3Mi43N0UwICwgNzUuMjVFMCAsIDg2Ljg0RTAgLCA5NC44OEUwICwgOTYuNDBFMCAsIDExNy4zN0UwICwgMTM5LjA4RTAgLCAxNDcuNzNFMCAsIDE1OC42M0UwICwgMTYxLjg0RTAgLCAxOTIuMTFFMCAsIDIwNi43NkUwICwgMjA5LjA3RTAgLCAyMTMuMzJFMCAsIDIyNi40NEUwICwgMjM3LjEyRTAgLCAzMzAuOTBFMCAsIDM1OC43MkUwICwgMzcwLjc3RTAgLCAzNzIuNzJFMCAsIDM5Ni4yNEUwICwgNDE2LjU5RTAgLCA0ODQuMDJFMCAsIDQ5NS40N0UwICwgNTE0Ljc4RTAgLCA1MTUuNjVFMCAsIDUxOS40N0UwICwgNTQ0LjQ3RTAgLCA1NjAuMTFFMCAsIDYyMC43N0UwICwgMTguOTdFMCAsIDI4LjkzRTAgLCAzMy45MUUwICwgNDAuMDNFMCAsIDQ0LjY2RTAgLCA0OS44N0UwICwgNTUuMTZFMCAsIDYwLjkwRTAgLCA3Mi4wOEUwICwgODUuMTVFMCAsIDk3LjA2RTAgLCAxMTkuNjNFMCAsIDEzMy4yN0UwICwgMTQzLjg0RTAgLCAxNjEuOTFFMCAsIDE4MC42N0UwICwgMTk4LjQ0RTAgLCAyMjYuODZFMCAsIDIyOS42NUUwICwgMjU4LjI3RTAgLCAyNzMuNzdFMCAsIDMzOS4xNUUwICwgMzUwLjEzRTAgLCAzNjIuNzVFMCAsIDM3MS4wM0UwICwgMzkzLjMyRTAgLCA0NDguNTNFMCAsIDQ3My43OEUwICwgNTExLjEyRTAgLCA1MjQuNzBFMCAsIDU0OC43NUUwICwgNTUxLjY0RTAgLCA1NzQuMDJFMCAsIDYyMy44NkUwICwgMjEuNDZFMCAsIDI0LjMzRTAgLCAzMy40M0UwICwgMzkuMjJFMCAsIDQ0LjE4RTAgLCA1NS4wMkUwICwgOTQuMzNFMCAsIDk2LjQ0RTAgLCAxMTguODJFMCAsIDEyOC40OEUwICwKLTE0MS45NEUwICwgMTU2LjkyRTAgLCAxNzEuNjVFMCAsIDE5MC4wMEUwICwgMjIzLjI2RTAgLCAyMjMuODhFMCAsIDIzMS41MEUwICwgMjY1LjA1RTAgLCAyNjkuNDRFMCAsIDI3MS43OEUwICwgMjczLjQ2RTAgLCAzMzQuNjFFMCAsIDMzOS43OUUwICwgMzQ5LjUyRTAgLCAzNTguMThFMCAsIDM3Ny45OEUwICwgMzk0Ljc3RTAgLCA0MjkuNjZFMCAsIDQ2OC4yMkUwICwgNDg3LjI3RTAgLCA1MTkuNTRFMCAsIDUyMy4wM0UwICwgNjEyLjk5RTAgLCA2MzguNTlFMCAsIDY0MS4zNkUwICwgNjIyLjA1RTAgLCA2MzEuNTBFMCAsIDY2My45N0UwICwgNjQ2LjlFMCAgLCA3NDguMjlFMCAsIDc0OS4yMUUwICwgNzUwLjE0RTAgLCA2NDcuMDRFMCAsIDY0Ni44OUUwICwgNzQ2LjlFMCAgLCA3NDguNDNFMCAsIDc0Ny4zNUUwICwgNzQ5LjI3RTAgLCA2NDcuNjFFMCAsIDc0Ny43OEUwICwgNzUwLjUxRTAgLCA4NTEuMzdFMCAsIDg0NS45N0UwICwgODQ3LjU0RTAgLCA4NDkuOTNFMCAsIDg1MS42MUUwICwgODQ5Ljc1RTAgLCA4NTAuOThFMCAsIDg0OC4yM0UwfTsKK2NvbnN0IGRvdWJsZSBoYWhuMV9mdW5jdG9yOjptX3hbMjM2XSA9IHsKKyAgICAyNC40MUUwLCAgMzQuODJFMCwgIDQ0LjA5RTAsICA0NS4wN0UwLCAgNTQuOThFMCwgIDY1LjUxRTAsICA3MC41M0UwLCAgNzUuNzBFMCwgIDg5LjU3RTAsICA5MS4xNEUwLCAgOTYuNDBFMCwKKyAgICA5Ny4xOUUwLCAgMTE0LjI2RTAsIDEyMC4yNUUwLCAxMjcuMDhFMCwgMTMzLjU1RTAsIDEzMy42MUUwLCAxNTguNjdFMCwgMTcyLjc0RTAsIDE3MS4zMUUwLCAyMDIuMTRFMCwgMjIwLjU1RTAsCisgICAgMjIxLjA1RTAsIDIyMS4zOUUwLCAyNTAuOTlFMCwgMjY4Ljk5RTAsIDI3MS44MEUwLCAyNzEuOTdFMCwgMzIxLjMxRTAsIDMyMS42OUUwLCAzMzAuMTRFMCwgMzMzLjAzRTAsIDMzMy40N0UwLAorICAgIDM0MC43N0UwLCAzNDUuNjVFMCwgMzczLjExRTAsIDM3My43OUUwLCA0MTEuODJFMCwgNDE5LjUxRTAsIDQyMS41OUUwLCA0MjIuMDJFMCwgNDIyLjQ3RTAsIDQyMi42MUUwLCA0NDEuNzVFMCwKKyAgICA0NDcuNDFFMCwgNDQ4LjdFMCwgIDQ3Mi44OUUwLCA0NzYuNjlFMCwgNTIyLjQ3RTAsIDUyMi42MkUwLCA1MjQuNDNFMCwgNTQ2Ljc1RTAsIDU0OS41M0UwLCA1NzUuMjlFMCwgNTc2LjAwRTAsCisgICAgNjI1LjU1RTAsIDIwLjE1RTAsICAyOC43OEUwLCAgMjkuNTdFMCwgIDM3LjQxRTAsICAzOS4xMkUwLCAgNTAuMjRFMCwgIDYxLjM4RTAsICA2Ni4yNUUwLCAgNzMuNDJFMCwgIDk1LjUyRTAsCisgICAgMTA3LjMyRTAsIDEyMi4wNEUwLCAxMzQuMDNFMCwgMTYzLjE5RTAsIDE2My40OEUwLCAxNzUuNzBFMCwgMTc5Ljg2RTAsIDIxMS4yN0UwLCAyMTcuNzhFMCwgMjE5LjE0RTAsIDI2Mi41MkUwLAorICAgIDI2OC4wMUUwLCAyNjguNjJFMCwgMzM2LjI1RTAsIDMzNy4yM0UwLCAzMzkuMzNFMCwgNDI3LjM4RTAsIDQyOC41OEUwLCA0MzIuNjhFMCwgNTI4Ljk5RTAsIDUzMS4wOEUwLCA2MjguMzRFMCwKKyAgICAyNTMuMjRFMCwgMjczLjEzRTAsIDI3My42NkUwLCAyODIuMTBFMCwgMzQ2LjYyRTAsIDM0Ny4xOUUwLCAzNDguNzhFMCwgMzUxLjE4RTAsIDQ1MC4xMEUwLCA0NTAuMzVFMCwgNDUxLjkyRTAsCisgICAgNDU1LjU2RTAsIDU1Mi4yMkUwLCA1NTMuNTZFMCwgNTU1Ljc0RTAsIDY1Mi41OUUwLCA2NTYuMjBFMCwgMTQuMTNFMCwgIDIwLjQxRTAsICAzMS4zMEUwLCAgMzMuODRFMCwgIDM5LjcwRTAsCisgICAgNDguODNFMCwgIDU0LjUwRTAsICA2MC40MUUwLCAgNzIuNzdFMCwgIDc1LjI1RTAsICA4Ni44NEUwLCAgOTQuODhFMCwgIDk2LjQwRTAsICAxMTcuMzdFMCwgMTM5LjA4RTAsIDE0Ny43M0UwLAorICAgIDE1OC42M0UwLCAxNjEuODRFMCwgMTkyLjExRTAsIDIwNi43NkUwLCAyMDkuMDdFMCwgMjEzLjMyRTAsIDIyNi40NEUwLCAyMzcuMTJFMCwgMzMwLjkwRTAsIDM1OC43MkUwLCAzNzAuNzdFMCwKKyAgICAzNzIuNzJFMCwgMzk2LjI0RTAsIDQxNi41OUUwLCA0ODQuMDJFMCwgNDk1LjQ3RTAsIDUxNC43OEUwLCA1MTUuNjVFMCwgNTE5LjQ3RTAsIDU0NC40N0UwLCA1NjAuMTFFMCwgNjIwLjc3RTAsCisgICAgMTguOTdFMCwgIDI4LjkzRTAsICAzMy45MUUwLCAgNDAuMDNFMCwgIDQ0LjY2RTAsICA0OS44N0UwLCAgNTUuMTZFMCwgIDYwLjkwRTAsICA3Mi4wOEUwLCAgODUuMTVFMCwgIDk3LjA2RTAsCisgICAgMTE5LjYzRTAsIDEzMy4yN0UwLCAxNDMuODRFMCwgMTYxLjkxRTAsIDE4MC42N0UwLCAxOTguNDRFMCwgMjI2Ljg2RTAsIDIyOS42NUUwLCAyNTguMjdFMCwgMjczLjc3RTAsIDMzOS4xNUUwLAorICAgIDM1MC4xM0UwLCAzNjIuNzVFMCwgMzcxLjAzRTAsIDM5My4zMkUwLCA0NDguNTNFMCwgNDczLjc4RTAsIDUxMS4xMkUwLCA1MjQuNzBFMCwgNTQ4Ljc1RTAsIDU1MS42NEUwLCA1NzQuMDJFMCwKKyAgICA2MjMuODZFMCwgMjEuNDZFMCwgIDI0LjMzRTAsICAzMy40M0UwLCAgMzkuMjJFMCwgIDQ0LjE4RTAsICA1NS4wMkUwLCAgOTQuMzNFMCwgIDk2LjQ0RTAsICAxMTguODJFMCwgMTI4LjQ4RTAsCisgICAgMTQxLjk0RTAsIDE1Ni45MkUwLCAxNzEuNjVFMCwgMTkwLjAwRTAsIDIyMy4yNkUwLCAyMjMuODhFMCwgMjMxLjUwRTAsIDI2NS4wNUUwLCAyNjkuNDRFMCwgMjcxLjc4RTAsIDI3My40NkUwLAorICAgIDMzNC42MUUwLCAzMzkuNzlFMCwgMzQ5LjUyRTAsIDM1OC4xOEUwLCAzNzcuOThFMCwgMzk0Ljc3RTAsIDQyOS42NkUwLCA0NjguMjJFMCwgNDg3LjI3RTAsIDUxOS41NEUwLCA1MjMuMDNFMCwKKyAgICA2MTIuOTlFMCwgNjM4LjU5RTAsIDY0MS4zNkUwLCA2MjIuMDVFMCwgNjMxLjUwRTAsIDY2My45N0UwLCA2NDYuOUUwLCAgNzQ4LjI5RTAsIDc0OS4yMUUwLCA3NTAuMTRFMCwgNjQ3LjA0RTAsCisgICAgNjQ2Ljg5RTAsIDc0Ni45RTAsICA3NDguNDNFMCwgNzQ3LjM1RTAsIDc0OS4yN0UwLCA2NDcuNjFFMCwgNzQ3Ljc4RTAsIDc1MC41MUUwLCA4NTEuMzdFMCwgODQ1Ljk3RTAsIDg0Ny41NEUwLAorICAgIDg0OS45M0UwLCA4NTEuNjFFMCwgODQ5Ljc1RTAsIDg1MC45OEUwLCA4NDguMjNFMH07CiAKIC8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL2hhaG4xLnNodG1sCi12b2lkIHRlc3ROaXN0SGFobjEodm9pZCkKLXsKLSAgY29uc3QgaW50ICBuPTc7Cit2b2lkIHRlc3ROaXN0SGFobjEodm9pZCkgeworICBjb25zdCBpbnQgbiA9IDc7CiAgIGludCBpbmZvOwogCiAgIFZlY3RvclhkIHgobik7CkBAIC04NTcsNyArODI5LDcgQEAKICAgLyoKICAgICogRmlyc3QgdHJ5CiAgICAqLwotICB4PDwgMTAuLCAtMS4sIC4wNSwgLS4wMDAwMSwgLS4wNSwgLjAwMSwgLS4wMDAwMDE7CisgIHggPDwgMTAuLCAtMS4sIC4wNSwgLS4wMDAwMSwgLS4wNSwgLjAwMSwgLS4wMDAwMDE7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBoYWhuMV9mdW5jdG9yIGZ1bmN0b3I7CiAgIExldmVuYmVyZ01hcnF1YXJkdDxoYWhuMV9mdW5jdG9yPiBsbShmdW5jdG9yKTsKQEAgLTg3MSwxNyArODQzLDE3IEBACiAgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCAxLjUzMjQzODI4NTRFKzAwKTsKICAgLy8gY2hlY2sgeAogICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDEuMDc3NjM1MTczM0UrMDApOwotICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sLTEuMjI2OTI5NjkyMUUtMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIC0xLjIyNjkyOTY5MjFFLTAxKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCA0LjA4NjM3NTA2MTBFLTAzKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLC0xLjQyNjI2NGUtMDYpOyAvLyBzaG91bGRlIGJlIDogLTEuNDI2MjY2MjUxNEUtMDYKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLC01Ljc2MDk5NDA5MDFFLTAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAtMS40MjYyNjRlLTA2KTsgIC8vIHNob3VsZGUgYmUgOiAtMS40MjYyNjYyNTE0RS0wNgorICBWRVJJRllfSVNfQVBQUk9YKHhbNF0sIC01Ljc2MDk5NDA5MDFFLTAzKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzVdLCAyLjQwNTM3MzU1MDNFLTA0KTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzZdLC0xLjIzMTQ0NTAxOTlFLTA3KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzZdLCAtMS4yMzE0NDUwMTk5RS0wNyk7CiAKICAgLyoKICAgICogU2Vjb25kIHRyeQogICAgKi8KLSAgeDw8IC4xLCAtLjEsIC4wMDUsIC0uMDAwMDAxLCAtLjAwNSwgLjAwMDEsIC0uMDAwMDAwMTsKKyAgeCA8PCAuMSwgLS4xLCAuMDA1LCAtLjAwMDAwMSwgLS4wMDUsIC4wMDAxLCAtLjAwMDAwMDE7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbmZvKQpAQCAtODkyLDUwICs4NjQsNDcgQEAKICAgLy8gY2hlY2sgbm9ybV4yCiAgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCAxLjUzMjQzODI4NTRFKzAwKTsKICAgLy8gY2hlY2sgeAotICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDEuMDc3NjQwKTsgLy8gc2hvdWxkIGJlIDogIDEuMDc3NjM1MTczM0UrMDAKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAtMC4xMjI2OTMzKTsgLy8gc2hvdWxkIGJlIDogLTEuMjI2OTI5NjkyMUUtMDEKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAwLjAwNDA4NjM4Myk7IC8vIHNob3VsZCBiZSA6IDQuMDg2Mzc1MDYxMEUtMDMKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAtMS40MjYyNzdlLTA2KTsgLy8gc2hvdWxkZSBiZSA6IC0xLjQyNjI2NjI1MTRFLTA2Ci0gIFZFUklGWV9JU19BUFBST1goeFs0XSwtNS43NjA5OTQwOTAxRS0wMyk7Ci0gIFZFUklGWV9JU19BUFBST1goeFs1XSwgMC4wMDAyNDA1Mzc3Mik7IC8vIHNob3VsZCBiZSA6IDIuNDA1MzczNTUwM0UtMDQKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzZdLCAtMS4yMzE0NTBlLTA3KTsgLy8gc2hvdWxkIGJlIDogLTEuMjMxNDQ1MDE5OUUtMDcKLQorICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDEuMDc3NjQwKTsgICAgICAgLy8gc2hvdWxkIGJlIDogIDEuMDc3NjM1MTczM0UrMDAKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAtMC4xMjI2OTMzKTsgICAgIC8vIHNob3VsZCBiZSA6IC0xLjIyNjkyOTY5MjFFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMC4wMDQwODYzODMpOyAgICAvLyBzaG91bGQgYmUgOiA0LjA4NjM3NTA2MTBFLTAzCisgIFZFUklGWV9JU19BUFBST1goeFszXSwgLTEuNDI2Mjc3ZS0wNik7ICAvLyBzaG91bGRlIGJlIDogLTEuNDI2MjY2MjUxNEUtMDYKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLCAtNS43NjA5OTQwOTAxRS0wMyk7CisgIFZFUklGWV9JU19BUFBST1goeFs1XSwgMC4wMDAyNDA1Mzc3Mik7ICAvLyBzaG91bGQgYmUgOiAyLjQwNTM3MzU1MDNFLTA0CisgIFZFUklGWV9JU19BUFBST1goeFs2XSwgLTEuMjMxNDUwZS0wNyk7ICAvLyBzaG91bGQgYmUgOiAtMS4yMzE0NDUwMTk5RS0wNwogfQogCi1zdHJ1Y3QgbWlzcmExZF9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Ci17Ci0gICAgbWlzcmExZF9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDIsMTQpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE0XTsKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTRdOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Mik7Ci0gICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTQpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwxNDsgaSsrKSB7Ci0gICAgICAgICAgICBmdmVjW2ldID0gYlswXSpiWzFdKnhbaV0vKDEuK2JbMV0qeFtpXSkgLSB5W2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworc3RydWN0IG1pc3JhMWRfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPiB7CisgIG1pc3JhMWRfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPigyLCAxNCkge30KKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE0XTsKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzE0XTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDIpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSAxNCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNDsgaSsrKSB7CisgICAgICBmdmVjW2ldID0gYlswXSAqIGJbMV0gKiB4W2ldIC8gKDEuICsgYlsxXSAqIHhbaV0pIC0geVtpXTsKICAgICB9Ci0gICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Mik7Ci0gICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTQpOwotICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTIpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwxNDsgaSsrKSB7Ci0gICAgICAgICAgICBkb3VibGUgZGVuID0gMS4rYlsxXSp4W2ldOwotICAgICAgICAgICAgZmphYyhpLDApID0gYlsxXSp4W2ldIC8gZGVuOwotICAgICAgICAgICAgZmphYyhpLDEpID0gYlswXSp4W2ldKihkZW4tYlsxXSp4W2ldKS9kZW4vZGVuOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAwOworICB9CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gMik7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDE0KTsKKyAgICBhc3NlcnQoZmphYy5jb2xzKCkgPT0gMik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNDsgaSsrKSB7CisgICAgICBkb3VibGUgZGVuID0gMS4gKyBiWzFdICogeFtpXTsKKyAgICAgIGZqYWMoaSwgMCkgPSBiWzFdICogeFtpXSAvIGRlbjsKKyAgICAgIGZqYWMoaSwgMSkgPSBiWzBdICogeFtpXSAqIChkZW4gLSBiWzFdICogeFtpXSkgLyBkZW4gLyBkZW47CiAgICAgfQorICAgIHJldHVybiAwOworICB9CiB9OwotY29uc3QgZG91YmxlIG1pc3JhMWRfZnVuY3Rvcjo6eFsxNF0gPSB7IDc3LjZFMCwgMTE0LjlFMCwgMTQxLjFFMCwgMTkwLjhFMCwgMjM5LjlFMCwgMjg5LjBFMCwgMzMyLjhFMCwgMzc4LjRFMCwgNDM0LjhFMCwgNDc3LjNFMCwgNTM2LjhFMCwgNTkzLjFFMCwgNjg5LjFFMCwgNzYwLjBFMH07Ci1jb25zdCBkb3VibGUgbWlzcmExZF9mdW5jdG9yOjp5WzE0XSA9IHsgMTAuMDdFMCwgMTQuNzNFMCwgMTcuOTRFMCwgMjMuOTNFMCwgMjkuNjFFMCwgMzUuMThFMCwgNDAuMDJFMCwgNDQuODJFMCwgNTAuNzZFMCwgNTUuMDVFMCwgNjEuMDFFMCwgNjYuNDBFMCwgNzUuNDdFMCwgODEuNzhFMH07Citjb25zdCBkb3VibGUgbWlzcmExZF9mdW5jdG9yOjp4WzE0XSA9IHs3Ny42RTAsICAxMTQuOUUwLCAxNDEuMUUwLCAxOTAuOEUwLCAyMzkuOUUwLCAyODkuMEUwLCAzMzIuOEUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzc4LjRFMCwgNDM0LjhFMCwgNDc3LjNFMCwgNTM2LjhFMCwgNTkzLjFFMCwgNjg5LjFFMCwgNzYwLjBFMH07Citjb25zdCBkb3VibGUgbWlzcmExZF9mdW5jdG9yOjp5WzE0XSA9IHsxMC4wN0UwLCAxNC43M0UwLCAxNy45NEUwLCAyMy45M0UwLCAyOS42MUUwLCAzNS4xOEUwLCA0MC4wMkUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQuODJFMCwgNTAuNzZFMCwgNTUuMDVFMCwgNjEuMDFFMCwgNjYuNDBFMCwgNzUuNDdFMCwgODEuNzhFMH07CiAKIC8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL21pc3JhMWQuc2h0bWwKLXZvaWQgdGVzdE5pc3RNaXNyYTFkKHZvaWQpCi17Ci0gIGNvbnN0IGludCBuPTI7Cit2b2lkIHRlc3ROaXN0TWlzcmExZCh2b2lkKSB7CisgIGNvbnN0IGludCBuID0gMjsKICAgaW50IGluZm87CiAKICAgVmVjdG9yWGQgeChuKTsKQEAgLTk0Myw3ICs5MTIsNyBAQAogICAvKgogICAgKiBGaXJzdCB0cnkKICAgICovCi0gIHg8PCA1MDAuLCAwLjAwMDE7CisgIHggPDwgNTAwLiwgMC4wMDAxOwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgbWlzcmExZF9mdW5jdG9yIGZ1bmN0b3I7CiAgIExldmVuYmVyZ01hcnF1YXJkdDxtaXNyYTFkX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOwpAQCAtOTYyLDcgKzkzMSw3IEBACiAgIC8qCiAgICAqIFNlY29uZCB0cnkKICAgICovCi0gIHg8PCA0NTAuLCAwLjAwMDM7CisgIHggPDwgNDUwLiwgMC4wMDAzOwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgaW5mbyA9IGxtLm1pbmltaXplKHgpOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaW5mbykKQEAgLTk3Nyw0MyArOTQ2LDQ4IEBACiAgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMy4wMjI3MzI0NDQ5RS0wNCk7CiB9CiAKLQotc3RydWN0IGxhbmN6b3MxX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KLXsKLSAgICBsYW5jem9zMV9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDYsMjQpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzI0XTsKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMjRdOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Nik7Ci0gICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MjQpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwyNDsgaSsrKQotICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0qZXhwKC1iWzFdKnhbaV0pICsgYlsyXSpleHAoLWJbM10qeFtpXSkgKyBiWzRdKmV4cCgtYls1XSp4W2ldKSAgLSB5W2ldOwotICAgICAgICByZXR1cm4gMDsKK3N0cnVjdCBsYW5jem9zMV9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+IHsKKyAgbGFuY3pvczFfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPig2LCAyNCkge30KKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzI0XTsKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzI0XTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDYpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSAyNCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKQorICAgICAgZnZlY1tpXSA9IGJbMF0gKiBleHAoLWJbMV0gKiB4W2ldKSArIGJbMl0gKiBleHAoLWJbM10gKiB4W2ldKSArIGJbNF0gKiBleHAoLWJbNV0gKiB4W2ldKSAtIHlbaV07CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykgeworICAgIGFzc2VydChiLnNpemUoKSA9PSA2KTsKKyAgICBhc3NlcnQoZmphYy5yb3dzKCkgPT0gMjQpOworICAgIGFzc2VydChmamFjLmNvbHMoKSA9PSA2KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIHsKKyAgICAgIGZqYWMoaSwgMCkgPSBleHAoLWJbMV0gKiB4W2ldKTsKKyAgICAgIGZqYWMoaSwgMSkgPSAtYlswXSAqIHhbaV0gKiBleHAoLWJbMV0gKiB4W2ldKTsKKyAgICAgIGZqYWMoaSwgMikgPSBleHAoLWJbM10gKiB4W2ldKTsKKyAgICAgIGZqYWMoaSwgMykgPSAtYlsyXSAqIHhbaV0gKiBleHAoLWJbM10gKiB4W2ldKTsKKyAgICAgIGZqYWMoaSwgNCkgPSBleHAoLWJbNV0gKiB4W2ldKTsKKyAgICAgIGZqYWMoaSwgNSkgPSAtYls0XSAqIHhbaV0gKiBleHAoLWJbNV0gKiB4W2ldKTsKICAgICB9Ci0gICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Nik7Ci0gICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MjQpOwotICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTYpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwyNDsgaSsrKSB7Ci0gICAgICAgICAgICBmamFjKGksMCkgPSBleHAoLWJbMV0qeFtpXSk7Ci0gICAgICAgICAgICBmamFjKGksMSkgPSAtYlswXSp4W2ldKmV4cCgtYlsxXSp4W2ldKTsKLSAgICAgICAgICAgIGZqYWMoaSwyKSA9IGV4cCgtYlszXSp4W2ldKTsKLSAgICAgICAgICAgIGZqYWMoaSwzKSA9IC1iWzJdKnhbaV0qZXhwKC1iWzNdKnhbaV0pOwotICAgICAgICAgICAgZmphYyhpLDQpID0gZXhwKC1iWzVdKnhbaV0pOwotICAgICAgICAgICAgZmphYyhpLDUpID0gLWJbNF0qeFtpXSpleHAoLWJbNV0qeFtpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiAwOworICB9CiB9OwotY29uc3QgZG91YmxlIGxhbmN6b3MxX2Z1bmN0b3I6OnhbMjRdID0geyAwLjAwMDAwMDAwMDAwMEUrMDAsIDUuMDAwMDAwMDAwMDAwRS0wMiwgMS4wMDAwMDAwMDAwMDBFLTAxLCAxLjUwMDAwMDAwMDAwMEUtMDEsIDIuMDAwMDAwMDAwMDAwRS0wMSwgMi41MDAwMDAwMDAwMDBFLTAxLCAzLjAwMDAwMDAwMDAwMEUtMDEsIDMuNTAwMDAwMDAwMDAwRS0wMSwgNC4wMDAwMDAwMDAwMDBFLTAxLCA0LjUwMDAwMDAwMDAwMEUtMDEsIDUuMDAwMDAwMDAwMDAwRS0wMSwgNS41MDAwMDAwMDAwMDBFLTAxLCA2LjAwMDAwMDAwMDAwMEUtMDEsIDYuNTAwMDAwMDAwMDAwRS0wMSwgNy4wMDAwMDAwMDAwMDBFLTAxLCA3LjUwMDAwMDAwMDAwMEUtMDEsIDguMDAwMDAwMDAwMDAwRS0wMSwgOC41MDAwMDAwMDAwMDBFLTAxLCA5LjAwMDAwMDAwMDAwMEUtMDEsIDkuNTAwMDAwMDAwMDAwRS0wMSwgMS4wMDAwMDAwMDAwMDBFKzAwLCAxLjA1MDAwMDAwMDAwMEUrMDAsIDEuMTAwMDAwMDAwMDAwRSswMCwgMS4xNTAwMDAwMDAwMDBFKzAwIH07Ci1jb25zdCBkb3VibGUgbGFuY3pvczFfZnVuY3Rvcjo6eVsyNF0gPSB7IDIuNTEzNDAwMDAwMDAwRSswMCAsMi4wNDQzMzMzNzMyOTFFKzAwICwxLjY2ODQwNDQzNjU2NEUrMDAgLDEuMzY2NDE4MDIxMjA4RSswMCAsMS4xMjMyMzI0ODczNzJFKzAwICw5LjI2ODg5NzE4MDAzN0UtMDEgLDcuNjc5MzM4NTYzNzI4RS0wMSAsNi4zODg3NzU1MjMxMDZFLTAxICw1LjMzNzgzNTMxNzQwMkUtMDEgLDQuNDc5MzYzNjE3MzQ3RS0wMSAsMy43NzU4NDc4ODQzNTBFLTAxICwzLjE5NzM5MzE5OTMyNkUtMDEgLDIuNzIwMTMwNzczNzQ2RS0wMSAsMi4zMjQ5NjU1MjkwMzJFLTAxICwxLjk5NjU4OTU0NjA2NUUtMDEgLDEuNzIyNzA0MTI2OTE0RS0wMSAsMS40OTM0MDU2NjAxNjhFLTAxICwxLjMwMDcwMDIwNjkyMkUtMDEgLDEuMTM4MTE5MzI0NjQ0RS0wMSAsMS4wMDA0MTU1ODc1NTlFLTAxICw4LjgzMzIwOTA4NDU0MEUtMDIgLDcuODMzNTQ0MDE5MzUwRS0wMiAsNi45NzY2OTM3NDM0NDlFLTAyICw2LjIzOTMxMjUzNjcxOUUtMDIgfTsKK2NvbnN0IGRvdWJsZSBsYW5jem9zMV9mdW5jdG9yOjp4WzI0XSA9IHswLjAwMDAwMDAwMDAwMEUrMDAsIDUuMDAwMDAwMDAwMDAwRS0wMiwgMS4wMDAwMDAwMDAwMDBFLTAxLCAxLjUwMDAwMDAwMDAwMEUtMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wMDAwMDAwMDAwMDBFLTAxLCAyLjUwMDAwMDAwMDAwMEUtMDEsIDMuMDAwMDAwMDAwMDAwRS0wMSwgMy41MDAwMDAwMDAwMDBFLTAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDAwMDAwMDAwMDAwRS0wMSwgNC41MDAwMDAwMDAwMDBFLTAxLCA1LjAwMDAwMDAwMDAwMEUtMDEsIDUuNTAwMDAwMDAwMDAwRS0wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LjAwMDAwMDAwMDAwMEUtMDEsIDYuNTAwMDAwMDAwMDAwRS0wMSwgNy4wMDAwMDAwMDAwMDBFLTAxLCA3LjUwMDAwMDAwMDAwMEUtMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC4wMDAwMDAwMDAwMDBFLTAxLCA4LjUwMDAwMDAwMDAwMEUtMDEsIDkuMDAwMDAwMDAwMDAwRS0wMSwgOS41MDAwMDAwMDAwMDBFLTAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDAwMDAwMDAwMDAwRSswMCwgMS4wNTAwMDAwMDAwMDBFKzAwLCAxLjEwMDAwMDAwMDAwMEUrMDAsIDEuMTUwMDAwMDAwMDAwRSswMH07Citjb25zdCBkb3VibGUgbGFuY3pvczFfZnVuY3Rvcjo6eVsyNF0gPSB7Mi41MTM0MDAwMDAwMDBFKzAwLCAyLjA0NDMzMzM3MzI5MUUrMDAsIDEuNjY4NDA0NDM2NTY0RSswMCwgMS4zNjY0MTgwMjEyMDhFKzAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTIzMjMyNDg3MzcyRSswMCwgOS4yNjg4OTcxODAwMzdFLTAxLCA3LjY3OTMzODU2MzcyOEUtMDEsIDYuMzg4Nzc1NTIzMTA2RS0wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjMzNzgzNTMxNzQwMkUtMDEsIDQuNDc5MzYzNjE3MzQ3RS0wMSwgMy43NzU4NDc4ODQzNTBFLTAxLCAzLjE5NzM5MzE5OTMyNkUtMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi43MjAxMzA3NzM3NDZFLTAxLCAyLjMyNDk2NTUyOTAzMkUtMDEsIDEuOTk2NTg5NTQ2MDY1RS0wMSwgMS43MjI3MDQxMjY5MTRFLTAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDkzNDA1NjYwMTY4RS0wMSwgMS4zMDA3MDAyMDY5MjJFLTAxLCAxLjEzODExOTMyNDY0NEUtMDEsIDEuMDAwNDE1NTg3NTU5RS0wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LjgzMzIwOTA4NDU0MEUtMDIsIDcuODMzNTQ0MDE5MzUwRS0wMiwgNi45NzY2OTM3NDM0NDlFLTAyLCA2LjIzOTMxMjUzNjcxOUUtMDJ9OwogCiAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9sYW5jem9zMS5zaHRtbAotdm9pZCB0ZXN0TmlzdExhbmN6b3MxKHZvaWQpCi17Ci0gIGNvbnN0IGludCBuPTY7Cit2b2lkIHRlc3ROaXN0TGFuY3pvczEodm9pZCkgeworICBjb25zdCBpbnQgbiA9IDY7CiAgIGludCBpbmZvOwogCiAgIFZlY3RvclhkIHgobik7CkBAIC0xMDIxLDcgKzk5NSw3IEBACiAgIC8qCiAgICAqIEZpcnN0IHRyeQogICAgKi8KLSAgeDw8IDEuMiwgMC4zLCA1LjYsIDUuNSwgNi41LCA3LjY7CisgIHggPDwgMS4yLCAwLjMsIDUuNiwgNS41LCA2LjUsIDcuNjsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGxhbmN6b3MxX2Z1bmN0b3IgZnVuY3RvcjsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PGxhbmN6b3MxX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOwpAQCAtMTA0Niw3ICsxMDIwLDcgQEAKICAgLyoKICAgICogU2Vjb25kIHRyeQogICAgKi8KLSAgeDw8IDAuNSwgMC43LCAzLjYsIDQuMiwgNC4sIDYuMzsKKyAgeCA8PCAwLjUsIDAuNywgMy42LCA0LjIsIDQuLCA2LjM7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbmZvKQpAQCAtMTA2Myw0NSArMTAzNyw0MiBAQAogICBWRVJJRllfSVNfQVBQUk9YKHhbM10sIDMuMDAwMDAwMDAwMkUrMDApOwogICBWRVJJRllfSVNfQVBQUk9YKHhbNF0sIDEuNTU3NTk5OTk5OEUrMDApOwogICBWRVJJRllfSVNfQVBQUk9YKHhbNV0sIDUuMDAwMDAwMDAwMUUrMDApOwotCiB9CiAKLXN0cnVjdCByYXQ0Ml9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Ci17Ci0gICAgcmF0NDJfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPigzLDkpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzldOwotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVs5XTsKLSAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOwotICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTkpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTw5OyBpKyspIHsKLSAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdIC8gKDEuK2V4cChiWzFdLWJbMl0qeFtpXSkpIC0geVtpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKK3N0cnVjdCByYXQ0Ml9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+IHsKKyAgcmF0NDJfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPigzLCA5KSB7fQorICBzdGF0aWMgY29uc3QgZG91YmxlIHhbOV07CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeVs5XTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDMpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSA5KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDk7IGkrKykgeworICAgICAgZnZlY1tpXSA9IGJbMF0gLyAoMS4gKyBleHAoYlsxXSAtIGJbMl0gKiB4W2ldKSkgLSB5W2ldOwogICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogCi0gICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7Ci0gICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09OSk7Ci0gICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Myk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDk7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIGUgPSBleHAoYlsxXS1iWzJdKnhbaV0pOwotICAgICAgICAgICAgZmphYyhpLDApID0gMS4vKDEuK2UpOwotICAgICAgICAgICAgZmphYyhpLDEpID0gLWJbMF0qZS8oMS4rZSkvKDEuK2UpOwotICAgICAgICAgICAgZmphYyhpLDIpID0gK2JbMF0qZSp4W2ldLygxLitlKS8oMS4rZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gMyk7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDkpOworICAgIGFzc2VydChmamFjLmNvbHMoKSA9PSAzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDk7IGkrKykgeworICAgICAgZG91YmxlIGUgPSBleHAoYlsxXSAtIGJbMl0gKiB4W2ldKTsKKyAgICAgIGZqYWMoaSwgMCkgPSAxLiAvICgxLiArIGUpOworICAgICAgZmphYyhpLCAxKSA9IC1iWzBdICogZSAvICgxLiArIGUpIC8gKDEuICsgZSk7CisgICAgICBmamFjKGksIDIpID0gK2JbMF0gKiBlICogeFtpXSAvICgxLiArIGUpIC8gKDEuICsgZSk7CiAgICAgfQorICAgIHJldHVybiAwOworICB9CiB9OwotY29uc3QgZG91YmxlIHJhdDQyX2Z1bmN0b3I6OnhbOV0gPSB7IDkuMDAwRTAsIDE0LjAwMEUwLCAyMS4wMDBFMCwgMjguMDAwRTAsIDQyLjAwMEUwLCA1Ny4wMDBFMCwgNjMuMDAwRTAsIDcwLjAwMEUwLCA3OS4wMDBFMCB9OwotY29uc3QgZG91YmxlIHJhdDQyX2Z1bmN0b3I6OnlbOV0gPSB7IDguOTMwRTAgLDEwLjgwMEUwICwxOC41OTBFMCAsMjIuMzMwRTAgLDM5LjM1MEUwICw1Ni4xMTBFMCAsNjEuNzMwRTAgLDY0LjYyMEUwICw2Ny4wODBFMCB9OworY29uc3QgZG91YmxlIHJhdDQyX2Z1bmN0b3I6OnhbOV0gPSB7OS4wMDBFMCwgIDE0LjAwMEUwLCAyMS4wMDBFMCwgMjguMDAwRTAsIDQyLjAwMEUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTcuMDAwRTAsIDYzLjAwMEUwLCA3MC4wMDBFMCwgNzkuMDAwRTB9OworY29uc3QgZG91YmxlIHJhdDQyX2Z1bmN0b3I6OnlbOV0gPSB7OC45MzBFMCwgIDEwLjgwMEUwLCAxOC41OTBFMCwgMjIuMzMwRTAsIDM5LjM1MEUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYuMTEwRTAsIDYxLjczMEUwLCA2NC42MjBFMCwgNjcuMDgwRTB9OwogCiAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9yYXRrb3dza3kyLnNodG1sCi12b2lkIHRlc3ROaXN0UmF0NDIodm9pZCkKLXsKLSAgY29uc3QgaW50IG49MzsKK3ZvaWQgdGVzdE5pc3RSYXQ0Mih2b2lkKSB7CisgIGNvbnN0IGludCBuID0gMzsKICAgaW50IGluZm87CiAKICAgVmVjdG9yWGQgeChuKTsKQEAgLTExMDksNyArMTA4MCw3IEBACiAgIC8qCiAgICAqIEZpcnN0IHRyeQogICAgKi8KLSAgeDw8IDEwMC4sIDEuLCAwLjE7CisgIHggPDwgMTAwLiwgMS4sIDAuMTsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIHJhdDQyX2Z1bmN0b3IgZnVuY3RvcjsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PHJhdDQyX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOwpAQCAtMTEyOSw3ICsxMTAwLDcgQEAKICAgLyoKICAgICogU2Vjb25kIHRyeQogICAgKi8KLSAgeDw8IDc1LiwgMi41LCAwLjA3OworICB4IDw8IDc1LiwgMi41LCAwLjA3OwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgaW5mbyA9IGxtLm1pbmltaXplKHgpOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaW5mbykKQEAgLTExNDUsNDEgKzExMTYsNDAgQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCA2LjczNTkyMDAwNjZFLTAyKTsKIH0KIAotc3RydWN0IE1HSDEwX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KLXsKLSAgICBNR0gxMF9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDMsMTYpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE2XTsKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTZdOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7Ci0gICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTYpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwxNjsgaSsrKQotICAgICAgICAgICAgZnZlY1tpXSA9ICBiWzBdICogZXhwKGJbMV0vKHhbaV0rYlsyXSkpIC0geVtpXTsKLSAgICAgICAgcmV0dXJuIDA7CitzdHJ1Y3QgTUdIMTBfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPiB7CisgIE1HSDEwX2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywgMTYpIHt9CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeFsxNl07CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNl07CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykgeworICAgIGFzc2VydChiLnNpemUoKSA9PSAzKTsKKyAgICBhc3NlcnQoZnZlYy5zaXplKCkgPT0gMTYpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgZnZlY1tpXSA9IGJbMF0gKiBleHAoYlsxXSAvICh4W2ldICsgYlsyXSkpIC0geVtpXTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDMpOworICAgIGFzc2VydChmamFjLnJvd3MoKSA9PSAxNik7CisgICAgYXNzZXJ0KGZqYWMuY29scygpID09IDMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgZG91YmxlIGZhY3RvciA9IDEuIC8gKHhbaV0gKyBiWzJdKTsKKyAgICAgIGRvdWJsZSBlID0gZXhwKGJbMV0gKiBmYWN0b3IpOworICAgICAgZmphYyhpLCAwKSA9IGU7CisgICAgICBmamFjKGksIDEpID0gYlswXSAqIGZhY3RvciAqIGU7CisgICAgICBmamFjKGksIDIpID0gLWJbMV0gKiBiWzBdICogZmFjdG9yICogZmFjdG9yICogZTsKICAgICB9Ci0gICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7Ci0gICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTYpOwotICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTMpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwxNjsgaSsrKSB7Ci0gICAgICAgICAgICBkb3VibGUgZmFjdG9yID0gMS4vKHhbaV0rYlsyXSk7Ci0gICAgICAgICAgICBkb3VibGUgZSA9IGV4cChiWzFdKmZhY3Rvcik7Ci0gICAgICAgICAgICBmamFjKGksMCkgPSBlOwotICAgICAgICAgICAgZmphYyhpLDEpID0gYlswXSpmYWN0b3IqZTsKLSAgICAgICAgICAgIGZqYWMoaSwyKSA9IC1iWzFdKmJbMF0qZmFjdG9yKmZhY3RvciplOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKLWNvbnN0IGRvdWJsZSBNR0gxMF9mdW5jdG9yOjp4WzE2XSA9IHsgNS4wMDAwMDBFKzAxLCA1LjUwMDAwMEUrMDEsIDYuMDAwMDAwRSswMSwgNi41MDAwMDBFKzAxLCA3LjAwMDAwMEUrMDEsIDcuNTAwMDAwRSswMSwgOC4wMDAwMDBFKzAxLCA4LjUwMDAwMEUrMDEsIDkuMDAwMDAwRSswMSwgOS41MDAwMDBFKzAxLCAxLjAwMDAwMEUrMDIsIDEuMDUwMDAwRSswMiwgMS4xMDAwMDBFKzAyLCAxLjE1MDAwMEUrMDIsIDEuMjAwMDAwRSswMiwgMS4yNTAwMDBFKzAyIH07Ci1jb25zdCBkb3VibGUgTUdIMTBfZnVuY3Rvcjo6eVsxNl0gPSB7IDMuNDc4MDAwRSswNCwgMi44NjEwMDBFKzA0LCAyLjM2NTAwMEUrMDQsIDEuOTYzMDAwRSswNCwgMS42MzcwMDBFKzA0LCAxLjM3MjAwMEUrMDQsIDEuMTU0MDAwRSswNCwgOS43NDQwMDBFKzAzLCA4LjI2MTAwMEUrMDMsIDcuMDMwMDAwRSswMywgNi4wMDUwMDBFKzAzLCA1LjE0NzAwMEUrMDMsIDQuNDI3MDAwRSswMywgMy44MjAwMDBFKzAzLCAzLjMwNzAwMEUrMDMsIDIuODcyMDAwRSswMyB9OworY29uc3QgZG91YmxlIE1HSDEwX2Z1bmN0b3I6OnhbMTZdID0gezUuMDAwMDAwRSswMSwgNS41MDAwMDBFKzAxLCA2LjAwMDAwMEUrMDEsIDYuNTAwMDAwRSswMSwgNy4wMDAwMDBFKzAxLCA3LjUwMDAwMEUrMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC4wMDAwMDBFKzAxLCA4LjUwMDAwMEUrMDEsIDkuMDAwMDAwRSswMSwgOS41MDAwMDBFKzAxLCAxLjAwMDAwMEUrMDIsIDEuMDUwMDAwRSswMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEwMDAwMEUrMDIsIDEuMTUwMDAwRSswMiwgMS4yMDAwMDBFKzAyLCAxLjI1MDAwMEUrMDJ9OworY29uc3QgZG91YmxlIE1HSDEwX2Z1bmN0b3I6OnlbMTZdID0gezMuNDc4MDAwRSswNCwgMi44NjEwMDBFKzA0LCAyLjM2NTAwMEUrMDQsIDEuOTYzMDAwRSswNCwgMS42MzcwMDBFKzA0LCAxLjM3MjAwMEUrMDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xNTQwMDBFKzA0LCA5Ljc0NDAwMEUrMDMsIDguMjYxMDAwRSswMywgNy4wMzAwMDBFKzAzLCA2LjAwNTAwMEUrMDMsIDUuMTQ3MDAwRSswMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjQyNzAwMEUrMDMsIDMuODIwMDAwRSswMywgMy4zMDcwMDBFKzAzLCAyLjg3MjAwMEUrMDN9OwogCiAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9tZ2gxMC5zaHRtbAotdm9pZCB0ZXN0TmlzdE1HSDEwKHZvaWQpCi17Ci0gIGNvbnN0IGludCBuPTM7Cit2b2lkIHRlc3ROaXN0TUdIMTAodm9pZCkgeworICBjb25zdCBpbnQgbiA9IDM7CiAgIGludCBpbmZvOwogCiAgIFZlY3RvclhkIHgobik7CkBAIC0xMTg3LDcgKzExNTcsNyBAQAogICAvKgogICAgKiBGaXJzdCB0cnkKICAgICovCi0gIHg8PCAyLiwgNDAwMDAwLiwgMjUwMDAuOworICB4IDw8IDIuLCA0MDAwMDAuLCAyNTAwMC47CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBNR0gxMF9mdW5jdG9yIGZ1bmN0b3I7CiAgIExldmVuYmVyZ01hcnF1YXJkdDxNR0gxMF9mdW5jdG9yPiBsbShmdW5jdG9yKTsKQEAgLTExOTUsOCArMTE2NSw4IEBACiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbmZvKQogCiAgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQotICAvLyBWRVJJRllfSVNfRVFVQUwoaW5mbywgMik7IAotICBMTV9DSEVDS19OX0lURVJTKGxtLCAyODQsIDI0OSk7IAorICAvLyBWRVJJRllfSVNfRVFVQUwoaW5mbywgMik7CisgIExNX0NIRUNLX05fSVRFUlMobG0sIDI4NCwgMjQ5KTsKICAgLy8gY2hlY2sgbm9ybV4yCiAgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCA4Ljc5NDU4NTUxNzFFKzAxKTsKICAgLy8gY2hlY2sgeApAQCAtMTIwNyw3ICsxMTc3LDcgQEAKICAgLyoKICAgICogU2Vjb25kIHRyeQogICAgKi8KLSAgeDw8IDAuMDIsIDQwMDAuLCAyNTAuOworICB4IDw8IDAuMDIsIDQwMDAuLCAyNTAuOwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgaW5mbyA9IGxtLm1pbmltaXplKHgpOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaW5mbykKQEAgLTEyMjMsMzkgKzExOTMsMzMgQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAzLjQ1MjIzNjM0NjJFKzAyKTsKIH0KIAotCi1zdHJ1Y3QgQm94Qk9EX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KLXsKLSAgICBCb3hCT0RfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPigyLDYpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzZdOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVs2XSA9IHsgMTA5LiwgMTQ5LiwgMTQ5LiwgMTkxLiwgMjEzLiwgMjI0LiB9OwotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTIpOwotICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTYpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTw2OyBpKyspCi0gICAgICAgICAgICBmdmVjW2ldID0gIGJbMF0qKDEuLWV4cCgtYlsxXSp4W2ldKSkgLSB5W2ldOwotICAgICAgICByZXR1cm4gMDsKK3N0cnVjdCBCb3hCT0RfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPiB7CisgIEJveEJPRF9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDIsIDYpIHt9CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeFs2XTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzZdID0gezEwOS4sIDE0OS4sIDE0OS4sIDE5MS4sIDIxMy4sIDIyNC59OworICAgIGFzc2VydChiLnNpemUoKSA9PSAyKTsKKyAgICBhc3NlcnQoZnZlYy5zaXplKCkgPT0gNik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIGZ2ZWNbaV0gPSBiWzBdICogKDEuIC0gZXhwKC1iWzFdICogeFtpXSkpIC0geVtpXTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDIpOworICAgIGFzc2VydChmamFjLnJvd3MoKSA9PSA2KTsKKyAgICBhc3NlcnQoZmphYy5jb2xzKCkgPT0gMik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgIGRvdWJsZSBlID0gZXhwKC1iWzFdICogeFtpXSk7CisgICAgICBmamFjKGksIDApID0gMS4gLSBlOworICAgICAgZmphYyhpLCAxKSA9IGJbMF0gKiB4W2ldICogZTsKICAgICB9Ci0gICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Mik7Ci0gICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09Nik7Ci0gICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Mik7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDY7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIGUgPSBleHAoLWJbMV0qeFtpXSk7Ci0gICAgICAgICAgICBmamFjKGksMCkgPSAxLi1lOwotICAgICAgICAgICAgZmphYyhpLDEpID0gYlswXSp4W2ldKmU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiAwOworICB9CiB9OwotY29uc3QgZG91YmxlIEJveEJPRF9mdW5jdG9yOjp4WzZdID0geyAxLiwgMi4sIDMuLCA1LiwgNy4sIDEwLiB9OworY29uc3QgZG91YmxlIEJveEJPRF9mdW5jdG9yOjp4WzZdID0gezEuLCAyLiwgMy4sIDUuLCA3LiwgMTAufTsKIAogLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvYm94Ym9kLnNodG1sCi12b2lkIHRlc3ROaXN0Qm94Qk9EKHZvaWQpCi17Ci0gIGNvbnN0IGludCBuPTI7Cit2b2lkIHRlc3ROaXN0Qm94Qk9EKHZvaWQpIHsKKyAgY29uc3QgaW50IG4gPSAyOwogICBpbnQgaW5mbzsKIAogICBWZWN0b3JYZCB4KG4pOwpAQCAtMTI2MywxMiArMTIyNywxMiBAQAogICAvKgogICAgKiBGaXJzdCB0cnkKICAgICovCi0gIHg8PCAxLiwgMS47CisgIHggPDwgMS4sIDEuOwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgQm94Qk9EX2Z1bmN0b3IgZnVuY3RvcjsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PEJveEJPRF9mdW5jdG9yPiBsbShmdW5jdG9yKTsKLSAgbG0ucGFyYW1ldGVycy5mdG9sID0gMS5FNipOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOwotICBsbS5wYXJhbWV0ZXJzLnh0b2wgPSAxLkU2Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGxtLnBhcmFtZXRlcnMuZnRvbCA9IDEuRTYgKiBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBsbS5wYXJhbWV0ZXJzLnh0b2wgPSAxLkU2ICogTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKICAgbG0ucGFyYW1ldGVycy5mYWN0b3IgPSAxMC47CiAgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGluZm8pCkBAIC0xMjg1LDcgKzEyNDksNyBAQAogICAvKgogICAgKiBTZWNvbmQgdHJ5CiAgICAqLwotICB4PDwgMTAwLiwgMC43NTsKKyAgeCA8PCAxMDAuLCAwLjc1OwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7CiAgIGxtLnBhcmFtZXRlcnMuZnRvbCA9IE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CkBAIC0xMzAzLDQxICsxMjY3LDQ2IEBACiAgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNS40NzIzNzQ4NTQyRS0wMSk7CiB9CiAKLXN0cnVjdCBNR0gxN19mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Ci17Ci0gICAgTUdIMTdfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPig1LDMzKSB7fQotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeFszM107Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzMzXTsKLSAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTUpOwotICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTMzKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8MzM7IGkrKykKLSAgICAgICAgICAgIGZ2ZWNbaV0gPSAgYlswXSArIGJbMV0qZXhwKC1iWzNdKnhbaV0pICsgIGJbMl0qZXhwKC1iWzRdKnhbaV0pIC0geVtpXTsKLSAgICAgICAgcmV0dXJuIDA7CitzdHJ1Y3QgTUdIMTdfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPiB7CisgIE1HSDE3X2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oNSwgMzMpIHt9CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeFszM107CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeVszM107CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykgeworICAgIGFzc2VydChiLnNpemUoKSA9PSA1KTsKKyAgICBhc3NlcnQoZnZlYy5zaXplKCkgPT0gMzMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzM7IGkrKykgZnZlY1tpXSA9IGJbMF0gKyBiWzFdICogZXhwKC1iWzNdICogeFtpXSkgKyBiWzJdICogZXhwKC1iWzRdICogeFtpXSkgLSB5W2ldOworICAgIHJldHVybiAwOworICB9CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gNSk7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDMzKTsKKyAgICBhc3NlcnQoZmphYy5jb2xzKCkgPT0gNSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMzsgaSsrKSB7CisgICAgICBmamFjKGksIDApID0gMS47CisgICAgICBmamFjKGksIDEpID0gZXhwKC1iWzNdICogeFtpXSk7CisgICAgICBmamFjKGksIDIpID0gZXhwKC1iWzRdICogeFtpXSk7CisgICAgICBmamFjKGksIDMpID0gLXhbaV0gKiBiWzFdICogZXhwKC1iWzNdICogeFtpXSk7CisgICAgICBmamFjKGksIDQpID0gLXhbaV0gKiBiWzJdICogZXhwKC1iWzRdICogeFtpXSk7CiAgICAgfQotICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTUpOwotICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTMzKTsKLSAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT01KTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8MzM7IGkrKykgewotICAgICAgICAgICAgZmphYyhpLDApID0gMS47Ci0gICAgICAgICAgICBmamFjKGksMSkgPSBleHAoLWJbM10qeFtpXSk7Ci0gICAgICAgICAgICBmamFjKGksMikgPSBleHAoLWJbNF0qeFtpXSk7Ci0gICAgICAgICAgICBmamFjKGksMykgPSAteFtpXSpiWzFdKmV4cCgtYlszXSp4W2ldKTsKLSAgICAgICAgICAgIGZqYWMoaSw0KSA9IC14W2ldKmJbMl0qZXhwKC1iWzRdKnhbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKLWNvbnN0IGRvdWJsZSBNR0gxN19mdW5jdG9yOjp4WzMzXSA9IHsgMC4wMDAwMDBFKzAwLCAxLjAwMDAwMEUrMDEsIDIuMDAwMDAwRSswMSwgMy4wMDAwMDBFKzAxLCA0LjAwMDAwMEUrMDEsIDUuMDAwMDAwRSswMSwgNi4wMDAwMDBFKzAxLCA3LjAwMDAwMEUrMDEsIDguMDAwMDAwRSswMSwgOS4wMDAwMDBFKzAxLCAxLjAwMDAwMEUrMDIsIDEuMTAwMDAwRSswMiwgMS4yMDAwMDBFKzAyLCAxLjMwMDAwMEUrMDIsIDEuNDAwMDAwRSswMiwgMS41MDAwMDBFKzAyLCAxLjYwMDAwMEUrMDIsIDEuNzAwMDAwRSswMiwgMS44MDAwMDBFKzAyLCAxLjkwMDAwMEUrMDIsIDIuMDAwMDAwRSswMiwgMi4xMDAwMDBFKzAyLCAyLjIwMDAwMEUrMDIsIDIuMzAwMDAwRSswMiwgMi40MDAwMDBFKzAyLCAyLjUwMDAwMEUrMDIsIDIuNjAwMDAwRSswMiwgMi43MDAwMDBFKzAyLCAyLjgwMDAwMEUrMDIsIDIuOTAwMDAwRSswMiwgMy4wMDAwMDBFKzAyLCAzLjEwMDAwMEUrMDIsIDMuMjAwMDAwRSswMiB9OwotY29uc3QgZG91YmxlIE1HSDE3X2Z1bmN0b3I6OnlbMzNdID0geyA4LjQ0MDAwMEUtMDEsIDkuMDgwMDAwRS0wMSwgOS4zMjAwMDBFLTAxLCA5LjM2MDAwMEUtMDEsIDkuMjUwMDAwRS0wMSwgOS4wODAwMDBFLTAxLCA4LjgxMDAwMEUtMDEsIDguNTAwMDAwRS0wMSwgOC4xODAwMDBFLTAxLCA3Ljg0MDAwMEUtMDEsIDcuNTEwMDAwRS0wMSwgNy4xODAwMDBFLTAxLCA2Ljg1MDAwMEUtMDEsIDYuNTgwMDAwRS0wMSwgNi4yODAwMDBFLTAxLCA2LjAzMDAwMEUtMDEsIDUuODAwMDAwRS0wMSwgNS41ODAwMDBFLTAxLCA1LjM4MDAwMEUtMDEsIDUuMjIwMDAwRS0wMSwgNS4wNjAwMDBFLTAxLCA0LjkwMDAwMEUtMDEsIDQuNzgwMDAwRS0wMSwgNC42NzAwMDBFLTAxLCA0LjU3MDAwMEUtMDEsIDQuNDgwMDAwRS0wMSwgNC4zODAwMDBFLTAxLCA0LjMxMDAwMEUtMDEsIDQuMjQwMDAwRS0wMSwgNC4yMDAwMDBFLTAxLCA0LjE0MDAwMEUtMDEsIDQuMTEwMDAwRS0wMSwgNC4wNjAwMDBFLTAxIH07Citjb25zdCBkb3VibGUgTUdIMTdfZnVuY3Rvcjo6eFszM10gPSB7MC4wMDAwMDBFKzAwLCAxLjAwMDAwMEUrMDEsIDIuMDAwMDAwRSswMSwgMy4wMDAwMDBFKzAxLCA0LjAwMDAwMEUrMDEsIDUuMDAwMDAwRSswMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LjAwMDAwMEUrMDEsIDcuMDAwMDAwRSswMSwgOC4wMDAwMDBFKzAxLCA5LjAwMDAwMEUrMDEsIDEuMDAwMDAwRSswMiwgMS4xMDAwMDBFKzAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjAwMDAwRSswMiwgMS4zMDAwMDBFKzAyLCAxLjQwMDAwMEUrMDIsIDEuNTAwMDAwRSswMiwgMS42MDAwMDBFKzAyLCAxLjcwMDAwMEUrMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MDAwMDBFKzAyLCAxLjkwMDAwMEUrMDIsIDIuMDAwMDAwRSswMiwgMi4xMDAwMDBFKzAyLCAyLjIwMDAwMEUrMDIsIDIuMzAwMDAwRSswMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQwMDAwMEUrMDIsIDIuNTAwMDAwRSswMiwgMi42MDAwMDBFKzAyLCAyLjcwMDAwMEUrMDIsIDIuODAwMDAwRSswMiwgMi45MDAwMDBFKzAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMDAwMDAwRSswMiwgMy4xMDAwMDBFKzAyLCAzLjIwMDAwMEUrMDJ9OworY29uc3QgZG91YmxlIE1HSDE3X2Z1bmN0b3I6OnlbMzNdID0gezguNDQwMDAwRS0wMSwgOS4wODAwMDBFLTAxLCA5LjMyMDAwMEUtMDEsIDkuMzYwMDAwRS0wMSwgOS4yNTAwMDBFLTAxLCA5LjA4MDAwMEUtMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC44MTAwMDBFLTAxLCA4LjUwMDAwMEUtMDEsIDguMTgwMDAwRS0wMSwgNy44NDAwMDBFLTAxLCA3LjUxMDAwMEUtMDEsIDcuMTgwMDAwRS0wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Ljg1MDAwMEUtMDEsIDYuNTgwMDAwRS0wMSwgNi4yODAwMDBFLTAxLCA2LjAzMDAwMEUtMDEsIDUuODAwMDAwRS0wMSwgNS41ODAwMDBFLTAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMzgwMDAwRS0wMSwgNS4yMjAwMDBFLTAxLCA1LjA2MDAwMEUtMDEsIDQuOTAwMDAwRS0wMSwgNC43ODAwMDBFLTAxLCA0LjY3MDAwMEUtMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC41NzAwMDBFLTAxLCA0LjQ4MDAwMEUtMDEsIDQuMzgwMDAwRS0wMSwgNC4zMTAwMDBFLTAxLCA0LjI0MDAwMEUtMDEsIDQuMjAwMDAwRS0wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjE0MDAwMEUtMDEsIDQuMTEwMDAwRS0wMSwgNC4wNjAwMDBFLTAxfTsKIAogLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvbWdoMTcuc2h0bWwKLXZvaWQgdGVzdE5pc3RNR0gxNyh2b2lkKQotewotICBjb25zdCBpbnQgbj01Owordm9pZCB0ZXN0TmlzdE1HSDE3KHZvaWQpIHsKKyAgY29uc3QgaW50IG4gPSA1OwogICBpbnQgaW5mbzsKIAogICBWZWN0b3JYZCB4KG4pOwpAQCAtMTM0NSw3ICsxMzE0LDcgQEAKICAgLyoKICAgICogRmlyc3QgdHJ5CiAgICAqLwotICB4PDwgNTAuLCAxNTAuLCAtMTAwLiwgMS4sIDIuOworICB4IDw8IDUwLiwgMTUwLiwgLTEwMC4sIDEuLCAyLjsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIE1HSDE3X2Z1bmN0b3IgZnVuY3RvcjsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PE1HSDE3X2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOwpAQCAtMTM2MywxNSArMTMzMiwxNSBAQAogICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIC0xLjQ2NDY4NzEzNjZFKzAwKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAxLjI4Njc1MzQ2NDBFLTAyKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLCAyLjIxMjI2OTk2NjJFLTAyKTsKLSAgCisKICAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCi0gIC8vIFZFUklGWV9JU19FUVVBTChpbmZvLCAyKTsgCisgIC8vIFZFUklGWV9JU19FUVVBTChpbmZvLCAyKTsKICAgTE1fQ0hFQ0tfTl9JVEVSUyhsbSwgNjAyLCA1NDUpOwogCiAgIC8qCiAgICAqIFNlY29uZCB0cnkKICAgICovCi0gIHg8PCAwLjUgICwxLjUgICwtMSAgICwwLjAxICwwLjAyOworICB4IDw8IDAuNSwgMS41LCAtMSwgMC4wMSwgMC4wMjsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGxtLnJlc2V0UGFyYW1ldGVycygpOwogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CkBAIC0xMzkwLDQ0ICsxMzU5LDQyIEBACiAgIFZFUklGWV9JU19BUFBST1goeFs0XSwgMi4yMTIyNjk5NjYyRS0wMik7CiB9CiAKLXN0cnVjdCBNR0gwOV9mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+Ci17Ci0gICAgTUdIMDlfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPig0LDExKSB7fQotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgX3hbMTFdOwotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxMV07Ci0gICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT00KTsKLSAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xMSk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDExOyBpKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSB4ID0gX3hbaV0sIHh4PXgqeDsKLSAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdKih4eCt4KmJbMV0pLyh4eCt4KmJbMl0rYlszXSkgLSB5W2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworc3RydWN0IE1HSDA5X2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4geworICBNR0gwOV9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDQsIDExKSB7fQorICBzdGF0aWMgY29uc3QgZG91YmxlIF94WzExXTsKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzExXTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDQpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSAxMSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgaSsrKSB7CisgICAgICBkb3VibGUgeCA9IF94W2ldLCB4eCA9IHggKiB4OworICAgICAgZnZlY1tpXSA9IGJbMF0gKiAoeHggKyB4ICogYlsxXSkgLyAoeHggKyB4ICogYlsyXSArIGJbM10pIC0geVtpXTsKICAgICB9Ci0gICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09NCk7Ci0gICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTEpOwotICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTQpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwxMTsgaSsrKSB7Ci0gICAgICAgICAgICBkb3VibGUgeCA9IF94W2ldLCB4eD14Kng7Ci0gICAgICAgICAgICBkb3VibGUgZmFjdG9yID0gMS4vKHh4K3gqYlsyXStiWzNdKTsKLSAgICAgICAgICAgIGZqYWMoaSwwKSA9ICh4eCt4KmJbMV0pICogZmFjdG9yOwotICAgICAgICAgICAgZmphYyhpLDEpID0gYlswXSp4KiBmYWN0b3I7Ci0gICAgICAgICAgICBmamFjKGksMikgPSAtIGJbMF0qKHh4K3gqYlsxXSkgKiB4ICogZmFjdG9yICogZmFjdG9yOwotICAgICAgICAgICAgZmphYyhpLDMpID0gLSBiWzBdKih4eCt4KmJbMV0pICogZmFjdG9yICogZmFjdG9yOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAwOworICB9CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gNCk7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDExKTsKKyAgICBhc3NlcnQoZmphYy5jb2xzKCkgPT0gNCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgaSsrKSB7CisgICAgICBkb3VibGUgeCA9IF94W2ldLCB4eCA9IHggKiB4OworICAgICAgZG91YmxlIGZhY3RvciA9IDEuIC8gKHh4ICsgeCAqIGJbMl0gKyBiWzNdKTsKKyAgICAgIGZqYWMoaSwgMCkgPSAoeHggKyB4ICogYlsxXSkgKiBmYWN0b3I7CisgICAgICBmamFjKGksIDEpID0gYlswXSAqIHggKiBmYWN0b3I7CisgICAgICBmamFjKGksIDIpID0gLWJbMF0gKiAoeHggKyB4ICogYlsxXSkgKiB4ICogZmFjdG9yICogZmFjdG9yOworICAgICAgZmphYyhpLCAzKSA9IC1iWzBdICogKHh4ICsgeCAqIGJbMV0pICogZmFjdG9yICogZmFjdG9yOwogICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKLWNvbnN0IGRvdWJsZSBNR0gwOV9mdW5jdG9yOjpfeFsxMV0gPSB7IDQuLCAyLiwgMS4sIDUuRS0xICwgMi41RS0wMSwgMS42NzAwMDBFLTAxLCAxLjI1MDAwMEUtMDEsICAxLkUtMDEsIDguMzMwMDAwRS0wMiwgNy4xNDAwMDBFLTAyLCA2LjI1MDAwMEUtMDIgfTsKLWNvbnN0IGRvdWJsZSBNR0gwOV9mdW5jdG9yOjp5WzExXSA9IHsgMS45NTcwMDBFLTAxLCAxLjk0NzAwMEUtMDEsIDEuNzM1MDAwRS0wMSwgMS42MDAwMDBFLTAxLCA4LjQ0MDAwMEUtMDIsIDYuMjcwMDAwRS0wMiwgNC41NjAwMDBFLTAyLCAzLjQyMDAwMEUtMDIsIDMuMjMwMDAwRS0wMiwgMi4zNTAwMDBFLTAyLCAyLjQ2MDAwMEUtMDIgfTsKK2NvbnN0IGRvdWJsZSBNR0gwOV9mdW5jdG9yOjpfeFsxMV0gPSB7NC4sICAgICAgICAgICAyLiwgICAgIDEuLCAgICAgICAgICAgNS5FLTEsICAgICAgICAyLjVFLTAxLCAgICAgMS42NzAwMDBFLTAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1MDAwMEUtMDEsIDEuRS0wMSwgOC4zMzAwMDBFLTAyLCA3LjE0MDAwMEUtMDIsIDYuMjUwMDAwRS0wMn07Citjb25zdCBkb3VibGUgTUdIMDlfZnVuY3Rvcjo6eVsxMV0gPSB7MS45NTcwMDBFLTAxLCAxLjk0NzAwMEUtMDEsIDEuNzM1MDAwRS0wMSwgMS42MDAwMDBFLTAxLCA4LjQ0MDAwMEUtMDIsIDYuMjcwMDAwRS0wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjU2MDAwMEUtMDIsIDMuNDIwMDAwRS0wMiwgMy4yMzAwMDBFLTAyLCAyLjM1MDAwMEUtMDIsIDIuNDYwMDAwRS0wMn07CiAKIC8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL21naDA5LnNodG1sCi12b2lkIHRlc3ROaXN0TUdIMDkodm9pZCkKLXsKLSAgY29uc3QgaW50IG49NDsKK3ZvaWQgdGVzdE5pc3RNR0gwOSh2b2lkKSB7CisgIGNvbnN0IGludCBuID0gNDsKICAgaW50IGluZm87CiAKICAgVmVjdG9yWGQgeChuKTsKQEAgLTE0MzUsNyArMTQwMiw3IEBACiAgIC8qCiAgICAqIEZpcnN0IHRyeQogICAgKi8KLSAgeDw8IDI1LiwgMzksIDQxLjUsIDM5LjsKKyAgeCA8PCAyNS4sIDM5LCA0MS41LCAzOS47CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBNR0gwOV9mdW5jdG9yIGZ1bmN0b3I7CiAgIExldmVuYmVyZ01hcnF1YXJkdDxNR0gwOV9mdW5jdG9yPiBsbShmdW5jdG9yKTsKQEAgLTE0NDksMTUgKzE0MTYsMTUgQEAKICAgLy8gY2hlY2sgbm9ybV4yCiAgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYy5zcXVhcmVkTm9ybSgpLCAzLjA3NTA1NjAzODVFLTA0KTsKICAgLy8gY2hlY2sgeAotICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDAuMTkyODA3NzA4OSk7IC8vIHNob3VsZCBiZSAxLjkyODA2OTM0NThFLTAxCi0gIFZFUklGWV9JU19BUFBST1goeFsxXSwgMC4xOTEyNjQyMzU3Myk7IC8vIHNob3VsZCBiZSAxLjkxMjgyMzI4NzNFLTAxCi0gIFZFUklGWV9JU19BUFBST1goeFsyXSwgMC4xMjMwNTMwOTkxNCk7IC8vIHNob3VsZCBiZSAxLjIzMDU2NTA2OTNFLTAxCi0gIFZFUklGWV9JU19BUFBST1goeFszXSwgMC4xMzYwNTM5NTM3NSk7IC8vIHNob3VsZCBiZSAxLjM2MDYyMzMwNjhFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMC4xOTI4MDc3MDg5KTsgICAvLyBzaG91bGQgYmUgMS45MjgwNjkzNDU4RS0wMQorICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDAuMTkxMjY0MjM1NzMpOyAgLy8gc2hvdWxkIGJlIDEuOTEyODIzMjg3M0UtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAwLjEyMzA1MzA5OTE0KTsgIC8vIHNob3VsZCBiZSAxLjIzMDU2NTA2OTNFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMC4xMzYwNTM5NTM3NSk7ICAvLyBzaG91bGQgYmUgMS4zNjA2MjMzMDY4RS0wMQogCiAgIC8qCiAgICAqIFNlY29uZCB0cnkKICAgICovCi0gIHg8PCAwLjI1LCAwLjM5LCAwLjQxNSwgMC4zOTsKKyAgeCA8PCAwLjI1LCAwLjM5LCAwLjQxNSwgMC4zOTsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGxtLnJlc2V0UGFyYW1ldGVycygpOwogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CkBAIC0xNDY5LDUxICsxNDM2LDc5IEBACiAgIC8vIGNoZWNrIG5vcm1eMgogICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgMy4wNzUwNTYwMzg1RS0wNCk7CiAgIC8vIGNoZWNrIHgKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAwLjE5MjgwNzgxKTsgLy8gc2hvdWxkIGJlIDEuOTI4MDY5MzQ1OEUtMDEKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAwLjE5MTI2MjY1KTsgLy8gc2hvdWxkIGJlIDEuOTEyODIzMjg3M0UtMDEKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAwLjEyMzA1MjgwKTsgLy8gc2hvdWxkIGJlIDEuMjMwNTY1MDY5M0UtMDEKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAwLjEzNjA1MzIyKTsgLy8gc2hvdWxkIGJlIDEuMzYwNjIzMzA2OEUtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAwLjE5MjgwNzgxKTsgIC8vIHNob3VsZCBiZSAxLjkyODA2OTM0NThFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMC4xOTEyNjI2NSk7ICAvLyBzaG91bGQgYmUgMS45MTI4MjMyODczRS0wMQorICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDAuMTIzMDUyODApOyAgLy8gc2hvdWxkIGJlIDEuMjMwNTY1MDY5M0UtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAwLjEzNjA1MzIyKTsgIC8vIHNob3VsZCBiZSAxLjM2MDYyMzMwNjhFLTAxCiB9CiAKLQotCi1zdHJ1Y3QgQmVubmV0dDVfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgotewotICAgIEJlbm5ldHQ1X2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywxNTQpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE1NF07Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzE1NF07Ci0gICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKLSAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0xNTQpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwxNTQ7IGkrKykKLSAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdKiBwb3coYlsxXSt4W2ldLC0xLi9iWzJdKSAtIHlbaV07Ci0gICAgICAgIHJldHVybiAwOworc3RydWN0IEJlbm5ldHQ1X2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4geworICBCZW5uZXR0NV9mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDMsIDE1NCkge30KKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE1NF07CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNTRdOworICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gMyk7CisgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpID09IDE1NCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTQ7IGkrKykgZnZlY1tpXSA9IGJbMF0gKiBwb3coYlsxXSArIHhbaV0sIC0xLiAvIGJbMl0pIC0geVtpXTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDMpOworICAgIGFzc2VydChmamFjLnJvd3MoKSA9PSAxNTQpOworICAgIGFzc2VydChmamFjLmNvbHMoKSA9PSAzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE1NDsgaSsrKSB7CisgICAgICBkb3VibGUgZSA9IHBvdyhiWzFdICsgeFtpXSwgLTEuIC8gYlsyXSk7CisgICAgICBmamFjKGksIDApID0gZTsKKyAgICAgIGZqYWMoaSwgMSkgPSAtYlswXSAqIGUgLyBiWzJdIC8gKGJbMV0gKyB4W2ldKTsKKyAgICAgIGZqYWMoaSwgMikgPSBiWzBdICogZSAqIGxvZyhiWzFdICsgeFtpXSkgLyBiWzJdIC8gYlsyXTsKICAgICB9Ci0gICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7Ci0gICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTU0KTsKLSAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0zKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8MTU0OyBpKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSBlID0gcG93KGJbMV0reFtpXSwtMS4vYlsyXSk7Ci0gICAgICAgICAgICBmamFjKGksMCkgPSBlOwotICAgICAgICAgICAgZmphYyhpLDEpID0gLSBiWzBdKmUvYlsyXS8oYlsxXSt4W2ldKTsKLSAgICAgICAgICAgIGZqYWMoaSwyKSA9IGJbMF0qZSpsb2coYlsxXSt4W2ldKS9iWzJdL2JbMl07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiAwOworICB9CiB9OwotY29uc3QgZG91YmxlIEJlbm5ldHQ1X2Z1bmN0b3I6OnhbMTU0XSA9IHsgNy40NDcxNjhFMCwgOC4xMDI1ODZFMCwgOC40NTI1NDdFMCwgOC43MTEyNzhFMCwgOC45MTY3NzRFMCwgOS4wODcxNTVFMCwgOS4yMzI1OTBFMCwgOS4zNTk1MzVFMCwgOS40NzIxNjZFMCwgOS41NzMzODRFMCwgOS42NjUyOTNFMCwgOS43NDk0NjFFMCwgOS44MjcwOTJFMCwgOS44OTkxMjhFMCwgOS45NjYzMjFFMCwgMTAuMDI5MjgwRTAsIDEwLjA4ODUxMEUwLCAxMC4xNDQ0MzBFMCwgMTAuMTk3MzgwRTAsIDEwLjI0NzY3MEUwLCAxMC4yOTU1NjBFMCwgMTAuMzQxMjUwRTAsIDEwLjM4NDk1MEUwLCAxMC40MjY4MjBFMCwgMTAuNDY3MDAwRTAsIDEwLjUwNTY0MEUwLCAxMC41NDI4MzBFMCwgMTAuNTc4NjkwRTAsIDEwLjYxMzMxMEUwLCAxMC42NDY3ODBFMCwgMTAuNjc5MTUwRTAsIDEwLjcxMDUyMEUwLCAxMC43NDA5MjBFMCwgMTAuNzcwNDQwRTAsIDEwLjc5OTEwMEUwLCAxMC44MjY5NzBFMCwgMTAuODU0MDgwRTAsIDEwLjg4MDQ3MEUwLCAxMC45MDYxOTBFMCwgMTAuOTMxMjYwRTAsIDEwLjk1NTcyMEUwLCAxMC45Nzk1OTBFMCwgMTEuMDAyOTEwRTAsIDExLjAyNTcwMEUwLCAxMS4wNDc5ODBFMCwgMTEuMDY5NzcwRTAsIDExLjA5MTEwMEUwLCAxMS4xMTE5ODBFMCwgMTEuMTMyNDQwRTAsIDExLjE1MjQ4MEUwLCAxMS4xNzIxMzBFMCwgMTEuMTkxNDEwRTAsIDExLjIxMDMxMEUwLCAxMS4yMjg4NzBFMCwgMTEuMjQ3MDkwRTAsIDExLjI2NDk4MEUwLCAxMS4yODI1NjBFMCwgMTEuMjk5ODQwRTAsIDExLjMxNjgyMEUwLCAxMS4zMzM1MjBFMCwgMTEuMzQ5OTQwRTAsIDExLjM2NjEwMEUwLCAxMS4zODIwMDBFMCwgMTEuMzk3NjYwRTAsIDExLjQxMzA3MEUwLCAxMS40MjgyNDBFMCwgMTEuNDQzMjAwRTAsIDExLjQ1NzkzMEUwLCAxMS40NzI0NDBFMCwgMTEuNDg2NzUwRTAsIDExLjUwMDg2MEUwLCAxMS41MTQ3NzBFMCwgMTEuNTI4NDkwRTAsIDExLjU0MjAyMEUwLCAxMS41NTUzODBFMCwgMTEuNTY4NTUwRTAsCi0xMS41ODE1NjBFMCwgMTEuNTk0NDIwRTAsIDExLjYwNzEyMUUwLCAxMS42MTk2NDBFMCwgMTEuNjMyMDAwRTAsIDExLjY0NDIxMEUwLCAxMS42NTYyODBFMCwgMTEuNjY4MjAwRTAsIDExLjY3OTk4MEUwLCAxMS42OTE2MjBFMCwgMTEuNzAzMTMwRTAsIDExLjcxNDUxMEUwLCAxMS43MjU3NjBFMCwgMTEuNzM2ODgwRTAsIDExLjc0Nzg5MEUwLCAxMS43NTg3ODBFMCwgMTEuNzY5NTUwRTAsIDExLjc4MDIwMEUwLCAxMS43OTA3MzBFMCwgMTEuODAxMTYwRTAsIDExLjgxMTQ4MEUwLCAxMS44MjE3MDBFMCwgMTEuODMxODEwRTAsIDExLjg0MTgyMEUwLCAxMS44NTE3MzBFMCwgMTEuODYxNTUwRTAsIDExLjg3MTI3MEUwLCAxMS44ODA4OTBFMCwgMTEuODkwNDIwRTAsIDExLjg5OTg3MEUwLCAxMS45MDkyMjBFMCwgMTEuOTE4NDkwRTAsIDExLjkyNzY4MEUwLCAxMS45MzY3ODBFMCwgMTEuOTQ1NzkwRTAsIDExLjk1NDczMEUwLCAxMS45NjM1OTBFMCwgMTEuOTcyMzcwRTAsIDExLjk4MTA3MEUwLCAxMS45ODk3MDBFMCwgMTEuOTk4MjYwRTAsIDEyLjAwNjc0MEUwLCAxMi4wMTUxNTBFMCwgMTIuMDIzNDkwRTAsIDEyLjAzMTc2MEUwLCAxMi4wMzk5NzBFMCwgMTIuMDQ4MTAwRTAsIDEyLjA1NjE3MEUwLCAxMi4wNjQxODBFMCwgMTIuMDcyMTIwRTAsIDEyLjA4MDAxMEUwLCAxMi4wODc4MjBFMCwgMTIuMDk1NTgwRTAsIDEyLjEwMzI4MEUwLCAxMi4xMTA5MjBFMCwgMTIuMTE4NTAwRTAsIDEyLjEyNjAzMEUwLCAxMi4xMzM1MDBFMCwgMTIuMTQwOTEwRTAsIDEyLjE0ODI3MEUwLCAxMi4xNTU1NzBFMCwgMTIuMTYyODMwRTAsIDEyLjE3MDAzMEUwLCAxMi4xNzcxNzBFMCwgMTIuMTg0MjcwRTAsIDEyLjE5MTMyMEUwLCAxMi4xOTgzMjBFMCwgMTIuMjA1MjcwRTAsIDEyLjIxMjE3MEUwLCAxMi4yMTkwMzBFMCwgMTIuMjI1ODQwRTAsIDEyLjIzMjYwMEUwLCAxMi4yMzkzMjBFMCwgMTIuMjQ1OTkwRTAsIDEyLjI1MjYyMEUwLCAxMi4yNTkyMDBFMCwgMTIuMjY1NzUwRTAsIDEyLjI3MjI0MEUwIH07Ci1jb25zdCBkb3VibGUgQmVubmV0dDVfZnVuY3Rvcjo6eVsxNTRdID0geyAtMzQuODM0NzAyRTAgLC0zNC4zOTMyMDBFMCAsLTM0LjE1MjkwMUUwICwtMzMuOTc5MDk5RTAgLC0zMy44NDU5MDFFMCAsLTMzLjczMjg5OUUwICwtMzMuNjQwMzAxRTAgLC0zMy41NTkyMDBFMCAsLTMzLjQ4NjgwMUUwICwtMzMuNDIzMTAwRTAgLC0zMy4zNjUxMDFFMCAsLTMzLjMxMzAwMEUwICwtMzMuMjYwODk5RTAgLC0zMy4yMTc0MDBFMCAsLTMzLjE3Njg5OUUwICwtMzMuMTM5MTk4RTAgLC0zMy4xMDE2MDFFMCAsLTMzLjA2Njc5OUUwICwtMzMuMDM1MDAwRTAgLC0zMy4wMDMxMDFFMCAsLTMyLjk3MTI5OEUwICwtMzIuOTQyMjk5RTAgLC0zMi45MTYzMDJFMCAsLTMyLjg5MDIwMkUwICwtMzIuODY0MTAxRTAgLC0zMi44NDEwMDBFMCAsLTMyLjgxNzc5OUUwICwtMzIuNzk3NTAxRTAgLC0zMi43NzQzMDBFMCAsLTMyLjc1NzAwMEUwICwtMzIuNzMzNzk5RTAgLC0zMi43MTY0MDBFMCAsLTMyLjY5OTEwMEUwICwtMzIuNjc4Nzk5RTAgLC0zMi42NjE0MDBFMCAsLTMyLjY0NDAwMUUwICwtMzIuNjI2NzAxRTAgLC0zMi42MTIyMDJFMCAsLTMyLjU5NzY5OEUwICwtMzIuNTgzMTk5RTAgLC0zMi41Njg2OTlFMCAsLTMyLjU1NDI5OEUwICwtMzIuNTM5Nzk5RTAgLC0zMi41MjUyOTlFMCAsLTMyLjUxMDc5OUUwICwtMzIuNDk5MTk5RTAgLC0zMi40ODc1OThFMCAsLTMyLjQ3MzIwMkUwICwtMzIuNDYxNjAxRTAgLC0zMi40MzU1MDFFMCAsLTMyLjQzNTUwMUUwICwtMzIuNDI2ODAwRTAgLC0zMi40MTIzMDBFMCAsLTMyLjQwMDc5OUUwICwtMzIuMzkyMTAxRTAgLC0zMi4zODA1MDFFMCAsLTMyLjM2NjAwMUUwICwtMzIuMzU3MzAwRTAgLC0zMi4zNDg1OThFMCAsLTMyLjMzOTkwMUUwICwtMzIuMzI4NDAwRTAgLC0zMi4zMTk2OThFMCAsLTMyLjMxMTAwMUUwICwtMzIuMjk5NDAwRTAgLC0zMi4yOTA2OTlFMCAsLTMyLjI4MjAwMUUwICwtMzIuMjczMzAwRTAgLC0zMi4yNjQ1OTlFMCAsLTMyLjI1NjAwMUUwICwtMzIuMjQ3Mjk5RTAKLSwtMzIuMjM4NjAyRTAgLC0zMi4yMjk5MDBFMCAsLTMyLjIyNDA5OEUwICwtMzIuMjE1NDAxRTAgLC0zMi4yMDM4MDBFMCAsLTMyLjE5ODAwMkUwICwtMzIuMTg5NDAwRTAgLC0zMi4xODM2MDFFMCAsLTMyLjE3NDkwMEUwICwtMzIuMTY5MTAyRTAgLC0zMi4xNjMzMDBFMCAsLTMyLjE1NDU5OEUwICwtMzIuMTQ1OTAxRTAgLC0zMi4xNDAwOTlFMCAsLTMyLjEzMTQwMUUwICwtMzIuMTI1NTk5RTAgLC0zMi4xMTk4MDFFMCAsLTMyLjExMTE5OEUwICwtMzIuMTA1NDAwRTAgLC0zMi4wOTY2OTlFMCAsLTMyLjA5MDkwMEUwICwtMzIuMDg4MDAxRTAgLC0zMi4wNzkzMDBFMCAsLTMyLjA3MzUwMkUwICwtMzIuMDY3Njk5RTAgLC0zMi4wNjE5MDFFMCAsLTMyLjA1NjA5OUUwICwtMzIuMDUwMzAxRTAgLC0zMi4wNDQ0OThFMCAsLTMyLjAzODc5OUUwICwtMzIuMDMzMDAxRTAgLC0zMi4wMjcxOTlFMCAsLTMyLjAyNDMwMEUwICwtMzIuMDE4NTAxRTAgLC0zMi4wMTI2OTlFMCAsLTMyLjAwNDAwMkUwICwtMzIuMDAxMDk5RTAgLC0zMS45OTUzMDBFMCAsLTMxLjk4OTUwMEUwICwtMzEuOTgzNzAwRTAgLC0zMS45Nzc5MDBFMCAsLTMxLjk3MjA5OUUwICwtMzEuOTY5Mjk5RTAgLC0zMS45NjM1MDFFMCAsLTMxLjk1NzcwMUUwICwtMzEuOTUxOTAwRTAgLC0zMS45NDYxMDBFMCAsLTMxLjk0MDMwMEUwICwtMzEuOTM3NDAxRTAgLC0zMS45MzE2MDFFMCAsLTMxLjkyNTgwMEUwICwtMzEuOTIyODk5RTAgLC0zMS45MTcxMDFFMCAsLTMxLjkxMTMwMUUwICwtMzEuOTA4NDAwRTAgLC0zMS45MDI1OTlFMCAsLTMxLjg5NjkwMEUwICwtMzEuODkzOTk5RTAgLC0zMS44ODgyMDFFMCAsLTMxLjg4NTMwMEUwICwtMzEuODgyNDAxRTAgLC0zMS44NzY2MDBFMCAsLTMxLjg3MzY5OUUwICwtMzEuODY3OTAxRTAgLC0zMS44NjIxMDFFMCAsLTMxLjg1OTIwMEUwICwtMzEuODU2MzAwRTAgLC0zMS44NTA1MDBFMCAsLTMxLjg0NDcwMEUwICwtMzEuODQxODAxRTAgLC0zMS44Mzg5MDBFMCAsLTMxLjgzMzA5OUUwICwtMzEuODMwMjAwRTAgLAotLTMxLjgyNzI5OUUwICwtMzEuODIxNjAwRTAgLC0zMS44MTg3MDFFMCAsLTMxLjgxMjkwMUUwICwtMzEuODA5OTk5RTAgLC0zMS44MDcxMDBFMCAsLTMxLjgwMTMwMEUwICwtMzEuNzk4NDAxRTAgLC0zMS43OTU1MDBFMCAsLTMxLjc4OTcwMEUwICwtMzEuNzg2ODAwRTAgfTsKK2NvbnN0IGRvdWJsZSBCZW5uZXR0NV9mdW5jdG9yOjp4WzE1NF0gPSB7CisgICAgNy40NDcxNjhFMCwgIDguMTAyNTg2RTAsICA4LjQ1MjU0N0UwLCAgOC43MTEyNzhFMCwgIDguOTE2Nzc0RTAsICA5LjA4NzE1NUUwLCAgOS4yMzI1OTBFMCwgIDkuMzU5NTM1RTAsICA5LjQ3MjE2NkUwLAorICAgIDkuNTczMzg0RTAsICA5LjY2NTI5M0UwLCAgOS43NDk0NjFFMCwgIDkuODI3MDkyRTAsICA5Ljg5OTEyOEUwLCAgOS45NjYzMjFFMCwgIDEwLjAyOTI4MEUwLCAxMC4wODg1MTBFMCwgMTAuMTQ0NDMwRTAsCisgICAgMTAuMTk3MzgwRTAsIDEwLjI0NzY3MEUwLCAxMC4yOTU1NjBFMCwgMTAuMzQxMjUwRTAsIDEwLjM4NDk1MEUwLCAxMC40MjY4MjBFMCwgMTAuNDY3MDAwRTAsIDEwLjUwNTY0MEUwLCAxMC41NDI4MzBFMCwKKyAgICAxMC41Nzg2OTBFMCwgMTAuNjEzMzEwRTAsIDEwLjY0Njc4MEUwLCAxMC42NzkxNTBFMCwgMTAuNzEwNTIwRTAsIDEwLjc0MDkyMEUwLCAxMC43NzA0NDBFMCwgMTAuNzk5MTAwRTAsIDEwLjgyNjk3MEUwLAorICAgIDEwLjg1NDA4MEUwLCAxMC44ODA0NzBFMCwgMTAuOTA2MTkwRTAsIDEwLjkzMTI2MEUwLCAxMC45NTU3MjBFMCwgMTAuOTc5NTkwRTAsIDExLjAwMjkxMEUwLCAxMS4wMjU3MDBFMCwgMTEuMDQ3OTgwRTAsCisgICAgMTEuMDY5NzcwRTAsIDExLjA5MTEwMEUwLCAxMS4xMTE5ODBFMCwgMTEuMTMyNDQwRTAsIDExLjE1MjQ4MEUwLCAxMS4xNzIxMzBFMCwgMTEuMTkxNDEwRTAsIDExLjIxMDMxMEUwLCAxMS4yMjg4NzBFMCwKKyAgICAxMS4yNDcwOTBFMCwgMTEuMjY0OTgwRTAsIDExLjI4MjU2MEUwLCAxMS4yOTk4NDBFMCwgMTEuMzE2ODIwRTAsIDExLjMzMzUyMEUwLCAxMS4zNDk5NDBFMCwgMTEuMzY2MTAwRTAsIDExLjM4MjAwMEUwLAorICAgIDExLjM5NzY2MEUwLCAxMS40MTMwNzBFMCwgMTEuNDI4MjQwRTAsIDExLjQ0MzIwMEUwLCAxMS40NTc5MzBFMCwgMTEuNDcyNDQwRTAsIDExLjQ4Njc1MEUwLCAxMS41MDA4NjBFMCwgMTEuNTE0NzcwRTAsCisgICAgMTEuNTI4NDkwRTAsIDExLjU0MjAyMEUwLCAxMS41NTUzODBFMCwgMTEuNTY4NTUwRTAsIDExLjU4MTU2MEUwLCAxMS41OTQ0MjBFMCwgMTEuNjA3MTIxRTAsIDExLjYxOTY0MEUwLCAxMS42MzIwMDBFMCwKKyAgICAxMS42NDQyMTBFMCwgMTEuNjU2MjgwRTAsIDExLjY2ODIwMEUwLCAxMS42Nzk5ODBFMCwgMTEuNjkxNjIwRTAsIDExLjcwMzEzMEUwLCAxMS43MTQ1MTBFMCwgMTEuNzI1NzYwRTAsIDExLjczNjg4MEUwLAorICAgIDExLjc0Nzg5MEUwLCAxMS43NTg3ODBFMCwgMTEuNzY5NTUwRTAsIDExLjc4MDIwMEUwLCAxMS43OTA3MzBFMCwgMTEuODAxMTYwRTAsIDExLjgxMTQ4MEUwLCAxMS44MjE3MDBFMCwgMTEuODMxODEwRTAsCisgICAgMTEuODQxODIwRTAsIDExLjg1MTczMEUwLCAxMS44NjE1NTBFMCwgMTEuODcxMjcwRTAsIDExLjg4MDg5MEUwLCAxMS44OTA0MjBFMCwgMTEuODk5ODcwRTAsIDExLjkwOTIyMEUwLCAxMS45MTg0OTBFMCwKKyAgICAxMS45Mjc2ODBFMCwgMTEuOTM2NzgwRTAsIDExLjk0NTc5MEUwLCAxMS45NTQ3MzBFMCwgMTEuOTYzNTkwRTAsIDExLjk3MjM3MEUwLCAxMS45ODEwNzBFMCwgMTEuOTg5NzAwRTAsIDExLjk5ODI2MEUwLAorICAgIDEyLjAwNjc0MEUwLCAxMi4wMTUxNTBFMCwgMTIuMDIzNDkwRTAsIDEyLjAzMTc2MEUwLCAxMi4wMzk5NzBFMCwgMTIuMDQ4MTAwRTAsIDEyLjA1NjE3MEUwLCAxMi4wNjQxODBFMCwgMTIuMDcyMTIwRTAsCisgICAgMTIuMDgwMDEwRTAsIDEyLjA4NzgyMEUwLCAxMi4wOTU1ODBFMCwgMTIuMTAzMjgwRTAsIDEyLjExMDkyMEUwLCAxMi4xMTg1MDBFMCwgMTIuMTI2MDMwRTAsIDEyLjEzMzUwMEUwLCAxMi4xNDA5MTBFMCwKKyAgICAxMi4xNDgyNzBFMCwgMTIuMTU1NTcwRTAsIDEyLjE2MjgzMEUwLCAxMi4xNzAwMzBFMCwgMTIuMTc3MTcwRTAsIDEyLjE4NDI3MEUwLCAxMi4xOTEzMjBFMCwgMTIuMTk4MzIwRTAsIDEyLjIwNTI3MEUwLAorICAgIDEyLjIxMjE3MEUwLCAxMi4yMTkwMzBFMCwgMTIuMjI1ODQwRTAsIDEyLjIzMjYwMEUwLCAxMi4yMzkzMjBFMCwgMTIuMjQ1OTkwRTAsIDEyLjI1MjYyMEUwLCAxMi4yNTkyMDBFMCwgMTIuMjY1NzUwRTAsCisgICAgMTIuMjcyMjQwRTB9OworY29uc3QgZG91YmxlIEJlbm5ldHQ1X2Z1bmN0b3I6OnlbMTU0XSA9IHsKKyAgICAtMzQuODM0NzAyRTAsIC0zNC4zOTMyMDBFMCwgLTM0LjE1MjkwMUUwLCAtMzMuOTc5MDk5RTAsIC0zMy44NDU5MDFFMCwgLTMzLjczMjg5OUUwLCAtMzMuNjQwMzAxRTAsIC0zMy41NTkyMDBFMCwKKyAgICAtMzMuNDg2ODAxRTAsIC0zMy40MjMxMDBFMCwgLTMzLjM2NTEwMUUwLCAtMzMuMzEzMDAwRTAsIC0zMy4yNjA4OTlFMCwgLTMzLjIxNzQwMEUwLCAtMzMuMTc2ODk5RTAsIC0zMy4xMzkxOThFMCwKKyAgICAtMzMuMTAxNjAxRTAsIC0zMy4wNjY3OTlFMCwgLTMzLjAzNTAwMEUwLCAtMzMuMDAzMTAxRTAsIC0zMi45NzEyOThFMCwgLTMyLjk0MjI5OUUwLCAtMzIuOTE2MzAyRTAsIC0zMi44OTAyMDJFMCwKKyAgICAtMzIuODY0MTAxRTAsIC0zMi44NDEwMDBFMCwgLTMyLjgxNzc5OUUwLCAtMzIuNzk3NTAxRTAsIC0zMi43NzQzMDBFMCwgLTMyLjc1NzAwMEUwLCAtMzIuNzMzNzk5RTAsIC0zMi43MTY0MDBFMCwKKyAgICAtMzIuNjk5MTAwRTAsIC0zMi42Nzg3OTlFMCwgLTMyLjY2MTQwMEUwLCAtMzIuNjQ0MDAxRTAsIC0zMi42MjY3MDFFMCwgLTMyLjYxMjIwMkUwLCAtMzIuNTk3Njk4RTAsIC0zMi41ODMxOTlFMCwKKyAgICAtMzIuNTY4Njk5RTAsIC0zMi41NTQyOThFMCwgLTMyLjUzOTc5OUUwLCAtMzIuNTI1Mjk5RTAsIC0zMi41MTA3OTlFMCwgLTMyLjQ5OTE5OUUwLCAtMzIuNDg3NTk4RTAsIC0zMi40NzMyMDJFMCwKKyAgICAtMzIuNDYxNjAxRTAsIC0zMi40MzU1MDFFMCwgLTMyLjQzNTUwMUUwLCAtMzIuNDI2ODAwRTAsIC0zMi40MTIzMDBFMCwgLTMyLjQwMDc5OUUwLCAtMzIuMzkyMTAxRTAsIC0zMi4zODA1MDFFMCwKKyAgICAtMzIuMzY2MDAxRTAsIC0zMi4zNTczMDBFMCwgLTMyLjM0ODU5OEUwLCAtMzIuMzM5OTAxRTAsIC0zMi4zMjg0MDBFMCwgLTMyLjMxOTY5OEUwLCAtMzIuMzExMDAxRTAsIC0zMi4yOTk0MDBFMCwKKyAgICAtMzIuMjkwNjk5RTAsIC0zMi4yODIwMDFFMCwgLTMyLjI3MzMwMEUwLCAtMzIuMjY0NTk5RTAsIC0zMi4yNTYwMDFFMCwgLTMyLjI0NzI5OUUwLCAtMzIuMjM4NjAyRTAsIC0zMi4yMjk5MDBFMCwKKyAgICAtMzIuMjI0MDk4RTAsIC0zMi4yMTU0MDFFMCwgLTMyLjIwMzgwMEUwLCAtMzIuMTk4MDAyRTAsIC0zMi4xODk0MDBFMCwgLTMyLjE4MzYwMUUwLCAtMzIuMTc0OTAwRTAsIC0zMi4xNjkxMDJFMCwKKyAgICAtMzIuMTYzMzAwRTAsIC0zMi4xNTQ1OThFMCwgLTMyLjE0NTkwMUUwLCAtMzIuMTQwMDk5RTAsIC0zMi4xMzE0MDFFMCwgLTMyLjEyNTU5OUUwLCAtMzIuMTE5ODAxRTAsIC0zMi4xMTExOThFMCwKKyAgICAtMzIuMTA1NDAwRTAsIC0zMi4wOTY2OTlFMCwgLTMyLjA5MDkwMEUwLCAtMzIuMDg4MDAxRTAsIC0zMi4wNzkzMDBFMCwgLTMyLjA3MzUwMkUwLCAtMzIuMDY3Njk5RTAsIC0zMi4wNjE5MDFFMCwKKyAgICAtMzIuMDU2MDk5RTAsIC0zMi4wNTAzMDFFMCwgLTMyLjA0NDQ5OEUwLCAtMzIuMDM4Nzk5RTAsIC0zMi4wMzMwMDFFMCwgLTMyLjAyNzE5OUUwLCAtMzIuMDI0MzAwRTAsIC0zMi4wMTg1MDFFMCwKKyAgICAtMzIuMDEyNjk5RTAsIC0zMi4wMDQwMDJFMCwgLTMyLjAwMTA5OUUwLCAtMzEuOTk1MzAwRTAsIC0zMS45ODk1MDBFMCwgLTMxLjk4MzcwMEUwLCAtMzEuOTc3OTAwRTAsIC0zMS45NzIwOTlFMCwKKyAgICAtMzEuOTY5Mjk5RTAsIC0zMS45NjM1MDFFMCwgLTMxLjk1NzcwMUUwLCAtMzEuOTUxOTAwRTAsIC0zMS45NDYxMDBFMCwgLTMxLjk0MDMwMEUwLCAtMzEuOTM3NDAxRTAsIC0zMS45MzE2MDFFMCwKKyAgICAtMzEuOTI1ODAwRTAsIC0zMS45MjI4OTlFMCwgLTMxLjkxNzEwMUUwLCAtMzEuOTExMzAxRTAsIC0zMS45MDg0MDBFMCwgLTMxLjkwMjU5OUUwLCAtMzEuODk2OTAwRTAsIC0zMS44OTM5OTlFMCwKKyAgICAtMzEuODg4MjAxRTAsIC0zMS44ODUzMDBFMCwgLTMxLjg4MjQwMUUwLCAtMzEuODc2NjAwRTAsIC0zMS44NzM2OTlFMCwgLTMxLjg2NzkwMUUwLCAtMzEuODYyMTAxRTAsIC0zMS44NTkyMDBFMCwKKyAgICAtMzEuODU2MzAwRTAsIC0zMS44NTA1MDBFMCwgLTMxLjg0NDcwMEUwLCAtMzEuODQxODAxRTAsIC0zMS44Mzg5MDBFMCwgLTMxLjgzMzA5OUUwLCAtMzEuODMwMjAwRTAsIC0zMS44MjcyOTlFMCwKKyAgICAtMzEuODIxNjAwRTAsIC0zMS44MTg3MDFFMCwgLTMxLjgxMjkwMUUwLCAtMzEuODA5OTk5RTAsIC0zMS44MDcxMDBFMCwgLTMxLjgwMTMwMEUwLCAtMzEuNzk4NDAxRTAsIC0zMS43OTU1MDBFMCwKKyAgICAtMzEuNzg5NzAwRTAsIC0zMS43ODY4MDBFMH07CiAKIC8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL2Jlbm5ldHQ1LnNodG1sCi12b2lkIHRlc3ROaXN0QmVubmV0dDUodm9pZCkKLXsKLSAgY29uc3QgaW50ICBuPTM7Cit2b2lkIHRlc3ROaXN0QmVubmV0dDUodm9pZCkgeworICBjb25zdCBpbnQgbiA9IDM7CiAgIGludCBpbmZvOwogCiAgIFZlY3RvclhkIHgobik7CkBAIC0xNTIxLDcgKzE1MTYsNyBAQAogICAvKgogICAgKiBGaXJzdCB0cnkKICAgICovCi0gIHg8PCAtMjAwMC4sIDUwLiwgMC44OworICB4IDw8IC0yMDAwLiwgNTAuLCAwLjg7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBCZW5uZXR0NV9mdW5jdG9yIGZ1bmN0b3I7CiAgIExldmVuYmVyZ01hcnF1YXJkdDxCZW5uZXR0NV9mdW5jdG9yPiBsbShmdW5jdG9yKTsKQEAgLTE1NDEsNyArMTUzNiw3IEBACiAgIC8qCiAgICAqIFNlY29uZCB0cnkKICAgICovCi0gIHg8PCAtMTUwMC4sIDQ1LiwgMC44NTsKKyAgeCA8PCAtMTUwMC4sIDQ1LiwgMC44NTsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGxtLnJlc2V0UGFyYW1ldGVycygpOwogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CkBAIC0xNTUzLDU0ICsxNTQ4LDYwIEBACiAgIC8vIGNoZWNrIG5vcm1eMgogICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMuc3F1YXJlZE5vcm0oKSwgNS4yNDA0NzQ0MDczRS0wNCk7CiAgIC8vIGNoZWNrIHgKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAtMjUyMy4zMDA3ODY1KTsgLy8gc2hvdWxkIGJlIC0yLjUyMzUwNTgwNDNFKzAzCi0gIFZFUklGWV9JU19BUFBST1goeFsxXSwgNDYuNzM1NzA1NzcxKTsgLy8gc2hvdWxkIGJlIDQuNjczNjU2NDY0NEUrMDEpOwotICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDAuOTMyMTk4ODE4OTEpOyAvLyBzaG91bGQgYmUgOS4zMjE4NDgzMTkzRS0wMSk7CisgIFZFUklGWV9JU19BUFBST1goeFswXSwgLTI1MjMuMzAwNzg2NSk7ICAvLyBzaG91bGQgYmUgLTIuNTIzNTA1ODA0M0UrMDMKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA0Ni43MzU3MDU3NzEpOyAgIC8vIHNob3VsZCBiZSA0LjY3MzY1NjQ2NDRFKzAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAwLjkzMjE5ODgxODkxKTsgIC8vIHNob3VsZCBiZSA5LjMyMTg0ODMxOTNFLTAxKTsKIH0KIAotc3RydWN0IHRodXJiZXJfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgotewotICAgIHRodXJiZXJfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPig3LDM3KSB7fQotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgX3hbMzddOwotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgX3lbMzddOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIC8vICAgICAgICBpbnQgY2FsbGVkPTA7IHByaW50ZigiY2FsbCBoYWhuMV9mdW5jdG9yIHdpdGggIGlmbGFnPSVkLCBjYWxsZWQ9JWRcbiIsIGlmbGFnLCBjYWxsZWQpOyBpZiAoaWZsYWc9PTEpIGNhbGxlZCsrOwotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTcpOwotICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTM3KTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8Mzc7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIHg9X3hbaV0sIHh4PXgqeCwgeHh4PXh4Kng7Ci0gICAgICAgICAgICBmdmVjW2ldID0gKGJbMF0rYlsxXSp4K2JbMl0qeHgrYlszXSp4eHgpIC8gKDEuK2JbNF0qeCtiWzVdKnh4K2JbNl0qeHh4KSAtIF95W2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworc3RydWN0IHRodXJiZXJfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPiB7CisgIHRodXJiZXJfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPig3LCAzNykge30KKyAgc3RhdGljIGNvbnN0IGRvdWJsZSBfeFszN107CisgIHN0YXRpYyBjb25zdCBkb3VibGUgX3lbMzddOworICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpIHsKKyAgICAvLyAgICAgICAgaW50IGNhbGxlZD0wOyBwcmludGYoImNhbGwgaGFobjFfZnVuY3RvciB3aXRoICBpZmxhZz0lZCwgY2FsbGVkPSVkXG4iLCBpZmxhZywgY2FsbGVkKTsgaWYgKGlmbGFnPT0xKQorICAgIC8vICAgICAgICBjYWxsZWQrKzsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gNyk7CisgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpID09IDM3KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM3OyBpKyspIHsKKyAgICAgIGRvdWJsZSB4ID0gX3hbaV0sIHh4ID0geCAqIHgsIHh4eCA9IHh4ICogeDsKKyAgICAgIGZ2ZWNbaV0gPSAoYlswXSArIGJbMV0gKiB4ICsgYlsyXSAqIHh4ICsgYlszXSAqIHh4eCkgLyAoMS4gKyBiWzRdICogeCArIGJbNV0gKiB4eCArIGJbNl0gKiB4eHgpIC0gX3lbaV07CiAgICAgfQotICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTcpOwotICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTM3KTsKLSAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT03KTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8Mzc7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIHg9X3hbaV0sIHh4PXgqeCwgeHh4PXh4Kng7Ci0gICAgICAgICAgICBkb3VibGUgZmFjdCA9IDEuLygxLitiWzRdKngrYls1XSp4eCtiWzZdKnh4eCk7Ci0gICAgICAgICAgICBmamFjKGksMCkgPSAxLipmYWN0OwotICAgICAgICAgICAgZmphYyhpLDEpID0geCpmYWN0OwotICAgICAgICAgICAgZmphYyhpLDIpID0geHgqZmFjdDsKLSAgICAgICAgICAgIGZqYWMoaSwzKSA9IHh4eCpmYWN0OwotICAgICAgICAgICAgZmFjdCA9IC0gKGJbMF0rYlsxXSp4K2JbMl0qeHgrYlszXSp4eHgpICogZmFjdCAqIGZhY3Q7Ci0gICAgICAgICAgICBmamFjKGksNCkgPSB4KmZhY3Q7Ci0gICAgICAgICAgICBmamFjKGksNSkgPSB4eCpmYWN0OwotICAgICAgICAgICAgZmphYyhpLDYpID0geHh4KmZhY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykgeworICAgIGFzc2VydChiLnNpemUoKSA9PSA3KTsKKyAgICBhc3NlcnQoZmphYy5yb3dzKCkgPT0gMzcpOworICAgIGFzc2VydChmamFjLmNvbHMoKSA9PSA3KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM3OyBpKyspIHsKKyAgICAgIGRvdWJsZSB4ID0gX3hbaV0sIHh4ID0geCAqIHgsIHh4eCA9IHh4ICogeDsKKyAgICAgIGRvdWJsZSBmYWN0ID0gMS4gLyAoMS4gKyBiWzRdICogeCArIGJbNV0gKiB4eCArIGJbNl0gKiB4eHgpOworICAgICAgZmphYyhpLCAwKSA9IDEuICogZmFjdDsKKyAgICAgIGZqYWMoaSwgMSkgPSB4ICogZmFjdDsKKyAgICAgIGZqYWMoaSwgMikgPSB4eCAqIGZhY3Q7CisgICAgICBmamFjKGksIDMpID0geHh4ICogZmFjdDsKKyAgICAgIGZhY3QgPSAtKGJbMF0gKyBiWzFdICogeCArIGJbMl0gKiB4eCArIGJbM10gKiB4eHgpICogZmFjdCAqIGZhY3Q7CisgICAgICBmamFjKGksIDQpID0geCAqIGZhY3Q7CisgICAgICBmamFjKGksIDUpID0geHggKiBmYWN0OworICAgICAgZmphYyhpLCA2KSA9IHh4eCAqIGZhY3Q7CiAgICAgfQorICAgIHJldHVybiAwOworICB9CiB9OwotY29uc3QgZG91YmxlIHRodXJiZXJfZnVuY3Rvcjo6X3hbMzddID0geyAtMy4wNjdFMCwgLTIuOTgxRTAsIC0yLjkyMUUwLCAtMi45MTJFMCwgLTIuODQwRTAsIC0yLjc5N0UwLCAtMi43MDJFMCwgLTIuNjk5RTAsIC0yLjYzM0UwLCAtMi40ODFFMCwgLTIuMzYzRTAsIC0yLjMyMkUwLCAtMS41MDFFMCwgLTEuNDYwRTAsIC0xLjI3NEUwLCAtMS4yMTJFMCwgLTEuMTAwRTAsIC0xLjA0NkUwLCAtMC45MTVFMCwgLTAuNzE0RTAsIC0wLjU2NkUwLCAtMC41NDVFMCwgLTAuNDAwRTAsIC0wLjMwOUUwLCAtMC4xMDlFMCwgLTAuMTAzRTAsIDAuMDEwRTAsIDAuMTE5RTAsIDAuMzc3RTAsIDAuNzkwRTAsIDAuOTYzRTAsIDEuMDA2RTAsIDEuMTE1RTAsIDEuNTcyRTAsIDEuODQxRTAsIDIuMDQ3RTAsIDIuMjAwRTAgfTsKLWNvbnN0IGRvdWJsZSB0aHVyYmVyX2Z1bmN0b3I6Ol95WzM3XSA9IHsgODAuNTc0RTAsIDg0LjI0OEUwLCA4Ny4yNjRFMCwgODcuMTk1RTAsIDg5LjA3NkUwLCA4OS42MDhFMCwgODkuODY4RTAsIDkwLjEwMUUwLCA5Mi40MDVFMCwgOTUuODU0RTAsIDEwMC42OTZFMCwgMTAxLjA2MEUwLCA0MDEuNjcyRTAsIDM5MC43MjRFMCwgNTY3LjUzNEUwLCA2MzUuMzE2RTAsIDczMy4wNTRFMCwgNzU5LjA4N0UwLCA4OTQuMjA2RTAsIDk5MC43ODVFMCwgMTA5MC4xMDlFMCwgMTA4MC45MTRFMCwgMTEyMi42NDNFMCwgMTE3OC4zNTFFMCwgMTI2MC41MzFFMCwgMTI3My41MTRFMCwgMTI4OC4zMzlFMCwgMTMyNy41NDNFMCwgMTM1My44NjNFMCwgMTQxNC41MDlFMCwgMTQyNS4yMDhFMCwgMTQyMS4zODRFMCwgMTQ0Mi45NjJFMCwgMTQ2NC4zNTBFMCwgMTQ2OC43MDVFMCwgMTQ0Ny44OTRFMCwgMTQ1Ny42MjhFMH07Citjb25zdCBkb3VibGUgdGh1cmJlcl9mdW5jdG9yOjpfeFszN10gPSB7LTMuMDY3RTAsIC0yLjk4MUUwLCAtMi45MjFFMCwgLTIuOTEyRTAsIC0yLjg0MEUwLCAtMi43OTdFMCwgLTIuNzAyRTAsIC0yLjY5OUUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjYzM0UwLCAtMi40ODFFMCwgLTIuMzYzRTAsIC0yLjMyMkUwLCAtMS41MDFFMCwgLTEuNDYwRTAsIC0xLjI3NEUwLCAtMS4yMTJFMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4xMDBFMCwgLTEuMDQ2RTAsIC0wLjkxNUUwLCAtMC43MTRFMCwgLTAuNTY2RTAsIC0wLjU0NUUwLCAtMC40MDBFMCwgLTAuMzA5RTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTA5RTAsIC0wLjEwM0UwLCAwLjAxMEUwLCAgMC4xMTlFMCwgIDAuMzc3RTAsICAwLjc5MEUwLCAgMC45NjNFMCwgIDEuMDA2RTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMTVFMCwgIDEuNTcyRTAsICAxLjg0MUUwLCAgMi4wNDdFMCwgIDIuMjAwRTB9OworY29uc3QgZG91YmxlIHRodXJiZXJfZnVuY3Rvcjo6X3lbMzddID0geworICAgIDgwLjU3NEUwLCAgIDg0LjI0OEUwLCAgIDg3LjI2NEUwLCAgIDg3LjE5NUUwLCAgIDg5LjA3NkUwLCAgIDg5LjYwOEUwLCAgIDg5Ljg2OEUwLCAgIDkwLjEwMUUwLAorICAgIDkyLjQwNUUwLCAgIDk1Ljg1NEUwLCAgIDEwMC42OTZFMCwgIDEwMS4wNjBFMCwgIDQwMS42NzJFMCwgIDM5MC43MjRFMCwgIDU2Ny41MzRFMCwgIDYzNS4zMTZFMCwKKyAgICA3MzMuMDU0RTAsICA3NTkuMDg3RTAsICA4OTQuMjA2RTAsICA5OTAuNzg1RTAsICAxMDkwLjEwOUUwLCAxMDgwLjkxNEUwLCAxMTIyLjY0M0UwLCAxMTc4LjM1MUUwLAorICAgIDEyNjAuNTMxRTAsIDEyNzMuNTE0RTAsIDEyODguMzM5RTAsIDEzMjcuNTQzRTAsIDEzNTMuODYzRTAsIDE0MTQuNTA5RTAsIDE0MjUuMjA4RTAsIDE0MjEuMzg0RTAsCisgICAgMTQ0Mi45NjJFMCwgMTQ2NC4zNTBFMCwgMTQ2OC43MDVFMCwgMTQ0Ny44OTRFMCwgMTQ1Ny42MjhFMH07CiAKIC8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL3RodXJiZXIuc2h0bWwKLXZvaWQgdGVzdE5pc3RUaHVyYmVyKHZvaWQpCi17Ci0gIGNvbnN0IGludCBuPTc7Cit2b2lkIHRlc3ROaXN0VGh1cmJlcih2b2lkKSB7CisgIGNvbnN0IGludCBuID0gNzsKICAgaW50IGluZm87CiAKICAgVmVjdG9yWGQgeChuKTsKQEAgLTE2MDgsMTggKzE2MDksMTggQEAKICAgLyoKICAgICogRmlyc3QgdHJ5CiAgICAqLwotICB4PDwgMTAwMCAsMTAwMCAsNDAwICw0MCAsMC43LDAuMywwLjAgOworICB4IDw8IDEwMDAsIDEwMDAsIDQwMCwgNDAsIDAuNywgMC4zLCAwLjA7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICB0aHVyYmVyX2Z1bmN0b3IgZnVuY3RvcjsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PHRodXJiZXJfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7Ci0gIGxtLnBhcmFtZXRlcnMuZnRvbCA9IDEuRTQqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKLSAgbG0ucGFyYW1ldGVycy54dG9sID0gMS5FNCpOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSAxLkU0ICogTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgbG0ucGFyYW1ldGVycy54dG9sID0gMS5FNCAqIE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CiAgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGluZm8pCiAKICAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCiAgIC8vIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKLSAgTE1fQ0hFQ0tfTl9JVEVSUyhsbSwgMzksMzYpOworICBMTV9DSEVDS19OX0lURVJTKGxtLCAzOSwgMzYpOwogICAvLyBjaGVjayBub3JtXjIKICAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjLnNxdWFyZWROb3JtKCksIDUuNjQyNzA4MjM5N0UrMDMpOwogICAvLyBjaGVjayB4CkBAIC0xNjM0LDExICsxNjM1LDExIEBACiAgIC8qCiAgICAqIFNlY29uZCB0cnkKICAgICovCi0gIHg8PCAxMzAwICwxNTAwICw1MDAgICw3NSAgICwxICAgICwwLjQgICwwLjA1ICA7CisgIHggPDwgMTMwMCwgMTUwMCwgNTAwLCA3NSwgMSwgMC40LCAwLjA1OwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7Ci0gIGxtLnBhcmFtZXRlcnMuZnRvbCA9IDEuRTQqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKLSAgbG0ucGFyYW1ldGVycy54dG9sID0gMS5FNCpOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSAxLkU0ICogTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgbG0ucGFyYW1ldGVycy54dG9sID0gMS5FNCAqIE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CiAgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGluZm8pCiAKQEAgLTE2NTcsNDIgKzE2NTgsMzggQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzZdLCA0Ljk3MjcyOTczNDlFLTAyKTsKIH0KIAotc3RydWN0IHJhdDQzX2Z1bmN0b3IgOiBGdW5jdG9yPGRvdWJsZT4KLXsKLSAgICByYXQ0M19mdW5jdG9yKHZvaWQpIDogRnVuY3Rvcjxkb3VibGU+KDQsMTUpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE1XTsKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTVdOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09NCk7Ci0gICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTUpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwxNTsgaSsrKQotICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0gKiBwb3coMS4rZXhwKGJbMV0tYlsyXSp4W2ldKSwtMS4vYlszXSkgLSB5W2ldOwotICAgICAgICByZXR1cm4gMDsKK3N0cnVjdCByYXQ0M19mdW5jdG9yIDogRnVuY3Rvcjxkb3VibGU+IHsKKyAgcmF0NDNfZnVuY3Rvcih2b2lkKSA6IEZ1bmN0b3I8ZG91YmxlPig0LCAxNSkge30KKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE1XTsKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzE1XTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDQpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSAxNSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTsgaSsrKSBmdmVjW2ldID0gYlswXSAqIHBvdygxLiArIGV4cChiWzFdIC0gYlsyXSAqIHhbaV0pLCAtMS4gLyBiWzNdKSAtIHlbaV07CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykgeworICAgIGFzc2VydChiLnNpemUoKSA9PSA0KTsKKyAgICBhc3NlcnQoZmphYy5yb3dzKCkgPT0gMTUpOworICAgIGFzc2VydChmamFjLmNvbHMoKSA9PSA0KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE1OyBpKyspIHsKKyAgICAgIGRvdWJsZSBlID0gZXhwKGJbMV0gLSBiWzJdICogeFtpXSk7CisgICAgICBkb3VibGUgcG93ZXIgPSAtMS4gLyBiWzNdOworICAgICAgZmphYyhpLCAwKSA9IHBvdygxLiArIGUsIHBvd2VyKTsKKyAgICAgIGZqYWMoaSwgMSkgPSBwb3dlciAqIGJbMF0gKiBlICogcG93KDEuICsgZSwgcG93ZXIgLSAxLik7CisgICAgICBmamFjKGksIDIpID0gLXBvd2VyICogYlswXSAqIGUgKiB4W2ldICogcG93KDEuICsgZSwgcG93ZXIgLSAxLik7CisgICAgICBmamFjKGksIDMpID0gYlswXSAqIHBvd2VyICogcG93ZXIgKiBsb2coMS4gKyBlKSAqIHBvdygxLiArIGUsIHBvd2VyKTsKICAgICB9Ci0gICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09NCk7Ci0gICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTUpOwotICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTQpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwxNTsgaSsrKSB7Ci0gICAgICAgICAgICBkb3VibGUgZSA9IGV4cChiWzFdLWJbMl0qeFtpXSk7Ci0gICAgICAgICAgICBkb3VibGUgcG93ZXIgPSAtMS4vYlszXTsKLSAgICAgICAgICAgIGZqYWMoaSwwKSA9IHBvdygxLitlLCBwb3dlcik7Ci0gICAgICAgICAgICBmamFjKGksMSkgPSBwb3dlcipiWzBdKmUqcG93KDEuK2UsIHBvd2VyLTEuKTsKLSAgICAgICAgICAgIGZqYWMoaSwyKSA9IC1wb3dlcipiWzBdKmUqeFtpXSpwb3coMS4rZSwgcG93ZXItMS4pOwotICAgICAgICAgICAgZmphYyhpLDMpID0gYlswXSpwb3dlcipwb3dlcipsb2coMS4rZSkqcG93KDEuK2UsIHBvd2VyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIH07Ci1jb25zdCBkb3VibGUgcmF0NDNfZnVuY3Rvcjo6eFsxNV0gPSB7IDEuLCAyLiwgMy4sIDQuLCA1LiwgNi4sIDcuLCA4LiwgOS4sIDEwLiwgMTEuLCAxMi4sIDEzLiwgMTQuLCAxNS4gfTsKLWNvbnN0IGRvdWJsZSByYXQ0M19mdW5jdG9yOjp5WzE1XSA9IHsgMTYuMDgsIDMzLjgzLCA2NS44MCwgOTcuMjAsIDE5MS41NSwgMzI2LjIwLCAzODYuODcsIDUyMC41MywgNTkwLjAzLCA2NTEuOTIsIDcyNC45MywgNjk5LjU2LCA2ODkuOTYsIDYzNy41NiwgNzE3LjQxIH07Citjb25zdCBkb3VibGUgcmF0NDNfZnVuY3Rvcjo6eFsxNV0gPSB7MS4sIDIuLCAzLiwgNC4sIDUuLCA2LiwgNy4sIDguLCA5LiwgMTAuLCAxMS4sIDEyLiwgMTMuLCAxNC4sIDE1Ln07Citjb25zdCBkb3VibGUgcmF0NDNfZnVuY3Rvcjo6eVsxNV0gPSB7MTYuMDgsICAzMy44MywgIDY1LjgwLCAgOTcuMjAsICAxOTEuNTUsIDMyNi4yMCwgMzg2Ljg3LCA1MjAuNTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkwLjAzLCA2NTEuOTIsIDcyNC45MywgNjk5LjU2LCA2ODkuOTYsIDYzNy41NiwgNzE3LjQxfTsKIAogLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvcmF0a293c2t5My5zaHRtbAotdm9pZCB0ZXN0TmlzdFJhdDQzKHZvaWQpCi17Ci0gIGNvbnN0IGludCBuPTQ7Cit2b2lkIHRlc3ROaXN0UmF0NDModm9pZCkgeworICBjb25zdCBpbnQgbiA9IDQ7CiAgIGludCBpbmZvOwogCiAgIFZlY3RvclhkIHgobik7CkBAIC0xNzAwLDEyICsxNjk3LDEyIEBACiAgIC8qCiAgICAqIEZpcnN0IHRyeQogICAgKi8KLSAgeDw8IDEwMC4sIDEwLiwgMS4sIDEuOworICB4IDw8IDEwMC4sIDEwLiwgMS4sIDEuOwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgcmF0NDNfZnVuY3RvciBmdW5jdG9yOwogICBMZXZlbmJlcmdNYXJxdWFyZHQ8cmF0NDNfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7Ci0gIGxtLnBhcmFtZXRlcnMuZnRvbCA9IDEuRTYqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKLSAgbG0ucGFyYW1ldGVycy54dG9sID0gMS5FNipOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOworICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSAxLkU2ICogTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgbG0ucGFyYW1ldGVycy54dG9sID0gMS5FNiAqIE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CiAgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGluZm8pCiAKQEAgLTE3MjMsMTEgKzE3MjAsMTEgQEAKICAgLyoKICAgICogU2Vjb25kIHRyeQogICAgKi8KLSAgeDw8IDcwMC4sIDUuLCAwLjc1LCAxLjM7CisgIHggPDwgNzAwLiwgNS4sIDAuNzUsIDEuMzsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGxtLnJlc2V0UGFyYW1ldGVycygpOwotICBsbS5wYXJhbWV0ZXJzLmZ0b2wgPSAxLkU1Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7Ci0gIGxtLnBhcmFtZXRlcnMueHRvbCA9IDEuRTUqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKTsKKyAgbG0ucGFyYW1ldGVycy5mdG9sID0gMS5FNSAqIE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCk7CisgIGxtLnBhcmFtZXRlcnMueHRvbCA9IDEuRTUgKiBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpOwogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbmZvKQogCkBAIC0xNzQzLDQzICsxNzQwLDQ0IEBACiAgIFZFUklGWV9JU19BUFBST1goeFszXSwgMS4yNzkyNDgzODU5RSswMCk7CiB9CiAKLQotCi1zdHJ1Y3QgZWNrZXJsZTRfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgotewotICAgIGVja2VybGU0X2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywzNSkge30KLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMzVdOwotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVszNV07Ci0gICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKLSAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0zNSk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDM1OyBpKyspCi0gICAgICAgICAgICBmdmVjW2ldID0gYlswXS9iWzFdICogZXhwKC0wLjUqKHhbaV0tYlsyXSkqKHhbaV0tYlsyXSkvKGJbMV0qYlsxXSkpIC0geVtpXTsKLSAgICAgICAgcmV0dXJuIDA7CitzdHJ1Y3QgZWNrZXJsZTRfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPiB7CisgIGVja2VybGU0X2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywgMzUpIHt9CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeFszNV07CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeVszNV07CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykgeworICAgIGFzc2VydChiLnNpemUoKSA9PSAzKTsKKyAgICBhc3NlcnQoZnZlYy5zaXplKCkgPT0gMzUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzU7IGkrKykKKyAgICAgIGZ2ZWNbaV0gPSBiWzBdIC8gYlsxXSAqIGV4cCgtMC41ICogKHhbaV0gLSBiWzJdKSAqICh4W2ldIC0gYlsyXSkgLyAoYlsxXSAqIGJbMV0pKSAtIHlbaV07CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykgeworICAgIGFzc2VydChiLnNpemUoKSA9PSAzKTsKKyAgICBhc3NlcnQoZmphYy5yb3dzKCkgPT0gMzUpOworICAgIGFzc2VydChmamFjLmNvbHMoKSA9PSAzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM1OyBpKyspIHsKKyAgICAgIGRvdWJsZSBiMTIgPSBiWzFdICogYlsxXTsKKyAgICAgIGRvdWJsZSBlID0gZXhwKC0wLjUgKiAoeFtpXSAtIGJbMl0pICogKHhbaV0gLSBiWzJdKSAvIGIxMik7CisgICAgICBmamFjKGksIDApID0gZSAvIGJbMV07CisgICAgICBmamFjKGksIDEpID0gKCh4W2ldIC0gYlsyXSkgKiAoeFtpXSAtIGJbMl0pIC8gYjEyIC0gMS4pICogYlswXSAqIGUgLyBiMTI7CisgICAgICBmamFjKGksIDIpID0gKHhbaV0gLSBiWzJdKSAqIGUgKiBiWzBdIC8gYlsxXSAvIGIxMjsKICAgICB9Ci0gICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7Ci0gICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MzUpOwotICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTMpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwzNTsgaSsrKSB7Ci0gICAgICAgICAgICBkb3VibGUgYjEyID0gYlsxXSpiWzFdOwotICAgICAgICAgICAgZG91YmxlIGUgPSBleHAoLTAuNSooeFtpXS1iWzJdKSooeFtpXS1iWzJdKS9iMTIpOwotICAgICAgICAgICAgZmphYyhpLDApID0gZSAvIGJbMV07Ci0gICAgICAgICAgICBmamFjKGksMSkgPSAoKHhbaV0tYlsyXSkqKHhbaV0tYlsyXSkvYjEyLTEuKSAqIGJbMF0qZS9iMTI7Ci0gICAgICAgICAgICBmamFjKGksMikgPSAoeFtpXS1iWzJdKSplKmJbMF0vYlsxXS9iMTI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiAwOworICB9CiB9OwotY29uc3QgZG91YmxlIGVja2VybGU0X2Z1bmN0b3I6OnhbMzVdID0geyA0MDAuMCwgNDA1LjAsIDQxMC4wLCA0MTUuMCwgNDIwLjAsIDQyNS4wLCA0MzAuMCwgNDM1LjAsIDQzNi41LCA0MzguMCwgNDM5LjUsIDQ0MS4wLCA0NDIuNSwgNDQ0LjAsIDQ0NS41LCA0NDcuMCwgNDQ4LjUsIDQ1MC4wLCA0NTEuNSwgNDUzLjAsIDQ1NC41LCA0NTYuMCwgNDU3LjUsIDQ1OS4wLCA0NjAuNSwgNDYyLjAsIDQ2My41LCA0NjUuMCwgNDcwLjAsIDQ3NS4wLCA0ODAuMCwgNDg1LjAsIDQ5MC4wLCA0OTUuMCwgNTAwLjB9OwotY29uc3QgZG91YmxlIGVja2VybGU0X2Z1bmN0b3I6OnlbMzVdID0geyAwLjAwMDE1NzUsIDAuMDAwMTY5OSwgMC4wMDAyMzUwLCAwLjAwMDMxMDIsIDAuMDAwNDkxNywgMC4wMDA4NzEwLCAwLjAwMTc0MTgsIDAuMDA0NjQwMCwgMC4wMDY1ODk1LCAwLjAwOTczMDIsIDAuMDE0OTAwMiwgMC4wMjM3MzEwLCAwLjA0MDE2ODMsIDAuMDcxMjU1OSwgMC4xMjY0NDU4LCAwLjIwNzM0MTMsIDAuMjkwMjM2NiwgMC4zNDQ1NjIzLCAwLjM2OTgwNDksIDAuMzY2ODUzNCwgMC4zMTA2NzI3LCAwLjIwNzgxNTQsIDAuMTE2NDM1NCwgMC4wNjE2NzY0LCAwLjAzMzcyMDAsIDAuMDE5NDAyMywgMC4wMTE3ODMxLCAwLjAwNzQzNTcsIDAuMDAyMjczMiwgMC4wMDA4ODAwLCAwLjAwMDQ1NzksIDAuMDAwMjM0NSwgMC4wMDAxNTg2LCAwLjAwMDExNDMsIDAuMDAwMDcxMCB9OworY29uc3QgZG91YmxlIGVja2VybGU0X2Z1bmN0b3I6OnhbMzVdID0gezQwMC4wLCA0MDUuMCwgNDEwLjAsIDQxNS4wLCA0MjAuMCwgNDI1LjAsIDQzMC4wLCA0MzUuMCwgNDM2LjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM4LjAsIDQzOS41LCA0NDEuMCwgNDQyLjUsIDQ0NC4wLCA0NDUuNSwgNDQ3LjAsIDQ0OC41LCA0NTAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTEuNSwgNDUzLjAsIDQ1NC41LCA0NTYuMCwgNDU3LjUsIDQ1OS4wLCA0NjAuNSwgNDYyLjAsIDQ2My41LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2NS4wLCA0NzAuMCwgNDc1LjAsIDQ4MC4wLCA0ODUuMCwgNDkwLjAsIDQ5NS4wLCA1MDAuMH07Citjb25zdCBkb3VibGUgZWNrZXJsZTRfZnVuY3Rvcjo6eVszNV0gPSB7MC4wMDAxNTc1LCAwLjAwMDE2OTksIDAuMDAwMjM1MCwgMC4wMDAzMTAyLCAwLjAwMDQ5MTcsIDAuMDAwODcxMCwgMC4wMDE3NDE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NjQwMCwgMC4wMDY1ODk1LCAwLjAwOTczMDIsIDAuMDE0OTAwMiwgMC4wMjM3MzEwLCAwLjA0MDE2ODMsIDAuMDcxMjU1OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNjQ0NTgsIDAuMjA3MzQxMywgMC4yOTAyMzY2LCAwLjM0NDU2MjMsIDAuMzY5ODA0OSwgMC4zNjY4NTM0LCAwLjMxMDY3MjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMDc4MTU0LCAwLjExNjQzNTQsIDAuMDYxNjc2NCwgMC4wMzM3MjAwLCAwLjAxOTQwMjMsIDAuMDExNzgzMSwgMC4wMDc0MzU3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMjczMiwgMC4wMDA4ODAwLCAwLjAwMDQ1NzksIDAuMDAwMjM0NSwgMC4wMDAxNTg2LCAwLjAwMDExNDMsIDAuMDAwMDcxMH07CiAKIC8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL2Vja2VybGU0LnNodG1sCi12b2lkIHRlc3ROaXN0RWNrZXJsZTQodm9pZCkKLXsKLSAgY29uc3QgaW50IG49MzsKK3ZvaWQgdGVzdE5pc3RFY2tlcmxlNCh2b2lkKSB7CisgIGNvbnN0IGludCBuID0gMzsKICAgaW50IGluZm87CiAKICAgVmVjdG9yWGQgeChuKTsKQEAgLTE3ODcsNyArMTc4NSw3IEBACiAgIC8qCiAgICAqIEZpcnN0IHRyeQogICAgKi8KLSAgeDw8IDEuLCAxMC4sIDUwMC47CisgIHggPDwgMS4sIDEwLiwgNTAwLjsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGVja2VybGU0X2Z1bmN0b3IgZnVuY3RvcjsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PGVja2VybGU0X2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOwpAQCAtMTgwNyw3ICsxODA1LDcgQEAKICAgLyoKICAgICogU2Vjb25kIHRyeQogICAgKi8KLSAgeDw8IDEuNSwgNS4sIDQ1MC47CisgIHggPDwgMS41LCA1LiwgNDUwLjsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGluZm8pCkBAIC0xODIzLDQwICsxODIxLDM5IEBACiAgIFZFUklGWV9JU19BUFBST1goeFsyXSwgNC41MTU0MTIxODQ0RSswMik7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChOb25MaW5lYXJPcHRpbWl6YXRpb24pCi17Ci0gICAgLy8gVGVzdHMgdXNpbmcgdGhlIGV4YW1wbGVzIHByb3ZpZGVkIGJ5IChjKW1pbnBhY2sKLSAgICBDQUxMX1NVQlRFU1QvKl8xKi8odGVzdENoa2RlcigpKTsKLSAgICBDQUxMX1NVQlRFU1QvKl8xKi8odGVzdExtZGVyMSgpKTsKLSAgICBDQUxMX1NVQlRFU1QvKl8xKi8odGVzdExtZGVyKCkpOwotICAgIENBTExfU1VCVEVTVC8qXzIqLyh0ZXN0SHlicmoxKCkpOwotICAgIENBTExfU1VCVEVTVC8qXzIqLyh0ZXN0SHlicmooKSk7Ci0gICAgQ0FMTF9TVUJURVNULypfMiovKHRlc3RIeWJyZDEoKSk7Ci0gICAgQ0FMTF9TVUJURVNULypfMiovKHRlc3RIeWJyZCgpKTsKLSAgICBDQUxMX1NVQlRFU1QvKl8zKi8odGVzdExtc3RyMSgpKTsKLSAgICBDQUxMX1NVQlRFU1QvKl8zKi8odGVzdExtc3RyKCkpOwotICAgIENBTExfU1VCVEVTVC8qXzMqLyh0ZXN0TG1kaWYxKCkpOwotICAgIENBTExfU1VCVEVTVC8qXzMqLyh0ZXN0TG1kaWYoKSk7CitFSUdFTl9ERUNMQVJFX1RFU1QoTm9uTGluZWFyT3B0aW1pemF0aW9uKSB7CisgIC8vIFRlc3RzIHVzaW5nIHRoZSBleGFtcGxlcyBwcm92aWRlZCBieSAoYyltaW5wYWNrCisgIENBTExfU1VCVEVTVCAvKl8xKi8gKHRlc3RDaGtkZXIoKSk7CisgIENBTExfU1VCVEVTVCAvKl8xKi8gKHRlc3RMbWRlcjEoKSk7CisgIENBTExfU1VCVEVTVCAvKl8xKi8gKHRlc3RMbWRlcigpKTsKKyAgQ0FMTF9TVUJURVNUIC8qXzIqLyAodGVzdEh5YnJqMSgpKTsKKyAgQ0FMTF9TVUJURVNUIC8qXzIqLyAodGVzdEh5YnJqKCkpOworICBDQUxMX1NVQlRFU1QgLypfMiovICh0ZXN0SHlicmQxKCkpOworICBDQUxMX1NVQlRFU1QgLypfMiovICh0ZXN0SHlicmQoKSk7CisgIENBTExfU1VCVEVTVCAvKl8zKi8gKHRlc3RMbXN0cjEoKSk7CisgIENBTExfU1VCVEVTVCAvKl8zKi8gKHRlc3RMbXN0cigpKTsKKyAgQ0FMTF9TVUJURVNUIC8qXzMqLyAodGVzdExtZGlmMSgpKTsKKyAgQ0FMTF9TVUJURVNUIC8qXzMqLyAodGVzdExtZGlmKCkpOwogCi0gICAgLy8gTklTVCB0ZXN0cywgbGV2ZWwgb2YgZGlmZmljdWx0eSA9ICJMb3dlciIKLSAgICBDQUxMX1NVQlRFU1QvKl80Ki8odGVzdE5pc3RNaXNyYTFhKCkpOwotICAgIENBTExfU1VCVEVTVC8qXzQqLyh0ZXN0TmlzdENod2lydXQyKCkpOworICAvLyBOSVNUIHRlc3RzLCBsZXZlbCBvZiBkaWZmaWN1bHR5ID0gIkxvd2VyIgorICBDQUxMX1NVQlRFU1QgLypfNCovICh0ZXN0TmlzdE1pc3JhMWEoKSk7CisgIENBTExfU1VCVEVTVCAvKl80Ki8gKHRlc3ROaXN0Q2h3aXJ1dDIoKSk7CiAKLSAgICAvLyBOSVNUIHRlc3RzLCBsZXZlbCBvZiBkaWZmaWN1bHR5ID0gIkF2ZXJhZ2UiCi0gICAgQ0FMTF9TVUJURVNULypfNSovKHRlc3ROaXN0SGFobjEoKSk7Ci0gICAgQ0FMTF9TVUJURVNULypfNiovKHRlc3ROaXN0TWlzcmExZCgpKTsKLSAgICBDQUxMX1NVQlRFU1QvKl83Ki8odGVzdE5pc3RNR0gxNygpKTsKLSAgICBDQUxMX1NVQlRFU1QvKl84Ki8odGVzdE5pc3RMYW5jem9zMSgpKTsKKyAgLy8gTklTVCB0ZXN0cywgbGV2ZWwgb2YgZGlmZmljdWx0eSA9ICJBdmVyYWdlIgorICBDQUxMX1NVQlRFU1QgLypfNSovICh0ZXN0TmlzdEhhaG4xKCkpOworICBDQUxMX1NVQlRFU1QgLypfNiovICh0ZXN0TmlzdE1pc3JhMWQoKSk7CisgIENBTExfU1VCVEVTVCAvKl83Ki8gKHRlc3ROaXN0TUdIMTcoKSk7CisgIENBTExfU1VCVEVTVCAvKl84Ki8gKHRlc3ROaXN0TGFuY3pvczEoKSk7CiAKLS8vICAgICAvLyBOSVNUIHRlc3RzLCBsZXZlbCBvZiBkaWZmaWN1bHR5ID0gIkhpZ2hlciIKLSAgICBDQUxMX1NVQlRFU1QvKl85Ki8odGVzdE5pc3RSYXQ0MigpKTsKLS8vICAgICBDQUxMX1NVQlRFU1QvKl8xMCovKHRlc3ROaXN0TUdIMTAoKSk7Ci0gICAgQ0FMTF9TVUJURVNULypfMTEqLyh0ZXN0TmlzdEJveEJPRCgpKTsKLS8vICAgICBDQUxMX1NVQlRFU1QvKl8xMiovKHRlc3ROaXN0TUdIMDkoKSk7Ci0gICAgQ0FMTF9TVUJURVNULypfMTMqLyh0ZXN0TmlzdEJlbm5ldHQ1KCkpOwotICAgIENBTExfU1VCVEVTVC8qXzE0Ki8odGVzdE5pc3RUaHVyYmVyKCkpOwotICAgIENBTExfU1VCVEVTVC8qXzE1Ki8odGVzdE5pc3RSYXQ0MygpKTsKLSAgICBDQUxMX1NVQlRFU1QvKl8xNiovKHRlc3ROaXN0RWNrZXJsZTQoKSk7CisgIC8vICAgICAvLyBOSVNUIHRlc3RzLCBsZXZlbCBvZiBkaWZmaWN1bHR5ID0gIkhpZ2hlciIKKyAgQ0FMTF9TVUJURVNUIC8qXzkqLyAodGVzdE5pc3RSYXQ0MigpKTsKKyAgLy8gICAgIENBTExfU1VCVEVTVC8qXzEwKi8odGVzdE5pc3RNR0gxMCgpKTsKKyAgQ0FMTF9TVUJURVNUIC8qXzExKi8gKHRlc3ROaXN0Qm94Qk9EKCkpOworICAvLyAgICAgQ0FMTF9TVUJURVNULypfMTIqLyh0ZXN0TmlzdE1HSDA5KCkpOworICBDQUxMX1NVQlRFU1QgLypfMTMqLyAodGVzdE5pc3RCZW5uZXR0NSgpKTsKKyAgQ0FMTF9TVUJURVNUIC8qXzE0Ki8gKHRlc3ROaXN0VGh1cmJlcigpKTsKKyAgQ0FMTF9TVUJURVNUIC8qXzE1Ki8gKHRlc3ROaXN0UmF0NDMoKSk7CisgIENBTExfU1VCVEVTVCAvKl8xNiovICh0ZXN0TmlzdEVja2VybGU0KCkpOwogfQogCiAvKgpAQCAtMTg4MCw0ICsxODc3LDMgQEAKICAgc3RkOjpjb3V0IDw8IHhbMl0gPDwgc3RkOjplbmRsOwogICBzdGQ6OmNvdXQgPDwgeFszXSA8PCBzdGQ6OmVuZGw7CiAqLwotCmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L051bWVyaWNhbERpZmYuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9OdW1lcmljYWxEaWZmLmNwcAppbmRleCA5NmU3ZjE5Li41NDNmMzRmIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L051bWVyaWNhbERpZmYuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvTnVtZXJpY2FsRGlmZi5jcHAKQEAgLTcsMTA4ICs3LDk2IEBACiAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vTnVtZXJpY2FsRGlmZj4KLSAgICAKKwogLy8gR2VuZXJpYyBmdW5jdG9yCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJfLCBpbnQgTlg9RHluYW1pYywgaW50IE5ZPUR5bmFtaWM+Ci1zdHJ1Y3QgRnVuY3RvcgotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcl8sIGludCBOWCA9IER5bmFtaWMsIGludCBOWSA9IER5bmFtaWM+CitzdHJ1Y3QgRnVuY3RvciB7CiAgIHR5cGVkZWYgU2NhbGFyXyBTY2FsYXI7Ci0gIGVudW0gewotICAgIElucHV0c0F0Q29tcGlsZVRpbWUgPSBOWCwKLSAgICBWYWx1ZXNBdENvbXBpbGVUaW1lID0gTlkKLSAgfTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLElucHV0c0F0Q29tcGlsZVRpbWUsMT4gSW5wdXRUeXBlOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsVmFsdWVzQXRDb21waWxlVGltZSwxPiBWYWx1ZVR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixWYWx1ZXNBdENvbXBpbGVUaW1lLElucHV0c0F0Q29tcGlsZVRpbWU+IEphY29iaWFuVHlwZTsKLSAgCisgIGVudW0geyBJbnB1dHNBdENvbXBpbGVUaW1lID0gTlgsIFZhbHVlc0F0Q29tcGlsZVRpbWUgPSBOWSB9OworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIElucHV0c0F0Q29tcGlsZVRpbWUsIDE+IElucHV0VHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBWYWx1ZXNBdENvbXBpbGVUaW1lLCAxPiBWYWx1ZVR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgVmFsdWVzQXRDb21waWxlVGltZSwgSW5wdXRzQXRDb21waWxlVGltZT4gSmFjb2JpYW5UeXBlOworCiAgIGludCBtX2lucHV0cywgbV92YWx1ZXM7Ci0gIAorCiAgIEZ1bmN0b3IoKSA6IG1faW5wdXRzKElucHV0c0F0Q29tcGlsZVRpbWUpLCBtX3ZhbHVlcyhWYWx1ZXNBdENvbXBpbGVUaW1lKSB7fQogICBGdW5jdG9yKGludCBpbnB1dHNfLCBpbnQgdmFsdWVzXykgOiBtX2lucHV0cyhpbnB1dHNfKSwgbV92YWx1ZXModmFsdWVzXykge30KLSAgCisKICAgaW50IGlucHV0cygpIGNvbnN0IHsgcmV0dXJuIG1faW5wdXRzOyB9CiAgIGludCB2YWx1ZXMoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlczsgfQotCiB9OwogCi1zdHJ1Y3QgbXlfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPgotewotICAgIG15X2Z1bmN0b3Iodm9pZCk6IEZ1bmN0b3I8ZG91YmxlPigzLDE1KSB7fQotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykgY29uc3QKLSAgICB7Ci0gICAgICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzOwotICAgICAgICBkb3VibGUgeVsxNV0gPSB7MS40ZS0xLCAxLjhlLTEsIDIuMmUtMSwgMi41ZS0xLCAyLjllLTEsIDMuMmUtMSwgMy41ZS0xLAotICAgICAgICAgICAgMy45ZS0xLCAzLjdlLTEsIDUuOGUtMSwgNy4zZS0xLCA5LjZlLTEsIDEuMzQsIDIuMSwgNC4zOX07CitzdHJ1Y3QgbXlfZnVuY3RvciA6IEZ1bmN0b3I8ZG91YmxlPiB7CisgIG15X2Z1bmN0b3Iodm9pZCkgOiBGdW5jdG9yPGRvdWJsZT4oMywgMTUpIHt9CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykgY29uc3QgeworICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzOworICAgIGRvdWJsZSB5WzE1XSA9IHsxLjRlLTEsIDEuOGUtMSwgMi4yZS0xLCAyLjVlLTEsIDIuOWUtMSwgMy4yZS0xLCAzLjVlLTEsIDMuOWUtMSwKKyAgICAgICAgICAgICAgICAgICAgMy43ZS0xLCA1LjhlLTEsIDcuM2UtMSwgOS42ZS0xLCAxLjM0LCAgIDIuMSwgICAgNC4zOX07CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAxID0gaSsxOwotICAgICAgICAgICAgdG1wMiA9IDE2IC0gaSAtIDE7Ci0gICAgICAgICAgICB0bXAzID0gKGk+PTgpPyB0bXAyIDogdG1wMTsKLSAgICAgICAgICAgIGZ2ZWNbaV0gPSB5W2ldIC0gKHhbMF0gKyB0bXAxLyh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcygpOyBpKyspIHsKKyAgICAgIHRtcDEgPSBpICsgMTsKKyAgICAgIHRtcDIgPSAxNiAtIGkgLSAxOworICAgICAgdG1wMyA9IChpID49IDgpID8gdG1wMiA6IHRtcDE7CisgICAgICBmdmVjW2ldID0geVtpXSAtICh4WzBdICsgdG1wMSAvICh4WzFdICogdG1wMiArIHhbMl0gKiB0bXAzKSk7CiAgICAgfQorICAgIHJldHVybiAwOworICB9CiAKLSAgICBpbnQgYWN0dWFsX2RmKGNvbnN0IFZlY3RvclhkICZ4LCBNYXRyaXhYZCAmZmphYykgY29uc3QKLSAgICB7Ci0gICAgICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcygpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDEgPSBpKzE7Ci0gICAgICAgICAgICB0bXAyID0gMTYgLSBpIC0gMTsKLSAgICAgICAgICAgIHRtcDMgPSAoaT49OCk/IHRtcDIgOiB0bXAxOwotICAgICAgICAgICAgdG1wNCA9ICh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpOyB0bXA0ID0gdG1wNCp0bXA0OwotICAgICAgICAgICAgZmphYyhpLDApID0gLTE7Ci0gICAgICAgICAgICBmamFjKGksMSkgPSB0bXAxKnRtcDIvdG1wNDsKLSAgICAgICAgICAgIGZqYWMoaSwyKSA9IHRtcDEqdG1wMy90bXA0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICBpbnQgYWN0dWFsX2RmKGNvbnN0IFZlY3RvclhkICZ4LCBNYXRyaXhYZCAmZmphYykgY29uc3QgeworICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzKCk7IGkrKykgeworICAgICAgdG1wMSA9IGkgKyAxOworICAgICAgdG1wMiA9IDE2IC0gaSAtIDE7CisgICAgICB0bXAzID0gKGkgPj0gOCkgPyB0bXAyIDogdG1wMTsKKyAgICAgIHRtcDQgPSAoeFsxXSAqIHRtcDIgKyB4WzJdICogdG1wMyk7CisgICAgICB0bXA0ID0gdG1wNCAqIHRtcDQ7CisgICAgICBmamFjKGksIDApID0gLTE7CisgICAgICBmamFjKGksIDEpID0gdG1wMSAqIHRtcDIgLyB0bXA0OworICAgICAgZmphYyhpLCAyKSA9IHRtcDEgKiB0bXAzIC8gdG1wNDsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIH07CiAKLXZvaWQgdGVzdF9mb3J3YXJkKCkKLXsKLSAgICBWZWN0b3JYZCB4KDMpOwotICAgIE1hdHJpeFhkIGphYygxNSwzKTsKLSAgICBNYXRyaXhYZCBhY3R1YWxfamFjKDE1LDMpOwotICAgIG15X2Z1bmN0b3IgZnVuY3RvcjsKK3ZvaWQgdGVzdF9mb3J3YXJkKCkgeworICBWZWN0b3JYZCB4KDMpOworICBNYXRyaXhYZCBqYWMoMTUsIDMpOworICBNYXRyaXhYZCBhY3R1YWxfamFjKDE1LCAzKTsKKyAgbXlfZnVuY3RvciBmdW5jdG9yOwogCi0gICAgeCA8PCAwLjA4MiwgMS4xMywgMi4zNTsKKyAgeCA8PCAwLjA4MiwgMS4xMywgMi4zNTsKIAotICAgIC8vIHJlYWwgb25lIAotICAgIGZ1bmN0b3IuYWN0dWFsX2RmKHgsIGFjdHVhbF9qYWMpOwotLy8gICAgc3RkOjpjb3V0IDw8IGFjdHVhbF9qYWMgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgLy8gcmVhbCBvbmUKKyAgZnVuY3Rvci5hY3R1YWxfZGYoeCwgYWN0dWFsX2phYyk7CisgIC8vICAgIHN0ZDo6Y291dCA8PCBhY3R1YWxfamFjIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CiAKLSAgICAvLyB1c2luZyBOdW1lcmljYWxEaWZmCi0gICAgTnVtZXJpY2FsRGlmZjxteV9mdW5jdG9yPiBudW1EaWZmKGZ1bmN0b3IpOwotICAgIG51bURpZmYuZGYoeCwgamFjKTsKLS8vICAgIHN0ZDo6Y291dCA8PCBqYWMgPDwgc3RkOjplbmRsOworICAvLyB1c2luZyBOdW1lcmljYWxEaWZmCisgIE51bWVyaWNhbERpZmY8bXlfZnVuY3Rvcj4gbnVtRGlmZihmdW5jdG9yKTsKKyAgbnVtRGlmZi5kZih4LCBqYWMpOworICAvLyAgICBzdGQ6OmNvdXQgPDwgamFjIDw8IHN0ZDo6ZW5kbDsKIAotICAgIFZFUklGWV9JU19BUFBST1goamFjLCBhY3R1YWxfamFjKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChqYWMsIGFjdHVhbF9qYWMpOwogfQogCi12b2lkIHRlc3RfY2VudHJhbCgpCi17Ci0gICAgVmVjdG9yWGQgeCgzKTsKLSAgICBNYXRyaXhYZCBqYWMoMTUsMyk7Ci0gICAgTWF0cml4WGQgYWN0dWFsX2phYygxNSwzKTsKLSAgICBteV9mdW5jdG9yIGZ1bmN0b3I7Cit2b2lkIHRlc3RfY2VudHJhbCgpIHsKKyAgVmVjdG9yWGQgeCgzKTsKKyAgTWF0cml4WGQgamFjKDE1LCAzKTsKKyAgTWF0cml4WGQgYWN0dWFsX2phYygxNSwgMyk7CisgIG15X2Z1bmN0b3IgZnVuY3RvcjsKIAotICAgIHggPDwgMC4wODIsIDEuMTMsIDIuMzU7CisgIHggPDwgMC4wODIsIDEuMTMsIDIuMzU7CiAKLSAgICAvLyByZWFsIG9uZSAKLSAgICBmdW5jdG9yLmFjdHVhbF9kZih4LCBhY3R1YWxfamFjKTsKKyAgLy8gcmVhbCBvbmUKKyAgZnVuY3Rvci5hY3R1YWxfZGYoeCwgYWN0dWFsX2phYyk7CiAKLSAgICAvLyB1c2luZyBOdW1lcmljYWxEaWZmCi0gICAgTnVtZXJpY2FsRGlmZjxteV9mdW5jdG9yLENlbnRyYWw+IG51bURpZmYoZnVuY3Rvcik7Ci0gICAgbnVtRGlmZi5kZih4LCBqYWMpOworICAvLyB1c2luZyBOdW1lcmljYWxEaWZmCisgIE51bWVyaWNhbERpZmY8bXlfZnVuY3RvciwgQ2VudHJhbD4gbnVtRGlmZihmdW5jdG9yKTsKKyAgbnVtRGlmZi5kZih4LCBqYWMpOwogCi0gICAgVkVSSUZZX0lTX0FQUFJPWChqYWMsIGFjdHVhbF9qYWMpOworICBWRVJJRllfSVNfQVBQUk9YKGphYywgYWN0dWFsX2phYyk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChOdW1lcmljYWxEaWZmKQotewotICAgIENBTExfU1VCVEVTVCh0ZXN0X2ZvcndhcmQoKSk7Ci0gICAgQ0FMTF9TVUJURVNUKHRlc3RfY2VudHJhbCgpKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChOdW1lcmljYWxEaWZmKSB7CisgIENBTExfU1VCVEVTVCh0ZXN0X2ZvcndhcmQoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2NlbnRyYWwoKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2FsaWduZWR2ZWN0b3IzLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvYWxpZ25lZHZlY3RvcjMuY3BwCmluZGV4IDFmYzZkNjIuLjgzOGVhZWEgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvYWxpZ25lZHZlY3RvcjMuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvYWxpZ25lZHZlY3RvcjMuY3BwCkBAIC0xNCw3NiArMTQsNzMgQEAKIAogbmFtZXNwYWNlIEVpZ2VuIHsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVCx0eXBlbmFtZSBEZXJpdmVkPgotVCB0ZXN0X3JlbGF0aXZlX2Vycm9yKGNvbnN0IEFsaWduZWRWZWN0b3IzPFQ+ICZhLCBjb25zdCBNYXRyaXhCYXNlPERlcml2ZWQ+ICZiKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERlcml2ZWQ+CitUIHRlc3RfcmVsYXRpdmVfZXJyb3IoY29uc3QgQWxpZ25lZFZlY3RvcjM8VD4gJmEsIGNvbnN0IE1hdHJpeEJhc2U8RGVyaXZlZD4gJmIpIHsKICAgcmV0dXJuIHRlc3RfcmVsYXRpdmVfZXJyb3IoYS5jb2VmZnMoKS50ZW1wbGF0ZSBoZWFkPDM+KCksIGIpOwogfQogCi19Cit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyPgotdm9pZCBhbGlnbmVkdmVjdG9yMygpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBhbGlnbmVkdmVjdG9yMygpIHsKICAgU2NhbGFyIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAgIFNjYWxhciBzMiA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywxPiBSZWZUeXBlOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsMywzPiBNYXQzMzsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAzLCAxPiBSZWZUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIDMsIDM+IE1hdDMzOwogICB0eXBlZGVmIEFsaWduZWRWZWN0b3IzPFNjYWxhcj4gRmFzdFR5cGU7Ci0gIFJlZlR5cGUgIHIxKFJlZlR5cGU6OlJhbmRvbSgpKSwgcjIoUmVmVHlwZTo6UmFuZG9tKCkpLCByMyhSZWZUeXBlOjpSYW5kb20oKSksCi0gICAgICAgICAgIHI0KFJlZlR5cGU6OlJhbmRvbSgpKSwgcjUoUmVmVHlwZTo6UmFuZG9tKCkpOworICBSZWZUeXBlIHIxKFJlZlR5cGU6OlJhbmRvbSgpKSwgcjIoUmVmVHlwZTo6UmFuZG9tKCkpLCByMyhSZWZUeXBlOjpSYW5kb20oKSksIHI0KFJlZlR5cGU6OlJhbmRvbSgpKSwKKyAgICAgIHI1KFJlZlR5cGU6OlJhbmRvbSgpKTsKICAgRmFzdFR5cGUgZjEocjEpLCBmMihyMiksIGYzKHIzKSwgZjQocjQpLCBmNShyNSk7CiAgIE1hdDMzIG0xKE1hdDMzOjpSYW5kb20oKSk7Ci0gIAotICBWRVJJRllfSVNfQVBQUk9YKGYxLHIxKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChmNCxyNCk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChmNCtmMSxyNCtyMSk7Ci0gIFZFUklGWV9JU19BUFBST1goZjQtZjEscjQtcjEpOwotICBWRVJJRllfSVNfQVBQUk9YKGY0K2YxLWYyLHI0K3IxLXIyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChmNCs9ZjMscjQrPXIzKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChmNC09ZjUscjQtPXI1KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChmNC09ZjUrZjEscjQtPXI1K3IxKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChmNStmMS1zMSpmMixyNStyMS1zMSpyMik7Ci0gIFZFUklGWV9JU19BUFBST1goZjUrZjEvczItczEqZjIscjUrcjEvczItczEqcjIpOwotICAKLSAgVkVSSUZZX0lTX0FQUFJPWChtMSpmNCxtMSpyNCk7Ci0gIFZFUklGWV9JU19BUFBST1goZjQudHJhbnNwb3NlKCkqbTEscjQudHJhbnNwb3NlKCkqbTEpOwotICAKLSAgVkVSSUZZX0lTX0FQUFJPWChmMi5kb3QoZjMpLHIyLmRvdChyMykpOwotICBWRVJJRllfSVNfQVBQUk9YKGYyLmNyb3NzKGYzKSxyMi5jcm9zcyhyMykpOwotICBWRVJJRllfSVNfQVBQUk9YKGYyLm5vcm0oKSxyMi5ub3JtKCkpOworICBWRVJJRllfSVNfQVBQUk9YKGYxLCByMSk7CisgIFZFUklGWV9JU19BUFBST1goZjQsIHI0KTsKIAotICBWRVJJRllfSVNfQVBQUk9YKGYyLm5vcm1hbGl6ZWQoKSxyMi5ub3JtYWxpemVkKCkpOworICBWRVJJRllfSVNfQVBQUk9YKGY0ICsgZjEsIHI0ICsgcjEpOworICBWRVJJRllfSVNfQVBQUk9YKGY0IC0gZjEsIHI0IC0gcjEpOworICBWRVJJRllfSVNfQVBQUk9YKGY0ICsgZjEgLSBmMiwgcjQgKyByMSAtIHIyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmNCArPSBmMywgcjQgKz0gcjMpOworICBWRVJJRllfSVNfQVBQUk9YKGY0IC09IGY1LCByNCAtPSByNSk7CisgIFZFUklGWV9JU19BUFBST1goZjQgLT0gZjUgKyBmMSwgcjQgLT0gcjUgKyByMSk7CisgIFZFUklGWV9JU19BUFBST1goZjUgKyBmMSAtIHMxICogZjIsIHI1ICsgcjEgLSBzMSAqIHIyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmNSArIGYxIC8gczIgLSBzMSAqIGYyLCByNSArIHIxIC8gczIgLSBzMSAqIHIyKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKChmMitmMSkubm9ybWFsaXplZCgpLChyMityMSkubm9ybWFsaXplZCgpKTsKLSAgCisgIFZFUklGWV9JU19BUFBST1gobTEgKiBmNCwgbTEgKiByNCk7CisgIFZFUklGWV9JU19BUFBST1goZjQudHJhbnNwb3NlKCkgKiBtMSwgcjQudHJhbnNwb3NlKCkgKiBtMSk7CisKKyAgVkVSSUZZX0lTX0FQUFJPWChmMi5kb3QoZjMpLCByMi5kb3QocjMpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChmMi5jcm9zcyhmMyksIHIyLmNyb3NzKHIzKSk7CisgIFZFUklGWV9JU19BUFBST1goZjIubm9ybSgpLCByMi5ub3JtKCkpOworCisgIFZFUklGWV9JU19BUFBST1goZjIubm9ybWFsaXplZCgpLCByMi5ub3JtYWxpemVkKCkpOworCisgIFZFUklGWV9JU19BUFBST1goKGYyICsgZjEpLm5vcm1hbGl6ZWQoKSwgKHIyICsgcjEpLm5vcm1hbGl6ZWQoKSk7CisKICAgZjIubm9ybWFsaXplKCk7CiAgIHIyLm5vcm1hbGl6ZSgpOwotICBWRVJJRllfSVNfQVBQUk9YKGYyLHIyKTsKLSAgCisgIFZFUklGWV9JU19BUFBST1goZjIsIHIyKTsKKwogICB7CiAgICAgRmFzdFR5cGUgZjYgPSBSZWZUeXBlOjpaZXJvKCk7CiAgICAgRmFzdFR5cGUgZjcgPSBGYXN0VHlwZTo6WmVybygpOwotICAgIFZFUklGWV9JU19BUFBST1goZjYsZjcpOwotICAgIGY2ID0gcjQrcjE7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChmNixyNCtyMSk7Ci0gICAgZjYgLT0gU2NhbGFyKDIpKnI0OwotICAgIFZFUklGWV9JU19BUFBST1goZjYscjEtcjQpOworICAgIFZFUklGWV9JU19BUFBST1goZjYsIGY3KTsKKyAgICBmNiA9IHI0ICsgcjE7CisgICAgVkVSSUZZX0lTX0FQUFJPWChmNiwgcjQgKyByMSk7CisgICAgZjYgLT0gU2NhbGFyKDIpICogcjQ7CisgICAgVkVSSUZZX0lTX0FQUFJPWChmNiwgcjEgLSByNCk7CiAgIH0KLSAgCi0gIEZhc3RUeXBlIGY4LCBmOSgwLDAsMCk7Ci0gIFZFUklGWV9JU19BUFBST1goZjktZjEsLWYxKTsKKworICBGYXN0VHlwZSBmOCwgZjkoMCwgMCwgMCk7CisgIFZFUklGWV9JU19BUFBST1goZjkgLSBmMSwgLWYxKTsKIAogICBzdGQ6OnN0cmluZ3N0cmVhbSBzczEsIHNzMjsKICAgc3MxIDw8IGYxOwogICBzczIgPDwgcjE7Ci0gIFZFUklGWShzczEuc3RyKCk9PXNzMi5zdHIoKSk7CisgIFZFUklGWShzczEuc3RyKCkgPT0gc3MyLnN0cigpKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGFsaWduZWR2ZWN0b3IzKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIENBTExfU1VCVEVTVCggYWxpZ25lZHZlY3RvcjM8ZmxvYXQ+KCkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChhbGlnbmVkdmVjdG9yMykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1QoYWxpZ25lZHZlY3RvcjM8ZmxvYXQ+KCkpOwogICB9CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2F1dG9kaWZmLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvYXV0b2RpZmYuY3BwCmluZGV4IDBhZGRmMmMuLjllYTRlN2QgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvYXV0b2RpZmYuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvYXV0b2RpZmYuY3BwCkBAIC0xMCwzNiArMTAsMzEgQEAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQXV0b0RpZmY+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KLUVJR0VOX0RPTlRfSU5MSU5FIFNjYWxhciBmb28oY29uc3QgU2NhbGFyJiB4LCBjb25zdCBTY2FsYXImIHkpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgorRUlHRU5fRE9OVF9JTkxJTkUgU2NhbGFyIGZvbyhjb25zdCBTY2FsYXImIHgsIGNvbnN0IFNjYWxhciYgeSkgewogICB1c2luZyBuYW1lc3BhY2Ugc3RkOwotLy8gICByZXR1cm4geCtzdGQ6OnNpbih5KTsKKyAgLy8gICByZXR1cm4geCtzdGQ6OnNpbih5KTsKICAgRUlHRU5fQVNNX0NPTU1FTlQoIm15YmVnaW4iKTsKICAgLy8gcG93KGZsb2F0LCBpbnQpIHByb21vdGVzIHRvIHBvdyhkb3VibGUsIGRvdWJsZSkKLSAgcmV0dXJuIHgqMiAtIDEgKyBzdGF0aWNfY2FzdDxTY2FsYXI+KHBvdygxK3gsMikpICsgMipzcXJ0KHkqeSswKSAtIDQgKiBzaW4oMCt4KSArIDIgKiBjb3MoeSswKSAtIGV4cChTY2FsYXIoLTAuNSkqeCp4KzApOwotICAvL3JldHVybiB4KzIqeSp4Oy8veCoyIC1zdGQ6OnBvdyh4LDIpOy8vKDIqeS94KTsvLyAtIHkqMjsKKyAgcmV0dXJuIHggKiAyIC0gMSArIHN0YXRpY19jYXN0PFNjYWxhcj4ocG93KDEgKyB4LCAyKSkgKyAyICogc3FydCh5ICogeSArIDApIC0gNCAqIHNpbigwICsgeCkgKyAyICogY29zKHkgKyAwKSAtCisgICAgICAgICBleHAoU2NhbGFyKC0wLjUpICogeCAqIHggKyAwKTsKKyAgLy8gcmV0dXJuIHgrMip5Kng7Ly94KjIgLXN0ZDo6cG93KHgsMik7Ly8oMip5L3gpOy8vIC0geSoyOwogICBFSUdFTl9BU01fQ09NTUVOVCgibXllbmQiKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVmVjdG9yPgotRUlHRU5fRE9OVF9JTkxJTkUgdHlwZW5hbWUgVmVjdG9yOjpTY2FsYXIgZm9vKGNvbnN0IFZlY3RvciYgcCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBWZWN0b3I+CitFSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBWZWN0b3I6OlNjYWxhciBmb28oY29uc3QgVmVjdG9yJiBwKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVmVjdG9yOjpTY2FsYXIgU2NhbGFyOwotICByZXR1cm4gKHAtVmVjdG9yKFNjYWxhcigtMSksU2NhbGFyKDEuKSkpLm5vcm0oKSArIChwLmFycmF5KCkgKiBwLmFycmF5KCkpLnN1bSgpICsgcC5kb3QocCk7CisgIHJldHVybiAocCAtIFZlY3RvcihTY2FsYXIoLTEpLCBTY2FsYXIoMS4pKSkubm9ybSgpICsgKHAuYXJyYXkoKSAqIHAuYXJyYXkoKSkuc3VtKCkgKyBwLmRvdChwKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyXywgaW50IE5YPUR5bmFtaWMsIGludCBOWT1EeW5hbWljPgotc3RydWN0IFRlc3RGdW5jMQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcl8sIGludCBOWCA9IER5bmFtaWMsIGludCBOWSA9IER5bmFtaWM+CitzdHJ1Y3QgVGVzdEZ1bmMxIHsKICAgdHlwZWRlZiBTY2FsYXJfIFNjYWxhcjsKLSAgZW51bSB7Ci0gICAgSW5wdXRzQXRDb21waWxlVGltZSA9IE5YLAotICAgIFZhbHVlc0F0Q29tcGlsZVRpbWUgPSBOWQotICB9OwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsSW5wdXRzQXRDb21waWxlVGltZSwxPiBJbnB1dFR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixWYWx1ZXNBdENvbXBpbGVUaW1lLDE+IFZhbHVlVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLFZhbHVlc0F0Q29tcGlsZVRpbWUsSW5wdXRzQXRDb21waWxlVGltZT4gSmFjb2JpYW5UeXBlOworICBlbnVtIHsgSW5wdXRzQXRDb21waWxlVGltZSA9IE5YLCBWYWx1ZXNBdENvbXBpbGVUaW1lID0gTlkgfTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBJbnB1dHNBdENvbXBpbGVUaW1lLCAxPiBJbnB1dFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgVmFsdWVzQXRDb21waWxlVGltZSwgMT4gVmFsdWVUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFZhbHVlc0F0Q29tcGlsZVRpbWUsIElucHV0c0F0Q29tcGlsZVRpbWU+IEphY29iaWFuVHlwZTsKIAogICBpbnQgbV9pbnB1dHMsIG1fdmFsdWVzOwogCkBAIC00OSwxODYgKzQ0LDE2OCBAQAogICBpbnQgaW5wdXRzKCkgY29uc3QgeyByZXR1cm4gbV9pbnB1dHM7IH0KICAgaW50IHZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgdm9pZCBvcGVyYXRvcigpIChjb25zdCBNYXRyaXg8VCxJbnB1dHNBdENvbXBpbGVUaW1lLDE+JiB4LCBNYXRyaXg8VCxWYWx1ZXNBdENvbXBpbGVUaW1lLDE+KiBfdikgY29uc3QKLSAgewotICAgIE1hdHJpeDxULFZhbHVlc0F0Q29tcGlsZVRpbWUsMT4mIHYgPSAqX3Y7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgTWF0cml4PFQsIElucHV0c0F0Q29tcGlsZVRpbWUsIDE+JiB4LCBNYXRyaXg8VCwgVmFsdWVzQXRDb21waWxlVGltZSwgMT4qIF92KSBjb25zdCB7CisgICAgTWF0cml4PFQsIFZhbHVlc0F0Q29tcGlsZVRpbWUsIDE+JiB2ID0gKl92OwogCiAgICAgdlswXSA9IDIgKiB4WzBdICogeFswXSArIHhbMF0gKiB4WzFdOwogICAgIHZbMV0gPSAzICogeFsxXSAqIHhbMF0gKyAwLjUgKiB4WzFdICogeFsxXTsKLSAgICBpZihpbnB1dHMoKT4yKQotICAgIHsKKyAgICBpZiAoaW5wdXRzKCkgPiAyKSB7CiAgICAgICB2WzBdICs9IDAuNSAqIHhbMl07CiAgICAgICB2WzFdICs9IHhbMl07CiAgICAgfQotICAgIGlmKHZhbHVlcygpPjIpCi0gICAgeworICAgIGlmICh2YWx1ZXMoKSA+IDIpIHsKICAgICAgIHZbMl0gPSAzICogeFsxXSAqIHhbMF0gKiB4WzBdOwogICAgIH0KLSAgICBpZiAoaW5wdXRzKCk+MiAmJiB2YWx1ZXMoKT4yKQotICAgICAgdlsyXSAqPSB4WzJdOworICAgIGlmIChpbnB1dHMoKSA+IDIgJiYgdmFsdWVzKCkgPiAyKSB2WzJdICo9IHhbMl07CiAgIH0KIAotICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IElucHV0VHlwZSYgeCwgVmFsdWVUeXBlKiB2LCBKYWNvYmlhblR5cGUqIF9qKSBjb25zdAotICB7CisgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBJbnB1dFR5cGUmIHgsIFZhbHVlVHlwZSogdiwgSmFjb2JpYW5UeXBlKiBfaikgY29uc3QgewogICAgICgqdGhpcykoeCwgdik7CiAKLSAgICBpZihfaikKLSAgICB7CisgICAgaWYgKF9qKSB7CiAgICAgICBKYWNvYmlhblR5cGUmIGogPSAqX2o7CiAKLSAgICAgIGooMCwwKSA9IDQgKiB4WzBdICsgeFsxXTsKLSAgICAgIGooMSwwKSA9IDMgKiB4WzFdOworICAgICAgaigwLCAwKSA9IDQgKiB4WzBdICsgeFsxXTsKKyAgICAgIGooMSwgMCkgPSAzICogeFsxXTsKIAotICAgICAgaigwLDEpID0geFswXTsKLSAgICAgIGooMSwxKSA9IDMgKiB4WzBdICsgMiAqIDAuNSAqIHhbMV07CisgICAgICBqKDAsIDEpID0geFswXTsKKyAgICAgIGooMSwgMSkgPSAzICogeFswXSArIDIgKiAwLjUgKiB4WzFdOwogCi0gICAgICBpZiAoaW5wdXRzKCk+MikKLSAgICAgIHsKLSAgICAgICAgaigwLDIpID0gMC41OwotICAgICAgICBqKDEsMikgPSAxOworICAgICAgaWYgKGlucHV0cygpID4gMikgeworICAgICAgICBqKDAsIDIpID0gMC41OworICAgICAgICBqKDEsIDIpID0gMTsKICAgICAgIH0KLSAgICAgIGlmKHZhbHVlcygpPjIpCi0gICAgICB7Ci0gICAgICAgIGooMiwwKSA9IDMgKiB4WzFdICogMiAqIHhbMF07Ci0gICAgICAgIGooMiwxKSA9IDMgKiB4WzBdICogeFswXTsKKyAgICAgIGlmICh2YWx1ZXMoKSA+IDIpIHsKKyAgICAgICAgaigyLCAwKSA9IDMgKiB4WzFdICogMiAqIHhbMF07CisgICAgICAgIGooMiwgMSkgPSAzICogeFswXSAqIHhbMF07CiAgICAgICB9Ci0gICAgICBpZiAoaW5wdXRzKCk+MiAmJiB2YWx1ZXMoKT4yKQotICAgICAgewotICAgICAgICBqKDIsMCkgKj0geFsyXTsKLSAgICAgICAgaigyLDEpICo9IHhbMl07CisgICAgICBpZiAoaW5wdXRzKCkgPiAyICYmIHZhbHVlcygpID4gMikgeworICAgICAgICBqKDIsIDApICo9IHhbMl07CisgICAgICAgIGooMiwgMSkgKj0geFsyXTsKIAotICAgICAgICBqKDIsMikgPSAzICogeFsxXSAqIHhbMF0gKiB4WzBdOwotICAgICAgICBqKDIsMikgPSAzICogeFsxXSAqIHhbMF0gKiB4WzBdOworICAgICAgICBqKDIsIDIpID0gMyAqIHhbMV0gKiB4WzBdICogeFswXTsKKyAgICAgICAgaigyLCAyKSA9IDMgKiB4WzFdICogeFswXSAqIHhbMF07CiAgICAgICB9CiAgICAgfQogICB9CiB9OwogCi0KIC8qIFRlc3QgZnVuY3RvciBmb3IgdGhlIEMrKzExIGZlYXR1cmVzLiAqLwogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KLXN0cnVjdCBpbnRlZ3JhdG9yRnVuY3RvcgotewotICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMiwgMT4gSW5wdXRUeXBlOwotICAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMiwgMT4gVmFsdWVUeXBlOworc3RydWN0IGludGVncmF0b3JGdW5jdG9yIHsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAyLCAxPiBJbnB1dFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMiwgMT4gVmFsdWVUeXBlOwogCi0gICAgLyoKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBzdGFydHMgaGVyZS4KLSAgICAgKi8KLSAgICBpbnRlZ3JhdG9yRnVuY3Rvcihjb25zdCBTY2FsYXIgZ2FpbikgOiBfZ2FpbihnYWluKSB7fQotICAgIGludGVncmF0b3JGdW5jdG9yKGNvbnN0IGludGVncmF0b3JGdW5jdG9yJiBmKSA6IF9nYWluKGYuX2dhaW4pIHt9Ci0gICAgY29uc3QgU2NhbGFyIF9nYWluOworICAvKgorICAgKiBJbXBsZW1lbnRhdGlvbiBzdGFydHMgaGVyZS4KKyAgICovCisgIGludGVncmF0b3JGdW5jdG9yKGNvbnN0IFNjYWxhciBnYWluKSA6IF9nYWluKGdhaW4pIHt9CisgIGludGVncmF0b3JGdW5jdG9yKGNvbnN0IGludGVncmF0b3JGdW5jdG9yJiBmKSA6IF9nYWluKGYuX2dhaW4pIHt9CisgIGNvbnN0IFNjYWxhciBfZ2FpbjsKIAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci0gICAgdm9pZCBvcGVyYXRvcigpIChjb25zdCBUMSAmaW5wdXQsIFQyICpvdXRwdXQsIGNvbnN0IFNjYWxhciBkdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFQyICZvID0gKm91dHB1dDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFQxJiBpbnB1dCwgVDIqIG91dHB1dCwgY29uc3QgU2NhbGFyIGR0KSBjb25zdCB7CisgICAgVDImIG8gPSAqb3V0cHV0OwogCi0gICAgICAgIC8qIEludGVncmF0b3IgdG8gdGVzdCB0aGUgQUQuICovCi0gICAgICAgIG9bMF0gPSBpbnB1dFswXSArIGlucHV0WzFdICogZHQgKiBfZ2FpbjsKLSAgICAgICAgb1sxXSA9IGlucHV0WzFdICogX2dhaW47CisgICAgLyogSW50ZWdyYXRvciB0byB0ZXN0IHRoZSBBRC4gKi8KKyAgICBvWzBdID0gaW5wdXRbMF0gKyBpbnB1dFsxXSAqIGR0ICogX2dhaW47CisgICAgb1sxXSA9IGlucHV0WzFdICogX2dhaW47CisgIH0KKworICAvKiBPbmx5IG5lZWRlZCBmb3IgdGhlIHRlc3QgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CisgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBUMSYgaW5wdXQsIFQyKiBvdXRwdXQsIFQzKiBqYWNvYmlhbiwgY29uc3QgU2NhbGFyIGR0KSBjb25zdCB7CisgICAgVDImIG8gPSAqb3V0cHV0OworCisgICAgLyogSW50ZWdyYXRvciB0byB0ZXN0IHRoZSBBRC4gKi8KKyAgICBvWzBdID0gaW5wdXRbMF0gKyBpbnB1dFsxXSAqIGR0ICogX2dhaW47CisgICAgb1sxXSA9IGlucHV0WzFdICogX2dhaW47CisKKyAgICBpZiAoamFjb2JpYW4pIHsKKyAgICAgIFQzJiBqID0gKmphY29iaWFuOworCisgICAgICBqKDAsIDApID0gMTsKKyAgICAgIGooMCwgMSkgPSBkdCAqIF9nYWluOworICAgICAgaigxLCAwKSA9IDA7CisgICAgICBqKDEsIDEpID0gX2dhaW47CiAgICAgfQotCi0gICAgLyogT25seSBuZWVkZWQgZm9yIHRoZSB0ZXN0ICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+Ci0gICAgdm9pZCBvcGVyYXRvcigpIChjb25zdCBUMSAmaW5wdXQsIFQyICpvdXRwdXQsIFQzICpqYWNvYmlhbiwgY29uc3QgU2NhbGFyIGR0KSBjb25zdAotICAgIHsKLSAgICAgICAgVDIgJm8gPSAqb3V0cHV0OwotCi0gICAgICAgIC8qIEludGVncmF0b3IgdG8gdGVzdCB0aGUgQUQuICovCi0gICAgICAgIG9bMF0gPSBpbnB1dFswXSArIGlucHV0WzFdICogZHQgKiBfZ2FpbjsKLSAgICAgICAgb1sxXSA9IGlucHV0WzFdICogX2dhaW47Ci0KLSAgICAgICAgaWYgKGphY29iaWFuKQotICAgICAgICB7Ci0gICAgICAgICAgICBUMyAmaiA9ICpqYWNvYmlhbjsKLQotICAgICAgICAgICAgaigwLCAwKSA9IDE7Ci0gICAgICAgICAgICBqKDAsIDEpID0gZHQgKiBfZ2FpbjsKLSAgICAgICAgICAgIGooMSwgMCkgPSAwOwotICAgICAgICAgICAgaigxLCAxKSA9IF9nYWluOwotICAgICAgICB9Ci0gICAgfQotCisgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIEZ1bmM+IHZvaWQgZm9yd2FyZF9qYWNvYmlhbl9jcHAxMShjb25zdCBGdW5jJiBmKQotewotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuYzo6VmFsdWVUeXBlOjpTY2FsYXIgU2NhbGFyOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgRnVuYzo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmM6OklucHV0VHlwZSBJbnB1dFR5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBBdXRvRGlmZkphY29iaWFuPEZ1bmM+OjpKYWNvYmlhblR5cGUgSmFjb2JpYW5UeXBlOwordGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmM+Cit2b2lkIGZvcndhcmRfamFjb2JpYW5fY3BwMTEoY29uc3QgRnVuYyYgZikgeworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmM6OlZhbHVlVHlwZTo6U2NhbGFyIFNjYWxhcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBGdW5jOjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEZ1bmM6OklucHV0VHlwZSBJbnB1dFR5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgQXV0b0RpZmZKYWNvYmlhbjxGdW5jPjo6SmFjb2JpYW5UeXBlIEphY29iaWFuVHlwZTsKIAotICAgIElucHV0VHlwZSB4ID0gSW5wdXRUeXBlOjpSYW5kb20oSW5wdXRUeXBlOjpSb3dzQXRDb21waWxlVGltZSk7Ci0gICAgVmFsdWVUeXBlIHksIHlyZWY7Ci0gICAgSmFjb2JpYW5UeXBlIGosIGpyZWY7CisgIElucHV0VHlwZSB4ID0gSW5wdXRUeXBlOjpSYW5kb20oSW5wdXRUeXBlOjpSb3dzQXRDb21waWxlVGltZSk7CisgIFZhbHVlVHlwZSB5LCB5cmVmOworICBKYWNvYmlhblR5cGUgaiwganJlZjsKIAotICAgIGNvbnN0IFNjYWxhciBkdCA9IGludGVybmFsOjpyYW5kb208ZG91YmxlPigpOworICBjb25zdCBTY2FsYXIgZHQgPSBpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKTsKIAotICAgIGpyZWYuc2V0WmVybygpOwotICAgIHlyZWYuc2V0WmVybygpOwotICAgIGYoeCwgJnlyZWYsICZqcmVmLCBkdCk7CisgIGpyZWYuc2V0WmVybygpOworICB5cmVmLnNldFplcm8oKTsKKyAgZih4LCAmeXJlZiwgJmpyZWYsIGR0KTsKIAotICAgIC8vc3RkOjpjZXJyIDw8ICJ5LCB5cmVmLCBqcmVmOiAiIDw8ICJcbiI7Ci0gICAgLy9zdGQ6OmNlcnIgPDwgeS50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7Ci0gICAgLy9zdGQ6OmNlcnIgPDwgeXJlZiA8PCAiXG5cbiI7Ci0gICAgLy9zdGQ6OmNlcnIgPDwganJlZiA8PCAiXG5cbiI7CisgIC8vIHN0ZDo6Y2VyciA8PCAieSwgeXJlZiwganJlZjogIiA8PCAiXG4iOworICAvLyBzdGQ6OmNlcnIgPDwgeS50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7CisgIC8vIHN0ZDo6Y2VyciA8PCB5cmVmIDw8ICJcblxuIjsKKyAgLy8gc3RkOjpjZXJyIDw8IGpyZWYgPDwgIlxuXG4iOwogCi0gICAgQXV0b0RpZmZKYWNvYmlhbjxGdW5jPiBhdXRvaihmKTsKLSAgICBhdXRvaih4LCAmeSwgJmosIGR0KTsKKyAgQXV0b0RpZmZKYWNvYmlhbjxGdW5jPiBhdXRvaihmKTsKKyAgYXV0b2ooeCwgJnksICZqLCBkdCk7CiAKLSAgICAvL3N0ZDo6Y2VyciA8PCAieSBqICh2aWEgYXV0b2RpZmYpOiAiIDw8ICJcbiI7Ci0gICAgLy9zdGQ6OmNlcnIgPDwgeS50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7Ci0gICAgLy9zdGQ6OmNlcnIgPDwgaiA8PCAiXG5cbiI7CisgIC8vIHN0ZDo6Y2VyciA8PCAieSBqICh2aWEgYXV0b2RpZmYpOiAiIDw8ICJcbiI7CisgIC8vIHN0ZDo6Y2VyciA8PCB5LnRyYW5zcG9zZSgpIDw8ICJcblxuIjsKKyAgLy8gc3RkOjpjZXJyIDw8IGogPDwgIlxuXG4iOwogCi0gICAgVkVSSUZZX0lTX0FQUFJPWCh5LCB5cmVmKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGosIGpyZWYpOworICBWRVJJRllfSVNfQVBQUk9YKHksIHlyZWYpOworICBWRVJJRllfSVNfQVBQUk9YKGosIGpyZWYpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jPiB2b2lkIGZvcndhcmRfamFjb2JpYW4oY29uc3QgRnVuYyYgZikKLXsKLSAgICB0eXBlbmFtZSBGdW5jOjpJbnB1dFR5cGUgeCA9IEZ1bmM6OklucHV0VHlwZTo6UmFuZG9tKGYuaW5wdXRzKCkpOwotICAgIHR5cGVuYW1lIEZ1bmM6OlZhbHVlVHlwZSB5KGYudmFsdWVzKCkpLCB5cmVmKGYudmFsdWVzKCkpOwotICAgIHR5cGVuYW1lIEZ1bmM6OkphY29iaWFuVHlwZSBqKGYudmFsdWVzKCksZi5pbnB1dHMoKSksIGpyZWYoZi52YWx1ZXMoKSxmLmlucHV0cygpKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5jPgordm9pZCBmb3J3YXJkX2phY29iaWFuKGNvbnN0IEZ1bmMmIGYpIHsKKyAgdHlwZW5hbWUgRnVuYzo6SW5wdXRUeXBlIHggPSBGdW5jOjpJbnB1dFR5cGU6OlJhbmRvbShmLmlucHV0cygpKTsKKyAgdHlwZW5hbWUgRnVuYzo6VmFsdWVUeXBlIHkoZi52YWx1ZXMoKSksIHlyZWYoZi52YWx1ZXMoKSk7CisgIHR5cGVuYW1lIEZ1bmM6OkphY29iaWFuVHlwZSBqKGYudmFsdWVzKCksIGYuaW5wdXRzKCkpLCBqcmVmKGYudmFsdWVzKCksIGYuaW5wdXRzKCkpOwogCi0gICAganJlZi5zZXRaZXJvKCk7Ci0gICAgeXJlZi5zZXRaZXJvKCk7Ci0gICAgZih4LCZ5cmVmLCZqcmVmKTsKLS8vICAgICBzdGQ6OmNlcnIgPDwgeS50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7OwotLy8gICAgIHN0ZDo6Y2VyciA8PCBqIDw8ICJcblxuIjs7CisgIGpyZWYuc2V0WmVybygpOworICB5cmVmLnNldFplcm8oKTsKKyAgZih4LCAmeXJlZiwgJmpyZWYpOworICAvLyAgICAgc3RkOjpjZXJyIDw8IHkudHJhbnNwb3NlKCkgPDwgIlxuXG4iOzsKKyAgLy8gICAgIHN0ZDo6Y2VyciA8PCBqIDw8ICJcblxuIjs7CiAKLSAgICBqLnNldFplcm8oKTsKLSAgICB5LnNldFplcm8oKTsKLSAgICBBdXRvRGlmZkphY29iaWFuPEZ1bmM+IGF1dG9qKGYpOwotICAgIGF1dG9qKHgsICZ5LCAmaik7Ci0vLyAgICAgc3RkOjpjZXJyIDw8IHkudHJhbnNwb3NlKCkgPDwgIlxuXG4iOzsKLS8vICAgICBzdGQ6OmNlcnIgPDwgaiA8PCAiXG5cbiI7OworICBqLnNldFplcm8oKTsKKyAgeS5zZXRaZXJvKCk7CisgIEF1dG9EaWZmSmFjb2JpYW48RnVuYz4gYXV0b2ooZik7CisgIGF1dG9qKHgsICZ5LCAmaik7CisgIC8vICAgICBzdGQ6OmNlcnIgPDwgeS50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7OworICAvLyAgICAgc3RkOjpjZXJyIDw8IGogPDwgIlxuXG4iOzsKIAotICAgIFZFUklGWV9JU19BUFBST1goeSwgeXJlZik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChqLCBqcmVmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh5LCB5cmVmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChqLCBqcmVmKTsKIH0KIAogLy8gVE9ETyBhbHNvIGNoZWNrIGFjdHVhbCBkZXJpdmF0aXZlcyEKIHRlbXBsYXRlIDxpbnQ+Ci12b2lkIHRlc3RfYXV0b2RpZmZfc2NhbGFyKCkKLXsKK3ZvaWQgdGVzdF9hdXRvZGlmZl9zY2FsYXIoKSB7CiAgIFZlY3RvcjJmIHAgPSBWZWN0b3IyZjo6UmFuZG9tKCk7CiAgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8VmVjdG9yMmY+IEFEOwotICBBRCBheChwLngoKSxWZWN0b3IyZjo6VW5pdFgoKSk7Ci0gIEFEIGF5KHAueSgpLFZlY3RvcjJmOjpVbml0WSgpKTsKLSAgQUQgcmVzID0gZm9vPEFEPihheCxheSk7Ci0gIFZFUklGWV9JU19BUFBST1gocmVzLnZhbHVlKCksIGZvbyhwLngoKSxwLnkoKSkpOworICBBRCBheChwLngoKSwgVmVjdG9yMmY6OlVuaXRYKCkpOworICBBRCBheShwLnkoKSwgVmVjdG9yMmY6OlVuaXRZKCkpOworICBBRCByZXMgPSBmb288QUQ+KGF4LCBheSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzLnZhbHVlKCksIGZvbyhwLngoKSwgcC55KCkpKTsKIH0KIAotCiAvLyBUT0RPIGFsc28gY2hlY2sgYWN0dWFsIGRlcml2YXRpdmVzIQogdGVtcGxhdGUgPGludD4KLXZvaWQgdGVzdF9hdXRvZGlmZl92ZWN0b3IoKQotewordm9pZCB0ZXN0X2F1dG9kaWZmX3ZlY3RvcigpIHsKICAgVmVjdG9yMmYgcCA9IFZlY3RvcjJmOjpSYW5kb20oKTsKICAgdHlwZWRlZiBBdXRvRGlmZlNjYWxhcjxWZWN0b3IyZj4gQUQ7Ci0gIHR5cGVkZWYgTWF0cml4PEFELDIsMT4gVmVjdG9yQUQ7CisgIHR5cGVkZWYgTWF0cml4PEFELCAyLCAxPiBWZWN0b3JBRDsKICAgVmVjdG9yQUQgYXAgPSBwLmNhc3Q8QUQ+KCk7CiAgIGFwLngoKS5kZXJpdmF0aXZlcygpID0gVmVjdG9yMmY6OlVuaXRYKCk7CiAgIGFwLnkoKS5kZXJpdmF0aXZlcygpID0gVmVjdG9yMmY6OlVuaXRZKCk7CkBAIC0yMzgsNTkgKzIxNSw1NyBAQAogfQogCiB0ZW1wbGF0ZSA8aW50Pgotdm9pZCB0ZXN0X2F1dG9kaWZmX2phY29iaWFuKCkKLXsKLSAgQ0FMTF9TVUJURVNUKCggZm9yd2FyZF9qYWNvYmlhbihUZXN0RnVuYzE8ZG91YmxlLDIsMj4oKSkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIGZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwyLDM+KCkpICkpOwotICBDQUxMX1NVQlRFU1QoKCBmb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMywyPigpKSApKTsKLSAgQ0FMTF9TVUJURVNUKCggZm9yd2FyZF9qYWNvYmlhbihUZXN0RnVuYzE8ZG91YmxlLDMsMz4oKSkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIGZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZT4oMywzKSkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIGZvcndhcmRfamFjb2JpYW5fY3BwMTEoaW50ZWdyYXRvckZ1bmN0b3I8ZG91YmxlPigxMCkpICkpOwordm9pZCB0ZXN0X2F1dG9kaWZmX2phY29iaWFuKCkgeworICBDQUxMX1NVQlRFU1QoKGZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwgMiwgMj4oKSkpKTsKKyAgQ0FMTF9TVUJURVNUKChmb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsIDIsIDM+KCkpKSk7CisgIENBTExfU1VCVEVTVCgoZm9yd2FyZF9qYWNvYmlhbihUZXN0RnVuYzE8ZG91YmxlLCAzLCAyPigpKSkpOworICBDQUxMX1NVQlRFU1QoKGZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwgMywgMz4oKSkpKTsKKyAgQ0FMTF9TVUJURVNUKChmb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGU+KDMsIDMpKSkpOworICBDQUxMX1NVQlRFU1QoKGZvcndhcmRfamFjb2JpYW5fY3BwMTEoaW50ZWdyYXRvckZ1bmN0b3I8ZG91YmxlPigxMCkpKSk7CiB9CiAKLQogdGVtcGxhdGUgPGludD4KLXZvaWQgdGVzdF9hdXRvZGlmZl9oZXNzaWFuKCkKLXsKK3ZvaWQgdGVzdF9hdXRvZGlmZl9oZXNzaWFuKCkgewogICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPFZlY3RvclhkPiBBRDsKLSAgdHlwZWRlZiBNYXRyaXg8QUQsRWlnZW46OkR5bmFtaWMsMT4gVmVjdG9yQUQ7CisgIHR5cGVkZWYgTWF0cml4PEFELCBFaWdlbjo6RHluYW1pYywgMT4gVmVjdG9yQUQ7CiAgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8VmVjdG9yQUQ+IEFERDsKLSAgdHlwZWRlZiBNYXRyaXg8QURELEVpZ2VuOjpEeW5hbWljLDE+IFZlY3RvckFERDsKKyAgdHlwZWRlZiBNYXRyaXg8QURELCBFaWdlbjo6RHluYW1pYywgMT4gVmVjdG9yQUREOwogICBWZWN0b3JBREQgeCgyKTsKLSAgZG91YmxlIHMxID0gaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCksIHMyID0gaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCksIHMzID0gaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCksIHM0ID0gaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCk7Ci0gIHgoMCkudmFsdWUoKT1zMTsKLSAgeCgxKS52YWx1ZSgpPXMyOworICBkb3VibGUgczEgPSBpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKSwgczIgPSBpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKSwgczMgPSBpbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oKSwKKyAgICAgICAgIHM0ID0gaW50ZXJuYWw6OnJhbmRvbTxkb3VibGU+KCk7CisgIHgoMCkudmFsdWUoKSA9IHMxOworICB4KDEpLnZhbHVlKCkgPSBzMjsKIAotICAvL3NldCB1bml0IHZlY3RvcnMgZm9yIHRoZSBkZXJpdmF0aXZlIGRpcmVjdGlvbnMgKHBhcnRpYWwgZGVyaXZhdGl2ZXMgb2YgdGhlIGlucHV0IHZlY3RvcikKKyAgLy8gc2V0IHVuaXQgdmVjdG9ycyBmb3IgdGhlIGRlcml2YXRpdmUgZGlyZWN0aW9ucyAocGFydGlhbCBkZXJpdmF0aXZlcyBvZiB0aGUgaW5wdXQgdmVjdG9yKQogICB4KDApLmRlcml2YXRpdmVzKCkucmVzaXplKDIpOwogICB4KDApLmRlcml2YXRpdmVzKCkuc2V0WmVybygpOwotICB4KDApLmRlcml2YXRpdmVzKCkoMCk9IDE7CisgIHgoMCkuZGVyaXZhdGl2ZXMoKSgwKSA9IDE7CiAgIHgoMSkuZGVyaXZhdGl2ZXMoKS5yZXNpemUoMik7CiAgIHgoMSkuZGVyaXZhdGl2ZXMoKS5zZXRaZXJvKCk7Ci0gIHgoMSkuZGVyaXZhdGl2ZXMoKSgxKT0xOworICB4KDEpLmRlcml2YXRpdmVzKCkoMSkgPSAxOwogCi0gIC8vcmVwZWF0IHBhcnRpYWwgZGVyaXZhdGl2ZXMgZm9yIHRoZSBpbm5lciBBdXRvRGlmZlNjYWxhcgotICB4KDApLnZhbHVlKCkuZGVyaXZhdGl2ZXMoKSA9IFZlY3RvclhkOjpVbml0KDIsMCk7Ci0gIHgoMSkudmFsdWUoKS5kZXJpdmF0aXZlcygpID0gVmVjdG9yWGQ6OlVuaXQoMiwxKTsKKyAgLy8gcmVwZWF0IHBhcnRpYWwgZGVyaXZhdGl2ZXMgZm9yIHRoZSBpbm5lciBBdXRvRGlmZlNjYWxhcgorICB4KDApLnZhbHVlKCkuZGVyaXZhdGl2ZXMoKSA9IFZlY3RvclhkOjpVbml0KDIsIDApOworICB4KDEpLnZhbHVlKCkuZGVyaXZhdGl2ZXMoKSA9IFZlY3RvclhkOjpVbml0KDIsIDEpOwogCi0gIC8vc2V0IHRoZSBoZXNzaWFuIG1hdHJpeCB0byB6ZXJvCi0gIGZvcihpbnQgaWR4PTA7IGlkeDwyOyBpZHgrKykgewotICAgICAgeCgwKS5kZXJpdmF0aXZlcygpKGlkeCkuZGVyaXZhdGl2ZXMoKSAgPSBWZWN0b3JYZDo6WmVybygyKTsKLSAgICAgIHgoMSkuZGVyaXZhdGl2ZXMoKShpZHgpLmRlcml2YXRpdmVzKCkgID0gVmVjdG9yWGQ6Olplcm8oMik7CisgIC8vIHNldCB0aGUgaGVzc2lhbiBtYXRyaXggdG8gemVybworICBmb3IgKGludCBpZHggPSAwOyBpZHggPCAyOyBpZHgrKykgeworICAgIHgoMCkuZGVyaXZhdGl2ZXMoKShpZHgpLmRlcml2YXRpdmVzKCkgPSBWZWN0b3JYZDo6WmVybygyKTsKKyAgICB4KDEpLmRlcml2YXRpdmVzKCkoaWR4KS5kZXJpdmF0aXZlcygpID0gVmVjdG9yWGQ6Olplcm8oMik7CiAgIH0KIAotICBBREQgeSA9IHNpbihBRChzMykqeCgwKSArIEFEKHM0KSp4KDEpKTsKKyAgQUREIHkgPSBzaW4oQUQoczMpICogeCgwKSArIEFEKHM0KSAqIHgoMSkpOwogCiAgIFZFUklGWV9JU19BUFBST1goeS52YWx1ZSgpLmRlcml2YXRpdmVzKCkoMCksIHkuZGVyaXZhdGl2ZXMoKSgwKS52YWx1ZSgpKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh5LnZhbHVlKCkuZGVyaXZhdGl2ZXMoKSgxKSwgeS5kZXJpdmF0aXZlcygpKDEpLnZhbHVlKCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHkudmFsdWUoKS5kZXJpdmF0aXZlcygpKDApLCBzMypzdGQ6OmNvcyhzMSpzMytzMipzNCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHkudmFsdWUoKS5kZXJpdmF0aXZlcygpKDEpLCBzNCpzdGQ6OmNvcyhzMSpzMytzMipzNCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHkuZGVyaXZhdGl2ZXMoKSgwKS5kZXJpdmF0aXZlcygpLCAtc3RkOjpzaW4oczEqczMrczIqczQpKlZlY3RvcjJkKHMzKnMzLHM0KnMzKSk7Ci0gIFZFUklGWV9JU19BUFBST1goeS5kZXJpdmF0aXZlcygpKDEpLmRlcml2YXRpdmVzKCksICAtc3RkOjpzaW4oczEqczMrczIqczQpKlZlY3RvcjJkKHMzKnM0LHM0KnM0KSk7CisgIFZFUklGWV9JU19BUFBST1goeS52YWx1ZSgpLmRlcml2YXRpdmVzKCkoMCksIHMzICogc3RkOjpjb3MoczEgKiBzMyArIHMyICogczQpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh5LnZhbHVlKCkuZGVyaXZhdGl2ZXMoKSgxKSwgczQgKiBzdGQ6OmNvcyhzMSAqIHMzICsgczIgKiBzNCkpOworICBWRVJJRllfSVNfQVBQUk9YKHkuZGVyaXZhdGl2ZXMoKSgwKS5kZXJpdmF0aXZlcygpLCAtc3RkOjpzaW4oczEgKiBzMyArIHMyICogczQpICogVmVjdG9yMmQoczMgKiBzMywgczQgKiBzMykpOworICBWRVJJRllfSVNfQVBQUk9YKHkuZGVyaXZhdGl2ZXMoKSgxKS5kZXJpdmF0aXZlcygpLCAtc3RkOjpzaW4oczEgKiBzMyArIHMyICogczQpICogVmVjdG9yMmQoczMgKiBzNCwgczQgKiBzNCkpOwogCi0gIEFERCB6ID0geCgwKSp4KDEpOwotICBWRVJJRllfSVNfQVBQUk9YKHouZGVyaXZhdGl2ZXMoKSgwKS5kZXJpdmF0aXZlcygpLCBWZWN0b3IyZCgwLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh6LmRlcml2YXRpdmVzKCkoMSkuZGVyaXZhdGl2ZXMoKSwgVmVjdG9yMmQoMSwwKSk7CisgIEFERCB6ID0geCgwKSAqIHgoMSk7CisgIFZFUklGWV9JU19BUFBST1goei5kZXJpdmF0aXZlcygpKDApLmRlcml2YXRpdmVzKCksIFZlY3RvcjJkKDAsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh6LmRlcml2YXRpdmVzKCkoMSkuZGVyaXZhdGl2ZXMoKSwgVmVjdG9yMmQoMSwgMCkpOwogfQogCiBkb3VibGUgYnVnXzEyMjIoKSB7CkBAIC0zMTIsMTIgKzI4NywxMiBAQAogICBjb25zdCBBRCBjaGlfMyA9IDEuMDsKICAgY29uc3QgQUQgZGVub20gPSAxLjA7CiAKLSAgLy8gZmFpbGVkIGJlY2F1c2UgaW1wbGVtZW50YXRpb24gb2YgbWluIGF0dGVtcHRzIHRvIGNvbnN0cnVjdCBBRFM8RGVyVHlwZSY+IHZpYSBjb25zdHJ1Y3RvciBBdXRvRGlmZlNjYWxhcihjb25zdCBSZWFsJiB2YWx1ZSkKLSAgLy8gd2l0aG91dCBpbml0aWFsaXppbmcgbV9kZXJpdmF0aXZlcyAod2hpY2ggaXMgYSByZWZlcmVuY2UgaW4gdGhpcyBjYXNlKQotICAjZGVmaW5lIEVJR0VOX1RFU1RfU1BBQ0UKLSAgY29uc3QgQUQgdCA9IG1pbiBFSUdFTl9URVNUX1NQQUNFIChkZW5vbSAvIGNoaV8zLCAxLjApOworLy8gZmFpbGVkIGJlY2F1c2UgaW1wbGVtZW50YXRpb24gb2YgbWluIGF0dGVtcHRzIHRvIGNvbnN0cnVjdCBBRFM8RGVyVHlwZSY+IHZpYSBjb25zdHJ1Y3RvciBBdXRvRGlmZlNjYWxhcihjb25zdCBSZWFsJgorLy8gdmFsdWUpIHdpdGhvdXQgaW5pdGlhbGl6aW5nIG1fZGVyaXZhdGl2ZXMgKHdoaWNoIGlzIGEgcmVmZXJlbmNlIGluIHRoaXMgY2FzZSkKKyNkZWZpbmUgRUlHRU5fVEVTVF9TUEFDRQorICBjb25zdCBBRCB0ID0gbWluIEVJR0VOX1RFU1RfU1BBQ0UoZGVub20gLyBjaGlfMywgMS4wKTsKIAotICBjb25zdCBBRCB0MiA9IG1pbiBFSUdFTl9URVNUX1NQQUNFIChkZW5vbSAvIChjaGlfMyAqIF9jdjFfMyksIDEuMCk7CisgIGNvbnN0IEFEIHQyID0gbWluIEVJR0VOX1RFU1RfU1BBQ0UoZGVub20gLyAoY2hpXzMgKiBfY3YxXzMpLCAxLjApOwogCiAgIHJldHVybiB0LnZhbHVlKCkgKyB0Mi52YWx1ZSgpOwogfQpAQCAtMzI2LDE1ICszMDEsMTUgQEAKIHZvaWQgYnVnXzEyNjAoKSB7CiAgIE1hdHJpeDRkIEEgPSBNYXRyaXg0ZDo6T25lcygpOwogICBWZWN0b3I0ZCB2ID0gVmVjdG9yNGQ6Ok9uZXMoKTsKLSAgQSp2OworICBBKiB2OwogfQogCiAvLyBjaGVjayBhIGNvbXBpbGF0aW9uIGlzc3VlIHdpdGggbnVtZXh0OjptYXgKIGRvdWJsZSBidWdfMTI2MSgpIHsKICAgdHlwZWRlZiBBdXRvRGlmZlNjYWxhcjxNYXRyaXgyZD4gQUQ7Ci0gIHR5cGVkZWYgTWF0cml4PEFELDIsMT4gVmVjdG9yQUQ7CisgIHR5cGVkZWYgTWF0cml4PEFELCAyLCAxPiBWZWN0b3JBRDsKIAotICBWZWN0b3JBRCB2KDAuLDAuKTsKKyAgVmVjdG9yQUQgdigwLiwgMC4pOwogICBjb25zdCBBRCBtYXhWYWwgPSB2Lm1heENvZWZmKCk7CiAgIGNvbnN0IEFEIG1pblZhbCA9IHYubWluQ29lZmYoKTsKICAgcmV0dXJuIG1heFZhbC52YWx1ZSgpICsgbWluVmFsLnZhbHVlKCk7CkBAIC0zNDMsNyArMzE4LDcgQEAKIGRvdWJsZSBidWdfMTI2NCgpIHsKICAgdHlwZWRlZiBBdXRvRGlmZlNjYWxhcjxWZWN0b3IyZD4gQUQ7CiAgIGNvbnN0IEFEIHMgPSAwLjsKLSAgY29uc3QgTWF0cml4PEFELCAzLCAxPiB2MSgwLiwwLiwwLik7CisgIGNvbnN0IE1hdHJpeDxBRCwgMywgMT4gdjEoMC4sIDAuLCAwLik7CiAgIGNvbnN0IE1hdHJpeDxBRCwgMywgMT4gdjIgPSAocyArIDMuMCkgKiB2MTsKICAgcmV0dXJuIHYyKDApLnZhbHVlKCk7CiB9CkBAIC0zNTMsMzEgKzMyOCwyOSBAQAogICBpbnQgbiA9IDI7CiAgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8VmVjdG9yWGQ+IEFEOwogICBjb25zdCBBRCBjID0gMS47Ci0gIEFEIHgwKDIsbiwwKTsKLSAgQUQgeTEgPSAoQUQoYykrQUQoYykpKngwOwotICB5MSA9IHgwICogKEFEKGMpK0FEKGMpKTsKLSAgQUQgeTIgPSAoLUFEKGMpKSt4MDsKLSAgeTIgPSB4MCsoLUFEKGMpKTsKLSAgQUQgeTMgPSAoQUQoYykqKC1BRChjKSkrQUQoYykpKngwOwotICB5MyA9IHgwICogKEFEKGMpKigtQUQoYykpK0FEKGMpKTsKLSAgcmV0dXJuICh5MSt5Mit5MykudmFsdWUoKTsKKyAgQUQgeDAoMiwgbiwgMCk7CisgIEFEIHkxID0gKEFEKGMpICsgQUQoYykpICogeDA7CisgIHkxID0geDAgKiAoQUQoYykgKyBBRChjKSk7CisgIEFEIHkyID0gKC1BRChjKSkgKyB4MDsKKyAgeTIgPSB4MCArICgtQUQoYykpOworICBBRCB5MyA9IChBRChjKSAqICgtQUQoYykpICsgQUQoYykpICogeDA7CisgIHkzID0geDAgKiAoQUQoYykgKiAoLUFEKGMpKSArIEFEKGMpKTsKKyAgcmV0dXJuICh5MSArIHkyICsgeTMpLnZhbHVlKCk7CiB9CiAKICNlbmRpZgogCi1FSUdFTl9ERUNMQVJFX1RFU1QoYXV0b2RpZmYpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIHRlc3RfYXV0b2RpZmZfc2NhbGFyPDE+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggdGVzdF9hdXRvZGlmZl92ZWN0b3I8MT4oKSApOwotICAgIENBTExfU1VCVEVTVF8zKCB0ZXN0X2F1dG9kaWZmX2phY29iaWFuPDE+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggdGVzdF9hdXRvZGlmZl9oZXNzaWFuPDE+KCkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChhdXRvZGlmZikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2F1dG9kaWZmX3NjYWxhcjwxPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMih0ZXN0X2F1dG9kaWZmX3ZlY3RvcjwxPigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyh0ZXN0X2F1dG9kaWZmX2phY29iaWFuPDE+KCkpOworICAgIENBTExfU1VCVEVTVF80KHRlc3RfYXV0b2RpZmZfaGVzc2lhbjwxPigpKTsKICAgfQogCi0gIENBTExfU1VCVEVTVF81KCBidWdfMTIyMigpICk7Ci0gIENBTExfU1VCVEVTVF81KCBidWdfMTIyMygpICk7Ci0gIENBTExfU1VCVEVTVF81KCBidWdfMTI2MCgpICk7Ci0gIENBTExfU1VCVEVTVF81KCBidWdfMTI2MSgpICk7Ci0gIENBTExfU1VCVEVTVF81KCBidWdfMTI4MSgpICk7CisgIENBTExfU1VCVEVTVF81KGJ1Z18xMjIyKCkpOworICBDQUxMX1NVQlRFU1RfNShidWdfMTIyMygpKTsKKyAgQ0FMTF9TVUJURVNUXzUoYnVnXzEyNjAoKSk7CisgIENBTExfU1VCVEVTVF81KGJ1Z18xMjYxKCkpOworICBDQUxMX1NVQlRFU1RfNShidWdfMTI4MSgpKTsKIH0KLQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9hdXRvZGlmZl9zY2FsYXIuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9hdXRvZGlmZl9zY2FsYXIuY3BwCmluZGV4IDFkYmY1ODUuLmEwYmZmOTEgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvYXV0b2RpZmZfc2NhbGFyLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2F1dG9kaWZmX3NjYWxhci5jcHAKQEAgLTE1LDM2ICsxNSwzNiBAQAogICogVE9ETyBhZGQgbW9yZSB0ZXN0cyEKICAqLwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgY2hlY2tfYXRhbjIoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3ZvaWQgY2hlY2tfYXRhbjIoKSB7CiAgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgMSwgMT4gRGVyaXYxOwogICB0eXBlZGVmIEF1dG9EaWZmU2NhbGFyPERlcml2MT4gQUQ7Ci0gIAorCiAgIEFEIHgoaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KC0zLjAsIDMuMCksIERlcml2MTo6VW5pdFgoKSk7Ci0gIAorCiAgIHVzaW5nIHN0ZDo6ZXhwOwogICBTY2FsYXIgciA9IGV4cChpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oLTEwLCAxMCkpOwotICAKKwogICBBRCBzID0gc2luKHgpLCBjID0gY29zKHgpOwotICBBRCByZXMgPSBhdGFuMihyKnMsIHIqYyk7Ci0gIAorICBBRCByZXMgPSBhdGFuMihyICogcywgciAqIGMpOworCiAgIFZFUklGWV9JU19BUFBST1gocmVzLnZhbHVlKCksIHgudmFsdWUoKSk7CiAgIFZFUklGWV9JU19BUFBST1gocmVzLmRlcml2YXRpdmVzKCksIHguZGVyaXZhdGl2ZXMoKSk7CiAKLSAgcmVzID0gYXRhbjIocipzKzAsIHIqYyswKTsKKyAgcmVzID0gYXRhbjIociAqIHMgKyAwLCByICogYyArIDApOwogICBWRVJJRllfSVNfQVBQUk9YKHJlcy52YWx1ZSgpLCB4LnZhbHVlKCkpOwogICBWRVJJRllfSVNfQVBQUk9YKHJlcy5kZXJpdmF0aXZlcygpLCB4LmRlcml2YXRpdmVzKCkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+IHZvaWQgY2hlY2tfaHlwZXJib2xpY19mdW5jdGlvbnMoKQotewotICB1c2luZyBzdGQ6OnNpbmg7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBjaGVja19oeXBlcmJvbGljX2Z1bmN0aW9ucygpIHsKICAgdXNpbmcgc3RkOjpjb3NoOworICB1c2luZyBzdGQ6OnNpbmg7CiAgIHVzaW5nIHN0ZDo6dGFuaDsKICAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCAxLCAxPiBEZXJpdjE7CiAgIHR5cGVkZWYgQXV0b0RpZmZTY2FsYXI8RGVyaXYxPiBBRDsKICAgRGVyaXYxIHAgPSBEZXJpdjE6OlJhbmRvbSgpOwotICBBRCB2YWwocC54KCksRGVyaXYxOjpVbml0WCgpKTsKKyAgQUQgdmFsKHAueCgpLCBEZXJpdjE6OlVuaXRYKCkpOwogCiAgIFNjYWxhciBjb3NoX3B4ID0gc3RkOjpjb3NoKHAueCgpKTsKICAgQUQgcmVzMSA9IHRhbmgodmFsKTsKQEAgLTYwLDggKzYwLDggQEAKICAgVkVSSUZZX0lTX0FQUFJPWChyZXMzLmRlcml2YXRpdmVzKCkueCgpLCBzdGQ6OnNpbmgocC54KCkpKTsKIAogICAvLyBDaGVjayBjb25zdGFudCB2YWx1ZXMuCi0gIGNvbnN0IFNjYWxhciBzYW1wbGVfcG9pbnQgPSBTY2FsYXIoMSkgLyBTY2FsYXIoMyk7IAotICB2YWwgPSBBRChzYW1wbGVfcG9pbnQsRGVyaXYxOjpVbml0WCgpKTsKKyAgY29uc3QgU2NhbGFyIHNhbXBsZV9wb2ludCA9IFNjYWxhcigxKSAvIFNjYWxhcigzKTsKKyAgdmFsID0gQUQoc2FtcGxlX3BvaW50LCBEZXJpdjE6OlVuaXRYKCkpOwogICByZXMxID0gdGFuaCh2YWwpOwogICBWRVJJRllfSVNfQVBQUk9YKHJlczEuZGVyaXZhdGl2ZXMoKS54KCksIFNjYWxhcigwLjg5NjYyOTU1OTYwNDkxNCkpOwogCkBAIC03Myw4ICs3Myw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIGNoZWNrX2xpbWl0c19zcGVjaWFsaXphdGlvbigpCi17Cit2b2lkIGNoZWNrX2xpbWl0c19zcGVjaWFsaXphdGlvbigpIHsKICAgdHlwZWRlZiBFaWdlbjo6TWF0cml4PFNjYWxhciwgMSwgMT4gRGVyaXY7CiAgIHR5cGVkZWYgRWlnZW46OkF1dG9EaWZmU2NhbGFyPERlcml2PiBBRDsKIApAQCAtODcsMTMgKzg2LDEyIEBACiAgIFZFUklGWShib29sKHN0ZDo6aXNfYmFzZV9vZjxCLCBBPjo6dmFsdWUpKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGF1dG9kaWZmX3NjYWxhcikKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1RfMSggY2hlY2tfYXRhbjI8ZmxvYXQ+KCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggY2hlY2tfYXRhbjI8ZG91YmxlPigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIGNoZWNrX2h5cGVyYm9saWNfZnVuY3Rpb25zPGZsb2F0PigpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIGNoZWNrX2h5cGVyYm9saWNfZnVuY3Rpb25zPGRvdWJsZT4oKSApOwotICAgIENBTExfU1VCVEVTVF81KCBjaGVja19saW1pdHNfc3BlY2lhbGl6YXRpb248ZG91YmxlPigpKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChhdXRvZGlmZl9zY2FsYXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgQ0FMTF9TVUJURVNUXzEoY2hlY2tfYXRhbjI8ZmxvYXQ+KCkpOworICAgIENBTExfU1VCVEVTVF8yKGNoZWNrX2F0YW4yPGRvdWJsZT4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoY2hlY2tfaHlwZXJib2xpY19mdW5jdGlvbnM8ZmxvYXQ+KCkpOworICAgIENBTExfU1VCVEVTVF80KGNoZWNrX2h5cGVyYm9saWNfZnVuY3Rpb25zPGRvdWJsZT4oKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoY2hlY2tfbGltaXRzX3NwZWNpYWxpemF0aW9uPGRvdWJsZT4oKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvYmVzc2VsX2Z1bmN0aW9ucy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2Jlc3NlbF9mdW5jdGlvbnMuY3BwCmluZGV4IDA2NzY1YmYuLjg2YWRmYzEgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvYmVzc2VsX2Z1bmN0aW9ucy5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9iZXNzZWxfZnVuY3Rpb25zLmNwcApAQCAtMTAsNDEgKzEwLDM1IEBACiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgIi4uL0VpZ2VuL1NwZWNpYWxGdW5jdGlvbnMiCiAKLXRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFk+Ci12b2lkIHZlcmlmeV9jb21wb25lbnRfd2lzZShjb25zdCBYJiB4LCBjb25zdCBZJiB5KQotewotICBmb3IoSW5kZXggaT0wOyBpPHguc2l6ZSgpOyArK2kpCi0gIHsKLSAgICBpZigobnVtZXh0Ojppc2Zpbml0ZSkoeShpKSkpIHsKLSAgICAgIFZFUklGWV9JU19BUFBST1goIHgoaSksIHkoaSkgKTsKLSAgICB9Ci0gICAgZWxzZSBpZigobnVtZXh0Ojppc25hbikoeShpKSkpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWT4KK3ZvaWQgdmVyaWZ5X2NvbXBvbmVudF93aXNlKGNvbnN0IFgmIHgsIGNvbnN0IFkmIHkpIHsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IHguc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoKG51bWV4dDo6aXNmaW5pdGUpKHkoaSkpKSB7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHgoaSksIHkoaSkpOworICAgIH0gZWxzZSBpZiAoKG51bWV4dDo6aXNuYW4pKHkoaSkpKQogICAgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKSh4KGkpKSk7CiAgICAgZWxzZQotICAgICAgVkVSSUZZX0lTX0VRVUFMKCB4KGkpLCB5KGkpICk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoeChpKSwgeShpKSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgQXJyYXlUeXBlPiB2b2lkIGFycmF5X2Jlc3NlbF9mdW5jdGlvbnMoKSAKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBBcnJheVR5cGU+Cit2b2lkIGFycmF5X2Jlc3NlbF9mdW5jdGlvbnMoKSB7CiAgIC8vIFRlc3QgQmVzc2VsIGZ1bmN0aW9uIGkwLiBSZWZlcmVuY2UgcmVzdWx0cyBvYnRhaW5lZCB3aXRoIFNjaVB5LgogICB7CiAgICAgQXJyYXlUeXBlIHgoMjEpOwogICAgIEFycmF5VHlwZSBleHBlY3RlZCgyMSk7CiAgICAgQXJyYXlUeXBlIHJlcygyMSk7CiAKLSAgICB4IDw8IC0yMC4wLCAtMTguMCwgLTE2LjAsIC0xNC4wLCAtMTIuMCwgLTEwLjAsIC04LjAsIC02LjAsIC00LjAsIC0yLjAsIDAuMCwKLSAgICAgICAgMi4wLCA0LjAsIDYuMCwgOC4wLCAxMC4wLCAxMi4wLCAxNC4wLCAxNi4wLCAxOC4wLCAyMC4wOworICAgIHggPDwgLTIwLjAsIC0xOC4wLCAtMTYuMCwgLTE0LjAsIC0xMi4wLCAtMTAuMCwgLTguMCwgLTYuMCwgLTQuMCwgLTIuMCwgMC4wLCAyLjAsIDQuMCwgNi4wLCA4LjAsIDEwLjAsIDEyLjAsIDE0LjAsCisgICAgICAgIDE2LjAsIDE4LjAsIDIwLjA7CiAKLSAgICBleHBlY3RlZCA8PCA0LjM1NTgyODI2ZSswNywgNi4yMTg0MTI0MmUrMDYsIDguOTM0NDYyMjhlKzA1LCAxLjI5NDE4NTYzZSswNSwKLSAgICAgICAxLjg5NDg5MjUzZSswNCwgMi44MTU3MTY2M2UrMDMsIDQuMjc1NjQxMTZlKzAyLCA2LjcyMzQ0MDcwZSswMSwKLSAgICAgICAxLjEzMDE5MjIwZSswMSwgMi4yNzk1ODUzMGUrMDAsIDEuMDAwMDAwMDBlKzAwLCAyLjI3OTU4NTMwZSswMCwKLSAgICAgICAxLjEzMDE5MjIwZSswMSwgNi43MjM0NDA3MGUrMDEsIDQuMjc1NjQxMTZlKzAyLCAyLjgxNTcxNjYzZSswMywKLSAgICAgICAxLjg5NDg5MjUzZSswNCwgMS4yOTQxODU2M2UrMDUsIDguOTM0NDYyMjhlKzA1LCA2LjIxODQxMjQyZSswNiwKLSAgICAgICA0LjM1NTgyODI2ZSswNzsKKyAgICBleHBlY3RlZCA8PCA0LjM1NTgyODI2ZSswNywgNi4yMTg0MTI0MmUrMDYsIDguOTM0NDYyMjhlKzA1LCAxLjI5NDE4NTYzZSswNSwgMS44OTQ4OTI1M2UrMDQsIDIuODE1NzE2NjNlKzAzLAorICAgICAgICA0LjI3NTY0MTE2ZSswMiwgNi43MjM0NDA3MGUrMDEsIDEuMTMwMTkyMjBlKzAxLCAyLjI3OTU4NTMwZSswMCwgMS4wMDAwMDAwMGUrMDAsIDIuMjc5NTg1MzBlKzAwLCAxLjEzMDE5MjIwZSswMSwKKyAgICAgICAgNi43MjM0NDA3MGUrMDEsIDQuMjc1NjQxMTZlKzAyLCAyLjgxNTcxNjYzZSswMywgMS44OTQ4OTI1M2UrMDQsIDEuMjk0MTg1NjNlKzA1LCA4LjkzNDQ2MjI4ZSswNSwgNi4yMTg0MTI0MmUrMDYsCisgICAgICAgIDQuMzU1ODI4MjZlKzA3OwogCi0gICAgQ0FMTF9TVUJURVNUKHJlcyA9IGJlc3NlbF9pMCh4KTsKLSAgICAgICAgICAgICAgICAgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgZXhwZWN0ZWQpOyk7CisgICAgQ0FMTF9TVUJURVNUKHJlcyA9IGJlc3NlbF9pMCh4KTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgZXhwZWN0ZWQpOyk7CiAgIH0KIAogICAvLyBUZXN0IEJlc3NlbCBmdW5jdGlvbiBpMGUuIFJlZmVyZW5jZSByZXN1bHRzIG9idGFpbmVkIHdpdGggU2NpUHkuCkBAIC01MywxOCArNDcsMTUgQEAKICAgICBBcnJheVR5cGUgZXhwZWN0ZWQoMjEpOwogICAgIEFycmF5VHlwZSByZXMoMjEpOwogCi0gICAgeCA8PCAtMjAuMCwgLTE4LjAsIC0xNi4wLCAtMTQuMCwgLTEyLjAsIC0xMC4wLCAtOC4wLCAtNi4wLCAtNC4wLCAtMi4wLCAwLjAsCi0gICAgICAgIDIuMCwgNC4wLCA2LjAsIDguMCwgMTAuMCwgMTIuMCwgMTQuMCwgMTYuMCwgMTguMCwgMjAuMDsKKyAgICB4IDw8IC0yMC4wLCAtMTguMCwgLTE2LjAsIC0xNC4wLCAtMTIuMCwgLTEwLjAsIC04LjAsIC02LjAsIC00LjAsIC0yLjAsIDAuMCwgMi4wLCA0LjAsIDYuMCwgOC4wLCAxMC4wLCAxMi4wLCAxNC4wLAorICAgICAgICAxNi4wLCAxOC4wLCAyMC4wOwogCi0gICAgZXhwZWN0ZWQgPDwgMC4wODk3ODAzMTE4ODQ4LCAwLjA5NDcwNjI5NTIxMjgsIDAuMTAwNTQ0MTI3MzYxLAotICAgICAgICAwLjEwNzYxNTI1MTY3MSwgMC4xMTY0MjYyMjEyMTMsIDAuMTI3ODMzMzM3MTYzLCAwLjE0MzQzMTc4MTg1NywKLSAgICAgICAgMC4xNjY2NTc0MzI2NCwgMC4yMDcwMDE5MjEyMjQsIDAuMzA4NTA4MzIyNTU0LCAxLjAsIDAuMzA4NTA4MzIyNTU0LAotICAgICAgICAwLjIwNzAwMTkyMTIyNCwgMC4xNjY2NTc0MzI2NCwgMC4xNDM0MzE3ODE4NTcsIDAuMTI3ODMzMzM3MTYzLAotICAgICAgICAwLjExNjQyNjIyMTIxMywgMC4xMDc2MTUyNTE2NzEsIDAuMTAwNTQ0MTI3MzYxLCAwLjA5NDcwNjI5NTIxMjgsCisgICAgZXhwZWN0ZWQgPDwgMC4wODk3ODAzMTE4ODQ4LCAwLjA5NDcwNjI5NTIxMjgsIDAuMTAwNTQ0MTI3MzYxLCAwLjEwNzYxNTI1MTY3MSwgMC4xMTY0MjYyMjEyMTMsIDAuMTI3ODMzMzM3MTYzLAorICAgICAgICAwLjE0MzQzMTc4MTg1NywgMC4xNjY2NTc0MzI2NCwgMC4yMDcwMDE5MjEyMjQsIDAuMzA4NTA4MzIyNTU0LCAxLjAsIDAuMzA4NTA4MzIyNTU0LCAwLjIwNzAwMTkyMTIyNCwKKyAgICAgICAgMC4xNjY2NTc0MzI2NCwgMC4xNDM0MzE3ODE4NTcsIDAuMTI3ODMzMzM3MTYzLCAwLjExNjQyNjIyMTIxMywgMC4xMDc2MTUyNTE2NzEsIDAuMTAwNTQ0MTI3MzYxLCAwLjA5NDcwNjI5NTIxMjgsCiAgICAgICAgIDAuMDg5NzgwMzExODg0ODsKIAotICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXNzZWxfaTBlKHgpOwotICAgICAgICAgICAgICAgICB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCBleHBlY3RlZCk7KTsKKyAgICBDQUxMX1NVQlRFU1QocmVzID0gYmVzc2VsX2kwZSh4KTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgZXhwZWN0ZWQpOyk7CiAgIH0KIAogICAvLyBUZXN0IEJlc3NlbCBmdW5jdGlvbiBpMS4gUmVmZXJlbmNlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCBTY2lQeS4KQEAgLTczLDE4ICs2NCwxNSBAQAogICAgIEFycmF5VHlwZSBleHBlY3RlZCgyMSk7CiAgICAgQXJyYXlUeXBlIHJlcygyMSk7CiAKLSAgICB4IDw8IC0yMC4wLCAtMTguMCwgLTE2LjAsIC0xNC4wLCAtMTIuMCwgLTEwLjAsIC04LjAsIC02LjAsIC00LjAsIC0yLjAsIDAuMCwKLSAgICAgICAgMi4wLCA0LjAsIDYuMCwgOC4wLCAxMC4wLCAxMi4wLCAxNC4wLCAxNi4wLCAxOC4wLCAyMC4wOworICAgIHggPDwgLTIwLjAsIC0xOC4wLCAtMTYuMCwgLTE0LjAsIC0xMi4wLCAtMTAuMCwgLTguMCwgLTYuMCwgLTQuMCwgLTIuMCwgMC4wLCAyLjAsIDQuMCwgNi4wLCA4LjAsIDEwLjAsIDEyLjAsIDE0LjAsCisgICAgICAgIDE2LjAsIDE4LjAsIDIwLjA7CiAKLSAgICBleHBlY3RlZCA8PCAtNC4yNDU0OTczNGUrMDcsIC02LjA0MzEzMzI0ZSswNiwgLTguNjUwNTk0MzZlKzA1LCAtMS4yNDcwNzI1OWUrMDUsCi0gICAgICAgLTEuODE0MTM0ODhlKzA0LCAtMi42NzA5ODgzMGUrMDMsIC0zLjk5ODczMTM3ZSswMiwgLTYuMTM0MTkzNjhlKzAxLAotICAgICAgIC05Ljc1OTQ2NTE1ZSswMCwgLTEuNTkwNjM2ODVlKzAwLCAgMC4wMDAwMDAwMGUrMDAsICAxLjU5MDYzNjg1ZSswMCwKLSAgICAgICAgOS43NTk0NjUxNWUrMDAsICA2LjEzNDE5MzY4ZSswMSwgIDMuOTk4NzMxMzdlKzAyLCAgMi42NzA5ODgzMGUrMDMsCi0gICAgICAgIDEuODE0MTM0ODhlKzA0LCAgMS4yNDcwNzI1OWUrMDUsICA4LjY1MDU5NDM2ZSswNSwgIDYuMDQzMTMzMjRlKzA2LAotICAgICAgICA0LjI0NTQ5NzM0ZSswNzsKKyAgICBleHBlY3RlZCA8PCAtNC4yNDU0OTczNGUrMDcsIC02LjA0MzEzMzI0ZSswNiwgLTguNjUwNTk0MzZlKzA1LCAtMS4yNDcwNzI1OWUrMDUsIC0xLjgxNDEzNDg4ZSswNCwgLTIuNjcwOTg4MzBlKzAzLAorICAgICAgICAtMy45OTg3MzEzN2UrMDIsIC02LjEzNDE5MzY4ZSswMSwgLTkuNzU5NDY1MTVlKzAwLCAtMS41OTA2MzY4NWUrMDAsIDAuMDAwMDAwMDBlKzAwLCAxLjU5MDYzNjg1ZSswMCwKKyAgICAgICAgOS43NTk0NjUxNWUrMDAsIDYuMTM0MTkzNjhlKzAxLCAzLjk5ODczMTM3ZSswMiwgMi42NzA5ODgzMGUrMDMsIDEuODE0MTM0ODhlKzA0LCAxLjI0NzA3MjU5ZSswNSwgOC42NTA1OTQzNmUrMDUsCisgICAgICAgIDYuMDQzMTMzMjRlKzA2LCA0LjI0NTQ5NzM0ZSswNzsKIAotICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXNzZWxfaTEoeCk7Ci0gICAgICAgICAgICAgICAgIHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIGV4cGVjdGVkKTspOworICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXNzZWxfaTEoeCk7IHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIGV4cGVjdGVkKTspOwogICB9CiAKICAgLy8gVGVzdCBCZXNzZWwgZnVuY3Rpb24gaTFlLiBSZWZlcmVuY2UgcmVzdWx0cyBvYnRhaW5lZCB3aXRoIFNjaVB5LgpAQCAtOTMsMTggKzgxLDE1IEBACiAgICAgQXJyYXlUeXBlIGV4cGVjdGVkKDIxKTsKICAgICBBcnJheVR5cGUgcmVzKDIxKTsKIAotICAgIHggPDwgLTIwLjAsIC0xOC4wLCAtMTYuMCwgLTE0LjAsIC0xMi4wLCAtMTAuMCwgLTguMCwgLTYuMCwgLTQuMCwgLTIuMCwgMC4wLAotICAgICAgICAyLjAsIDQuMCwgNi4wLCA4LjAsIDEwLjAsIDEyLjAsIDE0LjAsIDE2LjAsIDE4LjAsIDIwLjA7CisgICAgeCA8PCAtMjAuMCwgLTE4LjAsIC0xNi4wLCAtMTQuMCwgLTEyLjAsIC0xMC4wLCAtOC4wLCAtNi4wLCAtNC4wLCAtMi4wLCAwLjAsIDIuMCwgNC4wLCA2LjAsIDguMCwgMTAuMCwgMTIuMCwgMTQuMCwKKyAgICAgICAgMTYuMCwgMTguMCwgMjAuMDsKIAotICAgIGV4cGVjdGVkIDw8IC0wLjA4NzUwNjIyMjE4MzMsIC0wLjA5MjAzNjc5Njg3MiwgLTAuMDk3MzQ5NjE0NzU2NSwKLSAgICAgICAgLTAuMTAzNjk3NjY3NDYzLCAtMC4xMTE0NjQyOTkyOSwgLTAuMTIxMjYyNjgxMzg0LCAtMC4xMzQxNDI0OTMyOTMsCi0gICAgICAgIC0wLjE1MjA1MTQ1OTMwOSwgLTAuMTc4NzUwODM5NTAyLCAtMC4yMTUyNjkyODkyNDksIDAuMCwgMC4yMTUyNjkyODkyNDksCi0gICAgICAgIDAuMTc4NzUwODM5NTAyLCAwLjE1MjA1MTQ1OTMwOSwgMC4xMzQxNDI0OTMyOTMsIDAuMTIxMjYyNjgxMzg0LAotICAgICAgICAwLjExMTQ2NDI5OTI5LCAwLjEwMzY5NzY2NzQ2MywgMC4wOTczNDk2MTQ3NTY1LCAwLjA5MjAzNjc5Njg3MiwKKyAgICBleHBlY3RlZCA8PCAtMC4wODc1MDYyMjIxODMzLCAtMC4wOTIwMzY3OTY4NzIsIC0wLjA5NzM0OTYxNDc1NjUsIC0wLjEwMzY5NzY2NzQ2MywgLTAuMTExNDY0Mjk5MjksIC0wLjEyMTI2MjY4MTM4NCwKKyAgICAgICAgLTAuMTM0MTQyNDkzMjkzLCAtMC4xNTIwNTE0NTkzMDksIC0wLjE3ODc1MDgzOTUwMiwgLTAuMjE1MjY5Mjg5MjQ5LCAwLjAsIDAuMjE1MjY5Mjg5MjQ5LCAwLjE3ODc1MDgzOTUwMiwKKyAgICAgICAgMC4xNTIwNTE0NTkzMDksIDAuMTM0MTQyNDkzMjkzLCAwLjEyMTI2MjY4MTM4NCwgMC4xMTE0NjQyOTkyOSwgMC4xMDM2OTc2Njc0NjMsIDAuMDk3MzQ5NjE0NzU2NSwgMC4wOTIwMzY3OTY4NzIsCiAgICAgICAgIDAuMDg3NTA2MjIyMTgzMzsKIAotICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXNzZWxfaTFlKHgpOwotICAgICAgICAgICAgICAgICB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCBleHBlY3RlZCk7KTsKKyAgICBDQUxMX1NVQlRFU1QocmVzID0gYmVzc2VsX2kxZSh4KTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgZXhwZWN0ZWQpOyk7CiAgIH0KIAogICAvLyBUZXN0IEJlc3NlbCBmdW5jdGlvbiBqMC4gUmVmZXJlbmNlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCBTY2lQeS4KQEAgLTExMywzNCArOTgsMjIgQEAKICAgICBBcnJheVR5cGUgZXhwZWN0ZWQoNzcpOwogICAgIEFycmF5VHlwZSByZXMoNzcpOwogCi0gICAgeCA8PCAtMzguLCAtMzcuLCAtMzYuLCAtMzUuLCAtMzQuLCAtMzMuLCAtMzIuLCAtMzEuLCAtMzAuLAotICAgICAgLTI5LiwgLTI4LiwgLTI3LiwgLTI2LiwgLTI1LiwgLTI0LiwgLTIzLiwgLTIyLiwgLTIxLiwgLTIwLiwgLTE5LiwKLSAgICAgIC0xOC4sIC0xNy4sIC0xNi4sIC0xNS4sIC0xNC4sIC0xMy4sIC0xMi4sIC0xMS4sIC0xMC4sICAtOS4sICAtOC4sCi0gICAgICAgLTcuLCAgLTYuLCAgLTUuLCAgLTQuLCAgLTMuLCAgLTIuLCAgLTEuLCAgIDAuLCAgIDEuLCAgIDIuLCAgIDMuLAotICAgICAgICA0LiwgICA1LiwgICA2LiwgICA3LiwgICA4LiwgICA5LiwgIDEwLiwgIDExLiwgIDEyLiwgIDEzLiwgIDE0LiwKLSAgICAgICAxNS4sICAxNi4sICAxNy4sICAxOC4sICAxOS4sICAyMC4sICAyMS4sICAyMi4sICAyMy4sICAyNC4sICAyNS4sCi0gICAgICAgMjYuLCAgMjcuLCAgMjguLCAgMjkuLCAgMzAuLCAgMzEuLCAgMzIuLCAgMzMuLCAgMzQuLCAgMzUuLCAgMzYuLAotICAgICAgIDM3LiwgIDM4LjsKKyAgICB4IDw8IC0zOC4sIC0zNy4sIC0zNi4sIC0zNS4sIC0zNC4sIC0zMy4sIC0zMi4sIC0zMS4sIC0zMC4sIC0yOS4sIC0yOC4sIC0yNy4sIC0yNi4sIC0yNS4sIC0yNC4sIC0yMy4sIC0yMi4sIC0yMS4sCisgICAgICAgIC0yMC4sIC0xOS4sIC0xOC4sIC0xNy4sIC0xNi4sIC0xNS4sIC0xNC4sIC0xMy4sIC0xMi4sIC0xMS4sIC0xMC4sIC05LiwgLTguLCAtNy4sIC02LiwgLTUuLCAtNC4sIC0zLiwgLTIuLCAtMS4sCisgICAgICAgIDAuLCAxLiwgMi4sIDMuLCA0LiwgNS4sIDYuLCA3LiwgOC4sIDkuLCAxMC4sIDExLiwgMTIuLCAxMy4sIDE0LiwgMTUuLCAxNi4sIDE3LiwgMTguLCAxOS4sIDIwLiwgMjEuLCAyMi4sIDIzLiwKKyAgICAgICAgMjQuLCAyNS4sIDI2LiwgMjcuLCAyOC4sIDI5LiwgMzAuLCAzMS4sIDMyLiwgMzMuLCAzNC4sIDM1LiwgMzYuLCAzNy4sIDM4LjsKIAotICAgIGV4cGVjdGVkIDw8IDAuMTE0MzMyNzQsICAwLjAxMDg2MjM3LCAtMC4xMDU1NjczOCwKLSAgICAgICAgICAgICAtMC4xMjY4NDU2OCwgLTAuMDMwNDIxMTksICAwLjA5NzI3MDY3LCAgMC4xMzgwNzkwMSwgIDAuMDUxMjA4MTUsCi0gICAgICAgICAgICAgLTAuMDg2MzY3OTgsIC0wLjE0Nzg0ODc2LCAtMC4wNzMxNTcwMSwgIDAuMDcyNzQxOTIsICAwLjE1NTk5OTMyLAotICAgICAgICAgICAgICAwLjA5NjI2Njc4LCAtMC4wNTYyMzAyNywgLTAuMTYyNDEyNzgsIC0wLjEyMDY1MTQ4LCAgMC4wMzY1NzkwNywKLSAgICAgICAgICAgICAgMC4xNjcwMjQ2NiwgIDAuMTQ2NjI5NDQsIC0wLjAxMzM1NTgxLCAtMC4xNjk4NTQyNSwgLTAuMTc0ODk5MDcsCi0gICAgICAgICAgICAgLTAuMDE0MjI0NDcsICAwLjE3MTA3MzQ4LCAgMC4yMDY5MjYxICwgIDAuMDQ3Njg5MzEsIC0wLjE3MTE5MDMgLAotICAgICAgICAgICAgIC0wLjI0NTkzNTc2LCAtMC4wOTAzMzM2MSwgIDAuMTcxNjUwODEsICAwLjMwMDA3OTI3LCAgMC4xNTA2NDUyNiwKLSAgICAgICAgICAgICAtMC4xNzc1OTY3NywgLTAuMzk3MTQ5ODEsIC0wLjI2MDA1MTk1LCAgMC4yMjM4OTA3OCwgIDAuNzY1MTk3NjksCi0gICAgICAgICAgICAgIDEuICAgICAgICAsICAwLjc2NTE5NzY5LCAgMC4yMjM4OTA3OCwgLTAuMjYwMDUxOTUsIC0wLjM5NzE0OTgxLAotICAgICAgICAgICAgIC0wLjE3NzU5Njc3LCAgMC4xNTA2NDUyNiwgIDAuMzAwMDc5MjcsICAwLjE3MTY1MDgxLCAtMC4wOTAzMzM2MSwKLSAgICAgICAgICAgICAtMC4yNDU5MzU3NiwgLTAuMTcxMTkwMyAsICAwLjA0NzY4OTMxLCAgMC4yMDY5MjYxICwgIDAuMTcxMDczNDgsCi0gICAgICAgICAgICAgLTAuMDE0MjI0NDcsIC0wLjE3NDg5OTA3LCAtMC4xNjk4NTQyNSwgLTAuMDEzMzU1ODEsICAwLjE0NjYyOTQ0LAotICAgICAgICAgICAgICAwLjE2NzAyNDY2LCAgMC4wMzY1NzkwNywgLTAuMTIwNjUxNDgsIC0wLjE2MjQxMjc4LCAtMC4wNTYyMzAyNywKLSAgICAgICAgICAgICAgMC4wOTYyNjY3OCwgIDAuMTU1OTk5MzIsICAwLjA3Mjc0MTkyLCAtMC4wNzMxNTcwMSwgLTAuMTQ3ODQ4NzYsCi0gICAgICAgICAgICAgLTAuMDg2MzY3OTgsICAwLjA1MTIwODE1LCAgMC4xMzgwNzkwMSwgIDAuMDk3MjcwNjcsIC0wLjAzMDQyMTE5LAotICAgICAgICAgICAgIC0wLjEyNjg0NTY4LCAtMC4xMDU1NjczOCwgIDAuMDEwODYyMzcsICAwLjExNDMzMjc0OworICAgIGV4cGVjdGVkIDw8IDAuMTE0MzMyNzQsIDAuMDEwODYyMzcsIC0wLjEwNTU2NzM4LCAtMC4xMjY4NDU2OCwgLTAuMDMwNDIxMTksIDAuMDk3MjcwNjcsIDAuMTM4MDc5MDEsIDAuMDUxMjA4MTUsCisgICAgICAgIC0wLjA4NjM2Nzk4LCAtMC4xNDc4NDg3NiwgLTAuMDczMTU3MDEsIDAuMDcyNzQxOTIsIDAuMTU1OTk5MzIsIDAuMDk2MjY2NzgsIC0wLjA1NjIzMDI3LCAtMC4xNjI0MTI3OCwKKyAgICAgICAgLTAuMTIwNjUxNDgsIDAuMDM2NTc5MDcsIDAuMTY3MDI0NjYsIDAuMTQ2NjI5NDQsIC0wLjAxMzM1NTgxLCAtMC4xNjk4NTQyNSwgLTAuMTc0ODk5MDcsIC0wLjAxNDIyNDQ3LCAwLjE3MTA3MzQ4LAorICAgICAgICAwLjIwNjkyNjEsIDAuMDQ3Njg5MzEsIC0wLjE3MTE5MDMsIC0wLjI0NTkzNTc2LCAtMC4wOTAzMzM2MSwgMC4xNzE2NTA4MSwgMC4zMDAwNzkyNywgMC4xNTA2NDUyNiwgLTAuMTc3NTk2NzcsCisgICAgICAgIC0wLjM5NzE0OTgxLCAtMC4yNjAwNTE5NSwgMC4yMjM4OTA3OCwgMC43NjUxOTc2OSwgMS4sIDAuNzY1MTk3NjksIDAuMjIzODkwNzgsIC0wLjI2MDA1MTk1LCAtMC4zOTcxNDk4MSwKKyAgICAgICAgLTAuMTc3NTk2NzcsIDAuMTUwNjQ1MjYsIDAuMzAwMDc5MjcsIDAuMTcxNjUwODEsIC0wLjA5MDMzMzYxLCAtMC4yNDU5MzU3NiwgLTAuMTcxMTkwMywgMC4wNDc2ODkzMSwgMC4yMDY5MjYxLAorICAgICAgICAwLjE3MTA3MzQ4LCAtMC4wMTQyMjQ0NywgLTAuMTc0ODk5MDcsIC0wLjE2OTg1NDI1LCAtMC4wMTMzNTU4MSwgMC4xNDY2Mjk0NCwgMC4xNjcwMjQ2NiwgMC4wMzY1NzkwNywgLTAuMTIwNjUxNDgsCisgICAgICAgIC0wLjE2MjQxMjc4LCAtMC4wNTYyMzAyNywgMC4wOTYyNjY3OCwgMC4xNTU5OTkzMiwgMC4wNzI3NDE5MiwgLTAuMDczMTU3MDEsIC0wLjE0Nzg0ODc2LCAtMC4wODYzNjc5OCwgMC4wNTEyMDgxNSwKKyAgICAgICAgMC4xMzgwNzkwMSwgMC4wOTcyNzA2NywgLTAuMDMwNDIxMTksIC0wLjEyNjg0NTY4LCAtMC4xMDU1NjczOCwgMC4wMTA4NjIzNywgMC4xMTQzMzI3NDsKIAotICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXNzZWxfajAoeCk7Ci0gICAgICAgICAgICAgICAgIHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIGV4cGVjdGVkKTspOworICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXNzZWxfajAoeCk7IHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIGV4cGVjdGVkKTspOwogICB9CiAKICAgLy8gVGVzdCBCZXNzZWwgZnVuY3Rpb24gajEuIFJlZmVyZW5jZSByZXN1bHRzIG9idGFpbmVkIHdpdGggU2NpUHkuCkBAIC0xNDksMzUgKzEyMiwyMyBAQAogICAgIEFycmF5VHlwZSBleHBlY3RlZCg4MSk7CiAgICAgQXJyYXlUeXBlIHJlcyg4MSk7CiAKLSAgICB4IDw8IC00MC4sIC0zOS4sIC0zOC4sIC0zNy4sIC0zNi4sIC0zNS4sIC0zNC4sIC0zMy4sIC0zMi4sIC0zMS4sIC0zMC4sCi0gICAgICAtMjkuLCAtMjguLCAtMjcuLCAtMjYuLCAtMjUuLCAtMjQuLCAtMjMuLCAtMjIuLCAtMjEuLCAtMjAuLCAtMTkuLAotICAgICAgLTE4LiwgLTE3LiwgLTE2LiwgLTE1LiwgLTE0LiwgLTEzLiwgLTEyLiwgLTExLiwgLTEwLiwgIC05LiwgIC04LiwKLSAgICAgICAtNy4sICAtNi4sICAtNS4sICAtNC4sICAtMy4sICAtMi4sICAtMS4sICAgMC4sICAgMS4sICAgMi4sICAgMy4sCi0gICAgICAgIDQuLCAgIDUuLCAgIDYuLCAgIDcuLCAgIDguLCAgIDkuLCAgMTAuLCAgMTEuLCAgMTIuLCAgMTMuLCAgMTQuLAotICAgICAgIDE1LiwgIDE2LiwgIDE3LiwgIDE4LiwgIDE5LiwgIDIwLiwgIDIxLiwgIDIyLiwgIDIzLiwgIDI0LiwgIDI1LiwKLSAgICAgICAyNi4sICAyNy4sICAyOC4sICAyOS4sICAzMC4sICAzMS4sICAzMi4sICAzMy4sICAzNC4sICAzNS4sICAzNi4sCi0gICAgICAgMzcuLCAgMzguLCAgMzkuLCAgNDAuOworICAgIHggPDwgLTQwLiwgLTM5LiwgLTM4LiwgLTM3LiwgLTM2LiwgLTM1LiwgLTM0LiwgLTMzLiwgLTMyLiwgLTMxLiwgLTMwLiwgLTI5LiwgLTI4LiwgLTI3LiwgLTI2LiwgLTI1LiwgLTI0LiwgLTIzLiwKKyAgICAgICAgLTIyLiwgLTIxLiwgLTIwLiwgLTE5LiwgLTE4LiwgLTE3LiwgLTE2LiwgLTE1LiwgLTE0LiwgLTEzLiwgLTEyLiwgLTExLiwgLTEwLiwgLTkuLCAtOC4sIC03LiwgLTYuLCAtNS4sIC00LiwgLTMuLAorICAgICAgICAtMi4sIC0xLiwgMC4sIDEuLCAyLiwgMy4sIDQuLCA1LiwgNi4sIDcuLCA4LiwgOS4sIDEwLiwgMTEuLCAxMi4sIDEzLiwgMTQuLCAxNS4sIDE2LiwgMTcuLCAxOC4sIDE5LiwgMjAuLCAyMS4sCisgICAgICAgIDIyLiwgMjMuLCAyNC4sIDI1LiwgMjYuLCAyNy4sIDI4LiwgMjkuLCAzMC4sIDMxLiwgMzIuLCAzMy4sIDM0LiwgMzUuLCAzNi4sIDM3LiwgMzguLCAzOS4sIDQwLjsKIAotICAgIGV4cGVjdGVkIDw8IC0wLjEyNjAzODMyLCAtMC4wNjQwNTYxICwgIDAuMDU5MTYxODksICAwLjEzMDU4MDA0LCAgMC4wODIzMjk4MSwKLSAgICAgICAgICAgICAtMC4wNDM5OTA5NCwgLTAuMTMyOTcxMTgsIC0wLjEwMDYxOTY1LCAgMC4wMjY1ODkwMywgIDAuMTMzMDI0MzIsCi0gICAgICAgICAgICAgIDAuMTE4NzUxMDYsIC0wLjAwNjkzNDIgLCAtMC4xMzA1NTE0OSwgLTAuMTM2NTg0NzIsIC0wLjAxNTA0NTczLAotICAgICAgICAgICAgICAwLjEyNTM1MDI1LCAgMC4xNTQwMzgwNywgIDAuMDM5NTE5MzIsIC0wLjExNzE3Nzc5LCAtMC4xNzExMjAyNywKLSAgICAgICAgICAgICAtMC4wNjY4MzMxMiwgIDAuMTA1NzAxNDMsICAwLjE4Nzk5NDg5LCAgMC4wOTc2Njg0OSwgLTAuMDkwMzk3MTgsCi0gICAgICAgICAgICAgLTAuMjA1MTA0MDQsIC0wLjEzMzM3NTE1LCAgMC4wNzAzMTgwNSwgIDAuMjIzNDQ3MSAsICAwLjE3Njc4NTMgLAotICAgICAgICAgICAgIC0wLjA0MzQ3Mjc1LCAtMC4yNDUzMTE3OSwgLTAuMjM0NjM2MzUsICAwLjAwNDY4MjgyLCAgMC4yNzY2ODM4NiwKLSAgICAgICAgICAgICAgMC4zMjc1NzkxNCwgIDAuMDY2MDQzMzMsIC0wLjMzOTA1ODk2LCAtMC41NzY3MjQ4MSwgLTAuNDQwMDUwNTksCi0gICAgICAgICAgICAgIDAuICAgICAgICAsICAwLjQ0MDA1MDU5LCAgMC41NzY3MjQ4MSwgIDAuMzM5MDU4OTYsIC0wLjA2NjA0MzMzLAotICAgICAgICAgICAgIC0wLjMyNzU3OTE0LCAtMC4yNzY2ODM4NiwgLTAuMDA0NjgyODIsICAwLjIzNDYzNjM1LCAgMC4yNDUzMTE3OSwKLSAgICAgICAgICAgICAgMC4wNDM0NzI3NSwgLTAuMTc2Nzg1MyAsIC0wLjIyMzQ0NzEgLCAtMC4wNzAzMTgwNSwgIDAuMTMzMzc1MTUsCi0gICAgICAgICAgICAgIDAuMjA1MTA0MDQsICAwLjA5MDM5NzE4LCAtMC4wOTc2Njg0OSwgLTAuMTg3OTk0ODksIC0wLjEwNTcwMTQzLAotICAgICAgICAgICAgICAwLjA2NjgzMzEyLCAgMC4xNzExMjAyNywgIDAuMTE3MTc3NzksIC0wLjAzOTUxOTMyLCAtMC4xNTQwMzgwNywKLSAgICAgICAgICAgICAtMC4xMjUzNTAyNSwgIDAuMDE1MDQ1NzMsICAwLjEzNjU4NDcyLCAgMC4xMzA1NTE0OSwgIDAuMDA2OTM0MiAsCi0gICAgICAgICAgICAgLTAuMTE4NzUxMDYsIC0wLjEzMzAyNDMyLCAtMC4wMjY1ODkwMywgIDAuMTAwNjE5NjUsICAwLjEzMjk3MTE4LAotICAgICAgICAgICAgICAwLjA0Mzk5MDk0LCAtMC4wODIzMjk4MSwgLTAuMTMwNTgwMDQsIC0wLjA1OTE2MTg5LCAgMC4wNjQwNTYxICwKLSAgICAgICAgICAgICAgMC4xMjYwMzgzMjsKKyAgICBleHBlY3RlZCA8PCAtMC4xMjYwMzgzMiwgLTAuMDY0MDU2MSwgMC4wNTkxNjE4OSwgMC4xMzA1ODAwNCwgMC4wODIzMjk4MSwgLTAuMDQzOTkwOTQsIC0wLjEzMjk3MTE4LCAtMC4xMDA2MTk2NSwKKyAgICAgICAgMC4wMjY1ODkwMywgMC4xMzMwMjQzMiwgMC4xMTg3NTEwNiwgLTAuMDA2OTM0MiwgLTAuMTMwNTUxNDksIC0wLjEzNjU4NDcyLCAtMC4wMTUwNDU3MywgMC4xMjUzNTAyNSwgMC4xNTQwMzgwNywKKyAgICAgICAgMC4wMzk1MTkzMiwgLTAuMTE3MTc3NzksIC0wLjE3MTEyMDI3LCAtMC4wNjY4MzMxMiwgMC4xMDU3MDE0MywgMC4xODc5OTQ4OSwgMC4wOTc2Njg0OSwgLTAuMDkwMzk3MTgsIC0wLjIwNTEwNDA0LAorICAgICAgICAtMC4xMzMzNzUxNSwgMC4wNzAzMTgwNSwgMC4yMjM0NDcxLCAwLjE3Njc4NTMsIC0wLjA0MzQ3Mjc1LCAtMC4yNDUzMTE3OSwgLTAuMjM0NjM2MzUsIDAuMDA0NjgyODIsIDAuMjc2NjgzODYsCisgICAgICAgIDAuMzI3NTc5MTQsIDAuMDY2MDQzMzMsIC0wLjMzOTA1ODk2LCAtMC41NzY3MjQ4MSwgLTAuNDQwMDUwNTksIDAuLCAwLjQ0MDA1MDU5LCAwLjU3NjcyNDgxLCAwLjMzOTA1ODk2LAorICAgICAgICAtMC4wNjYwNDMzMywgLTAuMzI3NTc5MTQsIC0wLjI3NjY4Mzg2LCAtMC4wMDQ2ODI4MiwgMC4yMzQ2MzYzNSwgMC4yNDUzMTE3OSwgMC4wNDM0NzI3NSwgLTAuMTc2Nzg1MywgLTAuMjIzNDQ3MSwKKyAgICAgICAgLTAuMDcwMzE4MDUsIDAuMTMzMzc1MTUsIDAuMjA1MTA0MDQsIDAuMDkwMzk3MTgsIC0wLjA5NzY2ODQ5LCAtMC4xODc5OTQ4OSwgLTAuMTA1NzAxNDMsIDAuMDY2ODMzMTIsIDAuMTcxMTIwMjcsCisgICAgICAgIDAuMTE3MTc3NzksIC0wLjAzOTUxOTMyLCAtMC4xNTQwMzgwNywgLTAuMTI1MzUwMjUsIDAuMDE1MDQ1NzMsIDAuMTM2NTg0NzIsIDAuMTMwNTUxNDksIDAuMDA2OTM0MiwgLTAuMTE4NzUxMDYsCisgICAgICAgIC0wLjEzMzAyNDMyLCAtMC4wMjY1ODkwMywgMC4xMDA2MTk2NSwgMC4xMzI5NzExOCwgMC4wNDM5OTA5NCwgLTAuMDgyMzI5ODEsIC0wLjEzMDU4MDA0LCAtMC4wNTkxNjE4OSwgMC4wNjQwNTYxLAorICAgICAgICAwLjEyNjAzODMyOwogCi0gICAgQ0FMTF9TVUJURVNUKHJlcyA9IGJlc3NlbF9qMSh4KTsKLSAgICAgICAgICAgICAgICAgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgZXhwZWN0ZWQpOyk7CisgICAgQ0FMTF9TVUJURVNUKHJlcyA9IGJlc3NlbF9qMSh4KTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgZXhwZWN0ZWQpOyk7CiAgIH0KICAgLy8gVGVzdCBCZXNzZWwgZnVuY3Rpb24gazBlLiBSZWZlcmVuY2UgcmVzdWx0cyBvYnRhaW5lZCB3aXRoIFNjaVB5LgogICB7CkBAIC0xODUsMjMgKzE0NiwxNiBAQAogICAgIEFycmF5VHlwZSBleHBlY3RlZCg0Mik7CiAgICAgQXJyYXlUeXBlIHJlcyg0Mik7CiAKLSAgICB4IDw8IDAuMjUsIDAuNSwgIDEuLCAgMi4sICAzLiwgIDQuLCAgNS4sICA2LiwgIDcuLCAgOC4sICA5LiwgMTAuLCAxMS4sIDEyLiwKLSAgICAgICAxMy4sIDE0LiwgMTUuLCAxNi4sIDE3LiwgMTguLCAxOS4sIDIwLiwgMjEuLCAyMi4sIDIzLiwgMjQuLCAyNS4sCi0gICAgICAgMjYuLCAyNy4sIDI4LiwgMjkuLCAzMC4sIDMxLiwgMzIuLCAzMy4sIDM0LiwgMzUuLCAzNi4sIDM3LiwgMzguLAotICAgICAgIDM5LiwgNDAuOworICAgIHggPDwgMC4yNSwgMC41LCAxLiwgMi4sIDMuLCA0LiwgNS4sIDYuLCA3LiwgOC4sIDkuLCAxMC4sIDExLiwgMTIuLCAxMy4sIDE0LiwgMTUuLCAxNi4sIDE3LiwgMTguLCAxOS4sIDIwLiwgMjEuLCAyMi4sCisgICAgICAgIDIzLiwgMjQuLCAyNS4sIDI2LiwgMjcuLCAyOC4sIDI5LiwgMzAuLCAzMS4sIDMyLiwgMzMuLCAzNC4sIDM1LiwgMzYuLCAzNy4sIDM4LiwgMzkuLCA0MC47CiAKLSAgICBleHBlY3RlZCA8PCAxLjk3OTMzMzg1LCAxLjUyNDEwOTM5LCAxLjE0NDQ2MzA4LCAwLjg0MTU2ODIyLAotICAgICAgICAgICAgIDAuNjk3NzYxNiAsIDAuNjA5Mjk3NjcsIDAuNTQ3ODA3NTYsIDAuNTAxODYzMTMsIDAuNDY1ODQ1MSAsCi0gICAgICAgICAgICAgMC40MzY2MjMwMiwgMC40MTIyOTU1NSwgMC4zOTE2MzE5MywgMC4zNzM3OTU1ICwgMC4zNTgxOTQ4OCwKLSAgICAgICAgICAgICAwLjM0NDM5ODY1LCAwLjMzMjA4MzY0LCAwLjMyMTAwMjM1LCAwLjMxMDk2MTU5LCAwLjMwMTgwODAyLAotICAgICAgICAgICAgIDAuMjkzNDE4MjEsIDAuMjg1NjkxNDksIDAuMjc4NTQ0ODgsIDAuMjcxOTA5MiAsIDAuMjY1NzI2MzUsCi0gICAgICAgICAgICAgMC4yNTk5NDcwMywgMC4yNTQ1MjkxNywgMC4yNDk0MzY2ICwgMC4yNDQ2MzgwMSwgMC4yNDAxMDYxNiwKLSAgICAgICAgICAgICAwLjIzNTgxNzIyLCAwLjIzMTc1MDIyLCAwLjIyNzg4NjY3LCAwLjIyNDIxMDE0LCAwLjIyMDcwNjAyLAotICAgICAgICAgICAgIDAuMjE3MzYxMjMsIDAuMjE0MTY0MDYsIDAuMjExMTAzOTcsIDAuMjA4MTcxNDEsIDAuMjA1MzU3NzgsCi0gICAgICAgICAgICAgMC4yMDI2NTUyNCwgMC4yMDAwNTY2OCwgMC4xOTc1NTU1ODsKKyAgICBleHBlY3RlZCA8PCAxLjk3OTMzMzg1LCAxLjUyNDEwOTM5LCAxLjE0NDQ2MzA4LCAwLjg0MTU2ODIyLCAwLjY5Nzc2MTYsIDAuNjA5Mjk3NjcsIDAuNTQ3ODA3NTYsIDAuNTAxODYzMTMsCisgICAgICAgIDAuNDY1ODQ1MSwgMC40MzY2MjMwMiwgMC40MTIyOTU1NSwgMC4zOTE2MzE5MywgMC4zNzM3OTU1LCAwLjM1ODE5NDg4LCAwLjM0NDM5ODY1LCAwLjMzMjA4MzY0LCAwLjMyMTAwMjM1LAorICAgICAgICAwLjMxMDk2MTU5LCAwLjMwMTgwODAyLCAwLjI5MzQxODIxLCAwLjI4NTY5MTQ5LCAwLjI3ODU0NDg4LCAwLjI3MTkwOTIsIDAuMjY1NzI2MzUsIDAuMjU5OTQ3MDMsIDAuMjU0NTI5MTcsCisgICAgICAgIDAuMjQ5NDM2NiwgMC4yNDQ2MzgwMSwgMC4yNDAxMDYxNiwgMC4yMzU4MTcyMiwgMC4yMzE3NTAyMiwgMC4yMjc4ODY2NywgMC4yMjQyMTAxNCwgMC4yMjA3MDYwMiwgMC4yMTczNjEyMywKKyAgICAgICAgMC4yMTQxNjQwNiwgMC4yMTExMDM5NywgMC4yMDgxNzE0MSwgMC4yMDUzNTc3OCwgMC4yMDI2NTUyNCwgMC4yMDAwNTY2OCwgMC4xOTc1NTU1ODsKIAotICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXNzZWxfazBlKHgpOwotICAgICAgICAgICAgICAgICB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCBleHBlY3RlZCk7KTsKKyAgICBDQUxMX1NVQlRFU1QocmVzID0gYmVzc2VsX2swZSh4KTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgZXhwZWN0ZWQpOyk7CiAgIH0KIAogICAvLyBUZXN0IEJlc3NlbCBmdW5jdGlvbiBrMC4gUmVmZXJlbmNlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCBTY2lQeS4KQEAgLTIxMCwyNSArMTY0LDE3IEBACiAgICAgQXJyYXlUeXBlIGV4cGVjdGVkKDQyKTsKICAgICBBcnJheVR5cGUgcmVzKDQyKTsKIAotICAgIHggPDwgMC4yNSwgMC41LCAgMS4sICAyLiwgIDMuLCAgNC4sICA1LiwgIDYuLCAgNy4sICA4LiwgIDkuLCAxMC4sIDExLiwgMTIuLAotICAgICAgIDEzLiwgMTQuLCAxNS4sIDE2LiwgMTcuLCAxOC4sIDE5LiwgMjAuLCAyMS4sIDIyLiwgMjMuLCAyNC4sIDI1LiwKLSAgICAgICAyNi4sIDI3LiwgMjguLCAyOS4sIDMwLiwgMzEuLCAzMi4sIDMzLiwgMzQuLCAzNS4sIDM2LiwgMzcuLCAzOC4sCi0gICAgICAgMzkuLCA0MC47CisgICAgeCA8PCAwLjI1LCAwLjUsIDEuLCAyLiwgMy4sIDQuLCA1LiwgNi4sIDcuLCA4LiwgOS4sIDEwLiwgMTEuLCAxMi4sIDEzLiwgMTQuLCAxNS4sIDE2LiwgMTcuLCAxOC4sIDE5LiwgMjAuLCAyMS4sIDIyLiwKKyAgICAgICAgMjMuLCAyNC4sIDI1LiwgMjYuLCAyNy4sIDI4LiwgMjkuLCAzMC4sIDMxLiwgMzIuLCAzMy4sIDM0LiwgMzUuLCAzNi4sIDM3LiwgMzguLCAzOS4sIDQwLjsKIAotICAgIGV4cGVjdGVkIDw8IDEuNTQxNTA2NzUsIDAuOTI0NDE5MDcsIDQuMjEwMjQ0MzhlLTAxLCAxLjEzODkzODczZS0wMSwKLSAgICAgICAgICAgICAzLjQ3Mzk1MDQ0ZS0wMiwgMS4xMTU5Njc2MWUtMDIsIDMuNjkxMDk4MzNlLTAzLCAxLjI0Mzk5NDMzZS0wMywKLSAgICAgICAgICAgICA0LjI0Nzk1NzQyZS0wNCwgMS40NjQ3MDcwNWUtMDQsIDUuMDg4MTMxMzBlLTA1LCAxLjc3ODAwNjIzZS0wNSwKLSAgICAgICAgICAgICA2LjI0MzAyMDU1ZS0wNiwgMi4yMDA4MjU0MGUtMDYsIDcuNzg0NTQzODZlLTA3LCAyLjc2MTM3MDgyZS0wNywKLSAgICAgICAgICAgICA5LjgxOTUzNjQ4ZS0wOCwgMy40OTk0MTE2NmUtMDgsIDEuMjQ5NDY2NDBlLTA4LCA0LjQ2ODc1MzM0ZS0wOSwKLSAgICAgICAgICAgICAxLjYwMDY3MTI5ZS0wOSwgNS43NDEyMzc4MmUtMTAsIDIuMDYxNzY3OTdlLTEwLCA3LjQxMjM1MTYxZS0xMSwKLSAgICAgICAgICAgICAyLjY2NzU0NTExZS0xMSwgOS42MDg4MTg3OGUtMTIsIDMuNDY0MTYxNTZlLTEyLCAxLjI0OTg3NzQwZS0xMiwKLSAgICAgICAgICAgICA0LjUxMjg2NDUzZS0xMywgMS42MzA1MzQ1OWUtMTMsIDUuODk0OTUwNzNlLTE0LCAyLjEzMjQ3NzUwZS0xNCwKLSAgICAgICAgICAgICA3LjcxODM4MjY2ZS0xNSwgMi43OTUwNTc1MmUtMTUsIDEuMDEyNjYxMjNlLTE1LCAzLjY3MDU3NTk3ZS0xNiwKLSAgICAgICAgICAgICAxLjMzMTAzNTE1ZS0xNiwgNC44Mjg1ODMzOGUtMTcsIDEuNzUyMzI3NzBlLTE3LCA2LjM2MTYxNzE2ZS0xOCwKLSAgICAgICAgICAgICAyLjMxMDI5OTM2ZS0xOCwgOC4zOTI4NjExMGUtMTk7CisgICAgZXhwZWN0ZWQgPDwgMS41NDE1MDY3NSwgMC45MjQ0MTkwNywgNC4yMTAyNDQzOGUtMDEsIDEuMTM4OTM4NzNlLTAxLCAzLjQ3Mzk1MDQ0ZS0wMiwgMS4xMTU5Njc2MWUtMDIsIDMuNjkxMDk4MzNlLTAzLAorICAgICAgICAxLjI0Mzk5NDMzZS0wMywgNC4yNDc5NTc0MmUtMDQsIDEuNDY0NzA3MDVlLTA0LCA1LjA4ODEzMTMwZS0wNSwgMS43NzgwMDYyM2UtMDUsIDYuMjQzMDIwNTVlLTA2LCAyLjIwMDgyNTQwZS0wNiwKKyAgICAgICAgNy43ODQ1NDM4NmUtMDcsIDIuNzYxMzcwODJlLTA3LCA5LjgxOTUzNjQ4ZS0wOCwgMy40OTk0MTE2NmUtMDgsIDEuMjQ5NDY2NDBlLTA4LCA0LjQ2ODc1MzM0ZS0wOSwgMS42MDA2NzEyOWUtMDksCisgICAgICAgIDUuNzQxMjM3ODJlLTEwLCAyLjA2MTc2Nzk3ZS0xMCwgNy40MTIzNTE2MWUtMTEsIDIuNjY3NTQ1MTFlLTExLCA5LjYwODgxODc4ZS0xMiwgMy40NjQxNjE1NmUtMTIsIDEuMjQ5ODc3NDBlLTEyLAorICAgICAgICA0LjUxMjg2NDUzZS0xMywgMS42MzA1MzQ1OWUtMTMsIDUuODk0OTUwNzNlLTE0LCAyLjEzMjQ3NzUwZS0xNCwgNy43MTgzODI2NmUtMTUsIDIuNzk1MDU3NTJlLTE1LCAxLjAxMjY2MTIzZS0xNSwKKyAgICAgICAgMy42NzA1NzU5N2UtMTYsIDEuMzMxMDM1MTVlLTE2LCA0LjgyODU4MzM4ZS0xNywgMS43NTIzMjc3MGUtMTcsIDYuMzYxNjE3MTZlLTE4LCAyLjMxMDI5OTM2ZS0xOCwgOC4zOTI4NjExMGUtMTk7CiAKLSAgICBDQUxMX1NVQlRFU1QocmVzID0gYmVzc2VsX2swKHgpOwotICAgICAgICAgICAgICAgICB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCBleHBlY3RlZCk7KTsKKyAgICBDQUxMX1NVQlRFU1QocmVzID0gYmVzc2VsX2swKHgpOyB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCBleHBlY3RlZCk7KTsKICAgfQogCiAgIC8vIFRlc3QgQmVzc2VsIGZ1bmN0aW9uIGswZS4gUmVmZXJlbmNlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCBTY2lQeS4KQEAgLTIzNywyNSArMTgzLDE2IEBACiAgICAgQXJyYXlUeXBlIGV4cGVjdGVkKDQyKTsKICAgICBBcnJheVR5cGUgcmVzKDQyKTsKIAotICAgIHggPDwgMC4yNSwgMC41LCAgMS4sICAyLiwgIDMuLCAgNC4sICA1LiwgIDYuLCAgNy4sICA4LiwgIDkuLCAxMC4sIDExLiwgMTIuLAotICAgICAgIDEzLiwgMTQuLCAxNS4sIDE2LiwgMTcuLCAxOC4sIDE5LiwgMjAuLCAyMS4sIDIyLiwgMjMuLCAyNC4sIDI1LiwKLSAgICAgICAyNi4sIDI3LiwgMjguLCAyOS4sIDMwLiwgMzEuLCAzMi4sIDMzLiwgMzQuLCAzNS4sIDM2LiwgMzcuLCAzOC4sCi0gICAgICAgMzkuLCA0MC47CisgICAgeCA8PCAwLjI1LCAwLjUsIDEuLCAyLiwgMy4sIDQuLCA1LiwgNi4sIDcuLCA4LiwgOS4sIDEwLiwgMTEuLCAxMi4sIDEzLiwgMTQuLCAxNS4sIDE2LiwgMTcuLCAxOC4sIDE5LiwgMjAuLCAyMS4sIDIyLiwKKyAgICAgICAgMjMuLCAyNC4sIDI1LiwgMjYuLCAyNy4sIDI4LiwgMjkuLCAzMC4sIDMxLiwgMzIuLCAzMy4sIDM0LiwgMzUuLCAzNi4sIDM3LiwgMzguLCAzOS4sIDQwLjsKIAotICAgIGV4cGVjdGVkIDw8IDEuOTc5MzMzODUsIDEuNTI0MTA5MzksIDEuMTQ0NDYzMDgsIDAuODQxNTY4MjIsCi0gICAgICAgICAgICAgMC42OTc3NjE2ICwgMC42MDkyOTc2NywgMC41NDc4MDc1NiwgMC41MDE4NjMxMywKLSAgICAgICAgICAgICAwLjQ2NTg0NTEgLCAwLjQzNjYyMzAyLCAwLjQxMjI5NTU1LCAwLjM5MTYzMTkzLAotICAgICAgICAgICAgIDAuMzczNzk1NSAsIDAuMzU4MTk0ODgsIDAuMzQ0Mzk4NjUsIDAuMzMyMDgzNjQsCi0gICAgICAgICAgICAgMC4zMjEwMDIzNSwgMC4zMTA5NjE1OSwgMC4zMDE4MDgwMiwgMC4yOTM0MTgyMSwKLSAgICAgICAgICAgICAwLjI4NTY5MTQ5LCAwLjI3ODU0NDg4LCAwLjI3MTkwOTIgLCAwLjI2NTcyNjM1LAotICAgICAgICAgICAgIDAuMjU5OTQ3MDMsIDAuMjU0NTI5MTcsIDAuMjQ5NDM2NiAsIDAuMjQ0NjM4MDEsCi0gICAgICAgICAgICAgMC4yNDAxMDYxNiwgMC4yMzU4MTcyMiwgMC4yMzE3NTAyMiwgMC4yMjc4ODY2NywKLSAgICAgICAgICAgICAwLjIyNDIxMDE0LCAwLjIyMDcwNjAyLCAwLjIxNzM2MTIzLCAwLjIxNDE2NDA2LAotICAgICAgICAgICAgIDAuMjExMTAzOTcsIDAuMjA4MTcxNDEsIDAuMjA1MzU3NzgsIDAuMjAyNjU1MjQsCi0gICAgICAgICAgICAgMC4yMDAwNTY2OCwgMC4xOTc1NTU1ODsKKyAgICBleHBlY3RlZCA8PCAxLjk3OTMzMzg1LCAxLjUyNDEwOTM5LCAxLjE0NDQ2MzA4LCAwLjg0MTU2ODIyLCAwLjY5Nzc2MTYsIDAuNjA5Mjk3NjcsIDAuNTQ3ODA3NTYsIDAuNTAxODYzMTMsCisgICAgICAgIDAuNDY1ODQ1MSwgMC40MzY2MjMwMiwgMC40MTIyOTU1NSwgMC4zOTE2MzE5MywgMC4zNzM3OTU1LCAwLjM1ODE5NDg4LCAwLjM0NDM5ODY1LCAwLjMzMjA4MzY0LCAwLjMyMTAwMjM1LAorICAgICAgICAwLjMxMDk2MTU5LCAwLjMwMTgwODAyLCAwLjI5MzQxODIxLCAwLjI4NTY5MTQ5LCAwLjI3ODU0NDg4LCAwLjI3MTkwOTIsIDAuMjY1NzI2MzUsIDAuMjU5OTQ3MDMsIDAuMjU0NTI5MTcsCisgICAgICAgIDAuMjQ5NDM2NiwgMC4yNDQ2MzgwMSwgMC4yNDAxMDYxNiwgMC4yMzU4MTcyMiwgMC4yMzE3NTAyMiwgMC4yMjc4ODY2NywgMC4yMjQyMTAxNCwgMC4yMjA3MDYwMiwgMC4yMTczNjEyMywKKyAgICAgICAgMC4yMTQxNjQwNiwgMC4yMTExMDM5NywgMC4yMDgxNzE0MSwgMC4yMDUzNTc3OCwgMC4yMDI2NTUyNCwgMC4yMDAwNTY2OCwgMC4xOTc1NTU1ODsKIAotICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXNzZWxfazBlKHgpOwotICAgICAgICAgICAgICAgICB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCBleHBlY3RlZCk7KTsKKyAgICBDQUxMX1NVQlRFU1QocmVzID0gYmVzc2VsX2swZSh4KTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgZXhwZWN0ZWQpOyk7CiAgIH0KIAogICAvLyBUZXN0IEJlc3NlbCBmdW5jdGlvbiBrMS4gUmVmZXJlbmNlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCBTY2lQeS4KQEAgLTI2NCwyNSArMjAxLDE3IEBACiAgICAgQXJyYXlUeXBlIGV4cGVjdGVkKDQyKTsKICAgICBBcnJheVR5cGUgcmVzKDQyKTsKIAotICAgIHggPDwgMC4yNSwgMC41LCAgMS4sICAyLiwgIDMuLCAgNC4sICA1LiwgIDYuLCAgNy4sICA4LiwgIDkuLCAxMC4sIDExLiwgMTIuLAotICAgICAgIDEzLiwgMTQuLCAxNS4sIDE2LiwgMTcuLCAxOC4sIDE5LiwgMjAuLCAyMS4sIDIyLiwgMjMuLCAyNC4sIDI1LiwKLSAgICAgICAyNi4sIDI3LiwgMjguLCAyOS4sIDMwLiwgMzEuLCAzMi4sIDMzLiwgMzQuLCAzNS4sIDM2LiwgMzcuLCAzOC4sCi0gICAgICAgMzkuLCA0MC47CisgICAgeCA8PCAwLjI1LCAwLjUsIDEuLCAyLiwgMy4sIDQuLCA1LiwgNi4sIDcuLCA4LiwgOS4sIDEwLiwgMTEuLCAxMi4sIDEzLiwgMTQuLCAxNS4sIDE2LiwgMTcuLCAxOC4sIDE5LiwgMjAuLCAyMS4sIDIyLiwKKyAgICAgICAgMjMuLCAyNC4sIDI1LiwgMjYuLCAyNy4sIDI4LiwgMjkuLCAzMC4sIDMxLiwgMzIuLCAzMy4sIDM0LiwgMzUuLCAzNi4sIDM3LiwgMzguLCAzOS4sIDQwLjsKIAotICAgIGV4cGVjdGVkIDw8IDMuNzQ3MDI1OTcsIDEuNjU2NDQxMTIsIDYuMDE5MDcyMzBlLTAxLCAxLjM5ODY1ODgyZS0wMSwKLSAgICAgICAgICAgICA0LjAxNTY0MzExZS0wMiwgMS4yNDgzNDk4OWUtMDIsIDQuMDQ0NjEzNDVlLTAzLCAxLjM0MzkxOTcyZS0wMywKLSAgICAgICAgICAgICA0LjU0MTgyNDg3ZS0wNCwgMS41NTM2OTIxMmUtMDQsIDUuMzYzNzAxNjRlLTA1LCAxLjg2NDg3NzM1ZS0wNSwKLSAgICAgICAgICAgICA2LjUyMDg2MDY3ZS0wNiwgMi4yOTA3NTc0NmUtMDYsIDguMDc4NTg4NDFlLTA3LCAyLjg1ODM0MzY1ZS0wNywKLSAgICAgICAgICAgICAxLjAxNDE3Mjk0ZS0wNywgMy42MDcxNTcxMmUtMDgsIDEuMjg1NzA0MTdlLTA4LCA0LjU5MTI0OTYzZS0wOSwKLSAgICAgICAgICAgICAxLjY0MjI2Njk3ZS0wOSwgNS44ODMwNTc5N2UtMTAsIDIuMTEwMjk5MjJlLTEwLCA3LjU3ODk4MTE2ZS0xMSwKLSAgICAgICAgICAgICAyLjcyNDkzMDU5ZS0xMSwgOS44MDY5OTg5M2UtMTIsIDMuNTMyNzc4MDdlLTEyLCAxLjI3MzY5MDc4ZS0xMiwKLSAgICAgICAgICAgICA0LjU5NTY4OTQwZS0xMywgMS42NTk0MDAxMWUtMTMsIDUuOTk1NzQwMzJlLTE0LCAyLjE2NzczMjAwZS0xNCwKLSAgICAgICAgICAgICA3Ljg0MTg5OTYwZS0xNSwgMi44MzgzOTkyN2UtMTUsIDEuMDI3ODkxNzFlLTE1LCAzLjcyNDE2OTI5ZS0xNiwKLSAgICAgICAgICAgICAxLjM0OTkxNzgzZS0xNiwgNC44OTUxOTM3M2UtMTcsIDEuNzc1ODUxOTZlLTE3LCA2LjQ0NDc4NTg4ZS0xOCwKLSAgICAgICAgICAgICAyLjMzOTczMzQwZS0xOCwgOC40OTcxMzE5NWUtMTk7CisgICAgZXhwZWN0ZWQgPDwgMy43NDcwMjU5NywgMS42NTY0NDExMiwgNi4wMTkwNzIzMGUtMDEsIDEuMzk4NjU4ODJlLTAxLCA0LjAxNTY0MzExZS0wMiwgMS4yNDgzNDk4OWUtMDIsIDQuMDQ0NjEzNDVlLTAzLAorICAgICAgICAxLjM0MzkxOTcyZS0wMywgNC41NDE4MjQ4N2UtMDQsIDEuNTUzNjkyMTJlLTA0LCA1LjM2MzcwMTY0ZS0wNSwgMS44NjQ4NzczNWUtMDUsIDYuNTIwODYwNjdlLTA2LCAyLjI5MDc1NzQ2ZS0wNiwKKyAgICAgICAgOC4wNzg1ODg0MWUtMDcsIDIuODU4MzQzNjVlLTA3LCAxLjAxNDE3Mjk0ZS0wNywgMy42MDcxNTcxMmUtMDgsIDEuMjg1NzA0MTdlLTA4LCA0LjU5MTI0OTYzZS0wOSwgMS42NDIyNjY5N2UtMDksCisgICAgICAgIDUuODgzMDU3OTdlLTEwLCAyLjExMDI5OTIyZS0xMCwgNy41Nzg5ODExNmUtMTEsIDIuNzI0OTMwNTllLTExLCA5LjgwNjk5ODkzZS0xMiwgMy41MzI3NzgwN2UtMTIsIDEuMjczNjkwNzhlLTEyLAorICAgICAgICA0LjU5NTY4OTQwZS0xMywgMS42NTk0MDAxMWUtMTMsIDUuOTk1NzQwMzJlLTE0LCAyLjE2NzczMjAwZS0xNCwgNy44NDE4OTk2MGUtMTUsIDIuODM4Mzk5MjdlLTE1LCAxLjAyNzg5MTcxZS0xNSwKKyAgICAgICAgMy43MjQxNjkyOWUtMTYsIDEuMzQ5OTE3ODNlLTE2LCA0Ljg5NTE5MzczZS0xNywgMS43NzU4NTE5NmUtMTcsIDYuNDQ0Nzg1ODhlLTE4LCAyLjMzOTczMzQwZS0xOCwgOC40OTcxMzE5NWUtMTk7CiAKLSAgICBDQUxMX1NVQlRFU1QocmVzID0gYmVzc2VsX2sxKHgpOwotICAgICAgICAgICAgICAgICB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCBleHBlY3RlZCk7KTsKKyAgICBDQUxMX1NVQlRFU1QocmVzID0gYmVzc2VsX2sxKHgpOyB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCBleHBlY3RlZCk7KTsKICAgfQogCiAgIC8vIFRlc3QgQmVzc2VsIGZ1bmN0aW9uIGsxZS4gUmVmZXJlbmNlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCBTY2lQeS4KQEAgLTI5MSwyNSArMjIwLDE2IEBACiAgICAgQXJyYXlUeXBlIGV4cGVjdGVkKDQyKTsKICAgICBBcnJheVR5cGUgcmVzKDQyKTsKIAotICAgIHggPDwgMC4yNSwgMC41LCAgMS4sICAyLiwgIDMuLCAgNC4sICA1LiwgIDYuLCAgNy4sICA4LiwgIDkuLCAxMC4sIDExLiwgMTIuLAotICAgICAgIDEzLiwgMTQuLCAxNS4sIDE2LiwgMTcuLCAxOC4sIDE5LiwgMjAuLCAyMS4sIDIyLiwgMjMuLCAyNC4sIDI1LiwKLSAgICAgICAyNi4sIDI3LiwgMjguLCAyOS4sIDMwLiwgMzEuLCAzMi4sIDMzLiwgMzQuLCAzNS4sIDM2LiwgMzcuLCAzOC4sCi0gICAgICAgMzkuLCA0MC47CisgICAgeCA8PCAwLjI1LCAwLjUsIDEuLCAyLiwgMy4sIDQuLCA1LiwgNi4sIDcuLCA4LiwgOS4sIDEwLiwgMTEuLCAxMi4sIDEzLiwgMTQuLCAxNS4sIDE2LiwgMTcuLCAxOC4sIDE5LiwgMjAuLCAyMS4sIDIyLiwKKyAgICAgICAgMjMuLCAyNC4sIDI1LiwgMjYuLCAyNy4sIDI4LiwgMjkuLCAzMC4sIDMxLiwgMzIuLCAzMy4sIDM0LiwgMzUuLCAzNi4sIDM3LiwgMzguLCAzOS4sIDQwLjsKIAotICAgIGV4cGVjdGVkIDw8IDQuODExMjc2NTksIDIuNzMxMDA5NzEsIDEuNjM2MTUzNDksIDEuMDMzNDc2ODUsCi0gICAgICAgICAgICAgMC44MDY1NjM0OCwgMC42ODE1NzU5NSwgMC42MDAyNzM4NiwgMC41NDIxNzU5MSwKLSAgICAgICAgICAgICAwLjQ5ODA3MTU4LCAwLjQ2MzE0OTA5LCAwLjQzNDYyNTI1LCAwLjQxMDc2NjU3LAotICAgICAgICAgICAgIDAuMzkwNDMwOTQsIDAuMzcyODMxNzUsIDAuMzU3NDA3NTcsIDAuMzQzNzQ1NjMsCi0gICAgICAgICAgICAgMC4zMzE1MzQ4OSwgMC4zMjA1MzU5NywgMC4zMTA1NjEyMywgMC4zMDE0NjEzMSwKLSAgICAgICAgICAgICAwLjI5MzExNTU5LCAwLjI4NTQyNTUgLCAwLjI3ODMwOTU4LCAwLjI3MTY5OTg3LAotICAgICAgICAgICAgIDAuMjY1NTM5MTMsIDAuMjU5Nzc4NzksIDAuMjU0Mzc3MzMsIDAuMjQ5Mjk5ICAsCi0gICAgICAgICAgICAgMC4yNDQ1MTI4NSwgMC4yMzk5OTE5MSwgMC4yMzU3MTI2ICwgMC4yMzE2NTQxMywKLSAgICAgICAgICAgICAwLjIyNzc5ODE2LCAwLjIyNDEyODQxLCAwLjIyMDYzMDM2LCAwLjIxNzI5MTAzLAotICAgICAgICAgICAgIDAuMjE0MDk4NzgsIDAuMjExMDQzMTQsIDAuMjA4MTE0NjIsIDAuMjA1MzA0NjYsCi0gICAgICAgICAgICAgMC4yMDI2MDU0NywgMC4yMDAwMDk5NzsKKyAgICBleHBlY3RlZCA8PCA0LjgxMTI3NjU5LCAyLjczMTAwOTcxLCAxLjYzNjE1MzQ5LCAxLjAzMzQ3Njg1LCAwLjgwNjU2MzQ4LCAwLjY4MTU3NTk1LCAwLjYwMDI3Mzg2LCAwLjU0MjE3NTkxLAorICAgICAgICAwLjQ5ODA3MTU4LCAwLjQ2MzE0OTA5LCAwLjQzNDYyNTI1LCAwLjQxMDc2NjU3LCAwLjM5MDQzMDk0LCAwLjM3MjgzMTc1LCAwLjM1NzQwNzU3LCAwLjM0Mzc0NTYzLCAwLjMzMTUzNDg5LAorICAgICAgICAwLjMyMDUzNTk3LCAwLjMxMDU2MTIzLCAwLjMwMTQ2MTMxLCAwLjI5MzExNTU5LCAwLjI4NTQyNTUsIDAuMjc4MzA5NTgsIDAuMjcxNjk5ODcsIDAuMjY1NTM5MTMsIDAuMjU5Nzc4NzksCisgICAgICAgIDAuMjU0Mzc3MzMsIDAuMjQ5Mjk5LCAwLjI0NDUxMjg1LCAwLjIzOTk5MTkxLCAwLjIzNTcxMjYsIDAuMjMxNjU0MTMsIDAuMjI3Nzk4MTYsIDAuMjI0MTI4NDEsIDAuMjIwNjMwMzYsCisgICAgICAgIDAuMjE3MjkxMDMsIDAuMjE0MDk4NzgsIDAuMjExMDQzMTQsIDAuMjA4MTE0NjIsIDAuMjA1MzA0NjYsIDAuMjAyNjA1NDcsIDAuMjAwMDA5OTc7CiAKLSAgICBDQUxMX1NVQlRFU1QocmVzID0gYmVzc2VsX2sxZSh4KTsKLSAgICAgICAgICAgICAgICAgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgZXhwZWN0ZWQpOyk7CisgICAgQ0FMTF9TVUJURVNUKHJlcyA9IGJlc3NlbF9rMWUoeCk7IHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIGV4cGVjdGVkKTspOwogICB9CiAKICAgLy8gVGVzdCBCZXNzZWwgZnVuY3Rpb24geTAuIFJlZmVyZW5jZSByZXN1bHRzIG9idGFpbmVkIHdpdGggU2NpUHkuCkBAIC0zMTgsMjMgKzIzOCwxNiBAQAogICAgIEFycmF5VHlwZSBleHBlY3RlZCg0Mik7CiAgICAgQXJyYXlUeXBlIHJlcyg0Mik7CiAKLSAgICB4IDw8IDAuMjUsIDAuNSwgIDEuLCAgMi4sICAzLiwgIDQuLCAgNS4sICA2LiwgIDcuLCAgOC4sICA5LiwgMTAuLCAxMS4sIDEyLiwKLSAgICAgICAxMy4sIDE0LiwgMTUuLCAxNi4sIDE3LiwgMTguLCAxOS4sIDIwLiwgMjEuLCAyMi4sIDIzLiwgMjQuLCAyNS4sCi0gICAgICAgMjYuLCAyNy4sIDI4LiwgMjkuLCAzMC4sIDMxLiwgMzIuLCAzMy4sIDM0LiwgMzUuLCAzNi4sIDM3LiwgMzguLAotICAgICAgIDM5LiwgNDAuOworICAgIHggPDwgMC4yNSwgMC41LCAxLiwgMi4sIDMuLCA0LiwgNS4sIDYuLCA3LiwgOC4sIDkuLCAxMC4sIDExLiwgMTIuLCAxMy4sIDE0LiwgMTUuLCAxNi4sIDE3LiwgMTguLCAxOS4sIDIwLiwgMjEuLCAyMi4sCisgICAgICAgIDIzLiwgMjQuLCAyNS4sIDI2LiwgMjcuLCAyOC4sIDI5LiwgMzAuLCAzMS4sIDMyLiwgMzMuLCAzNC4sIDM1LiwgMzYuLCAzNy4sIDM4LiwgMzkuLCA0MC47CiAKLSAgICBleHBlY3RlZCA8PCAtMC45MzE1NzMwMiwgLTAuNDQ0NTE4NzMsIDAuMDg4MjU2OTYsICAwLjUxMDM3NTY3LCAgMC4zNzY4NTAwMSwKLSAgICAgICAgICAgICAtMC4wMTY5NDA3NCwgLTAuMzA4NTE3NjMsIC0wLjI4ODE5NDY4LCAtMC4wMjU5NDk3NCwgIDAuMjIzNTIxNDksCi0gICAgICAgICAgICAgMC4yNDk5MzY3ICwgIDAuMDU1NjcxMTcsIC0wLjE2ODg0NzMyLCAtMC4yMjUyMzczMSwgLTAuMDc4MjA3ODYsCi0gICAgICAgICAgICAgMC4xMjcxOTI1NywgIDAuMjA1NDY0MyAsIDAuMDk1ODExICAsIC0wLjA5MjYzNzIgLCAtMC4xODc1NTIxNiwKLSAgICAgICAgICAgICAtMC4xMDk1MTk2OSwgIDAuMDYyNjQwNiAsIDAuMTcwMjAxNzYsICAwLjExOTg4NzYgLCAtMC4wMzU5ODE3OSwKLSAgICAgICAgICAgICAtMC4xNTI4MzQwMywgLTAuMTI3MjQ5NDMsIDAuMDEyMDQ0NjMsICAwLjEzNTIxNDk4LCAgMC4xMzE4MzY0NywKLSAgICAgICAgICAgICAwLjAwOTQ4MTE2LCAtMC4xMTcyOTU3MywgLTAuMTMzODMyNjYsIC0wLjAyODc0MjQ4LCAgMC4wOTkxMzQ4MywKLSAgICAgICAgICAgICAwLjEzMzQwNDA1LCAgMC4wNDU3OTc5OSwgLTAuMDgwODU2MDksIC0wLjEzMDcxNDg4LCAtMC4wNjA2NjA3NiwKLSAgICAgICAgICAgICAwLjA2MjYyMzUzLCAgMC4xMjU5MzY0MjsKKyAgICBleHBlY3RlZCA8PCAtMC45MzE1NzMwMiwgLTAuNDQ0NTE4NzMsIDAuMDg4MjU2OTYsIDAuNTEwMzc1NjcsIDAuMzc2ODUwMDEsIC0wLjAxNjk0MDc0LCAtMC4zMDg1MTc2MywgLTAuMjg4MTk0NjgsCisgICAgICAgIC0wLjAyNTk0OTc0LCAwLjIyMzUyMTQ5LCAwLjI0OTkzNjcsIDAuMDU1NjcxMTcsIC0wLjE2ODg0NzMyLCAtMC4yMjUyMzczMSwgLTAuMDc4MjA3ODYsIDAuMTI3MTkyNTcsIDAuMjA1NDY0MywKKyAgICAgICAgMC4wOTU4MTEsIC0wLjA5MjYzNzIsIC0wLjE4NzU1MjE2LCAtMC4xMDk1MTk2OSwgMC4wNjI2NDA2LCAwLjE3MDIwMTc2LCAwLjExOTg4NzYsIC0wLjAzNTk4MTc5LCAtMC4xNTI4MzQwMywKKyAgICAgICAgLTAuMTI3MjQ5NDMsIDAuMDEyMDQ0NjMsIDAuMTM1MjE0OTgsIDAuMTMxODM2NDcsIDAuMDA5NDgxMTYsIC0wLjExNzI5NTczLCAtMC4xMzM4MzI2NiwgLTAuMDI4NzQyNDgsIDAuMDk5MTM0ODMsCisgICAgICAgIDAuMTMzNDA0MDUsIDAuMDQ1Nzk3OTksIC0wLjA4MDg1NjA5LCAtMC4xMzA3MTQ4OCwgLTAuMDYwNjYwNzYsIDAuMDYyNjIzNTMsIDAuMTI1OTM2NDI7CiAKLSAgICBDQUxMX1NVQlRFU1QocmVzID0gYmVzc2VsX3kwKHgpOwotICAgICAgICAgICAgICAgICB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCBleHBlY3RlZCk7KTsKKyAgICBDQUxMX1NVQlRFU1QocmVzID0gYmVzc2VsX3kwKHgpOyB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCBleHBlY3RlZCk7KTsKICAgfQogCiAgIC8vIFRlc3QgQmVzc2VsIGZ1bmN0aW9uIHkxLiBSZWZlcmVuY2UgcmVzdWx0cyBvYnRhaW5lZCB3aXRoIFNjaVB5LgpAQCAtMzQzLDI4ICsyNTYsMjAgQEAKICAgICBBcnJheVR5cGUgZXhwZWN0ZWQoNDIpOwogICAgIEFycmF5VHlwZSByZXMoNDIpOwogCi0gICAgeCA8PCAwLjI1LCAwLjUsICAxLiwgIDIuLCAgMy4sICA0LiwgIDUuLCAgNi4sICA3LiwgIDguLCAgOS4sIDEwLiwgMTEuLCAxMi4sCi0gICAgICAgMTMuLCAxNC4sIDE1LiwgMTYuLCAxNy4sIDE4LiwgMTkuLCAyMC4sIDIxLiwgMjIuLCAyMy4sIDI0LiwgMjUuLAotICAgICAgIDI2LiwgMjcuLCAyOC4sIDI5LiwgMzAuLCAzMS4sIDMyLiwgMzMuLCAzNC4sIDM1LiwgMzYuLCAzNy4sIDM4LiwKLSAgICAgICAzOS4sIDQwLjsKKyAgICB4IDw8IDAuMjUsIDAuNSwgMS4sIDIuLCAzLiwgNC4sIDUuLCA2LiwgNy4sIDguLCA5LiwgMTAuLCAxMS4sIDEyLiwgMTMuLCAxNC4sIDE1LiwgMTYuLCAxNy4sIDE4LiwgMTkuLCAyMC4sIDIxLiwgMjIuLAorICAgICAgICAyMy4sIDI0LiwgMjUuLCAyNi4sIDI3LiwgMjguLCAyOS4sIDMwLiwgMzEuLCAzMi4sIDMzLiwgMzQuLCAzNS4sIDM2LiwgMzcuLCAzOC4sIDM5LiwgNDAuOwogCi0gICAgZXhwZWN0ZWQgPDwgLTIuNzA0MTA1MjMsIC0xLjQ3MTQ3MjM5LCAtMC43ODEyMTI4MiwgLTAuMTA3MDMyNDMsCi0gICAgICAgICAgICAgMC4zMjQ2NzQ0MiwgIDAuMzk3OTI1NzEsICAwLjE0Nzg2MzE0LCAtMC4xNzUwMTAzNCwgLTAuMzAyNjY3MjQsCi0gICAgICAgICAgICAgLTAuMTU4MDYwNDYsICAwLjEwNDMxNDU4LCAgMC4yNDkwMTU0MiwgMC4xNjM3MDU1NCwgLTAuMDU3MDk5MjIsCi0gICAgICAgICAgICAgLTAuMjEwMDgxNDEsIC0wLjE2NjY0NDg0LCAgMC4wMjEwNzM2MywgMC4xNzc5NzUxNywgIDAuMTY3MjA1MDQsCi0gICAgICAgICAgICAgMC4wMDgxNTUxMywgLTAuMTQ5NTYwMTEsIC0wLjE2NTUxMTYxLCAtMC4wMzI1MzkyNiwgIDAuMTIzNDA1ODYsCi0gICAgICAgICAgICAgMC4xNjE2NjkyICwgIDAuMDUzMDU5NzgsIC0wLjA5ODgyOTk2LCAtMC4xNTU3OTY1NSwgLTAuMDcwMjUxMjQsCi0gICAgICAgICAgICAgMC4wNzU1MjIxMywgIDAuMTQ4MDM0MTIsICAwLjA4NDQyNTU3LCAtMC4wNTMzNzI4MywgLTAuMTM4NTQ0ODMsCi0gICAgICAgICAgICAgLTAuMDk1NzgwMTIsICAwLjAzMjM4NTg4LCAgMC4xMjc1MTI3MywgMC4xMDQ0NTQ3NywgLTAuMDEyNjI5NDYsCi0gICAgICAgICAgICAgLTAuMTE1MTQwNjYsIC0wLjExMDU2NDExLCAtMC4wMDU3OTM1MTsKKyAgICBleHBlY3RlZCA8PCAtMi43MDQxMDUyMywgLTEuNDcxNDcyMzksIC0wLjc4MTIxMjgyLCAtMC4xMDcwMzI0MywgMC4zMjQ2NzQ0MiwgMC4zOTc5MjU3MSwgMC4xNDc4NjMxNCwgLTAuMTc1MDEwMzQsCisgICAgICAgIC0wLjMwMjY2NzI0LCAtMC4xNTgwNjA0NiwgMC4xMDQzMTQ1OCwgMC4yNDkwMTU0MiwgMC4xNjM3MDU1NCwgLTAuMDU3MDk5MjIsIC0wLjIxMDA4MTQxLCAtMC4xNjY2NDQ4NCwgMC4wMjEwNzM2MywKKyAgICAgICAgMC4xNzc5NzUxNywgMC4xNjcyMDUwNCwgMC4wMDgxNTUxMywgLTAuMTQ5NTYwMTEsIC0wLjE2NTUxMTYxLCAtMC4wMzI1MzkyNiwgMC4xMjM0MDU4NiwgMC4xNjE2NjkyLCAwLjA1MzA1OTc4LAorICAgICAgICAtMC4wOTg4Mjk5NiwgLTAuMTU1Nzk2NTUsIC0wLjA3MDI1MTI0LCAwLjA3NTUyMjEzLCAwLjE0ODAzNDEyLCAwLjA4NDQyNTU3LCAtMC4wNTMzNzI4MywgLTAuMTM4NTQ0ODMsCisgICAgICAgIC0wLjA5NTc4MDEyLCAwLjAzMjM4NTg4LCAwLjEyNzUxMjczLCAwLjEwNDQ1NDc3LCAtMC4wMTI2Mjk0NiwgLTAuMTE1MTQwNjYsIC0wLjExMDU2NDExLCAtMC4wMDU3OTM1MTsKIAotICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXNzZWxfeTEoeCk7Ci0gICAgICAgICAgICAgICAgIHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIGV4cGVjdGVkKTspOworICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXNzZWxfeTEoeCk7IHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIGV4cGVjdGVkKTspOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChiZXNzZWxfZnVuY3Rpb25zKQoteworRUlHRU5fREVDTEFSRV9URVNUKGJlc3NlbF9mdW5jdGlvbnMpIHsKICAgQ0FMTF9TVUJURVNUXzEoYXJyYXlfYmVzc2VsX2Z1bmN0aW9uczxBcnJheVhmPigpKTsKICAgQ0FMTF9TVUJURVNUXzIoYXJyYXlfYmVzc2VsX2Z1bmN0aW9uczxBcnJheVhkPigpKTsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvYmljZ3N0YWJsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvYmljZ3N0YWJsLmNwcAppbmRleCAzMDI4NDhjLi40NzYxZTM5IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2JpY2dzdGFibC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9iaWNnc3RhYmwuY3BwCkBAIC0xMSwyMSArMTEsMjAgQEAKICNpbmNsdWRlICIuLi8uLi90ZXN0L3NwYXJzZV9zb2x2ZXIuaCIKICNpbmNsdWRlIDxFaWdlbi9JdGVyYXRpdmVTb2x2ZXJzPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHRlc3RfYmljZ3N0YWJsX1QoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3RfYmljZ3N0YWJsX1QoKSB7CiAgIEJpQ0dTVEFCTDxTcGFyc2VNYXRyaXg8VD4sIERpYWdvbmFsUHJlY29uZGl0aW9uZXI8VD4gPiBiaWNnc3RhYmxfY29sbWFqb3JfZGlhZzsKLSAgQmlDR1NUQUJMPFNwYXJzZU1hdHJpeDxUPiwgSW5jb21wbGV0ZUxVVDxUPiA+ICAgICAgICAgICBiaWNnc3RhYmxfY29sbWFqb3JfaWx1dDsKKyAgQmlDR1NUQUJMPFNwYXJzZU1hdHJpeDxUPiwgSW5jb21wbGV0ZUxVVDxUPiA+IGJpY2dzdGFibF9jb2xtYWpvcl9pbHV0OwogCi0gIC8vVGhpcyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHRvbGVyYW5jZSBvZiB0aGUgdGVzdCwgb25seSB0aGUgdG9sZXJhbmNlIG9mIHRoZSBzb2x2ZXIuCi0gIGJpY2dzdGFibF9jb2xtYWpvcl9kaWFnLnNldFRvbGVyYW5jZShOdW1UcmFpdHM8VD46OmVwc2lsb24oKSoyMCk7Ci0gIGJpY2dzdGFibF9jb2xtYWpvcl9pbHV0LnNldFRvbGVyYW5jZShOdW1UcmFpdHM8VD46OmVwc2lsb24oKSoyMCk7CisgIC8vIFRoaXMgZG9lcyBub3QgY2hhbmdlIHRoZSB0b2xlcmFuY2Ugb2YgdGhlIHRlc3QsIG9ubHkgdGhlIHRvbGVyYW5jZSBvZiB0aGUgc29sdmVyLgorICBiaWNnc3RhYmxfY29sbWFqb3JfZGlhZy5zZXRUb2xlcmFuY2UoTnVtVHJhaXRzPFQ+OjplcHNpbG9uKCkgKiAyMCk7CisgIGJpY2dzdGFibF9jb2xtYWpvcl9pbHV0LnNldFRvbGVyYW5jZShOdW1UcmFpdHM8VD46OmVwc2lsb24oKSAqIDIwKTsKIAotICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhiaWNnc3RhYmxfY29sbWFqb3JfZGlhZykgICk7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGJpY2dzdGFibF9jb2xtYWpvcl9pbHV0KSAgICAgKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhiaWNnc3RhYmxfY29sbWFqb3JfZGlhZykpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGJpY2dzdGFibF9jb2xtYWpvcl9pbHV0KSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChiaWNnc3RhYmwpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoYmljZ3N0YWJsKSB7CiAgIENBTExfU1VCVEVTVF8xKHRlc3RfYmljZ3N0YWJsX1Q8ZG91YmxlPigpKTsKICAgQ0FMTF9TVUJURVNUXzIodGVzdF9iaWNnc3RhYmxfVDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KCkpOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYXJnbWF4LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2FyZ21heC5jcHAKaW5kZXggOGJlNjIyYi4uYjg2ZDg0YyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYXJnbWF4LmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9hcmdtYXguY3BwCkBAIC0xMiwyMSArMTIsMjAgQEAKIAogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KIAotdXNpbmcgRWlnZW46OlRlbnNvcjsKIHVzaW5nIEVpZ2VuOjphcnJheTsKIHVzaW5nIEVpZ2VuOjpQYWlyOwordXNpbmcgRWlnZW46OlRlbnNvcjsKIAogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfaW5kZXhfcGFpcnMoKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2luZGV4X3BhaXJzKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogICB0ZW5zb3IgPSAodGVuc29yICsgdGVuc29yLmNvbnN0YW50KDAuNSkpLmxvZygpOwogCi0gIFRlbnNvcjxQYWlyPERlbnNlSW5kZXgsIGZsb2F0PiwgNCwgRGF0YUxheW91dD4gaW5kZXhfcGFpcnMoMiwzLDUsNyk7CisgIFRlbnNvcjxQYWlyPERlbnNlSW5kZXgsIGZsb2F0PiwgNCwgRGF0YUxheW91dD4gaW5kZXhfcGFpcnMoMiwgMywgNSwgNyk7CiAgIGluZGV4X3BhaXJzID0gdGVuc29yLmluZGV4X3BhaXJzKCk7CiAKLSAgZm9yIChEZW5zZUluZGV4IG4gPSAwOyBuIDwgMiozKjUqNzsgKytuKSB7CisgIGZvciAoRGVuc2VJbmRleCBuID0gMDsgbiA8IDIgKiAzICogNSAqIDc7ICsrbikgewogICAgIGNvbnN0IFBhaXI8RGVuc2VJbmRleCwgZmxvYXQ+JiB2ID0gaW5kZXhfcGFpcnMuY29lZmYobik7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHYuZmlyc3QsIG4pOwogICAgIFZFUklGWV9JU19FUVVBTCh2LnNlY29uZCwgdGVuc29yLmNvZWZmKG4pKTsKQEAgLTM0LDM3ICszMywzNCBAQAogfQogCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2luZGV4X3BhaXJzX2RpbSgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcpOworc3RhdGljIHZvaWQgdGVzdF9pbmRleF9wYWlyc19kaW0oKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMsIDUsIDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIHRlbnNvciA9ICh0ZW5zb3IgKyB0ZW5zb3IuY29uc3RhbnQoMC41KSkubG9nKCk7CiAKLSAgVGVuc29yPFBhaXI8RGVuc2VJbmRleCwgZmxvYXQ+LCA0LCBEYXRhTGF5b3V0PiBpbmRleF9wYWlycygyLDMsNSw3KTsKKyAgVGVuc29yPFBhaXI8RGVuc2VJbmRleCwgZmxvYXQ+LCA0LCBEYXRhTGF5b3V0PiBpbmRleF9wYWlycygyLCAzLCA1LCA3KTsKIAogICBpbmRleF9wYWlycyA9IHRlbnNvci5pbmRleF9wYWlycygpOwogCiAgIGZvciAoRWlnZW46OkRlbnNlSW5kZXggbiA9IDA7IG4gPCB0ZW5zb3Iuc2l6ZSgpOyArK24pIHsKLSAgICBjb25zdCBQYWlyPERlbnNlSW5kZXgsIGZsb2F0PiYgdiA9IGluZGV4X3BhaXJzKG4pOyAvLyhpLCBqLCBrLCBsKTsKKyAgICBjb25zdCBQYWlyPERlbnNlSW5kZXgsIGZsb2F0PiYgdiA9IGluZGV4X3BhaXJzKG4pOyAgLy8oaSwgaiwgaywgbCk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHYuZmlyc3QsIG4pOwogICAgIFZFUklGWV9JU19FUVVBTCh2LnNlY29uZCwgdGVuc29yKG4pKTsKICAgfQogfQogCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2FyZ21heF9wYWlyX3JlZHVjZXIoKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKK3N0YXRpYyB2b2lkIHRlc3RfYXJnbWF4X3BhaXJfcmVkdWNlcigpIHsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgNSwgNyk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKICAgdGVuc29yID0gKHRlbnNvciArIHRlbnNvci5jb25zdGFudCgwLjUpKS5sb2coKTsKIAotICBUZW5zb3I8UGFpcjxEZW5zZUluZGV4LCBmbG9hdD4sIDQsIERhdGFMYXlvdXQ+IGluZGV4X3BhaXJzKDIsMyw1LDcpOworICBUZW5zb3I8UGFpcjxEZW5zZUluZGV4LCBmbG9hdD4sIDQsIERhdGFMYXlvdXQ+IGluZGV4X3BhaXJzKDIsIDMsIDUsIDcpOwogICBpbmRleF9wYWlycyA9IHRlbnNvci5pbmRleF9wYWlycygpOwogCiAgIFRlbnNvcjxQYWlyPERlbnNlSW5kZXgsIGZsb2F0PiwgMCwgRGF0YUxheW91dD4gcmVkdWNlZDsKICAgRGltZW5zaW9uTGlzdDxEZW5zZUluZGV4LCA0PiBkaW1zOwotICByZWR1Y2VkID0gaW5kZXhfcGFpcnMucmVkdWNlKAotICAgICAgZGltcywgaW50ZXJuYWw6OkFyZ01heFBhaXJSZWR1Y2VyPFBhaXI8RGVuc2VJbmRleCwgZmxvYXQ+ID4oKSk7CisgIHJlZHVjZWQgPSBpbmRleF9wYWlycy5yZWR1Y2UoZGltcywgaW50ZXJuYWw6OkFyZ01heFBhaXJSZWR1Y2VyPFBhaXI8RGVuc2VJbmRleCwgZmxvYXQ+ID4oKSk7CiAKICAgVGVuc29yPGZsb2F0LCAwLCBEYXRhTGF5b3V0PiBtYXhpID0gdGVuc29yLm1heGltdW0oKTsKIApAQCAtNzMsOCArNjksNyBAQAogICBhcnJheTxEZW5zZUluZGV4LCAzPiByZWR1Y2VfZGltczsKICAgZm9yIChpbnQgZCA9IDA7IGQgPCAzOyArK2QpIHJlZHVjZV9kaW1zW2RdID0gZDsKICAgVGVuc29yPFBhaXI8RGVuc2VJbmRleCwgZmxvYXQ+LCAxLCBEYXRhTGF5b3V0PiByZWR1Y2VkX2J5X2RpbXMoNyk7Ci0gIHJlZHVjZWRfYnlfZGltcyA9IGluZGV4X3BhaXJzLnJlZHVjZSgKLSAgICAgIHJlZHVjZV9kaW1zLCBpbnRlcm5hbDo6QXJnTWF4UGFpclJlZHVjZXI8UGFpcjxEZW5zZUluZGV4LCBmbG9hdD4gPigpKTsKKyAgcmVkdWNlZF9ieV9kaW1zID0gaW5kZXhfcGFpcnMucmVkdWNlKHJlZHVjZV9kaW1zLCBpbnRlcm5hbDo6QXJnTWF4UGFpclJlZHVjZXI8UGFpcjxEZW5zZUluZGV4LCBmbG9hdD4gPigpKTsKIAogICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IG1heF9ieV9kaW1zID0gdGVuc29yLm1heGltdW0ocmVkdWNlX2RpbXMpOwogCkBAIC04NCwxOSArNzksMTcgQEAKIH0KIAogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9hcmdtaW5fcGFpcl9yZWR1Y2VyKCkKLXsKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X2FyZ21pbl9wYWlyX3JlZHVjZXIoKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMsIDUsIDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIHRlbnNvciA9ICh0ZW5zb3IgKyB0ZW5zb3IuY29uc3RhbnQoMC41KSkubG9nKCk7CiAKLSAgVGVuc29yPFBhaXI8RGVuc2VJbmRleCwgZmxvYXQ+LCA0LCBEYXRhTGF5b3V0PiBpbmRleF9wYWlycygyLDMsNSw3KTsKKyAgVGVuc29yPFBhaXI8RGVuc2VJbmRleCwgZmxvYXQ+LCA0LCBEYXRhTGF5b3V0PiBpbmRleF9wYWlycygyLCAzLCA1LCA3KTsKICAgaW5kZXhfcGFpcnMgPSB0ZW5zb3IuaW5kZXhfcGFpcnMoKTsKIAogICBUZW5zb3I8UGFpcjxEZW5zZUluZGV4LCBmbG9hdD4sIDAsIERhdGFMYXlvdXQ+IHJlZHVjZWQ7CiAgIERpbWVuc2lvbkxpc3Q8RGVuc2VJbmRleCwgND4gZGltczsKLSAgcmVkdWNlZCA9IGluZGV4X3BhaXJzLnJlZHVjZSgKLSAgICAgIGRpbXMsIGludGVybmFsOjpBcmdNaW5QYWlyUmVkdWNlcjxQYWlyPERlbnNlSW5kZXgsIGZsb2F0PiA+KCkpOworICByZWR1Y2VkID0gaW5kZXhfcGFpcnMucmVkdWNlKGRpbXMsIGludGVybmFsOjpBcmdNaW5QYWlyUmVkdWNlcjxQYWlyPERlbnNlSW5kZXgsIGZsb2F0PiA+KCkpOwogCiAgIFRlbnNvcjxmbG9hdCwgMCwgRGF0YUxheW91dD4gbWluaSA9IHRlbnNvci5taW5pbXVtKCk7CiAKQEAgLTEwNSw4ICs5OCw3IEBACiAgIGFycmF5PERlbnNlSW5kZXgsIDM+IHJlZHVjZV9kaW1zOwogICBmb3IgKGludCBkID0gMDsgZCA8IDM7ICsrZCkgcmVkdWNlX2RpbXNbZF0gPSBkOwogICBUZW5zb3I8UGFpcjxEZW5zZUluZGV4LCBmbG9hdD4sIDEsIERhdGFMYXlvdXQ+IHJlZHVjZWRfYnlfZGltcyg3KTsKLSAgcmVkdWNlZF9ieV9kaW1zID0gaW5kZXhfcGFpcnMucmVkdWNlKAotICAgICAgcmVkdWNlX2RpbXMsIGludGVybmFsOjpBcmdNaW5QYWlyUmVkdWNlcjxQYWlyPERlbnNlSW5kZXgsIGZsb2F0PiA+KCkpOworICByZWR1Y2VkX2J5X2RpbXMgPSBpbmRleF9wYWlycy5yZWR1Y2UocmVkdWNlX2RpbXMsIGludGVybmFsOjpBcmdNaW5QYWlyUmVkdWNlcjxQYWlyPERlbnNlSW5kZXgsIGZsb2F0PiA+KCkpOwogCiAgIFRlbnNvcjxmbG9hdCwgMSwgRGF0YUxheW91dD4gbWluX2J5X2RpbXMgPSB0ZW5zb3IubWluaW11bShyZWR1Y2VfZGltcyk7CiAKQEAgLTExNiwxMiArMTA4LDExIEBACiB9CiAKIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2FyZ21heCgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcpOworc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfYXJnbWF4KCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogICB0ZW5zb3IgPSAodGVuc29yICsgdGVuc29yLmNvbnN0YW50KDAuNSkpLmxvZygpOwotICB0ZW5zb3IoMCwwLDAsMCkgPSAxMC4wOworICB0ZW5zb3IoMCwgMCwgMCwgMCkgPSAxMC4wOwogCiAgIFRlbnNvcjxEZW5zZUluZGV4LCAwLCBEYXRhTGF5b3V0PiB0ZW5zb3JfYXJnbWF4OwogCkBAIC0xMjksMjAgKzEyMCwxOSBAQAogCiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYXJnbWF4KDApLCAwKTsKIAotICB0ZW5zb3IoMSwyLDQsNikgPSAyMC4wOworICB0ZW5zb3IoMSwgMiwgNCwgNikgPSAyMC4wOwogCiAgIHRlbnNvcl9hcmdtYXggPSB0ZW5zb3IuYXJnbWF4KCk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmdtYXgoMCksIDIqMyo1KjcgLSAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmdtYXgoMCksIDIgKiAzICogNSAqIDcgLSAxKTsKIH0KIAogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfYXJnbWluKCkKLXsKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9hcmdtaW4oKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMsIDUsIDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIHRlbnNvciA9ICh0ZW5zb3IgKyB0ZW5zb3IuY29uc3RhbnQoMC41KSkubG9nKCk7Ci0gIHRlbnNvcigwLDAsMCwwKSA9IC0xMC4wOworICB0ZW5zb3IoMCwgMCwgMCwgMCkgPSAtMTAuMDsKIAogICBUZW5zb3I8RGVuc2VJbmRleCwgMCwgRGF0YUxheW91dD4gdGVuc29yX2FyZ21pbjsKIApAQCAtMTUwLDE4ICsxNDAsMTcgQEAKIAogICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZ21pbigwKSwgMCk7CiAKLSAgdGVuc29yKDEsMiw0LDYpID0gLTIwLjA7CisgIHRlbnNvcigxLCAyLCA0LCA2KSA9IC0yMC4wOwogCiAgIHRlbnNvcl9hcmdtaW4gPSB0ZW5zb3IuYXJnbWluKCk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmdtaW4oMCksIDIqMyo1KjcgLSAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmdtaW4oMCksIDIgKiAzICogNSAqIDcgLSAxKTsKIH0KIAogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9hcmdtYXhfZGltKCkKLXsKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7Ci0gIHN0ZDo6dmVjdG9yPGludD4gZGltcyB7MiwgMywgNSwgN307CitzdGF0aWMgdm9pZCB0ZXN0X2FyZ21heF9kaW0oKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMsIDUsIDcpOworICBzdGQ6OnZlY3RvcjxpbnQ+IGRpbXN7MiwgMywgNSwgN307CiAKICAgZm9yIChpbnQgZGltID0gMDsgZGltIDwgNDsgKytkaW0pIHsKICAgICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CkBAIC0xNzMsNyArMTYyLDEwIEBACiAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgewogICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7Ci0gICAgICAgICAgICBpeFswXSA9IGk7IGl4WzFdID0gajsgaXhbMl0gPSBrOyBpeFszXSA9IGw7CisgICAgICAgICAgICBpeFswXSA9IGk7CisgICAgICAgICAgICBpeFsxXSA9IGo7CisgICAgICAgICAgICBpeFsyXSA9IGs7CisgICAgICAgICAgICBpeFszXSA9IGw7CiAgICAgICAgICAgICBpZiAoaXhbZGltXSAhPSAwKSBjb250aW51ZTsKICAgICAgICAgICAgIC8vIHN1cHBvc2UgZGltID09IDEsIHRoZW4gZm9yIGFsbCBpLCBrLCBsLCBzZXQgdGVuc29yKGksIDAsIGssIGwpID0gMTAuMAogICAgICAgICAgICAgdGVuc29yKGl4KSA9IDEwLjA7CkBAIC0xODQsOCArMTc2LDcgQEAKIAogICAgIHRlbnNvcl9hcmdtYXggPSB0ZW5zb3IuYXJnbWF4KGRpbSk7CiAKLSAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZ21heC5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCgyKjMqNSo3IC8gdGVuc29yLmRpbWVuc2lvbihkaW0pKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmdtYXguc2l6ZSgpLCBwdHJkaWZmX3QoMiAqIDMgKiA1ICogNyAvIHRlbnNvci5kaW1lbnNpb24oZGltKSkpOwogICAgIGZvciAocHRyZGlmZl90IG4gPSAwOyBuIDwgdGVuc29yX2FyZ21heC5zaXplKCk7ICsrbikgewogICAgICAgLy8gRXhwZWN0IG1heCB0byBiZSBpbiB0aGUgZmlyc3QgaW5kZXggb2YgdGhlIHJlZHVjZWQgZGltZW5zaW9uCiAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZ21heC5kYXRhKClbbl0sIDApOwpAQCAtMTk1LDcgKzE4NiwxMCBAQAogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgICAgaXhbMF0gPSBpOyBpeFsxXSA9IGo7IGl4WzJdID0gazsgaXhbM10gPSBsOworICAgICAgICAgICAgaXhbMF0gPSBpOworICAgICAgICAgICAgaXhbMV0gPSBqOworICAgICAgICAgICAgaXhbMl0gPSBrOworICAgICAgICAgICAgaXhbM10gPSBsOwogICAgICAgICAgICAgaWYgKGl4W2RpbV0gIT0gdGVuc29yLmRpbWVuc2lvbihkaW0pIC0gMSkgY29udGludWU7CiAgICAgICAgICAgICAvLyBzdXBwb3NlIGRpbSA9PSAxLCB0aGVuIGZvciBhbGwgaSwgaywgbCwgc2V0IHRlbnNvcihpLCAyLCBrLCBsKSA9IDIwLjAKICAgICAgICAgICAgIHRlbnNvcihpeCkgPSAyMC4wOwpAQCAtMjA2LDggKzIwMCw3IEBACiAKICAgICB0ZW5zb3JfYXJnbWF4ID0gdGVuc29yLmFyZ21heChkaW0pOwogCi0gICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmdtYXguc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QoMiozKjUqNyAvIHRlbnNvci5kaW1lbnNpb24oZGltKSkpOworICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYXJnbWF4LnNpemUoKSwgcHRyZGlmZl90KDIgKiAzICogNSAqIDcgLyB0ZW5zb3IuZGltZW5zaW9uKGRpbSkpKTsKICAgICBmb3IgKHB0cmRpZmZfdCBuID0gMDsgbiA8IHRlbnNvcl9hcmdtYXguc2l6ZSgpOyArK24pIHsKICAgICAgIC8vIEV4cGVjdCBtYXggdG8gYmUgaW4gdGhlIGxhc3QgaW5kZXggb2YgdGhlIHJlZHVjZWQgZGltZW5zaW9uCiAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZ21heC5kYXRhKClbbl0sIHRlbnNvci5kaW1lbnNpb24oZGltKSAtIDEpOwpAQCAtMjE2LDEwICsyMDksOSBAQAogfQogCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2FyZ21pbl9kaW0oKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKLSAgc3RkOjp2ZWN0b3I8aW50PiBkaW1zIHsyLCAzLCA1LCA3fTsKK3N0YXRpYyB2b2lkIHRlc3RfYXJnbWluX2RpbSgpIHsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgNSwgNyk7CisgIHN0ZDo6dmVjdG9yPGludD4gZGltc3syLCAzLCA1LCA3fTsKIAogICBmb3IgKGludCBkaW0gPSAwOyBkaW0gPCA0OyArK2RpbSkgewogICAgIHRlbnNvci5zZXRSYW5kb20oKTsKQEAgLTIzMSw3ICsyMjMsMTAgQEAKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKLSAgICAgICAgICAgIGl4WzBdID0gaTsgaXhbMV0gPSBqOyBpeFsyXSA9IGs7IGl4WzNdID0gbDsKKyAgICAgICAgICAgIGl4WzBdID0gaTsKKyAgICAgICAgICAgIGl4WzFdID0gajsKKyAgICAgICAgICAgIGl4WzJdID0gazsKKyAgICAgICAgICAgIGl4WzNdID0gbDsKICAgICAgICAgICAgIGlmIChpeFtkaW1dICE9IDApIGNvbnRpbnVlOwogICAgICAgICAgICAgLy8gc3VwcG9zZSBkaW0gPT0gMSwgdGhlbiBmb3IgYWxsIGksIGssIGwsIHNldCB0ZW5zb3IoaSwgMCwgaywgbCkgPSAtMTAuMAogICAgICAgICAgICAgdGVuc29yKGl4KSA9IC0xMC4wOwpAQCAtMjQyLDggKzIzNyw3IEBACiAKICAgICB0ZW5zb3JfYXJnbWluID0gdGVuc29yLmFyZ21pbihkaW0pOwogCi0gICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmdtaW4uc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QoMiozKjUqNyAvIHRlbnNvci5kaW1lbnNpb24oZGltKSkpOworICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYXJnbWluLnNpemUoKSwgcHRyZGlmZl90KDIgKiAzICogNSAqIDcgLyB0ZW5zb3IuZGltZW5zaW9uKGRpbSkpKTsKICAgICBmb3IgKHB0cmRpZmZfdCBuID0gMDsgbiA8IHRlbnNvcl9hcmdtaW4uc2l6ZSgpOyArK24pIHsKICAgICAgIC8vIEV4cGVjdCBtaW4gdG8gYmUgaW4gdGhlIGZpcnN0IGluZGV4IG9mIHRoZSByZWR1Y2VkIGRpbWVuc2lvbgogICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmdtaW4uZGF0YSgpW25dLCAwKTsKQEAgLTI1Myw3ICsyNDcsMTAgQEAKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKLSAgICAgICAgICAgIGl4WzBdID0gaTsgaXhbMV0gPSBqOyBpeFsyXSA9IGs7IGl4WzNdID0gbDsKKyAgICAgICAgICAgIGl4WzBdID0gaTsKKyAgICAgICAgICAgIGl4WzFdID0gajsKKyAgICAgICAgICAgIGl4WzJdID0gazsKKyAgICAgICAgICAgIGl4WzNdID0gbDsKICAgICAgICAgICAgIGlmIChpeFtkaW1dICE9IHRlbnNvci5kaW1lbnNpb24oZGltKSAtIDEpIGNvbnRpbnVlOwogICAgICAgICAgICAgLy8gc3VwcG9zZSBkaW0gPT0gMSwgdGhlbiBmb3IgYWxsIGksIGssIGwsIHNldCB0ZW5zb3IoaSwgMiwgaywgbCkgPSAtMjAuMAogICAgICAgICAgICAgdGVuc29yKGl4KSA9IC0yMC4wOwpAQCAtMjY0LDggKzI2MSw3IEBACiAKICAgICB0ZW5zb3JfYXJnbWluID0gdGVuc29yLmFyZ21pbihkaW0pOwogCi0gICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmdtaW4uc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QoMiozKjUqNyAvIHRlbnNvci5kaW1lbnNpb24oZGltKSkpOworICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYXJnbWluLnNpemUoKSwgcHRyZGlmZl90KDIgKiAzICogNSAqIDcgLyB0ZW5zb3IuZGltZW5zaW9uKGRpbSkpKTsKICAgICBmb3IgKHB0cmRpZmZfdCBuID0gMDsgbiA8IHRlbnNvcl9hcmdtaW4uc2l6ZSgpOyArK24pIHsKICAgICAgIC8vIEV4cGVjdCBtaW4gdG8gYmUgaW4gdGhlIGxhc3QgaW5kZXggb2YgdGhlIHJlZHVjZWQgZGltZW5zaW9uCiAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZ21pbi5kYXRhKClbbl0sIHRlbnNvci5kaW1lbnNpb24oZGltKSAtIDEpOwpAQCAtMjczLDggKzI2OSw3IEBACiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9hcmdtYXgpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2FyZ21heCkgewogICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfaW5kZXhfcGFpcnM8Um93TWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfaW5kZXhfcGFpcnM8Q29sTWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9pbmRleF9wYWlyc19kaW08Um93TWFqb3I+KCkpOwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYXJnbWF4X2dwdS5jdSBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2FyZ21heF9ncHUuY3UKaW5kZXggZDlkNWRhNC4uODMwNThiZSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYXJnbWF4X2dwdS5jdQorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9hcmdtYXhfZ3B1LmN1CkBAIC03LDcgKzcsNiBAQAogLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCiAvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KIAotCiAjZGVmaW5lIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQogCiAjZGVmaW5lIEVJR0VOX1VTRV9HUFUKQEAgLTIwLDkgKzE5LDggQEAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKIHRlbXBsYXRlIDxpbnQgTGF5b3V0Pgotdm9pZCB0ZXN0X2dwdV9zaW1wbGVfYXJnbWF4KCkKLXsKLSAgVGVuc29yPGRvdWJsZSwgMywgTGF5b3V0PiBpbihFaWdlbjo6YXJyYXk8RGVuc2VJbmRleCwgMz4oNzIsNTMsOTcpKTsKK3ZvaWQgdGVzdF9ncHVfc2ltcGxlX2FyZ21heCgpIHsKKyAgVGVuc29yPGRvdWJsZSwgMywgTGF5b3V0PiBpbihFaWdlbjo6YXJyYXk8RGVuc2VJbmRleCwgMz4oNzIsIDUzLCA5NykpOwogICBUZW5zb3I8RGVuc2VJbmRleCwgMCwgTGF5b3V0PiBvdXRfbWF4OwogICBUZW5zb3I8RGVuc2VJbmRleCwgMCwgTGF5b3V0PiBvdXRfbWluOwogICBpbi5zZXRSYW5kb20oKTsKQEAgLTQ1LDE4ICs0MywyMCBAQAogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxkb3VibGUsIDMsIExheW91dD4sIEFsaWduZWQgPiBncHVfaW4oZF9pbiwgRWlnZW46OmFycmF5PERlbnNlSW5kZXgsIDM+KDcyLDUzLDk3KSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEZW5zZUluZGV4LCAwLCBMYXlvdXQ+LCBBbGlnbmVkID4gZ3B1X291dF9tYXgoZF9vdXRfbWF4KTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERlbnNlSW5kZXgsIDAsIExheW91dD4sIEFsaWduZWQgPiBncHVfb3V0X21pbihkX291dF9taW4pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZG91YmxlLCAzLCBMYXlvdXQ+LCBBbGlnbmVkPiBncHVfaW4oZF9pbiwgRWlnZW46OmFycmF5PERlbnNlSW5kZXgsIDM+KDcyLCA1MywgOTcpKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERlbnNlSW5kZXgsIDAsIExheW91dD4sIEFsaWduZWQ+IGdwdV9vdXRfbWF4KGRfb3V0X21heCk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEZW5zZUluZGV4LCAwLCBMYXlvdXQ+LCBBbGlnbmVkPiBncHVfb3V0X21pbihkX291dF9taW4pOwogCiAgIGdwdV9vdXRfbWF4LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbi5hcmdtYXgoKTsKICAgZ3B1X291dF9taW4uZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luLmFyZ21pbigpOwogCi0gIGFzc2VydChncHVNZW1jcHlBc3luYyhvdXRfbWF4LmRhdGEoKSwgZF9vdXRfbWF4LCBvdXRfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7Ci0gIGFzc2VydChncHVNZW1jcHlBc3luYyhvdXRfbWluLmRhdGEoKSwgZF9vdXRfbWluLCBvdXRfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CisgIGFzc2VydChncHVNZW1jcHlBc3luYyhvdXRfbWF4LmRhdGEoKSwgZF9vdXRfbWF4LCBvdXRfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0KKyAgICAgICAgIGdwdVN1Y2Nlc3MpOworICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmMob3V0X21pbi5kYXRhKCksIGRfb3V0X21pbiwgb3V0X2J5dGVzLCBncHVNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09CisgICAgICAgICBncHVTdWNjZXNzKTsKICAgYXNzZXJ0KGdwdVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGdwdVN1Y2Nlc3MpOwogCi0gIFZFUklGWV9JU19FUVVBTChvdXRfbWF4KCksIDcyKjUzKjk3IC0gMSk7CisgIFZFUklGWV9JU19FUVVBTChvdXRfbWF4KCksIDcyICogNTMgKiA5NyAtIDEpOwogICBWRVJJRllfSVNfRVFVQUwob3V0X21pbigpLCAwKTsKIAogICBncHVGcmVlKGRfaW4pOwpAQCAtNjUsMTggKzY1LDIwIEBACiB9CiAKIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXZvaWQgdGVzdF9ncHVfYXJnbWF4X2RpbSgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcpOwordm9pZCB0ZXN0X2dwdV9hcmdtYXhfZGltKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgc3RkOjp2ZWN0b3I8aW50PiBkaW1zOwotICBkaW1zLnB1c2hfYmFjaygyKTsgZGltcy5wdXNoX2JhY2soMyk7IGRpbXMucHVzaF9iYWNrKDUpOyBkaW1zLnB1c2hfYmFjayg3KTsKKyAgZGltcy5wdXNoX2JhY2soMik7CisgIGRpbXMucHVzaF9iYWNrKDMpOworICBkaW1zLnB1c2hfYmFjayg1KTsKKyAgZGltcy5wdXNoX2JhY2soNyk7CiAKICAgZm9yIChpbnQgZGltID0gMDsgZGltIDwgNDsgKytkaW0pIHsKICAgICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgICAgdGVuc29yID0gKHRlbnNvciArIHRlbnNvci5jb25zdGFudCgwLjUpKS5sb2coKTsKIAogICAgIGFycmF5PERlbnNlSW5kZXgsIDM+IG91dF9zaGFwZTsKLSAgICBmb3IgKGludCBkID0gMDsgZCA8IDM7ICsrZCkgb3V0X3NoYXBlW2RdID0gKGQgPCBkaW0pID8gZGltc1tkXSA6IGRpbXNbZCsxXTsKKyAgICBmb3IgKGludCBkID0gMDsgZCA8IDM7ICsrZCkgb3V0X3NoYXBlW2RdID0gKGQgPCBkaW0pID8gZGltc1tkXSA6IGRpbXNbZCArIDFdOwogCiAgICAgVGVuc29yPERlbnNlSW5kZXgsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcl9hcmcob3V0X3NoYXBlKTsKIApAQCAtODUsNyArODcsMTAgQEAKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKLSAgICAgICAgICAgIGl4WzBdID0gaTsgaXhbMV0gPSBqOyBpeFsyXSA9IGs7IGl4WzNdID0gbDsKKyAgICAgICAgICAgIGl4WzBdID0gaTsKKyAgICAgICAgICAgIGl4WzFdID0gajsKKyAgICAgICAgICAgIGl4WzJdID0gazsKKyAgICAgICAgICAgIGl4WzNdID0gbDsKICAgICAgICAgICAgIGlmIChpeFtkaW1dICE9IDApIGNvbnRpbnVlOwogICAgICAgICAgICAgLy8gc3VwcG9zZSBkaW0gPT0gMSwgdGhlbiBmb3IgYWxsIGksIGssIGwsIHNldCB0ZW5zb3IoaSwgMCwgaywgbCkgPSAxMC4wCiAgICAgICAgICAgICB0ZW5zb3IoaXgpID0gMTAuMDsKQEAgLTEwNywxNiArMTEyLDE3IEBACiAgICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCi0gICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiwgQWxpZ25lZCA+IGdwdV9pbihkX2luLCBFaWdlbjo6YXJyYXk8RGVuc2VJbmRleCwgND4oMiwgMywgNSwgNykpOwotICAgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEZW5zZUluZGV4LCAzLCBEYXRhTGF5b3V0PiwgQWxpZ25lZCA+IGdwdV9vdXQoZF9vdXQsIG91dF9zaGFwZSk7CisgICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiwgQWxpZ25lZD4gZ3B1X2luKGRfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjphcnJheTxEZW5zZUluZGV4LCA0PigyLCAzLCA1LCA3KSk7CisgICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERlbnNlSW5kZXgsIDMsIERhdGFMYXlvdXQ+LCBBbGlnbmVkPiBncHVfb3V0KGRfb3V0LCBvdXRfc2hhcGUpOwogCiAgICAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW4uYXJnbWF4KGRpbSk7CiAKLSAgICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmModGVuc29yX2FyZy5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CisgICAgYXNzZXJ0KGdwdU1lbWNweUFzeW5jKHRlbnNvcl9hcmcuZGF0YSgpLCBkX291dCwgb3V0X2J5dGVzLCBncHVNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09CisgICAgICAgICAgIGdwdVN1Y2Nlc3MpOwogICAgIGFzc2VydChncHVTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKIAotICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYXJnLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90KDIqMyo1KjcgLyB0ZW5zb3IuZGltZW5zaW9uKGRpbSkpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2FyZy5zaXplKCksIHNpemVfdCgyICogMyAqIDUgKiA3IC8gdGVuc29yLmRpbWVuc2lvbihkaW0pKSk7CiAKICAgICBmb3IgKERlbnNlSW5kZXggbiA9IDA7IG4gPCB0ZW5zb3JfYXJnLnNpemUoKTsgKytuKSB7CiAgICAgICAvLyBFeHBlY3QgbWF4IHRvIGJlIGluIHRoZSBmaXJzdCBpbmRleCBvZiB0aGUgcmVkdWNlZCBkaW1lbnNpb24KQEAgLTEyNyw3ICsxMzMsMTAgQEAKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKLSAgICAgICAgICAgIGl4WzBdID0gaTsgaXhbMV0gPSBqOyBpeFsyXSA9IGs7IGl4WzNdID0gbDsKKyAgICAgICAgICAgIGl4WzBdID0gaTsKKyAgICAgICAgICAgIGl4WzFdID0gajsKKyAgICAgICAgICAgIGl4WzJdID0gazsKKyAgICAgICAgICAgIGl4WzNdID0gbDsKICAgICAgICAgICAgIGlmIChpeFtkaW1dICE9IHRlbnNvci5kaW1lbnNpb24oZGltKSAtIDEpIGNvbnRpbnVlOwogICAgICAgICAgICAgLy8gc3VwcG9zZSBkaW0gPT0gMSwgdGhlbiBmb3IgYWxsIGksIGssIGwsIHNldCB0ZW5zb3IoaSwgMiwgaywgbCkgPSAyMC4wCiAgICAgICAgICAgICB0ZW5zb3IoaXgpID0gMjAuMDsKQEAgLTE0MCw3ICsxNDksOCBAQAogCiAgICAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW4uYXJnbWF4KGRpbSk7CiAKLSAgICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmModGVuc29yX2FyZy5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CisgICAgYXNzZXJ0KGdwdU1lbWNweUFzeW5jKHRlbnNvcl9hcmcuZGF0YSgpLCBkX291dCwgb3V0X2J5dGVzLCBncHVNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09CisgICAgICAgICAgIGdwdVN1Y2Nlc3MpOwogICAgIGFzc2VydChncHVTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKIAogICAgIGZvciAoRGVuc2VJbmRleCBuID0gMDsgbiA8IHRlbnNvcl9hcmcuc2l6ZSgpOyArK24pIHsKQEAgLTE1NCwxOCArMTY0LDIwIEBACiB9CiAKIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXZvaWQgdGVzdF9ncHVfYXJnbWluX2RpbSgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcpOwordm9pZCB0ZXN0X2dwdV9hcmdtaW5fZGltKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgc3RkOjp2ZWN0b3I8aW50PiBkaW1zOwotICBkaW1zLnB1c2hfYmFjaygyKTsgZGltcy5wdXNoX2JhY2soMyk7IGRpbXMucHVzaF9iYWNrKDUpOyBkaW1zLnB1c2hfYmFjayg3KTsKKyAgZGltcy5wdXNoX2JhY2soMik7CisgIGRpbXMucHVzaF9iYWNrKDMpOworICBkaW1zLnB1c2hfYmFjayg1KTsKKyAgZGltcy5wdXNoX2JhY2soNyk7CiAKICAgZm9yIChpbnQgZGltID0gMDsgZGltIDwgNDsgKytkaW0pIHsKICAgICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgICAgdGVuc29yID0gKHRlbnNvciArIHRlbnNvci5jb25zdGFudCgwLjUpKS5sb2coKTsKIAogICAgIGFycmF5PERlbnNlSW5kZXgsIDM+IG91dF9zaGFwZTsKLSAgICBmb3IgKGludCBkID0gMDsgZCA8IDM7ICsrZCkgb3V0X3NoYXBlW2RdID0gKGQgPCBkaW0pID8gZGltc1tkXSA6IGRpbXNbZCsxXTsKKyAgICBmb3IgKGludCBkID0gMDsgZCA8IDM7ICsrZCkgb3V0X3NoYXBlW2RdID0gKGQgPCBkaW0pID8gZGltc1tkXSA6IGRpbXNbZCArIDFdOwogCiAgICAgVGVuc29yPERlbnNlSW5kZXgsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcl9hcmcob3V0X3NoYXBlKTsKIApAQCAtMTc0LDcgKzE4NiwxMCBAQAogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgICAgaXhbMF0gPSBpOyBpeFsxXSA9IGo7IGl4WzJdID0gazsgaXhbM10gPSBsOworICAgICAgICAgICAgaXhbMF0gPSBpOworICAgICAgICAgICAgaXhbMV0gPSBqOworICAgICAgICAgICAgaXhbMl0gPSBrOworICAgICAgICAgICAgaXhbM10gPSBsOwogICAgICAgICAgICAgaWYgKGl4W2RpbV0gIT0gMCkgY29udGludWU7CiAgICAgICAgICAgICAvLyBzdXBwb3NlIGRpbSA9PSAxLCB0aGVuIGZvciBhbGwgaSwgaywgbCwgc2V0IHRlbnNvcihpLCAwLCBrLCBsKSA9IDEwLjAKICAgICAgICAgICAgIHRlbnNvcihpeCkgPSAtMTAuMDsKQEAgLTE5NiwxNiArMjExLDE3IEBACiAgICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCi0gICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiwgQWxpZ25lZCA+IGdwdV9pbihkX2luLCBFaWdlbjo6YXJyYXk8RGVuc2VJbmRleCwgND4oMiwgMywgNSwgNykpOwotICAgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEZW5zZUluZGV4LCAzLCBEYXRhTGF5b3V0PiwgQWxpZ25lZCA+IGdwdV9vdXQoZF9vdXQsIG91dF9zaGFwZSk7CisgICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiwgQWxpZ25lZD4gZ3B1X2luKGRfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjphcnJheTxEZW5zZUluZGV4LCA0PigyLCAzLCA1LCA3KSk7CisgICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERlbnNlSW5kZXgsIDMsIERhdGFMYXlvdXQ+LCBBbGlnbmVkPiBncHVfb3V0KGRfb3V0LCBvdXRfc2hhcGUpOwogCiAgICAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW4uYXJnbWluKGRpbSk7CiAKLSAgICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmModGVuc29yX2FyZy5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CisgICAgYXNzZXJ0KGdwdU1lbWNweUFzeW5jKHRlbnNvcl9hcmcuZGF0YSgpLCBkX291dCwgb3V0X2J5dGVzLCBncHVNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09CisgICAgICAgICAgIGdwdVN1Y2Nlc3MpOwogICAgIGFzc2VydChncHVTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKIAotICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfYXJnLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgMiozKjUqNyAvIHRlbnNvci5kaW1lbnNpb24oZGltKSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9hcmcuc2l6ZSgpLCAyICogMyAqIDUgKiA3IC8gdGVuc29yLmRpbWVuc2lvbihkaW0pKTsKIAogICAgIGZvciAoRGVuc2VJbmRleCBuID0gMDsgbiA8IHRlbnNvcl9hcmcuc2l6ZSgpOyArK24pIHsKICAgICAgIC8vIEV4cGVjdCBtaW4gdG8gYmUgaW4gdGhlIGZpcnN0IGluZGV4IG9mIHRoZSByZWR1Y2VkIGRpbWVuc2lvbgpAQCAtMjE2LDcgKzIzMiwxMCBAQAogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgICAgaXhbMF0gPSBpOyBpeFsxXSA9IGo7IGl4WzJdID0gazsgaXhbM10gPSBsOworICAgICAgICAgICAgaXhbMF0gPSBpOworICAgICAgICAgICAgaXhbMV0gPSBqOworICAgICAgICAgICAgaXhbMl0gPSBrOworICAgICAgICAgICAgaXhbM10gPSBsOwogICAgICAgICAgICAgaWYgKGl4W2RpbV0gIT0gdGVuc29yLmRpbWVuc2lvbihkaW0pIC0gMSkgY29udGludWU7CiAgICAgICAgICAgICAvLyBzdXBwb3NlIGRpbSA9PSAxLCB0aGVuIGZvciBhbGwgaSwgaywgbCwgc2V0IHRlbnNvcihpLCAyLCBrLCBsKSA9IDIwLjAKICAgICAgICAgICAgIHRlbnNvcihpeCkgPSAtMjAuMDsKQEAgLTIyOSw3ICsyNDgsOCBAQAogCiAgICAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW4uYXJnbWluKGRpbSk7CiAKLSAgICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmModGVuc29yX2FyZy5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CisgICAgYXNzZXJ0KGdwdU1lbWNweUFzeW5jKHRlbnNvcl9hcmcuZGF0YSgpLCBkX291dCwgb3V0X2J5dGVzLCBncHVNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09CisgICAgICAgICAgIGdwdVN1Y2Nlc3MpOwogICAgIGFzc2VydChncHVTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKIAogICAgIGZvciAoRGVuc2VJbmRleCBuID0gMDsgbiA8IHRlbnNvcl9hcmcuc2l6ZSgpOyArK24pIHsKQEAgLTI0Miw4ICsyNjIsNyBAQAogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfYXJnbWF4X2dwdSkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfYXJnbWF4X2dwdSkgewogICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2dwdV9zaW1wbGVfYXJnbWF4PFJvd01ham9yPigpKTsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9ncHVfc2ltcGxlX2FyZ21heDxDb2xNYWpvcj4oKSk7CiAgIENBTExfU1VCVEVTVF8yKHRlc3RfZ3B1X2FyZ21heF9kaW08Um93TWFqb3I+KCkpOwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYXNzaWduLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Fzc2lnbi5jcHAKaW5kZXggMDE1ODY1ZS4uOTkzMjQ5ZCAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYXNzaWduLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9hc3NpZ24uY3BwCkBAIC0xMSwxOSArMTEsMjQgQEAKIAogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KIAotdXNpbmcgRWlnZW46OlRlbnNvcjsKIHVzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKLXN0YXRpYyB2b2lkIHRlc3RfMWQoKQoteworc3RhdGljIHZvaWQgdGVzdF8xZCgpIHsKICAgVGVuc29yPGludCwgMT4gdmVjMSg2KTsKICAgVGVuc29yPGludCwgMSwgUm93TWFqb3I+IHZlYzIoNik7Ci0gIHZlYzEoMCkgPSA0OyAgdmVjMigwKSA9IDA7Ci0gIHZlYzEoMSkgPSA4OyAgdmVjMigxKSA9IDE7Ci0gIHZlYzEoMikgPSAxNTsgdmVjMigyKSA9IDI7Ci0gIHZlYzEoMykgPSAxNjsgdmVjMigzKSA9IDM7Ci0gIHZlYzEoNCkgPSAyMzsgdmVjMig0KSA9IDQ7Ci0gIHZlYzEoNSkgPSA0MjsgdmVjMig1KSA9IDU7CisgIHZlYzEoMCkgPSA0OworICB2ZWMyKDApID0gMDsKKyAgdmVjMSgxKSA9IDg7CisgIHZlYzIoMSkgPSAxOworICB2ZWMxKDIpID0gMTU7CisgIHZlYzIoMikgPSAyOworICB2ZWMxKDMpID0gMTY7CisgIHZlYzIoMykgPSAzOworICB2ZWMxKDQpID0gMjM7CisgIHZlYzIoNCkgPSA0OworICB2ZWMxKDUpID0gNDI7CisgIHZlYzIoNSkgPSA1OwogCiAgIGludCBjb2xfbWFqb3JbNl0gPSB7MH07CiAgIGludCByb3dfbWFqb3JbNl0gPSB7MH07CkBAIC02NywyNCArNzIsMjMgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHZlYzIoNSksIDUpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0XzJkKCkKLXsKLSAgVGVuc29yPGludCwgMj4gbWF0MSgyLDMpOwotICBUZW5zb3I8aW50LCAyLCBSb3dNYWpvcj4gbWF0MigyLDMpOworc3RhdGljIHZvaWQgdGVzdF8yZCgpIHsKKyAgVGVuc29yPGludCwgMj4gbWF0MSgyLCAzKTsKKyAgVGVuc29yPGludCwgMiwgUm93TWFqb3I+IG1hdDIoMiwgMyk7CiAKLSAgbWF0MSgwLDApID0gMDsKLSAgbWF0MSgwLDEpID0gMTsKLSAgbWF0MSgwLDIpID0gMjsKLSAgbWF0MSgxLDApID0gMzsKLSAgbWF0MSgxLDEpID0gNDsKLSAgbWF0MSgxLDIpID0gNTsKKyAgbWF0MSgwLCAwKSA9IDA7CisgIG1hdDEoMCwgMSkgPSAxOworICBtYXQxKDAsIDIpID0gMjsKKyAgbWF0MSgxLCAwKSA9IDM7CisgIG1hdDEoMSwgMSkgPSA0OworICBtYXQxKDEsIDIpID0gNTsKIAotICBtYXQyKDAsMCkgPSAwOwotICBtYXQyKDAsMSkgPSAxOwotICBtYXQyKDAsMikgPSAyOwotICBtYXQyKDEsMCkgPSAzOwotICBtYXQyKDEsMSkgPSA0OwotICBtYXQyKDEsMikgPSA1OworICBtYXQyKDAsIDApID0gMDsKKyAgbWF0MigwLCAxKSA9IDE7CisgIG1hdDIoMCwgMikgPSAyOworICBtYXQyKDEsIDApID0gMzsKKyAgbWF0MigxLCAxKSA9IDQ7CisgIG1hdDIoMSwgMikgPSA1OwogCiAgIGludCBjb2xfbWFqb3JbNl0gPSB7MH07CiAgIGludCByb3dfbWFqb3JbNl0gPSB7MH07CkBAIC05NCw1OCArOTgsNTcgQEAKICAgbWF0MyA9IG1hdDE7CiAgIG1hdDQgPSBtYXQyOwogCi0gIFZFUklGWV9JU19FUVVBTChtYXQzKDAsMCksIDApOwotICBWRVJJRllfSVNfRVFVQUwobWF0MygwLDEpLCAxKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoMCwyKSwgMik7Ci0gIFZFUklGWV9JU19FUVVBTChtYXQzKDEsMCksIDMpOwotICBWRVJJRllfSVNfRVFVQUwobWF0MygxLDEpLCA0KTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoMSwyKSwgNSk7CisgIFZFUklGWV9JU19FUVVBTChtYXQzKDAsIDApLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoMCwgMSksIDEpOworICBWRVJJRllfSVNfRVFVQUwobWF0MygwLCAyKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChtYXQzKDEsIDApLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoMSwgMSksIDQpOworICBWRVJJRllfSVNfRVFVQUwobWF0MygxLCAyKSwgNSk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoMCwwKSwgMCk7Ci0gIFZFUklGWV9JU19FUVVBTChtYXQ0KDAsMSksIDEpOwotICBWRVJJRllfSVNfRVFVQUwobWF0NCgwLDIpLCAyKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoMSwwKSwgMyk7Ci0gIFZFUklGWV9JU19FUVVBTChtYXQ0KDEsMSksIDQpOwotICBWRVJJRllfSVNfRVFVQUwobWF0NCgxLDIpLCA1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoMCwgMCksIDApOworICBWRVJJRllfSVNfRVFVQUwobWF0NCgwLCAxKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChtYXQ0KDAsIDIpLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoMSwgMCksIDMpOworICBWRVJJRllfSVNfRVFVQUwobWF0NCgxLCAxKSwgNCk7CisgIFZFUklGWV9JU19FUVVBTChtYXQ0KDEsIDIpLCA1KTsKIAogICBtYXQxLnNldFplcm8oKTsKICAgbWF0Mi5zZXRaZXJvKCk7CiAgIG1hdDEgPSBtYXQzOwogICBtYXQyID0gbWF0NDsKIAotICBWRVJJRllfSVNfRVFVQUwobWF0MSgwLDApLCAwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDEoMCwxKSwgMSk7Ci0gIFZFUklGWV9JU19FUVVBTChtYXQxKDAsMiksIDIpOwotICBWRVJJRllfSVNfRVFVQUwobWF0MSgxLDApLCAzKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDEoMSwxKSwgNCk7Ci0gIFZFUklGWV9JU19FUVVBTChtYXQxKDEsMiksIDUpOworICBWRVJJRllfSVNfRVFVQUwobWF0MSgwLCAwKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTChtYXQxKDAsIDEpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDEoMCwgMiksIDIpOworICBWRVJJRllfSVNfRVFVQUwobWF0MSgxLCAwKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChtYXQxKDEsIDEpLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDEoMSwgMiksIDUpOwogCi0gIFZFUklGWV9JU19FUVVBTChtYXQyKDAsMCksIDApOwotICBWRVJJRllfSVNfRVFVQUwobWF0MigwLDEpLCAxKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDIoMCwyKSwgMik7Ci0gIFZFUklGWV9JU19FUVVBTChtYXQyKDEsMCksIDMpOwotICBWRVJJRllfSVNfRVFVQUwobWF0MigxLDEpLCA0KTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDIoMSwyKSwgNSk7CisgIFZFUklGWV9JU19FUVVBTChtYXQyKDAsIDApLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDIoMCwgMSksIDEpOworICBWRVJJRllfSVNfRVFVQUwobWF0MigwLCAyKSwgMik7CisgIFZFUklGWV9JU19FUVVBTChtYXQyKDEsIDApLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDIoMSwgMSksIDQpOworICBWRVJJRllfSVNfRVFVQUwobWF0MigxLCAyKSwgNSk7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfM2QoKQotewotICBUZW5zb3I8aW50LCAzPiBtYXQxKDIsMyw3KTsKLSAgVGVuc29yPGludCwgMywgUm93TWFqb3I+IG1hdDIoMiwzLDcpOworc3RhdGljIHZvaWQgdGVzdF8zZCgpIHsKKyAgVGVuc29yPGludCwgMz4gbWF0MSgyLCAzLCA3KTsKKyAgVGVuc29yPGludCwgMywgUm93TWFqb3I+IG1hdDIoMiwgMywgNyk7CiAKICAgaW50IHZhbCA9IDA7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIG1hdDEoaSxqLGspID0gdmFsOwotICAgICAgICBtYXQyKGksaixrKSA9IHZhbDsKKyAgICAgICAgbWF0MShpLCBqLCBrKSA9IHZhbDsKKyAgICAgICAgbWF0MihpLCBqLCBrKSA9IHZhbDsKICAgICAgICAgdmFsKys7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgaW50IGNvbF9tYWpvclsyKjMqN10gPSB7MH07Ci0gIGludCByb3dfbWFqb3JbMiozKjddID0gezB9OworICBpbnQgY29sX21ham9yWzIgKiAzICogN10gPSB7MH07CisgIGludCByb3dfbWFqb3JbMiAqIDMgKiA3XSA9IHswfTsKICAgVGVuc29yTWFwPFRlbnNvcjxpbnQsIDM+ID4gbWF0Myhjb2xfbWFqb3IsIDIsIDMsIDcpOwogICBUZW5zb3JNYXA8VGVuc29yPGludCwgMywgUm93TWFqb3I+ID4gbWF0NChyb3dfbWFqb3IsIDIsIDMsIDcpOwogCkBAIC0xNTYsOCArMTU5LDggQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoaSxqLGspLCB2YWwpOwotICAgICAgICBWRVJJRllfSVNfRVFVQUwobWF0NChpLGosayksIHZhbCk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChtYXQzKGksIGosIGspLCB2YWwpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwobWF0NChpLCBqLCBrKSwgdmFsKTsKICAgICAgICAgdmFsKys7CiAgICAgICB9CiAgICAgfQpAQCAtMTcyLDE2ICsxNzUsMTUgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1hdDEoaSxqLGspLCB2YWwpOwotICAgICAgICBWRVJJRllfSVNfRVFVQUwobWF0MihpLGosayksIHZhbCk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChtYXQxKGksIGosIGspLCB2YWwpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwobWF0MihpLCBqLCBrKSwgdmFsKTsKICAgICAgICAgdmFsKys7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3Rfc2FtZV90eXBlKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3Rfc2FtZV90eXBlKCkgewogICBUZW5zb3I8aW50LCAxPiBvcmlnX3RlbnNvcig1KTsKICAgVGVuc29yPGludCwgMT4gZGVzdF90ZW5zb3IoNSk7CiAgIG9yaWdfdGVuc29yLnNldFJhbmRvbSgpOwpAQCAtMjE4LDEyICsyMjAsMTEgQEAKICAgVkVSSUZZX0lTX0VRVUFMKG9yaWdfbWFwLmRhdGEoKSwgb3JpZ19kYXRhKTsKICAgVkVSSUZZX0lTX0VRVUFMKGRlc3RfbWFwLmRhdGEoKSwgZGVzdF9kYXRhKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKLSAgICBWRVJJRllfSVNfRVFVQUwoZGVzdFtpXSwgaSsxKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoZGVzdFtpXSwgaSArIDEpOwogICB9CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfYXV0b19yZXNpemUoKQoteworc3RhdGljIHZvaWQgdGVzdF9hdXRvX3Jlc2l6ZSgpIHsKICAgVGVuc29yPGludCwgMT4gdGVuc29yMTsKICAgVGVuc29yPGludCwgMT4gdGVuc29yMigzKTsKICAgVGVuc29yPGludCwgMT4gdGVuc29yMyg1KTsKQEAgLTI0Niw5ICsyNDcsNyBAQAogICB9CiB9CiAKLQotc3RhdGljIHZvaWQgdGVzdF9jb21wb3VuZF9hc3NpZ24oKQoteworc3RhdGljIHZvaWQgdGVzdF9jb21wb3VuZF9hc3NpZ24oKSB7CiAgIFRlbnNvcjxpbnQsIDE+IHN0YXJ0X3RlbnNvcigxMCk7CiAgIFRlbnNvcjxpbnQsIDE+IG9mZnNldF90ZW5zb3IoMTApOwogICBzdGFydF90ZW5zb3Iuc2V0UmFuZG9tKCk7CkBAIC0zMjEsOSArMzIwLDggQEAKICAgVkVSSUZZX0lTX0VRVUFMKGIoMSwgMiksIDUpOwogCiAgIEVpZ2VuOjpUZW5zb3I8aW50LCAzPiBjKDMsIDIsIDQpOwotICBjLnNldFZhbHVlcyh7e3swLCAxLCAyLCAzfSwgezQsIDUsIDYsIDd9fSwKLSAgICAgICAgICAgICAgIHt7MTAsIDExLCAxMiwgMTN9LCB7MTQsIDE1LCAxNiwgMTd9fSwKLSAgICAgICAgICAgICAgIHt7MjAsIDIxLCAyMiwgMjN9LCB7MjQsIDI1LCAyNiwgMjd9fX0pOworICBjLnNldFZhbHVlcygKKyAgICAgIHt7ezAsIDEsIDIsIDN9LCB7NCwgNSwgNiwgN319LCB7ezEwLCAxMSwgMTIsIDEzfSwgezE0LCAxNSwgMTYsIDE3fX0sIHt7MjAsIDIxLCAyMiwgMjN9LCB7MjQsIDI1LCAyNiwgMjd9fX0pOwogICBWRVJJRllfSVNfRVFVQUwoYygwLCAwLCAwKSwgMCk7CiAgIFZFUklGWV9JU19FUVVBTChjKDAsIDAsIDEpLCAxKTsKICAgVkVSSUZZX0lTX0VRVUFMKGMoMCwgMCwgMiksIDIpOwpAQCAtMzUwLDggKzM0OCw3IEBACiAgIFZFUklGWV9JU19FUVVBTChjKDIsIDEsIDMpLCAyNyk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfYXNzaWduKQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9hc3NpZ24pIHsKICAgQ0FMTF9TVUJURVNUKHRlc3RfMWQoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0XzJkKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF8zZCgpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Jsb2NrX2FjY2Vzcy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9ibG9ja19hY2Nlc3MuY3BwCmluZGV4IDVmYjEyZTAuLjdjNTIwM2QgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Jsb2NrX2FjY2Vzcy5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYmxvY2tfYWNjZXNzLmNwcApAQCAtMTUsMjMgKzE1LDIxIEBACiAKICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CiAKLXVzaW5nIEVpZ2VuOjpUZW5zb3I7Cit1c2luZyBFaWdlbjo6Q29sTWFqb3I7CiB1c2luZyBFaWdlbjo6SW5kZXg7CiB1c2luZyBFaWdlbjo6Um93TWFqb3I7Ci11c2luZyBFaWdlbjo6Q29sTWFqb3I7Cit1c2luZyBFaWdlbjo6VGVuc29yOwogdXNpbmcgRWlnZW46OmludGVybmFsOjpUZW5zb3JCbG9ja1NoYXBlVHlwZTsKIAogc3RhdGljIFRlbnNvck9wQ29zdCB6ZXJvQ29zdCgpIHsgcmV0dXJuIHswLCAwLCAwfTsgfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzdGF0aWMgY29uc3QgVCYgY2hvb3NlKGludCBsYXlvdXQsIGNvbnN0IFQmIGNvbCwgY29uc3QgVCYgcm93KSB7CiAgIHJldHVybiBsYXlvdXQgPT0gQ29sTWFqb3IgPyBjb2wgOiByb3c7CiB9CiAKIHN0YXRpYyBUZW5zb3JCbG9ja1NoYXBlVHlwZSBSYW5kb21TaGFwZSgpIHsKLSAgcmV0dXJuIGludGVybmFsOjpyYW5kb208Ym9vbD4oKQotICAgICAgICAgPyBUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1VuaWZvcm1BbGxEaW1zCi0gICAgICAgICA6IFRlbnNvckJsb2NrU2hhcGVUeXBlOjprU2tld2VkSW5uZXJEaW1zOworICByZXR1cm4gaW50ZXJuYWw6OnJhbmRvbTxib29sPigpID8gVGVuc29yQmxvY2tTaGFwZVR5cGU6OmtVbmlmb3JtQWxsRGltcyA6IFRlbnNvckJsb2NrU2hhcGVUeXBlOjprU2tld2VkSW5uZXJEaW1zOwogfQogCiB0ZW1wbGF0ZSA8aW50IE51bURpbXM+CkBAIC02NiwxNSArNjQsMTMgQEAKIH0KIAogdGVtcGxhdGUgPGludCBMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2Jsb2NrX21hcHBlcl9zYW5pdHkoKQoteworc3RhdGljIHZvaWQgdGVzdF9ibG9ja19tYXBwZXJfc2FuaXR5KCkgewogICB0eXBlZGVmIGludGVybmFsOjpUZW5zb3JCbG9ja01hcHBlcjwyLCBMYXlvdXQ+IFRlbnNvckJsb2NrTWFwcGVyOwogCiAgIERTaXplczxJbmRleCwgMj4gdGVuc29yX2RpbXMoMTAwLCAxMDApOwogCiAgIC8vIFRlc3QgdW5pZm9ybSBibG9ja3MuCi0gIFRlbnNvckJsb2NrTWFwcGVyIHVuaWZvcm1fYmxvY2tfbWFwcGVyKAotICAgICAgdGVuc29yX2RpbXMsIHtUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1VuaWZvcm1BbGxEaW1zLCAxMDAsIHplcm9Db3N0KCl9KTsKKyAgVGVuc29yQmxvY2tNYXBwZXIgdW5pZm9ybV9ibG9ja19tYXBwZXIodGVuc29yX2RpbXMsIHtUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1VuaWZvcm1BbGxEaW1zLCAxMDAsIHplcm9Db3N0KCl9KTsKIAogICBWRVJJRllfSVNfRVFVQUwodW5pZm9ybV9ibG9ja19tYXBwZXIuYmxvY2tDb3VudCgpLCAxMDApOwogICBWRVJJRllfSVNfRVFVQUwodW5pZm9ybV9ibG9ja19tYXBwZXIuYmxvY2tUb3RhbFNpemUoKSwgMTAwKTsKQEAgLTg1LDggKzgxLDcgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHVuaWZvcm1fYjAuZGltZW5zaW9ucygpLmF0KDEpLCAxMCk7CiAKICAgLy8gVGVzdCBza2V3ZWQgdG8gaW5uZXIgZGltcyBibG9ja3MuCi0gIFRlbnNvckJsb2NrTWFwcGVyIHNrZXdlZF9ibG9ja19tYXBwZXIoCi0gICAgICB0ZW5zb3JfZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprU2tld2VkSW5uZXJEaW1zLCAxMDAsIHplcm9Db3N0KCl9KTsKKyAgVGVuc29yQmxvY2tNYXBwZXIgc2tld2VkX2Jsb2NrX21hcHBlcih0ZW5zb3JfZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprU2tld2VkSW5uZXJEaW1zLCAxMDAsIHplcm9Db3N0KCl9KTsKIAogICBWRVJJRllfSVNfRVFVQUwoc2tld2VkX2Jsb2NrX21hcHBlci5ibG9ja0NvdW50KCksIDEwMCk7CiAgIFZFUklGWV9JU19FUVVBTChza2V3ZWRfYmxvY2tfbWFwcGVyLmJsb2NrVG90YWxTaXplKCksIDEwMCk7CkBAIC05OSwxMSArOTQsMTAgQEAKIAogLy8gR2l2ZW4gYSBUZW5zb3JCbG9jayAidmlzaXQiIGV2ZXJ5IGVsZW1lbnQgYWNjZXNzaWJsZSB0aG91Z2ggaXQsIGFuZCBhIGtlZXAgYW4KIC8vIGluZGV4IGluIHRoZSB2aXNpdGVkIHNldC4gVmVyaWZ5IHRoYXQgZXZlcnkgY29lZmYgYWNjZXNzZWQgb25seSBvbmNlLgotdGVtcGxhdGU8aW50IE51bURpbXMsIGludCBMYXlvdXQ+Ci1zdGF0aWMgdm9pZCBVcGRhdGVDb2VmZlNldCgKLSAgICBjb25zdCBEU2l6ZXM8SW5kZXgsIE51bURpbXM+JiB0ZW5zb3Jfc3RyaWRlcywKLSAgICBjb25zdCBpbnRlcm5hbDo6VGVuc29yQmxvY2tEZXNjcmlwdG9yPE51bURpbXM+JiBibG9jaywKLSAgICBJbmRleCBmaXJzdF9jb2VmZl9pbmRleCwgaW50IGRpbV9pbmRleCwgc3RkOjpzZXQ8SW5kZXg+KiB2aXNpdGVkX2NvZWZmcykgewordGVtcGxhdGUgPGludCBOdW1EaW1zLCBpbnQgTGF5b3V0Pgorc3RhdGljIHZvaWQgVXBkYXRlQ29lZmZTZXQoY29uc3QgRFNpemVzPEluZGV4LCBOdW1EaW1zPiYgdGVuc29yX3N0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbDo6VGVuc29yQmxvY2tEZXNjcmlwdG9yPE51bURpbXM+JiBibG9jaywgSW5kZXggZmlyc3RfY29lZmZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGltX2luZGV4LCBzdGQ6OnNldDxJbmRleD4qIHZpc2l0ZWRfY29lZmZzKSB7CiAgIGNvbnN0IERTaXplczxJbmRleCwgTnVtRGltcz4mIGJsb2NrX3NpemVzID0gYmxvY2suZGltZW5zaW9ucygpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tfc2l6ZXNbZGltX2luZGV4XTsgKytpKSB7CkBAIC0xMTMsOCArMTA3LDcgQEAKICAgICAgIFZFUklGWV9JU19FUVVBTChpbnNlcnRlZC5zZWNvbmQsIHRydWUpOwogICAgIH0gZWxzZSB7CiAgICAgICBpbnQgbmV4dF9kaW1faW5kZXggPSBkaW1faW5kZXggKyBjaG9vc2UoTGF5b3V0LCAtMSwgMSk7Ci0gICAgICBVcGRhdGVDb2VmZlNldDxOdW1EaW1zLCBMYXlvdXQ+KHRlbnNvcl9zdHJpZGVzLCBibG9jaywgZmlyc3RfY29lZmZfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfZGltX2luZGV4LCB2aXNpdGVkX2NvZWZmcyk7CisgICAgICBVcGRhdGVDb2VmZlNldDxOdW1EaW1zLCBMYXlvdXQ+KHRlbnNvcl9zdHJpZGVzLCBibG9jaywgZmlyc3RfY29lZmZfaW5kZXgsIG5leHRfZGltX2luZGV4LCB2aXNpdGVkX2NvZWZmcyk7CiAgICAgICBmaXJzdF9jb2VmZl9pbmRleCArPSB0ZW5zb3Jfc3RyaWRlc1tkaW1faW5kZXhdOwogICAgIH0KICAgfQpAQCAtMTMxLDE0ICsxMjQsMTEgQEAKICAgc3RkOjpzZXQ8SW5kZXg+IGNvZWZmX3NldDsKIAogICAvLyBUcnkgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBibG9jayB0eXBlcyBhbmQgc2l6ZXMuCi0gIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcigKLSAgICAgIGRpbXMsIHtSYW5kb21TaGFwZSgpLCBSYW5kb21UYXJnZXRTaXplKGRpbXMpLCB6ZXJvQ29zdCgpfSk7CisgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7UmFuZG9tU2hhcGUoKSwgUmFuZG9tVGFyZ2V0U2l6ZShkaW1zKSwgemVyb0Nvc3QoKX0pOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tfbWFwcGVyLmJsb2NrQ291bnQoKTsgKytpKSB7CiAgICAgYXV0byBibG9jayA9IGJsb2NrX21hcHBlci5ibG9ja0Rlc2NyaXB0b3IoaSk7Ci0gICAgVXBkYXRlQ29lZmZTZXQ8TnVtRGltcywgTGF5b3V0PihzdHJpZGVzLCBibG9jaywgYmxvY2sub2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2UoTGF5b3V0LCBOdW1EaW1zIC0gMSwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29lZmZfc2V0KTsKKyAgICBVcGRhdGVDb2VmZlNldDxOdW1EaW1zLCBMYXlvdXQ+KHN0cmlkZXMsIGJsb2NrLCBibG9jay5vZmZzZXQoKSwgY2hvb3NlKExheW91dCwgTnVtRGltcyAtIDEsIDApLCAmY29lZmZfc2V0KTsKICAgfQogCiAgIC8vIFZlcmlmeSB0aGF0IGV2ZXJ5IGNvZWZmaWNpZW50IGluIHRoZSBvcmlnaW5hbCBUZW5zb3IgaXMgYWNjZXNzaWJsZSB0aHJvdWdoCkBAIC0xNTAsMTAgKzE0MCw4IEBACiB9CiAKIHRlbXBsYXRlIDxpbnQgTGF5b3V0LCBpbnQgTnVtRGltcz4KLXN0YXRpYyBJbmRleCBHZXRJbnB1dEluZGV4KEluZGV4IG91dHB1dF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheTxJbmRleCwgTnVtRGltcz4mIG91dHB1dF90b19pbnB1dF9kaW1fbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5PEluZGV4LCBOdW1EaW1zPiYgaW5wdXRfc3RyaWRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheTxJbmRleCwgTnVtRGltcz4mIG91dHB1dF9zdHJpZGVzKSB7CitzdGF0aWMgSW5kZXggR2V0SW5wdXRJbmRleChJbmRleCBvdXRwdXRfaW5kZXgsIGNvbnN0IGFycmF5PEluZGV4LCBOdW1EaW1zPiYgb3V0cHV0X3RvX2lucHV0X2RpbV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheTxJbmRleCwgTnVtRGltcz4mIGlucHV0X3N0cmlkZXMsIGNvbnN0IGFycmF5PEluZGV4LCBOdW1EaW1zPiYgb3V0cHV0X3N0cmlkZXMpIHsKICAgaW50IGlucHV0X2luZGV4ID0gMDsKICAgaWYgKExheW91dCA9PSBDb2xNYWpvcikgewogICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMTsgaSA+IDA7IC0taSkgewpAQCAtMTYxLDIyICsxNDksMTkgQEAKICAgICAgIGlucHV0X2luZGV4ICs9IGlkeCAqIGlucHV0X3N0cmlkZXNbb3V0cHV0X3RvX2lucHV0X2RpbV9tYXBbaV1dOwogICAgICAgb3V0cHV0X2luZGV4IC09IGlkeCAqIG91dHB1dF9zdHJpZGVzW2ldOwogICAgIH0KLSAgICByZXR1cm4gaW5wdXRfaW5kZXggKwotICAgICAgICAgICBvdXRwdXRfaW5kZXggKiBpbnB1dF9zdHJpZGVzW291dHB1dF90b19pbnB1dF9kaW1fbWFwWzBdXTsKKyAgICByZXR1cm4gaW5wdXRfaW5kZXggKyBvdXRwdXRfaW5kZXggKiBpbnB1dF9zdHJpZGVzW291dHB1dF90b19pbnB1dF9kaW1fbWFwWzBdXTsKICAgfSBlbHNlIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAxOyArK2kpIHsKICAgICAgIGNvbnN0IEluZGV4IGlkeCA9IG91dHB1dF9pbmRleCAvIG91dHB1dF9zdHJpZGVzW2ldOwogICAgICAgaW5wdXRfaW5kZXggKz0gaWR4ICogaW5wdXRfc3RyaWRlc1tvdXRwdXRfdG9faW5wdXRfZGltX21hcFtpXV07CiAgICAgICBvdXRwdXRfaW5kZXggLT0gaWR4ICogb3V0cHV0X3N0cmlkZXNbaV07CiAgICAgfQotICAgIHJldHVybiBpbnB1dF9pbmRleCArCi0gICAgICAgICAgIG91dHB1dF9pbmRleCAqIGlucHV0X3N0cmlkZXNbb3V0cHV0X3RvX2lucHV0X2RpbV9tYXBbTnVtRGltcyAtIDFdXTsKKyAgICByZXR1cm4gaW5wdXRfaW5kZXggKyBvdXRwdXRfaW5kZXggKiBpbnB1dF9zdHJpZGVzW291dHB1dF90b19pbnB1dF9kaW1fbWFwW051bURpbXMgLSAxXV07CiAgIH0KIH0KIAogdGVtcGxhdGUgPGludCBMYXlvdXQsIGludCBOdW1EaW1zPgotc3RhdGljIGFycmF5PEluZGV4LCBOdW1EaW1zPiBDb21wdXRlU3RyaWRlcygKLSAgICBjb25zdCBhcnJheTxJbmRleCwgTnVtRGltcz4mIHNpemVzKSB7CitzdGF0aWMgYXJyYXk8SW5kZXgsIE51bURpbXM+IENvbXB1dGVTdHJpZGVzKGNvbnN0IGFycmF5PEluZGV4LCBOdW1EaW1zPiYgc2l6ZXMpIHsKICAgYXJyYXk8SW5kZXgsIE51bURpbXM+IHN0cmlkZXM7CiAgIGlmIChMYXlvdXQgPT0gQ29sTWFqb3IpIHsKICAgICBzdHJpZGVzWzBdID0gMTsKQEAgLTE5Miw0MiArMTc3LDM3IEBACiAgIHJldHVybiBzdHJpZGVzOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIFN0b3JhZ2VJbmRleCwgaW50IERpbT4KLWNsYXNzIEVxdWFsaXR5Q2hlY2tlcgotewotICAgIGNvbnN0IFNjYWxhciogaW5wdXRfZGF0YTsKLSAgICBjb25zdCBEU2l6ZXM8U3RvcmFnZUluZGV4LCBEaW0+ICZpbnB1dF9kaW1zLCAmaW5wdXRfc3RyaWRlcywgJm91dHB1dF9kaW1zLCAmb3V0cHV0X3N0cmlkZXM7Ci0gICAgdm9pZCBjaGVja19yZWN1cnNpdmUoY29uc3QgU2NhbGFyKiBpbnB1dCwgY29uc3QgU2NhbGFyKiBvdXRwdXQsIGludCBkZXB0aD0wKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYoZGVwdGg9PURpbSkKLSAgICAgICAgewotICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKCppbnB1dCwgKm91dHB1dCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoaW50IGk9MDsgaTxvdXRwdXRfZGltc1tkZXB0aF07ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tfcmVjdXJzaXZlKGlucHV0ICsgaSAlIGlucHV0X2RpbXNbZGVwdGhdICogaW5wdXRfc3RyaWRlc1tkZXB0aF0sIG91dHB1dCArIGkqb3V0cHV0X3N0cmlkZXNbZGVwdGhdLCBkZXB0aCsxKTsKLSAgICAgICAgfQordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgU3RvcmFnZUluZGV4LCBpbnQgRGltPgorY2xhc3MgRXF1YWxpdHlDaGVja2VyIHsKKyAgY29uc3QgU2NhbGFyKiBpbnB1dF9kYXRhOworICBjb25zdCBEU2l6ZXM8U3RvcmFnZUluZGV4LCBEaW0+JmlucHV0X2RpbXMsICZpbnB1dF9zdHJpZGVzLCAmb3V0cHV0X2RpbXMsICZvdXRwdXRfc3RyaWRlczsKKyAgdm9pZCBjaGVja19yZWN1cnNpdmUoY29uc3QgU2NhbGFyKiBpbnB1dCwgY29uc3QgU2NhbGFyKiBvdXRwdXQsIGludCBkZXB0aCA9IDApIGNvbnN0IHsKKyAgICBpZiAoZGVwdGggPT0gRGltKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwoKmlucHV0LCAqb3V0cHV0KTsKKyAgICAgIHJldHVybjsKICAgICB9Ci1wdWJsaWM6Ci0gICAgRXF1YWxpdHlDaGVja2VyKGNvbnN0IFNjYWxhciogaW5wdXRfZGF0YV8sCi0gICAgICAgICAgICBjb25zdCBEU2l6ZXM8U3RvcmFnZUluZGV4LCBEaW0+ICZpbnB1dF9kaW1zXywgY29uc3QgRFNpemVzPFN0b3JhZ2VJbmRleCwgRGltPiAmaW5wdXRfc3RyaWRlc18sCi0gICAgICAgICAgICBjb25zdCBEU2l6ZXM8U3RvcmFnZUluZGV4LCBEaW0+ICZvdXRwdXRfZGltc18sIGNvbnN0IERTaXplczxTdG9yYWdlSW5kZXgsIERpbT4gJm91dHB1dF9zdHJpZGVzXykKLSAgICAgICAgOiBpbnB1dF9kYXRhKGlucHV0X2RhdGFfKQotICAgICAgICAsIGlucHV0X2RpbXMoaW5wdXRfZGltc18pLCBpbnB1dF9zdHJpZGVzKGlucHV0X3N0cmlkZXNfKQotICAgICAgICAsIG91dHB1dF9kaW1zKG91dHB1dF9kaW1zXyksIG91dHB1dF9zdHJpZGVzKG91dHB1dF9zdHJpZGVzXykKLSAgICAgICAge30KIAotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBTY2FsYXIqIG91dHB1dF9kYXRhKSBjb25zdAotICAgIHsKLSAgICAgICAgY2hlY2tfcmVjdXJzaXZlKGlucHV0X2RhdGEsIG91dHB1dF9kYXRhKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dF9kaW1zW2RlcHRoXTsgKytpKSB7CisgICAgICBjaGVja19yZWN1cnNpdmUoaW5wdXQgKyBpICUgaW5wdXRfZGltc1tkZXB0aF0gKiBpbnB1dF9zdHJpZGVzW2RlcHRoXSwgb3V0cHV0ICsgaSAqIG91dHB1dF9zdHJpZGVzW2RlcHRoXSwKKyAgICAgICAgICAgICAgICAgICAgICBkZXB0aCArIDEpOwogICAgIH0KKyAgfQorCisgcHVibGljOgorICBFcXVhbGl0eUNoZWNrZXIoY29uc3QgU2NhbGFyKiBpbnB1dF9kYXRhXywgY29uc3QgRFNpemVzPFN0b3JhZ2VJbmRleCwgRGltPiYgaW5wdXRfZGltc18sCisgICAgICAgICAgICAgICAgICBjb25zdCBEU2l6ZXM8U3RvcmFnZUluZGV4LCBEaW0+JiBpbnB1dF9zdHJpZGVzXywgY29uc3QgRFNpemVzPFN0b3JhZ2VJbmRleCwgRGltPiYgb3V0cHV0X2RpbXNfLAorICAgICAgICAgICAgICAgICAgY29uc3QgRFNpemVzPFN0b3JhZ2VJbmRleCwgRGltPiYgb3V0cHV0X3N0cmlkZXNfKQorICAgICAgOiBpbnB1dF9kYXRhKGlucHV0X2RhdGFfKSwKKyAgICAgICAgaW5wdXRfZGltcyhpbnB1dF9kaW1zXyksCisgICAgICAgIGlucHV0X3N0cmlkZXMoaW5wdXRfc3RyaWRlc18pLAorICAgICAgICBvdXRwdXRfZGltcyhvdXRwdXRfZGltc18pLAorICAgICAgICBvdXRwdXRfc3RyaWRlcyhvdXRwdXRfc3RyaWRlc18pIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFNjYWxhciogb3V0cHV0X2RhdGEpIGNvbnN0IHsgY2hlY2tfcmVjdXJzaXZlKGlucHV0X2RhdGEsIG91dHB1dF9kYXRhKTsgfQogfTsKIAogdGVtcGxhdGUgPGludCBMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X3VuaWZvcm1fYmxvY2tfc2hhcGUoKQoteworc3RhdGljIHZvaWQgdGVzdF91bmlmb3JtX2Jsb2NrX3NoYXBlKCkgewogICB0eXBlZGVmIGludGVybmFsOjpUZW5zb3JCbG9ja0Rlc2NyaXB0b3I8NT4gVGVuc29yQmxvY2s7CiAgIHR5cGVkZWYgaW50ZXJuYWw6OlRlbnNvckJsb2NrTWFwcGVyPDUsIExheW91dD4gVGVuc29yQmxvY2tNYXBwZXI7CiAKQEAgLTIzNSw4ICsyMTUsNyBAQAogICAgIC8vIFRlc3Qgc2hhcGUgJ1VuaWZvcm1BbGxEaW1zJyB3aXRoIHVuaWZvcm0gJ21heF9jb2VmZiBjb3VudCcuCiAgICAgRFNpemVzPEluZGV4LCA1PiBkaW1zKDExLCA1LCA2LCAxNywgNyk7CiAgICAgY29uc3QgSW5kZXggbWF4X2NvZWZmX2NvdW50ID0gNSAqIDUgKiA1ICogNSAqIDU7Ci0gICAgVGVuc29yQmxvY2tNYXBwZXIgYmxvY2tfbWFwcGVyKGRpbXMsIHtUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1VuaWZvcm1BbGxEaW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2NvZWZmX2NvdW50LCB6ZXJvQ29zdCgpfSk7CisgICAgVGVuc29yQmxvY2tNYXBwZXIgYmxvY2tfbWFwcGVyKGRpbXMsIHtUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1VuaWZvcm1BbGxEaW1zLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKICAgICBUZW5zb3JCbG9jayBibG9jayA9IGJsb2NrX21hcHBlci5ibG9ja0Rlc2NyaXB0b3IoMCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKICAgICAgIFZFUklGWV9JU19FUVVBTCg1LCBibG9jay5kaW1lbnNpb25zKClbaV0pOwpAQCAtMjQ5LDggKzIyOCw3IEBACiAgIGlmIChMYXlvdXQgPT0gQ29sTWFqb3IpIHsKICAgICBEU2l6ZXM8SW5kZXgsIDU+IGRpbXMoMTEsIDUsIDYsIDE3LCA3KTsKICAgICBjb25zdCBJbmRleCBtYXhfY29lZmZfY291bnQgPSA3ICogNSAqIDUgKiA1ICogNTsKLSAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprVW5pZm9ybUFsbERpbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKKyAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprVW5pZm9ybUFsbERpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOwogICAgIFRlbnNvckJsb2NrIGJsb2NrID0gYmxvY2tfbWFwcGVyLmJsb2NrRGVzY3JpcHRvcigwKTsKICAgICBWRVJJRllfSVNfRVFVQUwoNywgYmxvY2suZGltZW5zaW9ucygpWzBdKTsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7ICsraSkgewpAQCAtMjYwLDggKzIzOCw3IEBACiAgIH0gZWxzZSB7CiAgICAgRFNpemVzPEluZGV4LCA1PiBkaW1zKDExLCA1LCA2LCAxNywgNyk7CiAgICAgY29uc3QgSW5kZXggbWF4X2NvZWZmX2NvdW50ID0gNSAqIDUgKiA1ICogNSAqIDY7Ci0gICAgVGVuc29yQmxvY2tNYXBwZXIgYmxvY2tfbWFwcGVyKGRpbXMsIHtUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1VuaWZvcm1BbGxEaW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2NvZWZmX2NvdW50LCB6ZXJvQ29zdCgpfSk7CisgICAgVGVuc29yQmxvY2tNYXBwZXIgYmxvY2tfbWFwcGVyKGRpbXMsIHtUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1VuaWZvcm1BbGxEaW1zLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKICAgICBUZW5zb3JCbG9jayBibG9jayA9IGJsb2NrX21hcHBlci5ibG9ja0Rlc2NyaXB0b3IoMCk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKDYsIGJsb2NrLmRpbWVuc2lvbnMoKVs0XSk7CiAgICAgZm9yIChpbnQgaSA9IDM7IGkgPj0gMDsgLS1pKSB7CkBAIC0yNzUsOCArMjUyLDcgQEAKICAgaWYgKExheW91dCA9PSBDb2xNYWpvcikgewogICAgIERTaXplczxJbmRleCwgNT4gZGltcygxMSwgNSwgNiwgMTcsIDcpOwogICAgIGNvbnN0IEluZGV4IG1heF9jb2VmZl9jb3VudCA9IDExICogNSAqIDUgKiA1ICogNTsKLSAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprVW5pZm9ybUFsbERpbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKKyAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprVW5pZm9ybUFsbERpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOwogICAgIFRlbnNvckJsb2NrIGJsb2NrID0gYmxvY2tfbWFwcGVyLmJsb2NrRGVzY3JpcHRvcigwKTsKICAgICBWRVJJRllfSVNfRVFVQUwoMTEsIGJsb2NrLmRpbWVuc2lvbnMoKVswXSk7CiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyArK2kpIHsKQEAgLTI4Niw4ICsyNjIsNyBAQAogICB9IGVsc2UgewogICAgIERTaXplczxJbmRleCwgNT4gZGltcygxMSwgNSwgNiwgMTcsIDcpOwogICAgIGNvbnN0IEluZGV4IG1heF9jb2VmZl9jb3VudCA9IDUgKiA1ICogNSAqIDUgKiA3OwotICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtVbmlmb3JtQWxsRGltcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOworICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtVbmlmb3JtQWxsRGltcywgbWF4X2NvZWZmX2NvdW50LCB6ZXJvQ29zdCgpfSk7CiAgICAgVGVuc29yQmxvY2sgYmxvY2sgPSBibG9ja19tYXBwZXIuYmxvY2tEZXNjcmlwdG9yKDApOwogICAgIFZFUklGWV9JU19FUVVBTCg3LCBibG9jay5kaW1lbnNpb25zKClbNF0pOwogICAgIGZvciAoaW50IGkgPSAzOyBpID49IDA7IC0taSkgewpAQCAtMzAxLDggKzI3Niw3IEBACiAgIGlmIChMYXlvdXQgPT0gQ29sTWFqb3IpIHsKICAgICBEU2l6ZXM8SW5kZXgsIDU+IGRpbXMoNywgNSwgNiwgMTcsIDcpOwogICAgIGNvbnN0IEluZGV4IG1heF9jb2VmZl9jb3VudCA9IDcgKiA1ICogNiAqIDcgKiA1OwotICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtVbmlmb3JtQWxsRGltcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOworICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtVbmlmb3JtQWxsRGltcywgbWF4X2NvZWZmX2NvdW50LCB6ZXJvQ29zdCgpfSk7CiAgICAgVGVuc29yQmxvY2sgYmxvY2sgPSBibG9ja19tYXBwZXIuYmxvY2tEZXNjcmlwdG9yKDApOwogICAgIFZFUklGWV9JU19FUVVBTCg3LCBibG9jay5kaW1lbnNpb25zKClbMF0pOwogICAgIFZFUklGWV9JU19FUVVBTCg1LCBibG9jay5kaW1lbnNpb25zKClbMV0pOwpAQCAtMzEzLDggKzI4Nyw3IEBACiAgIH0gZWxzZSB7CiAgICAgRFNpemVzPEluZGV4LCA1PiBkaW1zKDcsIDUsIDYsIDksIDcpOwogICAgIGNvbnN0IEluZGV4IG1heF9jb2VmZl9jb3VudCA9IDUgKiA1ICogNSAqIDYgKiA3OwotICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtVbmlmb3JtQWxsRGltcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOworICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtVbmlmb3JtQWxsRGltcywgbWF4X2NvZWZmX2NvdW50LCB6ZXJvQ29zdCgpfSk7CiAgICAgVGVuc29yQmxvY2sgYmxvY2sgPSBibG9ja19tYXBwZXIuYmxvY2tEZXNjcmlwdG9yKDApOwogICAgIFZFUklGWV9JU19FUVVBTCg3LCBibG9jay5kaW1lbnNpb25zKClbNF0pOwogICAgIFZFUklGWV9JU19FUVVBTCg2LCBibG9jay5kaW1lbnNpb25zKClbM10pOwpAQCAtMzI4LDggKzMwMSw3IEBACiAgIGlmIChMYXlvdXQgPT0gQ29sTWFqb3IpIHsKICAgICBEU2l6ZXM8SW5kZXgsIDU+IGRpbXMoNywgNSwgNiwgMTcsIDcpOwogICAgIGNvbnN0IEluZGV4IG1heF9jb2VmZl9jb3VudCA9IDcgKiA1ICogNiAqIDE3ICogNzsKLSAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprVW5pZm9ybUFsbERpbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKKyAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprVW5pZm9ybUFsbERpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOwogICAgIFRlbnNvckJsb2NrIGJsb2NrID0gYmxvY2tfbWFwcGVyLmJsb2NrRGVzY3JpcHRvcigwKTsKICAgICBWRVJJRllfSVNfRVFVQUwoNywgYmxvY2suZGltZW5zaW9ucygpWzBdKTsKICAgICBWRVJJRllfSVNfRVFVQUwoNSwgYmxvY2suZGltZW5zaW9ucygpWzFdKTsKQEAgLTM0MCw4ICszMTIsNyBAQAogICB9IGVsc2UgewogICAgIERTaXplczxJbmRleCwgNT4gZGltcyg3LCA1LCA2LCA5LCA3KTsKICAgICBjb25zdCBJbmRleCBtYXhfY29lZmZfY291bnQgPSA3ICogNSAqIDYgKiA5ICogNzsKLSAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprVW5pZm9ybUFsbERpbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKKyAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprVW5pZm9ybUFsbERpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOwogICAgIFRlbnNvckJsb2NrIGJsb2NrID0gYmxvY2tfbWFwcGVyLmJsb2NrRGVzY3JpcHRvcigwKTsKICAgICBWRVJJRllfSVNfRVFVQUwoNywgYmxvY2suZGltZW5zaW9ucygpWzRdKTsKICAgICBWRVJJRllfSVNfRVFVQUwoOSwgYmxvY2suZGltZW5zaW9ucygpWzNdKTsKQEAgLTM1Myw4ICszMjQsNyBAQAogfQogCiB0ZW1wbGF0ZSA8aW50IExheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc2tld2VkX2lubmVyX2RpbV9ibG9ja19zaGFwZSgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X3NrZXdlZF9pbm5lcl9kaW1fYmxvY2tfc2hhcGUoKSB7CiAgIHR5cGVkZWYgaW50ZXJuYWw6OlRlbnNvckJsb2NrRGVzY3JpcHRvcjw1PiBUZW5zb3JCbG9jazsKICAgdHlwZWRlZiBpbnRlcm5hbDo6VGVuc29yQmxvY2tNYXBwZXI8NSwgTGF5b3V0PiBUZW5zb3JCbG9ja01hcHBlcjsKIApAQCAtMzYyLDkgKzMzMiw3IEBACiAgIGlmIChMYXlvdXQgPT0gQ29sTWFqb3IpIHsKICAgICBEU2l6ZXM8SW5kZXgsIDU+IGRpbXMoMTEsIDUsIDYsIDE3LCA3KTsKICAgICBjb25zdCBJbmRleCBtYXhfY29lZmZfY291bnQgPSAxMCAqIDEgKiAxICogMSAqIDE7Ci0gICAgVGVuc29yQmxvY2tNYXBwZXIgYmxvY2tfbWFwcGVyKAotICAgICAgICBkaW1zLAotICAgICAgICB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtTa2V3ZWRJbm5lckRpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOworICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtTa2V3ZWRJbm5lckRpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOwogICAgIFRlbnNvckJsb2NrIGJsb2NrID0gYmxvY2tfbWFwcGVyLmJsb2NrRGVzY3JpcHRvcigwKTsKICAgICBWRVJJRllfSVNfRVFVQUwoMTAsIGJsb2NrLmRpbWVuc2lvbnMoKVswXSk7CiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyArK2kpIHsKQEAgLTM3NCw5ICszNDIsNyBAQAogICB9IGVsc2UgewogICAgIERTaXplczxJbmRleCwgNT4gZGltcygxMSwgNSwgNiwgMTcsIDcpOwogICAgIGNvbnN0IEluZGV4IG1heF9jb2VmZl9jb3VudCA9IDEgKiAxICogMSAqIDEgKiA2OwotICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcigKLSAgICAgICAgZGltcywKLSAgICAgICAge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprU2tld2VkSW5uZXJEaW1zLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKKyAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprU2tld2VkSW5uZXJEaW1zLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKICAgICBUZW5zb3JCbG9jayBibG9jayA9IGJsb2NrX21hcHBlci5ibG9ja0Rlc2NyaXB0b3IoMCk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKDYsIGJsb2NrLmRpbWVuc2lvbnMoKVs0XSk7CiAgICAgZm9yIChpbnQgaSA9IDM7IGkgPj0gMDsgLS1pKSB7CkBAIC0zODksOSArMzU1LDcgQEAKICAgaWYgKExheW91dCA9PSBDb2xNYWpvcikgewogICAgIERTaXplczxJbmRleCwgNT4gZGltcygxMSwgNSwgNiwgMTcsIDcpOwogICAgIGNvbnN0IEluZGV4IG1heF9jb2VmZl9jb3VudCA9IDExICogMSAqIDEgKiAxICogMTsKLSAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoCi0gICAgICAgIGRpbXMsCi0gICAgICAgIHtUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1NrZXdlZElubmVyRGltcywgbWF4X2NvZWZmX2NvdW50LCB6ZXJvQ29zdCgpfSk7CisgICAgVGVuc29yQmxvY2tNYXBwZXIgYmxvY2tfbWFwcGVyKGRpbXMsIHtUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1NrZXdlZElubmVyRGltcywgbWF4X2NvZWZmX2NvdW50LCB6ZXJvQ29zdCgpfSk7CiAgICAgVGVuc29yQmxvY2sgYmxvY2sgPSBibG9ja19tYXBwZXIuYmxvY2tEZXNjcmlwdG9yKDApOwogICAgIFZFUklGWV9JU19FUVVBTCgxMSwgYmxvY2suZGltZW5zaW9ucygpWzBdKTsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7ICsraSkgewpAQCAtNDAxLDkgKzM2NSw3IEBACiAgIH0gZWxzZSB7CiAgICAgRFNpemVzPEluZGV4LCA1PiBkaW1zKDExLCA1LCA2LCAxNywgNyk7CiAgICAgY29uc3QgSW5kZXggbWF4X2NvZWZmX2NvdW50ID0gMSAqIDEgKiAxICogMSAqIDc7Ci0gICAgVGVuc29yQmxvY2tNYXBwZXIgYmxvY2tfbWFwcGVyKAotICAgICAgICBkaW1zLAotICAgICAgICB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtTa2V3ZWRJbm5lckRpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOworICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtTa2V3ZWRJbm5lckRpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOwogICAgIFRlbnNvckJsb2NrIGJsb2NrID0gYmxvY2tfbWFwcGVyLmJsb2NrRGVzY3JpcHRvcigwKTsKICAgICBWRVJJRllfSVNfRVFVQUwoNywgYmxvY2suZGltZW5zaW9ucygpWzRdKTsKICAgICBmb3IgKGludCBpID0gMzsgaSA+PSAwOyAtLWkpIHsKQEAgLTQxNyw5ICszNzksNyBAQAogICBpZiAoTGF5b3V0ID09IENvbE1ham9yKSB7CiAgICAgRFNpemVzPEluZGV4LCA1PiBkaW1zKDExLCA1LCA2LCAxNywgNyk7CiAgICAgY29uc3QgSW5kZXggbWF4X2NvZWZmX2NvdW50ID0gMTEgKiAzICogMSAqIDEgKiAxOwotICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcigKLSAgICAgICAgZGltcywKLSAgICAgICAge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprU2tld2VkSW5uZXJEaW1zLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKKyAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprU2tld2VkSW5uZXJEaW1zLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKICAgICBUZW5zb3JCbG9jayBibG9jayA9IGJsb2NrX21hcHBlci5ibG9ja0Rlc2NyaXB0b3IoMCk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKDExLCBibG9jay5kaW1lbnNpb25zKClbMF0pOwogICAgIFZFUklGWV9JU19FUVVBTCgzLCBibG9jay5kaW1lbnNpb25zKClbMV0pOwpAQCAtNDMwLDkgKzM5MCw3IEBACiAgIH0gZWxzZSB7CiAgICAgRFNpemVzPEluZGV4LCA1PiBkaW1zKDExLCA1LCA2LCAxNywgNyk7CiAgICAgY29uc3QgSW5kZXggbWF4X2NvZWZmX2NvdW50ID0gMSAqIDEgKiAxICogMTUgKiA3OwotICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcigKLSAgICAgICAgZGltcywKLSAgICAgICAge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprU2tld2VkSW5uZXJEaW1zLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKKyAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprU2tld2VkSW5uZXJEaW1zLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKICAgICBUZW5zb3JCbG9jayBibG9jayA9IGJsb2NrX21hcHBlci5ibG9ja0Rlc2NyaXB0b3IoMCk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKDcsIGJsb2NrLmRpbWVuc2lvbnMoKVs0XSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKDE1LCBibG9jay5kaW1lbnNpb25zKClbM10pOwpAQCAtNDQ3LDkgKzQwNSw3IEBACiAgIGlmIChMYXlvdXQgPT0gQ29sTWFqb3IpIHsKICAgICBEU2l6ZXM8SW5kZXgsIDU+IGRpbXMoMTEsIDUsIDYsIDE3LCA3KTsKICAgICBjb25zdCBJbmRleCBtYXhfY29lZmZfY291bnQgPSAxMSAqIDUgKiA1ICogMSAqIDE7Ci0gICAgVGVuc29yQmxvY2tNYXBwZXIgYmxvY2tfbWFwcGVyKAotICAgICAgICBkaW1zLAotICAgICAgICB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtTa2V3ZWRJbm5lckRpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOworICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtTa2V3ZWRJbm5lckRpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOwogICAgIFRlbnNvckJsb2NrIGJsb2NrID0gYmxvY2tfbWFwcGVyLmJsb2NrRGVzY3JpcHRvcigwKTsKICAgICBWRVJJRllfSVNfRVFVQUwoMTEsIGJsb2NrLmRpbWVuc2lvbnMoKVswXSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKDUsIGJsb2NrLmRpbWVuc2lvbnMoKVsxXSk7CkBAIC00NjEsOSArNDE3LDcgQEAKICAgfSBlbHNlIHsKICAgICBEU2l6ZXM8SW5kZXgsIDU+IGRpbXMoMTEsIDUsIDYsIDE3LCA3KTsKICAgICBjb25zdCBJbmRleCBtYXhfY29lZmZfY291bnQgPSAxICogMSAqIDUgKiAxNyAqIDc7Ci0gICAgVGVuc29yQmxvY2tNYXBwZXIgYmxvY2tfbWFwcGVyKAotICAgICAgICBkaW1zLAotICAgICAgICB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtTa2V3ZWRJbm5lckRpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOworICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtTa2V3ZWRJbm5lckRpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOwogICAgIFRlbnNvckJsb2NrIGJsb2NrID0gYmxvY2tfbWFwcGVyLmJsb2NrRGVzY3JpcHRvcigwKTsKICAgICBWRVJJRllfSVNfRVFVQUwoNywgYmxvY2suZGltZW5zaW9ucygpWzRdKTsKICAgICBWRVJJRllfSVNfRVFVQUwoMTcsIGJsb2NrLmRpbWVuc2lvbnMoKVszXSk7CkBAIC00NzgsOSArNDMyLDcgQEAKICAgaWYgKExheW91dCA9PSBDb2xNYWpvcikgewogICAgIERTaXplczxJbmRleCwgNT4gZGltcygxMSwgNSwgNiwgMTcsIDcpOwogICAgIGNvbnN0IEluZGV4IG1heF9jb2VmZl9jb3VudCA9IDExICogNSAqIDYgKiAxNyAqIDc7Ci0gICAgVGVuc29yQmxvY2tNYXBwZXIgYmxvY2tfbWFwcGVyKAotICAgICAgICBkaW1zLAotICAgICAgICB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtTa2V3ZWRJbm5lckRpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOworICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtTa2V3ZWRJbm5lckRpbXMsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOwogICAgIFRlbnNvckJsb2NrIGJsb2NrID0gYmxvY2tfbWFwcGVyLmJsb2NrRGVzY3JpcHRvcigwKTsKICAgICBWRVJJRllfSVNfRVFVQUwoMTEsIGJsb2NrLmRpbWVuc2lvbnMoKVswXSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKDUsIGJsb2NrLmRpbWVuc2lvbnMoKVsxXSk7CkBAIC00OTEsOSArNDQzLDcgQEAKICAgfSBlbHNlIHsKICAgICBEU2l6ZXM8SW5kZXgsIDU+IGRpbXMoMTEsIDUsIDYsIDE3LCA3KTsKICAgICBjb25zdCBJbmRleCBtYXhfY29lZmZfY291bnQgPSAxMSAqIDUgKiA2ICogMTcgKiA3OwotICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcigKLSAgICAgICAgZGltcywKLSAgICAgICAge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprU2tld2VkSW5uZXJEaW1zLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKKyAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1RlbnNvckJsb2NrU2hhcGVUeXBlOjprU2tld2VkSW5uZXJEaW1zLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKICAgICBUZW5zb3JCbG9jayBibG9jayA9IGJsb2NrX21hcHBlci5ibG9ja0Rlc2NyaXB0b3IoMCk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKDcsIGJsb2NrLmRpbWVuc2lvbnMoKVs0XSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKDE3LCBibG9jay5kaW1lbnNpb25zKClbM10pOwpAQCAtNTA1LDggKzQ1NSw3IEBACiB9CiAKIHRlbXBsYXRlIDxpbnQgTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9lbXB0eV9kaW1zKGNvbnN0IGludGVybmFsOjpUZW5zb3JCbG9ja1NoYXBlVHlwZSBibG9ja19zaGFwZSkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfZW1wdHlfZGltcyhjb25zdCBpbnRlcm5hbDo6VGVuc29yQmxvY2tTaGFwZVR5cGUgYmxvY2tfc2hhcGUpIHsKICAgLy8gVGVzdCBibG9ja2luZyBvZiB0ZW5zb3JzIHdpdGggemVybyBkaW1lbnNpb25zOgogICAvLyAgLSB3ZSBtdXN0IG5vdCBjcmFzaCBvbiBhc3NlcnRzIGFuZCBkaXZpc2lvbnMgYnkgemVybwogICAvLyAgLSB3ZSBtdXN0IG5vdCByZXR1cm4gYmxvY2sgd2l0aCB6ZXJvIGRpbWVuc2lvbnMKQEAgLTUxNyw4ICs0NjYsNyBAQAogCiAgICAgRFNpemVzPEluZGV4LCAxPiBkaW1zKDApOwogICAgIGZvciAoc2l6ZV90IG1heF9jb2VmZl9jb3VudCA9IDA7IG1heF9jb2VmZl9jb3VudCA8IDI7ICsrbWF4X2NvZWZmX2NvdW50KSB7Ci0gICAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoCi0gICAgICAgICAgZGltcywge2Jsb2NrX3NoYXBlLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKKyAgICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcihkaW1zLCB7YmxvY2tfc2hhcGUsIG1heF9jb2VmZl9jb3VudCwgemVyb0Nvc3QoKX0pOwogICAgICAgVkVSSUZZX0lTX0VRVUFMKGJsb2NrX21hcHBlci5ibG9ja0NvdW50KCksIDApOwogICAgICAgVkVSSUZZKGJsb2NrX21hcHBlci5ibG9ja1RvdGFsU2l6ZSgpID49IDEpOwogICAgIH0KQEAgLTUzMSw4ICs0NzksNyBAQAogICAgICAgZm9yIChpbnQgZGltMiA9IDA7IGRpbTIgPCAzOyArK2RpbTIpIHsKICAgICAgICAgRFNpemVzPEluZGV4LCAyPiBkaW1zKGRpbTEsIGRpbTIpOwogICAgICAgICBmb3IgKHNpemVfdCBtYXhfY29lZmZfY291bnQgPSAwOyBtYXhfY29lZmZfY291bnQgPCAyOyArK21heF9jb2VmZl9jb3VudCkgewotICAgICAgICAgIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcigKLSAgICAgICAgICAgICAgZGltcywge2Jsb2NrX3NoYXBlLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKKyAgICAgICAgICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge2Jsb2NrX3NoYXBlLCBtYXhfY29lZmZfY291bnQsIHplcm9Db3N0KCl9KTsKICAgICAgICAgICBpZiAoZGltMSAqIGRpbTIgPT0gMCkgewogICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGJsb2NrX21hcHBlci5ibG9ja0NvdW50KCksIDApOwogICAgICAgICAgIH0KQEAgLTU0Myw3ICs0OTAsNyBAQAogICB9CiB9CiAKLSNkZWZpbmUgVEVTVF9MQVlPVVRTKE5BTUUpIFwKKyNkZWZpbmUgVEVTVF9MQVlPVVRTKE5BTUUpICAgICAgICBcCiAgIENBTExfU1VCVEVTVChOQU1FPENvbE1ham9yPigpKTsgXAogICBDQUxMX1NVQlRFU1QoTkFNRTxSb3dNYWpvcj4oKSkKIApAQCAtNTYwLDcgKzUwNyw3IEBACiAgIENBTExfU1VCVEVTVCgoTkFNRTxUWVBFLCA1LCBSb3dNYWpvcj4oKSkpCiAKICNkZWZpbmUgVEVTVF9MQVlPVVRTX1dJVEhfQVJHKE5BTUUsIEFSRykgXAotICBDQUxMX1NVQlRFU1QoTkFNRTxDb2xNYWpvcj4oQVJHKSk7IFwKKyAgQ0FMTF9TVUJURVNUKE5BTUU8Q29sTWFqb3I+KEFSRykpOyAgICAgXAogICBDQUxMX1NVQlRFU1QoTkFNRTxSb3dNYWpvcj4oQVJHKSkKIAogRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9ibG9ja19hY2Nlc3MpIHsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Jsb2NrX2V2YWwuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYmxvY2tfZXZhbC5jcHAKaW5kZXggZDY2YTYzZS4uNzVlMmI4YyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYmxvY2tfZXZhbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYmxvY2tfZXZhbC5jcHAKQEAgLTM1LDggKzM1LDcgQEAKIH07CiAKIHRlbXBsYXRlIDxpbnQgTGF5b3V0LCBpbnQgTnVtRGltcz4KLXN0YXRpYyBUZW5zb3JCbG9ja1BhcmFtczxOdW1EaW1zPiBSYW5kb21CbG9jayhEU2l6ZXM8SW5kZXgsIE51bURpbXM+IGRpbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggbWluLCBJbmRleCBtYXgpIHsKK3N0YXRpYyBUZW5zb3JCbG9ja1BhcmFtczxOdW1EaW1zPiBSYW5kb21CbG9jayhEU2l6ZXM8SW5kZXgsIE51bURpbXM+IGRpbXMsIEluZGV4IG1pbiwgSW5kZXggbWF4KSB7CiAgIC8vIENob29zZSByYW5kb20gb2Zmc2V0cyBhbmQgc2l6ZXMgYWxvbmcgYWxsIHRlbnNvciBkaW1lbnNpb25zLgogICBEU2l6ZXM8SW5kZXgsIE51bURpbXM+IG9mZnNldHMoUmFuZG9tRGltczxOdW1EaW1zPihtaW4sIG1heCkpOwogICBEU2l6ZXM8SW5kZXgsIE51bURpbXM+IHNpemVzKFJhbmRvbURpbXM8TnVtRGltcz4obWluLCBtYXgpKTsKQEAgLTU5LDEzICs1OCwxMSBAQAogLy8gR2VuZXJhdGUgYmxvY2sgd2l0aCBibG9jayBzaXplcyBza2V3ZWQgdG93YXJkcyBpbm5lciBkaW1lbnNpb25zLiBUaGlzIHR5cGUgb2YKIC8vIGJsb2NrIGlzIHJlcXVpcmVkIGZvciBldmFsdWF0aW5nIGJyb2FkY2FzdCBleHByZXNzaW9ucy4KIHRlbXBsYXRlIDxpbnQgTGF5b3V0LCBpbnQgTnVtRGltcz4KLXN0YXRpYyBUZW5zb3JCbG9ja1BhcmFtczxOdW1EaW1zPiBTa2V3ZWRJbm5lckJsb2NrKAotICAgIERTaXplczxJbmRleCwgTnVtRGltcz4gZGltcykgeworc3RhdGljIFRlbnNvckJsb2NrUGFyYW1zPE51bURpbXM+IFNrZXdlZElubmVyQmxvY2soRFNpemVzPEluZGV4LCBOdW1EaW1zPiBkaW1zKSB7CiAgIHVzaW5nIEJsb2NrTWFwcGVyID0gaW50ZXJuYWw6OlRlbnNvckJsb2NrTWFwcGVyPE51bURpbXMsIExheW91dCwgSW5kZXg+OwotICBCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpbnRlcm5hbDo6VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtTa2V3ZWRJbm5lckRpbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxzaXplX3Q+KDEsIGRpbXMuVG90YWxTaXplKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwLCAwfX0pOworICBCbG9ja01hcHBlciBibG9ja19tYXBwZXIoCisgICAgICBkaW1zLAorICAgICAge2ludGVybmFsOjpUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1NrZXdlZElubmVyRGltcywgaW50ZXJuYWw6OnJhbmRvbTxzaXplX3Q+KDEsIGRpbXMuVG90YWxTaXplKCkpLCB7MCwgMCwgMH19KTsKIAogICBJbmRleCB0b3RhbF9ibG9ja3MgPSBibG9ja19tYXBwZXIuYmxvY2tDb3VudCgpOwogICBJbmRleCBibG9ja19pbmRleCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDAsIHRvdGFsX2Jsb2NrcyAtIDEpOwpAQCAtMTE5LDggKzExNiw3IEBACiAvLyBWZXJpZnkgdGhhdCBibG9jayBleHByZXNzaW9uIGV2YWx1YXRpb24gcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0IGFzIGEKIC8vIFRlbnNvclNsaWNlT3AgKHJlYWRpbmcgYSB0ZW5zb3IgYmxvY2sgaXMgc2FtZSB0byB0YWtpbmcgYSB0ZW5zb3Igc2xpY2UpLgogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIGludCBMYXlvdXQsIHR5cGVuYW1lIEV4cHJlc3Npb24sCi0gICAgICAgICAgdHlwZW5hbWUgR2VuQmxvY2tQYXJhbXM+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIGludCBMYXlvdXQsIHR5cGVuYW1lIEV4cHJlc3Npb24sIHR5cGVuYW1lIEdlbkJsb2NrUGFyYW1zPgogc3RhdGljIHZvaWQgVmVyaWZ5QmxvY2tFdmFsdWF0b3IoRXhwcmVzc2lvbiBleHByLCBHZW5CbG9ja1BhcmFtcyBnZW5fYmxvY2spIHsKICAgdXNpbmcgRGV2aWNlID0gRGVmYXVsdERldmljZTsKICAgYXV0byBkID0gRGV2aWNlKCk7CkBAIC0xNTQsOCArMTUwLDcgQEAKICAgVGVuc29yPFQsIE51bURpbXMsIExheW91dD4gZHN0KGRzdF9kaW1zKTsKICAgZHN0LnNldFplcm8oKTsKICAgaWYgKGludGVybmFsOjpyYW5kb208Ym9vbD4oKSkgewotICAgIGJsb2NrX3BhcmFtcy5kZXNjLnRlbXBsYXRlIEFkZERlc3RpbmF0aW9uQnVmZmVyPExheW91dD4oCi0gICAgICAgIGRzdC5kYXRhKCksIGludGVybmFsOjpzdHJpZGVzPExheW91dD4oZHN0LmRpbWVuc2lvbnMoKSkpOworICAgIGJsb2NrX3BhcmFtcy5kZXNjLnRlbXBsYXRlIEFkZERlc3RpbmF0aW9uQnVmZmVyPExheW91dD4oZHN0LmRhdGEoKSwgaW50ZXJuYWw6OnN0cmlkZXM8TGF5b3V0Pihkc3QuZGltZW5zaW9ucygpKSk7CiAgIH0KIAogICBjb25zdCBib29sIHJvb3Rfb2ZfZXhwciA9IGludGVybmFsOjpyYW5kb208Ym9vbD4oKTsKQEAgLTE3OCw4ICsxNzMsNyBAQAogICAgIC8vIFdlIGV4cGxpY2l0bHkgZGlzYWJsZSB2ZWN0b3JpemF0aW9uIGFuZCB0aWxpbmcsIHRvIHJ1biBhIHNpbXBsZSBjb2VmZmljaWVudAogICAgIC8vIHdpc2UgYXNzaWdubWVudCBsb29wLCBiZWNhdXNlIGl0J3MgdmVyeSBzaW1wbGUgYW5kIHNob3VsZCBiZSBjb3JyZWN0LgogICAgIHVzaW5nIEJsb2NrQXNzaWduID0gVGVuc29yQXNzaWduT3A8ZGVjbHR5cGUoYmxvY2spLCBjb25zdCBkZWNsdHlwZShiX2V4cHIpPjsKLSAgICB1c2luZyBCbG9ja0V4ZWN1dG9yID0gVGVuc29yRXhlY3V0b3I8Y29uc3QgQmxvY2tBc3NpZ24sIERldmljZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUaWxlZEV2YWx1YXRpb246Ok9mZj47CisgICAgdXNpbmcgQmxvY2tFeGVjdXRvciA9IFRlbnNvckV4ZWN1dG9yPGNvbnN0IEJsb2NrQXNzaWduLCBEZXZpY2UsIGZhbHNlLCBpbnRlcm5hbDo6VGlsZWRFdmFsdWF0aW9uOjpPZmY+OwogICAgIEJsb2NrRXhlY3V0b3I6OnJ1bihCbG9ja0Fzc2lnbihibG9jaywgYl9leHByKSwgZCk7CiAgIH0KIApAQCAtMTkyLDggKzE4Niw3IEBACiAKICAgLy8gRXhwbGljaXRseSB1c2UgY29lZmZpY2llbnQgYXNzaWdubWVudCB0byBldmFsdWF0ZSBzbGljZSBleHByZXNzaW9uLgogICB1c2luZyBTbGljZUFzc2lnbiA9IFRlbnNvckFzc2lnbk9wPGRlY2x0eXBlKHNsaWNlKSwgY29uc3QgZGVjbHR5cGUoc19leHByKT47Ci0gIHVzaW5nIFNsaWNlRXhlY3V0b3IgPSBUZW5zb3JFeGVjdXRvcjxjb25zdCBTbGljZUFzc2lnbiwgRGV2aWNlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUaWxlZEV2YWx1YXRpb246Ok9mZj47CisgIHVzaW5nIFNsaWNlRXhlY3V0b3IgPSBUZW5zb3JFeGVjdXRvcjxjb25zdCBTbGljZUFzc2lnbiwgRGV2aWNlLCBmYWxzZSwgaW50ZXJuYWw6OlRpbGVkRXZhbHVhdGlvbjo6T2ZmPjsKICAgU2xpY2VFeGVjdXRvcjo6cnVuKFNsaWNlQXNzaWduKHNsaWNlLCBzX2V4cHIpLCBkKTsKIAogICAvLyBUZW5zb3IgYmxvY2sgYW5kIHRlbnNvciBzbGljZSBtdXN0IGJlIHRoZSBzYW1lLgpAQCAtMjExLDggKzIwNCw3IEBACiAgIGlucHV0LnNldFJhbmRvbSgpOwogCiAgIC8vIElkZW50aXR5IHRlbnNvciBleHByZXNzaW9uIHRyYW5zZm9ybWF0aW9uLgotICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KAotICAgICAgaW5wdXQsIFsmZGltc10oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KGRpbXMsIDEsIDEwKTsgfSk7CisgIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oaW5wdXQsIFsmZGltc10oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KGRpbXMsIDEsIDEwKTsgfSk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTnVtRGltcywgaW50IExheW91dD4KQEAgLTIyMSw4ICsyMTMsNyBAQAogICBUZW5zb3I8VCwgTnVtRGltcywgTGF5b3V0PiBpbnB1dChkaW1zKTsKICAgaW5wdXQuc2V0UmFuZG9tKCk7CiAKLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgIGlucHV0LmFicygpLCBbJmRpbXNdKCkgeyByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0PihkaW1zLCAxLCAxMCk7IH0pOworICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KGlucHV0LmFicygpLCBbJmRpbXNdKCkgeyByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0PihkaW1zLCAxLCAxMCk7IH0pOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIGludCBMYXlvdXQ+CkBAIC0yMzIsOCArMjIzLDcgQEAKICAgbGhzLnNldFJhbmRvbSgpOwogICByaHMuc2V0UmFuZG9tKCk7CiAKLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgIGxocyAqIHJocywgWyZkaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oZGltcywgMSwgMTApOyB9KTsKKyAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PihsaHMgKiByaHMsIFsmZGltc10oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KGRpbXMsIDEsIDEwKTsgfSk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTnVtRGltcywgaW50IExheW91dD4KQEAgLTI0Myw5ICsyMzMsOCBAQAogICBsaHMuc2V0UmFuZG9tKCk7CiAgIHJocy5zZXRSYW5kb20oKTsKIAotICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KAotICAgICAgKGxocy5hYnMoKSArIHJocy5hYnMoKSkuc3FydCgpLAotICAgICAgWyZkaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oZGltcywgMSwgMTApOyB9KTsKKyAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PigobGhzLmFicygpICsgcmhzLmFicygpKS5zcXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZkaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oZGltcywgMSwgMTApOyB9KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCBpbnQgTGF5b3V0PgpAQCAtMjU5LDIzICsyNDgsMTkgQEAKICAgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBiY2FzdGVkX2RpbXM7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltczsgKytpKSBiY2FzdGVkX2RpbXNbaV0gPSBkaW1zW2ldICogYmNhc3RbaV07CiAKLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgIGlucHV0LmJyb2FkY2FzdChiY2FzdCksCi0gICAgICBbJmJjYXN0ZWRfZGltc10oKSB7IHJldHVybiBTa2V3ZWRJbm5lckJsb2NrPExheW91dD4oYmNhc3RlZF9kaW1zKTsgfSk7CisgIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oaW5wdXQuYnJvYWRjYXN0KGJjYXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmJjYXN0ZWRfZGltc10oKSB7IHJldHVybiBTa2V3ZWRJbm5lckJsb2NrPExheW91dD4oYmNhc3RlZF9kaW1zKTsgfSk7CiAKLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgIGlucHV0LmJyb2FkY2FzdChiY2FzdCksCi0gICAgICBbJmJjYXN0ZWRfZGltc10oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KGJjYXN0ZWRfZGltcywgNSwgMTApOyB9KTsKKyAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PihpbnB1dC5icm9hZGNhc3QoYmNhc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmYmNhc3RlZF9kaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oYmNhc3RlZF9kaW1zLCA1LCAxMCk7IH0pOwogCi0gIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oCi0gICAgICBpbnB1dC5icm9hZGNhc3QoYmNhc3QpLAotICAgICAgWyZiY2FzdGVkX2RpbXNdKCkgeyByZXR1cm4gRml4ZWRTaXplQmxvY2soYmNhc3RlZF9kaW1zKTsgfSk7CisgIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oaW5wdXQuYnJvYWRjYXN0KGJjYXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmJjYXN0ZWRfZGltc10oKSB7IHJldHVybiBGaXhlZFNpemVCbG9jayhiY2FzdGVkX2RpbXMpOyB9KTsKIAogICAvLyBDaGVjayB0aGF0IGRlc2MuZGVzdGluYXRpb24oKSBtZW1vcnkgaXMgbm90IHNoYXJlZCBiZXR3ZWVuIHR3byBicm9hZGNhc3QKICAgLy8gbWF0ZXJpYWxpemF0aW9ucy4KLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgIGlucHV0LmJyb2FkY2FzdChiY2FzdCkgKiBpbnB1dC5hYnMoKS5icm9hZGNhc3QoYmNhc3QpLAotICAgICAgWyZiY2FzdGVkX2RpbXNdKCkgeyByZXR1cm4gU2tld2VkSW5uZXJCbG9jazxMYXlvdXQ+KGJjYXN0ZWRfZGltcyk7IH0pOworICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KGlucHV0LmJyb2FkY2FzdChiY2FzdCkgKiBpbnB1dC5hYnMoKS5icm9hZGNhc3QoYmNhc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmYmNhc3RlZF9kaW1zXSgpIHsgcmV0dXJuIFNrZXdlZElubmVyQmxvY2s8TGF5b3V0PihiY2FzdGVkX2RpbXMpOyB9KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCBpbnQgTGF5b3V0PgpAQCAtMjg4LDEzICsyNzMsMTEgQEAKICAgVGVuc29yPFQsIE51bURpbXMsIExheW91dD4gaW5wdXQoZGltcyk7CiAgIGlucHV0LnNldFJhbmRvbSgpOwogCi0gIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oCi0gICAgICBpbnB1dC5yZXNoYXBlKHNodWZmbGVkKSwKLSAgICAgIFsmc2h1ZmZsZWRdKCkgeyByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0PihzaHVmZmxlZCwgMSwgMTApOyB9KTsKKyAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PihpbnB1dC5yZXNoYXBlKHNodWZmbGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnNodWZmbGVkXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oc2h1ZmZsZWQsIDEsIDEwKTsgfSk7CiAKLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgIGlucHV0LnJlc2hhcGUoc2h1ZmZsZWQpLAotICAgICAgWyZzaHVmZmxlZF0oKSB7IHJldHVybiBTa2V3ZWRJbm5lckJsb2NrPExheW91dD4oc2h1ZmZsZWQpOyB9KTsKKyAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PihpbnB1dC5yZXNoYXBlKHNodWZmbGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnNodWZmbGVkXSgpIHsgcmV0dXJuIFNrZXdlZElubmVyQmxvY2s8TGF5b3V0PihzaHVmZmxlZCk7IH0pOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIGludCBMYXlvdXQ+CkBAIC0zMDMsOSArMjg2LDggQEAKICAgVGVuc29yPFQsIE51bURpbXMsIExheW91dD4gaW5wdXQoZGltcyk7CiAgIGlucHV0LnNldFJhbmRvbSgpOwogCi0gIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oCi0gICAgICBpbnB1dC50ZW1wbGF0ZSBjYXN0PGludD4oKS50ZW1wbGF0ZSBjYXN0PFQ+KCksCi0gICAgICBbJmRpbXNdKCkgeyByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0PihkaW1zLCAxLCAxMCk7IH0pOworICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KGlucHV0LnRlbXBsYXRlIGNhc3Q8aW50PigpLnRlbXBsYXRlIGNhc3Q8VD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmRpbXNdKCkgeyByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0PihkaW1zLCAxLCAxMCk7IH0pOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIGludCBMYXlvdXQ+CkBAIC0zMTgsOSArMzAwLDggQEAKICAgcmhzLnNldFJhbmRvbSgpOwogICBjb25kLnNldFJhbmRvbSgpOwogCi0gIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oY29uZC5zZWxlY3QobGhzLCByaHMpLCBbJmRpbXNdKCkgewotICAgIHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KGRpbXMsIDEsIDIwKTsKLSAgfSk7CisgIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oY29uZC5zZWxlY3QobGhzLCByaHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmZGltc10oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KGRpbXMsIDEsIDIwKTsgfSk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTnVtRGltcywgaW50IExheW91dD4KQEAgLTM1MCwxNyArMzMxLDE0IEBACiAgICAgcGFkZGVkX2RpbXNbaV0gPSBkaW1zW2ldICsgcGFkX2JlZm9yZVtpXSArIHBhZF9hZnRlcltpXTsKICAgfQogCi0gIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oCi0gICAgICBpbnB1dC5wYWQocGFkZGluZ3MpLAotICAgICAgWyZwYWRkZWRfZGltc10oKSB7IHJldHVybiBGaXhlZFNpemVCbG9jayhwYWRkZWRfZGltcyk7IH0pOworICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KGlucHV0LnBhZChwYWRkaW5ncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZwYWRkZWRfZGltc10oKSB7IHJldHVybiBGaXhlZFNpemVCbG9jayhwYWRkZWRfZGltcyk7IH0pOwogCi0gIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oCi0gICAgICBpbnB1dC5wYWQocGFkZGluZ3MpLAotICAgICAgWyZwYWRkZWRfZGltc10oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KHBhZGRlZF9kaW1zLCAxLCAxMCk7IH0pOworICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KGlucHV0LnBhZChwYWRkaW5ncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZwYWRkZWRfZGltc10oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KHBhZGRlZF9kaW1zLCAxLCAxMCk7IH0pOwogCi0gIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oCi0gICAgICBpbnB1dC5wYWQocGFkZGluZ3MpLAotICAgICAgWyZwYWRkZWRfZGltc10oKSB7IHJldHVybiBTa2V3ZWRJbm5lckJsb2NrPExheW91dD4ocGFkZGVkX2RpbXMpOyB9KTsKKyAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PihpbnB1dC5wYWQocGFkZGluZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmcGFkZGVkX2RpbXNdKCkgeyByZXR1cm4gU2tld2VkSW5uZXJCbG9jazxMYXlvdXQ+KHBhZGRlZF9kaW1zKTsgfSk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTnVtRGltcywgaW50IExheW91dD4KQEAgLTM4MSwyNiArMzU5LDIxIEBACiAgIH0KIAogICAvLyBCbG9jayBidWZmZXIgZm9yd2FyZGluZy4KLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcyAtIDEsIExheW91dD4oCi0gICAgICBpbnB1dC5jaGlwKGNoaXBfb2Zmc2V0LCBjaGlwX2RpbSksCi0gICAgICBbJmNoaXBwZWRfZGltc10oKSB7IHJldHVybiBGaXhlZFNpemVCbG9jayhjaGlwcGVkX2RpbXMpOyB9KTsKKyAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcyAtIDEsIExheW91dD4oaW5wdXQuY2hpcChjaGlwX29mZnNldCwgY2hpcF9kaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmNoaXBwZWRfZGltc10oKSB7IHJldHVybiBGaXhlZFNpemVCbG9jayhjaGlwcGVkX2RpbXMpOyB9KTsKIAotICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zIC0gMSwgTGF5b3V0PigKLSAgICAgIGlucHV0LmNoaXAoY2hpcF9vZmZzZXQsIGNoaXBfZGltKSwKLSAgICAgIFsmY2hpcHBlZF9kaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oY2hpcHBlZF9kaW1zLCAxLCAxMCk7IH0pOworICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zIC0gMSwgTGF5b3V0PihpbnB1dC5jaGlwKGNoaXBfb2Zmc2V0LCBjaGlwX2RpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmY2hpcHBlZF9kaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oY2hpcHBlZF9kaW1zLCAxLCAxMCk7IH0pOwogCiAgIC8vIEJsb2NrIGV4cHJlc3Npb24gYXNzaWdubWVudC4KLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcyAtIDEsIExheW91dD4oCi0gICAgICBpbnB1dC5hYnMoKS5jaGlwKGNoaXBfb2Zmc2V0LCBjaGlwX2RpbSksCi0gICAgICBbJmNoaXBwZWRfZGltc10oKSB7IHJldHVybiBGaXhlZFNpemVCbG9jayhjaGlwcGVkX2RpbXMpOyB9KTsKKyAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcyAtIDEsIExheW91dD4oaW5wdXQuYWJzKCkuY2hpcChjaGlwX29mZnNldCwgY2hpcF9kaW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmNoaXBwZWRfZGltc10oKSB7IHJldHVybiBGaXhlZFNpemVCbG9jayhjaGlwcGVkX2RpbXMpOyB9KTsKIAotICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zIC0gMSwgTGF5b3V0PigKLSAgICAgIGlucHV0LmFicygpLmNoaXAoY2hpcF9vZmZzZXQsIGNoaXBfZGltKSwKLSAgICAgIFsmY2hpcHBlZF9kaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oY2hpcHBlZF9kaW1zLCAxLCAxMCk7IH0pOworICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zIC0gMSwgTGF5b3V0PihpbnB1dC5hYnMoKS5jaGlwKGNoaXBfb2Zmc2V0LCBjaGlwX2RpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmY2hpcHBlZF9kaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oY2hpcHBlZF9kaW1zLCAxLCAxMCk7IH0pOwogfQogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zPgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zPgogc3RydWN0IFNpbXBsZVRlbnNvckdlbmVyYXRvciB7CiAgIFQgb3BlcmF0b3IoKShjb25zdCBhcnJheTxJbmRleCwgTnVtRGltcz4mIGNvb3JkcykgY29uc3QgewogICAgIFQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8VD4oMCk7CkBAIC00MTIsNyArMzg1LDcgQEAKIH07CiAKIC8vIEJvb2xlYW4gc3BlY2lhbGl6YXRpb24gdG8gYXZvaWQgLVdpbnQtaW4tYm9vbC1jb250ZXh0IHdhcm5pbmdzIG9uIEdDQy4KLXRlbXBsYXRlPGludCBOdW1EaW1zPgordGVtcGxhdGUgPGludCBOdW1EaW1zPgogc3RydWN0IFNpbXBsZVRlbnNvckdlbmVyYXRvcjxib29sLCBOdW1EaW1zPiB7CiAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBhcnJheTxJbmRleCwgTnVtRGltcz4mIGNvb3JkcykgY29uc3QgewogICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CkBAIC00MjMsNyArMzk2LDYgQEAKICAgfQogfTsKIAotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIGludCBMYXlvdXQ+CiBzdGF0aWMgdm9pZCB0ZXN0X2V2YWxfdGVuc29yX2dlbmVyYXRvcigpIHsKICAgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBkaW1zID0gUmFuZG9tRGltczxOdW1EaW1zPigxMCwgMjApOwpAQCAtNDMyLDEyICs0MDQsMTAgQEAKIAogICBhdXRvIGdlbmVyYXRvciA9IFNpbXBsZVRlbnNvckdlbmVyYXRvcjxULCBOdW1EaW1zPigpOwogCi0gIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oCi0gICAgICBpbnB1dC5nZW5lcmF0ZShnZW5lcmF0b3IpLCBbJmRpbXNdKCkgeyByZXR1cm4gRml4ZWRTaXplQmxvY2soZGltcyk7IH0pOworICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KGlucHV0LmdlbmVyYXRlKGdlbmVyYXRvciksIFsmZGltc10oKSB7IHJldHVybiBGaXhlZFNpemVCbG9jayhkaW1zKTsgfSk7CiAKLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgIGlucHV0LmdlbmVyYXRlKGdlbmVyYXRvciksCi0gICAgICBbJmRpbXNdKCkgeyByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0PihkaW1zLCAxLCAxMCk7IH0pOworICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KGlucHV0LmdlbmVyYXRlKGdlbmVyYXRvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZkaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oZGltcywgMSwgMTApOyB9KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCBpbnQgTGF5b3V0PgpAQCAtNDUwLDEyICs0MjAsMTAgQEAKICAgRWlnZW46OkRTaXplczxib29sLCBOdW1EaW1zPiByZXZlcnNlOwogICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXM7ICsraSkgcmV2ZXJzZVtpXSA9IGludGVybmFsOjpyYW5kb208Ym9vbD4oKTsKIAotICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KAotICAgICAgaW5wdXQucmV2ZXJzZShyZXZlcnNlKSwgWyZkaW1zXSgpIHsgcmV0dXJuIEZpeGVkU2l6ZUJsb2NrKGRpbXMpOyB9KTsKKyAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PihpbnB1dC5yZXZlcnNlKHJldmVyc2UpLCBbJmRpbXNdKCkgeyByZXR1cm4gRml4ZWRTaXplQmxvY2soZGltcyk7IH0pOwogCi0gIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIE51bURpbXMsIExheW91dD4oaW5wdXQucmV2ZXJzZShyZXZlcnNlKSwgWyZkaW1zXSgpIHsKLSAgICByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0PihkaW1zLCAxLCAxMCk7Ci0gIH0pOworICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KGlucHV0LnJldmVyc2UocmV2ZXJzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZkaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oZGltcywgMSwgMTApOyB9KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCBpbnQgTGF5b3V0PgpAQCAtNDc0LDEzICs0NDIsMTEgQEAKICAgICBzbGljZV9zaXplW2ldID0gbnVtZXh0OjptaW5pKHNsaWNlX3NpemVbaV0sIGRpbXNbaV0gLSBzbGljZV9zdGFydFtpXSk7CiAgIH0KIAotICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KAotICAgICAgaW5wdXQuc2xpY2Uoc2xpY2Vfc3RhcnQsIHNsaWNlX3NpemUpLAotICAgICAgWyZzbGljZV9zaXplXSgpIHsgcmV0dXJuIEZpeGVkU2l6ZUJsb2NrKHNsaWNlX3NpemUpOyB9KTsKKyAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PihpbnB1dC5zbGljZShzbGljZV9zdGFydCwgc2xpY2Vfc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzbGljZV9zaXplXSgpIHsgcmV0dXJuIEZpeGVkU2l6ZUJsb2NrKHNsaWNlX3NpemUpOyB9KTsKIAotICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KAotICAgICAgaW5wdXQuc2xpY2Uoc2xpY2Vfc3RhcnQsIHNsaWNlX3NpemUpLAotICAgICAgWyZzbGljZV9zaXplXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oc2xpY2Vfc2l6ZSwgMSwgMTApOyB9KTsKKyAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PihpbnB1dC5zbGljZShzbGljZV9zdGFydCwgc2xpY2Vfc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzbGljZV9zaXplXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oc2xpY2Vfc2l6ZSwgMSwgMTApOyB9KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCBpbnQgTGF5b3V0PgpAQCAtNDk2LDE0ICs0NjIsMTEgQEAKICAgICBEU2l6ZXM8SW5kZXgsIE51bURpbXM+IHNodWZmbGVkX2RpbXM7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1EaW1zOyArK2kpIHNodWZmbGVkX2RpbXNbaV0gPSBkaW1zW3NodWZmbGVbaV1dOwogCi0gICAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgICAgaW5wdXQuc2h1ZmZsZShzaHVmZmxlKSwKLSAgICAgICAgWyZzaHVmZmxlZF9kaW1zXSgpIHsgcmV0dXJuIEZpeGVkU2l6ZUJsb2NrKHNodWZmbGVkX2RpbXMpOyB9KTsKKyAgICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCBOdW1EaW1zLCBMYXlvdXQ+KGlucHV0LnNodWZmbGUoc2h1ZmZsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnNodWZmbGVkX2RpbXNdKCkgeyByZXR1cm4gRml4ZWRTaXplQmxvY2soc2h1ZmZsZWRfZGltcyk7IH0pOwogCi0gICAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgICAgaW5wdXQuc2h1ZmZsZShzaHVmZmxlKSwgWyZzaHVmZmxlZF9kaW1zXSgpIHsKLSAgICAgICAgICByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0PihzaHVmZmxlZF9kaW1zLCAxLCA1KTsKLSAgICAgICAgfSk7CisgICAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgTnVtRGltcywgTGF5b3V0PihpbnB1dC5zaHVmZmxlKHNodWZmbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzaHVmZmxlZF9kaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oc2h1ZmZsZWRfZGltcywgMSwgNSk7IH0pOwogCiAgICAgYnJlYWs7CiAKQEAgLTUyOCw4ICs0OTEsNyBAQAogICBEU2l6ZXM8SW5kZXgsIDI+IGRpbXMoZGltLCBkaW0pOwogCiAgIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIDIsIExheW91dD4oCi0gICAgICBsaHMucmVzaGFwZShyZXNoYXBlTGhzKS5icm9hZGNhc3QoYmNhc3RMaHMpICoKLSAgICAgICAgICByaHMucmVzaGFwZShyZXNoYXBlUmhzKS5icm9hZGNhc3QoYmNhc3RSaHMpLAorICAgICAgbGhzLnJlc2hhcGUocmVzaGFwZUxocykuYnJvYWRjYXN0KGJjYXN0TGhzKSAqIHJocy5yZXNoYXBlKHJlc2hhcGVSaHMpLmJyb2FkY2FzdChiY2FzdFJocyksCiAgICAgICBbZGltc10oKSB7IHJldHVybiBTa2V3ZWRJbm5lckJsb2NrPExheW91dCwgMj4oZGltcyk7IH0pOwogfQogCkBAIC01NDcsMTMgKzUwOSwxMSBAQAogCiAgIERTaXplczxJbmRleCwgMj4gZGltcyhkaW0sIGRpbSk7CiAKLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgMiwgTGF5b3V0PigKLSAgICAgIChsaHMuYnJvYWRjYXN0KGJjYXN0TGhzKSAqIHJocy5icm9hZGNhc3QoYmNhc3RSaHMpKS5ldmFsKCkucmVzaGFwZShkaW1zKSwKLSAgICAgIFtkaW1zXSgpIHsgcmV0dXJuIFNrZXdlZElubmVyQmxvY2s8TGF5b3V0LCAyPihkaW1zKTsgfSk7CisgIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIDIsIExheW91dD4oKGxocy5icm9hZGNhc3QoYmNhc3RMaHMpICogcmhzLmJyb2FkY2FzdChiY2FzdFJocykpLmV2YWwoKS5yZXNoYXBlKGRpbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaW1zXSgpIHsgcmV0dXJuIFNrZXdlZElubmVyQmxvY2s8TGF5b3V0LCAyPihkaW1zKTsgfSk7CiAKLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgMiwgTGF5b3V0PigKLSAgICAgIChsaHMuYnJvYWRjYXN0KGJjYXN0TGhzKSAqIHJocy5icm9hZGNhc3QoYmNhc3RSaHMpKS5ldmFsKCkucmVzaGFwZShkaW1zKSwKLSAgICAgIFtkaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dCwgMj4oZGltcywgMSwgNTApOyB9KTsKKyAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgMiwgTGF5b3V0PigobGhzLmJyb2FkY2FzdChiY2FzdExocykgKiByaHMuYnJvYWRjYXN0KGJjYXN0UmhzKSkuZXZhbCgpLnJlc2hhcGUoZGltcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RpbXNdKCkgeyByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0LCAyPihkaW1zLCAxLCA1MCk7IH0pOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IExheW91dD4KQEAgLTU3MCwxNyArNTMwLDE0IEBACiAgIEVpZ2VuOjphcnJheTxJbmRleCwgMz4gYmNhc3QgPSB7e2RpbTAsIDEsIDF9fTsKICAgRFNpemVzPEluZGV4LCAyPiBjaGlwcGVkX2RpbXMoZGltMCwgZGltMik7CiAKLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgMiwgTGF5b3V0PigKLSAgICAgIGlucHV0LmJyb2FkY2FzdChiY2FzdCkuY2hpcCgwLCAxKSwKLSAgICAgIFtjaGlwcGVkX2RpbXNdKCkgeyByZXR1cm4gRml4ZWRTaXplQmxvY2soY2hpcHBlZF9kaW1zKTsgfSk7CisgIFZlcmlmeUJsb2NrRXZhbHVhdG9yPFQsIDIsIExheW91dD4oaW5wdXQuYnJvYWRjYXN0KGJjYXN0KS5jaGlwKDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGlwcGVkX2RpbXNdKCkgeyByZXR1cm4gRml4ZWRTaXplQmxvY2soY2hpcHBlZF9kaW1zKTsgfSk7CiAKLSAgVmVyaWZ5QmxvY2tFdmFsdWF0b3I8VCwgMiwgTGF5b3V0PigKLSAgICAgIGlucHV0LmJyb2FkY2FzdChiY2FzdCkuY2hpcCgwLCAxKSwKLSAgICAgIFtjaGlwcGVkX2RpbXNdKCkgeyByZXR1cm4gU2tld2VkSW5uZXJCbG9jazxMYXlvdXQsIDI+KGNoaXBwZWRfZGltcyk7IH0pOworICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCAyLCBMYXlvdXQ+KGlucHV0LmJyb2FkY2FzdChiY2FzdCkuY2hpcCgwLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hpcHBlZF9kaW1zXSgpIHsgcmV0dXJuIFNrZXdlZElubmVyQmxvY2s8TGF5b3V0LCAyPihjaGlwcGVkX2RpbXMpOyB9KTsKIAotICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCAyLCBMYXlvdXQ+KAotICAgICAgaW5wdXQuYnJvYWRjYXN0KGJjYXN0KS5jaGlwKDAsIDEpLAotICAgICAgW2NoaXBwZWRfZGltc10oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQsIDI+KGNoaXBwZWRfZGltcywgMSwgNSk7IH0pOworICBWZXJpZnlCbG9ja0V2YWx1YXRvcjxULCAyLCBMYXlvdXQ+KGlucHV0LmJyb2FkY2FzdChiY2FzdCkuY2hpcCgwLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hpcHBlZF9kaW1zXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dCwgMj4oY2hpcHBlZF9kaW1zLCAxLCA1KTsgfSk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCkBAIC01ODgsMTAgKzU0NSw4IEBACiAvLyBhcyBhbiBhc3NpZ25tZW50IHRvIFRlbnNvclNsaWNlT3AgKHdyaXRpbmcgYSBibG9jayBpcyBpcyBpZGVudGljYWwgdG8KIC8vIGFzc2lnbmluZyBvbmUgdGVuc29yIHRvIGEgc2xpY2Ugb2YgYW5vdGhlciB0ZW5zb3IpLgogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIGludCBMYXlvdXQsIGludCBOdW1FeHByRGltcyA9IE51bURpbXMsCi0gICAgICAgICAgdHlwZW5hbWUgRXhwcmVzc2lvbiwgdHlwZW5hbWUgR2VuQmxvY2tQYXJhbXM+Ci1zdGF0aWMgdm9pZCBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQoVGVuc29yPFQsIE51bURpbXMsIExheW91dD4mIHRlbnNvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGV4cHIsIEdlbkJsb2NrUGFyYW1zIGdlbl9ibG9jaykgewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCBpbnQgTGF5b3V0LCBpbnQgTnVtRXhwckRpbXMgPSBOdW1EaW1zLCB0eXBlbmFtZSBFeHByZXNzaW9uLCB0eXBlbmFtZSBHZW5CbG9ja1BhcmFtcz4KK3N0YXRpYyB2b2lkIFZlcmlmeUJsb2NrQXNzaWdubWVudChUZW5zb3I8VCwgTnVtRGltcywgTGF5b3V0PiYgdGVuc29yLCBFeHByZXNzaW9uIGV4cHIsIEdlbkJsb2NrUGFyYW1zIGdlbl9ibG9jaykgewogICB1c2luZyBEZXZpY2UgPSBEZWZhdWx0RGV2aWNlOwogICBhdXRvIGQgPSBEZXZpY2UoKTsKIApAQCAtNjA5LDggKzU2NCw4IEBACiAgIC8vICgxKSBBc3NpZ25tZW50IGZyb20gYSBibG9jay4KIAogICAvLyBDb25zdHJ1Y3QgYSBtYXRlcmlhbGl6ZSBibG9jayBmcm9tIGEgcmFuZG9tIGdlbmVyYXRlZCBibG9jayB0ZW5zb3IuCi0gIGludGVybmFsOjpUZW5zb3JNYXRlcmlhbGl6ZWRCbG9jazxULCBOdW1FeHByRGltcywgTGF5b3V0PiBibGsoCi0gICAgICBpbnRlcm5hbDo6VGVuc29yQmxvY2tLaW5kOjprVmlldywgYmxvY2suZGF0YSgpLCBibG9jay5kaW1lbnNpb25zKCkpOworICBpbnRlcm5hbDo6VGVuc29yTWF0ZXJpYWxpemVkQmxvY2s8VCwgTnVtRXhwckRpbXMsIExheW91dD4gYmxrKGludGVybmFsOjpUZW5zb3JCbG9ja0tpbmQ6OmtWaWV3LCBibG9jay5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suZGltZW5zaW9ucygpKTsKIAogICAvLyBSZXNldCBhbGwgdW5kZXJseWluZyB0ZW5zb3IgdmFsdWVzIHRvIHplcm8uCiAgIHRlbnNvci5zZXRaZXJvKCk7CkBAIC02MzIsOCArNTg3LDcgQEAKIAogICAvLyBFeHBsaWNpdGx5IHVzZSBjb2VmZmljaWVudCBhc3NpZ25tZW50IHRvIGV2YWx1YXRlIHNsaWNlIGV4cHJlc3Npb24uCiAgIHVzaW5nIFNsaWNlQXNzaWduID0gVGVuc29yQXNzaWduT3A8ZGVjbHR5cGUoc19leHByKSwgY29uc3QgZGVjbHR5cGUoYmxvY2spPjsKLSAgdXNpbmcgU2xpY2VFeGVjdXRvciA9IFRlbnNvckV4ZWN1dG9yPGNvbnN0IFNsaWNlQXNzaWduLCBEZXZpY2UsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlRpbGVkRXZhbHVhdGlvbjo6T2ZmPjsKKyAgdXNpbmcgU2xpY2VFeGVjdXRvciA9IFRlbnNvckV4ZWN1dG9yPGNvbnN0IFNsaWNlQXNzaWduLCBEZXZpY2UsIGZhbHNlLCBpbnRlcm5hbDo6VGlsZWRFdmFsdWF0aW9uOjpPZmY+OwogICBTbGljZUV4ZWN1dG9yOjpydW4oU2xpY2VBc3NpZ24oc19leHByLCBibG9jayksIGQpOwogCiAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSByZXN1bHQgYWZ0ZXIgYXNzaWdubWVudC4KQEAgLTY1MywxMCArNjA3LDggQEAKIAogICBUZW5zb3JNYXA8VGVuc29yPFQsIE51bURpbXMsIExheW91dD4+IG1hcCh0ZW5zb3IuZGF0YSgpLCBkaW1zKTsKIAotICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgIHRlbnNvciwgbWFwLCBbJmRpbXNdKCkgeyByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0PihkaW1zLCAxMCwgMjApOyB9KTsKLSAgVmVyaWZ5QmxvY2tBc3NpZ25tZW50PFQsIE51bURpbXMsIExheW91dD4oCi0gICAgICB0ZW5zb3IsIG1hcCwgWyZkaW1zXSgpIHsgcmV0dXJuIEZpeGVkU2l6ZUJsb2NrKGRpbXMpOyB9KTsKKyAgVmVyaWZ5QmxvY2tBc3NpZ25tZW50PFQsIE51bURpbXMsIExheW91dD4odGVuc29yLCBtYXAsIFsmZGltc10oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KGRpbXMsIDEwLCAyMCk7IH0pOworICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0Pih0ZW5zb3IsIG1hcCwgWyZkaW1zXSgpIHsgcmV0dXJuIEZpeGVkU2l6ZUJsb2NrKGRpbXMpOyB9KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCBpbnQgTGF5b3V0PgpAQCAtNjY5LDE3ICs2MjEsMTQgQEAKICAgRFNpemVzPEluZGV4LCBOdW1EaW1zPiBzaHVmZmxlZCA9IGRpbXM7CiAgIHN0ZDo6c2h1ZmZsZSgmc2h1ZmZsZWRbMF0sICZzaHVmZmxlZFtOdW1EaW1zIC0gMV0sIHN0ZDo6bXQxOTkzNyhnX3NlZWQpKTsKIAotICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgIHRlbnNvciwgbWFwLnJlc2hhcGUoc2h1ZmZsZWQpLAotICAgICAgWyZzaHVmZmxlZF0oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KHNodWZmbGVkLCAxLCAxMCk7IH0pOworICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0Pih0ZW5zb3IsIG1hcC5yZXNoYXBlKHNodWZmbGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzaHVmZmxlZF0oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KHNodWZmbGVkLCAxLCAxMCk7IH0pOwogCi0gIFZlcmlmeUJsb2NrQXNzaWdubWVudDxULCBOdW1EaW1zLCBMYXlvdXQ+KAotICAgICAgdGVuc29yLCBtYXAucmVzaGFwZShzaHVmZmxlZCksCi0gICAgICBbJnNodWZmbGVkXSgpIHsgcmV0dXJuIFNrZXdlZElubmVyQmxvY2s8TGF5b3V0PihzaHVmZmxlZCk7IH0pOworICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0Pih0ZW5zb3IsIG1hcC5yZXNoYXBlKHNodWZmbGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzaHVmZmxlZF0oKSB7IHJldHVybiBTa2V3ZWRJbm5lckJsb2NrPExheW91dD4oc2h1ZmZsZWQpOyB9KTsKIAotICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgIHRlbnNvciwgbWFwLnJlc2hhcGUoc2h1ZmZsZWQpLAotICAgICAgWyZzaHVmZmxlZF0oKSB7IHJldHVybiBGaXhlZFNpemVCbG9jayhzaHVmZmxlZCk7IH0pOworICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0Pih0ZW5zb3IsIG1hcC5yZXNoYXBlKHNodWZmbGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzaHVmZmxlZF0oKSB7IHJldHVybiBGaXhlZFNpemVCbG9jayhzaHVmZmxlZCk7IH0pOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIGludCBMYXlvdXQ+CkBAIC03MDEsMTYgKzY1MCwxMyBAQAogICBUZW5zb3JNYXA8VGVuc29yPFQsIE51bURpbXMsIExheW91dD4+IG1hcCh0ZW5zb3IuZGF0YSgpLCBkaW1zKTsKIAogICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0LCBOdW1EaW1zIC0gMT4oCi0gICAgICB0ZW5zb3IsIG1hcC5jaGlwKGNoaXBfb2Zmc2V0LCBjaGlwX2RpbSksCi0gICAgICBbJmNoaXBwZWRfZGltc10oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KGNoaXBwZWRfZGltcywgMSwgMTApOyB9KTsKKyAgICAgIHRlbnNvciwgbWFwLmNoaXAoY2hpcF9vZmZzZXQsIGNoaXBfZGltKSwgWyZjaGlwcGVkX2RpbXNdKCkgeyByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0PihjaGlwcGVkX2RpbXMsIDEsIDEwKTsgfSk7CiAKICAgVmVyaWZ5QmxvY2tBc3NpZ25tZW50PFQsIE51bURpbXMsIExheW91dCwgTnVtRGltcyAtIDE+KAotICAgICAgdGVuc29yLCBtYXAuY2hpcChjaGlwX29mZnNldCwgY2hpcF9kaW0pLAotICAgICAgWyZjaGlwcGVkX2RpbXNdKCkgeyByZXR1cm4gU2tld2VkSW5uZXJCbG9jazxMYXlvdXQ+KGNoaXBwZWRfZGltcyk7IH0pOworICAgICAgdGVuc29yLCBtYXAuY2hpcChjaGlwX29mZnNldCwgY2hpcF9kaW0pLCBbJmNoaXBwZWRfZGltc10oKSB7IHJldHVybiBTa2V3ZWRJbm5lckJsb2NrPExheW91dD4oY2hpcHBlZF9kaW1zKTsgfSk7CiAKLSAgVmVyaWZ5QmxvY2tBc3NpZ25tZW50PFQsIE51bURpbXMsIExheW91dCwgTnVtRGltcyAtIDE+KAotICAgICAgdGVuc29yLCBtYXAuY2hpcChjaGlwX29mZnNldCwgY2hpcF9kaW0pLAotICAgICAgWyZjaGlwcGVkX2RpbXNdKCkgeyByZXR1cm4gRml4ZWRTaXplQmxvY2soY2hpcHBlZF9kaW1zKTsgfSk7CisgIFZlcmlmeUJsb2NrQXNzaWdubWVudDxULCBOdW1EaW1zLCBMYXlvdXQsIE51bURpbXMgLSAxPih0ZW5zb3IsIG1hcC5jaGlwKGNoaXBfb2Zmc2V0LCBjaGlwX2RpbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmNoaXBwZWRfZGltc10oKSB7IHJldHVybiBGaXhlZFNpemVCbG9jayhjaGlwcGVkX2RpbXMpOyB9KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCBpbnQgTGF5b3V0PgpAQCAtNzMwLDE3ICs2NzYsMTQgQEAKIAogICBUZW5zb3JNYXA8VGVuc29yPFQsIE51bURpbXMsIExheW91dD4+IG1hcCh0ZW5zb3IuZGF0YSgpLCBkaW1zKTsKIAotICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgIHRlbnNvciwgbWFwLnNsaWNlKHNsaWNlX3N0YXJ0LCBzbGljZV9zaXplKSwKLSAgICAgIFsmc2xpY2Vfc2l6ZV0oKSB7IHJldHVybiBSYW5kb21CbG9jazxMYXlvdXQ+KHNsaWNlX3NpemUsIDEsIDEwKTsgfSk7CisgIFZlcmlmeUJsb2NrQXNzaWdubWVudDxULCBOdW1EaW1zLCBMYXlvdXQ+KHRlbnNvciwgbWFwLnNsaWNlKHNsaWNlX3N0YXJ0LCBzbGljZV9zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzbGljZV9zaXplXSgpIHsgcmV0dXJuIFJhbmRvbUJsb2NrPExheW91dD4oc2xpY2Vfc2l6ZSwgMSwgMTApOyB9KTsKIAotICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgIHRlbnNvciwgbWFwLnNsaWNlKHNsaWNlX3N0YXJ0LCBzbGljZV9zaXplKSwKLSAgICAgIFsmc2xpY2Vfc2l6ZV0oKSB7IHJldHVybiBTa2V3ZWRJbm5lckJsb2NrPExheW91dD4oc2xpY2Vfc2l6ZSk7IH0pOworICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0Pih0ZW5zb3IsIG1hcC5zbGljZShzbGljZV9zdGFydCwgc2xpY2Vfc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc2xpY2Vfc2l6ZV0oKSB7IHJldHVybiBTa2V3ZWRJbm5lckJsb2NrPExheW91dD4oc2xpY2Vfc2l6ZSk7IH0pOwogCi0gIFZlcmlmeUJsb2NrQXNzaWdubWVudDxULCBOdW1EaW1zLCBMYXlvdXQ+KAotICAgICAgdGVuc29yLCBtYXAuc2xpY2Uoc2xpY2Vfc3RhcnQsIHNsaWNlX3NpemUpLAotICAgICAgWyZzbGljZV9zaXplXSgpIHsgcmV0dXJuIEZpeGVkU2l6ZUJsb2NrKHNsaWNlX3NpemUpOyB9KTsKKyAgVmVyaWZ5QmxvY2tBc3NpZ25tZW50PFQsIE51bURpbXMsIExheW91dD4odGVuc29yLCBtYXAuc2xpY2Uoc2xpY2Vfc3RhcnQsIHNsaWNlX3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnNsaWNlX3NpemVdKCkgeyByZXR1cm4gRml4ZWRTaXplQmxvY2soc2xpY2Vfc2l6ZSk7IH0pOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIGludCBMYXlvdXQ+CkBAIC03NTcsMjQgKzcwMCwyMCBAQAogICAgIERTaXplczxJbmRleCwgTnVtRGltcz4gc2h1ZmZsZWRfZGltczsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXM7ICsraSkgc2h1ZmZsZWRfZGltc1tpXSA9IGRpbXNbc2h1ZmZsZVtpXV07CiAKLSAgICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgICAgdGVuc29yLCBtYXAuc2h1ZmZsZShzaHVmZmxlKSwKLSAgICAgICAgWyZzaHVmZmxlZF9kaW1zXSgpIHsgcmV0dXJuIEZpeGVkU2l6ZUJsb2NrKHNodWZmbGVkX2RpbXMpOyB9KTsKKyAgICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0Pih0ZW5zb3IsIG1hcC5zaHVmZmxlKHNodWZmbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc2h1ZmZsZWRfZGltc10oKSB7IHJldHVybiBGaXhlZFNpemVCbG9jayhzaHVmZmxlZF9kaW1zKTsgfSk7CiAKLSAgICBWZXJpZnlCbG9ja0Fzc2lnbm1lbnQ8VCwgTnVtRGltcywgTGF5b3V0PigKLSAgICAgICAgdGVuc29yLCBtYXAuc2h1ZmZsZShzaHVmZmxlKSwgWyZzaHVmZmxlZF9kaW1zXSgpIHsKLSAgICAgICAgICByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0PihzaHVmZmxlZF9kaW1zLCAxLCA1KTsKLSAgICAgICAgfSk7CisgICAgVmVyaWZ5QmxvY2tBc3NpZ25tZW50PFQsIE51bURpbXMsIExheW91dD4odGVuc29yLCBtYXAuc2h1ZmZsZShzaHVmZmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnNodWZmbGVkX2RpbXNdKCkgeyByZXR1cm4gUmFuZG9tQmxvY2s8TGF5b3V0PihzaHVmZmxlZF9kaW1zLCAxLCA1KTsgfSk7CiAKICAgfSB3aGlsZSAoc3RkOjpuZXh0X3Blcm11dGF0aW9uKCZzaHVmZmxlWzBdLCAmc2h1ZmZsZVswXSArIE51bURpbXMpKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy8KIAotI2RlZmluZSBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSBcCi0gIENBTExfU1VCVEVTVF8jI1BBUlQKKyNkZWZpbmUgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkgQ0FMTF9TVUJURVNUXyMjUEFSVAogCi0jZGVmaW5lIENBTExfU1VCVEVTVFNfRElNU19MQVlPVVRTX1RZUEVTKFBBUlQsIE5BTUUpICAgICAgICAgICBcCisjZGVmaW5lIENBTExfU1VCVEVTVFNfRElNU19MQVlPVVRTX1RZUEVTKFBBUlQsIE5BTUUpICAgICBcCiAgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGZsb2F0LCAxLCBSb3dNYWpvcj4oKSkpOyBcCiAgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGZsb2F0LCAyLCBSb3dNYWpvcj4oKSkpOyBcCiAgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGZsb2F0LCAzLCBSb3dNYWpvcj4oKSkpOyBcCkBAIC03ODUsMjggKzcyNCwyOCBAQAogICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxmbG9hdCwgNCwgQ29sTWFqb3I+KCkpKTsgXAogICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxmbG9hdCwgNCwgQ29sTWFqb3I+KCkpKTsgXAogICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxmbG9hdCwgNSwgQ29sTWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxpbnQsIDEsIFJvd01ham9yPigpKSk7IFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCAyLCBSb3dNYWpvcj4oKSkpOyBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGludCwgMywgUm93TWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxpbnQsIDQsIFJvd01ham9yPigpKSk7IFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCA1LCBSb3dNYWpvcj4oKSkpOyBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGludCwgMSwgQ29sTWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxpbnQsIDIsIENvbE1ham9yPigpKSk7IFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCA0LCBDb2xNYWpvcj4oKSkpOyBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGludCwgNCwgQ29sTWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxpbnQsIDUsIENvbE1ham9yPigpKSk7IFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgMSwgUm93TWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxib29sLCAyLCBSb3dNYWpvcj4oKSkpOyBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGJvb2wsIDMsIFJvd01ham9yPigpKSk7IFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgNCwgUm93TWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxib29sLCA1LCBSb3dNYWpvcj4oKSkpOyBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGJvb2wsIDEsIENvbE1ham9yPigpKSk7IFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgMiwgQ29sTWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxib29sLCA0LCBDb2xNYWpvcj4oKSkpOyBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGJvb2wsIDQsIENvbE1ham9yPigpKSk7IFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCAxLCBSb3dNYWpvcj4oKSkpOyAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCAyLCBSb3dNYWpvcj4oKSkpOyAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCAzLCBSb3dNYWpvcj4oKSkpOyAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCA0LCBSb3dNYWpvcj4oKSkpOyAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCA1LCBSb3dNYWpvcj4oKSkpOyAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCAxLCBDb2xNYWpvcj4oKSkpOyAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCAyLCBDb2xNYWpvcj4oKSkpOyAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCA0LCBDb2xNYWpvcj4oKSkpOyAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCA0LCBDb2xNYWpvcj4oKSkpOyAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8aW50LCA1LCBDb2xNYWpvcj4oKSkpOyAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgMSwgUm93TWFqb3I+KCkpKTsgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgMiwgUm93TWFqb3I+KCkpKTsgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgMywgUm93TWFqb3I+KCkpKTsgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgNCwgUm93TWFqb3I+KCkpKTsgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgNSwgUm93TWFqb3I+KCkpKTsgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgMSwgQ29sTWFqb3I+KCkpKTsgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgMiwgQ29sTWFqb3I+KCkpKTsgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgNCwgQ29sTWFqb3I+KCkpKTsgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgNCwgQ29sTWFqb3I+KCkpKTsgIFwKICAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgNSwgQ29sTWFqb3I+KCkpKQogCi0jZGVmaW5lIENBTExfU1VCVEVTVFNfRElNU19MQVlPVVRTKFBBUlQsIE5BTUUpICAgICBcCisjZGVmaW5lIENBTExfU1VCVEVTVFNfRElNU19MQVlPVVRTKFBBUlQsIE5BTUUpICAgICAgICAgICBcCiAgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGZsb2F0LCAxLCBSb3dNYWpvcj4oKSkpOyBcCiAgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGZsb2F0LCAyLCBSb3dNYWpvcj4oKSkpOyBcCiAgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGZsb2F0LCAzLCBSb3dNYWpvcj4oKSkpOyBcCkBAIC04MjAsOCArNzU5LDggQEAKIAogI2RlZmluZSBDQUxMX1NVQlRFU1RTX0xBWU9VVFNfVFlQRVMoUEFSVCwgTkFNRSkgICAgICAgXAogICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxmbG9hdCwgUm93TWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxmbG9hdCwgQ29sTWFqb3I+KCkpKTsgIFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8Ym9vbCwgUm93TWFqb3I+KCkpKTsgXAorICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxmbG9hdCwgQ29sTWFqb3I+KCkpKTsgXAorICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxib29sLCBSb3dNYWpvcj4oKSkpOyAgXAogICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxib29sLCBDb2xNYWpvcj4oKSkpCiAKIEVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfYmxvY2tfZXZhbCkgewpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYmxvY2tfaW8uY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYmxvY2tfaW8uY3BwCmluZGV4IDUyZjdkZGUuLjUwOWMxMGUgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Jsb2NrX2lvLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9ibG9ja19pby5jcHAKQEAgLTIzLDkgKzIzLDggQEAKIH0KIAogc3RhdGljIGludGVybmFsOjpUZW5zb3JCbG9ja1NoYXBlVHlwZSBSYW5kb21CbG9ja1NoYXBlKCkgewotICByZXR1cm4gaW50ZXJuYWw6OnJhbmRvbTxib29sPigpCi0gICAgICAgICA/IGludGVybmFsOjpUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1VuaWZvcm1BbGxEaW1zCi0gICAgICAgICA6IGludGVybmFsOjpUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1NrZXdlZElubmVyRGltczsKKyAgcmV0dXJuIGludGVybmFsOjpyYW5kb208Ym9vbD4oKSA/IGludGVybmFsOjpUZW5zb3JCbG9ja1NoYXBlVHlwZTo6a1VuaWZvcm1BbGxEaW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnRlcm5hbDo6VGVuc29yQmxvY2tTaGFwZVR5cGU6OmtTa2V3ZWRJbm5lckRpbXM7CiB9CiAKIHRlbXBsYXRlIDxpbnQgTnVtRGltcz4KQEAgLTM0LDEwICszMyw4IEBACiB9CiAKIHRlbXBsYXRlIDxpbnQgTGF5b3V0LCBpbnQgTnVtRGltcz4KLXN0YXRpYyBJbmRleCBHZXRJbnB1dEluZGV4KEluZGV4IG91dHB1dF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5PEluZGV4LCBOdW1EaW1zPiYgb3V0cHV0X3RvX2lucHV0X2RpbV9tYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheTxJbmRleCwgTnVtRGltcz4mIGlucHV0X3N0cmlkZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheTxJbmRleCwgTnVtRGltcz4mIG91dHB1dF9zdHJpZGVzKSB7CitzdGF0aWMgSW5kZXggR2V0SW5wdXRJbmRleChJbmRleCBvdXRwdXRfaW5kZXgsIGNvbnN0IGFycmF5PEluZGV4LCBOdW1EaW1zPiYgb3V0cHV0X3RvX2lucHV0X2RpbV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheTxJbmRleCwgTnVtRGltcz4mIGlucHV0X3N0cmlkZXMsIGNvbnN0IGFycmF5PEluZGV4LCBOdW1EaW1zPiYgb3V0cHV0X3N0cmlkZXMpIHsKICAgaW50IGlucHV0X2luZGV4ID0gMDsKICAgaWYgKExheW91dCA9PSBDb2xNYWpvcikgewogICAgIGZvciAoaW50IGkgPSBOdW1EaW1zIC0gMTsgaSA+IDA7IC0taSkgewpAQCAtNDUsMTYgKzQyLDE0IEBACiAgICAgICBpbnB1dF9pbmRleCArPSBpZHggKiBpbnB1dF9zdHJpZGVzW291dHB1dF90b19pbnB1dF9kaW1fbWFwW2ldXTsKICAgICAgIG91dHB1dF9pbmRleCAtPSBpZHggKiBvdXRwdXRfc3RyaWRlc1tpXTsKICAgICB9Ci0gICAgcmV0dXJuIGlucHV0X2luZGV4ICsKLSAgICAgICAgICAgb3V0cHV0X2luZGV4ICogaW5wdXRfc3RyaWRlc1tvdXRwdXRfdG9faW5wdXRfZGltX21hcFswXV07CisgICAgcmV0dXJuIGlucHV0X2luZGV4ICsgb3V0cHV0X2luZGV4ICogaW5wdXRfc3RyaWRlc1tvdXRwdXRfdG9faW5wdXRfZGltX21hcFswXV07CiAgIH0gZWxzZSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1EaW1zIC0gMTsgKytpKSB7CiAgICAgICBjb25zdCBJbmRleCBpZHggPSBvdXRwdXRfaW5kZXggLyBvdXRwdXRfc3RyaWRlc1tpXTsKICAgICAgIGlucHV0X2luZGV4ICs9IGlkeCAqIGlucHV0X3N0cmlkZXNbb3V0cHV0X3RvX2lucHV0X2RpbV9tYXBbaV1dOwogICAgICAgb3V0cHV0X2luZGV4IC09IGlkeCAqIG91dHB1dF9zdHJpZGVzW2ldOwogICAgIH0KLSAgICByZXR1cm4gaW5wdXRfaW5kZXggKwotICAgICAgICAgICBvdXRwdXRfaW5kZXggKiBpbnB1dF9zdHJpZGVzW291dHB1dF90b19pbnB1dF9kaW1fbWFwW051bURpbXMgLSAxXV07CisgICAgcmV0dXJuIGlucHV0X2luZGV4ICsgb3V0cHV0X2luZGV4ICogaW5wdXRfc3RyaWRlc1tvdXRwdXRfdG9faW5wdXRfZGltX21hcFtOdW1EaW1zIC0gMV1dOwogICB9CiB9CiAKQEAgLTczLDEwICs2OCw4IEBACiAgIFRlbnNvcjxULCBOdW1EaW1zLCBMYXlvdXQ+IG91dHB1dChkaW1zKTsKIAogICAvLyBDb25zdHJ1Y3QgYSB0ZW5zb3IgYmxvY2sgbWFwcGVyLgotICB1c2luZyBUZW5zb3JCbG9ja01hcHBlciA9Ci0gICAgICBpbnRlcm5hbDo6VGVuc29yQmxvY2tNYXBwZXI8TnVtRGltcywgTGF5b3V0LCBJbmRleD47Ci0gIFRlbnNvckJsb2NrTWFwcGVyIGJsb2NrX21hcHBlcigKLSAgICAgIGRpbXMsIHtSYW5kb21CbG9ja1NoYXBlKCksIFJhbmRvbVRhcmdldEJsb2NrU2l6ZShkaW1zKSwgezAsIDAsIDB9fSk7CisgIHVzaW5nIFRlbnNvckJsb2NrTWFwcGVyID0gaW50ZXJuYWw6OlRlbnNvckJsb2NrTWFwcGVyPE51bURpbXMsIExheW91dCwgSW5kZXg+OworICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIoZGltcywge1JhbmRvbUJsb2NrU2hhcGUoKSwgUmFuZG9tVGFyZ2V0QmxvY2tTaXplKGRpbXMpLCB7MCwgMCwgMH19KTsKIAogICAvLyBXZSB3aWxsIGNvcHkgZGF0YSBmcm9tIGlucHV0IHRvIG91dHB1dCB0aHJvdWdoIHRoaXMgYnVmZmVyLgogICBUZW5zb3I8VCwgTnVtRGltcywgTGF5b3V0PiBibG9jayhibG9ja19tYXBwZXIuYmxvY2tEaW1lbnNpb25zKCkpOwpAQCAtMTQ0LDEyICsxMzcsOSBAQAogCiAgIC8vIENvbnN0cnVjdCBhIHRlbnNvciBibG9jayBtYXBwZXIuCiAgIC8vIE5PVEU6IFRlbnNvciBibG9jayBtYXBwZXIgd29ya3Mgd2l0aCBzaHVmZmxlZCBkaW1lbnNpb25zLgotICB1c2luZyBUZW5zb3JCbG9ja01hcHBlciA9Ci0gICAgICBpbnRlcm5hbDo6VGVuc29yQmxvY2tNYXBwZXI8TnVtRGltcywgTGF5b3V0LCBJbmRleD47CisgIHVzaW5nIFRlbnNvckJsb2NrTWFwcGVyID0gaW50ZXJuYWw6OlRlbnNvckJsb2NrTWFwcGVyPE51bURpbXMsIExheW91dCwgSW5kZXg+OwogICBUZW5zb3JCbG9ja01hcHBlciBibG9ja19tYXBwZXIob3V0cHV0X3RlbnNvcl9kaW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1JhbmRvbUJsb2NrU2hhcGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5kb21UYXJnZXRCbG9ja1NpemUob3V0cHV0X3RlbnNvcl9kaW1zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMCwgMH19KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtSYW5kb21CbG9ja1NoYXBlKCksIFJhbmRvbVRhcmdldEJsb2NrU2l6ZShvdXRwdXRfdGVuc29yX2RpbXMpLCB7MCwgMCwgMH19KTsKIAogICAvLyBXZSB3aWxsIGNvcHkgZGF0YSBmcm9tIGlucHV0IHRvIG91dHB1dCB0aHJvdWdoIHRoaXMgYnVmZmVyLgogICBUZW5zb3I8VCwgTnVtRGltcywgTGF5b3V0PiBibG9jayhibG9ja19tYXBwZXIuYmxvY2tEaW1lbnNpb25zKCkpOwpAQCAtMTY1LDkgKzE1NSw4IEBACiAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBibG9ja19tYXBwZXIuYmxvY2tDb3VudCgpOyArK2kpIHsKICAgICBhdXRvIGRlc2MgPSBibG9ja19tYXBwZXIuYmxvY2tEZXNjcmlwdG9yKGkpOwogCi0gICAgY29uc3QgSW5kZXggZmlyc3RfY29lZmZfaW5kZXggPSBHZXRJbnB1dEluZGV4PExheW91dCwgTnVtRGltcz4oCi0gICAgICAgIGRlc2Mub2Zmc2V0KCksIG91dHB1dF90b19pbnB1dF9kaW1fbWFwLCBpbnB1dF9zdHJpZGVzLAotICAgICAgICBvdXRwdXRfc3RyaWRlcyk7CisgICAgY29uc3QgSW5kZXggZmlyc3RfY29lZmZfaW5kZXggPQorICAgICAgICBHZXRJbnB1dEluZGV4PExheW91dCwgTnVtRGltcz4oZGVzYy5vZmZzZXQoKSwgb3V0cHV0X3RvX2lucHV0X2RpbV9tYXAsIGlucHV0X3N0cmlkZXMsIG91dHB1dF9zdHJpZGVzKTsKIAogICAgIC8vIE5PVEU6IEJsb2NrIGRpbWVuc2lvbnMgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIG91dHB1dCBkaW1lbnNpb25zLgogCkBAIC0xODUsOCArMTc0LDcgQEAKIAogICAgICAgLy8gVE9ETyhlemh1bGVuZXYpOiBSZW1vdmUgd2hlbiBmdWxseSBzd2l0Y2hlZCB0byBUZW5zb3JCbG9jay4KICAgICAgIERTaXplczxpbnQsIE51bURpbXM+IGRpbV9tYXA7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IE51bURpbXM7ICsraikKLSAgICAgICAgZGltX21hcFtqXSA9IHN0YXRpY19jYXN0PGludD4ob3V0cHV0X3RvX2lucHV0X2RpbV9tYXBbal0pOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOdW1EaW1zOyArK2opIGRpbV9tYXBbal0gPSBzdGF0aWNfY2FzdDxpbnQ+KG91dHB1dF90b19pbnB1dF9kaW1fbWFwW2pdKTsKICAgICAgIFRlbnNvckJsb2NrSU86OkNvcHkoZHN0LCBzcmMsIC8qZHN0X3RvX3NyY19kaW1fbWFwPSovZGltX21hcCk7CiAgICAgfQogCkBAIC0yMDMsOCArMTkxLDcgQEAKIAogICAgICAgLy8gVE9ETyhlemh1bGVuZXYpOiBSZW1vdmUgd2hlbiBmdWxseSBzd2l0Y2hlZCB0byBUZW5zb3JCbG9jay4KICAgICAgIERTaXplczxpbnQsIE51bURpbXM+IGRpbV9tYXA7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IE51bURpbXM7ICsraikKLSAgICAgICAgZGltX21hcFtqXSA9IHN0YXRpY19jYXN0PGludD4oaW5wdXRfdG9fb3V0cHV0X2RpbV9tYXBbal0pOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOdW1EaW1zOyArK2opIGRpbV9tYXBbal0gPSBzdGF0aWNfY2FzdDxpbnQ+KGlucHV0X3RvX291dHB1dF9kaW1fbWFwW2pdKTsKICAgICAgIFRlbnNvckJsb2NrSU86OkNvcHkoZHN0LCBzcmMsIC8qZHN0X3RvX3NyY19kaW1fbWFwPSovZGltX21hcCk7CiAgICAgfQogICB9CkBAIC00MTYsMTMgKzQwMywxMyBAQAogICBDQUxMX1NVQlRFU1QoKE5BTUU8ZmxvYXQsIDIsIENvbE1ham9yPigpKSk7IFwKICAgQ0FMTF9TVUJURVNUKChOQU1FPGZsb2F0LCA0LCBDb2xNYWpvcj4oKSkpOyBcCiAgIENBTExfU1VCVEVTVCgoTkFNRTxmbG9hdCwgNSwgQ29sTWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1QoKE5BTUU8Ym9vbCwgMSwgUm93TWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1QoKE5BTUU8Ym9vbCwgMiwgUm93TWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1QoKE5BTUU8Ym9vbCwgNCwgUm93TWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1QoKE5BTUU8Ym9vbCwgNSwgUm93TWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1QoKE5BTUU8Ym9vbCwgMSwgQ29sTWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1QoKE5BTUU8Ym9vbCwgMiwgQ29sTWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1QoKE5BTUU8Ym9vbCwgNCwgQ29sTWFqb3I+KCkpKTsgXAorICBDQUxMX1NVQlRFU1QoKE5BTUU8Ym9vbCwgMSwgUm93TWFqb3I+KCkpKTsgIFwKKyAgQ0FMTF9TVUJURVNUKChOQU1FPGJvb2wsIDIsIFJvd01ham9yPigpKSk7ICBcCisgIENBTExfU1VCVEVTVCgoTkFNRTxib29sLCA0LCBSb3dNYWpvcj4oKSkpOyAgXAorICBDQUxMX1NVQlRFU1QoKE5BTUU8Ym9vbCwgNSwgUm93TWFqb3I+KCkpKTsgIFwKKyAgQ0FMTF9TVUJURVNUKChOQU1FPGJvb2wsIDEsIENvbE1ham9yPigpKSk7ICBcCisgIENBTExfU1VCVEVTVCgoTkFNRTxib29sLCAyLCBDb2xNYWpvcj4oKSkpOyAgXAorICBDQUxMX1NVQlRFU1QoKE5BTUU8Ym9vbCwgNCwgQ29sTWFqb3I+KCkpKTsgIFwKICAgQ0FMTF9TVUJURVNUKChOQU1FPGJvb2wsIDUsIENvbE1ham9yPigpKSkKIAogRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9ibG9ja19pbykgewpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYnJvYWRjYXN0X3N5Y2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYnJvYWRjYXN0X3N5Y2wuY3BwCmluZGV4IDZjYTVhYzcuLmQyNTU1NjggMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Jyb2FkY2FzdF9zeWNsLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9icm9hZGNhc3Rfc3ljbC5jcHAKQEAgLTI2LDQ3ICsyNiw0NCBAQAogdXNpbmcgRWlnZW46OlRlbnNvck1hcDsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9icm9hZGNhc3Rfc3ljbF9maXhlZChjb25zdCBFaWdlbjo6U3ljbERldmljZSAmc3ljbF9kZXZpY2UpewotCitzdGF0aWMgdm9pZCB0ZXN0X2Jyb2FkY2FzdF9zeWNsX2ZpeGVkKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICAvLyBCUk9BRENBU1QgdGVzdDoKLSAgSW5kZXhUeXBlIGluRGltMT0yOwotICBJbmRleFR5cGUgaW5EaW0yPTM7Ci0gIEluZGV4VHlwZSBpbkRpbTM9NTsKLSAgSW5kZXhUeXBlIGluRGltND03OwotICBJbmRleFR5cGUgYkRpbTE9MjsKLSAgSW5kZXhUeXBlIGJEaW0yPTM7Ci0gIEluZGV4VHlwZSBiRGltMz0xOwotICBJbmRleFR5cGUgYkRpbTQ9NDsKLSAgYXJyYXk8SW5kZXhUeXBlLCA0PiBpbl9yYW5nZSAgID0ge3tpbkRpbTEsIGluRGltMiwgaW5EaW0zLCBpbkRpbTR9fTsKKyAgSW5kZXhUeXBlIGluRGltMSA9IDI7CisgIEluZGV4VHlwZSBpbkRpbTIgPSAzOworICBJbmRleFR5cGUgaW5EaW0zID0gNTsKKyAgSW5kZXhUeXBlIGluRGltNCA9IDc7CisgIEluZGV4VHlwZSBiRGltMSA9IDI7CisgIEluZGV4VHlwZSBiRGltMiA9IDM7CisgIEluZGV4VHlwZSBiRGltMyA9IDE7CisgIEluZGV4VHlwZSBiRGltNCA9IDQ7CisgIGFycmF5PEluZGV4VHlwZSwgND4gaW5fcmFuZ2UgPSB7e2luRGltMSwgaW5EaW0yLCBpbkRpbTMsIGluRGltNH19OwogICBhcnJheTxJbmRleFR5cGUsIDQ+IGJyb2FkY2FzdHMgPSB7e2JEaW0xLCBiRGltMiwgYkRpbTMsIGJEaW00fX07CiAgIGFycmF5PEluZGV4VHlwZSwgND4gb3V0X3JhbmdlOyAgLy8gPSBpbl9yYW5nZSAqIGJyb2FkY2FzdHMKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRfcmFuZ2Uuc2l6ZSgpOyArK2kpCi0gICAgb3V0X3JhbmdlW2ldID0gaW5fcmFuZ2VbaV0gKiBicm9hZGNhc3RzW2ldOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dF9yYW5nZS5zaXplKCk7ICsraSkgb3V0X3JhbmdlW2ldID0gaW5fcmFuZ2VbaV0gKiBicm9hZGNhc3RzW2ldOwogCi0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiAgaW5wdXQoaW5fcmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW5wdXQoaW5fcmFuZ2UpOwogICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gb3V0KG91dF9yYW5nZSk7CiAKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbl9yYW5nZS5zaXplKCk7ICsraSkKLSAgICBWRVJJRllfSVNfRVFVQUwob3V0LmRpbWVuc2lvbihpKSwgb3V0X3JhbmdlW2ldKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbl9yYW5nZS5zaXplKCk7ICsraSkgVkVSSUZZX0lTX0VRVUFMKG91dC5kaW1lbnNpb24oaSksIG91dF9yYW5nZVtpXSk7CiAKKyAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCBpbnB1dC5zaXplKCk7ICsraSkgaW5wdXQoaSkgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZT4oaSk7CiAKLSAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCBpbnB1dC5zaXplKCk7ICsraSkKLSAgICBpbnB1dChpKSA9IHN0YXRpY19jYXN0PERhdGFUeXBlPihpKTsKLQotICBEYXRhVHlwZSAqIGdwdV9pbl9kYXRhICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5wdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUgKiBncHVfb3V0X2RhdGEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5wdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X291dF9kYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKIAogICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPERhdGFUeXBlLCBTaXplczwyLCAzLCA1LCA3PiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2luKGdwdV9pbl9kYXRhLCBpbl9yYW5nZSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9vdXQoZ3B1X291dF9kYXRhLCBvdXRfcmFuZ2UpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGlucHV0LmRhdGEoKSwoaW5wdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbnB1dC5kYXRhKCksIChpbnB1dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIGdwdV9vdXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbi5icm9hZGNhc3QoYnJvYWRjYXN0cyk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfb3V0X2RhdGEsKG91dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X291dF9kYXRhLCAob3V0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAotICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IGluRGltMSpiRGltMTsgKytpKSB7Ci0gICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCBpbkRpbTIqYkRpbTI7ICsraikgewotICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCBpbkRpbTMqYkRpbTM7ICsraykgewotICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IGluRGltNCpiRGltNDsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChpbnB1dChpJTIsaiUzLGslNSxsJTcpLCBvdXQoaSxqLGssbCkpOworICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IGluRGltMSAqIGJEaW0xOyArK2kpIHsKKyAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IGluRGltMiAqIGJEaW0yOyArK2opIHsKKyAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgaW5EaW0zICogYkRpbTM7ICsraykgeworICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IGluRGltNCAqIGJEaW00OyArK2wpIHsKKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKGlucHV0KGkgJSAyLCBqICUgMywgayAlIDUsIGwgJSA3KSwgb3V0KGksIGosIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTc3LDQ3ICs3NCw0NCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X2Jyb2FkY2FzdF9zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlICZzeWNsX2RldmljZSl7Ci0KK3N0YXRpYyB2b2lkIHRlc3RfYnJvYWRjYXN0X3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIC8vIEJST0FEQ0FTVCB0ZXN0OgotICBJbmRleFR5cGUgaW5EaW0xPTI7Ci0gIEluZGV4VHlwZSBpbkRpbTI9MzsKLSAgSW5kZXhUeXBlIGluRGltMz01OwotICBJbmRleFR5cGUgaW5EaW00PTc7Ci0gIEluZGV4VHlwZSBiRGltMT0yOwotICBJbmRleFR5cGUgYkRpbTI9MzsKLSAgSW5kZXhUeXBlIGJEaW0zPTE7Ci0gIEluZGV4VHlwZSBiRGltND00OwotICBhcnJheTxJbmRleFR5cGUsIDQ+IGluX3JhbmdlICAgPSB7e2luRGltMSwgaW5EaW0yLCBpbkRpbTMsIGluRGltNH19OworICBJbmRleFR5cGUgaW5EaW0xID0gMjsKKyAgSW5kZXhUeXBlIGluRGltMiA9IDM7CisgIEluZGV4VHlwZSBpbkRpbTMgPSA1OworICBJbmRleFR5cGUgaW5EaW00ID0gNzsKKyAgSW5kZXhUeXBlIGJEaW0xID0gMjsKKyAgSW5kZXhUeXBlIGJEaW0yID0gMzsKKyAgSW5kZXhUeXBlIGJEaW0zID0gMTsKKyAgSW5kZXhUeXBlIGJEaW00ID0gNDsKKyAgYXJyYXk8SW5kZXhUeXBlLCA0PiBpbl9yYW5nZSA9IHt7aW5EaW0xLCBpbkRpbTIsIGluRGltMywgaW5EaW00fX07CiAgIGFycmF5PEluZGV4VHlwZSwgND4gYnJvYWRjYXN0cyA9IHt7YkRpbTEsIGJEaW0yLCBiRGltMywgYkRpbTR9fTsKICAgYXJyYXk8SW5kZXhUeXBlLCA0PiBvdXRfcmFuZ2U7ICAvLyA9IGluX3JhbmdlICogYnJvYWRjYXN0cwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dF9yYW5nZS5zaXplKCk7ICsraSkKLSAgICBvdXRfcmFuZ2VbaV0gPSBpbl9yYW5nZVtpXSAqIGJyb2FkY2FzdHNbaV07CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0X3JhbmdlLnNpemUoKTsgKytpKSBvdXRfcmFuZ2VbaV0gPSBpbl9yYW5nZVtpXSAqIGJyb2FkY2FzdHNbaV07CiAKLSAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ICBpbnB1dChpbl9yYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBpbnB1dChpbl9yYW5nZSk7CiAgIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBvdXQob3V0X3JhbmdlKTsKIAotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluX3JhbmdlLnNpemUoKTsgKytpKQotICAgIFZFUklGWV9JU19FUVVBTChvdXQuZGltZW5zaW9uKGkpLCBvdXRfcmFuZ2VbaV0pOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluX3JhbmdlLnNpemUoKTsgKytpKSBWRVJJRllfSVNfRVFVQUwob3V0LmRpbWVuc2lvbihpKSwgb3V0X3JhbmdlW2ldKTsKIAorICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgKytpKSBpbnB1dChpKSA9IHN0YXRpY19jYXN0PERhdGFUeXBlPihpKTsKIAotICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgKytpKQotICAgIGlucHV0KGkpID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KGkpOworICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbnB1dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogCi0gIERhdGFUeXBlICogZ3B1X2luX2RhdGEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbnB1dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOwotICBEYXRhVHlwZSAqIGdwdV9vdXRfZGF0YSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG91dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOwotCi0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+ICBncHVfaW4oZ3B1X2luX2RhdGEsIGluX3JhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2luKGdwdV9pbl9kYXRhLCBpbl9yYW5nZSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9vdXQoZ3B1X291dF9kYXRhLCBvdXRfcmFuZ2UpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGlucHV0LmRhdGEoKSwoaW5wdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbnB1dC5kYXRhKCksIChpbnB1dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIGdwdV9vdXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbi5icm9hZGNhc3QoYnJvYWRjYXN0cyk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfb3V0X2RhdGEsKG91dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X291dF9kYXRhLCAob3V0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAotICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IGluRGltMSpiRGltMTsgKytpKSB7Ci0gICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCBpbkRpbTIqYkRpbTI7ICsraikgewotICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCBpbkRpbTMqYkRpbTM7ICsraykgewotICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IGluRGltNCpiRGltNDsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChpbnB1dChpJWluRGltMSxqJWluRGltMixrJWluRGltMyxsJWluRGltNCksIG91dChpLGosayxsKSk7CisgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgaW5EaW0xICogYkRpbTE7ICsraSkgeworICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgaW5EaW0yICogYkRpbTI7ICsraikgeworICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCBpbkRpbTMgKiBiRGltMzsgKytrKSB7CisgICAgICAgIGZvciAoSW5kZXhUeXBlIGwgPSAwOyBsIDwgaW5EaW00ICogYkRpbTQ7ICsrbCkgeworICAgICAgICAgIFZFUklGWV9JU19BUFBST1goaW5wdXQoaSAlIGluRGltMSwgaiAlIGluRGltMiwgayAlIGluRGltMywgbCAlIGluRGltNCksIG91dChpLCBqLCBrLCBsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0xMjcsNyArMTIxLDggQEAKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfb3V0X2RhdGEpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhVHlwZT4gdm9pZCBzeWNsX2Jyb2FkY2FzdF90ZXN0X3Blcl9kZXZpY2UoY29uc3QgY2w6OnN5Y2w6OmRldmljZSYgZCl7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGU+Cit2b2lkIHN5Y2xfYnJvYWRjYXN0X3Rlc3RfcGVyX2RldmljZShjb25zdCBjbDo6c3ljbDo6ZGV2aWNlJiBkKSB7CiAgIHN0ZDo6Y291dCA8PCAiUnVubmluZyBvbiAiIDw8IGQudGVtcGxhdGUgZ2V0X2luZm88Y2w6OnN5Y2w6OmluZm86OmRldmljZTo6bmFtZT4oKSA8PCBzdGQ6OmVuZGw7CiAgIFF1ZXVlSW50ZXJmYWNlIHF1ZXVlSW50ZXJmYWNlKGQpOwogICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKQEAgLTEzOCw3ICsxMzMsNyBAQAogfQogCiBFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2Jyb2FkY2FzdF9zeWNsKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDpFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgeworICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IEVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CiAgICAgQ0FMTF9TVUJURVNUKHN5Y2xfYnJvYWRjYXN0X3Rlc3RfcGVyX2RldmljZTxoYWxmPihkZXZpY2UpKTsKICAgICBDQUxMX1NVQlRFU1Qoc3ljbF9icm9hZGNhc3RfdGVzdF9wZXJfZGV2aWNlPGZsb2F0PihkZXZpY2UpKTsKICAgfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYnJvYWRjYXN0aW5nLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Jyb2FkY2FzdGluZy5jcHAKaW5kZXggMmRhMzVlNC4uNmY0M2Q2YSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYnJvYWRjYXN0aW5nLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9icm9hZGNhc3RpbmcuY3BwCkBAIC0xNCw5ICsxNCw4IEBACiB1c2luZyBFaWdlbjo6VGVuc29yOwogCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9icm9hZGNhc3RpbmcoKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2Jyb2FkY2FzdGluZygpIHsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgNSwgNyk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKICAgYXJyYXk8cHRyZGlmZl90LCA0PiBicm9hZGNhc3RzOwogICBicm9hZGNhc3RzWzBdID0gMTsKQEAgLTM2LDcgKzM1LDcgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwpLCBub19icm9hZGNhc3QoaSxqLGssbCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCksIG5vX2Jyb2FkY2FzdChpLCBqLCBrLCBsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC01OCwxOCArNTcsMTYgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDk7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAyODsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpJTIsaiUzLGslNSxsJTcpLCBicm9hZGNhc3QoaSxqLGssbCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSAlIDIsIGogJSAzLCBrICUgNSwgbCAlIDcpLCBicm9hZGNhc3QoaSwgaiwgaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLQogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF92ZWN0b3JpemVkX2Jyb2FkY2FzdGluZygpCi17Ci0gIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gdGVuc29yKDgsMyw1KTsKK3N0YXRpYyB2b2lkIHRlc3RfdmVjdG9yaXplZF9icm9hZGNhc3RpbmcoKSB7CisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gdGVuc29yKDgsIDMsIDUpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIGFycmF5PHB0cmRpZmZfdCwgMz4gYnJvYWRjYXN0czsKICAgYnJvYWRjYXN0c1swXSA9IDI7CkBAIC04NiwxMiArODMsMTIgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA5OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMjA7ICsraykgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGklOCxqJTMsayU1KSwgYnJvYWRjYXN0KGksaixrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSAlIDgsIGogJSAzLCBrICUgNSksIGJyb2FkY2FzdChpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgdGVuc29yLnJlc2l6ZSgxMSwzLDUpOworICB0ZW5zb3IucmVzaXplKDExLCAzLCA1KTsKIAogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIGJyb2FkY2FzdCA9IHRlbnNvci5icm9hZGNhc3QoYnJvYWRjYXN0cyk7CkBAIC0xMDMsMTcgKzEwMCwxNSBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDIyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDk7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyMDsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSUxMSxqJTMsayU1KSwgYnJvYWRjYXN0KGksaixrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSAlIDExLCBqICUgMywgayAlIDUpLCBicm9hZGNhc3QoaSwgaiwgaykpOwogICAgICAgfQogICAgIH0KICAgfQogfQogCi0KIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc3RhdGljX2Jyb2FkY2FzdGluZygpCi17Ci0gIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gdGVuc29yKDgsMyw1KTsKK3N0YXRpYyB2b2lkIHRlc3Rfc3RhdGljX2Jyb2FkY2FzdGluZygpIHsKKyAgVGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiB0ZW5zb3IoOCwgMywgNSk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKIAogICBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDI+LCBFaWdlbjo6dHlwZTJpbmRleDwzPiwgRWlnZW46OnR5cGUyaW5kZXg8ND4+IGJyb2FkY2FzdHM7CkBAIC0xMjcsMTIgKzEyMiwxMiBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDk7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAyMDsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSU4LGolMyxrJTUpLCBicm9hZGNhc3QoaSxqLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpICUgOCwgaiAlIDMsIGsgJSA1KSwgYnJvYWRjYXN0KGksIGosIGspKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICB0ZW5zb3IucmVzaXplKDExLDMsNSk7CisgIHRlbnNvci5yZXNpemUoMTEsIDMsIDUpOwogCiAgIHRlbnNvci5zZXRSYW5kb20oKTsKICAgYnJvYWRjYXN0ID0gdGVuc29yLmJyb2FkY2FzdChicm9hZGNhc3RzKTsKQEAgLTE0NCwxNiArMTM5LDE0IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgOTsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDIwOyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpJTExLGolMyxrJTUpLCBicm9hZGNhc3QoaSxqLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpICUgMTEsIGogJSAzLCBrICUgNSksIGJyb2FkY2FzdChpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLQogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9maXhlZF9zaXplX2Jyb2FkY2FzdGluZygpCi17CitzdGF0aWMgdm9pZCB0ZXN0X2ZpeGVkX3NpemVfYnJvYWRjYXN0aW5nKCkgewogICAvLyBOZWVkIHRvIGFkZCBhIFtdIG9wZXJhdG9yIHRvIHRoZSBTaXplIGNsYXNzIGZvciB0aGlzIHRvIHdvcmsKICNpZiAwCiAgIFRlbnNvcjxmbG9hdCwgMSwgRGF0YUxheW91dD4gdDEoMTApOwpAQCAtMTc1LDkgKzE2OCw4IEBACiB9CiAKIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2Jyb2FkY2FzdGluZ19vbmVfYnlfbigpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDEsMTMsNSw3KTsKK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2Jyb2FkY2FzdGluZ19vbmVfYnlfbigpIHsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMSwgMTMsIDUsIDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIGFycmF5PHB0cmRpZmZfdCwgND4gYnJvYWRjYXN0czsKICAgYnJvYWRjYXN0c1swXSA9IDk7CkBAIC0xOTYsNyArMTg4LDcgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpJTEsaiUxMyxrJTUsbCU3KSwgYnJvYWRjYXN0KGksaixrLGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGkgJSAxLCBqICUgMTMsIGsgJSA1LCBsICUgNyksIGJyb2FkY2FzdChpLCBqLCBrLCBsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0yMDQsOSArMTk2LDggQEAKIH0KIAogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfYnJvYWRjYXN0aW5nX25fYnlfb25lKCkKLXsKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoNywzLDUsMSk7CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9icm9hZGNhc3Rpbmdfbl9ieV9vbmUoKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDcsIDMsIDUsIDEpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIGFycmF5PHB0cmRpZmZfdCwgND4gYnJvYWRjYXN0czsKICAgYnJvYWRjYXN0c1swXSA9IDE7CkBAIC0yMjUsNyArMjE2LDcgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAxOTsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpJTcsaiUzLGslNSxsJTEpLCBicm9hZGNhc3QoaSxqLGssbCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSAlIDcsIGogJSAzLCBrICUgNSwgbCAlIDEpLCBicm9hZGNhc3QoaSwgaiwgaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMjMzLDggKzIyNCw3IEBACiB9CiAKIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc2l6ZV9vbmVfYnJvYWRjYXN0aW5nKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3Rfc2l6ZV9vbmVfYnJvYWRjYXN0aW5nKCkgewogICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IHRlbnNvcigxKTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogICBhcnJheTxwdHJkaWZmX3QsIDE+IGJyb2FkY2FzdHMgPSB7NjR9OwpAQCAtMjQ5LDkgKzIzOSw4IEBACiB9CiAKIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2Jyb2FkY2FzdGluZ19vbmVfYnlfbl9ieV9vbmVfMWQoKQotewotICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcigxLDcsMSk7CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9icm9hZGNhc3Rpbmdfb25lX2J5X25fYnlfb25lXzFkKCkgeworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcigxLCA3LCAxKTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogICBhcnJheTxwdHJkaWZmX3QsIDM+IGJyb2FkY2FzdHM7CiAgIGJyb2FkY2FzdHNbMF0gPSA1OwpAQCAtMjY3LDE2ICsyNTYsMTUgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDc7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAxMzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoMCxqJTcsMCksIGJyb2FkY2FzdGVkKGksaixrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoMCwgaiAlIDcsIDApLCBicm9hZGNhc3RlZChpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2Jyb2FkY2FzdGluZ19vbmVfYnlfbl9ieV9vbmVfMmQoKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigxLDcsMTMsMSk7CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9icm9hZGNhc3Rpbmdfb25lX2J5X25fYnlfb25lXzJkKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigxLCA3LCAxMywgMSk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKICAgYXJyYXk8cHRyZGlmZl90LCA0PiBicm9hZGNhc3RzOwogICBicm9hZGNhc3RzWzBdID0gNTsKQEAgLTI5NSwxNSArMjgzLDE0IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA3OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMTM7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDE5OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKDAsaiU3LGslMTMsMCksIGJyb2FkY2FzdChpLGosayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcigwLCBqICUgNywgayAlIDEzLCAwKSwgYnJvYWRjYXN0KGksIGosIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2Jyb2FkY2FzdGluZykKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfYnJvYWRjYXN0aW5nKSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9icm9hZGNhc3Rpbmc8Q29sTWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfYnJvYWRjYXN0aW5nPFJvd01ham9yPigpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfdmVjdG9yaXplZF9icm9hZGNhc3Rpbmc8Q29sTWFqb3I+KCkpOwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfYnVpbHRpbnNfc3ljbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9idWlsdGluc19zeWNsLmNwcAppbmRleCBjODY2OGQ4Li5jOGUwYTZkIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9idWlsdGluc19zeWNsLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9idWlsdGluc19zeWNsLmNwcApAQCAtMjksMTQ4ICsyOSwxOTIgQEAKIC8vIHRoZSBlcXVpdmFsZW50IG9uIHRoZSBob3N0CiBuYW1lc3BhY2UgU1lDTCB7CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGFicyhUIHgpIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBhYnMoVCB4KSB7CiAgIHJldHVybiBjbDo6c3ljbDo6YWJzKHgpOwogfQotdGVtcGxhdGUgPD4gRWlnZW46OmhhbGYgYWJzKEVpZ2VuOjpoYWxmIHgpIHsKK3RlbXBsYXRlIDw+CitFaWdlbjo6aGFsZiBhYnMoRWlnZW46OmhhbGYgeCkgewogICByZXR1cm4gRWlnZW46OmhhbGYoY2w6OnN5Y2w6OmZhYnMoc3RhdGljX2Nhc3Q8Y2w6OnN5Y2w6OmhhbGY+KHgpKSk7CiB9CiAKLXRlbXBsYXRlIDw+IGZsb2F0IGFicyhmbG9hdCB4KSB7Cit0ZW1wbGF0ZSA8PgorZmxvYXQgYWJzKGZsb2F0IHgpIHsKICAgcmV0dXJuIGNsOjpzeWNsOjpmYWJzKHgpOwogfQogCi10ZW1wbGF0ZSA8PiBkb3VibGUgYWJzKGRvdWJsZSB4KSB7Cit0ZW1wbGF0ZSA8PgorZG91YmxlIGFicyhkb3VibGUgeCkgewogICByZXR1cm4gY2w6OnN5Y2w6OmZhYnMoeCk7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIHNxdWFyZShUIHgpIHsgcmV0dXJuIHggKiB4OyB9Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBjdWJlKFQgeCkgeyByZXR1cm4geCAqIHggKiB4OyB9Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBpbnZlcnNlKFQgeCkgeyByZXR1cm4gVCgxKSAvIHg7IH0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGN3aXNlTWF4KFQgeCwgVCB5KSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1Qgc3F1YXJlKFQgeCkgeworICByZXR1cm4geCAqIHg7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgY3ViZShUIHgpIHsKKyAgcmV0dXJuIHggKiB4ICogeDsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBpbnZlcnNlKFQgeCkgeworICByZXR1cm4gVCgxKSAvIHg7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgY3dpc2VNYXgoVCB4LCBUIHkpIHsKICAgcmV0dXJuIGNsOjpzeWNsOjptYXgoeCwgeSk7CiB9Ci10ZW1wbGF0ZSA8PiBFaWdlbjo6aGFsZiBjd2lzZU1heChFaWdlbjo6aGFsZiB4LCBFaWdlbjo6aGFsZiB5KSB7Ci1yZXR1cm4gRWlnZW46OmhhbGYoY2w6OnN5Y2w6Om1heChzdGF0aWNfY2FzdDxjbDo6c3ljbDo6aGFsZj4oeCksIHN0YXRpY19jYXN0PGNsOjpzeWNsOjpoYWxmPih5KSkpOwordGVtcGxhdGUgPD4KK0VpZ2VuOjpoYWxmIGN3aXNlTWF4KEVpZ2VuOjpoYWxmIHgsIEVpZ2VuOjpoYWxmIHkpIHsKKyAgcmV0dXJuIEVpZ2VuOjpoYWxmKGNsOjpzeWNsOjptYXgoc3RhdGljX2Nhc3Q8Y2w6OnN5Y2w6OmhhbGY+KHgpLCBzdGF0aWNfY2FzdDxjbDo6c3ljbDo6aGFsZj4oeSkpKTsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgY3dpc2VNaW4oVCB4LCBUIHkpIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBjd2lzZU1pbihUIHgsIFQgeSkgewogICByZXR1cm4gY2w6OnN5Y2w6Om1pbih4LCB5KTsKIH0KLXRlbXBsYXRlIDw+IEVpZ2VuOjpoYWxmIGN3aXNlTWluKEVpZ2VuOjpoYWxmIHgsIEVpZ2VuOjpoYWxmIHkpIHsKK3RlbXBsYXRlIDw+CitFaWdlbjo6aGFsZiBjd2lzZU1pbihFaWdlbjo6aGFsZiB4LCBFaWdlbjo6aGFsZiB5KSB7CiAgIHJldHVybiBFaWdlbjo6aGFsZihjbDo6c3ljbDo6bWluKHN0YXRpY19jYXN0PGNsOjpzeWNsOjpoYWxmPih4KSwgc3RhdGljX2Nhc3Q8Y2w6OnN5Y2w6OmhhbGY+KHkpKSk7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIHNxcnQoVCB4KSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1Qgc3FydChUIHgpIHsKICAgcmV0dXJuIGNsOjpzeWNsOjpzcXJ0KHgpOwogfQotdGVtcGxhdGUgPD4gRWlnZW46OmhhbGYgc3FydChFaWdlbjo6aGFsZiB4KSB7Cit0ZW1wbGF0ZSA8PgorRWlnZW46OmhhbGYgc3FydChFaWdlbjo6aGFsZiB4KSB7CiAgIHJldHVybiBFaWdlbjo6aGFsZihjbDo6c3ljbDo6c3FydChzdGF0aWNfY2FzdDxjbDo6c3ljbDo6aGFsZj4oeCkpKTsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgcnNxcnQoVCB4KSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgcnNxcnQoVCB4KSB7CiAgIHJldHVybiBjbDo6c3ljbDo6cnNxcnQoeCk7CiB9Ci10ZW1wbGF0ZSA8PiBFaWdlbjo6aGFsZiByc3FydChFaWdlbjo6aGFsZiB4KSB7Cit0ZW1wbGF0ZSA8PgorRWlnZW46OmhhbGYgcnNxcnQoRWlnZW46OmhhbGYgeCkgewogICByZXR1cm4gRWlnZW46OmhhbGYoY2w6OnN5Y2w6OnJzcXJ0KHN0YXRpY19jYXN0PGNsOjpzeWNsOjpoYWxmPih4KSkpOwogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCB0YW5oKFQgeCkgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIHRhbmgoVCB4KSB7CiAgIHJldHVybiBjbDo6c3ljbDo6dGFuaCh4KTsKIH0KLXRlbXBsYXRlIDw+IEVpZ2VuOjpoYWxmIHRhbmgoRWlnZW46OmhhbGYgeCkgewordGVtcGxhdGUgPD4KK0VpZ2VuOjpoYWxmIHRhbmgoRWlnZW46OmhhbGYgeCkgewogICByZXR1cm4gRWlnZW46OmhhbGYoY2w6OnN5Y2w6OnRhbmgoc3RhdGljX2Nhc3Q8Y2w6OnN5Y2w6OmhhbGY+KHgpKSk7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGV4cChUIHgpIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBleHAoVCB4KSB7CiAgIHJldHVybiBjbDo6c3ljbDo6ZXhwKHgpOwogfQotdGVtcGxhdGUgPD4gRWlnZW46OmhhbGYgZXhwKEVpZ2VuOjpoYWxmIHgpIHsKK3RlbXBsYXRlIDw+CitFaWdlbjo6aGFsZiBleHAoRWlnZW46OmhhbGYgeCkgewogICByZXR1cm4gRWlnZW46OmhhbGYoY2w6OnN5Y2w6OmV4cChzdGF0aWNfY2FzdDxjbDo6c3ljbDo6aGFsZj4oeCkpKTsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgZXhwbTEoVCB4KSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgZXhwbTEoVCB4KSB7CiAgIHJldHVybiBjbDo6c3ljbDo6ZXhwbTEoeCk7CiB9Ci10ZW1wbGF0ZSA8PiBFaWdlbjo6aGFsZiBleHBtMShFaWdlbjo6aGFsZiB4KSB7Cit0ZW1wbGF0ZSA8PgorRWlnZW46OmhhbGYgZXhwbTEoRWlnZW46OmhhbGYgeCkgewogICByZXR1cm4gRWlnZW46OmhhbGYoY2w6OnN5Y2w6OmV4cG0xKHN0YXRpY19jYXN0PGNsOjpzeWNsOjpoYWxmPih4KSkpOwogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBsb2coVCB4KSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgbG9nKFQgeCkgewogICByZXR1cm4gY2w6OnN5Y2w6OmxvZyh4KTsKIH0KLXRlbXBsYXRlIDw+IEVpZ2VuOjpoYWxmIGxvZyhFaWdlbjo6aGFsZiB4KSB7Cit0ZW1wbGF0ZSA8PgorRWlnZW46OmhhbGYgbG9nKEVpZ2VuOjpoYWxmIHgpIHsKICAgcmV0dXJuIEVpZ2VuOjpoYWxmKGNsOjpzeWNsOjpsb2coc3RhdGljX2Nhc3Q8Y2w6OnN5Y2w6OmhhbGY+KHgpKSk7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGNlaWwoVCB4KSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgY2VpbChUIHgpIHsKICAgcmV0dXJuIGNsOjpzeWNsOjpjZWlsKHgpOwogfQotdGVtcGxhdGUgPD4gRWlnZW46OmhhbGYgY2VpbChFaWdlbjo6aGFsZiB4KSB7Cit0ZW1wbGF0ZSA8PgorRWlnZW46OmhhbGYgY2VpbChFaWdlbjo6aGFsZiB4KSB7CiAgIHJldHVybiBFaWdlbjo6aGFsZihjbDo6c3ljbDo6Y2VpbChzdGF0aWNfY2FzdDxjbDo6c3ljbDo6aGFsZj4oeCkpKTsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgZmxvb3IoVCB4KSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgZmxvb3IoVCB4KSB7CiAgIHJldHVybiBjbDo6c3ljbDo6Zmxvb3IoeCk7CiB9Ci10ZW1wbGF0ZSA8PiBFaWdlbjo6aGFsZiBmbG9vcihFaWdlbjo6aGFsZiB4KSB7Cit0ZW1wbGF0ZSA8PgorRWlnZW46OmhhbGYgZmxvb3IoRWlnZW46OmhhbGYgeCkgewogICByZXR1cm4gRWlnZW46OmhhbGYoY2w6OnN5Y2w6OmZsb29yKHN0YXRpY19jYXN0PGNsOjpzeWNsOjpoYWxmPih4KSkpOwogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCByb3VuZChUIHgpIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCByb3VuZChUIHgpIHsKICAgcmV0dXJuIGNsOjpzeWNsOjpyb3VuZCh4KTsKIH0KLXRlbXBsYXRlIDw+IEVpZ2VuOjpoYWxmIHJvdW5kKEVpZ2VuOjpoYWxmIHgpIHsKK3RlbXBsYXRlIDw+CitFaWdlbjo6aGFsZiByb3VuZChFaWdlbjo6aGFsZiB4KSB7CiAgIHJldHVybiBFaWdlbjo6aGFsZihjbDo6c3ljbDo6cm91bmQoc3RhdGljX2Nhc3Q8Y2w6OnN5Y2w6OmhhbGY+KHgpKSk7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGxvZzFwKFQgeCkgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIGxvZzFwKFQgeCkgewogICByZXR1cm4gY2w6OnN5Y2w6OmxvZzFwKHgpOwogfQotdGVtcGxhdGUgPD4gRWlnZW46OmhhbGYgbG9nMXAoRWlnZW46OmhhbGYgeCkgewordGVtcGxhdGUgPD4KK0VpZ2VuOjpoYWxmIGxvZzFwKEVpZ2VuOjpoYWxmIHgpIHsKICAgcmV0dXJuIEVpZ2VuOjpoYWxmKGNsOjpzeWNsOjpsb2cxcChzdGF0aWNfY2FzdDxjbDo6c3ljbDo6aGFsZj4oeCkpKTsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgc2lnbihUIHgpIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBzaWduKFQgeCkgewogICByZXR1cm4gY2w6OnN5Y2w6OnNpZ24oeCk7CiB9Ci10ZW1wbGF0ZSA8PiBFaWdlbjo6aGFsZiBzaWduKEVpZ2VuOjpoYWxmIHgpIHsKK3RlbXBsYXRlIDw+CitFaWdlbjo6aGFsZiBzaWduKEVpZ2VuOjpoYWxmIHgpIHsKICAgcmV0dXJuIEVpZ2VuOjpoYWxmKGNsOjpzeWNsOjpzaWduKHN0YXRpY19jYXN0PGNsOjpzeWNsOjpoYWxmPih4KSkpOwogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBpc25hbihUIHgpIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBpc25hbihUIHgpIHsKICAgcmV0dXJuIGNsOjpzeWNsOjppc25hbih4KTsKIH0KLXRlbXBsYXRlIDw+IEVpZ2VuOjpoYWxmIGlzbmFuKEVpZ2VuOjpoYWxmIHgpIHsKK3RlbXBsYXRlIDw+CitFaWdlbjo6aGFsZiBpc25hbihFaWdlbjo6aGFsZiB4KSB7CiAgIHJldHVybiBFaWdlbjo6aGFsZihjbDo6c3ljbDo6aXNuYW4oc3RhdGljX2Nhc3Q8Y2w6OnN5Y2w6OmhhbGY+KHgpKSk7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGlzZmluaXRlKFQgeCkgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIGlzZmluaXRlKFQgeCkgewogICByZXR1cm4gY2w6OnN5Y2w6OmlzZmluaXRlKHgpOwogfQotdGVtcGxhdGUgPD4gRWlnZW46OmhhbGYgaXNmaW5pdGUoRWlnZW46OmhhbGYgeCkgewordGVtcGxhdGUgPD4KK0VpZ2VuOjpoYWxmIGlzZmluaXRlKEVpZ2VuOjpoYWxmIHgpIHsKICAgcmV0dXJuIEVpZ2VuOjpoYWxmKGNsOjpzeWNsOjppc2Zpbml0ZShzdGF0aWNfY2FzdDxjbDo6c3ljbDo6aGFsZj4oeCkpKTsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgaXNpbmYoVCB4KSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgaXNpbmYoVCB4KSB7CiAgIHJldHVybiBjbDo6c3ljbDo6aXNpbmYoeCk7CiB9Ci10ZW1wbGF0ZSA8PiBFaWdlbjo6aGFsZiBpc2luZihFaWdlbjo6aGFsZiB4KSB7Cit0ZW1wbGF0ZSA8PgorRWlnZW46OmhhbGYgaXNpbmYoRWlnZW46OmhhbGYgeCkgewogICByZXR1cm4gRWlnZW46OmhhbGYoY2w6OnN5Y2w6OmlzaW5mKHN0YXRpY19jYXN0PGNsOjpzeWNsOjpoYWxmPih4KSkpOwogfQotfQorfSAgLy8gbmFtZXNwYWNlIFNZQ0wKIAotCi0jZGVmaW5lIERFQ0xBUkVfVU5BUllfU1RSVUNUX05PTl9TWUNMKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdHJ1Y3Qgb3BfIyNGVU5DIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXV0byBvcGVyYXRvcigpKGNvbnN0IFQmIHgpICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIFNZQ0w6OkZVTkMoeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGF1dG8gb3BlcmF0b3IoKShjb25zdCBUZW5zb3JNYXA8VD4mIHgpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiB4LkZVTkMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBERUNMQVJFX1VOQVJZX1NUUlVDVF9OT05fU1lDTChGVU5DKSAgXAorICBzdHJ1Y3Qgb3BfIyNGVU5DIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiAgICAgICAgICAgICAgICAgICAgXAorICAgIGF1dG8gb3BlcmF0b3IoKShjb25zdCBUJiB4KSB7ICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIFNZQ0w6OkZVTkMoeCk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiAgICAgICAgICAgICAgICAgICAgXAorICAgIGF1dG8gb3BlcmF0b3IoKShjb25zdCBUZW5zb3JNYXA8VD4mIHgpIHsgXAorICAgICAgcmV0dXJuIHguRlVOQygpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9OwogCiBERUNMQVJFX1VOQVJZX1NUUlVDVF9OT05fU1lDTChhYnMpCkBAIC0xNzgsMzYgKzIyMiwzNyBAQAogREVDTEFSRV9VTkFSWV9TVFJVQ1RfTk9OX1NZQ0woY3ViZSkKIERFQ0xBUkVfVU5BUllfU1RSVUNUX05PTl9TWUNMKGludmVyc2UpCiAKLSNkZWZpbmUgREVDTEFSRV9CSU5BUllfU1RSVUNUX05PTl9TWUNMKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RydWN0IG9wXyMjRlVOQyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhdXRvIG9wZXJhdG9yKCkoY29uc3QgVDEmIHgsIGNvbnN0IFQyJiB5KXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBTWUNMOjpGVU5DKHgsIHkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhdXRvIG9wZXJhdG9yKCkoY29uc3QgVGVuc29yTWFwPFQxPiYgeCwgY29uc3QgVGVuc29yTWFwPFQyPiYgeSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiB4LkZVTkMoeSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgREVDTEFSRV9CSU5BUllfU1RSVUNUX05PTl9TWUNMKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBvcF8jI0ZVTkMgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdXRvIG9wZXJhdG9yKCkoY29uc3QgVDEmIHgsIGNvbnN0IFQyJiB5KSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gU1lDTDo6RlVOQyh4LCB5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXV0byBvcGVyYXRvcigpKGNvbnN0IFRlbnNvck1hcDxUMT4mIHgsIGNvbnN0IFRlbnNvck1hcDxUMj4mIHkpIHsgXAorICAgICAgcmV0dXJuIHguRlVOQyh5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH07CiAKIERFQ0xBUkVfQklOQVJZX1NUUlVDVF9OT05fU1lDTChjd2lzZU1heCkKIERFQ0xBUkVfQklOQVJZX1NUUlVDVF9OT05fU1lDTChjd2lzZU1pbikKIAotCiBzdHJ1Y3QgRXF1YWxBc3NpZ25tZW50IHsKICAgdGVtcGxhdGUgPHR5cGVuYW1lIExocywgdHlwZW5hbWUgUmhzPgotICB2b2lkIG9wZXJhdG9yKCkoTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKSB7IGxocyA9IHJoczsgfQorICB2b2lkIG9wZXJhdG9yKCkoTGhzJiBsaHMsIGNvbnN0IFJocyYgcmhzKSB7CisgICAgbGhzID0gcmhzOworICB9CiB9OwogCiBzdHJ1Y3QgUGx1c0VxdWFsQXNzaWdubWVudCB7CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBMaHMsIHR5cGVuYW1lIFJocz4KLSAgdm9pZCBvcGVyYXRvcigpKExocyYgbGhzLCBjb25zdCBSaHMmIHJocykgeyBsaHMgKz0gcmhzOyB9CisgIHZvaWQgb3BlcmF0b3IoKShMaHMmIGxocywgY29uc3QgUmhzJiByaHMpIHsKKyAgICBsaHMgKz0gcmhzOworICB9CiB9OwogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LAotICAgICAgICAgIHR5cGVuYW1lIEFzc2lnbm1lbnQsIHR5cGVuYW1lIE9wZXJhdG9yPgotdm9pZCB0ZXN0X3VuYXJ5X2J1aWx0aW5zX2Zvcl9zY2FsYXIoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXk8aW50NjRfdCwgMz4mIHRlbnNvcl9yYW5nZSkgewordGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgQXNzaWdubWVudCwgdHlwZW5hbWUgT3BlcmF0b3I+Cit2b2lkIHRlc3RfdW5hcnlfYnVpbHRpbnNfZm9yX3NjYWxhcihjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UsIGNvbnN0IGFycmF5PGludDY0X3QsIDM+JiB0ZW5zb3JfcmFuZ2UpIHsKICAgT3BlcmF0b3Igb3A7CiAgIEFzc2lnbm1lbnQgYXNnbjsKICAgewpAQCAtMjE3LDIwICsyNjIsMTUgQEAKICAgICBpbiA9IGluLnJhbmRvbSgpICsgRGF0YVR5cGUoMC4wMSk7CiAgICAgb3V0ID0gb3V0LnJhbmRvbSgpICsgRGF0YVR5cGUoMC4wMSk7CiAgICAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBpbnQ2NF90PiByZWZlcmVuY2Uob3V0KTsKLSAgICBEYXRhVHlwZSAqZ3B1X2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPigKLSAgICAgICAgc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4uc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwotICAgIERhdGFUeXBlICpncHVfZGF0YV9vdXQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPigKLSAgICAgICAgc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgICBEYXRhVHlwZSogZ3B1X2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgICBEYXRhVHlwZSogZ3B1X2RhdGFfb3V0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogICAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIGludDY0X3Q+PiBncHUoZ3B1X2RhdGEsIHRlbnNvcl9yYW5nZSk7CiAgICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgaW50NjRfdD4+IGdwdV9vdXQoZ3B1X2RhdGFfb3V0LCB0ZW5zb3JfcmFuZ2UpOwotICAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YSwgaW4uZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4uc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwotICAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV9vdXQsIG91dC5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXQuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YSwgaW4uZGF0YSgpLCAoaW4uc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV9vdXQsIG91dC5kYXRhKCksIChvdXQuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICAgIGF1dG8gZGV2aWNlX2V4cHIgPSBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSk7CiAgICAgYXNnbihkZXZpY2VfZXhwciwgb3AoZ3B1KSk7Ci0gICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9kYXRhX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dC5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9kYXRhX291dCwgKG91dC5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgb3V0LnNpemUoKTsgKytpKSB7CiAgICAgICBEYXRhVHlwZSB2ZXIgPSByZWZlcmVuY2UoaSk7CiAgICAgICBhc2duKHZlciwgb3AoaW4oaSkpKTsKQEAgLTI0NSwxNSArMjg1LDEyIEBACiAgICAgLy8gT2Zmc2V0IHdpdGggMSB0byBhdm9pZCB0aW55IG91dHB1dCAoPCAxZS02KSBhcyB0aGV5IGNhbiBlYXNpbHkgZmFpbC4KICAgICBvdXQgPSBvdXQucmFuZG9tKCkgKyBEYXRhVHlwZSgxKTsKICAgICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIGludDY0X3Q+IHJlZmVyZW5jZShvdXQpOwotICAgIERhdGFUeXBlICpncHVfZGF0YV9vdXQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPigKLSAgICAgICAgc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgICBEYXRhVHlwZSogZ3B1X2RhdGFfb3V0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogICAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIGludDY0X3Q+PiBncHVfb3V0KGdwdV9kYXRhX291dCwgdGVuc29yX3JhbmdlKTsKLSAgICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfb3V0LCBvdXQuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0LnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfb3V0LCBvdXQuZGF0YSgpLCAob3V0LnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgICBhdXRvIGRldmljZV9leHByID0gZ3B1X291dC5kZXZpY2Uoc3ljbF9kZXZpY2UpOwogICAgIGFzZ24oZGV2aWNlX2V4cHIsIG9wKGdwdV9vdXQpKTsKLSAgICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X2RhdGFfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0LnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X2RhdGFfb3V0LCAob3V0LnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCBvdXQuc2l6ZSgpOyArK2kpIHsKICAgICAgIERhdGFUeXBlIHZlciA9IHJlZmVyZW5jZShpKTsKICAgICAgIGFzZ24odmVyLCBvcChyZWZlcmVuY2UoaSkpKTsKQEAgLTI2NiwxNCArMzAzLDE0IEBACiAjZGVmaW5lIERFQ0xBUkVfVU5BUllfU1RSVUNUKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBzdHJ1Y3Qgb3BfIyNGVU5DIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXV0byBvcGVyYXRvcigpKGNvbnN0IFQmIHgpIC0+IGRlY2x0eXBlKFNZQ0w6OkZVTkMoeCkpIHsgICBcCi0gICAgICByZXR1cm4gU1lDTDo6RlVOQyh4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXV0byBvcGVyYXRvcigpKGNvbnN0IFQmIHgpIC0+IGRlY2x0eXBlKFNZQ0w6OkZVTkMoeCkpIHsgICAgICAgXAorICAgICAgcmV0dXJuIFNZQ0w6OkZVTkMoeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGF1dG8gb3BlcmF0b3IoKShjb25zdCBUZW5zb3JNYXA8VD4mIHgpIC0+IGRlY2x0eXBlKHguRlVOQygpKSB7IFwKICAgICAgIHJldHVybiB4LkZVTkMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfTsKKyAgfTsKIAogREVDTEFSRV9VTkFSWV9TVFJVQ1Qoc3FydCkKIERFQ0xBUkVfVU5BUllfU1RSVUNUKHJzcXJ0KQpAQCAtMjkxLDExICszMjgsOSBAQAogREVDTEFSRV9VTkFSWV9TVFJVQ1QoaXNpbmYpCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEFzc2lnbm1lbnQ+Ci12b2lkIHRlc3RfdW5hcnlfYnVpbHRpbnNfZm9yX2Fzc2lnbmVtZW50KGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXk8aW50NjRfdCwgMz4mIHRlbnNvcl9yYW5nZSkgewordm9pZCB0ZXN0X3VuYXJ5X2J1aWx0aW5zX2Zvcl9hc3NpZ25lbWVudChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UsIGNvbnN0IGFycmF5PGludDY0X3QsIDM+JiB0ZW5zb3JfcmFuZ2UpIHsKICNkZWZpbmUgUlVOX1VOQVJZX1RFU1QoRlVOQykgXAotICB0ZXN0X3VuYXJ5X2J1aWx0aW5zX2Zvcl9zY2FsYXI8RGF0YVR5cGUsIERhdGFMYXlvdXQsIEFzc2lnbm1lbnQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wXyMjRlVOQz4oc3ljbF9kZXZpY2UsIHRlbnNvcl9yYW5nZSkKKyAgdGVzdF91bmFyeV9idWlsdGluc19mb3Jfc2NhbGFyPERhdGFUeXBlLCBEYXRhTGF5b3V0LCBBc3NpZ25tZW50LCBvcF8jI0ZVTkM+KHN5Y2xfZGV2aWNlLCB0ZW5zb3JfcmFuZ2UpCiAgIFJVTl9VTkFSWV9URVNUKGFicyk7CiAgIFJVTl9VTkFSWV9URVNUKHNxcnQpOwogICBSVU5fVU5BUllfVEVTVChyc3FydCk7CkBAIC0zMTQsMjQgKzM0OSwxOSBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBPcGVyYXRvcj4KLXZvaWQgdGVzdF91bmFyeV9idWlsdGluc19yZXR1cm5fYm9vbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXk8aW50NjRfdCwgMz4mIHRlbnNvcl9yYW5nZSkgewordm9pZCB0ZXN0X3VuYXJ5X2J1aWx0aW5zX3JldHVybl9ib29sKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSwgY29uc3QgYXJyYXk8aW50NjRfdCwgMz4mIHRlbnNvcl9yYW5nZSkgewogICAvKiBvdXQgPSBvcChpbikgKi8KICAgT3BlcmF0b3Igb3A7CiAgIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgaW50NjRfdD4gaW4odGVuc29yX3JhbmdlKTsKICAgVGVuc29yPGJvb2wsIDMsIERhdGFMYXlvdXQsIGludDY0X3Q+IG91dCh0ZW5zb3JfcmFuZ2UpOwogICBpbiA9IGluLnJhbmRvbSgpICsgRGF0YVR5cGUoMC4wMSk7Ci0gIERhdGFUeXBlICpncHVfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlICo+KAotICAgICAgc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4uc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwotICBib29sICpncHVfZGF0YV9vdXQgPQotICAgICAgc3RhdGljX2Nhc3Q8Ym9vbCAqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuc2l6ZSgpICogc2l6ZW9mKGJvb2wpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4uc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBib29sKiBncHVfZGF0YV9vdXQgPSBzdGF0aWNfY2FzdDxib29sKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0LnNpemUoKSAqIHNpemVvZihib29sKSkpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBpbnQ2NF90Pj4gZ3B1KGdwdV9kYXRhLCB0ZW5zb3JfcmFuZ2UpOwogICBUZW5zb3JNYXA8VGVuc29yPGJvb2wsIDMsIERhdGFMYXlvdXQsIGludDY0X3Q+PiBncHVfb3V0KGdwdV9kYXRhX291dCwgdGVuc29yX3JhbmdlKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhLCBpbi5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4uc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGEsIGluLmRhdGEoKSwgKGluLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgZ3B1X291dC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gb3AoZ3B1KTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9kYXRhX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXQuc2l6ZSgpKSAqIHNpemVvZihib29sKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfZGF0YV9vdXQsIChvdXQuc2l6ZSgpKSAqIHNpemVvZihib29sKSk7CiAgIGZvciAoaW50NjRfdCBpID0gMDsgaSA8IG91dC5zaXplKCk7ICsraSkgewogICAgIFZFUklGWV9JU19FUVVBTChvdXQoaSksIG9wKGluKGkpKSk7CiAgIH0KQEAgLTM0MCwyMiArMzcwLDE2IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQ+Ci12b2lkIHRlc3RfdW5hcnlfYnVpbHRpbnMoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5PGludDY0X3QsIDM+JiB0ZW5zb3JfcmFuZ2UpIHsKLSAgdGVzdF91bmFyeV9idWlsdGluc19mb3JfYXNzaWduZW1lbnQ8RGF0YVR5cGUsIERhdGFMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdXNFcXVhbEFzc2lnbm1lbnQ+KHN5Y2xfZGV2aWNlLCB0ZW5zb3JfcmFuZ2UpOwotICB0ZXN0X3VuYXJ5X2J1aWx0aW5zX2Zvcl9hc3NpZ25lbWVudDxEYXRhVHlwZSwgRGF0YUxheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXF1YWxBc3NpZ25tZW50PihzeWNsX2RldmljZSwgdGVuc29yX3JhbmdlKTsKLSAgdGVzdF91bmFyeV9idWlsdGluc19yZXR1cm5fYm9vbDxEYXRhVHlwZSwgRGF0YUxheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pc25hbj4oc3ljbF9kZXZpY2UsIHRlbnNvcl9yYW5nZSk7Ci0gIHRlc3RfdW5hcnlfYnVpbHRpbnNfcmV0dXJuX2Jvb2w8RGF0YVR5cGUsIERhdGFMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaXNmaW5pdGU+KHN5Y2xfZGV2aWNlLCB0ZW5zb3JfcmFuZ2UpOwotICB0ZXN0X3VuYXJ5X2J1aWx0aW5zX3JldHVybl9ib29sPERhdGFUeXBlLCBEYXRhTGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2lzaW5mPihzeWNsX2RldmljZSwgdGVuc29yX3JhbmdlKTsKK3ZvaWQgdGVzdF91bmFyeV9idWlsdGlucyhjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UsIGNvbnN0IGFycmF5PGludDY0X3QsIDM+JiB0ZW5zb3JfcmFuZ2UpIHsKKyAgdGVzdF91bmFyeV9idWlsdGluc19mb3JfYXNzaWduZW1lbnQ8RGF0YVR5cGUsIERhdGFMYXlvdXQsIFBsdXNFcXVhbEFzc2lnbm1lbnQ+KHN5Y2xfZGV2aWNlLCB0ZW5zb3JfcmFuZ2UpOworICB0ZXN0X3VuYXJ5X2J1aWx0aW5zX2Zvcl9hc3NpZ25lbWVudDxEYXRhVHlwZSwgRGF0YUxheW91dCwgRXF1YWxBc3NpZ25tZW50PihzeWNsX2RldmljZSwgdGVuc29yX3JhbmdlKTsKKyAgdGVzdF91bmFyeV9idWlsdGluc19yZXR1cm5fYm9vbDxEYXRhVHlwZSwgRGF0YUxheW91dCwgb3BfaXNuYW4+KHN5Y2xfZGV2aWNlLCB0ZW5zb3JfcmFuZ2UpOworICB0ZXN0X3VuYXJ5X2J1aWx0aW5zX3JldHVybl9ib29sPERhdGFUeXBlLCBEYXRhTGF5b3V0LCBvcF9pc2Zpbml0ZT4oc3ljbF9kZXZpY2UsIHRlbnNvcl9yYW5nZSk7CisgIHRlc3RfdW5hcnlfYnVpbHRpbnNfcmV0dXJuX2Jvb2w8RGF0YVR5cGUsIERhdGFMYXlvdXQsIG9wX2lzaW5mPihzeWNsX2RldmljZSwgdGVuc29yX3JhbmdlKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9idWlsdGluX3VuYXJ5X3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7CitzdGF0aWMgdm9pZCB0ZXN0X2J1aWx0aW5fdW5hcnlfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgaW50NjRfdCBzaXplRGltMSA9IDEwOwogICBpbnQ2NF90IHNpemVEaW0yID0gMTA7CiAgIGludDY0X3Qgc2l6ZURpbTMgPSAxMDsKQEAgLTM2Niw4ICszOTAsNyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBPcGVyYXRvcj4KLXZvaWQgdGVzdF9iaW5hcnlfYnVpbHRpbnNfZnVuYyhjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXk8aW50NjRfdCwgMz4mIHRlbnNvcl9yYW5nZSkgewordm9pZCB0ZXN0X2JpbmFyeV9idWlsdGluc19mdW5jKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSwgY29uc3QgYXJyYXk8aW50NjRfdCwgMz4mIHRlbnNvcl9yYW5nZSkgewogICAvKiBvdXQgPSBvcChpbl8xLCBpbl8yKSAqLwogICBPcGVyYXRvciBvcDsKICAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBpbnQ2NF90PiBpbl8xKHRlbnNvcl9yYW5nZSk7CkBAIC0zNzYsMjIgKzM5OSwxNiBAQAogICBpbl8xID0gaW5fMS5yYW5kb20oKSArIERhdGFUeXBlKDAuMDEpOwogICBpbl8yID0gaW5fMi5yYW5kb20oKSArIERhdGFUeXBlKDAuMDEpOwogICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIGludDY0X3Q+IHJlZmVyZW5jZShvdXQpOwotICBEYXRhVHlwZSAqZ3B1X2RhdGFfMSA9IHN0YXRpY19jYXN0PERhdGFUeXBlICo+KAotICAgICAgc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5fMS5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlICpncHVfZGF0YV8yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oCi0gICAgICBzeWNsX2RldmljZS5hbGxvY2F0ZShpbl8yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUgKmdwdV9kYXRhX291dCA9IHN0YXRpY19jYXN0PERhdGFUeXBlICo+KAotICAgICAgc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhXzEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluXzEuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfMiA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5fMi5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9vdXQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG91dC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIGludDY0X3Q+PiBncHVfMShncHVfZGF0YV8xLCB0ZW5zb3JfcmFuZ2UpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBpbnQ2NF90Pj4gZ3B1XzIoZ3B1X2RhdGFfMiwgdGVuc29yX3JhbmdlKTsKICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgaW50NjRfdD4+IGdwdV9vdXQoZ3B1X2RhdGFfb3V0LCB0ZW5zb3JfcmFuZ2UpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfMSwgaW5fMS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5fMS5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV8yLCBpbl8yLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbl8yLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhXzEsIGluXzEuZGF0YSgpLCAoaW5fMS5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV8yLCBpbl8yLmRhdGEoKSwgKGluXzIuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPSBvcChncHVfMSwgZ3B1XzIpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X2RhdGFfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dC5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfZGF0YV9vdXQsIChvdXQuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCBvdXQuc2l6ZSgpOyArK2kpIHsKICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpKSwgb3AoaW5fMShpKSwgaW5fMihpKSkpOwogICB9CkBAIC00MDEsOCArNDE4LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgT3BlcmF0b3I+Ci12b2lkIHRlc3RfYmluYXJ5X2J1aWx0aW5zX2ZpeGVkX2FyZzIoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5PGludDY0X3QsIDM+JiB0ZW5zb3JfcmFuZ2UpIHsKK3ZvaWQgdGVzdF9iaW5hcnlfYnVpbHRpbnNfZml4ZWRfYXJnMihjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UsIGNvbnN0IGFycmF5PGludDY0X3QsIDM+JiB0ZW5zb3JfcmFuZ2UpIHsKICAgLyogb3V0ID0gb3AoaW5fMSwgMikgKi8KICAgT3BlcmF0b3Igb3A7CiAgIGNvbnN0IERhdGFUeXBlIGFyZzIoMik7CkBAIC00MTAsMTcgKzQyNiwxMyBAQAogICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIGludDY0X3Q+IG91dCh0ZW5zb3JfcmFuZ2UpOwogICBpbl8xID0gaW5fMS5yYW5kb20oKTsKICAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBpbnQ2NF90PiByZWZlcmVuY2Uob3V0KTsKLSAgRGF0YVR5cGUgKmdwdV9kYXRhXzEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPigKLSAgICAgIHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluXzEuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwotICBEYXRhVHlwZSAqZ3B1X2RhdGFfb3V0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oCi0gICAgICBzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfMSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5fMS5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9vdXQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG91dC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIGludDY0X3Q+PiBncHVfMShncHVfZGF0YV8xLCB0ZW5zb3JfcmFuZ2UpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBpbnQ2NF90Pj4gZ3B1X291dChncHVfZGF0YV9vdXQsIHRlbnNvcl9yYW5nZSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV8xLCBpbl8xLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbl8xLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhXzEsIGluXzEuZGF0YSgpLCAoaW5fMS5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIGdwdV9vdXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IG9wKGdwdV8xLCBhcmcyKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9kYXRhX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXQuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X2RhdGFfb3V0LCAob3V0LnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgb3V0LnNpemUoKTsgKytpKSB7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSksIG9wKGluXzEoaSksIGFyZzIpKTsKICAgfQpAQCAtNDQwLDcgKzQ1Miw2IEBACiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH07CiAKLQogI2RlZmluZSBERUNMQVJFX0JJTkFSWV9TVFJVQ1RfT1AoTkFNRSwgT1BFUkFUT1IpICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHN0cnVjdCBvcF8jI05BTUUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNDU2LDI0ICs0NjcsMTcgQEAKIERFQ0xBUkVfQklOQVJZX1NUUlVDVF9PUChtb2R1bG8sICUpCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQ+Ci12b2lkIHRlc3RfYmluYXJ5X2J1aWx0aW5zKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXk8aW50NjRfdCwgMz4mIHRlbnNvcl9yYW5nZSkgewotICB0ZXN0X2JpbmFyeV9idWlsdGluc19mdW5jPERhdGFUeXBlLCBEYXRhTGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2N3aXNlTWF4PihzeWNsX2RldmljZSwgdGVuc29yX3JhbmdlKTsKLSAgdGVzdF9iaW5hcnlfYnVpbHRpbnNfZnVuYzxEYXRhVHlwZSwgRGF0YUxheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9jd2lzZU1pbj4oc3ljbF9kZXZpY2UsIHRlbnNvcl9yYW5nZSk7Ci0gIHRlc3RfYmluYXJ5X2J1aWx0aW5zX2Z1bmM8RGF0YVR5cGUsIERhdGFMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfcGx1cz4oc3ljbF9kZXZpY2UsIHRlbnNvcl9yYW5nZSk7Ci0gIHRlc3RfYmluYXJ5X2J1aWx0aW5zX2Z1bmM8RGF0YVR5cGUsIERhdGFMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfbWludXM+KHN5Y2xfZGV2aWNlLCB0ZW5zb3JfcmFuZ2UpOwotICB0ZXN0X2JpbmFyeV9idWlsdGluc19mdW5jPERhdGFUeXBlLCBEYXRhTGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX3RpbWVzPihzeWNsX2RldmljZSwgdGVuc29yX3JhbmdlKTsKLSAgdGVzdF9iaW5hcnlfYnVpbHRpbnNfZnVuYzxEYXRhVHlwZSwgRGF0YUxheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9kaXZpZGU+KHN5Y2xfZGV2aWNlLCB0ZW5zb3JfcmFuZ2UpOwordm9pZCB0ZXN0X2JpbmFyeV9idWlsdGlucyhjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UsIGNvbnN0IGFycmF5PGludDY0X3QsIDM+JiB0ZW5zb3JfcmFuZ2UpIHsKKyAgdGVzdF9iaW5hcnlfYnVpbHRpbnNfZnVuYzxEYXRhVHlwZSwgRGF0YUxheW91dCwgb3BfY3dpc2VNYXg+KHN5Y2xfZGV2aWNlLCB0ZW5zb3JfcmFuZ2UpOworICB0ZXN0X2JpbmFyeV9idWlsdGluc19mdW5jPERhdGFUeXBlLCBEYXRhTGF5b3V0LCBvcF9jd2lzZU1pbj4oc3ljbF9kZXZpY2UsIHRlbnNvcl9yYW5nZSk7CisgIHRlc3RfYmluYXJ5X2J1aWx0aW5zX2Z1bmM8RGF0YVR5cGUsIERhdGFMYXlvdXQsIG9wX3BsdXM+KHN5Y2xfZGV2aWNlLCB0ZW5zb3JfcmFuZ2UpOworICB0ZXN0X2JpbmFyeV9idWlsdGluc19mdW5jPERhdGFUeXBlLCBEYXRhTGF5b3V0LCBvcF9taW51cz4oc3ljbF9kZXZpY2UsIHRlbnNvcl9yYW5nZSk7CisgIHRlc3RfYmluYXJ5X2J1aWx0aW5zX2Z1bmM8RGF0YVR5cGUsIERhdGFMYXlvdXQsIG9wX3RpbWVzPihzeWNsX2RldmljZSwgdGVuc29yX3JhbmdlKTsKKyAgdGVzdF9iaW5hcnlfYnVpbHRpbnNfZnVuYzxEYXRhVHlwZSwgRGF0YUxheW91dCwgb3BfZGl2aWRlPihzeWNsX2RldmljZSwgdGVuc29yX3JhbmdlKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9mbG9hdGluZ19idWlsdGluX2JpbmFyeV9zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlICZzeWNsX2RldmljZSkgeworc3RhdGljIHZvaWQgdGVzdF9mbG9hdGluZ19idWlsdGluX2JpbmFyeV9zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBpbnQ2NF90IHNpemVEaW0xID0gMTA7CiAgIGludDY0X3Qgc2l6ZURpbTIgPSAxMDsKICAgaW50NjRfdCBzaXplRGltMyA9IDEwOwpAQCAtNDgzLDE5ICs0ODcsMTcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9pbnRlZ2VyX2J1aWx0aW5fYmluYXJ5X3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7CitzdGF0aWMgdm9pZCB0ZXN0X2ludGVnZXJfYnVpbHRpbl9iaW5hcnlfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgaW50NjRfdCBzaXplRGltMSA9IDEwOwogICBpbnQ2NF90IHNpemVEaW0yID0gMTA7CiAgIGludDY0X3Qgc2l6ZURpbTMgPSAxMDsKICAgYXJyYXk8aW50NjRfdCwgMz4gdGVuc29yX3JhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zfX07Ci0gIHRlc3RfYmluYXJ5X2J1aWx0aW5zX2ZpeGVkX2FyZzI8RGF0YVR5cGUsIFJvd01ham9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX21vZHVsbz4oc3ljbF9kZXZpY2UsIHRlbnNvcl9yYW5nZSk7Ci0gIHRlc3RfYmluYXJ5X2J1aWx0aW5zX2ZpeGVkX2FyZzI8RGF0YVR5cGUsIENvbE1ham9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX21vZHVsbz4oc3ljbF9kZXZpY2UsIHRlbnNvcl9yYW5nZSk7CisgIHRlc3RfYmluYXJ5X2J1aWx0aW5zX2ZpeGVkX2FyZzI8RGF0YVR5cGUsIFJvd01ham9yLCBvcF9tb2R1bG8+KHN5Y2xfZGV2aWNlLCB0ZW5zb3JfcmFuZ2UpOworICB0ZXN0X2JpbmFyeV9idWlsdGluc19maXhlZF9hcmcyPERhdGFUeXBlLCBDb2xNYWpvciwgb3BfbW9kdWxvPihzeWNsX2RldmljZSwgdGVuc29yX3JhbmdlKTsKIH0KIAogRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9idWlsdGluc19zeWNsKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDpFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgeworICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IEVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CiAgICAgUXVldWVJbnRlcmZhY2UgcXVldWVJbnRlcmZhY2UoZGV2aWNlKTsKICAgICBFaWdlbjo6U3ljbERldmljZSBzeWNsX2RldmljZSgmcXVldWVJbnRlcmZhY2UpOwogICAgIENBTExfU1VCVEVTVF8xKHRlc3RfYnVpbHRpbl91bmFyeV9zeWNsPGhhbGY+KHN5Y2xfZGV2aWNlKSk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jYXN0X2Zsb2F0MTZfZ3B1LmN1IGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY2FzdF9mbG9hdDE2X2dwdS5jdQppbmRleCA5NzkyM2QxLi5jZTVjNGMzIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jYXN0X2Zsb2F0MTZfZ3B1LmN1CisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Nhc3RfZmxvYXQxNl9ncHUuY3UKQEAgLTMwLDIyICszMCwxOSBAQAogICBFaWdlbjo6aGFsZiogZF9oYWxmID0gKEVpZ2VuOjpoYWxmKilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CiAgIGZsb2F0KiBkX2NvbnYgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0KAotICAgICAgZF9mbG9hdCwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2hhbGYoCi0gICAgICBkX2hhbGYsIG51bV9lbGVtKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9jb252KAotICAgICAgZF9jb252LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoZF9mbG9hdCwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2hhbGYoZF9oYWxmLCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfY29udihkX2NvbnYsIG51bV9lbGVtKTsKIAotICBncHVfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShkX2Zsb2F0LCBmbG9hdHMuZGF0YSgpLCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZF9mbG9hdCwgZmxvYXRzLmRhdGEoKSwgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKIAogICBncHVfaGFsZi5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQuY2FzdDxFaWdlbjo6aGFsZj4oKTsKICAgZ3B1X2NvbnYuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2hhbGYuY2FzdDxmbG9hdD4oKTsKIAogICBUZW5zb3I8ZmxvYXQsIDE+IGluaXRpYWwobnVtX2VsZW0pOwogICBUZW5zb3I8ZmxvYXQsIDE+IGZpbmFsKG51bV9lbGVtKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5pdGlhbC5kYXRhKCksIGRfZmxvYXQsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmaW5hbC5kYXRhKCksIGRfY29udiwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGluaXRpYWwuZGF0YSgpLCBkX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmaW5hbC5kYXRhKCksIGRfY29udiwgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKICAgZ3B1X2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgewpAQCAtNTcsNyArNTQsNiBAQAogICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9jb252KTsKIH0KIAotCiB2b2lkIHRlc3RfZmFsbGJhY2tfY29udmVyc2lvbigpIHsKICAgaW50IG51bV9lbGVtID0gMTAxOwogICBUZW5zb3I8ZmxvYXQsIDE+IGZsb2F0cyhudW1fZWxlbSk7CkBAIC03MSw5ICs2Nyw3IEBACiAgIH0KIH0KIAotCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2Nhc3RfZmxvYXQxNl9ncHUpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2Nhc3RfZmxvYXQxNl9ncHUpIHsKICAgQ0FMTF9TVUJURVNUKHRlc3RfZ3B1X2NvbnZlcnNpb24oKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2ZhbGxiYWNrX2NvbnZlcnNpb24oKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jYXN0cy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jYXN0cy5jcHAKaW5kZXggNzk3NmRjYi4uOWNkMzc3YyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY2FzdHMuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2Nhc3RzLmNwcApAQCAtMTIsOCArMTIsOCBAQAogCiAjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgogCi11c2luZyBFaWdlbjo6VGVuc29yOwogdXNpbmcgRWlnZW46OmFycmF5OwordXNpbmcgRWlnZW46OlRlbnNvcjsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIEZyb21UeXBlLCB0eXBlbmFtZSBUb1R5cGU+CiBzdGF0aWMgdm9pZCB0ZXN0X3R5cGVfY2FzdCgpIHsKQEAgLTIxLDcgKzIxLDcgQEAKICAgLy8gR2VuZXJhdGUgcmFuZG9tIHZhbHVlcyBmb3IgYSB2YWxpZCBjYXN0LgogICBmb3IgKGludCBpID0gMDsgaSA8IDEwMTsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyMDE7ICsraikgewotICAgICAgZnRlbnNvcihpLCBqKSA9IGludGVybmFsOjpyYW5kb21fd2l0aG91dF9jYXN0X292ZXJmbG93PEZyb21UeXBlLFRvVHlwZT46OnZhbHVlKCk7CisgICAgICBmdGVuc29yKGksIGopID0gaW50ZXJuYWw6OnJhbmRvbV93aXRob3V0X2Nhc3Rfb3ZlcmZsb3c8RnJvbVR5cGUsIFRvVHlwZT46OnZhbHVlKCk7CiAgICAgfQogICB9CiAKQEAgLTM2LDcgKzM2LDcgQEAKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEVuYWJsZUlmID0gdm9pZD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIHR5cGVuYW1lIEVuYWJsZUlmID0gdm9pZD4KIHN0cnVjdCB0ZXN0X2Nhc3RfcnVubmVyIHsKICAgc3RhdGljIHZvaWQgcnVuKCkgewogICAgIHRlc3RfdHlwZV9jYXN0PFNjYWxhciwgYm9vbD4oKTsKQEAgLTU4LDcgKzU4LDcgQEAKIH07CiAKIC8vIE9ubHkgY2VydGFpbiB0eXBlcyBhbGxvdyBjYXN0IGZyb20gc3RkOjpjb21wbGV4PD4uCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgogc3RydWN0IHRlc3RfY2FzdF9ydW5uZXI8U2NhbGFyLCBzdGQ6OmVuYWJsZV9pZl90PE51bVRyYWl0czxTY2FsYXI+OjpJc0NvbXBsZXg+PiB7CiAgIHN0YXRpYyB2b2lkIHJ1bigpIHsKICAgICB0ZXN0X3R5cGVfY2FzdDxTY2FsYXIsIGhhbGY+KCk7CkBAIC02OCw5ICs2OCw3IEBACiAgIH0KIH07CiAKLQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9jYXN0cykKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfY2FzdHMpIHsKICAgQ0FMTF9TVUJURVNUKHRlc3RfY2FzdF9ydW5uZXI8Ym9vbD46OnJ1bigpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfY2FzdF9ydW5uZXI8aW50OF90Pjo6cnVuKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9jYXN0X3J1bm5lcjxpbnQxNl90Pjo6cnVuKCkpOwpAQCAtODYsNSArODQsNCBAQAogICBDQUxMX1NVQlRFU1QodGVzdF9jYXN0X3J1bm5lcjxkb3VibGU+OjpydW4oKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2Nhc3RfcnVubmVyPHN0ZDo6Y29tcGxleDxmbG9hdD4+OjpydW4oKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2Nhc3RfcnVubmVyPHN0ZDo6Y29tcGxleDxkb3VibGU+Pjo6cnVuKCkpOwotCiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jaGlwcGluZy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jaGlwcGluZy5jcHAKaW5kZXggOTIyMjc0NC4uZGJiZDg5ZCAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY2hpcHBpbmcuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NoaXBwaW5nLmNwcApAQCAtMTMsMTAgKzEzLDkgQEAKIAogdXNpbmcgRWlnZW46OlRlbnNvcjsKIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9jaGlwKCkKLXsKLSAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNywxMSk7Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9jaGlwKCkgeworICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3LCAxMSk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKIAogICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGNoaXAxOwpAQCAtMzEsNyArMzAsNyBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDEoaSxqLGssbCksIHRlbnNvcigxLGksaixrLGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDEoaSwgaiwgaywgbCksIHRlbnNvcigxLCBpLCBqLCBrLCBsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC00Niw3ICs0NSw3IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgMTE7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTChjaGlwMihpLGosayxsKSwgdGVuc29yKGksMSxqLGssbCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTChjaGlwMihpLCBqLCBrLCBsKSwgdGVuc29yKGksIDEsIGosIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTYxLDcgKzYwLDcgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAxMTsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAzKGksaixrLGwpLCB0ZW5zb3IoaSxqLDIsayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAzKGksIGosIGssIGwpLCB0ZW5zb3IoaSwgaiwgMiwgaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNzYsNyArNzUsNyBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDQoaSxqLGssbCksIHRlbnNvcihpLGosayw1LGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDQoaSwgaiwgaywgbCksIHRlbnNvcihpLCBqLCBrLCA1LCBsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC05MSwxNyArOTAsMTYgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDUoaSxqLGssbCksIHRlbnNvcihpLGosayxsLDcpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDUoaSwgaiwgaywgbCksIHRlbnNvcihpLCBqLCBrLCBsLCA3KSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2R5bmFtaWNfY2hpcCgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcsMTEpOwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9keW5hbWljX2NoaXAoKSB7CisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMsIDUsIDcsIDExKTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogCiAgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gY2hpcDE7CkBAIC0xMTQsNyArMTEyLDcgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAxMTsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAxKGksaixrLGwpLCB0ZW5zb3IoMSxpLGosayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAxKGksIGosIGssIGwpLCB0ZW5zb3IoMSwgaSwgaiwgaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMTI5LDcgKzEyNyw3IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgMTE7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTChjaGlwMihpLGosayxsKSwgdGVuc29yKGksMSxqLGssbCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTChjaGlwMihpLCBqLCBrLCBsKSwgdGVuc29yKGksIDEsIGosIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTE0NCw3ICsxNDIsNyBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDMoaSxqLGssbCksIHRlbnNvcihpLGosMixrLGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDMoaSwgaiwgaywgbCksIHRlbnNvcihpLCBqLCAyLCBrLCBsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0xNTksNyArMTU3LDcgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAxMTsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA0KGksaixrLGwpLCB0ZW5zb3IoaSxqLGssNSxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA0KGksIGosIGssIGwpLCB0ZW5zb3IoaSwgaiwgaywgNSwgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMTc0LDE4ICsxNzIsMTggQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDUoaSxqLGssbCksIHRlbnNvcihpLGosayxsLDcpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDUoaSwgaiwgaywgbCksIHRlbnNvcihpLCBqLCBrLCBsLCA3KSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CiBzdGF0aWMgdm9pZCB0ZXN0X2NoaXBfaW5fZXhwcigpIHsKLSAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiBpbnB1dDEoMiwzLDUsNywxMSk7CisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gaW5wdXQxKDIsIDMsIDUsIDcsIDExKTsKICAgaW5wdXQxLnNldFJhbmRvbSgpOwotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGlucHV0MigzLDUsNywxMSk7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gaW5wdXQyKDMsIDUsIDcsIDExKTsKICAgaW5wdXQyLnNldFJhbmRvbSgpOwogCiAgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gcmVzdWx0ID0gaW5wdXQxLnRlbXBsYXRlIGNoaXA8MD4oMCkgKyBpbnB1dDI7CkBAIC0xOTMsMzMgKzE5MSwzMiBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKLSAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IGlucHV0MSgwLGksaixrLGwpICsgaW5wdXQyKGksaixrLGwpOwotICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSxqLGssbCksIGV4cGVjdGVkKTsKKyAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IGlucHV0MSgwLCBpLCBqLCBrLCBsKSArIGlucHV0MihpLCBqLCBrLCBsKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksIGosIGssIGwpLCBleHBlY3RlZCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIAotICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IGlucHV0MygzLDcsMTEpOworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IGlucHV0MygzLCA3LCAxMSk7CiAgIGlucHV0My5zZXRSYW5kb20oKTsKICAgVGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiByZXN1bHQyID0gaW5wdXQxLnRlbXBsYXRlIGNoaXA8MD4oMCkudGVtcGxhdGUgY2hpcDwxPigyKSArIGlucHV0MzsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDc7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAxMTsgKytrKSB7Ci0gICAgICAgIGZsb2F0IGV4cGVjdGVkID0gaW5wdXQxKDAsaSwyLGosaykgKyBpbnB1dDMoaSxqLGspOwotICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0MihpLGosayksIGV4cGVjdGVkKTsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSBpbnB1dDEoMCwgaSwgMiwgaiwgaykgKyBpbnB1dDMoaSwgaiwgayk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQyKGksIGosIGspLCBleHBlY3RlZCk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9jaGlwX2FzX2x2YWx1ZSgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gaW5wdXQxKDIsMyw1LDcsMTEpOwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9jaGlwX2FzX2x2YWx1ZSgpIHsKKyAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiBpbnB1dDEoMiwgMywgNSwgNywgMTEpOwogICBpbnB1dDEuc2V0UmFuZG9tKCk7CiAKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBpbnB1dDIoMyw1LDcsMTEpOworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGlucHV0MigzLCA1LCA3LCAxMSk7CiAgIGlucHV0Mi5zZXRSYW5kb20oKTsKICAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiB0ZW5zb3IgPSBpbnB1dDE7CiAgIHRlbnNvci50ZW1wbGF0ZSBjaGlwPDA+KDEpID0gaW5wdXQyOwpAQCAtMjI5LDkgKzIyNiw5IEBACiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CiAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMTsgKyttKSB7CiAgICAgICAgICAgICBpZiAoaSAhPSAxKSB7Ci0gICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCxtKSwgaW5wdXQxKGksaixrLGwsbSkpOworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwsIG0pLCBpbnB1dDEoaSwgaiwgaywgbCwgbSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsLG0pLCBpbnB1dDIoaixrLGwsbSkpOworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwsIG0pLCBpbnB1dDIoaiwgaywgbCwgbSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjM5LDcgKzIzNiw3IEBACiAgICAgfQogICB9CiAKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBpbnB1dDMoMiw1LDcsMTEpOworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGlucHV0MygyLCA1LCA3LCAxMSk7CiAgIGlucHV0My5zZXRSYW5kb20oKTsKICAgdGVuc29yID0gaW5wdXQxOwogICB0ZW5zb3IudGVtcGxhdGUgY2hpcDwxPigxKSA9IGlucHV0MzsKQEAgLTI0OSw5ICsyNDYsOSBAQAogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewogICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMTE7ICsrbSkgewogICAgICAgICAgICAgaWYgKGogIT0gMSkgewotICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0MShpLGosayxsLG0pKTsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsLCBtKSwgaW5wdXQxKGksIGosIGssIGwsIG0pKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCxtKSwgaW5wdXQzKGksayxsLG0pKTsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsLCBtKSwgaW5wdXQzKGksIGssIGwsIG0pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI1OSw3ICsyNTYsNyBAQAogICAgIH0KICAgfQogCi0gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gaW5wdXQ0KDIsMyw3LDExKTsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBpbnB1dDQoMiwgMywgNywgMTEpOwogICBpbnB1dDQuc2V0UmFuZG9tKCk7CiAgIHRlbnNvciA9IGlucHV0MTsKICAgdGVuc29yLnRlbXBsYXRlIGNoaXA8Mj4oMykgPSBpbnB1dDQ7CkBAIC0yNjksOSArMjY2LDkgQEAKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IDExOyArK20pIHsKICAgICAgICAgICAgIGlmIChrICE9IDMpIHsKLSAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsLG0pLCBpbnB1dDEoaSxqLGssbCxtKSk7CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCwgbSksIGlucHV0MShpLCBqLCBrLCBsLCBtKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0NChpLGosbCxtKSk7CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCwgbSksIGlucHV0NChpLCBqLCBsLCBtKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNzksNyArMjc2LDcgQEAKICAgICB9CiAgIH0KIAotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IGlucHV0NSgyLDMsNSwxMSk7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gaW5wdXQ1KDIsIDMsIDUsIDExKTsKICAgaW5wdXQ1LnNldFJhbmRvbSgpOwogICB0ZW5zb3IgPSBpbnB1dDE7CiAgIHRlbnNvci50ZW1wbGF0ZSBjaGlwPDM+KDQpID0gaW5wdXQ1OwpAQCAtMjg5LDkgKzI4Niw5IEBACiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CiAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMTsgKyttKSB7CiAgICAgICAgICAgICBpZiAobCAhPSA0KSB7Ci0gICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCxtKSwgaW5wdXQxKGksaixrLGwsbSkpOworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwsIG0pLCBpbnB1dDEoaSwgaiwgaywgbCwgbSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsLG0pLCBpbnB1dDUoaSxqLGssbSkpOworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwsIG0pLCBpbnB1dDUoaSwgaiwgaywgbSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjk5LDcgKzI5Niw3IEBACiAgICAgfQogICB9CiAKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBpbnB1dDYoMiwzLDUsNyk7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gaW5wdXQ2KDIsIDMsIDUsIDcpOwogICBpbnB1dDYuc2V0UmFuZG9tKCk7CiAgIHRlbnNvciA9IGlucHV0MTsKICAgdGVuc29yLnRlbXBsYXRlIGNoaXA8ND4oNSkgPSBpbnB1dDY7CkBAIC0zMDksOSArMzA2LDkgQEAKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IDExOyArK20pIHsKICAgICAgICAgICAgIGlmIChtICE9IDUpIHsKLSAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsLG0pLCBpbnB1dDEoaSxqLGssbCxtKSk7CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCwgbSksIGlucHV0MShpLCBqLCBrLCBsLCBtKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0NihpLGosayxsKSk7CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCwgbSksIGlucHV0NihpLCBqLCBrLCBsKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zMTksNyArMzE2LDcgQEAKICAgICB9CiAgIH0KIAotICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IGlucHV0NygyLDMsNSw3LDExKTsKKyAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiBpbnB1dDcoMiwgMywgNSwgNywgMTEpOwogICBpbnB1dDcuc2V0UmFuZG9tKCk7CiAgIHRlbnNvciA9IGlucHV0MTsKICAgdGVuc29yLmNoaXAoMCwgMCkgPSBpbnB1dDcuY2hpcCgwLCAwKTsKQEAgLTMyOSw5ICszMjYsOSBAQAogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewogICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMTE7ICsrbSkgewogICAgICAgICAgICAgaWYgKGkgIT0gMCkgewotICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0MShpLGosayxsLG0pKTsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsLCBtKSwgaW5wdXQxKGksIGosIGssIGwsIG0pKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCxtKSwgaW5wdXQ3KGksaixrLGwsbSkpOworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwsIG0pLCBpbnB1dDcoaSwgaiwgaywgbCwgbSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzQwLDkgKzMzNyw4IEBACiAgIH0KIH0KIAotc3RhdGljIHZvaWQgdGVzdF9jaGlwX3Jhd19kYXRhX2NvbF9tYWpvcigpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNSwgQ29sTWFqb3I+IHRlbnNvcigyLDMsNSw3LDExKTsKK3N0YXRpYyB2b2lkIHRlc3RfY2hpcF9yYXdfZGF0YV9jb2xfbWFqb3IoKSB7CisgIFRlbnNvcjxmbG9hdCwgNSwgQ29sTWFqb3I+IHRlbnNvcigyLCAzLCA1LCA3LCAxMSk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKIAogICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxkZWNsdHlwZSh0ZW5zb3IuY2hpcDw0PigzKSksIERlZmF1bHREZXZpY2U+IEV2YWx1YXRvcjQ7CkBAIC0zNTIsNyArMzQ4LDcgQEAKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CiAgICAgICAgICAgaW50IGNoaXBfaW5kZXggPSBpICsgMiAqIChqICsgMyAqIChrICsgNSAqIGwpKTsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcC5kYXRhKClbY2hpcF9pbmRleF0sIHRlbnNvcihpLGosayxsLDMpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcC5kYXRhKClbY2hpcF9pbmRleF0sIHRlbnNvcihpLCBqLCBrLCBsLCAzKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0zNzUsOSArMzcxLDggQEAKICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAzLmRhdGEoKSwgc3RhdGljX2Nhc3Q8ZmxvYXQqPigwKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfY2hpcF9yYXdfZGF0YV9yb3dfbWFqb3IoKQotewotICBUZW5zb3I8ZmxvYXQsIDUsIFJvd01ham9yPiB0ZW5zb3IoMTEsNyw1LDMsMik7CitzdGF0aWMgdm9pZCB0ZXN0X2NoaXBfcmF3X2RhdGFfcm93X21ham9yKCkgeworICBUZW5zb3I8ZmxvYXQsIDUsIFJvd01ham9yPiB0ZW5zb3IoMTEsIDcsIDUsIDMsIDIpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAKICAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8ZGVjbHR5cGUodGVuc29yLmNoaXA8MD4oMykpLCBEZWZhdWx0RGV2aWNlPiBFdmFsdWF0b3IwOwpAQCAtMzg3LDcgKzM4Miw3IEBACiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDM7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDI7ICsrbCkgewogICAgICAgICAgIGludCBjaGlwX2luZGV4ID0gbCArIDIgKiAoayArIDMgKiAoaiArIDUgKiBpKSk7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAuZGF0YSgpW2NoaXBfaW5kZXhdLCB0ZW5zb3IoMyxpLGosayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAuZGF0YSgpW2NoaXBfaW5kZXhdLCB0ZW5zb3IoMywgaSwgaiwgaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNDEwLDggKzQwNSw3IEBACiAgIFZFUklGWV9JU19FUVVBTChjaGlwNC5kYXRhKCksIHN0YXRpY19jYXN0PGZsb2F0Kj4oMCkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2NoaXBwaW5nKQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9jaGlwcGluZykgewogICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfY2hpcDxDb2xNYWpvcj4oKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9jaGlwPFJvd01ham9yPigpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfZHluYW1pY19jaGlwPENvbE1ham9yPigpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NoaXBwaW5nX3N5Y2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY2hpcHBpbmdfc3ljbC5jcHAKaW5kZXggYjAxOGRhOC4uY2FiMGFlOCAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY2hpcHBpbmdfc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY2hpcHBpbmdfc3ljbC5jcHAKQEAgLTEyLDcgKzEyLDYgQEAKIC8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAogLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCiAKLQogI2RlZmluZSBFSUdFTl9URVNUX05PX0xPTkdET1VCTEUKICNkZWZpbmUgRUlHRU5fVEVTVF9OT19DT01QTEVYCiAKQEAgLTI2LDggKzI1LDcgQEAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3Rfc3RhdGljX2NoaXBfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpCi17CitzdGF0aWMgdm9pZCB0ZXN0X3N0YXRpY19jaGlwX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIEluZGV4VHlwZSBzaXplRGltMSA9IDI7CiAgIEluZGV4VHlwZSBzaXplRGltMiA9IDM7CiAgIEluZGV4VHlwZSBzaXplRGltMyA9IDU7CkBAIC0zNywyMSArMzUsMjEgQEAKICAgYXJyYXk8SW5kZXhUeXBlLCA1PiB0ZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEsIHNpemVEaW0yLCBzaXplRGltMywgc2l6ZURpbTQsIHNpemVEaW01fX07CiAgIGFycmF5PEluZGV4VHlwZSwgND4gY2hpcDFUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNCwgc2l6ZURpbTV9fTsKIAotICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiB0ZW5zb3IodGVuc29yUmFuZ2UpOwotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBjaGlwMShjaGlwMVRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHRlbnNvcih0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBjaGlwMShjaGlwMVRlbnNvclJhbmdlKTsKIAogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAKLSAgY29uc3Qgc2l6ZV90IHRlbnNvckJ1ZmZTaXplID10ZW5zb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIGNvbnN0IHNpemVfdCBjaGlwMVRlbnNvckJ1ZmZTaXplID1jaGlwMS5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3RlbnNvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvckJ1ZmZTaXplKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9jaGlwMSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGNoaXAxVGVuc29yQnVmZlNpemUpKTsKKyAgY29uc3Qgc2l6ZV90IHRlbnNvckJ1ZmZTaXplID0gdGVuc29yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIGNvbnN0IHNpemVfdCBjaGlwMVRlbnNvckJ1ZmZTaXplID0gY2hpcDEuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3RlbnNvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yQnVmZlNpemUpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX2NoaXAxID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShjaGlwMVRlbnNvckJ1ZmZTaXplKSk7CiAKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfdGVuc29yKGdwdV9kYXRhX3RlbnNvciwgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9jaGlwMShncHVfZGF0YV9jaGlwMSwgY2hpcDFUZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV90ZW5zb3IoZ3B1X2RhdGFfdGVuc29yLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9jaGlwMShncHVfZGF0YV9jaGlwMSwgY2hpcDFUZW5zb3JSYW5nZSk7CiAKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX3RlbnNvciwgdGVuc29yLmRhdGEoKSwgdGVuc29yQnVmZlNpemUpOwotICBncHVfY2hpcDEuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfdGVuc29yLnRlbXBsYXRlIGNoaXA8MGw+KDFsKTsKKyAgZ3B1X2NoaXAxLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfdGVuc29yLnRlbXBsYXRlIGNoaXA8MGw+KDFsKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGNoaXAxLmRhdGEoKSwgZ3B1X2RhdGFfY2hpcDEsIGNoaXAxVGVuc29yQnVmZlNpemUpOwogCiAgIFZFUklGWV9JU19FUVVBTChjaGlwMS5kaW1lbnNpb24oMCksIHNpemVEaW0yKTsKQEAgLTYzLDE5ICs2MSwxOSBAQAogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgc2l6ZURpbTM7ICsraikgewogICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCBzaXplRGltNDsgKytrKSB7CiAgICAgICAgIGZvciAoSW5kZXhUeXBlIGwgPSAwOyBsIDwgc2l6ZURpbTU7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTChjaGlwMShpLGosayxsKSwgdGVuc29yKDFsLGksaixrLGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDEoaSwgaiwgaywgbCksIHRlbnNvcigxbCwgaSwgaiwgaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiAKICAgYXJyYXk8SW5kZXhUeXBlLCA0PiBjaGlwMlRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTMsIHNpemVEaW00LCBzaXplRGltNX19OwotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBjaGlwMihjaGlwMlRlbnNvclJhbmdlKTsKLSAgY29uc3Qgc2l6ZV90IGNoaXAyVGVuc29yQnVmZlNpemUgPWNoaXAyLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfY2hpcDIgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShjaGlwMlRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X2NoaXAyKGdwdV9kYXRhX2NoaXAyLCBjaGlwMlRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGNoaXAyKGNoaXAyVGVuc29yUmFuZ2UpOworICBjb25zdCBzaXplX3QgY2hpcDJUZW5zb3JCdWZmU2l6ZSA9IGNoaXAyLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9jaGlwMiA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY2hpcDJUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfY2hpcDIoZ3B1X2RhdGFfY2hpcDIsIGNoaXAyVGVuc29yUmFuZ2UpOwogCi0gIGdwdV9jaGlwMi5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDwxbD4oMWwpOworICBncHVfY2hpcDIuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDwxbD4oMWwpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoY2hpcDIuZGF0YSgpLCBncHVfZGF0YV9jaGlwMiwgY2hpcDJUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAyLmRpbWVuc2lvbigwKSwgc2l6ZURpbTEpOwpAQCAtODcsMTkgKzg1LDE5IEBACiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCBzaXplRGltMzsgKytqKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IHNpemVEaW00OyArK2spIHsKICAgICAgICAgZm9yIChJbmRleFR5cGUgbCA9IDA7IGwgPCBzaXplRGltNTsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAyKGksaixrLGwpLCB0ZW5zb3IoaSwxbCxqLGssbCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTChjaGlwMihpLCBqLCBrLCBsKSwgdGVuc29yKGksIDFsLCBqLCBrLCBsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIAogICBhcnJheTxJbmRleFR5cGUsIDQ+IGNoaXAzVGVuc29yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTQsIHNpemVEaW01fX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+IGNoaXAzKGNoaXAzVGVuc29yUmFuZ2UpOwotICBjb25zdCBzaXplX3QgY2hpcDNUZW5zb3JCdWZmU2l6ZSA9Y2hpcDMuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9jaGlwMyAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGNoaXAzVGVuc29yQnVmZlNpemUpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfY2hpcDMoZ3B1X2RhdGFfY2hpcDMsIGNoaXAzVGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gY2hpcDMoY2hpcDNUZW5zb3JSYW5nZSk7CisgIGNvbnN0IHNpemVfdCBjaGlwM1RlbnNvckJ1ZmZTaXplID0gY2hpcDMuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX2NoaXAzID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShjaGlwM1RlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9jaGlwMyhncHVfZGF0YV9jaGlwMywgY2hpcDNUZW5zb3JSYW5nZSk7CiAKLSAgZ3B1X2NoaXAzLmRldmljZShzeWNsX2RldmljZSk9Z3B1X3RlbnNvci50ZW1wbGF0ZSBjaGlwPDJsPigybCk7CisgIGdwdV9jaGlwMy5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X3RlbnNvci50ZW1wbGF0ZSBjaGlwPDJsPigybCk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChjaGlwMy5kYXRhKCksIGdwdV9kYXRhX2NoaXAzLCBjaGlwM1RlbnNvckJ1ZmZTaXplKTsKIAogICBWRVJJRllfSVNfRVFVQUwoY2hpcDMuZGltZW5zaW9uKDApLCBzaXplRGltMSk7CkBAIC0xMTEsMTkgKzEwOSwxOSBAQAogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgc2l6ZURpbTI7ICsraikgewogICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCBzaXplRGltNDsgKytrKSB7CiAgICAgICAgIGZvciAoSW5kZXhUeXBlIGwgPSAwOyBsIDwgc2l6ZURpbTU7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTChjaGlwMyhpLGosayxsKSwgdGVuc29yKGksaiwybCxrLGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDMoaSwgaiwgaywgbCksIHRlbnNvcihpLCBqLCAybCwgaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiAKICAgYXJyYXk8SW5kZXhUeXBlLCA0PiBjaGlwNFRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNX19OwotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBjaGlwNChjaGlwNFRlbnNvclJhbmdlKTsKLSAgY29uc3Qgc2l6ZV90IGNoaXA0VGVuc29yQnVmZlNpemUgPWNoaXA0LnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfY2hpcDQgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShjaGlwNFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X2NoaXA0KGdwdV9kYXRhX2NoaXA0LCBjaGlwNFRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGNoaXA0KGNoaXA0VGVuc29yUmFuZ2UpOworICBjb25zdCBzaXplX3QgY2hpcDRUZW5zb3JCdWZmU2l6ZSA9IGNoaXA0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9jaGlwNCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY2hpcDRUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfY2hpcDQoZ3B1X2RhdGFfY2hpcDQsIGNoaXA0VGVuc29yUmFuZ2UpOwogCi0gIGdwdV9jaGlwNC5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDwzbD4oNWwpOworICBncHVfY2hpcDQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDwzbD4oNWwpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoY2hpcDQuZGF0YSgpLCBncHVfZGF0YV9jaGlwNCwgY2hpcDRUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA0LmRpbWVuc2lvbigwKSwgc2l6ZURpbTEpOwpAQCAtMTM1LDIwICsxMzMsMTkgQEAKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IHNpemVEaW0yOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgc2l6ZURpbTM7ICsraykgewogICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IHNpemVEaW01OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDQoaSxqLGssbCksIHRlbnNvcihpLGosayw1bCxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA0KGksIGosIGssIGwpLCB0ZW5zb3IoaSwgaiwgaywgNWwsIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCi0KICAgYXJyYXk8SW5kZXhUeXBlLCA0PiBjaGlwNVRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNH19OwotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBjaGlwNShjaGlwNVRlbnNvclJhbmdlKTsKLSAgY29uc3Qgc2l6ZV90IGNoaXA1VGVuc29yQnVmZlNpemUgPWNoaXA1LnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfY2hpcDUgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShjaGlwNVRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X2NoaXA1KGdwdV9kYXRhX2NoaXA1LCBjaGlwNVRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGNoaXA1KGNoaXA1VGVuc29yUmFuZ2UpOworICBjb25zdCBzaXplX3QgY2hpcDVUZW5zb3JCdWZmU2l6ZSA9IGNoaXA1LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9jaGlwNSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY2hpcDVUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfY2hpcDUoZ3B1X2RhdGFfY2hpcDUsIGNoaXA1VGVuc29yUmFuZ2UpOwogCi0gIGdwdV9jaGlwNS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDw0bD4oN2wpOworICBncHVfY2hpcDUuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDw0bD4oN2wpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoY2hpcDUuZGF0YSgpLCBncHVfZGF0YV9jaGlwNSwgY2hpcDVUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA1LmRpbWVuc2lvbigwKSwgc2l6ZURpbTEpOwpAQCAtMTYwLDcgKzE1Nyw3IEBACiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCBzaXplRGltMjsgKytqKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IHNpemVEaW0zOyArK2spIHsKICAgICAgICAgZm9yIChJbmRleFR5cGUgbCA9IDA7IGwgPCBzaXplRGltNDsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA1KGksaixrLGwpLCB0ZW5zb3IoaSxqLGssbCw3bCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTChjaGlwNShpLCBqLCBrLCBsKSwgdGVuc29yKGksIGosIGssIGwsIDdsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0xNzUsOCArMTcyLDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9keW5hbWljX2NoaXBfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpCi17CitzdGF0aWMgdm9pZCB0ZXN0X2R5bmFtaWNfY2hpcF9zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBJbmRleFR5cGUgc2l6ZURpbTEgPSAyOwogICBJbmRleFR5cGUgc2l6ZURpbTIgPSAzOwogICBJbmRleFR5cGUgc2l6ZURpbTMgPSA1OwpAQCAtMTg2LDIxICsxODIsMjEgQEAKICAgYXJyYXk8SW5kZXhUeXBlLCA1PiB0ZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEsIHNpemVEaW0yLCBzaXplRGltMywgc2l6ZURpbTQsIHNpemVEaW01fX07CiAgIGFycmF5PEluZGV4VHlwZSwgND4gY2hpcDFUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNCwgc2l6ZURpbTV9fTsKIAotICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiB0ZW5zb3IodGVuc29yUmFuZ2UpOwotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBjaGlwMShjaGlwMVRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHRlbnNvcih0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBjaGlwMShjaGlwMVRlbnNvclJhbmdlKTsKIAogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAKLSAgY29uc3Qgc2l6ZV90IHRlbnNvckJ1ZmZTaXplID10ZW5zb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIGNvbnN0IHNpemVfdCBjaGlwMVRlbnNvckJ1ZmZTaXplID1jaGlwMS5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3RlbnNvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvckJ1ZmZTaXplKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9jaGlwMSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGNoaXAxVGVuc29yQnVmZlNpemUpKTsKKyAgY29uc3Qgc2l6ZV90IHRlbnNvckJ1ZmZTaXplID0gdGVuc29yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIGNvbnN0IHNpemVfdCBjaGlwMVRlbnNvckJ1ZmZTaXplID0gY2hpcDEuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3RlbnNvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yQnVmZlNpemUpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX2NoaXAxID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShjaGlwMVRlbnNvckJ1ZmZTaXplKSk7CiAKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfdGVuc29yKGdwdV9kYXRhX3RlbnNvciwgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9jaGlwMShncHVfZGF0YV9jaGlwMSwgY2hpcDFUZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV90ZW5zb3IoZ3B1X2RhdGFfdGVuc29yLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9jaGlwMShncHVfZGF0YV9jaGlwMSwgY2hpcDFUZW5zb3JSYW5nZSk7CiAKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX3RlbnNvciwgdGVuc29yLmRhdGEoKSwgdGVuc29yQnVmZlNpemUpOwotICBncHVfY2hpcDEuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfdGVuc29yLmNoaXAoMWwsMGwpOworICBncHVfY2hpcDEuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV90ZW5zb3IuY2hpcCgxbCwgMGwpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoY2hpcDEuZGF0YSgpLCBncHVfZGF0YV9jaGlwMSwgY2hpcDFUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAxLmRpbWVuc2lvbigwKSwgc2l6ZURpbTIpOwpAQCAtMjEyLDE5ICsyMDgsMTkgQEAKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IHNpemVEaW0zOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgc2l6ZURpbTQ7ICsraykgewogICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IHNpemVEaW01OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDEoaSxqLGssbCksIHRlbnNvcigxbCxpLGosayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAxKGksIGosIGssIGwpLCB0ZW5zb3IoMWwsIGksIGosIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCiAgIGFycmF5PEluZGV4VHlwZSwgND4gY2hpcDJUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEsIHNpemVEaW0zLCBzaXplRGltNCwgc2l6ZURpbTV9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gY2hpcDIoY2hpcDJUZW5zb3JSYW5nZSk7Ci0gIGNvbnN0IHNpemVfdCBjaGlwMlRlbnNvckJ1ZmZTaXplID1jaGlwMi5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX2NoaXAyICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY2hpcDJUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9jaGlwMihncHVfZGF0YV9jaGlwMiwgY2hpcDJUZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBjaGlwMihjaGlwMlRlbnNvclJhbmdlKTsKKyAgY29uc3Qgc2l6ZV90IGNoaXAyVGVuc29yQnVmZlNpemUgPSBjaGlwMi5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfY2hpcDIgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGNoaXAyVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2NoaXAyKGdwdV9kYXRhX2NoaXAyLCBjaGlwMlRlbnNvclJhbmdlKTsKIAotICBncHVfY2hpcDIuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfdGVuc29yLmNoaXAoMWwsMWwpOworICBncHVfY2hpcDIuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV90ZW5zb3IuY2hpcCgxbCwgMWwpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoY2hpcDIuZGF0YSgpLCBncHVfZGF0YV9jaGlwMiwgY2hpcDJUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAyLmRpbWVuc2lvbigwKSwgc2l6ZURpbTEpOwpAQCAtMjM2LDE5ICsyMzIsMTkgQEAKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IHNpemVEaW0zOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgc2l6ZURpbTQ7ICsraykgewogICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IHNpemVEaW01OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDIoaSxqLGssbCksIHRlbnNvcihpLDFsLGosayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAyKGksIGosIGssIGwpLCB0ZW5zb3IoaSwgMWwsIGosIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCiAgIGFycmF5PEluZGV4VHlwZSwgND4gY2hpcDNUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEsIHNpemVEaW0yLCBzaXplRGltNCwgc2l6ZURpbTV9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gY2hpcDMoY2hpcDNUZW5zb3JSYW5nZSk7Ci0gIGNvbnN0IHNpemVfdCBjaGlwM1RlbnNvckJ1ZmZTaXplID1jaGlwMy5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX2NoaXAzICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY2hpcDNUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9jaGlwMyhncHVfZGF0YV9jaGlwMywgY2hpcDNUZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBjaGlwMyhjaGlwM1RlbnNvclJhbmdlKTsKKyAgY29uc3Qgc2l6ZV90IGNoaXAzVGVuc29yQnVmZlNpemUgPSBjaGlwMy5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfY2hpcDMgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGNoaXAzVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2NoaXAzKGdwdV9kYXRhX2NoaXAzLCBjaGlwM1RlbnNvclJhbmdlKTsKIAotICBncHVfY2hpcDMuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfdGVuc29yLmNoaXAoMmwsMmwpOworICBncHVfY2hpcDMuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV90ZW5zb3IuY2hpcCgybCwgMmwpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoY2hpcDMuZGF0YSgpLCBncHVfZGF0YV9jaGlwMywgY2hpcDNUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAzLmRpbWVuc2lvbigwKSwgc2l6ZURpbTEpOwpAQCAtMjYwLDE5ICsyNTYsMTkgQEAKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IHNpemVEaW0yOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgc2l6ZURpbTQ7ICsraykgewogICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IHNpemVEaW01OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDMoaSxqLGssbCksIHRlbnNvcihpLGosMmwsayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXAzKGksIGosIGssIGwpLCB0ZW5zb3IoaSwgaiwgMmwsIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCiAgIGFycmF5PEluZGV4VHlwZSwgND4gY2hpcDRUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEsIHNpemVEaW0yLCBzaXplRGltMywgc2l6ZURpbTV9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gY2hpcDQoY2hpcDRUZW5zb3JSYW5nZSk7Ci0gIGNvbnN0IHNpemVfdCBjaGlwNFRlbnNvckJ1ZmZTaXplID1jaGlwNC5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX2NoaXA0ICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY2hpcDRUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9jaGlwNChncHVfZGF0YV9jaGlwNCwgY2hpcDRUZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBjaGlwNChjaGlwNFRlbnNvclJhbmdlKTsKKyAgY29uc3Qgc2l6ZV90IGNoaXA0VGVuc29yQnVmZlNpemUgPSBjaGlwNC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfY2hpcDQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGNoaXA0VGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2NoaXA0KGdwdV9kYXRhX2NoaXA0LCBjaGlwNFRlbnNvclJhbmdlKTsKIAotICBncHVfY2hpcDQuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfdGVuc29yLmNoaXAoNWwsM2wpOworICBncHVfY2hpcDQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV90ZW5zb3IuY2hpcCg1bCwgM2wpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoY2hpcDQuZGF0YSgpLCBncHVfZGF0YV9jaGlwNCwgY2hpcDRUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA0LmRpbWVuc2lvbigwKSwgc2l6ZURpbTEpOwpAQCAtMjg0LDIwICsyODAsMTkgQEAKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IHNpemVEaW0yOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgc2l6ZURpbTM7ICsraykgewogICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IHNpemVEaW01OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDQoaSxqLGssbCksIHRlbnNvcihpLGosayw1bCxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA0KGksIGosIGssIGwpLCB0ZW5zb3IoaSwgaiwgaywgNWwsIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCi0KICAgYXJyYXk8SW5kZXhUeXBlLCA0PiBjaGlwNVRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNH19OwotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBjaGlwNShjaGlwNVRlbnNvclJhbmdlKTsKLSAgY29uc3Qgc2l6ZV90IGNoaXA1VGVuc29yQnVmZlNpemUgPWNoaXA1LnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfY2hpcDUgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShjaGlwNVRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X2NoaXA1KGdwdV9kYXRhX2NoaXA1LCBjaGlwNVRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGNoaXA1KGNoaXA1VGVuc29yUmFuZ2UpOworICBjb25zdCBzaXplX3QgY2hpcDVUZW5zb3JCdWZmU2l6ZSA9IGNoaXA1LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9jaGlwNSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY2hpcDVUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfY2hpcDUoZ3B1X2RhdGFfY2hpcDUsIGNoaXA1VGVuc29yUmFuZ2UpOwogCi0gIGdwdV9jaGlwNS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV90ZW5zb3IuY2hpcCg3bCw0bCk7CisgIGdwdV9jaGlwNS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X3RlbnNvci5jaGlwKDdsLCA0bCk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChjaGlwNS5kYXRhKCksIGdwdV9kYXRhX2NoaXA1LCBjaGlwNVRlbnNvckJ1ZmZTaXplKTsKIAogICBWRVJJRllfSVNfRVFVQUwoY2hpcDUuZGltZW5zaW9uKDApLCBzaXplRGltMSk7CkBAIC0zMDksNyArMzA0LDcgQEAKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IHNpemVEaW0yOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgc2l6ZURpbTM7ICsraykgewogICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IHNpemVEaW00OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDUoaSxqLGssbCksIHRlbnNvcihpLGosayxsLDdsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGNoaXA1KGksIGosIGssIGwpLCB0ZW5zb3IoaSwgaiwgaywgbCwgN2wpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTMyNCw3ICszMTksNiBAQAogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+CiBzdGF0aWMgdm9pZCB0ZXN0X2NoaXBfaW5fZXhwcihjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKLQogICBJbmRleFR5cGUgc2l6ZURpbTEgPSAyOwogICBJbmRleFR5cGUgc2l6ZURpbTIgPSAzOwogICBJbmRleFR5cGUgc2l6ZURpbTMgPSA1OwpAQCAtMzM0LDU5ICszMjgsNTggQEAKICAgYXJyYXk8SW5kZXhUeXBlLCA1PiB0ZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEsIHNpemVEaW0yLCBzaXplRGltMywgc2l6ZURpbTQsIHNpemVEaW01fX07CiAgIGFycmF5PEluZGV4VHlwZSwgND4gY2hpcDFUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNCwgc2l6ZURpbTV9fTsKIAotICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiB0ZW5zb3IodGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yKHRlbnNvclJhbmdlKTsKIAotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBjaGlwMShjaGlwMVRlbnNvclJhbmdlKTsKLSAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gdGVuc29yMShjaGlwMVRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGNoaXAxKGNoaXAxVGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yMShjaGlwMVRlbnNvclJhbmdlKTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogICB0ZW5zb3IxLnNldFJhbmRvbSgpOwogCi0gIGNvbnN0IHNpemVfdCB0ZW5zb3JCdWZmU2l6ZSA9dGVuc29yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBjb25zdCBzaXplX3QgY2hpcDFUZW5zb3JCdWZmU2l6ZSA9Y2hpcDEuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV90ZW5zb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JCdWZmU2l6ZSkpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfY2hpcDEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShjaGlwMVRlbnNvckJ1ZmZTaXplKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV90ZW5zb3IxICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY2hpcDFUZW5zb3JCdWZmU2l6ZSkpOworICBjb25zdCBzaXplX3QgdGVuc29yQnVmZlNpemUgPSB0ZW5zb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgY29uc3Qgc2l6ZV90IGNoaXAxVGVuc29yQnVmZlNpemUgPSBjaGlwMS5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfdGVuc29yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JCdWZmU2l6ZSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfY2hpcDEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGNoaXAxVGVuc29yQnVmZlNpemUpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3RlbnNvcjEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGNoaXAxVGVuc29yQnVmZlNpemUpKTsKIAotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV90ZW5zb3IoZ3B1X2RhdGFfdGVuc29yLCB0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X2NoaXAxKGdwdV9kYXRhX2NoaXAxLCBjaGlwMVRlbnNvclJhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfdGVuc29yMShncHVfZGF0YV90ZW5zb3IxLCBjaGlwMVRlbnNvclJhbmdlKTsKLQorICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfdGVuc29yKGdwdV9kYXRhX3RlbnNvciwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfY2hpcDEoZ3B1X2RhdGFfY2hpcDEsIGNoaXAxVGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfdGVuc29yMShncHVfZGF0YV90ZW5zb3IxLCBjaGlwMVRlbnNvclJhbmdlKTsKIAogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfdGVuc29yLCB0ZW5zb3IuZGF0YSgpLCB0ZW5zb3JCdWZmU2l6ZSk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV90ZW5zb3IxLCB0ZW5zb3IxLmRhdGEoKSwgY2hpcDFUZW5zb3JCdWZmU2l6ZSk7Ci0gIGdwdV9jaGlwMS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDwwbD4oMGwpICsgZ3B1X3RlbnNvcjE7CisgIGdwdV9jaGlwMS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X3RlbnNvci50ZW1wbGF0ZSBjaGlwPDBsPigwbCkgKyBncHVfdGVuc29yMTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGNoaXAxLmRhdGEoKSwgZ3B1X2RhdGFfY2hpcDEsIGNoaXAxVGVuc29yQnVmZlNpemUpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZURpbTI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZURpbTM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzaXplRGltNDsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgc2l6ZURpbTU7ICsrbCkgewotICAgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gdGVuc29yKDBsLGksaixrLGwpICsgdGVuc29yMShpLGosayxsKTsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoY2hpcDEoaSxqLGssbCksIGV4cGVjdGVkKTsKKyAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IHRlbnNvcigwbCwgaSwgaiwgaywgbCkgKyB0ZW5zb3IxKGksIGosIGssIGwpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTChjaGlwMShpLCBqLCBrLCBsKSwgZXhwZWN0ZWQpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiAKICAgYXJyYXk8SW5kZXhUeXBlLCAzPiBjaGlwMlRlbnNvclJhbmdlID0ge3tzaXplRGltMiwgc2l6ZURpbTQsIHNpemVEaW01fX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCxJbmRleFR5cGU+IHRlbnNvcjIoY2hpcDJUZW5zb3JSYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCxJbmRleFR5cGU+IGNoaXAyKGNoaXAyVGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yMihjaGlwMlRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGNoaXAyKGNoaXAyVGVuc29yUmFuZ2UpOwogICB0ZW5zb3IyLnNldFJhbmRvbSgpOwotICBjb25zdCBzaXplX3QgY2hpcDJUZW5zb3JCdWZmU2l6ZSA9dGVuc29yMi5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3RlbnNvcjIgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShjaGlwMlRlbnNvckJ1ZmZTaXplKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9jaGlwMiAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGNoaXAyVGVuc29yQnVmZlNpemUpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfdGVuc29yMihncHVfZGF0YV90ZW5zb3IyLCBjaGlwMlRlbnNvclJhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfY2hpcDIoZ3B1X2RhdGFfY2hpcDIsIGNoaXAyVGVuc29yUmFuZ2UpOworICBjb25zdCBzaXplX3QgY2hpcDJUZW5zb3JCdWZmU2l6ZSA9IHRlbnNvcjIuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3RlbnNvcjIgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGNoaXAyVGVuc29yQnVmZlNpemUpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX2NoaXAyID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShjaGlwMlRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV90ZW5zb3IyKGdwdV9kYXRhX3RlbnNvcjIsIGNoaXAyVGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfY2hpcDIoZ3B1X2RhdGFfY2hpcDIsIGNoaXAyVGVuc29yUmFuZ2UpOwogCiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV90ZW5zb3IyLCB0ZW5zb3IyLmRhdGEoKSwgY2hpcDJUZW5zb3JCdWZmU2l6ZSk7Ci0gIGdwdV9jaGlwMi5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDwwbD4oMGwpLnRlbXBsYXRlIGNoaXA8MWw+KDJsKSArIGdwdV90ZW5zb3IyOworICBncHVfY2hpcDIuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDwwbD4oMGwpLnRlbXBsYXRlIGNoaXA8MWw+KDJsKSArIGdwdV90ZW5zb3IyOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoY2hpcDIuZGF0YSgpLCBncHVfZGF0YV9jaGlwMiwgY2hpcDJUZW5zb3JCdWZmU2l6ZSk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplRGltMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplRGltNDsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNpemVEaW01OyArK2spIHsKLSAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSB0ZW5zb3IoMGwsaSwybCxqLGspICsgdGVuc29yMihpLGosayk7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChjaGlwMihpLGosayksIGV4cGVjdGVkKTsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSB0ZW5zb3IoMGwsIGksIDJsLCBqLCBrKSArIHRlbnNvcjIoaSwgaiwgayk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChjaGlwMihpLCBqLCBrKSwgZXhwZWN0ZWQpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMzk4LDkgKzM5MSw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfY2hpcF9hc19sdmFsdWVfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpCi17Ci0KK3N0YXRpYyB2b2lkIHRlc3RfY2hpcF9hc19sdmFsdWVfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gMjsKICAgSW5kZXhUeXBlIHNpemVEaW0yID0gMzsKICAgSW5kZXhUeXBlIHNpemVEaW0zID0gNTsKQEAgLTQxMCwyOCArNDAxLDI3IEBACiAgIGFycmF5PEluZGV4VHlwZSwgNT4gdGVuc29yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTMsIHNpemVEaW00LCBzaXplRGltNX19OwogICBhcnJheTxJbmRleFR5cGUsIDQ+IGlucHV0MlRlbnNvclJhbmdlID0ge3tzaXplRGltMiwgc2l6ZURpbTMsIHNpemVEaW00LCBzaXplRGltNX19OwogCi0gIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+IHRlbnNvcih0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+IGlucHV0MSh0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+IGlucHV0MihpbnB1dDJUZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiB0ZW5zb3IodGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW5wdXQxKHRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGlucHV0MihpbnB1dDJUZW5zb3JSYW5nZSk7CiAgIGlucHV0MS5zZXRSYW5kb20oKTsKICAgaW5wdXQyLnNldFJhbmRvbSgpOwogCisgIGNvbnN0IHNpemVfdCB0ZW5zb3JCdWZmU2l6ZSA9IHRlbnNvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBjb25zdCBzaXplX3QgaW5wdXQyVGVuc29yQnVmZlNpemUgPSBpbnB1dDIuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgc3RkOjpjb3V0IDw8IHRlbnNvckJ1ZmZTaXplIDw8ICIgLCAiIDw8IGlucHV0MlRlbnNvckJ1ZmZTaXplIDw8IHN0ZDo6ZW5kbDsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3RlbnNvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yQnVmZlNpemUpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX2lucHV0MSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yQnVmZlNpemUpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX2lucHV0MiA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5wdXQyVGVuc29yQnVmZlNpemUpKTsKIAotICBjb25zdCBzaXplX3QgdGVuc29yQnVmZlNpemUgPXRlbnNvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgY29uc3Qgc2l6ZV90IGlucHV0MlRlbnNvckJ1ZmZTaXplID1pbnB1dDIuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIHN0ZDo6Y291dCA8PCB0ZW5zb3JCdWZmU2l6ZSA8PCAiICwgIjw8ICBpbnB1dDJUZW5zb3JCdWZmU2l6ZSA8PCBzdGQ6OmVuZGw7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV90ZW5zb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JCdWZmU2l6ZSkpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfaW5wdXQxICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yQnVmZlNpemUpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX2lucHV0MiAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGlucHV0MlRlbnNvckJ1ZmZTaXplKSk7Ci0KLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfdGVuc29yKGdwdV9kYXRhX3RlbnNvciwgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9pbnB1dDEoZ3B1X2RhdGFfaW5wdXQxLCB0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X2lucHV0MihncHVfZGF0YV9pbnB1dDIsIGlucHV0MlRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3RlbnNvcihncHVfZGF0YV90ZW5zb3IsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2lucHV0MShncHVfZGF0YV9pbnB1dDEsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2lucHV0MihncHVfZGF0YV9pbnB1dDIsIGlucHV0MlRlbnNvclJhbmdlKTsKIAogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfaW5wdXQxLCBpbnB1dDEuZGF0YSgpLCB0ZW5zb3JCdWZmU2l6ZSk7Ci0gIGdwdV90ZW5zb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfaW5wdXQxOworICBncHVfdGVuc29yLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW5wdXQxOwogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfaW5wdXQyLCBpbnB1dDIuZGF0YSgpLCBpbnB1dDJUZW5zb3JCdWZmU2l6ZSk7Ci0gIGdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDwwbD4oMWwpLmRldmljZShzeWNsX2RldmljZSk9Z3B1X2lucHV0MjsKKyAgZ3B1X3RlbnNvci50ZW1wbGF0ZSBjaGlwPDBsPigxbCkuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbnB1dDI7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3IuZGF0YSgpLCBncHVfZGF0YV90ZW5zb3IsIHRlbnNvckJ1ZmZTaXplKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVEaW0xOyArK2kpIHsKQEAgLTQ0MCw5ICs0MzAsOSBAQAogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IHNpemVEaW00OyArK2wpIHsKICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IHNpemVEaW01OyArK20pIHsKICAgICAgICAgICAgIGlmIChpICE9IDEpIHsKLSAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsLG0pLCBpbnB1dDEoaSxqLGssbCxtKSk7CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCwgbSksIGlucHV0MShpLCBqLCBrLCBsLCBtKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0MihqLGssbCxtKSk7CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCwgbSksIGlucHV0MihqLCBrLCBsLCBtKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00NTAsMjggKzQ0MCwyOCBAQAogICAgIH0KICAgfQogCi0gIGdwdV90ZW5zb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfaW5wdXQxOworICBncHVfdGVuc29yLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW5wdXQxOwogICBhcnJheTxJbmRleFR5cGUsIDQ+IGlucHV0M1RlbnNvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTMsIHNpemVEaW00LCBzaXplRGltNX19OwotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBpbnB1dDMoaW5wdXQzVGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW5wdXQzKGlucHV0M1RlbnNvclJhbmdlKTsKICAgaW5wdXQzLnNldFJhbmRvbSgpOwogCi0gIGNvbnN0IHNpemVfdCBpbnB1dDNUZW5zb3JCdWZmU2l6ZSA9aW5wdXQzLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfaW5wdXQzICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5wdXQzVGVuc29yQnVmZlNpemUpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfaW5wdXQzKGdwdV9kYXRhX2lucHV0MywgaW5wdXQzVGVuc29yUmFuZ2UpOworICBjb25zdCBzaXplX3QgaW5wdXQzVGVuc29yQnVmZlNpemUgPSBpbnB1dDMuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX2lucHV0MyA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5wdXQzVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2lucHV0MyhncHVfZGF0YV9pbnB1dDMsIGlucHV0M1RlbnNvclJhbmdlKTsKIAogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfaW5wdXQzLCBpbnB1dDMuZGF0YSgpLCBpbnB1dDNUZW5zb3JCdWZmU2l6ZSk7Ci0gIGdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDwxbD4oMWwpLmRldmljZShzeWNsX2RldmljZSk9Z3B1X2lucHV0MzsKKyAgZ3B1X3RlbnNvci50ZW1wbGF0ZSBjaGlwPDFsPigxbCkuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbnB1dDM7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3IuZGF0YSgpLCBncHVfZGF0YV90ZW5zb3IsIHRlbnNvckJ1ZmZTaXplKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVEaW0xOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemVEaW0yOyArK2opIHsKLSAgICAgIGZvciAoaW50IGsgPSAwOyBrIDxzaXplRGltMzsgKytrKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNpemVEaW0zOyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBzaXplRGltNDsgKytsKSB7CiAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCBzaXplRGltNTsgKyttKSB7CiAgICAgICAgICAgICBpZiAoaiAhPSAxKSB7Ci0gICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCxtKSwgaW5wdXQxKGksaixrLGwsbSkpOworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwsIG0pLCBpbnB1dDEoaSwgaiwgaywgbCwgbSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsLG0pLCBpbnB1dDMoaSxrLGwsbSkpOworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwsIG0pLCBpbnB1dDMoaSwgaywgbCwgbSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDc5LDI4ICs0NjksMjggQEAKICAgICB9CiAgIH0KIAotICBncHVfdGVuc29yLmRldmljZShzeWNsX2RldmljZSk9Z3B1X2lucHV0MTsKKyAgZ3B1X3RlbnNvci5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2lucHV0MTsKICAgYXJyYXk8SW5kZXhUeXBlLCA0PiBpbnB1dDRUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEsIHNpemVEaW0yLCBzaXplRGltNCwgc2l6ZURpbTV9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gaW5wdXQ0KGlucHV0NFRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGlucHV0NChpbnB1dDRUZW5zb3JSYW5nZSk7CiAgIGlucHV0NC5zZXRSYW5kb20oKTsKIAotICBjb25zdCBzaXplX3QgaW5wdXQ0VGVuc29yQnVmZlNpemUgPWlucHV0NC5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX2lucHV0NCAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGlucHV0NFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X2lucHV0NChncHVfZGF0YV9pbnB1dDQsIGlucHV0NFRlbnNvclJhbmdlKTsKKyAgY29uc3Qgc2l6ZV90IGlucHV0NFRlbnNvckJ1ZmZTaXplID0gaW5wdXQ0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9pbnB1dDQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGlucHV0NFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9pbnB1dDQoZ3B1X2RhdGFfaW5wdXQ0LCBpbnB1dDRUZW5zb3JSYW5nZSk7CiAKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX2lucHV0NCwgaW5wdXQ0LmRhdGEoKSwgaW5wdXQ0VGVuc29yQnVmZlNpemUpOwotICBncHVfdGVuc29yLnRlbXBsYXRlIGNoaXA8Mmw+KDNsKS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9pbnB1dDQ7CisgIGdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDwybD4oM2wpLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW5wdXQ0OwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yLmRhdGEoKSwgZ3B1X2RhdGFfdGVuc29yLCB0ZW5zb3JCdWZmU2l6ZSk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplRGltMTsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplRGltMjsgKytqKSB7Ci0gICAgICBmb3IgKGludCBrID0gMDsgayA8c2l6ZURpbTM7ICsraykgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzaXplRGltMzsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgc2l6ZURpbTQ7ICsrbCkgewogICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgc2l6ZURpbTU7ICsrbSkgewogICAgICAgICAgICAgaWYgKGsgIT0gMykgewotICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0MShpLGosayxsLG0pKTsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsLCBtKSwgaW5wdXQxKGksIGosIGssIGwsIG0pKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCxtKSwgaW5wdXQ0KGksaixsLG0pKTsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsLCBtKSwgaW5wdXQ0KGksIGosIGwsIG0pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUwOCw1NiArNDk4LDU2IEBACiAgICAgfQogICB9CiAKLSAgZ3B1X3RlbnNvci5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9pbnB1dDE7CisgIGdwdV90ZW5zb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbnB1dDE7CiAgIGFycmF5PEluZGV4VHlwZSwgND4gaW5wdXQ1VGVuc29yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTMsIHNpemVEaW01fX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+IGlucHV0NShpbnB1dDVUZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBpbnB1dDUoaW5wdXQ1VGVuc29yUmFuZ2UpOwogICBpbnB1dDUuc2V0UmFuZG9tKCk7CiAKLSAgY29uc3Qgc2l6ZV90IGlucHV0NVRlbnNvckJ1ZmZTaXplID1pbnB1dDUuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9pbnB1dDUgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbnB1dDVUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9pbnB1dDUoZ3B1X2RhdGFfaW5wdXQ1LCBpbnB1dDVUZW5zb3JSYW5nZSk7CisgIGNvbnN0IHNpemVfdCBpbnB1dDVUZW5zb3JCdWZmU2l6ZSA9IGlucHV0NS5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfaW5wdXQ1ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbnB1dDVUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfaW5wdXQ1KGdwdV9kYXRhX2lucHV0NSwgaW5wdXQ1VGVuc29yUmFuZ2UpOwogCiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV9pbnB1dDUsIGlucHV0NS5kYXRhKCksIGlucHV0NVRlbnNvckJ1ZmZTaXplKTsKLSAgZ3B1X3RlbnNvci50ZW1wbGF0ZSBjaGlwPDNsPig0bCkuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfaW5wdXQ1OworICBncHVfdGVuc29yLnRlbXBsYXRlIGNoaXA8M2w+KDRsKS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2lucHV0NTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRlbnNvci5kYXRhKCksIGdwdV9kYXRhX3RlbnNvciwgdGVuc29yQnVmZlNpemUpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZURpbTE7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZURpbTI7ICsraikgewotICAgICAgZm9yIChpbnQgayA9IDA7IGsgPHNpemVEaW0zOyArK2spIHsKKyAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc2l6ZURpbTM7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IHNpemVEaW00OyArK2wpIHsKICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IHNpemVEaW01OyArK20pIHsKICAgICAgICAgICAgIGlmIChsICE9IDQpIHsKLSAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsLG0pLCBpbnB1dDEoaSxqLGssbCxtKSk7CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCwgbSksIGlucHV0MShpLCBqLCBrLCBsLCBtKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0NShpLGosayxtKSk7CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCwgbSksIGlucHV0NShpLCBqLCBrLCBtKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9Ci0gIGdwdV90ZW5zb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfaW5wdXQxOworICBncHVfdGVuc29yLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW5wdXQxOwogICBhcnJheTxJbmRleFR5cGUsIDQ+IGlucHV0NlRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNH19OwotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBpbnB1dDYoaW5wdXQ2VGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW5wdXQ2KGlucHV0NlRlbnNvclJhbmdlKTsKICAgaW5wdXQ2LnNldFJhbmRvbSgpOwogCi0gIGNvbnN0IHNpemVfdCBpbnB1dDZUZW5zb3JCdWZmU2l6ZSA9aW5wdXQ2LnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfaW5wdXQ2ICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5wdXQ2VGVuc29yQnVmZlNpemUpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfaW5wdXQ2KGdwdV9kYXRhX2lucHV0NiwgaW5wdXQ2VGVuc29yUmFuZ2UpOworICBjb25zdCBzaXplX3QgaW5wdXQ2VGVuc29yQnVmZlNpemUgPSBpbnB1dDYuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX2lucHV0NiA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5wdXQ2VGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2lucHV0NihncHVfZGF0YV9pbnB1dDYsIGlucHV0NlRlbnNvclJhbmdlKTsKIAogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfaW5wdXQ2LCBpbnB1dDYuZGF0YSgpLCBpbnB1dDZUZW5zb3JCdWZmU2l6ZSk7Ci0gIGdwdV90ZW5zb3IudGVtcGxhdGUgY2hpcDw0bD4oNWwpLmRldmljZShzeWNsX2RldmljZSk9Z3B1X2lucHV0NjsKKyAgZ3B1X3RlbnNvci50ZW1wbGF0ZSBjaGlwPDRsPig1bCkuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbnB1dDY7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3IuZGF0YSgpLCBncHVfZGF0YV90ZW5zb3IsIHRlbnNvckJ1ZmZTaXplKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVEaW0xOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemVEaW0yOyArK2opIHsKLSAgICAgIGZvciAoaW50IGsgPSAwOyBrIDxzaXplRGltMzsgKytrKSB7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNpemVEaW0zOyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBzaXplRGltNDsgKytsKSB7CiAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCBzaXplRGltNTsgKyttKSB7CiAgICAgICAgICAgICBpZiAobSAhPSA1KSB7Ci0gICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCxtKSwgaW5wdXQxKGksaixrLGwsbSkpOworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwsIG0pLCBpbnB1dDEoaSwgaiwgaywgbCwgbSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsLG0pLCBpbnB1dDYoaSxqLGssbCkpOworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwsIG0pLCBpbnB1dDYoaSwgaiwgaywgbCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTY1LDI3ICs1NTUsMjYgQEAKICAgICB9CiAgIH0KIAotCi0gIGdwdV90ZW5zb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfaW5wdXQxOwotICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBpbnB1dDcodGVuc29yUmFuZ2UpOworICBncHVfdGVuc29yLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW5wdXQxOworICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW5wdXQ3KHRlbnNvclJhbmdlKTsKICAgaW5wdXQ3LnNldFJhbmRvbSgpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YV9pbnB1dDcgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9pbnB1dDcoZ3B1X2RhdGFfaW5wdXQ3LCB0ZW5zb3JSYW5nZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9pbnB1dDcgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9pbnB1dDcoZ3B1X2RhdGFfaW5wdXQ3LCB0ZW5zb3JSYW5nZSk7CiAKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX2lucHV0NywgaW5wdXQ3LmRhdGEoKSwgdGVuc29yQnVmZlNpemUpOwotICBncHVfdGVuc29yLmNoaXAoMGwsMGwpLmRldmljZShzeWNsX2RldmljZSk9Z3B1X2lucHV0Ny5jaGlwKDBsLDBsKTsKKyAgZ3B1X3RlbnNvci5jaGlwKDBsLCAwbCkuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbnB1dDcuY2hpcCgwbCwgMGwpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yLmRhdGEoKSwgZ3B1X2RhdGFfdGVuc29yLCB0ZW5zb3JCdWZmU2l6ZSk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplRGltMTsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplRGltMjsgKytqKSB7Ci0gICAgICBmb3IgKGludCBrID0gMDsgayA8c2l6ZURpbTM7ICsraykgeworICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzaXplRGltMzsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgc2l6ZURpbTQ7ICsrbCkgewogICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgc2l6ZURpbTU7ICsrbSkgewogICAgICAgICAgICAgaWYgKGkgIT0gMCkgewotICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwsbSksIGlucHV0MShpLGosayxsLG0pKTsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsLCBtKSwgaW5wdXQxKGksIGosIGssIGwsIG0pKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCxtKSwgaW5wdXQ3KGksaixrLGwsbSkpOworICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwsIG0pLCBpbnB1dDcoaSwgaiwgaywgbCwgbSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjAwLDI0ICs1ODksMjMgQEAKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfZGF0YV9pbnB1dDUpOwogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9kYXRhX2lucHV0Nik7CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2RhdGFfaW5wdXQ3KTsKLQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgZGV2X1NlbGVjdG9yPiB2b2lkIHN5Y2xfY2hpcHBpbmdfdGVzdF9wZXJfZGV2aWNlKGRldl9TZWxlY3RvciBzKXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgZGV2X1NlbGVjdG9yPgordm9pZCBzeWNsX2NoaXBwaW5nX3Rlc3RfcGVyX2RldmljZShkZXZfU2VsZWN0b3IgcykgewogICBRdWV1ZUludGVyZmFjZSBxdWV1ZUludGVyZmFjZShzKTsKICAgYXV0byBzeWNsX2RldmljZSA9IEVpZ2VuOjpTeWNsRGV2aWNlKCZxdWV1ZUludGVyZmFjZSk7Ci0gLyogdGVzdF9zdGF0aWNfY2hpcF9zeWNsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwotICB0ZXN0X3N0YXRpY19jaGlwX3N5Y2w8RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7Ci0gIHRlc3RfZHluYW1pY19jaGlwX3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7Ci0gIHRlc3RfZHluYW1pY19jaGlwX3N5Y2w8RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7Ci0gIHRlc3RfY2hpcF9pbl9leHByPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwotICB0ZXN0X2NoaXBfaW5fZXhwcjxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsqLworICAvKiB0ZXN0X3N0YXRpY19jaGlwX3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CisgICB0ZXN0X3N0YXRpY19jaGlwX3N5Y2w8RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CisgICB0ZXN0X2R5bmFtaWNfY2hpcF9zeWNsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOworICAgdGVzdF9keW5hbWljX2NoaXBfc3ljbDxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKKyAgIHRlc3RfY2hpcF9pbl9leHByPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOworICAgdGVzdF9jaGlwX2luX2V4cHI8RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7Ki8KICAgdGVzdF9jaGlwX2FzX2x2YWx1ZV9zeWNsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwotIC8vIHRlc3RfY2hpcF9hc19sdmFsdWVfc3ljbDxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKKyAgLy8gdGVzdF9jaGlwX2FzX2x2YWx1ZV9zeWNsPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogfQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9jaGlwcGluZ19zeWNsKQotewotICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6RWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfY2hpcHBpbmdfc3ljbCkgeworICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IEVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CiAgICAgQ0FMTF9TVUJURVNUKHN5Y2xfY2hpcHBpbmdfdGVzdF9wZXJfZGV2aWNlPGZsb2F0PihkZXZpY2UpKTsKICAgICBDQUxMX1NVQlRFU1Qoc3ljbF9jaGlwcGluZ190ZXN0X3Blcl9kZXZpY2U8aGFsZj4oZGV2aWNlKSk7CiAgIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbXBhcmlzb25zLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbXBhcmlzb25zLmNwcAppbmRleCBlMGJkOTBkLi4zNTY1YjYyIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb21wYXJpc29ucy5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29tcGFyaXNvbnMuY3BwCkBAIC0xMSw4ICsxMSw4IEBACiAKICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CiAKLXVzaW5nIEVpZ2VuOjpUZW5zb3I7CiB1c2luZyBFaWdlbjo6Um93TWFqb3I7Cit1c2luZyBFaWdlbjo6VGVuc29yOwogCiB1c2luZyBTY2FsYXIgPSBmbG9hdDsKIApAQCAtMjMsMTggKzIzLDE3IEBACiB1c2luZyBUeXBlZEVRT3AgPSBpbnRlcm5hbDo6c2NhbGFyX2NtcF9vcDxTY2FsYXIsIFNjYWxhciwgaW50ZXJuYWw6OmNtcF9FUSwgdHJ1ZT47CiB1c2luZyBUeXBlZE5FT3AgPSBpbnRlcm5hbDo6c2NhbGFyX2NtcF9vcDxTY2FsYXIsIFNjYWxhciwgaW50ZXJuYWw6OmNtcF9ORVEsIHRydWU+OwogCi1zdGF0aWMgdm9pZCB0ZXN0X29yZGVyaW5ncygpCi17Ci0gIFRlbnNvcjxTY2FsYXIsIDM+IG1hdDEoMiwzLDcpOwotICBUZW5zb3I8U2NhbGFyLCAzPiBtYXQyKDIsMyw3KTsKK3N0YXRpYyB2b2lkIHRlc3Rfb3JkZXJpbmdzKCkgeworICBUZW5zb3I8U2NhbGFyLCAzPiBtYXQxKDIsIDMsIDcpOworICBUZW5zb3I8U2NhbGFyLCAzPiBtYXQyKDIsIDMsIDcpOwogCiAgIG1hdDEuc2V0UmFuZG9tKCk7CiAgIG1hdDIuc2V0UmFuZG9tKCk7CiAKLSAgVGVuc29yPGJvb2wsIDM+IGx0KDIsMyw3KTsKLSAgVGVuc29yPGJvb2wsIDM+IGxlKDIsMyw3KTsKLSAgVGVuc29yPGJvb2wsIDM+IGd0KDIsMyw3KTsKLSAgVGVuc29yPGJvb2wsIDM+IGdlKDIsMyw3KTsKKyAgVGVuc29yPGJvb2wsIDM+IGx0KDIsIDMsIDcpOworICBUZW5zb3I8Ym9vbCwgMz4gbGUoMiwgMywgNyk7CisgIFRlbnNvcjxib29sLCAzPiBndCgyLCAzLCA3KTsKKyAgVGVuc29yPGJvb2wsIDM+IGdlKDIsIDMsIDcpOwogCiAgIFRlbnNvcjxTY2FsYXIsIDM+IHR5cGVkX2x0KDIsIDMsIDcpOwogICBUZW5zb3I8U2NhbGFyLCAzPiB0eXBlZF9sZSgyLCAzLCA3KTsKQEAgLTU0LDEwICs1MywxMCBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwobHQoaSxqLGspLCBtYXQxKGksaixrKSA8IG1hdDIoaSxqLGspKTsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxlKGksaixrKSwgbWF0MShpLGosaykgPD0gbWF0MihpLGosaykpOwotICAgICAgICBWRVJJRllfSVNfRVFVQUwoZ3QoaSxqLGspLCBtYXQxKGksaixrKSA+IG1hdDIoaSxqLGspKTsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGdlKGksaixrKSwgbWF0MShpLGosaykgPj0gbWF0MihpLGosaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwobHQoaSwgaiwgayksIG1hdDEoaSwgaiwgaykgPCBtYXQyKGksIGosIGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxlKGksIGosIGspLCBtYXQxKGksIGosIGspIDw9IG1hdDIoaSwgaiwgaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwoZ3QoaSwgaiwgayksIG1hdDEoaSwgaiwgaykgPiBtYXQyKGksIGosIGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGdlKGksIGosIGspLCBtYXQxKGksIGosIGspID49IG1hdDIoaSwgaiwgaykpOwogCiAgICAgICAgIFZFUklGWV9JU19FUVVBTChsdChpLCBqLCBrKSwgKGJvb2wpdHlwZWRfbHQoaSwgaiwgaykpOwogICAgICAgICBWRVJJRllfSVNfRVFVQUwobGUoaSwgaiwgayksIChib29sKXR5cGVkX2xlKGksIGosIGspKTsKQEAgLTY4LDExICs2Nyw5IEBACiAgIH0KIH0KIAotCi1zdGF0aWMgdm9pZCB0ZXN0X2VxdWFsaXR5KCkKLXsKLSAgVGVuc29yPFNjYWxhciwgMz4gbWF0MSgyLDMsNyk7Ci0gIFRlbnNvcjxTY2FsYXIsIDM+IG1hdDIoMiwzLDcpOworc3RhdGljIHZvaWQgdGVzdF9lcXVhbGl0eSgpIHsKKyAgVGVuc29yPFNjYWxhciwgMz4gbWF0MSgyLCAzLCA3KTsKKyAgVGVuc29yPFNjYWxhciwgMz4gbWF0MigyLCAzLCA3KTsKIAogICBtYXQxLnNldFJhbmRvbSgpOwogICBtYXQyLnNldFJhbmRvbSgpOwpAQCAtODAsMTQgKzc3LDE0IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CiAgICAgICAgIGlmIChpbnRlcm5hbDo6cmFuZG9tPGJvb2w+KCkpIHsKLSAgICAgICAgICBtYXQyKGksaixrKSA9IG1hdDEoaSxqLGspOworICAgICAgICAgIG1hdDIoaSwgaiwgaykgPSBtYXQxKGksIGosIGspOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgVGVuc29yPGJvb2wsIDM+IGVxKDIsMyw3KTsKLSAgVGVuc29yPGJvb2wsIDM+IG5lKDIsMyw3KTsKKyAgVGVuc29yPGJvb2wsIDM+IGVxKDIsIDMsIDcpOworICBUZW5zb3I8Ym9vbCwgMz4gbmUoMiwgMywgNyk7CiAKICAgVGVuc29yPFNjYWxhciwgMz4gdHlwZWRfZXEoMiwgMywgNyk7CiAgIFRlbnNvcjxTY2FsYXIsIDM+IHR5cGVkX25lKDIsIDMsIDcpOwpAQCAtMTAxLDQ2ICs5OCw0MSBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwoZXEoaSxqLGspLCBtYXQxKGksaixrKSA9PSBtYXQyKGksaixrKSk7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChuZShpLGosayksIG1hdDEoaSxqLGspICE9IG1hdDIoaSxqLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGVxKGksIGosIGspLCBtYXQxKGksIGosIGspID09IG1hdDIoaSwgaiwgaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwobmUoaSwgaiwgayksIG1hdDEoaSwgaiwgaykgIT0gbWF0MihpLCBqLCBrKSk7CiAKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGVxKGksIGosIGspLCAoYm9vbCl0eXBlZF9lcShpLGosaykpOwotICAgICAgICBWRVJJRllfSVNfRVFVQUwobmUoaSwgaiwgayksIChib29sKXR5cGVkX25lKGksaixrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChlcShpLCBqLCBrKSwgKGJvb2wpdHlwZWRfZXEoaSwgaiwgaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwobmUoaSwgaiwgayksIChib29sKXR5cGVkX25lKGksIGosIGspKTsKICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotCi0KLXN0YXRpYyB2b2lkIHRlc3RfaXNuYW4oKQotewotICBUZW5zb3I8U2NhbGFyLCAzPiBtYXQoMiwzLDcpOworc3RhdGljIHZvaWQgdGVzdF9pc25hbigpIHsKKyAgVGVuc29yPFNjYWxhciwgMz4gbWF0KDIsIDMsIDcpOwogCiAgIG1hdC5zZXRSYW5kb20oKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKICAgICAgICAgaWYgKGludGVybmFsOjpyYW5kb208Ym9vbD4oKSkgewotICAgICAgICAgIG1hdChpLGosaykgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOworICAgICAgICAgIG1hdChpLCBqLCBrKSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6cXVpZXRfTmFOKCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KLSAgVGVuc29yPGJvb2wsIDM+IG5hbigyLDMsNyk7CisgIFRlbnNvcjxib29sLCAzPiBuYW4oMiwgMywgNyk7CiAgIG5hbiA9IChtYXQuaXNuYW4pKCk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChuYW4oaSxqLGspLCAoc3RkOjppc25hbikobWF0KGksaixrKSkpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwobmFuKGksIGosIGspLCAoc3RkOjppc25hbikobWF0KGksIGosIGspKSk7CiAgICAgICB9CiAgICAgfQogICB9Ci0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9jb21wYXJpc29ucykKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfY29tcGFyaXNvbnMpIHsKICAgQ0FMTF9TVUJURVNUKHRlc3Rfb3JkZXJpbmdzKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9lcXVhbGl0eSgpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfaXNuYW4oKSk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb21wbGV4X2N3aXNlX29wc19ncHUuY3UgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb21wbGV4X2N3aXNlX29wc19ncHUuY3UKaW5kZXggOTk0NDdiMi4uNmRhYTBhNyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29tcGxleF9jd2lzZV9vcHNfZ3B1LmN1CisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbXBsZXhfY3dpc2Vfb3BzX2dwdS5jdQpAQCAtMTYsNyArMTYsNyBAQAogCiB1c2luZyBFaWdlbjo6VGVuc29yOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiB2b2lkIHRlc3RfY3VkYV9jb21wbGV4X2N3aXNlX29wcygpIHsKICAgY29uc3QgaW50IGtOdW1JdGVtcyA9IDI7CiAgIHN0ZDo6c2l6ZV90IGNvbXBsZXhfYnl0ZXMgPSBrTnVtSXRlbXMgKiBzaXplb2Yoc3RkOjpjb21wbGV4PFQ+KTsKQEAgLTMxLDEyICszMSw5IEBACiAgIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOwogICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CiAKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPHN0ZDo6Y29tcGxleDxUPiwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9pbjEoCi0gICAgICBkX2luMSwga051bUl0ZW1zKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPHN0ZDo6Y29tcGxleDxUPiwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9pbjIoCi0gICAgICBkX2luMiwga051bUl0ZW1zKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPHN0ZDo6Y29tcGxleDxUPiwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9vdXQoCi0gICAgICBkX291dCwga051bUl0ZW1zKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPHN0ZDo6Y29tcGxleDxUPiwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9pbjEoZF9pbjEsIGtOdW1JdGVtcyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxzdGQ6OmNvbXBsZXg8VD4sIDEsIDAsIGludD4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfaW4yKGRfaW4yLCBrTnVtSXRlbXMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8c3RkOjpjb21wbGV4PFQ+LCAxLCAwLCBpbnQ+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X291dChkX291dCwga051bUl0ZW1zKTsKIAogICBjb25zdCBzdGQ6OmNvbXBsZXg8VD4gYSgzLjE0ZiwgMi43Zik7CiAgIGNvbnN0IHN0ZDo6Y29tcGxleDxUPiBiKC0xMC42ZiwgMS40Zik7CkBAIC00NCwxNCArNDEsNyBAQAogICBncHVfaW4xLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbjEuY29uc3RhbnQoYSk7CiAgIGdwdV9pbjIuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luMi5jb25zdGFudChiKTsKIAotICBlbnVtIEN3aXNlT3AgewotICAgIEFkZCA9IDAsCi0gICAgU3ViLAotICAgIE11bCwKLSAgICBEaXYsCi0gICAgTmVnLAotICAgIE5iT3BzCi0gIH07CisgIGVudW0gQ3dpc2VPcCB7IEFkZCA9IDAsIFN1YiwgTXVsLCBEaXYsIE5lZywgTmJPcHMgfTsKIAogICBUZW5zb3I8c3RkOjpjb21wbGV4PFQ+LCAxLCAwLCBpbnQ+IGFjdHVhbChrTnVtSXRlbXMpOwogICBmb3IgKGludCBvcCA9IEFkZDsgb3AgPCBOYk9wczsgb3ArKykgewpAQCAtODAsOCArNzAsOCBAQAogICAgICAgY2FzZSBOYk9wczoKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIGFzc2VydChjdWRhTWVtY3B5QXN5bmMoYWN0dWFsLmRhdGEoKSwgZF9vdXQsIGNvbXBsZXhfYnl0ZXMsIGN1ZGFNZW1jcHlEZXZpY2VUb0hvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisgICAgYXNzZXJ0KGN1ZGFNZW1jcHlBc3luYyhhY3R1YWwuZGF0YSgpLCBkX291dCwgY29tcGxleF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0KKyAgICAgICAgICAgY3VkYVN1Y2Nlc3MpOwogICAgIGFzc2VydChjdWRhU3RyZWFtU3luY2hyb25pemUoZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gY3VkYVN1Y2Nlc3MpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtSXRlbXM7ICsraSkgewpAQCAtOTQsOSArODQsNyBAQAogICBjdWRhRnJlZShkX291dCk7CiB9CiAKLQotRUlHRU5fREVDTEFSRV9URVNUKHRlc3RfY3h4MTFfdGVuc29yX2NvbXBsZXhfY3dpc2Vfb3BzKQoteworRUlHRU5fREVDTEFSRV9URVNUKHRlc3RfY3h4MTFfdGVuc29yX2NvbXBsZXhfY3dpc2Vfb3BzKSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2N1ZGFfY29tcGxleF9jd2lzZV9vcHM8ZmxvYXQ+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9jdWRhX2NvbXBsZXhfY3dpc2Vfb3BzPGRvdWJsZT4oKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb21wbGV4X2dwdS5jdSBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbXBsZXhfZ3B1LmN1CmluZGV4IGY4YjhhZTcuLjEyZjExZTAgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbXBsZXhfZ3B1LmN1CisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbXBsZXhfZ3B1LmN1CkBAIC0zNywxMiArMzcsOSBAQAogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCAwLCBpbnQ+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2luMSgKLSAgICAgIGRfaW4xLCAyKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDEsIDAsIGludD4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfaW4yKAotICAgICAgZF9pbjIsIDIpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDEsIDAsIGludD4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfb3V0MigKLSAgICAgIGRfb3V0MiwgMik7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCAwLCBpbnQ+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2luMShkX2luMSwgMik7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCAwLCBpbnQ+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2luMihkX2luMiwgMik7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9vdXQyKGRfb3V0MiwgMik7CiAKICAgZ3B1X2luMS5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW4xLmNvbnN0YW50KHN0ZDo6Y29tcGxleDxmbG9hdD4oMy4xNGYsIDIuN2YpKTsKICAgZ3B1X291dDIuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luMi5hYnMoKTsKQEAgLTUwLDEwICs0Nyw5IEBACiAgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCAwLCBpbnQ+IG5ldzEoMik7CiAgIFRlbnNvcjxmbG9hdCwgMSwgMCwgaW50PiBuZXcyKDIpOwogCi0gIGFzc2VydChjdWRhTWVtY3B5QXN5bmMobmV3MS5kYXRhKCksIGRfaW4xLCBjb21wbGV4X2J5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGN1ZGFTdWNjZXNzKTsKLSAgYXNzZXJ0KGN1ZGFNZW1jcHlBc3luYyhuZXcyLmRhdGEoKSwgZF9vdXQyLCBmbG9hdF9ieXRlcywgY3VkYU1lbWNweURldmljZVRvSG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CisgIGFzc2VydChjdWRhTWVtY3B5QXN5bmMobmV3MS5kYXRhKCksIGRfaW4xLCBjb21wbGV4X2J5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LCBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PQorICAgICAgICAgY3VkYVN1Y2Nlc3MpOworICBhc3NlcnQoY3VkYU1lbWNweUFzeW5jKG5ldzIuZGF0YSgpLCBkX291dDIsIGZsb2F0X2J5dGVzLCBjdWRhTWVtY3B5RGV2aWNlVG9Ib3N0LCBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CiAKICAgYXNzZXJ0KGN1ZGFTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBjdWRhU3VjY2Vzcyk7CiAKQEAgLTY3LDE0ICs2MywxMiBAQAogICBjdWRhRnJlZShkX291dDIpOwogfQogCi0KIHN0YXRpYyB2b2lkIHRlc3RfY3VkYV9zdW1fcmVkdWN0aW9ucygpIHsKLQogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCi0gIGNvbnN0IGludCBudW1fcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxMDI0LCA1KjEwMjQpOwotICBjb25zdCBpbnQgbnVtX2NvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAyNCwgNSoxMDI0KTsKKyAgY29uc3QgaW50IG51bV9yb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwMjQsIDUgKiAxMDI0KTsKKyAgY29uc3QgaW50IG51bV9jb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwMjQsIDUgKiAxMDI0KTsKIAogICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMj4gaW4obnVtX3Jvd3MsIG51bV9jb2xzKTsKICAgaW4uc2V0UmFuZG9tKCk7CkBAIC0xMDUsMTIgKzk5LDExIEBACiB9CiAKIHN0YXRpYyB2b2lkIHRlc3RfY3VkYV9tZWFuX3JlZHVjdGlvbnMoKSB7Ci0KICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKIAotICBjb25zdCBpbnQgbnVtX3Jvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAyNCwgNSoxMDI0KTsKLSAgY29uc3QgaW50IG51bV9jb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwMjQsIDUqMTAyNCk7CisgIGNvbnN0IGludCBudW1fcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxMDI0LCA1ICogMTAyNCk7CisgIGNvbnN0IGludCBudW1fY29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxMDI0LCA1ICogMTAyNCk7CiAKICAgVGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDI+IGluKG51bV9yb3dzLCBudW1fY29scyk7CiAgIGluLnNldFJhbmRvbSgpOwpAQCAtMTQxLDEyICsxMzQsMTEgQEAKIH0KIAogc3RhdGljIHZvaWQgdGVzdF9jdWRhX3Byb2R1Y3RfcmVkdWN0aW9ucygpIHsKLQogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCi0gIGNvbnN0IGludCBudW1fcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxMDI0LCA1KjEwMjQpOwotICBjb25zdCBpbnQgbnVtX2NvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAyNCwgNSoxMDI0KTsKKyAgY29uc3QgaW50IG51bV9yb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwMjQsIDUgKiAxMDI0KTsKKyAgY29uc3QgaW50IG51bV9jb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwMjQsIDUgKiAxMDI0KTsKIAogICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMj4gaW4obnVtX3Jvd3MsIG51bV9jb2xzKTsKICAgaW4uc2V0UmFuZG9tKCk7CkBAIC0xNzYsOSArMTY4LDcgQEAKICAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGdwdV9vdXRfcHRyKTsKIH0KIAotCi1FSUdFTl9ERUNMQVJFX1RFU1QodGVzdF9jeHgxMV90ZW5zb3JfY29tcGxleCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVCh0ZXN0X2N4eDExX3RlbnNvcl9jb21wbGV4KSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2N1ZGFfbnVsbGFyeSgpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfY3VkYV9zdW1fcmVkdWN0aW9ucygpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfY3VkYV9tZWFuX3JlZHVjdGlvbnMoKSk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb25jYXRlbmF0aW9uLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbmNhdGVuYXRpb24uY3BwCmluZGV4IGJiOTQxOGQuLmNlNzg4OTIgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbmNhdGVuYXRpb24uY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbmNhdGVuYXRpb24uY3BwCkBAIC0xMyw5ICsxMyw4IEBACiAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9kaW1lbnNpb25fZmFpbHVyZXMoKQotewordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9kaW1lbnNpb25fZmFpbHVyZXMoKSB7CiAgIFRlbnNvcjxpbnQsIDMsIERhdGFMYXlvdXQ+IGxlZnQoMiwgMywgMSk7CiAgIFRlbnNvcjxpbnQsIDMsIERhdGFMYXlvdXQ+IHJpZ2h0KDMsIDMsIDEpOwogICBsZWZ0LnNldFJhbmRvbSgpOwpAQCAtMzMsOSArMzIsOCBAQAogICBWRVJJRllfUkFJU0VTX0FTU0VSVChjb25jYXRlbmF0aW9uID0gbGVmdC5jb25jYXRlbmF0ZShyaWdodCwgLTEpKTsKIH0KIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X3N0YXRpY19kaW1lbnNpb25fZmFpbHVyZSgpCi17Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3N0YXRpY19kaW1lbnNpb25fZmFpbHVyZSgpIHsKICAgVGVuc29yPGludCwgMiwgRGF0YUxheW91dD4gbGVmdCgyLCAzKTsKICAgVGVuc29yPGludCwgMywgRGF0YUxheW91dD4gcmlnaHQoMiwgMywgMSk7CiAKQEAgLTQ2LDIyICs0NCwxOCBAQAogI2VuZGlmCiAKICAgLy8gVGhpcyBjYW4gYmUgd29ya2VkIGFyb3VuZCBpbiB0aGlzIGNhc2UuCi0gIFRlbnNvcjxpbnQsIDMsIERhdGFMYXlvdXQ+IGNvbmNhdGVuYXRpb24gPSBsZWZ0Ci0gICAgICAucmVzaGFwZShUZW5zb3I8aW50LCAzPjo6RGltZW5zaW9ucygyLCAzLCAxKSkKLSAgICAgIC5jb25jYXRlbmF0ZShyaWdodCwgMCk7CisgIFRlbnNvcjxpbnQsIDMsIERhdGFMYXlvdXQ+IGNvbmNhdGVuYXRpb24gPSBsZWZ0LnJlc2hhcGUoVGVuc29yPGludCwgMz46OkRpbWVuc2lvbnMoMiwgMywgMSkpLmNvbmNhdGVuYXRlKHJpZ2h0LCAwKTsKICAgVGVuc29yPGludCwgMiwgRGF0YUxheW91dD4gYWx0ZXJuYXRpdmUgPSBsZWZ0Ci0gICAvLyBDbGFuZyBjb21waWxlciBicmVhayB3aXRoIHt7e319fSB3aXRoIGFuIGFtYmlndW91cyBlcnJvciBvbiBjb3B5IGNvbnN0cnVjdG9yCi0gIC8vIHRoZSB2YXJpYWRpYyBEU2l6ZSBjb25zdHJ1Y3RvciBhZGRlZCBmb3IgI2lmbmRlZiBFSUdFTl9FTVVMQVRFX0NYWDExX01FVEFfSC4KLSAgLy8gU29sdXRpb246Ci0gIC8vIGVpdGhlciB0aGUgY29kZSBzaG91bGQgY2hhbmdlIHRvIAotICAvLyAgVGVuc29yPGludCwgMj46OkRpbWVuc2lvbnN7ezIsIDN9fQotICAvLyBvciBUZW5zb3I8aW50LCAyPjo6RGltZW5zaW9uc3tUZW5zb3I8aW50LCAyPjo6RGltZW5zaW9uc3t7MiwgM319fQotICAgICAgLmNvbmNhdGVuYXRlKHJpZ2h0LnJlc2hhcGUoVGVuc29yPGludCwgMj46OkRpbWVuc2lvbnMoMiwgMykpLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhbmcgY29tcGlsZXIgYnJlYWsgd2l0aCB7e3t9fX0gd2l0aCBhbiBhbWJpZ3VvdXMgZXJyb3Igb24gY29weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3RvciB0aGUgdmFyaWFkaWMgRFNpemUgY29uc3RydWN0b3IgYWRkZWQgZm9yICNpZm5kZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRUlHRU5fRU1VTEFURV9DWFgxMV9NRVRBX0guIFNvbHV0aW9uOiBlaXRoZXIgdGhlIGNvZGUgc2hvdWxkIGNoYW5nZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgVGVuc29yPGludCwgMj46OkRpbWVuc2lvbnN7ezIsIDN9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBUZW5zb3I8aW50LCAyPjo6RGltZW5zaW9uc3tUZW5zb3I8aW50LCAyPjo6RGltZW5zaW9uc3t7MiwgM319fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0ZW5hdGUocmlnaHQucmVzaGFwZShUZW5zb3I8aW50LCAyPjo6RGltZW5zaW9ucygyLCAzKSksIDApOwogfQogCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2NvbmNhdGVuYXRpb24oKQotewordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfY29uY2F0ZW5hdGlvbigpIHsKICAgVGVuc29yPGludCwgMywgRGF0YUxheW91dD4gbGVmdCgyLCAzLCAxKTsKICAgVGVuc29yPGludCwgMywgRGF0YUxheW91dD4gcmlnaHQoMiwgMywgMSk7CiAgIGxlZnQuc2V0UmFuZG9tKCk7CkBAIC0xMDUsMTIgKzk5LDEwIEBACiAgIH0KIH0KIAotCiAvLyBUT0RPKHBobGkpOiBBZGQgdGVzdCBvbmNlIHdlIGhhdmUgYSByZWFsIHZlY3Rvcml6ZWQgaW1wbGVtZW50YXRpb24uCiAvLyBzdGF0aWMgdm9pZCB0ZXN0X3ZlY3Rvcml6ZWRfY29uY2F0ZW5hdGlvbigpIHt9CiAKLXN0YXRpYyB2b2lkIHRlc3RfY29uY2F0ZW5hdGlvbl9hc19sdmFsdWUoKQoteworc3RhdGljIHZvaWQgdGVzdF9jb25jYXRlbmF0aW9uX2FzX2x2YWx1ZSgpIHsKICAgVGVuc29yPGludCwgMj4gdDEoMiwgMyk7CiAgIFRlbnNvcjxpbnQsIDI+IHQyKDIsIDMpOwogICB0MS5zZXRSYW5kb20oKTsKQEAgLTEyMywyMSArMTE1LDE4IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIFZFUklGWV9JU19FUVVBTCh0MShpLCBqKSwgcmVzdWx0KGksIGopKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTCh0MihpLCBqKSwgcmVzdWx0KGkrMiwgaikpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHQyKGksIGopLCByZXN1bHQoaSArIDIsIGopKTsKICAgICB9CiAgIH0KIH0KIAotCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2NvbmNhdGVuYXRpb24pCi17Ci0gICBDQUxMX1NVQlRFU1QodGVzdF9kaW1lbnNpb25fZmFpbHVyZXM8Q29sTWFqb3I+KCkpOwotICAgQ0FMTF9TVUJURVNUKHRlc3RfZGltZW5zaW9uX2ZhaWx1cmVzPFJvd01ham9yPigpKTsKLSAgIENBTExfU1VCVEVTVCh0ZXN0X3N0YXRpY19kaW1lbnNpb25fZmFpbHVyZTxDb2xNYWpvcj4oKSk7Ci0gICBDQUxMX1NVQlRFU1QodGVzdF9zdGF0aWNfZGltZW5zaW9uX2ZhaWx1cmU8Um93TWFqb3I+KCkpOwotICAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX2NvbmNhdGVuYXRpb248Q29sTWFqb3I+KCkpOwotICAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX2NvbmNhdGVuYXRpb248Um93TWFqb3I+KCkpOwotICAgLy8gQ0FMTF9TVUJURVNUKHRlc3RfdmVjdG9yaXplZF9jb25jYXRlbmF0aW9uKCkpOwotICAgQ0FMTF9TVUJURVNUKHRlc3RfY29uY2F0ZW5hdGlvbl9hc19sdmFsdWUoKSk7Ci0KK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfY29uY2F0ZW5hdGlvbikgeworICBDQUxMX1NVQlRFU1QodGVzdF9kaW1lbnNpb25fZmFpbHVyZXM8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9kaW1lbnNpb25fZmFpbHVyZXM8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zdGF0aWNfZGltZW5zaW9uX2ZhaWx1cmU8Q29sTWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zdGF0aWNfZGltZW5zaW9uX2ZhaWx1cmU8Um93TWFqb3I+KCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfY29uY2F0ZW5hdGlvbjxDb2xNYWpvcj4oKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9jb25jYXRlbmF0aW9uPFJvd01ham9yPigpKTsKKyAgLy8gQ0FMTF9TVUJURVNUKHRlc3RfdmVjdG9yaXplZF9jb25jYXRlbmF0aW9uKCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9jb25jYXRlbmF0aW9uX2FzX2x2YWx1ZSgpKTsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbmNhdGVuYXRpb25fc3ljbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb25jYXRlbmF0aW9uX3N5Y2wuY3BwCmluZGV4IDE4ZGM5NWIuLmZjY2YxNjUgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbmNhdGVuYXRpb25fc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29uY2F0ZW5hdGlvbl9zeWNsLmNwcApAQCAtMjIsOSArMjIsOCBAQAogCiB1c2luZyBFaWdlbjo6VGVuc29yOwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2NvbmNhdGVuYXRpb24oY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQotewordGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgorc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfY29uY2F0ZW5hdGlvbihjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIGxlZnREaW0xID0gMjsKICAgSW5kZXhUeXBlIGxlZnREaW0yID0gMzsKICAgSW5kZXhUeXBlIGxlZnREaW0zID0gMTsKQEAgLTM0LDMxICszMywzNiBAQAogICBJbmRleFR5cGUgcmlnaHREaW0zID0gMTsKICAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMz4gcmlnaHRSYW5nZSA9IHt7cmlnaHREaW0xLCByaWdodERpbTIsIHJpZ2h0RGltM319OwogCi0gIC8vSW5kZXhUeXBlIGNvbmNhdERpbTEgPSAzOwotLy8JSW5kZXhUeXBlIGNvbmNhdERpbTIgPSAzOwotLy8JSW5kZXhUeXBlIGNvbmNhdERpbTMgPSAxOwotICAvL0VpZ2VuOjphcnJheTxJbmRleFR5cGUsIDM+IGNvbmNhdFJhbmdlID0ge3tjb25jYXREaW0xLCBjb25jYXREaW0yLCBjb25jYXREaW0zfX07CisgIC8vIEluZGV4VHlwZSBjb25jYXREaW0xID0gMzsKKyAgLy8JSW5kZXhUeXBlIGNvbmNhdERpbTIgPSAzOworICAvLwlJbmRleFR5cGUgY29uY2F0RGltMyA9IDE7CisgIC8vIEVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDM+IGNvbmNhdFJhbmdlID0ge3tjb25jYXREaW0xLCBjb25jYXREaW0yLCBjb25jYXREaW0zfX07CiAKICAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGxlZnQobGVmdFJhbmdlKTsKICAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHJpZ2h0KHJpZ2h0UmFuZ2UpOwogICBsZWZ0LnNldFJhbmRvbSgpOwogICByaWdodC5zZXRSYW5kb20oKTsKIAotICBEYXRhVHlwZSAqIGdwdV9pbjFfZGF0YSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGxlZnQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUgKiBncHVfaW4yX2RhdGEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyaWdodC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2luMV9kYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobGVmdC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW4yX2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyaWdodC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAKICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfaW4xKGdwdV9pbjFfZGF0YSwgbGVmdFJhbmdlKTsKICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfaW4yKGdwdV9pbjJfZGF0YSwgcmlnaHRSYW5nZSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW4xX2RhdGEsIGxlZnQuZGF0YSgpLChsZWZ0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW4yX2RhdGEsIHJpZ2h0LmRhdGEoKSwocmlnaHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjFfZGF0YSwgbGVmdC5kYXRhKCksIChsZWZ0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjJfZGF0YSwgcmlnaHQuZGF0YSgpLCAocmlnaHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICAvLy8KLSAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGNvbmNhdGVuYXRpb24xKGxlZnREaW0xK3JpZ2h0RGltMSwgbGVmdERpbTIsIGxlZnREaW0zKTsKLSAgRGF0YVR5cGUgKiBncHVfb3V0X2RhdGExID0gIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY29uY2F0ZW5hdGlvbjEuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfb3V0MShncHVfb3V0X2RhdGExLCBjb25jYXRlbmF0aW9uMS5kaW1lbnNpb25zKCkpOworICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gY29uY2F0ZW5hdGlvbjEobGVmdERpbTEgKyByaWdodERpbTEsIGxlZnREaW0yLCBsZWZ0RGltMyk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGExID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY29uY2F0ZW5hdGlvbjEuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9vdXQxKGdwdV9vdXRfZGF0YTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0ZW5hdGlvbjEuZGltZW5zaW9ucygpKTsKIAotICAvL2NvbmNhdGVuYXRpb24gPSBsZWZ0LmNvbmNhdGVuYXRlKHJpZ2h0LCAwKTsKLSAgZ3B1X291dDEuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9Z3B1X2luMS5jb25jYXRlbmF0ZShncHVfaW4yLCAwKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGNvbmNhdGVuYXRpb24xLmRhdGEoKSwgZ3B1X291dF9kYXRhMSwoY29uY2F0ZW5hdGlvbjEuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgLy8gY29uY2F0ZW5hdGlvbiA9IGxlZnQuY29uY2F0ZW5hdGUocmlnaHQsIDApOworICBncHVfb3V0MS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2luMS5jb25jYXRlbmF0ZShncHVfaW4yLCAwKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGNvbmNhdGVuYXRpb24xLmRhdGEoKSwgZ3B1X291dF9kYXRhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXRlbmF0aW9uMS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGNvbmNhdGVuYXRpb24xLmRpbWVuc2lvbigwKSwgNCk7CiAgIFZFUklGWV9JU19FUVVBTChjb25jYXRlbmF0aW9uMS5kaW1lbnNpb24oMSksIDMpOwpAQCAtNzMsMTMgKzc3LDE2IEBACiAgIH0KIAogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9vdXRfZGF0YTEpOwotICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gY29uY2F0ZW5hdGlvbjIobGVmdERpbTEsIGxlZnREaW0yICtyaWdodERpbTIsIGxlZnREaW0zKTsKLSAgRGF0YVR5cGUgKiBncHVfb3V0X2RhdGEyID0gIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY29uY2F0ZW5hdGlvbjIuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfb3V0MihncHVfb3V0X2RhdGEyLCBjb25jYXRlbmF0aW9uMi5kaW1lbnNpb25zKCkpOwotICBncHVfb3V0Mi5kZXZpY2Uoc3ljbF9kZXZpY2UpID1ncHVfaW4xLmNvbmNhdGVuYXRlKGdwdV9pbjIsIDEpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoY29uY2F0ZW5hdGlvbjIuZGF0YSgpLCBncHVfb3V0X2RhdGEyLChjb25jYXRlbmF0aW9uMi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gY29uY2F0ZW5hdGlvbjIobGVmdERpbTEsIGxlZnREaW0yICsgcmlnaHREaW0yLCBsZWZ0RGltMyk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEyID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY29uY2F0ZW5hdGlvbjIuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9vdXQyKGdwdV9vdXRfZGF0YTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0ZW5hdGlvbjIuZGltZW5zaW9ucygpKTsKKyAgZ3B1X291dDIuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbjEuY29uY2F0ZW5hdGUoZ3B1X2luMiwgMSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChjb25jYXRlbmF0aW9uMi5kYXRhKCksIGdwdV9vdXRfZGF0YTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0ZW5hdGlvbjIuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCi0gIC8vY29uY2F0ZW5hdGlvbiA9IGxlZnQuY29uY2F0ZW5hdGUocmlnaHQsIDEpOworICAvLyBjb25jYXRlbmF0aW9uID0gbGVmdC5jb25jYXRlbmF0ZShyaWdodCwgMSk7CiAgIFZFUklGWV9JU19FUVVBTChjb25jYXRlbmF0aW9uMi5kaW1lbnNpb24oMCksIDIpOwogICBWRVJJRllfSVNfRVFVQUwoY29uY2F0ZW5hdGlvbjIuZGltZW5zaW9uKDEpLCA2KTsKICAgVkVSSUZZX0lTX0VRVUFMKGNvbmNhdGVuYXRpb24yLmRpbWVuc2lvbigyKSwgMSk7CkBAIC05MiwxMyArOTksMTYgQEAKICAgICB9CiAgIH0KICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfb3V0X2RhdGEyKTsKLSAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGNvbmNhdGVuYXRpb24zKGxlZnREaW0xLCBsZWZ0RGltMiwgbGVmdERpbTMrcmlnaHREaW0zKTsKLSAgRGF0YVR5cGUgKiBncHVfb3V0X2RhdGEzID0gIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY29uY2F0ZW5hdGlvbjMuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfb3V0MyhncHVfb3V0X2RhdGEzLCBjb25jYXRlbmF0aW9uMy5kaW1lbnNpb25zKCkpOwotICBncHVfb3V0My5kZXZpY2Uoc3ljbF9kZXZpY2UpID1ncHVfaW4xLmNvbmNhdGVuYXRlKGdwdV9pbjIsIDIpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoY29uY2F0ZW5hdGlvbjMuZGF0YSgpLCBncHVfb3V0X2RhdGEzLChjb25jYXRlbmF0aW9uMy5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gY29uY2F0ZW5hdGlvbjMobGVmdERpbTEsIGxlZnREaW0yLCBsZWZ0RGltMyArIHJpZ2h0RGltMyk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEzID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoY29uY2F0ZW5hdGlvbjMuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9vdXQzKGdwdV9vdXRfZGF0YTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0ZW5hdGlvbjMuZGltZW5zaW9ucygpKTsKKyAgZ3B1X291dDMuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbjEuY29uY2F0ZW5hdGUoZ3B1X2luMiwgMik7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChjb25jYXRlbmF0aW9uMy5kYXRhKCksIGdwdV9vdXRfZGF0YTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0ZW5hdGlvbjMuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCi0gIC8vY29uY2F0ZW5hdGlvbiA9IGxlZnQuY29uY2F0ZW5hdGUocmlnaHQsIDIpOworICAvLyBjb25jYXRlbmF0aW9uID0gbGVmdC5jb25jYXRlbmF0ZShyaWdodCwgMik7CiAgIFZFUklGWV9JU19FUVVBTChjb25jYXRlbmF0aW9uMy5kaW1lbnNpb24oMCksIDIpOwogICBWRVJJRllfSVNfRVFVQUwoY29uY2F0ZW5hdGlvbjMuZGltZW5zaW9uKDEpLCAzKTsKICAgVkVSSUZZX0lTX0VRVUFMKGNvbmNhdGVuYXRpb24zLmRpbWVuc2lvbigyKSwgMik7CkBAIC0xMTIsMTAgKzEyMiw4IEBACiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2luMV9kYXRhKTsKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW4yX2RhdGEpOwogfQotdGVtcGxhdGU8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X2NvbmNhdGVuYXRpb25fYXNfbHZhbHVlKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkKLXsKLQordGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgorc3RhdGljIHZvaWQgdGVzdF9jb25jYXRlbmF0aW9uX2FzX2x2YWx1ZShjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIGxlZnREaW0xID0gMjsKICAgSW5kZXhUeXBlIGxlZnREaW0yID0gMzsKICAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMj4gbGVmdFJhbmdlID0ge3tsZWZ0RGltMSwgbGVmdERpbTJ9fTsKQEAgLTEzNiwyOCArMTQ0LDMwIEBACiAgIHJpZ2h0LnNldFJhbmRvbSgpOwogICByZXN1bHQuc2V0UmFuZG9tKCk7CiAKLSAgRGF0YVR5cGUgKiBncHVfaW4xX2RhdGEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShsZWZ0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlICogZ3B1X2luMl9kYXRhICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocmlnaHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUgKiBncHVfb3V0X2RhdGEgPSAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyZXN1bHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLQorICBEYXRhVHlwZSogZ3B1X2luMV9kYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobGVmdC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW4yX2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyaWdodC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyZXN1bHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogCiAgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2luMShncHVfaW4xX2RhdGEsIGxlZnRSYW5nZSk7CiAgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2luMihncHVfaW4yX2RhdGEsIHJpZ2h0UmFuZ2UpOwogICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9vdXQoZ3B1X291dF9kYXRhLCByZXNSYW5nZSk7CiAKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjFfZGF0YSwgbGVmdC5kYXRhKCksKGxlZnQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjJfZGF0YSwgcmlnaHQuZGF0YSgpLChyaWdodC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X291dF9kYXRhLCByZXN1bHQuZGF0YSgpLChyZXN1bHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjFfZGF0YSwgbGVmdC5kYXRhKCksIChsZWZ0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjJfZGF0YSwgcmlnaHQuZGF0YSgpLCAocmlnaHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X291dF9kYXRhLCByZXN1bHQuZGF0YSgpLCAocmVzdWx0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAotLy8gIHQxLmNvbmNhdGVuYXRlKHQyLCAwKSA9IHJlc3VsdDsKLSBncHVfaW4xLmNvbmNhdGVuYXRlKGdwdV9pbjIsIDApLmRldmljZShzeWNsX2RldmljZSkgPWdwdV9vdXQ7Ci0gc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGxlZnQuZGF0YSgpLCBncHVfaW4xX2RhdGEsKGxlZnQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmlnaHQuZGF0YSgpLCBncHVfaW4yX2RhdGEsKHJpZ2h0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIC8vICB0MS5jb25jYXRlbmF0ZSh0MiwgMCkgPSByZXN1bHQ7CisgIGdwdV9pbjEuY29uY2F0ZW5hdGUoZ3B1X2luMiwgMCkuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9vdXQ7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChsZWZ0LmRhdGEoKSwgZ3B1X2luMV9kYXRhLCAobGVmdC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyaWdodC5kYXRhKCksIGdwdV9pbjJfZGF0YSwgKHJpZ2h0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBWRVJJRllfSVNfRVFVQUwobGVmdChpLCBqKSwgcmVzdWx0KGksIGopKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTChyaWdodChpLCBqKSwgcmVzdWx0KGkrMiwgaikpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJpZ2h0KGksIGopLCByZXN1bHQoaSArIDIsIGopKTsKICAgICB9CiAgIH0KICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW4xX2RhdGEpOwpAQCAtMTY1LDggKzE3NSw4IEBACiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X291dF9kYXRhKTsKIH0KIAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIERldl9zZWxlY3Rvcj4gdm9pZCB0ZW5zb3JDb25jYXRfcGVyRGV2aWNlKERldl9zZWxlY3RvciBzKXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgRGV2X3NlbGVjdG9yPgordm9pZCB0ZW5zb3JDb25jYXRfcGVyRGV2aWNlKERldl9zZWxlY3RvciBzKSB7CiAgIFF1ZXVlSW50ZXJmYWNlIHF1ZXVlSW50ZXJmYWNlKHMpOwogICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKICAgdGVzdF9zaW1wbGVfY29uY2F0ZW5hdGlvbjxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKQEAgLTE3NCw3ICsxODQsNyBAQAogICB0ZXN0X2NvbmNhdGVuYXRpb25fYXNfbHZhbHVlPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogfQogRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9jb25jYXRlbmF0aW9uX3N5Y2wpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOkVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CisgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogRWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKICAgICBDQUxMX1NVQlRFU1QodGVuc29yQ29uY2F0X3BlckRldmljZTxoYWxmPihkZXZpY2UpKTsKICAgICBDQUxMX1NVQlRFU1QodGVuc29yQ29uY2F0X3BlckRldmljZTxmbG9hdD4oZGV2aWNlKSk7CiAgIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbnN0LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbnN0LmNwcAppbmRleCA5ZDgwNmVlLi43OGE2NTA2IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb25zdC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29uc3QuY3BwCkBAIC0xMiwyOSArMTIsMjUgQEAKICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CiB1c2luZyBFaWdlbjo6VGVuc29yOwogCi0KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2Fzc2lnbigpCi17Ci0gIFRlbnNvcjxpbnQsIDM+IHJhbmRvbSgyLDMsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9hc3NpZ24oKSB7CisgIFRlbnNvcjxpbnQsIDM+IHJhbmRvbSgyLCAzLCA3KTsKICAgcmFuZG9tLnNldFJhbmRvbSgpOwogCiAgIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgaW50LCAzPiA+IGNvbnN0YW50KHJhbmRvbS5kYXRhKCksIDIsIDMsIDcpOwotICBUZW5zb3I8aW50LCAzPiByZXN1bHQoMiwzLDcpOworICBUZW5zb3I8aW50LCAzPiByZXN1bHQoMiwgMywgNyk7CiAgIHJlc3VsdCA9IGNvbnN0YW50OwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTCgocmVzdWx0KGksaixrKSksIHJhbmRvbShpLGosaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwoKHJlc3VsdChpLCBqLCBrKSksIHJhbmRvbShpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLQotc3RhdGljIHZvaWQgdGVzdF9hc3NpZ25fb2ZfY29uc3RfdGVuc29yKCkKLXsKLSAgVGVuc29yPGludCwgMz4gcmFuZG9tKDIsMyw3KTsKK3N0YXRpYyB2b2lkIHRlc3RfYXNzaWduX29mX2NvbnN0X3RlbnNvcigpIHsKKyAgVGVuc29yPGludCwgMz4gcmFuZG9tKDIsIDMsIDcpOwogICByYW5kb20uc2V0UmFuZG9tKCk7CiAKICAgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBpbnQsIDM+ID4gY29uc3RhbnQxKHJhbmRvbS5kYXRhKCksIDIsIDMsIDcpOwpAQCAtNDcsMTYgKzQzLDE0IEBACiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewotICAgICAgVkVSSUZZX0lTX0VRVUFMKChyZXN1bHQxKGksaikpLCByYW5kb20oaSxqLDApKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTCgocmVzdWx0MihpLGopKSwgcmFuZG9tKGksaiwwKSk7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwoKHJlc3VsdDMoaSxqKSksIHJhbmRvbShpLGosMCkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKChyZXN1bHQxKGksIGopKSwgcmFuZG9tKGksIGosIDApKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTCgocmVzdWx0MihpLCBqKSksIHJhbmRvbShpLCBqLCAwKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwoKHJlc3VsdDMoaSwgaikpLCByYW5kb20oaSwgaiwgMCkpOwogICAgIH0KICAgfQogfQogCi0KLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfY29uc3QpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2NvbnN0KSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9hc3NpZ24oKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2Fzc2lnbl9vZl9jb25zdF90ZW5zb3IoKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb250cmFjdF9ncHUuY3UgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb250cmFjdF9ncHUuY3UKaW5kZXggNWFiZjIxMy4uNzA4OGQ2ZiAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udHJhY3RfZ3B1LmN1CisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbnRyYWN0X2dwdS5jdQpAQCAtMjIsOSArMjIsOCBAQAogdXNpbmcgRWlnZW46OlRlbnNvcjsKIHR5cGVkZWYgVGVuc29yPGZsb2F0LCAxPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOwogCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KLXZvaWQgdGVzdF9ncHVfY29udHJhY3Rpb24oaW50IG1fc2l6ZSwgaW50IGtfc2l6ZSwgaW50IG5fc2l6ZSkKLXsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3ZvaWQgdGVzdF9ncHVfY29udHJhY3Rpb24oaW50IG1fc2l6ZSwgaW50IGtfc2l6ZSwgaW50IG5fc2l6ZSkgewogICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHRfbGVmdChtX3NpemUsIGtfc2l6ZSk7CiAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdF9yaWdodChrX3NpemUsIG5fc2l6ZSk7CiAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdF9yZXN1bHQobV9zaXplLCBuX3NpemUpOwpAQCAtMzQsNyArMzMsNyBAQAogICB0X2xlZnQuc2V0UmFuZG9tKCk7CiAgIHRfcmlnaHQuc2V0UmFuZG9tKCk7CiAKLSAgc3RkOjpzaXplX3QgdF9sZWZ0X2J5dGVzID0gdF9sZWZ0LnNpemUoKSAgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCB0X2xlZnRfYnl0ZXMgPSB0X2xlZnQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKICAgc3RkOjpzaXplX3QgdF9yaWdodF9ieXRlcyA9IHRfcmlnaHQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKICAgc3RkOjpzaXplX3QgdF9yZXN1bHRfYnl0ZXMgPSB0X3Jlc3VsdC5zaXplKCkgKiBzaXplb2YoZmxvYXQpOwogCkBAIC01MiwxMyArNTEsOSBAQAogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gPgotICAgICAgZ3B1X3RfbGVmdChkX3RfbGVmdCwgRWlnZW46OmFycmF5PGludCwgMj4obV9zaXplLCBrX3NpemUpKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiA+Ci0gICAgICBncHVfdF9yaWdodChkX3RfcmlnaHQsIEVpZ2VuOjphcnJheTxpbnQsIDI+KGtfc2l6ZSwgbl9zaXplKSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gPgotICAgICAgZ3B1X3RfcmVzdWx0KGRfdF9yZXN1bHQsIEVpZ2VuOjphcnJheTxpbnQsIDI+KG1fc2l6ZSwgbl9zaXplKSk7Ci0KKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiA+IGdwdV90X2xlZnQoZF90X2xlZnQsIEVpZ2VuOjphcnJheTxpbnQsIDI+KG1fc2l6ZSwga19zaXplKSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gPiBncHVfdF9yaWdodChkX3RfcmlnaHQsIEVpZ2VuOjphcnJheTxpbnQsIDI+KGtfc2l6ZSwgbl9zaXplKSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gPiBncHVfdF9yZXN1bHQoZF90X3Jlc3VsdCwgRWlnZW46OmFycmF5PGludCwgMj4obV9zaXplLCBuX3NpemUpKTsKIAogICBncHVfdF9yZXN1bHQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X3RfbGVmdC5jb250cmFjdChncHVfdF9yaWdodCwgZGltcyk7CiAgIHRfcmVzdWx0ID0gdF9sZWZ0LmNvbnRyYWN0KHRfcmlnaHQsIGRpbXMpOwpAQCAtNzEsOCArNjYsNyBAQAogICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHRfcmVzdWx0KGkpLCB0X3Jlc3VsdF9ncHUoaSksIDFlLTRmKSkgewogICAgICAgY29udGludWU7CiAgICAgfQotICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICI6ICIgPDwgdF9yZXN1bHQoaSkKLSAgICAgICAgICAgICAgPDwgIiB2cyAiIDw8ICB0X3Jlc3VsdF9ncHUoaSkgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICI6ICIgPDwgdF9yZXN1bHQoaSkgPDwgIiB2cyAiIDw8IHRfcmVzdWx0X2dwdShpKSA8PCBzdGQ6OmVuZGw7CiAgICAgYXNzZXJ0KGZhbHNlKTsKICAgfQogCkBAIC04MSwxMCArNzUsOCBAQAogICBncHVGcmVlKCh2b2lkKilkX3RfcmVzdWx0KTsKIH0KIAotCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KLXZvaWQgdGVzdF9zY2FsYXIoaW50IG1fc2l6ZSwgaW50IGtfc2l6ZSwgaW50IG5fc2l6ZSkKLXsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3ZvaWQgdGVzdF9zY2FsYXIoaW50IG1fc2l6ZSwgaW50IGtfc2l6ZSwgaW50IG5fc2l6ZSkgewogICBzdGQ6OmNvdXQgPDwgIlRlc3RpbmcgZm9yICgiIDw8IG1fc2l6ZSA8PCAiLCIgPDwga19zaXplIDw8ICIsIiA8PCBuX3NpemUgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKICAgLy8gd2l0aCB0aGVzZSBkaW1lbnNpb25zLCB0aGUgb3V0cHV0IGhhcyAzMDAgKiAxNDAgZWxlbWVudHMsIHdoaWNoIGlzCiAgIC8vIG1vcmUgdGhhbiAzMCAqIDEwMjQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiBibG9ja3Mgb24KQEAgLTk4LDcgKzkwLDcgQEAKICAgdF9sZWZ0LnNldFJhbmRvbSgpOwogICB0X3JpZ2h0LnNldFJhbmRvbSgpOwogCi0gIHN0ZDo6c2l6ZV90IHRfbGVmdF9ieXRlcyA9IHRfbGVmdC5zaXplKCkgICogc2l6ZW9mKGZsb2F0KTsKKyAgc3RkOjpzaXplX3QgdF9sZWZ0X2J5dGVzID0gdF9sZWZ0LnNpemUoKSAqIHNpemVvZihmbG9hdCk7CiAgIHN0ZDo6c2l6ZV90IHRfcmlnaHRfYnl0ZXMgPSB0X3JpZ2h0LnNpemUoKSAqIHNpemVvZihmbG9hdCk7CiAgIHN0ZDo6c2l6ZV90IHRfcmVzdWx0X2J5dGVzID0gc2l6ZW9mKGZsb2F0KTsKIApAQCAtMTE2LDIxICsxMDgsMTYgQEAKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+ID4KLSAgICAgIGdwdV90X2xlZnQoZF90X2xlZnQsIG1fc2l6ZSwga19zaXplKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiA+Ci0gICAgICBncHVfdF9yaWdodChkX3RfcmlnaHQsIGtfc2l6ZSwgbl9zaXplKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAwLCBEYXRhTGF5b3V0PiA+Ci0gICAgICBncHVfdF9yZXN1bHQoZF90X3Jlc3VsdCk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gPiBncHVfdF9sZWZ0KGRfdF9sZWZ0LCBtX3NpemUsIGtfc2l6ZSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gPiBncHVfdF9yaWdodChkX3RfcmlnaHQsIGtfc2l6ZSwgbl9zaXplKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAwLCBEYXRhTGF5b3V0PiA+IGdwdV90X3Jlc3VsdChkX3RfcmVzdWx0KTsKIAogICBncHVfdF9yZXN1bHQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X3RfbGVmdC5jb250cmFjdChncHVfdF9yaWdodCwgZGltcyk7CiAgIHRfcmVzdWx0ID0gdF9sZWZ0LmNvbnRyYWN0KHRfcmlnaHQsIGRpbXMpOwogCiAgIGdwdU1lbWNweSh0X3Jlc3VsdF9ncHUuZGF0YSgpLCBkX3RfcmVzdWx0LCB0X3Jlc3VsdF9ieXRlcywgZ3B1TWVtY3B5RGV2aWNlVG9Ib3N0KTsKLSAgaWYgKGZhYnModF9yZXN1bHQoKSAtIHRfcmVzdWx0X2dwdSgpKSA+IDFlLTRmICYmCi0gICAgICAhRWlnZW46OmludGVybmFsOjppc0FwcHJveCh0X3Jlc3VsdCgpLCB0X3Jlc3VsdF9ncHUoKSwgMWUtNGYpKSB7Ci0gICAgc3RkOjpjb3V0IDw8ICJtaXNtYXRjaCBkZXRlY3RlZDogIiA8PCB0X3Jlc3VsdCgpCi0gICAgICAgICAgICAgIDw8ICIgdnMgIiA8PCAgdF9yZXN1bHRfZ3B1KCkgPDwgc3RkOjplbmRsOworICBpZiAoZmFicyh0X3Jlc3VsdCgpIC0gdF9yZXN1bHRfZ3B1KCkpID4gMWUtNGYgJiYgIUVpZ2VuOjppbnRlcm5hbDo6aXNBcHByb3godF9yZXN1bHQoKSwgdF9yZXN1bHRfZ3B1KCksIDFlLTRmKSkgeworICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQ6ICIgPDwgdF9yZXN1bHQoKSA8PCAiIHZzICIgPDwgdF9yZXN1bHRfZ3B1KCkgPDwgc3RkOjplbmRsOwogICAgIGFzc2VydChmYWxzZSk7CiAgIH0KIApAQCAtMTM5LDggKzEyNiw3IEBACiAgIGdwdUZyZWUoKHZvaWQqKWRfdF9yZXN1bHQpOwogfQogCi0KLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0PgordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgogdm9pZCB0ZXN0X2dwdV9jb250cmFjdGlvbl9tKCkgewogICBmb3IgKGludCBrID0gMzI7IGsgPCAyNTY7IGsrKykgewogICAgIHRlc3RfZ3B1X2NvbnRyYWN0aW9uPENvbE1ham9yPihrLCAxMjgsIDEyOCk7CkBAIC0xNDgsNyArMTM0LDcgQEAKICAgfQogfQogCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KIHZvaWQgdGVzdF9ncHVfY29udHJhY3Rpb25faygpIHsKICAgZm9yIChpbnQgayA9IDMyOyBrIDwgMjU2OyBrKyspIHsKICAgICB0ZXN0X2dwdV9jb250cmFjdGlvbjxDb2xNYWpvcj4oMTI4LCBrLCAxMjgpOwpAQCAtMTU2LDcgKzE0Miw3IEBACiAgIH0KIH0KIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CiB2b2lkIHRlc3RfZ3B1X2NvbnRyYWN0aW9uX24oKSB7CiAgIGZvciAoaW50IGsgPSAzMjsgayA8IDI1NjsgaysrKSB7CiAgICAgdGVzdF9ncHVfY29udHJhY3Rpb248Q29sTWFqb3I+KDEyOCwgMTI4LCBrKTsKQEAgLTE2NCwyMCArMTUwLDEzIEBACiAgIH0KIH0KIAotCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KIHZvaWQgdGVzdF9ncHVfY29udHJhY3Rpb25fc2l6ZXMoKSB7Ci0gIGludCBtX3NpemVzWzNdWzVdID0ge3sgMzEsICAzOSwgICA2MywgICA2NCwgICA2NX0sCi0gICAgICAgICAgICAgICAgICAgICAgIHsxMjcsIDEyOSwgIDI1NSwgIDI1NyAsIDUxMX0sCi0gICAgICAgICAgICAgICAgICAgICAgIHs1MTIsIDUxMywgMTAyMywgMTAyNCwgMTAyNX19OworICBpbnQgbV9zaXplc1szXVs1XSA9IHt7MzEsIDM5LCA2MywgNjQsIDY1fSwgezEyNywgMTI5LCAyNTUsIDI1NywgNTExfSwgezUxMiwgNTEzLCAxMDIzLCAxMDI0LCAxMDI1fX07CiAKLSAgaW50IG5fc2l6ZXNbM11bNV0gPSB7eyAzMSwgIDM5LCAgIDYzLCAgIDY0LCAgIDY1fSwKLSAgICAgICAgICAgICAgICAgICAgICAgezEyNywgMTI5LCAgMjU1LCAgMjU3LCAgNTExfSwKLSAgICAgICAgICAgICAgICAgICAgICAgezUxMiwgNTEzLCAxMDIzLCAxMDI0LCAxMDI1fX07CisgIGludCBuX3NpemVzWzNdWzVdID0ge3szMSwgMzksIDYzLCA2NCwgNjV9LCB7MTI3LCAxMjksIDI1NSwgMjU3LCA1MTF9LCB7NTEyLCA1MTMsIDEwMjMsIDEwMjQsIDEwMjV9fTsKIAotICBpbnQga19zaXplc1szXVs2XSA9IHt7IDMxLCAgIDM5LCAgNjMsICA2NCwgICA2NSwgICA5NX0sCi0gICAgICAgICAgICAgICAgICAgICAgIHsgOTYsIDEyNywgMTI5LCAgMjU1LCAgMjU3LCAgNTExfSwKLSAgICAgICAgICAgICAgICAgICAgICAgezUxMiwgNTEzLCA3MjUsIDEwMjMsIDEwMjQsIDEwMjV9fTsKKyAgaW50IGtfc2l6ZXNbM11bNl0gPSB7ezMxLCAzOSwgNjMsIDY0LCA2NSwgOTV9LCB7OTYsIDEyNywgMTI5LCAyNTUsIDI1NywgNTExfSwgezUxMiwgNTEzLCA3MjUsIDEwMjMsIDEwMjQsIDEwMjV9fTsKIAogICAvLyBTb21lIHNlbGVjdGlvbiBvZiBzcGVjaWZpYyBjYXNlcy4KICAgLy8gIC0gbSBjaGFuZ2VzIHJvd3MgZWFjaCBpdGVyYXRpb24KQEAgLTIwOSw4ICsxODgsNyBAQAogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfY29udHJhY3RfZ3B1KQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9jb250cmFjdF9ncHUpIHsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9ncHVfY29udHJhY3Rpb248Q29sTWFqb3I+KDEyOCwgMTI4LCAxMjgpKTsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9ncHVfY29udHJhY3Rpb248Um93TWFqb3I+KDEyOCwgMTI4LCAxMjgpKTsKIApAQCAtMjI3LDggKzIwNSw4IEBACiAgIENBTExfU1VCVEVTVF83KHRlc3RfZ3B1X2NvbnRyYWN0aW9uX248Um93TWFqb3I+KCkpOwogCiAjaWYgIWRlZmluZWQoRUlHRU5fVVNFX0hJUCkKLS8vIGRpc2FibGUgdGhlc2Ugc3VidGVzdHMgZm9yIEhJUAorICAvLyBkaXNhYmxlIHRoZXNlIHN1YnRlc3RzIGZvciBISVAKICAgQ0FMTF9TVUJURVNUXzgodGVzdF9ncHVfY29udHJhY3Rpb25fc2l6ZXM8Q29sTWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1RfOSh0ZXN0X2dwdV9jb250cmFjdGlvbl9zaXplczxSb3dNYWpvcj4oKSk7Ci0jZW5kaWYJCisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbnRyYWN0X3N5Y2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udHJhY3Rfc3ljbC5jcHAKaW5kZXggZmJjYzI5My4uMTIwNjgxYiAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udHJhY3Rfc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udHJhY3Rfc3ljbC5jcHAKQEAgLTMxLDEyICszMSw5IEBACiB1c2luZyBFaWdlbjo6VGVuc29yOwogdXNpbmcgRWlnZW46OlRlbnNvck1hcDsKIAotdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgSW5kZXhUeXBlLAotICAgICAgICAgIHR5cGVuYW1lIERldmljZT4KLXZvaWQgc3RhdGljIHRlc3Rfc3ljbF9jb250cmFjdGlvbihjb25zdCBEZXZpY2UgJnN5Y2xfZGV2aWNlLCBJbmRleFR5cGUgbV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4VHlwZSBrX3NpemUsIEluZGV4VHlwZSBuX3NpemUpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvblBhaXIKLSAgICAgIERpbVBhaXI7Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIERldmljZT4KK3ZvaWQgc3RhdGljIHRlc3Rfc3ljbF9jb250cmFjdGlvbihjb25zdCBEZXZpY2UgJnN5Y2xfZGV2aWNlLCBJbmRleFR5cGUgbV9zaXplLCBJbmRleFR5cGUga19zaXplLCBJbmRleFR5cGUgbl9zaXplKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CiAgIHN0YXRpYyBjb25zdCBEYXRhVHlwZSBlcnJvcl90aHJlc2hvbGQgPSBEYXRhVHlwZSgxZS00KTsKICAgLy8gd2l0aCB0aGVzZSBkaW1lbnNpb25zLCB0aGUgb3V0cHV0IGhhcyAzMDAgKiAxNDAgZWxlbWVudHMsIHdoaWNoIGlzCiAgIC8vIG1vcmUgdGhhbiAzMCAqIDEwMjQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiBibG9ja3Mgb24KQEAgLTU3LDQyICs1NCwzMiBAQAogICBzdGQ6OnNpemVfdCB0X3JpZ2h0X2J5dGVzID0gdF9yaWdodC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogICBzdGQ6OnNpemVfdCB0X3Jlc3VsdF9ieXRlcyA9IHRfcmVzdWx0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAKLSAgRGF0YVR5cGUgKmRfdF9sZWZ0ID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfbGVmdF9ieXRlcykpOwotICBEYXRhVHlwZSAqZF90X3JpZ2h0ID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfcmlnaHRfYnl0ZXMpKTsKLSAgRGF0YVR5cGUgKmRfdF9yZXN1bHQgPQotICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9yZXN1bHRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUgKmRfdF9sZWZ0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9sZWZ0X2J5dGVzKSk7CisgIERhdGFUeXBlICpkX3RfcmlnaHQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X3JpZ2h0X2J5dGVzKSk7CisgIERhdGFUeXBlICpkX3RfcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9yZXN1bHRfYnl0ZXMpKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+Ci0gICAgICBncHVfdF9sZWZ0KGRfdF9sZWZ0LCBsZWZ0X2RpbXMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+Ci0gICAgICBncHVfdF9yaWdodChkX3RfcmlnaHQsIHJpZ2h0X2RpbXMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+Ci0gICAgICBncHVfdF9yZXN1bHQoZF90X3Jlc3VsdCwgcmVzdWx0X2RpbXMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV90X2xlZnQoZF90X2xlZnQsIGxlZnRfZGltcyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3RfcmlnaHQoZF90X3JpZ2h0LCByaWdodF9kaW1zKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfdF9yZXN1bHQoZF90X3Jlc3VsdCwgcmVzdWx0X2RpbXMpOwogCiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShkX3RfbGVmdCwgdF9sZWZ0LmRhdGEoKSwgdF9sZWZ0X2J5dGVzKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGRfdF9yaWdodCwgdF9yaWdodC5kYXRhKCksIHRfcmlnaHRfYnl0ZXMpOwogCiAgIGdwdV90X3Jlc3VsdC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X3RfbGVmdC5jb250cmFjdChncHVfdF9yaWdodCwgZGltcyk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0X3Jlc3VsdF9ncHUuZGF0YSgpLCBkX3RfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9yZXN1bHRfYnl0ZXMpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodF9yZXN1bHRfZ3B1LmRhdGEoKSwgZF90X3Jlc3VsdCwgdF9yZXN1bHRfYnl0ZXMpOwogCiAgIHRfcmVzdWx0ID0gdF9sZWZ0LmNvbnRyYWN0KHRfcmlnaHQsIGRpbXMpOwogCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgdF9yZXN1bHQuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KHN0ZDo6ZmFicyhzdGF0aWNfY2FzdDxEYXRhVHlwZT4oCi0gICAgICAgICAgICB0X3Jlc3VsdChpKSAtIHRfcmVzdWx0X2dwdShpKSkpKSA8IGVycm9yX3RocmVzaG9sZCkgeworICAgIGlmIChzdGF0aWNfY2FzdDxEYXRhVHlwZT4oc3RkOjpmYWJzKHN0YXRpY19jYXN0PERhdGFUeXBlPih0X3Jlc3VsdChpKSAtIHRfcmVzdWx0X2dwdShpKSkpKSA8IGVycm9yX3RocmVzaG9sZCkgewogICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHRfcmVzdWx0KGkpLCB0X3Jlc3VsdF9ncHUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfdGhyZXNob2xkKSkgeworICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHRfcmVzdWx0KGkpLCB0X3Jlc3VsdF9ncHUoaSksIGVycm9yX3RocmVzaG9sZCkpIHsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KIAotICAgIHN0ZDo6Y291dCA8PCAiTSA6ICIgPDwgbV9zaXplIDw8ICIsIE4gOiAiIDw8IG5fc2l6ZSA8PCAiLCBLIDogIiA8PCBrX3NpemUKLSAgICAgICAgICAgICAgPDwgIiwgbWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgSW5kZXhUeXBlICIgPDwgaSA8PCAiOiAiIDw8IHRfcmVzdWx0KGkpCi0gICAgICAgICAgICAgIDw8ICIgdnMgIiA8PCB0X3Jlc3VsdF9ncHUoaSkgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAiTSA6ICIgPDwgbV9zaXplIDw8ICIsIE4gOiAiIDw8IG5fc2l6ZSA8PCAiLCBLIDogIiA8PCBrX3NpemUgPDwgIiwgbWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgSW5kZXhUeXBlICIKKyAgICAgICAgICAgICAgPDwgaSA8PCAiOiAiIDw8IHRfcmVzdWx0KGkpIDw8ICIgdnMgIiA8PCB0X3Jlc3VsdF9ncHUoaSkgPDwgc3RkOjplbmRsOwogICAgIFZFUklGWV9JU19BUFBST1godF9yZXN1bHRfZ3B1KGkpLCB0X3Jlc3VsdChpKSk7CiAgIH0KICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShkX3RfbGVmdCk7CkBAIC0xMDAsNjEgKzg3LDQ3IEBACiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZF90X3Jlc3VsdCk7CiB9CiAKLXRlbXBsYXRlIDxpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZSwKLSAgICAgICAgICB0eXBlbmFtZSBEZXZpY2U+Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIERldmljZT4KIHZvaWQgdGVzdF9zeWNsX2NvbnRyYWN0aW9uX20oY29uc3QgRGV2aWNlICZzeWNsX2RldmljZSkgewogICBmb3IgKEluZGV4VHlwZSBrID0gMzI7IGsgPCAyNTY7IGsrKykgewotICAgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxEYXRhTGF5b3V0LCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgaywgMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgpOworICAgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxEYXRhTGF5b3V0LCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgaywgMTI4LCAxMjgpOwogICB9CiB9CiAKLXRlbXBsYXRlIDxpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZSwKLSAgICAgICAgICB0eXBlbmFtZSBEZXZpY2U+Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIERldmljZT4KIHZvaWQgdGVzdF9zeWNsX2NvbnRyYWN0aW9uX2soY29uc3QgRGV2aWNlICZzeWNsX2RldmljZSkgewogICBmb3IgKEluZGV4VHlwZSBrID0gMzI7IGsgPCAyNTY7IGsrKykgewotICAgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxEYXRhTGF5b3V0LCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTI4LCBrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgpOworICAgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxEYXRhTGF5b3V0LCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTI4LCBrLCAxMjgpOwogICB9CiB9CiAKLXRlbXBsYXRlIDxpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZSwKLSAgICAgICAgICB0eXBlbmFtZSBEZXZpY2U+Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIERldmljZT4KIHZvaWQgdGVzdF9zeWNsX2NvbnRyYWN0aW9uX24oY29uc3QgRGV2aWNlICZzeWNsX2RldmljZSkgewogICBmb3IgKEluZGV4VHlwZSBrID0gMzI7IGsgPCAyNTY7IGsrKykgewotICAgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxEYXRhTGF5b3V0LCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsIGspOworICAgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxEYXRhTGF5b3V0LCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTI4LCAxMjgsIGspOwogICB9CiB9CiAKLXRlbXBsYXRlIDxpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZSwKLSAgICAgICAgICB0eXBlbmFtZSBEZXZpY2U+Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIERldmljZT4KIHZvaWQgdGVzdF9zeWNsX2NvbnRyYWN0aW9uX3NpemVzKGNvbnN0IERldmljZSAmc3ljbF9kZXZpY2UpIHsKLSAgSW5kZXhUeXBlIG1fc2l6ZXNbXSA9IHszMSwgIDM5LCAgNjMsICA2NCwgIDY1LCAgIDEyNywgIDEyOSwgMjU1LAotICAgICAgICAgICAgICAgICAgICAgICAgIDI1NywgNTExLCA1MTIsIDUxMywgMTAyMywgMTAyNCwgMTAyNX07CisgIEluZGV4VHlwZSBtX3NpemVzW10gPSB7MzEsIDM5LCA2MywgNjQsIDY1LCAxMjcsIDEyOSwgMjU1LCAyNTcsIDUxMSwgNTEyLCA1MTMsIDEwMjMsIDEwMjQsIDEwMjV9OwogCi0gIEluZGV4VHlwZSBuX3NpemVzW10gPSB7MzEsICAzOSwgIDYzLCAgNjQsICA2NSwgICAxMjcsICAxMjksIDI1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAyNTcsIDUxMSwgNTEyLCA1MTMsIDEwMjMsIDEwMjQsIDEwMjV9OworICBJbmRleFR5cGUgbl9zaXplc1tdID0gezMxLCAzOSwgNjMsIDY0LCA2NSwgMTI3LCAxMjksIDI1NSwgMjU3LCA1MTEsIDUxMiwgNTEzLCAxMDIzLCAxMDI0LCAxMDI1fTsKIAotICBJbmRleFR5cGUga19zaXplc1tdID0gezMxLCAgMzksICA2MywgIDY0LCAgNjUsICA5NSwgICA5NiwgICAxMjcsIDEyOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsIDI1NywgNTExLCA1MTIsIDUxMywgMTAyMywgMTAyNCwgMTAyNX07CisgIEluZGV4VHlwZSBrX3NpemVzW10gPSB7MzEsIDM5LCA2MywgNjQsIDY1LCA5NSwgOTYsIDEyNywgMTI5LCAyNTUsIDI1NywgNTExLCA1MTIsIDUxMywgMTAyMywgMTAyNCwgMTAyNX07CiAKICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCAxNTsgaSsrKSB7CiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCAxNTsgaisrKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IDE3OyBrKyspIHsKLSAgICAgICAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPERhdGFMYXlvdXQsIERhdGFUeXBlLCBJbmRleFR5cGU+KAotICAgICAgICAgICAgc3ljbF9kZXZpY2UsIG1fc2l6ZXNbaV0sIG5fc2l6ZXNbal0sIGtfc2l6ZXNba10pOworICAgICAgICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248RGF0YUxheW91dCwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIG1fc2l6ZXNbaV0sIG5fc2l6ZXNbal0sIGtfc2l6ZXNba10pOwogICAgICAgfQogICAgIH0KICAgfQogfQogCi10ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGUsCi0gICAgICAgICAgdHlwZW5hbWUgRGV2aWNlPgotdm9pZCBzdGF0aWMgdGVzdF9ub19vdXRfb2ZfYm91bmRzKGNvbnN0IERldmljZSAmc3ljbF9kZXZpY2UsIEluZGV4VHlwZSBtX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhUeXBlIGtfc2l6ZSwgSW5kZXhUeXBlIG5fc2l6ZSkgewotICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPjo6RGltZW5zaW9uUGFpcgotICAgICAgRGltUGFpcjsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZSwgdHlwZW5hbWUgRGV2aWNlPgordm9pZCBzdGF0aWMgdGVzdF9ub19vdXRfb2ZfYm91bmRzKGNvbnN0IERldmljZSAmc3ljbF9kZXZpY2UsIEluZGV4VHlwZSBtX3NpemUsIEluZGV4VHlwZSBrX3NpemUsIEluZGV4VHlwZSBuX3NpemUpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKICAgc3RhdGljIGNvbnN0IERhdGFUeXBlIGVycm9yX3RocmVzaG9sZCA9IERhdGFUeXBlKDFlLTQpOwogICBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdF9sZWZ0KG1fc2l6ZSwga19zaXplKTsKICAgVGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHRfcmlnaHQoa19zaXplLCBuX3NpemUpOwpAQCAtMTc3LDIwICsxNTAsMTQgQEAKICAgc3RkOjpzaXplX3QgdF9yaWdodF9ieXRlcyA9IHBhZGRlZF9yaWdodF9zaXplICogc2l6ZW9mKERhdGFUeXBlKTsKICAgc3RkOjpzaXplX3QgdF9yZXN1bHRfYnl0ZXMgPSBwYWRkZWRfcmVzdWx0X3NpemUgKiBzaXplb2YoRGF0YVR5cGUpOwogCi0gIERhdGFUeXBlICpkX3RfbGVmdCA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X2xlZnRfYnl0ZXMpKTsKLSAgRGF0YVR5cGUgKmRfdF9yaWdodCA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X3JpZ2h0X2J5dGVzKSk7Ci0gIERhdGFUeXBlICpkX3RfcmVzdWx0ID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfcmVzdWx0X2J5dGVzKSk7CisgIERhdGFUeXBlICpkX3RfbGVmdCA9IHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfbGVmdF9ieXRlcykpOworICBEYXRhVHlwZSAqZF90X3JpZ2h0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9yaWdodF9ieXRlcykpOworICBEYXRhVHlwZSAqZF90X3Jlc3VsdCA9IHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfcmVzdWx0X2J5dGVzKSk7CiAKICAgLy8gVGVuc29yTWFwcyBhcmUgc3RpbGwgb2YgdGhlIHNhbWUgc2l6ZSB0aGFuIHRoZSBUZW5zb3JzCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4KLSAgICAgIGdwdV90X2xlZnQoZF90X2xlZnQsIGxlZnRfZGltcyk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4KLSAgICAgIGdwdV90X3JpZ2h0KGRfdF9yaWdodCwgcmlnaHRfZGltcyk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4KLSAgICAgIGdwdV90X3Jlc3VsdChkX3RfcmVzdWx0LCByZXN1bHRfZGltcyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3RfbGVmdChkX3RfbGVmdCwgbGVmdF9kaW1zKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfdF9yaWdodChkX3RfcmlnaHQsIHJpZ2h0X2RpbXMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV90X3Jlc3VsdChkX3RfcmVzdWx0LCByZXN1bHRfZGltcyk7CiAKICAgLy8gV3JpdGUgbmFuIGFmdGVyIHRoZSBhY3R1YWwgYnVmZmVyIHRvIHByb3BhZ2F0ZSBuYW5zIGV2ZXJ5d2hlcmUgaW4gY2FzZSBvZgogICAvLyBpbnZhbGlkIHJlYWRzCkBAIC0yMTQsMjIgKzE4MSwxOSBAQAogICB0X3Jlc3VsdCA9IHRfbGVmdC5jb250cmFjdCh0X3JpZ2h0LCBkaW1zKTsKIAogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IHRfcmVzdWx0LnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKHN0YXRpY19jYXN0PERhdGFUeXBlPihzdGQ6OmZhYnMoc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KAotICAgICAgICAgICAgdF9yZXN1bHQoaSkgLSBob3N0X3Jlc3VsdF9kYXRhW2ldKSkpIDwgZXJyb3JfdGhyZXNob2xkKSB7CisgICAgaWYgKHN0YXRpY19jYXN0PERhdGFUeXBlPihzdGQ6OmZhYnMoc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KHRfcmVzdWx0KGkpIC0gaG9zdF9yZXN1bHRfZGF0YVtpXSkpKSA8IGVycm9yX3RocmVzaG9sZCkgewogICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHRfcmVzdWx0KGkpLCBob3N0X3Jlc3VsdF9kYXRhW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3RocmVzaG9sZCkpIHsKKyAgICBpZiAoRWlnZW46OmludGVybmFsOjppc0FwcHJveCh0X3Jlc3VsdChpKSwgaG9zdF9yZXN1bHRfZGF0YVtpXSwgZXJyb3JfdGhyZXNob2xkKSkgewogICAgICAgY29udGludWU7CiAgICAgfQogICAgIGlmIChzdGQ6OmlzbmFuKGhvc3RfcmVzdWx0X2RhdGFbaV0pKSB7CiAgICAgICBzdGQ6OmNvdXQgPDwgIk0gOiAiIDw8IG1fc2l6ZSA8PCAiLCBOIDogIiA8PCBuX3NpemUgPDwgIiwgSyA6ICIgPDwga19zaXplCi0gICAgICAgICAgICAgICAgPDwgIiwgaW52YWxpZCByZWFkIGRldGVjdGVkIGF0IEluZGV4VHlwZSAiIDw8IGkgPDwgIjogIgotICAgICAgICAgICAgICAgIDw8IHRfcmVzdWx0KGkpIDw8ICIgdnMgIiA8PCBob3N0X3Jlc3VsdF9kYXRhW2ldIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICA8PCAiLCBpbnZhbGlkIHJlYWQgZGV0ZWN0ZWQgYXQgSW5kZXhUeXBlICIgPDwgaSA8PCAiOiAiIDw8IHRfcmVzdWx0KGkpIDw8ICIgdnMgIiA8PCBob3N0X3Jlc3VsdF9kYXRhW2ldCisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICAgIH0gZWxzZSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIk0gOiAiIDw8IG1fc2l6ZSA8PCAiLCBOIDogIiA8PCBuX3NpemUgPDwgIiwgSyA6ICIgPDwga19zaXplCi0gICAgICAgICAgICAgICAgPDwgIiwgbWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgSW5kZXhUeXBlICIgPDwgaSA8PCAiOiAiCi0gICAgICAgICAgICAgICAgPDwgdF9yZXN1bHQoaSkgPDwgIiB2cyAiIDw8IGhvc3RfcmVzdWx0X2RhdGFbaV0gPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICJNIDogIiA8PCBtX3NpemUgPDwgIiwgTiA6ICIgPDwgbl9zaXplIDw8ICIsIEsgOiAiIDw8IGtfc2l6ZSA8PCAiLCBtaXNtYXRjaCBkZXRlY3RlZCBhdCBJbmRleFR5cGUgIgorICAgICAgICAgICAgICAgIDw8IGkgPDwgIjogIiA8PCB0X3Jlc3VsdChpKSA8PCAiIHZzICIgPDwgaG9zdF9yZXN1bHRfZGF0YVtpXSA8PCBzdGQ6OmVuZGw7CiAgICAgfQogICAgIFZFUklGWV9JU19BUFBST1goaG9zdF9yZXN1bHRfZGF0YVtpXSwgdF9yZXN1bHQoaSkpOwogICB9CkBAIC0yMzksOCArMjAzLDcgQEAKICAgICAgIGNvbnRpbnVlOwogICAgIH0KICAgICBzdGQ6OmNvdXQgPDwgIk0gOiAiIDw8IG1fc2l6ZSA8PCAiLCBOIDogIiA8PCBuX3NpemUgPDwgIiwgSyA6ICIgPDwga19zaXplCi0gICAgICAgICAgICAgIDw8ICIsIGludmFsaWQgd3JpdGUgZGV0ZWN0ZWQgYXQgSW5kZXhUeXBlICIgPDwgaSA8PCAiOiAiCi0gICAgICAgICAgICAgIDw8IGhvc3RfcmVzdWx0X2RhdGFbaV0gPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICA8PCAiLCBpbnZhbGlkIHdyaXRlIGRldGVjdGVkIGF0IEluZGV4VHlwZSAiIDw8IGkgPDwgIjogIiA8PCBob3N0X3Jlc3VsdF9kYXRhW2ldIDw8IHN0ZDo6ZW5kbDsKICAgICBWRVJJRllfSVNfQVBQUk9YKGhvc3RfcmVzdWx0X2RhdGFbaV0sIHRfcmVzdWx0KGkpKTsKICAgfQogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGRfdF9sZWZ0KTsKQEAgLTI1MiwxNyArMjE1LDE0IEBACiAgIGRlbGV0ZVtdIGhvc3RfcmVzdWx0X2RhdGE7CiB9CiAKLXRlbXBsYXRlIDxpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZSwKLSAgICAgICAgICB0eXBlbmFtZSBEZXZpY2U+Ci12b2lkIHRlc3Rfc2NhbGFyKGNvbnN0IERldmljZSAmc3ljbF9kZXZpY2UsIEluZGV4VHlwZSBtX3NpemUsIEluZGV4VHlwZSBrX3NpemUsCi0gICAgICAgICAgICAgICAgIEluZGV4VHlwZSBuX3NpemUpIHsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZSwgdHlwZW5hbWUgRGV2aWNlPgordm9pZCB0ZXN0X3NjYWxhcihjb25zdCBEZXZpY2UgJnN5Y2xfZGV2aWNlLCBJbmRleFR5cGUgbV9zaXplLCBJbmRleFR5cGUga19zaXplLCBJbmRleFR5cGUgbl9zaXplKSB7CiAgIC8vIHN0ZDo6Y291dCA8PCAiVGVzdGluZyBmb3IgKCIgPDwgbV9zaXplIDw8ICIsIiA8PCBrX3NpemUgPDwgIiwiIDw8IG5fc2l6ZSA8PAogICAvLyAiKSIgPDwgc3RkOjplbmRsOwogICAvLyB3aXRoIHRoZXNlIGRpbWVuc2lvbnMsIHRoZSBvdXRwdXQgaGFzIDMwMCAqIDE0MCBlbGVtZW50cywgd2hpY2ggaXMKICAgLy8gbW9yZSB0aGFuIDMwICogMTAyNCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZiB0aHJlYWRzIGluIGJsb2NrcyBvbgogICAvLyBhIDE1IFNNIEdLMTEwIEdQVQotICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPjo6RGltZW5zaW9uUGFpcgotICAgICAgRGltUGFpcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKICAgc3RhdGljIGNvbnN0IERhdGFUeXBlIGVycm9yX3RocmVzaG9sZCA9IERhdGFUeXBlKDFlLTQpOwogICBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdF9sZWZ0KG1fc2l6ZSwga19zaXplKTsKICAgVGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHRfcmlnaHQoa19zaXplLCBuX3NpemUpOwpAQCAtMjc4LDM1ICsyMzgsMjYgQEAKICAgc3RkOjpzaXplX3QgdF9yaWdodF9ieXRlcyA9IHRfcmlnaHQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKICAgc3RkOjpzaXplX3QgdF9yZXN1bHRfYnl0ZXMgPSBzaXplb2YoRGF0YVR5cGUpOwogCi0gIERhdGFUeXBlICpkX3RfbGVmdCA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X2xlZnRfYnl0ZXMpKTsKLSAgRGF0YVR5cGUgKmRfdF9yaWdodCA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X3JpZ2h0X2J5dGVzKSk7Ci0gIERhdGFUeXBlICpkX3RfcmVzdWx0ID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfcmVzdWx0X2J5dGVzKSk7CisgIERhdGFUeXBlICpkX3RfbGVmdCA9IHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfbGVmdF9ieXRlcykpOworICBEYXRhVHlwZSAqZF90X3JpZ2h0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9yaWdodF9ieXRlcykpOworICBEYXRhVHlwZSAqZF90X3Jlc3VsdCA9IHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfcmVzdWx0X2J5dGVzKSk7CiAKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PgotICAgICAgZ3B1X3RfbGVmdChkX3RfbGVmdCwgbGVmdF9kaW1zKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PgotICAgICAgZ3B1X3RfcmlnaHQoZF90X3JpZ2h0LCByaWdodF9kaW1zKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAwLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PgotICAgICAgZ3B1X3RfcmVzdWx0KGRfdF9yZXN1bHQpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV90X2xlZnQoZF90X2xlZnQsIGxlZnRfZGltcyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3RfcmlnaHQoZF90X3JpZ2h0LCByaWdodF9kaW1zKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAwLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfdF9yZXN1bHQoZF90X3Jlc3VsdCk7CiAKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGRfdF9sZWZ0LCB0X2xlZnQuZGF0YSgpLCB0X2xlZnRfYnl0ZXMpOwogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZF90X3JpZ2h0LCB0X3JpZ2h0LmRhdGEoKSwgdF9yaWdodF9ieXRlcyk7CiAKICAgZ3B1X3RfcmVzdWx0LmRldmljZShzeWNsX2RldmljZSkgPSBncHVfdF9sZWZ0LmNvbnRyYWN0KGdwdV90X3JpZ2h0LCBkaW1zKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRfcmVzdWx0X2dwdS5kYXRhKCksIGRfdF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3Jlc3VsdF9ieXRlcyk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0X3Jlc3VsdF9ncHUuZGF0YSgpLCBkX3RfcmVzdWx0LCB0X3Jlc3VsdF9ieXRlcyk7CiAKICAgdF9yZXN1bHQgPSB0X2xlZnQuY29udHJhY3QodF9yaWdodCwgZGltcyk7CiAKLSAgaWYgKHN0YXRpY19jYXN0PERhdGFUeXBlPihzdGQ6OmZhYnMoc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KAotICAgICAgICAgIHRfcmVzdWx0KCkgLSB0X3Jlc3VsdF9ncHUoKSkpKSA+IGVycm9yX3RocmVzaG9sZCAmJgorICBpZiAoc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KHN0ZDo6ZmFicyhzdGF0aWNfY2FzdDxEYXRhVHlwZT4odF9yZXN1bHQoKSAtIHRfcmVzdWx0X2dwdSgpKSkpID4gZXJyb3JfdGhyZXNob2xkICYmCiAgICAgICAhRWlnZW46OmludGVybmFsOjppc0FwcHJveCh0X3Jlc3VsdCgpLCB0X3Jlc3VsdF9ncHUoKSwgZXJyb3JfdGhyZXNob2xkKSkgewotICAgIHN0ZDo6Y291dCA8PCAiSzogIiA8PCBrX3NpemUgPDwgIiwgTjogIiA8PCBuX3NpemUgPDwgIiwgTTogIiA8PCBtX3NpemUKLSAgICAgICAgICAgICAgPDwgIiA6IG1pc21hdGNoIGRldGVjdGVkOiAiIDw8IHRfcmVzdWx0KCkgPDwgIiB2cyAiCi0gICAgICAgICAgICAgIDw8IHRfcmVzdWx0X2dwdSgpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIks6ICIgPDwga19zaXplIDw8ICIsIE46ICIgPDwgbl9zaXplIDw8ICIsIE06ICIgPDwgbV9zaXplIDw8ICIgOiBtaXNtYXRjaCBkZXRlY3RlZDogIiA8PCB0X3Jlc3VsdCgpCisgICAgICAgICAgICAgIDw8ICIgdnMgIiA8PCB0X3Jlc3VsdF9ncHUoKSA8PCBzdGQ6OmVuZGw7CiAgICAgVkVSSUZZX0lTX0FQUFJPWCh0X3Jlc3VsdF9ncHUoKSwgdF9yZXN1bHQoKSk7CiAgIH0KIApAQCAtMzE1LDEzICsyNjYsMTAgQEAKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShkX3RfcmVzdWx0KTsKIH0KIAotdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgSW5kZXhUeXBlLAotICAgICAgICAgIHR5cGVuYW1lIERldmljZT4KLXZvaWQgY29udHJhY3Rpb25fYmF0Y2goY29uc3QgRGV2aWNlICZzeWNsX2RldmljZSwgSW5kZXhUeXBlIG1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhUeXBlIGtfc2l6ZSwgSW5kZXhUeXBlIG5fc2l6ZSwgSW5kZXhUeXBlIG1fYmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgIEluZGV4VHlwZSBzdGFydCwgSW5kZXhUeXBlIGxpbWl0KSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OjpEaW1lbnNpb25QYWlyCi0gICAgICBEaW1QYWlyOwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgSW5kZXhUeXBlLCB0eXBlbmFtZSBEZXZpY2U+Cit2b2lkIGNvbnRyYWN0aW9uX2JhdGNoKGNvbnN0IERldmljZSAmc3ljbF9kZXZpY2UsIEluZGV4VHlwZSBtX3NpemUsIEluZGV4VHlwZSBrX3NpemUsIEluZGV4VHlwZSBuX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIEluZGV4VHlwZSBtX2JhdGNoLCBJbmRleFR5cGUgc3RhcnQsIEluZGV4VHlwZSBsaW1pdCkgeworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOwogICBzdGF0aWMgY29uc3QgRGF0YVR5cGUgZXJyb3JfdGhyZXNob2xkID0gRGF0YVR5cGUoMWUtNCk7CiAgIHR5cGVkZWYgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMz4gVGVuc29yRGltOwogICB0eXBlZGVmIEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gVGVuc29yVHlwZTsKQEAgLTM0MiwxMiArMjkwLDkgQEAKICAgc3RkOjpzaXplX3QgdF9yaWdodF9ieXRlcyA9IHRfcmlnaHQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKICAgc3RkOjpzaXplX3QgdF9yZXN1bHRfYnl0ZXMgPSB0X3Jlc3VsdC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogCi0gIERhdGFUeXBlICpkX3RfbGVmdCA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X2xlZnRfYnl0ZXMpKTsKLSAgRGF0YVR5cGUgKmRfdF9yaWdodCA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X3JpZ2h0X2J5dGVzKSk7Ci0gIERhdGFUeXBlICpkX3RfcmVzdWx0ID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfcmVzdWx0X2J5dGVzKSk7CisgIERhdGFUeXBlICpkX3RfbGVmdCA9IHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfbGVmdF9ieXRlcykpOworICBEYXRhVHlwZSAqZF90X3JpZ2h0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9yaWdodF9ieXRlcykpOworICBEYXRhVHlwZSAqZF90X3Jlc3VsdCA9IHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfcmVzdWx0X2J5dGVzKSk7CiAKICAgRWlnZW46OlRlbnNvck1hcDxUZW5zb3JUeXBlPiBncHVfdF9sZWZ0KGRfdF9sZWZ0LCBsZWZ0X2RpbXMpOwogICBFaWdlbjo6VGVuc29yTWFwPFRlbnNvclR5cGU+IGdwdV90X3JpZ2h0KGRfdF9yaWdodCwgcmlnaHRfZGltcyk7CkBAIC0zNjEsOCArMzA2LDcgQEAKICAgICBhdXRvIHogPSBncHVfdF9yZXN1bHQudGVtcGxhdGUgY2hpcDwwPihpKTsKICAgICB6LmRldmljZShzeWNsX2RldmljZSkgPSB4LmNvbnRyYWN0KHksIGNvbnRyYWN0X3BhaXJzKTsKICAgfQotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodF9yZXN1bHRfZ3B1LmRhdGEoKSwgZF90X3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfcmVzdWx0X2J5dGVzKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRfcmVzdWx0X2dwdS5kYXRhKCksIGRfdF9yZXN1bHQsIHRfcmVzdWx0X2J5dGVzKTsKIAogICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsaW1pdDsgKytpKSB7CiAgICAgYXV0byB4ID0gdF9sZWZ0LnRlbXBsYXRlIGNoaXA8MD4oaSk7CkBAIC0zNzIsMTYgKzMxNiwxNCBAQAogICB9CiAKICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCB0X3Jlc3VsdC5zaXplKCk7IGkrKykgewotICAgIGlmIChzdGF0aWNfY2FzdDxEYXRhVHlwZT4oc3RkOjpmYWJzKHN0YXRpY19jYXN0PERhdGFUeXBlPigKLSAgICAgICAgICAgIHRfcmVzdWx0KGkpIC0gdF9yZXN1bHRfZ3B1KGkpKSkpIDwgZXJyb3JfdGhyZXNob2xkKSB7CisgICAgaWYgKHN0YXRpY19jYXN0PERhdGFUeXBlPihzdGQ6OmZhYnMoc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KHRfcmVzdWx0KGkpIC0gdF9yZXN1bHRfZ3B1KGkpKSkpIDwgZXJyb3JfdGhyZXNob2xkKSB7CiAgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKEVpZ2VuOjppbnRlcm5hbDo6aXNBcHByb3godF9yZXN1bHQoaSksIHRfcmVzdWx0X2dwdShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl90aHJlc2hvbGQpKSB7CisgICAgaWYgKEVpZ2VuOjppbnRlcm5hbDo6aXNBcHByb3godF9yZXN1bHQoaSksIHRfcmVzdWx0X2dwdShpKSwgZXJyb3JfdGhyZXNob2xkKSkgewogICAgICAgY29udGludWU7CiAgICAgfQotICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgSW5kZXhUeXBlICIgPDwgaSA8PCAiOiAiIDw8IHRfcmVzdWx0KGkpCi0gICAgICAgICAgICAgIDw8ICIgdnMgIiA8PCB0X3Jlc3VsdF9ncHUoaSkgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgSW5kZXhUeXBlICIgPDwgaSA8PCAiOiAiIDw8IHRfcmVzdWx0KGkpIDw8ICIgdnMgIiA8PCB0X3Jlc3VsdF9ncHUoaSkKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICAgIFZFUklGWV9JU19BUFBST1godF9yZXN1bHRfZ3B1KGkpLCB0X3Jlc3VsdChpKSk7CiAgIH0KICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShkX3RfbGVmdCk7CkBAIC0zODksMTIgKzMzMSw5IEBACiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZF90X3Jlc3VsdCk7CiB9CiAKLXRlbXBsYXRlIDxpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZSwKLSAgICAgICAgICB0eXBlbmFtZSBEZXZpY2U+Ci12b2lkIGNvbnRyYWN0aW9uX3Joc190cmFuc3Bvc2VkKGNvbnN0IERldmljZSAmc3ljbF9kZXZpY2UsIEluZGV4VHlwZSBtX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4VHlwZSBrX3NpemUsIEluZGV4VHlwZSBuX3NpemUpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvblBhaXIKLSAgICAgIERpbVBhaXI7Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIERldmljZT4KK3ZvaWQgY29udHJhY3Rpb25fcmhzX3RyYW5zcG9zZWQoY29uc3QgRGV2aWNlICZzeWNsX2RldmljZSwgSW5kZXhUeXBlIG1fc2l6ZSwgSW5kZXhUeXBlIGtfc2l6ZSwgSW5kZXhUeXBlIG5fc2l6ZSkgeworICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOwogICBzdGF0aWMgY29uc3QgRGF0YVR5cGUgZXJyb3JfdGhyZXNob2xkID0gRGF0YVR5cGUoMWUtNCk7CiAgIEVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDI+IGxlZnRfZGltcyA9IHt7bV9zaXplLCBrX3NpemV9fTsKICAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMj4gcmlnaHRfZGltcyA9IHt7bl9zaXplLCBrX3NpemV9fTsKQEAgLTQxMyw0MiArMzUyLDMzIEBACiAgIHN0ZDo6c2l6ZV90IHRfcmlnaHRfYnl0ZXMgPSB0X3JpZ2h0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAgIHN0ZDo6c2l6ZV90IHRfcmVzdWx0X2J5dGVzID0gdF9yZXN1bHQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKIAotICBEYXRhVHlwZSAqZF90X2xlZnQgPQotICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9sZWZ0X2J5dGVzKSk7Ci0gIERhdGFUeXBlICpkX3RfcmlnaHQgPQotICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9yaWdodF9ieXRlcykpOwotICBEYXRhVHlwZSAqZF90X3Jlc3VsdCA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X3Jlc3VsdF9ieXRlcykpOworICBEYXRhVHlwZSAqZF90X2xlZnQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X2xlZnRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUgKmRfdF9yaWdodCA9IHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfcmlnaHRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUgKmRfdF9yZXN1bHQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X3Jlc3VsdF9ieXRlcykpOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4KLSAgICAgIGdwdV90X2xlZnQoZF90X2xlZnQsIGxlZnRfZGltcyk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4KLSAgICAgIGdwdV90X3JpZ2h0KGRfdF9yaWdodCwgcmlnaHRfZGltcyk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4KLSAgICAgIGdwdV90X3Jlc3VsdChkX3RfcmVzdWx0LCByZXNfZGltcyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3RfbGVmdChkX3RfbGVmdCwgbGVmdF9kaW1zKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfdF9yaWdodChkX3RfcmlnaHQsIHJpZ2h0X2RpbXMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV90X3Jlc3VsdChkX3RfcmVzdWx0LCByZXNfZGltcyk7CiAKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGRfdF9sZWZ0LCB0X2xlZnQuZGF0YSgpLCB0X2xlZnRfYnl0ZXMpOwogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZF90X3JpZ2h0LCB0X3JpZ2h0LmRhdGEoKSwgdF9yaWdodF9ieXRlcyk7CiAKICAgZ3B1X3RfcmVzdWx0LmRldmljZShzeWNsX2RldmljZSkgPSBncHVfdF9sZWZ0LmNvbnRyYWN0KGdwdV90X3JpZ2h0LCBkaW1zKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRfcmVzdWx0X2dwdS5kYXRhKCksIGRfdF9yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3Jlc3VsdF9ieXRlcyk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0X3Jlc3VsdF9ncHUuZGF0YSgpLCBkX3RfcmVzdWx0LCB0X3Jlc3VsdF9ieXRlcyk7CiAKICAgdF9yZXN1bHQgPSB0X2xlZnQuY29udHJhY3QodF9yaWdodCwgZGltcyk7CiAKICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCBtX3NpemU7IGorKykgewogICAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgbl9zaXplOyBpKyspIHsKLSAgICAgIGlmIChzdGF0aWNfY2FzdDxEYXRhVHlwZT4oc3RkOjpmYWJzKHN0YXRpY19jYXN0PERhdGFUeXBlPigKLSAgICAgICAgICAgICAgdF9yZXN1bHQoaiwgaSkgLSB0X3Jlc3VsdF9ncHUoaiwgaSkpKSkgPCBlcnJvcl90aHJlc2hvbGQpIHsKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxEYXRhVHlwZT4oc3RkOjpmYWJzKHN0YXRpY19jYXN0PERhdGFUeXBlPih0X3Jlc3VsdChqLCBpKSAtIHRfcmVzdWx0X2dwdShqLCBpKSkpKSA8CisgICAgICAgICAgZXJyb3JfdGhyZXNob2xkKSB7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQotICAgICAgaWYgKEVpZ2VuOjppbnRlcm5hbDo6aXNBcHByb3godF9yZXN1bHQoaiwgaSksIHRfcmVzdWx0X2dwdShqLCBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3RocmVzaG9sZCkpIHsKKyAgICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHRfcmVzdWx0KGosIGkpLCB0X3Jlc3VsdF9ncHUoaiwgaSksIGVycm9yX3RocmVzaG9sZCkpIHsKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAgICAgICBzdGQ6OmNvdXQgPDwgIk0gOiAiIDw8IG1fc2l6ZSA8PCAiLCBOIDogIiA8PCBuX3NpemUgPDwgIiwgSyA6ICIgPDwga19zaXplCi0gICAgICAgICAgICAgICAgPDwgIiwgbWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgSW5kZXhUeXBlIG06ICIgPDwgaiA8PCAiIG46ICIgPDwgaQotICAgICAgICAgICAgICAgIDw8ICIgQ1BVIDogIiA8PCB0X3Jlc3VsdChqLCBpKQorICAgICAgICAgICAgICAgIDw8ICIsIG1pc21hdGNoIGRldGVjdGVkIGF0IEluZGV4VHlwZSBtOiAiIDw8IGogPDwgIiBuOiAiIDw8IGkgPDwgIiBDUFUgOiAiIDw8IHRfcmVzdWx0KGosIGkpCiAgICAgICAgICAgICAgICAgPDwgIiB2cyBTWUNMOiIgPDwgdF9yZXN1bHRfZ3B1KGosIGkpIDw8IHN0ZDo6ZW5kbDsKICAgICAgIFZFUklGWV9JU19BUFBST1godF9yZXN1bHRfZ3B1KGosIGkpLCB0X3Jlc3VsdChqLCBpKSk7CiAgICAgfQpAQCAtNDU4LDEyICszODgsOSBAQAogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGRfdF9yZXN1bHQpOwogfQogCi10ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGUsCi0gICAgICAgICAgdHlwZW5hbWUgRGV2aWNlPgotdm9pZCBjb250cmFjdGlvbl9saHNfdHJhbnNwb3NlZChjb25zdCBEZXZpY2UgJnN5Y2xfZGV2aWNlLCBJbmRleFR5cGUgbV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleFR5cGUga19zaXplLCBJbmRleFR5cGUgbl9zaXplKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OjpEaW1lbnNpb25QYWlyCi0gICAgICBEaW1QYWlyOwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgSW5kZXhUeXBlLCB0eXBlbmFtZSBEZXZpY2U+Cit2b2lkIGNvbnRyYWN0aW9uX2xoc190cmFuc3Bvc2VkKGNvbnN0IERldmljZSAmc3ljbF9kZXZpY2UsIEluZGV4VHlwZSBtX3NpemUsIEluZGV4VHlwZSBrX3NpemUsIEluZGV4VHlwZSBuX3NpemUpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKICAgc3RhdGljIGNvbnN0IERhdGFUeXBlIGVycm9yX3RocmVzaG9sZCA9IERhdGFUeXBlKDFlLTQpOwogICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAyPiBsZWZ0X2RpbXMgPSB7e2tfc2l6ZSwgbV9zaXplfX07CiAgIEVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDI+IHJpZ2h0X2RpbXMgPSB7e2tfc2l6ZSwgbl9zaXplfX07CkBAIC00ODIsNDEgKzQwOSwzMSBAQAogICBzdGQ6OnNpemVfdCB0X3JpZ2h0X2J5dGVzID0gdF9yaWdodC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogICBzdGQ6OnNpemVfdCB0X3Jlc3VsdF9ieXRlcyA9IHRfcmVzdWx0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAKLSAgRGF0YVR5cGUgKmRfdF9sZWZ0ID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfbGVmdF9ieXRlcykpOwotICBEYXRhVHlwZSAqZF90X3JpZ2h0ID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfcmlnaHRfYnl0ZXMpKTsKLSAgRGF0YVR5cGUgKmRfdF9yZXN1bHQgPQotICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9yZXN1bHRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUgKmRfdF9sZWZ0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9sZWZ0X2J5dGVzKSk7CisgIERhdGFUeXBlICpkX3RfcmlnaHQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X3JpZ2h0X2J5dGVzKSk7CisgIERhdGFUeXBlICpkX3RfcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9yZXN1bHRfYnl0ZXMpKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+Ci0gICAgICBncHVfdF9sZWZ0KGRfdF9sZWZ0LCBsZWZ0X2RpbXMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+Ci0gICAgICBncHVfdF9yaWdodChkX3RfcmlnaHQsIHJpZ2h0X2RpbXMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+Ci0gICAgICBncHVfdF9yZXN1bHQoZF90X3Jlc3VsdCwgcmVzX2RpbXMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV90X2xlZnQoZF90X2xlZnQsIGxlZnRfZGltcyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3RfcmlnaHQoZF90X3JpZ2h0LCByaWdodF9kaW1zKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfdF9yZXN1bHQoZF90X3Jlc3VsdCwgcmVzX2RpbXMpOwogCiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShkX3RfbGVmdCwgdF9sZWZ0LmRhdGEoKSwgdF9sZWZ0X2J5dGVzKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGRfdF9yaWdodCwgdF9yaWdodC5kYXRhKCksIHRfcmlnaHRfYnl0ZXMpOwogCiAgIGdwdV90X3Jlc3VsdC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X3RfbGVmdC5jb250cmFjdChncHVfdF9yaWdodCwgZGltcyk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0X3Jlc3VsdF9ncHUuZGF0YSgpLCBkX3RfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9yZXN1bHRfYnl0ZXMpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodF9yZXN1bHRfZ3B1LmRhdGEoKSwgZF90X3Jlc3VsdCwgdF9yZXN1bHRfYnl0ZXMpOwogCiAgIHRfcmVzdWx0ID0gdF9sZWZ0LmNvbnRyYWN0KHRfcmlnaHQsIGRpbXMpOwogCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgdF9yZXN1bHQuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KHN0ZDo6ZmFicyhzdGF0aWNfY2FzdDxEYXRhVHlwZT4oCi0gICAgICAgICAgICB0X3Jlc3VsdChpKSAtIHRfcmVzdWx0X2dwdShpKSkpKSA8IGVycm9yX3RocmVzaG9sZCkgeworICAgIGlmIChzdGF0aWNfY2FzdDxEYXRhVHlwZT4oc3RkOjpmYWJzKHN0YXRpY19jYXN0PERhdGFUeXBlPih0X3Jlc3VsdChpKSAtIHRfcmVzdWx0X2dwdShpKSkpKSA8IGVycm9yX3RocmVzaG9sZCkgewogICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHRfcmVzdWx0KGkpLCB0X3Jlc3VsdF9ncHUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfdGhyZXNob2xkKSkgeworICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHRfcmVzdWx0KGkpLCB0X3Jlc3VsdF9ncHUoaSksIGVycm9yX3RocmVzaG9sZCkpIHsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBzdGQ6OmNvdXQgPDwgIk0gOiAiIDw8IG1fc2l6ZSA8PCAiLCBOIDogIiA8PCBuX3NpemUgPDwgIiwgSyA6ICIgPDwga19zaXplCi0gICAgICAgICAgICAgIDw8ICIsIG1pc21hdGNoIGRldGVjdGVkIGF0IEluZGV4VHlwZSAiIDw8IGkgPDwgIjogIiA8PCB0X3Jlc3VsdChpKQotICAgICAgICAgICAgICA8PCAiIHZzICIgPDwgdF9yZXN1bHRfZ3B1KGkpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIk0gOiAiIDw8IG1fc2l6ZSA8PCAiLCBOIDogIiA8PCBuX3NpemUgPDwgIiwgSyA6ICIgPDwga19zaXplIDw8ICIsIG1pc21hdGNoIGRldGVjdGVkIGF0IEluZGV4VHlwZSAiCisgICAgICAgICAgICAgIDw8IGkgPDwgIjogIiA8PCB0X3Jlc3VsdChpKSA8PCAiIHZzICIgPDwgdF9yZXN1bHRfZ3B1KGkpIDw8IHN0ZDo6ZW5kbDsKICAgICBWRVJJRllfSVNfQVBQUk9YKHRfcmVzdWx0X2dwdShpKSwgdF9yZXN1bHQoaSkpOwogICB9CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZF90X2xlZnQpOwpAQCAtNTI0LDEyICs0NDEsOSBAQAogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGRfdF9yZXN1bHQpOwogfQogCi10ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGUsCi0gICAgICAgICAgdHlwZW5hbWUgRGV2aWNlPgotdm9pZCBjb250cmFjdGlvbl9ib3RoX3RyYW5zcG9zZWQoY29uc3QgRGV2aWNlICZzeWNsX2RldmljZSwgSW5kZXhUeXBlIG1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4VHlwZSBrX3NpemUsIEluZGV4VHlwZSBuX3NpemUpIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvblBhaXIKLSAgICAgIERpbVBhaXI7Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGUsIHR5cGVuYW1lIERldmljZT4KK3ZvaWQgY29udHJhY3Rpb25fYm90aF90cmFuc3Bvc2VkKGNvbnN0IERldmljZSAmc3ljbF9kZXZpY2UsIEluZGV4VHlwZSBtX3NpemUsIEluZGV4VHlwZSBrX3NpemUsIEluZGV4VHlwZSBuX3NpemUpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKICAgc3RhdGljIGNvbnN0IERhdGFUeXBlIGVycm9yX3RocmVzaG9sZCA9IERhdGFUeXBlKDFlLTQpOwogICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAyPiBsZWZ0X2RpbXMgPSB7e2tfc2l6ZSwgbV9zaXplfX07CiAgIEVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDI+IHJpZ2h0X2RpbXMgPSB7e25fc2l6ZSwga19zaXplfX07CkBAIC01NDgsNDEgKzQ2MiwzMSBAQAogICBzdGQ6OnNpemVfdCB0X3JpZ2h0X2J5dGVzID0gdF9yaWdodC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogICBzdGQ6OnNpemVfdCB0X3Jlc3VsdF9ieXRlcyA9IHRfcmVzdWx0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAKLSAgRGF0YVR5cGUgKmRfdF9sZWZ0ID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfbGVmdF9ieXRlcykpOwotICBEYXRhVHlwZSAqZF90X3JpZ2h0ID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlICo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfcmlnaHRfYnl0ZXMpKTsKLSAgRGF0YVR5cGUgKmRfdF9yZXN1bHQgPQotICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9yZXN1bHRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUgKmRfdF9sZWZ0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9sZWZ0X2J5dGVzKSk7CisgIERhdGFUeXBlICpkX3RfcmlnaHQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSAqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X3JpZ2h0X2J5dGVzKSk7CisgIERhdGFUeXBlICpkX3RfcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUgKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9yZXN1bHRfYnl0ZXMpKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+Ci0gICAgICBncHVfdF9sZWZ0KGRfdF9sZWZ0LCBsZWZ0X2RpbXMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+Ci0gICAgICBncHVfdF9yaWdodChkX3RfcmlnaHQsIHJpZ2h0X2RpbXMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+Ci0gICAgICBncHVfdF9yZXN1bHQoZF90X3Jlc3VsdCwgcmVzX2RpbXMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV90X2xlZnQoZF90X2xlZnQsIGxlZnRfZGltcyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3RfcmlnaHQoZF90X3JpZ2h0LCByaWdodF9kaW1zKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfdF9yZXN1bHQoZF90X3Jlc3VsdCwgcmVzX2RpbXMpOwogCiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShkX3RfbGVmdCwgdF9sZWZ0LmRhdGEoKSwgdF9sZWZ0X2J5dGVzKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGRfdF9yaWdodCwgdF9yaWdodC5kYXRhKCksIHRfcmlnaHRfYnl0ZXMpOwogCiAgIGdwdV90X3Jlc3VsdC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X3RfbGVmdC5jb250cmFjdChncHVfdF9yaWdodCwgZGltcyk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0X3Jlc3VsdF9ncHUuZGF0YSgpLCBkX3RfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9yZXN1bHRfYnl0ZXMpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodF9yZXN1bHRfZ3B1LmRhdGEoKSwgZF90X3Jlc3VsdCwgdF9yZXN1bHRfYnl0ZXMpOwogCiAgIHRfcmVzdWx0ID0gdF9sZWZ0LmNvbnRyYWN0KHRfcmlnaHQsIGRpbXMpOwogCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgdF9yZXN1bHQuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KHN0ZDo6ZmFicyhzdGF0aWNfY2FzdDxEYXRhVHlwZT4oCi0gICAgICAgICAgICB0X3Jlc3VsdChpKSAtIHRfcmVzdWx0X2dwdShpKSkpKSA8IGVycm9yX3RocmVzaG9sZCkgeworICAgIGlmIChzdGF0aWNfY2FzdDxEYXRhVHlwZT4oc3RkOjpmYWJzKHN0YXRpY19jYXN0PERhdGFUeXBlPih0X3Jlc3VsdChpKSAtIHRfcmVzdWx0X2dwdShpKSkpKSA8IGVycm9yX3RocmVzaG9sZCkgewogICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHRfcmVzdWx0KGkpLCB0X3Jlc3VsdF9ncHUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfdGhyZXNob2xkKSkgeworICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHRfcmVzdWx0KGkpLCB0X3Jlc3VsdF9ncHUoaSksIGVycm9yX3RocmVzaG9sZCkpIHsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBzdGQ6OmNvdXQgPDwgIk0gOiAiIDw8IG1fc2l6ZSA8PCAiLCBOIDogIiA8PCBuX3NpemUgPDwgIiwgSyA6ICIgPDwga19zaXplCi0gICAgICAgICAgICAgIDw8ICIsIG1pc21hdGNoIGRldGVjdGVkIGF0IEluZGV4VHlwZSAiIDw8IGkgPDwgIjogIiA8PCB0X3Jlc3VsdChpKQotICAgICAgICAgICAgICA8PCAiIHZzICIgPDwgdF9yZXN1bHRfZ3B1KGkpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIk0gOiAiIDw8IG1fc2l6ZSA8PCAiLCBOIDogIiA8PCBuX3NpemUgPDwgIiwgSyA6ICIgPDwga19zaXplIDw8ICIsIG1pc21hdGNoIGRldGVjdGVkIGF0IEluZGV4VHlwZSAiCisgICAgICAgICAgICAgIDw8IGkgPDwgIjogIiA8PCB0X3Jlc3VsdChpKSA8PCAiIHZzICIgPDwgdF9yZXN1bHRfZ3B1KGkpIDw8IHN0ZDo6ZW5kbDsKIAogICAgIFZFUklGWV9JU19BUFBST1godF9yZXN1bHRfZ3B1KGkpLCB0X3Jlc3VsdChpKSk7CiAgIH0KQEAgLTU5OCwzMSArNTAyLDIwIEBACiAgIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IHN0YXJ0LCBlbmQ7CiAgIHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CiAgIC8vIFRlc3Qgb3V0IG9mIGJvdW5kIGZvciBUZW5zb3ItVGVuc29yCi0gIHRlc3Rfbm9fb3V0X29mX2JvdW5kczxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEwLCAxMDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQpOwotICB0ZXN0X25vX291dF9vZl9ib3VuZHM8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMDI0LCAxMDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYpOwotICB0ZXN0X25vX291dF9vZl9ib3VuZHM8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA0MDk2LCAxMDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDgpOwotICB0ZXN0X25vX291dF9vZl9ib3VuZHM8Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA3ODQsIDIwNDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCk7Ci0gIHRlc3Rfbm9fb3V0X29mX2JvdW5kczxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDIwNDgsIDEwMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzg0KTsKLSAgdGVzdF9ub19vdXRfb2ZfYm91bmRzPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTAsIDEwMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTApOwotICB0ZXN0X25vX291dF9vZl9ib3VuZHM8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA1MTMsIDQwOTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEzKTsKLSAgdGVzdF9ub19vdXRfb2ZfYm91bmRzPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNzgzLCAxMDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc4Myk7Ci0gIHRlc3Rfbm9fb3V0X29mX2JvdW5kczxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDc4NCwgMjA0OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ODQpOwotICB0ZXN0X25vX291dF9vZl9ib3VuZHM8Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMSwgMTAyNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSk7CisgIHRlc3Rfbm9fb3V0X29mX2JvdW5kczxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEwLCAxMDI0LCAxMDI0KTsKKyAgdGVzdF9ub19vdXRfb2ZfYm91bmRzPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTAyNCwgMTAyNCwgNDA5Nik7CisgIHRlc3Rfbm9fb3V0X29mX2JvdW5kczxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDQwOTYsIDEwMjQsIDIwNDgpOworICB0ZXN0X25vX291dF9vZl9ib3VuZHM8Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA3ODQsIDIwNDgsIDEwMjQpOworICB0ZXN0X25vX291dF9vZl9ib3VuZHM8Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAyMDQ4LCAxMDI0LCA3ODQpOworICB0ZXN0X25vX291dF9vZl9ib3VuZHM8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMCwgMTAyNCwgMTApOworICB0ZXN0X25vX291dF9vZl9ib3VuZHM8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA1MTMsIDQwOTYsIDUxMyk7CisgIHRlc3Rfbm9fb3V0X29mX2JvdW5kczxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDc4MywgMTAyNCwgNzgzKTsKKyAgdGVzdF9ub19vdXRfb2ZfYm91bmRzPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNzg0LCAyMDQ4LCA3ODQpOworICB0ZXN0X25vX291dF9vZl9ib3VuZHM8Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMSwgMTAyNCwgMTEpOwogICBlbmQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gZWxhcHNlZF9zZWNvbmRzID0gZW5kIC0gc3RhcnQ7CiAgIHN0ZDo6dGltZV90IGVuZF90aW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90KGVuZCk7Ci0gIHN0ZDo6Y291dCA8PCAidGVuc29yIG91dCBvZiBib3VuZCB0ZXN0cyBmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiCi0gICAgICAgICAgICA8PCBzdGQ6OmN0aW1lKCZlbmRfdGltZSkKKyAgc3RkOjpjb3V0IDw8ICJ0ZW5zb3Igb3V0IG9mIGJvdW5kIHRlc3RzIGZpbmlzaGVkIGNvbXB1dGF0aW9uIGF0ICIgPDwgc3RkOjpjdGltZSgmZW5kX3RpbWUpCiAgICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lOiAiIDw8IGVsYXBzZWRfc2Vjb25kcy5jb3VudCgpIDw8ICJzXG4iOwogfQogCkBAIC02MzMsMTUgKzUyNiwxMiBAQAogICBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrPiBzdGFydCwgZW5kOwogICBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICAvLyBUZW5zb3IgVGVuc29yIENvbnRyYWN0aW9uCi0gIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEyOCwgMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCk7Ci0gIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEyOCwgMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCk7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEyOCwgMTI4LCAxMjgpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMjgsIDEyOCwgMTI4KTsKICAgZW5kID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CiAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IGVsYXBzZWRfc2Vjb25kcyA9IGVuZCAtIHN0YXJ0OwogICBzdGQ6OnRpbWVfdCBlbmRfdGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRvX3RpbWVfdChlbmQpOwotICBzdGQ6OmNvdXQgPDwgInRlbnNvciB0ZW5zb3IgdGVzdHMgZmluaXNoZWQgY29tcHV0YXRpb24gYXQgIgotICAgICAgICAgICAgPDwgc3RkOjpjdGltZSgmZW5kX3RpbWUpCisgIHN0ZDo6Y291dCA8PCAidGVuc29yIHRlbnNvciB0ZXN0cyBmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKQogICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZTogIiA8PCBlbGFwc2VkX3NlY29uZHMuY291bnQoKSA8PCAic1xuIjsKIH0KIApAQCAtNjU4LDggKzU0OCw3IEBACiAgIGVuZCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBlbGFwc2VkX3NlY29uZHMgPSBlbmQgLSBzdGFydDsKICAgc3RkOjp0aW1lX3QgZW5kX3RpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QoZW5kKTsKLSAgc3RkOjpjb3V0IDw8ICJ0ZW5zb3IgdGVuc29yIHRlc3RzIGZpbmlzaGVkIGNvbXB1dGF0aW9uIGF0ICIKLSAgICAgICAgICAgIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKQorICBzdGQ6OmNvdXQgPDwgInRlbnNvciB0ZW5zb3IgdGVzdHMgZmluaXNoZWQgY29tcHV0YXRpb24gYXQgIiA8PCBzdGQ6OmN0aW1lKCZlbmRfdGltZSkKICAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWU6ICIgPDwgZWxhcHNlZF9zZWNvbmRzLmNvdW50KCkgPDwgInNcbiI7CiB9CiAKQEAgLTY3Niw4ICs1NjUsNyBAQAogICBlbmQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gZWxhcHNlZF9zZWNvbmRzID0gZW5kIC0gc3RhcnQ7CiAgIHN0ZDo6dGltZV90IGVuZF90aW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90KGVuZCk7Ci0gIHN0ZDo6Y291dCA8PCAidGVuc29yIHRlbnNvciB0ZXN0cyBmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiCi0gICAgICAgICAgICA8PCBzdGQ6OmN0aW1lKCZlbmRfdGltZSkKKyAgc3RkOjpjb3V0IDw8ICJ0ZW5zb3IgdGVuc29yIHRlc3RzIGZpbmlzaGVkIGNvbXB1dGF0aW9uIGF0ICIgPDwgc3RkOjpjdGltZSgmZW5kX3RpbWUpCiAgICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lOiAiIDw8IGVsYXBzZWRfc2Vjb25kcy5jb3VudCgpIDw8ICJzXG4iOwogfQogCkBAIC02OTMsOCArNTgxLDcgQEAKICAgZW5kID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CiAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IGVsYXBzZWRfc2Vjb25kcyA9IGVuZCAtIHN0YXJ0OwogICBzdGQ6OnRpbWVfdCBlbmRfdGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRvX3RpbWVfdChlbmQpOwotICBzdGQ6OmNvdXQgPDwgInRlbnNvciB0ZW5zb3IgdGVzdHMgZmluaXNoZWQgY29tcHV0YXRpb24gYXQgIgotICAgICAgICAgICAgPDwgc3RkOjpjdGltZSgmZW5kX3RpbWUpCisgIHN0ZDo6Y291dCA8PCAidGVuc29yIHRlbnNvciB0ZXN0cyBmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKQogICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZTogIiA8PCBlbGFwc2VkX3NlY29uZHMuY291bnQoKSA8PCAic1xuIjsKIH0KIApAQCAtNzExLDggKzU5OCw3IEBACiAgIGVuZCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBlbGFwc2VkX3NlY29uZHMgPSBlbmQgLSBzdGFydDsKICAgc3RkOjp0aW1lX3QgZW5kX3RpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QoZW5kKTsKLSAgc3RkOjpjb3V0IDw8ICJ0ZW5zb3IgdGVuc29yIHRlc3RzIGZpbmlzaGVkIGNvbXB1dGF0aW9uIGF0ICIKLSAgICAgICAgICAgIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKQorICBzdGQ6OmNvdXQgPDwgInRlbnNvciB0ZW5zb3IgdGVzdHMgZmluaXNoZWQgY29tcHV0YXRpb24gYXQgIiA8PCBzdGQ6OmN0aW1lKCZlbmRfdGltZSkKICAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWU6ICIgPDwgZWxhcHNlZF9zZWNvbmRzLmNvdW50KCkgPDwgInNcbiI7CiB9CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGV2PgpAQCAtNzIyLDI0ICs2MDgsMTcgQEAKICAgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jaz4gc3RhcnQsIGVuZDsKICAgc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKICAgLy8gVkVDVE9SLVZFQ1RPUgotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMDI1LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjUpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMDI1LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjUpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMDI0LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMDI0LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMDIzLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjMpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMDIzLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjMpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMDI1LCAxLCAxMDI1KTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTAyNSwgMSwgMTAyNSk7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEwMjQsIDEsIDEwMjQpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMDI0LCAxLCAxMDI0KTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTAyMywgMSwgMTAyMyk7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEwMjMsIDEsIDEwMjMpOwogCiAgIGVuZCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBlbGFwc2VkX3NlY29uZHMgPSBlbmQgLSBzdGFydDsKICAgc3RkOjp0aW1lX3QgZW5kX3RpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QoZW5kKTsKLSAgc3RkOjpjb3V0IDw8ICJjb250cmFjdGVkIHRlbnNvciB0ZXN0cyBmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiCi0gICAgICAgICAgICA8PCBzdGQ6OmN0aW1lKCZlbmRfdGltZSkKKyAgc3RkOjpjb3V0IDw8ICJjb250cmFjdGVkIHRlbnNvciB0ZXN0cyBmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKQogICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZTogIiA8PCBlbGFwc2VkX3NlY29uZHMuY291bnQoKSA8PCAic1xuIjsKIH0KIApAQCAtNzUwLDM5ICs2MjksMjYgQEAKICAgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jaz4gc3RhcnQsIGVuZDsKICAgc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKICAgLy8gVmVjdG9yLVRlbnNvcgotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxLCAxMDI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjUpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxLCAxMDI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjUpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxLCAxMDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxLCAxMDI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxLCAxMDIzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjMpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxLCAxMDIzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjMpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxLCAxMDI1LCAxMDI1KTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMSwgMTAyNSwgMTAyNSk7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEsIDEwMjQsIDEwMjQpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxLCAxMDI0LCAxMDI0KTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMSwgMTAyMywgMTAyMyk7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEsIDEwMjMsIDEwMjMpOwogCi0gIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEsIDQwOTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5Nyk7Ci0gIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEsIDQwOTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5Nyk7Ci0gIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEsIDQwOTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5Nik7Ci0gIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEsIDQwOTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5Nik7Ci0gIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEsIDQwOTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NSk7Ci0gIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEsIDQwOTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NSk7Ci0gIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEsIDgwMjgxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMik7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEsIDQwOTcsIDQwOTcpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxLCA0MDk3LCA0MDk3KTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMSwgNDA5NiwgNDA5Nik7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEsIDQwOTYsIDQwOTYpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxLCA0MDk1LCA0MDk1KTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMSwgNDA5NSwgNDA5NSk7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEsIDgwMjgxNiwgMzIpOwogCiAgIGVuZCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBlbGFwc2VkX3NlY29uZHMgPSBlbmQgLSBzdGFydDsKICAgc3RkOjp0aW1lX3QgZW5kX3RpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QoZW5kKTsKLSAgc3RkOjpjb3V0IDw8ICJmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZTogIiA8PCBlbGFwc2VkX3NlY29uZHMuY291bnQoKSA8PCAic1xuIjsKKyAgc3RkOjpjb3V0IDw8ICJmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKSA8PCAiZWxhcHNlZCB0aW1lOiAiIDw8IGVsYXBzZWRfc2Vjb25kcy5jb3VudCgpCisgICAgICAgICAgICA8PCAic1xuIjsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERldj4KQEAgLTc5Miw0NSArNjU4LDMyIEBACiAgIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IHN0YXJ0LCBlbmQ7CiAgIHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CiAgIC8vIE1hdHJpeC1WZWN0b3IKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTAyNSwgMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTEyNSwgMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTIyNCwgMTAyNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTAyNCwgMTAyNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTAyMywgMTAyMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTAyMywgMTAyMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNDA5NywgNDE5NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNDA5NywgNDA5NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNDA5NiwgNDA5NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNDA5NiwgODE5NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNDA5NSwgNDA5NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNDA5NSwgNDA5NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTAyNSwgMTAyNSwgMSk7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDExMjUsIDEwMjUsIDEpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMjI0LCAxMDI0LCAxKTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTAyNCwgMTAyNCwgMSk7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEwMjMsIDEwMjMsIDEpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMDIzLCAxMDIzLCAxKTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNDA5NywgNDE5NywgMSk7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDQwOTcsIDQwOTcsIDEpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA0MDk2LCA0MDk2LCAxKTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNDA5NiwgODE5NiwgMSk7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDQwOTUsIDQwOTUsIDEpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA0MDk1LCA0MDk1LCAxKTsKIC8vIElmIHRoZSBHRU1WIGRpc2FibGVkIGl0IHdpbGwgY3JlYXRlcyBvbmUga2VybmVsIHRvIGNhbGN1bGF0ZSB0aGUgY29udHJhY3Rpb24uCiAvLyBUaGVyZWZvcmUgdGhlIGFjdW11YXRpb24gb2YgZmxvYXQgbnVtYmVyIHdpbGwgb3ZlcmZsb3cgdGhlIHByZWNpc2lvbgogLy8gdGhyZXNob2xkIGZvciBmbG9hdCBhbmQgY2F1c2UgdGhlIHRlc3QgdG8gZmFpbC4gV2hpbGUgaXQgdGhlIEdNViBtdWx0aXBsZQogLy8ga2VybmVsIHdpbGwgYmUgY3JlYXRlZCBhbmQgZWFjaCBvbmUgcnVuIHRoZSBvdmVyZmxvdyBvZiBhY2N1bXV0YXRpb24gYnJlYWtzCiAvLyBhbW9uZyB0aGUga2VybmVscy4KICNpZm5kZWYgRUlHRU5fU1lDTF9ESVNBQkxFX0dFTVYKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMzIsIDgwMjAzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMzIsIDgwMjAzMiwgMSk7CiAjZW5kaWYKIAogICBlbmQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gZWxhcHNlZF9zZWNvbmRzID0gZW5kIC0gc3RhcnQ7CiAgIHN0ZDo6dGltZV90IGVuZF90aW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90KGVuZCk7Ci0gIHN0ZDo6Y291dCA8PCAiZmluaXNoZWQgY29tcHV0YXRpb24gYXQgIiA8PCBzdGQ6OmN0aW1lKCZlbmRfdGltZSkKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWU6ICIgPDwgZWxhcHNlZF9zZWNvbmRzLmNvdW50KCkgPDwgInNcbiI7CisgIHN0ZDo6Y291dCA8PCAiZmluaXNoZWQgY29tcHV0YXRpb24gYXQgIiA8PCBzdGQ6OmN0aW1lKCZlbmRfdGltZSkgPDwgImVsYXBzZWQgdGltZTogIiA8PCBlbGFwc2VkX3NlY29uZHMuY291bnQoKQorICAgICAgICAgICAgPDwgInNcbiI7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXY+CkBAIC04NTAsOCArNzAzLDggQEAKICAgZW5kID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CiAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IGVsYXBzZWRfc2Vjb25kcyA9IGVuZCAtIHN0YXJ0OwogICBzdGQ6OnRpbWVfdCBlbmRfdGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRvX3RpbWVfdChlbmQpOwotICBzdGQ6OmNvdXQgPDwgImZpbmlzaGVkIGNvbXB1dGF0aW9uIGF0ICIgPDwgc3RkOjpjdGltZSgmZW5kX3RpbWUpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lOiAiIDw8IGVsYXBzZWRfc2Vjb25kcy5jb3VudCgpIDw8ICJzXG4iOworICBzdGQ6OmNvdXQgPDwgImZpbmlzaGVkIGNvbXB1dGF0aW9uIGF0ICIgPDwgc3RkOjpjdGltZSgmZW5kX3RpbWUpIDw8ICJlbGFwc2VkIHRpbWU6ICIgPDwgZWxhcHNlZF9zZWNvbmRzLmNvdW50KCkKKyAgICAgICAgICAgIDw8ICJzXG4iOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGV2PgpAQCAtODYyLDE5ICs3MTUsMTUgQEAKICAgc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKICAgLy8gVGVuc29yIFRlbnNvciBDb250cmFjdGlvbgogICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxNiwgNCwgMTYpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAyNTcsIDEzMTA3MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTcpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAyNTYsIDEzMTA3MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTYpOwotICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxNiwgMTMxMDczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTcsIDEzMTA3MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNyk7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDI1NywgMTMxMDczLCAyNTcpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAyNTYsIDEzMTA3MiwgMjU2KTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTYsIDEzMTA3MywgMTYpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxNywgMTMxMDcyLCAxNyk7CiAgIGVuZCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBlbGFwc2VkX3NlY29uZHMgPSBlbmQgLSBzdGFydDsKICAgc3RkOjp0aW1lX3QgZW5kX3RpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QoZW5kKTsKLSAgc3RkOjpjb3V0IDw8ICJmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZTogIiA8PCBlbGFwc2VkX3NlY29uZHMuY291bnQoKSA8PCAic1xuIjsKKyAgc3RkOjpjb3V0IDw8ICJmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKSA8PCAiZWxhcHNlZCB0aW1lOiAiIDw8IGVsYXBzZWRfc2Vjb25kcy5jb3VudCgpCisgICAgICAgICAgICA8PCAic1xuIjsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERldj4KQEAgLTg4NSwxOSArNzM0LDE1IEBACiAgIHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CiAgIC8vIFRlbnNvciBUZW5zb3IgQ29udHJhY3Rpb24KICAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTYsIDQsIDE2KTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMjU3LCAxMzEwNzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU3KTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMjU2LCAxMzEwNzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU2KTsKLSAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTYsIDEzMTA3MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7Ci0gIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDE3LCAxMzEwNzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcpOworICB0ZXN0X3N5Y2xfY29udHJhY3Rpb248Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAyNTcsIDEzMTA3MywgMjU3KTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMjU2LCAxMzEwNzIsIDI1Nik7CisgIHRlc3Rfc3ljbF9jb250cmFjdGlvbjxDb2xNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDE2LCAxMzEwNzMsIDE2KTsKKyAgdGVzdF9zeWNsX2NvbnRyYWN0aW9uPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTcsIDEzMTA3MiwgMTcpOwogICBlbmQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gZWxhcHNlZF9zZWNvbmRzID0gZW5kIC0gc3RhcnQ7CiAgIHN0ZDo6dGltZV90IGVuZF90aW1lID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dG9fdGltZV90KGVuZCk7Ci0gIHN0ZDo6Y291dCA8PCAiZmluaXNoZWQgY29tcHV0YXRpb24gYXQgIiA8PCBzdGQ6OmN0aW1lKCZlbmRfdGltZSkKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWU6ICIgPDwgZWxhcHNlZF9zZWNvbmRzLmNvdW50KCkgPDwgInNcbiI7CisgIHN0ZDo6Y291dCA8PCAiZmluaXNoZWQgY29tcHV0YXRpb24gYXQgIiA8PCBzdGQ6OmN0aW1lKCZlbmRfdGltZSkgPDwgImVsYXBzZWQgdGltZTogIiA8PCBlbGFwc2VkX3NlY29uZHMuY291bnQoKQorICAgICAgICAgICAgPDwgInNcbiI7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXY+CkBAIC05MDcsMTAzICs3NTIsNzggQEAKICAgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jaz4gc3RhcnQsIGVuZDsKICAgc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKIAotICBjb250cmFjdGlvbl9iYXRjaDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDY0LCA3NSwgMzAsIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA0KTsKLSAgY29udHJhY3Rpb25fYmF0Y2g8Q29sTWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA2NCwgNzUsIDMwLCA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgNCk7CisgIGNvbnRyYWN0aW9uX2JhdGNoPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNjQsIDc1LCAzMCwgNCwgMCwgNCk7CisgIGNvbnRyYWN0aW9uX2JhdGNoPENvbE1ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNjQsIDc1LCAzMCwgNCwgMCwgNCk7CiAgIGVuZCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBlbGFwc2VkX3NlY29uZHMgPSBlbmQgLSBzdGFydDsKICAgc3RkOjp0aW1lX3QgZW5kX3RpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QoZW5kKTsKLSAgc3RkOjpjb3V0IDw8ICJmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZTogIiA8PCBlbGFwc2VkX3NlY29uZHMuY291bnQoKSA8PCAic1xuIjsKKyAgc3RkOjpjb3V0IDw8ICJmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKSA8PCAiZWxhcHNlZCB0aW1lOiAiIDw8IGVsYXBzZWRfc2Vjb25kcy5jb3VudCgpCisgICAgICAgICAgICA8PCAic1xuIjsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERldj4KLXZvaWQgaW5saW5lIHRlbnNvcl9jb250cmFjdGlvbl9saHNfdHJhbnNwb3NlZF9wZXJfZGV2aWNlKAotICAgIGNvbnN0IERldiAmc3ljbF9kZXZpY2UpIHsKK3ZvaWQgaW5saW5lIHRlbnNvcl9jb250cmFjdGlvbl9saHNfdHJhbnNwb3NlZF9wZXJfZGV2aWNlKGNvbnN0IERldiAmc3ljbF9kZXZpY2UpIHsKICAgdHlwZWRlZiBmbG9hdCBEYXRhVHlwZTsKICAgdHlwZWRlZiBpbnQ2NF90IEluZGV4VHlwZTsKICAgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jaz4gc3RhcnQsIGVuZDsKICAgc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKIAotICBjb250cmFjdGlvbl9saHNfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDgsIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsKLSAgY29udHJhY3Rpb25fbGhzX3RyYW5zcG9zZWQ8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAzMiwgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyKTsKLSAgY29udHJhY3Rpb25fbGhzX3RyYW5zcG9zZWQ8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA2NCwgMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCk7Ci0gIGNvbnRyYWN0aW9uX2xoc190cmFuc3Bvc2VkPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNzg0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCwgMTAyNCk7Ci0gIGNvbnRyYWN0aW9uX2xoc190cmFuc3Bvc2VkPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTAyNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCAxMDI0KTsKLSAgY29udHJhY3Rpb25fbGhzX3RyYW5zcG9zZWQ8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA0MDk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCwgMTAyNCk7Ci0gIGNvbnRyYWN0aW9uX2xoc190cmFuc3Bvc2VkPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMjA0OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsIDEwMjQpOworICBjb250cmFjdGlvbl9saHNfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDgsIDQsIDgpOworICBjb250cmFjdGlvbl9saHNfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDMyLCA4LCAzMik7CisgIGNvbnRyYWN0aW9uX2xoc190cmFuc3Bvc2VkPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNjQsIDE2LCA2NCk7CisgIGNvbnRyYWN0aW9uX2xoc190cmFuc3Bvc2VkPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNzg0LCAyMDQ4LCAxMDI0KTsKKyAgY29udHJhY3Rpb25fbGhzX3RyYW5zcG9zZWQ8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMDI0LCAxMCwgMTAyNCk7CisgIGNvbnRyYWN0aW9uX2xoc190cmFuc3Bvc2VkPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNDA5NiwgMTAyNCwgMTAyNCk7CisgIGNvbnRyYWN0aW9uX2xoc190cmFuc3Bvc2VkPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMjA0OCwgNDA5NiwgMTAyNCk7CiAgIGVuZCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBlbGFwc2VkX3NlY29uZHMgPSBlbmQgLSBzdGFydDsKICAgc3RkOjp0aW1lX3QgZW5kX3RpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QoZW5kKTsKLSAgc3RkOjpjb3V0IDw8ICJmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZTogIiA8PCBlbGFwc2VkX3NlY29uZHMuY291bnQoKSA8PCAic1xuIjsKKyAgc3RkOjpjb3V0IDw8ICJmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKSA8PCAiZWxhcHNlZCB0aW1lOiAiIDw8IGVsYXBzZWRfc2Vjb25kcy5jb3VudCgpCisgICAgICAgICAgICA8PCAic1xuIjsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERldj4KLXZvaWQgaW5saW5lIHRlbnNvcl9jb250cmFjdGlvbl9yaHNfdHJhbnNwb3NlZF9wZXJfZGV2aWNlKAotICAgIGNvbnN0IERldiAmc3ljbF9kZXZpY2UpIHsKK3ZvaWQgaW5saW5lIHRlbnNvcl9jb250cmFjdGlvbl9yaHNfdHJhbnNwb3NlZF9wZXJfZGV2aWNlKGNvbnN0IERldiAmc3ljbF9kZXZpY2UpIHsKICAgdHlwZWRlZiBmbG9hdCBEYXRhVHlwZTsKICAgdHlwZWRlZiBpbnQ2NF90IEluZGV4VHlwZTsKICAgc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jaz4gc3RhcnQsIGVuZDsKICAgc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKIAotICBjb250cmFjdGlvbl9yaHNfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDE2LCA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOwotICBjb250cmFjdGlvbl9yaHNfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDE3LCA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcpOwotICBjb250cmFjdGlvbl9yaHNfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDMyLCA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpOwotICBjb250cmFjdGlvbl9yaHNfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDY0LCAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KTsKLSAgY29udHJhY3Rpb25fcmhzX3RyYW5zcG9zZWQ8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQsIDEwMjQpOwotICBjb250cmFjdGlvbl9yaHNfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEwMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0LCA0MDk2KTsKLSAgY29udHJhY3Rpb25fcmhzX3RyYW5zcG9zZWQ8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA0MDk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCwgMjA0OCk7Ci0gIGNvbnRyYWN0aW9uX3Joc190cmFuc3Bvc2VkPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMjA0OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQsIDc4NCk7CisgIGNvbnRyYWN0aW9uX3Joc190cmFuc3Bvc2VkPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTYsIDQsIDE2KTsKKyAgY29udHJhY3Rpb25fcmhzX3RyYW5zcG9zZWQ8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxNywgNSwgMTcpOworICBjb250cmFjdGlvbl9yaHNfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDMyLCA4LCAzMik7CisgIGNvbnRyYWN0aW9uX3Joc190cmFuc3Bvc2VkPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgNjQsIDE2LCA2NCk7CisgIGNvbnRyYWN0aW9uX3Joc190cmFuc3Bvc2VkPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMTAsIDEwMjQsIDEwMjQpOworICBjb250cmFjdGlvbl9yaHNfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDEwMjQsIDEwMjQsIDQwOTYpOworICBjb250cmFjdGlvbl9yaHNfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDQwOTYsIDEwMjQsIDIwNDgpOworICBjb250cmFjdGlvbl9yaHNfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDIwNDgsIDEwMjQsIDc4NCk7CiAgIGVuZCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBlbGFwc2VkX3NlY29uZHMgPSBlbmQgLSBzdGFydDsKICAgc3RkOjp0aW1lX3QgZW5kX3RpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QoZW5kKTsKLSAgc3RkOjpjb3V0IDw8ICJmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZTogIiA8PCBlbGFwc2VkX3NlY29uZHMuY291bnQoKSA8PCAic1xuIjsKKyAgc3RkOjpjb3V0IDw8ICJmaW5pc2hlZCBjb21wdXRhdGlvbiBhdCAiIDw8IHN0ZDo6Y3RpbWUoJmVuZF90aW1lKSA8PCAiZWxhcHNlZCB0aW1lOiAiIDw8IGVsYXBzZWRfc2Vjb25kcy5jb3VudCgpCisgICAgICAgICAgICA8PCAic1xuIjsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERldj4KLXZvaWQgaW5saW5lIHRlbnNvcl9jb250cmFjdGlvbl9ib3RoX3RyYW5zcG9zZWRfcGVyX2RldmljZSgKLSAgICBjb25zdCBEZXYgJnN5Y2xfZGV2aWNlKSB7Cit2b2lkIGlubGluZSB0ZW5zb3JfY29udHJhY3Rpb25fYm90aF90cmFuc3Bvc2VkX3Blcl9kZXZpY2UoY29uc3QgRGV2ICZzeWNsX2RldmljZSkgewogICB0eXBlZGVmIGZsb2F0IERhdGFUeXBlOwogICB0eXBlZGVmIGludDY0X3QgSW5kZXhUeXBlOwogICBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrPiBzdGFydCwgZW5kOwogICBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOwogCi0gIGNvbnRyYWN0aW9uX2JvdGhfdHJhbnNwb3NlZDxSb3dNYWpvciwgRGF0YVR5cGUsIEluZGV4VHlwZT4oc3ljbF9kZXZpY2UsIDE3LCA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3KTsKLSAgY29udHJhY3Rpb25fYm90aF90cmFuc3Bvc2VkPFJvd01ham9yLCBEYXRhVHlwZSwgSW5kZXhUeXBlPihzeWNsX2RldmljZSwgMzIsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpOwotICBjb250cmFjdGlvbl9ib3RoX3RyYW5zcG9zZWQ8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgNjQpOworICBjb250cmFjdGlvbl9ib3RoX3RyYW5zcG9zZWQ8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAxNywgNSwgMTcpOworICBjb250cmFjdGlvbl9ib3RoX3RyYW5zcG9zZWQ8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCAzMiwgOCwgMzIpOworICBjb250cmFjdGlvbl9ib3RoX3RyYW5zcG9zZWQ8Um93TWFqb3IsIERhdGFUeXBlLCBJbmRleFR5cGU+KHN5Y2xfZGV2aWNlLCA2NCwgMTYsIDY0KTsKICAgZW5kID0gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCk7CiAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IGVsYXBzZWRfc2Vjb25kcyA9IGVuZCAtIHN0YXJ0OwogICBzdGQ6OnRpbWVfdCBlbmRfdGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRvX3RpbWVfdChlbmQpOwotICBzdGQ6OmNvdXQgPDwgImZpbmlzaGVkIGNvbXB1dGF0aW9uIGF0ICIgPDwgc3RkOjpjdGltZSgmZW5kX3RpbWUpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lOiAiIDw8IGVsYXBzZWRfc2Vjb25kcy5jb3VudCgpIDw8ICJzXG4iOworICBzdGQ6OmNvdXQgPDwgImZpbmlzaGVkIGNvbXB1dGF0aW9uIGF0ICIgPDwgc3RkOjpjdGltZSgmZW5kX3RpbWUpIDw8ICJlbGFwc2VkIHRpbWU6ICIgPDwgZWxhcHNlZF9zZWNvbmRzLmNvdW50KCkKKyAgICAgICAgICAgIDw8ICJzXG4iOwogfQogCiBFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2NvbnRyYWN0X3N5Y2wpIHsKICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiBFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgewotICAgIHN0ZDo6Y291dCA8PCAiUnVubmluZyBvbiAiCi0gICAgICAgICAgICAgIDw8IGRldmljZS50ZW1wbGF0ZSBnZXRfaW5mbzxjbDo6c3ljbDo6aW5mbzo6ZGV2aWNlOjpuYW1lPigpCi0gICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIlJ1bm5pbmcgb24gIiA8PCBkZXZpY2UudGVtcGxhdGUgZ2V0X2luZm88Y2w6OnN5Y2w6OmluZm86OmRldmljZTo6bmFtZT4oKSA8PCBzdGQ6OmVuZGw7CiAgICAgUXVldWVJbnRlcmZhY2UgcXVldWVJbnRlcmZhY2UoZGV2aWNlKTsKICAgICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKICAgICBDQUxMX1NVQlRFU1RfMSh0ZW5zb3JPdXRvZkJvdW5kKHN5Y2xfZGV2aWNlKSk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb250cmFjdGlvbi5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb250cmFjdGlvbi5jcHAKaW5kZXggM2I1YzZhMS4uMjk0OWMxNCAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udHJhY3Rpb24uY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbnRyYWN0aW9uLmNwcApAQCAtMTYsOSArMTYsOCBAQAogCiB0eXBlZGVmIFRlbnNvcjxmbG9hdCwgMT46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2V2YWxzKCkKLXsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZXZhbHMoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gbWF0MSgyLCAzKTsKICAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBtYXQyKDIsIDMpOwogICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDMoMywgMik7CkBAIC0yNyw2MCArMjYsNTkgQEAKICAgbWF0Mi5zZXRSYW5kb20oKTsKICAgbWF0My5zZXRSYW5kb20oKTsKIAotICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDQoMywzKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBtYXQ0KDMsIDMpOwogICBtYXQ0LnNldFplcm8oKTsKICAgRWlnZW46OmFycmF5PERpbVBhaXIsIDE+IGRpbXMzID0ge3tEaW1QYWlyKDAsIDApfX07CiAgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGRlY2x0eXBlKG1hdDEuY29udHJhY3QobWF0MiwgZGltczMpKSwgRGVmYXVsdERldmljZT4gRXZhbHVhdG9yOwogICBFdmFsdWF0b3IgZXZhbChtYXQxLmNvbnRyYWN0KG1hdDIsIGRpbXMzKSwgRGVmYXVsdERldmljZSgpKTsKICAgZXZhbC5ldmFsVG8obWF0NC5kYXRhKCkpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKEV2YWx1YXRvcjo6TnVtRGltcz09MnVsLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKEV2YWx1YXRvcjo6TnVtRGltcyA9PSAydWwsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CiAgIFZFUklGWV9JU19FUVVBTChldmFsLmRpbWVuc2lvbnMoKVswXSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTChldmFsLmRpbWVuc2lvbnMoKVsxXSwgMyk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDAsMCksIG1hdDEoMCwwKSptYXQyKDAsMCkgKyBtYXQxKDEsMCkqbWF0MigxLDApKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDAsMSksIG1hdDEoMCwwKSptYXQyKDAsMSkgKyBtYXQxKDEsMCkqbWF0MigxLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDAsMiksIG1hdDEoMCwwKSptYXQyKDAsMikgKyBtYXQxKDEsMCkqbWF0MigxLDIpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDEsMCksIG1hdDEoMCwxKSptYXQyKDAsMCkgKyBtYXQxKDEsMSkqbWF0MigxLDApKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDEsMSksIG1hdDEoMCwxKSptYXQyKDAsMSkgKyBtYXQxKDEsMSkqbWF0MigxLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDEsMiksIG1hdDEoMCwxKSptYXQyKDAsMikgKyBtYXQxKDEsMSkqbWF0MigxLDIpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDIsMCksIG1hdDEoMCwyKSptYXQyKDAsMCkgKyBtYXQxKDEsMikqbWF0MigxLDApKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDIsMSksIG1hdDEoMCwyKSptYXQyKDAsMSkgKyBtYXQxKDEsMikqbWF0MigxLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDIsMiksIG1hdDEoMCwyKSptYXQyKDAsMikgKyBtYXQxKDEsMikqbWF0MigxLDIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDAsIDApLCBtYXQxKDAsIDApICogbWF0MigwLCAwKSArIG1hdDEoMSwgMCkgKiBtYXQyKDEsIDApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDAsIDEpLCBtYXQxKDAsIDApICogbWF0MigwLCAxKSArIG1hdDEoMSwgMCkgKiBtYXQyKDEsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDAsIDIpLCBtYXQxKDAsIDApICogbWF0MigwLCAyKSArIG1hdDEoMSwgMCkgKiBtYXQyKDEsIDIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDEsIDApLCBtYXQxKDAsIDEpICogbWF0MigwLCAwKSArIG1hdDEoMSwgMSkgKiBtYXQyKDEsIDApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDEsIDEpLCBtYXQxKDAsIDEpICogbWF0MigwLCAxKSArIG1hdDEoMSwgMSkgKiBtYXQyKDEsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDEsIDIpLCBtYXQxKDAsIDEpICogbWF0MigwLCAyKSArIG1hdDEoMSwgMSkgKiBtYXQyKDEsIDIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDIsIDApLCBtYXQxKDAsIDIpICogbWF0MigwLCAwKSArIG1hdDEoMSwgMikgKiBtYXQyKDEsIDApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDIsIDEpLCBtYXQxKDAsIDIpICogbWF0MigwLCAxKSArIG1hdDEoMSwgMikgKiBtYXQyKDEsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDIsIDIpLCBtYXQxKDAsIDIpICogbWF0MigwLCAyKSArIG1hdDEoMSwgMikgKiBtYXQyKDEsIDIpKTsKIAotICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDUoMiwyKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBtYXQ1KDIsIDIpOwogICBtYXQ1LnNldFplcm8oKTsKICAgRWlnZW46OmFycmF5PERpbVBhaXIsIDE+IGRpbXM0ID0ge3tEaW1QYWlyKDEsIDEpfX07CiAgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGRlY2x0eXBlKG1hdDEuY29udHJhY3QobWF0MiwgZGltczQpKSwgRGVmYXVsdERldmljZT4gRXZhbHVhdG9yMjsKICAgRXZhbHVhdG9yMiBldmFsMihtYXQxLmNvbnRyYWN0KG1hdDIsIGRpbXM0KSwgRGVmYXVsdERldmljZSgpKTsKICAgZXZhbDIuZXZhbFRvKG1hdDUuZGF0YSgpKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVChFdmFsdWF0b3IyOjpOdW1EaW1zPT0ydWwsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRXZhbHVhdG9yMjo6TnVtRGltcyA9PSAydWwsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CiAgIFZFUklGWV9JU19FUVVBTChldmFsMi5kaW1lbnNpb25zKClbMF0sIDIpOwogICBWRVJJRllfSVNfRVFVQUwoZXZhbDIuZGltZW5zaW9ucygpWzFdLCAyKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKG1hdDUoMCwwKSwgbWF0MSgwLDApKm1hdDIoMCwwKSArIG1hdDEoMCwxKSptYXQyKDAsMSkgKyBtYXQxKDAsMikqbWF0MigwLDIpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ1KDAsMSksIG1hdDEoMCwwKSptYXQyKDEsMCkgKyBtYXQxKDAsMSkqbWF0MigxLDEpICsgbWF0MSgwLDIpKm1hdDIoMSwyKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0NSgxLDApLCBtYXQxKDEsMCkqbWF0MigwLDApICsgbWF0MSgxLDEpKm1hdDIoMCwxKSArIG1hdDEoMSwyKSptYXQyKDAsMikpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDUoMSwxKSwgbWF0MSgxLDApKm1hdDIoMSwwKSArIG1hdDEoMSwxKSptYXQyKDEsMSkgKyBtYXQxKDEsMikqbWF0MigxLDIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ1KDAsIDApLCBtYXQxKDAsIDApICogbWF0MigwLCAwKSArIG1hdDEoMCwgMSkgKiBtYXQyKDAsIDEpICsgbWF0MSgwLCAyKSAqIG1hdDIoMCwgMikpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDUoMCwgMSksIG1hdDEoMCwgMCkgKiBtYXQyKDEsIDApICsgbWF0MSgwLCAxKSAqIG1hdDIoMSwgMSkgKyBtYXQxKDAsIDIpICogbWF0MigxLCAyKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0NSgxLCAwKSwgbWF0MSgxLCAwKSAqIG1hdDIoMCwgMCkgKyBtYXQxKDEsIDEpICogbWF0MigwLCAxKSArIG1hdDEoMSwgMikgKiBtYXQyKDAsIDIpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ1KDEsIDEpLCBtYXQxKDEsIDApICogbWF0MigxLCAwKSArIG1hdDEoMSwgMSkgKiBtYXQyKDEsIDEpICsgbWF0MSgxLCAyKSAqIG1hdDIoMSwgMikpOwogCi0gIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gbWF0NigyLDIpOworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDYoMiwgMik7CiAgIG1hdDYuc2V0WmVybygpOwogICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMT4gZGltczYgPSB7e0RpbVBhaXIoMSwgMCl9fTsKICAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8ZGVjbHR5cGUobWF0MS5jb250cmFjdChtYXQzLCBkaW1zNikpLCBEZWZhdWx0RGV2aWNlPiBFdmFsdWF0b3IzOwogICBFdmFsdWF0b3IzIGV2YWwzKG1hdDEuY29udHJhY3QobWF0MywgZGltczYpLCBEZWZhdWx0RGV2aWNlKCkpOwogICBldmFsMy5ldmFsVG8obWF0Ni5kYXRhKCkpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKEV2YWx1YXRvcjM6Ok51bURpbXM9PTJ1bCwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVChFdmFsdWF0b3IzOjpOdW1EaW1zID09IDJ1bCwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKICAgVkVSSUZZX0lTX0VRVUFMKGV2YWwzLmRpbWVuc2lvbnMoKVswXSwgMik7CiAgIFZFUklGWV9JU19FUVVBTChldmFsMy5kaW1lbnNpb25zKClbMV0sIDIpOwogCi0gIFZFUklGWV9JU19BUFBST1gobWF0NigwLDApLCBtYXQxKDAsMCkqbWF0MygwLDApICsgbWF0MSgwLDEpKm1hdDMoMSwwKSArIG1hdDEoMCwyKSptYXQzKDIsMCkpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDYoMCwxKSwgbWF0MSgwLDApKm1hdDMoMCwxKSArIG1hdDEoMCwxKSptYXQzKDEsMSkgKyBtYXQxKDAsMikqbWF0MygyLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ2KDEsMCksIG1hdDEoMSwwKSptYXQzKDAsMCkgKyBtYXQxKDEsMSkqbWF0MygxLDApICsgbWF0MSgxLDIpKm1hdDMoMiwwKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0NigxLDEpLCBtYXQxKDEsMCkqbWF0MygwLDEpICsgbWF0MSgxLDEpKm1hdDMoMSwxKSArIG1hdDEoMSwyKSptYXQzKDIsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDYoMCwgMCksIG1hdDEoMCwgMCkgKiBtYXQzKDAsIDApICsgbWF0MSgwLCAxKSAqIG1hdDMoMSwgMCkgKyBtYXQxKDAsIDIpICogbWF0MygyLCAwKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0NigwLCAxKSwgbWF0MSgwLCAwKSAqIG1hdDMoMCwgMSkgKyBtYXQxKDAsIDEpICogbWF0MygxLCAxKSArIG1hdDEoMCwgMikgKiBtYXQzKDIsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ2KDEsIDApLCBtYXQxKDEsIDApICogbWF0MygwLCAwKSArIG1hdDEoMSwgMSkgKiBtYXQzKDEsIDApICsgbWF0MSgxLCAyKSAqIG1hdDMoMiwgMCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDYoMSwgMSksIG1hdDEoMSwgMCkgKiBtYXQzKDAsIDEpICsgbWF0MSgxLCAxKSAqIG1hdDMoMSwgMSkgKyBtYXQxKDEsIDIpICogbWF0MygyLCAxKSk7CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9zY2FsYXIoKQotewordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zY2FsYXIoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMSwgRGF0YUxheW91dD4gdmVjMSh7Nn0pOwogICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IHZlYzIoezZ9KTsKIApAQCAtOTcsOSArOTUsOCBAQAogICBWRVJJRllfSVNfQVBQUk9YKHNjYWxhcigpLCBleHBlY3RlZCk7CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9tdWx0aWRpbXMoKQotewordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9tdWx0aWRpbXMoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gbWF0MSgyLCAyLCAyKTsKICAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBtYXQyKDIsIDIsIDIsIDIpOwogCkBAIC0xMTIsMjcgKzEwOSwyNyBAQAogICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxkZWNsdHlwZShtYXQxLmNvbnRyYWN0KG1hdDIsIGRpbXMpKSwgRGVmYXVsdERldmljZT4gRXZhbHVhdG9yOwogICBFdmFsdWF0b3IgZXZhbChtYXQxLmNvbnRyYWN0KG1hdDIsIGRpbXMpLCBEZWZhdWx0RGV2aWNlKCkpOwogICBldmFsLmV2YWxUbyhtYXQzLmRhdGEoKSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoRXZhbHVhdG9yOjpOdW1EaW1zPT0zdWwsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRXZhbHVhdG9yOjpOdW1EaW1zID09IDN1bCwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKICAgVkVSSUZZX0lTX0VRVUFMKGV2YWwuZGltZW5zaW9ucygpWzBdLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKGV2YWwuZGltZW5zaW9ucygpWzFdLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKGV2YWwuZGltZW5zaW9ucygpWzJdLCAyKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwwLDApLCBtYXQxKDAsMCwwKSptYXQyKDAsMCwwLDApICsgbWF0MSgwLDEsMCkqbWF0MigwLDAsMSwwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdDEoMCwwLDEpKm1hdDIoMCwwLDAsMSkgKyBtYXQxKDAsMSwxKSptYXQyKDAsMCwxLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsMCwxKSwgbWF0MSgwLDAsMCkqbWF0MigwLDEsMCwwKSArIG1hdDEoMCwxLDApKm1hdDIoMCwxLDEsMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQxKDAsMCwxKSptYXQyKDAsMSwwLDEpICsgbWF0MSgwLDEsMSkqbWF0MigwLDEsMSwxKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygwLDEsMCksIG1hdDEoMCwwLDApKm1hdDIoMSwwLDAsMCkgKyBtYXQxKDAsMSwwKSptYXQyKDEsMCwxLDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0MSgwLDAsMSkqbWF0MigxLDAsMCwxKSArIG1hdDEoMCwxLDEpKm1hdDIoMSwwLDEsMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwxLDEpLCBtYXQxKDAsMCwwKSptYXQyKDEsMSwwLDApICsgbWF0MSgwLDEsMCkqbWF0MigxLDEsMSwwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdDEoMCwwLDEpKm1hdDIoMSwxLDAsMSkgKyBtYXQxKDAsMSwxKSptYXQyKDEsMSwxLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsMCwwKSwgbWF0MSgxLDAsMCkqbWF0MigwLDAsMCwwKSArIG1hdDEoMSwxLDApKm1hdDIoMCwwLDEsMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQxKDEsMCwxKSptYXQyKDAsMCwwLDEpICsgbWF0MSgxLDEsMSkqbWF0MigwLDAsMSwxKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygxLDAsMSksIG1hdDEoMSwwLDApKm1hdDIoMCwxLDAsMCkgKyBtYXQxKDEsMSwwKSptYXQyKDAsMSwxLDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0MSgxLDAsMSkqbWF0MigwLDEsMCwxKSArIG1hdDEoMSwxLDEpKm1hdDIoMCwxLDEsMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwxLDApLCBtYXQxKDEsMCwwKSptYXQyKDEsMCwwLDApICsgbWF0MSgxLDEsMCkqbWF0MigxLDAsMSwwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdDEoMSwwLDEpKm1hdDIoMSwwLDAsMSkgKyBtYXQxKDEsMSwxKSptYXQyKDEsMCwxLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsMSwxKSwgbWF0MSgxLDAsMCkqbWF0MigxLDEsMCwwKSArIG1hdDEoMSwxLDApKm1hdDIoMSwxLDEsMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQxKDEsMCwxKSptYXQyKDEsMSwwLDEpICsgbWF0MSgxLDEsMSkqbWF0MigxLDEsMSwxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAwLCAwKSwgbWF0MSgwLCAwLCAwKSAqIG1hdDIoMCwgMCwgMCwgMCkgKyBtYXQxKDAsIDEsIDApICogbWF0MigwLCAwLCAxLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdDEoMCwgMCwgMSkgKiBtYXQyKDAsIDAsIDAsIDEpICsgbWF0MSgwLCAxLCAxKSAqIG1hdDIoMCwgMCwgMSwgMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwgMCwgMSksIG1hdDEoMCwgMCwgMCkgKiBtYXQyKDAsIDEsIDAsIDApICsgbWF0MSgwLCAxLCAwKSAqIG1hdDIoMCwgMSwgMSwgMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQxKDAsIDAsIDEpICogbWF0MigwLCAxLCAwLCAxKSArIG1hdDEoMCwgMSwgMSkgKiBtYXQyKDAsIDEsIDEsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsIDEsIDApLCBtYXQxKDAsIDAsIDApICogbWF0MigxLCAwLCAwLCAwKSArIG1hdDEoMCwgMSwgMCkgKiBtYXQyKDEsIDAsIDEsIDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0MSgwLCAwLCAxKSAqIG1hdDIoMSwgMCwgMCwgMSkgKyBtYXQxKDAsIDEsIDEpICogbWF0MigxLCAwLCAxLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAxLCAxKSwgbWF0MSgwLCAwLCAwKSAqIG1hdDIoMSwgMSwgMCwgMCkgKyBtYXQxKDAsIDEsIDApICogbWF0MigxLCAxLCAxLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdDEoMCwgMCwgMSkgKiBtYXQyKDEsIDEsIDAsIDEpICsgbWF0MSgwLCAxLCAxKSAqIG1hdDIoMSwgMSwgMSwgMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwgMCwgMCksIG1hdDEoMSwgMCwgMCkgKiBtYXQyKDAsIDAsIDAsIDApICsgbWF0MSgxLCAxLCAwKSAqIG1hdDIoMCwgMCwgMSwgMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQxKDEsIDAsIDEpICogbWF0MigwLCAwLCAwLCAxKSArIG1hdDEoMSwgMSwgMSkgKiBtYXQyKDAsIDAsIDEsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsIDAsIDEpLCBtYXQxKDEsIDAsIDApICogbWF0MigwLCAxLCAwLCAwKSArIG1hdDEoMSwgMSwgMCkgKiBtYXQyKDAsIDEsIDEsIDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0MSgxLCAwLCAxKSAqIG1hdDIoMCwgMSwgMCwgMSkgKyBtYXQxKDEsIDEsIDEpICogbWF0MigwLCAxLCAxLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAxLCAwKSwgbWF0MSgxLCAwLCAwKSAqIG1hdDIoMSwgMCwgMCwgMCkgKyBtYXQxKDEsIDEsIDApICogbWF0MigxLCAwLCAxLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdDEoMSwgMCwgMSkgKiBtYXQyKDEsIDAsIDAsIDEpICsgbWF0MSgxLCAxLCAxKSAqIG1hdDIoMSwgMCwgMSwgMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwgMSwgMSksIG1hdDEoMSwgMCwgMCkgKiBtYXQyKDEsIDEsIDAsIDApICsgbWF0MSgxLCAxLCAwKSAqIG1hdDIoMSwgMSwgMSwgMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQxKDEsIDAsIDEpICogbWF0MigxLCAxLCAwLCAxKSArIG1hdDEoMSwgMSwgMSkgKiBtYXQyKDEsIDEsIDEsIDEpKTsKIAogICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDQoMiwgMik7CiAgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gbWF0NSgyLCAyLCAyKTsKQEAgLTE0NiwxNiArMTQzLDE2IEBACiAgIHR5cGVkZWYgVGVuc29yRXZhbHVhdG9yPGRlY2x0eXBlKG1hdDQuY29udHJhY3QobWF0NSwgZGltczIpKSwgRGVmYXVsdERldmljZT4gRXZhbHVhdG9yMjsKICAgRXZhbHVhdG9yMiBldmFsMihtYXQ0LmNvbnRyYWN0KG1hdDUsIGRpbXMyKSwgRGVmYXVsdERldmljZSgpKTsKICAgZXZhbDIuZXZhbFRvKG1hdDYuZGF0YSgpKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVChFdmFsdWF0b3IyOjpOdW1EaW1zPT0xdWwsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoRXZhbHVhdG9yMjo6TnVtRGltcyA9PSAxdWwsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CiAgIFZFUklGWV9JU19FUVVBTChldmFsMi5kaW1lbnNpb25zKClbMF0sIDIpOwogCi0gIFZFUklGWV9JU19BUFBST1gobWF0NigwKSwgbWF0NCgwLDApKm1hdDUoMCwwLDApICsgbWF0NCgxLDApKm1hdDUoMCwxLDApICsKLSAgICAgICAgICAgICAgICAgICBtYXQ0KDAsMSkqbWF0NSgxLDAsMCkgKyBtYXQ0KDEsMSkqbWF0NSgxLDEsMCkpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDYoMSksIG1hdDQoMCwwKSptYXQ1KDAsMCwxKSArIG1hdDQoMSwwKSptYXQ1KDAsMSwxKSArCi0gICAgICAgICAgICAgICAgICAgbWF0NCgwLDEpKm1hdDUoMSwwLDEpICsgbWF0NCgxLDEpKm1hdDUoMSwxLDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQ2KDApLCBtYXQ0KDAsIDApICogbWF0NSgwLCAwLCAwKSArIG1hdDQoMSwgMCkgKiBtYXQ1KDAsIDEsIDApICsgbWF0NCgwLCAxKSAqIG1hdDUoMSwgMCwgMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQ0KDEsIDEpICogbWF0NSgxLCAxLCAwKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0NigxKSwgbWF0NCgwLCAwKSAqIG1hdDUoMCwgMCwgMSkgKyBtYXQ0KDEsIDApICogbWF0NSgwLCAxLCAxKSArIG1hdDQoMCwgMSkgKiBtYXQ1KDEsIDAsIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0NCgxLCAxKSAqIG1hdDUoMSwgMSwgMSkpOwogfQogCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KIHN0YXRpYyB2b2lkIHRlc3RfaG9sZXMoKSB7CiAgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdDEoMiwgNSwgNywgMyk7CiAgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gdDIoMiwgNywgMTEsIDEzLCAzKTsKQEAgLTE3NiwxMiArMTczLDkgQEAKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA1OyArK2wpIHsKICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IDU7ICsrbSkgewogICAgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoaSwgaiwgaywgbCwgbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxKDAsIGksIGosIDApICogdDIoMCwgaywgbCwgbSwgMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSgxLCBpLCBqLCAwKSAqIHQyKDEsIGssIGwsIG0sIDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEoMCwgaSwgaiwgMSkgKiB0MigwLCBrLCBsLCBtLCAxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxKDEsIGksIGosIDEpICogdDIoMSwgaywgbCwgbSwgMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSgwLCBpLCBqLCAyKSAqIHQyKDAsIGssIGwsIG0sIDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEoMSwgaSwgaiwgMikgKiB0MigxLCBrLCBsLCBtLCAyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxKDAsIGksIGosIDApICogdDIoMCwgaywgbCwgbSwgMCkgKyB0MSgxLCBpLCBqLCAwKSAqIHQyKDEsIGssIGwsIG0sIDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxKDAsIGksIGosIDEpICogdDIoMCwgaywgbCwgbSwgMSkgKyB0MSgxLCBpLCBqLCAxKSAqIHQyKDEsIGssIGwsIG0sIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxKDAsIGksIGosIDIpICogdDIoMCwgaywgbCwgbSwgMikgKyB0MSgxLCBpLCBqLCAyKSAqIHQyKDEsIGssIGwsIG0sIDIpKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTE4OSw5ICsxODMsOCBAQAogICB9CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9mdWxsX3JlZHV4KCkKLXsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZnVsbF9yZWR1eCgpIHsKICAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0MSgyLCAyKTsKICAgVGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiB0MigyLCAyLCAyKTsKICAgdDEuc2V0UmFuZG9tKCk7CkBAIC0yMDAsMjQgKzE5MywyMyBAQAogICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMj4gZGltcyA9IHt7RGltUGFpcigwLCAwKSwgRGltUGFpcigxLCAxKX19OwogICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IHJlc3VsdCA9IHQxLmNvbnRyYWN0KHQyLCBkaW1zKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIDIpOwotICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwKSwgdDEoMCwgMCkgKiB0MigwLCAwLCAwKSArICB0MSgxLCAwKSAqIHQyKDEsIDAsIDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0MSgwLCAxKSAqIHQyKDAsIDEsIDApICsgIHQxKDEsIDEpICogdDIoMSwgMSwgMCkpOwotICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgxKSwgdDEoMCwgMCkgKiB0MigwLCAwLCAxKSArICB0MSgxLCAwKSAqIHQyKDEsIDAsIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0MSgwLCAxKSAqIHQyKDAsIDEsIDEpICsgIHQxKDEsIDEpICogdDIoMSwgMSwgMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwKSwKKyAgICAgICAgICAgICAgICAgICB0MSgwLCAwKSAqIHQyKDAsIDAsIDApICsgdDEoMSwgMCkgKiB0MigxLCAwLCAwKSArIHQxKDAsIDEpICogdDIoMCwgMSwgMCkgKyB0MSgxLCAxKSAqIHQyKDEsIDEsIDApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSksCisgICAgICAgICAgICAgICAgICAgdDEoMCwgMCkgKiB0MigwLCAwLCAxKSArIHQxKDEsIDApICogdDIoMSwgMCwgMSkgKyB0MSgwLCAxKSAqIHQyKDAsIDEsIDEpICsgdDEoMSwgMSkgKiB0MigxLCAxLCAxKSk7CiAKICAgZGltc1swXSA9IERpbVBhaXIoMSwgMCk7CiAgIGRpbXNbMV0gPSBEaW1QYWlyKDIsIDEpOwogICByZXN1bHQgPSB0Mi5jb250cmFjdCh0MSwgZGltcyk7CiAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDApLCAyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCksIHQxKDAsIDApICogdDIoMCwgMCwgMCkgKyAgdDEoMSwgMCkgKiB0MigwLCAxLCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdDEoMCwgMSkgKiB0MigwLCAwLCAxKSArICB0MSgxLCAxKSAqIHQyKDAsIDEsIDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSksIHQxKDAsIDApICogdDIoMSwgMCwgMCkgKyAgdDEoMSwgMCkgKiB0MigxLCAxLCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdDEoMCwgMSkgKiB0MigxLCAwLCAxKSArICB0MSgxLCAxKSAqIHQyKDEsIDEsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCksCisgICAgICAgICAgICAgICAgICAgdDEoMCwgMCkgKiB0MigwLCAwLCAwKSArIHQxKDEsIDApICogdDIoMCwgMSwgMCkgKyB0MSgwLCAxKSAqIHQyKDAsIDAsIDEpICsgdDEoMSwgMSkgKiB0MigwLCAxLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEpLAorICAgICAgICAgICAgICAgICAgIHQxKDAsIDApICogdDIoMSwgMCwgMCkgKyB0MSgxLCAwKSAqIHQyKDEsIDEsIDApICsgdDEoMCwgMSkgKiB0MigxLCAwLCAxKSArIHQxKDEsIDEpICogdDIoMSwgMSwgMSkpOwogfQogCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfY29udHJhY3Rpb25fb2ZfY29udHJhY3Rpb24oKQotewordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9jb250cmFjdGlvbl9vZl9jb250cmFjdGlvbigpIHsKICAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0MSgyLCAyKTsKICAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0MigyLCAyKTsKICAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0MygyLCAyKTsKQEAgLTIzNiwxMSArMjI4LDkgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIDIpOwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigxKSwgMik7CiAKLSAgRWlnZW46Ok1hcDxFaWdlbjo6TWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBEYXRhTGF5b3V0Pj4KLSAgICAgIG0xKHQxLmRhdGEoKSwgMiwgMiksIG0yKHQyLmRhdGEoKSwgMiwgMiksIG0zKHQzLmRhdGEoKSwgMiwgMiksCi0gICAgICBtNCh0NC5kYXRhKCksIDIsIDIpOwotICBFaWdlbjo6TWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBEYXRhTGF5b3V0PgotICAgICAgZXhwZWN0ZWQgPSAobTEgKiBtNCkgKiAobTMgLSBtMSAqIG0yKTsKKyAgRWlnZW46Ok1hcDxFaWdlbjo6TWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBEYXRhTGF5b3V0Pj4gbTEodDEuZGF0YSgpLCAyLCAyKSwgbTIodDIuZGF0YSgpLCAyLCAyKSwKKyAgICAgIG0zKHQzLmRhdGEoKSwgMiwgMiksIG00KHQ0LmRhdGEoKSwgMiwgMik7CisgIEVpZ2VuOjpNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIERhdGFMYXlvdXQ+IGV4cGVjdGVkID0gKG0xICogbTQpICogKG0zIC0gbTEgKiBtMik7CiAKICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCwgMCksIGV4cGVjdGVkKDAsIDApKTsKICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCwgMSksIGV4cGVjdGVkKDAsIDEpKTsKQEAgLTI0OCwyOCArMjM4LDI2IEBACiAgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsIDEpLCBleHBlY3RlZCgxLCAxKSk7CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9leHByKCkKLXsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZXhwcigpIHsKICAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBtYXQxKDIsIDMpOwogICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDIoMywgMik7CiAgIG1hdDEuc2V0UmFuZG9tKCk7CiAgIG1hdDIuc2V0UmFuZG9tKCk7CiAKLSAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBtYXQzKDIsMik7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gbWF0MygyLCAyKTsKIAogICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMT4gZGltcyA9IHt7RGltUGFpcigxLCAwKX19OwogICBtYXQzID0gbWF0MS5jb250cmFjdChtYXQyLCBkaW1zKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwwKSwgbWF0MSgwLDApKm1hdDIoMCwwKSArIG1hdDEoMCwxKSptYXQyKDEsMCkgKyBtYXQxKDAsMikqbWF0MigyLDApKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsMSksIG1hdDEoMCwwKSptYXQyKDAsMSkgKyBtYXQxKDAsMSkqbWF0MigxLDEpICsgbWF0MSgwLDIpKm1hdDIoMiwxKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygxLDApLCBtYXQxKDEsMCkqbWF0MigwLDApICsgbWF0MSgxLDEpKm1hdDIoMSwwKSArIG1hdDEoMSwyKSptYXQyKDIsMCkpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwxKSwgbWF0MSgxLDApKm1hdDIoMCwxKSArIG1hdDEoMSwxKSptYXQyKDEsMSkgKyBtYXQxKDEsMikqbWF0MigyLDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsIDApLCBtYXQxKDAsIDApICogbWF0MigwLCAwKSArIG1hdDEoMCwgMSkgKiBtYXQyKDEsIDApICsgbWF0MSgwLCAyKSAqIG1hdDIoMiwgMCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwgMSksIG1hdDEoMCwgMCkgKiBtYXQyKDAsIDEpICsgbWF0MSgwLCAxKSAqIG1hdDIoMSwgMSkgKyBtYXQxKDAsIDIpICogbWF0MigyLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAwKSwgbWF0MSgxLCAwKSAqIG1hdDIoMCwgMCkgKyBtYXQxKDEsIDEpICogbWF0MigxLCAwKSArIG1hdDEoMSwgMikgKiBtYXQyKDIsIDApKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsIDEpLCBtYXQxKDEsIDApICogbWF0MigwLCAxKSArIG1hdDEoMSwgMSkgKiBtYXQyKDEsIDEpICsgbWF0MSgxLCAyKSAqIG1hdDIoMiwgMSkpOwogfQogCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfb3V0X29mX29yZGVyX2NvbnRyYWN0aW9uKCkKLXsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfb3V0X29mX29yZGVyX2NvbnRyYWN0aW9uKCkgewogICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IG1hdDEoMiwgMiwgMik7CiAgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gbWF0MigyLCAyLCAyKTsKIApAQCAtMjgxLDQwICsyNjksMzAgQEAKICAgRWlnZW46OmFycmF5PERpbVBhaXIsIDI+IGRpbXMgPSB7e0RpbVBhaXIoMiwgMCksIERpbVBhaXIoMCwgMil9fTsKICAgbWF0MyA9IG1hdDEuY29udHJhY3QobWF0MiwgZGltcyk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsIDApLAotICAgICAgICAgICAgICAgICAgIG1hdDEoMCwwLDApKm1hdDIoMCwwLDApICsgbWF0MSgxLDAsMCkqbWF0MigwLDAsMSkgKwotICAgICAgICAgICAgICAgICAgIG1hdDEoMCwwLDEpKm1hdDIoMSwwLDApICsgbWF0MSgxLDAsMSkqbWF0MigxLDAsMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwgMCksCi0gICAgICAgICAgICAgICAgICAgbWF0MSgwLDEsMCkqbWF0MigwLDAsMCkgKyBtYXQxKDEsMSwwKSptYXQyKDAsMCwxKSArCi0gICAgICAgICAgICAgICAgICAgbWF0MSgwLDEsMSkqbWF0MigxLDAsMCkgKyBtYXQxKDEsMSwxKSptYXQyKDEsMCwxKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAxKSwKLSAgICAgICAgICAgICAgICAgICBtYXQxKDAsMCwwKSptYXQyKDAsMSwwKSArIG1hdDEoMSwwLDApKm1hdDIoMCwxLDEpICsKLSAgICAgICAgICAgICAgICAgICBtYXQxKDAsMCwxKSptYXQyKDEsMSwwKSArIG1hdDEoMSwwLDEpKm1hdDIoMSwxLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsIDEpLAotICAgICAgICAgICAgICAgICAgIG1hdDEoMCwxLDApKm1hdDIoMCwxLDApICsgbWF0MSgxLDEsMCkqbWF0MigwLDEsMSkgKwotICAgICAgICAgICAgICAgICAgIG1hdDEoMCwxLDEpKm1hdDIoMSwxLDApICsgbWF0MSgxLDEsMSkqbWF0MigxLDEsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwgMCksIG1hdDEoMCwgMCwgMCkgKiBtYXQyKDAsIDAsIDApICsgbWF0MSgxLCAwLCAwKSAqIG1hdDIoMCwgMCwgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQxKDAsIDAsIDEpICogbWF0MigxLCAwLCAwKSArIG1hdDEoMSwgMCwgMSkgKiBtYXQyKDEsIDAsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsIDApLCBtYXQxKDAsIDEsIDApICogbWF0MigwLCAwLCAwKSArIG1hdDEoMSwgMSwgMCkgKiBtYXQyKDAsIDAsIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0MSgwLCAxLCAxKSAqIG1hdDIoMSwgMCwgMCkgKyBtYXQxKDEsIDEsIDEpICogbWF0MigxLCAwLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAxKSwgbWF0MSgwLCAwLCAwKSAqIG1hdDIoMCwgMSwgMCkgKyBtYXQxKDEsIDAsIDApICogbWF0MigwLCAxLCAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdDEoMCwgMCwgMSkgKiBtYXQyKDEsIDEsIDApICsgbWF0MSgxLCAwLCAxKSAqIG1hdDIoMSwgMSwgMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwgMSksIG1hdDEoMCwgMSwgMCkgKiBtYXQyKDAsIDEsIDApICsgbWF0MSgxLCAxLCAwKSAqIG1hdDIoMCwgMSwgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQxKDAsIDEsIDEpICogbWF0MigxLCAxLCAwKSArIG1hdDEoMSwgMSwgMSkgKiBtYXQyKDEsIDEsIDEpKTsKIAogICBFaWdlbjo6YXJyYXk8RGltUGFpciwgMj4gZGltczIgPSB7e0RpbVBhaXIoMCwgMiksIERpbVBhaXIoMiwgMCl9fTsKICAgbWF0MyA9IG1hdDEuY29udHJhY3QobWF0MiwgZGltczIpOwogCi0gIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAwKSwKLSAgICAgICAgICAgICAgICAgICBtYXQxKDAsMCwwKSptYXQyKDAsMCwwKSArIG1hdDEoMSwwLDApKm1hdDIoMCwwLDEpICsKLSAgICAgICAgICAgICAgICAgICBtYXQxKDAsMCwxKSptYXQyKDEsMCwwKSArIG1hdDEoMSwwLDEpKm1hdDIoMSwwLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsIDApLAotICAgICAgICAgICAgICAgICAgIG1hdDEoMCwxLDApKm1hdDIoMCwwLDApICsgbWF0MSgxLDEsMCkqbWF0MigwLDAsMSkgKwotICAgICAgICAgICAgICAgICAgIG1hdDEoMCwxLDEpKm1hdDIoMSwwLDApICsgbWF0MSgxLDEsMSkqbWF0MigxLDAsMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwgMSksCi0gICAgICAgICAgICAgICAgICAgbWF0MSgwLDAsMCkqbWF0MigwLDEsMCkgKyBtYXQxKDEsMCwwKSptYXQyKDAsMSwxKSArCi0gICAgICAgICAgICAgICAgICAgbWF0MSgwLDAsMSkqbWF0MigxLDEsMCkgKyBtYXQxKDEsMCwxKSptYXQyKDEsMSwxKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAxKSwKLSAgICAgICAgICAgICAgICAgICBtYXQxKDAsMSwwKSptYXQyKDAsMSwwKSArIG1hdDEoMSwxLDApKm1hdDIoMCwxLDEpICsKLSAgICAgICAgICAgICAgICAgICBtYXQxKDAsMSwxKSptYXQyKDEsMSwwKSArIG1hdDEoMSwxLDEpKm1hdDIoMSwxLDEpKTsKLQorICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwgMCksIG1hdDEoMCwgMCwgMCkgKiBtYXQyKDAsIDAsIDApICsgbWF0MSgxLCAwLCAwKSAqIG1hdDIoMCwgMCwgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQxKDAsIDAsIDEpICogbWF0MigxLCAwLCAwKSArIG1hdDEoMSwgMCwgMSkgKiBtYXQyKDEsIDAsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsIDApLCBtYXQxKDAsIDEsIDApICogbWF0MigwLCAwLCAwKSArIG1hdDEoMSwgMSwgMCkgKiBtYXQyKDAsIDAsIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0MSgwLCAxLCAxKSAqIG1hdDIoMSwgMCwgMCkgKyBtYXQxKDEsIDEsIDEpICogbWF0MigxLCAwLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAxKSwgbWF0MSgwLCAwLCAwKSAqIG1hdDIoMCwgMSwgMCkgKyBtYXQxKDEsIDAsIDApICogbWF0MigwLCAxLCAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdDEoMCwgMCwgMSkgKiBtYXQyKDEsIDEsIDApICsgbWF0MSgxLCAwLCAxKSAqIG1hdDIoMSwgMSwgMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwgMSksIG1hdDEoMCwgMSwgMCkgKiBtYXQyKDAsIDEsIDApICsgbWF0MSgxLCAxLCAwKSAqIG1hdDIoMCwgMSwgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQxKDAsIDEsIDEpICogbWF0MigxLCAxLCAwKSArIG1hdDEoMSwgMSwgMSkgKiBtYXQyKDEsIDEsIDEpKTsKIH0KIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5KCkKLXsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3koKSB7CiAgIC8vIHRoaXMgZG9lcyBzb21ldGhpbmcgbGlrZSB0ZXN0aW5nIChBKkIpXlQgPSAoQl5UICogQV5UKQogCiAgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gbWF0MSg0LCAzLCA1KTsKQEAgLTM0OSw5ICszMjcsOCBAQAogICB9CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9sYXJnZV9jb250cmFjdGlvbigpCi17Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2xhcmdlX2NvbnRyYWN0aW9uKCkgewogICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRfbGVmdCgzMCwgNTAsIDgsIDMxKTsKICAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiB0X3JpZ2h0KDgsIDMxLCA3LCAyMCwgMTApOwogICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHRfcmVzdWx0KDMwLCA1MCwgNywgMjAsIDEwKTsKQEAgLTM4MSw5ICszNTgsOCBAQAogICB9CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9tYXRyaXhfdmVjdG9yKCkKLXsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfbWF0cml4X3ZlY3RvcigpIHsKICAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0X2xlZnQoMzAsIDUwKTsKICAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiB0X3JpZ2h0KDUwKTsKICAgVGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiB0X3Jlc3VsdCgzMCk7CkBAIC00MDgsMTAgKzM4NCw4IEBACiAgIH0KIH0KIAotCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfdGVuc29yX3ZlY3RvcigpCi17Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3RlbnNvcl92ZWN0b3IoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gdF9sZWZ0KDcsIDEzLCAxNyk7CiAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdF9yaWdodCgxLCA3KTsKIApAQCAtNDIzLDcgKzM5Nyw3IEBACiAgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gdF9yZXN1bHQgPSB0X2xlZnQuY29udHJhY3QodF9yaWdodCwgZGltX3BhaXIwMSk7CiAKICAgdHlwZWRlZiBNYXA8RWlnZW46Ok1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4+IE1hcFhmOwotICBNYXBYZiBtX2xlZnQodF9sZWZ0LmRhdGEoKSwgNywgMTMqMTcpOworICBNYXBYZiBtX2xlZnQodF9sZWZ0LmRhdGEoKSwgNywgMTMgKiAxNyk7CiAgIE1hcFhmIG1fcmlnaHQodF9yaWdodC5kYXRhKCksIDEsIDcpOwogICBFaWdlbjo6TWF0cml4PGZsb2F0LCBEeW5hbWljLCBEeW5hbWljLCBEYXRhTGF5b3V0PiBtX3Jlc3VsdCA9IG1fbGVmdC50cmFuc3Bvc2UoKSAqIG1fcmlnaHQudHJhbnNwb3NlKCk7CiAKQEAgLTQzMiwxMCArNDA2LDggQEAKICAgfQogfQogCi0KLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9zbWFsbF9ibG9ja2luZ19mYWN0b3JzKCkKLXsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfc21hbGxfYmxvY2tpbmdfZmFjdG9ycygpIHsKICAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0X2xlZnQoMzAsIDUsIDMsIDMxKTsKICAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiB0X3JpZ2h0KDMsIDMxLCA3LCAyMCwgMSk7CiAgIHRfbGVmdC5zZXRSYW5kb20oKTsKQEAgLTQ2Myw5ICs0MzUsOCBAQAogICB9CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF90ZW5zb3JfcHJvZHVjdCgpCi17Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3RlbnNvcl9wcm9kdWN0KCkgewogICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG1hdDEoMiwgMyk7CiAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gbWF0Mig0LCAxKTsKICAgbWF0MS5zZXRSYW5kb20oKTsKQEAgLTQ4Miw0MiArNDUzLDM5IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByZXN1bHQuZGltZW5zaW9uKDEpOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcmVzdWx0LmRpbWVuc2lvbigyKTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgcmVzdWx0LmRpbWVuc2lvbigzKTsgKytsKSB7Ci0JCQlWRVJJRllfSVNfQVBQUk9YKHJlc3VsdChpLCBqLCBrLCBsKSwgbWF0MShpLCBqKSAqIG1hdDIoaywgbCkgKTsKKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdChpLCBqLCBrLCBsKSwgbWF0MShpLCBqKSAqIG1hdDIoaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLQotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2NvbnN0X2lucHV0cygpCi17Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2NvbnN0X2lucHV0cygpIHsKICAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBpbjEoMiwgMyk7CiAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gaW4yKDMsIDIpOwogICBpbjEuc2V0UmFuZG9tKCk7CiAgIGluMi5zZXRSYW5kb20oKTsKIAotICBUZW5zb3JNYXA8VGVuc29yPGNvbnN0IGZsb2F0LCAyLCBEYXRhTGF5b3V0PiA+IG1hdDEoaW4xLmRhdGEoKSwgMiwgMyk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgZmxvYXQsIDIsIERhdGFMYXlvdXQ+ID4gbWF0MihpbjIuZGF0YSgpLCAzLCAyKTsKLSAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBtYXQzKDIsMik7CisgIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgZmxvYXQsIDIsIERhdGFMYXlvdXQ+PiBtYXQxKGluMS5kYXRhKCksIDIsIDMpOworICBUZW5zb3JNYXA8VGVuc29yPGNvbnN0IGZsb2F0LCAyLCBEYXRhTGF5b3V0Pj4gbWF0MihpbjIuZGF0YSgpLCAzLCAyKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBtYXQzKDIsIDIpOwogCiAgIEVpZ2VuOjphcnJheTxEaW1QYWlyLCAxPiBkaW1zID0ge3tEaW1QYWlyKDEsIDApfX07CiAgIG1hdDMgPSBtYXQxLmNvbnRyYWN0KG1hdDIsIGRpbXMpOwogCi0gIFZFUklGWV9JU19BUFBST1gobWF0MygwLDApLCBtYXQxKDAsMCkqbWF0MigwLDApICsgbWF0MSgwLDEpKm1hdDIoMSwwKSArIG1hdDEoMCwyKSptYXQyKDIsMCkpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwxKSwgbWF0MSgwLDApKm1hdDIoMCwxKSArIG1hdDEoMCwxKSptYXQyKDEsMSkgKyBtYXQxKDAsMikqbWF0MigyLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsMCksIG1hdDEoMSwwKSptYXQyKDAsMCkgKyBtYXQxKDEsMSkqbWF0MigxLDApICsgbWF0MSgxLDIpKm1hdDIoMiwwKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygxLDEpLCBtYXQxKDEsMCkqbWF0MigwLDEpICsgbWF0MSgxLDEpKm1hdDIoMSwxKSArIG1hdDEoMSwyKSptYXQyKDIsMSkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwgMCksIG1hdDEoMCwgMCkgKiBtYXQyKDAsIDApICsgbWF0MSgwLCAxKSAqIG1hdDIoMSwgMCkgKyBtYXQxKDAsIDIpICogbWF0MigyLCAwKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAxKSwgbWF0MSgwLCAwKSAqIG1hdDIoMCwgMSkgKyBtYXQxKDAsIDEpICogbWF0MigxLCAxKSArIG1hdDEoMCwgMikgKiBtYXQyKDIsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsIDApLCBtYXQxKDEsIDApICogbWF0MigwLCAwKSArIG1hdDEoMSwgMSkgKiBtYXQyKDEsIDApICsgbWF0MSgxLCAyKSAqIG1hdDIoMiwgMCkpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwgMSksIG1hdDEoMSwgMCkgKiBtYXQyKDAsIDEpICsgbWF0MSgxLCAxKSAqIG1hdDIoMSwgMSkgKyBtYXQxKDEsIDIpICogbWF0MigyLCAxKSk7CiB9CiAKIC8vIEFwcGx5IFNxcnQgdG8gYWxsIG91dHB1dCBlbGVtZW50cy4KIHN0cnVjdCBTcXJ0T3V0cHV0S2VybmVsIHsKICAgdGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4LCB0eXBlbmFtZSBTY2FsYXI+Ci0gIEVJR0VOX0FMV0FZU19JTkxJTkUgdm9pZCBvcGVyYXRvcigpKAotICAgICAgY29uc3QgaW50ZXJuYWw6OmJsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgQ29sTWFqb3I+JiBvdXRwdXRfbWFwcGVyLAotICAgICAgY29uc3QgVGVuc29yQ29udHJhY3Rpb25QYXJhbXMmLCBJbmRleCwgSW5kZXgsIEluZGV4IG51bV9yb3dzLAotICAgICAgSW5kZXggbnVtX2NvbHMpIGNvbnN0IHsKKyAgRUlHRU5fQUxXQVlTX0lOTElORSB2b2lkIG9wZXJhdG9yKCkoY29uc3QgaW50ZXJuYWw6OmJsYXNfZGF0YV9tYXBwZXI8U2NhbGFyLCBJbmRleCwgQ29sTWFqb3I+JiBvdXRwdXRfbWFwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW5zb3JDb250cmFjdGlvblBhcmFtcyYsIEluZGV4LCBJbmRleCwgSW5kZXggbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IG51bV9jb2xzKSBjb25zdCB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fcm93czsgKytpKSB7CiAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bV9jb2xzOyArK2opIHsKICAgICAgICAgb3V0cHV0X21hcHBlcihpLCBqKSA9IHN0ZDo6c3FydChvdXRwdXRfbWFwcGVyKGksIGopKTsKQEAgLTU2MCw4ICs1MjgsNyBAQAogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfY29udHJhY3Rpb24pCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2NvbnRyYWN0aW9uKSB7CiAgIENBTExfU1VCVEVTVF8xKHRlc3RfZXZhbHM8Q29sTWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2V2YWxzPFJvd01ham9yPigpKTsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9zY2FsYXI8Q29sTWFqb3I+KCkpOwpAQCAtNTk3LDUgKzU2NCw0IEBACiAKICAgLy8gRm9yY2UgQ01ha2UgdG8gc3BsaXQgdGhpcyB0ZXN0LgogICAvLyBFSUdFTl9TVUZGSVhFUzsxOzI7Mzs0OzU7Njs3OzgKLQogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udm9sdXRpb24uY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udm9sdXRpb24uY3BwCmluZGV4IGMzNjg4ZjYuLmM5MjE4NjUgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbnZvbHV0aW9uLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jb252b2x1dGlvbi5jcHAKQEAgLTExLDE5ICsxMSwxOCBAQAogCiAjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgogCi11c2luZyBFaWdlbjo6VGVuc29yOwogdXNpbmcgRWlnZW46OkRlZmF1bHREZXZpY2U7Cit1c2luZyBFaWdlbjo6VGVuc29yOwogCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2V2YWxzKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfZXZhbHMoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gaW5wdXQoMywgMyk7CiAgIFRlbnNvcjxmbG9hdCwgMSwgRGF0YUxheW91dD4ga2VybmVsKDIpOwogCiAgIGlucHV0LnNldFJhbmRvbSgpOwogICBrZXJuZWwuc2V0UmFuZG9tKCk7CiAKLSAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiByZXN1bHQoMiwzKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiByZXN1bHQoMiwgMyk7CiAgIHJlc3VsdC5zZXRaZXJvKCk7CiAgIEVpZ2VuOjphcnJheTxUZW5zb3I8ZmxvYXQsIDI+OjpJbmRleCwgMT4gZGltczM7CiAgIGRpbXMzWzBdID0gMDsKQEAgLTMxLDQwICszMCwzOSBAQAogICB0eXBlZGVmIFRlbnNvckV2YWx1YXRvcjxkZWNsdHlwZShpbnB1dC5jb252b2x2ZShrZXJuZWwsIGRpbXMzKSksIERlZmF1bHREZXZpY2U+IEV2YWx1YXRvcjsKICAgRXZhbHVhdG9yIGV2YWwoaW5wdXQuY29udm9sdmUoa2VybmVsLCBkaW1zMyksIERlZmF1bHREZXZpY2UoKSk7CiAgIGV2YWwuZXZhbFRvKHJlc3VsdC5kYXRhKCkpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKEV2YWx1YXRvcjo6TnVtRGltcz09MnVsLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKEV2YWx1YXRvcjo6TnVtRGltcyA9PSAydWwsIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CiAgIFZFUklGWV9JU19FUVVBTChldmFsLmRpbWVuc2lvbnMoKVswXSwgMik7CiAgIFZFUklGWV9JU19FUVVBTChldmFsLmRpbWVuc2lvbnMoKVsxXSwgMyk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCwwKSwgaW5wdXQoMCwwKSprZXJuZWwoMCkgKyBpbnB1dCgxLDApKmtlcm5lbCgxKSk7ICAvLyBpbmRleCAwCi0gIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDAsMSksIGlucHV0KDAsMSkqa2VybmVsKDApICsgaW5wdXQoMSwxKSprZXJuZWwoMSkpOyAgLy8gaW5kZXggMgotICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwLDIpLCBpbnB1dCgwLDIpKmtlcm5lbCgwKSArIGlucHV0KDEsMikqa2VybmVsKDEpKTsgIC8vIGluZGV4IDQKLSAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSwwKSwgaW5wdXQoMSwwKSprZXJuZWwoMCkgKyBpbnB1dCgyLDApKmtlcm5lbCgxKSk7ICAvLyBpbmRleCAxCi0gIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsMSksIGlucHV0KDEsMSkqa2VybmVsKDApICsgaW5wdXQoMiwxKSprZXJuZWwoMSkpOyAgLy8gaW5kZXggMwotICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgxLDIpLCBpbnB1dCgxLDIpKmtlcm5lbCgwKSArIGlucHV0KDIsMikqa2VybmVsKDEpKTsgIC8vIGluZGV4IDUKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCwgMCksIGlucHV0KDAsIDApICoga2VybmVsKDApICsgaW5wdXQoMSwgMCkgKiBrZXJuZWwoMSkpOyAgLy8gaW5kZXggMAorICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwLCAxKSwgaW5wdXQoMCwgMSkgKiBrZXJuZWwoMCkgKyBpbnB1dCgxLCAxKSAqIGtlcm5lbCgxKSk7ICAvLyBpbmRleCAyCisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDAsIDIpLCBpbnB1dCgwLCAyKSAqIGtlcm5lbCgwKSArIGlucHV0KDEsIDIpICoga2VybmVsKDEpKTsgIC8vIGluZGV4IDQKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSwgMCksIGlucHV0KDEsIDApICoga2VybmVsKDApICsgaW5wdXQoMiwgMCkgKiBrZXJuZWwoMSkpOyAgLy8gaW5kZXggMQorICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgxLCAxKSwgaW5wdXQoMSwgMSkgKiBrZXJuZWwoMCkgKyBpbnB1dCgyLCAxKSAqIGtlcm5lbCgxKSk7ICAvLyBpbmRleCAzCisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsIDIpLCBpbnB1dCgxLCAyKSAqIGtlcm5lbCgwKSArIGlucHV0KDIsIDIpICoga2VybmVsKDEpKTsgIC8vIGluZGV4IDUKIH0KIAogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9leHByKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfZXhwcigpIHsKICAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBpbnB1dCgzLCAzKTsKICAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBrZXJuZWwoMiwgMik7CiAgIGlucHV0LnNldFJhbmRvbSgpOwogICBrZXJuZWwuc2V0UmFuZG9tKCk7CiAKLSAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiByZXN1bHQoMiwyKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiByZXN1bHQoMiwgMik7CiAgIEVpZ2VuOjphcnJheTxwdHJkaWZmX3QsIDI+IGRpbXM7CiAgIGRpbXNbMF0gPSAwOwogICBkaW1zWzFdID0gMTsKICAgcmVzdWx0ID0gaW5wdXQuY29udm9sdmUoa2VybmVsLCBkaW1zKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwLDApLCBpbnB1dCgwLDApKmtlcm5lbCgwLDApICsgaW5wdXQoMCwxKSprZXJuZWwoMCwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KDEsMCkqa2VybmVsKDEsMCkgKyBpbnB1dCgxLDEpKmtlcm5lbCgxLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCwxKSwgaW5wdXQoMCwxKSprZXJuZWwoMCwwKSArIGlucHV0KDAsMikqa2VybmVsKDAsMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCgxLDEpKmtlcm5lbCgxLDApICsgaW5wdXQoMSwyKSprZXJuZWwoMSwxKSk7Ci0gIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsMCksIGlucHV0KDEsMCkqa2VybmVsKDAsMCkgKyBpbnB1dCgxLDEpKmtlcm5lbCgwLDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoMiwwKSprZXJuZWwoMSwwKSArIGlucHV0KDIsMSkqa2VybmVsKDEsMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgxLDEpLCBpbnB1dCgxLDEpKmtlcm5lbCgwLDApICsgaW5wdXQoMSwyKSprZXJuZWwoMCwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KDIsMSkqa2VybmVsKDEsMCkgKyBpbnB1dCgyLDIpKmtlcm5lbCgxLDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCwgMCksIGlucHV0KDAsIDApICoga2VybmVsKDAsIDApICsgaW5wdXQoMCwgMSkgKiBrZXJuZWwoMCwgMSkgKyBpbnB1dCgxLCAwKSAqIGtlcm5lbCgxLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoMSwgMSkgKiBrZXJuZWwoMSwgMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwLCAxKSwgaW5wdXQoMCwgMSkgKiBrZXJuZWwoMCwgMCkgKyBpbnB1dCgwLCAyKSAqIGtlcm5lbCgwLCAxKSArIGlucHV0KDEsIDEpICoga2VybmVsKDEsIDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCgxLCAyKSAqIGtlcm5lbCgxLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsIDApLCBpbnB1dCgxLCAwKSAqIGtlcm5lbCgwLCAwKSArIGlucHV0KDEsIDEpICoga2VybmVsKDAsIDEpICsgaW5wdXQoMiwgMCkgKiBrZXJuZWwoMSwgMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KDIsIDEpICoga2VybmVsKDEsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSwgMSksIGlucHV0KDEsIDEpICoga2VybmVsKDAsIDApICsgaW5wdXQoMSwgMikgKiBrZXJuZWwoMCwgMSkgKyBpbnB1dCgyLCAxKSAqIGtlcm5lbCgxLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoMiwgMikgKiBrZXJuZWwoMSwgMSkpOwogfQogCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CkBAIC0xMzEsMTQgKzEyOSwxMSBAQAogICByZXN1bHQgPSBpbnB1dC5zdHJpZGUoc3RyaWRlX29mXzMpLmNvbnZvbHZlKGtlcm5lbCwgZGltcykuc3RyaWRlKHN0cmlkZV9vZl8yKTsKIAogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgMik7Ci0gIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDApLCAoaW5wdXQoMCkqa2VybmVsKDApICsgaW5wdXQoMykqa2VybmVsKDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCg2KSprZXJuZWwoMikpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSksIChpbnB1dCg2KSprZXJuZWwoMCkgKyBpbnB1dCg5KSprZXJuZWwoMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KDEyKSprZXJuZWwoMikpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCksIChpbnB1dCgwKSAqIGtlcm5lbCgwKSArIGlucHV0KDMpICoga2VybmVsKDEpICsgaW5wdXQoNikgKiBrZXJuZWwoMikpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSksIChpbnB1dCg2KSAqIGtlcm5lbCgwKSArIGlucHV0KDkpICoga2VybmVsKDEpICsgaW5wdXQoMTIpICoga2VybmVsKDIpKSk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfY29udm9sdXRpb24pCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2NvbnZvbHV0aW9uKSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2V2YWxzPENvbE1ham9yPigpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfZXZhbHM8Um93TWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9leHByPENvbE1ham9yPigpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2NvbnZvbHV0aW9uX3N5Y2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udm9sdXRpb25fc3ljbC5jcHAKaW5kZXggMzk1NGM4YS4uMzUwYWMzMyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udm9sdXRpb25fc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY29udm9sdXRpb25fc3ljbC5jcHAKQEAgLTI5LDI2ICsyOSwyNCBAQAogdXNpbmcgRWlnZW46OlN5Y2xEZXZpY2U7CiB1c2luZyBFaWdlbjo6VGVuc29yOwogdXNpbmcgRWlnZW46OlRlbnNvck1hcDsKLXN0YXRpYyBjb25zdCBmbG9hdCBlcnJvcl90aHJlc2hvbGQgPTFlLTRmOwotCitzdGF0aWMgY29uc3QgZmxvYXQgZXJyb3JfdGhyZXNob2xkID0gMWUtNGY7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfbGFyZ19leHByMUQoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQotewotICBJbmRleFR5cGUgaW5kaW0wID01MzsKLSAgSW5kZXhUeXBlIGluZGltMT0gNTU7Ci0gIEluZGV4VHlwZSBpbmRpbTI9IDUxOwotICBJbmRleFR5cGUgb3V0ZGltMD01MDsKLSAgSW5kZXhUeXBlIG91dGRpbTE9NTU7Ci0gIEluZGV4VHlwZSBvdXRkaW0yPTUxOworc3RhdGljIHZvaWQgdGVzdF9sYXJnX2V4cHIxRChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKKyAgSW5kZXhUeXBlIGluZGltMCA9IDUzOworICBJbmRleFR5cGUgaW5kaW0xID0gNTU7CisgIEluZGV4VHlwZSBpbmRpbTIgPSA1MTsKKyAgSW5kZXhUeXBlIG91dGRpbTAgPSA1MDsKKyAgSW5kZXhUeXBlIG91dGRpbTEgPSA1NTsKKyAgSW5kZXhUeXBlIG91dGRpbTIgPSA1MTsKICAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMz4gaW5wdXRfZGltcyA9IHt7aW5kaW0wLCBpbmRpbTEsIGluZGltMn19OwogICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAxPiBrZXJuZWxfZGltcyA9IHt7NH19OwogICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAzPiByZXN1bHRfZGltcyA9IHt7b3V0ZGltMCwgb3V0ZGltMSwgb3V0ZGltMn19OwogCiAgIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBpbnB1dChpbnB1dF9kaW1zKTsKLSAgVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4ga2VybmVsKGtlcm5lbF9kaW1zKTsKLSAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gcmVzdWx0KHJlc3VsdF9kaW1zKTsKLSAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gcmVzdWx0X2hvc3QocmVzdWx0X2RpbXMpOworICBUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4ga2VybmVsKGtlcm5lbF9kaW1zKTsKKyAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHJlc3VsdChyZXN1bHRfZGltcyk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPiByZXN1bHRfaG9zdChyZXN1bHRfZGltcyk7CiAKICAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMT4gZGltczN7ezB9fTsKIApAQCAtNTcsMTMgKzU1LDEzIEBACiAgIHJlc3VsdC5zZXRaZXJvKCk7CiAgIHJlc3VsdF9ob3N0LnNldFplcm8oKTsKIAotICBzdGQ6OnNpemVfdCBpbnB1dF9ieXRlcyA9IGlucHV0LnNpemUoKSAgKiBzaXplb2YoRGF0YVR5cGUpOworICBzdGQ6OnNpemVfdCBpbnB1dF9ieXRlcyA9IGlucHV0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAgIHN0ZDo6c2l6ZV90IGtlcm5lbF9ieXRlcyA9IGtlcm5lbC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogICBzdGQ6OnNpemVfdCByZXN1bHRfYnl0ZXMgPSByZXN1bHQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKIAotICBEYXRhVHlwZSAqIGRfaW5wdXQgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbnB1dF9ieXRlcykpOwotICBEYXRhVHlwZSAqIGRfa2VybmVsICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoa2VybmVsX2J5dGVzKSk7Ci0gIERhdGFUeXBlICogZF9yZXN1bHQgPSAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyZXN1bHRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfaW5wdXQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGlucHV0X2J5dGVzKSk7CisgIERhdGFUeXBlKiBkX2tlcm5lbCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoa2VybmVsX2J5dGVzKSk7CisgIERhdGFUeXBlKiBkX3Jlc3VsdCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocmVzdWx0X2J5dGVzKSk7CiAKICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gZ3B1X2lucHV0KGRfaW5wdXQsIGlucHV0X2RpbXMpOwogICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiBncHVfa2VybmVsKGRfa2VybmVsLCBrZXJuZWxfZGltcyk7CkBAIC03MSw2MCArNjksNTkgQEAKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGRfaW5wdXQsIGlucHV0LmRhdGEoKSwgaW5wdXRfYnl0ZXMpOwogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZF9rZXJuZWwsIGtlcm5lbC5kYXRhKCksIGtlcm5lbF9ieXRlcyk7CiAKLSAgZ3B1X3Jlc3VsdC5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9pbnB1dC5jb252b2x2ZShncHVfa2VybmVsLCBkaW1zMyk7CisgIGdwdV9yZXN1bHQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbnB1dC5jb252b2x2ZShncHVfa2VybmVsLCBkaW1zMyk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZXN1bHQuZGF0YSgpLCBkX3Jlc3VsdCwgcmVzdWx0X2J5dGVzKTsKIAotICByZXN1bHRfaG9zdD1pbnB1dC5jb252b2x2ZShrZXJuZWwsIGRpbXMzKTsKKyAgcmVzdWx0X2hvc3QgPSBpbnB1dC5jb252b2x2ZShrZXJuZWwsIGRpbXMzKTsKIAotZm9yKEluZGV4VHlwZSBpPTA7IGk8IG91dGRpbTA7IGkrKyApewotICBmb3IoSW5kZXhUeXBlIGo9MDsgajwgb3V0ZGltMTsgaisrICl7Ci0gICAgZm9yKEluZGV4VHlwZSBrPTA7IGs8IG91dGRpbTI7IGsrKyApewotICAgICAgaWYgKCEoRWlnZW46OmludGVybmFsOjppc0FwcHJveChyZXN1bHQoaSxqLGspLCByZXN1bHRfaG9zdChpLGosayksIGVycm9yX3RocmVzaG9sZCkpKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PHN0ZDo6c2V0cHJlY2lzaW9uKDE2KTw8ICJtaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAgKCAiPDwgaSAgPDwgIiAsICIgIDw8IGogIDw8ICIsICIgPDwgayA8PCAiICkgIiA8PCAiIFx0ICIgPDwgcmVzdWx0KGksaixrKSA8PCAiIHZzICI8PCAgcmVzdWx0X2hvc3QoaSxqLGspIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCBvdXRkaW0wOyBpKyspIHsKKyAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IG91dGRpbTE7IGorKykgeworICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCBvdXRkaW0yOyBrKyspIHsKKyAgICAgICAgaWYgKCEoRWlnZW46OmludGVybmFsOjppc0FwcHJveChyZXN1bHQoaSwgaiwgayksIHJlc3VsdF9ob3N0KGksIGosIGspLCBlcnJvcl90aHJlc2hvbGQpKSkgeworICAgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldHByZWNpc2lvbigxNikgPDwgIm1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4ICAoICIgPDwgaSA8PCAiICwgIiA8PCBqIDw8ICIsICIgPDwgaworICAgICAgICAgICAgICAgICAgICA8PCAiICkgIgorICAgICAgICAgICAgICAgICAgICA8PCAiIFx0ICIgPDwgcmVzdWx0KGksIGosIGspIDw8ICIgdnMgIiA8PCByZXN1bHRfaG9zdChpLCBqLCBrKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQotfQogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGRfaW5wdXQpOwogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGRfa2VybmVsKTsKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShkX3Jlc3VsdCk7Ci0KIH0KIAotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X2xhcmdfZXhwcjJEKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkKLXsKLSAgSW5kZXhUeXBlIGluZGltMCA9NTM7Ci0gIEluZGV4VHlwZSBpbmRpbTE9IDU1OwotICBJbmRleFR5cGUgaW5kaW0yPSA1MTsKLSAgSW5kZXhUeXBlIG91dGRpbTA9NTA7Ci0gIEluZGV4VHlwZSBvdXRkaW0xPTUxOwotICBJbmRleFR5cGUgb3V0ZGltMj01MTsKK3N0YXRpYyB2b2lkIHRlc3RfbGFyZ19leHByMkQoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CisgIEluZGV4VHlwZSBpbmRpbTAgPSA1MzsKKyAgSW5kZXhUeXBlIGluZGltMSA9IDU1OworICBJbmRleFR5cGUgaW5kaW0yID0gNTE7CisgIEluZGV4VHlwZSBvdXRkaW0wID0gNTA7CisgIEluZGV4VHlwZSBvdXRkaW0xID0gNTE7CisgIEluZGV4VHlwZSBvdXRkaW0yID0gNTE7CiAgIEVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDM+IGlucHV0X2RpbXMgPSB7e2luZGltMCwgaW5kaW0xLCBpbmRpbTJ9fTsKLSAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMj4ga2VybmVsX2RpbXMgPSB7ezQsNX19OworICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAyPiBrZXJuZWxfZGltcyA9IHt7NCwgNX19OwogICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAzPiByZXN1bHRfZGltcyA9IHt7b3V0ZGltMCwgb3V0ZGltMSwgb3V0ZGltMn19OwogCiAgIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBpbnB1dChpbnB1dF9kaW1zKTsKLSAgVGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4ga2VybmVsKGtlcm5lbF9kaW1zKTsKLSAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gcmVzdWx0KHJlc3VsdF9kaW1zKTsKLSAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gcmVzdWx0X2hvc3QocmVzdWx0X2RpbXMpOworICBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4ga2VybmVsKGtlcm5lbF9kaW1zKTsKKyAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHJlc3VsdChyZXN1bHRfZGltcyk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPiByZXN1bHRfaG9zdChyZXN1bHRfZGltcyk7CiAKLSAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMj4gZGltczN7ezAsMX19OworICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAyPiBkaW1zM3t7MCwgMX19OwogCiAgIGlucHV0LnNldFJhbmRvbSgpOwogICBrZXJuZWwuc2V0UmFuZG9tKCk7CiAgIHJlc3VsdC5zZXRaZXJvKCk7CiAgIHJlc3VsdF9ob3N0LnNldFplcm8oKTsKIAotICBzdGQ6OnNpemVfdCBpbnB1dF9ieXRlcyA9IGlucHV0LnNpemUoKSAgKiBzaXplb2YoRGF0YVR5cGUpOworICBzdGQ6OnNpemVfdCBpbnB1dF9ieXRlcyA9IGlucHV0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAgIHN0ZDo6c2l6ZV90IGtlcm5lbF9ieXRlcyA9IGtlcm5lbC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogICBzdGQ6OnNpemVfdCByZXN1bHRfYnl0ZXMgPSByZXN1bHQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKIAotICBEYXRhVHlwZSAqIGRfaW5wdXQgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbnB1dF9ieXRlcykpOwotICBEYXRhVHlwZSAqIGRfa2VybmVsICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoa2VybmVsX2J5dGVzKSk7Ci0gIERhdGFUeXBlICogZF9yZXN1bHQgPSAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyZXN1bHRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfaW5wdXQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGlucHV0X2J5dGVzKSk7CisgIERhdGFUeXBlKiBkX2tlcm5lbCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoa2VybmVsX2J5dGVzKSk7CisgIERhdGFUeXBlKiBkX3Jlc3VsdCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocmVzdWx0X2J5dGVzKSk7CiAKICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gZ3B1X2lucHV0KGRfaW5wdXQsIGlucHV0X2RpbXMpOwogICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiBncHVfa2VybmVsKGRfa2VybmVsLCBrZXJuZWxfZGltcyk7CkBAIC0xMzIsNjAgKzEyOSw1OSBAQAogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZF9pbnB1dCwgaW5wdXQuZGF0YSgpLCBpbnB1dF9ieXRlcyk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShkX2tlcm5lbCwga2VybmVsLmRhdGEoKSwga2VybmVsX2J5dGVzKTsKIAotICBncHVfcmVzdWx0LmRldmljZShzeWNsX2RldmljZSk9Z3B1X2lucHV0LmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMzKTsKKyAgZ3B1X3Jlc3VsdC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2lucHV0LmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMzKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJlc3VsdC5kYXRhKCksIGRfcmVzdWx0LCByZXN1bHRfYnl0ZXMpOwogCi0gIHJlc3VsdF9ob3N0PWlucHV0LmNvbnZvbHZlKGtlcm5lbCwgZGltczMpOworICByZXN1bHRfaG9zdCA9IGlucHV0LmNvbnZvbHZlKGtlcm5lbCwgZGltczMpOwogCi1mb3IoSW5kZXhUeXBlIGk9MDsgaTwgb3V0ZGltMDsgaSsrICl7Ci0gIGZvcihJbmRleFR5cGUgaj0wOyBqPCBvdXRkaW0xOyBqKysgKXsKLSAgICBmb3IoSW5kZXhUeXBlIGs9MDsgazwgb3V0ZGltMjsgaysrICl7Ci0gICAgICBpZiAoIShFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHJlc3VsdChpLGosayksIHJlc3VsdF9ob3N0KGksaixrKSwgZXJyb3JfdGhyZXNob2xkKSkpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8c3RkOjpzZXRwcmVjaXNpb24oMTYpPDwgIm1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4ICAoICI8PCBpICA8PCAiICwgIiAgPDwgaiAgPDwgIiwgIiA8PCBrIDw8ICIgKSAiIDw8ICIgXHQgIiA8PCByZXN1bHQoaSxqLGspIDw8ICIgdnMgIjw8ICByZXN1bHRfaG9zdChpLGosaykgPDwgc3RkOjplbmRsOwotICAgICAgICBhc3NlcnQoZmFsc2UpOworICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IG91dGRpbTA7IGkrKykgeworICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgb3V0ZGltMTsgaisrKSB7CisgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IG91dGRpbTI7IGsrKykgeworICAgICAgICBpZiAoIShFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHJlc3VsdChpLCBqLCBrKSwgcmVzdWx0X2hvc3QoaSwgaiwgayksIGVycm9yX3RocmVzaG9sZCkpKSB7CisgICAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDE2KSA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggICggIiA8PCBpIDw8ICIgLCAiIDw8IGogPDwgIiwgIiA8PCBrCisgICAgICAgICAgICAgICAgICAgIDw8ICIgKSAiCisgICAgICAgICAgICAgICAgICAgIDw8ICIgXHQgIiA8PCByZXN1bHQoaSwgaiwgaykgPDwgIiB2cyAiIDw8IHJlc3VsdF9ob3N0KGksIGosIGspIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9Ci19CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZF9pbnB1dCk7CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZF9rZXJuZWwpOwogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGRfcmVzdWx0KTsKLQogfQogCi0KIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfbGFyZ19leHByM0QoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQotewotICBJbmRleFR5cGUgaW5kaW0wID01MzsKLSAgSW5kZXhUeXBlIGluZGltMT0gNTU7Ci0gIEluZGV4VHlwZSBpbmRpbTI9IDUxOwotICBJbmRleFR5cGUgb3V0ZGltMD01MDsKLSAgSW5kZXhUeXBlIG91dGRpbTE9NTE7Ci0gIEluZGV4VHlwZSBvdXRkaW0yPTQ5Oworc3RhdGljIHZvaWQgdGVzdF9sYXJnX2V4cHIzRChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKKyAgSW5kZXhUeXBlIGluZGltMCA9IDUzOworICBJbmRleFR5cGUgaW5kaW0xID0gNTU7CisgIEluZGV4VHlwZSBpbmRpbTIgPSA1MTsKKyAgSW5kZXhUeXBlIG91dGRpbTAgPSA1MDsKKyAgSW5kZXhUeXBlIG91dGRpbTEgPSA1MTsKKyAgSW5kZXhUeXBlIG91dGRpbTIgPSA0OTsKICAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMz4gaW5wdXRfZGltcyA9IHt7aW5kaW0wLCBpbmRpbTEsIGluZGltMn19OwotICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAzPiBrZXJuZWxfZGltcyA9IHt7NCw1LDN9fTsKKyAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMz4ga2VybmVsX2RpbXMgPSB7ezQsIDUsIDN9fTsKICAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMz4gcmVzdWx0X2RpbXMgPSB7e291dGRpbTAsIG91dGRpbTEsIG91dGRpbTJ9fTsKIAogICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW5wdXQoaW5wdXRfZGltcyk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCxJbmRleFR5cGU+IGtlcm5lbChrZXJuZWxfZGltcyk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCxJbmRleFR5cGU+IHJlc3VsdChyZXN1bHRfZGltcyk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCxJbmRleFR5cGU+IHJlc3VsdF9ob3N0KHJlc3VsdF9kaW1zKTsKKyAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGtlcm5lbChrZXJuZWxfZGltcyk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPiByZXN1bHQocmVzdWx0X2RpbXMpOworICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gcmVzdWx0X2hvc3QocmVzdWx0X2RpbXMpOwogCi0gIEVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDM+IGRpbXMze3swLDEsMn19OworICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAzPiBkaW1zM3t7MCwgMSwgMn19OwogCiAgIGlucHV0LnNldFJhbmRvbSgpOwogICBrZXJuZWwuc2V0UmFuZG9tKCk7CiAgIHJlc3VsdC5zZXRaZXJvKCk7CiAgIHJlc3VsdF9ob3N0LnNldFplcm8oKTsKIAotICBzdGQ6OnNpemVfdCBpbnB1dF9ieXRlcyA9IGlucHV0LnNpemUoKSAgKiBzaXplb2YoRGF0YVR5cGUpOworICBzdGQ6OnNpemVfdCBpbnB1dF9ieXRlcyA9IGlucHV0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAgIHN0ZDo6c2l6ZV90IGtlcm5lbF9ieXRlcyA9IGtlcm5lbC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogICBzdGQ6OnNpemVfdCByZXN1bHRfYnl0ZXMgPSByZXN1bHQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKIAotICBEYXRhVHlwZSAqIGRfaW5wdXQgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbnB1dF9ieXRlcykpOwotICBEYXRhVHlwZSAqIGRfa2VybmVsICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoa2VybmVsX2J5dGVzKSk7Ci0gIERhdGFUeXBlICogZF9yZXN1bHQgPSAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyZXN1bHRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfaW5wdXQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGlucHV0X2J5dGVzKSk7CisgIERhdGFUeXBlKiBkX2tlcm5lbCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoa2VybmVsX2J5dGVzKSk7CisgIERhdGFUeXBlKiBkX3Jlc3VsdCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocmVzdWx0X2J5dGVzKSk7CiAKICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gZ3B1X2lucHV0KGRfaW5wdXQsIGlucHV0X2RpbXMpOwogICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiBncHVfa2VybmVsKGRfa2VybmVsLCBrZXJuZWxfZGltcyk7CkBAIC0xOTMsMzggKzE4OSwzNyBAQAogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZF9pbnB1dCwgaW5wdXQuZGF0YSgpLCBpbnB1dF9ieXRlcyk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShkX2tlcm5lbCwga2VybmVsLmRhdGEoKSwga2VybmVsX2J5dGVzKTsKIAotICBncHVfcmVzdWx0LmRldmljZShzeWNsX2RldmljZSk9Z3B1X2lucHV0LmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMzKTsKKyAgZ3B1X3Jlc3VsdC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2lucHV0LmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMzKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJlc3VsdC5kYXRhKCksIGRfcmVzdWx0LCByZXN1bHRfYnl0ZXMpOwogCi0gIHJlc3VsdF9ob3N0PWlucHV0LmNvbnZvbHZlKGtlcm5lbCwgZGltczMpOworICByZXN1bHRfaG9zdCA9IGlucHV0LmNvbnZvbHZlKGtlcm5lbCwgZGltczMpOwogCi1mb3IoSW5kZXhUeXBlIGk9MDsgaTwgb3V0ZGltMDsgaSsrICl7Ci0gIGZvcihJbmRleFR5cGUgaj0wOyBqPCBvdXRkaW0xOyBqKysgKXsKLSAgICBmb3IoSW5kZXhUeXBlIGs9MDsgazwgb3V0ZGltMjsgaysrICl7Ci0gICAgICBpZiAoIShFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHJlc3VsdChpLGosayksIHJlc3VsdF9ob3N0KGksaixrKSwgZXJyb3JfdGhyZXNob2xkKSkpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8c3RkOjpzZXRwcmVjaXNpb24oMTYpPDwgIm1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4ICAoICI8PCBpICA8PCAiICwgIiAgPDwgaiAgPDwgIiwgIiA8PCBrIDw8ICIgKSAiIDw8ICIgXHQgIiA8PCByZXN1bHQoaSxqLGspIDw8ICIgdnMgIjw8ICByZXN1bHRfaG9zdChpLGosaykgPDwgc3RkOjplbmRsOwotICAgICAgICBhc3NlcnQoZmFsc2UpOworICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IG91dGRpbTA7IGkrKykgeworICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgb3V0ZGltMTsgaisrKSB7CisgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IG91dGRpbTI7IGsrKykgeworICAgICAgICBpZiAoIShFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHJlc3VsdChpLCBqLCBrKSwgcmVzdWx0X2hvc3QoaSwgaiwgayksIGVycm9yX3RocmVzaG9sZCkpKSB7CisgICAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDE2KSA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggICggIiA8PCBpIDw8ICIgLCAiIDw8IGogPDwgIiwgIiA8PCBrCisgICAgICAgICAgICAgICAgICAgIDw8ICIgKSAiCisgICAgICAgICAgICAgICAgICAgIDw8ICIgXHQgIiA8PCByZXN1bHQoaSwgaiwgaykgPDwgIiB2cyAiIDw8IHJlc3VsdF9ob3N0KGksIGosIGspIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9Ci19CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZF9pbnB1dCk7CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZF9rZXJuZWwpOwogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGRfcmVzdWx0KTsKLQogfQogCi0KIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfZXZhbHMoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQoteworc3RhdGljIHZvaWQgdGVzdF9ldmFscyhjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMj4gaW5wdXRfZGltcyA9IHt7MywgM319OwogICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAxPiBrZXJuZWxfZGltcyA9IHt7Mn19OwogICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAyPiByZXN1bHRfZGltcyA9IHt7MiwgM319OwogCiAgIFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBpbnB1dChpbnB1dF9kaW1zKTsKLSAgVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4ga2VybmVsKGtlcm5lbF9kaW1zKTsKLSAgVGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gcmVzdWx0KHJlc3VsdF9kaW1zKTsKKyAgVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGtlcm5lbChrZXJuZWxfZGltcyk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiByZXN1bHQocmVzdWx0X2RpbXMpOwogCiAgIEVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDE+IGRpbXMze3swfX07CiAKQEAgLTIzMiwxMyArMjI3LDEzIEBACiAgIGtlcm5lbC5zZXRSYW5kb20oKTsKICAgcmVzdWx0LnNldFplcm8oKTsKIAotICBzdGQ6OnNpemVfdCBpbnB1dF9ieXRlcyA9IGlucHV0LnNpemUoKSAgKiBzaXplb2YoRGF0YVR5cGUpOworICBzdGQ6OnNpemVfdCBpbnB1dF9ieXRlcyA9IGlucHV0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAgIHN0ZDo6c2l6ZV90IGtlcm5lbF9ieXRlcyA9IGtlcm5lbC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogICBzdGQ6OnNpemVfdCByZXN1bHRfYnl0ZXMgPSByZXN1bHQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKIAotICBEYXRhVHlwZSAqIGRfaW5wdXQgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbnB1dF9ieXRlcykpOwotICBEYXRhVHlwZSAqIGRfa2VybmVsICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoa2VybmVsX2J5dGVzKSk7Ci0gIERhdGFUeXBlICogZF9yZXN1bHQgPSAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyZXN1bHRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfaW5wdXQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGlucHV0X2J5dGVzKSk7CisgIERhdGFUeXBlKiBkX2tlcm5lbCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoa2VybmVsX2J5dGVzKSk7CisgIERhdGFUeXBlKiBkX3Jlc3VsdCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocmVzdWx0X2J5dGVzKSk7CiAKICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gZ3B1X2lucHV0KGRfaW5wdXQsIGlucHV0X2RpbXMpOwogICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiBncHVfa2VybmVsKGRfa2VybmVsLCBrZXJuZWxfZGltcyk7CkBAIC0yNDYsMTUgKzI0MSwxNSBAQAogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZF9pbnB1dCwgaW5wdXQuZGF0YSgpLCBpbnB1dF9ieXRlcyk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShkX2tlcm5lbCwga2VybmVsLmRhdGEoKSwga2VybmVsX2J5dGVzKTsKIAotICBncHVfcmVzdWx0LmRldmljZShzeWNsX2RldmljZSk9Z3B1X2lucHV0LmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMzKTsKKyAgZ3B1X3Jlc3VsdC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2lucHV0LmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMzKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJlc3VsdC5kYXRhKCksIGRfcmVzdWx0LCByZXN1bHRfYnl0ZXMpOwogCi0gIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDAsMCksIGlucHV0KDAsMCkqa2VybmVsKDApICsgaW5wdXQoMSwwKSprZXJuZWwoMSkpOyAgLy8gaW5kZXggMAotICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwLDEpLCBpbnB1dCgwLDEpKmtlcm5lbCgwKSArIGlucHV0KDEsMSkqa2VybmVsKDEpKTsgIC8vIGluZGV4IDIKLSAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCwyKSwgaW5wdXQoMCwyKSprZXJuZWwoMCkgKyBpbnB1dCgxLDIpKmtlcm5lbCgxKSk7ICAvLyBpbmRleCA0Ci0gIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsMCksIGlucHV0KDEsMCkqa2VybmVsKDApICsgaW5wdXQoMiwwKSprZXJuZWwoMSkpOyAgLy8gaW5kZXggMQotICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgxLDEpLCBpbnB1dCgxLDEpKmtlcm5lbCgwKSArIGlucHV0KDIsMSkqa2VybmVsKDEpKTsgIC8vIGluZGV4IDMKLSAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSwyKSwgaW5wdXQoMSwyKSprZXJuZWwoMCkgKyBpbnB1dCgyLDIpKmtlcm5lbCgxKSk7ICAvLyBpbmRleCA1CisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDAsIDApLCBpbnB1dCgwLCAwKSAqIGtlcm5lbCgwKSArIGlucHV0KDEsIDApICoga2VybmVsKDEpKTsgIC8vIGluZGV4IDAKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCwgMSksIGlucHV0KDAsIDEpICoga2VybmVsKDApICsgaW5wdXQoMSwgMSkgKiBrZXJuZWwoMSkpOyAgLy8gaW5kZXggMgorICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwLCAyKSwgaW5wdXQoMCwgMikgKiBrZXJuZWwoMCkgKyBpbnB1dCgxLCAyKSAqIGtlcm5lbCgxKSk7ICAvLyBpbmRleCA0CisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsIDApLCBpbnB1dCgxLCAwKSAqIGtlcm5lbCgwKSArIGlucHV0KDIsIDApICoga2VybmVsKDEpKTsgIC8vIGluZGV4IDEKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSwgMSksIGlucHV0KDEsIDEpICoga2VybmVsKDApICsgaW5wdXQoMiwgMSkgKiBrZXJuZWwoMSkpOyAgLy8gaW5kZXggMworICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgxLCAyKSwgaW5wdXQoMSwgMikgKiBrZXJuZWwoMCkgKyBpbnB1dCgyLCAyKSAqIGtlcm5lbCgxKSk7ICAvLyBpbmRleCA1CiAKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShkX2lucHV0KTsKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShkX2tlcm5lbCk7CkBAIC0yNjIsOCArMjU3LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9leHByKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfZXhwcihjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMj4gaW5wdXRfZGltcyA9IHt7MywgM319OwogICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAyPiBrZXJuZWxfZGltcyA9IHt7MiwgMn19OwogICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAyPiByZXN1bHRfZGltcyA9IHt7MiwgMn19OwpAQCAtMjc4LDUxICsyNzIsNDkgQEAKICAgZGltc1swXSA9IDA7CiAgIGRpbXNbMV0gPSAxOwogCi0gIHN0ZDo6c2l6ZV90IGlucHV0X2J5dGVzID0gaW5wdXQuc2l6ZSgpICAqIHNpemVvZihEYXRhVHlwZSk7CisgIHN0ZDo6c2l6ZV90IGlucHV0X2J5dGVzID0gaW5wdXQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKICAgc3RkOjpzaXplX3Qga2VybmVsX2J5dGVzID0ga2VybmVsLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAgIHN0ZDo6c2l6ZV90IHJlc3VsdF9ieXRlcyA9IHJlc3VsdC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogCi0gIERhdGFUeXBlICogZF9pbnB1dCAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGlucHV0X2J5dGVzKSk7Ci0gIERhdGFUeXBlICogZF9rZXJuZWwgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShrZXJuZWxfYnl0ZXMpKTsKLSAgRGF0YVR5cGUgKiBkX3Jlc3VsdCA9ICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHJlc3VsdF9ieXRlcykpOworICBEYXRhVHlwZSogZF9pbnB1dCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5wdXRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfa2VybmVsID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShrZXJuZWxfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyZXN1bHRfYnl0ZXMpKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiA+IGdwdV9pbnB1dChkX2lucHV0LCBpbnB1dF9kaW1zKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gPiBncHVfa2VybmVsKGRfa2VybmVsLCBrZXJuZWxfZGltcyk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCxJbmRleFR5cGU+ID4gZ3B1X3Jlc3VsdChkX3Jlc3VsdCwgcmVzdWx0X2RpbXMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiBncHVfaW5wdXQoZF9pbnB1dCwgaW5wdXRfZGltcyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiA+IGdwdV9rZXJuZWwoZF9rZXJuZWwsIGtlcm5lbF9kaW1zKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gZ3B1X3Jlc3VsdChkX3Jlc3VsdCwgcmVzdWx0X2RpbXMpOwogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZF9pbnB1dCwgaW5wdXQuZGF0YSgpLCBpbnB1dF9ieXRlcyk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShkX2tlcm5lbCwga2VybmVsLmRhdGEoKSwga2VybmVsX2J5dGVzKTsKIAotICBncHVfcmVzdWx0LmRldmljZShzeWNsX2RldmljZSk9Z3B1X2lucHV0LmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMpOworICBncHVfcmVzdWx0LmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW5wdXQuY29udm9sdmUoZ3B1X2tlcm5lbCwgZGltcyk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZXN1bHQuZGF0YSgpLCBkX3Jlc3VsdCwgcmVzdWx0X2J5dGVzKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwLDApLCBpbnB1dCgwLDApKmtlcm5lbCgwLDApICsgaW5wdXQoMCwxKSprZXJuZWwoMCwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KDEsMCkqa2VybmVsKDEsMCkgKyBpbnB1dCgxLDEpKmtlcm5lbCgxLDEpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCwxKSwgaW5wdXQoMCwxKSprZXJuZWwoMCwwKSArIGlucHV0KDAsMikqa2VybmVsKDAsMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCgxLDEpKmtlcm5lbCgxLDApICsgaW5wdXQoMSwyKSprZXJuZWwoMSwxKSk7Ci0gIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsMCksIGlucHV0KDEsMCkqa2VybmVsKDAsMCkgKyBpbnB1dCgxLDEpKmtlcm5lbCgwLDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoMiwwKSprZXJuZWwoMSwwKSArIGlucHV0KDIsMSkqa2VybmVsKDEsMSkpOwotICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgxLDEpLCBpbnB1dCgxLDEpKmtlcm5lbCgwLDApICsgaW5wdXQoMSwyKSprZXJuZWwoMCwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KDIsMSkqa2VybmVsKDEsMCkgKyBpbnB1dCgyLDIpKmtlcm5lbCgxLDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCwgMCksIGlucHV0KDAsIDApICoga2VybmVsKDAsIDApICsgaW5wdXQoMCwgMSkgKiBrZXJuZWwoMCwgMSkgKyBpbnB1dCgxLCAwKSAqIGtlcm5lbCgxLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoMSwgMSkgKiBrZXJuZWwoMSwgMSkpOworICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCgwLCAxKSwgaW5wdXQoMCwgMSkgKiBrZXJuZWwoMCwgMCkgKyBpbnB1dCgwLCAyKSAqIGtlcm5lbCgwLCAxKSArIGlucHV0KDEsIDEpICoga2VybmVsKDEsIDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCgxLCAyKSAqIGtlcm5lbCgxLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDEsIDApLCBpbnB1dCgxLCAwKSAqIGtlcm5lbCgwLCAwKSArIGlucHV0KDEsIDEpICoga2VybmVsKDAsIDEpICsgaW5wdXQoMiwgMCkgKiBrZXJuZWwoMSwgMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KDIsIDEpICoga2VybmVsKDEsIDEpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSwgMSksIGlucHV0KDEsIDEpICoga2VybmVsKDAsIDApICsgaW5wdXQoMSwgMikgKiBrZXJuZWwoMCwgMSkgKyBpbnB1dCgyLCAxKSAqIGtlcm5lbCgxLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoMiwgMikgKiBrZXJuZWwoMSwgMSkpOwogCiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZF9pbnB1dCk7CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZF9rZXJuZWwpOwogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGRfcmVzdWx0KTsKIH0KIAotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X21vZGVzKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSl7CitzdGF0aWMgdm9pZCB0ZXN0X21vZGVzKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgeworICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAxPiBpbnB1dF9kaW1zID0ge3szfX07CisgIEVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDE+IGtlcm5lbF9kaW1zID0ge3szfX07CiAKLUVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDE+IGlucHV0X2RpbXMgPSB7ezN9fTsKLUVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDE+IGtlcm5lbF9kaW1zID0ge3szfX07CisgIFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBpbnB1dChpbnB1dF9kaW1zKTsKKyAgVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGtlcm5lbChrZXJuZWxfZGltcyk7CiAKLVRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBpbnB1dChpbnB1dF9kaW1zKTsKLVRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBrZXJuZWwoa2VybmVsX2RpbXMpOwotCi1pbnB1dC5zZXRSYW5kb20oKTsKLWtlcm5lbC5zZXRSYW5kb20oKTsKLUVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDE+IGRpbXM7Ci1kaW1zWzBdID0gMDsKKyAgaW5wdXQuc2V0UmFuZG9tKCk7CisgIGtlcm5lbC5zZXRSYW5kb20oKTsKKyAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMT4gZGltczsKKyAgZGltc1swXSA9IDA7CiAKICAgaW5wdXQoMCkgPSAxLjBmOwogICBpbnB1dCgxKSA9IDIuMGY7CkBAIC0zMzgsMjEgKzMzMCwyMSBAQAogICBwYWRkaW5nWzBdID0gc3RkOjptYWtlX3BhaXIoMCwgMCk7CiAgIFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiB2YWxpZCgxKTsKIAotICBzdGQ6OnNpemVfdCBpbnB1dF9ieXRlcyA9IGlucHV0LnNpemUoKSAgKiBzaXplb2YoRGF0YVR5cGUpOworICBzdGQ6OnNpemVfdCBpbnB1dF9ieXRlcyA9IGlucHV0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAgIHN0ZDo6c2l6ZV90IGtlcm5lbF9ieXRlcyA9IGtlcm5lbC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogICBzdGQ6OnNpemVfdCB2YWxpZF9ieXRlcyA9IHZhbGlkLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAKLSAgRGF0YVR5cGUgKiBkX2lucHV0ICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5wdXRfYnl0ZXMpKTsKLSAgRGF0YVR5cGUgKiBkX2tlcm5lbCAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGtlcm5lbF9ieXRlcykpOwotICBEYXRhVHlwZSAqIGRfdmFsaWQgPSAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh2YWxpZF9ieXRlcykpOworICBEYXRhVHlwZSogZF9pbnB1dCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5wdXRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfa2VybmVsID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShrZXJuZWxfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfdmFsaWQgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHZhbGlkX2J5dGVzKSk7CiAKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gPiBncHVfaW5wdXQoZF9pbnB1dCwgaW5wdXRfZGltcyk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCxJbmRleFR5cGU+ID4gZ3B1X2tlcm5lbChkX2tlcm5lbCwga2VybmVsX2RpbXMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiA+IGdwdV92YWxpZChkX3ZhbGlkLCB2YWxpZC5kaW1lbnNpb25zKCkpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiBncHVfaW5wdXQoZF9pbnB1dCwgaW5wdXRfZGltcyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiA+IGdwdV9rZXJuZWwoZF9rZXJuZWwsIGtlcm5lbF9kaW1zKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gZ3B1X3ZhbGlkKGRfdmFsaWQsIHZhbGlkLmRpbWVuc2lvbnMoKSk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShkX2lucHV0LCBpbnB1dC5kYXRhKCksIGlucHV0X2J5dGVzKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGRfa2VybmVsLCBrZXJuZWwuZGF0YSgpLCBrZXJuZWxfYnl0ZXMpOwogCi0gIGdwdV92YWxpZC5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9pbnB1dC5wYWQocGFkZGluZykuY29udm9sdmUoZ3B1X2tlcm5lbCwgZGltcyk7CisgIGdwdV92YWxpZC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2lucHV0LnBhZChwYWRkaW5nKS5jb252b2x2ZShncHVfa2VybmVsLCBkaW1zKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHZhbGlkLmRhdGEoKSwgZF92YWxpZCwgdmFsaWRfYnl0ZXMpOwogCiAgIFZFUklGWV9JU19FUVVBTCh2YWxpZC5kaW1lbnNpb24oMCksIDEpOwpAQCAtMzYzLDkgKzM1NSw5IEBACiAgIHBhZGRpbmdbMF0gPSBzdGQ6Om1ha2VfcGFpcigxLCAxKTsKICAgVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHNhbWUoMyk7CiAgIHN0ZDo6c2l6ZV90IHNhbWVfYnl0ZXMgPSBzYW1lLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlICogZF9zYW1lID0gIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoc2FtZV9ieXRlcykpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiA+IGdwdV9zYW1lKGRfc2FtZSwgc2FtZS5kaW1lbnNpb25zKCkpOwotICBncHVfc2FtZS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9pbnB1dC5wYWQocGFkZGluZykuY29udm9sdmUoZ3B1X2tlcm5lbCwgZGltcyk7CisgIERhdGFUeXBlKiBkX3NhbWUgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHNhbWVfYnl0ZXMpKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gZ3B1X3NhbWUoZF9zYW1lLCBzYW1lLmRpbWVuc2lvbnMoKSk7CisgIGdwdV9zYW1lLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW5wdXQucGFkKHBhZGRpbmcpLmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qoc2FtZS5kYXRhKCksIGRfc2FtZSwgc2FtZV9ieXRlcyk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKHNhbWUuZGltZW5zaW9uKDApLCAzKTsKQEAgLTM3OSw5ICszNzEsOSBAQAogCiAgIFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBmdWxsKDUpOwogICBzdGQ6OnNpemVfdCBmdWxsX2J5dGVzID0gZnVsbC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSAqIGRfZnVsbCA9ICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGZ1bGxfYnl0ZXMpKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gPiBncHVfZnVsbChkX2Z1bGwsIGZ1bGwuZGltZW5zaW9ucygpKTsKLSAgZ3B1X2Z1bGwuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfaW5wdXQucGFkKHBhZGRpbmcpLmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMpOworICBEYXRhVHlwZSogZF9mdWxsID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShmdWxsX2J5dGVzKSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiA+IGdwdV9mdWxsKGRfZnVsbCwgZnVsbC5kaW1lbnNpb25zKCkpOworICBncHVfZnVsbC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2lucHV0LnBhZChwYWRkaW5nKS5jb252b2x2ZShncHVfa2VybmVsLCBkaW1zKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGwuZGF0YSgpLCBkX2Z1bGwsIGZ1bGxfYnl0ZXMpOwogCiAgIFZFUklGWV9JU19FUVVBTChmdWxsLmRpbWVuc2lvbigwKSwgNSk7CkBAIC0zOTYsMTIgKzM4OCwxMCBAQAogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGRfdmFsaWQpOwogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGRfc2FtZSk7CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZF9mdWxsKTsKLQogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X3N0cmlkZXMoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKXsKLQorc3RhdGljIHZvaWQgdGVzdF9zdHJpZGVzKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAxPiBpbnB1dF9kaW1zID0ge3sxM319OwogICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAxPiBrZXJuZWxfZGltcyA9IHt7M319OwogCkBAIC00MTksMzMgKzQwOSwzMiBAQAogICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAxPiBzdHJpZGVfb2ZfMjsKICAgc3RyaWRlX29mXzJbMF0gPSAyOwogCi0gIHN0ZDo6c2l6ZV90IGlucHV0X2J5dGVzID0gaW5wdXQuc2l6ZSgpICAqIHNpemVvZihEYXRhVHlwZSk7CisgIHN0ZDo6c2l6ZV90IGlucHV0X2J5dGVzID0gaW5wdXQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKICAgc3RkOjpzaXplX3Qga2VybmVsX2J5dGVzID0ga2VybmVsLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAgIHN0ZDo6c2l6ZV90IHJlc3VsdF9ieXRlcyA9IHJlc3VsdC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogCi0gIERhdGFUeXBlICogZF9pbnB1dCAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGlucHV0X2J5dGVzKSk7Ci0gIERhdGFUeXBlICogZF9rZXJuZWwgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShrZXJuZWxfYnl0ZXMpKTsKLSAgRGF0YVR5cGUgKiBkX3Jlc3VsdCA9ICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHJlc3VsdF9ieXRlcykpOworICBEYXRhVHlwZSogZF9pbnB1dCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5wdXRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfa2VybmVsID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShrZXJuZWxfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyZXN1bHRfYnl0ZXMpKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiA+IGdwdV9pbnB1dChkX2lucHV0LCBpbnB1dF9kaW1zKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gPiBncHVfa2VybmVsKGRfa2VybmVsLCBrZXJuZWxfZGltcyk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCxJbmRleFR5cGU+ID4gZ3B1X3Jlc3VsdChkX3Jlc3VsdCwgcmVzdWx0LmRpbWVuc2lvbnMoKSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiA+IGdwdV9pbnB1dChkX2lucHV0LCBpbnB1dF9kaW1zKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gZ3B1X2tlcm5lbChkX2tlcm5lbCwga2VybmVsX2RpbXMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiBncHVfcmVzdWx0KGRfcmVzdWx0LCByZXN1bHQuZGltZW5zaW9ucygpKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGRfaW5wdXQsIGlucHV0LmRhdGEoKSwgaW5wdXRfYnl0ZXMpOwogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZF9rZXJuZWwsIGtlcm5lbC5kYXRhKCksIGtlcm5lbF9ieXRlcyk7CiAKLSAgZ3B1X3Jlc3VsdC5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9pbnB1dC5zdHJpZGUoc3RyaWRlX29mXzMpLmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMpLnN0cmlkZShzdHJpZGVfb2ZfMik7CisgIGdwdV9yZXN1bHQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbnB1dC5zdHJpZGUoc3RyaWRlX29mXzMpLmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMpLnN0cmlkZShzdHJpZGVfb2ZfMik7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZXN1bHQuZGF0YSgpLCBkX3Jlc3VsdCwgcmVzdWx0X2J5dGVzKTsKIAogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgMik7Ci0gIFZFUklGWV9JU19BUFBST1gocmVzdWx0KDApLCAoaW5wdXQoMCkqa2VybmVsKDApICsgaW5wdXQoMykqa2VybmVsKDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCg2KSprZXJuZWwoMikpKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSksIChpbnB1dCg2KSprZXJuZWwoMCkgKyBpbnB1dCg5KSprZXJuZWwoMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KDEyKSprZXJuZWwoMikpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMCksIChpbnB1dCgwKSAqIGtlcm5lbCgwKSArIGlucHV0KDMpICoga2VybmVsKDEpICsgaW5wdXQoNikgKiBrZXJuZWwoMikpKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQoMSksIChpbnB1dCg2KSAqIGtlcm5lbCgwKSArIGlucHV0KDkpICoga2VybmVsKDEpICsgaW5wdXQoMTIpICoga2VybmVsKDIpKSk7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBEZXZfc2VsZWN0b3I+IHZvaWQgdGVuc29yQ29udm9sdXRpb25QZXJEZXZpY2UoRGV2X3NlbGVjdG9yJiBzKXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXZfc2VsZWN0b3I+Cit2b2lkIHRlbnNvckNvbnZvbHV0aW9uUGVyRGV2aWNlKERldl9zZWxlY3RvciYgcykgewogICBRdWV1ZUludGVyZmFjZSBxdWV1ZUludGVyZmFjZShzKTsKLSAgYXV0byBzeWNsX2RldmljZT1FaWdlbjo6U3ljbERldmljZSgmcXVldWVJbnRlcmZhY2UpOworICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKICAgdGVzdF9sYXJnX2V4cHIxRDxmbG9hdCwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKICAgdGVzdF9sYXJnX2V4cHIxRDxmbG9hdCwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKICAgdGVzdF9sYXJnX2V4cHIyRDxmbG9hdCwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKQEAgLTQ2Myw3ICs0NTIsNyBAQAogfQogCiBFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2NvbnZvbHV0aW9uX3N5Y2wpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOkVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CisgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogRWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKICAgICBDQUxMX1NVQlRFU1QodGVuc29yQ29udm9sdXRpb25QZXJEZXZpY2UoZGV2aWNlKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2N1c3RvbV9pbmRleC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jdXN0b21faW5kZXguY3BwCmluZGV4IDM4Y2UwNWIuLmYxNWRhMzYgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2N1c3RvbV9pbmRleC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY3VzdG9tX2luZGV4LmNwcApAQCAtMTYsMTAgKzE2LDggQEAKIAogdXNpbmcgRWlnZW46OlRlbnNvcjsKIAotCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X21hcF9hc19pbmRleCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X21hcF9hc19pbmRleCgpIHsKICAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgNSwgNyk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKIApAQCAtMzAsNTYgKzI4LDQ5IEBACiAgIGNvZWZmQ1sxXSA9IDI7CiAgIGNvZWZmQ1syXSA9IDQ7CiAgIGNvZWZmQ1szXSA9IDE7Ci0gIE5vcm1hbEluZGV4IGNvZWZmKDEsMiw0LDEpOworICBOb3JtYWxJbmRleCBjb2VmZigxLCAyLCA0LCAxKTsKIAogICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmNvZWZmKGNvZWZmQyksIHRlbnNvci5jb2VmZihjb2VmZikpOwogICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmNvZWZmUmVmKGNvZWZmQyksIHRlbnNvci5jb2VmZlJlZihjb2VmZikpOwogfQogCi0KIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfbWF0cml4X2FzX2luZGV4KCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfbWF0cml4X2FzX2luZGV4KCkgewogICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogCiAgIHVzaW5nIE5vcm1hbEluZGV4ID0gRFNpemVzPHB0cmRpZmZfdCwgND47CiAgIHVzaW5nIEN1c3RvbUluZGV4ID0gTWF0cml4PHVuc2lnbmVkIGludCwgNCwgMT47Ci0gIEN1c3RvbUluZGV4IGNvZWZmQygxLDIsNCwxKTsKLSAgTm9ybWFsSW5kZXggY29lZmYoMSwyLDQsMSk7CisgIEN1c3RvbUluZGV4IGNvZWZmQygxLCAyLCA0LCAxKTsKKyAgTm9ybWFsSW5kZXggY29lZmYoMSwgMiwgNCwgMSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5jb2VmZihjb2VmZkMpLCB0ZW5zb3IuY29lZmYoY29lZmYpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5jb2VmZlJlZihjb2VmZkMpLCB0ZW5zb3IuY29lZmZSZWYoY29lZmYpKTsKIH0KIAotCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X3Zhcmxpc3RfYXNfaW5kZXgoKQoteworc3RhdGljIHZvaWQgdGVzdF92YXJsaXN0X2FzX2luZGV4KCkgewogICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogCi0gIERTaXplczxwdHJkaWZmX3QsIDQ+IGNvZWZmKDEsMiw0LDEpOworICBEU2l6ZXM8cHRyZGlmZl90LCA0PiBjb2VmZigxLCAyLCA0LCAxKTsKIAotICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmNvZWZmKHsxLDIsNCwxfSksIHRlbnNvci5jb2VmZihjb2VmZikpOwotICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmNvZWZmUmVmKHsxLDIsNCwxfSksIHRlbnNvci5jb2VmZlJlZihjb2VmZikpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmNvZWZmKHsxLCAyLCA0LCAxfSksIHRlbnNvci5jb2VmZihjb2VmZikpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yLmNvZWZmUmVmKHsxLCAyLCA0LCAxfSksIHRlbnNvci5jb2VmZlJlZihjb2VmZikpOwogfQogCi0KIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc2l6ZXNfYXNfaW5kZXgoKQoteworc3RhdGljIHZvaWQgdGVzdF9zaXplc19hc19pbmRleCgpIHsKICAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgNSwgNyk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKIAotICBEU2l6ZXM8cHRyZGlmZl90LCA0PiBjb2VmZigxLDIsNCwxKTsKLSAgU2l6ZXM8MSwyLDQsMT4gY29lZmZDOworICBEU2l6ZXM8cHRyZGlmZl90LCA0PiBjb2VmZigxLCAyLCA0LCAxKTsKKyAgU2l6ZXM8MSwgMiwgNCwgMT4gY29lZmZDOwogCiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuY29lZmYoY29lZmZDKSwgdGVuc29yLmNvZWZmKGNvZWZmKSk7CiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuY29lZmZSZWYoY29lZmZDKSwgdGVuc29yLmNvZWZmUmVmKGNvZWZmKSk7CiB9CiAKLQogRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9jdXN0b21faW5kZXgpIHsKICAgdGVzdF9tYXBfYXNfaW5kZXg8Q29sTWFqb3I+KCk7CiAgIHRlc3RfbWFwX2FzX2luZGV4PFJvd01ham9yPigpOwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY3VzdG9tX29wLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2N1c3RvbV9vcC5jcHAKaW5kZXggODc1ZWE1Ny4uNDkzZGE0OCAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY3VzdG9tX29wLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jdXN0b21fb3AuY3BwCkBAIC0xMyw3ICsxMyw2IEBACiAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKLQogc3RydWN0IEluc2VydFplcm9zIHsKICAgRFNpemVzPERlbnNlSW5kZXgsIDI+IGRpbWVuc2lvbnMoY29uc3QgVGVuc29yPGZsb2F0LCAyPiYgaW5wdXQpIGNvbnN0IHsKICAgICBEU2l6ZXM8RGVuc2VJbmRleCwgMj4gcmVzdWx0OwpAQCAtMjMsNDEgKzIyLDM4IEBACiAgIH0KIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0cHV0LCB0eXBlbmFtZSBEZXZpY2U+Ci0gIHZvaWQgZXZhbChjb25zdCBUZW5zb3I8ZmxvYXQsIDI+JiBpbnB1dCwgT3V0cHV0JiBvdXRwdXQsIGNvbnN0IERldmljZSYgZGV2aWNlKSBjb25zdAotICB7CisgIHZvaWQgZXZhbChjb25zdCBUZW5zb3I8ZmxvYXQsIDI+JiBpbnB1dCwgT3V0cHV0JiBvdXRwdXQsIGNvbnN0IERldmljZSYgZGV2aWNlKSBjb25zdCB7CiAgICAgYXJyYXk8RGVuc2VJbmRleCwgMj4gc3RyaWRlczsKICAgICBzdHJpZGVzWzBdID0gMjsKICAgICBzdHJpZGVzWzFdID0gMjsKICAgICBvdXRwdXQuc3RyaWRlKHN0cmlkZXMpLmRldmljZShkZXZpY2UpID0gaW5wdXQ7CiAKLSAgICBFaWdlbjo6RFNpemVzPERlbnNlSW5kZXgsIDI+IG9mZnNldHMoMSwxKTsKLSAgICBFaWdlbjo6RFNpemVzPERlbnNlSW5kZXgsIDI+IGV4dGVudHMob3V0cHV0LmRpbWVuc2lvbigwKS0xLCBvdXRwdXQuZGltZW5zaW9uKDEpLTEpOworICAgIEVpZ2VuOjpEU2l6ZXM8RGVuc2VJbmRleCwgMj4gb2Zmc2V0cygxLCAxKTsKKyAgICBFaWdlbjo6RFNpemVzPERlbnNlSW5kZXgsIDI+IGV4dGVudHMob3V0cHV0LmRpbWVuc2lvbigwKSAtIDEsIG91dHB1dC5kaW1lbnNpb24oMSkgLSAxKTsKICAgICBvdXRwdXQuc2xpY2Uob2Zmc2V0cywgZXh0ZW50cykuc3RyaWRlKHN0cmlkZXMpLmRldmljZShkZXZpY2UpID0gaW5wdXQuY29uc3RhbnQoMC4wZik7CiAgIH0KIH07CiAKLXN0YXRpYyB2b2lkIHRlc3RfY3VzdG9tX3VuYXJ5X29wKCkKLXsKLSAgVGVuc29yPGZsb2F0LCAyPiB0ZW5zb3IoMyw1KTsKK3N0YXRpYyB2b2lkIHRlc3RfY3VzdG9tX3VuYXJ5X29wKCkgeworICBUZW5zb3I8ZmxvYXQsIDI+IHRlbnNvcigzLCA1KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogCiAgIFRlbnNvcjxmbG9hdCwgMj4gcmVzdWx0ID0gdGVuc29yLmN1c3RvbU9wKEluc2VydFplcm9zKCkpOwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgNik7CiAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDEpLCAxMCk7CiAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKz0yKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgais9MikgewotICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLCBqKSwgdGVuc29yKGkvMiwgai8yKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSArPSAyKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaiArPSAyKSB7CisgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksIGopLCB0ZW5zb3IoaSAvIDIsIGogLyAyKSk7CiAgICAgfQogICB9Ci0gIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSs9MikgewotICAgIGZvciAoaW50IGogPSAxOyBqIDwgMTA7IGorPTIpIHsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyBpICs9IDIpIHsKKyAgICBmb3IgKGludCBqID0gMTsgaiA8IDEwOyBqICs9IDIpIHsKICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiksIDApOwogICAgIH0KICAgfQogfQogCi0KIHN0cnVjdCBCYXRjaE1hdE11bCB7CiAgIERTaXplczxEZW5zZUluZGV4LCAzPiBkaW1lbnNpb25zKGNvbnN0IFRlbnNvcjxmbG9hdCwgMz4mIGlucHV0MSwgY29uc3QgVGVuc29yPGZsb2F0LCAzPiYgaW5wdXQyKSBjb25zdCB7CiAgICAgRFNpemVzPERlbnNlSW5kZXgsIDM+IHJlc3VsdDsKQEAgLTY4LDkgKzY0LDggQEAKICAgfQogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdXRwdXQsIHR5cGVuYW1lIERldmljZT4KLSAgdm9pZCBldmFsKGNvbnN0IFRlbnNvcjxmbG9hdCwgMz4mIGlucHV0MSwgY29uc3QgVGVuc29yPGZsb2F0LCAzPiYgaW5wdXQyLAotICAgICAgICAgICAgT3V0cHV0JiBvdXRwdXQsIGNvbnN0IERldmljZSYgZGV2aWNlKSBjb25zdAotICB7CisgIHZvaWQgZXZhbChjb25zdCBUZW5zb3I8ZmxvYXQsIDM+JiBpbnB1dDEsIGNvbnN0IFRlbnNvcjxmbG9hdCwgMz4mIGlucHV0MiwgT3V0cHV0JiBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBEZXZpY2UmIGRldmljZSkgY29uc3QgewogICAgIHR5cGVkZWYgVGVuc29yPGZsb2F0LCAzPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOwogICAgIGFycmF5PERpbVBhaXIsIDE+IGRpbXM7CiAgICAgZGltc1swXSA9IERpbVBhaXIoMSwgMCk7CkBAIC04MCwxMiArNzUsMTAgQEAKICAgfQogfTsKIAotCi1zdGF0aWMgdm9pZCB0ZXN0X2N1c3RvbV9iaW5hcnlfb3AoKQotewotICBUZW5zb3I8ZmxvYXQsIDM+IHRlbnNvcjEoMiwzLDUpOworc3RhdGljIHZvaWQgdGVzdF9jdXN0b21fYmluYXJ5X29wKCkgeworICBUZW5zb3I8ZmxvYXQsIDM+IHRlbnNvcjEoMiwgMywgNSk7CiAgIHRlbnNvcjEuc2V0UmFuZG9tKCk7Ci0gIFRlbnNvcjxmbG9hdCwgMz4gdGVuc29yMigzLDcsNSk7CisgIFRlbnNvcjxmbG9hdCwgMz4gdGVuc29yMigzLCA3LCA1KTsKICAgdGVuc29yMi5zZXRSYW5kb20oKTsKIAogICBUZW5zb3I8ZmxvYXQsIDM+IHJlc3VsdCA9IHRlbnNvcjEuY3VzdG9tT3AodGVuc29yMiwgQmF0Y2hNYXRNdWwoKSk7CkBAIC0xMDMsOSArOTYsNyBAQAogICB9CiB9CiAKLQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9jdXN0b21fb3ApCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2N1c3RvbV9vcCkgewogICBDQUxMX1NVQlRFU1QodGVzdF9jdXN0b21fdW5hcnlfb3AoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2N1c3RvbV9iaW5hcnlfb3AoKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jdXN0b21fb3Bfc3ljbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9jdXN0b21fb3Bfc3ljbC5jcHAKaW5kZXggZDk0N2VhZC4uZWI5ZWY2ZSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfY3VzdG9tX29wX3N5Y2wuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2N1c3RvbV9vcF9zeWNsLmNwcApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KIAogdXNpbmcgRWlnZW46OlRlbnNvcjsKLXRlbXBsYXRlPHR5cGVuYW1lIFRlbnNvclR5cGU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVuc29yVHlwZT4KIHN0cnVjdCBJbnNlcnRaZXJvcyB7CiAgIERTaXplczxEZW5zZUluZGV4LCAyPiBkaW1lbnNpb25zKGNvbnN0IFRlbnNvclR5cGUmIGlucHV0KSBjb25zdCB7CiAgICAgRFNpemVzPERlbnNlSW5kZXgsIDI+IHJlc3VsdDsKQEAgLTMxLDIyICszMSwyMCBAQAogICB9CiAKICAgdGVtcGxhdGUgPHR5cGVuYW1lIE91dHB1dCwgdHlwZW5hbWUgRGV2aWNlPgotICB2b2lkIGV2YWwoY29uc3QgVGVuc29yVHlwZSYgaW5wdXQsIE91dHB1dCYgb3V0cHV0LCBjb25zdCBEZXZpY2UmIGRldmljZSkgY29uc3QKLSAgeworICB2b2lkIGV2YWwoY29uc3QgVGVuc29yVHlwZSYgaW5wdXQsIE91dHB1dCYgb3V0cHV0LCBjb25zdCBEZXZpY2UmIGRldmljZSkgY29uc3QgewogICAgIGFycmF5PERlbnNlSW5kZXgsIDI+IHN0cmlkZXM7CiAgICAgc3RyaWRlc1swXSA9IDI7CiAgICAgc3RyaWRlc1sxXSA9IDI7CiAgICAgb3V0cHV0LnN0cmlkZShzdHJpZGVzKS5kZXZpY2UoZGV2aWNlKSA9IGlucHV0OwogCi0gICAgRWlnZW46OkRTaXplczxEZW5zZUluZGV4LCAyPiBvZmZzZXRzKDEsMSk7Ci0gICAgRWlnZW46OkRTaXplczxEZW5zZUluZGV4LCAyPiBleHRlbnRzKG91dHB1dC5kaW1lbnNpb24oMCktMSwgb3V0cHV0LmRpbWVuc2lvbigxKS0xKTsKKyAgICBFaWdlbjo6RFNpemVzPERlbnNlSW5kZXgsIDI+IG9mZnNldHMoMSwgMSk7CisgICAgRWlnZW46OkRTaXplczxEZW5zZUluZGV4LCAyPiBleHRlbnRzKG91dHB1dC5kaW1lbnNpb24oMCkgLSAxLCBvdXRwdXQuZGltZW5zaW9uKDEpIC0gMSk7CiAgICAgb3V0cHV0LnNsaWNlKG9mZnNldHMsIGV4dGVudHMpLnN0cmlkZShzdHJpZGVzKS5kZXZpY2UoZGV2aWNlKSA9IGlucHV0LmNvbnN0YW50KDAuMGYpOwogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfY3VzdG9tX3VuYXJ5X29wX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKQotewordGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgorc3RhdGljIHZvaWQgdGVzdF9jdXN0b21fdW5hcnlfb3Bfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gMzsKICAgSW5kZXhUeXBlIHNpemVEaW0yID0gNTsKICAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMj4gdGVuc29yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMn19OwpAQCAtNTUsMzYgKzUzLDM4IEBACiAgIEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW4xKHRlbnNvclJhbmdlKTsKICAgRWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBvdXQodGVuc29yUmVzdWx0UmFuZ2UpOwogCi0gIERhdGFUeXBlICogZ3B1X2luMV9kYXRhICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4xLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlICogZ3B1X291dF9kYXRhID0gIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW4xX2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbjEuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X291dF9kYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKIAogICB0eXBlZGVmIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiA+IFRlbnNvclR5cGU7CiAgIFRlbnNvclR5cGUgZ3B1X2luMShncHVfaW4xX2RhdGEsIHRlbnNvclJhbmdlKTsKICAgVGVuc29yVHlwZSBncHVfb3V0KGdwdV9vdXRfZGF0YSwgdGVuc29yUmVzdWx0UmFuZ2UpOwogCiAgIGluMS5zZXRSYW5kb20oKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjFfZGF0YSwgaW4xLmRhdGEoKSwoaW4xLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW4xX2RhdGEsIGluMS5kYXRhKCksIChpbjEuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW4xLmN1c3RvbU9wKEluc2VydFplcm9zPFRlbnNvclR5cGU+KCkpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X291dF9kYXRhLChvdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9vdXRfZGF0YSwgKG91dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKG91dC5kaW1lbnNpb24oMCksIDYpOwogICBWRVJJRllfSVNfRVFVQUwob3V0LmRpbWVuc2lvbigxKSwgMTApOwogCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSs9MikgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorPTIpIHsKLSAgICAgIFZFUklGWV9JU19FUVVBTChvdXQoaSwgaiksIGluMShpLzIsIGovMikpOworICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkgKz0gMikgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7IGogKz0gMikgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKG91dChpLCBqKSwgaW4xKGkgLyAyLCBqIC8gMikpOwogICAgIH0KICAgfQotICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrPTIpIHsKLSAgICBmb3IgKGludCBqID0gMTsgaiA8IDEwOyBqKz0yKSB7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSArPSAyKSB7CisgICAgZm9yIChpbnQgaiA9IDE7IGogPCAxMDsgaiArPSAyKSB7CiAgICAgICBWRVJJRllfSVNfRVFVQUwob3V0KGksIGopLCAwKTsKICAgICB9CiAgIH0KICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW4xX2RhdGEpOwotc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfb3V0X2RhdGEpOworICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9vdXRfZGF0YSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFRlbnNvclR5cGU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVuc29yVHlwZT4KIHN0cnVjdCBCYXRjaE1hdE11bCB7CiAgIERTaXplczxEZW5zZUluZGV4LCAzPiBkaW1lbnNpb25zKGNvbnN0IFRlbnNvclR5cGUmIGlucHV0MSwgY29uc3QgVGVuc29yVHlwZSYgaW5wdXQyKSBjb25zdCB7CiAgICAgRFNpemVzPERlbnNlSW5kZXgsIDM+IHJlc3VsdDsKQEAgLTk1LDkgKzk1LDcgQEAKICAgfQogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdXRwdXQsIHR5cGVuYW1lIERldmljZT4KLSAgdm9pZCBldmFsKGNvbnN0IFRlbnNvclR5cGUmIGlucHV0MSwgY29uc3QgVGVuc29yVHlwZSYgaW5wdXQyLAotICAgICAgICAgICAgT3V0cHV0JiBvdXRwdXQsIGNvbnN0IERldmljZSYgZGV2aWNlKSBjb25zdAotICB7CisgIHZvaWQgZXZhbChjb25zdCBUZW5zb3JUeXBlJiBpbnB1dDEsIGNvbnN0IFRlbnNvclR5cGUmIGlucHV0MiwgT3V0cHV0JiBvdXRwdXQsIGNvbnN0IERldmljZSYgZGV2aWNlKSBjb25zdCB7CiAgICAgdHlwZWRlZiB0eXBlbmFtZSBUZW5zb3JUeXBlOjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CiAgICAgYXJyYXk8RGltUGFpciwgMT4gZGltczsKICAgICBkaW1zWzBdID0gRGltUGFpcigxLCAwKTsKQEAgLTEwNywyMSArMTA1LDIyIEBACiAgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9jdXN0b21fYmluYXJ5X29wX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKQotewotCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+CitzdGF0aWMgdm9pZCB0ZXN0X2N1c3RvbV9iaW5hcnlfb3Bfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMz4gdGVuc29yUmFuZ2UxID0ge3syLCAzLCA1fX07Ci0gIEVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDM+IHRlbnNvclJhbmdlMiA9IHt7Myw3LDV9fTsKLSAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMz4gdGVuc29yUmVzdWx0UmFuZ2UgID0ge3syLCA3LCA1fX07CisgIEVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDM+IHRlbnNvclJhbmdlMiA9IHt7MywgNywgNX19OworICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAzPiB0ZW5zb3JSZXN1bHRSYW5nZSA9IHt7MiwgNywgNX19OwogCiAgIEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW4xKHRlbnNvclJhbmdlMSk7CiAgIEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW4yKHRlbnNvclJhbmdlMik7CiAgIEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gb3V0KHRlbnNvclJlc3VsdFJhbmdlKTsKIAotICBEYXRhVHlwZSAqIGdwdV9pbjFfZGF0YSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluMS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOwotICBEYXRhVHlwZSAqIGdwdV9pbjJfZGF0YSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluMi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOwotICBEYXRhVHlwZSAqIGdwdV9vdXRfZGF0YSA9ICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG91dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2luMV9kYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4xLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9pbjJfZGF0YSA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluMi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogCiAgIHR5cGVkZWYgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gVGVuc29yVHlwZTsKICAgVGVuc29yVHlwZSBncHVfaW4xKGdwdV9pbjFfZGF0YSwgdGVuc29yUmFuZ2UxKTsKQEAgLTEzMSwxNyArMTMwLDE4IEBACiAgIGluMS5zZXRSYW5kb20oKTsKICAgaW4yLnNldFJhbmRvbSgpOwogCi0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW4xX2RhdGEsIGluMS5kYXRhKCksKGluMS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luMl9kYXRhLCBpbjIuZGF0YSgpLChpbjIuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjFfZGF0YSwgaW4xLmRhdGEoKSwgKGluMS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW4yX2RhdGEsIGluMi5kYXRhKCksIChpbjIuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIGdwdV9vdXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbjEuY3VzdG9tT3AoZ3B1X2luMiwgQmF0Y2hNYXRNdWw8VGVuc29yVHlwZT4oKSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfb3V0X2RhdGEsKG91dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X291dF9kYXRhLCAob3V0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDU7ICsraSkgewogICAgIHR5cGVkZWYgdHlwZW5hbWUgRWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOwogICAgIGFycmF5PERpbVBhaXIsIDE+IGRpbXM7CiAgICAgZGltc1swXSA9IERpbVBhaXIoMSwgMCk7Ci0gICAgRWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiByZWZlcmVuY2UgPSBpbjEudGVtcGxhdGUgY2hpcDwyPihpKS5jb250cmFjdChpbjIudGVtcGxhdGUgY2hpcDwyPihpKSwgZGltcyk7CisgICAgRWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiByZWZlcmVuY2UgPQorICAgICAgICBpbjEudGVtcGxhdGUgY2hpcDwyPihpKS5jb250cmFjdChpbjIudGVtcGxhdGUgY2hpcDwyPihpKSwgZGltcyk7CiAgICAgVGVuc29yUmVmPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiB2YWwgPSBvdXQudGVtcGxhdGUgY2hpcDwyPihpKTsKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IDI7ICsraikgewogICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCA3OyArK2spIHsKQEAgLTE1NCwxNyArMTU0LDE3IEBACiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X291dF9kYXRhKTsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBEZXZfc2VsZWN0b3I+IHZvaWQgY3VzdG9tX29wX3BlckRldmljZShEZXZfc2VsZWN0b3Igcyl7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIERldl9zZWxlY3Rvcj4KK3ZvaWQgY3VzdG9tX29wX3BlckRldmljZShEZXZfc2VsZWN0b3IgcykgewogICBRdWV1ZUludGVyZmFjZSBxdWV1ZUludGVyZmFjZShzKTsKICAgYXV0byBzeWNsX2RldmljZSA9IEVpZ2VuOjpTeWNsRGV2aWNlKCZxdWV1ZUludGVyZmFjZSk7CiAgIHRlc3RfY3VzdG9tX3VuYXJ5X29wX3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CiAgIHRlc3RfY3VzdG9tX3VuYXJ5X29wX3N5Y2w8RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CiAgIHRlc3RfY3VzdG9tX2JpbmFyeV9vcF9zeWNsPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogICB0ZXN0X2N1c3RvbV9iaW5hcnlfb3Bfc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKLQogfQogRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9jdXN0b21fb3Bfc3ljbCkgewotICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6RWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgewogICAgIENBTExfU1VCVEVTVChjdXN0b21fb3BfcGVyRGV2aWNlPGZsb2F0PihkZXZpY2UpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZGV2aWNlLmN1IGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZGV2aWNlLmN1CmluZGV4IDU4Y2ZjMDEuLjBmOTFiMTAgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2RldmljZS5jdQorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9kZXZpY2UuY3UKQEAgLTE5LDI4ICsxOSwyOSBAQAogCiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JHcHVIaXBDdWRhRGVmaW5lcy5oPgogCi11c2luZyBFaWdlbjo6VGVuc29yOwogdXNpbmcgRWlnZW46OlJvd01ham9yOwordXNpbmcgRWlnZW46OlRlbnNvcjsKIAogLy8gQ29udGV4dCBmb3IgZXZhbHVhdGlvbiBvbiBjcHUKIHN0cnVjdCBDUFVDb250ZXh0IHsKLSAgQ1BVQ29udGV4dChjb25zdCBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiYgaW4xLCBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiYgaW4yLCBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiYgb3V0KSA6IGluMV8oaW4xKSwgaW4yXyhpbjIpLCBvdXRfKG91dCksIGtlcm5lbF8xZF8oMiksIGtlcm5lbF8yZF8oMiwyKSwga2VybmVsXzNkXygyLDIsMikgeworICBDUFVDb250ZXh0KGNvbnN0IEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+JiBpbjEsIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+JiBpbjIsIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+JiBvdXQpCisgICAgICA6IGluMV8oaW4xKSwgaW4yXyhpbjIpLCBvdXRfKG91dCksIGtlcm5lbF8xZF8oMiksIGtlcm5lbF8yZF8oMiwgMiksIGtlcm5lbF8zZF8oMiwgMiwgMikgewogICAgIGtlcm5lbF8xZF8oMCkgPSAzLjE0ZjsKICAgICBrZXJuZWxfMWRfKDEpID0gMi43ZjsKIAotICAgIGtlcm5lbF8yZF8oMCwwKSA9IDMuMTRmOwotICAgIGtlcm5lbF8yZF8oMSwwKSA9IDIuN2Y7Ci0gICAga2VybmVsXzJkXygwLDEpID0gMC4yZjsKLSAgICBrZXJuZWxfMmRfKDEsMSkgPSA3LjBmOworICAgIGtlcm5lbF8yZF8oMCwgMCkgPSAzLjE0ZjsKKyAgICBrZXJuZWxfMmRfKDEsIDApID0gMi43ZjsKKyAgICBrZXJuZWxfMmRfKDAsIDEpID0gMC4yZjsKKyAgICBrZXJuZWxfMmRfKDEsIDEpID0gNy4wZjsKIAotICAgIGtlcm5lbF8zZF8oMCwwLDApID0gMy4xNGY7Ci0gICAga2VybmVsXzNkXygwLDEsMCkgPSAyLjdmOwotICAgIGtlcm5lbF8zZF8oMCwwLDEpID0gMC4yZjsKLSAgICBrZXJuZWxfM2RfKDAsMSwxKSA9IDcuMGY7Ci0gICAga2VybmVsXzNkXygxLDAsMCkgPSAtMS4wZjsKLSAgICBrZXJuZWxfM2RfKDEsMSwwKSA9IC0wLjNmOwotICAgIGtlcm5lbF8zZF8oMSwwLDEpID0gLTAuN2Y7Ci0gICAga2VybmVsXzNkXygxLDEsMSkgPSAtMC41ZjsKKyAgICBrZXJuZWxfM2RfKDAsIDAsIDApID0gMy4xNGY7CisgICAga2VybmVsXzNkXygwLCAxLCAwKSA9IDIuN2Y7CisgICAga2VybmVsXzNkXygwLCAwLCAxKSA9IDAuMmY7CisgICAga2VybmVsXzNkXygwLCAxLCAxKSA9IDcuMGY7CisgICAga2VybmVsXzNkXygxLCAwLCAwKSA9IC0xLjBmOworICAgIGtlcm5lbF8zZF8oMSwgMSwgMCkgPSAtMC4zZjsKKyAgICBrZXJuZWxfM2RfKDEsIDAsIDEpID0gLTAuN2Y7CisgICAga2VybmVsXzNkXygxLCAxLCAxKSA9IC0wLjVmOwogICB9CiAKICAgY29uc3QgRWlnZW46OkRlZmF1bHREZXZpY2UmIGRldmljZSgpIGNvbnN0IHsgcmV0dXJuIGNwdV9kZXZpY2VfOyB9CkBAIC02NCwyMSArNjUsMjIgQEAKICAgRWlnZW46OkRlZmF1bHREZXZpY2UgY3B1X2RldmljZV87CiB9OwogCi0KIC8vIENvbnRleHQgZm9yIGV2YWx1YXRpb24gb24gR1BVCiBzdHJ1Y3QgR1BVQ29udGV4dCB7Ci0gIEdQVUNvbnRleHQoY29uc3QgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+JiBpbjEsIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiYgaW4yLCBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+ID4mIG91dCkgOiBpbjFfKGluMSksIGluMl8oaW4yKSwgb3V0XyhvdXQpLCBncHVfZGV2aWNlXygmc3RyZWFtXykgewotICAgIGFzc2VydChncHVNYWxsb2MoKHZvaWQqKikoJmtlcm5lbF8xZF8pLCAyKnNpemVvZihmbG9hdCkpID09IGdwdVN1Y2Nlc3MpOworICBHUFVDb250ZXh0KGNvbnN0IEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4+JiBpbjEsIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4+JiBpbjIsCisgICAgICAgICAgICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPj4mIG91dCkKKyAgICAgIDogaW4xXyhpbjEpLCBpbjJfKGluMiksIG91dF8ob3V0KSwgZ3B1X2RldmljZV8oJnN0cmVhbV8pIHsKKyAgICBhc3NlcnQoZ3B1TWFsbG9jKCh2b2lkKiopKCZrZXJuZWxfMWRfKSwgMiAqIHNpemVvZihmbG9hdCkpID09IGdwdVN1Y2Nlc3MpOwogICAgIGZsb2F0IGtlcm5lbF8xZF92YWxbXSA9IHszLjE0ZiwgMi43Zn07Ci0gICAgYXNzZXJ0KGdwdU1lbWNweShrZXJuZWxfMWRfLCBrZXJuZWxfMWRfdmFsLCAyKnNpemVvZihmbG9hdCksIGdwdU1lbWNweUhvc3RUb0RldmljZSkgPT0gZ3B1U3VjY2Vzcyk7CisgICAgYXNzZXJ0KGdwdU1lbWNweShrZXJuZWxfMWRfLCBrZXJuZWxfMWRfdmFsLCAyICogc2l6ZW9mKGZsb2F0KSwgZ3B1TWVtY3B5SG9zdFRvRGV2aWNlKSA9PSBncHVTdWNjZXNzKTsKIAotICAgIGFzc2VydChncHVNYWxsb2MoKHZvaWQqKikoJmtlcm5lbF8yZF8pLCA0KnNpemVvZihmbG9hdCkpID09IGdwdVN1Y2Nlc3MpOworICAgIGFzc2VydChncHVNYWxsb2MoKHZvaWQqKikoJmtlcm5lbF8yZF8pLCA0ICogc2l6ZW9mKGZsb2F0KSkgPT0gZ3B1U3VjY2Vzcyk7CiAgICAgZmxvYXQga2VybmVsXzJkX3ZhbFtdID0gezMuMTRmLCAyLjdmLCAwLjJmLCA3LjBmfTsKLSAgICBhc3NlcnQoZ3B1TWVtY3B5KGtlcm5lbF8yZF8sIGtlcm5lbF8yZF92YWwsIDQqc2l6ZW9mKGZsb2F0KSwgZ3B1TWVtY3B5SG9zdFRvRGV2aWNlKSA9PSBncHVTdWNjZXNzKTsKKyAgICBhc3NlcnQoZ3B1TWVtY3B5KGtlcm5lbF8yZF8sIGtlcm5lbF8yZF92YWwsIDQgKiBzaXplb2YoZmxvYXQpLCBncHVNZW1jcHlIb3N0VG9EZXZpY2UpID09IGdwdVN1Y2Nlc3MpOwogCi0gICAgYXNzZXJ0KGdwdU1hbGxvYygodm9pZCoqKSgma2VybmVsXzNkXyksIDgqc2l6ZW9mKGZsb2F0KSkgPT0gZ3B1U3VjY2Vzcyk7CisgICAgYXNzZXJ0KGdwdU1hbGxvYygodm9pZCoqKSgma2VybmVsXzNkXyksIDggKiBzaXplb2YoZmxvYXQpKSA9PSBncHVTdWNjZXNzKTsKICAgICBmbG9hdCBrZXJuZWxfM2RfdmFsW10gPSB7My4xNGYsIC0xLjBmLCAyLjdmLCAtMC4zZiwgMC4yZiwgLTAuN2YsIDcuMGYsIC0wLjVmfTsKLSAgICBhc3NlcnQoZ3B1TWVtY3B5KGtlcm5lbF8zZF8sIGtlcm5lbF8zZF92YWwsIDgqc2l6ZW9mKGZsb2F0KSwgZ3B1TWVtY3B5SG9zdFRvRGV2aWNlKSA9PSBncHVTdWNjZXNzKTsKKyAgICBhc3NlcnQoZ3B1TWVtY3B5KGtlcm5lbF8zZF8sIGtlcm5lbF8zZF92YWwsIDggKiBzaXplb2YoZmxvYXQpLCBncHVNZW1jcHlIb3N0VG9EZXZpY2UpID09IGdwdVN1Y2Nlc3MpOwogICB9CiAgIH5HUFVDb250ZXh0KCkgewogICAgIGFzc2VydChncHVGcmVlKGtlcm5lbF8xZF8pID09IGdwdVN1Y2Nlc3MpOwpAQCAtODgsMTcgKzkwLDIzIEBACiAKICAgY29uc3QgRWlnZW46OkdwdURldmljZSYgZGV2aWNlKCkgY29uc3QgeyByZXR1cm4gZ3B1X2RldmljZV87IH0KIAotICBjb25zdCBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+ID4mIGluMSgpIGNvbnN0IHsgcmV0dXJuIGluMV87IH0KLSAgY29uc3QgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+JiBpbjIoKSBjb25zdCB7IHJldHVybiBpbjJfOyB9Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiYgb3V0KCkgeyByZXR1cm4gb3V0XzsgfQotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+ID4ga2VybmVsMWQoKSBjb25zdCB7IHJldHVybiBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+ID4oa2VybmVsXzFkXywgMik7IH0KLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiA+IGtlcm5lbDJkKCkgY29uc3QgeyByZXR1cm4gRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiA+KGtlcm5lbF8yZF8sIDIsIDIpOyB9Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiBrZXJuZWwzZCgpIGNvbnN0IHsgcmV0dXJuIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPihrZXJuZWxfM2RfLCAyLCAyLCAyKTsgfQorICBjb25zdCBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+PiYgaW4xKCkgY29uc3QgeyByZXR1cm4gaW4xXzsgfQorICBjb25zdCBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+PiYgaW4yKCkgY29uc3QgeyByZXR1cm4gaW4yXzsgfQorICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+PiYgb3V0KCkgeyByZXR1cm4gb3V0XzsgfQorICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+PiBrZXJuZWwxZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPj4oa2VybmVsXzFkXywgMik7CisgIH0KKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPj4ga2VybmVsMmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4+KGtlcm5lbF8yZF8sIDIsIDIpOworICB9CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4+IGtlcm5lbDNkKCkgY29uc3QgeworICAgIHJldHVybiBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+PihrZXJuZWxfM2RfLCAyLCAyLCAyKTsKKyAgfQogCiAgcHJpdmF0ZToKLSAgY29uc3QgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+JiBpbjFfOwotICBjb25zdCBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+ID4mIGluMl87Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiYgb3V0XzsKKyAgY29uc3QgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPj4mIGluMV87CisgIGNvbnN0IEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4+JiBpbjJfOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+PiYgb3V0XzsKIAogICBmbG9hdCoga2VybmVsXzFkXzsKICAgZmxvYXQqIGtlcm5lbF8yZF87CkBAIC0xMDgsNzggKzExNiw3MSBAQAogICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2VfOwogfTsKIAotCiAvLyBUaGUgYWN0dWFsIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUKIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250ZXh0Pgotdm9pZCB0ZXN0X2NvbnRleHR1YWxfZXZhbChDb250ZXh0KiBjb250ZXh0KQotewordm9pZCB0ZXN0X2NvbnRleHR1YWxfZXZhbChDb250ZXh0KiBjb250ZXh0KSB7CiAgIGNvbnRleHQtPm91dCgpLmRldmljZShjb250ZXh0LT5kZXZpY2UoKSkgPSBjb250ZXh0LT5pbjEoKSArIGNvbnRleHQtPmluMigpICogMy4xNGYgKyBjb250ZXh0LT5pbjEoKS5jb25zdGFudCgyLjcxOGYpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGV4dD4KLXZvaWQgdGVzdF9mb3JjZWRfY29udGV4dHVhbF9ldmFsKENvbnRleHQqIGNvbnRleHQpCi17Ci0gIGNvbnRleHQtPm91dCgpLmRldmljZShjb250ZXh0LT5kZXZpY2UoKSkgPSAoY29udGV4dC0+aW4xKCkgKyBjb250ZXh0LT5pbjIoKSkuZXZhbCgpICogMy4xNGYgKyBjb250ZXh0LT5pbjEoKS5jb25zdGFudCgyLjcxOGYpOwordm9pZCB0ZXN0X2ZvcmNlZF9jb250ZXh0dWFsX2V2YWwoQ29udGV4dCogY29udGV4dCkgeworICBjb250ZXh0LT5vdXQoKS5kZXZpY2UoY29udGV4dC0+ZGV2aWNlKCkpID0KKyAgICAgIChjb250ZXh0LT5pbjEoKSArIGNvbnRleHQtPmluMigpKS5ldmFsKCkgKiAzLjE0ZiArIGNvbnRleHQtPmluMSgpLmNvbnN0YW50KDIuNzE4Zik7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250ZXh0Pgotdm9pZCB0ZXN0X2NvbXBvdW5kX2Fzc2lnbm1lbnQoQ29udGV4dCogY29udGV4dCkKLXsKK3ZvaWQgdGVzdF9jb21wb3VuZF9hc3NpZ25tZW50KENvbnRleHQqIGNvbnRleHQpIHsKICAgY29udGV4dC0+b3V0KCkuZGV2aWNlKGNvbnRleHQtPmRldmljZSgpKSA9IGNvbnRleHQtPmluMSgpLmNvbnN0YW50KDIuNzE4Zik7CiAgIGNvbnRleHQtPm91dCgpLmRldmljZShjb250ZXh0LT5kZXZpY2UoKSkgKz0gY29udGV4dC0+aW4xKCkgKyBjb250ZXh0LT5pbjIoKSAqIDMuMTRmOwogfQogCi0KIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250ZXh0Pgotdm9pZCB0ZXN0X2NvbnRyYWN0aW9uKENvbnRleHQqIGNvbnRleHQpCi17Cit2b2lkIHRlc3RfY29udHJhY3Rpb24oQ29udGV4dCogY29udGV4dCkgewogICBFaWdlbjo6YXJyYXk8c3RkOjpwYWlyPGludCwgaW50PiwgMj4gZGltczsKICAgZGltc1swXSA9IHN0ZDo6bWFrZV9wYWlyKDEsIDEpOwogICBkaW1zWzFdID0gc3RkOjptYWtlX3BhaXIoMiwgMik7CiAKLSAgRWlnZW46OmFycmF5PGludCwgMj4gc2hhcGUoNDAsIDUwKjcwKTsKKyAgRWlnZW46OmFycmF5PGludCwgMj4gc2hhcGUoNDAsIDUwICogNzApOwogCi0gIEVpZ2VuOjpEU2l6ZXM8aW50LCAyPiBpbmRpY2VzKDAsMCk7Ci0gIEVpZ2VuOjpEU2l6ZXM8aW50LCAyPiBzaXplcyg0MCw0MCk7CisgIEVpZ2VuOjpEU2l6ZXM8aW50LCAyPiBpbmRpY2VzKDAsIDApOworICBFaWdlbjo6RFNpemVzPGludCwgMj4gc2l6ZXMoNDAsIDQwKTsKIAotICBjb250ZXh0LT5vdXQoKS5yZXNoYXBlKHNoYXBlKS5zbGljZShpbmRpY2VzLCBzaXplcykuZGV2aWNlKGNvbnRleHQtPmRldmljZSgpKSA9IGNvbnRleHQtPmluMSgpLmNvbnRyYWN0KGNvbnRleHQtPmluMigpLCBkaW1zKTsKKyAgY29udGV4dC0+b3V0KCkucmVzaGFwZShzaGFwZSkuc2xpY2UoaW5kaWNlcywgc2l6ZXMpLmRldmljZShjb250ZXh0LT5kZXZpY2UoKSkgPQorICAgICAgY29udGV4dC0+aW4xKCkuY29udHJhY3QoY29udGV4dC0+aW4yKCksIGRpbXMpOwogfQogCi0KIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250ZXh0Pgotdm9pZCB0ZXN0XzFkX2NvbnZvbHV0aW9uKENvbnRleHQqIGNvbnRleHQpCi17Ci0gIEVpZ2VuOjpEU2l6ZXM8aW50LCAzPiBpbmRpY2VzKDAsMCwwKTsKLSAgRWlnZW46OkRTaXplczxpbnQsIDM+IHNpemVzKDQwLDQ5LDcwKTsKK3ZvaWQgdGVzdF8xZF9jb252b2x1dGlvbihDb250ZXh0KiBjb250ZXh0KSB7CisgIEVpZ2VuOjpEU2l6ZXM8aW50LCAzPiBpbmRpY2VzKDAsIDAsIDApOworICBFaWdlbjo6RFNpemVzPGludCwgMz4gc2l6ZXMoNDAsIDQ5LCA3MCk7CiAKICAgRWlnZW46OmFycmF5PGludCwgMT4gZGltcygxKTsKICAgY29udGV4dC0+b3V0KCkuc2xpY2UoaW5kaWNlcywgc2l6ZXMpLmRldmljZShjb250ZXh0LT5kZXZpY2UoKSkgPSBjb250ZXh0LT5pbjEoKS5jb252b2x2ZShjb250ZXh0LT5rZXJuZWwxZCgpLCBkaW1zKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRleHQ+Ci12b2lkIHRlc3RfMmRfY29udm9sdXRpb24oQ29udGV4dCogY29udGV4dCkKLXsKLSAgRWlnZW46OkRTaXplczxpbnQsIDM+IGluZGljZXMoMCwwLDApOwotICBFaWdlbjo6RFNpemVzPGludCwgMz4gc2l6ZXMoNDAsNDksNjkpOwordm9pZCB0ZXN0XzJkX2NvbnZvbHV0aW9uKENvbnRleHQqIGNvbnRleHQpIHsKKyAgRWlnZW46OkRTaXplczxpbnQsIDM+IGluZGljZXMoMCwgMCwgMCk7CisgIEVpZ2VuOjpEU2l6ZXM8aW50LCAzPiBzaXplcyg0MCwgNDksIDY5KTsKIAotICBFaWdlbjo6YXJyYXk8aW50LCAyPiBkaW1zKDEsMik7CisgIEVpZ2VuOjphcnJheTxpbnQsIDI+IGRpbXMoMSwgMik7CiAgIGNvbnRleHQtPm91dCgpLnNsaWNlKGluZGljZXMsIHNpemVzKS5kZXZpY2UoY29udGV4dC0+ZGV2aWNlKCkpID0gY29udGV4dC0+aW4xKCkuY29udm9sdmUoY29udGV4dC0+a2VybmVsMmQoKSwgZGltcyk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250ZXh0Pgotdm9pZCB0ZXN0XzNkX2NvbnZvbHV0aW9uKENvbnRleHQqIGNvbnRleHQpCi17Ci0gIEVpZ2VuOjpEU2l6ZXM8aW50LCAzPiBpbmRpY2VzKDAsMCwwKTsKLSAgRWlnZW46OkRTaXplczxpbnQsIDM+IHNpemVzKDM5LDQ5LDY5KTsKK3ZvaWQgdGVzdF8zZF9jb252b2x1dGlvbihDb250ZXh0KiBjb250ZXh0KSB7CisgIEVpZ2VuOjpEU2l6ZXM8aW50LCAzPiBpbmRpY2VzKDAsIDAsIDApOworICBFaWdlbjo6RFNpemVzPGludCwgMz4gc2l6ZXMoMzksIDQ5LCA2OSk7CiAKLSAgRWlnZW46OmFycmF5PGludCwgMz4gZGltcygwLDEsMik7CisgIEVpZ2VuOjphcnJheTxpbnQsIDM+IGRpbXMoMCwgMSwgMik7CiAgIGNvbnRleHQtPm91dCgpLnNsaWNlKGluZGljZXMsIHNpemVzKS5kZXZpY2UoY29udGV4dC0+ZGV2aWNlKCkpID0gY29udGV4dC0+aW4xKCkuY29udm9sdmUoY29udGV4dC0+a2VybmVsM2QoKSwgZGltcyk7CiB9CiAKIC8vIEhlbHBlciBtZXRob2QgdG8gc3luY2hyb25pemUgZGV2aWNlLgotdGVtcGxhdGU8dHlwZW5hbWUgRGV2aWNlPgotdm9pZCBzeW5jaHJvbml6ZShEZXZpY2UmIGRldmljZSkgeyAvKm5vdGhpbmcqLyB9Ci10ZW1wbGF0ZTw+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGV2aWNlPgordm9pZCBzeW5jaHJvbml6ZShEZXZpY2UmIGRldmljZSkgeyAvKm5vdGhpbmcqLworfQordGVtcGxhdGUgPD4KIHZvaWQgc3luY2hyb25pemUoRWlnZW46OkdwdURldmljZSYgZGV2aWNlKSB7CiAgIGRldmljZS5zeW5jaHJvbml6ZSgpOwogfQpAQCAtMTkwLDM1ICsxOTEsMzUgQEAKICAgRWlnZW46OmFycmF5PGludCwgMT4gdGVuc29yUmFuZ2UgPSB7e2NvdW50fX07CiAgIEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDE+IGhvc3QodGVuc29yUmFuZ2UpOwogICBFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAxPiBleHBlY3RlZCh0ZW5zb3JSYW5nZSk7Ci0gIERhdGFUeXBlKiBkZXZpY2VfZGF0YSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KGRldmljZS5hbGxvY2F0ZShjb3VudCAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgCisgIERhdGFUeXBlKiBkZXZpY2VfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oZGV2aWNlLmFsbG9jYXRlKGNvdW50ICogc2l6ZW9mKERhdGFUeXBlKSkpOworCiAgIC8vIG1lbXNldAogICBjb25zdCBjaGFyIGJ5dGVfdmFsdWUgPSBzdGF0aWNfY2FzdDxjaGFyPigweEFCKTsKICAgZGV2aWNlLm1lbXNldChkZXZpY2VfZGF0YSwgYnl0ZV92YWx1ZSwgY291bnQgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChob3N0LmRhdGEoKSwgZGV2aWNlX2RhdGEsIGNvdW50ICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIHN5bmNocm9uaXplKGRldmljZSk7CiAgIG1lbXNldChleHBlY3RlZC5kYXRhKCksIGJ5dGVfdmFsdWUsIGNvdW50ICogc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIGZvciAoc2l6ZV90IGk9MDsgaTxjb3VudDsgaSsrKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgIFZFUklGWV9JU19FUVVBTChob3N0KGkpLCBleHBlY3RlZChpKSk7CiAgIH0KLSAgCisKICAgLy8gZmlsbAogICBEYXRhVHlwZSBmaWxsX3ZhbHVlID0gRGF0YVR5cGUoNyk7CiAgIHN0ZDo6ZmlsbF9uKGV4cGVjdGVkLmRhdGEoKSwgY291bnQsIGZpbGxfdmFsdWUpOwogICBkZXZpY2UuZmlsbChkZXZpY2VfZGF0YSwgZGV2aWNlX2RhdGEgKyBjb3VudCwgZmlsbF92YWx1ZSk7CiAgIGRldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaG9zdC5kYXRhKCksIGRldmljZV9kYXRhLCBjb3VudCAqIHNpemVvZihEYXRhVHlwZSkpOwogICBzeW5jaHJvbml6ZShkZXZpY2UpOwotICBmb3IgKGludCBpPTA7IGk8Y291bnQ7IGkrKykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICBWRVJJRllfSVNfRVFVQUwoaG9zdChpKSwgZXhwZWN0ZWQoaSkpOwogICB9Ci0gIAorCiAgIGRldmljZS5kZWFsbG9jYXRlKGRldmljZV9kYXRhKTsKIH0KIAogdm9pZCB0ZXN0X2NwdSgpIHsKLSAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gaW4xKDQwLDUwLDcwKTsKLSAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gaW4yKDQwLDUwLDcwKTsKLSAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gb3V0KDQwLDUwLDcwKTsKKyAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gaW4xKDQwLCA1MCwgNzApOworICBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiBpbjIoNDAsIDUwLCA3MCk7CisgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+IG91dCg0MCwgNTAsIDcwKTsKIAogICBpbjEgPSBpbjEucmFuZG9tKCkgKyBpbjEuY29uc3RhbnQoMTAuMGYpOwogICBpbjIgPSBpbjIucmFuZG9tKCkgKyBpbjIuY29uc3RhbnQoMTAuMGYpOwpAQCAtMjI4LDcgKzIyOSw3IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTA7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3MDsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksaixrKSwgaW4xKGksaixrKSArIGluMihpLGosaykgKiAzLjE0ZiArIDIuNzE4Zik7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksIGosIGspLCBpbjEoaSwgaiwgaykgKyBpbjIoaSwgaiwgaykgKiAzLjE0ZiArIDIuNzE4Zik7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0yMzcsNyArMjM4LDcgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1MDsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDcwOyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLCAoaW4xKGksaixrKSArIGluMihpLGosaykpICogMy4xNGYgKyAyLjcxOGYpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLCBqLCBrKSwgKGluMShpLCBqLCBrKSArIGluMihpLCBqLCBrKSkgKiAzLjE0ZiArIDIuNzE4Zik7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0yNDYsNyArMjQ3LDcgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1MDsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDcwOyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLCBpbjEoaSxqLGspICsgaW4yKGksaixrKSAqIDMuMTRmICsgMi43MThmKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiwgayksIGluMShpLCBqLCBrKSArIGluMihpLCBqLCBrKSAqIDMuMTRmICsgMi43MThmKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTI1NCw3ICsyNTUsNyBAQAogICB0ZXN0X2NvbnRyYWN0aW9uKCZjb250ZXh0KTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0MDsgKytqKSB7Ci0gICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSxqLDApOworICAgICAgY29uc3QgZmxvYXQgcmVzdWx0ID0gb3V0KGksIGosIDApOwogICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwOwogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1MDsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzA7ICsrbCkgewpAQCAtMjY5LDcgKzI3MCw3IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDk7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3MDsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksaixrKSwgKGluMShpLGosaykgKiAzLjE0ZiArIGluMShpLGorMSxrKSAqIDIuN2YpKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiwgayksIChpbjEoaSwgaiwgaykgKiAzLjE0ZiArIGluMShpLCBqICsgMSwgaykgKiAyLjdmKSk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0yNzgsOSArMjc5LDkgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OTsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDY5OyArK2spIHsKLSAgICAgICAgY29uc3QgZmxvYXQgcmVzdWx0ID0gb3V0KGksaixrKTsKLSAgICAgICAgY29uc3QgZmxvYXQgZXhwZWN0ZWQgPSAoaW4xKGksaixrKSAqIDMuMTRmICsgaW4xKGksaisxLGspICogMi43ZikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbjEoaSxqLGsrMSkgKiAwLjJmICsgaW4xKGksaisxLGsrMSkgKiA3LjBmKTsKKyAgICAgICAgY29uc3QgZmxvYXQgcmVzdWx0ID0gb3V0KGksIGosIGspOworICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9CisgICAgICAgICAgICAoaW4xKGksIGosIGspICogMy4xNGYgKyBpbjEoaSwgaiArIDEsIGspICogMi43ZikgKyAoaW4xKGksIGosIGsgKyAxKSAqIDAuMmYgKyBpbjEoaSwgaiArIDEsIGsgKyAxKSAqIDcuMGYpOwogICAgICAgICBpZiAoZmFicyhleHBlY3RlZCkgPCAxZS00ZiAmJiBmYWJzKHJlc3VsdCkgPCAxZS00ZikgewogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC0yOTMsMTEgKzI5NCwxMSBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDM5OyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ5OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNjk7ICsraykgewotICAgICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSxqLGspOwotICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9IChpbjEoaSxqLGspICogMy4xNGYgKyBpbjEoaSxqKzEsaykgKiAyLjdmICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4xKGksaixrKzEpICogMC4yZiArIGluMShpLGorMSxrKzEpICogNy4wZikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbjEoaSsxLGosaykgKiAtMS4wZiArIGluMShpKzEsaisxLGspICogLTAuM2YgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjEoaSsxLGosaysxKSAqIC0wLjdmICsgaW4xKGkrMSxqKzEsaysxKSAqIC0wLjVmKTsKKyAgICAgICAgY29uc3QgZmxvYXQgcmVzdWx0ID0gb3V0KGksIGosIGspOworICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9CisgICAgICAgICAgICAoaW4xKGksIGosIGspICogMy4xNGYgKyBpbjEoaSwgaiArIDEsIGspICogMi43ZiArIGluMShpLCBqLCBrICsgMSkgKiAwLjJmICsgaW4xKGksIGogKyAxLCBrICsgMSkgKiA3LjBmKSArCisgICAgICAgICAgICAoaW4xKGkgKyAxLCBqLCBrKSAqIC0xLjBmICsgaW4xKGkgKyAxLCBqICsgMSwgaykgKiAtMC4zZiArIGluMShpICsgMSwgaiwgayArIDEpICogLTAuN2YgKworICAgICAgICAgICAgIGluMShpICsgMSwgaiArIDEsIGsgKyAxKSAqIC0wLjVmKTsKICAgICAgICAgaWYgKGZhYnMoZXhwZWN0ZWQpIDwgMWUtNGYgJiYgZmFicyhyZXN1bHQpIDwgMWUtNGYpIHsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtMzA1LDE1ICszMDYsMTUgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLSAgCisKICAgdGVzdF9kZXZpY2VfbWVtb3J5PGZsb2F0Pihjb250ZXh0LmRldmljZSgpKTsKICAgdGVzdF9kZXZpY2VfbWVtb3J5PE9mZkJ5T25lU2NhbGFyPGludD4+KGNvbnRleHQuZGV2aWNlKCkpOwogfQogCiB2b2lkIHRlc3RfZ3B1KCkgewotICBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiBpbjEoNDAsNTAsNzApOwotICBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiBpbjIoNDAsNTAsNzApOwotICBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiBvdXQoNDAsNTAsNzApOworICBFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiBpbjEoNDAsIDUwLCA3MCk7CisgIEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+IGluMig0MCwgNTAsIDcwKTsKKyAgRWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gb3V0KDQwLCA1MCwgNzApOwogICBpbjEgPSBpbjEucmFuZG9tKCkgKyBpbjEuY29uc3RhbnQoMTAuMGYpOwogICBpbjIgPSBpbjIucmFuZG9tKCkgKyBpbjIuY29uc3RhbnQoMTAuMGYpOwogCkBAIC0zMzEsOSArMzMyLDkgQEAKICAgZ3B1TWVtY3B5KGRfaW4xLCBpbjEuZGF0YSgpLCBpbjFfYnl0ZXMsIGdwdU1lbWNweUhvc3RUb0RldmljZSk7CiAgIGdwdU1lbWNweShkX2luMiwgaW4yLmRhdGEoKSwgaW4yX2J5dGVzLCBncHVNZW1jcHlIb3N0VG9EZXZpY2UpOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiBncHVfaW4xKGRfaW4xLCA0MCw1MCw3MCk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiBncHVfaW4yKGRfaW4yLCA0MCw1MCw3MCk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiBncHVfb3V0KGRfb3V0LCA0MCw1MCw3MCk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4+IGdwdV9pbjEoZF9pbjEsIDQwLCA1MCwgNzApOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+PiBncHVfaW4yKGRfaW4yLCA0MCwgNTAsIDcwKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPj4gZ3B1X291dChkX291dCwgNDAsIDUwLCA3MCk7CiAKICAgR1BVQ29udGV4dCBjb250ZXh0KGdwdV9pbjEsIGdwdV9pbjIsIGdwdV9vdXQpOwogICB0ZXN0X2NvbnRleHR1YWxfZXZhbCgmY29udGV4dCk7CkBAIC0zNDEsNyArMzQyLDcgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1MDsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDcwOyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLCBpbjEoaSxqLGspICsgaW4yKGksaixrKSAqIDMuMTRmICsgMi43MThmKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiwgayksIGluMShpLCBqLCBrKSArIGluMihpLCBqLCBrKSAqIDMuMTRmICsgMi43MThmKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTM1MSw3ICszNTIsNyBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDQwOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDUwOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzA7ICsraykgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLGosayksIChpbjEoaSxqLGspICsgaW4yKGksaixrKSkgKiAzLjE0ZiArIDIuNzE4Zik7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksIGosIGspLCAoaW4xKGksIGosIGspICsgaW4yKGksIGosIGspKSAqIDMuMTRmICsgMi43MThmKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTM2MSw3ICszNjIsNyBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDQwOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDUwOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzA7ICsraykgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLGosayksIGluMShpLGosaykgKyBpbjIoaSxqLGspICogMy4xNGYgKyAyLjcxOGYpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLCBqLCBrKSwgaW4xKGksIGosIGspICsgaW4yKGksIGosIGspICogMy4xNGYgKyAyLjcxOGYpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMzcwLDcgKzM3MSw3IEBACiAgIGFzc2VydChncHVNZW1jcHkob3V0LmRhdGEoKSwgZF9vdXQsIG91dF9ieXRlcywgZ3B1TWVtY3B5RGV2aWNlVG9Ib3N0KSA9PSBncHVTdWNjZXNzKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0MDsgKytqKSB7Ci0gICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSxqLDApOworICAgICAgY29uc3QgZmxvYXQgcmVzdWx0ID0gb3V0KGksIGosIDApOwogICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwOwogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1MDsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzA7ICsrbCkgewpAQCAtMzg3LDcgKzM4OCw3IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDk7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3MDsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksaixrKSwgKGluMShpLGosaykgKiAzLjE0ZiArIGluMShpLGorMSxrKSAqIDIuN2YpKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiwgayksIChpbjEoaSwgaiwgaykgKiAzLjE0ZiArIGluMShpLCBqICsgMSwgaykgKiAyLjdmKSk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0zOTgsMTcgKzM5OSwxNyBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDQwOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ5OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNjk7ICsraykgewotICAgICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSxqLGspOwotICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9IChpbjEoaSxqLGspICogMy4xNGYgKyBpbjEoaSxqKzEsaykgKiAyLjdmICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4xKGksaixrKzEpICogMC4yZiArIGluMShpLGorMSxrKzEpICogNy4wZik7CisgICAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdCA9IG91dChpLCBqLCBrKTsKKyAgICAgICAgY29uc3QgZmxvYXQgZXhwZWN0ZWQgPQorICAgICAgICAgICAgKGluMShpLCBqLCBrKSAqIDMuMTRmICsgaW4xKGksIGogKyAxLCBrKSAqIDIuN2YgKyBpbjEoaSwgaiwgayArIDEpICogMC4yZiArIGluMShpLCBqICsgMSwgayArIDEpICogNy4wZik7CiAgICAgICAgIFZFUklGWV9JU19BUFBST1goZXhwZWN0ZWQsIHJlc3VsdCk7CiAgICAgICB9CiAgICAgfQogICB9CiAKICNpZiAhZGVmaW5lZChFSUdFTl9VU0VfSElQKQotLy8gZGlzYWJsZSB0aGlzIHRlc3Qgb24gdGhlIEhJUCBwbGF0Zm9ybQotLy8gM0QgdGVuc29yIGNvbnZvbHV0aW9ucyBzZWVtIHRvIGhhbmcgb24gdGhlIEhJUCBwbGF0Zm9ybQorICAvLyBkaXNhYmxlIHRoaXMgdGVzdCBvbiB0aGUgSElQIHBsYXRmb3JtCisgIC8vIDNEIHRlbnNvciBjb252b2x1dGlvbnMgc2VlbSB0byBoYW5nIG9uIHRoZSBISVAgcGxhdGZvcm0KIAogICB0ZXN0XzNkX2NvbnZvbHV0aW9uKCZjb250ZXh0KTsKICAgYXNzZXJ0KGdwdU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgY29udGV4dC5kZXZpY2UoKS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CkBAIC00MTYsMjUgKzQxNywyMiBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDM5OyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ5OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNjk7ICsraykgewotICAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdCA9IG91dChpLGosayk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkID0gKGluMShpLGosaykgKiAzLjE0ZiArIGluMShpLGorMSxrKSAqIDIuN2YgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjEoaSxqLGsrMSkgKiAwLjJmICsgaW4xKGksaisxLGsrMSkgKiA3LjBmICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4xKGkrMSxqLGspICogLTEuMGYgKyBpbjEoaSsxLGorMSxrKSAqIC0wLjNmICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4xKGkrMSxqLGsrMSkgKiAtMC43ZiArIGluMShpKzEsaisxLGsrMSkgKiAtMC41Zik7CisgICAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdCA9IG91dChpLCBqLCBrKTsKKyAgICAgICAgY29uc3QgZmxvYXQgZXhwZWN0ZWQgPSAoaW4xKGksIGosIGspICogMy4xNGYgKyBpbjEoaSwgaiArIDEsIGspICogMi43ZiArIGluMShpLCBqLCBrICsgMSkgKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4xKGksIGogKyAxLCBrICsgMSkgKiA3LjBmICsgaW4xKGkgKyAxLCBqLCBrKSAqIC0xLjBmICsgaW4xKGkgKyAxLCBqICsgMSwgaykgKiAtMC4zZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMShpICsgMSwgaiwgayArIDEpICogLTAuN2YgKyBpbjEoaSArIDEsIGogKyAxLCBrICsgMSkgKiAtMC41Zik7CiAgICAgICAgIFZFUklGWV9JU19BUFBST1goZXhwZWN0ZWQsIHJlc3VsdCk7CiAgICAgICB9CiAgICAgfQogICB9CiAKICNlbmRpZgotIAorCiAgIHRlc3RfZGV2aWNlX21lbW9yeTxmbG9hdD4oY29udGV4dC5kZXZpY2UoKSk7CiAgIHRlc3RfZGV2aWNlX21lbW9yeTxPZmZCeU9uZVNjYWxhcjxpbnQ+Pihjb250ZXh0LmRldmljZSgpKTsKIH0KIAotCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2RldmljZSkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfZGV2aWNlKSB7CiAgIENBTExfU1VCVEVTVF8xKHRlc3RfY3B1KCkpOwogICBDQUxMX1NVQlRFU1RfMih0ZXN0X2dwdSgpKTsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2RldmljZV9zeWNsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2RldmljZV9zeWNsLmNwcAppbmRleCA2NmExM2U4Li5kMTkwODE1IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9kZXZpY2Vfc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZGV2aWNlX3N5Y2wuY3BwCkBAIC0yNCwxOCArMjQsMTggQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotdm9pZCB0ZXN0X2RldmljZV9tZW1vcnkoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7Cit2b2lkIHRlc3RfZGV2aWNlX21lbW9yeShjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gMTAwOwogICBhcnJheTxJbmRleFR5cGUsIDE+IHRlbnNvclJhbmdlID0ge3tzaXplRGltMX19OwotICBUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBpbih0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCxJbmRleFR5cGU+IGluMSh0ZW5zb3JSYW5nZSk7Ci0gIERhdGFUeXBlKiBncHVfaW5fZGF0YSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBpbih0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBpbjEodGVuc29yUmFuZ2UpOworICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKIAogICAvLyBtZW1zZXQKICAgbWVtc2V0KGluMS5kYXRhKCksIDEsIGluMS5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKTsKLSAgc3ljbF9kZXZpY2UubWVtc2V0KGdwdV9pbl9kYXRhLCAxLCBpbi5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbi5kYXRhKCksIGdwdV9pbl9kYXRhLCBpbi5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIGZvciAoSW5kZXhUeXBlIGk9MDsgaTxpbi5zaXplKCk7IGkrKykgeworICBzeWNsX2RldmljZS5tZW1zZXQoZ3B1X2luX2RhdGEsIDEsIGluLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW4uZGF0YSgpLCBncHVfaW5fZGF0YSwgaW4uc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyBpKyspIHsKICAgICBWRVJJRllfSVNfRVFVQUwoaW4oaSksIGluMShpKSk7CiAgIH0KIApAQCAtNDMsOCArNDMsOCBAQAogICBEYXRhVHlwZSB2YWx1ZSA9IERhdGFUeXBlKDcpOwogICBzdGQ6OmZpbGxfbihpbjEuZGF0YSgpLCBpbjEuc2l6ZSgpLCB2YWx1ZSk7CiAgIHN5Y2xfZGV2aWNlLmZpbGwoZ3B1X2luX2RhdGEsIGdwdV9pbl9kYXRhICsgaW4uc2l6ZSgpLCB2YWx1ZSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbi5kYXRhKCksIGdwdV9pbl9kYXRhLCBpbi5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIGZvciAoSW5kZXhUeXBlIGk9MDsgaTxpbi5zaXplKCk7IGkrKykgeworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW4uZGF0YSgpLCBncHVfaW5fZGF0YSwgaW4uc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyBpKyspIHsKICAgICBWRVJJRllfSVNfRVFVQUwoaW4oaSksIGluMShpKSk7CiAgIH0KIApAQCAtNTIsMTUgKzUyLDE1IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXZvaWQgdGVzdF9kZXZpY2VfZXhjZXB0aW9ucyhjb25zdCBFaWdlbjo6U3ljbERldmljZSAmc3ljbF9kZXZpY2UpIHsKK3ZvaWQgdGVzdF9kZXZpY2VfZXhjZXB0aW9ucyhjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgVkVSSUZZKHN5Y2xfZGV2aWNlLm9rKCkpOwogICBJbmRleFR5cGUgc2l6ZURpbTEgPSAxMDA7CiAgIGFycmF5PEluZGV4VHlwZSwgMT4gdGVuc29yRGltcyA9IHt7c2l6ZURpbTF9fTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzaXplRGltMSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbXNldChncHVfZGF0YSwgMSwgc2l6ZURpbTEqc2l6ZW9mKERhdGFUeXBlKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoc2l6ZURpbTEgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIHN5Y2xfZGV2aWNlLm1lbXNldChncHVfZGF0YSwgMSwgc2l6ZURpbTEgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGluKGdwdV9kYXRhLCB0ZW5zb3JEaW1zKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBvdXQoZ3B1X2RhdGEsIHRlbnNvckRpbXMpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBpbihncHVfZGF0YSwgdGVuc29yRGltcyk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IG91dChncHVfZGF0YSwgdGVuc29yRGltcyk7CiAgIG91dC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW4gLyBpbi5jb25zdGFudCgwKTsKIAogICBzeWNsX2RldmljZS5zeW5jaHJvbml6ZSgpOwpAQCAtNjgsMjAgKzY4LDIxIEBACiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2RhdGEpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhVHlwZT4gdm9pZCBzeWNsX2RldmljZV90ZXN0X3Blcl9kZXZpY2UoY29uc3QgY2w6OnN5Y2w6OmRldmljZSYgZCl7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGU+Cit2b2lkIHN5Y2xfZGV2aWNlX3Rlc3RfcGVyX2RldmljZShjb25zdCBjbDo6c3ljbDo6ZGV2aWNlJiBkKSB7CiAgIHN0ZDo6Y291dCA8PCAiUnVubmluZyBvbiAiIDw8IGQudGVtcGxhdGUgZ2V0X2luZm88Y2w6OnN5Y2w6OmluZm86OmRldmljZTo6bmFtZT4oKSA8PCBzdGQ6OmVuZGw7CiAgIFF1ZXVlSW50ZXJmYWNlIHF1ZXVlSW50ZXJmYWNlKGQpOwogICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKICAgdGVzdF9kZXZpY2VfbWVtb3J5PERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogICB0ZXN0X2RldmljZV9tZW1vcnk8RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CiAgIC8vLyB0aGlzIHRlc3QgdGhyb3cgYW4gZXhjZXB0aW9uLiBlbmFibGUgaXQgaWYgeW91IHdhbnQgdG8gc2VlIHRoZSBleGNlcHRpb24KLSAgLy90ZXN0X2RldmljZV9leGNlcHRpb25zPERhdGFUeXBlLCBSb3dNYWpvcj4oc3ljbF9kZXZpY2UpOworICAvLyB0ZXN0X2RldmljZV9leGNlcHRpb25zPERhdGFUeXBlLCBSb3dNYWpvcj4oc3ljbF9kZXZpY2UpOwogICAvLy8gdGhpcyB0ZXN0IHRocm93IGFuIGV4Y2VwdGlvbi4gZW5hYmxlIGl0IGlmIHlvdSB3YW50IHRvIHNlZSB0aGUgZXhjZXB0aW9uCi0gIC8vdGVzdF9kZXZpY2VfZXhjZXB0aW9uczxEYXRhVHlwZSwgQ29sTWFqb3I+KHN5Y2xfZGV2aWNlKTsKKyAgLy8gdGVzdF9kZXZpY2VfZXhjZXB0aW9uczxEYXRhVHlwZSwgQ29sTWFqb3I+KHN5Y2xfZGV2aWNlKTsKIH0KIAogRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9kZXZpY2Vfc3ljbCkgewotICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6RWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgewogICAgIENBTExfU1VCVEVTVChzeWNsX2RldmljZV90ZXN0X3Blcl9kZXZpY2U8aGFsZj4oZGV2aWNlKSk7CiAgICAgQ0FMTF9TVUJURVNUKHN5Y2xfZGV2aWNlX3Rlc3RfcGVyX2RldmljZTxmbG9hdD4oZGV2aWNlKSk7CiAgICAgQ0FMTF9TVUJURVNUKHN5Y2xfZGV2aWNlX3Rlc3RfcGVyX2RldmljZTxPZmZCeU9uZVNjYWxhcjxpbnQ+PihkZXZpY2UpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2RpbWVuc2lvbi5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9kaW1lbnNpb24uY3BwCmluZGV4IGVlNDE2ZTEuLjM0MjNhNjYgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2RpbWVuc2lvbi5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZGltZW5zaW9uLmNwcApAQCAtMTMsNDMgKzEzLDM4IEBACiAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKLQotc3RhdGljIHZvaWQgdGVzdF9keW5hbWljX3NpemUoKQotewotICBFaWdlbjo6RFNpemVzPGludCwgMz4gZGltZW5zaW9ucygyLDMsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X2R5bmFtaWNfc2l6ZSgpIHsKKyAgRWlnZW46OkRTaXplczxpbnQsIDM+IGRpbWVuc2lvbnMoMiwgMywgNyk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKChpbnQpRWlnZW46OmludGVybmFsOjphcnJheV9nZXQ8MD4oZGltZW5zaW9ucyksIDIpOwogICBWRVJJRllfSVNfRVFVQUwoKGludClFaWdlbjo6aW50ZXJuYWw6OmFycmF5X2dldDwxPihkaW1lbnNpb25zKSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTCgoaW50KUVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfZ2V0PDI+KGRpbWVuc2lvbnMpLCA3KTsKLSAgVkVSSUZZX0lTX0VRVUFMKChpbnQpZGltZW5zaW9ucy5Ub3RhbFNpemUoKSwgMiozKjcpOworICBWRVJJRllfSVNfRVFVQUwoKGludClkaW1lbnNpb25zLlRvdGFsU2l6ZSgpLCAyICogMyAqIDcpOwogICBWRVJJRllfSVNfRVFVQUwoKGludClkaW1lbnNpb25zWzBdLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKChpbnQpZGltZW5zaW9uc1sxXSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTCgoaW50KWRpbWVuc2lvbnNbMl0sIDcpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X2ZpeGVkX3NpemUoKQotewotICBFaWdlbjo6U2l6ZXM8MiwzLDc+IGRpbWVuc2lvbnM7CitzdGF0aWMgdm9pZCB0ZXN0X2ZpeGVkX3NpemUoKSB7CisgIEVpZ2VuOjpTaXplczwyLCAzLCA3PiBkaW1lbnNpb25zOwogCiAgIFZFUklGWV9JU19FUVVBTCgoaW50KUVpZ2VuOjppbnRlcm5hbDo6YXJyYXlfZ2V0PDA+KGRpbWVuc2lvbnMpLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKChpbnQpRWlnZW46OmludGVybmFsOjphcnJheV9nZXQ8MT4oZGltZW5zaW9ucyksIDMpOwogICBWRVJJRllfSVNfRVFVQUwoKGludClFaWdlbjo6aW50ZXJuYWw6OmFycmF5X2dldDwyPihkaW1lbnNpb25zKSwgNyk7Ci0gIFZFUklGWV9JU19FUVVBTCgoaW50KWRpbWVuc2lvbnMuVG90YWxTaXplKCksIDIqMyo3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKChpbnQpZGltZW5zaW9ucy5Ub3RhbFNpemUoKSwgMiAqIDMgKiA3KTsKIH0KIAotc3RhdGljIHZvaWQgdGVzdF9tYXRjaCgpCi17Ci0gIEVpZ2VuOjpEU2l6ZXM8dW5zaWduZWQgaW50LCAzPiBkeW4oKHVuc2lnbmVkIGludCkyLCh1bnNpZ25lZCBpbnQpMywodW5zaWduZWQgaW50KTcpOwotICBFaWdlbjo6U2l6ZXM8MiwzLDc+IHN0YXQ7CitzdGF0aWMgdm9pZCB0ZXN0X21hdGNoKCkgeworICBFaWdlbjo6RFNpemVzPHVuc2lnbmVkIGludCwgMz4gZHluKCh1bnNpZ25lZCBpbnQpMiwgKHVuc2lnbmVkIGludCkzLCAodW5zaWduZWQgaW50KTcpOworICBFaWdlbjo6U2l6ZXM8MiwgMywgNz4gc3RhdDsKICAgVkVSSUZZX0lTX0VRVUFMKEVpZ2VuOjpkaW1lbnNpb25zX21hdGNoKGR5biwgc3RhdCksIHRydWUpOwogCi0gIEVpZ2VuOjpEU2l6ZXM8aW50LCAzPiBkeW4xKDIsMyw3KTsKLSAgRWlnZW46OkRTaXplczxpbnQsIDI+IGR5bjIoMiwzKTsKKyAgRWlnZW46OkRTaXplczxpbnQsIDM+IGR5bjEoMiwgMywgNyk7CisgIEVpZ2VuOjpEU2l6ZXM8aW50LCAyPiBkeW4yKDIsIDMpOwogICBWRVJJRllfSVNfRVFVQUwoRWlnZW46OmRpbWVuc2lvbnNfbWF0Y2goZHluMSwgZHluMiksIGZhbHNlKTsKIH0KIAotc3RhdGljIHZvaWQgdGVzdF9yYW5rX3plcm8oKQoteworc3RhdGljIHZvaWQgdGVzdF9yYW5rX3plcm8oKSB7CiAgIEVpZ2VuOjpTaXplczw+IHNjYWxhcjsKICAgVkVSSUZZX0lTX0VRVUFMKChpbnQpc2NhbGFyLlRvdGFsU2l6ZSgpLCAxKTsKICAgVkVSSUZZX0lTX0VRVUFMKChpbnQpc2NhbGFyLnJhbmsoKSwgMCk7CkBAIC03OCw4ICs3Myw3IEBACiAgIFZFUklGWV9JU19FUVVBTChkc3QxWzJdLCA2TCk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfZGltZW5zaW9uKQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9kaW1lbnNpb24pIHsKICAgQ0FMTF9TVUJURVNUKHRlc3RfZHluYW1pY19zaXplKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9maXhlZF9zaXplKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9tYXRjaCgpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2VtcHR5LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2VtcHR5LmNwcAppbmRleCBmZDg4OWM0Li5jOTBjZjM2IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9lbXB0eS5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZW1wdHkuY3BwCkBAIC0xMSw5ICsxMSw3IEBACiAKICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CiAKLQotc3RhdGljIHZvaWQgdGVzdF9lbXB0eV90ZW5zb3IoKQoteworc3RhdGljIHZvaWQgdGVzdF9lbXB0eV90ZW5zb3IoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMj4gc291cmNlOwogICBUZW5zb3I8ZmxvYXQsIDI+IHRndDEgPSBzb3VyY2U7CiAgIFRlbnNvcjxmbG9hdCwgMj4gdGd0Mihzb3VyY2UpOwpAQCAtMjIsOCArMjAsNyBAQAogICB0Z3QzID0gdGd0MjsKIH0KIAotc3RhdGljIHZvaWQgdGVzdF9lbXB0eV9maXhlZF9zaXplX3RlbnNvcigpCi17CitzdGF0aWMgdm9pZCB0ZXN0X2VtcHR5X2ZpeGVkX3NpemVfdGVuc29yKCkgewogICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDA+ID4gc291cmNlOwogICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDA+ID4gdGd0MSA9IHNvdXJjZTsKICAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwwPiA+IHRndDIoc291cmNlKTsKQEAgLTMyLDkgKzI5LDcgQEAKICAgdGd0MyA9IHRndDI7CiB9CiAKLQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9lbXB0eSkKLXsKLSAgIENBTExfU1VCVEVTVCh0ZXN0X2VtcHR5X3RlbnNvcigpKTsKLSAgIENBTExfU1VCVEVTVCh0ZXN0X2VtcHR5X2ZpeGVkX3NpemVfdGVuc29yKCkpOworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9lbXB0eSkgeworICBDQUxMX1NVQlRFU1QodGVzdF9lbXB0eV90ZW5zb3IoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X2VtcHR5X2ZpeGVkX3NpemVfdGVuc29yKCkpOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZXhlY3V0b3IuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZXhlY3V0b3IuY3BwCmluZGV4IGQwMTAzZGMuLmJhNTUzZjkgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2V4ZWN1dG9yLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9leGVjdXRvci5jcHAKQEAgLTEzLDkgKzEzLDkgQEAKIAogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KIAotdXNpbmcgRWlnZW46OlRlbnNvcjsKLXVzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKIHVzaW5nIEVpZ2VuOjpDb2xNYWpvcjsKK3VzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CiB1c2luZyBFaWdlbjo6aW50ZXJuYWw6OlRpbGVkRXZhbHVhdGlvbjsKIAogLy8gQSBzZXQgb2YgdGVzdHMgdG8gdmVyaWZ5IHRoYXQgZGlmZmVyZW50IFRlbnNvckV4ZWN1dG9yIHN0cmF0ZWdpZXMgeWllbGRzIHRoZQpAQCAtMjYsMjEgKzI2LDE4IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0LCB0eXBlbmFtZSBFeHByPgogc3RhdGljIHZvaWQgRGVmYXVsdEFzc2lnbihEc3QmIGRzdCwgRXhwciBleHByKSB7CiAgIHVzaW5nIEFzc2lnbiA9IEVpZ2VuOjpUZW5zb3JBc3NpZ25PcDxEc3QsIGNvbnN0IEV4cHI+OwotICB1c2luZyBFeGVjdXRvciA9Ci0gICAgICBFaWdlbjo6aW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGVmYXVsdERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypWZWN0b3JpemFibGU9Ki9mYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaWxpbmc9Ki9UaWxlZEV2YWx1YXRpb246Ok9mZj47CisgIHVzaW5nIEV4ZWN1dG9yID0gRWlnZW46OmludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERlZmF1bHREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlZlY3Rvcml6YWJsZT0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaWxpbmc9Ki9UaWxlZEV2YWx1YXRpb246Ok9mZj47CiAKICAgRXhlY3V0b3I6OnJ1bihBc3NpZ24oZHN0LCBleHByKSwgRGVmYXVsdERldmljZSgpKTsKIH0KIAogLy8gQXNzaWdubWVudCB3aXRoIHNwZWNpZmllZCBkZXZpY2UgYW5kIHRpbGluZyBzdHJhdGVneS4KLXRlbXBsYXRlIDxib29sIFZlY3Rvcml6YWJsZSwgVGlsZWRFdmFsdWF0aW9uIFRpbGluZywgdHlwZW5hbWUgRGV2aWNlLAotICAgICAgICAgIHR5cGVuYW1lIERzdCwgdHlwZW5hbWUgRXhwcj4KK3RlbXBsYXRlIDxib29sIFZlY3Rvcml6YWJsZSwgVGlsZWRFdmFsdWF0aW9uIFRpbGluZywgdHlwZW5hbWUgRGV2aWNlLCB0eXBlbmFtZSBEc3QsIHR5cGVuYW1lIEV4cHI+CiBzdGF0aWMgdm9pZCBEZXZpY2VBc3NpZ24oRGV2aWNlJiBkLCBEc3QmIGRzdCwgRXhwciBleHByKSB7CiAgIHVzaW5nIEFzc2lnbiA9IEVpZ2VuOjpUZW5zb3JBc3NpZ25PcDxEc3QsIGNvbnN0IEV4cHI+OwotICB1c2luZyBFeGVjdXRvciA9IEVpZ2VuOjppbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JpemFibGUsIFRpbGluZz47CisgIHVzaW5nIEV4ZWN1dG9yID0gRWlnZW46OmludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERldmljZSwgVmVjdG9yaXphYmxlLCBUaWxpbmc+OwogCiAgIEV4ZWN1dG9yOjpydW4oQXNzaWduKGRzdCwgZXhwciksIGQpOwogfQpAQCAtNTQsMTAgKzUxLDggQEAKICAgcmV0dXJuIGRpbXM7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTnVtRGltcywgdHlwZW5hbWUgRGV2aWNlLCBib29sIFZlY3Rvcml6YWJsZSwKLSAgICAgICAgICBUaWxlZEV2YWx1YXRpb24gVGlsaW5nLCBpbnQgTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9leGVjdXRlX3VuYXJ5X2V4cHIoRGV2aWNlIGQpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsIFRpbGVkRXZhbHVhdGlvbiBUaWxpbmcsIGludCBMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2V4ZWN1dGVfdW5hcnlfZXhwcihEZXZpY2UgZCkgewogICBzdGF0aWMgY29uc3RleHByIGludCBPcHRpb25zID0gMCB8IExheW91dDsKIAogICAvLyBQaWNrIGEgbGFyZ2UgZW5vdWdoIHRlbnNvciBzaXplIHRvIGJ5cGFzcyBzbWFsbCB0ZW5zb3IgYmxvY2sgZXZhbHVhdGlvbgpAQCAtNzEsOCArNjYsNyBAQAogICBjb25zdCBhdXRvIGV4cHIgPSBzcmMuc3F1YXJlKCk7CiAKICAgdXNpbmcgQXNzaWduID0gVGVuc29yQXNzaWduT3A8ZGVjbHR5cGUoZHN0KSwgY29uc3QgZGVjbHR5cGUoZXhwcik+OwotICB1c2luZyBFeGVjdXRvciA9Ci0gICAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2UsIFZlY3Rvcml6YWJsZSwgVGlsaW5nPjsKKyAgdXNpbmcgRXhlY3V0b3IgPSBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2UsIFZlY3Rvcml6YWJsZSwgVGlsaW5nPjsKIAogICBFeGVjdXRvcjo6cnVuKEFzc2lnbihkc3QsIGV4cHIpLCBkKTsKIApAQCAtODIsMTAgKzc2LDggQEAKICAgfQogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsCi0gICAgICAgICAgVGlsZWRFdmFsdWF0aW9uIFRpbGluZywgaW50IExheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfZXhlY3V0ZV9iaW5hcnlfZXhwcihEZXZpY2UgZCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTnVtRGltcywgdHlwZW5hbWUgRGV2aWNlLCBib29sIFZlY3Rvcml6YWJsZSwgVGlsZWRFdmFsdWF0aW9uIFRpbGluZywgaW50IExheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZXhlY3V0ZV9iaW5hcnlfZXhwcihEZXZpY2UgZCkgewogICBzdGF0aWMgY29uc3RleHByIGludCBPcHRpb25zID0gMCB8IExheW91dDsKIAogICAvLyBQaWNrIGEgbGFyZ2UgZW5vdWdoIHRlbnNvciBzaXplIHRvIGJ5cGFzcyBzbWFsbCB0ZW5zb3IgYmxvY2sgZXZhbHVhdGlvbgpAQCAtMTAyLDggKzk0LDcgQEAKICAgY29uc3QgYXV0byBleHByID0gbGhzICsgcmhzOwogCiAgIHVzaW5nIEFzc2lnbiA9IFRlbnNvckFzc2lnbk9wPGRlY2x0eXBlKGRzdCksIGNvbnN0IGRlY2x0eXBlKGV4cHIpPjsKLSAgdXNpbmcgRXhlY3V0b3IgPQotICAgICAgaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGV2aWNlLCBWZWN0b3JpemFibGUsIFRpbGluZz47CisgIHVzaW5nIEV4ZWN1dG9yID0gaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGV2aWNlLCBWZWN0b3JpemFibGUsIFRpbGluZz47CiAKICAgRXhlY3V0b3I6OnJ1bihBc3NpZ24oZHN0LCBleHByKSwgZCk7CiAKQEAgLTExMywxMCArMTA0LDggQEAKICAgfQogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsCi0gICAgICAgICAgVGlsZWRFdmFsdWF0aW9uIFRpbGluZywgaW50IExheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfZXhlY3V0ZV9icm9hZGNhc3RpbmcoRGV2aWNlIGQpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsIFRpbGVkRXZhbHVhdGlvbiBUaWxpbmcsIGludCBMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2V4ZWN1dGVfYnJvYWRjYXN0aW5nKERldmljZSBkKSB7CiAgIHN0YXRpYyBjb25zdGV4cHIgaW50IE9wdGlvbnMgPSAwIHwgTGF5b3V0OwogCiAgIGF1dG8gZGltcyA9IFJhbmRvbURpbXM8TnVtRGltcz4oMSwgMTApOwpAQCAtMTM1LDggKzEyNCw3IEBACiAgIFRlbnNvcjxULCBOdW1EaW1zLCBPcHRpb25zLCBJbmRleD4gZHN0KGdvbGRlbi5kaW1lbnNpb25zKCkpOwogCiAgIHVzaW5nIEFzc2lnbiA9IFRlbnNvckFzc2lnbk9wPGRlY2x0eXBlKGRzdCksIGNvbnN0IGRlY2x0eXBlKGV4cHIpPjsKLSAgdXNpbmcgRXhlY3V0b3IgPQotICAgICAgaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGV2aWNlLCBWZWN0b3JpemFibGUsIFRpbGluZz47CisgIHVzaW5nIEV4ZWN1dG9yID0gaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGV2aWNlLCBWZWN0b3JpemFibGUsIFRpbGluZz47CiAKICAgRXhlY3V0b3I6OnJ1bihBc3NpZ24oZHN0LCBleHByKSwgZCk7CiAKQEAgLTE0NSwzMyArMTMzLDMwIEBACiAgIH0KIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCB0eXBlbmFtZSBEZXZpY2UsIGJvb2wgVmVjdG9yaXphYmxlLAotICAgICAgICAgIFRpbGVkRXZhbHVhdGlvbiBUaWxpbmcsIGludCBMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2V4ZWN1dGVfY2hpcHBpbmdfcnZhbHVlKERldmljZSBkKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCB0eXBlbmFtZSBEZXZpY2UsIGJvb2wgVmVjdG9yaXphYmxlLCBUaWxlZEV2YWx1YXRpb24gVGlsaW5nLCBpbnQgTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9leGVjdXRlX2NoaXBwaW5nX3J2YWx1ZShEZXZpY2UgZCkgewogICBhdXRvIGRpbXMgPSBSYW5kb21EaW1zPE51bURpbXM+KDEsIDEwKTsKICAgVGVuc29yPFQsIE51bURpbXMsIExheW91dCwgSW5kZXg+IHNyYyhkaW1zKTsKICAgc3JjLnNldFJhbmRvbSgpOwogCi0jZGVmaW5lIFRFU1RfQ0hJUFBJTkcoQ0hJUF9ESU0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKE51bURpbXMgPiAoQ0hJUF9ESU0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGF1dG8gb2Zmc2V0ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgZGltc1soQ0hJUF9ESU0pXSAtIDEpOyBcCi0gICAgY29uc3QgYXV0byBleHByID0gc3JjLnRlbXBsYXRlIGNoaXA8KENISVBfRElNKT4ob2Zmc2V0KTsgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFRlbnNvcjxULCBOdW1EaW1zIC0gMSwgTGF5b3V0LCBJbmRleD4gZ29sZGVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ29sZGVuID0gZXhwcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFRlbnNvcjxULCBOdW1EaW1zIC0gMSwgTGF5b3V0LCBJbmRleD4gZHN0KGdvbGRlbi5kaW1lbnNpb25zKCkpOyAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1c2luZyBBc3NpZ24gPSBUZW5zb3JBc3NpZ25PcDxkZWNsdHlwZShkc3QpLCBjb25zdCBkZWNsdHlwZShleHByKT47ICAgXAotICAgIHVzaW5nIEV4ZWN1dG9yID0gaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGV2aWNlLCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yaXphYmxlLCBUaWxpbmc+OyAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEV4ZWN1dG9yOjpydW4oQXNzaWduKGRzdCwgZXhwciksIGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgZHN0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKTsgKytpKSB7ICAgICAgICAgICAgXAotICAgICAgVkVSSUZZX0lTX0VRVUFMKGRzdC5jb2VmZihpKSwgZ29sZGVuLmNvZWZmKGkpKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgVEVTVF9DSElQUElORyhDSElQX0RJTSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChOdW1EaW1zID4gKENISVBfRElNKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGF1dG8gb2Zmc2V0ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgZGltc1soQ0hJUF9ESU0pXSAtIDEpOyAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBhdXRvIGV4cHIgPSBzcmMudGVtcGxhdGUgY2hpcDwoQ0hJUF9ESU0pPihvZmZzZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRlbnNvcjxULCBOdW1EaW1zIC0gMSwgTGF5b3V0LCBJbmRleD4gZ29sZGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnb2xkZW4gPSBleHByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRlbnNvcjxULCBOdW1EaW1zIC0gMSwgTGF5b3V0LCBJbmRleD4gZHN0KGdvbGRlbi5kaW1lbnNpb25zKCkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXNpbmcgQXNzaWduID0gVGVuc29yQXNzaWduT3A8ZGVjbHR5cGUoZHN0KSwgY29uc3QgZGVjbHR5cGUoZXhwcik+OyAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIEV4ZWN1dG9yID0gaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGV2aWNlLCBWZWN0b3JpemFibGUsIFRpbGluZz47IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRXhlY3V0b3I6OnJ1bihBc3NpZ24oZHN0LCBleHByKSwgZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgZHN0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKTsgKytpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBWRVJJRllfSVNfRVFVQUwoZHN0LmNvZWZmKGkpLCBnb2xkZW4uY29lZmYoaSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfQogCiAgIFRFU1RfQ0hJUFBJTkcoMCkKQEAgLTE4NCw0NiArMTY5LDQzIEBACiAjdW5kZWYgVEVTVF9DSElQUElORwogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsCi0gICAgVGlsZWRFdmFsdWF0aW9uIFRpbGluZywgaW50IExheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfZXhlY3V0ZV9jaGlwcGluZ19sdmFsdWUoRGV2aWNlIGQpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsIFRpbGVkRXZhbHVhdGlvbiBUaWxpbmcsIGludCBMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2V4ZWN1dGVfY2hpcHBpbmdfbHZhbHVlKERldmljZSBkKSB7CiAgIGF1dG8gZGltcyA9IFJhbmRvbURpbXM8TnVtRGltcz4oMSwgMTApOwogCi0jZGVmaW5lIFRFU1RfQ0hJUFBJTkcoQ0hJUF9ESU0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoTnVtRGltcyA+IChDSElQX0RJTSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAvKiBHZW5lcmF0ZSByYW5kb20gZGF0YSB0aGF0IHdlJ2xsIGFzc2lnbiB0byB0aGUgY2hpcHBlZCB0ZW5zb3IgZGltLiAqLyBcCi0gICAgYXJyYXk8SW5kZXgsIE51bURpbXMgLSAxPiBzcmNfZGltczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltcyAtIDE7ICsraSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGludCBkaW0gPSBpIDwgKENISVBfRElNKSA/IGkgOiBpICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBzcmNfZGltc1tpXSA9IGRpbXNbZGltXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVGVuc29yPFQsIE51bURpbXMgLSAxLCBMYXlvdXQsIEluZGV4PiBzcmMoc3JjX2RpbXMpOyAgICAgICAgICAgICAgICAgICAgXAotICAgIHNyYy5zZXRSYW5kb20oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgYXV0byBvZmZzZXQgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigwLCBkaW1zWyhDSElQX0RJTSldIC0gMSk7ICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBUZW5zb3I8VCwgTnVtRGltcywgTGF5b3V0LCBJbmRleD4gcmFuZG9tKGRpbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmFuZG9tLnNldFplcm8oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBUZW5zb3I8VCwgTnVtRGltcywgTGF5b3V0LCBJbmRleD4gZ29sZGVuKGRpbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ29sZGVuID0gcmFuZG9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdvbGRlbi50ZW1wbGF0ZSBjaGlwPChDSElQX0RJTSk+KG9mZnNldCkgPSBzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVGVuc29yPFQsIE51bURpbXMsIExheW91dCwgSW5kZXg+IGRzdChkaW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRzdCA9IHJhbmRvbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhdXRvIGV4cHIgPSBkc3QudGVtcGxhdGUgY2hpcDwoQ0hJUF9ESU0pPihvZmZzZXQpOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVzaW5nIEFzc2lnbiA9IFRlbnNvckFzc2lnbk9wPGRlY2x0eXBlKGV4cHIpLCBjb25zdCBkZWNsdHlwZShzcmMpPjsgICAgIFwKLSAgICB1c2luZyBFeGVjdXRvciA9IGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERldmljZSwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yaXphYmxlLCBUaWxpbmc+OyAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBFeGVjdXRvcjo6cnVuKEFzc2lnbihleHByLCBzcmMpLCBkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBkc3QuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpOyArK2kpIHsgICAgICAgICAgICAgIFwKLSAgICAgIFZFUklGWV9JU19FUVVBTChkc3QuY29lZmYoaSksIGdvbGRlbi5jb2VmZihpKSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBURVNUX0NISVBQSU5HKENISVBfRElNKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKE51bURpbXMgPiAoQ0hJUF9ESU0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogR2VuZXJhdGUgcmFuZG9tIGRhdGEgdGhhdCB3ZSdsbCBhc3NpZ24gdG8gdGhlIGNoaXBwZWQgdGVuc29yIGRpbS4gKi8gICAgICAgICAgICAgICAgXAorICAgIGFycmF5PEluZGV4LCBOdW1EaW1zIC0gMT4gc3JjX2RpbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE51bURpbXMgLSAxOyArK2kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgZGltID0gaSA8IChDSElQX0RJTSkgPyBpIDogaSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3JjX2RpbXNbaV0gPSBkaW1zW2RpbV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRlbnNvcjxULCBOdW1EaW1zIC0gMSwgTGF5b3V0LCBJbmRleD4gc3JjKHNyY19kaW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmMuc2V0UmFuZG9tKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGF1dG8gb2Zmc2V0ID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMCwgZGltc1soQ0hJUF9ESU0pXSAtIDEpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVGVuc29yPFQsIE51bURpbXMsIExheW91dCwgSW5kZXg+IHJhbmRvbShkaW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJhbmRvbS5zZXRaZXJvKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVGVuc29yPFQsIE51bURpbXMsIExheW91dCwgSW5kZXg+IGdvbGRlbihkaW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdvbGRlbiA9IHJhbmRvbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnb2xkZW4udGVtcGxhdGUgY2hpcDwoQ0hJUF9ESU0pPihvZmZzZXQpID0gc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRlbnNvcjxULCBOdW1EaW1zLCBMYXlvdXQsIEluZGV4PiBkc3QoZGltcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgPSByYW5kb207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXV0byBleHByID0gZHN0LnRlbXBsYXRlIGNoaXA8KENISVBfRElNKT4ob2Zmc2V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1c2luZyBBc3NpZ24gPSBUZW5zb3JBc3NpZ25PcDxkZWNsdHlwZShleHByKSwgY29uc3QgZGVjbHR5cGUoc3JjKT47ICAgICAgICAgICAgICAgICAgICBcCisgICAgdXNpbmcgRXhlY3V0b3IgPSBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2UsIFZlY3Rvcml6YWJsZSwgVGlsaW5nPjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFeGVjdXRvcjo6cnVuKEFzc2lnbihleHByLCBzcmMpLCBkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoSW5kZXggaSA9IDA7IGkgPCBkc3QuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpOyArK2kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFZFUklGWV9JU19FUVVBTChkc3QuY29lZmYoaSksIGdvbGRlbi5jb2VmZihpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CiAKICAgVEVTVF9DSElQUElORygwKQpAQCAtMjM2LDEwICsyMTgsOCBAQAogI3VuZGVmIFRFU1RfQ0hJUFBJTkcKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCB0eXBlbmFtZSBEZXZpY2UsIGJvb2wgVmVjdG9yaXphYmxlLAotICAgICAgICAgIFRpbGVkRXZhbHVhdGlvbiBUaWxpbmcsIGludCBMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2V4ZWN1dGVfc2h1ZmZsZV9ydmFsdWUoRGV2aWNlIGQpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsIFRpbGVkRXZhbHVhdGlvbiBUaWxpbmcsIGludCBMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2V4ZWN1dGVfc2h1ZmZsZV9ydmFsdWUoRGV2aWNlIGQpIHsKICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgT3B0aW9ucyA9IDAgfCBMYXlvdXQ7CiAKICAgYXV0byBkaW1zID0gUmFuZG9tRGltczxOdW1EaW1zPigxLCAxMCk7CkBAIC0yNzQsMTAgKzI1NCw4IEBACiAgIH0gd2hpbGUgKHN0ZDo6bmV4dF9wZXJtdXRhdGlvbigmc2h1ZmZsZVswXSwgJnNodWZmbGVbMF0gKyBOdW1EaW1zKSk7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTnVtRGltcywgdHlwZW5hbWUgRGV2aWNlLCBib29sIFZlY3Rvcml6YWJsZSwKLSAgICAgICAgICBUaWxlZEV2YWx1YXRpb24gVGlsaW5nLCBpbnQgTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9leGVjdXRlX3NodWZmbGVfbHZhbHVlKERldmljZSBkKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCB0eXBlbmFtZSBEZXZpY2UsIGJvb2wgVmVjdG9yaXphYmxlLCBUaWxlZEV2YWx1YXRpb24gVGlsaW5nLCBpbnQgTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9leGVjdXRlX3NodWZmbGVfbHZhbHVlKERldmljZSBkKSB7CiAgIHN0YXRpYyBjb25zdGV4cHIgaW50IE9wdGlvbnMgPSAwIHwgTGF5b3V0OwogCiAgIGF1dG8gZGltcyA9IFJhbmRvbURpbXM8TnVtRGltcz4oNSwgMTApOwpAQCAtMzEwLDEwICsyODgsOCBAQAogICB9IHdoaWxlIChzdGQ6Om5leHRfcGVybXV0YXRpb24oJnNodWZmbGVbMF0sICZzaHVmZmxlWzBdICsgTnVtRGltcykpOwogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsCi0gICAgVGlsZWRFdmFsdWF0aW9uIFRpbGluZywgaW50IExheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfZXhlY3V0ZV9yZXNoYXBlKERldmljZSBkKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCB0eXBlbmFtZSBEZXZpY2UsIGJvb2wgVmVjdG9yaXphYmxlLCBUaWxlZEV2YWx1YXRpb24gVGlsaW5nLCBpbnQgTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9leGVjdXRlX3Jlc2hhcGUoRGV2aWNlIGQpIHsKICAgc3RhdGljX2Fzc2VydChOdW1EaW1zID49IDIsICJOdW1EaW1zIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0aGFuIDIiKTsKIAogICBzdGF0aWMgY29uc3RleHByIGludCBSZXNoYXBlZERpbXMgPSBOdW1EaW1zIC0gMTsKQEAgLTM0MCw4ICszMTYsNyBAQAogICBhdXRvIGV4cHIgPSBzcmMucmVzaGFwZShyZXNoYXBlZF9kaW1zKTsKIAogICB1c2luZyBBc3NpZ24gPSBUZW5zb3JBc3NpZ25PcDxkZWNsdHlwZShkc3QpLCBjb25zdCBkZWNsdHlwZShleHByKT47Ci0gIHVzaW5nIEV4ZWN1dG9yID0KLSAgICAgIGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERldmljZSwgVmVjdG9yaXphYmxlLCBUaWxpbmc+OworICB1c2luZyBFeGVjdXRvciA9IGludGVybmFsOjpUZW5zb3JFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERldmljZSwgVmVjdG9yaXphYmxlLCBUaWxpbmc+OwogCiAgIEV4ZWN1dG9yOjpydW4oQXNzaWduKGRzdCwgZXhwciksIGQpOwogCkBAIC0zNTAsMTAgKzMyNSw4IEBACiAgIH0KIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCB0eXBlbmFtZSBEZXZpY2UsIGJvb2wgVmVjdG9yaXphYmxlLAotICAgICAgICAgIFRpbGVkRXZhbHVhdGlvbiBUaWxpbmcsIGludCBMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2V4ZWN1dGVfc2xpY2VfcnZhbHVlKERldmljZSBkKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCB0eXBlbmFtZSBEZXZpY2UsIGJvb2wgVmVjdG9yaXphYmxlLCBUaWxlZEV2YWx1YXRpb24gVGlsaW5nLCBpbnQgTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9leGVjdXRlX3NsaWNlX3J2YWx1ZShEZXZpY2UgZCkgewogICBzdGF0aWNfYXNzZXJ0KE51bURpbXMgPj0gMiwgIk51bURpbXMgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRoYW4gMiIpOwogICBzdGF0aWMgY29uc3RleHByIGludCBPcHRpb25zID0gMCB8IExheW91dDsKIApAQCAtMzcxLDggKzM0NCw3IEBACiAgICAgc2xpY2Vfc2l6ZVtpXSA9IG51bWV4dDo6bWluaShzbGljZV9zaXplW2ldLCBkaW1zW2ldIC0gc2xpY2Vfc3RhcnRbaV0pOwogICB9CiAKLSAgVGVuc29yPFQsIE51bURpbXMsIE9wdGlvbnMsIEluZGV4PiBnb2xkZW4gPQotICAgICAgc3JjLnNsaWNlKHNsaWNlX3N0YXJ0LCBzbGljZV9zaXplKTsKKyAgVGVuc29yPFQsIE51bURpbXMsIE9wdGlvbnMsIEluZGV4PiBnb2xkZW4gPSBzcmMuc2xpY2Uoc2xpY2Vfc3RhcnQsIHNsaWNlX3NpemUpOwogCiAgIC8vIE5vdyByZXNoYXBlIHVzaW5nIGNvbmZpZ3VyZWQgdGVuc29yIGV4ZWN1dG9yLgogICBUZW5zb3I8VCwgTnVtRGltcywgT3B0aW9ucywgSW5kZXg+IGRzdChnb2xkZW4uZGltZW5zaW9ucygpKTsKQEAgLTM4MCw4ICszNTIsNyBAQAogICBhdXRvIGV4cHIgPSBzcmMuc2xpY2Uoc2xpY2Vfc3RhcnQsIHNsaWNlX3NpemUpOwogCiAgIHVzaW5nIEFzc2lnbiA9IFRlbnNvckFzc2lnbk9wPGRlY2x0eXBlKGRzdCksIGNvbnN0IGRlY2x0eXBlKGV4cHIpPjsKLSAgdXNpbmcgRXhlY3V0b3IgPQotICAgICAgaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGV2aWNlLCBWZWN0b3JpemFibGUsIFRpbGluZz47CisgIHVzaW5nIEV4ZWN1dG9yID0gaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGV2aWNlLCBWZWN0b3JpemFibGUsIFRpbGluZz47CiAKICAgRXhlY3V0b3I6OnJ1bihBc3NpZ24oZHN0LCBleHByKSwgZCk7CiAKQEAgLTM5MCwxMCArMzYxLDggQEAKICAgfQogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsCi0gICAgVGlsZWRFdmFsdWF0aW9uIFRpbGluZywgaW50IExheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfZXhlY3V0ZV9zbGljZV9sdmFsdWUoRGV2aWNlIGQpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsIFRpbGVkRXZhbHVhdGlvbiBUaWxpbmcsIGludCBMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2V4ZWN1dGVfc2xpY2VfbHZhbHVlKERldmljZSBkKSB7CiAgIHN0YXRpY19hc3NlcnQoTnVtRGltcyA+PSAyLCAiTnVtRGltcyBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiAyIik7CiAgIHN0YXRpYyBjb25zdGV4cHIgaW50IE9wdGlvbnMgPSAwIHwgTGF5b3V0OwogCkBAIC00MjMsOCArMzkyLDcgQEAKICAgYXV0byBleHByID0gZHN0LnNsaWNlKHNsaWNlX3N0YXJ0LCBzbGljZV9zaXplKTsKIAogICB1c2luZyBBc3NpZ24gPSBUZW5zb3JBc3NpZ25PcDxkZWNsdHlwZShleHByKSwgY29uc3QgZGVjbHR5cGUoc2xpY2UpPjsKLSAgdXNpbmcgRXhlY3V0b3IgPQotICAgICAgaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGV2aWNlLCBWZWN0b3JpemFibGUsIFRpbGluZz47CisgIHVzaW5nIEV4ZWN1dG9yID0gaW50ZXJuYWw6OlRlbnNvckV4ZWN1dG9yPGNvbnN0IEFzc2lnbiwgRGV2aWNlLCBWZWN0b3JpemFibGUsIFRpbGluZz47CiAKICAgRXhlY3V0b3I6OnJ1bihBc3NpZ24oZXhwciwgc2xpY2UpLCBkKTsKIApAQCAtNDMzLDEwICs0MDEsOCBAQAogICB9CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTnVtRGltcywgdHlwZW5hbWUgRGV2aWNlLCBib29sIFZlY3Rvcml6YWJsZSwKLSAgICBUaWxlZEV2YWx1YXRpb24gVGlsaW5nLCBpbnQgTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9leGVjdXRlX2Jyb2FkY2FzdGluZ19vZl9mb3JjZWRfZXZhbChEZXZpY2UgZCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTnVtRGltcywgdHlwZW5hbWUgRGV2aWNlLCBib29sIFZlY3Rvcml6YWJsZSwgVGlsZWRFdmFsdWF0aW9uIFRpbGluZywgaW50IExheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZXhlY3V0ZV9icm9hZGNhc3Rpbmdfb2ZfZm9yY2VkX2V2YWwoRGV2aWNlIGQpIHsKICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgT3B0aW9ucyA9IDAgfCBMYXlvdXQ7CiAKICAgYXV0byBkaW1zID0gUmFuZG9tRGltczxOdW1EaW1zPigxLCAxMCk7CkBAIC00NTUsOCArNDIxLDcgQEAKICAgVGVuc29yPFQsIE51bURpbXMsIE9wdGlvbnMsIEluZGV4PiBkc3QoZ29sZGVuLmRpbWVuc2lvbnMoKSk7CiAKICAgdXNpbmcgQXNzaWduID0gVGVuc29yQXNzaWduT3A8ZGVjbHR5cGUoZHN0KSwgY29uc3QgZGVjbHR5cGUoZXhwcik+OwotICB1c2luZyBFeGVjdXRvciA9Ci0gICAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2UsIFZlY3Rvcml6YWJsZSwgVGlsaW5nPjsKKyAgdXNpbmcgRXhlY3V0b3IgPSBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2UsIFZlY3Rvcml6YWJsZSwgVGlsaW5nPjsKIAogICBFeGVjdXRvcjo6cnVuKEFzc2lnbihkc3QsIGV4cHIpLCBkKTsKIApAQCAtNDY1LDEwICs0MzAsOSBAQAogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zPgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zPgogc3RydWN0IER1bW15R2VuZXJhdG9yIHsKLSAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fQUxXQVlTX0lOTElORQotICBUIG9wZXJhdG9yKCkoY29uc3QgYXJyYXkgPEluZGV4LCBOdW1EaW1zPiYgZGltcykgY29uc3QgeworICBFSUdFTl9ERVZJQ0VfRlVOQyBFSUdFTl9BTFdBWVNfSU5MSU5FIFQgb3BlcmF0b3IoKShjb25zdCBhcnJheTxJbmRleCwgTnVtRGltcz4mIGRpbXMpIGNvbnN0IHsKICAgICBUIHJlc3VsdCA9IHN0YXRpY19jYXN0PFQ+KDApOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtRGltczsgKytpKSB7CiAgICAgICByZXN1bHQgKz0gc3RhdGljX2Nhc3Q8VD4oKGkgKyAxKSAqIGRpbXNbaV0pOwpAQCAtNDc3LDEwICs0NDEsOCBAQAogICB9CiB9OwogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsCi0gICAgVGlsZWRFdmFsdWF0aW9uIFRpbGluZywgaW50IExheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfZXhlY3V0ZV9nZW5lcmF0b3Jfb3AoRGV2aWNlIGQpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsIFRpbGVkRXZhbHVhdGlvbiBUaWxpbmcsIGludCBMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2V4ZWN1dGVfZ2VuZXJhdG9yX29wKERldmljZSBkKSB7CiAgIHN0YXRpYyBjb25zdGV4cHIgaW50IE9wdGlvbnMgPSAwIHwgTGF5b3V0OwogCiAgIGF1dG8gZGltcyA9IFJhbmRvbURpbXM8TnVtRGltcz4oMjAsIDMwKTsKQEAgLTQ5OCw4ICs0NjAsNyBAQAogICBUZW5zb3I8VCwgTnVtRGltcywgT3B0aW9ucywgSW5kZXg+IGRzdChnb2xkZW4uZGltZW5zaW9ucygpKTsKIAogICB1c2luZyBBc3NpZ24gPSBUZW5zb3JBc3NpZ25PcDxkZWNsdHlwZShkc3QpLCBjb25zdCBkZWNsdHlwZShleHByKT47Ci0gIHVzaW5nIEV4ZWN1dG9yID0KLSAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2UsIFZlY3Rvcml6YWJsZSwgVGlsaW5nPjsKKyAgdXNpbmcgRXhlY3V0b3IgPSBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2UsIFZlY3Rvcml6YWJsZSwgVGlsaW5nPjsKIAogICBFeGVjdXRvcjo6cnVuKEFzc2lnbihkc3QsIGV4cHIpLCBkKTsKIApAQCAtNTA4LDE0ICs0NjksMTIgQEAKICAgfQogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsCi0gICAgVGlsZWRFdmFsdWF0aW9uIFRpbGluZywgaW50IExheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfZXhlY3V0ZV9yZXZlcnNlX3J2YWx1ZShEZXZpY2UgZCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTnVtRGltcywgdHlwZW5hbWUgRGV2aWNlLCBib29sIFZlY3Rvcml6YWJsZSwgVGlsZWRFdmFsdWF0aW9uIFRpbGluZywgaW50IExheW91dD4KK3N0YXRpYyB2b2lkIHRlc3RfZXhlY3V0ZV9yZXZlcnNlX3J2YWx1ZShEZXZpY2UgZCkgewogICBzdGF0aWMgY29uc3RleHByIGludCBPcHRpb25zID0gMCB8IExheW91dDsKIAogICBhdXRvIGRpbXMgPSBSYW5kb21EaW1zPE51bURpbXM+KDEsIG51bWV4dDo6cG93KDEwMDAwMDAuMCwgMS4wIC8gTnVtRGltcykpOwotICBUZW5zb3IgPFQsIE51bURpbXMsIE9wdGlvbnMsIEluZGV4PiBzcmMoZGltcyk7CisgIFRlbnNvcjxULCBOdW1EaW1zLCBPcHRpb25zLCBJbmRleD4gc3JjKGRpbXMpOwogICBzcmMuc2V0UmFuZG9tKCk7CiAKICAgLy8gUmV2ZXJzZSBoYWxmIG9mIHRoZSBkaW1lbnNpb25zLgpAQCAtNTI2LDE1ICs0ODUsMTQgQEAKIAogICAvLyBXZSBhc3N1bWUgdGhhdCByZXZlcnNpbmcgb24gYSBkZWZhdWx0IGRldmljZSBpcyB0ZXN0ZWQgYW5kIGNvcnJlY3QsIHNvCiAgIC8vIHdlIGNhbiByZWx5IG9uIGl0IHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiB0ZW5zb3IgZXhlY3V0b3IgYW5kIHRpbGluZy4KLSAgVGVuc29yIDxULCBOdW1EaW1zLCBPcHRpb25zLCBJbmRleD4gZ29sZGVuOworICBUZW5zb3I8VCwgTnVtRGltcywgT3B0aW9ucywgSW5kZXg+IGdvbGRlbjsKICAgZ29sZGVuID0gZXhwcjsKIAogICAvLyBOb3cgZG8gdGhlIHJldmVyc2luZyB1c2luZyBjb25maWd1cmVkIHRlbnNvciBleGVjdXRvci4KLSAgVGVuc29yIDxULCBOdW1EaW1zLCBPcHRpb25zLCBJbmRleD4gZHN0KGdvbGRlbi5kaW1lbnNpb25zKCkpOworICBUZW5zb3I8VCwgTnVtRGltcywgT3B0aW9ucywgSW5kZXg+IGRzdChnb2xkZW4uZGltZW5zaW9ucygpKTsKIAogICB1c2luZyBBc3NpZ24gPSBUZW5zb3JBc3NpZ25PcDxkZWNsdHlwZShkc3QpLCBjb25zdCBkZWNsdHlwZShleHByKT47Ci0gIHVzaW5nIEV4ZWN1dG9yID0KLSAgICBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2UsIFZlY3Rvcml6YWJsZSwgVGlsaW5nPjsKKyAgdXNpbmcgRXhlY3V0b3IgPSBpbnRlcm5hbDo6VGVuc29yRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2UsIFZlY3Rvcml6YWJsZSwgVGlsaW5nPjsKIAogICBFeGVjdXRvcjo6cnVuKEFzc2lnbihkc3QsIGV4cHIpLCBkKTsKIApAQCAtNTQzLDEwICs1MDEsOCBAQAogICB9CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTnVtRGltcywgdHlwZW5hbWUgRGV2aWNlLCBib29sIFZlY3Rvcml6YWJsZSwKLSAgICAgICAgICBUaWxlZEV2YWx1YXRpb24gVGlsaW5nLCBpbnQgTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9hc3luY19leGVjdXRlX3VuYXJ5X2V4cHIoRGV2aWNlIGQpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsIFRpbGVkRXZhbHVhdGlvbiBUaWxpbmcsIGludCBMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2FzeW5jX2V4ZWN1dGVfdW5hcnlfZXhwcihEZXZpY2UgZCkgewogICBzdGF0aWMgY29uc3RleHByIGludCBPcHRpb25zID0gMCB8IExheW91dDsKIAogICAvLyBQaWNrIGEgbGFyZ2UgZW5vdWdoIHRlbnNvciBzaXplIHRvIGJ5cGFzcyBzbWFsbCB0ZW5zb3IgYmxvY2sgZXZhbHVhdGlvbgpAQCAtNTY0LDggKzUyMCw3IEBACiAKICAgdXNpbmcgQXNzaWduID0gVGVuc29yQXNzaWduT3A8ZGVjbHR5cGUoZHN0KSwgY29uc3QgZGVjbHR5cGUoZXhwcik+OwogICB1c2luZyBEb25lQ2FsbGJhY2sgPSBkZWNsdHlwZShvbl9kb25lKTsKLSAgdXNpbmcgRXhlY3V0b3IgPSBpbnRlcm5hbDo6VGVuc29yQXN5bmNFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERldmljZSwgRG9uZUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcml6YWJsZSwgVGlsaW5nPjsKKyAgdXNpbmcgRXhlY3V0b3IgPSBpbnRlcm5hbDo6VGVuc29yQXN5bmNFeGVjdXRvcjxjb25zdCBBc3NpZ24sIERldmljZSwgRG9uZUNhbGxiYWNrLCBWZWN0b3JpemFibGUsIFRpbGluZz47CiAKICAgRXhlY3V0b3I6OnJ1bkFzeW5jKEFzc2lnbihkc3QsIGV4cHIpLCBkLCBvbl9kb25lKTsKICAgZG9uZS5XYWl0KCk7CkBAIC01NzYsMTAgKzUzMSw4IEBACiAgIH0KIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOdW1EaW1zLCB0eXBlbmFtZSBEZXZpY2UsIGJvb2wgVmVjdG9yaXphYmxlLAotICAgICAgICAgIFRpbGVkRXZhbHVhdGlvbiBUaWxpbmcsIGludCBMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2FzeW5jX2V4ZWN1dGVfYmluYXJ5X2V4cHIoRGV2aWNlIGQpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE51bURpbXMsIHR5cGVuYW1lIERldmljZSwgYm9vbCBWZWN0b3JpemFibGUsIFRpbGVkRXZhbHVhdGlvbiBUaWxpbmcsIGludCBMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X2FzeW5jX2V4ZWN1dGVfYmluYXJ5X2V4cHIoRGV2aWNlIGQpIHsKICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgT3B0aW9ucyA9IDAgfCBMYXlvdXQ7CiAKICAgLy8gUGljayBhIGxhcmdlIGVub3VnaCB0ZW5zb3Igc2l6ZSB0byBieXBhc3Mgc21hbGwgdGVuc29yIGJsb2NrIGV2YWx1YXRpb24KQEAgLTYwMCw4ICs1NTMsNyBAQAogCiAgIHVzaW5nIEFzc2lnbiA9IFRlbnNvckFzc2lnbk9wPGRlY2x0eXBlKGRzdCksIGNvbnN0IGRlY2x0eXBlKGV4cHIpPjsKICAgdXNpbmcgRG9uZUNhbGxiYWNrID0gZGVjbHR5cGUob25fZG9uZSk7Ci0gIHVzaW5nIEV4ZWN1dG9yID0gaW50ZXJuYWw6OlRlbnNvckFzeW5jRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2UsIERvbmVDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JpemFibGUsIFRpbGluZz47CisgIHVzaW5nIEV4ZWN1dG9yID0gaW50ZXJuYWw6OlRlbnNvckFzeW5jRXhlY3V0b3I8Y29uc3QgQXNzaWduLCBEZXZpY2UsIERvbmVDYWxsYmFjaywgVmVjdG9yaXphYmxlLCBUaWxpbmc+OwogCiAgIEV4ZWN1dG9yOjpydW5Bc3luYyhBc3NpZ24oZHN0LCBleHByKSwgZCwgb25fZG9uZSk7CiAgIGRvbmUuV2FpdCgpOwpAQCAtNjE1LDM5ICs1NjcsNTAgQEAKICNpZm5kZWYgRUlHRU5fRE9OVF9WRUNUT1JJWkUKICNkZWZpbmUgRUlHRU5fRE9OVF9WRUNUT1JJWkUgMAogI2VuZGlmCi0jZGVmaW5lIFZFQ1RPUklaQUJMRShULCBWQUwpICFFSUdFTl9ET05UX1ZFQ1RPUklaRSAmJiBFaWdlbjo6aW50ZXJuYWw6OnBhY2tldF90cmFpdHM8VD46OlZlY3Rvcml6YWJsZSAmJiBWQUwKKyNkZWZpbmUgVkVDVE9SSVpBQkxFKFQsIFZBTCkgIUVJR0VOX0RPTlRfVkVDVE9SSVpFJiYgRWlnZW46OmludGVybmFsOjpwYWNrZXRfdHJhaXRzPFQ+OjpWZWN0b3JpemFibGUmJiBWQUwKIAotI2RlZmluZSBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSBcCi0gIENBTExfU1VCVEVTVF8jI1BBUlQKKyNkZWZpbmUgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkgQ0FMTF9TVUJURVNUXyMjUEFSVAogCi0jZGVmaW5lIENBTExfU1VCVEVTVF9DT01CSU5BVElPTlMoUEFSVCwgTkFNRSwgVCwgTlVNX0RJTVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgRGVmYXVsdERldmljZSwgICAgZmFsc2UsICAgICAgICAgICAgICAgICAgVGlsZWRFdmFsdWF0aW9uOjpPZmYsIENvbE1ham9yPihkZWZhdWx0X2RldmljZSkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgRGVmYXVsdERldmljZSwgICAgZmFsc2UsICAgICAgICAgICAgICAgICAgVGlsZWRFdmFsdWF0aW9uOjpPbiwgIENvbE1ham9yPihkZWZhdWx0X2RldmljZSkpKTsgICAgIFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8VCwgTlVNX0RJTVMsIERlZmF1bHREZXZpY2UsICAgIFZFQ1RPUklaQUJMRShULCB0cnVlKSwgIFRpbGVkRXZhbHVhdGlvbjo6T2ZmLCBDb2xNYWpvcj4oZGVmYXVsdF9kZXZpY2UpKSk7IFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8VCwgTlVNX0RJTVMsIERlZmF1bHREZXZpY2UsICAgIFZFQ1RPUklaQUJMRShULCB0cnVlKSwgIFRpbGVkRXZhbHVhdGlvbjo6T24sICBDb2xNYWpvcj4oZGVmYXVsdF9kZXZpY2UpKSk7ICAgICBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPFQsIE5VTV9ESU1TLCBEZWZhdWx0RGV2aWNlLCAgICBmYWxzZSwgICAgICAgICAgICAgICAgICBUaWxlZEV2YWx1YXRpb246Ok9mZiwgUm93TWFqb3I+KGRlZmF1bHRfZGV2aWNlKSkpOyBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPFQsIE5VTV9ESU1TLCBEZWZhdWx0RGV2aWNlLCAgICBmYWxzZSwgICAgICAgICAgICAgICAgICBUaWxlZEV2YWx1YXRpb246Ok9uLCAgUm93TWFqb3I+KGRlZmF1bHRfZGV2aWNlKSkpOyAgICAgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgRGVmYXVsdERldmljZSwgICAgVkVDVE9SSVpBQkxFKFQsIHRydWUpLCAgVGlsZWRFdmFsdWF0aW9uOjpPZmYsIFJvd01ham9yPihkZWZhdWx0X2RldmljZSkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgRGVmYXVsdERldmljZSwgICAgVkVDVE9SSVpBQkxFKFQsIHRydWUpLCAgVGlsZWRFdmFsdWF0aW9uOjpPbiwgIFJvd01ham9yPihkZWZhdWx0X2RldmljZSkpKTsgICAgIFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8VCwgTlVNX0RJTVMsIFRocmVhZFBvb2xEZXZpY2UsIGZhbHNlLCAgICAgICAgICAgICAgICAgIFRpbGVkRXZhbHVhdGlvbjo6T2ZmLCBDb2xNYWpvcj4odHBfZGV2aWNlKSkpOyAgICAgIFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8VCwgTlVNX0RJTVMsIFRocmVhZFBvb2xEZXZpY2UsIGZhbHNlLCAgICAgICAgICAgICAgICAgIFRpbGVkRXZhbHVhdGlvbjo6T24sICBDb2xNYWpvcj4odHBfZGV2aWNlKSkpOyAgICAgICAgICBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPFQsIE5VTV9ESU1TLCBUaHJlYWRQb29sRGV2aWNlLCBWRUNUT1JJWkFCTEUoVCwgdHJ1ZSksICBUaWxlZEV2YWx1YXRpb246Ok9mZiwgQ29sTWFqb3I+KHRwX2RldmljZSkpKTsgICAgICBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPFQsIE5VTV9ESU1TLCBUaHJlYWRQb29sRGV2aWNlLCBWRUNUT1JJWkFCTEUoVCwgdHJ1ZSksICBUaWxlZEV2YWx1YXRpb246Ok9uLCAgQ29sTWFqb3I+KHRwX2RldmljZSkpKTsgICAgICAgICAgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgVGhyZWFkUG9vbERldmljZSwgZmFsc2UsICAgICAgICAgICAgICAgICAgVGlsZWRFdmFsdWF0aW9uOjpPZmYsIFJvd01ham9yPih0cF9kZXZpY2UpKSk7ICAgICAgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgVGhyZWFkUG9vbERldmljZSwgZmFsc2UsICAgICAgICAgICAgICAgICAgVGlsZWRFdmFsdWF0aW9uOjpPbiwgIFJvd01ham9yPih0cF9kZXZpY2UpKSk7ICAgICAgICAgIFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8VCwgTlVNX0RJTVMsIFRocmVhZFBvb2xEZXZpY2UsIFZFQ1RPUklaQUJMRShULCB0cnVlKSwgIFRpbGVkRXZhbHVhdGlvbjo6T2ZmLCBSb3dNYWpvcj4odHBfZGV2aWNlKSkpOyAgICAgIFwKLSAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8VCwgTlVNX0RJTVMsIFRocmVhZFBvb2xEZXZpY2UsIFZFQ1RPUklaQUJMRShULCB0cnVlKSwgIFRpbGVkRXZhbHVhdGlvbjo6T24sICBSb3dNYWpvcj4odHBfZGV2aWNlKSkpCisjZGVmaW5lIENBTExfU1VCVEVTVF9DT01CSU5BVElPTlMoUEFSVCwgTkFNRSwgVCwgTlVNX0RJTVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgRGVmYXVsdERldmljZSwgZmFsc2UsIFRpbGVkRXZhbHVhdGlvbjo6T2ZmLCBDb2xNYWpvcj4oZGVmYXVsdF9kZXZpY2UpKSk7IFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8VCwgTlVNX0RJTVMsIERlZmF1bHREZXZpY2UsIGZhbHNlLCBUaWxlZEV2YWx1YXRpb246Ok9uLCBDb2xNYWpvcj4oZGVmYXVsdF9kZXZpY2UpKSk7ICBcCisgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKE5BTUU8VCwgTlVNX0RJTVMsIERlZmF1bHREZXZpY2UsIFZFQ1RPUklaQUJMRShULCB0cnVlKSwgVGlsZWRFdmFsdWF0aW9uOjpPZmYsIENvbE1ham9yPihkZWZhdWx0X2RldmljZSkpKTsgICAgICAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTkFNRTxULCBOVU1fRElNUywgRGVmYXVsdERldmljZSwgVkVDVE9SSVpBQkxFKFQsIHRydWUpLCBUaWxlZEV2YWx1YXRpb246Ok9uLCBDb2xNYWpvcj4oZGVmYXVsdF9kZXZpY2UpKSk7ICAgICAgICAgXAorICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgRGVmYXVsdERldmljZSwgZmFsc2UsIFRpbGVkRXZhbHVhdGlvbjo6T2ZmLCBSb3dNYWpvcj4oZGVmYXVsdF9kZXZpY2UpKSk7IFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8VCwgTlVNX0RJTVMsIERlZmF1bHREZXZpY2UsIGZhbHNlLCBUaWxlZEV2YWx1YXRpb246Ok9uLCBSb3dNYWpvcj4oZGVmYXVsdF9kZXZpY2UpKSk7ICBcCisgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKE5BTUU8VCwgTlVNX0RJTVMsIERlZmF1bHREZXZpY2UsIFZFQ1RPUklaQUJMRShULCB0cnVlKSwgVGlsZWRFdmFsdWF0aW9uOjpPZmYsIFJvd01ham9yPihkZWZhdWx0X2RldmljZSkpKTsgICAgICAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTkFNRTxULCBOVU1fRElNUywgRGVmYXVsdERldmljZSwgVkVDVE9SSVpBQkxFKFQsIHRydWUpLCBUaWxlZEV2YWx1YXRpb246Ok9uLCBSb3dNYWpvcj4oZGVmYXVsdF9kZXZpY2UpKSk7ICAgICAgICAgXAorICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgVGhyZWFkUG9vbERldmljZSwgZmFsc2UsIFRpbGVkRXZhbHVhdGlvbjo6T2ZmLCBDb2xNYWpvcj4odHBfZGV2aWNlKSkpOyAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8VCwgTlVNX0RJTVMsIFRocmVhZFBvb2xEZXZpY2UsIGZhbHNlLCBUaWxlZEV2YWx1YXRpb246Ok9uLCBDb2xNYWpvcj4odHBfZGV2aWNlKSkpOyAgICBcCisgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKE5BTUU8VCwgTlVNX0RJTVMsIFRocmVhZFBvb2xEZXZpY2UsIFZFQ1RPUklaQUJMRShULCB0cnVlKSwgVGlsZWRFdmFsdWF0aW9uOjpPZmYsIENvbE1ham9yPih0cF9kZXZpY2UpKSk7ICAgICAgICAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTkFNRTxULCBOVU1fRElNUywgVGhyZWFkUG9vbERldmljZSwgVkVDVE9SSVpBQkxFKFQsIHRydWUpLCBUaWxlZEV2YWx1YXRpb246Ok9uLCBDb2xNYWpvcj4odHBfZGV2aWNlKSkpOyAgICAgICAgICAgXAorICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgVGhyZWFkUG9vbERldmljZSwgZmFsc2UsIFRpbGVkRXZhbHVhdGlvbjo6T2ZmLCBSb3dNYWpvcj4odHBfZGV2aWNlKSkpOyAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkoKE5BTUU8VCwgTlVNX0RJTVMsIFRocmVhZFBvb2xEZXZpY2UsIGZhbHNlLCBUaWxlZEV2YWx1YXRpb246Ok9uLCBSb3dNYWpvcj4odHBfZGV2aWNlKSkpOyAgICBcCisgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKE5BTUU8VCwgTlVNX0RJTVMsIFRocmVhZFBvb2xEZXZpY2UsIFZFQ1RPUklaQUJMRShULCB0cnVlKSwgVGlsZWRFdmFsdWF0aW9uOjpPZmYsIFJvd01ham9yPih0cF9kZXZpY2UpKSk7ICAgICAgICAgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoTkFNRTxULCBOVU1fRElNUywgVGhyZWFkUG9vbERldmljZSwgVkVDVE9SSVpBQkxFKFQsIHRydWUpLCBUaWxlZEV2YWx1YXRpb246Ok9uLCBSb3dNYWpvcj4odHBfZGV2aWNlKSkpCiAKIC8vIE5PVEU6IEN1cnJlbnRseSBvbmx5IFRocmVhZFBvb2xEZXZpY2Ugc3VwcG9ydHMgYXN5bmMgZXhwcmVzc2lvbiBldmFsdWF0aW9uLgotI2RlZmluZSBDQUxMX0FTWU5DX1NVQlRFU1RfQ09NQklOQVRJT05TKFBBUlQsIE5BTUUsIFQsIE5VTV9ESU1TKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPFQsIE5VTV9ESU1TLCBUaHJlYWRQb29sRGV2aWNlLCBmYWxzZSwgICAgICAgICAgICAgICAgICBUaWxlZEV2YWx1YXRpb246Ok9mZiwgQ29sTWFqb3I+KHRwX2RldmljZSkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgVGhyZWFkUG9vbERldmljZSwgZmFsc2UsICAgICAgICAgICAgICAgICAgVGlsZWRFdmFsdWF0aW9uOjpPbiwgIENvbE1ham9yPih0cF9kZXZpY2UpKSk7ICAgICBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPFQsIE5VTV9ESU1TLCBUaHJlYWRQb29sRGV2aWNlLCBWRUNUT1JJWkFCTEUoVCwgdHJ1ZSksICBUaWxlZEV2YWx1YXRpb246Ok9mZiwgQ29sTWFqb3I+KHRwX2RldmljZSkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgVGhyZWFkUG9vbERldmljZSwgVkVDVE9SSVpBQkxFKFQsIHRydWUpLCAgVGlsZWRFdmFsdWF0aW9uOjpPbiwgIENvbE1ham9yPih0cF9kZXZpY2UpKSk7ICAgICBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPFQsIE5VTV9ESU1TLCBUaHJlYWRQb29sRGV2aWNlLCBmYWxzZSwgICAgICAgICAgICAgICAgICBUaWxlZEV2YWx1YXRpb246Ok9mZiwgUm93TWFqb3I+KHRwX2RldmljZSkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgVGhyZWFkUG9vbERldmljZSwgZmFsc2UsICAgICAgICAgICAgICAgICAgVGlsZWRFdmFsdWF0aW9uOjpPbiwgIFJvd01ham9yPih0cF9kZXZpY2UpKSk7ICAgICBcCi0gIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPFQsIE5VTV9ESU1TLCBUaHJlYWRQb29sRGV2aWNlLCBWRUNUT1JJWkFCTEUoVCwgdHJ1ZSksICBUaWxlZEV2YWx1YXRpb246Ok9mZiwgUm93TWFqb3I+KHRwX2RldmljZSkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgVGhyZWFkUG9vbERldmljZSwgVkVDVE9SSVpBQkxFKFQsIHRydWUpLCAgVGlsZWRFdmFsdWF0aW9uOjpPbiwgIFJvd01ham9yPih0cF9kZXZpY2UpKSkKKyNkZWZpbmUgQ0FMTF9BU1lOQ19TVUJURVNUX0NPTUJJTkFUSU9OUyhQQVJULCBOQU1FLCBULCBOVU1fRElNUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgVGhyZWFkUG9vbERldmljZSwgZmFsc2UsIFRpbGVkRXZhbHVhdGlvbjo6T2ZmLCBDb2xNYWpvcj4odHBfZGV2aWNlKSkpOyBcCisgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPFQsIE5VTV9ESU1TLCBUaHJlYWRQb29sRGV2aWNlLCBmYWxzZSwgVGlsZWRFdmFsdWF0aW9uOjpPbiwgQ29sTWFqb3I+KHRwX2RldmljZSkpKTsgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKE5BTUU8VCwgTlVNX0RJTVMsIFRocmVhZFBvb2xEZXZpY2UsIFZFQ1RPUklaQUJMRShULCB0cnVlKSwgVGlsZWRFdmFsdWF0aW9uOjpPZmYsIENvbE1ham9yPih0cF9kZXZpY2UpKSk7ICAgICAgICBcCisgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChOQU1FPFQsIE5VTV9ESU1TLCBUaHJlYWRQb29sRGV2aWNlLCBWRUNUT1JJWkFCTEUoVCwgdHJ1ZSksIFRpbGVkRXZhbHVhdGlvbjo6T24sIENvbE1ham9yPih0cF9kZXZpY2UpKSk7ICAgICAgICAgXAorICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxULCBOVU1fRElNUywgVGhyZWFkUG9vbERldmljZSwgZmFsc2UsIFRpbGVkRXZhbHVhdGlvbjo6T2ZmLCBSb3dNYWpvcj4odHBfZGV2aWNlKSkpOyBcCisgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPFQsIE5VTV9ESU1TLCBUaHJlYWRQb29sRGV2aWNlLCBmYWxzZSwgVGlsZWRFdmFsdWF0aW9uOjpPbiwgUm93TWFqb3I+KHRwX2RldmljZSkpKTsgIFwKKyAgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKE5BTUU8VCwgTlVNX0RJTVMsIFRocmVhZFBvb2xEZXZpY2UsIFZFQ1RPUklaQUJMRShULCB0cnVlKSwgVGlsZWRFdmFsdWF0aW9uOjpPZmYsIFJvd01ham9yPih0cF9kZXZpY2UpKSk7ICAgICAgICBcCisgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChOQU1FPFQsIE5VTV9ESU1TLCBUaHJlYWRQb29sRGV2aWNlLCBWRUNUT1JJWkFCTEUoVCwgdHJ1ZSksIFRpbGVkRXZhbHVhdGlvbjo6T24sIFJvd01ham9yPih0cF9kZXZpY2UpKSkKIAogRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9leGVjdXRvcikgewogICBFaWdlbjo6RGVmYXVsdERldmljZSBkZWZhdWx0X2RldmljZTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2V4cHIuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZXhwci5jcHAKaW5kZXggYzc2ZmJjNS4uZmMyMzVkNSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZXhwci5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZXhwci5jcHAKQEAgLTEzLDIwICsxMywyNSBAQAogCiAjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgogCi11c2luZyBFaWdlbjo6VGVuc29yOwogdXNpbmcgRWlnZW46OlJvd01ham9yOwordXNpbmcgRWlnZW46OlRlbnNvcjsKIAotc3RhdGljIHZvaWQgdGVzdF8xZCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0XzFkKCkgewogICBUZW5zb3I8ZmxvYXQsIDE+IHZlYzEoNik7CiAgIFRlbnNvcjxmbG9hdCwgMSwgUm93TWFqb3I+IHZlYzIoNik7CiAKLSAgdmVjMSgwKSA9IDQuMDsgIHZlYzIoMCkgPSAwLjA7Ci0gIHZlYzEoMSkgPSA4LjA7ICB2ZWMyKDEpID0gMS4wOwotICB2ZWMxKDIpID0gMTUuMDsgdmVjMigyKSA9IDIuMDsKLSAgdmVjMSgzKSA9IDE2LjA7IHZlYzIoMykgPSAzLjA7Ci0gIHZlYzEoNCkgPSAyMy4wOyB2ZWMyKDQpID0gNC4wOwotICB2ZWMxKDUpID0gNDIuMDsgdmVjMig1KSA9IDUuMDsKKyAgdmVjMSgwKSA9IDQuMDsKKyAgdmVjMigwKSA9IDAuMDsKKyAgdmVjMSgxKSA9IDguMDsKKyAgdmVjMigxKSA9IDEuMDsKKyAgdmVjMSgyKSA9IDE1LjA7CisgIHZlYzIoMikgPSAyLjA7CisgIHZlYzEoMykgPSAxNi4wOworICB2ZWMyKDMpID0gMy4wOworICB2ZWMxKDQpID0gMjMuMDsKKyAgdmVjMig0KSA9IDQuMDsKKyAgdmVjMSg1KSA9IDQyLjA7CisgIHZlYzIoNSkgPSA1LjA7CiAKICAgZmxvYXQgZGF0YTNbNl07CiAgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDE+PiB2ZWMzKGRhdGEzLCA2KTsKQEAgLTY4LDExMiArNzMsMTA5IEBACiAgIFZFUklGWV9JU19BUFBST1godmVjMyg1KSwgNDIuMGYgKyA1LjBmKTsKIH0KIAotc3RhdGljIHZvaWQgdGVzdF8yZCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0XzJkKCkgewogICBmbG9hdCBkYXRhMVs2XTsKICAgVGVuc29yTWFwPFRlbnNvcjxmbG9hdCwgMj4+IG1hdDEoZGF0YTEsIDIsIDMpOwogICBmbG9hdCBkYXRhMls2XTsKICAgVGVuc29yTWFwPFRlbnNvcjxmbG9hdCwgMiwgUm93TWFqb3I+PiBtYXQyKGRhdGEyLCAyLCAzKTsKIAotICBtYXQxKDAsMCkgPSAwLjA7Ci0gIG1hdDEoMCwxKSA9IDEuMDsKLSAgbWF0MSgwLDIpID0gMi4wOwotICBtYXQxKDEsMCkgPSAzLjA7Ci0gIG1hdDEoMSwxKSA9IDQuMDsKLSAgbWF0MSgxLDIpID0gNS4wOworICBtYXQxKDAsIDApID0gMC4wOworICBtYXQxKDAsIDEpID0gMS4wOworICBtYXQxKDAsIDIpID0gMi4wOworICBtYXQxKDEsIDApID0gMy4wOworICBtYXQxKDEsIDEpID0gNC4wOworICBtYXQxKDEsIDIpID0gNS4wOwogCi0gIG1hdDIoMCwwKSA9IC0wLjA7Ci0gIG1hdDIoMCwxKSA9IC0xLjA7Ci0gIG1hdDIoMCwyKSA9IC0yLjA7Ci0gIG1hdDIoMSwwKSA9IC0zLjA7Ci0gIG1hdDIoMSwxKSA9IC00LjA7Ci0gIG1hdDIoMSwyKSA9IC01LjA7CisgIG1hdDIoMCwgMCkgPSAtMC4wOworICBtYXQyKDAsIDEpID0gLTEuMDsKKyAgbWF0MigwLCAyKSA9IC0yLjA7CisgIG1hdDIoMSwgMCkgPSAtMy4wOworICBtYXQyKDEsIDEpID0gLTQuMDsKKyAgbWF0MigxLCAyKSA9IC01LjA7CiAKLSAgVGVuc29yPGZsb2F0LCAyPiBtYXQzKDIsMyk7Ci0gIFRlbnNvcjxmbG9hdCwgMiwgUm93TWFqb3I+IG1hdDQoMiwzKTsKKyAgVGVuc29yPGZsb2F0LCAyPiBtYXQzKDIsIDMpOworICBUZW5zb3I8ZmxvYXQsIDIsIFJvd01ham9yPiBtYXQ0KDIsIDMpOwogICBtYXQzID0gbWF0MS5hYnMoKTsKICAgbWF0NCA9IG1hdDIuYWJzKCk7CiAKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsMCksIDAuMGYpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwxKSwgMS4wZik7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygwLDIpLCAyLjBmKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsMCksIDMuMGYpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwxKSwgNC4wZik7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygxLDIpLCA1LjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsIDApLCAwLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsIDEpLCAxLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsIDIpLCAyLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsIDApLCAzLjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsIDEpLCA0LjBmKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsIDIpLCA1LjBmKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMCwwKSwgMC4wZik7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0NCgwLDEpLCAxLjBmKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDAsMiksIDIuMGYpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMSwwKSwgMy4wZik7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0NCgxLDEpLCA0LjBmKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDEsMiksIDUuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMCwgMCksIDAuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMCwgMSksIDEuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMCwgMiksIDIuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMSwgMCksIDMuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMSwgMSksIDQuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMSwgMiksIDUuMGYpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0XzNkKCkKLXsKLSAgVGVuc29yPGZsb2F0LCAzPiBtYXQxKDIsMyw3KTsKLSAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gbWF0MigyLDMsNyk7CitzdGF0aWMgdm9pZCB0ZXN0XzNkKCkgeworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDEoMiwgMywgNyk7CisgIFRlbnNvcjxmbG9hdCwgMywgUm93TWFqb3I+IG1hdDIoMiwgMywgNyk7CiAKICAgZmxvYXQgdmFsID0gMS4wZjsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKLSAgICAgICAgbWF0MShpLGosaykgPSB2YWw7Ci0gICAgICAgIG1hdDIoaSxqLGspID0gdmFsOworICAgICAgICBtYXQxKGksIGosIGspID0gdmFsOworICAgICAgICBtYXQyKGksIGosIGspID0gdmFsOwogICAgICAgICB2YWwgKz0gMS4wZjsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDMoMiwzLDcpOworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDMoMiwgMywgNyk7CiAgIG1hdDMgPSBtYXQxICsgbWF0MTsKLSAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gbWF0NCgyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMywgUm93TWFqb3I+IG1hdDQoMiwgMywgNyk7CiAgIG1hdDQgPSBtYXQyICogMy4xNGY7Ci0gIFRlbnNvcjxmbG9hdCwgMz4gbWF0NSgyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0NSgyLCAzLCA3KTsKICAgbWF0NSA9IChtYXQxICsgbWF0MS5jb25zdGFudCgxKSkuaW52ZXJzZSgpLmxvZygpOwotICBUZW5zb3I8ZmxvYXQsIDMsIFJvd01ham9yPiBtYXQ2KDIsMyw3KTsKKyAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gbWF0NigyLCAzLCA3KTsKICAgbWF0NiA9IG1hdDIucG93KDAuNWYpICogMy4xNGY7Ci0gIFRlbnNvcjxmbG9hdCwgMz4gbWF0NygyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0NygyLCAzLCA3KTsKICAgbWF0NyA9IG1hdDEuY3dpc2VNYXgobWF0NSAqIDIuMGYpLmV4cCgpOwotICBUZW5zb3I8ZmxvYXQsIDMsIFJvd01ham9yPiBtYXQ4KDIsMyw3KTsKKyAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gbWF0OCgyLCAzLCA3KTsKICAgbWF0OCA9ICgtbWF0MikuZXhwKCkgKiAzLjE0ZjsKLSAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gbWF0OSgyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMywgUm93TWFqb3I+IG1hdDkoMiwgMywgNyk7CiAgIG1hdDkgPSBtYXQyICsgMy4xNGY7Ci0gIFRlbnNvcjxmbG9hdCwgMywgUm93TWFqb3I+IG1hdDEwKDIsMyw3KTsKKyAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gbWF0MTAoMiwgMywgNyk7CiAgIG1hdDEwID0gbWF0MiAtIDMuMTRmOwotICBUZW5zb3I8ZmxvYXQsIDMsIFJvd01ham9yPiBtYXQxMSgyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMywgUm93TWFqb3I+IG1hdDExKDIsIDMsIDcpOwogICBtYXQxMSA9IG1hdDIgLyAzLjE0ZjsKIAogICB2YWwgPSAxLjBmOwogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoaSxqLGspLCB2YWwgKyB2YWwpOwotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoaSxqLGspLCB2YWwgKiAzLjE0Zik7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0NShpLGosayksIGxvZ2YoMS4wZi8odmFsICsgMSkpKTsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQ2KGksaixrKSwgc3FydGYodmFsKSAqIDMuMTRmKTsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQ3KGksaixrKSwgZXhwZigoc3RkOjptYXgpKHZhbCwgbWF0NShpLGosaykgKiAyLjBmKSkpOwotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDgoaSxqLGspLCBleHBmKC12YWwpICogMy4xNGYpOwotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDkoaSxqLGspLCB2YWwgKyAzLjE0Zik7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MTAoaSxqLGspLCB2YWwgLSAzLjE0Zik7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MTEoaSxqLGspLCB2YWwgLyAzLjE0Zik7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MyhpLCBqLCBrKSwgdmFsICsgdmFsKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KGksIGosIGspLCB2YWwgKiAzLjE0Zik7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0NShpLCBqLCBrKSwgbG9nZigxLjBmIC8gKHZhbCArIDEpKSk7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0NihpLCBqLCBrKSwgc3FydGYodmFsKSAqIDMuMTRmKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQ3KGksIGosIGspLCBleHBmKChzdGQ6Om1heCkodmFsLCBtYXQ1KGksIGosIGspICogMi4wZikpKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQ4KGksIGosIGspLCBleHBmKC12YWwpICogMy4xNGYpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDkoaSwgaiwgayksIHZhbCArIDMuMTRmKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQxMChpLCBqLCBrKSwgdmFsIC0gMy4xNGYpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDExKGksIGosIGspLCB2YWwgLyAzLjE0Zik7CiAgICAgICAgIHZhbCArPSAxLjBmOwogICAgICAgfQogICAgIH0KICAgfQogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X2NvbnN0YW50cygpCi17Ci0gIFRlbnNvcjxmbG9hdCwgMz4gbWF0MSgyLDMsNyk7Ci0gIFRlbnNvcjxmbG9hdCwgMz4gbWF0MigyLDMsNyk7Ci0gIFRlbnNvcjxmbG9hdCwgMz4gbWF0MygyLDMsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X2NvbnN0YW50cygpIHsKKyAgVGVuc29yPGZsb2F0LCAzPiBtYXQxKDIsIDMsIDcpOworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDIoMiwgMywgNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MygyLCAzLCA3KTsKIAogICBmbG9hdCB2YWwgPSAxLjBmOwogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBtYXQxKGksaixrKSA9IHZhbDsKKyAgICAgICAgbWF0MShpLCBqLCBrKSA9IHZhbDsKICAgICAgICAgdmFsICs9IDEuMGY7CiAgICAgICB9CiAgICAgfQpAQCAtMTg1LDE2ICsxODcsMTUgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQyKGksaixrKSwgMy4xNGYpOwotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoaSxqLGspLCBleHBmKChzdGQ6Om1heCkodmFsLCA3LjNmKSkpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDIoaSwgaiwgayksIDMuMTRmKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKGksIGosIGspLCBleHBmKChzdGQ6Om1heCkodmFsLCA3LjNmKSkpOwogICAgICAgICB2YWwgKz0gMS4wZjsKICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotc3RhdGljIHZvaWQgdGVzdF9ib29sZWFuKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfYm9vbGVhbigpIHsKICAgY29uc3QgaW50IGtTaXplID0gMzE7CiAgIFRlbnNvcjxpbnQsIDE+IHZlYyhrU2l6ZSk7CiAgIHN0ZDo6aW90YSh2ZWMuZGF0YSgpLCB2ZWMuZGF0YSgpICsga1NpemUsIDApOwpAQCAtMjIxLDE3ICsyMjIsMTYgQEAKICAgYm9vbDMgPSAodmVjIDwgdmVjLmNvbnN0YW50KDQpKS5jYXN0PGJvb2w+KCkgJiYgYm9vbDI7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfZnVuY3RvcnMoKQotewotICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDEoMiwzLDcpOwotICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDIoMiwzLDcpOwotICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDMoMiwzLDcpOworc3RhdGljIHZvaWQgdGVzdF9mdW5jdG9ycygpIHsKKyAgVGVuc29yPGZsb2F0LCAzPiBtYXQxKDIsIDMsIDcpOworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDIoMiwgMywgNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MygyLCAzLCA3KTsKIAogICBmbG9hdCB2YWwgPSAxLjBmOwogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBtYXQxKGksaixrKSA9IHZhbDsKKyAgICAgICAgbWF0MShpLCBqLCBrKSA9IHZhbDsKICAgICAgICAgdmFsICs9IDEuMGY7CiAgICAgICB9CiAgICAgfQpAQCAtMjQzLDE5ICsyNDMsMTggQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQyKGksaixrKSwgYXNpbmYoMS4wZiAvIG1hdDEoaSxqLGspKSk7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MyhpLGosayksIHRhbmhmKG1hdDEoaSxqLGspKSk7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MihpLCBqLCBrKSwgYXNpbmYoMS4wZiAvIG1hdDEoaSwgaiwgaykpKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKGksIGosIGspLCB0YW5oZihtYXQxKGksIGosIGspKSk7CiAgICAgICAgIHZhbCArPSAxLjBmOwogICAgICAgfQogICAgIH0KICAgfQogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X3R5cGVfY2FzdGluZygpCi17Ci0gIFRlbnNvcjxib29sLCAzPiBtYXQxKDIsMyw3KTsKLSAgVGVuc29yPGZsb2F0LCAzPiBtYXQyKDIsMyw3KTsKLSAgVGVuc29yPGRvdWJsZSwgMz4gbWF0MygyLDMsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X3R5cGVfY2FzdGluZygpIHsKKyAgVGVuc29yPGJvb2wsIDM+IG1hdDEoMiwgMywgNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MigyLCAzLCA3KTsKKyAgVGVuc29yPGRvdWJsZSwgMz4gbWF0MygyLCAzLCA3KTsKICAgbWF0MS5zZXRSYW5kb20oKTsKICAgbWF0Mi5zZXRSYW5kb20oKTsKIApAQCAtMjYzLDcgKzI2Miw3IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MyhpLGosayksIG1hdDEoaSxqLGspID8gMS4wIDogMC4wKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKGksIGosIGspLCBtYXQxKGksIGosIGspID8gMS4wIDogMC4wKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTI3MiwyMCArMjcxLDE5IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MyhpLGosayksIHN0YXRpY19jYXN0PGRvdWJsZT4obWF0MihpLGosaykpKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKGksIGosIGspLCBzdGF0aWNfY2FzdDxkb3VibGU+KG1hdDIoaSwgaiwgaykpKTsKICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotc3RhdGljIHZvaWQgdGVzdF9zZWxlY3QoKQoteworc3RhdGljIHZvaWQgdGVzdF9zZWxlY3QoKSB7CiAgIHVzaW5nIFR5cGVkR1RPcCA9IGludGVybmFsOjpzY2FsYXJfY21wX29wPGZsb2F0LCBmbG9hdCwgaW50ZXJuYWw6OmNtcF9HVCwgdHJ1ZT47CiAKLSAgVGVuc29yPGZsb2F0LCAzPiBzZWxlY3RvcigyLDMsNyk7Ci0gIFRlbnNvcjxmbG9hdCwgMz4gbWF0MSgyLDMsNyk7Ci0gIFRlbnNvcjxmbG9hdCwgMz4gbWF0MigyLDMsNyk7Ci0gIFRlbnNvcjxmbG9hdCwgMz4gcmVzdWx0KDIsMyw3KTsKKyAgVGVuc29yPGZsb2F0LCAzPiBzZWxlY3RvcigyLCAzLCA3KTsKKyAgVGVuc29yPGZsb2F0LCAzPiBtYXQxKDIsIDMsIDcpOworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDIoMiwgMywgNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gcmVzdWx0KDIsIDMsIDcpOwogCiAgIHNlbGVjdG9yLnNldFJhbmRvbSgpOwogICBtYXQxLnNldFJhbmRvbSgpOwpAQCAtMjk3LDcgKzI5NSw3IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KGksaixrKSwgKHNlbGVjdG9yKGksaixrKSA+IDAuNWYpID8gbWF0MShpLGosaykgOiBtYXQyKGksaixrKSk7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gocmVzdWx0KGksIGosIGspLCAoc2VsZWN0b3IoaSwgaiwgaykgPiAwLjVmKSA/IG1hdDEoaSwgaiwgaykgOiBtYXQyKGksIGosIGspKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTMxMiw3ICszMTAsNiBAQAogICAgICAgfQogICAgIH0KICAgfQotCiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CkBAIC0zMjcsNyArMzI0LDcgQEAKICAgICB2ZWNfZnVsbF9uYW4uc2V0Q29uc3RhbnQoa05hTik7CiAgICAgdmVjX3plcm8uc2V0WmVybygpOwogICAgIHZlY19vbmVfbmFuLnNldFplcm8oKTsKLSAgICB2ZWNfb25lX25hbihzaXplLzIpID0ga05hTjsKKyAgICB2ZWNfb25lX25hbihzaXplIC8gMikgPSBrTmFOOwogCiAgICAgYXV0byB2ZXJpZnlfYWxsX25hbiA9IFsmXShjb25zdCBUZW5zb3I8U2NhbGFyLCAxPiYgdikgewogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKQEAgLTQzNCw4ICs0MzEsNyBAQAogICB9CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfY2xpcCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X2NsaXAoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMT4gdmVjKDYpOwogICB2ZWMoMCkgPSA0LjA7CiAgIHZlYygxKSA9IDguMDsKQEAgLTQ1NCwxNCArNDUwLDEyIEBACiAgIH0KIH0KIAotc3RhdGljIHZvaWQgdGVzdF9taW5tYXhfbmFuX3Byb3BhZ2F0aW9uKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfbWlubWF4X25hbl9wcm9wYWdhdGlvbigpIHsKICAgdGVzdF9taW5tYXhfbmFuX3Byb3BhZ2F0aW9uX3RlbXBsPGZsb2F0PigpOwogICB0ZXN0X21pbm1heF9uYW5fcHJvcGFnYXRpb25fdGVtcGw8ZG91YmxlPigpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2V4cHIpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2V4cHIpIHsKICAgQ0FMTF9TVUJURVNUKHRlc3RfMWQoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0XzJkKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF8zZCgpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ZmdC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9mZnQuY3BwCmluZGV4IGZmOGViY2YuLjcwYmJhMmUgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ZmdC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZmZ0LmNwcApAQCAtMjgsMTMgKzI4LDEzIEBACiAKICAgVGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDIsIERhdGFMYXlvdXQ+IG91dHB1dCA9IGlucHV0LnRlbXBsYXRlIGZmdDxFaWdlbjo6Qm90aFBhcnRzLCBFaWdlbjo6RkZUX0ZPUldBUkQ+KGZmdCk7CiAKLSAgc3RkOjpjb21wbGV4PGZsb2F0PiBvdXRwdXRfZ29sZGVuWzZdOyAvLyBpbiBDb2xNYWpvciBvcmRlcgorICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IG91dHB1dF9nb2xkZW5bNl07ICAvLyBpbiBDb2xNYWpvciBvcmRlcgogICBvdXRwdXRfZ29sZGVuWzBdID0gc3RkOjpjb21wbGV4PGZsb2F0PigyMSwgMCk7CiAgIG91dHB1dF9nb2xkZW5bMV0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KC05LCAwKTsKICAgb3V0cHV0X2dvbGRlblsyXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oLTMsIDEuNzMyMDUpOwotICBvdXRwdXRfZ29sZGVuWzNdID0gc3RkOjpjb21wbGV4PGZsb2F0PiggMCwgMCk7CisgIG91dHB1dF9nb2xkZW5bM10gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KDAsIDApOwogICBvdXRwdXRfZ29sZGVuWzRdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMywgLTEuNzMyMDUpOwotICBvdXRwdXRfZ29sZGVuWzVdID0gc3RkOjpjb21wbGV4PGZsb2F0PigwICwwKTsKKyAgb3V0cHV0X2dvbGRlbls1XSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oMCwgMCk7CiAKICAgc3RkOjpjb21wbGV4PGZsb2F0PiBjX29mZnNldCA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oMS4wLCAxLjApOwogCkBAIC00NSwxNCArNDUsMTMgQEAKICAgICBWRVJJRllfSVNfQVBQUk9YKG91dHB1dCgzKSArIGNfb2Zmc2V0LCBvdXRwdXRfZ29sZGVuWzNdICsgY19vZmZzZXQpOwogICAgIFZFUklGWV9JU19BUFBST1gob3V0cHV0KDQpICsgY19vZmZzZXQsIG91dHB1dF9nb2xkZW5bNF0gKyBjX29mZnNldCk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXRwdXQoNSkgKyBjX29mZnNldCwgb3V0cHV0X2dvbGRlbls1XSArIGNfb2Zmc2V0KTsKLSAgfQotICBlbHNlIHsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG91dHB1dCgwKSsgY19vZmZzZXQsIG91dHB1dF9nb2xkZW5bMF0rIGNfb2Zmc2V0KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG91dHB1dCgxKSsgY19vZmZzZXQsIG91dHB1dF9nb2xkZW5bMl0rIGNfb2Zmc2V0KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG91dHB1dCgyKSsgY19vZmZzZXQsIG91dHB1dF9nb2xkZW5bNF0rIGNfb2Zmc2V0KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG91dHB1dCgzKSsgY19vZmZzZXQsIG91dHB1dF9nb2xkZW5bMV0rIGNfb2Zmc2V0KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG91dHB1dCg0KSsgY19vZmZzZXQsIG91dHB1dF9nb2xkZW5bM10rIGNfb2Zmc2V0KTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKG91dHB1dCg1KSsgY19vZmZzZXQsIG91dHB1dF9nb2xkZW5bNV0rIGNfb2Zmc2V0KTsKKyAgfSBlbHNlIHsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG91dHB1dCgwKSArIGNfb2Zmc2V0LCBvdXRwdXRfZ29sZGVuWzBdICsgY19vZmZzZXQpOworICAgIFZFUklGWV9JU19BUFBST1gob3V0cHV0KDEpICsgY19vZmZzZXQsIG91dHB1dF9nb2xkZW5bMl0gKyBjX29mZnNldCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChvdXRwdXQoMikgKyBjX29mZnNldCwgb3V0cHV0X2dvbGRlbls0XSArIGNfb2Zmc2V0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG91dHB1dCgzKSArIGNfb2Zmc2V0LCBvdXRwdXRfZ29sZGVuWzFdICsgY19vZmZzZXQpOworICAgIFZFUklGWV9JU19BUFBST1gob3V0cHV0KDQpICsgY19vZmZzZXQsIG91dHB1dF9nb2xkZW5bM10gKyBjX29mZnNldCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChvdXRwdXQoNSkgKyBjX29mZnNldCwgb3V0cHV0X2dvbGRlbls1XSArIGNfb2Zmc2V0KTsKICAgfQogfQogCkBAIC04OCwyNSArODcsMjUgQEAKICAgc3RkOjpjb21wbGV4PGZsb2F0PiBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbNV07CiAgIHN0ZDo6Y29tcGxleDxmbG9hdD4gcmV2ZXJzZV9nb2xkZW5fcmVzdWx0WzVdOwogCi0gIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFswXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oMTUuMDAwMDAwMDAwMDAwMDAwLCsxNS4wMDAwMDAwMDAwMDAwMDApOworICBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbMF0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KDE1LjAwMDAwMDAwMDAwMDAwMCwgKzE1LjAwMDAwMDAwMDAwMDAwMCk7CiAgIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFsxXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oLTUuOTQwOTU0ODAxMTc3OTM1LCArMC45NDA5NTQ4MDExNzc5MzQpOwogICBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbMl0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KC0zLjMxMjI5OTI0MDU4MjI2NiwgLTEuNjg3NzAwNzU5NDE3NzM1KTsKICAgZm9yd2FyZF9nb2xkZW5fcmVzdWx0WzNdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMS42ODc3MDA3NTk0MTc3MzUsIC0zLjMxMjI5OTI0MDU4MjI2Nik7Ci0gIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFs0XSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oIDAuOTQwOTU0ODAxMTc3OTM0LCAtNS45NDA5NTQ4MDExNzc5MzUpOworICBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbNF0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KDAuOTQwOTU0ODAxMTc3OTM0LCAtNS45NDA5NTQ4MDExNzc5MzUpOwogCi0gIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFswXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oIDMuMDAwMDAwMDAwMDAwMDAwLCArIDMuMDAwMDAwMDAwMDAwMDAwKTsKLSAgcmV2ZXJzZV9nb2xkZW5fcmVzdWx0WzFdID0gc3RkOjpjb21wbGV4PGZsb2F0PiggMC4xODgxOTA5NjAyMzU1ODcsIC0gMS4xODgxOTA5NjAyMzU1ODcpOwotICByZXZlcnNlX2dvbGRlbl9yZXN1bHRbMl0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KC0wLjMzNzU0MDE1MTg4MzU0NywgLSAwLjY2MjQ1OTg0ODExNjQ1Myk7Ci0gIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFszXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oLTAuNjYyNDU5ODQ4MTE2NDUzLCAtIDAuMzM3NTQwMTUxODgzNTQ3KTsKLSAgcmV2ZXJzZV9nb2xkZW5fcmVzdWx0WzRdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMS4xODgxOTA5NjAyMzU1ODcsICsgMC4xODgxOTA5NjAyMzU1ODcpOworICByZXZlcnNlX2dvbGRlbl9yZXN1bHRbMF0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KDMuMDAwMDAwMDAwMDAwMDAwLCArMy4wMDAwMDAwMDAwMDAwMDApOworICByZXZlcnNlX2dvbGRlbl9yZXN1bHRbMV0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KDAuMTg4MTkwOTYwMjM1NTg3LCAtMS4xODgxOTA5NjAyMzU1ODcpOworICByZXZlcnNlX2dvbGRlbl9yZXN1bHRbMl0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KC0wLjMzNzU0MDE1MTg4MzU0NywgLTAuNjYyNDU5ODQ4MTE2NDUzKTsKKyAgcmV2ZXJzZV9nb2xkZW5fcmVzdWx0WzNdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMC42NjI0NTk4NDgxMTY0NTMsIC0wLjMzNzU0MDE1MTg4MzU0Nyk7CisgIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFs0XSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oLTEuMTg4MTkwOTYwMjM1NTg3LCArMC4xODgxOTA5NjAyMzU1ODcpOwogCi0gIGZvcihpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKICAgICBWRVJJRllfSVNfQVBQUk9YKGZvcndhcmRfb3V0cHV0X2JvdGhfcGFydHMoaSksIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFtpXSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChmb3J3YXJkX291dHB1dF9yZWFsX3BhcnQoaSksIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFtpXS5yZWFsKCkpOwogICAgIFZFUklGWV9JU19BUFBST1goZm9yd2FyZF9vdXRwdXRfaW1hZ19wYXJ0KGkpLCBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbaV0uaW1hZygpKTsKICAgfQogCi0gIGZvcihpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKICAgICBWRVJJRllfSVNfQVBQUk9YKHJldmVyc2Vfb3V0cHV0X2JvdGhfcGFydHMoaSksIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFtpXSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXZlcnNlX291dHB1dF9yZWFsX3BhcnQoaSksIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFtpXS5yZWFsKCkpOwogICAgIFZFUklGWV9JU19BUFBST1gocmV2ZXJzZV9vdXRwdXRfaW1hZ19wYXJ0KGkpLCByZXZlcnNlX2dvbGRlbl9yZXN1bHRbaV0uaW1hZygpKTsKQEAgLTE0NSwxNCArMTQ0LDEzIEBACiAgIHN0ZDo6Y29tcGxleDxmbG9hdD4gZm9yd2FyZF9nb2xkZW5fcmVzdWx0WzVdOwogICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IHJldmVyc2VfZ29sZGVuX3Jlc3VsdFs1XTsKIAotCi0gIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFswXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oICAxNSwgMCk7CisgIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFswXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oMTUsIDApOwogICBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbMV0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KC0yLjUsICszLjQ0MDk1NDgwMTE3NzkzKTsKICAgZm9yd2FyZF9nb2xkZW5fcmVzdWx0WzJdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMi41LCArMC44MTIyOTkyNDA1ODIyNyk7CiAgIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFszXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oLTIuNSwgLTAuODEyMjk5MjQwNTgyMjcpOwogICBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbNF0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KC0yLjUsIC0zLjQ0MDk1NDgwMTE3NzkzKTsKIAotICByZXZlcnNlX2dvbGRlbl9yZXN1bHRbMF0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KCAzLjAsIDApOworICByZXZlcnNlX2dvbGRlbl9yZXN1bHRbMF0gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KDMuMCwgMCk7CiAgIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFsxXSA9IHN0ZDo6Y29tcGxleDxmbG9hdD4oLTAuNSwgLTAuNjg4MTkwOTYwMjM1NTg3KTsKICAgcmV2ZXJzZV9nb2xkZW5fcmVzdWx0WzJdID0gc3RkOjpjb21wbGV4PGZsb2F0PigtMC41LCAtMC4xNjI0NTk4NDgxMTY0NTMpOwogICByZXZlcnNlX2dvbGRlbl9yZXN1bHRbM10gPSBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KC0wLjUsICswLjE2MjQ1OTg0ODExNjQ1Myk7CkBAIC0xNjEsMjMgKzE1OSwyMSBAQAogICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGNfb2Zmc2V0KDEuMCwgMS4wKTsKICAgZmxvYXQgcl9vZmZzZXQgPSAxLjA7CiAKLSAgZm9yKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewogICAgIFZFUklGWV9JU19BUFBST1goZm9yd2FyZF9vdXRwdXRfYm90aF9wYXJ0cyhpKSArIGNfb2Zmc2V0LCBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbaV0gKyBjX29mZnNldCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChmb3J3YXJkX291dHB1dF9yZWFsX3BhcnQoaSkgICsgcl9vZmZzZXQsIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFtpXS5yZWFsKCkgKyByX29mZnNldCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChmb3J3YXJkX291dHB1dF9pbWFnX3BhcnQoaSkgICsgcl9vZmZzZXQsIGZvcndhcmRfZ29sZGVuX3Jlc3VsdFtpXS5pbWFnKCkgKyByX29mZnNldCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChmb3J3YXJkX291dHB1dF9yZWFsX3BhcnQoaSkgKyByX29mZnNldCwgZm9yd2FyZF9nb2xkZW5fcmVzdWx0W2ldLnJlYWwoKSArIHJfb2Zmc2V0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKGZvcndhcmRfb3V0cHV0X2ltYWdfcGFydChpKSArIHJfb2Zmc2V0LCBmb3J3YXJkX2dvbGRlbl9yZXN1bHRbaV0uaW1hZygpICsgcl9vZmZzZXQpOwogICB9CiAKLSAgZm9yKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewogICAgIFZFUklGWV9JU19BUFBST1gocmV2ZXJzZV9vdXRwdXRfYm90aF9wYXJ0cyhpKSArIGNfb2Zmc2V0LCByZXZlcnNlX2dvbGRlbl9yZXN1bHRbaV0gKyBjX29mZnNldCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChyZXZlcnNlX291dHB1dF9yZWFsX3BhcnQoaSkgICsgcl9vZmZzZXQsIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFtpXS5yZWFsKCkgKyByX29mZnNldCk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChyZXZlcnNlX291dHB1dF9pbWFnX3BhcnQoaSkgICsgcl9vZmZzZXQsIHJldmVyc2VfZ29sZGVuX3Jlc3VsdFtpXS5pbWFnKCkgKyByX29mZnNldCk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChyZXZlcnNlX291dHB1dF9yZWFsX3BhcnQoaSkgKyByX29mZnNldCwgcmV2ZXJzZV9nb2xkZW5fcmVzdWx0W2ldLnJlYWwoKSArIHJfb2Zmc2V0KTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKHJldmVyc2Vfb3V0cHV0X2ltYWdfcGFydChpKSArIHJfb2Zmc2V0LCByZXZlcnNlX2dvbGRlbl9yZXN1bHRbaV0uaW1hZygpICsgcl9vZmZzZXQpOwogICB9CiB9CiAKLQogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBSZWFsU2NhbGFyLCBib29sIGlzQ29tcGxleElucHV0LCBpbnQgRkZUUmVzdWx0VHlwZSwgaW50IEZGVERpcmVjdGlvbiwgaW50IFRlbnNvclJhbms+CiBzdGF0aWMgdm9pZCB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneSgpIHsKLQogICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgVGVuc29yUmFuaz4gZGltZW5zaW9uczsKICAgcHRyZGlmZl90IHRvdGFsX3NpemUgPSAxOwogICBmb3IgKGludCBpID0gMDsgaSA8IFRlbnNvclJhbms7ICsraSkgewpAQCAtMjE2LDEwICsyMTIsOSBAQAogICAgIGVuZXJneV9hZnRlcl9mZnQgKz0gbnVtZXh0OjphYnMyKG91dHB1dChpKSk7CiAgIH0KIAotICBpZihGRlREaXJlY3Rpb24gPT0gRkZUX0ZPUldBUkQpIHsKKyAgaWYgKEZGVERpcmVjdGlvbiA9PSBGRlRfRk9SV0FSRCkgewogICAgIFZFUklGWV9JU19BUFBST1goZW5lcmd5X29yaWdpbmFsLCBlbmVyZ3lfYWZ0ZXJfZmZ0IC8gdG90YWxfc2l6ZSk7Ci0gIH0KLSAgZWxzZSB7CisgIH0gZWxzZSB7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChlbmVyZ3lfb3JpZ2luYWwsIGVuZXJneV9hZnRlcl9mZnQgKiB0b3RhbF9zaXplKTsKICAgfQogfQpAQCAtMjM5LDY2ICsyMzQsNjMgQEAKICAgYXJyYXk8aW50LCAxPiBmZnQ7CiAgIGZmdFswXSA9IDA7CiAKLSAgVGVuc29yPHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiwgMSwgQ29sTWFqb3I+IGZvcndhcmQgPQotICAgICAgaW5wdXQudGVtcGxhdGUgZmZ0PEJvdGhQYXJ0cywgRkZUX0ZPUldBUkQ+KGZmdCk7CisgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4sIDEsIENvbE1ham9yPiBmb3J3YXJkID0gaW5wdXQudGVtcGxhdGUgZmZ0PEJvdGhQYXJ0cywgRkZUX0ZPUldBUkQ+KGZmdCk7CiAKLSAgVGVuc29yPFJlYWxTY2FsYXIsIDEsIENvbE1ham9yLCBwdHJkaWZmX3Q+IG91dHB1dCA9Ci0gICAgICBmb3J3YXJkLnRlbXBsYXRlIGZmdDxSZWFsUGFydCwgRkZUX1JFVkVSU0U+KGZmdCk7CisgIFRlbnNvcjxSZWFsU2NhbGFyLCAxLCBDb2xNYWpvciwgcHRyZGlmZl90PiBvdXRwdXQgPSBmb3J3YXJkLnRlbXBsYXRlIGZmdDxSZWFsUGFydCwgRkZUX1JFVkVSU0U+KGZmdCk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICBSZWFsU2NhbGFyIHRvbCA9IHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCkgKgotICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6YWJzKGlucHV0W2ldKSArIHN0ZDo6YWJzKG91dHB1dFtpXSkgKyAxKTsKKyAgICBSZWFsU2NhbGFyIHRvbCA9IHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCkgKiAoc3RkOjphYnMoaW5wdXRbaV0pICsgc3RkOjphYnMob3V0cHV0W2ldKSArIDEpOwogICAgIFZFUklGWV9JU19BUFBST1hfT1JfTEVTU19USEFOKHN0ZDo6YWJzKGlucHV0W2ldIC0gb3V0cHV0W2ldKSwgdG9sKTsKICAgfQogfQogCiBFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2ZmdCkgewotICAgIHRlc3RfZmZ0X2NvbXBsZXhfaW5wdXRfZ29sZGVuKCk7Ci0gICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9nb2xkZW4oKTsKKyAgdGVzdF9mZnRfY29tcGxleF9pbnB1dF9nb2xkZW4oKTsKKyAgdGVzdF9mZnRfcmVhbF9pbnB1dF9nb2xkZW4oKTsKIAotICAgIHRlc3RfZmZ0XzJEX2dvbGRlbjxDb2xNYWpvcj4oKTsKLSAgICB0ZXN0X2ZmdF8yRF9nb2xkZW48Um93TWFqb3I+KCk7CisgIHRlc3RfZmZ0XzJEX2dvbGRlbjxDb2xNYWpvcj4oKTsKKyAgdGVzdF9mZnRfMkRfZ29sZGVuPFJvd01ham9yPigpOwogCi0gICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGZsb2F0LCAgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAxPigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMT4oKTsKLSAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZmxvYXQsICBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAxPigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDE+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBmbG9hdCwgdHJ1ZSwgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDE+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIHRydWUsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAxPigpOworICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZmxvYXQsIGZhbHNlLCBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMT4oKTsKKyAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGRvdWJsZSwgZmFsc2UsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAxPigpOwogCi0gICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGZsb2F0LCAgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAyPigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMj4oKTsKLSAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZmxvYXQsICBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAyPigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDI+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBmbG9hdCwgdHJ1ZSwgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDI+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIHRydWUsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAyPigpOworICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZmxvYXQsIGZhbHNlLCBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMj4oKTsKKyAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGRvdWJsZSwgZmFsc2UsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAyPigpOwogCi0gICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGZsb2F0LCAgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAzPigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMz4oKTsKLSAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZmxvYXQsICBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAzPigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDM+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBmbG9hdCwgdHJ1ZSwgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDM+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIHRydWUsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAzPigpOworICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZmxvYXQsIGZhbHNlLCBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMz4oKTsKKyAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGRvdWJsZSwgZmFsc2UsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAzPigpOwogCi0gICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGZsb2F0LCAgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCA0PigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgND4oKTsKLSAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZmxvYXQsICBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCA0PigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDQ+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBmbG9hdCwgdHJ1ZSwgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDQ+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PENvbE1ham9yLCBkb3VibGUsIHRydWUsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCA0PigpOworICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxDb2xNYWpvciwgZmxvYXQsIGZhbHNlLCBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgND4oKTsKKyAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Q29sTWFqb3IsIGRvdWJsZSwgZmFsc2UsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCA0PigpOwogCi0gICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGZsb2F0LCAgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAxPigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMT4oKTsKLSAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZmxvYXQsICBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAxPigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDE+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBmbG9hdCwgdHJ1ZSwgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDE+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIHRydWUsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAxPigpOworICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZmxvYXQsIGZhbHNlLCBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMT4oKTsKKyAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGRvdWJsZSwgZmFsc2UsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAxPigpOwogCi0gICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGZsb2F0LCAgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAyPigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMj4oKTsKLSAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZmxvYXQsICBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAyPigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDI+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBmbG9hdCwgdHJ1ZSwgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDI+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIHRydWUsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAyPigpOworICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZmxvYXQsIGZhbHNlLCBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMj4oKTsKKyAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGRvdWJsZSwgZmFsc2UsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAyPigpOwogCi0gICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGZsb2F0LCAgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAzPigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMz4oKTsKLSAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZmxvYXQsICBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAzPigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDM+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBmbG9hdCwgdHJ1ZSwgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDM+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIHRydWUsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAzPigpOworICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZmxvYXQsIGZhbHNlLCBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgMz4oKTsKKyAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGRvdWJsZSwgZmFsc2UsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCAzPigpOwogCi0gICAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGZsb2F0LCAgdHJ1ZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCA0PigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIHRydWUsICBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgND4oKTsKLSAgICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZmxvYXQsICBmYWxzZSwgIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCA0PigpOwotICAgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIGZhbHNlLCAgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDQ+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBmbG9hdCwgdHJ1ZSwgRWlnZW46OkJvdGhQYXJ0cywgRkZUX0ZPUldBUkQsIDQ+KCk7CisgIHRlc3RfZmZ0X3JlYWxfaW5wdXRfZW5lcmd5PFJvd01ham9yLCBkb3VibGUsIHRydWUsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCA0PigpOworICB0ZXN0X2ZmdF9yZWFsX2lucHV0X2VuZXJneTxSb3dNYWpvciwgZmxvYXQsIGZhbHNlLCBFaWdlbjo6Qm90aFBhcnRzLCBGRlRfRk9SV0FSRCwgND4oKTsKKyAgdGVzdF9mZnRfcmVhbF9pbnB1dF9lbmVyZ3k8Um93TWFqb3IsIGRvdWJsZSwgZmFsc2UsIEVpZ2VuOjpCb3RoUGFydHMsIEZGVF9GT1JXQVJELCA0PigpOwogCi0gICAgdGVzdF9mZnRfbm9uX3Bvd2VyX29mXzJfcm91bmRfdHJpcDxmbG9hdD4oNyk7Ci0gICAgdGVzdF9mZnRfbm9uX3Bvd2VyX29mXzJfcm91bmRfdHJpcDxkb3VibGU+KDcpOworICB0ZXN0X2ZmdF9ub25fcG93ZXJfb2ZfMl9yb3VuZF90cmlwPGZsb2F0Pig3KTsKKyAgdGVzdF9mZnRfbm9uX3Bvd2VyX29mXzJfcm91bmRfdHJpcDxkb3VibGU+KDcpOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZml4ZWRfc2l6ZS5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9maXhlZF9zaXplLmNwcAppbmRleCA0NTZjZTZiLi43Y2ZjMThkIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9maXhlZF9zaXplLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9maXhlZF9zaXplLmNwcApAQCAtMTEsMTIgKzExLDEwIEBACiAKICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CiAKLXVzaW5nIEVpZ2VuOjpUZW5zb3I7CiB1c2luZyBFaWdlbjo6Um93TWFqb3I7Cit1c2luZyBFaWdlbjo6VGVuc29yOwogCi0KLXN0YXRpYyB2b2lkIHRlc3RfMGQoKQoteworc3RhdGljIHZvaWQgdGVzdF8wZCgpIHsKICAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczw+ID4gc2NhbGFyMTsKICAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczw+LCBSb3dNYWpvcj4gc2NhbGFyMjsKICAgVkVSSUZZX0lTX0VRVUFMKHNjYWxhcjEucmFuaygpLCAwKTsKQEAgLTQ0LDggKzQyLDcgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChzY2FsYXIzKCksIDcuMGYgKyAxMy4wZik7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfMWQoKQoteworc3RhdGljIHZvaWQgdGVzdF8xZCgpIHsKICAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczw2PiA+IHZlYzE7CiAgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8Nj4sIFJvd01ham9yPiB2ZWMyOwogCkBAIC01MywxMiArNTAsMTggQEAKICAgLy8gIFZFUklGWV9JU19FUVVBTCgodmVjMS5kaW1lbnNpb25zKClbMF0pLCA2KTsKICAgLy8gIFZFUklGWV9JU19FUVVBTCgodmVjMS5kaW1lbnNpb24oMCkpLCA2KTsKIAotICB2ZWMxKDApID0gNC4wOyAgdmVjMigwKSA9IDAuMDsKLSAgdmVjMSgxKSA9IDguMDsgIHZlYzIoMSkgPSAxLjA7Ci0gIHZlYzEoMikgPSAxNS4wOyB2ZWMyKDIpID0gMi4wOwotICB2ZWMxKDMpID0gMTYuMDsgdmVjMigzKSA9IDMuMDsKLSAgdmVjMSg0KSA9IDIzLjA7IHZlYzIoNCkgPSA0LjA7Ci0gIHZlYzEoNSkgPSA0Mi4wOyB2ZWMyKDUpID0gNS4wOworICB2ZWMxKDApID0gNC4wOworICB2ZWMyKDApID0gMC4wOworICB2ZWMxKDEpID0gOC4wOworICB2ZWMyKDEpID0gMS4wOworICB2ZWMxKDIpID0gMTUuMDsKKyAgdmVjMigyKSA9IDIuMDsKKyAgdmVjMSgzKSA9IDE2LjA7CisgIHZlYzIoMykgPSAzLjA7CisgIHZlYzEoNCkgPSAyMy4wOworICB2ZWMyKDQpID0gNC4wOworICB2ZWMxKDUpID0gNDIuMDsKKyAgdmVjMig1KSA9IDUuMDsKIAogICAvLyBUZXN0IGFnYWluc3Qgc2hhbGxvdyBjb3B5LgogICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDY+ID4gY29weSA9IHZlYzE7CkBAIC0xMDMsMTcgKzEwNiwyMiBAQAogICBWRVJJRllfSVNfQVBQUk9YKHZlYzMoNSksIDQyLjBmICsgNS4wZik7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfdGVuc29yX21hcCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X3RlbnNvcl9tYXAoKSB7CiAgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8Nj4gPiB2ZWMxOwogICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDY+LCBSb3dNYWpvcj4gdmVjMjsKIAotICB2ZWMxKDApID0gNC4wOyAgdmVjMigwKSA9IDAuMDsKLSAgdmVjMSgxKSA9IDguMDsgIHZlYzIoMSkgPSAxLjA7Ci0gIHZlYzEoMikgPSAxNS4wOyB2ZWMyKDIpID0gMi4wOwotICB2ZWMxKDMpID0gMTYuMDsgdmVjMigzKSA9IDMuMDsKLSAgdmVjMSg0KSA9IDIzLjA7IHZlYzIoNCkgPSA0LjA7Ci0gIHZlYzEoNSkgPSA0Mi4wOyB2ZWMyKDUpID0gNS4wOworICB2ZWMxKDApID0gNC4wOworICB2ZWMyKDApID0gMC4wOworICB2ZWMxKDEpID0gOC4wOworICB2ZWMyKDEpID0gMS4wOworICB2ZWMxKDIpID0gMTUuMDsKKyAgdmVjMigyKSA9IDIuMDsKKyAgdmVjMSgzKSA9IDE2LjA7CisgIHZlYzIoMykgPSAzLjA7CisgIHZlYzEoNCkgPSAyMy4wOworICB2ZWMyKDQpID0gNC4wOworICB2ZWMxKDUpID0gNDIuMDsKKyAgdmVjMig1KSA9IDUuMDsKIAogICBmbG9hdCBkYXRhM1s2XTsKICAgVGVuc29yTWFwPFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8Nj4gPiA+IHZlYzMoZGF0YTMsIDYpOwpAQCAtMTI3LDYyICsxMzUsNjAgQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh2ZWMzKDUpLCBzcXJ0Zig0Mi4wKSArIDUuMGYpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0XzJkKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfMmQoKSB7CiAgIGZsb2F0IGRhdGExWzZdOwotICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwyLCAzPiA+ID4gbWF0MShkYXRhMSwyLDMpOworICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwyLCAzPiA+ID4gbWF0MShkYXRhMSwgMiwgMyk7CiAgIGZsb2F0IGRhdGEyWzZdOwotICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwyLCAzPiwgUm93TWFqb3I+ID4gbWF0MihkYXRhMiwyLDMpOworICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwyLCAzPiwgUm93TWFqb3I+ID4gbWF0MihkYXRhMiwgMiwgMyk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKChtYXQxLnNpemUoKSksIDIqMyk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0MS5zaXplKCkpLCAyICogMyk7CiAgIFZFUklGWV9JU19FUVVBTChtYXQxLnJhbmsoKSwgMik7CiAgIC8vICBWRVJJRllfSVNfRVFVQUwoKG1hdDEuZGltZW5zaW9uKDApKSwgMik7CiAgIC8vICBWRVJJRllfSVNfRVFVQUwoKG1hdDEuZGltZW5zaW9uKDEpKSwgMyk7CiAKLSAgbWF0MSgwLDApID0gMC4wOwotICBtYXQxKDAsMSkgPSAxLjA7Ci0gIG1hdDEoMCwyKSA9IDIuMDsKLSAgbWF0MSgxLDApID0gMy4wOwotICBtYXQxKDEsMSkgPSA0LjA7Ci0gIG1hdDEoMSwyKSA9IDUuMDsKKyAgbWF0MSgwLCAwKSA9IDAuMDsKKyAgbWF0MSgwLCAxKSA9IDEuMDsKKyAgbWF0MSgwLCAyKSA9IDIuMDsKKyAgbWF0MSgxLCAwKSA9IDMuMDsKKyAgbWF0MSgxLCAxKSA9IDQuMDsKKyAgbWF0MSgxLCAyKSA9IDUuMDsKIAotICBtYXQyKDAsMCkgPSAtMC4wOwotICBtYXQyKDAsMSkgPSAtMS4wOwotICBtYXQyKDAsMikgPSAtMi4wOwotICBtYXQyKDEsMCkgPSAtMy4wOwotICBtYXQyKDEsMSkgPSAtNC4wOwotICBtYXQyKDEsMikgPSAtNS4wOworICBtYXQyKDAsIDApID0gLTAuMDsKKyAgbWF0MigwLCAxKSA9IC0xLjA7CisgIG1hdDIoMCwgMikgPSAtMi4wOworICBtYXQyKDEsIDApID0gLTMuMDsKKyAgbWF0MigxLCAxKSA9IC00LjA7CisgIG1hdDIoMSwgMikgPSAtNS4wOwogCiAgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8MiwgMz4gPiBtYXQzOwogICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDIsIDM+LCBSb3dNYWpvcj4gbWF0NDsKICAgbWF0MyA9IG1hdDEuYWJzKCk7CiAgIG1hdDQgPSBtYXQyLmFicygpOwogCi0gIFZFUklGWV9JU19FUVVBTCgobWF0My5zaXplKCkpLCAyKjMpOwotICAgIC8vICBWRVJJRllfSVNfRVFVQUwoKG1hdDMuZGltZW5zaW9uKDApKSwgMik7Ci0gICAgLy8gIFZFUklGWV9JU19FUVVBTCgobWF0My5kaW1lbnNpb24oMSkpLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChtYXQzLnNpemUoKSksIDIgKiAzKTsKKyAgLy8gIFZFUklGWV9JU19FUVVBTCgobWF0My5kaW1lbnNpb24oMCkpLCAyKTsKKyAgLy8gIFZFUklGWV9JU19FUVVBTCgobWF0My5kaW1lbnNpb24oMSkpLCAzKTsKIAotICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwwKSwgMC4wZik7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygwLDEpLCAxLjBmKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDAsMiksIDIuMGYpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwwKSwgMy4wZik7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygxLDEpLCA0LjBmKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKDEsMiksIDUuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwgMCksIDAuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwgMSksIDEuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMCwgMiksIDIuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwgMCksIDMuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwgMSksIDQuMGYpOworICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoMSwgMiksIDUuMGYpOwogCi0gIFZFUklGWV9JU19BUFBST1gobWF0NCgwLDApLCAwLjBmKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDAsMSksIDEuMGYpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMCwyKSwgMi4wZik7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0NCgxLDApLCAzLjBmKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KDEsMSksIDQuMGYpOwotICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoMSwyKSwgNS4wZik7CisgIFZFUklGWV9JU19BUFBST1gobWF0NCgwLCAwKSwgMC4wZik7CisgIFZFUklGWV9JU19BUFBST1gobWF0NCgwLCAxKSwgMS4wZik7CisgIFZFUklGWV9JU19BUFBST1gobWF0NCgwLCAyKSwgMi4wZik7CisgIFZFUklGWV9JU19BUFBST1gobWF0NCgxLCAwKSwgMy4wZik7CisgIFZFUklGWV9JU19BUFBST1gobWF0NCgxLCAxKSwgNC4wZik7CisgIFZFUklGWV9JU19BUFBST1gobWF0NCgxLCAyKSwgNS4wZik7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfM2QoKQoteworc3RhdGljIHZvaWQgdGVzdF8zZCgpIHsKICAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwyLCAzLCA3PiA+IG1hdDE7CiAgIFRlbnNvckZpeGVkU2l6ZTxmbG9hdCwgU2l6ZXM8MiwgMywgNz4sIFJvd01ham9yPiBtYXQyOwogCi0gIFZFUklGWV9JU19FUVVBTCgobWF0MS5zaXplKCkpLCAyKjMqNyk7CisgIFZFUklGWV9JU19FUVVBTCgobWF0MS5zaXplKCkpLCAyICogMyAqIDcpOwogICBWRVJJRllfSVNfRVFVQUwobWF0MS5yYW5rKCksIDMpOwogICAvLyAgVkVSSUZZX0lTX0VRVUFMKChtYXQxLmRpbWVuc2lvbigwKSksIDIpOwogICAvLyAgVkVSSUZZX0lTX0VRVUFMKChtYXQxLmRpbWVuc2lvbigxKSksIDMpOwpAQCAtMTkyLDggKzE5OCw4IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIG1hdDEoaSxqLGspID0gdmFsOwotICAgICAgICBtYXQyKGksaixrKSA9IHZhbDsKKyAgICAgICAgbWF0MShpLCBqLCBrKSA9IHZhbDsKKyAgICAgICAgbWF0MihpLCBqLCBrKSA9IHZhbDsKICAgICAgICAgdmFsICs9IDEuMGY7CiAgICAgICB9CiAgICAgfQpAQCAtMjA0LDMzICsyMTAsMzAgQEAKICAgVGVuc29yRml4ZWRTaXplPGZsb2F0LCBTaXplczwyLCAzLCA3PiwgUm93TWFqb3I+IG1hdDQ7CiAgIG1hdDQgPSBtYXQyLnNxcnQoKTsKIAotICBWRVJJRllfSVNfRVFVQUwoKG1hdDMuc2l6ZSgpKSwgMiozKjcpOworICBWRVJJRllfSVNfRVFVQUwoKG1hdDMuc2l6ZSgpKSwgMiAqIDMgKiA3KTsKICAgLy8gIFZFUklGWV9JU19FUVVBTCgobWF0My5kaW1lbnNpb24oMCkpLCAyKTsKICAgLy8gIFZFUklGWV9JU19FUVVBTCgobWF0My5kaW1lbnNpb24oMSkpLCAzKTsKICAgLy8gIFZFUklGWV9JU19FUVVBTCgobWF0My5kaW1lbnNpb24oMikpLCA3KTsKIAotCiAgIHZhbCA9IDAuMGY7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MyhpLGosayksIHNxcnRmKHZhbCkpOwotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDQoaSxqLGspLCBzcXJ0Zih2YWwpKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKGksIGosIGspLCBzcXJ0Zih2YWwpKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQ0KGksIGosIGspLCBzcXJ0Zih2YWwpKTsKICAgICAgICAgdmFsICs9IDEuMGY7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLQotc3RhdGljIHZvaWQgdGVzdF9hcnJheSgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X2FycmF5KCkgewogICBUZW5zb3JGaXhlZFNpemU8ZmxvYXQsIFNpemVzPDIsIDMsIDc+ID4gbWF0MTsKICAgZmxvYXQgdmFsID0gMC4wZjsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKLSAgICAgICAgbWF0MShpLGosaykgPSB2YWw7CisgICAgICAgIG1hdDEoaSwgaiwgaykgPSB2YWw7CiAgICAgICAgIHZhbCArPSAxLjBmOwogICAgICAgfQogICAgIH0KQEAgLTI0MywxNSArMjQ2LDE0IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MyhpLGosayksIHBvd2YodmFsLCAzLjVmKSk7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gobWF0MyhpLCBqLCBrKSwgcG93Zih2YWwsIDMuNWYpKTsKICAgICAgICAgdmFsICs9IDEuMGY7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfZml4ZWRfc2l6ZSkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfZml4ZWRfc2l6ZSkgewogICBDQUxMX1NVQlRFU1QodGVzdF8wZCgpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfMWQoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3RlbnNvcl9tYXAoKSk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9mb3JjZWRfZXZhbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9mb3JjZWRfZXZhbC5jcHAKaW5kZXggYTIxYTAyYi4uNGViN2Q5MSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZm9yY2VkX2V2YWwuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ZvcmNlZF9ldmFsLmNwcApAQCAtMTUsMTcgKzE1LDE2IEBACiB1c2luZyBFaWdlbjo6TWF0cml4WGY7CiB1c2luZyBFaWdlbjo6VGVuc29yOwogCi1zdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZSgpCi17Ci0gIE1hdHJpeFhmIG0xKDMsMyk7Ci0gIE1hdHJpeFhmIG0yKDMsMyk7CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZSgpIHsKKyAgTWF0cml4WGYgbTEoMywgMyk7CisgIE1hdHJpeFhmIG0yKDMsIDMpOwogICBtMS5zZXRSYW5kb20oKTsKICAgbTIuc2V0UmFuZG9tKCk7CiAKLSAgVGVuc29yTWFwPFRlbnNvcjxmbG9hdCwgMj4gPiBtYXQxKG0xLmRhdGEoKSwgMywzKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxmbG9hdCwgMj4gPiBtYXQyKG0yLmRhdGEoKSwgMywzKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxmbG9hdCwgMj4gPiBtYXQxKG0xLmRhdGEoKSwgMywgMyk7CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDI+ID4gbWF0MihtMi5kYXRhKCksIDMsIDMpOwogCi0gIFRlbnNvcjxmbG9hdCwgMj4gbWF0MygzLDMpOworICBUZW5zb3I8ZmxvYXQsIDI+IG1hdDMoMywgMyk7CiAgIG1hdDMgPSBtYXQxOwogCiAgIHR5cGVkZWYgVGVuc29yPGZsb2F0LCAxPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOwpAQCAtMzQsMjEgKzMzLDE5IEBACiAKICAgbWF0MyA9IG1hdDMuY29udHJhY3QobWF0MiwgZGltcykuZXZhbCgpOwogCi0gIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAwKSwgKG0xKm0yKS5ldmFsKCkoMCwwKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAxKSwgKG0xKm0yKS5ldmFsKCkoMCwxKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAyKSwgKG0xKm0yKS5ldmFsKCkoMCwyKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAwKSwgKG0xKm0yKS5ldmFsKCkoMSwwKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAxKSwgKG0xKm0yKS5ldmFsKCkoMSwxKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAyKSwgKG0xKm0yKS5ldmFsKCkoMSwyKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygyLCAwKSwgKG0xKm0yKS5ldmFsKCkoMiwwKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygyLCAxKSwgKG0xKm0yKS5ldmFsKCkoMiwxKSk7Ci0gIFZFUklGWV9JU19BUFBST1gobWF0MygyLCAyKSwgKG0xKm0yKS5ldmFsKCkoMiwyKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAwKSwgKG0xICogbTIpLmV2YWwoKSgwLCAwKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAxKSwgKG0xICogbTIpLmV2YWwoKSgwLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygwLCAyKSwgKG0xICogbTIpLmV2YWwoKSgwLCAyKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAwKSwgKG0xICogbTIpLmV2YWwoKSgxLCAwKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAxKSwgKG0xICogbTIpLmV2YWwoKSgxLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygxLCAyKSwgKG0xICogbTIpLmV2YWwoKSgxLCAyKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygyLCAwKSwgKG0xICogbTIpLmV2YWwoKSgyLCAwKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygyLCAxKSwgKG0xICogbTIpLmV2YWwoKSgyLCAxKSk7CisgIFZFUklGWV9JU19BUFBST1gobWF0MygyLCAyKSwgKG0xICogbTIpLmV2YWwoKSgyLCAyKSk7CiB9CiAKLQotc3RhdGljIHZvaWQgdGVzdF9jb25zdCgpCi17Ci0gIE1hdHJpeFhmIGlucHV0KDMsMyk7CitzdGF0aWMgdm9pZCB0ZXN0X2NvbnN0KCkgeworICBNYXRyaXhYZiBpbnB1dCgzLCAzKTsKICAgaW5wdXQuc2V0UmFuZG9tKCk7CiAgIE1hdHJpeFhmIG91dHB1dCA9IGlucHV0OwogICBvdXRwdXQucm93d2lzZSgpIC09IGlucHV0LmNvbHdpc2UoKS5tYXhDb2VmZigpOwpAQCAtNjIsNyArNTksOCBAQAogICBiY2FzdFswXSA9IDM7CiAgIGJjYXN0WzFdID0gMTsKICAgY29uc3QgVGVuc29yTWFwPGNvbnN0IFRlbnNvcjxmbG9hdCwgMj4gPiBpbnB1dF90ZW5zb3IoaW5wdXQuZGF0YSgpLCAzLCAzKTsKLSAgVGVuc29yPGZsb2F0LCAyPiBvdXRwdXRfdGVuc29yPSAoaW5wdXRfdGVuc29yIC0gaW5wdXRfdGVuc29yLm1heGltdW0oZGVwdGhfZGltKS5ldmFsKCkucmVzaGFwZShkaW1zMmQpLmJyb2FkY2FzdChiY2FzdCkpOworICBUZW5zb3I8ZmxvYXQsIDI+IG91dHB1dF90ZW5zb3IgPQorICAgICAgKGlucHV0X3RlbnNvciAtIGlucHV0X3RlbnNvci5tYXhpbXVtKGRlcHRoX2RpbSkuZXZhbCgpLnJlc2hhcGUoZGltczJkKS5icm9hZGNhc3QoYmNhc3QpKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CkBAIC03MSw5ICs2OSw3IEBACiAgIH0KIH0KIAotCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2ZvcmNlZF9ldmFsKQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9mb3JjZWRfZXZhbCkgewogICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGUoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2NvbnN0KCkpOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZm9yY2VkX2V2YWxfc3ljbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9mb3JjZWRfZXZhbF9zeWNsLmNwcAppbmRleCBhNTVhNWFkLi4xOWEzYzc5IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9mb3JjZWRfZXZhbF9zeWNsLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9mb3JjZWRfZXZhbF9zeWNsLmNwcApAQCAtMjIsOCArMjIsNyBAQAogCiB1c2luZyBFaWdlbjo6VGVuc29yOwogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotdm9pZCB0ZXN0X2ZvcmNlZF9ldmFsX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7Ci0KK3ZvaWQgdGVzdF9mb3JjZWRfZXZhbF9zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBJbmRleFR5cGUgc2l6ZURpbTEgPSAxMDA7CiAgIEluZGV4VHlwZSBzaXplRGltMiA9IDIwOwogICBJbmRleFR5cGUgc2l6ZURpbTMgPSAyMDsKQEAgLTMyLDkgKzMxLDEyIEBACiAgIEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW4yKHRlbnNvclJhbmdlKTsKICAgRWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBvdXQodGVuc29yUmFuZ2UpOwogCi0gIERhdGFUeXBlICogZ3B1X2luMV9kYXRhICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4xLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlICogZ3B1X2luMl9kYXRhICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4yLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlICogZ3B1X291dF9kYXRhID0gIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW4xX2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbjEuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2luMl9kYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4yLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG91dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAKICAgaW4xID0gaW4xLnJhbmRvbSgpICsgaW4xLmNvbnN0YW50KHN0YXRpY19jYXN0PERhdGFUeXBlPigxMC4wZikpOwogICBpbjIgPSBpbjIucmFuZG9tKCkgKyBpbjIuY29uc3RhbnQoc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KDEwLjBmKSk7CkBAIC00MywxNiArNDUsMTUgQEAKICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfaW4xKGdwdV9pbjFfZGF0YSwgdGVuc29yUmFuZ2UpOwogICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9pbjIoZ3B1X2luMl9kYXRhLCB0ZW5zb3JSYW5nZSk7CiAgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X291dChncHVfb3V0X2RhdGEsIHRlbnNvclJhbmdlKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjFfZGF0YSwgaW4xLmRhdGEoKSwoaW4xLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW4yX2RhdGEsIGluMi5kYXRhKCksKGluMi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luMV9kYXRhLCBpbjEuZGF0YSgpLCAoaW4xLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjJfZGF0YSwgaW4yLmRhdGEoKSwgKGluMi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIC8vLyBjPShhK2IpKmIKLSAgZ3B1X291dC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0oZ3B1X2luMSArIGdwdV9pbjIpLmV2YWwoKSAqIGdwdV9pbjI7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfb3V0X2RhdGEsKG91dC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPSAoZ3B1X2luMSArIGdwdV9pbjIpLmV2YWwoKSAqIGdwdV9pbjI7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfb3V0X2RhdGEsIChvdXQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IHNpemVEaW0xOyArK2kpIHsKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IHNpemVEaW0yOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgc2l6ZURpbTM7ICsraykgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLCBqLCBrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoaW4xKGksIGosIGspICsgaW4yKGksIGosIGspKSAqIGluMihpLCBqLCBrKSk7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksIGosIGspLCAoaW4xKGksIGosIGspICsgaW4yKGksIGosIGspKSAqIGluMihpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC02MCwxNyArNjEsMTcgQEAKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW4xX2RhdGEpOwogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9pbjJfZGF0YSk7CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X291dF9kYXRhKTsKLQogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIERldl9zZWxlY3Rvcj4gdm9pZCB0ZW5zb3JGb3JjZWRfZXZhbHBlckRldmljZShEZXZfc2VsZWN0b3Igcyl7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIERldl9zZWxlY3Rvcj4KK3ZvaWQgdGVuc29yRm9yY2VkX2V2YWxwZXJEZXZpY2UoRGV2X3NlbGVjdG9yIHMpIHsKICAgUXVldWVJbnRlcmZhY2UgcXVldWVJbnRlcmZhY2Uocyk7CiAgIGF1dG8gc3ljbF9kZXZpY2UgPSBFaWdlbjo6U3ljbERldmljZSgmcXVldWVJbnRlcmZhY2UpOwogICB0ZXN0X2ZvcmNlZF9ldmFsX3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CiAgIHRlc3RfZm9yY2VkX2V2YWxfc3ljbDxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKIH0KIEVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfZm9yY2VkX2V2YWxfc3ljbCkgewotICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6RWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgewogICAgIENBTExfU1VCVEVTVCh0ZW5zb3JGb3JjZWRfZXZhbHBlckRldmljZTxmbG9hdD4oZGV2aWNlKSk7CiAgICAgQ0FMTF9TVUJURVNUKHRlbnNvckZvcmNlZF9ldmFscGVyRGV2aWNlPGhhbGY+KGRldmljZSkpOwogICB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9nZW5lcmF0b3IuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZ2VuZXJhdG9yLmNwcAppbmRleCA2ZGNmNjc2Li5lNGFlYzFiIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9nZW5lcmF0b3IuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2dlbmVyYXRvci5jcHAKQEAgLTEyLDE2ICsxMiwxMyBAQAogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KIAogc3RydWN0IEdlbmVyYXRvcjFEIHsKLSAgR2VuZXJhdG9yMUQoKSB7IH0KKyAgR2VuZXJhdG9yMUQoKSB7fQogCi0gIGZsb2F0IG9wZXJhdG9yKCkoY29uc3QgYXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+JiBjb29yZGluYXRlcykgY29uc3QgewotICAgIHJldHVybiBjb29yZGluYXRlc1swXTsKLSAgfQorICBmbG9hdCBvcGVyYXRvcigpKGNvbnN0IGFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAxPiYgY29vcmRpbmF0ZXMpIGNvbnN0IHsgcmV0dXJuIGNvb3JkaW5hdGVzWzBdOyB9CiB9OwogCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0XzFEKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfMUQoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMT4gdmVjKDYpOwogICBUZW5zb3I8ZmxvYXQsIDE+IHJlc3VsdCA9IHZlYy5nZW5lcmF0ZShHZW5lcmF0b3IxRCgpKTsKIApAQCAtMzAsOSArMjcsOCBAQAogICB9CiB9CiAKLQogc3RydWN0IEdlbmVyYXRvcjJEIHsKLSAgR2VuZXJhdG9yMkQoKSB7IH0KKyAgR2VuZXJhdG9yMkQoKSB7fQogCiAgIGZsb2F0IG9wZXJhdG9yKCkoY29uc3QgYXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDI+JiBjb29yZGluYXRlcykgY29uc3QgewogICAgIHJldHVybiAzICogY29vcmRpbmF0ZXNbMF0gKyAxMSAqIGNvb3JkaW5hdGVzWzFdOwpAQCAtNDAsMjIgKzM2LDE5IEBACiB9OwogCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0XzJEKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfMkQoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMj4gbWF0cml4KDUxMiwgNTEyKTsKICAgVGVuc29yPGZsb2F0LCAyPiByZXN1bHQgPSBtYXRyaXguZ2VuZXJhdGUoR2VuZXJhdG9yMkQoKSk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MTI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTEyOyArK2opIHsKLSAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiksIDMqaSArIDExKmopOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLCBqKSwgMyAqIGkgKyAxMSAqIGopOwogICAgIH0KICAgfQogfQogCi0KIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfZ2F1c3NpYW4oKQoteworc3RhdGljIHZvaWQgdGVzdF9nYXVzc2lhbigpIHsKICAgaW50IHJvd3MgPSAzMjsKICAgaW50IGNvbHMgPSA0ODsKICAgYXJyYXk8ZmxvYXQsIDI+IG1lYW5zOwpAQCAtNzEsMTcgKzY0LDE1IEBACiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7ICsraikgewotICAgICAgZmxvYXQgZ19yb3dzID0gcG93Zihyb3dzLzIuMGYgLSBpLCAyKSAvICgzLjE0ZiAqIDMuMTRmKSAqIDAuNWY7Ci0gICAgICBmbG9hdCBnX2NvbHMgPSBwb3dmKGNvbHMvMi4wZiAtIGosIDIpIC8gKDIuN2YgKiAyLjdmKSAqIDAuNWY7CisgICAgICBmbG9hdCBnX3Jvd3MgPSBwb3dmKHJvd3MgLyAyLjBmIC0gaSwgMikgLyAoMy4xNGYgKiAzLjE0ZikgKiAwLjVmOworICAgICAgZmxvYXQgZ19jb2xzID0gcG93Zihjb2xzIC8gMi4wZiAtIGosIDIpIC8gKDIuN2YgKiAyLjdmKSAqIDAuNWY7CiAgICAgICBmbG9hdCBnYXVzc2lhbiA9IGV4cGYoLWdfcm93cyAtIGdfY29scyk7CiAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksIGopLCBnYXVzc2lhbik7CiAgICAgfQogICB9CiB9CiAKLQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9nZW5lcmF0b3IpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2dlbmVyYXRvcikgewogICBDQUxMX1NVQlRFU1QodGVzdF8xRDxDb2xNYWpvcj4oKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0XzFEPFJvd01ham9yPigpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfMkQ8Q29sTWFqb3I+KCkpOwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZ2VuZXJhdG9yX3N5Y2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZ2VuZXJhdG9yX3N5Y2wuY3BwCmluZGV4IGZiNmUzZDkuLjMzNWJmMjUgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2dlbmVyYXRvcl9zeWNsLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9nZW5lcmF0b3Jfc3ljbC5jcHAKQEAgLTE2LDM4ICsxNiwzNCBAQAogCiAjZGVmaW5lIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSBpbnQ2NF90CiAjZGVmaW5lIEVJR0VOX1VTRV9TWUNMCi1zdGF0aWMgY29uc3QgZmxvYXQgZXJyb3JfdGhyZXNob2xkID0xZS04ZjsKK3N0YXRpYyBjb25zdCBmbG9hdCBlcnJvcl90aHJlc2hvbGQgPSAxZS04ZjsKIAogI2luY2x1ZGUgIm1haW4uaCIKICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9UZW5zb3I+CiAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiBzdHJ1Y3QgR2VuZXJhdG9yMUQgewotICBHZW5lcmF0b3IxRCgpIHsgfQorICBHZW5lcmF0b3IxRCgpIHt9CiAKLSAgZmxvYXQgb3BlcmF0b3IoKShjb25zdCBhcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMT4mIGNvb3JkaW5hdGVzKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdOwotICB9CisgIGZsb2F0IG9wZXJhdG9yKCkoY29uc3QgYXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+JiBjb29yZGluYXRlcykgY29uc3QgeyByZXR1cm4gY29vcmRpbmF0ZXNbMF07IH0KIH07CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfMURfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpCi17Ci0KK3N0YXRpYyB2b2lkIHRlc3RfMURfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gNjsKICAgYXJyYXk8SW5kZXhUeXBlLCAxPiB0ZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTF9fTsKLSAgVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gdmVjKHRlbnNvclJhbmdlKTsKLSAgVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gcmVzdWx0KHRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHZlYyh0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiByZXN1bHQodGVuc29yUmFuZ2UpOwogCi0gIGNvbnN0IHNpemVfdCB0ZW5zb3JCdWZmU2l6ZSA9dmVjLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfdmVjICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yQnVmZlNpemUpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jlc3VsdCAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvckJ1ZmZTaXplKSk7CisgIGNvbnN0IHNpemVfdCB0ZW5zb3JCdWZmU2l6ZSA9IHZlYy5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfdmVjID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JCdWZmU2l6ZSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JCdWZmU2l6ZSkpOwogCi0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X3ZlYyhncHVfZGF0YV92ZWMsIHRlbnNvclJhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfcmVzdWx0KGdwdV9kYXRhX3Jlc3VsdCwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfdmVjKGdwdV9kYXRhX3ZlYywgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfcmVzdWx0KGdwdV9kYXRhX3Jlc3VsdCwgdGVuc29yUmFuZ2UpOwogCiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV92ZWMsIHZlYy5kYXRhKCksIHRlbnNvckJ1ZmZTaXplKTsKLSAgZ3B1X3Jlc3VsdC5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV92ZWMuZ2VuZXJhdGUoR2VuZXJhdG9yMUQoKSk7CisgIGdwdV9yZXN1bHQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV92ZWMuZ2VuZXJhdGUoR2VuZXJhdG9yMUQoKSk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZXN1bHQuZGF0YSgpLCBncHVfZGF0YV9yZXN1bHQsIHRlbnNvckJ1ZmZTaXplKTsKIAogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDY7ICsraSkgewpAQCAtNTUsOSArNTEsOCBAQAogICB9CiB9CiAKLQogc3RydWN0IEdlbmVyYXRvcjJEIHsKLSAgR2VuZXJhdG9yMkQoKSB7IH0KKyAgR2VuZXJhdG9yMkQoKSB7fQogCiAgIGZsb2F0IG9wZXJhdG9yKCkoY29uc3QgYXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDI+JiBjb29yZGluYXRlcykgY29uc3QgewogICAgIHJldHVybiAzICogY29vcmRpbmF0ZXNbMF0gKyAxMSAqIGNvb3JkaW5hdGVzWzFdOwpAQCAtNjUsMzUgKzYwLDMzIEBACiB9OwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0XzJEX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQoteworc3RhdGljIHZvaWQgdGVzdF8yRF9zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBJbmRleFR5cGUgc2l6ZURpbTEgPSA1OwogICBJbmRleFR5cGUgc2l6ZURpbTIgPSA3OwogICBhcnJheTxJbmRleFR5cGUsIDI+IHRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTJ9fTsKLSAgVGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gbWF0cml4KHRlbnNvclJhbmdlKTsKLSAgVGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gcmVzdWx0KHRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IG1hdHJpeCh0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiByZXN1bHQodGVuc29yUmFuZ2UpOwogCi0gIGNvbnN0IHNpemVfdCB0ZW5zb3JCdWZmU2l6ZSA9bWF0cml4LnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfbWF0cml4ICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yQnVmZlNpemUpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jlc3VsdCAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvckJ1ZmZTaXplKSk7CisgIGNvbnN0IHNpemVfdCB0ZW5zb3JCdWZmU2l6ZSA9IG1hdHJpeC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfbWF0cml4ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JCdWZmU2l6ZSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JCdWZmU2l6ZSkpOwogCi0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X21hdHJpeChncHVfZGF0YV9tYXRyaXgsIHRlbnNvclJhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfcmVzdWx0KGdwdV9kYXRhX3Jlc3VsdCwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfbWF0cml4KGdwdV9kYXRhX21hdHJpeCwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfcmVzdWx0KGdwdV9kYXRhX3Jlc3VsdCwgdGVuc29yUmFuZ2UpOwogCiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV9tYXRyaXgsIG1hdHJpeC5kYXRhKCksIHRlbnNvckJ1ZmZTaXplKTsKLSAgZ3B1X3Jlc3VsdC5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9tYXRyaXguZ2VuZXJhdGUoR2VuZXJhdG9yMkQoKSk7CisgIGdwdV9yZXN1bHQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9tYXRyaXguZ2VuZXJhdGUoR2VuZXJhdG9yMkQoKSk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZXN1bHQuZGF0YSgpLCBncHVfZGF0YV9yZXN1bHQsIHRlbnNvckJ1ZmZTaXplKTsKIAogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDU7ICsraSkgewogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgNTsgKytqKSB7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksIGopLCAzKmkgKyAxMSpqKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiksIDMgKiBpICsgMTEgKiBqKTsKICAgICB9CiAgIH0KIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9nYXVzc2lhbl9zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfZ2F1c3NpYW5fc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHJvd3MgPSAzMjsKICAgSW5kZXhUeXBlIGNvbHMgPSA0ODsKICAgYXJyYXk8RGF0YVR5cGUsIDI+IG1lYW5zOwpAQCAtMTA1LDMxICs5OCwzMiBAQAogICBpbnRlcm5hbDo6R2F1c3NpYW5HZW5lcmF0b3I8RGF0YVR5cGUsIEVpZ2VuOjpEZW5zZUluZGV4LCAyPiBnYXVzc2lhbl9nZW4obWVhbnMsIHN0ZF9kZXZzKTsKIAogICBhcnJheTxJbmRleFR5cGUsIDI+IHRlbnNvclJhbmdlID0ge3tyb3dzLCBjb2xzfX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCxJbmRleFR5cGU+IG1hdHJpeCh0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCxJbmRleFR5cGU+IHJlc3VsdCh0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBtYXRyaXgodGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gcmVzdWx0KHRlbnNvclJhbmdlKTsKIAotICBjb25zdCBzaXplX3QgdGVuc29yQnVmZlNpemUgPW1hdHJpeC5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX21hdHJpeCAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvckJ1ZmZTaXplKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9yZXN1bHQgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JCdWZmU2l6ZSkpOworICBjb25zdCBzaXplX3QgdGVuc29yQnVmZlNpemUgPSBtYXRyaXguc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX21hdHJpeCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yQnVmZlNpemUpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jlc3VsdCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yQnVmZlNpemUpKTsKIAotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9tYXRyaXgoZ3B1X2RhdGFfbWF0cml4LCB0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X3Jlc3VsdChncHVfZGF0YV9yZXN1bHQsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X21hdHJpeChncHVfZGF0YV9tYXRyaXgsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3Jlc3VsdChncHVfZGF0YV9yZXN1bHQsIHRlbnNvclJhbmdlKTsKIAogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfbWF0cml4LCBtYXRyaXguZGF0YSgpLCB0ZW5zb3JCdWZmU2l6ZSk7Ci0gIGdwdV9yZXN1bHQuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfbWF0cml4LmdlbmVyYXRlKGdhdXNzaWFuX2dlbik7CisgIGdwdV9yZXN1bHQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9tYXRyaXguZ2VuZXJhdGUoZ2F1c3NpYW5fZ2VuKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJlc3VsdC5kYXRhKCksIGdwdV9kYXRhX3Jlc3VsdCwgdGVuc29yQnVmZlNpemUpOwogCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgcm93czsgKytpKSB7CiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCBjb2xzOyArK2opIHsKLSAgICAgIERhdGFUeXBlIGdfcm93cyA9IHBvd2Yocm93cy8yLjBmIC0gaSwgMikgLyAoMy4xNGYgKiAzLjE0ZikgKiAwLjVmOwotICAgICAgRGF0YVR5cGUgZ19jb2xzID0gcG93Zihjb2xzLzIuMGYgLSBqLCAyKSAvICgyLjdmICogMi43ZikgKiAwLjVmOworICAgICAgRGF0YVR5cGUgZ19yb3dzID0gcG93Zihyb3dzIC8gMi4wZiAtIGksIDIpIC8gKDMuMTRmICogMy4xNGYpICogMC41ZjsKKyAgICAgIERhdGFUeXBlIGdfY29scyA9IHBvd2YoY29scyAvIDIuMGYgLSBqLCAyKSAvICgyLjdmICogMi43ZikgKiAwLjVmOwogICAgICAgRGF0YVR5cGUgZ2F1c3NpYW4gPSBleHBmKC1nX3Jvd3MgLSBnX2NvbHMpOwogICAgICAgRWlnZW46OmludGVybmFsOjppc0FwcHJveChyZXN1bHQoaSwgaiksIGdhdXNzaWFuLCBlcnJvcl90aHJlc2hvbGQpOwogICAgIH0KICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgZGV2X1NlbGVjdG9yPiB2b2lkIHN5Y2xfZ2VuZXJhdG9yX3Rlc3RfcGVyX2RldmljZShkZXZfU2VsZWN0b3Igcyl7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIGRldl9TZWxlY3Rvcj4KK3ZvaWQgc3ljbF9nZW5lcmF0b3JfdGVzdF9wZXJfZGV2aWNlKGRldl9TZWxlY3RvciBzKSB7CiAgIFF1ZXVlSW50ZXJmYWNlIHF1ZXVlSW50ZXJmYWNlKHMpOwogICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKICAgdGVzdF8xRF9zeWNsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwpAQCAtMTM5LDkgKzEzMyw4IEBACiAgIHRlc3RfZ2F1c3NpYW5fc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKICAgdGVzdF9nYXVzc2lhbl9zeWNsPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogfQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9nZW5lcmF0b3Jfc3ljbCkKLXsKLSAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOkVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2dlbmVyYXRvcl9zeWNsKSB7CisgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogRWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKICAgICBDQUxMX1NVQlRFU1Qoc3ljbF9nZW5lcmF0b3JfdGVzdF9wZXJfZGV2aWNlPGZsb2F0PihkZXZpY2UpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZ3B1LmN1IGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfZ3B1LmN1CmluZGV4IDMxYmFmMWIuLmI2ZGRjOTggMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2dwdS5jdQorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9ncHUuY3UKQEAgLTM3LDEwICszNyw4IEBACiAgIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOwogICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CiAKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxLCAwLCBpbnQ+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2luMSgKLSAgICAgIGRfaW4xLCAyKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxLCAwLCBpbnQ+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2luMigKLSAgICAgIGRfaW4yLCAyKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxLCAwLCBpbnQ+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2luMShkX2luMSwgMik7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMSwgMCwgaW50PiwgRWlnZW46OkFsaWduZWQ+IGdwdV9pbjIoZF9pbjIsIDIpOwogCiAgIGdwdV9pbjEuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luMS5jb25zdGFudCgzLjE0Zik7CiAgIGdwdV9pbjIuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luMi5yYW5kb20oKTsKQEAgLTQ4LDEwICs0Niw4IEBACiAgIFRlbnNvcjxmbG9hdCwgMSwgMCwgaW50PiBuZXcxKDIpOwogICBUZW5zb3I8ZmxvYXQsIDEsIDAsIGludD4gbmV3MigyKTsKIAotICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmMobmV3MS5kYXRhKCksIGRfaW4xLCB0ZW5zb3JfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKLSAgYXNzZXJ0KGdwdU1lbWNweUFzeW5jKG5ldzIuZGF0YSgpLCBkX2luMiwgdGVuc29yX2J5dGVzLCBncHVNZW1jcHlEZXZpY2VUb0hvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CisgIGFzc2VydChncHVNZW1jcHlBc3luYyhuZXcxLmRhdGEoKSwgZF9pbjEsIHRlbnNvcl9ieXRlcywgZ3B1TWVtY3B5RGV2aWNlVG9Ib3N0LCBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKKyAgYXNzZXJ0KGdwdU1lbWNweUFzeW5jKG5ldzIuZGF0YSgpLCBkX2luMiwgdGVuc29yX2J5dGVzLCBncHVNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGdwdVN1Y2Nlc3MpOwogCiAgIGFzc2VydChncHVTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKIApAQCAtNjYsMTAgKzYyLDggQEAKIAogLy8gVGVzdHMgdGhhdCB0aGVyZSBhcmUgbm8gaW5kZXhpbmcgb3ZlcmZsb3dzIHdoZW4gY29tcHV0aW5nIHRlbnNvcnMgd2l0aCB0aGUKIC8vIG1heCByZXByZXNlbnRhYmxlIHNpemUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXhUeXBlLAotICAgICAgICAgIEluZGV4VHlwZSBOID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8SW5kZXhUeXBlPjo6bWF4KSgpPgotdm9pZCB0ZXN0X2dwdV9udWxsYXJ5X21heF9zaXplKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGUsIEluZGV4VHlwZSBOID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8SW5kZXhUeXBlPjo6bWF4KSgpPgordm9pZCB0ZXN0X2dwdV9udWxsYXJ5X21heF9zaXplKCkgewogICB0eXBlZGVmIGludDhfdCBEYXRhVHlwZTsKICAgdHlwZWRlZiBUZW5zb3I8RGF0YVR5cGUsIDEsIDAsIEluZGV4VHlwZT4gVGVuc29yVHlwZTsKICAgdHlwZWRlZiBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCAxPiBBcnJheVR5cGU7CkBAIC05NCw4ICs4OCw3IEBACiAKICAgVGVuc29yVHlwZSBuZXcxKChBcnJheVR5cGUobikpKTsKIAotICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmMobmV3MS5kYXRhKCksIGRfaW4xLCBpbjFfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGdwdVN1Y2Nlc3MpOworICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmMobmV3MS5kYXRhKCksIGRfaW4xLCBpbjFfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CiAgIGFzc2VydChncHVTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKIAogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IG47ICsraSkgewpAQCAtMTI5LDIzICsxMjIsMTggQEAKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2luMSgKLSAgICAgIGRfaW4xLCBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+KDIpKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9pbjIoCi0gICAgICBkX2luMiwgRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAxPigyKSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfb3V0KAotICAgICAgZF9vdXQsIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMT4oMikpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2luMShkX2luMSwgRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAxPigyKSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfaW4yKGRfaW4yLCBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+KDIpKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9vdXQoZF9vdXQsIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMT4oMikpOwogCiAgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luMSArIGdwdV9pbjI7CiAKLSAgYXNzZXJ0KGdwdU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKKyAgYXNzZXJ0KGdwdU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CiAgIGFzc2VydChncHVTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIFZFUklGWV9JU19BUFBST1goCi0gICAgICAgIG91dChFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+KGkpKSwKLSAgICAgICAgaW4xKEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMT4oaSkpICsgaW4yKEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMT4oaSkpKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKG91dChFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+KGkpKSwKKyAgICAgICAgICAgICAgICAgICAgIGluMShFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+KGkpKSArIGluMihFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+KGkpKSk7CiAgIH0KIAogICBncHVGcmVlKGRfaW4xKTsKQEAgLTE1MywxMiArMTQxLDExIEBACiAgIGdwdUZyZWUoZF9vdXQpOwogfQogCi12b2lkIHRlc3RfZ3B1X2VsZW1lbnR3aXNlKCkKLXsKLSAgVGVuc29yPGZsb2F0LCAzPiBpbjEoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPig3Miw1Myw5NykpOwotICBUZW5zb3I8ZmxvYXQsIDM+IGluMihFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KDcyLDUzLDk3KSk7Ci0gIFRlbnNvcjxmbG9hdCwgMz4gaW4zKEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMz4oNzIsNTMsOTcpKTsKLSAgVGVuc29yPGZsb2F0LCAzPiBvdXQoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPig3Miw1Myw5NykpOwordm9pZCB0ZXN0X2dwdV9lbGVtZW50d2lzZSgpIHsKKyAgVGVuc29yPGZsb2F0LCAzPiBpbjEoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPig3MiwgNTMsIDk3KSk7CisgIFRlbnNvcjxmbG9hdCwgMz4gaW4yKEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMz4oNzIsIDUzLCA5NykpOworICBUZW5zb3I8ZmxvYXQsIDM+IGluMyhFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KDcyLCA1MywgOTcpKTsKKyAgVGVuc29yPGZsb2F0LCAzPiBvdXQoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPig3MiwgNTMsIDk3KSk7CiAgIGluMS5zZXRSYW5kb20oKTsKICAgaW4yLnNldFJhbmRvbSgpOwogICBpbjMuc2V0UmFuZG9tKCk7CkBAIC0xODQsMTAgKzE3MSwxMCBAQAogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiBncHVfaW4xKGRfaW4xLCBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KDcyLDUzLDk3KSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiBncHVfaW4yKGRfaW4yLCBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KDcyLDUzLDk3KSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiBncHVfaW4zKGRfaW4zLCBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KDcyLDUzLDk3KSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiBncHVfb3V0KGRfb3V0LCBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KDcyLDUzLDk3KSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiBncHVfaW4xKGRfaW4xLCBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KDcyLCA1MywgOTcpKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzPiA+IGdwdV9pbjIoZF9pbjIsIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMz4oNzIsIDUzLCA5NykpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDM+ID4gZ3B1X2luMyhkX2luMywgRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPig3MiwgNTMsIDk3KSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMz4gPiBncHVfb3V0KGRfb3V0LCBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KDcyLCA1MywgOTcpKTsKIAogICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbjEgKyBncHVfaW4yICogZ3B1X2luMzsKIApAQCAtMTk3LDcgKzE4NCwxMCBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDcyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDUzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgOTc7ICsraykgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KGksaixrKSksIGluMShFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KGksaixrKSkgKyBpbjIoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPihpLGosaykpICogaW4zKEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMz4oaSxqLGspKSk7CisgICAgICAgIFZFUklGWV9JU19BUFBST1goCisgICAgICAgICAgICBvdXQoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPihpLCBqLCBrKSksCisgICAgICAgICAgICBpbjEoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPihpLCBqLCBrKSkgKworICAgICAgICAgICAgICAgIGluMihFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KGksIGosIGspKSAqIGluMyhFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDM+KGksIGosIGspKSk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0yMjYsMTUgKzIxNiwxMiBAQAogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfaW4xKAotICAgICAgZF9pbjEsIDIwMCk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxib29sLCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9vdXQoCi0gICAgICBkX291dCwgMjAwKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9pbjEoZF9pbjEsIDIwMCk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxib29sLCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9vdXQoZF9vdXQsIDIwMCk7CiAKICAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSAoZ3B1X2luMS5pc25hbikoKTsKIAotICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmMob3V0LmRhdGEoKSwgZF9vdXQsIG91dF9ieXRlcywgZ3B1TWVtY3B5RGV2aWNlVG9Ib3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGdwdVN1Y2Nlc3MpOworICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmMob3V0LmRhdGEoKSwgZF9vdXQsIG91dF9ieXRlcywgZ3B1TWVtY3B5RGV2aWNlVG9Ib3N0LCBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKICAgYXNzZXJ0KGdwdVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGdwdVN1Y2Nlc3MpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyArK2kpIHsKQEAgLTI0NSwxMCArMjMyLDkgQEAKICAgZ3B1RnJlZShkX291dCk7CiB9CiAKLXZvaWQgdGVzdF9ncHVfcmVkdWN0aW9uKCkKLXsKLSAgVGVuc29yPGZsb2F0LCA0PiBpbjEoNzIsNTMsOTcsMTEzKTsKLSAgVGVuc29yPGZsb2F0LCAyPiBvdXQoNzIsOTcpOwordm9pZCB0ZXN0X2dwdV9yZWR1Y3Rpb24oKSB7CisgIFRlbnNvcjxmbG9hdCwgND4gaW4xKDcyLCA1MywgOTcsIDExMyk7CisgIFRlbnNvcjxmbG9hdCwgMj4gb3V0KDcyLCA5Nyk7CiAgIGluMS5zZXRSYW5kb20oKTsKIAogICBzdGQ6OnNpemVfdCBpbjFfYnl0ZXMgPSBpbjEuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKQEAgLTI2NCw4ICsyNTAsOCBAQAogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgND4gPiBncHVfaW4xKGRfaW4xLCA3Miw1Myw5NywxMTMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+ID4gZ3B1X291dChkX291dCwgNzIsOTcpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDQ+ID4gZ3B1X2luMShkX2luMSwgNzIsIDUzLCA5NywgMTEzKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiA+IGdwdV9vdXQoZF9vdXQsIDcyLCA5Nyk7CiAKICAgYXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDI+IHJlZHVjdGlvbl9heGlzOwogICByZWR1Y3Rpb25fYXhpc1swXSA9IDE7CkBAIC0yODEsMTEgKzI2NywxMCBAQAogICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwOwogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1MzsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgMTEzOyArK2wpIHsKLSAgICAgICAgICBleHBlY3RlZCA9Ci0gICAgICAgICAgICAgIHN0ZDo6bWF4PGZsb2F0PihleHBlY3RlZCwgaW4xKGksIGssIGosIGwpKTsKKyAgICAgICAgICBleHBlY3RlZCA9IHN0ZDo6bWF4PGZsb2F0PihleHBlY3RlZCwgaW4xKGksIGssIGosIGwpKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqKSwgZXhwZWN0ZWQpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiksIGV4cGVjdGVkKTsKICAgICB9CiAgIH0KIApAQCAtMjkzLDkgKzI3OCw4IEBACiAgIGdwdUZyZWUoZF9vdXQpOwogfQogCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KLXZvaWQgdGVzdF9ncHVfY29udHJhY3Rpb24oKQotewordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgordm9pZCB0ZXN0X2dwdV9jb250cmFjdGlvbigpIHsKICAgLy8gd2l0aCB0aGVzZSBkaW1lbnNpb25zLCB0aGUgb3V0cHV0IGhhcyAzMDAgKiAxNDAgZWxlbWVudHMsIHdoaWNoIGlzCiAgIC8vIG1vcmUgdGhhbiAzMCAqIDEwMjQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiBibG9ja3Mgb24KICAgLy8gYSAxNSBTTSBHSzExMCBHUFUKQEAgLTMwNiw3ICsyOTAsNyBAQAogICB0X2xlZnQuc2V0UmFuZG9tKCk7CiAgIHRfcmlnaHQuc2V0UmFuZG9tKCk7CiAKLSAgc3RkOjpzaXplX3QgdF9sZWZ0X2J5dGVzID0gdF9sZWZ0LnNpemUoKSAgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCB0X2xlZnRfYnl0ZXMgPSB0X2xlZnQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKICAgc3RkOjpzaXplX3QgdF9yaWdodF9ieXRlcyA9IHRfcmlnaHQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKICAgc3RkOjpzaXplX3QgdF9yZXN1bHRfYnl0ZXMgPSB0X3Jlc3VsdC5zaXplKCkgKiBzaXplb2YoZmxvYXQpOwogCkBAIC0zNDUsNyArMzI5LDggQEAKIAogICBmb3IgKERlbnNlSW5kZXggaSA9IDA7IGkgPCB0X3Jlc3VsdC5zaXplKCk7IGkrKykgewogICAgIGlmIChmYWJzKHRfcmVzdWx0LmRhdGEoKVtpXSAtIG1fcmVzdWx0LmRhdGEoKVtpXSkgPj0gMWUtNGYpIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICI6ICIgPDwgdF9yZXN1bHQuZGF0YSgpW2ldIDw8ICIgdnMgIiA8PCAgbV9yZXN1bHQuZGF0YSgpW2ldIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICI6ICIgPDwgdF9yZXN1bHQuZGF0YSgpW2ldIDw8ICIgdnMgIiA8PCBtX3Jlc3VsdC5kYXRhKClbaV0KKyAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CiAgICAgICBhc3NlcnQoZmFsc2UpOwogICAgIH0KICAgfQpAQCAtMzU1LDEyICszNDAsMTEgQEAKICAgZ3B1RnJlZShkX3RfcmVzdWx0KTsKIH0KIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Ci12b2lkIHRlc3RfZ3B1X2NvbnZvbHV0aW9uXzFkKCkKLXsKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBpbnB1dCg3NCwzNywxMSwxMzcpOwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgordm9pZCB0ZXN0X2dwdV9jb252b2x1dGlvbl8xZCgpIHsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBpbnB1dCg3NCwgMzcsIDExLCAxMzcpOwogICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IGtlcm5lbCg0KTsKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBvdXQoNzQsMzQsMTEsMTM3KTsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBvdXQoNzQsIDM0LCAxMSwgMTM3KTsKICAgaW5wdXQgPSBpbnB1dC5jb25zdGFudCgxMC4wZikgKyBpbnB1dC5yYW5kb20oKTsKICAga2VybmVsID0ga2VybmVsLmNvbnN0YW50KDcuMGYpICsga2VybmVsLnJhbmRvbSgpOwogCkBAIC0zODEsOSArMzY1LDkgQEAKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+ID4gZ3B1X2lucHV0KGRfaW5wdXQsIDc0LDM3LDExLDEzNyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gPiBncHVfaW5wdXQoZF9pbnB1dCwgNzQsIDM3LCAxMSwgMTM3KTsKICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxLCBEYXRhTGF5b3V0PiA+IGdwdV9rZXJuZWwoZF9rZXJuZWwsIDQpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+ID4gZ3B1X291dChkX291dCwgNzQsMzQsMTEsMTM3KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiA+IGdwdV9vdXQoZF9vdXQsIDc0LCAzNCwgMTEsIDEzNyk7CiAKICAgRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAxPiBkaW1zKDEpOwogICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbnB1dC5jb252b2x2ZShncHVfa2VybmVsLCBkaW1zKTsKQEAgLTM5NSw5ICszNzksOSBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzQ7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAxMTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgMTM3OyArK2wpIHsKLSAgICAgICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSxqLGssbCk7Ci0gICAgICAgICAgY29uc3QgZmxvYXQgZXhwZWN0ZWQgPSBpbnB1dChpLGorMCxrLGwpICoga2VybmVsKDApICsgaW5wdXQoaSxqKzEsayxsKSAqIGtlcm5lbCgxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMixrLGwpICoga2VybmVsKDIpICsgaW5wdXQoaSxqKzMsayxsKSAqIGtlcm5lbCgzKTsKKyAgICAgICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSwgaiwgaywgbCk7CisgICAgICAgICAgY29uc3QgZmxvYXQgZXhwZWN0ZWQgPSBpbnB1dChpLCBqICsgMCwgaywgbCkgKiBrZXJuZWwoMCkgKyBpbnB1dChpLCBqICsgMSwgaywgbCkgKiBrZXJuZWwoMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSwgaiArIDIsIGssIGwpICoga2VybmVsKDIpICsgaW5wdXQoaSwgaiArIDMsIGssIGwpICoga2VybmVsKDMpOwogICAgICAgICAgIFZFUklGWV9JU19BUFBST1gocmVzdWx0LCBleHBlY3RlZCk7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTQwOSwxMSArMzkzLDEwIEBACiAgIGdwdUZyZWUoZF9vdXQpOwogfQogCi12b2lkIHRlc3RfZ3B1X2NvbnZvbHV0aW9uX2lubmVyX2RpbV9jb2xfbWFqb3JfMWQoKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIENvbE1ham9yPiBpbnB1dCg3NCw5LDExLDcpOwordm9pZCB0ZXN0X2dwdV9jb252b2x1dGlvbl9pbm5lcl9kaW1fY29sX21ham9yXzFkKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIENvbE1ham9yPiBpbnB1dCg3NCwgOSwgMTEsIDcpOwogICBUZW5zb3I8ZmxvYXQsIDEsIENvbE1ham9yPiBrZXJuZWwoNCk7Ci0gIFRlbnNvcjxmbG9hdCwgNCwgQ29sTWFqb3I+IG91dCg3MSw5LDExLDcpOworICBUZW5zb3I8ZmxvYXQsIDQsIENvbE1ham9yPiBvdXQoNzEsIDksIDExLCA3KTsKICAgaW5wdXQgPSBpbnB1dC5jb25zdGFudCgxMC4wZikgKyBpbnB1dC5yYW5kb20oKTsKICAga2VybmVsID0ga2VybmVsLmNvbnN0YW50KDcuMGYpICsga2VybmVsLnJhbmRvbSgpOwogCkBAIC00MzQsOSArNDE3LDkgQEAKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDQsIENvbE1ham9yPiA+IGdwdV9pbnB1dChkX2lucHV0LDc0LDksMTEsNyk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMSwgQ29sTWFqb3I+ID4gZ3B1X2tlcm5lbChkX2tlcm5lbCw0KTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0LCBDb2xNYWpvcj4gPiBncHVfb3V0KGRfb3V0LDcxLDksMTEsNyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNCwgQ29sTWFqb3I+ID4gZ3B1X2lucHV0KGRfaW5wdXQsIDc0LCA5LCAxMSwgNyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMSwgQ29sTWFqb3I+ID4gZ3B1X2tlcm5lbChkX2tlcm5lbCwgNCk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNCwgQ29sTWFqb3I+ID4gZ3B1X291dChkX291dCwgNzEsIDksIDExLCA3KTsKIAogICBFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDE+IGRpbXMoMCk7CiAgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2lucHV0LmNvbnZvbHZlKGdwdV9rZXJuZWwsIGRpbXMpOwpAQCAtNDQ4LDkgKzQzMSw5IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA5OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMTE7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdCA9IG91dChpLGosayxsKTsKLSAgICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9IGlucHV0KGkrMCxqLGssbCkgKiBrZXJuZWwoMCkgKyBpbnB1dChpKzEsaixrLGwpICoga2VybmVsKDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGkrMixqLGssbCkgKiBrZXJuZWwoMikgKyBpbnB1dChpKzMsaixrLGwpICoga2VybmVsKDMpOworICAgICAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdCA9IG91dChpLCBqLCBrLCBsKTsKKyAgICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9IGlucHV0KGkgKyAwLCBqLCBrLCBsKSAqIGtlcm5lbCgwKSArIGlucHV0KGkgKyAxLCBqLCBrLCBsKSAqIGtlcm5lbCgxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpICsgMiwgaiwgaywgbCkgKiBrZXJuZWwoMikgKyBpbnB1dChpICsgMywgaiwgaywgbCkgKiBrZXJuZWwoMyk7CiAgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQsIGV4cGVjdGVkKTsKICAgICAgICAgfQogICAgICAgfQpAQCAtNDYyLDExICs0NDUsMTAgQEAKICAgZ3B1RnJlZShkX291dCk7CiB9CiAKLXZvaWQgdGVzdF9ncHVfY29udm9sdXRpb25faW5uZXJfZGltX3Jvd19tYWpvcl8xZCgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNCwgUm93TWFqb3I+IGlucHV0KDcsOSwxMSw3NCk7Cit2b2lkIHRlc3RfZ3B1X2NvbnZvbHV0aW9uX2lubmVyX2RpbV9yb3dfbWFqb3JfMWQoKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgUm93TWFqb3I+IGlucHV0KDcsIDksIDExLCA3NCk7CiAgIFRlbnNvcjxmbG9hdCwgMSwgUm93TWFqb3I+IGtlcm5lbCg0KTsKLSAgVGVuc29yPGZsb2F0LCA0LCBSb3dNYWpvcj4gb3V0KDcsOSwxMSw3MSk7CisgIFRlbnNvcjxmbG9hdCwgNCwgUm93TWFqb3I+IG91dCg3LCA5LCAxMSwgNzEpOwogICBpbnB1dCA9IGlucHV0LmNvbnN0YW50KDEwLjBmKSArIGlucHV0LnJhbmRvbSgpOwogICBrZXJuZWwgPSBrZXJuZWwuY29uc3RhbnQoNy4wZikgKyBrZXJuZWwucmFuZG9tKCk7CiAKQEAgLTQ4Nyw5ICs0NjksOSBAQAogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNCwgUm93TWFqb3I+ID4gZ3B1X2lucHV0KGRfaW5wdXQsIDcsOSwxMSw3NCk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNCwgUm93TWFqb3I+ID4gZ3B1X2lucHV0KGRfaW5wdXQsIDcsIDksIDExLCA3NCk7CiAgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMSwgUm93TWFqb3I+ID4gZ3B1X2tlcm5lbChkX2tlcm5lbCwgNCk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNCwgUm93TWFqb3I+ID4gZ3B1X291dChkX291dCwgNyw5LDExLDcxKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0LCBSb3dNYWpvcj4gPiBncHVfb3V0KGRfb3V0LCA3LCA5LCAxMSwgNzEpOwogCiAgIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMT4gZGltcygzKTsKICAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW5wdXQuY29udm9sdmUoZ3B1X2tlcm5lbCwgZGltcyk7CkBAIC01MDEsOSArNDgzLDkgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDk7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAxMTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzE7ICsrbCkgewotICAgICAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdCA9IG91dChpLGosayxsKTsKLSAgICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9IGlucHV0KGksaixrLGwrMCkgKiBrZXJuZWwoMCkgKyBpbnB1dChpLGosayxsKzEpICoga2VybmVsKDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaixrLGwrMikgKiBrZXJuZWwoMikgKyBpbnB1dChpLGosayxsKzMpICoga2VybmVsKDMpOworICAgICAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdCA9IG91dChpLCBqLCBrLCBsKTsKKyAgICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9IGlucHV0KGksIGosIGssIGwgKyAwKSAqIGtlcm5lbCgwKSArIGlucHV0KGksIGosIGssIGwgKyAxKSAqIGtlcm5lbCgxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLCBqLCBrLCBsICsgMikgKiBrZXJuZWwoMikgKyBpbnB1dChpLCBqLCBrLCBsICsgMykgKiBrZXJuZWwoMyk7CiAgICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQsIGV4cGVjdGVkKTsKICAgICAgICAgfQogICAgICAgfQpAQCAtNTE1LDEyICs0OTcsMTEgQEAKICAgZ3B1RnJlZShkX291dCk7CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotdm9pZCB0ZXN0X2dwdV9jb252b2x1dGlvbl8yZCgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gaW5wdXQoNzQsMzcsMTEsMTM3KTsKLSAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBrZXJuZWwoMyw0KTsKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBvdXQoNzQsMzUsOCwxMzcpOwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgordm9pZCB0ZXN0X2dwdV9jb252b2x1dGlvbl8yZCgpIHsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBpbnB1dCg3NCwgMzcsIDExLCAxMzcpOworICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IGtlcm5lbCgzLCA0KTsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBvdXQoNzQsIDM1LCA4LCAxMzcpOwogICBpbnB1dCA9IGlucHV0LmNvbnN0YW50KDEwLjBmKSArIGlucHV0LnJhbmRvbSgpOwogICBrZXJuZWwgPSBrZXJuZWwuY29uc3RhbnQoNy4wZikgKyBrZXJuZWwucmFuZG9tKCk7CiAKQEAgLTU0MSwxMSArNTIyLDExIEBACiAgIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOwogICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CiAKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiA+IGdwdV9pbnB1dChkX2lucHV0LDc0LDM3LDExLDEzNyk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gPiBncHVfa2VybmVsKGRfa2VybmVsLDMsNCk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gPiBncHVfb3V0KGRfb3V0LDc0LDM1LDgsMTM3KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiA+IGdwdV9pbnB1dChkX2lucHV0LCA3NCwgMzcsIDExLCAxMzcpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+ID4gZ3B1X2tlcm5lbChkX2tlcm5lbCwgMywgNCk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gPiBncHVfb3V0KGRfb3V0LCA3NCwgMzUsIDgsIDEzNyk7CiAKLSAgRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAyPiBkaW1zKDEsMik7CisgIEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgMj4gZGltcygxLCAyKTsKICAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW5wdXQuY29udm9sdmUoZ3B1X2tlcm5lbCwgZGltcyk7CiAKICAgYXNzZXJ0KGdwdU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBvdXRfYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CkBAIC01NTUsMTkgKzUzNiwxMyBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzU7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAxMzc7ICsrbCkgewotICAgICAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdCA9IG91dChpLGosayxsKTsKLSAgICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9IGlucHV0KGksaiswLGsrMCxsKSAqIGtlcm5lbCgwLDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisxLGsrMCxsKSAqIGtlcm5lbCgxLDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMCxsKSAqIGtlcm5lbCgyLDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaiswLGsrMSxsKSAqIGtlcm5lbCgwLDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisxLGsrMSxsKSAqIGtlcm5lbCgxLDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMSxsKSAqIGtlcm5lbCgyLDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaiswLGsrMixsKSAqIGtlcm5lbCgwLDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisxLGsrMixsKSAqIGtlcm5lbCgxLDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMixsKSAqIGtlcm5lbCgyLDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaiswLGsrMyxsKSAqIGtlcm5lbCgwLDMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisxLGsrMyxsKSAqIGtlcm5lbCgxLDMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMyxsKSAqIGtlcm5lbCgyLDMpOworICAgICAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdCA9IG91dChpLCBqLCBrLCBsKTsKKyAgICAgICAgICBjb25zdCBmbG9hdCBleHBlY3RlZCA9IGlucHV0KGksIGogKyAwLCBrICsgMCwgbCkgKiBrZXJuZWwoMCwgMCkgKyBpbnB1dChpLCBqICsgMSwgayArIDAsIGwpICoga2VybmVsKDEsIDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAyLCBrICsgMCwgbCkgKiBrZXJuZWwoMiwgMCkgKyBpbnB1dChpLCBqICsgMCwgayArIDEsIGwpICoga2VybmVsKDAsIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAxLCBrICsgMSwgbCkgKiBrZXJuZWwoMSwgMSkgKyBpbnB1dChpLCBqICsgMiwgayArIDEsIGwpICoga2VybmVsKDIsIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAwLCBrICsgMiwgbCkgKiBrZXJuZWwoMCwgMikgKyBpbnB1dChpLCBqICsgMSwgayArIDIsIGwpICoga2VybmVsKDEsIDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAyLCBrICsgMiwgbCkgKiBrZXJuZWwoMiwgMikgKyBpbnB1dChpLCBqICsgMCwgayArIDMsIGwpICoga2VybmVsKDAsIDMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAxLCBrICsgMywgbCkgKiBrZXJuZWwoMSwgMykgKyBpbnB1dChpLCBqICsgMiwgayArIDMsIGwpICoga2VybmVsKDIsIDMpOwogICAgICAgICAgIFZFUklGWV9JU19BUFBST1gocmVzdWx0LCBleHBlY3RlZCk7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTU3OSwxMiArNTU0LDExIEBACiAgIGdwdUZyZWUoZF9vdXQpOwogfQogCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KLXZvaWQgdGVzdF9ncHVfY29udm9sdXRpb25fM2QoKQotewotICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IGlucHV0KEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgNT4oNzQsMzcsMTEsMTM3LDE3KSk7Ci0gIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4ga2VybmVsKDMsNCwyKTsKLSAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiBvdXQoRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCA1Pig3NCwzNSw4LDEzNiwxNykpOwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgordm9pZCB0ZXN0X2dwdV9jb252b2x1dGlvbl8zZCgpIHsKKyAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiBpbnB1dChFaWdlbjo6YXJyYXk8RWlnZW46OkRlbnNlSW5kZXgsIDU+KDc0LCAzNywgMTEsIDEzNywgMTcpKTsKKyAgVGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiBrZXJuZWwoMywgNCwgMik7CisgIFRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gb3V0KEVpZ2VuOjphcnJheTxFaWdlbjo6RGVuc2VJbmRleCwgNT4oNzQsIDM1LCA4LCAxMzYsIDE3KSk7CiAgIGlucHV0ID0gaW5wdXQuY29uc3RhbnQoMTAuMGYpICsgaW5wdXQucmFuZG9tKCk7CiAgIGtlcm5lbCA9IGtlcm5lbC5jb25zdGFudCg3LjBmKSArIGtlcm5lbC5yYW5kb20oKTsKIApAQCAtNjAyLDE0ICs1NzYsMTQgQEAKICAgZ3B1TWVtY3B5KGRfaW5wdXQsIGlucHV0LmRhdGEoKSwgaW5wdXRfYnl0ZXMsIGdwdU1lbWNweUhvc3RUb0RldmljZSk7CiAgIGdwdU1lbWNweShkX2tlcm5lbCwga2VybmVsLmRhdGEoKSwga2VybmVsX2J5dGVzLCBncHVNZW1jcHlIb3N0VG9EZXZpY2UpOwogCi0gIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOyAgICAKKyAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+ID4gZ3B1X2lucHV0KGRfaW5wdXQsNzQsMzcsMTEsMTM3LDE3KTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiA+IGdwdV9rZXJuZWwoZF9rZXJuZWwsMyw0LDIpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+ID4gZ3B1X291dChkX291dCw3NCwzNSw4LDEzNiwxNyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgNSwgRGF0YUxheW91dD4gPiBncHVfaW5wdXQoZF9pbnB1dCwgNzQsIDM3LCAxMSwgMTM3LCAxNyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gPiBncHVfa2VybmVsKGRfa2VybmVsLCAzLCA0LCAyKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiA+IGdwdV9vdXQoZF9vdXQsIDc0LCAzNSwgOCwgMTM2LCAxNyk7CiAKLSAgRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPiBkaW1zKDEsMiwzKTsKKyAgRWlnZW46OmFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPiBkaW1zKDEsIDIsIDMpOwogICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9pbnB1dC5jb252b2x2ZShncHVfa2VybmVsLCBkaW1zKTsKIAogICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmMob3V0LmRhdGEoKSwgZF9vdXQsIG91dF9ieXRlcywgZ3B1TWVtY3B5RGV2aWNlVG9Ib3N0LCBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKQEAgLTYyMCwzMSArNTk0LDMxIEBACiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDEzNjsgKytsKSB7CiAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxNzsgKyttKSB7Ci0gICAgICAgICAgICBjb25zdCBmbG9hdCByZXN1bHQgPSBvdXQoaSxqLGssbCxtKTsKLSAgICAgICAgICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkID0gaW5wdXQoaSxqKzAsayswLGwrMCxtKSAqIGtlcm5lbCgwLDAsMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzAsbCswLG0pICoga2VybmVsKDEsMCwwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMCxsKzAsbSkgKiBrZXJuZWwoMiwwLDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsaysxLGwrMCxtKSAqIGtlcm5lbCgwLDEsMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzEsbCswLG0pICoga2VybmVsKDEsMSwwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMSxsKzAsbSkgKiBrZXJuZWwoMiwxLDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsaysyLGwrMCxtKSAqIGtlcm5lbCgwLDIsMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzIsbCswLG0pICoga2VybmVsKDEsMiwwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMixsKzAsbSkgKiBrZXJuZWwoMiwyLDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsayszLGwrMCxtKSAqIGtlcm5lbCgwLDMsMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzMsbCswLG0pICoga2VybmVsKDEsMywwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMyxsKzAsbSkgKiBrZXJuZWwoMiwzLDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsayswLGwrMSxtKSAqIGtlcm5lbCgwLDAsMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzAsbCsxLG0pICoga2VybmVsKDEsMCwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMCxsKzEsbSkgKiBrZXJuZWwoMiwwLDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsaysxLGwrMSxtKSAqIGtlcm5lbCgwLDEsMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzEsbCsxLG0pICoga2VybmVsKDEsMSwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMSxsKzEsbSkgKiBrZXJuZWwoMiwxLDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsaysyLGwrMSxtKSAqIGtlcm5lbCgwLDIsMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzIsbCsxLG0pICoga2VybmVsKDEsMiwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMixsKzEsbSkgKiBrZXJuZWwoMiwyLDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSxqKzAsayszLGwrMSxtKSAqIGtlcm5lbCgwLDMsMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLGorMSxrKzMsbCsxLG0pICoga2VybmVsKDEsMywxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksaisyLGsrMyxsKzEsbSkgKiBrZXJuZWwoMiwzLDEpOworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmVzdWx0ID0gb3V0KGksIGosIGssIGwsIG0pOworICAgICAgICAgICAgY29uc3QgZmxvYXQgZXhwZWN0ZWQgPSBpbnB1dChpLCBqICsgMCwgayArIDAsIGwgKyAwLCBtKSAqIGtlcm5lbCgwLCAwLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAxLCBrICsgMCwgbCArIDAsIG0pICoga2VybmVsKDEsIDAsIDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSwgaiArIDIsIGsgKyAwLCBsICsgMCwgbSkgKiBrZXJuZWwoMiwgMCwgMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLCBqICsgMCwgayArIDEsIGwgKyAwLCBtKSAqIGtlcm5lbCgwLCAxLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAxLCBrICsgMSwgbCArIDAsIG0pICoga2VybmVsKDEsIDEsIDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSwgaiArIDIsIGsgKyAxLCBsICsgMCwgbSkgKiBrZXJuZWwoMiwgMSwgMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLCBqICsgMCwgayArIDIsIGwgKyAwLCBtKSAqIGtlcm5lbCgwLCAyLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAxLCBrICsgMiwgbCArIDAsIG0pICoga2VybmVsKDEsIDIsIDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSwgaiArIDIsIGsgKyAyLCBsICsgMCwgbSkgKiBrZXJuZWwoMiwgMiwgMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLCBqICsgMCwgayArIDMsIGwgKyAwLCBtKSAqIGtlcm5lbCgwLCAzLCAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAxLCBrICsgMywgbCArIDAsIG0pICoga2VybmVsKDEsIDMsIDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSwgaiArIDIsIGsgKyAzLCBsICsgMCwgbSkgKiBrZXJuZWwoMiwgMywgMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLCBqICsgMCwgayArIDAsIGwgKyAxLCBtKSAqIGtlcm5lbCgwLCAwLCAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAxLCBrICsgMCwgbCArIDEsIG0pICoga2VybmVsKDEsIDAsIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSwgaiArIDIsIGsgKyAwLCBsICsgMSwgbSkgKiBrZXJuZWwoMiwgMCwgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLCBqICsgMCwgayArIDEsIGwgKyAxLCBtKSAqIGtlcm5lbCgwLCAxLCAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAxLCBrICsgMSwgbCArIDEsIG0pICoga2VybmVsKDEsIDEsIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSwgaiArIDIsIGsgKyAxLCBsICsgMSwgbSkgKiBrZXJuZWwoMiwgMSwgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLCBqICsgMCwgayArIDIsIGwgKyAxLCBtKSAqIGtlcm5lbCgwLCAyLCAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAxLCBrICsgMiwgbCArIDEsIG0pICoga2VybmVsKDEsIDIsIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSwgaiArIDIsIGsgKyAyLCBsICsgMSwgbSkgKiBrZXJuZWwoMiwgMiwgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpLCBqICsgMCwgayArIDMsIGwgKyAxLCBtKSAqIGtlcm5lbCgwLCAzLCAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KGksIGogKyAxLCBrICsgMywgbCArIDEsIG0pICoga2VybmVsKDEsIDMsIDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaSwgaiArIDIsIGsgKyAzLCBsICsgMSwgbSkgKiBrZXJuZWwoMiwgMywgMSk7CiAgICAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdCwgZXhwZWN0ZWQpOwogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjU3LDE0ICs2MzEsMTIgQEAKICAgZ3B1RnJlZShkX291dCk7CiB9CiAKLQogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KLXZvaWQgdGVzdF9ncHVfbGdhbW1hKGNvbnN0IFNjYWxhciBzdGRkZXYpCi17Ci0gIFRlbnNvcjxTY2FsYXIsIDI+IGluKDcyLDk3KTsKK3ZvaWQgdGVzdF9ncHVfbGdhbW1hKGNvbnN0IFNjYWxhciBzdGRkZXYpIHsKKyAgVGVuc29yPFNjYWxhciwgMj4gaW4oNzIsIDk3KTsKICAgaW4uc2V0UmFuZG9tKCk7CiAgIGluICo9IGluLmNvbnN0YW50KHN0ZGRldik7Ci0gIFRlbnNvcjxTY2FsYXIsIDI+IG91dCg3Miw5Nyk7CisgIFRlbnNvcjxTY2FsYXIsIDI+IG91dCg3MiwgOTcpOwogICBvdXQuc2V0WmVybygpOwogCiAgIHN0ZDo6c2l6ZV90IGJ5dGVzID0gaW4uc2l6ZSgpICogc2l6ZW9mKFNjYWxhcik7CkBAIC02ODksNyArNjYxLDcgQEAKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDcyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDk3OyArK2opIHsKLSAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksaiksIChzdGQ6OmxnYW1tYSkoaW4oaSxqKSkpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiksIChzdGQ6OmxnYW1tYSkoaW4oaSwgaikpKTsKICAgICB9CiAgIH0KIApAQCAtNjk4LDggKzY3MCw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIHRlc3RfZ3B1X2RpZ2FtbWEoKQotewordm9pZCB0ZXN0X2dwdV9kaWdhbW1hKCkgewogICBUZW5zb3I8U2NhbGFyLCAxPiBpbig3KTsKICAgVGVuc29yPFNjYWxhciwgMT4gb3V0KDcpOwogICBUZW5zb3I8U2NhbGFyLCAxPiBleHBlY3RlZF9vdXQoNyk7CkBAIC03NTAsOCArNzIxLDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KLXZvaWQgdGVzdF9ncHVfemV0YSgpCi17Cit2b2lkIHRlc3RfZ3B1X3pldGEoKSB7CiAgIFRlbnNvcjxTY2FsYXIsIDE+IGluX3goNik7CiAgIFRlbnNvcjxTY2FsYXIsIDE+IGluX3EoNik7CiAgIFRlbnNvcjxTY2FsYXIsIDE+IG91dCg2KTsKQEAgLTc2NCw3ICs3MzQsNyBAQAogICBpbl94KDMpID0gU2NhbGFyKC0xMC41KTsKICAgaW5feCg0KSA9IFNjYWxhcigxMDAwMC41KTsKICAgaW5feCg1KSA9IFNjYWxhcigzKTsKLSAgCisKICAgaW5fcSgwKSA9IFNjYWxhcigxLjIzNDUpOwogICBpbl9xKDEpID0gU2NhbGFyKDIpOwogICBpbl9xKDIpID0gU2NhbGFyKDEuNSk7CkBAIC03OTAsNyArNzYwLDcgQEAKIAogICBncHVNZW1jcHkoZF9pbl94LCBpbl94LmRhdGEoKSwgYnl0ZXMsIGdwdU1lbWNweUhvc3RUb0RldmljZSk7CiAgIGdwdU1lbWNweShkX2luX3EsIGluX3EuZGF0YSgpLCBieXRlcywgZ3B1TWVtY3B5SG9zdFRvRGV2aWNlKTsKLSAgCisKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKIApAQCAtODEzLDggKzc4Myw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIHRlc3RfZ3B1X3BvbHlnYW1tYSgpCi17Cit2b2lkIHRlc3RfZ3B1X3BvbHlnYW1tYSgpIHsKICAgVGVuc29yPFNjYWxhciwgMT4gaW5feCg3KTsKICAgVGVuc29yPFNjYWxhciwgMT4gaW5fbig3KTsKICAgVGVuc29yPFNjYWxhciwgMT4gb3V0KDcpOwpAQCAtODI4LDcgKzc5Nyw3IEBACiAgIGluX24oNCkgPSBTY2FsYXIoMzEpOwogICBpbl9uKDUpID0gU2NhbGFyKDI4KTsKICAgaW5fbig2KSA9IFNjYWxhcig4KTsKLSAgCisKICAgaW5feCgwKSA9IFNjYWxhcigyKTsKICAgaW5feCgxKSA9IFNjYWxhcigzKTsKICAgaW5feCgyKSA9IFNjYWxhcigyNS41KTsKQEAgLTg1Niw3ICs4MjUsNyBAQAogCiAgIGdwdU1lbWNweShkX2luX3gsIGluX3guZGF0YSgpLCBieXRlcywgZ3B1TWVtY3B5SG9zdFRvRGV2aWNlKTsKICAgZ3B1TWVtY3B5KGRfaW5fbiwgaW5fbi5kYXRhKCksIGJ5dGVzLCBncHVNZW1jcHlIb3N0VG9EZXZpY2UpOwotICAKKwogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCkBAIC04NzksOCArODQ4LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KLXZvaWQgdGVzdF9ncHVfaWdhbW1hKCkKLXsKK3ZvaWQgdGVzdF9ncHVfaWdhbW1hKCkgewogICBUZW5zb3I8U2NhbGFyLCAyPiBhKDYsIDYpOwogICBUZW5zb3I8U2NhbGFyLCAyPiB4KDYsIDYpOwogICBUZW5zb3I8U2NhbGFyLCAyPiBvdXQoNiwgNik7CkBAIC04OTcsMTggKzg2NSwxMyBAQAogICB9CiAKICAgU2NhbGFyIG5hbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6cXVpZXRfTmFOKCk7Ci0gIFNjYWxhciBpZ2FtbWFfc1tdWzZdID0ge3swLjAsIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFufSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgezAuMCwgMC42MzIxMjA1NTg4Mjg1NTc4LCAwLjc3Njg2OTgzOTg1MTU3MDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTY4NDM2MTExMTI2NTgsIDkuOTk5NTAwMDE2NjY2MjYyZS0wNSwgMS4wfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgezAuMCwgMC40Mjc1OTMyOTU1MjkxMjAyLCAwLjYwODM3NDgyMzcyODkxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTUzOTg4Mjk0MzEwNzY4NiwgNy41MjIwNzY0NDUwODkyMDFlLTA3LCAxLjB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICB7MC4wLCAwLjAxODk4ODE1Njg3NjE1MzgxLCAwLjA2NTY0MjQ1NDM3ODQ1MDA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41NjY1Mjk4Nzk2MzMyOTA5LCA0LjE2NjMzMzM0NzIyMTgyOGUtMTgsIDEuMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHswLjAsIDAuOTk5OTc4MDU5MzYxODYyOCwgMC45OTk5ODk5OTY3MDgwODM4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTk2MjE5ODM3OTg4LCAwLjk5OTEzNzA0MTg2ODk5NDUsIDEuMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHswLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC41MDQyMDQxOTMyNTEzOTA4fX07Ci0KLQorICBTY2FsYXIgaWdhbW1hX3NbXVs2XSA9IHsKKyAgICAgIHswLjAsIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFufSwKKyAgICAgIHswLjAsIDAuNjMyMTIwNTU4ODI4NTU3OCwgMC43NzY4Njk4Mzk4NTE1NzAyLCAwLjk4MTY4NDM2MTExMTI2NTgsIDkuOTk5NTAwMDE2NjY2MjYyZS0wNSwgMS4wfSwKKyAgICAgIHswLjAsIDAuNDI3NTkzMjk1NTI5MTIwMiwgMC42MDgzNzQ4MjM3Mjg5MTEsIDAuOTUzOTg4Mjk0MzEwNzY4NiwgNy41MjIwNzY0NDUwODkyMDFlLTA3LCAxLjB9LAorICAgICAgezAuMCwgMC4wMTg5ODgxNTY4NzYxNTM4MSwgMC4wNjU2NDI0NTQzNzg0NTAwOCwgMC41NjY1Mjk4Nzk2MzMyOTA5LCA0LjE2NjMzMzM0NzIyMTgyOGUtMTgsIDEuMH0sCisgICAgICB7MC4wLCAwLjk5OTk3ODA1OTM2MTg2MjgsIDAuOTk5OTg5OTk2NzA4MDgzOCwgMC45OTk5OTk2MjE5ODM3OTg4LCAwLjk5OTEzNzA0MTg2ODk5NDUsIDEuMH0sCisgICAgICB7MC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuNTA0MjA0MTkzMjUxMzkwOH19OwogCiAgIHN0ZDo6c2l6ZV90IGJ5dGVzID0gYS5zaXplKCkgKiBzaXplb2YoU2NhbGFyKTsKIApAQCAtOTUwLDggKzkxMyw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIHRlc3RfZ3B1X2lnYW1tYWMoKQotewordm9pZCB0ZXN0X2dwdV9pZ2FtbWFjKCkgewogICBUZW5zb3I8U2NhbGFyLCAyPiBhKDYsIDYpOwogICBUZW5zb3I8U2NhbGFyLCAyPiB4KDYsIDYpOwogICBUZW5zb3I8U2NhbGFyLCAyPiBvdXQoNiwgNik7CkBAIC05NjgsMTcgKzkzMCwxMyBAQAogICB9CiAKICAgU2NhbGFyIG5hbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6cXVpZXRfTmFOKCk7Ci0gIFNjYWxhciBpZ2FtbWFjX3NbXVs2XSA9IHt7bmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7MS4wLCAwLjM2Nzg3OTQ0MTE3MTQ0MjMzLCAwLjIyMzEzMDE2MDE0ODQyOTgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDE4MzE1NjM4ODg4NzM0MTgyLCAwLjk5OTkwMDAwNDk5OTgzMzMsIDAuMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7MS4wLCAwLjU3MjQwNjcwNDQ3MDg3OTgsIDAuMzkxNjI1MTc2MjcxMDg3OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0NjAxMTcwNTY4OTIzMTM2LCAwLjk5OTk5OTI0Nzc5MjM1NTUsIDAuMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7MS4wLCAwLjk4MTAxMTg0MzEyMzg0NjIsIDAuOTM0MzU3NTQ1NjIxNTQ5OSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQzMzQ3MDEyMDM2NjcwODksIDEuMCwgMC4wfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLjAsIDIuMTk0MDYzODEzODE0NjY1OGUtMDUsIDEuMDAwMzI5MTkxNjI4NWUtMDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMy43ODAxNjIwMTE4NDMxMzM0ZS0wNywgMC4wMDA4NjI5NTgxMzEwMDU0NTM1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7MS4wLCAxLjAsIDEuMCwgMS4wLCAxLjAsIDAuNDk1Nzk1ODA2NzQ4MTM5NDR9fTsKKyAgU2NhbGFyIGlnYW1tYWNfc1tdWzZdID0geworICAgICAge25hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW59LAorICAgICAgezEuMCwgMC4zNjc4Nzk0NDExNzE0NDIzMywgMC4yMjMxMzAxNjAxNDg0Mjk4MiwgMC4wMTgzMTU2Mzg4ODg3MzQxODIsIDAuOTk5OTAwMDA0OTk5ODMzMywgMC4wfSwKKyAgICAgIHsxLjAsIDAuNTcyNDA2NzA0NDcwODc5OCwgMC4zOTE2MjUxNzYyNzEwODc4LCAwLjA0NjAxMTcwNTY4OTIzMTM2LCAwLjk5OTk5OTI0Nzc5MjM1NTUsIDAuMH0sCisgICAgICB7MS4wLCAwLjk4MTAxMTg0MzEyMzg0NjIsIDAuOTM0MzU3NTQ1NjIxNTQ5OSwgMC40MzM0NzAxMjAzNjY3MDg5LCAxLjAsIDAuMH0sCisgICAgICB7MS4wLCAyLjE5NDA2MzgxMzgxNDY2NThlLTA1LCAxLjAwMDMyOTE5MTYyODVlLTA1LCAzLjc4MDE2MjAxMTg0MzEzMzRlLTA3LCAwLjAwMDg2Mjk1ODEzMTAwNTQ1MzUsIDAuMH0sCisgICAgICB7MS4wLCAxLjAsIDEuMCwgMS4wLCAxLjAsIDAuNDk1Nzk1ODA2NzQ4MTM5NDR9fTsKIAogICBzdGQ6OnNpemVfdCBieXRlcyA9IGEuc2l6ZSgpICogc2l6ZW9mKFNjYWxhcik7CiAKQEAgLTEwMjAsMTIgKzk3OCwxMSBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgotdm9pZCB0ZXN0X2dwdV9lcmYoY29uc3QgU2NhbGFyIHN0ZGRldikKLXsKLSAgVGVuc29yPFNjYWxhciwgMj4gaW4oNzIsOTcpOwordm9pZCB0ZXN0X2dwdV9lcmYoY29uc3QgU2NhbGFyIHN0ZGRldikgeworICBUZW5zb3I8U2NhbGFyLCAyPiBpbig3MiwgOTcpOwogICBpbi5zZXRSYW5kb20oKTsKICAgaW4gKj0gaW4uY29uc3RhbnQoc3RkZGV2KTsKLSAgVGVuc29yPFNjYWxhciwgMj4gb3V0KDcyLDk3KTsKKyAgVGVuc29yPFNjYWxhciwgMj4gb3V0KDcyLCA5Nyk7CiAgIG91dC5zZXRaZXJvKCk7CiAKICAgc3RkOjpzaXplX3QgYnl0ZXMgPSBpbi5zaXplKCkgKiBzaXplb2YoU2NhbGFyKTsKQEAgLTEwNTAsNyArMTAwNyw3IEBACiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3MjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA5NzsgKytqKSB7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLGopLCAoc3RkOjplcmYpKGluKGksaikpKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksIGopLCAoc3RkOjplcmYpKGluKGksIGopKSk7CiAgICAgfQogICB9CiAKQEAgLTEwNTksMTIgKzEwMTYsMTEgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KLXZvaWQgdGVzdF9ncHVfZXJmYyhjb25zdCBTY2FsYXIgc3RkZGV2KQotewotICBUZW5zb3I8U2NhbGFyLCAyPiBpbig3Miw5Nyk7Cit2b2lkIHRlc3RfZ3B1X2VyZmMoY29uc3QgU2NhbGFyIHN0ZGRldikgeworICBUZW5zb3I8U2NhbGFyLCAyPiBpbig3MiwgOTcpOwogICBpbi5zZXRSYW5kb20oKTsKICAgaW4gKj0gaW4uY29uc3RhbnQoc3RkZGV2KTsKLSAgVGVuc29yPFNjYWxhciwgMj4gb3V0KDcyLDk3KTsKKyAgVGVuc29yPFNjYWxhciwgMj4gb3V0KDcyLCA5Nyk7CiAgIG91dC5zZXRaZXJvKCk7CiAKICAgc3RkOjpzaXplX3QgYnl0ZXMgPSBpbi5zaXplKCkgKiBzaXplb2YoU2NhbGFyKTsKQEAgLTEwODksNyArMTA0NSw3IEBACiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3MjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA5NzsgKytqKSB7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLGopLCAoc3RkOjplcmZjKShpbihpLGopKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLCBqKSwgKHN0ZDo6ZXJmYykoaW4oaSwgaikpKTsKICAgICB9CiAgIH0KIApAQCAtMTA5OCw4ICsxMDU0LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KLXZvaWQgdGVzdF9ncHVfbmR0cmkoKQotewordm9pZCB0ZXN0X2dwdV9uZHRyaSgpIHsKICAgVGVuc29yPFNjYWxhciwgMT4gaW5feCg5KTsKICAgVGVuc29yPFNjYWxhciwgMT4gb3V0KDkpOwogICBUZW5zb3I8U2NhbGFyLCAxPiBleHBlY3RlZF9vdXQoOSk7CkBAIC0xMTQ1LDcgKzExMDAsNyBAQAogICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmMob3V0LmRhdGEoKSwgZF9vdXQsIGJ5dGVzLCBncHVNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGdwdVN1Y2Nlc3MpOwogICBhc3NlcnQoZ3B1U3RyZWFtU3luY2hyb25pemUoZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CiAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyArK2kpIHsgICAgCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CiAgICAgVkVSSUZZX0lTX0NXSVNFX0FQUFJPWChvdXQoaSksIGV4cGVjdGVkX291dChpKSk7CiAgIH0KIApAQCAtMTE1NCw4ICsxMTA5LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KLXZvaWQgdGVzdF9ncHVfYmV0YWluYygpCi17Cit2b2lkIHRlc3RfZ3B1X2JldGFpbmMoKSB7CiAgIFRlbnNvcjxTY2FsYXIsIDE+IGluX3goMTI1KTsKICAgVGVuc29yPFNjYWxhciwgMT4gaW5fYSgxMjUpOwogICBUZW5zb3I8U2NhbGFyLCAxPiBpbl9iKDEyNSk7CkBAIC0xMTcwLDg1ICsxMTI0LDU3IEBACiAgIEFycmF5PFNjYWxhciwgMSwgRHluYW1pYz4gYigxMjUpOwogICBBcnJheTxTY2FsYXIsIDEsIER5bmFtaWM+IHYoMTI1KTsKIAotICBhIDw8IDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLAotICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsCi0gICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKLSAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCi0gICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKLSAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCi0gICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKLSAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LAotICAgICAgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksCi0gICAgICAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDMxLjYyMTc3NjYwMTY4Mzc5LAotICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksCi0gICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LAotICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksCi0gICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LAotICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDk5OS45OTksIDk5OS45OTksCi0gICAgICA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LAotICAgICAgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwKLSAgICAgIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTk7CisgIGEgPDwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLAorICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKKyAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKKyAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwKKyAgICAgIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDMxLjYyMTc3NjYwMTY4Mzc5LAorICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksCisgICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LAorICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksCisgICAgICA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LAorICAgICAgOTk5Ljk5OTsKIAotICBiIDw8IDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC45OTksCi0gICAgICAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LAotICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgOTk5Ljk5OSwgOTk5Ljk5OSwKLSAgICAgIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKLSAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMzEuNjIxNzc2NjAxNjgzNzksCi0gICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LAotICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDAuMCwgMC4wLAotICAgICAgMC4wLCAwLjAsIDAuMCwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKLSAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LAotICAgICAgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDk5OS45OTksIDk5OS45OTksCi0gICAgICA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKLSAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCi0gICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDMxLjYyMTc3NjYwMTY4Mzc5LAotICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCAwLjAsIDAuMCwKLSAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCi0gICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwKLSAgICAgIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksCi0gICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCA5OTkuOTk5LCA5OTkuOTk5LAotICAgICAgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OTsKKyAgYiA8PCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKKyAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsCisgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwKKyAgICAgIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKKyAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LAorICAgICAgMC45OTksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgOTk5Ljk5OSwKKyAgICAgIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LAorICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCA5OTkuOTk5LCA5OTkuOTk5LAorICAgICAgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTk7CiAKLSAgeCA8PCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwKLSAgICAgIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LAotICAgICAgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsCi0gICAgICAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwKLSAgICAgIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsCi0gICAgICAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwKLSAgICAgIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LAotICAgICAgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsCi0gICAgICAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMTsKKyAgeCA8PCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsCisgICAgICAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LAorICAgICAgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwKKyAgICAgIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLAorICAgICAgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwKKyAgICAgIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMTsKIAotICB2IDw8IG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLAotICAgICAgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwKLSAgICAgIG5hbiwgbmFuLCAwLjQ3OTcyMTE5ODc2MzY0NjgzLCAwLjUsIDAuNTIwMjc4ODAxMjM2MzUzMywgbmFuLCBuYW4sCi0gICAgICAwLjk1MTg2ODM5NTc3NDAwNDMsIDAuOTc4OTY2MzAxMDQxMzc0MywgMC45OTMxNzI5MTg4MDczNDM1LCBuYW4sIG5hbiwKLSAgICAgIDAuOTk5OTk1OTQ5MDMzMDYyLCAwLjk5OTk5OTk5OTk5OTM2OTgsIDAuOTk5OTk5OTk5OTk5OTk5OSwgbmFuLCBuYW4sCi0gICAgICAwLjk5OTk5OTk5OTk5OTk5OTksIDAuOTk5OTk5OTk5OTk5OTk5OSwgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sIG5hbiwgbmFuLAotICAgICAgbmFuLCBuYW4sIG5hbiwgbmFuLCAwLjAwNjgyNzA4MTE5MjY1NTg2OSwgMC4wMjEwMzM2OTg5NTg2MjU2LAotICAgICAgMC4wNDgxMzE2MDQyMjU5OTU2NywgbmFuLCBuYW4sIDAuMjAwMTQzNDQyNTYyMTc2NzgsIDAuNTAwMDAwMDAwMDAwMDAwMSwKLSAgICAgIDAuNzk5ODU2NTU3NDM3ODIzMiwgbmFuLCBuYW4sIDAuOTk5MTQwMTQyODQzNTgzNCwgMC45OTk5OTk5OTk2OTg0MDMsCi0gICAgICAwLjk5OTk5OTk5OTk5OTk5OTksIG5hbiwgbmFuLCAwLjk5OTk5OTk5OTk5OTk5OTksIDAuOTk5OTk5OTk5OTk5OTk5OSwKLSAgICAgIDAuOTk5OTk5OTk5OTk5OTk5OSwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLAotICAgICAgMS4wNjQ2NjAwMjMyMzcwODg3ZS0yNSwgNi4zMDE3MjI4Nzc4MjYyNDZlLTEzLCA0LjA1MDk2NjkzNzk3NDkzOGUtMDYsIG5hbiwKLSAgICAgIG5hbiwgNy44NjQzNDI2Njg0Mjk3NjNlLTIzLCAzLjAxNTk2OTY2NzU5NDE2NmUtMTAsIDAuMDAwODU5ODU3MTU2NDE2NTQ0NCwKLSAgICAgIG5hbiwgbmFuLCA2LjAzMTk4NzcxMDEyMzg0NGUtMDgsIDAuNTAwMDAwMDAwMDAwMDAwNywgMC45OTk5OTk5Mzk2ODAxMjI5LAotICAgICAgbmFuLCBuYW4sIDAuOTk5OTk5OTk5OTk5OTk5OSwgMC45OTk5OTk5OTk5OTk5OTk5LCAwLjk5OTk5OTk5OTk5OTk5OTksIG5hbiwKLSAgICAgIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIDAuMCwgNy4wMjk5MjAzODA5ODY2MzZlLTMwNiwKLSAgICAgIDIuMjQ1MDcyODIwODU5MTM0NWUtMTAxLCBuYW4sIG5hbiwgMC4wLCA5LjI3NTg3MTE0Nzg2OTcyN2UtMzAyLAotICAgICAgMS4yMjMyOTEzMDI2MTUyODI3ZS05NywgbmFuLCBuYW4sIDAuMCwgMy4wODkxMzkzMDgxOTMyOTI0ZS0yNTIsCi0gICAgICAyLjkzMDMwNDM2NjYxODM5OTZlLTYwLCBuYW4sIG5hbiwgMi4yNDg5MTM0ODY4NzkxOTllLTE5NiwKLSAgICAgIDAuNTAwMDAwMDAwMDAwNDk0NywgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW47CisgIHYgPDwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLAorICAgICAgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgMC40Nzk3MjExOTg3NjM2NDY4MywgMC41LCAwLjUyMDI3ODgwMTIzNjM1MzMsIG5hbiwgbmFuLAorICAgICAgMC45NTE4NjgzOTU3NzQwMDQzLCAwLjk3ODk2NjMwMTA0MTM3NDMsIDAuOTkzMTcyOTE4ODA3MzQzNSwgbmFuLCBuYW4sIDAuOTk5OTk1OTQ5MDMzMDYyLCAwLjk5OTk5OTk5OTk5OTM2OTgsCisgICAgICAwLjk5OTk5OTk5OTk5OTk5OTksIG5hbiwgbmFuLCAwLjk5OTk5OTk5OTk5OTk5OTksIDAuOTk5OTk5OTk5OTk5OTk5OSwgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwKKyAgICAgIG5hbiwgbmFuLCAwLjAwNjgyNzA4MTE5MjY1NTg2OSwgMC4wMjEwMzM2OTg5NTg2MjU2LCAwLjA0ODEzMTYwNDIyNTk5NTY3LCBuYW4sIG5hbiwgMC4yMDAxNDM0NDI1NjIxNzY3OCwKKyAgICAgIDAuNTAwMDAwMDAwMDAwMDAwMSwgMC43OTk4NTY1NTc0Mzc4MjMyLCBuYW4sIG5hbiwgMC45OTkxNDAxNDI4NDM1ODM0LCAwLjk5OTk5OTk5OTY5ODQwMywgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sCisgICAgICBuYW4sIDAuOTk5OTk5OTk5OTk5OTk5OSwgMC45OTk5OTk5OTk5OTk5OTk5LCAwLjk5OTk5OTk5OTk5OTk5OTksIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwKKyAgICAgIDEuMDY0NjYwMDIzMjM3MDg4N2UtMjUsIDYuMzAxNzIyODc3ODI2MjQ2ZS0xMywgNC4wNTA5NjY5Mzc5NzQ5MzhlLTA2LCBuYW4sIG5hbiwgNy44NjQzNDI2Njg0Mjk3NjNlLTIzLAorICAgICAgMy4wMTU5Njk2Njc1OTQxNjZlLTEwLCAwLjAwMDg1OTg1NzE1NjQxNjU0NDQsIG5hbiwgbmFuLCA2LjAzMTk4NzcxMDEyMzg0NGUtMDgsIDAuNTAwMDAwMDAwMDAwMDAwNywKKyAgICAgIDAuOTk5OTk5OTM5NjgwMTIyOSwgbmFuLCBuYW4sIDAuOTk5OTk5OTk5OTk5OTk5OSwgMC45OTk5OTk5OTk5OTk5OTk5LCAwLjk5OTk5OTk5OTk5OTk5OTksIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLAorICAgICAgbmFuLCBuYW4sIDAuMCwgNy4wMjk5MjAzODA5ODY2MzZlLTMwNiwgMi4yNDUwNzI4MjA4NTkxMzQ1ZS0xMDEsIG5hbiwgbmFuLCAwLjAsIDkuMjc1ODcxMTQ3ODY5NzI3ZS0zMDIsCisgICAgICAxLjIyMzI5MTMwMjYxNTI4MjdlLTk3LCBuYW4sIG5hbiwgMC4wLCAzLjA4OTEzOTMwODE5MzI5MjRlLTI1MiwgMi45MzAzMDQzNjY2MTgzOTk2ZS02MCwgbmFuLCBuYW4sCisgICAgICAyLjI0ODkxMzQ4Njg3OTE5OWUtMTk2LCAwLjUwMDAwMDAwMDAwMDQ5NDcsIDAuOTk5OTk5OTk5OTk5OTk5OSwgbmFuOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTI1OyArK2kpIHsKICAgICBpbl94KGkpID0geChpKTsKQEAgLTEyOTYsOCArMTIyMiw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIHRlc3RfZ3B1X2kwZSgpCi17Cit2b2lkIHRlc3RfZ3B1X2kwZSgpIHsKICAgVGVuc29yPFNjYWxhciwgMT4gaW5feCgyMSk7CiAgIFRlbnNvcjxTY2FsYXIsIDE+IG91dCgyMSk7CiAgIFRlbnNvcjxTY2FsYXIsIDE+IGV4cGVjdGVkX291dCgyMSk7CkBAIC0xMzA2LDE1ICsxMjMxLDEzIEBACiAgIEFycmF5PFNjYWxhciwgMSwgRHluYW1pYz4gaW5feF9hcnJheSgyMSk7CiAgIEFycmF5PFNjYWxhciwgMSwgRHluYW1pYz4gZXhwZWN0ZWRfb3V0X2FycmF5KDIxKTsKIAotICBpbl94X2FycmF5IDw8IC0yMC4wLCAtMTguMCwgLTE2LjAsIC0xNC4wLCAtMTIuMCwgLTEwLjAsIC04LjAsIC02LjAsIC00LjAsCi0gICAgICAtMi4wLCAwLjAsIDIuMCwgNC4wLCA2LjAsIDguMCwgMTAuMCwgMTIuMCwgMTQuMCwgMTYuMCwgMTguMCwgMjAuMDsKKyAgaW5feF9hcnJheSA8PCAtMjAuMCwgLTE4LjAsIC0xNi4wLCAtMTQuMCwgLTEyLjAsIC0xMC4wLCAtOC4wLCAtNi4wLCAtNC4wLCAtMi4wLCAwLjAsIDIuMCwgNC4wLCA2LjAsIDguMCwgMTAuMCwgMTIuMCwKKyAgICAgIDE0LjAsIDE2LjAsIDE4LjAsIDIwLjA7CiAKLSAgZXhwZWN0ZWRfb3V0X2FycmF5IDw8IDAuMDg5NzgwMzExODg0OCwgMC4wOTQ3MDYyOTUyMTI4LCAwLjEwMDU0NDEyNzM2MSwKLSAgICAgIDAuMTA3NjE1MjUxNjcxLCAwLjExNjQyNjIyMTIxMywgMC4xMjc4MzMzMzcxNjMsIDAuMTQzNDMxNzgxODU3LAotICAgICAgMC4xNjY2NTc0MzI2NCwgMC4yMDcwMDE5MjEyMjQsIDAuMzA4NTA4MzIyNTU0LCAxLjAsIDAuMzA4NTA4MzIyNTU0LAotICAgICAgMC4yMDcwMDE5MjEyMjQsIDAuMTY2NjU3NDMyNjQsIDAuMTQzNDMxNzgxODU3LCAwLjEyNzgzMzMzNzE2MywKLSAgICAgIDAuMTE2NDI2MjIxMjEzLCAwLjEwNzYxNTI1MTY3MSwgMC4xMDA1NDQxMjczNjEsIDAuMDk0NzA2Mjk1MjEyOCwKLSAgICAgIDAuMDg5NzgwMzExODg0ODsKKyAgZXhwZWN0ZWRfb3V0X2FycmF5IDw8IDAuMDg5NzgwMzExODg0OCwgMC4wOTQ3MDYyOTUyMTI4LCAwLjEwMDU0NDEyNzM2MSwgMC4xMDc2MTUyNTE2NzEsIDAuMTE2NDI2MjIxMjEzLAorICAgICAgMC4xMjc4MzMzMzcxNjMsIDAuMTQzNDMxNzgxODU3LCAwLjE2NjY1NzQzMjY0LCAwLjIwNzAwMTkyMTIyNCwgMC4zMDg1MDgzMjI1NTQsIDEuMCwgMC4zMDg1MDgzMjI1NTQsCisgICAgICAwLjIwNzAwMTkyMTIyNCwgMC4xNjY2NTc0MzI2NCwgMC4xNDM0MzE3ODE4NTcsIDAuMTI3ODMzMzM3MTYzLCAwLjExNjQyNjIyMTIxMywgMC4xMDc2MTUyNTE2NzEsIDAuMTAwNTQ0MTI3MzYxLAorICAgICAgMC4wOTQ3MDYyOTUyMTI4LCAwLjA4OTc4MDMxMTg4NDg7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMTsgKytpKSB7CiAgICAgaW5feChpKSA9IGluX3hfYXJyYXkoaSk7CkBAIC0xMzM4LDggKzEyNjEsNyBAQAogCiAgIGdwdV9vdXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2luLmJlc3NlbF9pMGUoKTsKIAotICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmMob3V0LmRhdGEoKSwgZF9vdXQsIGJ5dGVzLCBncHVNZW1jcHlEZXZpY2VUb0hvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CisgIGFzc2VydChncHVNZW1jcHlBc3luYyhvdXQuZGF0YSgpLCBkX291dCwgYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CiAgIGFzc2VydChncHVTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDIxOyArK2kpIHsKQEAgLTEzNTEsOCArMTI3Myw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+Ci12b2lkIHRlc3RfZ3B1X2kxZSgpCi17Cit2b2lkIHRlc3RfZ3B1X2kxZSgpIHsKICAgVGVuc29yPFNjYWxhciwgMT4gaW5feCgyMSk7CiAgIFRlbnNvcjxTY2FsYXIsIDE+IG91dCgyMSk7CiAgIFRlbnNvcjxTY2FsYXIsIDE+IGV4cGVjdGVkX291dCgyMSk7CkBAIC0xMzYxLDE1ICsxMjgyLDEzIEBACiAgIEFycmF5PFNjYWxhciwgMSwgRHluYW1pYz4gaW5feF9hcnJheSgyMSk7CiAgIEFycmF5PFNjYWxhciwgMSwgRHluYW1pYz4gZXhwZWN0ZWRfb3V0X2FycmF5KDIxKTsKIAotICBpbl94X2FycmF5IDw8IC0yMC4wLCAtMTguMCwgLTE2LjAsIC0xNC4wLCAtMTIuMCwgLTEwLjAsIC04LjAsIC02LjAsIC00LjAsCi0gICAgICAtMi4wLCAwLjAsIDIuMCwgNC4wLCA2LjAsIDguMCwgMTAuMCwgMTIuMCwgMTQuMCwgMTYuMCwgMTguMCwgMjAuMDsKKyAgaW5feF9hcnJheSA8PCAtMjAuMCwgLTE4LjAsIC0xNi4wLCAtMTQuMCwgLTEyLjAsIC0xMC4wLCAtOC4wLCAtNi4wLCAtNC4wLCAtMi4wLCAwLjAsIDIuMCwgNC4wLCA2LjAsIDguMCwgMTAuMCwgMTIuMCwKKyAgICAgIDE0LjAsIDE2LjAsIDE4LjAsIDIwLjA7CiAKLSAgZXhwZWN0ZWRfb3V0X2FycmF5IDw8IC0wLjA4NzUwNjIyMjE4MzMsIC0wLjA5MjAzNjc5Njg3MiwgLTAuMDk3MzQ5NjE0NzU2NSwKLSAgICAgIC0wLjEwMzY5NzY2NzQ2MywgLTAuMTExNDY0Mjk5MjksIC0wLjEyMTI2MjY4MTM4NCwgLTAuMTM0MTQyNDkzMjkzLAotICAgICAgLTAuMTUyMDUxNDU5MzA5LCAtMC4xNzg3NTA4Mzk1MDIsIC0wLjIxNTI2OTI4OTI0OSwgMC4wLCAwLjIxNTI2OTI4OTI0OSwKLSAgICAgIDAuMTc4NzUwODM5NTAyLCAwLjE1MjA1MTQ1OTMwOSwgMC4xMzQxNDI0OTMyOTMsIDAuMTIxMjYyNjgxMzg0LAotICAgICAgMC4xMTE0NjQyOTkyOSwgMC4xMDM2OTc2Njc0NjMsIDAuMDk3MzQ5NjE0NzU2NSwgMC4wOTIwMzY3OTY4NzIsCi0gICAgICAwLjA4NzUwNjIyMjE4MzM7CisgIGV4cGVjdGVkX291dF9hcnJheSA8PCAtMC4wODc1MDYyMjIxODMzLCAtMC4wOTIwMzY3OTY4NzIsIC0wLjA5NzM0OTYxNDc1NjUsIC0wLjEwMzY5NzY2NzQ2MywgLTAuMTExNDY0Mjk5MjksCisgICAgICAtMC4xMjEyNjI2ODEzODQsIC0wLjEzNDE0MjQ5MzI5MywgLTAuMTUyMDUxNDU5MzA5LCAtMC4xNzg3NTA4Mzk1MDIsIC0wLjIxNTI2OTI4OTI0OSwgMC4wLCAwLjIxNTI2OTI4OTI0OSwKKyAgICAgIDAuMTc4NzUwODM5NTAyLCAwLjE1MjA1MTQ1OTMwOSwgMC4xMzQxNDI0OTMyOTMsIDAuMTIxMjYyNjgxMzg0LCAwLjExMTQ2NDI5OTI5LCAwLjEwMzY5NzY2NzQ2MywgMC4wOTczNDk2MTQ3NTY1LAorICAgICAgMC4wOTIwMzY3OTY4NzIsIDAuMDg3NTA2MjIyMTgzMzsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDIxOyArK2kpIHsKICAgICBpbl94KGkpID0gaW5feF9hcnJheShpKTsKQEAgLTEzOTMsOCArMTMxMiw3IEBACiAKICAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfaW4uYmVzc2VsX2kxZSgpOwogCi0gIGFzc2VydChncHVNZW1jcHlBc3luYyhvdXQuZGF0YSgpLCBkX291dCwgYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKKyAgYXNzZXJ0KGdwdU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBieXRlcywgZ3B1TWVtY3B5RGV2aWNlVG9Ib3N0LCBncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKICAgYXNzZXJ0KGdwdVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGdwdVN1Y2Nlc3MpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjE7ICsraSkgewpAQCAtMTQwNiw4ICsxMzI0LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KLXZvaWQgdGVzdF9ncHVfaWdhbW1hX2Rlcl9hKCkKLXsKK3ZvaWQgdGVzdF9ncHVfaWdhbW1hX2Rlcl9hKCkgewogICBUZW5zb3I8U2NhbGFyLCAxPiBpbl94KDMwKTsKICAgVGVuc29yPFNjYWxhciwgMT4gaW5fYSgzMCk7CiAgIFRlbnNvcjxTY2FsYXIsIDE+IG91dCgzMCk7CkBAIC0xNDIwLDI2ICsxMzM3LDIwIEBACiAKICAgLy8gU2VlIHNwZWNpYWxfZnVuY3Rpb25zLmNwcCBmb3IgdGhlIFB5dGhvbiBjb2RlIHRoYXQgZ2VuZXJhdGVzIHRoZSB0ZXN0IGRhdGEuCiAKLSAgaW5fYV9hcnJheSA8PCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjEsIDAuMSwgMC4xLCAwLjEsIDAuMSwgMS4wLCAxLjAsCi0gICAgICAxLjAsIDEuMCwgMS4wLCAxMC4wLCAxMC4wLCAxMC4wLCAxMC4wLCAxMC4wLCAxMDAuMCwgMTAwLjAsIDEwMC4wLCAxMDAuMCwKLSAgICAgIDEwMC4wLCAxMDAwLjAsIDEwMDAuMCwgMTAwMC4wLCAxMDAwLjAsIDEwMDAuMDsKKyAgaW5fYV9hcnJheSA8PCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjEsIDAuMSwgMC4xLCAwLjEsIDAuMSwgMS4wLCAxLjAsIDEuMCwgMS4wLCAxLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsCisgICAgICAxMC4wLCAxMDAuMCwgMTAwLjAsIDEwMC4wLCAxMDAuMCwgMTAwLjAsIDEwMDAuMCwgMTAwMC4wLCAxMDAwLjAsIDEwMDAuMCwgMTAwMC4wOwogCi0gIGluX3hfYXJyYXkgPDwgMS4yNTY2ODg5MDQwNWUtMjYsIDEuMTc1NDk0MzUwODJlLTM4LCAxLjIwOTM4OTA1MDcyZS0wNSwKLSAgICAgIDEuMTc1NDk0MzUwODJlLTM4LCAxLjE3NTQ5NDM1MDgyZS0zOCwgNS42NjU3MjA3MDY5NmUtMTYsIDAuMDEzMjg2NTA2MTA2NSwKLSAgICAgIDAuMDIwMDAzNDIwMzg1MywgNi4yOTI2MzcwOTExOGUtMTcsIDEuMzcxNjAzNjc3NjRlLTA2LCAwLjMzMzQxMjAzODI4OCwKLSAgICAgIDEuMTgxMzU2ODc3NjYsIDAuNTgwNjI5MDMzNzc3LCAwLjE3MDYzMTQzOTQyNiwgMC43ODY2ODY3Njg0NTgsCi0gICAgICA3LjYzODczMjc5NTM3LCAxMy4xOTQ0MzQ0Mzc5LCAxMS44OTYwNDIzNTQsIDEwLjU4MzAxNzI0MTcsIDEwLjUwMjA5NDIyMzMsCi0gICAgICA5Mi44OTE4NTg3NzQ3LCA5NS4wMDM3MjAzNzEsIDg2LjM3MTU5MjY0NjcsIDk2LjAzMzAyMTc2NzIsIDgyLjYzODk5MzA2NzcsCisgIGluX3hfYXJyYXkgPDwgMS4yNTY2ODg5MDQwNWUtMjYsIDEuMTc1NDk0MzUwODJlLTM4LCAxLjIwOTM4OTA1MDcyZS0wNSwgMS4xNzU0OTQzNTA4MmUtMzgsIDEuMTc1NDk0MzUwODJlLTM4LAorICAgICAgNS42NjU3MjA3MDY5NmUtMTYsIDAuMDEzMjg2NTA2MTA2NSwgMC4wMjAwMDM0MjAzODUzLCA2LjI5MjYzNzA5MTE4ZS0xNywgMS4zNzE2MDM2Nzc2NGUtMDYsIDAuMzMzNDEyMDM4Mjg4LAorICAgICAgMS4xODEzNTY4Nzc2NiwgMC41ODA2MjkwMzM3NzcsIDAuMTcwNjMxNDM5NDI2LCAwLjc4NjY4Njc2ODQ1OCwgNy42Mzg3MzI3OTUzNywgMTMuMTk0NDM0NDM3OSwgMTEuODk2MDQyMzU0LAorICAgICAgMTAuNTgzMDE3MjQxNywgMTAuNTAyMDk0MjIzMywgOTIuODkxODU4Nzc0NywgOTUuMDAzNzIwMzcxLCA4Ni4zNzE1OTI2NDY3LCA5Ni4wMzMwMjE3NjcyLCA4Mi42Mzg5OTMwNjc3LAogICAgICAgOTY4LjcwMjkwNjc1NCwgOTY5LjQ2MzU0NjgyOCwgMTAwMS43OTcyNjAyMiwgOTU1LjA0NzQxNjU0NywgMTA0NC4yNzQ1ODU2ODsKIAotICBleHBlY3RlZF9vdXRfYXJyYXkgPDwgLTMyLjcyNTY0NDE0NDEsIC0zNi40Mzk0MTUwNTE0LCAtOS42NjQ2NzYxMjI2MywKLSAgICAgIC0zNi40Mzk0MTUwNTE0LCAtMzYuNDM5NDE1MDUxNCwgLTEuMDg5MTkwMDMwMiwgLTIuNjYzNTEyMjk2NDUsCi0gICAgICAtMi40ODY2Njg2ODU5NiwgLTAuOTI5NzAwNDk0NDI4LCAtMy41NjMyNzcyMjc2NCwgLTAuNDU1MzIwMTM1MzE0LAotICAgICAgLTAuMzkxNDM3MjE0MzIzLCAtMC40OTEzNTIwNTU5OTEsIC0wLjM1MDQ1NDgzNDI5MiwgLTAuNDcxNzczMTYyOTIxLAotICAgICAgLTAuMTA0MDg0NDQwNTIyLCAtMC4wNzIzNjQ2NzQ3OTA5LCAtMC4wOTkyODI4OTc1NTMyLCAtMC4xMjE2MzgyMTU0NDYsCi0gICAgICAtMC4xMjI2MTk2MDUyOTQsIC0wLjAzMTc2NzAyNjcyODYsIC0wLjAzNTk5NzQ4MTI4NjksIC0wLjAxNTQzNTkyMjUzNjMsCi0gICAgICAtMC4wMzc1Nzc1MzY1OTIxLCAtMC4wMDc5NDg5OTE1MzY1MywgLTAuMDA3NzczMDMyMTkyMTEsIC0wLjAwNzk2MDg1NzgyMDQyLAotICAgICAgLTAuMDEyNTg1MDcxOTM5NywgLTAuMDA0NTU1MDAyMDY5NTgsIC0wLjAwNDc2NDM2OTkzMTQ4OworICBleHBlY3RlZF9vdXRfYXJyYXkgPDwgLTMyLjcyNTY0NDE0NDEsIC0zNi40Mzk0MTUwNTE0LCAtOS42NjQ2NzYxMjI2MywgLTM2LjQzOTQxNTA1MTQsIC0zNi40Mzk0MTUwNTE0LCAtMS4wODkxOTAwMzAyLAorICAgICAgLTIuNjYzNTEyMjk2NDUsIC0yLjQ4NjY2ODY4NTk2LCAtMC45Mjk3MDA0OTQ0MjgsIC0zLjU2MzI3NzIyNzY0LCAtMC40NTUzMjAxMzUzMTQsIC0wLjM5MTQzNzIxNDMyMywKKyAgICAgIC0wLjQ5MTM1MjA1NTk5MSwgLTAuMzUwNDU0ODM0MjkyLCAtMC40NzE3NzMxNjI5MjEsIC0wLjEwNDA4NDQ0MDUyMiwgLTAuMDcyMzY0Njc0NzkwOSwgLTAuMDk5MjgyODk3NTUzMiwKKyAgICAgIC0wLjEyMTYzODIxNTQ0NiwgLTAuMTIyNjE5NjA1Mjk0LCAtMC4wMzE3NjcwMjY3Mjg2LCAtMC4wMzU5OTc0ODEyODY5LCAtMC4wMTU0MzU5MjI1MzYzLCAtMC4wMzc1Nzc1MzY1OTIxLAorICAgICAgLTAuMDA3OTQ4OTkxNTM2NTMsIC0wLjAwNzc3MzAzMjE5MjExLCAtMC4wMDc5NjA4NTc4MjA0MiwgLTAuMDEyNTg1MDcxOTM5NywgLTAuMDA0NTU1MDAyMDY5NTgsIC0wLjAwNDc2NDM2OTkzMTQ4OwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzA7ICsraSkgewogICAgIGluX3goaSkgPSBpbl94X2FycmF5KGkpOwpAQCAtMTQ2OCw4ICsxMzc5LDcgQEAKIAogICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9hLmlnYW1tYV9kZXJfYShncHVfeCk7CiAKLSAgYXNzZXJ0KGdwdU1lbWNweUFzeW5jKG91dC5kYXRhKCksIGRfb3V0LCBieXRlcywgZ3B1TWVtY3B5RGV2aWNlVG9Ib3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGdwdVN1Y2Nlc3MpOworICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmMob3V0LmRhdGEoKSwgZF9vdXQsIGJ5dGVzLCBncHVNZW1jcHlEZXZpY2VUb0hvc3QsIGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGdwdVN1Y2Nlc3MpOwogICBhc3NlcnQoZ3B1U3RyZWFtU3luY2hyb25pemUoZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMDsgKytpKSB7CkBAIC0xNDgyLDggKzEzOTIsNyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgotdm9pZCB0ZXN0X2dwdV9nYW1tYV9zYW1wbGVfZGVyX2FscGhhKCkKLXsKK3ZvaWQgdGVzdF9ncHVfZ2FtbWFfc2FtcGxlX2Rlcl9hbHBoYSgpIHsKICAgVGVuc29yPFNjYWxhciwgMT4gaW5fYWxwaGEoMzApOwogICBUZW5zb3I8U2NhbGFyLCAxPiBpbl9zYW1wbGUoMzApOwogICBUZW5zb3I8U2NhbGFyLCAxPiBvdXQoMzApOwpAQCAtMTQ5NiwyNiArMTQwNSwyMCBAQAogCiAgIC8vIFNlZSBzcGVjaWFsX2Z1bmN0aW9ucy5jcHAgZm9yIHRoZSBQeXRob24gY29kZSB0aGF0IGdlbmVyYXRlcyB0aGUgdGVzdCBkYXRhLgogCi0gIGluX2FscGhhX2FycmF5IDw8IDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMSwgMC4xLCAwLjEsIDAuMSwgMC4xLCAxLjAsCi0gICAgICAxLjAsIDEuMCwgMS4wLCAxLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwMC4wLCAxMDAuMCwgMTAwLjAsCi0gICAgICAxMDAuMCwgMTAwLjAsIDEwMDAuMCwgMTAwMC4wLCAxMDAwLjAsIDEwMDAuMCwgMTAwMC4wOworICBpbl9hbHBoYV9hcnJheSA8PCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjEsIDAuMSwgMC4xLCAwLjEsIDAuMSwgMS4wLCAxLjAsIDEuMCwgMS4wLCAxLjAsIDEwLjAsIDEwLjAsIDEwLjAsCisgICAgICAxMC4wLCAxMC4wLCAxMDAuMCwgMTAwLjAsIDEwMC4wLCAxMDAuMCwgMTAwLjAsIDEwMDAuMCwgMTAwMC4wLCAxMDAwLjAsIDEwMDAuMCwgMTAwMC4wOwogCi0gIGluX3NhbXBsZV9hcnJheSA8PCAxLjI1NjY4ODkwNDA1ZS0yNiwgMS4xNzU0OTQzNTA4MmUtMzgsIDEuMjA5Mzg5MDUwNzJlLTA1LAotICAgICAgMS4xNzU0OTQzNTA4MmUtMzgsIDEuMTc1NDk0MzUwODJlLTM4LCA1LjY2NTcyMDcwNjk2ZS0xNiwgMC4wMTMyODY1MDYxMDY1LAotICAgICAgMC4wMjAwMDM0MjAzODUzLCA2LjI5MjYzNzA5MTE4ZS0xNywgMS4zNzE2MDM2Nzc2NGUtMDYsIDAuMzMzNDEyMDM4Mjg4LAotICAgICAgMS4xODEzNTY4Nzc2NiwgMC41ODA2MjkwMzM3NzcsIDAuMTcwNjMxNDM5NDI2LCAwLjc4NjY4Njc2ODQ1OCwKLSAgICAgIDcuNjM4NzMyNzk1MzcsIDEzLjE5NDQzNDQzNzksIDExLjg5NjA0MjM1NCwgMTAuNTgzMDE3MjQxNywgMTAuNTAyMDk0MjIzMywKLSAgICAgIDkyLjg5MTg1ODc3NDcsIDk1LjAwMzcyMDM3MSwgODYuMzcxNTkyNjQ2NywgOTYuMDMzMDIxNzY3MiwgODIuNjM4OTkzMDY3NywKKyAgaW5fc2FtcGxlX2FycmF5IDw8IDEuMjU2Njg4OTA0MDVlLTI2LCAxLjE3NTQ5NDM1MDgyZS0zOCwgMS4yMDkzODkwNTA3MmUtMDUsIDEuMTc1NDk0MzUwODJlLTM4LCAxLjE3NTQ5NDM1MDgyZS0zOCwKKyAgICAgIDUuNjY1NzIwNzA2OTZlLTE2LCAwLjAxMzI4NjUwNjEwNjUsIDAuMDIwMDAzNDIwMzg1MywgNi4yOTI2MzcwOTExOGUtMTcsIDEuMzcxNjAzNjc3NjRlLTA2LCAwLjMzMzQxMjAzODI4OCwKKyAgICAgIDEuMTgxMzU2ODc3NjYsIDAuNTgwNjI5MDMzNzc3LCAwLjE3MDYzMTQzOTQyNiwgMC43ODY2ODY3Njg0NTgsIDcuNjM4NzMyNzk1MzcsIDEzLjE5NDQzNDQzNzksIDExLjg5NjA0MjM1NCwKKyAgICAgIDEwLjU4MzAxNzI0MTcsIDEwLjUwMjA5NDIyMzMsIDkyLjg5MTg1ODc3NDcsIDk1LjAwMzcyMDM3MSwgODYuMzcxNTkyNjQ2NywgOTYuMDMzMDIxNzY3MiwgODIuNjM4OTkzMDY3NywKICAgICAgIDk2OC43MDI5MDY3NTQsIDk2OS40NjM1NDY4MjgsIDEwMDEuNzk3MjYwMjIsIDk1NS4wNDc0MTY1NDcsIDEwNDQuMjc0NTg1Njg7CiAKLSAgZXhwZWN0ZWRfb3V0X2FycmF5IDw8IDcuNDI0MjQ3NDIzNjdlLTIzLCAxLjAyMDA0Mjk3Mjg3ZS0zNCwgMC4wMTMwMTU1MjQwNzM4LAotICAgICAgMS4wMjAwNDI5NzI4N2UtMzQsIDEuMDIwMDQyOTcyODdlLTM0LCAxLjk2NTA1MTY4Mjc3ZS0xMywgMC41MjU1NzU3ODYyNDMsCi0gICAgICAwLjcxMzkwMzk5MTc3MSwgMi4zMjA3NzU2MTgwOGUtMTQsIDAuMDAwMTc5MzQ4MDQ5ODg2LCAwLjYzNTUwMDQ1MzMwMiwKLSAgICAgIDEuMjc1NjEyODQ5MTcsIDAuODc4MTI1ODUyMTU2LCAwLjQxNTY1ODE5NTM4LCAxLjAzNjA2NDg4NTM0LAotICAgICAgMC44ODU5NjQ4MjQ4ODcsIDEuMTY0MjQwNDkzMzQsIDEuMTA3NjQ0Nzk1OTgsIDEuMDQ1OTA4MTA4MTIsCi0gICAgICAxLjA0MTkzNjY2OTYzLCAwLjk2NTE5MzE1MjQxNCwgMC45NzYyMTc1ODk0NjQsIDAuOTMwMDgwMzUwNjEsCi0gICAgICAwLjk4MTUzMjE2MDk2LCAwLjkwOTE5NjM5NzY5OCwgMC45ODQzNDk2Mzk5MywgMC45ODQ3MzgwNTAyMDYsCi0gICAgICAxLjAwMTA2NDkyNTI1LCAwLjk3NzM0MjAwNjQ5LCAxLjAyMTk4Nzk0MTc5OworICBleHBlY3RlZF9vdXRfYXJyYXkgPDwgNy40MjQyNDc0MjM2N2UtMjMsIDEuMDIwMDQyOTcyODdlLTM0LCAwLjAxMzAxNTUyNDA3MzgsIDEuMDIwMDQyOTcyODdlLTM0LCAxLjAyMDA0Mjk3Mjg3ZS0zNCwKKyAgICAgIDEuOTY1MDUxNjgyNzdlLTEzLCAwLjUyNTU3NTc4NjI0MywgMC43MTM5MDM5OTE3NzEsIDIuMzIwNzc1NjE4MDhlLTE0LCAwLjAwMDE3OTM0ODA0OTg4NiwgMC42MzU1MDA0NTMzMDIsCisgICAgICAxLjI3NTYxMjg0OTE3LCAwLjg3ODEyNTg1MjE1NiwgMC40MTU2NTgxOTUzOCwgMS4wMzYwNjQ4ODUzNCwgMC44ODU5NjQ4MjQ4ODcsIDEuMTY0MjQwNDkzMzQsIDEuMTA3NjQ0Nzk1OTgsCisgICAgICAxLjA0NTkwODEwODEyLCAxLjA0MTkzNjY2OTYzLCAwLjk2NTE5MzE1MjQxNCwgMC45NzYyMTc1ODk0NjQsIDAuOTMwMDgwMzUwNjEsIDAuOTgxNTMyMTYwOTYsIDAuOTA5MTk2Mzk3Njk4LAorICAgICAgMC45ODQzNDk2Mzk5MywgMC45ODQ3MzgwNTAyMDYsIDEuMDAxMDY0OTI1MjUsIDAuOTc3MzQyMDA2NDksIDEuMDIxOTg3OTQxNzk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMDsgKytpKSB7CiAgICAgaW5fYWxwaGEoaSkgPSBpbl9hbHBoYV9hcnJheShpKTsKQEAgLTE1NDQsOCArMTQ0Nyw3IEBACiAKICAgZ3B1X291dC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfYWxwaGEuZ2FtbWFfc2FtcGxlX2Rlcl9hbHBoYShncHVfc2FtcGxlKTsKIAotICBhc3NlcnQoZ3B1TWVtY3B5QXN5bmMob3V0LmRhdGEoKSwgZF9vdXQsIGJ5dGVzLCBncHVNZW1jcHlEZXZpY2VUb0hvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CisgIGFzc2VydChncHVNZW1jcHlBc3luYyhvdXQuZGF0YSgpLCBkX291dCwgYnl0ZXMsIGdwdU1lbWNweURldmljZVRvSG9zdCwgZ3B1X2RldmljZS5zdHJlYW0oKSkgPT0gZ3B1U3VjY2Vzcyk7CiAgIGFzc2VydChncHVTdHJlYW1TeW5jaHJvbml6ZShncHVfZGV2aWNlLnN0cmVhbSgpKSA9PSBncHVTdWNjZXNzKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDMwOyArK2kpIHsKQEAgLTE1NTcsMTMgKzE0NTksMTEgQEAKICAgZ3B1RnJlZShkX291dCk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfZ3B1KQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9ncHUpIHsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9ncHVfbnVsbGFyeSgpKTsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9ncHVfbnVsbGFyeV9tYXhfc2l6ZTxpbnQxNl90PigpKTsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9ncHVfbnVsbGFyeV9tYXhfc2l6ZTxpbnQzMl90PigpKTsKLSAgQ0FMTF9TVUJURVNUXzEoKHRlc3RfZ3B1X251bGxhcnlfbWF4X3NpemU8Ci0gICAgICAgICAgICAgICAgICBpbnQ2NF90LCAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpICsgMTAwbGw+KCkpKTsKKyAgQ0FMTF9TVUJURVNUXzEoKHRlc3RfZ3B1X251bGxhcnlfbWF4X3NpemU8aW50NjRfdCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSArIDEwMGxsPigpKSk7CiAgIENBTExfU1VCVEVTVF8xKHRlc3RfZ3B1X2VsZW1lbnR3aXNlX3NtYWxsKCkpOwogICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2dwdV9lbGVtZW50d2lzZSgpKTsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9ncHVfcHJvcHMoKSk7CkBAIC0xNTc3LDggKzE0NzcsOCBAQAogICBDQUxMX1NVQlRFU1RfMyh0ZXN0X2dwdV9jb252b2x1dGlvbl8yZDxDb2xNYWpvcj4oKSk7CiAgIENBTExfU1VCVEVTVF8zKHRlc3RfZ3B1X2NvbnZvbHV0aW9uXzJkPFJvd01ham9yPigpKTsKICNpZiAhZGVmaW5lZChFSUdFTl9VU0VfSElQKQotLy8gZGlzYWJsZSB0aGVzZSB0ZXN0cyBvbiBISVAgZm9yIG5vdy4KLS8vIHRoZXkgaGFuZy4ubmVlZCB0byBpbnZlc3RpZ2F0ZSBhbmQgZml4CisgIC8vIGRpc2FibGUgdGhlc2UgdGVzdHMgb24gSElQIGZvciBub3cuCisgIC8vIHRoZXkgaGFuZy4ubmVlZCB0byBpbnZlc3RpZ2F0ZSBhbmQgZml4CiAgIENBTExfU1VCVEVTVF8zKHRlc3RfZ3B1X2NvbnZvbHV0aW9uXzNkPENvbE1ham9yPigpKTsKICAgQ0FMTF9TVUJURVNUXzModGVzdF9ncHVfY29udm9sdXRpb25fM2Q8Um93TWFqb3I+KCkpOwogI2VuZGlmCkBAIC0xNjAzLDcgKzE1MDMsNyBAQAogCiAgIENBTExfU1VCVEVTVF80KHRlc3RfZ3B1X2VyZmM8ZmxvYXQ+KDEuMGYpKTsKICAgLy8gQ0FMTF9TVUJURVNUKHRlc3RfZ3B1X2VyZmM8ZmxvYXQ+KDEwMC4wZikpOwotICBDQUxMX1NVQlRFU1RfNCh0ZXN0X2dwdV9lcmZjPGZsb2F0Pig1LjBmKSk7IC8vIEdQVSBlcmZjIGxhY2tzIHByZWNpc2lvbiBmb3IgbGFyZ2UgaW5wdXRzCisgIENBTExfU1VCVEVTVF80KHRlc3RfZ3B1X2VyZmM8ZmxvYXQ+KDUuMGYpKTsgIC8vIEdQVSBlcmZjIGxhY2tzIHByZWNpc2lvbiBmb3IgbGFyZ2UgaW5wdXRzCiAgIENBTExfU1VCVEVTVF80KHRlc3RfZ3B1X2VyZmM8ZmxvYXQ+KDAuMDFmKSk7CiAgIENBTExfU1VCVEVTVF80KHRlc3RfZ3B1X2VyZmM8ZmxvYXQ+KDAuMDAxZikpOwogCkBAIC0xNjE0LDEyICsxNTE0LDEyIEBACiAKICAgQ0FMTF9TVUJURVNUXzQodGVzdF9ncHVfZXJmYzxkb3VibGU+KDEuMCkpOwogICAvLyBDQUxMX1NVQlRFU1QodGVzdF9ncHVfZXJmYzxkb3VibGU+KDEwMC4wKSk7Ci0gIENBTExfU1VCVEVTVF80KHRlc3RfZ3B1X2VyZmM8ZG91YmxlPig1LjApKTsgLy8gR1BVIGVyZmMgbGFja3MgcHJlY2lzaW9uIGZvciBsYXJnZSBpbnB1dHMKKyAgQ0FMTF9TVUJURVNUXzQodGVzdF9ncHVfZXJmYzxkb3VibGU+KDUuMCkpOyAgLy8gR1BVIGVyZmMgbGFja3MgcHJlY2lzaW9uIGZvciBsYXJnZSBpbnB1dHMKICAgQ0FMTF9TVUJURVNUXzQodGVzdF9ncHVfZXJmYzxkb3VibGU+KDAuMDEpKTsKICAgQ0FMTF9TVUJURVNUXzQodGVzdF9ncHVfZXJmYzxkb3VibGU+KDAuMDAxKSk7CiAKICNpZiAhZGVmaW5lZChFSUdFTl9VU0VfSElQKQotLy8gZGlzYWJsZSB0aGVzZSB0ZXN0cyBvbiBISVAgZm9yIG5vdy4KKyAgLy8gZGlzYWJsZSB0aGVzZSB0ZXN0cyBvbiBISVAgZm9yIG5vdy4KIAogICBDQUxMX1NVQlRFU1RfNSh0ZXN0X2dwdV9uZHRyaTxmbG9hdD4oKSk7CiAgIENBTExfU1VCVEVTVF81KHRlc3RfZ3B1X25kdHJpPGRvdWJsZT4oKSk7CkBAIC0xNjQxLDcgKzE1NDEsNyBAQAogICBDQUxMX1NVQlRFU1RfNSh0ZXN0X2dwdV9pZ2FtbWFjPGRvdWJsZT4oKSk7CiAKICNpZiAhZGVmaW5lZChFSUdFTl9VU0VfSElQKQotLy8gZGlzYWJsZSB0aGVzZSB0ZXN0cyBvbiBISVAgZm9yIG5vdy4KKyAgLy8gZGlzYWJsZSB0aGVzZSB0ZXN0cyBvbiBISVAgZm9yIG5vdy4KICAgQ0FMTF9TVUJURVNUXzYodGVzdF9ncHVfYmV0YWluYzxmbG9hdD4oKSk7CiAgIENBTExfU1VCVEVTVF82KHRlc3RfZ3B1X2JldGFpbmM8ZG91YmxlPigpKTsKIApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfaWZmdC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pZmZ0LmNwcAppbmRleCBjMjBlZGQ5Li4zNDMzYWVhIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pZmZ0LmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pZmZ0LmNwcApAQCAtNTgsOCArNTgsOSBAQAogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGltMDsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkaW0xOyArK2opIHsKLSAgICAgIC8vc3RkOjpjb3V0IDw8ICJbIiA8PCBpIDw8ICJdWyIgPDwgaiA8PCAiXSIgPDwgICIgIE9yaWdpbmFsIGRhdGE6ICIgPDwgdGVuc29yKGksaikgPDwgIiBUcmFuc2Zvcm1lZCBkYXRhOiIgPDwgdGVuc29yX2FmdGVyX2ZmdF9pZmZ0KGksaikgPDwgc3RkOjplbmRsOwotICAgICAgVkVSSUZZX0lTX0FQUFJPWChzdGF0aWNfY2FzdDxmbG9hdD4odGVuc29yKGksaikpLCBzdGF0aWNfY2FzdDxmbG9hdD4oc3RkOjpyZWFsKHRlbnNvcl9hZnRlcl9mZnRfaWZmdChpLGopKSkpOworICAgICAgLy8gc3RkOjpjb3V0IDw8ICJbIiA8PCBpIDw8ICJdWyIgPDwgaiA8PCAiXSIgPDwgICIgIE9yaWdpbmFsIGRhdGE6ICIgPDwgdGVuc29yKGksaikgPDwgIiBUcmFuc2Zvcm1lZCBkYXRhOiIgPDwKKyAgICAgIC8vIHRlbnNvcl9hZnRlcl9mZnRfaWZmdChpLGopIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRlbnNvcihpLCBqKSksIHN0YXRpY19jYXN0PGZsb2F0PihzdGQ6OnJlYWwodGVuc29yX2FmdGVyX2ZmdF9pZmZ0KGksIGopKSkpOwogICAgIH0KICAgfQogfQpAQCAtOTAsNyArOTEsOCBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IGRpbTA7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGltMTsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGRpbTI7ICsraykgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHN0YXRpY19jYXN0PGZsb2F0Pih0ZW5zb3IoaSxqLGspKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHN0ZDo6cmVhbCh0ZW5zb3JfYWZ0ZXJfZmZ0X2lmZnQoaSxqLGspKSkpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHN0YXRpY19jYXN0PGZsb2F0Pih0ZW5zb3IoaSwgaiwgaykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihzdGQ6OnJlYWwodGVuc29yX2FmdGVyX2ZmdF9pZmZ0KGksIGosIGspKSkpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMTI0LDcgKzEyNiw4IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkaW0xOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZGltMjsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgZGltMzsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChzdGF0aWNfY2FzdDxmbG9hdD4odGVuc29yKGksaixrLGwpKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRlbnNvcl9hZnRlcl9mZnRfaWZmdChpLGosayxsKSkpOworICAgICAgICAgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRlbnNvcihpLCBqLCBrLCBsKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4odGVuc29yX2FmdGVyX2ZmdF9pZmZ0KGksIGosIGssIGwpKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0xMzUsMjAgKzEzOCwyMCBAQAogICBDQUxMX1NVQlRFU1QodGVzdF8xRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDQpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfMURfZmZ0X2lmZnRfaW52YXJpYW50PENvbE1ham9yPigxNikpOwogICBDQUxMX1NVQlRFU1QodGVzdF8xRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDMyKSk7Ci0gIENBTExfU1VCVEVTVCh0ZXN0XzFEX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oMTAyNCoxMDI0KSk7CisgIENBTExfU1VCVEVTVCh0ZXN0XzFEX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oMTAyNCAqIDEwMjQpKTsKIAotICBDQUxMX1NVQlRFU1QodGVzdF8yRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDQsNCkpOwotICBDQUxMX1NVQlRFU1QodGVzdF8yRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDgsMTYpKTsKLSAgQ0FMTF9TVUJURVNUKHRlc3RfMkRfZmZ0X2lmZnRfaW52YXJpYW50PENvbE1ham9yPigxNiwzMikpOwotICBDQUxMX1NVQlRFU1QodGVzdF8yRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDEwMjQsMTAyNCkpOworICBDQUxMX1NVQlRFU1QodGVzdF8yRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDQsIDQpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfMkRfZmZ0X2lmZnRfaW52YXJpYW50PENvbE1ham9yPig4LCAxNikpOworICBDQUxMX1NVQlRFU1QodGVzdF8yRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDE2LCAzMikpOworICBDQUxMX1NVQlRFU1QodGVzdF8yRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDEwMjQsIDEwMjQpKTsKIAotICBDQUxMX1NVQlRFU1QodGVzdF8zRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDQsNCw0KSk7Ci0gIENBTExfU1VCVEVTVCh0ZXN0XzNEX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oOCwxNiwzMikpOwotICBDQUxMX1NVQlRFU1QodGVzdF8zRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDE2LDQsOCkpOwotICBDQUxMX1NVQlRFU1QodGVzdF8zRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDI1NiwyNTYsMjU2KSk7CisgIENBTExfU1VCVEVTVCh0ZXN0XzNEX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oNCwgNCwgNCkpOworICBDQUxMX1NVQlRFU1QodGVzdF8zRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDgsIDE2LCAzMikpOworICBDQUxMX1NVQlRFU1QodGVzdF8zRF9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDE2LCA0LCA4KSk7CisgIENBTExfU1VCVEVTVCh0ZXN0XzNEX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oMjU2LCAyNTYsIDI1NikpOwogCi0gIENBTExfU1VCVEVTVCh0ZXN0X3N1Yl9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDQsNCw0LDQpKTsKLSAgQ0FMTF9TVUJURVNUKHRlc3Rfc3ViX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oOCwxNiwzMiw2NCkpOwotICBDQUxMX1NVQlRFU1QodGVzdF9zdWJfZmZ0X2lmZnRfaW52YXJpYW50PENvbE1ham9yPigxNiw0LDgsMTIpKTsKLSAgQ0FMTF9TVUJURVNUKHRlc3Rfc3ViX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oNjQsNjQsNjQsNjQpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc3ViX2ZmdF9pZmZ0X2ludmFyaWFudDxDb2xNYWpvcj4oNCwgNCwgNCwgNCkpOworICBDQUxMX1NVQlRFU1QodGVzdF9zdWJfZmZ0X2lmZnRfaW52YXJpYW50PENvbE1ham9yPig4LCAxNiwgMzIsIDY0KSk7CisgIENBTExfU1VCVEVTVCh0ZXN0X3N1Yl9mZnRfaWZmdF9pbnZhcmlhbnQ8Q29sTWFqb3I+KDE2LCA0LCA4LCAxMikpOworICBDQUxMX1NVQlRFU1QodGVzdF9zdWJfZmZ0X2lmZnRfaW52YXJpYW50PENvbE1ham9yPig2NCwgNjQsIDY0LCA2NCkpOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfaW1hZ2Vfb3Bfc3ljbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbWFnZV9vcF9zeWNsLmNwcAppbmRleCAwODNjMDA0Li4yYWVkYWY2IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbWFnZV9vcF9zeWNsLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbWFnZV9vcF9zeWNsLmNwcApAQCAtMjUsNTkgKzI1LDU1IEBACiB1c2luZyBFaWdlbjo6VGVuc29yOwogdXNpbmcgRWlnZW46OlRlbnNvck1hcDsKIAotdXNpbmcgRWlnZW46OlRlbnNvcjsKIHVzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X2ltYWdlX29wX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKQoteworc3RhdGljIHZvaWQgdGVzdF9pbWFnZV9vcF9zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBJbmRleFR5cGUgc2l6ZURpbTEgPSAyNDU7CiAgIEluZGV4VHlwZSBzaXplRGltMiA9IDM0MzsKICAgSW5kZXhUeXBlIHNpemVEaW0zID0gNTc3OwogCi0gIGFycmF5PEluZGV4VHlwZSwgMz4gaW5wdXRfcmFuZ2UgPXt7c2l6ZURpbTEsIHNpemVEaW0yLCBzaXplRGltM319OwotICBhcnJheTxJbmRleFR5cGUsIDM+IHNsaWNlX3JhbmdlID17e3NpemVEaW0xLTEsIHNpemVEaW0yLCBzaXplRGltM319OworICBhcnJheTxJbmRleFR5cGUsIDM+IGlucHV0X3JhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zfX07CisgIGFycmF5PEluZGV4VHlwZSwgMz4gc2xpY2VfcmFuZ2UgPSB7e3NpemVEaW0xIC0gMSwgc2l6ZURpbTIsIHNpemVEaW0zfX07CiAKLSAgVGVuc29yPERhdGFUeXBlLCAzLERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yMShpbnB1dF9yYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMyxEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHRlbnNvcjIoaW5wdXRfcmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yMShpbnB1dF9yYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPiB0ZW5zb3IyKGlucHV0X3JhbmdlKTsKICAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHRlbnNvcjMoc2xpY2VfcmFuZ2UpOwogICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yM19jcHUoc2xpY2VfcmFuZ2UpOwogCi0KLQogICB0eXBlZGVmIEVpZ2VuOjpEU2l6ZXM8SW5kZXhUeXBlLCAzPiBJbmRleDM7Ci0gIEluZGV4MyBzdHJpZGVzMSgxTCwxTCwgMUwpOworICBJbmRleDMgc3RyaWRlczEoMUwsIDFMLCAxTCk7CiAgIEluZGV4MyBpbmRpY2VzU3RhcnQxKDFMLCAwTCwgMEwpOwogICBJbmRleDMgaW5kaWNlc1N0b3AxKHNpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTMpOwogCi0gIEluZGV4MyBzdHJpZGVzMigxTCwxTCwgMUwpOworICBJbmRleDMgc3RyaWRlczIoMUwsIDFMLCAxTCk7CiAgIEluZGV4MyBpbmRpY2VzU3RhcnQyKDBMLCAwTCwgMEwpOwotICBJbmRleDMgaW5kaWNlc1N0b3AyKHNpemVEaW0xLTEsIHNpemVEaW0yLCBzaXplRGltMyk7Ci0gIEVpZ2VuOjpEU2l6ZXM8SW5kZXhUeXBlLCAzPiBzaXplcyhzaXplRGltMS0xLHNpemVEaW0yLHNpemVEaW0zKTsKKyAgSW5kZXgzIGluZGljZXNTdG9wMihzaXplRGltMSAtIDEsIHNpemVEaW0yLCBzaXplRGltMyk7CisgIEVpZ2VuOjpEU2l6ZXM8SW5kZXhUeXBlLCAzPiBzaXplcyhzaXplRGltMSAtIDEsIHNpemVEaW0yLCBzaXplRGltMyk7CiAKICAgdGVuc29yMS5zZXRSYW5kb20oKTsKICAgdGVuc29yMi5zZXRSYW5kb20oKTsKIAotCi0gIERhdGFUeXBlKiBncHVfZGF0YTEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3IxLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YTIgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3IyLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YTMgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3IzLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YTEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcjEuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGEyID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3IyLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhMyA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yMy5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAKICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MShncHVfZGF0YTEsIGlucHV0X3JhbmdlKTsKICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsIGlucHV0X3JhbmdlKTsKICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MyhncHVfZGF0YTMsIHNsaWNlX3JhbmdlKTsKIAotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IxLmRhdGEoKSwodGVuc29yMS5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGEyLCB0ZW5zb3IyLmRhdGEoKSwodGVuc29yMi5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotICBncHUzLmRldmljZShzeWNsX2RldmljZSk9IGdwdTEuc2xpY2UoaW5kaWNlc1N0YXJ0MSwgc2l6ZXMpIC0gZ3B1Mi5zbGljZShpbmRpY2VzU3RhcnQyLCBzaXplcyk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3IzLmRhdGEoKSwgZ3B1X2RhdGEzLCh0ZW5zb3IzLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YTEsIHRlbnNvcjEuZGF0YSgpLCAodGVuc29yMS5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YTIsIHRlbnNvcjIuZGF0YSgpLCAodGVuc29yMi5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIGdwdTMuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdTEuc2xpY2UoaW5kaWNlc1N0YXJ0MSwgc2l6ZXMpIC0gZ3B1Mi5zbGljZShpbmRpY2VzU3RhcnQyLCBzaXplcyk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3IzLmRhdGEoKSwgZ3B1X2RhdGEzLCAodGVuc29yMy5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAKLSAgdGVuc29yM19jcHUgPSB0ZW5zb3IxLnN0cmlkZWRTbGljZShpbmRpY2VzU3RhcnQxLGluZGljZXNTdG9wMSxzdHJpZGVzMSkgLSB0ZW5zb3IyLnN0cmlkZWRTbGljZShpbmRpY2VzU3RhcnQyLGluZGljZXNTdG9wMixzdHJpZGVzMik7CisgIHRlbnNvcjNfY3B1ID0gdGVuc29yMS5zdHJpZGVkU2xpY2UoaW5kaWNlc1N0YXJ0MSwgaW5kaWNlc1N0b3AxLCBzdHJpZGVzMSkgLQorICAgICAgICAgICAgICAgIHRlbnNvcjIuc3RyaWRlZFNsaWNlKGluZGljZXNTdGFydDIsIGluZGljZXNTdG9wMiwgc3RyaWRlczIpOwogCi0KLSAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPHNsaWNlX3JhbmdlWzBdIDsgKytpKSB7CisgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgc2xpY2VfcmFuZ2VbMF07ICsraSkgewogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgc2xpY2VfcmFuZ2VbMV07ICsraikgewogICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCBzbGljZV9yYW5nZVsyXTsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IzX2NwdShpLGosayksIHRlbnNvcjMoaSxqLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjNfY3B1KGksIGosIGspLCB0ZW5zb3IzKGksIGosIGspKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTg2LDE5ICs4MiwxOSBAQAogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9kYXRhMyk7CiB9CiAKLQotdGVtcGxhdGU8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIGRldl9TZWxlY3Rvcj4gdm9pZCBzeWNsX2NvbXB1dGluZ190ZXN0X3Blcl9kZXZpY2UoZGV2X1NlbGVjdG9yIHMpewordGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBkZXZfU2VsZWN0b3I+Cit2b2lkIHN5Y2xfY29tcHV0aW5nX3Rlc3RfcGVyX2RldmljZShkZXZfU2VsZWN0b3IgcykgewogICBRdWV1ZUludGVyZmFjZSBxdWV1ZUludGVyZmFjZShzKTsKICAgYXV0byBzeWNsX2RldmljZSA9IEVpZ2VuOjpTeWNsRGV2aWNlKCZxdWV1ZUludGVyZmFjZSk7CiAgIHRlc3RfaW1hZ2Vfb3Bfc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKIH0KIAogRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9pbWFnZV9vcF9zeWNsKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDpFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgeyAKKyAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgewogICAgIENBTExfU1VCVEVTVChzeWNsX2NvbXB1dGluZ190ZXN0X3Blcl9kZXZpY2U8aGFsZj4oZGV2aWNlKSk7Ci0gICBDQUxMX1NVQlRFU1Qoc3ljbF9jb21wdXRpbmdfdGVzdF9wZXJfZGV2aWNlPGZsb2F0PihkZXZpY2UpKTsKKyAgICBDQUxMX1NVQlRFU1Qoc3ljbF9jb21wdXRpbmdfdGVzdF9wZXJfZGV2aWNlPGZsb2F0PihkZXZpY2UpKTsKICNpZmRlZiBFSUdFTl9TWUNMX0RPVUJMRV9TVVBQT1JUCi0gICBDQUxMX1NVQlRFU1Qoc3ljbF9jb21wdXRpbmdfdGVzdF9wZXJfZGV2aWNlPGRvdWJsZT4oZGV2aWNlKSk7CisgICAgQ0FMTF9TVUJURVNUKHN5Y2xfY29tcHV0aW5nX3Rlc3RfcGVyX2RldmljZTxkb3VibGU+KGRldmljZSkpOwogI2VuZGlmCiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ltYWdlX3BhdGNoLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ltYWdlX3BhdGNoLmNwcAppbmRleCA4NjJmMWY3Li41NWQzYzZlIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbWFnZV9wYXRjaC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfaW1hZ2VfcGF0Y2guY3BwCkBAIC0xMyw5ICsxMyw4IEBACiAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKLXZvaWQgdGVzdF9zaW1wbGVfcGF0Y2goKQotewotICBUZW5zb3I8ZmxvYXQsIDQ+IHRlbnNvcigyLDMsNSw3KTsKK3ZvaWQgdGVzdF9zaW1wbGVfcGF0Y2goKSB7CisgIFRlbnNvcjxmbG9hdCwgND4gdGVuc29yKDIsIDMsIDUsIDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIFRlbnNvcjxmbG9hdCwgNCwgUm93TWFqb3I+IHRlbnNvcl9yb3dfbWFqb3IgPSB0ZW5zb3Iuc3dhcF9sYXlvdXQoKTsKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMCksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDMpKTsKQEAgLTI5LDE0ICsyOCwxNCBAQAogICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoLmRpbWVuc2lvbigwKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2guZGltZW5zaW9uKDEpLCAxKTsKICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaC5kaW1lbnNpb24oMiksIDEpOwotICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoLmRpbWVuc2lvbigzKSwgMyo1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaC5kaW1lbnNpb24oMyksIDMgKiA1KTsKICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaC5kaW1lbnNpb24oNCksIDcpOwogCiAgIC8vIFNpbmdsZSBwaXhlbCBwYXRjaDogUm93TWFqb3IKICAgVGVuc29yPGZsb2F0LCA1LCBSb3dNYWpvcj4gc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvcjsKICAgc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDEsIDEpOwogICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMCksIDcpOwotICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDMqNSk7CisgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigxKSwgMyAqIDUpOwogICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMiksIDEpOwogICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMyksIDEpOwogICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oNCksIDIpOwpAQCAtNDQsMjIgKzQzLDE4IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVuc29yLnNpemUoKTsgKytpKSB7CiAgICAgLy8gQ29sTWFqb3IKICAgICBpZiAodGVuc29yLmRhdGEoKVtpXSAhPSBzaW5nbGVfcGl4ZWxfcGF0Y2guZGF0YSgpW2ldKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4ICIgPDwgaSA8PCAiIDogIgotICAgICAgICAgICA8PCB0ZW5zb3IuZGF0YSgpW2ldIDw8ICIgdnMgIiA8PCBzaW5nbGVfcGl4ZWxfcGF0Y2guZGF0YSgpW2ldCi0gICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICIgOiAiIDw8IHRlbnNvci5kYXRhKClbaV0gPDwgIiB2cyAiCisgICAgICAgICAgICAgICAgPDwgc2luZ2xlX3BpeGVsX3BhdGNoLmRhdGEoKVtpXSA8PCBzdGQ6OmVuZGw7CiAgICAgfQogICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2guZGF0YSgpW2ldLCB0ZW5zb3IuZGF0YSgpW2ldKTsKICAgICAvLyBSb3dNYWpvcgogICAgIGlmICh0ZW5zb3Jfcm93X21ham9yLmRhdGEoKVtpXSAhPSBzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSkgewotICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIiA6ICIKLSAgICAgICAgICAgPDwgdGVuc29yLmRhdGEoKVtpXSA8PCAiIHZzICIKLSAgICAgICAgICAgPDwgc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kYXRhKClbaV0gPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIiA6ICIgPDwgdGVuc29yLmRhdGEoKVtpXSA8PCAiIHZzICIKKyAgICAgICAgICAgICAgICA8PCBzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSA8PCBzdGQ6OmVuZGw7CiAgICAgfQotICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSwKLSAgICAgICAgICAgICAgICAgICAgdGVuc29yX3Jvd19tYWpvci5kYXRhKClbaV0pOworICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSwgdGVuc29yX3Jvd19tYWpvci5kYXRhKClbaV0pOwogICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGF0YSgpW2ldLCB0ZW5zb3Jfcm93X21ham9yLmRhdGEoKVtpXSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaC5kYXRhKClbaV0sCi0gICAgICAgICAgICAgICAgICAgIHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IuZGF0YSgpW2ldKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoLmRhdGEoKVtpXSwgc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kYXRhKClbaV0pOwogICB9CiAKICAgLy8gRW50aXJlIGltYWdlIHBhdGNoOiBDb2xNYWpvcgpAQCAtNjgsNDUgKzYzLDQzIEBACiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2guZGltZW5zaW9uKDApLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaC5kaW1lbnNpb24oMSksIDMpOwogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoLmRpbWVuc2lvbigyKSwgNSk7Ci0gIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2guZGltZW5zaW9uKDMpLCAzKjUpOworICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoLmRpbWVuc2lvbigzKSwgMyAqIDUpOwogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoLmRpbWVuc2lvbig0KSwgNyk7CiAKICAgLy8gRW50aXJlIGltYWdlIHBhdGNoOiBSb3dNYWpvcgogICBUZW5zb3I8ZmxvYXQsIDUsIFJvd01ham9yPiBlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yOwogICBlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMywgNSk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigwKSwgNyk7Ci0gIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigxKSwgMyo1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCAzICogNSk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigyKSwgNSk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbig0KSwgMik7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgewotICAgICAgaW50IHBhdGNoSWQgPSBpKzMqajsKKyAgICAgIGludCBwYXRjaElkID0gaSArIDMgKiBqOwogICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCAzOyArK3IpIHsKICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA1OyArK2MpIHsKICAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IDI7ICsrZCkgewogICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCA3OyArK2IpIHsKICAgICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwLjBmOwogICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZF9yb3dfbWFqb3IgPSAwLjBmOwotICAgICAgICAgICAgICBpZiAoci0xK2kgPj0gMCAmJiBjLTIraiA+PSAwICYmIHItMStpIDwgMyAmJiBjLTIraiA8IDUpIHsKLSAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHRlbnNvcihkLCByLTEraSwgYy0yK2osIGIpOwotICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IoYiwgYy0yK2osIHItMStpLCBkKTsKKyAgICAgICAgICAgICAgaWYgKHIgLSAxICsgaSA+PSAwICYmIGMgLSAyICsgaiA+PSAwICYmIHIgLSAxICsgaSA8IDMgJiYgYyAtIDIgKyBqIDwgNSkgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGVuc29yKGQsIHIgLSAxICsgaSwgYyAtIDIgKyBqLCBiKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yKGIsIGMgLSAyICsgaiwgciAtIDEgKyBpLCBkKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAvLyBDb2xNYWpvcgogICAgICAgICAgICAgICBpZiAoZW50aXJlX2ltYWdlX3BhdGNoKGQsIHIsIGMsIHBhdGNoSWQsIGIpICE9IGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoKGQsIHIsIGMsIHBhdGNoSWQsIGIpLCBleHBlY3RlZCk7CiAgICAgICAgICAgICAgIC8vIFJvd01ham9yCi0gICAgICAgICAgICAgIGlmIChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpICE9Ci0gICAgICAgICAgICAgICAgICBleHBlY3RlZF9yb3dfbWFqb3IpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGoKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgaWYgKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWRfcm93X21ham9yKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcm93X21ham9yKTsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCksIGV4cGVjdGVkX3Jvd19tYWpvcik7CiAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgQ29sTWFqb3IgYW5kIFJvd01ham9yIGFncmVlLgogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoZXhwZWN0ZWQsIGV4cGVjdGVkX3Jvd19tYWpvcik7CiAgICAgICAgICAgICB9CkBAIC0xMjIsMTkgKzExNSwxOCBAQAogICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMCksIDIpOwogICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMSksIDIpOwogICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMiksIDIpOwotICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMyksIDMqNSk7CisgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbigzKSwgMyAqIDUpOwogICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oNCksIDcpOwogCiAgIC8vIDJEIHBhdGNoOiBSb3dNYWpvcgogICBUZW5zb3I8ZmxvYXQsIDUsIFJvd01ham9yPiB0d29kX3BhdGNoX3Jvd19tYWpvcjsKICAgdHdvZF9wYXRjaF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygyLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigwKSwgNyk7Ci0gIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDMqNSk7CisgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDMgKiA1KTsKICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigyKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMyksIDIpOwogICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDQpLCAyKTsKIAotCiAgIC8vIEJhc2VkIG9uIHRoZSBjYWxjdWxhdGlvbiBkZXNjcmliZWQgaW4gVGVuc29yVHJhaXRzLmgsIHBhZGRpbmcgaGFwcGVucyB0byBiZSAwLgogICBpbnQgcm93X3BhZGRpbmcgPSAwOwogICBpbnQgY29sX3BhZGRpbmcgPSAwOwpAQCAtMTQyLDMxICsxMzQsMzQgQEAKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7Ci0gICAgICBpbnQgcGF0Y2hJZCA9IGkrMypqOworICAgICAgaW50IHBhdGNoSWQgPSBpICsgMyAqIGo7CiAgICAgICBmb3IgKGludCByID0gMDsgciA8IDI7ICsrcikgewogICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IDI7ICsrYykgewogICAgICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgMjsgKytkKSB7CiAgICAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IDc7ICsrYikgewogICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CiAgICAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkX3Jvd19tYWpvciA9IDAuMGY7Ci0gICAgICAgICAgICAgIGludCByb3dfb2Zmc2V0ID0gcipzdHJpZGUgKyBpIC0gcm93X3BhZGRpbmc7Ci0gICAgICAgICAgICAgIGludCBjb2xfb2Zmc2V0ID0gYypzdHJpZGUgKyBqIC0gY29sX3BhZGRpbmc7CisgICAgICAgICAgICAgIGludCByb3dfb2Zmc2V0ID0gciAqIHN0cmlkZSArIGkgLSByb3dfcGFkZGluZzsKKyAgICAgICAgICAgICAgaW50IGNvbF9vZmZzZXQgPSBjICogc3RyaWRlICsgaiAtIGNvbF9wYWRkaW5nOwogICAgICAgICAgICAgICAvLyBDb2xNYWpvcgotICAgICAgICAgICAgICBpZiAocm93X29mZnNldCA+PSAwICYmIGNvbF9vZmZzZXQgPj0gMCAmJiByb3dfb2Zmc2V0IDwgdGVuc29yLmRpbWVuc2lvbigxKSAmJiBjb2xfb2Zmc2V0IDwgdGVuc29yLmRpbWVuc2lvbigyKSkgeworICAgICAgICAgICAgICBpZiAocm93X29mZnNldCA+PSAwICYmIGNvbF9vZmZzZXQgPj0gMCAmJiByb3dfb2Zmc2V0IDwgdGVuc29yLmRpbWVuc2lvbigxKSAmJgorICAgICAgICAgICAgICAgICAgY29sX29mZnNldCA8IHRlbnNvci5kaW1lbnNpb24oMikpIHsKICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHRlbnNvcihkLCByb3dfb2Zmc2V0LCBjb2xfb2Zmc2V0LCBiKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiAodHdvZF9wYXRjaChkLCByLCBjLCBwYXRjaElkLCBiKSAhPSBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2goZCwgciwgYywgcGF0Y2hJZCwgYiksIGV4cGVjdGVkKTsKIAogICAgICAgICAgICAgICAvLyBSb3dNYWpvcgotICAgICAgICAgICAgICBpZiAocm93X29mZnNldCA+PSAwICYmIGNvbF9vZmZzZXQgPj0gMCAmJiByb3dfb2Zmc2V0IDwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMikgJiYgY29sX29mZnNldCA8IHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDEpKSB7CisgICAgICAgICAgICAgIGlmIChyb3dfb2Zmc2V0ID49IDAgJiYgY29sX29mZnNldCA+PSAwICYmIHJvd19vZmZzZXQgPCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigyKSAmJgorICAgICAgICAgICAgICAgICAgY29sX29mZnNldCA8IHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDEpKSB7CiAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvcihiLCBjb2xfb2Zmc2V0LCByb3dfb2Zmc2V0LCBkKTsKLQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmICh0d29kX3BhdGNoX3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSAhPSBleHBlY3RlZF9yb3dfbWFqb3IpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSwgZXhwZWN0ZWRfcm93X21ham9yKTsKICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBDb2xNYWpvciBhbmQgUm93TWFqb3IgYWdyZWUuCkBAIC0xODAsMTMgKzE3NSwxMiBAQAogfQogCiAvLyBWZXJpZmllcyBWQUxJRCBwYWRkaW5nIChubyBwYWRkaW5nKSB3aXRoIGluY3JlbWVudGluZyB2YWx1ZXMuCi12b2lkIHRlc3RfcGF0Y2hfcGFkZGluZ192YWxpZCgpCi17Cit2b2lkIHRlc3RfcGF0Y2hfcGFkZGluZ192YWxpZCgpIHsKICAgaW50IGlucHV0X2RlcHRoID0gMzsKICAgaW50IGlucHV0X3Jvd3MgPSAzOwogICBpbnQgaW5wdXRfY29scyA9IDM7CiAgIGludCBpbnB1dF9iYXRjaGVzID0gMTsKLSAgaW50IGtzaXplID0gMjsgIC8vIENvcnJlc3BvbmRzIHRvIHRoZSBSb3dzIGFuZCBDb2xzIGZvciB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzPD4uCisgIGludCBrc2l6ZSA9IDI7ICAgLy8gQ29ycmVzcG9uZHMgdG8gdGhlIFJvd3MgYW5kIENvbHMgZm9yIHRlbnNvci5leHRyYWN0X2ltYWdlX3BhdGNoZXM8Pi4KICAgaW50IHN0cmlkZSA9IDI7ICAvLyBPbmx5IHNhbWUgc3RyaWRlIGlzIHN1cHBvcnRlZC4KICAgVGVuc29yPGZsb2F0LCA0PiB0ZW5zb3IoaW5wdXRfZGVwdGgsIGlucHV0X3Jvd3MsIGlucHV0X2NvbHMsIGlucHV0X2JhdGNoZXMpOwogICAvLyBJbml0aWFsaXplcyB0ZW5zb3Igd2l0aCBpbmNyZW1lbnRpbmcgbnVtYmVycy4KQEAgLTE5NiwxMCArMTkwLDEwIEBACiAgIC8vIENvbE1ham9yCiAgIFRlbnNvcjxmbG9hdCwgNT4gcmVzdWx0ID0gdGVuc29yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyhrc2l6ZSwga3NpemUsIHN0cmlkZSwgc3RyaWRlLCAxLCAxLCBQQURESU5HX1ZBTElEKTsKIAotICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgaW5wdXRfZGVwdGgpOyAgLy8gZGVwdGgKLSAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMSksIGtzaXplKTsgIC8vIGtlcm5lbCByb3dzCi0gIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDIpLCBrc2l6ZSk7ICAvLyBrZXJuZWwgY29scwotICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigzKSwgMSk7ICAvLyBudW1iZXIgb2YgcGF0Y2hlcworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgaW5wdXRfZGVwdGgpOyAgICAvLyBkZXB0aAorICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigxKSwga3NpemUpOyAgICAgICAgICAvLyBrZXJuZWwgcm93cworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigyKSwga3NpemUpOyAgICAgICAgICAvLyBrZXJuZWwgY29scworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigzKSwgMSk7ICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgcGF0Y2hlcwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbig0KSwgaW5wdXRfYmF0Y2hlcyk7ICAvLyBudW1iZXIgb2YgYmF0Y2hlcwogCiAgIC8vIFJvd01ham9yCkBAIC0yMDksNyArMjAzLDggQEAKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMiksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDEpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMyksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDApKTsKIAotICBUZW5zb3I8ZmxvYXQsIDUsIFJvd01ham9yPiByZXN1bHRfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoa3NpemUsIGtzaXplLCBzdHJpZGUsIHN0cmlkZSwgMSwgMSwgUEFERElOR19WQUxJRCk7CisgIFRlbnNvcjxmbG9hdCwgNSwgUm93TWFqb3I+IHJlc3VsdF9yb3dfbWFqb3IgPQorICAgICAgdGVuc29yX3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoa3NpemUsIGtzaXplLCBzdHJpZGUsIHN0cmlkZSwgMSwgMSwgUEFERElOR19WQUxJRCk7CiAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDApLCByZXN1bHRfcm93X21ham9yLmRpbWVuc2lvbig0KSk7CiAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDEpLCByZXN1bHRfcm93X21ham9yLmRpbWVuc2lvbigzKSk7CiAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDIpLCByZXN1bHRfcm93X21ham9yLmRpbWVuc2lvbigyKSk7CkBAIC0yMjAsMTIgKzIxNSwxMiBAQAogICBpbnQgcm93X3BhZGRpbmcgPSAwOwogICBpbnQgY29sX3BhZGRpbmcgPSAwOwogCi0gIGZvciAoaW50IGkgPSAwOyAoaStzdHJpZGUra3NpemUtMSkgPCBpbnB1dF9yb3dzOyBpICs9IHN0cmlkZSkgeyAgLy8gaW5wdXQgcm93cwotICAgIGZvciAoaW50IGogPSAwOyAoaitzdHJpZGUra3NpemUtMSkgPCBpbnB1dF9jb2xzOyBqICs9IHN0cmlkZSkgeyAgLy8gaW5wdXQgY29scwotICAgICAgaW50IHBhdGNoSWQgPSBpK2lucHV0X3Jvd3MqajsKLSAgICAgIGZvciAoaW50IHIgPSAwOyByIDwga3NpemU7ICsrcikgeyAgLy8gcGF0Y2ggcm93cwotICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IGtzaXplOyArK2MpIHsgIC8vIHBhdGNoIGNvbHMKLSAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IGlucHV0X2RlcHRoOyArK2QpIHsgIC8vIGRlcHRoCisgIGZvciAoaW50IGkgPSAwOyAoaSArIHN0cmlkZSArIGtzaXplIC0gMSkgPCBpbnB1dF9yb3dzOyBpICs9IHN0cmlkZSkgeyAgICAvLyBpbnB1dCByb3dzCisgICAgZm9yIChpbnQgaiA9IDA7IChqICsgc3RyaWRlICsga3NpemUgLSAxKSA8IGlucHV0X2NvbHM7IGogKz0gc3RyaWRlKSB7ICAvLyBpbnB1dCBjb2xzCisgICAgICBpbnQgcGF0Y2hJZCA9IGkgKyBpbnB1dF9yb3dzICogajsKKyAgICAgIGZvciAoaW50IHIgPSAwOyByIDwga3NpemU7ICsrcikgeyAgICAgICAgICAgICAgICAvLyBwYXRjaCByb3dzCisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwga3NpemU7ICsrYykgeyAgICAgICAgICAgICAgLy8gcGF0Y2ggY29scworICAgICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgaW5wdXRfZGVwdGg7ICsrZCkgeyAgICAgIC8vIGRlcHRoCiAgICAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IGlucHV0X2JhdGNoZXM7ICsrYikgeyAgLy8gYmF0Y2gKICAgICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwLjBmOwogICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZF9yb3dfbWFqb3IgPSAwLjBmOwpAQCAtMjM3LDEyICsyMzIsMTQgQEAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAvLyBDb2xNYWpvcgogICAgICAgICAgICAgICBpZiAocmVzdWx0KGQsIHIsIGMsIHBhdGNoSWQsIGIpICE9IGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGQsIHIsIGMsIHBhdGNoSWQsIGIpLCBleHBlY3RlZCk7CiAgICAgICAgICAgICAgIC8vIFJvd01ham9yCiAgICAgICAgICAgICAgIGlmIChyZXN1bHRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpICE9IGV4cGVjdGVkX3Jvd19tYWpvcikgewotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCksIGV4cGVjdGVkX3Jvd19tYWpvcik7CiAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgQ29sTWFqb3IgYW5kIFJvd01ham9yIGFncmVlLgpAQCAtMjU2LDIzICsyNTMsMjIgQEAKIH0KIAogLy8gVmVyaWZpZXMgVkFMSUQgcGFkZGluZyAobm8gcGFkZGluZykgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLXZvaWQgdGVzdF9wYXRjaF9wYWRkaW5nX3ZhbGlkX3NhbWVfdmFsdWUoKQotewordm9pZCB0ZXN0X3BhdGNoX3BhZGRpbmdfdmFsaWRfc2FtZV92YWx1ZSgpIHsKICAgaW50IGlucHV0X2RlcHRoID0gMTsKICAgaW50IGlucHV0X3Jvd3MgPSA1OwogICBpbnQgaW5wdXRfY29scyA9IDU7CiAgIGludCBpbnB1dF9iYXRjaGVzID0gMjsKLSAgaW50IGtzaXplID0gMzsgIC8vIENvcnJlc3BvbmRzIHRvIHRoZSBSb3dzIGFuZCBDb2xzIGZvciB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzPD4uCisgIGludCBrc2l6ZSA9IDM7ICAgLy8gQ29ycmVzcG9uZHMgdG8gdGhlIFJvd3MgYW5kIENvbHMgZm9yIHRlbnNvci5leHRyYWN0X2ltYWdlX3BhdGNoZXM8Pi4KICAgaW50IHN0cmlkZSA9IDI7ICAvLyBPbmx5IHNhbWUgc3RyaWRlIGlzIHN1cHBvcnRlZC4KICAgLy8gQ29sTWFqb3IKICAgVGVuc29yPGZsb2F0LCA0PiB0ZW5zb3IoaW5wdXRfZGVwdGgsIGlucHV0X3Jvd3MsIGlucHV0X2NvbHMsIGlucHV0X2JhdGNoZXMpOwogICB0ZW5zb3IgPSB0ZW5zb3IuY29uc3RhbnQoMTEuMGYpOwogICBUZW5zb3I8ZmxvYXQsIDU+IHJlc3VsdCA9IHRlbnNvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoa3NpemUsIGtzaXplLCBzdHJpZGUsIHN0cmlkZSwgMSwgMSwgUEFERElOR19WQUxJRCk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIGlucHV0X2RlcHRoKTsgIC8vIGRlcHRoCi0gIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDEpLCBrc2l6ZSk7ICAvLyBrZXJuZWwgcm93cwotICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigyKSwga3NpemUpOyAgLy8ga2VybmVsIGNvbHMKLSAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMyksIDQpOyAgLy8gbnVtYmVyIG9mIHBhdGNoZXMKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIGlucHV0X2RlcHRoKTsgICAgLy8gZGVwdGgKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMSksIGtzaXplKTsgICAgICAgICAgLy8ga2VybmVsIHJvd3MKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMiksIGtzaXplKTsgICAgICAgICAgLy8ga2VybmVsIGNvbHMKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMyksIDQpOyAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHBhdGNoZXMKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oNCksIGlucHV0X2JhdGNoZXMpOyAgLy8gbnVtYmVyIG9mIGJhdGNoZXMKIAogICAvLyBSb3dNYWpvcgpAQCAtMjgyLDcgKzI3OCw4IEBACiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDIpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigxKSk7CiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDMpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigwKSk7CiAKLSAgVGVuc29yPGZsb2F0LCA1LCBSb3dNYWpvcj4gcmVzdWx0X3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKGtzaXplLCBrc2l6ZSwgc3RyaWRlLCBzdHJpZGUsIDEsIDEsIFBBRERJTkdfVkFMSUQpOworICBUZW5zb3I8ZmxvYXQsIDUsIFJvd01ham9yPiByZXN1bHRfcm93X21ham9yID0KKyAgICAgIHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKGtzaXplLCBrc2l6ZSwgc3RyaWRlLCBzdHJpZGUsIDEsIDEsIFBBRERJTkdfVkFMSUQpOwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigwKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oNCkpOwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigxKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMykpOwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigyKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oMikpOwpAQCAtMjkzLDEyICsyOTAsMTIgQEAKICAgaW50IHJvd19wYWRkaW5nID0gMDsKICAgaW50IGNvbF9wYWRkaW5nID0gMDsKIAotICBmb3IgKGludCBpID0gMDsgKGkrc3RyaWRlK2tzaXplLTEpIDw9IGlucHV0X3Jvd3M7IGkgKz0gc3RyaWRlKSB7ICAvLyBpbnB1dCByb3dzCi0gICAgZm9yIChpbnQgaiA9IDA7IChqK3N0cmlkZStrc2l6ZS0xKSA8PSBpbnB1dF9jb2xzOyBqICs9IHN0cmlkZSkgeyAgLy8gaW5wdXQgY29scwotICAgICAgaW50IHBhdGNoSWQgPSBpK2lucHV0X3Jvd3MqajsKLSAgICAgIGZvciAoaW50IHIgPSAwOyByIDwga3NpemU7ICsrcikgeyAgLy8gcGF0Y2ggcm93cwotICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IGtzaXplOyArK2MpIHsgIC8vIHBhdGNoIGNvbHMKLSAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IGlucHV0X2RlcHRoOyArK2QpIHsgIC8vIGRlcHRoCisgIGZvciAoaW50IGkgPSAwOyAoaSArIHN0cmlkZSArIGtzaXplIC0gMSkgPD0gaW5wdXRfcm93czsgaSArPSBzdHJpZGUpIHsgICAgLy8gaW5wdXQgcm93cworICAgIGZvciAoaW50IGogPSAwOyAoaiArIHN0cmlkZSArIGtzaXplIC0gMSkgPD0gaW5wdXRfY29sczsgaiArPSBzdHJpZGUpIHsgIC8vIGlucHV0IGNvbHMKKyAgICAgIGludCBwYXRjaElkID0gaSArIGlucHV0X3Jvd3MgKiBqOworICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCBrc2l6ZTsgKytyKSB7ICAgICAgICAgICAgICAgIC8vIHBhdGNoIHJvd3MKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBrc2l6ZTsgKytjKSB7ICAgICAgICAgICAgICAvLyBwYXRjaCBjb2xzCisgICAgICAgICAgZm9yIChpbnQgZCA9IDA7IGQgPCBpbnB1dF9kZXB0aDsgKytkKSB7ICAgICAgLy8gZGVwdGgKICAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgaW5wdXRfYmF0Y2hlczsgKytiKSB7ICAvLyBiYXRjaAogICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CiAgICAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkX3Jvd19tYWpvciA9IDAuMGY7CkBAIC0zMTAsMTIgKzMwNywxNCBAQAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC8vIENvbE1ham9yCiAgICAgICAgICAgICAgIGlmIChyZXN1bHQoZCwgciwgYywgcGF0Y2hJZCwgYikgIT0gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoZCwgciwgYywgcGF0Y2hJZCwgYiksIGV4cGVjdGVkKTsKICAgICAgICAgICAgICAgLy8gUm93TWFqb3IKICAgICAgICAgICAgICAgaWYgKHJlc3VsdF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWRfcm93X21ham9yKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSwgZXhwZWN0ZWRfcm93X21ham9yKTsKICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBDb2xNYWpvciBhbmQgUm93TWFqb3IgYWdyZWUuCkBAIC0zMjksMTMgKzMyOCwxMiBAQAogfQogCiAvLyBWZXJpZmllcyBTQU1FIHBhZGRpbmcuCi12b2lkIHRlc3RfcGF0Y2hfcGFkZGluZ19zYW1lKCkKLXsKK3ZvaWQgdGVzdF9wYXRjaF9wYWRkaW5nX3NhbWUoKSB7CiAgIGludCBpbnB1dF9kZXB0aCA9IDM7CiAgIGludCBpbnB1dF9yb3dzID0gNDsKICAgaW50IGlucHV0X2NvbHMgPSAyOwogICBpbnQgaW5wdXRfYmF0Y2hlcyA9IDE7Ci0gIGludCBrc2l6ZSA9IDI7ICAvLyBDb3JyZXNwb25kcyB0byB0aGUgUm93cyBhbmQgQ29scyBmb3IgdGVuc29yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlczw+LgorICBpbnQga3NpemUgPSAyOyAgIC8vIENvcnJlc3BvbmRzIHRvIHRoZSBSb3dzIGFuZCBDb2xzIGZvciB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzPD4uCiAgIGludCBzdHJpZGUgPSAyOyAgLy8gT25seSBzYW1lIHN0cmlkZSBpcyBzdXBwb3J0ZWQuCiAgIC8vIENvbE1ham9yCiAgIFRlbnNvcjxmbG9hdCwgND4gdGVuc29yKGlucHV0X2RlcHRoLCBpbnB1dF9yb3dzLCBpbnB1dF9jb2xzLCBpbnB1dF9iYXRjaGVzKTsKQEAgLTM0NSwxMCArMzQzLDEwIEBACiAgIH0KICAgVGVuc29yPGZsb2F0LCA1PiByZXN1bHQgPSB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKGtzaXplLCBrc2l6ZSwgc3RyaWRlLCBzdHJpZGUsIFBBRERJTkdfU0FNRSk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIGlucHV0X2RlcHRoKTsgIC8vIGRlcHRoCi0gIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDEpLCBrc2l6ZSk7ICAvLyBrZXJuZWwgcm93cwotICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmRpbWVuc2lvbigyKSwga3NpemUpOyAgLy8ga2VybmVsIGNvbHMKLSAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMyksIDIpOyAgLy8gbnVtYmVyIG9mIHBhdGNoZXMKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIGlucHV0X2RlcHRoKTsgICAgLy8gZGVwdGgKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMSksIGtzaXplKTsgICAgICAgICAgLy8ga2VybmVsIHJvd3MKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMiksIGtzaXplKTsgICAgICAgICAgLy8ga2VybmVsIGNvbHMKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMyksIDIpOyAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHBhdGNoZXMKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oNCksIGlucHV0X2JhdGNoZXMpOyAgLy8gbnVtYmVyIG9mIGJhdGNoZXMKIAogICAvLyBSb3dNYWpvcgpAQCAtMzU4LDcgKzM1Niw4IEBACiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDIpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigxKSk7CiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDMpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigwKSk7CiAKLSAgVGVuc29yPGZsb2F0LCA1LCBSb3dNYWpvcj4gcmVzdWx0X3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKGtzaXplLCBrc2l6ZSwgc3RyaWRlLCBzdHJpZGUsIFBBRERJTkdfU0FNRSk7CisgIFRlbnNvcjxmbG9hdCwgNSwgUm93TWFqb3I+IHJlc3VsdF9yb3dfbWFqb3IgPQorICAgICAgdGVuc29yX3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoa3NpemUsIGtzaXplLCBzdHJpZGUsIHN0cmlkZSwgUEFERElOR19TQU1FKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMCksIHJlc3VsdF9yb3dfbWFqb3IuZGltZW5zaW9uKDQpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMSksIHJlc3VsdF9yb3dfbWFqb3IuZGltZW5zaW9uKDMpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5kaW1lbnNpb24oMiksIHJlc3VsdF9yb3dfbWFqb3IuZGltZW5zaW9uKDIpKTsKQEAgLTM3MCwyOSArMzY5LDMxIEBACiAgIGludCByb3dfcGFkZGluZyA9IDA7CiAgIGludCBjb2xfcGFkZGluZyA9IDA7CiAKLSAgZm9yIChpbnQgaSA9IDA7IChpK3N0cmlkZStrc2l6ZS0xKSA8PSBpbnB1dF9yb3dzOyBpICs9IHN0cmlkZSkgeyAgLy8gaW5wdXQgcm93cwotICAgIGZvciAoaW50IGogPSAwOyAoaitzdHJpZGUra3NpemUtMSkgPD0gaW5wdXRfY29sczsgaiArPSBzdHJpZGUpIHsgIC8vIGlucHV0IGNvbHMKLSAgICAgIGludCBwYXRjaElkID0gaStpbnB1dF9yb3dzKmo7Ci0gICAgICBmb3IgKGludCByID0gMDsgciA8IGtzaXplOyArK3IpIHsgIC8vIHBhdGNoIHJvd3MKLSAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBrc2l6ZTsgKytjKSB7ICAvLyBwYXRjaCBjb2xzCi0gICAgICAgICAgZm9yIChpbnQgZCA9IDA7IGQgPCBpbnB1dF9kZXB0aDsgKytkKSB7ICAvLyBkZXB0aAorICBmb3IgKGludCBpID0gMDsgKGkgKyBzdHJpZGUgKyBrc2l6ZSAtIDEpIDw9IGlucHV0X3Jvd3M7IGkgKz0gc3RyaWRlKSB7ICAgIC8vIGlucHV0IHJvd3MKKyAgICBmb3IgKGludCBqID0gMDsgKGogKyBzdHJpZGUgKyBrc2l6ZSAtIDEpIDw9IGlucHV0X2NvbHM7IGogKz0gc3RyaWRlKSB7ICAvLyBpbnB1dCBjb2xzCisgICAgICBpbnQgcGF0Y2hJZCA9IGkgKyBpbnB1dF9yb3dzICogajsKKyAgICAgIGZvciAoaW50IHIgPSAwOyByIDwga3NpemU7ICsrcikgeyAgICAgICAgICAgICAgICAvLyBwYXRjaCByb3dzCisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwga3NpemU7ICsrYykgeyAgICAgICAgICAgICAgLy8gcGF0Y2ggY29scworICAgICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgaW5wdXRfZGVwdGg7ICsrZCkgeyAgICAgIC8vIGRlcHRoCiAgICAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IGlucHV0X2JhdGNoZXM7ICsrYikgeyAgLy8gYmF0Y2gKICAgICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwLjBmOwogICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZF9yb3dfbWFqb3IgPSAwLjBmOwotICAgICAgICAgICAgICBpbnQgcm93X29mZnNldCA9IHIqc3RyaWRlICsgaSAtIHJvd19wYWRkaW5nOwotICAgICAgICAgICAgICBpbnQgY29sX29mZnNldCA9IGMqc3RyaWRlICsgaiAtIGNvbF9wYWRkaW5nOworICAgICAgICAgICAgICBpbnQgcm93X29mZnNldCA9IHIgKiBzdHJpZGUgKyBpIC0gcm93X3BhZGRpbmc7CisgICAgICAgICAgICAgIGludCBjb2xfb2Zmc2V0ID0gYyAqIHN0cmlkZSArIGogLSBjb2xfcGFkZGluZzsKICAgICAgICAgICAgICAgaWYgKHJvd19vZmZzZXQgPj0gMCAmJiBjb2xfb2Zmc2V0ID49IDAgJiYgcm93X29mZnNldCA8IGlucHV0X3Jvd3MgJiYgY29sX29mZnNldCA8IGlucHV0X2NvbHMpIHsKICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHRlbnNvcihkLCByb3dfb2Zmc2V0LCBjb2xfb2Zmc2V0LCBiKTsKICAgICAgICAgICAgICAgICBleHBlY3RlZF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yKGIsIGNvbF9vZmZzZXQsIHJvd19vZmZzZXQsIGQpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC8vIENvbE1ham9yCiAgICAgICAgICAgICAgIGlmIChyZXN1bHQoZCwgciwgYywgcGF0Y2hJZCwgYikgIT0gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoZCwgciwgYywgcGF0Y2hJZCwgYiksIGV4cGVjdGVkKTsKICAgICAgICAgICAgICAgLy8gUm93TWFqb3IKICAgICAgICAgICAgICAgaWYgKHJlc3VsdF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWRfcm93X21ham9yKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSwgZXhwZWN0ZWRfcm93X21ham9yKTsKICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBDb2xNYWpvciBhbmQgUm93TWFqb3IgYWdyZWUuCkBAIC00MjIsOCArNDIzLDcgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW5zb3Iuc2l6ZSgpOyArK2kpIHsKICAgICB0ZW5zb3IuZGF0YSgpW2ldID0gaSArIDE7CiAgIH0KLSAgVGVuc29yPGZsb2F0LCA1PiByZXN1bHQgPSB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKAotICAgICAga3NpemUsIGtzaXplLCByb3dfc3RyaWRlLCBjb2xfc3RyaWRlLCAxLCAxLCBQQURESU5HX1NBTUUpOworICBUZW5zb3I8ZmxvYXQsIDU+IHJlc3VsdCA9IHRlbnNvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoa3NpemUsIGtzaXplLCByb3dfc3RyaWRlLCBjb2xfc3RyaWRlLCAxLCAxLCBQQURESU5HX1NBTUUpOwogICAvLyByb3cgcGFkZGluZyB3aWxsIGJlIGNvbXB1dGVkIGFzIC0yIG9yaWdpbmFsbHkgYW5kIHRoZW4gYmUgY2xpcHBlZCB0byAwLgogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LmNvZWZmKDApLCAxLjBmKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdC5jb2VmZigxKSwgNi4wZik7CkBAIC00NDMsOCArNDQzLDcgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMyksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDApKTsKIAogICBUZW5zb3I8ZmxvYXQsIDUsIFJvd01ham9yPiByZXN1bHRfcm93X21ham9yID0KLSAgICAgIHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKGtzaXplLCBrc2l6ZSwgcm93X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9zdHJpZGUsIDEsIDEsIFBBRERJTkdfU0FNRSk7CisgICAgICB0ZW5zb3Jfcm93X21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyhrc2l6ZSwga3NpemUsIHJvd19zdHJpZGUsIGNvbF9zdHJpZGUsIDEsIDEsIFBBRERJTkdfU0FNRSk7CiAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfcm93X21ham9yLmNvZWZmKDApLCAxLjBmKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF9yb3dfbWFqb3IuY29lZmYoMSksIDYuMGYpOwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X3Jvd19tYWpvci5jb2VmZigyKSwgMTEuMGYpOwpAQCAtNDU2LDkgKzQ1NSw4IEBACiAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQuZGltZW5zaW9uKDQpLCByZXN1bHRfcm93X21ham9yLmRpbWVuc2lvbigwKSk7CiB9CiAKLXZvaWQgdGVzdF9wYXRjaF9ub19leHRyYV9kaW0oKQotewotICBUZW5zb3I8ZmxvYXQsIDM+IHRlbnNvcigyLDMsNSk7Cit2b2lkIHRlc3RfcGF0Y2hfbm9fZXh0cmFfZGltKCkgeworICBUZW5zb3I8ZmxvYXQsIDM+IHRlbnNvcigyLCAzLCA1KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogICBUZW5zb3I8ZmxvYXQsIDMsIFJvd01ham9yPiB0ZW5zb3Jfcm93X21ham9yID0gdGVuc29yLnN3YXBfbGF5b3V0KCk7CiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDApLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigyKSk7CkBAIC00NzEsMTIgKzQ2OSwxMiBAQAogICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoLmRpbWVuc2lvbigwKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2guZGltZW5zaW9uKDEpLCAxKTsKICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaC5kaW1lbnNpb24oMiksIDEpOwotICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoLmRpbWVuc2lvbigzKSwgMyo1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaC5kaW1lbnNpb24oMyksIDMgKiA1KTsKIAogICAvLyBTaW5nbGUgcGl4ZWwgcGF0Y2g6IFJvd01ham9yCiAgIFRlbnNvcjxmbG9hdCwgNCwgUm93TWFqb3I+IHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3I7CiAgIHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygxLCAxKTsKLSAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDApLCAzKjUpOworICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMCksIDMgKiA1KTsKICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCAxKTsKICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDIpLCAxKTsKICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDMpLCAyKTsKQEAgLTQ4NCwyMCArNDgyLDE4IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVuc29yLnNpemUoKTsgKytpKSB7CiAgICAgLy8gQ29sTWFqb3IKICAgICBpZiAodGVuc29yLmRhdGEoKVtpXSAhPSBzaW5nbGVfcGl4ZWxfcGF0Y2guZGF0YSgpW2ldKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4ICIgPDwgaSA8PCAiIDogIiA8PCB0ZW5zb3IuZGF0YSgpW2ldIDw8ICIgdnMgIiA8PCBzaW5nbGVfcGl4ZWxfcGF0Y2guZGF0YSgpW2ldIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICIgOiAiIDw8IHRlbnNvci5kYXRhKClbaV0gPDwgIiB2cyAiCisgICAgICAgICAgICAgICAgPDwgc2luZ2xlX3BpeGVsX3BhdGNoLmRhdGEoKVtpXSA8PCBzdGQ6OmVuZGw7CiAgICAgfQogICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2guZGF0YSgpW2ldLCB0ZW5zb3IuZGF0YSgpW2ldKTsKICAgICAvLyBSb3dNYWpvcgogICAgIGlmICh0ZW5zb3Jfcm93X21ham9yLmRhdGEoKVtpXSAhPSBzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSkgewotICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIiA6ICIKLSAgICAgICAgICAgPDwgdGVuc29yLmRhdGEoKVtpXSA8PCAiIHZzICIKLSAgICAgICAgICAgPDwgc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kYXRhKClbaV0gPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIiA6ICIgPDwgdGVuc29yLmRhdGEoKVtpXSA8PCAiIHZzICIKKyAgICAgICAgICAgICAgICA8PCBzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSA8PCBzdGQ6OmVuZGw7CiAgICAgfQotICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSwKLSAgICAgICAgICAgICAgICAgICAgdGVuc29yX3Jvd19tYWpvci5kYXRhKClbaV0pOworICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGl4ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSwgdGVuc29yX3Jvd19tYWpvci5kYXRhKClbaV0pOwogICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGF0YSgpW2ldLCB0ZW5zb3Jfcm93X21ham9yLmRhdGEoKVtpXSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9waXhlbF9wYXRjaC5kYXRhKClbaV0sCi0gICAgICAgICAgICAgICAgICAgIHNpbmdsZV9waXhlbF9wYXRjaF9yb3dfbWFqb3IuZGF0YSgpW2ldKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BpeGVsX3BhdGNoLmRhdGEoKVtpXSwgc2luZ2xlX3BpeGVsX3BhdGNoX3Jvd19tYWpvci5kYXRhKClbaV0pOwogICB9CiAKICAgLy8gRW50aXJlIGltYWdlIHBhdGNoOiBDb2xNYWpvcgpAQCAtNTA2LDQwICs1MDIsNDAgQEAKICAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaC5kaW1lbnNpb24oMCksIDIpOwogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoLmRpbWVuc2lvbigxKSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2guZGltZW5zaW9uKDIpLCA1KTsKLSAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaC5kaW1lbnNpb24oMyksIDMqNSk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2guZGltZW5zaW9uKDMpLCAzICogNSk7CiAKICAgLy8gRW50aXJlIGltYWdlIHBhdGNoOiBSb3dNYWpvcgogICBUZW5zb3I8ZmxvYXQsIDQsIFJvd01ham9yPiBlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yOwogICBlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMywgNSk7Ci0gIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigwKSwgMyo1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDApLCAzICogNSk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigxKSwgNSk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigyKSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMik7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgewotICAgICAgaW50IHBhdGNoSWQgPSBpKzMqajsKKyAgICAgIGludCBwYXRjaElkID0gaSArIDMgKiBqOwogICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCAzOyArK3IpIHsKICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA1OyArK2MpIHsKICAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IDI7ICsrZCkgewogICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwLjBmOwogICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWRfcm93X21ham9yID0gMC4wZjsKLSAgICAgICAgICAgIGlmIChyLTEraSA+PSAwICYmIGMtMitqID49IDAgJiYgci0xK2kgPCAzICYmIGMtMitqIDwgNSkgewotICAgICAgICAgICAgICBleHBlY3RlZCA9IHRlbnNvcihkLCByLTEraSwgYy0yK2opOwotICAgICAgICAgICAgICBleHBlY3RlZF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yKGMtMitqLCByLTEraSwgZCk7CisgICAgICAgICAgICBpZiAociAtIDEgKyBpID49IDAgJiYgYyAtIDIgKyBqID49IDAgJiYgciAtIDEgKyBpIDwgMyAmJiBjIC0gMiArIGogPCA1KSB7CisgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGVuc29yKGQsIHIgLSAxICsgaSwgYyAtIDIgKyBqKTsKKyAgICAgICAgICAgICAgZXhwZWN0ZWRfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvcihjIC0gMiArIGosIHIgLSAxICsgaSwgZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBDb2xNYWpvcgogICAgICAgICAgICAgaWYgKGVudGlyZV9pbWFnZV9wYXRjaChkLCByLCBjLCBwYXRjaElkKSAhPSBleHBlY3RlZCkgewotICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2goZCwgciwgYywgcGF0Y2hJZCksIGV4cGVjdGVkKTsKICAgICAgICAgICAgIC8vIFJvd01ham9yCi0gICAgICAgICAgICBpZiAoZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvcihwYXRjaElkLCBjLCByLCBkKSAhPQotICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jvd19tYWpvcikgewotICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgaWYgKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IocGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWRfcm93X21ham9yKSB7CisgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IocGF0Y2hJZCwgYywgciwgZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcm93X21ham9yKTsKKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yKHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZF9yb3dfbWFqb3IpOwogICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBDb2xNYWpvciBhbmQgUm93TWFqb3IgYWdyZWUuCiAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoZXhwZWN0ZWQsIGV4cGVjdGVkX3Jvd19tYWpvcik7CiAgICAgICAgICAgfQpAQCAtNTU0LDEyICs1NTAsMTIgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDApLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDEpLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDIpLCAyKTsKLSAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDMpLCAzKjUpOworICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMyksIDMgKiA1KTsKIAogICAvLyAyRCBwYXRjaDogUm93TWFqb3IKICAgVGVuc29yPGZsb2F0LCA0LCBSb3dNYWpvcj4gdHdvZF9wYXRjaF9yb3dfbWFqb3I7CiAgIHR3b2RfcGF0Y2hfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMiwgMik7Ci0gIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMCksIDMqNSk7CisgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMCksIDMgKiA1KTsKICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigxKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMiksIDIpOwogICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDMpLCAyKTsKQEAgLTU3MSwyOCArNTY3LDMyIEBACiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgewotICAgICAgaW50IHBhdGNoSWQgPSBpKzMqajsKKyAgICAgIGludCBwYXRjaElkID0gaSArIDMgKiBqOwogICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCAyOyArK3IpIHsKICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCAyOyArK2MpIHsKICAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IDI7ICsrZCkgewogICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwLjBmOwogICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWRfcm93X21ham9yID0gMC4wZjsKLSAgICAgICAgICAgIGludCByb3dfb2Zmc2V0ID0gcipzdHJpZGUgKyBpIC0gcm93X3BhZGRpbmc7Ci0gICAgICAgICAgICBpbnQgY29sX29mZnNldCA9IGMqc3RyaWRlICsgaiAtIGNvbF9wYWRkaW5nOworICAgICAgICAgICAgaW50IHJvd19vZmZzZXQgPSByICogc3RyaWRlICsgaSAtIHJvd19wYWRkaW5nOworICAgICAgICAgICAgaW50IGNvbF9vZmZzZXQgPSBjICogc3RyaWRlICsgaiAtIGNvbF9wYWRkaW5nOwogICAgICAgICAgICAgLy8gQ29sTWFqb3IKLSAgICAgICAgICAgIGlmIChyb3dfb2Zmc2V0ID49IDAgJiYgY29sX29mZnNldCA+PSAwICYmIHJvd19vZmZzZXQgPCB0ZW5zb3IuZGltZW5zaW9uKDEpICYmIGNvbF9vZmZzZXQgPCB0ZW5zb3IuZGltZW5zaW9uKDIpKSB7CisgICAgICAgICAgICBpZiAocm93X29mZnNldCA+PSAwICYmIGNvbF9vZmZzZXQgPj0gMCAmJiByb3dfb2Zmc2V0IDwgdGVuc29yLmRpbWVuc2lvbigxKSAmJgorICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQgPCB0ZW5zb3IuZGltZW5zaW9uKDIpKSB7CiAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGVuc29yKGQsIHJvd19vZmZzZXQsIGNvbF9vZmZzZXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHR3b2RfcGF0Y2goZCwgciwgYywgcGF0Y2hJZCkgIT0gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaChkLCByLCBjLCBwYXRjaElkKSwgZXhwZWN0ZWQpOwogICAgICAgICAgICAgLy8gUm93TWFqb3IKLSAgICAgICAgICAgIGlmIChyb3dfb2Zmc2V0ID49IDAgJiYgY29sX29mZnNldCA+PSAwICYmIHJvd19vZmZzZXQgPCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigxKSAmJiBjb2xfb2Zmc2V0IDwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMCkpIHsKKyAgICAgICAgICAgIGlmIChyb3dfb2Zmc2V0ID49IDAgJiYgY29sX29mZnNldCA+PSAwICYmIHJvd19vZmZzZXQgPCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigxKSAmJgorICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQgPCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigwKSkgewogICAgICAgICAgICAgICBleHBlY3RlZF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yKGNvbF9vZmZzZXQsIHJvd19vZmZzZXQsIGQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHR3b2RfcGF0Y2hfcm93X21ham9yKHBhdGNoSWQsIGMsIHIsIGQpICE9IGV4cGVjdGVkX3Jvd19tYWpvcikgewotICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvcihwYXRjaElkLCBjLCByLCBkKSwgZXhwZWN0ZWRfcm93X21ham9yKTsKICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgQ29sTWFqb3IgYW5kIFJvd01ham9yIGFncmVlLgpAQCAtNjA0LDggKzYwNCw3IEBACiAgIH0KIH0KIAotdm9pZCB0ZXN0X2ltYWdlbmV0X3BhdGNoZXMoKQotewordm9pZCB0ZXN0X2ltYWdlbmV0X3BhdGNoZXMoKSB7CiAgIC8vIFRlc3QgdGhlIGNvZGUgb24gdHlwaWNhbCBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IHRoZSAnaW1hZ2VuZXQnIGJlbmNobWFya3MgYXQKICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NvdW1pdGgvY29udm5ldC1iZW5jaG1hcmtzCiAgIC8vIENvbE1ham9yCkBAIC02MTUsMTMgKzYxNCwxMyBAQAogICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDApLCAzKTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbigxKSwgMTEpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDIpLCAxMSk7Ci0gIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oMyksIDEyOCoxMjgpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDMpLCAxMjggKiAxMjgpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDQpLCAxNik7CiAKICAgLy8gUm93TWFqb3IKICAgVGVuc29yPGZsb2F0LCA1LCBSb3dNYWpvcj4gbF9vdXRfcm93X21ham9yID0gbF9pbi5zd2FwX2xheW91dCgpLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygxMSwgMTEpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigwKSwgMTYpOwotICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigxKSwgMTI4KjEyOCk7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCAxMjggKiAxMjgpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigyKSwgMTEpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMTEpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbig0KSwgMyk7CkBAIC02MjksMjggKzYyOCwyNiBAQAogICBmb3IgKGludCBiID0gMDsgYiA8IDE2OyArK2IpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyODsgKytpKSB7CiAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEyODsgKytqKSB7Ci0gICAgICAgIGludCBwYXRjaElkID0gaSsxMjgqajsKKyAgICAgICAgaW50IHBhdGNoSWQgPSBpICsgMTI4ICogajsKICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCAxMTsgKytjKSB7CiAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCAxMTsgKytyKSB7CiAgICAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IDM7ICsrZCkgewogICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7Ci0gICAgICAgICAgICAgIGlmIChyLTUraSA+PSAwICYmIGMtNStqID49IDAgJiYgci01K2kgPCAxMjggJiYgYy01K2ogPCAxMjgpIHsKLSAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxfaW4oZCwgci01K2ksIGMtNStqLCBiKTsKKyAgICAgICAgICAgICAgaWYgKHIgLSA1ICsgaSA+PSAwICYmIGMgLSA1ICsgaiA+PSAwICYmIHIgLSA1ICsgaSA8IDEyOCAmJiBjIC0gNSArIGogPCAxMjgpIHsKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxfaW4oZCwgciAtIDUgKyBpLCBjIC0gNSArIGosIGIpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC8vIENvbE1ham9yCiAgICAgICAgICAgICAgIGlmIChsX291dChkLCByLCBjLCBwYXRjaElkLCBiKSAhPSBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0KGQsIHIsIGMsIHBhdGNoSWQsIGIpLCBleHBlY3RlZCk7CiAgICAgICAgICAgICAgIC8vIFJvd01ham9yCi0gICAgICAgICAgICAgIGlmIChsX291dF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0KLSAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiCi0gICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgIGlmIChsX291dF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSwgZXhwZWN0ZWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjY1LDEzICs2NjIsMTMgQEAKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbigwKSwgMTYpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDEpLCA5KTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbigyKSwgOSk7Ci0gIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oMyksIDY0KjY0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbigzKSwgNjQgKiA2NCk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oNCksIDMyKTsKIAogICAvLyBSb3dNYWpvcgogICBsX291dF9yb3dfbWFqb3IgPSBsX2luLnN3YXBfbGF5b3V0KCkuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDksIDkpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigwKSwgMzIpOwotICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigxKSwgNjQqNjQpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigxKSwgNjQgKiA2NCk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDIpLCA5KTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMyksIDkpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbig0KSwgMTYpOwpAQCAtNjc5LDIyICs2NzYsMjQgQEAKICAgZm9yIChpbnQgYiA9IDA7IGIgPCAzMjsgKytiKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgKytpKSB7CiAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDY0OyArK2opIHsKLSAgICAgICAgaW50IHBhdGNoSWQgPSBpKzY0Kmo7CisgICAgICAgIGludCBwYXRjaElkID0gaSArIDY0ICogajsKICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA5OyArK2MpIHsKICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IDk7ICsrcikgewogICAgICAgICAgICAgZm9yIChpbnQgZCA9IDA7IGQgPCAxNjsgKytkKSB7CiAgICAgICAgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gMC4wZjsKLSAgICAgICAgICAgICAgaWYgKHItNCtpID49IDAgJiYgYy00K2ogPj0gMCAmJiByLTQraSA8IDY0ICYmIGMtNCtqIDwgNjQpIHsKLSAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxfaW4oZCwgci00K2ksIGMtNCtqLCBiKTsKKyAgICAgICAgICAgICAgaWYgKHIgLSA0ICsgaSA+PSAwICYmIGMgLSA0ICsgaiA+PSAwICYmIHIgLSA0ICsgaSA8IDY0ICYmIGMgLSA0ICsgaiA8IDY0KSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsX2luKGQsIHIgLSA0ICsgaSwgYyAtIDQgKyBqLCBiKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAvLyBDb2xNYWpvcgogICAgICAgICAgICAgICBpZiAobF9vdXQoZCwgciwgYywgcGF0Y2hJZCwgYikgIT0gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChsX291dChkLCByLCBjLCBwYXRjaElkLCBiKSwgZXhwZWN0ZWQpOwogICAgICAgICAgICAgICAvLyBSb3dNYWpvcgogICAgICAgICAgICAgICBpZiAobF9vdXRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpICE9IGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZCk7CiAgICAgICAgICAgICB9CkBAIC03MTEsMTMgKzcxMCwxMyBAQAogICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDApLCAzMik7CiAgIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oMSksIDcpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDIpLCA3KTsKLSAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbigzKSwgMTYqMTYpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDMpLCAxNiAqIDE2KTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbig0KSwgMzIpOwogCiAgIC8vIFJvd01ham9yCiAgIGxfb3V0X3Jvd19tYWpvciA9IGxfaW4uc3dhcF9sYXlvdXQoKS5leHRyYWN0X2ltYWdlX3BhdGNoZXMoNywgNyk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDApLCAzMik7Ci0gIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCAxNioxNik7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCAxNiAqIDE2KTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMiksIDcpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigzKSwgNyk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDQpLCAzMik7CkBAIC03MjUsMjIgKzcyNCwyNCBAQAogICBmb3IgKGludCBiID0gMDsgYiA8IDMyOyArK2IpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTY7ICsraikgewotICAgICAgICBpbnQgcGF0Y2hJZCA9IGkrMTYqajsKKyAgICAgICAgaW50IHBhdGNoSWQgPSBpICsgMTYgKiBqOwogICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IDc7ICsrYykgewogICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgNzsgKytyKSB7CiAgICAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IDMyOyArK2QpIHsKICAgICAgICAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSAwLjBmOwotICAgICAgICAgICAgICBpZiAoci0zK2kgPj0gMCAmJiBjLTMraiA+PSAwICYmIHItMytpIDwgMTYgJiYgYy0zK2ogPCAxNikgewotICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbF9pbihkLCByLTMraSwgYy0zK2osIGIpOworICAgICAgICAgICAgICBpZiAociAtIDMgKyBpID49IDAgJiYgYyAtIDMgKyBqID49IDAgJiYgciAtIDMgKyBpIDwgMTYgJiYgYyAtIDMgKyBqIDwgMTYpIHsKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxfaW4oZCwgciAtIDMgKyBpLCBjIC0gMyArIGosIGIpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC8vIENvbE1ham9yCiAgICAgICAgICAgICAgIGlmIChsX291dChkLCByLCBjLCBwYXRjaElkLCBiKSAhPSBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0KGQsIHIsIGMsIHBhdGNoSWQsIGIpLCBleHBlY3RlZCk7CiAgICAgICAgICAgICAgIC8vIFJvd01ham9yCiAgICAgICAgICAgICAgIGlmIChsX291dF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCksIGV4cGVjdGVkKTsKICAgICAgICAgICAgIH0KQEAgLTc1NywxMyArNzU4LDEzIEBACiAgIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oMCksIDY0KTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0LmRpbWVuc2lvbigxKSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oMiksIDMpOwotICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDMpLCAxMyoxMyk7CisgIFZFUklGWV9JU19FUVVBTChsX291dC5kaW1lbnNpb24oMyksIDEzICogMTMpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXQuZGltZW5zaW9uKDQpLCAzMik7CiAKICAgLy8gUm93TWFqb3IKICAgbF9vdXRfcm93X21ham9yID0gbF9pbi5zd2FwX2xheW91dCgpLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygzLCAzKTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMCksIDMyKTsKLSAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDEzKjEzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDEzICogMTMpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigyKSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDMpLCAzKTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oNCksIDY0KTsKQEAgLTc3MSwyMiArNzcyLDI0IEBACiAgIGZvciAoaW50IGIgPSAwOyBiIDwgMzI7ICsrYikgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTM7ICsraSkgewogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMzsgKytqKSB7Ci0gICAgICAgIGludCBwYXRjaElkID0gaSsxMypqOworICAgICAgICBpbnQgcGF0Y2hJZCA9IGkgKyAxMyAqIGo7CiAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgMzsgKytjKSB7CiAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCAzOyArK3IpIHsKICAgICAgICAgICAgIGZvciAoaW50IGQgPSAwOyBkIDwgNjQ7ICsrZCkgewogICAgICAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7Ci0gICAgICAgICAgICAgIGlmIChyLTEraSA+PSAwICYmIGMtMStqID49IDAgJiYgci0xK2kgPCAxMyAmJiBjLTEraiA8IDEzKSB7Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsX2luKGQsIHItMStpLCBjLTEraiwgYik7CisgICAgICAgICAgICAgIGlmIChyIC0gMSArIGkgPj0gMCAmJiBjIC0gMSArIGogPj0gMCAmJiByIC0gMSArIGkgPCAxMyAmJiBjIC0gMSArIGogPCAxMykgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbF9pbihkLCByIC0gMSArIGksIGMgLSAxICsgaiwgYik7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLy8gQ29sTWFqb3IKICAgICAgICAgICAgICAgaWYgKGxfb3V0KGQsIHIsIGMsIHBhdGNoSWQsIGIpICE9IGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwobF9vdXQoZCwgciwgYywgcGF0Y2hJZCwgYiksIGV4cGVjdGVkKTsKICAgICAgICAgICAgICAgLy8gUm93TWFqb3IKICAgICAgICAgICAgICAgaWYgKGxfb3V0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSAhPSBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSwgZXhwZWN0ZWQpOwogICAgICAgICAgICAgfQpAQCAtNzk3LDggKzgwMCw3IEBACiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9pbWFnZV9wYXRjaCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfaW1hZ2VfcGF0Y2gpIHsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9zaW1wbGVfcGF0Y2goKSk7CiAgIENBTExfU1VCVEVTVF8yKHRlc3RfcGF0Y2hfbm9fZXh0cmFfZGltKCkpOwogICBDQUxMX1NVQlRFU1RfMyh0ZXN0X3BhdGNoX3BhZGRpbmdfdmFsaWQoKSk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbWFnZV9wYXRjaF9zeWNsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ltYWdlX3BhdGNoX3N5Y2wuY3BwCmluZGV4IGMxODI4YTAuLjljYmYyNmMgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ltYWdlX3BhdGNoX3N5Y2wuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ltYWdlX3BhdGNoX3N5Y2wuY3BwCkBAIC0yNCwyNiArMjQsMjkgQEAKIHN0YXRpYyBjb25zdCBpbnQgRGF0YUxheW91dCA9IENvbE1ham9yOwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2ltYWdlX3BhdGNoX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQoteworc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfaW1hZ2VfcGF0Y2hfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gMjsKICAgSW5kZXhUeXBlIHNpemVEaW0yID0gMzsKICAgSW5kZXhUeXBlIHNpemVEaW0zID0gNTsKICAgSW5kZXhUeXBlIHNpemVEaW00ID0gNzsKICAgYXJyYXk8SW5kZXhUeXBlLCA0PiB0ZW5zb3JDb2xNYWpvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNH19OwogICBhcnJheTxJbmRleFR5cGUsIDQ+IHRlbnNvclJvd01ham9yUmFuZ2UgPSB7e3NpemVEaW00LCBzaXplRGltMywgc2l6ZURpbTIsIHNpemVEaW0xfX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+IHRlbnNvcl9jb2xfbWFqb3IodGVuc29yQ29sTWFqb3JSYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgUm93TWFqb3IsSW5kZXhUeXBlPiB0ZW5zb3Jfcm93X21ham9yKHRlbnNvclJvd01ham9yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yX2NvbF9tYWpvcih0ZW5zb3JDb2xNYWpvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBSb3dNYWpvciwgSW5kZXhUeXBlPiB0ZW5zb3Jfcm93X21ham9yKHRlbnNvclJvd01ham9yUmFuZ2UpOwogICB0ZW5zb3JfY29sX21ham9yLnNldFJhbmRvbSgpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YV9jb2xfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JfY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9yb3dfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3Jfcm93X21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9jb2xfbWFqb3IgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JfY29sX21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jvd19tYWpvciA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcl9yb3dfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBDb2xNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X2NvbF9tYWpvcihncHVfZGF0YV9jb2xfbWFqb3IsIHRlbnNvckNvbE1ham9yUmFuZ2UpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBSb3dNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X3Jvd19tYWpvcihncHVfZGF0YV9yb3dfbWFqb3IsIHRlbnNvclJvd01ham9yUmFuZ2UpOwogCi0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV9jb2xfbWFqb3IsIHRlbnNvcl9jb2xfbWFqb3IuZGF0YSgpLCh0ZW5zb3JfY29sX21ham9yLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIGdwdV9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfY29sX21ham9yLnN3YXBfbGF5b3V0KCk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3Jfcm93X21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfcm93X21ham9yLCAodGVuc29yX2NvbF9tYWpvci5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfY29sX21ham9yLCB0ZW5zb3JfY29sX21ham9yLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW5zb3JfY29sX21ham9yLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgZ3B1X3Jvd19tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2NvbF9tYWpvci5zd2FwX2xheW91dCgpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yX3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX3Jvd19tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW5zb3JfY29sX21ham9yLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAogICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2NvbF9tYWpvci5kaW1lbnNpb24oMCksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDMpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9jb2xfbWFqb3IuZGltZW5zaW9uKDEpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigyKSk7CkBAIC01MSwzMSArNTQsMzMgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9jb2xfbWFqb3IuZGltZW5zaW9uKDMpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigwKSk7CiAKICAgLy8gU2luZ2xlIHBpeGVsIHBhdGNoOiBDb2xNYWpvcgotICBhcnJheTxJbmRleFR5cGUsIDU+IHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZT17e3NpemVEaW0xLCAxLCAxLCBzaXplRGltMipzaXplRGltMywgc2l6ZURpbTR9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gc2luZ2xlX3BhdGNoX2NvbF9tYWpvcihwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOwotICBzaXplX3QgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9c2luZ2xlX3BhdGNoX2NvbF9tYWpvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3NpbmdsZV9wYXRjaF9jb2xfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X3NpbmdsZV9wYXRjaF9jb2xfbWFqb3IoZ3B1X2RhdGFfc2luZ2xlX3BhdGNoX2NvbF9tYWpvciwgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKLSAgZ3B1X3NpbmdsZV9wYXRjaF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfY29sX21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygxLCAxKTsKKyAgYXJyYXk8SW5kZXhUeXBlLCA1PiBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UgPSB7e3NpemVEaW0xLCAxLCAxLCBzaXplRGltMiAqIHNpemVEaW0zLCBzaXplRGltNH19OworICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gc2luZ2xlX3BhdGNoX2NvbF9tYWpvcihwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOworICBzaXplX3QgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IHNpbmdsZV9wYXRjaF9jb2xfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3NpbmdsZV9wYXRjaF9jb2xfbWFqb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3NpbmdsZV9wYXRjaF9jb2xfbWFqb3IoZ3B1X2RhdGFfc2luZ2xlX3BhdGNoX2NvbF9tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X3NpbmdsZV9wYXRjaF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9jb2xfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDEsIDEpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qoc2luZ2xlX3BhdGNoX2NvbF9tYWpvci5kYXRhKCksIGdwdV9kYXRhX3NpbmdsZV9wYXRjaF9jb2xfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigwKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigxKSwgMSk7CiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigyKSwgMSk7Ci0gIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigzKSwgMyo1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9wYXRjaF9jb2xfbWFqb3IuZGltZW5zaW9uKDMpLCAzICogNSk7CiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbig0KSwgNyk7CiAKICAgLy8gU2luZ2xlIHBpeGVsIHBhdGNoOiBSb3dNYWpvcgotICBhcnJheTxJbmRleFR5cGUsIDU+IHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZT17e3NpemVEaW00LCBzaXplRGltMipzaXplRGltMywgMSwgMSwgc2l6ZURpbTF9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvcixJbmRleFR5cGU+IHNpbmdsZV9wYXRjaF9yb3dfbWFqb3IocGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKLSAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9c2luZ2xlX3BhdGNoX3Jvd19tYWpvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3NpbmdsZV9wYXRjaF9yb3dfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLEluZGV4VHlwZT4+IGdwdV9zaW5nbGVfcGF0Y2hfcm93X21ham9yKGdwdV9kYXRhX3NpbmdsZV9wYXRjaF9yb3dfbWFqb3IsIHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7Ci0gIGdwdV9zaW5nbGVfcGF0Y2hfcm93X21ham9yLmRldmljZShzeWNsX2RldmljZSk9Z3B1X3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMSwgMSk7CisgIGFycmF5PEluZGV4VHlwZSwgNT4gcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlID0ge3tzaXplRGltNCwgc2l6ZURpbTIgKiBzaXplRGltMywgMSwgMSwgc2l6ZURpbTF9fTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvciwgSW5kZXhUeXBlPiBzaW5nbGVfcGF0Y2hfcm93X21ham9yKHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7CisgIHBhdGNoVGVuc29yQnVmZlNpemUgPSBzaW5nbGVfcGF0Y2hfcm93X21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9zaW5nbGVfcGF0Y2hfcm93X21ham9yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLCBJbmRleFR5cGU+PiBncHVfc2luZ2xlX3BhdGNoX3Jvd19tYWpvcihncHVfZGF0YV9zaW5nbGVfcGF0Y2hfcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X3NpbmdsZV9wYXRjaF9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDEsIDEpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qoc2luZ2xlX3BhdGNoX3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX3NpbmdsZV9wYXRjaF9yb3dfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigwKSwgNyk7Ci0gIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigxKSwgMyo1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCAzICogNSk7CiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigyKSwgMSk7CiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMSk7CiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbig0KSwgMik7CkBAIC04Myw4MiArODgsNzkgQEAKICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCB0ZW5zb3JfY29sX21ham9yLnNpemUoKTsgKytpKSB7CiAgICAgLy8gQ29sTWFqb3IKICAgICBpZiAodGVuc29yX2NvbF9tYWpvci5kYXRhKClbaV0gIT0gc2luZ2xlX3BhdGNoX2NvbF9tYWpvci5kYXRhKClbaV0pIHsKLSAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggY29sbWFqb3IgIiA8PCBpIDw8ICIgOiAiCi0gICAgICAgICAgIDw8IHRlbnNvcl9jb2xfbWFqb3IuZGF0YSgpW2ldIDw8ICIgdnMgIiA8PCBzaW5nbGVfcGF0Y2hfY29sX21ham9yLmRhdGEoKVtpXQotICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGNvbG1ham9yICIgPDwgaSA8PCAiIDogIiA8PCB0ZW5zb3JfY29sX21ham9yLmRhdGEoKVtpXSA8PCAiIHZzICIKKyAgICAgICAgICAgICAgICA8PCBzaW5nbGVfcGF0Y2hfY29sX21ham9yLmRhdGEoKVtpXSA8PCBzdGQ6OmVuZGw7CiAgICAgfQogICAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfY29sX21ham9yLmRhdGEoKVtpXSwgdGVuc29yX2NvbF9tYWpvci5kYXRhKClbaV0pOwogICAgIC8vIFJvd01ham9yCiAgICAgaWYgKHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpW2ldICE9IHNpbmdsZV9wYXRjaF9yb3dfbWFqb3IuZGF0YSgpW2ldKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IHJvdyBtYWpvciIgPDwgaSA8PCAiIDogIgotICAgICAgICAgICA8PCB0ZW5zb3Jfcm93X21ham9yLmRhdGEoKVtpXSA8PCAiIHZzICIKLSAgICAgICAgICAgPDwgc2luZ2xlX3BhdGNoX3Jvd19tYWpvci5kYXRhKClbaV0gPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCByb3cgbWFqb3IiIDw8IGkgPDwgIiA6ICIgPDwgdGVuc29yX3Jvd19tYWpvci5kYXRhKClbaV0gPDwgIiB2cyAiCisgICAgICAgICAgICAgICAgPDwgc2luZ2xlX3BhdGNoX3Jvd19tYWpvci5kYXRhKClbaV0gPDwgc3RkOjplbmRsOwogICAgIH0KLSAgICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoX3Jvd19tYWpvci5kYXRhKClbaV0sCi0gICAgICAgICAgICAgICAgICAgIHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpW2ldKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoX3Jvd19tYWpvci5kYXRhKClbaV0sIHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpW2ldKTsKICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2NvbF9tYWpvci5kYXRhKClbaV0sIHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpW2ldKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoX2NvbF9tYWpvci5kYXRhKClbaV0sCi0gICAgICAgICAgICAgICAgICAgIHNpbmdsZV9wYXRjaF9yb3dfbWFqb3IuZGF0YSgpW2ldKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoX2NvbF9tYWpvci5kYXRhKClbaV0sIHNpbmdsZV9wYXRjaF9yb3dfbWFqb3IuZGF0YSgpW2ldKTsKICAgfQogCi0KICAgLy8gRW50aXJlIGltYWdlIHBhdGNoOiBDb2xNYWpvcgotICBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2U9e3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltMipzaXplRGltMywgc2l6ZURpbTR9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvcihwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOwotICBwYXRjaFRlbnNvckJ1ZmZTaXplID1lbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvcihncHVfZGF0YV9lbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yLCBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOwotICBncHVfZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9jb2xfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDMsIDUpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kYXRhKCksIGdwdV9kYXRhX2VudGlyZV9pbWFnZV9wYXRjaF9jb2xfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOworICBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTMsIHNpemVEaW0yICogc2l6ZURpbTMsIHNpemVEaW00fX07CisgIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBlbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yKHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7CisgIHBhdGNoVGVuc29yQnVmZlNpemUgPSBlbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9lbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9lbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yKAorICAgICAgZ3B1X2RhdGFfZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvciwgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X2VudGlyZV9pbWFnZV9wYXRjaF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9jb2xfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDMsIDUpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kYXRhKCksIGdwdV9kYXRhX2VudGlyZV9pbWFnZV9wYXRjaF9jb2xfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFRlbnNvckJ1ZmZTaXplKTsKIAogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMCksIDIpOwogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMSksIDMpOwogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMiksIDUpOwotICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMyksIDMqNSk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigzKSwgMyAqIDUpOwogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oNCksIDcpOwogCiAgIC8vIEVudGlyZSBpbWFnZSBwYXRjaDogUm93TWFqb3IKLSAgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlPXt7c2l6ZURpbTQsIHNpemVEaW0yKnNpemVEaW0zLCBzaXplRGltMywgc2l6ZURpbTIsIHNpemVEaW0xfX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNSwgUm93TWFqb3IsSW5kZXhUeXBlPiBlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yKHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7Ci0gIHBhdGNoVGVuc29yQnVmZlNpemUgPWVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9lbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvcixJbmRleFR5cGU+PiBncHVfZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvcihncHVfZGF0YV9lbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLCBwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UpOwotICBncHVfZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDMsIDUpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX2VudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOworICBwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UgPSB7e3NpemVEaW00LCBzaXplRGltMiAqIHNpemVEaW0zLCBzaXplRGltMywgc2l6ZURpbTIsIHNpemVEaW0xfX07CisgIFRlbnNvcjxEYXRhVHlwZSwgNSwgUm93TWFqb3IsIEluZGV4VHlwZT4gZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvcihwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UpOworICBwYXRjaFRlbnNvckJ1ZmZTaXplID0gZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X2VudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IoCisgICAgICBncHVfZGF0YV9lbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLCBwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UpOworICBncHVfZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMywgNSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigwKSwgNyk7Ci0gIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigxKSwgMyo1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCAzICogNSk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigyKSwgNSk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbig0KSwgMik7CiAKICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IDU7ICsraikgewotICAgICAgSW5kZXhUeXBlIHBhdGNoSWQgPSBpKzMqajsKKyAgICAgIEluZGV4VHlwZSBwYXRjaElkID0gaSArIDMgKiBqOwogICAgICAgZm9yIChJbmRleFR5cGUgciA9IDA7IHIgPCAzOyArK3IpIHsKICAgICAgICAgZm9yIChJbmRleFR5cGUgYyA9IDA7IGMgPCA1OyArK2MpIHsKICAgICAgICAgICBmb3IgKEluZGV4VHlwZSBkID0gMDsgZCA8IDI7ICsrZCkgewogICAgICAgICAgICAgZm9yIChJbmRleFR5cGUgYiA9IDA7IGIgPCA3OyArK2IpIHsKICAgICAgICAgICAgICAgRGF0YVR5cGUgZXhwZWN0ZWRfY29sX21ham9yID0gMC4wZjsKICAgICAgICAgICAgICAgRGF0YVR5cGUgZXhwZWN0ZWRfcm93X21ham9yID0gMC4wZjsKLSAgICAgICAgICAgICAgaWYgKHItMStpID49IDAgJiYgYy0yK2ogPj0gMCAmJiByLTEraSA8IDMgJiYgYy0yK2ogPCA1KSB7Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWRfY29sX21ham9yID0gdGVuc29yX2NvbF9tYWpvcihkLCByLTEraSwgYy0yK2osIGIpOwotICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IoYiwgYy0yK2osIHItMStpLCBkKTsKKyAgICAgICAgICAgICAgaWYgKHIgLSAxICsgaSA+PSAwICYmIGMgLSAyICsgaiA+PSAwICYmIHIgLSAxICsgaSA8IDMgJiYgYyAtIDIgKyBqIDwgNSkgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkX2NvbF9tYWpvciA9IHRlbnNvcl9jb2xfbWFqb3IoZCwgciAtIDEgKyBpLCBjIC0gMiArIGosIGIpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IoYiwgYyAtIDIgKyBqLCByIC0gMSArIGksIGQpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC8vIENvbE1ham9yCiAgICAgICAgICAgICAgIGlmIChlbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yKGQsIHIsIGMsIHBhdGNoSWQsIGIpICE9IGV4cGVjdGVkX2NvbF9tYWpvcikgewotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaF9jb2xfbWFqb3IoZCwgciwgYywgcGF0Y2hJZCwgYiksIGV4cGVjdGVkX2NvbF9tYWpvcik7CiAgICAgICAgICAgICAgIC8vIFJvd01ham9yCi0gICAgICAgICAgICAgIGlmIChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpICE9Ci0gICAgICAgICAgICAgICAgICBleHBlY3RlZF9yb3dfbWFqb3IpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGoKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgaWYgKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWRfcm93X21ham9yKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcm93X21ham9yKTsKKyAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCksIGV4cGVjdGVkX3Jvd19tYWpvcik7CiAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgQ29sTWFqb3IgYW5kIFJvd01ham9yIGFncmVlLgogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoZXhwZWN0ZWRfY29sX21ham9yLCBleHBlY3RlZF9yb3dfbWFqb3IpOwogICAgICAgICAgICAgfQpAQCAtMTY5LDM2ICsxNzEsMzcgQEAKICAgfQogCiAgIC8vIDJEIHBhdGNoOiBDb2xNYWpvcgotICBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2U9e3tzaXplRGltMSwgMiwgMiwgc2l6ZURpbTIqc2l6ZURpbTMsIHNpemVEaW00fX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+IHR3b2RfcGF0Y2hfY29sX21ham9yKHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7Ci0gIHBhdGNoVGVuc29yQnVmZlNpemUgPXR3b2RfcGF0Y2hfY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfdHdvZF9wYXRjaF9jb2xfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X3R3b2RfcGF0Y2hfY29sX21ham9yKGdwdV9kYXRhX3R3b2RfcGF0Y2hfY29sX21ham9yLCBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOwotICBncHVfdHdvZF9wYXRjaF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfY29sX21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygyLCAyKTsKKyAgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgMiwgMiwgc2l6ZURpbTIgKiBzaXplRGltMywgc2l6ZURpbTR9fTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHR3b2RfcGF0Y2hfY29sX21ham9yKHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7CisgIHBhdGNoVGVuc29yQnVmZlNpemUgPSB0d29kX3BhdGNoX2NvbF9tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfdHdvZF9wYXRjaF9jb2xfbWFqb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3R3b2RfcGF0Y2hfY29sX21ham9yKGdwdV9kYXRhX3R3b2RfcGF0Y2hfY29sX21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X3R3b2RfcGF0Y2hfY29sX21ham9yLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfY29sX21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygyLCAyKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHR3b2RfcGF0Y2hfY29sX21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfdHdvZF9wYXRjaF9jb2xfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCiAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMCksIDIpOwogICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9jb2xfbWFqb3IuZGltZW5zaW9uKDEpLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigyKSwgMik7Ci0gIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMyksIDMqNSk7CisgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMyksIDMgKiA1KTsKICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbig0KSwgNyk7CiAKICAgLy8gMkQgcGF0Y2g6IFJvd01ham9yCi0gIHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZT17e3NpemVEaW00LCBzaXplRGltMipzaXplRGltMywgMiwgMiwgc2l6ZURpbTF9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvcixJbmRleFR5cGU+IHR3b2RfcGF0Y2hfcm93X21ham9yKHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7Ci0gIHBhdGNoVGVuc29yQnVmZlNpemUgPXR3b2RfcGF0Y2hfcm93X21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfdHdvZF9wYXRjaF9yb3dfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLEluZGV4VHlwZT4+IGdwdV90d29kX3BhdGNoX3Jvd19tYWpvcihncHVfZGF0YV90d29kX3BhdGNoX3Jvd19tYWpvciwgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKLSAgZ3B1X3R3b2RfcGF0Y2hfcm93X21ham9yLmRldmljZShzeWNsX2RldmljZSk9Z3B1X3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMiwgMik7CisgIHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTQsIHNpemVEaW0yICogc2l6ZURpbTMsIDIsIDIsIHNpemVEaW0xfX07CisgIFRlbnNvcjxEYXRhVHlwZSwgNSwgUm93TWFqb3IsIEluZGV4VHlwZT4gdHdvZF9wYXRjaF9yb3dfbWFqb3IocGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKKyAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IHR3b2RfcGF0Y2hfcm93X21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV90d29kX3BhdGNoX3Jvd19tYWpvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X3R3b2RfcGF0Y2hfcm93X21ham9yKGdwdV9kYXRhX3R3b2RfcGF0Y2hfcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7CisgIGdwdV90d29kX3BhdGNoX3Jvd19tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMiwgMik7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0d29kX3BhdGNoX3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX3R3b2RfcGF0Y2hfcm93X21ham9yLCBwYXRjaFRlbnNvckJ1ZmZTaXplKTsKIAogICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDApLCA3KTsKLSAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigxKSwgMyo1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigxKSwgMyAqIDUpOwogICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDIpLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oNCksIDIpOwogCi0KICAgLy8gQmFzZWQgb24gdGhlIGNhbGN1bGF0aW9uIGRlc2NyaWJlZCBpbiBUZW5zb3JUcmFpdHMuaCwgcGFkZGluZyBoYXBwZW5zIHRvIGJlIDAuCiAgIEluZGV4VHlwZSByb3dfcGFkZGluZyA9IDA7CiAgIEluZGV4VHlwZSBjb2xfcGFkZGluZyA9IDA7CkBAIC0yMDYsMzEgKzIwOSwzNCBAQAogCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCA1OyArK2opIHsKLSAgICAgIEluZGV4VHlwZSBwYXRjaElkID0gaSszKmo7CisgICAgICBJbmRleFR5cGUgcGF0Y2hJZCA9IGkgKyAzICogajsKICAgICAgIGZvciAoSW5kZXhUeXBlIHIgPSAwOyByIDwgMjsgKytyKSB7CiAgICAgICAgIGZvciAoSW5kZXhUeXBlIGMgPSAwOyBjIDwgMjsgKytjKSB7CiAgICAgICAgICAgZm9yIChJbmRleFR5cGUgZCA9IDA7IGQgPCAyOyArK2QpIHsKICAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGIgPSAwOyBiIDwgNzsgKytiKSB7CiAgICAgICAgICAgICAgIERhdGFUeXBlIGV4cGVjdGVkX2NvbF9tYWpvciA9IDAuMGY7CiAgICAgICAgICAgICAgIERhdGFUeXBlIGV4cGVjdGVkX3Jvd19tYWpvciA9IDAuMGY7Ci0gICAgICAgICAgICAgIEluZGV4VHlwZSByb3dfb2Zmc2V0ID0gcipzdHJpZGUgKyBpIC0gcm93X3BhZGRpbmc7Ci0gICAgICAgICAgICAgIEluZGV4VHlwZSBjb2xfb2Zmc2V0ID0gYypzdHJpZGUgKyBqIC0gY29sX3BhZGRpbmc7CisgICAgICAgICAgICAgIEluZGV4VHlwZSByb3dfb2Zmc2V0ID0gciAqIHN0cmlkZSArIGkgLSByb3dfcGFkZGluZzsKKyAgICAgICAgICAgICAgSW5kZXhUeXBlIGNvbF9vZmZzZXQgPSBjICogc3RyaWRlICsgaiAtIGNvbF9wYWRkaW5nOwogICAgICAgICAgICAgICAvLyBDb2xNYWpvcgotICAgICAgICAgICAgICBpZiAocm93X29mZnNldCA+PSAwICYmIGNvbF9vZmZzZXQgPj0gMCAmJiByb3dfb2Zmc2V0IDwgdGVuc29yX2NvbF9tYWpvci5kaW1lbnNpb24oMSkgJiYgY29sX29mZnNldCA8IHRlbnNvcl9jb2xfbWFqb3IuZGltZW5zaW9uKDIpKSB7CisgICAgICAgICAgICAgIGlmIChyb3dfb2Zmc2V0ID49IDAgJiYgY29sX29mZnNldCA+PSAwICYmIHJvd19vZmZzZXQgPCB0ZW5zb3JfY29sX21ham9yLmRpbWVuc2lvbigxKSAmJgorICAgICAgICAgICAgICAgICAgY29sX29mZnNldCA8IHRlbnNvcl9jb2xfbWFqb3IuZGltZW5zaW9uKDIpKSB7CiAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfY29sX21ham9yID0gdGVuc29yX2NvbF9tYWpvcihkLCByb3dfb2Zmc2V0LCBjb2xfb2Zmc2V0LCBiKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiAodHdvZF9wYXRjaF9jb2xfbWFqb3IoZCwgciwgYywgcGF0Y2hJZCwgYikgIT0gZXhwZWN0ZWRfY29sX21ham9yKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9jb2xfbWFqb3IoZCwgciwgYywgcGF0Y2hJZCwgYiksIGV4cGVjdGVkX2NvbF9tYWpvcik7CiAKICAgICAgICAgICAgICAgLy8gUm93TWFqb3IKLSAgICAgICAgICAgICAgaWYgKHJvd19vZmZzZXQgPj0gMCAmJiBjb2xfb2Zmc2V0ID49IDAgJiYgcm93X29mZnNldCA8IHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDIpICYmIGNvbF9vZmZzZXQgPCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigxKSkgeworICAgICAgICAgICAgICBpZiAocm93X29mZnNldCA+PSAwICYmIGNvbF9vZmZzZXQgPj0gMCAmJiByb3dfb2Zmc2V0IDwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMikgJiYKKyAgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQgPCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigxKSkgewogICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IoYiwgY29sX29mZnNldCwgcm93X29mZnNldCwgZCk7Ci0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiAodHdvZF9wYXRjaF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWRfcm93X21ham9yKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCksIGV4cGVjdGVkX3Jvd19tYWpvcik7CiAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgQ29sTWFqb3IgYW5kIFJvd01ham9yIGFncmVlLgpAQCAtMjUwLDMzICsyNTYsMzUgQEAKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfZGF0YV9lbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yKTsKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfZGF0YV90d29kX3BhdGNoX2NvbF9tYWpvcik7CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2RhdGFfdHdvZF9wYXRjaF9yb3dfbWFqb3IpOwotCiB9CiAKLQogLy8gVmVyaWZpZXMgVkFMSUQgcGFkZGluZyAobm8gcGFkZGluZykgd2l0aCBpbmNyZW1lbnRpbmcgdmFsdWVzLgogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X3BhdGNoX3BhZGRpbmdfdmFsaWRfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2Upeworc3RhdGljIHZvaWQgdGVzdF9wYXRjaF9wYWRkaW5nX3ZhbGlkX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIEluZGV4VHlwZSBpbnB1dF9kZXB0aCA9IDM7CiAgIEluZGV4VHlwZSBpbnB1dF9yb3dzID0gMzsKICAgSW5kZXhUeXBlIGlucHV0X2NvbHMgPSAzOwogICBJbmRleFR5cGUgaW5wdXRfYmF0Y2hlcyA9IDE7Ci0gIEluZGV4VHlwZSBrc2l6ZSA9IDI7ICAvLyBDb3JyZXNwb25kcyB0byB0aGUgUm93cyBhbmQgQ29scyBmb3IgdGVuc29yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlczw+LgorICBJbmRleFR5cGUga3NpemUgPSAyOyAgIC8vIENvcnJlc3BvbmRzIHRvIHRoZSBSb3dzIGFuZCBDb2xzIGZvciB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzPD4uCiAgIEluZGV4VHlwZSBzdHJpZGUgPSAyOyAgLy8gT25seSBzYW1lIHN0cmlkZSBpcyBzdXBwb3J0ZWQuCiAKICAgYXJyYXk8SW5kZXhUeXBlLCA0PiB0ZW5zb3JDb2xNYWpvclJhbmdlID0ge3tpbnB1dF9kZXB0aCwgaW5wdXRfcm93cywgaW5wdXRfY29scywgaW5wdXRfYmF0Y2hlc319OwogICBhcnJheTxJbmRleFR5cGUsIDQ+IHRlbnNvclJvd01ham9yUmFuZ2UgPSB7e2lucHV0X2JhdGNoZXMsIGlucHV0X2NvbHMsIGlucHV0X3Jvd3MsIGlucHV0X2RlcHRofX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+IHRlbnNvcl9jb2xfbWFqb3IodGVuc29yQ29sTWFqb3JSYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgUm93TWFqb3IsSW5kZXhUeXBlPiB0ZW5zb3Jfcm93X21ham9yKHRlbnNvclJvd01ham9yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yX2NvbF9tYWpvcih0ZW5zb3JDb2xNYWpvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBSb3dNYWpvciwgSW5kZXhUeXBlPiB0ZW5zb3Jfcm93X21ham9yKHRlbnNvclJvd01ham9yUmFuZ2UpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YV9jb2xfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JfY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9yb3dfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3Jfcm93X21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9jb2xfbWFqb3IgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JfY29sX21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jvd19tYWpvciA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcl9yb3dfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBDb2xNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X2NvbF9tYWpvcihncHVfZGF0YV9jb2xfbWFqb3IsIHRlbnNvckNvbE1ham9yUmFuZ2UpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBSb3dNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X3Jvd19tYWpvcihncHVfZGF0YV9yb3dfbWFqb3IsIHRlbnNvclJvd01ham9yUmFuZ2UpOwogCi0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV9jb2xfbWFqb3IsIHRlbnNvcl9jb2xfbWFqb3IuZGF0YSgpLCh0ZW5zb3JfY29sX21ham9yLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIGdwdV9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfY29sX21ham9yLnN3YXBfbGF5b3V0KCk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3Jfcm93X21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfcm93X21ham9yLCAodGVuc29yX2NvbF9tYWpvci5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfY29sX21ham9yLCB0ZW5zb3JfY29sX21ham9yLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW5zb3JfY29sX21ham9yLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgZ3B1X3Jvd19tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2NvbF9tYWpvci5zd2FwX2xheW91dCgpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yX3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX3Jvd19tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW5zb3JfY29sX21ham9yLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAogICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2NvbF9tYWpvci5kaW1lbnNpb24oMCksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDMpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9jb2xfbWFqb3IuZGltZW5zaW9uKDEpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigyKSk7CkBAIC0yODgsMjcgKzI5NiwzMSBAQAogICAgIHRlbnNvcl9jb2xfbWFqb3IuZGF0YSgpW2ldID0gaSArIDE7CiAgIH0KICAgLy8gQ29sTWFqb3IKLSAgYXJyYXk8SW5kZXhUeXBlLCA1PiBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2U9e3tpbnB1dF9kZXB0aCwga3NpemUsIGtzaXplLCAxLCBpbnB1dF9iYXRjaGVzfX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+IHJlc3VsdF9jb2xfbWFqb3IocGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKLSAgc2l6ZV90IHBhdGNoVGVuc29yQnVmZlNpemUgPXJlc3VsdF9jb2xfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9yZXN1bHRfY29sX21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9yZXN1bHRfY29sX21ham9yKGdwdV9kYXRhX3Jlc3VsdF9jb2xfbWFqb3IsIHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7Ci0gIGdwdV9yZXN1bHRfY29sX21ham9yLmRldmljZShzeWNsX2RldmljZSk9Z3B1X2NvbF9tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoa3NpemUsIGtzaXplLCBzdHJpZGUsIHN0cmlkZSwgMSwgMSwgUEFERElOR19WQUxJRCk7CisgIGFycmF5PEluZGV4VHlwZSwgNT4gcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlID0ge3tpbnB1dF9kZXB0aCwga3NpemUsIGtzaXplLCAxLCBpbnB1dF9iYXRjaGVzfX07CisgIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiByZXN1bHRfY29sX21ham9yKHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7CisgIHNpemVfdCBwYXRjaFRlbnNvckJ1ZmZTaXplID0gcmVzdWx0X2NvbF9tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfcmVzdWx0X2NvbF9tYWpvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfcmVzdWx0X2NvbF9tYWpvcihncHVfZGF0YV9yZXN1bHRfY29sX21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOworICBncHVfcmVzdWx0X2NvbF9tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpID0KKyAgICAgIGdwdV9jb2xfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKGtzaXplLCBrc2l6ZSwgc3RyaWRlLCBzdHJpZGUsIDEsIDEsIFBBRERJTkdfVkFMSUQpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmVzdWx0X2NvbF9tYWpvci5kYXRhKCksIGdwdV9kYXRhX3Jlc3VsdF9jb2xfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCi0gIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yLmRpbWVuc2lvbigwKSwgaW5wdXRfZGVwdGgpOyAgLy8gZGVwdGgKLSAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF9jb2xfbWFqb3IuZGltZW5zaW9uKDEpLCBrc2l6ZSk7ICAvLyBrZXJuZWwgcm93cwotICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X2NvbF9tYWpvci5kaW1lbnNpb24oMiksIGtzaXplKTsgIC8vIGtlcm5lbCBjb2xzCi0gIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yLmRpbWVuc2lvbigzKSwgMSk7ICAvLyBudW1iZXIgb2YgcGF0Y2hlcworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X2NvbF9tYWpvci5kaW1lbnNpb24oMCksIGlucHV0X2RlcHRoKTsgICAgLy8gZGVwdGgKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF9jb2xfbWFqb3IuZGltZW5zaW9uKDEpLCBrc2l6ZSk7ICAgICAgICAgIC8vIGtlcm5lbCByb3dzCisgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yLmRpbWVuc2lvbigyKSwga3NpemUpOyAgICAgICAgICAvLyBrZXJuZWwgY29scworICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X2NvbF9tYWpvci5kaW1lbnNpb24oMyksIDEpOyAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHBhdGNoZXMKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF9jb2xfbWFqb3IuZGltZW5zaW9uKDQpLCBpbnB1dF9iYXRjaGVzKTsgIC8vIG51bWJlciBvZiBiYXRjaGVzCiAKICAgLy8gUm93TWFqb3IKLSAgYXJyYXk8SW5kZXhUeXBlLCA1PiBwYXRjaFJvd01ham9yVGVuc29yUmFuZ2U9e3tpbnB1dF9iYXRjaGVzLCAxLCBrc2l6ZSwga3NpemUsIGlucHV0X2RlcHRoIH19OwotICBUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLEluZGV4VHlwZT4gcmVzdWx0X3Jvd19tYWpvcihwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UpOwotICBwYXRjaFRlbnNvckJ1ZmZTaXplID1yZXN1bHRfcm93X21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfcmVzdWx0X3Jvd19tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgUm93TWFqb3IsSW5kZXhUeXBlPj4gZ3B1X3Jlc3VsdF9yb3dfbWFqb3IoZ3B1X2RhdGFfcmVzdWx0X3Jvd19tYWpvciwgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKLSAgZ3B1X3Jlc3VsdF9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfcm93X21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyhrc2l6ZSwga3NpemUsIHN0cmlkZSwgc3RyaWRlLCAxLCAxLCBQQURESU5HX1ZBTElEKTsKKyAgYXJyYXk8SW5kZXhUeXBlLCA1PiBwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UgPSB7e2lucHV0X2JhdGNoZXMsIDEsIGtzaXplLCBrc2l6ZSwgaW5wdXRfZGVwdGh9fTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvciwgSW5kZXhUeXBlPiByZXN1bHRfcm93X21ham9yKHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7CisgIHBhdGNoVGVuc29yQnVmZlNpemUgPSByZXN1bHRfcm93X21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9yZXN1bHRfcm93X21ham9yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLCBJbmRleFR5cGU+PiBncHVfcmVzdWx0X3Jvd19tYWpvcihncHVfZGF0YV9yZXN1bHRfcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X3Jlc3VsdF9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9CisgICAgICBncHVfcm93X21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyhrc2l6ZSwga3NpemUsIHN0cmlkZSwgc3RyaWRlLCAxLCAxLCBQQURESU5HX1ZBTElEKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJlc3VsdF9yb3dfbWFqb3IuZGF0YSgpLCBncHVfZGF0YV9yZXN1bHRfcm93X21ham9yLCBwYXRjaFRlbnNvckJ1ZmZTaXplKTsKIAogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X2NvbF9tYWpvci5kaW1lbnNpb24oMCksIHJlc3VsdF9yb3dfbWFqb3IuZGltZW5zaW9uKDQpKTsKQEAgLTMyMSwxMiArMzMzLDEyIEBACiAgIEluZGV4VHlwZSByb3dfcGFkZGluZyA9IDA7CiAgIEluZGV4VHlwZSBjb2xfcGFkZGluZyA9IDA7CiAKLSAgZm9yIChJbmRleFR5cGUgaSA9IDA7IChpK3N0cmlkZStrc2l6ZS0xKSA8IGlucHV0X3Jvd3M7IGkgKz0gc3RyaWRlKSB7ICAvLyBpbnB1dCByb3dzCi0gICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IChqK3N0cmlkZStrc2l6ZS0xKSA8IGlucHV0X2NvbHM7IGogKz0gc3RyaWRlKSB7ICAvLyBpbnB1dCBjb2xzCi0gICAgICBJbmRleFR5cGUgcGF0Y2hJZCA9IGkraW5wdXRfcm93cypqOwotICAgICAgZm9yIChJbmRleFR5cGUgciA9IDA7IHIgPCBrc2l6ZTsgKytyKSB7ICAvLyBwYXRjaCByb3dzCi0gICAgICAgIGZvciAoSW5kZXhUeXBlIGMgPSAwOyBjIDwga3NpemU7ICsrYykgeyAgLy8gcGF0Y2ggY29scwotICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGQgPSAwOyBkIDwgaW5wdXRfZGVwdGg7ICsrZCkgeyAgLy8gZGVwdGgKKyAgZm9yIChJbmRleFR5cGUgaSA9IDA7IChpICsgc3RyaWRlICsga3NpemUgLSAxKSA8IGlucHV0X3Jvd3M7IGkgKz0gc3RyaWRlKSB7ICAgIC8vIGlucHV0IHJvd3MKKyAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgKGogKyBzdHJpZGUgKyBrc2l6ZSAtIDEpIDwgaW5wdXRfY29sczsgaiArPSBzdHJpZGUpIHsgIC8vIGlucHV0IGNvbHMKKyAgICAgIEluZGV4VHlwZSBwYXRjaElkID0gaSArIGlucHV0X3Jvd3MgKiBqOworICAgICAgZm9yIChJbmRleFR5cGUgciA9IDA7IHIgPCBrc2l6ZTsgKytyKSB7ICAgICAgICAgICAgICAgIC8vIHBhdGNoIHJvd3MKKyAgICAgICAgZm9yIChJbmRleFR5cGUgYyA9IDA7IGMgPCBrc2l6ZTsgKytjKSB7ICAgICAgICAgICAgICAvLyBwYXRjaCBjb2xzCisgICAgICAgICAgZm9yIChJbmRleFR5cGUgZCA9IDA7IGQgPCBpbnB1dF9kZXB0aDsgKytkKSB7ICAgICAgLy8gZGVwdGgKICAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGIgPSAwOyBiIDwgaW5wdXRfYmF0Y2hlczsgKytiKSB7ICAvLyBiYXRjaAogICAgICAgICAgICAgICBEYXRhVHlwZSBleHBlY3RlZF9jb2xfbWFqb3IgPSAwLjBmOwogICAgICAgICAgICAgICBEYXRhVHlwZSBleHBlY3RlZF9yb3dfbWFqb3IgPSAwLjBmOwpAQCAtMzM4LDEyICszNTAsMTQgQEAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAvLyBDb2xNYWpvcgogICAgICAgICAgICAgICBpZiAocmVzdWx0X2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkLCBiKSAhPSBleHBlY3RlZF9jb2xfbWFqb3IpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yKGQsIHIsIGMsIHBhdGNoSWQsIGIpLCBleHBlY3RlZF9jb2xfbWFqb3IpOwogICAgICAgICAgICAgICAvLyBSb3dNYWpvcgogICAgICAgICAgICAgICBpZiAocmVzdWx0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSAhPSBleHBlY3RlZF9yb3dfbWFqb3IpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZF9yb3dfbWFqb3IpOwogICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IENvbE1ham9yIGFuZCBSb3dNYWpvciBhZ3JlZS4KQEAgLTM2Miw1NCArMzc2LDYyIEBACiAKIC8vIFZlcmlmaWVzIFZBTElEIHBhZGRpbmcgKG5vIHBhZGRpbmcpIHdpdGggdGhlIHNhbWUgdmFsdWUuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfcGF0Y2hfcGFkZGluZ192YWxpZF9zYW1lX3ZhbHVlX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKXsKK3N0YXRpYyB2b2lkIHRlc3RfcGF0Y2hfcGFkZGluZ192YWxpZF9zYW1lX3ZhbHVlX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIEluZGV4VHlwZSBpbnB1dF9kZXB0aCA9IDE7CiAgIEluZGV4VHlwZSBpbnB1dF9yb3dzID0gNTsKICAgSW5kZXhUeXBlIGlucHV0X2NvbHMgPSA1OwogICBJbmRleFR5cGUgaW5wdXRfYmF0Y2hlcyA9IDI7Ci0gIEluZGV4VHlwZSBrc2l6ZSA9IDM7ICAvLyBDb3JyZXNwb25kcyB0byB0aGUgUm93cyBhbmQgQ29scyBmb3IgdGVuc29yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlczw+LgorICBJbmRleFR5cGUga3NpemUgPSAzOyAgIC8vIENvcnJlc3BvbmRzIHRvIHRoZSBSb3dzIGFuZCBDb2xzIGZvciB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzPD4uCiAgIEluZGV4VHlwZSBzdHJpZGUgPSAyOyAgLy8gT25seSBzYW1lIHN0cmlkZSBpcyBzdXBwb3J0ZWQuCiAgIC8vIENvbE1ham9yCiAKICAgYXJyYXk8SW5kZXhUeXBlLCA0PiB0ZW5zb3JDb2xNYWpvclJhbmdlID0ge3tpbnB1dF9kZXB0aCwgaW5wdXRfcm93cywgaW5wdXRfY29scywgaW5wdXRfYmF0Y2hlc319OwogICBhcnJheTxJbmRleFR5cGUsIDQ+IHRlbnNvclJvd01ham9yUmFuZ2UgPSB7e2lucHV0X2JhdGNoZXMsIGlucHV0X2NvbHMsIGlucHV0X3Jvd3MsIGlucHV0X2RlcHRofX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+IHRlbnNvcl9jb2xfbWFqb3IodGVuc29yQ29sTWFqb3JSYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgUm93TWFqb3IsSW5kZXhUeXBlPiB0ZW5zb3Jfcm93X21ham9yKHRlbnNvclJvd01ham9yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yX2NvbF9tYWpvcih0ZW5zb3JDb2xNYWpvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBSb3dNYWpvciwgSW5kZXhUeXBlPiB0ZW5zb3Jfcm93X21ham9yKHRlbnNvclJvd01ham9yUmFuZ2UpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YV9jb2xfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JfY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9yb3dfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3Jfcm93X21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9jb2xfbWFqb3IgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JfY29sX21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jvd19tYWpvciA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcl9yb3dfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBDb2xNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X2NvbF9tYWpvcihncHVfZGF0YV9jb2xfbWFqb3IsIHRlbnNvckNvbE1ham9yUmFuZ2UpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBSb3dNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X3Jvd19tYWpvcihncHVfZGF0YV9yb3dfbWFqb3IsIHRlbnNvclJvd01ham9yUmFuZ2UpOwotICBncHVfY29sX21ham9yLmRldmljZShzeWNsX2RldmljZSk9Z3B1X2NvbF9tYWpvci5jb25zdGFudCgxMS4wZik7Ci0gIGdwdV9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfY29sX21ham9yLnN3YXBfbGF5b3V0KCk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3JfY29sX21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfY29sX21ham9yLCAodGVuc29yX2NvbF9tYWpvci5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yX3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX3Jvd19tYWpvciwgKHRlbnNvcl9yb3dfbWFqb3Iuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgZ3B1X2NvbF9tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2NvbF9tYWpvci5jb25zdGFudCgxMS4wZik7CisgIGdwdV9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9jb2xfbWFqb3Iuc3dhcF9sYXlvdXQoKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRlbnNvcl9jb2xfbWFqb3IuZGF0YSgpLCBncHVfZGF0YV9jb2xfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVuc29yX2NvbF9tYWpvci5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3Jfcm93X21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbnNvcl9yb3dfbWFqb3Iuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2NvbF9tYWpvci5kaW1lbnNpb24oMCksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDMpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9jb2xfbWFqb3IuZGltZW5zaW9uKDEpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigyKSk7CiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfY29sX21ham9yLmRpbWVuc2lvbigyKSwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMSkpOwogICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2NvbF9tYWpvci5kaW1lbnNpb24oMyksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDApKTsKIAotICBhcnJheTxJbmRleFR5cGUsIDU+IHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZT17e2lucHV0X2RlcHRoLCBrc2l6ZSwga3NpemUsIDQsIGlucHV0X2JhdGNoZXN9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gcmVzdWx0X2NvbF9tYWpvcihwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOwotICBzaXplX3QgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9cmVzdWx0X2NvbF9tYWpvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jlc3VsdF9jb2xfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X3Jlc3VsdF9jb2xfbWFqb3IoZ3B1X2RhdGFfcmVzdWx0X2NvbF9tYWpvciwgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKLSAgZ3B1X3Jlc3VsdF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfY29sX21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyhrc2l6ZSwga3NpemUsIHN0cmlkZSwgc3RyaWRlLCAxLCAxLCBQQURESU5HX1ZBTElEKTsKKyAgYXJyYXk8SW5kZXhUeXBlLCA1PiBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UgPSB7e2lucHV0X2RlcHRoLCBrc2l6ZSwga3NpemUsIDQsIGlucHV0X2JhdGNoZXN9fTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHJlc3VsdF9jb2xfbWFqb3IocGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKKyAgc2l6ZV90IHBhdGNoVGVuc29yQnVmZlNpemUgPSByZXN1bHRfY29sX21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9yZXN1bHRfY29sX21ham9yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9yZXN1bHRfY29sX21ham9yKGdwdV9kYXRhX3Jlc3VsdF9jb2xfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7CisgIGdwdV9yZXN1bHRfY29sX21ham9yLmRldmljZShzeWNsX2RldmljZSkgPQorICAgICAgZ3B1X2NvbF9tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoa3NpemUsIGtzaXplLCBzdHJpZGUsIHN0cmlkZSwgMSwgMSwgUEFERElOR19WQUxJRCk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZXN1bHRfY29sX21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfcmVzdWx0X2NvbF9tYWpvciwgcGF0Y2hUZW5zb3JCdWZmU2l6ZSk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF9jb2xfbWFqb3IuZGltZW5zaW9uKDApLCBpbnB1dF9kZXB0aCk7ICAvLyBkZXB0aAotICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X2NvbF9tYWpvci5kaW1lbnNpb24oMSksIGtzaXplKTsgIC8vIGtlcm5lbCByb3dzCi0gIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yLmRpbWVuc2lvbigyKSwga3NpemUpOyAgLy8ga2VybmVsIGNvbHMKLSAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF9jb2xfbWFqb3IuZGltZW5zaW9uKDMpLCA0KTsgIC8vIG51bWJlciBvZiBwYXRjaGVzCisgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yLmRpbWVuc2lvbigwKSwgaW5wdXRfZGVwdGgpOyAgICAvLyBkZXB0aAorICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X2NvbF9tYWpvci5kaW1lbnNpb24oMSksIGtzaXplKTsgICAgICAgICAgLy8ga2VybmVsIHJvd3MKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF9jb2xfbWFqb3IuZGltZW5zaW9uKDIpLCBrc2l6ZSk7ICAgICAgICAgIC8vIGtlcm5lbCBjb2xzCisgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yLmRpbWVuc2lvbigzKSwgNCk7ICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgcGF0Y2hlcwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X2NvbF9tYWpvci5kaW1lbnNpb24oNCksIGlucHV0X2JhdGNoZXMpOyAgLy8gbnVtYmVyIG9mIGJhdGNoZXMKIAogICAvLyBSb3dNYWpvcgotICBhcnJheTxJbmRleFR5cGUsIDU+IHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZT17e2lucHV0X2JhdGNoZXMsIDQsIGtzaXplLCBrc2l6ZSwgaW5wdXRfZGVwdGggfX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNSwgUm93TWFqb3IsSW5kZXhUeXBlPiByZXN1bHRfcm93X21ham9yKHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7Ci0gIHBhdGNoVGVuc29yQnVmZlNpemUgPXJlc3VsdF9yb3dfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9yZXN1bHRfcm93X21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvcixJbmRleFR5cGU+PiBncHVfcmVzdWx0X3Jvd19tYWpvcihncHVfZGF0YV9yZXN1bHRfcm93X21ham9yLCBwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UpOwotICBncHVfcmVzdWx0X3Jvd19tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKGtzaXplLCBrc2l6ZSwgc3RyaWRlLCBzdHJpZGUsIDEsIDEsIFBBRERJTkdfVkFMSUQpOworICBhcnJheTxJbmRleFR5cGUsIDU+IHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSA9IHt7aW5wdXRfYmF0Y2hlcywgNCwga3NpemUsIGtzaXplLCBpbnB1dF9kZXB0aH19OworICBUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLCBJbmRleFR5cGU+IHJlc3VsdF9yb3dfbWFqb3IocGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKKyAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IHJlc3VsdF9yb3dfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jlc3VsdF9yb3dfbWFqb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgUm93TWFqb3IsIEluZGV4VHlwZT4+IGdwdV9yZXN1bHRfcm93X21ham9yKGdwdV9kYXRhX3Jlc3VsdF9yb3dfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UpOworICBncHVfcmVzdWx0X3Jvd19tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpID0KKyAgICAgIGdwdV9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKGtzaXplLCBrc2l6ZSwgc3RyaWRlLCBzdHJpZGUsIDEsIDEsIFBBRERJTkdfVkFMSUQpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmVzdWx0X3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX3Jlc3VsdF9yb3dfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCiAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yLmRpbWVuc2lvbigwKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oNCkpOwpAQCAtNDIyLDEyICs0NDQsMTIgQEAKICAgSW5kZXhUeXBlIHJvd19wYWRkaW5nID0gMDsKICAgSW5kZXhUeXBlIGNvbF9wYWRkaW5nID0gMDsKIAotICBmb3IgKEluZGV4VHlwZSBpID0gMDsgKGkrc3RyaWRlK2tzaXplLTEpIDw9IGlucHV0X3Jvd3M7IGkgKz0gc3RyaWRlKSB7ICAvLyBpbnB1dCByb3dzCi0gICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IChqK3N0cmlkZStrc2l6ZS0xKSA8PSBpbnB1dF9jb2xzOyBqICs9IHN0cmlkZSkgeyAgLy8gaW5wdXQgY29scwotICAgICAgSW5kZXhUeXBlIHBhdGNoSWQgPSBpK2lucHV0X3Jvd3MqajsKLSAgICAgIGZvciAoSW5kZXhUeXBlIHIgPSAwOyByIDwga3NpemU7ICsrcikgeyAgLy8gcGF0Y2ggcm93cwotICAgICAgICBmb3IgKEluZGV4VHlwZSBjID0gMDsgYyA8IGtzaXplOyArK2MpIHsgIC8vIHBhdGNoIGNvbHMKLSAgICAgICAgICBmb3IgKEluZGV4VHlwZSBkID0gMDsgZCA8IGlucHV0X2RlcHRoOyArK2QpIHsgIC8vIGRlcHRoCisgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyAoaSArIHN0cmlkZSArIGtzaXplIC0gMSkgPD0gaW5wdXRfcm93czsgaSArPSBzdHJpZGUpIHsgICAgLy8gaW5wdXQgcm93cworICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyAoaiArIHN0cmlkZSArIGtzaXplIC0gMSkgPD0gaW5wdXRfY29sczsgaiArPSBzdHJpZGUpIHsgIC8vIGlucHV0IGNvbHMKKyAgICAgIEluZGV4VHlwZSBwYXRjaElkID0gaSArIGlucHV0X3Jvd3MgKiBqOworICAgICAgZm9yIChJbmRleFR5cGUgciA9IDA7IHIgPCBrc2l6ZTsgKytyKSB7ICAgICAgICAgICAgICAgIC8vIHBhdGNoIHJvd3MKKyAgICAgICAgZm9yIChJbmRleFR5cGUgYyA9IDA7IGMgPCBrc2l6ZTsgKytjKSB7ICAgICAgICAgICAgICAvLyBwYXRjaCBjb2xzCisgICAgICAgICAgZm9yIChJbmRleFR5cGUgZCA9IDA7IGQgPCBpbnB1dF9kZXB0aDsgKytkKSB7ICAgICAgLy8gZGVwdGgKICAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGIgPSAwOyBiIDwgaW5wdXRfYmF0Y2hlczsgKytiKSB7ICAvLyBiYXRjaAogICAgICAgICAgICAgICBEYXRhVHlwZSBleHBlY3RlZF9jb2xfbWFqb3IgPSAwLjBmOwogICAgICAgICAgICAgICBEYXRhVHlwZSBleHBlY3RlZF9yb3dfbWFqb3IgPSAwLjBmOwpAQCAtNDM5LDEyICs0NjEsMTQgQEAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAvLyBDb2xNYWpvcgogICAgICAgICAgICAgICBpZiAocmVzdWx0X2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkLCBiKSAhPSBleHBlY3RlZF9jb2xfbWFqb3IpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yKGQsIHIsIGMsIHBhdGNoSWQsIGIpLCBleHBlY3RlZF9jb2xfbWFqb3IpOwogICAgICAgICAgICAgICAvLyBSb3dNYWpvcgogICAgICAgICAgICAgICBpZiAocmVzdWx0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSAhPSBleHBlY3RlZF9yb3dfbWFqb3IpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZF9yb3dfbWFqb3IpOwogICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IENvbE1ham9yIGFuZCBSb3dNYWpvciBhZ3JlZS4KQEAgLTQ1OSwyOCArNDgzLDMyIEBACiAKIC8vIFZlcmlmaWVzIFNBTUUgcGFkZGluZy4KIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9wYXRjaF9wYWRkaW5nX3NhbWVfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2Upeworc3RhdGljIHZvaWQgdGVzdF9wYXRjaF9wYWRkaW5nX3NhbWVfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIGlucHV0X2RlcHRoID0gMzsKICAgSW5kZXhUeXBlIGlucHV0X3Jvd3MgPSA0OwogICBJbmRleFR5cGUgaW5wdXRfY29scyA9IDI7CiAgIEluZGV4VHlwZSBpbnB1dF9iYXRjaGVzID0gMTsKLSAgSW5kZXhUeXBlIGtzaXplID0gMjsgIC8vIENvcnJlc3BvbmRzIHRvIHRoZSBSb3dzIGFuZCBDb2xzIGZvciB0ZW5zb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzPD4uCisgIEluZGV4VHlwZSBrc2l6ZSA9IDI7ICAgLy8gQ29ycmVzcG9uZHMgdG8gdGhlIFJvd3MgYW5kIENvbHMgZm9yIHRlbnNvci5leHRyYWN0X2ltYWdlX3BhdGNoZXM8Pi4KICAgSW5kZXhUeXBlIHN0cmlkZSA9IDI7ICAvLyBPbmx5IHNhbWUgc3RyaWRlIGlzIHN1cHBvcnRlZC4KIAogICAvLyBDb2xNYWpvcgogICBhcnJheTxJbmRleFR5cGUsIDQ+IHRlbnNvckNvbE1ham9yUmFuZ2UgPSB7e2lucHV0X2RlcHRoLCBpbnB1dF9yb3dzLCBpbnB1dF9jb2xzLCBpbnB1dF9iYXRjaGVzfX07CiAgIGFycmF5PEluZGV4VHlwZSwgND4gdGVuc29yUm93TWFqb3JSYW5nZSA9IHt7aW5wdXRfYmF0Y2hlcywgaW5wdXRfY29scywgaW5wdXRfcm93cywgaW5wdXRfZGVwdGh9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gdGVuc29yX2NvbF9tYWpvcih0ZW5zb3JDb2xNYWpvclJhbmdlKTsKLSAgVGVuc29yPERhdGFUeXBlLCA0LCBSb3dNYWpvcixJbmRleFR5cGU+IHRlbnNvcl9yb3dfbWFqb3IodGVuc29yUm93TWFqb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiB0ZW5zb3JfY29sX21ham9yKHRlbnNvckNvbE1ham9yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIFJvd01ham9yLCBJbmRleFR5cGU+IHRlbnNvcl9yb3dfbWFqb3IodGVuc29yUm93TWFqb3JSYW5nZSk7CiAKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX2NvbF9tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jvd19tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcl9yb3dfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX2NvbF9tYWpvciA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfcm93X21ham9yID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yX3Jvd19tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIENvbE1ham9yLCBJbmRleFR5cGU+PiBncHVfY29sX21ham9yKGdwdV9kYXRhX2NvbF9tYWpvciwgdGVuc29yQ29sTWFqb3JSYW5nZSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIFJvd01ham9yLCBJbmRleFR5cGU+PiBncHVfcm93X21ham9yKGdwdV9kYXRhX3Jvd19tYWpvciwgdGVuc29yUm93TWFqb3JSYW5nZSk7CiAKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX2NvbF9tYWpvciwgdGVuc29yX2NvbF9tYWpvci5kYXRhKCksKHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSAgZ3B1X3Jvd19tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9jb2xfbWFqb3Iuc3dhcF9sYXlvdXQoKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpLCBncHVfZGF0YV9yb3dfbWFqb3IsICh0ZW5zb3JfY29sX21ham9yLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV9jb2xfbWFqb3IsIHRlbnNvcl9jb2xfbWFqb3IuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBncHVfcm93X21ham9yLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfY29sX21ham9yLnN3YXBfbGF5b3V0KCk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3Jfcm93X21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfY29sX21ham9yLmRpbWVuc2lvbigwKSwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMykpOwogICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2NvbF9tYWpvci5kaW1lbnNpb24oMSksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDIpKTsKQEAgLTQ5MiwyOSArNTIwLDMyIEBACiAgICAgdGVuc29yX2NvbF9tYWpvci5kYXRhKClbaV0gPSBpICsgMTsKICAgfQogCi1hcnJheTxJbmRleFR5cGUsIDU+IHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZT17e2lucHV0X2RlcHRoLCBrc2l6ZSwga3NpemUsIDIsIGlucHV0X2JhdGNoZXN9fTsKLVRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+IHJlc3VsdF9jb2xfbWFqb3IocGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKLXNpemVfdCBwYXRjaFRlbnNvckJ1ZmZTaXplID1yZXN1bHRfY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotRGF0YVR5cGUqIGdwdV9kYXRhX3Jlc3VsdF9jb2xfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci1UZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9yZXN1bHRfY29sX21ham9yKGdwdV9kYXRhX3Jlc3VsdF9jb2xfbWFqb3IsIHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7Ci1ncHVfcmVzdWx0X2NvbF9tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9jb2xfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKGtzaXplLCBrc2l6ZSwgc3RyaWRlLCBzdHJpZGUsIFBBRERJTkdfU0FNRSk7Ci1zeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmVzdWx0X2NvbF9tYWpvci5kYXRhKCksIGdwdV9kYXRhX3Jlc3VsdF9jb2xfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOworICBhcnJheTxJbmRleFR5cGUsIDU+IHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSA9IHt7aW5wdXRfZGVwdGgsIGtzaXplLCBrc2l6ZSwgMiwgaW5wdXRfYmF0Y2hlc319OworICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gcmVzdWx0X2NvbF9tYWpvcihwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOworICBzaXplX3QgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IHJlc3VsdF9jb2xfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jlc3VsdF9jb2xfbWFqb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3Jlc3VsdF9jb2xfbWFqb3IoZ3B1X2RhdGFfcmVzdWx0X2NvbF9tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X3Jlc3VsdF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9CisgICAgICBncHVfY29sX21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyhrc2l6ZSwga3NpemUsIHN0cmlkZSwgc3RyaWRlLCBQQURESU5HX1NBTUUpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmVzdWx0X2NvbF9tYWpvci5kYXRhKCksIGdwdV9kYXRhX3Jlc3VsdF9jb2xfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCi0KLSAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF9jb2xfbWFqb3IuZGltZW5zaW9uKDApLCBpbnB1dF9kZXB0aCk7ICAvLyBkZXB0aAotICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X2NvbF9tYWpvci5kaW1lbnNpb24oMSksIGtzaXplKTsgIC8vIGtlcm5lbCByb3dzCi0gIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yLmRpbWVuc2lvbigyKSwga3NpemUpOyAgLy8ga2VybmVsIGNvbHMKLSAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF9jb2xfbWFqb3IuZGltZW5zaW9uKDMpLCAyKTsgIC8vIG51bWJlciBvZiBwYXRjaGVzCisgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yLmRpbWVuc2lvbigwKSwgaW5wdXRfZGVwdGgpOyAgICAvLyBkZXB0aAorICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X2NvbF9tYWpvci5kaW1lbnNpb24oMSksIGtzaXplKTsgICAgICAgICAgLy8ga2VybmVsIHJvd3MKKyAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF9jb2xfbWFqb3IuZGltZW5zaW9uKDIpLCBrc2l6ZSk7ICAgICAgICAgIC8vIGtlcm5lbCBjb2xzCisgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yLmRpbWVuc2lvbigzKSwgMik7ICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgcGF0Y2hlcwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X2NvbF9tYWpvci5kaW1lbnNpb24oNCksIGlucHV0X2JhdGNoZXMpOyAgLy8gbnVtYmVyIG9mIGJhdGNoZXMKIAogICAvLyBSb3dNYWpvcgogCi0gIGFycmF5PEluZGV4VHlwZSwgNT4gcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlPXt7aW5wdXRfYmF0Y2hlcywgMiwga3NpemUsIGtzaXplLCBpbnB1dF9kZXB0aCB9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvcixJbmRleFR5cGU+IHJlc3VsdF9yb3dfbWFqb3IocGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKLSAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9cmVzdWx0X3Jvd19tYWpvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jlc3VsdF9yb3dfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLEluZGV4VHlwZT4+IGdwdV9yZXN1bHRfcm93X21ham9yKGdwdV9kYXRhX3Jlc3VsdF9yb3dfbWFqb3IsIHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7Ci0gIGdwdV9yZXN1bHRfcm93X21ham9yLmRldmljZShzeWNsX2RldmljZSk9Z3B1X3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoa3NpemUsIGtzaXplLCBzdHJpZGUsIHN0cmlkZSwgUEFERElOR19TQU1FKTsKKyAgYXJyYXk8SW5kZXhUeXBlLCA1PiBwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UgPSB7e2lucHV0X2JhdGNoZXMsIDIsIGtzaXplLCBrc2l6ZSwgaW5wdXRfZGVwdGh9fTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvciwgSW5kZXhUeXBlPiByZXN1bHRfcm93X21ham9yKHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7CisgIHBhdGNoVGVuc29yQnVmZlNpemUgPSByZXN1bHRfcm93X21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9yZXN1bHRfcm93X21ham9yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLCBJbmRleFR5cGU+PiBncHVfcmVzdWx0X3Jvd19tYWpvcihncHVfZGF0YV9yZXN1bHRfcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X3Jlc3VsdF9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9CisgICAgICBncHVfcm93X21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyhrc2l6ZSwga3NpemUsIHN0cmlkZSwgc3RyaWRlLCBQQURESU5HX1NBTUUpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmVzdWx0X3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX3Jlc3VsdF9yb3dfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCiAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfY29sX21ham9yLmRpbWVuc2lvbigwKSwgcmVzdWx0X3Jvd19tYWpvci5kaW1lbnNpb24oNCkpOwpAQCAtNTI3LDI5ICs1NTgsMzEgQEAKICAgSW5kZXhUeXBlIHJvd19wYWRkaW5nID0gMDsKICAgSW5kZXhUeXBlIGNvbF9wYWRkaW5nID0gMDsKIAotICBmb3IgKEluZGV4VHlwZSBpID0gMDsgKGkrc3RyaWRlK2tzaXplLTEpIDw9IGlucHV0X3Jvd3M7IGkgKz0gc3RyaWRlKSB7ICAvLyBpbnB1dCByb3dzCi0gICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IChqK3N0cmlkZStrc2l6ZS0xKSA8PSBpbnB1dF9jb2xzOyBqICs9IHN0cmlkZSkgeyAgLy8gaW5wdXQgY29scwotICAgICAgSW5kZXhUeXBlIHBhdGNoSWQgPSBpK2lucHV0X3Jvd3MqajsKLSAgICAgIGZvciAoSW5kZXhUeXBlIHIgPSAwOyByIDwga3NpemU7ICsrcikgeyAgLy8gcGF0Y2ggcm93cwotICAgICAgICBmb3IgKEluZGV4VHlwZSBjID0gMDsgYyA8IGtzaXplOyArK2MpIHsgIC8vIHBhdGNoIGNvbHMKLSAgICAgICAgICBmb3IgKEluZGV4VHlwZSBkID0gMDsgZCA8IGlucHV0X2RlcHRoOyArK2QpIHsgIC8vIGRlcHRoCisgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyAoaSArIHN0cmlkZSArIGtzaXplIC0gMSkgPD0gaW5wdXRfcm93czsgaSArPSBzdHJpZGUpIHsgICAgLy8gaW5wdXQgcm93cworICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyAoaiArIHN0cmlkZSArIGtzaXplIC0gMSkgPD0gaW5wdXRfY29sczsgaiArPSBzdHJpZGUpIHsgIC8vIGlucHV0IGNvbHMKKyAgICAgIEluZGV4VHlwZSBwYXRjaElkID0gaSArIGlucHV0X3Jvd3MgKiBqOworICAgICAgZm9yIChJbmRleFR5cGUgciA9IDA7IHIgPCBrc2l6ZTsgKytyKSB7ICAgICAgICAgICAgICAgIC8vIHBhdGNoIHJvd3MKKyAgICAgICAgZm9yIChJbmRleFR5cGUgYyA9IDA7IGMgPCBrc2l6ZTsgKytjKSB7ICAgICAgICAgICAgICAvLyBwYXRjaCBjb2xzCisgICAgICAgICAgZm9yIChJbmRleFR5cGUgZCA9IDA7IGQgPCBpbnB1dF9kZXB0aDsgKytkKSB7ICAgICAgLy8gZGVwdGgKICAgICAgICAgICAgIGZvciAoSW5kZXhUeXBlIGIgPSAwOyBiIDwgaW5wdXRfYmF0Y2hlczsgKytiKSB7ICAvLyBiYXRjaAogICAgICAgICAgICAgICBEYXRhVHlwZSBleHBlY3RlZF9jb2xfbWFqb3IgPSAwLjBmOwogICAgICAgICAgICAgICBEYXRhVHlwZSBleHBlY3RlZF9yb3dfbWFqb3IgPSAwLjBmOwotICAgICAgICAgICAgICBJbmRleFR5cGUgcm93X29mZnNldCA9IHIqc3RyaWRlICsgaSAtIHJvd19wYWRkaW5nOwotICAgICAgICAgICAgICBJbmRleFR5cGUgY29sX29mZnNldCA9IGMqc3RyaWRlICsgaiAtIGNvbF9wYWRkaW5nOworICAgICAgICAgICAgICBJbmRleFR5cGUgcm93X29mZnNldCA9IHIgKiBzdHJpZGUgKyBpIC0gcm93X3BhZGRpbmc7CisgICAgICAgICAgICAgIEluZGV4VHlwZSBjb2xfb2Zmc2V0ID0gYyAqIHN0cmlkZSArIGogLSBjb2xfcGFkZGluZzsKICAgICAgICAgICAgICAgaWYgKHJvd19vZmZzZXQgPj0gMCAmJiBjb2xfb2Zmc2V0ID49IDAgJiYgcm93X29mZnNldCA8IGlucHV0X3Jvd3MgJiYgY29sX29mZnNldCA8IGlucHV0X2NvbHMpIHsKICAgICAgICAgICAgICAgICBleHBlY3RlZF9jb2xfbWFqb3IgPSB0ZW5zb3JfY29sX21ham9yKGQsIHJvd19vZmZzZXQsIGNvbF9vZmZzZXQsIGIpOwogICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IoYiwgY29sX29mZnNldCwgcm93X29mZnNldCwgZCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLy8gQ29sTWFqb3IKICAgICAgICAgICAgICAgaWYgKHJlc3VsdF9jb2xfbWFqb3IoZCwgciwgYywgcGF0Y2hJZCwgYikgIT0gZXhwZWN0ZWRfY29sX21ham9yKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkLCBiKSwgZXhwZWN0ZWRfY29sX21ham9yKTsKICAgICAgICAgICAgICAgLy8gUm93TWFqb3IKICAgICAgICAgICAgICAgaWYgKHJlc3VsdF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWRfcm93X21ham9yKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X3Jvd19tYWpvcihiLCBwYXRjaElkLCBjLCByLCBkKSwgZXhwZWN0ZWRfcm93X21ham9yKTsKICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBDb2xNYWpvciBhbmQgUm93TWFqb3IgYWdyZWUuCkBAIC01NjIsMTAgKzU5NSw4IEBACiAgIH0KIH0KIAotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfcGF0Y2hfbm9fZXh0cmFfZGltX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKXsKLQorc3RhdGljIHZvaWQgdGVzdF9wYXRjaF9ub19leHRyYV9kaW1fc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gMjsKICAgSW5kZXhUeXBlIHNpemVEaW0yID0gMzsKICAgSW5kZXhUeXBlIHNpemVEaW0zID0gNTsKQEAgLTU3Myw0OCArNjA0LDUzIEBACiAgIC8vIENvbE1ham9yCiAgIGFycmF5PEluZGV4VHlwZSwgMz4gdGVuc29yQ29sTWFqb3JSYW5nZSA9IHt7c2l6ZURpbTEsIHNpemVEaW0yLCBzaXplRGltM319OwogICBhcnJheTxJbmRleFR5cGUsIDM+IHRlbnNvclJvd01ham9yUmFuZ2UgPSB7e3NpemVEaW0zLCBzaXplRGltMiwgc2l6ZURpbTF9fTsKLSAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gdGVuc29yX2NvbF9tYWpvcih0ZW5zb3JDb2xNYWpvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHRlbnNvcl9jb2xfbWFqb3IodGVuc29yQ29sTWFqb3JSYW5nZSk7CiAgIHRlbnNvcl9jb2xfbWFqb3Iuc2V0UmFuZG9tKCk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMywgUm93TWFqb3IsSW5kZXhUeXBlPiB0ZW5zb3Jfcm93X21ham9yKHRlbnNvclJvd01ham9yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDMsIFJvd01ham9yLCBJbmRleFR5cGU+IHRlbnNvcl9yb3dfbWFqb3IodGVuc29yUm93TWFqb3JSYW5nZSk7CiAKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX2NvbF9tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jvd19tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcl9yb3dfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX2NvbF9tYWpvciA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfcm93X21ham9yID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yX3Jvd19tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIENvbE1ham9yLCBJbmRleFR5cGU+PiBncHVfY29sX21ham9yKGdwdV9kYXRhX2NvbF9tYWpvciwgdGVuc29yQ29sTWFqb3JSYW5nZSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIFJvd01ham9yLCBJbmRleFR5cGU+PiBncHVfcm93X21ham9yKGdwdV9kYXRhX3Jvd19tYWpvciwgdGVuc29yUm93TWFqb3JSYW5nZSk7CiAKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX2NvbF9tYWpvciwgdGVuc29yX2NvbF9tYWpvci5kYXRhKCksKHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSAgZ3B1X3Jvd19tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9jb2xfbWFqb3Iuc3dhcF9sYXlvdXQoKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpLCBncHVfZGF0YV9yb3dfbWFqb3IsICh0ZW5zb3Jfcm93X21ham9yLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV9jb2xfbWFqb3IsIHRlbnNvcl9jb2xfbWFqb3IuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBncHVfcm93X21ham9yLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfY29sX21ham9yLnN3YXBfbGF5b3V0KCk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3Jfcm93X21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbnNvcl9yb3dfbWFqb3Iuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfY29sX21ham9yLmRpbWVuc2lvbigwKSwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMikpOwogICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2NvbF9tYWpvci5kaW1lbnNpb24oMSksIHRlbnNvcl9yb3dfbWFqb3IuZGltZW5zaW9uKDEpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9jb2xfbWFqb3IuZGltZW5zaW9uKDIpLCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigwKSk7CiAKLQogICAvLyBTaW5nbGUgcGl4ZWwgcGF0Y2g6IENvbE1ham9yCi0gIGFycmF5PEluZGV4VHlwZSwgND4gcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlPXt7c2l6ZURpbTEsIDEsIDEsIHNpemVEaW0yKnNpemVEaW0zfX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+IHNpbmdsZV9wYXRjaF9jb2xfbWFqb3IocGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKLSAgc2l6ZV90IHBhdGNoVGVuc29yQnVmZlNpemUgPXNpbmdsZV9wYXRjaF9jb2xfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9zaW5nbGVfcGF0Y2hfY29sX21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9zaW5nbGVfcGF0Y2hfY29sX21ham9yKGdwdV9kYXRhX3NpbmdsZV9wYXRjaF9jb2xfbWFqb3IsIHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7Ci0gIGdwdV9zaW5nbGVfcGF0Y2hfY29sX21ham9yLmRldmljZShzeWNsX2RldmljZSk9Z3B1X2NvbF9tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMSwgMSk7CisgIGFycmF5PEluZGV4VHlwZSwgND4gcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgMSwgMSwgc2l6ZURpbTIgKiBzaXplRGltM319OworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gc2luZ2xlX3BhdGNoX2NvbF9tYWpvcihwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOworICBzaXplX3QgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IHNpbmdsZV9wYXRjaF9jb2xfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3NpbmdsZV9wYXRjaF9jb2xfbWFqb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3NpbmdsZV9wYXRjaF9jb2xfbWFqb3IoZ3B1X2RhdGFfc2luZ2xlX3BhdGNoX2NvbF9tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X3NpbmdsZV9wYXRjaF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9jb2xfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDEsIDEpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qoc2luZ2xlX3BhdGNoX2NvbF9tYWpvci5kYXRhKCksIGdwdV9kYXRhX3NpbmdsZV9wYXRjaF9jb2xfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigwKSwgc2l6ZURpbTEpOwogICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMSksIDEpOwogICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMiksIDEpOwotICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMyksIHNpemVEaW0yKnNpemVEaW0zKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9wYXRjaF9jb2xfbWFqb3IuZGltZW5zaW9uKDMpLCBzaXplRGltMiAqIHNpemVEaW0zKTsKIAogICAvLyBTaW5nbGUgcGl4ZWwgcGF0Y2g6IFJvd01ham9yCi0gIGFycmF5PEluZGV4VHlwZSwgND4gcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlPXt7c2l6ZURpbTIqc2l6ZURpbTMsIDEsIDEsIHNpemVEaW0xfX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgUm93TWFqb3IsSW5kZXhUeXBlPiBzaW5nbGVfcGF0Y2hfcm93X21ham9yKHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7Ci0gIHBhdGNoVGVuc29yQnVmZlNpemUgPXNpbmdsZV9wYXRjaF9yb3dfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9zaW5nbGVfcGF0Y2hfcm93X21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBSb3dNYWpvcixJbmRleFR5cGU+PiBncHVfc2luZ2xlX3BhdGNoX3Jvd19tYWpvcihncHVfZGF0YV9zaW5nbGVfcGF0Y2hfcm93X21ham9yLCBwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UpOwotICBncHVfc2luZ2xlX3BhdGNoX3Jvd19tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDEsIDEpOworICBhcnJheTxJbmRleFR5cGUsIDQ+IHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTIgKiBzaXplRGltMywgMSwgMSwgc2l6ZURpbTF9fTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBSb3dNYWpvciwgSW5kZXhUeXBlPiBzaW5nbGVfcGF0Y2hfcm93X21ham9yKHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7CisgIHBhdGNoVGVuc29yQnVmZlNpemUgPSBzaW5nbGVfcGF0Y2hfcm93X21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9zaW5nbGVfcGF0Y2hfcm93X21ham9yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIFJvd01ham9yLCBJbmRleFR5cGU+PiBncHVfc2luZ2xlX3BhdGNoX3Jvd19tYWpvcihncHVfZGF0YV9zaW5nbGVfcGF0Y2hfcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X3NpbmdsZV9wYXRjaF9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDEsIDEpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qoc2luZ2xlX3BhdGNoX3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX3NpbmdsZV9wYXRjaF9yb3dfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCi0gIFZFUklGWV9JU19FUVVBTChzaW5nbGVfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigwKSwgc2l6ZURpbTIqc2l6ZURpbTMpOworICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMCksIHNpemVEaW0yICogc2l6ZURpbTMpOwogICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDEpOwogICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMiksIDEpOwogICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMyksIHNpemVEaW0xKTsKQEAgLTYyMiw3MyArNjU4LDc1IEBACiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgdGVuc29yX2NvbF9tYWpvci5zaXplKCk7ICsraSkgewogICAgIC8vIENvbE1ham9yCiAgICAgaWYgKHRlbnNvcl9jb2xfbWFqb3IuZGF0YSgpW2ldICE9IHNpbmdsZV9wYXRjaF9jb2xfbWFqb3IuZGF0YSgpW2ldKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4ICIgPDwgaSA8PCAiIDogIiA8PCB0ZW5zb3JfY29sX21ham9yLmRhdGEoKVtpXSA8PCAiIHZzICIgPDwgc2luZ2xlX3BhdGNoX2NvbF9tYWpvci5kYXRhKClbaV0gPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIiA6ICIgPDwgdGVuc29yX2NvbF9tYWpvci5kYXRhKClbaV0gPDwgIiB2cyAiCisgICAgICAgICAgICAgICAgPDwgc2luZ2xlX3BhdGNoX2NvbF9tYWpvci5kYXRhKClbaV0gPDwgc3RkOjplbmRsOwogICAgIH0KICAgICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3BhdGNoX2NvbF9tYWpvci5kYXRhKClbaV0sIHRlbnNvcl9jb2xfbWFqb3IuZGF0YSgpW2ldKTsKICAgICAvLyBSb3dNYWpvcgogICAgIGlmICh0ZW5zb3Jfcm93X21ham9yLmRhdGEoKVtpXSAhPSBzaW5nbGVfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSkgewotICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIiA6ICIKLSAgICAgICAgICAgPDwgdGVuc29yX2NvbF9tYWpvci5kYXRhKClbaV0gPDwgIiB2cyAiCi0gICAgICAgICAgIDw8IHNpbmdsZV9wYXRjaF9yb3dfbWFqb3IuZGF0YSgpW2ldIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICIgOiAiIDw8IHRlbnNvcl9jb2xfbWFqb3IuZGF0YSgpW2ldIDw8ICIgdnMgIgorICAgICAgICAgICAgICAgIDw8IHNpbmdsZV9wYXRjaF9yb3dfbWFqb3IuZGF0YSgpW2ldIDw8IHN0ZDo6ZW5kbDsKICAgICB9Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9wYXRjaF9yb3dfbWFqb3IuZGF0YSgpW2ldLAotICAgICAgICAgICAgICAgICAgICB0ZW5zb3Jfcm93X21ham9yLmRhdGEoKVtpXSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9wYXRjaF9yb3dfbWFqb3IuZGF0YSgpW2ldLCB0ZW5zb3Jfcm93X21ham9yLmRhdGEoKVtpXSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcl9jb2xfbWFqb3IuZGF0YSgpW2ldLCB0ZW5zb3Jfcm93X21ham9yLmRhdGEoKVtpXSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9wYXRjaF9jb2xfbWFqb3IuZGF0YSgpW2ldLAotICAgICAgICAgICAgICAgICAgICBzaW5nbGVfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV9wYXRjaF9jb2xfbWFqb3IuZGF0YSgpW2ldLCBzaW5nbGVfcGF0Y2hfcm93X21ham9yLmRhdGEoKVtpXSk7CiAgIH0KIAogICAvLyBFbnRpcmUgaW1hZ2UgcGF0Y2g6IENvbE1ham9yCi0gIHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZT17e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTMsIHNpemVEaW0yKnNpemVEaW0zfX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+IGVudGlyZV9pbWFnZV9wYXRjaF9jb2xfbWFqb3IocGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKLSAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9ZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX2VudGlyZV9pbWFnZV9wYXRjaF9jb2xfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X2VudGlyZV9pbWFnZV9wYXRjaF9jb2xfbWFqb3IoZ3B1X2RhdGFfZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvciwgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKLSAgZ3B1X2VudGlyZV9pbWFnZV9wYXRjaF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfY29sX21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygzLCA1KTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGVudGlyZV9pbWFnZV9wYXRjaF9jb2xfbWFqb3IuZGF0YSgpLCBncHVfZGF0YV9lbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yLCBwYXRjaFRlbnNvckJ1ZmZTaXplKTsKKyAgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltMiAqIHNpemVEaW0zfX07CisgIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBlbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yKHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7CisgIHBhdGNoVGVuc29yQnVmZlNpemUgPSBlbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9lbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9lbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yKAorICAgICAgZ3B1X2RhdGFfZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvciwgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X2VudGlyZV9pbWFnZV9wYXRjaF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9jb2xfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDMsIDUpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kYXRhKCksIGdwdV9kYXRhX2VudGlyZV9pbWFnZV9wYXRjaF9jb2xfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFRlbnNvckJ1ZmZTaXplKTsKIAogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMCksIDIpOwogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMSksIDMpOwogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMiksIDUpOwotICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMyksIDMqNSk7CisgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigzKSwgMyAqIDUpOwogCiAgIC8vIEVudGlyZSBpbWFnZSBwYXRjaDogUm93TWFqb3IKLXBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZT17e3NpemVEaW0yKnNpemVEaW0zLCBzaXplRGltMywgc2l6ZURpbTIsIHNpemVEaW0xfX07Ci1UZW5zb3I8RGF0YVR5cGUsIDQsIFJvd01ham9yLEluZGV4VHlwZT4gZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvcihwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UpOwotcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9ZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLURhdGFUeXBlKiBncHVfZGF0YV9lbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOwotVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgUm93TWFqb3IsSW5kZXhUeXBlPj4gZ3B1X2VudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IoZ3B1X2RhdGFfZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvciwgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKLWdwdV9lbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRldmljZShzeWNsX2RldmljZSk9Z3B1X3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMywgNSk7Ci1zeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX2VudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwotICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMCksIDMqNSk7CisgIHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTIgKiBzaXplRGltMywgc2l6ZURpbTMsIHNpemVEaW0yLCBzaXplRGltMX19OworICBUZW5zb3I8RGF0YVR5cGUsIDQsIFJvd01ham9yLCBJbmRleFR5cGU+IGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IocGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKKyAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX2VudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgUm93TWFqb3IsIEluZGV4VHlwZT4+IGdwdV9lbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yKAorICAgICAgZ3B1X2RhdGFfZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvciwgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X2VudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9yb3dfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDMsIDUpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX2VudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFRlbnNvckJ1ZmZTaXplKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDApLCAzICogNSk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigxKSwgNSk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigyKSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMik7CiAKICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IDU7ICsraikgewotICAgICAgSW5kZXhUeXBlIHBhdGNoSWQgPSBpKzMqajsKKyAgICAgIEluZGV4VHlwZSBwYXRjaElkID0gaSArIDMgKiBqOwogICAgICAgZm9yIChJbmRleFR5cGUgciA9IDA7IHIgPCAzOyArK3IpIHsKICAgICAgICAgZm9yIChJbmRleFR5cGUgYyA9IDA7IGMgPCA1OyArK2MpIHsKICAgICAgICAgICBmb3IgKEluZGV4VHlwZSBkID0gMDsgZCA8IDI7ICsrZCkgewogICAgICAgICAgICAgRGF0YVR5cGUgZXhwZWN0ZWRfY29sX21ham9yID0gMC4wZjsKICAgICAgICAgICAgIERhdGFUeXBlIGV4cGVjdGVkX3Jvd19tYWpvciA9IDAuMGY7Ci0gICAgICAgICAgICBpZiAoci0xK2kgPj0gMCAmJiBjLTIraiA+PSAwICYmIHItMStpIDwgMyAmJiBjLTIraiA8IDUpIHsKLSAgICAgICAgICAgICAgZXhwZWN0ZWRfY29sX21ham9yID0gdGVuc29yX2NvbF9tYWpvcihkLCByLTEraSwgYy0yK2opOwotICAgICAgICAgICAgICBleHBlY3RlZF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yKGMtMitqLCByLTEraSwgZCk7CisgICAgICAgICAgICBpZiAociAtIDEgKyBpID49IDAgJiYgYyAtIDIgKyBqID49IDAgJiYgciAtIDEgKyBpIDwgMyAmJiBjIC0gMiArIGogPCA1KSB7CisgICAgICAgICAgICAgIGV4cGVjdGVkX2NvbF9tYWpvciA9IHRlbnNvcl9jb2xfbWFqb3IoZCwgciAtIDEgKyBpLCBjIC0gMiArIGopOworICAgICAgICAgICAgICBleHBlY3RlZF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yKGMgLSAyICsgaiwgciAtIDEgKyBpLCBkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIENvbE1ham9yCiAgICAgICAgICAgICBpZiAoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkKSAhPSBleHBlY3RlZF9jb2xfbWFqb3IpIHsKLSAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX2ltYWdlX3BhdGNoX2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkKSwgZXhwZWN0ZWRfY29sX21ham9yKTsKICAgICAgICAgICAgIC8vIFJvd01ham9yCi0gICAgICAgICAgICBpZiAoZW50aXJlX2ltYWdlX3BhdGNoX3Jvd19tYWpvcihwYXRjaElkLCBjLCByLCBkKSAhPQotICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jvd19tYWpvcikgewotICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgaWYgKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IocGF0Y2hJZCwgYywgciwgZCkgIT0gZXhwZWN0ZWRfcm93X21ham9yKSB7CisgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV9pbWFnZV9wYXRjaF9yb3dfbWFqb3IocGF0Y2hJZCwgYywgciwgZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcm93X21ham9yKTsKKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChlbnRpcmVfaW1hZ2VfcGF0Y2hfcm93X21ham9yKHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZF9yb3dfbWFqb3IpOwogICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBDb2xNYWpvciBhbmQgUm93TWFqb3IgYWdyZWUuCiAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoZXhwZWN0ZWRfY29sX21ham9yLCBleHBlY3RlZF9yb3dfbWFqb3IpOwogICAgICAgICAgIH0KQEAgLTY5OCwyOCArNzM2LDMwIEBACiAgIH0KIAogICAvLyAyRCBwYXRjaDogQ29sTWFqb3IKLSAgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlPXt7c2l6ZURpbTEsIDIsIDIsIHNpemVEaW0yKnNpemVEaW0zfX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+IHR3b2RfcGF0Y2hfY29sX21ham9yKHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7Ci0gIHBhdGNoVGVuc29yQnVmZlNpemUgPXR3b2RfcGF0Y2hfY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfdHdvZF9wYXRjaF9jb2xfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X3R3b2RfcGF0Y2hfY29sX21ham9yKGdwdV9kYXRhX3R3b2RfcGF0Y2hfY29sX21ham9yLCBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOwotICBncHVfdHdvZF9wYXRjaF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfY29sX21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygyLCAyKTsKKyAgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgMiwgMiwgc2l6ZURpbTIgKiBzaXplRGltM319OworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdHdvZF9wYXRjaF9jb2xfbWFqb3IocGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKKyAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IHR3b2RfcGF0Y2hfY29sX21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV90d29kX3BhdGNoX2NvbF9tYWpvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfdHdvZF9wYXRjaF9jb2xfbWFqb3IoZ3B1X2RhdGFfdHdvZF9wYXRjaF9jb2xfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOworICBncHVfdHdvZF9wYXRjaF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9jb2xfbWFqb3IuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDIsIDIpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodHdvZF9wYXRjaF9jb2xfbWFqb3IuZGF0YSgpLCBncHVfZGF0YV90d29kX3BhdGNoX2NvbF9tYWpvciwgcGF0Y2hUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigwKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oMSksIDIpOwogICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9jb2xfbWFqb3IuZGltZW5zaW9uKDIpLCAyKTsKLSAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigzKSwgMyo1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigzKSwgMyAqIDUpOwogCiAgIC8vIDJEIHBhdGNoOiBSb3dNYWpvcgotICBwYXRjaFJvd01ham9yVGVuc29yUmFuZ2U9e3tzaXplRGltMipzaXplRGltMywgMiwgMiwgc2l6ZURpbTF9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA0LCBSb3dNYWpvcixJbmRleFR5cGU+IHR3b2RfcGF0Y2hfcm93X21ham9yKHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7Ci0gIHBhdGNoVGVuc29yQnVmZlNpemUgPXR3b2RfcGF0Y2hfcm93X21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfdHdvZF9wYXRjaF9yb3dfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIFJvd01ham9yLEluZGV4VHlwZT4+IGdwdV90d29kX3BhdGNoX3Jvd19tYWpvcihncHVfZGF0YV90d29kX3BhdGNoX3Jvd19tYWpvciwgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKLSAgZ3B1X3R3b2RfcGF0Y2hfcm93X21ham9yLmRldmljZShzeWNsX2RldmljZSk9Z3B1X3Jvd19tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMiwgMik7CisgIHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTIgKiBzaXplRGltMywgMiwgMiwgc2l6ZURpbTF9fTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBSb3dNYWpvciwgSW5kZXhUeXBlPiB0d29kX3BhdGNoX3Jvd19tYWpvcihwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UpOworICBwYXRjaFRlbnNvckJ1ZmZTaXplID0gdHdvZF9wYXRjaF9yb3dfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3R3b2RfcGF0Y2hfcm93X21ham9yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIFJvd01ham9yLCBJbmRleFR5cGU+PiBncHVfdHdvZF9wYXRjaF9yb3dfbWFqb3IoZ3B1X2RhdGFfdHdvZF9wYXRjaF9yb3dfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X3R3b2RfcGF0Y2hfcm93X21ham9yLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfcm93X21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygyLCAyKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHR3b2RfcGF0Y2hfcm93X21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfdHdvZF9wYXRjaF9yb3dfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwotICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDApLCAzKjUpOworICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDApLCAzICogNSk7CiAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDIpOwogICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDIpLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigzKSwgMik7CkBAIC03MzEsMjggKzc3MSwzMiBAQAogCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCA1OyArK2opIHsKLSAgICAgIEluZGV4VHlwZSBwYXRjaElkID0gaSszKmo7CisgICAgICBJbmRleFR5cGUgcGF0Y2hJZCA9IGkgKyAzICogajsKICAgICAgIGZvciAoSW5kZXhUeXBlIHIgPSAwOyByIDwgMjsgKytyKSB7CiAgICAgICAgIGZvciAoSW5kZXhUeXBlIGMgPSAwOyBjIDwgMjsgKytjKSB7CiAgICAgICAgICAgZm9yIChJbmRleFR5cGUgZCA9IDA7IGQgPCAyOyArK2QpIHsKICAgICAgICAgICAgIERhdGFUeXBlIGV4cGVjdGVkX2NvbF9tYWpvciA9IDAuMGY7CiAgICAgICAgICAgICBEYXRhVHlwZSBleHBlY3RlZF9yb3dfbWFqb3IgPSAwLjBmOwotICAgICAgICAgICAgSW5kZXhUeXBlIHJvd19vZmZzZXQgPSByKnN0cmlkZSArIGkgLSByb3dfcGFkZGluZzsKLSAgICAgICAgICAgIEluZGV4VHlwZSBjb2xfb2Zmc2V0ID0gYypzdHJpZGUgKyBqIC0gY29sX3BhZGRpbmc7CisgICAgICAgICAgICBJbmRleFR5cGUgcm93X29mZnNldCA9IHIgKiBzdHJpZGUgKyBpIC0gcm93X3BhZGRpbmc7CisgICAgICAgICAgICBJbmRleFR5cGUgY29sX29mZnNldCA9IGMgKiBzdHJpZGUgKyBqIC0gY29sX3BhZGRpbmc7CiAgICAgICAgICAgICAvLyBDb2xNYWpvcgotICAgICAgICAgICAgaWYgKHJvd19vZmZzZXQgPj0gMCAmJiBjb2xfb2Zmc2V0ID49IDAgJiYgcm93X29mZnNldCA8IHRlbnNvcl9jb2xfbWFqb3IuZGltZW5zaW9uKDEpICYmIGNvbF9vZmZzZXQgPCB0ZW5zb3JfY29sX21ham9yLmRpbWVuc2lvbigyKSkgeworICAgICAgICAgICAgaWYgKHJvd19vZmZzZXQgPj0gMCAmJiBjb2xfb2Zmc2V0ID49IDAgJiYgcm93X29mZnNldCA8IHRlbnNvcl9jb2xfbWFqb3IuZGltZW5zaW9uKDEpICYmCisgICAgICAgICAgICAgICAgY29sX29mZnNldCA8IHRlbnNvcl9jb2xfbWFqb3IuZGltZW5zaW9uKDIpKSB7CiAgICAgICAgICAgICAgIGV4cGVjdGVkX2NvbF9tYWpvciA9IHRlbnNvcl9jb2xfbWFqb3IoZCwgcm93X29mZnNldCwgY29sX29mZnNldCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHdvZF9wYXRjaF9jb2xfbWFqb3IoZCwgciwgYywgcGF0Y2hJZCkgIT0gZXhwZWN0ZWRfY29sX21ham9yKSB7Ci0gICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2hfY29sX21ham9yKGQsIHIsIGMsIHBhdGNoSWQpLCBleHBlY3RlZF9jb2xfbWFqb3IpOwogICAgICAgICAgICAgLy8gUm93TWFqb3IKLSAgICAgICAgICAgIGlmIChyb3dfb2Zmc2V0ID49IDAgJiYgY29sX29mZnNldCA+PSAwICYmIHJvd19vZmZzZXQgPCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigxKSAmJiBjb2xfb2Zmc2V0IDwgdGVuc29yX3Jvd19tYWpvci5kaW1lbnNpb24oMCkpIHsKKyAgICAgICAgICAgIGlmIChyb3dfb2Zmc2V0ID49IDAgJiYgY29sX29mZnNldCA+PSAwICYmIHJvd19vZmZzZXQgPCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigxKSAmJgorICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQgPCB0ZW5zb3Jfcm93X21ham9yLmRpbWVuc2lvbigwKSkgewogICAgICAgICAgICAgICBleHBlY3RlZF9yb3dfbWFqb3IgPSB0ZW5zb3Jfcm93X21ham9yKGNvbF9vZmZzZXQsIHJvd19vZmZzZXQsIGQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHR3b2RfcGF0Y2hfcm93X21ham9yKHBhdGNoSWQsIGMsIHIsIGQpICE9IGV4cGVjdGVkX3Jvd19tYWpvcikgewotICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoX3Jvd19tYWpvcihwYXRjaElkLCBjLCByLCBkKSwgZXhwZWN0ZWRfcm93X21ham9yKTsKICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgQ29sTWFqb3IgYW5kIFJvd01ham9yIGFncmVlLgpAQCAtNzc0LDggKzgxOCw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9pbWFnZW5ldF9wYXRjaGVzX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQoteworc3RhdGljIHZvaWQgdGVzdF9pbWFnZW5ldF9wYXRjaGVzX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIC8vIFRlc3QgdGhlIGNvZGUgb24gdHlwaWNhbCBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IHRoZSAnaW1hZ2VuZXQnIGJlbmNobWFya3MgYXQKICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NvdW1pdGgvY29udm5ldC1iZW5jaG1hcmtzCiAgIC8vIENvbE1ham9yCkBAIC03ODQsMzkgKzgyNyw0MSBAQAogICBJbmRleFR5cGUgc2l6ZURpbTMgPSAxMjg7CiAgIEluZGV4VHlwZSBzaXplRGltNCA9IDE2OwogICBhcnJheTxJbmRleFR5cGUsIDQ+IHRlbnNvckNvbE1ham9yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTMsIHNpemVEaW00fX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+IGxfaW5fY29sX21ham9yKHRlbnNvckNvbE1ham9yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gbF9pbl9jb2xfbWFqb3IodGVuc29yQ29sTWFqb3JSYW5nZSk7CiAgIGxfaW5fY29sX21ham9yLnNldFJhbmRvbSgpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YV9sX2luX2NvbF9tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGxfaW5fY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9sX2luX2NvbF9tYWpvciA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGxfaW5fY29sX21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgQ29sTWFqb3IsIEluZGV4VHlwZT4+IGdwdV9sX2luX2NvbF9tYWpvcihncHVfZGF0YV9sX2luX2NvbF9tYWpvciwgdGVuc29yQ29sTWFqb3JSYW5nZSk7CiAKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX2xfaW5fY29sX21ham9yLCBsX2luX2NvbF9tYWpvci5kYXRhKCksKGxfaW5fY29sX21ham9yLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV9sX2luX2NvbF9tYWpvciwgbF9pbl9jb2xfbWFqb3IuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxfaW5fY29sX21ham9yLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAotICBhcnJheTxJbmRleFR5cGUsIDU+IHBhdGNoVGVuc29yUmFuZ2U9e3tzaXplRGltMSwgMTEsIDExLCBzaXplRGltMipzaXplRGltMywgc2l6ZURpbTR9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gbF9vdXRfY29sX21ham9yKHBhdGNoVGVuc29yUmFuZ2UpOwotICBzaXplX3QgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9bF9vdXRfY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfbF9vdXRfY29sX21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9sX291dF9jb2xfbWFqb3IoZ3B1X2RhdGFfbF9vdXRfY29sX21ham9yLCBwYXRjaFRlbnNvclJhbmdlKTsKLSAgZ3B1X2xfb3V0X2NvbF9tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9sX2luX2NvbF9tYWpvci5leHRyYWN0X2ltYWdlX3BhdGNoZXMoMTEsIDExKTsKKyAgYXJyYXk8SW5kZXhUeXBlLCA1PiBwYXRjaFRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgMTEsIDExLCBzaXplRGltMiAqIHNpemVEaW0zLCBzaXplRGltNH19OworICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gbF9vdXRfY29sX21ham9yKHBhdGNoVGVuc29yUmFuZ2UpOworICBzaXplX3QgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IGxfb3V0X2NvbF9tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfbF9vdXRfY29sX21ham9yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9sX291dF9jb2xfbWFqb3IoZ3B1X2RhdGFfbF9vdXRfY29sX21ham9yLCBwYXRjaFRlbnNvclJhbmdlKTsKKyAgZ3B1X2xfb3V0X2NvbF9tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2xfaW5fY29sX21ham9yLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygxMSwgMTEpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QobF9vdXRfY29sX21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfbF9vdXRfY29sX21ham9yLCBwYXRjaFRlbnNvckJ1ZmZTaXplKTsKIAogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfY29sX21ham9yLmRpbWVuc2lvbigwKSwgc2l6ZURpbTEpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfY29sX21ham9yLmRpbWVuc2lvbigxKSwgMTEpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfY29sX21ham9yLmRpbWVuc2lvbigyKSwgMTEpOwotICBWRVJJRllfSVNfRVFVQUwobF9vdXRfY29sX21ham9yLmRpbWVuc2lvbigzKSwgc2l6ZURpbTIqc2l6ZURpbTMpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXRfY29sX21ham9yLmRpbWVuc2lvbigzKSwgc2l6ZURpbTIgKiBzaXplRGltMyk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dF9jb2xfbWFqb3IuZGltZW5zaW9uKDQpLCBzaXplRGltNCk7CiAKICAgLy8gUm93TWFqb3IKLSAgcGF0Y2hUZW5zb3JSYW5nZT17e3NpemVEaW00LCBzaXplRGltMipzaXplRGltMywgMTEsIDExLCBzaXplRGltMX19OwotICBUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLEluZGV4VHlwZT4gbF9vdXRfcm93X21ham9yKHBhdGNoVGVuc29yUmFuZ2UpOwotICBwYXRjaFRlbnNvckJ1ZmZTaXplID1sX291dF9yb3dfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9sX291dF9yb3dfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLEluZGV4VHlwZT4+IGdwdV9sX291dF9yb3dfbWFqb3IoZ3B1X2RhdGFfbF9vdXRfcm93X21ham9yLCBwYXRjaFRlbnNvclJhbmdlKTsKLSAgZ3B1X2xfb3V0X3Jvd19tYWpvci5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9sX2luX2NvbF9tYWpvci5zd2FwX2xheW91dCgpLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygxMSwgMTEpOworICBwYXRjaFRlbnNvclJhbmdlID0ge3tzaXplRGltNCwgc2l6ZURpbTIgKiBzaXplRGltMywgMTEsIDExLCBzaXplRGltMX19OworICBUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLCBJbmRleFR5cGU+IGxfb3V0X3Jvd19tYWpvcihwYXRjaFRlbnNvclJhbmdlKTsKKyAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IGxfb3V0X3Jvd19tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfbF9vdXRfcm93X21ham9yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLCBJbmRleFR5cGU+PiBncHVfbF9vdXRfcm93X21ham9yKGdwdV9kYXRhX2xfb3V0X3Jvd19tYWpvciwgcGF0Y2hUZW5zb3JSYW5nZSk7CisgIGdwdV9sX291dF9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9sX2luX2NvbF9tYWpvci5zd2FwX2xheW91dCgpLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygxMSwgMTEpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QobF9vdXRfcm93X21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfbF9vdXRfcm93X21ham9yLCBwYXRjaFRlbnNvckJ1ZmZTaXplKTsKIAogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigwKSwgc2l6ZURpbTQpOwotICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigxKSwgc2l6ZURpbTIqc2l6ZURpbTMpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigxKSwgc2l6ZURpbTIgKiBzaXplRGltMyk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDIpLCAxMSk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDMpLCAxMSk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDQpLCBzaXplRGltMSk7CkBAIC04MjQsMjggKzg2OSwyNiBAQAogICBmb3IgKEluZGV4VHlwZSBiID0gMDsgYiA8IDE2OyArK2IpIHsKICAgICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDEyODsgKytpKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IDEyODsgKytqKSB7Ci0gICAgICAgIEluZGV4VHlwZSBwYXRjaElkID0gaSsxMjgqajsKKyAgICAgICAgSW5kZXhUeXBlIHBhdGNoSWQgPSBpICsgMTI4ICogajsKICAgICAgICAgZm9yIChJbmRleFR5cGUgYyA9IDA7IGMgPCAxMTsgKytjKSB7CiAgICAgICAgICAgZm9yIChJbmRleFR5cGUgciA9IDA7IHIgPCAxMTsgKytyKSB7CiAgICAgICAgICAgICBmb3IgKEluZGV4VHlwZSBkID0gMDsgZCA8IDM7ICsrZCkgewogICAgICAgICAgICAgICBEYXRhVHlwZSBleHBlY3RlZCA9IDAuMGY7Ci0gICAgICAgICAgICAgIGlmIChyLTUraSA+PSAwICYmIGMtNStqID49IDAgJiYgci01K2kgPCAxMjggJiYgYy01K2ogPCAxMjgpIHsKLSAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxfaW5fY29sX21ham9yKGQsIHItNStpLCBjLTUraiwgYik7CisgICAgICAgICAgICAgIGlmIChyIC0gNSArIGkgPj0gMCAmJiBjIC0gNSArIGogPj0gMCAmJiByIC0gNSArIGkgPCAxMjggJiYgYyAtIDUgKyBqIDwgMTI4KSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsX2luX2NvbF9tYWpvcihkLCByIC0gNSArIGksIGMgLSA1ICsgaiwgYik7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLy8gQ29sTWFqb3IKICAgICAgICAgICAgICAgaWYgKGxfb3V0X2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkLCBiKSAhPSBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkLCBiKSwgZXhwZWN0ZWQpOwogICAgICAgICAgICAgICAvLyBSb3dNYWpvcgotICAgICAgICAgICAgICBpZiAobF9vdXRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpICE9Ci0gICAgICAgICAgICAgICAgICBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgagotICAgICAgICAgICAgICAgICAgICAgPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYgotICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICBpZiAobF9vdXRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpICE9IGV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCk7CisgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IoYiwgcGF0Y2hJZCwgYywgciwgZCksIGV4cGVjdGVkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTg2MywzNSArOTA2LDQwIEBACiAgIHRlbnNvckNvbE1ham9yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTMsIHNpemVEaW00fX07CiAgIGxfaW5fY29sX21ham9yLnJlc2l6ZSh0ZW5zb3JDb2xNYWpvclJhbmdlKTsKICAgbF9pbl9jb2xfbWFqb3Iuc2V0UmFuZG9tKCk7Ci0gIGdwdV9kYXRhX2xfaW5fY29sX21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobF9pbl9jb2xfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgQ29sTWFqb3IsIEluZGV4VHlwZT4+Z3B1X2xfaW5fY29sX21ham9yX3Jlc2l6ZTEoZ3B1X2RhdGFfbF9pbl9jb2xfbWFqb3IsIHRlbnNvckNvbE1ham9yUmFuZ2UpOworICBncHVfZGF0YV9sX2luX2NvbF9tYWpvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobF9pbl9jb2xfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBDb2xNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X2xfaW5fY29sX21ham9yX3Jlc2l6ZTEoZ3B1X2RhdGFfbF9pbl9jb2xfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3JDb2xNYWpvclJhbmdlKTsKIAotICBwYXRjaFRlbnNvclJhbmdlPXt7c2l6ZURpbTEsIDksIDksIHNpemVEaW0yKnNpemVEaW0zLCBzaXplRGltNH19OworICBwYXRjaFRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgOSwgOSwgc2l6ZURpbTIgKiBzaXplRGltMywgc2l6ZURpbTR9fTsKICAgbF9vdXRfY29sX21ham9yLnJlc2l6ZShwYXRjaFRlbnNvclJhbmdlKTsKLSAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9bF9vdXRfY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBncHVfZGF0YV9sX291dF9jb2xfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj5ncHVfbF9vdXRfY29sX21ham9yX3Jlc2l6ZTEoZ3B1X2RhdGFfbF9vdXRfY29sX21ham9yLCBwYXRjaFRlbnNvclJhbmdlKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX2xfaW5fY29sX21ham9yLCBsX2luX2NvbF9tYWpvci5kYXRhKCksKGxfaW5fY29sX21ham9yLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIGdwdV9sX291dF9jb2xfbWFqb3JfcmVzaXplMS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9sX2luX2NvbF9tYWpvcl9yZXNpemUxLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyg5LCA5KTsKKyAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IGxfb3V0X2NvbF9tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBncHVfZGF0YV9sX291dF9jb2xfbWFqb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2xfb3V0X2NvbF9tYWpvcl9yZXNpemUxKGdwdV9kYXRhX2xfb3V0X2NvbF9tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoVGVuc29yUmFuZ2UpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfbF9pbl9jb2xfbWFqb3IsIGxfaW5fY29sX21ham9yLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsX2luX2NvbF9tYWpvci5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIGdwdV9sX291dF9jb2xfbWFqb3JfcmVzaXplMS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2xfaW5fY29sX21ham9yX3Jlc2l6ZTEuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDksIDkpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QobF9vdXRfY29sX21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfbF9vdXRfY29sX21ham9yLCBwYXRjaFRlbnNvckJ1ZmZTaXplKTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X2NvbF9tYWpvci5kaW1lbnNpb24oMCksIDE2KTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X2NvbF9tYWpvci5kaW1lbnNpb24oMSksIDkpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfY29sX21ham9yLmRpbWVuc2lvbigyKSwgOSk7Ci0gIFZFUklGWV9JU19FUVVBTChsX291dF9jb2xfbWFqb3IuZGltZW5zaW9uKDMpLCA2NCo2NCk7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9jb2xfbWFqb3IuZGltZW5zaW9uKDMpLCA2NCAqIDY0KTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X2NvbF9tYWpvci5kaW1lbnNpb24oNCksIDMyKTsKIAotLy8gUm93TWFqb3IKKyAgLy8gUm93TWFqb3IKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfZGF0YV9sX291dF9yb3dfbWFqb3IpOwotICBwYXRjaFRlbnNvclJhbmdlPXt7c2l6ZURpbTQsIHNpemVEaW0yKnNpemVEaW0zLCA5LCA5ICxzaXplRGltMX19OworICBwYXRjaFRlbnNvclJhbmdlID0ge3tzaXplRGltNCwgc2l6ZURpbTIgKiBzaXplRGltMywgOSwgOSwgc2l6ZURpbTF9fTsKICAgbF9vdXRfcm93X21ham9yLnJlc2l6ZShwYXRjaFRlbnNvclJhbmdlKTsKLSAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9bF9vdXRfcm93X21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBncHVfZGF0YV9sX291dF9yb3dfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLEluZGV4VHlwZT4+Z3B1X2xfb3V0X3Jvd19tYWpvcl9yZXNpemUxKGdwdV9kYXRhX2xfb3V0X3Jvd19tYWpvciwgcGF0Y2hUZW5zb3JSYW5nZSk7Ci0gIGdwdV9sX291dF9yb3dfbWFqb3JfcmVzaXplMS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9sX2luX2NvbF9tYWpvcl9yZXNpemUxLnN3YXBfbGF5b3V0KCkuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDksIDkpOworICBwYXRjaFRlbnNvckJ1ZmZTaXplID0gbF9vdXRfcm93X21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIGdwdV9kYXRhX2xfb3V0X3Jvd19tYWpvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X2xfb3V0X3Jvd19tYWpvcl9yZXNpemUxKGdwdV9kYXRhX2xfb3V0X3Jvd19tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFRlbnNvclJhbmdlKTsKKyAgZ3B1X2xfb3V0X3Jvd19tYWpvcl9yZXNpemUxLmRldmljZShzeWNsX2RldmljZSkgPQorICAgICAgZ3B1X2xfaW5fY29sX21ham9yX3Jlc2l6ZTEuc3dhcF9sYXlvdXQoKS5leHRyYWN0X2ltYWdlX3BhdGNoZXMoOSwgOSk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChsX291dF9yb3dfbWFqb3IuZGF0YSgpLCBncHVfZGF0YV9sX291dF9yb3dfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCiAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDApLCAzMik7Ci0gIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCA2NCo2NCk7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCA2NCAqIDY0KTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMiksIDkpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigzKSwgOSk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDQpLCAxNik7CkBAIC04OTksMjIgKzk0NywyNCBAQAogICBmb3IgKEluZGV4VHlwZSBiID0gMDsgYiA8IDMyOyArK2IpIHsKICAgICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDY0OyArK2kpIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgNjQ7ICsraikgewotICAgICAgICBJbmRleFR5cGUgcGF0Y2hJZCA9IGkrNjQqajsKKyAgICAgICAgSW5kZXhUeXBlIHBhdGNoSWQgPSBpICsgNjQgKiBqOwogICAgICAgICBmb3IgKEluZGV4VHlwZSBjID0gMDsgYyA8IDk7ICsrYykgewogICAgICAgICAgIGZvciAoSW5kZXhUeXBlIHIgPSAwOyByIDwgOTsgKytyKSB7CiAgICAgICAgICAgICBmb3IgKEluZGV4VHlwZSBkID0gMDsgZCA8IDE2OyArK2QpIHsKICAgICAgICAgICAgICAgRGF0YVR5cGUgZXhwZWN0ZWQgPSAwLjBmOwotICAgICAgICAgICAgICBpZiAoci00K2kgPj0gMCAmJiBjLTQraiA+PSAwICYmIHItNCtpIDwgNjQgJiYgYy00K2ogPCA2NCkgewotICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbF9pbl9jb2xfbWFqb3IoZCwgci00K2ksIGMtNCtqLCBiKTsKKyAgICAgICAgICAgICAgaWYgKHIgLSA0ICsgaSA+PSAwICYmIGMgLSA0ICsgaiA+PSAwICYmIHIgLSA0ICsgaSA8IDY0ICYmIGMgLSA0ICsgaiA8IDY0KSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsX2luX2NvbF9tYWpvcihkLCByIC0gNCArIGksIGMgLSA0ICsgaiwgYik7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLy8gQ29sTWFqb3IKICAgICAgICAgICAgICAgaWYgKGxfb3V0X2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkLCBiKSAhPSBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkLCBiKSwgZXhwZWN0ZWQpOwogICAgICAgICAgICAgICAvLyBSb3dNYWpvcgogICAgICAgICAgICAgICBpZiAobF9vdXRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpICE9IGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZCk7CiAgICAgICAgICAgICB9CkBAIC05MzUsMzYgKzk4NSw0MSBAQAogICB0ZW5zb3JDb2xNYWpvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNH19OwogICBsX2luX2NvbF9tYWpvci5yZXNpemUodGVuc29yQ29sTWFqb3JSYW5nZSk7CiAgIGxfaW5fY29sX21ham9yLnNldFJhbmRvbSgpOwotICBncHVfZGF0YV9sX2luX2NvbF9tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGxfaW5fY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIENvbE1ham9yLCBJbmRleFR5cGU+PmdwdV9sX2luX2NvbF9tYWpvcl9yZXNpemUyKGdwdV9kYXRhX2xfaW5fY29sX21ham9yLCB0ZW5zb3JDb2xNYWpvclJhbmdlKTsKKyAgZ3B1X2RhdGFfbF9pbl9jb2xfbWFqb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGxfaW5fY29sX21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgQ29sTWFqb3IsIEluZGV4VHlwZT4+IGdwdV9sX2luX2NvbF9tYWpvcl9yZXNpemUyKGdwdV9kYXRhX2xfaW5fY29sX21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yQ29sTWFqb3JSYW5nZSk7CiAKLSAgcGF0Y2hUZW5zb3JSYW5nZT17e3NpemVEaW0xLCA3LCA3LCBzaXplRGltMipzaXplRGltMywgc2l6ZURpbTR9fTsKKyAgcGF0Y2hUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEsIDcsIDcsIHNpemVEaW0yICogc2l6ZURpbTMsIHNpemVEaW00fX07CiAgIGxfb3V0X2NvbF9tYWpvci5yZXNpemUocGF0Y2hUZW5zb3JSYW5nZSk7Ci0gIHBhdGNoVGVuc29yQnVmZlNpemUgPWxfb3V0X2NvbF9tYWpvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgZ3B1X2RhdGFfbF9vdXRfY29sX21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+Z3B1X2xfb3V0X2NvbF9tYWpvcl9yZXNpemUyKGdwdV9kYXRhX2xfb3V0X2NvbF9tYWpvciwgcGF0Y2hUZW5zb3JSYW5nZSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV9sX2luX2NvbF9tYWpvciwgbF9pbl9jb2xfbWFqb3IuZGF0YSgpLChsX2luX2NvbF9tYWpvci5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotICBncHVfbF9vdXRfY29sX21ham9yX3Jlc2l6ZTIuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfbF9pbl9jb2xfbWFqb3JfcmVzaXplMi5leHRyYWN0X2ltYWdlX3BhdGNoZXMoNywgNyk7CisgIHBhdGNoVGVuc29yQnVmZlNpemUgPSBsX291dF9jb2xfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgZ3B1X2RhdGFfbF9vdXRfY29sX21ham9yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9sX291dF9jb2xfbWFqb3JfcmVzaXplMihncHVfZGF0YV9sX291dF9jb2xfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFRlbnNvclJhbmdlKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX2xfaW5fY29sX21ham9yLCBsX2luX2NvbF9tYWpvci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobF9pbl9jb2xfbWFqb3Iuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBncHVfbF9vdXRfY29sX21ham9yX3Jlc2l6ZTIuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9sX2luX2NvbF9tYWpvcl9yZXNpemUyLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyg3LCA3KTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGxfb3V0X2NvbF9tYWpvci5kYXRhKCksIGdwdV9kYXRhX2xfb3V0X2NvbF9tYWpvciwgcGF0Y2hUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X2NvbF9tYWpvci5kaW1lbnNpb24oMCksIDMyKTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X2NvbF9tYWpvci5kaW1lbnNpb24oMSksIDcpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfY29sX21ham9yLmRpbWVuc2lvbigyKSwgNyk7Ci0gIFZFUklGWV9JU19FUVVBTChsX291dF9jb2xfbWFqb3IuZGltZW5zaW9uKDMpLCAxNioxNik7CisgIFZFUklGWV9JU19FUVVBTChsX291dF9jb2xfbWFqb3IuZGltZW5zaW9uKDMpLCAxNiAqIDE2KTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X2NvbF9tYWpvci5kaW1lbnNpb24oNCksIDMyKTsKIAogICAvLyBSb3dNYWpvcgogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9kYXRhX2xfb3V0X3Jvd19tYWpvcik7Ci0gIHBhdGNoVGVuc29yUmFuZ2U9e3tzaXplRGltNCwgc2l6ZURpbTIqc2l6ZURpbTMsIDcsIDcgLHNpemVEaW0xfX07CisgIHBhdGNoVGVuc29yUmFuZ2UgPSB7e3NpemVEaW00LCBzaXplRGltMiAqIHNpemVEaW0zLCA3LCA3LCBzaXplRGltMX19OwogICBsX291dF9yb3dfbWFqb3IucmVzaXplKHBhdGNoVGVuc29yUmFuZ2UpOwotICBwYXRjaFRlbnNvckJ1ZmZTaXplID1sX291dF9yb3dfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIGdwdV9kYXRhX2xfb3V0X3Jvd19tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgUm93TWFqb3IsSW5kZXhUeXBlPj5ncHVfbF9vdXRfcm93X21ham9yX3Jlc2l6ZTIoZ3B1X2RhdGFfbF9vdXRfcm93X21ham9yLCBwYXRjaFRlbnNvclJhbmdlKTsKLSAgZ3B1X2xfb3V0X3Jvd19tYWpvcl9yZXNpemUyLmRldmljZShzeWNsX2RldmljZSk9Z3B1X2xfaW5fY29sX21ham9yX3Jlc2l6ZTIuc3dhcF9sYXlvdXQoKS5leHRyYWN0X2ltYWdlX3BhdGNoZXMoNywgNyk7CisgIHBhdGNoVGVuc29yQnVmZlNpemUgPSBsX291dF9yb3dfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgZ3B1X2RhdGFfbF9vdXRfcm93X21ham9yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLCBJbmRleFR5cGU+PiBncHVfbF9vdXRfcm93X21ham9yX3Jlc2l6ZTIoZ3B1X2RhdGFfbF9vdXRfcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoVGVuc29yUmFuZ2UpOworICBncHVfbF9vdXRfcm93X21ham9yX3Jlc2l6ZTIuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9CisgICAgICBncHVfbF9pbl9jb2xfbWFqb3JfcmVzaXplMi5zd2FwX2xheW91dCgpLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcyg3LCA3KTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGxfb3V0X3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX2xfb3V0X3Jvd19tYWpvciwgcGF0Y2hUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMCksIDMyKTsKLSAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDE2KjE2KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMSksIDE2ICogMTYpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigyKSwgNyk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDMpLCA3KTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oNCksIDMyKTsKQEAgLTk3MiwyMiArMTAyNywyNCBAQAogICBmb3IgKEluZGV4VHlwZSBiID0gMDsgYiA8IDMyOyArK2IpIHsKICAgICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDE2OyArK2kpIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgMTY7ICsraikgewotICAgICAgICBJbmRleFR5cGUgcGF0Y2hJZCA9IGkrMTYqajsKKyAgICAgICAgSW5kZXhUeXBlIHBhdGNoSWQgPSBpICsgMTYgKiBqOwogICAgICAgICBmb3IgKEluZGV4VHlwZSBjID0gMDsgYyA8IDc7ICsrYykgewogICAgICAgICAgIGZvciAoSW5kZXhUeXBlIHIgPSAwOyByIDwgNzsgKytyKSB7CiAgICAgICAgICAgICBmb3IgKEluZGV4VHlwZSBkID0gMDsgZCA8IDMyOyArK2QpIHsKICAgICAgICAgICAgICAgRGF0YVR5cGUgZXhwZWN0ZWQgPSAwLjBmOwotICAgICAgICAgICAgICBpZiAoci0zK2kgPj0gMCAmJiBjLTMraiA+PSAwICYmIHItMytpIDwgMTYgJiYgYy0zK2ogPCAxNikgewotICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbF9pbl9jb2xfbWFqb3IoZCwgci0zK2ksIGMtMytqLCBiKTsKKyAgICAgICAgICAgICAgaWYgKHIgLSAzICsgaSA+PSAwICYmIGMgLSAzICsgaiA+PSAwICYmIHIgLSAzICsgaSA8IDE2ICYmIGMgLSAzICsgaiA8IDE2KSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsX2luX2NvbF9tYWpvcihkLCByIC0gMyArIGksIGMgLSAzICsgaiwgYik7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLy8gQ29sTWFqb3IKICAgICAgICAgICAgICAgaWYgKGxfb3V0X2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkLCBiKSAhPSBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkLCBiKSwgZXhwZWN0ZWQpOwogICAgICAgICAgICAgICAvLyBSb3dNYWpvcgogICAgICAgICAgICAgICBpZiAobF9vdXRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpICE9IGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZCk7CiAgICAgICAgICAgICB9CkBAIC0xMDA3LDM2ICsxMDY0LDQxIEBACiAgIHRlbnNvckNvbE1ham9yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTMsIHNpemVEaW00fX07CiAgIGxfaW5fY29sX21ham9yLnJlc2l6ZSh0ZW5zb3JDb2xNYWpvclJhbmdlKTsKICAgbF9pbl9jb2xfbWFqb3Iuc2V0UmFuZG9tKCk7Ci0gIGdwdV9kYXRhX2xfaW5fY29sX21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobF9pbl9jb2xfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgQ29sTWFqb3IsIEluZGV4VHlwZT4+Z3B1X2xfaW5fY29sX21ham9yX3Jlc2l6ZTMoZ3B1X2RhdGFfbF9pbl9jb2xfbWFqb3IsIHRlbnNvckNvbE1ham9yUmFuZ2UpOworICBncHVfZGF0YV9sX2luX2NvbF9tYWpvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobF9pbl9jb2xfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBDb2xNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X2xfaW5fY29sX21ham9yX3Jlc2l6ZTMoZ3B1X2RhdGFfbF9pbl9jb2xfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3JDb2xNYWpvclJhbmdlKTsKIAotICBwYXRjaFRlbnNvclJhbmdlPXt7c2l6ZURpbTEsIDMsIDMsIHNpemVEaW0yKnNpemVEaW0zLCBzaXplRGltNH19OworICBwYXRjaFRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgMywgMywgc2l6ZURpbTIgKiBzaXplRGltMywgc2l6ZURpbTR9fTsKICAgbF9vdXRfY29sX21ham9yLnJlc2l6ZShwYXRjaFRlbnNvclJhbmdlKTsKLSAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9bF9vdXRfY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBncHVfZGF0YV9sX291dF9jb2xfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj5ncHVfbF9vdXRfY29sX21ham9yX3Jlc2l6ZTMoZ3B1X2RhdGFfbF9vdXRfY29sX21ham9yLCBwYXRjaFRlbnNvclJhbmdlKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX2xfaW5fY29sX21ham9yLCBsX2luX2NvbF9tYWpvci5kYXRhKCksKGxfaW5fY29sX21ham9yLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIGdwdV9sX291dF9jb2xfbWFqb3JfcmVzaXplMy5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV9sX2luX2NvbF9tYWpvcl9yZXNpemUzLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygzLCAzKTsKKyAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IGxfb3V0X2NvbF9tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBncHVfZGF0YV9sX291dF9jb2xfbWFqb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2xfb3V0X2NvbF9tYWpvcl9yZXNpemUzKGdwdV9kYXRhX2xfb3V0X2NvbF9tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoVGVuc29yUmFuZ2UpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfbF9pbl9jb2xfbWFqb3IsIGxfaW5fY29sX21ham9yLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsX2luX2NvbF9tYWpvci5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIGdwdV9sX291dF9jb2xfbWFqb3JfcmVzaXplMy5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2xfaW5fY29sX21ham9yX3Jlc2l6ZTMuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDMsIDMpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QobF9vdXRfY29sX21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfbF9vdXRfY29sX21ham9yLCBwYXRjaFRlbnNvckJ1ZmZTaXplKTsKIAogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfY29sX21ham9yLmRpbWVuc2lvbigwKSwgNjQpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfY29sX21ham9yLmRpbWVuc2lvbigxKSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dF9jb2xfbWFqb3IuZGltZW5zaW9uKDIpLCAzKTsKLSAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X2NvbF9tYWpvci5kaW1lbnNpb24oMyksIDEzKjEzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X2NvbF9tYWpvci5kaW1lbnNpb24oMyksIDEzICogMTMpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfY29sX21ham9yLmRpbWVuc2lvbig0KSwgMzIpOwogCiAgIC8vIFJvd01ham9yCiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2RhdGFfbF9vdXRfcm93X21ham9yKTsKLSAgcGF0Y2hUZW5zb3JSYW5nZT17e3NpemVEaW00LCBzaXplRGltMipzaXplRGltMywgMywgMyAsc2l6ZURpbTF9fTsKKyAgcGF0Y2hUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTQsIHNpemVEaW0yICogc2l6ZURpbTMsIDMsIDMsIHNpemVEaW0xfX07CiAgIGxfb3V0X3Jvd19tYWpvci5yZXNpemUocGF0Y2hUZW5zb3JSYW5nZSk7Ci0gIHBhdGNoVGVuc29yQnVmZlNpemUgPWxfb3V0X3Jvd19tYWpvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgZ3B1X2RhdGFfbF9vdXRfcm93X21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvcixJbmRleFR5cGU+PmdwdV9sX291dF9yb3dfbWFqb3JfcmVzaXplMyhncHVfZGF0YV9sX291dF9yb3dfbWFqb3IsIHBhdGNoVGVuc29yUmFuZ2UpOwotICBncHVfbF9vdXRfcm93X21ham9yX3Jlc2l6ZTMuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfbF9pbl9jb2xfbWFqb3JfcmVzaXplMy5zd2FwX2xheW91dCgpLmV4dHJhY3RfaW1hZ2VfcGF0Y2hlcygzLCAzKTsKKyAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IGxfb3V0X3Jvd19tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBncHVfZGF0YV9sX291dF9yb3dfbWFqb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgUm93TWFqb3IsIEluZGV4VHlwZT4+IGdwdV9sX291dF9yb3dfbWFqb3JfcmVzaXplMyhncHVfZGF0YV9sX291dF9yb3dfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hUZW5zb3JSYW5nZSk7CisgIGdwdV9sX291dF9yb3dfbWFqb3JfcmVzaXplMy5kZXZpY2Uoc3ljbF9kZXZpY2UpID0KKyAgICAgIGdwdV9sX2luX2NvbF9tYWpvcl9yZXNpemUzLnN3YXBfbGF5b3V0KCkuZXh0cmFjdF9pbWFnZV9wYXRjaGVzKDMsIDMpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QobF9vdXRfcm93X21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfbF9vdXRfcm93X21ham9yLCBwYXRjaFRlbnNvckJ1ZmZTaXplKTsKIAogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigwKSwgMzIpOwotICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigxKSwgMTMqMTMpOworICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbigxKSwgMTMgKiAxMyk7CiAgIFZFUklGWV9JU19FUVVBTChsX291dF9yb3dfbWFqb3IuZGltZW5zaW9uKDIpLCAzKTsKICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X3Jvd19tYWpvci5kaW1lbnNpb24oMyksIDMpOwogICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yLmRpbWVuc2lvbig0KSwgNjQpOwpAQCAtMTA0NCwyMiArMTEwNiwyNCBAQAogICBmb3IgKEluZGV4VHlwZSBiID0gMDsgYiA8IDMyOyArK2IpIHsKICAgICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDEzOyArK2kpIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgMTM7ICsraikgewotICAgICAgICBJbmRleFR5cGUgcGF0Y2hJZCA9IGkrMTMqajsKKyAgICAgICAgSW5kZXhUeXBlIHBhdGNoSWQgPSBpICsgMTMgKiBqOwogICAgICAgICBmb3IgKEluZGV4VHlwZSBjID0gMDsgYyA8IDM7ICsrYykgewogICAgICAgICAgIGZvciAoSW5kZXhUeXBlIHIgPSAwOyByIDwgMzsgKytyKSB7CiAgICAgICAgICAgICBmb3IgKEluZGV4VHlwZSBkID0gMDsgZCA8IDY0OyArK2QpIHsKICAgICAgICAgICAgICAgRGF0YVR5cGUgZXhwZWN0ZWQgPSAwLjBmOwotICAgICAgICAgICAgICBpZiAoci0xK2kgPj0gMCAmJiBjLTEraiA+PSAwICYmIHItMStpIDwgMTMgJiYgYy0xK2ogPCAxMykgewotICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbF9pbl9jb2xfbWFqb3IoZCwgci0xK2ksIGMtMStqLCBiKTsKKyAgICAgICAgICAgICAgaWYgKHIgLSAxICsgaSA+PSAwICYmIGMgLSAxICsgaiA+PSAwICYmIHIgLSAxICsgaSA8IDEzICYmIGMgLSAxICsgaiA8IDEzKSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsX2luX2NvbF9tYWpvcihkLCByIC0gMSArIGksIGMgLSAxICsgaiwgYik7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLy8gQ29sTWFqb3IKICAgICAgICAgICAgICAgaWYgKGxfb3V0X2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkLCBiKSAhPSBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4IGk9IiA8PCBpIDw8ICIgaj0iIDw8IGogPDwgIiByPSIgPDwgciA8PCAiIGM9IiA8PCBjCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZD0iIDw8IGQgPDwgIiBiPSIgPDwgYiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKGxfb3V0X2NvbF9tYWpvcihkLCByLCBjLCBwYXRjaElkLCBiKSwgZXhwZWN0ZWQpOwogICAgICAgICAgICAgICAvLyBSb3dNYWpvcgogICAgICAgICAgICAgICBpZiAobF9vdXRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpICE9IGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJNaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCBpPSIgPDwgaSA8PCAiIGo9IiA8PCBqIDw8ICIgcj0iIDw8IHIgPDwgIiBjPSIgPDwgYyA8PCAiIGQ9IiA8PCBkIDw8ICIgYj0iIDw8IGIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggaT0iIDw8IGkgPDwgIiBqPSIgPDwgaiA8PCAiIHI9IiA8PCByIDw8ICIgYz0iIDw8IGMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkPSIgPDwgZCA8PCAiIGI9IiA8PCBiIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwobF9vdXRfcm93X21ham9yKGIsIHBhdGNoSWQsIGMsIHIsIGQpLCBleHBlY3RlZCk7CiAgICAgICAgICAgICB9CkBAIC0xMDczLDIwICsxMTM3LDE5IEBACiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2RhdGFfbF9vdXRfcm93X21ham9yKTsKIH0KIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgZGV2X1NlbGVjdG9yPiB2b2lkIHN5Y2xfdGVuc29yX2ltYWdlX3BhdGNoX3Rlc3RfcGVyX2RldmljZShkZXZfU2VsZWN0b3Igcyl7Ci1RdWV1ZUludGVyZmFjZSBxdWV1ZUludGVyZmFjZShzKTsKLWF1dG8gc3ljbF9kZXZpY2UgPSBFaWdlbjo6U3ljbERldmljZSgmcXVldWVJbnRlcmZhY2UpOwotdGVzdF9zaW1wbGVfaW1hZ2VfcGF0Y2hfc3ljbDxEYXRhVHlwZSwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwotdGVzdF9wYXRjaF9wYWRkaW5nX3ZhbGlkX3N5Y2w8RGF0YVR5cGUsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKLXRlc3RfcGF0Y2hfcGFkZGluZ192YWxpZF9zYW1lX3ZhbHVlX3N5Y2w8RGF0YVR5cGUsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKLXRlc3RfcGF0Y2hfcGFkZGluZ19zYW1lX3N5Y2w8RGF0YVR5cGUsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKLXRlc3RfcGF0Y2hfbm9fZXh0cmFfZGltX3N5Y2w8RGF0YVR5cGUsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKLXRlc3RfaW1hZ2VuZXRfcGF0Y2hlc19zeWNsPERhdGFUeXBlLCBpbnQ2NF90PihzeWNsX2RldmljZSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIGRldl9TZWxlY3Rvcj4KK3ZvaWQgc3ljbF90ZW5zb3JfaW1hZ2VfcGF0Y2hfdGVzdF9wZXJfZGV2aWNlKGRldl9TZWxlY3RvciBzKSB7CisgIFF1ZXVlSW50ZXJmYWNlIHF1ZXVlSW50ZXJmYWNlKHMpOworICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKKyAgdGVzdF9zaW1wbGVfaW1hZ2VfcGF0Y2hfc3ljbDxEYXRhVHlwZSwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOworICB0ZXN0X3BhdGNoX3BhZGRpbmdfdmFsaWRfc3ljbDxEYXRhVHlwZSwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOworICB0ZXN0X3BhdGNoX3BhZGRpbmdfdmFsaWRfc2FtZV92YWx1ZV9zeWNsPERhdGFUeXBlLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CisgIHRlc3RfcGF0Y2hfcGFkZGluZ19zYW1lX3N5Y2w8RGF0YVR5cGUsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKKyAgdGVzdF9wYXRjaF9ub19leHRyYV9kaW1fc3ljbDxEYXRhVHlwZSwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOworICB0ZXN0X2ltYWdlbmV0X3BhdGNoZXNfc3ljbDxEYXRhVHlwZSwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogfQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9pbWFnZV9wYXRjaF9zeWNsKQotewotZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOkVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7Ci0gIENBTExfU1VCVEVTVChzeWNsX3RlbnNvcl9pbWFnZV9wYXRjaF90ZXN0X3Blcl9kZXZpY2U8ZmxvYXQ+KGRldmljZSkpOwotfQorRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9pbWFnZV9wYXRjaF9zeWNsKSB7CisgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogRWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKKyAgICBDQUxMX1NVQlRFU1Qoc3ljbF90ZW5zb3JfaW1hZ2VfcGF0Y2hfdGVzdF9wZXJfZGV2aWNlPGZsb2F0PihkZXZpY2UpKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfaW5kZXhfbGlzdC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbmRleF9saXN0LmNwcAppbmRleCA5Y2JkYWE3Li45ZTBiNzU1IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbmRleF9saXN0LmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbmRleF9saXN0LmNwcApAQCAtMTEsOSArMTEsOCBAQAogCiAjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgogCi1zdGF0aWMgdm9pZCB0ZXN0X3N0YXRpY19pbmRleF9saXN0KCkKLXsKLSAgVGVuc29yPGZsb2F0LCA0PiB0ZW5zb3IoMiwzLDUsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X3N0YXRpY19pbmRleF9saXN0KCkgeworICBUZW5zb3I8ZmxvYXQsIDQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogCiAgIGNvbnN0ZXhwciBhdXRvIHJlZHVjdGlvbl9heGlzID0gbWFrZV9pbmRleF9saXN0KDAsIDEsIDIpOwpAQCAtMzYsNyArMzUsNyBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMjsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDM7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDU7ICsrbCkgewotICAgICAgICAgIGV4cGVjdGVkICs9IHRlbnNvcihqLGssbCxpKTsKKyAgICAgICAgICBleHBlY3RlZCArPSB0ZW5zb3IoaiwgaywgbCwgaSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC00NCwxOCArNDMsMTkgQEAKICAgfQogfQogCi0KLXN0YXRpYyB2b2lkIHRlc3RfdHlwZTJpbmRleF9saXN0KCkKLXsKLSAgVGVuc29yPGZsb2F0LCA1PiB0ZW5zb3IoMiwzLDUsNywxMSk7CitzdGF0aWMgdm9pZCB0ZXN0X3R5cGUyaW5kZXhfbGlzdCgpIHsKKyAgVGVuc29yPGZsb2F0LCA1PiB0ZW5zb3IoMiwgMywgNSwgNywgMTEpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIHRlbnNvciArPSB0ZW5zb3IuY29uc3RhbnQoMTAuMGYpOwogCiAgIHR5cGVkZWYgRWlnZW46OkluZGV4TGlzdDxFaWdlbjo6dHlwZTJpbmRleDwwPj4gRGltczA7CiAgIHR5cGVkZWYgRWlnZW46OkluZGV4TGlzdDxFaWdlbjo6dHlwZTJpbmRleDwwPiwgRWlnZW46OnR5cGUyaW5kZXg8MT4+IERpbXMxOwogICB0eXBlZGVmIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MD4sIEVpZ2VuOjp0eXBlMmluZGV4PDE+LCBFaWdlbjo6dHlwZTJpbmRleDwyPj4gRGltczI7Ci0gIHR5cGVkZWYgRWlnZW46OkluZGV4TGlzdDxFaWdlbjo6dHlwZTJpbmRleDwwPiwgRWlnZW46OnR5cGUyaW5kZXg8MT4sIEVpZ2VuOjp0eXBlMmluZGV4PDI+LCBFaWdlbjo6dHlwZTJpbmRleDwzPj4gRGltczM7Ci0gIHR5cGVkZWYgRWlnZW46OkluZGV4TGlzdDxFaWdlbjo6dHlwZTJpbmRleDwwPiwgRWlnZW46OnR5cGUyaW5kZXg8MT4sIEVpZ2VuOjp0eXBlMmluZGV4PDI+LCBFaWdlbjo6dHlwZTJpbmRleDwzPiwgRWlnZW46OnR5cGUyaW5kZXg8ND4+IERpbXM0OworICB0eXBlZGVmIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MD4sIEVpZ2VuOjp0eXBlMmluZGV4PDE+LCBFaWdlbjo6dHlwZTJpbmRleDwyPiwgRWlnZW46OnR5cGUyaW5kZXg8Mz4+CisgICAgICBEaW1zMzsKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDA+LCBFaWdlbjo6dHlwZTJpbmRleDwxPiwgRWlnZW46OnR5cGUyaW5kZXg8Mj4sIEVpZ2VuOjp0eXBlMmluZGV4PDM+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRWlnZW46OnR5cGUyaW5kZXg8ND4+CisgICAgICBEaW1zNDsKIAogI2lmIDAKICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmluZGljZXNfc3RhdGljYWxseV9rbm93bl90b19pbmNyZWFzZTxEaW1zMD4oKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKQEAgLTY1LDE3ICs2NSwyNyBAQAogICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6aW5kaWNlc19zdGF0aWNhbGx5X2tub3duX3RvX2luY3JlYXNlPERpbXM0PigpID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwogI2VuZGlmCiAKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFyZV9pbm5lcl9tb3N0X2RpbXM8RGltczAsIDEsIENvbE1ham9yPjo6dmFsdWUgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjphcmVfaW5uZXJfbW9zdF9kaW1zPERpbXMxLCAyLCBDb2xNYWpvcj46OnZhbHVlID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJlX2lubmVyX21vc3RfZGltczxEaW1zMiwgMywgQ29sTWFqb3I+Ojp2YWx1ZSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFyZV9pbm5lcl9tb3N0X2RpbXM8RGltczMsIDQsIENvbE1ham9yPjo6dmFsdWUgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjphcmVfaW5uZXJfbW9zdF9kaW1zPERpbXM0LCA1LCBDb2xNYWpvcj46OnZhbHVlID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJlX2lubmVyX21vc3RfZGltczxEaW1zMCwgMSwgQ29sTWFqb3I+Ojp2YWx1ZSA9PSB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJlX2lubmVyX21vc3RfZGltczxEaW1zMSwgMiwgQ29sTWFqb3I+Ojp2YWx1ZSA9PSB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJlX2lubmVyX21vc3RfZGltczxEaW1zMiwgMywgQ29sTWFqb3I+Ojp2YWx1ZSA9PSB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJlX2lubmVyX21vc3RfZGltczxEaW1zMywgNCwgQ29sTWFqb3I+Ojp2YWx1ZSA9PSB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJlX2lubmVyX21vc3RfZGltczxEaW1zNCwgNSwgQ29sTWFqb3I+Ojp2YWx1ZSA9PSB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwogCi0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjphcmVfaW5uZXJfbW9zdF9kaW1zPERpbXMwLCAxLCBSb3dNYWpvcj46OnZhbHVlID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJlX2lubmVyX21vc3RfZGltczxEaW1zMSwgMiwgUm93TWFqb3I+Ojp2YWx1ZSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFyZV9pbm5lcl9tb3N0X2RpbXM8RGltczIsIDMsIFJvd01ham9yPjo6dmFsdWUgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKGludGVybmFsOjphcmVfaW5uZXJfbW9zdF9kaW1zPERpbXMzLCA0LCBSb3dNYWpvcj46OnZhbHVlID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJlX2lubmVyX21vc3RfZGltczxEaW1zNCwgNSwgUm93TWFqb3I+Ojp2YWx1ZSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFyZV9pbm5lcl9tb3N0X2RpbXM8RGltczAsIDEsIFJvd01ham9yPjo6dmFsdWUgPT0gdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFyZV9pbm5lcl9tb3N0X2RpbXM8RGltczEsIDIsIFJvd01ham9yPjo6dmFsdWUgPT0gdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFyZV9pbm5lcl9tb3N0X2RpbXM8RGltczIsIDMsIFJvd01ham9yPjo6dmFsdWUgPT0gdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFyZV9pbm5lcl9tb3N0X2RpbXM8RGltczMsIDQsIFJvd01ham9yPjo6dmFsdWUgPT0gdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OmFyZV9pbm5lcl9tb3N0X2RpbXM8RGltczQsIDUsIFJvd01ham9yPjo6dmFsdWUgPT0gdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKIAogICBjb25zdCBEaW1zMCByZWR1Y3Rpb25fYXhpczA7CiAgIFRlbnNvcjxmbG9hdCwgND4gcmVzdWx0MCA9IHRlbnNvci5zdW0ocmVkdWN0aW9uX2F4aXMwKTsKQEAgLTg1LDkgKzk1LDkgQEAKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgICAgICBmbG9hdCBleHBlY3RlZCA9IDAuMGY7CiAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICAgICAgICAgIGV4cGVjdGVkICs9IHRlbnNvcihpLGosayxsLG0pOworICAgICAgICAgICAgZXhwZWN0ZWQgKz0gdGVuc29yKGksIGosIGssIGwsIG0pOwogICAgICAgICAgIH0KLSAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdDAoaixrLGwsbSksIGV4cGVjdGVkKTsKKyAgICAgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdDAoaiwgaywgbCwgbSksIGV4cGVjdGVkKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTEwMSwxMCArMTExLDEwIEBACiAgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gMC4wZjsKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgICAgICAgICAgZXhwZWN0ZWQgKz0gdGVuc29yKGksaixrLGwsbSk7CisgICAgICAgICAgICBleHBlY3RlZCArPSB0ZW5zb3IoaSwgaiwgaywgbCwgbSk7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gocmVzdWx0MShrLGwsbSksIGV4cGVjdGVkKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQxKGssIGwsIG0pLCBleHBlY3RlZCk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0xMTcsMTEgKzEyNywxMSBAQAogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgICAgICAgICAgZXhwZWN0ZWQgKz0gdGVuc29yKGksaixrLGwsbSk7CisgICAgICAgICAgICBleHBlY3RlZCArPSB0ZW5zb3IoaSwgaiwgaywgbCwgbSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKHJlc3VsdDIobCxtKSwgZXhwZWN0ZWQpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQyKGwsIG0pLCBleHBlY3RlZCk7CiAgICAgfQogICB9CiAKQEAgLTEzMyw3ICsxNDMsNyBAQAogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgICAgICAgICAgZXhwZWN0ZWQgKz0gdGVuc29yKGksaixrLGwsbSk7CisgICAgICAgICAgICBleHBlY3RlZCArPSB0ZW5zb3IoaSwgaiwgaywgbCwgbSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CkBAIC0xNDksNyArMTU5LDcgQEAKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICAgICAgICAgIGV4cGVjdGVkICs9IHRlbnNvcihpLGosayxsLG0pOworICAgICAgICAgICAgZXhwZWN0ZWQgKz0gdGVuc29yKGksIGosIGssIGwsIG0pOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQpAQCAtMTU4LDI3ICsxNjgsMjcgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQ0KCksIGV4cGVjdGVkKTsKIH0KIAotCi1zdGF0aWMgdm9pZCB0ZXN0X3R5cGUyaW5kZXhwYWlyX2xpc3QoKQotewotICBUZW5zb3I8ZmxvYXQsIDU+IHRlbnNvcigyLDMsNSw3LDExKTsKK3N0YXRpYyB2b2lkIHRlc3RfdHlwZTJpbmRleHBhaXJfbGlzdCgpIHsKKyAgVGVuc29yPGZsb2F0LCA1PiB0ZW5zb3IoMiwgMywgNSwgNywgMTEpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIHRlbnNvciArPSB0ZW5zb3IuY29uc3RhbnQoMTAuMGYpOwogCi0gIHR5cGVkZWYgRWlnZW46OkluZGV4UGFpckxpc3Q8RWlnZW46OnR5cGUyaW5kZXhwYWlyPDAsMTA+PiBEaW1zMDsKLSAgdHlwZWRlZiBFaWdlbjo6SW5kZXhQYWlyTGlzdDxFaWdlbjo6dHlwZTJpbmRleHBhaXI8MCwxMD4sIEVpZ2VuOjp0eXBlMmluZGV4cGFpcjwxLDExPiwgRWlnZW46OnR5cGUyaW5kZXhwYWlyPDIsMTI+PiBEaW1zMl9hOwotICB0eXBlZGVmIEVpZ2VuOjpJbmRleFBhaXJMaXN0PEVpZ2VuOjp0eXBlMmluZGV4cGFpcjwwLDEwPiwgRWlnZW46OkluZGV4UGFpcjxJbmRleD4sIEVpZ2VuOjp0eXBlMmluZGV4cGFpcjwyLDEyPj4gRGltczJfYjsKLSAgdHlwZWRlZiBFaWdlbjo6SW5kZXhQYWlyTGlzdDxFaWdlbjo6SW5kZXhQYWlyPEluZGV4PiwgRWlnZW46OnR5cGUyaW5kZXhwYWlyPDEsMTE+LCBFaWdlbjo6SW5kZXhQYWlyPEluZGV4Pj4gRGltczJfYzsKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXhQYWlyTGlzdDxFaWdlbjo6dHlwZTJpbmRleHBhaXI8MCwgMTA+PiBEaW1zMDsKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXhQYWlyTGlzdDxFaWdlbjo6dHlwZTJpbmRleHBhaXI8MCwgMTA+LCBFaWdlbjo6dHlwZTJpbmRleHBhaXI8MSwgMTE+LCBFaWdlbjo6dHlwZTJpbmRleHBhaXI8MiwgMTI+PgorICAgICAgRGltczJfYTsKKyAgdHlwZWRlZiBFaWdlbjo6SW5kZXhQYWlyTGlzdDxFaWdlbjo6dHlwZTJpbmRleHBhaXI8MCwgMTA+LCBFaWdlbjo6SW5kZXhQYWlyPEluZGV4PiwgRWlnZW46OnR5cGUyaW5kZXhwYWlyPDIsIDEyPj4KKyAgICAgIERpbXMyX2I7CisgIHR5cGVkZWYgRWlnZW46OkluZGV4UGFpckxpc3Q8RWlnZW46OkluZGV4UGFpcjxJbmRleD4sIEVpZ2VuOjp0eXBlMmluZGV4cGFpcjwxLCAxMT4sIEVpZ2VuOjpJbmRleFBhaXI8SW5kZXg+PiBEaW1zMl9jOwogCiAgIERpbXMyX2EgZDJfYTsKIAogICBEaW1zMl9iIGQyX2I7Ci0gIGQyX2Iuc2V0KDEsIEVpZ2VuOjpJbmRleFBhaXI8SW5kZXg+KDEsMTEpKTsKKyAgZDJfYi5zZXQoMSwgRWlnZW46OkluZGV4UGFpcjxJbmRleD4oMSwgMTEpKTsKIAogICBEaW1zMl9jIGQyX2M7Ci0gIGQyX2Muc2V0KDAsIEVpZ2VuOjpJbmRleFBhaXI8SW5kZXg+KEVpZ2VuOjpJbmRleFBhaXI8SW5kZXg+KDAsMTApKSk7Ci0gIGQyX2Muc2V0KDEsIEVpZ2VuOjpJbmRleFBhaXI8SW5kZXg+KDEsMTEpKTsgIC8vIHNldHRpbmcgdHlwZTJpbmRleHBhaXIgdG8gY29ycmVjdCB2YWx1ZS4KLSAgZDJfYy5zZXQoMiwgRWlnZW46OkluZGV4UGFpcjxJbmRleD4oMiwxMikpOworICBkMl9jLnNldCgwLCBFaWdlbjo6SW5kZXhQYWlyPEluZGV4PihFaWdlbjo6SW5kZXhQYWlyPEluZGV4PigwLCAxMCkpKTsKKyAgZDJfYy5zZXQoMSwgRWlnZW46OkluZGV4UGFpcjxJbmRleD4oMSwgMTEpKTsgIC8vIHNldHRpbmcgdHlwZTJpbmRleHBhaXIgdG8gY29ycmVjdCB2YWx1ZS4KKyAgZDJfYy5zZXQoMiwgRWlnZW46OkluZGV4UGFpcjxJbmRleD4oMiwgMTIpKTsKIAogICBWRVJJRllfSVNfRVFVQUwoZDJfYVswXS5maXJzdCwgMCk7CiAgIFZFUklGWV9JU19FUVVBTChkMl9hWzBdLnNlY29uZCwgMTApOwpAQCAtMjEzLDU5ICsyMjMsOTcgQEAKICAgRUlHRU5fU1RBVElDX0FTU0VSVCgoZDJfYy52YWx1ZV9rbm93bl9zdGF0aWNhbGx5KDEpID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwogICBFSUdFTl9TVEFUSUNfQVNTRVJUKChkMl9jLnZhbHVlX2tub3duX3N0YXRpY2FsbHkoMikgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwogCi0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMwPigwLCAwKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczA+KDAsIDEpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczA+KDAsIDApID09IHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMwPigwLCAxKSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKIAotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9hPigwLCAwKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMCwgMSkgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9hPigxLCAxKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMSwgMikgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9hPigyLCAyKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMiwgMykgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9hPigwLCAwKSA9PSB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9hPigwLCAxKSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMSwgMSkgPT0gdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMSwgMikgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2E+KDIsIDIpID09IHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2E+KDIsIDMpID09IGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwogCi0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2I+KDAsIDApID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9iPigwLCAxKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2I+KDEsIDEpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYj4oMSwgMikgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9iPigyLCAyKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYj4oMiwgMykgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9iPigwLCAwKSA9PSB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9iPigwLCAxKSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYj4oMSwgMSkgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2I+KDEsIDIpID09IGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9iPigyLCAyKSA9PSB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9iPigyLCAzKSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKIAotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9jPigwLCAwKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDAsIDEpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYz4oMSwgMSkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDEsIDIpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYz4oMiwgMikgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9jPigyLCAzKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDAsIDApID09IGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9jPigwLCAxKSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYz4oMSwgMSkgPT0gdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX2ZpcnN0X3N0YXRpY2FsbHlfZXE8RGltczJfYz4oMSwgMikgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9maXJzdF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDIsIDIpID09IGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfZmlyc3Rfc3RhdGljYWxseV9lcTxEaW1zMl9jPigyLCAzKSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKIAotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczA+KDAsIDEwKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMwPigwLCAxMSkgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczA+KDAsIDEwKSA9PSB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczA+KDAsIDExKSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKIAotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMCwgMTApID09IHRydWUpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMCwgMTEpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2E+KDEsIDExKSA9PSB0cnVlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2E+KDEsIDEyKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9hPigyLCAxMikgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9hPigyLCAxMykgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMCwgMTApID09IHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9hPigwLCAxMSkgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9hPigxLCAxMSkgPT0gdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2E+KDEsIDEyKSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2E+KDIsIDEyKSA9PSB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYT4oMiwgMTMpID09IGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwogCi0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9iPigwLCAxMCkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9iPigwLCAxMSkgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYj4oMSwgMTEpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2I+KDEsIDEyKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9iPigyLCAxMikgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9iPigyLCAxMykgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOworICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYj4oMCwgMTApID09IHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9iPigwLCAxMSkgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9iPigxLCAxMSkgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9iPigxLCAxMikgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9iPigyLCAxMikgPT0gdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2I+KDIsIDEzKSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKIAotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYz4oMCwgMTApID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDAsIDExKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9jPigxLCAxMSkgPT0gdHJ1ZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7Ci0gIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9jPigxLCAxMikgPT0gZmFsc2UpLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwotICBFSUdFTl9TVEFUSUNfQVNTRVJUKChFaWdlbjo6aW50ZXJuYWw6OmluZGV4X3BhaXJfc2Vjb25kX3N0YXRpY2FsbHlfZXE8RGltczJfYz4oMiwgMTIpID09IGZhbHNlKSwgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKLSAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDIsIDEzKSA9PSBmYWxzZSksIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9jPigwLCAxMCkgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9jPigwLCAxMSkgPT0gZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgIFlPVV9NQURFX0FfUFJPR1JBTU1JTkdfTUlTVEFLRSk7CisgIEVJR0VOX1NUQVRJQ19BU1NFUlQoKEVpZ2VuOjppbnRlcm5hbDo6aW5kZXhfcGFpcl9zZWNvbmRfc3RhdGljYWxseV9lcTxEaW1zMl9jPigxLCAxMSkgPT0gdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDEsIDEyKSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDIsIDEyKSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKKyAgRUlHRU5fU1RBVElDX0FTU0VSVCgoRWlnZW46OmludGVybmFsOjppbmRleF9wYWlyX3NlY29uZF9zdGF0aWNhbGx5X2VxPERpbXMyX2M+KDIsIDEzKSA9PSBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgWU9VX01BREVfQV9QUk9HUkFNTUlOR19NSVNUQUtFKTsKIH0KIAotCi1zdGF0aWMgdm9pZCB0ZXN0X2R5bmFtaWNfaW5kZXhfbGlzdCgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgND4gdGVuc29yKDIsMyw1LDcpOworc3RhdGljIHZvaWQgdGVzdF9keW5hbWljX2luZGV4X2xpc3QoKSB7CisgIFRlbnNvcjxmbG9hdCwgND4gdGVuc29yKDIsIDMsIDUsIDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAKICAgaW50IGRpbTEgPSAyOwpAQCAtMjg3LDcgKzMzNSw3IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMzsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNTsgKytsKSB7Ci0gICAgICAgICAgZXhwZWN0ZWQgKz0gdGVuc29yKGosayxsLGkpOworICAgICAgICAgIGV4cGVjdGVkICs9IHRlbnNvcihqLCBrLCBsLCBpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTI5NSw5ICszNDMsOCBAQAogICB9CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfbWl4ZWRfaW5kZXhfbGlzdCgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgND4gdGVuc29yKDIsMyw1LDcpOworc3RhdGljIHZvaWQgdGVzdF9taXhlZF9pbmRleF9saXN0KCkgeworICBUZW5zb3I8ZmxvYXQsIDQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogCiAgIGludCBkaW0yID0gMTsKQEAgLTM0OSw3ICszOTYsNyBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgIGV4cGVjdGVkICs9IHRlbnNvcihpLGosayxsKTsKKyAgICAgICAgICBleHBlY3RlZCArPSB0ZW5zb3IoaSwgaiwgaywgbCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0zNTksOSArNDA2LDcgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChyZXN1bHQzKCksIGV4cGVjdGVkKTsKIH0KIAotCi1zdGF0aWMgdm9pZCB0ZXN0X2RpbV9jaGVjaygpCi17CitzdGF0aWMgdm9pZCB0ZXN0X2RpbV9jaGVjaygpIHsKICAgRWlnZW46OkluZGV4TGlzdDxFaWdlbjo6dHlwZTJpbmRleDwxPiwgaW50PiBkaW0xOwogICBkaW0xLnNldCgxLCAyKTsKICAgRWlnZW46OkluZGV4TGlzdDxFaWdlbjo6dHlwZTJpbmRleDwxPiwgaW50PiBkaW0yOwpAQCAtMzY5LDkgKzQxNCw3IEBACiAgIFZFUklGWShkaW1lbnNpb25zX21hdGNoKGRpbTEsIGRpbTIpKTsKIH0KIAotCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2luZGV4X2xpc3QpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2luZGV4X2xpc3QpIHsKICAgQ0FMTF9TVUJURVNUKHRlc3Rfc3RhdGljX2luZGV4X2xpc3QoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3R5cGUyaW5kZXhfbGlzdCgpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfdHlwZTJpbmRleHBhaXJfbGlzdCgpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2luZmxhdGlvbi5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbmZsYXRpb24uY3BwCmluZGV4IDc1MDg5ZTguLjMyNjYyYWIgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2luZmxhdGlvbi5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfaW5mbGF0aW9uLmNwcApAQCAtMTMsMTAgKzEzLDkgQEAKIAogdXNpbmcgRWlnZW46OlRlbnNvcjsKIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9pbmZsYXRpb24oKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2luZmxhdGlvbigpIHsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgNSwgNyk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKICAgYXJyYXk8cHRyZGlmZl90LCA0PiBzdHJpZGVzOwogCkBAIC0zNyw3ICszNiw3IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgbm9fc3RyaWRlKGksaixrLGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwpLCBub19zdHJpZGUoaSwgaiwgaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNTksMTQgKzU4LDEwIEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA5OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgOTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgMTk7ICsrbCkgewotICAgICAgICAgIGlmIChpICUgMiA9PSAwICYmCi0gICAgICAgICAgICAgIGogJSA0ID09IDAgJiYKLSAgICAgICAgICAgICAgayAlIDIgPT0gMCAmJgotICAgICAgICAgICAgICBsICUgMyA9PSAwKSB7Ci0gICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoaW5mbGF0ZWQoaSxqLGssbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yKGkvMiwgai80LCBrLzIsIGwvMykpOworICAgICAgICAgIGlmIChpICUgMiA9PSAwICYmIGogJSA0ID09IDAgJiYgayAlIDIgPT0gMCAmJiBsICUgMyA9PSAwKSB7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoaW5mbGF0ZWQoaSwgaiwgaywgbCksIHRlbnNvcihpIC8gMiwgaiAvIDQsIGsgLyAyLCBsIC8gMykpOwogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoMCwgaW5mbGF0ZWQoaSxqLGssbCkpOworICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKDAsIGluZmxhdGVkKGksIGosIGssIGwpKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTc0LDggKzY5LDcgQEAKICAgfQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2luZmxhdGlvbikKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfaW5mbGF0aW9uKSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9pbmZsYXRpb248Q29sTWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfaW5mbGF0aW9uPFJvd01ham9yPigpKTsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2luZmxhdGlvbl9zeWNsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2luZmxhdGlvbl9zeWNsLmNwcAppbmRleCA3NWMyYzBlLi4yNDc1YTM1IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbmZsYXRpb25fc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfaW5mbGF0aW9uX3N5Y2wuY3BwCkBAIC0zMCwxNiArMzAsMTQgQEAKIC8vICg0LCAwLCAwLCA0LCAwLCAwLCA0KS4KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotdm9pZCB0ZXN0X3NpbXBsZV9pbmZsYXRpb25fc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSAmc3ljbF9kZXZpY2UpIHsKLQotCit2b2lkIHRlc3Rfc2ltcGxlX2luZmxhdGlvbl9zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBJbmRleFR5cGUgc2l6ZURpbTEgPSAyOwogICBJbmRleFR5cGUgc2l6ZURpbTIgPSAzOwogICBJbmRleFR5cGUgc2l6ZURpbTMgPSA1OwogICBJbmRleFR5cGUgc2l6ZURpbTQgPSA3OwogICBhcnJheTxJbmRleFR5cGUsIDQ+IHRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNH19OwotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiB0ZW5zb3IodGVuc29yUmFuZ2UpOwotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBub19zdHJpZGUodGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yKHRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IG5vX3N0cmlkZSh0ZW5zb3JSYW5nZSk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKIAogICBhcnJheTxJbmRleFR5cGUsIDQ+IHN0cmlkZXM7CkBAIC00OCwxNiArNDYsMTUgQEAKICAgc3RyaWRlc1syXSA9IDE7CiAgIHN0cmlkZXNbM10gPSAxOwogCisgIGNvbnN0IHNpemVfdCB0ZW5zb3JCdWZmU2l6ZSA9IHRlbnNvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfdGVuc29yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JCdWZmU2l6ZSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfbm9fc3RyaWRlID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JCdWZmU2l6ZSkpOwogCi0gIGNvbnN0IHNpemVfdCB0ZW5zb3JCdWZmU2l6ZSA9dGVuc29yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfdGVuc29yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yQnVmZlNpemUpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX25vX3N0cmlkZSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvckJ1ZmZTaXplKSk7Ci0KLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfdGVuc29yKGdwdV9kYXRhX3RlbnNvciwgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9ub19zdHJpZGUoZ3B1X2RhdGFfbm9fc3RyaWRlLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV90ZW5zb3IoZ3B1X2RhdGFfdGVuc29yLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9ub19zdHJpZGUoZ3B1X2RhdGFfbm9fc3RyaWRlLCB0ZW5zb3JSYW5nZSk7CiAKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX3RlbnNvciwgdGVuc29yLmRhdGEoKSwgdGVuc29yQnVmZlNpemUpOwotICBncHVfbm9fc3RyaWRlLmRldmljZShzeWNsX2RldmljZSk9Z3B1X3RlbnNvci5pbmZsYXRlKHN0cmlkZXMpOworICBncHVfbm9fc3RyaWRlLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfdGVuc29yLmluZmxhdGUoc3RyaWRlcyk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChub19zdHJpZGUuZGF0YSgpLCBncHVfZGF0YV9ub19zdHJpZGUsIHRlbnNvckJ1ZmZTaXplKTsKIAogICBWRVJJRllfSVNfRVFVQUwobm9fc3RyaWRlLmRpbWVuc2lvbigwKSwgc2l6ZURpbTEpOwpAQCAtNjksMTMgKzY2LDEyIEBACiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgIGZvciAoSW5kZXhUeXBlIGwgPSAwOyBsIDwgNzsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgbm9fc3RyaWRlKGksaixrLGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwpLCBub19zdHJpZGUoaSwgaiwgaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiAKLQogICBzdHJpZGVzWzBdID0gMjsKICAgc3RyaWRlc1sxXSA9IDQ7CiAgIHN0cmlkZXNbMl0gPSAyOwpAQCAtODksMTAgKzg1LDEwIEBACiAKICAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGluZmxhdGVkKGluZmxhdGVkVGVuc29yUmFuZ2UpOwogCi0gIGNvbnN0IHNpemVfdCBpbmZsYXRlZFRlbnNvckJ1ZmZTaXplID1pbmZsYXRlZC5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX2luZmxhdGVkICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5mbGF0ZWRUZW5zb3JCdWZmU2l6ZSkpOworICBjb25zdCBzaXplX3QgaW5mbGF0ZWRUZW5zb3JCdWZmU2l6ZSA9IGluZmxhdGVkLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9pbmZsYXRlZCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5mbGF0ZWRUZW5zb3JCdWZmU2l6ZSkpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfaW5mbGF0ZWQoZ3B1X2RhdGFfaW5mbGF0ZWQsIGluZmxhdGVkVGVuc29yUmFuZ2UpOwotICBncHVfaW5mbGF0ZWQuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfdGVuc29yLmluZmxhdGUoc3RyaWRlcyk7CisgIGdwdV9pbmZsYXRlZC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X3RlbnNvci5pbmZsYXRlKHN0cmlkZXMpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5mbGF0ZWQuZGF0YSgpLCBncHVfZGF0YV9pbmZsYXRlZCwgaW5mbGF0ZWRUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGluZmxhdGVkLmRpbWVuc2lvbigwKSwgaW5mbGF0ZWRTaXplRGltMSk7CkBAIC0xMDQsMTQgKzEwMCwxMSBAQAogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgaW5mbGF0ZWRTaXplRGltMjsgKytqKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IGluZmxhdGVkU2l6ZURpbTM7ICsraykgewogICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IGluZmxhdGVkU2l6ZURpbTQ7ICsrbCkgewotICAgICAgICAgIGlmIChpICUgc3RyaWRlc1swXSA9PSAwICYmCi0gICAgICAgICAgICAgIGogJSBzdHJpZGVzWzFdID09IDAgJiYKLSAgICAgICAgICAgICAgayAlIHN0cmlkZXNbMl0gPT0gMCAmJgotICAgICAgICAgICAgICBsICUgc3RyaWRlc1szXSA9PSAwKSB7Ci0gICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoaW5mbGF0ZWQoaSxqLGssbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yKGkvc3RyaWRlc1swXSwgai9zdHJpZGVzWzFdLCBrL3N0cmlkZXNbMl0sIGwvc3RyaWRlc1szXSkpOworICAgICAgICAgIGlmIChpICUgc3RyaWRlc1swXSA9PSAwICYmIGogJSBzdHJpZGVzWzFdID09IDAgJiYgayAlIHN0cmlkZXNbMl0gPT0gMCAmJiBsICUgc3RyaWRlc1szXSA9PSAwKSB7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoaW5mbGF0ZWQoaSwgaiwgaywgbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yKGkgLyBzdHJpZGVzWzBdLCBqIC8gc3RyaWRlc1sxXSwgayAvIHN0cmlkZXNbMl0sIGwgLyBzdHJpZGVzWzNdKSk7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCgwLCBpbmZsYXRlZChpLGosayxsKSk7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoMCwgaW5mbGF0ZWQoaSwgaiwgaywgbCkpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQpAQCAtMTIyLDE1ICsxMTUsMTUgQEAKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfZGF0YV9pbmZsYXRlZCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBkZXZfU2VsZWN0b3I+IHZvaWQgc3ljbF9pbmZsYXRpb25fdGVzdF9wZXJfZGV2aWNlKGRldl9TZWxlY3RvciBzKXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgZGV2X1NlbGVjdG9yPgordm9pZCBzeWNsX2luZmxhdGlvbl90ZXN0X3Blcl9kZXZpY2UoZGV2X1NlbGVjdG9yIHMpIHsKICAgUXVldWVJbnRlcmZhY2UgcXVldWVJbnRlcmZhY2Uocyk7CiAgIGF1dG8gc3ljbF9kZXZpY2UgPSBFaWdlbjo6U3ljbERldmljZSgmcXVldWVJbnRlcmZhY2UpOwogICB0ZXN0X3NpbXBsZV9pbmZsYXRpb25fc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKICAgdGVzdF9zaW1wbGVfaW5mbGF0aW9uX3N5Y2w8RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CiB9Ci1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2luZmxhdGlvbl9zeWNsKQotewotICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6RWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfaW5mbGF0aW9uX3N5Y2wpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgewogICAgIENBTExfU1VCVEVTVChzeWNsX2luZmxhdGlvbl90ZXN0X3Blcl9kZXZpY2U8aGFsZj4oZGV2aWNlKSk7CiAgICAgQ0FMTF9TVUJURVNUKHN5Y2xfaW5mbGF0aW9uX3Rlc3RfcGVyX2RldmljZTxmbG9hdD4oZGV2aWNlKSk7CiAgIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ludGRpdi5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pbnRkaXYuY3BwCmluZGV4IGQxOGEwNWUuLjQzM2NhNmUgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2ludGRpdi5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfaW50ZGl2LmNwcApAQCAtMTEsOSArMTEsNyBAQAogCiAjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgogCi0KLXZvaWQgdGVzdF9zaWduZWRfMzJiaXQoKQotewordm9pZCB0ZXN0X3NpZ25lZF8zMmJpdCgpIHsKICAgLy8gRGl2aWRlIGJ5IG9uZQogICBjb25zdCBFaWdlbjo6aW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8aW50MzJfdCwgZmFsc2U+IGRpdl9ieV9vbmUoMSk7CiAKQEAgLTQ2LDkgKzQ0LDcgQEAKICAgfQogfQogCi0KLXZvaWQgdGVzdF91bnNpZ25lZF8zMmJpdCgpCi17Cit2b2lkIHRlc3RfdW5zaWduZWRfMzJiaXQoKSB7CiAgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCAyNTAwMDsgKytpKSB7CiAgICAgY29uc3QgRWlnZW46OmludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPHVpbnQzMl90PiBkaXYoaSk7CiAKQEAgLTYwLDkgKzU2LDcgQEAKICAgfQogfQogCi0KLXZvaWQgdGVzdF9zaWduZWRfNjRiaXQoKQotewordm9pZCB0ZXN0X3NpZ25lZF82NGJpdCgpIHsKICAgZm9yIChpbnQ2NF90IGkgPSAxOyBpIDwgMjUwMDA7ICsraSkgewogICAgIGNvbnN0IEVpZ2VuOjppbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxpbnQ2NF90PiBkaXYoaSk7CiAKQEAgLTc0LDkgKzY4LDcgQEAKICAgfQogfQogCi0KLXZvaWQgdGVzdF91bnNpZ25lZF82NGJpdCgpCi17Cit2b2lkIHRlc3RfdW5zaWduZWRfNjRiaXQoKSB7CiAgIGZvciAodWludDY0X3QgaSA9IDE7IGkgPCAyNTAwMDsgKytpKSB7CiAgICAgY29uc3QgRWlnZW46OmludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPHVpbnQ2NF90PiBkaXYoaSk7CiAKQEAgLTk0LDEyICs4NiwxMCBAQAogICAgIGZvciAoaW50IG51bV9leHBvbiA9IDA7IG51bV9leHBvbiA8IDMyOyBudW1fZXhwb24rKykgewogICAgICAgaW50MzJfdCBzdGFydF9udW0gPSAoMSA8PCBudW1fZXhwb24pIC0gMTAwOwogICAgICAgaW50MzJfdCBlbmRfbnVtID0gKDEgPDwgbnVtX2V4cG9uKSArIDEwMDsKLSAgICAgIGlmIChzdGFydF9udW0gPCAwKQotICAgICAgICBzdGFydF9udW0gPSAwOworICAgICAgaWYgKHN0YXJ0X251bSA8IDApIHN0YXJ0X251bSA9IDA7CiAgICAgICBmb3IgKGludDMyX3QgbnVtID0gc3RhcnRfbnVtOyBudW0gPCBlbmRfbnVtOyBudW0rKykgewotICAgICAgICBFaWdlbjo6aW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8aW50MzJfdD4gZGl2aWRlciA9Ci0gICAgICAgICAgRWlnZW46OmludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPGludDMyX3Q+KGRpdik7Ci0gICAgICAgIGludDMyX3QgcmVzdWx0ID0gbnVtL2RpdjsKKyAgICAgICAgRWlnZW46OmludGVybmFsOjpUZW5zb3JJbnREaXZpc29yPGludDMyX3Q+IGRpdmlkZXIgPSBFaWdlbjo6aW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8aW50MzJfdD4oZGl2KTsKKyAgICAgICAgaW50MzJfdCByZXN1bHQgPSBudW0gLyBkaXY7CiAgICAgICAgIGludDMyX3QgcmVzdWx0X29wID0gZGl2aWRlci5kaXZpZGUobnVtKTsKICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF9vcCwgcmVzdWx0KTsKICAgICAgIH0KQEAgLTExMywxMSArMTAzLDEwIEBACiAgICAgZm9yIChpbnQgbnVtX2V4cG9uID0gMDsgbnVtX2V4cG9uIDwgNjM7IG51bV9leHBvbisrKSB7CiAgICAgICBpbnQ2NF90IHN0YXJ0X251bSA9ICgxdWxsIDw8IG51bV9leHBvbikgLSAxMDsKICAgICAgIGludDY0X3QgZW5kX251bSA9ICgxdWxsIDw8IG51bV9leHBvbikgKyAxMDsKLSAgICAgIGlmIChzdGFydF9udW0gPCAwKQotICAgICAgICBzdGFydF9udW0gPSAwOworICAgICAgaWYgKHN0YXJ0X251bSA8IDApIHN0YXJ0X251bSA9IDA7CiAgICAgICBmb3IgKGludDY0X3QgbnVtID0gc3RhcnRfbnVtOyBudW0gPCBlbmRfbnVtOyBudW0rKykgewogICAgICAgICBFaWdlbjo6aW50ZXJuYWw6OlRlbnNvckludERpdmlzb3I8aW50NjRfdD4gZGl2aWRlcihkaXYpOwotICAgICAgICBpbnQ2NF90IHJlc3VsdCA9IG51bS9kaXY7CisgICAgICAgIGludDY0X3QgcmVzdWx0ID0gbnVtIC8gZGl2OwogICAgICAgICBpbnQ2NF90IHJlc3VsdF9vcCA9IGRpdmlkZXIuZGl2aWRlKG51bSk7CiAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfb3AsIHJlc3VsdCk7CiAgICAgICB9CkBAIC0xMzAsMTMgKzExOSwxMiBAQAogICBpbnQ2NF90IGRpdiA9IDIwOTcxNTIwMDsKICAgaW50NjRfdCBudW0gPSAzMjM4MDAyNjg4bGw7CiAgIEVpZ2VuOjppbnRlcm5hbDo6VGVuc29ySW50RGl2aXNvcjxpbnQ2NF90PiBkaXZpZGVyKGRpdik7Ci0gIGludDY0X3QgcmVzdWx0ID0gbnVtL2RpdjsKKyAgaW50NjRfdCByZXN1bHQgPSBudW0gLyBkaXY7CiAgIGludDY0X3QgcmVzdWx0X29wID0gZGl2aWRlci5kaXZpZGUobnVtKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdCwgcmVzdWx0X29wKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9pbnRkaXYpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2ludGRpdikgewogICBDQUxMX1NVQlRFU1RfMSh0ZXN0X3NpZ25lZF8zMmJpdCgpKTsKICAgQ0FMTF9TVUJURVNUXzIodGVzdF91bnNpZ25lZF8zMmJpdCgpKTsKICAgQ0FMTF9TVUJURVNUXzModGVzdF9zaWduZWRfNjRiaXQoKSk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pby5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9pby5jcHAKaW5kZXggYzBlYTJhMS4uMTYyODVjMSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfaW8uY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2lvLmNwcApAQCAtMTQsNyArMTQsNyBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IHJhbmssIGludCBMYXlvdXQ+CiBzdHJ1Y3QgdGVzdF90ZW5zb3Jfb3N0cmVhbV9pbXBsIHt9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBMYXlvdXQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTGF5b3V0Pgogc3RydWN0IHRlc3RfdGVuc29yX29zdHJlYW1faW1wbDxTY2FsYXIsIDAsIExheW91dD4gewogICBzdGF0aWMgdm9pZCBydW4oKSB7CiAgICAgRWlnZW46OlRlbnNvcjxTY2FsYXIsIDA+IHQ7CkBAIC0yNSw3ICsyNSw3IEBACiAgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IExheW91dD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBMYXlvdXQ+CiBzdHJ1Y3QgdGVzdF90ZW5zb3Jfb3N0cmVhbV9pbXBsPFNjYWxhciwgMSwgTGF5b3V0PiB7CiAgIHN0YXRpYyB2b2lkIHJ1bigpIHsKICAgICBFaWdlbjo6VGVuc29yPFNjYWxhciwgMT4gdCA9IHszfTsKQEAgLTM2LDcgKzM2LDcgQEAKICAgfQogfTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTGF5b3V0PgordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgaW50IExheW91dD4KIHN0cnVjdCB0ZXN0X3RlbnNvcl9vc3RyZWFtX2ltcGw8U2NhbGFyLCAyLCBMYXlvdXQ+IHsKICAgc3RhdGljIHZvaWQgcnVuKCkgewogICAgIEVpZ2VuOjpUZW5zb3I8U2NhbGFyLCAyPiB0ID0gezMsIDJ9OwpAQCAtNDcsNyArNDcsNyBAQAogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIsIGludCBMYXlvdXQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgTGF5b3V0Pgogc3RydWN0IHRlc3RfdGVuc29yX29zdHJlYW1faW1wbDxTY2FsYXIsIDMsIExheW91dD4gewogICBzdGF0aWMgdm9pZCBydW4oKSB7CiAgICAgRWlnZW46OlRlbnNvcjxTY2FsYXIsIDM+IHQgPSB7NCwgMywgMn07CkBAIC02MSw3ICs2MSw3IEBACiAgIH0KIH07CiAKLXRlbXBsYXRlPGludCBMYXlvdXQ+Cit0ZW1wbGF0ZSA8aW50IExheW91dD4KIHN0cnVjdCB0ZXN0X3RlbnNvcl9vc3RyZWFtX2ltcGw8Ym9vbCwgMiwgTGF5b3V0PiB7CiAgIHN0YXRpYyB2b2lkIHJ1bigpIHsKICAgICBFaWdlbjo6VGVuc29yPGJvb2wsIDI+IHQgPSB7MywgMn07CkBAIC03Miw3ICs3Miw3IEBACiAgIH0KIH07CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhciwgaW50IExheW91dD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsIGludCBMYXlvdXQ+CiBzdHJ1Y3QgdGVzdF90ZW5zb3Jfb3N0cmVhbV9pbXBsPHN0ZDo6Y29tcGxleDxTY2FsYXI+LCAyLCBMYXlvdXQ+IHsKICAgc3RhdGljIHZvaWQgcnVuKCkgewogICAgIEVpZ2VuOjpUZW5zb3I8c3RkOjpjb21wbGV4PFNjYWxhcj4sIDI+IHQgPSB7MywgMn07CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9sYXlvdXRfc3dhcC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9sYXlvdXRfc3dhcC5jcHAKaW5kZXggZWZiMzMzMy4uNTBmYjNhZSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbGF5b3V0X3N3YXAuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2xheW91dF9zd2FwLmNwcApAQCAtMTMsOSArMTMsOCBAQAogCiB1c2luZyBFaWdlbjo6VGVuc29yOwogCi1zdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9zd2FwKCkKLXsKLSAgVGVuc29yPGZsb2F0LCAzLCBDb2xNYWpvcj4gdGVuc29yKDIsMyw3KTsKK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3N3YXAoKSB7CisgIFRlbnNvcjxmbG9hdCwgMywgQ29sTWFqb3I+IHRlbnNvcigyLCAzLCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogCiAgIFRlbnNvcjxmbG9hdCwgMywgUm93TWFqb3I+IHRlbnNvcjIgPSB0ZW5zb3Iuc3dhcF9sYXlvdXQoKTsKQEAgLTI2LDE5ICsyNSwxNyBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrKSwgdGVuc29yMihrLGosaSkpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGspLCB0ZW5zb3IyKGssIGosIGkpKTsKICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotCi1zdGF0aWMgdm9pZCB0ZXN0X3N3YXBfYXNfbHZhbHVlKCkKLXsKLSAgVGVuc29yPGZsb2F0LCAzLCBDb2xNYWpvcj4gdGVuc29yKDIsMyw3KTsKK3N0YXRpYyB2b2lkIHRlc3Rfc3dhcF9hc19sdmFsdWUoKSB7CisgIFRlbnNvcjxmbG9hdCwgMywgQ29sTWFqb3I+IHRlbnNvcigyLCAzLCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogCi0gIFRlbnNvcjxmbG9hdCwgMywgUm93TWFqb3I+IHRlbnNvcjIoNywzLDIpOworICBUZW5zb3I8ZmxvYXQsIDMsIFJvd01ham9yPiB0ZW5zb3IyKDcsIDMsIDIpOwogICB0ZW5zb3IyLnN3YXBfbGF5b3V0KCkgPSB0ZW5zb3I7CiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDApLCB0ZW5zb3IyLmRpbWVuc2lvbigyKSk7CiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDEpLCB0ZW5zb3IyLmRpbWVuc2lvbigxKSk7CkBAIC00NywxNSArNDQsMTMgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayksIHRlbnNvcjIoayxqLGkpKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrKSwgdGVuc29yMihrLCBqLCBpKSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9sYXlvdXRfc3dhcCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfbGF5b3V0X3N3YXApIHsKICAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX3N3YXAoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3N3YXBfYXNfbHZhbHVlKCkpOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbGF5b3V0X3N3YXBfc3ljbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9sYXlvdXRfc3dhcF9zeWNsLmNwcAppbmRleCBmNTU2ZDg0Li4wNjYyMjFlIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9sYXlvdXRfc3dhcF9zeWNsLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9sYXlvdXRfc3dhcF9zeWNsLmNwcApAQCAtMjUsMzMgKzI1LDMwIEBACiB1c2luZyBFaWdlbjo6VGVuc29yOwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3N3YXBfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpCi17CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9zd2FwX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIEluZGV4VHlwZSBzaXplRGltMSA9IDI7CiAgIEluZGV4VHlwZSBzaXplRGltMiA9IDM7CiAgIEluZGV4VHlwZSBzaXplRGltMyA9IDc7CiAgIGFycmF5PEluZGV4VHlwZSwgMz4gdGVuc29yQ29sUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTN9fTsKICAgYXJyYXk8SW5kZXhUeXBlLCAzPiB0ZW5zb3JSb3dSYW5nZSA9IHt7c2l6ZURpbTMsIHNpemVEaW0yLCBzaXplRGltMX19OwogCi0KICAgVGVuc29yPERhdGFUeXBlLCAzLCBDb2xNYWpvciwgSW5kZXhUeXBlPiB0ZW5zb3IxKHRlbnNvckNvbFJhbmdlKTsKICAgVGVuc29yPERhdGFUeXBlLCAzLCBSb3dNYWpvciwgSW5kZXhUeXBlPiB0ZW5zb3IyKHRlbnNvclJvd1JhbmdlKTsKICAgdGVuc29yMS5zZXRSYW5kb20oKTsKIAotICBEYXRhVHlwZSogZ3B1X2RhdGExICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yMS5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOwotICBEYXRhVHlwZSogZ3B1X2RhdGEyICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yMi5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGExID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3IxLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhMiA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yMi5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIENvbE1ham9yLCBJbmRleFR5cGU+PiBncHUxKGdwdV9kYXRhMSwgdGVuc29yQ29sUmFuZ2UpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAzLCBSb3dNYWpvciwgSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsIHRlbnNvclJvd1JhbmdlKTsKIAotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IxLmRhdGEoKSwodGVuc29yMS5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotICBncHUyLmRldmljZShzeWNsX2RldmljZSk9Z3B1MS5zd2FwX2xheW91dCgpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yMi5kYXRhKCksIGdwdV9kYXRhMiwodGVuc29yMi5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IxLmRhdGEoKSwgKHRlbnNvcjEuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBncHUyLmRldmljZShzeWNsX2RldmljZSkgPSBncHUxLnN3YXBfbGF5b3V0KCk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3IyLmRhdGEoKSwgZ3B1X2RhdGEyLCAodGVuc29yMi5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAKKyAgLy8gIFRlbnNvcjxmbG9hdCwgMywgQ29sTWFqb3I+IHRlbnNvcigyLDMsNyk7CisgIC8vIHRlbnNvci5zZXRSYW5kb20oKTsKIAotLy8gIFRlbnNvcjxmbG9hdCwgMywgQ29sTWFqb3I+IHRlbnNvcigyLDMsNyk7Ci0gIC8vdGVuc29yLnNldFJhbmRvbSgpOwotCi0vLyAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gdGVuc29yMiA9IHRlbnNvci5zd2FwX2xheW91dCgpOworICAvLyAgVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gdGVuc29yMiA9IHRlbnNvci5zd2FwX2xheW91dCgpOwogICBWRVJJRllfSVNfRVFVQUwodGVuc29yMS5kaW1lbnNpb24oMCksIHRlbnNvcjIuZGltZW5zaW9uKDIpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjEuZGltZW5zaW9uKDEpLCB0ZW5zb3IyLmRpbWVuc2lvbigxKSk7CiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxLmRpbWVuc2lvbigyKSwgdGVuc29yMi5kaW1lbnNpb24oMCkpOwpAQCAtNTksNyArNTYsNyBAQAogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yMShpLGosayksIHRlbnNvcjIoayxqLGkpKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjEoaSwgaiwgayksIHRlbnNvcjIoaywgaiwgaSkpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNjgsOSArNjUsNyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3Rfc3dhcF9hc19sdmFsdWVfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpCi17Ci0KK3N0YXRpYyB2b2lkIHRlc3Rfc3dhcF9hc19sdmFsdWVfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gMjsKICAgSW5kZXhUeXBlIHNpemVEaW0yID0gMzsKICAgSW5kZXhUeXBlIHNpemVEaW0zID0gNzsKQEAgLTgxLDIxICs3NiwyMCBAQAogICBUZW5zb3I8RGF0YVR5cGUsIDMsIFJvd01ham9yLCBJbmRleFR5cGU+IHRlbnNvcjIodGVuc29yUm93UmFuZ2UpOwogICB0ZW5zb3IxLnNldFJhbmRvbSgpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YTEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3IxLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YTIgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3IyLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YTEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcjEuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGEyID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3IyLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgQ29sTWFqb3IsIEluZGV4VHlwZT4+IGdwdTEoZ3B1X2RhdGExLCB0ZW5zb3JDb2xSYW5nZSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIFJvd01ham9yLCBJbmRleFR5cGU+PiBncHUyKGdwdV9kYXRhMiwgdGVuc29yUm93UmFuZ2UpOwogCi0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YTEsIHRlbnNvcjEuZGF0YSgpLCh0ZW5zb3IxLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIGdwdTIuc3dhcF9sYXlvdXQoKS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdTE7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3IyLmRhdGEoKSwgZ3B1X2RhdGEyLCh0ZW5zb3IyLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YTEsIHRlbnNvcjEuZGF0YSgpLCAodGVuc29yMS5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIGdwdTIuc3dhcF9sYXlvdXQoKS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1MTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRlbnNvcjIuZGF0YSgpLCBncHVfZGF0YTIsICh0ZW5zb3IyLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAorICAvLyAgVGVuc29yPGZsb2F0LCAzLCBDb2xNYWpvcj4gdGVuc29yKDIsMyw3KTsKKyAgLy8gIHRlbnNvci5zZXRSYW5kb20oKTsKIAotLy8gIFRlbnNvcjxmbG9hdCwgMywgQ29sTWFqb3I+IHRlbnNvcigyLDMsNyk7Ci0vLyAgdGVuc29yLnNldFJhbmRvbSgpOwotCi0gIC8vVGVuc29yPGZsb2F0LCAzLCBSb3dNYWpvcj4gdGVuc29yMig3LDMsMik7Ci0vLyAgdGVuc29yMi5zd2FwX2xheW91dCgpID0gdGVuc29yOworICAvLyBUZW5zb3I8ZmxvYXQsIDMsIFJvd01ham9yPiB0ZW5zb3IyKDcsMywyKTsKKyAgLy8gIHRlbnNvcjIuc3dhcF9sYXlvdXQoKSA9IHRlbnNvcjsKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjEuZGltZW5zaW9uKDApLCB0ZW5zb3IyLmRpbWVuc2lvbigyKSk7CiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxLmRpbWVuc2lvbigxKSwgdGVuc29yMi5kaW1lbnNpb24oMSkpOwogICBWRVJJRllfSVNfRVFVQUwodGVuc29yMS5kaW1lbnNpb24oMiksIHRlbnNvcjIuZGltZW5zaW9uKDApKTsKQEAgLTEwMyw3ICs5Nyw3IEBACiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxKGksaixrKSwgdGVuc29yMihrLGosaSkpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yMShpLCBqLCBrKSwgdGVuc29yMihrLCBqLCBpKSk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0xMTEsMTYgKzEwNSwxNSBAQAogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9kYXRhMik7CiB9CiAKLQotdGVtcGxhdGU8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIGRldl9TZWxlY3Rvcj4gdm9pZCBzeWNsX3RlbnNvcl9sYXlvdXRfc3dhcF90ZXN0X3Blcl9kZXZpY2UoZGV2X1NlbGVjdG9yIHMpewordGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBkZXZfU2VsZWN0b3I+Cit2b2lkIHN5Y2xfdGVuc29yX2xheW91dF9zd2FwX3Rlc3RfcGVyX2RldmljZShkZXZfU2VsZWN0b3IgcykgewogICBRdWV1ZUludGVyZmFjZSBxdWV1ZUludGVyZmFjZShzKTsKICAgYXV0byBzeWNsX2RldmljZSA9IEVpZ2VuOjpTeWNsRGV2aWNlKCZxdWV1ZUludGVyZmFjZSk7CiAgIHRlc3Rfc2ltcGxlX3N3YXBfc3ljbDxEYXRhVHlwZSwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogICB0ZXN0X3N3YXBfYXNfbHZhbHVlX3N5Y2w8RGF0YVR5cGUsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKIH0KLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfbGF5b3V0X3N3YXBfc3ljbCkKLXsKLSAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOkVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2xheW91dF9zd2FwX3N5Y2wpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgewogICAgIENBTExfU1VCVEVTVChzeWNsX3RlbnNvcl9sYXlvdXRfc3dhcF90ZXN0X3Blcl9kZXZpY2U8aGFsZj4oZGV2aWNlKSk7CiAgICAgQ0FMTF9TVUJURVNUKHN5Y2xfdGVuc29yX2xheW91dF9zd2FwX3Rlc3RfcGVyX2RldmljZTxmbG9hdD4oZGV2aWNlKSk7CiAgIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2x2YWx1ZS5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9sdmFsdWUuY3BwCmluZGV4IDZiYTlhMjEuLmQ3MGM3ZTAgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX2x2YWx1ZS5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbHZhbHVlLmNwcApAQCAtMTEsMTUgKzExLDEzIEBACiAKICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CiAKLXVzaW5nIEVpZ2VuOjpUZW5zb3I7CiB1c2luZyBFaWdlbjo6Um93TWFqb3I7Cit1c2luZyBFaWdlbjo6VGVuc29yOwogCi0KLXN0YXRpYyB2b2lkIHRlc3RfY29tcG91bmRfYXNzaWdubWVudCgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgMz4gbWF0MSgyLDMsNyk7Ci0gIFRlbnNvcjxmbG9hdCwgMz4gbWF0MigyLDMsNyk7Ci0gIFRlbnNvcjxmbG9hdCwgMz4gbWF0MygyLDMsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X2NvbXBvdW5kX2Fzc2lnbm1lbnQoKSB7CisgIFRlbnNvcjxmbG9hdCwgMz4gbWF0MSgyLCAzLCA3KTsKKyAgVGVuc29yPGZsb2F0LCAzPiBtYXQyKDIsIDMsIDcpOworICBUZW5zb3I8ZmxvYXQsIDM+IG1hdDMoMiwgMywgNyk7CiAKICAgbWF0MS5zZXRSYW5kb20oKTsKICAgbWF0Mi5zZXRSYW5kb20oKTsKQEAgLTI5LDE0ICsyNywxMCBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG1hdDMoaSxqLGspLCBtYXQxKGksaixrKSArIG1hdDIoaSxqLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQzKGksIGosIGspLCBtYXQxKGksIGosIGspICsgbWF0MihpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9sdmFsdWUpCi17Ci0gIENBTExfU1VCVEVTVCh0ZXN0X2NvbXBvdW5kX2Fzc2lnbm1lbnQoKSk7Ci19CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX2x2YWx1ZSkgeyBDQUxMX1NVQlRFU1QodGVzdF9jb21wb3VuZF9hc3NpZ25tZW50KCkpOyB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9tYXAuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbWFwLmNwcAppbmRleCA0ZDRmNjg5Li4yNTE3NmY0IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9tYXAuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21hcC5jcHAKQEAgLTExLDExICsxMSwxMCBAQAogCiAjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgogCi11c2luZyBFaWdlbjo6VGVuc29yOwogdXNpbmcgRWlnZW46OlJvd01ham9yOwordXNpbmcgRWlnZW46OlRlbnNvcjsKIAotc3RhdGljIHZvaWQgdGVzdF8wZCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0XzBkKCkgewogICBUZW5zb3I8aW50LCAwPiBzY2FsYXIxOwogICBUZW5zb3I8aW50LCAwLCBSb3dNYWpvcj4gc2NhbGFyMjsKIApAQCAtMzIsMjAgKzMxLDI1IEBACiAgIFZFUklGWV9JU19FUVVBTChzY2FsYXI0KCksIDEzKTsKIH0KIAotc3RhdGljIHZvaWQgdGVzdF8xZCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0XzFkKCkgewogICBUZW5zb3I8aW50LCAxPiB2ZWMxKDYpOwogICBUZW5zb3I8aW50LCAxLCBSb3dNYWpvcj4gdmVjMig2KTsKIAogICBUZW5zb3JNYXA8Y29uc3QgVGVuc29yPGludCwgMT4gPiB2ZWMzKHZlYzEuZGF0YSgpLCA2KTsKICAgVGVuc29yTWFwPGNvbnN0IFRlbnNvcjxpbnQsIDEsIFJvd01ham9yPiA+IHZlYzQodmVjMi5kYXRhKCksIDYpOwogCi0gIHZlYzEoMCkgPSA0OyAgdmVjMigwKSA9IDA7Ci0gIHZlYzEoMSkgPSA4OyAgdmVjMigxKSA9IDE7Ci0gIHZlYzEoMikgPSAxNTsgdmVjMigyKSA9IDI7Ci0gIHZlYzEoMykgPSAxNjsgdmVjMigzKSA9IDM7Ci0gIHZlYzEoNCkgPSAyMzsgdmVjMig0KSA9IDQ7Ci0gIHZlYzEoNSkgPSA0MjsgdmVjMig1KSA9IDU7CisgIHZlYzEoMCkgPSA0OworICB2ZWMyKDApID0gMDsKKyAgdmVjMSgxKSA9IDg7CisgIHZlYzIoMSkgPSAxOworICB2ZWMxKDIpID0gMTU7CisgIHZlYzIoMikgPSAyOworICB2ZWMxKDMpID0gMTY7CisgIHZlYzIoMykgPSAzOworICB2ZWMxKDQpID0gMjM7CisgIHZlYzIoNCkgPSA0OworICB2ZWMxKDUpID0gNDI7CisgIHZlYzIoNSkgPSA1OwogCiAgIFZFUklGWV9JU19FUVVBTCh2ZWMxLnJhbmsoKSwgMSk7CiAgIFZFUklGWV9JU19FUVVBTCh2ZWMxLnNpemUoKSwgNik7CkBAIC02NiwyNCArNzAsMjMgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHZlYzQoNSksIDUpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0XzJkKCkKLXsKLSAgVGVuc29yPGludCwgMj4gbWF0MSgyLDMpOwotICBUZW5zb3I8aW50LCAyLCBSb3dNYWpvcj4gbWF0MigyLDMpOworc3RhdGljIHZvaWQgdGVzdF8yZCgpIHsKKyAgVGVuc29yPGludCwgMj4gbWF0MSgyLCAzKTsKKyAgVGVuc29yPGludCwgMiwgUm93TWFqb3I+IG1hdDIoMiwgMyk7CiAKLSAgbWF0MSgwLDApID0gMDsKLSAgbWF0MSgwLDEpID0gMTsKLSAgbWF0MSgwLDIpID0gMjsKLSAgbWF0MSgxLDApID0gMzsKLSAgbWF0MSgxLDEpID0gNDsKLSAgbWF0MSgxLDIpID0gNTsKKyAgbWF0MSgwLCAwKSA9IDA7CisgIG1hdDEoMCwgMSkgPSAxOworICBtYXQxKDAsIDIpID0gMjsKKyAgbWF0MSgxLCAwKSA9IDM7CisgIG1hdDEoMSwgMSkgPSA0OworICBtYXQxKDEsIDIpID0gNTsKIAotICBtYXQyKDAsMCkgPSAwOwotICBtYXQyKDAsMSkgPSAxOwotICBtYXQyKDAsMikgPSAyOwotICBtYXQyKDEsMCkgPSAzOwotICBtYXQyKDEsMSkgPSA0OwotICBtYXQyKDEsMikgPSA1OworICBtYXQyKDAsIDApID0gMDsKKyAgbWF0MigwLCAxKSA9IDE7CisgIG1hdDIoMCwgMikgPSAyOworICBtYXQyKDEsIDApID0gMzsKKyAgbWF0MigxLCAxKSA9IDQ7CisgIG1hdDIoMSwgMikgPSA1OwogCiAgIFRlbnNvck1hcDxjb25zdCBUZW5zb3I8aW50LCAyPiA+IG1hdDMobWF0MS5kYXRhKCksIDIsIDMpOwogICBUZW5zb3JNYXA8Y29uc3QgVGVuc29yPGludCwgMiwgUm93TWFqb3I+ID4gbWF0NChtYXQyLmRhdGEoKSwgMiwgMyk7CkBAIC05OCwzMiArMTAxLDMxIEBACiAgIFZFUklGWV9JU19FUVVBTChtYXQ0LmRpbWVuc2lvbigwKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTChtYXQ0LmRpbWVuc2lvbigxKSwgMyk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoMCwwKSwgMCk7Ci0gIFZFUklGWV9JU19FUVVBTChtYXQzKDAsMSksIDEpOwotICBWRVJJRllfSVNfRVFVQUwobWF0MygwLDIpLCAyKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoMSwwKSwgMyk7Ci0gIFZFUklGWV9JU19FUVVBTChtYXQzKDEsMSksIDQpOwotICBWRVJJRllfSVNfRVFVQUwobWF0MygxLDIpLCA1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoMCwgMCksIDApOworICBWRVJJRllfSVNfRVFVQUwobWF0MygwLCAxKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTChtYXQzKDAsIDIpLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoMSwgMCksIDMpOworICBWRVJJRllfSVNfRVFVQUwobWF0MygxLCAxKSwgNCk7CisgIFZFUklGWV9JU19FUVVBTChtYXQzKDEsIDIpLCA1KTsKIAotICBWRVJJRllfSVNfRVFVQUwobWF0NCgwLDApLCAwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoMCwxKSwgMSk7Ci0gIFZFUklGWV9JU19FUVVBTChtYXQ0KDAsMiksIDIpOwotICBWRVJJRllfSVNfRVFVQUwobWF0NCgxLDApLCAzKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoMSwxKSwgNCk7Ci0gIFZFUklGWV9JU19FUVVBTChtYXQ0KDEsMiksIDUpOworICBWRVJJRllfSVNfRVFVQUwobWF0NCgwLCAwKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTChtYXQ0KDAsIDEpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoMCwgMiksIDIpOworICBWRVJJRllfSVNfRVFVQUwobWF0NCgxLCAwKSwgMyk7CisgIFZFUklGWV9JU19FUVVBTChtYXQ0KDEsIDEpLCA0KTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoMSwgMiksIDUpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0XzNkKCkKLXsKLSAgVGVuc29yPGludCwgMz4gbWF0MSgyLDMsNyk7Ci0gIFRlbnNvcjxpbnQsIDMsIFJvd01ham9yPiBtYXQyKDIsMyw3KTsKK3N0YXRpYyB2b2lkIHRlc3RfM2QoKSB7CisgIFRlbnNvcjxpbnQsIDM+IG1hdDEoMiwgMywgNyk7CisgIFRlbnNvcjxpbnQsIDMsIFJvd01ham9yPiBtYXQyKDIsIDMsIDcpOwogCiAgIGludCB2YWwgPSAwOwogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBtYXQxKGksaixrKSA9IHZhbDsKLSAgICAgICAgbWF0MihpLGosaykgPSB2YWw7CisgICAgICAgIG1hdDEoaSwgaiwgaykgPSB2YWw7CisgICAgICAgIG1hdDIoaSwgaiwgaykgPSB2YWw7CiAgICAgICAgIHZhbCsrOwogICAgICAgfQogICAgIH0KQEAgLTEzMywxMyArMTM1LDEzIEBACiAgIFRlbnNvck1hcDxjb25zdCBUZW5zb3I8aW50LCAzLCBSb3dNYWpvcj4gPiBtYXQ0KG1hdDIuZGF0YSgpLCAyLCAzLCA3KTsKIAogICBWRVJJRllfSVNfRVFVQUwobWF0My5yYW5rKCksIDMpOwotICBWRVJJRllfSVNfRVFVQUwobWF0My5zaXplKCksIDIqMyo3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKG1hdDMuc2l6ZSgpLCAyICogMyAqIDcpOwogICBWRVJJRllfSVNfRVFVQUwobWF0My5kaW1lbnNpb24oMCksIDIpOwogICBWRVJJRllfSVNfRVFVQUwobWF0My5kaW1lbnNpb24oMSksIDMpOwogICBWRVJJRllfSVNfRVFVQUwobWF0My5kaW1lbnNpb24oMiksIDcpOwogCiAgIFZFUklGWV9JU19FUVVBTChtYXQ0LnJhbmsoKSwgMyk7Ci0gIFZFUklGWV9JU19FUVVBTChtYXQ0LnNpemUoKSwgMiozKjcpOworICBWRVJJRllfSVNfRVFVQUwobWF0NC5zaXplKCksIDIgKiAzICogNyk7CiAgIFZFUklGWV9JU19FUVVBTChtYXQ0LmRpbWVuc2lvbigwKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTChtYXQ0LmRpbWVuc2lvbigxKSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTChtYXQ0LmRpbWVuc2lvbigyKSwgNyk7CkBAIC0xNDgsMjYgKzE1MCwyNCBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwobWF0MyhpLGosayksIHZhbCk7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChtYXQ0KGksaixrKSwgdmFsKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1hdDMoaSwgaiwgayksIHZhbCk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChtYXQ0KGksIGosIGspLCB2YWwpOwogICAgICAgICB2YWwrKzsKICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotCi1zdGF0aWMgdm9pZCB0ZXN0X2Zyb21fdGVuc29yKCkKLXsKLSAgVGVuc29yPGludCwgMz4gbWF0MSgyLDMsNyk7Ci0gIFRlbnNvcjxpbnQsIDMsIFJvd01ham9yPiBtYXQyKDIsMyw3KTsKK3N0YXRpYyB2b2lkIHRlc3RfZnJvbV90ZW5zb3IoKSB7CisgIFRlbnNvcjxpbnQsIDM+IG1hdDEoMiwgMywgNyk7CisgIFRlbnNvcjxpbnQsIDMsIFJvd01ham9yPiBtYXQyKDIsIDMsIDcpOwogCiAgIGludCB2YWwgPSAwOwogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBtYXQxKGksaixrKSA9IHZhbDsKLSAgICAgICAgbWF0MihpLGosaykgPSB2YWw7CisgICAgICAgIG1hdDEoaSwgaiwgaykgPSB2YWw7CisgICAgICAgIG1hdDIoaSwgaiwgaykgPSB2YWw7CiAgICAgICAgIHZhbCsrOwogICAgICAgfQogICAgIH0KQEAgLTE3NywxMyArMTc3LDEzIEBACiAgIFRlbnNvck1hcDxUZW5zb3I8aW50LCAzLCBSb3dNYWpvcj4gPiBtYXQ0KG1hdDIpOwogCiAgIFZFUklGWV9JU19FUVVBTChtYXQzLnJhbmsoKSwgMyk7Ci0gIFZFUklGWV9JU19FUVVBTChtYXQzLnNpemUoKSwgMiozKjcpOworICBWRVJJRllfSVNfRVFVQUwobWF0My5zaXplKCksIDIgKiAzICogNyk7CiAgIFZFUklGWV9JU19FUVVBTChtYXQzLmRpbWVuc2lvbigwKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTChtYXQzLmRpbWVuc2lvbigxKSwgMyk7CiAgIFZFUklGWV9JU19FUVVBTChtYXQzLmRpbWVuc2lvbigyKSwgNyk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKG1hdDQucmFuaygpLCAzKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDQuc2l6ZSgpLCAyKjMqNyk7CisgIFZFUklGWV9JU19FUVVBTChtYXQ0LnNpemUoKSwgMiAqIDMgKiA3KTsKICAgVkVSSUZZX0lTX0VRVUFMKG1hdDQuZGltZW5zaW9uKDApLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKG1hdDQuZGltZW5zaW9uKDEpLCAzKTsKICAgVkVSSUZZX0lTX0VRVUFMKG1hdDQuZGltZW5zaW9uKDIpLCA3KTsKQEAgLTE5MiwxNCArMTkyLDE0IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChtYXQzKGksaixrKSwgdmFsKTsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoaSxqLGspLCB2YWwpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwobWF0MyhpLCBqLCBrKSwgdmFsKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1hdDQoaSwgaiwgayksIHZhbCk7CiAgICAgICAgIHZhbCsrOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIFRlbnNvckZpeGVkU2l6ZTxpbnQsIFNpemVzPDIsMyw3PiA+IG1hdDU7CisgIFRlbnNvckZpeGVkU2l6ZTxpbnQsIFNpemVzPDIsIDMsIDc+ID4gbWF0NTsKIAogICB2YWwgPSAwOwogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewpAQCAtMjE1LDEwICsyMTUsMTAgQEAKICAgICB9CiAgIH0KIAotICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPGludCwgU2l6ZXM8MiwzLDc+ID4gPiBtYXQ2KG1hdDUpOworICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPGludCwgU2l6ZXM8MiwgMywgNz4gPiA+IG1hdDYobWF0NSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKG1hdDYucmFuaygpLCAzKTsKLSAgVkVSSUZZX0lTX0VRVUFMKG1hdDYuc2l6ZSgpLCAyKjMqNyk7CisgIFZFUklGWV9JU19FUVVBTChtYXQ2LnNpemUoKSwgMiAqIDMgKiA3KTsKICAgVkVSSUZZX0lTX0VRVUFMKG1hdDYuZGltZW5zaW9uKDApLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKG1hdDYuZGltZW5zaW9uKDEpLCAzKTsKICAgVkVSSUZZX0lTX0VRVUFMKG1hdDYuZGltZW5zaW9uKDIpLCA3KTsKQEAgLTIyNywxNCArMjI3LDEzIEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChtYXQ2KGksaixrKSwgdmFsKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKG1hdDYoaSwgaiwgayksIHZhbCk7CiAgICAgICAgIHZhbCsrOwogICAgICAgfQogICAgIH0KICAgfQogfQogCi0KIHN0YXRpYyBpbnQgZihjb25zdCBUZW5zb3JNYXA8VGVuc29yPGludCwgMz4gPiYgdGVuc29yKSB7CiAgIC8vICBTaXplPDA+IGVtcHR5OwogICBFSUdFTl9TVEFUSUNfQVNTRVJUKChpbnRlcm5hbDo6YXJyYXlfc2l6ZTxTaXplczw+ID46OnZhbHVlID09IDApLCBZT1VfTUFERV9BX1BST0dSQU1NSU5HX01JU1RBS0UpOwpAQCAtMjQzLDE1ICsyNDIsMTQgQEAKICAgcmV0dXJuIHJlc3VsdCgpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X2Nhc3RpbmcoKQotewotICBUZW5zb3I8aW50LCAzPiB0ZW5zb3IoMiwzLDcpOworc3RhdGljIHZvaWQgdGVzdF9jYXN0aW5nKCkgeworICBUZW5zb3I8aW50LCAzPiB0ZW5zb3IoMiwgMywgNyk7CiAKICAgaW50IHZhbCA9IDA7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIHRlbnNvcihpLGosaykgPSB2YWw7CisgICAgICAgIHRlbnNvcihpLCBqLCBrKSA9IHZhbDsKICAgICAgICAgdmFsKys7CiAgICAgICB9CiAgICAgfQpAQCAtMjY1LDEzICsyNjMsMTIgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHN1bTEsIDg2MSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0YXRpYyBjb25zdCBUJiBhZGRfY29uc3QoVCYgdmFsdWUpIHsKICAgcmV0dXJuIHZhbHVlOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0XzBkX2NvbnN0X3RlbnNvcigpCi17CitzdGF0aWMgdm9pZCB0ZXN0XzBkX2NvbnN0X3RlbnNvcigpIHsKICAgVGVuc29yPGludCwgMD4gc2NhbGFyMTsKICAgVGVuc29yPGludCwgMCwgUm93TWFqb3I+IHNjYWxhcjI7CiAKQEAgLTI4OCw4ICsyODUsNyBAQAogICBWRVJJRllfSVNfRVFVQUwoc2NhbGFyNCgpLCAxMyk7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfMGRfY29uc3RfdGVuc29yX21hcCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0XzBkX2NvbnN0X3RlbnNvcl9tYXAoKSB7CiAgIFRlbnNvcjxpbnQsIDA+IHNjYWxhcjE7CiAgIFRlbnNvcjxpbnQsIDAsIFJvd01ham9yPiBzY2FsYXIyOwogCkBAIC0zMTIsOCArMzA4LDcgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHNjYWxhcjIoKSwgMTQpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX21hcCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfbWFwKSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0XzBkKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF8xZCgpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfMmQoKSk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9tYXRoLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21hdGguY3BwCmluZGV4IDgyYTFhMjYuLjgxODRiODggMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21hdGguY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21hdGguY3BwCkBAIC0xMSwxMSArMTEsMTAgQEAKIAogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KIAotdXNpbmcgRWlnZW46OlRlbnNvcjsKIHVzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKLXN0YXRpYyB2b2lkIHRlc3RfdGFuaCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X3RhbmgoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMT4gdmVjMSg2KTsKICAgdmVjMS5zZXRSYW5kb20oKTsKIApAQCAtMjYsOCArMjUsNyBAQAogICB9CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3Rfc2lnbW9pZCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X3NpZ21vaWQoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMT4gdmVjMSg2KTsKICAgdmVjMS5zZXRSYW5kb20oKTsKIApAQCAtMzgsOSArMzYsNyBAQAogICB9CiB9CiAKLQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9tYXRoKQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9tYXRoKSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3RhbmgoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3NpZ21vaWQoKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9tYXRoX3N5Y2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbWF0aF9zeWNsLmNwcAppbmRleCA4NGQ2MzhlLi43MTUyYTU4IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9tYXRoX3N5Y2wuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21hdGhfc3ljbC5jcHAKQEAgLTI1LDEyICsyNSwxMCBAQAogdXNpbmcgRWlnZW46OlRlbnNvcjsKIHVzaW5nIEVpZ2VuOjpUZW5zb3JNYXA7CiAKLXVzaW5nIEVpZ2VuOjpUZW5zb3I7CiB1c2luZyBFaWdlbjo6Um93TWFqb3I7Cit1c2luZyBFaWdlbjo6VGVuc29yOwogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF90YW5oX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKQotewotCitzdGF0aWMgdm9pZCB0ZXN0X3Rhbmhfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gNDsKICAgSW5kZXhUeXBlIHNpemVEaW0yID0gNDsKICAgSW5kZXhUeXBlIHNpemVEaW0zID0gMTsKQEAgLTQxLDI2ICszOSwyNCBAQAogCiAgIGluID0gaW4ucmFuZG9tKCk7CiAKLSAgRGF0YVR5cGUqIGdwdV9kYXRhMSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YTIgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhMSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4uc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGEyID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogCiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTEoZ3B1X2RhdGExLCB0ZW5zb3JSYW5nZSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTIoZ3B1X2RhdGEyLCB0ZW5zb3JSYW5nZSk7CiAKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhMSwgaW4uZGF0YSgpLChpbi5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCBpbi5kYXRhKCksIChpbi5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIGdwdTIuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdTEudGFuaCgpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X2RhdGEyLChvdXQuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9kYXRhMiwgKG91dC5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAKLSAgb3V0X2NwdT1pbi50YW5oKCk7CisgIG91dF9jcHUgPSBpbi50YW5oKCk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbi5zaXplKCk7ICsraSkgewogICAgIFZFUklGWV9JU19BUFBST1gob3V0KGkpLCBvdXRfY3B1KGkpKTsKICAgfQogfQogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9zaWdtb2lkX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKQotewotCitzdGF0aWMgdm9pZCB0ZXN0X3NpZ21vaWRfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gNDsKICAgSW5kZXhUeXBlIHNpemVEaW0yID0gNDsKICAgSW5kZXhUeXBlIHNpemVEaW0zID0gMTsKQEAgLTcxLDI1ICs2NywyNSBAQAogCiAgIGluID0gaW4ucmFuZG9tKCk7CiAKLSAgRGF0YVR5cGUqIGdwdV9kYXRhMSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YTIgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhMSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4uc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGEyID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogCiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTEoZ3B1X2RhdGExLCB0ZW5zb3JSYW5nZSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTIoZ3B1X2RhdGEyLCB0ZW5zb3JSYW5nZSk7CiAKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhMSwgaW4uZGF0YSgpLChpbi5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCBpbi5kYXRhKCksIChpbi5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIGdwdTIuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdTEuc2lnbW9pZCgpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X2RhdGEyLChvdXQuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9kYXRhMiwgKG91dC5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAKLSAgb3V0X2NwdT1pbi5zaWdtb2lkKCk7CisgIG91dF9jcHUgPSBpbi5zaWdtb2lkKCk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbi5zaXplKCk7ICsraSkgewogICAgIFZFUklGWV9JU19BUFBST1gob3V0KGkpLCBvdXRfY3B1KGkpKTsKICAgfQogfQogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBkZXZfU2VsZWN0b3I+IHZvaWQgc3ljbF9jb21wdXRpbmdfdGVzdF9wZXJfZGV2aWNlKGRldl9TZWxlY3RvciBzKXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgZGV2X1NlbGVjdG9yPgordm9pZCBzeWNsX2NvbXB1dGluZ190ZXN0X3Blcl9kZXZpY2UoZGV2X1NlbGVjdG9yIHMpIHsKICAgUXVldWVJbnRlcmZhY2UgcXVldWVJbnRlcmZhY2Uocyk7CiAgIGF1dG8gc3ljbF9kZXZpY2UgPSBFaWdlbjo6U3ljbERldmljZSgmcXVldWVJbnRlcmZhY2UpOwogICB0ZXN0X3Rhbmhfc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKQEAgLTk5LDcgKzk1LDcgQEAKIH0KIAogRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9tYXRoX3N5Y2wpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOkVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CisgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogRWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKICAgICBDQUxMX1NVQlRFU1Qoc3ljbF9jb21wdXRpbmdfdGVzdF9wZXJfZGV2aWNlPGhhbGY+KGRldmljZSkpOwogICAgIENBTExfU1VCVEVTVChzeWNsX2NvbXB1dGluZ190ZXN0X3Blcl9kZXZpY2U8ZmxvYXQ+KGRldmljZSkpOwogICB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9taXhlZF9pbmRpY2VzLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21peGVkX2luZGljZXMuY3BwCmluZGV4IGVlMjYxNmYuLmJlNmM0ODYgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21peGVkX2luZGljZXMuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21peGVkX2luZGljZXMuY3BwCkBAIC0xMSwxOCArMTEsMjIgQEAKIAogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KIAotCi1zdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZSgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZSgpIHsKICAgVGVuc29yPGZsb2F0LCAxLCBDb2xNYWpvcj4gdmVjMSg2KTsKICAgVGVuc29yPGZsb2F0LCAxLCBDb2xNYWpvciwgaW50PiB2ZWMyKDYpOwogCi0gIHZlYzEoMCkgPSA0LjA7ICB2ZWMyKDApID0gMC4wOwotICB2ZWMxKDEpID0gOC4wOyAgdmVjMigxKSA9IDEuMDsKLSAgdmVjMSgyKSA9IDE1LjA7IHZlYzIoMikgPSAyLjA7Ci0gIHZlYzEoMykgPSAxNi4wOyB2ZWMyKDMpID0gMy4wOwotICB2ZWMxKDQpID0gMjMuMDsgdmVjMig0KSA9IDQuMDsKLSAgdmVjMSg1KSA9IDQyLjA7IHZlYzIoNSkgPSA1LjA7CisgIHZlYzEoMCkgPSA0LjA7CisgIHZlYzIoMCkgPSAwLjA7CisgIHZlYzEoMSkgPSA4LjA7CisgIHZlYzIoMSkgPSAxLjA7CisgIHZlYzEoMikgPSAxNS4wOworICB2ZWMyKDIpID0gMi4wOworICB2ZWMxKDMpID0gMTYuMDsKKyAgdmVjMigzKSA9IDMuMDsKKyAgdmVjMSg0KSA9IDIzLjA7CisgIHZlYzIoNCkgPSA0LjA7CisgIHZlYzEoNSkgPSA0Mi4wOworICB2ZWMyKDUpID0gNS4wOwogCiAgIGZsb2F0IGRhdGEzWzZdOwogICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCAxLCBDb2xNYWpvcj4+IHZlYzMoZGF0YTMsIDYpOwpAQCAtNDYsOCArNTAsNCBAQAogICBWRVJJRllfSVNfQVBQUk9YKHZlYzQoNSksIDUuMGYgKiA1LjBmKTsKIH0KIAotCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX21peGVkX2luZGljZXMpCi17Ci0gIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZSgpKTsKLX0KK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfbWl4ZWRfaW5kaWNlcykgeyBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGUoKSk7IH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21vcnBoaW5nLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21vcnBoaW5nLmNwcAppbmRleCBkMDM5YTdlLi4wNjcyNTcyIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9tb3JwaGluZy5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbW9ycGhpbmcuY3BwCkBAIC0xMywyOSArMTMsMjggQEAKIAogdXNpbmcgRWlnZW46OlRlbnNvcjsKIAotdGVtcGxhdGU8dHlwZW5hbWU+Ci1zdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9yZXNoYXBlKCkKLXsKLSAgVGVuc29yPGZsb2F0LCA1PiB0ZW5zb3IxKDIsMywxLDcsMSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9yZXNoYXBlKCkgeworICBUZW5zb3I8ZmxvYXQsIDU+IHRlbnNvcjEoMiwgMywgMSwgNywgMSk7CiAgIHRlbnNvcjEuc2V0UmFuZG9tKCk7CiAKLSAgVGVuc29yPGZsb2F0LCAzPiB0ZW5zb3IyKDIsMyw3KTsKLSAgVGVuc29yPGZsb2F0LCAyPiB0ZW5zb3IzKDYsNyk7Ci0gIFRlbnNvcjxmbG9hdCwgMj4gdGVuc29yNCgyLDIxKTsKKyAgVGVuc29yPGZsb2F0LCAzPiB0ZW5zb3IyKDIsIDMsIDcpOworICBUZW5zb3I8ZmxvYXQsIDI+IHRlbnNvcjMoNiwgNyk7CisgIFRlbnNvcjxmbG9hdCwgMj4gdGVuc29yNCgyLCAyMSk7CiAKLSAgVGVuc29yPGZsb2F0LCAzPjo6RGltZW5zaW9ucyBkaW0xKDIsMyw3KTsKKyAgVGVuc29yPGZsb2F0LCAzPjo6RGltZW5zaW9ucyBkaW0xKDIsIDMsIDcpOwogICB0ZW5zb3IyID0gdGVuc29yMS5yZXNoYXBlKGRpbTEpOwotICBUZW5zb3I8ZmxvYXQsIDI+OjpEaW1lbnNpb25zIGRpbTIoNiw3KTsKKyAgVGVuc29yPGZsb2F0LCAyPjo6RGltZW5zaW9ucyBkaW0yKDYsIDcpOwogICB0ZW5zb3IzID0gdGVuc29yMS5yZXNoYXBlKGRpbTIpOwotICBUZW5zb3I8ZmxvYXQsIDI+OjpEaW1lbnNpb25zIGRpbTMoMiwyMSk7CisgIFRlbnNvcjxmbG9hdCwgMj46OkRpbWVuc2lvbnMgZGltMygyLCAyMSk7CiAgIHRlbnNvcjQgPSB0ZW5zb3IxLnJlc2hhcGUoZGltMSkucmVzaGFwZShkaW0zKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yMShpLGosMCxrLDApLCB0ZW5zb3IyKGksaixrKSk7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxKGksaiwwLGssMCksIHRlbnNvcjMoaSsyKmosaykpOwotICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yMShpLGosMCxrLDApLCB0ZW5zb3I0KGksaiszKmspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjEoaSwgaiwgMCwgaywgMCksIHRlbnNvcjIoaSwgaiwgaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yMShpLCBqLCAwLCBrLCAwKSwgdGVuc29yMyhpICsgMiAqIGosIGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjEoaSwgaiwgMCwgaywgMCksIHRlbnNvcjQoaSwgaiArIDMgKiBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC01MCw3ICs0OSw3IEBACiAKICAgLy8gTmV3IGRpbWVuc2lvbnM6IFsyLCAzLCA3XQogICBFaWdlbjo6SW5kZXhMaXN0PHR5cGUyaW5kZXg8Mj4sIHR5cGUyaW5kZXg8Mz4sIHR5cGUyaW5kZXg8Nz4+IGRpbTsKLSAgVGVuc29yPGZsb2F0LCAzPiByZXNoYXBlZCA9IHRlbnNvci5yZXNoYXBlKHN0YXRpY19jYXN0PEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LDM+PihkaW0pKTsKKyAgVGVuc29yPGZsb2F0LCAzPiByZXNoYXBlZCA9IHRlbnNvci5yZXNoYXBlKHN0YXRpY19jYXN0PEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPj4oZGltKSk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewpAQCAtNjMsOTQgKzYyLDkxIEBACiAKIHRlbXBsYXRlIDx0eXBlbmFtZT4KIHN0YXRpYyB2b2lkIHRlc3RfcmVzaGFwZV9pbl9leHByKCkgewotICBNYXRyaXhYZiBtMSgyLDMqNSo3KjExKTsKLSAgTWF0cml4WGYgbTIoMyo1KjcqMTEsMTMpOworICBNYXRyaXhYZiBtMSgyLCAzICogNSAqIDcgKiAxMSk7CisgIE1hdHJpeFhmIG0yKDMgKiA1ICogNyAqIDExLCAxMyk7CiAgIG0xLnNldFJhbmRvbSgpOwogICBtMi5zZXRSYW5kb20oKTsKICAgTWF0cml4WGYgbTMgPSBtMSAqIG0yOwogCi0gIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDU+PiB0ZW5zb3IxKG0xLmRhdGEoKSwgMiwzLDUsNywxMSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDU+PiB0ZW5zb3IyKG0yLmRhdGEoKSwgMyw1LDcsMTEsMTMpOwotICBUZW5zb3I8ZmxvYXQsIDI+OjpEaW1lbnNpb25zIG5ld0RpbXMxKDIsMyo1KjcqMTEpOwotICBUZW5zb3I8ZmxvYXQsIDI+OjpEaW1lbnNpb25zIG5ld0RpbXMyKDMqNSo3KjExLDEzKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxmbG9hdCwgNT4+IHRlbnNvcjEobTEuZGF0YSgpLCAyLCAzLCA1LCA3LCAxMSk7CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDU+PiB0ZW5zb3IyKG0yLmRhdGEoKSwgMywgNSwgNywgMTEsIDEzKTsKKyAgVGVuc29yPGZsb2F0LCAyPjo6RGltZW5zaW9ucyBuZXdEaW1zMSgyLCAzICogNSAqIDcgKiAxMSk7CisgIFRlbnNvcjxmbG9hdCwgMj46OkRpbWVuc2lvbnMgbmV3RGltczIoMyAqIDUgKiA3ICogMTEsIDEzKTsKICAgdHlwZWRlZiBUZW5zb3I8ZmxvYXQsIDE+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CiAgIGFycmF5PERpbVBhaXIsIDE+IGNvbnRyYWN0X2Fsb25ne3tEaW1QYWlyKDEsIDApfX07Ci0gIFRlbnNvcjxmbG9hdCwgMj4gdGVuc29yMygyLDEzKTsKKyAgVGVuc29yPGZsb2F0LCAyPiB0ZW5zb3IzKDIsIDEzKTsKICAgdGVuc29yMyA9IHRlbnNvcjEucmVzaGFwZShuZXdEaW1zMSkuY29udHJhY3QodGVuc29yMi5yZXNoYXBlKG5ld0RpbXMyKSwgY29udHJhY3RfYWxvbmcpOwogCiAgIE1hcDxNYXRyaXhYZj4gcmVzKHRlbnNvcjMuZGF0YSgpLCAyLCAxMyk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMzsgKytqKSB7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKHJlcyhpLGopLCBtMyhpLGopKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gocmVzKGksIGopLCBtMyhpLCBqKSk7CiAgICAgfQogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lPgotc3RhdGljIHZvaWQgdGVzdF9yZXNoYXBlX2FzX2x2YWx1ZSgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgMz4gdGVuc29yKDIsMyw3KTsKK3RlbXBsYXRlIDx0eXBlbmFtZT4KK3N0YXRpYyB2b2lkIHRlc3RfcmVzaGFwZV9hc19sdmFsdWUoKSB7CisgIFRlbnNvcjxmbG9hdCwgMz4gdGVuc29yKDIsIDMsIDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAKLSAgVGVuc29yPGZsb2F0LCAyPiB0ZW5zb3IyZCg2LDcpOwotICBUZW5zb3I8ZmxvYXQsIDM+OjpEaW1lbnNpb25zIGRpbSgyLDMsNyk7CisgIFRlbnNvcjxmbG9hdCwgMj4gdGVuc29yMmQoNiwgNyk7CisgIFRlbnNvcjxmbG9hdCwgMz46OkRpbWVuc2lvbnMgZGltKDIsIDMsIDcpOwogICB0ZW5zb3IyZC5yZXNoYXBlKGRpbSkgPSB0ZW5zb3I7CiAKLSAgZmxvYXQgc2NyYXRjaFsyKjMqMSo3KjFdOwotICBUZW5zb3JNYXA8VGVuc29yPGZsb2F0LCA1Pj4gdGVuc29yNWQoc2NyYXRjaCwgMiwzLDEsNywxKTsKKyAgZmxvYXQgc2NyYXRjaFsyICogMyAqIDEgKiA3ICogMV07CisgIFRlbnNvck1hcDxUZW5zb3I8ZmxvYXQsIDU+PiB0ZW5zb3I1ZChzY3JhdGNoLCAyLCAzLCAxLCA3LCAxKTsKICAgdGVuc29yNWQucmVzaGFwZShkaW0pLmRldmljZShFaWdlbjo6RGVmYXVsdERldmljZSgpKSA9IHRlbnNvcjsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yMmQoaSsyKmosayksIHRlbnNvcihpLGosaykpOwotICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yNWQoaSxqLDAsaywwKSwgdGVuc29yKGksaixrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IyZChpICsgMiAqIGosIGspLCB0ZW5zb3IoaSwgaiwgaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yNWQoaSwgaiwgMCwgaywgMCksIHRlbnNvcihpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfc2xpY2UoKQotewotICBUZW5zb3I8VCwgNSwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcsMTEpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfc2xpY2UoKSB7CisgIFRlbnNvcjxULCA1LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgNSwgNywgMTEpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAKLSAgVGVuc29yPFQsIDUsIERhdGFMYXlvdXQ+IHNsaWNlMSgxLDEsMSwxLDEpOwotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgNT4gaW5kaWNlcygxLDIsMyw0LDUpOwotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgNT4gc2l6ZXMoMSwxLDEsMSwxKTsKKyAgVGVuc29yPFQsIDUsIERhdGFMYXlvdXQ+IHNsaWNlMSgxLCAxLCAxLCAxLCAxKTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDU+IGluZGljZXMoMSwgMiwgMywgNCwgNSk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA1PiBzaXplcygxLCAxLCAxLCAxLCAxKTsKICAgc2xpY2UxID0gdGVuc29yLnNsaWNlKGluZGljZXMsIHNpemVzKTsKLSAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMSgwLDAsMCwwLDApLCB0ZW5zb3IoMSwyLDMsNCw1KSk7CisgIFZFUklGWV9JU19FUVVBTChzbGljZTEoMCwgMCwgMCwgMCwgMCksIHRlbnNvcigxLCAyLCAzLCA0LCA1KSk7CiAKLSAgVGVuc29yPFQsIDUsIERhdGFMYXlvdXQ+IHNsaWNlMigxLDEsMiwyLDMpOwotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgNT4gaW5kaWNlczIoMSwxLDMsNCw1KTsKLSAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDU+IHNpemVzMigxLDEsMiwyLDMpOworICBUZW5zb3I8VCwgNSwgRGF0YUxheW91dD4gc2xpY2UyKDEsIDEsIDIsIDIsIDMpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgNT4gaW5kaWNlczIoMSwgMSwgMywgNCwgNSk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA1PiBzaXplczIoMSwgMSwgMiwgMiwgMyk7CiAgIHNsaWNlMiA9IHRlbnNvci5zbGljZShpbmRpY2VzMiwgc2l6ZXMyKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMigwLDAsaSxqLGspLCB0ZW5zb3IoMSwxLDMraSw0K2osNStrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZTIoMCwgMCwgaSwgaiwgayksIHRlbnNvcigxLCAxLCAzICsgaSwgNCArIGosIDUgKyBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2NvbnN0X3NsaWNlKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgdGVzdF9jb25zdF9zbGljZSgpIHsKICAgY29uc3QgVCBiWzFdID0gezQyfTsKLSAgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBULCAxPiA+IG0oYiwgMSk7CisgIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgVCwgMT4+IG0oYiwgMSk7CiAgIERTaXplczxEZW5zZUluZGV4LCAxPiBvZmZzZXRzOwogICBvZmZzZXRzWzBdID0gMDsKLSAgVGVuc29yUmVmPFRlbnNvcjxjb25zdCBULCAxPiA+IHNsaWNlX3JlZihtLnNsaWNlKG9mZnNldHMsIG0uZGltZW5zaW9ucygpKSk7CisgIFRlbnNvclJlZjxUZW5zb3I8Y29uc3QgVCwgMT4+IHNsaWNlX3JlZihtLnNsaWNlKG9mZnNldHMsIG0uZGltZW5zaW9ucygpKSk7CiAgIFZFUklGWV9JU19FUVVBTChzbGljZV9yZWYoMCksIDQyKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IERhdGFMYXlvdXQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IERhdGFMYXlvdXQ+CiBzdGF0aWMgdm9pZCB0ZXN0X3NsaWNlX2luX2V4cHIoKSB7CiAgIHR5cGVkZWYgTWF0cml4PFQsIER5bmFtaWMsIER5bmFtaWMsIERhdGFMYXlvdXQ+IE10eDsKLSAgTXR4IG0xKDcsNyk7Ci0gIE10eCBtMigzLDMpOworICBNdHggbTEoNywgNyk7CisgIE10eCBtMigzLCAzKTsKICAgbTEuc2V0UmFuZG9tKCk7CiAgIG0yLnNldFJhbmRvbSgpOwogCkBAIC0xNTgsMTQ4ICsxNTQsMTQ3IEBACiAKICAgVGVuc29yTWFwPFRlbnNvcjxULCAyLCBEYXRhTGF5b3V0Pj4gdGVuc29yMShtMS5kYXRhKCksIDcsIDcpOwogICBUZW5zb3JNYXA8VGVuc29yPFQsIDIsIERhdGFMYXlvdXQ+PiB0ZW5zb3IyKG0yLmRhdGEoKSwgMywgMyk7Ci0gIFRlbnNvcjxULCAyLCBEYXRhTGF5b3V0PiB0ZW5zb3IzKDMsMSk7CisgIFRlbnNvcjxULCAyLCBEYXRhTGF5b3V0PiB0ZW5zb3IzKDMsIDEpOwogICB0eXBlZGVmIHR5cGVuYW1lIFRlbnNvcjxULCAxPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOwogICBhcnJheTxEaW1QYWlyLCAxPiBjb250cmFjdF9hbG9uZ3t7RGltUGFpcigxLCAwKX19OwogCi0gIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAyPiBpbmRpY2VzMSgxLDIpOwotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMj4gc2l6ZXMxKDMsMyk7Ci0gIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAyPiBpbmRpY2VzMigwLDIpOwotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMj4gc2l6ZXMyKDMsMSk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAyPiBpbmRpY2VzMSgxLCAyKTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDI+IHNpemVzMSgzLCAzKTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDI+IGluZGljZXMyKDAsIDIpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMj4gc2l6ZXMyKDMsIDEpOwogICB0ZW5zb3IzID0gdGVuc29yMS5zbGljZShpbmRpY2VzMSwgc2l6ZXMxKS5jb250cmFjdCh0ZW5zb3IyLnNsaWNlKGluZGljZXMyLCBzaXplczIpLCBjb250cmFjdF9hbG9uZyk7CiAKICAgTWFwPE10eD4gcmVzKHRlbnNvcjMuZGF0YSgpLCAzLCAxKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDE7ICsraikgewotICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZXMoaSxqKSwgbTMoaSxqKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHJlcyhpLCBqKSwgbTMoaSwgaikpOwogICAgIH0KICAgfQogCiAgIC8vIFRha2UgYW4gYXJiaXRyYXJ5IHNsaWNlIG9mIGFuIGFyYml0cmFyaWx5IHNpemVkIHRlbnNvci4KICAgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBULCAyLCBEYXRhTGF5b3V0Pj4gdGVuc29yNChtMS5kYXRhKCksIDcsIDcpOwotICBUZW5zb3I8VCwgMSwgRGF0YUxheW91dD4gdGVuc29yNiA9IHRlbnNvcjQucmVzaGFwZShEU2l6ZXM8cHRyZGlmZl90LCAxPig3KjcpKS5leHAoKS5zbGljZShEU2l6ZXM8cHRyZGlmZl90LCAxPigwKSwgRFNpemVzPHB0cmRpZmZfdCwgMT4oMzUpKTsKKyAgVGVuc29yPFQsIDEsIERhdGFMYXlvdXQ+IHRlbnNvcjYgPQorICAgICAgdGVuc29yNC5yZXNoYXBlKERTaXplczxwdHJkaWZmX3QsIDE+KDcgKiA3KSkuZXhwKCkuc2xpY2UoRFNpemVzPHB0cmRpZmZfdCwgMT4oMCksIERTaXplczxwdHJkaWZmX3QsIDE+KDM1KSk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzU7ICsraSkgewogICAgIFZFUklGWV9JU19BUFBST1godGVuc29yNihpKSwgZXhwZih0ZW5zb3I0LmRhdGEoKVtpXSkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9zbGljZV9hc19sdmFsdWUoKQotewotICBUZW5zb3I8VCwgMywgRGF0YUxheW91dD4gdGVuc29yMSgyLDIsNyk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3NsaWNlX2FzX2x2YWx1ZSgpIHsKKyAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcjEoMiwgMiwgNyk7CiAgIHRlbnNvcjEuc2V0UmFuZG9tKCk7Ci0gIFRlbnNvcjxULCAzLCBEYXRhTGF5b3V0PiB0ZW5zb3IyKDIsMiw3KTsKKyAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcjIoMiwgMiwgNyk7CiAgIHRlbnNvcjIuc2V0UmFuZG9tKCk7Ci0gIFRlbnNvcjxULCAzLCBEYXRhTGF5b3V0PiB0ZW5zb3IzKDQsMyw1KTsKKyAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcjMoNCwgMywgNSk7CiAgIHRlbnNvcjMuc2V0UmFuZG9tKCk7Ci0gIFRlbnNvcjxULCAzLCBEYXRhTGF5b3V0PiB0ZW5zb3I0KDQsMywyKTsKKyAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcjQoNCwgMywgMik7CiAgIHRlbnNvcjQuc2V0UmFuZG9tKCk7Ci0gIFRlbnNvcjxULCAzLCBEYXRhTGF5b3V0PiB0ZW5zb3I1KDEwLDEzLDEyKTsKKyAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcjUoMTAsIDEzLCAxMik7CiAgIHRlbnNvcjUuc2V0UmFuZG9tKCk7CiAKLSAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHJlc3VsdCg0LDUsNyk7Ci0gIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBzaXplczEyKDIsMiw3KTsKLSAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IGZpcnN0X3NsaWNlKDAsMCwwKTsKKyAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHJlc3VsdCg0LCA1LCA3KTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IHNpemVzMTIoMiwgMiwgNyk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBmaXJzdF9zbGljZSgwLCAwLCAwKTsKICAgcmVzdWx0LnNsaWNlKGZpcnN0X3NsaWNlLCBzaXplczEyKSA9IHRlbnNvcjE7Ci0gIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBzZWNvbmRfc2xpY2UoMiwwLDApOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gc2Vjb25kX3NsaWNlKDIsIDAsIDApOwogICByZXN1bHQuc2xpY2Uoc2Vjb25kX3NsaWNlLCBzaXplczEyKS5kZXZpY2UoRWlnZW46OkRlZmF1bHREZXZpY2UoKSkgPSB0ZW5zb3IyOwogCi0gIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBzaXplczMoNCwzLDUpOwotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gdGhpcmRfc2xpY2UoMCwyLDApOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gc2l6ZXMzKDQsIDMsIDUpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gdGhpcmRfc2xpY2UoMCwgMiwgMCk7CiAgIHJlc3VsdC5zbGljZSh0aGlyZF9zbGljZSwgc2l6ZXMzKSA9IHRlbnNvcjM7CiAKLSAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IHNpemVzNCg0LDMsMik7Ci0gIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBmb3VydGhfc2xpY2UoMCwyLDUpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gc2l6ZXM0KDQsIDMsIDIpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gZm91cnRoX3NsaWNlKDAsIDIsIDUpOwogICByZXN1bHQuc2xpY2UoZm91cnRoX3NsaWNlLCBzaXplczQpID0gdGVuc29yNDsKIAogICBmb3IgKGludCBqID0gMDsgaiA8IDI7ICsraikgewogICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksaixrKSwgdGVuc29yMShpLGosaykpOwotICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGkrMixqLGspLCB0ZW5zb3IyKGksaixrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiwgayksIHRlbnNvcjEoaSwgaiwgaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGkgKyAyLCBqLCBrKSwgdGVuc29yMihpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDI7IGogPCA1OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSxqLGspLCB0ZW5zb3IzKGksai0yLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLCBqLCBrKSwgdGVuc29yMyhpLCBqIC0gMiwgaykpOwogICAgICAgfQogICAgICAgZm9yIChpbnQgayA9IDU7IGsgPCA3OyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLGosayksIHRlbnNvcjQoaSxqLTIsay01KSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiwgayksIHRlbnNvcjQoaSwgaiAtIDIsIGsgLSA1KSk7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IHNpemVzNSg0LDUsNyk7Ci0gIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBmaWZ0aF9zbGljZSgwLDAsMCk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBzaXplczUoNCwgNSwgNyk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBmaWZ0aF9zbGljZSgwLCAwLCAwKTsKICAgcmVzdWx0LnNsaWNlKGZpZnRoX3NsaWNlLCBzaXplczUpID0gdGVuc29yNS5zbGljZShmaWZ0aF9zbGljZSwgc2l6ZXM1KTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMjsgaiA8IDU7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLGosayksIHRlbnNvcjUoaSxqLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLCBqLCBrKSwgdGVuc29yNShpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9zbGljZV9yYXdfZGF0YSgpCi17Ci0gIFRlbnNvcjxULCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMyw1LDcsMTEpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zbGljZV9yYXdfZGF0YSgpIHsKKyAgVGVuc29yPFQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigzLCA1LCA3LCAxMSk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKIAotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4gb2Zmc2V0cygxLDIsMyw0KTsKLSAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDQ+IGV4dGVudHMoMSwxLDEsMSk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PiBvZmZzZXRzKDEsIDIsIDMsIDQpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4gZXh0ZW50cygxLCAxLCAxLCAxKTsKICAgdHlwZWRlZiBUZW5zb3JFdmFsdWF0b3I8ZGVjbHR5cGUodGVuc29yLnNsaWNlKG9mZnNldHMsIGV4dGVudHMpKSwgRGVmYXVsdERldmljZT4gU2xpY2VFdmFsdWF0b3I7CiAgIGF1dG8gc2xpY2UxID0gU2xpY2VFdmFsdWF0b3IodGVuc29yLnNsaWNlKG9mZnNldHMsIGV4dGVudHMpLCBEZWZhdWx0RGV2aWNlKCkpOwogICBWRVJJRllfSVNfRVFVQUwoc2xpY2UxLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSwgMSk7Ci0gIFZFUklGWV9JU19FUVVBTChzbGljZTEuZGF0YSgpWzBdLCB0ZW5zb3IoMSwyLDMsNCkpOworICBWRVJJRllfSVNfRVFVQUwoc2xpY2UxLmRhdGEoKVswXSwgdGVuc29yKDEsIDIsIDMsIDQpKTsKIAogICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgewotICAgIGV4dGVudHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMiwxLDEsMSk7CisgICAgZXh0ZW50cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigyLCAxLCAxLCAxKTsKICAgICBhdXRvIHNsaWNlMiA9IFNsaWNlRXZhbHVhdG9yKHRlbnNvci5zbGljZShvZmZzZXRzLCBleHRlbnRzKSwgRGVmYXVsdERldmljZSgpKTsKICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UyLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSwgMik7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMi5kYXRhKClbMF0sIHRlbnNvcigxLDIsMyw0KSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMi5kYXRhKClbMV0sIHRlbnNvcigyLDIsMyw0KSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMi5kYXRhKClbMF0sIHRlbnNvcigxLCAyLCAzLCA0KSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMi5kYXRhKClbMV0sIHRlbnNvcigyLCAyLCAzLCA0KSk7CiAgIH0gZWxzZSB7Ci0gICAgZXh0ZW50cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigxLDEsMSwyKTsKKyAgICBleHRlbnRzID0gRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDQ+KDEsIDEsIDEsIDIpOwogICAgIGF1dG8gc2xpY2UyID0gU2xpY2VFdmFsdWF0b3IodGVuc29yLnNsaWNlKG9mZnNldHMsIGV4dGVudHMpLCBEZWZhdWx0RGV2aWNlKCkpOwogICAgIFZFUklGWV9JU19FUVVBTChzbGljZTIuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpLCAyKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UyLmRhdGEoKVswXSwgdGVuc29yKDEsMiwzLDQpKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UyLmRhdGEoKVsxXSwgdGVuc29yKDEsMiwzLDUpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UyLmRhdGEoKVswXSwgdGVuc29yKDEsIDIsIDMsIDQpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UyLmRhdGEoKVsxXSwgdGVuc29yKDEsIDIsIDMsIDUpKTsKICAgfQogCi0gIGV4dGVudHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMSwyLDEsMSk7CisgIGV4dGVudHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMSwgMiwgMSwgMSk7CiAgIGF1dG8gc2xpY2UzID0gU2xpY2VFdmFsdWF0b3IodGVuc29yLnNsaWNlKG9mZnNldHMsIGV4dGVudHMpLCBEZWZhdWx0RGV2aWNlKCkpOwogICBWRVJJRllfSVNfRVFVQUwoc2xpY2UzLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTChzbGljZTMuZGF0YSgpLCBzdGF0aWNfY2FzdDxUKj4oMCkpOwogCiAgIGlmIChEYXRhTGF5b3V0ID09IENvbE1ham9yKSB7Ci0gICAgb2Zmc2V0cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigwLDIsMyw0KTsKLSAgICBleHRlbnRzID0gRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDQ+KDMsMiwxLDEpOworICAgIG9mZnNldHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMCwgMiwgMywgNCk7CisgICAgZXh0ZW50cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigzLCAyLCAxLCAxKTsKICAgICBhdXRvIHNsaWNlNCA9IFNsaWNlRXZhbHVhdG9yKHRlbnNvci5zbGljZShvZmZzZXRzLCBleHRlbnRzKSwgRGVmYXVsdERldmljZSgpKTsKICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2U0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSwgNik7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMjsgKytqKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZTQuZGF0YSgpW2krMypqXSwgdGVuc29yKGksMitqLDMsNCkpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2U0LmRhdGEoKVtpICsgMyAqIGpdLCB0ZW5zb3IoaSwgMiArIGosIDMsIDQpKTsKICAgICAgIH0KICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgb2Zmc2V0cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigxLDIsMywwKTsKLSAgICBleHRlbnRzID0gRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDQ+KDEsMSwyLDExKTsKKyAgICBvZmZzZXRzID0gRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDQ+KDEsIDIsIDMsIDApOworICAgIGV4dGVudHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMSwgMSwgMiwgMTEpOwogICAgIGF1dG8gc2xpY2U0ID0gU2xpY2VFdmFsdWF0b3IodGVuc29yLnNsaWNlKG9mZnNldHMsIGV4dGVudHMpLCBEZWZhdWx0RGV2aWNlKCkpOwogICAgIFZFUklGWV9JU19FUVVBTChzbGljZTQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpLCAyMik7CiAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAxMTsgKytsKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDI7ICsraykgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2U0LmRhdGEoKVtsKzExKmtdLCB0ZW5zb3IoMSwyLDMrayxsKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZTQuZGF0YSgpW2wgKyAxMSAqIGtdLCB0ZW5zb3IoMSwgMiwgMyArIGssIGwpKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAogICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgewotICAgIG9mZnNldHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMCwwLDAsNCk7Ci0gICAgZXh0ZW50cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigzLDUsNywyKTsKKyAgICBvZmZzZXRzID0gRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDQ+KDAsIDAsIDAsIDQpOworICAgIGV4dGVudHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMywgNSwgNywgMik7CiAgICAgYXV0byBzbGljZTUgPSBTbGljZUV2YWx1YXRvcih0ZW5zb3Iuc2xpY2Uob2Zmc2V0cywgZXh0ZW50cyksIERlZmF1bHREZXZpY2UoKSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlNS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCksIDIxMCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKQEAgLTMwNywxNCArMzAyLDE0IEBACiAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7CiAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAyOyArK2wpIHsKICAgICAgICAgICAgIGludCBzbGljZV9pbmRleCA9IGkgKyAzICogKGogKyA1ICogKGsgKyA3ICogbCkpOwotICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlNS5kYXRhKClbc2xpY2VfaW5kZXhdLCB0ZW5zb3IoaSxqLGssbCs0KSk7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2U1LmRhdGEoKVtzbGljZV9pbmRleF0sIHRlbnNvcihpLCBqLCBrLCBsICsgNCkpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfSBlbHNlIHsKLSAgICBvZmZzZXRzID0gRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDQ+KDEsMCwwLDApOwotICAgIGV4dGVudHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMiw1LDcsMTEpOworICAgIG9mZnNldHMgPSBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgND4oMSwgMCwgMCwgMCk7CisgICAgZXh0ZW50cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigyLCA1LCA3LCAxMSk7CiAgICAgYXV0byBzbGljZTUgPSBTbGljZUV2YWx1YXRvcih0ZW5zb3Iuc2xpY2Uob2Zmc2V0cywgZXh0ZW50cyksIERlZmF1bHREZXZpY2UoKSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlNS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCksIDc3MCk7CiAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCAxMTsgKytsKSB7CkBAIC0zMjIsNzkgKzMxNyw3NiBAQAogICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgewogICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgICAgICAgICBpbnQgc2xpY2VfaW5kZXggPSBsICsgMTEgKiAoayArIDcgKiAoaiArIDUgKiBpKSk7Ci0gICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2U1LmRhdGEoKVtzbGljZV9pbmRleF0sIHRlbnNvcihpKzEsaixrLGwpKTsKKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZTUuZGF0YSgpW3NsaWNlX2luZGV4XSwgdGVuc29yKGkgKyAxLCBqLCBrLCBsKSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotCiAgIH0KIAotICBvZmZzZXRzID0gRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDQ+KDAsMCwwLDApOwotICBleHRlbnRzID0gRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDQ+KDMsNSw3LDExKTsKKyAgb2Zmc2V0cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigwLCAwLCAwLCAwKTsKKyAgZXh0ZW50cyA9IEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA0PigzLCA1LCA3LCAxMSk7CiAgIGF1dG8gc2xpY2U2ID0gU2xpY2VFdmFsdWF0b3IodGVuc29yLnNsaWNlKG9mZnNldHMsIGV4dGVudHMpLCBEZWZhdWx0RGV2aWNlKCkpOwotICBWRVJJRllfSVNfRVFVQUwoc2xpY2U2LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSwgMyo1KjcqMTEpOworICBWRVJJRllfSVNfRVFVQUwoc2xpY2U2LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSwgMyAqIDUgKiA3ICogMTEpOwogICBWRVJJRllfSVNfRVFVQUwoc2xpY2U2LmRhdGEoKSwgdGVuc29yLmRhdGEoKSk7CiB9CiAKLQotdGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X3N0cmlkZWRfc2xpY2UoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zdHJpZGVkX3NsaWNlKCkgewogICB0eXBlZGVmIFRlbnNvcjxULCA1LCBEYXRhTGF5b3V0PiBUZW5zb3I1ZjsKICAgdHlwZWRlZiBFaWdlbjo6RFNpemVzPEVpZ2VuOjpEZW5zZUluZGV4LCA1PiBJbmRleDU7CiAgIHR5cGVkZWYgVGVuc29yPFQsIDIsIERhdGFMYXlvdXQ+IFRlbnNvcjJmOwogICB0eXBlZGVmIEVpZ2VuOjpEU2l6ZXM8RWlnZW46OkRlbnNlSW5kZXgsIDI+IEluZGV4MjsKLSAgVGVuc29yPFQsIDUsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3LDExKTsKLSAgVGVuc29yPFQsIDIsIERhdGFMYXlvdXQ+IHRlbnNvcjIoNywxMSk7CisgIFRlbnNvcjxULCA1LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgNSwgNywgMTEpOworICBUZW5zb3I8VCwgMiwgRGF0YUxheW91dD4gdGVuc29yMig3LCAxMSk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKICAgdGVuc29yMi5zZXRSYW5kb20oKTsKIAogICBpZiAodHJ1ZSkgewotICAgIFRlbnNvcjJmIHNsaWNlKDIsMyk7Ci0gICAgSW5kZXgyIHN0cmlkZXMoLTIsLTEpOwotICAgIEluZGV4MiBpbmRpY2VzU3RhcnQoNSw3KTsKLSAgICBJbmRleDIgaW5kaWNlc1N0b3AoMCw0KTsKKyAgICBUZW5zb3IyZiBzbGljZSgyLCAzKTsKKyAgICBJbmRleDIgc3RyaWRlcygtMiwgLTEpOworICAgIEluZGV4MiBpbmRpY2VzU3RhcnQoNSwgNyk7CisgICAgSW5kZXgyIGluZGljZXNTdG9wKDAsIDQpOwogICAgIHNsaWNlID0gdGVuc29yMi5zdHJpZGVkU2xpY2UoaW5kaWNlc1N0YXJ0LCBpbmRpY2VzU3RvcCwgc3RyaWRlcyk7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZShqLGspLCB0ZW5zb3IyKDUtMipqLDctaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UoaiwgayksIHRlbnNvcjIoNSAtIDIgKiBqLCA3IC0gaykpOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIGlmKHRydWUpIHsKLSAgICBUZW5zb3IyZiBzbGljZSgwLDEpOwotICAgIEluZGV4MiBzdHJpZGVzKDEsMSk7Ci0gICAgSW5kZXgyIGluZGljZXNTdGFydCg1LDQpOwotICAgIEluZGV4MiBpbmRpY2VzU3RvcCg1LDUpOworICBpZiAodHJ1ZSkgeworICAgIFRlbnNvcjJmIHNsaWNlKDAsIDEpOworICAgIEluZGV4MiBzdHJpZGVzKDEsIDEpOworICAgIEluZGV4MiBpbmRpY2VzU3RhcnQoNSwgNCk7CisgICAgSW5kZXgyIGluZGljZXNTdG9wKDUsIDUpOwogICAgIHNsaWNlID0gdGVuc29yMi5zdHJpZGVkU2xpY2UoaW5kaWNlc1N0YXJ0LCBpbmRpY2VzU3RvcCwgc3RyaWRlcyk7CiAgIH0KIAotICBpZih0cnVlKSB7IC8vIHRlc3QgY2xhbXBlZCBkZWdlbmVyYXRlIGludGVyYXZscwotICAgIFRlbnNvcjJmIHNsaWNlKDcsMTEpOwotICAgIEluZGV4MiBzdHJpZGVzKDEsLTEpOwotICAgIEluZGV4MiBpbmRpY2VzU3RhcnQoLTMsMjApOyAvLyBzaG91bGQgYmVjb21lIDAsMTAKLSAgICBJbmRleDIgaW5kaWNlc1N0b3AoMjAsLTExKTsgLy8gc2hvdWxkIGJlY29tZSAxMSwgLTEKKyAgaWYgKHRydWUpIHsgIC8vIHRlc3QgY2xhbXBlZCBkZWdlbmVyYXRlIGludGVyYXZscworICAgIFRlbnNvcjJmIHNsaWNlKDcsIDExKTsKKyAgICBJbmRleDIgc3RyaWRlcygxLCAtMSk7CisgICAgSW5kZXgyIGluZGljZXNTdGFydCgtMywgMjApOyAgLy8gc2hvdWxkIGJlY29tZSAwLDEwCisgICAgSW5kZXgyIGluZGljZXNTdG9wKDIwLCAtMTEpOyAgLy8gc2hvdWxkIGJlY29tZSAxMSwgLTEKICAgICBzbGljZSA9IHRlbnNvcjIuc3RyaWRlZFNsaWNlKGluZGljZXNTdGFydCwgaW5kaWNlc1N0b3AsIHN0cmlkZXMpOwogICAgIGZvciAoaW50IGogPSAwOyBqIDwgNzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDExOyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlKGosayksIHRlbnNvcjIoaiwxMC1rKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZShqLCBrKSwgdGVuc29yMihqLCAxMCAtIGspKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAotICBpZih0cnVlKSB7Ci0gICAgVGVuc29yNWYgc2xpY2UxKDEsMSwxLDEsMSk7CisgIGlmICh0cnVlKSB7CisgICAgVGVuc29yNWYgc2xpY2UxKDEsIDEsIDEsIDEsIDEpOwogICAgIEVpZ2VuOjpEU2l6ZXM8RWlnZW46OkRlbnNlSW5kZXgsIDU+IGluZGljZXNTdGFydCgxLCAyLCAzLCA0LCA1KTsKICAgICBFaWdlbjo6RFNpemVzPEVpZ2VuOjpEZW5zZUluZGV4LCA1PiBpbmRpY2VzU3RvcCgyLCAzLCA0LCA1LCA2KTsKICAgICBFaWdlbjo6RFNpemVzPEVpZ2VuOjpEZW5zZUluZGV4LCA1PiBzdHJpZGVzKDEsIDEsIDEsIDEsIDEpOwogICAgIHNsaWNlMSA9IHRlbnNvci5zdHJpZGVkU2xpY2UoaW5kaWNlc1N0YXJ0LCBpbmRpY2VzU3RvcCwgc3RyaWRlcyk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMSgwLDAsMCwwLDApLCB0ZW5zb3IoMSwyLDMsNCw1KSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMSgwLCAwLCAwLCAwLCAwKSwgdGVuc29yKDEsIDIsIDMsIDQsIDUpKTsKICAgfQogCi0gIGlmKHRydWUpIHsKLSAgICBUZW5zb3I1ZiBzbGljZSgxLDEsMiwyLDMpOworICBpZiAodHJ1ZSkgeworICAgIFRlbnNvcjVmIHNsaWNlKDEsIDEsIDIsIDIsIDMpOwogICAgIEluZGV4NSBzdGFydCgxLCAxLCAzLCA0LCA1KTsKICAgICBJbmRleDUgc3RvcCgyLCAyLCA1LCA2LCA4KTsKICAgICBJbmRleDUgc3RyaWRlcygxLCAxLCAxLCAxLCAxKTsKQEAgLTQwMiwxNCArMzk0LDE0IEBACiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMjsgKytqKSB7CiAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMzsgKytrKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlKDAsMCxpLGosayksIHRlbnNvcigxLDEsMytpLDQraiw1K2spKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UoMCwgMCwgaSwgaiwgayksIHRlbnNvcigxLCAxLCAzICsgaSwgNCArIGosIDUgKyBrKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIAotICBpZih0cnVlKSB7Ci0gICAgVGVuc29yNWYgc2xpY2UoMSwxLDIsMiwzKTsKKyAgaWYgKHRydWUpIHsKKyAgICBUZW5zb3I1ZiBzbGljZSgxLCAxLCAyLCAyLCAzKTsKICAgICBJbmRleDUgc3RyaWRlczMoMSwgMSwgLTIsIDEsIC0xKTsKICAgICBJbmRleDUgaW5kaWNlczNTdGFydCgxLCAxLCA0LCA0LCA3KTsKICAgICBJbmRleDUgaW5kaWNlczNTdG9wKDIsIDIsIDAsIDYsIDQpOwpAQCAtNDE3LDE0ICs0MDksMTQgQEAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyArK2opIHsKICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyArK2spIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UoMCwwLGksaixrKSwgdGVuc29yKDEsMSw0LTIqaSw0K2osNy1rKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlKDAsIDAsIGksIGosIGspLCB0ZW5zb3IoMSwgMSwgNCAtIDIgKiBpLCA0ICsgaiwgNyAtIGspKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogCi0gIGlmKGZhbHNlKSB7IC8vIHRlc3RzIGRlZ2VuZXJhdGUgaW50ZXJ2YWwKLSAgICBUZW5zb3I1ZiBzbGljZSgxLDEsMiwyLDMpOworICBpZiAoZmFsc2UpIHsgIC8vIHRlc3RzIGRlZ2VuZXJhdGUgaW50ZXJ2YWwKKyAgICBUZW5zb3I1ZiBzbGljZSgxLCAxLCAyLCAyLCAzKTsKICAgICBJbmRleDUgc3RyaWRlczMoMSwgMSwgMiwgMSwgMSk7CiAgICAgSW5kZXg1IGluZGljZXMzU3RhcnQoMSwgMSwgNCwgNCwgNyk7CiAgICAgSW5kZXg1IGluZGljZXMzU3RvcCgyLCAyLCAwLCA2LCA0KTsKQEAgLTQzMiwzNSArNDI0LDM0IEBACiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X3N0cmlkZWRfc2xpY2Vfd3JpdGUoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zdHJpZGVkX3NsaWNlX3dyaXRlKCkgewogICB0eXBlZGVmIFRlbnNvcjxULCAyLCBEYXRhTGF5b3V0PiBUZW5zb3IyZjsKICAgdHlwZWRlZiBFaWdlbjo6RFNpemVzPEVpZ2VuOjpEZW5zZUluZGV4LCAyPiBJbmRleDI7CiAKLSAgVGVuc29yPFQsIDIsIERhdGFMYXlvdXQ+IHRlbnNvcig3LDExKSx0ZW5zb3IyKDcsMTEpOworICBUZW5zb3I8VCwgMiwgRGF0YUxheW91dD4gdGVuc29yKDcsIDExKSwgdGVuc29yMig3LCAxMSk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKLSAgdGVuc29yMj10ZW5zb3I7Ci0gIFRlbnNvcjJmIHNsaWNlKDIsMyk7CisgIHRlbnNvcjIgPSB0ZW5zb3I7CisgIFRlbnNvcjJmIHNsaWNlKDIsIDMpOwogCiAgIHNsaWNlLnNldFJhbmRvbSgpOwogCi0gIEluZGV4MiBzdHJpZGVzKDEsMSk7Ci0gIEluZGV4MiBpbmRpY2VzU3RhcnQoMyw0KTsKLSAgSW5kZXgyIGluZGljZXNTdG9wKDUsNyk7Ci0gIEluZGV4MiBsZW5ndGhzKDIsMyk7CisgIEluZGV4MiBzdHJpZGVzKDEsIDEpOworICBJbmRleDIgaW5kaWNlc1N0YXJ0KDMsIDQpOworICBJbmRleDIgaW5kaWNlc1N0b3AoNSwgNyk7CisgIEluZGV4MiBsZW5ndGhzKDIsIDMpOwogCi0gIHRlbnNvci5zbGljZShpbmRpY2VzU3RhcnQsbGVuZ3Rocyk9c2xpY2U7Ci0gIHRlbnNvcjIuc3RyaWRlZFNsaWNlKGluZGljZXNTdGFydCxpbmRpY2VzU3RvcCxzdHJpZGVzKT1zbGljZTsKKyAgdGVuc29yLnNsaWNlKGluZGljZXNTdGFydCwgbGVuZ3RocykgPSBzbGljZTsKKyAgdGVuc29yMi5zdHJpZGVkU2xpY2UoaW5kaWNlc1N0YXJ0LCBpbmRpY2VzU3RvcCwgc3RyaWRlcykgPSBzbGljZTsKIAotICBmb3IoaW50IGk9MDtpPDc7aSsrKSBmb3IoaW50IGo9MDtqPDExO2orKyl7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGopLCB0ZW5zb3IyKGksaikpOwotICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTE7IGorKykgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqKSwgdGVuc29yMihpLCBqKSk7CisgICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfY29tcG9zaXRpb24oKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9jb21wb3NpdGlvbigpIHsKICAgRWlnZW46OlRlbnNvcjxULCAyLCBEYXRhTGF5b3V0PiBtYXRyaXgoNywgMTEpOwogICBtYXRyaXguc2V0UmFuZG9tKCk7CiAKQEAgLTQ3Myw1NiArNDY0LDU1IEBACiAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IuZGltZW5zaW9uKDEpLCAxKTsKICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvci5kaW1lbnNpb24oMiksIDExKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgKytpKSB7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcigwLDAsaSksIG1hdHJpeCgyLGkpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKDAsIDAsIGkpLCBtYXRyaXgoMiwgaSkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9lbXB0eV9zbGljZSgpCi17Ci0gIFRlbnNvcjxULCAzLCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9lbXB0eV9zbGljZSgpIHsKKyAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogICBUZW5zb3I8VCwgMywgRGF0YUxheW91dD4gY29weSA9IHRlbnNvcjsKIAogICAvLyBlbXB0eSBzaXplIGluIGZpcnN0IGRpbWVuc2lvbgotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gaW5kaWNlczEoMSwyLDMpOwotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gc2l6ZXMxKDAsMSwyKTsKLSAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHNsaWNlMSgwLDEsMik7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBpbmRpY2VzMSgxLCAyLCAzKTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IHNpemVzMSgwLCAxLCAyKTsKKyAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHNsaWNlMSgwLCAxLCAyKTsKICAgc2xpY2UxLnNldFJhbmRvbSgpOwogICB0ZW5zb3Iuc2xpY2UoaW5kaWNlczEsIHNpemVzMSkgPSBzbGljZTE7CiAKICAgLy8gZW1wdHkgc2l6ZSBpbiBzZWNvbmQgZGltZW5zaW9uCi0gIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBpbmRpY2VzMigxLDIsMyk7Ci0gIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBzaXplczIoMSwwLDIpOwotICBUZW5zb3I8VCwgMywgRGF0YUxheW91dD4gc2xpY2UyKDEsMCwyKTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IGluZGljZXMyKDEsIDIsIDMpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gc2l6ZXMyKDEsIDAsIDIpOworICBUZW5zb3I8VCwgMywgRGF0YUxheW91dD4gc2xpY2UyKDEsIDAsIDIpOwogICBzbGljZTIuc2V0UmFuZG9tKCk7CiAgIHRlbnNvci5zbGljZShpbmRpY2VzMiwgc2l6ZXMyKSA9IHNsaWNlMjsKIAogICAvLyBlbXB0eSBzaXplIGluIHRoaXJkIGRpbWVuc2lvbgotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gaW5kaWNlczMoMSwyLDMpOwotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gc2l6ZXMzKDEsMSwwKTsKLSAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHNsaWNlMygxLDEsMCk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBpbmRpY2VzMygxLCAyLCAzKTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IHNpemVzMygxLCAxLCAwKTsKKyAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHNsaWNlMygxLCAxLCAwKTsKICAgc2xpY2UzLnNldFJhbmRvbSgpOwogICB0ZW5zb3Iuc2xpY2UoaW5kaWNlczMsIHNpemVzMykgPSBzbGljZTM7CiAKICAgLy8gZW1wdHkgc2l6ZSBpbiBmaXJzdCBhbmQgc2Vjb25kIGRpbWVuc2lvbgotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gaW5kaWNlczQoMSwyLDMpOwotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gc2l6ZXM0KDAsMCwyKTsKLSAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHNsaWNlNCgwLDAsMik7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBpbmRpY2VzNCgxLCAyLCAzKTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IHNpemVzNCgwLCAwLCAyKTsKKyAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHNsaWNlNCgwLCAwLCAyKTsKICAgc2xpY2U0LnNldFJhbmRvbSgpOwogICB0ZW5zb3Iuc2xpY2UoaW5kaWNlczQsIHNpemVzNCkgPSBzbGljZTQ7CiAKICAgLy8gZW1wdHkgc2l6ZSBpbiBzZWNvbmQgYW5kIHRoaXJkIGRpbWVuc2lvbgotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gaW5kaWNlczUoMSwyLDMpOwotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gc2l6ZXM1KDEsMCwwKTsKLSAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHNsaWNlNSgxLDAsMCk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBpbmRpY2VzNSgxLCAyLCAzKTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IHNpemVzNSgxLCAwLCAwKTsKKyAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHNsaWNlNSgxLCAwLCAwKTsKICAgc2xpY2U1LnNldFJhbmRvbSgpOwogICB0ZW5zb3Iuc2xpY2UoaW5kaWNlczUsIHNpemVzNSkgPSBzbGljZTU7CiAKICAgLy8gZW1wdHkgc2l6ZSBpbiBhbGwgZGltZW5zaW9ucwotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gaW5kaWNlczYoMSwyLDMpOwotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgMz4gc2l6ZXM2KDAsMCwwKTsKLSAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHNsaWNlNigwLDAsMCk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCAzPiBpbmRpY2VzNigxLCAyLCAzKTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDM+IHNpemVzNigwLCAwLCAwKTsKKyAgVGVuc29yPFQsIDMsIERhdGFMYXlvdXQ+IHNsaWNlNigwLCAwLCAwKTsKICAgc2xpY2U2LnNldFJhbmRvbSgpOwogICB0ZW5zb3Iuc2xpY2UoaW5kaWNlczYsIHNpemVzNikgPSBzbGljZTY7CiAKQEAgLTUzMSwyMyArNTIxLDIxIEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayksIGNvcHkoaSxqLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrKSwgY29weShpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLSNkZWZpbmUgQ0FMTF9TVUJURVNUX1BBUlQoUEFSVCkgXAotICBDQUxMX1NVQlRFU1RfIyNQQVJUCisjZGVmaW5lIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpIENBTExfU1VCVEVTVF8jI1BBUlQKIAogI2RlZmluZSBDQUxMX1NVQlRFU1RTX1RZUEVTX0xBWU9VVFMoUEFSVCwgTkFNRSkgICAgICAgXAogICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxmbG9hdCwgQ29sTWFqb3I+KCkpKTsgXAogICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxmbG9hdCwgUm93TWFqb3I+KCkpKTsgXAotICBDQUxMX1NVQlRFU1RfUEFSVChQQVJUKSgoTkFNRTxib29sLCBDb2xNYWpvcj4oKSkpOyBcCisgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGJvb2wsIENvbE1ham9yPigpKSk7ICBcCiAgIENBTExfU1VCVEVTVF9QQVJUKFBBUlQpKChOQU1FPGJvb2wsIFJvd01ham9yPigpKSkKIAotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9tb3JwaGluZykKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfbW9ycGhpbmcpIHsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9zaW1wbGVfcmVzaGFwZTx2b2lkPigpKTsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9zdGF0aWNfcmVzaGFwZTx2b2lkPigpKTsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9yZXNoYXBlX2FzX2x2YWx1ZTx2b2lkPigpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21vcnBoaW5nX3N5Y2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbW9ycGhpbmdfc3ljbC5jcHAKaW5kZXggYTE1NDVkNC4uNzI0MmI4ZSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbW9ycGhpbmdfc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbW9ycGhpbmdfc3ljbC5jcHAKQEAgLTEyLDE0ICsxMiwxMiBAQAogLy8gUHVibGljIExpY2Vuc2Ugdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkCiAvLyB3aXRoIHRoaXMgZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4KIAotCiAjZGVmaW5lIEVJR0VOX1RFU1RfTk9fTE9OR0RPVUJMRQogI2RlZmluZSBFSUdFTl9URVNUX05PX0NPTVBMRVgKIAogI2RlZmluZSBFSUdFTl9ERUZBVUxUX0RFTlNFX0lOREVYX1RZUEUgaW50NjRfdAogI2RlZmluZSBFSUdFTl9VU0VfU1lDTAogCi0KICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGVuc29yPgogCkBAIC0yOSwxMiArMjcsMTEgQEAKIHVzaW5nIEVpZ2VuOjpUZW5zb3JNYXA7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3Jlc2hhcGUoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQotewotICB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDUgLERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvbnMgZGltMSgyLDMsMSw3LDEpOwotICB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDMgLERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvbnMgZGltMigyLDMsNyk7Ci0gIHR5cGVuYW1lIFRlbnNvcjxEYXRhVHlwZSwgMiAsRGF0YUxheW91dCwgSW5kZXhUeXBlPjo6RGltZW5zaW9ucyBkaW0zKDYsNyk7Ci0gIHR5cGVuYW1lIFRlbnNvcjxEYXRhVHlwZSwgMiAsRGF0YUxheW91dCwgSW5kZXhUeXBlPjo6RGltZW5zaW9ucyBkaW00KDIsMjEpOworc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfcmVzaGFwZShjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKKyAgdHlwZW5hbWUgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OjpEaW1lbnNpb25zIGRpbTEoMiwgMywgMSwgNywgMSk7CisgIHR5cGVuYW1lIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPjo6RGltZW5zaW9ucyBkaW0yKDIsIDMsIDcpOworICB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvbnMgZGltMyg2LCA3KTsKKyAgdHlwZW5hbWUgVGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OjpEaW1lbnNpb25zIGRpbTQoMiwgMjEpOwogCiAgIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiB0ZW5zb3IxKGRpbTEpOwogICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yMihkaW0yKTsKQEAgLTQzLDM4ICs0MCwzNyBAQAogCiAgIHRlbnNvcjEuc2V0UmFuZG9tKCk7CiAKLSAgRGF0YVR5cGUqIGdwdV9kYXRhMSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcjEuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhMiAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcjIuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhMyAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcjMuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhNCAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcjQuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhMSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yMS5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YTIgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcjIuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGEzID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3IzLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhNCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yNC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSxEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUxKGdwdV9kYXRhMSwgZGltMSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsIGRpbTIpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTMoZ3B1X2RhdGEzLCBkaW0zKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMixEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHU0KGdwdV9kYXRhNCwgZGltNCk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTEoZ3B1X2RhdGExLCBkaW0xKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsIGRpbTIpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUzKGdwdV9kYXRhMywgZGltMyk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTQoZ3B1X2RhdGE0LCBkaW00KTsKIAotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IxLmRhdGEoKSwodGVuc29yMS5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IxLmRhdGEoKSwgKHRlbnNvcjEuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCi0gIGdwdTIuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHUxLnJlc2hhcGUoZGltMik7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3IyLmRhdGEoKSwgZ3B1X2RhdGEyLCh0ZW5zb3IxLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIGdwdTIuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdTEucmVzaGFwZShkaW0yKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRlbnNvcjIuZGF0YSgpLCBncHVfZGF0YTIsICh0ZW5zb3IxLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAotICBncHUzLmRldmljZShzeWNsX2RldmljZSk9Z3B1MS5yZXNoYXBlKGRpbTMpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yMy5kYXRhKCksIGdwdV9kYXRhMywodGVuc29yMy5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBncHUzLmRldmljZShzeWNsX2RldmljZSkgPSBncHUxLnJlc2hhcGUoZGltMyk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3IzLmRhdGEoKSwgZ3B1X2RhdGEzLCAodGVuc29yMy5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAKLSAgZ3B1NC5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdTEucmVzaGFwZShkaW0yKS5yZXNoYXBlKGRpbTQpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yNC5kYXRhKCksIGdwdV9kYXRhNCwodGVuc29yNC5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDI7ICsraSl7Ci0gICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCAzOyArK2opewotICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCA3OyArK2spewotICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yMShpLGosMCxrLDApLCB0ZW5zb3IyKGksaixrKSk7ICAgICAgLy8vQ29sTWFqb3IKKyAgZ3B1NC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1MS5yZXNoYXBlKGRpbTIpLnJlc2hhcGUoZGltNCk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3I0LmRhdGEoKSwgZ3B1X2RhdGE0LCAodGVuc29yNC5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxKGksIGosIDAsIGssIDApLCB0ZW5zb3IyKGksIGosIGspKTsgIC8vLyBDb2xNYWpvcgogICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihEYXRhTGF5b3V0KSA9PSBzdGF0aWNfY2FzdDxpbnQ+KENvbE1ham9yKSkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxKGksaiwwLGssMCksIHRlbnNvcjMoaSsyKmosaykpOyAgICAvLy9Db2xNYWpvcgotICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxKGksaiwwLGssMCksIHRlbnNvcjQoaSxqKzMqaykpOyAgICAvLy9Db2xNYWpvcgotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgLy9WRVJJRllfSVNfRVFVQUwodGVuc29yMShpLGosMCxrLDApLCB0ZW5zb3IyKGksaixrKSk7ICAgICAgLy8vIFJvd01ham9yCi0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjEoaSxqLDAsaywwKSwgdGVuc29yNChpLGoqNyAraykpOyAgIC8vLyBSb3dNYWpvcgotICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxKGksaiwwLGssMCksIHRlbnNvcjMoaSozICtqLGspKTsgICAvLy8gUm93TWFqb3IKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yMShpLCBqLCAwLCBrLCAwKSwgdGVuc29yMyhpICsgMiAqIGosIGspKTsgIC8vLyBDb2xNYWpvcgorICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxKGksIGosIDAsIGssIDApLCB0ZW5zb3I0KGksIGogKyAzICogaykpOyAgLy8vIENvbE1ham9yCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjEoaSxqLDAsaywwKSwgdGVuc29yMihpLGosaykpOyAgICAgIC8vLyBSb3dNYWpvcgorICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IxKGksIGosIDAsIGssIDApLCB0ZW5zb3I0KGksIGogKiA3ICsgaykpOyAgLy8vIFJvd01ham9yCisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjEoaSwgaiwgMCwgaywgMCksIHRlbnNvcjMoaSAqIDMgKyBqLCBrKSk7ICAvLy8gUm93TWFqb3IKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTg1LDQ1ICs4MSw0MSBAQAogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9kYXRhNCk7CiB9CiAKLQotdGVtcGxhdGU8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X3Jlc2hhcGVfYXNfbHZhbHVlKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkKLXsKLSAgdHlwZW5hbWUgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OjpEaW1lbnNpb25zIGRpbTEoMiwzLDcpOwotICB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvbnMgZGltMig2LDcpOwotICB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvbnMgZGltMygyLDMsMSw3LDEpOwordGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgorc3RhdGljIHZvaWQgdGVzdF9yZXNoYXBlX2FzX2x2YWx1ZShjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKKyAgdHlwZW5hbWUgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OjpEaW1lbnNpb25zIGRpbTEoMiwgMywgNyk7CisgIHR5cGVuYW1lIFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPjo6RGltZW5zaW9ucyBkaW0yKDYsIDcpOworICB0eXBlbmFtZSBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT46OkRpbWVuc2lvbnMgZGltMygyLCAzLCAxLCA3LCAxKTsKICAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHRlbnNvcihkaW0xKTsKICAgVGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHRlbnNvcjJkKGRpbTIpOwogICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yNWQoZGltMyk7CiAKICAgdGVuc29yLnNldFJhbmRvbSgpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YTEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhMiAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcjJkLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YTMgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3I1ZC5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGExID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGEyID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3IyZC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YTMgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcjVkLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKIAotICBUZW5zb3JNYXA8IFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPiA+IGdwdTEoZ3B1X2RhdGExLCBkaW0xKTsKLSAgVGVuc29yTWFwPCBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiBncHUyKGdwdV9kYXRhMiwgZGltMik7Ci0gIFRlbnNvck1hcDwgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gZ3B1MyhncHVfZGF0YTMsIGRpbTMpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUxKGdwdV9kYXRhMSwgZGltMSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTIoZ3B1X2RhdGEyLCBkaW0yKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MyhncHVfZGF0YTMsIGRpbTMpOwogCi0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YTEsIHRlbnNvci5kYXRhKCksKHRlbnNvci5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IuZGF0YSgpLCAodGVuc29yLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAotICBncHUyLnJlc2hhcGUoZGltMSkuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHUxOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yMmQuZGF0YSgpLCBncHVfZGF0YTIsKHRlbnNvcjJkLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIGdwdTIucmVzaGFwZShkaW0xKS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1MTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRlbnNvcjJkLmRhdGEoKSwgZ3B1X2RhdGEyLCAodGVuc29yMmQuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCi0gIGdwdTMucmVzaGFwZShkaW0xKS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdTE7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3I1ZC5kYXRhKCksIGdwdV9kYXRhMywodGVuc29yNWQuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgZ3B1My5yZXNoYXBlKGRpbTEpLmRldmljZShzeWNsX2RldmljZSkgPSBncHUxOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yNWQuZGF0YSgpLCBncHVfZGF0YTMsICh0ZW5zb3I1ZC5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAKLQotICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDI7ICsraSl7Ci0gICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCAzOyArK2opewotICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCA3OyArK2spewotICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yNWQoaSxqLDAsaywwKSwgdGVuc29yKGksaixrKSk7CisgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgNzsgKytrKSB7CisgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3I1ZChpLCBqLCAwLCBrLCAwKSwgdGVuc29yKGksIGosIGspKTsKICAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludD4oRGF0YUxheW91dCkgPT0gc3RhdGljX2Nhc3Q8aW50PihDb2xNYWpvcikpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yMmQoaSsyKmosayksIHRlbnNvcihpLGosaykpOyAgICAvLy9Db2xNYWpvcgotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcjJkKGkqMyAraixrKSx0ZW5zb3IoaSxqLGspKTsgICAvLy8gUm93TWFqb3IKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yMmQoaSArIDIgKiBqLCBrKSwgdGVuc29yKGksIGosIGspKTsgIC8vLyBDb2xNYWpvcgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IyZChpICogMyArIGosIGspLCB0ZW5zb3IoaSwgaiwgaykpOyAgLy8vIFJvd01ham9yCiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0xMzMsNDUgKzEyNSw0MiBAQAogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9kYXRhMyk7CiB9CiAKLQogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfc2xpY2UoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKQoteworc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfc2xpY2UoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIEluZGV4VHlwZSBzaXplRGltMSA9IDI7CiAgIEluZGV4VHlwZSBzaXplRGltMiA9IDM7CiAgIEluZGV4VHlwZSBzaXplRGltMyA9IDU7CiAgIEluZGV4VHlwZSBzaXplRGltNCA9IDc7CiAgIEluZGV4VHlwZSBzaXplRGltNSA9IDExOwogICBhcnJheTxJbmRleFR5cGUsIDU+IHRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNCwgc2l6ZURpbTV9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA1LERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yKHRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHRlbnNvcih0ZW5zb3JSYW5nZSk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKLSAgYXJyYXk8SW5kZXhUeXBlLCA1PiBzbGljZTFfcmFuZ2UgPXt7MSwgMSwgMSwgMSwgMX19OwotICBUZW5zb3I8RGF0YVR5cGUsIDUsRGF0YUxheW91dCwgSW5kZXhUeXBlPiBzbGljZTEoc2xpY2UxX3JhbmdlKTsKKyAgYXJyYXk8SW5kZXhUeXBlLCA1PiBzbGljZTFfcmFuZ2UgPSB7ezEsIDEsIDEsIDEsIDF9fTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHNsaWNlMShzbGljZTFfcmFuZ2UpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YTEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhMiAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHNsaWNlMS5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTEoZ3B1X2RhdGExLCB0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsIHNsaWNlMV9yYW5nZSk7Ci0gIEVpZ2VuOjpEU2l6ZXM8SW5kZXhUeXBlLCA1PiBpbmRpY2VzKDEsMiwzLDQsNSk7Ci0gIEVpZ2VuOjpEU2l6ZXM8SW5kZXhUeXBlLCA1PiBzaXplcygxLDEsMSwxLDEpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IuZGF0YSgpLCh0ZW5zb3Iuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSAgZ3B1Mi5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdTEuc2xpY2UoaW5kaWNlcywgc2l6ZXMpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qoc2xpY2UxLmRhdGEoKSwgZ3B1X2RhdGEyLChzbGljZTEuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMSgwLDAsMCwwLDApLCB0ZW5zb3IoMSwyLDMsNCw1KSk7CisgIERhdGFUeXBlKiBncHVfZGF0YTEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YTIgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHNsaWNlMS5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTEoZ3B1X2RhdGExLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTIoZ3B1X2RhdGEyLCBzbGljZTFfcmFuZ2UpOworICBFaWdlbjo6RFNpemVzPEluZGV4VHlwZSwgNT4gaW5kaWNlcygxLCAyLCAzLCA0LCA1KTsKKyAgRWlnZW46OkRTaXplczxJbmRleFR5cGUsIDU+IHNpemVzKDEsIDEsIDEsIDEsIDEpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IuZGF0YSgpLCAodGVuc29yLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgZ3B1Mi5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1MS5zbGljZShpbmRpY2VzLCBzaXplcyk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChzbGljZTEuZGF0YSgpLCBncHVfZGF0YTIsIChzbGljZTEuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBWRVJJRllfSVNfRVFVQUwoc2xpY2UxKDAsIDAsIDAsIDAsIDApLCB0ZW5zb3IoMSwgMiwgMywgNCwgNSkpOwogCi0KLSAgYXJyYXk8SW5kZXhUeXBlLCA1PiBzbGljZTJfcmFuZ2UgPXt7MSwxLDIsMiwzfX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNSxEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHNsaWNlMihzbGljZTJfcmFuZ2UpOwotICBEYXRhVHlwZSogZ3B1X2RhdGEzICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoc2xpY2UyLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MyhncHVfZGF0YTMsIHNsaWNlMl9yYW5nZSk7Ci0gIEVpZ2VuOjpEU2l6ZXM8SW5kZXhUeXBlLCA1PiBpbmRpY2VzMigxLDEsMyw0LDUpOwotICBFaWdlbjo6RFNpemVzPEluZGV4VHlwZSwgNT4gc2l6ZXMyKDEsMSwyLDIsMyk7Ci0gIGdwdTMuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHUxLnNsaWNlKGluZGljZXMyLCBzaXplczIpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qoc2xpY2UyLmRhdGEoKSwgZ3B1X2RhdGEzLChzbGljZTIuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgYXJyYXk8SW5kZXhUeXBlLCA1PiBzbGljZTJfcmFuZ2UgPSB7ezEsIDEsIDIsIDIsIDN9fTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHNsaWNlMihzbGljZTJfcmFuZ2UpOworICBEYXRhVHlwZSogZ3B1X2RhdGEzID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzbGljZTIuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUzKGdwdV9kYXRhMywgc2xpY2UyX3JhbmdlKTsKKyAgRWlnZW46OkRTaXplczxJbmRleFR5cGUsIDU+IGluZGljZXMyKDEsIDEsIDMsIDQsIDUpOworICBFaWdlbjo6RFNpemVzPEluZGV4VHlwZSwgNT4gc2l6ZXMyKDEsIDEsIDIsIDIsIDMpOworICBncHUzLmRldmljZShzeWNsX2RldmljZSkgPSBncHUxLnNsaWNlKGluZGljZXMyLCBzaXplczIpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qoc2xpY2UyLmRhdGEoKSwgZ3B1X2RhdGEzLCAoc2xpY2UyLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IDI7ICsraikgewogICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCAzOyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMigwLDAsaSxqLGspLCB0ZW5zb3IoMSwxLDMraSw0K2osNStrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZTIoMCwgMCwgaSwgaiwgayksIHRlbnNvcigxLCAxLCAzICsgaSwgNCArIGosIDUgKyBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0xODAsNzQgKzE2OSw3MiBAQAogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9kYXRhMyk7CiB9CiAKLQogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9zdHJpZGVkX3NsaWNlX2FzX3Joc19zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlICZzeWNsX2RldmljZSkKLXsKK3N0YXRpYyB2b2lkIHRlc3Rfc3RyaWRlZF9zbGljZV9hc19yaHNfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gMjsKICAgSW5kZXhUeXBlIHNpemVEaW0yID0gMzsKICAgSW5kZXhUeXBlIHNpemVEaW0zID0gNTsKICAgSW5kZXhUeXBlIHNpemVEaW00ID0gNzsKICAgSW5kZXhUeXBlIHNpemVEaW01ID0gMTE7CiAgIHR5cGVkZWYgRWlnZW46OkRTaXplczxJbmRleFR5cGUsIDU+IEluZGV4NTsKLSAgSW5kZXg1IHN0cmlkZXMoMUwsMUwsMUwsMUwsMUwpOwotICBJbmRleDUgaW5kaWNlc1N0YXJ0KDFMLDJMLDNMLDRMLDVMKTsKLSAgSW5kZXg1IGluZGljZXNTdG9wKDJMLDNMLDRMLDVMLDZMKTsKLSAgSW5kZXg1IGxlbmd0aHMoMUwsMUwsMUwsMUwsMUwpOworICBJbmRleDUgc3RyaWRlcygxTCwgMUwsIDFMLCAxTCwgMUwpOworICBJbmRleDUgaW5kaWNlc1N0YXJ0KDFMLCAyTCwgM0wsIDRMLCA1TCk7CisgIEluZGV4NSBpbmRpY2VzU3RvcCgyTCwgM0wsIDRMLCA1TCwgNkwpOworICBJbmRleDUgbGVuZ3RocygxTCwgMUwsIDFMLCAxTCwgMUwpOwogCiAgIGFycmF5PEluZGV4VHlwZSwgNT4gdGVuc29yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTMsIHNpemVEaW00LCBzaXplRGltNX19OwogICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yKHRlbnNvclJhbmdlKTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogCi0gIGFycmF5PEluZGV4VHlwZSwgNT4gc2xpY2UxX3JhbmdlID17ezEsIDEsIDEsIDEsIDF9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA1LERhdGFMYXlvdXQsIEluZGV4VHlwZT4gc2xpY2UxKHNsaWNlMV9yYW5nZSk7CisgIGFycmF5PEluZGV4VHlwZSwgNT4gc2xpY2UxX3JhbmdlID0ge3sxLCAxLCAxLCAxLCAxfX07CisgIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBzbGljZTEoc2xpY2UxX3JhbmdlKTsKICAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHNsaWNlX3N0cmlkZTEoc2xpY2UxX3JhbmdlKTsKIAotICBEYXRhVHlwZSogZ3B1X2RhdGExICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YTIgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzbGljZTEuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3N0cmlkZTIgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzbGljZV9zdHJpZGUxLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YTEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YTIgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHNsaWNlMS5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9zdHJpZGUyID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzbGljZV9zdHJpZGUxLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKIAotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTEoZ3B1X2RhdGExLCB0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsIHNsaWNlMV9yYW5nZSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3N0cmlkZTIoZ3B1X2RhdGFfc3RyaWRlMiwgc2xpY2UxX3JhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MShncHVfZGF0YTEsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsIHNsaWNlMV9yYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9zdHJpZGUyKGdwdV9kYXRhX3N0cmlkZTIsIHNsaWNlMV9yYW5nZSk7CiAKLSAgRWlnZW46OkRTaXplczxJbmRleFR5cGUsIDU+IGluZGljZXMoMSwyLDMsNCw1KTsKLSAgRWlnZW46OkRTaXplczxJbmRleFR5cGUsIDU+IHNpemVzKDEsMSwxLDEsMSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YTEsIHRlbnNvci5kYXRhKCksKHRlbnNvci5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotICBncHUyLmRldmljZShzeWNsX2RldmljZSk9Z3B1MS5zbGljZShpbmRpY2VzLCBzaXplcyk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChzbGljZTEuZGF0YSgpLCBncHVfZGF0YTIsKHNsaWNlMS5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBFaWdlbjo6RFNpemVzPEluZGV4VHlwZSwgNT4gaW5kaWNlcygxLCAyLCAzLCA0LCA1KTsKKyAgRWlnZW46OkRTaXplczxJbmRleFR5cGUsIDU+IHNpemVzKDEsIDEsIDEsIDEsIDEpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IuZGF0YSgpLCAodGVuc29yLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgZ3B1Mi5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1MS5zbGljZShpbmRpY2VzLCBzaXplcyk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChzbGljZTEuZGF0YSgpLCBncHVfZGF0YTIsIChzbGljZTEuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCi0gIGdwdV9zdHJpZGUyLmRldmljZShzeWNsX2RldmljZSk9Z3B1MS5zdHJpZGVkU2xpY2UoaW5kaWNlc1N0YXJ0LGluZGljZXNTdG9wLHN0cmlkZXMpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qoc2xpY2Vfc3RyaWRlMS5kYXRhKCksIGdwdV9kYXRhX3N0cmlkZTIsKHNsaWNlX3N0cmlkZTEuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgZ3B1X3N0cmlkZTIuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdTEuc3RyaWRlZFNsaWNlKGluZGljZXNTdGFydCwgaW5kaWNlc1N0b3AsIHN0cmlkZXMpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qoc2xpY2Vfc3RyaWRlMS5kYXRhKCksIGdwdV9kYXRhX3N0cmlkZTIsIChzbGljZV9zdHJpZGUxLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAotICBWRVJJRllfSVNfRVFVQUwoc2xpY2UxKDAsMCwwLDAsMCksIHRlbnNvcigxLDIsMyw0LDUpKTsKLSAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlX3N0cmlkZTEoMCwwLDAsMCwwKSwgdGVuc29yKDEsMiwzLDQsNSkpOworICBWRVJJRllfSVNfRVFVQUwoc2xpY2UxKDAsIDAsIDAsIDAsIDApLCB0ZW5zb3IoMSwgMiwgMywgNCwgNSkpOworICBWRVJJRllfSVNfRVFVQUwoc2xpY2Vfc3RyaWRlMSgwLCAwLCAwLCAwLCAwKSwgdGVuc29yKDEsIDIsIDMsIDQsIDUpKTsKIAotICBhcnJheTxJbmRleFR5cGUsIDU+IHNsaWNlMl9yYW5nZSA9e3sxLDEsMiwyLDN9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA1LERhdGFMYXlvdXQsIEluZGV4VHlwZT4gc2xpY2UyKHNsaWNlMl9yYW5nZSk7CisgIGFycmF5PEluZGV4VHlwZSwgNT4gc2xpY2UyX3JhbmdlID0ge3sxLCAxLCAyLCAyLCAzfX07CisgIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBzbGljZTIoc2xpY2UyX3JhbmdlKTsKICAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHN0cmlkZVNsaWNlMihzbGljZTJfcmFuZ2UpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YTMgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzbGljZTIuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3N0cmlkZTMgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzdHJpZGVTbGljZTIuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSxEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUzKGdwdV9kYXRhMywgc2xpY2UyX3JhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSxEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfc3RyaWRlMyhncHVfZGF0YV9zdHJpZGUzLCBzbGljZTJfcmFuZ2UpOwotICBFaWdlbjo6RFNpemVzPEluZGV4VHlwZSwgNT4gaW5kaWNlczIoMSwxLDMsNCw1KTsKLSAgRWlnZW46OkRTaXplczxJbmRleFR5cGUsIDU+IHNpemVzMigxLDEsMiwyLDMpOwotICBJbmRleDUgc3RyaWRlczIoMUwsMUwsMUwsMUwsMUwpOwotICBJbmRleDUgaW5kaWNlc1N0YXJ0MigxTCwxTCwzTCw0TCw1TCk7Ci0gIEluZGV4NSBpbmRpY2VzU3RvcDIoMkwsMkwsNUwsNkwsOEwpOworICBEYXRhVHlwZSogZ3B1X2RhdGEzID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzbGljZTIuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfc3RyaWRlMyA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoc3RyaWRlU2xpY2UyLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MyhncHVfZGF0YTMsIHNsaWNlMl9yYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9zdHJpZGUzKGdwdV9kYXRhX3N0cmlkZTMsIHNsaWNlMl9yYW5nZSk7CisgIEVpZ2VuOjpEU2l6ZXM8SW5kZXhUeXBlLCA1PiBpbmRpY2VzMigxLCAxLCAzLCA0LCA1KTsKKyAgRWlnZW46OkRTaXplczxJbmRleFR5cGUsIDU+IHNpemVzMigxLCAxLCAyLCAyLCAzKTsKKyAgSW5kZXg1IHN0cmlkZXMyKDFMLCAxTCwgMUwsIDFMLCAxTCk7CisgIEluZGV4NSBpbmRpY2VzU3RhcnQyKDFMLCAxTCwgM0wsIDRMLCA1TCk7CisgIEluZGV4NSBpbmRpY2VzU3RvcDIoMkwsIDJMLCA1TCwgNkwsIDhMKTsKIAotICBncHUzLmRldmljZShzeWNsX2RldmljZSk9Z3B1MS5zbGljZShpbmRpY2VzMiwgc2l6ZXMyKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHNsaWNlMi5kYXRhKCksIGdwdV9kYXRhMywoc2xpY2UyLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIGdwdTMuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdTEuc2xpY2UoaW5kaWNlczIsIHNpemVzMik7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChzbGljZTIuZGF0YSgpLCBncHVfZGF0YTMsIChzbGljZTIuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCi0gIGdwdV9zdHJpZGUzLmRldmljZShzeWNsX2RldmljZSk9Z3B1MS5zdHJpZGVkU2xpY2UoaW5kaWNlc1N0YXJ0MixpbmRpY2VzU3RvcDIsc3RyaWRlczIpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qoc3RyaWRlU2xpY2UyLmRhdGEoKSwgZ3B1X2RhdGFfc3RyaWRlMywoc3RyaWRlU2xpY2UyLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIGdwdV9zdHJpZGUzLmRldmljZShzeWNsX2RldmljZSkgPSBncHUxLnN0cmlkZWRTbGljZShpbmRpY2VzU3RhcnQyLCBpbmRpY2VzU3RvcDIsIHN0cmlkZXMyKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHN0cmlkZVNsaWNlMi5kYXRhKCksIGdwdV9kYXRhX3N0cmlkZTMsIChzdHJpZGVTbGljZTIuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCAyOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgMzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChzbGljZTIoMCwwLGksaixrKSwgdGVuc29yKDEsMSwzK2ksNCtqLDUraykpOwotICAgICAgICBWRVJJRllfSVNfRVFVQUwoc3RyaWRlU2xpY2UyKDAsMCxpLGosayksIHRlbnNvcigxLDEsMytpLDQraiw1K2spKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlMigwLCAwLCBpLCBqLCBrKSwgdGVuc29yKDEsIDEsIDMgKyBpLCA0ICsgaiwgNSArIGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHN0cmlkZVNsaWNlMigwLCAwLCBpLCBqLCBrKSwgdGVuc29yKDEsIDEsIDMgKyBpLCA0ICsgaiwgNSArIGspKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTI1Niw0OSArMjQzLDQ2IEBACiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2RhdGEzKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X3N0cmlkZWRfc2xpY2Vfd3JpdGVfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+CitzdGF0aWMgdm9pZCB0ZXN0X3N0cmlkZWRfc2xpY2Vfd3JpdGVfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgdHlwZWRlZiBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gVGVuc29yMmY7CiAgIHR5cGVkZWYgRWlnZW46OkRTaXplczxJbmRleFR5cGUsIDI+IEluZGV4MjsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gN0w7CiAgIEluZGV4VHlwZSBzaXplRGltMiA9IDExTDsKICAgYXJyYXk8SW5kZXhUeXBlLCAyPiB0ZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEsIHNpemVEaW0yfX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiB0ZW5zb3IodGVuc29yUmFuZ2UpLHRlbnNvcjIodGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yKHRlbnNvclJhbmdlKSwgdGVuc29yMih0ZW5zb3JSYW5nZSk7CiAgIEluZGV4VHlwZSBzbGljZURpbTEgPSAyOwogICBJbmRleFR5cGUgc2xpY2VEaW0yID0gMzsKICAgYXJyYXk8SW5kZXhUeXBlLCAyPiBzbGljZVJhbmdlID0ge3tzbGljZURpbTEsIHNsaWNlRGltMn19OwogICBUZW5zb3IyZiBzbGljZShzbGljZVJhbmdlKTsKLSAgSW5kZXgyIHN0cmlkZXMoMUwsMUwpOwotICBJbmRleDIgaW5kaWNlc1N0YXJ0KDNMLDRMKTsKLSAgSW5kZXgyIGluZGljZXNTdG9wKDVMLDdMKTsKLSAgSW5kZXgyIGxlbmd0aHMoMkwsM0wpOworICBJbmRleDIgc3RyaWRlcygxTCwgMUwpOworICBJbmRleDIgaW5kaWNlc1N0YXJ0KDNMLCA0TCk7CisgIEluZGV4MiBpbmRpY2VzU3RvcCg1TCwgN0wpOworICBJbmRleDIgbGVuZ3RocygyTCwgM0wpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YTEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhMiAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcjIuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhMyAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHNsaWNlLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHUxKGdwdV9kYXRhMSwgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsIHRlbnNvclJhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMixEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdTMoZ3B1X2RhdGEzLCBzbGljZVJhbmdlKTsKLQorICBEYXRhVHlwZSogZ3B1X2RhdGExID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGEyID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3IyLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhMyA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoc2xpY2Uuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUxKGdwdV9kYXRhMSwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUyKGdwdV9kYXRhMiwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUzKGdwdV9kYXRhMywgc2xpY2VSYW5nZSk7CiAKICAgdGVuc29yLnNldFJhbmRvbSgpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IuZGF0YSgpLCh0ZW5zb3Iuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSAgZ3B1Mi5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdTE7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YTEsIHRlbnNvci5kYXRhKCksICh0ZW5zb3Iuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBncHUyLmRldmljZShzeWNsX2RldmljZSkgPSBncHUxOwogCiAgIHNsaWNlLnNldFJhbmRvbSgpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGEzLCBzbGljZS5kYXRhKCksKHNsaWNlLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YTMsIHNsaWNlLmRhdGEoKSwgKHNsaWNlLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAorICBncHUxLnNsaWNlKGluZGljZXNTdGFydCwgbGVuZ3RocykuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdTM7CisgIGdwdTIuc3RyaWRlZFNsaWNlKGluZGljZXNTdGFydCwgaW5kaWNlc1N0b3AsIHN0cmlkZXMpLmRldmljZShzeWNsX2RldmljZSkgPSBncHUzOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yLmRhdGEoKSwgZ3B1X2RhdGExLCAodGVuc29yLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRlbnNvcjIuZGF0YSgpLCBncHVfZGF0YTIsICh0ZW5zb3IyLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAotICBncHUxLnNsaWNlKGluZGljZXNTdGFydCxsZW5ndGhzKS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdTM7Ci0gIGdwdTIuc3RyaWRlZFNsaWNlKGluZGljZXNTdGFydCxpbmRpY2VzU3RvcCxzdHJpZGVzKS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdTM7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0ZW5zb3IuZGF0YSgpLCBncHVfZGF0YTEsKHRlbnNvci5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yMi5kYXRhKCksIGdwdV9kYXRhMiwodGVuc29yMi5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotCi0gIGZvcihJbmRleFR5cGUgaT0wO2k8c2l6ZURpbTE7aSsrKQotICAgIGZvcihJbmRleFR5cGUgaj0wO2o8c2l6ZURpbTI7aisrKXsKLSAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaiksIHRlbnNvcjIoaSxqKSk7Ci0gIH0KKyAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCBzaXplRGltMTsgaSsrKQorICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgc2l6ZURpbTI7IGorKykgeworICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqKSwgdGVuc29yMihpLCBqKSk7CisgICAgfQogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9kYXRhMSk7CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2RhdGEyKTsKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfZGF0YTMpOwpAQCAtMzYzLDcgKzM0Nyw4IEBACiAgIHJldHVybiBoYXNfZXJyOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgZGV2X1NlbGVjdG9yPiB2b2lkIHN5Y2xfbW9ycGhpbmdfdGVzdF9wZXJfZGV2aWNlKGRldl9TZWxlY3RvciBzKXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgZGV2X1NlbGVjdG9yPgordm9pZCBzeWNsX21vcnBoaW5nX3Rlc3RfcGVyX2RldmljZShkZXZfU2VsZWN0b3IgcykgewogICBRdWV1ZUludGVyZmFjZSBxdWV1ZUludGVyZmFjZShzKTsKICAgYXV0byBzeWNsX2RldmljZSA9IEVpZ2VuOjpTeWNsRGV2aWNlKCZxdWV1ZUludGVyZmFjZSk7CiAgIHRlc3Rfc2ltcGxlX3NsaWNlPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwpAQCAtMzc2LDExICszNjEsMTAgQEAKICAgdGVzdF9zdHJpZGVkX3NsaWNlX3dyaXRlX3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CiAgIHRlc3Rfc3RyaWRlZF9zbGljZV9hc19yaHNfc3ljbDxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKICAgdGVzdF9zdHJpZGVkX3NsaWNlX2FzX3Joc19zeWNsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwotICBydW5fZWlnZW48ZmxvYXQsIFJvd01ham9yLCBsb25nLCBpbnQ+KHN5Y2xfZGV2aWNlKTsgCisgIHJ1bl9laWdlbjxmbG9hdCwgUm93TWFqb3IsIGxvbmcsIGludD4oc3ljbF9kZXZpY2UpOwogfQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9tb3JwaGluZ19zeWNsKQotewotICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6RWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfbW9ycGhpbmdfc3ljbCkgeworICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IEVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CiAgICAgQ0FMTF9TVUJURVNUKHN5Y2xfbW9ycGhpbmdfdGVzdF9wZXJfZGV2aWNlPGhhbGY+KGRldmljZSkpOwogICAgIENBTExfU1VCVEVTVChzeWNsX21vcnBoaW5nX3Rlc3RfcGVyX2RldmljZTxmbG9hdD4oZGV2aWNlKSk7CiAgIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX21vdmUuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbW92ZS5jcHAKaW5kZXggYTI5ODIzMS4uYTIxZWJiMSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbW92ZS5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfbW92ZS5jcHAKQEAgLTEyLDQ4ICsxMiw0NCBAQAogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KICNpbmNsdWRlIDx1dGlsaXR5PgogCi11c2luZyBFaWdlbjo6VGVuc29yOwogdXNpbmcgRWlnZW46OlJvd01ham9yOwordXNpbmcgRWlnZW46OlRlbnNvcjsKIAotc3RhdGljIHZvaWQgY2FsY19pbmRpY2VzKGludCBpLCBpbnQmIHgsIGludCYgeSwgaW50JiB6KQoteworc3RhdGljIHZvaWQgY2FsY19pbmRpY2VzKGludCBpLCBpbnQmIHgsIGludCYgeSwgaW50JiB6KSB7CiAgIHggPSBpIC8gNDsKICAgeSA9IChpICUgNCkgLyAyOwogICB6ID0gaSAlIDI7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfbW92ZSgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X21vdmUoKSB7CiAgIGludCB4OwogICBpbnQgeTsKICAgaW50IHo7CiAKLSAgVGVuc29yPGludCwzPiB0ZW5zb3IxKDIsIDIsIDIpOwotICBUZW5zb3I8aW50LDMsUm93TWFqb3I+IHRlbnNvcjIoMiwgMiwgMik7CisgIFRlbnNvcjxpbnQsIDM+IHRlbnNvcjEoMiwgMiwgMik7CisgIFRlbnNvcjxpbnQsIDMsIFJvd01ham9yPiB0ZW5zb3IyKDIsIDIsIDIpOwogCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKQotICB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgY2FsY19pbmRpY2VzKGksIHgsIHksIHopOwotICAgIHRlbnNvcjEoeCx5LHopID0gaTsKLSAgICB0ZW5zb3IyKHgseSx6KSA9IDIgKiBpOworICAgIHRlbnNvcjEoeCwgeSwgeikgPSBpOworICAgIHRlbnNvcjIoeCwgeSwgeikgPSAyICogaTsKICAgfQogCiAgIC8vIEludm9rZXMgdGhlIG1vdmUgY29uc3RydWN0b3IuCi0gIFRlbnNvcjxpbnQsMz4gbW92ZWRfdGVuc29yMSA9IHN0ZDo6bW92ZSh0ZW5zb3IxKTsKLSAgVGVuc29yPGludCwzLFJvd01ham9yPiBtb3ZlZF90ZW5zb3IyID0gc3RkOjptb3ZlKHRlbnNvcjIpOworICBUZW5zb3I8aW50LCAzPiBtb3ZlZF90ZW5zb3IxID0gc3RkOjptb3ZlKHRlbnNvcjEpOworICBUZW5zb3I8aW50LCAzLCBSb3dNYWpvcj4gbW92ZWRfdGVuc29yMiA9IHN0ZDo6bW92ZSh0ZW5zb3IyKTsKIAogICBWRVJJRllfSVNfRVFVQUwodGVuc29yMS5zaXplKCksIDApOwogICBWRVJJRllfSVNfRVFVQUwodGVuc29yMi5zaXplKCksIDApOwogCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKQotICB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgY2FsY19pbmRpY2VzKGksIHgsIHksIHopOwotICAgIFZFUklGWV9JU19FUVVBTChtb3ZlZF90ZW5zb3IxKHgseSx6KSwgaSk7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKG1vdmVkX3RlbnNvcjIoeCx5LHopLCAyICogaSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKG1vdmVkX3RlbnNvcjEoeCwgeSwgeiksIGkpOworICAgIFZFUklGWV9JU19FUVVBTChtb3ZlZF90ZW5zb3IyKHgsIHksIHopLCAyICogaSk7CiAgIH0KIAotICBUZW5zb3I8aW50LDM+IG1vdmVkX3RlbnNvcjMoMiwyLDIpOwotICBUZW5zb3I8aW50LDMsUm93TWFqb3I+IG1vdmVkX3RlbnNvcjQoMiwyLDIpOworICBUZW5zb3I8aW50LCAzPiBtb3ZlZF90ZW5zb3IzKDIsIDIsIDIpOworICBUZW5zb3I8aW50LCAzLCBSb3dNYWpvcj4gbW92ZWRfdGVuc29yNCgyLCAyLCAyKTsKIAogICBtb3ZlZF90ZW5zb3IzLnNldFplcm8oKTsKICAgbW92ZWRfdGVuc29yNC5zZXRaZXJvKCk7CkBAIC02MiwxNSArNTgsMTEgQEAKICAgbW92ZWRfdGVuc29yMyA9IHN0ZDo6bW92ZShtb3ZlZF90ZW5zb3IxKTsKICAgbW92ZWRfdGVuc29yNCA9IHN0ZDo6bW92ZShtb3ZlZF90ZW5zb3IyKTsKIAotICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykKLSAgeworICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgewogICAgIGNhbGNfaW5kaWNlcyhpLCB4LCB5LCB6KTsKLSAgICBWRVJJRllfSVNfRVFVQUwobW92ZWRfdGVuc29yMyh4LHkseiksIGkpOwotICAgIFZFUklGWV9JU19FUVVBTChtb3ZlZF90ZW5zb3I0KHgseSx6KSwgMiAqIGkpOworICAgIFZFUklGWV9JU19FUVVBTChtb3ZlZF90ZW5zb3IzKHgsIHksIHopLCBpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwobW92ZWRfdGVuc29yNCh4LCB5LCB6KSwgMiAqIGkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfbW92ZSkKLXsKLSAgQ0FMTF9TVUJURVNUKHRlc3RfbW92ZSgpKTsKLX0KK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfbW92ZSkgeyBDQUxMX1NVQlRFU1QodGVzdF9tb3ZlKCkpOyB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9ub3RpZmljYXRpb24uY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfbm90aWZpY2F0aW9uLmNwcAppbmRleCA4ZTgxNjUzLi4yMTczODY2IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9ub3RpZmljYXRpb24uY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX25vdGlmaWNhdGlvbi5jcHAKQEAgLTE1LDEzICsxNSwxNSBAQAogI2luY2x1ZGUgIm1haW4uaCIKICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CiAKLXN0YXRpYyB2b2lkIHRlc3Rfbm90aWZpY2F0aW9uX3NpbmdsZSgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X25vdGlmaWNhdGlvbl9zaW5nbGUoKSB7CiAgIFRocmVhZFBvb2wgdGhyZWFkX3Bvb2woMSk7CiAKICAgc3RkOjphdG9taWM8aW50PiBjb3VudGVyKDApOwogICBFaWdlbjo6Tm90aWZpY2F0aW9uIG47Ci0gIGF1dG8gZnVuYyA9IFsmbiwgJmNvdW50ZXJdKCl7IG4uV2FpdCgpOyArK2NvdW50ZXI7fTsKKyAgYXV0byBmdW5jID0gWyZuLCAmY291bnRlcl0oKSB7CisgICAgbi5XYWl0KCk7CisgICAgKytjb3VudGVyOworICB9OwogICB0aHJlYWRfcG9vbC5TY2hlZHVsZShmdW5jKTsKICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwMCkpOwogCkBAIC0zOSwxMyArNDEsMTUgQEAKIAogLy8gTGlrZSB0ZXN0X25vdGlmaWNhdGlvbl9zaW5nbGUoKSBidXQgZW5xdWV1ZXMgbXVsdGlwbGUgdGhyZWFkcyB0bwogLy8gdmFsaWRhdGUgdGhhdCBhbGwgdGhyZWFkcyBnZXQgbm90aWZpZWQgYnkgTm90aWZ5KCkuCi1zdGF0aWMgdm9pZCB0ZXN0X25vdGlmaWNhdGlvbl9tdWx0aXBsZSgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X25vdGlmaWNhdGlvbl9tdWx0aXBsZSgpIHsKICAgVGhyZWFkUG9vbCB0aHJlYWRfcG9vbCgxKTsKIAogICBzdGQ6OmF0b21pYzxpbnQ+IGNvdW50ZXIoMCk7CiAgIEVpZ2VuOjpOb3RpZmljYXRpb24gbjsKLSAgYXV0byBmdW5jID0gWyZuLCAmY291bnRlcl0oKXsgbi5XYWl0KCk7ICsrY291bnRlcjt9OworICBhdXRvIGZ1bmMgPSBbJm4sICZjb3VudGVyXSgpIHsKKyAgICBuLldhaXQoKTsKKyAgICArK2NvdW50ZXI7CisgIH07CiAgIHRocmVhZF9wb29sLlNjaGVkdWxlKGZ1bmMpOwogICB0aHJlYWRfcG9vbC5TY2hlZHVsZShmdW5jKTsKICAgdGhyZWFkX3Bvb2wuU2NoZWR1bGUoZnVuYyk7CkBAIC01Nyw4ICs2MSw3IEBACiAgIFZFUklGWV9JU19FUVVBTChjb3VudGVyLCA0KTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9ub3RpZmljYXRpb24pCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX25vdGlmaWNhdGlvbikgewogICBDQUxMX1NVQlRFU1QodGVzdF9ub3RpZmljYXRpb25fc2luZ2xlKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9ub3RpZmljYXRpb25fbXVsdGlwbGUoKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9vZl9iZmxvYXQxNl9ncHUuY3UgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9vZl9iZmxvYXQxNl9ncHUuY3UKaW5kZXggMTA0OThlNi4uNzIyYzkyZiAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2ZfYmZsb2F0MTZfZ3B1LmN1CisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX29mX2JmbG9hdDE2X2dwdS5jdQpAQCAtMTYsMTAgKzE2LDkgQEAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGVuc29yPgogCi0KIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKLXRlbXBsYXRlPHR5cGVuYW1lPgordGVtcGxhdGUgPHR5cGVuYW1lPgogdm9pZCB0ZXN0X2dwdV9udW1leHQoKSB7CiAgIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOwogICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CkBAIC0yOSwyMiArMjgsMjAgQEAKICAgYm9vbCogZF9yZXNfYmZsb2F0MTYgPSAoYm9vbCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihib29sKSk7CiAgIGJvb2wqIGRfcmVzX2Zsb2F0ID0gKGJvb2wqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoYm9vbCkpOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoCi0gICAgICBkX2Zsb2F0LCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxib29sLCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfYmZsb2F0MTYoCi0gICAgICBkX3Jlc19iZmxvYXQxNiwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8Ym9vbCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KAotICAgICAgZF9yZXNfZmxvYXQsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdChkX2Zsb2F0LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxib29sLCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfYmZsb2F0MTYoZF9yZXNfYmZsb2F0MTYsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGJvb2wsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdChkX3Jlc19mbG9hdCwgbnVtX2VsZW0pOwogCiAgIGdwdV9mbG9hdC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQucmFuZG9tKCkgLSBncHVfZmxvYXQuY29uc3RhbnQoMC41Zik7CiAgIGdwdV9yZXNfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LnVuYXJ5RXhwcihFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pc25hbl9vcDxmbG9hdD4oKSk7CiAgIC8vIFRlc3QgYmZsb2F0MTYgc3BlY2lmaWMgaXNuYW4gb3AuCi0gIGdwdV9yZXNfYmZsb2F0MTYuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpLnVuYXJ5RXhwcihFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pc25hbl9vcDxFaWdlbjo6YmZsb2F0MTY+KCkpOworICBncHVfcmVzX2JmbG9hdDE2LmRldmljZShncHVfZGV2aWNlKSA9CisgICAgICBncHVfZmxvYXQuY2FzdDxFaWdlbjo6YmZsb2F0MTY+KCkudW5hcnlFeHByKEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX2lzbmFuX29wPEVpZ2VuOjpiZmxvYXQxNj4oKSk7CiAKICAgVGVuc29yPGJvb2wsIDE+IGJmbG9hdDE2X3ByZWMobnVtX2VsZW0pOwogICBUZW5zb3I8Ym9vbCwgMT4gZnVsbF9wcmVjKG51bV9lbGVtKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoYmZsb2F0MTZfcHJlYy5kYXRhKCksIGRfcmVzX2JmbG9hdDE2LCBudW1fZWxlbSpzaXplb2YoYm9vbCkpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKGJvb2wpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoYmZsb2F0MTZfcHJlYy5kYXRhKCksIGRfcmVzX2JmbG9hdDE2LCBudW1fZWxlbSAqIHNpemVvZihib29sKSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihib29sKSk7CiAgIGdwdV9kZXZpY2Uuc3luY2hyb25pemUoKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbGVtOyArK2kpIHsKQEAgLTU2LDEwICs1Myw5IEBACiAgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX3Jlc19mbG9hdCk7CiB9CiAKLQogI2lmZGVmIEVJR0VOX0hBU19HUFVfQkYxNgogCi10ZW1wbGF0ZTx0eXBlbmFtZT4KK3RlbXBsYXRlIDx0eXBlbmFtZT4KIHZvaWQgdGVzdF9ncHVfY29udmVyc2lvbigpIHsKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKQEAgLTY5LDEyICs2NSw5IEBACiAgIEVpZ2VuOjpiZmxvYXQxNiogZF9iZmxvYXQxNiA9IChFaWdlbjo6YmZsb2F0MTYqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmJmbG9hdDE2KSk7CiAgIGZsb2F0KiBkX2NvbnYgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0KAotICAgICAgZF9mbG9hdCwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmJmbG9hdDE2LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9iZmxvYXQxNigKLSAgICAgIGRfYmZsb2F0MTYsIG51bV9lbGVtKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9jb252KAotICAgICAgZF9jb252LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoZF9mbG9hdCwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmJmbG9hdDE2LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9iZmxvYXQxNihkX2JmbG9hdDE2LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfY29udihkX2NvbnYsIG51bV9lbGVtKTsKIAogICBncHVfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LnJhbmRvbSgpOwogICBncHVfYmZsb2F0MTYuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpOwpAQCAtODIsOCArNzUsOCBAQAogCiAgIFRlbnNvcjxmbG9hdCwgMT4gaW5pdGlhbChudW1fZWxlbSk7CiAgIFRlbnNvcjxmbG9hdCwgMT4gZmluYWwobnVtX2VsZW0pOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbml0aWFsLmRhdGEoKSwgZF9mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZpbmFsLmRhdGEoKSwgZF9jb252LCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5pdGlhbC5kYXRhKCksIGRfZmxvYXQsIG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZpbmFsLmRhdGEoKSwgZF9jb252LCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgewogICAgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8RWlnZW46OmJmbG9hdDE2Pihpbml0aWFsKGkpKSwgc3RhdGljX2Nhc3Q8RWlnZW46OmJmbG9hdDE2PihmaW5hbChpKSkpOwpAQCAtOTQsNyArODcsNyBAQAogICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9jb252KTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+CiB2b2lkIHRlc3RfZ3B1X3VuYXJ5KCkgewogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwpAQCAtMTA0LDEyICs5Nyw5IEBACiAgIGZsb2F0KiBkX3Jlc19iZmxvYXQxNiA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogICBmbG9hdCogZF9yZXNfZmxvYXQgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0KAotICAgICAgZF9mbG9hdCwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19iZmxvYXQxNigKLSAgICAgIGRfcmVzX2JmbG9hdDE2LCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KAotICAgICAgZF9yZXNfZmxvYXQsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdChkX2Zsb2F0LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2JmbG9hdDE2KGRfcmVzX2JmbG9hdDE2LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KGRfcmVzX2Zsb2F0LCBudW1fZWxlbSk7CiAKICAgZ3B1X2Zsb2F0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC5yYW5kb20oKSAtIGdwdV9mbG9hdC5jb25zdGFudCgwLjVmKTsKICAgZ3B1X2Zsb2F0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC5jYXN0PEVpZ2VuOjpiZmxvYXQxNj4oKS5jYXN0PGZsb2F0PigpOwpAQCAtMTE4LDggKzEwOCw4IEBACiAKICAgVGVuc29yPGZsb2F0LCAxPiBiZmxvYXQxNl9wcmVjKG51bV9lbGVtKTsKICAgVGVuc29yPGZsb2F0LCAxPiBmdWxsX3ByZWMobnVtX2VsZW0pOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChiZmxvYXQxNl9wcmVjLmRhdGEoKSwgZF9yZXNfYmZsb2F0MTYsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGJmbG9hdDE2X3ByZWMuZGF0YSgpLCBkX3Jlc19iZmxvYXQxNiwgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsIG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAgIGdwdV9kZXZpY2Uuc3luY2hyb25pemUoKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbGVtOyArK2kpIHsKQEAgLTEzMSw3ICsxMjEsNyBAQAogICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXNfZmxvYXQpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZT4KK3RlbXBsYXRlIDx0eXBlbmFtZT4KIHZvaWQgdGVzdF9ncHVfZWxlbWVudHdpc2UoKSB7CiAgIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOwogICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CkBAIC0xNDIsMjYgKzEzMiwyNCBAQAogICBmbG9hdCogZF9yZXNfYmZsb2F0MTYgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKICAgZmxvYXQqIGRfcmVzX2Zsb2F0ID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdDEoCi0gICAgICBkX2Zsb2F0MSwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0MigKLSAgICAgIGRfZmxvYXQyLCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2JmbG9hdDE2KAotICAgICAgZF9yZXNfYmZsb2F0MTYsIG51bV9lbGVtKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfZmxvYXQoCi0gICAgICBkX3Jlc19mbG9hdCwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0MShkX2Zsb2F0MSwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0MihkX2Zsb2F0MiwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19iZmxvYXQxNihkX3Jlc19iZmxvYXQxNiwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdChkX3Jlc19mbG9hdCwgbnVtX2VsZW0pOwogCiAgIGdwdV9mbG9hdDEuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0MS5yYW5kb20oKTsKICAgZ3B1X2Zsb2F0MS5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQxLmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpLmNhc3Q8ZmxvYXQ+KCk7CiAgIGdwdV9mbG9hdDIuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0Mi5yYW5kb20oKTsKICAgZ3B1X2Zsb2F0Mi5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQyLmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpLmNhc3Q8ZmxvYXQ+KCk7CiAgIGdwdV9yZXNfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gKGdwdV9mbG9hdDEgKyBncHVfZmxvYXQyKSAqIGdwdV9mbG9hdDE7Ci0gIGdwdV9yZXNfYmZsb2F0MTYuZGV2aWNlKGdwdV9kZXZpY2UpID0gKChncHVfZmxvYXQxLmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpICsgZ3B1X2Zsb2F0Mi5jYXN0PEVpZ2VuOjpiZmxvYXQxNj4oKSkgKiBncHVfZmxvYXQxLmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpKS5jYXN0PGZsb2F0PigpOworICBncHVfcmVzX2JmbG9hdDE2LmRldmljZShncHVfZGV2aWNlKSA9CisgICAgICAoKGdwdV9mbG9hdDEuY2FzdDxFaWdlbjo6YmZsb2F0MTY+KCkgKyBncHVfZmxvYXQyLmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpKSAqIGdwdV9mbG9hdDEuY2FzdDxFaWdlbjo6YmZsb2F0MTY+KCkpCisgICAgICAgICAgLmNhc3Q8ZmxvYXQ+KCk7CiAKICAgVGVuc29yPGZsb2F0LCAxPiBiZmxvYXQxNl9wcmVjKG51bV9lbGVtKTsKICAgVGVuc29yPGZsb2F0LCAxPiBmdWxsX3ByZWMobnVtX2VsZW0pOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChiZmxvYXQxNl9wcmVjLmRhdGEoKSwgZF9yZXNfYmZsb2F0MTYsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGJmbG9hdDE2X3ByZWMuZGF0YSgpLCBkX3Jlc19iZmxvYXQxNiwgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsIG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAgIGdwdV9kZXZpY2Uuc3luY2hyb25pemUoKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbGVtOyArK2kpIHsKQEAgLTE3NCw3ICsxNjIsNyBAQAogICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXNfZmxvYXQpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZT4KK3RlbXBsYXRlIDx0eXBlbmFtZT4KIHZvaWQgdGVzdF9ncHVfdHJhbmNlbmRlbnRhbCgpIHsKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKQEAgLTIzNCwyMyArMjIyLDIzIEBACiAgIFRlbnNvcjxmbG9hdCwgMT4gaW5wdXQzKG51bV9lbGVtKTsKICAgVGVuc29yPEVpZ2VuOjpiZmxvYXQxNiwgMT4gYmZsb2F0MTZfcHJlYzMobnVtX2VsZW0pOwogICBUZW5zb3I8RWlnZW46OmJmbG9hdDE2LCAxPiBmdWxsX3ByZWMzKG51bV9lbGVtKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5wdXQxLmRhdGEoKSwgZF9mbG9hdDEsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbnB1dDIuZGF0YSgpLCBkX2Zsb2F0MiwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGlucHV0My5kYXRhKCksIGRfZmxvYXQzLCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoYmZsb2F0MTZfcHJlYzEuZGF0YSgpLCBkX3JlczFfYmZsb2F0MTYsIG51bV9lbGVtKnNpemVvZihFaWdlbjo6YmZsb2F0MTYpKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjMS5kYXRhKCksIGRfcmVzMV9mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKEVpZ2VuOjpiZmxvYXQxNikpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChiZmxvYXQxNl9wcmVjMi5kYXRhKCksIGRfcmVzMl9iZmxvYXQxNiwgbnVtX2VsZW0qc2l6ZW9mKEVpZ2VuOjpiZmxvYXQxNikpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMyLmRhdGEoKSwgZF9yZXMyX2Zsb2F0LCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmJmbG9hdDE2KSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGJmbG9hdDE2X3ByZWMzLmRhdGEoKSwgZF9yZXMzX2JmbG9hdDE2LCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmJmbG9hdDE2KSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYzMuZGF0YSgpLCBkX3JlczNfZmxvYXQsIG51bV9lbGVtKnNpemVvZihFaWdlbjo6YmZsb2F0MTYpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5wdXQxLmRhdGEoKSwgZF9mbG9hdDEsIG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGlucHV0Mi5kYXRhKCksIGRfZmxvYXQyLCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbnB1dDMuZGF0YSgpLCBkX2Zsb2F0MywgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoYmZsb2F0MTZfcHJlYzEuZGF0YSgpLCBkX3JlczFfYmZsb2F0MTYsIG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpiZmxvYXQxNikpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMxLmRhdGEoKSwgZF9yZXMxX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6YmZsb2F0MTYpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoYmZsb2F0MTZfcHJlYzIuZGF0YSgpLCBkX3JlczJfYmZsb2F0MTYsIG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpiZmxvYXQxNikpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMyLmRhdGEoKSwgZF9yZXMyX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6YmZsb2F0MTYpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoYmZsb2F0MTZfcHJlYzMuZGF0YSgpLCBkX3JlczNfYmZsb2F0MTYsIG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpiZmxvYXQxNikpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMzLmRhdGEoKSwgZF9yZXMzX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6YmZsb2F0MTYpKTsKICAgZ3B1X2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgewogICAgIFZFUklGWV9JU19BUFBST1goZnVsbF9wcmVjMShpKSwgYmZsb2F0MTZfcHJlYzEoaSkpOwogICB9CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgewotICAgIGlmKHN0ZDo6YWJzKGlucHV0MihpKS0xLmYpPDAuMDVmKSAvLyBsb2cgbGFja3MgYWNjdXJhY3kgbmVhcmJ5IDEKLSAgICAgIFZFUklGWV9JU19BUFBST1goZnVsbF9wcmVjMihpKStFaWdlbjo6YmZsb2F0MTYoMC4xZiksIGJmbG9hdDE2X3ByZWMyKGkpK0VpZ2VuOjpiZmxvYXQxNigwLjFmKSk7CisgICAgaWYgKHN0ZDo6YWJzKGlucHV0MihpKSAtIDEuZikgPCAwLjA1ZikgIC8vIGxvZyBsYWNrcyBhY2N1cmFjeSBuZWFyYnkgMQorICAgICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3ByZWMyKGkpICsgRWlnZW46OmJmbG9hdDE2KDAuMWYpLCBiZmxvYXQxNl9wcmVjMihpKSArIEVpZ2VuOjpiZmxvYXQxNigwLjFmKSk7CiAgICAgZWxzZQogICAgICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3ByZWMyKGkpLCBiZmxvYXQxNl9wcmVjMihpKSk7CiAgIH0KQEAgLTI2OCwyNyArMjU2LDIzIEBACiAgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX3JlczNfYmZsb2F0MTYpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZT4KK3RlbXBsYXRlIDx0eXBlbmFtZT4KIHZvaWQgdGVzdF9ncHVfY29udHJhY3Rpb25zKCkgewogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogICBpbnQgcm93cyA9IDIzOwogICBpbnQgY29scyA9IDIzOwotICBpbnQgbnVtX2VsZW0gPSByb3dzKmNvbHM7CisgIGludCBudW1fZWxlbSA9IHJvd3MgKiBjb2xzOwogCiAgIGZsb2F0KiBkX2Zsb2F0MSA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogICBmbG9hdCogZF9mbG9hdDIgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKICAgRWlnZW46OmJmbG9hdDE2KiBkX3Jlc19iZmxvYXQxNiA9IChFaWdlbjo6YmZsb2F0MTYqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmJmbG9hdDE2KSk7CiAgIEVpZ2VuOjpiZmxvYXQxNiogZF9yZXNfZmxvYXQgPSAoRWlnZW46OmJmbG9hdDE2KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpiZmxvYXQxNikpOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQxKAotICAgICAgZF9mbG9hdDEsIHJvd3MsIGNvbHMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0MigKLSAgICAgIGRfZmxvYXQyLCByb3dzLCBjb2xzKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpiZmxvYXQxNiwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2JmbG9hdDE2KAotICAgICAgZF9yZXNfYmZsb2F0MTYsIHJvd3MsIGNvbHMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmJmbG9hdDE2LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfZmxvYXQoCi0gICAgICBkX3Jlc19mbG9hdCwgcm93cywgY29scyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQxKGRfZmxvYXQxLCByb3dzLCBjb2xzKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdDIoZF9mbG9hdDIsIHJvd3MsIGNvbHMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmJmbG9hdDE2LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfYmZsb2F0MTYoZF9yZXNfYmZsb2F0MTYsIHJvd3MsIGNvbHMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmJmbG9hdDE2LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfZmxvYXQoZF9yZXNfZmxvYXQsIHJvd3MsIGNvbHMpOwogCiAgIGdwdV9mbG9hdDEuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0MS5yYW5kb20oKSAtIGdwdV9mbG9hdDEuY29uc3RhbnQoMC41Zik7CiAgIGdwdV9mbG9hdDIuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0Mi5yYW5kb20oKSAtIGdwdV9mbG9hdDIuY29uc3RhbnQoMC41Zik7CkBAIC0yOTYsMTIgKzI4MCwxMyBAQAogICB0eXBlZGVmIFRlbnNvcjxmbG9hdCwgMj46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKICAgRWlnZW46OmFycmF5PERpbVBhaXIsIDE+IGRpbXMoRGltUGFpcigxLCAwKSk7CiAgIGdwdV9yZXNfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0MS5jb250cmFjdChncHVfZmxvYXQyLCBkaW1zKS5jYXN0PEVpZ2VuOjpiZmxvYXQxNj4oKTsKLSAgZ3B1X3Jlc19iZmxvYXQxNi5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQxLmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpLmNvbnRyYWN0KGdwdV9mbG9hdDIuY2FzdDxFaWdlbjo6YmZsb2F0MTY+KCksIGRpbXMpOworICBncHVfcmVzX2JmbG9hdDE2LmRldmljZShncHVfZGV2aWNlKSA9CisgICAgICBncHVfZmxvYXQxLmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpLmNvbnRyYWN0KGdwdV9mbG9hdDIuY2FzdDxFaWdlbjo6YmZsb2F0MTY+KCksIGRpbXMpOwogCiAgIFRlbnNvcjxFaWdlbjo6YmZsb2F0MTYsIDI+IGJmbG9hdDE2X3ByZWMocm93cywgY29scyk7CiAgIFRlbnNvcjxFaWdlbjo6YmZsb2F0MTYsIDI+IGZ1bGxfcHJlYyhyb3dzLCBjb2xzKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoYmZsb2F0MTZfcHJlYy5kYXRhKCksIGRfcmVzX2JmbG9hdDE2LCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmJmbG9hdDE2KSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmJmbG9hdDE2KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGJmbG9hdDE2X3ByZWMuZGF0YSgpLCBkX3Jlc19iZmxvYXQxNiwgbnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmJmbG9hdDE2KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6YmZsb2F0MTYpKTsKICAgZ3B1X2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgKytpKSB7CkBAIC0zMTgsMjMgKzMwMywyMCBAQAogICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXNfZmxvYXQpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZT4KK3RlbXBsYXRlIDx0eXBlbmFtZT4KIHZvaWQgdGVzdF9ncHVfcmVkdWN0aW9ucyhpbnQgc2l6ZTEsIGludCBzaXplMiwgaW50IHJlZHV4KSB7CiAgIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOwogICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7Ci0gIGludCBudW1fZWxlbSA9IHNpemUxKnNpemUyOworICBpbnQgbnVtX2VsZW0gPSBzaXplMSAqIHNpemUyOwogICBpbnQgcmVzdWx0X3NpemUgPSAocmVkdXggPT0gMSA/IHNpemUxIDogc2l6ZTIpOwogCiAgIGZsb2F0KiBkX2Zsb2F0ID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAgIEVpZ2VuOjpiZmxvYXQxNiogZF9yZXNfYmZsb2F0MTYgPSAoRWlnZW46OmJmbG9hdDE2KilncHVfZGV2aWNlLmFsbG9jYXRlKHJlc3VsdF9zaXplICogc2l6ZW9mKEVpZ2VuOjpiZmxvYXQxNikpOwogICBFaWdlbjo6YmZsb2F0MTYqIGRfcmVzX2Zsb2F0ID0gKEVpZ2VuOjpiZmxvYXQxNiopZ3B1X2RldmljZS5hbGxvY2F0ZShyZXN1bHRfc2l6ZSAqIHNpemVvZihFaWdlbjo6YmZsb2F0MTYpKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0KAotICAgICAgZF9mbG9hdCwgc2l6ZTEsIHNpemUyKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpiZmxvYXQxNiwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2JmbG9hdDE2KAotICAgICAgZF9yZXNfYmZsb2F0MTYsIHJlc3VsdF9zaXplKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpiZmxvYXQxNiwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KAotICAgICAgZF9yZXNfZmxvYXQsIHJlc3VsdF9zaXplKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdChkX2Zsb2F0LCBzaXplMSwgc2l6ZTIpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmJmbG9hdDE2LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfYmZsb2F0MTYoZF9yZXNfYmZsb2F0MTYsIHJlc3VsdF9zaXplKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpiZmxvYXQxNiwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KGRfcmVzX2Zsb2F0LCByZXN1bHRfc2l6ZSk7CiAKICAgZ3B1X2Zsb2F0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC5yYW5kb20oKSAqIDIuMGY7CiAKQEAgLTM0NCw4ICszMjYsOCBAQAogCiAgIFRlbnNvcjxFaWdlbjo6YmZsb2F0MTYsIDE+IGJmbG9hdDE2X3ByZWMocmVzdWx0X3NpemUpOwogICBUZW5zb3I8RWlnZW46OmJmbG9hdDE2LCAxPiBmdWxsX3ByZWMocmVzdWx0X3NpemUpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChiZmxvYXQxNl9wcmVjLmRhdGEoKSwgZF9yZXNfYmZsb2F0MTYsIHJlc3VsdF9zaXplKnNpemVvZihFaWdlbjo6YmZsb2F0MTYpKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsIHJlc3VsdF9zaXplKnNpemVvZihFaWdlbjo6YmZsb2F0MTYpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoYmZsb2F0MTZfcHJlYy5kYXRhKCksIGRfcmVzX2JmbG9hdDE2LCByZXN1bHRfc2l6ZSAqIHNpemVvZihFaWdlbjo6YmZsb2F0MTYpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsIHJlc3VsdF9zaXplICogc2l6ZW9mKEVpZ2VuOjpiZmxvYXQxNikpOwogICBncHVfZGV2aWNlLnN5bmNocm9uaXplKCk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRfc2l6ZTsgKytpKSB7CkBAIC0zNTcsNyArMzM5LDcgQEAKICAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfcmVzX2Zsb2F0KTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+CiB2b2lkIHRlc3RfZ3B1X3JlZHVjdGlvbnMoKSB7CiAgIHRlc3RfZ3B1X3JlZHVjdGlvbnM8dm9pZD4oMTMsIDEzLCAwKTsKICAgdGVzdF9ncHVfcmVkdWN0aW9uczx2b2lkPigxMywgMTMsIDEpOwpAQCAtMzY5LDIzICszNTEsMjAgQEAKICAgdGVzdF9ncHVfcmVkdWN0aW9uczx2b2lkPigzNiwgMzUsIDEpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZT4KK3RlbXBsYXRlIDx0eXBlbmFtZT4KIHZvaWQgdGVzdF9ncHVfZnVsbF9yZWR1Y3Rpb25zKCkgewogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogICBpbnQgc2l6ZSA9IDEzOwotICBpbnQgbnVtX2VsZW0gPSBzaXplKnNpemU7CisgIGludCBudW1fZWxlbSA9IHNpemUgKiBzaXplOwogCiAgIGZsb2F0KiBkX2Zsb2F0ID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAgIEVpZ2VuOjpiZmxvYXQxNiogZF9yZXNfYmZsb2F0MTYgPSAoRWlnZW46OmJmbG9hdDE2KilncHVfZGV2aWNlLmFsbG9jYXRlKDEgKiBzaXplb2YoRWlnZW46OmJmbG9hdDE2KSk7CiAgIEVpZ2VuOjpiZmxvYXQxNiogZF9yZXNfZmxvYXQgPSAoRWlnZW46OmJmbG9hdDE2KilncHVfZGV2aWNlLmFsbG9jYXRlKDEgKiBzaXplb2YoRWlnZW46OmJmbG9hdDE2KSk7CiAKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdCgKLSAgICAgIGRfZmxvYXQsIHNpemUsIHNpemUpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmJmbG9hdDE2LCAwPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfYmZsb2F0MTYoCi0gICAgICBkX3Jlc19iZmxvYXQxNik7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6YmZsb2F0MTYsIDA+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdCgKLSAgICAgIGRfcmVzX2Zsb2F0KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdChkX2Zsb2F0LCBzaXplLCBzaXplKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpiZmxvYXQxNiwgMD4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2JmbG9hdDE2KGRfcmVzX2JmbG9hdDE2KTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpiZmxvYXQxNiwgMD4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KGRfcmVzX2Zsb2F0KTsKIAogICBncHVfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LnJhbmRvbSgpOwogCkBAIC00MTMsOSArMzkyLDggQEAKICAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfcmVzX2Zsb2F0KTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+CiB2b2lkIHRlc3RfZ3B1X2ZvcmNlZF9ldmFscygpIHsKLQogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogICBpbnQgbnVtX2VsZW0gPSAxMDE7CkBAIC00MjUsMTQgKzQwMywxMCBAQAogICBmbG9hdCogZF9yZXNfYmZsb2F0MTZfMiA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogICBmbG9hdCogZF9yZXNfZmxvYXQgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0KAotICAgICAgZF9mbG9hdCwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19iZmxvYXQxNl8xKAotICAgICAgZF9yZXNfYmZsb2F0MTZfMSwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6VW5hbGlnbmVkPiBncHVfcmVzX2JmbG9hdDE2XzIoCi0gICAgICBkX3Jlc19iZmxvYXQxNl8yLCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KAotICAgICAgZF9yZXNfZmxvYXQsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdChkX2Zsb2F0LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2JmbG9hdDE2XzEoZF9yZXNfYmZsb2F0MTZfMSwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6VW5hbGlnbmVkPiBncHVfcmVzX2JmbG9hdDE2XzIoZF9yZXNfYmZsb2F0MTZfMiwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdChkX3Jlc19mbG9hdCwgbnVtX2VsZW0pOwogCiAgIEVpZ2VuOjphcnJheTxpbnQsIDE+IG5vX2JjYXN0OwogICBub19iY2FzdFswXSA9IDE7CkBAIC00NDEsMTQgKzQxNSwxNSBAQAogICBncHVfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpLmNhc3Q8ZmxvYXQ+KCk7CiAgIGdwdV9yZXNfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LmFicygpOwogICBncHVfcmVzX2JmbG9hdDE2XzEuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpLmFicygpLmV2YWwoKS5jYXN0PGZsb2F0PigpOwotICBncHVfcmVzX2JmbG9hdDE2XzIuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpLmFicygpLmJyb2FkY2FzdChub19iY2FzdCkuZXZhbCgpLmNhc3Q8ZmxvYXQ+KCk7CisgIGdwdV9yZXNfYmZsb2F0MTZfMi5kZXZpY2UoZ3B1X2RldmljZSkgPQorICAgICAgZ3B1X2Zsb2F0LmNhc3Q8RWlnZW46OmJmbG9hdDE2PigpLmFicygpLmJyb2FkY2FzdChub19iY2FzdCkuZXZhbCgpLmNhc3Q8ZmxvYXQ+KCk7CiAKICAgVGVuc29yPGZsb2F0LCAxPiBiZmxvYXQxNl9wcmVjMShudW1fZWxlbSk7CiAgIFRlbnNvcjxmbG9hdCwgMT4gYmZsb2F0MTZfcHJlYzIobnVtX2VsZW0pOwogICBUZW5zb3I8ZmxvYXQsIDE+IGZ1bGxfcHJlYyhudW1fZWxlbSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGJmbG9hdDE2X3ByZWMxLmRhdGEoKSwgZF9yZXNfYmZsb2F0MTZfMSwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGJmbG9hdDE2X3ByZWMyLmRhdGEoKSwgZF9yZXNfYmZsb2F0MTZfMiwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoYmZsb2F0MTZfcHJlYzEuZGF0YSgpLCBkX3Jlc19iZmxvYXQxNl8xLCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChiZmxvYXQxNl9wcmVjMi5kYXRhKCksIGRfcmVzX2JmbG9hdDE2XzIsIG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogICBncHVfZGV2aWNlLnN5bmNocm9uaXplKCk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZWxlbTsgKytpKSB7CkBAIC00NjQsOCArNDM5LDcgQEAKIAogI2VuZGlmCiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3Jfb2ZfYmZsb2F0MTZfZ3B1KQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9vZl9iZmxvYXQxNl9ncHUpIHsKICAgQ0FMTF9TVUJURVNUXzEodGVzdF9ncHVfbnVtZXh0PHZvaWQ+KCkpOwogCiAvLyBUaGUgcmVkdWN0aW9uIHVuaXQgdGVzdHMgaGF2ZSBiZWVuIGV4Y2x1ZGVkIHVudGlsIGEgd29ya2luZwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2ZfY29tcGxleC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9vZl9jb21wbGV4LmNwcAppbmRleCBiMmY1OTk0Li5kMzRlZGJkIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9vZl9jb21wbGV4LmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9vZl9jb21wbGV4LmNwcApAQCAtMTQsMTAgKzE0LDcgQEAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiB1c2luZyBFaWdlbjo6VGVuc29yTWFwOwogCi0KLQotc3RhdGljIHZvaWQgdGVzdF9hZGRpdGlvbnMoKQoteworc3RhdGljIHZvaWQgdGVzdF9hZGRpdGlvbnMoKSB7CiAgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxPiBkYXRhMSgzKTsKICAgVGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDE+IGRhdGEyKDMpOwogICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewpAQCAtMjcsMTMgKzI0LDExIEBACiAKICAgVGVuc29yPHN0ZDo6Y29tcGxleDxmbG9hdD4sIDE+IHN1bSA9IGRhdGExICsgZGF0YTI7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHN1bShpKSwgIHN0ZDo6Y29tcGxleDxmbG9hdD4oMippLCA2KmkpKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoc3VtKGkpLCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KDIgKiBpLCA2ICogaSkpOwogICB9CiB9CiAKLQotc3RhdGljIHZvaWQgdGVzdF9hYnMoKQoteworc3RhdGljIHZvaWQgdGVzdF9hYnMoKSB7CiAgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxPiBkYXRhMSgzKTsKICAgVGVuc29yPHN0ZDo6Y29tcGxleDxkb3VibGU+LCAxPiBkYXRhMigzKTsKICAgZGF0YTEuc2V0UmFuZG9tKCk7CkBAIC00Nyw4ICs0Miw3IEBACiAgIH0KIH0KIAotc3RhdGljIHZvaWQgdGVzdF9hcmcoKQoteworc3RhdGljIHZvaWQgdGVzdF9hcmcoKSB7CiAgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxPiBkYXRhMSgzKTsKICAgVGVuc29yPHN0ZDo6Y29tcGxleDxkb3VibGU+LCAxPiBkYXRhMigzKTsKICAgZGF0YTEuc2V0UmFuZG9tKCk7CkBAIC02Miw4ICs1Niw3IEBACiAgIH0KIH0KIAotc3RhdGljIHZvaWQgdGVzdF9jb25qdWdhdGUoKQoteworc3RhdGljIHZvaWQgdGVzdF9jb25qdWdhdGUoKSB7CiAgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxPiBkYXRhMSgzKTsKICAgVGVuc29yPHN0ZDo6Y29tcGxleDxkb3VibGU+LCAxPiBkYXRhMigzKTsKICAgVGVuc29yPGludCwgMT4gZGF0YTMoMyk7CkBAIC04MSw4ICs3NCw3IEBACiAgIH0KIH0KIAotc3RhdGljIHZvaWQgdGVzdF9jb250cmFjdGlvbnMoKQoteworc3RhdGljIHZvaWQgdGVzdF9jb250cmFjdGlvbnMoKSB7CiAgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCA0PiB0X2xlZnQoMzAsIDUwLCA4LCAzMSk7CiAgIFRlbnNvcjxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCA1PiB0X3JpZ2h0KDgsIDMxLCA3LCAyMCwgMTApOwogICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgNT4gdF9yZXN1bHQoMzAsIDUwLCA3LCAyMCwgMTApOwpAQCAtMTA3LDkgKzk5LDcgQEAKICAgfQogfQogCi0KLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3Jfb2ZfY29tcGxleCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3Jfb2ZfY29tcGxleCkgewogICBDQUxMX1NVQlRFU1QodGVzdF9hZGRpdGlvbnMoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2FicygpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfYXJnKCkpOwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2ZfY29uc3RfdmFsdWVzLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX29mX2NvbnN0X3ZhbHVlcy5jcHAKaW5kZXggMzQ0ZDY3OC4uNmM3NmNmMyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2ZfY29uc3RfdmFsdWVzLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9vZl9jb25zdF92YWx1ZXMuY3BwCkBAIC0xMSwxMSArMTEsMTAgQEAKIAogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KIAotdXNpbmcgRWlnZW46OlRlbnNvcjsKIHVzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKLXN0YXRpYyB2b2lkIHRlc3RfYXNzaWduKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfYXNzaWduKCkgewogICBmbG9hdCBkYXRhMVs2XTsKICAgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBmbG9hdCwgMj4+IG1hdDEoZGF0YTEsIDIsIDMpOwogICBmbG9hdCBkYXRhMls2XTsKQEAgLTM5LDE5ICszOCwxNyBAQAogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKLSAgICAgIFZFUklGWV9JU19BUFBST1gocnNsdDEoaSxqKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGkgKyAyKmopKTsKLSAgICAgIFZFUklGWV9JU19BUFBST1gocnNsdDIoaSxqKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KC1pIC0gMipqKSk7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKHJzbHQzKGksaiksIHN0YXRpY19jYXN0PGZsb2F0PihpICsgMipqKSk7Ci0gICAgICBWRVJJRllfSVNfQVBQUk9YKHJzbHQ0KGksaiksIHN0YXRpY19jYXN0PGZsb2F0PigtaSAtIDIqaikpOwotICAgICAgVkVSSUZZX0lTX0FQUFJPWChyc2x0NShpLGopLCBzdGF0aWNfY2FzdDxmbG9hdD4oaSArIDIqaikpOwotICAgICAgVkVSSUZZX0lTX0FQUFJPWChyc2x0NihpLGopLCBzdGF0aWNfY2FzdDxmbG9hdD4oLWkgLSAyKmopKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gocnNsdDEoaSwgaiksIHN0YXRpY19jYXN0PGZsb2F0PihpICsgMiAqIGopKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1gocnNsdDIoaSwgaiksIHN0YXRpY19jYXN0PGZsb2F0PigtaSAtIDIgKiBqKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHJzbHQzKGksIGopLCBzdGF0aWNfY2FzdDxmbG9hdD4oaSArIDIgKiBqKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHJzbHQ0KGksIGopLCBzdGF0aWNfY2FzdDxmbG9hdD4oLWkgLSAyICogaikpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChyc2x0NShpLCBqKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGkgKyAyICogaikpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChyc2x0NihpLCBqKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KC1pIC0gMiAqIGopKTsKICAgICB9CiAgIH0KIH0KIAotCi1zdGF0aWMgdm9pZCB0ZXN0X3BsdXMoKQoteworc3RhdGljIHZvaWQgdGVzdF9wbHVzKCkgewogICBmbG9hdCBkYXRhMVs2XTsKICAgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBmbG9hdCwgMj4+IG1hdDEoZGF0YTEsIDIsIDMpOwogICBmbG9hdCBkYXRhMls2XTsKQEAgLTY5LDE1ICs2NiwxMyBAQAogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKLSAgICAgIFZFUklGWV9JU19BUFBST1goc3VtMShpLGopLCAwLjBmKTsKLSAgICAgIFZFUklGWV9JU19BUFBST1goc3VtMihpLGopLCAwLjBmKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1goc3VtMShpLCBqKSwgMC4wZik7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKHN1bTIoaSwgaiksIDAuMGYpOwogICAgIH0KICAgfQogfQogCi0KLXN0YXRpYyB2b2lkIHRlc3RfcGx1c19lcXVhbCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X3BsdXNfZXF1YWwoKSB7CiAgIGZsb2F0IGRhdGExWzZdOwogICBUZW5zb3JNYXA8VGVuc29yPGNvbnN0IGZsb2F0LCAyPj4gbWF0MShkYXRhMSwgMiwgMyk7CiAgIGZsb2F0IGRhdGEyWzZdOwpAQCAtOTEsMTQgKzg2LDEyIEBACiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewotICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQyKGksaiksIDAuMGYpOworICAgICAgVkVSSUZZX0lTX0FQUFJPWChtYXQyKGksIGopLCAwLjBmKTsKICAgICB9CiAgIH0KIH0KIAotCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX29mX2NvbnN0X3ZhbHVlcykKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3Jfb2ZfY29uc3RfdmFsdWVzKSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2Fzc2lnbigpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfcGx1cygpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfcGx1c19lcXVhbCgpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX29mX2Zsb2F0MTZfZ3B1LmN1IGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2ZfZmxvYXQxNl9ncHUuY3UKaW5kZXggMzBiY2MxZC4uYTlhODI2NyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2ZfZmxvYXQxNl9ncHUuY3UKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2ZfZmxvYXQxNl9ncHUuY3UKQEAgLTE2LDEwICsxNiw5IEBACiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KIAotCiB1c2luZyBFaWdlbjo6VGVuc29yOwogCi10ZW1wbGF0ZTx0eXBlbmFtZT4KK3RlbXBsYXRlIDx0eXBlbmFtZT4KIHZvaWQgdGVzdF9ncHVfbnVtZXh0KCkgewogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwpAQCAtMjksMjEgKzI4LDE5IEBACiAgIGJvb2wqIGRfcmVzX2hhbGYgPSAoYm9vbCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihib29sKSk7CiAgIGJvb2wqIGRfcmVzX2Zsb2F0ID0gKGJvb2wqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoYm9vbCkpOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoCi0gICAgICBkX2Zsb2F0LCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxib29sLCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfaGFsZigKLSAgICAgIGRfcmVzX2hhbGYsIG51bV9lbGVtKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGJvb2wsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdCgKLSAgICAgIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoZF9mbG9hdCwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8Ym9vbCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2hhbGYoZF9yZXNfaGFsZiwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8Ym9vbCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KGRfcmVzX2Zsb2F0LCBudW1fZWxlbSk7CiAKICAgZ3B1X2Zsb2F0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC5yYW5kb20oKSAtIGdwdV9mbG9hdC5jb25zdGFudCgwLjVmKTsKICAgZ3B1X3Jlc19mbG9hdC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQudW5hcnlFeHByKEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX2lzbmFuX29wPGZsb2F0PigpKTsKLSAgZ3B1X3Jlc19oYWxmLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC5jYXN0PEVpZ2VuOjpoYWxmPigpLnVuYXJ5RXhwcihFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pc25hbl9vcDxFaWdlbjo6aGFsZj4oKSk7CisgIGdwdV9yZXNfaGFsZi5kZXZpY2UoZ3B1X2RldmljZSkgPQorICAgICAgZ3B1X2Zsb2F0LmNhc3Q8RWlnZW46OmhhbGY+KCkudW5hcnlFeHByKEVpZ2VuOjppbnRlcm5hbDo6c2NhbGFyX2lzbmFuX29wPEVpZ2VuOjpoYWxmPigpKTsKIAogICBUZW5zb3I8Ym9vbCwgMT4gaGFsZl9wcmVjKG51bV9lbGVtKTsKICAgVGVuc29yPGJvb2wsIDE+IGZ1bGxfcHJlYyhudW1fZWxlbSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYy5kYXRhKCksIGRfcmVzX2hhbGYsIG51bV9lbGVtKnNpemVvZihib29sKSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSpzaXplb2YoYm9vbCkpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMuZGF0YSgpLCBkX3Jlc19oYWxmLCBudW1fZWxlbSAqIHNpemVvZihib29sKSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihib29sKSk7CiAgIGdwdV9kZXZpY2Uuc3luY2hyb25pemUoKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbGVtOyArK2kpIHsKQEAgLTU2LDEwICs1Myw5IEBACiAgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX3Jlc19mbG9hdCk7CiB9CiAKLQogI2lmZGVmIEVJR0VOX0hBU19HUFVfRlAxNgogCi10ZW1wbGF0ZTx0eXBlbmFtZT4KK3RlbXBsYXRlIDx0eXBlbmFtZT4KIHZvaWQgdGVzdF9ncHVfY29udmVyc2lvbigpIHsKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKQEAgLTY5LDEyICs2NSw5IEBACiAgIEVpZ2VuOjpoYWxmKiBkX2hhbGYgPSAoRWlnZW46OmhhbGYqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKICAgZmxvYXQqIGRfY29udiA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoCi0gICAgICBkX2Zsb2F0LCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfaGFsZigKLSAgICAgIGRfaGFsZiwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2NvbnYoCi0gICAgICBkX2NvbnYsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdChkX2Zsb2F0LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfaGFsZihkX2hhbGYsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9jb252KGRfY29udiwgbnVtX2VsZW0pOwogCiAgIGdwdV9mbG9hdC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQucmFuZG9tKCk7CiAgIGdwdV9oYWxmLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC5jYXN0PEVpZ2VuOjpoYWxmPigpOwpAQCAtODIsOCArNzUsOCBAQAogCiAgIFRlbnNvcjxmbG9hdCwgMT4gaW5pdGlhbChudW1fZWxlbSk7CiAgIFRlbnNvcjxmbG9hdCwgMT4gZmluYWwobnVtX2VsZW0pOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbml0aWFsLmRhdGEoKSwgZF9mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZpbmFsLmRhdGEoKSwgZF9jb252LCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5pdGlhbC5kYXRhKCksIGRfZmxvYXQsIG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZpbmFsLmRhdGEoKSwgZF9jb252LCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgewogICAgIFZFUklGWV9JU19BUFBST1goaW5pdGlhbChpKSwgZmluYWwoaSkpOwpAQCAtOTQsNyArODcsNyBAQAogICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9jb252KTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+CiB2b2lkIHRlc3RfZ3B1X3VuYXJ5KCkgewogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwpAQCAtMTA0LDEyICs5Nyw5IEBACiAgIGZsb2F0KiBkX3Jlc19oYWxmID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAgIGZsb2F0KiBkX3Jlc19mbG9hdCA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoCi0gICAgICBkX2Zsb2F0LCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2hhbGYoCi0gICAgICBkX3Jlc19oYWxmLCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KAotICAgICAgZF9yZXNfZmxvYXQsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdChkX2Zsb2F0LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2hhbGYoZF9yZXNfaGFsZiwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdChkX3Jlc19mbG9hdCwgbnVtX2VsZW0pOwogCiAgIGdwdV9mbG9hdC5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQucmFuZG9tKCkgLSBncHVfZmxvYXQuY29uc3RhbnQoMC41Zik7CiAgIGdwdV9yZXNfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X2Zsb2F0LmFicygpOwpAQCAtMTE3LDggKzEwNyw4IEBACiAKICAgVGVuc29yPGZsb2F0LCAxPiBoYWxmX3ByZWMobnVtX2VsZW0pOwogICBUZW5zb3I8ZmxvYXQsIDE+IGZ1bGxfcHJlYyhudW1fZWxlbSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYy5kYXRhKCksIGRfcmVzX2hhbGYsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYy5kYXRhKCksIGRfcmVzX2hhbGYsIG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogICBncHVfZGV2aWNlLnN5bmNocm9uaXplKCk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZWxlbTsgKytpKSB7CkBAIC0xMzEsNyArMTIxLDcgQEAKICAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfcmVzX2Zsb2F0KTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+CiB2b2lkIHRlc3RfZ3B1X2VsZW1lbnR3aXNlKCkgewogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwpAQCAtMTQyLDI4ICsxMzIsMjcgQEAKICAgZmxvYXQqIGRfcmVzX2hhbGYgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKICAgZmxvYXQqIGRfcmVzX2Zsb2F0ID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdDEoCi0gICAgICBkX2Zsb2F0MSwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0MigKLSAgICAgIGRfZmxvYXQyLCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2hhbGYoCi0gICAgICBkX3Jlc19oYWxmLCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KAotICAgICAgZF9yZXNfZmxvYXQsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdDEoZF9mbG9hdDEsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdDIoZF9mbG9hdDIsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfaGFsZihkX3Jlc19oYWxmLCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KGRfcmVzX2Zsb2F0LCBudW1fZWxlbSk7CiAKICAgZ3B1X2Zsb2F0MS5kZXZpY2UoZ3B1X2RldmljZSkgPSBncHVfZmxvYXQxLnJhbmRvbSgpOwogICBncHVfZmxvYXQyLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdDIucmFuZG9tKCk7CiAgIGdwdV9yZXNfZmxvYXQuZGV2aWNlKGdwdV9kZXZpY2UpID0gKGdwdV9mbG9hdDEgKyBncHVfZmxvYXQyKSAqIGdwdV9mbG9hdDE7Ci0gIGdwdV9yZXNfaGFsZi5kZXZpY2UoZ3B1X2RldmljZSkgPSAoKGdwdV9mbG9hdDEuY2FzdDxFaWdlbjo6aGFsZj4oKSArIGdwdV9mbG9hdDIuY2FzdDxFaWdlbjo6aGFsZj4oKSkgKiBncHVfZmxvYXQxLmNhc3Q8RWlnZW46OmhhbGY+KCkpLmNhc3Q8ZmxvYXQ+KCk7CisgIGdwdV9yZXNfaGFsZi5kZXZpY2UoZ3B1X2RldmljZSkgPQorICAgICAgKChncHVfZmxvYXQxLmNhc3Q8RWlnZW46OmhhbGY+KCkgKyBncHVfZmxvYXQyLmNhc3Q8RWlnZW46OmhhbGY+KCkpICogZ3B1X2Zsb2F0MS5jYXN0PEVpZ2VuOjpoYWxmPigpKQorICAgICAgICAgIC5jYXN0PGZsb2F0PigpOwogCiAgIFRlbnNvcjxmbG9hdCwgMT4gaGFsZl9wcmVjKG51bV9lbGVtKTsKICAgVGVuc29yPGZsb2F0LCAxPiBmdWxsX3ByZWMobnVtX2VsZW0pOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMuZGF0YSgpLCBkX3Jlc19oYWxmLCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMuZGF0YSgpLCBkX3Jlc19oYWxmLCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKICAgZ3B1X2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgewotICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgZWxlbXdpc2UgIiA8PCBpIDw8ICI6IGZ1bGwgcHJlYyA9ICIgPDwgZnVsbF9wcmVjKGkpIDw8ICIgdnMgaGFsZiBwcmVjID0gIiA8PCBoYWxmX3ByZWMoaSkgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgZWxlbXdpc2UgIiA8PCBpIDw8ICI6IGZ1bGwgcHJlYyA9ICIgPDwgZnVsbF9wcmVjKGkpIDw8ICIgdnMgaGFsZiBwcmVjID0gIiA8PCBoYWxmX3ByZWMoaSkKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICAgIFZFUklGWV9JU19BUFBST1goc3RhdGljX2Nhc3Q8RWlnZW46OmhhbGY+KGZ1bGxfcHJlYyhpKSksIHN0YXRpY19jYXN0PEVpZ2VuOjpoYWxmPihoYWxmX3ByZWMoaSkpKTsKICAgfQogCkBAIC0xNzMsNyArMTYyLDcgQEAKICAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfcmVzX2Zsb2F0KTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+CiB2b2lkIHRlc3RfZ3B1X3RyYW5jZW5kZW50YWwoKSB7CiAgIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOwogICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7CkBAIC0yMzAsMzAgKzIxOSwzMyBAQAogICBUZW5zb3I8ZmxvYXQsIDE+IGlucHV0MyhudW1fZWxlbSk7CiAgIFRlbnNvcjxFaWdlbjo6aGFsZiwgMT4gaGFsZl9wcmVjMyhudW1fZWxlbSk7CiAgIFRlbnNvcjxFaWdlbjo6aGFsZiwgMT4gZnVsbF9wcmVjMyhudW1fZWxlbSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGlucHV0MS5kYXRhKCksIGRfZmxvYXQxLCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5wdXQyLmRhdGEoKSwgZF9mbG9hdDIsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbnB1dDMuZGF0YSgpLCBkX2Zsb2F0MywgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYzEuZGF0YSgpLCBkX3JlczFfaGFsZiwgbnVtX2VsZW0qc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7Ci0gIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYzEuZGF0YSgpLCBkX3JlczFfZmxvYXQsIG51bV9lbGVtKnNpemVvZihFaWdlbjo6aGFsZikpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMyLmRhdGEoKSwgZF9yZXMyX2hhbGYsIG51bV9lbGVtKnNpemVvZihFaWdlbjo6aGFsZikpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMyLmRhdGEoKSwgZF9yZXMyX2Zsb2F0LCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmhhbGYpKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjMy5kYXRhKCksIGRfcmVzM19oYWxmLCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmhhbGYpKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjMy5kYXRhKCksIGRfcmVzM19mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGlucHV0MS5kYXRhKCksIGRfZmxvYXQxLCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbnB1dDIuZGF0YSgpLCBkX2Zsb2F0MiwgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5wdXQzLmRhdGEoKSwgZF9mbG9hdDMsIG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYzEuZGF0YSgpLCBkX3JlczFfaGFsZiwgbnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjMS5kYXRhKCksIGRfcmVzMV9mbG9hdCwgbnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjMi5kYXRhKCksIGRfcmVzMl9oYWxmLCBudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6aGFsZikpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMyLmRhdGEoKSwgZF9yZXMyX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6aGFsZikpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMzLmRhdGEoKSwgZF9yZXMzX2hhbGYsIG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYzMuZGF0YSgpLCBkX3JlczNfZmxvYXQsIG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CiAgIGdwdV9kZXZpY2Uuc3luY2hyb25pemUoKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbGVtOyArK2kpIHsKLSAgICBzdGQ6OmNvdXQgPDwgIkNoZWNraW5nIGVsZW13aXNlIGV4cCAiIDw8IGkgPDwgIiBpbnB1dCA9ICIgPDwgaW5wdXQxKGkpIDw8ICIgZnVsbCA9ICIgPDwgZnVsbF9wcmVjMShpKSA8PCAiIGhhbGYgPSAiIDw8IGhhbGZfcHJlYzEoaSkgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgZWxlbXdpc2UgZXhwICIgPDwgaSA8PCAiIGlucHV0ID0gIiA8PCBpbnB1dDEoaSkgPDwgIiBmdWxsID0gIiA8PCBmdWxsX3ByZWMxKGkpCisgICAgICAgICAgICAgIDw8ICIgaGFsZiA9ICIgPDwgaGFsZl9wcmVjMShpKSA8PCBzdGQ6OmVuZGw7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3ByZWMxKGkpLCBoYWxmX3ByZWMxKGkpKTsKICAgfQogICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbGVtOyArK2kpIHsKLSAgICBzdGQ6OmNvdXQgPDwgIkNoZWNraW5nIGVsZW13aXNlIGxvZyAiIDw8IGkgPDwgIiBpbnB1dCA9ICIgPDwgaW5wdXQyKGkpIDw8ICIgZnVsbCA9ICIgPDwgZnVsbF9wcmVjMihpKSA8PCAiIGhhbGYgPSAiIDw8IGhhbGZfcHJlYzIoaSkgPDwgc3RkOjplbmRsOwotICAgIGlmKHN0ZDo6YWJzKGlucHV0MihpKS0xLmYpPDAuMDVmKSAvLyBsb2cgbGFja3MgYWNjdXJhY3kgbmVhcmJ5IDEKLSAgICAgIFZFUklGWV9JU19BUFBST1goZnVsbF9wcmVjMihpKStFaWdlbjo6aGFsZigwLjFmKSwgaGFsZl9wcmVjMihpKStFaWdlbjo6aGFsZigwLjFmKSk7CisgICAgc3RkOjpjb3V0IDw8ICJDaGVja2luZyBlbGVtd2lzZSBsb2cgIiA8PCBpIDw8ICIgaW5wdXQgPSAiIDw8IGlucHV0MihpKSA8PCAiIGZ1bGwgPSAiIDw8IGZ1bGxfcHJlYzIoaSkKKyAgICAgICAgICAgICAgPDwgIiBoYWxmID0gIiA8PCBoYWxmX3ByZWMyKGkpIDw8IHN0ZDo6ZW5kbDsKKyAgICBpZiAoc3RkOjphYnMoaW5wdXQyKGkpIC0gMS5mKSA8IDAuMDVmKSAgLy8gbG9nIGxhY2tzIGFjY3VyYWN5IG5lYXJieSAxCisgICAgICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcHJlYzIoaSkgKyBFaWdlbjo6aGFsZigwLjFmKSwgaGFsZl9wcmVjMihpKSArIEVpZ2VuOjpoYWxmKDAuMWYpKTsKICAgICBlbHNlCiAgICAgICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcHJlYzIoaSksIGhhbGZfcHJlYzIoaSkpOwogICB9CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgewotICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgZWxlbXdpc2UgcGxvZzEgIiA8PCBpIDw8ICIgaW5wdXQgPSAiIDw8IGlucHV0MyhpKSA8PCAiIGZ1bGwgPSAiIDw8IGZ1bGxfcHJlYzMoaSkgPDwgIiBoYWxmID0gIiA8PCBoYWxmX3ByZWMzKGkpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIkNoZWNraW5nIGVsZW13aXNlIHBsb2cxICIgPDwgaSA8PCAiIGlucHV0ID0gIiA8PCBpbnB1dDMoaSkgPDwgIiBmdWxsID0gIiA8PCBmdWxsX3ByZWMzKGkpCisgICAgICAgICAgICAgIDw8ICIgaGFsZiA9ICIgPDwgaGFsZl9wcmVjMyhpKSA8PCBzdGQ6OmVuZGw7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3ByZWMzKGkpLCBoYWxmX3ByZWMzKGkpKTsKICAgfQogICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9mbG9hdDEpOwpAQCAtMjY3LDI3ICsyNTksMjMgQEAKICAgZ3B1X2RldmljZS5kZWFsbG9jYXRlKGRfcmVzM19oYWxmKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+CiB2b2lkIHRlc3RfZ3B1X2NvbnRyYWN0aW9ucygpIHsKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKICAgaW50IHJvd3MgPSAyMzsKICAgaW50IGNvbHMgPSAyMzsKLSAgaW50IG51bV9lbGVtID0gcm93cypjb2xzOworICBpbnQgbnVtX2VsZW0gPSByb3dzICogY29sczsKIAogICBmbG9hdCogZF9mbG9hdDEgPSAoZmxvYXQqKWdwdV9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKICAgZmxvYXQqIGRfZmxvYXQyID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAgIEVpZ2VuOjpoYWxmKiBkX3Jlc19oYWxmID0gKEVpZ2VuOjpoYWxmKilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CiAgIEVpZ2VuOjpoYWxmKiBkX3Jlc19mbG9hdCA9IChFaWdlbjo6aGFsZiopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6aGFsZikpOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQxKAotICAgICAgZF9mbG9hdDEsIHJvd3MsIGNvbHMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0MigKLSAgICAgIGRfZmxvYXQyLCByb3dzLCBjb2xzKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfaGFsZigKLSAgICAgIGRfcmVzX2hhbGYsIHJvd3MsIGNvbHMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDI+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdCgKLSAgICAgIGRfcmVzX2Zsb2F0LCByb3dzLCBjb2xzKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdDEoZF9mbG9hdDEsIHJvd3MsIGNvbHMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0MihkX2Zsb2F0Miwgcm93cywgY29scyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2hhbGYoZF9yZXNfaGFsZiwgcm93cywgY29scyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KGRfcmVzX2Zsb2F0LCByb3dzLCBjb2xzKTsKIAogICBncHVfZmxvYXQxLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdDEucmFuZG9tKCkgLSBncHVfZmxvYXQxLmNvbnN0YW50KDAuNWYpOwogICBncHVfZmxvYXQyLmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdDIucmFuZG9tKCkgLSBncHVfZmxvYXQyLmNvbnN0YW50KDAuNWYpOwpAQCAtMjk5LDggKzI4Nyw4IEBACiAKICAgVGVuc29yPEVpZ2VuOjpoYWxmLCAyPiBoYWxmX3ByZWMocm93cywgY29scyk7CiAgIFRlbnNvcjxFaWdlbjo6aGFsZiwgMj4gZnVsbF9wcmVjKHJvd3MsIGNvbHMpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMuZGF0YSgpLCBkX3Jlc19oYWxmLCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmhhbGYpKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsIG51bV9lbGVtKnNpemVvZihFaWdlbjo6aGFsZikpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMuZGF0YSgpLCBkX3Jlc19oYWxmLCBudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6aGFsZikpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgbnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKICAgZ3B1X2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgKytpKSB7CkBAIC0zMTgsMjcgKzMwNiwyMiBAQAogICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZF9yZXNfZmxvYXQpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZT4KK3RlbXBsYXRlIDx0eXBlbmFtZT4KIHZvaWQgdGVzdF9ncHVfcmVkdWN0aW9ucyhpbnQgc2l6ZTEsIGludCBzaXplMiwgaW50IHJlZHV4KSB7Ci0KLSAgIHN0ZDo6Y291dCA8PCAiUmVkdWNpbmcgIiA8PCBzaXplMSA8PCAiIGJ5ICIgPDwgc2l6ZTIKLSAgICAgICAgICAgICA8PCAiIHRlbnNvciBhbG9uZyBkaW0gIiA8PCByZWR1eCA8PCBzdGQ6OmVuZGw7CisgIHN0ZDo6Y291dCA8PCAiUmVkdWNpbmcgIiA8PCBzaXplMSA8PCAiIGJ5ICIgPDwgc2l6ZTIgPDwgIiB0ZW5zb3IgYWxvbmcgZGltICIgPDwgcmVkdXggPDwgc3RkOjplbmRsOwogCiAgIEVpZ2VuOjpHcHVTdHJlYW1EZXZpY2Ugc3RyZWFtOwogICBFaWdlbjo6R3B1RGV2aWNlIGdwdV9kZXZpY2UoJnN0cmVhbSk7Ci0gIGludCBudW1fZWxlbSA9IHNpemUxKnNpemUyOworICBpbnQgbnVtX2VsZW0gPSBzaXplMSAqIHNpemUyOwogICBpbnQgcmVzdWx0X3NpemUgPSAocmVkdXggPT0gMSA/IHNpemUxIDogc2l6ZTIpOwogCiAgIGZsb2F0KiBkX2Zsb2F0ID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAgIEVpZ2VuOjpoYWxmKiBkX3Jlc19oYWxmID0gKEVpZ2VuOjpoYWxmKilncHVfZGV2aWNlLmFsbG9jYXRlKHJlc3VsdF9zaXplICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CiAgIEVpZ2VuOjpoYWxmKiBkX3Jlc19mbG9hdCA9IChFaWdlbjo6aGFsZiopZ3B1X2RldmljZS5hbGxvY2F0ZShyZXN1bHRfc2l6ZSAqIHNpemVvZihFaWdlbjo6aGFsZikpOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoCi0gICAgICBkX2Zsb2F0LCBzaXplMSwgc2l6ZTIpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19oYWxmKAotICAgICAgZF9yZXNfaGFsZiwgcmVzdWx0X3NpemUpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdCgKLSAgICAgIGRfcmVzX2Zsb2F0LCByZXN1bHRfc2l6ZSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoZF9mbG9hdCwgc2l6ZTEsIHNpemUyKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfaGFsZihkX3Jlc19oYWxmLCByZXN1bHRfc2l6ZSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KGRfcmVzX2Zsb2F0LCByZXN1bHRfc2l6ZSk7CiAKICAgZ3B1X2Zsb2F0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC5yYW5kb20oKSAqIDIuMGY7CiAKQEAgLTM0OCw4ICszMzEsOCBAQAogCiAgIFRlbnNvcjxFaWdlbjo6aGFsZiwgMT4gaGFsZl9wcmVjKHJlc3VsdF9zaXplKTsKICAgVGVuc29yPEVpZ2VuOjpoYWxmLCAxPiBmdWxsX3ByZWMocmVzdWx0X3NpemUpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMuZGF0YSgpLCBkX3Jlc19oYWxmLCByZXN1bHRfc2l6ZSpzaXplb2YoRWlnZW46OmhhbGYpKTsKLSAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsIHJlc3VsdF9zaXplKnNpemVvZihFaWdlbjo6aGFsZikpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMuZGF0YSgpLCBkX3Jlc19oYWxmLCByZXN1bHRfc2l6ZSAqIHNpemVvZihFaWdlbjo6aGFsZikpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgcmVzdWx0X3NpemUgKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKICAgZ3B1X2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0X3NpemU7ICsraSkgewpAQCAtMzYyLDcgKzM0NSw3IEBACiAgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX3Jlc19mbG9hdCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lPgordGVtcGxhdGUgPHR5cGVuYW1lPgogdm9pZCB0ZXN0X2dwdV9yZWR1Y3Rpb25zKCkgewogICB0ZXN0X2dwdV9yZWR1Y3Rpb25zPHZvaWQ+KDEzLCAxMywgMCk7CiAgIHRlc3RfZ3B1X3JlZHVjdGlvbnM8dm9pZD4oMTMsIDEzLCAxKTsKQEAgLTM3NCwyMyArMzU3LDIwIEBACiAgIHRlc3RfZ3B1X3JlZHVjdGlvbnM8dm9pZD4oMzYsIDM1LCAxKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWU+CiB2b2lkIHRlc3RfZ3B1X2Z1bGxfcmVkdWN0aW9ucygpIHsKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKICAgaW50IHNpemUgPSAxMzsKLSAgaW50IG51bV9lbGVtID0gc2l6ZSpzaXplOworICBpbnQgbnVtX2VsZW0gPSBzaXplICogc2l6ZTsKIAogICBmbG9hdCogZF9mbG9hdCA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogICBFaWdlbjo6aGFsZiogZF9yZXNfaGFsZiA9IChFaWdlbjo6aGFsZiopZ3B1X2RldmljZS5hbGxvY2F0ZSgxICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CiAgIEVpZ2VuOjpoYWxmKiBkX3Jlc19mbG9hdCA9IChFaWdlbjo6aGFsZiopZ3B1X2RldmljZS5hbGxvY2F0ZSgxICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CiAKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdCgKLSAgICAgIGRfZmxvYXQsIHNpemUsIHNpemUpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDA+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19oYWxmKAotICAgICAgZF9yZXNfaGFsZik7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMD4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KAotICAgICAgZF9yZXNfZmxvYXQpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0KGRfZmxvYXQsIHNpemUsIHNpemUpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDA+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19oYWxmKGRfcmVzX2hhbGYpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDA+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdChkX3Jlc19mbG9hdCk7CiAKICAgZ3B1X2Zsb2F0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9mbG9hdC5yYW5kb20oKTsKIApAQCAtNDE4LDkgKzM5OCw4IEBACiAgIGdwdV9kZXZpY2UuZGVhbGxvY2F0ZShkX3Jlc19mbG9hdCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lPgordGVtcGxhdGUgPHR5cGVuYW1lPgogdm9pZCB0ZXN0X2dwdV9mb3JjZWRfZXZhbHMoKSB7Ci0KICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKICAgaW50IG51bV9lbGVtID0gMTAxOwpAQCAtNDMwLDE0ICs0MDksMTAgQEAKICAgZmxvYXQqIGRfcmVzX2hhbGYyID0gKGZsb2F0KilncHVfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAgIGZsb2F0KiBkX3Jlc19mbG9hdCA9IChmbG9hdCopZ3B1X2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoCi0gICAgICBkX2Zsb2F0LCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2hhbGYxKAotICAgICAgZF9yZXNfaGFsZjEsIG51bV9lbGVtKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OlVuYWxpZ25lZD4gZ3B1X3Jlc19oYWxmMigKLSAgICAgIGRfcmVzX2hhbGYyLCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KAotICAgICAgZF9yZXNfZmxvYXQsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdChkX2Zsb2F0LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2hhbGYxKGRfcmVzX2hhbGYxLCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpVbmFsaWduZWQ+IGdwdV9yZXNfaGFsZjIoZF9yZXNfaGFsZjIsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfZmxvYXQoZF9yZXNfZmxvYXQsIG51bV9lbGVtKTsKIAogICBFaWdlbjo6YXJyYXk8aW50LCAxPiBub19iY2FzdDsKICAgbm9fYmNhc3RbMF0gPSAxOwpAQCAtNDUwLDEzICs0MjUsMTQgQEAKICAgVGVuc29yPGZsb2F0LCAxPiBoYWxmX3ByZWMxKG51bV9lbGVtKTsKICAgVGVuc29yPGZsb2F0LCAxPiBoYWxmX3ByZWMyKG51bV9lbGVtKTsKICAgVGVuc29yPGZsb2F0LCAxPiBmdWxsX3ByZWMobnVtX2VsZW0pOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMxLmRhdGEoKSwgZF9yZXNfaGFsZjEsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMyLmRhdGEoKSwgZF9yZXNfaGFsZjIsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOwotICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7CisgIGdwdV9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYzEuZGF0YSgpLCBkX3Jlc19oYWxmMSwgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgZ3B1X2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjMi5kYXRhKCksIGRfcmVzX2hhbGYyLCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBncHVfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKICAgZ3B1X2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgewotICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgZm9yY2VkIGV2YWwgIiA8PCBpIDw8IGZ1bGxfcHJlYyhpKSA8PCAiIHZzICIgPDwgaGFsZl9wcmVjMShpKSA8PCAiIHZzICIgPDwgaGFsZl9wcmVjMihpKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8ICJDaGVja2luZyBmb3JjZWQgZXZhbCAiIDw8IGkgPDwgZnVsbF9wcmVjKGkpIDw8ICIgdnMgIiA8PCBoYWxmX3ByZWMxKGkpIDw8ICIgdnMgIiA8PCBoYWxmX3ByZWMyKGkpCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcHJlYyhpKSwgaGFsZl9wcmVjMShpKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3ByZWMoaSksIGhhbGZfcHJlYzIoaSkpOwogICB9CkBAIC00NjgsOSArNDQ0LDcgQEAKIH0KICNlbmRpZgogCi0KLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3Jfb2ZfZmxvYXQxNl9ncHUpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX29mX2Zsb2F0MTZfZ3B1KSB7CiAgIENBTExfU1VCVEVTVF8xKHRlc3RfZ3B1X251bWV4dDx2b2lkPigpKTsKIAogI2lmZGVmIEVJR0VOX0hBU19HUFVfRlAxNgpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2ZfZmxvYXQxNl9zeWNsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX29mX2Zsb2F0MTZfc3ljbC5jcHAKaW5kZXggMTYyNGFjYy4uN2RlMzllNyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2ZfZmxvYXQxNl9zeWNsLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9vZl9mbG9hdDE2X3N5Y2wuY3BwCkBAIC0yMCwxMCArMjAsMTAgQEAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGVuc29yPgogCi11c2luZyBFaWdlbjo6VGVuc29yOwogdXNpbmcgRWlnZW46OlN5Y2xEZXZpY2U7Cit1c2luZyBFaWdlbjo6VGVuc29yOwogCi12b2lkIHRlc3RfZ3B1X251bWV4dChjb25zdCBFaWdlbjo6U3ljbERldmljZSAmc3ljbF9kZXZpY2UpIHsKK3ZvaWQgdGVzdF9ncHVfbnVtZXh0KGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBpbnQgbnVtX2VsZW0gPSAxMDE7CiAKICAgZmxvYXQqIGRfZmxvYXQgPSBzdGF0aWNfY2FzdDxmbG9hdCo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSkpOwpAQCAtMzYsMTMgKzM2LDE0IEBACiAKICAgZ3B1X2Zsb2F0LmRldmljZShzeWNsX2RldmljZSkgPSBncHVfZmxvYXQucmFuZG9tKCkgLSBncHVfZmxvYXQuY29uc3RhbnQoMC41Zik7CiAgIGdwdV9yZXNfZmxvYXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9mbG9hdC51bmFyeUV4cHIoRWlnZW46OmludGVybmFsOjpzY2FsYXJfaXNuYW5fb3A8ZmxvYXQ+KCkpOwotICBncHVfcmVzX2hhbGYuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9mbG9hdC5jYXN0PEVpZ2VuOjpoYWxmPigpLnVuYXJ5RXhwcihFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pc25hbl9vcDxFaWdlbjo6aGFsZj4oKSk7CisgIGdwdV9yZXNfaGFsZi5kZXZpY2Uoc3ljbF9kZXZpY2UpID0KKyAgICAgIGdwdV9mbG9hdC5jYXN0PEVpZ2VuOjpoYWxmPigpLnVuYXJ5RXhwcihFaWdlbjo6aW50ZXJuYWw6OnNjYWxhcl9pc25hbl9vcDxFaWdlbjo6aGFsZj4oKSk7CiAKICAgVGVuc29yPGJvb2wsIDE+IGhhbGZfcHJlYyhudW1fZWxlbSk7CiAgIFRlbnNvcjxib29sLCAxPiBmdWxsX3ByZWMobnVtX2VsZW0pOwogCi0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMuZGF0YSgpLCBkX3Jlc19oYWxmLG51bV9lbGVtICogc2l6ZW9mKGJvb2wpKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LG51bV9lbGVtICogc2l6ZW9mKGJvb2wpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYy5kYXRhKCksIGRfcmVzX2hhbGYsIG51bV9lbGVtICogc2l6ZW9mKGJvb2wpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihib29sKSk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZWxlbTsgKytpKSB7CiAgICAgc3RkOjpjb3V0IDw8ICJDaGVja2luZyBudW1leHQgIiA8PCBpIDw8IHN0ZDo6ZW5kbDsKQEAgLTUwLDE5ICs1MSwxNiBAQAogICB9CiB9CiAKLXZvaWQgdGVzdF9ncHVfY29udmVyc2lvbihjb25zdCBFaWdlbjo6U3ljbERldmljZSAmc3ljbF9kZXZpY2UpIHsKK3ZvaWQgdGVzdF9ncHVfY29udmVyc2lvbihjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgaW50IG51bV9lbGVtID0gMTAxOwogCiAgIGZsb2F0KiBkX2Zsb2F0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQqPihzeWNsX2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpKTsKICAgRWlnZW46OmhhbGYqIGRfaGFsZiA9IHN0YXRpY19jYXN0PEVpZ2VuOjpoYWxmKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmhhbGYpKSk7CiAgIGZsb2F0KiBkX2NvbnYgPSBzdGF0aWNfY2FzdDxmbG9hdCo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSkpOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoCi0gICAgICBkX2Zsb2F0LCBudW1fZWxlbSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfaGFsZigKLSAgICAgIGRfaGFsZiwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2NvbnYoCi0gICAgICBkX2NvbnYsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdChkX2Zsb2F0LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfaGFsZihkX2hhbGYsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9jb252KGRfY29udiwgbnVtX2VsZW0pOwogCiAgIGdwdV9mbG9hdC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2Zsb2F0LnJhbmRvbSgpOwogICBncHVfaGFsZi5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2Zsb2F0LmNhc3Q8RWlnZW46OmhhbGY+KCk7CkBAIC03MCwyNyArNjgsMjQgQEAKIAogICBUZW5zb3I8ZmxvYXQsIDE+IGluaXRpYWwobnVtX2VsZW0pOwogICBUZW5zb3I8ZmxvYXQsIDE+IGZpbmFsKG51bV9lbGVtKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGluaXRpYWwuZGF0YSgpLCBkX2Zsb2F0LCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZpbmFsLmRhdGEoKSwgZF9jb252LCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGluaXRpYWwuZGF0YSgpLCBkX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZmluYWwuZGF0YSgpLCBkX2NvbnYsIG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZWxlbTsgKytpKSB7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChpbml0aWFsKGkpLCBmaW5hbChpKSk7CiAgIH0KIH0KIAotdm9pZCB0ZXN0X2dwdV91bmFyeShjb25zdCBFaWdlbjo6U3ljbERldmljZSAmc3ljbF9kZXZpY2UpIHsKK3ZvaWQgdGVzdF9ncHVfdW5hcnkoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIGludCBudW1fZWxlbSA9IDEwMTsKIAogICBmbG9hdCogZF9mbG9hdCA9IChmbG9hdCopc3ljbF9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKICAgZmxvYXQqIGRfcmVzX2hhbGYgPSAoZmxvYXQqKXN5Y2xfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAgIGZsb2F0KiBkX3Jlc19mbG9hdCA9IChmbG9hdCopc3ljbF9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0KAotICAgICAgZF9mbG9hdCwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19oYWxmKAotICAgICAgZF9yZXNfaGFsZiwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdCgKLSAgICAgIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoZF9mbG9hdCwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19oYWxmKGRfcmVzX2hhbGYsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfZmxvYXQoZF9yZXNfZmxvYXQsIG51bV9lbGVtKTsKIAogICBncHVfZmxvYXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9mbG9hdC5yYW5kb20oKSAtIGdwdV9mbG9hdC5jb25zdGFudCgwLjVmKTsKICAgZ3B1X3Jlc19mbG9hdC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2Zsb2F0LmFicygpOwpAQCAtOTgsOCArOTMsOCBAQAogCiAgIFRlbnNvcjxmbG9hdCwgMT4gaGFsZl9wcmVjKG51bV9lbGVtKTsKICAgVGVuc29yPGZsb2F0LCAxPiBmdWxsX3ByZWMobnVtX2VsZW0pOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjLmRhdGEoKSwgZF9yZXNfaGFsZiwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgbnVtX2VsZW0qc2l6ZW9mKGZsb2F0KSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMuZGF0YSgpLCBkX3Jlc19oYWxmLCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsIG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAgIHN5Y2xfZGV2aWNlLnN5bmNocm9uaXplKCk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZWxlbTsgKytpKSB7CkBAIC0xMDgsNyArMTAzLDcgQEAKICAgfQogfQogCi12b2lkIHRlc3RfZ3B1X2VsZW1lbnR3aXNlKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlICZzeWNsX2RldmljZSkgewordm9pZCB0ZXN0X2dwdV9lbGVtZW50d2lzZShjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgaW50IG51bV9lbGVtID0gMTAxOwogCiAgIGZsb2F0KiBkX2Zsb2F0MSA9IHN0YXRpY19jYXN0PGZsb2F0Kj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKSk7CkBAIC0xMjQsMjEgKzExOSwyNCBAQAogICBncHVfZmxvYXQxLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfZmxvYXQxLnJhbmRvbSgpOwogICBncHVfZmxvYXQyLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfZmxvYXQyLnJhbmRvbSgpOwogICBncHVfcmVzX2Zsb2F0LmRldmljZShzeWNsX2RldmljZSkgPSAoZ3B1X2Zsb2F0MSArIGdwdV9mbG9hdDIpICogZ3B1X2Zsb2F0MTsKLSAgZ3B1X3Jlc19oYWxmLmRldmljZShzeWNsX2RldmljZSkgPSAoKGdwdV9mbG9hdDEuY2FzdDxFaWdlbjo6aGFsZj4oKSArIGdwdV9mbG9hdDIuY2FzdDxFaWdlbjo6aGFsZj4oKSkgKiBncHVfZmxvYXQxLmNhc3Q8RWlnZW46OmhhbGY+KCkpLmNhc3Q8ZmxvYXQ+KCk7CisgIGdwdV9yZXNfaGFsZi5kZXZpY2Uoc3ljbF9kZXZpY2UpID0KKyAgICAgICgoZ3B1X2Zsb2F0MS5jYXN0PEVpZ2VuOjpoYWxmPigpICsgZ3B1X2Zsb2F0Mi5jYXN0PEVpZ2VuOjpoYWxmPigpKSAqIGdwdV9mbG9hdDEuY2FzdDxFaWdlbjo6aGFsZj4oKSkKKyAgICAgICAgICAuY2FzdDxmbG9hdD4oKTsKIAogICBUZW5zb3I8ZmxvYXQsIDE+IGhhbGZfcHJlYyhudW1fZWxlbSk7CiAgIFRlbnNvcjxmbG9hdCwgMT4gZnVsbF9wcmVjKG51bV9lbGVtKTsKIAotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjLmRhdGEoKSwgZF9yZXNfaGFsZixudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYy5kYXRhKCksIGRfcmVzX2hhbGYsIG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMuZGF0YSgpLCBkX3Jlc19mbG9hdCwgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbGVtOyArK2kpIHsKLSAgICBzdGQ6OmNvdXQgPDwgIkNoZWNraW5nIGVsZW13aXNlICIgPDwgaSA8PCAiOiBmdWxsIHByZWMgPSAiIDw8IGZ1bGxfcHJlYyhpKSA8PCAiIHZzIGhhbGYgcHJlYyA9ICIgPDwgaGFsZl9wcmVjKGkpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIkNoZWNraW5nIGVsZW13aXNlICIgPDwgaSA8PCAiOiBmdWxsIHByZWMgPSAiIDw8IGZ1bGxfcHJlYyhpKSA8PCAiIHZzIGhhbGYgcHJlYyA9ICIgPDwgaGFsZl9wcmVjKGkpCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgICBWRVJJRllfSVNfQVBQUk9YKHN0YXRpY19jYXN0PEVpZ2VuOjpoYWxmPihmdWxsX3ByZWMoaSkpLCBzdGF0aWNfY2FzdDxFaWdlbjo6aGFsZj4oaGFsZl9wcmVjKGkpKSk7CiAgIH0KIH0KIAotdm9pZCB0ZXN0X2dwdV90cmFuY2VuZGVudGFsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlICZzeWNsX2RldmljZSkgewordm9pZCB0ZXN0X2dwdV90cmFuY2VuZGVudGFsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBpbnQgbnVtX2VsZW0gPSAxMDE7CiAKICAgZmxvYXQqIGRfZmxvYXQxID0gKGZsb2F0KilzeWNsX2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwpAQCAtMTkyLDUyICsxOTAsNTEgQEAKICAgVGVuc29yPGZsb2F0LCAxPiBpbnB1dDMobnVtX2VsZW0pOwogICBUZW5zb3I8RWlnZW46OmhhbGYsIDE+IGhhbGZfcHJlYzMobnVtX2VsZW0pOwogICBUZW5zb3I8RWlnZW46OmhhbGYsIDE+IGZ1bGxfcHJlYzMobnVtX2VsZW0pOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5wdXQxLmRhdGEoKSwgZF9mbG9hdDEsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5wdXQyLmRhdGEoKSwgZF9mbG9hdDIsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5wdXQzLmRhdGEoKSwgZF9mbG9hdDMsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjMS5kYXRhKCksIGRfcmVzMV9oYWxmLCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmhhbGYpKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYzEuZGF0YSgpLCBkX3JlczFfZmxvYXQsIG51bV9lbGVtKnNpemVvZihFaWdlbjo6aGFsZikpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjMi5kYXRhKCksIGRfcmVzMl9oYWxmLCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmhhbGYpKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYzIuZGF0YSgpLCBkX3JlczJfZmxvYXQsIG51bV9lbGVtKnNpemVvZihFaWdlbjo6aGFsZikpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjMy5kYXRhKCksIGRfcmVzM19oYWxmLCBudW1fZWxlbSpzaXplb2YoRWlnZW46OmhhbGYpKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYzMuZGF0YSgpLCBkX3JlczNfZmxvYXQsIG51bV9lbGVtKnNpemVvZihFaWdlbjo6aGFsZikpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaW5wdXQxLmRhdGEoKSwgZF9mbG9hdDEsIG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbnB1dDIuZGF0YSgpLCBkX2Zsb2F0MiwgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGlucHV0My5kYXRhKCksIGRfZmxvYXQzLCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjMS5kYXRhKCksIGRfcmVzMV9oYWxmLCBudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6aGFsZikpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjMS5kYXRhKCksIGRfcmVzMV9mbG9hdCwgbnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYzIuZGF0YSgpLCBkX3JlczJfaGFsZiwgbnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYzIuZGF0YSgpLCBkX3JlczJfZmxvYXQsIG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMzLmRhdGEoKSwgZF9yZXMzX2hhbGYsIG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3ByZWMzLmRhdGEoKSwgZF9yZXMzX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6aGFsZikpOwogICBzeWNsX2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgewotICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgZWxlbXdpc2UgZXhwICIgPDwgaSA8PCAiIGlucHV0ID0gIiA8PCBpbnB1dDEoaSkgPDwgIiBmdWxsID0gIiA8PCBmdWxsX3ByZWMxKGkpIDw8ICIgaGFsZiA9ICIgPDwgaGFsZl9wcmVjMShpKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8ICJDaGVja2luZyBlbGVtd2lzZSBleHAgIiA8PCBpIDw8ICIgaW5wdXQgPSAiIDw8IGlucHV0MShpKSA8PCAiIGZ1bGwgPSAiIDw8IGZ1bGxfcHJlYzEoaSkKKyAgICAgICAgICAgICAgPDwgIiBoYWxmID0gIiA8PCBoYWxmX3ByZWMxKGkpIDw8IHN0ZDo6ZW5kbDsKICAgICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcHJlYzEoaSksIGhhbGZfcHJlYzEoaSkpOwogICB9CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgewotICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgZWxlbXdpc2UgbG9nICIgPDwgaSA8PCAiIGlucHV0ID0gIiA8PCBpbnB1dDIoaSkgPDwgIiBmdWxsID0gIiA8PCBmdWxsX3ByZWMyKGkpIDw8ICIgaGFsZiA9ICIgPDwgaGFsZl9wcmVjMihpKSA8PCBzdGQ6OmVuZGw7Ci0gICAgaWYoc3RkOjphYnMoaW5wdXQyKGkpLTEuZik8MC4wNWYpIC8vIGxvZyBsYWNrcyBhY2N1cmFjeSBuZWFyYnkgMQotICAgICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3ByZWMyKGkpK0VpZ2VuOjpoYWxmKDAuMWYpLCBoYWxmX3ByZWMyKGkpK0VpZ2VuOjpoYWxmKDAuMWYpKTsKKyAgICBzdGQ6OmNvdXQgPDwgIkNoZWNraW5nIGVsZW13aXNlIGxvZyAiIDw8IGkgPDwgIiBpbnB1dCA9ICIgPDwgaW5wdXQyKGkpIDw8ICIgZnVsbCA9ICIgPDwgZnVsbF9wcmVjMihpKQorICAgICAgICAgICAgICA8PCAiIGhhbGYgPSAiIDw8IGhhbGZfcHJlYzIoaSkgPDwgc3RkOjplbmRsOworICAgIGlmIChzdGQ6OmFicyhpbnB1dDIoaSkgLSAxLmYpIDwgMC4wNWYpICAvLyBsb2cgbGFja3MgYWNjdXJhY3kgbmVhcmJ5IDEKKyAgICAgIFZFUklGWV9JU19BUFBST1goZnVsbF9wcmVjMihpKSArIEVpZ2VuOjpoYWxmKDAuMWYpLCBoYWxmX3ByZWMyKGkpICsgRWlnZW46OmhhbGYoMC4xZikpOwogICAgIGVsc2UKICAgICAgIFZFUklGWV9JU19BUFBST1goZnVsbF9wcmVjMihpKSwgaGFsZl9wcmVjMihpKSk7CiAgIH0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZWxlbTsgKytpKSB7Ci0gICAgc3RkOjpjb3V0IDw8ICJDaGVja2luZyBlbGVtd2lzZSBwbG9nMSAiIDw8IGkgPDwgIiBpbnB1dCA9ICIgPDwgaW5wdXQzKGkpIDw8ICIgZnVsbCA9ICIgPDwgZnVsbF9wcmVjMyhpKSA8PCAiIGhhbGYgPSAiIDw8IGhhbGZfcHJlYzMoaSkgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgZWxlbXdpc2UgcGxvZzEgIiA8PCBpIDw8ICIgaW5wdXQgPSAiIDw8IGlucHV0MyhpKSA8PCAiIGZ1bGwgPSAiIDw8IGZ1bGxfcHJlYzMoaSkKKyAgICAgICAgICAgICAgPDwgIiBoYWxmID0gIiA8PCBoYWxmX3ByZWMzKGkpIDw8IHN0ZDo6ZW5kbDsKICAgICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcHJlYzMoaSksIGhhbGZfcHJlYzMoaSkpOwogICB9CiB9CiAKLXZvaWQgdGVzdF9ncHVfY29udHJhY3Rpb25zKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlICZzeWNsX2RldmljZSkgewordm9pZCB0ZXN0X2dwdV9jb250cmFjdGlvbnMoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIGludCByb3dzID0gMjM7CiAgIGludCBjb2xzID0gMjM7Ci0gIGludCBudW1fZWxlbSA9IHJvd3MqY29sczsKKyAgaW50IG51bV9lbGVtID0gcm93cyAqIGNvbHM7CiAKICAgZmxvYXQqIGRfZmxvYXQxID0gKGZsb2F0KilzeWNsX2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogICBmbG9hdCogZF9mbG9hdDIgPSAoZmxvYXQqKXN5Y2xfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAgIEVpZ2VuOjpoYWxmKiBkX3Jlc19oYWxmID0gKEVpZ2VuOjpoYWxmKilzeWNsX2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6aGFsZikpOwogICBFaWdlbjo6aGFsZiogZF9yZXNfZmxvYXQgPSAoRWlnZW46OmhhbGYqKXN5Y2xfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKEVpZ2VuOjpoYWxmKSk7CiAKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdDEoCi0gICAgICBkX2Zsb2F0MSwgcm93cywgY29scyk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQyKAotICAgICAgZF9mbG9hdDIsIHJvd3MsIGNvbHMpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDI+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19oYWxmKAotICAgICAgZF9yZXNfaGFsZiwgcm93cywgY29scyk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KAotICAgICAgZF9yZXNfZmxvYXQsIHJvd3MsIGNvbHMpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0MShkX2Zsb2F0MSwgcm93cywgY29scyk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQyKGRfZmxvYXQyLCByb3dzLCBjb2xzKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfaGFsZihkX3Jlc19oYWxmLCByb3dzLCBjb2xzKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAyPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfZmxvYXQoZF9yZXNfZmxvYXQsIHJvd3MsIGNvbHMpOwogCiAgIGdwdV9mbG9hdDEuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9mbG9hdDEucmFuZG9tKCkgLSBncHVfZmxvYXQxLmNvbnN0YW50KDAuNWYpOwogICBncHVfZmxvYXQyLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfZmxvYXQyLnJhbmRvbSgpIC0gZ3B1X2Zsb2F0Mi5jb25zdGFudCgwLjVmKTsKQEAgLTI0OSw4ICsyNDYsOCBAQAogCiAgIFRlbnNvcjxFaWdlbjo6aGFsZiwgMj4gaGFsZl9wcmVjKHJvd3MsIGNvbHMpOwogICBUZW5zb3I8RWlnZW46OmhhbGYsIDI+IGZ1bGxfcHJlYyhyb3dzLCBjb2xzKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYy5kYXRhKCksIGRfcmVzX2hhbGYsIG51bV9lbGVtKnNpemVvZihFaWdlbjo6aGFsZikpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsIG51bV9lbGVtKnNpemVvZihFaWdlbjo6aGFsZikpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjLmRhdGEoKSwgZF9yZXNfaGFsZiwgbnVtX2VsZW0gKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihFaWdlbjo6aGFsZikpOwogICBzeWNsX2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgKytpKSB7CkBAIC0yNjMsMjMgKzI2MCwxOSBAQAogICB9CiB9CiAKLXZvaWQgdGVzdF9ncHVfcmVkdWN0aW9ucyhjb25zdCBFaWdlbjo6U3ljbERldmljZSAmc3ljbF9kZXZpY2UsIGludCBzaXplMSwgaW50IHNpemUyLCBpbnQgcmVkdXgpIHsKLSAgIHN0ZDo6Y291dCA8PCAiUmVkdWNpbmcgIiA8PCBzaXplMSA8PCAiIGJ5ICIgPDwgc2l6ZTIKLSAgICAgICAgICAgICA8PCAiIHRlbnNvciBhbG9uZyBkaW0gIiA8PCByZWR1eCA8PCBzdGQ6OmVuZGw7Cit2b2lkIHRlc3RfZ3B1X3JlZHVjdGlvbnMoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlLCBpbnQgc2l6ZTEsIGludCBzaXplMiwgaW50IHJlZHV4KSB7CisgIHN0ZDo6Y291dCA8PCAiUmVkdWNpbmcgIiA8PCBzaXplMSA8PCAiIGJ5ICIgPDwgc2l6ZTIgPDwgIiB0ZW5zb3IgYWxvbmcgZGltICIgPDwgcmVkdXggPDwgc3RkOjplbmRsOwogCi0gIGludCBudW1fZWxlbSA9IHNpemUxKnNpemUyOworICBpbnQgbnVtX2VsZW0gPSBzaXplMSAqIHNpemUyOwogICBpbnQgcmVzdWx0X3NpemUgPSAocmVkdXggPT0gMSA/IHNpemUxIDogc2l6ZTIpOwogCiAgIGZsb2F0KiBkX2Zsb2F0ID0gKGZsb2F0KilzeWNsX2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogICBFaWdlbjo6aGFsZiogZF9yZXNfaGFsZiA9IChFaWdlbjo6aGFsZiopc3ljbF9kZXZpY2UuYWxsb2NhdGUocmVzdWx0X3NpemUgKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKICAgRWlnZW46OmhhbGYqIGRfcmVzX2Zsb2F0ID0gKEVpZ2VuOjpoYWxmKilzeWNsX2RldmljZS5hbGxvY2F0ZShyZXN1bHRfc2l6ZSAqIHNpemVvZihFaWdlbjo6aGFsZikpOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoCi0gICAgICBkX2Zsb2F0LCBzaXplMSwgc2l6ZTIpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19oYWxmKAotICAgICAgZF9yZXNfaGFsZiwgcmVzdWx0X3NpemUpOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RWlnZW46OmhhbGYsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdCgKLSAgICAgIGRfcmVzX2Zsb2F0LCByZXN1bHRfc2l6ZSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoZF9mbG9hdCwgc2l6ZTEsIHNpemUyKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfaGFsZihkX3Jlc19oYWxmLCByZXN1bHRfc2l6ZSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMT4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KGRfcmVzX2Zsb2F0LCByZXN1bHRfc2l6ZSk7CiAKICAgZ3B1X2Zsb2F0LmRldmljZShzeWNsX2RldmljZSkgPSBncHVfZmxvYXQucmFuZG9tKCkgKiAyLjBmOwogCkBAIC0yODksOCArMjgyLDggQEAKIAogICBUZW5zb3I8RWlnZW46OmhhbGYsIDE+IGhhbGZfcHJlYyhyZXN1bHRfc2l6ZSk7CiAgIFRlbnNvcjxFaWdlbjo6aGFsZiwgMT4gZnVsbF9wcmVjKHJlc3VsdF9zaXplKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYy5kYXRhKCksIGRfcmVzX2hhbGYsIHJlc3VsdF9zaXplKnNpemVvZihFaWdlbjo6aGFsZikpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9wcmVjLmRhdGEoKSwgZF9yZXNfZmxvYXQsIHJlc3VsdF9zaXplKnNpemVvZihFaWdlbjo6aGFsZikpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjLmRhdGEoKSwgZF9yZXNfaGFsZiwgcmVzdWx0X3NpemUgKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCByZXN1bHRfc2l6ZSAqIHNpemVvZihFaWdlbjo6aGFsZikpOwogICBzeWNsX2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0X3NpemU7ICsraSkgewpAQCAtMjk5LDcgKzI5Miw3IEBACiAgIH0KIH0KIAotdm9pZCB0ZXN0X2dwdV9yZWR1Y3Rpb25zKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlICZzeWNsX2RldmljZSkgewordm9pZCB0ZXN0X2dwdV9yZWR1Y3Rpb25zKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICB0ZXN0X2dwdV9yZWR1Y3Rpb25zKHN5Y2xfZGV2aWNlLCAxMywgMTMsIDApOwogICB0ZXN0X2dwdV9yZWR1Y3Rpb25zKHN5Y2xfZGV2aWNlLCAxMywgMTMsIDEpOwogCkBAIC0zMTAsMjAgKzMwMywxNyBAQAogICB0ZXN0X2dwdV9yZWR1Y3Rpb25zKHN5Y2xfZGV2aWNlLCAzNiwgMzUsIDEpOwogfQogCi12b2lkIHRlc3RfZ3B1X2Z1bGxfcmVkdWN0aW9ucyhjb25zdCBFaWdlbjo6U3ljbERldmljZSAmc3ljbF9kZXZpY2UpIHsKK3ZvaWQgdGVzdF9ncHVfZnVsbF9yZWR1Y3Rpb25zKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBpbnQgc2l6ZSA9IDEzOwotICBpbnQgbnVtX2VsZW0gPSBzaXplKnNpemU7CisgIGludCBudW1fZWxlbSA9IHNpemUgKiBzaXplOwogCiAgIGZsb2F0KiBkX2Zsb2F0ID0gKGZsb2F0KilzeWNsX2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogICBFaWdlbjo6aGFsZiogZF9yZXNfaGFsZiA9IChFaWdlbjo6aGFsZiopc3ljbF9kZXZpY2UuYWxsb2NhdGUoMSAqIHNpemVvZihFaWdlbjo6aGFsZikpOwogICBFaWdlbjo6aGFsZiogZF9yZXNfZmxvYXQgPSAoRWlnZW46OmhhbGYqKXN5Y2xfZGV2aWNlLmFsbG9jYXRlKDEgKiBzaXplb2YoRWlnZW46OmhhbGYpKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0KAotICAgICAgZF9mbG9hdCwgc2l6ZSwgc2l6ZSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMD4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2hhbGYoCi0gICAgICBkX3Jlc19oYWxmKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPEVpZ2VuOjpoYWxmLCAwPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfZmxvYXQoCi0gICAgICBkX3Jlc19mbG9hdCk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMj4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfZmxvYXQoZF9mbG9hdCwgc2l6ZSwgc2l6ZSk7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMD4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2hhbGYoZF9yZXNfaGFsZik7CisgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxFaWdlbjo6aGFsZiwgMD4sIEVpZ2VuOjpBbGlnbmVkPiBncHVfcmVzX2Zsb2F0KGRfcmVzX2Zsb2F0KTsKIAogICBncHVfZmxvYXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9mbG9hdC5yYW5kb20oKTsKIApAQCAtMzQ3LDcgKzMzNyw3IEBACiAgIFZFUklGWV9JU19BUFBST1goZnVsbF9wcmVjKCksIGhhbGZfcHJlYygpKTsKIH0KIAotdm9pZCB0ZXN0X2dwdV9mb3JjZWRfZXZhbHMoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7Cit2b2lkIHRlc3RfZ3B1X2ZvcmNlZF9ldmFscyhjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgaW50IG51bV9lbGVtID0gMTAxOwogCiAgIGZsb2F0KiBkX2Zsb2F0ID0gKGZsb2F0KilzeWNsX2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwpAQCAtMzU1LDE0ICszNDUsMTAgQEAKICAgZmxvYXQqIGRfcmVzX2hhbGYyID0gKGZsb2F0KilzeWNsX2RldmljZS5hbGxvY2F0ZShudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogICBmbG9hdCogZF9yZXNfZmxvYXQgPSAoZmxvYXQqKXN5Y2xfZGV2aWNlLmFsbG9jYXRlKG51bV9lbGVtICogc2l6ZW9mKGZsb2F0KSk7CiAKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9mbG9hdCgKLSAgICAgIGRfZmxvYXQsIG51bV9lbGVtKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfaGFsZjEoCi0gICAgICBkX3Jlc19oYWxmMSwgbnVtX2VsZW0pOwotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6VW5hbGlnbmVkPiBncHVfcmVzX2hhbGYyKAotICAgICAgZF9yZXNfaGFsZjIsIG51bV9lbGVtKTsKLSAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfZmxvYXQoCi0gICAgICBkX3Jlc19mbG9hdCwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X2Zsb2F0KGRfZmxvYXQsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OkFsaWduZWQ+IGdwdV9yZXNfaGFsZjEoZF9yZXNfaGFsZjEsIG51bV9lbGVtKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAxPiwgRWlnZW46OlVuYWxpZ25lZD4gZ3B1X3Jlc19oYWxmMihkX3Jlc19oYWxmMiwgbnVtX2VsZW0pOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDE+LCBFaWdlbjo6QWxpZ25lZD4gZ3B1X3Jlc19mbG9hdChkX3Jlc19mbG9hdCwgbnVtX2VsZW0pOwogCiAgIEVpZ2VuOjphcnJheTxpbnQsIDE+IG5vX2JjYXN0OwogICBub19iY2FzdFswXSA9IDE7CkBAIC0zNzUsMjAgKzM2MSwyMCBAQAogICBUZW5zb3I8ZmxvYXQsIDE+IGhhbGZfcHJlYzEobnVtX2VsZW0pOwogICBUZW5zb3I8ZmxvYXQsIDE+IGhhbGZfcHJlYzIobnVtX2VsZW0pOwogICBUZW5zb3I8ZmxvYXQsIDE+IGZ1bGxfcHJlYyhudW1fZWxlbSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChoYWxmX3ByZWMxLmRhdGEoKSwgZF9yZXNfaGFsZjEsIG51bV9lbGVtKnNpemVvZihmbG9hdCkpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoaGFsZl9wcmVjMi5kYXRhKCksIGRfcmVzX2hhbGYyLCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSpzaXplb2YoZmxvYXQpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYzEuZGF0YSgpLCBkX3Jlc19oYWxmMSwgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGhhbGZfcHJlYzIuZGF0YSgpLCBkX3Jlc19oYWxmMiwgbnVtX2VsZW0gKiBzaXplb2YoZmxvYXQpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcHJlYy5kYXRhKCksIGRfcmVzX2Zsb2F0LCBudW1fZWxlbSAqIHNpemVvZihmbG9hdCkpOwogICBzeWNsX2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW07ICsraSkgewotICAgIHN0ZDo6Y291dCA8PCAiQ2hlY2tpbmcgZm9yY2VkIGV2YWwgIiA8PCBpIDw8IGZ1bGxfcHJlYyhpKSA8PCAiIHZzICIgPDwgaGFsZl9wcmVjMShpKSA8PCAiIHZzICIgPDwgaGFsZl9wcmVjMihpKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8ICJDaGVja2luZyBmb3JjZWQgZXZhbCAiIDw8IGkgPDwgZnVsbF9wcmVjKGkpIDw8ICIgdnMgIiA8PCBoYWxmX3ByZWMxKGkpIDw8ICIgdnMgIiA8PCBoYWxmX3ByZWMyKGkpCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcHJlYyhpKSwgaGFsZl9wcmVjMShpKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3ByZWMoaSksIGhhbGZfcHJlYzIoaSkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3Jfb2ZfZmxvYXQxNl9zeWNsKQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9vZl9mbG9hdDE2X3N5Y2wpIHsKICAgZm9yIChjb25zdCBhdXRvJiBzIDogRWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKICAgICBRdWV1ZUludGVyZmFjZSBxdWV1ZUludGVyZmFjZShzKTsKICAgICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX29mX3N0cmluZ3MuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2Zfc3RyaW5ncy5jcHAKaW5kZXggMTU5NjU2Mi4uZjdkYjI1YyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2Zfc3RyaW5ncy5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfb2Zfc3RyaW5ncy5jcHAKQEAgLTE0LDggKzE0LDcgQEAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiB1c2luZyBFaWdlbjo6VGVuc29yTWFwOwogCi1zdGF0aWMgdm9pZCB0ZXN0X2Fzc2lnbigpCi17CitzdGF0aWMgdm9pZCB0ZXN0X2Fzc2lnbigpIHsKICAgc3RkOjpzdHJpbmcgZGF0YTFbNl07CiAgIFRlbnNvck1hcDxUZW5zb3I8c3RkOjpzdHJpbmcsIDI+PiBtYXQxKGRhdGExLCAyLCAzKTsKICAgc3RkOjpzdHJpbmcgZGF0YTJbNl07CkBAIC0yMywxMCArMjIsMTAgQEAKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgewogICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzMTsKLSAgICBzMSA8PCAiYWJjIiA8PCBpKjM7CisgICAgczEgPDwgImFiYyIgPDwgaSAqIDM7CiAgICAgZGF0YTFbaV0gPSBzMS5zdHIoKTsKICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gczI7Ci0gICAgczIgPDwgImRlZiIgPDwgaSo1OworICAgIHMyIDw8ICJkZWYiIDw8IGkgKiA1OwogICAgIGRhdGEyW2ldID0gczIuc3RyKCk7CiAgIH0KIApAQCAtNDMsMjkgKzQyLDI3IEBACiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewotICAgICAgVkVSSUZZX0lTX0VRVUFMKHJzbHQxKGksaiksIGRhdGExW2krMipqXSk7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwocnNsdDIoaSxqKSwgZGF0YTJbaSsyKmpdKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTChyc2x0MyhpLGopLCBkYXRhMVtpKzIqal0pOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKHJzbHQ0KGksaiksIGRhdGEyW2krMipqXSk7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwocnNsdDUoaSxqKSwgZGF0YTFbaSsyKmpdKTsKLSAgICAgIFZFUklGWV9JU19FUVVBTChyc2x0NihpLGopLCBkYXRhMltpKzIqal0pOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJzbHQxKGksIGopLCBkYXRhMVtpICsgMiAqIGpdKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChyc2x0MihpLCBqKSwgZGF0YTJbaSArIDIgKiBqXSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwocnNsdDMoaSwgaiksIGRhdGExW2kgKyAyICogal0pOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJzbHQ0KGksIGopLCBkYXRhMltpICsgMiAqIGpdKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChyc2x0NShpLCBqKSwgZGF0YTFbaSArIDIgKiBqXSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwocnNsdDYoaSwgaiksIGRhdGEyW2kgKyAyICogal0pOwogICAgIH0KICAgfQogfQogCi0KLXN0YXRpYyB2b2lkIHRlc3RfY29uY2F0KCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfY29uY2F0KCkgewogICBUZW5zb3I8c3RkOjpzdHJpbmcsIDI+IHQxKDIsIDMpOwogICBUZW5zb3I8c3RkOjpzdHJpbmcsIDI+IHQyKDIsIDMpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzMTsKLSAgICAgIHMxIDw8ICJhYmMiIDw8IGkgKyBqKjI7CisgICAgICBzMSA8PCAiYWJjIiA8PCBpICsgaiAqIDI7CiAgICAgICB0MShpLCBqKSA9IHMxLnN0cigpOwogICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHMyOwotICAgICAgczIgPDwgImRlZiIgPDwgaSo1ICsgaiozMjsKKyAgICAgIHMyIDw8ICJkZWYiIDw8IGkgKiA1ICsgaiAqIDMyOwogICAgICAgdDIoaSwgaikgPSBzMi5zdHIoKTsKICAgICB9CiAgIH0KQEAgLTc2LDIwICs3MywxOCBAQAogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKLSAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiksICAgdDEoaSwgaikpOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLCBqKzMpLCB0MihpLCBqKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksIGopLCB0MShpLCBqKSk7CisgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksIGogKyAzKSwgdDIoaSwgaikpOwogICAgIH0KICAgfQogfQogCi0KLXN0YXRpYyB2b2lkIHRlc3Rfc2xpY2VzKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3Rfc2xpY2VzKCkgewogICBUZW5zb3I8c3RkOjpzdHJpbmcsIDI+IGRhdGEoMiwgNik7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzMTsKLSAgICAgIHMxIDw8ICJhYmMiIDw8IGkgKyBqKjI7CisgICAgICBzMSA8PCAiYWJjIiA8PCBpICsgaiAqIDI7CiAgICAgICBkYXRhKGksIGopID0gczEuc3RyKCk7CiAgICAgfQogICB9CkBAIC0xMDMsMTUgKzk4LDEzIEBACiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewotICAgICAgVkVSSUZZX0lTX0VRVUFMKGRhdGEoaSwgaiksICAgdDEoaSwgaikpOwotICAgICAgVkVSSUZZX0lTX0VRVUFMKGRhdGEoaSwgaiszKSwgdDIoaSwgaikpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKGRhdGEoaSwgaiksIHQxKGksIGopKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChkYXRhKGksIGogKyAzKSwgdDIoaSwgaikpOwogICAgIH0KICAgfQogfQogCi0KLXN0YXRpYyB2b2lkIHRlc3RfYWRkaXRpb25zKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfYWRkaXRpb25zKCkgewogICBUZW5zb3I8c3RkOjpzdHJpbmcsIDE+IGRhdGExKDMpOwogICBUZW5zb3I8c3RkOjpzdHJpbmcsIDE+IGRhdGEyKDMpOwogICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewpAQCAtMTMwLDE5ICsxMjMsMTUgQEAKICAgfQogfQogCi0KLXN0YXRpYyB2b2lkIHRlc3RfaW5pdGlhbGl6YXRpb24oKQoteworc3RhdGljIHZvaWQgdGVzdF9pbml0aWFsaXphdGlvbigpIHsKICAgVGVuc29yPHN0ZDo6c3RyaW5nLCAyPiBhKDIsIDMpOwogICBhLnNldENvbnN0YW50KHN0ZDo6c3RyaW5nKCJmb28iKSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMiozOyArK2kpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyICogMzsgKytpKSB7CiAgICAgVkVSSUZZX0lTX0VRVUFMKGEoaSksIHN0ZDo6c3RyaW5nKCJmb28iKSk7CiAgIH0KIH0KIAotCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX29mX3N0cmluZ3MpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX29mX3N0cmluZ3MpIHsKICAgLy8gQmV3YXJlOiBub25lIG9mIHRoaXMgaXMgbGlrZWx5IHRvIGV2ZXIgd29yayBvbiBhIEdQVS4KICAgQ0FMTF9TVUJURVNUKHRlc3RfYXNzaWduKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9jb25jYXQoKSk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9wYWRkaW5nLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3BhZGRpbmcuY3BwCmluZGV4IGI4YTMyOWQuLjZjNWRkZjAgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3BhZGRpbmcuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3BhZGRpbmcuY3BwCkBAIC0xMywxMCArMTMsOSBAQAogCiB1c2luZyBFaWdlbjo6VGVuc29yOwogCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3BhZGRpbmcoKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3BhZGRpbmcoKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMsIDUsIDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAKICAgYXJyYXk8c3RkOjpwYWlyPHB0cmRpZmZfdCwgcHRyZGlmZl90PiwgND4gcGFkZGluZ3M7CkBAIC0yOCwxOSArMjcsMTkgQEAKICAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiBwYWRkZWQ7CiAgIHBhZGRlZCA9IHRlbnNvci5wYWQocGFkZGluZ3MpOwogCi0gIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDApLCAyKzApOwotICBWRVJJRllfSVNfRVFVQUwocGFkZGVkLmRpbWVuc2lvbigxKSwgMyszKTsKLSAgVkVSSUZZX0lTX0VRVUFMKHBhZGRlZC5kaW1lbnNpb24oMiksIDUrNyk7Ci0gIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDMpLCA3KzApOworICBWRVJJRllfSVNfRVFVQUwocGFkZGVkLmRpbWVuc2lvbigwKSwgMiArIDApOworICBWRVJJRllfSVNfRVFVQUwocGFkZGVkLmRpbWVuc2lvbigxKSwgMyArIDMpOworICBWRVJJRllfSVNfRVFVQUwocGFkZGVkLmRpbWVuc2lvbigyKSwgNSArIDcpOworICBWRVJJRllfSVNfRVFVQUwocGFkZGVkLmRpbWVuc2lvbigzKSwgNyArIDApOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA2OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMTI7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewogICAgICAgICAgIGlmIChqID49IDIgJiYgaiA8IDUgJiYgayA+PSAzICYmIGsgPCA4KSB7Ci0gICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocGFkZGVkKGksaixrLGwpLCB0ZW5zb3IoaSxqLTIsay0zLGwpKTsKKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChwYWRkZWQoaSwgaiwgaywgbCksIHRlbnNvcihpLCBqIC0gMiwgayAtIDMsIGwpKTsKICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHBhZGRlZChpLGosayxsKSwgMC4wZik7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocGFkZGVkKGksIGosIGssIGwpLCAwLjBmKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTQ4LDEwICs0Nyw5IEBACiAgIH0KIH0KIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X3BhZGRlZF9leHByKCkKLXsKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CitzdGF0aWMgdm9pZCB0ZXN0X3BhZGRlZF9leHByKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogCiAgIGFycmF5PHN0ZDo6cGFpcjxwdHJkaWZmX3QsIHB0cmRpZmZfdD4sIDQ+IHBhZGRpbmdzOwpAQCAtNzEsMTAgKzY5LDEwIEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA2OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMTI7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgIGNvbnN0IGZsb2F0IHJlc3VsdF92YWx1ZSA9IERhdGFMYXlvdXQgPT0gQ29sTWFqb3IgPwotICAgICAgICAgICAgICByZXN1bHQoaSsyKmosaysxMipsKSA6IHJlc3VsdChqKzYqaSxsKzcqayk7CisgICAgICAgICAgY29uc3QgZmxvYXQgcmVzdWx0X3ZhbHVlID0KKyAgICAgICAgICAgICAgRGF0YUxheW91dCA9PSBDb2xNYWpvciA/IHJlc3VsdChpICsgMiAqIGosIGsgKyAxMiAqIGwpIDogcmVzdWx0KGogKyA2ICogaSwgbCArIDcgKiBrKTsKICAgICAgICAgICBpZiAoaiA+PSAyICYmIGogPCA1ICYmIGsgPj0gMyAmJiBrIDwgOCkgewotICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF92YWx1ZSwgdGVuc29yKGksai0yLGstMyxsKSk7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X3ZhbHVlLCB0ZW5zb3IoaSwgaiAtIDIsIGsgLSAzLCBsKSk7CiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfdmFsdWUsIDAuMGYpOwogICAgICAgICAgIH0KQEAgLTg0LDggKzgyLDcgQEAKICAgfQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3BhZGRpbmcpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3BhZGRpbmcpIHsKICAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX3BhZGRpbmc8Q29sTWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfcGFkZGluZzxSb3dNYWpvcj4oKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3BhZGRlZF9leHByPENvbE1ham9yPigpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3BhZGRpbmdfc3ljbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9wYWRkaW5nX3N5Y2wuY3BwCmluZGV4IDliMTZiYjEuLmFlNGQ5OGEgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3BhZGRpbmdfc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcGFkZGluZ19zeWNsLmNwcApAQCAtMTIsMTQgKzEyLDEyIEBACiAvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKIC8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgogCi0KICNkZWZpbmUgRUlHRU5fVEVTVF9OT19MT05HRE9VQkxFCiAjZGVmaW5lIEVJR0VOX1RFU1RfTk9fQ09NUExFWAogCiAjZGVmaW5lIEVJR0VOX0RFRkFVTFRfREVOU0VfSU5ERVhfVFlQRSBpbnQ2NF90CiAjZGVmaW5lIEVJR0VOX1VTRV9TWUNMCiAKLQogI2luY2x1ZGUgIm1haW4uaCIKICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9UZW5zb3I+CiAKQEAgLTI4LDExICsyNiw4IEBACiB1c2luZyBFaWdlbjo6VGVuc29yOwogdXNpbmcgRWlnZW46OlRlbnNvck1hcDsKIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3BhZGRpbmcoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQotewotCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9wYWRkaW5nKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBJbmRleFR5cGUgc2l6ZURpbTEgPSAyOwogICBJbmRleFR5cGUgc2l6ZURpbTIgPSAzOwogICBJbmRleFR5cGUgc2l6ZURpbTMgPSA1OwpAQCAtNTYsMjcgKzUxLDI2IEBACiAKICAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHBhZGRlZChwYWRlZHRlbnNvclJhbmdlKTsKIAorICBEYXRhVHlwZSogZ3B1X2RhdGExID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGEyID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYWRkZWQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUxKGdwdV9kYXRhMSwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUyKGdwdV9kYXRhMiwgcGFkZWR0ZW5zb3JSYW5nZSk7CiAKLSAgRGF0YVR5cGUqIGdwdV9kYXRhMSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOwotICBEYXRhVHlwZSogZ3B1X2RhdGEyICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGFkZGVkLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHUxKGdwdV9kYXRhMSwgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsIHBhZGVkdGVuc29yUmFuZ2UpOwotCi0gIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDApLCAyKzApOwotICBWRVJJRllfSVNfRVFVQUwocGFkZGVkLmRpbWVuc2lvbigxKSwgMyszKTsKLSAgVkVSSUZZX0lTX0VRVUFMKHBhZGRlZC5kaW1lbnNpb24oMiksIDUrNyk7Ci0gIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDMpLCA3KzApOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IuZGF0YSgpLCh0ZW5zb3Iuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSAgZ3B1Mi5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdTEucGFkKHBhZGRpbmdzKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHBhZGRlZC5kYXRhKCksIGdwdV9kYXRhMiwocGFkZGVkLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDApLCAyICsgMCk7CisgIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDEpLCAzICsgMyk7CisgIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDIpLCA1ICsgNyk7CisgIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDMpLCA3ICsgMCk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YTEsIHRlbnNvci5kYXRhKCksICh0ZW5zb3Iuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBncHUyLmRldmljZShzeWNsX2RldmljZSkgPSBncHUxLnBhZChwYWRkaW5ncyk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChwYWRkZWQuZGF0YSgpLCBncHVfZGF0YTIsIChwYWRkZWQuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IHBhZGVkU2l6ZURpbTE7ICsraSkgewogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgcGFkZWRTaXplRGltMjsgKytqKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IHBhZGVkU2l6ZURpbTM7ICsraykgewogICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IHBhZGVkU2l6ZURpbTQ7ICsrbCkgewogICAgICAgICAgIGlmIChqID49IDIgJiYgaiA8IDUgJiYgayA+PSAzICYmIGsgPCA4KSB7Ci0gICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocGFkZGVkKGksaixrLGwpLCB0ZW5zb3IoaSxqLTIsay0zLGwpKTsKKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChwYWRkZWQoaSwgaiwgaywgbCksIHRlbnNvcihpLCBqIC0gMiwgayAtIDMsIGwpKTsKICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHBhZGRlZChpLGosayxsKSwgMC4wZik7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocGFkZGVkKGksIGosIGssIGwpLCAwLjBmKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTg2LDkgKzgwLDggQEAKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfZGF0YTIpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfcGFkZGVkX2V4cHIoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQotewordGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgorc3RhdGljIHZvaWQgdGVzdF9wYWRkZWRfZXhwcihjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gMjsKICAgSW5kZXhUeXBlIHNpemVEaW0yID0gMzsKICAgSW5kZXhUeXBlIHNpemVEaW0zID0gNTsKQEAgLTEwOCwyNyArMTAxLDI1IEBACiAgIHJlc2hhcGVfZGltc1swXSA9IDEyOwogICByZXNoYXBlX2RpbXNbMV0gPSA4NDsKIAorICBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gcmVzdWx0KHJlc2hhcGVfZGltcyk7CiAKLSAgVGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ICByZXN1bHQocmVzaGFwZV9kaW1zKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhMSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhMiA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocmVzdWx0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MShncHVfZGF0YTEsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsIHJlc2hhcGVfZGltcyk7CiAKLSAgRGF0YVR5cGUqIGdwdV9kYXRhMSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOwotICBEYXRhVHlwZSogZ3B1X2RhdGEyICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocmVzdWx0LnNpemUoKSpzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHUxKGdwdV9kYXRhMSwgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsIHJlc2hhcGVfZGltcyk7Ci0KLQotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IuZGF0YSgpLCh0ZW5zb3Iuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSAgZ3B1Mi5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdTEucGFkKHBhZGRpbmdzKS5yZXNoYXBlKHJlc2hhcGVfZGltcyk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZXN1bHQuZGF0YSgpLCBncHVfZGF0YTIsKHJlc3VsdC5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCB0ZW5zb3IuZGF0YSgpLCAodGVuc29yLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgZ3B1Mi5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1MS5wYWQocGFkZGluZ3MpLnJlc2hhcGUocmVzaGFwZV9kaW1zKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJlc3VsdC5kYXRhKCksIGdwdV9kYXRhMiwgKHJlc3VsdC5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAKICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IDY7ICsraikgewogICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCAxMjsgKytrKSB7CiAgICAgICAgIGZvciAoSW5kZXhUeXBlIGwgPSAwOyBsIDwgNzsgKytsKSB7Ci0gICAgICAgICAgY29uc3QgZmxvYXQgcmVzdWx0X3ZhbHVlID0gRGF0YUxheW91dCA9PSBDb2xNYWpvciA/Ci0gICAgICAgICAgICAgIHJlc3VsdChpKzIqaixrKzEyKmwpIDogcmVzdWx0KGorNippLGwrNyprKTsKKyAgICAgICAgICBjb25zdCBmbG9hdCByZXN1bHRfdmFsdWUgPQorICAgICAgICAgICAgICBEYXRhTGF5b3V0ID09IENvbE1ham9yID8gcmVzdWx0KGkgKyAyICogaiwgayArIDEyICogbCkgOiByZXN1bHQoaiArIDYgKiBpLCBsICsgNyAqIGspOwogICAgICAgICAgIGlmIChqID49IDIgJiYgaiA8IDUgJiYgayA+PSAzICYmIGsgPCA4KSB7Ci0gICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X3ZhbHVlLCB0ZW5zb3IoaSxqLTIsay0zLGwpKTsKKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfdmFsdWUsIHRlbnNvcihpLCBqIC0gMiwgayAtIDMsIGwpKTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdF92YWx1ZSwgMC4wZik7CiAgICAgICAgICAgfQpAQCAtMTQwLDE4ICsxMzEsMTcgQEAKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfZGF0YTIpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgZGV2X1NlbGVjdG9yPiB2b2lkIHN5Y2xfcGFkZGluZ190ZXN0X3Blcl9kZXZpY2UoZGV2X1NlbGVjdG9yIHMpewordGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBkZXZfU2VsZWN0b3I+Cit2b2lkIHN5Y2xfcGFkZGluZ190ZXN0X3Blcl9kZXZpY2UoZGV2X1NlbGVjdG9yIHMpIHsKICAgUXVldWVJbnRlcmZhY2UgcXVldWVJbnRlcmZhY2Uocyk7CiAgIGF1dG8gc3ljbF9kZXZpY2UgPSBFaWdlbjo6U3ljbERldmljZSgmcXVldWVJbnRlcmZhY2UpOwogICB0ZXN0X3NpbXBsZV9wYWRkaW5nPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogICB0ZXN0X3NpbXBsZV9wYWRkaW5nPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogICB0ZXN0X3BhZGRlZF9leHByPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogICB0ZXN0X3BhZGRlZF9leHByPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwotCiB9Ci1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3BhZGRpbmdfc3ljbCkKLXsKLSAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOkVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3BhZGRpbmdfc3ljbCkgeworICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IEVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CiAgICAgQ0FMTF9TVUJURVNUKHN5Y2xfcGFkZGluZ190ZXN0X3Blcl9kZXZpY2U8aGFsZj4oZGV2aWNlKSk7CiAgICAgQ0FMTF9TVUJURVNUKHN5Y2xfcGFkZGluZ190ZXN0X3Blcl9kZXZpY2U8ZmxvYXQ+KGRldmljZSkpOwogICB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9wYXRjaC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9wYXRjaC5jcHAKaW5kZXggNDk4YWI4Yy4uNTliMDNlNyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcGF0Y2guY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3BhdGNoLmNwcApAQCAtMTMsMTAgKzEzLDkgQEAKIAogdXNpbmcgRWlnZW46OlRlbnNvcjsKIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9wYXRjaCgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcpOwordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgorc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfcGF0Y2goKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMsIDUsIDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIGFycmF5PHB0cmRpZmZfdCwgND4gcGF0Y2hfZGltczsKIApAQCAtODMsOSArODIsOSBAQAogICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbigxKSwgMik7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDIpLCAyKTsKICAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMyksIDEpOwotICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbig0KSwgMioyKjQqNyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDQpLCAyICogMiAqIDQgKiA3KTsKICAgfSBlbHNlIHsKLSAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMCksIDIqMio0KjcpOworICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbigwKSwgMiAqIDIgKiA0ICogNyk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDEpLCAxKTsKICAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMiksIDIpOwogICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbigzKSwgMik7CkBAIC0xMDUsOSArMTA0LDkgQEAKICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDI7ICsreCkgewogICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAyOyArK3kpIHsKICAgICAgICAgICAgICAgaWYgKERhdGFMYXlvdXQgPT0gQ29sTWFqb3IpIHsKLSAgICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksait4LGsreSxsKSwgdHdvZF9wYXRjaCgwLHgseSwwLHBhdGNoX2xvYykpOworICAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiArIHgsIGsgKyB5LCBsKSwgdHdvZF9wYXRjaCgwLCB4LCB5LCAwLCBwYXRjaF9sb2MpKTsKICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksait4LGsreSxsKSwgdHdvZF9wYXRjaChwYXRjaF9sb2MsMCx4LHksMCkpOworICAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiArIHgsIGsgKyB5LCBsKSwgdHdvZF9wYXRjaChwYXRjaF9sb2MsIDAsIHgsIHksIDApKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgIH0KQEAgLTEyOCw5ICsxMjcsOSBAQAogICAgIFZFUklGWV9JU19FUVVBTCh0aHJlZWRfcGF0Y2guZGltZW5zaW9uKDEpLCAyKTsKICAgICBWRVJJRllfSVNfRVFVQUwodGhyZWVkX3BhdGNoLmRpbWVuc2lvbigyKSwgMyk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHRocmVlZF9wYXRjaC5kaW1lbnNpb24oMyksIDUpOwotICAgIFZFUklGWV9JU19FUVVBTCh0aHJlZWRfcGF0Y2guZGltZW5zaW9uKDQpLCAyKjIqMyozKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodGhyZWVkX3BhdGNoLmRpbWVuc2lvbig0KSwgMiAqIDIgKiAzICogMyk7CiAgIH0gZWxzZSB7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHRocmVlZF9wYXRjaC5kaW1lbnNpb24oMCksIDIqMiozKjMpOworICAgIFZFUklGWV9JU19FUVVBTCh0aHJlZWRfcGF0Y2guZGltZW5zaW9uKDApLCAyICogMiAqIDMgKiAzKTsKICAgICBWRVJJRllfSVNfRVFVQUwodGhyZWVkX3BhdGNoLmRpbWVuc2lvbigxKSwgMSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHRocmVlZF9wYXRjaC5kaW1lbnNpb24oMiksIDIpOwogICAgIFZFUklGWV9JU19FUVVBTCh0aHJlZWRfcGF0Y2guZGltZW5zaW9uKDMpLCAzKTsKQEAgLTE1MSw5ICsxNTAsOSBAQAogICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAzOyArK3kpIHsKICAgICAgICAgICAgICAgZm9yIChpbnQgeiA9IDA7IHogPCA1OyArK3opIHsKICAgICAgICAgICAgICAgICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgewotICAgICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGoreCxrK3ksbCt6KSwgdGhyZWVkX3BhdGNoKDAseCx5LHoscGF0Y2hfbG9jKSk7CisgICAgICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGogKyB4LCBrICsgeSwgbCArIHopLCB0aHJlZWRfcGF0Y2goMCwgeCwgeSwgeiwgcGF0Y2hfbG9jKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqK3gsayt5LGwreiksIHRocmVlZF9wYXRjaChwYXRjaF9sb2MsMCx4LHkseikpOworICAgICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqICsgeCwgayArIHksIGwgKyB6KSwgdGhyZWVkX3BhdGNoKHBhdGNoX2xvYywgMCwgeCwgeSwgeikpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTY0LDkgKzE2Myw4IEBACiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9wYXRjaCkKLXsKLSAgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9wYXRjaDxDb2xNYWpvcj4oKSk7Ci0gICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfcGF0Y2g8Um93TWFqb3I+KCkpOwotICAgLy8gICBDQUxMX1NVQlRFU1QodGVzdF9leHByX3NodWZmbGluZygpKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfcGF0Y2gpIHsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX3BhdGNoPENvbE1ham9yPigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX3BhdGNoPFJvd01ham9yPigpKTsKKyAgLy8gICBDQUxMX1NVQlRFU1QodGVzdF9leHByX3NodWZmbGluZygpKTsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3BhdGNoX3N5Y2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcGF0Y2hfc3ljbC5jcHAKaW5kZXggMTIxNmFkMi4uYjFiZTlmZiAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcGF0Y2hfc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcGF0Y2hfc3ljbC5jcHAKQEAgLTI1LDggKzI1LDcgQEAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3BhdGNoX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKXsKLQorc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfcGF0Y2hfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gMjsKICAgSW5kZXhUeXBlIHNpemVEaW0yID0gMzsKICAgSW5kZXhUeXBlIHNpemVEaW0zID0gNTsKQEAgLTM0LDEzICszMywxMyBAQAogICBhcnJheTxJbmRleFR5cGUsIDQ+IHRlbnNvclJhbmdlID0ge3tzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNH19OwogICBhcnJheTxJbmRleFR5cGUsIDU+IHBhdGNoVGVuc29yUmFuZ2U7CiAgIGlmIChEYXRhTGF5b3V0ID09IENvbE1ham9yKSB7Ci0gICBwYXRjaFRlbnNvclJhbmdlID0ge3sxLCAxLCAxLCAxLCBzaXplRGltMSpzaXplRGltMipzaXplRGltMypzaXplRGltNH19OwotICB9ZWxzZXsKLSAgICAgcGF0Y2hUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEqc2l6ZURpbTIqc2l6ZURpbTMqc2l6ZURpbTQsMSwgMSwgMSwgMX19OworICAgIHBhdGNoVGVuc29yUmFuZ2UgPSB7ezEsIDEsIDEsIDEsIHNpemVEaW0xICogc2l6ZURpbTIgKiBzaXplRGltMyAqIHNpemVEaW00fX07CisgIH0gZWxzZSB7CisgICAgcGF0Y2hUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEgKiBzaXplRGltMiAqIHNpemVEaW0zICogc2l6ZURpbTQsIDEsIDEsIDEsIDF9fTsKICAgfQogCi0gIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCxJbmRleFR5cGU+IHRlbnNvcih0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+IG5vX3BhdGNoKHBhdGNoVGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yKHRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IG5vX3BhdGNoKHBhdGNoVGVuc29yUmFuZ2UpOwogCiAgIHRlbnNvci5zZXRSYW5kb20oKTsKIApAQCAtNTAsMTYgKzQ5LDE2IEBACiAgIHBhdGNoX2RpbXNbMl0gPSAxOwogICBwYXRjaF9kaW1zWzNdID0gMTsKIAotICBjb25zdCBzaXplX3QgdGVuc29yQnVmZlNpemUgPXRlbnNvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgc2l6ZV90IHBhdGNoVGVuc29yQnVmZlNpemUgPW5vX3BhdGNoLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfdGVuc29yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yQnVmZlNpemUpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX25vX3BhdGNoICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOworICBjb25zdCBzaXplX3QgdGVuc29yQnVmZlNpemUgPSB0ZW5zb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgc2l6ZV90IHBhdGNoVGVuc29yQnVmZlNpemUgPSBub19wYXRjaC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfdGVuc29yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JCdWZmU2l6ZSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfbm9fcGF0Y2ggPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKIAotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV90ZW5zb3IoZ3B1X2RhdGFfdGVuc29yLCB0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X25vX3BhdGNoKGdwdV9kYXRhX25vX3BhdGNoLCBwYXRjaFRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3RlbnNvcihncHVfZGF0YV90ZW5zb3IsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X25vX3BhdGNoKGdwdV9kYXRhX25vX3BhdGNoLCBwYXRjaFRlbnNvclJhbmdlKTsKIAogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfdGVuc29yLCB0ZW5zb3IuZGF0YSgpLCB0ZW5zb3JCdWZmU2l6ZSk7Ci0gIGdwdV9ub19wYXRjaC5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV90ZW5zb3IuZXh0cmFjdF9wYXRjaGVzKHBhdGNoX2RpbXMpOworICBncHVfbm9fcGF0Y2guZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV90ZW5zb3IuZXh0cmFjdF9wYXRjaGVzKHBhdGNoX2RpbXMpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qobm9fcGF0Y2guZGF0YSgpLCBncHVfZGF0YV9ub19wYXRjaCwgcGF0Y2hUZW5zb3JCdWZmU2l6ZSk7CiAKICAgaWYgKERhdGFMYXlvdXQgPT0gQ29sTWFqb3IpIHsKQEAgLTg2LDE2ICs4NSwxNiBAQAogICBwYXRjaF9kaW1zWzNdID0gNzsKIAogICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgewotICAgcGF0Y2hUZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTEsc2l6ZURpbTIsc2l6ZURpbTMsc2l6ZURpbTQsMX19OwotICB9ZWxzZXsKLSAgICAgcGF0Y2hUZW5zb3JSYW5nZSA9IHt7MSxzaXplRGltMSxzaXplRGltMixzaXplRGltMyxzaXplRGltNH19OworICAgIHBhdGNoVGVuc29yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTMsIHNpemVEaW00LCAxfX07CisgIH0gZWxzZSB7CisgICAgcGF0Y2hUZW5zb3JSYW5nZSA9IHt7MSwgc2l6ZURpbTEsIHNpemVEaW0yLCBzaXplRGltMywgc2l6ZURpbTR9fTsKICAgfQotICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBzaW5nbGVfcGF0Y2gocGF0Y2hUZW5zb3JSYW5nZSk7Ci0gIHBhdGNoVGVuc29yQnVmZlNpemUgPXNpbmdsZV9wYXRjaC5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3NpbmdsZV9wYXRjaCAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+PiBncHVfc2luZ2xlX3BhdGNoKGdwdV9kYXRhX3NpbmdsZV9wYXRjaCwgcGF0Y2hUZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBzaW5nbGVfcGF0Y2gocGF0Y2hUZW5zb3JSYW5nZSk7CisgIHBhdGNoVGVuc29yQnVmZlNpemUgPSBzaW5nbGVfcGF0Y2guc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3NpbmdsZV9wYXRjaCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfc2luZ2xlX3BhdGNoKGdwdV9kYXRhX3NpbmdsZV9wYXRjaCwgcGF0Y2hUZW5zb3JSYW5nZSk7CiAKLSAgZ3B1X3NpbmdsZV9wYXRjaC5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV90ZW5zb3IuZXh0cmFjdF9wYXRjaGVzKHBhdGNoX2RpbXMpOworICBncHVfc2luZ2xlX3BhdGNoLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfdGVuc29yLmV4dHJhY3RfcGF0Y2hlcyhwYXRjaF9kaW1zKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHNpbmdsZV9wYXRjaC5kYXRhKCksIGdwdV9kYXRhX3NpbmdsZV9wYXRjaCwgcGF0Y2hUZW5zb3JCdWZmU2l6ZSk7CiAKICAgaWYgKERhdGFMYXlvdXQgPT0gQ29sTWFqb3IpIHsKQEAgLTExOSwxOCArMTE4LDE4IEBACiAgIHBhdGNoX2RpbXNbMV0gPSAyOwogICBwYXRjaF9kaW1zWzJdID0gMjsKICAgcGF0Y2hfZGltc1szXSA9IDE7Ci0gIAotICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgewotICAgcGF0Y2hUZW5zb3JSYW5nZSA9IHt7MSwyLDIsMSwyKjIqNCo3fX07Ci0gIH1lbHNlewotICAgICBwYXRjaFRlbnNvclJhbmdlID0ge3syKjIqNCo3LCAxLCAyLDIsMX19OwotICB9Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+IHR3b2RfcGF0Y2gocGF0Y2hUZW5zb3JSYW5nZSk7Ci0gIHBhdGNoVGVuc29yQnVmZlNpemUgPXR3b2RfcGF0Y2guc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV90d29kX3BhdGNoICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV90d29kX3BhdGNoKGdwdV9kYXRhX3R3b2RfcGF0Y2gsIHBhdGNoVGVuc29yUmFuZ2UpOwogCi0gIGdwdV90d29kX3BhdGNoLmRldmljZShzeWNsX2RldmljZSk9Z3B1X3RlbnNvci5leHRyYWN0X3BhdGNoZXMocGF0Y2hfZGltcyk7CisgIGlmIChEYXRhTGF5b3V0ID09IENvbE1ham9yKSB7CisgICAgcGF0Y2hUZW5zb3JSYW5nZSA9IHt7MSwgMiwgMiwgMSwgMiAqIDIgKiA0ICogN319OworICB9IGVsc2UgeworICAgIHBhdGNoVGVuc29yUmFuZ2UgPSB7ezIgKiAyICogNCAqIDcsIDEsIDIsIDIsIDF9fTsKKyAgfQorICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdHdvZF9wYXRjaChwYXRjaFRlbnNvclJhbmdlKTsKKyAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IHR3b2RfcGF0Y2guc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3R3b2RfcGF0Y2ggPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3R3b2RfcGF0Y2goZ3B1X2RhdGFfdHdvZF9wYXRjaCwgcGF0Y2hUZW5zb3JSYW5nZSk7CisKKyAgZ3B1X3R3b2RfcGF0Y2guZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV90ZW5zb3IuZXh0cmFjdF9wYXRjaGVzKHBhdGNoX2RpbXMpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodHdvZF9wYXRjaC5kYXRhKCksIGdwdV9kYXRhX3R3b2RfcGF0Y2gsIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCiAgIGlmIChEYXRhTGF5b3V0ID09IENvbE1ham9yKSB7CkBAIC0xMzgsOSArMTM3LDkgQEAKICAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMSksIDIpOwogICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbigyKSwgMik7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDMpLCAxKTsKLSAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oNCksIDIqMio0KjcpOworICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbig0KSwgMiAqIDIgKiA0ICogNyk7CiAgIH0gZWxzZSB7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDApLCAyKjIqNCo3KTsKKyAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMCksIDIgKiAyICogNCAqIDcpOwogICAgIFZFUklGWV9JU19FUVVBTCh0d29kX3BhdGNoLmRpbWVuc2lvbigxKSwgMSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHR3b2RfcGF0Y2guZGltZW5zaW9uKDIpLCAyKTsKICAgICBWRVJJRllfSVNfRVFVQUwodHdvZF9wYXRjaC5kaW1lbnNpb24oMyksIDIpOwpAQCAtMTYwLDkgKzE1OSw5IEBACiAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAyOyArK3gpIHsKICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgMjsgKyt5KSB7CiAgICAgICAgICAgICAgIGlmIChEYXRhTGF5b3V0ID09IENvbE1ham9yKSB7Ci0gICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGoreCxrK3ksbCksIHR3b2RfcGF0Y2goMCx4LHksMCxwYXRjaF9sb2MpKTsKKyAgICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGogKyB4LCBrICsgeSwgbCksIHR3b2RfcGF0Y2goMCwgeCwgeSwgMCwgcGF0Y2hfbG9jKSk7CiAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGoreCxrK3ksbCksIHR3b2RfcGF0Y2gocGF0Y2hfbG9jLDAseCx5LDApKTsKKyAgICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGogKyB4LCBrICsgeSwgbCksIHR3b2RfcGF0Y2gocGF0Y2hfbG9jLCAwLCB4LCB5LCAwKSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICB9CkBAIC0xNzcsMTYgKzE3NiwxNiBAQAogICBwYXRjaF9kaW1zWzNdID0gNTsKIAogICBpZiAoRGF0YUxheW91dCA9PSBDb2xNYWpvcikgewotICAgcGF0Y2hUZW5zb3JSYW5nZSA9IHt7MSwyLDMsNSwyKjIqMyozfX07Ci0gIH1lbHNlewotICAgICBwYXRjaFRlbnNvclJhbmdlID0ge3syKjIqMyozLCAxLCAyLDMsNX19OworICAgIHBhdGNoVGVuc29yUmFuZ2UgPSB7ezEsIDIsIDMsIDUsIDIgKiAyICogMyAqIDN9fTsKKyAgfSBlbHNlIHsKKyAgICBwYXRjaFRlbnNvclJhbmdlID0ge3syICogMiAqIDMgKiAzLCAxLCAyLCAzLCA1fX07CiAgIH0KLSAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gdGhyZWVkX3BhdGNoKHBhdGNoVGVuc29yUmFuZ2UpOwotICBwYXRjaFRlbnNvckJ1ZmZTaXplID10aHJlZWRfcGF0Y2guc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV90aHJlZWRfcGF0Y2ggID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X3RocmVlZF9wYXRjaChncHVfZGF0YV90aHJlZWRfcGF0Y2gsIHBhdGNoVGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGhyZWVkX3BhdGNoKHBhdGNoVGVuc29yUmFuZ2UpOworICBwYXRjaFRlbnNvckJ1ZmZTaXplID0gdGhyZWVkX3BhdGNoLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV90aHJlZWRfcGF0Y2ggPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3RocmVlZF9wYXRjaChncHVfZGF0YV90aHJlZWRfcGF0Y2gsIHBhdGNoVGVuc29yUmFuZ2UpOwogCi0gIGdwdV90aHJlZWRfcGF0Y2guZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfdGVuc29yLmV4dHJhY3RfcGF0Y2hlcyhwYXRjaF9kaW1zKTsKKyAgZ3B1X3RocmVlZF9wYXRjaC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X3RlbnNvci5leHRyYWN0X3BhdGNoZXMocGF0Y2hfZGltcyk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0aHJlZWRfcGF0Y2guZGF0YSgpLCBncHVfZGF0YV90aHJlZWRfcGF0Y2gsIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCiAgIGlmIChEYXRhTGF5b3V0ID09IENvbE1ham9yKSB7CkBAIC0xOTQsOSArMTkzLDkgQEAKICAgICBWRVJJRllfSVNfRVFVQUwodGhyZWVkX3BhdGNoLmRpbWVuc2lvbigxKSwgMik7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHRocmVlZF9wYXRjaC5kaW1lbnNpb24oMiksIDMpOwogICAgIFZFUklGWV9JU19FUVVBTCh0aHJlZWRfcGF0Y2guZGltZW5zaW9uKDMpLCA1KTsKLSAgICBWRVJJRllfSVNfRVFVQUwodGhyZWVkX3BhdGNoLmRpbWVuc2lvbig0KSwgMioyKjMqMyk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHRocmVlZF9wYXRjaC5kaW1lbnNpb24oNCksIDIgKiAyICogMyAqIDMpOwogICB9IGVsc2UgewotICAgIFZFUklGWV9JU19FUVVBTCh0aHJlZWRfcGF0Y2guZGltZW5zaW9uKDApLCAyKjIqMyozKTsKKyAgICBWRVJJRllfSVNfRVFVQUwodGhyZWVkX3BhdGNoLmRpbWVuc2lvbigwKSwgMiAqIDIgKiAzICogMyk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKHRocmVlZF9wYXRjaC5kaW1lbnNpb24oMSksIDEpOwogICAgIFZFUklGWV9JU19FUVVBTCh0aHJlZWRfcGF0Y2guZGltZW5zaW9uKDIpLCAyKTsKICAgICBWRVJJRllfSVNfRVFVQUwodGhyZWVkX3BhdGNoLmRpbWVuc2lvbigzKSwgMyk7CkBAIC0yMTcsOSArMjE2LDkgQEAKICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgMzsgKyt5KSB7CiAgICAgICAgICAgICAgIGZvciAoaW50IHogPSAwOyB6IDwgNTsgKyt6KSB7CiAgICAgICAgICAgICAgICAgaWYgKERhdGFMYXlvdXQgPT0gQ29sTWFqb3IpIHsKLSAgICAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqK3gsayt5LGwreiksIHRocmVlZF9wYXRjaCgwLHgseSx6LHBhdGNoX2xvYykpOworICAgICAgICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqICsgeCwgayArIHksIGwgKyB6KSwgdGhyZWVkX3BhdGNoKDAsIHgsIHksIHosIHBhdGNoX2xvYykpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksait4LGsreSxsK3opLCB0aHJlZWRfcGF0Y2gocGF0Y2hfbG9jLDAseCx5LHopKTsKKyAgICAgICAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiArIHgsIGsgKyB5LCBsICsgeiksIHRocmVlZF9wYXRjaChwYXRjaF9sb2MsIDAsIHgsIHksIHopKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIzNSwxNSArMjM0LDE1IEBACiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2RhdGFfdGhyZWVkX3BhdGNoKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIGRldl9TZWxlY3Rvcj4gdm9pZCBzeWNsX3RlbnNvcl9wYXRjaF90ZXN0X3Blcl9kZXZpY2UoZGV2X1NlbGVjdG9yIHMpewordGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBkZXZfU2VsZWN0b3I+Cit2b2lkIHN5Y2xfdGVuc29yX3BhdGNoX3Rlc3RfcGVyX2RldmljZShkZXZfU2VsZWN0b3IgcykgewogICBRdWV1ZUludGVyZmFjZSBxdWV1ZUludGVyZmFjZShzKTsKICAgYXV0byBzeWNsX2RldmljZSA9IEVpZ2VuOjpTeWNsRGV2aWNlKCZxdWV1ZUludGVyZmFjZSk7CiAgIHRlc3Rfc2ltcGxlX3BhdGNoX3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CiAgIHRlc3Rfc2ltcGxlX3BhdGNoX3N5Y2w8RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CiB9Ci1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3BhdGNoX3N5Y2wpCi17Ci0gIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDpFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgeworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9wYXRjaF9zeWNsKSB7CisgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogRWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKICAgICBDQUxMX1NVQlRFU1Qoc3ljbF90ZW5zb3JfcGF0Y2hfdGVzdF9wZXJfZGV2aWNlPGhhbGY+KGRldmljZSkpOwogICAgIENBTExfU1VCVEVTVChzeWNsX3RlbnNvcl9wYXRjaF90ZXN0X3Blcl9kZXZpY2U8ZmxvYXQ+KGRldmljZSkpOwogICB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yYW5kb20uY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmFuZG9tLmNwcAppbmRleCBiOWQ0YzU1Li41ODVhM2Y4IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yYW5kb20uY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JhbmRvbS5jcHAKQEAgLTExLDM2ICsxMSwzMyBAQAogCiAjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvVGVuc29yPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXI+Ci1zdGF0aWMgdm9pZCB0ZXN0X2RlZmF1bHQoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcj4KK3N0YXRpYyB2b2lkIHRlc3RfZGVmYXVsdCgpIHsKICAgVGVuc29yPFNjYWxhciwgMT4gdmVjKDYpOwogICB2ZWMuc2V0UmFuZG9tKCk7CiAKICAgLy8gRml4bWU6IHdlIHNob3VsZCBjaGVjayB0aGF0IHRoZSBnZW5lcmF0ZWQgbnVtYmVycyBmb2xsb3cgYSB1bmlmb3JtCiAgIC8vIGRpc3RyaWJ1dGlvbiBpbnN0ZWFkLgogICBmb3IgKGludCBpID0gMTsgaSA8IDY7ICsraSkgewotICAgIFZFUklGWV9JU19OT1RfRVFVQUwodmVjKGkpLCB2ZWMoaS0xKSk7CisgICAgVkVSSUZZX0lTX05PVF9FUVVBTCh2ZWMoaSksIHZlYyhpIC0gMSkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcj4KLXN0YXRpYyB2b2lkIHRlc3Rfbm9ybWFsKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXI+CitzdGF0aWMgdm9pZCB0ZXN0X25vcm1hbCgpIHsKICAgVGVuc29yPFNjYWxhciwgMT4gdmVjKDYpOwogICB2ZWMudGVtcGxhdGUgc2V0UmFuZG9tPEVpZ2VuOjppbnRlcm5hbDo6Tm9ybWFsUmFuZG9tR2VuZXJhdG9yPFNjYWxhcj4+KCk7CiAKICAgLy8gRml4bWU6IHdlIHNob3VsZCBjaGVjayB0aGF0IHRoZSBnZW5lcmF0ZWQgbnVtYmVycyBmb2xsb3cgYSBnYXVzc2lhbgogICAvLyBkaXN0cmlidXRpb24gaW5zdGVhZC4KICAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyArK2kpIHsKLSAgICBWRVJJRllfSVNfTk9UX0VRVUFMKHZlYyhpKSwgdmVjKGktMSkpOworICAgIFZFUklGWV9JU19OT1RfRVFVQUwodmVjKGkpLCB2ZWMoaSAtIDEpKTsKICAgfQogfQogCi0KIHN0cnVjdCBNeUdlbmVyYXRvciB7Ci0gIE15R2VuZXJhdG9yKCkgeyB9Ci0gIE15R2VuZXJhdG9yKGNvbnN0IE15R2VuZXJhdG9yJikgeyB9CisgIE15R2VuZXJhdG9yKCkge30KKyAgTXlHZW5lcmF0b3IoY29uc3QgTXlHZW5lcmF0b3ImKSB7fQogCiAgIC8vIFJldHVybiBhIHJhbmRvbSB2YWx1ZSB0byBiZSB1c2VkLiAgImVsZW1lbnRfbG9jYXRpb24iIGlzIHRoZQogICAvLyBsb2NhdGlvbiBvZiB0aGUgZW50cnkgdG8gc2V0IGluIHRoZSB0ZW5zb3IsIGl0IGNhbiB0eXBpY2FsbHkKQEAgLTUwLDggKzQ3LDggQEAKICAgfQogCiAgIC8vIFNhbWUgYXMgYWJvdmUgYnV0IGdlbmVyYXRlcyBzZXZlcmFsIG51bWJlcnMgYXQgYSB0aW1lLgotICBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxpbnQ+Ojp0eXBlIHBhY2tldE9wKAotICAgICAgRWlnZW46OkRlbnNlSW5kZXggcGFja2V0X2xvY2F0aW9uLCBFaWdlbjo6RGVuc2VJbmRleCAvKnVudXNlZCovID0gMCkgY29uc3QgeworICBpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxpbnQ+Ojp0eXBlIHBhY2tldE9wKEVpZ2VuOjpEZW5zZUluZGV4IHBhY2tldF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFaWdlbjo6RGVuc2VJbmRleCAvKnVudXNlZCovID0gMCkgY29uc3QgewogICAgIGNvbnN0IGludCBwYWNrZXRTaXplID0gaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8aW50Pjo6c2l6ZTsKICAgICBFSUdFTl9BTElHTl9NQVggaW50IHZhbHVlc1twYWNrZXRTaXplXTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2tldFNpemU7ICsraSkgewpAQCAtNjEsMTkgKzU4LDE2IEBACiAgIH0KIH07CiAKLQotc3RhdGljIHZvaWQgdGVzdF9jdXN0b20oKQoteworc3RhdGljIHZvaWQgdGVzdF9jdXN0b20oKSB7CiAgIFRlbnNvcjxpbnQsIDE+IHZlYyg2KTsKICAgdmVjLnNldFJhbmRvbTxNeUdlbmVyYXRvcj4oKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDY7ICsraSkgewotICAgIFZFUklGWV9JU19FUVVBTCh2ZWMoaSksIDMqaSk7CisgICAgVkVSSUZZX0lTX0VRVUFMKHZlYyhpKSwgMyAqIGkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfcmFuZG9tKQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9yYW5kb20pIHsKICAgQ0FMTF9TVUJURVNUKCh0ZXN0X2RlZmF1bHQ8ZmxvYXQ+KCkpKTsKICAgQ0FMTF9TVUJURVNUKCh0ZXN0X25vcm1hbDxmbG9hdD4oKSkpOwogICBDQUxMX1NVQlRFU1QoKHRlc3RfZGVmYXVsdDxkb3VibGU+KCkpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JhbmRvbV9ncHUuY3UgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yYW5kb21fZ3B1LmN1CmluZGV4IDA5MDk4NmUuLmZhOGRhN2QgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JhbmRvbV9ncHUuY3UKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmFuZG9tX2dwdS5jdQpAQCAtMTgsOSArMTgsOCBAQAogCiAjaW5jbHVkZSA8RWlnZW4vQ1hYMTEvc3JjL1RlbnNvci9UZW5zb3JHcHVIaXBDdWRhRGVmaW5lcy5oPgogCi12b2lkIHRlc3RfZ3B1X3JhbmRvbV91bmlmb3JtKCkKLXsKLSAgVGVuc29yPGZsb2F0LCAyPiBvdXQoNzIsOTcpOwordm9pZCB0ZXN0X2dwdV9yYW5kb21fdW5pZm9ybSgpIHsKKyAgVGVuc29yPGZsb2F0LCAyPiBvdXQoNzIsIDk3KTsKICAgb3V0LnNldFplcm8oKTsKIAogICBzdGQ6OnNpemVfdCBvdXRfYnl0ZXMgPSBvdXQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKQEAgLTMxLDcgKzMwLDcgQEAKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+ID4gZ3B1X291dChkX291dCwgNzIsOTcpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+ID4gZ3B1X291dChkX291dCwgNzIsIDk3KTsKIAogICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9vdXQucmFuZG9tKCk7CiAKQEAgLTQyLDEwICs0MSw4IEBACiAgIC8vIFRPRE86IGNvbWUgdXAgd2l0aCBhIHZhbGlkIHRlc3Qgb2YgcmFuZG9tbmVzcwogfQogCi0KLXZvaWQgdGVzdF9ncHVfcmFuZG9tX25vcm1hbCgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgMj4gb3V0KDcyLDk3KTsKK3ZvaWQgdGVzdF9ncHVfcmFuZG9tX25vcm1hbCgpIHsKKyAgVGVuc29yPGZsb2F0LCAyPiBvdXQoNzIsIDk3KTsKICAgb3V0LnNldFplcm8oKTsKIAogICBzdGQ6OnNpemVfdCBvdXRfYnl0ZXMgPSBvdXQuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KTsKQEAgLTU2LDcgKzUzLDcgQEAKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKIAotICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+ID4gZ3B1X291dChkX291dCwgNzIsOTcpOworICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8ZmxvYXQsIDI+ID4gZ3B1X291dChkX291dCwgNzIsIDk3KTsKIAogICBFaWdlbjo6aW50ZXJuYWw6Ok5vcm1hbFJhbmRvbUdlbmVyYXRvcjxmbG9hdD4gZ2VuKHRydWUpOwogICBncHVfb3V0LmRldmljZShncHVfZGV2aWNlKSA9IGdwdV9vdXQucmFuZG9tKGdlbik7CkBAIC02NSwyMSArNjIsMTggQEAKICAgYXNzZXJ0KGdwdVN0cmVhbVN5bmNocm9uaXplKGdwdV9kZXZpY2Uuc3RyZWFtKCkpID09IGdwdVN1Y2Nlc3MpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X2NvbXBsZXgoKQoteworc3RhdGljIHZvaWQgdGVzdF9jb21wbGV4KCkgewogICBUZW5zb3I8c3RkOjpjb21wbGV4PGZsb2F0PiwgMT4gdmVjKDYpOwogICB2ZWMuc2V0UmFuZG9tKCk7CiAKICAgLy8gRml4bWU6IHdlIHNob3VsZCBjaGVjayB0aGF0IHRoZSBnZW5lcmF0ZWQgbnVtYmVycyBmb2xsb3cgYSB1bmlmb3JtCiAgIC8vIGRpc3RyaWJ1dGlvbiBpbnN0ZWFkLgogICBmb3IgKGludCBpID0gMTsgaSA8IDY7ICsraSkgewotICAgIFZFUklGWV9JU19OT1RfRVFVQUwodmVjKGkpLCB2ZWMoaS0xKSk7CisgICAgVkVSSUZZX0lTX05PVF9FUVVBTCh2ZWMoaSksIHZlYyhpIC0gMSkpOwogICB9CiB9CiAKLQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9yYW5kb21fZ3B1KQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9yYW5kb21fZ3B1KSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2dwdV9yYW5kb21fdW5pZm9ybSgpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfZ3B1X3JhbmRvbV9ub3JtYWwoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2NvbXBsZXgoKSk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yYW5kb21fc3ljbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yYW5kb21fc3ljbC5jcHAKaW5kZXggZGNkZmRkMy4uMGQyOWE1ZCAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmFuZG9tX3N5Y2wuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JhbmRvbV9zeWNsLmNwcApAQCAtMjAsOSArMjAsOCBAQAogI2luY2x1ZGUgPHVuc3VwcG9ydGVkL0VpZ2VuL0NYWDExL1RlbnNvcj4KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9zeWNsX3JhbmRvbV91bmlmb3JtKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkKLXsKLSAgVGVuc29yPERhdGFUeXBlLCAyLERhdGFMYXlvdXQsIEluZGV4VHlwZT4gb3V0KDcyLDk3KTsKK3N0YXRpYyB2b2lkIHRlc3Rfc3ljbF9yYW5kb21fdW5pZm9ybShjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKKyAgVGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IG91dCg3MiwgOTcpOwogICBvdXQuc2V0WmVybygpOwogCiAgIHN0ZDo6c2l6ZV90IG91dF9ieXRlcyA9IG91dC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwpAQCAtMzIsMTEgKzMxLDExIEBACiAKICAgYXJyYXk8SW5kZXhUeXBlLCAyPiB0ZW5zb3JSYW5nZSA9IHt7c2l6ZURpbTAsIHNpemVEaW0xfX07CiAKLSAgRGF0YVR5cGUqIGRfb3V0ICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0X2J5dGVzKSk7CisgIERhdGFUeXBlKiBkX291dCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0X2J5dGVzKSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9vdXQoZF9vdXQsIHRlbnNvclJhbmdlKTsKIAotICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSk9Z3B1X291dC5yYW5kb20oKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGRfb3V0LG91dF9ieXRlcyk7CisgIGdwdV9vdXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9vdXQucmFuZG9tKCk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBkX291dCwgb3V0X2J5dGVzKTsKIAogICAvLyBGb3Igbm93IHdlIGp1c3QgY2hlY2sgdGhlIGNvZGUgZG9lc24ndCBjcmFzaC4KICAgLy8gVE9ETzogY29tZSB1cCB3aXRoIGEgdmFsaWQgdGVzdCBvZiByYW5kb21uZXNzCkBAIC00NCw5ICs0Myw4IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXZvaWQgdGVzdF9zeWNsX3JhbmRvbV9ub3JtYWwoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQotewotICBUZW5zb3I8RGF0YVR5cGUsIDIsRGF0YUxheW91dCxJbmRleFR5cGU+IG91dCg3Miw5Nyk7Cit2b2lkIHRlc3Rfc3ljbF9yYW5kb21fbm9ybWFsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgeworICBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gb3V0KDcyLCA5Nyk7CiAgIG91dC5zZXRaZXJvKCk7CiAgIHN0ZDo6c2l6ZV90IG91dF9ieXRlcyA9IG91dC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogCkBAIC01NSwyOSArNTMsMjggQEAKIAogICBhcnJheTxJbmRleFR5cGUsIDI+IHRlbnNvclJhbmdlID0ge3tzaXplRGltMCwgc2l6ZURpbTF9fTsKIAotICBEYXRhVHlwZSogZF9vdXQgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXRfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfb3V0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXRfYnl0ZXMpKTsKICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X291dChkX291dCwgdGVuc29yUmFuZ2UpOwogICBFaWdlbjo6aW50ZXJuYWw6Ok5vcm1hbFJhbmRvbUdlbmVyYXRvcjxEYXRhVHlwZT4gZ2VuKHRydWUpOwotICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSk9Z3B1X291dC5yYW5kb20oZ2VuKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGRfb3V0LG91dF9ieXRlcyk7CisgIGdwdV9vdXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9vdXQucmFuZG9tKGdlbik7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBkX291dCwgb3V0X2J5dGVzKTsKIAogICAvLyBGb3Igbm93IHdlIGp1c3QgY2hlY2sgdGhlIGNvZGUgZG9lc24ndCBjcmFzaC4KICAgLy8gVE9ETzogY29tZSB1cCB3aXRoIGEgdmFsaWQgdGVzdCBvZiByYW5kb21uZXNzCiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZF9vdXQpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgZGV2X1NlbGVjdG9yPiB2b2lkIHN5Y2xfcmFuZG9tX3Rlc3RfcGVyX2RldmljZShkZXZfU2VsZWN0b3Igcyl7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIGRldl9TZWxlY3Rvcj4KK3ZvaWQgc3ljbF9yYW5kb21fdGVzdF9wZXJfZGV2aWNlKGRldl9TZWxlY3RvciBzKSB7CiAgIFF1ZXVlSW50ZXJmYWNlIHF1ZXVlSW50ZXJmYWNlKHMpOwogICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKICAgdGVzdF9zeWNsX3JhbmRvbV91bmlmb3JtPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogICB0ZXN0X3N5Y2xfcmFuZG9tX3VuaWZvcm08RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CiAgIHRlc3Rfc3ljbF9yYW5kb21fbm9ybWFsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogICB0ZXN0X3N5Y2xfcmFuZG9tX25vcm1hbDxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKLQogfQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9yYW5kb21fc3ljbCkKLXsKLSAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOkVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3JhbmRvbV9zeWNsKSB7CisgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogRWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKICAgICBDQUxMX1NVQlRFU1Qoc3ljbF9yYW5kb21fdGVzdF9wZXJfZGV2aWNlPGhhbGY+KGRldmljZSkpOwogICAgIENBTExfU1VCVEVTVChzeWNsX3JhbmRvbV90ZXN0X3Blcl9kZXZpY2U8ZmxvYXQ+KGRldmljZSkpOwogI2lmZGVmIEVJR0VOX1NZQ0xfRE9VQkxFX1NVUFBPUlQKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JlZHVjdGlvbi5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZWR1Y3Rpb24uY3BwCmluZGV4IDA3MTA0NmEuLmFiNDk3YzQgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JlZHVjdGlvbi5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmVkdWN0aW9uLmNwcApAQCAtNTMsNyArNTMsNyBAQAogICB9CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXIsaW50IERhdGFMYXlvdXQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCBpbnQgRGF0YUxheW91dD4KIHN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3JlZHVjdGlvbnMoKSB7CiAgIFRlbnNvcjxTY2FsYXIsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwpAQCAtMjI3LDEzICsyMjcsMTMgQEAKICAgICBUZW5zb3I8aW50LCAxPiBpbnRzKDEwKTsKICAgICBzdGQ6OmlvdGEoaW50cy5kYXRhKCksIGludHMuZGF0YSgpICsgaW50cy5kaW1lbnNpb24oMCksIDApOwogCi0gICAgVGVuc29yRml4ZWRTaXplPGJvb2wsIFNpemVzPD4gPiBhbGxfOworICAgIFRlbnNvckZpeGVkU2l6ZTxib29sLCBTaXplczw+PiBhbGxfOwogICAgIGFsbF8gPSBpbnRzLmFsbCgpOwogICAgIFZFUklGWSghYWxsXygpKTsKICAgICBhbGxfID0gKGludHMgPj0gaW50cy5jb25zdGFudCgwKSkuYWxsKCk7CiAgICAgVkVSSUZZKGFsbF8oKSk7CiAKLSAgICBUZW5zb3JGaXhlZFNpemU8Ym9vbCwgU2l6ZXM8PiA+IGFueTsKKyAgICBUZW5zb3JGaXhlZFNpemU8Ym9vbCwgU2l6ZXM8Pj4gYW55OwogICAgIGFueSA9IChpbnRzID4gaW50cy5jb25zdGFudCgxMCkpLmFueSgpOwogICAgIFZFUklGWSghYW55KCkpOwogICAgIGFueSA9IChpbnRzIDwgaW50cy5jb25zdGFudCgxKSkuYW55KCk7CkBAIC0yNDEsNyArMjQxLDYgQEAKICAgfQogfQogCi0KIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KIHN0YXRpYyB2b2lkIHRlc3RfcmVkdWN0aW9uc19pbl9leHByKCkgewogICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKQEAgLTI2Nyw3ICsyNjYsNiBAQAogICB9CiB9CiAKLQogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgogc3RhdGljIHZvaWQgdGVzdF9mdWxsX3JlZHVjdGlvbnMoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMpOwpAQCAtMzMzLDExICszMzEsOSBAQAogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgogc3RhdGljIHZvaWQgdGVzdF90ZW5zb3JfbWFwcygpIHsKICAgaW50IGlucHV0c1syICogMyAqIDUgKiA3XTsKLSAgVGVuc29yTWFwPFRlbnNvcjxpbnQsIDQsIERhdGFMYXlvdXQ+ID4gdGVuc29yX21hcChpbnB1dHMsIDIsIDMsIDUsIDcpOwotICBUZW5zb3JNYXA8VGVuc29yPGNvbnN0IGludCwgNCwgRGF0YUxheW91dD4gPiB0ZW5zb3JfbWFwX2NvbnN0KGlucHV0cywgMiwgMywgNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3KTsKLSAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBpbnQsIDQsIERhdGFMYXlvdXQ+ID4gdGVuc29yX21hcF9jb25zdF9jb25zdCgKLSAgICAgIGlucHV0cywgMiwgMywgNSwgNyk7CisgIFRlbnNvck1hcDxUZW5zb3I8aW50LCA0LCBEYXRhTGF5b3V0Pj4gdGVuc29yX21hcChpbnB1dHMsIDIsIDMsIDUsIDcpOworICBUZW5zb3JNYXA8VGVuc29yPGNvbnN0IGludCwgNCwgRGF0YUxheW91dD4+IHRlbnNvcl9tYXBfY29uc3QoaW5wdXRzLCAyLCAzLCA1LCA3KTsKKyAgY29uc3QgVGVuc29yTWFwPFRlbnNvcjxjb25zdCBpbnQsIDQsIERhdGFMYXlvdXQ+PiB0ZW5zb3JfbWFwX2NvbnN0X2NvbnN0KGlucHV0cywgMiwgMywgNSwgNyk7CiAKICAgdGVuc29yX21hcC5zZXRSYW5kb20oKTsKICAgYXJyYXk8cHRyZGlmZl90LCAyPiByZWR1Y3Rpb25fYXhpczsKQEAgLTM0Niw4ICszNDIsNyBAQAogCiAgIFRlbnNvcjxpbnQsIDIsIERhdGFMYXlvdXQ+IHJlc3VsdCA9IHRlbnNvcl9tYXAuc3VtKHJlZHVjdGlvbl9heGlzKTsKICAgVGVuc29yPGludCwgMiwgRGF0YUxheW91dD4gcmVzdWx0MiA9IHRlbnNvcl9tYXBfY29uc3Quc3VtKHJlZHVjdGlvbl9heGlzKTsKLSAgVGVuc29yPGludCwgMiwgRGF0YUxheW91dD4gcmVzdWx0MyA9Ci0gICAgICB0ZW5zb3JfbWFwX2NvbnN0X2NvbnN0LnN1bShyZWR1Y3Rpb25fYXhpcyk7CisgIFRlbnNvcjxpbnQsIDIsIERhdGFMYXlvdXQ+IHJlc3VsdDMgPSB0ZW5zb3JfbWFwX2NvbnN0X2NvbnN0LnN1bShyZWR1Y3Rpb25fYXhpcyk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgewpAQCAtMzcwLDcgKzM2NSw3IEBACiAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gb3V0KDcyLCA5Nyk7CiAgIGluLnNldFJhbmRvbSgpOwogCi0gIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MT4sIEVpZ2VuOjp0eXBlMmluZGV4PDM+ID4gcmVkdWN0aW9uX2F4aXM7CisgIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MT4sIEVpZ2VuOjp0eXBlMmluZGV4PDM+PiByZWR1Y3Rpb25fYXhpczsKIAogICBvdXQgPSBpbi5tYXhpbXVtKHJlZHVjdGlvbl9heGlzKTsKIApAQCAtMzkzLDkgKzM4OCw5IEBACiAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gb3V0KDk3LCAxMTMpOwogICBpbi5zZXRSYW5kb20oKTsKIAotLy8gUmVkdWNlIG9uIHRoZSBpbm5lcm1vc3QgZGltZW5zaW9ucy4KKyAgLy8gUmVkdWNlIG9uIHRoZSBpbm5lcm1vc3QgZGltZW5zaW9ucy4KICAgLy8gVGhpcyB0cmlnZ2VycyB0aGUgdXNlIG9mIHBhY2tldHMgZm9yIENvbE1ham9yLgotICBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDA+LCBFaWdlbjo6dHlwZTJpbmRleDwxPiA+IHJlZHVjdGlvbl9heGlzOworICBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDA+LCBFaWdlbjo6dHlwZTJpbmRleDwxPj4gcmVkdWN0aW9uX2F4aXM7CiAKICAgb3V0ID0gaW4ubWF4aW11bShyZWR1Y3Rpb25fYXhpcyk7CiAKQEAgLTQxOCw3ICs0MTMsNyBAQAogICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG91dCg3MiwgNTMpOwogICBpbi5zZXRSYW5kb20oKTsKIAotLy8gUmVkdWNlIG9uIHRoZSBpbm5lcm1vc3QgZGltZW5zaW9ucy4KKyAgLy8gUmVkdWNlIG9uIHRoZSBpbm5lcm1vc3QgZGltZW5zaW9ucy4KICAgLy8gVGhpcyB0cmlnZ2VycyB0aGUgdXNlIG9mIHBhY2tldHMgZm9yIFJvd01ham9yLgogICBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDI+LCBFaWdlbjo6dHlwZTJpbmRleDwzPj4gcmVkdWN0aW9uX2F4aXM7CiAKQEAgLTQ0Myw3ICs0MzgsNyBAQAogICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IG91dCg3MiwgNTMpOwogICBpbi5zZXRSYW5kb20oKTsKIAotLy8gUmVkdWNlIG9uIHRoZSBpbm5lcm1vc3QgZGltZW5zaW9ucy4KKyAgLy8gUmVkdWNlIG9uIHRoZSBpbm5lcm1vc3QgZGltZW5zaW9ucy4KICAgLy8gVGhpcyB0cmlnZ2VycyB0aGUgdXNlIG9mIHBhY2tldHMgZm9yIFJvd01ham9yLgogICBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDE+LCBFaWdlbjo6dHlwZTJpbmRleDwyPj4gcmVkdWN0aW9uX2F4aXM7CiAKQEAgLTQ2Niw3ICs0NjEsOCBAQAogdm9pZCB0ZXN0X3N1bV9hY2N1cmFjeSgpIHsKICAgVGVuc29yPGRvdWJsZSwgMT4gZG91YmxlX3RlbnNvcihudW1fZWxlbWVudHMpOwogICBUZW5zb3I8U2NhbGFyVHlwZSwgMT4gdGVuc29yKG51bV9lbGVtZW50cyk7Ci0gIGZvciAoZG91YmxlIHByZXNjcmliZWRfbWVhbiA9IDA7IHByZXNjcmliZWRfbWVhbiA8PSBtYXhfbWVhbjsgcHJlc2NyaWJlZF9tZWFuID0gbnVtZXh0OjptYXhpKDEuMCwgcHJlc2NyaWJlZF9tZWFuKjMuOTkpKSB7CisgIGZvciAoZG91YmxlIHByZXNjcmliZWRfbWVhbiA9IDA7IHByZXNjcmliZWRfbWVhbiA8PSBtYXhfbWVhbjsKKyAgICAgICBwcmVzY3JpYmVkX21lYW4gPSBudW1leHQ6Om1heGkoMS4wLCBwcmVzY3JpYmVkX21lYW4gKiAzLjk5KSkgewogICAgIC8vIEZJWE1FOiBOb3JtYWxSYW5kb21HZW5lcmF0b3IgZG9lc24ndCB3b3JrIGluIGJmbG9hdCBhbmQgaGFsZi4KICAgICBkb3VibGVfdGVuc29yLnNldFJhbmRvbTxFaWdlbjo6aW50ZXJuYWw6Ok5vcm1hbFJhbmRvbUdlbmVyYXRvcjxkb3VibGU+PigpOwogICAgIGRvdWJsZV90ZW5zb3IgKz0gZG91YmxlX3RlbnNvci5jb25zdGFudChwcmVzY3JpYmVkX21lYW4pOwpAQCAtNDg1LDcgKzQ4MSw4IEBACiAgICAgLy8gVGVzdCBhZ2FpbnN0IHByb2JhYmlsaXN0aWMgZm9yd2FyZCBlcnJvciBib3VuZC4gSW4gcmVhbGl0eSwgdGhlIGVycm9yIGlzIG11Y2ggc21hbGxlcgogICAgIC8vIHdoZW4gd2UgdXNlIHRyZWUgc3VtbWF0aW9uLgogICAgIGRvdWJsZSBlcnIgPSBFaWdlbjo6bnVtZXh0OjphYnMoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdW0oKSkgLSBleHBlY3RlZF9zdW0pOwotICAgIGRvdWJsZSB0b2wgPSBudW1leHQ6OnNxcnQoc3RhdGljX2Nhc3Q8ZG91YmxlPihudW1fZWxlbWVudHMpKSAqIHN0YXRpY19jYXN0PGRvdWJsZT4oTnVtVHJhaXRzPFNjYWxhclR5cGU+OjplcHNpbG9uKCkpICogYWJzX3N1bTsKKyAgICBkb3VibGUgdG9sID0gbnVtZXh0OjpzcXJ0KHN0YXRpY19jYXN0PGRvdWJsZT4obnVtX2VsZW1lbnRzKSkgKgorICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KE51bVRyYWl0czxTY2FsYXJUeXBlPjo6ZXBzaWxvbigpKSAqIGFic19zdW07CiAgICAgVkVSSUZZX0xFKGVyciwgdG9sKTsKICAgfQogfQpAQCAtNDkzLDEwICs0OTAsMTAgQEAKIEVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfcmVkdWN0aW9uKSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3RyaXZpYWxfcmVkdWN0aW9uczxDb2xNYWpvcj4oKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3RyaXZpYWxfcmVkdWN0aW9uczxSb3dNYWpvcj4oKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3Rfc2ltcGxlX3JlZHVjdGlvbnM8ZmxvYXQsQ29sTWFqb3I+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3Rfc2ltcGxlX3JlZHVjdGlvbnM8ZmxvYXQsUm93TWFqb3I+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3Rfc2ltcGxlX3JlZHVjdGlvbnM8RWlnZW46OmhhbGYsQ29sTWFqb3I+KCkgKSk7Ci0gIENBTExfU1VCVEVTVCgoIHRlc3Rfc2ltcGxlX3JlZHVjdGlvbnM8RWlnZW46OmJmbG9hdDE2LENvbE1ham9yPigpICkpOworICBDQUxMX1NVQlRFU1QoKHRlc3Rfc2ltcGxlX3JlZHVjdGlvbnM8ZmxvYXQsIENvbE1ham9yPigpKSk7CisgIENBTExfU1VCVEVTVCgodGVzdF9zaW1wbGVfcmVkdWN0aW9uczxmbG9hdCwgUm93TWFqb3I+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X3NpbXBsZV9yZWR1Y3Rpb25zPEVpZ2VuOjpoYWxmLCBDb2xNYWpvcj4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3Rfc2ltcGxlX3JlZHVjdGlvbnM8RWlnZW46OmJmbG9hdDE2LCBDb2xNYWpvcj4oKSkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9yZWR1Y3Rpb25zX2luX2V4cHI8Q29sTWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9yZWR1Y3Rpb25zX2luX2V4cHI8Um93TWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9mdWxsX3JlZHVjdGlvbnM8Q29sTWFqb3I+KCkpOwpAQCAtNTEzLDExICs1MTAsMTEgQEAKICAgQ0FMTF9TVUJURVNUKHRlc3RfaW5uZXJtb3N0X2ZpcnN0X2RpbXM8Um93TWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9yZWR1Y2VfbWlkZGxlX2RpbXM8Q29sTWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9yZWR1Y2VfbWlkZGxlX2RpbXM8Um93TWFqb3I+KCkpOwotICBDQUxMX1NVQlRFU1QoKHRlc3Rfc3VtX2FjY3VyYWN5PGZsb2F0LDEwKjEwMjQqMTAyNCw4KjEwMjQ+KCkpKTsKLSAgQ0FMTF9TVUJURVNUKCh0ZXN0X3N1bV9hY2N1cmFjeTxFaWdlbjo6YmZsb2F0MTYsMTAqMTAyNCoxMDI0LDgqMTAyND4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3Rfc3VtX2FjY3VyYWN5PGZsb2F0LCAxMCAqIDEwMjQgKiAxMDI0LCA4ICogMTAyND4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3Rfc3VtX2FjY3VyYWN5PEVpZ2VuOjpiZmxvYXQxNiwgMTAgKiAxMDI0ICogMTAyNCwgOCAqIDEwMjQ+KCkpKTsKICAgLy8gVGhlIHJhbmdlIG9mIGhhbGYgaXMgbGltaXRlZCB0byA2NTUxOSB3aGVuIHVzaW5nIHJvdW5kLXRvLWV2ZW4sCiAgIC8vIHNvIHdlIGFyZSBzZXZlcmVseSBsaW1pdGVkIGluIHRoZSBzaXplIGFuZCBtZWFuIG9mIHRoZSB0ZW5zb3JzCiAgIC8vIHdlIGNhbiByZWR1Y2Ugd2l0aG91dCBvdmVyZmxvdy4KLSAgQ0FMTF9TVUJURVNUKCh0ZXN0X3N1bV9hY2N1cmFjeTxFaWdlbjo6aGFsZiw0KjEwMjQsMTY+KCkpKTsKLSAgQ0FMTF9TVUJURVNUKCh0ZXN0X3N1bV9hY2N1cmFjeTxFaWdlbjo6aGFsZiwxMCoxMDI0KjEwMjQsMD4oKSkpOworICBDQUxMX1NVQlRFU1QoKHRlc3Rfc3VtX2FjY3VyYWN5PEVpZ2VuOjpoYWxmLCA0ICogMTAyNCwgMTY+KCkpKTsKKyAgQ0FMTF9TVUJURVNUKCh0ZXN0X3N1bV9hY2N1cmFjeTxFaWdlbjo6aGFsZiwgMTAgKiAxMDI0ICogMTAyNCwgMD4oKSkpOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmVkdWN0aW9uX2dwdS5jdSBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JlZHVjdGlvbl9ncHUuY3UKaW5kZXggMTIyYWM5NC4uMjRjYzViZSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmVkdWN0aW9uX2dwdS5jdQorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZWR1Y3Rpb25fZ3B1LmN1CkBAIC0xNSwxNSArMTUsMTMgQEAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQ1hYMTEvVGVuc29yPgogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFR5cGUsIGludCBEYXRhTGF5b3V0PgordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGUsIGludCBEYXRhTGF5b3V0Pgogc3RhdGljIHZvaWQgdGVzdF9mdWxsX3JlZHVjdGlvbnMoKSB7Ci0KICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZ3B1X2RldmljZSgmc3RyZWFtKTsKIAotICBjb25zdCBpbnQgbnVtX3Jvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAyNCwgNSoxMDI0KTsKLSAgY29uc3QgaW50IG51bV9jb2xzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwMjQsIDUqMTAyNCk7CisgIGNvbnN0IGludCBudW1fcm93cyA9IGludGVybmFsOjpyYW5kb208aW50PigxMDI0LCA1ICogMTAyNCk7CisgIGNvbnN0IGludCBudW1fY29scyA9IGludGVybmFsOjpyYW5kb208aW50PigxMDI0LCA1ICogMTAyNCk7CiAKICAgVGVuc29yPFR5cGUsIDIsIERhdGFMYXlvdXQ+IGluKG51bV9yb3dzLCBudW1fY29scyk7CiAgIGluLnNldFJhbmRvbSgpOwpAQCAtNTMsNyArNTEsNyBAQAogICBncHVfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X291dF9wdHIpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlLCBpbnQgRGF0YUxheW91dD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlLCBpbnQgRGF0YUxheW91dD4KIHN0YXRpYyB2b2lkIHRlc3RfZmlyc3RfZGltX3JlZHVjdGlvbnMoKSB7CiAgIGludCBkaW1feCA9IDMzOwogICBpbnQgZGltX3kgPSAxOwpAQCAtNjksMzEgKzY3LDMxIEBACiAgIC8vIENyZWF0ZSBkZXZpY2UKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZGV2KCZzdHJlYW0pOwotICAKKwogICAvLyBDcmVhdGUgZGF0YShUKQotICBUeXBlKiBpbl9kYXRhID0gKFR5cGUqKWRldi5hbGxvY2F0ZShkaW1feCpkaW1feSpkaW1feipzaXplb2YoVHlwZSkpOwotICBUeXBlKiBvdXRfZGF0YSA9IChUeXBlKilkZXYuYWxsb2NhdGUoZGltX3oqZGltX3kqc2l6ZW9mKFR5cGUpKTsKKyAgVHlwZSogaW5fZGF0YSA9IChUeXBlKilkZXYuYWxsb2NhdGUoZGltX3ggKiBkaW1feSAqIGRpbV96ICogc2l6ZW9mKFR5cGUpKTsKKyAgVHlwZSogb3V0X2RhdGEgPSAoVHlwZSopZGV2LmFsbG9jYXRlKGRpbV96ICogZGltX3kgKiBzaXplb2YoVHlwZSkpOwogICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8VHlwZSwgMywgRGF0YUxheW91dD4gPiBncHVfaW4oaW5fZGF0YSwgZGltX3gsIGRpbV95LCBkaW1feik7CiAgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxUeXBlLCAyLCBEYXRhTGF5b3V0PiA+IGdwdV9vdXQob3V0X2RhdGEsIGRpbV95LCBkaW1feik7Ci0gIAorCiAgIC8vIFBlcmZvcm0gb3BlcmF0aW9uCi0gIGRldi5tZW1jcHlIb3N0VG9EZXZpY2UoaW5fZGF0YSwgaW4uZGF0YSgpLCBpbi5zaXplKCkqc2l6ZW9mKFR5cGUpKTsKKyAgZGV2Lm1lbWNweUhvc3RUb0RldmljZShpbl9kYXRhLCBpbi5kYXRhKCksIGluLnNpemUoKSAqIHNpemVvZihUeXBlKSk7CiAgIGdwdV9vdXQuZGV2aWNlKGRldikgPSBncHVfaW4uc3VtKHJlZF9heGlzKTsKICAgZ3B1X291dC5kZXZpY2UoZGV2KSArPSBncHVfaW4uc3VtKHJlZF9heGlzKTsKICAgVGVuc29yPFR5cGUsIDIsIERhdGFMYXlvdXQ+IHJlZHV4X2dwdShkaW1feSwgZGltX3opOwotICBkZXYubWVtY3B5RGV2aWNlVG9Ib3N0KHJlZHV4X2dwdS5kYXRhKCksIG91dF9kYXRhLCBncHVfb3V0LnNpemUoKSpzaXplb2YoVHlwZSkpOworICBkZXYubWVtY3B5RGV2aWNlVG9Ib3N0KHJlZHV4X2dwdS5kYXRhKCksIG91dF9kYXRhLCBncHVfb3V0LnNpemUoKSAqIHNpemVvZihUeXBlKSk7CiAgIGRldi5zeW5jaHJvbml6ZSgpOwogCiAgIC8vIENoZWNrIHRoYXQgdGhlIENQVSBhbmQgR1BVIHJlZHVjdGlvbnMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncHVfb3V0LnNpemUoKTsgKytpKSB7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgyKnJlZHV4KGkpLCByZWR1eF9ncHUoaSkpOworICAgIFZFUklGWV9JU19BUFBST1goMiAqIHJlZHV4KGkpLCByZWR1eF9ncHUoaSkpOwogICB9CiAKICAgZGV2LmRlYWxsb2NhdGUoaW5fZGF0YSk7CiAgIGRldi5kZWFsbG9jYXRlKG91dF9kYXRhKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVHlwZSwgaW50IERhdGFMYXlvdXQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZSwgaW50IERhdGFMYXlvdXQ+CiBzdGF0aWMgdm9pZCB0ZXN0X2xhc3RfZGltX3JlZHVjdGlvbnMoKSB7CiAgIGludCBkaW1feCA9IDEyODsKICAgaW50IGRpbV95ID0gMTsKQEAgLTEwOSw0NiArMTA3LDQ1IEBACiAgIC8vIENyZWF0ZSBkZXZpY2UKICAgRWlnZW46OkdwdVN0cmVhbURldmljZSBzdHJlYW07CiAgIEVpZ2VuOjpHcHVEZXZpY2UgZGV2KCZzdHJlYW0pOwotICAKKwogICAvLyBDcmVhdGUgZGF0YQotICBUeXBlKiBpbl9kYXRhID0gKFR5cGUqKWRldi5hbGxvY2F0ZShkaW1feCpkaW1feSpkaW1feipzaXplb2YoVHlwZSkpOwotICBUeXBlKiBvdXRfZGF0YSA9IChUeXBlKilkZXYuYWxsb2NhdGUoZGltX3gqZGltX3kqc2l6ZW9mKFR5cGUpKTsKKyAgVHlwZSogaW5fZGF0YSA9IChUeXBlKilkZXYuYWxsb2NhdGUoZGltX3ggKiBkaW1feSAqIGRpbV96ICogc2l6ZW9mKFR5cGUpKTsKKyAgVHlwZSogb3V0X2RhdGEgPSAoVHlwZSopZGV2LmFsbG9jYXRlKGRpbV94ICogZGltX3kgKiBzaXplb2YoVHlwZSkpOwogICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8VHlwZSwgMywgRGF0YUxheW91dD4gPiBncHVfaW4oaW5fZGF0YSwgZGltX3gsIGRpbV95LCBkaW1feik7CiAgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxUeXBlLCAyLCBEYXRhTGF5b3V0PiA+IGdwdV9vdXQob3V0X2RhdGEsIGRpbV94LCBkaW1feSk7Ci0gIAorCiAgIC8vIFBlcmZvcm0gb3BlcmF0aW9uCi0gIGRldi5tZW1jcHlIb3N0VG9EZXZpY2UoaW5fZGF0YSwgaW4uZGF0YSgpLCBpbi5zaXplKCkqc2l6ZW9mKFR5cGUpKTsKKyAgZGV2Lm1lbWNweUhvc3RUb0RldmljZShpbl9kYXRhLCBpbi5kYXRhKCksIGluLnNpemUoKSAqIHNpemVvZihUeXBlKSk7CiAgIGdwdV9vdXQuZGV2aWNlKGRldikgPSBncHVfaW4uc3VtKHJlZF9heGlzKTsKICAgZ3B1X291dC5kZXZpY2UoZGV2KSArPSBncHVfaW4uc3VtKHJlZF9heGlzKTsKICAgVGVuc29yPFR5cGUsIDIsIERhdGFMYXlvdXQ+IHJlZHV4X2dwdShkaW1feCwgZGltX3kpOwotICBkZXYubWVtY3B5RGV2aWNlVG9Ib3N0KHJlZHV4X2dwdS5kYXRhKCksIG91dF9kYXRhLCBncHVfb3V0LnNpemUoKSpzaXplb2YoVHlwZSkpOworICBkZXYubWVtY3B5RGV2aWNlVG9Ib3N0KHJlZHV4X2dwdS5kYXRhKCksIG91dF9kYXRhLCBncHVfb3V0LnNpemUoKSAqIHNpemVvZihUeXBlKSk7CiAgIGRldi5zeW5jaHJvbml6ZSgpOwogCiAgIC8vIENoZWNrIHRoYXQgdGhlIENQVSBhbmQgR1BVIHJlZHVjdGlvbnMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncHVfb3V0LnNpemUoKTsgKytpKSB7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgyKnJlZHV4KGkpLCByZWR1eF9ncHUoaSkpOworICAgIFZFUklGWV9JU19BUFBST1goMiAqIHJlZHV4KGkpLCByZWR1eF9ncHUoaSkpOwogICB9CiAKICAgZGV2LmRlYWxsb2NhdGUoaW5fZGF0YSk7CiAgIGRldi5kZWFsbG9jYXRlKG91dF9kYXRhKTsKIH0KIAotCiBFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3JlZHVjdGlvbl9ncHUpIHsKICAgQ0FMTF9TVUJURVNUXzEoKHRlc3RfZnVsbF9yZWR1Y3Rpb25zPGZsb2F0LCBDb2xNYWpvcj4oKSkpOwogICBDQUxMX1NVQlRFU1RfMSgodGVzdF9mdWxsX3JlZHVjdGlvbnM8ZG91YmxlLCBDb2xNYWpvcj4oKSkpOwogICBDQUxMX1NVQlRFU1RfMigodGVzdF9mdWxsX3JlZHVjdGlvbnM8ZmxvYXQsIFJvd01ham9yPigpKSk7CiAgIENBTExfU1VCVEVTVF8yKCh0ZXN0X2Z1bGxfcmVkdWN0aW9uczxkb3VibGUsIFJvd01ham9yPigpKSk7Ci0gIAorCiAgIENBTExfU1VCVEVTVF8zKCh0ZXN0X2ZpcnN0X2RpbV9yZWR1Y3Rpb25zPGZsb2F0LCBDb2xNYWpvcj4oKSkpOwogICBDQUxMX1NVQlRFU1RfMygodGVzdF9maXJzdF9kaW1fcmVkdWN0aW9uczxkb3VibGUsIENvbE1ham9yPigpKSk7CiAgIENBTExfU1VCVEVTVF80KCh0ZXN0X2ZpcnN0X2RpbV9yZWR1Y3Rpb25zPGZsb2F0LCBSb3dNYWpvcj4oKSkpOwotLy8gT3V0ZXIgcmVkdWN0aW9ucyBvZiBkb3VibGVzIGFyZW4ndCBzdXBwb3J0ZWQganVzdCB5ZXQuICAJCQkJCSAgICAgIAotLy8gIENBTExfU1VCVEVTVF80KCh0ZXN0X2ZpcnN0X2RpbV9yZWR1Y3Rpb25zPGRvdWJsZSwgUm93TWFqb3I+KCkpKQorICAvLyBPdXRlciByZWR1Y3Rpb25zIG9mIGRvdWJsZXMgYXJlbid0IHN1cHBvcnRlZCBqdXN0IHlldC4KKyAgLy8gIENBTExfU1VCVEVTVF80KCh0ZXN0X2ZpcnN0X2RpbV9yZWR1Y3Rpb25zPGRvdWJsZSwgUm93TWFqb3I+KCkpKQogCiAgIENBTExfU1VCVEVTVF81KCh0ZXN0X2xhc3RfZGltX3JlZHVjdGlvbnM8ZmxvYXQsIENvbE1ham9yPigpKSk7Ci0vLyBPdXRlciByZWR1Y3Rpb25zIG9mIGRvdWJsZXMgYXJlbid0IHN1cHBvcnRlZCBqdXN0IHlldC4gIAkJCQkJICAgICAgCi0vLyAgQ0FMTF9TVUJURVNUXzUoKHRlc3RfbGFzdF9kaW1fcmVkdWN0aW9uczxkb3VibGUsIENvbE1ham9yPigpKSk7CisgIC8vIE91dGVyIHJlZHVjdGlvbnMgb2YgZG91YmxlcyBhcmVuJ3Qgc3VwcG9ydGVkIGp1c3QgeWV0LgorICAvLyAgQ0FMTF9TVUJURVNUXzUoKHRlc3RfbGFzdF9kaW1fcmVkdWN0aW9uczxkb3VibGUsIENvbE1ham9yPigpKSk7CiAgIENBTExfU1VCVEVTVF82KCh0ZXN0X2xhc3RfZGltX3JlZHVjdGlvbnM8ZmxvYXQsIFJvd01ham9yPigpKSk7CiAgIENBTExfU1VCVEVTVF82KCh0ZXN0X2xhc3RfZGltX3JlZHVjdGlvbnM8ZG91YmxlLCBSb3dNYWpvcj4oKSkpOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmVkdWN0aW9uX3N5Y2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmVkdWN0aW9uX3N5Y2wuY3BwCmluZGV4IDNhZmE2MmEuLjkyNzY5NTMgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JlZHVjdGlvbl9zeWNsLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZWR1Y3Rpb25fc3ljbC5jcHAKQEAgLTIyLDggKzIyLDcgQEAKICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9DWFgxMS9UZW5zb3I+CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX3N1bV9zeWNsKAotICAgIGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgeworc3RhdGljIHZvaWQgdGVzdF9mdWxsX3JlZHVjdGlvbnNfc3VtX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIGNvbnN0IEluZGV4VHlwZSBudW1fcm93cyA9IDc1MzsKICAgY29uc3QgSW5kZXhUeXBlIG51bV9jb2xzID0gNTM3OwogICBhcnJheTxJbmRleFR5cGUsIDI+IHRlbnNvclJhbmdlID0ge3tudW1fcm93cywgbnVtX2NvbHN9fTsKQEAgLTM4LDMyICszNywyNSBAQAogICBhdXRvIGRpbSA9IERTaXplczxJbmRleFR5cGUsIDI+KDEsIDEpOwogICBmdWxsX3JlZHV4ID0gaW4uc3VtKCkucmVzaGFwZShkaW0pOwogCi0gIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oCi0gICAgICBzeWNsX2RldmljZS5hbGxvY2F0ZShpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPSAoRGF0YVR5cGUqKXN5Y2xfZGV2aWNlLmFsbG9jYXRlKAotICAgICAgc2l6ZW9mKERhdGFUeXBlKSAqIChmdWxsX3JlZHV4X2dwdS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpKTsKKyAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPQorICAgICAgKERhdGFUeXBlKilzeWNsX2RldmljZS5hbGxvY2F0ZShzaXplb2YoRGF0YVR5cGUpICogKGZ1bGxfcmVkdXhfZ3B1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkpOwogCi0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGluX2dwdShncHVfaW5fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbnNvclJhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gb3V0X2dwdShncHVfb3V0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmFuZ2UpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoCi0gICAgICBncHVfaW5fZGF0YSwgaW4uZGF0YSgpLCAoaW4uZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBpbl9ncHUoZ3B1X2luX2RhdGEsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gb3V0X2dwdShncHVfb3V0X2RhdGEsIG91dFJhbmdlKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksIChpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIG91dF9ncHUuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGluX2dwdS5zdW0oKS5yZXNoYXBlKGRpbSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCgKLSAgICAgIGZ1bGxfcmVkdXhfZ3B1LmRhdGEoKSwgZ3B1X291dF9kYXRhLAotICAgICAgKGZ1bGxfcmVkdXhfZ3B1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcmVkdXhfZ3B1LmRhdGEoKSwgZ3B1X291dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bGxfcmVkdXhfZ3B1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgLy8gQ2hlY2sgdGhhdCB0aGUgQ1BVIGFuZCBHUFUgcmVkdWN0aW9ucyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0LgotICBzdGQ6OmNvdXQgPDwgIlNZQ0wgRlVMTCA6IiA8PCBmdWxsX3JlZHV4X2dwdSgwLCAwKQotICAgICAgICAgICAgPDwgIiwgQ1BVIEZVTEw6ICIgPDwgZnVsbF9yZWR1eCgwLCAwKSA8PCAiXG4iOworICBzdGQ6OmNvdXQgPDwgIlNZQ0wgRlVMTCA6IiA8PCBmdWxsX3JlZHV4X2dwdSgwLCAwKSA8PCAiLCBDUFUgRlVMTDogIiA8PCBmdWxsX3JlZHV4KDAsIDApIDw8ICJcbiI7CiAgIFZFUklGWV9JU19BUFBST1goZnVsbF9yZWR1eF9ncHUoMCwgMCksIGZ1bGxfcmVkdXgoMCwgMCkpOwogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9pbl9kYXRhKTsKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfb3V0X2RhdGEpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19zdW1fd2l0aF9vZmZzZXRfc3ljbCgKLSAgICBjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKK3N0YXRpYyB2b2lkIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX3N1bV93aXRoX29mZnNldF9zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICB1c2luZyBkYXRhX3RlbnNvciA9IFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPjsKICAgdXNpbmcgc2NhbGFyX3RlbnNvciA9IFRlbnNvcjxEYXRhVHlwZSwgMCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPjsKICAgY29uc3QgSW5kZXhUeXBlIG51bV9yb3dzID0gNjQ7CkBAIC04MywxOCArNzUsMTQgQEAKICAgVGVuc29yTWFwPGRhdGFfdGVuc29yPiBpbl9vZmZzZXQoaW4uZGF0YSgpICsgb2Zmc2V0LCB0ZW5zb3Jfb2Zmc2V0X3JhbmdlKTsKICAgZnVsbF9yZWR1eCA9IGluX29mZnNldC5zdW0oKTsKIAotICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPQotICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShuX2VsZW1zICogc2l6ZW9mKERhdGFUeXBlKSkpOwotICBEYXRhVHlwZSogZ3B1X291dF9kYXRhID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHNpemVvZihEYXRhVHlwZSkpKTsKIAogICBUZW5zb3JNYXA8ZGF0YV90ZW5zb3I+IGluX2dwdShncHVfaW5fZGF0YSArIG9mZnNldCwgdGVuc29yX29mZnNldF9yYW5nZSk7CiAgIFRlbnNvck1hcDxzY2FsYXJfdGVuc29yPiBvdXRfZ3B1KGdwdV9vdXRfZGF0YSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW5fZGF0YSwgaW4uZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9lbGVtcyAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwgbl9lbGVtcyAqIHNpemVvZihEYXRhVHlwZSkpOwogICBvdXRfZ3B1LmRldmljZShzeWNsX2RldmljZSkgPSBpbl9ncHUuc3VtKCk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3JlZHV4X2dwdS5kYXRhKCksIGdwdV9vdXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9yZWR1eF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIC8vIENoZWNrIHRoYXQgdGhlIENQVSBhbmQgR1BVIHJlZHVjdGlvbnMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4KICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3JlZHV4X2dwdSgpLCBmdWxsX3JlZHV4KCkpOwpAQCAtMTA0LDggKzkyLDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9mdWxsX3JlZHVjdGlvbnNfbWF4X3N5Y2woCi0gICAgY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CitzdGF0aWMgdm9pZCB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19tYXhfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgY29uc3QgSW5kZXhUeXBlIG51bV9yb3dzID0gNDA5NjsKICAgY29uc3QgSW5kZXhUeXBlIG51bV9jb2xzID0gNDA5NjsKICAgYXJyYXk8SW5kZXhUeXBlLCAyPiB0ZW5zb3JSYW5nZSA9IHt7bnVtX3Jvd3MsIG51bV9jb2xzfX07CkBAIC0xMTgsMjYgKzEwNSwyMSBAQAogCiAgIGZ1bGxfcmVkdXggPSBpbi5tYXhpbXVtKCk7CiAKLSAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPigKLSAgICAgIHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPSAoRGF0YVR5cGUqKXN5Y2xfZGV2aWNlLmFsbG9jYXRlKHNpemVvZihEYXRhVHlwZSkpOwogCi0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGluX2dwdShncHVfaW5fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gaW5fZ3B1KGdwdV9pbl9kYXRhLCB0ZW5zb3JSYW5nZSk7CiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDAsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IG91dF9ncHUoZ3B1X291dF9kYXRhKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKAotICAgICAgZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwgKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksIChpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIG91dF9ncHUuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGluX2dwdS5tYXhpbXVtKCk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3JlZHV4X2dwdS5kYXRhKCksIGdwdV9vdXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9yZWR1eF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsIHNpemVvZihEYXRhVHlwZSkpOwogICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcmVkdXhfZ3B1KCksIGZ1bGxfcmVkdXgoKSk7CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2luX2RhdGEpOwogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9vdXRfZGF0YSk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX21heF93aXRoX29mZnNldF9zeWNsKAotICAgIGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgeworc3RhdGljIHZvaWQgdGVzdF9mdWxsX3JlZHVjdGlvbnNfbWF4X3dpdGhfb2Zmc2V0X3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIHVzaW5nIGRhdGFfdGVuc29yID0gVGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OwogICB1c2luZyBzY2FsYXJfdGVuc29yID0gVGVuc29yPERhdGFUeXBlLCAwLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OwogICBjb25zdCBJbmRleFR5cGUgbnVtX3Jvd3MgPSA2NDsKQEAgLTE2MSwxOCArMTQzLDE0IEBACiAgIGZ1bGxfcmVkdXggPSBpbl9vZmZzZXQubWF4aW11bSgpOwogICBWRVJJRllfSVNfTk9UX0VRVUFMKGZ1bGxfcmVkdXgoKSwgaW4oMCkpOwogCi0gIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPQotICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobl9lbGVtcyAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoc2l6ZW9mKERhdGFUeXBlKSkpOwogCiAgIFRlbnNvck1hcDxkYXRhX3RlbnNvcj4gaW5fZ3B1KGdwdV9pbl9kYXRhICsgb2Zmc2V0LCB0ZW5zb3Jfb2Zmc2V0X3JhbmdlKTsKICAgVGVuc29yTWFwPHNjYWxhcl90ZW5zb3I+IG91dF9ncHUoZ3B1X291dF9kYXRhKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2VsZW1zICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW5fZGF0YSwgaW4uZGF0YSgpLCBuX2VsZW1zICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIG91dF9ncHUuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGluX2dwdS5tYXhpbXVtKCk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3JlZHV4X2dwdS5kYXRhKCksIGdwdV9vdXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9yZWR1eF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIC8vIENoZWNrIHRoYXQgdGhlIENQVSBhbmQgR1BVIHJlZHVjdGlvbnMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4KICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3JlZHV4X2dwdSgpLCBmdWxsX3JlZHV4KCkpOwpAQCAtMTgyLDggKzE2MCw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX21lYW5fc3ljbCgKLSAgICBjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKK3N0YXRpYyB2b2lkIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX21lYW5fc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgY29uc3QgSW5kZXhUeXBlIG51bV9yb3dzID0gNDA5NjsKICAgY29uc3QgSW5kZXhUeXBlIG51bV9jb2xzID0gNDA5NjsKICAgYXJyYXk8SW5kZXhUeXBlLCAyPiB0ZW5zb3JSYW5nZSA9IHt7bnVtX3Jvd3MsIG51bV9jb2xzfX07CkBAIC0yMDQsNjEgKzE4MSw0NCBAQAogICBpbl9hcmcxLnNldFJhbmRvbSgpOwogICBpbl9hcmcyLnNldFJhbmRvbSgpOwogCi0gIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oCi0gICAgICBzeWNsX2RldmljZS5hbGxvY2F0ZShpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfaW5fYXJnMV9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSgKLSAgICAgIGluX2FyZzEuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwotICBEYXRhVHlwZSogZ3B1X2luX2FyZzJfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoCi0gICAgICBpbl9hcmcyLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgYm9vbCogZ3B1X291dF9hcmdfX2dwdV9oZWxwZXJfZGF0YSA9IHN0YXRpY19jYXN0PGJvb2wqPihzeWNsX2RldmljZS5hbGxvY2F0ZSgKLSAgICAgIG91dF9hcmdfZ3B1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgYm9vbCogZ3B1X291dF9hcmdfZGF0YSA9IHN0YXRpY19jYXN0PGJvb2wqPihzeWNsX2RldmljZS5hbGxvY2F0ZSgKLSAgICAgIG91dF9hcmdfZ3B1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW5fYXJnMV9kYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5fYXJnMS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW5fYXJnMl9kYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW5fYXJnMi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIGJvb2wqIGdwdV9vdXRfYXJnX19ncHVfaGVscGVyX2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8Ym9vbCo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG91dF9hcmdfZ3B1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgYm9vbCogZ3B1X291dF9hcmdfZGF0YSA9CisgICAgICBzdGF0aWNfY2FzdDxib29sKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0X2FyZ19ncHUuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogCiAgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPSAoRGF0YVR5cGUqKXN5Y2xfZGV2aWNlLmFsbG9jYXRlKHNpemVvZihEYXRhVHlwZSkpOwogCi0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGluX2dwdShncHVfaW5fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbnNvclJhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gaW5fQXJnMV9ncHUoCi0gICAgICBncHVfaW5fYXJnMV9kYXRhLCB0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGluX0FyZzJfZ3B1KAotICAgICAgZ3B1X2luX2FyZzJfZGF0YSwgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPGJvb2wsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IG91dF9BcmdvdXRfZ3B1KAotICAgICAgZ3B1X291dF9hcmdfZGF0YSwgYXJnUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPGJvb2wsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IG91dF9BcmdvdXRfZ3B1X2hlbHBlcigKLSAgICAgIGdwdV9vdXRfYXJnX19ncHVfaGVscGVyX2RhdGEsIGFyZ1JhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gaW5fZ3B1KGdwdV9pbl9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGluX0FyZzFfZ3B1KGdwdV9pbl9hcmcxX2RhdGEsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gaW5fQXJnMl9ncHUoZ3B1X2luX2FyZzJfZGF0YSwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPGJvb2wsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IG91dF9BcmdvdXRfZ3B1KGdwdV9vdXRfYXJnX2RhdGEsIGFyZ1JhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxib29sLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBvdXRfQXJnb3V0X2dwdV9oZWxwZXIoZ3B1X291dF9hcmdfX2dwdV9oZWxwZXJfZGF0YSwgYXJnUmFuZ2UpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAwLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBvdXRfZ3B1KGdwdV9vdXRfZGF0YSk7CiAKICAgLy8gQ1BVIFZFUlNJT04KICAgb3V0X2FyZ19jcHUgPQotICAgICAgKGluX2FyZzEuYXJnbWF4KDEpID09IGluX2FyZzIuYXJnbWF4KDEpKQotICAgICAgICAgIC5zZWxlY3Qob3V0X2FyZ19jcHUuY29uc3RhbnQodHJ1ZSksIG91dF9hcmdfY3B1LmNvbnN0YW50KGZhbHNlKSk7Ci0gIGZ1bGxfcmVkdXggPSAob3V0X2FyZ19jcHUudGVtcGxhdGUgY2FzdDxmbG9hdD4oKSkKLSAgICAgICAgICAgICAgICAgICAucmVkdWNlKHJlZF9heGlzLCBFaWdlbjo6aW50ZXJuYWw6Ok1lYW5SZWR1Y2VyPERhdGFUeXBlPigpKTsKKyAgICAgIChpbl9hcmcxLmFyZ21heCgxKSA9PSBpbl9hcmcyLmFyZ21heCgxKSkuc2VsZWN0KG91dF9hcmdfY3B1LmNvbnN0YW50KHRydWUpLCBvdXRfYXJnX2NwdS5jb25zdGFudChmYWxzZSkpOworICBmdWxsX3JlZHV4ID0gKG91dF9hcmdfY3B1LnRlbXBsYXRlIGNhc3Q8ZmxvYXQ+KCkpLnJlZHVjZShyZWRfYXhpcywgRWlnZW46OmludGVybmFsOjpNZWFuUmVkdWNlcjxEYXRhVHlwZT4oKSk7CiAKICAgLy8gR1BVIFZFUlNJT04KLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKAotICAgICAgZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwgKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKAotICAgICAgZ3B1X2luX2FyZzFfZGF0YSwgaW5fYXJnMS5kYXRhKCksCi0gICAgICAoaW5fYXJnMS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZSgKLSAgICAgIGdwdV9pbl9hcmcyX2RhdGEsIGluX2FyZzIuZGF0YSgpLAotICAgICAgKGluX2FyZzIuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwotICBvdXRfQXJnb3V0X2dwdV9oZWxwZXIuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9Ci0gICAgICAoaW5fQXJnMV9ncHUuYXJnbWF4KDEpID09IGluX0FyZzJfZ3B1LmFyZ21heCgxKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW5fZGF0YSwgaW4uZGF0YSgpLCAoaW4uZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2FyZzFfZGF0YSwgaW5fYXJnMS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5fYXJnMS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW5fYXJnMl9kYXRhLCBpbl9hcmcyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbl9hcmcyLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgb3V0X0FyZ291dF9ncHVfaGVscGVyLmRldmljZShzeWNsX2RldmljZSkgPSAoaW5fQXJnMV9ncHUuYXJnbWF4KDEpID09IGluX0FyZzJfZ3B1LmFyZ21heCgxKSk7CiAgIG91dF9BcmdvdXRfZ3B1LmRldmljZShzeWNsX2RldmljZSkgPQotICAgICAgKG91dF9BcmdvdXRfZ3B1X2hlbHBlcikKLSAgICAgICAgICAuc2VsZWN0KG91dF9BcmdvdXRfZ3B1LmNvbnN0YW50KHRydWUpLAotICAgICAgICAgICAgICAgICAgb3V0X0FyZ291dF9ncHUuY29uc3RhbnQoZmFsc2UpKTsKKyAgICAgIChvdXRfQXJnb3V0X2dwdV9oZWxwZXIpLnNlbGVjdChvdXRfQXJnb3V0X2dwdS5jb25zdGFudCh0cnVlKSwgb3V0X0FyZ291dF9ncHUuY29uc3RhbnQoZmFsc2UpKTsKICAgb3V0X2dwdS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0KLSAgICAgIChvdXRfQXJnb3V0X2dwdS50ZW1wbGF0ZSBjYXN0PGZsb2F0PigpKQotICAgICAgICAgIC5yZWR1Y2UocmVkX2F4aXMsIEVpZ2VuOjppbnRlcm5hbDo6TWVhblJlZHVjZXI8RGF0YVR5cGU+KCkpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9yZWR1eF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRGF0YVR5cGUpKTsKKyAgICAgIChvdXRfQXJnb3V0X2dwdS50ZW1wbGF0ZSBjYXN0PGZsb2F0PigpKS5yZWR1Y2UocmVkX2F4aXMsIEVpZ2VuOjppbnRlcm5hbDo6TWVhblJlZHVjZXI8RGF0YVR5cGU+KCkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9yZWR1eF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsIHNpemVvZihEYXRhVHlwZSkpOwogICAvLyBDaGVjayB0aGF0IHRoZSBDUFUgYW5kIEdQVSByZWR1Y3Rpb25zIHJldHVybiB0aGUgc2FtZSByZXN1bHQuCi0gIHN0ZDo6Y291dCA8PCAiU1lDTCA6ICIgPDwgZnVsbF9yZWR1eF9ncHUoKSA8PCAiICwgQ1BVIDogIiA8PCBmdWxsX3JlZHV4KCkKLSAgICAgICAgICAgIDw8ICdcbic7CisgIHN0ZDo6Y291dCA8PCAiU1lDTCA6ICIgPDwgZnVsbF9yZWR1eF9ncHUoKSA8PCAiICwgQ1BVIDogIiA8PCBmdWxsX3JlZHV4KCkgPDwgJ1xuJzsKICAgVkVSSUZZX0lTX0VRVUFMKGZ1bGxfcmVkdXhfZ3B1KCksIGZ1bGxfcmVkdXgoKSk7CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2luX2RhdGEpOwogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9pbl9hcmcxX2RhdGEpOwpAQCAtMjY5LDggKzIyOSw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX21lYW5fd2l0aF9vZmZzZXRfc3ljbCgKLSAgICBjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKK3N0YXRpYyB2b2lkIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX21lYW5fd2l0aF9vZmZzZXRfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgdXNpbmcgZGF0YV90ZW5zb3IgPSBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT47CiAgIHVzaW5nIHNjYWxhcl90ZW5zb3IgPSBUZW5zb3I8RGF0YVR5cGUsIDAsIERhdGFMYXlvdXQsIEluZGV4VHlwZT47CiAgIGNvbnN0IEluZGV4VHlwZSBudW1fcm93cyA9IDY0OwpAQCAtMjkxLDE4ICsyNTAsMTQgQEAKICAgZnVsbF9yZWR1eCA9IGluX29mZnNldC5tZWFuKCk7CiAgIFZFUklGWV9JU19OT1RfRVFVQUwoZnVsbF9yZWR1eCgpLCBpbigwKSk7CiAKLSAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobl9lbGVtcyAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShuX2VsZW1zICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X291dF9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzaXplb2YoRGF0YVR5cGUpKSk7CiAKICAgVGVuc29yTWFwPGRhdGFfdGVuc29yPiBpbl9ncHUoZ3B1X2luX2RhdGEgKyBvZmZzZXQsIHRlbnNvcl9vZmZzZXRfcmFuZ2UpOwogICBUZW5zb3JNYXA8c2NhbGFyX3RlbnNvcj4gb3V0X2dwdShncHVfb3V0X2RhdGEpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksIG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgb3V0X2dwdS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1Lm1lYW4oKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcmVkdXhfZ3B1LmRhdGEoKSwgZ3B1X291dF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3JlZHV4X2dwdS5kYXRhKCksIGdwdV9vdXRfZGF0YSwgc2l6ZW9mKERhdGFUeXBlKSk7CiAKICAgLy8gQ2hlY2sgdGhhdCB0aGUgQ1BVIGFuZCBHUFUgcmVkdWN0aW9ucyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0LgogICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcmVkdXhfZ3B1KCksIGZ1bGxfcmVkdXgoKSk7CkBAIC0zMTIsOCArMjY3LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9mdWxsX3JlZHVjdGlvbnNfbWVhbl93aXRoX29kZF9vZmZzZXRfc3ljbCgKLSAgICBjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKK3N0YXRpYyB2b2lkIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX21lYW5fd2l0aF9vZGRfb2Zmc2V0X3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIC8vIFRoaXMgaXMgYSBwYXJ0aWN1bGFyIGNhc2Ugd2hpY2ggaWxsdXN0cmF0ZXMgYSBwb3NzaWJsZSBwcm9ibGVtIHdoZW4gdGhlCiAgIC8vIG51bWJlciBvZiBsb2NhbCB0aHJlYWRzIGluIGEgd29ya2dyb3VwIGlzIGV2ZW4sIGJ1dCBpcyBub3QgYSBwb3dlciBvZiB0d28uCiAgIHVzaW5nIGRhdGFfdGVuc29yID0gVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OwpAQCAtMzM2LDE5ICsyOTAsMTQgQEAKICAgcmVkX2NwdSA9IGluLnJlZHVjZShyZWRfYXhpcywgRWlnZW46OmludGVybmFsOjpNZWFuUmVkdWNlcjxEYXRhVHlwZT4oKSk7CiAgIFZFUklGWV9JU19BUFBST1goY29uc3RfdmFsLCByZWRfY3B1KCkpOwogCi0gIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPQotICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobl9lbGVtcyAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoc2l6ZW9mKERhdGFUeXBlKSkpOwogCiAgIFRlbnNvck1hcDxkYXRhX3RlbnNvcj4gaW5fZ3B1KGdwdV9pbl9kYXRhLCB0ZW5zb3JfcmFuZ2UpOwogICBUZW5zb3JNYXA8c2NhbGFyX3RlbnNvcj4gb3V0X2dwdShncHVfb3V0X2RhdGEpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKTsKLSAgb3V0X2dwdS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0KLSAgICAgIGluX2dwdS5yZWR1Y2UocmVkX2F4aXMsIEVpZ2VuOjppbnRlcm5hbDo6TWVhblJlZHVjZXI8RGF0YVR5cGU+KCkpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmVkX2dwdS5kYXRhKCksIGdwdV9vdXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwgbl9lbGVtcyAqIHNpemVvZihEYXRhVHlwZSkpOworICBvdXRfZ3B1LmRldmljZShzeWNsX2RldmljZSkgPSBpbl9ncHUucmVkdWNlKHJlZF9heGlzLCBFaWdlbjo6aW50ZXJuYWw6Ok1lYW5SZWR1Y2VyPERhdGFUeXBlPigpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJlZF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIC8vIENoZWNrIHRoYXQgdGhlIENQVSBhbmQgR1BVIHJlZHVjdGlvbnMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4KICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3JlZHV4X2dwdSwgZnVsbF9yZWR1eCk7CkBAIC0zNTgsOCArMzA3LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9mdWxsX3JlZHVjdGlvbnNfbWluX3N5Y2woCi0gICAgY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CitzdGF0aWMgdm9pZCB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19taW5fc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgY29uc3QgSW5kZXhUeXBlIG51bV9yb3dzID0gODc2OwogICBjb25zdCBJbmRleFR5cGUgbnVtX2NvbHMgPSA5NTM7CiAgIGFycmF5PEluZGV4VHlwZSwgMj4gdGVuc29yUmFuZ2UgPSB7e251bV9yb3dzLCBudW1fY29sc319OwpAQCAtMzcyLDE5ICszMjAsMTUgQEAKIAogICBmdWxsX3JlZHV4ID0gaW4ubWluaW11bSgpOwogCi0gIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oCi0gICAgICBzeWNsX2RldmljZS5hbGxvY2F0ZShpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4uZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogICBEYXRhVHlwZSogZ3B1X291dF9kYXRhID0gKERhdGFUeXBlKilzeWNsX2RldmljZS5hbGxvY2F0ZShzaXplb2YoRGF0YVR5cGUpKTsKIAotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBpbl9ncHUoZ3B1X2luX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGluX2dwdShncHVfaW5fZGF0YSwgdGVuc29yUmFuZ2UpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAwLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBvdXRfZ3B1KGdwdV9vdXRfZGF0YSk7CiAKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKAotICAgICAgZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwgKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksIChpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIG91dF9ncHUuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGluX2dwdS5taW5pbXVtKCk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3JlZHV4X2dwdS5kYXRhKCksIGdwdV9vdXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZnVsbF9yZWR1eF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsIHNpemVvZihEYXRhVHlwZSkpOwogICAvLyBDaGVjayB0aGF0IHRoZSBDUFUgYW5kIEdQVSByZWR1Y3Rpb25zIHJldHVybiB0aGUgc2FtZSByZXN1bHQuCiAgIFZFUklGWV9JU19BUFBST1goZnVsbF9yZWR1eF9ncHUoKSwgZnVsbF9yZWR1eCgpKTsKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW5fZGF0YSk7CkBAIC0zOTIsOCArMzM2LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9mdWxsX3JlZHVjdGlvbnNfbWluX3dpdGhfb2Zmc2V0X3N5Y2woCi0gICAgY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CitzdGF0aWMgdm9pZCB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19taW5fd2l0aF9vZmZzZXRfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgdXNpbmcgZGF0YV90ZW5zb3IgPSBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT47CiAgIHVzaW5nIHNjYWxhcl90ZW5zb3IgPSBUZW5zb3I8RGF0YVR5cGUsIDAsIERhdGFMYXlvdXQsIEluZGV4VHlwZT47CiAgIGNvbnN0IEluZGV4VHlwZSBudW1fcm93cyA9IDY0OwpAQCAtNDE3LDE4ICszNjAsMTQgQEAKICAgZnVsbF9yZWR1eCA9IGluX29mZnNldC5taW5pbXVtKCk7CiAgIFZFUklGWV9JU19OT1RfRVFVQUwoZnVsbF9yZWR1eCgpLCBpbigwKSk7CiAKLSAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobl9lbGVtcyAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShuX2VsZW1zICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X291dF9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzaXplb2YoRGF0YVR5cGUpKSk7CiAKICAgVGVuc29yTWFwPGRhdGFfdGVuc29yPiBpbl9ncHUoZ3B1X2luX2RhdGEgKyBvZmZzZXQsIHRlbnNvcl9vZmZzZXRfcmFuZ2UpOwogICBUZW5zb3JNYXA8c2NhbGFyX3RlbnNvcj4gb3V0X2dwdShncHVfb3V0X2RhdGEpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksIG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgb3V0X2dwdS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1Lm1pbmltdW0oKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGZ1bGxfcmVkdXhfZ3B1LmRhdGEoKSwgZ3B1X291dF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChmdWxsX3JlZHV4X2dwdS5kYXRhKCksIGdwdV9vdXRfZGF0YSwgc2l6ZW9mKERhdGFUeXBlKSk7CiAKICAgLy8gQ2hlY2sgdGhhdCB0aGUgQ1BVIGFuZCBHUFUgcmVkdWN0aW9ucyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0LgogICBWRVJJRllfSVNfQVBQUk9YKGZ1bGxfcmVkdXhfZ3B1KCksIGZ1bGxfcmVkdXgoKSk7CkBAIC00MzcsOCArMzc2LDcgQEAKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfb3V0X2RhdGEpOwogfQogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9maXJzdF9kaW1fcmVkdWN0aW9uc19tYXhfc3ljbCgKLSAgICBjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKK3N0YXRpYyB2b2lkIHRlc3RfZmlyc3RfZGltX3JlZHVjdGlvbnNfbWF4X3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIEluZGV4VHlwZSBkaW1feCA9IDE0NTsKICAgSW5kZXhUeXBlIGRpbV95ID0gMTsKICAgSW5kZXhUeXBlIGRpbV96ID0gNjc7CkBAIC00NTYsMzUgKzM5NCwyNyBAQAogCiAgIHJlZHV4ID0gaW4ubWF4aW11bShyZWRfYXhpcyk7CiAKLSAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPigKLSAgICAgIHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoCi0gICAgICByZWR1eF9ncHUuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHJlZHV4X2dwdS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gaW5fZ3B1KGdwdV9pbl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBvdXRfZ3B1KAotICAgICAgZ3B1X291dF9kYXRhLCByZWR1Y2VkX3RlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gaW5fZ3B1KGdwdV9pbl9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IG91dF9ncHUoZ3B1X291dF9kYXRhLCByZWR1Y2VkX3RlbnNvclJhbmdlKTsKIAotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoCi0gICAgICBncHVfaW5fZGF0YSwgaW4uZGF0YSgpLCAoaW4uZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwgKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgb3V0X2dwdS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1Lm1heGltdW0ocmVkX2F4aXMpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoCi0gICAgICByZWR1eF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsCi0gICAgICByZWR1eF9ncHUuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZWR1eF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsIHJlZHV4X2dwdS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAogICAvLyBDaGVjayB0aGF0IHRoZSBDUFUgYW5kIEdQVSByZWR1Y3Rpb25zIHJldHVybiB0aGUgc2FtZSByZXN1bHQuCiAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgcmVkdWNlZF90ZW5zb3JSYW5nZVswXTsgaisrKQotICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgcmVkdWNlZF90ZW5zb3JSYW5nZVsxXTsgaysrKQotICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZWR1eF9ncHUoaiwgayksIHJlZHV4KGosIGspKTsKKyAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IHJlZHVjZWRfdGVuc29yUmFuZ2VbMV07IGsrKykgVkVSSUZZX0lTX0FQUFJPWChyZWR1eF9ncHUoaiwgayksIHJlZHV4KGosIGspKTsKIAogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9pbl9kYXRhKTsKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfb3V0X2RhdGEpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X2ZpcnN0X2RpbV9yZWR1Y3Rpb25zX21heF93aXRoX29mZnNldF9zeWNsKAotICAgIGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgeworc3RhdGljIHZvaWQgdGVzdF9maXJzdF9kaW1fcmVkdWN0aW9uc19tYXhfd2l0aF9vZmZzZXRfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgdXNpbmcgZGF0YV90ZW5zb3IgPSBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT47CiAgIHVzaW5nIHJlZHVjZWRfdGVuc29yID0gVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OwogCkBAIC01MTcsMTggKzQ0NywxNCBAQAogICAgIFZFUklGWV9JU19OT1RfRVFVQUwocmVkdXgoaSksIGluKGkpKTsKICAgfQogCi0gIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KAotICAgICAgc3ljbF9kZXZpY2UuYWxsb2NhdGUobl9yZWR1Y2VkICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG5fcmVkdWNlZCAqIHNpemVvZihEYXRhVHlwZSkpKTsKIAogICBUZW5zb3JNYXA8ZGF0YV90ZW5zb3I+IGluX2dwdShncHVfaW5fZGF0YSArIG9mZnNldCwgdGVuc29yX29mZnNldF9yYW5nZSk7CiAgIFRlbnNvck1hcDxyZWR1Y2VkX3RlbnNvcj4gb3V0X2dwdShncHVfb3V0X2RhdGEsIHJlZHVjZWRfcmFuZ2UpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksIG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgb3V0X2dwdS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1Lm1heGltdW0ocmVkX2F4aXMpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmVkdXhfZ3B1LmRhdGEoKSwgZ3B1X291dF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9yZWR1Y2VkICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZWR1eF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsIG5fcmVkdWNlZCAqIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIC8vIENoZWNrIHRoYXQgdGhlIENQVSBhbmQgR1BVIHJlZHVjdGlvbnMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4KICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCBuX3JlZHVjZWQ7IGkrKykgewpAQCAtNTQwLDggKzQ2Niw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfbGFzdF9kaW1fcmVkdWN0aW9uc19tYXhfd2l0aF9vZmZzZXRfc3ljbCgKLSAgICBjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKK3N0YXRpYyB2b2lkIHRlc3RfbGFzdF9kaW1fcmVkdWN0aW9uc19tYXhfd2l0aF9vZmZzZXRfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgdXNpbmcgZGF0YV90ZW5zb3IgPSBUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT47CiAgIHVzaW5nIHJlZHVjZWRfdGVuc29yID0gVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OwogCkBAIC01ODIsMTggKzUwNywxNCBAQAogICAgIFZFUklGWV9JU19OT1RfRVFVQUwocmVkX29mZnNldChpKSwgaW4oaSkpOwogICB9CiAKLSAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0KLSAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobl9lbGVtcyAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oCi0gICAgICBzeWNsX2RldmljZS5hbGxvY2F0ZSgobl9yZWR1Y2VkICsgMSkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobl9lbGVtcyAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoKG5fcmVkdWNlZCArIDEpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogCiAgIFRlbnNvck1hcDxkYXRhX3RlbnNvcj4gaW5fZ3B1KGdwdV9pbl9kYXRhICsgb2Zmc2V0LCB0ZW5zb3Jfb2Zmc2V0X3JhbmdlKTsKICAgVGVuc29yTWFwPHJlZHVjZWRfdGVuc29yPiBvdXRfZ3B1KGdwdV9vdXRfZGF0YSArIDEsIHJlZHVjZWRfcmFuZ2UpOwotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksIG5fZWxlbXMgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgb3V0X2dwdS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1Lm1heGltdW0ocmVkX2F4aXMpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmVkdXhfZ3B1LmRhdGEoKSwgb3V0X2dwdS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX3JlZHVjZWQgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJlZHV4X2dwdS5kYXRhKCksIG91dF9ncHUuZGF0YSgpLCBuX3JlZHVjZWQgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAogICAvLyBDaGVjayB0aGF0IHRoZSBDUFUgYW5kIEdQVSByZWR1Y3Rpb25zIHJldHVybiB0aGUgc2FtZSByZXN1bHQuCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgbl9yZWR1Y2VkOyBpKyspIHsKQEAgLTYwNSw4ICs1MjYsNyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X2ZpcnN0X2RpbV9yZWR1Y3Rpb25zX3N1bV9zeWNsKAotICAgIGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSwgSW5kZXhUeXBlIGRpbV94LCBJbmRleFR5cGUgZGltX3kpIHsKK3N0YXRpYyB2b2lkIHRlc3RfZmlyc3RfZGltX3JlZHVjdGlvbnNfc3VtX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlLCBJbmRleFR5cGUgZGltX3gsIEluZGV4VHlwZSBkaW1feSkgewogICBhcnJheTxJbmRleFR5cGUsIDI+IHRlbnNvclJhbmdlID0ge3tkaW1feCwgZGltX3l9fTsKICAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgMT4gcmVkX2F4aXM7CiAgIHJlZF9heGlzWzBdID0gMDsKQEAgLTYxOSwyMiArNTM5LDE2IEBACiAgIGluLnNldFJhbmRvbSgpOwogICByZWR1eCA9IGluLnN1bShyZWRfYXhpcyk7CiAKLSAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPigKLSAgICAgIHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoCi0gICAgICByZWR1eF9ncHUuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHJlZHV4X2dwdS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gaW5fZ3B1KGdwdV9pbl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBvdXRfZ3B1KAotICAgICAgZ3B1X291dF9kYXRhLCByZWR1Y2VkX3RlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gaW5fZ3B1KGdwdV9pbl9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IG91dF9ncHUoZ3B1X291dF9kYXRhLCByZWR1Y2VkX3RlbnNvclJhbmdlKTsKIAotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoCi0gICAgICBncHVfaW5fZGF0YSwgaW4uZGF0YSgpLCAoaW4uZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwgKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgb3V0X2dwdS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1LnN1bShyZWRfYXhpcyk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCgKLSAgICAgIHJlZHV4X2dwdS5kYXRhKCksIGdwdV9vdXRfZGF0YSwKLSAgICAgIHJlZHV4X2dwdS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJlZHV4X2dwdS5kYXRhKCksIGdwdV9vdXRfZGF0YSwgcmVkdXhfZ3B1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIC8vIENoZWNrIHRoYXQgdGhlIENQVSBhbmQgR1BVIHJlZHVjdGlvbnMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4KICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCByZWR1eC5zaXplKCk7IGkrKykgewpAQCAtNjQ1LDggKzU1OSw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfZmlyc3RfZGltX3JlZHVjdGlvbnNfbWVhbl9zeWNsKAotICAgIGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgeworc3RhdGljIHZvaWQgdGVzdF9maXJzdF9kaW1fcmVkdWN0aW9uc19tZWFuX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIEluZGV4VHlwZSBkaW1feCA9IDE0NTsKICAgSW5kZXhUeXBlIGRpbV95ID0gMTsKICAgSW5kZXhUeXBlIGRpbV96ID0gNjc7CkBAIC02NjQsMzUgKzU3NywyNyBAQAogCiAgIHJlZHV4ID0gaW4ubWVhbihyZWRfYXhpcyk7CiAKLSAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPigKLSAgICAgIHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoCi0gICAgICByZWR1eF9ncHUuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHJlZHV4X2dwdS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gaW5fZ3B1KGdwdV9pbl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBvdXRfZ3B1KAotICAgICAgZ3B1X291dF9kYXRhLCByZWR1Y2VkX3RlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gaW5fZ3B1KGdwdV9pbl9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IG91dF9ncHUoZ3B1X291dF9kYXRhLCByZWR1Y2VkX3RlbnNvclJhbmdlKTsKIAotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoCi0gICAgICBncHVfaW5fZGF0YSwgaW4uZGF0YSgpLCAoaW4uZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwgKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgb3V0X2dwdS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1Lm1lYW4ocmVkX2F4aXMpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoCi0gICAgICByZWR1eF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsCi0gICAgICByZWR1eF9ncHUuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZWR1eF9ncHUuZGF0YSgpLCBncHVfb3V0X2RhdGEsIHJlZHV4X2dwdS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKTsKIAogICAvLyBDaGVjayB0aGF0IHRoZSBDUFUgYW5kIEdQVSByZWR1Y3Rpb25zIHJldHVybiB0aGUgc2FtZSByZXN1bHQuCiAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgcmVkdWNlZF90ZW5zb3JSYW5nZVswXTsgaisrKQotICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgcmVkdWNlZF90ZW5zb3JSYW5nZVsxXTsgaysrKQotICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZWR1eF9ncHUoaiwgayksIHJlZHV4KGosIGspKTsKKyAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IHJlZHVjZWRfdGVuc29yUmFuZ2VbMV07IGsrKykgVkVSSUZZX0lTX0FQUFJPWChyZWR1eF9ncHUoaiwgayksIHJlZHV4KGosIGspKTsKIAogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9pbl9kYXRhKTsKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfb3V0X2RhdGEpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X2xhc3RfZGltX3JlZHVjdGlvbnNfbWVhbl9zeWNsKAotICAgIGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgeworc3RhdGljIHZvaWQgdGVzdF9sYXN0X2RpbV9yZWR1Y3Rpb25zX21lYW5fc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIGRpbV94ID0gNjQ7CiAgIEluZGV4VHlwZSBkaW1feSA9IDE7CiAgIEluZGV4VHlwZSBkaW1feiA9IDMyOwpAQCAtNzEwLDM0ICs2MTUsMjYgQEAKIAogICByZWR1eCA9IGluLm1lYW4ocmVkX2F4aXMpOwogCi0gIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oCi0gICAgICBzeWNsX2RldmljZS5hbGxvY2F0ZShpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKAotICAgICAgcmVkdXhfZ3B1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyZWR1eF9ncHUuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogCi0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGluX2dwdShncHVfaW5fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbnNvclJhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gb3V0X2dwdSgKLSAgICAgIGdwdV9vdXRfZGF0YSwgcmVkdWNlZF90ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGluX2dwdShncHVfaW5fZGF0YSwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBvdXRfZ3B1KGdwdV9vdXRfZGF0YSwgcmVkdWNlZF90ZW5zb3JSYW5nZSk7CiAKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKAotICAgICAgZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwgKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksIChpbi5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIG91dF9ncHUuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGluX2dwdS5tZWFuKHJlZF9heGlzKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KAotICAgICAgcmVkdXhfZ3B1LmRhdGEoKSwgZ3B1X291dF9kYXRhLAotICAgICAgcmVkdXhfZ3B1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmVkdXhfZ3B1LmRhdGEoKSwgZ3B1X291dF9kYXRhLCByZWR1eF9ncHUuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIC8vIENoZWNrIHRoYXQgdGhlIENQVSBhbmQgR1BVIHJlZHVjdGlvbnMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4KICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCByZWR1Y2VkX3RlbnNvclJhbmdlWzBdOyBqKyspCi0gICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCByZWR1Y2VkX3RlbnNvclJhbmdlWzFdOyBrKyspCi0gICAgICBWRVJJRllfSVNfQVBQUk9YKHJlZHV4X2dwdShqLCBrKSwgcmVkdXgoaiwgaykpOworICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgcmVkdWNlZF90ZW5zb3JSYW5nZVsxXTsgaysrKSBWRVJJRllfSVNfQVBQUk9YKHJlZHV4X2dwdShqLCBrKSwgcmVkdXgoaiwgaykpOwogCiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2luX2RhdGEpOwogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9vdXRfZGF0YSk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3RfbGFzdF9kaW1fcmVkdWN0aW9uc19zdW1fc3ljbCgKLSAgICBjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKK3N0YXRpYyB2b2lkIHRlc3RfbGFzdF9kaW1fcmVkdWN0aW9uc19zdW1fc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIGRpbV94ID0gNjQ7CiAgIEluZGV4VHlwZSBkaW1feSA9IDE7CiAgIEluZGV4VHlwZSBkaW1feiA9IDMyOwpAQCAtNzU1LDM0ICs2NTIsMjYgQEAKIAogICByZWR1eCA9IGluLnN1bShyZWRfYXhpcyk7CiAKLSAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPigKLSAgICAgIHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoCi0gICAgICByZWR1eF9ncHUuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHJlZHV4X2dwdS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gaW5fZ3B1KGdwdV9pbl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAyLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBvdXRfZ3B1KAotICAgICAgZ3B1X291dF9kYXRhLCByZWR1Y2VkX3RlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gaW5fZ3B1KGdwdV9pbl9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDIsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IG91dF9ncHUoZ3B1X291dF9kYXRhLCByZWR1Y2VkX3RlbnNvclJhbmdlKTsKIAotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoCi0gICAgICBncHVfaW5fZGF0YSwgaW4uZGF0YSgpLCAoaW4uZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluLmRhdGEoKSwgKGluLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgb3V0X2dwdS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1LnN1bShyZWRfYXhpcyk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCgKLSAgICAgIHJlZHV4X2dwdS5kYXRhKCksIGdwdV9vdXRfZGF0YSwKLSAgICAgIHJlZHV4X2dwdS5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJlZHV4X2dwdS5kYXRhKCksIGdwdV9vdXRfZGF0YSwgcmVkdXhfZ3B1LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICAvLyBDaGVjayB0aGF0IHRoZSBDUFUgYW5kIEdQVSByZWR1Y3Rpb25zIHJldHVybiB0aGUgc2FtZSByZXN1bHQuCiAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgcmVkdWNlZF90ZW5zb3JSYW5nZVswXTsgaisrKQotICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgcmVkdWNlZF90ZW5zb3JSYW5nZVsxXTsgaysrKQotICAgICAgVkVSSUZZX0lTX0FQUFJPWChyZWR1eF9ncHUoaiwgayksIHJlZHV4KGosIGspKTsKKyAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IHJlZHVjZWRfdGVuc29yUmFuZ2VbMV07IGsrKykgVkVSSUZZX0lTX0FQUFJPWChyZWR1eF9ncHUoaiwgayksIHJlZHV4KGosIGspKTsKIAogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9pbl9kYXRhKTsKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfb3V0X2RhdGEpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X2xhc3RfcmVkdWN0aW9uc19zdW1fc3ljbCgKLSAgICBjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKK3N0YXRpYyB2b2lkIHRlc3RfbGFzdF9yZWR1Y3Rpb25zX3N1bV9zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBhdXRvIHRlbnNvclJhbmdlID0gU2l6ZXM8NjQsIDMyPig2NCwgMzIpOwogICAvLyBhdXRvIHJlZF9heGlzID0gIFNpemVzPDAsMT4oMCwxKTsKICAgRWlnZW46OkluZGV4TGlzdDxFaWdlbjo6dHlwZTJpbmRleDwxPj4gcmVkX2F4aXM7CkBAIC03OTUsMjMgKzY4NCwxOCBAQAogCiAgIHJlZHV4X2ZpeCA9IGluX2ZpeC5zdW0ocmVkX2F4aXMpOwogCi0gIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oCi0gICAgICBzeWNsX2RldmljZS5hbGxvY2F0ZShpbl9maXguZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwotICBEYXRhVHlwZSogZ3B1X291dF9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSgKLSAgICAgIHJlZHV4X2dwdV9maXguZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbl9maXguZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X291dF9kYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocmVkdXhfZ3B1X2ZpeC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAKLSAgVGVuc29yTWFwPFRlbnNvckZpeGVkU2l6ZTxEYXRhVHlwZSwgU2l6ZXM8NjQsIDMyPiwgRGF0YUxheW91dD4+IGluX2dwdV9maXgoCi0gICAgICBncHVfaW5fZGF0YSwgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPERhdGFUeXBlLCBTaXplczw2ND4sIERhdGFMYXlvdXQ+PiBvdXRfZ3B1X2ZpeCgKLSAgICAgIGdwdV9vdXRfZGF0YSwgcmVkdWNlZF90ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3JGaXhlZFNpemU8RGF0YVR5cGUsIFNpemVzPDY0LCAzMj4sIERhdGFMYXlvdXQ+PiBpbl9ncHVfZml4KGdwdV9pbl9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3JGaXhlZFNpemU8RGF0YVR5cGUsIFNpemVzPDY0PiwgRGF0YUxheW91dD4+IG91dF9ncHVfZml4KGdwdV9vdXRfZGF0YSwgcmVkdWNlZF90ZW5zb3JSYW5nZSk7CiAKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKAotICAgICAgZ3B1X2luX2RhdGEsIGluX2ZpeC5kYXRhKCksCi0gICAgICAoaW5fZml4LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbl9maXguZGF0YSgpLCAoaW5fZml4LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgb3V0X2dwdV9maXguZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGluX2dwdV9maXguc3VtKHJlZF9heGlzKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KAotICAgICAgcmVkdXhfZ3B1X2ZpeC5kYXRhKCksIGdwdV9vdXRfZGF0YSwKLSAgICAgIHJlZHV4X2dwdV9maXguZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZWR1eF9ncHVfZml4LmRhdGEoKSwgZ3B1X291dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdXhfZ3B1X2ZpeC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgLy8gQ2hlY2sgdGhhdCB0aGUgQ1BVIGFuZCBHUFUgcmVkdWN0aW9ucyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0LgogICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IHJlZHVjZWRfdGVuc29yUmFuZ2VbMF07IGorKykgewogICAgIFZFUklGWV9JU19BUFBST1gocmVkdXhfZ3B1X2ZpeChqKSwgcmVkdXhfZml4KGopKTsKQEAgLTgyMiw4ICs3MDYsNyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X2xhc3RfcmVkdWN0aW9uc19tZWFuX3N5Y2woCi0gICAgY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CitzdGF0aWMgdm9pZCB0ZXN0X2xhc3RfcmVkdWN0aW9uc19tZWFuX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIGF1dG8gdGVuc29yUmFuZ2UgPSBTaXplczw2NCwgMzI+KDY0LCAzMik7CiAgIEVpZ2VuOjpJbmRleExpc3Q8RWlnZW46OnR5cGUyaW5kZXg8MT4+IHJlZF9heGlzOwogICBhdXRvIHJlZHVjZWRfdGVuc29yUmFuZ2UgPSBTaXplczw2ND4oNjQpOwpAQCAtODM0LDIzICs3MTcsMTggQEAKICAgaW5fZml4LnNldFJhbmRvbSgpOwogICByZWR1eF9maXggPSBpbl9maXgubWVhbihyZWRfYXhpcyk7CiAKLSAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPigKLSAgICAgIHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluX2ZpeC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKAotICAgICAgcmVkdXhfZ3B1X2ZpeC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluX2ZpeC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShyZWR1eF9ncHVfZml4LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKIAotICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPERhdGFUeXBlLCBTaXplczw2NCwgMzI+LCBEYXRhTGF5b3V0Pj4gaW5fZ3B1X2ZpeCgKLSAgICAgIGdwdV9pbl9kYXRhLCB0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvck1hcDxUZW5zb3JGaXhlZFNpemU8RGF0YVR5cGUsIFNpemVzPDY0PiwgRGF0YUxheW91dD4+IG91dF9ncHVfZml4KAotICAgICAgZ3B1X291dF9kYXRhLCByZWR1Y2VkX3RlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvckZpeGVkU2l6ZTxEYXRhVHlwZSwgU2l6ZXM8NjQsIDMyPiwgRGF0YUxheW91dD4+IGluX2dwdV9maXgoZ3B1X2luX2RhdGEsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvckZpeGVkU2l6ZTxEYXRhVHlwZSwgU2l6ZXM8NjQ+LCBEYXRhTGF5b3V0Pj4gb3V0X2dwdV9maXgoZ3B1X291dF9kYXRhLCByZWR1Y2VkX3RlbnNvclJhbmdlKTsKIAotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoCi0gICAgICBncHVfaW5fZGF0YSwgaW5fZml4LmRhdGEoKSwKLSAgICAgIChpbl9maXguZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2luX2RhdGEsIGluX2ZpeC5kYXRhKCksIChpbl9maXguZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBvdXRfZ3B1X2ZpeC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1X2ZpeC5tZWFuKHJlZF9heGlzKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KAotICAgICAgcmVkdXhfZ3B1X2ZpeC5kYXRhKCksIGdwdV9vdXRfZGF0YSwKLSAgICAgIHJlZHV4X2dwdV9maXguZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZWR1eF9ncHVfZml4LmRhdGEoKSwgZ3B1X291dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdXhfZ3B1X2ZpeC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgc3ljbF9kZXZpY2Uuc3luY2hyb25pemUoKTsKICAgLy8gQ2hlY2sgdGhhdCB0aGUgQ1BVIGFuZCBHUFUgcmVkdWN0aW9ucyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0LgogICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IHJlZHVjZWRfdGVuc29yUmFuZ2VbMF07IGorKykgewpAQCAtODcyLDMyICs3NTAsMjIgQEAKICAgc3RhdGljIGNvbnN0ZXhwciBPdXRUIEluZkJpdCA9IDE7CiAgIHN0YXRpYyBjb25zdGV4cHIgT3V0VCBOYW5CaXQgPSAyOwogCi0gIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZWR1Y2UoY29uc3QgSW5UIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0VCogYWNjdW0pIGNvbnN0IHsKKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJlZHVjZShjb25zdCBJblQgeCwgT3V0VCogYWNjdW0pIGNvbnN0IHsKICAgICBpZiAoRWlnZW46Om51bWV4dDo6aXNpbmYoeCkpCiAgICAgICAqYWNjdW0gfD0gSW5mQml0OwogICAgIGVsc2UgaWYgKEVpZ2VuOjpudW1leHQ6OmlzbmFuKHgpKQogICAgICAgKmFjY3VtIHw9IE5hbkJpdDsKICAgfQogCi0gIEVJR0VOX0RFVklDRV9GVU5DIEVJR0VOX1NUUk9OR19JTkxJTkUgdm9pZCByZWR1Y2UoY29uc3QgT3V0VCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dFQqIGFjY3VtKSBjb25zdCB7Ci0gICAgKmFjY3VtIHw9IHg7Ci0gIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSB2b2lkIHJlZHVjZShjb25zdCBPdXRUIHgsIE91dFQqIGFjY3VtKSBjb25zdCB7ICphY2N1bSB8PSB4OyB9CiAKLSAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBPdXRUIGluaXRpYWxpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIE91dFQoMCk7Ci0gIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBPdXRUIGluaXRpYWxpemUoKSBjb25zdCB7IHJldHVybiBPdXRUKDApOyB9CiAKLSAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBPdXRUIGZpbmFsaXplKGNvbnN0IE91dFQgYWNjdW0pIGNvbnN0IHsKLSAgICByZXR1cm4gYWNjdW07Ci0gIH0KKyAgRUlHRU5fREVWSUNFX0ZVTkMgRUlHRU5fU1RST05HX0lOTElORSBPdXRUIGZpbmFsaXplKGNvbnN0IE91dFQgYWNjdW0pIGNvbnN0IHsgcmV0dXJuIGFjY3VtOyB9CiB9OwogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEFjY3VtVHlwZSwgaW50IERhdGFMYXlvdXQsCi0gICAgICAgICAgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9mdWxsX3JlZHVjdGlvbnNfY3VzdG9tX3N5Y2woCi0gICAgY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEFjY3VtVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KK3N0YXRpYyB2b2lkIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX2N1c3RvbV9zeWNsKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBjb25zdGV4cHIgSW5kZXhUeXBlIEluU2l6ZSA9IDY0OwogICBhdXRvIHRlbnNvclJhbmdlID0gU2l6ZXM8SW5TaXplPihJblNpemUpOwogICBFaWdlbjo6SW5kZXhMaXN0PEVpZ2VuOjp0eXBlMmluZGV4PDA+PiBkaW1zOwpAQCAtOTEwLDIwICs3NzgsMTUgQEAKICAgaW5fZml4LnNldFJhbmRvbSgpOwogCiAgIHNpemVfdCBpbl9zaXplX2J5dGVzID0gaW5fZml4LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluX3NpemVfYnl0ZXMpKTsKLSAgQWNjdW1UeXBlKiBncHVfb3V0X2RhdGEgPQotICAgICAgc3RhdGljX2Nhc3Q8QWNjdW1UeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoc2l6ZW9mKEFjY3VtVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbl9zaXplX2J5dGVzKSk7CisgIEFjY3VtVHlwZSogZ3B1X291dF9kYXRhID0gc3RhdGljX2Nhc3Q8QWNjdW1UeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoc2l6ZW9mKEFjY3VtVHlwZSkpKTsKIAotICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPERhdGFUeXBlLCBTaXplczxJblNpemU+LCBEYXRhTGF5b3V0Pj4gaW5fZ3B1X2ZpeCgKLSAgICAgIGdwdV9pbl9kYXRhLCB0ZW5zb3JSYW5nZSk7Ci0gIFRlbnNvck1hcDxUZW5zb3JGaXhlZFNpemU8QWNjdW1UeXBlLCBTaXplczw+LCBEYXRhTGF5b3V0Pj4gb3V0X2dwdV9maXgoCi0gICAgICBncHVfb3V0X2RhdGEsIHJlZHVjZWRfdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPERhdGFUeXBlLCBTaXplczxJblNpemU+LCBEYXRhTGF5b3V0Pj4gaW5fZ3B1X2ZpeChncHVfaW5fZGF0YSwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yRml4ZWRTaXplPEFjY3VtVHlwZSwgU2l6ZXM8PiwgRGF0YUxheW91dD4+IG91dF9ncHVfZml4KGdwdV9vdXRfZGF0YSwgcmVkdWNlZF90ZW5zb3JSYW5nZSk7CiAKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbl9maXguZGF0YSgpLCBpbl9zaXplX2J5dGVzKTsKICAgb3V0X2dwdV9maXguZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGluX2dwdV9maXgucmVkdWNlKGRpbXMsIHJlZHVjZXIpOwotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmVkdXhfZ3B1X2ZpeC5kYXRhKCksIGdwdV9vdXRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBY2N1bVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJlZHV4X2dwdV9maXguZGF0YSgpLCBncHVfb3V0X2RhdGEsIHNpemVvZihBY2N1bVR5cGUpKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlZHV4X2dwdV9maXgoMCksIEFjY3VtVHlwZSgwKSk7CiAKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW5fZGF0YSk7CkBAIC05NDEsNTUgKzgwNCwzOSBAQAogCiAgIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX21lYW5fc3ljbDxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKICAgdGVzdF9mdWxsX3JlZHVjdGlvbnNfbWVhbl9zeWNsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwotICB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19jdXN0b21fc3ljbDxEYXRhVHlwZSwgaW50LCBSb3dNYWpvciwgaW50NjRfdD4oCi0gICAgICBzeWNsX2RldmljZSk7Ci0gIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX2N1c3RvbV9zeWNsPERhdGFUeXBlLCBpbnQsIENvbE1ham9yLCBpbnQ2NF90PigKLSAgICAgIHN5Y2xfZGV2aWNlKTsKKyAgdGVzdF9mdWxsX3JlZHVjdGlvbnNfY3VzdG9tX3N5Y2w8RGF0YVR5cGUsIGludCwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKKyAgdGVzdF9mdWxsX3JlZHVjdGlvbnNfY3VzdG9tX3N5Y2w8RGF0YVR5cGUsIGludCwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKICAgc3ljbF9kZXZpY2Uuc3luY2hyb25pemUoKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBEZXY+CiB2b2lkIHN5Y2xfcmVkdWN0aW9uX2Z1bGxfb2Zmc2V0X3Blcl9kZXZpY2UoY29uc3QgRGV2JiBzeWNsX2RldmljZSkgewotICB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19zdW1fd2l0aF9vZmZzZXRfc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KAotICAgICAgc3ljbF9kZXZpY2UpOwotICB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19zdW1fd2l0aF9vZmZzZXRfc3ljbDxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KAotICAgICAgc3ljbF9kZXZpY2UpOwotICB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19taW5fd2l0aF9vZmZzZXRfc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KAotICAgICAgc3ljbF9kZXZpY2UpOwotICB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19taW5fd2l0aF9vZmZzZXRfc3ljbDxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KAotICAgICAgc3ljbF9kZXZpY2UpOwotICB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19tYXhfd2l0aF9vZmZzZXRfc3ljbDxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KAotICAgICAgc3ljbF9kZXZpY2UpOwotICB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19tYXhfd2l0aF9vZmZzZXRfc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KAotICAgICAgc3ljbF9kZXZpY2UpOwotICB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19tZWFuX3dpdGhfb2Zmc2V0X3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PigKLSAgICAgIHN5Y2xfZGV2aWNlKTsKLSAgdGVzdF9mdWxsX3JlZHVjdGlvbnNfbWVhbl93aXRoX29mZnNldF9zeWNsPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oCi0gICAgICBzeWNsX2RldmljZSk7Ci0gIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX21lYW5fd2l0aF9vZGRfb2Zmc2V0X3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PigKLSAgICAgIHN5Y2xfZGV2aWNlKTsKKyAgdGVzdF9mdWxsX3JlZHVjdGlvbnNfc3VtX3dpdGhfb2Zmc2V0X3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CisgIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX3N1bV93aXRoX29mZnNldF9zeWNsPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOworICB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19taW5fd2l0aF9vZmZzZXRfc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKKyAgdGVzdF9mdWxsX3JlZHVjdGlvbnNfbWluX3dpdGhfb2Zmc2V0X3N5Y2w8RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CisgIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX21heF93aXRoX29mZnNldF9zeWNsPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOworICB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19tYXhfd2l0aF9vZmZzZXRfc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKKyAgdGVzdF9mdWxsX3JlZHVjdGlvbnNfbWVhbl93aXRoX29mZnNldF9zeWNsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOworICB0ZXN0X2Z1bGxfcmVkdWN0aW9uc19tZWFuX3dpdGhfb2Zmc2V0X3N5Y2w8RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CisgIHRlc3RfZnVsbF9yZWR1Y3Rpb25zX21lYW5fd2l0aF9vZGRfb2Zmc2V0X3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CiAgIHN5Y2xfZGV2aWNlLnN5bmNocm9uaXplKCk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgRGV2Pgogdm9pZCBzeWNsX3JlZHVjdGlvbl90ZXN0X2ZpcnN0X2RpbV9wZXJfZGV2aWNlKGNvbnN0IERldiYgc3ljbF9kZXZpY2UpIHsKLSAgdGVzdF9maXJzdF9kaW1fcmVkdWN0aW9uc19zdW1fc3ljbDxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDE5NywgNDA5Nyk7Ci0gIHRlc3RfZmlyc3RfZGltX3JlZHVjdGlvbnNfc3VtX3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxOTcsIDQwOTcpOwotICB0ZXN0X2ZpcnN0X2RpbV9yZWR1Y3Rpb25zX3N1bV9zeWNsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjksIDgpOworICB0ZXN0X2ZpcnN0X2RpbV9yZWR1Y3Rpb25zX3N1bV9zeWNsPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UsIDQxOTcsIDQwOTcpOworICB0ZXN0X2ZpcnN0X2RpbV9yZWR1Y3Rpb25zX3N1bV9zeWNsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UsIDQxOTcsIDQwOTcpOworICB0ZXN0X2ZpcnN0X2RpbV9yZWR1Y3Rpb25zX3N1bV9zeWNsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UsIDEyOSwgOCk7CiAgIHRlc3RfZmlyc3RfZGltX3JlZHVjdGlvbnNfbWF4X3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7Ci0gIHRlc3RfZmlyc3RfZGltX3JlZHVjdGlvbnNfbWF4X3dpdGhfb2Zmc2V0X3N5Y2w8RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PigKLSAgICAgIHN5Y2xfZGV2aWNlKTsKKyAgdGVzdF9maXJzdF9kaW1fcmVkdWN0aW9uc19tYXhfd2l0aF9vZmZzZXRfc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKICAgc3ljbF9kZXZpY2Uuc3luY2hyb25pemUoKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBEZXY+CiB2b2lkIHN5Y2xfcmVkdWN0aW9uX3Rlc3RfbGFzdF9kaW1fcGVyX2RldmljZShjb25zdCBEZXYmIHN5Y2xfZGV2aWNlKSB7CiAgIHRlc3RfbGFzdF9kaW1fcmVkdWN0aW9uc19zdW1fc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKLSAgdGVzdF9sYXN0X2RpbV9yZWR1Y3Rpb25zX21heF93aXRoX29mZnNldF9zeWNsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oCi0gICAgICBzeWNsX2RldmljZSk7CisgIHRlc3RfbGFzdF9kaW1fcmVkdWN0aW9uc19tYXhfd2l0aF9vZmZzZXRfc3ljbDxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKICAgdGVzdF9sYXN0X3JlZHVjdGlvbnNfc3VtX3N5Y2w8RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CiAgIHRlc3RfbGFzdF9yZWR1Y3Rpb25zX3N1bV9zeWNsPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogICB0ZXN0X2xhc3RfcmVkdWN0aW9uc19tZWFuX3N5Y2w8RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CkBAIC05OTksMTUgKzg0NiwxMiBAQAogCiBFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3JlZHVjdGlvbl9zeWNsKSB7CiAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogRWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKLSAgICBzdGQ6OmNvdXQgPDwgIlJ1bm5pbmcgb24gIgotICAgICAgICAgICAgICA8PCBkZXZpY2UudGVtcGxhdGUgZ2V0X2luZm88Y2w6OnN5Y2w6OmluZm86OmRldmljZTo6bmFtZT4oKQotICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8ICJSdW5uaW5nIG9uICIgPDwgZGV2aWNlLnRlbXBsYXRlIGdldF9pbmZvPGNsOjpzeWNsOjppbmZvOjpkZXZpY2U6Om5hbWU+KCkgPDwgc3RkOjplbmRsOwogICAgIFF1ZXVlSW50ZXJmYWNlIHF1ZXVlSW50ZXJmYWNlKGRldmljZSk7CiAgICAgYXV0byBzeWNsX2RldmljZSA9IEVpZ2VuOjpTeWNsRGV2aWNlKCZxdWV1ZUludGVyZmFjZSk7CiAgICAgQ0FMTF9TVUJURVNUXzEoc3ljbF9yZWR1Y3Rpb25fdGVzdF9mdWxsX3Blcl9kZXZpY2U8ZmxvYXQ+KHN5Y2xfZGV2aWNlKSk7CiAgICAgQ0FMTF9TVUJURVNUXzIoc3ljbF9yZWR1Y3Rpb25fZnVsbF9vZmZzZXRfcGVyX2RldmljZTxmbG9hdD4oc3ljbF9kZXZpY2UpKTsKLSAgICBDQUxMX1NVQlRFU1RfMygKLSAgICAgICAgc3ljbF9yZWR1Y3Rpb25fdGVzdF9maXJzdF9kaW1fcGVyX2RldmljZTxmbG9hdD4oc3ljbF9kZXZpY2UpKTsKKyAgICBDQUxMX1NVQlRFU1RfMyhzeWNsX3JlZHVjdGlvbl90ZXN0X2ZpcnN0X2RpbV9wZXJfZGV2aWNlPGZsb2F0PihzeWNsX2RldmljZSkpOwogICAgIENBTExfU1VCVEVTVF80KHN5Y2xfcmVkdWN0aW9uX3Rlc3RfbGFzdF9kaW1fcGVyX2RldmljZTxmbG9hdD4oc3ljbF9kZXZpY2UpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmVmLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JlZi5jcHAKaW5kZXggN2RiZDA0Ny4uZDVmZjE5NiAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmVmLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZWYuY3BwCkBAIC0xMSwxMSArMTEsMTAgQEAKIAogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KIAotdXNpbmcgRWlnZW46OlRlbnNvcjsKIHVzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2x2YWx1ZV9yZWYoKQoteworc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfbHZhbHVlX3JlZigpIHsKICAgVGVuc29yPGludCwgMT4gaW5wdXQoNik7CiAgIGlucHV0LnNldFJhbmRvbSgpOwogCkBAIC00MCwxMyArMzksMTEgQEAKICAgICByZWY0LmNvZWZmUmVmKGkpID0gLWkgKiAyOwogICB9CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7Ci0gICAgVkVSSUZZX0lTX0VRVUFMKGlucHV0KGkpLCAtaSoyKTsKKyAgICBWRVJJRllfSVNfRVFVQUwoaW5wdXQoaSksIC1pICogMik7CiAgIH0KIH0KIAotCi1zdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9ydmFsdWVfcmVmKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3J2YWx1ZV9yZWYoKSB7CiAgIFRlbnNvcjxpbnQsIDE+IGlucHV0MSg2KTsKICAgaW5wdXQxLnNldFJhbmRvbSgpOwogICBUZW5zb3I8aW50LCAxPiBpbnB1dDIoNik7CkBAIC02NiwxMCArNjMsOCBAQAogICB9CiB9CiAKLQotc3RhdGljIHZvaWQgdGVzdF9tdWx0aXBsZV9kaW1zKCkKLXsKLSAgVGVuc29yPGZsb2F0LCAzPiBpbnB1dCgzLDUsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX2RpbXMoKSB7CisgIFRlbnNvcjxmbG9hdCwgMz4gaW5wdXQoMywgNSwgNyk7CiAgIGlucHV0LnNldFJhbmRvbSgpOwogCiAgIFRlbnNvclJlZjxUZW5zb3I8ZmxvYXQsIDM+PiByZWYoaW5wdXQpOwpAQCAtODEsNDQgKzc2LDQwIEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChyZWYoaSxqLGspLCBpbnB1dChpLGosaykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVmKGksIGosIGspLCBpbnB1dChpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLQotc3RhdGljIHZvaWQgdGVzdF9zbGljZSgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNT4gdGVuc29yKDIsMyw1LDcsMTEpOworc3RhdGljIHZvaWQgdGVzdF9zbGljZSgpIHsKKyAgVGVuc29yPGZsb2F0LCA1PiB0ZW5zb3IoMiwgMywgNSwgNywgMTEpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAKLSAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDU+IGluZGljZXMoMSwyLDMsNCw1KTsKLSAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDU+IHNpemVzKDEsMSwxLDEsMSk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA1PiBpbmRpY2VzKDEsIDIsIDMsIDQsIDUpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgNT4gc2l6ZXMoMSwgMSwgMSwgMSwgMSk7CiAgIFRlbnNvclJlZjxUZW5zb3I8ZmxvYXQsIDU+PiBzbGljZSA9IHRlbnNvci5zbGljZShpbmRpY2VzLCBzaXplcyk7Ci0gIFZFUklGWV9JU19FUVVBTChzbGljZSgwLDAsMCwwLDApLCB0ZW5zb3IoMSwyLDMsNCw1KSk7CisgIFZFUklGWV9JU19FUVVBTChzbGljZSgwLCAwLCAwLCAwLCAwKSwgdGVuc29yKDEsIDIsIDMsIDQsIDUpKTsKIAotICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgNT4gaW5kaWNlczIoMSwxLDMsNCw1KTsKLSAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDU+IHNpemVzMigxLDEsMiwyLDMpOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgNT4gaW5kaWNlczIoMSwgMSwgMywgNCwgNSk7CisgIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA1PiBzaXplczIoMSwgMSwgMiwgMiwgMyk7CiAgIHNsaWNlID0gdGVuc29yLnNsaWNlKGluZGljZXMyLCBzaXplczIpOwogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMjsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDM7ICsraykgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UoMCwwLGksaixrKSwgdGVuc29yKDEsMSwzK2ksNCtqLDUraykpOworICAgICAgICBWRVJJRllfSVNfRVFVQUwoc2xpY2UoMCwgMCwgaSwgaiwgayksIHRlbnNvcigxLCAxLCAzICsgaSwgNCArIGosIDUgKyBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDU+IGluZGljZXMzKDAsMCwwLDAsMCk7Ci0gIEVpZ2VuOjpEU2l6ZXM8cHRyZGlmZl90LCA1PiBzaXplczMoMiwzLDEsMSwxKTsKKyAgRWlnZW46OkRTaXplczxwdHJkaWZmX3QsIDU+IGluZGljZXMzKDAsIDAsIDAsIDAsIDApOworICBFaWdlbjo6RFNpemVzPHB0cmRpZmZfdCwgNT4gc2l6ZXMzKDIsIDMsIDEsIDEsIDEpOwogICBzbGljZSA9IHRlbnNvci5zbGljZShpbmRpY2VzMywgc2l6ZXMzKTsKICAgVkVSSUZZX0lTX0VRVUFMKHNsaWNlLmRhdGEoKSwgdGVuc29yLmRhdGEoKSk7CiB9CiAKLQotc3RhdGljIHZvaWQgdGVzdF9yZWZfb2ZfcmVmKCkKLXsKLSAgVGVuc29yPGZsb2F0LCAzPiBpbnB1dCgzLDUsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X3JlZl9vZl9yZWYoKSB7CisgIFRlbnNvcjxmbG9hdCwgMz4gaW5wdXQoMywgNSwgNyk7CiAgIGlucHV0LnNldFJhbmRvbSgpOwogCiAgIFRlbnNvclJlZjxUZW5zb3I8ZmxvYXQsIDM+PiByZWYoaW5wdXQpOwpAQCAtMTM5LDMzICsxMzAsMzEgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA3OyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlZl9vZl9yZWYoaSxqLGspLCBpbnB1dChpLGosaykpOwotICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVmX29mX3JlZjIoaSxqLGspLCBpbnB1dChpLGosaykpOwotICAgICB9CisgICAgICAgIFZFUklGWV9JU19FUVVBTChyZWZfb2ZfcmVmKGksIGosIGspLCBpbnB1dChpLCBqLCBrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChyZWZfb2ZfcmVmMihpLCBqLCBrKSwgaW5wdXQoaSwgaiwgaykpOworICAgICAgfQogICAgIH0KICAgfQogfQogCi0KLXN0YXRpYyB2b2lkIHRlc3RfcmVmX2luX2V4cHIoKQotewotICBUZW5zb3I8ZmxvYXQsIDM+IGlucHV0KDMsNSw3KTsKK3N0YXRpYyB2b2lkIHRlc3RfcmVmX2luX2V4cHIoKSB7CisgIFRlbnNvcjxmbG9hdCwgMz4gaW5wdXQoMywgNSwgNyk7CiAgIGlucHV0LnNldFJhbmRvbSgpOwogICBUZW5zb3JSZWY8VGVuc29yPGZsb2F0LCAzPj4gaW5wdXRfcmVmKGlucHV0KTsKIAotICBUZW5zb3I8ZmxvYXQsIDM+IHJlc3VsdCgzLDUsNyk7CisgIFRlbnNvcjxmbG9hdCwgMz4gcmVzdWx0KDMsIDUsIDcpOwogICByZXN1bHQuc2V0UmFuZG9tKCk7CiAgIFRlbnNvclJlZjxUZW5zb3I8ZmxvYXQsIDM+PiByZXN1bHRfcmVmKHJlc3VsdCk7CiAKLSAgVGVuc29yPGZsb2F0LCAzPiBiaWFzKDMsNSw3KTsKKyAgVGVuc29yPGZsb2F0LCAzPiBiaWFzKDMsIDUsIDcpOwogICBiaWFzLnNldFJhbmRvbSgpOwogCiAgIHJlc3VsdF9yZWYgPSBpbnB1dF9yZWYgKyBiaWFzOwogICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewotICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0X3JlZihpLGosayksIGlucHV0KGksaixrKSArIGJpYXMoaSxqLGspKTsKLSAgICAgICAgVkVSSUZZX0lTX05PVF9FUVVBTChyZXN1bHQoaSxqLGspLCBpbnB1dChpLGosaykgKyBiaWFzKGksaixrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHRfcmVmKGksIGosIGspLCBpbnB1dChpLCBqLCBrKSArIGJpYXMoaSwgaiwgaykpOworICAgICAgICBWRVJJRllfSVNfTk9UX0VRVUFMKHJlc3VsdChpLCBqLCBrKSwgaW5wdXQoaSwgaiwgaykgKyBiaWFzKGksIGosIGspKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTE3NCwxNiArMTYzLDE0IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSxqLGspLCBpbnB1dChpLGosaykgKyBiaWFzKGksaixrKSk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiwgayksIGlucHV0KGksIGosIGspICsgYmlhcyhpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLQotc3RhdGljIHZvaWQgdGVzdF9jb2VmZl9yZWYoKQotewotICBUZW5zb3I8ZmxvYXQsIDU+IHRlbnNvcigyLDMsNSw3LDExKTsKK3N0YXRpYyB2b2lkIHRlc3RfY29lZmZfcmVmKCkgeworICBUZW5zb3I8ZmxvYXQsIDU+IHRlbnNvcigyLCAzLCA1LCA3LCAxMSk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKICAgVGVuc29yPGZsb2F0LCA1PiBvcmlnaW5hbCA9IHRlbnNvcjsKIApAQCAtMTkxLDQyICsxNzgsNDAgQEAKICAgc2xpY2UuY29lZmZSZWYoMCwgMCwgMCwgMCkgPSAxLjBmOwogICBzbGljZS5jb2VmZlJlZigxLCAwLCAwLCAwKSArPSAyLjBmOwogCi0gIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoMCwwLDAsMCw3KSwgMS4wZik7Ci0gIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoMSwwLDAsMCw3KSwgb3JpZ2luYWwoMSwwLDAsMCw3KSArIDIuMGYpOworICBWRVJJRllfSVNfRVFVQUwodGVuc29yKDAsIDAsIDAsIDAsIDcpLCAxLjBmKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcigxLCAwLCAwLCAwLCA3KSwgb3JpZ2luYWwoMSwgMCwgMCwgMCwgNykgKyAyLjBmKTsKIH0KIAotCi1zdGF0aWMgdm9pZCB0ZXN0X25lc3RlZF9vcHNfd2l0aF9yZWYoKQoteworc3RhdGljIHZvaWQgdGVzdF9uZXN0ZWRfb3BzX3dpdGhfcmVmKCkgewogICBUZW5zb3I8ZmxvYXQsIDQ+IHQoMiwgMywgNSwgNyk7CiAgIHQuc2V0UmFuZG9tKCk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgZmxvYXQsIDQ+ID4gbSh0LmRhdGEoKSwgMiwgMywgNSwgNyk7CisgIFRlbnNvck1hcDxUZW5zb3I8Y29uc3QgZmxvYXQsIDQ+PiBtKHQuZGF0YSgpLCAyLCAzLCA1LCA3KTsKICAgYXJyYXk8c3RkOjpwYWlyPHB0cmRpZmZfdCwgcHRyZGlmZl90PiwgND4gcGFkZGluZ3M7CiAgIHBhZGRpbmdzWzBdID0gc3RkOjptYWtlX3BhaXIoMCwgMCk7CiAgIHBhZGRpbmdzWzFdID0gc3RkOjptYWtlX3BhaXIoMiwgMSk7CiAgIHBhZGRpbmdzWzJdID0gc3RkOjptYWtlX3BhaXIoMywgNCk7CiAgIHBhZGRpbmdzWzNdID0gc3RkOjptYWtlX3BhaXIoMCwgMCk7CiAgIERTaXplczxFaWdlbjo6RGVuc2VJbmRleCwgND4gc2h1ZmZsZV9kaW1zKDAsIDEsIDIsIDMpOwotICBUZW5zb3JSZWY8VGVuc29yPGNvbnN0IGZsb2F0LCA0PiA+IHJlZihtLnBhZChwYWRkaW5ncykpOworICBUZW5zb3JSZWY8VGVuc29yPGNvbnN0IGZsb2F0LCA0Pj4gcmVmKG0ucGFkKHBhZGRpbmdzKSk7CiAgIGFycmF5PHN0ZDo6cGFpcjxwdHJkaWZmX3QsIHB0cmRpZmZfdD4sIDQ+IHRyaXZpYWw7CiAgIHRyaXZpYWxbMF0gPSBzdGQ6Om1ha2VfcGFpcigwLCAwKTsKICAgdHJpdmlhbFsxXSA9IHN0ZDo6bWFrZV9wYWlyKDAsIDApOwogICB0cml2aWFsWzJdID0gc3RkOjptYWtlX3BhaXIoMCwgMCk7CiAgIHRyaXZpYWxbM10gPSBzdGQ6Om1ha2VfcGFpcigwLCAwKTsKICAgVGVuc29yPGZsb2F0LCA0PiBwYWRkZWQgPSByZWYuc2h1ZmZsZShzaHVmZmxlX2RpbXMpLnBhZCh0cml2aWFsKTsKLSAgVkVSSUZZX0lTX0VRVUFMKHBhZGRlZC5kaW1lbnNpb24oMCksIDIrMCk7Ci0gIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDEpLCAzKzMpOwotICBWRVJJRllfSVNfRVFVQUwocGFkZGVkLmRpbWVuc2lvbigyKSwgNSs3KTsKLSAgVkVSSUZZX0lTX0VRVUFMKHBhZGRlZC5kaW1lbnNpb24oMyksIDcrMCk7CisgIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDApLCAyICsgMCk7CisgIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDEpLCAzICsgMyk7CisgIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDIpLCA1ICsgNyk7CisgIFZFUklGWV9JU19FUVVBTChwYWRkZWQuZGltZW5zaW9uKDMpLCA3ICsgMCk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDY7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAxMjsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7CiAgICAgICAgICAgaWYgKGogPj0gMiAmJiBqIDwgNSAmJiBrID49IDMgJiYgayA8IDgpIHsKLSAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChwYWRkZWQoaSxqLGssbCksIHQoaSxqLTIsay0zLGwpKTsKKyAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChwYWRkZWQoaSwgaiwgaywgbCksIHQoaSwgaiAtIDIsIGsgLSAzLCBsKSk7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFZFUklGWV9JU19FUVVBTChwYWRkZWQoaSxqLGssbCksIDAuMGYpOworICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHBhZGRlZChpLCBqLCBrLCBsKSwgMC4wZik7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CkBAIC0yMzQsOSArMjE5LDcgQEAKICAgfQogfQogCi0KLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfcmVmKQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9yZWYpIHsKICAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX2x2YWx1ZV9yZWYoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9ydmFsdWVfcmVmKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9tdWx0aXBsZV9kaW1zKCkpOwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmV2ZXJzZS5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZXZlcnNlLmNwcAppbmRleCA1ZTQ0ZWMwLi4xNTBjNzFiIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZXZlcnNlLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZXZlcnNlLmNwcApAQCAtMTIsMTMgKzEyLDEyIEBACiAKICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CiAKLXVzaW5nIEVpZ2VuOjpUZW5zb3I7CiB1c2luZyBFaWdlbjo6YXJyYXk7Cit1c2luZyBFaWdlbjo6VGVuc29yOwogCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9yZXZlcnNlKCkKLXsKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9yZXZlcnNlKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogCiAgIGFycmF5PGJvb2wsIDQ+IGRpbV9yZXY7CkBAIC0zOSw3ICszOCw3IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgcmV2ZXJzZWRfdGVuc29yKGksMi1qLDQtayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsKSwgcmV2ZXJzZWRfdGVuc29yKGksIDIgLSBqLCA0IC0gaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNTcsMTIgKzU2LDExIEBACiAgIFZFUklGWV9JU19FUVVBTChyZXZlcnNlZF90ZW5zb3IuZGltZW5zaW9uKDIpLCA1KTsKICAgVkVSSUZZX0lTX0VRVUFMKHJldmVyc2VkX3RlbnNvci5kaW1lbnNpb24oMyksIDcpOwogCi0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwpLCByZXZlcnNlZF90ZW5zb3IoMS1pLGosayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsKSwgcmV2ZXJzZWRfdGVuc29yKDEgLSBpLCBqLCBrLCBsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC04MCwyMyArNzgsMjAgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHJldmVyc2VkX3RlbnNvci5kaW1lbnNpb24oMiksIDUpOwogICBWRVJJRllfSVNfRVFVQUwocmV2ZXJzZWRfdGVuc29yLmRpbWVuc2lvbigzKSwgNyk7CiAKLQogICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCksIHJldmVyc2VkX3RlbnNvcigxLWksaixrLDYtbCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCksIHJldmVyc2VkX3RlbnNvcigxIC0gaSwgaiwgaywgNiAtIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogfQogCi0KIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfZXhwcl9yZXZlcnNlKGJvb2wgTFZhbHVlKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKK3N0YXRpYyB2b2lkIHRlc3RfZXhwcl9yZXZlcnNlKGJvb2wgTFZhbHVlKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMsIDUsIDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAKICAgYXJyYXk8Ym9vbCwgND4gZGltX3JldjsKQEAgLTExMiw3ICsxMDcsNyBAQAogICAgIGV4cGVjdGVkID0gdGVuc29yLnJldmVyc2UoZGltX3Jldik7CiAgIH0KIAotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHJlc3VsdCgyLDMsNSw3KTsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiByZXN1bHQoMiwgMywgNSwgNyk7CiAKICAgYXJyYXk8cHRyZGlmZl90LCA0PiBzcmNfc2xpY2VfZGltOwogICBzcmNfc2xpY2VfZGltWzBdID0gMjsKQEAgLTEyOSwxMSArMTI0LDkgQEAKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewogICAgIGlmIChMVmFsdWUpIHsKLSAgICAgIHJlc3VsdC5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pLnJldmVyc2UoZGltX3JldikgPQotICAgICAgICAgIHRlbnNvci5zbGljZShzcmNfc2xpY2Vfc3RhcnQsIHNyY19zbGljZV9kaW0pOworICAgICAgcmVzdWx0LnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSkucmV2ZXJzZShkaW1fcmV2KSA9IHRlbnNvci5zbGljZShzcmNfc2xpY2Vfc3RhcnQsIHNyY19zbGljZV9kaW0pOwogICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQuc2xpY2UoZHN0X3NsaWNlX3N0YXJ0LCBkc3Rfc2xpY2VfZGltKSA9Ci0gICAgICAgICAgdGVuc29yLnNsaWNlKHNyY19zbGljZV9zdGFydCwgc3JjX3NsaWNlX2RpbSkucmV2ZXJzZShkaW1fcmV2KTsKKyAgICAgIHJlc3VsdC5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pID0gdGVuc29yLnNsaWNlKHNyY19zbGljZV9zdGFydCwgc3JjX3NsaWNlX2RpbSkucmV2ZXJzZShkaW1fcmV2KTsKICAgICB9CiAgICAgc3JjX3NsaWNlX3N0YXJ0WzJdICs9IDE7CiAgICAgZHN0X3NsaWNlX3N0YXJ0WzJdICs9IDE7CkBAIC0xNDgsNyArMTQxLDcgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkLmRpbWVuc2lvbigxKTsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGV4cGVjdGVkLmRpbWVuc2lvbigyKTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgZXhwZWN0ZWQuZGltZW5zaW9uKDMpOyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksaixrLGwpLCBleHBlY3RlZChpLGosayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLCBqLCBrLCBsKSwgZXhwZWN0ZWQoaSwgaiwgaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMTU3LDEzICsxNTAsMTEgQEAKICAgZHN0X3NsaWNlX3N0YXJ0WzJdID0gMDsKICAgcmVzdWx0LnNldFJhbmRvbSgpOwogICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewotICAgICBpZiAoTFZhbHVlKSB7Ci0gICAgICAgcmVzdWx0LnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSkucmV2ZXJzZShkaW1fcmV2KSA9Ci0gICAgICAgICAgIHRlbnNvci5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pOwotICAgICB9IGVsc2UgewotICAgICAgIHJlc3VsdC5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pID0KLSAgICAgICAgICAgdGVuc29yLnJldmVyc2UoZGltX3Jldikuc2xpY2UoZHN0X3NsaWNlX3N0YXJ0LCBkc3Rfc2xpY2VfZGltKTsKLSAgICAgfQorICAgIGlmIChMVmFsdWUpIHsKKyAgICAgIHJlc3VsdC5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pLnJldmVyc2UoZGltX3JldikgPSB0ZW5zb3Iuc2xpY2UoZHN0X3NsaWNlX3N0YXJ0LCBkc3Rfc2xpY2VfZGltKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0LnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSkgPSB0ZW5zb3IucmV2ZXJzZShkaW1fcmV2KS5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pOworICAgIH0KICAgICBkc3Rfc2xpY2Vfc3RhcnRbMl0gKz0gMTsKICAgfQogCkBAIC0xNzEsMTYgKzE2MiwxNCBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWQuZGltZW5zaW9uKDEpOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZXhwZWN0ZWQuZGltZW5zaW9uKDIpOyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBleHBlY3RlZC5kaW1lbnNpb24oMyk7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSxqLGssbCksIGV4cGVjdGVkKGksaixrLGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksIGosIGssIGwpLCBleHBlY3RlZChpLCBqLCBrLCBsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3JldmVyc2UpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3JldmVyc2UpIHsKICAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX3JldmVyc2U8Q29sTWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfcmV2ZXJzZTxSb3dNYWpvcj4oKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2V4cHJfcmV2ZXJzZTxDb2xNYWpvcj4odHJ1ZSkpOwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmV2ZXJzZV9zeWNsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JldmVyc2Vfc3ljbC5jcHAKaW5kZXggNWVkMDA3Zi4uYzljNjE3MiAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfcmV2ZXJzZV9zeWNsLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yZXZlcnNlX3N5Y2wuY3BwCkBAIC0zOCwzMCArMzgsMjQgQEAKICAgZGltX3JldlsyXSA9IHRydWU7CiAgIGRpbV9yZXZbM10gPSBmYWxzZTsKIAotICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KAotICAgICAgc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoCi0gICAgICByZXZlcnNlZF90ZW5zb3IuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3IuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X291dF9kYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocmV2ZXJzZWRfdGVuc29yLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKIAotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gaW5fZ3B1KGdwdV9pbl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbnNvclJhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiA+IG91dF9ncHUoZ3B1X291dF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiBpbl9ncHUoZ3B1X2luX2RhdGEsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiA+IG91dF9ncHUoZ3B1X291dF9kYXRhLCB0ZW5zb3JSYW5nZSk7CiAKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKAotICAgICAgZ3B1X2luX2RhdGEsIHRlbnNvci5kYXRhKCksCi0gICAgICAodGVuc29yLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCB0ZW5zb3IuZGF0YSgpLCAodGVuc29yLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgb3V0X2dwdS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1LnJldmVyc2UoZGltX3Jldik7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCgKLSAgICAgIHJldmVyc2VkX3RlbnNvci5kYXRhKCksIGdwdV9vdXRfZGF0YSwKLSAgICAgIHJldmVyc2VkX3RlbnNvci5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJldmVyc2VkX3RlbnNvci5kYXRhKCksIGdwdV9vdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VkX3RlbnNvci5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgLy8gQ2hlY2sgdGhhdCB0aGUgQ1BVIGFuZCBHUFUgcmVkdWN0aW9ucyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0LgogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IDU7ICsraykgewogICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VkX3RlbnNvcihpLCAyIC0gaiwgNCAtIGssIGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwpLCByZXZlcnNlZF90ZW5zb3IoaSwgMiAtIGosIDQgLSBrLCBsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC03Miw5ICs2Niw4IEBACiAgIGRpbV9yZXZbM10gPSBmYWxzZTsKIAogICBvdXRfZ3B1LmRldmljZShzeWNsX2RldmljZSkgPSBpbl9ncHUucmV2ZXJzZShkaW1fcmV2KTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KAotICAgICAgcmV2ZXJzZWRfdGVuc29yLmRhdGEoKSwgZ3B1X291dF9kYXRhLAotICAgICAgcmV2ZXJzZWRfdGVuc29yLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmV2ZXJzZWRfdGVuc29yLmRhdGEoKSwgZ3B1X291dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZWRfdGVuc29yLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCAzOyArK2opIHsKQEAgLTkxLDE2ICs4NCwxNCBAQAogICBkaW1fcmV2WzJdID0gZmFsc2U7CiAgIGRpbV9yZXZbM10gPSB0cnVlOwogICBvdXRfZ3B1LmRldmljZShzeWNsX2RldmljZSkgPSBpbl9ncHUucmV2ZXJzZShkaW1fcmV2KTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KAotICAgICAgcmV2ZXJzZWRfdGVuc29yLmRhdGEoKSwgZ3B1X291dF9kYXRhLAotICAgICAgcmV2ZXJzZWRfdGVuc29yLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QocmV2ZXJzZWRfdGVuc29yLmRhdGEoKSwgZ3B1X291dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZWRfdGVuc29yLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgIGZvciAoSW5kZXhUeXBlIGwgPSAwOyBsIDwgNzsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZWRfdGVuc29yKDEgLSBpLCBqLCBrLCA2IC0gbCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCksIHJldmVyc2VkX3RlbnNvcigxIC0gaSwgaiwgaywgNiAtIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTExMSw4ICsxMDIsNyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X2V4cHJfcmV2ZXJzZShjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExWYWx1ZSkgeworc3RhdGljIHZvaWQgdGVzdF9leHByX3JldmVyc2UoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlLCBib29sIExWYWx1ZSkgewogICBJbmRleFR5cGUgZGltMSA9IDI7CiAgIEluZGV4VHlwZSBkaW0yID0gMzsKICAgSW5kZXhUeXBlIGRpbTMgPSA1OwpAQCAtMTMwLDMyICsxMjAsMjYgQEAKICAgZGltX3JldlsyXSA9IGZhbHNlOwogICBkaW1fcmV2WzNdID0gdHJ1ZTsKIAotICBEYXRhVHlwZSogZ3B1X2luX2RhdGEgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KAotICAgICAgc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YV9leHBlY3RlZCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoCi0gICAgICBleHBlY3RlZC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7Ci0gIERhdGFUeXBlKiBncHVfb3V0X2RhdGFfcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPigKLSAgICAgIHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHJlc3VsdC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfaW5fZGF0YSA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvci5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGFfZXhwZWN0ZWQgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShleHBlY3RlZC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfb3V0X2RhdGFfcmVzdWx0ID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocmVzdWx0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKIAotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gaW5fZ3B1KGdwdV9pbl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbnNvclJhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiA+IG91dF9ncHVfZXhwZWN0ZWQoCi0gICAgICBncHVfb3V0X2RhdGFfZXhwZWN0ZWQsIHRlbnNvclJhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiA+IG91dF9ncHVfcmVzdWx0KAotICAgICAgZ3B1X291dF9kYXRhX3Jlc3VsdCwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gaW5fZ3B1KGdwdV9pbl9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiBvdXRfZ3B1X2V4cGVjdGVkKGdwdV9vdXRfZGF0YV9leHBlY3RlZCwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gb3V0X2dwdV9yZXN1bHQoZ3B1X291dF9kYXRhX3Jlc3VsdCwgdGVuc29yUmFuZ2UpOwogCi0gIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZSgKLSAgICAgIGdwdV9pbl9kYXRhLCB0ZW5zb3IuZGF0YSgpLAotICAgICAgKHRlbnNvci5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW5fZGF0YSwgdGVuc29yLmRhdGEoKSwgKHRlbnNvci5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAKICAgaWYgKExWYWx1ZSkgewogICAgIG91dF9ncHVfZXhwZWN0ZWQucmV2ZXJzZShkaW1fcmV2KS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1OwogICB9IGVsc2UgewogICAgIG91dF9ncHVfZXhwZWN0ZWQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGluX2dwdS5yZXZlcnNlKGRpbV9yZXYpOwogICB9Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCgKLSAgICAgIGV4cGVjdGVkLmRhdGEoKSwgZ3B1X291dF9kYXRhX2V4cGVjdGVkLAotICAgICAgZXhwZWN0ZWQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChleHBlY3RlZC5kYXRhKCksIGdwdV9vdXRfZGF0YV9leHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIGFycmF5PEluZGV4VHlwZSwgND4gc3JjX3NsaWNlX2RpbTsKICAgc3JjX3NsaWNlX2RpbVswXSA9IDI7CkBAIC0xNzIsOSArMTU2LDggQEAKIAogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDU7ICsraSkgewogICAgIGlmIChMVmFsdWUpIHsKLSAgICAgIG91dF9ncHVfcmVzdWx0LnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSkKLSAgICAgICAgICAucmV2ZXJzZShkaW1fcmV2KQotICAgICAgICAgIC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1LnNsaWNlKHNyY19zbGljZV9zdGFydCwgc3JjX3NsaWNlX2RpbSk7CisgICAgICBvdXRfZ3B1X3Jlc3VsdC5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pLnJldmVyc2UoZGltX3JldikuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9CisgICAgICAgICAgaW5fZ3B1LnNsaWNlKHNyY19zbGljZV9zdGFydCwgc3JjX3NsaWNlX2RpbSk7CiAgICAgfSBlbHNlIHsKICAgICAgIG91dF9ncHVfcmVzdWx0LnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSkuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9CiAgICAgICAgICAgaW5fZ3B1LnNsaWNlKHNyY19zbGljZV9zdGFydCwgc3JjX3NsaWNlX2RpbSkucmV2ZXJzZShkaW1fcmV2KTsKQEAgLTE4Miw5ICsxNjUsOCBAQAogICAgIHNyY19zbGljZV9zdGFydFsyXSArPSAxOwogICAgIGRzdF9zbGljZV9zdGFydFsyXSArPSAxOwogICB9Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCgKLSAgICAgIHJlc3VsdC5kYXRhKCksIGdwdV9vdXRfZGF0YV9yZXN1bHQsCi0gICAgICByZXN1bHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChyZXN1bHQuZGF0YSgpLCBncHVfb3V0X2RhdGFfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRpbWVuc2lvbnMoKS5Ub3RhbFNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpOwogCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgZXhwZWN0ZWQuZGltZW5zaW9uKDApOyArK2kpIHsKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IGV4cGVjdGVkLmRpbWVuc2lvbigxKTsgKytqKSB7CkBAIC0xOTgsMjMgKzE4MCwyMCBAQAogCiAgIGRzdF9zbGljZV9zdGFydFsyXSA9IDA7CiAgIHJlc3VsdC5zZXRSYW5kb20oKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKAotICAgICAgZ3B1X291dF9kYXRhX3Jlc3VsdCwgcmVzdWx0LmRhdGEoKSwKLSAgICAgIChyZXN1bHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X291dF9kYXRhX3Jlc3VsdCwgcmVzdWx0LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDU7ICsraSkgewogICAgIGlmIChMVmFsdWUpIHsKLSAgICAgIG91dF9ncHVfcmVzdWx0LnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSkKLSAgICAgICAgICAucmV2ZXJzZShkaW1fcmV2KQotICAgICAgICAgIC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gaW5fZ3B1LnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSk7CisgICAgICBvdXRfZ3B1X3Jlc3VsdC5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pLnJldmVyc2UoZGltX3JldikuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9CisgICAgICAgICAgaW5fZ3B1LnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSk7CiAgICAgfSBlbHNlIHsKICAgICAgIG91dF9ncHVfcmVzdWx0LnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSkuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9CiAgICAgICAgICAgaW5fZ3B1LnJldmVyc2UoZGltX3Jldikuc2xpY2UoZHN0X3NsaWNlX3N0YXJ0LCBkc3Rfc2xpY2VfZGltKTsKICAgICB9CiAgICAgZHN0X3NsaWNlX3N0YXJ0WzJdICs9IDE7CiAgIH0KLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KAotICAgICAgcmVzdWx0LmRhdGEoKSwgZ3B1X291dF9kYXRhX3Jlc3VsdCwKLSAgICAgIHJlc3VsdC5kaW1lbnNpb25zKCkuVG90YWxTaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHJlc3VsdC5kYXRhKCksIGdwdV9vdXRfZGF0YV9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZGltZW5zaW9ucygpLlRvdGFsU2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAKICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCBleHBlY3RlZC5kaW1lbnNpb24oMCk7ICsraSkgewogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgZXhwZWN0ZWQuZGltZW5zaW9uKDEpOyArK2opIHsKQEAgLTI0MCw4ICsyMTksNyBAQAogfQogRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9yZXZlcnNlX3N5Y2wpIHsKICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgewotICAgIHN0ZDo6Y291dCA8PCAiUnVubmluZyBvbiAiCi0gICAgICAgICAgICAgIDw8IGRldmljZS5nZXRfaW5mbzxjbDo6c3ljbDo6aW5mbzo6ZGV2aWNlOjpuYW1lPigpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIlJ1bm5pbmcgb24gIiA8PCBkZXZpY2UuZ2V0X2luZm88Y2w6OnN5Y2w6OmluZm86OmRldmljZTo6bmFtZT4oKSA8PCBzdGQ6OmVuZGw7CiAgICAgQ0FMTF9TVUJURVNUXzEoc3ljbF9yZXZlcnNlX3Rlc3RfcGVyX2RldmljZTxzaG9ydD4oZGV2aWNlKSk7CiAgICAgQ0FMTF9TVUJURVNUXzIoc3ljbF9yZXZlcnNlX3Rlc3RfcGVyX2RldmljZTxpbnQ+KGRldmljZSkpOwogICAgIENBTExfU1VCVEVTVF8zKHN5Y2xfcmV2ZXJzZV90ZXN0X3Blcl9kZXZpY2U8dW5zaWduZWQgaW50PihkZXZpY2UpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JvdW5kaW5ncy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9yb3VuZGluZ3MuY3BwCmluZGV4IDgzYjU5MjMuLjJjMTE4MWEgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3JvdW5kaW5ncy5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfcm91bmRpbmdzLmNwcApAQCAtMTEsNTIgKzExLDQ3IEBACiAKICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CiAKLQotc3RhdGljIHZvaWQgdGVzdF9mbG9hdF9yb3VuZGluZygpCi17Ci0gIFRlbnNvcjxmbG9hdCwgMj4gZnRlbnNvcigyMCwzMCk7CitzdGF0aWMgdm9pZCB0ZXN0X2Zsb2F0X3JvdW5kaW5nKCkgeworICBUZW5zb3I8ZmxvYXQsIDI+IGZ0ZW5zb3IoMjAsIDMwKTsKICAgZnRlbnNvciA9IGZ0ZW5zb3IucmFuZG9tKCkgKiAxMDAuZjsKIAogICBUZW5zb3I8ZmxvYXQsIDI+IHJlc3VsdCA9IGZ0ZW5zb3Iucm91bmQoKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDMwOyArK2opIHsKLSAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSxqKSwgbnVtZXh0Ojpyb3VuZChmdGVuc29yKGksaikpKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiksIG51bWV4dDo6cm91bmQoZnRlbnNvcihpLCBqKSkpOwogICAgIH0KICAgfQogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X2Zsb2F0X2Zsb29yaW5nKCkKLXsKLSAgVGVuc29yPGZsb2F0LCAyPiBmdGVuc29yKDIwLDMwKTsKK3N0YXRpYyB2b2lkIHRlc3RfZmxvYXRfZmxvb3JpbmcoKSB7CisgIFRlbnNvcjxmbG9hdCwgMj4gZnRlbnNvcigyMCwgMzApOwogICBmdGVuc29yID0gZnRlbnNvci5yYW5kb20oKSAqIDEwMC5mOwogCiAgIFRlbnNvcjxmbG9hdCwgMj4gcmVzdWx0ID0gZnRlbnNvci5mbG9vcigpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzA7ICsraikgewotICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLGopLCBudW1leHQ6OmZsb29yKGZ0ZW5zb3IoaSxqKSkpOworICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLCBqKSwgbnVtZXh0OjpmbG9vcihmdGVuc29yKGksIGopKSk7CiAgICAgfQogICB9CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfZmxvYXRfY2VpbGluZygpCi17Ci0gIFRlbnNvcjxmbG9hdCwgMj4gZnRlbnNvcigyMCwzMCk7CitzdGF0aWMgdm9pZCB0ZXN0X2Zsb2F0X2NlaWxpbmcoKSB7CisgIFRlbnNvcjxmbG9hdCwgMj4gZnRlbnNvcigyMCwgMzApOwogICBmdGVuc29yID0gZnRlbnNvci5yYW5kb20oKSAqIDEwMC5mOwogCiAgIFRlbnNvcjxmbG9hdCwgMj4gcmVzdWx0ID0gZnRlbnNvci5jZWlsKCk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzMDsgKytqKSB7Ci0gICAgICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KGksaiksIG51bWV4dDo6Y2VpbChmdGVuc29yKGksaikpKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiksIG51bWV4dDo6Y2VpbChmdGVuc29yKGksIGopKSk7CiAgICAgfQogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3Jfcm91bmRpbmdzKQotewotICAgQ0FMTF9TVUJURVNUKHRlc3RfZmxvYXRfcm91bmRpbmcoKSk7Ci0gICBDQUxMX1NVQlRFU1QodGVzdF9mbG9hdF9jZWlsaW5nKCkpOwotICAgQ0FMTF9TVUJURVNUKHRlc3RfZmxvYXRfZmxvb3JpbmcoKSk7CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3JvdW5kaW5ncykgeworICBDQUxMX1NVQlRFU1QodGVzdF9mbG9hdF9yb3VuZGluZygpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZmxvYXRfY2VpbGluZygpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3RfZmxvYXRfZmxvb3JpbmcoKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zY2FuLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NjYW4uY3BwCmluZGV4IGRjY2VlOWUuLjUwZWM2M2QgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NjYW4uY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NjYW4uY3BwCkBAIC0xNCw5ICsxNCw4IEBACiAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKLXRlbXBsYXRlIDxpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgVHlwZT1mbG9hdCwgYm9vbCBFeGNsdXNpdmUgPSBmYWxzZT4KLXN0YXRpYyB2b2lkIHRlc3RfMWRfc2NhbigpCi17Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIFR5cGUgPSBmbG9hdCwgYm9vbCBFeGNsdXNpdmUgPSBmYWxzZT4KK3N0YXRpYyB2b2lkIHRlc3RfMWRfc2NhbigpIHsKICAgaW50IHNpemUgPSA1MDsKICAgVGVuc29yPFR5cGUsIDEsIERhdGFMYXlvdXQ+IHRlbnNvcihzaXplKTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwpAQCAtNDgsOSArNDcsOCBAQAogICB9CiB9CiAKLXRlbXBsYXRlIDxpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgVHlwZT1mbG9hdD4KLXN0YXRpYyB2b2lkIHRlc3RfNGRfc2NhbigpCi17Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIFR5cGUgPSBmbG9hdD4KK3N0YXRpYyB2b2lkIHRlc3RfNGRfc2NhbigpIHsKICAgaW50IHNpemUgPSA1OwogICBUZW5zb3I8VHlwZSwgNCwgRGF0YUxheW91dD4gdGVuc29yKHNpemUsIHNpemUsIHNpemUsIHNpemUpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zY2FuX2dwdS5jdSBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NjYW5fZ3B1LmN1CmluZGV4IDc3MGExNDQuLmMzMTZmMWUgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NjYW5fZ3B1LmN1CisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NjYW5fZ3B1LmN1CkBAIC0yMSw5ICsyMSw4IEBACiB1c2luZyBFaWdlbjo6VGVuc29yOwogdHlwZWRlZiBUZW5zb3I8ZmxvYXQsIDE+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotdm9pZCB0ZXN0X2dwdV9jdW1zdW0oaW50IG1fc2l6ZSwgaW50IGtfc2l6ZSwgaW50IG5fc2l6ZSkKLXsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3ZvaWQgdGVzdF9ncHVfY3Vtc3VtKGludCBtX3NpemUsIGludCBrX3NpemUsIGludCBuX3NpemUpIHsKICAgc3RkOjpjb3V0IDw8ICJUZXN0aW5nIGZvciAoIiA8PCBtX3NpemUgPDwgIiwiIDw8IGtfc2l6ZSA8PCAiLCIgPDwgbl9zaXplIDw8ICIpIiA8PCBzdGQ6OmVuZGw7CiAgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gdF9pbnB1dChtX3NpemUsIGtfc2l6ZSwgbl9zaXplKTsKICAgVGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiB0X3Jlc3VsdChtX3NpemUsIGtfc2l6ZSwgbl9zaXplKTsKQEAgLTMxLDcgKzMwLDcgQEAKIAogICB0X2lucHV0LnNldFJhbmRvbSgpOwogCi0gIHN0ZDo6c2l6ZV90IHRfaW5wdXRfYnl0ZXMgPSB0X2lucHV0LnNpemUoKSAgKiBzaXplb2YoZmxvYXQpOworICBzdGQ6OnNpemVfdCB0X2lucHV0X2J5dGVzID0gdF9pbnB1dC5zaXplKCkgKiBzaXplb2YoZmxvYXQpOwogICBzdGQ6OnNpemVfdCB0X3Jlc3VsdF9ieXRlcyA9IHRfcmVzdWx0LnNpemUoKSAqIHNpemVvZihmbG9hdCk7CiAKICAgZmxvYXQqIGRfdF9pbnB1dDsKQEAgLTQ1LDEwICs0NCwxMCBAQAogICBFaWdlbjo6R3B1U3RyZWFtRGV2aWNlIHN0cmVhbTsKICAgRWlnZW46OkdwdURldmljZSBncHVfZGV2aWNlKCZzdHJlYW0pOwogCi0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gPgotICAgICAgZ3B1X3RfaW5wdXQoZF90X2lucHV0LCBFaWdlbjo6YXJyYXk8aW50LCAzPihtX3NpemUsIGtfc2l6ZSwgbl9zaXplKSk7Ci0gIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gPgotICAgICAgZ3B1X3RfcmVzdWx0KGRfdF9yZXN1bHQsIEVpZ2VuOjphcnJheTxpbnQsIDM+KG1fc2l6ZSwga19zaXplLCBuX3NpemUpKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiA+IGdwdV90X2lucHV0KGRfdF9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjphcnJheTxpbnQsIDM+KG1fc2l6ZSwga19zaXplLCBuX3NpemUpKTsKKyAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiA+IGdwdV90X3Jlc3VsdChkX3RfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuOjphcnJheTxpbnQsIDM+KG1fc2l6ZSwga19zaXplLCBuX3NpemUpKTsKIAogICBncHVfdF9yZXN1bHQuZGV2aWNlKGdwdV9kZXZpY2UpID0gZ3B1X3RfaW5wdXQuY3Vtc3VtKDEpOwogICB0X3Jlc3VsdCA9IHRfaW5wdXQuY3Vtc3VtKDEpOwpAQCAtNjEsOCArNjAsNyBAQAogICAgIGlmIChFaWdlbjo6aW50ZXJuYWw6OmlzQXBwcm94KHRfcmVzdWx0KGkpLCB0X3Jlc3VsdF9ncHUoaSksIDFlLTRmKSkgewogICAgICAgY29udGludWU7CiAgICAgfQotICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICI6ICIgPDwgdF9yZXN1bHQoaSkKLSAgICAgICAgICAgICAgPDwgIiB2cyAiIDw8ICB0X3Jlc3VsdF9ncHUoaSkgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICI6ICIgPDwgdF9yZXN1bHQoaSkgPDwgIiB2cyAiIDw8IHRfcmVzdWx0X2dwdShpKSA8PCBzdGQ6OmVuZGw7CiAgICAgYXNzZXJ0KGZhbHNlKTsKICAgfQogCkBAIC03MCw5ICs2OCw3IEBACiAgIGdwdUZyZWUoKHZvaWQqKWRfdF9yZXN1bHQpOwogfQogCi0KLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3Jfc2Nhbl9ncHUpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3NjYW5fZ3B1KSB7CiAgIENBTExfU1VCVEVTVF8xKHRlc3RfZ3B1X2N1bXN1bTxDb2xNYWpvcj4oMTI4LCAxMjgsIDEyOCkpOwogICBDQUxMX1NVQlRFU1RfMih0ZXN0X2dwdV9jdW1zdW08Um93TWFqb3I+KDEyOCwgMTI4LCAxMjgpKTsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NjYW5fc3ljbC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zY2FuX3N5Y2wuY3BwCmluZGV4IDA5YzQ1ZmMuLjEzZjdjOWUgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NjYW5fc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc2Nhbl9zeWNsLmNwcApAQCAtMjMsMzEgKzIzLDI1IEBACiB0eXBlZGVmIFRlbnNvcjxmbG9hdCwgMT46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotdm9pZCB0ZXN0X3N5Y2xfY3Vtc3VtKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSwgSW5kZXhUeXBlIG1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBJbmRleFR5cGUga19zaXplLCBJbmRleFR5cGUgbl9zaXplLCBpbnQgY29uc3VtZV9kaW0sCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBleGNsdXNpdmUpIHsKK3ZvaWQgdGVzdF9zeWNsX2N1bXN1bShjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UsIEluZGV4VHlwZSBtX3NpemUsIEluZGV4VHlwZSBrX3NpemUsIEluZGV4VHlwZSBuX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnN1bWVfZGltLCBib29sIGV4Y2x1c2l2ZSkgewogICBzdGF0aWMgY29uc3QgRGF0YVR5cGUgZXJyb3JfdGhyZXNob2xkID0gMWUtNGY7Ci0gIHN0ZDo6Y291dCA8PCAiVGVzdGluZyBmb3IgKCIgPDwgbV9zaXplIDw8ICIsIiA8PCBrX3NpemUgPDwgIiwiIDw8IG5fc2l6ZQotICAgICAgICAgICAgPDwgIiBjb25zdW1lX2RpbSA6ICIgPDwgY29uc3VtZV9kaW0gPDwgIikiIDw8IHN0ZDo6ZW5kbDsKKyAgc3RkOjpjb3V0IDw8ICJUZXN0aW5nIGZvciAoIiA8PCBtX3NpemUgPDwgIiwiIDw8IGtfc2l6ZSA8PCAiLCIgPDwgbl9zaXplIDw8ICIgY29uc3VtZV9kaW0gOiAiIDw8IGNvbnN1bWVfZGltIDw8ICIpIgorICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdF9pbnB1dChtX3NpemUsIGtfc2l6ZSwgbl9zaXplKTsKICAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHRfcmVzdWx0KG1fc2l6ZSwga19zaXplLCBuX3NpemUpOwotICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdF9yZXN1bHRfZ3B1KG1fc2l6ZSwga19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fc2l6ZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPiB0X3Jlc3VsdF9ncHUobV9zaXplLCBrX3NpemUsIG5fc2l6ZSk7CiAKICAgdF9pbnB1dC5zZXRSYW5kb20oKTsKICAgc3RkOjpzaXplX3QgdF9pbnB1dF9ieXRlcyA9IHRfaW5wdXQuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKICAgc3RkOjpzaXplX3QgdF9yZXN1bHRfYnl0ZXMgPSB0X3Jlc3VsdC5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YV9pbiA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfaW5wdXRfYnl0ZXMpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX291dCA9Ci0gICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRfcmVzdWx0X2J5dGVzKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9pbiA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodF9pbnB1dF9ieXRlcykpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfb3V0ID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0X3Jlc3VsdF9ieXRlcykpOwogCiAgIGFycmF5PEluZGV4VHlwZSwgMz4gdGVuc29yUmFuZ2UgPSB7e21fc2l6ZSwga19zaXplLCBuX3NpemV9fTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3RfaW5wdXQoCi0gICAgICBncHVfZGF0YV9pbiwgdGVuc29yUmFuZ2UpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfdF9yZXN1bHQoCi0gICAgICBncHVfZGF0YV9vdXQsIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3RfaW5wdXQoZ3B1X2RhdGFfaW4sIHRlbnNvclJhbmdlKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X3RfcmVzdWx0KGdwdV9kYXRhX291dCwgdGVuc29yUmFuZ2UpOwogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfaW4sIHRfaW5wdXQuZGF0YSgpLCB0X2lucHV0X2J5dGVzKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX291dCwgdF9pbnB1dC5kYXRhKCksIHRfaW5wdXRfYnl0ZXMpOwogCkBAIC01NSwyMSArNDksMTggQEAKIAogICB0X3Jlc3VsdCA9IHRfaW5wdXQuY3Vtc3VtKGNvbnN1bWVfZGltLCBleGNsdXNpdmUpOwogCi0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0X3Jlc3VsdF9ncHUuZGF0YSgpLCBncHVfZGF0YV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3Jlc3VsdF9ieXRlcyk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdCh0X3Jlc3VsdF9ncHUuZGF0YSgpLCBncHVfZGF0YV9vdXQsIHRfcmVzdWx0X2J5dGVzKTsKICAgc3ljbF9kZXZpY2Uuc3luY2hyb25pemUoKTsKIAogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IHRfcmVzdWx0LnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKHN0YXRpY19jYXN0PERhdGFUeXBlPihzdGQ6OmZhYnMoc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KAotICAgICAgICAgICAgdF9yZXN1bHQoaSkgLSB0X3Jlc3VsdF9ncHUoaSkpKSkgPCBlcnJvcl90aHJlc2hvbGQpIHsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KHN0ZDo6ZmFicyhzdGF0aWNfY2FzdDxEYXRhVHlwZT4odF9yZXN1bHQoaSkgLSB0X3Jlc3VsdF9ncHUoaSkpKSkgPCBlcnJvcl90aHJlc2hvbGQpIHsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAoRWlnZW46OmludGVybmFsOjppc0FwcHJveCh0X3Jlc3VsdChpKSwgdF9yZXN1bHRfZ3B1KGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3RocmVzaG9sZCkpIHsKKyAgICBpZiAoRWlnZW46OmludGVybmFsOjppc0FwcHJveCh0X3Jlc3VsdChpKSwgdF9yZXN1bHRfZ3B1KGkpLCBlcnJvcl90aHJlc2hvbGQpKSB7CiAgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgc3RkOjpjb3V0IDw8ICJtaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIiBDUFUgOiAiIDw8IHRfcmVzdWx0KGkpCi0gICAgICAgICAgICAgIDw8ICIgdnMgU1lDTCA6ICIgPDwgdF9yZXN1bHRfZ3B1KGkpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIm1pc21hdGNoIGRldGVjdGVkIGF0IGluZGV4ICIgPDwgaSA8PCAiIENQVSA6ICIgPDwgdF9yZXN1bHQoaSkgPDwgIiB2cyBTWUNMIDogIiA8PCB0X3Jlc3VsdF9ncHUoaSkKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICAgIGFzc2VydChmYWxzZSk7CiAgIH0KICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfZGF0YV9pbik7CkBAIC03OCw2NCArNjksNDQgQEAKIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBEZXY+CiB2b2lkIHN5Y2xfc2Nhbl90ZXN0X2V4Y2x1c2l2ZV9kaW0wX3Blcl9kZXZpY2UoY29uc3QgRGV2JiBzeWNsX2RldmljZSkgewotICB0ZXN0X3N5Y2xfY3Vtc3VtPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UsIDIwNDksIDEwMjMsIDEyNywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICB0ZXN0X3N5Y2xfY3Vtc3VtPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UsIDIwNDksIDEwMjMsIDEyNywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICB0ZXN0X3N5Y2xfY3Vtc3VtPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UsIDIwNDksIDEwMjMsIDEyNywgMCwgdHJ1ZSk7CisgIHRlc3Rfc3ljbF9jdW1zdW08RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSwgMjA0OSwgMTAyMywgMTI3LCAwLCB0cnVlKTsKIH0KIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgRGV2Pgogdm9pZCBzeWNsX3NjYW5fdGVzdF9leGNsdXNpdmVfZGltMV9wZXJfZGV2aWNlKGNvbnN0IERldiYgc3ljbF9kZXZpY2UpIHsKLSAgdGVzdF9zeWNsX2N1bXN1bTxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlLCAxMDIzLCAyMDQ5LCAxMjcsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgdGVzdF9zeWNsX2N1bXN1bTxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlLCAxMDIzLCAyMDQ5LCAxMjcsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgdGVzdF9zeWNsX2N1bXN1bTxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlLCAxMDIzLCAyMDQ5LCAxMjcsIDEsIHRydWUpOworICB0ZXN0X3N5Y2xfY3Vtc3VtPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UsIDEwMjMsIDIwNDksIDEyNywgMSwgdHJ1ZSk7CiB9CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIERldj4KIHZvaWQgc3ljbF9zY2FuX3Rlc3RfZXhjbHVzaXZlX2RpbTJfcGVyX2RldmljZShjb25zdCBEZXYmIHN5Y2xfZGV2aWNlKSB7Ci0gIHRlc3Rfc3ljbF9jdW1zdW08RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSwgMTAyMywgMTI3LCAyMDQ5LCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gIHRlc3Rfc3ljbF9jdW1zdW08RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSwgMTAyMywgMTI3LCAyMDQ5LCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgIHRlc3Rfc3ljbF9jdW1zdW08RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSwgMTAyMywgMTI3LCAyMDQ5LCAyLCB0cnVlKTsKKyAgdGVzdF9zeWNsX2N1bXN1bTxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlLCAxMDIzLCAxMjcsIDIwNDksIDIsIHRydWUpOwogfQogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBEZXY+CiB2b2lkIHN5Y2xfc2Nhbl90ZXN0X2luY2x1c2l2ZV9kaW0wX3Blcl9kZXZpY2UoY29uc3QgRGV2JiBzeWNsX2RldmljZSkgewotICB0ZXN0X3N5Y2xfY3Vtc3VtPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UsIDIwNDksIDEwMjMsIDEyNywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgdGVzdF9zeWNsX2N1bXN1bTxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlLCAyMDQ5LCAxMDIzLCAxMjcsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHRlc3Rfc3ljbF9jdW1zdW08RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSwgMjA0OSwgMTAyMywgMTI3LCAwLCBmYWxzZSk7CisgIHRlc3Rfc3ljbF9jdW1zdW08RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSwgMjA0OSwgMTAyMywgMTI3LCAwLCBmYWxzZSk7CiB9CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIERldj4KIHZvaWQgc3ljbF9zY2FuX3Rlc3RfaW5jbHVzaXZlX2RpbTFfcGVyX2RldmljZShjb25zdCBEZXYmIHN5Y2xfZGV2aWNlKSB7Ci0gIHRlc3Rfc3ljbF9jdW1zdW08RGF0YVR5cGUsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSwgMTAyMywgMjA0OSwgMTI3LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICB0ZXN0X3N5Y2xfY3Vtc3VtPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UsIDEwMjMsIDIwNDksIDEyNywgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgdGVzdF9zeWNsX2N1bXN1bTxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlLCAxMDIzLCAyMDQ5LCAxMjcsIDEsIGZhbHNlKTsKKyAgdGVzdF9zeWNsX2N1bXN1bTxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlLCAxMDIzLCAyMDQ5LCAxMjcsIDEsIGZhbHNlKTsKIH0KIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgRGV2Pgogdm9pZCBzeWNsX3NjYW5fdGVzdF9pbmNsdXNpdmVfZGltMl9wZXJfZGV2aWNlKGNvbnN0IERldiYgc3ljbF9kZXZpY2UpIHsKLSAgdGVzdF9zeWNsX2N1bXN1bTxEYXRhVHlwZSwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlLCAxMDIzLCAxMjcsIDIwNDksIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gIHRlc3Rfc3ljbF9jdW1zdW08RGF0YVR5cGUsIFJvd01ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSwgMTAyMywgMTI3LCAyMDQ5LCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB0ZXN0X3N5Y2xfY3Vtc3VtPERhdGFUeXBlLCBDb2xNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UsIDEwMjMsIDEyNywgMjA0OSwgMiwgZmFsc2UpOworICB0ZXN0X3N5Y2xfY3Vtc3VtPERhdGFUeXBlLCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UsIDEwMjMsIDEyNywgMjA0OSwgMiwgZmFsc2UpOwogfQogRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9zY2FuX3N5Y2wpIHsKICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgewotICAgIHN0ZDo6Y291dCA8PCAiUnVubmluZyBvbiAiCi0gICAgICAgICAgICAgIDw8IGRldmljZS50ZW1wbGF0ZSBnZXRfaW5mbzxjbDo6c3ljbDo6aW5mbzo6ZGV2aWNlOjpuYW1lPigpCi0gICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIlJ1bm5pbmcgb24gIiA8PCBkZXZpY2UudGVtcGxhdGUgZ2V0X2luZm88Y2w6OnN5Y2w6OmluZm86OmRldmljZTo6bmFtZT4oKSA8PCBzdGQ6OmVuZGw7CiAgICAgUXVldWVJbnRlcmZhY2UgcXVldWVJbnRlcmZhY2UoZGV2aWNlKTsKICAgICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKLSAgICBDQUxMX1NVQlRFU1RfMSgKLSAgICAgICAgc3ljbF9zY2FuX3Rlc3RfZXhjbHVzaXZlX2RpbTBfcGVyX2RldmljZTxmbG9hdD4oc3ljbF9kZXZpY2UpKTsKLSAgICBDQUxMX1NVQlRFU1RfMigKLSAgICAgICAgc3ljbF9zY2FuX3Rlc3RfZXhjbHVzaXZlX2RpbTFfcGVyX2RldmljZTxmbG9hdD4oc3ljbF9kZXZpY2UpKTsKLSAgICBDQUxMX1NVQlRFU1RfMygKLSAgICAgICAgc3ljbF9zY2FuX3Rlc3RfZXhjbHVzaXZlX2RpbTJfcGVyX2RldmljZTxmbG9hdD4oc3ljbF9kZXZpY2UpKTsKLSAgICBDQUxMX1NVQlRFU1RfNCgKLSAgICAgICAgc3ljbF9zY2FuX3Rlc3RfaW5jbHVzaXZlX2RpbTBfcGVyX2RldmljZTxmbG9hdD4oc3ljbF9kZXZpY2UpKTsKLSAgICBDQUxMX1NVQlRFU1RfNSgKLSAgICAgICAgc3ljbF9zY2FuX3Rlc3RfaW5jbHVzaXZlX2RpbTFfcGVyX2RldmljZTxmbG9hdD4oc3ljbF9kZXZpY2UpKTsKLSAgICBDQUxMX1NVQlRFU1RfNigKLSAgICAgICAgc3ljbF9zY2FuX3Rlc3RfaW5jbHVzaXZlX2RpbTJfcGVyX2RldmljZTxmbG9hdD4oc3ljbF9kZXZpY2UpKTsKKyAgICBDQUxMX1NVQlRFU1RfMShzeWNsX3NjYW5fdGVzdF9leGNsdXNpdmVfZGltMF9wZXJfZGV2aWNlPGZsb2F0PihzeWNsX2RldmljZSkpOworICAgIENBTExfU1VCVEVTVF8yKHN5Y2xfc2Nhbl90ZXN0X2V4Y2x1c2l2ZV9kaW0xX3Blcl9kZXZpY2U8ZmxvYXQ+KHN5Y2xfZGV2aWNlKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoc3ljbF9zY2FuX3Rlc3RfZXhjbHVzaXZlX2RpbTJfcGVyX2RldmljZTxmbG9hdD4oc3ljbF9kZXZpY2UpKTsKKyAgICBDQUxMX1NVQlRFU1RfNChzeWNsX3NjYW5fdGVzdF9pbmNsdXNpdmVfZGltMF9wZXJfZGV2aWNlPGZsb2F0PihzeWNsX2RldmljZSkpOworICAgIENBTExfU1VCVEVTVF81KHN5Y2xfc2Nhbl90ZXN0X2luY2x1c2l2ZV9kaW0xX3Blcl9kZXZpY2U8ZmxvYXQ+KHN5Y2xfZGV2aWNlKSk7CisgICAgQ0FMTF9TVUJURVNUXzYoc3ljbF9zY2FuX3Rlc3RfaW5jbHVzaXZlX2RpbTJfcGVyX2RldmljZTxmbG9hdD4oc3ljbF9kZXZpY2UpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc2h1ZmZsaW5nLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NodWZmbGluZy5jcHAKaW5kZXggODlhNjRjMC4uNGU2ZmI3MyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc2h1ZmZsaW5nLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zaHVmZmxpbmcuY3BwCkBAIC0xMSwxMyArMTEsMTIgQEAKIAogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KIAotdXNpbmcgRWlnZW46OlRlbnNvcjsKIHVzaW5nIEVpZ2VuOjphcnJheTsKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3NodWZmbGluZygpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcpOworc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfc2h1ZmZsaW5nKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogICBhcnJheTxwdHJkaWZmX3QsIDQ+IHNodWZmbGVzOwogICBzaHVmZmxlc1swXSA9IDA7CkBAIC0zNyw3ICszNiw3IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgbm9fc2h1ZmZsZShpLGosayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsKSwgbm9fc2h1ZmZsZShpLCBqLCBrLCBsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC01OSwxOCArNTgsMTYgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwpLCBzaHVmZmxlKGssbCxqLGkpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwpLCBzaHVmZmxlKGssIGwsIGosIGkpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogfQogCi0KIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfZXhwcl9zaHVmZmxpbmcoKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKK3N0YXRpYyB2b2lkIHRlc3RfZXhwcl9zaHVmZmxpbmcoKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMsIDUsIDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAKICAgYXJyYXk8cHRyZGlmZl90LCA0PiBzaHVmZmxlczsKQEAgLTg5LDggKzg2LDcgQEAKICAgYXJyYXk8cHRyZGlmZl90LCA0PiBkc3Rfc2xpY2Vfc3RhcnR7ezAsIDAsIDAsIDB9fTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewotICAgIHJlc3VsdC5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pID0KLSAgICAgICAgdGVuc29yLnNsaWNlKHNyY19zbGljZV9zdGFydCwgc3JjX3NsaWNlX2RpbSkuc2h1ZmZsZShzaHVmZmxlcyk7CisgICAgcmVzdWx0LnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSkgPSB0ZW5zb3Iuc2xpY2Uoc3JjX3NsaWNlX3N0YXJ0LCBzcmNfc2xpY2VfZGltKS5zaHVmZmxlKHNodWZmbGVzKTsKICAgICBzcmNfc2xpY2Vfc3RhcnRbMl0gKz0gMTsKICAgICBkc3Rfc2xpY2Vfc3RhcnRbMF0gKz0gMTsKICAgfQpAQCAtMTA0LDcgKzEwMCw3IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZC5kaW1lbnNpb24oMSk7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBleHBlY3RlZC5kaW1lbnNpb24oMik7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGV4cGVjdGVkLmRpbWVuc2lvbigzKTsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLGosayxsKSwgZXhwZWN0ZWQoaSxqLGssbCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiwgaywgbCksIGV4cGVjdGVkKGksIGosIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTExMyw4ICsxMDksNyBAQAogICBkc3Rfc2xpY2Vfc3RhcnRbMF0gPSAwOwogICByZXN1bHQuc2V0UmFuZG9tKCk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7Ci0gICAgcmVzdWx0LnNsaWNlKGRzdF9zbGljZV9zdGFydCwgZHN0X3NsaWNlX2RpbSkgPQotICAgICAgICB0ZW5zb3Iuc2h1ZmZsZShzaHVmZmxlcykuc2xpY2UoZHN0X3NsaWNlX3N0YXJ0LCBkc3Rfc2xpY2VfZGltKTsKKyAgICByZXN1bHQuc2xpY2UoZHN0X3NsaWNlX3N0YXJ0LCBkc3Rfc2xpY2VfZGltKSA9IHRlbnNvci5zaHVmZmxlKHNodWZmbGVzKS5zbGljZShkc3Rfc2xpY2Vfc3RhcnQsIGRzdF9zbGljZV9kaW0pOwogICAgIGRzdF9zbGljZV9zdGFydFswXSArPSAxOwogICB9CiAKQEAgLTEyMiwyNSArMTE3LDIzIEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZC5kaW1lbnNpb24oMSk7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBleHBlY3RlZC5kaW1lbnNpb24oMik7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGV4cGVjdGVkLmRpbWVuc2lvbigzKTsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdChpLGosayxsKSwgZXhwZWN0ZWQoaSxqLGssbCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQoaSwgaiwgaywgbCksIGV4cGVjdGVkKGksIGosIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogfQogCi0KIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc2h1ZmZsaW5nX2FzX3ZhbHVlKCkKLXsKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X3NodWZmbGluZ19hc192YWx1ZSgpIHsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgNSwgNyk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKICAgYXJyYXk8cHRyZGlmZl90LCA0PiBzaHVmZmxlczsKICAgc2h1ZmZsZXNbMl0gPSAwOwogICBzaHVmZmxlc1szXSA9IDE7CiAgIHNodWZmbGVzWzFdID0gMjsKICAgc2h1ZmZsZXNbMF0gPSAzOwotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHNodWZmbGUoNSw3LDMsMik7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gc2h1ZmZsZSg1LCA3LCAzLCAyKTsKICAgc2h1ZmZsZS5zaHVmZmxlKHNodWZmbGVzKSA9IHRlbnNvcjsKIAogICBWRVJJRllfSVNfRVFVQUwoc2h1ZmZsZS5kaW1lbnNpb24oMCksIDUpOwpAQCAtMTUyLDcgKzE0NSw3IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgc2h1ZmZsZShrLGwsaixpKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsKSwgc2h1ZmZsZShrLCBsLCBqLCBpKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0xNjMsMjQgKzE1NiwyMiBAQAogICBub19zaHVmZmxlWzFdID0gMTsKICAgbm9fc2h1ZmZsZVsyXSA9IDI7CiAgIG5vX3NodWZmbGVbM10gPSAzOwotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHNodWZmbGUyKDUsNywzLDIpOworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHNodWZmbGUyKDUsIDcsIDMsIDIpOwogICBzaHVmZmxlMi5zaHVmZmxlKHNodWZmbGVzKSA9IHRlbnNvci5zaHVmZmxlKG5vX3NodWZmbGUpOwogICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgNzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDM7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDI7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTChzaHVmZmxlMihpLGosayxsKSwgc2h1ZmZsZShpLGosayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHNodWZmbGUyKGksIGosIGssIGwpLCBzaHVmZmxlKGksIGosIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogfQogCi0KIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3Rfc2h1ZmZsZV91bnNodWZmbGUoKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKK3N0YXRpYyB2b2lkIHRlc3Rfc2h1ZmZsZV91bnNodWZmbGUoKSB7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsIDMsIDUsIDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAKICAgLy8gQ2hvb3NlIGEgcmFuZG9tIHBlcm11dGF0aW9uLgpAQCAtMjA3LDE4ICsxOTgsMTYgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwpLCBzaHVmZmxlKGksaixrLGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwpLCBzaHVmZmxlKGksIGosIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogfQogCi0KIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfZW1wdHlfc2h1ZmZsaW5nKCkKLXsKLSAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDAsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X2VtcHR5X3NodWZmbGluZygpIHsKKyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwgMywgMCwgNyk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKICAgYXJyYXk8cHRyZGlmZl90LCA0PiBzaHVmZmxlczsKICAgc2h1ZmZsZXNbMF0gPSAwOwpAQCAtMjM4LDcgKzIyNyw3IEBACiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgMDsgKytrKSB7CiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgNzsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgbm9fc2h1ZmZsZShpLGosayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsKSwgbm9fc2h1ZmZsZShpLCBqLCBrLCBsKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0yNjAsMTYgKzI0OSwxNCBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDA7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCksIHNodWZmbGUoayxsLGosaSkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCksIHNodWZmbGUoaywgbCwgaiwgaSkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9zaHVmZmxpbmcpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3NodWZmbGluZykgewogICBDQUxMX1NVQlRFU1QodGVzdF9zaW1wbGVfc2h1ZmZsaW5nPENvbE1ham9yPigpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3Rfc2ltcGxlX3NodWZmbGluZzxSb3dNYWpvcj4oKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2V4cHJfc2h1ZmZsaW5nPENvbE1ham9yPigpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NodWZmbGluZ19zeWNsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NodWZmbGluZ19zeWNsLmNwcAppbmRleCA3MGM0MTE2Li4wZjg4ZjUyIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zaHVmZmxpbmdfc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc2h1ZmZsaW5nX3N5Y2wuY3BwCkBAIC00NiwxMCArNDYsOCBAQAogICBEYXRhVHlwZSogZ3B1X2RhdGExID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShidWZmU2l6ZSkpOwogICBEYXRhVHlwZSogZ3B1X2RhdGEyID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShidWZmU2l6ZSkpOwogCi0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTEoZ3B1X2RhdGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbnNvclJhbmdlKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUxKGdwdV9kYXRhMSwgdGVuc29yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUyKGdwdV9kYXRhMiwgdGVuc29yUmFuZ2UpOwogCiAgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YTEsIHRlbnNvci5kYXRhKCksIGJ1ZmZTaXplKTsKIApAQCAtNzYsMTIgKzc0LDEwIEBACiAgIHNodWZmbGVzWzFdID0gMzsKICAgc2h1ZmZsZXNbMl0gPSAxOwogICBzaHVmZmxlc1szXSA9IDA7Ci0gIGFycmF5PEluZGV4VHlwZSwgND4gdGVuc29ycmFuZ2VTaHVmZmxlID0gewotICAgICAge3NpemVEaW0zLCBzaXplRGltNCwgc2l6ZURpbTIsIHNpemVEaW0xfX07CisgIGFycmF5PEluZGV4VHlwZSwgND4gdGVuc29ycmFuZ2VTaHVmZmxlID0ge3tzaXplRGltMywgc2l6ZURpbTQsIHNpemVEaW0yLCBzaXplRGltMX19OwogICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gc2h1ZmZsZSh0ZW5zb3JyYW5nZVNodWZmbGUpOwogICBEYXRhVHlwZSogZ3B1X2RhdGEzID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShidWZmU2l6ZSkpOwotICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUzKAotICAgICAgZ3B1X2RhdGEzLCB0ZW5zb3JyYW5nZVNodWZmbGUpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHUzKGdwdV9kYXRhMywgdGVuc29ycmFuZ2VTaHVmZmxlKTsKIAogICBncHUzLmRldmljZShzeWNsX2RldmljZSkgPSBncHUxLnNodWZmbGUoc2h1ZmZsZXMpOwogICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qoc2h1ZmZsZS5kYXRhKCksIGdwdV9kYXRhMywgYnVmZlNpemUpOwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc2ltcGxlLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3NpbXBsZS5jcHAKaW5kZXggNmQ3MGY1NC4uMTY4NmFmMyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc2ltcGxlLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zaW1wbGUuY3BwCkBAIC0xMSwxMSArMTEsMTAgQEAKIAogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KIAotdXNpbmcgRWlnZW46OlRlbnNvcjsKIHVzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKLXN0YXRpYyB2b2lkIHRlc3RfMGQoKQoteworc3RhdGljIHZvaWQgdGVzdF8wZCgpIHsKICAgVGVuc29yPGludCwgMD4gc2NhbGFyMTsKICAgVGVuc29yPGludCwgMCwgUm93TWFqb3I+IHNjYWxhcjI7CiAgIFRlbnNvcjxpbnQsIDA+IHNjYWxhcjM7CkBAIC00Myw4ICs0Miw3IEBACiAgIFZFUklGWV9JU19FUVVBTChzY2FsYXI1LmRhdGEoKVswXSwgNyk7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfMWQoKQoteworc3RhdGljIHZvaWQgdGVzdF8xZCgpIHsKICAgVGVuc29yPGludCwgMT4gdmVjMSg2KTsKICAgVGVuc29yPGludCwgMSwgUm93TWFqb3I+IHZlYzIoNik7CiAgIFRlbnNvcjxpbnQsIDE+IHZlYzM7CkBAIC01MywxMiArNTEsMjQgQEAKICAgdmVjMy5yZXNpemUoNik7CiAgIHZlYzQucmVzaXplKDYpOwogCi0gIHZlYzEoMCkgPSA0OyAgdmVjMigwKSA9IDA7IHZlYzMoMCkgPSA1OwotICB2ZWMxKDEpID0gODsgIHZlYzIoMSkgPSAxOyB2ZWMzKDEpID0gNDsKLSAgdmVjMSgyKSA9IDE1OyB2ZWMyKDIpID0gMjsgdmVjMygyKSA9IDM7Ci0gIHZlYzEoMykgPSAxNjsgdmVjMigzKSA9IDM7IHZlYzMoMykgPSAyOwotICB2ZWMxKDQpID0gMjM7IHZlYzIoNCkgPSA0OyB2ZWMzKDQpID0gMTsKLSAgdmVjMSg1KSA9IDQyOyB2ZWMyKDUpID0gNTsgdmVjMyg1KSA9IDA7CisgIHZlYzEoMCkgPSA0OworICB2ZWMyKDApID0gMDsKKyAgdmVjMygwKSA9IDU7CisgIHZlYzEoMSkgPSA4OworICB2ZWMyKDEpID0gMTsKKyAgdmVjMygxKSA9IDQ7CisgIHZlYzEoMikgPSAxNTsKKyAgdmVjMigyKSA9IDI7CisgIHZlYzMoMikgPSAzOworICB2ZWMxKDMpID0gMTY7CisgIHZlYzIoMykgPSAzOworICB2ZWMzKDMpID0gMjsKKyAgdmVjMSg0KSA9IDIzOworICB2ZWMyKDQpID0gNDsKKyAgdmVjMyg0KSA9IDE7CisgIHZlYzEoNSkgPSA0MjsKKyAgdmVjMig1KSA9IDU7CisgIHZlYzMoNSkgPSAwOwogICB2ZWM0LnNldFplcm8oKTsKIAogICBWRVJJRllfSVNfRVFVQUwoKHZlYzEucmFuaygpKSwgMSk7CkBAIC0xMTAsMjQgKzEyMCwyMyBAQAogICBWRVJJRllfSVNfRVFVQUwoKHZlYzUuZGF0YSgpWzVdKSwgNDIpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0XzJkKCkKLXsKLSAgVGVuc29yPGludCwgMj4gbWF0MSgyLDMpOwotICBUZW5zb3I8aW50LCAyLCBSb3dNYWpvcj4gbWF0MigyLDMpOworc3RhdGljIHZvaWQgdGVzdF8yZCgpIHsKKyAgVGVuc29yPGludCwgMj4gbWF0MSgyLCAzKTsKKyAgVGVuc29yPGludCwgMiwgUm93TWFqb3I+IG1hdDIoMiwgMyk7CiAKLSAgbWF0MSgwLDApID0gMDsKLSAgbWF0MSgwLDEpID0gMTsKLSAgbWF0MSgwLDIpID0gMjsKLSAgbWF0MSgxLDApID0gMzsKLSAgbWF0MSgxLDEpID0gNDsKLSAgbWF0MSgxLDIpID0gNTsKKyAgbWF0MSgwLCAwKSA9IDA7CisgIG1hdDEoMCwgMSkgPSAxOworICBtYXQxKDAsIDIpID0gMjsKKyAgbWF0MSgxLCAwKSA9IDM7CisgIG1hdDEoMSwgMSkgPSA0OworICBtYXQxKDEsIDIpID0gNTsKIAotICBtYXQyKDAsMCkgPSAwOwotICBtYXQyKDAsMSkgPSAxOwotICBtYXQyKDAsMikgPSAyOwotICBtYXQyKDEsMCkgPSAzOwotICBtYXQyKDEsMSkgPSA0OwotICBtYXQyKDEsMikgPSA1OworICBtYXQyKDAsIDApID0gMDsKKyAgbWF0MigwLCAxKSA9IDE7CisgIG1hdDIoMCwgMikgPSAyOworICBtYXQyKDEsIDApID0gMzsKKyAgbWF0MigxLCAxKSA9IDQ7CisgIG1hdDIoMSwgMikgPSA1OwogCiAgIFZFUklGWV9JU19FUVVBTCgobWF0MS5yYW5rKCkpLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKChtYXQxLnNpemUoKSksIDYpOwpAQCAtMTU0LDQ2ICsxNjMsNDUgQEAKICAgVkVSSUZZX0lTX0VRVUFMKChtYXQyLmRhdGEoKVs1XSksIDUpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0XzNkKCkKLXsKLSAgVGVuc29yPGludCwgMz4gZXBzaWxvbigzLDMsMyk7CitzdGF0aWMgdm9pZCB0ZXN0XzNkKCkgeworICBUZW5zb3I8aW50LCAzPiBlcHNpbG9uKDMsIDMsIDMpOwogICBlcHNpbG9uLnNldFplcm8oKTsKLSAgZXBzaWxvbigwLDEsMikgPSBlcHNpbG9uKDIsMCwxKSA9IGVwc2lsb24oMSwyLDApID0gMTsKLSAgZXBzaWxvbigyLDEsMCkgPSBlcHNpbG9uKDAsMiwxKSA9IGVwc2lsb24oMSwwLDIpID0gLTE7CisgIGVwc2lsb24oMCwgMSwgMikgPSBlcHNpbG9uKDIsIDAsIDEpID0gZXBzaWxvbigxLCAyLCAwKSA9IDE7CisgIGVwc2lsb24oMiwgMSwgMCkgPSBlcHNpbG9uKDAsIDIsIDEpID0gZXBzaWxvbigxLCAwLCAyKSA9IC0xOwogCiAgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbi5zaXplKCkpLCAyNyk7CiAgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbi5kaW1lbnNpb25zKClbMF0pLCAzKTsKICAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uLmRpbWVuc2lvbnMoKVsxXSksIDMpOwogICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24uZGltZW5zaW9ucygpWzJdKSwgMyk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDAsMCwwKSksIDApOwotICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMCwwLDEpKSwgMCk7Ci0gIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigwLDAsMikpLCAwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDAsMSwwKSksIDApOwotICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMCwxLDEpKSwgMCk7Ci0gIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigwLDIsMCkpLCAwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDAsMiwyKSksIDApOwotICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMSwwLDApKSwgMCk7Ci0gIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigxLDAsMSkpLCAwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDEsMSwwKSksIDApOwotICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMSwxLDEpKSwgMCk7Ci0gIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigxLDEsMikpLCAwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDEsMiwxKSksIDApOwotICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMSwyLDIpKSwgMCk7Ci0gIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigyLDAsMCkpLCAwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDIsMCwyKSksIDApOwotICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMiwxLDEpKSwgMCk7Ci0gIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigyLDEsMikpLCAwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDIsMiwwKSksIDApOwotICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMiwyLDEpKSwgMCk7Ci0gIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigyLDIsMikpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDAsIDAsIDApKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigwLCAwLCAxKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMCwgMCwgMikpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDAsIDEsIDApKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigwLCAxLCAxKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMCwgMiwgMCkpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDAsIDIsIDIpKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigxLCAwLCAwKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMSwgMCwgMSkpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDEsIDEsIDApKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigxLCAxLCAxKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMSwgMSwgMikpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDEsIDIsIDEpKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigxLCAyLCAyKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMiwgMCwgMCkpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDIsIDAsIDIpKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigyLCAxLCAxKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMiwgMSwgMikpLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDIsIDIsIDApKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigyLCAyLCAxKSksIDApOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMiwgMiwgMikpLCAwKTsKIAotICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMCwxLDIpKSwgMSk7Ci0gIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigyLDAsMSkpLCAxKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDEsMiwwKSksIDEpOwotICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMiwxLDApKSwgLTEpOwotICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMCwyLDEpKSwgLTEpOwotICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMSwwLDIpKSwgLTEpOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMCwgMSwgMikpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDIsIDAsIDEpKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigxLCAyLCAwKSksIDEpOworICBWRVJJRllfSVNfRVFVQUwoKGVwc2lsb24oMiwgMSwgMCkpLCAtMSk7CisgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbigwLCAyLCAxKSksIC0xKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKDEsIDAsIDIpKSwgLTEpOwogCiAgIGFycmF5PEVpZ2VuOjpEZW5zZUluZGV4LCAzPiBkaW1zOwogICBkaW1zWzBdID0gMjsKQEAgLTIyMSw0MyArMjI5LDQzIEBACiAgICAgfQogICB9CiAKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMF0pLCAgICAwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMV0pLCAgMTAwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMl0pLCAgIDEwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbM10pLCAgMTEwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbNF0pLCAgIDIwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbNV0pLCAgMTIwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbNl0pLCAgICAxKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbN10pLCAgMTAxKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbOF0pLCAgIDExKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbOV0pLCAgMTExKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMTBdKSwgIDIxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMF0pLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMV0pLCAxMDApOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsyXSksIDEwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbM10pLCAxMTApOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVs0XSksIDIwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbNV0pLCAxMjApOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVs2XSksIDEpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVs3XSksIDEwMSk7CisgIFZFUklGWV9JU19FUVVBTCgodDEuZGF0YSgpWzhdKSwgMTEpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVs5XSksIDExMSk7CisgIFZFUklGWV9JU19FUVVBTCgodDEuZGF0YSgpWzEwXSksIDIxKTsKICAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMTFdKSwgMTIxKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMTJdKSwgICAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMTJdKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTCgodDEuZGF0YSgpWzEzXSksIDEwMik7Ci0gIFZFUklGWV9JU19FUVVBTCgodDEuZGF0YSgpWzE0XSksICAxMik7CisgIFZFUklGWV9JU19FUVVBTCgodDEuZGF0YSgpWzE0XSksIDEyKTsKICAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMTVdKSwgMTEyKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMTZdKSwgIDIyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMTZdKSwgMjIpOwogICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxN10pLCAxMjIpOwotICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxOF0pLCAgIDMpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsxOF0pLCAzKTsKICAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMTldKSwgMTAzKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMjBdKSwgIDEzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0MS5kYXRhKClbMjBdKSwgMTMpOwogICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsyMV0pLCAxMTMpOwotICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsyMl0pLCAgMjMpOworICBWRVJJRllfSVNfRVFVQUwoKHQxLmRhdGEoKVsyMl0pLCAyMyk7CiAgIFZFUklGWV9JU19FUVVBTCgodDEuZGF0YSgpWzIzXSksIDEyMyk7CiAKLSAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbMF0pLCAgICAwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbMV0pLCAgICAxKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbMl0pLCAgICAyKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbM10pLCAgICAzKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbNF0pLCAgIDEwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbNV0pLCAgIDExKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbNl0pLCAgIDEyKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbN10pLCAgIDEzKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbOF0pLCAgIDIwKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbOV0pLCAgIDIxKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbMTBdKSwgIDIyKTsKLSAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbMTFdKSwgIDIzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbMF0pLCAwKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbMV0pLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbMl0pLCAyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbM10pLCAzKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbNF0pLCAxMCk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzVdKSwgMTEpOworICBWRVJJRllfSVNfRVFVQUwoKHQyLmRhdGEoKVs2XSksIDEyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbN10pLCAxMyk7CisgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzhdKSwgMjApOworICBWRVJJRllfSVNfRVFVQUwoKHQyLmRhdGEoKVs5XSksIDIxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKCh0Mi5kYXRhKClbMTBdKSwgMjIpOworICBWRVJJRllfSVNfRVFVQUwoKHQyLmRhdGEoKVsxMV0pLCAyMyk7CiAgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzEyXSksIDEwMCk7CiAgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzEzXSksIDEwMSk7CiAgIFZFUklGWV9JU19FUVVBTCgodDIuZGF0YSgpWzE0XSksIDEwMik7CkBAIC0yNzIsNTIgKzI4MCw0OSBAQAogICBWRVJJRllfSVNfRVFVQUwoKHQyLmRhdGEoKVsyM10pLCAxMjMpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9hc3NpZ24oKQotewotICBUZW5zb3I8aW50LCAzPiBlcHNpbG9uKDMsMywzKTsKK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX2Fzc2lnbigpIHsKKyAgVGVuc29yPGludCwgMz4gZXBzaWxvbigzLCAzLCAzKTsKICAgZXBzaWxvbi5zZXRaZXJvKCk7Ci0gIGVwc2lsb24oMCwxLDIpID0gZXBzaWxvbigyLDAsMSkgPSBlcHNpbG9uKDEsMiwwKSA9IDE7Ci0gIGVwc2lsb24oMiwxLDApID0gZXBzaWxvbigwLDIsMSkgPSBlcHNpbG9uKDEsMCwyKSA9IC0xOworICBlcHNpbG9uKDAsIDEsIDIpID0gZXBzaWxvbigyLCAwLCAxKSA9IGVwc2lsb24oMSwgMiwgMCkgPSAxOworICBlcHNpbG9uKDIsIDEsIDApID0gZXBzaWxvbigwLCAyLCAxKSA9IGVwc2lsb24oMSwgMCwgMikgPSAtMTsKIAotICBUZW5zb3I8aW50LCAzPiBlMigzLDMsMyk7CisgIFRlbnNvcjxpbnQsIDM+IGUyKDMsIDMsIDMpOwogICBlMi5zZXRaZXJvKCk7Ci0gIFZFUklGWV9JU19FUVVBTCgoZTIoMSwyLDApKSwgMCk7CisgIFZFUklGWV9JU19FUVVBTCgoZTIoMSwgMiwgMCkpLCAwKTsKIAogICBlMiA9IGVwc2lsb247Ci0gIFZFUklGWV9JU19FUVVBTCgoZTIoMSwyLDApKSwgMSk7Ci0gIFZFUklGWV9JU19FUVVBTCgoZTIoMCwxLDIpKSwgMSk7Ci0gIFZFUklGWV9JU19FUVVBTCgoZTIoMiwwLDEpKSwgMSk7Ci0gIFZFUklGWV9JU19FUVVBTCgoZTIoMiwxLDApKSwgLTEpOwotICBWRVJJRllfSVNfRVFVQUwoKGUyKDAsMiwxKSksIC0xKTsKLSAgVkVSSUZZX0lTX0VRVUFMKChlMigxLDAsMikpLCAtMSk7CisgIFZFUklGWV9JU19FUVVBTCgoZTIoMSwgMiwgMCkpLCAxKTsKKyAgVkVSSUZZX0lTX0VRVUFMKChlMigwLCAxLCAyKSksIDEpOworICBWRVJJRllfSVNfRVFVQUwoKGUyKDIsIDAsIDEpKSwgMSk7CisgIFZFUklGWV9JU19FUVVBTCgoZTIoMiwgMSwgMCkpLCAtMSk7CisgIFZFUklGWV9JU19FUVVBTCgoZTIoMCwgMiwgMSkpLCAtMSk7CisgIFZFUklGWV9JU19FUVVBTCgoZTIoMSwgMCwgMikpLCAtMSk7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RfcmVzaXplKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfcmVzaXplKCkgewogICBUZW5zb3I8aW50LCAzPiBlcHNpbG9uOwotICBlcHNpbG9uLnJlc2l6ZSgyLDMsNyk7CisgIGVwc2lsb24ucmVzaXplKDIsIDMsIDcpOwogICBWRVJJRllfSVNfRVFVQUwoZXBzaWxvbi5kaW1lbnNpb24oMCksIDIpOwogICBWRVJJRllfSVNfRVFVQUwoZXBzaWxvbi5kaW1lbnNpb24oMSksIDMpOwogICBWRVJJRllfSVNfRVFVQUwoZXBzaWxvbi5kaW1lbnNpb24oMiksIDcpOwotICBWRVJJRllfSVNfRVFVQUwoZXBzaWxvbi5zaXplKCksIDIqMyo3KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uc2l6ZSgpLCAyICogMyAqIDcpOwogCiAgIGNvbnN0IGludCogb2xkX2RhdGEgPSBlcHNpbG9uLmRhdGEoKTsKLSAgZXBzaWxvbi5yZXNpemUoMywyLDcpOworICBlcHNpbG9uLnJlc2l6ZSgzLCAyLCA3KTsKICAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uZGltZW5zaW9uKDApLCAzKTsKICAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uZGltZW5zaW9uKDEpLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uZGltZW5zaW9uKDIpLCA3KTsKLSAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uc2l6ZSgpLCAyKjMqNyk7CisgIFZFUklGWV9JU19FUVVBTChlcHNpbG9uLnNpemUoKSwgMiAqIDMgKiA3KTsKICAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uZGF0YSgpLCBvbGRfZGF0YSk7CiAKLSAgZXBzaWxvbi5yZXNpemUoMyw1LDcpOworICBlcHNpbG9uLnJlc2l6ZSgzLCA1LCA3KTsKICAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uZGltZW5zaW9uKDApLCAzKTsKICAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uZGltZW5zaW9uKDEpLCA1KTsKICAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uZGltZW5zaW9uKDIpLCA3KTsKLSAgVkVSSUZZX0lTX0VRVUFMKGVwc2lsb24uc2l6ZSgpLCAzKjUqNyk7CisgIFZFUklGWV9JU19FUVVBTChlcHNpbG9uLnNpemUoKSwgMyAqIDUgKiA3KTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl9zaW1wbGUpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3NpbXBsZSkgewogICBDQUxMX1NVQlRFU1QodGVzdF8wZCgpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfMWQoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0XzJkKCkpOwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc3RyaWRpbmcuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc3RyaWRpbmcuY3BwCmluZGV4IGFlZmRmYTkuLjRmM2NkMGQgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N0cmlkaW5nLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zdHJpZGluZy5jcHAKQEAgLTEzLDEwICsxMyw5IEBACiAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfc3RyaWRpbmcoKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3N0cmlkaW5nKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogICBhcnJheTxwdHJkaWZmX3QsIDQ+IHN0cmlkZXM7CiAgIHN0cmlkZXNbMF0gPSAxOwpAQCAtMzYsNyArMzUsNyBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCksIG5vX3N0cmlkZShpLGosayxsKSk7CisgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLCBqLCBrLCBsKSwgbm9fc3RyaWRlKGksIGosIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTU4LDE4ICs1NywxNiBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDM7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDM7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoMippLDQqaiwyKmssMypsKSwgc3RyaWRlKGksaixrLGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKDIgKiBpLCA0ICogaiwgMiAqIGssIDMgKiBsKSwgc3RyaWRlKGksIGosIGssIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogfQogCi0KLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9zdHJpZGluZ19hc19sdmFsdWUoKQotewotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLDMsNSw3KTsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3N0YXRpYyB2b2lkIHRlc3Rfc3RyaWRpbmdfYXNfbHZhbHVlKCkgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCA3KTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwogICBhcnJheTxwdHJkaWZmX3QsIDQ+IHN0cmlkZXM7CiAgIHN0cmlkZXNbMF0gPSAyOwpAQCAtODQsNyArODEsNyBAQAogICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCksIHJlc3VsdCgyKmksNCpqLDIqaywzKmwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwpLCByZXN1bHQoMiAqIGksIDQgKiBqLCAyICogaywgMyAqIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTEwMiwxNiArOTksMTQgQEAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7ICsraikgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyArK2spIHsKICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCA3OyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwpLCByZXN1bHQyKDIqaSw0KmosMiprLDMqbCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSwgaiwgaywgbCksIHJlc3VsdDIoMiAqIGksIDQgKiBqLCAyICogaywgMyAqIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogfQogCi0KLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3Jfc3RyaWRpbmcpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3N0cmlkaW5nKSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9zdHJpZGluZzxDb2xNYWpvcj4oKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3NpbXBsZV9zdHJpZGluZzxSb3dNYWpvcj4oKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3N0cmlkaW5nX2FzX2x2YWx1ZTxDb2xNYWpvcj4oKSk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zdHJpZGluZ19zeWNsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N0cmlkaW5nX3N5Y2wuY3BwCmluZGV4IGQzYjFmYTcuLmU0ODhjMGUgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N0cmlkaW5nX3N5Y2wuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N0cmlkaW5nX3N5Y2wuY3BwCkBAIC0yOSwzMiArMjksMjYgQEAKIHVzaW5nIEVpZ2VuOjpUZW5zb3I7CiB1c2luZyBFaWdlbjo6VGVuc29yTWFwOwogCi0KIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3Rfc2ltcGxlX3N0cmlkaW5nKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkKLXsKLQotICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCA0PiB0ZW5zb3JfZGltcyA9IHt7MiwzLDUsN319OwotICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCA0PiBzdHJpZGVfZGltcyA9IHt7MSwxLDMsM319OwotCitzdGF0aWMgdm9pZCB0ZXN0X3NpbXBsZV9zdHJpZGluZyhjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKKyAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgND4gdGVuc29yX2RpbXMgPSB7ezIsIDMsIDUsIDd9fTsKKyAgRWlnZW46OmFycmF5PEluZGV4VHlwZSwgND4gc3RyaWRlX2RpbXMgPSB7ezEsIDEsIDMsIDN9fTsKIAogICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yKHRlbnNvcl9kaW1zKTsKLSAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gbm9fc3RyaWRlKHRlbnNvcl9kaW1zKTsKLSAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gc3RyaWRlKHN0cmlkZV9kaW1zKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IG5vX3N0cmlkZSh0ZW5zb3JfZGltcyk7CisgIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBzdHJpZGUoc3RyaWRlX2RpbXMpOwogCi0KLSAgc3RkOjpzaXplX3QgdGVuc29yX2J5dGVzID0gdGVuc29yLnNpemUoKSAgKiBzaXplb2YoRGF0YVR5cGUpOworICBzdGQ6OnNpemVfdCB0ZW5zb3JfYnl0ZXMgPSB0ZW5zb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKICAgc3RkOjpzaXplX3Qgbm9fc3RyaWRlX2J5dGVzID0gbm9fc3RyaWRlLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAgIHN0ZDo6c2l6ZV90IHN0cmlkZV9ieXRlcyA9IHN0cmlkZS5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSAqIGRfdGVuc29yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JfYnl0ZXMpKTsKLSAgRGF0YVR5cGUgKiBkX25vX3N0cmlkZSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUobm9fc3RyaWRlX2J5dGVzKSk7Ci0gIERhdGFUeXBlICogZF9zdHJpZGUgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHN0cmlkZV9ieXRlcykpOworICBEYXRhVHlwZSogZF90ZW5zb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcl9ieXRlcykpOworICBEYXRhVHlwZSogZF9ub19zdHJpZGUgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG5vX3N0cmlkZV9ieXRlcykpOworICBEYXRhVHlwZSogZF9zdHJpZGUgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHN0cmlkZV9ieXRlcykpOwogCiAgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiA+IGdwdV90ZW5zb3IoZF90ZW5zb3IsIHRlbnNvcl9kaW1zKTsKICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gZ3B1X25vX3N0cmlkZShkX25vX3N0cmlkZSwgdGVuc29yX2RpbXMpOwogICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiBncHVfc3RyaWRlKGRfc3RyaWRlLCBzdHJpZGVfZGltcyk7CiAKLQogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIGFycmF5PEluZGV4VHlwZSwgND4gc3RyaWRlczsKICAgc3RyaWRlc1swXSA9IDE7CkBAIC02MiwxMCArNTYsMTAgQEAKICAgc3RyaWRlc1syXSA9IDE7CiAgIHN0cmlkZXNbM10gPSAxOwogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZF90ZW5zb3IsIHRlbnNvci5kYXRhKCksIHRlbnNvcl9ieXRlcyk7Ci0gIGdwdV9ub19zdHJpZGUuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfdGVuc29yLnN0cmlkZShzdHJpZGVzKTsKKyAgZ3B1X25vX3N0cmlkZS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X3RlbnNvci5zdHJpZGUoc3RyaWRlcyk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChub19zdHJpZGUuZGF0YSgpLCBkX25vX3N0cmlkZSwgbm9fc3RyaWRlX2J5dGVzKTsKIAotICAvL25vX3N0cmlkZSA9IHRlbnNvci5zdHJpZGUoc3RyaWRlcyk7CisgIC8vIG5vX3N0cmlkZSA9IHRlbnNvci5zdHJpZGUoc3RyaWRlcyk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKG5vX3N0cmlkZS5kaW1lbnNpb24oMCksIDIpOwogICBWRVJJRllfSVNfRVFVQUwobm9fc3RyaWRlLmRpbWVuc2lvbigxKSwgMyk7CkBAIC03Niw3ICs3MCw3IEBACiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgNTsgKytrKSB7CiAgICAgICAgIGZvciAoSW5kZXhUeXBlIGwgPSAwOyBsIDwgNzsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcihpLGosayxsKSwgbm9fc3RyaWRlKGksaixrLGwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwpLCBub19zdHJpZGUoaSwgaiwgaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtODYsMTAgKzgwLDEwIEBACiAgIHN0cmlkZXNbMV0gPSA0OwogICBzdHJpZGVzWzJdID0gMjsKICAgc3RyaWRlc1szXSA9IDM7Ci0vL1RlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gc3RyaWRlOwotLy8gIHN0cmlkZSA9IHRlbnNvci5zdHJpZGUoc3RyaWRlcyk7CisgIC8vIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gc3RyaWRlOworICAvLyAgIHN0cmlkZSA9IHRlbnNvci5zdHJpZGUoc3RyaWRlcyk7CiAKLSAgZ3B1X3N0cmlkZS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV90ZW5zb3Iuc3RyaWRlKHN0cmlkZXMpOworICBncHVfc3RyaWRlLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfdGVuc29yLnN0cmlkZShzdHJpZGVzKTsKICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHN0cmlkZS5kYXRhKCksIGRfc3RyaWRlLCBzdHJpZGVfYnl0ZXMpOwogCiAgIFZFUklGWV9JU19FUVVBTChzdHJpZGUuZGltZW5zaW9uKDApLCAxKTsKQEAgLTEwMSw3ICs5NSw3IEBACiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCAxOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgMzsgKytrKSB7CiAgICAgICAgIGZvciAoSW5kZXhUeXBlIGwgPSAwOyBsIDwgMzsgKytsKSB7Ci0gICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKHRlbnNvcigyKmksNCpqLDIqaywzKmwpLCBzdHJpZGUoaSxqLGssbCkpOworICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoMiAqIGksIDQgKiBqLCAyICogaywgMyAqIGwpLCBzdHJpZGUoaSwgaiwgaywgbCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMTEzLDMxICsxMDcsMjcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotc3RhdGljIHZvaWQgdGVzdF9zdHJpZGluZ19hc19sdmFsdWUoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQotewotCi0gIEVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDQ+IHRlbnNvcl9kaW1zID0ge3syLDMsNSw3fX07Ci0gIEVpZ2VuOjphcnJheTxJbmRleFR5cGUsIDQ+IHN0cmlkZV9kaW1zID0ge3szLDEyLDEwLDIxfX07Ci0KK3N0YXRpYyB2b2lkIHRlc3Rfc3RyaWRpbmdfYXNfbHZhbHVlKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgeworICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCA0PiB0ZW5zb3JfZGltcyA9IHt7MiwgMywgNSwgN319OworICBFaWdlbjo6YXJyYXk8SW5kZXhUeXBlLCA0PiBzdHJpZGVfZGltcyA9IHt7MywgMTIsIDEwLCAyMX19OwogCiAgIFRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiB0ZW5zb3IodGVuc29yX2RpbXMpOwotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBub19zdHJpZGUoc3RyaWRlX2RpbXMpOwotICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsSW5kZXhUeXBlPiBzdHJpZGUoc3RyaWRlX2RpbXMpOworICBUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gbm9fc3RyaWRlKHN0cmlkZV9kaW1zKTsKKyAgVGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHN0cmlkZShzdHJpZGVfZGltcyk7CiAKLQotICBzdGQ6OnNpemVfdCB0ZW5zb3JfYnl0ZXMgPSB0ZW5zb3Iuc2l6ZSgpICAqIHNpemVvZihEYXRhVHlwZSk7CisgIHN0ZDo6c2l6ZV90IHRlbnNvcl9ieXRlcyA9IHRlbnNvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOwogICBzdGQ6OnNpemVfdCBub19zdHJpZGVfYnl0ZXMgPSBub19zdHJpZGUuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKICAgc3RkOjpzaXplX3Qgc3RyaWRlX2J5dGVzID0gc3RyaWRlLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CiAKLSAgRGF0YVR5cGUgKiBkX3RlbnNvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yX2J5dGVzKSk7Ci0gIERhdGFUeXBlICogZF9ub19zdHJpZGUgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG5vX3N0cmlkZV9ieXRlcykpOwotICBEYXRhVHlwZSAqIGRfc3RyaWRlID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzdHJpZGVfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfdGVuc29yID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfbm9fc3RyaWRlID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShub19zdHJpZGVfYnl0ZXMpKTsKKyAgRGF0YVR5cGUqIGRfc3RyaWRlID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShzdHJpZGVfYnl0ZXMpKTsKIAogICBFaWdlbjo6VGVuc29yTWFwPEVpZ2VuOjpUZW5zb3I8RGF0YVR5cGUsIDQsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gPiBncHVfdGVuc29yKGRfdGVuc29yLCB0ZW5zb3JfZGltcyk7CiAgIEVpZ2VuOjpUZW5zb3JNYXA8RWlnZW46OlRlbnNvcjxEYXRhVHlwZSwgNCwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiA+IGdwdV9ub19zdHJpZGUoZF9ub19zdHJpZGUsIHN0cmlkZV9kaW1zKTsKICAgRWlnZW46OlRlbnNvck1hcDxFaWdlbjo6VGVuc29yPERhdGFUeXBlLCA0LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+ID4gZ3B1X3N0cmlkZShkX3N0cmlkZSwgc3RyaWRlX2RpbXMpOwogCi0gIC8vVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0ZW5zb3IoMiwzLDUsNyk7CisgIC8vIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDIsMyw1LDcpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAgIGFycmF5PEluZGV4VHlwZSwgND4gc3RyaWRlczsKICAgc3RyaWRlc1swXSA9IDI7CkBAIC0xNDUsMTcgKzEzNSwxNyBAQAogICBzdHJpZGVzWzJdID0gMjsKICAgc3RyaWRlc1szXSA9IDM7CiAKLS8vICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHJlc3VsdCgzLCAxMiwgMTAsIDIxKTsKLS8vICByZXN1bHQuc3RyaWRlKHN0cmlkZXMpID0gdGVuc29yOworICAvLyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiByZXN1bHQoMywgMTIsIDEwLCAyMSk7CisgIC8vICByZXN1bHQuc3RyaWRlKHN0cmlkZXMpID0gdGVuc29yOwogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZF90ZW5zb3IsIHRlbnNvci5kYXRhKCksIHRlbnNvcl9ieXRlcyk7Ci0gIGdwdV9zdHJpZGUuc3RyaWRlKHN0cmlkZXMpLmRldmljZShzeWNsX2RldmljZSk9Z3B1X3RlbnNvcjsKKyAgZ3B1X3N0cmlkZS5zdHJpZGUoc3RyaWRlcykuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV90ZW5zb3I7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChzdHJpZGUuZGF0YSgpLCBkX3N0cmlkZSwgc3RyaWRlX2J5dGVzKTsKIAogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IDU7ICsraykgewogICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCksIHN0cmlkZSgyKmksNCpqLDIqaywzKmwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwpLCBzdHJpZGUoMiAqIGksIDQgKiBqLCAyICogaywgMyAqIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTE2NiwxNyArMTU2LDE3IEBACiAgIG5vX3N0cmlkZXNbMV0gPSAxOwogICBub19zdHJpZGVzWzJdID0gMTsKICAgbm9fc3RyaWRlc1szXSA9IDE7Ci0vLyAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiByZXN1bHQyKDMsIDEyLCAxMCwgMjEpOwotLy8gIHJlc3VsdDIuc3RyaWRlKHN0cmlkZXMpID0gdGVuc29yLnN0cmlkZShub19zdHJpZGVzKTsKKyAgLy8gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gcmVzdWx0MigzLCAxMiwgMTAsIDIxKTsKKyAgLy8gIHJlc3VsdDIuc3RyaWRlKHN0cmlkZXMpID0gdGVuc29yLnN0cmlkZShub19zdHJpZGVzKTsKIAotICBncHVfbm9fc3RyaWRlLnN0cmlkZShzdHJpZGVzKS5kZXZpY2Uoc3ljbF9kZXZpY2UpPWdwdV90ZW5zb3Iuc3RyaWRlKG5vX3N0cmlkZXMpOworICBncHVfbm9fc3RyaWRlLnN0cmlkZShzdHJpZGVzKS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X3RlbnNvci5zdHJpZGUobm9fc3RyaWRlcyk7CiAgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChub19zdHJpZGUuZGF0YSgpLCBkX25vX3N0cmlkZSwgbm9fc3RyaWRlX2J5dGVzKTsKIAogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IDI7ICsraSkgewogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgMzsgKytqKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IDU7ICsraykgewogICAgICAgICBmb3IgKEluZGV4VHlwZSBsID0gMDsgbCA8IDc7ICsrbCkgewotICAgICAgICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3IoaSxqLGssbCksIG5vX3N0cmlkZSgyKmksNCpqLDIqaywzKmwpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwpLCBub19zdHJpZGUoMiAqIGksIDQgKiBqLCAyICogaywgMyAqIGwpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTE4NiwxMCArMTc2LDEwIEBACiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZF9zdHJpZGUpOwogfQogCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEZXZfc2VsZWN0b3I+IHZvaWQgdGVuc29yU3RyaWRpbmdQZXJEZXZpY2UoRGV2X3NlbGVjdG9yJiBzKXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXZfc2VsZWN0b3I+Cit2b2lkIHRlbnNvclN0cmlkaW5nUGVyRGV2aWNlKERldl9zZWxlY3RvciYgcykgewogICBRdWV1ZUludGVyZmFjZSBxdWV1ZUludGVyZmFjZShzKTsKLSAgYXV0byBzeWNsX2RldmljZT1FaWdlbjo6U3ljbERldmljZSgmcXVldWVJbnRlcmZhY2UpOworICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKICAgdGVzdF9zaW1wbGVfc3RyaWRpbmc8ZmxvYXQsIENvbE1ham9yLCBpbnQ2NF90PihzeWNsX2RldmljZSk7CiAgIHRlc3Rfc2ltcGxlX3N0cmlkaW5nPGZsb2F0LCBSb3dNYWpvciwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogICB0ZXN0X3N0cmlkaW5nX2FzX2x2YWx1ZTxmbG9hdCwgQ29sTWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKQEAgLTE5Nyw3ICsxODcsNyBAQAogfQogCiBFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3N0cmlkaW5nX3N5Y2wpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOkVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CisgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogRWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKICAgICBDQUxMX1NVQlRFU1QodGVuc29yU3RyaWRpbmdQZXJEZXZpY2UoZGV2aWNlKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N1Z2FyLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N1Z2FyLmNwcAppbmRleCAyY2E1YzQ3Li45YzRkODc4MCAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc3VnYXIuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N1Z2FyLmNwcApAQCAtMiw4ICsyLDggQEAKIAogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KIAotdXNpbmcgRWlnZW46OlRlbnNvcjsKIHVzaW5nIEVpZ2VuOjpSb3dNYWpvcjsKK3VzaW5nIEVpZ2VuOjpUZW5zb3I7CiAKIHN0YXRpYyB2b2lkIHRlc3RfY29tcGFyaXNvbl9zdWdhcigpIHsKICAgLy8gd2UgYWxyZWFkeSB0cnVzdCBjb21wYXJpc29ucyBiZXR3ZWVuIHRlbnNvcnMsIHdlJ3JlIHNpbXBseSBjaGVja2luZyB0aGF0CkBAIC0xMiw5ICsxMiw5IEBACiAKICAgdC5zZXRSYW5kb20oKTsKICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lIHZhbHVlID09IDAKLSAgdCgwLDAsMCkgPSAwOworICB0KDAsIDAsIDApID0gMDsKIAotICBUZW5zb3I8Ym9vbCwwPiBiOworICBUZW5zb3I8Ym9vbCwgMD4gYjsKIAogI2RlZmluZSBURVNUX1RFTlNPUl9FUVVBTChlMSwgZTIpIFwKICAgYiA9ICgoZTEpID09IChlMikpLmFsbCgpOyAgICAgICBcCkBAIC0zMiw3ICszMiw2IEBACiAjdW5kZWYgVEVTVF9URU5TT1JfRVFVQUwKIH0KIAotCiBzdGF0aWMgdm9pZCB0ZXN0X3NjYWxhcl9zdWdhcl9hZGRfbXVsKCkgewogICBUZW5zb3I8ZmxvYXQsIDM+IEEoNiwgNywgNSk7CiAgIFRlbnNvcjxmbG9hdCwgMz4gQig2LCA3LCA1KTsKQEAgLTQ3LDcgKzQ2LDcgQEAKICAgVGVuc29yPGZsb2F0LCAzPiBTID0gQSAqIGFscGhhICsgQiAqIGJldGEgKyBnYW1tYTsKICAgVGVuc29yPGZsb2F0LCAzPiBUID0gZ2FtbWEgKyBhbHBoYSAqIEEgKyBiZXRhICogQjsKIAotICBmb3IgKGludCBpID0gMDsgaSA8IDYqNyo1OyArK2kpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA2ICogNyAqIDU7ICsraSkgewogICAgIFZFUklGWV9JU19BUFBST1goUihpKSwgUyhpKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChSKGkpLCBUKGkpKTsKICAgfQpAQCAtNjQsMTcgKzYzLDE1IEBACiAgIGNvbnN0IGZsb2F0IGdhbW1hID0gMC4xNGY7CiAgIGNvbnN0IGZsb2F0IGRlbHRhID0gMC4zMmY7CiAKLSAgVGVuc29yPGZsb2F0LCAzPiBSID0gQS5jb25zdGFudChnYW1tYSkgLSBBIC8gQS5jb25zdGFudChhbHBoYSkKLSAgICAgIC0gQi5jb25zdGFudChiZXRhKSAvIEIgLSBBLmNvbnN0YW50KGRlbHRhKTsKKyAgVGVuc29yPGZsb2F0LCAzPiBSID0gQS5jb25zdGFudChnYW1tYSkgLSBBIC8gQS5jb25zdGFudChhbHBoYSkgLSBCLmNvbnN0YW50KGJldGEpIC8gQiAtIEEuY29uc3RhbnQoZGVsdGEpOwogICBUZW5zb3I8ZmxvYXQsIDM+IFMgPSBnYW1tYSAtIEEgLyBhbHBoYSAtIGJldGEgLyBCIC0gZGVsdGE7CiAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA2KjcqNTsgKytpKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNiAqIDcgKiA1OyArK2kpIHsKICAgICBWRVJJRllfSVNfQVBQUk9YKFIoaSksIFMoaSkpOwogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3Jfc3VnYXIpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3N1Z2FyKSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X2NvbXBhcmlzb25fc3VnYXIoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3NjYWxhcl9zdWdhcl9hZGRfbXVsKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9zY2FsYXJfc3VnYXJfc3ViX2RpdigpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N5Y2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc3ljbC5jcHAKaW5kZXggZTZjNWUyMy4uODQyYTUxMCAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc3ljbC5jcHAKQEAgLTEyLDcgKzEyLDYgQEAKIC8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAogLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCiAKLQogI2RlZmluZSBFSUdFTl9URVNUX05PX0xPTkdET1VCTEUKICNkZWZpbmUgRUlHRU5fVEVTVF9OT19DT01QTEVYCiAKQEAgLTI4LDcgKzI3LDcgQEAKIHVzaW5nIEVpZ2VuOjpUZW5zb3JNYXA7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXZvaWQgdGVzdF9zeWNsX21lbV90cmFuc2ZlcnMoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7Cit2b2lkIHRlc3Rfc3ljbF9tZW1fdHJhbnNmZXJzKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICBJbmRleFR5cGUgc2l6ZURpbTEgPSA1OwogICBJbmRleFR5cGUgc2l6ZURpbTIgPSA1OwogICBJbmRleFR5cGUgc2l6ZURpbTMgPSAxOwpAQCAtNDAsMjMgKzM5LDIzIEBACiAKICAgaW4xID0gaW4xLnJhbmRvbSgpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YTEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbjEuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhMiAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG91dDEuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhMSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4xLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhMiA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0MS5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAKICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MShncHVfZGF0YTEsIHRlbnNvclJhbmdlKTsKICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1MihncHVfZGF0YTIsIHRlbnNvclJhbmdlKTsKIAotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGExLCBpbjEuZGF0YSgpLChpbjEuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhMiwgaW4xLmRhdGEoKSwoaW4xLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YTEsIGluMS5kYXRhKCksIChpbjEuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGEyLCBpbjEuZGF0YSgpLCAoaW4xLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgZ3B1MS5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1MSAqIDMuMTRmOwogICBncHUyLmRldmljZShzeWNsX2RldmljZSkgPSBncHUyICogMi43ZjsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dDEuZGF0YSgpLCBncHVfZGF0YTEsKG91dDEuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dDIuZGF0YSgpLCBncHVfZGF0YTEsKG91dDIuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dDMuZGF0YSgpLCBncHVfZGF0YTIsKG91dDMuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dDEuZGF0YSgpLCBncHVfZGF0YTEsIChvdXQxLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dDIuZGF0YSgpLCBncHVfZGF0YTEsIChvdXQyLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dDMuZGF0YSgpLCBncHVfZGF0YTIsIChvdXQzLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgc3ljbF9kZXZpY2Uuc3luY2hyb25pemUoKTsKIAogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IGluMS5zaXplKCk7ICsraSkgewotICAvLyAgc3RkOjpjb3V0IDw8ICJTWUNMIERBVEEgOiAiIDw8IG91dDEoaSkgPDwgIiAgdnMgIENQVSBEQVRBIDogIiA8PCBpbjEoaSkgKiAzLjE0ZiA8PCAiXG4iOworICAgIC8vICBzdGQ6OmNvdXQgPDwgIlNZQ0wgREFUQSA6ICIgPDwgb3V0MShpKSA8PCAiICB2cyAgQ1BVIERBVEEgOiAiIDw8IGluMShpKSAqIDMuMTRmIDw8ICJcbiI7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQxKGkpLCBpbjEoaSkgKiAzLjE0Zik7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQyKGkpLCBpbjEoaSkgKiAzLjE0Zik7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQzKGkpLCBpbjEoaSkgKiAyLjdmKTsKQEAgLTY3LDcgKzY2LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCBpbnQgRGF0YUxheW91dCwgdHlwZW5hbWUgSW5kZXhUeXBlPgotdm9pZCB0ZXN0X3N5Y2xfbWVtX3N5bmMoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7Cit2b2lkIHRlc3Rfc3ljbF9tZW1fc3luYyhjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemUgPSAyMDsKICAgYXJyYXk8SW5kZXhUeXBlLCAxPiB0ZW5zb3JSYW5nZSA9IHt7c2l6ZX19OwogICBUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW4xKHRlbnNvclJhbmdlKTsKQEAgLTc3LDE0ICs3NiwxNCBAQAogICBpbjEgPSBpbjEucmFuZG9tKCk7CiAgIGluMiA9IGluMTsKIAotICBEYXRhVHlwZSogZ3B1X2RhdGEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbjEuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbjEuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOwogCiAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdTEoZ3B1X2RhdGEsIHRlbnNvclJhbmdlKTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhLCBpbjEuZGF0YSgpLChpbjEuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhLCBpbjEuZGF0YSgpLCAoaW4xLnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgc3ljbF9kZXZpY2Uuc3luY2hyb25pemUoKTsKICAgaW4xLnNldFplcm8oKTsKIAotICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X2RhdGEsIG91dC5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfZGF0YSwgb3V0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBzeWNsX2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgaW4xLnNpemUoKTsgKytpKSB7CkBAIC05NSw3ICs5NCw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXZvaWQgdGVzdF9zeWNsX21lbV9zeW5jX29mZnNldHMoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7Cit2b2lkIHRlc3Rfc3ljbF9tZW1fc3luY19vZmZzZXRzKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSkgewogICB1c2luZyB0ZW5zb3JfdHlwZSA9IFRlbnNvcjxEYXRhVHlwZSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPjsKICAgSW5kZXhUeXBlIGZ1bGxfc2l6ZSA9IDMyOwogICBJbmRleFR5cGUgaGFsZl9zaXplID0gZnVsbF9zaXplIC8gMjsKQEAgLTEwMyw3ICsxMDIsNyBAQAogICB0ZW5zb3JfdHlwZSBpbjEodGVuc29yUmFuZ2UpOwogICB0ZW5zb3JfdHlwZSBvdXQodGVuc29yUmFuZ2UpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGZ1bGxfc2l6ZSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShmdWxsX3NpemUgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAgIFRlbnNvck1hcDx0ZW5zb3JfdHlwZT4gZ3B1MShncHVfZGF0YSwgdGVuc29yUmFuZ2UpOwogCiAgIGluMSA9IGluMS5yYW5kb20oKTsKQEAgLTEzMSw3ICsxMzAsNyBAQAogCiAgIGluMSA9IGluMS5yYW5kb20oKTsKICAgb3V0LnNldFplcm8oKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX291dCAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGZ1bGxfc2l6ZSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX291dCA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoZnVsbF9zaXplICogc2l6ZW9mKERhdGFUeXBlKSkpOwogICBUZW5zb3JNYXA8dGVuc29yX3R5cGU+IGdwdTIoZ3B1X2RhdGFfb3V0LCB0ZW5zb3JSYW5nZSk7CiAgIC8vIENvcHkgYWxsIHRvIGRldmljZSwgcGVybXV0ZSBjb3BpZXMgb24gZGV2aWNlLCB0aGVuIGNvcHkgYWxsIGJhY2sgdG8gaG9zdAogICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGEsIGluMS5kYXRhKCksIGZ1bGxfc2l6ZSAqIHNpemVvZihEYXRhVHlwZSkpOwpAQCAtMTQ5LDcgKzE0OCw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXZvaWQgdGVzdF9zeWNsX21lbXNldF9vZmZzZXRzKGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlICZzeWNsX2RldmljZSkgewordm9pZCB0ZXN0X3N5Y2xfbWVtc2V0X29mZnNldHMoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKSB7CiAgIHVzaW5nIHRlbnNvcl90eXBlID0gVGVuc29yPERhdGFUeXBlLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+OwogICBJbmRleFR5cGUgZnVsbF9zaXplID0gMzI7CiAgIEluZGV4VHlwZSBoYWxmX3NpemUgPSBmdWxsX3NpemUgLyAyOwpAQCAtMTYyLDcgKzE2MSw3IEBACiAgIHN0ZDo6bWVtc2V0KGNwdV9vdXQuZGF0YSgpLCAwLCBoYWxmX3NpemUgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgc3RkOjptZW1zZXQoY3B1X291dC5kYXRhKCkgKyBoYWxmX3NpemUsIDEsIGhhbGZfc2l6ZSAqIHNpemVvZihEYXRhVHlwZSkpOwogCi0gIERhdGFUeXBlKiBncHVfZGF0YSAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGZ1bGxfc2l6ZSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShmdWxsX3NpemUgKiBzaXplb2YoRGF0YVR5cGUpKSk7CiAgIFRlbnNvck1hcDx0ZW5zb3JfdHlwZT4gZ3B1MShncHVfZGF0YSwgdGVuc29yUmFuZ2UpOwogCiAgIHN5Y2xfZGV2aWNlLm1lbXNldChncHVfZGF0YSwgMCwgaGFsZl9zaXplICogc2l6ZW9mKERhdGFUeXBlKSk7CkBAIC0xNzcsMjQgKzE3NiwyMyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+Ci12b2lkIHRlc3Rfc3ljbF9jb21wdXRhdGlvbnMoY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UgJnN5Y2xfZGV2aWNlKSB7Ci0KK3ZvaWQgdGVzdF9zeWNsX2NvbXB1dGF0aW9ucyhjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgSW5kZXhUeXBlIHNpemVEaW0xID0gMTAwOwogICBJbmRleFR5cGUgc2l6ZURpbTIgPSAxMDsKICAgSW5kZXhUeXBlIHNpemVEaW0zID0gMjA7CiAgIGFycmF5PEluZGV4VHlwZSwgMz4gdGVuc29yUmFuZ2UgPSB7e3NpemVEaW0xLCBzaXplRGltMiwgc2l6ZURpbTN9fTsKLSAgVGVuc29yPERhdGFUeXBlLCAzLERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW4xKHRlbnNvclJhbmdlKTsKLSAgVGVuc29yPERhdGFUeXBlLCAzLERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW4yKHRlbnNvclJhbmdlKTsKLSAgVGVuc29yPERhdGFUeXBlLCAzLERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW4zKHRlbnNvclJhbmdlKTsKLSAgVGVuc29yPERhdGFUeXBlLCAzLERhdGFMYXlvdXQsIEluZGV4VHlwZT4gb3V0KHRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IGluMSh0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgMywgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBpbjIodGVuc29yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDMsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW4zKHRlbnNvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IG91dCh0ZW5zb3JSYW5nZSk7CiAKICAgaW4yID0gaW4yLnJhbmRvbSgpOwogICBpbjMgPSBpbjMucmFuZG9tKCk7CiAKLSAgRGF0YVR5cGUgKiBncHVfaW4xX2RhdGEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbjEuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUgKiBncHVfaW4yX2RhdGEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbjIuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUgKiBncHVfaW4zX2RhdGEgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShpbjMuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgRGF0YVR5cGUgKiBncHVfb3V0X2RhdGEgPSAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShvdXQuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9pbjFfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4xLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9pbjJfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9pbjNfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4zLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9vdXRfZGF0YSA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0LnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKIAogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfaW4xKGdwdV9pbjFfZGF0YSwgdGVuc29yUmFuZ2UpOwogICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCAzLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfaW4yKGdwdV9pbjJfZGF0YSwgdGVuc29yUmFuZ2UpOwpAQCAtMjAzLDEzICsyMDEsMTMgQEAKIAogICAvLy8gYT0xLjJmCiAgIGdwdV9pbjEuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9pbjEuY29uc3RhbnQoMS4yZik7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChpbjEuZGF0YSgpLCBncHVfaW4xX2RhdGEgLChpbjEuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGluMS5kYXRhKCksIGdwdV9pbjFfZGF0YSwgKGluMS5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIHN5Y2xfZGV2aWNlLnN5bmNocm9uaXplKCk7CiAKICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCBzaXplRGltMTsgKytpKSB7CiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCBzaXplRGltMjsgKytqKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IHNpemVEaW0zOyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChpbjEoaSxqLGspLCAxLjJmKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChpbjEoaSwgaiwgayksIDEuMmYpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMjE3LDMxICsyMTUsMjggQEAKIAogICAvLy8gYT1iKjEuMmYKICAgZ3B1X291dC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2luMSAqIDEuMmY7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfb3V0X2RhdGEgLChvdXQuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9vdXRfZGF0YSwgKG91dC5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIHN5Y2xfZGV2aWNlLnN5bmNocm9uaXplKCk7CiAKICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCBzaXplRGltMTsgKytpKSB7CiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCBzaXplRGltMjsgKytqKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IHNpemVEaW0zOyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluMShpLGosaykgKiAxLjJmKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiwgayksIGluMShpLCBqLCBrKSAqIDEuMmYpOwogICAgICAgfQogICAgIH0KICAgfQogICBwcmludGYoImE9YioxLjJmIFRlc3QgUGFzc2VkXG4iKTsKIAogICAvLy8gYz1hKmIKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjJfZGF0YSwgaW4yLmRhdGEoKSwoaW4yLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW4yX2RhdGEsIGluMi5kYXRhKCksIChpbjIuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW4xICogZ3B1X2luMjsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9vdXRfZGF0YSwob3V0LnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfb3V0X2RhdGEsIChvdXQuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBzeWNsX2RldmljZS5zeW5jaHJvbml6ZSgpOwogCiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgc2l6ZURpbTE7ICsraSkgewogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgc2l6ZURpbTI7ICsraikgewogICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCBzaXplRGltMzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksaixrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbjEoaSxqLGspICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yKGksaixrKSk7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksIGosIGspLCBpbjEoaSwgaiwgaykgKiBpbjIoaSwgaiwgaykpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMjQ5LDE0ICsyNDQsMTIgQEAKIAogICAvLy8gYz1hK2IKICAgZ3B1X291dC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2luMSArIGdwdV9pbjI7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfb3V0X2RhdGEsKG91dC5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X291dF9kYXRhLCAob3V0LnNpemUoKSkgKiBzaXplb2YoRGF0YVR5cGUpKTsKICAgc3ljbF9kZXZpY2Uuc3luY2hyb25pemUoKTsKICAgZm9yIChJbmRleFR5cGUgaSA9IDA7IGkgPCBzaXplRGltMTsgKytpKSB7CiAgICAgZm9yIChJbmRleFR5cGUgaiA9IDA7IGogPCBzaXplRGltMjsgKytqKSB7CiAgICAgICBmb3IgKEluZGV4VHlwZSBrID0gMDsgayA8IHNpemVEaW0zOyArK2spIHsKLSAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSxqLGspLAotICAgICAgICAgICAgICAgICAgICAgICAgIGluMShpLGosaykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjIoaSxqLGspKTsKKyAgICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSwgaiwgayksIGluMShpLCBqLCBrKSArIGluMihpLCBqLCBrKSk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0yNjQsNDUgKzI1NywzOSBAQAogCiAgIC8vLyBjPWEqYQogICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW4xICogZ3B1X2luMTsKLSAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9vdXRfZGF0YSwob3V0LnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfb3V0X2RhdGEsIChvdXQuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBzeWNsX2RldmljZS5zeW5jaHJvbml6ZSgpOwogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IHNpemVEaW0xOyArK2kpIHsKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IHNpemVEaW0yOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgc2l6ZURpbTM7ICsraykgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLGosayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW4xKGksaixrKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMShpLGosaykpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLCBqLCBrKSwgaW4xKGksIGosIGspICogaW4xKGksIGosIGspKTsKICAgICAgIH0KICAgICB9CiAgIH0KICAgcHJpbnRmKCJjPSBhKmEgVGVzdCBQYXNzZWRcbiIpOwogCi0gIC8vYSozLjE0ZiArIGIqMi43ZgotICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPSAgZ3B1X2luMSAqIGdwdV9pbjEuY29uc3RhbnQoMy4xNGYpICsgZ3B1X2luMiAqIGdwdV9pbjIuY29uc3RhbnQoMi43Zik7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLGdwdV9vdXRfZGF0YSwob3V0LnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIC8vIGEqMy4xNGYgKyBiKjIuN2YKKyAgZ3B1X291dC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2luMSAqIGdwdV9pbjEuY29uc3RhbnQoMy4xNGYpICsgZ3B1X2luMiAqIGdwdV9pbjIuY29uc3RhbnQoMi43Zik7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfb3V0X2RhdGEsIChvdXQuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOwogICBzeWNsX2RldmljZS5zeW5jaHJvbml6ZSgpOwogICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IHNpemVEaW0xOyArK2kpIHsKICAgICBmb3IgKEluZGV4VHlwZSBqID0gMDsgaiA8IHNpemVEaW0yOyArK2opIHsKICAgICAgIGZvciAoSW5kZXhUeXBlIGsgPSAwOyBrIDwgc2l6ZURpbTM7ICsraykgewotICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLGosayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW4xKGksaixrKSAqIDMuMTRmCi0gICAgICAgICAgICAgICAgICAgICAgICsgaW4yKGksaixrKSAqIDIuN2YpOworICAgICAgICBWRVJJRllfSVNfQVBQUk9YKG91dChpLCBqLCBrKSwgaW4xKGksIGosIGspICogMy4xNGYgKyBpbjIoaSwgaiwgaykgKiAyLjdmKTsKICAgICAgIH0KICAgICB9CiAgIH0KICAgcHJpbnRmKCJhKjMuMTRmICsgYioyLjdmIFRlc3QgUGFzc2VkXG4iKTsKIAotICAvLy9kPSAoYT4wLjU/IGI6YykKLSAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbjNfZGF0YSwgaW4zLmRhdGEoKSwoaW4zLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7Ci0gIGdwdV9vdXQuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9KGdwdV9pbjEgPiBncHVfaW4xLmNvbnN0YW50KDAuNWYpKS5zZWxlY3QoZ3B1X2luMiwgZ3B1X2luMyk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChvdXQuZGF0YSgpLCBncHVfb3V0X2RhdGEsKG91dC5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOworICAvLy8gZD0gKGE+MC41PyBiOmMpCisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfaW4zX2RhdGEsIGluMy5kYXRhKCksIChpbjMuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPSAoZ3B1X2luMSA+IGdwdV9pbjEuY29uc3RhbnQoMC41ZikpLnNlbGVjdChncHVfaW4yLCBncHVfaW4zKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9vdXRfZGF0YSwgKG91dC5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAgIHN5Y2xfZGV2aWNlLnN5bmNocm9uaXplKCk7CiAgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgc2l6ZURpbTE7ICsraSkgewogICAgIGZvciAoSW5kZXhUeXBlIGogPSAwOyBqIDwgc2l6ZURpbTI7ICsraikgewogICAgICAgZm9yIChJbmRleFR5cGUgayA9IDA7IGsgPCBzaXplRGltMzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksIGosIGspLCAoaW4xKGksIGosIGspID4gMC41ZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW4yKGksIGosIGspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGluMyhpLCBqLCBrKSk7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksIGosIGspLCAoaW4xKGksIGosIGspID4gMC41ZikgPyBpbjIoaSwgaiwgaykgOiBpbjMoaSwgaiwgaykpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMzEyLDM0ICsyOTksMzQgQEAKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW4zX2RhdGEpOwogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9vdXRfZGF0YSk7CiB9Ci10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXIxLCB0eXBlbmFtZSBTY2FsYXIyLCAgaW50IERhdGFMYXlvdXQsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3Rfc3ljbF9jYXN0KGNvbnN0IEVpZ2VuOjpTeWNsRGV2aWNlJiBzeWNsX2RldmljZSl7Ci0gICAgSW5kZXhUeXBlIHNpemUgPSAyMDsKLSAgICBhcnJheTxJbmRleFR5cGUsIDE+IHRlbnNvclJhbmdlID0ge3tzaXplfX07Ci0gICAgVGVuc29yPFNjYWxhcjEsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gaW4odGVuc29yUmFuZ2UpOwotICAgIFRlbnNvcjxTY2FsYXIyLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IG91dCh0ZW5zb3JSYW5nZSk7Ci0gICAgVGVuc29yPFNjYWxhcjIsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gb3V0X2hvc3QodGVuc29yUmFuZ2UpOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcjEsIHR5cGVuYW1lIFNjYWxhcjIsIGludCBEYXRhTGF5b3V0LCB0eXBlbmFtZSBJbmRleFR5cGU+CitzdGF0aWMgdm9pZCB0ZXN0X3N5Y2xfY2FzdChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKKyAgSW5kZXhUeXBlIHNpemUgPSAyMDsKKyAgYXJyYXk8SW5kZXhUeXBlLCAxPiB0ZW5zb3JSYW5nZSA9IHt7c2l6ZX19OworICBUZW5zb3I8U2NhbGFyMSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBpbih0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxTY2FsYXIyLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IG91dCh0ZW5zb3JSYW5nZSk7CisgIFRlbnNvcjxTY2FsYXIyLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IG91dF9ob3N0KHRlbnNvclJhbmdlKTsKIAotICAgIGluID0gaW4ucmFuZG9tKCk7CisgIGluID0gaW4ucmFuZG9tKCk7CiAKLSAgICBTY2FsYXIxKiBncHVfaW5fZGF0YSAgPSBzdGF0aWNfY2FzdDxTY2FsYXIxKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUoaW4uc2l6ZSgpKnNpemVvZihTY2FsYXIxKSkpOwotICAgIFNjYWxhcjIgKiBncHVfb3V0X2RhdGEgPSAgc3RhdGljX2Nhc3Q8U2NhbGFyMio+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKG91dC5zaXplKCkqc2l6ZW9mKFNjYWxhcjIpKSk7CisgIFNjYWxhcjEqIGdwdV9pbl9kYXRhID0gc3RhdGljX2Nhc3Q8U2NhbGFyMSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKGluLnNpemUoKSAqIHNpemVvZihTY2FsYXIxKSkpOworICBTY2FsYXIyKiBncHVfb3V0X2RhdGEgPSBzdGF0aWNfY2FzdDxTY2FsYXIyKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUob3V0LnNpemUoKSAqIHNpemVvZihTY2FsYXIyKSkpOwogCi0gICAgVGVuc29yTWFwPFRlbnNvcjxTY2FsYXIxLCAxLCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfaW4oZ3B1X2luX2RhdGEsIHRlbnNvclJhbmdlKTsKLSAgICBUZW5zb3JNYXA8VGVuc29yPFNjYWxhcjIsIDEsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4+IGdwdV9vdXQoZ3B1X291dF9kYXRhLCB0ZW5zb3JSYW5nZSk7Ci0gICAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksKGluLnNpemUoKSkqc2l6ZW9mKFNjYWxhcjEpKTsKLSAgICBncHVfb3V0LmRldmljZShzeWNsX2RldmljZSkgPSBncHVfaW4uIHRlbXBsYXRlIGNhc3Q8U2NhbGFyMj4oKTsKLSAgICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3Qob3V0LmRhdGEoKSwgZ3B1X291dF9kYXRhLCBvdXQuc2l6ZSgpKnNpemVvZihTY2FsYXIyKSk7Ci0gICAgb3V0X2hvc3QgPSBpbi4gdGVtcGxhdGUgY2FzdDxTY2FsYXIyPigpOwotICAgIGZvcihJbmRleFR5cGUgaT0wOyBpPCBzaXplOyBpKyspCi0gICAgewotICAgICAgVkVSSUZZX0lTX0FQUFJPWChvdXQoaSksIG91dF9ob3N0KGkpKTsKLSAgICB9Ci0gICAgcHJpbnRmKCJjYXN0IFRlc3QgUGFzc2VkXG4iKTsKLSAgICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9pbl9kYXRhKTsKLSAgICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9vdXRfZGF0YSk7CisgIFRlbnNvck1hcDxUZW5zb3I8U2NhbGFyMSwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X2luKGdwdV9pbl9kYXRhLCB0ZW5zb3JSYW5nZSk7CisgIFRlbnNvck1hcDxUZW5zb3I8U2NhbGFyMiwgMSwgRGF0YUxheW91dCwgSW5kZXhUeXBlPj4gZ3B1X291dChncHVfb3V0X2RhdGEsIHRlbnNvclJhbmdlKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9pbl9kYXRhLCBpbi5kYXRhKCksIChpbi5zaXplKCkpICogc2l6ZW9mKFNjYWxhcjEpKTsKKyAgZ3B1X291dC5kZXZpY2Uoc3ljbF9kZXZpY2UpID0gZ3B1X2luLnRlbXBsYXRlIGNhc3Q8U2NhbGFyMj4oKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KG91dC5kYXRhKCksIGdwdV9vdXRfZGF0YSwgb3V0LnNpemUoKSAqIHNpemVvZihTY2FsYXIyKSk7CisgIG91dF9ob3N0ID0gaW4udGVtcGxhdGUgY2FzdDxTY2FsYXIyPigpOworICBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIFZFUklGWV9JU19BUFBST1gob3V0KGkpLCBvdXRfaG9zdChpKSk7CisgIH0KKyAgcHJpbnRmKCJjYXN0IFRlc3QgUGFzc2VkXG4iKTsKKyAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfaW5fZGF0YSk7CisgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X291dF9kYXRhKTsKIH0KLXRlbXBsYXRlPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBkZXZfU2VsZWN0b3I+IHZvaWQgc3ljbF9jb21wdXRpbmdfdGVzdF9wZXJfZGV2aWNlKGRldl9TZWxlY3RvciBzKXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgZGV2X1NlbGVjdG9yPgordm9pZCBzeWNsX2NvbXB1dGluZ190ZXN0X3Blcl9kZXZpY2UoZGV2X1NlbGVjdG9yIHMpIHsKICAgUXVldWVJbnRlcmZhY2UgcXVldWVJbnRlcmZhY2Uocyk7CiAgIGF1dG8gc3ljbF9kZXZpY2UgPSBFaWdlbjo6U3ljbERldmljZSgmcXVldWVJbnRlcmZhY2UpOwogICB0ZXN0X3N5Y2xfbWVtX3RyYW5zZmVyczxEYXRhVHlwZSwgUm93TWFqb3IsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKQEAgLTM1NSw3ICszNDIsNyBAQAogfQogCiBFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3N5Y2wpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOkVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CisgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogRWlnZW46OmdldF9zeWNsX3N1cHBvcnRlZF9kZXZpY2VzKCkpIHsKICAgICBDQUxMX1NVQlRFU1Qoc3ljbF9jb21wdXRpbmdfdGVzdF9wZXJfZGV2aWNlPGZsb2F0PihkZXZpY2UpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc3ltbWV0cnkuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfc3ltbWV0cnkuY3BwCmluZGV4IGZlZDI2OWEuLjE2MTczYjkgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3N5bW1ldHJ5LmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl9zeW1tZXRyeS5jcHAKQEAgLTE1LDQ1ICsxNSw0MiBAQAogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxzZXQ+CiAKLXVzaW5nIEVpZ2VuOjpUZW5zb3I7Ci11c2luZyBFaWdlbjo6U0dyb3VwOwordXNpbmcgRWlnZW46OkFudGlIZXJtaXRpY2l0eTsKK3VzaW5nIEVpZ2VuOjpBbnRpU3ltbWV0cnk7CiB1c2luZyBFaWdlbjo6RHluYW1pY1NHcm91cDsKK3VzaW5nIEVpZ2VuOjpIZXJtaXRpY2l0eTsKK3VzaW5nIEVpZ2VuOjpTR3JvdXA7CiB1c2luZyBFaWdlbjo6U3RhdGljU0dyb3VwOwogdXNpbmcgRWlnZW46OlN5bW1ldHJ5OwotdXNpbmcgRWlnZW46OkFudGlTeW1tZXRyeTsKLXVzaW5nIEVpZ2VuOjpIZXJtaXRpY2l0eTsKLXVzaW5nIEVpZ2VuOjpBbnRpSGVybWl0aWNpdHk7Cit1c2luZyBFaWdlbjo6VGVuc29yOwogCi11c2luZyBFaWdlbjo6TmVnYXRpb25GbGFnOwogdXNpbmcgRWlnZW46OkNvbmp1Z2F0aW9uRmxhZzsKLXVzaW5nIEVpZ2VuOjpHbG9iYWxaZXJvRmxhZzsKLXVzaW5nIEVpZ2VuOjpHbG9iYWxSZWFsRmxhZzsKIHVzaW5nIEVpZ2VuOjpHbG9iYWxJbWFnRmxhZzsKK3VzaW5nIEVpZ2VuOjpHbG9iYWxSZWFsRmxhZzsKK3VzaW5nIEVpZ2VuOjpHbG9iYWxaZXJvRmxhZzsKK3VzaW5nIEVpZ2VuOjpOZWdhdGlvbkZsYWc7CiAKIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbXBpbGVyIGludGFudGlhdGVkIGEgc3RhdGljCiAvLyBvciBkeW5hbWljIHN5bW1ldHJ5IGdyb3VwCi10ZW1wbGF0ZTx0eXBlbmFtZS4uLiBTeW0+Ci1ib29sIGlzRHluR3JvdXAoU3RhdGljU0dyb3VwPFN5bS4uLj4gY29uc3QmIGR1bW15KQotewordGVtcGxhdGUgPHR5cGVuYW1lLi4uIFN5bT4KK2Jvb2wgaXNEeW5Hcm91cChTdGF0aWNTR3JvdXA8U3ltLi4uPiBjb25zdCYgZHVtbXkpIHsKICAgKHZvaWQpZHVtbXk7CiAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBpc0R5bkdyb3VwKER5bmFtaWNTR3JvdXAgY29uc3QmIGR1bW15KQoteworYm9vbCBpc0R5bkdyb3VwKER5bmFtaWNTR3JvdXAgY29uc3QmIGR1bW15KSB7CiAgICh2b2lkKWR1bW15OwogICByZXR1cm4gdHJ1ZTsKIH0KIAogLy8gaGVscGVyIGNsYXNzIGZvciBjaGVja2luZyB0aGF0IHRoZSBzeW1tZXRyeSBncm91cHMgYXJlIGNvcnJlY3QKIHN0cnVjdCBjaGVja0lkeCB7Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIEFyclR5cGU+Ci0gIHN0YXRpYyBpbmxpbmUgaW50IGRvQ2hlY2tfKEFyclR5cGUgZSwgaW50IGZsYWdzLCBpbnQgZHVtbXksIHN0ZDo6c2V0PHVpbnQ2NF90PiYgZm91bmQsIHN0ZDo6bWFwPHVpbnQ2NF90LCBpbnQ+IGNvbnN0JiBleHBlY3RlZCkKLSAgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJyVHlwZT4KKyAgc3RhdGljIGlubGluZSBpbnQgZG9DaGVja18oQXJyVHlwZSBlLCBpbnQgZmxhZ3MsIGludCBkdW1teSwgc3RkOjpzZXQ8dWludDY0X3Q+JiBmb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIGludD4gY29uc3QmIGV4cGVjdGVkKSB7CiAgICAgLy8gdXNlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdmFsdWUKICAgICB1aW50NjRfdCB2YWx1ZSA9IGVbMF07Ci0gICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMTsgaSA8IGUuc2l6ZSgpOyBpKyspCi0gICAgICB2YWx1ZSA9IHZhbHVlICogMTAgKyBlW2ldOworICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDE7IGkgPCBlLnNpemUoKTsgaSsrKSB2YWx1ZSA9IHZhbHVlICogMTAgKyBlW2ldOwogCiAgICAgLy8gd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBmaW5kIGVhY2ggZWxlbWVudAogICAgIGF1dG8gaXQgPSBleHBlY3RlZC5maW5kKHZhbHVlKTsKQEAgLTY5LDM2ICs2NiwzMiBAQAogICAgIHJldHVybiBkdW1teTsKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgaW50IHJ1bihzdGQ6OnZlY3RvcjxpbnQ+IGUsIGludCBmbGFncywgaW50IGR1bW15LCBzdGQ6OnNldDx1aW50NjRfdD4mIGZvdW5kLCBzdGQ6Om1hcDx1aW50NjRfdCwgaW50PiBjb25zdCYgZXhwZWN0ZWQpCi0gIHsKKyAgc3RhdGljIGlubGluZSBpbnQgcnVuKHN0ZDo6dmVjdG9yPGludD4gZSwgaW50IGZsYWdzLCBpbnQgZHVtbXksIHN0ZDo6c2V0PHVpbnQ2NF90PiYgZm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDx1aW50NjRfdCwgaW50PiBjb25zdCYgZXhwZWN0ZWQpIHsKICAgICByZXR1cm4gZG9DaGVja18oZSwgZmxhZ3MsIGR1bW15LCBmb3VuZCwgZXhwZWN0ZWQpOwogICB9CiAKLSAgdGVtcGxhdGU8c3RkOjpzaXplX3QgTj4KLSAgc3RhdGljIGlubGluZSBpbnQgcnVuKHN0ZDo6YXJyYXk8aW50LCBOPiBlLCBpbnQgZmxhZ3MsIGludCBkdW1teSwgc3RkOjpzZXQ8dWludDY0X3Q+JiBmb3VuZCwgc3RkOjptYXA8dWludDY0X3QsIGludD4gY29uc3QmIGV4cGVjdGVkKQotICB7CisgIHRlbXBsYXRlIDxzdGQ6OnNpemVfdCBOPgorICBzdGF0aWMgaW5saW5lIGludCBydW4oc3RkOjphcnJheTxpbnQsIE4+IGUsIGludCBmbGFncywgaW50IGR1bW15LCBzdGQ6OnNldDx1aW50NjRfdD4mIGZvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIGludD4gY29uc3QmIGV4cGVjdGVkKSB7CiAgICAgcmV0dXJuIGRvQ2hlY2tfKGUsIGZsYWdzLCBkdW1teSwgZm91bmQsIGV4cGVjdGVkKTsKICAgfQogfTsKIAotc3RhdGljIHZvaWQgdGVzdF9zeW1ncm91cHNfc3RhdGljKCkKLXsKLSAgc3RkOjphcnJheTxpbnQsIDc+IGlkZW50aXR5e3swLDEsMiwzLDQsNSw2fX07CitzdGF0aWMgdm9pZCB0ZXN0X3N5bWdyb3Vwc19zdGF0aWMoKSB7CisgIHN0ZDo6YXJyYXk8aW50LCA3PiBpZGVudGl0eXt7MCwgMSwgMiwgMywgNCwgNSwgNn19OwogCiAgIC8vIFNpbXBsZSBzdGF0aWMgc3ltbWV0cnkgZ3JvdXAKLSAgU3RhdGljU0dyb3VwPAotICAgIEFudGlTeW1tZXRyeTwwLDE+LAotICAgIEhlcm1pdGljaXR5PDAsMj4KLSAgPiBncm91cDsKKyAgU3RhdGljU0dyb3VwPEFudGlTeW1tZXRyeTwwLCAxPiwgSGVybWl0aWNpdHk8MCwgMj4+IGdyb3VwOwogCiAgIHN0ZDo6c2V0PHVpbnQ2NF90PiBmb3VuZDsKICAgc3RkOjptYXA8dWludDY0X3QsIGludD4gZXhwZWN0ZWQ7Ci0gIGV4cGVjdGVkWyAxMjM0NTZdID0gMDsKKyAgZXhwZWN0ZWRbMTIzNDU2XSA9IDA7CiAgIGV4cGVjdGVkWzEwMjM0NTZdID0gTmVnYXRpb25GbGFnOwogICBleHBlY3RlZFsyMTAzNDU2XSA9IENvbmp1Z2F0aW9uRmxhZzsKICAgZXhwZWN0ZWRbMTIwMzQ1Nl0gPSBDb25qdWdhdGlvbkZsYWcgfCBOZWdhdGlvbkZsYWc7CiAgIGV4cGVjdGVkWzIwMTM0NTZdID0gQ29uanVnYXRpb25GbGFnIHwgTmVnYXRpb25GbGFnOwotICBleHBlY3RlZFsgMjEzNDU2XSA9IENvbmp1Z2F0aW9uRmxhZzsKKyAgZXhwZWN0ZWRbMjEzNDU2XSA9IENvbmp1Z2F0aW9uRmxhZzsKIAogICBWRVJJRllfSVNfRVFVQUwoZ3JvdXAuc2l6ZSgpLCA2dSk7CiAgIFZFUklGWV9JU19FUVVBTChncm91cC5nbG9iYWxGbGFncygpLCBHbG9iYWxJbWFnRmxhZyk7CkBAIC0xMDYsMjggKzk5LDI2IEBACiAgIFZFUklGWV9JU19FUVVBTChmb3VuZC5zaXplKCksIDZ1KTsKIH0KIAotc3RhdGljIHZvaWQgdGVzdF9zeW1ncm91cHNfZHluYW1pYygpCi17CitzdGF0aWMgdm9pZCB0ZXN0X3N5bWdyb3Vwc19keW5hbWljKCkgewogICBzdGQ6OnZlY3RvcjxpbnQ+IGlkZW50aXR5OwotICBmb3IgKGludCBpID0gMDsgaSA8PSA2OyBpKyspCi0gICAgaWRlbnRpdHkucHVzaF9iYWNrKGkpOworICBmb3IgKGludCBpID0gMDsgaSA8PSA2OyBpKyspIGlkZW50aXR5LnB1c2hfYmFjayhpKTsKIAogICAvLyBTaW1wbGUgZHluYW1pYyBzeW1tZXRyeSBncm91cAogICBEeW5hbWljU0dyb3VwIGdyb3VwOwotICBncm91cC5hZGQoMCwxLE5lZ2F0aW9uRmxhZyk7Ci0gIGdyb3VwLmFkZCgwLDIsQ29uanVnYXRpb25GbGFnKTsKKyAgZ3JvdXAuYWRkKDAsIDEsIE5lZ2F0aW9uRmxhZyk7CisgIGdyb3VwLmFkZCgwLCAyLCBDb25qdWdhdGlvbkZsYWcpOwogCiAgIFZFUklGWV9JU19FUVVBTChncm91cC5zaXplKCksIDZ1KTsKICAgVkVSSUZZX0lTX0VRVUFMKGdyb3VwLmdsb2JhbEZsYWdzKCksIEdsb2JhbEltYWdGbGFnKTsKIAogICBzdGQ6OnNldDx1aW50NjRfdD4gZm91bmQ7CiAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBpbnQ+IGV4cGVjdGVkOwotICBleHBlY3RlZFsgMTIzNDU2XSA9IDA7CisgIGV4cGVjdGVkWzEyMzQ1Nl0gPSAwOwogICBleHBlY3RlZFsxMDIzNDU2XSA9IE5lZ2F0aW9uRmxhZzsKICAgZXhwZWN0ZWRbMjEwMzQ1Nl0gPSBDb25qdWdhdGlvbkZsYWc7CiAgIGV4cGVjdGVkWzEyMDM0NTZdID0gQ29uanVnYXRpb25GbGFnIHwgTmVnYXRpb25GbGFnOwogICBleHBlY3RlZFsyMDEzNDU2XSA9IENvbmp1Z2F0aW9uRmxhZyB8IE5lZ2F0aW9uRmxhZzsKLSAgZXhwZWN0ZWRbIDIxMzQ1Nl0gPSBDb25qdWdhdGlvbkZsYWc7CisgIGV4cGVjdGVkWzIxMzQ1Nl0gPSBDb25qdWdhdGlvbkZsYWc7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGdyb3VwLnNpemUoKSwgNnUpOwogICBWRVJJRllfSVNfRVFVQUwoZ3JvdXAuZ2xvYmFsRmxhZ3MoKSwgR2xvYmFsSW1hZ0ZsYWcpOwpAQCAtMTM1LDI3ICsxMjYsMjMgQEAKICAgVkVSSUZZX0lTX0VRVUFMKGZvdW5kLnNpemUoKSwgNnUpOwogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X3N5bWdyb3Vwc19zZWxlY3Rpb24oKQotewotICBzdGQ6OmFycmF5PGludCwgNz4gaWRlbnRpdHk3e3swLDEsMiwzLDQsNSw2fX07Ci0gIHN0ZDo6YXJyYXk8aW50LCAxMD4gaWRlbnRpdHkxMHt7MCwxLDIsMyw0LDUsNiw3LDgsOX19Oworc3RhdGljIHZvaWQgdGVzdF9zeW1ncm91cHNfc2VsZWN0aW9uKCkgeworICBzdGQ6OmFycmF5PGludCwgNz4gaWRlbnRpdHk3e3swLCAxLCAyLCAzLCA0LCA1LCA2fX07CisgIHN0ZDo6YXJyYXk8aW50LCAxMD4gaWRlbnRpdHkxMHt7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOX19OwogCiAgIHsKICAgICAvLyBEbyB0aGUgc2FtZSB0ZXN0IGFzIGluIHRlc3Rfc3ltZ3JvdXBzX3N0YXRpYyBidXQKICAgICAvLyByZXF1aXJlIHNlbGVjdGlvbiB2aWEgU0dyb3VwCi0gICAgU0dyb3VwPAotICAgICAgQW50aVN5bW1ldHJ5PDAsMT4sCi0gICAgICBIZXJtaXRpY2l0eTwwLDI+Ci0gICAgPiBncm91cDsKKyAgICBTR3JvdXA8QW50aVN5bW1ldHJ5PDAsIDE+LCBIZXJtaXRpY2l0eTwwLCAyPj4gZ3JvdXA7CiAKICAgICBzdGQ6OnNldDx1aW50NjRfdD4gZm91bmQ7CiAgICAgc3RkOjptYXA8dWludDY0X3QsIGludD4gZXhwZWN0ZWQ7Ci0gICAgZXhwZWN0ZWRbIDEyMzQ1Nl0gPSAwOworICAgIGV4cGVjdGVkWzEyMzQ1Nl0gPSAwOwogICAgIGV4cGVjdGVkWzEwMjM0NTZdID0gTmVnYXRpb25GbGFnOwogICAgIGV4cGVjdGVkWzIxMDM0NTZdID0gQ29uanVnYXRpb25GbGFnOwogICAgIGV4cGVjdGVkWzEyMDM0NTZdID0gQ29uanVnYXRpb25GbGFnIHwgTmVnYXRpb25GbGFnOwogICAgIGV4cGVjdGVkWzIwMTM0NTZdID0gQ29uanVnYXRpb25GbGFnIHwgTmVnYXRpb25GbGFnOwotICAgIGV4cGVjdGVkWyAyMTM0NTZdID0gQ29uanVnYXRpb25GbGFnOworICAgIGV4cGVjdGVkWzIxMzQ1Nl0gPSBDb25qdWdhdGlvbkZsYWc7CiAKICAgICBWRVJJRlkoIWlzRHluR3JvdXAoZ3JvdXApKTsKICAgICBWRVJJRllfSVNfRVFVQUwoZ3JvdXAuc2l6ZSgpLCA2dSk7CkBAIC0xNjgsMjQgKzE1NSw0MiBAQAogICAgIC8vIHNpbXBsZSBmYWN0b3JpemluZyBncm91cDogNSBnZW5lcmF0b3JzLCAyXjUgPSAzMiBlbGVtZW50cwogICAgIC8vIHNlbGVjdGlvbiBzaG91bGQgbWFrZSB0aGlzIGR5bmFtaWMsIGFsdGhvdWdoIHN0YXRpYyBncm91cAogICAgIC8vIGNhbiBzdGlsbCBiZSByZWFzb25hYmx5IGdlbmVyYXRlZAotICAgIFNHcm91cDwKLSAgICAgIFN5bW1ldHJ5PDAsMT4sCi0gICAgICBTeW1tZXRyeTwyLDM+LAotICAgICAgU3ltbWV0cnk8NCw1PiwKLSAgICAgIFN5bW1ldHJ5PDYsNz4sCi0gICAgICBTeW1tZXRyeTw4LDk+Ci0gICAgPiBncm91cDsKKyAgICBTR3JvdXA8U3ltbWV0cnk8MCwgMT4sIFN5bW1ldHJ5PDIsIDM+LCBTeW1tZXRyeTw0LCA1PiwgU3ltbWV0cnk8NiwgNz4sIFN5bW1ldHJ5PDgsIDk+PiBncm91cDsKIAogICAgIHN0ZDo6c2V0PHVpbnQ2NF90PiBmb3VuZDsKICAgICBzdGQ6Om1hcDx1aW50NjRfdCwgaW50PiBleHBlY3RlZDsKLSAgICBleHBlY3RlZFsgMTIzNDU2Nzg5XSA9IDA7IGV4cGVjdGVkWyAxMjM0NTY3OThdID0gMDsgZXhwZWN0ZWRbIDEyMzQ1NzY4OV0gPSAwOyBleHBlY3RlZFsgMTIzNDU3Njk4XSA9IDA7Ci0gICAgZXhwZWN0ZWRbIDEyMzU0Njc4OV0gPSAwOyBleHBlY3RlZFsgMTIzNTQ2Nzk4XSA9IDA7IGV4cGVjdGVkWyAxMjM1NDc2ODldID0gMDsgZXhwZWN0ZWRbIDEyMzU0NzY5OF0gPSAwOwotICAgIGV4cGVjdGVkWyAxMzI0NTY3ODldID0gMDsgZXhwZWN0ZWRbIDEzMjQ1Njc5OF0gPSAwOyBleHBlY3RlZFsgMTMyNDU3Njg5XSA9IDA7IGV4cGVjdGVkWyAxMzI0NTc2OThdID0gMDsKLSAgICBleHBlY3RlZFsgMTMyNTQ2Nzg5XSA9IDA7IGV4cGVjdGVkWyAxMzI1NDY3OThdID0gMDsgZXhwZWN0ZWRbIDEzMjU0NzY4OV0gPSAwOyBleHBlY3RlZFsgMTMyNTQ3Njk4XSA9IDA7Ci0gICAgZXhwZWN0ZWRbMTAyMzQ1Njc4OV0gPSAwOyBleHBlY3RlZFsxMDIzNDU2Nzk4XSA9IDA7IGV4cGVjdGVkWzEwMjM0NTc2ODldID0gMDsgZXhwZWN0ZWRbMTAyMzQ1NzY5OF0gPSAwOwotICAgIGV4cGVjdGVkWzEwMjM1NDY3ODldID0gMDsgZXhwZWN0ZWRbMTAyMzU0Njc5OF0gPSAwOyBleHBlY3RlZFsxMDIzNTQ3Njg5XSA9IDA7IGV4cGVjdGVkWzEwMjM1NDc2OThdID0gMDsKLSAgICBleHBlY3RlZFsxMDMyNDU2Nzg5XSA9IDA7IGV4cGVjdGVkWzEwMzI0NTY3OThdID0gMDsgZXhwZWN0ZWRbMTAzMjQ1NzY4OV0gPSAwOyBleHBlY3RlZFsxMDMyNDU3Njk4XSA9IDA7Ci0gICAgZXhwZWN0ZWRbMTAzMjU0Njc4OV0gPSAwOyBleHBlY3RlZFsxMDMyNTQ2Nzk4XSA9IDA7IGV4cGVjdGVkWzEwMzI1NDc2ODldID0gMDsgZXhwZWN0ZWRbMTAzMjU0NzY5OF0gPSAwOworICAgIGV4cGVjdGVkWzEyMzQ1Njc4OV0gPSAwOworICAgIGV4cGVjdGVkWzEyMzQ1Njc5OF0gPSAwOworICAgIGV4cGVjdGVkWzEyMzQ1NzY4OV0gPSAwOworICAgIGV4cGVjdGVkWzEyMzQ1NzY5OF0gPSAwOworICAgIGV4cGVjdGVkWzEyMzU0Njc4OV0gPSAwOworICAgIGV4cGVjdGVkWzEyMzU0Njc5OF0gPSAwOworICAgIGV4cGVjdGVkWzEyMzU0NzY4OV0gPSAwOworICAgIGV4cGVjdGVkWzEyMzU0NzY5OF0gPSAwOworICAgIGV4cGVjdGVkWzEzMjQ1Njc4OV0gPSAwOworICAgIGV4cGVjdGVkWzEzMjQ1Njc5OF0gPSAwOworICAgIGV4cGVjdGVkWzEzMjQ1NzY4OV0gPSAwOworICAgIGV4cGVjdGVkWzEzMjQ1NzY5OF0gPSAwOworICAgIGV4cGVjdGVkWzEzMjU0Njc4OV0gPSAwOworICAgIGV4cGVjdGVkWzEzMjU0Njc5OF0gPSAwOworICAgIGV4cGVjdGVkWzEzMjU0NzY4OV0gPSAwOworICAgIGV4cGVjdGVkWzEzMjU0NzY5OF0gPSAwOworICAgIGV4cGVjdGVkWzEwMjM0NTY3ODldID0gMDsKKyAgICBleHBlY3RlZFsxMDIzNDU2Nzk4XSA9IDA7CisgICAgZXhwZWN0ZWRbMTAyMzQ1NzY4OV0gPSAwOworICAgIGV4cGVjdGVkWzEwMjM0NTc2OThdID0gMDsKKyAgICBleHBlY3RlZFsxMDIzNTQ2Nzg5XSA9IDA7CisgICAgZXhwZWN0ZWRbMTAyMzU0Njc5OF0gPSAwOworICAgIGV4cGVjdGVkWzEwMjM1NDc2ODldID0gMDsKKyAgICBleHBlY3RlZFsxMDIzNTQ3Njk4XSA9IDA7CisgICAgZXhwZWN0ZWRbMTAzMjQ1Njc4OV0gPSAwOworICAgIGV4cGVjdGVkWzEwMzI0NTY3OThdID0gMDsKKyAgICBleHBlY3RlZFsxMDMyNDU3Njg5XSA9IDA7CisgICAgZXhwZWN0ZWRbMTAzMjQ1NzY5OF0gPSAwOworICAgIGV4cGVjdGVkWzEwMzI1NDY3ODldID0gMDsKKyAgICBleHBlY3RlZFsxMDMyNTQ2Nzk4XSA9IDA7CisgICAgZXhwZWN0ZWRbMTAzMjU0NzY4OV0gPSAwOworICAgIGV4cGVjdGVkWzEwMzI1NDc2OThdID0gMDsKIAogICAgIFZFUklGWShpc0R5bkdyb3VwKGdyb3VwKSk7CiAgICAgVkVSSUZZX0lTX0VRVUFMKGdyb3VwLnNpemUoKSwgMzJ1KTsKQEAgLTE5NiwxMyArMjAxLDcgQEAKICAgICAvLyBubyB2ZXJpZnkgdGhhdCB3ZSBjb3VsZCBhbHNvIGdlbmVyYXRlIGEgc3RhdGljIGdyb3VwCiAgICAgLy8gd2l0aCB0aGVzZSBnZW5lcmF0b3JzCiAgICAgZm91bmQuY2xlYXIoKTsKLSAgICBTdGF0aWNTR3JvdXA8Ci0gICAgICBTeW1tZXRyeTwwLDE+LAotICAgICAgU3ltbWV0cnk8MiwzPiwKLSAgICAgIFN5bW1ldHJ5PDQsNT4sCi0gICAgICBTeW1tZXRyeTw2LDc+LAotICAgICAgU3ltbWV0cnk8OCw5PgotICAgID4gZ3JvdXBfc3RhdGljOworICAgIFN0YXRpY1NHcm91cDxTeW1tZXRyeTwwLCAxPiwgU3ltbWV0cnk8MiwgMz4sIFN5bW1ldHJ5PDQsIDU+LCBTeW1tZXRyeTw2LCA3PiwgU3ltbWV0cnk8OCwgOT4+IGdyb3VwX3N0YXRpYzsKICAgICBWRVJJRllfSVNfRVFVQUwoZ3JvdXBfc3RhdGljLnNpemUoKSwgMzJ1KTsKICAgICBWRVJJRllfSVNfRVFVQUwoZ3JvdXBfc3RhdGljLmdsb2JhbEZsYWdzKCksIDApOwogICAgIGdyb3VwX3N0YXRpYy5hcHBseTxjaGVja0lkeCwgaW50PihpZGVudGl0eTEwLCAwLCBmb3VuZCwgZXhwZWN0ZWQpOwpAQCAtMjExLDQ0MSArMjEwLDQzMiBAQAogCiAgIHsKICAgICAvLyB0cnkgdG8gY3JlYXRlIGEgSFVHRSBncm91cAotICAgIFNHcm91cDwKLSAgICAgIFN5bW1ldHJ5PDAsMT4sCi0gICAgICBTeW1tZXRyeTwxLDI+LAotICAgICAgU3ltbWV0cnk8MiwzPiwKLSAgICAgIFN5bW1ldHJ5PDMsND4sCi0gICAgICBTeW1tZXRyeTw0LDU+LAotICAgICAgU3ltbWV0cnk8NSw2PgotICAgID4gZ3JvdXA7CisgICAgU0dyb3VwPFN5bW1ldHJ5PDAsIDE+LCBTeW1tZXRyeTwxLCAyPiwgU3ltbWV0cnk8MiwgMz4sIFN5bW1ldHJ5PDMsIDQ+LCBTeW1tZXRyeTw0LCA1PiwgU3ltbWV0cnk8NSwgNj4+IGdyb3VwOwogCiAgICAgc3RkOjpzZXQ8dWludDY0X3Q+IGZvdW5kOwogICAgIHVpbnQ2NF90IHByZV9leHBlY3RlZFs1MDQwXSA9IHsKLSAgICAgICAxMjM0NTYsIDEwMjM0NTYsICAyMTM0NTYsIDIwMTM0NTYsIDEyMDM0NTYsIDIxMDM0NTYsICAxMzI0NTYsIDEwMzI0NTYsICAzMTI0NTYsIDMwMTI0NTYsIDEzMDI0NTYsIDMxMDI0NTYsCi0gICAgICAgMjMxNDU2LCAyMDMxNDU2LCAgMzIxNDU2LCAzMDIxNDU2LCAyMzAxNDU2LCAzMjAxNDU2LCAxMjMwNDU2LCAyMTMwNDU2LCAxMzIwNDU2LCAzMTIwNDU2LCAyMzEwNDU2LCAzMjEwNDU2LAotICAgICAgIDEyNDM1NiwgMTAyNDM1NiwgIDIxNDM1NiwgMjAxNDM1NiwgMTIwNDM1NiwgMjEwNDM1NiwgIDE0MjM1NiwgMTA0MjM1NiwgIDQxMjM1NiwgNDAxMjM1NiwgMTQwMjM1NiwgNDEwMjM1NiwKLSAgICAgICAyNDEzNTYsIDIwNDEzNTYsICA0MjEzNTYsIDQwMjEzNTYsIDI0MDEzNTYsIDQyMDEzNTYsIDEyNDAzNTYsIDIxNDAzNTYsIDE0MjAzNTYsIDQxMjAzNTYsIDI0MTAzNTYsIDQyMTAzNTYsCi0gICAgICAgMTM0MjU2LCAxMDM0MjU2LCAgMzE0MjU2LCAzMDE0MjU2LCAxMzA0MjU2LCAzMTA0MjU2LCAgMTQzMjU2LCAxMDQzMjU2LCAgNDEzMjU2LCA0MDEzMjU2LCAxNDAzMjU2LCA0MTAzMjU2LAotICAgICAgIDM0MTI1NiwgMzA0MTI1NiwgIDQzMTI1NiwgNDAzMTI1NiwgMzQwMTI1NiwgNDMwMTI1NiwgMTM0MDI1NiwgMzE0MDI1NiwgMTQzMDI1NiwgNDEzMDI1NiwgMzQxMDI1NiwgNDMxMDI1NiwKLSAgICAgICAyMzQxNTYsIDIwMzQxNTYsICAzMjQxNTYsIDMwMjQxNTYsIDIzMDQxNTYsIDMyMDQxNTYsICAyNDMxNTYsIDIwNDMxNTYsICA0MjMxNTYsIDQwMjMxNTYsIDI0MDMxNTYsIDQyMDMxNTYsCi0gICAgICAgMzQyMTU2LCAzMDQyMTU2LCAgNDMyMTU2LCA0MDMyMTU2LCAzNDAyMTU2LCA0MzAyMTU2LCAyMzQwMTU2LCAzMjQwMTU2LCAyNDMwMTU2LCA0MjMwMTU2LCAzNDIwMTU2LCA0MzIwMTU2LAotICAgICAgMTIzNDA1NiwgMjEzNDA1NiwgMTMyNDA1NiwgMzEyNDA1NiwgMjMxNDA1NiwgMzIxNDA1NiwgMTI0MzA1NiwgMjE0MzA1NiwgMTQyMzA1NiwgNDEyMzA1NiwgMjQxMzA1NiwgNDIxMzA1NiwKLSAgICAgIDEzNDIwNTYsIDMxNDIwNTYsIDE0MzIwNTYsIDQxMzIwNTYsIDM0MTIwNTYsIDQzMTIwNTYsIDIzNDEwNTYsIDMyNDEwNTYsIDI0MzEwNTYsIDQyMzEwNTYsIDM0MjEwNTYsIDQzMjEwNTYsCi0gICAgICAgMTIzNTQ2LCAxMDIzNTQ2LCAgMjEzNTQ2LCAyMDEzNTQ2LCAxMjAzNTQ2LCAyMTAzNTQ2LCAgMTMyNTQ2LCAxMDMyNTQ2LCAgMzEyNTQ2LCAzMDEyNTQ2LCAxMzAyNTQ2LCAzMTAyNTQ2LAotICAgICAgIDIzMTU0NiwgMjAzMTU0NiwgIDMyMTU0NiwgMzAyMTU0NiwgMjMwMTU0NiwgMzIwMTU0NiwgMTIzMDU0NiwgMjEzMDU0NiwgMTMyMDU0NiwgMzEyMDU0NiwgMjMxMDU0NiwgMzIxMDU0NiwKLSAgICAgICAxMjUzNDYsIDEwMjUzNDYsICAyMTUzNDYsIDIwMTUzNDYsIDEyMDUzNDYsIDIxMDUzNDYsICAxNTIzNDYsIDEwNTIzNDYsICA1MTIzNDYsIDUwMTIzNDYsIDE1MDIzNDYsIDUxMDIzNDYsCi0gICAgICAgMjUxMzQ2LCAyMDUxMzQ2LCAgNTIxMzQ2LCA1MDIxMzQ2LCAyNTAxMzQ2LCA1MjAxMzQ2LCAxMjUwMzQ2LCAyMTUwMzQ2LCAxNTIwMzQ2LCA1MTIwMzQ2LCAyNTEwMzQ2LCA1MjEwMzQ2LAotICAgICAgIDEzNTI0NiwgMTAzNTI0NiwgIDMxNTI0NiwgMzAxNTI0NiwgMTMwNTI0NiwgMzEwNTI0NiwgIDE1MzI0NiwgMTA1MzI0NiwgIDUxMzI0NiwgNTAxMzI0NiwgMTUwMzI0NiwgNTEwMzI0NiwKLSAgICAgICAzNTEyNDYsIDMwNTEyNDYsICA1MzEyNDYsIDUwMzEyNDYsIDM1MDEyNDYsIDUzMDEyNDYsIDEzNTAyNDYsIDMxNTAyNDYsIDE1MzAyNDYsIDUxMzAyNDYsIDM1MTAyNDYsIDUzMTAyNDYsCi0gICAgICAgMjM1MTQ2LCAyMDM1MTQ2LCAgMzI1MTQ2LCAzMDI1MTQ2LCAyMzA1MTQ2LCAzMjA1MTQ2LCAgMjUzMTQ2LCAyMDUzMTQ2LCAgNTIzMTQ2LCA1MDIzMTQ2LCAyNTAzMTQ2LCA1MjAzMTQ2LAotICAgICAgIDM1MjE0NiwgMzA1MjE0NiwgIDUzMjE0NiwgNTAzMjE0NiwgMzUwMjE0NiwgNTMwMjE0NiwgMjM1MDE0NiwgMzI1MDE0NiwgMjUzMDE0NiwgNTIzMDE0NiwgMzUyMDE0NiwgNTMyMDE0NiwKLSAgICAgIDEyMzUwNDYsIDIxMzUwNDYsIDEzMjUwNDYsIDMxMjUwNDYsIDIzMTUwNDYsIDMyMTUwNDYsIDEyNTMwNDYsIDIxNTMwNDYsIDE1MjMwNDYsIDUxMjMwNDYsIDI1MTMwNDYsIDUyMTMwNDYsCi0gICAgICAxMzUyMDQ2LCAzMTUyMDQ2LCAxNTMyMDQ2LCA1MTMyMDQ2LCAzNTEyMDQ2LCA1MzEyMDQ2LCAyMzUxMDQ2LCAzMjUxMDQ2LCAyNTMxMDQ2LCA1MjMxMDQ2LCAzNTIxMDQ2LCA1MzIxMDQ2LAotICAgICAgIDEyNDUzNiwgMTAyNDUzNiwgIDIxNDUzNiwgMjAxNDUzNiwgMTIwNDUzNiwgMjEwNDUzNiwgIDE0MjUzNiwgMTA0MjUzNiwgIDQxMjUzNiwgNDAxMjUzNiwgMTQwMjUzNiwgNDEwMjUzNiwKLSAgICAgICAyNDE1MzYsIDIwNDE1MzYsICA0MjE1MzYsIDQwMjE1MzYsIDI0MDE1MzYsIDQyMDE1MzYsIDEyNDA1MzYsIDIxNDA1MzYsIDE0MjA1MzYsIDQxMjA1MzYsIDI0MTA1MzYsIDQyMTA1MzYsCi0gICAgICAgMTI1NDM2LCAxMDI1NDM2LCAgMjE1NDM2LCAyMDE1NDM2LCAxMjA1NDM2LCAyMTA1NDM2LCAgMTUyNDM2LCAxMDUyNDM2LCAgNTEyNDM2LCA1MDEyNDM2LCAxNTAyNDM2LCA1MTAyNDM2LAotICAgICAgIDI1MTQzNiwgMjA1MTQzNiwgIDUyMTQzNiwgNTAyMTQzNiwgMjUwMTQzNiwgNTIwMTQzNiwgMTI1MDQzNiwgMjE1MDQzNiwgMTUyMDQzNiwgNTEyMDQzNiwgMjUxMDQzNiwgNTIxMDQzNiwKLSAgICAgICAxNDUyMzYsIDEwNDUyMzYsICA0MTUyMzYsIDQwMTUyMzYsIDE0MDUyMzYsIDQxMDUyMzYsICAxNTQyMzYsIDEwNTQyMzYsICA1MTQyMzYsIDUwMTQyMzYsIDE1MDQyMzYsIDUxMDQyMzYsCi0gICAgICAgNDUxMjM2LCA0MDUxMjM2LCAgNTQxMjM2LCA1MDQxMjM2LCA0NTAxMjM2LCA1NDAxMjM2LCAxNDUwMjM2LCA0MTUwMjM2LCAxNTQwMjM2LCA1MTQwMjM2LCA0NTEwMjM2LCA1NDEwMjM2LAotICAgICAgIDI0NTEzNiwgMjA0NTEzNiwgIDQyNTEzNiwgNDAyNTEzNiwgMjQwNTEzNiwgNDIwNTEzNiwgIDI1NDEzNiwgMjA1NDEzNiwgIDUyNDEzNiwgNTAyNDEzNiwgMjUwNDEzNiwgNTIwNDEzNiwKLSAgICAgICA0NTIxMzYsIDQwNTIxMzYsICA1NDIxMzYsIDUwNDIxMzYsIDQ1MDIxMzYsIDU0MDIxMzYsIDI0NTAxMzYsIDQyNTAxMzYsIDI1NDAxMzYsIDUyNDAxMzYsIDQ1MjAxMzYsIDU0MjAxMzYsCi0gICAgICAxMjQ1MDM2LCAyMTQ1MDM2LCAxNDI1MDM2LCA0MTI1MDM2LCAyNDE1MDM2LCA0MjE1MDM2LCAxMjU0MDM2LCAyMTU0MDM2LCAxNTI0MDM2LCA1MTI0MDM2LCAyNTE0MDM2LCA1MjE0MDM2LAotICAgICAgMTQ1MjAzNiwgNDE1MjAzNiwgMTU0MjAzNiwgNTE0MjAzNiwgNDUxMjAzNiwgNTQxMjAzNiwgMjQ1MTAzNiwgNDI1MTAzNiwgMjU0MTAzNiwgNTI0MTAzNiwgNDUyMTAzNiwgNTQyMTAzNiwKLSAgICAgICAxMzQ1MjYsIDEwMzQ1MjYsICAzMTQ1MjYsIDMwMTQ1MjYsIDEzMDQ1MjYsIDMxMDQ1MjYsICAxNDM1MjYsIDEwNDM1MjYsICA0MTM1MjYsIDQwMTM1MjYsIDE0MDM1MjYsIDQxMDM1MjYsCi0gICAgICAgMzQxNTI2LCAzMDQxNTI2LCAgNDMxNTI2LCA0MDMxNTI2LCAzNDAxNTI2LCA0MzAxNTI2LCAxMzQwNTI2LCAzMTQwNTI2LCAxNDMwNTI2LCA0MTMwNTI2LCAzNDEwNTI2LCA0MzEwNTI2LAotICAgICAgIDEzNTQyNiwgMTAzNTQyNiwgIDMxNTQyNiwgMzAxNTQyNiwgMTMwNTQyNiwgMzEwNTQyNiwgIDE1MzQyNiwgMTA1MzQyNiwgIDUxMzQyNiwgNTAxMzQyNiwgMTUwMzQyNiwgNTEwMzQyNiwKLSAgICAgICAzNTE0MjYsIDMwNTE0MjYsICA1MzE0MjYsIDUwMzE0MjYsIDM1MDE0MjYsIDUzMDE0MjYsIDEzNTA0MjYsIDMxNTA0MjYsIDE1MzA0MjYsIDUxMzA0MjYsIDM1MTA0MjYsIDUzMTA0MjYsCi0gICAgICAgMTQ1MzI2LCAxMDQ1MzI2LCAgNDE1MzI2LCA0MDE1MzI2LCAxNDA1MzI2LCA0MTA1MzI2LCAgMTU0MzI2LCAxMDU0MzI2LCAgNTE0MzI2LCA1MDE0MzI2LCAxNTA0MzI2LCA1MTA0MzI2LAotICAgICAgIDQ1MTMyNiwgNDA1MTMyNiwgIDU0MTMyNiwgNTA0MTMyNiwgNDUwMTMyNiwgNTQwMTMyNiwgMTQ1MDMyNiwgNDE1MDMyNiwgMTU0MDMyNiwgNTE0MDMyNiwgNDUxMDMyNiwgNTQxMDMyNiwKLSAgICAgICAzNDUxMjYsIDMwNDUxMjYsICA0MzUxMjYsIDQwMzUxMjYsIDM0MDUxMjYsIDQzMDUxMjYsICAzNTQxMjYsIDMwNTQxMjYsICA1MzQxMjYsIDUwMzQxMjYsIDM1MDQxMjYsIDUzMDQxMjYsCi0gICAgICAgNDUzMTI2LCA0MDUzMTI2LCAgNTQzMTI2LCA1MDQzMTI2LCA0NTAzMTI2LCA1NDAzMTI2LCAzNDUwMTI2LCA0MzUwMTI2LCAzNTQwMTI2LCA1MzQwMTI2LCA0NTMwMTI2LCA1NDMwMTI2LAotICAgICAgMTM0NTAyNiwgMzE0NTAyNiwgMTQzNTAyNiwgNDEzNTAyNiwgMzQxNTAyNiwgNDMxNTAyNiwgMTM1NDAyNiwgMzE1NDAyNiwgMTUzNDAyNiwgNTEzNDAyNiwgMzUxNDAyNiwgNTMxNDAyNiwKLSAgICAgIDE0NTMwMjYsIDQxNTMwMjYsIDE1NDMwMjYsIDUxNDMwMjYsIDQ1MTMwMjYsIDU0MTMwMjYsIDM0NTEwMjYsIDQzNTEwMjYsIDM1NDEwMjYsIDUzNDEwMjYsIDQ1MzEwMjYsIDU0MzEwMjYsCi0gICAgICAgMjM0NTE2LCAyMDM0NTE2LCAgMzI0NTE2LCAzMDI0NTE2LCAyMzA0NTE2LCAzMjA0NTE2LCAgMjQzNTE2LCAyMDQzNTE2LCAgNDIzNTE2LCA0MDIzNTE2LCAyNDAzNTE2LCA0MjAzNTE2LAotICAgICAgIDM0MjUxNiwgMzA0MjUxNiwgIDQzMjUxNiwgNDAzMjUxNiwgMzQwMjUxNiwgNDMwMjUxNiwgMjM0MDUxNiwgMzI0MDUxNiwgMjQzMDUxNiwgNDIzMDUxNiwgMzQyMDUxNiwgNDMyMDUxNiwKLSAgICAgICAyMzU0MTYsIDIwMzU0MTYsICAzMjU0MTYsIDMwMjU0MTYsIDIzMDU0MTYsIDMyMDU0MTYsICAyNTM0MTYsIDIwNTM0MTYsICA1MjM0MTYsIDUwMjM0MTYsIDI1MDM0MTYsIDUyMDM0MTYsCi0gICAgICAgMzUyNDE2LCAzMDUyNDE2LCAgNTMyNDE2LCA1MDMyNDE2LCAzNTAyNDE2LCA1MzAyNDE2LCAyMzUwNDE2LCAzMjUwNDE2LCAyNTMwNDE2LCA1MjMwNDE2LCAzNTIwNDE2LCA1MzIwNDE2LAotICAgICAgIDI0NTMxNiwgMjA0NTMxNiwgIDQyNTMxNiwgNDAyNTMxNiwgMjQwNTMxNiwgNDIwNTMxNiwgIDI1NDMxNiwgMjA1NDMxNiwgIDUyNDMxNiwgNTAyNDMxNiwgMjUwNDMxNiwgNTIwNDMxNiwKLSAgICAgICA0NTIzMTYsIDQwNTIzMTYsICA1NDIzMTYsIDUwNDIzMTYsIDQ1MDIzMTYsIDU0MDIzMTYsIDI0NTAzMTYsIDQyNTAzMTYsIDI1NDAzMTYsIDUyNDAzMTYsIDQ1MjAzMTYsIDU0MjAzMTYsCi0gICAgICAgMzQ1MjE2LCAzMDQ1MjE2LCAgNDM1MjE2LCA0MDM1MjE2LCAzNDA1MjE2LCA0MzA1MjE2LCAgMzU0MjE2LCAzMDU0MjE2LCAgNTM0MjE2LCA1MDM0MjE2LCAzNTA0MjE2LCA1MzA0MjE2LAotICAgICAgIDQ1MzIxNiwgNDA1MzIxNiwgIDU0MzIxNiwgNTA0MzIxNiwgNDUwMzIxNiwgNTQwMzIxNiwgMzQ1MDIxNiwgNDM1MDIxNiwgMzU0MDIxNiwgNTM0MDIxNiwgNDUzMDIxNiwgNTQzMDIxNiwKLSAgICAgIDIzNDUwMTYsIDMyNDUwMTYsIDI0MzUwMTYsIDQyMzUwMTYsIDM0MjUwMTYsIDQzMjUwMTYsIDIzNTQwMTYsIDMyNTQwMTYsIDI1MzQwMTYsIDUyMzQwMTYsIDM1MjQwMTYsIDUzMjQwMTYsCi0gICAgICAyNDUzMDE2LCA0MjUzMDE2LCAyNTQzMDE2LCA1MjQzMDE2LCA0NTIzMDE2LCA1NDIzMDE2LCAzNDUyMDE2LCA0MzUyMDE2LCAzNTQyMDE2LCA1MzQyMDE2LCA0NTMyMDE2LCA1NDMyMDE2LAotICAgICAgMTIzNDUwNiwgMjEzNDUwNiwgMTMyNDUwNiwgMzEyNDUwNiwgMjMxNDUwNiwgMzIxNDUwNiwgMTI0MzUwNiwgMjE0MzUwNiwgMTQyMzUwNiwgNDEyMzUwNiwgMjQxMzUwNiwgNDIxMzUwNiwKLSAgICAgIDEzNDI1MDYsIDMxNDI1MDYsIDE0MzI1MDYsIDQxMzI1MDYsIDM0MTI1MDYsIDQzMTI1MDYsIDIzNDE1MDYsIDMyNDE1MDYsIDI0MzE1MDYsIDQyMzE1MDYsIDM0MjE1MDYsIDQzMjE1MDYsCi0gICAgICAxMjM1NDA2LCAyMTM1NDA2LCAxMzI1NDA2LCAzMTI1NDA2LCAyMzE1NDA2LCAzMjE1NDA2LCAxMjUzNDA2LCAyMTUzNDA2LCAxNTIzNDA2LCA1MTIzNDA2LCAyNTEzNDA2LCA1MjEzNDA2LAotICAgICAgMTM1MjQwNiwgMzE1MjQwNiwgMTUzMjQwNiwgNTEzMjQwNiwgMzUxMjQwNiwgNTMxMjQwNiwgMjM1MTQwNiwgMzI1MTQwNiwgMjUzMTQwNiwgNTIzMTQwNiwgMzUyMTQwNiwgNTMyMTQwNiwKLSAgICAgIDEyNDUzMDYsIDIxNDUzMDYsIDE0MjUzMDYsIDQxMjUzMDYsIDI0MTUzMDYsIDQyMTUzMDYsIDEyNTQzMDYsIDIxNTQzMDYsIDE1MjQzMDYsIDUxMjQzMDYsIDI1MTQzMDYsIDUyMTQzMDYsCi0gICAgICAxNDUyMzA2LCA0MTUyMzA2LCAxNTQyMzA2LCA1MTQyMzA2LCA0NTEyMzA2LCA1NDEyMzA2LCAyNDUxMzA2LCA0MjUxMzA2LCAyNTQxMzA2LCA1MjQxMzA2LCA0NTIxMzA2LCA1NDIxMzA2LAotICAgICAgMTM0NTIwNiwgMzE0NTIwNiwgMTQzNTIwNiwgNDEzNTIwNiwgMzQxNTIwNiwgNDMxNTIwNiwgMTM1NDIwNiwgMzE1NDIwNiwgMTUzNDIwNiwgNTEzNDIwNiwgMzUxNDIwNiwgNTMxNDIwNiwKLSAgICAgIDE0NTMyMDYsIDQxNTMyMDYsIDE1NDMyMDYsIDUxNDMyMDYsIDQ1MTMyMDYsIDU0MTMyMDYsIDM0NTEyMDYsIDQzNTEyMDYsIDM1NDEyMDYsIDUzNDEyMDYsIDQ1MzEyMDYsIDU0MzEyMDYsCi0gICAgICAyMzQ1MTA2LCAzMjQ1MTA2LCAyNDM1MTA2LCA0MjM1MTA2LCAzNDI1MTA2LCA0MzI1MTA2LCAyMzU0MTA2LCAzMjU0MTA2LCAyNTM0MTA2LCA1MjM0MTA2LCAzNTI0MTA2LCA1MzI0MTA2LAotICAgICAgMjQ1MzEwNiwgNDI1MzEwNiwgMjU0MzEwNiwgNTI0MzEwNiwgNDUyMzEwNiwgNTQyMzEwNiwgMzQ1MjEwNiwgNDM1MjEwNiwgMzU0MjEwNiwgNTM0MjEwNiwgNDUzMjEwNiwgNTQzMjEwNiwKLSAgICAgICAxMjM0NjUsIDEwMjM0NjUsICAyMTM0NjUsIDIwMTM0NjUsIDEyMDM0NjUsIDIxMDM0NjUsICAxMzI0NjUsIDEwMzI0NjUsICAzMTI0NjUsIDMwMTI0NjUsIDEzMDI0NjUsIDMxMDI0NjUsCi0gICAgICAgMjMxNDY1LCAyMDMxNDY1LCAgMzIxNDY1LCAzMDIxNDY1LCAyMzAxNDY1LCAzMjAxNDY1LCAxMjMwNDY1LCAyMTMwNDY1LCAxMzIwNDY1LCAzMTIwNDY1LCAyMzEwNDY1LCAzMjEwNDY1LAotICAgICAgIDEyNDM2NSwgMTAyNDM2NSwgIDIxNDM2NSwgMjAxNDM2NSwgMTIwNDM2NSwgMjEwNDM2NSwgIDE0MjM2NSwgMTA0MjM2NSwgIDQxMjM2NSwgNDAxMjM2NSwgMTQwMjM2NSwgNDEwMjM2NSwKLSAgICAgICAyNDEzNjUsIDIwNDEzNjUsICA0MjEzNjUsIDQwMjEzNjUsIDI0MDEzNjUsIDQyMDEzNjUsIDEyNDAzNjUsIDIxNDAzNjUsIDE0MjAzNjUsIDQxMjAzNjUsIDI0MTAzNjUsIDQyMTAzNjUsCi0gICAgICAgMTM0MjY1LCAxMDM0MjY1LCAgMzE0MjY1LCAzMDE0MjY1LCAxMzA0MjY1LCAzMTA0MjY1LCAgMTQzMjY1LCAxMDQzMjY1LCAgNDEzMjY1LCA0MDEzMjY1LCAxNDAzMjY1LCA0MTAzMjY1LAotICAgICAgIDM0MTI2NSwgMzA0MTI2NSwgIDQzMTI2NSwgNDAzMTI2NSwgMzQwMTI2NSwgNDMwMTI2NSwgMTM0MDI2NSwgMzE0MDI2NSwgMTQzMDI2NSwgNDEzMDI2NSwgMzQxMDI2NSwgNDMxMDI2NSwKLSAgICAgICAyMzQxNjUsIDIwMzQxNjUsICAzMjQxNjUsIDMwMjQxNjUsIDIzMDQxNjUsIDMyMDQxNjUsICAyNDMxNjUsIDIwNDMxNjUsICA0MjMxNjUsIDQwMjMxNjUsIDI0MDMxNjUsIDQyMDMxNjUsCi0gICAgICAgMzQyMTY1LCAzMDQyMTY1LCAgNDMyMTY1LCA0MDMyMTY1LCAzNDAyMTY1LCA0MzAyMTY1LCAyMzQwMTY1LCAzMjQwMTY1LCAyNDMwMTY1LCA0MjMwMTY1LCAzNDIwMTY1LCA0MzIwMTY1LAotICAgICAgMTIzNDA2NSwgMjEzNDA2NSwgMTMyNDA2NSwgMzEyNDA2NSwgMjMxNDA2NSwgMzIxNDA2NSwgMTI0MzA2NSwgMjE0MzA2NSwgMTQyMzA2NSwgNDEyMzA2NSwgMjQxMzA2NSwgNDIxMzA2NSwKLSAgICAgIDEzNDIwNjUsIDMxNDIwNjUsIDE0MzIwNjUsIDQxMzIwNjUsIDM0MTIwNjUsIDQzMTIwNjUsIDIzNDEwNjUsIDMyNDEwNjUsIDI0MzEwNjUsIDQyMzEwNjUsIDM0MjEwNjUsIDQzMjEwNjUsCi0gICAgICAgMTIzNjQ1LCAxMDIzNjQ1LCAgMjEzNjQ1LCAyMDEzNjQ1LCAxMjAzNjQ1LCAyMTAzNjQ1LCAgMTMyNjQ1LCAxMDMyNjQ1LCAgMzEyNjQ1LCAzMDEyNjQ1LCAxMzAyNjQ1LCAzMTAyNjQ1LAotICAgICAgIDIzMTY0NSwgMjAzMTY0NSwgIDMyMTY0NSwgMzAyMTY0NSwgMjMwMTY0NSwgMzIwMTY0NSwgMTIzMDY0NSwgMjEzMDY0NSwgMTMyMDY0NSwgMzEyMDY0NSwgMjMxMDY0NSwgMzIxMDY0NSwKLSAgICAgICAxMjYzNDUsIDEwMjYzNDUsICAyMTYzNDUsIDIwMTYzNDUsIDEyMDYzNDUsIDIxMDYzNDUsICAxNjIzNDUsIDEwNjIzNDUsICA2MTIzNDUsIDYwMTIzNDUsIDE2MDIzNDUsIDYxMDIzNDUsCi0gICAgICAgMjYxMzQ1LCAyMDYxMzQ1LCAgNjIxMzQ1LCA2MDIxMzQ1LCAyNjAxMzQ1LCA2MjAxMzQ1LCAxMjYwMzQ1LCAyMTYwMzQ1LCAxNjIwMzQ1LCA2MTIwMzQ1LCAyNjEwMzQ1LCA2MjEwMzQ1LAotICAgICAgIDEzNjI0NSwgMTAzNjI0NSwgIDMxNjI0NSwgMzAxNjI0NSwgMTMwNjI0NSwgMzEwNjI0NSwgIDE2MzI0NSwgMTA2MzI0NSwgIDYxMzI0NSwgNjAxMzI0NSwgMTYwMzI0NSwgNjEwMzI0NSwKLSAgICAgICAzNjEyNDUsIDMwNjEyNDUsICA2MzEyNDUsIDYwMzEyNDUsIDM2MDEyNDUsIDYzMDEyNDUsIDEzNjAyNDUsIDMxNjAyNDUsIDE2MzAyNDUsIDYxMzAyNDUsIDM2MTAyNDUsIDYzMTAyNDUsCi0gICAgICAgMjM2MTQ1LCAyMDM2MTQ1LCAgMzI2MTQ1LCAzMDI2MTQ1LCAyMzA2MTQ1LCAzMjA2MTQ1LCAgMjYzMTQ1LCAyMDYzMTQ1LCAgNjIzMTQ1LCA2MDIzMTQ1LCAyNjAzMTQ1LCA2MjAzMTQ1LAotICAgICAgIDM2MjE0NSwgMzA2MjE0NSwgIDYzMjE0NSwgNjAzMjE0NSwgMzYwMjE0NSwgNjMwMjE0NSwgMjM2MDE0NSwgMzI2MDE0NSwgMjYzMDE0NSwgNjIzMDE0NSwgMzYyMDE0NSwgNjMyMDE0NSwKLSAgICAgIDEyMzYwNDUsIDIxMzYwNDUsIDEzMjYwNDUsIDMxMjYwNDUsIDIzMTYwNDUsIDMyMTYwNDUsIDEyNjMwNDUsIDIxNjMwNDUsIDE2MjMwNDUsIDYxMjMwNDUsIDI2MTMwNDUsIDYyMTMwNDUsCi0gICAgICAxMzYyMDQ1LCAzMTYyMDQ1LCAxNjMyMDQ1LCA2MTMyMDQ1LCAzNjEyMDQ1LCA2MzEyMDQ1LCAyMzYxMDQ1LCAzMjYxMDQ1LCAyNjMxMDQ1LCA2MjMxMDQ1LCAzNjIxMDQ1LCA2MzIxMDQ1LAotICAgICAgIDEyNDYzNSwgMTAyNDYzNSwgIDIxNDYzNSwgMjAxNDYzNSwgMTIwNDYzNSwgMjEwNDYzNSwgIDE0MjYzNSwgMTA0MjYzNSwgIDQxMjYzNSwgNDAxMjYzNSwgMTQwMjYzNSwgNDEwMjYzNSwKLSAgICAgICAyNDE2MzUsIDIwNDE2MzUsICA0MjE2MzUsIDQwMjE2MzUsIDI0MDE2MzUsIDQyMDE2MzUsIDEyNDA2MzUsIDIxNDA2MzUsIDE0MjA2MzUsIDQxMjA2MzUsIDI0MTA2MzUsIDQyMTA2MzUsCi0gICAgICAgMTI2NDM1LCAxMDI2NDM1LCAgMjE2NDM1LCAyMDE2NDM1LCAxMjA2NDM1LCAyMTA2NDM1LCAgMTYyNDM1LCAxMDYyNDM1LCAgNjEyNDM1LCA2MDEyNDM1LCAxNjAyNDM1LCA2MTAyNDM1LAotICAgICAgIDI2MTQzNSwgMjA2MTQzNSwgIDYyMTQzNSwgNjAyMTQzNSwgMjYwMTQzNSwgNjIwMTQzNSwgMTI2MDQzNSwgMjE2MDQzNSwgMTYyMDQzNSwgNjEyMDQzNSwgMjYxMDQzNSwgNjIxMDQzNSwKLSAgICAgICAxNDYyMzUsIDEwNDYyMzUsICA0MTYyMzUsIDQwMTYyMzUsIDE0MDYyMzUsIDQxMDYyMzUsICAxNjQyMzUsIDEwNjQyMzUsICA2MTQyMzUsIDYwMTQyMzUsIDE2MDQyMzUsIDYxMDQyMzUsCi0gICAgICAgNDYxMjM1LCA0MDYxMjM1LCAgNjQxMjM1LCA2MDQxMjM1LCA0NjAxMjM1LCA2NDAxMjM1LCAxNDYwMjM1LCA0MTYwMjM1LCAxNjQwMjM1LCA2MTQwMjM1LCA0NjEwMjM1LCA2NDEwMjM1LAotICAgICAgIDI0NjEzNSwgMjA0NjEzNSwgIDQyNjEzNSwgNDAyNjEzNSwgMjQwNjEzNSwgNDIwNjEzNSwgIDI2NDEzNSwgMjA2NDEzNSwgIDYyNDEzNSwgNjAyNDEzNSwgMjYwNDEzNSwgNjIwNDEzNSwKLSAgICAgICA0NjIxMzUsIDQwNjIxMzUsICA2NDIxMzUsIDYwNDIxMzUsIDQ2MDIxMzUsIDY0MDIxMzUsIDI0NjAxMzUsIDQyNjAxMzUsIDI2NDAxMzUsIDYyNDAxMzUsIDQ2MjAxMzUsIDY0MjAxMzUsCi0gICAgICAxMjQ2MDM1LCAyMTQ2MDM1LCAxNDI2MDM1LCA0MTI2MDM1LCAyNDE2MDM1LCA0MjE2MDM1LCAxMjY0MDM1LCAyMTY0MDM1LCAxNjI0MDM1LCA2MTI0MDM1LCAyNjE0MDM1LCA2MjE0MDM1LAotICAgICAgMTQ2MjAzNSwgNDE2MjAzNSwgMTY0MjAzNSwgNjE0MjAzNSwgNDYxMjAzNSwgNjQxMjAzNSwgMjQ2MTAzNSwgNDI2MTAzNSwgMjY0MTAzNSwgNjI0MTAzNSwgNDYyMTAzNSwgNjQyMTAzNSwKLSAgICAgICAxMzQ2MjUsIDEwMzQ2MjUsICAzMTQ2MjUsIDMwMTQ2MjUsIDEzMDQ2MjUsIDMxMDQ2MjUsICAxNDM2MjUsIDEwNDM2MjUsICA0MTM2MjUsIDQwMTM2MjUsIDE0MDM2MjUsIDQxMDM2MjUsCi0gICAgICAgMzQxNjI1LCAzMDQxNjI1LCAgNDMxNjI1LCA0MDMxNjI1LCAzNDAxNjI1LCA0MzAxNjI1LCAxMzQwNjI1LCAzMTQwNjI1LCAxNDMwNjI1LCA0MTMwNjI1LCAzNDEwNjI1LCA0MzEwNjI1LAotICAgICAgIDEzNjQyNSwgMTAzNjQyNSwgIDMxNjQyNSwgMzAxNjQyNSwgMTMwNjQyNSwgMzEwNjQyNSwgIDE2MzQyNSwgMTA2MzQyNSwgIDYxMzQyNSwgNjAxMzQyNSwgMTYwMzQyNSwgNjEwMzQyNSwKLSAgICAgICAzNjE0MjUsIDMwNjE0MjUsICA2MzE0MjUsIDYwMzE0MjUsIDM2MDE0MjUsIDYzMDE0MjUsIDEzNjA0MjUsIDMxNjA0MjUsIDE2MzA0MjUsIDYxMzA0MjUsIDM2MTA0MjUsIDYzMTA0MjUsCi0gICAgICAgMTQ2MzI1LCAxMDQ2MzI1LCAgNDE2MzI1LCA0MDE2MzI1LCAxNDA2MzI1LCA0MTA2MzI1LCAgMTY0MzI1LCAxMDY0MzI1LCAgNjE0MzI1LCA2MDE0MzI1LCAxNjA0MzI1LCA2MTA0MzI1LAotICAgICAgIDQ2MTMyNSwgNDA2MTMyNSwgIDY0MTMyNSwgNjA0MTMyNSwgNDYwMTMyNSwgNjQwMTMyNSwgMTQ2MDMyNSwgNDE2MDMyNSwgMTY0MDMyNSwgNjE0MDMyNSwgNDYxMDMyNSwgNjQxMDMyNSwKLSAgICAgICAzNDYxMjUsIDMwNDYxMjUsICA0MzYxMjUsIDQwMzYxMjUsIDM0MDYxMjUsIDQzMDYxMjUsICAzNjQxMjUsIDMwNjQxMjUsICA2MzQxMjUsIDYwMzQxMjUsIDM2MDQxMjUsIDYzMDQxMjUsCi0gICAgICAgNDYzMTI1LCA0MDYzMTI1LCAgNjQzMTI1LCA2MDQzMTI1LCA0NjAzMTI1LCA2NDAzMTI1LCAzNDYwMTI1LCA0MzYwMTI1LCAzNjQwMTI1LCA2MzQwMTI1LCA0NjMwMTI1LCA2NDMwMTI1LAotICAgICAgMTM0NjAyNSwgMzE0NjAyNSwgMTQzNjAyNSwgNDEzNjAyNSwgMzQxNjAyNSwgNDMxNjAyNSwgMTM2NDAyNSwgMzE2NDAyNSwgMTYzNDAyNSwgNjEzNDAyNSwgMzYxNDAyNSwgNjMxNDAyNSwKLSAgICAgIDE0NjMwMjUsIDQxNjMwMjUsIDE2NDMwMjUsIDYxNDMwMjUsIDQ2MTMwMjUsIDY0MTMwMjUsIDM0NjEwMjUsIDQzNjEwMjUsIDM2NDEwMjUsIDYzNDEwMjUsIDQ2MzEwMjUsIDY0MzEwMjUsCi0gICAgICAgMjM0NjE1LCAyMDM0NjE1LCAgMzI0NjE1LCAzMDI0NjE1LCAyMzA0NjE1LCAzMjA0NjE1LCAgMjQzNjE1LCAyMDQzNjE1LCAgNDIzNjE1LCA0MDIzNjE1LCAyNDAzNjE1LCA0MjAzNjE1LAotICAgICAgIDM0MjYxNSwgMzA0MjYxNSwgIDQzMjYxNSwgNDAzMjYxNSwgMzQwMjYxNSwgNDMwMjYxNSwgMjM0MDYxNSwgMzI0MDYxNSwgMjQzMDYxNSwgNDIzMDYxNSwgMzQyMDYxNSwgNDMyMDYxNSwKLSAgICAgICAyMzY0MTUsIDIwMzY0MTUsICAzMjY0MTUsIDMwMjY0MTUsIDIzMDY0MTUsIDMyMDY0MTUsICAyNjM0MTUsIDIwNjM0MTUsICA2MjM0MTUsIDYwMjM0MTUsIDI2MDM0MTUsIDYyMDM0MTUsCi0gICAgICAgMzYyNDE1LCAzMDYyNDE1LCAgNjMyNDE1LCA2MDMyNDE1LCAzNjAyNDE1LCA2MzAyNDE1LCAyMzYwNDE1LCAzMjYwNDE1LCAyNjMwNDE1LCA2MjMwNDE1LCAzNjIwNDE1LCA2MzIwNDE1LAotICAgICAgIDI0NjMxNSwgMjA0NjMxNSwgIDQyNjMxNSwgNDAyNjMxNSwgMjQwNjMxNSwgNDIwNjMxNSwgIDI2NDMxNSwgMjA2NDMxNSwgIDYyNDMxNSwgNjAyNDMxNSwgMjYwNDMxNSwgNjIwNDMxNSwKLSAgICAgICA0NjIzMTUsIDQwNjIzMTUsICA2NDIzMTUsIDYwNDIzMTUsIDQ2MDIzMTUsIDY0MDIzMTUsIDI0NjAzMTUsIDQyNjAzMTUsIDI2NDAzMTUsIDYyNDAzMTUsIDQ2MjAzMTUsIDY0MjAzMTUsCi0gICAgICAgMzQ2MjE1LCAzMDQ2MjE1LCAgNDM2MjE1LCA0MDM2MjE1LCAzNDA2MjE1LCA0MzA2MjE1LCAgMzY0MjE1LCAzMDY0MjE1LCAgNjM0MjE1LCA2MDM0MjE1LCAzNjA0MjE1LCA2MzA0MjE1LAotICAgICAgIDQ2MzIxNSwgNDA2MzIxNSwgIDY0MzIxNSwgNjA0MzIxNSwgNDYwMzIxNSwgNjQwMzIxNSwgMzQ2MDIxNSwgNDM2MDIxNSwgMzY0MDIxNSwgNjM0MDIxNSwgNDYzMDIxNSwgNjQzMDIxNSwKLSAgICAgIDIzNDYwMTUsIDMyNDYwMTUsIDI0MzYwMTUsIDQyMzYwMTUsIDM0MjYwMTUsIDQzMjYwMTUsIDIzNjQwMTUsIDMyNjQwMTUsIDI2MzQwMTUsIDYyMzQwMTUsIDM2MjQwMTUsIDYzMjQwMTUsCi0gICAgICAyNDYzMDE1LCA0MjYzMDE1LCAyNjQzMDE1LCA2MjQzMDE1LCA0NjIzMDE1LCA2NDIzMDE1LCAzNDYyMDE1LCA0MzYyMDE1LCAzNjQyMDE1LCA2MzQyMDE1LCA0NjMyMDE1LCA2NDMyMDE1LAotICAgICAgMTIzNDYwNSwgMjEzNDYwNSwgMTMyNDYwNSwgMzEyNDYwNSwgMjMxNDYwNSwgMzIxNDYwNSwgMTI0MzYwNSwgMjE0MzYwNSwgMTQyMzYwNSwgNDEyMzYwNSwgMjQxMzYwNSwgNDIxMzYwNSwKLSAgICAgIDEzNDI2MDUsIDMxNDI2MDUsIDE0MzI2MDUsIDQxMzI2MDUsIDM0MTI2MDUsIDQzMTI2MDUsIDIzNDE2MDUsIDMyNDE2MDUsIDI0MzE2MDUsIDQyMzE2MDUsIDM0MjE2MDUsIDQzMjE2MDUsCi0gICAgICAxMjM2NDA1LCAyMTM2NDA1LCAxMzI2NDA1LCAzMTI2NDA1LCAyMzE2NDA1LCAzMjE2NDA1LCAxMjYzNDA1LCAyMTYzNDA1LCAxNjIzNDA1LCA2MTIzNDA1LCAyNjEzNDA1LCA2MjEzNDA1LAotICAgICAgMTM2MjQwNSwgMzE2MjQwNSwgMTYzMjQwNSwgNjEzMjQwNSwgMzYxMjQwNSwgNjMxMjQwNSwgMjM2MTQwNSwgMzI2MTQwNSwgMjYzMTQwNSwgNjIzMTQwNSwgMzYyMTQwNSwgNjMyMTQwNSwKLSAgICAgIDEyNDYzMDUsIDIxNDYzMDUsIDE0MjYzMDUsIDQxMjYzMDUsIDI0MTYzMDUsIDQyMTYzMDUsIDEyNjQzMDUsIDIxNjQzMDUsIDE2MjQzMDUsIDYxMjQzMDUsIDI2MTQzMDUsIDYyMTQzMDUsCi0gICAgICAxNDYyMzA1LCA0MTYyMzA1LCAxNjQyMzA1LCA2MTQyMzA1LCA0NjEyMzA1LCA2NDEyMzA1LCAyNDYxMzA1LCA0MjYxMzA1LCAyNjQxMzA1LCA2MjQxMzA1LCA0NjIxMzA1LCA2NDIxMzA1LAotICAgICAgMTM0NjIwNSwgMzE0NjIwNSwgMTQzNjIwNSwgNDEzNjIwNSwgMzQxNjIwNSwgNDMxNjIwNSwgMTM2NDIwNSwgMzE2NDIwNSwgMTYzNDIwNSwgNjEzNDIwNSwgMzYxNDIwNSwgNjMxNDIwNSwKLSAgICAgIDE0NjMyMDUsIDQxNjMyMDUsIDE2NDMyMDUsIDYxNDMyMDUsIDQ2MTMyMDUsIDY0MTMyMDUsIDM0NjEyMDUsIDQzNjEyMDUsIDM2NDEyMDUsIDYzNDEyMDUsIDQ2MzEyMDUsIDY0MzEyMDUsCi0gICAgICAyMzQ2MTA1LCAzMjQ2MTA1LCAyNDM2MTA1LCA0MjM2MTA1LCAzNDI2MTA1LCA0MzI2MTA1LCAyMzY0MTA1LCAzMjY0MTA1LCAyNjM0MTA1LCA2MjM0MTA1LCAzNjI0MTA1LCA2MzI0MTA1LAotICAgICAgMjQ2MzEwNSwgNDI2MzEwNSwgMjY0MzEwNSwgNjI0MzEwNSwgNDYyMzEwNSwgNjQyMzEwNSwgMzQ2MjEwNSwgNDM2MjEwNSwgMzY0MjEwNSwgNjM0MjEwNSwgNDYzMjEwNSwgNjQzMjEwNSwKLSAgICAgICAxMjM1NjQsIDEwMjM1NjQsICAyMTM1NjQsIDIwMTM1NjQsIDEyMDM1NjQsIDIxMDM1NjQsICAxMzI1NjQsIDEwMzI1NjQsICAzMTI1NjQsIDMwMTI1NjQsIDEzMDI1NjQsIDMxMDI1NjQsCi0gICAgICAgMjMxNTY0LCAyMDMxNTY0LCAgMzIxNTY0LCAzMDIxNTY0LCAyMzAxNTY0LCAzMjAxNTY0LCAxMjMwNTY0LCAyMTMwNTY0LCAxMzIwNTY0LCAzMTIwNTY0LCAyMzEwNTY0LCAzMjEwNTY0LAotICAgICAgIDEyNTM2NCwgMTAyNTM2NCwgIDIxNTM2NCwgMjAxNTM2NCwgMTIwNTM2NCwgMjEwNTM2NCwgIDE1MjM2NCwgMTA1MjM2NCwgIDUxMjM2NCwgNTAxMjM2NCwgMTUwMjM2NCwgNTEwMjM2NCwKLSAgICAgICAyNTEzNjQsIDIwNTEzNjQsICA1MjEzNjQsIDUwMjEzNjQsIDI1MDEzNjQsIDUyMDEzNjQsIDEyNTAzNjQsIDIxNTAzNjQsIDE1MjAzNjQsIDUxMjAzNjQsIDI1MTAzNjQsIDUyMTAzNjQsCi0gICAgICAgMTM1MjY0LCAxMDM1MjY0LCAgMzE1MjY0LCAzMDE1MjY0LCAxMzA1MjY0LCAzMTA1MjY0LCAgMTUzMjY0LCAxMDUzMjY0LCAgNTEzMjY0LCA1MDEzMjY0LCAxNTAzMjY0LCA1MTAzMjY0LAotICAgICAgIDM1MTI2NCwgMzA1MTI2NCwgIDUzMTI2NCwgNTAzMTI2NCwgMzUwMTI2NCwgNTMwMTI2NCwgMTM1MDI2NCwgMzE1MDI2NCwgMTUzMDI2NCwgNTEzMDI2NCwgMzUxMDI2NCwgNTMxMDI2NCwKLSAgICAgICAyMzUxNjQsIDIwMzUxNjQsICAzMjUxNjQsIDMwMjUxNjQsIDIzMDUxNjQsIDMyMDUxNjQsICAyNTMxNjQsIDIwNTMxNjQsICA1MjMxNjQsIDUwMjMxNjQsIDI1MDMxNjQsIDUyMDMxNjQsCi0gICAgICAgMzUyMTY0LCAzMDUyMTY0LCAgNTMyMTY0LCA1MDMyMTY0LCAzNTAyMTY0LCA1MzAyMTY0LCAyMzUwMTY0LCAzMjUwMTY0LCAyNTMwMTY0LCA1MjMwMTY0LCAzNTIwMTY0LCA1MzIwMTY0LAotICAgICAgMTIzNTA2NCwgMjEzNTA2NCwgMTMyNTA2NCwgMzEyNTA2NCwgMjMxNTA2NCwgMzIxNTA2NCwgMTI1MzA2NCwgMjE1MzA2NCwgMTUyMzA2NCwgNTEyMzA2NCwgMjUxMzA2NCwgNTIxMzA2NCwKLSAgICAgIDEzNTIwNjQsIDMxNTIwNjQsIDE1MzIwNjQsIDUxMzIwNjQsIDM1MTIwNjQsIDUzMTIwNjQsIDIzNTEwNjQsIDMyNTEwNjQsIDI1MzEwNjQsIDUyMzEwNjQsIDM1MjEwNjQsIDUzMjEwNjQsCi0gICAgICAgMTIzNjU0LCAxMDIzNjU0LCAgMjEzNjU0LCAyMDEzNjU0LCAxMjAzNjU0LCAyMTAzNjU0LCAgMTMyNjU0LCAxMDMyNjU0LCAgMzEyNjU0LCAzMDEyNjU0LCAxMzAyNjU0LCAzMTAyNjU0LAotICAgICAgIDIzMTY1NCwgMjAzMTY1NCwgIDMyMTY1NCwgMzAyMTY1NCwgMjMwMTY1NCwgMzIwMTY1NCwgMTIzMDY1NCwgMjEzMDY1NCwgMTMyMDY1NCwgMzEyMDY1NCwgMjMxMDY1NCwgMzIxMDY1NCwKLSAgICAgICAxMjYzNTQsIDEwMjYzNTQsICAyMTYzNTQsIDIwMTYzNTQsIDEyMDYzNTQsIDIxMDYzNTQsICAxNjIzNTQsIDEwNjIzNTQsICA2MTIzNTQsIDYwMTIzNTQsIDE2MDIzNTQsIDYxMDIzNTQsCi0gICAgICAgMjYxMzU0LCAyMDYxMzU0LCAgNjIxMzU0LCA2MDIxMzU0LCAyNjAxMzU0LCA2MjAxMzU0LCAxMjYwMzU0LCAyMTYwMzU0LCAxNjIwMzU0LCA2MTIwMzU0LCAyNjEwMzU0LCA2MjEwMzU0LAotICAgICAgIDEzNjI1NCwgMTAzNjI1NCwgIDMxNjI1NCwgMzAxNjI1NCwgMTMwNjI1NCwgMzEwNjI1NCwgIDE2MzI1NCwgMTA2MzI1NCwgIDYxMzI1NCwgNjAxMzI1NCwgMTYwMzI1NCwgNjEwMzI1NCwKLSAgICAgICAzNjEyNTQsIDMwNjEyNTQsICA2MzEyNTQsIDYwMzEyNTQsIDM2MDEyNTQsIDYzMDEyNTQsIDEzNjAyNTQsIDMxNjAyNTQsIDE2MzAyNTQsIDYxMzAyNTQsIDM2MTAyNTQsIDYzMTAyNTQsCi0gICAgICAgMjM2MTU0LCAyMDM2MTU0LCAgMzI2MTU0LCAzMDI2MTU0LCAyMzA2MTU0LCAzMjA2MTU0LCAgMjYzMTU0LCAyMDYzMTU0LCAgNjIzMTU0LCA2MDIzMTU0LCAyNjAzMTU0LCA2MjAzMTU0LAotICAgICAgIDM2MjE1NCwgMzA2MjE1NCwgIDYzMjE1NCwgNjAzMjE1NCwgMzYwMjE1NCwgNjMwMjE1NCwgMjM2MDE1NCwgMzI2MDE1NCwgMjYzMDE1NCwgNjIzMDE1NCwgMzYyMDE1NCwgNjMyMDE1NCwKLSAgICAgIDEyMzYwNTQsIDIxMzYwNTQsIDEzMjYwNTQsIDMxMjYwNTQsIDIzMTYwNTQsIDMyMTYwNTQsIDEyNjMwNTQsIDIxNjMwNTQsIDE2MjMwNTQsIDYxMjMwNTQsIDI2MTMwNTQsIDYyMTMwNTQsCi0gICAgICAxMzYyMDU0LCAzMTYyMDU0LCAxNjMyMDU0LCA2MTMyMDU0LCAzNjEyMDU0LCA2MzEyMDU0LCAyMzYxMDU0LCAzMjYxMDU0LCAyNjMxMDU0LCA2MjMxMDU0LCAzNjIxMDU0LCA2MzIxMDU0LAotICAgICAgIDEyNTYzNCwgMTAyNTYzNCwgIDIxNTYzNCwgMjAxNTYzNCwgMTIwNTYzNCwgMjEwNTYzNCwgIDE1MjYzNCwgMTA1MjYzNCwgIDUxMjYzNCwgNTAxMjYzNCwgMTUwMjYzNCwgNTEwMjYzNCwKLSAgICAgICAyNTE2MzQsIDIwNTE2MzQsICA1MjE2MzQsIDUwMjE2MzQsIDI1MDE2MzQsIDUyMDE2MzQsIDEyNTA2MzQsIDIxNTA2MzQsIDE1MjA2MzQsIDUxMjA2MzQsIDI1MTA2MzQsIDUyMTA2MzQsCi0gICAgICAgMTI2NTM0LCAxMDI2NTM0LCAgMjE2NTM0LCAyMDE2NTM0LCAxMjA2NTM0LCAyMTA2NTM0LCAgMTYyNTM0LCAxMDYyNTM0LCAgNjEyNTM0LCA2MDEyNTM0LCAxNjAyNTM0LCA2MTAyNTM0LAotICAgICAgIDI2MTUzNCwgMjA2MTUzNCwgIDYyMTUzNCwgNjAyMTUzNCwgMjYwMTUzNCwgNjIwMTUzNCwgMTI2MDUzNCwgMjE2MDUzNCwgMTYyMDUzNCwgNjEyMDUzNCwgMjYxMDUzNCwgNjIxMDUzNCwKLSAgICAgICAxNTYyMzQsIDEwNTYyMzQsICA1MTYyMzQsIDUwMTYyMzQsIDE1MDYyMzQsIDUxMDYyMzQsICAxNjUyMzQsIDEwNjUyMzQsICA2MTUyMzQsIDYwMTUyMzQsIDE2MDUyMzQsIDYxMDUyMzQsCi0gICAgICAgNTYxMjM0LCA1MDYxMjM0LCAgNjUxMjM0LCA2MDUxMjM0LCA1NjAxMjM0LCA2NTAxMjM0LCAxNTYwMjM0LCA1MTYwMjM0LCAxNjUwMjM0LCA2MTUwMjM0LCA1NjEwMjM0LCA2NTEwMjM0LAotICAgICAgIDI1NjEzNCwgMjA1NjEzNCwgIDUyNjEzNCwgNTAyNjEzNCwgMjUwNjEzNCwgNTIwNjEzNCwgIDI2NTEzNCwgMjA2NTEzNCwgIDYyNTEzNCwgNjAyNTEzNCwgMjYwNTEzNCwgNjIwNTEzNCwKLSAgICAgICA1NjIxMzQsIDUwNjIxMzQsICA2NTIxMzQsIDYwNTIxMzQsIDU2MDIxMzQsIDY1MDIxMzQsIDI1NjAxMzQsIDUyNjAxMzQsIDI2NTAxMzQsIDYyNTAxMzQsIDU2MjAxMzQsIDY1MjAxMzQsCi0gICAgICAxMjU2MDM0LCAyMTU2MDM0LCAxNTI2MDM0LCA1MTI2MDM0LCAyNTE2MDM0LCA1MjE2MDM0LCAxMjY1MDM0LCAyMTY1MDM0LCAxNjI1MDM0LCA2MTI1MDM0LCAyNjE1MDM0LCA2MjE1MDM0LAotICAgICAgMTU2MjAzNCwgNTE2MjAzNCwgMTY1MjAzNCwgNjE1MjAzNCwgNTYxMjAzNCwgNjUxMjAzNCwgMjU2MTAzNCwgNTI2MTAzNCwgMjY1MTAzNCwgNjI1MTAzNCwgNTYyMTAzNCwgNjUyMTAzNCwKLSAgICAgICAxMzU2MjQsIDEwMzU2MjQsICAzMTU2MjQsIDMwMTU2MjQsIDEzMDU2MjQsIDMxMDU2MjQsICAxNTM2MjQsIDEwNTM2MjQsICA1MTM2MjQsIDUwMTM2MjQsIDE1MDM2MjQsIDUxMDM2MjQsCi0gICAgICAgMzUxNjI0LCAzMDUxNjI0LCAgNTMxNjI0LCA1MDMxNjI0LCAzNTAxNjI0LCA1MzAxNjI0LCAxMzUwNjI0LCAzMTUwNjI0LCAxNTMwNjI0LCA1MTMwNjI0LCAzNTEwNjI0LCA1MzEwNjI0LAotICAgICAgIDEzNjUyNCwgMTAzNjUyNCwgIDMxNjUyNCwgMzAxNjUyNCwgMTMwNjUyNCwgMzEwNjUyNCwgIDE2MzUyNCwgMTA2MzUyNCwgIDYxMzUyNCwgNjAxMzUyNCwgMTYwMzUyNCwgNjEwMzUyNCwKLSAgICAgICAzNjE1MjQsIDMwNjE1MjQsICA2MzE1MjQsIDYwMzE1MjQsIDM2MDE1MjQsIDYzMDE1MjQsIDEzNjA1MjQsIDMxNjA1MjQsIDE2MzA1MjQsIDYxMzA1MjQsIDM2MTA1MjQsIDYzMTA1MjQsCi0gICAgICAgMTU2MzI0LCAxMDU2MzI0LCAgNTE2MzI0LCA1MDE2MzI0LCAxNTA2MzI0LCA1MTA2MzI0LCAgMTY1MzI0LCAxMDY1MzI0LCAgNjE1MzI0LCA2MDE1MzI0LCAxNjA1MzI0LCA2MTA1MzI0LAotICAgICAgIDU2MTMyNCwgNTA2MTMyNCwgIDY1MTMyNCwgNjA1MTMyNCwgNTYwMTMyNCwgNjUwMTMyNCwgMTU2MDMyNCwgNTE2MDMyNCwgMTY1MDMyNCwgNjE1MDMyNCwgNTYxMDMyNCwgNjUxMDMyNCwKLSAgICAgICAzNTYxMjQsIDMwNTYxMjQsICA1MzYxMjQsIDUwMzYxMjQsIDM1MDYxMjQsIDUzMDYxMjQsICAzNjUxMjQsIDMwNjUxMjQsICA2MzUxMjQsIDYwMzUxMjQsIDM2MDUxMjQsIDYzMDUxMjQsCi0gICAgICAgNTYzMTI0LCA1MDYzMTI0LCAgNjUzMTI0LCA2MDUzMTI0LCA1NjAzMTI0LCA2NTAzMTI0LCAzNTYwMTI0LCA1MzYwMTI0LCAzNjUwMTI0LCA2MzUwMTI0LCA1NjMwMTI0LCA2NTMwMTI0LAotICAgICAgMTM1NjAyNCwgMzE1NjAyNCwgMTUzNjAyNCwgNTEzNjAyNCwgMzUxNjAyNCwgNTMxNjAyNCwgMTM2NTAyNCwgMzE2NTAyNCwgMTYzNTAyNCwgNjEzNTAyNCwgMzYxNTAyNCwgNjMxNTAyNCwKLSAgICAgIDE1NjMwMjQsIDUxNjMwMjQsIDE2NTMwMjQsIDYxNTMwMjQsIDU2MTMwMjQsIDY1MTMwMjQsIDM1NjEwMjQsIDUzNjEwMjQsIDM2NTEwMjQsIDYzNTEwMjQsIDU2MzEwMjQsIDY1MzEwMjQsCi0gICAgICAgMjM1NjE0LCAyMDM1NjE0LCAgMzI1NjE0LCAzMDI1NjE0LCAyMzA1NjE0LCAzMjA1NjE0LCAgMjUzNjE0LCAyMDUzNjE0LCAgNTIzNjE0LCA1MDIzNjE0LCAyNTAzNjE0LCA1MjAzNjE0LAotICAgICAgIDM1MjYxNCwgMzA1MjYxNCwgIDUzMjYxNCwgNTAzMjYxNCwgMzUwMjYxNCwgNTMwMjYxNCwgMjM1MDYxNCwgMzI1MDYxNCwgMjUzMDYxNCwgNTIzMDYxNCwgMzUyMDYxNCwgNTMyMDYxNCwKLSAgICAgICAyMzY1MTQsIDIwMzY1MTQsICAzMjY1MTQsIDMwMjY1MTQsIDIzMDY1MTQsIDMyMDY1MTQsICAyNjM1MTQsIDIwNjM1MTQsICA2MjM1MTQsIDYwMjM1MTQsIDI2MDM1MTQsIDYyMDM1MTQsCi0gICAgICAgMzYyNTE0LCAzMDYyNTE0LCAgNjMyNTE0LCA2MDMyNTE0LCAzNjAyNTE0LCA2MzAyNTE0LCAyMzYwNTE0LCAzMjYwNTE0LCAyNjMwNTE0LCA2MjMwNTE0LCAzNjIwNTE0LCA2MzIwNTE0LAotICAgICAgIDI1NjMxNCwgMjA1NjMxNCwgIDUyNjMxNCwgNTAyNjMxNCwgMjUwNjMxNCwgNTIwNjMxNCwgIDI2NTMxNCwgMjA2NTMxNCwgIDYyNTMxNCwgNjAyNTMxNCwgMjYwNTMxNCwgNjIwNTMxNCwKLSAgICAgICA1NjIzMTQsIDUwNjIzMTQsICA2NTIzMTQsIDYwNTIzMTQsIDU2MDIzMTQsIDY1MDIzMTQsIDI1NjAzMTQsIDUyNjAzMTQsIDI2NTAzMTQsIDYyNTAzMTQsIDU2MjAzMTQsIDY1MjAzMTQsCi0gICAgICAgMzU2MjE0LCAzMDU2MjE0LCAgNTM2MjE0LCA1MDM2MjE0LCAzNTA2MjE0LCA1MzA2MjE0LCAgMzY1MjE0LCAzMDY1MjE0LCAgNjM1MjE0LCA2MDM1MjE0LCAzNjA1MjE0LCA2MzA1MjE0LAotICAgICAgIDU2MzIxNCwgNTA2MzIxNCwgIDY1MzIxNCwgNjA1MzIxNCwgNTYwMzIxNCwgNjUwMzIxNCwgMzU2MDIxNCwgNTM2MDIxNCwgMzY1MDIxNCwgNjM1MDIxNCwgNTYzMDIxNCwgNjUzMDIxNCwKLSAgICAgIDIzNTYwMTQsIDMyNTYwMTQsIDI1MzYwMTQsIDUyMzYwMTQsIDM1MjYwMTQsIDUzMjYwMTQsIDIzNjUwMTQsIDMyNjUwMTQsIDI2MzUwMTQsIDYyMzUwMTQsIDM2MjUwMTQsIDYzMjUwMTQsCi0gICAgICAyNTYzMDE0LCA1MjYzMDE0LCAyNjUzMDE0LCA2MjUzMDE0LCA1NjIzMDE0LCA2NTIzMDE0LCAzNTYyMDE0LCA1MzYyMDE0LCAzNjUyMDE0LCA2MzUyMDE0LCA1NjMyMDE0LCA2NTMyMDE0LAotICAgICAgMTIzNTYwNCwgMjEzNTYwNCwgMTMyNTYwNCwgMzEyNTYwNCwgMjMxNTYwNCwgMzIxNTYwNCwgMTI1MzYwNCwgMjE1MzYwNCwgMTUyMzYwNCwgNTEyMzYwNCwgMjUxMzYwNCwgNTIxMzYwNCwKLSAgICAgIDEzNTI2MDQsIDMxNTI2MDQsIDE1MzI2MDQsIDUxMzI2MDQsIDM1MTI2MDQsIDUzMTI2MDQsIDIzNTE2MDQsIDMyNTE2MDQsIDI1MzE2MDQsIDUyMzE2MDQsIDM1MjE2MDQsIDUzMjE2MDQsCi0gICAgICAxMjM2NTA0LCAyMTM2NTA0LCAxMzI2NTA0LCAzMTI2NTA0LCAyMzE2NTA0LCAzMjE2NTA0LCAxMjYzNTA0LCAyMTYzNTA0LCAxNjIzNTA0LCA2MTIzNTA0LCAyNjEzNTA0LCA2MjEzNTA0LAotICAgICAgMTM2MjUwNCwgMzE2MjUwNCwgMTYzMjUwNCwgNjEzMjUwNCwgMzYxMjUwNCwgNjMxMjUwNCwgMjM2MTUwNCwgMzI2MTUwNCwgMjYzMTUwNCwgNjIzMTUwNCwgMzYyMTUwNCwgNjMyMTUwNCwKLSAgICAgIDEyNTYzMDQsIDIxNTYzMDQsIDE1MjYzMDQsIDUxMjYzMDQsIDI1MTYzMDQsIDUyMTYzMDQsIDEyNjUzMDQsIDIxNjUzMDQsIDE2MjUzMDQsIDYxMjUzMDQsIDI2MTUzMDQsIDYyMTUzMDQsCi0gICAgICAxNTYyMzA0LCA1MTYyMzA0LCAxNjUyMzA0LCA2MTUyMzA0LCA1NjEyMzA0LCA2NTEyMzA0LCAyNTYxMzA0LCA1MjYxMzA0LCAyNjUxMzA0LCA2MjUxMzA0LCA1NjIxMzA0LCA2NTIxMzA0LAotICAgICAgMTM1NjIwNCwgMzE1NjIwNCwgMTUzNjIwNCwgNTEzNjIwNCwgMzUxNjIwNCwgNTMxNjIwNCwgMTM2NTIwNCwgMzE2NTIwNCwgMTYzNTIwNCwgNjEzNTIwNCwgMzYxNTIwNCwgNjMxNTIwNCwKLSAgICAgIDE1NjMyMDQsIDUxNjMyMDQsIDE2NTMyMDQsIDYxNTMyMDQsIDU2MTMyMDQsIDY1MTMyMDQsIDM1NjEyMDQsIDUzNjEyMDQsIDM2NTEyMDQsIDYzNTEyMDQsIDU2MzEyMDQsIDY1MzEyMDQsCi0gICAgICAyMzU2MTA0LCAzMjU2MTA0LCAyNTM2MTA0LCA1MjM2MTA0LCAzNTI2MTA0LCA1MzI2MTA0LCAyMzY1MTA0LCAzMjY1MTA0LCAyNjM1MTA0LCA2MjM1MTA0LCAzNjI1MTA0LCA2MzI1MTA0LAotICAgICAgMjU2MzEwNCwgNTI2MzEwNCwgMjY1MzEwNCwgNjI1MzEwNCwgNTYyMzEwNCwgNjUyMzEwNCwgMzU2MjEwNCwgNTM2MjEwNCwgMzY1MjEwNCwgNjM1MjEwNCwgNTYzMjEwNCwgNjUzMjEwNCwKLSAgICAgICAxMjQ1NjMsIDEwMjQ1NjMsICAyMTQ1NjMsIDIwMTQ1NjMsIDEyMDQ1NjMsIDIxMDQ1NjMsICAxNDI1NjMsIDEwNDI1NjMsICA0MTI1NjMsIDQwMTI1NjMsIDE0MDI1NjMsIDQxMDI1NjMsCi0gICAgICAgMjQxNTYzLCAyMDQxNTYzLCAgNDIxNTYzLCA0MDIxNTYzLCAyNDAxNTYzLCA0MjAxNTYzLCAxMjQwNTYzLCAyMTQwNTYzLCAxNDIwNTYzLCA0MTIwNTYzLCAyNDEwNTYzLCA0MjEwNTYzLAotICAgICAgIDEyNTQ2MywgMTAyNTQ2MywgIDIxNTQ2MywgMjAxNTQ2MywgMTIwNTQ2MywgMjEwNTQ2MywgIDE1MjQ2MywgMTA1MjQ2MywgIDUxMjQ2MywgNTAxMjQ2MywgMTUwMjQ2MywgNTEwMjQ2MywKLSAgICAgICAyNTE0NjMsIDIwNTE0NjMsICA1MjE0NjMsIDUwMjE0NjMsIDI1MDE0NjMsIDUyMDE0NjMsIDEyNTA0NjMsIDIxNTA0NjMsIDE1MjA0NjMsIDUxMjA0NjMsIDI1MTA0NjMsIDUyMTA0NjMsCi0gICAgICAgMTQ1MjYzLCAxMDQ1MjYzLCAgNDE1MjYzLCA0MDE1MjYzLCAxNDA1MjYzLCA0MTA1MjYzLCAgMTU0MjYzLCAxMDU0MjYzLCAgNTE0MjYzLCA1MDE0MjYzLCAxNTA0MjYzLCA1MTA0MjYzLAotICAgICAgIDQ1MTI2MywgNDA1MTI2MywgIDU0MTI2MywgNTA0MTI2MywgNDUwMTI2MywgNTQwMTI2MywgMTQ1MDI2MywgNDE1MDI2MywgMTU0MDI2MywgNTE0MDI2MywgNDUxMDI2MywgNTQxMDI2MywKLSAgICAgICAyNDUxNjMsIDIwNDUxNjMsICA0MjUxNjMsIDQwMjUxNjMsIDI0MDUxNjMsIDQyMDUxNjMsICAyNTQxNjMsIDIwNTQxNjMsICA1MjQxNjMsIDUwMjQxNjMsIDI1MDQxNjMsIDUyMDQxNjMsCi0gICAgICAgNDUyMTYzLCA0MDUyMTYzLCAgNTQyMTYzLCA1MDQyMTYzLCA0NTAyMTYzLCA1NDAyMTYzLCAyNDUwMTYzLCA0MjUwMTYzLCAyNTQwMTYzLCA1MjQwMTYzLCA0NTIwMTYzLCA1NDIwMTYzLAotICAgICAgMTI0NTA2MywgMjE0NTA2MywgMTQyNTA2MywgNDEyNTA2MywgMjQxNTA2MywgNDIxNTA2MywgMTI1NDA2MywgMjE1NDA2MywgMTUyNDA2MywgNTEyNDA2MywgMjUxNDA2MywgNTIxNDA2MywKLSAgICAgIDE0NTIwNjMsIDQxNTIwNjMsIDE1NDIwNjMsIDUxNDIwNjMsIDQ1MTIwNjMsIDU0MTIwNjMsIDI0NTEwNjMsIDQyNTEwNjMsIDI1NDEwNjMsIDUyNDEwNjMsIDQ1MjEwNjMsIDU0MjEwNjMsCi0gICAgICAgMTI0NjUzLCAxMDI0NjUzLCAgMjE0NjUzLCAyMDE0NjUzLCAxMjA0NjUzLCAyMTA0NjUzLCAgMTQyNjUzLCAxMDQyNjUzLCAgNDEyNjUzLCA0MDEyNjUzLCAxNDAyNjUzLCA0MTAyNjUzLAotICAgICAgIDI0MTY1MywgMjA0MTY1MywgIDQyMTY1MywgNDAyMTY1MywgMjQwMTY1MywgNDIwMTY1MywgMTI0MDY1MywgMjE0MDY1MywgMTQyMDY1MywgNDEyMDY1MywgMjQxMDY1MywgNDIxMDY1MywKLSAgICAgICAxMjY0NTMsIDEwMjY0NTMsICAyMTY0NTMsIDIwMTY0NTMsIDEyMDY0NTMsIDIxMDY0NTMsICAxNjI0NTMsIDEwNjI0NTMsICA2MTI0NTMsIDYwMTI0NTMsIDE2MDI0NTMsIDYxMDI0NTMsCi0gICAgICAgMjYxNDUzLCAyMDYxNDUzLCAgNjIxNDUzLCA2MDIxNDUzLCAyNjAxNDUzLCA2MjAxNDUzLCAxMjYwNDUzLCAyMTYwNDUzLCAxNjIwNDUzLCA2MTIwNDUzLCAyNjEwNDUzLCA2MjEwNDUzLAotICAgICAgIDE0NjI1MywgMTA0NjI1MywgIDQxNjI1MywgNDAxNjI1MywgMTQwNjI1MywgNDEwNjI1MywgIDE2NDI1MywgMTA2NDI1MywgIDYxNDI1MywgNjAxNDI1MywgMTYwNDI1MywgNjEwNDI1MywKLSAgICAgICA0NjEyNTMsIDQwNjEyNTMsICA2NDEyNTMsIDYwNDEyNTMsIDQ2MDEyNTMsIDY0MDEyNTMsIDE0NjAyNTMsIDQxNjAyNTMsIDE2NDAyNTMsIDYxNDAyNTMsIDQ2MTAyNTMsIDY0MTAyNTMsCi0gICAgICAgMjQ2MTUzLCAyMDQ2MTUzLCAgNDI2MTUzLCA0MDI2MTUzLCAyNDA2MTUzLCA0MjA2MTUzLCAgMjY0MTUzLCAyMDY0MTUzLCAgNjI0MTUzLCA2MDI0MTUzLCAyNjA0MTUzLCA2MjA0MTUzLAotICAgICAgIDQ2MjE1MywgNDA2MjE1MywgIDY0MjE1MywgNjA0MjE1MywgNDYwMjE1MywgNjQwMjE1MywgMjQ2MDE1MywgNDI2MDE1MywgMjY0MDE1MywgNjI0MDE1MywgNDYyMDE1MywgNjQyMDE1MywKLSAgICAgIDEyNDYwNTMsIDIxNDYwNTMsIDE0MjYwNTMsIDQxMjYwNTMsIDI0MTYwNTMsIDQyMTYwNTMsIDEyNjQwNTMsIDIxNjQwNTMsIDE2MjQwNTMsIDYxMjQwNTMsIDI2MTQwNTMsIDYyMTQwNTMsCi0gICAgICAxNDYyMDUzLCA0MTYyMDUzLCAxNjQyMDUzLCA2MTQyMDUzLCA0NjEyMDUzLCA2NDEyMDUzLCAyNDYxMDUzLCA0MjYxMDUzLCAyNjQxMDUzLCA2MjQxMDUzLCA0NjIxMDUzLCA2NDIxMDUzLAotICAgICAgIDEyNTY0MywgMTAyNTY0MywgIDIxNTY0MywgMjAxNTY0MywgMTIwNTY0MywgMjEwNTY0MywgIDE1MjY0MywgMTA1MjY0MywgIDUxMjY0MywgNTAxMjY0MywgMTUwMjY0MywgNTEwMjY0MywKLSAgICAgICAyNTE2NDMsIDIwNTE2NDMsICA1MjE2NDMsIDUwMjE2NDMsIDI1MDE2NDMsIDUyMDE2NDMsIDEyNTA2NDMsIDIxNTA2NDMsIDE1MjA2NDMsIDUxMjA2NDMsIDI1MTA2NDMsIDUyMTA2NDMsCi0gICAgICAgMTI2NTQzLCAxMDI2NTQzLCAgMjE2NTQzLCAyMDE2NTQzLCAxMjA2NTQzLCAyMTA2NTQzLCAgMTYyNTQzLCAxMDYyNTQzLCAgNjEyNTQzLCA2MDEyNTQzLCAxNjAyNTQzLCA2MTAyNTQzLAotICAgICAgIDI2MTU0MywgMjA2MTU0MywgIDYyMTU0MywgNjAyMTU0MywgMjYwMTU0MywgNjIwMTU0MywgMTI2MDU0MywgMjE2MDU0MywgMTYyMDU0MywgNjEyMDU0MywgMjYxMDU0MywgNjIxMDU0MywKLSAgICAgICAxNTYyNDMsIDEwNTYyNDMsICA1MTYyNDMsIDUwMTYyNDMsIDE1MDYyNDMsIDUxMDYyNDMsICAxNjUyNDMsIDEwNjUyNDMsICA2MTUyNDMsIDYwMTUyNDMsIDE2MDUyNDMsIDYxMDUyNDMsCi0gICAgICAgNTYxMjQzLCA1MDYxMjQzLCAgNjUxMjQzLCA2MDUxMjQzLCA1NjAxMjQzLCA2NTAxMjQzLCAxNTYwMjQzLCA1MTYwMjQzLCAxNjUwMjQzLCA2MTUwMjQzLCA1NjEwMjQzLCA2NTEwMjQzLAotICAgICAgIDI1NjE0MywgMjA1NjE0MywgIDUyNjE0MywgNTAyNjE0MywgMjUwNjE0MywgNTIwNjE0MywgIDI2NTE0MywgMjA2NTE0MywgIDYyNTE0MywgNjAyNTE0MywgMjYwNTE0MywgNjIwNTE0MywKLSAgICAgICA1NjIxNDMsIDUwNjIxNDMsICA2NTIxNDMsIDYwNTIxNDMsIDU2MDIxNDMsIDY1MDIxNDMsIDI1NjAxNDMsIDUyNjAxNDMsIDI2NTAxNDMsIDYyNTAxNDMsIDU2MjAxNDMsIDY1MjAxNDMsCi0gICAgICAxMjU2MDQzLCAyMTU2MDQzLCAxNTI2MDQzLCA1MTI2MDQzLCAyNTE2MDQzLCA1MjE2MDQzLCAxMjY1MDQzLCAyMTY1MDQzLCAxNjI1MDQzLCA2MTI1MDQzLCAyNjE1MDQzLCA2MjE1MDQzLAotICAgICAgMTU2MjA0MywgNTE2MjA0MywgMTY1MjA0MywgNjE1MjA0MywgNTYxMjA0MywgNjUxMjA0MywgMjU2MTA0MywgNTI2MTA0MywgMjY1MTA0MywgNjI1MTA0MywgNTYyMTA0MywgNjUyMTA0MywKLSAgICAgICAxNDU2MjMsIDEwNDU2MjMsICA0MTU2MjMsIDQwMTU2MjMsIDE0MDU2MjMsIDQxMDU2MjMsICAxNTQ2MjMsIDEwNTQ2MjMsICA1MTQ2MjMsIDUwMTQ2MjMsIDE1MDQ2MjMsIDUxMDQ2MjMsCi0gICAgICAgNDUxNjIzLCA0MDUxNjIzLCAgNTQxNjIzLCA1MDQxNjIzLCA0NTAxNjIzLCA1NDAxNjIzLCAxNDUwNjIzLCA0MTUwNjIzLCAxNTQwNjIzLCA1MTQwNjIzLCA0NTEwNjIzLCA1NDEwNjIzLAotICAgICAgIDE0NjUyMywgMTA0NjUyMywgIDQxNjUyMywgNDAxNjUyMywgMTQwNjUyMywgNDEwNjUyMywgIDE2NDUyMywgMTA2NDUyMywgIDYxNDUyMywgNjAxNDUyMywgMTYwNDUyMywgNjEwNDUyMywKLSAgICAgICA0NjE1MjMsIDQwNjE1MjMsICA2NDE1MjMsIDYwNDE1MjMsIDQ2MDE1MjMsIDY0MDE1MjMsIDE0NjA1MjMsIDQxNjA1MjMsIDE2NDA1MjMsIDYxNDA1MjMsIDQ2MTA1MjMsIDY0MTA1MjMsCi0gICAgICAgMTU2NDIzLCAxMDU2NDIzLCAgNTE2NDIzLCA1MDE2NDIzLCAxNTA2NDIzLCA1MTA2NDIzLCAgMTY1NDIzLCAxMDY1NDIzLCAgNjE1NDIzLCA2MDE1NDIzLCAxNjA1NDIzLCA2MTA1NDIzLAotICAgICAgIDU2MTQyMywgNTA2MTQyMywgIDY1MTQyMywgNjA1MTQyMywgNTYwMTQyMywgNjUwMTQyMywgMTU2MDQyMywgNTE2MDQyMywgMTY1MDQyMywgNjE1MDQyMywgNTYxMDQyMywgNjUxMDQyMywKLSAgICAgICA0NTYxMjMsIDQwNTYxMjMsICA1NDYxMjMsIDUwNDYxMjMsIDQ1MDYxMjMsIDU0MDYxMjMsICA0NjUxMjMsIDQwNjUxMjMsICA2NDUxMjMsIDYwNDUxMjMsIDQ2MDUxMjMsIDY0MDUxMjMsCi0gICAgICAgNTY0MTIzLCA1MDY0MTIzLCAgNjU0MTIzLCA2MDU0MTIzLCA1NjA0MTIzLCA2NTA0MTIzLCA0NTYwMTIzLCA1NDYwMTIzLCA0NjUwMTIzLCA2NDUwMTIzLCA1NjQwMTIzLCA2NTQwMTIzLAotICAgICAgMTQ1NjAyMywgNDE1NjAyMywgMTU0NjAyMywgNTE0NjAyMywgNDUxNjAyMywgNTQxNjAyMywgMTQ2NTAyMywgNDE2NTAyMywgMTY0NTAyMywgNjE0NTAyMywgNDYxNTAyMywgNjQxNTAyMywKLSAgICAgIDE1NjQwMjMsIDUxNjQwMjMsIDE2NTQwMjMsIDYxNTQwMjMsIDU2MTQwMjMsIDY1MTQwMjMsIDQ1NjEwMjMsIDU0NjEwMjMsIDQ2NTEwMjMsIDY0NTEwMjMsIDU2NDEwMjMsIDY1NDEwMjMsCi0gICAgICAgMjQ1NjEzLCAyMDQ1NjEzLCAgNDI1NjEzLCA0MDI1NjEzLCAyNDA1NjEzLCA0MjA1NjEzLCAgMjU0NjEzLCAyMDU0NjEzLCAgNTI0NjEzLCA1MDI0NjEzLCAyNTA0NjEzLCA1MjA0NjEzLAotICAgICAgIDQ1MjYxMywgNDA1MjYxMywgIDU0MjYxMywgNTA0MjYxMywgNDUwMjYxMywgNTQwMjYxMywgMjQ1MDYxMywgNDI1MDYxMywgMjU0MDYxMywgNTI0MDYxMywgNDUyMDYxMywgNTQyMDYxMywKLSAgICAgICAyNDY1MTMsIDIwNDY1MTMsICA0MjY1MTMsIDQwMjY1MTMsIDI0MDY1MTMsIDQyMDY1MTMsICAyNjQ1MTMsIDIwNjQ1MTMsICA2MjQ1MTMsIDYwMjQ1MTMsIDI2MDQ1MTMsIDYyMDQ1MTMsCi0gICAgICAgNDYyNTEzLCA0MDYyNTEzLCAgNjQyNTEzLCA2MDQyNTEzLCA0NjAyNTEzLCA2NDAyNTEzLCAyNDYwNTEzLCA0MjYwNTEzLCAyNjQwNTEzLCA2MjQwNTEzLCA0NjIwNTEzLCA2NDIwNTEzLAotICAgICAgIDI1NjQxMywgMjA1NjQxMywgIDUyNjQxMywgNTAyNjQxMywgMjUwNjQxMywgNTIwNjQxMywgIDI2NTQxMywgMjA2NTQxMywgIDYyNTQxMywgNjAyNTQxMywgMjYwNTQxMywgNjIwNTQxMywKLSAgICAgICA1NjI0MTMsIDUwNjI0MTMsICA2NTI0MTMsIDYwNTI0MTMsIDU2MDI0MTMsIDY1MDI0MTMsIDI1NjA0MTMsIDUyNjA0MTMsIDI2NTA0MTMsIDYyNTA0MTMsIDU2MjA0MTMsIDY1MjA0MTMsCi0gICAgICAgNDU2MjEzLCA0MDU2MjEzLCAgNTQ2MjEzLCA1MDQ2MjEzLCA0NTA2MjEzLCA1NDA2MjEzLCAgNDY1MjEzLCA0MDY1MjEzLCAgNjQ1MjEzLCA2MDQ1MjEzLCA0NjA1MjEzLCA2NDA1MjEzLAotICAgICAgIDU2NDIxMywgNTA2NDIxMywgIDY1NDIxMywgNjA1NDIxMywgNTYwNDIxMywgNjUwNDIxMywgNDU2MDIxMywgNTQ2MDIxMywgNDY1MDIxMywgNjQ1MDIxMywgNTY0MDIxMywgNjU0MDIxMywKLSAgICAgIDI0NTYwMTMsIDQyNTYwMTMsIDI1NDYwMTMsIDUyNDYwMTMsIDQ1MjYwMTMsIDU0MjYwMTMsIDI0NjUwMTMsIDQyNjUwMTMsIDI2NDUwMTMsIDYyNDUwMTMsIDQ2MjUwMTMsIDY0MjUwMTMsCi0gICAgICAyNTY0MDEzLCA1MjY0MDEzLCAyNjU0MDEzLCA2MjU0MDEzLCA1NjI0MDEzLCA2NTI0MDEzLCA0NTYyMDEzLCA1NDYyMDEzLCA0NjUyMDEzLCA2NDUyMDEzLCA1NjQyMDEzLCA2NTQyMDEzLAotICAgICAgMTI0NTYwMywgMjE0NTYwMywgMTQyNTYwMywgNDEyNTYwMywgMjQxNTYwMywgNDIxNTYwMywgMTI1NDYwMywgMjE1NDYwMywgMTUyNDYwMywgNTEyNDYwMywgMjUxNDYwMywgNTIxNDYwMywKLSAgICAgIDE0NTI2MDMsIDQxNTI2MDMsIDE1NDI2MDMsIDUxNDI2MDMsIDQ1MTI2MDMsIDU0MTI2MDMsIDI0NTE2MDMsIDQyNTE2MDMsIDI1NDE2MDMsIDUyNDE2MDMsIDQ1MjE2MDMsIDU0MjE2MDMsCi0gICAgICAxMjQ2NTAzLCAyMTQ2NTAzLCAxNDI2NTAzLCA0MTI2NTAzLCAyNDE2NTAzLCA0MjE2NTAzLCAxMjY0NTAzLCAyMTY0NTAzLCAxNjI0NTAzLCA2MTI0NTAzLCAyNjE0NTAzLCA2MjE0NTAzLAotICAgICAgMTQ2MjUwMywgNDE2MjUwMywgMTY0MjUwMywgNjE0MjUwMywgNDYxMjUwMywgNjQxMjUwMywgMjQ2MTUwMywgNDI2MTUwMywgMjY0MTUwMywgNjI0MTUwMywgNDYyMTUwMywgNjQyMTUwMywKLSAgICAgIDEyNTY0MDMsIDIxNTY0MDMsIDE1MjY0MDMsIDUxMjY0MDMsIDI1MTY0MDMsIDUyMTY0MDMsIDEyNjU0MDMsIDIxNjU0MDMsIDE2MjU0MDMsIDYxMjU0MDMsIDI2MTU0MDMsIDYyMTU0MDMsCi0gICAgICAxNTYyNDAzLCA1MTYyNDAzLCAxNjUyNDAzLCA2MTUyNDAzLCA1NjEyNDAzLCA2NTEyNDAzLCAyNTYxNDAzLCA1MjYxNDAzLCAyNjUxNDAzLCA2MjUxNDAzLCA1NjIxNDAzLCA2NTIxNDAzLAotICAgICAgMTQ1NjIwMywgNDE1NjIwMywgMTU0NjIwMywgNTE0NjIwMywgNDUxNjIwMywgNTQxNjIwMywgMTQ2NTIwMywgNDE2NTIwMywgMTY0NTIwMywgNjE0NTIwMywgNDYxNTIwMywgNjQxNTIwMywKLSAgICAgIDE1NjQyMDMsIDUxNjQyMDMsIDE2NTQyMDMsIDYxNTQyMDMsIDU2MTQyMDMsIDY1MTQyMDMsIDQ1NjEyMDMsIDU0NjEyMDMsIDQ2NTEyMDMsIDY0NTEyMDMsIDU2NDEyMDMsIDY1NDEyMDMsCi0gICAgICAyNDU2MTAzLCA0MjU2MTAzLCAyNTQ2MTAzLCA1MjQ2MTAzLCA0NTI2MTAzLCA1NDI2MTAzLCAyNDY1MTAzLCA0MjY1MTAzLCAyNjQ1MTAzLCA2MjQ1MTAzLCA0NjI1MTAzLCA2NDI1MTAzLAotICAgICAgMjU2NDEwMywgNTI2NDEwMywgMjY1NDEwMywgNjI1NDEwMywgNTYyNDEwMywgNjUyNDEwMywgNDU2MjEwMywgNTQ2MjEwMywgNDY1MjEwMywgNjQ1MjEwMywgNTY0MjEwMywgNjU0MjEwMywKLSAgICAgICAxMzQ1NjIsIDEwMzQ1NjIsICAzMTQ1NjIsIDMwMTQ1NjIsIDEzMDQ1NjIsIDMxMDQ1NjIsICAxNDM1NjIsIDEwNDM1NjIsICA0MTM1NjIsIDQwMTM1NjIsIDE0MDM1NjIsIDQxMDM1NjIsCi0gICAgICAgMzQxNTYyLCAzMDQxNTYyLCAgNDMxNTYyLCA0MDMxNTYyLCAzNDAxNTYyLCA0MzAxNTYyLCAxMzQwNTYyLCAzMTQwNTYyLCAxNDMwNTYyLCA0MTMwNTYyLCAzNDEwNTYyLCA0MzEwNTYyLAotICAgICAgIDEzNTQ2MiwgMTAzNTQ2MiwgIDMxNTQ2MiwgMzAxNTQ2MiwgMTMwNTQ2MiwgMzEwNTQ2MiwgIDE1MzQ2MiwgMTA1MzQ2MiwgIDUxMzQ2MiwgNTAxMzQ2MiwgMTUwMzQ2MiwgNTEwMzQ2MiwKLSAgICAgICAzNTE0NjIsIDMwNTE0NjIsICA1MzE0NjIsIDUwMzE0NjIsIDM1MDE0NjIsIDUzMDE0NjIsIDEzNTA0NjIsIDMxNTA0NjIsIDE1MzA0NjIsIDUxMzA0NjIsIDM1MTA0NjIsIDUzMTA0NjIsCi0gICAgICAgMTQ1MzYyLCAxMDQ1MzYyLCAgNDE1MzYyLCA0MDE1MzYyLCAxNDA1MzYyLCA0MTA1MzYyLCAgMTU0MzYyLCAxMDU0MzYyLCAgNTE0MzYyLCA1MDE0MzYyLCAxNTA0MzYyLCA1MTA0MzYyLAotICAgICAgIDQ1MTM2MiwgNDA1MTM2MiwgIDU0MTM2MiwgNTA0MTM2MiwgNDUwMTM2MiwgNTQwMTM2MiwgMTQ1MDM2MiwgNDE1MDM2MiwgMTU0MDM2MiwgNTE0MDM2MiwgNDUxMDM2MiwgNTQxMDM2MiwKLSAgICAgICAzNDUxNjIsIDMwNDUxNjIsICA0MzUxNjIsIDQwMzUxNjIsIDM0MDUxNjIsIDQzMDUxNjIsICAzNTQxNjIsIDMwNTQxNjIsICA1MzQxNjIsIDUwMzQxNjIsIDM1MDQxNjIsIDUzMDQxNjIsCi0gICAgICAgNDUzMTYyLCA0MDUzMTYyLCAgNTQzMTYyLCA1MDQzMTYyLCA0NTAzMTYyLCA1NDAzMTYyLCAzNDUwMTYyLCA0MzUwMTYyLCAzNTQwMTYyLCA1MzQwMTYyLCA0NTMwMTYyLCA1NDMwMTYyLAotICAgICAgMTM0NTA2MiwgMzE0NTA2MiwgMTQzNTA2MiwgNDEzNTA2MiwgMzQxNTA2MiwgNDMxNTA2MiwgMTM1NDA2MiwgMzE1NDA2MiwgMTUzNDA2MiwgNTEzNDA2MiwgMzUxNDA2MiwgNTMxNDA2MiwKLSAgICAgIDE0NTMwNjIsIDQxNTMwNjIsIDE1NDMwNjIsIDUxNDMwNjIsIDQ1MTMwNjIsIDU0MTMwNjIsIDM0NTEwNjIsIDQzNTEwNjIsIDM1NDEwNjIsIDUzNDEwNjIsIDQ1MzEwNjIsIDU0MzEwNjIsCi0gICAgICAgMTM0NjUyLCAxMDM0NjUyLCAgMzE0NjUyLCAzMDE0NjUyLCAxMzA0NjUyLCAzMTA0NjUyLCAgMTQzNjUyLCAxMDQzNjUyLCAgNDEzNjUyLCA0MDEzNjUyLCAxNDAzNjUyLCA0MTAzNjUyLAotICAgICAgIDM0MTY1MiwgMzA0MTY1MiwgIDQzMTY1MiwgNDAzMTY1MiwgMzQwMTY1MiwgNDMwMTY1MiwgMTM0MDY1MiwgMzE0MDY1MiwgMTQzMDY1MiwgNDEzMDY1MiwgMzQxMDY1MiwgNDMxMDY1MiwKLSAgICAgICAxMzY0NTIsIDEwMzY0NTIsICAzMTY0NTIsIDMwMTY0NTIsIDEzMDY0NTIsIDMxMDY0NTIsICAxNjM0NTIsIDEwNjM0NTIsICA2MTM0NTIsIDYwMTM0NTIsIDE2MDM0NTIsIDYxMDM0NTIsCi0gICAgICAgMzYxNDUyLCAzMDYxNDUyLCAgNjMxNDUyLCA2MDMxNDUyLCAzNjAxNDUyLCA2MzAxNDUyLCAxMzYwNDUyLCAzMTYwNDUyLCAxNjMwNDUyLCA2MTMwNDUyLCAzNjEwNDUyLCA2MzEwNDUyLAotICAgICAgIDE0NjM1MiwgMTA0NjM1MiwgIDQxNjM1MiwgNDAxNjM1MiwgMTQwNjM1MiwgNDEwNjM1MiwgIDE2NDM1MiwgMTA2NDM1MiwgIDYxNDM1MiwgNjAxNDM1MiwgMTYwNDM1MiwgNjEwNDM1MiwKLSAgICAgICA0NjEzNTIsIDQwNjEzNTIsICA2NDEzNTIsIDYwNDEzNTIsIDQ2MDEzNTIsIDY0MDEzNTIsIDE0NjAzNTIsIDQxNjAzNTIsIDE2NDAzNTIsIDYxNDAzNTIsIDQ2MTAzNTIsIDY0MTAzNTIsCi0gICAgICAgMzQ2MTUyLCAzMDQ2MTUyLCAgNDM2MTUyLCA0MDM2MTUyLCAzNDA2MTUyLCA0MzA2MTUyLCAgMzY0MTUyLCAzMDY0MTUyLCAgNjM0MTUyLCA2MDM0MTUyLCAzNjA0MTUyLCA2MzA0MTUyLAotICAgICAgIDQ2MzE1MiwgNDA2MzE1MiwgIDY0MzE1MiwgNjA0MzE1MiwgNDYwMzE1MiwgNjQwMzE1MiwgMzQ2MDE1MiwgNDM2MDE1MiwgMzY0MDE1MiwgNjM0MDE1MiwgNDYzMDE1MiwgNjQzMDE1MiwKLSAgICAgIDEzNDYwNTIsIDMxNDYwNTIsIDE0MzYwNTIsIDQxMzYwNTIsIDM0MTYwNTIsIDQzMTYwNTIsIDEzNjQwNTIsIDMxNjQwNTIsIDE2MzQwNTIsIDYxMzQwNTIsIDM2MTQwNTIsIDYzMTQwNTIsCi0gICAgICAxNDYzMDUyLCA0MTYzMDUyLCAxNjQzMDUyLCA2MTQzMDUyLCA0NjEzMDUyLCA2NDEzMDUyLCAzNDYxMDUyLCA0MzYxMDUyLCAzNjQxMDUyLCA2MzQxMDUyLCA0NjMxMDUyLCA2NDMxMDUyLAotICAgICAgIDEzNTY0MiwgMTAzNTY0MiwgIDMxNTY0MiwgMzAxNTY0MiwgMTMwNTY0MiwgMzEwNTY0MiwgIDE1MzY0MiwgMTA1MzY0MiwgIDUxMzY0MiwgNTAxMzY0MiwgMTUwMzY0MiwgNTEwMzY0MiwKLSAgICAgICAzNTE2NDIsIDMwNTE2NDIsICA1MzE2NDIsIDUwMzE2NDIsIDM1MDE2NDIsIDUzMDE2NDIsIDEzNTA2NDIsIDMxNTA2NDIsIDE1MzA2NDIsIDUxMzA2NDIsIDM1MTA2NDIsIDUzMTA2NDIsCi0gICAgICAgMTM2NTQyLCAxMDM2NTQyLCAgMzE2NTQyLCAzMDE2NTQyLCAxMzA2NTQyLCAzMTA2NTQyLCAgMTYzNTQyLCAxMDYzNTQyLCAgNjEzNTQyLCA2MDEzNTQyLCAxNjAzNTQyLCA2MTAzNTQyLAotICAgICAgIDM2MTU0MiwgMzA2MTU0MiwgIDYzMTU0MiwgNjAzMTU0MiwgMzYwMTU0MiwgNjMwMTU0MiwgMTM2MDU0MiwgMzE2MDU0MiwgMTYzMDU0MiwgNjEzMDU0MiwgMzYxMDU0MiwgNjMxMDU0MiwKLSAgICAgICAxNTYzNDIsIDEwNTYzNDIsICA1MTYzNDIsIDUwMTYzNDIsIDE1MDYzNDIsIDUxMDYzNDIsICAxNjUzNDIsIDEwNjUzNDIsICA2MTUzNDIsIDYwMTUzNDIsIDE2MDUzNDIsIDYxMDUzNDIsCi0gICAgICAgNTYxMzQyLCA1MDYxMzQyLCAgNjUxMzQyLCA2MDUxMzQyLCA1NjAxMzQyLCA2NTAxMzQyLCAxNTYwMzQyLCA1MTYwMzQyLCAxNjUwMzQyLCA2MTUwMzQyLCA1NjEwMzQyLCA2NTEwMzQyLAotICAgICAgIDM1NjE0MiwgMzA1NjE0MiwgIDUzNjE0MiwgNTAzNjE0MiwgMzUwNjE0MiwgNTMwNjE0MiwgIDM2NTE0MiwgMzA2NTE0MiwgIDYzNTE0MiwgNjAzNTE0MiwgMzYwNTE0MiwgNjMwNTE0MiwKLSAgICAgICA1NjMxNDIsIDUwNjMxNDIsICA2NTMxNDIsIDYwNTMxNDIsIDU2MDMxNDIsIDY1MDMxNDIsIDM1NjAxNDIsIDUzNjAxNDIsIDM2NTAxNDIsIDYzNTAxNDIsIDU2MzAxNDIsIDY1MzAxNDIsCi0gICAgICAxMzU2MDQyLCAzMTU2MDQyLCAxNTM2MDQyLCA1MTM2MDQyLCAzNTE2MDQyLCA1MzE2MDQyLCAxMzY1MDQyLCAzMTY1MDQyLCAxNjM1MDQyLCA2MTM1MDQyLCAzNjE1MDQyLCA2MzE1MDQyLAotICAgICAgMTU2MzA0MiwgNTE2MzA0MiwgMTY1MzA0MiwgNjE1MzA0MiwgNTYxMzA0MiwgNjUxMzA0MiwgMzU2MTA0MiwgNTM2MTA0MiwgMzY1MTA0MiwgNjM1MTA0MiwgNTYzMTA0MiwgNjUzMTA0MiwKLSAgICAgICAxNDU2MzIsIDEwNDU2MzIsICA0MTU2MzIsIDQwMTU2MzIsIDE0MDU2MzIsIDQxMDU2MzIsICAxNTQ2MzIsIDEwNTQ2MzIsICA1MTQ2MzIsIDUwMTQ2MzIsIDE1MDQ2MzIsIDUxMDQ2MzIsCi0gICAgICAgNDUxNjMyLCA0MDUxNjMyLCAgNTQxNjMyLCA1MDQxNjMyLCA0NTAxNjMyLCA1NDAxNjMyLCAxNDUwNjMyLCA0MTUwNjMyLCAxNTQwNjMyLCA1MTQwNjMyLCA0NTEwNjMyLCA1NDEwNjMyLAotICAgICAgIDE0NjUzMiwgMTA0NjUzMiwgIDQxNjUzMiwgNDAxNjUzMiwgMTQwNjUzMiwgNDEwNjUzMiwgIDE2NDUzMiwgMTA2NDUzMiwgIDYxNDUzMiwgNjAxNDUzMiwgMTYwNDUzMiwgNjEwNDUzMiwKLSAgICAgICA0NjE1MzIsIDQwNjE1MzIsICA2NDE1MzIsIDYwNDE1MzIsIDQ2MDE1MzIsIDY0MDE1MzIsIDE0NjA1MzIsIDQxNjA1MzIsIDE2NDA1MzIsIDYxNDA1MzIsIDQ2MTA1MzIsIDY0MTA1MzIsCi0gICAgICAgMTU2NDMyLCAxMDU2NDMyLCAgNTE2NDMyLCA1MDE2NDMyLCAxNTA2NDMyLCA1MTA2NDMyLCAgMTY1NDMyLCAxMDY1NDMyLCAgNjE1NDMyLCA2MDE1NDMyLCAxNjA1NDMyLCA2MTA1NDMyLAotICAgICAgIDU2MTQzMiwgNTA2MTQzMiwgIDY1MTQzMiwgNjA1MTQzMiwgNTYwMTQzMiwgNjUwMTQzMiwgMTU2MDQzMiwgNTE2MDQzMiwgMTY1MDQzMiwgNjE1MDQzMiwgNTYxMDQzMiwgNjUxMDQzMiwKLSAgICAgICA0NTYxMzIsIDQwNTYxMzIsICA1NDYxMzIsIDUwNDYxMzIsIDQ1MDYxMzIsIDU0MDYxMzIsICA0NjUxMzIsIDQwNjUxMzIsICA2NDUxMzIsIDYwNDUxMzIsIDQ2MDUxMzIsIDY0MDUxMzIsCi0gICAgICAgNTY0MTMyLCA1MDY0MTMyLCAgNjU0MTMyLCA2MDU0MTMyLCA1NjA0MTMyLCA2NTA0MTMyLCA0NTYwMTMyLCA1NDYwMTMyLCA0NjUwMTMyLCA2NDUwMTMyLCA1NjQwMTMyLCA2NTQwMTMyLAotICAgICAgMTQ1NjAzMiwgNDE1NjAzMiwgMTU0NjAzMiwgNTE0NjAzMiwgNDUxNjAzMiwgNTQxNjAzMiwgMTQ2NTAzMiwgNDE2NTAzMiwgMTY0NTAzMiwgNjE0NTAzMiwgNDYxNTAzMiwgNjQxNTAzMiwKLSAgICAgIDE1NjQwMzIsIDUxNjQwMzIsIDE2NTQwMzIsIDYxNTQwMzIsIDU2MTQwMzIsIDY1MTQwMzIsIDQ1NjEwMzIsIDU0NjEwMzIsIDQ2NTEwMzIsIDY0NTEwMzIsIDU2NDEwMzIsIDY1NDEwMzIsCi0gICAgICAgMzQ1NjEyLCAzMDQ1NjEyLCAgNDM1NjEyLCA0MDM1NjEyLCAzNDA1NjEyLCA0MzA1NjEyLCAgMzU0NjEyLCAzMDU0NjEyLCAgNTM0NjEyLCA1MDM0NjEyLCAzNTA0NjEyLCA1MzA0NjEyLAotICAgICAgIDQ1MzYxMiwgNDA1MzYxMiwgIDU0MzYxMiwgNTA0MzYxMiwgNDUwMzYxMiwgNTQwMzYxMiwgMzQ1MDYxMiwgNDM1MDYxMiwgMzU0MDYxMiwgNTM0MDYxMiwgNDUzMDYxMiwgNTQzMDYxMiwKLSAgICAgICAzNDY1MTIsIDMwNDY1MTIsICA0MzY1MTIsIDQwMzY1MTIsIDM0MDY1MTIsIDQzMDY1MTIsICAzNjQ1MTIsIDMwNjQ1MTIsICA2MzQ1MTIsIDYwMzQ1MTIsIDM2MDQ1MTIsIDYzMDQ1MTIsCi0gICAgICAgNDYzNTEyLCA0MDYzNTEyLCAgNjQzNTEyLCA2MDQzNTEyLCA0NjAzNTEyLCA2NDAzNTEyLCAzNDYwNTEyLCA0MzYwNTEyLCAzNjQwNTEyLCA2MzQwNTEyLCA0NjMwNTEyLCA2NDMwNTEyLAotICAgICAgIDM1NjQxMiwgMzA1NjQxMiwgIDUzNjQxMiwgNTAzNjQxMiwgMzUwNjQxMiwgNTMwNjQxMiwgIDM2NTQxMiwgMzA2NTQxMiwgIDYzNTQxMiwgNjAzNTQxMiwgMzYwNTQxMiwgNjMwNTQxMiwKLSAgICAgICA1NjM0MTIsIDUwNjM0MTIsICA2NTM0MTIsIDYwNTM0MTIsIDU2MDM0MTIsIDY1MDM0MTIsIDM1NjA0MTIsIDUzNjA0MTIsIDM2NTA0MTIsIDYzNTA0MTIsIDU2MzA0MTIsIDY1MzA0MTIsCi0gICAgICAgNDU2MzEyLCA0MDU2MzEyLCAgNTQ2MzEyLCA1MDQ2MzEyLCA0NTA2MzEyLCA1NDA2MzEyLCAgNDY1MzEyLCA0MDY1MzEyLCAgNjQ1MzEyLCA2MDQ1MzEyLCA0NjA1MzEyLCA2NDA1MzEyLAotICAgICAgIDU2NDMxMiwgNTA2NDMxMiwgIDY1NDMxMiwgNjA1NDMxMiwgNTYwNDMxMiwgNjUwNDMxMiwgNDU2MDMxMiwgNTQ2MDMxMiwgNDY1MDMxMiwgNjQ1MDMxMiwgNTY0MDMxMiwgNjU0MDMxMiwKLSAgICAgIDM0NTYwMTIsIDQzNTYwMTIsIDM1NDYwMTIsIDUzNDYwMTIsIDQ1MzYwMTIsIDU0MzYwMTIsIDM0NjUwMTIsIDQzNjUwMTIsIDM2NDUwMTIsIDYzNDUwMTIsIDQ2MzUwMTIsIDY0MzUwMTIsCi0gICAgICAzNTY0MDEyLCA1MzY0MDEyLCAzNjU0MDEyLCA2MzU0MDEyLCA1NjM0MDEyLCA2NTM0MDEyLCA0NTYzMDEyLCA1NDYzMDEyLCA0NjUzMDEyLCA2NDUzMDEyLCA1NjQzMDEyLCA2NTQzMDEyLAotICAgICAgMTM0NTYwMiwgMzE0NTYwMiwgMTQzNTYwMiwgNDEzNTYwMiwgMzQxNTYwMiwgNDMxNTYwMiwgMTM1NDYwMiwgMzE1NDYwMiwgMTUzNDYwMiwgNTEzNDYwMiwgMzUxNDYwMiwgNTMxNDYwMiwKLSAgICAgIDE0NTM2MDIsIDQxNTM2MDIsIDE1NDM2MDIsIDUxNDM2MDIsIDQ1MTM2MDIsIDU0MTM2MDIsIDM0NTE2MDIsIDQzNTE2MDIsIDM1NDE2MDIsIDUzNDE2MDIsIDQ1MzE2MDIsIDU0MzE2MDIsCi0gICAgICAxMzQ2NTAyLCAzMTQ2NTAyLCAxNDM2NTAyLCA0MTM2NTAyLCAzNDE2NTAyLCA0MzE2NTAyLCAxMzY0NTAyLCAzMTY0NTAyLCAxNjM0NTAyLCA2MTM0NTAyLCAzNjE0NTAyLCA2MzE0NTAyLAotICAgICAgMTQ2MzUwMiwgNDE2MzUwMiwgMTY0MzUwMiwgNjE0MzUwMiwgNDYxMzUwMiwgNjQxMzUwMiwgMzQ2MTUwMiwgNDM2MTUwMiwgMzY0MTUwMiwgNjM0MTUwMiwgNDYzMTUwMiwgNjQzMTUwMiwKLSAgICAgIDEzNTY0MDIsIDMxNTY0MDIsIDE1MzY0MDIsIDUxMzY0MDIsIDM1MTY0MDIsIDUzMTY0MDIsIDEzNjU0MDIsIDMxNjU0MDIsIDE2MzU0MDIsIDYxMzU0MDIsIDM2MTU0MDIsIDYzMTU0MDIsCi0gICAgICAxNTYzNDAyLCA1MTYzNDAyLCAxNjUzNDAyLCA2MTUzNDAyLCA1NjEzNDAyLCA2NTEzNDAyLCAzNTYxNDAyLCA1MzYxNDAyLCAzNjUxNDAyLCA2MzUxNDAyLCA1NjMxNDAyLCA2NTMxNDAyLAotICAgICAgMTQ1NjMwMiwgNDE1NjMwMiwgMTU0NjMwMiwgNTE0NjMwMiwgNDUxNjMwMiwgNTQxNjMwMiwgMTQ2NTMwMiwgNDE2NTMwMiwgMTY0NTMwMiwgNjE0NTMwMiwgNDYxNTMwMiwgNjQxNTMwMiwKLSAgICAgIDE1NjQzMDIsIDUxNjQzMDIsIDE2NTQzMDIsIDYxNTQzMDIsIDU2MTQzMDIsIDY1MTQzMDIsIDQ1NjEzMDIsIDU0NjEzMDIsIDQ2NTEzMDIsIDY0NTEzMDIsIDU2NDEzMDIsIDY1NDEzMDIsCi0gICAgICAzNDU2MTAyLCA0MzU2MTAyLCAzNTQ2MTAyLCA1MzQ2MTAyLCA0NTM2MTAyLCA1NDM2MTAyLCAzNDY1MTAyLCA0MzY1MTAyLCAzNjQ1MTAyLCA2MzQ1MTAyLCA0NjM1MTAyLCA2NDM1MTAyLAotICAgICAgMzU2NDEwMiwgNTM2NDEwMiwgMzY1NDEwMiwgNjM1NDEwMiwgNTYzNDEwMiwgNjUzNDEwMiwgNDU2MzEwMiwgNTQ2MzEwMiwgNDY1MzEwMiwgNjQ1MzEwMiwgNTY0MzEwMiwgNjU0MzEwMiwKLSAgICAgICAyMzQ1NjEsIDIwMzQ1NjEsICAzMjQ1NjEsIDMwMjQ1NjEsIDIzMDQ1NjEsIDMyMDQ1NjEsICAyNDM1NjEsIDIwNDM1NjEsICA0MjM1NjEsIDQwMjM1NjEsIDI0MDM1NjEsIDQyMDM1NjEsCi0gICAgICAgMzQyNTYxLCAzMDQyNTYxLCAgNDMyNTYxLCA0MDMyNTYxLCAzNDAyNTYxLCA0MzAyNTYxLCAyMzQwNTYxLCAzMjQwNTYxLCAyNDMwNTYxLCA0MjMwNTYxLCAzNDIwNTYxLCA0MzIwNTYxLAotICAgICAgIDIzNTQ2MSwgMjAzNTQ2MSwgIDMyNTQ2MSwgMzAyNTQ2MSwgMjMwNTQ2MSwgMzIwNTQ2MSwgIDI1MzQ2MSwgMjA1MzQ2MSwgIDUyMzQ2MSwgNTAyMzQ2MSwgMjUwMzQ2MSwgNTIwMzQ2MSwKLSAgICAgICAzNTI0NjEsIDMwNTI0NjEsICA1MzI0NjEsIDUwMzI0NjEsIDM1MDI0NjEsIDUzMDI0NjEsIDIzNTA0NjEsIDMyNTA0NjEsIDI1MzA0NjEsIDUyMzA0NjEsIDM1MjA0NjEsIDUzMjA0NjEsCi0gICAgICAgMjQ1MzYxLCAyMDQ1MzYxLCAgNDI1MzYxLCA0MDI1MzYxLCAyNDA1MzYxLCA0MjA1MzYxLCAgMjU0MzYxLCAyMDU0MzYxLCAgNTI0MzYxLCA1MDI0MzYxLCAyNTA0MzYxLCA1MjA0MzYxLAotICAgICAgIDQ1MjM2MSwgNDA1MjM2MSwgIDU0MjM2MSwgNTA0MjM2MSwgNDUwMjM2MSwgNTQwMjM2MSwgMjQ1MDM2MSwgNDI1MDM2MSwgMjU0MDM2MSwgNTI0MDM2MSwgNDUyMDM2MSwgNTQyMDM2MSwKLSAgICAgICAzNDUyNjEsIDMwNDUyNjEsICA0MzUyNjEsIDQwMzUyNjEsIDM0MDUyNjEsIDQzMDUyNjEsICAzNTQyNjEsIDMwNTQyNjEsICA1MzQyNjEsIDUwMzQyNjEsIDM1MDQyNjEsIDUzMDQyNjEsCi0gICAgICAgNDUzMjYxLCA0MDUzMjYxLCAgNTQzMjYxLCA1MDQzMjYxLCA0NTAzMjYxLCA1NDAzMjYxLCAzNDUwMjYxLCA0MzUwMjYxLCAzNTQwMjYxLCA1MzQwMjYxLCA0NTMwMjYxLCA1NDMwMjYxLAotICAgICAgMjM0NTA2MSwgMzI0NTA2MSwgMjQzNTA2MSwgNDIzNTA2MSwgMzQyNTA2MSwgNDMyNTA2MSwgMjM1NDA2MSwgMzI1NDA2MSwgMjUzNDA2MSwgNTIzNDA2MSwgMzUyNDA2MSwgNTMyNDA2MSwKLSAgICAgIDI0NTMwNjEsIDQyNTMwNjEsIDI1NDMwNjEsIDUyNDMwNjEsIDQ1MjMwNjEsIDU0MjMwNjEsIDM0NTIwNjEsIDQzNTIwNjEsIDM1NDIwNjEsIDUzNDIwNjEsIDQ1MzIwNjEsIDU0MzIwNjEsCi0gICAgICAgMjM0NjUxLCAyMDM0NjUxLCAgMzI0NjUxLCAzMDI0NjUxLCAyMzA0NjUxLCAzMjA0NjUxLCAgMjQzNjUxLCAyMDQzNjUxLCAgNDIzNjUxLCA0MDIzNjUxLCAyNDAzNjUxLCA0MjAzNjUxLAotICAgICAgIDM0MjY1MSwgMzA0MjY1MSwgIDQzMjY1MSwgNDAzMjY1MSwgMzQwMjY1MSwgNDMwMjY1MSwgMjM0MDY1MSwgMzI0MDY1MSwgMjQzMDY1MSwgNDIzMDY1MSwgMzQyMDY1MSwgNDMyMDY1MSwKLSAgICAgICAyMzY0NTEsIDIwMzY0NTEsICAzMjY0NTEsIDMwMjY0NTEsIDIzMDY0NTEsIDMyMDY0NTEsICAyNjM0NTEsIDIwNjM0NTEsICA2MjM0NTEsIDYwMjM0NTEsIDI2MDM0NTEsIDYyMDM0NTEsCi0gICAgICAgMzYyNDUxLCAzMDYyNDUxLCAgNjMyNDUxLCA2MDMyNDUxLCAzNjAyNDUxLCA2MzAyNDUxLCAyMzYwNDUxLCAzMjYwNDUxLCAyNjMwNDUxLCA2MjMwNDUxLCAzNjIwNDUxLCA2MzIwNDUxLAotICAgICAgIDI0NjM1MSwgMjA0NjM1MSwgIDQyNjM1MSwgNDAyNjM1MSwgMjQwNjM1MSwgNDIwNjM1MSwgIDI2NDM1MSwgMjA2NDM1MSwgIDYyNDM1MSwgNjAyNDM1MSwgMjYwNDM1MSwgNjIwNDM1MSwKLSAgICAgICA0NjIzNTEsIDQwNjIzNTEsICA2NDIzNTEsIDYwNDIzNTEsIDQ2MDIzNTEsIDY0MDIzNTEsIDI0NjAzNTEsIDQyNjAzNTEsIDI2NDAzNTEsIDYyNDAzNTEsIDQ2MjAzNTEsIDY0MjAzNTEsCi0gICAgICAgMzQ2MjUxLCAzMDQ2MjUxLCAgNDM2MjUxLCA0MDM2MjUxLCAzNDA2MjUxLCA0MzA2MjUxLCAgMzY0MjUxLCAzMDY0MjUxLCAgNjM0MjUxLCA2MDM0MjUxLCAzNjA0MjUxLCA2MzA0MjUxLAotICAgICAgIDQ2MzI1MSwgNDA2MzI1MSwgIDY0MzI1MSwgNjA0MzI1MSwgNDYwMzI1MSwgNjQwMzI1MSwgMzQ2MDI1MSwgNDM2MDI1MSwgMzY0MDI1MSwgNjM0MDI1MSwgNDYzMDI1MSwgNjQzMDI1MSwKLSAgICAgIDIzNDYwNTEsIDMyNDYwNTEsIDI0MzYwNTEsIDQyMzYwNTEsIDM0MjYwNTEsIDQzMjYwNTEsIDIzNjQwNTEsIDMyNjQwNTEsIDI2MzQwNTEsIDYyMzQwNTEsIDM2MjQwNTEsIDYzMjQwNTEsCi0gICAgICAyNDYzMDUxLCA0MjYzMDUxLCAyNjQzMDUxLCA2MjQzMDUxLCA0NjIzMDUxLCA2NDIzMDUxLCAzNDYyMDUxLCA0MzYyMDUxLCAzNjQyMDUxLCA2MzQyMDUxLCA0NjMyMDUxLCA2NDMyMDUxLAotICAgICAgIDIzNTY0MSwgMjAzNTY0MSwgIDMyNTY0MSwgMzAyNTY0MSwgMjMwNTY0MSwgMzIwNTY0MSwgIDI1MzY0MSwgMjA1MzY0MSwgIDUyMzY0MSwgNTAyMzY0MSwgMjUwMzY0MSwgNTIwMzY0MSwKLSAgICAgICAzNTI2NDEsIDMwNTI2NDEsICA1MzI2NDEsIDUwMzI2NDEsIDM1MDI2NDEsIDUzMDI2NDEsIDIzNTA2NDEsIDMyNTA2NDEsIDI1MzA2NDEsIDUyMzA2NDEsIDM1MjA2NDEsIDUzMjA2NDEsCi0gICAgICAgMjM2NTQxLCAyMDM2NTQxLCAgMzI2NTQxLCAzMDI2NTQxLCAyMzA2NTQxLCAzMjA2NTQxLCAgMjYzNTQxLCAyMDYzNTQxLCAgNjIzNTQxLCA2MDIzNTQxLCAyNjAzNTQxLCA2MjAzNTQxLAotICAgICAgIDM2MjU0MSwgMzA2MjU0MSwgIDYzMjU0MSwgNjAzMjU0MSwgMzYwMjU0MSwgNjMwMjU0MSwgMjM2MDU0MSwgMzI2MDU0MSwgMjYzMDU0MSwgNjIzMDU0MSwgMzYyMDU0MSwgNjMyMDU0MSwKLSAgICAgICAyNTYzNDEsIDIwNTYzNDEsICA1MjYzNDEsIDUwMjYzNDEsIDI1MDYzNDEsIDUyMDYzNDEsICAyNjUzNDEsIDIwNjUzNDEsICA2MjUzNDEsIDYwMjUzNDEsIDI2MDUzNDEsIDYyMDUzNDEsCi0gICAgICAgNTYyMzQxLCA1MDYyMzQxLCAgNjUyMzQxLCA2MDUyMzQxLCA1NjAyMzQxLCA2NTAyMzQxLCAyNTYwMzQxLCA1MjYwMzQxLCAyNjUwMzQxLCA2MjUwMzQxLCA1NjIwMzQxLCA2NTIwMzQxLAotICAgICAgIDM1NjI0MSwgMzA1NjI0MSwgIDUzNjI0MSwgNTAzNjI0MSwgMzUwNjI0MSwgNTMwNjI0MSwgIDM2NTI0MSwgMzA2NTI0MSwgIDYzNTI0MSwgNjAzNTI0MSwgMzYwNTI0MSwgNjMwNTI0MSwKLSAgICAgICA1NjMyNDEsIDUwNjMyNDEsICA2NTMyNDEsIDYwNTMyNDEsIDU2MDMyNDEsIDY1MDMyNDEsIDM1NjAyNDEsIDUzNjAyNDEsIDM2NTAyNDEsIDYzNTAyNDEsIDU2MzAyNDEsIDY1MzAyNDEsCi0gICAgICAyMzU2MDQxLCAzMjU2MDQxLCAyNTM2MDQxLCA1MjM2MDQxLCAzNTI2MDQxLCA1MzI2MDQxLCAyMzY1MDQxLCAzMjY1MDQxLCAyNjM1MDQxLCA2MjM1MDQxLCAzNjI1MDQxLCA2MzI1MDQxLAotICAgICAgMjU2MzA0MSwgNTI2MzA0MSwgMjY1MzA0MSwgNjI1MzA0MSwgNTYyMzA0MSwgNjUyMzA0MSwgMzU2MjA0MSwgNTM2MjA0MSwgMzY1MjA0MSwgNjM1MjA0MSwgNTYzMjA0MSwgNjUzMjA0MSwKLSAgICAgICAyNDU2MzEsIDIwNDU2MzEsICA0MjU2MzEsIDQwMjU2MzEsIDI0MDU2MzEsIDQyMDU2MzEsICAyNTQ2MzEsIDIwNTQ2MzEsICA1MjQ2MzEsIDUwMjQ2MzEsIDI1MDQ2MzEsIDUyMDQ2MzEsCi0gICAgICAgNDUyNjMxLCA0MDUyNjMxLCAgNTQyNjMxLCA1MDQyNjMxLCA0NTAyNjMxLCA1NDAyNjMxLCAyNDUwNjMxLCA0MjUwNjMxLCAyNTQwNjMxLCA1MjQwNjMxLCA0NTIwNjMxLCA1NDIwNjMxLAotICAgICAgIDI0NjUzMSwgMjA0NjUzMSwgIDQyNjUzMSwgNDAyNjUzMSwgMjQwNjUzMSwgNDIwNjUzMSwgIDI2NDUzMSwgMjA2NDUzMSwgIDYyNDUzMSwgNjAyNDUzMSwgMjYwNDUzMSwgNjIwNDUzMSwKLSAgICAgICA0NjI1MzEsIDQwNjI1MzEsICA2NDI1MzEsIDYwNDI1MzEsIDQ2MDI1MzEsIDY0MDI1MzEsIDI0NjA1MzEsIDQyNjA1MzEsIDI2NDA1MzEsIDYyNDA1MzEsIDQ2MjA1MzEsIDY0MjA1MzEsCi0gICAgICAgMjU2NDMxLCAyMDU2NDMxLCAgNTI2NDMxLCA1MDI2NDMxLCAyNTA2NDMxLCA1MjA2NDMxLCAgMjY1NDMxLCAyMDY1NDMxLCAgNjI1NDMxLCA2MDI1NDMxLCAyNjA1NDMxLCA2MjA1NDMxLAotICAgICAgIDU2MjQzMSwgNTA2MjQzMSwgIDY1MjQzMSwgNjA1MjQzMSwgNTYwMjQzMSwgNjUwMjQzMSwgMjU2MDQzMSwgNTI2MDQzMSwgMjY1MDQzMSwgNjI1MDQzMSwgNTYyMDQzMSwgNjUyMDQzMSwKLSAgICAgICA0NTYyMzEsIDQwNTYyMzEsICA1NDYyMzEsIDUwNDYyMzEsIDQ1MDYyMzEsIDU0MDYyMzEsICA0NjUyMzEsIDQwNjUyMzEsICA2NDUyMzEsIDYwNDUyMzEsIDQ2MDUyMzEsIDY0MDUyMzEsCi0gICAgICAgNTY0MjMxLCA1MDY0MjMxLCAgNjU0MjMxLCA2MDU0MjMxLCA1NjA0MjMxLCA2NTA0MjMxLCA0NTYwMjMxLCA1NDYwMjMxLCA0NjUwMjMxLCA2NDUwMjMxLCA1NjQwMjMxLCA2NTQwMjMxLAotICAgICAgMjQ1NjAzMSwgNDI1NjAzMSwgMjU0NjAzMSwgNTI0NjAzMSwgNDUyNjAzMSwgNTQyNjAzMSwgMjQ2NTAzMSwgNDI2NTAzMSwgMjY0NTAzMSwgNjI0NTAzMSwgNDYyNTAzMSwgNjQyNTAzMSwKLSAgICAgIDI1NjQwMzEsIDUyNjQwMzEsIDI2NTQwMzEsIDYyNTQwMzEsIDU2MjQwMzEsIDY1MjQwMzEsIDQ1NjIwMzEsIDU0NjIwMzEsIDQ2NTIwMzEsIDY0NTIwMzEsIDU2NDIwMzEsIDY1NDIwMzEsCi0gICAgICAgMzQ1NjIxLCAzMDQ1NjIxLCAgNDM1NjIxLCA0MDM1NjIxLCAzNDA1NjIxLCA0MzA1NjIxLCAgMzU0NjIxLCAzMDU0NjIxLCAgNTM0NjIxLCA1MDM0NjIxLCAzNTA0NjIxLCA1MzA0NjIxLAotICAgICAgIDQ1MzYyMSwgNDA1MzYyMSwgIDU0MzYyMSwgNTA0MzYyMSwgNDUwMzYyMSwgNTQwMzYyMSwgMzQ1MDYyMSwgNDM1MDYyMSwgMzU0MDYyMSwgNTM0MDYyMSwgNDUzMDYyMSwgNTQzMDYyMSwKLSAgICAgICAzNDY1MjEsIDMwNDY1MjEsICA0MzY1MjEsIDQwMzY1MjEsIDM0MDY1MjEsIDQzMDY1MjEsICAzNjQ1MjEsIDMwNjQ1MjEsICA2MzQ1MjEsIDYwMzQ1MjEsIDM2MDQ1MjEsIDYzMDQ1MjEsCi0gICAgICAgNDYzNTIxLCA0MDYzNTIxLCAgNjQzNTIxLCA2MDQzNTIxLCA0NjAzNTIxLCA2NDAzNTIxLCAzNDYwNTIxLCA0MzYwNTIxLCAzNjQwNTIxLCA2MzQwNTIxLCA0NjMwNTIxLCA2NDMwNTIxLAotICAgICAgIDM1NjQyMSwgMzA1NjQyMSwgIDUzNjQyMSwgNTAzNjQyMSwgMzUwNjQyMSwgNTMwNjQyMSwgIDM2NTQyMSwgMzA2NTQyMSwgIDYzNTQyMSwgNjAzNTQyMSwgMzYwNTQyMSwgNjMwNTQyMSwKLSAgICAgICA1NjM0MjEsIDUwNjM0MjEsICA2NTM0MjEsIDYwNTM0MjEsIDU2MDM0MjEsIDY1MDM0MjEsIDM1NjA0MjEsIDUzNjA0MjEsIDM2NTA0MjEsIDYzNTA0MjEsIDU2MzA0MjEsIDY1MzA0MjEsCi0gICAgICAgNDU2MzIxLCA0MDU2MzIxLCAgNTQ2MzIxLCA1MDQ2MzIxLCA0NTA2MzIxLCA1NDA2MzIxLCAgNDY1MzIxLCA0MDY1MzIxLCAgNjQ1MzIxLCA2MDQ1MzIxLCA0NjA1MzIxLCA2NDA1MzIxLAotICAgICAgIDU2NDMyMSwgNTA2NDMyMSwgIDY1NDMyMSwgNjA1NDMyMSwgNTYwNDMyMSwgNjUwNDMyMSwgNDU2MDMyMSwgNTQ2MDMyMSwgNDY1MDMyMSwgNjQ1MDMyMSwgNTY0MDMyMSwgNjU0MDMyMSwKLSAgICAgIDM0NTYwMjEsIDQzNTYwMjEsIDM1NDYwMjEsIDUzNDYwMjEsIDQ1MzYwMjEsIDU0MzYwMjEsIDM0NjUwMjEsIDQzNjUwMjEsIDM2NDUwMjEsIDYzNDUwMjEsIDQ2MzUwMjEsIDY0MzUwMjEsCi0gICAgICAzNTY0MDIxLCA1MzY0MDIxLCAzNjU0MDIxLCA2MzU0MDIxLCA1NjM0MDIxLCA2NTM0MDIxLCA0NTYzMDIxLCA1NDYzMDIxLCA0NjUzMDIxLCA2NDUzMDIxLCA1NjQzMDIxLCA2NTQzMDIxLAotICAgICAgMjM0NTYwMSwgMzI0NTYwMSwgMjQzNTYwMSwgNDIzNTYwMSwgMzQyNTYwMSwgNDMyNTYwMSwgMjM1NDYwMSwgMzI1NDYwMSwgMjUzNDYwMSwgNTIzNDYwMSwgMzUyNDYwMSwgNTMyNDYwMSwKLSAgICAgIDI0NTM2MDEsIDQyNTM2MDEsIDI1NDM2MDEsIDUyNDM2MDEsIDQ1MjM2MDEsIDU0MjM2MDEsIDM0NTI2MDEsIDQzNTI2MDEsIDM1NDI2MDEsIDUzNDI2MDEsIDQ1MzI2MDEsIDU0MzI2MDEsCi0gICAgICAyMzQ2NTAxLCAzMjQ2NTAxLCAyNDM2NTAxLCA0MjM2NTAxLCAzNDI2NTAxLCA0MzI2NTAxLCAyMzY0NTAxLCAzMjY0NTAxLCAyNjM0NTAxLCA2MjM0NTAxLCAzNjI0NTAxLCA2MzI0NTAxLAotICAgICAgMjQ2MzUwMSwgNDI2MzUwMSwgMjY0MzUwMSwgNjI0MzUwMSwgNDYyMzUwMSwgNjQyMzUwMSwgMzQ2MjUwMSwgNDM2MjUwMSwgMzY0MjUwMSwgNjM0MjUwMSwgNDYzMjUwMSwgNjQzMjUwMSwKLSAgICAgIDIzNTY0MDEsIDMyNTY0MDEsIDI1MzY0MDEsIDUyMzY0MDEsIDM1MjY0MDEsIDUzMjY0MDEsIDIzNjU0MDEsIDMyNjU0MDEsIDI2MzU0MDEsIDYyMzU0MDEsIDM2MjU0MDEsIDYzMjU0MDEsCi0gICAgICAyNTYzNDAxLCA1MjYzNDAxLCAyNjUzNDAxLCA2MjUzNDAxLCA1NjIzNDAxLCA2NTIzNDAxLCAzNTYyNDAxLCA1MzYyNDAxLCAzNjUyNDAxLCA2MzUyNDAxLCA1NjMyNDAxLCA2NTMyNDAxLAotICAgICAgMjQ1NjMwMSwgNDI1NjMwMSwgMjU0NjMwMSwgNTI0NjMwMSwgNDUyNjMwMSwgNTQyNjMwMSwgMjQ2NTMwMSwgNDI2NTMwMSwgMjY0NTMwMSwgNjI0NTMwMSwgNDYyNTMwMSwgNjQyNTMwMSwKLSAgICAgIDI1NjQzMDEsIDUyNjQzMDEsIDI2NTQzMDEsIDYyNTQzMDEsIDU2MjQzMDEsIDY1MjQzMDEsIDQ1NjIzMDEsIDU0NjIzMDEsIDQ2NTIzMDEsIDY0NTIzMDEsIDU2NDIzMDEsIDY1NDIzMDEsCi0gICAgICAzNDU2MjAxLCA0MzU2MjAxLCAzNTQ2MjAxLCA1MzQ2MjAxLCA0NTM2MjAxLCA1NDM2MjAxLCAzNDY1MjAxLCA0MzY1MjAxLCAzNjQ1MjAxLCA2MzQ1MjAxLCA0NjM1MjAxLCA2NDM1MjAxLAotICAgICAgMzU2NDIwMSwgNTM2NDIwMSwgMzY1NDIwMSwgNjM1NDIwMSwgNTYzNDIwMSwgNjUzNDIwMSwgNDU2MzIwMSwgNTQ2MzIwMSwgNDY1MzIwMSwgNjQ1MzIwMSwgNTY0MzIwMSwgNjU0MzIwMSwKLSAgICAgIDEyMzQ1NjAsIDIxMzQ1NjAsIDEzMjQ1NjAsIDMxMjQ1NjAsIDIzMTQ1NjAsIDMyMTQ1NjAsIDEyNDM1NjAsIDIxNDM1NjAsIDE0MjM1NjAsIDQxMjM1NjAsIDI0MTM1NjAsIDQyMTM1NjAsCi0gICAgICAxMzQyNTYwLCAzMTQyNTYwLCAxNDMyNTYwLCA0MTMyNTYwLCAzNDEyNTYwLCA0MzEyNTYwLCAyMzQxNTYwLCAzMjQxNTYwLCAyNDMxNTYwLCA0MjMxNTYwLCAzNDIxNTYwLCA0MzIxNTYwLAotICAgICAgMTIzNTQ2MCwgMjEzNTQ2MCwgMTMyNTQ2MCwgMzEyNTQ2MCwgMjMxNTQ2MCwgMzIxNTQ2MCwgMTI1MzQ2MCwgMjE1MzQ2MCwgMTUyMzQ2MCwgNTEyMzQ2MCwgMjUxMzQ2MCwgNTIxMzQ2MCwKLSAgICAgIDEzNTI0NjAsIDMxNTI0NjAsIDE1MzI0NjAsIDUxMzI0NjAsIDM1MTI0NjAsIDUzMTI0NjAsIDIzNTE0NjAsIDMyNTE0NjAsIDI1MzE0NjAsIDUyMzE0NjAsIDM1MjE0NjAsIDUzMjE0NjAsCi0gICAgICAxMjQ1MzYwLCAyMTQ1MzYwLCAxNDI1MzYwLCA0MTI1MzYwLCAyNDE1MzYwLCA0MjE1MzYwLCAxMjU0MzYwLCAyMTU0MzYwLCAxNTI0MzYwLCA1MTI0MzYwLCAyNTE0MzYwLCA1MjE0MzYwLAotICAgICAgMTQ1MjM2MCwgNDE1MjM2MCwgMTU0MjM2MCwgNTE0MjM2MCwgNDUxMjM2MCwgNTQxMjM2MCwgMjQ1MTM2MCwgNDI1MTM2MCwgMjU0MTM2MCwgNTI0MTM2MCwgNDUyMTM2MCwgNTQyMTM2MCwKLSAgICAgIDEzNDUyNjAsIDMxNDUyNjAsIDE0MzUyNjAsIDQxMzUyNjAsIDM0MTUyNjAsIDQzMTUyNjAsIDEzNTQyNjAsIDMxNTQyNjAsIDE1MzQyNjAsIDUxMzQyNjAsIDM1MTQyNjAsIDUzMTQyNjAsCi0gICAgICAxNDUzMjYwLCA0MTUzMjYwLCAxNTQzMjYwLCA1MTQzMjYwLCA0NTEzMjYwLCA1NDEzMjYwLCAzNDUxMjYwLCA0MzUxMjYwLCAzNTQxMjYwLCA1MzQxMjYwLCA0NTMxMjYwLCA1NDMxMjYwLAotICAgICAgMjM0NTE2MCwgMzI0NTE2MCwgMjQzNTE2MCwgNDIzNTE2MCwgMzQyNTE2MCwgNDMyNTE2MCwgMjM1NDE2MCwgMzI1NDE2MCwgMjUzNDE2MCwgNTIzNDE2MCwgMzUyNDE2MCwgNTMyNDE2MCwKLSAgICAgIDI0NTMxNjAsIDQyNTMxNjAsIDI1NDMxNjAsIDUyNDMxNjAsIDQ1MjMxNjAsIDU0MjMxNjAsIDM0NTIxNjAsIDQzNTIxNjAsIDM1NDIxNjAsIDUzNDIxNjAsIDQ1MzIxNjAsIDU0MzIxNjAsCi0gICAgICAxMjM0NjUwLCAyMTM0NjUwLCAxMzI0NjUwLCAzMTI0NjUwLCAyMzE0NjUwLCAzMjE0NjUwLCAxMjQzNjUwLCAyMTQzNjUwLCAxNDIzNjUwLCA0MTIzNjUwLCAyNDEzNjUwLCA0MjEzNjUwLAotICAgICAgMTM0MjY1MCwgMzE0MjY1MCwgMTQzMjY1MCwgNDEzMjY1MCwgMzQxMjY1MCwgNDMxMjY1MCwgMjM0MTY1MCwgMzI0MTY1MCwgMjQzMTY1MCwgNDIzMTY1MCwgMzQyMTY1MCwgNDMyMTY1MCwKLSAgICAgIDEyMzY0NTAsIDIxMzY0NTAsIDEzMjY0NTAsIDMxMjY0NTAsIDIzMTY0NTAsIDMyMTY0NTAsIDEyNjM0NTAsIDIxNjM0NTAsIDE2MjM0NTAsIDYxMjM0NTAsIDI2MTM0NTAsIDYyMTM0NTAsCi0gICAgICAxMzYyNDUwLCAzMTYyNDUwLCAxNjMyNDUwLCA2MTMyNDUwLCAzNjEyNDUwLCA2MzEyNDUwLCAyMzYxNDUwLCAzMjYxNDUwLCAyNjMxNDUwLCA2MjMxNDUwLCAzNjIxNDUwLCA2MzIxNDUwLAotICAgICAgMTI0NjM1MCwgMjE0NjM1MCwgMTQyNjM1MCwgNDEyNjM1MCwgMjQxNjM1MCwgNDIxNjM1MCwgMTI2NDM1MCwgMjE2NDM1MCwgMTYyNDM1MCwgNjEyNDM1MCwgMjYxNDM1MCwgNjIxNDM1MCwKLSAgICAgIDE0NjIzNTAsIDQxNjIzNTAsIDE2NDIzNTAsIDYxNDIzNTAsIDQ2MTIzNTAsIDY0MTIzNTAsIDI0NjEzNTAsIDQyNjEzNTAsIDI2NDEzNTAsIDYyNDEzNTAsIDQ2MjEzNTAsIDY0MjEzNTAsCi0gICAgICAxMzQ2MjUwLCAzMTQ2MjUwLCAxNDM2MjUwLCA0MTM2MjUwLCAzNDE2MjUwLCA0MzE2MjUwLCAxMzY0MjUwLCAzMTY0MjUwLCAxNjM0MjUwLCA2MTM0MjUwLCAzNjE0MjUwLCA2MzE0MjUwLAotICAgICAgMTQ2MzI1MCwgNDE2MzI1MCwgMTY0MzI1MCwgNjE0MzI1MCwgNDYxMzI1MCwgNjQxMzI1MCwgMzQ2MTI1MCwgNDM2MTI1MCwgMzY0MTI1MCwgNjM0MTI1MCwgNDYzMTI1MCwgNjQzMTI1MCwKLSAgICAgIDIzNDYxNTAsIDMyNDYxNTAsIDI0MzYxNTAsIDQyMzYxNTAsIDM0MjYxNTAsIDQzMjYxNTAsIDIzNjQxNTAsIDMyNjQxNTAsIDI2MzQxNTAsIDYyMzQxNTAsIDM2MjQxNTAsIDYzMjQxNTAsCi0gICAgICAyNDYzMTUwLCA0MjYzMTUwLCAyNjQzMTUwLCA2MjQzMTUwLCA0NjIzMTUwLCA2NDIzMTUwLCAzNDYyMTUwLCA0MzYyMTUwLCAzNjQyMTUwLCA2MzQyMTUwLCA0NjMyMTUwLCA2NDMyMTUwLAotICAgICAgMTIzNTY0MCwgMjEzNTY0MCwgMTMyNTY0MCwgMzEyNTY0MCwgMjMxNTY0MCwgMzIxNTY0MCwgMTI1MzY0MCwgMjE1MzY0MCwgMTUyMzY0MCwgNTEyMzY0MCwgMjUxMzY0MCwgNTIxMzY0MCwKLSAgICAgIDEzNTI2NDAsIDMxNTI2NDAsIDE1MzI2NDAsIDUxMzI2NDAsIDM1MTI2NDAsIDUzMTI2NDAsIDIzNTE2NDAsIDMyNTE2NDAsIDI1MzE2NDAsIDUyMzE2NDAsIDM1MjE2NDAsIDUzMjE2NDAsCi0gICAgICAxMjM2NTQwLCAyMTM2NTQwLCAxMzI2NTQwLCAzMTI2NTQwLCAyMzE2NTQwLCAzMjE2NTQwLCAxMjYzNTQwLCAyMTYzNTQwLCAxNjIzNTQwLCA2MTIzNTQwLCAyNjEzNTQwLCA2MjEzNTQwLAotICAgICAgMTM2MjU0MCwgMzE2MjU0MCwgMTYzMjU0MCwgNjEzMjU0MCwgMzYxMjU0MCwgNjMxMjU0MCwgMjM2MTU0MCwgMzI2MTU0MCwgMjYzMTU0MCwgNjIzMTU0MCwgMzYyMTU0MCwgNjMyMTU0MCwKLSAgICAgIDEyNTYzNDAsIDIxNTYzNDAsIDE1MjYzNDAsIDUxMjYzNDAsIDI1MTYzNDAsIDUyMTYzNDAsIDEyNjUzNDAsIDIxNjUzNDAsIDE2MjUzNDAsIDYxMjUzNDAsIDI2MTUzNDAsIDYyMTUzNDAsCi0gICAgICAxNTYyMzQwLCA1MTYyMzQwLCAxNjUyMzQwLCA2MTUyMzQwLCA1NjEyMzQwLCA2NTEyMzQwLCAyNTYxMzQwLCA1MjYxMzQwLCAyNjUxMzQwLCA2MjUxMzQwLCA1NjIxMzQwLCA2NTIxMzQwLAotICAgICAgMTM1NjI0MCwgMzE1NjI0MCwgMTUzNjI0MCwgNTEzNjI0MCwgMzUxNjI0MCwgNTMxNjI0MCwgMTM2NTI0MCwgMzE2NTI0MCwgMTYzNTI0MCwgNjEzNTI0MCwgMzYxNTI0MCwgNjMxNTI0MCwKLSAgICAgIDE1NjMyNDAsIDUxNjMyNDAsIDE2NTMyNDAsIDYxNTMyNDAsIDU2MTMyNDAsIDY1MTMyNDAsIDM1NjEyNDAsIDUzNjEyNDAsIDM2NTEyNDAsIDYzNTEyNDAsIDU2MzEyNDAsIDY1MzEyNDAsCi0gICAgICAyMzU2MTQwLCAzMjU2MTQwLCAyNTM2MTQwLCA1MjM2MTQwLCAzNTI2MTQwLCA1MzI2MTQwLCAyMzY1MTQwLCAzMjY1MTQwLCAyNjM1MTQwLCA2MjM1MTQwLCAzNjI1MTQwLCA2MzI1MTQwLAotICAgICAgMjU2MzE0MCwgNTI2MzE0MCwgMjY1MzE0MCwgNjI1MzE0MCwgNTYyMzE0MCwgNjUyMzE0MCwgMzU2MjE0MCwgNTM2MjE0MCwgMzY1MjE0MCwgNjM1MjE0MCwgNTYzMjE0MCwgNjUzMjE0MCwKLSAgICAgIDEyNDU2MzAsIDIxNDU2MzAsIDE0MjU2MzAsIDQxMjU2MzAsIDI0MTU2MzAsIDQyMTU2MzAsIDEyNTQ2MzAsIDIxNTQ2MzAsIDE1MjQ2MzAsIDUxMjQ2MzAsIDI1MTQ2MzAsIDUyMTQ2MzAsCi0gICAgICAxNDUyNjMwLCA0MTUyNjMwLCAxNTQyNjMwLCA1MTQyNjMwLCA0NTEyNjMwLCA1NDEyNjMwLCAyNDUxNjMwLCA0MjUxNjMwLCAyNTQxNjMwLCA1MjQxNjMwLCA0NTIxNjMwLCA1NDIxNjMwLAotICAgICAgMTI0NjUzMCwgMjE0NjUzMCwgMTQyNjUzMCwgNDEyNjUzMCwgMjQxNjUzMCwgNDIxNjUzMCwgMTI2NDUzMCwgMjE2NDUzMCwgMTYyNDUzMCwgNjEyNDUzMCwgMjYxNDUzMCwgNjIxNDUzMCwKLSAgICAgIDE0NjI1MzAsIDQxNjI1MzAsIDE2NDI1MzAsIDYxNDI1MzAsIDQ2MTI1MzAsIDY0MTI1MzAsIDI0NjE1MzAsIDQyNjE1MzAsIDI2NDE1MzAsIDYyNDE1MzAsIDQ2MjE1MzAsIDY0MjE1MzAsCi0gICAgICAxMjU2NDMwLCAyMTU2NDMwLCAxNTI2NDMwLCA1MTI2NDMwLCAyNTE2NDMwLCA1MjE2NDMwLCAxMjY1NDMwLCAyMTY1NDMwLCAxNjI1NDMwLCA2MTI1NDMwLCAyNjE1NDMwLCA2MjE1NDMwLAotICAgICAgMTU2MjQzMCwgNTE2MjQzMCwgMTY1MjQzMCwgNjE1MjQzMCwgNTYxMjQzMCwgNjUxMjQzMCwgMjU2MTQzMCwgNTI2MTQzMCwgMjY1MTQzMCwgNjI1MTQzMCwgNTYyMTQzMCwgNjUyMTQzMCwKLSAgICAgIDE0NTYyMzAsIDQxNTYyMzAsIDE1NDYyMzAsIDUxNDYyMzAsIDQ1MTYyMzAsIDU0MTYyMzAsIDE0NjUyMzAsIDQxNjUyMzAsIDE2NDUyMzAsIDYxNDUyMzAsIDQ2MTUyMzAsIDY0MTUyMzAsCi0gICAgICAxNTY0MjMwLCA1MTY0MjMwLCAxNjU0MjMwLCA2MTU0MjMwLCA1NjE0MjMwLCA2NTE0MjMwLCA0NTYxMjMwLCA1NDYxMjMwLCA0NjUxMjMwLCA2NDUxMjMwLCA1NjQxMjMwLCA2NTQxMjMwLAotICAgICAgMjQ1NjEzMCwgNDI1NjEzMCwgMjU0NjEzMCwgNTI0NjEzMCwgNDUyNjEzMCwgNTQyNjEzMCwgMjQ2NTEzMCwgNDI2NTEzMCwgMjY0NTEzMCwgNjI0NTEzMCwgNDYyNTEzMCwgNjQyNTEzMCwKLSAgICAgIDI1NjQxMzAsIDUyNjQxMzAsIDI2NTQxMzAsIDYyNTQxMzAsIDU2MjQxMzAsIDY1MjQxMzAsIDQ1NjIxMzAsIDU0NjIxMzAsIDQ2NTIxMzAsIDY0NTIxMzAsIDU2NDIxMzAsIDY1NDIxMzAsCi0gICAgICAxMzQ1NjIwLCAzMTQ1NjIwLCAxNDM1NjIwLCA0MTM1NjIwLCAzNDE1NjIwLCA0MzE1NjIwLCAxMzU0NjIwLCAzMTU0NjIwLCAxNTM0NjIwLCA1MTM0NjIwLCAzNTE0NjIwLCA1MzE0NjIwLAotICAgICAgMTQ1MzYyMCwgNDE1MzYyMCwgMTU0MzYyMCwgNTE0MzYyMCwgNDUxMzYyMCwgNTQxMzYyMCwgMzQ1MTYyMCwgNDM1MTYyMCwgMzU0MTYyMCwgNTM0MTYyMCwgNDUzMTYyMCwgNTQzMTYyMCwKLSAgICAgIDEzNDY1MjAsIDMxNDY1MjAsIDE0MzY1MjAsIDQxMzY1MjAsIDM0MTY1MjAsIDQzMTY1MjAsIDEzNjQ1MjAsIDMxNjQ1MjAsIDE2MzQ1MjAsIDYxMzQ1MjAsIDM2MTQ1MjAsIDYzMTQ1MjAsCi0gICAgICAxNDYzNTIwLCA0MTYzNTIwLCAxNjQzNTIwLCA2MTQzNTIwLCA0NjEzNTIwLCA2NDEzNTIwLCAzNDYxNTIwLCA0MzYxNTIwLCAzNjQxNTIwLCA2MzQxNTIwLCA0NjMxNTIwLCA2NDMxNTIwLAotICAgICAgMTM1NjQyMCwgMzE1NjQyMCwgMTUzNjQyMCwgNTEzNjQyMCwgMzUxNjQyMCwgNTMxNjQyMCwgMTM2NTQyMCwgMzE2NTQyMCwgMTYzNTQyMCwgNjEzNTQyMCwgMzYxNTQyMCwgNjMxNTQyMCwKLSAgICAgIDE1NjM0MjAsIDUxNjM0MjAsIDE2NTM0MjAsIDYxNTM0MjAsIDU2MTM0MjAsIDY1MTM0MjAsIDM1NjE0MjAsIDUzNjE0MjAsIDM2NTE0MjAsIDYzNTE0MjAsIDU2MzE0MjAsIDY1MzE0MjAsCi0gICAgICAxNDU2MzIwLCA0MTU2MzIwLCAxNTQ2MzIwLCA1MTQ2MzIwLCA0NTE2MzIwLCA1NDE2MzIwLCAxNDY1MzIwLCA0MTY1MzIwLCAxNjQ1MzIwLCA2MTQ1MzIwLCA0NjE1MzIwLCA2NDE1MzIwLAotICAgICAgMTU2NDMyMCwgNTE2NDMyMCwgMTY1NDMyMCwgNjE1NDMyMCwgNTYxNDMyMCwgNjUxNDMyMCwgNDU2MTMyMCwgNTQ2MTMyMCwgNDY1MTMyMCwgNjQ1MTMyMCwgNTY0MTMyMCwgNjU0MTMyMCwKLSAgICAgIDM0NTYxMjAsIDQzNTYxMjAsIDM1NDYxMjAsIDUzNDYxMjAsIDQ1MzYxMjAsIDU0MzYxMjAsIDM0NjUxMjAsIDQzNjUxMjAsIDM2NDUxMjAsIDYzNDUxMjAsIDQ2MzUxMjAsIDY0MzUxMjAsCi0gICAgICAzNTY0MTIwLCA1MzY0MTIwLCAzNjU0MTIwLCA2MzU0MTIwLCA1NjM0MTIwLCA2NTM0MTIwLCA0NTYzMTIwLCA1NDYzMTIwLCA0NjUzMTIwLCA2NDUzMTIwLCA1NjQzMTIwLCA2NTQzMTIwLAotICAgICAgMjM0NTYxMCwgMzI0NTYxMCwgMjQzNTYxMCwgNDIzNTYxMCwgMzQyNTYxMCwgNDMyNTYxMCwgMjM1NDYxMCwgMzI1NDYxMCwgMjUzNDYxMCwgNTIzNDYxMCwgMzUyNDYxMCwgNTMyNDYxMCwKLSAgICAgIDI0NTM2MTAsIDQyNTM2MTAsIDI1NDM2MTAsIDUyNDM2MTAsIDQ1MjM2MTAsIDU0MjM2MTAsIDM0NTI2MTAsIDQzNTI2MTAsIDM1NDI2MTAsIDUzNDI2MTAsIDQ1MzI2MTAsIDU0MzI2MTAsCi0gICAgICAyMzQ2NTEwLCAzMjQ2NTEwLCAyNDM2NTEwLCA0MjM2NTEwLCAzNDI2NTEwLCA0MzI2NTEwLCAyMzY0NTEwLCAzMjY0NTEwLCAyNjM0NTEwLCA2MjM0NTEwLCAzNjI0NTEwLCA2MzI0NTEwLAotICAgICAgMjQ2MzUxMCwgNDI2MzUxMCwgMjY0MzUxMCwgNjI0MzUxMCwgNDYyMzUxMCwgNjQyMzUxMCwgMzQ2MjUxMCwgNDM2MjUxMCwgMzY0MjUxMCwgNjM0MjUxMCwgNDYzMjUxMCwgNjQzMjUxMCwKLSAgICAgIDIzNTY0MTAsIDMyNTY0MTAsIDI1MzY0MTAsIDUyMzY0MTAsIDM1MjY0MTAsIDUzMjY0MTAsIDIzNjU0MTAsIDMyNjU0MTAsIDI2MzU0MTAsIDYyMzU0MTAsIDM2MjU0MTAsIDYzMjU0MTAsCi0gICAgICAyNTYzNDEwLCA1MjYzNDEwLCAyNjUzNDEwLCA2MjUzNDEwLCA1NjIzNDEwLCA2NTIzNDEwLCAzNTYyNDEwLCA1MzYyNDEwLCAzNjUyNDEwLCA2MzUyNDEwLCA1NjMyNDEwLCA2NTMyNDEwLAotICAgICAgMjQ1NjMxMCwgNDI1NjMxMCwgMjU0NjMxMCwgNTI0NjMxMCwgNDUyNjMxMCwgNTQyNjMxMCwgMjQ2NTMxMCwgNDI2NTMxMCwgMjY0NTMxMCwgNjI0NTMxMCwgNDYyNTMxMCwgNjQyNTMxMCwKLSAgICAgIDI1NjQzMTAsIDUyNjQzMTAsIDI2NTQzMTAsIDYyNTQzMTAsIDU2MjQzMTAsIDY1MjQzMTAsIDQ1NjIzMTAsIDU0NjIzMTAsIDQ2NTIzMTAsIDY0NTIzMTAsIDU2NDIzMTAsIDY1NDIzMTAsCi0gICAgICAzNDU2MjEwLCA0MzU2MjEwLCAzNTQ2MjEwLCA1MzQ2MjEwLCA0NTM2MjEwLCA1NDM2MjEwLCAzNDY1MjEwLCA0MzY1MjEwLCAzNjQ1MjEwLCA2MzQ1MjEwLCA0NjM1MjEwLCA2NDM1MjEwLAotICAgICAgMzU2NDIxMCwgNTM2NDIxMCwgMzY1NDIxMCwgNjM1NDIxMCwgNTYzNDIxMCwgNjUzNDIxMCwgNDU2MzIxMCwgNTQ2MzIxMCwgNDY1MzIxMCwgNjQ1MzIxMCwgNTY0MzIxMCwgNjU0MzIxMAotICAgIH07CisgICAgICAgIDEyMzQ1NiwgIDEwMjM0NTYsIDIxMzQ1NiwgIDIwMTM0NTYsIDEyMDM0NTYsIDIxMDM0NTYsIDEzMjQ1NiwgIDEwMzI0NTYsIDMxMjQ1NiwgIDMwMTI0NTYsIDEzMDI0NTYsIDMxMDI0NTYsCisgICAgICAgIDIzMTQ1NiwgIDIwMzE0NTYsIDMyMTQ1NiwgIDMwMjE0NTYsIDIzMDE0NTYsIDMyMDE0NTYsIDEyMzA0NTYsIDIxMzA0NTYsIDEzMjA0NTYsIDMxMjA0NTYsIDIzMTA0NTYsIDMyMTA0NTYsCisgICAgICAgIDEyNDM1NiwgIDEwMjQzNTYsIDIxNDM1NiwgIDIwMTQzNTYsIDEyMDQzNTYsIDIxMDQzNTYsIDE0MjM1NiwgIDEwNDIzNTYsIDQxMjM1NiwgIDQwMTIzNTYsIDE0MDIzNTYsIDQxMDIzNTYsCisgICAgICAgIDI0MTM1NiwgIDIwNDEzNTYsIDQyMTM1NiwgIDQwMjEzNTYsIDI0MDEzNTYsIDQyMDEzNTYsIDEyNDAzNTYsIDIxNDAzNTYsIDE0MjAzNTYsIDQxMjAzNTYsIDI0MTAzNTYsIDQyMTAzNTYsCisgICAgICAgIDEzNDI1NiwgIDEwMzQyNTYsIDMxNDI1NiwgIDMwMTQyNTYsIDEzMDQyNTYsIDMxMDQyNTYsIDE0MzI1NiwgIDEwNDMyNTYsIDQxMzI1NiwgIDQwMTMyNTYsIDE0MDMyNTYsIDQxMDMyNTYsCisgICAgICAgIDM0MTI1NiwgIDMwNDEyNTYsIDQzMTI1NiwgIDQwMzEyNTYsIDM0MDEyNTYsIDQzMDEyNTYsIDEzNDAyNTYsIDMxNDAyNTYsIDE0MzAyNTYsIDQxMzAyNTYsIDM0MTAyNTYsIDQzMTAyNTYsCisgICAgICAgIDIzNDE1NiwgIDIwMzQxNTYsIDMyNDE1NiwgIDMwMjQxNTYsIDIzMDQxNTYsIDMyMDQxNTYsIDI0MzE1NiwgIDIwNDMxNTYsIDQyMzE1NiwgIDQwMjMxNTYsIDI0MDMxNTYsIDQyMDMxNTYsCisgICAgICAgIDM0MjE1NiwgIDMwNDIxNTYsIDQzMjE1NiwgIDQwMzIxNTYsIDM0MDIxNTYsIDQzMDIxNTYsIDIzNDAxNTYsIDMyNDAxNTYsIDI0MzAxNTYsIDQyMzAxNTYsIDM0MjAxNTYsIDQzMjAxNTYsCisgICAgICAgIDEyMzQwNTYsIDIxMzQwNTYsIDEzMjQwNTYsIDMxMjQwNTYsIDIzMTQwNTYsIDMyMTQwNTYsIDEyNDMwNTYsIDIxNDMwNTYsIDE0MjMwNTYsIDQxMjMwNTYsIDI0MTMwNTYsIDQyMTMwNTYsCisgICAgICAgIDEzNDIwNTYsIDMxNDIwNTYsIDE0MzIwNTYsIDQxMzIwNTYsIDM0MTIwNTYsIDQzMTIwNTYsIDIzNDEwNTYsIDMyNDEwNTYsIDI0MzEwNTYsIDQyMzEwNTYsIDM0MjEwNTYsIDQzMjEwNTYsCisgICAgICAgIDEyMzU0NiwgIDEwMjM1NDYsIDIxMzU0NiwgIDIwMTM1NDYsIDEyMDM1NDYsIDIxMDM1NDYsIDEzMjU0NiwgIDEwMzI1NDYsIDMxMjU0NiwgIDMwMTI1NDYsIDEzMDI1NDYsIDMxMDI1NDYsCisgICAgICAgIDIzMTU0NiwgIDIwMzE1NDYsIDMyMTU0NiwgIDMwMjE1NDYsIDIzMDE1NDYsIDMyMDE1NDYsIDEyMzA1NDYsIDIxMzA1NDYsIDEzMjA1NDYsIDMxMjA1NDYsIDIzMTA1NDYsIDMyMTA1NDYsCisgICAgICAgIDEyNTM0NiwgIDEwMjUzNDYsIDIxNTM0NiwgIDIwMTUzNDYsIDEyMDUzNDYsIDIxMDUzNDYsIDE1MjM0NiwgIDEwNTIzNDYsIDUxMjM0NiwgIDUwMTIzNDYsIDE1MDIzNDYsIDUxMDIzNDYsCisgICAgICAgIDI1MTM0NiwgIDIwNTEzNDYsIDUyMTM0NiwgIDUwMjEzNDYsIDI1MDEzNDYsIDUyMDEzNDYsIDEyNTAzNDYsIDIxNTAzNDYsIDE1MjAzNDYsIDUxMjAzNDYsIDI1MTAzNDYsIDUyMTAzNDYsCisgICAgICAgIDEzNTI0NiwgIDEwMzUyNDYsIDMxNTI0NiwgIDMwMTUyNDYsIDEzMDUyNDYsIDMxMDUyNDYsIDE1MzI0NiwgIDEwNTMyNDYsIDUxMzI0NiwgIDUwMTMyNDYsIDE1MDMyNDYsIDUxMDMyNDYsCisgICAgICAgIDM1MTI0NiwgIDMwNTEyNDYsIDUzMTI0NiwgIDUwMzEyNDYsIDM1MDEyNDYsIDUzMDEyNDYsIDEzNTAyNDYsIDMxNTAyNDYsIDE1MzAyNDYsIDUxMzAyNDYsIDM1MTAyNDYsIDUzMTAyNDYsCisgICAgICAgIDIzNTE0NiwgIDIwMzUxNDYsIDMyNTE0NiwgIDMwMjUxNDYsIDIzMDUxNDYsIDMyMDUxNDYsIDI1MzE0NiwgIDIwNTMxNDYsIDUyMzE0NiwgIDUwMjMxNDYsIDI1MDMxNDYsIDUyMDMxNDYsCisgICAgICAgIDM1MjE0NiwgIDMwNTIxNDYsIDUzMjE0NiwgIDUwMzIxNDYsIDM1MDIxNDYsIDUzMDIxNDYsIDIzNTAxNDYsIDMyNTAxNDYsIDI1MzAxNDYsIDUyMzAxNDYsIDM1MjAxNDYsIDUzMjAxNDYsCisgICAgICAgIDEyMzUwNDYsIDIxMzUwNDYsIDEzMjUwNDYsIDMxMjUwNDYsIDIzMTUwNDYsIDMyMTUwNDYsIDEyNTMwNDYsIDIxNTMwNDYsIDE1MjMwNDYsIDUxMjMwNDYsIDI1MTMwNDYsIDUyMTMwNDYsCisgICAgICAgIDEzNTIwNDYsIDMxNTIwNDYsIDE1MzIwNDYsIDUxMzIwNDYsIDM1MTIwNDYsIDUzMTIwNDYsIDIzNTEwNDYsIDMyNTEwNDYsIDI1MzEwNDYsIDUyMzEwNDYsIDM1MjEwNDYsIDUzMjEwNDYsCisgICAgICAgIDEyNDUzNiwgIDEwMjQ1MzYsIDIxNDUzNiwgIDIwMTQ1MzYsIDEyMDQ1MzYsIDIxMDQ1MzYsIDE0MjUzNiwgIDEwNDI1MzYsIDQxMjUzNiwgIDQwMTI1MzYsIDE0MDI1MzYsIDQxMDI1MzYsCisgICAgICAgIDI0MTUzNiwgIDIwNDE1MzYsIDQyMTUzNiwgIDQwMjE1MzYsIDI0MDE1MzYsIDQyMDE1MzYsIDEyNDA1MzYsIDIxNDA1MzYsIDE0MjA1MzYsIDQxMjA1MzYsIDI0MTA1MzYsIDQyMTA1MzYsCisgICAgICAgIDEyNTQzNiwgIDEwMjU0MzYsIDIxNTQzNiwgIDIwMTU0MzYsIDEyMDU0MzYsIDIxMDU0MzYsIDE1MjQzNiwgIDEwNTI0MzYsIDUxMjQzNiwgIDUwMTI0MzYsIDE1MDI0MzYsIDUxMDI0MzYsCisgICAgICAgIDI1MTQzNiwgIDIwNTE0MzYsIDUyMTQzNiwgIDUwMjE0MzYsIDI1MDE0MzYsIDUyMDE0MzYsIDEyNTA0MzYsIDIxNTA0MzYsIDE1MjA0MzYsIDUxMjA0MzYsIDI1MTA0MzYsIDUyMTA0MzYsCisgICAgICAgIDE0NTIzNiwgIDEwNDUyMzYsIDQxNTIzNiwgIDQwMTUyMzYsIDE0MDUyMzYsIDQxMDUyMzYsIDE1NDIzNiwgIDEwNTQyMzYsIDUxNDIzNiwgIDUwMTQyMzYsIDE1MDQyMzYsIDUxMDQyMzYsCisgICAgICAgIDQ1MTIzNiwgIDQwNTEyMzYsIDU0MTIzNiwgIDUwNDEyMzYsIDQ1MDEyMzYsIDU0MDEyMzYsIDE0NTAyMzYsIDQxNTAyMzYsIDE1NDAyMzYsIDUxNDAyMzYsIDQ1MTAyMzYsIDU0MTAyMzYsCisgICAgICAgIDI0NTEzNiwgIDIwNDUxMzYsIDQyNTEzNiwgIDQwMjUxMzYsIDI0MDUxMzYsIDQyMDUxMzYsIDI1NDEzNiwgIDIwNTQxMzYsIDUyNDEzNiwgIDUwMjQxMzYsIDI1MDQxMzYsIDUyMDQxMzYsCisgICAgICAgIDQ1MjEzNiwgIDQwNTIxMzYsIDU0MjEzNiwgIDUwNDIxMzYsIDQ1MDIxMzYsIDU0MDIxMzYsIDI0NTAxMzYsIDQyNTAxMzYsIDI1NDAxMzYsIDUyNDAxMzYsIDQ1MjAxMzYsIDU0MjAxMzYsCisgICAgICAgIDEyNDUwMzYsIDIxNDUwMzYsIDE0MjUwMzYsIDQxMjUwMzYsIDI0MTUwMzYsIDQyMTUwMzYsIDEyNTQwMzYsIDIxNTQwMzYsIDE1MjQwMzYsIDUxMjQwMzYsIDI1MTQwMzYsIDUyMTQwMzYsCisgICAgICAgIDE0NTIwMzYsIDQxNTIwMzYsIDE1NDIwMzYsIDUxNDIwMzYsIDQ1MTIwMzYsIDU0MTIwMzYsIDI0NTEwMzYsIDQyNTEwMzYsIDI1NDEwMzYsIDUyNDEwMzYsIDQ1MjEwMzYsIDU0MjEwMzYsCisgICAgICAgIDEzNDUyNiwgIDEwMzQ1MjYsIDMxNDUyNiwgIDMwMTQ1MjYsIDEzMDQ1MjYsIDMxMDQ1MjYsIDE0MzUyNiwgIDEwNDM1MjYsIDQxMzUyNiwgIDQwMTM1MjYsIDE0MDM1MjYsIDQxMDM1MjYsCisgICAgICAgIDM0MTUyNiwgIDMwNDE1MjYsIDQzMTUyNiwgIDQwMzE1MjYsIDM0MDE1MjYsIDQzMDE1MjYsIDEzNDA1MjYsIDMxNDA1MjYsIDE0MzA1MjYsIDQxMzA1MjYsIDM0MTA1MjYsIDQzMTA1MjYsCisgICAgICAgIDEzNTQyNiwgIDEwMzU0MjYsIDMxNTQyNiwgIDMwMTU0MjYsIDEzMDU0MjYsIDMxMDU0MjYsIDE1MzQyNiwgIDEwNTM0MjYsIDUxMzQyNiwgIDUwMTM0MjYsIDE1MDM0MjYsIDUxMDM0MjYsCisgICAgICAgIDM1MTQyNiwgIDMwNTE0MjYsIDUzMTQyNiwgIDUwMzE0MjYsIDM1MDE0MjYsIDUzMDE0MjYsIDEzNTA0MjYsIDMxNTA0MjYsIDE1MzA0MjYsIDUxMzA0MjYsIDM1MTA0MjYsIDUzMTA0MjYsCisgICAgICAgIDE0NTMyNiwgIDEwNDUzMjYsIDQxNTMyNiwgIDQwMTUzMjYsIDE0MDUzMjYsIDQxMDUzMjYsIDE1NDMyNiwgIDEwNTQzMjYsIDUxNDMyNiwgIDUwMTQzMjYsIDE1MDQzMjYsIDUxMDQzMjYsCisgICAgICAgIDQ1MTMyNiwgIDQwNTEzMjYsIDU0MTMyNiwgIDUwNDEzMjYsIDQ1MDEzMjYsIDU0MDEzMjYsIDE0NTAzMjYsIDQxNTAzMjYsIDE1NDAzMjYsIDUxNDAzMjYsIDQ1MTAzMjYsIDU0MTAzMjYsCisgICAgICAgIDM0NTEyNiwgIDMwNDUxMjYsIDQzNTEyNiwgIDQwMzUxMjYsIDM0MDUxMjYsIDQzMDUxMjYsIDM1NDEyNiwgIDMwNTQxMjYsIDUzNDEyNiwgIDUwMzQxMjYsIDM1MDQxMjYsIDUzMDQxMjYsCisgICAgICAgIDQ1MzEyNiwgIDQwNTMxMjYsIDU0MzEyNiwgIDUwNDMxMjYsIDQ1MDMxMjYsIDU0MDMxMjYsIDM0NTAxMjYsIDQzNTAxMjYsIDM1NDAxMjYsIDUzNDAxMjYsIDQ1MzAxMjYsIDU0MzAxMjYsCisgICAgICAgIDEzNDUwMjYsIDMxNDUwMjYsIDE0MzUwMjYsIDQxMzUwMjYsIDM0MTUwMjYsIDQzMTUwMjYsIDEzNTQwMjYsIDMxNTQwMjYsIDE1MzQwMjYsIDUxMzQwMjYsIDM1MTQwMjYsIDUzMTQwMjYsCisgICAgICAgIDE0NTMwMjYsIDQxNTMwMjYsIDE1NDMwMjYsIDUxNDMwMjYsIDQ1MTMwMjYsIDU0MTMwMjYsIDM0NTEwMjYsIDQzNTEwMjYsIDM1NDEwMjYsIDUzNDEwMjYsIDQ1MzEwMjYsIDU0MzEwMjYsCisgICAgICAgIDIzNDUxNiwgIDIwMzQ1MTYsIDMyNDUxNiwgIDMwMjQ1MTYsIDIzMDQ1MTYsIDMyMDQ1MTYsIDI0MzUxNiwgIDIwNDM1MTYsIDQyMzUxNiwgIDQwMjM1MTYsIDI0MDM1MTYsIDQyMDM1MTYsCisgICAgICAgIDM0MjUxNiwgIDMwNDI1MTYsIDQzMjUxNiwgIDQwMzI1MTYsIDM0MDI1MTYsIDQzMDI1MTYsIDIzNDA1MTYsIDMyNDA1MTYsIDI0MzA1MTYsIDQyMzA1MTYsIDM0MjA1MTYsIDQzMjA1MTYsCisgICAgICAgIDIzNTQxNiwgIDIwMzU0MTYsIDMyNTQxNiwgIDMwMjU0MTYsIDIzMDU0MTYsIDMyMDU0MTYsIDI1MzQxNiwgIDIwNTM0MTYsIDUyMzQxNiwgIDUwMjM0MTYsIDI1MDM0MTYsIDUyMDM0MTYsCisgICAgICAgIDM1MjQxNiwgIDMwNTI0MTYsIDUzMjQxNiwgIDUwMzI0MTYsIDM1MDI0MTYsIDUzMDI0MTYsIDIzNTA0MTYsIDMyNTA0MTYsIDI1MzA0MTYsIDUyMzA0MTYsIDM1MjA0MTYsIDUzMjA0MTYsCisgICAgICAgIDI0NTMxNiwgIDIwNDUzMTYsIDQyNTMxNiwgIDQwMjUzMTYsIDI0MDUzMTYsIDQyMDUzMTYsIDI1NDMxNiwgIDIwNTQzMTYsIDUyNDMxNiwgIDUwMjQzMTYsIDI1MDQzMTYsIDUyMDQzMTYsCisgICAgICAgIDQ1MjMxNiwgIDQwNTIzMTYsIDU0MjMxNiwgIDUwNDIzMTYsIDQ1MDIzMTYsIDU0MDIzMTYsIDI0NTAzMTYsIDQyNTAzMTYsIDI1NDAzMTYsIDUyNDAzMTYsIDQ1MjAzMTYsIDU0MjAzMTYsCisgICAgICAgIDM0NTIxNiwgIDMwNDUyMTYsIDQzNTIxNiwgIDQwMzUyMTYsIDM0MDUyMTYsIDQzMDUyMTYsIDM1NDIxNiwgIDMwNTQyMTYsIDUzNDIxNiwgIDUwMzQyMTYsIDM1MDQyMTYsIDUzMDQyMTYsCisgICAgICAgIDQ1MzIxNiwgIDQwNTMyMTYsIDU0MzIxNiwgIDUwNDMyMTYsIDQ1MDMyMTYsIDU0MDMyMTYsIDM0NTAyMTYsIDQzNTAyMTYsIDM1NDAyMTYsIDUzNDAyMTYsIDQ1MzAyMTYsIDU0MzAyMTYsCisgICAgICAgIDIzNDUwMTYsIDMyNDUwMTYsIDI0MzUwMTYsIDQyMzUwMTYsIDM0MjUwMTYsIDQzMjUwMTYsIDIzNTQwMTYsIDMyNTQwMTYsIDI1MzQwMTYsIDUyMzQwMTYsIDM1MjQwMTYsIDUzMjQwMTYsCisgICAgICAgIDI0NTMwMTYsIDQyNTMwMTYsIDI1NDMwMTYsIDUyNDMwMTYsIDQ1MjMwMTYsIDU0MjMwMTYsIDM0NTIwMTYsIDQzNTIwMTYsIDM1NDIwMTYsIDUzNDIwMTYsIDQ1MzIwMTYsIDU0MzIwMTYsCisgICAgICAgIDEyMzQ1MDYsIDIxMzQ1MDYsIDEzMjQ1MDYsIDMxMjQ1MDYsIDIzMTQ1MDYsIDMyMTQ1MDYsIDEyNDM1MDYsIDIxNDM1MDYsIDE0MjM1MDYsIDQxMjM1MDYsIDI0MTM1MDYsIDQyMTM1MDYsCisgICAgICAgIDEzNDI1MDYsIDMxNDI1MDYsIDE0MzI1MDYsIDQxMzI1MDYsIDM0MTI1MDYsIDQzMTI1MDYsIDIzNDE1MDYsIDMyNDE1MDYsIDI0MzE1MDYsIDQyMzE1MDYsIDM0MjE1MDYsIDQzMjE1MDYsCisgICAgICAgIDEyMzU0MDYsIDIxMzU0MDYsIDEzMjU0MDYsIDMxMjU0MDYsIDIzMTU0MDYsIDMyMTU0MDYsIDEyNTM0MDYsIDIxNTM0MDYsIDE1MjM0MDYsIDUxMjM0MDYsIDI1MTM0MDYsIDUyMTM0MDYsCisgICAgICAgIDEzNTI0MDYsIDMxNTI0MDYsIDE1MzI0MDYsIDUxMzI0MDYsIDM1MTI0MDYsIDUzMTI0MDYsIDIzNTE0MDYsIDMyNTE0MDYsIDI1MzE0MDYsIDUyMzE0MDYsIDM1MjE0MDYsIDUzMjE0MDYsCisgICAgICAgIDEyNDUzMDYsIDIxNDUzMDYsIDE0MjUzMDYsIDQxMjUzMDYsIDI0MTUzMDYsIDQyMTUzMDYsIDEyNTQzMDYsIDIxNTQzMDYsIDE1MjQzMDYsIDUxMjQzMDYsIDI1MTQzMDYsIDUyMTQzMDYsCisgICAgICAgIDE0NTIzMDYsIDQxNTIzMDYsIDE1NDIzMDYsIDUxNDIzMDYsIDQ1MTIzMDYsIDU0MTIzMDYsIDI0NTEzMDYsIDQyNTEzMDYsIDI1NDEzMDYsIDUyNDEzMDYsIDQ1MjEzMDYsIDU0MjEzMDYsCisgICAgICAgIDEzNDUyMDYsIDMxNDUyMDYsIDE0MzUyMDYsIDQxMzUyMDYsIDM0MTUyMDYsIDQzMTUyMDYsIDEzNTQyMDYsIDMxNTQyMDYsIDE1MzQyMDYsIDUxMzQyMDYsIDM1MTQyMDYsIDUzMTQyMDYsCisgICAgICAgIDE0NTMyMDYsIDQxNTMyMDYsIDE1NDMyMDYsIDUxNDMyMDYsIDQ1MTMyMDYsIDU0MTMyMDYsIDM0NTEyMDYsIDQzNTEyMDYsIDM1NDEyMDYsIDUzNDEyMDYsIDQ1MzEyMDYsIDU0MzEyMDYsCisgICAgICAgIDIzNDUxMDYsIDMyNDUxMDYsIDI0MzUxMDYsIDQyMzUxMDYsIDM0MjUxMDYsIDQzMjUxMDYsIDIzNTQxMDYsIDMyNTQxMDYsIDI1MzQxMDYsIDUyMzQxMDYsIDM1MjQxMDYsIDUzMjQxMDYsCisgICAgICAgIDI0NTMxMDYsIDQyNTMxMDYsIDI1NDMxMDYsIDUyNDMxMDYsIDQ1MjMxMDYsIDU0MjMxMDYsIDM0NTIxMDYsIDQzNTIxMDYsIDM1NDIxMDYsIDUzNDIxMDYsIDQ1MzIxMDYsIDU0MzIxMDYsCisgICAgICAgIDEyMzQ2NSwgIDEwMjM0NjUsIDIxMzQ2NSwgIDIwMTM0NjUsIDEyMDM0NjUsIDIxMDM0NjUsIDEzMjQ2NSwgIDEwMzI0NjUsIDMxMjQ2NSwgIDMwMTI0NjUsIDEzMDI0NjUsIDMxMDI0NjUsCisgICAgICAgIDIzMTQ2NSwgIDIwMzE0NjUsIDMyMTQ2NSwgIDMwMjE0NjUsIDIzMDE0NjUsIDMyMDE0NjUsIDEyMzA0NjUsIDIxMzA0NjUsIDEzMjA0NjUsIDMxMjA0NjUsIDIzMTA0NjUsIDMyMTA0NjUsCisgICAgICAgIDEyNDM2NSwgIDEwMjQzNjUsIDIxNDM2NSwgIDIwMTQzNjUsIDEyMDQzNjUsIDIxMDQzNjUsIDE0MjM2NSwgIDEwNDIzNjUsIDQxMjM2NSwgIDQwMTIzNjUsIDE0MDIzNjUsIDQxMDIzNjUsCisgICAgICAgIDI0MTM2NSwgIDIwNDEzNjUsIDQyMTM2NSwgIDQwMjEzNjUsIDI0MDEzNjUsIDQyMDEzNjUsIDEyNDAzNjUsIDIxNDAzNjUsIDE0MjAzNjUsIDQxMjAzNjUsIDI0MTAzNjUsIDQyMTAzNjUsCisgICAgICAgIDEzNDI2NSwgIDEwMzQyNjUsIDMxNDI2NSwgIDMwMTQyNjUsIDEzMDQyNjUsIDMxMDQyNjUsIDE0MzI2NSwgIDEwNDMyNjUsIDQxMzI2NSwgIDQwMTMyNjUsIDE0MDMyNjUsIDQxMDMyNjUsCisgICAgICAgIDM0MTI2NSwgIDMwNDEyNjUsIDQzMTI2NSwgIDQwMzEyNjUsIDM0MDEyNjUsIDQzMDEyNjUsIDEzNDAyNjUsIDMxNDAyNjUsIDE0MzAyNjUsIDQxMzAyNjUsIDM0MTAyNjUsIDQzMTAyNjUsCisgICAgICAgIDIzNDE2NSwgIDIwMzQxNjUsIDMyNDE2NSwgIDMwMjQxNjUsIDIzMDQxNjUsIDMyMDQxNjUsIDI0MzE2NSwgIDIwNDMxNjUsIDQyMzE2NSwgIDQwMjMxNjUsIDI0MDMxNjUsIDQyMDMxNjUsCisgICAgICAgIDM0MjE2NSwgIDMwNDIxNjUsIDQzMjE2NSwgIDQwMzIxNjUsIDM0MDIxNjUsIDQzMDIxNjUsIDIzNDAxNjUsIDMyNDAxNjUsIDI0MzAxNjUsIDQyMzAxNjUsIDM0MjAxNjUsIDQzMjAxNjUsCisgICAgICAgIDEyMzQwNjUsIDIxMzQwNjUsIDEzMjQwNjUsIDMxMjQwNjUsIDIzMTQwNjUsIDMyMTQwNjUsIDEyNDMwNjUsIDIxNDMwNjUsIDE0MjMwNjUsIDQxMjMwNjUsIDI0MTMwNjUsIDQyMTMwNjUsCisgICAgICAgIDEzNDIwNjUsIDMxNDIwNjUsIDE0MzIwNjUsIDQxMzIwNjUsIDM0MTIwNjUsIDQzMTIwNjUsIDIzNDEwNjUsIDMyNDEwNjUsIDI0MzEwNjUsIDQyMzEwNjUsIDM0MjEwNjUsIDQzMjEwNjUsCisgICAgICAgIDEyMzY0NSwgIDEwMjM2NDUsIDIxMzY0NSwgIDIwMTM2NDUsIDEyMDM2NDUsIDIxMDM2NDUsIDEzMjY0NSwgIDEwMzI2NDUsIDMxMjY0NSwgIDMwMTI2NDUsIDEzMDI2NDUsIDMxMDI2NDUsCisgICAgICAgIDIzMTY0NSwgIDIwMzE2NDUsIDMyMTY0NSwgIDMwMjE2NDUsIDIzMDE2NDUsIDMyMDE2NDUsIDEyMzA2NDUsIDIxMzA2NDUsIDEzMjA2NDUsIDMxMjA2NDUsIDIzMTA2NDUsIDMyMTA2NDUsCisgICAgICAgIDEyNjM0NSwgIDEwMjYzNDUsIDIxNjM0NSwgIDIwMTYzNDUsIDEyMDYzNDUsIDIxMDYzNDUsIDE2MjM0NSwgIDEwNjIzNDUsIDYxMjM0NSwgIDYwMTIzNDUsIDE2MDIzNDUsIDYxMDIzNDUsCisgICAgICAgIDI2MTM0NSwgIDIwNjEzNDUsIDYyMTM0NSwgIDYwMjEzNDUsIDI2MDEzNDUsIDYyMDEzNDUsIDEyNjAzNDUsIDIxNjAzNDUsIDE2MjAzNDUsIDYxMjAzNDUsIDI2MTAzNDUsIDYyMTAzNDUsCisgICAgICAgIDEzNjI0NSwgIDEwMzYyNDUsIDMxNjI0NSwgIDMwMTYyNDUsIDEzMDYyNDUsIDMxMDYyNDUsIDE2MzI0NSwgIDEwNjMyNDUsIDYxMzI0NSwgIDYwMTMyNDUsIDE2MDMyNDUsIDYxMDMyNDUsCisgICAgICAgIDM2MTI0NSwgIDMwNjEyNDUsIDYzMTI0NSwgIDYwMzEyNDUsIDM2MDEyNDUsIDYzMDEyNDUsIDEzNjAyNDUsIDMxNjAyNDUsIDE2MzAyNDUsIDYxMzAyNDUsIDM2MTAyNDUsIDYzMTAyNDUsCisgICAgICAgIDIzNjE0NSwgIDIwMzYxNDUsIDMyNjE0NSwgIDMwMjYxNDUsIDIzMDYxNDUsIDMyMDYxNDUsIDI2MzE0NSwgIDIwNjMxNDUsIDYyMzE0NSwgIDYwMjMxNDUsIDI2MDMxNDUsIDYyMDMxNDUsCisgICAgICAgIDM2MjE0NSwgIDMwNjIxNDUsIDYzMjE0NSwgIDYwMzIxNDUsIDM2MDIxNDUsIDYzMDIxNDUsIDIzNjAxNDUsIDMyNjAxNDUsIDI2MzAxNDUsIDYyMzAxNDUsIDM2MjAxNDUsIDYzMjAxNDUsCisgICAgICAgIDEyMzYwNDUsIDIxMzYwNDUsIDEzMjYwNDUsIDMxMjYwNDUsIDIzMTYwNDUsIDMyMTYwNDUsIDEyNjMwNDUsIDIxNjMwNDUsIDE2MjMwNDUsIDYxMjMwNDUsIDI2MTMwNDUsIDYyMTMwNDUsCisgICAgICAgIDEzNjIwNDUsIDMxNjIwNDUsIDE2MzIwNDUsIDYxMzIwNDUsIDM2MTIwNDUsIDYzMTIwNDUsIDIzNjEwNDUsIDMyNjEwNDUsIDI2MzEwNDUsIDYyMzEwNDUsIDM2MjEwNDUsIDYzMjEwNDUsCisgICAgICAgIDEyNDYzNSwgIDEwMjQ2MzUsIDIxNDYzNSwgIDIwMTQ2MzUsIDEyMDQ2MzUsIDIxMDQ2MzUsIDE0MjYzNSwgIDEwNDI2MzUsIDQxMjYzNSwgIDQwMTI2MzUsIDE0MDI2MzUsIDQxMDI2MzUsCisgICAgICAgIDI0MTYzNSwgIDIwNDE2MzUsIDQyMTYzNSwgIDQwMjE2MzUsIDI0MDE2MzUsIDQyMDE2MzUsIDEyNDA2MzUsIDIxNDA2MzUsIDE0MjA2MzUsIDQxMjA2MzUsIDI0MTA2MzUsIDQyMTA2MzUsCisgICAgICAgIDEyNjQzNSwgIDEwMjY0MzUsIDIxNjQzNSwgIDIwMTY0MzUsIDEyMDY0MzUsIDIxMDY0MzUsIDE2MjQzNSwgIDEwNjI0MzUsIDYxMjQzNSwgIDYwMTI0MzUsIDE2MDI0MzUsIDYxMDI0MzUsCisgICAgICAgIDI2MTQzNSwgIDIwNjE0MzUsIDYyMTQzNSwgIDYwMjE0MzUsIDI2MDE0MzUsIDYyMDE0MzUsIDEyNjA0MzUsIDIxNjA0MzUsIDE2MjA0MzUsIDYxMjA0MzUsIDI2MTA0MzUsIDYyMTA0MzUsCisgICAgICAgIDE0NjIzNSwgIDEwNDYyMzUsIDQxNjIzNSwgIDQwMTYyMzUsIDE0MDYyMzUsIDQxMDYyMzUsIDE2NDIzNSwgIDEwNjQyMzUsIDYxNDIzNSwgIDYwMTQyMzUsIDE2MDQyMzUsIDYxMDQyMzUsCisgICAgICAgIDQ2MTIzNSwgIDQwNjEyMzUsIDY0MTIzNSwgIDYwNDEyMzUsIDQ2MDEyMzUsIDY0MDEyMzUsIDE0NjAyMzUsIDQxNjAyMzUsIDE2NDAyMzUsIDYxNDAyMzUsIDQ2MTAyMzUsIDY0MTAyMzUsCisgICAgICAgIDI0NjEzNSwgIDIwNDYxMzUsIDQyNjEzNSwgIDQwMjYxMzUsIDI0MDYxMzUsIDQyMDYxMzUsIDI2NDEzNSwgIDIwNjQxMzUsIDYyNDEzNSwgIDYwMjQxMzUsIDI2MDQxMzUsIDYyMDQxMzUsCisgICAgICAgIDQ2MjEzNSwgIDQwNjIxMzUsIDY0MjEzNSwgIDYwNDIxMzUsIDQ2MDIxMzUsIDY0MDIxMzUsIDI0NjAxMzUsIDQyNjAxMzUsIDI2NDAxMzUsIDYyNDAxMzUsIDQ2MjAxMzUsIDY0MjAxMzUsCisgICAgICAgIDEyNDYwMzUsIDIxNDYwMzUsIDE0MjYwMzUsIDQxMjYwMzUsIDI0MTYwMzUsIDQyMTYwMzUsIDEyNjQwMzUsIDIxNjQwMzUsIDE2MjQwMzUsIDYxMjQwMzUsIDI2MTQwMzUsIDYyMTQwMzUsCisgICAgICAgIDE0NjIwMzUsIDQxNjIwMzUsIDE2NDIwMzUsIDYxNDIwMzUsIDQ2MTIwMzUsIDY0MTIwMzUsIDI0NjEwMzUsIDQyNjEwMzUsIDI2NDEwMzUsIDYyNDEwMzUsIDQ2MjEwMzUsIDY0MjEwMzUsCisgICAgICAgIDEzNDYyNSwgIDEwMzQ2MjUsIDMxNDYyNSwgIDMwMTQ2MjUsIDEzMDQ2MjUsIDMxMDQ2MjUsIDE0MzYyNSwgIDEwNDM2MjUsIDQxMzYyNSwgIDQwMTM2MjUsIDE0MDM2MjUsIDQxMDM2MjUsCisgICAgICAgIDM0MTYyNSwgIDMwNDE2MjUsIDQzMTYyNSwgIDQwMzE2MjUsIDM0MDE2MjUsIDQzMDE2MjUsIDEzNDA2MjUsIDMxNDA2MjUsIDE0MzA2MjUsIDQxMzA2MjUsIDM0MTA2MjUsIDQzMTA2MjUsCisgICAgICAgIDEzNjQyNSwgIDEwMzY0MjUsIDMxNjQyNSwgIDMwMTY0MjUsIDEzMDY0MjUsIDMxMDY0MjUsIDE2MzQyNSwgIDEwNjM0MjUsIDYxMzQyNSwgIDYwMTM0MjUsIDE2MDM0MjUsIDYxMDM0MjUsCisgICAgICAgIDM2MTQyNSwgIDMwNjE0MjUsIDYzMTQyNSwgIDYwMzE0MjUsIDM2MDE0MjUsIDYzMDE0MjUsIDEzNjA0MjUsIDMxNjA0MjUsIDE2MzA0MjUsIDYxMzA0MjUsIDM2MTA0MjUsIDYzMTA0MjUsCisgICAgICAgIDE0NjMyNSwgIDEwNDYzMjUsIDQxNjMyNSwgIDQwMTYzMjUsIDE0MDYzMjUsIDQxMDYzMjUsIDE2NDMyNSwgIDEwNjQzMjUsIDYxNDMyNSwgIDYwMTQzMjUsIDE2MDQzMjUsIDYxMDQzMjUsCisgICAgICAgIDQ2MTMyNSwgIDQwNjEzMjUsIDY0MTMyNSwgIDYwNDEzMjUsIDQ2MDEzMjUsIDY0MDEzMjUsIDE0NjAzMjUsIDQxNjAzMjUsIDE2NDAzMjUsIDYxNDAzMjUsIDQ2MTAzMjUsIDY0MTAzMjUsCisgICAgICAgIDM0NjEyNSwgIDMwNDYxMjUsIDQzNjEyNSwgIDQwMzYxMjUsIDM0MDYxMjUsIDQzMDYxMjUsIDM2NDEyNSwgIDMwNjQxMjUsIDYzNDEyNSwgIDYwMzQxMjUsIDM2MDQxMjUsIDYzMDQxMjUsCisgICAgICAgIDQ2MzEyNSwgIDQwNjMxMjUsIDY0MzEyNSwgIDYwNDMxMjUsIDQ2MDMxMjUsIDY0MDMxMjUsIDM0NjAxMjUsIDQzNjAxMjUsIDM2NDAxMjUsIDYzNDAxMjUsIDQ2MzAxMjUsIDY0MzAxMjUsCisgICAgICAgIDEzNDYwMjUsIDMxNDYwMjUsIDE0MzYwMjUsIDQxMzYwMjUsIDM0MTYwMjUsIDQzMTYwMjUsIDEzNjQwMjUsIDMxNjQwMjUsIDE2MzQwMjUsIDYxMzQwMjUsIDM2MTQwMjUsIDYzMTQwMjUsCisgICAgICAgIDE0NjMwMjUsIDQxNjMwMjUsIDE2NDMwMjUsIDYxNDMwMjUsIDQ2MTMwMjUsIDY0MTMwMjUsIDM0NjEwMjUsIDQzNjEwMjUsIDM2NDEwMjUsIDYzNDEwMjUsIDQ2MzEwMjUsIDY0MzEwMjUsCisgICAgICAgIDIzNDYxNSwgIDIwMzQ2MTUsIDMyNDYxNSwgIDMwMjQ2MTUsIDIzMDQ2MTUsIDMyMDQ2MTUsIDI0MzYxNSwgIDIwNDM2MTUsIDQyMzYxNSwgIDQwMjM2MTUsIDI0MDM2MTUsIDQyMDM2MTUsCisgICAgICAgIDM0MjYxNSwgIDMwNDI2MTUsIDQzMjYxNSwgIDQwMzI2MTUsIDM0MDI2MTUsIDQzMDI2MTUsIDIzNDA2MTUsIDMyNDA2MTUsIDI0MzA2MTUsIDQyMzA2MTUsIDM0MjA2MTUsIDQzMjA2MTUsCisgICAgICAgIDIzNjQxNSwgIDIwMzY0MTUsIDMyNjQxNSwgIDMwMjY0MTUsIDIzMDY0MTUsIDMyMDY0MTUsIDI2MzQxNSwgIDIwNjM0MTUsIDYyMzQxNSwgIDYwMjM0MTUsIDI2MDM0MTUsIDYyMDM0MTUsCisgICAgICAgIDM2MjQxNSwgIDMwNjI0MTUsIDYzMjQxNSwgIDYwMzI0MTUsIDM2MDI0MTUsIDYzMDI0MTUsIDIzNjA0MTUsIDMyNjA0MTUsIDI2MzA0MTUsIDYyMzA0MTUsIDM2MjA0MTUsIDYzMjA0MTUsCisgICAgICAgIDI0NjMxNSwgIDIwNDYzMTUsIDQyNjMxNSwgIDQwMjYzMTUsIDI0MDYzMTUsIDQyMDYzMTUsIDI2NDMxNSwgIDIwNjQzMTUsIDYyNDMxNSwgIDYwMjQzMTUsIDI2MDQzMTUsIDYyMDQzMTUsCisgICAgICAgIDQ2MjMxNSwgIDQwNjIzMTUsIDY0MjMxNSwgIDYwNDIzMTUsIDQ2MDIzMTUsIDY0MDIzMTUsIDI0NjAzMTUsIDQyNjAzMTUsIDI2NDAzMTUsIDYyNDAzMTUsIDQ2MjAzMTUsIDY0MjAzMTUsCisgICAgICAgIDM0NjIxNSwgIDMwNDYyMTUsIDQzNjIxNSwgIDQwMzYyMTUsIDM0MDYyMTUsIDQzMDYyMTUsIDM2NDIxNSwgIDMwNjQyMTUsIDYzNDIxNSwgIDYwMzQyMTUsIDM2MDQyMTUsIDYzMDQyMTUsCisgICAgICAgIDQ2MzIxNSwgIDQwNjMyMTUsIDY0MzIxNSwgIDYwNDMyMTUsIDQ2MDMyMTUsIDY0MDMyMTUsIDM0NjAyMTUsIDQzNjAyMTUsIDM2NDAyMTUsIDYzNDAyMTUsIDQ2MzAyMTUsIDY0MzAyMTUsCisgICAgICAgIDIzNDYwMTUsIDMyNDYwMTUsIDI0MzYwMTUsIDQyMzYwMTUsIDM0MjYwMTUsIDQzMjYwMTUsIDIzNjQwMTUsIDMyNjQwMTUsIDI2MzQwMTUsIDYyMzQwMTUsIDM2MjQwMTUsIDYzMjQwMTUsCisgICAgICAgIDI0NjMwMTUsIDQyNjMwMTUsIDI2NDMwMTUsIDYyNDMwMTUsIDQ2MjMwMTUsIDY0MjMwMTUsIDM0NjIwMTUsIDQzNjIwMTUsIDM2NDIwMTUsIDYzNDIwMTUsIDQ2MzIwMTUsIDY0MzIwMTUsCisgICAgICAgIDEyMzQ2MDUsIDIxMzQ2MDUsIDEzMjQ2MDUsIDMxMjQ2MDUsIDIzMTQ2MDUsIDMyMTQ2MDUsIDEyNDM2MDUsIDIxNDM2MDUsIDE0MjM2MDUsIDQxMjM2MDUsIDI0MTM2MDUsIDQyMTM2MDUsCisgICAgICAgIDEzNDI2MDUsIDMxNDI2MDUsIDE0MzI2MDUsIDQxMzI2MDUsIDM0MTI2MDUsIDQzMTI2MDUsIDIzNDE2MDUsIDMyNDE2MDUsIDI0MzE2MDUsIDQyMzE2MDUsIDM0MjE2MDUsIDQzMjE2MDUsCisgICAgICAgIDEyMzY0MDUsIDIxMzY0MDUsIDEzMjY0MDUsIDMxMjY0MDUsIDIzMTY0MDUsIDMyMTY0MDUsIDEyNjM0MDUsIDIxNjM0MDUsIDE2MjM0MDUsIDYxMjM0MDUsIDI2MTM0MDUsIDYyMTM0MDUsCisgICAgICAgIDEzNjI0MDUsIDMxNjI0MDUsIDE2MzI0MDUsIDYxMzI0MDUsIDM2MTI0MDUsIDYzMTI0MDUsIDIzNjE0MDUsIDMyNjE0MDUsIDI2MzE0MDUsIDYyMzE0MDUsIDM2MjE0MDUsIDYzMjE0MDUsCisgICAgICAgIDEyNDYzMDUsIDIxNDYzMDUsIDE0MjYzMDUsIDQxMjYzMDUsIDI0MTYzMDUsIDQyMTYzMDUsIDEyNjQzMDUsIDIxNjQzMDUsIDE2MjQzMDUsIDYxMjQzMDUsIDI2MTQzMDUsIDYyMTQzMDUsCisgICAgICAgIDE0NjIzMDUsIDQxNjIzMDUsIDE2NDIzMDUsIDYxNDIzMDUsIDQ2MTIzMDUsIDY0MTIzMDUsIDI0NjEzMDUsIDQyNjEzMDUsIDI2NDEzMDUsIDYyNDEzMDUsIDQ2MjEzMDUsIDY0MjEzMDUsCisgICAgICAgIDEzNDYyMDUsIDMxNDYyMDUsIDE0MzYyMDUsIDQxMzYyMDUsIDM0MTYyMDUsIDQzMTYyMDUsIDEzNjQyMDUsIDMxNjQyMDUsIDE2MzQyMDUsIDYxMzQyMDUsIDM2MTQyMDUsIDYzMTQyMDUsCisgICAgICAgIDE0NjMyMDUsIDQxNjMyMDUsIDE2NDMyMDUsIDYxNDMyMDUsIDQ2MTMyMDUsIDY0MTMyMDUsIDM0NjEyMDUsIDQzNjEyMDUsIDM2NDEyMDUsIDYzNDEyMDUsIDQ2MzEyMDUsIDY0MzEyMDUsCisgICAgICAgIDIzNDYxMDUsIDMyNDYxMDUsIDI0MzYxMDUsIDQyMzYxMDUsIDM0MjYxMDUsIDQzMjYxMDUsIDIzNjQxMDUsIDMyNjQxMDUsIDI2MzQxMDUsIDYyMzQxMDUsIDM2MjQxMDUsIDYzMjQxMDUsCisgICAgICAgIDI0NjMxMDUsIDQyNjMxMDUsIDI2NDMxMDUsIDYyNDMxMDUsIDQ2MjMxMDUsIDY0MjMxMDUsIDM0NjIxMDUsIDQzNjIxMDUsIDM2NDIxMDUsIDYzNDIxMDUsIDQ2MzIxMDUsIDY0MzIxMDUsCisgICAgICAgIDEyMzU2NCwgIDEwMjM1NjQsIDIxMzU2NCwgIDIwMTM1NjQsIDEyMDM1NjQsIDIxMDM1NjQsIDEzMjU2NCwgIDEwMzI1NjQsIDMxMjU2NCwgIDMwMTI1NjQsIDEzMDI1NjQsIDMxMDI1NjQsCisgICAgICAgIDIzMTU2NCwgIDIwMzE1NjQsIDMyMTU2NCwgIDMwMjE1NjQsIDIzMDE1NjQsIDMyMDE1NjQsIDEyMzA1NjQsIDIxMzA1NjQsIDEzMjA1NjQsIDMxMjA1NjQsIDIzMTA1NjQsIDMyMTA1NjQsCisgICAgICAgIDEyNTM2NCwgIDEwMjUzNjQsIDIxNTM2NCwgIDIwMTUzNjQsIDEyMDUzNjQsIDIxMDUzNjQsIDE1MjM2NCwgIDEwNTIzNjQsIDUxMjM2NCwgIDUwMTIzNjQsIDE1MDIzNjQsIDUxMDIzNjQsCisgICAgICAgIDI1MTM2NCwgIDIwNTEzNjQsIDUyMTM2NCwgIDUwMjEzNjQsIDI1MDEzNjQsIDUyMDEzNjQsIDEyNTAzNjQsIDIxNTAzNjQsIDE1MjAzNjQsIDUxMjAzNjQsIDI1MTAzNjQsIDUyMTAzNjQsCisgICAgICAgIDEzNTI2NCwgIDEwMzUyNjQsIDMxNTI2NCwgIDMwMTUyNjQsIDEzMDUyNjQsIDMxMDUyNjQsIDE1MzI2NCwgIDEwNTMyNjQsIDUxMzI2NCwgIDUwMTMyNjQsIDE1MDMyNjQsIDUxMDMyNjQsCisgICAgICAgIDM1MTI2NCwgIDMwNTEyNjQsIDUzMTI2NCwgIDUwMzEyNjQsIDM1MDEyNjQsIDUzMDEyNjQsIDEzNTAyNjQsIDMxNTAyNjQsIDE1MzAyNjQsIDUxMzAyNjQsIDM1MTAyNjQsIDUzMTAyNjQsCisgICAgICAgIDIzNTE2NCwgIDIwMzUxNjQsIDMyNTE2NCwgIDMwMjUxNjQsIDIzMDUxNjQsIDMyMDUxNjQsIDI1MzE2NCwgIDIwNTMxNjQsIDUyMzE2NCwgIDUwMjMxNjQsIDI1MDMxNjQsIDUyMDMxNjQsCisgICAgICAgIDM1MjE2NCwgIDMwNTIxNjQsIDUzMjE2NCwgIDUwMzIxNjQsIDM1MDIxNjQsIDUzMDIxNjQsIDIzNTAxNjQsIDMyNTAxNjQsIDI1MzAxNjQsIDUyMzAxNjQsIDM1MjAxNjQsIDUzMjAxNjQsCisgICAgICAgIDEyMzUwNjQsIDIxMzUwNjQsIDEzMjUwNjQsIDMxMjUwNjQsIDIzMTUwNjQsIDMyMTUwNjQsIDEyNTMwNjQsIDIxNTMwNjQsIDE1MjMwNjQsIDUxMjMwNjQsIDI1MTMwNjQsIDUyMTMwNjQsCisgICAgICAgIDEzNTIwNjQsIDMxNTIwNjQsIDE1MzIwNjQsIDUxMzIwNjQsIDM1MTIwNjQsIDUzMTIwNjQsIDIzNTEwNjQsIDMyNTEwNjQsIDI1MzEwNjQsIDUyMzEwNjQsIDM1MjEwNjQsIDUzMjEwNjQsCisgICAgICAgIDEyMzY1NCwgIDEwMjM2NTQsIDIxMzY1NCwgIDIwMTM2NTQsIDEyMDM2NTQsIDIxMDM2NTQsIDEzMjY1NCwgIDEwMzI2NTQsIDMxMjY1NCwgIDMwMTI2NTQsIDEzMDI2NTQsIDMxMDI2NTQsCisgICAgICAgIDIzMTY1NCwgIDIwMzE2NTQsIDMyMTY1NCwgIDMwMjE2NTQsIDIzMDE2NTQsIDMyMDE2NTQsIDEyMzA2NTQsIDIxMzA2NTQsIDEzMjA2NTQsIDMxMjA2NTQsIDIzMTA2NTQsIDMyMTA2NTQsCisgICAgICAgIDEyNjM1NCwgIDEwMjYzNTQsIDIxNjM1NCwgIDIwMTYzNTQsIDEyMDYzNTQsIDIxMDYzNTQsIDE2MjM1NCwgIDEwNjIzNTQsIDYxMjM1NCwgIDYwMTIzNTQsIDE2MDIzNTQsIDYxMDIzNTQsCisgICAgICAgIDI2MTM1NCwgIDIwNjEzNTQsIDYyMTM1NCwgIDYwMjEzNTQsIDI2MDEzNTQsIDYyMDEzNTQsIDEyNjAzNTQsIDIxNjAzNTQsIDE2MjAzNTQsIDYxMjAzNTQsIDI2MTAzNTQsIDYyMTAzNTQsCisgICAgICAgIDEzNjI1NCwgIDEwMzYyNTQsIDMxNjI1NCwgIDMwMTYyNTQsIDEzMDYyNTQsIDMxMDYyNTQsIDE2MzI1NCwgIDEwNjMyNTQsIDYxMzI1NCwgIDYwMTMyNTQsIDE2MDMyNTQsIDYxMDMyNTQsCisgICAgICAgIDM2MTI1NCwgIDMwNjEyNTQsIDYzMTI1NCwgIDYwMzEyNTQsIDM2MDEyNTQsIDYzMDEyNTQsIDEzNjAyNTQsIDMxNjAyNTQsIDE2MzAyNTQsIDYxMzAyNTQsIDM2MTAyNTQsIDYzMTAyNTQsCisgICAgICAgIDIzNjE1NCwgIDIwMzYxNTQsIDMyNjE1NCwgIDMwMjYxNTQsIDIzMDYxNTQsIDMyMDYxNTQsIDI2MzE1NCwgIDIwNjMxNTQsIDYyMzE1NCwgIDYwMjMxNTQsIDI2MDMxNTQsIDYyMDMxNTQsCisgICAgICAgIDM2MjE1NCwgIDMwNjIxNTQsIDYzMjE1NCwgIDYwMzIxNTQsIDM2MDIxNTQsIDYzMDIxNTQsIDIzNjAxNTQsIDMyNjAxNTQsIDI2MzAxNTQsIDYyMzAxNTQsIDM2MjAxNTQsIDYzMjAxNTQsCisgICAgICAgIDEyMzYwNTQsIDIxMzYwNTQsIDEzMjYwNTQsIDMxMjYwNTQsIDIzMTYwNTQsIDMyMTYwNTQsIDEyNjMwNTQsIDIxNjMwNTQsIDE2MjMwNTQsIDYxMjMwNTQsIDI2MTMwNTQsIDYyMTMwNTQsCisgICAgICAgIDEzNjIwNTQsIDMxNjIwNTQsIDE2MzIwNTQsIDYxMzIwNTQsIDM2MTIwNTQsIDYzMTIwNTQsIDIzNjEwNTQsIDMyNjEwNTQsIDI2MzEwNTQsIDYyMzEwNTQsIDM2MjEwNTQsIDYzMjEwNTQsCisgICAgICAgIDEyNTYzNCwgIDEwMjU2MzQsIDIxNTYzNCwgIDIwMTU2MzQsIDEyMDU2MzQsIDIxMDU2MzQsIDE1MjYzNCwgIDEwNTI2MzQsIDUxMjYzNCwgIDUwMTI2MzQsIDE1MDI2MzQsIDUxMDI2MzQsCisgICAgICAgIDI1MTYzNCwgIDIwNTE2MzQsIDUyMTYzNCwgIDUwMjE2MzQsIDI1MDE2MzQsIDUyMDE2MzQsIDEyNTA2MzQsIDIxNTA2MzQsIDE1MjA2MzQsIDUxMjA2MzQsIDI1MTA2MzQsIDUyMTA2MzQsCisgICAgICAgIDEyNjUzNCwgIDEwMjY1MzQsIDIxNjUzNCwgIDIwMTY1MzQsIDEyMDY1MzQsIDIxMDY1MzQsIDE2MjUzNCwgIDEwNjI1MzQsIDYxMjUzNCwgIDYwMTI1MzQsIDE2MDI1MzQsIDYxMDI1MzQsCisgICAgICAgIDI2MTUzNCwgIDIwNjE1MzQsIDYyMTUzNCwgIDYwMjE1MzQsIDI2MDE1MzQsIDYyMDE1MzQsIDEyNjA1MzQsIDIxNjA1MzQsIDE2MjA1MzQsIDYxMjA1MzQsIDI2MTA1MzQsIDYyMTA1MzQsCisgICAgICAgIDE1NjIzNCwgIDEwNTYyMzQsIDUxNjIzNCwgIDUwMTYyMzQsIDE1MDYyMzQsIDUxMDYyMzQsIDE2NTIzNCwgIDEwNjUyMzQsIDYxNTIzNCwgIDYwMTUyMzQsIDE2MDUyMzQsIDYxMDUyMzQsCisgICAgICAgIDU2MTIzNCwgIDUwNjEyMzQsIDY1MTIzNCwgIDYwNTEyMzQsIDU2MDEyMzQsIDY1MDEyMzQsIDE1NjAyMzQsIDUxNjAyMzQsIDE2NTAyMzQsIDYxNTAyMzQsIDU2MTAyMzQsIDY1MTAyMzQsCisgICAgICAgIDI1NjEzNCwgIDIwNTYxMzQsIDUyNjEzNCwgIDUwMjYxMzQsIDI1MDYxMzQsIDUyMDYxMzQsIDI2NTEzNCwgIDIwNjUxMzQsIDYyNTEzNCwgIDYwMjUxMzQsIDI2MDUxMzQsIDYyMDUxMzQsCisgICAgICAgIDU2MjEzNCwgIDUwNjIxMzQsIDY1MjEzNCwgIDYwNTIxMzQsIDU2MDIxMzQsIDY1MDIxMzQsIDI1NjAxMzQsIDUyNjAxMzQsIDI2NTAxMzQsIDYyNTAxMzQsIDU2MjAxMzQsIDY1MjAxMzQsCisgICAgICAgIDEyNTYwMzQsIDIxNTYwMzQsIDE1MjYwMzQsIDUxMjYwMzQsIDI1MTYwMzQsIDUyMTYwMzQsIDEyNjUwMzQsIDIxNjUwMzQsIDE2MjUwMzQsIDYxMjUwMzQsIDI2MTUwMzQsIDYyMTUwMzQsCisgICAgICAgIDE1NjIwMzQsIDUxNjIwMzQsIDE2NTIwMzQsIDYxNTIwMzQsIDU2MTIwMzQsIDY1MTIwMzQsIDI1NjEwMzQsIDUyNjEwMzQsIDI2NTEwMzQsIDYyNTEwMzQsIDU2MjEwMzQsIDY1MjEwMzQsCisgICAgICAgIDEzNTYyNCwgIDEwMzU2MjQsIDMxNTYyNCwgIDMwMTU2MjQsIDEzMDU2MjQsIDMxMDU2MjQsIDE1MzYyNCwgIDEwNTM2MjQsIDUxMzYyNCwgIDUwMTM2MjQsIDE1MDM2MjQsIDUxMDM2MjQsCisgICAgICAgIDM1MTYyNCwgIDMwNTE2MjQsIDUzMTYyNCwgIDUwMzE2MjQsIDM1MDE2MjQsIDUzMDE2MjQsIDEzNTA2MjQsIDMxNTA2MjQsIDE1MzA2MjQsIDUxMzA2MjQsIDM1MTA2MjQsIDUzMTA2MjQsCisgICAgICAgIDEzNjUyNCwgIDEwMzY1MjQsIDMxNjUyNCwgIDMwMTY1MjQsIDEzMDY1MjQsIDMxMDY1MjQsIDE2MzUyNCwgIDEwNjM1MjQsIDYxMzUyNCwgIDYwMTM1MjQsIDE2MDM1MjQsIDYxMDM1MjQsCisgICAgICAgIDM2MTUyNCwgIDMwNjE1MjQsIDYzMTUyNCwgIDYwMzE1MjQsIDM2MDE1MjQsIDYzMDE1MjQsIDEzNjA1MjQsIDMxNjA1MjQsIDE2MzA1MjQsIDYxMzA1MjQsIDM2MTA1MjQsIDYzMTA1MjQsCisgICAgICAgIDE1NjMyNCwgIDEwNTYzMjQsIDUxNjMyNCwgIDUwMTYzMjQsIDE1MDYzMjQsIDUxMDYzMjQsIDE2NTMyNCwgIDEwNjUzMjQsIDYxNTMyNCwgIDYwMTUzMjQsIDE2MDUzMjQsIDYxMDUzMjQsCisgICAgICAgIDU2MTMyNCwgIDUwNjEzMjQsIDY1MTMyNCwgIDYwNTEzMjQsIDU2MDEzMjQsIDY1MDEzMjQsIDE1NjAzMjQsIDUxNjAzMjQsIDE2NTAzMjQsIDYxNTAzMjQsIDU2MTAzMjQsIDY1MTAzMjQsCisgICAgICAgIDM1NjEyNCwgIDMwNTYxMjQsIDUzNjEyNCwgIDUwMzYxMjQsIDM1MDYxMjQsIDUzMDYxMjQsIDM2NTEyNCwgIDMwNjUxMjQsIDYzNTEyNCwgIDYwMzUxMjQsIDM2MDUxMjQsIDYzMDUxMjQsCisgICAgICAgIDU2MzEyNCwgIDUwNjMxMjQsIDY1MzEyNCwgIDYwNTMxMjQsIDU2MDMxMjQsIDY1MDMxMjQsIDM1NjAxMjQsIDUzNjAxMjQsIDM2NTAxMjQsIDYzNTAxMjQsIDU2MzAxMjQsIDY1MzAxMjQsCisgICAgICAgIDEzNTYwMjQsIDMxNTYwMjQsIDE1MzYwMjQsIDUxMzYwMjQsIDM1MTYwMjQsIDUzMTYwMjQsIDEzNjUwMjQsIDMxNjUwMjQsIDE2MzUwMjQsIDYxMzUwMjQsIDM2MTUwMjQsIDYzMTUwMjQsCisgICAgICAgIDE1NjMwMjQsIDUxNjMwMjQsIDE2NTMwMjQsIDYxNTMwMjQsIDU2MTMwMjQsIDY1MTMwMjQsIDM1NjEwMjQsIDUzNjEwMjQsIDM2NTEwMjQsIDYzNTEwMjQsIDU2MzEwMjQsIDY1MzEwMjQsCisgICAgICAgIDIzNTYxNCwgIDIwMzU2MTQsIDMyNTYxNCwgIDMwMjU2MTQsIDIzMDU2MTQsIDMyMDU2MTQsIDI1MzYxNCwgIDIwNTM2MTQsIDUyMzYxNCwgIDUwMjM2MTQsIDI1MDM2MTQsIDUyMDM2MTQsCisgICAgICAgIDM1MjYxNCwgIDMwNTI2MTQsIDUzMjYxNCwgIDUwMzI2MTQsIDM1MDI2MTQsIDUzMDI2MTQsIDIzNTA2MTQsIDMyNTA2MTQsIDI1MzA2MTQsIDUyMzA2MTQsIDM1MjA2MTQsIDUzMjA2MTQsCisgICAgICAgIDIzNjUxNCwgIDIwMzY1MTQsIDMyNjUxNCwgIDMwMjY1MTQsIDIzMDY1MTQsIDMyMDY1MTQsIDI2MzUxNCwgIDIwNjM1MTQsIDYyMzUxNCwgIDYwMjM1MTQsIDI2MDM1MTQsIDYyMDM1MTQsCisgICAgICAgIDM2MjUxNCwgIDMwNjI1MTQsIDYzMjUxNCwgIDYwMzI1MTQsIDM2MDI1MTQsIDYzMDI1MTQsIDIzNjA1MTQsIDMyNjA1MTQsIDI2MzA1MTQsIDYyMzA1MTQsIDM2MjA1MTQsIDYzMjA1MTQsCisgICAgICAgIDI1NjMxNCwgIDIwNTYzMTQsIDUyNjMxNCwgIDUwMjYzMTQsIDI1MDYzMTQsIDUyMDYzMTQsIDI2NTMxNCwgIDIwNjUzMTQsIDYyNTMxNCwgIDYwMjUzMTQsIDI2MDUzMTQsIDYyMDUzMTQsCisgICAgICAgIDU2MjMxNCwgIDUwNjIzMTQsIDY1MjMxNCwgIDYwNTIzMTQsIDU2MDIzMTQsIDY1MDIzMTQsIDI1NjAzMTQsIDUyNjAzMTQsIDI2NTAzMTQsIDYyNTAzMTQsIDU2MjAzMTQsIDY1MjAzMTQsCisgICAgICAgIDM1NjIxNCwgIDMwNTYyMTQsIDUzNjIxNCwgIDUwMzYyMTQsIDM1MDYyMTQsIDUzMDYyMTQsIDM2NTIxNCwgIDMwNjUyMTQsIDYzNTIxNCwgIDYwMzUyMTQsIDM2MDUyMTQsIDYzMDUyMTQsCisgICAgICAgIDU2MzIxNCwgIDUwNjMyMTQsIDY1MzIxNCwgIDYwNTMyMTQsIDU2MDMyMTQsIDY1MDMyMTQsIDM1NjAyMTQsIDUzNjAyMTQsIDM2NTAyMTQsIDYzNTAyMTQsIDU2MzAyMTQsIDY1MzAyMTQsCisgICAgICAgIDIzNTYwMTQsIDMyNTYwMTQsIDI1MzYwMTQsIDUyMzYwMTQsIDM1MjYwMTQsIDUzMjYwMTQsIDIzNjUwMTQsIDMyNjUwMTQsIDI2MzUwMTQsIDYyMzUwMTQsIDM2MjUwMTQsIDYzMjUwMTQsCisgICAgICAgIDI1NjMwMTQsIDUyNjMwMTQsIDI2NTMwMTQsIDYyNTMwMTQsIDU2MjMwMTQsIDY1MjMwMTQsIDM1NjIwMTQsIDUzNjIwMTQsIDM2NTIwMTQsIDYzNTIwMTQsIDU2MzIwMTQsIDY1MzIwMTQsCisgICAgICAgIDEyMzU2MDQsIDIxMzU2MDQsIDEzMjU2MDQsIDMxMjU2MDQsIDIzMTU2MDQsIDMyMTU2MDQsIDEyNTM2MDQsIDIxNTM2MDQsIDE1MjM2MDQsIDUxMjM2MDQsIDI1MTM2MDQsIDUyMTM2MDQsCisgICAgICAgIDEzNTI2MDQsIDMxNTI2MDQsIDE1MzI2MDQsIDUxMzI2MDQsIDM1MTI2MDQsIDUzMTI2MDQsIDIzNTE2MDQsIDMyNTE2MDQsIDI1MzE2MDQsIDUyMzE2MDQsIDM1MjE2MDQsIDUzMjE2MDQsCisgICAgICAgIDEyMzY1MDQsIDIxMzY1MDQsIDEzMjY1MDQsIDMxMjY1MDQsIDIzMTY1MDQsIDMyMTY1MDQsIDEyNjM1MDQsIDIxNjM1MDQsIDE2MjM1MDQsIDYxMjM1MDQsIDI2MTM1MDQsIDYyMTM1MDQsCisgICAgICAgIDEzNjI1MDQsIDMxNjI1MDQsIDE2MzI1MDQsIDYxMzI1MDQsIDM2MTI1MDQsIDYzMTI1MDQsIDIzNjE1MDQsIDMyNjE1MDQsIDI2MzE1MDQsIDYyMzE1MDQsIDM2MjE1MDQsIDYzMjE1MDQsCisgICAgICAgIDEyNTYzMDQsIDIxNTYzMDQsIDE1MjYzMDQsIDUxMjYzMDQsIDI1MTYzMDQsIDUyMTYzMDQsIDEyNjUzMDQsIDIxNjUzMDQsIDE2MjUzMDQsIDYxMjUzMDQsIDI2MTUzMDQsIDYyMTUzMDQsCisgICAgICAgIDE1NjIzMDQsIDUxNjIzMDQsIDE2NTIzMDQsIDYxNTIzMDQsIDU2MTIzMDQsIDY1MTIzMDQsIDI1NjEzMDQsIDUyNjEzMDQsIDI2NTEzMDQsIDYyNTEzMDQsIDU2MjEzMDQsIDY1MjEzMDQsCisgICAgICAgIDEzNTYyMDQsIDMxNTYyMDQsIDE1MzYyMDQsIDUxMzYyMDQsIDM1MTYyMDQsIDUzMTYyMDQsIDEzNjUyMDQsIDMxNjUyMDQsIDE2MzUyMDQsIDYxMzUyMDQsIDM2MTUyMDQsIDYzMTUyMDQsCisgICAgICAgIDE1NjMyMDQsIDUxNjMyMDQsIDE2NTMyMDQsIDYxNTMyMDQsIDU2MTMyMDQsIDY1MTMyMDQsIDM1NjEyMDQsIDUzNjEyMDQsIDM2NTEyMDQsIDYzNTEyMDQsIDU2MzEyMDQsIDY1MzEyMDQsCisgICAgICAgIDIzNTYxMDQsIDMyNTYxMDQsIDI1MzYxMDQsIDUyMzYxMDQsIDM1MjYxMDQsIDUzMjYxMDQsIDIzNjUxMDQsIDMyNjUxMDQsIDI2MzUxMDQsIDYyMzUxMDQsIDM2MjUxMDQsIDYzMjUxMDQsCisgICAgICAgIDI1NjMxMDQsIDUyNjMxMDQsIDI2NTMxMDQsIDYyNTMxMDQsIDU2MjMxMDQsIDY1MjMxMDQsIDM1NjIxMDQsIDUzNjIxMDQsIDM2NTIxMDQsIDYzNTIxMDQsIDU2MzIxMDQsIDY1MzIxMDQsCisgICAgICAgIDEyNDU2MywgIDEwMjQ1NjMsIDIxNDU2MywgIDIwMTQ1NjMsIDEyMDQ1NjMsIDIxMDQ1NjMsIDE0MjU2MywgIDEwNDI1NjMsIDQxMjU2MywgIDQwMTI1NjMsIDE0MDI1NjMsIDQxMDI1NjMsCisgICAgICAgIDI0MTU2MywgIDIwNDE1NjMsIDQyMTU2MywgIDQwMjE1NjMsIDI0MDE1NjMsIDQyMDE1NjMsIDEyNDA1NjMsIDIxNDA1NjMsIDE0MjA1NjMsIDQxMjA1NjMsIDI0MTA1NjMsIDQyMTA1NjMsCisgICAgICAgIDEyNTQ2MywgIDEwMjU0NjMsIDIxNTQ2MywgIDIwMTU0NjMsIDEyMDU0NjMsIDIxMDU0NjMsIDE1MjQ2MywgIDEwNTI0NjMsIDUxMjQ2MywgIDUwMTI0NjMsIDE1MDI0NjMsIDUxMDI0NjMsCisgICAgICAgIDI1MTQ2MywgIDIwNTE0NjMsIDUyMTQ2MywgIDUwMjE0NjMsIDI1MDE0NjMsIDUyMDE0NjMsIDEyNTA0NjMsIDIxNTA0NjMsIDE1MjA0NjMsIDUxMjA0NjMsIDI1MTA0NjMsIDUyMTA0NjMsCisgICAgICAgIDE0NTI2MywgIDEwNDUyNjMsIDQxNTI2MywgIDQwMTUyNjMsIDE0MDUyNjMsIDQxMDUyNjMsIDE1NDI2MywgIDEwNTQyNjMsIDUxNDI2MywgIDUwMTQyNjMsIDE1MDQyNjMsIDUxMDQyNjMsCisgICAgICAgIDQ1MTI2MywgIDQwNTEyNjMsIDU0MTI2MywgIDUwNDEyNjMsIDQ1MDEyNjMsIDU0MDEyNjMsIDE0NTAyNjMsIDQxNTAyNjMsIDE1NDAyNjMsIDUxNDAyNjMsIDQ1MTAyNjMsIDU0MTAyNjMsCisgICAgICAgIDI0NTE2MywgIDIwNDUxNjMsIDQyNTE2MywgIDQwMjUxNjMsIDI0MDUxNjMsIDQyMDUxNjMsIDI1NDE2MywgIDIwNTQxNjMsIDUyNDE2MywgIDUwMjQxNjMsIDI1MDQxNjMsIDUyMDQxNjMsCisgICAgICAgIDQ1MjE2MywgIDQwNTIxNjMsIDU0MjE2MywgIDUwNDIxNjMsIDQ1MDIxNjMsIDU0MDIxNjMsIDI0NTAxNjMsIDQyNTAxNjMsIDI1NDAxNjMsIDUyNDAxNjMsIDQ1MjAxNjMsIDU0MjAxNjMsCisgICAgICAgIDEyNDUwNjMsIDIxNDUwNjMsIDE0MjUwNjMsIDQxMjUwNjMsIDI0MTUwNjMsIDQyMTUwNjMsIDEyNTQwNjMsIDIxNTQwNjMsIDE1MjQwNjMsIDUxMjQwNjMsIDI1MTQwNjMsIDUyMTQwNjMsCisgICAgICAgIDE0NTIwNjMsIDQxNTIwNjMsIDE1NDIwNjMsIDUxNDIwNjMsIDQ1MTIwNjMsIDU0MTIwNjMsIDI0NTEwNjMsIDQyNTEwNjMsIDI1NDEwNjMsIDUyNDEwNjMsIDQ1MjEwNjMsIDU0MjEwNjMsCisgICAgICAgIDEyNDY1MywgIDEwMjQ2NTMsIDIxNDY1MywgIDIwMTQ2NTMsIDEyMDQ2NTMsIDIxMDQ2NTMsIDE0MjY1MywgIDEwNDI2NTMsIDQxMjY1MywgIDQwMTI2NTMsIDE0MDI2NTMsIDQxMDI2NTMsCisgICAgICAgIDI0MTY1MywgIDIwNDE2NTMsIDQyMTY1MywgIDQwMjE2NTMsIDI0MDE2NTMsIDQyMDE2NTMsIDEyNDA2NTMsIDIxNDA2NTMsIDE0MjA2NTMsIDQxMjA2NTMsIDI0MTA2NTMsIDQyMTA2NTMsCisgICAgICAgIDEyNjQ1MywgIDEwMjY0NTMsIDIxNjQ1MywgIDIwMTY0NTMsIDEyMDY0NTMsIDIxMDY0NTMsIDE2MjQ1MywgIDEwNjI0NTMsIDYxMjQ1MywgIDYwMTI0NTMsIDE2MDI0NTMsIDYxMDI0NTMsCisgICAgICAgIDI2MTQ1MywgIDIwNjE0NTMsIDYyMTQ1MywgIDYwMjE0NTMsIDI2MDE0NTMsIDYyMDE0NTMsIDEyNjA0NTMsIDIxNjA0NTMsIDE2MjA0NTMsIDYxMjA0NTMsIDI2MTA0NTMsIDYyMTA0NTMsCisgICAgICAgIDE0NjI1MywgIDEwNDYyNTMsIDQxNjI1MywgIDQwMTYyNTMsIDE0MDYyNTMsIDQxMDYyNTMsIDE2NDI1MywgIDEwNjQyNTMsIDYxNDI1MywgIDYwMTQyNTMsIDE2MDQyNTMsIDYxMDQyNTMsCisgICAgICAgIDQ2MTI1MywgIDQwNjEyNTMsIDY0MTI1MywgIDYwNDEyNTMsIDQ2MDEyNTMsIDY0MDEyNTMsIDE0NjAyNTMsIDQxNjAyNTMsIDE2NDAyNTMsIDYxNDAyNTMsIDQ2MTAyNTMsIDY0MTAyNTMsCisgICAgICAgIDI0NjE1MywgIDIwNDYxNTMsIDQyNjE1MywgIDQwMjYxNTMsIDI0MDYxNTMsIDQyMDYxNTMsIDI2NDE1MywgIDIwNjQxNTMsIDYyNDE1MywgIDYwMjQxNTMsIDI2MDQxNTMsIDYyMDQxNTMsCisgICAgICAgIDQ2MjE1MywgIDQwNjIxNTMsIDY0MjE1MywgIDYwNDIxNTMsIDQ2MDIxNTMsIDY0MDIxNTMsIDI0NjAxNTMsIDQyNjAxNTMsIDI2NDAxNTMsIDYyNDAxNTMsIDQ2MjAxNTMsIDY0MjAxNTMsCisgICAgICAgIDEyNDYwNTMsIDIxNDYwNTMsIDE0MjYwNTMsIDQxMjYwNTMsIDI0MTYwNTMsIDQyMTYwNTMsIDEyNjQwNTMsIDIxNjQwNTMsIDE2MjQwNTMsIDYxMjQwNTMsIDI2MTQwNTMsIDYyMTQwNTMsCisgICAgICAgIDE0NjIwNTMsIDQxNjIwNTMsIDE2NDIwNTMsIDYxNDIwNTMsIDQ2MTIwNTMsIDY0MTIwNTMsIDI0NjEwNTMsIDQyNjEwNTMsIDI2NDEwNTMsIDYyNDEwNTMsIDQ2MjEwNTMsIDY0MjEwNTMsCisgICAgICAgIDEyNTY0MywgIDEwMjU2NDMsIDIxNTY0MywgIDIwMTU2NDMsIDEyMDU2NDMsIDIxMDU2NDMsIDE1MjY0MywgIDEwNTI2NDMsIDUxMjY0MywgIDUwMTI2NDMsIDE1MDI2NDMsIDUxMDI2NDMsCisgICAgICAgIDI1MTY0MywgIDIwNTE2NDMsIDUyMTY0MywgIDUwMjE2NDMsIDI1MDE2NDMsIDUyMDE2NDMsIDEyNTA2NDMsIDIxNTA2NDMsIDE1MjA2NDMsIDUxMjA2NDMsIDI1MTA2NDMsIDUyMTA2NDMsCisgICAgICAgIDEyNjU0MywgIDEwMjY1NDMsIDIxNjU0MywgIDIwMTY1NDMsIDEyMDY1NDMsIDIxMDY1NDMsIDE2MjU0MywgIDEwNjI1NDMsIDYxMjU0MywgIDYwMTI1NDMsIDE2MDI1NDMsIDYxMDI1NDMsCisgICAgICAgIDI2MTU0MywgIDIwNjE1NDMsIDYyMTU0MywgIDYwMjE1NDMsIDI2MDE1NDMsIDYyMDE1NDMsIDEyNjA1NDMsIDIxNjA1NDMsIDE2MjA1NDMsIDYxMjA1NDMsIDI2MTA1NDMsIDYyMTA1NDMsCisgICAgICAgIDE1NjI0MywgIDEwNTYyNDMsIDUxNjI0MywgIDUwMTYyNDMsIDE1MDYyNDMsIDUxMDYyNDMsIDE2NTI0MywgIDEwNjUyNDMsIDYxNTI0MywgIDYwMTUyNDMsIDE2MDUyNDMsIDYxMDUyNDMsCisgICAgICAgIDU2MTI0MywgIDUwNjEyNDMsIDY1MTI0MywgIDYwNTEyNDMsIDU2MDEyNDMsIDY1MDEyNDMsIDE1NjAyNDMsIDUxNjAyNDMsIDE2NTAyNDMsIDYxNTAyNDMsIDU2MTAyNDMsIDY1MTAyNDMsCisgICAgICAgIDI1NjE0MywgIDIwNTYxNDMsIDUyNjE0MywgIDUwMjYxNDMsIDI1MDYxNDMsIDUyMDYxNDMsIDI2NTE0MywgIDIwNjUxNDMsIDYyNTE0MywgIDYwMjUxNDMsIDI2MDUxNDMsIDYyMDUxNDMsCisgICAgICAgIDU2MjE0MywgIDUwNjIxNDMsIDY1MjE0MywgIDYwNTIxNDMsIDU2MDIxNDMsIDY1MDIxNDMsIDI1NjAxNDMsIDUyNjAxNDMsIDI2NTAxNDMsIDYyNTAxNDMsIDU2MjAxNDMsIDY1MjAxNDMsCisgICAgICAgIDEyNTYwNDMsIDIxNTYwNDMsIDE1MjYwNDMsIDUxMjYwNDMsIDI1MTYwNDMsIDUyMTYwNDMsIDEyNjUwNDMsIDIxNjUwNDMsIDE2MjUwNDMsIDYxMjUwNDMsIDI2MTUwNDMsIDYyMTUwNDMsCisgICAgICAgIDE1NjIwNDMsIDUxNjIwNDMsIDE2NTIwNDMsIDYxNTIwNDMsIDU2MTIwNDMsIDY1MTIwNDMsIDI1NjEwNDMsIDUyNjEwNDMsIDI2NTEwNDMsIDYyNTEwNDMsIDU2MjEwNDMsIDY1MjEwNDMsCisgICAgICAgIDE0NTYyMywgIDEwNDU2MjMsIDQxNTYyMywgIDQwMTU2MjMsIDE0MDU2MjMsIDQxMDU2MjMsIDE1NDYyMywgIDEwNTQ2MjMsIDUxNDYyMywgIDUwMTQ2MjMsIDE1MDQ2MjMsIDUxMDQ2MjMsCisgICAgICAgIDQ1MTYyMywgIDQwNTE2MjMsIDU0MTYyMywgIDUwNDE2MjMsIDQ1MDE2MjMsIDU0MDE2MjMsIDE0NTA2MjMsIDQxNTA2MjMsIDE1NDA2MjMsIDUxNDA2MjMsIDQ1MTA2MjMsIDU0MTA2MjMsCisgICAgICAgIDE0NjUyMywgIDEwNDY1MjMsIDQxNjUyMywgIDQwMTY1MjMsIDE0MDY1MjMsIDQxMDY1MjMsIDE2NDUyMywgIDEwNjQ1MjMsIDYxNDUyMywgIDYwMTQ1MjMsIDE2MDQ1MjMsIDYxMDQ1MjMsCisgICAgICAgIDQ2MTUyMywgIDQwNjE1MjMsIDY0MTUyMywgIDYwNDE1MjMsIDQ2MDE1MjMsIDY0MDE1MjMsIDE0NjA1MjMsIDQxNjA1MjMsIDE2NDA1MjMsIDYxNDA1MjMsIDQ2MTA1MjMsIDY0MTA1MjMsCisgICAgICAgIDE1NjQyMywgIDEwNTY0MjMsIDUxNjQyMywgIDUwMTY0MjMsIDE1MDY0MjMsIDUxMDY0MjMsIDE2NTQyMywgIDEwNjU0MjMsIDYxNTQyMywgIDYwMTU0MjMsIDE2MDU0MjMsIDYxMDU0MjMsCisgICAgICAgIDU2MTQyMywgIDUwNjE0MjMsIDY1MTQyMywgIDYwNTE0MjMsIDU2MDE0MjMsIDY1MDE0MjMsIDE1NjA0MjMsIDUxNjA0MjMsIDE2NTA0MjMsIDYxNTA0MjMsIDU2MTA0MjMsIDY1MTA0MjMsCisgICAgICAgIDQ1NjEyMywgIDQwNTYxMjMsIDU0NjEyMywgIDUwNDYxMjMsIDQ1MDYxMjMsIDU0MDYxMjMsIDQ2NTEyMywgIDQwNjUxMjMsIDY0NTEyMywgIDYwNDUxMjMsIDQ2MDUxMjMsIDY0MDUxMjMsCisgICAgICAgIDU2NDEyMywgIDUwNjQxMjMsIDY1NDEyMywgIDYwNTQxMjMsIDU2MDQxMjMsIDY1MDQxMjMsIDQ1NjAxMjMsIDU0NjAxMjMsIDQ2NTAxMjMsIDY0NTAxMjMsIDU2NDAxMjMsIDY1NDAxMjMsCisgICAgICAgIDE0NTYwMjMsIDQxNTYwMjMsIDE1NDYwMjMsIDUxNDYwMjMsIDQ1MTYwMjMsIDU0MTYwMjMsIDE0NjUwMjMsIDQxNjUwMjMsIDE2NDUwMjMsIDYxNDUwMjMsIDQ2MTUwMjMsIDY0MTUwMjMsCisgICAgICAgIDE1NjQwMjMsIDUxNjQwMjMsIDE2NTQwMjMsIDYxNTQwMjMsIDU2MTQwMjMsIDY1MTQwMjMsIDQ1NjEwMjMsIDU0NjEwMjMsIDQ2NTEwMjMsIDY0NTEwMjMsIDU2NDEwMjMsIDY1NDEwMjMsCisgICAgICAgIDI0NTYxMywgIDIwNDU2MTMsIDQyNTYxMywgIDQwMjU2MTMsIDI0MDU2MTMsIDQyMDU2MTMsIDI1NDYxMywgIDIwNTQ2MTMsIDUyNDYxMywgIDUwMjQ2MTMsIDI1MDQ2MTMsIDUyMDQ2MTMsCisgICAgICAgIDQ1MjYxMywgIDQwNTI2MTMsIDU0MjYxMywgIDUwNDI2MTMsIDQ1MDI2MTMsIDU0MDI2MTMsIDI0NTA2MTMsIDQyNTA2MTMsIDI1NDA2MTMsIDUyNDA2MTMsIDQ1MjA2MTMsIDU0MjA2MTMsCisgICAgICAgIDI0NjUxMywgIDIwNDY1MTMsIDQyNjUxMywgIDQwMjY1MTMsIDI0MDY1MTMsIDQyMDY1MTMsIDI2NDUxMywgIDIwNjQ1MTMsIDYyNDUxMywgIDYwMjQ1MTMsIDI2MDQ1MTMsIDYyMDQ1MTMsCisgICAgICAgIDQ2MjUxMywgIDQwNjI1MTMsIDY0MjUxMywgIDYwNDI1MTMsIDQ2MDI1MTMsIDY0MDI1MTMsIDI0NjA1MTMsIDQyNjA1MTMsIDI2NDA1MTMsIDYyNDA1MTMsIDQ2MjA1MTMsIDY0MjA1MTMsCisgICAgICAgIDI1NjQxMywgIDIwNTY0MTMsIDUyNjQxMywgIDUwMjY0MTMsIDI1MDY0MTMsIDUyMDY0MTMsIDI2NTQxMywgIDIwNjU0MTMsIDYyNTQxMywgIDYwMjU0MTMsIDI2MDU0MTMsIDYyMDU0MTMsCisgICAgICAgIDU2MjQxMywgIDUwNjI0MTMsIDY1MjQxMywgIDYwNTI0MTMsIDU2MDI0MTMsIDY1MDI0MTMsIDI1NjA0MTMsIDUyNjA0MTMsIDI2NTA0MTMsIDYyNTA0MTMsIDU2MjA0MTMsIDY1MjA0MTMsCisgICAgICAgIDQ1NjIxMywgIDQwNTYyMTMsIDU0NjIxMywgIDUwNDYyMTMsIDQ1MDYyMTMsIDU0MDYyMTMsIDQ2NTIxMywgIDQwNjUyMTMsIDY0NTIxMywgIDYwNDUyMTMsIDQ2MDUyMTMsIDY0MDUyMTMsCisgICAgICAgIDU2NDIxMywgIDUwNjQyMTMsIDY1NDIxMywgIDYwNTQyMTMsIDU2MDQyMTMsIDY1MDQyMTMsIDQ1NjAyMTMsIDU0NjAyMTMsIDQ2NTAyMTMsIDY0NTAyMTMsIDU2NDAyMTMsIDY1NDAyMTMsCisgICAgICAgIDI0NTYwMTMsIDQyNTYwMTMsIDI1NDYwMTMsIDUyNDYwMTMsIDQ1MjYwMTMsIDU0MjYwMTMsIDI0NjUwMTMsIDQyNjUwMTMsIDI2NDUwMTMsIDYyNDUwMTMsIDQ2MjUwMTMsIDY0MjUwMTMsCisgICAgICAgIDI1NjQwMTMsIDUyNjQwMTMsIDI2NTQwMTMsIDYyNTQwMTMsIDU2MjQwMTMsIDY1MjQwMTMsIDQ1NjIwMTMsIDU0NjIwMTMsIDQ2NTIwMTMsIDY0NTIwMTMsIDU2NDIwMTMsIDY1NDIwMTMsCisgICAgICAgIDEyNDU2MDMsIDIxNDU2MDMsIDE0MjU2MDMsIDQxMjU2MDMsIDI0MTU2MDMsIDQyMTU2MDMsIDEyNTQ2MDMsIDIxNTQ2MDMsIDE1MjQ2MDMsIDUxMjQ2MDMsIDI1MTQ2MDMsIDUyMTQ2MDMsCisgICAgICAgIDE0NTI2MDMsIDQxNTI2MDMsIDE1NDI2MDMsIDUxNDI2MDMsIDQ1MTI2MDMsIDU0MTI2MDMsIDI0NTE2MDMsIDQyNTE2MDMsIDI1NDE2MDMsIDUyNDE2MDMsIDQ1MjE2MDMsIDU0MjE2MDMsCisgICAgICAgIDEyNDY1MDMsIDIxNDY1MDMsIDE0MjY1MDMsIDQxMjY1MDMsIDI0MTY1MDMsIDQyMTY1MDMsIDEyNjQ1MDMsIDIxNjQ1MDMsIDE2MjQ1MDMsIDYxMjQ1MDMsIDI2MTQ1MDMsIDYyMTQ1MDMsCisgICAgICAgIDE0NjI1MDMsIDQxNjI1MDMsIDE2NDI1MDMsIDYxNDI1MDMsIDQ2MTI1MDMsIDY0MTI1MDMsIDI0NjE1MDMsIDQyNjE1MDMsIDI2NDE1MDMsIDYyNDE1MDMsIDQ2MjE1MDMsIDY0MjE1MDMsCisgICAgICAgIDEyNTY0MDMsIDIxNTY0MDMsIDE1MjY0MDMsIDUxMjY0MDMsIDI1MTY0MDMsIDUyMTY0MDMsIDEyNjU0MDMsIDIxNjU0MDMsIDE2MjU0MDMsIDYxMjU0MDMsIDI2MTU0MDMsIDYyMTU0MDMsCisgICAgICAgIDE1NjI0MDMsIDUxNjI0MDMsIDE2NTI0MDMsIDYxNTI0MDMsIDU2MTI0MDMsIDY1MTI0MDMsIDI1NjE0MDMsIDUyNjE0MDMsIDI2NTE0MDMsIDYyNTE0MDMsIDU2MjE0MDMsIDY1MjE0MDMsCisgICAgICAgIDE0NTYyMDMsIDQxNTYyMDMsIDE1NDYyMDMsIDUxNDYyMDMsIDQ1MTYyMDMsIDU0MTYyMDMsIDE0NjUyMDMsIDQxNjUyMDMsIDE2NDUyMDMsIDYxNDUyMDMsIDQ2MTUyMDMsIDY0MTUyMDMsCisgICAgICAgIDE1NjQyMDMsIDUxNjQyMDMsIDE2NTQyMDMsIDYxNTQyMDMsIDU2MTQyMDMsIDY1MTQyMDMsIDQ1NjEyMDMsIDU0NjEyMDMsIDQ2NTEyMDMsIDY0NTEyMDMsIDU2NDEyMDMsIDY1NDEyMDMsCisgICAgICAgIDI0NTYxMDMsIDQyNTYxMDMsIDI1NDYxMDMsIDUyNDYxMDMsIDQ1MjYxMDMsIDU0MjYxMDMsIDI0NjUxMDMsIDQyNjUxMDMsIDI2NDUxMDMsIDYyNDUxMDMsIDQ2MjUxMDMsIDY0MjUxMDMsCisgICAgICAgIDI1NjQxMDMsIDUyNjQxMDMsIDI2NTQxMDMsIDYyNTQxMDMsIDU2MjQxMDMsIDY1MjQxMDMsIDQ1NjIxMDMsIDU0NjIxMDMsIDQ2NTIxMDMsIDY0NTIxMDMsIDU2NDIxMDMsIDY1NDIxMDMsCisgICAgICAgIDEzNDU2MiwgIDEwMzQ1NjIsIDMxNDU2MiwgIDMwMTQ1NjIsIDEzMDQ1NjIsIDMxMDQ1NjIsIDE0MzU2MiwgIDEwNDM1NjIsIDQxMzU2MiwgIDQwMTM1NjIsIDE0MDM1NjIsIDQxMDM1NjIsCisgICAgICAgIDM0MTU2MiwgIDMwNDE1NjIsIDQzMTU2MiwgIDQwMzE1NjIsIDM0MDE1NjIsIDQzMDE1NjIsIDEzNDA1NjIsIDMxNDA1NjIsIDE0MzA1NjIsIDQxMzA1NjIsIDM0MTA1NjIsIDQzMTA1NjIsCisgICAgICAgIDEzNTQ2MiwgIDEwMzU0NjIsIDMxNTQ2MiwgIDMwMTU0NjIsIDEzMDU0NjIsIDMxMDU0NjIsIDE1MzQ2MiwgIDEwNTM0NjIsIDUxMzQ2MiwgIDUwMTM0NjIsIDE1MDM0NjIsIDUxMDM0NjIsCisgICAgICAgIDM1MTQ2MiwgIDMwNTE0NjIsIDUzMTQ2MiwgIDUwMzE0NjIsIDM1MDE0NjIsIDUzMDE0NjIsIDEzNTA0NjIsIDMxNTA0NjIsIDE1MzA0NjIsIDUxMzA0NjIsIDM1MTA0NjIsIDUzMTA0NjIsCisgICAgICAgIDE0NTM2MiwgIDEwNDUzNjIsIDQxNTM2MiwgIDQwMTUzNjIsIDE0MDUzNjIsIDQxMDUzNjIsIDE1NDM2MiwgIDEwNTQzNjIsIDUxNDM2MiwgIDUwMTQzNjIsIDE1MDQzNjIsIDUxMDQzNjIsCisgICAgICAgIDQ1MTM2MiwgIDQwNTEzNjIsIDU0MTM2MiwgIDUwNDEzNjIsIDQ1MDEzNjIsIDU0MDEzNjIsIDE0NTAzNjIsIDQxNTAzNjIsIDE1NDAzNjIsIDUxNDAzNjIsIDQ1MTAzNjIsIDU0MTAzNjIsCisgICAgICAgIDM0NTE2MiwgIDMwNDUxNjIsIDQzNTE2MiwgIDQwMzUxNjIsIDM0MDUxNjIsIDQzMDUxNjIsIDM1NDE2MiwgIDMwNTQxNjIsIDUzNDE2MiwgIDUwMzQxNjIsIDM1MDQxNjIsIDUzMDQxNjIsCisgICAgICAgIDQ1MzE2MiwgIDQwNTMxNjIsIDU0MzE2MiwgIDUwNDMxNjIsIDQ1MDMxNjIsIDU0MDMxNjIsIDM0NTAxNjIsIDQzNTAxNjIsIDM1NDAxNjIsIDUzNDAxNjIsIDQ1MzAxNjIsIDU0MzAxNjIsCisgICAgICAgIDEzNDUwNjIsIDMxNDUwNjIsIDE0MzUwNjIsIDQxMzUwNjIsIDM0MTUwNjIsIDQzMTUwNjIsIDEzNTQwNjIsIDMxNTQwNjIsIDE1MzQwNjIsIDUxMzQwNjIsIDM1MTQwNjIsIDUzMTQwNjIsCisgICAgICAgIDE0NTMwNjIsIDQxNTMwNjIsIDE1NDMwNjIsIDUxNDMwNjIsIDQ1MTMwNjIsIDU0MTMwNjIsIDM0NTEwNjIsIDQzNTEwNjIsIDM1NDEwNjIsIDUzNDEwNjIsIDQ1MzEwNjIsIDU0MzEwNjIsCisgICAgICAgIDEzNDY1MiwgIDEwMzQ2NTIsIDMxNDY1MiwgIDMwMTQ2NTIsIDEzMDQ2NTIsIDMxMDQ2NTIsIDE0MzY1MiwgIDEwNDM2NTIsIDQxMzY1MiwgIDQwMTM2NTIsIDE0MDM2NTIsIDQxMDM2NTIsCisgICAgICAgIDM0MTY1MiwgIDMwNDE2NTIsIDQzMTY1MiwgIDQwMzE2NTIsIDM0MDE2NTIsIDQzMDE2NTIsIDEzNDA2NTIsIDMxNDA2NTIsIDE0MzA2NTIsIDQxMzA2NTIsIDM0MTA2NTIsIDQzMTA2NTIsCisgICAgICAgIDEzNjQ1MiwgIDEwMzY0NTIsIDMxNjQ1MiwgIDMwMTY0NTIsIDEzMDY0NTIsIDMxMDY0NTIsIDE2MzQ1MiwgIDEwNjM0NTIsIDYxMzQ1MiwgIDYwMTM0NTIsIDE2MDM0NTIsIDYxMDM0NTIsCisgICAgICAgIDM2MTQ1MiwgIDMwNjE0NTIsIDYzMTQ1MiwgIDYwMzE0NTIsIDM2MDE0NTIsIDYzMDE0NTIsIDEzNjA0NTIsIDMxNjA0NTIsIDE2MzA0NTIsIDYxMzA0NTIsIDM2MTA0NTIsIDYzMTA0NTIsCisgICAgICAgIDE0NjM1MiwgIDEwNDYzNTIsIDQxNjM1MiwgIDQwMTYzNTIsIDE0MDYzNTIsIDQxMDYzNTIsIDE2NDM1MiwgIDEwNjQzNTIsIDYxNDM1MiwgIDYwMTQzNTIsIDE2MDQzNTIsIDYxMDQzNTIsCisgICAgICAgIDQ2MTM1MiwgIDQwNjEzNTIsIDY0MTM1MiwgIDYwNDEzNTIsIDQ2MDEzNTIsIDY0MDEzNTIsIDE0NjAzNTIsIDQxNjAzNTIsIDE2NDAzNTIsIDYxNDAzNTIsIDQ2MTAzNTIsIDY0MTAzNTIsCisgICAgICAgIDM0NjE1MiwgIDMwNDYxNTIsIDQzNjE1MiwgIDQwMzYxNTIsIDM0MDYxNTIsIDQzMDYxNTIsIDM2NDE1MiwgIDMwNjQxNTIsIDYzNDE1MiwgIDYwMzQxNTIsIDM2MDQxNTIsIDYzMDQxNTIsCisgICAgICAgIDQ2MzE1MiwgIDQwNjMxNTIsIDY0MzE1MiwgIDYwNDMxNTIsIDQ2MDMxNTIsIDY0MDMxNTIsIDM0NjAxNTIsIDQzNjAxNTIsIDM2NDAxNTIsIDYzNDAxNTIsIDQ2MzAxNTIsIDY0MzAxNTIsCisgICAgICAgIDEzNDYwNTIsIDMxNDYwNTIsIDE0MzYwNTIsIDQxMzYwNTIsIDM0MTYwNTIsIDQzMTYwNTIsIDEzNjQwNTIsIDMxNjQwNTIsIDE2MzQwNTIsIDYxMzQwNTIsIDM2MTQwNTIsIDYzMTQwNTIsCisgICAgICAgIDE0NjMwNTIsIDQxNjMwNTIsIDE2NDMwNTIsIDYxNDMwNTIsIDQ2MTMwNTIsIDY0MTMwNTIsIDM0NjEwNTIsIDQzNjEwNTIsIDM2NDEwNTIsIDYzNDEwNTIsIDQ2MzEwNTIsIDY0MzEwNTIsCisgICAgICAgIDEzNTY0MiwgIDEwMzU2NDIsIDMxNTY0MiwgIDMwMTU2NDIsIDEzMDU2NDIsIDMxMDU2NDIsIDE1MzY0MiwgIDEwNTM2NDIsIDUxMzY0MiwgIDUwMTM2NDIsIDE1MDM2NDIsIDUxMDM2NDIsCisgICAgICAgIDM1MTY0MiwgIDMwNTE2NDIsIDUzMTY0MiwgIDUwMzE2NDIsIDM1MDE2NDIsIDUzMDE2NDIsIDEzNTA2NDIsIDMxNTA2NDIsIDE1MzA2NDIsIDUxMzA2NDIsIDM1MTA2NDIsIDUzMTA2NDIsCisgICAgICAgIDEzNjU0MiwgIDEwMzY1NDIsIDMxNjU0MiwgIDMwMTY1NDIsIDEzMDY1NDIsIDMxMDY1NDIsIDE2MzU0MiwgIDEwNjM1NDIsIDYxMzU0MiwgIDYwMTM1NDIsIDE2MDM1NDIsIDYxMDM1NDIsCisgICAgICAgIDM2MTU0MiwgIDMwNjE1NDIsIDYzMTU0MiwgIDYwMzE1NDIsIDM2MDE1NDIsIDYzMDE1NDIsIDEzNjA1NDIsIDMxNjA1NDIsIDE2MzA1NDIsIDYxMzA1NDIsIDM2MTA1NDIsIDYzMTA1NDIsCisgICAgICAgIDE1NjM0MiwgIDEwNTYzNDIsIDUxNjM0MiwgIDUwMTYzNDIsIDE1MDYzNDIsIDUxMDYzNDIsIDE2NTM0MiwgIDEwNjUzNDIsIDYxNTM0MiwgIDYwMTUzNDIsIDE2MDUzNDIsIDYxMDUzNDIsCisgICAgICAgIDU2MTM0MiwgIDUwNjEzNDIsIDY1MTM0MiwgIDYwNTEzNDIsIDU2MDEzNDIsIDY1MDEzNDIsIDE1NjAzNDIsIDUxNjAzNDIsIDE2NTAzNDIsIDYxNTAzNDIsIDU2MTAzNDIsIDY1MTAzNDIsCisgICAgICAgIDM1NjE0MiwgIDMwNTYxNDIsIDUzNjE0MiwgIDUwMzYxNDIsIDM1MDYxNDIsIDUzMDYxNDIsIDM2NTE0MiwgIDMwNjUxNDIsIDYzNTE0MiwgIDYwMzUxNDIsIDM2MDUxNDIsIDYzMDUxNDIsCisgICAgICAgIDU2MzE0MiwgIDUwNjMxNDIsIDY1MzE0MiwgIDYwNTMxNDIsIDU2MDMxNDIsIDY1MDMxNDIsIDM1NjAxNDIsIDUzNjAxNDIsIDM2NTAxNDIsIDYzNTAxNDIsIDU2MzAxNDIsIDY1MzAxNDIsCisgICAgICAgIDEzNTYwNDIsIDMxNTYwNDIsIDE1MzYwNDIsIDUxMzYwNDIsIDM1MTYwNDIsIDUzMTYwNDIsIDEzNjUwNDIsIDMxNjUwNDIsIDE2MzUwNDIsIDYxMzUwNDIsIDM2MTUwNDIsIDYzMTUwNDIsCisgICAgICAgIDE1NjMwNDIsIDUxNjMwNDIsIDE2NTMwNDIsIDYxNTMwNDIsIDU2MTMwNDIsIDY1MTMwNDIsIDM1NjEwNDIsIDUzNjEwNDIsIDM2NTEwNDIsIDYzNTEwNDIsIDU2MzEwNDIsIDY1MzEwNDIsCisgICAgICAgIDE0NTYzMiwgIDEwNDU2MzIsIDQxNTYzMiwgIDQwMTU2MzIsIDE0MDU2MzIsIDQxMDU2MzIsIDE1NDYzMiwgIDEwNTQ2MzIsIDUxNDYzMiwgIDUwMTQ2MzIsIDE1MDQ2MzIsIDUxMDQ2MzIsCisgICAgICAgIDQ1MTYzMiwgIDQwNTE2MzIsIDU0MTYzMiwgIDUwNDE2MzIsIDQ1MDE2MzIsIDU0MDE2MzIsIDE0NTA2MzIsIDQxNTA2MzIsIDE1NDA2MzIsIDUxNDA2MzIsIDQ1MTA2MzIsIDU0MTA2MzIsCisgICAgICAgIDE0NjUzMiwgIDEwNDY1MzIsIDQxNjUzMiwgIDQwMTY1MzIsIDE0MDY1MzIsIDQxMDY1MzIsIDE2NDUzMiwgIDEwNjQ1MzIsIDYxNDUzMiwgIDYwMTQ1MzIsIDE2MDQ1MzIsIDYxMDQ1MzIsCisgICAgICAgIDQ2MTUzMiwgIDQwNjE1MzIsIDY0MTUzMiwgIDYwNDE1MzIsIDQ2MDE1MzIsIDY0MDE1MzIsIDE0NjA1MzIsIDQxNjA1MzIsIDE2NDA1MzIsIDYxNDA1MzIsIDQ2MTA1MzIsIDY0MTA1MzIsCisgICAgICAgIDE1NjQzMiwgIDEwNTY0MzIsIDUxNjQzMiwgIDUwMTY0MzIsIDE1MDY0MzIsIDUxMDY0MzIsIDE2NTQzMiwgIDEwNjU0MzIsIDYxNTQzMiwgIDYwMTU0MzIsIDE2MDU0MzIsIDYxMDU0MzIsCisgICAgICAgIDU2MTQzMiwgIDUwNjE0MzIsIDY1MTQzMiwgIDYwNTE0MzIsIDU2MDE0MzIsIDY1MDE0MzIsIDE1NjA0MzIsIDUxNjA0MzIsIDE2NTA0MzIsIDYxNTA0MzIsIDU2MTA0MzIsIDY1MTA0MzIsCisgICAgICAgIDQ1NjEzMiwgIDQwNTYxMzIsIDU0NjEzMiwgIDUwNDYxMzIsIDQ1MDYxMzIsIDU0MDYxMzIsIDQ2NTEzMiwgIDQwNjUxMzIsIDY0NTEzMiwgIDYwNDUxMzIsIDQ2MDUxMzIsIDY0MDUxMzIsCisgICAgICAgIDU2NDEzMiwgIDUwNjQxMzIsIDY1NDEzMiwgIDYwNTQxMzIsIDU2MDQxMzIsIDY1MDQxMzIsIDQ1NjAxMzIsIDU0NjAxMzIsIDQ2NTAxMzIsIDY0NTAxMzIsIDU2NDAxMzIsIDY1NDAxMzIsCisgICAgICAgIDE0NTYwMzIsIDQxNTYwMzIsIDE1NDYwMzIsIDUxNDYwMzIsIDQ1MTYwMzIsIDU0MTYwMzIsIDE0NjUwMzIsIDQxNjUwMzIsIDE2NDUwMzIsIDYxNDUwMzIsIDQ2MTUwMzIsIDY0MTUwMzIsCisgICAgICAgIDE1NjQwMzIsIDUxNjQwMzIsIDE2NTQwMzIsIDYxNTQwMzIsIDU2MTQwMzIsIDY1MTQwMzIsIDQ1NjEwMzIsIDU0NjEwMzIsIDQ2NTEwMzIsIDY0NTEwMzIsIDU2NDEwMzIsIDY1NDEwMzIsCisgICAgICAgIDM0NTYxMiwgIDMwNDU2MTIsIDQzNTYxMiwgIDQwMzU2MTIsIDM0MDU2MTIsIDQzMDU2MTIsIDM1NDYxMiwgIDMwNTQ2MTIsIDUzNDYxMiwgIDUwMzQ2MTIsIDM1MDQ2MTIsIDUzMDQ2MTIsCisgICAgICAgIDQ1MzYxMiwgIDQwNTM2MTIsIDU0MzYxMiwgIDUwNDM2MTIsIDQ1MDM2MTIsIDU0MDM2MTIsIDM0NTA2MTIsIDQzNTA2MTIsIDM1NDA2MTIsIDUzNDA2MTIsIDQ1MzA2MTIsIDU0MzA2MTIsCisgICAgICAgIDM0NjUxMiwgIDMwNDY1MTIsIDQzNjUxMiwgIDQwMzY1MTIsIDM0MDY1MTIsIDQzMDY1MTIsIDM2NDUxMiwgIDMwNjQ1MTIsIDYzNDUxMiwgIDYwMzQ1MTIsIDM2MDQ1MTIsIDYzMDQ1MTIsCisgICAgICAgIDQ2MzUxMiwgIDQwNjM1MTIsIDY0MzUxMiwgIDYwNDM1MTIsIDQ2MDM1MTIsIDY0MDM1MTIsIDM0NjA1MTIsIDQzNjA1MTIsIDM2NDA1MTIsIDYzNDA1MTIsIDQ2MzA1MTIsIDY0MzA1MTIsCisgICAgICAgIDM1NjQxMiwgIDMwNTY0MTIsIDUzNjQxMiwgIDUwMzY0MTIsIDM1MDY0MTIsIDUzMDY0MTIsIDM2NTQxMiwgIDMwNjU0MTIsIDYzNTQxMiwgIDYwMzU0MTIsIDM2MDU0MTIsIDYzMDU0MTIsCisgICAgICAgIDU2MzQxMiwgIDUwNjM0MTIsIDY1MzQxMiwgIDYwNTM0MTIsIDU2MDM0MTIsIDY1MDM0MTIsIDM1NjA0MTIsIDUzNjA0MTIsIDM2NTA0MTIsIDYzNTA0MTIsIDU2MzA0MTIsIDY1MzA0MTIsCisgICAgICAgIDQ1NjMxMiwgIDQwNTYzMTIsIDU0NjMxMiwgIDUwNDYzMTIsIDQ1MDYzMTIsIDU0MDYzMTIsIDQ2NTMxMiwgIDQwNjUzMTIsIDY0NTMxMiwgIDYwNDUzMTIsIDQ2MDUzMTIsIDY0MDUzMTIsCisgICAgICAgIDU2NDMxMiwgIDUwNjQzMTIsIDY1NDMxMiwgIDYwNTQzMTIsIDU2MDQzMTIsIDY1MDQzMTIsIDQ1NjAzMTIsIDU0NjAzMTIsIDQ2NTAzMTIsIDY0NTAzMTIsIDU2NDAzMTIsIDY1NDAzMTIsCisgICAgICAgIDM0NTYwMTIsIDQzNTYwMTIsIDM1NDYwMTIsIDUzNDYwMTIsIDQ1MzYwMTIsIDU0MzYwMTIsIDM0NjUwMTIsIDQzNjUwMTIsIDM2NDUwMTIsIDYzNDUwMTIsIDQ2MzUwMTIsIDY0MzUwMTIsCisgICAgICAgIDM1NjQwMTIsIDUzNjQwMTIsIDM2NTQwMTIsIDYzNTQwMTIsIDU2MzQwMTIsIDY1MzQwMTIsIDQ1NjMwMTIsIDU0NjMwMTIsIDQ2NTMwMTIsIDY0NTMwMTIsIDU2NDMwMTIsIDY1NDMwMTIsCisgICAgICAgIDEzNDU2MDIsIDMxNDU2MDIsIDE0MzU2MDIsIDQxMzU2MDIsIDM0MTU2MDIsIDQzMTU2MDIsIDEzNTQ2MDIsIDMxNTQ2MDIsIDE1MzQ2MDIsIDUxMzQ2MDIsIDM1MTQ2MDIsIDUzMTQ2MDIsCisgICAgICAgIDE0NTM2MDIsIDQxNTM2MDIsIDE1NDM2MDIsIDUxNDM2MDIsIDQ1MTM2MDIsIDU0MTM2MDIsIDM0NTE2MDIsIDQzNTE2MDIsIDM1NDE2MDIsIDUzNDE2MDIsIDQ1MzE2MDIsIDU0MzE2MDIsCisgICAgICAgIDEzNDY1MDIsIDMxNDY1MDIsIDE0MzY1MDIsIDQxMzY1MDIsIDM0MTY1MDIsIDQzMTY1MDIsIDEzNjQ1MDIsIDMxNjQ1MDIsIDE2MzQ1MDIsIDYxMzQ1MDIsIDM2MTQ1MDIsIDYzMTQ1MDIsCisgICAgICAgIDE0NjM1MDIsIDQxNjM1MDIsIDE2NDM1MDIsIDYxNDM1MDIsIDQ2MTM1MDIsIDY0MTM1MDIsIDM0NjE1MDIsIDQzNjE1MDIsIDM2NDE1MDIsIDYzNDE1MDIsIDQ2MzE1MDIsIDY0MzE1MDIsCisgICAgICAgIDEzNTY0MDIsIDMxNTY0MDIsIDE1MzY0MDIsIDUxMzY0MDIsIDM1MTY0MDIsIDUzMTY0MDIsIDEzNjU0MDIsIDMxNjU0MDIsIDE2MzU0MDIsIDYxMzU0MDIsIDM2MTU0MDIsIDYzMTU0MDIsCisgICAgICAgIDE1NjM0MDIsIDUxNjM0MDIsIDE2NTM0MDIsIDYxNTM0MDIsIDU2MTM0MDIsIDY1MTM0MDIsIDM1NjE0MDIsIDUzNjE0MDIsIDM2NTE0MDIsIDYzNTE0MDIsIDU2MzE0MDIsIDY1MzE0MDIsCisgICAgICAgIDE0NTYzMDIsIDQxNTYzMDIsIDE1NDYzMDIsIDUxNDYzMDIsIDQ1MTYzMDIsIDU0MTYzMDIsIDE0NjUzMDIsIDQxNjUzMDIsIDE2NDUzMDIsIDYxNDUzMDIsIDQ2MTUzMDIsIDY0MTUzMDIsCisgICAgICAgIDE1NjQzMDIsIDUxNjQzMDIsIDE2NTQzMDIsIDYxNTQzMDIsIDU2MTQzMDIsIDY1MTQzMDIsIDQ1NjEzMDIsIDU0NjEzMDIsIDQ2NTEzMDIsIDY0NTEzMDIsIDU2NDEzMDIsIDY1NDEzMDIsCisgICAgICAgIDM0NTYxMDIsIDQzNTYxMDIsIDM1NDYxMDIsIDUzNDYxMDIsIDQ1MzYxMDIsIDU0MzYxMDIsIDM0NjUxMDIsIDQzNjUxMDIsIDM2NDUxMDIsIDYzNDUxMDIsIDQ2MzUxMDIsIDY0MzUxMDIsCisgICAgICAgIDM1NjQxMDIsIDUzNjQxMDIsIDM2NTQxMDIsIDYzNTQxMDIsIDU2MzQxMDIsIDY1MzQxMDIsIDQ1NjMxMDIsIDU0NjMxMDIsIDQ2NTMxMDIsIDY0NTMxMDIsIDU2NDMxMDIsIDY1NDMxMDIsCisgICAgICAgIDIzNDU2MSwgIDIwMzQ1NjEsIDMyNDU2MSwgIDMwMjQ1NjEsIDIzMDQ1NjEsIDMyMDQ1NjEsIDI0MzU2MSwgIDIwNDM1NjEsIDQyMzU2MSwgIDQwMjM1NjEsIDI0MDM1NjEsIDQyMDM1NjEsCisgICAgICAgIDM0MjU2MSwgIDMwNDI1NjEsIDQzMjU2MSwgIDQwMzI1NjEsIDM0MDI1NjEsIDQzMDI1NjEsIDIzNDA1NjEsIDMyNDA1NjEsIDI0MzA1NjEsIDQyMzA1NjEsIDM0MjA1NjEsIDQzMjA1NjEsCisgICAgICAgIDIzNTQ2MSwgIDIwMzU0NjEsIDMyNTQ2MSwgIDMwMjU0NjEsIDIzMDU0NjEsIDMyMDU0NjEsIDI1MzQ2MSwgIDIwNTM0NjEsIDUyMzQ2MSwgIDUwMjM0NjEsIDI1MDM0NjEsIDUyMDM0NjEsCisgICAgICAgIDM1MjQ2MSwgIDMwNTI0NjEsIDUzMjQ2MSwgIDUwMzI0NjEsIDM1MDI0NjEsIDUzMDI0NjEsIDIzNTA0NjEsIDMyNTA0NjEsIDI1MzA0NjEsIDUyMzA0NjEsIDM1MjA0NjEsIDUzMjA0NjEsCisgICAgICAgIDI0NTM2MSwgIDIwNDUzNjEsIDQyNTM2MSwgIDQwMjUzNjEsIDI0MDUzNjEsIDQyMDUzNjEsIDI1NDM2MSwgIDIwNTQzNjEsIDUyNDM2MSwgIDUwMjQzNjEsIDI1MDQzNjEsIDUyMDQzNjEsCisgICAgICAgIDQ1MjM2MSwgIDQwNTIzNjEsIDU0MjM2MSwgIDUwNDIzNjEsIDQ1MDIzNjEsIDU0MDIzNjEsIDI0NTAzNjEsIDQyNTAzNjEsIDI1NDAzNjEsIDUyNDAzNjEsIDQ1MjAzNjEsIDU0MjAzNjEsCisgICAgICAgIDM0NTI2MSwgIDMwNDUyNjEsIDQzNTI2MSwgIDQwMzUyNjEsIDM0MDUyNjEsIDQzMDUyNjEsIDM1NDI2MSwgIDMwNTQyNjEsIDUzNDI2MSwgIDUwMzQyNjEsIDM1MDQyNjEsIDUzMDQyNjEsCisgICAgICAgIDQ1MzI2MSwgIDQwNTMyNjEsIDU0MzI2MSwgIDUwNDMyNjEsIDQ1MDMyNjEsIDU0MDMyNjEsIDM0NTAyNjEsIDQzNTAyNjEsIDM1NDAyNjEsIDUzNDAyNjEsIDQ1MzAyNjEsIDU0MzAyNjEsCisgICAgICAgIDIzNDUwNjEsIDMyNDUwNjEsIDI0MzUwNjEsIDQyMzUwNjEsIDM0MjUwNjEsIDQzMjUwNjEsIDIzNTQwNjEsIDMyNTQwNjEsIDI1MzQwNjEsIDUyMzQwNjEsIDM1MjQwNjEsIDUzMjQwNjEsCisgICAgICAgIDI0NTMwNjEsIDQyNTMwNjEsIDI1NDMwNjEsIDUyNDMwNjEsIDQ1MjMwNjEsIDU0MjMwNjEsIDM0NTIwNjEsIDQzNTIwNjEsIDM1NDIwNjEsIDUzNDIwNjEsIDQ1MzIwNjEsIDU0MzIwNjEsCisgICAgICAgIDIzNDY1MSwgIDIwMzQ2NTEsIDMyNDY1MSwgIDMwMjQ2NTEsIDIzMDQ2NTEsIDMyMDQ2NTEsIDI0MzY1MSwgIDIwNDM2NTEsIDQyMzY1MSwgIDQwMjM2NTEsIDI0MDM2NTEsIDQyMDM2NTEsCisgICAgICAgIDM0MjY1MSwgIDMwNDI2NTEsIDQzMjY1MSwgIDQwMzI2NTEsIDM0MDI2NTEsIDQzMDI2NTEsIDIzNDA2NTEsIDMyNDA2NTEsIDI0MzA2NTEsIDQyMzA2NTEsIDM0MjA2NTEsIDQzMjA2NTEsCisgICAgICAgIDIzNjQ1MSwgIDIwMzY0NTEsIDMyNjQ1MSwgIDMwMjY0NTEsIDIzMDY0NTEsIDMyMDY0NTEsIDI2MzQ1MSwgIDIwNjM0NTEsIDYyMzQ1MSwgIDYwMjM0NTEsIDI2MDM0NTEsIDYyMDM0NTEsCisgICAgICAgIDM2MjQ1MSwgIDMwNjI0NTEsIDYzMjQ1MSwgIDYwMzI0NTEsIDM2MDI0NTEsIDYzMDI0NTEsIDIzNjA0NTEsIDMyNjA0NTEsIDI2MzA0NTEsIDYyMzA0NTEsIDM2MjA0NTEsIDYzMjA0NTEsCisgICAgICAgIDI0NjM1MSwgIDIwNDYzNTEsIDQyNjM1MSwgIDQwMjYzNTEsIDI0MDYzNTEsIDQyMDYzNTEsIDI2NDM1MSwgIDIwNjQzNTEsIDYyNDM1MSwgIDYwMjQzNTEsIDI2MDQzNTEsIDYyMDQzNTEsCisgICAgICAgIDQ2MjM1MSwgIDQwNjIzNTEsIDY0MjM1MSwgIDYwNDIzNTEsIDQ2MDIzNTEsIDY0MDIzNTEsIDI0NjAzNTEsIDQyNjAzNTEsIDI2NDAzNTEsIDYyNDAzNTEsIDQ2MjAzNTEsIDY0MjAzNTEsCisgICAgICAgIDM0NjI1MSwgIDMwNDYyNTEsIDQzNjI1MSwgIDQwMzYyNTEsIDM0MDYyNTEsIDQzMDYyNTEsIDM2NDI1MSwgIDMwNjQyNTEsIDYzNDI1MSwgIDYwMzQyNTEsIDM2MDQyNTEsIDYzMDQyNTEsCisgICAgICAgIDQ2MzI1MSwgIDQwNjMyNTEsIDY0MzI1MSwgIDYwNDMyNTEsIDQ2MDMyNTEsIDY0MDMyNTEsIDM0NjAyNTEsIDQzNjAyNTEsIDM2NDAyNTEsIDYzNDAyNTEsIDQ2MzAyNTEsIDY0MzAyNTEsCisgICAgICAgIDIzNDYwNTEsIDMyNDYwNTEsIDI0MzYwNTEsIDQyMzYwNTEsIDM0MjYwNTEsIDQzMjYwNTEsIDIzNjQwNTEsIDMyNjQwNTEsIDI2MzQwNTEsIDYyMzQwNTEsIDM2MjQwNTEsIDYzMjQwNTEsCisgICAgICAgIDI0NjMwNTEsIDQyNjMwNTEsIDI2NDMwNTEsIDYyNDMwNTEsIDQ2MjMwNTEsIDY0MjMwNTEsIDM0NjIwNTEsIDQzNjIwNTEsIDM2NDIwNTEsIDYzNDIwNTEsIDQ2MzIwNTEsIDY0MzIwNTEsCisgICAgICAgIDIzNTY0MSwgIDIwMzU2NDEsIDMyNTY0MSwgIDMwMjU2NDEsIDIzMDU2NDEsIDMyMDU2NDEsIDI1MzY0MSwgIDIwNTM2NDEsIDUyMzY0MSwgIDUwMjM2NDEsIDI1MDM2NDEsIDUyMDM2NDEsCisgICAgICAgIDM1MjY0MSwgIDMwNTI2NDEsIDUzMjY0MSwgIDUwMzI2NDEsIDM1MDI2NDEsIDUzMDI2NDEsIDIzNTA2NDEsIDMyNTA2NDEsIDI1MzA2NDEsIDUyMzA2NDEsIDM1MjA2NDEsIDUzMjA2NDEsCisgICAgICAgIDIzNjU0MSwgIDIwMzY1NDEsIDMyNjU0MSwgIDMwMjY1NDEsIDIzMDY1NDEsIDMyMDY1NDEsIDI2MzU0MSwgIDIwNjM1NDEsIDYyMzU0MSwgIDYwMjM1NDEsIDI2MDM1NDEsIDYyMDM1NDEsCisgICAgICAgIDM2MjU0MSwgIDMwNjI1NDEsIDYzMjU0MSwgIDYwMzI1NDEsIDM2MDI1NDEsIDYzMDI1NDEsIDIzNjA1NDEsIDMyNjA1NDEsIDI2MzA1NDEsIDYyMzA1NDEsIDM2MjA1NDEsIDYzMjA1NDEsCisgICAgICAgIDI1NjM0MSwgIDIwNTYzNDEsIDUyNjM0MSwgIDUwMjYzNDEsIDI1MDYzNDEsIDUyMDYzNDEsIDI2NTM0MSwgIDIwNjUzNDEsIDYyNTM0MSwgIDYwMjUzNDEsIDI2MDUzNDEsIDYyMDUzNDEsCisgICAgICAgIDU2MjM0MSwgIDUwNjIzNDEsIDY1MjM0MSwgIDYwNTIzNDEsIDU2MDIzNDEsIDY1MDIzNDEsIDI1NjAzNDEsIDUyNjAzNDEsIDI2NTAzNDEsIDYyNTAzNDEsIDU2MjAzNDEsIDY1MjAzNDEsCisgICAgICAgIDM1NjI0MSwgIDMwNTYyNDEsIDUzNjI0MSwgIDUwMzYyNDEsIDM1MDYyNDEsIDUzMDYyNDEsIDM2NTI0MSwgIDMwNjUyNDEsIDYzNTI0MSwgIDYwMzUyNDEsIDM2MDUyNDEsIDYzMDUyNDEsCisgICAgICAgIDU2MzI0MSwgIDUwNjMyNDEsIDY1MzI0MSwgIDYwNTMyNDEsIDU2MDMyNDEsIDY1MDMyNDEsIDM1NjAyNDEsIDUzNjAyNDEsIDM2NTAyNDEsIDYzNTAyNDEsIDU2MzAyNDEsIDY1MzAyNDEsCisgICAgICAgIDIzNTYwNDEsIDMyNTYwNDEsIDI1MzYwNDEsIDUyMzYwNDEsIDM1MjYwNDEsIDUzMjYwNDEsIDIzNjUwNDEsIDMyNjUwNDEsIDI2MzUwNDEsIDYyMzUwNDEsIDM2MjUwNDEsIDYzMjUwNDEsCisgICAgICAgIDI1NjMwNDEsIDUyNjMwNDEsIDI2NTMwNDEsIDYyNTMwNDEsIDU2MjMwNDEsIDY1MjMwNDEsIDM1NjIwNDEsIDUzNjIwNDEsIDM2NTIwNDEsIDYzNTIwNDEsIDU2MzIwNDEsIDY1MzIwNDEsCisgICAgICAgIDI0NTYzMSwgIDIwNDU2MzEsIDQyNTYzMSwgIDQwMjU2MzEsIDI0MDU2MzEsIDQyMDU2MzEsIDI1NDYzMSwgIDIwNTQ2MzEsIDUyNDYzMSwgIDUwMjQ2MzEsIDI1MDQ2MzEsIDUyMDQ2MzEsCisgICAgICAgIDQ1MjYzMSwgIDQwNTI2MzEsIDU0MjYzMSwgIDUwNDI2MzEsIDQ1MDI2MzEsIDU0MDI2MzEsIDI0NTA2MzEsIDQyNTA2MzEsIDI1NDA2MzEsIDUyNDA2MzEsIDQ1MjA2MzEsIDU0MjA2MzEsCisgICAgICAgIDI0NjUzMSwgIDIwNDY1MzEsIDQyNjUzMSwgIDQwMjY1MzEsIDI0MDY1MzEsIDQyMDY1MzEsIDI2NDUzMSwgIDIwNjQ1MzEsIDYyNDUzMSwgIDYwMjQ1MzEsIDI2MDQ1MzEsIDYyMDQ1MzEsCisgICAgICAgIDQ2MjUzMSwgIDQwNjI1MzEsIDY0MjUzMSwgIDYwNDI1MzEsIDQ2MDI1MzEsIDY0MDI1MzEsIDI0NjA1MzEsIDQyNjA1MzEsIDI2NDA1MzEsIDYyNDA1MzEsIDQ2MjA1MzEsIDY0MjA1MzEsCisgICAgICAgIDI1NjQzMSwgIDIwNTY0MzEsIDUyNjQzMSwgIDUwMjY0MzEsIDI1MDY0MzEsIDUyMDY0MzEsIDI2NTQzMSwgIDIwNjU0MzEsIDYyNTQzMSwgIDYwMjU0MzEsIDI2MDU0MzEsIDYyMDU0MzEsCisgICAgICAgIDU2MjQzMSwgIDUwNjI0MzEsIDY1MjQzMSwgIDYwNTI0MzEsIDU2MDI0MzEsIDY1MDI0MzEsIDI1NjA0MzEsIDUyNjA0MzEsIDI2NTA0MzEsIDYyNTA0MzEsIDU2MjA0MzEsIDY1MjA0MzEsCisgICAgICAgIDQ1NjIzMSwgIDQwNTYyMzEsIDU0NjIzMSwgIDUwNDYyMzEsIDQ1MDYyMzEsIDU0MDYyMzEsIDQ2NTIzMSwgIDQwNjUyMzEsIDY0NTIzMSwgIDYwNDUyMzEsIDQ2MDUyMzEsIDY0MDUyMzEsCisgICAgICAgIDU2NDIzMSwgIDUwNjQyMzEsIDY1NDIzMSwgIDYwNTQyMzEsIDU2MDQyMzEsIDY1MDQyMzEsIDQ1NjAyMzEsIDU0NjAyMzEsIDQ2NTAyMzEsIDY0NTAyMzEsIDU2NDAyMzEsIDY1NDAyMzEsCisgICAgICAgIDI0NTYwMzEsIDQyNTYwMzEsIDI1NDYwMzEsIDUyNDYwMzEsIDQ1MjYwMzEsIDU0MjYwMzEsIDI0NjUwMzEsIDQyNjUwMzEsIDI2NDUwMzEsIDYyNDUwMzEsIDQ2MjUwMzEsIDY0MjUwMzEsCisgICAgICAgIDI1NjQwMzEsIDUyNjQwMzEsIDI2NTQwMzEsIDYyNTQwMzEsIDU2MjQwMzEsIDY1MjQwMzEsIDQ1NjIwMzEsIDU0NjIwMzEsIDQ2NTIwMzEsIDY0NTIwMzEsIDU2NDIwMzEsIDY1NDIwMzEsCisgICAgICAgIDM0NTYyMSwgIDMwNDU2MjEsIDQzNTYyMSwgIDQwMzU2MjEsIDM0MDU2MjEsIDQzMDU2MjEsIDM1NDYyMSwgIDMwNTQ2MjEsIDUzNDYyMSwgIDUwMzQ2MjEsIDM1MDQ2MjEsIDUzMDQ2MjEsCisgICAgICAgIDQ1MzYyMSwgIDQwNTM2MjEsIDU0MzYyMSwgIDUwNDM2MjEsIDQ1MDM2MjEsIDU0MDM2MjEsIDM0NTA2MjEsIDQzNTA2MjEsIDM1NDA2MjEsIDUzNDA2MjEsIDQ1MzA2MjEsIDU0MzA2MjEsCisgICAgICAgIDM0NjUyMSwgIDMwNDY1MjEsIDQzNjUyMSwgIDQwMzY1MjEsIDM0MDY1MjEsIDQzMDY1MjEsIDM2NDUyMSwgIDMwNjQ1MjEsIDYzNDUyMSwgIDYwMzQ1MjEsIDM2MDQ1MjEsIDYzMDQ1MjEsCisgICAgICAgIDQ2MzUyMSwgIDQwNjM1MjEsIDY0MzUyMSwgIDYwNDM1MjEsIDQ2MDM1MjEsIDY0MDM1MjEsIDM0NjA1MjEsIDQzNjA1MjEsIDM2NDA1MjEsIDYzNDA1MjEsIDQ2MzA1MjEsIDY0MzA1MjEsCisgICAgICAgIDM1NjQyMSwgIDMwNTY0MjEsIDUzNjQyMSwgIDUwMzY0MjEsIDM1MDY0MjEsIDUzMDY0MjEsIDM2NTQyMSwgIDMwNjU0MjEsIDYzNTQyMSwgIDYwMzU0MjEsIDM2MDU0MjEsIDYzMDU0MjEsCisgICAgICAgIDU2MzQyMSwgIDUwNjM0MjEsIDY1MzQyMSwgIDYwNTM0MjEsIDU2MDM0MjEsIDY1MDM0MjEsIDM1NjA0MjEsIDUzNjA0MjEsIDM2NTA0MjEsIDYzNTA0MjEsIDU2MzA0MjEsIDY1MzA0MjEsCisgICAgICAgIDQ1NjMyMSwgIDQwNTYzMjEsIDU0NjMyMSwgIDUwNDYzMjEsIDQ1MDYzMjEsIDU0MDYzMjEsIDQ2NTMyMSwgIDQwNjUzMjEsIDY0NTMyMSwgIDYwNDUzMjEsIDQ2MDUzMjEsIDY0MDUzMjEsCisgICAgICAgIDU2NDMyMSwgIDUwNjQzMjEsIDY1NDMyMSwgIDYwNTQzMjEsIDU2MDQzMjEsIDY1MDQzMjEsIDQ1NjAzMjEsIDU0NjAzMjEsIDQ2NTAzMjEsIDY0NTAzMjEsIDU2NDAzMjEsIDY1NDAzMjEsCisgICAgICAgIDM0NTYwMjEsIDQzNTYwMjEsIDM1NDYwMjEsIDUzNDYwMjEsIDQ1MzYwMjEsIDU0MzYwMjEsIDM0NjUwMjEsIDQzNjUwMjEsIDM2NDUwMjEsIDYzNDUwMjEsIDQ2MzUwMjEsIDY0MzUwMjEsCisgICAgICAgIDM1NjQwMjEsIDUzNjQwMjEsIDM2NTQwMjEsIDYzNTQwMjEsIDU2MzQwMjEsIDY1MzQwMjEsIDQ1NjMwMjEsIDU0NjMwMjEsIDQ2NTMwMjEsIDY0NTMwMjEsIDU2NDMwMjEsIDY1NDMwMjEsCisgICAgICAgIDIzNDU2MDEsIDMyNDU2MDEsIDI0MzU2MDEsIDQyMzU2MDEsIDM0MjU2MDEsIDQzMjU2MDEsIDIzNTQ2MDEsIDMyNTQ2MDEsIDI1MzQ2MDEsIDUyMzQ2MDEsIDM1MjQ2MDEsIDUzMjQ2MDEsCisgICAgICAgIDI0NTM2MDEsIDQyNTM2MDEsIDI1NDM2MDEsIDUyNDM2MDEsIDQ1MjM2MDEsIDU0MjM2MDEsIDM0NTI2MDEsIDQzNTI2MDEsIDM1NDI2MDEsIDUzNDI2MDEsIDQ1MzI2MDEsIDU0MzI2MDEsCisgICAgICAgIDIzNDY1MDEsIDMyNDY1MDEsIDI0MzY1MDEsIDQyMzY1MDEsIDM0MjY1MDEsIDQzMjY1MDEsIDIzNjQ1MDEsIDMyNjQ1MDEsIDI2MzQ1MDEsIDYyMzQ1MDEsIDM2MjQ1MDEsIDYzMjQ1MDEsCisgICAgICAgIDI0NjM1MDEsIDQyNjM1MDEsIDI2NDM1MDEsIDYyNDM1MDEsIDQ2MjM1MDEsIDY0MjM1MDEsIDM0NjI1MDEsIDQzNjI1MDEsIDM2NDI1MDEsIDYzNDI1MDEsIDQ2MzI1MDEsIDY0MzI1MDEsCisgICAgICAgIDIzNTY0MDEsIDMyNTY0MDEsIDI1MzY0MDEsIDUyMzY0MDEsIDM1MjY0MDEsIDUzMjY0MDEsIDIzNjU0MDEsIDMyNjU0MDEsIDI2MzU0MDEsIDYyMzU0MDEsIDM2MjU0MDEsIDYzMjU0MDEsCisgICAgICAgIDI1NjM0MDEsIDUyNjM0MDEsIDI2NTM0MDEsIDYyNTM0MDEsIDU2MjM0MDEsIDY1MjM0MDEsIDM1NjI0MDEsIDUzNjI0MDEsIDM2NTI0MDEsIDYzNTI0MDEsIDU2MzI0MDEsIDY1MzI0MDEsCisgICAgICAgIDI0NTYzMDEsIDQyNTYzMDEsIDI1NDYzMDEsIDUyNDYzMDEsIDQ1MjYzMDEsIDU0MjYzMDEsIDI0NjUzMDEsIDQyNjUzMDEsIDI2NDUzMDEsIDYyNDUzMDEsIDQ2MjUzMDEsIDY0MjUzMDEsCisgICAgICAgIDI1NjQzMDEsIDUyNjQzMDEsIDI2NTQzMDEsIDYyNTQzMDEsIDU2MjQzMDEsIDY1MjQzMDEsIDQ1NjIzMDEsIDU0NjIzMDEsIDQ2NTIzMDEsIDY0NTIzMDEsIDU2NDIzMDEsIDY1NDIzMDEsCisgICAgICAgIDM0NTYyMDEsIDQzNTYyMDEsIDM1NDYyMDEsIDUzNDYyMDEsIDQ1MzYyMDEsIDU0MzYyMDEsIDM0NjUyMDEsIDQzNjUyMDEsIDM2NDUyMDEsIDYzNDUyMDEsIDQ2MzUyMDEsIDY0MzUyMDEsCisgICAgICAgIDM1NjQyMDEsIDUzNjQyMDEsIDM2NTQyMDEsIDYzNTQyMDEsIDU2MzQyMDEsIDY1MzQyMDEsIDQ1NjMyMDEsIDU0NjMyMDEsIDQ2NTMyMDEsIDY0NTMyMDEsIDU2NDMyMDEsIDY1NDMyMDEsCisgICAgICAgIDEyMzQ1NjAsIDIxMzQ1NjAsIDEzMjQ1NjAsIDMxMjQ1NjAsIDIzMTQ1NjAsIDMyMTQ1NjAsIDEyNDM1NjAsIDIxNDM1NjAsIDE0MjM1NjAsIDQxMjM1NjAsIDI0MTM1NjAsIDQyMTM1NjAsCisgICAgICAgIDEzNDI1NjAsIDMxNDI1NjAsIDE0MzI1NjAsIDQxMzI1NjAsIDM0MTI1NjAsIDQzMTI1NjAsIDIzNDE1NjAsIDMyNDE1NjAsIDI0MzE1NjAsIDQyMzE1NjAsIDM0MjE1NjAsIDQzMjE1NjAsCisgICAgICAgIDEyMzU0NjAsIDIxMzU0NjAsIDEzMjU0NjAsIDMxMjU0NjAsIDIzMTU0NjAsIDMyMTU0NjAsIDEyNTM0NjAsIDIxNTM0NjAsIDE1MjM0NjAsIDUxMjM0NjAsIDI1MTM0NjAsIDUyMTM0NjAsCisgICAgICAgIDEzNTI0NjAsIDMxNTI0NjAsIDE1MzI0NjAsIDUxMzI0NjAsIDM1MTI0NjAsIDUzMTI0NjAsIDIzNTE0NjAsIDMyNTE0NjAsIDI1MzE0NjAsIDUyMzE0NjAsIDM1MjE0NjAsIDUzMjE0NjAsCisgICAgICAgIDEyNDUzNjAsIDIxNDUzNjAsIDE0MjUzNjAsIDQxMjUzNjAsIDI0MTUzNjAsIDQyMTUzNjAsIDEyNTQzNjAsIDIxNTQzNjAsIDE1MjQzNjAsIDUxMjQzNjAsIDI1MTQzNjAsIDUyMTQzNjAsCisgICAgICAgIDE0NTIzNjAsIDQxNTIzNjAsIDE1NDIzNjAsIDUxNDIzNjAsIDQ1MTIzNjAsIDU0MTIzNjAsIDI0NTEzNjAsIDQyNTEzNjAsIDI1NDEzNjAsIDUyNDEzNjAsIDQ1MjEzNjAsIDU0MjEzNjAsCisgICAgICAgIDEzNDUyNjAsIDMxNDUyNjAsIDE0MzUyNjAsIDQxMzUyNjAsIDM0MTUyNjAsIDQzMTUyNjAsIDEzNTQyNjAsIDMxNTQyNjAsIDE1MzQyNjAsIDUxMzQyNjAsIDM1MTQyNjAsIDUzMTQyNjAsCisgICAgICAgIDE0NTMyNjAsIDQxNTMyNjAsIDE1NDMyNjAsIDUxNDMyNjAsIDQ1MTMyNjAsIDU0MTMyNjAsIDM0NTEyNjAsIDQzNTEyNjAsIDM1NDEyNjAsIDUzNDEyNjAsIDQ1MzEyNjAsIDU0MzEyNjAsCisgICAgICAgIDIzNDUxNjAsIDMyNDUxNjAsIDI0MzUxNjAsIDQyMzUxNjAsIDM0MjUxNjAsIDQzMjUxNjAsIDIzNTQxNjAsIDMyNTQxNjAsIDI1MzQxNjAsIDUyMzQxNjAsIDM1MjQxNjAsIDUzMjQxNjAsCisgICAgICAgIDI0NTMxNjAsIDQyNTMxNjAsIDI1NDMxNjAsIDUyNDMxNjAsIDQ1MjMxNjAsIDU0MjMxNjAsIDM0NTIxNjAsIDQzNTIxNjAsIDM1NDIxNjAsIDUzNDIxNjAsIDQ1MzIxNjAsIDU0MzIxNjAsCisgICAgICAgIDEyMzQ2NTAsIDIxMzQ2NTAsIDEzMjQ2NTAsIDMxMjQ2NTAsIDIzMTQ2NTAsIDMyMTQ2NTAsIDEyNDM2NTAsIDIxNDM2NTAsIDE0MjM2NTAsIDQxMjM2NTAsIDI0MTM2NTAsIDQyMTM2NTAsCisgICAgICAgIDEzNDI2NTAsIDMxNDI2NTAsIDE0MzI2NTAsIDQxMzI2NTAsIDM0MTI2NTAsIDQzMTI2NTAsIDIzNDE2NTAsIDMyNDE2NTAsIDI0MzE2NTAsIDQyMzE2NTAsIDM0MjE2NTAsIDQzMjE2NTAsCisgICAgICAgIDEyMzY0NTAsIDIxMzY0NTAsIDEzMjY0NTAsIDMxMjY0NTAsIDIzMTY0NTAsIDMyMTY0NTAsIDEyNjM0NTAsIDIxNjM0NTAsIDE2MjM0NTAsIDYxMjM0NTAsIDI2MTM0NTAsIDYyMTM0NTAsCisgICAgICAgIDEzNjI0NTAsIDMxNjI0NTAsIDE2MzI0NTAsIDYxMzI0NTAsIDM2MTI0NTAsIDYzMTI0NTAsIDIzNjE0NTAsIDMyNjE0NTAsIDI2MzE0NTAsIDYyMzE0NTAsIDM2MjE0NTAsIDYzMjE0NTAsCisgICAgICAgIDEyNDYzNTAsIDIxNDYzNTAsIDE0MjYzNTAsIDQxMjYzNTAsIDI0MTYzNTAsIDQyMTYzNTAsIDEyNjQzNTAsIDIxNjQzNTAsIDE2MjQzNTAsIDYxMjQzNTAsIDI2MTQzNTAsIDYyMTQzNTAsCisgICAgICAgIDE0NjIzNTAsIDQxNjIzNTAsIDE2NDIzNTAsIDYxNDIzNTAsIDQ2MTIzNTAsIDY0MTIzNTAsIDI0NjEzNTAsIDQyNjEzNTAsIDI2NDEzNTAsIDYyNDEzNTAsIDQ2MjEzNTAsIDY0MjEzNTAsCisgICAgICAgIDEzNDYyNTAsIDMxNDYyNTAsIDE0MzYyNTAsIDQxMzYyNTAsIDM0MTYyNTAsIDQzMTYyNTAsIDEzNjQyNTAsIDMxNjQyNTAsIDE2MzQyNTAsIDYxMzQyNTAsIDM2MTQyNTAsIDYzMTQyNTAsCisgICAgICAgIDE0NjMyNTAsIDQxNjMyNTAsIDE2NDMyNTAsIDYxNDMyNTAsIDQ2MTMyNTAsIDY0MTMyNTAsIDM0NjEyNTAsIDQzNjEyNTAsIDM2NDEyNTAsIDYzNDEyNTAsIDQ2MzEyNTAsIDY0MzEyNTAsCisgICAgICAgIDIzNDYxNTAsIDMyNDYxNTAsIDI0MzYxNTAsIDQyMzYxNTAsIDM0MjYxNTAsIDQzMjYxNTAsIDIzNjQxNTAsIDMyNjQxNTAsIDI2MzQxNTAsIDYyMzQxNTAsIDM2MjQxNTAsIDYzMjQxNTAsCisgICAgICAgIDI0NjMxNTAsIDQyNjMxNTAsIDI2NDMxNTAsIDYyNDMxNTAsIDQ2MjMxNTAsIDY0MjMxNTAsIDM0NjIxNTAsIDQzNjIxNTAsIDM2NDIxNTAsIDYzNDIxNTAsIDQ2MzIxNTAsIDY0MzIxNTAsCisgICAgICAgIDEyMzU2NDAsIDIxMzU2NDAsIDEzMjU2NDAsIDMxMjU2NDAsIDIzMTU2NDAsIDMyMTU2NDAsIDEyNTM2NDAsIDIxNTM2NDAsIDE1MjM2NDAsIDUxMjM2NDAsIDI1MTM2NDAsIDUyMTM2NDAsCisgICAgICAgIDEzNTI2NDAsIDMxNTI2NDAsIDE1MzI2NDAsIDUxMzI2NDAsIDM1MTI2NDAsIDUzMTI2NDAsIDIzNTE2NDAsIDMyNTE2NDAsIDI1MzE2NDAsIDUyMzE2NDAsIDM1MjE2NDAsIDUzMjE2NDAsCisgICAgICAgIDEyMzY1NDAsIDIxMzY1NDAsIDEzMjY1NDAsIDMxMjY1NDAsIDIzMTY1NDAsIDMyMTY1NDAsIDEyNjM1NDAsIDIxNjM1NDAsIDE2MjM1NDAsIDYxMjM1NDAsIDI2MTM1NDAsIDYyMTM1NDAsCisgICAgICAgIDEzNjI1NDAsIDMxNjI1NDAsIDE2MzI1NDAsIDYxMzI1NDAsIDM2MTI1NDAsIDYzMTI1NDAsIDIzNjE1NDAsIDMyNjE1NDAsIDI2MzE1NDAsIDYyMzE1NDAsIDM2MjE1NDAsIDYzMjE1NDAsCisgICAgICAgIDEyNTYzNDAsIDIxNTYzNDAsIDE1MjYzNDAsIDUxMjYzNDAsIDI1MTYzNDAsIDUyMTYzNDAsIDEyNjUzNDAsIDIxNjUzNDAsIDE2MjUzNDAsIDYxMjUzNDAsIDI2MTUzNDAsIDYyMTUzNDAsCisgICAgICAgIDE1NjIzNDAsIDUxNjIzNDAsIDE2NTIzNDAsIDYxNTIzNDAsIDU2MTIzNDAsIDY1MTIzNDAsIDI1NjEzNDAsIDUyNjEzNDAsIDI2NTEzNDAsIDYyNTEzNDAsIDU2MjEzNDAsIDY1MjEzNDAsCisgICAgICAgIDEzNTYyNDAsIDMxNTYyNDAsIDE1MzYyNDAsIDUxMzYyNDAsIDM1MTYyNDAsIDUzMTYyNDAsIDEzNjUyNDAsIDMxNjUyNDAsIDE2MzUyNDAsIDYxMzUyNDAsIDM2MTUyNDAsIDYzMTUyNDAsCisgICAgICAgIDE1NjMyNDAsIDUxNjMyNDAsIDE2NTMyNDAsIDYxNTMyNDAsIDU2MTMyNDAsIDY1MTMyNDAsIDM1NjEyNDAsIDUzNjEyNDAsIDM2NTEyNDAsIDYzNTEyNDAsIDU2MzEyNDAsIDY1MzEyNDAsCisgICAgICAgIDIzNTYxNDAsIDMyNTYxNDAsIDI1MzYxNDAsIDUyMzYxNDAsIDM1MjYxNDAsIDUzMjYxNDAsIDIzNjUxNDAsIDMyNjUxNDAsIDI2MzUxNDAsIDYyMzUxNDAsIDM2MjUxNDAsIDYzMjUxNDAsCisgICAgICAgIDI1NjMxNDAsIDUyNjMxNDAsIDI2NTMxNDAsIDYyNTMxNDAsIDU2MjMxNDAsIDY1MjMxNDAsIDM1NjIxNDAsIDUzNjIxNDAsIDM2NTIxNDAsIDYzNTIxNDAsIDU2MzIxNDAsIDY1MzIxNDAsCisgICAgICAgIDEyNDU2MzAsIDIxNDU2MzAsIDE0MjU2MzAsIDQxMjU2MzAsIDI0MTU2MzAsIDQyMTU2MzAsIDEyNTQ2MzAsIDIxNTQ2MzAsIDE1MjQ2MzAsIDUxMjQ2MzAsIDI1MTQ2MzAsIDUyMTQ2MzAsCisgICAgICAgIDE0NTI2MzAsIDQxNTI2MzAsIDE1NDI2MzAsIDUxNDI2MzAsIDQ1MTI2MzAsIDU0MTI2MzAsIDI0NTE2MzAsIDQyNTE2MzAsIDI1NDE2MzAsIDUyNDE2MzAsIDQ1MjE2MzAsIDU0MjE2MzAsCisgICAgICAgIDEyNDY1MzAsIDIxNDY1MzAsIDE0MjY1MzAsIDQxMjY1MzAsIDI0MTY1MzAsIDQyMTY1MzAsIDEyNjQ1MzAsIDIxNjQ1MzAsIDE2MjQ1MzAsIDYxMjQ1MzAsIDI2MTQ1MzAsIDYyMTQ1MzAsCisgICAgICAgIDE0NjI1MzAsIDQxNjI1MzAsIDE2NDI1MzAsIDYxNDI1MzAsIDQ2MTI1MzAsIDY0MTI1MzAsIDI0NjE1MzAsIDQyNjE1MzAsIDI2NDE1MzAsIDYyNDE1MzAsIDQ2MjE1MzAsIDY0MjE1MzAsCisgICAgICAgIDEyNTY0MzAsIDIxNTY0MzAsIDE1MjY0MzAsIDUxMjY0MzAsIDI1MTY0MzAsIDUyMTY0MzAsIDEyNjU0MzAsIDIxNjU0MzAsIDE2MjU0MzAsIDYxMjU0MzAsIDI2MTU0MzAsIDYyMTU0MzAsCisgICAgICAgIDE1NjI0MzAsIDUxNjI0MzAsIDE2NTI0MzAsIDYxNTI0MzAsIDU2MTI0MzAsIDY1MTI0MzAsIDI1NjE0MzAsIDUyNjE0MzAsIDI2NTE0MzAsIDYyNTE0MzAsIDU2MjE0MzAsIDY1MjE0MzAsCisgICAgICAgIDE0NTYyMzAsIDQxNTYyMzAsIDE1NDYyMzAsIDUxNDYyMzAsIDQ1MTYyMzAsIDU0MTYyMzAsIDE0NjUyMzAsIDQxNjUyMzAsIDE2NDUyMzAsIDYxNDUyMzAsIDQ2MTUyMzAsIDY0MTUyMzAsCisgICAgICAgIDE1NjQyMzAsIDUxNjQyMzAsIDE2NTQyMzAsIDYxNTQyMzAsIDU2MTQyMzAsIDY1MTQyMzAsIDQ1NjEyMzAsIDU0NjEyMzAsIDQ2NTEyMzAsIDY0NTEyMzAsIDU2NDEyMzAsIDY1NDEyMzAsCisgICAgICAgIDI0NTYxMzAsIDQyNTYxMzAsIDI1NDYxMzAsIDUyNDYxMzAsIDQ1MjYxMzAsIDU0MjYxMzAsIDI0NjUxMzAsIDQyNjUxMzAsIDI2NDUxMzAsIDYyNDUxMzAsIDQ2MjUxMzAsIDY0MjUxMzAsCisgICAgICAgIDI1NjQxMzAsIDUyNjQxMzAsIDI2NTQxMzAsIDYyNTQxMzAsIDU2MjQxMzAsIDY1MjQxMzAsIDQ1NjIxMzAsIDU0NjIxMzAsIDQ2NTIxMzAsIDY0NTIxMzAsIDU2NDIxMzAsIDY1NDIxMzAsCisgICAgICAgIDEzNDU2MjAsIDMxNDU2MjAsIDE0MzU2MjAsIDQxMzU2MjAsIDM0MTU2MjAsIDQzMTU2MjAsIDEzNTQ2MjAsIDMxNTQ2MjAsIDE1MzQ2MjAsIDUxMzQ2MjAsIDM1MTQ2MjAsIDUzMTQ2MjAsCisgICAgICAgIDE0NTM2MjAsIDQxNTM2MjAsIDE1NDM2MjAsIDUxNDM2MjAsIDQ1MTM2MjAsIDU0MTM2MjAsIDM0NTE2MjAsIDQzNTE2MjAsIDM1NDE2MjAsIDUzNDE2MjAsIDQ1MzE2MjAsIDU0MzE2MjAsCisgICAgICAgIDEzNDY1MjAsIDMxNDY1MjAsIDE0MzY1MjAsIDQxMzY1MjAsIDM0MTY1MjAsIDQzMTY1MjAsIDEzNjQ1MjAsIDMxNjQ1MjAsIDE2MzQ1MjAsIDYxMzQ1MjAsIDM2MTQ1MjAsIDYzMTQ1MjAsCisgICAgICAgIDE0NjM1MjAsIDQxNjM1MjAsIDE2NDM1MjAsIDYxNDM1MjAsIDQ2MTM1MjAsIDY0MTM1MjAsIDM0NjE1MjAsIDQzNjE1MjAsIDM2NDE1MjAsIDYzNDE1MjAsIDQ2MzE1MjAsIDY0MzE1MjAsCisgICAgICAgIDEzNTY0MjAsIDMxNTY0MjAsIDE1MzY0MjAsIDUxMzY0MjAsIDM1MTY0MjAsIDUzMTY0MjAsIDEzNjU0MjAsIDMxNjU0MjAsIDE2MzU0MjAsIDYxMzU0MjAsIDM2MTU0MjAsIDYzMTU0MjAsCisgICAgICAgIDE1NjM0MjAsIDUxNjM0MjAsIDE2NTM0MjAsIDYxNTM0MjAsIDU2MTM0MjAsIDY1MTM0MjAsIDM1NjE0MjAsIDUzNjE0MjAsIDM2NTE0MjAsIDYzNTE0MjAsIDU2MzE0MjAsIDY1MzE0MjAsCisgICAgICAgIDE0NTYzMjAsIDQxNTYzMjAsIDE1NDYzMjAsIDUxNDYzMjAsIDQ1MTYzMjAsIDU0MTYzMjAsIDE0NjUzMjAsIDQxNjUzMjAsIDE2NDUzMjAsIDYxNDUzMjAsIDQ2MTUzMjAsIDY0MTUzMjAsCisgICAgICAgIDE1NjQzMjAsIDUxNjQzMjAsIDE2NTQzMjAsIDYxNTQzMjAsIDU2MTQzMjAsIDY1MTQzMjAsIDQ1NjEzMjAsIDU0NjEzMjAsIDQ2NTEzMjAsIDY0NTEzMjAsIDU2NDEzMjAsIDY1NDEzMjAsCisgICAgICAgIDM0NTYxMjAsIDQzNTYxMjAsIDM1NDYxMjAsIDUzNDYxMjAsIDQ1MzYxMjAsIDU0MzYxMjAsIDM0NjUxMjAsIDQzNjUxMjAsIDM2NDUxMjAsIDYzNDUxMjAsIDQ2MzUxMjAsIDY0MzUxMjAsCisgICAgICAgIDM1NjQxMjAsIDUzNjQxMjAsIDM2NTQxMjAsIDYzNTQxMjAsIDU2MzQxMjAsIDY1MzQxMjAsIDQ1NjMxMjAsIDU0NjMxMjAsIDQ2NTMxMjAsIDY0NTMxMjAsIDU2NDMxMjAsIDY1NDMxMjAsCisgICAgICAgIDIzNDU2MTAsIDMyNDU2MTAsIDI0MzU2MTAsIDQyMzU2MTAsIDM0MjU2MTAsIDQzMjU2MTAsIDIzNTQ2MTAsIDMyNTQ2MTAsIDI1MzQ2MTAsIDUyMzQ2MTAsIDM1MjQ2MTAsIDUzMjQ2MTAsCisgICAgICAgIDI0NTM2MTAsIDQyNTM2MTAsIDI1NDM2MTAsIDUyNDM2MTAsIDQ1MjM2MTAsIDU0MjM2MTAsIDM0NTI2MTAsIDQzNTI2MTAsIDM1NDI2MTAsIDUzNDI2MTAsIDQ1MzI2MTAsIDU0MzI2MTAsCisgICAgICAgIDIzNDY1MTAsIDMyNDY1MTAsIDI0MzY1MTAsIDQyMzY1MTAsIDM0MjY1MTAsIDQzMjY1MTAsIDIzNjQ1MTAsIDMyNjQ1MTAsIDI2MzQ1MTAsIDYyMzQ1MTAsIDM2MjQ1MTAsIDYzMjQ1MTAsCisgICAgICAgIDI0NjM1MTAsIDQyNjM1MTAsIDI2NDM1MTAsIDYyNDM1MTAsIDQ2MjM1MTAsIDY0MjM1MTAsIDM0NjI1MTAsIDQzNjI1MTAsIDM2NDI1MTAsIDYzNDI1MTAsIDQ2MzI1MTAsIDY0MzI1MTAsCisgICAgICAgIDIzNTY0MTAsIDMyNTY0MTAsIDI1MzY0MTAsIDUyMzY0MTAsIDM1MjY0MTAsIDUzMjY0MTAsIDIzNjU0MTAsIDMyNjU0MTAsIDI2MzU0MTAsIDYyMzU0MTAsIDM2MjU0MTAsIDYzMjU0MTAsCisgICAgICAgIDI1NjM0MTAsIDUyNjM0MTAsIDI2NTM0MTAsIDYyNTM0MTAsIDU2MjM0MTAsIDY1MjM0MTAsIDM1NjI0MTAsIDUzNjI0MTAsIDM2NTI0MTAsIDYzNTI0MTAsIDU2MzI0MTAsIDY1MzI0MTAsCisgICAgICAgIDI0NTYzMTAsIDQyNTYzMTAsIDI1NDYzMTAsIDUyNDYzMTAsIDQ1MjYzMTAsIDU0MjYzMTAsIDI0NjUzMTAsIDQyNjUzMTAsIDI2NDUzMTAsIDYyNDUzMTAsIDQ2MjUzMTAsIDY0MjUzMTAsCisgICAgICAgIDI1NjQzMTAsIDUyNjQzMTAsIDI2NTQzMTAsIDYyNTQzMTAsIDU2MjQzMTAsIDY1MjQzMTAsIDQ1NjIzMTAsIDU0NjIzMTAsIDQ2NTIzMTAsIDY0NTIzMTAsIDU2NDIzMTAsIDY1NDIzMTAsCisgICAgICAgIDM0NTYyMTAsIDQzNTYyMTAsIDM1NDYyMTAsIDUzNDYyMTAsIDQ1MzYyMTAsIDU0MzYyMTAsIDM0NjUyMTAsIDQzNjUyMTAsIDM2NDUyMTAsIDYzNDUyMTAsIDQ2MzUyMTAsIDY0MzUyMTAsCisgICAgICAgIDM1NjQyMTAsIDUzNjQyMTAsIDM2NTQyMTAsIDYzNTQyMTAsIDU2MzQyMTAsIDY1MzQyMTAsIDQ1NjMyMTAsIDU0NjMyMTAsIDQ2NTMyMTAsIDY0NTMyMTAsIDU2NDMyMTAsIDY1NDMyMTB9OwogICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBpbnQ+IGV4cGVjdGVkOwotICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCA1MDQwOyBpKyspCi0gICAgICBleHBlY3RlZFtwcmVfZXhwZWN0ZWRbaV1dID0gMDsgLy8gZmxhZ3MgYXJlIDAsIGV2ZXJ5dGhpbmcgaXMgc3ltbWV0cmljIGhlcmUKKyAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgNTA0MDsgaSsrKSBleHBlY3RlZFtwcmVfZXhwZWN0ZWRbaV1dID0gMDsgIC8vIGZsYWdzIGFyZSAwLCBldmVyeXRoaW5nIGlzIHN5bW1ldHJpYyBoZXJlCiAKICAgICBWRVJJRlkoaXNEeW5Hcm91cChncm91cCkpOwogICAgIFZFUklGWV9JU19FUVVBTChncm91cC5zaXplKCksIDUwNDB1KTsKQEAgLTY1NSwxMCArNjQ1LDkgQEAKICAgfQogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X3RlbnNvcl9lcHNpbG9uKCkKLXsKLSAgU0dyb3VwPEFudGlTeW1tZXRyeTwwLDE+LCBBbnRpU3ltbWV0cnk8MSwyPj4gc3ltOwotICBUZW5zb3I8aW50LCAzPiBlcHNpbG9uKDMsMywzKTsKK3N0YXRpYyB2b2lkIHRlc3RfdGVuc29yX2Vwc2lsb24oKSB7CisgIFNHcm91cDxBbnRpU3ltbWV0cnk8MCwgMT4sIEFudGlTeW1tZXRyeTwxLCAyPj4gc3ltOworICBUZW5zb3I8aW50LCAzPiBlcHNpbG9uKDMsIDMsIDMpOwogCiAgIGVwc2lsb24uc2V0WmVybygpOwogICBzeW0oZXBzaWxvbiwgMCwgMSwgMikgPSAxOwpAQCAtNjY2LDE2ICs2NTUsMTUgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgewogICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyBrKyspIHsKLSAgICAgICAgVkVSSUZZX0lTX0VRVUFMKChlcHNpbG9uKGksaixrKSksICgtIChqIC0gaSkgKiAoayAtIGopICogKGkgLSBrKSAvIDIpICk7CisgICAgICAgIFZFUklGWV9JU19FUVVBTCgoZXBzaWxvbihpLCBqLCBrKSksICgtKGogLSBpKSAqIChrIC0gaikgKiAoaSAtIGspIC8gMikpOwogICAgICAgfQogICAgIH0KICAgfQogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X3RlbnNvcl9zeW0oKQotewotICBTR3JvdXA8U3ltbWV0cnk8MCwxPiwgU3ltbWV0cnk8MiwzPj4gc3ltOwotICBUZW5zb3I8aW50LCA0PiB0KDEwLDEwLDEwLDEwKTsKK3N0YXRpYyB2b2lkIHRlc3RfdGVuc29yX3N5bSgpIHsKKyAgU0dyb3VwPFN5bW1ldHJ5PDAsIDE+LCBTeW1tZXRyeTwyLCAzPj4gc3ltOworICBUZW5zb3I8aW50LCA0PiB0KDEwLCAxMCwgMTAsIDEwKTsKIAogICB0LnNldFplcm8oKTsKIApAQCAtNjk4LDEzICs2ODYsMTEgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLQogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X3RlbnNvcl9hc3ltKCkKLXsKLSAgU0dyb3VwPEFudGlTeW1tZXRyeTwwLDE+LCBBbnRpU3ltbWV0cnk8MiwzPj4gc3ltOwotICBUZW5zb3I8aW50LCA0PiB0KDEwLDEwLDEwLDEwKTsKK3N0YXRpYyB2b2lkIHRlc3RfdGVuc29yX2FzeW0oKSB7CisgIFNHcm91cDxBbnRpU3ltbWV0cnk8MCwgMT4sIEFudGlTeW1tZXRyeTwyLCAzPj4gc3ltOworICBUZW5zb3I8aW50LCA0PiB0KDEwLCAxMCwgMTAsIDEwKTsKIAogICB0LnNldFplcm8oKTsKIApAQCAtNzI3LDkgKzcxMyw5IEBACiAgICAgICAgICAgZWxzZSBpZiAoaSA+IGogJiYgayA+IGwpCiAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoKHQoaSwgaiwgaywgbCkpLCAoKChpICogaikgKyAoayAqIGwpKSkpOwogICAgICAgICAgIGVsc2UgaWYgKGkgPCBqICYmIGsgPiBsKQotICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKCh0KGksIGosIGssIGwpKSwgKC0gKChpICogaikgKyAoayAqIGwpKSkpOworICAgICAgICAgICAgVkVSSUZZX0lTX0VRVUFMKCh0KGksIGosIGssIGwpKSwgKC0oKGkgKiBqKSArIChrICogbCkpKSk7CiAgICAgICAgICAgZWxzZSBpZiAoaSA+IGogJiYgayA8IGwpCi0gICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoKHQoaSwgaiwgaywgbCkpLCAoLSAoKGkgKiBqKSArIChrICogbCkpKSk7CisgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoKHQoaSwgaiwgaywgbCkpLCAoLSgoaSAqIGopICsgKGsgKiBsKSkpKTsKICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICBWRVJJRllfSVNfRVFVQUwoKHQoaSwgaiwgaywgbCkpLCAwKTsKICAgICAgICAgfQpAQCAtNzM4LDEyICs3MjQsMTEgQEAKICAgfQogfQogCi1zdGF0aWMgdm9pZCB0ZXN0X3RlbnNvcl9keW5zeW0oKQoteworc3RhdGljIHZvaWQgdGVzdF90ZW5zb3JfZHluc3ltKCkgewogICBEeW5hbWljU0dyb3VwIHN5bTsKLSAgc3ltLmFkZFN5bW1ldHJ5KDAsMSk7Ci0gIHN5bS5hZGRTeW1tZXRyeSgyLDMpOwotICBUZW5zb3I8aW50LCA0PiB0KDEwLDEwLDEwLDEwKTsKKyAgc3ltLmFkZFN5bW1ldHJ5KDAsIDEpOworICBzeW0uYWRkU3ltbWV0cnkoMiwgMyk7CisgIFRlbnNvcjxpbnQsIDQ+IHQoMTAsIDEwLCAxMCwgMTApOwogCiAgIHQuc2V0WmVybygpOwogCkBAIC03NjgsMTAgKzc1Myw5IEBACiAgIH0KIH0KIAotc3RhdGljIHZvaWQgdGVzdF90ZW5zb3JfcmFuZGFjYygpCi17Ci0gIFNHcm91cDxTeW1tZXRyeTwwLDE+LCBTeW1tZXRyeTwyLDM+PiBzeW07Ci0gIFRlbnNvcjxpbnQsIDQ+IHQoMTAsMTAsMTAsMTApOworc3RhdGljIHZvaWQgdGVzdF90ZW5zb3JfcmFuZGFjYygpIHsKKyAgU0dyb3VwPFN5bW1ldHJ5PDAsIDE+LCBTeW1tZXRyeTwyLCAzPj4gc3ltOworICBUZW5zb3I8aW50LCA0PiB0KDEwLCAxMCwgMTAsIDEwKTsKIAogICB0LnNldFplcm8oKTsKIApAQCAtNzgzLDEwICs3NjcsOCBAQAogICAgIGludCBrID0gcmFuZCgpICUgMTA7CiAgICAgaW50IGwgPSByYW5kKCkgJSAxMDsKICAgICAvLyBvbmx5IGFjY2VzcyB0aG9zZSBpbmRpY2VzIGluIGEgZ2l2ZW4gb3JkZXIKLSAgICBpZiAoaSA8IGopCi0gICAgICBzdGQ6OnN3YXAoaSwgaik7Ci0gICAgaWYgKGsgPCBsKQotICAgICAgc3RkOjpzd2FwKGssIGwpOworICAgIGlmIChpIDwgaikgc3RkOjpzd2FwKGksIGopOworICAgIGlmIChrIDwgbCkgc3RkOjpzd2FwKGssIGwpOwogICAgIHN5bSh0LCBpLCBqLCBrLCBsKSA9IChpICsgaikgKiAoayArIGwpOwogICB9CiAKQEAgLTgwMSw4ICs3ODMsNyBAQAogICB9CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3Jfc3ltbWV0cnkpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3N5bW1ldHJ5KSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3N5bWdyb3Vwc19zdGF0aWMoKSk7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3N5bWdyb3Vwc19keW5hbWljKCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF9zeW1ncm91cHNfc2VsZWN0aW9uKCkpOwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfdGhyZWFkX2xvY2FsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3RocmVhZF9sb2NhbC5jcHAKaW5kZXggZWM5ZDljYS4uMzJiYTJjZCAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfdGhyZWFkX2xvY2FsLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl90aHJlYWRfbG9jYWwuY3BwCkBAIC0yOCw5ICsyOCw3IEBACiB9OwogCiBzdHJ1Y3QgSW5pdENvdW50ZXIgewotICB2b2lkIG9wZXJhdG9yKCkoQ291bnRlciYgY291bnRlcikgewotICAgIGNvdW50ZXIuY3JlYXRlZF9ieSA9IHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOwotICB9CisgIHZvaWQgb3BlcmF0b3IoKShDb3VudGVyJiBjb3VudGVyKSB7IGNvdW50ZXIuY3JlYXRlZF9ieSA9IHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOyB9CiB9OwogCiB2b2lkIHRlc3Rfc2ltcGxlX3RocmVhZF9sb2NhbCgpIHsKQEAgLTUzLDggKzUxLDcgQEAKIAogICBiYXJyaWVyLldhaXQoKTsKIAotICBjb3VudGVyLkZvckVhY2goCi0gICAgICBbXShzdGQ6OnRocmVhZDo6aWQsIENvdW50ZXImIGNudCkgeyBWRVJJRllfSVNfRVFVQUwoY250LnZhbHVlKCksIDMpOyB9KTsKKyAgY291bnRlci5Gb3JFYWNoKFtdKHN0ZDo6dGhyZWFkOjppZCwgQ291bnRlciYgY250KSB7IFZFUklGWV9JU19FUVVBTChjbnQudmFsdWUoKSwgMyk7IH0pOwogfQogCiB2b2lkIHRlc3RfemVyb19zaXplZF90aHJlYWRfbG9jYWwoKSB7CkBAIC0xMDIsOCArOTksNyBAQAogICBWRVJJRllfSVNfRVFVQUwodG90YWwsIG51bV90YXNrcyk7CiAgIC8vIE5vdCBhbGwgdGhyZWFkcyBpbiBhIHBvb2wgbWlnaHQgYmUgd29rZW4gdXAgdG8gZXhlY3V0ZSBzdWJtaXR0ZWQgdGFza3MuCiAgIC8vIEFsc28gdGhyZWFkX3Bvb2wuU2NoZWR1bGUoKSBtaWdodCB1c2UgY3VycmVudCB0aHJlYWQgaWYgcXVldWUgaXMgZnVsbC4KLSAgVkVSSUZZX0lTX0VRVUFMKAotICAgICAgdW5pcXVlX3RocmVhZHMuc2l6ZSgpIDw9IChzdGF0aWNfY2FzdDxzaXplX3Q+KG51bV90aHJlYWRzICsgMSkpLCB0cnVlKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHVuaXF1ZV90aHJlYWRzLnNpemUoKSA8PSAoc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1fdGhyZWFkcyArIDEpKSwgdHJ1ZSk7CiB9CiAKIC8vIExvY2sgZnJlZSB0aHJlYWQgbG9jYWwgc3RvcmFnZSBpcyB0b28gc21hbGwgdG8gZml0IGFsbCB0aGUgdW5pcXVlIHRocmVhZHMsCkBAIC0xMzcsOCArMTMzLDcgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHRvdGFsLCBudW1fdGFza3MpOwogICAvLyBOb3QgYWxsIHRocmVhZHMgaW4gYSBwb29sIG1pZ2h0IGJlIHdva2VuIHVwIHRvIGV4ZWN1dGUgc3VibWl0dGVkIHRhc2tzLgogICAvLyBBbHNvIHRocmVhZF9wb29sLlNjaGVkdWxlKCkgbWlnaHQgdXNlIGN1cnJlbnQgdGhyZWFkIGlmIHF1ZXVlIGlzIGZ1bGwuCi0gIFZFUklGWV9JU19FUVVBTCgKLSAgICAgIHVuaXF1ZV90aHJlYWRzLnNpemUoKSA8PSAoc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1fdGhyZWFkcyArIDEpKSwgdHJ1ZSk7CisgIFZFUklGWV9JU19FUVVBTCh1bmlxdWVfdGhyZWFkcy5zaXplKCkgPD0gKHN0YXRpY19jYXN0PHNpemVfdD4obnVtX3RocmVhZHMgKyAxKSksIHRydWUpOwogfQogCiBFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3RocmVhZF9sb2NhbCkgewpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfdGhyZWFkX3Bvb2wuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfdGhyZWFkX3Bvb2wuY3BwCmluZGV4IGI3NzJhMWQuLjg5NjFjODQgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3RocmVhZF9wb29sLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl90aHJlYWRfcG9vbC5jcHAKQEAgLTksNyArOSw2IEBACiAKICNkZWZpbmUgRUlHRU5fVVNFX1RIUkVBRFMKIAotCiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPEVpZ2VuL0NYWDExL1RlbnNvcj4KQEAgLTM2LDggKzM1LDcgQEAKICAgaW50IGRlYWxsb2NfY291bnRfID0gMDsKIH07CiAKLXZvaWQgdGVzdF9tdWx0aXRocmVhZF9lbGVtZW50d2lzZSgpCi17Cit2b2lkIHRlc3RfbXVsdGl0aHJlYWRfZWxlbWVudHdpc2UoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMz4gaW4xKDIwMCwgMzAsIDcwKTsKICAgVGVuc29yPGZsb2F0LCAzPiBpbjIoMjAwLCAzMCwgNzApOwogICBUZW5zb3I8ZG91YmxlLCAzPiBvdXQoMjAwLCAzMCwgNzApOwpAQCAtNTgsOCArNTYsNyBAQAogICB9CiB9CiAKLXZvaWQgdGVzdF9hc3luY19tdWx0aXRocmVhZF9lbGVtZW50d2lzZSgpCi17Cit2b2lkIHRlc3RfYXN5bmNfbXVsdGl0aHJlYWRfZWxlbWVudHdpc2UoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMz4gaW4xKDIwMCwgMzAsIDcwKTsKICAgVGVuc29yPGZsb2F0LCAzPiBpbjIoMjAwLCAzMCwgNzApOwogICBUZW5zb3I8ZG91YmxlLCAzPiBvdXQoMjAwLCAzMCwgNzApOwpAQCAtODMsMTEgKzgwLDEwIEBACiAgIH0KIH0KIAotdm9pZCB0ZXN0X211bHRpdGhyZWFkX2NvbXBvdW5kX2Fzc2lnbm1lbnQoKQotewotICBUZW5zb3I8ZmxvYXQsIDM+IGluMSgyLDMsNyk7Ci0gIFRlbnNvcjxmbG9hdCwgMz4gaW4yKDIsMyw3KTsKLSAgVGVuc29yPGZsb2F0LCAzPiBvdXQoMiwzLDcpOwordm9pZCB0ZXN0X211bHRpdGhyZWFkX2NvbXBvdW5kX2Fzc2lnbm1lbnQoKSB7CisgIFRlbnNvcjxmbG9hdCwgMz4gaW4xKDIsIDMsIDcpOworICBUZW5zb3I8ZmxvYXQsIDM+IGluMigyLCAzLCA3KTsKKyAgVGVuc29yPGZsb2F0LCAzPiBvdXQoMiwgMywgNyk7CiAKICAgaW4xLnNldFJhbmRvbSgpOwogICBpbjIuc2V0UmFuZG9tKCk7CkBAIC0xMDAsMTUgKzk2LDE0IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNzsgKytrKSB7Ci0gICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksaixrKSwgaW4xKGksaixrKSArIGluMihpLGosaykgKiAzLjE0Zik7CisgICAgICAgIFZFUklGWV9JU19BUFBST1gob3V0KGksIGosIGspLCBpbjEoaSwgaiwgaykgKyBpbjIoaSwgaiwgaykgKiAzLjE0Zik7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotdm9pZCB0ZXN0X211bHRpdGhyZWFkX2NvbnRyYWN0aW9uKCkKLXsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3ZvaWQgdGVzdF9tdWx0aXRocmVhZF9jb250cmFjdGlvbigpIHsKICAgVGVuc29yPGZsb2F0LCA0LCBEYXRhTGF5b3V0PiB0X2xlZnQoMzAsIDUwLCAzNywgMzEpOwogICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHRfcmlnaHQoMzcsIDMxLCA3MCwgMiwgMTApOwogICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHRfcmVzdWx0KDMwLCA1MCwgNzAsIDIsIDEwKTsKQEAgLTEzMiw3ICsxMjcsNyBAQAogICB0X3Jlc3VsdC5kZXZpY2UodGhyZWFkX3Bvb2xfZGV2aWNlKSA9IHRfbGVmdC5jb250cmFjdCh0X3JpZ2h0LCBkaW1zKTsKICAgbV9yZXN1bHQgPSBtX2xlZnQgKiBtX3JpZ2h0OwogCi0gZm9yIChwdHJkaWZmX3QgaSA9IDA7IGkgPCB0X3Jlc3VsdC5zaXplKCk7IGkrKykgeworICBmb3IgKHB0cmRpZmZfdCBpID0gMDsgaSA8IHRfcmVzdWx0LnNpemUoKTsgaSsrKSB7CiAgICAgVkVSSUZZKCZ0X3Jlc3VsdC5kYXRhKClbaV0gIT0gJm1fcmVzdWx0LmRhdGEoKVtpXSk7CiAgICAgaWYgKGZhYnNmKHRfcmVzdWx0KGkpIC0gbV9yZXN1bHQoaSkpIDwgMWUtNGYpIHsKICAgICAgIGNvbnRpbnVlOwpAQCAtMTQwLDE4ICsxMzUsMTYgQEAKICAgICBpZiAoRWlnZW46OmludGVybmFsOjppc0FwcHJveCh0X3Jlc3VsdChpKSwgbV9yZXN1bHQoaSksIDFlLTRmKSkgewogICAgICAgY29udGludWU7CiAgICAgfQotICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICI6ICIgPDwgdF9yZXN1bHQoaSkKLSAgICAgICAgICAgICAgPDwgIiB2cyAiIDw8ICBtX3Jlc3VsdChpKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8ICJtaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIjogIiA8PCB0X3Jlc3VsdChpKSA8PCAiIHZzICIgPDwgbV9yZXN1bHQoaSkgPDwgc3RkOjplbmRsOwogICAgIGFzc2VydChmYWxzZSk7CiAgIH0KIH0KIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Ci12b2lkIHRlc3RfY29udHJhY3Rpb25fY29ybmVyX2Nhc2VzKCkKLXsKK3RlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KK3ZvaWQgdGVzdF9jb250cmFjdGlvbl9jb3JuZXJfY2FzZXMoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gdF9sZWZ0KDMyLCA1MDApOwotICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHRfcmlnaHQoMzIsIDI4KjI4KTsKLSAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0X3Jlc3VsdCg1MDAsIDI4KjI4KTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0X3JpZ2h0KDMyLCAyOCAqIDI4KTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiB0X3Jlc3VsdCg1MDAsIDI4ICogMjgpOwogCiAgIHRfbGVmdCA9ICh0X2xlZnQuY29uc3RhbnQoLTAuNWYpICsgdF9sZWZ0LnJhbmRvbSgpKSAqIDIuMGY7CiAgIHRfcmlnaHQgPSAodF9yaWdodC5jb25zdGFudCgtMC42ZikgKyB0X3JpZ2h0LnJhbmRvbSgpKSAqIDIuMGY7CkBAIC0xNjMsOCArMTU2LDggQEAKIAogICB0eXBlZGVmIE1hcDxNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIERhdGFMYXlvdXQ+PiBNYXBYZjsKICAgTWFwWGYgbV9sZWZ0KHRfbGVmdC5kYXRhKCksIDMyLCA1MDApOwotICBNYXBYZiBtX3JpZ2h0KHRfcmlnaHQuZGF0YSgpLCAzMiwgMjgqMjgpOwotICBNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIER5bmFtaWMsIERhdGFMYXlvdXQ+IG1fcmVzdWx0KDUwMCwgMjgqMjgpOworICBNYXBYZiBtX3JpZ2h0KHRfcmlnaHQuZGF0YSgpLCAzMiwgMjggKiAyOCk7CisgIE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgRGF0YUxheW91dD4gbV9yZXN1bHQoNTAwLCAyOCAqIDI4KTsKIAogICBFaWdlbjo6VGhyZWFkUG9vbCB0cCgxMik7CiAgIEVpZ2VuOjpUaHJlYWRQb29sRGV2aWNlIHRocmVhZF9wb29sX2RldmljZSgmdHAsIDEyKTsKQEAgLTE3NiwyMiArMTY5LDIzIEBACiAgIGZvciAocHRyZGlmZl90IGkgPSAwOyBpIDwgdF9yZXN1bHQuc2l6ZSgpOyBpKyspIHsKICAgICBhc3NlcnQoIShudW1leHQ6OmlzbmFuKSh0X3Jlc3VsdC5kYXRhKClbaV0pKTsKICAgICBpZiAoZmFic2YodF9yZXN1bHQuZGF0YSgpW2ldIC0gbV9yZXN1bHQuZGF0YSgpW2ldKSA+PSAxZS00ZikgewotICAgICAgc3RkOjpjb3V0IDw8ICJtaXNtYXRjaCBkZXRlY3RlZCBhdCBpbmRleCAiIDw8IGkgPDwgIiA6ICIgPDwgdF9yZXN1bHQuZGF0YSgpW2ldIDw8ICIgdnMgIiA8PCAgbV9yZXN1bHQuZGF0YSgpW2ldIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCAibWlzbWF0Y2ggZGV0ZWN0ZWQgYXQgaW5kZXggIiA8PCBpIDw8ICIgOiAiIDw8IHRfcmVzdWx0LmRhdGEoKVtpXSA8PCAiIHZzICIgPDwgbV9yZXN1bHQuZGF0YSgpW2ldCisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICAgICAgYXNzZXJ0KGZhbHNlKTsKICAgICB9CiAgIH0KIAogICB0X2xlZnQucmVzaXplKDMyLCAxKTsKICAgdF9sZWZ0ID0gKHRfbGVmdC5jb25zdGFudCgtMC41ZikgKyB0X2xlZnQucmFuZG9tKCkpICogMi4wZjsKLSAgdF9yZXN1bHQucmVzaXplICgxLCAyOCoyOCk7CisgIHRfcmVzdWx0LnJlc2l6ZSgxLCAyOCAqIDI4KTsKICAgdF9yZXN1bHQgPSB0X3Jlc3VsdC5jb25zdGFudChOQU4pOwogICB0X3Jlc3VsdC5kZXZpY2UodGhyZWFkX3Bvb2xfZGV2aWNlKSA9IHRfbGVmdC5jb250cmFjdCh0X3JpZ2h0LCBkaW1zKTsKLSAgbmV3KCZtX2xlZnQpIE1hcFhmKHRfbGVmdC5kYXRhKCksIDMyLCAxKTsKKyAgbmV3ICgmbV9sZWZ0KSBNYXBYZih0X2xlZnQuZGF0YSgpLCAzMiwgMSk7CiAgIG1fcmVzdWx0ID0gbV9sZWZ0LnRyYW5zcG9zZSgpICogbV9yaWdodDsKICAgZm9yIChwdHJkaWZmX3QgaSA9IDA7IGkgPCB0X3Jlc3VsdC5zaXplKCk7IGkrKykgewogICAgIGFzc2VydCghKG51bWV4dDo6aXNuYW4pKHRfcmVzdWx0LmRhdGEoKVtpXSkpOwogICAgIGlmIChmYWJzZih0X3Jlc3VsdC5kYXRhKClbaV0gLSBtX3Jlc3VsdC5kYXRhKClbaV0pID49IDFlLTRmKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIm1pc21hdGNoIGRldGVjdGVkOiAiIDw8IHRfcmVzdWx0LmRhdGEoKVtpXSA8PCAiIHZzICIgPDwgIG1fcmVzdWx0LmRhdGEoKVtpXSA8PCBzdGQ6OmVuZGw7CisgICAgICBzdGQ6OmNvdXQgPDwgIm1pc21hdGNoIGRldGVjdGVkOiAiIDw8IHRfcmVzdWx0LmRhdGEoKVtpXSA8PCAiIHZzICIgPDwgbV9yZXN1bHQuZGF0YSgpW2ldIDw8IHN0ZDo6ZW5kbDsKICAgICAgIGFzc2VydChmYWxzZSk7CiAgICAgfQogICB9CkBAIC0yMDAsMTYgKzE5NCwxNiBAQAogICB0X3JpZ2h0LnJlc2l6ZSgzMiwgNCk7CiAgIHRfbGVmdCA9ICh0X2xlZnQuY29uc3RhbnQoLTAuNWYpICsgdF9sZWZ0LnJhbmRvbSgpKSAqIDIuMGY7CiAgIHRfcmlnaHQgPSAodF9yaWdodC5jb25zdGFudCgtMC42ZikgKyB0X3JpZ2h0LnJhbmRvbSgpKSAqIDIuMGY7Ci0gIHRfcmVzdWx0LnJlc2l6ZSAoNTAwLCA0KTsKKyAgdF9yZXN1bHQucmVzaXplKDUwMCwgNCk7CiAgIHRfcmVzdWx0ID0gdF9yZXN1bHQuY29uc3RhbnQoTkFOKTsKICAgdF9yZXN1bHQuZGV2aWNlKHRocmVhZF9wb29sX2RldmljZSkgPSB0X2xlZnQuY29udHJhY3QodF9yaWdodCwgZGltcyk7Ci0gIG5ldygmbV9sZWZ0KSBNYXBYZih0X2xlZnQuZGF0YSgpLCAzMiwgNTAwKTsKLSAgbmV3KCZtX3JpZ2h0KSBNYXBYZih0X3JpZ2h0LmRhdGEoKSwgMzIsIDQpOworICBuZXcgKCZtX2xlZnQpIE1hcFhmKHRfbGVmdC5kYXRhKCksIDMyLCA1MDApOworICBuZXcgKCZtX3JpZ2h0KSBNYXBYZih0X3JpZ2h0LmRhdGEoKSwgMzIsIDQpOwogICBtX3Jlc3VsdCA9IG1fbGVmdC50cmFuc3Bvc2UoKSAqIG1fcmlnaHQ7CiAgIGZvciAocHRyZGlmZl90IGkgPSAwOyBpIDwgdF9yZXN1bHQuc2l6ZSgpOyBpKyspIHsKICAgICBhc3NlcnQoIShudW1leHQ6OmlzbmFuKSh0X3Jlc3VsdC5kYXRhKClbaV0pKTsKICAgICBpZiAoZmFic2YodF9yZXN1bHQuZGF0YSgpW2ldIC0gbV9yZXN1bHQuZGF0YSgpW2ldKSA+PSAxZS00ZikgewotICAgICAgc3RkOjpjb3V0IDw8ICJtaXNtYXRjaCBkZXRlY3RlZDogIiA8PCB0X3Jlc3VsdC5kYXRhKClbaV0gPDwgIiB2cyAiIDw8ICBtX3Jlc3VsdC5kYXRhKClbaV0gPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8ICJtaXNtYXRjaCBkZXRlY3RlZDogIiA8PCB0X3Jlc3VsdC5kYXRhKClbaV0gPDwgIiB2cyAiIDw8IG1fcmVzdWx0LmRhdGEoKVtpXSA8PCBzdGQ6OmVuZGw7CiAgICAgICBhc3NlcnQoZmFsc2UpOwogICAgIH0KICAgfQpAQCAtMjE4LDMyICsyMTIsMjggQEAKICAgdF9yaWdodC5yZXNpemUoMzIsIDQpOwogICB0X2xlZnQgPSAodF9sZWZ0LmNvbnN0YW50KC0wLjVmKSArIHRfbGVmdC5yYW5kb20oKSkgKiAyLjBmOwogICB0X3JpZ2h0ID0gKHRfcmlnaHQuY29uc3RhbnQoLTAuNmYpICsgdF9yaWdodC5yYW5kb20oKSkgKiAyLjBmOwotICB0X3Jlc3VsdC5yZXNpemUgKDEsIDQpOworICB0X3Jlc3VsdC5yZXNpemUoMSwgNCk7CiAgIHRfcmVzdWx0ID0gdF9yZXN1bHQuY29uc3RhbnQoTkFOKTsKICAgdF9yZXN1bHQuZGV2aWNlKHRocmVhZF9wb29sX2RldmljZSkgPSB0X2xlZnQuY29udHJhY3QodF9yaWdodCwgZGltcyk7Ci0gIG5ldygmbV9sZWZ0KSBNYXBYZih0X2xlZnQuZGF0YSgpLCAzMiwgMSk7Ci0gIG5ldygmbV9yaWdodCkgTWFwWGYodF9yaWdodC5kYXRhKCksIDMyLCA0KTsKKyAgbmV3ICgmbV9sZWZ0KSBNYXBYZih0X2xlZnQuZGF0YSgpLCAzMiwgMSk7CisgIG5ldyAoJm1fcmlnaHQpIE1hcFhmKHRfcmlnaHQuZGF0YSgpLCAzMiwgNCk7CiAgIG1fcmVzdWx0ID0gbV9sZWZ0LnRyYW5zcG9zZSgpICogbV9yaWdodDsKICAgZm9yIChwdHJkaWZmX3QgaSA9IDA7IGkgPCB0X3Jlc3VsdC5zaXplKCk7IGkrKykgewogICAgIGFzc2VydCghKG51bWV4dDo6aXNuYW4pKHRfcmVzdWx0LmRhdGEoKVtpXSkpOwogICAgIGlmIChmYWJzZih0X3Jlc3VsdC5kYXRhKClbaV0gLSBtX3Jlc3VsdC5kYXRhKClbaV0pID49IDFlLTRmKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgIm1pc21hdGNoIGRldGVjdGVkOiAiIDw8IHRfcmVzdWx0LmRhdGEoKVtpXSA8PCAiIHZzICIgPDwgIG1fcmVzdWx0LmRhdGEoKVtpXSA8PCBzdGQ6OmVuZGw7CisgICAgICBzdGQ6OmNvdXQgPDwgIm1pc21hdGNoIGRldGVjdGVkOiAiIDw8IHRfcmVzdWx0LmRhdGEoKVtpXSA8PCAiIHZzICIgPDwgbV9yZXN1bHQuZGF0YSgpW2ldIDw8IHN0ZDo6ZW5kbDsKICAgICAgIGFzc2VydChmYWxzZSk7CiAgICAgfQogICB9CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0PgordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgogdm9pZCB0ZXN0X211bHRpdGhyZWFkX2NvbnRyYWN0aW9uX2FncmVlc193aXRoX3NpbmdsZXRocmVhZCgpIHsKICAgaW50IGNvbnRyYWN0X3NpemUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgNTAwMCk7CiAKLSAgVGVuc29yPGZsb2F0LCAzLCBEYXRhTGF5b3V0PiBsZWZ0KGludGVybmFsOjpyYW5kb208aW50PigxLCA4MCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFjdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDEwMCkpOworICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IGxlZnQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDgwKSwgY29udHJhY3Rfc2l6ZSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDEwMCkpOwogCi0gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gcmlnaHQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDI1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMzcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0X3NpemUsCisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gcmlnaHQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDI1KSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDM3KSwgY29udHJhY3Rfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgNTEpKTsKIAogICBsZWZ0LnNldFJhbmRvbSgpOwpAQCAtMjc4LDEwICsyNjgsOSBAQAogLy8gQXBwbHkgU3FydCB0byBhbGwgb3V0cHV0IGVsZW1lbnRzLgogc3RydWN0IFNxcnRPdXRwdXRLZXJuZWwgewogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5kZXgsIHR5cGVuYW1lIFNjYWxhcj4KLSAgRUlHRU5fQUxXQVlTX0lOTElORSB2b2lkIG9wZXJhdG9yKCkoCi0gICAgICBjb25zdCBpbnRlcm5hbDo6Ymxhc19kYXRhX21hcHBlcjxTY2FsYXIsIEluZGV4LCBDb2xNYWpvcj4mIG91dHB1dF9tYXBwZXIsCi0gICAgICBjb25zdCBUZW5zb3JDb250cmFjdGlvblBhcmFtcyYsIEluZGV4LCBJbmRleCwgSW5kZXggbnVtX3Jvd3MsCi0gICAgICBJbmRleCBudW1fY29scykgY29uc3QgeworICBFSUdFTl9BTFdBWVNfSU5MSU5FIHZvaWQgb3BlcmF0b3IoKShjb25zdCBpbnRlcm5hbDo6Ymxhc19kYXRhX21hcHBlcjxTY2FsYXIsIEluZGV4LCBDb2xNYWpvcj4mIG91dHB1dF9tYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbnNvckNvbnRyYWN0aW9uUGFyYW1zJiwgSW5kZXgsIEluZGV4LCBJbmRleCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggbnVtX2NvbHMpIGNvbnN0IHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9yb3dzOyArK2kpIHsKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtX2NvbHM7ICsraikgewogICAgICAgICBvdXRwdXRfbWFwcGVyKGksIGopID0gc3RkOjpzcXJ0KG91dHB1dF9tYXBwZXIoaSwgaikpOwpAQCAtMzMwLDE4ICszMTksMTQgQEAKICAgfQogfQogCi10ZW1wbGF0ZTxpbnQgRGF0YUxheW91dD4KLXZvaWQgdGVzdF9hc3luY19tdWx0aXRocmVhZF9jb250cmFjdGlvbl9hZ3JlZXNfd2l0aF9zaW5nbGV0aHJlYWQoKQotewordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgordm9pZCB0ZXN0X2FzeW5jX211bHRpdGhyZWFkX2NvbnRyYWN0aW9uX2FncmVlc193aXRoX3NpbmdsZXRocmVhZCgpIHsKICAgaW50IGNvbnRyYWN0X3NpemUgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAwLCA1MDApOwogCi0gIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gbGVmdChpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsIDQwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsIDQwKSk7CisgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gbGVmdChpbnRlcm5hbDo6cmFuZG9tPGludD4oMTAsIDQwKSwgY29udHJhY3Rfc2l6ZSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEwLCA0MCkpOwogCi0gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gcmlnaHQoCi0gICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMjApLCBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMjApLCBjb250cmFjdF9zaXplLAotICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDIwKSk7CisgIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gcmlnaHQoaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDIwKSwgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDIwKSwgY29udHJhY3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMSwgMjApKTsKIAogICBsZWZ0LnNldFJhbmRvbSgpOwogICByaWdodC5zZXRSYW5kb20oKTsKQEAgLTM2Miw4ICszNDcsNyBAQAogICBUZW5zb3I8ZmxvYXQsIDUsIERhdGFMYXlvdXQ+IHRwX3Jlc3VsdChzdF9yZXN1bHQuZGltZW5zaW9ucygpKTsKIAogICBFaWdlbjo6QmFycmllciBiYXJyaWVyKDEpOwotICB0cF9yZXN1bHQuZGV2aWNlKHRocmVhZF9wb29sX2RldmljZSwgWyZiYXJyaWVyXSgpIHsgYmFycmllci5Ob3RpZnkoKTsgfSkgPQotICAgICAgbGVmdC5jb250cmFjdChyaWdodCwgZGltcyk7CisgIHRwX3Jlc3VsdC5kZXZpY2UodGhyZWFkX3Bvb2xfZGV2aWNlLCBbJmJhcnJpZXJdKCkgeyBiYXJyaWVyLk5vdGlmeSgpOyB9KSA9IGxlZnQuY29udHJhY3QocmlnaHQsIGRpbXMpOwogICBiYXJyaWVyLldhaXQoKTsKIAogICBWRVJJRlkoZGltZW5zaW9uc19tYXRjaChzdF9yZXN1bHQuZGltZW5zaW9ucygpLCB0cF9yZXN1bHQuZGltZW5zaW9ucygpKSk7CkBAIC0zNzgsOCArMzYyLDcgQEAKIAogLy8gV2UgYXJlIHRyaWdnZXJpbmcgJ2V2YWxTaGFyZGVkQnlJbm5lckRpbScgb3B0aW1pemF0aW9uLgogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgotc3RhdGljIHZvaWQgdGVzdF9zaGFyZGVkX2J5X2lubmVyX2RpbV9jb250cmFjdGlvbigpCi17CitzdGF0aWMgdm9pZCB0ZXN0X3NoYXJkZWRfYnlfaW5uZXJfZGltX2NvbnRyYWN0aW9uKCkgewogICB0eXBlZGVmIFRlbnNvcjxmbG9hdCwgMT46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKIAogICBjb25zdCBpbnQgbnVtX3RocmVhZHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oNCwgMTYpOwpAQCAtNDE4LDggKzQwMSw3IEBACiAKIC8vIFdlIGFyZSB0cmlnZ2VyaW5nICdldmFsU2hhcmRlZEJ5SW5uZXJEaW0nIG9wdGltaXphdGlvbiB3aXRoIG91dHB1dCBrZXJuZWwuCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X3NoYXJkZWRfYnlfaW5uZXJfZGltX2NvbnRyYWN0aW9uX3dpdGhfb3V0cHV0X2tlcm5lbCgpCi17CitzdGF0aWMgdm9pZCB0ZXN0X3NoYXJkZWRfYnlfaW5uZXJfZGltX2NvbnRyYWN0aW9uX3dpdGhfb3V0cHV0X2tlcm5lbCgpIHsKICAgdHlwZWRlZiBUZW5zb3I8ZmxvYXQsIDE+OjpEaW1lbnNpb25QYWlyIERpbVBhaXI7CiAKICAgY29uc3QgaW50IG51bV90aHJlYWRzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDQsIDE2KTsKQEAgLTQ1OCw4ICs0NDAsNyBAQAogCiAvLyBXZSBhcmUgdHJpZ2dlcmluZyAnZXZhbFNoYXJkZWRCeUlubmVyRGltJyBvcHRpbWl6YXRpb24uCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Ci1zdGF0aWMgdm9pZCB0ZXN0X2FzeW5jX3NoYXJkZWRfYnlfaW5uZXJfZGltX2NvbnRyYWN0aW9uKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfYXN5bmNfc2hhcmRlZF9ieV9pbm5lcl9kaW1fY29udHJhY3Rpb24oKSB7CiAgIHR5cGVkZWYgVGVuc29yPGZsb2F0LCAxPjo6RGltZW5zaW9uUGFpciBEaW1QYWlyOwogCiAgIGNvbnN0IGludCBudW1fdGhyZWFkcyA9IGludGVybmFsOjpyYW5kb208aW50Pig0LCAxNik7CkBAIC00ODksOCArNDcwLDcgQEAKIAogICAvLyBjb21wdXRlIHJlc3VsdHMgYnkgc2VwYXJhdGUgbWV0aG9kcwogICBFaWdlbjo6QmFycmllciBiYXJyaWVyKDEpOwotICB0X3Jlc3VsdC5kZXZpY2UoZGV2aWNlLCBbJmJhcnJpZXJdKCkgeyBiYXJyaWVyLk5vdGlmeSgpOyB9KSA9Ci0gICAgICB0X2xlZnQuY29udHJhY3QodF9yaWdodCwgZGltcyk7CisgIHRfcmVzdWx0LmRldmljZShkZXZpY2UsIFsmYmFycmllcl0oKSB7IGJhcnJpZXIuTm90aWZ5KCk7IH0pID0gdF9sZWZ0LmNvbnRyYWN0KHRfcmlnaHQsIGRpbXMpOwogICBiYXJyaWVyLldhaXQoKTsKIAogICBtX3Jlc3VsdCA9IG1fbGVmdCAqIG1fcmlnaHQ7CkBAIC01MDIsOCArNDgyLDcgQEAKIAogLy8gV2UgYXJlIHRyaWdnZXJpbmcgJ2V2YWxTaGFyZGVkQnlJbm5lckRpbScgb3B0aW1pemF0aW9uIHdpdGggb3V0cHV0IGtlcm5lbC4KIHRlbXBsYXRlIDxpbnQgRGF0YUxheW91dD4KLXN0YXRpYyB2b2lkIHRlc3RfYXN5bmNfc2hhcmRlZF9ieV9pbm5lcl9kaW1fY29udHJhY3Rpb25fd2l0aF9vdXRwdXRfa2VybmVsKCkKLXsKK3N0YXRpYyB2b2lkIHRlc3RfYXN5bmNfc2hhcmRlZF9ieV9pbm5lcl9kaW1fY29udHJhY3Rpb25fd2l0aF9vdXRwdXRfa2VybmVsKCkgewogICB0eXBlZGVmIFRlbnNvcjxmbG9hdCwgMT46OkRpbWVuc2lvblBhaXIgRGltUGFpcjsKIAogICBjb25zdCBpbnQgbnVtX3RocmVhZHMgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oNCwgMTYpOwpAQCAtNTMzLDggKzUxMiw3IEBACiAKICAgLy8gY29tcHV0ZSByZXN1bHRzIGJ5IHNlcGFyYXRlIG1ldGhvZHMKICAgRWlnZW46OkJhcnJpZXIgYmFycmllcigxKTsKLSAgdF9yZXN1bHQuZGV2aWNlKGRldmljZSwgWyZiYXJyaWVyXSgpIHsgYmFycmllci5Ob3RpZnkoKTsgfSkgPQotICAgICAgdF9sZWZ0LmNvbnRyYWN0KHRfcmlnaHQsIGRpbXMsIFNxcnRPdXRwdXRLZXJuZWwoKSk7CisgIHRfcmVzdWx0LmRldmljZShkZXZpY2UsIFsmYmFycmllcl0oKSB7IGJhcnJpZXIuTm90aWZ5KCk7IH0pID0gdF9sZWZ0LmNvbnRyYWN0KHRfcmlnaHQsIGRpbXMsIFNxcnRPdXRwdXRLZXJuZWwoKSk7CiAgIGJhcnJpZXIuV2FpdCgpOwogICBtX3Jlc3VsdCA9IG1fbGVmdCAqIG1fcmlnaHQ7CiAKQEAgLTU0MywxNSArNTIxLDEzIEBACiAgIH0KIH0KIAotdGVtcGxhdGU8aW50IERhdGFMYXlvdXQ+Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CiB2b2lkIHRlc3RfZnVsbF9jb250cmFjdGlvbigpIHsKICAgaW50IGNvbnRyYWN0X3NpemUxID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDUwMCk7CiAgIGludCBjb250cmFjdF9zaXplMiA9IGludGVybmFsOjpyYW5kb208aW50PigxLCA1MDApOwogCi0gIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gbGVmdChjb250cmFjdF9zaXplMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0X3NpemUyKTsKLSAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiByaWdodChjb250cmFjdF9zaXplMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0X3NpemUyKTsKKyAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiBsZWZ0KGNvbnRyYWN0X3NpemUxLCBjb250cmFjdF9zaXplMik7CisgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gcmlnaHQoY29udHJhY3Rfc2l6ZTEsIGNvbnRyYWN0X3NpemUyKTsKICAgbGVmdC5zZXRSYW5kb20oKTsKICAgcmlnaHQuc2V0UmFuZG9tKCk7CiAKQEAgLTU3OSw3ICs1NTUsNyBAQAogICB9CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0PgordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgogdm9pZCB0ZXN0X211bHRpdGhyZWFkZWRfcmVkdWN0aW9ucygpIHsKICAgY29uc3QgaW50IG51bV90aHJlYWRzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDMsIDExKTsKICAgVGhyZWFkUG9vbCB0aHJlYWRfcG9vbChudW1fdGhyZWFkcyk7CkBAIC02MDEsOSArNTc3LDcgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChmdWxsX3JlZHV4KCksIGZ1bGxfcmVkdXhfdHAoKSk7CiB9CiAKLQogdm9pZCB0ZXN0X21lbWNweSgpIHsKLQogICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewogICAgIGNvbnN0IGludCBudW1fdGhyZWFkcyA9IGludGVybmFsOjpyYW5kb208aW50PigzLCAxMSk7CiAgICAgRWlnZW46OlRocmVhZFBvb2wgdHAobnVtX3RocmVhZHMpOwpAQCAtNjEzLDQ5ICs1ODcsNDUgQEAKICAgICBUZW5zb3I8ZmxvYXQsIDE+IHQxKHNpemUpOwogICAgIHQxLnNldFJhbmRvbSgpOwogICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiByZXN1bHQoc2l6ZSk7Ci0gICAgdGhyZWFkX3Bvb2xfZGV2aWNlLm1lbWNweSgmcmVzdWx0WzBdLCB0MS5kYXRhKCksIHNpemUqc2l6ZW9mKGZsb2F0KSk7CisgICAgdGhyZWFkX3Bvb2xfZGV2aWNlLm1lbWNweSgmcmVzdWx0WzBdLCB0MS5kYXRhKCksIHNpemUgKiBzaXplb2YoZmxvYXQpKTsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgewogICAgICAgVkVSSUZZX0lTX0VRVUFMKHQxKGopLCByZXN1bHRbal0pOwogICAgIH0KICAgfQogfQogCi0KLXZvaWQgdGVzdF9tdWx0aXRocmVhZF9yYW5kb20oKQotewordm9pZCB0ZXN0X211bHRpdGhyZWFkX3JhbmRvbSgpIHsKICAgRWlnZW46OlRocmVhZFBvb2wgdHAoMik7CiAgIEVpZ2VuOjpUaHJlYWRQb29sRGV2aWNlIGRldmljZSgmdHAsIDIpOwogICBUZW5zb3I8ZmxvYXQsIDE+IHQoMSA8PCAyMCk7CiAgIHQuZGV2aWNlKGRldmljZSkgPSB0LnJhbmRvbTxFaWdlbjo6aW50ZXJuYWw6Ok5vcm1hbFJhbmRvbUdlbmVyYXRvcjxmbG9hdD4+KCk7CiB9CiAKLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0Pgotdm9pZCB0ZXN0X211bHRpdGhyZWFkX3NodWZmbGUoQWxsb2NhdG9yKiBhbGxvY2F0b3IpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNCwgRGF0YUxheW91dD4gdGVuc29yKDE3LDUsNywxMSk7Cit0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+Cit2b2lkIHRlc3RfbXVsdGl0aHJlYWRfc2h1ZmZsZShBbGxvY2F0b3IqIGFsbG9jYXRvcikgeworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigxNywgNSwgNywgMTEpOwogICB0ZW5zb3Iuc2V0UmFuZG9tKCk7CiAKICAgY29uc3QgaW50IG51bV90aHJlYWRzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsIDExKTsKICAgVGhyZWFkUG9vbCB0aHJlYWRzKG51bV90aHJlYWRzKTsKICAgRWlnZW46OlRocmVhZFBvb2xEZXZpY2UgZGV2aWNlKCZ0aHJlYWRzLCBudW1fdGhyZWFkcywgYWxsb2NhdG9yKTsKIAotICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHNodWZmbGUoNyw1LDExLDE3KTsKLSAgYXJyYXk8cHRyZGlmZl90LCA0PiBzaHVmZmxlcyA9IHt7MiwxLDMsMH19OworICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHNodWZmbGUoNywgNSwgMTEsIDE3KTsKKyAgYXJyYXk8cHRyZGlmZl90LCA0PiBzaHVmZmxlcyA9IHt7MiwgMSwgMywgMH19OwogICBzaHVmZmxlLmRldmljZShkZXZpY2UpID0gdGVuc29yLnNodWZmbGUoc2h1ZmZsZXMpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTc7ICsraSkgewogICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CiAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDc7ICsraykgewogICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IDExOyArK2wpIHsKLSAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksaixrLGwpLCBzaHVmZmxlKGssaixsLGkpKTsKKyAgICAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yKGksIGosIGssIGwpLCBzaHVmZmxlKGssIGosIGwsIGkpKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQogfQogCi12b2lkIHRlc3RfdGhyZWFkcG9vbF9hbGxvY2F0ZShUZXN0QWxsb2NhdG9yKiBhbGxvY2F0b3IpCi17Cit2b2lkIHRlc3RfdGhyZWFkcG9vbF9hbGxvY2F0ZShUZXN0QWxsb2NhdG9yKiBhbGxvY2F0b3IpIHsKICAgY29uc3QgaW50IG51bV90aHJlYWRzID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDIsIDExKTsKICAgY29uc3QgaW50IG51bV9hbGxvY3MgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMiwgMTEpOwogICBUaHJlYWRQb29sIHRocmVhZHMobnVtX3RocmVhZHMpOwpAQCAtNjcwLDggKzY0MCw3IEBACiAgIFZFUklGWV9JU19FUVVBTChhbGxvY2F0b3ItPmRlYWxsb2NfY291bnQoKSwgbnVtX2FsbG9jcyk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfdGhyZWFkX3Bvb2wpCi17CitFSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3RocmVhZF9wb29sKSB7CiAgIENBTExfU1VCVEVTVF8xKHRlc3RfbXVsdGl0aHJlYWRfZWxlbWVudHdpc2UoKSk7CiAgIENBTExfU1VCVEVTVF8xKHRlc3RfYXN5bmNfbXVsdGl0aHJlYWRfZWxlbWVudHdpc2UoKSk7CiAgIENBTExfU1VCVEVTVF8xKHRlc3RfbXVsdGl0aHJlYWRfY29tcG91bmRfYXNzaWdubWVudCgpKTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3RyYWNlLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3RyYWNlLmNwcAppbmRleCAwMDk3MjI4Li41Yjk1ODM5IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl90cmFjZS5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3JfdHJhY2UuY3BwCkBAIC0xMSw4ICsxMSw4IEBACiAKICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CiAKLXVzaW5nIEVpZ2VuOjpUZW5zb3I7CiB1c2luZyBFaWdlbjo6YXJyYXk7Cit1c2luZyBFaWdlbjo6VGVuc29yOwogCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CiBzdGF0aWMgdm9pZCB0ZXN0XzBEX3RyYWNlKCkgewpAQCAtMjMsNyArMjMsNiBAQAogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0KCksIHRlbnNvcigpKTsKIH0KIAotCiB0ZW1wbGF0ZSA8aW50IERhdGFMYXlvdXQ+CiBzdGF0aWMgdm9pZCB0ZXN0X2FsbF9kaW1lbnNpb25zX3RyYWNlKCkgewogICBUZW5zb3I8ZmxvYXQsIDMsIERhdGFMYXlvdXQ+IHRlbnNvcjEoNSwgNSwgNSk7CkBAIC0zOCw3ICszNyw3IEBACiAKICAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiB0ZW5zb3IyKDcsIDcsIDcsIDcsIDcpOwogICB0ZW5zb3IyLnNldFJhbmRvbSgpOwotICBhcnJheTxwdHJkaWZmX3QsIDU+IGRpbXMgPSB7IHsgMiwgMSwgMCwgMywgNCB9IH07CisgIGFycmF5PHB0cmRpZmZfdCwgNT4gZGltcyA9IHt7MiwgMSwgMCwgMywgNH19OwogICBUZW5zb3I8ZmxvYXQsIDAsIERhdGFMYXlvdXQ+IHJlc3VsdDIgPSB0ZW5zb3IyLnRyYWNlKGRpbXMpOwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0Mi5yYW5rKCksIDApOwogICBzdW0gPSAwLjBmOwpAQCAtNDgsMTIgKzQ3LDExIEBACiAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQyKCksIHN1bSk7CiB9CiAKLQogdGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgogc3RhdGljIHZvaWQgdGVzdF9zaW1wbGVfdHJhY2UoKSB7CiAgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gdGVuc29yMSgzLCA1LCAzKTsKICAgdGVuc29yMS5zZXRSYW5kb20oKTsKLSAgYXJyYXk8cHRyZGlmZl90LCAyPiBkaW1zMSA9IHsgeyAwLCAyIH0gfTsKKyAgYXJyYXk8cHRyZGlmZl90LCAyPiBkaW1zMSA9IHt7MCwgMn19OwogICBUZW5zb3I8ZmxvYXQsIDEsIERhdGFMYXlvdXQ+IHJlc3VsdDEgPSB0ZW5zb3IxLnRyYWNlKGRpbXMxKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdDEucmFuaygpLCAxKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdDEuZGltZW5zaW9uKDApLCA1KTsKQEAgLTY4LDcgKzY2LDcgQEAKIAogICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcjIoNSwgNSwgNywgNyk7CiAgIHRlbnNvcjIuc2V0UmFuZG9tKCk7Ci0gIGFycmF5PHB0cmRpZmZfdCwgMj4gZGltczIgPSB7IHsgMiwgMyB9IH07CisgIGFycmF5PHB0cmRpZmZfdCwgMj4gZGltczIgPSB7ezIsIDN9fTsKICAgVGVuc29yPGZsb2F0LCAyLCBEYXRhTGF5b3V0PiByZXN1bHQyID0gdGVuc29yMi50cmFjZShkaW1zMik7CiAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQyLnJhbmsoKSwgMik7CiAgIFZFUklGWV9JU19FUVVBTChyZXN1bHQyLmRpbWVuc2lvbigwKSwgNSk7CkBAIC04Myw3ICs4MSw3IEBACiAgICAgfQogICB9CiAKLSAgYXJyYXk8cHRyZGlmZl90LCAyPiBkaW1zMyA9IHsgeyAxLCAwIH0gfTsKKyAgYXJyYXk8cHRyZGlmZl90LCAyPiBkaW1zMyA9IHt7MSwgMH19OwogICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHJlc3VsdDMgPSB0ZW5zb3IyLnRyYWNlKGRpbXMzKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdDMucmFuaygpLCAyKTsKICAgVkVSSUZZX0lTX0VRVUFMKHJlc3VsdDMuZGltZW5zaW9uKDApLCA3KTsKQEAgLTEwMCw3ICs5OCw3IEBACiAKICAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiB0ZW5zb3IzKDMsIDcsIDMsIDcsIDMpOwogICB0ZW5zb3IzLnNldFJhbmRvbSgpOwotICBhcnJheTxwdHJkaWZmX3QsIDM+IGRpbXM0ID0geyB7IDAsIDIsIDQgfSB9OworICBhcnJheTxwdHJkaWZmX3QsIDM+IGRpbXM0ID0ge3swLCAyLCA0fX07CiAgIFRlbnNvcjxmbG9hdCwgMiwgRGF0YUxheW91dD4gcmVzdWx0NCA9IHRlbnNvcjMudHJhY2UoZGltczQpOwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0NC5yYW5rKCksIDIpOwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0NC5kaW1lbnNpb24oMCksIDcpOwpAQCAtMTE3LDcgKzExNSw3IEBACiAKICAgVGVuc29yPGZsb2F0LCA1LCBEYXRhTGF5b3V0PiB0ZW5zb3I0KDMsIDcsIDQsIDcsIDUpOwogICB0ZW5zb3I0LnNldFJhbmRvbSgpOwotICBhcnJheTxwdHJkaWZmX3QsIDI+IGRpbXM1ID0geyB7IDEsIDMgfSB9OworICBhcnJheTxwdHJkaWZmX3QsIDI+IGRpbXM1ID0ge3sxLCAzfX07CiAgIFRlbnNvcjxmbG9hdCwgMywgRGF0YUxheW91dD4gcmVzdWx0NSA9IHRlbnNvcjQudHJhY2UoZGltczUpOwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0NS5yYW5rKCksIDMpOwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0NS5kaW1lbnNpb24oMCksIDMpOwpAQCAtMTM2LDEyICsxMzQsMTEgQEAKICAgfQogfQogCi0KLXRlbXBsYXRlPGludCBEYXRhTGF5b3V0PgordGVtcGxhdGUgPGludCBEYXRhTGF5b3V0Pgogc3RhdGljIHZvaWQgdGVzdF90cmFjZV9pbl9leHByKCkgewogICBUZW5zb3I8ZmxvYXQsIDQsIERhdGFMYXlvdXQ+IHRlbnNvcigyLCAzLCA1LCAzKTsKICAgdGVuc29yLnNldFJhbmRvbSgpOwotICBhcnJheTxwdHJkaWZmX3QsIDI+IGRpbXMgPSB7IHsgMSwgMyB9IH07CisgIGFycmF5PHB0cmRpZmZfdCwgMj4gZGltcyA9IHt7MSwgM319OwogICBUZW5zb3I8ZmxvYXQsIDIsIERhdGFMYXlvdXQ+IHJlc3VsdCgyLCA1KTsKICAgcmVzdWx0ID0gcmVzdWx0LmNvbnN0YW50KDEuMGYpIC0gdGVuc29yLnRyYWNlKGRpbXMpOwogICBWRVJJRllfSVNfRVFVQUwocmVzdWx0LnJhbmsoKSwgMik7CkBAIC0xNTksNyArMTU2LDYgQEAKICAgfQogfQogCi0KIEVJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3JfdHJhY2UpIHsKICAgQ0FMTF9TVUJURVNUKHRlc3RfMERfdHJhY2U8Q29sTWFqb3I+KCkpOwogICBDQUxMX1NVQlRFU1QodGVzdF8wRF90cmFjZTxSb3dNYWpvcj4oKSk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl91aW50MTI4LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3VpbnQxMjguY3BwCmluZGV4IDQ2ZmNlYWEuLjQ0NzBmMjUgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3VpbnQxMjguY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3VpbnQxMjguY3BwCkBAIC0xMSw3ICsxMSw2IEBACiAKICNpbmNsdWRlIDxFaWdlbi9DWFgxMS9UZW5zb3I+CiAKLQogI2lmIEVJR0VOX0NPTVBfTVNWQyB8fCAhZGVmaW5lZChfX1NJWkVPRl9JTlQxMjhfXykKICNkZWZpbmUgRUlHRU5fTk9fSU5UMTI4CiAjZWxzZQpAQCAtMjEsMjIgKzIwLDE5IEBACiAvLyBPbmx5IHJ1biB0aGUgdGVzdCBvbiBjb21waWxlcnMgdGhhdCBzdXBwb3J0IDEyOGJpdCBpbnRlZ2VycyBuYXRpdmVseQogI2lmbmRlZiBFSUdFTl9OT19JTlQxMjgKIAotdXNpbmcgRWlnZW46OmludGVybmFsOjpUZW5zb3JVSW50MTI4OwogdXNpbmcgRWlnZW46OmludGVybmFsOjpzdGF0aWNfdmFsOwordXNpbmcgRWlnZW46OmludGVybmFsOjpUZW5zb3JVSW50MTI4OwogCiB2b2lkIFZFUklGWV9FUVVBTChUZW5zb3JVSW50MTI4PHVpbnQ2NF90LCB1aW50NjRfdD4gYWN0dWFsLCB1aW50MTI4X3QgZXhwZWN0ZWQpIHsKICAgYm9vbCBtYXRjaGwgPSBhY3R1YWwubG93ZXIoKSA9PSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZXhwZWN0ZWQpOwogICBib29sIG1hdGNoaCA9IGFjdHVhbC51cHBlcigpID09IHN0YXRpY19jYXN0PHVpbnQ2NF90PihleHBlY3RlZCA+PiA2NCk7CiAgIGlmICghbWF0Y2hsIHx8ICFtYXRjaGgpIHsKICAgICBjb25zdCBjaGFyKiB0ZXN0bmFtZSA9IGdfdGVzdF9zdGFjay5iYWNrKCkuY19zdHIoKTsKLSAgICBzdGQ6OmNlcnIgPDwgIlRlc3QgIiA8PCB0ZXN0bmFtZSA8PCAiIGZhaWxlZCBpbiAiIDw8IF9fRklMRV9fCi0gICAgICAgICAgICAgIDw8ICIgKCIgPDwgX19MSU5FX18gPDwgIikiCi0gICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIlRlc3QgIiA8PCB0ZXN0bmFtZSA8PCAiIGZhaWxlZCBpbiAiIDw8IF9fRklMRV9fIDw8ICIgKCIgPDwgX19MSU5FX18gPDwgIikiIDw8IHN0ZDo6ZW5kbDsKICAgICBhYm9ydCgpOwogICB9CiB9CiAKLQogdm9pZCB0ZXN0X2FkZCgpIHsKICAgdWludDY0X3QgaW5jciA9IGludGVybmFsOjpyYW5kb208dWludDY0X3Q+KDEsIDk5OTk5OTk5OTkpOwogICBmb3IgKHVpbnQ2NF90IGkxID0gMDsgaTEgPCAxMDA7ICsraTEpIHsKQEAgLTEzMiwxMCArMTI4LDEzIEBACiAgIGludDY0X3QgaW5jciA9IGludGVybmFsOjpyYW5kb208aW50NjRfdD4oMSwgMTAwKTsKICAgZm9yIChpbnQ2NF90IGxvZ19kaXYgPSAwOyBsb2dfZGl2IDwgNjM7ICsrbG9nX2RpdikgewogICAgIGZvciAoaW50NjRfdCBkaXZpZGVyID0gMTsgZGl2aWRlciA8PSAxMDAwMDAwICogaW5jcjsgZGl2aWRlciArPSBpbmNyKSB7Ci0gICAgICB1aW50NjRfdCBleHBlY3RlZCA9IChzdGF0aWNfY2FzdDx1aW50MTI4X3Q+KDEpIDw8ICg2NCtsb2dfZGl2KSkgLyBzdGF0aWNfY2FzdDx1aW50MTI4X3Q+KGRpdmlkZXIpIC0gKHN0YXRpY19jYXN0PHVpbnQxMjhfdD4oMSkgPDwgNjQpICsgMTsKKyAgICAgIHVpbnQ2NF90IGV4cGVjdGVkID0gKHN0YXRpY19jYXN0PHVpbnQxMjhfdD4oMSkgPDwgKDY0ICsgbG9nX2RpdikpIC8gc3RhdGljX2Nhc3Q8dWludDEyOF90PihkaXZpZGVyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MTI4X3Q+KDEpIDw8IDY0KSArIDE7CiAgICAgICB1aW50NjRfdCBzaGlmdCA9IDFVTEwgPDwgbG9nX2RpdjsKIAotICAgICAgVGVuc29yVUludDEyODx1aW50NjRfdCwgdWludDY0X3Q+IHJlc3VsdCA9IChUZW5zb3JVSW50MTI4PHVpbnQ2NF90LCBzdGF0aWNfdmFsPDA+ID4oc2hpZnQsIDApIC8gVGVuc29yVUludDEyODxzdGF0aWNfdmFsPDA+LCB1aW50NjRfdD4oZGl2aWRlcikgLSBUZW5zb3JVSW50MTI4PHN0YXRpY192YWw8MT4sIHN0YXRpY192YWw8MD4gPigxLCAwKSArIFRlbnNvclVJbnQxMjg8c3RhdGljX3ZhbDwwPiwgc3RhdGljX3ZhbDwxPiA+KDEpKTsKKyAgICAgIFRlbnNvclVJbnQxMjg8dWludDY0X3QsIHVpbnQ2NF90PiByZXN1bHQgPQorICAgICAgICAgIChUZW5zb3JVSW50MTI4PHVpbnQ2NF90LCBzdGF0aWNfdmFsPDA+ID4oc2hpZnQsIDApIC8gVGVuc29yVUludDEyODxzdGF0aWNfdmFsPDA+LCB1aW50NjRfdD4oZGl2aWRlcikgLQorICAgICAgICAgICBUZW5zb3JVSW50MTI4PHN0YXRpY192YWw8MT4sIHN0YXRpY192YWw8MD4gPigxLCAwKSArIFRlbnNvclVJbnQxMjg8c3RhdGljX3ZhbDwwPiwgc3RhdGljX3ZhbDwxPiA+KDEpKTsKICAgICAgIHVpbnQ2NF90IGFjdHVhbCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZXN1bHQpOwogICAgICAgVkVSSUZZX0lTX0VRVUFMKGFjdHVhbCwgZXhwZWN0ZWQpOwogICAgIH0KQEAgLTE0Myw5ICsxNDIsNyBAQAogfQogI2VuZGlmCiAKLQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl91aW50MTI4KQoteworRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl91aW50MTI4KSB7CiAjaWZkZWYgRUlHRU5fTk9fSU5UMTI4CiAgIC8vIFNraXAgdGhlIHRlc3Qgb24gY29tcGlsZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCAxMjhiaXQgaW50ZWdlcnMgbmF0aXZlbHkKICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfdm9sdW1lX3BhdGNoLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3ZvbHVtZV9wYXRjaC5jcHAKaW5kZXggODYyMjEyZS4uOWEwNDg2MSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfdm9sdW1lX3BhdGNoLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl92b2x1bWVfcGF0Y2guY3BwCkBAIC00LDkgKzQsOCBAQAogCiB1c2luZyBFaWdlbjo6VGVuc29yOwogCi1zdGF0aWMgdm9pZCB0ZXN0X3NpbmdsZV92b3hlbF9wYXRjaCgpCi17Ci0gIFRlbnNvcjxmbG9hdCwgNT4gdGVuc29yKDQsMiwzLDUsNyk7CitzdGF0aWMgdm9pZCB0ZXN0X3NpbmdsZV92b3hlbF9wYXRjaCgpIHsKKyAgVGVuc29yPGZsb2F0LCA1PiB0ZW5zb3IoNCwgMiwgMywgNSwgNyk7CiAgIHRlbnNvci5zZXRSYW5kb20oKTsKICAgVGVuc29yPGZsb2F0LCA1LCBSb3dNYWpvcj4gdGVuc29yX3Jvd19tYWpvciA9IHRlbnNvci5zd2FwX2xheW91dCgpOwogCkBAIC0zNSw5ICszNCw3IEBACiAgIH0KIH0KIAotCi1zdGF0aWMgdm9pZCB0ZXN0X2VudGlyZV92b2x1bWVfcGF0Y2goKQoteworc3RhdGljIHZvaWQgdGVzdF9lbnRpcmVfdm9sdW1lX3BhdGNoKCkgewogICBjb25zdCBpbnQgZGVwdGggPSA0OwogICBjb25zdCBpbnQgcGF0Y2hfeiA9IDI7CiAgIGNvbnN0IGludCBwYXRjaF95ID0gMzsKQEAgLTg4LDggKzg1LDcgQEAKICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBlZmZfeiA9IHogLSBmb3J3YXJkX3BhZF96ICsgcHo7CiAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZWZmX3kgPSB5IC0gZm9yd2FyZF9wYWRfeSArIHB5OwogICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGVmZl94ID0geCAtIGZvcndhcmRfcGFkX3ggKyBweDsKLSAgICAgICAgICAgICAgICAgIGlmIChlZmZfeiA+PSAwICYmIGVmZl95ID49IDAgJiYgZWZmX3ggPj0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgIGVmZl96IDwgcGF0Y2hfeiAmJiBlZmZfeSA8IHBhdGNoX3kgJiYgZWZmX3ggPCBwYXRjaF94KSB7CisgICAgICAgICAgICAgICAgICBpZiAoZWZmX3ogPj0gMCAmJiBlZmZfeSA+PSAwICYmIGVmZl94ID49IDAgJiYgZWZmX3ogPCBwYXRjaF96ICYmIGVmZl95IDwgcGF0Y2hfeSAmJiBlZmZfeCA8IHBhdGNoX3gpIHsKICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB0ZW5zb3IoZCwgZWZmX3osIGVmZl95LCBlZmZfeCwgYik7CiAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IoYiwgZWZmX3gsIGVmZl95LCBlZmZfeiwgZCk7CiAgICAgICAgICAgICAgICAgICB9CkBAIC0xMDUsOCArMTAxLDcgQEAKICAgfQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoY3h4MTFfdGVuc29yX3ZvbHVtZV9wYXRjaCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChjeHgxMV90ZW5zb3Jfdm9sdW1lX3BhdGNoKSB7CiAgIENBTExfU1VCVEVTVCh0ZXN0X3NpbmdsZV92b3hlbF9wYXRjaCgpKTsKICAgQ0FMTF9TVUJURVNUKHRlc3RfZW50aXJlX3ZvbHVtZV9wYXRjaCgpKTsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3ZvbHVtZV9wYXRjaF9zeWNsLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvY3h4MTFfdGVuc29yX3ZvbHVtZV9wYXRjaF9zeWNsLmNwcAppbmRleCBkYzg2ZGZlLi42YTQyNDhlIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2N4eDExX3RlbnNvcl92b2x1bWVfcGF0Y2hfc3ljbC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9jeHgxMV90ZW5zb3Jfdm9sdW1lX3BhdGNoX3N5Y2wuY3BwCkBAIC0yNCwzOSArMjQsMzkgQEAKIHN0YXRpYyBjb25zdCBpbnQgRGF0YUxheW91dCA9IENvbE1ham9yOwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIEluZGV4VHlwZT4KLXN0YXRpYyB2b2lkIHRlc3Rfc2luZ2xlX3ZveGVsX3BhdGNoX3N5Y2woY29uc3QgRWlnZW46OlN5Y2xEZXZpY2UmIHN5Y2xfZGV2aWNlKQoteworc3RhdGljIHZvaWQgdGVzdF9zaW5nbGVfdm94ZWxfcGF0Y2hfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKKyAgSW5kZXhUeXBlIHNpemVEaW0wID0gNDsKKyAgSW5kZXhUeXBlIHNpemVEaW0xID0gMjsKKyAgSW5kZXhUeXBlIHNpemVEaW0yID0gMzsKKyAgSW5kZXhUeXBlIHNpemVEaW0zID0gNTsKKyAgSW5kZXhUeXBlIHNpemVEaW00ID0gNzsKKyAgYXJyYXk8SW5kZXhUeXBlLCA1PiB0ZW5zb3JDb2xNYWpvclJhbmdlID0ge3tzaXplRGltMCwgc2l6ZURpbTEsIHNpemVEaW0yLCBzaXplRGltMywgc2l6ZURpbTR9fTsKKyAgYXJyYXk8SW5kZXhUeXBlLCA1PiB0ZW5zb3JSb3dNYWpvclJhbmdlID0ge3tzaXplRGltNCwgc2l6ZURpbTMsIHNpemVEaW0yLCBzaXplRGltMSwgc2l6ZURpbTB9fTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+IHRlbnNvcl9jb2xfbWFqb3IodGVuc29yQ29sTWFqb3JSYW5nZSk7CisgIFRlbnNvcjxEYXRhVHlwZSwgNSwgUm93TWFqb3IsIEluZGV4VHlwZT4gdGVuc29yX3Jvd19tYWpvcih0ZW5zb3JSb3dNYWpvclJhbmdlKTsKKyAgdGVuc29yX2NvbF9tYWpvci5zZXRSYW5kb20oKTsKIAotSW5kZXhUeXBlIHNpemVEaW0wID0gNDsKLUluZGV4VHlwZSBzaXplRGltMSA9IDI7Ci1JbmRleFR5cGUgc2l6ZURpbTIgPSAzOwotSW5kZXhUeXBlIHNpemVEaW0zID0gNTsKLUluZGV4VHlwZSBzaXplRGltNCA9IDc7Ci1hcnJheTxJbmRleFR5cGUsIDU+IHRlbnNvckNvbE1ham9yUmFuZ2UgPSB7e3NpemVEaW0wLCBzaXplRGltMSwgc2l6ZURpbTIsIHNpemVEaW0zLCBzaXplRGltNH19OwotYXJyYXk8SW5kZXhUeXBlLCA1PiB0ZW5zb3JSb3dNYWpvclJhbmdlID0ge3tzaXplRGltNCwgc2l6ZURpbTMsIHNpemVEaW0yLCBzaXplRGltMSwgc2l6ZURpbTB9fTsKLVRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+IHRlbnNvcl9jb2xfbWFqb3IodGVuc29yQ29sTWFqb3JSYW5nZSk7Ci1UZW5zb3I8RGF0YVR5cGUsIDUsIFJvd01ham9yLEluZGV4VHlwZT4gdGVuc29yX3Jvd19tYWpvcih0ZW5zb3JSb3dNYWpvclJhbmdlKTsKLXRlbnNvcl9jb2xfbWFqb3Iuc2V0UmFuZG9tKCk7Ci0KLQotICBEYXRhVHlwZSogZ3B1X2RhdGFfY29sX21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yX2NvbF9tYWpvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfcm93X21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yX3Jvd19tYWpvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfY29sX21ham9yID0KKyAgICAgIHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yX2NvbF9tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpKSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9yb3dfbWFqb3IgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3Jfcm93X21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgQ29sTWFqb3IsIEluZGV4VHlwZT4+IGdwdV9jb2xfbWFqb3IoZ3B1X2RhdGFfY29sX21ham9yLCB0ZW5zb3JDb2xNYWpvclJhbmdlKTsKICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgUm93TWFqb3IsIEluZGV4VHlwZT4+IGdwdV9yb3dfbWFqb3IoZ3B1X2RhdGFfcm93X21ham9yLCB0ZW5zb3JSb3dNYWpvclJhbmdlKTsKIAotICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfY29sX21ham9yLCB0ZW5zb3JfY29sX21ham9yLmRhdGEoKSwodGVuc29yX2NvbF9tYWpvci5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotICBncHVfcm93X21ham9yLmRldmljZShzeWNsX2RldmljZSk9Z3B1X2NvbF9tYWpvci5zd2FwX2xheW91dCgpOwotCisgIHN5Y2xfZGV2aWNlLm1lbWNweUhvc3RUb0RldmljZShncHVfZGF0YV9jb2xfbWFqb3IsIHRlbnNvcl9jb2xfbWFqb3IuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpKSAqIHNpemVvZihEYXRhVHlwZSkpOworICBncHVfcm93X21ham9yLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfY29sX21ham9yLnN3YXBfbGF5b3V0KCk7CiAKICAgLy8gc2luZ2xlIHZvbHVtZSBwYXRjaDogQ29sTWFqb3IKLSAgYXJyYXk8SW5kZXhUeXBlLCA2PiBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2U9e3tzaXplRGltMCwxLCAxLCAxLCBzaXplRGltMSpzaXplRGltMipzaXplRGltMywgc2l6ZURpbTR9fTsKLSAgVGVuc29yPERhdGFUeXBlLCA2LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4gc2luZ2xlX3ZveGVsX3BhdGNoX2NvbF9tYWpvcihwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOwotICBzaXplX3QgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9c2luZ2xlX3ZveGVsX3BhdGNoX2NvbF9tYWpvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKTsKLSAgRGF0YVR5cGUqIGdwdV9kYXRhX3NpbmdsZV92b3hlbF9wYXRjaF9jb2xfbWFqb3IgID0gc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZShwYXRjaFRlbnNvckJ1ZmZTaXplKSk7Ci0gIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDYsIERhdGFMYXlvdXQsSW5kZXhUeXBlPj4gZ3B1X3NpbmdsZV92b3hlbF9wYXRjaF9jb2xfbWFqb3IoZ3B1X2RhdGFfc2luZ2xlX3ZveGVsX3BhdGNoX2NvbF9tYWpvciwgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKLSAgZ3B1X3NpbmdsZV92b3hlbF9wYXRjaF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfY29sX21ham9yLmV4dHJhY3Rfdm9sdW1lX3BhdGNoZXMoMSwgMSwgMSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChzaW5nbGVfdm94ZWxfcGF0Y2hfY29sX21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfc2luZ2xlX3ZveGVsX3BhdGNoX2NvbF9tYWpvciwgcGF0Y2hUZW5zb3JCdWZmU2l6ZSk7Ci0KKyAgYXJyYXk8SW5kZXhUeXBlLCA2PiBwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UgPSB7e3NpemVEaW0wLCAxLCAxLCAxLCBzaXplRGltMSAqIHNpemVEaW0yICogc2l6ZURpbTMsIHNpemVEaW00fX07CisgIFRlbnNvcjxEYXRhVHlwZSwgNiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBzaW5nbGVfdm94ZWxfcGF0Y2hfY29sX21ham9yKHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7CisgIHNpemVfdCBwYXRjaFRlbnNvckJ1ZmZTaXplID0gc2luZ2xlX3ZveGVsX3BhdGNoX2NvbF9tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfc2luZ2xlX3ZveGVsX3BhdGNoX2NvbF9tYWpvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA2LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfc2luZ2xlX3ZveGVsX3BhdGNoX2NvbF9tYWpvcigKKyAgICAgIGdwdV9kYXRhX3NpbmdsZV92b3hlbF9wYXRjaF9jb2xfbWFqb3IsIHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7CisgIGdwdV9zaW5nbGVfdm94ZWxfcGF0Y2hfY29sX21ham9yLmRldmljZShzeWNsX2RldmljZSkgPSBncHVfY29sX21ham9yLmV4dHJhY3Rfdm9sdW1lX3BhdGNoZXMoMSwgMSwgMSk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChzaW5nbGVfdm94ZWxfcGF0Y2hfY29sX21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfc2luZ2xlX3ZveGVsX3BhdGNoX2NvbF9tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfdm94ZWxfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigwKSwgNCk7CiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfdm94ZWxfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigxKSwgMSk7CkBAIC02NSwxMyArNjUsMTUgQEAKICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV92b3hlbF9wYXRjaF9jb2xfbWFqb3IuZGltZW5zaW9uKDQpLCAyICogMyAqIDUpOwogICBWRVJJRllfSVNfRVFVQUwoc2luZ2xlX3ZveGVsX3BhdGNoX2NvbF9tYWpvci5kaW1lbnNpb24oNSksIDcpOwogCi0gIGFycmF5PEluZGV4VHlwZSwgNj4gcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlPXt7c2l6ZURpbTQsIHNpemVEaW0xKnNpemVEaW0yKnNpemVEaW0zLCAxLCAxLCAxLCBzaXplRGltMH19OwotICBUZW5zb3I8RGF0YVR5cGUsIDYsIFJvd01ham9yLEluZGV4VHlwZT4gc2luZ2xlX3ZveGVsX3BhdGNoX3Jvd19tYWpvcihwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UpOwotICBwYXRjaFRlbnNvckJ1ZmZTaXplID1zaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICBEYXRhVHlwZSogZ3B1X2RhdGFfc2luZ2xlX3ZveGVsX3BhdGNoX3Jvd19tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNiwgUm93TWFqb3IsSW5kZXhUeXBlPj4gZ3B1X3NpbmdsZV92b3hlbF9wYXRjaF9yb3dfbWFqb3IoZ3B1X2RhdGFfc2luZ2xlX3ZveGVsX3BhdGNoX3Jvd19tYWpvciwgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKLSAgZ3B1X3NpbmdsZV92b3hlbF9wYXRjaF9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfcm93X21ham9yLmV4dHJhY3Rfdm9sdW1lX3BhdGNoZXMoMSwgMSwgMSk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChzaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfc2luZ2xlX3ZveGVsX3BhdGNoX3Jvd19tYWpvciwgcGF0Y2hUZW5zb3JCdWZmU2l6ZSk7CisgIGFycmF5PEluZGV4VHlwZSwgNj4gcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlID0ge3tzaXplRGltNCwgc2l6ZURpbTEgKiBzaXplRGltMiAqIHNpemVEaW0zLCAxLCAxLCAxLCBzaXplRGltMH19OworICBUZW5zb3I8RGF0YVR5cGUsIDYsIFJvd01ham9yLCBJbmRleFR5cGU+IHNpbmdsZV92b3hlbF9wYXRjaF9yb3dfbWFqb3IocGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKKyAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IHNpbmdsZV92b3hlbF9wYXRjaF9yb3dfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3NpbmdsZV92b3hlbF9wYXRjaF9yb3dfbWFqb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNiwgUm93TWFqb3IsIEluZGV4VHlwZT4+IGdwdV9zaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yKAorICAgICAgZ3B1X2RhdGFfc2luZ2xlX3ZveGVsX3BhdGNoX3Jvd19tYWpvciwgcGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X3NpbmdsZV92b3hlbF9wYXRjaF9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9yb3dfbWFqb3IuZXh0cmFjdF92b2x1bWVfcGF0Y2hlcygxLCAxLCAxKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHNpbmdsZV92b3hlbF9wYXRjaF9yb3dfbWFqb3IuZGF0YSgpLCBncHVfZGF0YV9zaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV92b3hlbF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDApLCA3KTsKICAgVkVSSUZZX0lTX0VRVUFMKHNpbmdsZV92b3hlbF9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCAyICogMyAqIDUpOwpAQCAtODAsMTQgKzgyLDE0IEBACiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbig0KSwgMSk7CiAgIFZFUklGWV9JU19FUVVBTChzaW5nbGVfdm94ZWxfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbig1KSwgNCk7CiAKLSBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QodGVuc29yX3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX3Jvd19tYWpvciwgKHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpKSpzaXplb2YoRGF0YVR5cGUpKTsKLSBmb3IgKEluZGV4VHlwZSBpID0gMDsgaSA8IHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpOyArK2kpIHsKLSAgICAgICBWRVJJRllfSVNfRVFVQUwodGVuc29yX2NvbF9tYWpvci5kYXRhKClbaV0sIHNpbmdsZV92b3hlbF9wYXRjaF9jb2xfbWFqb3IuZGF0YSgpW2ldKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpLCBncHVfZGF0YV9yb3dfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVuc29yX2NvbF9tYWpvci5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIGZvciAoSW5kZXhUeXBlIGkgPSAwOyBpIDwgdGVuc29yX2NvbF9tYWpvci5zaXplKCk7ICsraSkgeworICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfY29sX21ham9yLmRhdGEoKVtpXSwgc2luZ2xlX3ZveGVsX3BhdGNoX2NvbF9tYWpvci5kYXRhKClbaV0pOwogICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3Jfcm93X21ham9yLmRhdGEoKVtpXSwgc2luZ2xlX3ZveGVsX3BhdGNoX3Jvd19tYWpvci5kYXRhKClbaV0pOwogICAgIFZFUklGWV9JU19FUVVBTCh0ZW5zb3JfY29sX21ham9yLmRhdGEoKVtpXSwgdGVuc29yX3Jvd19tYWpvci5kYXRhKClbaV0pOwogICB9CiAKLQogICBzeWNsX2RldmljZS5kZWFsbG9jYXRlKGdwdV9kYXRhX2NvbF9tYWpvcik7CiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2RhdGFfcm93X21ham9yKTsKICAgc3ljbF9kZXZpY2UuZGVhbGxvY2F0ZShncHVfZGF0YV9zaW5nbGVfdm94ZWxfcGF0Y2hfY29sX21ham9yKTsKQEAgLTk1LDggKzk3LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlLCB0eXBlbmFtZSBJbmRleFR5cGU+Ci1zdGF0aWMgdm9pZCB0ZXN0X2VudGlyZV92b2x1bWVfcGF0Y2hfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpCi17CitzdGF0aWMgdm9pZCB0ZXN0X2VudGlyZV92b2x1bWVfcGF0Y2hfc3ljbChjb25zdCBFaWdlbjo6U3ljbERldmljZSYgc3ljbF9kZXZpY2UpIHsKICAgY29uc3QgaW50IGRlcHRoID0gNDsKICAgY29uc3QgaW50IHBhdGNoX3ogPSAyOwogICBjb25zdCBpbnQgcGF0Y2hfeSA9IDM7CkBAIC0xMDUsMzcgKzEwNiw0MiBAQAogCiAgIGFycmF5PEluZGV4VHlwZSwgNT4gdGVuc29yQ29sTWFqb3JSYW5nZSA9IHt7ZGVwdGgsIHBhdGNoX3osIHBhdGNoX3ksIHBhdGNoX3gsIGJhdGNofX07CiAgIGFycmF5PEluZGV4VHlwZSwgNT4gdGVuc29yUm93TWFqb3JSYW5nZSA9IHt7YmF0Y2gsIHBhdGNoX3gsIHBhdGNoX3ksIHBhdGNoX3osIGRlcHRofX07Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNSwgRGF0YUxheW91dCxJbmRleFR5cGU+IHRlbnNvcl9jb2xfbWFqb3IodGVuc29yQ29sTWFqb3JSYW5nZSk7Ci0gIFRlbnNvcjxEYXRhVHlwZSwgNSwgUm93TWFqb3IsSW5kZXhUeXBlPiB0ZW5zb3Jfcm93X21ham9yKHRlbnNvclJvd01ham9yUmFuZ2UpOworICBUZW5zb3I8RGF0YVR5cGUsIDUsIERhdGFMYXlvdXQsIEluZGV4VHlwZT4gdGVuc29yX2NvbF9tYWpvcih0ZW5zb3JDb2xNYWpvclJhbmdlKTsKKyAgVGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvciwgSW5kZXhUeXBlPiB0ZW5zb3Jfcm93X21ham9yKHRlbnNvclJvd01ham9yUmFuZ2UpOwogICB0ZW5zb3JfY29sX21ham9yLnNldFJhbmRvbSgpOwogCisgIERhdGFUeXBlKiBncHVfZGF0YV9jb2xfbWFqb3IgPQorICAgICAgc3RhdGljX2Nhc3Q8RGF0YVR5cGUqPihzeWNsX2RldmljZS5hbGxvY2F0ZSh0ZW5zb3JfY29sX21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSkpKTsKKyAgRGF0YVR5cGUqIGdwdV9kYXRhX3Jvd19tYWpvciA9CisgICAgICBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcl9yb3dfbWFqb3Iuc2l6ZSgpICogc2l6ZW9mKERhdGFUeXBlKSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBDb2xNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X2NvbF9tYWpvcihncHVfZGF0YV9jb2xfbWFqb3IsIHRlbnNvckNvbE1ham9yUmFuZ2UpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA1LCBSb3dNYWpvciwgSW5kZXhUeXBlPj4gZ3B1X3Jvd19tYWpvcihncHVfZGF0YV9yb3dfbWFqb3IsIHRlbnNvclJvd01ham9yUmFuZ2UpOwogCi0gICAgRGF0YVR5cGUqIGdwdV9kYXRhX2NvbF9tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHRlbnNvcl9jb2xfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSkpKTsKLSAgICBEYXRhVHlwZSogZ3B1X2RhdGFfcm93X21ham9yICA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUodGVuc29yX3Jvd19tYWpvci5zaXplKCkqc2l6ZW9mKERhdGFUeXBlKSkpOwotICAgIFRlbnNvck1hcDxUZW5zb3I8RGF0YVR5cGUsIDUsIENvbE1ham9yLCBJbmRleFR5cGU+PiBncHVfY29sX21ham9yKGdwdV9kYXRhX2NvbF9tYWpvciwgdGVuc29yQ29sTWFqb3JSYW5nZSk7Ci0gICAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNSwgUm93TWFqb3IsIEluZGV4VHlwZT4+IGdwdV9yb3dfbWFqb3IoZ3B1X2RhdGFfcm93X21ham9yLCB0ZW5zb3JSb3dNYWpvclJhbmdlKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5SG9zdFRvRGV2aWNlKGdwdV9kYXRhX2NvbF9tYWpvciwgdGVuc29yX2NvbF9tYWpvci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVuc29yX2NvbF9tYWpvci5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CisgIGdwdV9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9IGdwdV9jb2xfbWFqb3Iuc3dhcF9sYXlvdXQoKTsKKyAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpLCBncHVfZGF0YV9yb3dfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVuc29yX2NvbF9tYWpvci5zaXplKCkpICogc2l6ZW9mKERhdGFUeXBlKSk7CiAKLSAgICBzeWNsX2RldmljZS5tZW1jcHlIb3N0VG9EZXZpY2UoZ3B1X2RhdGFfY29sX21ham9yLCB0ZW5zb3JfY29sX21ham9yLmRhdGEoKSwodGVuc29yX2NvbF9tYWpvci5zaXplKCkpKnNpemVvZihEYXRhVHlwZSkpOwotICAgIGdwdV9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfY29sX21ham9yLnN3YXBfbGF5b3V0KCk7Ci0gICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KHRlbnNvcl9yb3dfbWFqb3IuZGF0YSgpLCBncHVfZGF0YV9yb3dfbWFqb3IsICh0ZW5zb3JfY29sX21ham9yLnNpemUoKSkqc2l6ZW9mKERhdGFUeXBlKSk7CisgIC8vIHNpbmdsZSB2b2x1bWUgcGF0Y2g6IENvbE1ham9yCisgIGFycmF5PEluZGV4VHlwZSwgNj4gcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlID0geworICAgICAge2RlcHRoLCBwYXRjaF96LCBwYXRjaF95LCBwYXRjaF94LCBwYXRjaF96ICogcGF0Y2hfeSAqIHBhdGNoX3gsIGJhdGNofX07CisgIFRlbnNvcjxEYXRhVHlwZSwgNiwgRGF0YUxheW91dCwgSW5kZXhUeXBlPiBlbnRpcmVfdm9sdW1lX3BhdGNoX2NvbF9tYWpvcihwYXRjaENvbE1ham9yVGVuc29yUmFuZ2UpOworICBzaXplX3QgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9IGVudGlyZV92b2x1bWVfcGF0Y2hfY29sX21ham9yLnNpemUoKSAqIHNpemVvZihEYXRhVHlwZSk7CisgIERhdGFUeXBlKiBncHVfZGF0YV9lbnRpcmVfdm9sdW1lX3BhdGNoX2NvbF9tYWpvciA9IHN0YXRpY19jYXN0PERhdGFUeXBlKj4oc3ljbF9kZXZpY2UuYWxsb2NhdGUocGF0Y2hUZW5zb3JCdWZmU2l6ZSkpOworICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA2LCBEYXRhTGF5b3V0LCBJbmRleFR5cGU+PiBncHVfZW50aXJlX3ZvbHVtZV9wYXRjaF9jb2xfbWFqb3IoCisgICAgICBncHVfZGF0YV9lbnRpcmVfdm9sdW1lX3BhdGNoX2NvbF9tYWpvciwgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKKyAgZ3B1X2VudGlyZV92b2x1bWVfcGF0Y2hfY29sX21ham9yLmRldmljZShzeWNsX2RldmljZSkgPQorICAgICAgZ3B1X2NvbF9tYWpvci5leHRyYWN0X3ZvbHVtZV9wYXRjaGVzKHBhdGNoX3osIHBhdGNoX3ksIHBhdGNoX3gpOworICBzeWNsX2RldmljZS5tZW1jcHlEZXZpY2VUb0hvc3QoZW50aXJlX3ZvbHVtZV9wYXRjaF9jb2xfbWFqb3IuZGF0YSgpLCBncHVfZGF0YV9lbnRpcmVfdm9sdW1lX3BhdGNoX2NvbF9tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoVGVuc29yQnVmZlNpemUpOwogCisgIC8vICBUZW5zb3I8ZmxvYXQsIDU+IHRlbnNvcihkZXB0aCwgcGF0Y2hfeiwgcGF0Y2hfeSwgcGF0Y2hfeCwgYmF0Y2gpOworICAvLyAgdGVuc29yLnNldFJhbmRvbSgpOworICAvLyAgVGVuc29yPGZsb2F0LCA1LCBSb3dNYWpvcj4gdGVuc29yX3Jvd19tYWpvciA9IHRlbnNvci5zd2FwX2xheW91dCgpOwogCi0gICAgLy8gc2luZ2xlIHZvbHVtZSBwYXRjaDogQ29sTWFqb3IKLSAgICBhcnJheTxJbmRleFR5cGUsIDY+IHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZT17e2RlcHRoLHBhdGNoX3osIHBhdGNoX3ksIHBhdGNoX3gsIHBhdGNoX3oqcGF0Y2hfeSpwYXRjaF94LCBiYXRjaH19OwotICAgIFRlbnNvcjxEYXRhVHlwZSwgNiwgRGF0YUxheW91dCxJbmRleFR5cGU+IGVudGlyZV92b2x1bWVfcGF0Y2hfY29sX21ham9yKHBhdGNoQ29sTWFqb3JUZW5zb3JSYW5nZSk7Ci0gICAgc2l6ZV90IHBhdGNoVGVuc29yQnVmZlNpemUgPWVudGlyZV92b2x1bWVfcGF0Y2hfY29sX21ham9yLnNpemUoKSpzaXplb2YoRGF0YVR5cGUpOwotICAgIERhdGFUeXBlKiBncHVfZGF0YV9lbnRpcmVfdm9sdW1lX3BhdGNoX2NvbF9tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKLSAgICBUZW5zb3JNYXA8VGVuc29yPERhdGFUeXBlLCA2LCBEYXRhTGF5b3V0LEluZGV4VHlwZT4+IGdwdV9lbnRpcmVfdm9sdW1lX3BhdGNoX2NvbF9tYWpvcihncHVfZGF0YV9lbnRpcmVfdm9sdW1lX3BhdGNoX2NvbF9tYWpvciwgcGF0Y2hDb2xNYWpvclRlbnNvclJhbmdlKTsKLSAgICBncHVfZW50aXJlX3ZvbHVtZV9wYXRjaF9jb2xfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfY29sX21ham9yLmV4dHJhY3Rfdm9sdW1lX3BhdGNoZXMocGF0Y2hfeiwgcGF0Y2hfeSwgcGF0Y2hfeCk7Ci0gICAgc3ljbF9kZXZpY2UubWVtY3B5RGV2aWNlVG9Ib3N0KGVudGlyZV92b2x1bWVfcGF0Y2hfY29sX21ham9yLmRhdGEoKSwgZ3B1X2RhdGFfZW50aXJlX3ZvbHVtZV9wYXRjaF9jb2xfbWFqb3IsIHBhdGNoVGVuc29yQnVmZlNpemUpOwotCi0KLS8vICBUZW5zb3I8ZmxvYXQsIDU+IHRlbnNvcihkZXB0aCwgcGF0Y2hfeiwgcGF0Y2hfeSwgcGF0Y2hfeCwgYmF0Y2gpOwotLy8gIHRlbnNvci5zZXRSYW5kb20oKTsKLS8vICBUZW5zb3I8ZmxvYXQsIDUsIFJvd01ham9yPiB0ZW5zb3Jfcm93X21ham9yID0gdGVuc29yLnN3YXBfbGF5b3V0KCk7Ci0KLSAgLy9UZW5zb3I8ZmxvYXQsIDY+IGVudGlyZV92b2x1bWVfcGF0Y2g7Ci0gIC8vZW50aXJlX3ZvbHVtZV9wYXRjaCA9IHRlbnNvci5leHRyYWN0X3ZvbHVtZV9wYXRjaGVzKHBhdGNoX3osIHBhdGNoX3ksIHBhdGNoX3gpOworICAvLyBUZW5zb3I8ZmxvYXQsIDY+IGVudGlyZV92b2x1bWVfcGF0Y2g7CisgIC8vIGVudGlyZV92b2x1bWVfcGF0Y2ggPSB0ZW5zb3IuZXh0cmFjdF92b2x1bWVfcGF0Y2hlcyhwYXRjaF96LCBwYXRjaF95LCBwYXRjaF94KTsKICAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV92b2x1bWVfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigwKSwgZGVwdGgpOwogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX3ZvbHVtZV9wYXRjaF9jb2xfbWFqb3IuZGltZW5zaW9uKDEpLCBwYXRjaF96KTsKICAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV92b2x1bWVfcGF0Y2hfY29sX21ham9yLmRpbWVuc2lvbigyKSwgcGF0Y2hfeSk7CkBAIC0xNDMsMTcgKzE0OSwyMCBAQAogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX3ZvbHVtZV9wYXRjaF9jb2xfbWFqb3IuZGltZW5zaW9uKDQpLCBwYXRjaF96ICogcGF0Y2hfeSAqIHBhdGNoX3gpOwogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX3ZvbHVtZV9wYXRjaF9jb2xfbWFqb3IuZGltZW5zaW9uKDUpLCBiYXRjaCk7CiAKLS8vICBUZW5zb3I8ZmxvYXQsIDYsIFJvd01ham9yPiBlbnRpcmVfdm9sdW1lX3BhdGNoX3Jvd19tYWpvcjsKLSAgLy9lbnRpcmVfdm9sdW1lX3BhdGNoX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF92b2x1bWVfcGF0Y2hlcyhwYXRjaF96LCBwYXRjaF95LCBwYXRjaF94KTsKKyAgLy8gIFRlbnNvcjxmbG9hdCwgNiwgUm93TWFqb3I+IGVudGlyZV92b2x1bWVfcGF0Y2hfcm93X21ham9yOworICAvLyBlbnRpcmVfdm9sdW1lX3BhdGNoX3Jvd19tYWpvciA9IHRlbnNvcl9yb3dfbWFqb3IuZXh0cmFjdF92b2x1bWVfcGF0Y2hlcyhwYXRjaF96LCBwYXRjaF95LCBwYXRjaF94KTsKIAotICBhcnJheTxJbmRleFR5cGUsIDY+IHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZT17e2JhdGNoLHBhdGNoX3oqcGF0Y2hfeSpwYXRjaF94LCBwYXRjaF94LCBwYXRjaF95LCBwYXRjaF96LCBkZXB0aH19OwotICBUZW5zb3I8RGF0YVR5cGUsIDYsIFJvd01ham9yLEluZGV4VHlwZT4gZW50aXJlX3ZvbHVtZV9wYXRjaF9yb3dfbWFqb3IocGF0Y2hSb3dNYWpvclRlbnNvclJhbmdlKTsKLSAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSA9ZW50aXJlX3ZvbHVtZV9wYXRjaF9yb3dfbWFqb3Iuc2l6ZSgpKnNpemVvZihEYXRhVHlwZSk7Ci0gIERhdGFUeXBlKiBncHVfZGF0YV9lbnRpcmVfdm9sdW1lX3BhdGNoX3Jvd19tYWpvciAgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKLSAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNiwgUm93TWFqb3IsSW5kZXhUeXBlPj4gZ3B1X2VudGlyZV92b2x1bWVfcGF0Y2hfcm93X21ham9yKGdwdV9kYXRhX2VudGlyZV92b2x1bWVfcGF0Y2hfcm93X21ham9yLCBwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UpOwotICBncHVfZW50aXJlX3ZvbHVtZV9wYXRjaF9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKT1ncHVfcm93X21ham9yLmV4dHJhY3Rfdm9sdW1lX3BhdGNoZXMocGF0Y2hfeiwgcGF0Y2hfeSwgcGF0Y2hfeCk7Ci0gIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChlbnRpcmVfdm9sdW1lX3BhdGNoX3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX2VudGlyZV92b2x1bWVfcGF0Y2hfcm93X21ham9yLCBwYXRjaFRlbnNvckJ1ZmZTaXplKTsKLQorICBhcnJheTxJbmRleFR5cGUsIDY+IHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSA9IHsKKyAgICAgIHtiYXRjaCwgcGF0Y2hfeiAqIHBhdGNoX3kgKiBwYXRjaF94LCBwYXRjaF94LCBwYXRjaF95LCBwYXRjaF96LCBkZXB0aH19OworICBUZW5zb3I8RGF0YVR5cGUsIDYsIFJvd01ham9yLCBJbmRleFR5cGU+IGVudGlyZV92b2x1bWVfcGF0Y2hfcm93X21ham9yKHBhdGNoUm93TWFqb3JUZW5zb3JSYW5nZSk7CisgIHBhdGNoVGVuc29yQnVmZlNpemUgPSBlbnRpcmVfdm9sdW1lX3BhdGNoX3Jvd19tYWpvci5zaXplKCkgKiBzaXplb2YoRGF0YVR5cGUpOworICBEYXRhVHlwZSogZ3B1X2RhdGFfZW50aXJlX3ZvbHVtZV9wYXRjaF9yb3dfbWFqb3IgPSBzdGF0aWNfY2FzdDxEYXRhVHlwZSo+KHN5Y2xfZGV2aWNlLmFsbG9jYXRlKHBhdGNoVGVuc29yQnVmZlNpemUpKTsKKyAgVGVuc29yTWFwPFRlbnNvcjxEYXRhVHlwZSwgNiwgUm93TWFqb3IsIEluZGV4VHlwZT4+IGdwdV9lbnRpcmVfdm9sdW1lX3BhdGNoX3Jvd19tYWpvcigKKyAgICAgIGdwdV9kYXRhX2VudGlyZV92b2x1bWVfcGF0Y2hfcm93X21ham9yLCBwYXRjaFJvd01ham9yVGVuc29yUmFuZ2UpOworICBncHVfZW50aXJlX3ZvbHVtZV9wYXRjaF9yb3dfbWFqb3IuZGV2aWNlKHN5Y2xfZGV2aWNlKSA9CisgICAgICBncHVfcm93X21ham9yLmV4dHJhY3Rfdm9sdW1lX3BhdGNoZXMocGF0Y2hfeiwgcGF0Y2hfeSwgcGF0Y2hfeCk7CisgIHN5Y2xfZGV2aWNlLm1lbWNweURldmljZVRvSG9zdChlbnRpcmVfdm9sdW1lX3BhdGNoX3Jvd19tYWpvci5kYXRhKCksIGdwdV9kYXRhX2VudGlyZV92b2x1bWVfcGF0Y2hfcm93X21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hUZW5zb3JCdWZmU2l6ZSk7CiAKICAgVkVSSUZZX0lTX0VRVUFMKGVudGlyZV92b2x1bWVfcGF0Y2hfcm93X21ham9yLmRpbWVuc2lvbigwKSwgYmF0Y2gpOwogICBWRVJJRllfSVNfRVFVQUwoZW50aXJlX3ZvbHVtZV9wYXRjaF9yb3dfbWFqb3IuZGltZW5zaW9uKDEpLCBwYXRjaF96ICogcGF0Y2hfeSAqIHBhdGNoX3gpOwpAQCAtMTg0LDggKzE5Myw3IEBACiAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZWZmX3ogPSB6IC0gZm9yd2FyZF9wYWRfeiArIHB6OwogICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGVmZl95ID0geSAtIGZvcndhcmRfcGFkX3kgKyBweTsKICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBlZmZfeCA9IHggLSBmb3J3YXJkX3BhZF94ICsgcHg7Ci0gICAgICAgICAgICAgICAgICBpZiAoZWZmX3ogPj0gMCAmJiBlZmZfeSA+PSAwICYmIGVmZl94ID49IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICBlZmZfeiA8IHBhdGNoX3ogJiYgZWZmX3kgPCBwYXRjaF95ICYmIGVmZl94IDwgcGF0Y2hfeCkgeworICAgICAgICAgICAgICAgICAgaWYgKGVmZl96ID49IDAgJiYgZWZmX3kgPj0gMCAmJiBlZmZfeCA+PSAwICYmIGVmZl96IDwgcGF0Y2hfeiAmJiBlZmZfeSA8IHBhdGNoX3kgJiYgZWZmX3ggPCBwYXRjaF94KSB7CiAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGVuc29yX2NvbF9tYWpvcihkLCBlZmZfeiwgZWZmX3ksIGVmZl94LCBiKTsKICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcm93X21ham9yID0gdGVuc29yX3Jvd19tYWpvcihiLCBlZmZfeCwgZWZmX3ksIGVmZl96LCBkKTsKICAgICAgICAgICAgICAgICAgIH0KQEAgLTIwNSwxOSArMjEzLDE3IEBACiAgIHN5Y2xfZGV2aWNlLmRlYWxsb2NhdGUoZ3B1X2RhdGFfZW50aXJlX3ZvbHVtZV9wYXRjaF9yb3dfbWFqb3IpOwogfQogCi0KLQotdGVtcGxhdGU8dHlwZW5hbWUgRGF0YVR5cGUsIHR5cGVuYW1lIGRldl9TZWxlY3Rvcj4gdm9pZCBzeWNsX3RlbnNvcl92b2x1bWVfcGF0Y2hfdGVzdF9wZXJfZGV2aWNlKGRldl9TZWxlY3RvciBzKXsKLVF1ZXVlSW50ZXJmYWNlIHF1ZXVlSW50ZXJmYWNlKHMpOwotYXV0byBzeWNsX2RldmljZSA9IEVpZ2VuOjpTeWNsRGV2aWNlKCZxdWV1ZUludGVyZmFjZSk7Ci1zdGQ6OmNvdXQgPDwgIlJ1bm5pbmcgb24gIiA8PCBzLnRlbXBsYXRlIGdldF9pbmZvPGNsOjpzeWNsOjppbmZvOjpkZXZpY2U6Om5hbWU+KCkgPDwgc3RkOjplbmRsOwotdGVzdF9zaW5nbGVfdm94ZWxfcGF0Y2hfc3ljbDxEYXRhVHlwZSwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwotdGVzdF9lbnRpcmVfdm9sdW1lX3BhdGNoX3N5Y2w8RGF0YVR5cGUsIGludDY0X3Q+KHN5Y2xfZGV2aWNlKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVHlwZSwgdHlwZW5hbWUgZGV2X1NlbGVjdG9yPgordm9pZCBzeWNsX3RlbnNvcl92b2x1bWVfcGF0Y2hfdGVzdF9wZXJfZGV2aWNlKGRldl9TZWxlY3RvciBzKSB7CisgIFF1ZXVlSW50ZXJmYWNlIHF1ZXVlSW50ZXJmYWNlKHMpOworICBhdXRvIHN5Y2xfZGV2aWNlID0gRWlnZW46OlN5Y2xEZXZpY2UoJnF1ZXVlSW50ZXJmYWNlKTsKKyAgc3RkOjpjb3V0IDw8ICJSdW5uaW5nIG9uICIgPDwgcy50ZW1wbGF0ZSBnZXRfaW5mbzxjbDo6c3ljbDo6aW5mbzo6ZGV2aWNlOjpuYW1lPigpIDw8IHN0ZDo6ZW5kbDsKKyAgdGVzdF9zaW5nbGVfdm94ZWxfcGF0Y2hfc3ljbDxEYXRhVHlwZSwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOworICB0ZXN0X2VudGlyZV92b2x1bWVfcGF0Y2hfc3ljbDxEYXRhVHlwZSwgaW50NjRfdD4oc3ljbF9kZXZpY2UpOwogfQotRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl92b2x1bWVfcGF0Y2hfc3ljbCkKLXsKLWZvciAoY29uc3QgYXV0byYgZGV2aWNlIDpFaWdlbjo6Z2V0X3N5Y2xfc3VwcG9ydGVkX2RldmljZXMoKSkgewotICBDQUxMX1NVQlRFU1Qoc3ljbF90ZW5zb3Jfdm9sdW1lX3BhdGNoX3Rlc3RfcGVyX2RldmljZTxoYWxmPihkZXZpY2UpKTsKLSAgQ0FMTF9TVUJURVNUKHN5Y2xfdGVuc29yX3ZvbHVtZV9wYXRjaF90ZXN0X3Blcl9kZXZpY2U8ZmxvYXQ+KGRldmljZSkpOwotfQorRUlHRU5fREVDTEFSRV9URVNUKGN4eDExX3RlbnNvcl92b2x1bWVfcGF0Y2hfc3ljbCkgeworICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IEVpZ2VuOjpnZXRfc3ljbF9zdXBwb3J0ZWRfZGV2aWNlcygpKSB7CisgICAgQ0FMTF9TVUJURVNUKHN5Y2xfdGVuc29yX3ZvbHVtZV9wYXRjaF90ZXN0X3Blcl9kZXZpY2U8aGFsZj4oZGV2aWNlKSk7CisgICAgQ0FMTF9TVUJURVNUKHN5Y2xfdGVuc29yX3ZvbHVtZV9wYXRjaF90ZXN0X3Blcl9kZXZpY2U8ZmxvYXQ+KGRldmljZSkpOworICB9CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2RnbXJlcy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2RnbXJlcy5jcHAKaW5kZXggNWY2MzE2MS4uOTQwODAwYyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9kZ21yZXMuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvZGdtcmVzLmNwcApAQCAtMTEsMjEgKzExLDIwIEBACiAjaW5jbHVkZSAiLi4vLi4vdGVzdC9zcGFyc2Vfc29sdmVyLmgiCiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vSXRlcmF0aXZlU29sdmVycz4KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0X2RnbXJlc19UKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCB0ZXN0X2RnbXJlc19UKCkgewogICBER01SRVM8U3BhcnNlTWF0cml4PFQ+LCBEaWFnb25hbFByZWNvbmRpdGlvbmVyPFQ+ID4gZGdtcmVzX2NvbG1ham9yX2RpYWc7Ci0gIERHTVJFUzxTcGFyc2VNYXRyaXg8VD4sIElkZW50aXR5UHJlY29uZGl0aW9uZXIgICAgPiBkZ21yZXNfY29sbWFqb3JfSTsKLSAgREdNUkVTPFNwYXJzZU1hdHJpeDxUPiwgSW5jb21wbGV0ZUxVVDxUPiA+ICAgICAgICAgICBkZ21yZXNfY29sbWFqb3JfaWx1dDsKLSAgLy9HTVJFUzxTcGFyc2VNYXRyaXg8VD4sIFNTT1JQcmVjb25kaXRpb25lcjxUPiA+ICAgICBkZ21yZXNfY29sbWFqb3Jfc3NvcjsKKyAgREdNUkVTPFNwYXJzZU1hdHJpeDxUPiwgSWRlbnRpdHlQcmVjb25kaXRpb25lcj4gZGdtcmVzX2NvbG1ham9yX0k7CisgIERHTVJFUzxTcGFyc2VNYXRyaXg8VD4sIEluY29tcGxldGVMVVQ8VD4gPiBkZ21yZXNfY29sbWFqb3JfaWx1dDsKKyAgLy8gR01SRVM8U3BhcnNlTWF0cml4PFQ+LCBTU09SUHJlY29uZGl0aW9uZXI8VD4gPiAgICAgZGdtcmVzX2NvbG1ham9yX3Nzb3I7CiAKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZGdtcmVzX2NvbG1ham9yX2RpYWcpICApOwotLy8gICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhkZ21yZXNfY29sbWFqb3JfSSkgICAgICk7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGRnbXJlc19jb2xtYWpvcl9pbHV0KSAgICAgKTsKLSAgLy9DQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhkZ21yZXNfY29sbWFqb3Jfc3NvcikgICAgICk7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZGdtcmVzX2NvbG1ham9yX2RpYWcpKTsKKyAgLy8gICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhkZ21yZXNfY29sbWFqb3JfSSkgICAgICk7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZGdtcmVzX2NvbG1ham9yX2lsdXQpKTsKKyAgLy8gQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZGdtcmVzX2NvbG1ham9yX3Nzb3IpICAgICApOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoZGdtcmVzKQoteworRUlHRU5fREVDTEFSRV9URVNUKGRnbXJlcykgewogICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2RnbXJlc19UPGRvdWJsZT4oKSk7CiAgIENBTExfU1VCVEVTVF8yKHRlc3RfZGdtcmVzX1Q8c3RkOjpjb21wbGV4PGRvdWJsZT4gPigpKTsKIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvZm9yd2FyZF9hZG9sYy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2ZvcndhcmRfYWRvbGMuY3BwCmluZGV4IDI3ZDA5ZGQuLjVkMTI5YTAgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvZm9yd2FyZF9hZG9sYy5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9mb3J3YXJkX2Fkb2xjLmNwcApAQCAtMTMsMjQgKzEzLDE5IEBACiAjZGVmaW5lIE5VTUJFUl9ESVJFQ1RJT05TIDE2CiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vQWRvbGNGb3J3YXJkPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3I+Ci1FSUdFTl9ET05UX0lOTElORSB0eXBlbmFtZSBWZWN0b3I6OlNjYWxhciBmb28oY29uc3QgVmVjdG9yJiBwKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFZlY3Rvcj4KK0VJR0VOX0RPTlRfSU5MSU5FIHR5cGVuYW1lIFZlY3Rvcjo6U2NhbGFyIGZvbyhjb25zdCBWZWN0b3ImIHApIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBWZWN0b3I6OlNjYWxhciBTY2FsYXI7Ci0gIHJldHVybiAocC1WZWN0b3IoU2NhbGFyKC0xKSxTY2FsYXIoMS4pKSkubm9ybSgpICsgKHAuYXJyYXkoKS5zcXJ0KCkuYWJzKCkgKiBwLmFycmF5KCkuc2luKCkpLnN1bSgpICsgcC5kb3QocCk7CisgIHJldHVybiAocCAtIFZlY3RvcihTY2FsYXIoLTEpLCBTY2FsYXIoMS4pKSkubm9ybSgpICsgKHAuYXJyYXkoKS5zcXJ0KCkuYWJzKCkgKiBwLmFycmF5KCkuc2luKCkpLnN1bSgpICsgcC5kb3QocCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcl8sIGludCBOWD1EeW5hbWljLCBpbnQgTlk9RHluYW1pYz4KLXN0cnVjdCBUZXN0RnVuYzEKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXJfLCBpbnQgTlggPSBEeW5hbWljLCBpbnQgTlkgPSBEeW5hbWljPgorc3RydWN0IFRlc3RGdW5jMSB7CiAgIHR5cGVkZWYgU2NhbGFyXyBTY2FsYXI7Ci0gIGVudW0gewotICAgIElucHV0c0F0Q29tcGlsZVRpbWUgPSBOWCwKLSAgICBWYWx1ZXNBdENvbXBpbGVUaW1lID0gTlkKLSAgfTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLElucHV0c0F0Q29tcGlsZVRpbWUsMT4gSW5wdXRUeXBlOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsVmFsdWVzQXRDb21waWxlVGltZSwxPiBWYWx1ZVR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixWYWx1ZXNBdENvbXBpbGVUaW1lLElucHV0c0F0Q29tcGlsZVRpbWU+IEphY29iaWFuVHlwZTsKKyAgZW51bSB7IElucHV0c0F0Q29tcGlsZVRpbWUgPSBOWCwgVmFsdWVzQXRDb21waWxlVGltZSA9IE5ZIH07CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgSW5wdXRzQXRDb21waWxlVGltZSwgMT4gSW5wdXRUeXBlOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsIFZhbHVlc0F0Q29tcGlsZVRpbWUsIDE+IFZhbHVlVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyLCBWYWx1ZXNBdENvbXBpbGVUaW1lLCBJbnB1dHNBdENvbXBpbGVUaW1lPiBKYWNvYmlhblR5cGU7CiAKICAgaW50IG1faW5wdXRzLCBtX3ZhbHVlczsKIApAQCAtNDAsMTAyICszNSw5MyBAQAogICBpbnQgaW5wdXRzKCkgY29uc3QgeyByZXR1cm4gbV9pbnB1dHM7IH0KICAgaW50IHZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWVzOyB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgdm9pZCBvcGVyYXRvcigpIChjb25zdCBNYXRyaXg8VCxJbnB1dHNBdENvbXBpbGVUaW1lLDE+JiB4LCBNYXRyaXg8VCxWYWx1ZXNBdENvbXBpbGVUaW1lLDE+KiBfdikgY29uc3QKLSAgewotICAgIE1hdHJpeDxULFZhbHVlc0F0Q29tcGlsZVRpbWUsMT4mIHYgPSAqX3Y7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgTWF0cml4PFQsIElucHV0c0F0Q29tcGlsZVRpbWUsIDE+JiB4LCBNYXRyaXg8VCwgVmFsdWVzQXRDb21waWxlVGltZSwgMT4qIF92KSBjb25zdCB7CisgICAgTWF0cml4PFQsIFZhbHVlc0F0Q29tcGlsZVRpbWUsIDE+JiB2ID0gKl92OwogCiAgICAgdlswXSA9IDIgKiB4WzBdICogeFswXSArIHhbMF0gKiB4WzFdOwogICAgIHZbMV0gPSAzICogeFsxXSAqIHhbMF0gKyAwLjUgKiB4WzFdICogeFsxXTsKLSAgICBpZihpbnB1dHMoKT4yKQotICAgIHsKKyAgICBpZiAoaW5wdXRzKCkgPiAyKSB7CiAgICAgICB2WzBdICs9IDAuNSAqIHhbMl07CiAgICAgICB2WzFdICs9IHhbMl07CiAgICAgfQotICAgIGlmKHZhbHVlcygpPjIpCi0gICAgeworICAgIGlmICh2YWx1ZXMoKSA+IDIpIHsKICAgICAgIHZbMl0gPSAzICogeFsxXSAqIHhbMF0gKiB4WzBdOwogICAgIH0KLSAgICBpZiAoaW5wdXRzKCk+MiAmJiB2YWx1ZXMoKT4yKQotICAgICAgdlsyXSAqPSB4WzJdOworICAgIGlmIChpbnB1dHMoKSA+IDIgJiYgdmFsdWVzKCkgPiAyKSB2WzJdICo9IHhbMl07CiAgIH0KIAotICB2b2lkIG9wZXJhdG9yKCkgKGNvbnN0IElucHV0VHlwZSYgeCwgVmFsdWVUeXBlKiB2LCBKYWNvYmlhblR5cGUqIF9qKSBjb25zdAotICB7CisgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBJbnB1dFR5cGUmIHgsIFZhbHVlVHlwZSogdiwgSmFjb2JpYW5UeXBlKiBfaikgY29uc3QgewogICAgICgqdGhpcykoeCwgdik7CiAKLSAgICBpZihfaikKLSAgICB7CisgICAgaWYgKF9qKSB7CiAgICAgICBKYWNvYmlhblR5cGUmIGogPSAqX2o7CiAKLSAgICAgIGooMCwwKSA9IDQgKiB4WzBdICsgeFsxXTsKLSAgICAgIGooMSwwKSA9IDMgKiB4WzFdOworICAgICAgaigwLCAwKSA9IDQgKiB4WzBdICsgeFsxXTsKKyAgICAgIGooMSwgMCkgPSAzICogeFsxXTsKIAotICAgICAgaigwLDEpID0geFswXTsKLSAgICAgIGooMSwxKSA9IDMgKiB4WzBdICsgMiAqIDAuNSAqIHhbMV07CisgICAgICBqKDAsIDEpID0geFswXTsKKyAgICAgIGooMSwgMSkgPSAzICogeFswXSArIDIgKiAwLjUgKiB4WzFdOwogCi0gICAgICBpZiAoaW5wdXRzKCk+MikKLSAgICAgIHsKLSAgICAgICAgaigwLDIpID0gMC41OwotICAgICAgICBqKDEsMikgPSAxOworICAgICAgaWYgKGlucHV0cygpID4gMikgeworICAgICAgICBqKDAsIDIpID0gMC41OworICAgICAgICBqKDEsIDIpID0gMTsKICAgICAgIH0KLSAgICAgIGlmKHZhbHVlcygpPjIpCi0gICAgICB7Ci0gICAgICAgIGooMiwwKSA9IDMgKiB4WzFdICogMiAqIHhbMF07Ci0gICAgICAgIGooMiwxKSA9IDMgKiB4WzBdICogeFswXTsKKyAgICAgIGlmICh2YWx1ZXMoKSA+IDIpIHsKKyAgICAgICAgaigyLCAwKSA9IDMgKiB4WzFdICogMiAqIHhbMF07CisgICAgICAgIGooMiwgMSkgPSAzICogeFswXSAqIHhbMF07CiAgICAgICB9Ci0gICAgICBpZiAoaW5wdXRzKCk+MiAmJiB2YWx1ZXMoKT4yKQotICAgICAgewotICAgICAgICBqKDIsMCkgKj0geFsyXTsKLSAgICAgICAgaigyLDEpICo9IHhbMl07CisgICAgICBpZiAoaW5wdXRzKCkgPiAyICYmIHZhbHVlcygpID4gMikgeworICAgICAgICBqKDIsIDApICo9IHhbMl07CisgICAgICAgIGooMiwgMSkgKj0geFsyXTsKIAotICAgICAgICBqKDIsMikgPSAzICogeFsxXSAqIHhbMF0gKiB4WzBdOwotICAgICAgICBqKDIsMikgPSAzICogeFsxXSAqIHhbMF0gKiB4WzBdOworICAgICAgICBqKDIsIDIpID0gMyAqIHhbMV0gKiB4WzBdICogeFswXTsKKyAgICAgICAgaigyLCAyKSA9IDMgKiB4WzFdICogeFswXSAqIHhbMF07CiAgICAgICB9CiAgICAgfQogICB9CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jPiB2b2lkIGFkb2xjX2ZvcndhcmRfamFjb2JpYW4oY29uc3QgRnVuYyYgZikKLXsKLSAgICB0eXBlbmFtZSBGdW5jOjpJbnB1dFR5cGUgeCA9IEZ1bmM6OklucHV0VHlwZTo6UmFuZG9tKGYuaW5wdXRzKCkpOwotICAgIHR5cGVuYW1lIEZ1bmM6OlZhbHVlVHlwZSB5KGYudmFsdWVzKCkpLCB5cmVmKGYudmFsdWVzKCkpOwotICAgIHR5cGVuYW1lIEZ1bmM6OkphY29iaWFuVHlwZSBqKGYudmFsdWVzKCksZi5pbnB1dHMoKSksIGpyZWYoZi52YWx1ZXMoKSxmLmlucHV0cygpKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5jPgordm9pZCBhZG9sY19mb3J3YXJkX2phY29iaWFuKGNvbnN0IEZ1bmMmIGYpIHsKKyAgdHlwZW5hbWUgRnVuYzo6SW5wdXRUeXBlIHggPSBGdW5jOjpJbnB1dFR5cGU6OlJhbmRvbShmLmlucHV0cygpKTsKKyAgdHlwZW5hbWUgRnVuYzo6VmFsdWVUeXBlIHkoZi52YWx1ZXMoKSksIHlyZWYoZi52YWx1ZXMoKSk7CisgIHR5cGVuYW1lIEZ1bmM6OkphY29iaWFuVHlwZSBqKGYudmFsdWVzKCksIGYuaW5wdXRzKCkpLCBqcmVmKGYudmFsdWVzKCksIGYuaW5wdXRzKCkpOwogCi0gICAganJlZi5zZXRaZXJvKCk7Ci0gICAgeXJlZi5zZXRaZXJvKCk7Ci0gICAgZih4LCZ5cmVmLCZqcmVmKTsKLS8vICAgICBzdGQ6OmNlcnIgPDwgeS50cmFuc3Bvc2UoKSA8PCAiXG5cbiI7OwotLy8gICAgIHN0ZDo6Y2VyciA8PCBqIDw8ICJcblxuIjs7CisgIGpyZWYuc2V0WmVybygpOworICB5cmVmLnNldFplcm8oKTsKKyAgZih4LCAmeXJlZiwgJmpyZWYpOworICAvLyAgICAgc3RkOjpjZXJyIDw8IHkudHJhbnNwb3NlKCkgPDwgIlxuXG4iOzsKKyAgLy8gICAgIHN0ZDo6Y2VyciA8PCBqIDw8ICJcblxuIjs7CiAKLSAgICBqLnNldFplcm8oKTsKLSAgICB5LnNldFplcm8oKTsKLSAgICBBZG9sY0ZvcndhcmRKYWNvYmlhbjxGdW5jPiBhdXRvaihmKTsKLSAgICBhdXRvaih4LCAmeSwgJmopOwotLy8gICAgIHN0ZDo6Y2VyciA8PCB5LnRyYW5zcG9zZSgpIDw8ICJcblxuIjs7Ci0vLyAgICAgc3RkOjpjZXJyIDw8IGogPDwgIlxuXG4iOzsKKyAgai5zZXRaZXJvKCk7CisgIHkuc2V0WmVybygpOworICBBZG9sY0ZvcndhcmRKYWNvYmlhbjxGdW5jPiBhdXRvaihmKTsKKyAgYXV0b2ooeCwgJnksICZqKTsKKyAgLy8gICAgIHN0ZDo6Y2VyciA8PCB5LnRyYW5zcG9zZSgpIDw8ICJcblxuIjs7CisgIC8vICAgICBzdGQ6OmNlcnIgPDwgaiA8PCAiXG5cbiI7OwogCi0gICAgVkVSSUZZX0lTX0FQUFJPWCh5LCB5cmVmKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKGosIGpyZWYpOworICBWRVJJRllfSVNfQVBQUk9YKHksIHlyZWYpOworICBWRVJJRllfSVNfQVBQUk9YKGosIGpyZWYpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoZm9yd2FyZF9hZG9sYykKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChmb3J3YXJkX2Fkb2xjKSB7CiAgIGFkdGw6OnNldE51bURpcihOVU1CRVJfRElSRUNUSU9OUyk7CiAKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBDQUxMX1NVQlRFU1QoKCBhZG9sY19mb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMiwyPigpKSApKTsKLSAgICBDQUxMX1NVQlRFU1QoKCBhZG9sY19mb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMiwzPigpKSApKTsKLSAgICBDQUxMX1NVQlRFU1QoKCBhZG9sY19mb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMywyPigpKSApKTsKLSAgICBDQUxMX1NVQlRFU1QoKCBhZG9sY19mb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGUsMywzPigpKSApKTsKLSAgICBDQUxMX1NVQlRFU1QoKCBhZG9sY19mb3J3YXJkX2phY29iaWFuKFRlc3RGdW5jMTxkb3VibGU+KDMsMykpICkpOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1QoKGFkb2xjX2ZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwgMiwgMj4oKSkpKTsKKyAgICBDQUxMX1NVQlRFU1QoKGFkb2xjX2ZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwgMiwgMz4oKSkpKTsKKyAgICBDQUxMX1NVQlRFU1QoKGFkb2xjX2ZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwgMywgMj4oKSkpKTsKKyAgICBDQUxMX1NVQlRFU1QoKGFkb2xjX2ZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZSwgMywgMz4oKSkpKTsKKyAgICBDQUxMX1NVQlRFU1QoKGFkb2xjX2ZvcndhcmRfamFjb2JpYW4oVGVzdEZ1bmMxPGRvdWJsZT4oMywgMykpKSk7CiAgIH0KIAogICB7CiAgICAgLy8gc2ltcGxlIGluc3RhbnRpYXRpb24gdGVzdHMKLSAgICBNYXRyaXg8YWR0bDo6YWRvdWJsZSwyLDE+IHg7CisgICAgTWF0cml4PGFkdGw6OmFkb3VibGUsIDIsIDE+IHg7CiAgICAgZm9vKHgpOwotICAgIE1hdHJpeDxhZHRsOjphZG91YmxlLER5bmFtaWMsRHluYW1pYz4gQSg0LDQpOzsKKyAgICBNYXRyaXg8YWR0bDo6YWRvdWJsZSwgRHluYW1pYywgRHluYW1pYz4gQSg0LCA0KTsKKyAgICA7CiAgICAgQS5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkuZWlnZW52YWx1ZXMoKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9nbXJlcy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2dtcmVzLmNwcAppbmRleCA4ZDIyNTRiLi4yMjViYjk2IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2dtcmVzLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L2dtcmVzLmNwcApAQCAtMTEsMjEgKzExLDIwIEBACiAjaW5jbHVkZSAiLi4vLi4vdGVzdC9zcGFyc2Vfc29sdmVyLmgiCiAjaW5jbHVkZSA8RWlnZW4vSXRlcmF0aXZlU29sdmVycz4KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0X2dtcmVzX1QoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3RfZ21yZXNfVCgpIHsKICAgR01SRVM8U3BhcnNlTWF0cml4PFQ+LCBEaWFnb25hbFByZWNvbmRpdGlvbmVyPFQ+ID4gZ21yZXNfY29sbWFqb3JfZGlhZzsKLSAgR01SRVM8U3BhcnNlTWF0cml4PFQ+LCBJZGVudGl0eVByZWNvbmRpdGlvbmVyICAgID4gZ21yZXNfY29sbWFqb3JfSTsKLSAgR01SRVM8U3BhcnNlTWF0cml4PFQ+LCBJbmNvbXBsZXRlTFVUPFQ+ID4gICAgICAgICAgIGdtcmVzX2NvbG1ham9yX2lsdXQ7Ci0gIC8vR01SRVM8U3BhcnNlTWF0cml4PFQ+LCBTU09SUHJlY29uZGl0aW9uZXI8VD4gPiAgICAgZ21yZXNfY29sbWFqb3Jfc3NvcjsKKyAgR01SRVM8U3BhcnNlTWF0cml4PFQ+LCBJZGVudGl0eVByZWNvbmRpdGlvbmVyPiBnbXJlc19jb2xtYWpvcl9JOworICBHTVJFUzxTcGFyc2VNYXRyaXg8VD4sIEluY29tcGxldGVMVVQ8VD4gPiBnbXJlc19jb2xtYWpvcl9pbHV0OworICAvLyBHTVJFUzxTcGFyc2VNYXRyaXg8VD4sIFNTT1JQcmVjb25kaXRpb25lcjxUPiA+ICAgICBnbXJlc19jb2xtYWpvcl9zc29yOwogCi0gIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGdtcmVzX2NvbG1ham9yX2RpYWcpICApOwotLy8gICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhnbXJlc19jb2xtYWpvcl9JKSAgICAgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZ21yZXNfY29sbWFqb3JfaWx1dCkgICAgICk7Ci0gIC8vQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZ21yZXNfY29sbWFqb3Jfc3NvcikgICAgICk7CisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZ21yZXNfY29sbWFqb3JfZGlhZykpOworICAvLyAgIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGdtcmVzX2NvbG1ham9yX0kpICAgICApOworICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGdtcmVzX2NvbG1ham9yX2lsdXQpKTsKKyAgLy8gQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3F1YXJlX3NvbHZpbmcoZ21yZXNfY29sbWFqb3Jfc3NvcikgICAgICk7CiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChnbXJlcykKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChnbXJlcykgewogICBDQUxMX1NVQlRFU1RfMSh0ZXN0X2dtcmVzX1Q8ZG91YmxlPigpKTsKICAgQ0FMTF9TVUJURVNUXzIodGVzdF9nbXJlc19UPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2lkcnMuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9pZHJzLmNwcAppbmRleCBmODhjMDE2Li45YTJlNGE1IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L2lkcnMuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvaWRycy5jcHAKQEAgLTExLDE3ICsxMSwxNiBAQAogI2luY2x1ZGUgIi4uLy4uL3Rlc3Qvc3BhcnNlX3NvbHZlci5oIgogI2luY2x1ZGUgPEVpZ2VuL0l0ZXJhdGl2ZVNvbHZlcnM+CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdF9pZHJzX1QoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3RfaWRyc19UKCkgewogICBJRFJTPFNwYXJzZU1hdHJpeDxUPiwgRGlhZ29uYWxQcmVjb25kaXRpb25lcjxUPiA+IGlkcnNfY29sbWFqb3JfZGlhZzsKLSAgSURSUzxTcGFyc2VNYXRyaXg8VD4sIEluY29tcGxldGVMVVQ8VD4gPiAgICAgICAgICAgaWRyc19jb2xtYWpvcl9pbHV0OworICBJRFJTPFNwYXJzZU1hdHJpeDxUPiwgSW5jb21wbGV0ZUxVVDxUPiA+IGlkcnNfY29sbWFqb3JfaWx1dDsKIAotICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhpZHJzX2NvbG1ham9yX2RpYWcpICApOwotICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcXVhcmVfc29sdmluZyhpZHJzX2NvbG1ham9yX2lsdXQpICAgICApOworICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGlkcnNfY29sbWFqb3JfZGlhZykpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NxdWFyZV9zb2x2aW5nKGlkcnNfY29sbWFqb3JfaWx1dCkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QoaWRycykKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChpZHJzKSB7CiAgIENBTExfU1VCVEVTVF8xKHRlc3RfaWRyc19UPGRvdWJsZT4oKSk7CiAgIENBTExfU1VCVEVTVF8yKHRlc3RfaWRyc19UPHN0ZDo6Y29tcGxleDxkb3VibGU+ID4oKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L2tyb25lY2tlcl9wcm9kdWN0LmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3Qva3JvbmVja2VyX3Byb2R1Y3QuY3BwCmluZGV4IDNiYWMwMWQuLjg3ZDIxM2UgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3Qva3JvbmVja2VyX3Byb2R1Y3QuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3Qva3JvbmVja2VyX3Byb2R1Y3QuY3BwCkBAIC05LDIyNiArOSwyMTcgQEAKIC8vIFB1YmxpYyBMaWNlbnNlIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZAogLy8gd2l0aCB0aGlzIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uCiAKLQogI2lmZGVmIEVJR0VOX1RFU1RfUEFSVF8xCiAKICNpbmNsdWRlICJzcGFyc2UuaCIKICNpbmNsdWRlIDxFaWdlbi9TcGFyc2VFeHRyYT4KICNpbmNsdWRlIDxFaWdlbi9Lcm9uZWNrZXJQcm9kdWN0PgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCBjaGVja19kaW1lbnNpb24oY29uc3QgTWF0cml4VHlwZSYgYWIsIGNvbnN0IGludCByb3dzLCAgY29uc3QgaW50IGNvbHMpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY2hlY2tfZGltZW5zaW9uKGNvbnN0IE1hdHJpeFR5cGUmIGFiLCBjb25zdCBpbnQgcm93cywgY29uc3QgaW50IGNvbHMpIHsKICAgVkVSSUZZX0lTX0VRVUFMKGFiLnJvd3MoKSwgcm93cyk7CiAgIFZFUklGWV9JU19FUVVBTChhYi5jb2xzKCksIGNvbHMpOwogfQogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KGNvbnN0IE1hdHJpeFR5cGUmIGFiKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KGNvbnN0IE1hdHJpeFR5cGUmIGFiKSB7CiAgIFZFUklGWV9JU19FUVVBTChhYi5yb3dzKCksIDYpOwogICBWRVJJRllfSVNfRVFVQUwoYWIuY29scygpLCA2KTsKLSAgVkVSSUZZX0lTX0VRVUFMKGFiLnNpemUoKSwgIDM2KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLDApLCAtMC40MDE3MzY3NjMwMzg2MTA2KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLDEpLCAgMC4xMDU2ODYzNDMzOTMyNzM1KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLDIpLCAtMC43MjU1MjA2MTk0NTU0MjEyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLDMpLCAgMC4xOTA4NjUzMzM2NzQ0NzA2KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLDQpLCAgMC4zNTA4NjQ1NjcyMzQxMTEpOwotICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDAsNSksIC0wLjA5MjMwMzIxMDgzMDgwMTMpOwotICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDEsMCksICAwLjQxNTQxNzUxNDgwNDY3Nyk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMSwxKSwgLTAuMjM2OTIyNzcwMTcyMjA0OCk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMSwyKSwgIDAuNzUwMjI3NTEzMTQ1ODUxMSk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMSwzKSwgLTAuNDI3ODczMTAxOTc0MjY5Nik7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMSw0KSwgLTAuMzYyODEyOTE2MjI2NDUwNyk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMSw1KSwgIDAuMjA2OTIxMDgwODQ4MTI3NSk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMiwwKSwgIDAuMDU0NjU4OTAxNjA4NjM5ODYpOwotICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDIsMSksIC0wLjI2MzQwOTI1MTE0MTk4NTgpOwotICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDIsMiksICAwLjA5ODcxMTgwMjg1NzkzNzU4KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigyLDMpLCAtMC40NzU3MDY2MzM0MDE3NzAyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigyLDQpLCAtMC4wNDc3Mzc0MDgyMzA1ODMzNCk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMiw1KSwgIDAuMjMwMDUzNTYwOTY0NTI1NCk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMywwKSwgLTAuODE3Mjk0NTg1MzI2MDEzMyk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMywxKSwgIDAuMjE1MDA4NjQyODM1OTIyMSk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMywyKSwgIDAuNTgyNTExMzg0NzI5Mjc0Myk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMywzKSwgLTAuMTUzMjQzMzc3MDA5NzE3NCk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMyw0KSwgLTAuMzI5MzgzMzg3MjgyMzk5KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigzLDUpLCAgMC4wODY2NTIwNzkxMjAzMzA2NCk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNCwwKSwgIDAuODQ1MTI2NzUxNDg2MzIyNSk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNCwxKSwgLTAuNDgxOTk2NDU4OTE4OTc3KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LDIpLCAtMC42MDIzNDgyMzkwNzkxNTM1KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LDMpLCAgMC4zNDM1MzM5MzQ3MTY0NTY1KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LDQpLCAgMC4zNDA2MDAyMTU3NDI4ODkxKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LDUpLCAtMC4xOTQyNTI2MzQ0MjAwOTE1KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig1LDApLCAgMC4xMTExOTgyNDgyOTI1Mzk5KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig1LDEpLCAtMC41MzU4ODA2NDI0NzU0MTY5KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig1LDIpLCAtMC4wNzkyNTQ0NjU1OTMzNTY0Nyk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNSwzKSwgIDAuMzgxOTM4ODc1Nzc2OTAzOCk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNSw0KSwgIDAuMDQ0ODE0NzUzODcyMTk4NzYpOwotICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDUsNSksIC0wLjIxNTk2ODg2MTYxNTgwNTcpOworICBWRVJJRllfSVNfRVFVQUwoYWIuc2l6ZSgpLCAzNik7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMCwgMCksIC0wLjQwMTczNjc2MzAzODYxMDYpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDAsIDEpLCAwLjEwNTY4NjM0MzM5MzI3MzUpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDAsIDIpLCAtMC43MjU1MjA2MTk0NTU0MjEyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLCAzKSwgMC4xOTA4NjUzMzM2NzQ0NzA2KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLCA0KSwgMC4zNTA4NjQ1NjcyMzQxMTEpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDAsIDUpLCAtMC4wOTIzMDMyMTA4MzA4MDEzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigxLCAwKSwgMC40MTU0MTc1MTQ4MDQ2NzcpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDEsIDEpLCAtMC4yMzY5MjI3NzAxNzIyMDQ4KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigxLCAyKSwgMC43NTAyMjc1MTMxNDU4NTExKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigxLCAzKSwgLTAuNDI3ODczMTAxOTc0MjY5Nik7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMSwgNCksIC0wLjM2MjgxMjkxNjIyNjQ1MDcpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDEsIDUpLCAwLjIwNjkyMTA4MDg0ODEyNzUpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDIsIDApLCAwLjA1NDY1ODkwMTYwODYzOTg2KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigyLCAxKSwgLTAuMjYzNDA5MjUxMTQxOTg1OCk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMiwgMiksIDAuMDk4NzExODAyODU3OTM3NTgpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDIsIDMpLCAtMC40NzU3MDY2MzM0MDE3NzAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigyLCA0KSwgLTAuMDQ3NzM3NDA4MjMwNTgzMzQpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDIsIDUpLCAwLjIzMDA1MzU2MDk2NDUyNTQpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDMsIDApLCAtMC44MTcyOTQ1ODUzMjYwMTMzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigzLCAxKSwgMC4yMTUwMDg2NDI4MzU5MjIxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigzLCAyKSwgMC41ODI1MTEzODQ3MjkyNzQzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigzLCAzKSwgLTAuMTUzMjQzMzc3MDA5NzE3NCk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMywgNCksIC0wLjMyOTM4MzM4NzI4MjM5OSk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoMywgNSksIDAuMDg2NjUyMDc5MTIwMzMwNjQpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDQsIDApLCAwLjg0NTEyNjc1MTQ4NjMyMjUpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDQsIDEpLCAtMC40ODE5OTY0NTg5MTg5NzcpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDQsIDIpLCAtMC42MDIzNDgyMzkwNzkxNTM1KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LCAzKSwgMC4zNDM1MzM5MzQ3MTY0NTY1KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LCA0KSwgMC4zNDA2MDAyMTU3NDI4ODkxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig0LCA1KSwgLTAuMTk0MjUyNjM0NDIwMDkxNSk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNSwgMCksIDAuMTExMTk4MjQ4MjkyNTM5OSk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNSwgMSksIC0wLjUzNTg4MDY0MjQ3NTQxNjkpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDUsIDIpLCAtMC4wNzkyNTQ0NjU1OTMzNTY0Nyk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNSwgMyksIDAuMzgxOTM4ODc1Nzc2OTAzOCk7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNSwgNCksIDAuMDQ0ODE0NzUzODcyMTk4NzYpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDUsIDUpLCAtMC4yMTU5Njg4NjE2MTU4MDU3KTsKIH0KIAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCBjaGVja19zcGFyc2Vfa3JvbmVja2VyX3Byb2R1Y3QoY29uc3QgTWF0cml4VHlwZSYgYWIpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgY2hlY2tfc3BhcnNlX2tyb25lY2tlcl9wcm9kdWN0KGNvbnN0IE1hdHJpeFR5cGUmIGFiKSB7CiAgIFZFUklGWV9JU19FUVVBTChhYi5yb3dzKCksIDEyKTsKICAgVkVSSUZZX0lTX0VRVUFMKGFiLmNvbHMoKSwgMTApOwotICBWRVJJRllfSVNfRVFVQUwoYWIubm9uWmVyb3MoKSwgMyoyKTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigzLDApLCAtMC4wNCk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNSwxKSwgIDAuMDUpOwotICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDAsNiksIC0wLjA4KTsKLSAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigyLDcpLCAgMC4xMCk7Ci0gIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoNiw4KSwgIDAuMTIpOwotICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDgsOSksIC0wLjE1KTsKKyAgVkVSSUZZX0lTX0VRVUFMKGFiLm5vblplcm9zKCksIDMgKiAyKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigzLCAwKSwgLTAuMDQpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDUsIDEpLCAwLjA1KTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZigwLCA2KSwgLTAuMDgpOworICBWRVJJRllfSVNfQVBQUk9YKGFiLmNvZWZmKDIsIDcpLCAwLjEwKTsKKyAgVkVSSUZZX0lTX0FQUFJPWChhYi5jb2VmZig2LCA4KSwgMC4xMik7CisgIFZFUklGWV9JU19BUFBST1goYWIuY29lZmYoOCwgOSksIC0wLjE1KTsKIH0KIAotCi1FSUdFTl9ERUNMQVJFX1RFU1Qoa3JvbmVja2VyX3Byb2R1Y3QpCi17CitFSUdFTl9ERUNMQVJFX1RFU1Qoa3JvbmVja2VyX3Byb2R1Y3QpIHsKICAgLy8gRE0gPSBkZW5zZSBtYXRyaXg7IFNNID0gc3BhcnNlIG1hdHJpeAogCiAgIE1hdHJpeDxkb3VibGUsIDIsIDM+IERNX2E7Ci0gIFNwYXJzZU1hdHJpeDxkb3VibGU+IFNNX2EoMiwzKTsKLSAgU01fYS5pbnNlcnQoMCwwKSA9IERNX2EuY29lZmZSZWYoMCwwKSA9IC0wLjQ0NjE1NDAzMDA3ODIyMDE7Ci0gIFNNX2EuaW5zZXJ0KDAsMSkgPSBETV9hLmNvZWZmUmVmKDAsMSkgPSAtMC44MDU3MzY0Mzc1MjgzMDQ5OwotICBTTV9hLmluc2VydCgwLDIpID0gRE1fYS5jb2VmZlJlZigwLDIpID0gIDAuMzg5NjU3MjQ1OTUxNjM0MTsKLSAgU01fYS5pbnNlcnQoMSwwKSA9IERNX2EuY29lZmZSZWYoMSwwKSA9IC0wLjkwNzY1NzIxODczNzY5MjE7Ci0gIFNNX2EuaW5zZXJ0KDEsMSkgPSBETV9hLmNvZWZmUmVmKDEsMSkgPSAgMC42NDY5MTU2NTY2NTQ1ODUzOwotICBTTV9hLmluc2VydCgxLDIpID0gRE1fYS5jb2VmZlJlZigxLDIpID0gLTAuMzY1ODAxMDM5ODc4Mjc4OTsKKyAgU3BhcnNlTWF0cml4PGRvdWJsZT4gU01fYSgyLCAzKTsKKyAgU01fYS5pbnNlcnQoMCwgMCkgPSBETV9hLmNvZWZmUmVmKDAsIDApID0gLTAuNDQ2MTU0MDMwMDc4MjIwMTsKKyAgU01fYS5pbnNlcnQoMCwgMSkgPSBETV9hLmNvZWZmUmVmKDAsIDEpID0gLTAuODA1NzM2NDM3NTI4MzA0OTsKKyAgU01fYS5pbnNlcnQoMCwgMikgPSBETV9hLmNvZWZmUmVmKDAsIDIpID0gMC4zODk2NTcyNDU5NTE2MzQxOworICBTTV9hLmluc2VydCgxLCAwKSA9IERNX2EuY29lZmZSZWYoMSwgMCkgPSAtMC45MDc2NTcyMTg3Mzc2OTIxOworICBTTV9hLmluc2VydCgxLCAxKSA9IERNX2EuY29lZmZSZWYoMSwgMSkgPSAwLjY0NjkxNTY1NjY1NDU4NTM7CisgIFNNX2EuaW5zZXJ0KDEsIDIpID0gRE1fYS5jb2VmZlJlZigxLCAyKSA9IC0wLjM2NTgwMTAzOTg3ODI3ODk7CiAKLSAgTWF0cml4WGQgICAgICAgICAgICAgRE1fYigzLDIpOwotICBTcGFyc2VNYXRyaXg8ZG91YmxlPiBTTV9iKDMsMik7Ci0gIFNNX2IuaW5zZXJ0KDAsMCkgPSBETV9iLmNvZWZmUmVmKDAsMCkgPSAgMC45MDA0NDQwOTc2NzY3MDk5OwotICBTTV9iLmluc2VydCgwLDEpID0gRE1fYi5jb2VmZlJlZigwLDEpID0gLTAuMjM2ODgzMDg1ODEzOTgzMjsKLSAgU01fYi5pbnNlcnQoMSwwKSA9IERNX2IuY29lZmZSZWYoMSwwKSA9IC0wLjkzMTEwNzgzODk5NDE4MjU7Ci0gIFNNX2IuaW5zZXJ0KDEsMSkgPSBETV9iLmNvZWZmUmVmKDEsMSkgPSAgMC41MzEwMzM1NzYyOTgwMDQ3OwotICBTTV9iLmluc2VydCgyLDApID0gRE1fYi5jb2VmZlJlZigyLDApID0gLTAuMTIyNTExMjgwNjg3MjAzNTsKLSAgU01fYi5pbnNlcnQoMiwxKSA9IERNX2IuY29lZmZSZWYoMiwxKSA9ICAwLjU5MDM5OTgwMjI3NDEyNjQ7CisgIE1hdHJpeFhkIERNX2IoMywgMik7CisgIFNwYXJzZU1hdHJpeDxkb3VibGU+IFNNX2IoMywgMik7CisgIFNNX2IuaW5zZXJ0KDAsIDApID0gRE1fYi5jb2VmZlJlZigwLCAwKSA9IDAuOTAwNDQ0MDk3Njc2NzA5OTsKKyAgU01fYi5pbnNlcnQoMCwgMSkgPSBETV9iLmNvZWZmUmVmKDAsIDEpID0gLTAuMjM2ODgzMDg1ODEzOTgzMjsKKyAgU01fYi5pbnNlcnQoMSwgMCkgPSBETV9iLmNvZWZmUmVmKDEsIDApID0gLTAuOTMxMTA3ODM4OTk0MTgyNTsKKyAgU01fYi5pbnNlcnQoMSwgMSkgPSBETV9iLmNvZWZmUmVmKDEsIDEpID0gMC41MzEwMzM1NzYyOTgwMDQ3OworICBTTV9iLmluc2VydCgyLCAwKSA9IERNX2IuY29lZmZSZWYoMiwgMCkgPSAtMC4xMjI1MTEyODA2ODcyMDM1OworICBTTV9iLmluc2VydCgyLCAxKSA9IERNX2IuY29lZmZSZWYoMiwgMSkgPSAwLjU5MDM5OTgwMjI3NDEyNjQ7CiAKLSAgU3BhcnNlTWF0cml4PGRvdWJsZSxSb3dNYWpvcj4gU01fcm93X2EoU01fYSksIFNNX3Jvd19iKFNNX2IpOworICBTcGFyc2VNYXRyaXg8ZG91YmxlLCBSb3dNYWpvcj4gU01fcm93X2EoU01fYSksIFNNX3Jvd19iKFNNX2IpOwogCiAgIC8vIHRlc3QgRE1fZml4ZWRTaXplID0ga3JvbmVja2VyUHJvZHVjdChETV9ibG9jayxETSkKLSAgTWF0cml4PGRvdWJsZSwgNiwgNj4gRE1fZml4X2FiID0ga3JvbmVja2VyUHJvZHVjdChETV9hLnRvcExlZnRDb3JuZXI8MiwzPigpLERNX2IpOworICBNYXRyaXg8ZG91YmxlLCA2LCA2PiBETV9maXhfYWIgPSBrcm9uZWNrZXJQcm9kdWN0KERNX2EudG9wTGVmdENvcm5lcjwyLCAzPigpLCBETV9iKTsKIAogICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3QoRE1fZml4X2FiKSk7Ci0gIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChrcm9uZWNrZXJQcm9kdWN0KERNX2EudG9wTGVmdENvcm5lcjwyLDM+KCksRE1fYikpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KGtyb25lY2tlclByb2R1Y3QoRE1fYS50b3BMZWZ0Q29ybmVyPDIsIDM+KCksIERNX2IpKSk7CiAKLSAgZm9yKGludCBpPTA7aTxETV9maXhfYWIucm93cygpOysraSkKLSAgICBmb3IoaW50IGo9MDtqPERNX2ZpeF9hYi5jb2xzKCk7KytqKQotICAgICAgIFZFUklGWV9JU19BUFBST1goa3JvbmVja2VyUHJvZHVjdChETV9hLERNX2IpLmNvZWZmKGksaiksIERNX2ZpeF9hYihpLGopKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBETV9maXhfYWIucm93cygpOyArK2kpCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBETV9maXhfYWIuY29scygpOyArK2opCisgICAgICBWRVJJRllfSVNfQVBQUk9YKGtyb25lY2tlclByb2R1Y3QoRE1fYSwgRE1fYikuY29lZmYoaSwgaiksIERNX2ZpeF9hYihpLCBqKSk7CiAKICAgLy8gdGVzdCBETV9ibG9jayA9IGtyb25lY2tlclByb2R1Y3QoRE0sRE0pCi0gIE1hdHJpeFhkIERNX2Jsb2NrX2FiKDEwLDE1KTsKLSAgRE1fYmxvY2tfYWIuYmxvY2s8Niw2PigyLDUpID0ga3JvbmVja2VyUHJvZHVjdChETV9hLERNX2IpOwotICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3QoRE1fYmxvY2tfYWIuYmxvY2s8Niw2PigyLDUpKSk7CisgIE1hdHJpeFhkIERNX2Jsb2NrX2FiKDEwLCAxNSk7CisgIERNX2Jsb2NrX2FiLmJsb2NrPDYsIDY+KDIsIDUpID0ga3JvbmVja2VyUHJvZHVjdChETV9hLCBETV9iKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KERNX2Jsb2NrX2FiLmJsb2NrPDYsIDY+KDIsIDUpKSk7CiAKICAgLy8gdGVzdCBETSA9IGtyb25lY2tlclByb2R1Y3QoRE0sRE0pCi0gIE1hdHJpeFhkIERNX2FiID0ga3JvbmVja2VyUHJvZHVjdChETV9hLERNX2IpOworICBNYXRyaXhYZCBETV9hYiA9IGtyb25lY2tlclByb2R1Y3QoRE1fYSwgRE1fYik7CiAgIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChETV9hYikpOwotICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3Qoa3JvbmVja2VyUHJvZHVjdChETV9hLERNX2IpKSk7CisgIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChrcm9uZWNrZXJQcm9kdWN0KERNX2EsIERNX2IpKSk7CiAKICAgLy8gdGVzdCBTTSA9IGtyb25lY2tlclByb2R1Y3QoU00sRE0pCi0gIFNwYXJzZU1hdHJpeDxkb3VibGU+IFNNX2FiID0ga3JvbmVja2VyUHJvZHVjdChTTV9hLERNX2IpOworICBTcGFyc2VNYXRyaXg8ZG91YmxlPiBTTV9hYiA9IGtyb25lY2tlclByb2R1Y3QoU01fYSwgRE1fYik7CiAgIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChTTV9hYikpOwotICBTcGFyc2VNYXRyaXg8ZG91YmxlLFJvd01ham9yPiBTTV9hYjIgPSBrcm9uZWNrZXJQcm9kdWN0KFNNX2EsRE1fYik7CisgIFNwYXJzZU1hdHJpeDxkb3VibGUsIFJvd01ham9yPiBTTV9hYjIgPSBrcm9uZWNrZXJQcm9kdWN0KFNNX2EsIERNX2IpOwogICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3QoU01fYWIyKSk7Ci0gIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChrcm9uZWNrZXJQcm9kdWN0KFNNX2EsRE1fYikpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KGtyb25lY2tlclByb2R1Y3QoU01fYSwgRE1fYikpKTsKIAogICAvLyB0ZXN0IFNNID0ga3JvbmVja2VyUHJvZHVjdChETSxTTSkKICAgU01fYWIuc2V0WmVybygpOwotICBTTV9hYi5pbnNlcnQoMCwwKT0zNy4wOwotICBTTV9hYiA9IGtyb25lY2tlclByb2R1Y3QoRE1fYSxTTV9iKTsKKyAgU01fYWIuaW5zZXJ0KDAsIDApID0gMzcuMDsKKyAgU01fYWIgPSBrcm9uZWNrZXJQcm9kdWN0KERNX2EsIFNNX2IpOwogICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3QoU01fYWIpKTsKICAgU01fYWIyLnNldFplcm8oKTsKLSAgU01fYWIyLmluc2VydCgwLDApPTM3LjA7Ci0gIFNNX2FiMiA9IGtyb25lY2tlclByb2R1Y3QoRE1fYSxTTV9iKTsKKyAgU01fYWIyLmluc2VydCgwLCAwKSA9IDM3LjA7CisgIFNNX2FiMiA9IGtyb25lY2tlclByb2R1Y3QoRE1fYSwgU01fYik7CiAgIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChTTV9hYjIpKTsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KGtyb25lY2tlclByb2R1Y3QoRE1fYSxTTV9iKSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3Qoa3JvbmVja2VyUHJvZHVjdChETV9hLCBTTV9iKSkpOwogCiAgIC8vIHRlc3QgU00gPSBrcm9uZWNrZXJQcm9kdWN0KFNNLFNNKQotICBTTV9hYi5yZXNpemUoMiwzMyk7Ci0gIFNNX2FiLmluc2VydCgwLDApPTM3LjA7Ci0gIFNNX2FiID0ga3JvbmVja2VyUHJvZHVjdChTTV9hLFNNX2IpOworICBTTV9hYi5yZXNpemUoMiwgMzMpOworICBTTV9hYi5pbnNlcnQoMCwgMCkgPSAzNy4wOworICBTTV9hYiA9IGtyb25lY2tlclByb2R1Y3QoU01fYSwgU01fYik7CiAgIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChTTV9hYikpOwotICBTTV9hYjIucmVzaXplKDUsMTEpOwotICBTTV9hYjIuaW5zZXJ0KDAsMCk9MzcuMDsKLSAgU01fYWIyID0ga3JvbmVja2VyUHJvZHVjdChTTV9hLFNNX2IpOworICBTTV9hYjIucmVzaXplKDUsIDExKTsKKyAgU01fYWIyLmluc2VydCgwLCAwKSA9IDM3LjA7CisgIFNNX2FiMiA9IGtyb25lY2tlclByb2R1Y3QoU01fYSwgU01fYik7CiAgIENBTExfU1VCVEVTVChjaGVja19rcm9uZWNrZXJfcHJvZHVjdChTTV9hYjIpKTsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX2tyb25lY2tlcl9wcm9kdWN0KGtyb25lY2tlclByb2R1Y3QoU01fYSxTTV9iKSkpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfa3JvbmVja2VyX3Byb2R1Y3Qoa3JvbmVja2VyUHJvZHVjdChTTV9hLCBTTV9iKSkpOwogCiAgIC8vIHRlc3QgU00gPSBrcm9uZWNrZXJQcm9kdWN0KFNNLFNNKSB3aXRoIHNwYXJzZSBwYXR0ZXJuCi0gIFNNX2EucmVzaXplKDQsNSk7Ci0gIFNNX2IucmVzaXplKDMsMik7CisgIFNNX2EucmVzaXplKDQsIDUpOworICBTTV9iLnJlc2l6ZSgzLCAyKTsKICAgU01fYS5yZXNpemVOb25aZXJvcygwKTsKICAgU01fYi5yZXNpemVOb25aZXJvcygwKTsKLSAgU01fYS5pbnNlcnQoMSwwKSA9IC0wLjE7Ci0gIFNNX2EuaW5zZXJ0KDAsMykgPSAtMC4yOwotICBTTV9hLmluc2VydCgyLDQpID0gIDAuMzsKKyAgU01fYS5pbnNlcnQoMSwgMCkgPSAtMC4xOworICBTTV9hLmluc2VydCgwLCAzKSA9IC0wLjI7CisgIFNNX2EuaW5zZXJ0KDIsIDQpID0gMC4zOwogICBTTV9hLmZpbmFsaXplKCk7CiAKLSAgU01fYi5pbnNlcnQoMCwwKSA9ICAwLjQ7Ci0gIFNNX2IuaW5zZXJ0KDIsMSkgPSAtMC41OworICBTTV9iLmluc2VydCgwLCAwKSA9IDAuNDsKKyAgU01fYi5pbnNlcnQoMiwgMSkgPSAtMC41OwogICBTTV9iLmZpbmFsaXplKCk7Ci0gIFNNX2FiLnJlc2l6ZSgxLDEpOwotICBTTV9hYi5pbnNlcnQoMCwwKT0zNy4wOwotICBTTV9hYiA9IGtyb25lY2tlclByb2R1Y3QoU01fYSxTTV9iKTsKKyAgU01fYWIucmVzaXplKDEsIDEpOworICBTTV9hYi5pbnNlcnQoMCwgMCkgPSAzNy4wOworICBTTV9hYiA9IGtyb25lY2tlclByb2R1Y3QoU01fYSwgU01fYik7CiAgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfa3JvbmVja2VyX3Byb2R1Y3QoU01fYWIpKTsKIAogICAvLyB0ZXN0IGRpbWVuc2lvbiBvZiByZXN1bHQgb2YgRE0gPSBrcm9uZWNrZXJQcm9kdWN0KERNLERNKQotICBNYXRyaXhYZCBETV9hMigyLDEpOwotICBNYXRyaXhYZCBETV9iMig1LDQpOwotICBNYXRyaXhYZCBETV9hYjIgPSBrcm9uZWNrZXJQcm9kdWN0KERNX2EyLERNX2IyKTsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX2RpbWVuc2lvbihETV9hYjIsMio1LDEqNCkpOwotICBETV9hMi5yZXNpemUoMTAsOSk7Ci0gIERNX2IyLnJlc2l6ZSg0LDgpOwotICBETV9hYjIgPSBrcm9uZWNrZXJQcm9kdWN0KERNX2EyLERNX2IyKTsKLSAgQ0FMTF9TVUJURVNUKGNoZWNrX2RpbWVuc2lvbihETV9hYjIsMTAqNCw5KjgpKTsKKyAgTWF0cml4WGQgRE1fYTIoMiwgMSk7CisgIE1hdHJpeFhkIERNX2IyKDUsIDQpOworICBNYXRyaXhYZCBETV9hYjIgPSBrcm9uZWNrZXJQcm9kdWN0KERNX2EyLCBETV9iMik7CisgIENBTExfU1VCVEVTVChjaGVja19kaW1lbnNpb24oRE1fYWIyLCAyICogNSwgMSAqIDQpKTsKKyAgRE1fYTIucmVzaXplKDEwLCA5KTsKKyAgRE1fYjIucmVzaXplKDQsIDgpOworICBETV9hYjIgPSBrcm9uZWNrZXJQcm9kdWN0KERNX2EyLCBETV9iMik7CisgIENBTExfU1VCVEVTVChjaGVja19kaW1lbnNpb24oRE1fYWIyLCAxMCAqIDQsIDkgKiA4KSk7CiAKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspCi0gIHsKLSAgICBkb3VibGUgZGVuc2l0eSA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oMC4wMSwwLjUpOwotICAgIGludCByYSA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSw1MCk7Ci0gICAgaW50IGNhID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDUwKTsKLSAgICBpbnQgcmIgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsNTApOwotICAgIGludCBjYiA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSw1MCk7Ci0gICAgU3BhcnNlTWF0cml4PGZsb2F0LENvbE1ham9yPiBzQShyYSxjYSksIHNCKHJiLGNiKSwgc0M7Ci0gICAgU3BhcnNlTWF0cml4PGZsb2F0LFJvd01ham9yPiBzQzI7Ci0gICAgTWF0cml4WGYgZEEocmEsY2EpLCBkQihyYixjYiksIGRDOworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBkb3VibGUgZGVuc2l0eSA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGRvdWJsZT4oMC4wMSwgMC41KTsKKyAgICBpbnQgcmEgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDUwKTsKKyAgICBpbnQgY2EgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDUwKTsKKyAgICBpbnQgcmIgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDUwKTsKKyAgICBpbnQgY2IgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDUwKTsKKyAgICBTcGFyc2VNYXRyaXg8ZmxvYXQsIENvbE1ham9yPiBzQShyYSwgY2EpLCBzQihyYiwgY2IpLCBzQzsKKyAgICBTcGFyc2VNYXRyaXg8ZmxvYXQsIFJvd01ham9yPiBzQzI7CisgICAgTWF0cml4WGYgZEEocmEsIGNhKSwgZEIocmIsIGNiKSwgZEM7CiAgICAgaW5pdFNwYXJzZShkZW5zaXR5LCBkQSwgc0EpOwogICAgIGluaXRTcGFyc2UoZGVuc2l0eSwgZEIsIHNCKTsKIAotICAgIHNDID0ga3JvbmVja2VyUHJvZHVjdChzQSxzQik7Ci0gICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLGRCKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhmKHNDKSxkQyk7CisgICAgc0MgPSBrcm9uZWNrZXJQcm9kdWN0KHNBLCBzQik7CisgICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLCBkQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhYZihzQyksIGRDKTsKIAotICAgIHNDID0ga3JvbmVja2VyUHJvZHVjdChzQS50cmFuc3Bvc2UoKSxzQik7Ci0gICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLnRyYW5zcG9zZSgpLGRCKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhmKHNDKSxkQyk7CisgICAgc0MgPSBrcm9uZWNrZXJQcm9kdWN0KHNBLnRyYW5zcG9zZSgpLCBzQik7CisgICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLnRyYW5zcG9zZSgpLCBkQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhYZihzQyksIGRDKTsKIAotICAgIHNDID0ga3JvbmVja2VyUHJvZHVjdChzQS50cmFuc3Bvc2UoKSxzQi50cmFuc3Bvc2UoKSk7Ci0gICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLnRyYW5zcG9zZSgpLGRCLnRyYW5zcG9zZSgpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhmKHNDKSxkQyk7CisgICAgc0MgPSBrcm9uZWNrZXJQcm9kdWN0KHNBLnRyYW5zcG9zZSgpLCBzQi50cmFuc3Bvc2UoKSk7CisgICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLnRyYW5zcG9zZSgpLCBkQi50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhYZihzQyksIGRDKTsKIAotICAgIHNDID0ga3JvbmVja2VyUHJvZHVjdChzQSxzQi50cmFuc3Bvc2UoKSk7Ci0gICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLGRCLnRyYW5zcG9zZSgpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhmKHNDKSxkQyk7CisgICAgc0MgPSBrcm9uZWNrZXJQcm9kdWN0KHNBLCBzQi50cmFuc3Bvc2UoKSk7CisgICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLCBkQi50cmFuc3Bvc2UoKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhYZihzQyksIGRDKTsKIAotICAgIHNDMiA9IGtyb25lY2tlclByb2R1Y3Qoc0Esc0IpOwotICAgIGRDID0ga3JvbmVja2VyUHJvZHVjdChkQSxkQik7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhYZihzQzIpLGRDKTsKKyAgICBzQzIgPSBrcm9uZWNrZXJQcm9kdWN0KHNBLCBzQik7CisgICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLCBkQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhYZihzQzIpLCBkQyk7CiAKLSAgICBzQzIgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLHNCKTsKLSAgICBkQyA9IGtyb25lY2tlclByb2R1Y3QoZEEsZEIpOwotICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4WGYoc0MyKSxkQyk7CisgICAgc0MyID0ga3JvbmVja2VyUHJvZHVjdChkQSwgc0IpOworICAgIGRDID0ga3JvbmVja2VyUHJvZHVjdChkQSwgZEIpOworICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4WGYoc0MyKSwgZEMpOwogCi0gICAgc0MyID0ga3JvbmVja2VyUHJvZHVjdChzQSxkQik7Ci0gICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KGRBLGRCKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhmKHNDMiksZEMpOworICAgIHNDMiA9IGtyb25lY2tlclByb2R1Y3Qoc0EsIGRCKTsKKyAgICBkQyA9IGtyb25lY2tlclByb2R1Y3QoZEEsIGRCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKE1hdHJpeFhmKHNDMiksIGRDKTsKIAotICAgIHNDMiA9IGtyb25lY2tlclByb2R1Y3QoMipzQSxzQik7Ci0gICAgZEMgPSBrcm9uZWNrZXJQcm9kdWN0KDIqZEEsZEIpOwotICAgIFZFUklGWV9JU19BUFBST1goTWF0cml4WGYoc0MyKSxkQyk7CisgICAgc0MyID0ga3JvbmVja2VyUHJvZHVjdCgyICogc0EsIHNCKTsKKyAgICBkQyA9IGtyb25lY2tlclByb2R1Y3QoMiAqIGRBLCBkQik7CisgICAgVkVSSUZZX0lTX0FQUFJPWChNYXRyaXhYZihzQzIpLCBkQyk7CiAgIH0KIH0KIApAQCAtMjQwLDEzICsyMzEsMTIgQEAKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSA8RWlnZW4vS3JvbmVja2VyUHJvZHVjdD4KIAotRUlHRU5fREVDTEFSRV9URVNUKGtyb25lY2tlcl9wcm9kdWN0KQotewotICBNYXRyaXhYZCBhKDIsMiksIGIoMywzKSwgYzsKK0VJR0VOX0RFQ0xBUkVfVEVTVChrcm9uZWNrZXJfcHJvZHVjdCkgeworICBNYXRyaXhYZCBhKDIsIDIpLCBiKDMsIDMpLCBjOwogICBhLnNldFJhbmRvbSgpOwogICBiLnNldFJhbmRvbSgpOwotICBjID0ga3JvbmVja2VyUHJvZHVjdChhLGIpOwotICBWRVJJRllfSVNfQVBQUk9YKGMuYmxvY2soMywzLDMsMyksIGEoMSwxKSpiKTsKKyAgYyA9IGtyb25lY2tlclByb2R1Y3QoYSwgYik7CisgIFZFUklGWV9JU19BUFBST1goYy5ibG9jaygzLCAzLCAzLCAzKSwgYSgxLCAxKSAqIGIpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvbGV2ZW5iZXJnX21hcnF1YXJkdC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L2xldmVuYmVyZ19tYXJxdWFyZHQuY3BwCmluZGV4IGQwNzQ4ZDEuLjM1NWZjN2MgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvbGV2ZW5iZXJnX21hcnF1YXJkdC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9sZXZlbmJlcmdfbWFycXVhcmR0LmNwcApAQCAtOCwxMCArOCw4IEBACiAvLyBQdWJsaWMgTGljZW5zZSB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQKIC8vIHdpdGggdGhpcyBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgogCi0KIC8vIEZJWE1FOiBUaGVzZSB0ZXN0cyBhbGwgY2hlY2sgZm9yIGhhcmQtY29kZWQgdmFsdWVzLiBJZGVhbGx5LCBwYXJhbWV0ZXJzIGFuZCBzdGFydCBlc3RpbWF0ZXMgc2hvdWxkIGJlIHJhbmRvbWl6ZWQuCiAKLQogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKICNpbmNsdWRlICJtYWluLmgiCkBAIC0yNiw0NSArMjQsNDAgQEAKIC8vIHRvbGVyYW5jZSBmb3IgY2hla2NpbmcgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKICNkZWZpbmUgTE1fRVZBTF9DT1VOVF9UT0wgMgogCi1zdHJ1Y3QgbG1kZXJfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+Ci17Ci0gICAgbG1kZXJfZnVuY3Rvcih2b2lkKTogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMywxNSkge30KLSAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMpIGNvbnN0Ci0gICAgewotICAgICAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMzsKLSAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzE1XSA9IHsxLjRlLTEsIDEuOGUtMSwgMi4yZS0xLCAyLjVlLTEsIDIuOWUtMSwgMy4yZS0xLCAzLjVlLTEsCi0gICAgICAgICAgICAzLjllLTEsIDMuN2UtMSwgNS44ZS0xLCA3LjNlLTEsIDkuNmUtMSwgMS4zNCwgMi4xLCA0LjM5fTsKK3N0cnVjdCBsbWRlcl9mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4geworICBsbWRlcl9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMywgMTUpIHt9CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykgY29uc3QgeworICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNV0gPSB7MS40ZS0xLCAxLjhlLTEsIDIuMmUtMSwgMi41ZS0xLCAyLjllLTEsIDMuMmUtMSwgMy41ZS0xLCAzLjllLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjdlLTEsIDUuOGUtMSwgNy4zZS0xLCA5LjZlLTEsIDEuMzQsICAgMi4xLCAgICA0LjM5fTsKIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcygpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDEgPSBpKzE7Ci0gICAgICAgICAgICB0bXAyID0gMTYgLSBpIC0gMTsKLSAgICAgICAgICAgIHRtcDMgPSAoaT49OCk/IHRtcDIgOiB0bXAxOwotICAgICAgICAgICAgZnZlY1tpXSA9IHlbaV0gLSAoeFswXSArIHRtcDEvKHhbMV0qdG1wMiArIHhbMl0qdG1wMykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzKCk7IGkrKykgeworICAgICAgdG1wMSA9IGkgKyAxOworICAgICAgdG1wMiA9IDE2IC0gaSAtIDE7CisgICAgICB0bXAzID0gKGkgPj0gOCkgPyB0bXAyIDogdG1wMTsKKyAgICAgIGZ2ZWNbaV0gPSB5W2ldIC0gKHhbMF0gKyB0bXAxIC8gKHhbMV0gKiB0bXAyICsgeFsyXSAqIHRtcDMpKTsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIAotICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmeCwgTWF0cml4WGQgJmZqYWMpIGNvbnN0Ci0gICAgewotICAgICAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAxID0gaSsxOwotICAgICAgICAgICAgdG1wMiA9IDE2IC0gaSAtIDE7Ci0gICAgICAgICAgICB0bXAzID0gKGk+PTgpPyB0bXAyIDogdG1wMTsKLSAgICAgICAgICAgIHRtcDQgPSAoeFsxXSp0bXAyICsgeFsyXSp0bXAzKTsgdG1wNCA9IHRtcDQqdG1wNDsKLSAgICAgICAgICAgIGZqYWMoaSwwKSA9IC0xOwotICAgICAgICAgICAgZmphYyhpLDEpID0gdG1wMSp0bXAyL3RtcDQ7Ci0gICAgICAgICAgICBmamFjKGksMikgPSB0bXAxKnRtcDMvdG1wNDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZ4LCBNYXRyaXhYZCAmZmphYykgY29uc3QgeworICAgIGRvdWJsZSB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzKCk7IGkrKykgeworICAgICAgdG1wMSA9IGkgKyAxOworICAgICAgdG1wMiA9IDE2IC0gaSAtIDE7CisgICAgICB0bXAzID0gKGkgPj0gOCkgPyB0bXAyIDogdG1wMTsKKyAgICAgIHRtcDQgPSAoeFsxXSAqIHRtcDIgKyB4WzJdICogdG1wMyk7CisgICAgICB0bXA0ID0gdG1wNCAqIHRtcDQ7CisgICAgICBmamFjKGksIDApID0gLTE7CisgICAgICBmamFjKGksIDEpID0gdG1wMSAqIHRtcDIgLyB0bXA0OworICAgICAgZmphYyhpLCAyKSA9IHRtcDEgKiB0bXAzIC8gdG1wNDsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIH07CiAKLXZvaWQgdGVzdExtZGVyMSgpCi17Ci0gIGludCBuPTMsIGluZm87Cit2b2lkIHRlc3RMbWRlcjEoKSB7CisgIGludCBuID0gMywgaW5mbzsKIAogICBWZWN0b3JYZCB4OwogCkBAIC05MCw5ICs4Myw4IEBACiAgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOwogfQogCi12b2lkIHRlc3RMbWRlcigpCi17Ci0gIGNvbnN0IGludCBtPTE1LCBuPTM7Cit2b2lkIHRlc3RMbWRlcigpIHsKKyAgY29uc3QgaW50IG0gPSAxNSwgbiA9IDM7CiAgIGludCBpbmZvOwogICBkb3VibGUgZm5vcm0sIGNvdmZhYzsKICAgVmVjdG9yWGQgeDsKQEAgLTEyMSw1MiArMTEzLDQ2IEBACiAgIFZFUklGWV9JU19BUFBST1goeCwgeF9yZWYpOwogCiAgIC8vIGNoZWNrIGNvdmFyaWFuY2UKLSAgY292ZmFjID0gZm5vcm0qZm5vcm0vKG0tbik7Ci0gIGludGVybmFsOjpjb3ZhcihsbS5tYXRyaXhSKCksIGxtLnBlcm11dGF0aW9uKCkuaW5kaWNlcygpKTsgLy8gVE9ETyA6IG1vdmUgdGhpcyBhcyBhIGZ1bmN0aW9uIG9mIGxtCisgIGNvdmZhYyA9IGZub3JtICogZm5vcm0gLyAobSAtIG4pOworICBpbnRlcm5hbDo6Y292YXIobG0ubWF0cml4UigpLCBsbS5wZXJtdXRhdGlvbigpLmluZGljZXMoKSk7ICAvLyBUT0RPIDogbW92ZSB0aGlzIGFzIGEgZnVuY3Rpb24gb2YgbG0KIAotICBNYXRyaXhYZCBjb3ZfcmVmKG4sbik7Ci0gIGNvdl9yZWYgPDwKLSAgICAgIDAuMDAwMTUzMTIwMiwgICAwLjAwMjg2OTk0MSwgIC0wLjAwMjY1NjY2MiwKLSAgICAgIDAuMDAyODY5OTQxLCAgICAwLjA5NDgwOTM1LCAgIC0wLjA5MDk4OTk1LAotICAgICAgLTAuMDAyNjU2NjYyLCAgIC0wLjA5MDk4OTk1LCAgICAwLjA4Nzc4NzI3OworICBNYXRyaXhYZCBjb3ZfcmVmKG4sIG4pOworICBjb3ZfcmVmIDw8IDAuMDAwMTUzMTIwMiwgMC4wMDI4Njk5NDEsIC0wLjAwMjY1NjY2MiwgMC4wMDI4Njk5NDEsIDAuMDk0ODA5MzUsIC0wLjA5MDk4OTk1LCAtMC4wMDI2NTY2NjIsIC0wLjA5MDk4OTk1LAorICAgICAgMC4wODc3ODcyNzsKIAotLy8gIHN0ZDo6Y291dCA8PCBmamFjKmNvdmZhYyA8PCBzdGQ6OmVuZGw7CisgIC8vICBzdGQ6OmNvdXQgPDwgZmphYypjb3ZmYWMgPDwgc3RkOjplbmRsOwogCiAgIE1hdHJpeFhkIGNvdjsKLSAgY292ID0gIGNvdmZhYypsbS5tYXRyaXhSKCkudG9wTGVmdENvcm5lcjxuLG4+KCk7Ci0gIFZFUklGWV9JU19BUFBST1goIGNvdiwgY292X3JlZik7CisgIGNvdiA9IGNvdmZhYyAqIGxtLm1hdHJpeFIoKS50b3BMZWZ0Q29ybmVyPG4sIG4+KCk7CisgIFZFUklGWV9JU19BUFBST1goY292LCBjb3ZfcmVmKTsKICAgLy8gVE9ETzogd2h5IGlzbid0IHRoaXMgYWxsb3dlZCA/IDoKICAgLy8gVkVSSUZZX0lTX0FQUFJPWCggY292ZmFjKmZqYWMudG9wTGVmdENvcm5lcjxuLG4+KCkgLCBjb3ZfcmVmKTsKIH0KIAotc3RydWN0IGxtZGlmX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPgotewotICAgIGxtZGlmX2Z1bmN0b3Iodm9pZCkgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPigzLDE1KSB7fQotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZ4LCBWZWN0b3JYZCAmZnZlYykgY29uc3QKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBkb3VibGUgdG1wMSx0bXAyLHRtcDM7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNV09ezEuNGUtMSwxLjhlLTEsMi4yZS0xLDIuNWUtMSwyLjllLTEsMy4yZS0xLDMuNWUtMSwzLjllLTEsCi0gICAgICAgICAgICAzLjdlLTEsNS44ZS0xLDcuM2UtMSw5LjZlLTEsMS4zNGUwLDIuMWUwLDQuMzllMH07CitzdHJ1Y3QgbG1kaWZfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+IHsKKyAgbG1kaWZfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDMsIDE1KSB7fQorICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmeCwgVmVjdG9yWGQgJmZ2ZWMpIGNvbnN0IHsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTVdID0gezEuNGUtMSwgMS44ZS0xLCAyLjJlLTEsIDIuNWUtMSwgMi45ZS0xLCAzLjJlLTEsIDMuNWUtMSwgMy45ZS0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy43ZS0xLCA1LjhlLTEsIDcuM2UtMSwgOS42ZS0xLCAxLjM0ZTAsIDIuMWUwLCAgNC4zOWUwfTsKIAotICAgICAgICBhc3NlcnQoeC5zaXplKCk9PTMpOwotICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTE1KTsKLSAgICAgICAgZm9yIChpPTA7IGk8MTU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMSA9IGkrMTsKLSAgICAgICAgICAgIHRtcDIgPSAxNSAtIGk7Ci0gICAgICAgICAgICB0bXAzID0gdG1wMTsKKyAgICBhc3NlcnQoeC5zaXplKCkgPT0gMyk7CisgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpID09IDE1KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgeworICAgICAgdG1wMSA9IGkgKyAxOworICAgICAgdG1wMiA9IDE1IC0gaTsKKyAgICAgIHRtcDMgPSB0bXAxOwogCi0gICAgICAgICAgICBpZiAoaSA+PSA4KSB0bXAzID0gdG1wMjsKLSAgICAgICAgICAgIGZ2ZWNbaV0gPSB5W2ldIC0gKHhbMF0gKyB0bXAxLyh4WzFdKnRtcDIgKyB4WzJdKnRtcDMpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgICAgIGlmIChpID49IDgpIHRtcDMgPSB0bXAyOworICAgICAgZnZlY1tpXSA9IHlbaV0gLSAoeFswXSArIHRtcDEgLyAoeFsxXSAqIHRtcDIgKyB4WzJdICogdG1wMykpOwogICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKIAotdm9pZCB0ZXN0TG1kaWYxKCkKLXsKLSAgY29uc3QgaW50IG49MzsKK3ZvaWQgdGVzdExtZGlmMSgpIHsKKyAgY29uc3QgaW50IG4gPSAzOwogICBpbnQgaW5mbzsKIAogICBWZWN0b3JYZCB4KG4pLCBmdmVjKDE1KTsKQEAgLTE4Miw3ICsxNjgsNyBAQAogCiAgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQogICAvLyBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7Ci0vLyAgIFZFUklGWV9JU19FUVVBTChuZmV2LCAyNik7CisgIC8vICAgVkVSSUZZX0lTX0VRVUFMKG5mZXYsIDI2KTsKIAogICAvLyBjaGVjayBub3JtCiAgIGZ1bmN0b3IoeCwgZnZlYyk7CkBAIC0xOTIsMTIgKzE3OCwxMCBAQAogICBWZWN0b3JYZCB4X3JlZihuKTsKICAgeF9yZWYgPDwgMC4wODI0MTA2LCAxLjEzMzAzNjYsIDIuMzQzNjk0NzsKICAgVkVSSUZZX0lTX0FQUFJPWCh4LCB4X3JlZik7Ci0KIH0KIAotdm9pZCB0ZXN0TG1kaWYoKQotewotICBjb25zdCBpbnQgbT0xNSwgbj0zOwordm9pZCB0ZXN0TG1kaWYoKSB7CisgIGNvbnN0IGludCBtID0gMTUsIG4gPSAzOwogICBpbnQgaW5mbzsKICAgZG91YmxlIGZub3JtLCBjb3ZmYWM7CiAgIFZlY3RvclhkIHgobik7CkBAIC0yMTQsNyArMTk4LDcgQEAKIAogICAvLyBjaGVjayByZXR1cm4gdmFsdWVzCiAgIC8vIFZFUklGWV9JU19FUVVBTChpbmZvLCAxKTsKLS8vICAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYoKSwgMjYpOworICAvLyAgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDI2KTsKIAogICAvLyBjaGVjayBub3JtCiAgIGZub3JtID0gbG0uZnZlYygpLmJsdWVOb3JtKCk7CkBAIC0yMjYsNjQgKzIxMCw2OSBAQAogICBWRVJJRllfSVNfQVBQUk9YKHgsIHhfcmVmKTsKIAogICAvLyBjaGVjayBjb3ZhcmlhbmNlCi0gIGNvdmZhYyA9IGZub3JtKmZub3JtLyhtLW4pOwotICBpbnRlcm5hbDo6Y292YXIobG0ubWF0cml4UigpLCBsbS5wZXJtdXRhdGlvbigpLmluZGljZXMoKSk7IC8vIFRPRE8gOiBtb3ZlIHRoaXMgYXMgYSBmdW5jdGlvbiBvZiBsbQorICBjb3ZmYWMgPSBmbm9ybSAqIGZub3JtIC8gKG0gLSBuKTsKKyAgaW50ZXJuYWw6OmNvdmFyKGxtLm1hdHJpeFIoKSwgbG0ucGVybXV0YXRpb24oKS5pbmRpY2VzKCkpOyAgLy8gVE9ETyA6IG1vdmUgdGhpcyBhcyBhIGZ1bmN0aW9uIG9mIGxtCiAKLSAgTWF0cml4WGQgY292X3JlZihuLG4pOwotICBjb3ZfcmVmIDw8Ci0gICAgICAwLjAwMDE1MzEyMDIsICAgMC4wMDI4Njk5NDIsICAtMC4wMDI2NTY2NjIsCi0gICAgICAwLjAwMjg2OTk0MiwgICAgMC4wOTQ4MDkzNywgICAtMC4wOTA5ODk5NywKLSAgICAgIC0wLjAwMjY1NjY2MiwgICAtMC4wOTA5ODk5NywgICAgMC4wODc3ODcyOTsKKyAgTWF0cml4WGQgY292X3JlZihuLCBuKTsKKyAgY292X3JlZiA8PCAwLjAwMDE1MzEyMDIsIDAuMDAyODY5OTQyLCAtMC4wMDI2NTY2NjIsIDAuMDAyODY5OTQyLCAwLjA5NDgwOTM3LCAtMC4wOTA5ODk5NywgLTAuMDAyNjU2NjYyLCAtMC4wOTA5ODk5NywKKyAgICAgIDAuMDg3Nzg3Mjk7CiAKLS8vICBzdGQ6OmNvdXQgPDwgZmphYypjb3ZmYWMgPDwgc3RkOjplbmRsOworICAvLyAgc3RkOjpjb3V0IDw8IGZqYWMqY292ZmFjIDw8IHN0ZDo6ZW5kbDsKIAogICBNYXRyaXhYZCBjb3Y7Ci0gIGNvdiA9ICBjb3ZmYWMqbG0ubWF0cml4UigpLnRvcExlZnRDb3JuZXI8bixuPigpOwotICBWRVJJRllfSVNfQVBQUk9YKCBjb3YsIGNvdl9yZWYpOworICBjb3YgPSBjb3ZmYWMgKiBsbS5tYXRyaXhSKCkudG9wTGVmdENvcm5lcjxuLCBuPigpOworICBWRVJJRllfSVNfQVBQUk9YKGNvdiwgY292X3JlZik7CiAgIC8vIFRPRE86IHdoeSBpc24ndCB0aGlzIGFsbG93ZWQgPyA6CiAgIC8vIFZFUklGWV9JU19BUFBST1goIGNvdmZhYypmamFjLnRvcExlZnRDb3JuZXI8bixuPigpICwgY292X3JlZik7CiB9CiAKLXN0cnVjdCBjaHdpcnV0Ml9mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4KLXsKLSAgICBjaHdpcnV0Ml9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMyw1NCkge30KLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIG1feFs1NF07Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3lbNTRdOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIGludCBpOworc3RydWN0IGNod2lydXQyX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPiB7CisgIGNod2lydXQyX2Z1bmN0b3Iodm9pZCkgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPigzLCA1NCkge30KKyAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3hbNTRdOworICBzdGF0aWMgY29uc3QgZG91YmxlIG1feVs1NF07CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykgeworICAgIGludCBpOwogCi0gICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7Ci0gICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09NTQpOwotICAgICAgICBmb3IoaT0wOyBpPDU0OyBpKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSB4ID0gbV94W2ldOwotICAgICAgICAgICAgZnZlY1tpXSA9IGV4cCgtYlswXSp4KS8oYlsxXStiWzJdKngpIC0gbV95W2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgIGFzc2VydChiLnNpemUoKSA9PSAzKTsKKyAgICBhc3NlcnQoZnZlYy5zaXplKCkgPT0gNTQpOworICAgIGZvciAoaSA9IDA7IGkgPCA1NDsgaSsrKSB7CisgICAgICBkb3VibGUgeCA9IG1feFtpXTsKKyAgICAgIGZ2ZWNbaV0gPSBleHAoLWJbMF0gKiB4KSAvIChiWzFdICsgYlsyXSAqIHgpIC0gbV95W2ldOwogICAgIH0KLSAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKLSAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT01NCk7Ci0gICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Myk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDU0OyBpKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSB4ID0gbV94W2ldOwotICAgICAgICAgICAgZG91YmxlIGZhY3RvciA9IDEuLyhiWzFdK2JbMl0qeCk7Ci0gICAgICAgICAgICBkb3VibGUgZSA9IGV4cCgtYlswXSp4KTsKLSAgICAgICAgICAgIGZqYWMoaSwwKSA9IC14KmUqZmFjdG9yOwotICAgICAgICAgICAgZmphYyhpLDEpID0gLWUqZmFjdG9yKmZhY3RvcjsKLSAgICAgICAgICAgIGZqYWMoaSwyKSA9IC14KmUqZmFjdG9yKmZhY3RvcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDMpOworICAgIGFzc2VydChmamFjLnJvd3MoKSA9PSA1NCk7CisgICAgYXNzZXJ0KGZqYWMuY29scygpID09IDMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTQ7IGkrKykgeworICAgICAgZG91YmxlIHggPSBtX3hbaV07CisgICAgICBkb3VibGUgZmFjdG9yID0gMS4gLyAoYlsxXSArIGJbMl0gKiB4KTsKKyAgICAgIGRvdWJsZSBlID0gZXhwKC1iWzBdICogeCk7CisgICAgICBmamFjKGksIDApID0gLXggKiBlICogZmFjdG9yOworICAgICAgZmphYyhpLCAxKSA9IC1lICogZmFjdG9yICogZmFjdG9yOworICAgICAgZmphYyhpLCAyKSA9IC14ICogZSAqIGZhY3RvciAqIGZhY3RvcjsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIH07Ci1jb25zdCBkb3VibGUgY2h3aXJ1dDJfZnVuY3Rvcjo6bV94WzU0XSA9IHsgMC41MDBFMCwgMS4wMDBFMCwgMS43NTBFMCwgMy43NTBFMCwgNS43NTBFMCwgMC44NzVFMCwgMi4yNTBFMCwgMy4yNTBFMCwgNS4yNTBFMCwgMC43NTBFMCwgMS43NTBFMCwgMi43NTBFMCwgNC43NTBFMCwgMC42MjVFMCwgMS4yNTBFMCwgMi4yNTBFMCwgNC4yNTBFMCwgLjUwMEUwLCAzLjAwMEUwLCAuNzUwRTAsIDMuMDAwRTAsIDEuNTAwRTAsIDYuMDAwRTAsIDMuMDAwRTAsIDYuMDAwRTAsIDEuNTAwRTAsIDMuMDAwRTAsIC41MDBFMCwgMi4wMDBFMCwgNC4wMDBFMCwgLjc1MEUwLCAyLjAwMEUwLCA1LjAwMEUwLCAuNzUwRTAsIDIuMjUwRTAsIDMuNzUwRTAsIDUuNzUwRTAsIDMuMDAwRTAsIC43NTBFMCwgMi41MDBFMCwgNC4wMDBFMCwgLjc1MEUwLCAyLjUwMEUwLCA0LjAwMEUwLCAuNzUwRTAsIDIuNTAwRTAsIDQuMDAwRTAsIC41MDBFMCwgNi4wMDBFMCwgMy4wMDBFMCwgLjUwMEUwLCAyLjc1MEUwLCAuNTAwRTAsIDEuNzUwRTB9OwotY29uc3QgZG91YmxlIGNod2lydXQyX2Z1bmN0b3I6Om1feVs1NF0gPSB7IDkyLjkwMDBFMCAsNTcuMTAwMEUwICwzMS4wNTAwRTAgLDExLjU4NzVFMCAsOC4wMjUwRTAgLDYzLjYwMDBFMCAsMjEuNDAwMEUwICwxNC4yNTAwRTAgLDguNDc1MEUwICw2My44MDAwRTAgLDI2LjgwMDBFMCAsMTYuNDYyNUUwICw3LjEyNTBFMCAsNjcuMzAwMEUwICw0MS4wMDAwRTAgLDIxLjE1MDBFMCAsOC4xNzUwRTAgLDgxLjUwMDBFMCAsMTMuMTIwMEUwICw1OS45MDAwRTAgLDE0LjYyMDBFMCAsMzIuOTAwMEUwICw1LjQ0MDBFMCAsMTIuNTYwMEUwICw1LjQ0MDBFMCAsMzIuMDAwMEUwICwxMy45NTAwRTAgLDc1LjgwMDBFMCAsMjAuMDAwMEUwICwxMC40MjAwRTAgLDU5LjUwMDBFMCAsMjEuNjcwMEUwICw4LjU1MDBFMCAsNjIuMDAwMEUwICwyMC4yMDAwRTAgLDcuNzYwMEUwICwzLjc1MDBFMCAsMTEuODEwMEUwICw1NC43MDAwRTAgLDIzLjcwMDBFMCAsMTEuNTUwMEUwICw2MS4zMDAwRTAgLDE3LjcwMDBFMCAsOC43NDAwRTAgLDU5LjIwMDBFMCAsMTYuMzAwMEUwICw4LjYyMDBFMCAsODEuMDAwMEUwICw0Ljg3MDBFMCAsMTQuNjIwMEUwICw4MS43MDAwRTAgLDE3LjE3MDBFMCAsODEuMzAwMEUwICwyOC45MDAwRTAgIH07Citjb25zdCBkb3VibGUgY2h3aXJ1dDJfZnVuY3Rvcjo6bV94WzU0XSA9IHsKKyAgICAwLjUwMEUwLCAxLjAwMEUwLCAxLjc1MEUwLCAzLjc1MEUwLCA1Ljc1MEUwLCAwLjg3NUUwLCAyLjI1MEUwLCAzLjI1MEUwLCA1LjI1MEUwLCAwLjc1MEUwLCAxLjc1MEUwLAorICAgIDIuNzUwRTAsIDQuNzUwRTAsIDAuNjI1RTAsIDEuMjUwRTAsIDIuMjUwRTAsIDQuMjUwRTAsIC41MDBFMCwgIDMuMDAwRTAsIC43NTBFMCwgIDMuMDAwRTAsIDEuNTAwRTAsCisgICAgNi4wMDBFMCwgMy4wMDBFMCwgNi4wMDBFMCwgMS41MDBFMCwgMy4wMDBFMCwgLjUwMEUwLCAgMi4wMDBFMCwgNC4wMDBFMCwgLjc1MEUwLCAgMi4wMDBFMCwgNS4wMDBFMCwKKyAgICAuNzUwRTAsICAyLjI1MEUwLCAzLjc1MEUwLCA1Ljc1MEUwLCAzLjAwMEUwLCAuNzUwRTAsICAyLjUwMEUwLCA0LjAwMEUwLCAuNzUwRTAsICAyLjUwMEUwLCA0LjAwMEUwLAorICAgIC43NTBFMCwgIDIuNTAwRTAsIDQuMDAwRTAsIC41MDBFMCwgIDYuMDAwRTAsIDMuMDAwRTAsIC41MDBFMCwgIDIuNzUwRTAsIC41MDBFMCwgIDEuNzUwRTB9OworY29uc3QgZG91YmxlIGNod2lydXQyX2Z1bmN0b3I6Om1feVs1NF0gPSB7CisgICAgOTIuOTAwMEUwLCA1Ny4xMDAwRTAsIDMxLjA1MDBFMCwgMTEuNTg3NUUwLCA4LjAyNTBFMCwgIDYzLjYwMDBFMCwgMjEuNDAwMEUwLCAxNC4yNTAwRTAsIDguNDc1MEUwLAorICAgIDYzLjgwMDBFMCwgMjYuODAwMEUwLCAxNi40NjI1RTAsIDcuMTI1MEUwLCAgNjcuMzAwMEUwLCA0MS4wMDAwRTAsIDIxLjE1MDBFMCwgOC4xNzUwRTAsICA4MS41MDAwRTAsCisgICAgMTMuMTIwMEUwLCA1OS45MDAwRTAsIDE0LjYyMDBFMCwgMzIuOTAwMEUwLCA1LjQ0MDBFMCwgIDEyLjU2MDBFMCwgNS40NDAwRTAsICAzMi4wMDAwRTAsIDEzLjk1MDBFMCwKKyAgICA3NS44MDAwRTAsIDIwLjAwMDBFMCwgMTAuNDIwMEUwLCA1OS41MDAwRTAsIDIxLjY3MDBFMCwgOC41NTAwRTAsICA2Mi4wMDAwRTAsIDIwLjIwMDBFMCwgNy43NjAwRTAsCisgICAgMy43NTAwRTAsICAxMS44MTAwRTAsIDU0LjcwMDBFMCwgMjMuNzAwMEUwLCAxMS41NTAwRTAsIDYxLjMwMDBFMCwgMTcuNzAwMEUwLCA4Ljc0MDBFMCwgIDU5LjIwMDBFMCwKKyAgICAxNi4zMDAwRTAsIDguNjIwMEUwLCAgODEuMDAwMEUwLCA0Ljg3MDBFMCwgIDE0LjYyMDBFMCwgODEuNzAwMEUwLCAxNy4xNzAwRTAsIDgxLjMwMDBFMCwgMjguOTAwMEUwfTsKIAogLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvY2h3aXJ1dDIuc2h0bWwKLXZvaWQgdGVzdE5pc3RDaHdpcnV0Mih2b2lkKQotewotICBjb25zdCBpbnQgbj0zOwordm9pZCB0ZXN0TmlzdENod2lydXQyKHZvaWQpIHsKKyAgY29uc3QgaW50IG4gPSAzOwogICBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzIGluZm87CiAKICAgVmVjdG9yWGQgeChuKTsKQEAgLTI5MSw3ICsyODAsNyBAQAogICAvKgogICAgKiBGaXJzdCB0cnkKICAgICovCi0gIHg8PCAwLjEsIDAuMDEsIDAuMDI7CisgIHggPDwgMC4xLCAwLjAxLCAwLjAyOwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgY2h3aXJ1dDJfZnVuY3RvciBmdW5jdG9yOwogICBMZXZlbmJlcmdNYXJxdWFyZHQ8Y2h3aXJ1dDJfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CkBAIC0zMDAsNyArMjg5LDcgQEAKIAogICAvLyBjaGVjayByZXR1cm4gdmFsdWUKICAgLy8gVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOwotLy8gICBWRVJJRllfSVNfRVFVQUwobG0ubmZldigpLCAxMCk7CisgIC8vICAgVkVSSUZZX0lTX0VRVUFMKGxtLm5mZXYoKSwgMTApOwogICAvLyBWRVJJRllfSVNfRVFVQUwobG0ubmpldigpLCA4KTsKICAgLy8gY2hlY2sgbm9ybV4yCiAgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDUuMTMwNDgwMjk0MUUrMDIpOwpAQCAtMzEyLDE3ICszMDEsMTcgQEAKICAgLyoKICAgICogU2Vjb25kIHRyeQogICAgKi8KLSAgeDw8IDAuMTUsIDAuMDA4LCAwLjAxMDsKKyAgeCA8PCAwLjE1LCAwLjAwOCwgMC4wMTA7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBsbS5yZXNldFBhcmFtZXRlcnMoKTsKLSAgbG0uc2V0RnRvbCgxLkU2Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOwotICBsbS5zZXRYdG9sKDEuRTYqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKSk7CisgIGxtLnNldEZ0b2woMS5FNiAqIE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBsbS5zZXRYdG9sKDEuRTYgKiBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKICAgaW5mbyA9IGxtLm1pbmltaXplKHgpOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaW5mbykKIAogICAvLyBjaGVjayByZXR1cm4gdmFsdWUKICAgLy8gVkVSSUZZX0lTX0VRVUFMKGluZm8sIDEpOwotLy8gICBWRVJJRllfSVNfRVFVQUwobG0ubmZldigpLCA3KTsKKyAgLy8gICBWRVJJRllfSVNfRVFVQUwobG0ubmZldigpLCA3KTsKICAgLy8gVkVSSUZZX0lTX0VRVUFMKGxtLm5qZXYoKSwgNik7CiAgIC8vIGNoZWNrIG5vcm1eMgogICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMoKS5zcXVhcmVkTm9ybSgpLCA1LjEzMDQ4MDI5NDFFKzAyKTsKQEAgLTMzMiw0MCArMzIxLDM3IEBACiAgIFZFUklGWV9JU19BUFBST1goeFsyXSwgMS4yMTUwMDA3MDk2RS0wMik7CiB9CiAKLQotc3RydWN0IG1pc3JhMWFfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+Ci17Ci0gICAgbWlzcmExYV9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMiwxNCkge30KLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIG1feFsxNF07Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSBtX3lbMTRdOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Mik7Ci0gICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTQpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwxNDsgaSsrKSB7Ci0gICAgICAgICAgICBmdmVjW2ldID0gYlswXSooMS4tZXhwKC1iWzFdKm1feFtpXSkpIC0gbV95W2ldIDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKK3N0cnVjdCBtaXNyYTFhX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPiB7CisgIG1pc3JhMWFfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDIsIDE0KSB7fQorICBzdGF0aWMgY29uc3QgZG91YmxlIG1feFsxNF07CisgIHN0YXRpYyBjb25zdCBkb3VibGUgbV95WzE0XTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDIpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSAxNCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNDsgaSsrKSB7CisgICAgICBmdmVjW2ldID0gYlswXSAqICgxLiAtIGV4cCgtYlsxXSAqIG1feFtpXSkpIC0gbV95W2ldOwogICAgIH0KLSAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0yKTsKLSAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0xNCk7Ci0gICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Mik7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDE0OyBpKyspIHsKLSAgICAgICAgICAgIGZqYWMoaSwwKSA9ICgxLi1leHAoLWJbMV0qbV94W2ldKSk7Ci0gICAgICAgICAgICBmamFjKGksMSkgPSAoYlswXSptX3hbaV0qZXhwKC1iWzFdKm1feFtpXSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAwOworICB9CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gMik7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDE0KTsKKyAgICBhc3NlcnQoZmphYy5jb2xzKCkgPT0gMik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNDsgaSsrKSB7CisgICAgICBmamFjKGksIDApID0gKDEuIC0gZXhwKC1iWzFdICogbV94W2ldKSk7CisgICAgICBmamFjKGksIDEpID0gKGJbMF0gKiBtX3hbaV0gKiBleHAoLWJbMV0gKiBtX3hbaV0pKTsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIH07Ci1jb25zdCBkb3VibGUgbWlzcmExYV9mdW5jdG9yOjptX3hbMTRdID0geyA3Ny42RTAsIDExNC45RTAsIDE0MS4xRTAsIDE5MC44RTAsIDIzOS45RTAsIDI4OS4wRTAsIDMzMi44RTAsIDM3OC40RTAsIDQzNC44RTAsIDQ3Ny4zRTAsIDUzNi44RTAsIDU5My4xRTAsIDY4OS4xRTAsIDc2MC4wRTB9OwotY29uc3QgZG91YmxlIG1pc3JhMWFfZnVuY3Rvcjo6bV95WzE0XSA9IHsgMTAuMDdFMCwgMTQuNzNFMCwgMTcuOTRFMCwgMjMuOTNFMCwgMjkuNjFFMCwgMzUuMThFMCwgNDAuMDJFMCwgNDQuODJFMCwgNTAuNzZFMCwgNTUuMDVFMCwgNjEuMDFFMCwgNjYuNDBFMCwgNzUuNDdFMCwgODEuNzhFMH07Citjb25zdCBkb3VibGUgbWlzcmExYV9mdW5jdG9yOjptX3hbMTRdID0gezc3LjZFMCwgIDExNC45RTAsIDE0MS4xRTAsIDE5MC44RTAsIDIzOS45RTAsIDI4OS4wRTAsIDMzMi44RTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3OC40RTAsIDQzNC44RTAsIDQ3Ny4zRTAsIDUzNi44RTAsIDU5My4xRTAsIDY4OS4xRTAsIDc2MC4wRTB9OworY29uc3QgZG91YmxlIG1pc3JhMWFfZnVuY3Rvcjo6bV95WzE0XSA9IHsxMC4wN0UwLCAxNC43M0UwLCAxNy45NEUwLCAyMy45M0UwLCAyOS42MUUwLCAzNS4xOEUwLCA0MC4wMkUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NC44MkUwLCA1MC43NkUwLCA1NS4wNUUwLCA2MS4wMUUwLCA2Ni40MEUwLCA3NS40N0UwLCA4MS43OEUwfTsKIAogLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvbWlzcmExYS5zaHRtbAotdm9pZCB0ZXN0TmlzdE1pc3JhMWEodm9pZCkKLXsKLSAgY29uc3QgaW50IG49MjsKK3ZvaWQgdGVzdE5pc3RNaXNyYTFhKHZvaWQpIHsKKyAgY29uc3QgaW50IG4gPSAyOwogICBpbnQgaW5mbzsKIAogICBWZWN0b3JYZCB4KG4pOwpAQCAtMzczLDcgKzM1OSw3IEBACiAgIC8qCiAgICAqIEZpcnN0IHRyeQogICAgKi8KLSAgeDw8IDUwMC4sIDAuMDAwMTsKKyAgeCA8PCA1MDAuLCAwLjAwMDE7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBtaXNyYTFhX2Z1bmN0b3IgZnVuY3RvcjsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PG1pc3JhMWFfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CkBAIC0zOTMsNyArMzc5LDcgQEAKICAgLyoKICAgICogU2Vjb25kIHRyeQogICAgKi8KLSAgeDw8IDI1MC4sIDAuMDAwNTsKKyAgeCA8PCAyNTAuLCAwLjAwMDU7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbmZvKQpAQCAtNDA5LDU2ICszOTUsOTIgQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA1LjUwMTU2NDMxODFFLTA0KTsKIH0KIAotc3RydWN0IGhhaG4xX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPgotewotICAgIGhhaG4xX2Z1bmN0b3Iodm9pZCkgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPig3LDIzNikge30KLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIG1feFsyMzZdOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgbV95WzIzNl0gPSB7IC41OTFFMCAsIDEuNTQ3RTAgLCAyLjkwMkUwICwgMi44OTRFMCAsIDQuNzAzRTAgLCA2LjMwN0UwICwgNy4wM0UwICAsIDcuODk4RTAgLCA5LjQ3MEUwICwgOS40ODRFMCAsIDEwLjA3MkUwICwgMTAuMTYzRTAgLCAxMS42MTVFMCAsIDEyLjAwNUUwICwgMTIuNDc4RTAgLCAxMi45ODJFMCAsIDEyLjk3MEUwICwgMTMuOTI2RTAgLCAxNC40NTJFMCAsIDE0LjQwNEUwICwgMTUuMTkwRTAgLCAxNS41NTBFMCAsIDE1LjUyOEUwICwgMTUuNDk5RTAgLCAxNi4xMzFFMCAsIDE2LjQzOEUwICwgMTYuMzg3RTAgLCAxNi41NDlFMCAsIDE2Ljg3MkUwICwgMTYuODMwRTAgLCAxNi45MjZFMCAsIDE2LjkwN0UwICwgMTYuOTY2RTAgLCAxNy4wNjBFMCAsIDE3LjEyMkUwICwgMTcuMzExRTAgLCAxNy4zNTVFMCAsIDE3LjY2OEUwICwgMTcuNzY3RTAgLCAxNy44MDNFMCAsIDE3Ljc2NUUwICwgMTcuNzY4RTAgLCAxNy43MzZFMCAsIDE3Ljg1OEUwICwgMTcuODc3RTAgLCAxNy45MTJFMCAsIDE4LjA0NkUwICwgMTguMDg1RTAgLCAxOC4yOTFFMCAsIDE4LjM1N0UwICwgMTguNDI2RTAgLCAxOC41ODRFMCAsIDE4LjYxMEUwICwgMTguODcwRTAgLCAxOC43OTVFMCAsIDE5LjExMUUwICwgLjM2N0UwICwgLjc5NkUwICwgMC44OTJFMCAsIDEuOTAzRTAgLCAyLjE1MEUwICwgMy42OTdFMCAsIDUuODcwRTAgLCA2LjQyMUUwICwgNy40MjJFMCAsIDkuOTQ0RTAgLCAxMS4wMjNFMCAsIDExLjg3RTAgICwgMTIuNzg2RTAgLCAxNC4wNjdFMCAsIDEzLjk3NEUwICwgMTQuNDYyRTAgLCAxNC40NjRFMCAsIDE1LjM4MUUwICwgMTUuNDgzRTAgLCAxNS41OUUwICAsIDE2LjA3NUUwICwgMTYuMzQ3RTAgLCAxNi4xODFFMCAsIDE2LjkxNUUwICwgMTcuMDAzRTAgLCAxNi45NzhFMCAsIDE3Ljc1NkUwICwgMTcuODA4RTAgLCAxNy44NjhFMCAsIDE4LjQ4MUUwICwgMTguNDg2RTAgLCAxOS4wOTBFMCAsIDE2LjA2MkUwICwgMTYuMzM3RTAgLCAxNi4zNDVFMCAsCi0gICAgICAgIDE2LjM4OEUwICwgMTcuMTU5RTAgLCAxNy4xMTZFMCAsIDE3LjE2NEUwICwgMTcuMTIzRTAgLCAxNy45NzlFMCAsIDE3Ljk3NEUwICwgMTguMDA3RTAgLCAxNy45OTNFMCAsIDE4LjUyM0UwICwgMTguNjY5RTAgLCAxOC42MTdFMCAsIDE5LjM3MUUwICwgMTkuMzMwRTAgLCAwLjA4MEUwICwgMC4yNDhFMCAsIDEuMDg5RTAgLCAxLjQxOEUwICwgMi4yNzhFMCAsIDMuNjI0RTAgLCA0LjU3NEUwICwgNS41NTZFMCAsIDcuMjY3RTAgLCA3LjY5NUUwICwgOS4xMzZFMCAsIDkuOTU5RTAgLCA5Ljk1N0UwICwgMTEuNjAwRTAgLCAxMy4xMzhFMCAsIDEzLjU2NEUwICwgMTMuODcxRTAgLCAxMy45OTRFMCAsIDE0Ljk0N0UwICwgMTUuNDczRTAgLCAxNS4zNzlFMCAsIDE1LjQ1NUUwICwgMTUuOTA4RTAgLCAxNi4xMTRFMCAsIDE3LjA3MUUwICwgMTcuMTM1RTAgLCAxNy4yODJFMCAsIDE3LjM2OEUwICwgMTcuNDgzRTAgLCAxNy43NjRFMCAsIDE4LjE4NUUwICwgMTguMjcxRTAgLCAxOC4yMzZFMCAsIDE4LjIzN0UwICwgMTguNTIzRTAgLCAxOC42MjdFMCAsIDE4LjY2NUUwICwgMTkuMDg2RTAgLCAwLjIxNEUwICwgMC45NDNFMCAsIDEuNDI5RTAgLCAyLjI0MUUwICwgMi45NTFFMCAsIDMuNzgyRTAgLCA0Ljc1N0UwICwgNS42MDJFMCAsIDcuMTY5RTAgLCA4LjkyMEUwICwgMTAuMDU1RTAgLCAxMi4wMzVFMCAsIDEyLjg2MUUwICwgMTMuNDM2RTAgLCAxNC4xNjdFMCAsIDE0Ljc1NUUwICwgMTUuMTY4RTAgLCAxNS42NTFFMCAsIDE1Ljc0NkUwICwgMTYuMjE2RTAgLCAxNi40NDVFMCAsIDE2Ljk2NUUwICwgMTcuMTIxRTAgLCAxNy4yMDZFMCAsIDE3LjI1MEUwICwgMTcuMzM5RTAgLCAxNy43OTNFMCAsIDE4LjEyM0UwICwgMTguNDlFMCAgLCAxOC41NjZFMCAsIDE4LjY0NUUwICwgMTguNzA2RTAgLCAxOC45MjRFMCAsIDE5LjFFMCAgICwgMC4zNzVFMCAsIDAuNDcxRTAgLCAxLjUwNEUwICwgMi4yMDRFMCAsIDIuODEzRTAgLCA0Ljc2NUUwICwgOS44MzVFMCAsIDEwLjA0MEUwICwgMTEuOTQ2RTAgLCAKLTEyLjU5NkUwICwgCi0xMy4zMDNFMCAsIDEzLjkyMkUwICwgMTQuNDQwRTAgLCAxNC45NTFFMCAsIDE1LjYyN0UwICwgMTUuNjM5RTAgLCAxNS44MTRFMCAsIDE2LjMxNUUwICwgMTYuMzM0RTAgLCAxNi40MzBFMCAsIDE2LjQyM0UwICwgMTcuMDI0RTAgLCAxNy4wMDlFMCAsIDE3LjE2NUUwICwgMTcuMTM0RTAgLCAxNy4zNDlFMCAsIDE3LjU3NkUwICwgMTcuODQ4RTAgLCAxOC4wOTBFMCAsIDE4LjI3NkUwICwgMTguNDA0RTAgLCAxOC41MTlFMCAsIDE5LjEzM0UwICwgMTkuMDc0RTAgLCAxOS4yMzlFMCAsIDE5LjI4MEUwICwgMTkuMTAxRTAgLCAxOS4zOThFMCAsIDE5LjI1MkUwICwgMTkuODlFMCAgLCAyMC4wMDdFMCAsIDE5LjkyOUUwICwgMTkuMjY4RTAgLCAxOS4zMjRFMCAsIDIwLjA0OUUwICwgMjAuMTA3RTAgLCAyMC4wNjJFMCAsIDIwLjA2NUUwICwgMTkuMjg2RTAgLCAxOS45NzJFMCAsIDIwLjA4OEUwICwgMjAuNzQzRTAgLCAyMC44M0UwICAsIDIwLjkzNUUwICwgMjEuMDM1RTAgLCAyMC45M0UwICAsIDIxLjA3NEUwICwgMjEuMDg1RTAgLCAyMC45MzVFMCB9Oworc3RydWN0IGhhaG4xX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPiB7CisgIGhhaG4xX2Z1bmN0b3Iodm9pZCkgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPig3LCAyMzYpIHt9CisgIHN0YXRpYyBjb25zdCBkb3VibGUgbV94WzIzNl07CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykgeworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgbV95WzIzNl0gPSB7CisgICAgICAgIC41OTFFMCwgICAxLjU0N0UwLCAgMi45MDJFMCwgIDIuODk0RTAsICA0LjcwM0UwLCAgNi4zMDdFMCwgIDcuMDNFMCwgICA3Ljg5OEUwLCAgOS40NzBFMCwgIDkuNDg0RTAsICAxMC4wNzJFMCwKKyAgICAgICAgMTAuMTYzRTAsIDExLjYxNUUwLCAxMi4wMDVFMCwgMTIuNDc4RTAsIDEyLjk4MkUwLCAxMi45NzBFMCwgMTMuOTI2RTAsIDE0LjQ1MkUwLCAxNC40MDRFMCwgMTUuMTkwRTAsIDE1LjU1MEUwLAorICAgICAgICAxNS41MjhFMCwgMTUuNDk5RTAsIDE2LjEzMUUwLCAxNi40MzhFMCwgMTYuMzg3RTAsIDE2LjU0OUUwLCAxNi44NzJFMCwgMTYuODMwRTAsIDE2LjkyNkUwLCAxNi45MDdFMCwgMTYuOTY2RTAsCisgICAgICAgIDE3LjA2MEUwLCAxNy4xMjJFMCwgMTcuMzExRTAsIDE3LjM1NUUwLCAxNy42NjhFMCwgMTcuNzY3RTAsIDE3LjgwM0UwLCAxNy43NjVFMCwgMTcuNzY4RTAsIDE3LjczNkUwLCAxNy44NThFMCwKKyAgICAgICAgMTcuODc3RTAsIDE3LjkxMkUwLCAxOC4wNDZFMCwgMTguMDg1RTAsIDE4LjI5MUUwLCAxOC4zNTdFMCwgMTguNDI2RTAsIDE4LjU4NEUwLCAxOC42MTBFMCwgMTguODcwRTAsIDE4Ljc5NUUwLAorICAgICAgICAxOS4xMTFFMCwgLjM2N0UwLCAgIC43OTZFMCwgICAwLjg5MkUwLCAgMS45MDNFMCwgIDIuMTUwRTAsICAzLjY5N0UwLCAgNS44NzBFMCwgIDYuNDIxRTAsICA3LjQyMkUwLCAgOS45NDRFMCwKKyAgICAgICAgMTEuMDIzRTAsIDExLjg3RTAsICAxMi43ODZFMCwgMTQuMDY3RTAsIDEzLjk3NEUwLCAxNC40NjJFMCwgMTQuNDY0RTAsIDE1LjM4MUUwLCAxNS40ODNFMCwgMTUuNTlFMCwgIDE2LjA3NUUwLAorICAgICAgICAxNi4zNDdFMCwgMTYuMTgxRTAsIDE2LjkxNUUwLCAxNy4wMDNFMCwgMTYuOTc4RTAsIDE3Ljc1NkUwLCAxNy44MDhFMCwgMTcuODY4RTAsIDE4LjQ4MUUwLCAxOC40ODZFMCwgMTkuMDkwRTAsCisgICAgICAgIDE2LjA2MkUwLCAxNi4zMzdFMCwgMTYuMzQ1RTAsIDE2LjM4OEUwLCAxNy4xNTlFMCwgMTcuMTE2RTAsIDE3LjE2NEUwLCAxNy4xMjNFMCwgMTcuOTc5RTAsIDE3Ljk3NEUwLCAxOC4wMDdFMCwKKyAgICAgICAgMTcuOTkzRTAsIDE4LjUyM0UwLCAxOC42NjlFMCwgMTguNjE3RTAsIDE5LjM3MUUwLCAxOS4zMzBFMCwgMC4wODBFMCwgIDAuMjQ4RTAsICAxLjA4OUUwLCAgMS40MThFMCwgIDIuMjc4RTAsCisgICAgICAgIDMuNjI0RTAsICA0LjU3NEUwLCAgNS41NTZFMCwgIDcuMjY3RTAsICA3LjY5NUUwLCAgOS4xMzZFMCwgIDkuOTU5RTAsICA5Ljk1N0UwLCAgMTEuNjAwRTAsIDEzLjEzOEUwLCAxMy41NjRFMCwKKyAgICAgICAgMTMuODcxRTAsIDEzLjk5NEUwLCAxNC45NDdFMCwgMTUuNDczRTAsIDE1LjM3OUUwLCAxNS40NTVFMCwgMTUuOTA4RTAsIDE2LjExNEUwLCAxNy4wNzFFMCwgMTcuMTM1RTAsIDE3LjI4MkUwLAorICAgICAgICAxNy4zNjhFMCwgMTcuNDgzRTAsIDE3Ljc2NEUwLCAxOC4xODVFMCwgMTguMjcxRTAsIDE4LjIzNkUwLCAxOC4yMzdFMCwgMTguNTIzRTAsIDE4LjYyN0UwLCAxOC42NjVFMCwgMTkuMDg2RTAsCisgICAgICAgIDAuMjE0RTAsICAwLjk0M0UwLCAgMS40MjlFMCwgIDIuMjQxRTAsICAyLjk1MUUwLCAgMy43ODJFMCwgIDQuNzU3RTAsICA1LjYwMkUwLCAgNy4xNjlFMCwgIDguOTIwRTAsICAxMC4wNTVFMCwKKyAgICAgICAgMTIuMDM1RTAsIDEyLjg2MUUwLCAxMy40MzZFMCwgMTQuMTY3RTAsIDE0Ljc1NUUwLCAxNS4xNjhFMCwgMTUuNjUxRTAsIDE1Ljc0NkUwLCAxNi4yMTZFMCwgMTYuNDQ1RTAsIDE2Ljk2NUUwLAorICAgICAgICAxNy4xMjFFMCwgMTcuMjA2RTAsIDE3LjI1MEUwLCAxNy4zMzlFMCwgMTcuNzkzRTAsIDE4LjEyM0UwLCAxOC40OUUwLCAgMTguNTY2RTAsIDE4LjY0NUUwLCAxOC43MDZFMCwgMTguOTI0RTAsCisgICAgICAgIDE5LjFFMCwgICAwLjM3NUUwLCAgMC40NzFFMCwgIDEuNTA0RTAsICAyLjIwNEUwLCAgMi44MTNFMCwgIDQuNzY1RTAsICA5LjgzNUUwLCAgMTAuMDQwRTAsIDExLjk0NkUwLCAxMi41OTZFMCwKKyAgICAgICAgMTMuMzAzRTAsIDEzLjkyMkUwLCAxNC40NDBFMCwgMTQuOTUxRTAsIDE1LjYyN0UwLCAxNS42MzlFMCwgMTUuODE0RTAsIDE2LjMxNUUwLCAxNi4zMzRFMCwgMTYuNDMwRTAsIDE2LjQyM0UwLAorICAgICAgICAxNy4wMjRFMCwgMTcuMDA5RTAsIDE3LjE2NUUwLCAxNy4xMzRFMCwgMTcuMzQ5RTAsIDE3LjU3NkUwLCAxNy44NDhFMCwgMTguMDkwRTAsIDE4LjI3NkUwLCAxOC40MDRFMCwgMTguNTE5RTAsCisgICAgICAgIDE5LjEzM0UwLCAxOS4wNzRFMCwgMTkuMjM5RTAsIDE5LjI4MEUwLCAxOS4xMDFFMCwgMTkuMzk4RTAsIDE5LjI1MkUwLCAxOS44OUUwLCAgMjAuMDA3RTAsIDE5LjkyOUUwLCAxOS4yNjhFMCwKKyAgICAgICAgMTkuMzI0RTAsIDIwLjA0OUUwLCAyMC4xMDdFMCwgMjAuMDYyRTAsIDIwLjA2NUUwLCAxOS4yODZFMCwgMTkuOTcyRTAsIDIwLjA4OEUwLCAyMC43NDNFMCwgMjAuODNFMCwgIDIwLjkzNUUwLAorICAgICAgICAyMS4wMzVFMCwgMjAuOTNFMCwgIDIxLjA3NEUwLCAyMS4wODVFMCwgMjAuOTM1RTB9OwogCi0gICAgICAgIC8vICAgICAgICBpbnQgY2FsbGVkPTA7IHByaW50ZigiY2FsbCBoYWhuMV9mdW5jdG9yIHdpdGggIGlmbGFnPSVkLCBjYWxsZWQ9JWRcbiIsIGlmbGFnLCBjYWxsZWQpOyBpZiAoaWZsYWc9PTEpIGNhbGxlZCsrOworICAgIC8vICAgICAgICBpbnQgY2FsbGVkPTA7IHByaW50ZigiY2FsbCBoYWhuMV9mdW5jdG9yIHdpdGggIGlmbGFnPSVkLCBjYWxsZWQ9JWRcbiIsIGlmbGFnLCBjYWxsZWQpOyBpZiAoaWZsYWc9PTEpCisgICAgLy8gICAgICAgIGNhbGxlZCsrOwogCi0gICAgICAgIGFzc2VydChiLnNpemUoKT09Nyk7Ci0gICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MjM2KTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8MjM2OyBpKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSB4PW1feFtpXSwgeHg9eCp4LCB4eHg9eHgqeDsKLSAgICAgICAgICAgIGZ2ZWNbaV0gPSAoYlswXStiWzFdKngrYlsyXSp4eCtiWzNdKnh4eCkgLyAoMS4rYls0XSp4K2JbNV0qeHgrYls2XSp4eHgpIC0gbV95W2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgIGFzc2VydChiLnNpemUoKSA9PSA3KTsKKyAgICBhc3NlcnQoZnZlYy5zaXplKCkgPT0gMjM2KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIzNjsgaSsrKSB7CisgICAgICBkb3VibGUgeCA9IG1feFtpXSwgeHggPSB4ICogeCwgeHh4ID0geHggKiB4OworICAgICAgZnZlY1tpXSA9IChiWzBdICsgYlsxXSAqIHggKyBiWzJdICogeHggKyBiWzNdICogeHh4KSAvICgxLiArIGJbNF0gKiB4ICsgYls1XSAqIHh4ICsgYls2XSAqIHh4eCkgLSBtX3lbaV07CiAgICAgfQorICAgIHJldHVybiAwOworICB9CiAKLSAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT03KTsKLSAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0yMzYpOwotICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTcpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwyMzY7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIHg9bV94W2ldLCB4eD14KngsIHh4eD14eCp4OwotICAgICAgICAgICAgZG91YmxlIGZhY3QgPSAxLi8oMS4rYls0XSp4K2JbNV0qeHgrYls2XSp4eHgpOwotICAgICAgICAgICAgZmphYyhpLDApID0gMS4qZmFjdDsKLSAgICAgICAgICAgIGZqYWMoaSwxKSA9IHgqZmFjdDsKLSAgICAgICAgICAgIGZqYWMoaSwyKSA9IHh4KmZhY3Q7Ci0gICAgICAgICAgICBmamFjKGksMykgPSB4eHgqZmFjdDsKLSAgICAgICAgICAgIGZhY3QgPSAtIChiWzBdK2JbMV0qeCtiWzJdKnh4K2JbM10qeHh4KSAqIGZhY3QgKiBmYWN0OwotICAgICAgICAgICAgZmphYyhpLDQpID0geCpmYWN0OwotICAgICAgICAgICAgZmphYyhpLDUpID0geHgqZmFjdDsKLSAgICAgICAgICAgIGZqYWMoaSw2KSA9IHh4eCpmYWN0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDcpOworICAgIGFzc2VydChmamFjLnJvd3MoKSA9PSAyMzYpOworICAgIGFzc2VydChmamFjLmNvbHMoKSA9PSA3KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIzNjsgaSsrKSB7CisgICAgICBkb3VibGUgeCA9IG1feFtpXSwgeHggPSB4ICogeCwgeHh4ID0geHggKiB4OworICAgICAgZG91YmxlIGZhY3QgPSAxLiAvICgxLiArIGJbNF0gKiB4ICsgYls1XSAqIHh4ICsgYls2XSAqIHh4eCk7CisgICAgICBmamFjKGksIDApID0gMS4gKiBmYWN0OworICAgICAgZmphYyhpLCAxKSA9IHggKiBmYWN0OworICAgICAgZmphYyhpLCAyKSA9IHh4ICogZmFjdDsKKyAgICAgIGZqYWMoaSwgMykgPSB4eHggKiBmYWN0OworICAgICAgZmFjdCA9IC0oYlswXSArIGJbMV0gKiB4ICsgYlsyXSAqIHh4ICsgYlszXSAqIHh4eCkgKiBmYWN0ICogZmFjdDsKKyAgICAgIGZqYWMoaSwgNCkgPSB4ICogZmFjdDsKKyAgICAgIGZqYWMoaSwgNSkgPSB4eCAqIGZhY3Q7CisgICAgICBmamFjKGksIDYpID0geHh4ICogZmFjdDsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIH07Ci1jb25zdCBkb3VibGUgaGFobjFfZnVuY3Rvcjo6bV94WzIzNl0gPSB7IDI0LjQxRTAgLCAzNC44MkUwICwgNDQuMDlFMCAsIDQ1LjA3RTAgLCA1NC45OEUwICwgNjUuNTFFMCAsIDcwLjUzRTAgLCA3NS43MEUwICwgODkuNTdFMCAsIDkxLjE0RTAgLCA5Ni40MEUwICwgOTcuMTlFMCAsIDExNC4yNkUwICwgMTIwLjI1RTAgLCAxMjcuMDhFMCAsIDEzMy41NUUwICwgMTMzLjYxRTAgLCAxNTguNjdFMCAsIDE3Mi43NEUwICwgMTcxLjMxRTAgLCAyMDIuMTRFMCAsIDIyMC41NUUwICwgMjIxLjA1RTAgLCAyMjEuMzlFMCAsIDI1MC45OUUwICwgMjY4Ljk5RTAgLCAyNzEuODBFMCAsIDI3MS45N0UwICwgMzIxLjMxRTAgLCAzMjEuNjlFMCAsIDMzMC4xNEUwICwgMzMzLjAzRTAgLCAzMzMuNDdFMCAsIDM0MC43N0UwICwgMzQ1LjY1RTAgLCAzNzMuMTFFMCAsIDM3My43OUUwICwgNDExLjgyRTAgLCA0MTkuNTFFMCAsIDQyMS41OUUwICwgNDIyLjAyRTAgLCA0MjIuNDdFMCAsIDQyMi42MUUwICwgNDQxLjc1RTAgLCA0NDcuNDFFMCAsIDQ0OC43RTAgICwgNDcyLjg5RTAgLCA0NzYuNjlFMCAsIDUyMi40N0UwICwgNTIyLjYyRTAgLCA1MjQuNDNFMCAsIDU0Ni43NUUwICwgNTQ5LjUzRTAgLCA1NzUuMjlFMCAsIDU3Ni4wMEUwICwgNjI1LjU1RTAgLCAyMC4xNUUwICwgMjguNzhFMCAsIDI5LjU3RTAgLCAzNy40MUUwICwgMzkuMTJFMCAsIDUwLjI0RTAgLCA2MS4zOEUwICwgNjYuMjVFMCAsIDczLjQyRTAgLCA5NS41MkUwICwgMTA3LjMyRTAgLCAxMjIuMDRFMCAsIDEzNC4wM0UwICwgMTYzLjE5RTAgLCAxNjMuNDhFMCAsIDE3NS43MEUwICwgMTc5Ljg2RTAgLCAyMTEuMjdFMCAsIDIxNy43OEUwICwgMjE5LjE0RTAgLCAyNjIuNTJFMCAsIDI2OC4wMUUwICwgMjY4LjYyRTAgLCAzMzYuMjVFMCAsIDMzNy4yM0UwICwgMzM5LjMzRTAgLCA0MjcuMzhFMCAsIDQyOC41OEUwICwgNDMyLjY4RTAgLCA1MjguOTlFMCAsIDUzMS4wOEUwICwgNjI4LjM0RTAgLCAyNTMuMjRFMCAsIDI3My4xM0UwICwgMjczLjY2RTAgLAotMjgyLjEwRTAgLCAzNDYuNjJFMCAsIDM0Ny4xOUUwICwgMzQ4Ljc4RTAgLCAzNTEuMThFMCAsIDQ1MC4xMEUwICwgNDUwLjM1RTAgLCA0NTEuOTJFMCAsIDQ1NS41NkUwICwgNTUyLjIyRTAgLCA1NTMuNTZFMCAsIDU1NS43NEUwICwgNjUyLjU5RTAgLCA2NTYuMjBFMCAsIDE0LjEzRTAgLCAyMC40MUUwICwgMzEuMzBFMCAsIDMzLjg0RTAgLCAzOS43MEUwICwgNDguODNFMCAsIDU0LjUwRTAgLCA2MC40MUUwICwgNzIuNzdFMCAsIDc1LjI1RTAgLCA4Ni44NEUwICwgOTQuODhFMCAsIDk2LjQwRTAgLCAxMTcuMzdFMCAsIDEzOS4wOEUwICwgMTQ3LjczRTAgLCAxNTguNjNFMCAsIDE2MS44NEUwICwgMTkyLjExRTAgLCAyMDYuNzZFMCAsIDIwOS4wN0UwICwgMjEzLjMyRTAgLCAyMjYuNDRFMCAsIDIzNy4xMkUwICwgMzMwLjkwRTAgLCAzNTguNzJFMCAsIDM3MC43N0UwICwgMzcyLjcyRTAgLCAzOTYuMjRFMCAsIDQxNi41OUUwICwgNDg0LjAyRTAgLCA0OTUuNDdFMCAsIDUxNC43OEUwICwgNTE1LjY1RTAgLCA1MTkuNDdFMCAsIDU0NC40N0UwICwgNTYwLjExRTAgLCA2MjAuNzdFMCAsIDE4Ljk3RTAgLCAyOC45M0UwICwgMzMuOTFFMCAsIDQwLjAzRTAgLCA0NC42NkUwICwgNDkuODdFMCAsIDU1LjE2RTAgLCA2MC45MEUwICwgNzIuMDhFMCAsIDg1LjE1RTAgLCA5Ny4wNkUwICwgMTE5LjYzRTAgLCAxMzMuMjdFMCAsIDE0My44NEUwICwgMTYxLjkxRTAgLCAxODAuNjdFMCAsIDE5OC40NEUwICwgMjI2Ljg2RTAgLCAyMjkuNjVFMCAsIDI1OC4yN0UwICwgMjczLjc3RTAgLCAzMzkuMTVFMCAsIDM1MC4xM0UwICwgMzYyLjc1RTAgLCAzNzEuMDNFMCAsIDM5My4zMkUwICwgNDQ4LjUzRTAgLCA0NzMuNzhFMCAsIDUxMS4xMkUwICwgNTI0LjcwRTAgLCA1NDguNzVFMCAsIDU1MS42NEUwICwgNTc0LjAyRTAgLCA2MjMuODZFMCAsIDIxLjQ2RTAgLCAyNC4zM0UwICwgMzMuNDNFMCAsIDM5LjIyRTAgLCA0NC4xOEUwICwgNTUuMDJFMCAsIDk0LjMzRTAgLCA5Ni40NEUwICwgMTE4LjgyRTAgLCAxMjguNDhFMCAsCi0xNDEuOTRFMCAsIDE1Ni45MkUwICwgMTcxLjY1RTAgLCAxOTAuMDBFMCAsIDIyMy4yNkUwICwgMjIzLjg4RTAgLCAyMzEuNTBFMCAsIDI2NS4wNUUwICwgMjY5LjQ0RTAgLCAyNzEuNzhFMCAsIDI3My40NkUwICwgMzM0LjYxRTAgLCAzMzkuNzlFMCAsIDM0OS41MkUwICwgMzU4LjE4RTAgLCAzNzcuOThFMCAsIDM5NC43N0UwICwgNDI5LjY2RTAgLCA0NjguMjJFMCAsIDQ4Ny4yN0UwICwgNTE5LjU0RTAgLCA1MjMuMDNFMCAsIDYxMi45OUUwICwgNjM4LjU5RTAgLCA2NDEuMzZFMCAsIDYyMi4wNUUwICwgNjMxLjUwRTAgLCA2NjMuOTdFMCAsIDY0Ni45RTAgICwgNzQ4LjI5RTAgLCA3NDkuMjFFMCAsIDc1MC4xNEUwICwgNjQ3LjA0RTAgLCA2NDYuODlFMCAsIDc0Ni45RTAgICwgNzQ4LjQzRTAgLCA3NDcuMzVFMCAsIDc0OS4yN0UwICwgNjQ3LjYxRTAgLCA3NDcuNzhFMCAsIDc1MC41MUUwICwgODUxLjM3RTAgLCA4NDUuOTdFMCAsIDg0Ny41NEUwICwgODQ5LjkzRTAgLCA4NTEuNjFFMCAsIDg0OS43NUUwICwgODUwLjk4RTAgLCA4NDguMjNFMH07Citjb25zdCBkb3VibGUgaGFobjFfZnVuY3Rvcjo6bV94WzIzNl0gPSB7CisgICAgMjQuNDFFMCwgIDM0LjgyRTAsICA0NC4wOUUwLCAgNDUuMDdFMCwgIDU0Ljk4RTAsICA2NS41MUUwLCAgNzAuNTNFMCwgIDc1LjcwRTAsICA4OS41N0UwLCAgOTEuMTRFMCwgIDk2LjQwRTAsCisgICAgOTcuMTlFMCwgIDExNC4yNkUwLCAxMjAuMjVFMCwgMTI3LjA4RTAsIDEzMy41NUUwLCAxMzMuNjFFMCwgMTU4LjY3RTAsIDE3Mi43NEUwLCAxNzEuMzFFMCwgMjAyLjE0RTAsIDIyMC41NUUwLAorICAgIDIyMS4wNUUwLCAyMjEuMzlFMCwgMjUwLjk5RTAsIDI2OC45OUUwLCAyNzEuODBFMCwgMjcxLjk3RTAsIDMyMS4zMUUwLCAzMjEuNjlFMCwgMzMwLjE0RTAsIDMzMy4wM0UwLCAzMzMuNDdFMCwKKyAgICAzNDAuNzdFMCwgMzQ1LjY1RTAsIDM3My4xMUUwLCAzNzMuNzlFMCwgNDExLjgyRTAsIDQxOS41MUUwLCA0MjEuNTlFMCwgNDIyLjAyRTAsIDQyMi40N0UwLCA0MjIuNjFFMCwgNDQxLjc1RTAsCisgICAgNDQ3LjQxRTAsIDQ0OC43RTAsICA0NzIuODlFMCwgNDc2LjY5RTAsIDUyMi40N0UwLCA1MjIuNjJFMCwgNTI0LjQzRTAsIDU0Ni43NUUwLCA1NDkuNTNFMCwgNTc1LjI5RTAsIDU3Ni4wMEUwLAorICAgIDYyNS41NUUwLCAyMC4xNUUwLCAgMjguNzhFMCwgIDI5LjU3RTAsICAzNy40MUUwLCAgMzkuMTJFMCwgIDUwLjI0RTAsICA2MS4zOEUwLCAgNjYuMjVFMCwgIDczLjQyRTAsICA5NS41MkUwLAorICAgIDEwNy4zMkUwLCAxMjIuMDRFMCwgMTM0LjAzRTAsIDE2My4xOUUwLCAxNjMuNDhFMCwgMTc1LjcwRTAsIDE3OS44NkUwLCAyMTEuMjdFMCwgMjE3Ljc4RTAsIDIxOS4xNEUwLCAyNjIuNTJFMCwKKyAgICAyNjguMDFFMCwgMjY4LjYyRTAsIDMzNi4yNUUwLCAzMzcuMjNFMCwgMzM5LjMzRTAsIDQyNy4zOEUwLCA0MjguNThFMCwgNDMyLjY4RTAsIDUyOC45OUUwLCA1MzEuMDhFMCwgNjI4LjM0RTAsCisgICAgMjUzLjI0RTAsIDI3My4xM0UwLCAyNzMuNjZFMCwgMjgyLjEwRTAsIDM0Ni42MkUwLCAzNDcuMTlFMCwgMzQ4Ljc4RTAsIDM1MS4xOEUwLCA0NTAuMTBFMCwgNDUwLjM1RTAsIDQ1MS45MkUwLAorICAgIDQ1NS41NkUwLCA1NTIuMjJFMCwgNTUzLjU2RTAsIDU1NS43NEUwLCA2NTIuNTlFMCwgNjU2LjIwRTAsIDE0LjEzRTAsICAyMC40MUUwLCAgMzEuMzBFMCwgIDMzLjg0RTAsICAzOS43MEUwLAorICAgIDQ4LjgzRTAsICA1NC41MEUwLCAgNjAuNDFFMCwgIDcyLjc3RTAsICA3NS4yNUUwLCAgODYuODRFMCwgIDk0Ljg4RTAsICA5Ni40MEUwLCAgMTE3LjM3RTAsIDEzOS4wOEUwLCAxNDcuNzNFMCwKKyAgICAxNTguNjNFMCwgMTYxLjg0RTAsIDE5Mi4xMUUwLCAyMDYuNzZFMCwgMjA5LjA3RTAsIDIxMy4zMkUwLCAyMjYuNDRFMCwgMjM3LjEyRTAsIDMzMC45MEUwLCAzNTguNzJFMCwgMzcwLjc3RTAsCisgICAgMzcyLjcyRTAsIDM5Ni4yNEUwLCA0MTYuNTlFMCwgNDg0LjAyRTAsIDQ5NS40N0UwLCA1MTQuNzhFMCwgNTE1LjY1RTAsIDUxOS40N0UwLCA1NDQuNDdFMCwgNTYwLjExRTAsIDYyMC43N0UwLAorICAgIDE4Ljk3RTAsICAyOC45M0UwLCAgMzMuOTFFMCwgIDQwLjAzRTAsICA0NC42NkUwLCAgNDkuODdFMCwgIDU1LjE2RTAsICA2MC45MEUwLCAgNzIuMDhFMCwgIDg1LjE1RTAsICA5Ny4wNkUwLAorICAgIDExOS42M0UwLCAxMzMuMjdFMCwgMTQzLjg0RTAsIDE2MS45MUUwLCAxODAuNjdFMCwgMTk4LjQ0RTAsIDIyNi44NkUwLCAyMjkuNjVFMCwgMjU4LjI3RTAsIDI3My43N0UwLCAzMzkuMTVFMCwKKyAgICAzNTAuMTNFMCwgMzYyLjc1RTAsIDM3MS4wM0UwLCAzOTMuMzJFMCwgNDQ4LjUzRTAsIDQ3My43OEUwLCA1MTEuMTJFMCwgNTI0LjcwRTAsIDU0OC43NUUwLCA1NTEuNjRFMCwgNTc0LjAyRTAsCisgICAgNjIzLjg2RTAsIDIxLjQ2RTAsICAyNC4zM0UwLCAgMzMuNDNFMCwgIDM5LjIyRTAsICA0NC4xOEUwLCAgNTUuMDJFMCwgIDk0LjMzRTAsICA5Ni40NEUwLCAgMTE4LjgyRTAsIDEyOC40OEUwLAorICAgIDE0MS45NEUwLCAxNTYuOTJFMCwgMTcxLjY1RTAsIDE5MC4wMEUwLCAyMjMuMjZFMCwgMjIzLjg4RTAsIDIzMS41MEUwLCAyNjUuMDVFMCwgMjY5LjQ0RTAsIDI3MS43OEUwLCAyNzMuNDZFMCwKKyAgICAzMzQuNjFFMCwgMzM5Ljc5RTAsIDM0OS41MkUwLCAzNTguMThFMCwgMzc3Ljk4RTAsIDM5NC43N0UwLCA0MjkuNjZFMCwgNDY4LjIyRTAsIDQ4Ny4yN0UwLCA1MTkuNTRFMCwgNTIzLjAzRTAsCisgICAgNjEyLjk5RTAsIDYzOC41OUUwLCA2NDEuMzZFMCwgNjIyLjA1RTAsIDYzMS41MEUwLCA2NjMuOTdFMCwgNjQ2LjlFMCwgIDc0OC4yOUUwLCA3NDkuMjFFMCwgNzUwLjE0RTAsIDY0Ny4wNEUwLAorICAgIDY0Ni44OUUwLCA3NDYuOUUwLCAgNzQ4LjQzRTAsIDc0Ny4zNUUwLCA3NDkuMjdFMCwgNjQ3LjYxRTAsIDc0Ny43OEUwLCA3NTAuNTFFMCwgODUxLjM3RTAsIDg0NS45N0UwLCA4NDcuNTRFMCwKKyAgICA4NDkuOTNFMCwgODUxLjYxRTAsIDg0OS43NUUwLCA4NTAuOThFMCwgODQ4LjIzRTB9OwogCiAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9oYWhuMS5zaHRtbAotdm9pZCB0ZXN0TmlzdEhhaG4xKHZvaWQpCi17Ci0gIGNvbnN0IGludCAgbj03Owordm9pZCB0ZXN0TmlzdEhhaG4xKHZvaWQpIHsKKyAgY29uc3QgaW50IG4gPSA3OwogICBpbnQgaW5mbzsKIAogICBWZWN0b3JYZCB4KG4pOwpAQCAtNDY2LDcgKzQ4OCw3IEBACiAgIC8qCiAgICAqIEZpcnN0IHRyeQogICAgKi8KLSAgeDw8IDEwLiwgLTEuLCAuMDUsIC0uMDAwMDEsIC0uMDUsIC4wMDEsIC0uMDAwMDAxOworICB4IDw8IDEwLiwgLTEuLCAuMDUsIC0uMDAwMDEsIC0uMDUsIC4wMDEsIC0uMDAwMDAxOwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgaGFobjFfZnVuY3RvciBmdW5jdG9yOwogICBMZXZlbmJlcmdNYXJxdWFyZHQ8aGFobjFfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CkBAIC00ODEsNzIgKzUwMyw2OSBAQAogICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMoKS5zcXVhcmVkTm9ybSgpLCAxLjUzMjQzODI4NTRFKzAwKTsKICAgLy8gY2hlY2sgeAogICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDEuMDc3NjM1MTczM0UrMDApOwotICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sLTEuMjI2OTI5NjkyMUUtMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIC0xLjIyNjkyOTY5MjFFLTAxKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCA0LjA4NjM3NTA2MTBFLTAzKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLC0xLjQyNjI2NGUtMDYpOyAvLyBzaG91bGRlIGJlIDogLTEuNDI2MjY2MjUxNEUtMDYKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLC01Ljc2MDk5NDA5MDFFLTAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAtMS40MjYyNjRlLTA2KTsgIC8vIHNob3VsZGUgYmUgOiAtMS40MjYyNjYyNTE0RS0wNgorICBWRVJJRllfSVNfQVBQUk9YKHhbNF0sIC01Ljc2MDk5NDA5MDFFLTAzKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzVdLCAyLjQwNTM3MzU1MDNFLTA0KTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzZdLC0xLjIzMTQ0NTAxOTlFLTA3KTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzZdLCAtMS4yMzE0NDUwMTk5RS0wNyk7CiAKICAgLyoKICAgICogU2Vjb25kIHRyeQogICAgKi8KLSAgeDw8IC4xLCAtLjEsIC4wMDUsIC0uMDAwMDAxLCAtLjAwNSwgLjAwMDEsIC0uMDAwMDAwMTsKKyAgeCA8PCAuMSwgLS4xLCAuMDA1LCAtLjAwMDAwMSwgLS4wMDUsIC4wMDAxLCAtLjAwMDAwMDE7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbmZvKQogCiAgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQogICAvLyBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7Ci0vLyAgIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDExKTsKKyAgLy8gICBWRVJJRllfSVNfRVFVQUwobG0ubmZldigpLCAxMSk7CiAgIC8vIFZFUklGWV9JU19FUVVBTChsbS5uamV2KCksIDEwKTsKICAgLy8gY2hlY2sgbm9ybV4yCiAgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDEuNTMyNDM4Mjg1NEUrMDApOwogICAvLyBjaGVjayB4Ci0gIFZFUklGWV9JU19BUFBST1goeFswXSwgMS4wNzc2NDApOyAvLyBzaG91bGQgYmUgOiAgMS4wNzc2MzUxNzMzRSswMAotICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIC0wLjEyMjY5MzMpOyAvLyBzaG91bGQgYmUgOiAtMS4yMjY5Mjk2OTIxRS0wMQotICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDAuMDA0MDg2MzgzKTsgLy8gc2hvdWxkIGJlIDogNC4wODYzNzUwNjEwRS0wMwotICBWRVJJRllfSVNfQVBQUk9YKHhbM10sIC0xLjQyNjI3N2UtMDYpOyAvLyBzaG91bGRlIGJlIDogLTEuNDI2MjY2MjUxNEUtMDYKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzRdLC01Ljc2MDk5NDA5MDFFLTAzKTsKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzVdLCAwLjAwMDI0MDUzNzcyKTsgLy8gc2hvdWxkIGJlIDogMi40MDUzNzM1NTAzRS0wNAotICBWRVJJRllfSVNfQVBQUk9YKHhbNl0sIC0xLjIzMTQ1MGUtMDcpOyAvLyBzaG91bGQgYmUgOiAtMS4yMzE0NDUwMTk5RS0wNwotCisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMS4wNzc2NDApOyAgICAgICAvLyBzaG91bGQgYmUgOiAgMS4wNzc2MzUxNzMzRSswMAorICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIC0wLjEyMjY5MzMpOyAgICAgLy8gc2hvdWxkIGJlIDogLTEuMjI2OTI5NjkyMUUtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAwLjAwNDA4NjM4Myk7ICAgIC8vIHNob3VsZCBiZSA6IDQuMDg2Mzc1MDYxMEUtMDMKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAtMS40MjYyNzdlLTA2KTsgIC8vIHNob3VsZGUgYmUgOiAtMS40MjYyNjYyNTE0RS0wNgorICBWRVJJRllfSVNfQVBQUk9YKHhbNF0sIC01Ljc2MDk5NDA5MDFFLTAzKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzVdLCAwLjAwMDI0MDUzNzcyKTsgIC8vIHNob3VsZCBiZSA6IDIuNDA1MzczNTUwM0UtMDQKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzZdLCAtMS4yMzE0NTBlLTA3KTsgIC8vIHNob3VsZCBiZSA6IC0xLjIzMTQ0NTAxOTlFLTA3CiB9CiAKLXN0cnVjdCBtaXNyYTFkX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPgotewotICAgIG1pc3JhMWRfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDIsMTQpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE0XTsKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTRdOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Mik7Ci0gICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTQpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwxNDsgaSsrKSB7Ci0gICAgICAgICAgICBmdmVjW2ldID0gYlswXSpiWzFdKnhbaV0vKDEuK2JbMV0qeFtpXSkgLSB5W2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworc3RydWN0IG1pc3JhMWRfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+IHsKKyAgbWlzcmExZF9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMiwgMTQpIHt9CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeFsxNF07CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNF07CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykgeworICAgIGFzc2VydChiLnNpemUoKSA9PSAyKTsKKyAgICBhc3NlcnQoZnZlYy5zaXplKCkgPT0gMTQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTQ7IGkrKykgeworICAgICAgZnZlY1tpXSA9IGJbMF0gKiBiWzFdICogeFtpXSAvICgxLiArIGJbMV0gKiB4W2ldKSAtIHlbaV07CiAgICAgfQotICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTIpOwotICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTE0KTsKLSAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0yKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8MTQ7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIGRlbiA9IDEuK2JbMV0qeFtpXTsKLSAgICAgICAgICAgIGZqYWMoaSwwKSA9IGJbMV0qeFtpXSAvIGRlbjsKLSAgICAgICAgICAgIGZqYWMoaSwxKSA9IGJbMF0qeFtpXSooZGVuLWJbMV0qeFtpXSkvZGVuL2RlbjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDIpOworICAgIGFzc2VydChmamFjLnJvd3MoKSA9PSAxNCk7CisgICAgYXNzZXJ0KGZqYWMuY29scygpID09IDIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTQ7IGkrKykgeworICAgICAgZG91YmxlIGRlbiA9IDEuICsgYlsxXSAqIHhbaV07CisgICAgICBmamFjKGksIDApID0gYlsxXSAqIHhbaV0gLyBkZW47CisgICAgICBmamFjKGksIDEpID0gYlswXSAqIHhbaV0gKiAoZGVuIC0gYlsxXSAqIHhbaV0pIC8gZGVuIC8gZGVuOwogICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKLWNvbnN0IGRvdWJsZSBtaXNyYTFkX2Z1bmN0b3I6OnhbMTRdID0geyA3Ny42RTAsIDExNC45RTAsIDE0MS4xRTAsIDE5MC44RTAsIDIzOS45RTAsIDI4OS4wRTAsIDMzMi44RTAsIDM3OC40RTAsIDQzNC44RTAsIDQ3Ny4zRTAsIDUzNi44RTAsIDU5My4xRTAsIDY4OS4xRTAsIDc2MC4wRTB9OwotY29uc3QgZG91YmxlIG1pc3JhMWRfZnVuY3Rvcjo6eVsxNF0gPSB7IDEwLjA3RTAsIDE0LjczRTAsIDE3Ljk0RTAsIDIzLjkzRTAsIDI5LjYxRTAsIDM1LjE4RTAsIDQwLjAyRTAsIDQ0LjgyRTAsIDUwLjc2RTAsIDU1LjA1RTAsIDYxLjAxRTAsIDY2LjQwRTAsIDc1LjQ3RTAsIDgxLjc4RTB9OworY29uc3QgZG91YmxlIG1pc3JhMWRfZnVuY3Rvcjo6eFsxNF0gPSB7NzcuNkUwLCAgMTE0LjlFMCwgMTQxLjFFMCwgMTkwLjhFMCwgMjM5LjlFMCwgMjg5LjBFMCwgMzMyLjhFMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3OC40RTAsIDQzNC44RTAsIDQ3Ny4zRTAsIDUzNi44RTAsIDU5My4xRTAsIDY4OS4xRTAsIDc2MC4wRTB9OworY29uc3QgZG91YmxlIG1pc3JhMWRfZnVuY3Rvcjo6eVsxNF0gPSB7MTAuMDdFMCwgMTQuNzNFMCwgMTcuOTRFMCwgMjMuOTNFMCwgMjkuNjFFMCwgMzUuMThFMCwgNDAuMDJFMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LjgyRTAsIDUwLjc2RTAsIDU1LjA1RTAsIDYxLjAxRTAsIDY2LjQwRTAsIDc1LjQ3RTAsIDgxLjc4RTB9OwogCiAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9taXNyYTFkLnNodG1sCi12b2lkIHRlc3ROaXN0TWlzcmExZCh2b2lkKQotewotICBjb25zdCBpbnQgbj0yOwordm9pZCB0ZXN0TmlzdE1pc3JhMWQodm9pZCkgeworICBjb25zdCBpbnQgbiA9IDI7CiAgIGludCBpbmZvOwogCiAgIFZlY3RvclhkIHgobik7CkBAIC01NTQsNyArNTczLDcgQEAKICAgLyoKICAgICogRmlyc3QgdHJ5CiAgICAqLwotICB4PDwgNTAwLiwgMC4wMDAxOworICB4IDw8IDUwMC4sIDAuMDAwMTsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIG1pc3JhMWRfZnVuY3RvciBmdW5jdG9yOwogICBMZXZlbmJlcmdNYXJxdWFyZHQ8bWlzcmExZF9mdW5jdG9yPiBsbShmdW5jdG9yKTsKQEAgLTU3NCw3ICs1OTMsNyBAQAogICAvKgogICAgKiBTZWNvbmQgdHJ5CiAgICAqLwotICB4PDwgNDUwLiwgMC4wMDAzOworICB4IDw8IDQ1MC4sIDAuMDAwMzsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGluZm8pCkBAIC01OTAsNDMgKzYwOSw0OCBAQAogICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDMuMDIyNzMyNDQ0OUUtMDQpOwogfQogCi0KLXN0cnVjdCBsYW5jem9zMV9mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4KLXsKLSAgICBsYW5jem9zMV9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oNiwyNCkge30KLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMjRdOwotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsyNF07Ci0gICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT02KTsKLSAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0yNCk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDI0OyBpKyspCi0gICAgICAgICAgICBmdmVjW2ldID0gYlswXSpleHAoLWJbMV0qeFtpXSkgKyBiWzJdKmV4cCgtYlszXSp4W2ldKSArIGJbNF0qZXhwKC1iWzVdKnhbaV0pICAtIHlbaV07Ci0gICAgICAgIHJldHVybiAwOworc3RydWN0IGxhbmN6b3MxX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPiB7CisgIGxhbmN6b3MxX2Z1bmN0b3Iodm9pZCkgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPig2LCAyNCkge30KKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzI0XTsKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzI0XTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDYpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSAyNCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKQorICAgICAgZnZlY1tpXSA9IGJbMF0gKiBleHAoLWJbMV0gKiB4W2ldKSArIGJbMl0gKiBleHAoLWJbM10gKiB4W2ldKSArIGJbNF0gKiBleHAoLWJbNV0gKiB4W2ldKSAtIHlbaV07CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykgeworICAgIGFzc2VydChiLnNpemUoKSA9PSA2KTsKKyAgICBhc3NlcnQoZmphYy5yb3dzKCkgPT0gMjQpOworICAgIGFzc2VydChmamFjLmNvbHMoKSA9PSA2KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIHsKKyAgICAgIGZqYWMoaSwgMCkgPSBleHAoLWJbMV0gKiB4W2ldKTsKKyAgICAgIGZqYWMoaSwgMSkgPSAtYlswXSAqIHhbaV0gKiBleHAoLWJbMV0gKiB4W2ldKTsKKyAgICAgIGZqYWMoaSwgMikgPSBleHAoLWJbM10gKiB4W2ldKTsKKyAgICAgIGZqYWMoaSwgMykgPSAtYlsyXSAqIHhbaV0gKiBleHAoLWJbM10gKiB4W2ldKTsKKyAgICAgIGZqYWMoaSwgNCkgPSBleHAoLWJbNV0gKiB4W2ldKTsKKyAgICAgIGZqYWMoaSwgNSkgPSAtYls0XSAqIHhbaV0gKiBleHAoLWJbNV0gKiB4W2ldKTsKICAgICB9Ci0gICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Nik7Ci0gICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MjQpOwotICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTYpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwyNDsgaSsrKSB7Ci0gICAgICAgICAgICBmamFjKGksMCkgPSBleHAoLWJbMV0qeFtpXSk7Ci0gICAgICAgICAgICBmamFjKGksMSkgPSAtYlswXSp4W2ldKmV4cCgtYlsxXSp4W2ldKTsKLSAgICAgICAgICAgIGZqYWMoaSwyKSA9IGV4cCgtYlszXSp4W2ldKTsKLSAgICAgICAgICAgIGZqYWMoaSwzKSA9IC1iWzJdKnhbaV0qZXhwKC1iWzNdKnhbaV0pOwotICAgICAgICAgICAgZmphYyhpLDQpID0gZXhwKC1iWzVdKnhbaV0pOwotICAgICAgICAgICAgZmphYyhpLDUpID0gLWJbNF0qeFtpXSpleHAoLWJbNV0qeFtpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiAwOworICB9CiB9OwotY29uc3QgZG91YmxlIGxhbmN6b3MxX2Z1bmN0b3I6OnhbMjRdID0geyAwLjAwMDAwMDAwMDAwMEUrMDAsIDUuMDAwMDAwMDAwMDAwRS0wMiwgMS4wMDAwMDAwMDAwMDBFLTAxLCAxLjUwMDAwMDAwMDAwMEUtMDEsIDIuMDAwMDAwMDAwMDAwRS0wMSwgMi41MDAwMDAwMDAwMDBFLTAxLCAzLjAwMDAwMDAwMDAwMEUtMDEsIDMuNTAwMDAwMDAwMDAwRS0wMSwgNC4wMDAwMDAwMDAwMDBFLTAxLCA0LjUwMDAwMDAwMDAwMEUtMDEsIDUuMDAwMDAwMDAwMDAwRS0wMSwgNS41MDAwMDAwMDAwMDBFLTAxLCA2LjAwMDAwMDAwMDAwMEUtMDEsIDYuNTAwMDAwMDAwMDAwRS0wMSwgNy4wMDAwMDAwMDAwMDBFLTAxLCA3LjUwMDAwMDAwMDAwMEUtMDEsIDguMDAwMDAwMDAwMDAwRS0wMSwgOC41MDAwMDAwMDAwMDBFLTAxLCA5LjAwMDAwMDAwMDAwMEUtMDEsIDkuNTAwMDAwMDAwMDAwRS0wMSwgMS4wMDAwMDAwMDAwMDBFKzAwLCAxLjA1MDAwMDAwMDAwMEUrMDAsIDEuMTAwMDAwMDAwMDAwRSswMCwgMS4xNTAwMDAwMDAwMDBFKzAwIH07Ci1jb25zdCBkb3VibGUgbGFuY3pvczFfZnVuY3Rvcjo6eVsyNF0gPSB7IDIuNTEzNDAwMDAwMDAwRSswMCAsMi4wNDQzMzMzNzMyOTFFKzAwICwxLjY2ODQwNDQzNjU2NEUrMDAgLDEuMzY2NDE4MDIxMjA4RSswMCAsMS4xMjMyMzI0ODczNzJFKzAwICw5LjI2ODg5NzE4MDAzN0UtMDEgLDcuNjc5MzM4NTYzNzI4RS0wMSAsNi4zODg3NzU1MjMxMDZFLTAxICw1LjMzNzgzNTMxNzQwMkUtMDEgLDQuNDc5MzYzNjE3MzQ3RS0wMSAsMy43NzU4NDc4ODQzNTBFLTAxICwzLjE5NzM5MzE5OTMyNkUtMDEgLDIuNzIwMTMwNzczNzQ2RS0wMSAsMi4zMjQ5NjU1MjkwMzJFLTAxICwxLjk5NjU4OTU0NjA2NUUtMDEgLDEuNzIyNzA0MTI2OTE0RS0wMSAsMS40OTM0MDU2NjAxNjhFLTAxICwxLjMwMDcwMDIwNjkyMkUtMDEgLDEuMTM4MTE5MzI0NjQ0RS0wMSAsMS4wMDA0MTU1ODc1NTlFLTAxICw4LjgzMzIwOTA4NDU0MEUtMDIgLDcuODMzNTQ0MDE5MzUwRS0wMiAsNi45NzY2OTM3NDM0NDlFLTAyICw2LjIzOTMxMjUzNjcxOUUtMDIgfTsKK2NvbnN0IGRvdWJsZSBsYW5jem9zMV9mdW5jdG9yOjp4WzI0XSA9IHswLjAwMDAwMDAwMDAwMEUrMDAsIDUuMDAwMDAwMDAwMDAwRS0wMiwgMS4wMDAwMDAwMDAwMDBFLTAxLCAxLjUwMDAwMDAwMDAwMEUtMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wMDAwMDAwMDAwMDBFLTAxLCAyLjUwMDAwMDAwMDAwMEUtMDEsIDMuMDAwMDAwMDAwMDAwRS0wMSwgMy41MDAwMDAwMDAwMDBFLTAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDAwMDAwMDAwMDAwRS0wMSwgNC41MDAwMDAwMDAwMDBFLTAxLCA1LjAwMDAwMDAwMDAwMEUtMDEsIDUuNTAwMDAwMDAwMDAwRS0wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LjAwMDAwMDAwMDAwMEUtMDEsIDYuNTAwMDAwMDAwMDAwRS0wMSwgNy4wMDAwMDAwMDAwMDBFLTAxLCA3LjUwMDAwMDAwMDAwMEUtMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC4wMDAwMDAwMDAwMDBFLTAxLCA4LjUwMDAwMDAwMDAwMEUtMDEsIDkuMDAwMDAwMDAwMDAwRS0wMSwgOS41MDAwMDAwMDAwMDBFLTAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDAwMDAwMDAwMDAwRSswMCwgMS4wNTAwMDAwMDAwMDBFKzAwLCAxLjEwMDAwMDAwMDAwMEUrMDAsIDEuMTUwMDAwMDAwMDAwRSswMH07Citjb25zdCBkb3VibGUgbGFuY3pvczFfZnVuY3Rvcjo6eVsyNF0gPSB7Mi41MTM0MDAwMDAwMDBFKzAwLCAyLjA0NDMzMzM3MzI5MUUrMDAsIDEuNjY4NDA0NDM2NTY0RSswMCwgMS4zNjY0MTgwMjEyMDhFKzAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTIzMjMyNDg3MzcyRSswMCwgOS4yNjg4OTcxODAwMzdFLTAxLCA3LjY3OTMzODU2MzcyOEUtMDEsIDYuMzg4Nzc1NTIzMTA2RS0wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjMzNzgzNTMxNzQwMkUtMDEsIDQuNDc5MzYzNjE3MzQ3RS0wMSwgMy43NzU4NDc4ODQzNTBFLTAxLCAzLjE5NzM5MzE5OTMyNkUtMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi43MjAxMzA3NzM3NDZFLTAxLCAyLjMyNDk2NTUyOTAzMkUtMDEsIDEuOTk2NTg5NTQ2MDY1RS0wMSwgMS43MjI3MDQxMjY5MTRFLTAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDkzNDA1NjYwMTY4RS0wMSwgMS4zMDA3MDAyMDY5MjJFLTAxLCAxLjEzODExOTMyNDY0NEUtMDEsIDEuMDAwNDE1NTg3NTU5RS0wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LjgzMzIwOTA4NDU0MEUtMDIsIDcuODMzNTQ0MDE5MzUwRS0wMiwgNi45NzY2OTM3NDM0NDlFLTAyLCA2LjIzOTMxMjUzNjcxOUUtMDJ9OwogCiAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9sYW5jem9zMS5zaHRtbAotdm9pZCB0ZXN0TmlzdExhbmN6b3MxKHZvaWQpCi17Ci0gIGNvbnN0IGludCBuPTY7Cit2b2lkIHRlc3ROaXN0TGFuY3pvczEodm9pZCkgeworICBjb25zdCBpbnQgbiA9IDY7CiAgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgaW5mbzsKIAogICBWZWN0b3JYZCB4KG4pOwpAQCAtNjM0LDcgKzY1OCw3IEBACiAgIC8qCiAgICAqIEZpcnN0IHRyeQogICAgKi8KLSAgeDw8IDEuMiwgMC4zLCA1LjYsIDUuNSwgNi41LCA3LjY7CisgIHggPDwgMS4yLCAwLjMsIDUuNiwgNS41LCA2LjUsIDcuNjsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGxhbmN6b3MxX2Z1bmN0b3IgZnVuY3RvcjsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PGxhbmN6b3MxX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOwpAQCAtNjU4LDcgKzY4Miw3IEBACiAgIC8qCiAgICAqIFNlY29uZCB0cnkKICAgICovCi0gIHg8PCAwLjUsIDAuNywgMy42LCA0LjIsIDQuLCA2LjM7CisgIHggPDwgMC41LCAwLjcsIDMuNiwgNC4yLCA0LiwgNi4zOwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgaW5mbyA9IGxtLm1pbmltaXplKHgpOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaW5mbykKQEAgLTY3Niw0NSArNzAwLDQyIEBACiAgIFZFUklGWV9JU19BUFBST1goeFszXSwgMy4wMDAwMDAwMDAyRSswMCk7CiAgIFZFUklGWV9JU19BUFBST1goeFs0XSwgMS41NTc1OTk5OTk4RSswMCk7CiAgIFZFUklGWV9JU19BUFBST1goeFs1XSwgNS4wMDAwMDAwMDAxRSswMCk7Ci0KIH0KIAotc3RydWN0IHJhdDQyX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPgotewotICAgIHJhdDQyX2Z1bmN0b3Iodm9pZCkgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPigzLDkpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzldOwotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVs5XTsKLSAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOwotICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTkpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTw5OyBpKyspIHsKLSAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdIC8gKDEuK2V4cChiWzFdLWJbMl0qeFtpXSkpIC0geVtpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKK3N0cnVjdCByYXQ0Ml9mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4geworICByYXQ0Ml9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMywgOSkge30KKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzldOworICBzdGF0aWMgY29uc3QgZG91YmxlIHlbOV07CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykgeworICAgIGFzc2VydChiLnNpemUoKSA9PSAzKTsKKyAgICBhc3NlcnQoZnZlYy5zaXplKCkgPT0gOSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA5OyBpKyspIHsKKyAgICAgIGZ2ZWNbaV0gPSBiWzBdIC8gKDEuICsgZXhwKGJbMV0gLSBiWzJdICogeFtpXSkpIC0geVtpXTsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIAotICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOwotICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTkpOwotICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTMpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTw5OyBpKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSBlID0gZXhwKGJbMV0tYlsyXSp4W2ldKTsKLSAgICAgICAgICAgIGZqYWMoaSwwKSA9IDEuLygxLitlKTsKLSAgICAgICAgICAgIGZqYWMoaSwxKSA9IC1iWzBdKmUvKDEuK2UpLygxLitlKTsKLSAgICAgICAgICAgIGZqYWMoaSwyKSA9ICtiWzBdKmUqeFtpXS8oMS4rZSkvKDEuK2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDMpOworICAgIGFzc2VydChmamFjLnJvd3MoKSA9PSA5KTsKKyAgICBhc3NlcnQoZmphYy5jb2xzKCkgPT0gMyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA5OyBpKyspIHsKKyAgICAgIGRvdWJsZSBlID0gZXhwKGJbMV0gLSBiWzJdICogeFtpXSk7CisgICAgICBmamFjKGksIDApID0gMS4gLyAoMS4gKyBlKTsKKyAgICAgIGZqYWMoaSwgMSkgPSAtYlswXSAqIGUgLyAoMS4gKyBlKSAvICgxLiArIGUpOworICAgICAgZmphYyhpLCAyKSA9ICtiWzBdICogZSAqIHhbaV0gLyAoMS4gKyBlKSAvICgxLiArIGUpOwogICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKLWNvbnN0IGRvdWJsZSByYXQ0Ml9mdW5jdG9yOjp4WzldID0geyA5LjAwMEUwLCAxNC4wMDBFMCwgMjEuMDAwRTAsIDI4LjAwMEUwLCA0Mi4wMDBFMCwgNTcuMDAwRTAsIDYzLjAwMEUwLCA3MC4wMDBFMCwgNzkuMDAwRTAgfTsKLWNvbnN0IGRvdWJsZSByYXQ0Ml9mdW5jdG9yOjp5WzldID0geyA4LjkzMEUwICwxMC44MDBFMCAsMTguNTkwRTAgLDIyLjMzMEUwICwzOS4zNTBFMCAsNTYuMTEwRTAgLDYxLjczMEUwICw2NC42MjBFMCAsNjcuMDgwRTAgfTsKK2NvbnN0IGRvdWJsZSByYXQ0Ml9mdW5jdG9yOjp4WzldID0gezkuMDAwRTAsICAxNC4wMDBFMCwgMjEuMDAwRTAsIDI4LjAwMEUwLCA0Mi4wMDBFMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3LjAwMEUwLCA2My4wMDBFMCwgNzAuMDAwRTAsIDc5LjAwMEUwfTsKK2NvbnN0IGRvdWJsZSByYXQ0Ml9mdW5jdG9yOjp5WzldID0gezguOTMwRTAsICAxMC44MDBFMCwgMTguNTkwRTAsIDIyLjMzMEUwLCAzOS4zNTBFMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2LjExMEUwLCA2MS43MzBFMCwgNjQuNjIwRTAsIDY3LjA4MEUwfTsKIAogLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvcmF0a293c2t5Mi5zaHRtbAotdm9pZCB0ZXN0TmlzdFJhdDQyKHZvaWQpCi17Ci0gIGNvbnN0IGludCBuPTM7Cit2b2lkIHRlc3ROaXN0UmF0NDIodm9pZCkgeworICBjb25zdCBpbnQgbiA9IDM7CiAgIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpTdGF0dXMgaW5mbzsKIAogICBWZWN0b3JYZCB4KG4pOwpAQCAtNzIyLDcgKzc0Myw3IEBACiAgIC8qCiAgICAqIEZpcnN0IHRyeQogICAgKi8KLSAgeDw8IDEwMC4sIDEuLCAwLjE7CisgIHggPDwgMTAwLiwgMS4sIDAuMTsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIHJhdDQyX2Z1bmN0b3IgZnVuY3RvcjsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PHJhdDQyX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOwpAQCAtNzQzLDcgKzc2NCw3IEBACiAgIC8qCiAgICAqIFNlY29uZCB0cnkKICAgICovCi0gIHg8PCA3NS4sIDIuNSwgMC4wNzsKKyAgeCA8PCA3NS4sIDIuNSwgMC4wNzsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGluZm8pCkBAIC03NjAsNDEgKzc4MSw0MCBAQAogICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDYuNzM1OTIwMDA2NkUtMDIpOwogfQogCi1zdHJ1Y3QgTUdIMTBfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+Ci17Ci0gICAgTUdIMTBfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDMsMTYpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE2XTsKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTZdOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7Ci0gICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MTYpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwxNjsgaSsrKQotICAgICAgICAgICAgZnZlY1tpXSA9ICBiWzBdICogZXhwKGJbMV0vKHhbaV0rYlsyXSkpIC0geVtpXTsKLSAgICAgICAgcmV0dXJuIDA7CitzdHJ1Y3QgTUdIMTBfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+IHsKKyAgTUdIMTBfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDMsIDE2KSB7fQorICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMTZdOworICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTZdOworICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gMyk7CisgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpID09IDE2KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIGZ2ZWNbaV0gPSBiWzBdICogZXhwKGJbMV0gLyAoeFtpXSArIGJbMl0pKSAtIHlbaV07CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykgeworICAgIGFzc2VydChiLnNpemUoKSA9PSAzKTsKKyAgICBhc3NlcnQoZmphYy5yb3dzKCkgPT0gMTYpOworICAgIGFzc2VydChmamFjLmNvbHMoKSA9PSAzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgIGRvdWJsZSBmYWN0b3IgPSAxLiAvICh4W2ldICsgYlsyXSk7CisgICAgICBkb3VibGUgZSA9IGV4cChiWzFdICogZmFjdG9yKTsKKyAgICAgIGZqYWMoaSwgMCkgPSBlOworICAgICAgZmphYyhpLCAxKSA9IGJbMF0gKiBmYWN0b3IgKiBlOworICAgICAgZmphYyhpLCAyKSA9IC1iWzFdICogYlswXSAqIGZhY3RvciAqIGZhY3RvciAqIGU7CiAgICAgfQotICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOwotICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTE2KTsKLSAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0zKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8MTY7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIGZhY3RvciA9IDEuLyh4W2ldK2JbMl0pOwotICAgICAgICAgICAgZG91YmxlIGUgPSBleHAoYlsxXSpmYWN0b3IpOwotICAgICAgICAgICAgZmphYyhpLDApID0gZTsKLSAgICAgICAgICAgIGZqYWMoaSwxKSA9IGJbMF0qZmFjdG9yKmU7Ci0gICAgICAgICAgICBmamFjKGksMikgPSAtYlsxXSpiWzBdKmZhY3RvcipmYWN0b3IqZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIH07Ci1jb25zdCBkb3VibGUgTUdIMTBfZnVuY3Rvcjo6eFsxNl0gPSB7IDUuMDAwMDAwRSswMSwgNS41MDAwMDBFKzAxLCA2LjAwMDAwMEUrMDEsIDYuNTAwMDAwRSswMSwgNy4wMDAwMDBFKzAxLCA3LjUwMDAwMEUrMDEsIDguMDAwMDAwRSswMSwgOC41MDAwMDBFKzAxLCA5LjAwMDAwMEUrMDEsIDkuNTAwMDAwRSswMSwgMS4wMDAwMDBFKzAyLCAxLjA1MDAwMEUrMDIsIDEuMTAwMDAwRSswMiwgMS4xNTAwMDBFKzAyLCAxLjIwMDAwMEUrMDIsIDEuMjUwMDAwRSswMiB9OwotY29uc3QgZG91YmxlIE1HSDEwX2Z1bmN0b3I6OnlbMTZdID0geyAzLjQ3ODAwMEUrMDQsIDIuODYxMDAwRSswNCwgMi4zNjUwMDBFKzA0LCAxLjk2MzAwMEUrMDQsIDEuNjM3MDAwRSswNCwgMS4zNzIwMDBFKzA0LCAxLjE1NDAwMEUrMDQsIDkuNzQ0MDAwRSswMywgOC4yNjEwMDBFKzAzLCA3LjAzMDAwMEUrMDMsIDYuMDA1MDAwRSswMywgNS4xNDcwMDBFKzAzLCA0LjQyNzAwMEUrMDMsIDMuODIwMDAwRSswMywgMy4zMDcwMDBFKzAzLCAyLjg3MjAwMEUrMDMgfTsKK2NvbnN0IGRvdWJsZSBNR0gxMF9mdW5jdG9yOjp4WzE2XSA9IHs1LjAwMDAwMEUrMDEsIDUuNTAwMDAwRSswMSwgNi4wMDAwMDBFKzAxLCA2LjUwMDAwMEUrMDEsIDcuMDAwMDAwRSswMSwgNy41MDAwMDBFKzAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDguMDAwMDAwRSswMSwgOC41MDAwMDBFKzAxLCA5LjAwMDAwMEUrMDEsIDkuNTAwMDAwRSswMSwgMS4wMDAwMDBFKzAyLCAxLjA1MDAwMEUrMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDAwMDBFKzAyLCAxLjE1MDAwMEUrMDIsIDEuMjAwMDAwRSswMiwgMS4yNTAwMDBFKzAyfTsKK2NvbnN0IGRvdWJsZSBNR0gxMF9mdW5jdG9yOjp5WzE2XSA9IHszLjQ3ODAwMEUrMDQsIDIuODYxMDAwRSswNCwgMi4zNjUwMDBFKzA0LCAxLjk2MzAwMEUrMDQsIDEuNjM3MDAwRSswNCwgMS4zNzIwMDBFKzA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTU0MDAwRSswNCwgOS43NDQwMDBFKzAzLCA4LjI2MTAwMEUrMDMsIDcuMDMwMDAwRSswMywgNi4wMDUwMDBFKzAzLCA1LjE0NzAwMEUrMDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC40MjcwMDBFKzAzLCAzLjgyMDAwMEUrMDMsIDMuMzA3MDAwRSswMywgMi44NzIwMDBFKzAzfTsKIAogLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvbWdoMTAuc2h0bWwKLXZvaWQgdGVzdE5pc3RNR0gxMCh2b2lkKQotewotICBjb25zdCBpbnQgbj0zOwordm9pZCB0ZXN0TmlzdE1HSDEwKHZvaWQpIHsKKyAgY29uc3QgaW50IG4gPSAzOwogICBMZXZlbmJlcmdNYXJxdWFyZHRTcGFjZTo6U3RhdHVzIGluZm87CiAKICAgVmVjdG9yWGQgeChuKTsKQEAgLTgxOSw5ICs4MzksOSBAQAogICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIDUuNjA5NjM2NDcxMEUtMDMpOwogICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDYuMTgxMzQ2MzQ2M0UrMDMpOwogICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDMuNDUyMjM2MzQ2MkUrMDIpOwotICAKKwogICAvLyBjaGVjayByZXR1cm4gdmFsdWUKLSAgCisKICAgLy8gKytnX3Rlc3RfbGV2ZWw7CiAgIC8vIFZFUklGWV9JU19FUVVBTChsbS5uZmV2KCksIDI4NCApOwogICAvLyBWRVJJRllfSVNfRVFVQUwobG0ubmpldigpLCAyNDkgKTsKQEAgLTgzMiw3ICs4NTIsNyBAQAogICAvKgogICAgKiBTZWNvbmQgdHJ5CiAgICAqLwotICB4PDwgMC4wMiwgNDAwMC4sIDI1MC47CisgIHggPDwgMC4wMiwgNDAwMC4sIDI1MC47CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbmZvKQpAQCAtODQwLDE0ICs4NjAsMTQgQEAKICAgLy8gVkVSSUZZX0lTX0VRVUFMKGluZm8sIExldmVuYmVyZ01hcnF1YXJkdFNwYWNlOjpSZWxhdGl2ZVJlZHVjdGlvblRvb1NtYWxsKTsKICAgLy8gLy8gd2FzOiBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CiAgIC8vIC0tZ190ZXN0X2xldmVsOwotICAKKwogICAvLyBjaGVjayBub3JtXjIKICAgVkVSSUZZX0lTX0FQUFJPWChsbS5mdmVjKCkuc3F1YXJlZE5vcm0oKSwgOC43OTQ1ODU1MTcxRSswMSk7CiAgIC8vIGNoZWNrIHgKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCA1LjYwOTYzNjQ3MTBFLTAzKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA2LjE4MTM0NjM0NjNFKzAzKTsKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAzLjQ1MjIzNjM0NjJFKzAyKTsKLSAgCisKICAgLy8gY2hlY2sgcmV0dXJuIHZhbHVlCiAgIC8vICsrZ190ZXN0X2xldmVsOwogICAvLyBWRVJJRllfSVNfRVFVQUwobG0ubmZldigpLCAxMjYpOwpAQCAtODU3LDM5ICs4NzcsMzMgQEAKICAgVkVSSUZZKGxtLm5qZXYoKSA8IDExNiAqIExNX0VWQUxfQ09VTlRfVE9MKTsKIH0KIAotCi1zdHJ1Y3QgQm94Qk9EX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPgotewotICAgIEJveEJPRF9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMiw2KSB7fQotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeFs2XTsKLSAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbNl0gPSB7IDEwOS4sIDE0OS4sIDE0OS4sIDE5MS4sIDIxMy4sIDIyNC4gfTsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0yKTsKLSAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT02KTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8NjsgaSsrKQotICAgICAgICAgICAgZnZlY1tpXSA9ICBiWzBdKigxLi1leHAoLWJbMV0qeFtpXSkpIC0geVtpXTsKLSAgICAgICAgcmV0dXJuIDA7CitzdHJ1Y3QgQm94Qk9EX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPiB7CisgIEJveEJPRF9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMiwgNikge30KKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzZdOworICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpIHsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbNl0gPSB7MTA5LiwgMTQ5LiwgMTQ5LiwgMTkxLiwgMjEzLiwgMjI0Ln07CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDIpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSA2KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgZnZlY1tpXSA9IGJbMF0gKiAoMS4gLSBleHAoLWJbMV0gKiB4W2ldKSkgLSB5W2ldOworICAgIHJldHVybiAwOworICB9CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gMik7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDYpOworICAgIGFzc2VydChmamFjLmNvbHMoKSA9PSAyKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgZG91YmxlIGUgPSBleHAoLWJbMV0gKiB4W2ldKTsKKyAgICAgIGZqYWMoaSwgMCkgPSAxLiAtIGU7CisgICAgICBmamFjKGksIDEpID0gYlswXSAqIHhbaV0gKiBlOwogICAgIH0KLSAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0yKTsKLSAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT02KTsKLSAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0yKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8NjsgaSsrKSB7Ci0gICAgICAgICAgICBkb3VibGUgZSA9IGV4cCgtYlsxXSp4W2ldKTsKLSAgICAgICAgICAgIGZqYWMoaSwwKSA9IDEuLWU7Ci0gICAgICAgICAgICBmamFjKGksMSkgPSBiWzBdKnhbaV0qZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIH07Ci1jb25zdCBkb3VibGUgQm94Qk9EX2Z1bmN0b3I6OnhbNl0gPSB7IDEuLCAyLiwgMy4sIDUuLCA3LiwgMTAuIH07Citjb25zdCBkb3VibGUgQm94Qk9EX2Z1bmN0b3I6OnhbNl0gPSB7MS4sIDIuLCAzLiwgNS4sIDcuLCAxMC59OwogCiAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9ib3hib2Quc2h0bWwKLXZvaWQgdGVzdE5pc3RCb3hCT0Qodm9pZCkKLXsKLSAgY29uc3QgaW50IG49MjsKK3ZvaWQgdGVzdE5pc3RCb3hCT0Qodm9pZCkgeworICBjb25zdCBpbnQgbiA9IDI7CiAgIGludCBpbmZvOwogCiAgIFZlY3RvclhkIHgobik7CkBAIC04OTcsMTIgKzkxMSwxMiBAQAogICAvKgogICAgKiBGaXJzdCB0cnkKICAgICovCi0gIHg8PCAxLiwgMS47CisgIHggPDwgMS4sIDEuOwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgQm94Qk9EX2Z1bmN0b3IgZnVuY3RvcjsKICAgTGV2ZW5iZXJnTWFycXVhcmR0PEJveEJPRF9mdW5jdG9yPiBsbShmdW5jdG9yKTsKLSAgbG0uc2V0RnRvbCgxLkU2Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOwotICBsbS5zZXRYdG9sKDEuRTYqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKSk7CisgIGxtLnNldEZ0b2woMS5FNiAqIE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBsbS5zZXRYdG9sKDEuRTYgKiBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKICAgbG0uc2V0RmFjdG9yKDEwKTsKICAgaW5mbyA9IGxtLm1pbmltaXplKHgpOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaW5mbykKQEAgLTkxMiw3ICs5MjYsNyBAQAogICAvLyBjaGVjayB4CiAgIFZFUklGWV9JU19BUFBST1goeFswXSwgMi4xMzgwOTQwODg5RSswMik7CiAgIFZFUklGWV9JU19BUFBST1goeFsxXSwgNS40NzIzNzQ4NTQyRS0wMSk7Ci0gIAorCiAgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQogICAvLyBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CiAgIC8vIFZFUklGWShsbS5uZmV2KCkgPCAzMSk7IC8vIDMxCkBAIC05MjEsMTEgKzkzNSwxMSBAQAogICAvKgogICAgKiBTZWNvbmQgdHJ5CiAgICAqLwotICB4PDwgMTAwLiwgMC43NTsKKyAgeCA8PCAxMDAuLCAwLjc1OwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7CiAgIGxtLnNldEZ0b2woTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKSk7Ci0gIGxtLnNldFh0b2woIE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBsbS5zZXRYdG9sKE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOwogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbmZvKQogCkBAIC05NDQsNDEgKzk1OCw0NiBAQAogICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDUuNDcyMzc0ODU0MkUtMDEpOwogfQogCi1zdHJ1Y3QgTUdIMTdfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+Ci17Ci0gICAgTUdIMTdfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDUsMzMpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzMzXTsKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMzNdOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09NSk7Ci0gICAgICAgIGFzc2VydChmdmVjLnNpemUoKT09MzMpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwzMzsgaSsrKQotICAgICAgICAgICAgZnZlY1tpXSA9ICBiWzBdICsgYlsxXSpleHAoLWJbM10qeFtpXSkgKyAgYlsyXSpleHAoLWJbNF0qeFtpXSkgLSB5W2ldOwotICAgICAgICByZXR1cm4gMDsKK3N0cnVjdCBNR0gxN19mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4geworICBNR0gxN19mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oNSwgMzMpIHt9CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeFszM107CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeVszM107CisgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykgeworICAgIGFzc2VydChiLnNpemUoKSA9PSA1KTsKKyAgICBhc3NlcnQoZnZlYy5zaXplKCkgPT0gMzMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzM7IGkrKykgZnZlY1tpXSA9IGJbMF0gKyBiWzFdICogZXhwKC1iWzNdICogeFtpXSkgKyBiWzJdICogZXhwKC1iWzRdICogeFtpXSkgLSB5W2ldOworICAgIHJldHVybiAwOworICB9CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gNSk7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDMzKTsKKyAgICBhc3NlcnQoZmphYy5jb2xzKCkgPT0gNSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMzsgaSsrKSB7CisgICAgICBmamFjKGksIDApID0gMS47CisgICAgICBmamFjKGksIDEpID0gZXhwKC1iWzNdICogeFtpXSk7CisgICAgICBmamFjKGksIDIpID0gZXhwKC1iWzRdICogeFtpXSk7CisgICAgICBmamFjKGksIDMpID0gLXhbaV0gKiBiWzFdICogZXhwKC1iWzNdICogeFtpXSk7CisgICAgICBmamFjKGksIDQpID0gLXhbaV0gKiBiWzJdICogZXhwKC1iWzRdICogeFtpXSk7CiAgICAgfQotICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTUpOwotICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTMzKTsKLSAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT01KTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8MzM7IGkrKykgewotICAgICAgICAgICAgZmphYyhpLDApID0gMS47Ci0gICAgICAgICAgICBmamFjKGksMSkgPSBleHAoLWJbM10qeFtpXSk7Ci0gICAgICAgICAgICBmamFjKGksMikgPSBleHAoLWJbNF0qeFtpXSk7Ci0gICAgICAgICAgICBmamFjKGksMykgPSAteFtpXSpiWzFdKmV4cCgtYlszXSp4W2ldKTsKLSAgICAgICAgICAgIGZqYWMoaSw0KSA9IC14W2ldKmJbMl0qZXhwKC1iWzRdKnhbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKLWNvbnN0IGRvdWJsZSBNR0gxN19mdW5jdG9yOjp4WzMzXSA9IHsgMC4wMDAwMDBFKzAwLCAxLjAwMDAwMEUrMDEsIDIuMDAwMDAwRSswMSwgMy4wMDAwMDBFKzAxLCA0LjAwMDAwMEUrMDEsIDUuMDAwMDAwRSswMSwgNi4wMDAwMDBFKzAxLCA3LjAwMDAwMEUrMDEsIDguMDAwMDAwRSswMSwgOS4wMDAwMDBFKzAxLCAxLjAwMDAwMEUrMDIsIDEuMTAwMDAwRSswMiwgMS4yMDAwMDBFKzAyLCAxLjMwMDAwMEUrMDIsIDEuNDAwMDAwRSswMiwgMS41MDAwMDBFKzAyLCAxLjYwMDAwMEUrMDIsIDEuNzAwMDAwRSswMiwgMS44MDAwMDBFKzAyLCAxLjkwMDAwMEUrMDIsIDIuMDAwMDAwRSswMiwgMi4xMDAwMDBFKzAyLCAyLjIwMDAwMEUrMDIsIDIuMzAwMDAwRSswMiwgMi40MDAwMDBFKzAyLCAyLjUwMDAwMEUrMDIsIDIuNjAwMDAwRSswMiwgMi43MDAwMDBFKzAyLCAyLjgwMDAwMEUrMDIsIDIuOTAwMDAwRSswMiwgMy4wMDAwMDBFKzAyLCAzLjEwMDAwMEUrMDIsIDMuMjAwMDAwRSswMiB9OwotY29uc3QgZG91YmxlIE1HSDE3X2Z1bmN0b3I6OnlbMzNdID0geyA4LjQ0MDAwMEUtMDEsIDkuMDgwMDAwRS0wMSwgOS4zMjAwMDBFLTAxLCA5LjM2MDAwMEUtMDEsIDkuMjUwMDAwRS0wMSwgOS4wODAwMDBFLTAxLCA4LjgxMDAwMEUtMDEsIDguNTAwMDAwRS0wMSwgOC4xODAwMDBFLTAxLCA3Ljg0MDAwMEUtMDEsIDcuNTEwMDAwRS0wMSwgNy4xODAwMDBFLTAxLCA2Ljg1MDAwMEUtMDEsIDYuNTgwMDAwRS0wMSwgNi4yODAwMDBFLTAxLCA2LjAzMDAwMEUtMDEsIDUuODAwMDAwRS0wMSwgNS41ODAwMDBFLTAxLCA1LjM4MDAwMEUtMDEsIDUuMjIwMDAwRS0wMSwgNS4wNjAwMDBFLTAxLCA0LjkwMDAwMEUtMDEsIDQuNzgwMDAwRS0wMSwgNC42NzAwMDBFLTAxLCA0LjU3MDAwMEUtMDEsIDQuNDgwMDAwRS0wMSwgNC4zODAwMDBFLTAxLCA0LjMxMDAwMEUtMDEsIDQuMjQwMDAwRS0wMSwgNC4yMDAwMDBFLTAxLCA0LjE0MDAwMEUtMDEsIDQuMTEwMDAwRS0wMSwgNC4wNjAwMDBFLTAxIH07Citjb25zdCBkb3VibGUgTUdIMTdfZnVuY3Rvcjo6eFszM10gPSB7MC4wMDAwMDBFKzAwLCAxLjAwMDAwMEUrMDEsIDIuMDAwMDAwRSswMSwgMy4wMDAwMDBFKzAxLCA0LjAwMDAwMEUrMDEsIDUuMDAwMDAwRSswMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LjAwMDAwMEUrMDEsIDcuMDAwMDAwRSswMSwgOC4wMDAwMDBFKzAxLCA5LjAwMDAwMEUrMDEsIDEuMDAwMDAwRSswMiwgMS4xMDAwMDBFKzAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjAwMDAwRSswMiwgMS4zMDAwMDBFKzAyLCAxLjQwMDAwMEUrMDIsIDEuNTAwMDAwRSswMiwgMS42MDAwMDBFKzAyLCAxLjcwMDAwMEUrMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MDAwMDBFKzAyLCAxLjkwMDAwMEUrMDIsIDIuMDAwMDAwRSswMiwgMi4xMDAwMDBFKzAyLCAyLjIwMDAwMEUrMDIsIDIuMzAwMDAwRSswMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQwMDAwMEUrMDIsIDIuNTAwMDAwRSswMiwgMi42MDAwMDBFKzAyLCAyLjcwMDAwMEUrMDIsIDIuODAwMDAwRSswMiwgMi45MDAwMDBFKzAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMDAwMDAwRSswMiwgMy4xMDAwMDBFKzAyLCAzLjIwMDAwMEUrMDJ9OworY29uc3QgZG91YmxlIE1HSDE3X2Z1bmN0b3I6OnlbMzNdID0gezguNDQwMDAwRS0wMSwgOS4wODAwMDBFLTAxLCA5LjMyMDAwMEUtMDEsIDkuMzYwMDAwRS0wMSwgOS4yNTAwMDBFLTAxLCA5LjA4MDAwMEUtMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOC44MTAwMDBFLTAxLCA4LjUwMDAwMEUtMDEsIDguMTgwMDAwRS0wMSwgNy44NDAwMDBFLTAxLCA3LjUxMDAwMEUtMDEsIDcuMTgwMDAwRS0wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Ljg1MDAwMEUtMDEsIDYuNTgwMDAwRS0wMSwgNi4yODAwMDBFLTAxLCA2LjAzMDAwMEUtMDEsIDUuODAwMDAwRS0wMSwgNS41ODAwMDBFLTAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMzgwMDAwRS0wMSwgNS4yMjAwMDBFLTAxLCA1LjA2MDAwMEUtMDEsIDQuOTAwMDAwRS0wMSwgNC43ODAwMDBFLTAxLCA0LjY3MDAwMEUtMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC41NzAwMDBFLTAxLCA0LjQ4MDAwMEUtMDEsIDQuMzgwMDAwRS0wMSwgNC4zMTAwMDBFLTAxLCA0LjI0MDAwMEUtMDEsIDQuMjAwMDAwRS0wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjE0MDAwMEUtMDEsIDQuMTEwMDAwRS0wMSwgNC4wNjAwMDBFLTAxfTsKIAogLy8gaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L3N0cmQvbmxzL2RhdGEvbWdoMTcuc2h0bWwKLXZvaWQgdGVzdE5pc3RNR0gxNyh2b2lkKQotewotICBjb25zdCBpbnQgbj01Owordm9pZCB0ZXN0TmlzdE1HSDE3KHZvaWQpIHsKKyAgY29uc3QgaW50IG4gPSA1OwogICBpbnQgaW5mbzsKIAogICBWZWN0b3JYZCB4KG4pOwpAQCAtOTg2LDcgKzEwMDUsNyBAQAogICAvKgogICAgKiBGaXJzdCB0cnkKICAgICovCi0gIHg8PCA1MC4sIDE1MC4sIC0xMDAuLCAxLiwgMi47CisgIHggPDwgNTAuLCAxNTAuLCAtMTAwLiwgMS4sIDIuOwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgTUdIMTdfZnVuY3RvciBmdW5jdG9yOwogICBMZXZlbmJlcmdNYXJxdWFyZHQ8TUdIMTdfZnVuY3Rvcj4gbG0oZnVuY3Rvcik7CkBAIC0xMDA0LDE2ICsxMDIzLDE2IEBACiAgIFZFUklGWV9JU19BUFBST1goeFsyXSwgLTEuNDY0Njg3MTM2NkUrMDApOwogICBWRVJJRllfSVNfQVBQUk9YKHhbM10sIDEuMjg2NzUzNDY0MEUtMDIpOwogICBWRVJJRllfSVNfQVBQUk9YKHhbNF0sIDIuMjEyMjY5OTY2MkUtMDIpOwotICAKLSAgICAvLyBjaGVjayByZXR1cm4gdmFsdWUKLS8vICAgVkVSSUZZX0lTX0VRVUFMKGluZm8sIDIpOyAgLy9GSVhNRSBVc2UgKGxtLmluZm8oKSA9PSBTdWNjZXNzKQorCisgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQorICAvLyAgIFZFUklGWV9JU19FUVVBTChpbmZvLCAyKTsgIC8vRklYTUUgVXNlIChsbS5pbmZvKCkgPT0gU3VjY2VzcykKICAgLy8gVkVSSUZZKGxtLm5mZXYoKSA8IDcwMCApOyAvLyA2MDIKICAgLy8gVkVSSUZZKGxtLm5qZXYoKSA8IDYwMCApOyAvLyA1NDUKIAogICAvKgogICAgKiBTZWNvbmQgdHJ5CiAgICAqLwotICB4PDwgMC41ICAsMS41ICAsLTEgICAsMC4wMSAsMC4wMjsKKyAgeCA8PCAwLjUsIDEuNSwgLTEsIDAuMDEsIDAuMDI7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBsbS5yZXNldFBhcmFtZXRlcnMoKTsKICAgaW5mbyA9IGxtLm1pbmltaXplKHgpOwpAQCAtMTAzMyw0NCArMTA1Miw0MiBAQAogICBWRVJJRllfSVNfQVBQUk9YKHhbNF0sIDIuMjEyMjY5OTY2MkUtMDIpOwogfQogCi1zdHJ1Y3QgTUdIMDlfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+Ci17Ci0gICAgTUdIMDlfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDQsMTEpIHt9Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSBfeFsxMV07Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzExXTsKLSAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTQpOwotICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTExKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8MTE7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIHggPSBfeFtpXSwgeHg9eCp4OwotICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0qKHh4K3gqYlsxXSkvKHh4K3gqYlsyXStiWzNdKSAtIHlbaV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CitzdHJ1Y3QgTUdIMDlfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+IHsKKyAgTUdIMDlfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDQsIDExKSB7fQorICBzdGF0aWMgY29uc3QgZG91YmxlIF94WzExXTsKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzExXTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDQpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSAxMSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgaSsrKSB7CisgICAgICBkb3VibGUgeCA9IF94W2ldLCB4eCA9IHggKiB4OworICAgICAgZnZlY1tpXSA9IGJbMF0gKiAoeHggKyB4ICogYlsxXSkgLyAoeHggKyB4ICogYlsyXSArIGJbM10pIC0geVtpXTsKICAgICB9Ci0gICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09NCk7Ci0gICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTEpOwotICAgICAgICBhc3NlcnQoZmphYy5jb2xzKCk9PTQpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwxMTsgaSsrKSB7Ci0gICAgICAgICAgICBkb3VibGUgeCA9IF94W2ldLCB4eD14Kng7Ci0gICAgICAgICAgICBkb3VibGUgZmFjdG9yID0gMS4vKHh4K3gqYlsyXStiWzNdKTsKLSAgICAgICAgICAgIGZqYWMoaSwwKSA9ICh4eCt4KmJbMV0pICogZmFjdG9yOwotICAgICAgICAgICAgZmphYyhpLDEpID0gYlswXSp4KiBmYWN0b3I7Ci0gICAgICAgICAgICBmamFjKGksMikgPSAtIGJbMF0qKHh4K3gqYlsxXSkgKiB4ICogZmFjdG9yICogZmFjdG9yOwotICAgICAgICAgICAgZmphYyhpLDMpID0gLSBiWzBdKih4eCt4KmJbMV0pICogZmFjdG9yICogZmFjdG9yOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAwOworICB9CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gNCk7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDExKTsKKyAgICBhc3NlcnQoZmphYy5jb2xzKCkgPT0gNCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgaSsrKSB7CisgICAgICBkb3VibGUgeCA9IF94W2ldLCB4eCA9IHggKiB4OworICAgICAgZG91YmxlIGZhY3RvciA9IDEuIC8gKHh4ICsgeCAqIGJbMl0gKyBiWzNdKTsKKyAgICAgIGZqYWMoaSwgMCkgPSAoeHggKyB4ICogYlsxXSkgKiBmYWN0b3I7CisgICAgICBmamFjKGksIDEpID0gYlswXSAqIHggKiBmYWN0b3I7CisgICAgICBmamFjKGksIDIpID0gLWJbMF0gKiAoeHggKyB4ICogYlsxXSkgKiB4ICogZmFjdG9yICogZmFjdG9yOworICAgICAgZmphYyhpLCAzKSA9IC1iWzBdICogKHh4ICsgeCAqIGJbMV0pICogZmFjdG9yICogZmFjdG9yOwogICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKLWNvbnN0IGRvdWJsZSBNR0gwOV9mdW5jdG9yOjpfeFsxMV0gPSB7IDQuLCAyLiwgMS4sIDUuRS0xICwgMi41RS0wMSwgMS42NzAwMDBFLTAxLCAxLjI1MDAwMEUtMDEsICAxLkUtMDEsIDguMzMwMDAwRS0wMiwgNy4xNDAwMDBFLTAyLCA2LjI1MDAwMEUtMDIgfTsKLWNvbnN0IGRvdWJsZSBNR0gwOV9mdW5jdG9yOjp5WzExXSA9IHsgMS45NTcwMDBFLTAxLCAxLjk0NzAwMEUtMDEsIDEuNzM1MDAwRS0wMSwgMS42MDAwMDBFLTAxLCA4LjQ0MDAwMEUtMDIsIDYuMjcwMDAwRS0wMiwgNC41NjAwMDBFLTAyLCAzLjQyMDAwMEUtMDIsIDMuMjMwMDAwRS0wMiwgMi4zNTAwMDBFLTAyLCAyLjQ2MDAwMEUtMDIgfTsKK2NvbnN0IGRvdWJsZSBNR0gwOV9mdW5jdG9yOjpfeFsxMV0gPSB7NC4sICAgICAgICAgICAyLiwgICAgIDEuLCAgICAgICAgICAgNS5FLTEsICAgICAgICAyLjVFLTAxLCAgICAgMS42NzAwMDBFLTAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1MDAwMEUtMDEsIDEuRS0wMSwgOC4zMzAwMDBFLTAyLCA3LjE0MDAwMEUtMDIsIDYuMjUwMDAwRS0wMn07Citjb25zdCBkb3VibGUgTUdIMDlfZnVuY3Rvcjo6eVsxMV0gPSB7MS45NTcwMDBFLTAxLCAxLjk0NzAwMEUtMDEsIDEuNzM1MDAwRS0wMSwgMS42MDAwMDBFLTAxLCA4LjQ0MDAwMEUtMDIsIDYuMjcwMDAwRS0wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjU2MDAwMEUtMDIsIDMuNDIwMDAwRS0wMiwgMy4yMzAwMDBFLTAyLCAyLjM1MDAwMEUtMDIsIDIuNDYwMDAwRS0wMn07CiAKIC8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL21naDA5LnNodG1sCi12b2lkIHRlc3ROaXN0TUdIMDkodm9pZCkKLXsKLSAgY29uc3QgaW50IG49NDsKK3ZvaWQgdGVzdE5pc3RNR0gwOSh2b2lkKSB7CisgIGNvbnN0IGludCBuID0gNDsKICAgaW50IGluZm87CiAKICAgVmVjdG9yWGQgeChuKTsKQEAgLTEwNzgsNyArMTA5NSw3IEBACiAgIC8qCiAgICAqIEZpcnN0IHRyeQogICAgKi8KLSAgeDw8IDI1LiwgMzksIDQxLjUsIDM5LjsKKyAgeCA8PCAyNS4sIDM5LCA0MS41LCAzOS47CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBNR0gwOV9mdW5jdG9yIGZ1bmN0b3I7CiAgIExldmVuYmVyZ01hcnF1YXJkdDxNR0gwOV9mdW5jdG9yPiBsbShmdW5jdG9yKTsKQEAgLTEwODksMTkgKzExMDYsMTkgQEAKICAgLy8gY2hlY2sgbm9ybV4yCiAgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDMuMDc1MDU2MDM4NUUtMDQpOwogICAvLyBjaGVjayB4Ci0gIFZFUklGWV9JU19BUFBST1goeFswXSwgMC4xOTI4MDc3MDg5KTsgLy8gc2hvdWxkIGJlIDEuOTI4MDY5MzQ1OEUtMDEKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCAwLjE5MTI2NDIzNTczKTsgLy8gc2hvdWxkIGJlIDEuOTEyODIzMjg3M0UtMDEKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAwLjEyMzA1MzA5OTE0KTsgLy8gc2hvdWxkIGJlIDEuMjMwNTY1MDY5M0UtMDEKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAwLjEzNjA1Mzk1Mzc1KTsgLy8gc2hvdWxkIGJlIDEuMzYwNjIzMzA2OEUtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAwLjE5MjgwNzcwODkpOyAgIC8vIHNob3VsZCBiZSAxLjkyODA2OTM0NThFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFsxXSwgMC4xOTEyNjQyMzU3Myk7ICAvLyBzaG91bGQgYmUgMS45MTI4MjMyODczRS0wMQorICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDAuMTIzMDUzMDk5MTQpOyAgLy8gc2hvdWxkIGJlIDEuMjMwNTY1MDY5M0UtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAwLjEzNjA1Mzk1Mzc1KTsgIC8vIHNob3VsZCBiZSAxLjM2MDYyMzMwNjhFLTAxCiAgIC8vIGNoZWNrIHJldHVybiB2YWx1ZQotICAvLyBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7IAorICAvLyBWRVJJRllfSVNfRVFVQUwoaW5mbywgMSk7CiAgIC8vIFZFUklGWShsbS5uZmV2KCkgPCA1MTAgKTsgLy8gNDkwCiAgIC8vIFZFUklGWShsbS5uamV2KCkgPCA0MDAgKTsgLy8gMzc2CiAKICAgLyoKICAgICogU2Vjb25kIHRyeQogICAgKi8KLSAgeDw8IDAuMjUsIDAuMzksIDAuNDE1LCAwLjM5OworICB4IDw8IDAuMjUsIDAuMzksIDAuNDE1LCAwLjM5OwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7CiAgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKQEAgLTExMTQsNTEgKzExMzEsNzkgQEAKICAgLy8gY2hlY2sgbm9ybV4yCiAgIFZFUklGWV9JU19BUFBST1gobG0uZnZlYygpLnNxdWFyZWROb3JtKCksIDMuMDc1MDU2MDM4NUUtMDQpOwogICAvLyBjaGVjayB4Ci0gIFZFUklGWV9JU19BUFBST1goeFswXSwgMC4xOTI4MDc4MSk7IC8vIHNob3VsZCBiZSAxLjkyODA2OTM0NThFLTAxCi0gIFZFUklGWV9JU19BUFBST1goeFsxXSwgMC4xOTEyNjI2NSk7IC8vIHNob3VsZCBiZSAxLjkxMjgyMzI4NzNFLTAxCi0gIFZFUklGWV9JU19BUFBST1goeFsyXSwgMC4xMjMwNTI4MCk7IC8vIHNob3VsZCBiZSAxLjIzMDU2NTA2OTNFLTAxCi0gIFZFUklGWV9JU19BUFBST1goeFszXSwgMC4xMzYwNTMyMik7IC8vIHNob3VsZCBiZSAxLjM2MDYyMzMwNjhFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFswXSwgMC4xOTI4MDc4MSk7ICAvLyBzaG91bGQgYmUgMS45MjgwNjkzNDU4RS0wMQorICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDAuMTkxMjYyNjUpOyAgLy8gc2hvdWxkIGJlIDEuOTEyODIzMjg3M0UtMDEKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzJdLCAwLjEyMzA1MjgwKTsgIC8vIHNob3VsZCBiZSAxLjIzMDU2NTA2OTNFLTAxCisgIFZFUklGWV9JU19BUFBST1goeFszXSwgMC4xMzYwNTMyMik7ICAvLyBzaG91bGQgYmUgMS4zNjA2MjMzMDY4RS0wMQogfQogCi0KLQotc3RydWN0IEJlbm5ldHQ1X2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPgotewotICAgIEJlbm5ldHQ1X2Z1bmN0b3Iodm9pZCkgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPigzLDE1NCkge30KLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMTU0XTsKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTU0XTsKLSAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOwotICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTE1NCk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDE1NDsgaSsrKQotICAgICAgICAgICAgZnZlY1tpXSA9IGJbMF0qIHBvdyhiWzFdK3hbaV0sLTEuL2JbMl0pIC0geVtpXTsKLSAgICAgICAgcmV0dXJuIDA7CitzdHJ1Y3QgQmVubmV0dDVfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+IHsKKyAgQmVubmV0dDVfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDMsIDE1NCkge30KKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB4WzE1NF07CisgIHN0YXRpYyBjb25zdCBkb3VibGUgeVsxNTRdOworICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gMyk7CisgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpID09IDE1NCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTQ7IGkrKykgZnZlY1tpXSA9IGJbMF0gKiBwb3coYlsxXSArIHhbaV0sIC0xLiAvIGJbMl0pIC0geVtpXTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDMpOworICAgIGFzc2VydChmamFjLnJvd3MoKSA9PSAxNTQpOworICAgIGFzc2VydChmamFjLmNvbHMoKSA9PSAzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE1NDsgaSsrKSB7CisgICAgICBkb3VibGUgZSA9IHBvdyhiWzFdICsgeFtpXSwgLTEuIC8gYlsyXSk7CisgICAgICBmamFjKGksIDApID0gZTsKKyAgICAgIGZqYWMoaSwgMSkgPSAtYlswXSAqIGUgLyBiWzJdIC8gKGJbMV0gKyB4W2ldKTsKKyAgICAgIGZqYWMoaSwgMikgPSBiWzBdICogZSAqIGxvZyhiWzFdICsgeFtpXSkgLyBiWzJdIC8gYlsyXTsKICAgICB9Ci0gICAgaW50IGRmKGNvbnN0IFZlY3RvclhkICZiLCBNYXRyaXhYZCAmZmphYykKLSAgICB7Ci0gICAgICAgIGFzc2VydChiLnNpemUoKT09Myk7Ci0gICAgICAgIGFzc2VydChmamFjLnJvd3MoKT09MTU0KTsKLSAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0zKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8MTU0OyBpKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSBlID0gcG93KGJbMV0reFtpXSwtMS4vYlsyXSk7Ci0gICAgICAgICAgICBmamFjKGksMCkgPSBlOwotICAgICAgICAgICAgZmphYyhpLDEpID0gLSBiWzBdKmUvYlsyXS8oYlsxXSt4W2ldKTsKLSAgICAgICAgICAgIGZqYWMoaSwyKSA9IGJbMF0qZSpsb2coYlsxXSt4W2ldKS9iWzJdL2JbMl07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiAwOworICB9CiB9OwotY29uc3QgZG91YmxlIEJlbm5ldHQ1X2Z1bmN0b3I6OnhbMTU0XSA9IHsgNy40NDcxNjhFMCwgOC4xMDI1ODZFMCwgOC40NTI1NDdFMCwgOC43MTEyNzhFMCwgOC45MTY3NzRFMCwgOS4wODcxNTVFMCwgOS4yMzI1OTBFMCwgOS4zNTk1MzVFMCwgOS40NzIxNjZFMCwgOS41NzMzODRFMCwgOS42NjUyOTNFMCwgOS43NDk0NjFFMCwgOS44MjcwOTJFMCwgOS44OTkxMjhFMCwgOS45NjYzMjFFMCwgMTAuMDI5MjgwRTAsIDEwLjA4ODUxMEUwLCAxMC4xNDQ0MzBFMCwgMTAuMTk3MzgwRTAsIDEwLjI0NzY3MEUwLCAxMC4yOTU1NjBFMCwgMTAuMzQxMjUwRTAsIDEwLjM4NDk1MEUwLCAxMC40MjY4MjBFMCwgMTAuNDY3MDAwRTAsIDEwLjUwNTY0MEUwLCAxMC41NDI4MzBFMCwgMTAuNTc4NjkwRTAsIDEwLjYxMzMxMEUwLCAxMC42NDY3ODBFMCwgMTAuNjc5MTUwRTAsIDEwLjcxMDUyMEUwLCAxMC43NDA5MjBFMCwgMTAuNzcwNDQwRTAsIDEwLjc5OTEwMEUwLCAxMC44MjY5NzBFMCwgMTAuODU0MDgwRTAsIDEwLjg4MDQ3MEUwLCAxMC45MDYxOTBFMCwgMTAuOTMxMjYwRTAsIDEwLjk1NTcyMEUwLCAxMC45Nzk1OTBFMCwgMTEuMDAyOTEwRTAsIDExLjAyNTcwMEUwLCAxMS4wNDc5ODBFMCwgMTEuMDY5NzcwRTAsIDExLjA5MTEwMEUwLCAxMS4xMTE5ODBFMCwgMTEuMTMyNDQwRTAsIDExLjE1MjQ4MEUwLCAxMS4xNzIxMzBFMCwgMTEuMTkxNDEwRTAsIDExLjIxMDMxMEUwLCAxMS4yMjg4NzBFMCwgMTEuMjQ3MDkwRTAsIDExLjI2NDk4MEUwLCAxMS4yODI1NjBFMCwgMTEuMjk5ODQwRTAsIDExLjMxNjgyMEUwLCAxMS4zMzM1MjBFMCwgMTEuMzQ5OTQwRTAsIDExLjM2NjEwMEUwLCAxMS4zODIwMDBFMCwgMTEuMzk3NjYwRTAsIDExLjQxMzA3MEUwLCAxMS40MjgyNDBFMCwgMTEuNDQzMjAwRTAsIDExLjQ1NzkzMEUwLCAxMS40NzI0NDBFMCwgMTEuNDg2NzUwRTAsIDExLjUwMDg2MEUwLCAxMS41MTQ3NzBFMCwgMTEuNTI4NDkwRTAsIDExLjU0MjAyMEUwLCAxMS41NTUzODBFMCwgMTEuNTY4NTUwRTAsCi0xMS41ODE1NjBFMCwgMTEuNTk0NDIwRTAsIDExLjYwNzEyMUUwLCAxMS42MTk2NDBFMCwgMTEuNjMyMDAwRTAsIDExLjY0NDIxMEUwLCAxMS42NTYyODBFMCwgMTEuNjY4MjAwRTAsIDExLjY3OTk4MEUwLCAxMS42OTE2MjBFMCwgMTEuNzAzMTMwRTAsIDExLjcxNDUxMEUwLCAxMS43MjU3NjBFMCwgMTEuNzM2ODgwRTAsIDExLjc0Nzg5MEUwLCAxMS43NTg3ODBFMCwgMTEuNzY5NTUwRTAsIDExLjc4MDIwMEUwLCAxMS43OTA3MzBFMCwgMTEuODAxMTYwRTAsIDExLjgxMTQ4MEUwLCAxMS44MjE3MDBFMCwgMTEuODMxODEwRTAsIDExLjg0MTgyMEUwLCAxMS44NTE3MzBFMCwgMTEuODYxNTUwRTAsIDExLjg3MTI3MEUwLCAxMS44ODA4OTBFMCwgMTEuODkwNDIwRTAsIDExLjg5OTg3MEUwLCAxMS45MDkyMjBFMCwgMTEuOTE4NDkwRTAsIDExLjkyNzY4MEUwLCAxMS45MzY3ODBFMCwgMTEuOTQ1NzkwRTAsIDExLjk1NDczMEUwLCAxMS45NjM1OTBFMCwgMTEuOTcyMzcwRTAsIDExLjk4MTA3MEUwLCAxMS45ODk3MDBFMCwgMTEuOTk4MjYwRTAsIDEyLjAwNjc0MEUwLCAxMi4wMTUxNTBFMCwgMTIuMDIzNDkwRTAsIDEyLjAzMTc2MEUwLCAxMi4wMzk5NzBFMCwgMTIuMDQ4MTAwRTAsIDEyLjA1NjE3MEUwLCAxMi4wNjQxODBFMCwgMTIuMDcyMTIwRTAsIDEyLjA4MDAxMEUwLCAxMi4wODc4MjBFMCwgMTIuMDk1NTgwRTAsIDEyLjEwMzI4MEUwLCAxMi4xMTA5MjBFMCwgMTIuMTE4NTAwRTAsIDEyLjEyNjAzMEUwLCAxMi4xMzM1MDBFMCwgMTIuMTQwOTEwRTAsIDEyLjE0ODI3MEUwLCAxMi4xNTU1NzBFMCwgMTIuMTYyODMwRTAsIDEyLjE3MDAzMEUwLCAxMi4xNzcxNzBFMCwgMTIuMTg0MjcwRTAsIDEyLjE5MTMyMEUwLCAxMi4xOTgzMjBFMCwgMTIuMjA1MjcwRTAsIDEyLjIxMjE3MEUwLCAxMi4yMTkwMzBFMCwgMTIuMjI1ODQwRTAsIDEyLjIzMjYwMEUwLCAxMi4yMzkzMjBFMCwgMTIuMjQ1OTkwRTAsIDEyLjI1MjYyMEUwLCAxMi4yNTkyMDBFMCwgMTIuMjY1NzUwRTAsIDEyLjI3MjI0MEUwIH07Ci1jb25zdCBkb3VibGUgQmVubmV0dDVfZnVuY3Rvcjo6eVsxNTRdID0geyAtMzQuODM0NzAyRTAgLC0zNC4zOTMyMDBFMCAsLTM0LjE1MjkwMUUwICwtMzMuOTc5MDk5RTAgLC0zMy44NDU5MDFFMCAsLTMzLjczMjg5OUUwICwtMzMuNjQwMzAxRTAgLC0zMy41NTkyMDBFMCAsLTMzLjQ4NjgwMUUwICwtMzMuNDIzMTAwRTAgLC0zMy4zNjUxMDFFMCAsLTMzLjMxMzAwMEUwICwtMzMuMjYwODk5RTAgLC0zMy4yMTc0MDBFMCAsLTMzLjE3Njg5OUUwICwtMzMuMTM5MTk4RTAgLC0zMy4xMDE2MDFFMCAsLTMzLjA2Njc5OUUwICwtMzMuMDM1MDAwRTAgLC0zMy4wMDMxMDFFMCAsLTMyLjk3MTI5OEUwICwtMzIuOTQyMjk5RTAgLC0zMi45MTYzMDJFMCAsLTMyLjg5MDIwMkUwICwtMzIuODY0MTAxRTAgLC0zMi44NDEwMDBFMCAsLTMyLjgxNzc5OUUwICwtMzIuNzk3NTAxRTAgLC0zMi43NzQzMDBFMCAsLTMyLjc1NzAwMEUwICwtMzIuNzMzNzk5RTAgLC0zMi43MTY0MDBFMCAsLTMyLjY5OTEwMEUwICwtMzIuNjc4Nzk5RTAgLC0zMi42NjE0MDBFMCAsLTMyLjY0NDAwMUUwICwtMzIuNjI2NzAxRTAgLC0zMi42MTIyMDJFMCAsLTMyLjU5NzY5OEUwICwtMzIuNTgzMTk5RTAgLC0zMi41Njg2OTlFMCAsLTMyLjU1NDI5OEUwICwtMzIuNTM5Nzk5RTAgLC0zMi41MjUyOTlFMCAsLTMyLjUxMDc5OUUwICwtMzIuNDk5MTk5RTAgLC0zMi40ODc1OThFMCAsLTMyLjQ3MzIwMkUwICwtMzIuNDYxNjAxRTAgLC0zMi40MzU1MDFFMCAsLTMyLjQzNTUwMUUwICwtMzIuNDI2ODAwRTAgLC0zMi40MTIzMDBFMCAsLTMyLjQwMDc5OUUwICwtMzIuMzkyMTAxRTAgLC0zMi4zODA1MDFFMCAsLTMyLjM2NjAwMUUwICwtMzIuMzU3MzAwRTAgLC0zMi4zNDg1OThFMCAsLTMyLjMzOTkwMUUwICwtMzIuMzI4NDAwRTAgLC0zMi4zMTk2OThFMCAsLTMyLjMxMTAwMUUwICwtMzIuMjk5NDAwRTAgLC0zMi4yOTA2OTlFMCAsLTMyLjI4MjAwMUUwICwtMzIuMjczMzAwRTAgLC0zMi4yNjQ1OTlFMCAsLTMyLjI1NjAwMUUwICwtMzIuMjQ3Mjk5RTAKLSwtMzIuMjM4NjAyRTAgLC0zMi4yMjk5MDBFMCAsLTMyLjIyNDA5OEUwICwtMzIuMjE1NDAxRTAgLC0zMi4yMDM4MDBFMCAsLTMyLjE5ODAwMkUwICwtMzIuMTg5NDAwRTAgLC0zMi4xODM2MDFFMCAsLTMyLjE3NDkwMEUwICwtMzIuMTY5MTAyRTAgLC0zMi4xNjMzMDBFMCAsLTMyLjE1NDU5OEUwICwtMzIuMTQ1OTAxRTAgLC0zMi4xNDAwOTlFMCAsLTMyLjEzMTQwMUUwICwtMzIuMTI1NTk5RTAgLC0zMi4xMTk4MDFFMCAsLTMyLjExMTE5OEUwICwtMzIuMTA1NDAwRTAgLC0zMi4wOTY2OTlFMCAsLTMyLjA5MDkwMEUwICwtMzIuMDg4MDAxRTAgLC0zMi4wNzkzMDBFMCAsLTMyLjA3MzUwMkUwICwtMzIuMDY3Njk5RTAgLC0zMi4wNjE5MDFFMCAsLTMyLjA1NjA5OUUwICwtMzIuMDUwMzAxRTAgLC0zMi4wNDQ0OThFMCAsLTMyLjAzODc5OUUwICwtMzIuMDMzMDAxRTAgLC0zMi4wMjcxOTlFMCAsLTMyLjAyNDMwMEUwICwtMzIuMDE4NTAxRTAgLC0zMi4wMTI2OTlFMCAsLTMyLjAwNDAwMkUwICwtMzIuMDAxMDk5RTAgLC0zMS45OTUzMDBFMCAsLTMxLjk4OTUwMEUwICwtMzEuOTgzNzAwRTAgLC0zMS45Nzc5MDBFMCAsLTMxLjk3MjA5OUUwICwtMzEuOTY5Mjk5RTAgLC0zMS45NjM1MDFFMCAsLTMxLjk1NzcwMUUwICwtMzEuOTUxOTAwRTAgLC0zMS45NDYxMDBFMCAsLTMxLjk0MDMwMEUwICwtMzEuOTM3NDAxRTAgLC0zMS45MzE2MDFFMCAsLTMxLjkyNTgwMEUwICwtMzEuOTIyODk5RTAgLC0zMS45MTcxMDFFMCAsLTMxLjkxMTMwMUUwICwtMzEuOTA4NDAwRTAgLC0zMS45MDI1OTlFMCAsLTMxLjg5NjkwMEUwICwtMzEuODkzOTk5RTAgLC0zMS44ODgyMDFFMCAsLTMxLjg4NTMwMEUwICwtMzEuODgyNDAxRTAgLC0zMS44NzY2MDBFMCAsLTMxLjg3MzY5OUUwICwtMzEuODY3OTAxRTAgLC0zMS44NjIxMDFFMCAsLTMxLjg1OTIwMEUwICwtMzEuODU2MzAwRTAgLC0zMS44NTA1MDBFMCAsLTMxLjg0NDcwMEUwICwtMzEuODQxODAxRTAgLC0zMS44Mzg5MDBFMCAsLTMxLjgzMzA5OUUwICwtMzEuODMwMjAwRTAgLAotLTMxLjgyNzI5OUUwICwtMzEuODIxNjAwRTAgLC0zMS44MTg3MDFFMCAsLTMxLjgxMjkwMUUwICwtMzEuODA5OTk5RTAgLC0zMS44MDcxMDBFMCAsLTMxLjgwMTMwMEUwICwtMzEuNzk4NDAxRTAgLC0zMS43OTU1MDBFMCAsLTMxLjc4OTcwMEUwICwtMzEuNzg2ODAwRTAgfTsKK2NvbnN0IGRvdWJsZSBCZW5uZXR0NV9mdW5jdG9yOjp4WzE1NF0gPSB7CisgICAgNy40NDcxNjhFMCwgIDguMTAyNTg2RTAsICA4LjQ1MjU0N0UwLCAgOC43MTEyNzhFMCwgIDguOTE2Nzc0RTAsICA5LjA4NzE1NUUwLCAgOS4yMzI1OTBFMCwgIDkuMzU5NTM1RTAsICA5LjQ3MjE2NkUwLAorICAgIDkuNTczMzg0RTAsICA5LjY2NTI5M0UwLCAgOS43NDk0NjFFMCwgIDkuODI3MDkyRTAsICA5Ljg5OTEyOEUwLCAgOS45NjYzMjFFMCwgIDEwLjAyOTI4MEUwLCAxMC4wODg1MTBFMCwgMTAuMTQ0NDMwRTAsCisgICAgMTAuMTk3MzgwRTAsIDEwLjI0NzY3MEUwLCAxMC4yOTU1NjBFMCwgMTAuMzQxMjUwRTAsIDEwLjM4NDk1MEUwLCAxMC40MjY4MjBFMCwgMTAuNDY3MDAwRTAsIDEwLjUwNTY0MEUwLCAxMC41NDI4MzBFMCwKKyAgICAxMC41Nzg2OTBFMCwgMTAuNjEzMzEwRTAsIDEwLjY0Njc4MEUwLCAxMC42NzkxNTBFMCwgMTAuNzEwNTIwRTAsIDEwLjc0MDkyMEUwLCAxMC43NzA0NDBFMCwgMTAuNzk5MTAwRTAsIDEwLjgyNjk3MEUwLAorICAgIDEwLjg1NDA4MEUwLCAxMC44ODA0NzBFMCwgMTAuOTA2MTkwRTAsIDEwLjkzMTI2MEUwLCAxMC45NTU3MjBFMCwgMTAuOTc5NTkwRTAsIDExLjAwMjkxMEUwLCAxMS4wMjU3MDBFMCwgMTEuMDQ3OTgwRTAsCisgICAgMTEuMDY5NzcwRTAsIDExLjA5MTEwMEUwLCAxMS4xMTE5ODBFMCwgMTEuMTMyNDQwRTAsIDExLjE1MjQ4MEUwLCAxMS4xNzIxMzBFMCwgMTEuMTkxNDEwRTAsIDExLjIxMDMxMEUwLCAxMS4yMjg4NzBFMCwKKyAgICAxMS4yNDcwOTBFMCwgMTEuMjY0OTgwRTAsIDExLjI4MjU2MEUwLCAxMS4yOTk4NDBFMCwgMTEuMzE2ODIwRTAsIDExLjMzMzUyMEUwLCAxMS4zNDk5NDBFMCwgMTEuMzY2MTAwRTAsIDExLjM4MjAwMEUwLAorICAgIDExLjM5NzY2MEUwLCAxMS40MTMwNzBFMCwgMTEuNDI4MjQwRTAsIDExLjQ0MzIwMEUwLCAxMS40NTc5MzBFMCwgMTEuNDcyNDQwRTAsIDExLjQ4Njc1MEUwLCAxMS41MDA4NjBFMCwgMTEuNTE0NzcwRTAsCisgICAgMTEuNTI4NDkwRTAsIDExLjU0MjAyMEUwLCAxMS41NTUzODBFMCwgMTEuNTY4NTUwRTAsIDExLjU4MTU2MEUwLCAxMS41OTQ0MjBFMCwgMTEuNjA3MTIxRTAsIDExLjYxOTY0MEUwLCAxMS42MzIwMDBFMCwKKyAgICAxMS42NDQyMTBFMCwgMTEuNjU2MjgwRTAsIDExLjY2ODIwMEUwLCAxMS42Nzk5ODBFMCwgMTEuNjkxNjIwRTAsIDExLjcwMzEzMEUwLCAxMS43MTQ1MTBFMCwgMTEuNzI1NzYwRTAsIDExLjczNjg4MEUwLAorICAgIDExLjc0Nzg5MEUwLCAxMS43NTg3ODBFMCwgMTEuNzY5NTUwRTAsIDExLjc4MDIwMEUwLCAxMS43OTA3MzBFMCwgMTEuODAxMTYwRTAsIDExLjgxMTQ4MEUwLCAxMS44MjE3MDBFMCwgMTEuODMxODEwRTAsCisgICAgMTEuODQxODIwRTAsIDExLjg1MTczMEUwLCAxMS44NjE1NTBFMCwgMTEuODcxMjcwRTAsIDExLjg4MDg5MEUwLCAxMS44OTA0MjBFMCwgMTEuODk5ODcwRTAsIDExLjkwOTIyMEUwLCAxMS45MTg0OTBFMCwKKyAgICAxMS45Mjc2ODBFMCwgMTEuOTM2NzgwRTAsIDExLjk0NTc5MEUwLCAxMS45NTQ3MzBFMCwgMTEuOTYzNTkwRTAsIDExLjk3MjM3MEUwLCAxMS45ODEwNzBFMCwgMTEuOTg5NzAwRTAsIDExLjk5ODI2MEUwLAorICAgIDEyLjAwNjc0MEUwLCAxMi4wMTUxNTBFMCwgMTIuMDIzNDkwRTAsIDEyLjAzMTc2MEUwLCAxMi4wMzk5NzBFMCwgMTIuMDQ4MTAwRTAsIDEyLjA1NjE3MEUwLCAxMi4wNjQxODBFMCwgMTIuMDcyMTIwRTAsCisgICAgMTIuMDgwMDEwRTAsIDEyLjA4NzgyMEUwLCAxMi4wOTU1ODBFMCwgMTIuMTAzMjgwRTAsIDEyLjExMDkyMEUwLCAxMi4xMTg1MDBFMCwgMTIuMTI2MDMwRTAsIDEyLjEzMzUwMEUwLCAxMi4xNDA5MTBFMCwKKyAgICAxMi4xNDgyNzBFMCwgMTIuMTU1NTcwRTAsIDEyLjE2MjgzMEUwLCAxMi4xNzAwMzBFMCwgMTIuMTc3MTcwRTAsIDEyLjE4NDI3MEUwLCAxMi4xOTEzMjBFMCwgMTIuMTk4MzIwRTAsIDEyLjIwNTI3MEUwLAorICAgIDEyLjIxMjE3MEUwLCAxMi4yMTkwMzBFMCwgMTIuMjI1ODQwRTAsIDEyLjIzMjYwMEUwLCAxMi4yMzkzMjBFMCwgMTIuMjQ1OTkwRTAsIDEyLjI1MjYyMEUwLCAxMi4yNTkyMDBFMCwgMTIuMjY1NzUwRTAsCisgICAgMTIuMjcyMjQwRTB9OworY29uc3QgZG91YmxlIEJlbm5ldHQ1X2Z1bmN0b3I6OnlbMTU0XSA9IHsKKyAgICAtMzQuODM0NzAyRTAsIC0zNC4zOTMyMDBFMCwgLTM0LjE1MjkwMUUwLCAtMzMuOTc5MDk5RTAsIC0zMy44NDU5MDFFMCwgLTMzLjczMjg5OUUwLCAtMzMuNjQwMzAxRTAsIC0zMy41NTkyMDBFMCwKKyAgICAtMzMuNDg2ODAxRTAsIC0zMy40MjMxMDBFMCwgLTMzLjM2NTEwMUUwLCAtMzMuMzEzMDAwRTAsIC0zMy4yNjA4OTlFMCwgLTMzLjIxNzQwMEUwLCAtMzMuMTc2ODk5RTAsIC0zMy4xMzkxOThFMCwKKyAgICAtMzMuMTAxNjAxRTAsIC0zMy4wNjY3OTlFMCwgLTMzLjAzNTAwMEUwLCAtMzMuMDAzMTAxRTAsIC0zMi45NzEyOThFMCwgLTMyLjk0MjI5OUUwLCAtMzIuOTE2MzAyRTAsIC0zMi44OTAyMDJFMCwKKyAgICAtMzIuODY0MTAxRTAsIC0zMi44NDEwMDBFMCwgLTMyLjgxNzc5OUUwLCAtMzIuNzk3NTAxRTAsIC0zMi43NzQzMDBFMCwgLTMyLjc1NzAwMEUwLCAtMzIuNzMzNzk5RTAsIC0zMi43MTY0MDBFMCwKKyAgICAtMzIuNjk5MTAwRTAsIC0zMi42Nzg3OTlFMCwgLTMyLjY2MTQwMEUwLCAtMzIuNjQ0MDAxRTAsIC0zMi42MjY3MDFFMCwgLTMyLjYxMjIwMkUwLCAtMzIuNTk3Njk4RTAsIC0zMi41ODMxOTlFMCwKKyAgICAtMzIuNTY4Njk5RTAsIC0zMi41NTQyOThFMCwgLTMyLjUzOTc5OUUwLCAtMzIuNTI1Mjk5RTAsIC0zMi41MTA3OTlFMCwgLTMyLjQ5OTE5OUUwLCAtMzIuNDg3NTk4RTAsIC0zMi40NzMyMDJFMCwKKyAgICAtMzIuNDYxNjAxRTAsIC0zMi40MzU1MDFFMCwgLTMyLjQzNTUwMUUwLCAtMzIuNDI2ODAwRTAsIC0zMi40MTIzMDBFMCwgLTMyLjQwMDc5OUUwLCAtMzIuMzkyMTAxRTAsIC0zMi4zODA1MDFFMCwKKyAgICAtMzIuMzY2MDAxRTAsIC0zMi4zNTczMDBFMCwgLTMyLjM0ODU5OEUwLCAtMzIuMzM5OTAxRTAsIC0zMi4zMjg0MDBFMCwgLTMyLjMxOTY5OEUwLCAtMzIuMzExMDAxRTAsIC0zMi4yOTk0MDBFMCwKKyAgICAtMzIuMjkwNjk5RTAsIC0zMi4yODIwMDFFMCwgLTMyLjI3MzMwMEUwLCAtMzIuMjY0NTk5RTAsIC0zMi4yNTYwMDFFMCwgLTMyLjI0NzI5OUUwLCAtMzIuMjM4NjAyRTAsIC0zMi4yMjk5MDBFMCwKKyAgICAtMzIuMjI0MDk4RTAsIC0zMi4yMTU0MDFFMCwgLTMyLjIwMzgwMEUwLCAtMzIuMTk4MDAyRTAsIC0zMi4xODk0MDBFMCwgLTMyLjE4MzYwMUUwLCAtMzIuMTc0OTAwRTAsIC0zMi4xNjkxMDJFMCwKKyAgICAtMzIuMTYzMzAwRTAsIC0zMi4xNTQ1OThFMCwgLTMyLjE0NTkwMUUwLCAtMzIuMTQwMDk5RTAsIC0zMi4xMzE0MDFFMCwgLTMyLjEyNTU5OUUwLCAtMzIuMTE5ODAxRTAsIC0zMi4xMTExOThFMCwKKyAgICAtMzIuMTA1NDAwRTAsIC0zMi4wOTY2OTlFMCwgLTMyLjA5MDkwMEUwLCAtMzIuMDg4MDAxRTAsIC0zMi4wNzkzMDBFMCwgLTMyLjA3MzUwMkUwLCAtMzIuMDY3Njk5RTAsIC0zMi4wNjE5MDFFMCwKKyAgICAtMzIuMDU2MDk5RTAsIC0zMi4wNTAzMDFFMCwgLTMyLjA0NDQ5OEUwLCAtMzIuMDM4Nzk5RTAsIC0zMi4wMzMwMDFFMCwgLTMyLjAyNzE5OUUwLCAtMzIuMDI0MzAwRTAsIC0zMi4wMTg1MDFFMCwKKyAgICAtMzIuMDEyNjk5RTAsIC0zMi4wMDQwMDJFMCwgLTMyLjAwMTA5OUUwLCAtMzEuOTk1MzAwRTAsIC0zMS45ODk1MDBFMCwgLTMxLjk4MzcwMEUwLCAtMzEuOTc3OTAwRTAsIC0zMS45NzIwOTlFMCwKKyAgICAtMzEuOTY5Mjk5RTAsIC0zMS45NjM1MDFFMCwgLTMxLjk1NzcwMUUwLCAtMzEuOTUxOTAwRTAsIC0zMS45NDYxMDBFMCwgLTMxLjk0MDMwMEUwLCAtMzEuOTM3NDAxRTAsIC0zMS45MzE2MDFFMCwKKyAgICAtMzEuOTI1ODAwRTAsIC0zMS45MjI4OTlFMCwgLTMxLjkxNzEwMUUwLCAtMzEuOTExMzAxRTAsIC0zMS45MDg0MDBFMCwgLTMxLjkwMjU5OUUwLCAtMzEuODk2OTAwRTAsIC0zMS44OTM5OTlFMCwKKyAgICAtMzEuODg4MjAxRTAsIC0zMS44ODUzMDBFMCwgLTMxLjg4MjQwMUUwLCAtMzEuODc2NjAwRTAsIC0zMS44NzM2OTlFMCwgLTMxLjg2NzkwMUUwLCAtMzEuODYyMTAxRTAsIC0zMS44NTkyMDBFMCwKKyAgICAtMzEuODU2MzAwRTAsIC0zMS44NTA1MDBFMCwgLTMxLjg0NDcwMEUwLCAtMzEuODQxODAxRTAsIC0zMS44Mzg5MDBFMCwgLTMxLjgzMzA5OUUwLCAtMzEuODMwMjAwRTAsIC0zMS44MjcyOTlFMCwKKyAgICAtMzEuODIxNjAwRTAsIC0zMS44MTg3MDFFMCwgLTMxLjgxMjkwMUUwLCAtMzEuODA5OTk5RTAsIC0zMS44MDcxMDBFMCwgLTMxLjgwMTMwMEUwLCAtMzEuNzk4NDAxRTAsIC0zMS43OTU1MDBFMCwKKyAgICAtMzEuNzg5NzAwRTAsIC0zMS43ODY4MDBFMH07CiAKIC8vIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5OC9zdHJkL25scy9kYXRhL2Jlbm5ldHQ1LnNodG1sCi12b2lkIHRlc3ROaXN0QmVubmV0dDUodm9pZCkKLXsKLSAgY29uc3QgaW50ICBuPTM7Cit2b2lkIHRlc3ROaXN0QmVubmV0dDUodm9pZCkgeworICBjb25zdCBpbnQgbiA9IDM7CiAgIGludCBpbmZvOwogCiAgIFZlY3RvclhkIHgobik7CkBAIC0xMTY2LDcgKzEyMTEsNyBAQAogICAvKgogICAgKiBGaXJzdCB0cnkKICAgICovCi0gIHg8PCAtMjAwMC4sIDUwLiwgMC44OworICB4IDw8IC0yMDAwLiwgNTAuLCAwLjg7CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBCZW5uZXR0NV9mdW5jdG9yIGZ1bmN0b3I7CiAgIExldmVuYmVyZ01hcnF1YXJkdDxCZW5uZXR0NV9mdW5jdG9yPiBsbShmdW5jdG9yKTsKQEAgLTExODcsNyArMTIzMiw3IEBACiAgIC8qCiAgICAqIFNlY29uZCB0cnkKICAgICovCi0gIHg8PCAtMTUwMC4sIDQ1LiwgMC44NTsKKyAgeCA8PCAtMTUwMC4sIDQ1LiwgMC44NTsKICAgLy8gZG8gdGhlIGNvbXB1dGF0aW9uCiAgIGxtLnJlc2V0UGFyYW1ldGVycygpOwogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CkBAIC0xMjAwLDU0ICsxMjQ1LDYwIEBACiAgIC8vIGNoZWNrIG5vcm1eMgogICBWRVJJRllfSVNfQVBQUk9YKGxtLmZ2ZWMoKS5zcXVhcmVkTm9ybSgpLCA1LjI0MDQ3NDQwNzNFLTA0KTsKICAgLy8gY2hlY2sgeAotICBWRVJJRllfSVNfQVBQUk9YKHhbMF0sIC0yNTIzLjMwMDc4NjUpOyAvLyBzaG91bGQgYmUgLTIuNTIzNTA1ODA0M0UrMDMKLSAgVkVSSUZZX0lTX0FQUFJPWCh4WzFdLCA0Ni43MzU3MDU3NzEpOyAvLyBzaG91bGQgYmUgNC42NzM2NTY0NjQ0RSswMSk7Ci0gIFZFUklGWV9JU19BUFBST1goeFsyXSwgMC45MzIxOTg4MTg5MSk7IC8vIHNob3VsZCBiZSA5LjMyMTg0ODMxOTNFLTAxKTsKKyAgVkVSSUZZX0lTX0FQUFJPWCh4WzBdLCAtMjUyMy4zMDA3ODY1KTsgIC8vIHNob3VsZCBiZSAtMi41MjM1MDU4MDQzRSswMworICBWRVJJRllfSVNfQVBQUk9YKHhbMV0sIDQ2LjczNTcwNTc3MSk7ICAgLy8gc2hvdWxkIGJlIDQuNjczNjU2NDY0NEUrMDEpOworICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDAuOTMyMTk4ODE4OTEpOyAgLy8gc2hvdWxkIGJlIDkuMzIxODQ4MzE5M0UtMDEpOwogfQogCi1zdHJ1Y3QgdGh1cmJlcl9mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4KLXsKLSAgICB0aHVyYmVyX2Z1bmN0b3Iodm9pZCkgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPig3LDM3KSB7fQotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgX3hbMzddOwotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgX3lbMzddOwotICAgIGludCBvcGVyYXRvcigpKGNvbnN0IFZlY3RvclhkICZiLCBWZWN0b3JYZCAmZnZlYykKLSAgICB7Ci0gICAgICAgIC8vICAgICAgICBpbnQgY2FsbGVkPTA7IHByaW50ZigiY2FsbCBoYWhuMV9mdW5jdG9yIHdpdGggIGlmbGFnPSVkLCBjYWxsZWQ9JWRcbiIsIGlmbGFnLCBjYWxsZWQpOyBpZiAoaWZsYWc9PTEpIGNhbGxlZCsrOwotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTcpOwotICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTM3KTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8Mzc7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIHg9X3hbaV0sIHh4PXgqeCwgeHh4PXh4Kng7Ci0gICAgICAgICAgICBmdmVjW2ldID0gKGJbMF0rYlsxXSp4K2JbMl0qeHgrYlszXSp4eHgpIC8gKDEuK2JbNF0qeCtiWzVdKnh4K2JbNl0qeHh4KSAtIF95W2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworc3RydWN0IHRodXJiZXJfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+IHsKKyAgdGh1cmJlcl9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oNywgMzcpIHt9CisgIHN0YXRpYyBjb25zdCBkb3VibGUgX3hbMzddOworICBzdGF0aWMgY29uc3QgZG91YmxlIF95WzM3XTsKKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKSB7CisgICAgLy8gICAgICAgIGludCBjYWxsZWQ9MDsgcHJpbnRmKCJjYWxsIGhhaG4xX2Z1bmN0b3Igd2l0aCAgaWZsYWc9JWQsIGNhbGxlZD0lZFxuIiwgaWZsYWcsIGNhbGxlZCk7IGlmIChpZmxhZz09MSkKKyAgICAvLyAgICAgICAgY2FsbGVkKys7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDcpOworICAgIGFzc2VydChmdmVjLnNpemUoKSA9PSAzNyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzNzsgaSsrKSB7CisgICAgICBkb3VibGUgeCA9IF94W2ldLCB4eCA9IHggKiB4LCB4eHggPSB4eCAqIHg7CisgICAgICBmdmVjW2ldID0gKGJbMF0gKyBiWzFdICogeCArIGJbMl0gKiB4eCArIGJbM10gKiB4eHgpIC8gKDEuICsgYls0XSAqIHggKyBiWzVdICogeHggKyBiWzZdICogeHh4KSAtIF95W2ldOwogICAgIH0KLSAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT03KTsKLSAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0zNyk7Ci0gICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09Nyk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDM3OyBpKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSB4PV94W2ldLCB4eD14KngsIHh4eD14eCp4OwotICAgICAgICAgICAgZG91YmxlIGZhY3QgPSAxLi8oMS4rYls0XSp4K2JbNV0qeHgrYls2XSp4eHgpOwotICAgICAgICAgICAgZmphYyhpLDApID0gMS4qZmFjdDsKLSAgICAgICAgICAgIGZqYWMoaSwxKSA9IHgqZmFjdDsKLSAgICAgICAgICAgIGZqYWMoaSwyKSA9IHh4KmZhY3Q7Ci0gICAgICAgICAgICBmamFjKGksMykgPSB4eHgqZmFjdDsKLSAgICAgICAgICAgIGZhY3QgPSAtIChiWzBdK2JbMV0qeCtiWzJdKnh4K2JbM10qeHh4KSAqIGZhY3QgKiBmYWN0OwotICAgICAgICAgICAgZmphYyhpLDQpID0geCpmYWN0OwotICAgICAgICAgICAgZmphYyhpLDUpID0geHgqZmFjdDsKLSAgICAgICAgICAgIGZqYWMoaSw2KSA9IHh4eCpmYWN0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAwOworICB9CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gNyk7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDM3KTsKKyAgICBhc3NlcnQoZmphYy5jb2xzKCkgPT0gNyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzNzsgaSsrKSB7CisgICAgICBkb3VibGUgeCA9IF94W2ldLCB4eCA9IHggKiB4LCB4eHggPSB4eCAqIHg7CisgICAgICBkb3VibGUgZmFjdCA9IDEuIC8gKDEuICsgYls0XSAqIHggKyBiWzVdICogeHggKyBiWzZdICogeHh4KTsKKyAgICAgIGZqYWMoaSwgMCkgPSAxLiAqIGZhY3Q7CisgICAgICBmamFjKGksIDEpID0geCAqIGZhY3Q7CisgICAgICBmamFjKGksIDIpID0geHggKiBmYWN0OworICAgICAgZmphYyhpLCAzKSA9IHh4eCAqIGZhY3Q7CisgICAgICBmYWN0ID0gLShiWzBdICsgYlsxXSAqIHggKyBiWzJdICogeHggKyBiWzNdICogeHh4KSAqIGZhY3QgKiBmYWN0OworICAgICAgZmphYyhpLCA0KSA9IHggKiBmYWN0OworICAgICAgZmphYyhpLCA1KSA9IHh4ICogZmFjdDsKKyAgICAgIGZqYWMoaSwgNikgPSB4eHggKiBmYWN0OwogICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKLWNvbnN0IGRvdWJsZSB0aHVyYmVyX2Z1bmN0b3I6Ol94WzM3XSA9IHsgLTMuMDY3RTAsIC0yLjk4MUUwLCAtMi45MjFFMCwgLTIuOTEyRTAsIC0yLjg0MEUwLCAtMi43OTdFMCwgLTIuNzAyRTAsIC0yLjY5OUUwLCAtMi42MzNFMCwgLTIuNDgxRTAsIC0yLjM2M0UwLCAtMi4zMjJFMCwgLTEuNTAxRTAsIC0xLjQ2MEUwLCAtMS4yNzRFMCwgLTEuMjEyRTAsIC0xLjEwMEUwLCAtMS4wNDZFMCwgLTAuOTE1RTAsIC0wLjcxNEUwLCAtMC41NjZFMCwgLTAuNTQ1RTAsIC0wLjQwMEUwLCAtMC4zMDlFMCwgLTAuMTA5RTAsIC0wLjEwM0UwLCAwLjAxMEUwLCAwLjExOUUwLCAwLjM3N0UwLCAwLjc5MEUwLCAwLjk2M0UwLCAxLjAwNkUwLCAxLjExNUUwLCAxLjU3MkUwLCAxLjg0MUUwLCAyLjA0N0UwLCAyLjIwMEUwIH07Ci1jb25zdCBkb3VibGUgdGh1cmJlcl9mdW5jdG9yOjpfeVszN10gPSB7IDgwLjU3NEUwLCA4NC4yNDhFMCwgODcuMjY0RTAsIDg3LjE5NUUwLCA4OS4wNzZFMCwgODkuNjA4RTAsIDg5Ljg2OEUwLCA5MC4xMDFFMCwgOTIuNDA1RTAsIDk1Ljg1NEUwLCAxMDAuNjk2RTAsIDEwMS4wNjBFMCwgNDAxLjY3MkUwLCAzOTAuNzI0RTAsIDU2Ny41MzRFMCwgNjM1LjMxNkUwLCA3MzMuMDU0RTAsIDc1OS4wODdFMCwgODk0LjIwNkUwLCA5OTAuNzg1RTAsIDEwOTAuMTA5RTAsIDEwODAuOTE0RTAsIDExMjIuNjQzRTAsIDExNzguMzUxRTAsIDEyNjAuNTMxRTAsIDEyNzMuNTE0RTAsIDEyODguMzM5RTAsIDEzMjcuNTQzRTAsIDEzNTMuODYzRTAsIDE0MTQuNTA5RTAsIDE0MjUuMjA4RTAsIDE0MjEuMzg0RTAsIDE0NDIuOTYyRTAsIDE0NjQuMzUwRTAsIDE0NjguNzA1RTAsIDE0NDcuODk0RTAsIDE0NTcuNjI4RTB9OworY29uc3QgZG91YmxlIHRodXJiZXJfZnVuY3Rvcjo6X3hbMzddID0gey0zLjA2N0UwLCAtMi45ODFFMCwgLTIuOTIxRTAsIC0yLjkxMkUwLCAtMi44NDBFMCwgLTIuNzk3RTAsIC0yLjcwMkUwLCAtMi42OTlFMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMi42MzNFMCwgLTIuNDgxRTAsIC0yLjM2M0UwLCAtMi4zMjJFMCwgLTEuNTAxRTAsIC0xLjQ2MEUwLCAtMS4yNzRFMCwgLTEuMjEyRTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTAwRTAsIC0xLjA0NkUwLCAtMC45MTVFMCwgLTAuNzE0RTAsIC0wLjU2NkUwLCAtMC41NDVFMCwgLTAuNDAwRTAsIC0wLjMwOUUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEwOUUwLCAtMC4xMDNFMCwgMC4wMTBFMCwgIDAuMTE5RTAsICAwLjM3N0UwLCAgMC43OTBFMCwgIDAuOTYzRTAsICAxLjAwNkUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTE1RTAsICAxLjU3MkUwLCAgMS44NDFFMCwgIDIuMDQ3RTAsICAyLjIwMEUwfTsKK2NvbnN0IGRvdWJsZSB0aHVyYmVyX2Z1bmN0b3I6Ol95WzM3XSA9IHsKKyAgICA4MC41NzRFMCwgICA4NC4yNDhFMCwgICA4Ny4yNjRFMCwgICA4Ny4xOTVFMCwgICA4OS4wNzZFMCwgICA4OS42MDhFMCwgICA4OS44NjhFMCwgICA5MC4xMDFFMCwKKyAgICA5Mi40MDVFMCwgICA5NS44NTRFMCwgICAxMDAuNjk2RTAsICAxMDEuMDYwRTAsICA0MDEuNjcyRTAsICAzOTAuNzI0RTAsICA1NjcuNTM0RTAsICA2MzUuMzE2RTAsCisgICAgNzMzLjA1NEUwLCAgNzU5LjA4N0UwLCAgODk0LjIwNkUwLCAgOTkwLjc4NUUwLCAgMTA5MC4xMDlFMCwgMTA4MC45MTRFMCwgMTEyMi42NDNFMCwgMTE3OC4zNTFFMCwKKyAgICAxMjYwLjUzMUUwLCAxMjczLjUxNEUwLCAxMjg4LjMzOUUwLCAxMzI3LjU0M0UwLCAxMzUzLjg2M0UwLCAxNDE0LjUwOUUwLCAxNDI1LjIwOEUwLCAxNDIxLjM4NEUwLAorICAgIDE0NDIuOTYyRTAsIDE0NjQuMzUwRTAsIDE0NjguNzA1RTAsIDE0NDcuODk0RTAsIDE0NTcuNjI4RTB9OwogCiAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS90aHVyYmVyLnNodG1sCi12b2lkIHRlc3ROaXN0VGh1cmJlcih2b2lkKQotewotICBjb25zdCBpbnQgbj03Owordm9pZCB0ZXN0TmlzdFRodXJiZXIodm9pZCkgeworICBjb25zdCBpbnQgbiA9IDc7CiAgIGludCBpbmZvOwogCiAgIFZlY3RvclhkIHgobik7CkBAIC0xMjU1LDEyICsxMzA2LDEyIEBACiAgIC8qCiAgICAqIEZpcnN0IHRyeQogICAgKi8KLSAgeDw8IDEwMDAgLDEwMDAgLDQwMCAsNDAgLDAuNywwLjMsMC4wIDsKKyAgeCA8PCAxMDAwLCAxMDAwLCA0MDAsIDQwLCAwLjcsIDAuMywgMC4wOwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgdGh1cmJlcl9mdW5jdG9yIGZ1bmN0b3I7CiAgIExldmVuYmVyZ01hcnF1YXJkdDx0aHVyYmVyX2Z1bmN0b3I+IGxtKGZ1bmN0b3IpOwotICBsbS5zZXRGdG9sKDEuRTQqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKSk7Ci0gIGxtLnNldFh0b2woMS5FNCpOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKKyAgbG0uc2V0RnRvbCgxLkU0ICogTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKSk7CisgIGxtLnNldFh0b2woMS5FNCAqIE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOwogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbmZvKQogCkBAIC0xMjgyLDExICsxMzMzLDExIEBACiAgIC8qCiAgICAqIFNlY29uZCB0cnkKICAgICovCi0gIHg8PCAxMzAwICwxNTAwICw1MDAgICw3NSAgICwxICAgICwwLjQgICwwLjA1ICA7CisgIHggPDwgMTMwMCwgMTUwMCwgNTAwLCA3NSwgMSwgMC40LCAwLjA1OwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7Ci0gIGxtLnNldEZ0b2woMS5FNCpOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKLSAgbG0uc2V0WHRvbCgxLkU0Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBsbS5zZXRGdG9sKDEuRTQgKiBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKKyAgbG0uc2V0WHRvbCgxLkU0ICogTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKSk7CiAgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGluZm8pCiAKQEAgLTEzMDYsNDIgKzEzNTcsMzggQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzZdLCA0Ljk3MjcyOTczNDlFLTAyKTsKIH0KIAotc3RydWN0IHJhdDQzX2Z1bmN0b3IgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPgotewotICAgIHJhdDQzX2Z1bmN0b3Iodm9pZCkgOiBEZW5zZUZ1bmN0b3I8ZG91YmxlPig0LDE1KSB7fQotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeFsxNV07Ci0gICAgc3RhdGljIGNvbnN0IGRvdWJsZSB5WzE1XTsKLSAgICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTQpOwotICAgICAgICBhc3NlcnQoZnZlYy5zaXplKCk9PTE1KTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8MTU7IGkrKykKLSAgICAgICAgICAgIGZ2ZWNbaV0gPSBiWzBdICogcG93KDEuK2V4cChiWzFdLWJbMl0qeFtpXSksLTEuL2JbM10pIC0geVtpXTsKLSAgICAgICAgcmV0dXJuIDA7CitzdHJ1Y3QgcmF0NDNfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+IHsKKyAgcmF0NDNfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDQsIDE1KSB7fQorICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMTVdOworICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMTVdOworICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gNCk7CisgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpID09IDE1KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE1OyBpKyspIGZ2ZWNbaV0gPSBiWzBdICogcG93KDEuICsgZXhwKGJbMV0gLSBiWzJdICogeFtpXSksIC0xLiAvIGJbM10pIC0geVtpXTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKSB7CisgICAgYXNzZXJ0KGIuc2l6ZSgpID09IDQpOworICAgIGFzc2VydChmamFjLnJvd3MoKSA9PSAxNSk7CisgICAgYXNzZXJ0KGZqYWMuY29scygpID09IDQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTU7IGkrKykgeworICAgICAgZG91YmxlIGUgPSBleHAoYlsxXSAtIGJbMl0gKiB4W2ldKTsKKyAgICAgIGRvdWJsZSBwb3dlciA9IC0xLiAvIGJbM107CisgICAgICBmamFjKGksIDApID0gcG93KDEuICsgZSwgcG93ZXIpOworICAgICAgZmphYyhpLCAxKSA9IHBvd2VyICogYlswXSAqIGUgKiBwb3coMS4gKyBlLCBwb3dlciAtIDEuKTsKKyAgICAgIGZqYWMoaSwgMikgPSAtcG93ZXIgKiBiWzBdICogZSAqIHhbaV0gKiBwb3coMS4gKyBlLCBwb3dlciAtIDEuKTsKKyAgICAgIGZqYWMoaSwgMykgPSBiWzBdICogcG93ZXIgKiBwb3dlciAqIGxvZygxLiArIGUpICogcG93KDEuICsgZSwgcG93ZXIpOwogICAgIH0KLSAgICBpbnQgZGYoY29uc3QgVmVjdG9yWGQgJmIsIE1hdHJpeFhkICZmamFjKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT00KTsKLSAgICAgICAgYXNzZXJ0KGZqYWMucm93cygpPT0xNSk7Ci0gICAgICAgIGFzc2VydChmamFjLmNvbHMoKT09NCk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDE1OyBpKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSBlID0gZXhwKGJbMV0tYlsyXSp4W2ldKTsKLSAgICAgICAgICAgIGRvdWJsZSBwb3dlciA9IC0xLi9iWzNdOwotICAgICAgICAgICAgZmphYyhpLDApID0gcG93KDEuK2UsIHBvd2VyKTsKLSAgICAgICAgICAgIGZqYWMoaSwxKSA9IHBvd2VyKmJbMF0qZSpwb3coMS4rZSwgcG93ZXItMS4pOwotICAgICAgICAgICAgZmphYyhpLDIpID0gLXBvd2VyKmJbMF0qZSp4W2ldKnBvdygxLitlLCBwb3dlci0xLik7Ci0gICAgICAgICAgICBmamFjKGksMykgPSBiWzBdKnBvd2VyKnBvd2VyKmxvZygxLitlKSpwb3coMS4rZSwgcG93ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKLWNvbnN0IGRvdWJsZSByYXQ0M19mdW5jdG9yOjp4WzE1XSA9IHsgMS4sIDIuLCAzLiwgNC4sIDUuLCA2LiwgNy4sIDguLCA5LiwgMTAuLCAxMS4sIDEyLiwgMTMuLCAxNC4sIDE1LiB9OwotY29uc3QgZG91YmxlIHJhdDQzX2Z1bmN0b3I6OnlbMTVdID0geyAxNi4wOCwgMzMuODMsIDY1LjgwLCA5Ny4yMCwgMTkxLjU1LCAzMjYuMjAsIDM4Ni44NywgNTIwLjUzLCA1OTAuMDMsIDY1MS45MiwgNzI0LjkzLCA2OTkuNTYsIDY4OS45NiwgNjM3LjU2LCA3MTcuNDEgfTsKK2NvbnN0IGRvdWJsZSByYXQ0M19mdW5jdG9yOjp4WzE1XSA9IHsxLiwgMi4sIDMuLCA0LiwgNS4sIDYuLCA3LiwgOC4sIDkuLCAxMC4sIDExLiwgMTIuLCAxMy4sIDE0LiwgMTUufTsKK2NvbnN0IGRvdWJsZSByYXQ0M19mdW5jdG9yOjp5WzE1XSA9IHsxNi4wOCwgIDMzLjgzLCAgNjUuODAsICA5Ny4yMCwgIDE5MS41NSwgMzI2LjIwLCAzODYuODcsIDUyMC41MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTAuMDMsIDY1MS45MiwgNzI0LjkzLCA2OTkuNTYsIDY4OS45NiwgNjM3LjU2LCA3MTcuNDF9OwogCiAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9yYXRrb3dza3kzLnNodG1sCi12b2lkIHRlc3ROaXN0UmF0NDModm9pZCkKLXsKLSAgY29uc3QgaW50IG49NDsKK3ZvaWQgdGVzdE5pc3RSYXQ0Myh2b2lkKSB7CisgIGNvbnN0IGludCBuID0gNDsKICAgaW50IGluZm87CiAKICAgVmVjdG9yWGQgeChuKTsKQEAgLTEzNDksMTIgKzEzOTYsMTIgQEAKICAgLyoKICAgICogRmlyc3QgdHJ5CiAgICAqLwotICB4PDwgMTAwLiwgMTAuLCAxLiwgMS47CisgIHggPDwgMTAwLiwgMTAuLCAxLiwgMS47CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICByYXQ0M19mdW5jdG9yIGZ1bmN0b3I7CiAgIExldmVuYmVyZ01hcnF1YXJkdDxyYXQ0M19mdW5jdG9yPiBsbShmdW5jdG9yKTsKLSAgbG0uc2V0RnRvbCgxLkU2Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOwotICBsbS5zZXRYdG9sKDEuRTYqTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKSk7CisgIGxtLnNldEZ0b2woMS5FNiAqIE51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBsbS5zZXRYdG9sKDEuRTYgKiBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKICAgaW5mbyA9IGxtLm1pbmltaXplKHgpOwogICBFSUdFTl9VTlVTRURfVkFSSUFCTEUoaW5mbykKIApAQCAtMTM3MywxMSArMTQyMCwxMSBAQAogICAvKgogICAgKiBTZWNvbmQgdHJ5CiAgICAqLwotICB4PDwgNzAwLiwgNS4sIDAuNzUsIDEuMzsKKyAgeCA8PCA3MDAuLCA1LiwgMC43NSwgMS4zOwogICAvLyBkbyB0aGUgY29tcHV0YXRpb24KICAgbG0ucmVzZXRQYXJhbWV0ZXJzKCk7Ci0gIGxtLnNldEZ0b2woMS5FNSpOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKLSAgbG0uc2V0WHRvbCgxLkU1Kk51bVRyYWl0czxkb3VibGU+OjplcHNpbG9uKCkpOworICBsbS5zZXRGdG9sKDEuRTUgKiBOdW1UcmFpdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKKyAgbG0uc2V0WHRvbCgxLkU1ICogTnVtVHJhaXRzPGRvdWJsZT46OmVwc2lsb24oKSk7CiAgIGluZm8gPSBsbS5taW5pbWl6ZSh4KTsKICAgRUlHRU5fVU5VU0VEX1ZBUklBQkxFKGluZm8pCiAKQEAgLTEzOTQsNDMgKzE0NDEsNDQgQEAKICAgVkVSSUZZX0lTX0FQUFJPWCh4WzNdLCAxLjI3OTI0ODM4NTlFKzAwKTsKIH0KIAotCi0KLXN0cnVjdCBlY2tlcmxlNF9mdW5jdG9yIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4KLXsKLSAgICBlY2tlcmxlNF9mdW5jdG9yKHZvaWQpIDogRGVuc2VGdW5jdG9yPGRvdWJsZT4oMywzNSkge30KLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMzVdOwotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgeVszNV07Ci0gICAgaW50IG9wZXJhdG9yKCkoY29uc3QgVmVjdG9yWGQgJmIsIFZlY3RvclhkICZmdmVjKQotICAgIHsKLSAgICAgICAgYXNzZXJ0KGIuc2l6ZSgpPT0zKTsKLSAgICAgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpPT0zNSk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPDM1OyBpKyspCi0gICAgICAgICAgICBmdmVjW2ldID0gYlswXS9iWzFdICogZXhwKC0wLjUqKHhbaV0tYlsyXSkqKHhbaV0tYlsyXSkvKGJbMV0qYlsxXSkpIC0geVtpXTsKLSAgICAgICAgcmV0dXJuIDA7CitzdHJ1Y3QgZWNrZXJsZTRfZnVuY3RvciA6IERlbnNlRnVuY3Rvcjxkb3VibGU+IHsKKyAgZWNrZXJsZTRfZnVuY3Rvcih2b2lkKSA6IERlbnNlRnVuY3Rvcjxkb3VibGU+KDMsIDM1KSB7fQorICBzdGF0aWMgY29uc3QgZG91YmxlIHhbMzVdOworICBzdGF0aWMgY29uc3QgZG91YmxlIHlbMzVdOworICBpbnQgb3BlcmF0b3IoKShjb25zdCBWZWN0b3JYZCAmYiwgVmVjdG9yWGQgJmZ2ZWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gMyk7CisgICAgYXNzZXJ0KGZ2ZWMuc2l6ZSgpID09IDM1KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM1OyBpKyspCisgICAgICBmdmVjW2ldID0gYlswXSAvIGJbMV0gKiBleHAoLTAuNSAqICh4W2ldIC0gYlsyXSkgKiAoeFtpXSAtIGJbMl0pIC8gKGJbMV0gKiBiWzFdKSkgLSB5W2ldOworICAgIHJldHVybiAwOworICB9CisgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpIHsKKyAgICBhc3NlcnQoYi5zaXplKCkgPT0gMyk7CisgICAgYXNzZXJ0KGZqYWMucm93cygpID09IDM1KTsKKyAgICBhc3NlcnQoZmphYy5jb2xzKCkgPT0gMyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzNTsgaSsrKSB7CisgICAgICBkb3VibGUgYjEyID0gYlsxXSAqIGJbMV07CisgICAgICBkb3VibGUgZSA9IGV4cCgtMC41ICogKHhbaV0gLSBiWzJdKSAqICh4W2ldIC0gYlsyXSkgLyBiMTIpOworICAgICAgZmphYyhpLCAwKSA9IGUgLyBiWzFdOworICAgICAgZmphYyhpLCAxKSA9ICgoeFtpXSAtIGJbMl0pICogKHhbaV0gLSBiWzJdKSAvIGIxMiAtIDEuKSAqIGJbMF0gKiBlIC8gYjEyOworICAgICAgZmphYyhpLCAyKSA9ICh4W2ldIC0gYlsyXSkgKiBlICogYlswXSAvIGJbMV0gLyBiMTI7CiAgICAgfQotICAgIGludCBkZihjb25zdCBWZWN0b3JYZCAmYiwgTWF0cml4WGQgJmZqYWMpCi0gICAgewotICAgICAgICBhc3NlcnQoYi5zaXplKCk9PTMpOwotICAgICAgICBhc3NlcnQoZmphYy5yb3dzKCk9PTM1KTsKLSAgICAgICAgYXNzZXJ0KGZqYWMuY29scygpPT0zKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8MzU7IGkrKykgewotICAgICAgICAgICAgZG91YmxlIGIxMiA9IGJbMV0qYlsxXTsKLSAgICAgICAgICAgIGRvdWJsZSBlID0gZXhwKC0wLjUqKHhbaV0tYlsyXSkqKHhbaV0tYlsyXSkvYjEyKTsKLSAgICAgICAgICAgIGZqYWMoaSwwKSA9IGUgLyBiWzFdOwotICAgICAgICAgICAgZmphYyhpLDEpID0gKCh4W2ldLWJbMl0pKih4W2ldLWJbMl0pL2IxMi0xLikgKiBiWzBdKmUvYjEyOwotICAgICAgICAgICAgZmphYyhpLDIpID0gKHhbaV0tYlsyXSkqZSpiWzBdL2JbMV0vYjEyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQogfTsKLWNvbnN0IGRvdWJsZSBlY2tlcmxlNF9mdW5jdG9yOjp4WzM1XSA9IHsgNDAwLjAsIDQwNS4wLCA0MTAuMCwgNDE1LjAsIDQyMC4wLCA0MjUuMCwgNDMwLjAsIDQzNS4wLCA0MzYuNSwgNDM4LjAsIDQzOS41LCA0NDEuMCwgNDQyLjUsIDQ0NC4wLCA0NDUuNSwgNDQ3LjAsIDQ0OC41LCA0NTAuMCwgNDUxLjUsIDQ1My4wLCA0NTQuNSwgNDU2LjAsIDQ1Ny41LCA0NTkuMCwgNDYwLjUsIDQ2Mi4wLCA0NjMuNSwgNDY1LjAsIDQ3MC4wLCA0NzUuMCwgNDgwLjAsIDQ4NS4wLCA0OTAuMCwgNDk1LjAsIDUwMC4wfTsKLWNvbnN0IGRvdWJsZSBlY2tlcmxlNF9mdW5jdG9yOjp5WzM1XSA9IHsgMC4wMDAxNTc1LCAwLjAwMDE2OTksIDAuMDAwMjM1MCwgMC4wMDAzMTAyLCAwLjAwMDQ5MTcsIDAuMDAwODcxMCwgMC4wMDE3NDE4LCAwLjAwNDY0MDAsIDAuMDA2NTg5NSwgMC4wMDk3MzAyLCAwLjAxNDkwMDIsIDAuMDIzNzMxMCwgMC4wNDAxNjgzLCAwLjA3MTI1NTksIDAuMTI2NDQ1OCwgMC4yMDczNDEzLCAwLjI5MDIzNjYsIDAuMzQ0NTYyMywgMC4zNjk4MDQ5LCAwLjM2Njg1MzQsIDAuMzEwNjcyNywgMC4yMDc4MTU0LCAwLjExNjQzNTQsIDAuMDYxNjc2NCwgMC4wMzM3MjAwLCAwLjAxOTQwMjMsIDAuMDExNzgzMSwgMC4wMDc0MzU3LCAwLjAwMjI3MzIsIDAuMDAwODgwMCwgMC4wMDA0NTc5LCAwLjAwMDIzNDUsIDAuMDAwMTU4NiwgMC4wMDAxMTQzLCAwLjAwMDA3MTAgfTsKK2NvbnN0IGRvdWJsZSBlY2tlcmxlNF9mdW5jdG9yOjp4WzM1XSA9IHs0MDAuMCwgNDA1LjAsIDQxMC4wLCA0MTUuMCwgNDIwLjAsIDQyNS4wLCA0MzAuMCwgNDM1LjAsIDQzNi41LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOC4wLCA0MzkuNSwgNDQxLjAsIDQ0Mi41LCA0NDQuMCwgNDQ1LjUsIDQ0Ny4wLCA0NDguNSwgNDUwLjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUxLjUsIDQ1My4wLCA0NTQuNSwgNDU2LjAsIDQ1Ny41LCA0NTkuMCwgNDYwLjUsIDQ2Mi4wLCA0NjMuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NjUuMCwgNDcwLjAsIDQ3NS4wLCA0ODAuMCwgNDg1LjAsIDQ5MC4wLCA0OTUuMCwgNTAwLjB9OworY29uc3QgZG91YmxlIGVja2VybGU0X2Z1bmN0b3I6OnlbMzVdID0gezAuMDAwMTU3NSwgMC4wMDAxNjk5LCAwLjAwMDIzNTAsIDAuMDAwMzEwMiwgMC4wMDA0OTE3LCAwLjAwMDg3MTAsIDAuMDAxNzQxOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDY0MDAsIDAuMDA2NTg5NSwgMC4wMDk3MzAyLCAwLjAxNDkwMDIsIDAuMDIzNzMxMCwgMC4wNDAxNjgzLCAwLjA3MTI1NTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjY0NDU4LCAwLjIwNzM0MTMsIDAuMjkwMjM2NiwgMC4zNDQ1NjIzLCAwLjM2OTgwNDksIDAuMzY2ODUzNCwgMC4zMTA2NzI3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjA3ODE1NCwgMC4xMTY0MzU0LCAwLjA2MTY3NjQsIDAuMDMzNzIwMCwgMC4wMTk0MDIzLCAwLjAxMTc4MzEsIDAuMDA3NDM1NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMjI3MzIsIDAuMDAwODgwMCwgMC4wMDA0NTc5LCAwLjAwMDIzNDUsIDAuMDAwMTU4NiwgMC4wMDAxMTQzLCAwLjAwMDA3MTB9OwogCiAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvc3RyZC9ubHMvZGF0YS9lY2tlcmxlNC5zaHRtbAotdm9pZCB0ZXN0TmlzdEVja2VybGU0KHZvaWQpCi17Ci0gIGNvbnN0IGludCBuPTM7Cit2b2lkIHRlc3ROaXN0RWNrZXJsZTQodm9pZCkgeworICBjb25zdCBpbnQgbiA9IDM7CiAgIGludCBpbmZvOwogCiAgIFZlY3RvclhkIHgobik7CkBAIC0xNDM4LDcgKzE0ODYsNyBAQAogICAvKgogICAgKiBGaXJzdCB0cnkKICAgICovCi0gIHg8PCAxLiwgMTAuLCA1MDAuOworICB4IDw8IDEuLCAxMC4sIDUwMC47CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBlY2tlcmxlNF9mdW5jdG9yIGZ1bmN0b3I7CiAgIExldmVuYmVyZ01hcnF1YXJkdDxlY2tlcmxlNF9mdW5jdG9yPiBsbShmdW5jdG9yKTsKQEAgLTE0NTksNyArMTUwNyw3IEBACiAgIC8qCiAgICAqIFNlY29uZCB0cnkKICAgICovCi0gIHg8PCAxLjUsIDUuLCA0NTAuOworICB4IDw8IDEuNSwgNS4sIDQ1MC47CiAgIC8vIGRvIHRoZSBjb21wdXRhdGlvbgogICBpbmZvID0gbG0ubWluaW1pemUoeCk7CiAgIEVJR0VOX1VOVVNFRF9WQVJJQUJMRShpbmZvKQpAQCAtMTQ3NiwzMyArMTUyNCwzMiBAQAogICBWRVJJRllfSVNfQVBQUk9YKHhbMl0sIDQuNTE1NDEyMTg0NEUrMDIpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QobGV2ZW5iZXJnX21hcnF1YXJkdCkKLXsKLSAgICAvLyBUZXN0cyB1c2luZyB0aGUgZXhhbXBsZXMgcHJvdmlkZWQgYnkgKGMpbWlucGFjawotICAgIENBTExfU1VCVEVTVCh0ZXN0TG1kZXIxKCkpOwotICAgIENBTExfU1VCVEVTVCh0ZXN0TG1kZXIoKSk7Ci0gICAgQ0FMTF9TVUJURVNUKHRlc3RMbWRpZjEoKSk7Ci0vLyAgICAgQ0FMTF9TVUJURVNUKHRlc3RMbXN0cjEoKSk7Ci0vLyAgICAgQ0FMTF9TVUJURVNUKHRlc3RMbXN0cigpKTsKLSAgICBDQUxMX1NVQlRFU1QodGVzdExtZGlmKCkpOworRUlHRU5fREVDTEFSRV9URVNUKGxldmVuYmVyZ19tYXJxdWFyZHQpIHsKKyAgLy8gVGVzdHMgdXNpbmcgdGhlIGV4YW1wbGVzIHByb3ZpZGVkIGJ5IChjKW1pbnBhY2sKKyAgQ0FMTF9TVUJURVNUKHRlc3RMbWRlcjEoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0TG1kZXIoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0TG1kaWYxKCkpOworICAvLyAgICAgQ0FMTF9TVUJURVNUKHRlc3RMbXN0cjEoKSk7CisgIC8vICAgICBDQUxMX1NVQlRFU1QodGVzdExtc3RyKCkpOworICBDQUxMX1NVQlRFU1QodGVzdExtZGlmKCkpOwogCi0gICAgLy8gTklTVCB0ZXN0cywgbGV2ZWwgb2YgZGlmZmljdWx0eSA9ICJMb3dlciIKLSAgICBDQUxMX1NVQlRFU1QodGVzdE5pc3RNaXNyYTFhKCkpOwotICAgIENBTExfU1VCVEVTVCh0ZXN0TmlzdENod2lydXQyKCkpOworICAvLyBOSVNUIHRlc3RzLCBsZXZlbCBvZiBkaWZmaWN1bHR5ID0gIkxvd2VyIgorICBDQUxMX1NVQlRFU1QodGVzdE5pc3RNaXNyYTFhKCkpOworICBDQUxMX1NVQlRFU1QodGVzdE5pc3RDaHdpcnV0MigpKTsKIAotICAgIC8vIE5JU1QgdGVzdHMsIGxldmVsIG9mIGRpZmZpY3VsdHkgPSAiQXZlcmFnZSIKLSAgICBDQUxMX1NVQlRFU1QodGVzdE5pc3RIYWhuMSgpKTsKLSAgICBDQUxMX1NVQlRFU1QodGVzdE5pc3RNaXNyYTFkKCkpOwotICAgIENBTExfU1VCVEVTVCh0ZXN0TmlzdE1HSDE3KCkpOwotICAgIENBTExfU1VCVEVTVCh0ZXN0TmlzdExhbmN6b3MxKCkpOworICAvLyBOSVNUIHRlc3RzLCBsZXZlbCBvZiBkaWZmaWN1bHR5ID0gIkF2ZXJhZ2UiCisgIENBTExfU1VCVEVTVCh0ZXN0TmlzdEhhaG4xKCkpOworICBDQUxMX1NVQlRFU1QodGVzdE5pc3RNaXNyYTFkKCkpOworICBDQUxMX1NVQlRFU1QodGVzdE5pc3RNR0gxNygpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0TGFuY3pvczEoKSk7CiAKLS8vICAgICAvLyBOSVNUIHRlc3RzLCBsZXZlbCBvZiBkaWZmaWN1bHR5ID0gIkhpZ2hlciIKLSAgICBDQUxMX1NVQlRFU1QodGVzdE5pc3RSYXQ0MigpKTsKLSAgICBDQUxMX1NVQlRFU1QodGVzdE5pc3RNR0gxMCgpKTsKLSAgICBDQUxMX1NVQlRFU1QodGVzdE5pc3RCb3hCT0QoKSk7Ci0vLyAgICAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0TUdIMDkoKSk7Ci0gICAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0QmVubmV0dDUoKSk7Ci0gICAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0VGh1cmJlcigpKTsKLSAgICBDQUxMX1NVQlRFU1QodGVzdE5pc3RSYXQ0MygpKTsKLSAgICBDQUxMX1NVQlRFU1QodGVzdE5pc3RFY2tlcmxlNCgpKTsKKyAgLy8gICAgIC8vIE5JU1QgdGVzdHMsIGxldmVsIG9mIGRpZmZpY3VsdHkgPSAiSGlnaGVyIgorICBDQUxMX1NVQlRFU1QodGVzdE5pc3RSYXQ0MigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0TUdIMTAoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0TmlzdEJveEJPRCgpKTsKKyAgLy8gICAgIENBTExfU1VCVEVTVCh0ZXN0TmlzdE1HSDA5KCkpOworICBDQUxMX1NVQlRFU1QodGVzdE5pc3RCZW5uZXR0NSgpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0VGh1cmJlcigpKTsKKyAgQ0FMTF9TVUJURVNUKHRlc3ROaXN0UmF0NDMoKSk7CisgIENBTExfU1VCVEVTVCh0ZXN0TmlzdEVja2VybGU0KCkpOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9tYXRyaXhfZXhwb25lbnRpYWwuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9tYXRyaXhfZXhwb25lbnRpYWwuY3BwCmluZGV4IGIwMzJjYmYuLjBhNTIxNjkgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X2V4cG9uZW50aWFsLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9leHBvbmVudGlhbC5jcHAKQEAgLTksNTYgKzksNDkgQEAKIAogI2luY2x1ZGUgIm1hdHJpeF9mdW5jdGlvbnMuaCIKIAotZG91YmxlIGJpbm9tKGludCBuLCBpbnQgaykKLXsKK2RvdWJsZSBiaW5vbShpbnQgbiwgaW50IGspIHsKICAgZG91YmxlIHJlcyA9IDE7Ci0gIGZvciAoaW50IGk9MDsgaTxrOyBpKyspCi0gICAgcmVzID0gcmVzICogKG4taytpKzEpIC8gKGkrMSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgazsgaSsrKSByZXMgPSByZXMgKiAobiAtIGsgKyBpICsgMSkgLyAoaSArIDEpOwogICByZXR1cm4gcmVzOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVQgZXhwZm4oVCB4LCBpbnQpCi17CitUIGV4cGZuKFQgeCwgaW50KSB7CiAgIHJldHVybiBzdGQ6OmV4cCh4KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIHRlc3QyZFJvdGF0aW9uKGRvdWJsZSB0b2wpCi17Ci0gIE1hdHJpeDxULDIsMj4gQSwgQiwgQzsKK3ZvaWQgdGVzdDJkUm90YXRpb24oZG91YmxlIHRvbCkgeworICBNYXRyaXg8VCwgMiwgMj4gQSwgQiwgQzsKICAgVCBhbmdsZTsKIAogICBBIDw8IDAsIDEsIC0xLCAwOwotICBmb3IgKGludCBpPTA7IGk8PTIwOyBpKyspCi0gIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gMjA7IGkrKykgewogICAgIGFuZ2xlID0gc3RhdGljX2Nhc3Q8VD4ocG93KDEwLCBpIC8gNS4gLSAyKSk7CiAgICAgQiA8PCBzdGQ6OmNvcyhhbmdsZSksIHN0ZDo6c2luKGFuZ2xlKSwgLXN0ZDo6c2luKGFuZ2xlKSwgc3RkOjpjb3MoYW5nbGUpOwogCi0gICAgQyA9IChhbmdsZSpBKS5tYXRyaXhGdW5jdGlvbihleHBmbik7CisgICAgQyA9IChhbmdsZSAqIEEpLm1hdHJpeEZ1bmN0aW9uKGV4cGZuKTsKICAgICBzdGQ6OmNvdXQgPDwgInRlc3QyZFJvdGF0aW9uOiBpID0gIiA8PCBpIDw8ICIgICBlcnJvciBmdW5tID0gIiA8PCByZWxlcnIoQywgQik7CiAgICAgVkVSSUZZKEMuaXNBcHByb3goQiwgc3RhdGljX2Nhc3Q8VD4odG9sKSkpOwogCi0gICAgQyA9IChhbmdsZSpBKS5leHAoKTsKKyAgICBDID0gKGFuZ2xlICogQSkuZXhwKCk7CiAgICAgc3RkOjpjb3V0IDw8ICIgICBlcnJvciBleHBtID0gIiA8PCByZWxlcnIoQywgQikgPDwgIlxuIjsKICAgICBWRVJJRlkoQy5pc0FwcHJveChCLCBzdGF0aWNfY2FzdDxUPih0b2wpKSk7CiAgIH0KIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIHRlc3QyZEh5cGVyYm9saWNSb3RhdGlvbihkb3VibGUgdG9sKQotewotICBNYXRyaXg8c3RkOjpjb21wbGV4PFQ+LDIsMj4gQSwgQiwgQzsKLSAgc3RkOjpjb21wbGV4PFQ+IGltYWdVbml0KDAsMSk7Cit2b2lkIHRlc3QyZEh5cGVyYm9saWNSb3RhdGlvbihkb3VibGUgdG9sKSB7CisgIE1hdHJpeDxzdGQ6OmNvbXBsZXg8VD4sIDIsIDI+IEEsIEIsIEM7CisgIHN0ZDo6Y29tcGxleDxUPiBpbWFnVW5pdCgwLCAxKTsKICAgVCBhbmdsZSwgY2gsIHNoOwogCi0gIGZvciAoaW50IGk9MDsgaTw9MjA7IGkrKykKLSAgewotICAgIGFuZ2xlID0gc3RhdGljX2Nhc3Q8VD4oKGktMTApIC8gMi4wKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gMjA7IGkrKykgeworICAgIGFuZ2xlID0gc3RhdGljX2Nhc3Q8VD4oKGkgLSAxMCkgLyAyLjApOwogICAgIGNoID0gc3RkOjpjb3NoKGFuZ2xlKTsKICAgICBzaCA9IHN0ZDo6c2luaChhbmdsZSk7Ci0gICAgQSA8PCAwLCBhbmdsZSppbWFnVW5pdCwgLWFuZ2xlKmltYWdVbml0LCAwOwotICAgIEIgPDwgY2gsIHNoKmltYWdVbml0LCAtc2gqaW1hZ1VuaXQsIGNoOworICAgIEEgPDwgMCwgYW5nbGUgKiBpbWFnVW5pdCwgLWFuZ2xlICogaW1hZ1VuaXQsIDA7CisgICAgQiA8PCBjaCwgc2ggKiBpbWFnVW5pdCwgLXNoICogaW1hZ1VuaXQsIGNoOwogCiAgICAgQyA9IEEubWF0cml4RnVuY3Rpb24oZXhwZm4pOwogICAgIHN0ZDo6Y291dCA8PCAidGVzdDJkSHlwZXJib2xpY1JvdGF0aW9uOiBpID0gIiA8PCBpIDw8ICIgICBlcnJvciBmdW5tID0gIiA8PCByZWxlcnIoQywgQik7CkBAIC03MSwxOCArNjQsMTQgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkIHRlc3RQYXNjYWwoZG91YmxlIHRvbCkKLXsKLSAgZm9yIChpbnQgc2l6ZT0xOyBzaXplPDIwOyBzaXplKyspCi0gIHsKLSAgICBNYXRyaXg8VCxEeW5hbWljLER5bmFtaWM+IEEoc2l6ZSxzaXplKSwgQihzaXplLHNpemUpLCBDKHNpemUsc2l6ZSk7Cit2b2lkIHRlc3RQYXNjYWwoZG91YmxlIHRvbCkgeworICBmb3IgKGludCBzaXplID0gMTsgc2l6ZSA8IDIwOyBzaXplKyspIHsKKyAgICBNYXRyaXg8VCwgRHluYW1pYywgRHluYW1pYz4gQShzaXplLCBzaXplKSwgQihzaXplLCBzaXplKSwgQyhzaXplLCBzaXplKTsKICAgICBBLnNldFplcm8oKTsKLSAgICBmb3IgKGludCBpPTA7IGk8c2l6ZS0xOyBpKyspCi0gICAgICBBKGkrMSxpKSA9IHN0YXRpY19jYXN0PFQ+KGkrMSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSBBKGkgKyAxLCBpKSA9IHN0YXRpY19jYXN0PFQ+KGkgKyAxKTsKICAgICBCLnNldFplcm8oKTsKLSAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKQotICAgICAgZm9yIChpbnQgaj0wOyBqPD1pOyBqKyspCi0gICAgQihpLGopID0gc3RhdGljX2Nhc3Q8VD4oYmlub20oaSxqKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICBmb3IgKGludCBqID0gMDsgaiA8PSBpOyBqKyspIEIoaSwgaikgPSBzdGF0aWNfY2FzdDxUPihiaW5vbShpLCBqKSk7CiAKICAgICBDID0gQS5tYXRyaXhGdW5jdGlvbihleHBmbik7CiAgICAgc3RkOjpjb3V0IDw8ICJ0ZXN0UGFzY2FsOiBzaXplID0gIiA8PCBzaXplIDw8ICIgICBlcnJvciBmdW5tID0gIiA8PCByZWxlcnIoQywgQik7CkBAIC05NCw5ICs4Myw4IEBACiAgIH0KIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXZvaWQgcmFuZG9tVGVzdChjb25zdCBNYXRyaXhUeXBlJiBtLCBkb3VibGUgdG9sKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHJhbmRvbVRlc3QoY29uc3QgTWF0cml4VHlwZSYgbSwgZG91YmxlIHRvbCkgewogICAvKiB0aGlzIHRlc3QgY292ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXM6CiAgICAgIEludmVyc2UuaAogICAqLwpAQCAtMTA2LDcgKzk0LDcgQEAKIAogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CiAKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CiAgICAgbTEgPSBNYXRyaXhUeXBlOjpSYW5kb20ocm93cywgY29scyk7CiAKICAgICBtMiA9IG0xLm1hdHJpeEZ1bmN0aW9uKGV4cGZuKSAqICgtbTEpLm1hdHJpeEZ1bmN0aW9uKGV4cGZuKTsKQEAgLTExOSwyMyArMTA3LDIyIEBACiAgIH0KIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKG1hdHJpeF9leHBvbmVudGlhbCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChtYXRyaXhfZXhwb25lbnRpYWwpIHsKICAgQ0FMTF9TVUJURVNUXzIodGVzdDJkUm90YXRpb248ZG91YmxlPigxZS0xMykpOwogICBDQUxMX1NVQlRFU1RfMSh0ZXN0MmRSb3RhdGlvbjxmbG9hdD4oMmUtNSkpOyAgLy8gd2FzIDFlLTUsIHJlbGF4ZWQgZm9yIGNsYW5nIDIuOCAvIGxpbnV4IC8geDg2LTY0Ci0gIENBTExfU1VCVEVTVF84KHRlc3QyZFJvdGF0aW9uPGxvbmcgZG91YmxlPigxZS0xMykpOyAKKyAgQ0FMTF9TVUJURVNUXzgodGVzdDJkUm90YXRpb248bG9uZyBkb3VibGU+KDFlLTEzKSk7CiAgIENBTExfU1VCVEVTVF8yKHRlc3QyZEh5cGVyYm9saWNSb3RhdGlvbjxkb3VibGU+KDFlLTE0KSk7CiAgIENBTExfU1VCVEVTVF8xKHRlc3QyZEh5cGVyYm9saWNSb3RhdGlvbjxmbG9hdD4oMWUtNSkpOwogICBDQUxMX1NVQlRFU1RfOCh0ZXN0MmRIeXBlcmJvbGljUm90YXRpb248bG9uZyBkb3VibGU+KDFlLTE0KSk7CiAgIENBTExfU1VCVEVTVF82KHRlc3RQYXNjYWw8ZmxvYXQ+KDFlLTYpKTsKICAgQ0FMTF9TVUJURVNUXzUodGVzdFBhc2NhbDxkb3VibGU+KDFlLTE1KSk7CiAgIENBTExfU1VCVEVTVF8yKHJhbmRvbVRlc3QoTWF0cml4MmQoKSwgMWUtMTMpKTsKLSAgQ0FMTF9TVUJURVNUXzcocmFuZG9tVGVzdChNYXRyaXg8ZG91YmxlLDMsMyxSb3dNYWpvcj4oKSwgMWUtMTMpKTsKKyAgQ0FMTF9TVUJURVNUXzcocmFuZG9tVGVzdChNYXRyaXg8ZG91YmxlLCAzLCAzLCBSb3dNYWpvcj4oKSwgMWUtMTMpKTsKICAgQ0FMTF9TVUJURVNUXzMocmFuZG9tVGVzdChNYXRyaXg0Y2QoKSwgMWUtMTMpKTsKLSAgQ0FMTF9TVUJURVNUXzQocmFuZG9tVGVzdChNYXRyaXhYZCg4LDgpLCAxZS0xMykpOworICBDQUxMX1NVQlRFU1RfNChyYW5kb21UZXN0KE1hdHJpeFhkKDgsIDgpLCAxZS0xMykpOwogICBDQUxMX1NVQlRFU1RfMShyYW5kb21UZXN0KE1hdHJpeDJmKCksIDFlLTQpKTsKICAgQ0FMTF9TVUJURVNUXzUocmFuZG9tVGVzdChNYXRyaXgzY2YoKSwgMWUtNCkpOwogICBDQUxMX1NVQlRFU1RfMShyYW5kb21UZXN0KE1hdHJpeDRmKCksIDFlLTQpKTsKLSAgQ0FMTF9TVUJURVNUXzYocmFuZG9tVGVzdChNYXRyaXhYZig4LDgpLCAxZS00KSk7Ci0gIENBTExfU1VCVEVTVF85KHJhbmRvbVRlc3QoTWF0cml4PGxvbmcgZG91YmxlLER5bmFtaWMsRHluYW1pYz4oNyw3KSwgMWUtMTMpKTsKKyAgQ0FMTF9TVUJURVNUXzYocmFuZG9tVGVzdChNYXRyaXhYZig4LCA4KSwgMWUtNCkpOworICBDQUxMX1NVQlRFU1RfOShyYW5kb21UZXN0KE1hdHJpeDxsb25nIGRvdWJsZSwgRHluYW1pYywgRHluYW1pYz4oNywgNyksIDFlLTEzKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9mdW5jdGlvbi5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9mdW5jdGlvbi5jcHAKaW5kZXggNmQ3NTM3My4uNjU4ODUyNyAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9tYXRyaXhfZnVuY3Rpb24uY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X2Z1bmN0aW9uLmNwcApAQCAtMTQsMjMgKzE0LDIwIEBACiAvLyByZWxhdGl2ZSBlcnJvci4KICNkZWZpbmUgVkVSSUZZX0lTX0FQUFJPWF9BQlMoYSwgYikgVkVSSUZZKHRlc3RfaXNBcHByb3hfYWJzKGEsIGIpKQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlMSwgdHlwZW5hbWUgVHlwZTI+Ci1pbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94X2Ficyhjb25zdCBUeXBlMSYgYSwgY29uc3QgVHlwZTImIGIpCi17Ci0gIHJldHVybiAoKGEtYikuYXJyYXkoKS5hYnMoKSA8IHRlc3RfcHJlY2lzaW9uPHR5cGVuYW1lIFR5cGUxOjpSZWFsU2NhbGFyPigpKS5hbGwoKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlMSwgdHlwZW5hbWUgVHlwZTI+CitpbmxpbmUgYm9vbCB0ZXN0X2lzQXBwcm94X2Ficyhjb25zdCBUeXBlMSYgYSwgY29uc3QgVHlwZTImIGIpIHsKKyAgcmV0dXJuICgoYSAtIGIpLmFycmF5KCkuYWJzKCkgPCB0ZXN0X3ByZWNpc2lvbjx0eXBlbmFtZSBUeXBlMTo6UmVhbFNjYWxhcj4oKSkuYWxsKCk7CiB9CiAKLQogLy8gUmV0dXJucyBhIG1hdHJpeCB3aXRoIGVpZ2VudmFsdWVzIGNsdXN0ZXJlZCBhcm91bmQgMCwgMSBhbmQgMi4KLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci1NYXRyaXhUeXBlIHJhbmRvbU1hdHJpeFdpdGhSZWFsRWl2YWxzKGNvbnN0IEluZGV4IHNpemUpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK01hdHJpeFR5cGUgcmFuZG9tTWF0cml4V2l0aFJlYWxFaXZhbHMoY29uc3QgSW5kZXggc2l6ZSkgewogICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOwogICBNYXRyaXhUeXBlIGRpYWcgPSBNYXRyaXhUeXBlOjpaZXJvKHNpemUsIHNpemUpOwogICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgZGlhZyhpLCBpKSA9IFNjYWxhcihSZWFsU2NhbGFyKGludGVybmFsOjpyYW5kb208aW50PigwLDIpKSkKLSAgICAgICsgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgKiBTY2FsYXIoUmVhbFNjYWxhcigwLjAxKSk7CisgICAgZGlhZyhpLCBpKSA9CisgICAgICAgIFNjYWxhcihSZWFsU2NhbGFyKGludGVybmFsOjpyYW5kb208aW50PigwLCAyKSkpICsgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCkgKiBTY2FsYXIoUmVhbFNjYWxhcigwLjAxKSk7CiAgIH0KICAgTWF0cml4VHlwZSBBID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOwogICBIb3VzZWhvbGRlclFSPE1hdHJpeFR5cGU+IFFSb2ZBKEEpOwpAQCAtMzgsMzAgKzM1LDI3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgSXNDb21wbGV4ID0gTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhcj46OklzQ29tcGxleD4KLXN0cnVjdCByYW5kb21NYXRyaXhXaXRoSW1hZ0VpdmFscwoteworc3RydWN0IHJhbmRvbU1hdHJpeFdpdGhJbWFnRWl2YWxzIHsKICAgLy8gUmV0dXJucyBhIG1hdHJpeCB3aXRoIGVpZ2VudmFsdWVzIGNsdXN0ZXJlZCBhcm91bmQgMCBhbmQgKy8tIGkuCiAgIHN0YXRpYyBNYXRyaXhUeXBlIHJ1bihjb25zdCBJbmRleCBzaXplKTsKIH07CiAKIC8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIHJlYWwgbWF0cmljZXMKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci1zdHJ1Y3QgcmFuZG9tTWF0cml4V2l0aEltYWdFaXZhbHM8TWF0cml4VHlwZSwgMD4KLXsKLSAgc3RhdGljIE1hdHJpeFR5cGUgcnVuKGNvbnN0IEluZGV4IHNpemUpCi0gIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgorc3RydWN0IHJhbmRvbU1hdHJpeFdpdGhJbWFnRWl2YWxzPE1hdHJpeFR5cGUsIDA+IHsKKyAgc3RhdGljIE1hdHJpeFR5cGUgcnVuKGNvbnN0IEluZGV4IHNpemUpIHsKICAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlNjYWxhciBTY2FsYXI7CiAgICAgTWF0cml4VHlwZSBkaWFnID0gTWF0cml4VHlwZTo6WmVybyhzaXplLCBzaXplKTsKICAgICBJbmRleCBpID0gMDsKICAgICB3aGlsZSAoaSA8IHNpemUpIHsKICAgICAgIEluZGV4IHJhbmRvbUludCA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KC0xLCAxKTsKLSAgICAgIGlmIChyYW5kb21JbnQgPT0gMCB8fCBpID09IHNpemUtMSkgeworICAgICAgaWYgKHJhbmRvbUludCA9PSAwIHx8IGkgPT0gc2l6ZSAtIDEpIHsKICAgICAgICAgZGlhZyhpLCBpKSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKDAuMDEpOwogICAgICAgICArK2k7CiAgICAgICB9IGVsc2UgewogICAgICAgICBTY2FsYXIgYWxwaGEgPSBTY2FsYXIocmFuZG9tSW50KSArIGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKDAuMDEpOwotICAgICAgICBkaWFnKGksIGkrMSkgPSBhbHBoYTsKLSAgICAgICAgZGlhZyhpKzEsIGkpID0gLWFscGhhOworICAgICAgICBkaWFnKGksIGkgKyAxKSA9IGFscGhhOworICAgICAgICBkaWFnKGkgKyAxLCBpKSA9IC1hbHBoYTsKICAgICAgICAgaSArPSAyOwogICAgICAgfQogICAgIH0KQEAgLTcyLDE4ICs2NiwxNiBAQAogfTsKIAogLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgY29tcGxleCBtYXRyaWNlcwotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXN0cnVjdCByYW5kb21NYXRyaXhXaXRoSW1hZ0VpdmFsczxNYXRyaXhUeXBlLCAxPgotewotICBzdGF0aWMgTWF0cml4VHlwZSBydW4oY29uc3QgSW5kZXggc2l6ZSkKLSAgewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+CitzdHJ1Y3QgcmFuZG9tTWF0cml4V2l0aEltYWdFaXZhbHM8TWF0cml4VHlwZSwgMT4geworICBzdGF0aWMgTWF0cml4VHlwZSBydW4oY29uc3QgSW5kZXggc2l6ZSkgewogICAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6U2NhbGFyIFNjYWxhcjsKICAgICB0eXBlZGVmIHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKICAgICBjb25zdCBTY2FsYXIgaW1hZ1VuaXQoMCwgMSk7CiAgICAgTWF0cml4VHlwZSBkaWFnID0gTWF0cml4VHlwZTo6WmVybyhzaXplLCBzaXplKTsKICAgICBmb3IgKEluZGV4IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICBkaWFnKGksIGkpID0gU2NhbGFyKFJlYWxTY2FsYXIoaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oLTEsIDEpKSkgKiBpbWFnVW5pdAotICAgICAgICArIGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKFJlYWxTY2FsYXIoMC4wMSkpOworICAgICAgZGlhZyhpLCBpKSA9IFNjYWxhcihSZWFsU2NhbGFyKGludGVybmFsOjpyYW5kb208SW5kZXg+KC0xLCAxKSkpICogaW1hZ1VuaXQgKworICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208U2NhbGFyPigpICogU2NhbGFyKFJlYWxTY2FsYXIoMC4wMSkpOwogICAgIH0KICAgICBNYXRyaXhUeXBlIEEgPSBNYXRyaXhUeXBlOjpSYW5kb20oc2l6ZSwgc2l6ZSk7CiAgICAgSG91c2Vob2xkZXJRUjxNYXRyaXhUeXBlPiBRUm9mQShBKTsKQEAgLTkxLDEwICs4Myw4IEBACiAgIH0KIH07CiAKLQotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXZvaWQgdGVzdE1hdHJpeEV4cG9uZW50aWFsKGNvbnN0IE1hdHJpeFR5cGUmIEEpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdGVzdE1hdHJpeEV4cG9uZW50aWFsKGNvbnN0IE1hdHJpeFR5cGUmIEEpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CiAgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXhTY2FsYXI7CkBAIC0xMDIsOSArOTIsOCBAQAogICBWRVJJRllfSVNfQVBQUk9YKEEuZXhwKCksIEEubWF0cml4RnVuY3Rpb24oaW50ZXJuYWw6OnN0ZW1fZnVuY3Rpb25fZXhwPENvbXBsZXhTY2FsYXI+KSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIHRlc3RNYXRyaXhMb2dhcml0aG0oY29uc3QgTWF0cml4VHlwZSYgQSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0TWF0cml4TG9nYXJpdGhtKGNvbnN0IE1hdHJpeFR5cGUmIEEpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CiAKQEAgLTEyMSw1MSArMTEwLDQ3IEBACiAgIFZFUklGWV9JU19BUFBST1gobG9nRXhwQSwgc2NhbGVkQSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIHRlc3RIeXBlcmJvbGljRnVuY3Rpb25zKGNvbnN0IE1hdHJpeFR5cGUmIEEpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdGVzdEh5cGVyYm9saWNGdW5jdGlvbnMoY29uc3QgTWF0cml4VHlwZSYgQSkgewogICAvLyBOZWVkIHRvIHVzZSBhYnNvbHV0ZSBlcnJvciBiZWNhdXNlIG9mIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiB3aGVuCiAgIC8vIGFkZGluZy9zdWJ0cmFjdGluZyBleHBBIGFuZCBleHBtQS4KICAgVkVSSUZZX0lTX0FQUFJPWF9BQlMoQS5zaW5oKCksIChBLmV4cCgpIC0gKC1BKS5leHAoKSkgLyAyKTsKICAgVkVSSUZZX0lTX0FQUFJPWF9BQlMoQS5jb3NoKCksIChBLmV4cCgpICsgKC1BKS5leHAoKSkgLyAyKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXZvaWQgdGVzdEdvbmlvRnVuY3Rpb25zKGNvbnN0IE1hdHJpeFR5cGUmIEEpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdGVzdEdvbmlvRnVuY3Rpb25zKGNvbnN0IE1hdHJpeFR5cGUmIEEpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIE51bVRyYWl0czxTY2FsYXI+OjpSZWFsIFJlYWxTY2FsYXI7CiAgIHR5cGVkZWYgc3RkOjpjb21wbGV4PFJlYWxTY2FsYXI+IENvbXBsZXhTY2FsYXI7Ci0gIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCAKLSAgICAgICAgICAgICAgICAgTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUsIE1hdHJpeFR5cGU6Ok9wdGlvbnM+IENvbXBsZXhNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PENvbXBsZXhTY2FsYXIsIE1hdHJpeFR5cGU6OlJvd3NBdENvbXBpbGVUaW1lLCBNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZSwgTWF0cml4VHlwZTo6T3B0aW9ucz4KKyAgICAgIENvbXBsZXhNYXRyaXg7CiAKLSAgQ29tcGxleFNjYWxhciBpbWFnVW5pdCgwLDEpOwotICBDb21wbGV4U2NhbGFyIHR3bygyLDApOworICBDb21wbGV4U2NhbGFyIGltYWdVbml0KDAsIDEpOworICBDb21wbGV4U2NhbGFyIHR3bygyLCAwKTsKIAogICBDb21wbGV4TWF0cml4IEFjID0gQS50ZW1wbGF0ZSBjYXN0PENvbXBsZXhTY2FsYXI+KCk7Ci0gIAorCiAgIENvbXBsZXhNYXRyaXggZXhwX2lBID0gKGltYWdVbml0ICogQWMpLmV4cCgpOwogICBDb21wbGV4TWF0cml4IGV4cF9taUEgPSAoLWltYWdVbml0ICogQWMpLmV4cCgpOwotICAKKwogICBDb21wbGV4TWF0cml4IHNpbkFjID0gQS5zaW4oKS50ZW1wbGF0ZSBjYXN0PENvbXBsZXhTY2FsYXI+KCk7Ci0gIFZFUklGWV9JU19BUFBST1hfQUJTKHNpbkFjLCAoZXhwX2lBIC0gZXhwX21pQSkgLyAodHdvKmltYWdVbml0KSk7Ci0gIAorICBWRVJJRllfSVNfQVBQUk9YX0FCUyhzaW5BYywgKGV4cF9pQSAtIGV4cF9taUEpIC8gKHR3byAqIGltYWdVbml0KSk7CisKICAgQ29tcGxleE1hdHJpeCBjb3NBYyA9IEEuY29zKCkudGVtcGxhdGUgY2FzdDxDb21wbGV4U2NhbGFyPigpOwogICBWRVJJRllfSVNfQVBQUk9YX0FCUyhjb3NBYywgKGV4cF9pQSArIGV4cF9taUEpIC8gMik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIHRlc3RNYXRyaXgoY29uc3QgTWF0cml4VHlwZSYgQSkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0TWF0cml4KGNvbnN0IE1hdHJpeFR5cGUmIEEpIHsKICAgdGVzdE1hdHJpeEV4cG9uZW50aWFsKEEpOwogICB0ZXN0TWF0cml4TG9nYXJpdGhtKEEpOwogICB0ZXN0SHlwZXJib2xpY0Z1bmN0aW9ucyhBKTsKICAgdGVzdEdvbmlvRnVuY3Rpb25zKEEpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCB0ZXN0TWF0cml4VHlwZShjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRlc3RNYXRyaXhUeXBlKGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgLy8gTWF0cmljZXMgd2l0aCBjbHVzdGVyZWQgZWlnZW52YWx1ZSBsZWFkIHRvIGRpZmZlcmVudCBjb2RlIHBhdGhzCiAgIC8vIGluIE1hdHJpeEZ1bmN0aW9uLmggYW5kIGFyZSB0aHVzIHVzZWZ1bCBmb3IgdGVzdGluZy4KIApAQCAtMTc3LDI3ICsxNjIsMjcgQEAKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCB0ZXN0TWFwUmVmKGNvbnN0IE1hdHJpeFR5cGUmIEEpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdGVzdE1hcFJlZihjb25zdCBNYXRyaXhUeXBlJiBBKSB7CiAgIC8vIFRlc3QgaWYgcGFzc2luZyBSZWYgYW5kIE1hcCBvYmplY3RzIGlzIHBvc3NpYmxlCiAgIC8vIChSZWdyZXNzaW9uIHRlc3QgZm9yIEJ1ZyAjMTc5NikKICAgSW5kZXggc2l6ZSA9IEEucm93cygpOwotICBNYXRyaXhUeXBlIFg7IFguc2V0UmFuZG9tKHNpemUsIHNpemUpOwotICBNYXRyaXhUeXBlIFkoc2l6ZSxzaXplKTsKLSAgUmVmPCAgICAgIE1hdHJpeFR5cGU+IFIoWSk7CisgIE1hdHJpeFR5cGUgWDsKKyAgWC5zZXRSYW5kb20oc2l6ZSwgc2l6ZSk7CisgIE1hdHJpeFR5cGUgWShzaXplLCBzaXplKTsKKyAgUmVmPE1hdHJpeFR5cGU+IFIoWSk7CiAgIFJlZjxjb25zdCBNYXRyaXhUeXBlPiBSYyhYKTsKLSAgTWFwPCAgICAgIE1hdHJpeFR5cGU+IE0oWS5kYXRhKCksIHNpemUsIHNpemUpOworICBNYXA8TWF0cml4VHlwZT4gTShZLmRhdGEoKSwgc2l6ZSwgc2l6ZSk7CiAgIE1hcDxjb25zdCBNYXRyaXhUeXBlPiBNYyhYLmRhdGEoKSwgc2l6ZSwgc2l6ZSk7CiAKLSAgWCA9IFgqWDsgLy8gbWFrZSBzdXJlIHNxcnQgaXMgcG9zc2libGUKKyAgWCA9IFggKiBYOyAgLy8gbWFrZSBzdXJlIHNxcnQgaXMgcG9zc2libGUKICAgWSA9IFguc3FydCgpOwogICBSID0gUmMuc3FydCgpOwogICBNID0gTWMuc3FydCgpOwogICBZID0gWC5leHAoKTsKICAgUiA9IFJjLmV4cCgpOwogICBNID0gTWMuZXhwKCk7Ci0gIFggPSBZOyAvLyBtYWtlIHN1cmUgbG9nIGlzIHBvc3NpYmxlCisgIFggPSBZOyAgLy8gbWFrZSBzdXJlIGxvZyBpcyBwb3NzaWJsZQogICBZID0gWC5sb2coKTsKICAgUiA9IFJjLmxvZygpOwogICBNID0gTWMubG9nKCk7CkBAIC0yMDksMTkgKzE5NCwxNyBAQAogICBZID0gWC5zaW5oKCkgKyBSYy5zaW5oKCkgKyBNYy5zaW5oKCk7CiB9CiAKLQotRUlHRU5fREVDTEFSRV9URVNUKG1hdHJpeF9mdW5jdGlvbikKLXsKLSAgQ0FMTF9TVUJURVNUXzEodGVzdE1hdHJpeFR5cGUoTWF0cml4PGZsb2F0LDEsMT4oKSkpOworRUlHRU5fREVDTEFSRV9URVNUKG1hdHJpeF9mdW5jdGlvbikgeworICBDQUxMX1NVQlRFU1RfMSh0ZXN0TWF0cml4VHlwZShNYXRyaXg8ZmxvYXQsIDEsIDE+KCkpKTsKICAgQ0FMTF9TVUJURVNUXzIodGVzdE1hdHJpeFR5cGUoTWF0cml4M2NmKCkpKTsKLSAgQ0FMTF9TVUJURVNUXzModGVzdE1hdHJpeFR5cGUoTWF0cml4WGYoOCw4KSkpOworICBDQUxMX1NVQlRFU1RfMyh0ZXN0TWF0cml4VHlwZShNYXRyaXhYZig4LCA4KSkpOwogICBDQUxMX1NVQlRFU1RfNCh0ZXN0TWF0cml4VHlwZShNYXRyaXgyZCgpKSk7Ci0gIENBTExfU1VCVEVTVF81KHRlc3RNYXRyaXhUeXBlKE1hdHJpeDxkb3VibGUsNSw1LFJvd01ham9yPigpKSk7CisgIENBTExfU1VCVEVTVF81KHRlc3RNYXRyaXhUeXBlKE1hdHJpeDxkb3VibGUsIDUsIDUsIFJvd01ham9yPigpKSk7CiAgIENBTExfU1VCVEVTVF82KHRlc3RNYXRyaXhUeXBlKE1hdHJpeDRjZCgpKSk7Ci0gIENBTExfU1VCVEVTVF83KHRlc3RNYXRyaXhUeXBlKE1hdHJpeFhkKDEzLDEzKSkpOworICBDQUxMX1NVQlRFU1RfNyh0ZXN0TWF0cml4VHlwZShNYXRyaXhYZCgxMywgMTMpKSk7CiAKLSAgQ0FMTF9TVUJURVNUXzEodGVzdE1hcFJlZihNYXRyaXg8ZmxvYXQsMSwxPigpKSk7CisgIENBTExfU1VCVEVTVF8xKHRlc3RNYXBSZWYoTWF0cml4PGZsb2F0LCAxLCAxPigpKSk7CiAgIENBTExfU1VCVEVTVF8yKHRlc3RNYXBSZWYoTWF0cml4M2NmKCkpKTsKLSAgQ0FMTF9TVUJURVNUXzModGVzdE1hcFJlZihNYXRyaXhYZig4LDgpKSk7Ci0gIENBTExfU1VCVEVTVF83KHRlc3RNYXBSZWYoTWF0cml4WGQoMTMsMTMpKSk7CisgIENBTExfU1VCVEVTVF8zKHRlc3RNYXBSZWYoTWF0cml4WGYoOCwgOCkpKTsKKyAgQ0FMTF9TVUJURVNUXzcodGVzdE1hcFJlZihNYXRyaXhYZCgxMywgMTMpKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9mdW5jdGlvbnMuaCBiL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X2Z1bmN0aW9ucy5oCmluZGV4IDRlMjYzNjQuLmNkNWI5MDggMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X2Z1bmN0aW9ucy5oCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X2Z1bmN0aW9ucy5oCkBAIC0xMSwyNCArMTEsMjAgQEAKICNpbmNsdWRlIDx1bnN1cHBvcnRlZC9FaWdlbi9NYXRyaXhGdW5jdGlvbnM+CiAKIC8vIEZvciBjb21wbGV4IG1hdHJpY2VzLCBhbnkgbWF0cml4IGlzIGZpbmUuCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlLCBpbnQgSXNDb21wbGV4ID0gTnVtVHJhaXRzPHR5cGVuYW1lIGludGVybmFsOjp0cmFpdHM8TWF0cml4VHlwZT46OlNjYWxhcj46OklzQ29tcGxleD4KLXN0cnVjdCBwcm9jZXNzVHJpYW5ndWxhck1hdHJpeAotewotICBzdGF0aWMgdm9pZCBydW4oTWF0cml4VHlwZSYsIE1hdHJpeFR5cGUmLCBjb25zdCBNYXRyaXhUeXBlJikKLSAgeyB9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZSwgaW50IElzQ29tcGxleCA9IE51bVRyYWl0czx0eXBlbmFtZSBpbnRlcm5hbDo6dHJhaXRzPE1hdHJpeFR5cGU+OjpTY2FsYXI+OjpJc0NvbXBsZXg+CitzdHJ1Y3QgcHJvY2Vzc1RyaWFuZ3VsYXJNYXRyaXggeworICBzdGF0aWMgdm9pZCBydW4oTWF0cml4VHlwZSYsIE1hdHJpeFR5cGUmLCBjb25zdCBNYXRyaXhUeXBlJikge30KIH07CiAKIC8vIEZvciByZWFsIG1hdHJpY2VzLCBtYWtlIHN1cmUgbm9uZSBvZiB0aGUgZWlnZW52YWx1ZXMgYXJlIG5lZ2F0aXZlLgotdGVtcGxhdGU8dHlwZW5hbWUgTWF0cml4VHlwZT4KLXN0cnVjdCBwcm9jZXNzVHJpYW5ndWxhck1hdHJpeDxNYXRyaXhUeXBlLDA+Ci17Ci0gIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiBtLCBNYXRyaXhUeXBlJiBULCBjb25zdCBNYXRyaXhUeXBlJiBVKQotICB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3N0cnVjdCBwcm9jZXNzVHJpYW5ndWxhck1hdHJpeDxNYXRyaXhUeXBlLCAwPiB7CisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiBtLCBNYXRyaXhUeXBlJiBULCBjb25zdCBNYXRyaXhUeXBlJiBVKSB7CiAgICAgY29uc3QgSW5kZXggc2l6ZSA9IG0uY29scygpOwogCi0gICAgZm9yIChJbmRleCBpPTA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgIGlmIChpID09IHNpemUgLSAxIHx8IFQuY29lZmYoaSsxLGkpID09IDApCi0gICAgICAgIFQuY29lZmZSZWYoaSxpKSA9IHN0ZDo6YWJzKFQuY29lZmYoaSxpKSk7CisgICAgZm9yIChJbmRleCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgaWYgKGkgPT0gc2l6ZSAtIDEgfHwgVC5jb2VmZihpICsgMSwgaSkgPT0gMCkKKyAgICAgICAgVC5jb2VmZlJlZihpLCBpKSA9IHN0ZDo6YWJzKFQuY29lZmYoaSwgaSkpOwogICAgICAgZWxzZQogICAgICAgICArK2k7CiAgICAgfQpAQCAtNDAsMTAgKzM2LDggQEAKIHN0cnVjdCBnZW5lcmF0ZVRlc3RNYXRyaXg7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgotc3RydWN0IGdlbmVyYXRlVGVzdE1hdHJpeDxNYXRyaXhUeXBlLDA+Ci17Ci0gIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiByZXN1bHQsIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHNpemUpCi0gIHsKK3N0cnVjdCBnZW5lcmF0ZVRlc3RNYXRyaXg8TWF0cml4VHlwZSwgMD4geworICBzdGF0aWMgdm9pZCBydW4oTWF0cml4VHlwZSYgcmVzdWx0LCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpJbmRleCBzaXplKSB7CiAgICAgcmVzdWx0ID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOwogICAgIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiBzY2h1cihyZXN1bHQpOwogICAgIE1hdHJpeFR5cGUgVCA9IHNjaHVyLm1hdHJpeFQoKTsKQEAgLTUyLDE2ICs0NiwxMSBAQAogfTsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci1zdHJ1Y3QgZ2VuZXJhdGVUZXN0TWF0cml4PE1hdHJpeFR5cGUsMT4KLXsKLSAgc3RhdGljIHZvaWQgcnVuKE1hdHJpeFR5cGUmIHJlc3VsdCwgdHlwZW5hbWUgTWF0cml4VHlwZTo6SW5kZXggc2l6ZSkKLSAgewotICAgIHJlc3VsdCA9IE1hdHJpeFR5cGU6OlJhbmRvbShzaXplLCBzaXplKTsKLSAgfQorc3RydWN0IGdlbmVyYXRlVGVzdE1hdHJpeDxNYXRyaXhUeXBlLCAxPiB7CisgIHN0YXRpYyB2b2lkIHJ1bihNYXRyaXhUeXBlJiByZXN1bHQsIHR5cGVuYW1lIE1hdHJpeFR5cGU6OkluZGV4IHNpemUpIHsgcmVzdWx0ID0gTWF0cml4VHlwZTo6UmFuZG9tKHNpemUsIHNpemUpOyB9CiB9OwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZCwgdHlwZW5hbWUgT3RoZXJEZXJpdmVkPgotdHlwZW5hbWUgRGVyaXZlZDo6UmVhbFNjYWxhciByZWxlcnIoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgQSwgY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBCKQotewordHlwZW5hbWUgRGVyaXZlZDo6UmVhbFNjYWxhciByZWxlcnIoY29uc3QgTWF0cml4QmFzZTxEZXJpdmVkPiYgQSwgY29uc3QgTWF0cml4QmFzZTxPdGhlckRlcml2ZWQ+JiBCKSB7CiAgIHJldHVybiBzdGQ6OnNxcnQoKEEgLSBCKS5jd2lzZUFiczIoKS5zdW0oKSAvIChzdGQ6Om1pbikoQS5jd2lzZUFiczIoKS5zdW0oKSwgQi5jd2lzZUFiczIoKS5zdW0oKSkpOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9tYXRyaXhfcG93ZXIuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9tYXRyaXhfcG93ZXIuY3BwCmluZGV4IGIxM2ViNWEuLmUxN2QzNWEgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X3Bvd2VyLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9wb3dlci5jcHAKQEAgLTksNzEgKzksNjcgQEAKIAogI2luY2x1ZGUgIm1hdHJpeF9mdW5jdGlvbnMuaCIKIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXZvaWQgdGVzdDJkUm90YXRpb24oY29uc3QgVCYgdG9sKQotewotICBNYXRyaXg8VCwyLDI+IEEsIEIsIEM7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdGVzdDJkUm90YXRpb24oY29uc3QgVCYgdG9sKSB7CisgIE1hdHJpeDxULCAyLCAyPiBBLCBCLCBDOwogICBUIGFuZ2xlLCBjLCBzOwogCiAgIEEgPDwgMCwgMSwgLTEsIDA7Ci0gIE1hdHJpeFBvd2VyPE1hdHJpeDxULDIsMj4gPiBBcG93KEEpOworICBNYXRyaXhQb3dlcjxNYXRyaXg8VCwgMiwgMj4gPiBBcG93KEEpOwogCi0gIGZvciAoaW50IGk9MDsgaTw9MjA7ICsraSkgewotICAgIGFuZ2xlID0gc3RkOjpwb3coVCgxMCksIFQoaS0xMCkgLyBUKDUuKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IDIwOyArK2kpIHsKKyAgICBhbmdsZSA9IHN0ZDo6cG93KFQoMTApLCBUKGkgLSAxMCkgLyBUKDUuKSk7CiAgICAgYyA9IHN0ZDo6Y29zKGFuZ2xlKTsKICAgICBzID0gc3RkOjpzaW4oYW5nbGUpOwogICAgIEIgPDwgYywgcywgLXMsIGM7CiAKLSAgICBDID0gQXBvdyhzdGQ6OmxkZXhwKGFuZ2xlLDEpIC8gVChFSUdFTl9QSSkpOwotICAgIHN0ZDo6Y291dCA8PCAidGVzdDJkUm90YXRpb246IGkgPSAiIDw8IGkgPDwgIiAgIGVycm9yIHBvd2VybSA9ICIgPDwgcmVsZXJyKEMsQikgPDwgJ1xuJzsKKyAgICBDID0gQXBvdyhzdGQ6OmxkZXhwKGFuZ2xlLCAxKSAvIFQoRUlHRU5fUEkpKTsKKyAgICBzdGQ6OmNvdXQgPDwgInRlc3QyZFJvdGF0aW9uOiBpID0gIiA8PCBpIDw8ICIgICBlcnJvciBwb3dlcm0gPSAiIDw8IHJlbGVycihDLCBCKSA8PCAnXG4nOwogICAgIFZFUklGWShDLmlzQXBwcm94KEIsIHRvbCkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci12b2lkIHRlc3QyZEh5cGVyYm9saWNSb3RhdGlvbihjb25zdCBUJiB0b2wpCi17Ci0gIE1hdHJpeDxzdGQ6OmNvbXBsZXg8VD4sMiwyPiBBLCBCLCBDOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3QyZEh5cGVyYm9saWNSb3RhdGlvbihjb25zdCBUJiB0b2wpIHsKKyAgTWF0cml4PHN0ZDo6Y29tcGxleDxUPiwgMiwgMj4gQSwgQiwgQzsKICAgVCBhbmdsZSwgY2ggPSBzdGQ6OmNvc2goKFQpMSk7CiAgIHN0ZDo6Y29tcGxleDxUPiBpc2goMCwgc3RkOjpzaW5oKChUKTEpKTsKIAogICBBIDw8IGNoLCBpc2gsIC1pc2gsIGNoOwotICBNYXRyaXhQb3dlcjxNYXRyaXg8c3RkOjpjb21wbGV4PFQ+LDIsMj4gPiBBcG93KEEpOworICBNYXRyaXhQb3dlcjxNYXRyaXg8c3RkOjpjb21wbGV4PFQ+LCAyLCAyPiA+IEFwb3coQSk7CiAKLSAgZm9yIChpbnQgaT0wOyBpPD0yMDsgKytpKSB7Ci0gICAgYW5nbGUgPSBzdGQ6OmxkZXhwKHN0YXRpY19jYXN0PFQ+KGktMTApLCAtMSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IDIwOyArK2kpIHsKKyAgICBhbmdsZSA9IHN0ZDo6bGRleHAoc3RhdGljX2Nhc3Q8VD4oaSAtIDEwKSwgLTEpOwogICAgIGNoID0gc3RkOjpjb3NoKGFuZ2xlKTsKICAgICBpc2ggPSBzdGQ6OmNvbXBsZXg8VD4oMCwgc3RkOjpzaW5oKGFuZ2xlKSk7CiAgICAgQiA8PCBjaCwgaXNoLCAtaXNoLCBjaDsKIAogICAgIEMgPSBBcG93KGFuZ2xlKTsKLSAgICBzdGQ6OmNvdXQgPDwgInRlc3QyZEh5cGVyYm9saWNSb3RhdGlvbjogaSA9ICIgPDwgaSA8PCAiICAgZXJyb3IgcG93ZXJtID0gIiA8PCByZWxlcnIoQyxCKSA8PCAnXG4nOworICAgIHN0ZDo6Y291dCA8PCAidGVzdDJkSHlwZXJib2xpY1JvdGF0aW9uOiBpID0gIiA8PCBpIDw8ICIgICBlcnJvciBwb3dlcm0gPSAiIDw8IHJlbGVycihDLCBCKSA8PCAnXG4nOwogICAgIFZFUklGWShDLmlzQXBwcm94KEIsIHRvbCkpOwogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci12b2lkIHRlc3QzZFJvdGF0aW9uKGNvbnN0IFQmIHRvbCkKLXsKLSAgTWF0cml4PFQsMywxPiB2OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3QzZFJvdGF0aW9uKGNvbnN0IFQmIHRvbCkgeworICBNYXRyaXg8VCwgMywgMT4gdjsKICAgVCBhbmdsZTsKIAotICBmb3IgKGludCBpPTA7IGk8PTIwOyArK2kpIHsKLSAgICB2ID0gTWF0cml4PFQsMywxPjo6UmFuZG9tKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IDIwOyArK2kpIHsKKyAgICB2ID0gTWF0cml4PFQsIDMsIDE+OjpSYW5kb20oKTsKICAgICB2Lm5vcm1hbGl6ZSgpOwotICAgIGFuZ2xlID0gc3RkOjpwb3coVCgxMCksIFQoaS0xMCkgLyBUKDUuKSk7Ci0gICAgVkVSSUZZKEFuZ2xlQXhpczxUPihhbmdsZSwgdikubWF0cml4KCkuaXNBcHByb3goQW5nbGVBeGlzPFQ+KDEsdikubWF0cml4KCkucG93KGFuZ2xlKSwgdG9sKSk7CisgICAgYW5nbGUgPSBzdGQ6OnBvdyhUKDEwKSwgVChpIC0gMTApIC8gVCg1LikpOworICAgIFZFUklGWShBbmdsZUF4aXM8VD4oYW5nbGUsIHYpLm1hdHJpeCgpLmlzQXBwcm94KEFuZ2xlQXhpczxUPigxLCB2KS5tYXRyaXgoKS5wb3coYW5nbGUpLCB0b2wpKTsKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCB0ZXN0R2VuZXJhbChjb25zdCBNYXRyaXhUeXBlJiBtLCBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyJiB0b2wpCi17Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KK3ZvaWQgdGVzdEdlbmVyYWwoY29uc3QgTWF0cml4VHlwZSYgbSwgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciYgdG9sKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciBSZWFsU2NhbGFyOwogICBNYXRyaXhUeXBlIG0xLCBtMiwgbTMsIG00LCBtNTsKICAgUmVhbFNjYWxhciB4LCB5OwogCi0gIGZvciAoaW50IGk9MDsgaSA8IGdfcmVwZWF0OyArK2kpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgKytpKSB7CiAgICAgZ2VuZXJhdGVUZXN0TWF0cml4PE1hdHJpeFR5cGU+OjpydW4obTEsIG0ucm93cygpKTsKICAgICBNYXRyaXhQb3dlcjxNYXRyaXhUeXBlPiBtcG93KG0xKTsKIApAQCAtODIsMTEgKzc4LDExIEBACiAgICAgbTIgPSBtcG93KHgpOwogICAgIG0zID0gbXBvdyh5KTsKIAotICAgIG00ID0gbXBvdyh4K3kpOworICAgIG00ID0gbXBvdyh4ICsgeSk7CiAgICAgbTUubm9hbGlhcygpID0gbTIgKiBtMzsKICAgICBWRVJJRlkobTQuaXNBcHByb3gobTUsIHRvbCkpOwogCi0gICAgbTQgPSBtcG93KHgqeSk7CisgICAgbTQgPSBtcG93KHggKiB5KTsKICAgICBtNSA9IG0yLnBvdyh5KTsKICAgICBWRVJJRlkobTQuaXNBcHByb3gobTUsIHRvbCkpOwogCkBAIC05NiwxOSArOTIsMTggQEAKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCB0ZXN0U2luZ3VsYXIoY29uc3QgTWF0cml4VHlwZSYgbV9jb25zdCwgY29uc3QgdHlwZW5hbWUgTWF0cml4VHlwZTo6UmVhbFNjYWxhciYgdG9sKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRlc3RTaW5ndWxhcihjb25zdCBNYXRyaXhUeXBlJiBtX2NvbnN0LCBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyJiB0b2wpIHsKICAgLy8gd2UgbmVlZCB0byBwYXNzIGJ5IHJlZmVyZW5jZSBpbiBvcmRlciB0byBwcmV2ZW50IGVycm9ycyB3aXRoCiAgIC8vIE1TVkMgZm9yIGFsaWduZWQgZGF0YSB0eXBlcyAuLi4KICAgTWF0cml4VHlwZSYgbSA9IGNvbnN0X2Nhc3Q8TWF0cml4VHlwZSY+KG1fY29uc3QpOwogCiAgIGNvbnN0IGludCBJc0NvbXBsZXggPSBOdW1UcmFpdHM8dHlwZW5hbWUgaW50ZXJuYWw6OnRyYWl0czxNYXRyaXhUeXBlPjo6U2NhbGFyPjo6SXNDb21wbGV4OwotICB0eXBlZGVmIHN0ZDo6Y29uZGl0aW9uYWxfdDxJc0NvbXBsZXgsIFRyaWFuZ3VsYXJWaWV3PE1hdHJpeFR5cGUsVXBwZXI+LCBjb25zdCBNYXRyaXhUeXBlJj4gVHJpYW5ndWxhclR5cGU7Ci0gIHN0ZDo6Y29uZGl0aW9uYWxfdDwgSXNDb21wbGV4LCBDb21wbGV4U2NodXI8TWF0cml4VHlwZT4sIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiA+IHNjaHVyOworICB0eXBlZGVmIHN0ZDo6Y29uZGl0aW9uYWxfdDxJc0NvbXBsZXgsIFRyaWFuZ3VsYXJWaWV3PE1hdHJpeFR5cGUsIFVwcGVyPiwgY29uc3QgTWF0cml4VHlwZSY+IFRyaWFuZ3VsYXJUeXBlOworICBzdGQ6OmNvbmRpdGlvbmFsX3Q8SXNDb21wbGV4LCBDb21wbGV4U2NodXI8TWF0cml4VHlwZT4sIFJlYWxTY2h1cjxNYXRyaXhUeXBlPiA+IHNjaHVyOwogICBNYXRyaXhUeXBlIFQ7CiAKLSAgZm9yIChpbnQgaT0wOyBpIDwgZ19yZXBlYXQ7ICsraSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyArK2kpIHsKICAgICBtLnNldFJhbmRvbSgpOwogICAgIG0uY29sKDApLmZpbGwoMCk7CiAKQEAgLTEyOSw5ICsxMjQsOCBAQAogICB9CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIE1hdHJpeFR5cGU+Ci12b2lkIHRlc3RMb2dUaGVuRXhwKGNvbnN0IE1hdHJpeFR5cGUmIG1fY29uc3QsIGNvbnN0IHR5cGVuYW1lIE1hdHJpeFR5cGU6OlJlYWxTY2FsYXImIHRvbCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhUeXBlPgordm9pZCB0ZXN0TG9nVGhlbkV4cChjb25zdCBNYXRyaXhUeXBlJiBtX2NvbnN0LCBjb25zdCB0eXBlbmFtZSBNYXRyaXhUeXBlOjpSZWFsU2NhbGFyJiB0b2wpIHsKICAgLy8gd2UgbmVlZCB0byBwYXNzIGJ5IHJlZmVyZW5jZSBpbiBvcmRlciB0byBwcmV2ZW50IGVycm9ycyB3aXRoCiAgIC8vIE1TVkMgZm9yIGFsaWduZWQgZGF0YSB0eXBlcyAuLi4KICAgTWF0cml4VHlwZSYgbSA9IGNvbnN0X2Nhc3Q8TWF0cml4VHlwZSY+KG1fY29uc3QpOwpAQCAtMTM5LDE5ICsxMzMsMTggQEAKICAgdHlwZWRlZiB0eXBlbmFtZSBNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICBTY2FsYXIgeDsKIAotICBmb3IgKGludCBpPTA7IGkgPCBnX3JlcGVhdDsgKytpKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7ICsraSkgewogICAgIGdlbmVyYXRlVGVzdE1hdHJpeDxNYXRyaXhUeXBlPjo6cnVuKG0sIG0ucm93cygpKTsKICAgICB4ID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KCk7CiAgICAgVkVSSUZZKG0ucG93KHgpLmlzQXBwcm94KCh4ICogbS5sb2coKSkuZXhwKCksIHRvbCkpOwogICB9CiB9CiAKLXR5cGVkZWYgTWF0cml4PGRvdWJsZSwzLDMsUm93TWFqb3I+ICAgICAgICAgTWF0cml4M2RSb3dNYWpvcjsKLXR5cGVkZWYgTWF0cml4PGxvbmcgZG91YmxlLDMsMz4gICAgICAgICAgICAgTWF0cml4M2U7Ci10eXBlZGVmIE1hdHJpeDxsb25nIGRvdWJsZSxEeW5hbWljLER5bmFtaWM+IE1hdHJpeFhlOwotIAotRUlHRU5fREVDTEFSRV9URVNUKG1hdHJpeF9wb3dlcikKLXsKK3R5cGVkZWYgTWF0cml4PGRvdWJsZSwgMywgMywgUm93TWFqb3I+IE1hdHJpeDNkUm93TWFqb3I7Cit0eXBlZGVmIE1hdHJpeDxsb25nIGRvdWJsZSwgMywgMz4gTWF0cml4M2U7Cit0eXBlZGVmIE1hdHJpeDxsb25nIGRvdWJsZSwgRHluYW1pYywgRHluYW1pYz4gTWF0cml4WGU7CisKK0VJR0VOX0RFQ0xBUkVfVEVTVChtYXRyaXhfcG93ZXIpIHsKICAgQ0FMTF9TVUJURVNUXzIodGVzdDJkUm90YXRpb248ZG91YmxlPigxZS0xMykpOwogICBDQUxMX1NVQlRFU1RfMSh0ZXN0MmRSb3RhdGlvbjxmbG9hdD4oMmUtNWYpKTsgIC8vIHdhcyAxZS01LCByZWxheGVkIGZvciBjbGFuZyAyLjggLyBsaW51eCAvIHg4Ni02NAogICBDQUxMX1NVQlRFU1RfOSh0ZXN0MmRSb3RhdGlvbjxsb25nIGRvdWJsZT4oMWUtMTNMKSk7CkBAIC0xNjMsNDIgKzE1Niw0MiBAQAogICBDQUxMX1NVQlRFU1RfMTEodGVzdDNkUm90YXRpb248ZmxvYXQ+KDFlLTVmKSk7CiAgIENBTExfU1VCVEVTVF8xMih0ZXN0M2RSb3RhdGlvbjxsb25nIGRvdWJsZT4oMWUtMTNMKSk7CiAKLSAgQ0FMTF9TVUJURVNUXzIodGVzdEdlbmVyYWwoTWF0cml4MmQoKSwgICAgICAgICAxZS0xMykpOworICBDQUxMX1NVQlRFU1RfMih0ZXN0R2VuZXJhbChNYXRyaXgyZCgpLCAxZS0xMykpOwogICBDQUxMX1NVQlRFU1RfNyh0ZXN0R2VuZXJhbChNYXRyaXgzZFJvd01ham9yKCksIDFlLTEzKSk7Ci0gIENBTExfU1VCVEVTVF8zKHRlc3RHZW5lcmFsKE1hdHJpeDRjZCgpLCAgICAgICAgMWUtMTMpKTsKLSAgQ0FMTF9TVUJURVNUXzQodGVzdEdlbmVyYWwoTWF0cml4WGQoOCw4KSwgICAgICAyZS0xMikpOwotICBDQUxMX1NVQlRFU1RfMSh0ZXN0R2VuZXJhbChNYXRyaXgyZigpLCAgICAgICAgIDFlLTRmKSk7Ci0gIENBTExfU1VCVEVTVF81KHRlc3RHZW5lcmFsKE1hdHJpeDNjZigpLCAgICAgICAgMWUtNGYpKTsKLSAgQ0FMTF9TVUJURVNUXzgodGVzdEdlbmVyYWwoTWF0cml4NGYoKSwgICAgICAgICAxZS00ZikpOwotICBDQUxMX1NVQlRFU1RfNih0ZXN0R2VuZXJhbChNYXRyaXhYZigyLDIpLCAgICAgIDFlLTNmKSk7IC8vIHNlZSBidWcgNjE0Ci0gIENBTExfU1VCVEVTVF85KHRlc3RHZW5lcmFsKE1hdHJpeFhlKDcsNyksICAgICAgMWUtMTJMKSk7Ci0gIENBTExfU1VCVEVTVF8xMCh0ZXN0R2VuZXJhbChNYXRyaXgzZCgpLCAgICAgICAgMWUtMTMpKTsKLSAgQ0FMTF9TVUJURVNUXzExKHRlc3RHZW5lcmFsKE1hdHJpeDNmKCksICAgICAgICAxZS00ZikpOwotICBDQUxMX1NVQlRFU1RfMTIodGVzdEdlbmVyYWwoTWF0cml4M2UoKSwgICAgICAgIDFlLTEzTCkpOworICBDQUxMX1NVQlRFU1RfMyh0ZXN0R2VuZXJhbChNYXRyaXg0Y2QoKSwgMWUtMTMpKTsKKyAgQ0FMTF9TVUJURVNUXzQodGVzdEdlbmVyYWwoTWF0cml4WGQoOCwgOCksIDJlLTEyKSk7CisgIENBTExfU1VCVEVTVF8xKHRlc3RHZW5lcmFsKE1hdHJpeDJmKCksIDFlLTRmKSk7CisgIENBTExfU1VCVEVTVF81KHRlc3RHZW5lcmFsKE1hdHJpeDNjZigpLCAxZS00ZikpOworICBDQUxMX1NVQlRFU1RfOCh0ZXN0R2VuZXJhbChNYXRyaXg0ZigpLCAxZS00ZikpOworICBDQUxMX1NVQlRFU1RfNih0ZXN0R2VuZXJhbChNYXRyaXhYZigyLCAyKSwgMWUtM2YpKTsgIC8vIHNlZSBidWcgNjE0CisgIENBTExfU1VCVEVTVF85KHRlc3RHZW5lcmFsKE1hdHJpeFhlKDcsIDcpLCAxZS0xMkwpKTsKKyAgQ0FMTF9TVUJURVNUXzEwKHRlc3RHZW5lcmFsKE1hdHJpeDNkKCksIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF8xMSh0ZXN0R2VuZXJhbChNYXRyaXgzZigpLCAxZS00ZikpOworICBDQUxMX1NVQlRFU1RfMTIodGVzdEdlbmVyYWwoTWF0cml4M2UoKSwgMWUtMTNMKSk7CiAKLSAgQ0FMTF9TVUJURVNUXzIodGVzdFNpbmd1bGFyKE1hdHJpeDJkKCksICAgICAgICAgMWUtMTMpKTsKKyAgQ0FMTF9TVUJURVNUXzIodGVzdFNpbmd1bGFyKE1hdHJpeDJkKCksIDFlLTEzKSk7CiAgIENBTExfU1VCVEVTVF83KHRlc3RTaW5ndWxhcihNYXRyaXgzZFJvd01ham9yKCksIDFlLTEzKSk7Ci0gIENBTExfU1VCVEVTVF8zKHRlc3RTaW5ndWxhcihNYXRyaXg0Y2QoKSwgICAgICAgIDFlLTEzKSk7Ci0gIENBTExfU1VCVEVTVF80KHRlc3RTaW5ndWxhcihNYXRyaXhYZCg4LDgpLCAgICAgIDJlLTEyKSk7Ci0gIENBTExfU1VCVEVTVF8xKHRlc3RTaW5ndWxhcihNYXRyaXgyZigpLCAgICAgICAgIDFlLTRmKSk7Ci0gIENBTExfU1VCVEVTVF81KHRlc3RTaW5ndWxhcihNYXRyaXgzY2YoKSwgICAgICAgIDFlLTRmKSk7Ci0gIENBTExfU1VCVEVTVF84KHRlc3RTaW5ndWxhcihNYXRyaXg0ZigpLCAgICAgICAgIDFlLTRmKSk7Ci0gIENBTExfU1VCVEVTVF82KHRlc3RTaW5ndWxhcihNYXRyaXhYZigyLDIpLCAgICAgIDFlLTNmKSk7Ci0gIENBTExfU1VCVEVTVF85KHRlc3RTaW5ndWxhcihNYXRyaXhYZSg3LDcpLCAgICAgIDFlLTEyTCkpOwotICBDQUxMX1NVQlRFU1RfMTAodGVzdFNpbmd1bGFyKE1hdHJpeDNkKCksICAgICAgICAxZS0xMykpOwotICBDQUxMX1NVQlRFU1RfMTEodGVzdFNpbmd1bGFyKE1hdHJpeDNmKCksICAgICAgICAxZS00ZikpOwotICBDQUxMX1NVQlRFU1RfMTIodGVzdFNpbmd1bGFyKE1hdHJpeDNlKCksICAgICAgICAxZS0xM0wpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdFNpbmd1bGFyKE1hdHJpeDRjZCgpLCAxZS0xMykpOworICBDQUxMX1NVQlRFU1RfNCh0ZXN0U2luZ3VsYXIoTWF0cml4WGQoOCwgOCksIDJlLTEyKSk7CisgIENBTExfU1VCVEVTVF8xKHRlc3RTaW5ndWxhcihNYXRyaXgyZigpLCAxZS00ZikpOworICBDQUxMX1NVQlRFU1RfNSh0ZXN0U2luZ3VsYXIoTWF0cml4M2NmKCksIDFlLTRmKSk7CisgIENBTExfU1VCVEVTVF84KHRlc3RTaW5ndWxhcihNYXRyaXg0ZigpLCAxZS00ZikpOworICBDQUxMX1NVQlRFU1RfNih0ZXN0U2luZ3VsYXIoTWF0cml4WGYoMiwgMiksIDFlLTNmKSk7CisgIENBTExfU1VCVEVTVF85KHRlc3RTaW5ndWxhcihNYXRyaXhYZSg3LCA3KSwgMWUtMTJMKSk7CisgIENBTExfU1VCVEVTVF8xMCh0ZXN0U2luZ3VsYXIoTWF0cml4M2QoKSwgMWUtMTMpKTsKKyAgQ0FMTF9TVUJURVNUXzExKHRlc3RTaW5ndWxhcihNYXRyaXgzZigpLCAxZS00ZikpOworICBDQUxMX1NVQlRFU1RfMTIodGVzdFNpbmd1bGFyKE1hdHJpeDNlKCksIDFlLTEzTCkpOwogCi0gIENBTExfU1VCVEVTVF8yKHRlc3RMb2dUaGVuRXhwKE1hdHJpeDJkKCksICAgICAgICAgMWUtMTMpKTsKKyAgQ0FMTF9TVUJURVNUXzIodGVzdExvZ1RoZW5FeHAoTWF0cml4MmQoKSwgMWUtMTMpKTsKICAgQ0FMTF9TVUJURVNUXzcodGVzdExvZ1RoZW5FeHAoTWF0cml4M2RSb3dNYWpvcigpLCAxZS0xMykpOwotICBDQUxMX1NVQlRFU1RfMyh0ZXN0TG9nVGhlbkV4cChNYXRyaXg0Y2QoKSwgICAgICAgIDFlLTEzKSk7Ci0gIENBTExfU1VCVEVTVF80KHRlc3RMb2dUaGVuRXhwKE1hdHJpeFhkKDgsOCksICAgICAgMmUtMTIpKTsKLSAgQ0FMTF9TVUJURVNUXzEodGVzdExvZ1RoZW5FeHAoTWF0cml4MmYoKSwgICAgICAgICAxZS00ZikpOwotICBDQUxMX1NVQlRFU1RfNSh0ZXN0TG9nVGhlbkV4cChNYXRyaXgzY2YoKSwgICAgICAgIDFlLTRmKSk7Ci0gIENBTExfU1VCVEVTVF84KHRlc3RMb2dUaGVuRXhwKE1hdHJpeDRmKCksICAgICAgICAgMWUtNGYpKTsKLSAgQ0FMTF9TVUJURVNUXzYodGVzdExvZ1RoZW5FeHAoTWF0cml4WGYoMiwyKSwgICAgICAxZS0zZikpOwotICBDQUxMX1NVQlRFU1RfOSh0ZXN0TG9nVGhlbkV4cChNYXRyaXhYZSg3LDcpLCAgICAgIDFlLTEyTCkpOwotICBDQUxMX1NVQlRFU1RfMTAodGVzdExvZ1RoZW5FeHAoTWF0cml4M2QoKSwgICAgICAgIDFlLTEzKSk7Ci0gIENBTExfU1VCVEVTVF8xMSh0ZXN0TG9nVGhlbkV4cChNYXRyaXgzZigpLCAgICAgICAgMWUtNGYpKTsKLSAgQ0FMTF9TVUJURVNUXzEyKHRlc3RMb2dUaGVuRXhwKE1hdHJpeDNlKCksICAgICAgICAxZS0xM0wpKTsKKyAgQ0FMTF9TVUJURVNUXzModGVzdExvZ1RoZW5FeHAoTWF0cml4NGNkKCksIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF80KHRlc3RMb2dUaGVuRXhwKE1hdHJpeFhkKDgsIDgpLCAyZS0xMikpOworICBDQUxMX1NVQlRFU1RfMSh0ZXN0TG9nVGhlbkV4cChNYXRyaXgyZigpLCAxZS00ZikpOworICBDQUxMX1NVQlRFU1RfNSh0ZXN0TG9nVGhlbkV4cChNYXRyaXgzY2YoKSwgMWUtNGYpKTsKKyAgQ0FMTF9TVUJURVNUXzgodGVzdExvZ1RoZW5FeHAoTWF0cml4NGYoKSwgMWUtNGYpKTsKKyAgQ0FMTF9TVUJURVNUXzYodGVzdExvZ1RoZW5FeHAoTWF0cml4WGYoMiwgMiksIDFlLTNmKSk7CisgIENBTExfU1VCVEVTVF85KHRlc3RMb2dUaGVuRXhwKE1hdHJpeFhlKDcsIDcpLCAxZS0xMkwpKTsKKyAgQ0FMTF9TVUJURVNUXzEwKHRlc3RMb2dUaGVuRXhwKE1hdHJpeDNkKCksIDFlLTEzKSk7CisgIENBTExfU1VCVEVTVF8xMSh0ZXN0TG9nVGhlbkV4cChNYXRyaXgzZigpLCAxZS00ZikpOworICBDQUxMX1NVQlRFU1RfMTIodGVzdExvZ1RoZW5FeHAoTWF0cml4M2UoKSwgMWUtMTNMKSk7CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9zcXVhcmVfcm9vdC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L21hdHJpeF9zcXVhcmVfcm9vdC5jcHAKaW5kZXggMDM0ZjI5Mi4uYzdmOGZiZSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9tYXRyaXhfc3F1YXJlX3Jvb3QuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvbWF0cml4X3NxdWFyZV9yb290LmNwcApAQCAtOSwyMyArOSwyMSBAQAogCiAjaW5jbHVkZSAibWF0cml4X2Z1bmN0aW9ucy5oIgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBNYXRyaXhUeXBlPgotdm9pZCB0ZXN0TWF0cml4U3FydChjb25zdCBNYXRyaXhUeXBlJiBtKQotewordGVtcGxhdGUgPHR5cGVuYW1lIE1hdHJpeFR5cGU+Cit2b2lkIHRlc3RNYXRyaXhTcXJ0KGNvbnN0IE1hdHJpeFR5cGUmIG0pIHsKICAgTWF0cml4VHlwZSBBOwogICBnZW5lcmF0ZVRlc3RNYXRyaXg8TWF0cml4VHlwZT46OnJ1bihBLCBtLnJvd3MoKSk7CiAgIE1hdHJpeFR5cGUgc3FydEEgPSBBLnNxcnQoKTsKICAgVkVSSUZZX0lTX0FQUFJPWChzcXJ0QSAqIHNxcnRBLCBBKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKG1hdHJpeF9zcXVhcmVfcm9vdCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChtYXRyaXhfc3F1YXJlX3Jvb3QpIHsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CiAgICAgQ0FMTF9TVUJURVNUXzEodGVzdE1hdHJpeFNxcnQoTWF0cml4M2NmKCkpKTsKLSAgICBDQUxMX1NVQlRFU1RfMih0ZXN0TWF0cml4U3FydChNYXRyaXhYY2QoMTIsMTIpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIodGVzdE1hdHJpeFNxcnQoTWF0cml4WGNkKDEyLCAxMikpKTsKICAgICBDQUxMX1NVQlRFU1RfMyh0ZXN0TWF0cml4U3FydChNYXRyaXg0ZigpKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzQodGVzdE1hdHJpeFNxcnQoTWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+KDksIDkpKSk7Ci0gICAgQ0FMTF9TVUJURVNUXzUodGVzdE1hdHJpeFNxcnQoTWF0cml4PGZsb2F0LDEsMT4oKSkpOwotICAgIENBTExfU1VCVEVTVF81KHRlc3RNYXRyaXhTcXJ0KE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LDEsMT4oKSkpOworICAgIENBTExfU1VCVEVTVF80KHRlc3RNYXRyaXhTcXJ0KE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIER5bmFtaWMsIFJvd01ham9yPig5LCA5KSkpOworICAgIENBTExfU1VCVEVTVF81KHRlc3RNYXRyaXhTcXJ0KE1hdHJpeDxmbG9hdCwgMSwgMT4oKSkpOworICAgIENBTExfU1VCVEVTVF81KHRlc3RNYXRyaXhTcXJ0KE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCAxLCAxPigpKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3QvbWlucmVzLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3QvbWlucmVzLmNwcAppbmRleCAyZWI0MGZlLi4wZDYyNWM0IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L21pbnJlcy5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9taW5yZXMuY3BwCkBAIC0xMiwzMyArMTIsMzAgQEAKICNpbmNsdWRlICIuLi8uLi90ZXN0L3NwYXJzZV9zb2x2ZXIuaCIKICNpbmNsdWRlIDxFaWdlbi9JdGVyYXRpdmVTb2x2ZXJzPgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHRlc3RfbWlucmVzX1QoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRlc3RfbWlucmVzX1QoKSB7CiAgIC8vIElkZW50aXR5IHByZWNvbmRpdGlvbmVyCi0gIE1JTlJFUzxTcGFyc2VNYXRyaXg8VD4sIExvd2VyLCBJZGVudGl0eVByZWNvbmRpdGlvbmVyICAgID4gbWlucmVzX2NvbG1ham9yX2xvd2VyX0k7Ci0gIE1JTlJFUzxTcGFyc2VNYXRyaXg8VD4sIFVwcGVyLCBJZGVudGl0eVByZWNvbmRpdGlvbmVyICAgID4gbWlucmVzX2NvbG1ham9yX3VwcGVyX0k7CisgIE1JTlJFUzxTcGFyc2VNYXRyaXg8VD4sIExvd2VyLCBJZGVudGl0eVByZWNvbmRpdGlvbmVyPiBtaW5yZXNfY29sbWFqb3JfbG93ZXJfSTsKKyAgTUlOUkVTPFNwYXJzZU1hdHJpeDxUPiwgVXBwZXIsIElkZW50aXR5UHJlY29uZGl0aW9uZXI+IG1pbnJlc19jb2xtYWpvcl91cHBlcl9JOwogCiAgIC8vIERpYWdvbmFsIHByZWNvbmRpdGlvbmVyCiAgIE1JTlJFUzxTcGFyc2VNYXRyaXg8VD4sIExvd2VyLCBEaWFnb25hbFByZWNvbmRpdGlvbmVyPFQ+ID4gbWlucmVzX2NvbG1ham9yX2xvd2VyX2RpYWc7CiAgIE1JTlJFUzxTcGFyc2VNYXRyaXg8VD4sIFVwcGVyLCBEaWFnb25hbFByZWNvbmRpdGlvbmVyPFQ+ID4gbWlucmVzX2NvbG1ham9yX3VwcGVyX2RpYWc7Ci0gIE1JTlJFUzxTcGFyc2VNYXRyaXg8VD4sIExvd2VyfFVwcGVyLCBEaWFnb25hbFByZWNvbmRpdGlvbmVyPFQ+ID4gbWlucmVzX2NvbG1ham9yX3VwbG9fZGlhZzsKLSAgCisgIE1JTlJFUzxTcGFyc2VNYXRyaXg8VD4sIExvd2VyIHwgVXBwZXIsIERpYWdvbmFsUHJlY29uZGl0aW9uZXI8VD4gPiBtaW5yZXNfY29sbWFqb3JfdXBsb19kaWFnOworCiAgIC8vIGNhbGwgdGVzdHMgZm9yIFNQRCBtYXRyaXgKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobWlucmVzX2NvbG1ham9yX2xvd2VyX0kpICk7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKG1pbnJlc19jb2xtYWpvcl91cHBlcl9JKSApOwotICAgIAotICBDQUxMX1NVQlRFU1QoIGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhtaW5yZXNfY29sbWFqb3JfbG93ZXJfZGlhZykgICk7Ci0gIENBTExfU1VCVEVTVCggY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKG1pbnJlc19jb2xtYWpvcl91cHBlcl9kaWFnKSAgKTsKLSAgQ0FMTF9TVUJURVNUKCBjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobWlucmVzX2NvbG1ham9yX3VwbG9fZGlhZykgICk7Ci0gICAgCisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobWlucmVzX2NvbG1ham9yX2xvd2VyX0kpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhtaW5yZXNfY29sbWFqb3JfdXBwZXJfSSkpOworCisgIENBTExfU1VCVEVTVChjaGVja19zcGFyc2Vfc3BkX3NvbHZpbmcobWlucmVzX2NvbG1ham9yX2xvd2VyX2RpYWcpKTsKKyAgQ0FMTF9TVUJURVNUKGNoZWNrX3NwYXJzZV9zcGRfc29sdmluZyhtaW5yZXNfY29sbWFqb3JfdXBwZXJfZGlhZykpOworICBDQUxMX1NVQlRFU1QoY2hlY2tfc3BhcnNlX3NwZF9zb2x2aW5nKG1pbnJlc19jb2xtYWpvcl91cGxvX2RpYWcpKTsKKwogICAvLyBUTyBETzogc3ltbWV0cmljIHNlbWktZGVmaW5pdGUgbWF0cml4CiAgIC8vIFRPIERPOiBzeW1tZXRyaWMgaW5kZWZpbml0ZSBtYXRyaXgKLQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QobWlucmVzKQoteworRUlHRU5fREVDTEFSRV9URVNUKG1pbnJlcykgewogICBDQUxMX1NVQlRFU1RfMSh0ZXN0X21pbnJlc19UPGRvdWJsZT4oKSk7Ci0vLyAgQ0FMTF9TVUJURVNUXzIodGVzdF9taW5yZXNfVDxzdGQ6OmNvbXBleDxkb3VibGU+ID4oKSk7Ci0KKyAgLy8gIENBTExfU1VCVEVTVF8yKHRlc3RfbWlucmVzX1Q8c3RkOjpjb21wZXg8ZG91YmxlPiA+KCkpOwogfQpkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9tcHJlYWxfc3VwcG9ydC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L21wcmVhbF9zdXBwb3J0LmNwcAppbmRleCA3MjU2ZGMwLi4xNTk4ZjdmIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L21wcmVhbF9zdXBwb3J0LmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L21wcmVhbF9zdXBwb3J0LmNwcApAQCAtOCwxMiArOCwxMSBAQAogdXNpbmcgbmFtZXNwYWNlIG1wZnI7CiB1c2luZyBuYW1lc3BhY2UgRWlnZW47CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChtcHJlYWxfc3VwcG9ydCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChtcHJlYWxfc3VwcG9ydCkgewogICAvLyBzZXQgcHJlY2lzaW9uIHRvIDI1NiBiaXRzIChkb3VibGUgaGFzIG9ubHkgNTMgYml0cykKICAgbXByZWFsOjpzZXRfZGVmYXVsdF9wcmVjKDI1Nik7Ci0gIHR5cGVkZWYgTWF0cml4PG1wcmVhbCxFaWdlbjo6RHluYW1pYyxFaWdlbjo6RHluYW1pYz4gTWF0cml4WG1wOwotICB0eXBlZGVmIE1hdHJpeDxzdGQ6OmNvbXBsZXg8bXByZWFsPixFaWdlbjo6RHluYW1pYyxFaWdlbjo6RHluYW1pYz4gTWF0cml4WGNtcDsKKyAgdHlwZWRlZiBNYXRyaXg8bXByZWFsLCBFaWdlbjo6RHluYW1pYywgRWlnZW46OkR5bmFtaWM+IE1hdHJpeFhtcDsKKyAgdHlwZWRlZiBNYXRyaXg8c3RkOjpjb21wbGV4PG1wcmVhbD4sIEVpZ2VuOjpEeW5hbWljLCBFaWdlbjo6RHluYW1pYz4gTWF0cml4WGNtcDsKIAogICBzdGQ6OmNlcnIgPDwgImVwc2lsb24gPSAgICAgICAgICIgPDwgTnVtVHJhaXRzPG1wcmVhbD46OmVwc2lsb24oKSA8PCAiXG4iOwogICBzdGQ6OmNlcnIgPDwgImR1bW15X3ByZWNpc2lvbiA9ICIgPDwgTnVtVHJhaXRzPG1wcmVhbD46OmR1bW15X3ByZWNpc2lvbigpIDw8ICJcbiI7CkBAIC0yMiw0NCArMjEsNDcgQEAKICAgc3RkOjpjZXJyIDw8ICJkaWdpdHMxMCA9ICAgICAgICAiIDw8IE51bVRyYWl0czxtcHJlYWw+OjpkaWdpdHMxMCgpIDw8ICJcbiI7CiAgIHN0ZDo6Y2VyciA8PCAibWF4X2RpZ2l0czEwID0gICAgIiA8PCBOdW1UcmFpdHM8bXByZWFsPjo6bWF4X2RpZ2l0czEwKCkgPDwgIlxuIjsKIAotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgewotICAgIGludCBzID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLDEwMCk7Ci0gICAgTWF0cml4WG1wIEEgPSBNYXRyaXhYbXA6OlJhbmRvbShzLHMpOwotICAgIE1hdHJpeFhtcCBCID0gTWF0cml4WG1wOjpSYW5kb20ocyxzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKSB7CisgICAgaW50IHMgPSBFaWdlbjo6aW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDEsIDEwMCk7CisgICAgTWF0cml4WG1wIEEgPSBNYXRyaXhYbXA6OlJhbmRvbShzLCBzKTsKKyAgICBNYXRyaXhYbXAgQiA9IE1hdHJpeFhtcDo6UmFuZG9tKHMsIHMpOwogICAgIE1hdHJpeFhtcCBTID0gQS5hZGpvaW50KCkgKiBBOwogICAgIE1hdHJpeFhtcCBYOwotICAgIE1hdHJpeFhjbXAgQWMgPSBNYXRyaXhYY21wOjpSYW5kb20ocyxzKTsKLSAgICBNYXRyaXhYY21wIEJjID0gTWF0cml4WGNtcDo6UmFuZG9tKHMscyk7CisgICAgTWF0cml4WGNtcCBBYyA9IE1hdHJpeFhjbXA6OlJhbmRvbShzLCBzKTsKKyAgICBNYXRyaXhYY21wIEJjID0gTWF0cml4WGNtcDo6UmFuZG9tKHMsIHMpOwogICAgIE1hdHJpeFhjbXAgU2MgPSBBYy5hZGpvaW50KCkgKiBBYzsKICAgICBNYXRyaXhYY21wIFhjOwotICAgIAorCiAgICAgLy8gQmFzaWMgc3R1ZmZzCiAgICAgVkVSSUZZX0lTX0FQUFJPWChBLnJlYWwoKSwgQSk7CiAgICAgVkVSSUZZKEVpZ2VuOjppbnRlcm5hbDo6aXNBcHByb3goQS5hcnJheSgpLmFiczIoKS5zdW0oKSwgQS5zcXVhcmVkTm9ybSgpKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChBLmFycmF5KCkuZXhwKCksICAgICAgICAgZXhwKEEuYXJyYXkoKSkpOworICAgIFZFUklGWV9JU19BUFBST1goQS5hcnJheSgpLmV4cCgpLCBleHAoQS5hcnJheSgpKSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChBLmFycmF5KCkuYWJzMigpLnNxcnQoKSwgQS5hcnJheSgpLmFicygpKTsKLSAgICBWRVJJRllfSVNfQVBQUk9YKEEuYXJyYXkoKS5zaW4oKSwgICAgICAgICBzaW4oQS5hcnJheSgpKSk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWChBLmFycmF5KCkuY29zKCksICAgICAgICAgY29zKEEuYXJyYXkoKSkpOworICAgIFZFUklGWV9JU19BUFBST1goQS5hcnJheSgpLnNpbigpLCBzaW4oQS5hcnJheSgpKSk7CisgICAgVkVSSUZZX0lTX0FQUFJPWChBLmFycmF5KCkuY29zKCksIGNvcyhBLmFycmF5KCkpKTsKIAogICAgIC8vIENob2xlc2t5CiAgICAgWCA9IFMuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpLmxsdCgpLnNvbHZlKEIpOwotICAgIFZFUklGWV9JU19BUFBST1goKFMuc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKlgpLmV2YWwoKSxCKTsKKyAgICBWRVJJRllfSVNfQVBQUk9YKChTLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIFgpLmV2YWwoKSwgQik7CiAKICAgICBYYyA9IFNjLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKS5sbHQoKS5zb2x2ZShCYyk7Ci0gICAgVkVSSUZZX0lTX0FQUFJPWCgoU2Muc2VsZmFkam9pbnRWaWV3PExvd2VyPigpKlhjKS5ldmFsKCksQmMpOwotICAgIAorICAgIFZFUklGWV9JU19BUFBST1goKFNjLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIFhjKS5ldmFsKCksIEJjKTsKKwogICAgIC8vIHBhcnRpYWwgTFUKICAgICBYID0gQS5sdSgpLnNvbHZlKEIpOwotICAgIFZFUklGWV9JU19BUFBST1goKEEqWCkuZXZhbCgpLEIpOworICAgIFZFUklGWV9JU19BUFBST1goKEEgKiBYKS5ldmFsKCksIEIpOwogCiAgICAgLy8gc3ltbWV0cmljIGVpZ2VudmFsdWVzCiAgICAgU2VsZkFkam9pbnRFaWdlblNvbHZlcjxNYXRyaXhYbXA+IGVpZyhTKTsKICAgICBWRVJJRllfSVNfRVFVQUwoZWlnLmluZm8oKSwgU3VjY2Vzcyk7Ci0gICAgVkVSSUZZKCAoUy5zZWxmYWRqb2ludFZpZXc8TG93ZXI+KCkgKiBlaWcuZWlnZW52ZWN0b3JzKCkpLmlzQXBwcm94KGVpZy5laWdlbnZlY3RvcnMoKSAqIGVpZy5laWdlbnZhbHVlcygpLmFzRGlhZ29uYWwoKSwgTnVtVHJhaXRzPG1wcmVhbD46OmR1bW15X3ByZWNpc2lvbigpKjFlMykgKTsKKyAgICBWRVJJRlkoCisgICAgICAgIChTLnNlbGZhZGpvaW50VmlldzxMb3dlcj4oKSAqIGVpZy5laWdlbnZlY3RvcnMoKSkKKyAgICAgICAgICAgIC5pc0FwcHJveChlaWcuZWlnZW52ZWN0b3JzKCkgKiBlaWcuZWlnZW52YWx1ZXMoKS5hc0RpYWdvbmFsKCksIE51bVRyYWl0czxtcHJlYWw+OjpkdW1teV9wcmVjaXNpb24oKSAqIDFlMykpOwogICB9Ci0gIAorCiAgIHsKLSAgICBNYXRyaXhYbXAgQSg4LDMpOyBBLnNldFJhbmRvbSgpOworICAgIE1hdHJpeFhtcCBBKDgsIDMpOworICAgIEEuc2V0UmFuZG9tKCk7CiAgICAgLy8gdGVzdCBvdXRwdXQgKGludGVyZXN0aW5nIHRoaW5ncyBoYXBwZW4gaW4gdGhpcyBjb2RlKQogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbTsKICAgICBzdHJlYW0gPDwgQTsKZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3Qvb3Blbmdsc3VwcG9ydC5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L29wZW5nbHN1cHBvcnQuY3BwCmluZGV4IDFjNDQzODEuLjE4Zjk5MGQgMTAwNjQ0Ci0tLSBhL3Vuc3VwcG9ydGVkL3Rlc3Qvb3Blbmdsc3VwcG9ydC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9vcGVuZ2xzdXBwb3J0LmNwcApAQCAtMTIsODkgKzEyLDk2IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogCiAjaWYgZGVmaW5lZChfX0FQUExFX0NDX18pCi0gIC8vIFByZXZlbnQgZGVwcmVjYXRpb24gd2FybmluZ3MgY2F1c2VkIGJ5IEdMRVcgb24gTWFjT1MuCi0gICNkZWZpbmUgR0xfU0lMRU5DRV9ERVBSRUNBVElPTiAxCisvLyBQcmV2ZW50IGRlcHJlY2F0aW9uIHdhcm5pbmdzIGNhdXNlZCBieSBHTEVXIG9uIE1hY09TLgorI2RlZmluZSBHTF9TSUxFTkNFX0RFUFJFQ0FUSU9OIDEKICNlbmRpZgogI2luY2x1ZGUgPEdML2dsZXcuaD4KICNpbmNsdWRlIDxFaWdlbi9PcGVuR0xTdXBwb3J0PgogI2lmIGRlZmluZWQoX19BUFBMRV9DQ19fKQotICAjaW5jbHVkZSA8R0xVVC9nbHV0Lmg+CisjaW5jbHVkZSA8R0xVVC9nbHV0Lmg+CiAjZWxzZQotICAjaW5jbHVkZSA8R0wvZnJlZWdsdXQuaD4KKyNpbmNsdWRlIDxHTC9mcmVlZ2x1dC5oPgogI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBFaWdlbjsKIAotI2RlZmluZSBWRVJJRllfTUFUUklYKENPREUsUkVGKSB7IFwKLSAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsgXAotICAgIGdsTG9hZElkZW50aXR5KCk7IFwKLSAgICBDT0RFOyBcCi0gICAgTWF0cml4PGZsb2F0LDQsNCxDb2xNYWpvcj4gbTsgbS5zZXRaZXJvKCk7IFwKLSAgICBnbEdldChHTF9NT0RFTFZJRVdfTUFUUklYLCBtKTsgXAotICAgIGlmKCEoUkVGKS5jYXN0PGZsb2F0PigpLmlzQXBwcm94KG0pKSB7IFwKLSAgICAgIHN0ZDo6Y2VyciA8PCAiRXhwZWN0ZWQ6XG4iIDw8ICgoUkVGKS5jYXN0PGZsb2F0PigpKSA8PCAiXG4iIDw8ICJnb3RcbiIgPDwgbSA8PCAiXG5cbiI7IFwKLSAgICB9IFwKLSAgICBWRVJJRllfSVNfQVBQUk9YKChSRUYpLmNhc3Q8ZmxvYXQ+KCksIG0pOyBcCisjZGVmaW5lIFZFUklGWV9NQVRSSVgoQ09ERSwgUkVGKSAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsgICAgICAgICAgICAgICAgICBcCisgICAgZ2xMb2FkSWRlbnRpdHkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENPREU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYXRyaXg8ZmxvYXQsIDQsIDQsIENvbE1ham9yPiBtOyAgICAgICAgICAgICBcCisgICAgbS5zZXRaZXJvKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdsR2V0KEdMX01PREVMVklFV19NQVRSSVgsIG0pOyAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShSRUYpLmNhc3Q8ZmxvYXQ+KCkuaXNBcHByb3gobSkpIHsgICAgICBcCisgICAgICBzdGQ6OmNlcnIgPDwgIkV4cGVjdGVkOlxuIiAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIDw8ICgoUkVGKS5jYXN0PGZsb2F0PigpKSA8PCAiXG4iIFwKKyAgICAgICAgICAgICAgICA8PCAiZ290XG4iICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgPDwgbSA8PCAiXG5cbiI7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWRVJJRllfSVNfQVBQUk9YKChSRUYpLmNhc3Q8ZmxvYXQ+KCksIG0pOyAgICBcCiAgIH0KIAotI2RlZmluZSBWRVJJRllfVU5JRk9STShTVUZGSVgsTkFNRSxUWVBFKSB7IFwKLSAgICBUWVBFIHZhbHVlOyB2YWx1ZS5zZXRSYW5kb20oKTsgXAotICAgIFRZUEUgZGF0YTsgXAotICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcmdfaWQsICNOQU1FKTsgXAotICAgIFZFUklGWSgobG9jIT0tMSkgJiYgInVuaWZvcm0gbm90IGZvdW5kIik7IFwKLSAgICBnbFVuaWZvcm0obG9jLHZhbHVlKTsgXAotICAgIEVJR0VOX0NBVChnbEdldFVuaWZvcm0sU1VGRklYKShwcmdfaWQsbG9jLGRhdGEuZGF0YSgpKTsgXAotICAgIGlmKCF2YWx1ZS5pc0FwcHJveChkYXRhKSkgeyBcCi0gICAgICBzdGQ6OmNlcnIgPDwgIkV4cGVjdGVkOlxuIiA8PCB2YWx1ZSA8PCAiXG4iIDw8ICJnb3RcbiIgPDwgZGF0YSA8PCAiXG5cbiI7IFwKLSAgICB9IFwKLSAgICBWRVJJRllfSVNfQVBQUk9YKHZhbHVlLCBkYXRhKTsgXAorI2RlZmluZSBWRVJJRllfVU5JRk9STShTVUZGSVgsIE5BTUUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlLnNldFJhbmRvbSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcmdfaWQsICNOQU1FKTsgICAgICAgICAgICAgXAorICAgIFZFUklGWSgobG9jICE9IC0xKSAmJiAidW5pZm9ybSBub3QgZm91bmQiKTsgICAgICAgICAgICAgICAgXAorICAgIGdsVW5pZm9ybShsb2MsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEVJR0VOX0NBVChnbEdldFVuaWZvcm0sIFNVRkZJWCkocHJnX2lkLCBsb2MsIGRhdGEuZGF0YSgpKTsgXAorICAgIGlmICghdmFsdWUuaXNBcHByb3goZGF0YSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RkOjpjZXJyIDw8ICJFeHBlY3RlZDpcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIDw8IHZhbHVlIDw8ICJcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIDw8ICJnb3RcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIDw8IGRhdGEgPDwgIlxuXG4iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZFUklGWV9JU19BUFBST1godmFsdWUsIGRhdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CiAKLSNkZWZpbmUgVkVSSUZZX1VOSUZPUk1pKE5BTUUsVFlQRSkgeyBcCisjZGVmaW5lIFZFUklGWV9VTklGT1JNaShOQU1FLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVFlQRSB2YWx1ZSA9IFRZUEU6OlJhbmRvbSgpLmV2YWwoKS5jYXN0PGZsb2F0PigpLmNhc3Q8VFlQRTo6U2NhbGFyPigpOyBcCi0gICAgVFlQRSBkYXRhOyBcCi0gICAgaW50IGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHByZ19pZCwgI05BTUUpOyBcCi0gICAgVkVSSUZZKChsb2MhPS0xKSAmJiAidW5pZm9ybSBub3QgZm91bmQiKTsgXAotICAgIGdsVW5pZm9ybShsb2MsdmFsdWUpOyBcCi0gICAgZ2xHZXRVbmlmb3JtaXYocHJnX2lkLGxvYywoR0xpbnQqKWRhdGEuZGF0YSgpKTsgXAotICAgIGlmKCF2YWx1ZS5pc0FwcHJveChkYXRhKSkgeyBcCi0gICAgICBzdGQ6OmNlcnIgPDwgIkV4cGVjdGVkOlxuIiA8PCB2YWx1ZSA8PCAiXG4iIDw8ICJnb3RcbiIgPDwgZGF0YSA8PCAiXG5cbiI7IFwKLSAgICB9IFwKLSAgICBWRVJJRllfSVNfQVBQUk9YKHZhbHVlLCBkYXRhKTsgXAorICAgIFRZUEUgZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcmdfaWQsICNOQU1FKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZFUklGWSgobG9jICE9IC0xKSAmJiAidW5pZm9ybSBub3QgZm91bmQiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdsVW5pZm9ybShsb2MsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdsR2V0VW5pZm9ybWl2KHByZ19pZCwgbG9jLCAoR0xpbnQqKWRhdGEuZGF0YSgpKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghdmFsdWUuaXNBcHByb3goZGF0YSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RkOjpjZXJyIDw8ICJFeHBlY3RlZDpcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIDw8IHZhbHVlIDw8ICJcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIDw8ICJnb3RcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIDw8IGRhdGEgPDwgIlxuXG4iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZFUklGWV9JU19BUFBST1godmFsdWUsIGRhdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CiAKLXZvaWQgcHJpbnRQcm9ncmFtSW5mb0xvZyhHTHVpbnQgb2JqZWN0SUQpCi17Ci0gICAgaW50IGluZm9sb2dMZW5ndGgsIGNoYXJzV3JpdHRlbjsKLSAgICBHTGNoYXIgKmluZm9Mb2c7Ci0gICAgZ2xHZXRQcm9ncmFtaXYob2JqZWN0SUQsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9sb2dMZW5ndGgpOwotICAgIGlmKGluZm9sb2dMZW5ndGggPiAwKQotICAgIHsKLSAgICAgICAgaW5mb0xvZyA9IG5ldyBHTGNoYXJbaW5mb2xvZ0xlbmd0aF07Ci0gICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cob2JqZWN0SUQsIGluZm9sb2dMZW5ndGgsICZjaGFyc1dyaXR0ZW4sIGluZm9Mb2cpOwotICAgICAgICBpZiAoY2hhcnNXcml0dGVuID4gMCkKLSAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlByb2dyYW0gaW5mbyA6IFxuIiA8PCBpbmZvTG9nIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgZGVsZXRlW10gaW5mb0xvZzsKLSAgICB9Cit2b2lkIHByaW50UHJvZ3JhbUluZm9Mb2coR0x1aW50IG9iamVjdElEKSB7CisgIGludCBpbmZvbG9nTGVuZ3RoLCBjaGFyc1dyaXR0ZW47CisgIEdMY2hhciogaW5mb0xvZzsKKyAgZ2xHZXRQcm9ncmFtaXYob2JqZWN0SUQsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9sb2dMZW5ndGgpOworICBpZiAoaW5mb2xvZ0xlbmd0aCA+IDApIHsKKyAgICBpbmZvTG9nID0gbmV3IEdMY2hhcltpbmZvbG9nTGVuZ3RoXTsKKyAgICBnbEdldFByb2dyYW1JbmZvTG9nKG9iamVjdElELCBpbmZvbG9nTGVuZ3RoLCAmY2hhcnNXcml0dGVuLCBpbmZvTG9nKTsKKyAgICBpZiAoY2hhcnNXcml0dGVuID4gMCkgc3RkOjpjZXJyIDw8ICJQcm9ncmFtIGluZm8gOiBcbiIgPDwgaW5mb0xvZyA8PCBzdGQ6OmVuZGw7CisgICAgZGVsZXRlW10gaW5mb0xvZzsKKyAgfQogfQogCi12b2lkIHByaW50U2hhZGVySW5mb0xvZyhHTHVpbnQgb2JqZWN0SUQpCi17Ci0gICAgaW50IGluZm9sb2dMZW5ndGgsIGNoYXJzV3JpdHRlbjsKLSAgICBHTGNoYXIgKmluZm9Mb2c7Ci0gICAgZ2xHZXRTaGFkZXJpdihvYmplY3RJRCwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb2xvZ0xlbmd0aCk7Ci0gICAgaWYoaW5mb2xvZ0xlbmd0aCA+IDApCi0gICAgewotICAgICAgICBpbmZvTG9nID0gbmV3IEdMY2hhcltpbmZvbG9nTGVuZ3RoXTsKLSAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKG9iamVjdElELCBpbmZvbG9nTGVuZ3RoLCAmY2hhcnNXcml0dGVuLCBpbmZvTG9nKTsKLSAgICAgICAgaWYgKGNoYXJzV3JpdHRlbiA+IDApCi0gICAgICAgICAgc3RkOjpjZXJyIDw8ICJTaGFkZXIgaW5mbyA6IFxuIiA8PCBpbmZvTG9nIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgZGVsZXRlW10gaW5mb0xvZzsKLSAgICB9Cit2b2lkIHByaW50U2hhZGVySW5mb0xvZyhHTHVpbnQgb2JqZWN0SUQpIHsKKyAgaW50IGluZm9sb2dMZW5ndGgsIGNoYXJzV3JpdHRlbjsKKyAgR0xjaGFyKiBpbmZvTG9nOworICBnbEdldFNoYWRlcml2KG9iamVjdElELCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvbG9nTGVuZ3RoKTsKKyAgaWYgKGluZm9sb2dMZW5ndGggPiAwKSB7CisgICAgaW5mb0xvZyA9IG5ldyBHTGNoYXJbaW5mb2xvZ0xlbmd0aF07CisgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKG9iamVjdElELCBpbmZvbG9nTGVuZ3RoLCAmY2hhcnNXcml0dGVuLCBpbmZvTG9nKTsKKyAgICBpZiAoY2hhcnNXcml0dGVuID4gMCkgc3RkOjpjZXJyIDw8ICJTaGFkZXIgaW5mbyA6IFxuIiA8PCBpbmZvTG9nIDw8IHN0ZDo6ZW5kbDsKKyAgICBkZWxldGVbXSBpbmZvTG9nOworICB9CiB9CiAKLUdMaW50IGNyZWF0ZVByb2dyYW0oY29uc3QgY2hhciogdnR4LCBjb25zdCBjaGFyKiBmcmcsIGJvb2wgcHJpbnRfZXJyb3JzID0gdHJ1ZSkKLXsKK0dMaW50IGNyZWF0ZVByb2dyYW0oY29uc3QgY2hhciogdnR4LCBjb25zdCBjaGFyKiBmcmcsIGJvb2wgcHJpbnRfZXJyb3JzID0gdHJ1ZSkgewogICBHTGludCBwcmdfaWQgPSBnbENyZWF0ZVByb2dyYW0oKTsKICAgR0xpbnQgdnR4X2lkID0gZ2xDcmVhdGVTaGFkZXIoR0xfVkVSVEVYX1NIQURFUik7CiAgIEdMaW50IGZyZ19pZCA9IGdsQ3JlYXRlU2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUik7CkBAIC0xMDMsMTAgKzExMCw4IEBACiAgIGdsU2hhZGVyU291cmNlKHZ0eF9pZCwgMSwgJnZ0eCwgMCk7CiAgIGdsQ29tcGlsZVNoYWRlcih2dHhfaWQpOwogICBnbEdldFNoYWRlcml2KHZ0eF9pZCwgR0xfQ09NUElMRV9TVEFUVVMsICZvayk7Ci0gIGlmKCFvaykKLSAgewotICAgIGlmIChwcmludF9lcnJvcnMpCi0gICAgeworICBpZiAoIW9rKSB7CisgICAgaWYgKHByaW50X2Vycm9ycykgewogICAgICAgc3RkOjpjZXJyIDw8ICJ2dHggY29tcGlsYXRpb24gZmFpbGVkXG4iOwogICAgICAgc3RkOjpjZXJyIDw8ICJTb3VyY2U6XG4iIDw8IHZ0eCA8PCAiXG4iOwogICAgICAgcHJpbnRTaGFkZXJJbmZvTG9nKHZ0eF9pZCk7CkBAIC0xMTgsMTAgKzEyMyw4IEBACiAgIGdsU2hhZGVyU291cmNlKGZyZ19pZCwgMSwgJmZyZywgMCk7CiAgIGdsQ29tcGlsZVNoYWRlcihmcmdfaWQpOwogICBnbEdldFNoYWRlcml2KGZyZ19pZCwgR0xfQ09NUElMRV9TVEFUVVMsICZvayk7Ci0gIGlmKCFvaykKLSAgewotICAgIGlmIChwcmludF9lcnJvcnMpCi0gICAgeworICBpZiAoIW9rKSB7CisgICAgaWYgKHByaW50X2Vycm9ycykgewogICAgICAgc3RkOjpjZXJyIDw8ICJmcmcgY29tcGlsYXRpb24gZmFpbGVkLlxuIjsKICAgICAgIHN0ZDo6Y2VyciA8PCAiU291cmNlOlxuIiA8PCBmcmcgPDwgIlxuIjsKICAgICAgIHByaW50U2hhZGVySW5mb0xvZyhmcmdfaWQpOwpAQCAtMTM5LDEwICsxNDIsOCBAQAogICBnbERlbGV0ZVNoYWRlcih2dHhfaWQpOwogICBnbERlbGV0ZVNoYWRlcihmcmdfaWQpOwogICBnbEdldFByb2dyYW1pdihwcmdfaWQsIEdMX0xJTktfU1RBVFVTLCAmb2spOwotICBpZighb2spCi0gIHsKLSAgICBpZiAocHJpbnRfZXJyb3JzKQotICAgIHsKKyAgaWYgKCFvaykgeworICAgIGlmIChwcmludF9lcnJvcnMpIHsKICAgICAgIHN0ZDo6Y2VyciA8PCAibGlua2luZyBmYWlsZWQuXG4iOwogICAgICAgcHJpbnRQcm9ncmFtSW5mb0xvZyhwcmdfaWQpOwogICAgIH0KQEAgLTE1NCwxOCArMTU1LDE0IEBACiAgIHJldHVybiBwcmdfaWQ7CiB9CiAKLUdMaW50IGNyZWF0ZVByb2dyYW0oY29uc3Qgc3RkOjpzdHJpbmcmIHZ0eCwgY29uc3Qgc3RkOjpzdHJpbmcmIGZyZywgYm9vbCBwcmludF9lcnJvcnMgPSB0cnVlKQoteworR0xpbnQgY3JlYXRlUHJvZ3JhbShjb25zdCBzdGQ6OnN0cmluZyYgdnR4LCBjb25zdCBzdGQ6OnN0cmluZyYgZnJnLCBib29sIHByaW50X2Vycm9ycyA9IHRydWUpIHsKICAgcmV0dXJuIGNyZWF0ZVByb2dyYW0odnR4LmNfc3RyKCksIGZyZy5jX3N0cigpLCBwcmludF9lcnJvcnMpOwogfQogCi1zdGQ6OnN0cmluZyBnZXRHbHNsVmVyc2lvblN0cmluZyhpbnQgZ2xfbWFqb3JfdmVyc2lvbiwgaW50IGdsX21pbm9yX3ZlcnNpb24pCi17Ci0gIHN3aXRjaCAoZ2xfbWFqb3JfdmVyc2lvbikKLSAgeworc3RkOjpzdHJpbmcgZ2V0R2xzbFZlcnNpb25TdHJpbmcoaW50IGdsX21ham9yX3ZlcnNpb24sIGludCBnbF9taW5vcl92ZXJzaW9uKSB7CisgIHN3aXRjaCAoZ2xfbWFqb3JfdmVyc2lvbikgewogICAgIGNhc2UgMjoKLSAgICAgIHN3aXRjaCAoZ2xfbWlub3JfdmVyc2lvbikKLSAgICAgIHsKKyAgICAgIHN3aXRjaCAoZ2xfbWlub3JfdmVyc2lvbikgewogICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgcmV0dXJuICIjdmVyc2lvbiAxMTAiOwogICAgICAgICBjYXNlIDE6CkBAIC0xNzMsOCArMTcwLDcgQEAKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGNhc2UgMzoKLSAgICAgIHN3aXRjaCAoZ2xfbWlub3JfdmVyc2lvbikKLSAgICAgIHsKKyAgICAgIHN3aXRjaCAoZ2xfbWlub3JfdmVyc2lvbikgewogICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgcmV0dXJuICIjdmVyc2lvbiAxMzAiOwogICAgICAgICBjYXNlIDE6CkBAIC0xODYsOCArMTgyLDcgQEAKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGNhc2UgNDoKLSAgICAgIHN3aXRjaCAoZ2xfbWlub3JfdmVyc2lvbikKLSAgICAgIHsKKyAgICAgIHN3aXRjaCAoZ2xfbWlub3JfdmVyc2lvbikgewogICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgcmV0dXJuICIjdmVyc2lvbiA0MDAiOwogICAgICAgICBjYXNlIDE6CkBAIC0yMDgsMjggKzIwMywyMSBAQAogICByZXR1cm4gIiI7CiB9CiAKLXZvaWQgZmluZF9hbmRfcmVwbGFjZSgKLSAgc3RkOjpzdHJpbmcmIHN0ciwKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbmQsCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXBsYWNlKQotewordm9pZCBmaW5kX2FuZF9yZXBsYWNlKHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaW5kLCBjb25zdCBzdGQ6OnN0cmluZyYgcmVwbGFjZSkgewogICBzaXplX3QgbG9jID0gMDsKICAgc2l6ZV90IGZsZW4gPSBmaW5kLmxlbmd0aCgpOwogICBzaXplX3QgcmxlbiA9IHJlcGxhY2UubGVuZ3RoKCk7Ci0gIHdoaWxlICggKGxvYyA9IHN0ci5maW5kKGZpbmQsIGxvYykpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgIHdoaWxlICgobG9jID0gc3RyLmZpbmQoZmluZCwgbG9jKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICBzdHIucmVwbGFjZShsb2MsIGZsZW4sIHJlcGxhY2UpOwogICAgIGxvYyArPSBybGVuOwogICB9CiB9CiAKIC8vIEZpbmRzIGFuZCByZXBsYWNlcyBhIHNldCBvZiBzdWJzdHJpbmdzIGluIGEgc3RyaW5nLgotc3RkOjpzdHJpbmcgZm9ybWF0KAotICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLAotICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGZpbmQsCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmVwbGFjZSkKLXsKK3N0ZDo6c3RyaW5nIGZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGZpbmQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByZXBsYWNlKSB7CiAgIHN0ZDo6c3RyaW5nIG91dCA9IHN0cjsKLSAgZm9yIChzdGQ6OnNpemVfdCBpPTA7IGk8ZmluZC5zaXplKCk7ICsraSkgeworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgZmluZC5zaXplKCk7ICsraSkgewogICAgIGZpbmRfYW5kX3JlcGxhY2Uob3V0LCBmaW5kW2ldLCByZXBsYWNlW2ldKTsKICAgfQogICByZXR1cm4gb3V0OwpAQCAtMjM3LDggKzIyNSw3IEBACiAKIC8vIEdMVVQgZGlzcGxheSBmdW5jdGlvbiB0aGF0IHJ1bnMgdGVzdC4gIE11c3QgYmUgcnVuIHdpdGhpbiB0aGUgZGlzcGxheSBsb29wCiAvLyBpbiBvcmRlciB0byBwcm9wZXJseSBkZXN0cm95IHJlc291cmNlcy4KLXZvaWQgb3Blbmdsc3VwcG9ydF90ZXN0X2xvb3AoKQotewordm9pZCBvcGVuZ2xzdXBwb3J0X3Rlc3RfbG9vcCgpIHsKICAgLy8gR2V0IGNvbnRleHQgaW5mby4KICAgY29uc3QgR0x1Ynl0ZSogZ2xfdmVyc2lvbl9zdHJpbmcgPSBnbEdldFN0cmluZyhHTF9WRVJTSU9OKTsKICAgc3RkOjpjZXJyIDw8ICJHTCB2ZXJzaW9uOiAiIDw8IGdsX3ZlcnNpb25fc3RyaW5nIDw8IHN0ZDo6ZW5kbDsKQEAgLTI1MCwyNCArMjM3LDI1IEBACiAgIGJvb2wgbGVnYWN5X2dsID0gZ2xfbWFqb3JfdmVyc2lvbiA8IDMgfHwgKGdsX21ham9yX3ZlcnNpb24gPT0gMyAmJiBnbF9taW5vcl92ZXJzaW9uIDwgMik7CiAKICAgLy8gRml4ZWQtZnVuY3Rpb24gcGlwZWxpbmUgcmVtb3ZlZCBpbiBPcGVuR0wgMy4yLgotICBpZiAobGVnYWN5X2dsKQotICB7CisgIGlmIChsZWdhY3lfZ2wpIHsKICAgICAvLyBEcmF3IGEgYmFzaWMgdHJpYW5nbGUuCiAgICAgVmVjdG9yM2YgdjNmOwogICAgIE1hdHJpeDNmIHJvdDsKICAgICBnbEJlZ2luKEdMX1BPSU5UUyk7CiAgICAgewogICAgICAgZ2xWZXJ0ZXgodjNmKTsKLSAgICAgIGdsVmVydGV4KDIqdjNmK3YzZik7Ci0gICAgICBnbFZlcnRleChyb3QqdjNmKTsKKyAgICAgIGdsVmVydGV4KDIgKiB2M2YgKyB2M2YpOworICAgICAgZ2xWZXJ0ZXgocm90ICogdjNmKTsKICAgICB9CiAgICAgZ2xFbmQoKTsKIAogICAgIC8vIDR4NCBtYXRyaWNlcwotICAgIE1hdHJpeDRmIG1mNDQ7IG1mNDQuc2V0UmFuZG9tKCk7CisgICAgTWF0cml4NGYgbWY0NDsKKyAgICBtZjQ0LnNldFJhbmRvbSgpOwogICAgIFZFUklGWV9NQVRSSVgoZ2xMb2FkTWF0cml4KG1mNDQpLCBtZjQ0KTsKICAgICBWRVJJRllfTUFUUklYKGdsTXVsdE1hdHJpeChtZjQ0KSwgbWY0NCk7Ci0gICAgTWF0cml4NGQgbWQ0NDsgbWQ0NC5zZXRSYW5kb20oKTsKKyAgICBNYXRyaXg0ZCBtZDQ0OworICAgIG1kNDQuc2V0UmFuZG9tKCk7CiAgICAgVkVSSUZZX01BVFJJWChnbExvYWRNYXRyaXgobWQ0NCksIG1kNDQpOwogICAgIFZFUklGWV9NQVRSSVgoZ2xNdWx0TWF0cml4KG1kNDQpLCBtZDQ0KTsKIApAQCAtMjc5LDU5ICsyNjcsODEgQEAKICAgICBWRVJJRllfTUFUUklYKGdsUm90YXRlKHFmKSwgUHJvamVjdGl2ZTNmKHFmKS5tYXRyaXgoKSk7CiAKICAgICAvLyAzRCBUcmFuc2Zvcm0KLSAgICBUcmFuc2Zvcm08ZmxvYXQsMyxBZmZpbmVDb21wYWN0PiBhY2YzOyBhY2YzLm1hdHJpeCgpLnNldFJhbmRvbSgpOworICAgIFRyYW5zZm9ybTxmbG9hdCwgMywgQWZmaW5lQ29tcGFjdD4gYWNmMzsKKyAgICBhY2YzLm1hdHJpeCgpLnNldFJhbmRvbSgpOwogICAgIFZFUklGWV9NQVRSSVgoZ2xMb2FkTWF0cml4KGFjZjMpLCBQcm9qZWN0aXZlM2YoYWNmMykubWF0cml4KCkpOwogICAgIFZFUklGWV9NQVRSSVgoZ2xNdWx0TWF0cml4KGFjZjMpLCBQcm9qZWN0aXZlM2YoYWNmMykubWF0cml4KCkpOwogCi0gICAgVHJhbnNmb3JtPGZsb2F0LDMsQWZmaW5lPiBhZjMoYWNmMyk7CisgICAgVHJhbnNmb3JtPGZsb2F0LCAzLCBBZmZpbmU+IGFmMyhhY2YzKTsKICAgICBWRVJJRllfTUFUUklYKGdsTG9hZE1hdHJpeChhZjMpLCBQcm9qZWN0aXZlM2YoYWYzKS5tYXRyaXgoKSk7CiAgICAgVkVSSUZZX01BVFJJWChnbE11bHRNYXRyaXgoYWYzKSwgUHJvamVjdGl2ZTNmKGFmMykubWF0cml4KCkpOwogCi0gICAgVHJhbnNmb3JtPGZsb2F0LDMsUHJvamVjdGl2ZT4gcGYzOyBwZjMubWF0cml4KCkuc2V0UmFuZG9tKCk7CisgICAgVHJhbnNmb3JtPGZsb2F0LCAzLCBQcm9qZWN0aXZlPiBwZjM7CisgICAgcGYzLm1hdHJpeCgpLnNldFJhbmRvbSgpOwogICAgIFZFUklGWV9NQVRSSVgoZ2xMb2FkTWF0cml4KHBmMyksIFByb2plY3RpdmUzZihwZjMpLm1hdHJpeCgpKTsKICAgICBWRVJJRllfTUFUUklYKGdsTXVsdE1hdHJpeChwZjMpLCBQcm9qZWN0aXZlM2YocGYzKS5tYXRyaXgoKSk7CiAKLSAgICBUcmFuc2Zvcm08ZG91YmxlLDMsQWZmaW5lQ29tcGFjdD4gYWNkMzsgYWNkMy5tYXRyaXgoKS5zZXRSYW5kb20oKTsKKyAgICBUcmFuc2Zvcm08ZG91YmxlLCAzLCBBZmZpbmVDb21wYWN0PiBhY2QzOworICAgIGFjZDMubWF0cml4KCkuc2V0UmFuZG9tKCk7CiAgICAgVkVSSUZZX01BVFJJWChnbExvYWRNYXRyaXgoYWNkMyksIFByb2plY3RpdmUzZChhY2QzKS5tYXRyaXgoKSk7CiAgICAgVkVSSUZZX01BVFJJWChnbE11bHRNYXRyaXgoYWNkMyksIFByb2plY3RpdmUzZChhY2QzKS5tYXRyaXgoKSk7CiAKLSAgICBUcmFuc2Zvcm08ZG91YmxlLDMsQWZmaW5lPiBhZDMoYWNkMyk7CisgICAgVHJhbnNmb3JtPGRvdWJsZSwgMywgQWZmaW5lPiBhZDMoYWNkMyk7CiAgICAgVkVSSUZZX01BVFJJWChnbExvYWRNYXRyaXgoYWQzKSwgUHJvamVjdGl2ZTNkKGFkMykubWF0cml4KCkpOwogICAgIFZFUklGWV9NQVRSSVgoZ2xNdWx0TWF0cml4KGFkMyksIFByb2plY3RpdmUzZChhZDMpLm1hdHJpeCgpKTsKIAotICAgIFRyYW5zZm9ybTxkb3VibGUsMyxQcm9qZWN0aXZlPiBwZDM7IHBkMy5tYXRyaXgoKS5zZXRSYW5kb20oKTsKKyAgICBUcmFuc2Zvcm08ZG91YmxlLCAzLCBQcm9qZWN0aXZlPiBwZDM7CisgICAgcGQzLm1hdHJpeCgpLnNldFJhbmRvbSgpOwogICAgIFZFUklGWV9NQVRSSVgoZ2xMb2FkTWF0cml4KHBkMyksIFByb2plY3RpdmUzZChwZDMpLm1hdHJpeCgpKTsKICAgICBWRVJJRllfTUFUUklYKGdsTXVsdE1hdHJpeChwZDMpLCBQcm9qZWN0aXZlM2QocGQzKS5tYXRyaXgoKSk7CiAKICAgICAvLyB0cmFuc2xhdGlvbnMgKDJEIGFuZCAzRCkKICAgICB7Ci0gICAgICBWZWN0b3IyZiB2ZjI7IHZmMi5zZXRSYW5kb20oKTsgVmVjdG9yM2YgdmYyMzsgdmYyMyA8PCB2ZjIsIDA7CisgICAgICBWZWN0b3IyZiB2ZjI7CisgICAgICB2ZjIuc2V0UmFuZG9tKCk7CisgICAgICBWZWN0b3IzZiB2ZjIzOworICAgICAgdmYyMyA8PCB2ZjIsIDA7CiAgICAgICBWRVJJRllfTUFUUklYKGdsVHJhbnNsYXRlKHZmMiksIFByb2plY3RpdmUzZihUcmFuc2xhdGlvbjNmKHZmMjMpKS5tYXRyaXgoKSk7Ci0gICAgICBWZWN0b3IyZCB2ZDI7IHZkMi5zZXRSYW5kb20oKTsgVmVjdG9yM2QgdmQyMzsgdmQyMyA8PCB2ZDIsIDA7CisgICAgICBWZWN0b3IyZCB2ZDI7CisgICAgICB2ZDIuc2V0UmFuZG9tKCk7CisgICAgICBWZWN0b3IzZCB2ZDIzOworICAgICAgdmQyMyA8PCB2ZDIsIDA7CiAgICAgICBWRVJJRllfTUFUUklYKGdsVHJhbnNsYXRlKHZkMiksIFByb2plY3RpdmUzZChUcmFuc2xhdGlvbjNkKHZkMjMpKS5tYXRyaXgoKSk7CiAKLSAgICAgIFZlY3RvcjNmIHZmMzsgdmYzLnNldFJhbmRvbSgpOworICAgICAgVmVjdG9yM2YgdmYzOworICAgICAgdmYzLnNldFJhbmRvbSgpOwogICAgICAgVkVSSUZZX01BVFJJWChnbFRyYW5zbGF0ZSh2ZjMpLCBQcm9qZWN0aXZlM2YoVHJhbnNsYXRpb24zZih2ZjMpKS5tYXRyaXgoKSk7Ci0gICAgICBWZWN0b3IzZCB2ZDM7IHZkMy5zZXRSYW5kb20oKTsKKyAgICAgIFZlY3RvcjNkIHZkMzsKKyAgICAgIHZkMy5zZXRSYW5kb20oKTsKICAgICAgIFZFUklGWV9NQVRSSVgoZ2xUcmFuc2xhdGUodmQzKSwgUHJvamVjdGl2ZTNkKFRyYW5zbGF0aW9uM2QodmQzKSkubWF0cml4KCkpOwogCi0gICAgICBUcmFuc2xhdGlvbjxmbG9hdCwzPiB0ZjM7IHRmMy52ZWN0b3IoKS5zZXRSYW5kb20oKTsKKyAgICAgIFRyYW5zbGF0aW9uPGZsb2F0LCAzPiB0ZjM7CisgICAgICB0ZjMudmVjdG9yKCkuc2V0UmFuZG9tKCk7CiAgICAgICBWRVJJRllfTUFUUklYKGdsVHJhbnNsYXRlKHRmMyksIFByb2plY3RpdmUzZih0ZjMpLm1hdHJpeCgpKTsKIAotICAgICAgVHJhbnNsYXRpb248ZG91YmxlLDM+IHRkMzsgIHRkMy52ZWN0b3IoKS5zZXRSYW5kb20oKTsKKyAgICAgIFRyYW5zbGF0aW9uPGRvdWJsZSwgMz4gdGQzOworICAgICAgdGQzLnZlY3RvcigpLnNldFJhbmRvbSgpOwogICAgICAgVkVSSUZZX01BVFJJWChnbFRyYW5zbGF0ZSh0ZDMpLCBQcm9qZWN0aXZlM2QodGQzKS5tYXRyaXgoKSk7CiAgICAgfQogCiAgICAgLy8gc2NhbGluZyAoMkQgYW5kIDNEKQogICAgIHsKLSAgICAgIFZlY3RvcjJmIHZmMjsgdmYyLnNldFJhbmRvbSgpOyBWZWN0b3IzZiB2ZjIzOyB2ZjIzIDw8IHZmMiwgMTsKKyAgICAgIFZlY3RvcjJmIHZmMjsKKyAgICAgIHZmMi5zZXRSYW5kb20oKTsKKyAgICAgIFZlY3RvcjNmIHZmMjM7CisgICAgICB2ZjIzIDw8IHZmMiwgMTsKICAgICAgIFZFUklGWV9NQVRSSVgoZ2xTY2FsZSh2ZjIpLCBQcm9qZWN0aXZlM2YoU2NhbGluZyh2ZjIzKSkubWF0cml4KCkpOwotICAgICAgVmVjdG9yMmQgdmQyOyB2ZDIuc2V0UmFuZG9tKCk7IFZlY3RvcjNkIHZkMjM7IHZkMjMgPDwgdmQyLCAxOworICAgICAgVmVjdG9yMmQgdmQyOworICAgICAgdmQyLnNldFJhbmRvbSgpOworICAgICAgVmVjdG9yM2QgdmQyMzsKKyAgICAgIHZkMjMgPDwgdmQyLCAxOwogICAgICAgVkVSSUZZX01BVFJJWChnbFNjYWxlKHZkMiksIFByb2plY3RpdmUzZChTY2FsaW5nKHZkMjMpKS5tYXRyaXgoKSk7CiAKLSAgICAgIFZlY3RvcjNmIHZmMzsgdmYzLnNldFJhbmRvbSgpOworICAgICAgVmVjdG9yM2YgdmYzOworICAgICAgdmYzLnNldFJhbmRvbSgpOwogICAgICAgVkVSSUZZX01BVFJJWChnbFNjYWxlKHZmMyksIFByb2plY3RpdmUzZihTY2FsaW5nKHZmMykpLm1hdHJpeCgpKTsKLSAgICAgIFZlY3RvcjNkIHZkMzsgdmQzLnNldFJhbmRvbSgpOworICAgICAgVmVjdG9yM2QgdmQzOworICAgICAgdmQzLnNldFJhbmRvbSgpOwogICAgICAgVkVSSUZZX01BVFJJWChnbFNjYWxlKHZkMyksIFByb2plY3RpdmUzZChTY2FsaW5nKHZkMykpLm1hdHJpeCgpKTsKIAogICAgICAgVW5pZm9ybVNjYWxpbmc8ZmxvYXQ+IHVzZihpbnRlcm5hbDo6cmFuZG9tPGZsb2F0PigpKTsKQEAgLTM2OSwzMiArMzc5LDMyIEBACiAgIHsKICAgICAvLyB2ZXJ0ZXggc2hhZGVyLgogICAgIHN0ZDo6c3RyaW5nIHZ0eCA9IGZvcm1hdCgKLSAgICAgICIke0dMU0xfVkVSU0lPTn1cbiIKLSAgICAgICJ2b2lkIG1haW4odm9pZCkge1xuIgotICAgICAgIiAgZ2xfUG9zaXRpb24gPSB2ZWM0KDAsMCwwLDEpO1xuIgotICAgICAgIn1cbiIsCi0gICAgICBnbHNsX3ZhcnMsIGdsc2xfdmFscyk7Ci0KLSNpZmRlZiBHTF9WRVJTSU9OXzJfMAotICAgIGlmKEdMRVdfVkVSU0lPTl8yXzAgJiYgR0xfVkVSU0lPTl8yXzApCi0gICAgewotICAgICAgc3RkOjpzdHJpbmcgZnJnID0gZm9ybWF0KAogICAgICAgICAiJHtHTFNMX1ZFUlNJT059XG4iCi0gICAgICAgICJ1bmlmb3JtIHZlYzIgdjJmO1xuIgotICAgICAgICAidW5pZm9ybSB2ZWMzIHYzZjtcbiIKLSAgICAgICAgInVuaWZvcm0gdmVjNCB2NGY7XG4iCi0gICAgICAgICJ1bmlmb3JtIGl2ZWMyIHYyaTtcbiIKLSAgICAgICAgInVuaWZvcm0gaXZlYzMgdjNpO1xuIgotICAgICAgICAidW5pZm9ybSBpdmVjNCB2NGk7XG4iCi0gICAgICAgICJ1bmlmb3JtIG1hdDIgbTJmO1xuIgotICAgICAgICAidW5pZm9ybSBtYXQzIG0zZjtcbiIKLSAgICAgICAgInVuaWZvcm0gbWF0NCBtNGY7XG4iCi0gICAgICAgICIke0ZSQUdfT1VUUFVUX0RFQ0xBUkFUSU9OfVxuIgotICAgICAgICAidm9pZCBtYWluKHZvaWQpIHsgXG4iCi0gICAgICAgICIgICR7RlJBR19PVVRQVVRfVkFSSUFCTEV9ID0gdmVjNCh2MmZbMF0rdjNmWzBdK3Y0ZlswXSkrdmVjNCh2MmlbMF0rdjNpWzBdK3Y0aVswXSkrdmVjNChtMmZbMF1bMF0rbTNmWzBdWzBdK200ZlswXVswXSk7XG4iCisgICAgICAgICJ2b2lkIG1haW4odm9pZCkge1xuIgorICAgICAgICAiICBnbF9Qb3NpdGlvbiA9IHZlYzQoMCwwLDAsMSk7XG4iCiAgICAgICAgICJ9XG4iLAogICAgICAgICBnbHNsX3ZhcnMsIGdsc2xfdmFscyk7CiAKKyNpZmRlZiBHTF9WRVJTSU9OXzJfMAorICAgIGlmIChHTEVXX1ZFUlNJT05fMl8wICYmIEdMX1ZFUlNJT05fMl8wKSB7CisgICAgICBzdGQ6OnN0cmluZyBmcmcgPSBmb3JtYXQoCisgICAgICAgICAgIiR7R0xTTF9WRVJTSU9OfVxuIgorICAgICAgICAgICJ1bmlmb3JtIHZlYzIgdjJmO1xuIgorICAgICAgICAgICJ1bmlmb3JtIHZlYzMgdjNmO1xuIgorICAgICAgICAgICJ1bmlmb3JtIHZlYzQgdjRmO1xuIgorICAgICAgICAgICJ1bmlmb3JtIGl2ZWMyIHYyaTtcbiIKKyAgICAgICAgICAidW5pZm9ybSBpdmVjMyB2M2k7XG4iCisgICAgICAgICAgInVuaWZvcm0gaXZlYzQgdjRpO1xuIgorICAgICAgICAgICJ1bmlmb3JtIG1hdDIgbTJmO1xuIgorICAgICAgICAgICJ1bmlmb3JtIG1hdDMgbTNmO1xuIgorICAgICAgICAgICJ1bmlmb3JtIG1hdDQgbTRmO1xuIgorICAgICAgICAgICIke0ZSQUdfT1VUUFVUX0RFQ0xBUkFUSU9OfVxuIgorICAgICAgICAgICJ2b2lkIG1haW4odm9pZCkgeyBcbiIKKyAgICAgICAgICAiICAke0ZSQUdfT1VUUFVUX1ZBUklBQkxFfSA9ICIKKyAgICAgICAgICAidmVjNCh2MmZbMF0rdjNmWzBdK3Y0ZlswXSkrdmVjNCh2MmlbMF0rdjNpWzBdK3Y0aVswXSkrdmVjNChtMmZbMF1bMF0rbTNmWzBdWzBdK200ZlswXVswXSk7XG4iCisgICAgICAgICAgIn1cbiIsCisgICAgICAgICAgZ2xzbF92YXJzLCBnbHNsX3ZhbHMpOworCiAgICAgICBHTGludCBwcmdfaWQgPSBjcmVhdGVQcm9ncmFtKHZ0eCwgZnJnKTsKICAgICAgIFZFUklGWShwcmdfaWQgPiAwICYmICJGYWlsZWQgdG8gY3JlYXRlIHByb2dyYW0uIik7CiAgICAgICBWRVJJRllfVU5JRk9STShmdiwgdjJmLCBWZWN0b3IyZik7CkBAIC00MDcsMzcgKzQxNywzNSBAQAogICAgICAgVkVSSUZZX1VOSUZPUk0oZnYsIG0zZiwgTWF0cml4M2YpOwogICAgICAgVkVSSUZZX1VOSUZPUk0oZnYsIG00ZiwgTWF0cml4NGYpOwogICAgICAgZ2xEZWxldGVQcm9ncmFtKHByZ19pZCk7Ci0gICAgfQotICAgIGVsc2UKKyAgICB9IGVsc2UKICNlbmRpZgogICAgICAgc3RkOjpjZXJyIDw8ICJXYXJuaW5nOiBvcGVuZ2wgMi4wIHdhcyBub3QgdGVzdGVkLlxuIjsKIAogI2lmZGVmIEdMX1ZFUlNJT05fMl8xCi0gICAgaWYoR0xFV19WRVJTSU9OXzJfMSAmJiBHTF9WRVJTSU9OXzJfMSAmJgotICAgICAgICAoZ2xfbWFqb3JfdmVyc2lvbiA+IDIgfHwgKGdsX21ham9yX3ZlcnNpb24gPT0gMiAmJiBnbF9taW5vcl92ZXJzaW9uID49IDEpKSkKLSAgICB7CisgICAgaWYgKEdMRVdfVkVSU0lPTl8yXzEgJiYgR0xfVkVSU0lPTl8yXzEgJiYKKyAgICAgICAgKGdsX21ham9yX3ZlcnNpb24gPiAyIHx8IChnbF9tYWpvcl92ZXJzaW9uID09IDIgJiYgZ2xfbWlub3JfdmVyc2lvbiA+PSAxKSkpIHsKICAgICAgIHN0ZDo6c3RyaW5nIGZyZyA9IGZvcm1hdCgKLSAgICAgICAgIiR7R0xTTF9WRVJTSU9OfVxuIgotICAgICAgICAidW5pZm9ybSBtYXQyeDMgbTIzZjtcbiIKLSAgICAgICAgInVuaWZvcm0gbWF0M3gyIG0zMmY7XG4iCi0gICAgICAgICJ1bmlmb3JtIG1hdDJ4NCBtMjRmO1xuIgotICAgICAgICAidW5pZm9ybSBtYXQ0eDIgbTQyZjtcbiIKLSAgICAgICAgInVuaWZvcm0gbWF0M3g0IG0zNGY7XG4iCi0gICAgICAgICJ1bmlmb3JtIG1hdDR4MyBtNDNmO1xuIgotICAgICAgICAiJHtGUkFHX09VVFBVVF9ERUNMQVJBVElPTn1cbiIKLSAgICAgICAgInZvaWQgbWFpbih2b2lkKSB7XG4iCi0gICAgICAgICIgICR7RlJBR19PVVRQVVRfVkFSSUFCTEV9ID0gdmVjNChtMjNmWzBdWzBdK20zMmZbMF1bMF0rbTI0ZlswXVswXSttNDJmWzBdWzBdK20zNGZbMF1bMF0rbTQzZlswXVswXSk7XG4iCi0gICAgICAgICJ9XG4iLAotICAgICAgICBnbHNsX3ZhcnMsIGdsc2xfdmFscyk7CisgICAgICAgICAgIiR7R0xTTF9WRVJTSU9OfVxuIgorICAgICAgICAgICJ1bmlmb3JtIG1hdDJ4MyBtMjNmO1xuIgorICAgICAgICAgICJ1bmlmb3JtIG1hdDN4MiBtMzJmO1xuIgorICAgICAgICAgICJ1bmlmb3JtIG1hdDJ4NCBtMjRmO1xuIgorICAgICAgICAgICJ1bmlmb3JtIG1hdDR4MiBtNDJmO1xuIgorICAgICAgICAgICJ1bmlmb3JtIG1hdDN4NCBtMzRmO1xuIgorICAgICAgICAgICJ1bmlmb3JtIG1hdDR4MyBtNDNmO1xuIgorICAgICAgICAgICIke0ZSQUdfT1VUUFVUX0RFQ0xBUkFUSU9OfVxuIgorICAgICAgICAgICJ2b2lkIG1haW4odm9pZCkge1xuIgorICAgICAgICAgICIgICR7RlJBR19PVVRQVVRfVkFSSUFCTEV9ID0gdmVjNChtMjNmWzBdWzBdK20zMmZbMF1bMF0rbTI0ZlswXVswXSttNDJmWzBdWzBdK20zNGZbMF1bMF0rbTQzZlswXVswXSk7XG4iCisgICAgICAgICAgIn1cbiIsCisgICAgICAgICAgZ2xzbF92YXJzLCBnbHNsX3ZhbHMpOwogCiAgICAgICBHTGludCBwcmdfaWQgPSBjcmVhdGVQcm9ncmFtKHZ0eCwgZnJnKTsKICAgICAgIFZFUklGWShwcmdfaWQgPiAwICYmICJGYWlsZWQgdG8gY3JlYXRlIHByb2dyYW0uIik7Ci0gICAgICB0eXBlZGVmIE1hdHJpeDxmbG9hdCwyLDM+IE1hdHJpeDIzZjsKLSAgICAgIHR5cGVkZWYgTWF0cml4PGZsb2F0LDMsMj4gTWF0cml4MzJmOwotICAgICAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsMiw0PiBNYXRyaXgyNGY7Ci0gICAgICB0eXBlZGVmIE1hdHJpeDxmbG9hdCw0LDI+IE1hdHJpeDQyZjsKLSAgICAgIHR5cGVkZWYgTWF0cml4PGZsb2F0LDMsND4gTWF0cml4MzRmOwotICAgICAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsNCwzPiBNYXRyaXg0M2Y7CisgICAgICB0eXBlZGVmIE1hdHJpeDxmbG9hdCwgMiwgMz4gTWF0cml4MjNmOworICAgICAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsIDMsIDI+IE1hdHJpeDMyZjsKKyAgICAgIHR5cGVkZWYgTWF0cml4PGZsb2F0LCAyLCA0PiBNYXRyaXgyNGY7CisgICAgICB0eXBlZGVmIE1hdHJpeDxmbG9hdCwgNCwgMj4gTWF0cml4NDJmOworICAgICAgdHlwZWRlZiBNYXRyaXg8ZmxvYXQsIDMsIDQ+IE1hdHJpeDM0ZjsKKyAgICAgIHR5cGVkZWYgTWF0cml4PGZsb2F0LCA0LCAzPiBNYXRyaXg0M2Y7CiAKICAgICAgIFZFUklGWV9VTklGT1JNKGZ2LCBtMjNmLCBNYXRyaXgyM2YpOwogICAgICAgVkVSSUZZX1VOSUZPUk0oZnYsIG0zMmYsIE1hdHJpeDMyZik7CkBAIC00NDYsMzcgKzQ1NCwzNCBAQAogICAgICAgVkVSSUZZX1VOSUZPUk0oZnYsIG0zNGYsIE1hdHJpeDM0Zik7CiAgICAgICBWRVJJRllfVU5JRk9STShmdiwgbTQzZiwgTWF0cml4NDNmKTsKICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcmdfaWQpOwotICAgIH0KLSAgICBlbHNlCisgICAgfSBlbHNlCiAjZW5kaWYKICAgICAgIHN0ZDo6Y2VyciA8PCAiV2FybmluZzogb3BlbmdsIDIuMSB3YXMgbm90IHRlc3RlZC5cbiI7CiAKICNpZmRlZiBHTF9WRVJTSU9OXzNfMAotICAgIGlmKEdMRVdfVkVSU0lPTl8zXzAgJiYgR0xfVkVSU0lPTl8zXzAgJiYgZ2xfbWFqb3JfdmVyc2lvbiA+PSAzKQotICAgIHsKKyAgICBpZiAoR0xFV19WRVJTSU9OXzNfMCAmJiBHTF9WRVJTSU9OXzNfMCAmJiBnbF9tYWpvcl92ZXJzaW9uID49IDMpIHsKICAgICAgIHN0ZDo6c3RyaW5nIGZyZyA9IGZvcm1hdCgKLSAgICAgICAgIiR7R0xTTF9WRVJTSU9OfVxuIgotICAgICAgICAidW5pZm9ybSB1dmVjMiB2MnVpO1xuIgotICAgICAgICAidW5pZm9ybSB1dmVjMyB2M3VpO1xuIgotICAgICAgICAidW5pZm9ybSB1dmVjNCB2NHVpO1xuIgotICAgICAgICAiJHtGUkFHX09VVFBVVF9ERUNMQVJBVElPTn1cbiIKLSAgICAgICAgInZvaWQgbWFpbih2b2lkKSB7XG4iCi0gICAgICAgICIgICR7RlJBR19PVVRQVVRfVkFSSUFCTEV9ID0gdmVjNCh2MnVpWzBdK3YzdWlbMF0rdjR1aVswXSk7XG4iCi0gICAgICAgICJ9XG4iLAotICAgICAgICBnbHNsX3ZhcnMsIGdsc2xfdmFscyk7CisgICAgICAgICAgIiR7R0xTTF9WRVJTSU9OfVxuIgorICAgICAgICAgICJ1bmlmb3JtIHV2ZWMyIHYydWk7XG4iCisgICAgICAgICAgInVuaWZvcm0gdXZlYzMgdjN1aTtcbiIKKyAgICAgICAgICAidW5pZm9ybSB1dmVjNCB2NHVpO1xuIgorICAgICAgICAgICIke0ZSQUdfT1VUUFVUX0RFQ0xBUkFUSU9OfVxuIgorICAgICAgICAgICJ2b2lkIG1haW4odm9pZCkge1xuIgorICAgICAgICAgICIgICR7RlJBR19PVVRQVVRfVkFSSUFCTEV9ID0gdmVjNCh2MnVpWzBdK3YzdWlbMF0rdjR1aVswXSk7XG4iCisgICAgICAgICAgIn1cbiIsCisgICAgICAgICAgZ2xzbF92YXJzLCBnbHNsX3ZhbHMpOwogCiAgICAgICBHTGludCBwcmdfaWQgPSBjcmVhdGVQcm9ncmFtKHZ0eCwgZnJnKTsKICAgICAgIFZFUklGWShwcmdfaWQgPiAwICYmICJGYWlsZWQgdG8gY3JlYXRlIHByb2dyYW0uIik7Ci0gICAgICB0eXBlZGVmIE1hdHJpeDx1bnNpZ25lZCBpbnQsMiwxPiBWZWN0b3IydWk7Ci0gICAgICB0eXBlZGVmIE1hdHJpeDx1bnNpZ25lZCBpbnQsMywxPiBWZWN0b3IzdWk7Ci0gICAgICB0eXBlZGVmIE1hdHJpeDx1bnNpZ25lZCBpbnQsNCwxPiBWZWN0b3I0dWk7CisgICAgICB0eXBlZGVmIE1hdHJpeDx1bnNpZ25lZCBpbnQsIDIsIDE+IFZlY3RvcjJ1aTsKKyAgICAgIHR5cGVkZWYgTWF0cml4PHVuc2lnbmVkIGludCwgMywgMT4gVmVjdG9yM3VpOworICAgICAgdHlwZWRlZiBNYXRyaXg8dW5zaWduZWQgaW50LCA0LCAxPiBWZWN0b3I0dWk7CiAKICAgICAgIFZFUklGWV9VTklGT1JNaSh2MnVpLCBWZWN0b3IydWkpOwogICAgICAgVkVSSUZZX1VOSUZPUk1pKHYzdWksIFZlY3RvcjN1aSk7CiAgICAgICBWRVJJRllfVU5JRk9STWkodjR1aSwgVmVjdG9yNHVpKTsKICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcmdfaWQpOwotICAgIH0KLSAgICBlbHNlCisgICAgfSBlbHNlCiAjZW5kaWYKICAgICAgIHN0ZDo6Y2VyciA8PCAiV2FybmluZzogb3BlbmdsIDMuMCB3YXMgbm90IHRlc3RlZC5cbiI7CiAKQEAgLTQ4NCwyMyArNDg5LDIwIEBACiAgICAgYm9vbCBoYXNfZnA2NF9uYXRpdmUgPSAoZ2xfbWFqb3JfdmVyc2lvbiA9PSA0ICYmIGdsX21pbm9yX3ZlcnNpb24gPj0gMSk7CiAgICAgYm9vbCBoYXNfZnA2NF9leHRlbnNpb24gPSBmYWxzZTsKICNpZmRlZiBHTEVXX0FSQl9ncHVfc2hhZGVyX2ZwNjQKLSAgICBpZihHTEVXX0FSQl9ncHVfc2hhZGVyX2ZwNjQpCi0gICAgeworICAgIGlmIChHTEVXX0FSQl9ncHVfc2hhZGVyX2ZwNjQpIHsKICAgICAgIC8vIENoZWNrIHRoYXQgZXh0ZW5zaW9uIGNhbiBhY3R1YWxseSBiZSBjb21waWxlZC4KLSAgICAgIGlmIChoYXNfZnA2NF9leHRlbnNpb24pCi0gICAgICB7CisgICAgICBpZiAoaGFzX2ZwNjRfZXh0ZW5zaW9uKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGZyZyA9IGZvcm1hdCgKLSAgICAgICAgICAiJHtHTFNMX1ZFUlNJT059XG4iCi0gICAgICAgICAgIiNleHRlbnNpb24gR0xfQVJCX2dwdV9zaGFkZXJfZnA2NCA6IGVuYWJsZVxuIgotICAgICAgICAgICJ1bmlmb3JtIGR2ZWMyIGR2MjtcbiIKLSAgICAgICAgICAiJHtGUkFHX09VVFBVVF9ERUNMQVJBVElPTn1cbiIKLSAgICAgICAgICAidm9pZCBtYWluKHZvaWQpIHtcbiIKLSAgICAgICAgICAiICAke0ZSQUdfT1VUUFVUX1ZBUklBQkxFfSA9IHZlYzQoZHYyLngsIGR2Mi55LCBkdjIueCwgZHYyLnkpO1xuIgotICAgICAgICAgICJ9XG4iLAotICAgICAgICAgIGdsc2xfdmFycywgZ2xzbF92YWxzKTsKKyAgICAgICAgICAgICIke0dMU0xfVkVSU0lPTn1cbiIKKyAgICAgICAgICAgICIjZXh0ZW5zaW9uIEdMX0FSQl9ncHVfc2hhZGVyX2ZwNjQgOiBlbmFibGVcbiIKKyAgICAgICAgICAgICJ1bmlmb3JtIGR2ZWMyIGR2MjtcbiIKKyAgICAgICAgICAgICIke0ZSQUdfT1VUUFVUX0RFQ0xBUkFUSU9OfVxuIgorICAgICAgICAgICAgInZvaWQgbWFpbih2b2lkKSB7XG4iCisgICAgICAgICAgICAiICAke0ZSQUdfT1VUUFVUX1ZBUklBQkxFfSA9IHZlYzQoZHYyLngsIGR2Mi55LCBkdjIueCwgZHYyLnkpO1xuIgorICAgICAgICAgICAgIn1cbiIsCisgICAgICAgICAgICBnbHNsX3ZhcnMsIGdsc2xfdmFscyk7CiAgICAgICAgIEdMaW50IHByZ19pZCA9IGNyZWF0ZVByb2dyYW0odnR4LCBmcmcsIC8qcHJpbnRfZXJyb3JzPSovZmFsc2UpOwotICAgICAgICBpZiAocHJnX2lkKQotICAgICAgICB7CisgICAgICAgIGlmIChwcmdfaWQpIHsKICAgICAgICAgICBoYXNfZnA2NF9leHRlbnNpb24gPSB0cnVlOwogICAgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcmdfaWQpOwogICAgICAgICB9CkBAIC01MDgsNDAgKzUxMCwzNSBAQAogICAgIH0KICNlbmRpZgogCi0gICAgaWYoIGhhc19mcDY0X25hdGl2ZSB8fCBoYXNfZnA2NF9leHRlbnNpb24gKQotICAgIHsKKyAgICBpZiAoaGFzX2ZwNjRfbmF0aXZlIHx8IGhhc19mcDY0X2V4dGVuc2lvbikgewogICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdsc2xfdmFyc193aXRoX2V4dGVuc2lvbiA9IGdsc2xfdmFyczsKICAgICAgIGdsc2xfdmFyc193aXRoX2V4dGVuc2lvbi5wdXNoX2JhY2soIiR7R0xTTF9FWFRFTlNJT05TfSIpOwogICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdsc2xfdmFsc193aXRoX2V4dGVuc2lvbiA9IGdsc2xfdmFsczsKLSAgICAgIGlmIChoYXNfZnA2NF9leHRlbnNpb24pCi0gICAgICB7CisgICAgICBpZiAoaGFzX2ZwNjRfZXh0ZW5zaW9uKSB7CiAgICAgICAgIGdsc2xfdmFsc193aXRoX2V4dGVuc2lvbi5wdXNoX2JhY2soIiNleHRlbnNpb24gR0xfQVJCX2dwdV9zaGFkZXJfZnA2NCA6IGVuYWJsZSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgZ2xzbF92YWxzX3dpdGhfZXh0ZW5zaW9uLnB1c2hfYmFjaygiIik7CiAgICAgICB9CiAKICAgICAgIHN0ZDo6c3RyaW5nIGZyZyA9IGZvcm1hdCgKLSAgICAgICAgIiR7R0xTTF9WRVJTSU9OfVxuIgotICAgICAgICAiJHtHTFNMX0VYVEVOU0lPTlN9XG4iCi0gICAgICAgICJ1bmlmb3JtIGR2ZWMyIHYyZDtcbiIKLSAgICAgICAgInVuaWZvcm0gZHZlYzMgdjNkO1xuIgotICAgICAgICAidW5pZm9ybSBkdmVjNCB2NGQ7XG4iCi0gICAgICAgICIke0ZSQUdfT1VUUFVUX0RFQ0xBUkFUSU9OfVxuIgotICAgICAgICAidm9pZCBtYWluKHZvaWQpIHtcbiIKLSAgICAgICAgIiAgJHtGUkFHX09VVFBVVF9WQVJJQUJMRX0gPSB2ZWM0KHYyZFswXSt2M2RbMF0rdjRkWzBdKTtcbiIKLSAgICAgICAgIn1cbiIsCi0gICAgICAgIGdsc2xfdmFyc193aXRoX2V4dGVuc2lvbiwgZ2xzbF92YWxzX3dpdGhfZXh0ZW5zaW9uKTsKKyAgICAgICAgICAiJHtHTFNMX1ZFUlNJT059XG4iCisgICAgICAgICAgIiR7R0xTTF9FWFRFTlNJT05TfVxuIgorICAgICAgICAgICJ1bmlmb3JtIGR2ZWMyIHYyZDtcbiIKKyAgICAgICAgICAidW5pZm9ybSBkdmVjMyB2M2Q7XG4iCisgICAgICAgICAgInVuaWZvcm0gZHZlYzQgdjRkO1xuIgorICAgICAgICAgICIke0ZSQUdfT1VUUFVUX0RFQ0xBUkFUSU9OfVxuIgorICAgICAgICAgICJ2b2lkIG1haW4odm9pZCkge1xuIgorICAgICAgICAgICIgICR7RlJBR19PVVRQVVRfVkFSSUFCTEV9ID0gdmVjNCh2MmRbMF0rdjNkWzBdK3Y0ZFswXSk7XG4iCisgICAgICAgICAgIn1cbiIsCisgICAgICAgICAgZ2xzbF92YXJzX3dpdGhfZXh0ZW5zaW9uLCBnbHNsX3ZhbHNfd2l0aF9leHRlbnNpb24pOwogCi0gICAgICBHTGludCBwcmdfaWQgPSBjcmVhdGVQcm9ncmFtKHZ0eCxmcmcpOworICAgICAgR0xpbnQgcHJnX2lkID0gY3JlYXRlUHJvZ3JhbSh2dHgsIGZyZyk7CiAgICAgICBWRVJJRlkocHJnX2lkID4gMCAmJiAiRmFpbGVkIHRvIGNyZWF0ZSBwcm9ncmFtLiIpOwogICAgICAgVkVSSUZZX1VOSUZPUk0oZHYsIHYyZCwgVmVjdG9yMmQpOwogICAgICAgVkVSSUZZX1VOSUZPUk0oZHYsIHYzZCwgVmVjdG9yM2QpOwogICAgICAgVkVSSUZZX1VOSUZPUk0oZHYsIHY0ZCwgVmVjdG9yNGQpOwogICAgICAgZ2xEZWxldGVQcm9ncmFtKHByZ19pZCk7Ci0gICAgfQotICAgIGVsc2UKKyAgICB9IGVsc2UKICAgICAgIHN0ZDo6Y2VyciA8PCAiV2FybmluZzogZHZlYyAoZnA2NCkgd2FzIG5vdCB0ZXN0ZWQuXG4iOwogICB9CiAKQEAgLTU1Niw4ICs1NTMsNyBAQAogI2VuZGlmCiB9CiAKLUVJR0VOX0RFQ0xBUkVfVEVTVChvcGVuZ2xzdXBwb3J0KQoteworRUlHRU5fREVDTEFSRV9URVNUKG9wZW5nbHN1cHBvcnQpIHsKICAgaW50IGFyZ2MgPSAwOwogICBnbHV0SW5pdCgmYXJnYywgMCk7CiAKQEAgLTU3OSwxNSArNTc1LDEzIEBACiAgIGdsdXRJbml0V2luZG93U2l6ZSgxMCwgMTApOwogCiAgIGludCB3aW5kb3cgPSBnbHV0Q3JlYXRlV2luZG93KCJFaWdlbiIpOwotICBpZih3aW5kb3cgPD0gMCkKLSAgeworICBpZiAod2luZG93IDw9IDApIHsKICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yOiBVbmFibGUgdG8gY3JlYXRlIEdMVVQgV2luZG93LlxuIjsKICAgICBleGl0KDEpOwogICB9CiAKICAgZ2xld0V4cGVyaW1lbnRhbCA9IEdMX1RSVUU7Ci0gIGlmKGdsZXdJbml0KCkgIT0gR0xFV19PSykKLSAgeworICBpZiAoZ2xld0luaXQoKSAhPSBHTEVXX09LKSB7CiAgICAgc3RkOjpjZXJyIDw8ICJXYXJuaW5nOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBHTEVXLlxuIjsKICAgICBleGl0KDEpOwogICB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L3BvbHlub21pYWxzb2x2ZXIuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9wb2x5bm9taWFsc29sdmVyLmNwcAppbmRleCBmZWQ5Zjg5Li4xMmQxMzdkIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L3BvbHlub21pYWxzb2x2ZXIuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvcG9seW5vbWlhbHNvbHZlci5jcHAKQEAgLTE2LDU3ICsxNiw1MCBAQAogCiBuYW1lc3BhY2UgRWlnZW4gewogbmFtZXNwYWNlIGludGVybmFsIHsKLXRlbXBsYXRlPGludCBTaXplPgotc3RydWN0IGluY3JlbWVudF9pZl9maXhlZF9zaXplCi17Ci0gIGVudW0gewotICAgIHJldCA9IChTaXplID09IER5bmFtaWMpID8gRHluYW1pYyA6IFNpemUrMQotICB9OwordGVtcGxhdGUgPGludCBTaXplPgorc3RydWN0IGluY3JlbWVudF9pZl9maXhlZF9zaXplIHsKKyAgZW51bSB7IHJldCA9IChTaXplID09IER5bmFtaWMpID8gRHluYW1pYyA6IFNpemUgKyAxIH07CiB9OwotfQotfQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KIAotdGVtcGxhdGU8dHlwZW5hbWUgUG9seW5vbWlhbFR5cGU+Ci1Qb2x5bm9taWFsVHlwZSBwb2x5ZGVyKGNvbnN0IFBvbHlub21pYWxUeXBlJiBwKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFBvbHlub21pYWxUeXBlPgorUG9seW5vbWlhbFR5cGUgcG9seWRlcihjb25zdCBQb2x5bm9taWFsVHlwZSYgcCkgewogICB0eXBlZGVmIHR5cGVuYW1lIFBvbHlub21pYWxUeXBlOjpTY2FsYXIgU2NhbGFyOwogICBQb2x5bm9taWFsVHlwZSByZXMocC5zaXplKCkpOwotICBmb3IoSW5kZXggaT0xOyBpPHAuc2l6ZSgpOyArK2kpCi0gICAgcmVzW2ktMV0gPSBwW2ldKlNjYWxhcihpKTsKLSAgcmVzW3Auc2l6ZSgpLTFdID0gMC47CisgIGZvciAoSW5kZXggaSA9IDE7IGkgPCBwLnNpemUoKTsgKytpKSByZXNbaSAtIDFdID0gcFtpXSAqIFNjYWxhcihpKTsKKyAgcmVzW3Auc2l6ZSgpIC0gMV0gPSAwLjsKICAgcmV0dXJuIHJlczsKIH0KIAotdGVtcGxhdGU8aW50IERlZywgdHlwZW5hbWUgUE9MWU5PTUlBTCwgdHlwZW5hbWUgU09MVkVSPgotYm9vbCBhdXhfZXZhbFNvbHZlciggY29uc3QgUE9MWU5PTUlBTCYgcG9scywgU09MVkVSJiBwc29sdmUgKQotewordGVtcGxhdGUgPGludCBEZWcsIHR5cGVuYW1lIFBPTFlOT01JQUwsIHR5cGVuYW1lIFNPTFZFUj4KK2Jvb2wgYXV4X2V2YWxTb2x2ZXIoY29uc3QgUE9MWU5PTUlBTCYgcG9scywgU09MVkVSJiBwc29sdmUpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBQT0xZTk9NSUFMOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIFBPTFlOT01JQUw6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKIAotICB0eXBlZGVmIHR5cGVuYW1lIFNPTFZFUjo6Um9vdHNUeXBlICAgIFJvb3RzVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhcixEZWcsMT4gICAgICBFdmFsUm9vdHNUeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIFNPTFZFUjo6Um9vdHNUeXBlIFJvb3RzVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhciwgRGVnLCAxPiBFdmFsUm9vdHNUeXBlOwogCi0gIGNvbnN0IEluZGV4IGRlZyA9IHBvbHMuc2l6ZSgpLTE7CisgIGNvbnN0IEluZGV4IGRlZyA9IHBvbHMuc2l6ZSgpIC0gMTsKIAogICAvLyBUZXN0IHRlbXBsYXRlIGNvbnN0cnVjdG9yIGZyb20gY29lZmZpY2llbnQgdmVjdG9yCi0gIFNPTFZFUiBzb2x2ZV9jb25zdHIgKHBvbHMpOworICBTT0xWRVIgc29sdmVfY29uc3RyKHBvbHMpOwogCi0gIHBzb2x2ZS5jb21wdXRlKCBwb2xzICk7Ci0gIGNvbnN0IFJvb3RzVHlwZSYgcm9vdHMoIHBzb2x2ZS5yb290cygpICk7Ci0gIEV2YWxSb290c1R5cGUgZXZyKCBkZWcgKTsKKyAgcHNvbHZlLmNvbXB1dGUocG9scyk7CisgIGNvbnN0IFJvb3RzVHlwZSYgcm9vdHMocHNvbHZlLnJvb3RzKCkpOworICBFdmFsUm9vdHNUeXBlIGV2cihkZWcpOwogICBQT0xZTk9NSUFMIHBvbHNfZGVyID0gcG9seWRlcihwb2xzKTsKLSAgRXZhbFJvb3RzVHlwZSBkZXIoIGRlZyApOwotICBmb3IoIGludCBpPTA7IGk8cm9vdHMuc2l6ZSgpOyArK2kgKXsKLSAgICBldnJbaV0gPSBzdGQ6OmFicyggcG9seV9ldmFsKCBwb2xzLCByb290c1tpXSApICk7Ci0gICAgZGVyW2ldID0gbnVtZXh0OjptYXhpKFJlYWxTY2FsYXIoMS4pLCBzdGQ6OmFicyggcG9seV9ldmFsKCBwb2xzX2Rlciwgcm9vdHNbaV0gKSApKTsKKyAgRXZhbFJvb3RzVHlwZSBkZXIoZGVnKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5zaXplKCk7ICsraSkgeworICAgIGV2cltpXSA9IHN0ZDo6YWJzKHBvbHlfZXZhbChwb2xzLCByb290c1tpXSkpOworICAgIGRlcltpXSA9IG51bWV4dDo6bWF4aShSZWFsU2NhbGFyKDEuKSwgc3RkOjphYnMocG9seV9ldmFsKHBvbHNfZGVyLCByb290c1tpXSkpKTsKICAgfQogCiAgIC8vIHdlIG5lZWQgdG8gZGl2aWRlIGJ5IHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRlcml2YXRpdmUgYmVjYXVzZQogICAvLyB3aXRoIGEgaGlnaCBkZXJpdmF0aXZlIGlzIHZlcnkgc21hbGwgZXJyb3IgaW4gdGhlIHZhbHVlIG9mIHRoZSByb290CiAgIC8vIHlpZWxzIGEgdmVyeSBsYXJnZSBlcnJvciBpbiB0aGUgcG9seW5vbWlhbCBldmFsdWF0aW9uLgotICBib29sIGV2YWxUb1plcm8gPSAoZXZyLmN3aXNlUXVvdGllbnQoZGVyKSkuaXNaZXJvKCB0ZXN0X3ByZWNpc2lvbjxTY2FsYXI+KCkgKTsKLSAgaWYoICFldmFsVG9aZXJvICkKLSAgeworICBib29sIGV2YWxUb1plcm8gPSAoZXZyLmN3aXNlUXVvdGllbnQoZGVyKSkuaXNaZXJvKHRlc3RfcHJlY2lzaW9uPFNjYWxhcj4oKSk7CisgIGlmICghZXZhbFRvWmVybykgewogICAgIGNlcnIgPDwgIldST05HIHJvb3Q6ICIgPDwgZW5kbDsKICAgICBjZXJyIDw8ICJQb2x5bm9taWFsOiAiIDw8IHBvbHMudHJhbnNwb3NlKCkgPDwgZW5kbDsKICAgICBjZXJyIDw8ICJSb290cyBmb3VuZDogIiA8PCByb290cy50cmFuc3Bvc2UoKSA8PCBlbmRsOwpAQCAtNzQsMTU5ICs2NywxMzcgQEAKICAgICBjZXJyIDw8IGVuZGw7CiAgIH0KIAotICBzdGQ6OnZlY3RvcjxSZWFsU2NhbGFyPiByb290TW9kdWxpKCByb290cy5zaXplKCkgKTsKLSAgTWFwPCBFdmFsUm9vdHNUeXBlID4gYXV4KCAmcm9vdE1vZHVsaVswXSwgcm9vdHMuc2l6ZSgpICk7CisgIHN0ZDo6dmVjdG9yPFJlYWxTY2FsYXI+IHJvb3RNb2R1bGkocm9vdHMuc2l6ZSgpKTsKKyAgTWFwPEV2YWxSb290c1R5cGU+IGF1eCgmcm9vdE1vZHVsaVswXSwgcm9vdHMuc2l6ZSgpKTsKICAgYXV4ID0gcm9vdHMuYXJyYXkoKS5hYnMoKTsKLSAgc3RkOjpzb3J0KCByb290TW9kdWxpLmJlZ2luKCksIHJvb3RNb2R1bGkuZW5kKCkgKTsKLSAgYm9vbCBkaXN0aW5jdE1vZHVsaT10cnVlOwotICBmb3IoIHNpemVfdCBpPTE7IGk8cm9vdE1vZHVsaS5zaXplKCkgJiYgZGlzdGluY3RNb2R1bGk7ICsraSApCi0gIHsKLSAgICBpZiggaW50ZXJuYWw6OmlzQXBwcm94KCByb290TW9kdWxpW2ldLCByb290TW9kdWxpW2ktMV0gKSApewotICAgICAgZGlzdGluY3RNb2R1bGkgPSBmYWxzZTsgfQorICBzdGQ6OnNvcnQocm9vdE1vZHVsaS5iZWdpbigpLCByb290TW9kdWxpLmVuZCgpKTsKKyAgYm9vbCBkaXN0aW5jdE1vZHVsaSA9IHRydWU7CisgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgcm9vdE1vZHVsaS5zaXplKCkgJiYgZGlzdGluY3RNb2R1bGk7ICsraSkgeworICAgIGlmIChpbnRlcm5hbDo6aXNBcHByb3gocm9vdE1vZHVsaVtpXSwgcm9vdE1vZHVsaVtpIC0gMV0pKSB7CisgICAgICBkaXN0aW5jdE1vZHVsaSA9IGZhbHNlOworICAgIH0KICAgfQotICBWRVJJRlkoIGV2YWxUb1plcm8gfHwgIWRpc3RpbmN0TW9kdWxpICk7CisgIFZFUklGWShldmFsVG9aZXJvIHx8ICFkaXN0aW5jdE1vZHVsaSk7CiAKICAgcmV0dXJuIGRpc3RpbmN0TW9kdWxpOwogfQogCi0KLQotCi0KLQotCi10ZW1wbGF0ZTxpbnQgRGVnLCB0eXBlbmFtZSBQT0xZTk9NSUFMPgotdm9pZCBldmFsU29sdmVyKCBjb25zdCBQT0xZTk9NSUFMJiBwb2xzICkKLXsKK3RlbXBsYXRlIDxpbnQgRGVnLCB0eXBlbmFtZSBQT0xZTk9NSUFMPgordm9pZCBldmFsU29sdmVyKGNvbnN0IFBPTFlOT01JQUwmIHBvbHMpIHsKICAgdHlwZWRlZiB0eXBlbmFtZSBQT0xZTk9NSUFMOjpTY2FsYXIgU2NhbGFyOwogCi0gIHR5cGVkZWYgUG9seW5vbWlhbFNvbHZlcjxTY2FsYXIsIERlZyA+IFBvbHlub21pYWxTb2x2ZXJUeXBlOworICB0eXBlZGVmIFBvbHlub21pYWxTb2x2ZXI8U2NhbGFyLCBEZWc+IFBvbHlub21pYWxTb2x2ZXJUeXBlOwogCiAgIFBvbHlub21pYWxTb2x2ZXJUeXBlIHBzb2x2ZTsKLSAgYXV4X2V2YWxTb2x2ZXI8RGVnLCBQT0xZTk9NSUFMLCBQb2x5bm9taWFsU29sdmVyVHlwZT4oIHBvbHMsIHBzb2x2ZSApOworICBhdXhfZXZhbFNvbHZlcjxEZWcsIFBPTFlOT01JQUwsIFBvbHlub21pYWxTb2x2ZXJUeXBlPihwb2xzLCBwc29sdmUpOwogfQogCi0KLQotCi10ZW1wbGF0ZTwgaW50IERlZywgdHlwZW5hbWUgUE9MWU5PTUlBTCwgdHlwZW5hbWUgUk9PVFMsIHR5cGVuYW1lIFJFQUxfUk9PVFMgPgotdm9pZCBldmFsU29sdmVyU3VnYXJGdW5jdGlvbiggY29uc3QgUE9MWU5PTUlBTCYgcG9scywgY29uc3QgUk9PVFMmIHJvb3RzLCBjb25zdCBSRUFMX1JPT1RTJiByZWFsX3Jvb3RzICkKLXsKK3RlbXBsYXRlIDxpbnQgRGVnLCB0eXBlbmFtZSBQT0xZTk9NSUFMLCB0eXBlbmFtZSBST09UUywgdHlwZW5hbWUgUkVBTF9ST09UUz4KK3ZvaWQgZXZhbFNvbHZlclN1Z2FyRnVuY3Rpb24oY29uc3QgUE9MWU5PTUlBTCYgcG9scywgY29uc3QgUk9PVFMmIHJvb3RzLCBjb25zdCBSRUFMX1JPT1RTJiByZWFsX3Jvb3RzKSB7CiAgIHVzaW5nIHN0ZDo6c3FydDsKICAgdHlwZWRlZiB0eXBlbmFtZSBQT0xZTk9NSUFMOjpTY2FsYXIgU2NhbGFyOwogICB0eXBlZGVmIHR5cGVuYW1lIFBPTFlOT01JQUw6OlJlYWxTY2FsYXIgUmVhbFNjYWxhcjsKIAotICB0eXBlZGVmIFBvbHlub21pYWxTb2x2ZXI8U2NhbGFyLCBEZWcgPiAgICAgICAgICAgICAgUG9seW5vbWlhbFNvbHZlclR5cGU7CisgIHR5cGVkZWYgUG9seW5vbWlhbFNvbHZlcjxTY2FsYXIsIERlZz4gUG9seW5vbWlhbFNvbHZlclR5cGU7CiAKICAgUG9seW5vbWlhbFNvbHZlclR5cGUgcHNvbHZlOwotICBpZiggYXV4X2V2YWxTb2x2ZXI8RGVnLCBQT0xZTk9NSUFMLCBQb2x5bm9taWFsU29sdmVyVHlwZT4oIHBvbHMsIHBzb2x2ZSApICkKLSAgewotICAgIC8vSXQgaXMgc3VwcG9zZWQgdGhhdAotICAgIC8vIDEpIHRoZSByb290cyBmb3VuZCBhcmUgY29ycmVjdAotICAgIC8vIDIpIHRoZSByb290cyBoYXZlIGRpc3RpbmN0IG1vZHVsaQorICBpZiAoYXV4X2V2YWxTb2x2ZXI8RGVnLCBQT0xZTk9NSUFMLCBQb2x5bm9taWFsU29sdmVyVHlwZT4ocG9scywgcHNvbHZlKSkgeworICAgIC8vIEl0IGlzIHN1cHBvc2VkIHRoYXQKKyAgICAvLyAgMSkgdGhlIHJvb3RzIGZvdW5kIGFyZSBjb3JyZWN0CisgICAgLy8gIDIpIHRoZSByb290cyBoYXZlIGRpc3RpbmN0IG1vZHVsaQogCi0gICAgLy9UZXN0IHJlYWxSb290cwotICAgIHN0ZDo6dmVjdG9yPCBSZWFsU2NhbGFyID4gY2FsY19yZWFsUm9vdHM7Ci0gICAgcHNvbHZlLnJlYWxSb290cyggY2FsY19yZWFsUm9vdHMsICB0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpKTsKLSAgICBWRVJJRllfSVNfRVFVQUwoIGNhbGNfcmVhbFJvb3RzLnNpemUoKSAsIChzaXplX3QpcmVhbF9yb290cy5zaXplKCkgKTsKKyAgICAvLyBUZXN0IHJlYWxSb290cworICAgIHN0ZDo6dmVjdG9yPFJlYWxTY2FsYXI+IGNhbGNfcmVhbFJvb3RzOworICAgIHBzb2x2ZS5yZWFsUm9vdHMoY2FsY19yZWFsUm9vdHMsIHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCkpOworICAgIFZFUklGWV9JU19FUVVBTChjYWxjX3JlYWxSb290cy5zaXplKCksIChzaXplX3QpcmVhbF9yb290cy5zaXplKCkpOwogCi0gICAgY29uc3QgUmVhbFNjYWxhciBwc1ByZWMgPSBzcXJ0KCB0ZXN0X3ByZWNpc2lvbjxSZWFsU2NhbGFyPigpICk7CisgICAgY29uc3QgUmVhbFNjYWxhciBwc1ByZWMgPSBzcXJ0KHRlc3RfcHJlY2lzaW9uPFJlYWxTY2FsYXI+KCkpOwogCi0gICAgZm9yKCBzaXplX3QgaT0wOyBpPGNhbGNfcmVhbFJvb3RzLnNpemUoKTsgKytpICkKLSAgICB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYWxjX3JlYWxSb290cy5zaXplKCk7ICsraSkgewogICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgICAgZm9yKCBzaXplX3Qgaj0wOyBqPGNhbGNfcmVhbFJvb3RzLnNpemUoKSYmICFmb3VuZDsgKytqICkKLSAgICAgIHsKLSAgICAgICAgaWYoIGludGVybmFsOjppc0FwcHJveCggY2FsY19yZWFsUm9vdHNbaV0sIHJlYWxfcm9vdHNbal0sIHBzUHJlYyApICl7Ci0gICAgICAgICAgZm91bmQgPSB0cnVlOyB9CisgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNhbGNfcmVhbFJvb3RzLnNpemUoKSAmJiAhZm91bmQ7ICsraikgeworICAgICAgICBpZiAoaW50ZXJuYWw6OmlzQXBwcm94KGNhbGNfcmVhbFJvb3RzW2ldLCByZWFsX3Jvb3RzW2pdLCBwc1ByZWMpKSB7CisgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB9CiAgICAgICB9Ci0gICAgICBWRVJJRlkoIGZvdW5kICk7CisgICAgICBWRVJJRlkoZm91bmQpOwogICAgIH0KIAotICAgIC8vVGVzdCBncmVhdGVzdFJvb3QKLSAgICBWRVJJRlkoIGludGVybmFsOjppc0FwcHJveCggcm9vdHMuYXJyYXkoKS5hYnMoKS5tYXhDb2VmZigpLAotICAgICAgICAgIGFicyggcHNvbHZlLmdyZWF0ZXN0Um9vdCgpICksIHBzUHJlYyApICk7CisgICAgLy8gVGVzdCBncmVhdGVzdFJvb3QKKyAgICBWRVJJRlkoaW50ZXJuYWw6OmlzQXBwcm94KHJvb3RzLmFycmF5KCkuYWJzKCkubWF4Q29lZmYoKSwgYWJzKHBzb2x2ZS5ncmVhdGVzdFJvb3QoKSksIHBzUHJlYykpOwogCi0gICAgLy9UZXN0IHNtYWxsZXN0Um9vdAotICAgIFZFUklGWSggaW50ZXJuYWw6OmlzQXBwcm94KCByb290cy5hcnJheSgpLmFicygpLm1pbkNvZWZmKCksCi0gICAgICAgICAgYWJzKCBwc29sdmUuc21hbGxlc3RSb290KCkgKSwgcHNQcmVjICkgKTsKKyAgICAvLyBUZXN0IHNtYWxsZXN0Um9vdAorICAgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3gocm9vdHMuYXJyYXkoKS5hYnMoKS5taW5Db2VmZigpLCBhYnMocHNvbHZlLnNtYWxsZXN0Um9vdCgpKSwgcHNQcmVjKSk7CiAKICAgICBib29sIGhhc1JlYWxSb290OwotICAgIC8vVGVzdCBhYnNHcmVhdGVzdFJlYWxSb290Ci0gICAgUmVhbFNjYWxhciByID0gcHNvbHZlLmFic0dyZWF0ZXN0UmVhbFJvb3QoIGhhc1JlYWxSb290ICk7Ci0gICAgVkVSSUZZKCBoYXNSZWFsUm9vdCA9PSAocmVhbF9yb290cy5zaXplKCkgPiAwICkgKTsKLSAgICBpZiggaGFzUmVhbFJvb3QgKXsKLSAgICAgIFZFUklGWSggaW50ZXJuYWw6OmlzQXBwcm94KCByZWFsX3Jvb3RzLmFycmF5KCkuYWJzKCkubWF4Q29lZmYoKSwgYWJzKHIpLCBwc1ByZWMgKSApOyAgfQorICAgIC8vIFRlc3QgYWJzR3JlYXRlc3RSZWFsUm9vdAorICAgIFJlYWxTY2FsYXIgciA9IHBzb2x2ZS5hYnNHcmVhdGVzdFJlYWxSb290KGhhc1JlYWxSb290KTsKKyAgICBWRVJJRlkoaGFzUmVhbFJvb3QgPT0gKHJlYWxfcm9vdHMuc2l6ZSgpID4gMCkpOworICAgIGlmIChoYXNSZWFsUm9vdCkgeworICAgICAgVkVSSUZZKGludGVybmFsOjppc0FwcHJveChyZWFsX3Jvb3RzLmFycmF5KCkuYWJzKCkubWF4Q29lZmYoKSwgYWJzKHIpLCBwc1ByZWMpKTsKKyAgICB9CiAKLSAgICAvL1Rlc3QgYWJzU21hbGxlc3RSZWFsUm9vdAotICAgIHIgPSBwc29sdmUuYWJzU21hbGxlc3RSZWFsUm9vdCggaGFzUmVhbFJvb3QgKTsKLSAgICBWRVJJRlkoIGhhc1JlYWxSb290ID09IChyZWFsX3Jvb3RzLnNpemUoKSA+IDAgKSApOwotICAgIGlmKCBoYXNSZWFsUm9vdCApewotICAgICAgVkVSSUZZKCBpbnRlcm5hbDo6aXNBcHByb3goIHJlYWxfcm9vdHMuYXJyYXkoKS5hYnMoKS5taW5Db2VmZigpLCBhYnMoIHIgKSwgcHNQcmVjICkgKTsgfQorICAgIC8vIFRlc3QgYWJzU21hbGxlc3RSZWFsUm9vdAorICAgIHIgPSBwc29sdmUuYWJzU21hbGxlc3RSZWFsUm9vdChoYXNSZWFsUm9vdCk7CisgICAgVkVSSUZZKGhhc1JlYWxSb290ID09IChyZWFsX3Jvb3RzLnNpemUoKSA+IDApKTsKKyAgICBpZiAoaGFzUmVhbFJvb3QpIHsKKyAgICAgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3gocmVhbF9yb290cy5hcnJheSgpLmFicygpLm1pbkNvZWZmKCksIGFicyhyKSwgcHNQcmVjKSk7CisgICAgfQogCi0gICAgLy9UZXN0IGdyZWF0ZXN0UmVhbFJvb3QKLSAgICByID0gcHNvbHZlLmdyZWF0ZXN0UmVhbFJvb3QoIGhhc1JlYWxSb290ICk7Ci0gICAgVkVSSUZZKCBoYXNSZWFsUm9vdCA9PSAocmVhbF9yb290cy5zaXplKCkgPiAwICkgKTsKLSAgICBpZiggaGFzUmVhbFJvb3QgKXsKLSAgICAgIFZFUklGWSggaW50ZXJuYWw6OmlzQXBwcm94KCByZWFsX3Jvb3RzLmFycmF5KCkubWF4Q29lZmYoKSwgciwgcHNQcmVjICkgKTsgfQorICAgIC8vIFRlc3QgZ3JlYXRlc3RSZWFsUm9vdAorICAgIHIgPSBwc29sdmUuZ3JlYXRlc3RSZWFsUm9vdChoYXNSZWFsUm9vdCk7CisgICAgVkVSSUZZKGhhc1JlYWxSb290ID09IChyZWFsX3Jvb3RzLnNpemUoKSA+IDApKTsKKyAgICBpZiAoaGFzUmVhbFJvb3QpIHsKKyAgICAgIFZFUklGWShpbnRlcm5hbDo6aXNBcHByb3gocmVhbF9yb290cy5hcnJheSgpLm1heENvZWZmKCksIHIsIHBzUHJlYykpOworICAgIH0KIAotICAgIC8vVGVzdCBzbWFsbGVzdFJlYWxSb290Ci0gICAgciA9IHBzb2x2ZS5zbWFsbGVzdFJlYWxSb290KCBoYXNSZWFsUm9vdCApOwotICAgIFZFUklGWSggaGFzUmVhbFJvb3QgPT0gKHJlYWxfcm9vdHMuc2l6ZSgpID4gMCApICk7Ci0gICAgaWYoIGhhc1JlYWxSb290ICl7Ci0gICAgVkVSSUZZKCBpbnRlcm5hbDo6aXNBcHByb3goIHJlYWxfcm9vdHMuYXJyYXkoKS5taW5Db2VmZigpLCByLCBwc1ByZWMgKSApOyB9CisgICAgLy8gVGVzdCBzbWFsbGVzdFJlYWxSb290CisgICAgciA9IHBzb2x2ZS5zbWFsbGVzdFJlYWxSb290KGhhc1JlYWxSb290KTsKKyAgICBWRVJJRlkoaGFzUmVhbFJvb3QgPT0gKHJlYWxfcm9vdHMuc2l6ZSgpID4gMCkpOworICAgIGlmIChoYXNSZWFsUm9vdCkgeworICAgICAgVkVSSUZZKGludGVybmFsOjppc0FwcHJveChyZWFsX3Jvb3RzLmFycmF5KCkubWluQ29lZmYoKSwgciwgcHNQcmVjKSk7CisgICAgfQogICB9CiB9CiAKLQotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyXywgaW50IERlZ18+Ci12b2lkIHBvbHlub21pYWxzb2x2ZXIoaW50IGRlZykKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXJfLCBpbnQgRGVnXz4KK3ZvaWQgcG9seW5vbWlhbHNvbHZlcihpbnQgZGVnKSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgTnVtVHJhaXRzPFNjYWxhcl8+OjpSZWFsIFJlYWxTY2FsYXI7Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OmluY3JlbWVudF9pZl9maXhlZF9zaXplPERlZ18+ICAgICBEaW07Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcl8sRGltOjpyZXQsMT4gICAgICAgICAgICAgICAgICBQb2x5bm9taWFsVHlwZTsKLSAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyXyxEZWdfLDE+ICAgICAgICAgICAgICAgICAgICAgIEV2YWxSb290c1R5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFJlYWxTY2FsYXIsRGVnXywxPiAgICAgICAgICAgICAgICAgICBSZWFsUm9vdHNUeXBlOworICB0eXBlZGVmIGludGVybmFsOjppbmNyZW1lbnRfaWZfZml4ZWRfc2l6ZTxEZWdfPiBEaW07CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcl8sIERpbTo6cmV0LCAxPiBQb2x5bm9taWFsVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyXywgRGVnXywgMT4gRXZhbFJvb3RzVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8UmVhbFNjYWxhciwgRGVnXywgMT4gUmVhbFJvb3RzVHlwZTsKIAogICBjb3V0IDw8ICJTdGFuZGFyZCBjYXNlcyIgPDwgZW5kbDsKLSAgUG9seW5vbWlhbFR5cGUgcG9scyA9IFBvbHlub21pYWxUeXBlOjpSYW5kb20oZGVnKzEpOwotICBldmFsU29sdmVyPERlZ18sUG9seW5vbWlhbFR5cGU+KCBwb2xzICk7CisgIFBvbHlub21pYWxUeXBlIHBvbHMgPSBQb2x5bm9taWFsVHlwZTo6UmFuZG9tKGRlZyArIDEpOworICBldmFsU29sdmVyPERlZ18sIFBvbHlub21pYWxUeXBlPihwb2xzKTsKIAogICBjb3V0IDw8ICJIYXJkIGNhc2VzIiA8PCBlbmRsOwogICBTY2FsYXJfIG11bHRpcGxlUm9vdCA9IGludGVybmFsOjpyYW5kb208U2NhbGFyXz4oKTsKLSAgRXZhbFJvb3RzVHlwZSBhbGxSb290cyA9IEV2YWxSb290c1R5cGU6OkNvbnN0YW50KGRlZyxtdWx0aXBsZVJvb3QpOwotICByb290c190b19tb25pY1BvbHlub21pYWwoIGFsbFJvb3RzLCBwb2xzICk7Ci0gIGV2YWxTb2x2ZXI8RGVnXyxQb2x5bm9taWFsVHlwZT4oIHBvbHMgKTsKKyAgRXZhbFJvb3RzVHlwZSBhbGxSb290cyA9IEV2YWxSb290c1R5cGU6OkNvbnN0YW50KGRlZywgbXVsdGlwbGVSb290KTsKKyAgcm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsKGFsbFJvb3RzLCBwb2xzKTsKKyAgZXZhbFNvbHZlcjxEZWdfLCBQb2x5bm9taWFsVHlwZT4ocG9scyk7CiAKICAgY291dCA8PCAiVGVzdCBzdWdhciIgPDwgZW5kbDsKICAgUmVhbFJvb3RzVHlwZSByZWFsUm9vdHMgPSBSZWFsUm9vdHNUeXBlOjpSYW5kb20oZGVnKTsKLSAgcm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsKCByZWFsUm9vdHMsIHBvbHMgKTsKLSAgZXZhbFNvbHZlclN1Z2FyRnVuY3Rpb248RGVnXz4oCi0gICAgICBwb2xzLAotICAgICAgcmVhbFJvb3RzLnRlbXBsYXRlIGNhc3QgPHN0ZDo6Y29tcGxleDxSZWFsU2NhbGFyPiA+KCkuZXZhbCgpLAotICAgICAgcmVhbFJvb3RzICk7CisgIHJvb3RzX3RvX21vbmljUG9seW5vbWlhbChyZWFsUm9vdHMsIHBvbHMpOworICBldmFsU29sdmVyU3VnYXJGdW5jdGlvbjxEZWdfPihwb2xzLCByZWFsUm9vdHMudGVtcGxhdGUgY2FzdDxzdGQ6OmNvbXBsZXg8UmVhbFNjYWxhcj4gPigpLmV2YWwoKSwgcmVhbFJvb3RzKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHBvbHlub21pYWxzb2x2ZXIpCi17Ci0gIGZvcihpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgaSsrKQotICB7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIChwb2x5bm9taWFsc29sdmVyPGZsb2F0LDE+KDEpKSApOwotICAgIENBTExfU1VCVEVTVF8yKCAocG9seW5vbWlhbHNvbHZlcjxkb3VibGUsMj4oMikpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIChwb2x5bm9taWFsc29sdmVyPGRvdWJsZSwzPigzKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggKHBvbHlub21pYWxzb2x2ZXI8ZmxvYXQsND4oNCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIChwb2x5bm9taWFsc29sdmVyPGRvdWJsZSw1Pig1KSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNiggKHBvbHlub21pYWxzb2x2ZXI8ZmxvYXQsNj4oNikpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzcoIChwb2x5bm9taWFsc29sdmVyPGZsb2F0LDc+KDcpKSApOwotICAgIENBTExfU1VCVEVTVF84KCAocG9seW5vbWlhbHNvbHZlcjxkb3VibGUsOD4oOCkpICk7CitFSUdFTl9ERUNMQVJFX1RFU1QocG9seW5vbWlhbHNvbHZlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKKyAgICBDQUxMX1NVQlRFU1RfMSgocG9seW5vbWlhbHNvbHZlcjxmbG9hdCwgMT4oMSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMigocG9seW5vbWlhbHNvbHZlcjxkb3VibGUsIDI+KDIpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKHBvbHlub21pYWxzb2x2ZXI8ZG91YmxlLCAzPigzKSkpOworICAgIENBTExfU1VCVEVTVF80KChwb2x5bm9taWFsc29sdmVyPGZsb2F0LCA0Pig0KSkpOworICAgIENBTExfU1VCVEVTVF81KChwb2x5bm9taWFsc29sdmVyPGRvdWJsZSwgNT4oNSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNigocG9seW5vbWlhbHNvbHZlcjxmbG9hdCwgNj4oNikpKTsKKyAgICBDQUxMX1NVQlRFU1RfNygocG9seW5vbWlhbHNvbHZlcjxmbG9hdCwgNz4oNykpKTsKKyAgICBDQUxMX1NVQlRFU1RfOCgocG9seW5vbWlhbHNvbHZlcjxkb3VibGUsIDg+KDgpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfOSggKHBvbHlub21pYWxzb2x2ZXI8ZmxvYXQsRHluYW1pYz4oCi0gICAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oOSwxMykKLSAgICAgICAgICAgICkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEwKChwb2x5bm9taWFsc29sdmVyPGRvdWJsZSxEeW5hbWljPigKLSAgICAgICAgICAgIGludGVybmFsOjpyYW5kb208aW50Pig5LDEzKQotICAgICAgICAgICAgKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMTEoKHBvbHlub21pYWxzb2x2ZXI8ZmxvYXQsRHluYW1pYz4oMSkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzEyKChwb2x5bm9taWFsc29sdmVyPHN0ZDo6Y29tcGxleDxkb3VibGU+LER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigyLDEzKSkpICk7CisgICAgQ0FMTF9TVUJURVNUXzkoKHBvbHlub21pYWxzb2x2ZXI8ZmxvYXQsIER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50Pig5LCAxMykpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEwKChwb2x5bm9taWFsc29sdmVyPGRvdWJsZSwgRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDksIDEzKSkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMTEoKHBvbHlub21pYWxzb2x2ZXI8ZmxvYXQsIER5bmFtaWM+KDEpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEyKChwb2x5bm9taWFsc29sdmVyPHN0ZDo6Y29tcGxleDxkb3VibGU+LCBEeW5hbWljPihpbnRlcm5hbDo6cmFuZG9tPGludD4oMiwgMTMpKSkpOwogICB9CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L3BvbHlub21pYWx1dGlscy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L3BvbHlub21pYWx1dGlscy5jcHAKaW5kZXggMTVhMGYyNy4uZjU3Yzg3NCAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9wb2x5bm9taWFsdXRpbHMuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3QvcG9seW5vbWlhbHV0aWxzLmNwcApAQCAtMTUsOTYgKzE1LDg1IEBACiAKIG5hbWVzcGFjZSBFaWdlbiB7CiBuYW1lc3BhY2UgaW50ZXJuYWwgewotdGVtcGxhdGU8aW50IFNpemU+Ci1zdHJ1Y3QgaW5jcmVtZW50X2lmX2ZpeGVkX3NpemUKLXsKLSAgZW51bSB7Ci0gICAgcmV0ID0gKFNpemUgPT0gRHluYW1pYykgPyBEeW5hbWljIDogU2l6ZSsxCi0gIH07Cit0ZW1wbGF0ZSA8aW50IFNpemU+CitzdHJ1Y3QgaW5jcmVtZW50X2lmX2ZpeGVkX3NpemUgeworICBlbnVtIHsgcmV0ID0gKFNpemUgPT0gRHluYW1pYykgPyBEeW5hbWljIDogU2l6ZSArIDEgfTsKIH07Ci19Ci19Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJfLCBpbnQgRGVnXz4KLXZvaWQgcmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF90ZXN0KGludCBkZWcpCi17Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OmluY3JlbWVudF9pZl9maXhlZF9zaXplPERlZ18+ICAgICAgICAgICAgRGltOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXJfLERpbTo6cmV0LDE+ICAgICAgICAgICAgICAgICAgUG9seW5vbWlhbFR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcl8sRGVnXywxPiAgICAgICAgICAgICAgICAgICAgICBFdmFsUm9vdHNUeXBlOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcl8sIGludCBEZWdfPgordm9pZCByZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3QoaW50IGRlZykgeworICB0eXBlZGVmIGludGVybmFsOjppbmNyZW1lbnRfaWZfZml4ZWRfc2l6ZTxEZWdfPiBEaW07CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcl8sIERpbTo6cmV0LCAxPiBQb2x5bm9taWFsVHlwZTsKKyAgdHlwZWRlZiBNYXRyaXg8U2NhbGFyXywgRGVnXywgMT4gRXZhbFJvb3RzVHlwZTsKIAotICBQb2x5bm9taWFsVHlwZSBwb2xzKGRlZysxKTsKKyAgUG9seW5vbWlhbFR5cGUgcG9scyhkZWcgKyAxKTsKICAgRXZhbFJvb3RzVHlwZSByb290cyA9IEV2YWxSb290c1R5cGU6OlJhbmRvbShkZWcpOwotICByb290c190b19tb25pY1BvbHlub21pYWwoIHJvb3RzLCBwb2xzICk7CisgIHJvb3RzX3RvX21vbmljUG9seW5vbWlhbChyb290cywgcG9scyk7CiAKLSAgRXZhbFJvb3RzVHlwZSBldnIoIGRlZyApOwotICBmb3IoIGludCBpPTA7IGk8cm9vdHMuc2l6ZSgpOyArK2kgKXsKLSAgICBldnJbaV0gPSBzdGQ6OmFicyggcG9seV9ldmFsKCBwb2xzLCByb290c1tpXSApICk7IH0KKyAgRXZhbFJvb3RzVHlwZSBldnIoZGVnKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5zaXplKCk7ICsraSkgeworICAgIGV2cltpXSA9IHN0ZDo6YWJzKHBvbHlfZXZhbChwb2xzLCByb290c1tpXSkpOworICB9CiAKLSAgYm9vbCBldmFsVG9aZXJvID0gZXZyLmlzWmVybyggdGVzdF9wcmVjaXNpb248U2NhbGFyXz4oKSApOwotICBpZiggIWV2YWxUb1plcm8gKXsKLSAgICBjZXJyIDw8IGV2ci50cmFuc3Bvc2UoKSA8PCBlbmRsOyB9Ci0gIFZFUklGWSggZXZhbFRvWmVybyApOworICBib29sIGV2YWxUb1plcm8gPSBldnIuaXNaZXJvKHRlc3RfcHJlY2lzaW9uPFNjYWxhcl8+KCkpOworICBpZiAoIWV2YWxUb1plcm8pIHsKKyAgICBjZXJyIDw8IGV2ci50cmFuc3Bvc2UoKSA8PCBlbmRsOworICB9CisgIFZFUklGWShldmFsVG9aZXJvKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyXz4gdm9pZCByZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3NjYWxhcigpCi17Ci0gIENBTExfU1VCVEVTVF8yKCAocmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF90ZXN0PFNjYWxhcl8sMj4oMikpICk7Ci0gIENBTExfU1VCVEVTVF8zKCAocmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF90ZXN0PFNjYWxhcl8sMz4oMykpICk7Ci0gIENBTExfU1VCVEVTVF80KCAocmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF90ZXN0PFNjYWxhcl8sND4oNCkpICk7Ci0gIENBTExfU1VCVEVTVF81KCAocmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF90ZXN0PFNjYWxhcl8sNT4oNSkpICk7Ci0gIENBTExfU1VCVEVTVF82KCAocmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF90ZXN0PFNjYWxhcl8sNj4oNikpICk7Ci0gIENBTExfU1VCVEVTVF83KCAocmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF90ZXN0PFNjYWxhcl8sNz4oNykpICk7Ci0gIENBTExfU1VCVEVTVF84KCAocmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF90ZXN0PFNjYWxhcl8sMTc+KDE3KSkgKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXJfPgordm9pZCByZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3NjYWxhcigpIHsKKyAgQ0FMTF9TVUJURVNUXzIoKHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfdGVzdDxTY2FsYXJfLCAyPigyKSkpOworICBDQUxMX1NVQlRFU1RfMygocmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF90ZXN0PFNjYWxhcl8sIDM+KDMpKSk7CisgIENBTExfU1VCVEVTVF80KChyZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3Q8U2NhbGFyXywgND4oNCkpKTsKKyAgQ0FMTF9TVUJURVNUXzUoKHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfdGVzdDxTY2FsYXJfLCA1Pig1KSkpOworICBDQUxMX1NVQlRFU1RfNigocmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF90ZXN0PFNjYWxhcl8sIDY+KDYpKSk7CisgIENBTExfU1VCVEVTVF83KChyZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3Q8U2NhbGFyXywgNz4oNykpKTsKKyAgQ0FMTF9TVUJURVNUXzgoKHJlYWxSb290c190b19tb25pY1BvbHlub21pYWxfdGVzdDxTY2FsYXJfLCAxNz4oMTcpKSk7CiAKLSAgQ0FMTF9TVUJURVNUXzkoIChyZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3Q8U2NhbGFyXyxEeW5hbWljPigKLSAgICAgICAgICBpbnRlcm5hbDo6cmFuZG9tPGludD4oMTgsMjYpICkpICk7CisgIENBTExfU1VCVEVTVF85KChyZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3Rlc3Q8U2NhbGFyXywgRHluYW1pYz4oaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDE4LCAyNikpKSk7CiB9CiAKK3RlbXBsYXRlIDx0eXBlbmFtZSBTY2FsYXJfLCBpbnQgRGVnXz4KK3ZvaWQgQ2F1Y2h5Qm91bmRzKGludCBkZWcpIHsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6aW5jcmVtZW50X2lmX2ZpeGVkX3NpemU8RGVnXz4gRGltOworICB0eXBlZGVmIE1hdHJpeDxTY2FsYXJfLCBEaW06OnJldCwgMT4gUG9seW5vbWlhbFR5cGU7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhcl8sIERlZ18sIDE+IEV2YWxSb290c1R5cGU7CiAKLQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBTY2FsYXJfLCBpbnQgRGVnXz4KLXZvaWQgQ2F1Y2h5Qm91bmRzKGludCBkZWcpCi17Ci0gIHR5cGVkZWYgaW50ZXJuYWw6OmluY3JlbWVudF9pZl9maXhlZF9zaXplPERlZ18+ICAgICAgICAgICAgRGltOwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXJfLERpbTo6cmV0LDE+ICAgICAgICAgICAgICAgICAgUG9seW5vbWlhbFR5cGU7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcl8sRGVnXywxPiAgICAgICAgICAgICAgICAgICAgICBFdmFsUm9vdHNUeXBlOwotCi0gIFBvbHlub21pYWxUeXBlIHBvbHMoZGVnKzEpOworICBQb2x5bm9taWFsVHlwZSBwb2xzKGRlZyArIDEpOwogICBFdmFsUm9vdHNUeXBlIHJvb3RzID0gRXZhbFJvb3RzVHlwZTo6UmFuZG9tKGRlZyk7Ci0gIHJvb3RzX3RvX21vbmljUG9seW5vbWlhbCggcm9vdHMsIHBvbHMgKTsKLSAgU2NhbGFyXyBNID0gY2F1Y2h5X21heF9ib3VuZCggcG9scyApOwotICBTY2FsYXJfIG0gPSBjYXVjaHlfbWluX2JvdW5kKCBwb2xzICk7CisgIHJvb3RzX3RvX21vbmljUG9seW5vbWlhbChyb290cywgcG9scyk7CisgIFNjYWxhcl8gTSA9IGNhdWNoeV9tYXhfYm91bmQocG9scyk7CisgIFNjYWxhcl8gbSA9IGNhdWNoeV9taW5fYm91bmQocG9scyk7CiAgIFNjYWxhcl8gTWF4ID0gcm9vdHMuYXJyYXkoKS5hYnMoKS5tYXhDb2VmZigpOwogICBTY2FsYXJfIG1pbiA9IHJvb3RzLmFycmF5KCkuYWJzKCkubWluQ29lZmYoKTsKICAgYm9vbCBldmFsID0gKE0gPj0gTWF4KSAmJiAobSA8PSBtaW4pOwotICBpZiggIWV2YWwgKQotICB7CisgIGlmICghZXZhbCkgewogICAgIGNlcnIgPDwgIlJvb3RzOiAiIDw8IHJvb3RzIDw8IGVuZGw7CiAgICAgY2VyciA8PCAiQm91bmRzOiAoIiA8PCBtIDw8ICIsICIgPDwgTSA8PCAiKSIgPDwgZW5kbDsKICAgICBjZXJyIDw8ICJNaW4sTWF4OiAoIiA8PCBtaW4gPDwgIiwgIiA8PCBNYXggPDwgIikiIDw8IGVuZGw7CiAgIH0KLSAgVkVSSUZZKCBldmFsICk7CisgIFZFUklGWShldmFsKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyXz4gdm9pZCBDYXVjaHlCb3VuZHNfc2NhbGFyKCkKLXsKLSAgQ0FMTF9TVUJURVNUXzIoIChDYXVjaHlCb3VuZHM8U2NhbGFyXywyPigyKSkgKTsKLSAgQ0FMTF9TVUJURVNUXzMoIChDYXVjaHlCb3VuZHM8U2NhbGFyXywzPigzKSkgKTsKLSAgQ0FMTF9TVUJURVNUXzQoIChDYXVjaHlCb3VuZHM8U2NhbGFyXyw0Pig0KSkgKTsKLSAgQ0FMTF9TVUJURVNUXzUoIChDYXVjaHlCb3VuZHM8U2NhbGFyXyw1Pig1KSkgKTsKLSAgQ0FMTF9TVUJURVNUXzYoIChDYXVjaHlCb3VuZHM8U2NhbGFyXyw2Pig2KSkgKTsKLSAgQ0FMTF9TVUJURVNUXzcoIChDYXVjaHlCb3VuZHM8U2NhbGFyXyw3Pig3KSkgKTsKLSAgQ0FMTF9TVUJURVNUXzgoIChDYXVjaHlCb3VuZHM8U2NhbGFyXywxNz4oMTcpKSApOwordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhcl8+Cit2b2lkIENhdWNoeUJvdW5kc19zY2FsYXIoKSB7CisgIENBTExfU1VCVEVTVF8yKChDYXVjaHlCb3VuZHM8U2NhbGFyXywgMj4oMikpKTsKKyAgQ0FMTF9TVUJURVNUXzMoKENhdWNoeUJvdW5kczxTY2FsYXJfLCAzPigzKSkpOworICBDQUxMX1NVQlRFU1RfNCgoQ2F1Y2h5Qm91bmRzPFNjYWxhcl8sIDQ+KDQpKSk7CisgIENBTExfU1VCVEVTVF81KChDYXVjaHlCb3VuZHM8U2NhbGFyXywgNT4oNSkpKTsKKyAgQ0FMTF9TVUJURVNUXzYoKENhdWNoeUJvdW5kczxTY2FsYXJfLCA2Pig2KSkpOworICBDQUxMX1NVQlRFU1RfNygoQ2F1Y2h5Qm91bmRzPFNjYWxhcl8sIDc+KDcpKSk7CisgIENBTExfU1VCVEVTVF84KChDYXVjaHlCb3VuZHM8U2NhbGFyXywgMTc+KDE3KSkpOwogCi0gIENBTExfU1VCVEVTVF85KCAoQ2F1Y2h5Qm91bmRzPFNjYWxhcl8sRHluYW1pYz4oCi0gICAgICAgICAgaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDE4LDI2KSApKSApOworICBDQUxMX1NVQlRFU1RfOSgoQ2F1Y2h5Qm91bmRzPFNjYWxhcl8sIER5bmFtaWM+KGludGVybmFsOjpyYW5kb208aW50PigxOCwgMjYpKSkpOwogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1QocG9seW5vbWlhbHV0aWxzKQotewotICBmb3IoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykKLSAgeworRUlHRU5fREVDTEFSRV9URVNUKHBvbHlub21pYWx1dGlscykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKICAgICByZWFsUm9vdHNfdG9fbW9uaWNQb2x5bm9taWFsX3NjYWxhcjxkb3VibGU+KCk7CiAgICAgcmVhbFJvb3RzX3RvX21vbmljUG9seW5vbWlhbF9zY2FsYXI8ZmxvYXQ+KCk7CiAgICAgQ2F1Y2h5Qm91bmRzX3NjYWxhcjxkb3VibGU+KCk7CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L3NwYXJzZV9leHRyYS5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L3NwYXJzZV9leHRyYS5jcHAKaW5kZXggMDVhOTA2Ni4uMjJkNjY2NSAxMDA2NDQKLS0tIGEvdW5zdXBwb3J0ZWQvdGVzdC9zcGFyc2VfZXh0cmEuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3Qvc3BhcnNlX2V4dHJhLmNwcApAQCAtMTksMTcgKzE5LDE2IEBACiAKICNpbmNsdWRlIDxFaWdlbi9TcGFyc2VFeHRyYT4KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2V0dGVyVHlwZSx0eXBlbmFtZSBEZW5zZVR5cGUsIHR5cGVuYW1lIFNjYWxhciwgaW50IE9wdGlvbnM+Ci1ib29sIHRlc3RfcmFuZG9tX3NldHRlcihTcGFyc2VNYXRyaXg8U2NhbGFyLE9wdGlvbnM+JiBzbSwgY29uc3QgRGVuc2VUeXBlJiByZWYsIGNvbnN0IHN0ZDo6dmVjdG9yPFZlY3RvcjJpPiYgbm9uemVyb0Nvb3JkcykKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXR0ZXJUeXBlLCB0eXBlbmFtZSBEZW5zZVR5cGUsIHR5cGVuYW1lIFNjYWxhciwgaW50IE9wdGlvbnM+Citib29sIHRlc3RfcmFuZG9tX3NldHRlcihTcGFyc2VNYXRyaXg8U2NhbGFyLCBPcHRpb25zPiYgc20sIGNvbnN0IERlbnNlVHlwZSYgcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+JiBub256ZXJvQ29vcmRzKSB7CiAgIHsKICAgICBzbS5zZXRaZXJvKCk7CiAgICAgU2V0dGVyVHlwZSB3KHNtKTsKICAgICBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4gcmVtYWluaW5nID0gbm9uemVyb0Nvb3JkczsKLSAgICB3aGlsZSghcmVtYWluaW5nLmVtcHR5KCkpCi0gICAgewotICAgICAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCxzdGF0aWNfY2FzdDxpbnQ+KHJlbWFpbmluZy5zaXplKCkpLTEpOwotICAgICAgdyhyZW1haW5pbmdbaV0ueCgpLHJlbWFpbmluZ1tpXS55KCkpID0gcmVmLmNvZWZmKHJlbWFpbmluZ1tpXS54KCkscmVtYWluaW5nW2ldLnkoKSk7CisgICAgd2hpbGUgKCFyZW1haW5pbmcuZW1wdHkoKSkgeworICAgICAgaW50IGkgPSBpbnRlcm5hbDo6cmFuZG9tPGludD4oMCwgc3RhdGljX2Nhc3Q8aW50PihyZW1haW5pbmcuc2l6ZSgpKSAtIDEpOworICAgICAgdyhyZW1haW5pbmdbaV0ueCgpLCByZW1haW5pbmdbaV0ueSgpKSA9IHJlZi5jb2VmZihyZW1haW5pbmdbaV0ueCgpLCByZW1haW5pbmdbaV0ueSgpKTsKICAgICAgIHJlbWFpbmluZ1tpXSA9IHJlbWFpbmluZy5iYWNrKCk7CiAgICAgICByZW1haW5pbmcucG9wX2JhY2soKTsKICAgICB9CkBAIC0zNywxNiArMzYsMTYgQEAKICAgcmV0dXJuIHNtLmlzQXBwcm94KHJlZik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+IHZvaWQgc3BhcnNlX2V4dHJhKGNvbnN0IFNwYXJzZU1hdHJpeFR5cGUmIHJlZikKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlPgordm9pZCBzcGFyc2VfZXh0cmEoY29uc3QgU3BhcnNlTWF0cml4VHlwZSYgcmVmKSB7CiAgIGNvbnN0IEluZGV4IHJvd3MgPSByZWYucm93cygpOwogICBjb25zdCBJbmRleCBjb2xzID0gcmVmLmNvbHMoKTsKICAgdHlwZWRlZiB0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlOjpTY2FsYXIgU2NhbGFyOwogICBlbnVtIHsgRmxhZ3MgPSBTcGFyc2VNYXRyaXhUeXBlOjpGbGFncyB9OwogCi0gIGRvdWJsZSBkZW5zaXR5ID0gKHN0ZDo6bWF4KSg4Li8ocm93cypjb2xzKSwgMC4wMSk7Ci0gIHR5cGVkZWYgTWF0cml4PFNjYWxhcixEeW5hbWljLER5bmFtaWM+IERlbnNlTWF0cml4OwotICB0eXBlZGVmIE1hdHJpeDxTY2FsYXIsRHluYW1pYywxPiBEZW5zZVZlY3RvcjsKKyAgZG91YmxlIGRlbnNpdHkgPSAoc3RkOjptYXgpKDguIC8gKHJvd3MgKiBjb2xzKSwgMC4wMSk7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgRHluYW1pYz4gRGVuc2VNYXRyaXg7CisgIHR5cGVkZWYgTWF0cml4PFNjYWxhciwgRHluYW1pYywgMT4gRGVuc2VWZWN0b3I7CiAgIFNjYWxhciBlcHMgPSAxZS02OwogCiAgIFNwYXJzZU1hdHJpeFR5cGUgbShyb3dzLCBjb2xzKTsKQEAgLTU3LDE1ICs1NiwxMyBAQAogICBzdGQ6OnZlY3RvcjxWZWN0b3IyaT4gbm9uemVyb0Nvb3JkczsKICAgaW5pdFNwYXJzZTxTY2FsYXI+KGRlbnNpdHksIHJlZk1hdCwgbSwgMCwgJnplcm9Db29yZHMsICZub256ZXJvQ29vcmRzKTsKIAotICBpZiAoemVyb0Nvb3Jkcy5zaXplKCk9PTAgfHwgbm9uemVyb0Nvb3Jkcy5zaXplKCk9PTApCi0gICAgcmV0dXJuOworICBpZiAoemVyb0Nvb3Jkcy5zaXplKCkgPT0gMCB8fCBub256ZXJvQ29vcmRzLnNpemUoKSA9PSAwKSByZXR1cm47CiAKICAgLy8gdGVzdCBjb2VmZiBhbmQgY29lZmZSZWYKLSAgZm9yIChpbnQgaT0wOyBpPChpbnQpemVyb0Nvb3Jkcy5zaXplKCk7ICsraSkKLSAgewotICAgIFZFUklGWV9JU19NVUNIX1NNQUxMRVJfVEhBTiggbS5jb2VmZih6ZXJvQ29vcmRzW2ldLngoKSx6ZXJvQ29vcmRzW2ldLnkoKSksIGVwcyApOwotICAgIGlmKGludGVybmFsOjppc19zYW1lPFNwYXJzZU1hdHJpeFR5cGUsU3BhcnNlTWF0cml4PFNjYWxhcixGbGFncz4gPjo6dmFsdWUpCi0gICAgICBWRVJJRllfUkFJU0VTX0FTU0VSVCggbS5jb2VmZlJlZih6ZXJvQ29vcmRzWzBdLngoKSx6ZXJvQ29vcmRzWzBdLnkoKSkgPSA1ICk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCl6ZXJvQ29vcmRzLnNpemUoKTsgKytpKSB7CisgICAgVkVSSUZZX0lTX01VQ0hfU01BTExFUl9USEFOKG0uY29lZmYoemVyb0Nvb3Jkc1tpXS54KCksIHplcm9Db29yZHNbaV0ueSgpKSwgZXBzKTsKKyAgICBpZiAoaW50ZXJuYWw6OmlzX3NhbWU8U3BhcnNlTWF0cml4VHlwZSwgU3BhcnNlTWF0cml4PFNjYWxhciwgRmxhZ3M+ID46OnZhbHVlKQorICAgICAgVkVSSUZZX1JBSVNFU19BU1NFUlQobS5jb2VmZlJlZih6ZXJvQ29vcmRzWzBdLngoKSwgemVyb0Nvb3Jkc1swXS55KCkpID0gNSk7CiAgIH0KICAgVkVSSUZZX0lTX0FQUFJPWChtLCByZWZNYXQpOwogCkBAIC03NSwyOCArNzIsMjcgQEAKICAgVkVSSUZZX0lTX0FQUFJPWChtLCByZWZNYXQpOwogCiAgIC8vIHJhbmRvbSBzZXR0ZXIKLS8vICAgewotLy8gICAgIG0uc2V0WmVybygpOwotLy8gICAgIFZFUklGWV9JU19OT1RfQVBQUk9YKG0sIHJlZk1hdCk7Ci0vLyAgICAgU3BhcnNlU2V0dGVyPFNwYXJzZU1hdHJpeFR5cGUsIFJhbmRvbUFjY2Vzc1BhdHRlcm4+IHcobSk7Ci0vLyAgICAgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+IHJlbWFpbmluZyA9IG5vbnplcm9Db29yZHM7Ci0vLyAgICAgd2hpbGUoIXJlbWFpbmluZy5lbXB0eSgpKQotLy8gICAgIHsKLS8vICAgICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscmVtYWluaW5nLnNpemUoKS0xKTsKLS8vICAgICAgIHctPmNvZWZmUmVmKHJlbWFpbmluZ1tpXS54KCkscmVtYWluaW5nW2ldLnkoKSkgPSByZWZNYXQuY29lZmYocmVtYWluaW5nW2ldLngoKSxyZW1haW5pbmdbaV0ueSgpKTsKLS8vICAgICAgIHJlbWFpbmluZ1tpXSA9IHJlbWFpbmluZy5iYWNrKCk7Ci0vLyAgICAgICByZW1haW5pbmcucG9wX2JhY2soKTsKLS8vICAgICB9Ci0vLyAgIH0KLS8vICAgVkVSSUZZX0lTX0FQUFJPWChtLCByZWZNYXQpOworICAvLyAgIHsKKyAgLy8gICAgIG0uc2V0WmVybygpOworICAvLyAgICAgVkVSSUZZX0lTX05PVF9BUFBST1gobSwgcmVmTWF0KTsKKyAgLy8gICAgIFNwYXJzZVNldHRlcjxTcGFyc2VNYXRyaXhUeXBlLCBSYW5kb21BY2Nlc3NQYXR0ZXJuPiB3KG0pOworICAvLyAgICAgc3RkOjp2ZWN0b3I8VmVjdG9yMmk+IHJlbWFpbmluZyA9IG5vbnplcm9Db29yZHM7CisgIC8vICAgICB3aGlsZSghcmVtYWluaW5nLmVtcHR5KCkpCisgIC8vICAgICB7CisgIC8vICAgICAgIGludCBpID0gaW50ZXJuYWw6OnJhbmRvbTxpbnQ+KDAscmVtYWluaW5nLnNpemUoKS0xKTsKKyAgLy8gICAgICAgdy0+Y29lZmZSZWYocmVtYWluaW5nW2ldLngoKSxyZW1haW5pbmdbaV0ueSgpKSA9IHJlZk1hdC5jb2VmZihyZW1haW5pbmdbaV0ueCgpLHJlbWFpbmluZ1tpXS55KCkpOworICAvLyAgICAgICByZW1haW5pbmdbaV0gPSByZW1haW5pbmcuYmFjaygpOworICAvLyAgICAgICByZW1haW5pbmcucG9wX2JhY2soKTsKKyAgLy8gICAgIH0KKyAgLy8gICB9CisgIC8vICAgVkVSSUZZX0lTX0FQUFJPWChtLCByZWZNYXQpOwogCi0gICAgVkVSSUZZKCggdGVzdF9yYW5kb21fc2V0dGVyPFJhbmRvbVNldHRlcjxTcGFyc2VNYXRyaXhUeXBlLCBTdGRNYXBUcmFpdHM+ID4obSxyZWZNYXQsbm9uemVyb0Nvb3JkcykgKSk7Ci0gICAgVkVSSUZZKCggdGVzdF9yYW5kb21fc2V0dGVyPFJhbmRvbVNldHRlcjxTcGFyc2VNYXRyaXhUeXBlLCBTdGRVbm9yZGVyZWRNYXBUcmFpdHM+ID4obSxyZWZNYXQsbm9uemVyb0Nvb3JkcykgKSk7Ci0gICAgI2lmZGVmIEVJR0VOX0dPT0dMRUhBU0hfU1VQUE9SVAotICAgIFZFUklGWSgoIHRlc3RfcmFuZG9tX3NldHRlcjxSYW5kb21TZXR0ZXI8U3BhcnNlTWF0cml4VHlwZSwgR29vZ2xlRGVuc2VIYXNoTWFwVHJhaXRzPiA+KG0scmVmTWF0LG5vbnplcm9Db29yZHMpICkpOwotICAgIFZFUklGWSgoIHRlc3RfcmFuZG9tX3NldHRlcjxSYW5kb21TZXR0ZXI8U3BhcnNlTWF0cml4VHlwZSwgR29vZ2xlU3BhcnNlSGFzaE1hcFRyYWl0cz4gPihtLHJlZk1hdCxub256ZXJvQ29vcmRzKSApKTsKLSAgICAjZW5kaWYKLQorICBWRVJJRlkoKHRlc3RfcmFuZG9tX3NldHRlcjxSYW5kb21TZXR0ZXI8U3BhcnNlTWF0cml4VHlwZSwgU3RkTWFwVHJhaXRzPiA+KG0sIHJlZk1hdCwgbm9uemVyb0Nvb3JkcykpKTsKKyAgVkVSSUZZKCh0ZXN0X3JhbmRvbV9zZXR0ZXI8UmFuZG9tU2V0dGVyPFNwYXJzZU1hdHJpeFR5cGUsIFN0ZFVub3JkZXJlZE1hcFRyYWl0cz4gPihtLCByZWZNYXQsIG5vbnplcm9Db29yZHMpKSk7CisjaWZkZWYgRUlHRU5fR09PR0xFSEFTSF9TVVBQT1JUCisgIFZFUklGWSgodGVzdF9yYW5kb21fc2V0dGVyPFJhbmRvbVNldHRlcjxTcGFyc2VNYXRyaXhUeXBlLCBHb29nbGVEZW5zZUhhc2hNYXBUcmFpdHM+ID4obSwgcmVmTWF0LCBub256ZXJvQ29vcmRzKSkpOworICBWRVJJRlkoKHRlc3RfcmFuZG9tX3NldHRlcjxSYW5kb21TZXR0ZXI8U3BhcnNlTWF0cml4VHlwZSwgR29vZ2xlU3BhcnNlSGFzaE1hcFRyYWl0cz4gPihtLCByZWZNYXQsIG5vbnplcm9Db29yZHMpKSk7CisjZW5kaWYKIAogICAvLyB0ZXN0IFJhbmRvbVNldHRlcgogICAvKnsKQEAgLTExMSw2MyArMTA3LDU3IEBACiAgICAgfQogICAgIFZFUklGWV9JU19BUFBST1gobTEsIG0yKTsKICAgfSovCi0KLQogfQogCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFNwYXJzZU1hdHJpeFR5cGU+Ci12b2lkIGNoZWNrX21hcmtldGlvKCkKLXsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcGFyc2VNYXRyaXhUeXBlPgordm9pZCBjaGVja19tYXJrZXRpbygpIHsKICAgdHlwZWRlZiBNYXRyaXg8dHlwZW5hbWUgU3BhcnNlTWF0cml4VHlwZTo6U2NhbGFyLCBEeW5hbWljLCBEeW5hbWljPiBEZW5zZU1hdHJpeDsKLSAgSW5kZXggcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsMTAwKTsKLSAgSW5kZXggY29scyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsMTAwKTsKKyAgSW5kZXggcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIDEwMCk7CisgIEluZGV4IGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAxMDApOwogICBTcGFyc2VNYXRyaXhUeXBlIG0xLCBtMjsKICAgbTEgPSBEZW5zZU1hdHJpeDo6UmFuZG9tKHJvd3MsIGNvbHMpLnNwYXJzZVZpZXcoKTsKICAgc2F2ZU1hcmtldChtMSwgInNwYXJzZV9leHRyYS5tdHgiKTsKICAgbG9hZE1hcmtldChtMiwgInNwYXJzZV9leHRyYS5tdHgiKTsKLSAgVkVSSUZZX0lTX0VRVUFMKERlbnNlTWF0cml4KG0xKSxEZW5zZU1hdHJpeChtMikpOworICBWRVJJRllfSVNfRVFVQUwoRGVuc2VNYXRyaXgobTEpLCBEZW5zZU1hdHJpeChtMikpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBWZWN0b3JUeXBlPgotdm9pZCBjaGVja19tYXJrZXRpb192ZWN0b3IoKQotewotICBJbmRleCBzaXplID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwxMDApOwordGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvclR5cGU+Cit2b2lkIGNoZWNrX21hcmtldGlvX3ZlY3RvcigpIHsKKyAgSW5kZXggc2l6ZSA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIDEwMCk7CiAgIFZlY3RvclR5cGUgdjEsIHYyOwogICB2MSA9IFZlY3RvclR5cGU6OlJhbmRvbShzaXplKTsKICAgc2F2ZU1hcmtldFZlY3Rvcih2MSwgInZlY3Rvcl9leHRyYS5tdHgiKTsKICAgbG9hZE1hcmtldFZlY3Rvcih2MiwgInZlY3Rvcl9leHRyYS5tdHgiKTsKLSAgVkVSSUZZX0lTX0VRVUFMKHYxLHYyKTsKKyAgVkVSSUZZX0lTX0VRVUFMKHYxLCB2Mik7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIERlbnNlTWF0cml4VHlwZT4KLXZvaWQgY2hlY2tfbWFya2V0aW9fZGVuc2UoKQotewotICBJbmRleCByb3dzPURlbnNlTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWU7Ci0gIGlmIChEZW5zZU1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lPT1EeW5hbWljKXsKLSAgICByb3dzPWludGVybmFsOjpyYW5kb208SW5kZXg+KDEsMTAwKTsKLSAgfWVsc2UgaWYoRGVuc2VNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZT09RHluYW1pYyl7Ci0gICAgcm93cz1pbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLERlbnNlTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUpOwordGVtcGxhdGUgPHR5cGVuYW1lIERlbnNlTWF0cml4VHlwZT4KK3ZvaWQgY2hlY2tfbWFya2V0aW9fZGVuc2UoKSB7CisgIEluZGV4IHJvd3MgPSBEZW5zZU1hdHJpeFR5cGU6Ok1heFJvd3NBdENvbXBpbGVUaW1lOworICBpZiAoRGVuc2VNYXRyaXhUeXBlOjpNYXhSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSB7CisgICAgcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIDEwMCk7CisgIH0gZWxzZSBpZiAoRGVuc2VNYXRyaXhUeXBlOjpSb3dzQXRDb21waWxlVGltZSA9PSBEeW5hbWljKSB7CisgICAgcm93cyA9IGludGVybmFsOjpyYW5kb208SW5kZXg+KDEsIERlbnNlTWF0cml4VHlwZTo6TWF4Um93c0F0Q29tcGlsZVRpbWUpOwogICB9CiAKLSAgSW5kZXggY29scyA9RGVuc2VNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZTsgCi0gIGlmIChEZW5zZU1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lPT1EeW5hbWljKXsKLSAgICBjb2xzPWludGVybmFsOjpyYW5kb208SW5kZXg+KDEsMTAwKTsKLSAgfWVsc2UgaWYoRGVuc2VNYXRyaXhUeXBlOjpDb2xzQXRDb21waWxlVGltZT09RHluYW1pYyl7Ci0gICAgY29scz1pbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLERlbnNlTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUpOworICBJbmRleCBjb2xzID0gRGVuc2VNYXRyaXhUeXBlOjpNYXhDb2xzQXRDb21waWxlVGltZTsKKyAgaWYgKERlbnNlTWF0cml4VHlwZTo6TWF4Q29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykgeworICAgIGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAxMDApOworICB9IGVsc2UgaWYgKERlbnNlTWF0cml4VHlwZTo6Q29sc0F0Q29tcGlsZVRpbWUgPT0gRHluYW1pYykgeworICAgIGNvbHMgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCBEZW5zZU1hdHJpeFR5cGU6Ok1heENvbHNBdENvbXBpbGVUaW1lKTsKICAgfQogCiAgIERlbnNlTWF0cml4VHlwZSBtMSwgbTI7Ci0gIG0xPSBEZW5zZU1hdHJpeFR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICBtMSA9IERlbnNlTWF0cml4VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOwogICBzYXZlTWFya2V0RGVuc2UobTEsICJkZW5zZV9leHRyYS5tdHgiKTsKICAgbG9hZE1hcmtldERlbnNlKG0yLCAiZGVuc2VfZXh0cmEubXR4Iik7Ci0gIFZFUklGWV9JU19FUVVBTChtMSxtMik7CisgIFZFUklGWV9JU19FUVVBTChtMSwgbTIpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgogdm9pZCBjaGVja19zcGFyc2VfaW52ZXJzZSgpIHsKICAgdHlwZWRlZiBTcGFyc2VNYXRyaXg8U2NhbGFyPiBNYXRyaXhUeXBlOwotIAorCiAgIE1hdHJpeDxTY2FsYXIsIC0xLCAtMT4gQTsKICAgQS5yZXNpemUoMTAwMCwgMTAwMCk7CiAgIEEuZmlsbCgwKTsKQEAgLTIwNiw0MSArMTk2LDQwIEBACiAgIFZFUklGWV9JU19BUFBST1hfT1JfTEVTU19USEFOKHN1bWRpZmYsIDFlLTEwKTsKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHNwYXJzZV9leHRyYSkKLXsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLSAgICBpbnQgcyA9IEVpZ2VuOjppbnRlcm5hbDo6cmFuZG9tPGludD4oMSw1MCk7Ci0gICAgQ0FMTF9TVUJURVNUXzEoIHNwYXJzZV9leHRyYShTcGFyc2VNYXRyaXg8ZG91YmxlPig4LCA4KSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMiggc3BhcnNlX2V4dHJhKFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KHMsIHMpKSApOwotICAgIENBTExfU1VCVEVTVF8xKCBzcGFyc2VfZXh0cmEoU3BhcnNlTWF0cml4PGRvdWJsZT4ocywgcykpICk7CitFSUdFTl9ERUNMQVJFX1RFU1Qoc3BhcnNlX2V4dHJhKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIGludCBzID0gRWlnZW46OmludGVybmFsOjpyYW5kb208aW50PigxLCA1MCk7CisgICAgQ0FMTF9TVUJURVNUXzEoc3BhcnNlX2V4dHJhKFNwYXJzZU1hdHJpeDxkb3VibGU+KDgsIDgpKSk7CisgICAgQ0FMTF9TVUJURVNUXzIoc3BhcnNlX2V4dHJhKFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiA+KHMsIHMpKSk7CisgICAgQ0FMTF9TVUJURVNUXzEoc3BhcnNlX2V4dHJhKFNwYXJzZU1hdHJpeDxkb3VibGU+KHMsIHMpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfMyggKGNoZWNrX21hcmtldGlvPFNwYXJzZU1hdHJpeDxmbG9hdCxDb2xNYWpvcixpbnQ+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggKGNoZWNrX21hcmtldGlvPFNwYXJzZU1hdHJpeDxkb3VibGUsQ29sTWFqb3IsaW50PiA+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzMoIChjaGVja19tYXJrZXRpbzxTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PixDb2xNYWpvcixpbnQ+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggKGNoZWNrX21hcmtldGlvPFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPixDb2xNYWpvcixpbnQ+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggKGNoZWNrX21hcmtldGlvPFNwYXJzZU1hdHJpeDxmbG9hdCxDb2xNYWpvcixsb25nIGludD4gPigpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCAoY2hlY2tfbWFya2V0aW88U3BhcnNlTWF0cml4PGRvdWJsZSxDb2xNYWpvcixsb25nIGludD4gPigpKSApOwotICAgIENBTExfU1VCVEVTVF8zKCAoY2hlY2tfbWFya2V0aW88U3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxmbG9hdD4sQ29sTWFqb3IsbG9uZyBpbnQ+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggKGNoZWNrX21hcmtldGlvPFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPixDb2xNYWpvcixsb25nIGludD4gPigpKSApOworICAgIENBTExfU1VCVEVTVF8zKChjaGVja19tYXJrZXRpbzxTcGFyc2VNYXRyaXg8ZmxvYXQsIENvbE1ham9yLCBpbnQ+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKChjaGVja19tYXJrZXRpbzxTcGFyc2VNYXRyaXg8ZG91YmxlLCBDb2xNYWpvciwgaW50PiA+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfMygoY2hlY2tfbWFya2V0aW88U3BhcnNlTWF0cml4PHN0ZDo6Y29tcGxleDxmbG9hdD4sIENvbE1ham9yLCBpbnQ+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKChjaGVja19tYXJrZXRpbzxTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIENvbE1ham9yLCBpbnQ+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKChjaGVja19tYXJrZXRpbzxTcGFyc2VNYXRyaXg8ZmxvYXQsIENvbE1ham9yLCBsb25nIGludD4gPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKGNoZWNrX21hcmtldGlvPFNwYXJzZU1hdHJpeDxkb3VibGUsIENvbE1ham9yLCBsb25nIGludD4gPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzMoKGNoZWNrX21hcmtldGlvPFNwYXJzZU1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LCBDb2xNYWpvciwgbG9uZyBpbnQ+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF8zKChjaGVja19tYXJrZXRpbzxTcGFyc2VNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIENvbE1ham9yLCBsb25nIGludD4gPigpKSk7CiAKLSAgICBDQUxMX1NVQlRFU1RfNCggKGNoZWNrX21hcmtldGlvX2RlbnNlPE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWM+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggKGNoZWNrX21hcmtldGlvX2RlbnNlPE1hdHJpeDxmbG9hdCxEeW5hbWljLER5bmFtaWMsUm93TWFqb3I+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggKGNoZWNrX21hcmtldGlvX2RlbnNlPE1hdHJpeDxkb3VibGUsRHluYW1pYyxEeW5hbWljPiA+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIChjaGVja19tYXJrZXRpb19kZW5zZTxNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PixEeW5hbWljLER5bmFtaWM+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggKGNoZWNrX21hcmtldGlvX2RlbnNlPE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPixEeW5hbWljLER5bmFtaWM+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggKGNoZWNrX21hcmtldGlvX2RlbnNlPE1hdHJpeDxmbG9hdCxEeW5hbWljLDM+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggKGNoZWNrX21hcmtldGlvX2RlbnNlPE1hdHJpeDxkb3VibGUsMyxEeW5hbWljPiA+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzQoIChjaGVja19tYXJrZXRpb19kZW5zZTxNYXRyaXg8ZG91YmxlLDMsND4gPigpKSApOwotICAgIENBTExfU1VCVEVTVF80KCAoY2hlY2tfbWFya2V0aW9fZGVuc2U8TWF0cml4PGRvdWJsZSxEeW5hbWljLER5bmFtaWMsQ29sTWFqb3IsNSw1PiA+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzQoKGNoZWNrX21hcmtldGlvX2RlbnNlPE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYz4gPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKGNoZWNrX21hcmtldGlvX2RlbnNlPE1hdHJpeDxmbG9hdCwgRHluYW1pYywgRHluYW1pYywgUm93TWFqb3I+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF80KChjaGVja19tYXJrZXRpb19kZW5zZTxNYXRyaXg8ZG91YmxlLCBEeW5hbWljLCBEeW5hbWljPiA+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgoY2hlY2tfbWFya2V0aW9fZGVuc2U8TWF0cml4PHN0ZDo6Y29tcGxleDxmbG9hdD4sIER5bmFtaWMsIER5bmFtaWM+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF80KChjaGVja19tYXJrZXRpb19kZW5zZTxNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIER5bmFtaWMsIER5bmFtaWM+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF80KChjaGVja19tYXJrZXRpb19kZW5zZTxNYXRyaXg8ZmxvYXQsIER5bmFtaWMsIDM+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF80KChjaGVja19tYXJrZXRpb19kZW5zZTxNYXRyaXg8ZG91YmxlLCAzLCBEeW5hbWljPiA+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCgoY2hlY2tfbWFya2V0aW9fZGVuc2U8TWF0cml4PGRvdWJsZSwgMywgND4gPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzQoKGNoZWNrX21hcmtldGlvX2RlbnNlPE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIER5bmFtaWMsIENvbE1ham9yLCA1LCA1PiA+KCkpKTsKIAotICAgIENBTExfU1VCVEVTVF81KCAoY2hlY2tfbWFya2V0aW9fdmVjdG9yPE1hdHJpeDxmbG9hdCwxLER5bmFtaWM+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggKGNoZWNrX21hcmtldGlvX3ZlY3RvcjxNYXRyaXg8ZG91YmxlLDEsRHluYW1pYz4gPigpKSApOwotICAgIENBTExfU1VCVEVTVF81KCAoY2hlY2tfbWFya2V0aW9fdmVjdG9yPE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZmxvYXQ+LDEsRHluYW1pYz4gPigpKSApOwotICAgIENBTExfU1VCVEVTVF81KCAoY2hlY2tfbWFya2V0aW9fdmVjdG9yPE1hdHJpeDxzdGQ6OmNvbXBsZXg8ZG91YmxlPiwxLER5bmFtaWM+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggKGNoZWNrX21hcmtldGlvX3ZlY3RvcjxNYXRyaXg8ZmxvYXQsRHluYW1pYywxPiA+KCkpICk7Ci0gICAgQ0FMTF9TVUJURVNUXzUoIChjaGVja19tYXJrZXRpb192ZWN0b3I8TWF0cml4PGRvdWJsZSxEeW5hbWljLDE+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggKGNoZWNrX21hcmtldGlvX3ZlY3RvcjxNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PixEeW5hbWljLDE+ID4oKSkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNSggKGNoZWNrX21hcmtldGlvX3ZlY3RvcjxNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sRHluYW1pYywxPiA+KCkpICk7CisgICAgQ0FMTF9TVUJURVNUXzUoKGNoZWNrX21hcmtldGlvX3ZlY3RvcjxNYXRyaXg8ZmxvYXQsIDEsIER5bmFtaWM+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF81KChjaGVja19tYXJrZXRpb192ZWN0b3I8TWF0cml4PGRvdWJsZSwgMSwgRHluYW1pYz4gPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKGNoZWNrX21hcmtldGlvX3ZlY3RvcjxNYXRyaXg8c3RkOjpjb21wbGV4PGZsb2F0PiwgMSwgRHluYW1pYz4gPigpKSk7CisgICAgQ0FMTF9TVUJURVNUXzUoKGNoZWNrX21hcmtldGlvX3ZlY3RvcjxNYXRyaXg8c3RkOjpjb21wbGV4PGRvdWJsZT4sIDEsIER5bmFtaWM+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF81KChjaGVja19tYXJrZXRpb192ZWN0b3I8TWF0cml4PGZsb2F0LCBEeW5hbWljLCAxPiA+KCkpKTsKKyAgICBDQUxMX1NVQlRFU1RfNSgoY2hlY2tfbWFya2V0aW9fdmVjdG9yPE1hdHJpeDxkb3VibGUsIER5bmFtaWMsIDE+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF81KChjaGVja19tYXJrZXRpb192ZWN0b3I8TWF0cml4PHN0ZDo6Y29tcGxleDxmbG9hdD4sIER5bmFtaWMsIDE+ID4oKSkpOworICAgIENBTExfU1VCVEVTVF81KChjaGVja19tYXJrZXRpb192ZWN0b3I8TWF0cml4PHN0ZDo6Y29tcGxleDxkb3VibGU+LCBEeW5hbWljLCAxPiA+KCkpKTsKIAogICAgIENBTExfU1VCVEVTVF82KChjaGVja19zcGFyc2VfaW52ZXJzZTxkb3VibGU+KCkpKTsKIApkaWZmIC0tZ2l0IGEvdW5zdXBwb3J0ZWQvdGVzdC9zcGVjaWFsX2Z1bmN0aW9ucy5jcHAgYi91bnN1cHBvcnRlZC90ZXN0L3NwZWNpYWxfZnVuY3Rpb25zLmNwcAppbmRleCA0NGM3NzUzLi5iMTZhN2JiIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L3NwZWNpYWxfZnVuY3Rpb25zLmNwcAorKysgYi91bnN1cHBvcnRlZC90ZXN0L3NwZWNpYWxfZnVuY3Rpb25zLmNwcApAQCAtMTIsMzIgKzEyLDMwIEBACiAjaW5jbHVkZSAiLi4vRWlnZW4vU3BlY2lhbEZ1bmN0aW9ucyIKIAogLy8gSGFjayB0byBhbGxvdyAiaW1wbGljaXQiIGNvbnZlcnNpb25zIGZyb20gZG91YmxlIHRvIFNjYWxhciB2aWEgY29tbWEtaW5pdGlhbGl6YXRpb24uCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CiBFaWdlbjo6Q29tbWFJbml0aWFsaXplcjxEZXJpdmVkPiBvcGVyYXRvcjw8KEVpZ2VuOjpEZW5zZUJhc2U8RGVyaXZlZD4mIGRlbnNlLCBkb3VibGUgdikgewogICByZXR1cm4gKGRlbnNlIDw8IHN0YXRpY19jYXN0PHR5cGVuYW1lIERlcml2ZWQ6OlNjYWxhcj4odikpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBYcHJUeXBlPgordGVtcGxhdGUgPHR5cGVuYW1lIFhwclR5cGU+CiBFaWdlbjo6Q29tbWFJbml0aWFsaXplcjxYcHJUeXBlPiYgb3BlcmF0b3IsKEVpZ2VuOjpDb21tYUluaXRpYWxpemVyPFhwclR5cGU+JiBjaSwgZG91YmxlIHYpIHsKICAgcmV0dXJuIChjaSwgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgWHByVHlwZTo6U2NhbGFyPih2KSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFk+Ci12b2lkIHZlcmlmeV9jb21wb25lbnRfd2lzZShjb25zdCBYJiB4LCBjb25zdCBZJiB5KQotewotICBmb3IoSW5kZXggaT0wOyBpPHguc2l6ZSgpOyArK2kpCi0gIHsKLSAgICBpZigobnVtZXh0Ojppc2Zpbml0ZSkoeShpKSkpCi0gICAgICBWRVJJRllfSVNfQVBQUk9YKCB4KGkpLCB5KGkpICk7Ci0gICAgZWxzZSBpZigobnVtZXh0Ojppc25hbikoeShpKSkpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgWCwgdHlwZW5hbWUgWT4KK3ZvaWQgdmVyaWZ5X2NvbXBvbmVudF93aXNlKGNvbnN0IFgmIHgsIGNvbnN0IFkmIHkpIHsKKyAgZm9yIChJbmRleCBpID0gMDsgaSA8IHguc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoKG51bWV4dDo6aXNmaW5pdGUpKHkoaSkpKQorICAgICAgVkVSSUZZX0lTX0FQUFJPWCh4KGkpLCB5KGkpKTsKKyAgICBlbHNlIGlmICgobnVtZXh0Ojppc25hbikoeShpKSkpCiAgICAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKHgoaSkpKTsKICAgICBlbHNlCi0gICAgICBWRVJJRllfSVNfRVFVQUwoIHgoaSksIHkoaSkgKTsKKyAgICAgIFZFUklGWV9JU19FUVVBTCh4KGkpLCB5KGkpKTsKICAgfQogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBBcnJheVR5cGU+IHZvaWQgYXJyYXlfc3BlY2lhbF9mdW5jdGlvbnMoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIEFycmF5VHlwZT4KK3ZvaWQgYXJyYXlfc3BlY2lhbF9mdW5jdGlvbnMoKSB7CiAgIHVzaW5nIHN0ZDo6YWJzOwogICB1c2luZyBzdGQ6OnNxcnQ7CiAgIHR5cGVkZWYgdHlwZW5hbWUgQXJyYXlUeXBlOjpTY2FsYXIgU2NhbGFyOwpAQCAtNDYsMTIgKzQ0LDEyIEBACiAgIFNjYWxhciBwbHVzaW5mID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjppbmZpbml0eSgpOwogICBTY2FsYXIgbmFuID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKIAotICBJbmRleCByb3dzID0gaW50ZXJuYWw6OnJhbmRvbTxJbmRleD4oMSwzMCk7CisgIEluZGV4IHJvd3MgPSBpbnRlcm5hbDo6cmFuZG9tPEluZGV4PigxLCAzMCk7CiAgIEluZGV4IGNvbHMgPSAxOwogCiAgIC8vIEFQSQogICB7Ci0gICAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgICBBcnJheVR5cGUgbTEgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKICNpZiBFSUdFTl9IQVNfQzk5X01BVEgKICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmxnYW1tYSgpLCBsZ2FtbWEobTEpKTsKICAgICBWRVJJRllfSVNfQVBQUk9YKG0xLmRpZ2FtbWEoKSwgZGlnYW1tYShtMSkpOwpAQCAtNjAsMTUgKzU4LDEyIEBACiAjZW5kaWYgIC8vIEVJR0VOX0hBU19DOTlfTUFUSAogICB9CiAKLQogI2lmIEVJR0VOX0hBU19DOTlfTUFUSAogICAvLyBjaGVjayBzcGVjaWFsIGZ1bmN0aW9ucyAoY29tcGFyaW5nIGFnYWluc3QgbnVtcHkgaW1wbGVtZW50YXRpb24pCi0gIGlmICghTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCkKLSAgewotCisgIGlmICghTnVtVHJhaXRzPFNjYWxhcj46OklzQ29tcGxleCkgewogICAgIHsKLSAgICAgIEFycmF5VHlwZSBtMSA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsY29scyk7Ci0gICAgICBBcnJheVR5cGUgbTIgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOworICAgICAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyk7CisgICAgICBBcnJheVR5cGUgbTIgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLCBjb2xzKTsKIAogICAgICAgLy8gVGVzdCB2YXJpb3VzIHByb3ByZXRpZXMgb2YgaWdhbW1hICYgaWdhbW1hYy4gIFRoZXNlIGFyZSBub3JtYWxpemVkCiAgICAgICAvLyBnYW1tYSBpbnRlZ3JhbHMgd2hlcmUKQEAgLTg2LDcgKzgxLDYgQEAKICAgICAgIEFycmF5VHlwZSBnYW1tYV9hX3ggPSBFaWdlbjo6aWdhbW1hKGEsIHgpICogYS5sZ2FtbWEoKS5leHAoKTsKICAgICAgIEFycmF5VHlwZSBnYW1tYV9hX20xX3ggPSBFaWdlbjo6aWdhbW1hKGFfbTEsIHgpICogYV9tMS5sZ2FtbWEoKS5leHAoKTsKIAotCiAgICAgICAvLyBHYW1tYShhLCAwKSA9PSBHYW1tYShhKQogICAgICAgVkVSSUZZX0lTX0FQUFJPWChFaWdlbjo6aWdhbW1hYyhhLCB6ZXJvKSwgb25lKTsKIApAQCAtOTQsMTggKzg4LDE4IEBACiAgICAgICBWRVJJRllfSVNfQVBQUk9YKEdhbW1hX2FfeCArIGdhbW1hX2FfeCwgYS5sZ2FtbWEoKS5leHAoKSk7CiAKICAgICAgIC8vIEdhbW1hKGEsIHgpID09IChhIC0gMSkgKiBHYW1tYShhLTEsIHgpICsgeF4oYS0xKSAqIGV4cCgteCkKLSAgICAgIFZFUklGWV9JU19BUFBST1goR2FtbWFfYV94LCAoYSAtIFNjYWxhcigxKSkgKiBHYW1tYV9hX20xX3ggKyB4LnBvdyhhLVNjYWxhcigxKSkgKiAoLXgpLmV4cCgpKTsKKyAgICAgIFZFUklGWV9JU19BUFBST1goR2FtbWFfYV94LCAoYSAtIFNjYWxhcigxKSkgKiBHYW1tYV9hX20xX3ggKyB4LnBvdyhhIC0gU2NhbGFyKDEpKSAqICgteCkuZXhwKCkpOwogCiAgICAgICAvLyBnYW1tYShhLCB4KSA9PSAoYSAtIDEpICogZ2FtbWEoYS0xLCB4KSAtIHheKGEtMSkgKiBleHAoLXgpCi0gICAgICBWRVJJRllfSVNfQVBQUk9YKGdhbW1hX2FfeCwgKGEgLSBTY2FsYXIoMSkpICogZ2FtbWFfYV9tMV94IC0geC5wb3coYS1TY2FsYXIoMSkpICogKC14KS5leHAoKSk7CisgICAgICBWRVJJRllfSVNfQVBQUk9YKGdhbW1hX2FfeCwgKGEgLSBTY2FsYXIoMSkpICogZ2FtbWFfYV9tMV94IC0geC5wb3coYSAtIFNjYWxhcigxKSkgKiAoLXgpLmV4cCgpKTsKICAgICB9CiAgICAgewogICAgICAgLy8gVmVyaWZ5IGZvciBsYXJnZSBhIGFuZCB4IHRoYXQgdmFsdWVzIGFyZSBiZXR3ZWVuIDAgYW5kIDEuCi0gICAgICBBcnJheVR5cGUgbTEgPSBBcnJheVR5cGU6OlJhbmRvbShyb3dzLGNvbHMpOwotICAgICAgQXJyYXlUeXBlIG0yID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cyxjb2xzKTsKKyAgICAgIEFycmF5VHlwZSBtMSA9IEFycmF5VHlwZTo6UmFuZG9tKHJvd3MsIGNvbHMpOworICAgICAgQXJyYXlUeXBlIG0yID0gQXJyYXlUeXBlOjpSYW5kb20ocm93cywgY29scyk7CiAgICAgICBpbnQgbWF4X2V4cG9uZW50ID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptYXhfZXhwb25lbnQxMDsKLSAgICAgIEFycmF5VHlwZSBhID0gbTEuYWJzKCkgKiAgU2NhbGFyKHBvdygxMC4sIG1heF9leHBvbmVudCAtIDEpKTsKLSAgICAgIEFycmF5VHlwZSB4ID0gbTIuYWJzKCkgKiAgU2NhbGFyKHBvdygxMC4sIG1heF9leHBvbmVudCAtIDEpKTsKKyAgICAgIEFycmF5VHlwZSBhID0gbTEuYWJzKCkgKiBTY2FsYXIocG93KDEwLiwgbWF4X2V4cG9uZW50IC0gMSkpOworICAgICAgQXJyYXlUeXBlIHggPSBtMi5hYnMoKSAqIFNjYWxhcihwb3coMTAuLCBtYXhfZXhwb25lbnQgLSAxKSk7CiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgU2NhbGFyIGlnYW0gPSBudW1leHQ6OmlnYW1tYShhKGkpLCB4KGkpKTsKICAgICAgICAgVkVSSUZZKDAgPD0gaWdhbSk7CkBAIC0xMjEsMzQgKzExNSwyNiBAQAogICAgICAgLy8gbG9jYXRpb24gaSo2K2ogY29ycmVzcG9uZHMgdG8gYV9zW2ldLCB4X3Nbal0uCiAgICAgICBTY2FsYXIgaWdhbW1hX3NbXVs2XSA9IHsKICAgICAgICAgICB7U2NhbGFyKDAuMCksIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFufSwKLSAgICAgICAgICB7U2NhbGFyKDAuMCksIFNjYWxhcigwLjYzMjEyMDU1ODgyODU1NzgpLCBTY2FsYXIoMC43NzY4Njk4Mzk4NTE1NzAyKSwKLSAgICAgICAgICAgU2NhbGFyKDAuOTgxNjg0MzYxMTExMjY1OCksIFNjYWxhcig5Ljk5OTUwMDAxNjY2NjI2MmUtMDUpLAotICAgICAgICAgICBTY2FsYXIoMS4wKX0sCi0gICAgICAgICAge1NjYWxhcigwLjApLCBTY2FsYXIoMC40Mjc1OTMyOTU1MjkxMjAyKSwgU2NhbGFyKDAuNjA4Mzc0ODIzNzI4OTExKSwKLSAgICAgICAgICAgU2NhbGFyKDAuOTUzOTg4Mjk0MzEwNzY4NiksIFNjYWxhcig3LjUyMjA3NjQ0NTA4OTIwMWUtMDcpLAotICAgICAgICAgICBTY2FsYXIoMS4wKX0sCi0gICAgICAgICAge1NjYWxhcigwLjApLCBTY2FsYXIoMC4wMTg5ODgxNTY4NzYxNTM4MSksCi0gICAgICAgICAgIFNjYWxhcigwLjA2NTY0MjQ1NDM3ODQ1MDA4KSwgU2NhbGFyKDAuNTY2NTI5ODc5NjMzMjkwOSksCisgICAgICAgICAge1NjYWxhcigwLjApLCBTY2FsYXIoMC42MzIxMjA1NTg4Mjg1NTc4KSwgU2NhbGFyKDAuNzc2ODY5ODM5ODUxNTcwMiksIFNjYWxhcigwLjk4MTY4NDM2MTExMTI2NTgpLAorICAgICAgICAgICBTY2FsYXIoOS45OTk1MDAwMTY2NjYyNjJlLTA1KSwgU2NhbGFyKDEuMCl9LAorICAgICAgICAgIHtTY2FsYXIoMC4wKSwgU2NhbGFyKDAuNDI3NTkzMjk1NTI5MTIwMiksIFNjYWxhcigwLjYwODM3NDgyMzcyODkxMSksIFNjYWxhcigwLjk1Mzk4ODI5NDMxMDc2ODYpLAorICAgICAgICAgICBTY2FsYXIoNy41MjIwNzY0NDUwODkyMDFlLTA3KSwgU2NhbGFyKDEuMCl9LAorICAgICAgICAgIHtTY2FsYXIoMC4wKSwgU2NhbGFyKDAuMDE4OTg4MTU2ODc2MTUzODEpLCBTY2FsYXIoMC4wNjU2NDI0NTQzNzg0NTAwOCksIFNjYWxhcigwLjU2NjUyOTg3OTYzMzI5MDkpLAogICAgICAgICAgICBTY2FsYXIoNC4xNjYzMzMzNDcyMjE4MjhlLTE4KSwgU2NhbGFyKDEuMCl9LAotICAgICAgICAgIHtTY2FsYXIoMC4wKSwgU2NhbGFyKDAuOTk5OTc4MDU5MzYxODYyOCksIFNjYWxhcigwLjk5OTk4OTk5NjcwODA4MzgpLAotICAgICAgICAgICBTY2FsYXIoMC45OTk5OTk2MjE5ODM3OTg4KSwgU2NhbGFyKDAuOTk5MTM3MDQxODY4OTk0NSksIFNjYWxhcigxLjApfSwKLSAgICAgICAgICB7U2NhbGFyKDAuMCksIFNjYWxhcigwLjApLCBTY2FsYXIoMC4wKSwgU2NhbGFyKDAuMCksIFNjYWxhcigwLjApLAotICAgICAgICAgICBTY2FsYXIoMC41MDQyMDQxOTMyNTEzOTA4KX19OworICAgICAgICAgIHtTY2FsYXIoMC4wKSwgU2NhbGFyKDAuOTk5OTc4MDU5MzYxODYyOCksIFNjYWxhcigwLjk5OTk4OTk5NjcwODA4MzgpLCBTY2FsYXIoMC45OTk5OTk2MjE5ODM3OTg4KSwKKyAgICAgICAgICAgU2NhbGFyKDAuOTk5MTM3MDQxODY4OTk0NSksIFNjYWxhcigxLjApfSwKKyAgICAgICAgICB7U2NhbGFyKDAuMCksIFNjYWxhcigwLjApLCBTY2FsYXIoMC4wKSwgU2NhbGFyKDAuMCksIFNjYWxhcigwLjApLCBTY2FsYXIoMC41MDQyMDQxOTMyNTEzOTA4KX19OwogICAgICAgU2NhbGFyIGlnYW1tYWNfc1tdWzZdID0gewogICAgICAgICAgIHtuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFufSwKLSAgICAgICAgICB7U2NhbGFyKDEuMCksIFNjYWxhcigwLjM2Nzg3OTQ0MTE3MTQ0MjMzKSwKLSAgICAgICAgICAgU2NhbGFyKDAuMjIzMTMwMTYwMTQ4NDI5ODIpLCBTY2FsYXIoMC4wMTgzMTU2Mzg4ODg3MzQxODIpLAorICAgICAgICAgIHtTY2FsYXIoMS4wKSwgU2NhbGFyKDAuMzY3ODc5NDQxMTcxNDQyMzMpLCBTY2FsYXIoMC4yMjMxMzAxNjAxNDg0Mjk4MiksIFNjYWxhcigwLjAxODMxNTYzODg4ODczNDE4MiksCiAgICAgICAgICAgIFNjYWxhcigwLjk5OTkwMDAwNDk5OTgzMzMpLCBTY2FsYXIoMC4wKX0sCi0gICAgICAgICAge1NjYWxhcigxLjApLCBTY2FsYXIoMC41NzI0MDY3MDQ0NzA4Nzk4KSwgU2NhbGFyKDAuMzkxNjI1MTc2MjcxMDg3OCksCi0gICAgICAgICAgIFNjYWxhcigwLjA0NjAxMTcwNTY4OTIzMTM2KSwgU2NhbGFyKDAuOTk5OTk5MjQ3NzkyMzU1NSksCisgICAgICAgICAge1NjYWxhcigxLjApLCBTY2FsYXIoMC41NzI0MDY3MDQ0NzA4Nzk4KSwgU2NhbGFyKDAuMzkxNjI1MTc2MjcxMDg3OCksIFNjYWxhcigwLjA0NjAxMTcwNTY4OTIzMTM2KSwKKyAgICAgICAgICAgU2NhbGFyKDAuOTk5OTk5MjQ3NzkyMzU1NSksIFNjYWxhcigwLjApfSwKKyAgICAgICAgICB7U2NhbGFyKDEuMCksIFNjYWxhcigwLjk4MTAxMTg0MzEyMzg0NjIpLCBTY2FsYXIoMC45MzQzNTc1NDU2MjE1NDk5KSwgU2NhbGFyKDAuNDMzNDcwMTIwMzY2NzA4OSksIFNjYWxhcigxLjApLAogICAgICAgICAgICBTY2FsYXIoMC4wKX0sCi0gICAgICAgICAge1NjYWxhcigxLjApLCBTY2FsYXIoMC45ODEwMTE4NDMxMjM4NDYyKSwgU2NhbGFyKDAuOTM0MzU3NTQ1NjIxNTQ5OSksCi0gICAgICAgICAgIFNjYWxhcigwLjQzMzQ3MDEyMDM2NjcwODkpLCBTY2FsYXIoMS4wKSwgU2NhbGFyKDAuMCl9LAotICAgICAgICAgIHtTY2FsYXIoMS4wKSwgU2NhbGFyKDIuMTk0MDYzODEzODE0NjY1OGUtMDUpLAotICAgICAgICAgICBTY2FsYXIoMS4wMDAzMjkxOTE2Mjg1ZS0wNSksIFNjYWxhcigzLjc4MDE2MjAxMTg0MzEzMzRlLTA3KSwKKyAgICAgICAgICB7U2NhbGFyKDEuMCksIFNjYWxhcigyLjE5NDA2MzgxMzgxNDY2NThlLTA1KSwgU2NhbGFyKDEuMDAwMzI5MTkxNjI4NWUtMDUpLCBTY2FsYXIoMy43ODAxNjIwMTE4NDMxMzM0ZS0wNyksCiAgICAgICAgICAgIFNjYWxhcigwLjAwMDg2Mjk1ODEzMTAwNTQ1MzUpLCBTY2FsYXIoMC4wKX0sCi0gICAgICAgICAge1NjYWxhcigxLjApLCBTY2FsYXIoMS4wKSwgU2NhbGFyKDEuMCksIFNjYWxhcigxLjApLCBTY2FsYXIoMS4wKSwKLSAgICAgICAgICAgU2NhbGFyKDAuNDk1Nzk1ODA2NzQ4MTM5NDQpfX07CisgICAgICAgICAge1NjYWxhcigxLjApLCBTY2FsYXIoMS4wKSwgU2NhbGFyKDEuMCksIFNjYWxhcigxLjApLCBTY2FsYXIoMS4wKSwgU2NhbGFyKDAuNDk1Nzk1ODA2NzQ4MTM5NDQpfX07CiAKICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNjsgKytqKSB7CkBAIC0xNzMsNjAgKzE1OSw1OSBAQAogICB7CiAgICAgQXJyYXlUeXBlIHgoMTEpLCByZXMoMTEpLCByZWYoMTEpOwogICAgIHggPDwgMC41LCAwLjIsIDAuOCwgMC45LCAwLjEsIDAuOTksIDAuMDEsIDAsIDEsIC0wLjAxLCAxLjAxOwotICAgIHJlZiA8PCAwLiwgLTAuODQxNjIxMjMzNTcyOTE0MiwgMC44NDE2MjEyMzM1NzI5MTQyLCAxLjI4MTU1MTU2NTU0NDYwMDQsIC0xLjI4MTU1MTU2NTU0NDYwMDQsIDIuMzI2MzQ3ODc0MDQwODQwOCwgLTIuMzI2MzQ3ODc0MDQwODQwOCwgLXBsdXNpbmYsIHBsdXNpbmYsIG5hbiwgbmFuOwotICAgIENBTExfU1VCVEVTVCggdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlZiwgcmVmKTsgKTsKLSAgICBDQUxMX1NVQlRFU1QoIHJlcyA9IHgubmR0cmkoKTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgcmVmKTsgKTsKLSAgICBDQUxMX1NVQlRFU1QoIHJlcyA9IG5kdHJpKHgpOyB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCByZWYpOyApOworICAgIHJlZiA8PCAwLiwgLTAuODQxNjIxMjMzNTcyOTE0MiwgMC44NDE2MjEyMzM1NzI5MTQyLCAxLjI4MTU1MTU2NTU0NDYwMDQsIC0xLjI4MTU1MTU2NTU0NDYwMDQsIDIuMzI2MzQ3ODc0MDQwODQwOCwKKyAgICAgICAgLTIuMzI2MzQ3ODc0MDQwODQwOCwgLXBsdXNpbmYsIHBsdXNpbmYsIG5hbiwgbmFuOworICAgIENBTExfU1VCVEVTVCh2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVmLCByZWYpOyk7CisgICAgQ0FMTF9TVUJURVNUKHJlcyA9IHgubmR0cmkoKTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgcmVmKTspOworICAgIENBTExfU1VCVEVTVChyZXMgPSBuZHRyaSh4KTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgcmVmKTspOwogCiAgICAgLy8gbmR0cmkobm9ybWFsX2NkZih4KSkgfj0geAotICAgIENBTExfU1VCVEVTVCgKLSAgICAgICAgQXJyYXlUeXBlIG0xID0gQXJyYXlUeXBlOjpSYW5kb20oMzIpOwotICAgICAgICB1c2luZyBzdGQ6OnNxcnQ7CisgICAgQ0FMTF9TVUJURVNUKEFycmF5VHlwZSBtMSA9IEFycmF5VHlwZTo6UmFuZG9tKDMyKTsgdXNpbmcgc3RkOjpzcXJ0OwogCi0gICAgICAgIEFycmF5VHlwZSBjZGZfdmFsID0gKG0xIC8gU2NhbGFyKHNxcnQoMi4pKSkuZXJmKCk7Ci0gICAgICAgIGNkZl92YWwgPSAoY2RmX3ZhbCArIFNjYWxhcigxKSkgLyBTY2FsYXIoMik7Ci0gICAgICAgIHZlcmlmeV9jb21wb25lbnRfd2lzZShjZGZfdmFsLm5kdHJpKCksIG0xKTspOwotCisgICAgICAgICAgICAgICAgIEFycmF5VHlwZSBjZGZfdmFsID0gKG0xIC8gU2NhbGFyKHNxcnQoMi4pKSkuZXJmKCk7IGNkZl92YWwgPSAoY2RmX3ZhbCArIFNjYWxhcigxKSkgLyBTY2FsYXIoMik7CisgICAgICAgICAgICAgICAgIHZlcmlmeV9jb21wb25lbnRfd2lzZShjZGZfdmFsLm5kdHJpKCksIG0xKTspOwogICB9CiAKICAgLy8gQ2hlY2sgdGhlIHpldGEgZnVuY3Rpb24gYWdhaW5zdCBzY2lweS5zcGVjaWFsLnpldGEKICAgewogICAgIEFycmF5VHlwZSB4KDExKSwgcSgxMSksIHJlcygxMSksIHJlZigxMSk7Ci0gICAgeCA8PCAxLjUsICAgNCwgMTAuNSwgMTAwMDAuNSwgICAgMywgICAgICAxLCAgICAwLjksICAyLCAgMywgIDQsIDIwMDA7Ci0gICAgcSA8PCAgIDIsIDEuNSwgICAgMywgIDEuMDAwMSwgLTIuNSwgMS4yMzQ1LCAxLjIzNDUsIC0xLCAtMiwgLTMsIDIwMDA7Ci0gICAgcmVmIDw8IDEuNjEyMzc1MzQ4NjksIDAuMjM0ODQ4NTA1NjY3LCAxLjAzMDg2NzU3MzM3ZS01LCAwLjM2Nzg3OTQ0MDg2NSwgMC4wNTQxMDIwMjU4MjA4NjQwOTcsIHBsdXNpbmYsIG5hbiwgcGx1c2luZiwgbmFuLCBwbHVzaW5mLCAwOwotICAgIENBTExfU1VCVEVTVCggdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlZiwgcmVmKTsgKTsKLSAgICBDQUxMX1NVQlRFU1QoIHJlcyA9IHguemV0YShxKTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgcmVmKTsgKTsKLSAgICBDQUxMX1NVQlRFU1QoIHJlcyA9IHpldGEoeCxxKTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgcmVmKTsgKTsKKyAgICB4IDw8IDEuNSwgNCwgMTAuNSwgMTAwMDAuNSwgMywgMSwgMC45LCAyLCAzLCA0LCAyMDAwOworICAgIHEgPDwgMiwgMS41LCAzLCAxLjAwMDEsIC0yLjUsIDEuMjM0NSwgMS4yMzQ1LCAtMSwgLTIsIC0zLCAyMDAwOworICAgIHJlZiA8PCAxLjYxMjM3NTM0ODY5LCAwLjIzNDg0ODUwNTY2NywgMS4wMzA4Njc1NzMzN2UtNSwgMC4zNjc4Nzk0NDA4NjUsIDAuMDU0MTAyMDI1ODIwODY0MDk3LCBwbHVzaW5mLCBuYW4sIHBsdXNpbmYsCisgICAgICAgIG5hbiwgcGx1c2luZiwgMDsKKyAgICBDQUxMX1NVQlRFU1QodmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlZiwgcmVmKTspOworICAgIENBTExfU1VCVEVTVChyZXMgPSB4LnpldGEocSk7IHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIHJlZik7KTsKKyAgICBDQUxMX1NVQlRFU1QocmVzID0gemV0YSh4LCBxKTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgcmVmKTspOwogICB9CiAKICAgLy8gZGlnYW1tYQogICB7CiAgICAgQXJyYXlUeXBlIHgoOSksIHJlcyg5KSwgcmVmKDkpOwogICAgIHggPDwgMSwgMS41LCA0LCAtMTAuNSwgMTAwMDAuNSwgMCwgLTEsIC0yLCAtMzsKLSAgICByZWYgPDwgLTAuNTc3MjE1NjY0OTAxNTMyOSwgMC4wMzY0ODk5NzM5Nzg1NzY0NSwgMS4yNTYxMTc2Njg0MzE4LCAyLjM5ODIzOTEyOTUzNTc4MSwgOS4yMTAzNDAzNzIzOTI4NDksIG5hbiwgbmFuLCBuYW4sIG5hbjsKLSAgICBDQUxMX1NVQlRFU1QoIHZlcmlmeV9jb21wb25lbnRfd2lzZShyZWYsIHJlZik7ICk7CisgICAgcmVmIDw8IC0wLjU3NzIxNTY2NDkwMTUzMjksIDAuMDM2NDg5OTczOTc4NTc2NDUsIDEuMjU2MTE3NjY4NDMxOCwgMi4zOTgyMzkxMjk1MzU3ODEsIDkuMjEwMzQwMzcyMzkyODQ5LCBuYW4sIG5hbiwKKyAgICAgICAgbmFuLCBuYW47CisgICAgQ0FMTF9TVUJURVNUKHZlcmlmeV9jb21wb25lbnRfd2lzZShyZWYsIHJlZik7KTsKIAotICAgIENBTExfU1VCVEVTVCggcmVzID0geC5kaWdhbW1hKCk7IHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIHJlZik7ICk7Ci0gICAgQ0FMTF9TVUJURVNUKCByZXMgPSBkaWdhbW1hKHgpOyAgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgcmVmKTsgKTsKKyAgICBDQUxMX1NVQlRFU1QocmVzID0geC5kaWdhbW1hKCk7IHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIHJlZik7KTsKKyAgICBDQUxMX1NVQlRFU1QocmVzID0gZGlnYW1tYSh4KTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgcmVmKTspOwogICB9CiAKICNpZiBFSUdFTl9IQVNfQzk5X01BVEgKICAgewogICAgIEFycmF5VHlwZSBuKDE2KSwgeCgxNiksIHJlcygxNiksIHJlZigxNik7Ci0gICAgbiA8PCAxLCAxLCAgICAxLCAxLjUsICAgMTcsICAgMzEsICAgMjgsICAgIDgsICAgNDIsICAxNDcsIDE3MCwgLTEsICAwLCAgMSwgIDIsICAzOwotICAgIHggPDwgMiwgMywgMjUuNSwgMS41LCAgNC43LCAxMS44LCAxNy43LCAzMC4yLCAxNS44LCA1NC4xLCAgNjQsIC0xLCAtMiwgLTMsIC00LCAtNTsKLSAgICByZWYgPDwgMC42NDQ5MzQwNjY4NDgsIDAuMzk0OTM0MDY2ODQ4LCAwLjAzOTk5NDY2OTY0OTYsIG5hbiwgMjkzLjMzNDU2NTQzNSwgMC40NDU0ODc4ODc2MTYsIC0yLjQ3ODEwMzAwOTAyZS0wNywgLTguMjk2Njg3ODEwODJlLTA5LCAtMC40MzQ1NjIyNzY2NjYsIDAuNTY3NzQyMTkwMTc4LCAtMC4wMTA4NjE1NDk3OTI3LCBuYW4sIG5hbiwgcGx1c2luZiwgbmFuLCBwbHVzaW5mOwotICAgIENBTExfU1VCVEVTVCggdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlZiwgcmVmKTsgKTsKKyAgICBuIDw8IDEsIDEsIDEsIDEuNSwgMTcsIDMxLCAyOCwgOCwgNDIsIDE0NywgMTcwLCAtMSwgMCwgMSwgMiwgMzsKKyAgICB4IDw8IDIsIDMsIDI1LjUsIDEuNSwgNC43LCAxMS44LCAxNy43LCAzMC4yLCAxNS44LCA1NC4xLCA2NCwgLTEsIC0yLCAtMywgLTQsIC01OworICAgIHJlZiA8PCAwLjY0NDkzNDA2Njg0OCwgMC4zOTQ5MzQwNjY4NDgsIDAuMDM5OTk0NjY5NjQ5NiwgbmFuLCAyOTMuMzM0NTY1NDM1LCAwLjQ0NTQ4Nzg4NzYxNiwgLTIuNDc4MTAzMDA5MDJlLTA3LAorICAgICAgICAtOC4yOTY2ODc4MTA4MmUtMDksIC0wLjQzNDU2MjI3NjY2NiwgMC41Njc3NDIxOTAxNzgsIC0wLjAxMDg2MTU0OTc5MjcsIG5hbiwgbmFuLCBwbHVzaW5mLCBuYW4sIHBsdXNpbmY7CisgICAgQ0FMTF9TVUJURVNUKHZlcmlmeV9jb21wb25lbnRfd2lzZShyZWYsIHJlZik7KTsKIAotICAgIGlmKHNpemVvZihSZWFsU2NhbGFyKT49OCkgeyAgLy8gZG91YmxlCisgICAgaWYgKHNpemVvZihSZWFsU2NhbGFyKSA+PSA4KSB7ICAvLyBkb3VibGUKICAgICAgIC8vIFJlYXNvbiBmb3IgY29tbWVudGVkIGxpbmU6IGh0dHA6Ly9laWdlbi50dXhmYW1pbHkub3JnL2J6L3Nob3dfYnVnLmNnaT9pZD0xMjMyCiAgICAgICAvLyAgICAgICBDQUxMX1NVQlRFU1QoIHJlcyA9IHgucG9seWdhbW1hKG4pOyB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCByZWYpOyApOwotICAgICAgQ0FMTF9TVUJURVNUKCByZXMgPSBwb2x5Z2FtbWEobix4KTsgIHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIHJlZik7ICk7Ci0gICAgfQotICAgIGVsc2UgeworICAgICAgQ0FMTF9TVUJURVNUKHJlcyA9IHBvbHlnYW1tYShuLCB4KTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgcmVmKTspOworICAgIH0gZWxzZSB7CiAgICAgICAvLyAgICAgICBDQUxMX1NVQlRFU1QoIHJlcyA9IHgucG9seWdhbW1hKG4pOyB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLmhlYWQoOCksIHJlZi5oZWFkKDgpKTsgKTsKLSAgICAgIENBTExfU1VCVEVTVCggcmVzID0gcG9seWdhbW1hKG4seCk7IHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMuaGVhZCg4KSwgcmVmLmhlYWQoOCkpOyApOworICAgICAgQ0FMTF9TVUJURVNUKHJlcyA9IHBvbHlnYW1tYShuLCB4KTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcy5oZWFkKDgpLCByZWYuaGVhZCg4KSk7KTsKICAgICB9CiAgIH0KICNlbmRpZgpAQCAtMjQ4LDkyICsyMzMsNjAgQEAKICAgICBBcnJheVR5cGUgdigxMjUpOwogICAgIEFycmF5VHlwZSByZXMoMTI1KTsKIAotICAgIGEgPDwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsCi0gICAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLAotICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwKLSAgICAgICAgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksCi0gICAgICAgIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksCi0gICAgICAgIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksCi0gICAgICAgIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksCisgICAgYSA8PCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsCisgICAgICAgIDAuMCwgMC4wLCAwLjAsIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LAorICAgICAgICAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LAorICAgICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksCisgICAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LAorICAgICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwKKyAgICAgICAgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwKKyAgICAgICAgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OTsKKworICAgIGIgPDwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwKKyAgICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC45OTksCisgICAgICAgIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAorICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwKKyAgICAgICAgMC45OTksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgOTk5Ljk5OSwKKyAgICAgICAgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCisgICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwKKyAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCA5OTkuOTk5LCA5OTkuOTk5LAorICAgICAgICA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKKyAgICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LAorICAgICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDk5OS45OTksIDk5OS45OTksCiAgICAgICAgIDk5OS45OTksIDk5OS45OTksIDk5OS45OTk7CiAKLSAgICBiIDw8IDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwKLSAgICAgICAgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgOTk5Ljk5OSwKLSAgICAgICAgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsCi0gICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCi0gICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LAotICAgICAgICAwLjk5OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LAotICAgICAgICA5OTkuOTk5LCA5OTkuOTk5LCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKLSAgICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC4wMzA2MjI3NzY2MDE2ODM3OSwKLSAgICAgICAgMC4wMzA2MjI3NzY2MDE2ODM3OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LAotICAgICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LAotICAgICAgICAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksIDk5OS45OTksIDk5OS45OTksIDk5OS45OTksCi0gICAgICAgIDk5OS45OTksIDk5OS45OTksIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjAzMDYyMjc3NjYwMTY4Mzc5LAotICAgICAgICAwLjAzMDYyMjc3NjYwMTY4Mzc5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwgMC45OTksCi0gICAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgMzEuNjIxNzc2NjAxNjgzNzksCi0gICAgICAgIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwgOTk5Ljk5OSwgOTk5Ljk5OSwgOTk5Ljk5OSwKLSAgICAgICAgOTk5Ljk5OSwgOTk5Ljk5OSwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMDMwNjIyNzc2NjAxNjgzNzksCi0gICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuMDMwNjIyNzc2NjAxNjgzNzksCi0gICAgICAgIDAuMDMwNjIyNzc2NjAxNjgzNzksIDAuOTk5LCAwLjk5OSwgMC45OTksIDAuOTk5LCAwLjk5OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCAzMS42MjE3NzY2MDE2ODM3OSwKLSAgICAgICAgMzEuNjIxNzc2NjAxNjgzNzksIDMxLjYyMTc3NjYwMTY4Mzc5LCA5OTkuOTk5LCA5OTkuOTk5LCA5OTkuOTk5LAotICAgICAgICA5OTkuOTk5LCA5OTkuOTk5OworICAgIHggPDwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLAorICAgICAgICAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwKKyAgICAgICAgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsCisgICAgICAgIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LAorICAgICAgICAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwKKyAgICAgICAgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xOwogCi0gICAgeCA8PCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsCi0gICAgICAgIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLAotICAgICAgICAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwKLSAgICAgICAgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsIDEuMSwKLSAgICAgICAgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LCAwLjgsCi0gICAgICAgIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwgMC41LAotICAgICAgICAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsIDAuMiwKLSAgICAgICAgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwgMC44LCAxLjEsIC0wLjEsCi0gICAgICAgIDAuMiwgMC41LCAwLjgsIDEuMSwgLTAuMSwgMC4yLCAwLjUsIDAuOCwgMS4xLCAtMC4xLCAwLjIsIDAuNSwKLSAgICAgICAgMC44LCAxLjE7Ci0KLSAgICB2IDw8IG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLAotICAgICAgICBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwKLSAgICAgICAgbmFuLCBuYW4sIG5hbiwgMC40Nzk3MjExOTg3NjM2NDY4MywgMC41LCAwLjUyMDI3ODgwMTIzNjM1MzMsIG5hbiwgbmFuLAotICAgICAgICAwLjk1MTg2ODM5NTc3NDAwNDMsIDAuOTc4OTY2MzAxMDQxMzc0MywgMC45OTMxNzI5MTg4MDczNDM1LCBuYW4sIG5hbiwKLSAgICAgICAgMC45OTk5OTU5NDkwMzMwNjIsIDAuOTk5OTk5OTk5OTk5MzY5OCwgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sIG5hbiwKLSAgICAgICAgMC45OTk5OTk5OTk5OTk5OTk5LCAwLjk5OTk5OTk5OTk5OTk5OTksIDAuOTk5OTk5OTk5OTk5OTk5OSwgbmFuLCBuYW4sCi0gICAgICAgIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCAwLjAwNjgyNzA4MTE5MjY1NTg2OSwgMC4wMjEwMzM2OTg5NTg2MjU2LAotICAgICAgICAwLjA0ODEzMTYwNDIyNTk5NTY3LCBuYW4sIG5hbiwgMC4yMDAxNDM0NDI1NjIxNzY3OCwgMC41MDAwMDAwMDAwMDAwMDAxLAotICAgICAgICAwLjc5OTg1NjU1NzQzNzgyMzIsIG5hbiwgbmFuLCAwLjk5OTE0MDE0Mjg0MzU4MzQsIDAuOTk5OTk5OTk5Njk4NDAzLAotICAgICAgICAwLjk5OTk5OTk5OTk5OTk5OTksIG5hbiwgbmFuLCAwLjk5OTk5OTk5OTk5OTk5OTksIDAuOTk5OTk5OTk5OTk5OTk5OSwKLSAgICAgICAgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sCi0gICAgICAgIDEuMDY0NjYwMDIzMjM3MDg4N2UtMjUsIDYuMzAxNzIyODc3ODI2MjQ2ZS0xMywgNC4wNTA5NjY5Mzc5NzQ5MzhlLTA2LAotICAgICAgICBuYW4sIG5hbiwgNy44NjQzNDI2Njg0Mjk3NjNlLTIzLCAzLjAxNTk2OTY2NzU5NDE2NmUtMTAsCi0gICAgICAgIDAuMDAwODU5ODU3MTU2NDE2NTQ0NCwgbmFuLCBuYW4sIDYuMDMxOTg3NzEwMTIzODQ0ZS0wOCwKLSAgICAgICAgMC41MDAwMDAwMDAwMDAwMDA3LCAwLjk5OTk5OTkzOTY4MDEyMjksIG5hbiwgbmFuLCAwLjk5OTk5OTk5OTk5OTk5OTksCi0gICAgICAgIDAuOTk5OTk5OTk5OTk5OTk5OSwgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLAotICAgICAgICBuYW4sIDAuMCwgNy4wMjk5MjAzODA5ODY2MzZlLTMwNiwgMi4yNDUwNzI4MjA4NTkxMzQ1ZS0xMDEsIG5hbiwgbmFuLAotICAgICAgICAwLjAsIDkuMjc1ODcxMTQ3ODY5NzI3ZS0zMDIsIDEuMjIzMjkxMzAyNjE1MjgyN2UtOTcsIG5hbiwgbmFuLCAwLjAsCi0gICAgICAgIDMuMDg5MTM5MzA4MTkzMjkyNGUtMjUyLCAyLjkzMDMwNDM2NjYxODM5OTZlLTYwLCBuYW4sIG5hbiwKKyAgICB2IDw8IG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwKKyAgICAgICAgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgMC40Nzk3MjExOTg3NjM2NDY4MywgMC41LCAwLjUyMDI3ODgwMTIzNjM1MzMsIG5hbiwgbmFuLAorICAgICAgICAwLjk1MTg2ODM5NTc3NDAwNDMsIDAuOTc4OTY2MzAxMDQxMzc0MywgMC45OTMxNzI5MTg4MDczNDM1LCBuYW4sIG5hbiwgMC45OTk5OTU5NDkwMzMwNjIsIDAuOTk5OTk5OTk5OTk5MzY5OCwKKyAgICAgICAgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sIG5hbiwgMC45OTk5OTk5OTk5OTk5OTk5LCAwLjk5OTk5OTk5OTk5OTk5OTksIDAuOTk5OTk5OTk5OTk5OTk5OSwgbmFuLCBuYW4sIG5hbiwgbmFuLAorICAgICAgICBuYW4sIG5hbiwgbmFuLCAwLjAwNjgyNzA4MTE5MjY1NTg2OSwgMC4wMjEwMzM2OTg5NTg2MjU2LCAwLjA0ODEzMTYwNDIyNTk5NTY3LCBuYW4sIG5hbiwgMC4yMDAxNDM0NDI1NjIxNzY3OCwKKyAgICAgICAgMC41MDAwMDAwMDAwMDAwMDAxLCAwLjc5OTg1NjU1NzQzNzgyMzIsIG5hbiwgbmFuLCAwLjk5OTE0MDE0Mjg0MzU4MzQsIDAuOTk5OTk5OTk5Njk4NDAzLCAwLjk5OTk5OTk5OTk5OTk5OTksCisgICAgICAgIG5hbiwgbmFuLCAwLjk5OTk5OTk5OTk5OTk5OTksIDAuOTk5OTk5OTk5OTk5OTk5OSwgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sIG5hbiwgbmFuLCBuYW4sIG5hbiwgbmFuLCBuYW4sCisgICAgICAgIDEuMDY0NjYwMDIzMjM3MDg4N2UtMjUsIDYuMzAxNzIyODc3ODI2MjQ2ZS0xMywgNC4wNTA5NjY5Mzc5NzQ5MzhlLTA2LCBuYW4sIG5hbiwgNy44NjQzNDI2Njg0Mjk3NjNlLTIzLAorICAgICAgICAzLjAxNTk2OTY2NzU5NDE2NmUtMTAsIDAuMDAwODU5ODU3MTU2NDE2NTQ0NCwgbmFuLCBuYW4sIDYuMDMxOTg3NzEwMTIzODQ0ZS0wOCwgMC41MDAwMDAwMDAwMDAwMDA3LAorICAgICAgICAwLjk5OTk5OTkzOTY4MDEyMjksIG5hbiwgbmFuLCAwLjk5OTk5OTk5OTk5OTk5OTksIDAuOTk5OTk5OTk5OTk5OTk5OSwgMC45OTk5OTk5OTk5OTk5OTk5LCBuYW4sIG5hbiwgbmFuLCBuYW4sCisgICAgICAgIG5hbiwgbmFuLCBuYW4sIDAuMCwgNy4wMjk5MjAzODA5ODY2MzZlLTMwNiwgMi4yNDUwNzI4MjA4NTkxMzQ1ZS0xMDEsIG5hbiwgbmFuLCAwLjAsIDkuMjc1ODcxMTQ3ODY5NzI3ZS0zMDIsCisgICAgICAgIDEuMjIzMjkxMzAyNjE1MjgyN2UtOTcsIG5hbiwgbmFuLCAwLjAsIDMuMDg5MTM5MzA4MTkzMjkyNGUtMjUyLCAyLjkzMDMwNDM2NjYxODM5OTZlLTYwLCBuYW4sIG5hbiwKICAgICAgICAgMi4yNDg5MTM0ODY4NzkxOTllLTE5NiwgMC41MDAwMDAwMDAwMDA0OTQ3LCAwLjk5OTk5OTk5OTk5OTk5OTksIG5hbjsKIAotICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXRhaW5jKGEsIGIsIHgpOwotICAgICAgICAgICAgICAgICB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCB2KTspOworICAgIENBTExfU1VCVEVTVChyZXMgPSBiZXRhaW5jKGEsIGIsIHgpOyB2ZXJpZnlfY29tcG9uZW50X3dpc2UocmVzLCB2KTspOwogICB9CiAKICAgLy8gVGVzdCB2YXJpb3VzIHByb3BlcnRpZXMgb2YgYmV0YWluYwpAQCAtMzQ4LDIyICszMDEsMTYgQEAKICAgICBBcnJheVR5cGUgeCA9IG0zLmFicygpOwogCiAgICAgLy8gYmV0YWluYyhhLCAxLCB4KSA9PSB4KiphCi0gICAgQ0FMTF9TVUJURVNUKAotICAgICAgICBBcnJheVR5cGUgdGVzdCA9IGJldGFpbmMoYSwgb25lLCB4KTsKLSAgICAgICAgQXJyYXlUeXBlIGV4cGVjdGVkID0geC5wb3coYSk7Ci0gICAgICAgIHZlcmlmeV9jb21wb25lbnRfd2lzZSh0ZXN0LCBleHBlY3RlZCk7KTsKKyAgICBDQUxMX1NVQlRFU1QoQXJyYXlUeXBlIHRlc3QgPSBiZXRhaW5jKGEsIG9uZSwgeCk7IEFycmF5VHlwZSBleHBlY3RlZCA9IHgucG93KGEpOworICAgICAgICAgICAgICAgICB2ZXJpZnlfY29tcG9uZW50X3dpc2UodGVzdCwgZXhwZWN0ZWQpOyk7CiAKICAgICAvLyBiZXRhaW5jKDEsIGIsIHgpID09IDEgLSAoMSAtIHgpKipiCi0gICAgQ0FMTF9TVUJURVNUKAotICAgICAgICBBcnJheVR5cGUgdGVzdCA9IGJldGFpbmMob25lLCBiLCB4KTsKLSAgICAgICAgQXJyYXlUeXBlIGV4cGVjdGVkID0gb25lIC0gKG9uZSAtIHgpLnBvdyhiKTsKLSAgICAgICAgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHRlc3QsIGV4cGVjdGVkKTspOworICAgIENBTExfU1VCVEVTVChBcnJheVR5cGUgdGVzdCA9IGJldGFpbmMob25lLCBiLCB4KTsgQXJyYXlUeXBlIGV4cGVjdGVkID0gb25lIC0gKG9uZSAtIHgpLnBvdyhiKTsKKyAgICAgICAgICAgICAgICAgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHRlc3QsIGV4cGVjdGVkKTspOwogCiAgICAgLy8gYmV0YWluYyhhLCBiLCB4KSA9PSAxIC0gYmV0YWluYyhiLCBhLCAxLXgpCi0gICAgQ0FMTF9TVUJURVNUKAotICAgICAgICBBcnJheVR5cGUgdGVzdCA9IGJldGFpbmMoYSwgYiwgeCkgKyBiZXRhaW5jKGIsIGEsIG9uZSAtIHgpOwotICAgICAgICBBcnJheVR5cGUgZXhwZWN0ZWQgPSBvbmU7Ci0gICAgICAgIHZlcmlmeV9jb21wb25lbnRfd2lzZSh0ZXN0LCBleHBlY3RlZCk7KTsKKyAgICBDQUxMX1NVQlRFU1QoQXJyYXlUeXBlIHRlc3QgPSBiZXRhaW5jKGEsIGIsIHgpICsgYmV0YWluYyhiLCBhLCBvbmUgLSB4KTsgQXJyYXlUeXBlIGV4cGVjdGVkID0gb25lOworICAgICAgICAgICAgICAgICB2ZXJpZnlfY29tcG9uZW50X3dpc2UodGVzdCwgZXhwZWN0ZWQpOyk7CiAKICAgICAvLyBiZXRhaW5jKGErMSwgYiwgeCkgPSBiZXRhaW5jKGEsIGIsIHgpIC0geCoqYSAqICgxIC0geCkqKmIgLyAoYSAqIGJldGEoYSwgYikpCiAgICAgQ0FMTF9TVUJURVNUKApAQCAtMzcyLDggKzMxOSw3IEBACiAgICAgICAgIC8vIEFkZCBlcHMgdG8gcmhzIGFuZCBsaHMgc28gdGhhdCBjb21wb25lbnQtd2lzZSB0ZXN0IGRvZXNuJ3QgcmVzdWx0IGluCiAgICAgICAgIC8vIG5hbnMgd2hlbiBib3RoIG91dHB1dHMgYXJlIHplcm9zLgogICAgICAgICBBcnJheVR5cGUgZXhwZWN0ZWQgPSBiZXRhaW5jKGEsIGIsIHgpIC0gbnVtIC8gZGVub20gKyBlcHM7Ci0gICAgICAgIEFycmF5VHlwZSB0ZXN0ID0gYmV0YWluYyhhICsgb25lLCBiLCB4KSArIGVwczsKLSAgICAgICAgaWYgKHNpemVvZihTY2FsYXIpID49IDgpIHsgLy8gZG91YmxlCisgICAgICAgIEFycmF5VHlwZSB0ZXN0ID0gYmV0YWluYyhhICsgb25lLCBiLCB4KSArIGVwczsgaWYgKHNpemVvZihTY2FsYXIpID49IDgpIHsgIC8vIGRvdWJsZQogICAgICAgICAgIHZlcmlmeV9jb21wb25lbnRfd2lzZSh0ZXN0LCBleHBlY3RlZCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgLy8gUmVhc29uIGZvciBsaW1pdGVkIHRlc3Q6IGh0dHA6Ly9laWdlbi50dXhmYW1pbHkub3JnL2J6L3Nob3dfYnVnLmNnaT9pZD0xMjMyCkBAIC0zODYsMzggKzMzMiwzNyBAQAogICAgICAgICAvLyBuYW5zIHdoZW4gYm90aCBvdXRwdXRzIGFyZSB6ZXJvcy4KICAgICAgICAgQXJyYXlUeXBlIG51bSA9IHgucG93KGEpICogKG9uZSAtIHgpLnBvdyhiKTsKICAgICAgICAgQXJyYXlUeXBlIGRlbm9tID0gYiAqIChhLmxnYW1tYSgpICsgYi5sZ2FtbWEoKSAtIChhICsgYikubGdhbW1hKCkpLmV4cCgpOwotICAgICAgICBBcnJheVR5cGUgZXhwZWN0ZWQgPSBiZXRhaW5jKGEsIGIsIHgpICsgbnVtIC8gZGVub20gKyBlcHM7Ci0gICAgICAgIEFycmF5VHlwZSB0ZXN0ID0gYmV0YWluYyhhLCBiICsgb25lLCB4KSArIGVwczsKKyAgICAgICAgQXJyYXlUeXBlIGV4cGVjdGVkID0gYmV0YWluYyhhLCBiLCB4KSArIG51bSAvIGRlbm9tICsgZXBzOyBBcnJheVR5cGUgdGVzdCA9IGJldGFpbmMoYSwgYiArIG9uZSwgeCkgKyBlcHM7CiAgICAgICAgIHZlcmlmeV9jb21wb25lbnRfd2lzZSh0ZXN0LCBleHBlY3RlZCk7KTsKICAgfQogI2VuZGlmICAvLyBFSUdFTl9IQVNfQzk5X01BVEgKIAotICAgIC8qIENvZGUgdG8gZ2VuZXJhdGUgdGhlIGRhdGEgZm9yIHRoZSBmb2xsb3dpbmcgdHdvIHRlc3QgY2FzZXMuCi0gICAgTiA9IDUKLSAgICBucC5yYW5kb20uc2VlZCgzKQorICAvKiBDb2RlIHRvIGdlbmVyYXRlIHRoZSBkYXRhIGZvciB0aGUgZm9sbG93aW5nIHR3byB0ZXN0IGNhc2VzLgorICBOID0gNQorICBucC5yYW5kb20uc2VlZCgzKQogCi0gICAgYSA9IG5wLmxvZ3NwYWNlKC0yLCAzLCA2KQotICAgIGEgPSBucC5yYXZlbChucC50aWxlKG5wLnJlc2hhcGUoYSwgWy0xLCAxXSksIFsxLCBOXSkpCi0gICAgeCA9IG5wLnJhbmRvbS5nYW1tYShhLCAxLjApCi0gICAgeCA9IG5wLm1heGltdW0oeCwgbnAuZmluZm8obnAuZmxvYXQzMikudGlueSkKKyAgYSA9IG5wLmxvZ3NwYWNlKC0yLCAzLCA2KQorICBhID0gbnAucmF2ZWwobnAudGlsZShucC5yZXNoYXBlKGEsIFstMSwgMV0pLCBbMSwgTl0pKQorICB4ID0gbnAucmFuZG9tLmdhbW1hKGEsIDEuMCkKKyAgeCA9IG5wLm1heGltdW0oeCwgbnAuZmluZm8obnAuZmxvYXQzMikudGlueSkKIAotICAgIGRlZiBpZ2FtbWEoYSwgeCk6Ci0gICAgICByZXR1cm4gbXBtYXRoLmdhbW1haW5jKGEsIDAsIHgsIHJlZ3VsYXJpemVkPVRydWUpCisgIGRlZiBpZ2FtbWEoYSwgeCk6CisgICAgcmV0dXJuIG1wbWF0aC5nYW1tYWluYyhhLCAwLCB4LCByZWd1bGFyaXplZD1UcnVlKQogCi0gICAgZGVmIGlnYW1tYV9kZXJfYShhLCB4KToKLSAgICAgIHJlcyA9IG1wbWF0aC5kaWZmKGxhbWJkYSBhX3ByaW1lOiBpZ2FtbWEoYV9wcmltZSwgeCksIGEpCi0gICAgICByZXR1cm4gbnAuZmxvYXQ2NChyZXMpCisgIGRlZiBpZ2FtbWFfZGVyX2EoYSwgeCk6CisgICAgcmVzID0gbXBtYXRoLmRpZmYobGFtYmRhIGFfcHJpbWU6IGlnYW1tYShhX3ByaW1lLCB4KSwgYSkKKyAgICByZXR1cm4gbnAuZmxvYXQ2NChyZXMpCiAKLSAgICBkZWYgZ2FtbWFfc2FtcGxlX2Rlcl9hbHBoYShhLCB4KToKLSAgICAgIGlnYW1tYV94ID0gaWdhbW1hKGEsIHgpCi0gICAgICBkZWYgaWdhbW1haW52X29mX2lnYW1tYShhX3ByaW1lKToKLSAgICAgICAgcmV0dXJuIG1wbWF0aC5maW5kcm9vdChsYW1iZGEgeF9wcmltZTogaWdhbW1hKGFfcHJpbWUsIHhfcHJpbWUpIC0KLSAgICAgICAgICAgIGlnYW1tYV94LCB4LCBzb2x2ZXI9J25ld3RvbicpCi0gICAgICByZXR1cm4gbnAuZmxvYXQ2NChtcG1hdGguZGlmZihpZ2FtbWFpbnZfb2ZfaWdhbW1hLCBhKSkKKyAgZGVmIGdhbW1hX3NhbXBsZV9kZXJfYWxwaGEoYSwgeCk6CisgICAgaWdhbW1hX3ggPSBpZ2FtbWEoYSwgeCkKKyAgICBkZWYgaWdhbW1haW52X29mX2lnYW1tYShhX3ByaW1lKToKKyAgICAgIHJldHVybiBtcG1hdGguZmluZHJvb3QobGFtYmRhIHhfcHJpbWU6IGlnYW1tYShhX3ByaW1lLCB4X3ByaW1lKSAtCisgICAgICAgICAgaWdhbW1hX3gsIHgsIHNvbHZlcj0nbmV3dG9uJykKKyAgICByZXR1cm4gbnAuZmxvYXQ2NChtcG1hdGguZGlmZihpZ2FtbWFpbnZfb2ZfaWdhbW1hLCBhKSkKIAotICAgIHZfaWdhbW1hX2Rlcl9hID0gbnAudmVjdG9yaXplKGlnYW1tYV9kZXJfYSkoYSwgeCkKLSAgICB2X2dhbW1hX3NhbXBsZV9kZXJfYWxwaGEgPSBucC52ZWN0b3JpemUoZ2FtbWFfc2FtcGxlX2Rlcl9hbHBoYSkoYSwgeCkKLSAgKi8KKyAgdl9pZ2FtbWFfZGVyX2EgPSBucC52ZWN0b3JpemUoaWdhbW1hX2Rlcl9hKShhLCB4KQorICB2X2dhbW1hX3NhbXBsZV9kZXJfYWxwaGEgPSBucC52ZWN0b3JpemUoZ2FtbWFfc2FtcGxlX2Rlcl9hbHBoYSkoYSwgeCkKKyovCiAKICNpZiBFSUdFTl9IQVNfQzk5X01BVEgKICAgLy8gVGVzdCBpZ2FtbWFfZGVyX2EKQEAgLTQyNywyNyArMzcyLDIwIEBACiAgICAgQXJyYXlUeXBlIHJlcygzMCk7CiAgICAgQXJyYXlUeXBlIHYoMzApOwogCi0gICAgYSA8PCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjEsIDAuMSwgMC4xLCAwLjEsIDAuMSwgMS4wLCAxLjAsIDEuMCwKLSAgICAgICAgMS4wLCAxLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwMC4wLCAxMDAuMCwgMTAwLjAsIDEwMC4wLAotICAgICAgICAxMDAuMCwgMTAwMC4wLCAxMDAwLjAsIDEwMDAuMCwgMTAwMC4wLCAxMDAwLjA7CisgICAgYSA8PCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjAxLCAwLjEsIDAuMSwgMC4xLCAwLjEsIDAuMSwgMS4wLCAxLjAsIDEuMCwgMS4wLCAxLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsCisgICAgICAgIDEwMC4wLCAxMDAuMCwgMTAwLjAsIDEwMC4wLCAxMDAuMCwgMTAwMC4wLCAxMDAwLjAsIDEwMDAuMCwgMTAwMC4wLCAxMDAwLjA7CiAKLSAgICB4IDw8IDEuMjU2Njg4OTA0MDVlLTI2LCAxLjE3NTQ5NDM1MDgyZS0zOCwgMS4yMDkzODkwNTA3MmUtMDUsCi0gICAgICAgIDEuMTc1NDk0MzUwODJlLTM4LCAxLjE3NTQ5NDM1MDgyZS0zOCwgNS42NjU3MjA3MDY5NmUtMTYsCi0gICAgICAgIDAuMDEzMjg2NTA2MTA2NSwgMC4wMjAwMDM0MjAzODUzLCA2LjI5MjYzNzA5MTE4ZS0xNywgMS4zNzE2MDM2Nzc2NGUtMDYsCi0gICAgICAgIDAuMzMzNDEyMDM4Mjg4LCAxLjE4MTM1Njg3NzY2LCAwLjU4MDYyOTAzMzc3NywgMC4xNzA2MzE0Mzk0MjYsCi0gICAgICAgIDAuNzg2Njg2NzY4NDU4LCA3LjYzODczMjc5NTM3LCAxMy4xOTQ0MzQ0Mzc5LCAxMS44OTYwNDIzNTQsCi0gICAgICAgIDEwLjU4MzAxNzI0MTcsIDEwLjUwMjA5NDIyMzMsIDkyLjg5MTg1ODc3NDcsIDk1LjAwMzcyMDM3MSwKLSAgICAgICAgODYuMzcxNTkyNjQ2NywgOTYuMDMzMDIxNzY3MiwgODIuNjM4OTkzMDY3NywgOTY4LjcwMjkwNjc1NCwKLSAgICAgICAgOTY5LjQ2MzU0NjgyOCwgMTAwMS43OTcyNjAyMiwgOTU1LjA0NzQxNjU0NywgMTA0NC4yNzQ1ODU2ODsKKyAgICB4IDw8IDEuMjU2Njg4OTA0MDVlLTI2LCAxLjE3NTQ5NDM1MDgyZS0zOCwgMS4yMDkzODkwNTA3MmUtMDUsIDEuMTc1NDk0MzUwODJlLTM4LCAxLjE3NTQ5NDM1MDgyZS0zOCwKKyAgICAgICAgNS42NjU3MjA3MDY5NmUtMTYsIDAuMDEzMjg2NTA2MTA2NSwgMC4wMjAwMDM0MjAzODUzLCA2LjI5MjYzNzA5MTE4ZS0xNywgMS4zNzE2MDM2Nzc2NGUtMDYsIDAuMzMzNDEyMDM4Mjg4LAorICAgICAgICAxLjE4MTM1Njg3NzY2LCAwLjU4MDYyOTAzMzc3NywgMC4xNzA2MzE0Mzk0MjYsIDAuNzg2Njg2NzY4NDU4LCA3LjYzODczMjc5NTM3LCAxMy4xOTQ0MzQ0Mzc5LCAxMS44OTYwNDIzNTQsCisgICAgICAgIDEwLjU4MzAxNzI0MTcsIDEwLjUwMjA5NDIyMzMsIDkyLjg5MTg1ODc3NDcsIDk1LjAwMzcyMDM3MSwgODYuMzcxNTkyNjQ2NywgOTYuMDMzMDIxNzY3MiwgODIuNjM4OTkzMDY3NywKKyAgICAgICAgOTY4LjcwMjkwNjc1NCwgOTY5LjQ2MzU0NjgyOCwgMTAwMS43OTcyNjAyMiwgOTU1LjA0NzQxNjU0NywgMTA0NC4yNzQ1ODU2ODsKIAotICAgIHYgPDwgLTMyLjcyNTY0NDE0NDEsIC0zNi40Mzk0MTUwNTE0LCAtOS42NjQ2NzYxMjI2MywgLTM2LjQzOTQxNTA1MTQsCi0gICAgICAgIC0zNi40Mzk0MTUwNTE0LCAtMS4wODkxOTAwMzAyLCAtMi42NjM1MTIyOTY0NSwgLTIuNDg2NjY4Njg1OTYsCi0gICAgICAgIC0wLjkyOTcwMDQ5NDQyOCwgLTMuNTYzMjc3MjI3NjQsIC0wLjQ1NTMyMDEzNTMxNCwgLTAuMzkxNDM3MjE0MzIzLAotICAgICAgICAtMC40OTEzNTIwNTU5OTEsIC0wLjM1MDQ1NDgzNDI5MiwgLTAuNDcxNzczMTYyOTIxLCAtMC4xMDQwODQ0NDA1MjIsCi0gICAgICAgIC0wLjA3MjM2NDY3NDc5MDksIC0wLjA5OTI4Mjg5NzU1MzIsIC0wLjEyMTYzODIxNTQ0NiwgLTAuMTIyNjE5NjA1Mjk0LAotICAgICAgICAtMC4wMzE3NjcwMjY3Mjg2LCAtMC4wMzU5OTc0ODEyODY5LCAtMC4wMTU0MzU5MjI1MzYzLCAtMC4wMzc1Nzc1MzY1OTIxLAotICAgICAgICAtMC4wMDc5NDg5OTE1MzY1MywgLTAuMDA3NzczMDMyMTkyMTEsIC0wLjAwNzk2MDg1NzgyMDQyLAotICAgICAgICAtMC4wMTI1ODUwNzE5Mzk3LCAtMC4wMDQ1NTUwMDIwNjk1OCwgLTAuMDA0NzY0MzY5OTMxNDg7CisgICAgdiA8PCAtMzIuNzI1NjQ0MTQ0MSwgLTM2LjQzOTQxNTA1MTQsIC05LjY2NDY3NjEyMjYzLCAtMzYuNDM5NDE1MDUxNCwgLTM2LjQzOTQxNTA1MTQsIC0xLjA4OTE5MDAzMDIsIC0yLjY2MzUxMjI5NjQ1LAorICAgICAgICAtMi40ODY2Njg2ODU5NiwgLTAuOTI5NzAwNDk0NDI4LCAtMy41NjMyNzcyMjc2NCwgLTAuNDU1MzIwMTM1MzE0LCAtMC4zOTE0MzcyMTQzMjMsIC0wLjQ5MTM1MjA1NTk5MSwKKyAgICAgICAgLTAuMzUwNDU0ODM0MjkyLCAtMC40NzE3NzMxNjI5MjEsIC0wLjEwNDA4NDQ0MDUyMiwgLTAuMDcyMzY0Njc0NzkwOSwgLTAuMDk5MjgyODk3NTUzMiwgLTAuMTIxNjM4MjE1NDQ2LAorICAgICAgICAtMC4xMjI2MTk2MDUyOTQsIC0wLjAzMTc2NzAyNjcyODYsIC0wLjAzNTk5NzQ4MTI4NjksIC0wLjAxNTQzNTkyMjUzNjMsIC0wLjAzNzU3NzUzNjU5MjEsIC0wLjAwNzk0ODk5MTUzNjUzLAorICAgICAgICAtMC4wMDc3NzMwMzIxOTIxMSwgLTAuMDA3OTYwODU3ODIwNDIsIC0wLjAxMjU4NTA3MTkzOTcsIC0wLjAwNDU1NTAwMjA2OTU4LCAtMC4wMDQ3NjQzNjk5MzE0ODsKIAogICAgIENBTExfU1VCVEVTVChyZXMgPSBpZ2FtbWFfZGVyX2EoYSwgeCk7IHZlcmlmeV9jb21wb25lbnRfd2lzZShyZXMsIHYpOyk7CiAgIH0KQEAgLTQ1OSwzNiArMzk3LDI3IEBACiAgICAgQXJyYXlUeXBlIHJlcygzMCk7CiAgICAgQXJyYXlUeXBlIHYoMzApOwogCi0gICAgYWxwaGEgPDwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4wMSwgMC4xLCAwLjEsIDAuMSwgMC4xLCAwLjEsIDEuMCwgMS4wLAotICAgICAgICAxLjAsIDEuMCwgMS4wLCAxMC4wLCAxMC4wLCAxMC4wLCAxMC4wLCAxMC4wLCAxMDAuMCwgMTAwLjAsIDEwMC4wLCAxMDAuMCwKLSAgICAgICAgMTAwLjAsIDEwMDAuMCwgMTAwMC4wLCAxMDAwLjAsIDEwMDAuMCwgMTAwMC4wOworICAgIGFscGhhIDw8IDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMDEsIDAuMSwgMC4xLCAwLjEsIDAuMSwgMC4xLCAxLjAsIDEuMCwgMS4wLCAxLjAsIDEuMCwgMTAuMCwgMTAuMCwgMTAuMCwgMTAuMCwKKyAgICAgICAgMTAuMCwgMTAwLjAsIDEwMC4wLCAxMDAuMCwgMTAwLjAsIDEwMC4wLCAxMDAwLjAsIDEwMDAuMCwgMTAwMC4wLCAxMDAwLjAsIDEwMDAuMDsKIAotICAgIHNhbXBsZSA8PCAxLjI1NjY4ODkwNDA1ZS0yNiwgMS4xNzU0OTQzNTA4MmUtMzgsIDEuMjA5Mzg5MDUwNzJlLTA1LAotICAgICAgICAxLjE3NTQ5NDM1MDgyZS0zOCwgMS4xNzU0OTQzNTA4MmUtMzgsIDUuNjY1NzIwNzA2OTZlLTE2LAotICAgICAgICAwLjAxMzI4NjUwNjEwNjUsIDAuMDIwMDAzNDIwMzg1MywgNi4yOTI2MzcwOTExOGUtMTcsIDEuMzcxNjAzNjc3NjRlLTA2LAotICAgICAgICAwLjMzMzQxMjAzODI4OCwgMS4xODEzNTY4Nzc2NiwgMC41ODA2MjkwMzM3NzcsIDAuMTcwNjMxNDM5NDI2LAotICAgICAgICAwLjc4NjY4Njc2ODQ1OCwgNy42Mzg3MzI3OTUzNywgMTMuMTk0NDM0NDM3OSwgMTEuODk2MDQyMzU0LAotICAgICAgICAxMC41ODMwMTcyNDE3LCAxMC41MDIwOTQyMjMzLCA5Mi44OTE4NTg3NzQ3LCA5NS4wMDM3MjAzNzEsCi0gICAgICAgIDg2LjM3MTU5MjY0NjcsIDk2LjAzMzAyMTc2NzIsIDgyLjYzODk5MzA2NzcsIDk2OC43MDI5MDY3NTQsCi0gICAgICAgIDk2OS40NjM1NDY4MjgsIDEwMDEuNzk3MjYwMjIsIDk1NS4wNDc0MTY1NDcsIDEwNDQuMjc0NTg1Njg7CisgICAgc2FtcGxlIDw8IDEuMjU2Njg4OTA0MDVlLTI2LCAxLjE3NTQ5NDM1MDgyZS0zOCwgMS4yMDkzODkwNTA3MmUtMDUsIDEuMTc1NDk0MzUwODJlLTM4LCAxLjE3NTQ5NDM1MDgyZS0zOCwKKyAgICAgICAgNS42NjU3MjA3MDY5NmUtMTYsIDAuMDEzMjg2NTA2MTA2NSwgMC4wMjAwMDM0MjAzODUzLCA2LjI5MjYzNzA5MTE4ZS0xNywgMS4zNzE2MDM2Nzc2NGUtMDYsIDAuMzMzNDEyMDM4Mjg4LAorICAgICAgICAxLjE4MTM1Njg3NzY2LCAwLjU4MDYyOTAzMzc3NywgMC4xNzA2MzE0Mzk0MjYsIDAuNzg2Njg2NzY4NDU4LCA3LjYzODczMjc5NTM3LCAxMy4xOTQ0MzQ0Mzc5LCAxMS44OTYwNDIzNTQsCisgICAgICAgIDEwLjU4MzAxNzI0MTcsIDEwLjUwMjA5NDIyMzMsIDkyLjg5MTg1ODc3NDcsIDk1LjAwMzcyMDM3MSwgODYuMzcxNTkyNjQ2NywgOTYuMDMzMDIxNzY3MiwgODIuNjM4OTkzMDY3NywKKyAgICAgICAgOTY4LjcwMjkwNjc1NCwgOTY5LjQ2MzU0NjgyOCwgMTAwMS43OTcyNjAyMiwgOTU1LjA0NzQxNjU0NywgMTA0NC4yNzQ1ODU2ODsKIAotICAgIHYgPDwgNy40MjQyNDc0MjM2N2UtMjMsIDEuMDIwMDQyOTcyODdlLTM0LCAwLjAxMzAxNTUyNDA3MzgsCi0gICAgICAgIDEuMDIwMDQyOTcyODdlLTM0LCAxLjAyMDA0Mjk3Mjg3ZS0zNCwgMS45NjUwNTE2ODI3N2UtMTMsIDAuNTI1NTc1Nzg2MjQzLAotICAgICAgICAwLjcxMzkwMzk5MTc3MSwgMi4zMjA3NzU2MTgwOGUtMTQsIDAuMDAwMTc5MzQ4MDQ5ODg2LCAwLjYzNTUwMDQ1MzMwMiwKLSAgICAgICAgMS4yNzU2MTI4NDkxNywgMC44NzgxMjU4NTIxNTYsIDAuNDE1NjU4MTk1MzgsIDEuMDM2MDY0ODg1MzQsCi0gICAgICAgIDAuODg1OTY0ODI0ODg3LCAxLjE2NDI0MDQ5MzM0LCAxLjEwNzY0NDc5NTk4LCAxLjA0NTkwODEwODEyLAotICAgICAgICAxLjA0MTkzNjY2OTYzLCAwLjk2NTE5MzE1MjQxNCwgMC45NzYyMTc1ODk0NjQsIDAuOTMwMDgwMzUwNjEsCi0gICAgICAgIDAuOTgxNTMyMTYwOTYsIDAuOTA5MTk2Mzk3Njk4LCAwLjk4NDM0OTYzOTkzLCAwLjk4NDczODA1MDIwNiwKLSAgICAgICAgMS4wMDEwNjQ5MjUyNSwgMC45NzczNDIwMDY0OSwgMS4wMjE5ODc5NDE3OTsKKyAgICB2IDw8IDcuNDI0MjQ3NDIzNjdlLTIzLCAxLjAyMDA0Mjk3Mjg3ZS0zNCwgMC4wMTMwMTU1MjQwNzM4LCAxLjAyMDA0Mjk3Mjg3ZS0zNCwgMS4wMjAwNDI5NzI4N2UtMzQsIDEuOTY1MDUxNjgyNzdlLTEzLAorICAgICAgICAwLjUyNTU3NTc4NjI0MywgMC43MTM5MDM5OTE3NzEsIDIuMzIwNzc1NjE4MDhlLTE0LCAwLjAwMDE3OTM0ODA0OTg4NiwgMC42MzU1MDA0NTMzMDIsIDEuMjc1NjEyODQ5MTcsCisgICAgICAgIDAuODc4MTI1ODUyMTU2LCAwLjQxNTY1ODE5NTM4LCAxLjAzNjA2NDg4NTM0LCAwLjg4NTk2NDgyNDg4NywgMS4xNjQyNDA0OTMzNCwgMS4xMDc2NDQ3OTU5OCwgMS4wNDU5MDgxMDgxMiwKKyAgICAgICAgMS4wNDE5MzY2Njk2MywgMC45NjUxOTMxNTI0MTQsIDAuOTc2MjE3NTg5NDY0LCAwLjkzMDA4MDM1MDYxLCAwLjk4MTUzMjE2MDk2LCAwLjkwOTE5NjM5NzY5OCwgMC45ODQzNDk2Mzk5MywKKyAgICAgICAgMC45ODQ3MzgwNTAyMDYsIDEuMDAxMDY0OTI1MjUsIDAuOTc3MzQyMDA2NDksIDEuMDIxOTg3OTQxNzk7CiAKLSAgICBDQUxMX1NVQlRFU1QocmVzID0gZ2FtbWFfc2FtcGxlX2Rlcl9hbHBoYShhbHBoYSwgc2FtcGxlKTsKLSAgICAgICAgICAgICAgICAgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgdik7KTsKKyAgICBDQUxMX1NVQlRFU1QocmVzID0gZ2FtbWFfc2FtcGxlX2Rlcl9hbHBoYShhbHBoYSwgc2FtcGxlKTsgdmVyaWZ5X2NvbXBvbmVudF93aXNlKHJlcywgdik7KTsKICAgfQogI2VuZGlmICAvLyBFSUdFTl9IQVNfQzk5X01BVEgKIH0KIAotRUlHRU5fREVDTEFSRV9URVNUKHNwZWNpYWxfZnVuY3Rpb25zKQoteworRUlHRU5fREVDTEFSRV9URVNUKHNwZWNpYWxfZnVuY3Rpb25zKSB7CiAgIENBTExfU1VCVEVTVF8xKGFycmF5X3NwZWNpYWxfZnVuY3Rpb25zPEFycmF5WGY+KCkpOwogICBDQUxMX1NVQlRFU1RfMihhcnJheV9zcGVjaWFsX2Z1bmN0aW9uczxBcnJheVhkPigpKTsKICAgLy8gVE9ETyhjYW50b25pb3MpOiBoYWxmL2JmbG9hdDE2IGRvbid0IGhhdmUgZW5vdWdoIHByZWNpc2lvbiB0byByZXByb2R1Y2UgcmVzdWx0cyBhYm92ZS4KZGlmZiAtLWdpdCBhL3Vuc3VwcG9ydGVkL3Rlc3Qvc3BlY2lhbF9wYWNrZXRtYXRoLmNwcCBiL3Vuc3VwcG9ydGVkL3Rlc3Qvc3BlY2lhbF9wYWNrZXRtYXRoLmNwcAppbmRleCBmYWYxMGVmLi4xZWM1YzNkIDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L3NwZWNpYWxfcGFja2V0bWF0aC5jcHAKKysrIGIvdW5zdXBwb3J0ZWQvdGVzdC9zcGVjaWFsX3BhY2tldG1hdGguY3BwCkBAIC0xMiwzOSArMTIsMzkgQEAKICNpbmNsdWRlICJwYWNrZXRtYXRoX3Rlc3Rfc2hhcmVkLmgiCiAjaW5jbHVkZSAiLi4vRWlnZW4vU3BlY2lhbEZ1bmN0aW9ucyIKIAotdGVtcGxhdGU8dHlwZW5hbWUgU2NhbGFyLHR5cGVuYW1lIFBhY2tldD4gdm9pZCBwYWNrZXRtYXRoX3JlYWwoKQotewordGVtcGxhdGUgPHR5cGVuYW1lIFNjYWxhciwgdHlwZW5hbWUgUGFja2V0Pgordm9pZCBwYWNrZXRtYXRoX3JlYWwoKSB7CiAgIHVzaW5nIHN0ZDo6YWJzOwogICB0eXBlZGVmIGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj4gUGFja2V0VHJhaXRzOwogICBjb25zdCBpbnQgUGFja2V0U2l6ZSA9IGludGVybmFsOjp1bnBhY2tldF90cmFpdHM8UGFja2V0Pjo6c2l6ZTsKIAotICBjb25zdCBpbnQgc2l6ZSA9IFBhY2tldFNpemUqNDsKLSAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciBkYXRhMVtQYWNrZXRTaXplKjRdOwotICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGRhdGEyW1BhY2tldFNpemUqNF07Ci0gIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgcmVmW1BhY2tldFNpemUqNF07CisgIGNvbnN0IGludCBzaXplID0gUGFja2V0U2l6ZSAqIDQ7CisgIEVJR0VOX0FMSUdOX01BWCBTY2FsYXIgZGF0YTFbUGFja2V0U2l6ZSAqIDRdOworICBFSUdFTl9BTElHTl9NQVggU2NhbGFyIGRhdGEyW1BhY2tldFNpemUgKiA0XTsKKyAgRUlHRU5fQUxJR05fTUFYIFNjYWxhciByZWZbUGFja2V0U2l6ZSAqIDRdOwogCiAjaWYgRUlHRU5fSEFTX0M5OV9NQVRICiAgIHsKICAgICBkYXRhMVswXSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6cXVpZXRfTmFOKCk7Ci0gICAgdGVzdDo6cGFja2V0X2hlbHBlcjxpbnRlcm5hbDo6cGFja2V0X3RyYWl0czxTY2FsYXI+OjpIYXNMR2FtbWEsUGFja2V0PiBoOworICAgIHRlc3Q6OnBhY2tldF9oZWxwZXI8aW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzTEdhbW1hLCBQYWNrZXQ+IGg7CiAgICAgaC5zdG9yZShkYXRhMiwgaW50ZXJuYWw6OnBsZ2FtbWEoaC5sb2FkKGRhdGExKSkpOwogICAgIFZFUklGWSgobnVtZXh0Ojppc25hbikoZGF0YTJbMF0pKTsKICAgfQogICBpZiAoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzRXJmKSB7CiAgICAgZGF0YTFbMF0gPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46OnF1aWV0X05hTigpOwotICAgIHRlc3Q6OnBhY2tldF9oZWxwZXI8aW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzRXJmLFBhY2tldD4gaDsKKyAgICB0ZXN0OjpwYWNrZXRfaGVscGVyPGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0VyZiwgUGFja2V0PiBoOwogICAgIGguc3RvcmUoZGF0YTIsIGludGVybmFsOjpwZXJmKGgubG9hZChkYXRhMSkpKTsKICAgICBWRVJJRlkoKG51bWV4dDo6aXNuYW4pKGRhdGEyWzBdKSk7CiAgIH0KICAgewogICAgIGRhdGExWzBdID0gc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjpxdWlldF9OYU4oKTsKLSAgICB0ZXN0OjpwYWNrZXRfaGVscGVyPGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0VyZmMsUGFja2V0PiBoOworICAgIHRlc3Q6OnBhY2tldF9oZWxwZXI8aW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzRXJmYywgUGFja2V0PiBoOwogICAgIGguc3RvcmUoZGF0YTIsIGludGVybmFsOjpwZXJmYyhoLmxvYWQoZGF0YTEpKSk7CiAgICAgVkVSSUZZKChudW1leHQ6OmlzbmFuKShkYXRhMlswXSkpOwogICB9CiAgIHsKLSAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgKytpKSB7Ci0gICAgICBkYXRhMVtpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoMCksU2NhbGFyKDEpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgZGF0YTFbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oU2NhbGFyKDApLCBTY2FsYXIoMSkpOwogICAgIH0KICAgICBDSEVDS19DV0lTRTFfSUYoaW50ZXJuYWw6OnBhY2tldF90cmFpdHM8U2NhbGFyPjo6SGFzTmR0cmksIG51bWV4dDo6bmR0cmksIGludGVybmFsOjpwbmR0cmkpOwogICB9CkBAIC01MiwxMSArNTIsMTIgQEAKIAogICAvLyBGb3IgYmVzc2VsX2kqZSBhbmQgYmVzc2VsX2oqLCB0aGUgdmFsaWQgcmFuZ2UgaXMgbmVnYXRpdmUgcmVhbHMuCiAgIHsKLSAgICBjb25zdCBpbnQgbWF4X2V4cG9uZW50ID0gbnVtZXh0OjptaW5pKHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6bWF4X2V4cG9uZW50MTAtMSwgNik7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHNpemU7ICsraSkKLSAgICB7Ci0gICAgICBkYXRhMVtpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoLTEpLFNjYWxhcigxKSkgKiBTY2FsYXIoc3RkOjpwb3coU2NhbGFyKDEwKSwgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigtbWF4X2V4cG9uZW50KSxTY2FsYXIobWF4X2V4cG9uZW50KSkpKTsKLSAgICAgIGRhdGEyW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigtMSksU2NhbGFyKDEpKSAqIFNjYWxhcihzdGQ6OnBvdyhTY2FsYXIoMTApLCBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oU2NhbGFyKC1tYXhfZXhwb25lbnQpLFNjYWxhcihtYXhfZXhwb25lbnQpKSkpOworICAgIGNvbnN0IGludCBtYXhfZXhwb25lbnQgPSBudW1leHQ6Om1pbmkoc3RkOjpudW1lcmljX2xpbWl0czxTY2FsYXI+OjptYXhfZXhwb25lbnQxMCAtIDEsIDYpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICBkYXRhMVtpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoLTEpLCBTY2FsYXIoMSkpICoKKyAgICAgICAgICAgICAgICAgU2NhbGFyKHN0ZDo6cG93KFNjYWxhcigxMCksIGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoLW1heF9leHBvbmVudCksIFNjYWxhcihtYXhfZXhwb25lbnQpKSkpOworICAgICAgZGF0YTJbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oU2NhbGFyKC0xKSwgU2NhbGFyKDEpKSAqCisgICAgICAgICAgICAgICAgIFNjYWxhcihzdGQ6OnBvdyhTY2FsYXIoMTApLCBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oU2NhbGFyKC1tYXhfZXhwb25lbnQpLCBTY2FsYXIobWF4X2V4cG9uZW50KSkpKTsKICAgICB9CiAKICAgICBDSEVDS19DV0lTRTFfSUYoUGFja2V0VHJhaXRzOjpIYXNCZXNzZWwsIG51bWV4dDo6YmVzc2VsX2kwZSwgaW50ZXJuYWw6OnBiZXNzZWxfaTBlKTsKQEAgLTY4LDIzICs2OSwyMyBAQAogICAvLyBVc2UgYSBzbWFsbGVyIGRhdGEgcmFuZ2UgZm9yIHRoZSBiZXNzZWxfaSogYXMgdGhlc2UgY2FuIGJlY29tZSB2ZXJ5IGxhcmdlLgogICAvLyBGb2xsb3dpbmcgIzE2OTMsIHdlIGFsc28gcmVzdHJpY3QgdGhpcyByYW5nZSBmdXJ0aGVyIHRvIGF2b2lkIGluZidzIGR1ZSB0bwogICAvLyBkaWZmZXJlbmNlcyBpbiBwZXhwIGFuZCBleHAuCi0gIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpIHsKLSAgICAgIGRhdGExW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigwLjAxKSxTY2FsYXIoMSkpICoKLSAgICAgICAgICAgICAgICAgIFNjYWxhcihzdGQ6OnBvdyhTY2FsYXIoOSksIGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoLTEpLFNjYWxhcigyKSkpKTsKLSAgICAgIGRhdGEyW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigwLjAxKSxTY2FsYXIoMSkpICoKLSAgICAgICAgICAgICAgICAgIFNjYWxhcihzdGQ6OnBvdyhTY2FsYXIoOSksIGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoLTEpLFNjYWxhcigyKSkpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBkYXRhMVtpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoMC4wMSksIFNjYWxhcigxKSkgKgorICAgICAgICAgICAgICAgU2NhbGFyKHN0ZDo6cG93KFNjYWxhcig5KSwgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigtMSksIFNjYWxhcigyKSkpKTsKKyAgICBkYXRhMltpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoMC4wMSksIFNjYWxhcigxKSkgKgorICAgICAgICAgICAgICAgU2NhbGFyKHN0ZDo6cG93KFNjYWxhcig5KSwgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigtMSksIFNjYWxhcigyKSkpKTsKICAgfQogICBDSEVDS19DV0lTRTFfSUYoUGFja2V0VHJhaXRzOjpIYXNCZXNzZWwsIG51bWV4dDo6YmVzc2VsX2kwLCBpbnRlcm5hbDo6cGJlc3NlbF9pMCk7CiAgIENIRUNLX0NXSVNFMV9JRihQYWNrZXRUcmFpdHM6Okhhc0Jlc3NlbCwgbnVtZXh0OjpiZXNzZWxfaTEsIGludGVybmFsOjpwYmVzc2VsX2kxKTsKIAotCiAgIC8vIHlfaSwgYW5kIGtfaSBhcmUgdmFsaWQgZm9yIHggPiAwLgogICB7Ci0gICAgY29uc3QgaW50IG1heF9leHBvbmVudCA9IG51bWV4dDo6bWluaShzdGQ6Om51bWVyaWNfbGltaXRzPFNjYWxhcj46Om1heF9leHBvbmVudDEwLTEsIDUpOwotICAgIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpCi0gICAgewotICAgICAgZGF0YTFbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oU2NhbGFyKDAuMDEpLFNjYWxhcigxKSkgKiBTY2FsYXIoc3RkOjpwb3coU2NhbGFyKDEwKSwgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigtMiksU2NhbGFyKG1heF9leHBvbmVudCkpKSk7Ci0gICAgICBkYXRhMltpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoMC4wMSksU2NhbGFyKDEpKSAqIFNjYWxhcihzdGQ6OnBvdyhTY2FsYXIoMTApLCBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oU2NhbGFyKC0yKSxTY2FsYXIobWF4X2V4cG9uZW50KSkpKTsKKyAgICBjb25zdCBpbnQgbWF4X2V4cG9uZW50ID0gbnVtZXh0OjptaW5pKHN0ZDo6bnVtZXJpY19saW1pdHM8U2NhbGFyPjo6bWF4X2V4cG9uZW50MTAgLSAxLCA1KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgZGF0YTFbaV0gPSBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oU2NhbGFyKDAuMDEpLCBTY2FsYXIoMSkpICoKKyAgICAgICAgICAgICAgICAgU2NhbGFyKHN0ZDo6cG93KFNjYWxhcigxMCksIGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoLTIpLCBTY2FsYXIobWF4X2V4cG9uZW50KSkpKTsKKyAgICAgIGRhdGEyW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigwLjAxKSwgU2NhbGFyKDEpKSAqCisgICAgICAgICAgICAgICAgIFNjYWxhcihzdGQ6OnBvdyhTY2FsYXIoMTApLCBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oU2NhbGFyKC0yKSwgU2NhbGFyKG1heF9leHBvbmVudCkpKSk7CiAgICAgfQogICB9CiAKQEAgLTk3LDIxICs5OCwyMCBAQAogCiAgIC8vIEZvbGxvd2luZyAjMTY5Mywgd2UgcmVzdHJpY3QgdGhlIHJhbmdlIGZvciBleHAgdG8gYXZvaWQgemVyb2luZyBvdXQgdG9vCiAgIC8vIGZhc3QuCi0gIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpIHsKLSAgICAgIGRhdGExW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigwLjAxKSxTY2FsYXIoMSkpICoKLSAgICAgICAgICAgICAgICAgIFNjYWxhcihzdGQ6OnBvdyhTY2FsYXIoOSksIGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoLTEpLFNjYWxhcigyKSkpKTsKLSAgICAgIGRhdGEyW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigwLjAxKSxTY2FsYXIoMSkpICoKLSAgICAgICAgICAgICAgICAgIFNjYWxhcihzdGQ6OnBvdyhTY2FsYXIoOSksIGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoLTEpLFNjYWxhcigyKSkpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBkYXRhMVtpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoMC4wMSksIFNjYWxhcigxKSkgKgorICAgICAgICAgICAgICAgU2NhbGFyKHN0ZDo6cG93KFNjYWxhcig5KSwgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigtMSksIFNjYWxhcigyKSkpKTsKKyAgICBkYXRhMltpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoMC4wMSksIFNjYWxhcigxKSkgKgorICAgICAgICAgICAgICAgU2NhbGFyKHN0ZDo6cG93KFNjYWxhcig5KSwgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigtMSksIFNjYWxhcigyKSkpKTsKICAgfQogICBDSEVDS19DV0lTRTFfSUYoUGFja2V0VHJhaXRzOjpIYXNCZXNzZWwsIG51bWV4dDo6YmVzc2VsX2swLCBpbnRlcm5hbDo6cGJlc3NlbF9rMCk7CiAgIENIRUNLX0NXSVNFMV9JRihQYWNrZXRUcmFpdHM6Okhhc0Jlc3NlbCwgbnVtZXh0OjpiZXNzZWxfazEsIGludGVybmFsOjpwYmVzc2VsX2sxKTsKIAotCi0gIGZvciAoaW50IGk9MDsgaTxzaXplOyArK2kpIHsKLSAgICAgIGRhdGExW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigwLjAxKSxTY2FsYXIoMSkpICoKLSAgICAgICAgICAgICAgICAgIFNjYWxhcihzdGQ6OnBvdyhTY2FsYXIoMTApLCBpbnRlcm5hbDo6cmFuZG9tPFNjYWxhcj4oU2NhbGFyKC0xKSxTY2FsYXIoMikpKSk7Ci0gICAgICBkYXRhMltpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoMC4wMSksU2NhbGFyKDEpKSAqCi0gICAgICAgICAgICAgICAgICBTY2FsYXIoc3RkOjpwb3coU2NhbGFyKDEwKSwgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigtMSksU2NhbGFyKDIpKSkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgIGRhdGExW2ldID0gaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigwLjAxKSwgU2NhbGFyKDEpKSAqCisgICAgICAgICAgICAgICBTY2FsYXIoc3RkOjpwb3coU2NhbGFyKDEwKSwgaW50ZXJuYWw6OnJhbmRvbTxTY2FsYXI+KFNjYWxhcigtMSksIFNjYWxhcigyKSkpKTsKKyAgICBkYXRhMltpXSA9IGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoMC4wMSksIFNjYWxhcigxKSkgKgorICAgICAgICAgICAgICAgU2NhbGFyKHN0ZDo6cG93KFNjYWxhcigxMCksIGludGVybmFsOjpyYW5kb208U2NhbGFyPihTY2FsYXIoLTEpLCBTY2FsYXIoMikpKSk7CiAgIH0KIAogI2lmIEVJR0VOX0hBU19DOTlfTUFUSApAQCAtMTE5LDMxICsxMTksMjYgQEAKICAgQ0hFQ0tfQ1dJU0UxX0lGKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0VyZiwgc3RkOjplcmYsIGludGVybmFsOjpwZXJmKTsKICAgQ0hFQ0tfQ1dJU0UxX0lGKGludGVybmFsOjpwYWNrZXRfdHJhaXRzPFNjYWxhcj46Okhhc0VyZmMsIHN0ZDo6ZXJmYywgaW50ZXJuYWw6OnBlcmZjKTsKICNlbmRpZgotCiB9CiAKIG5hbWVzcGFjZSBFaWdlbiB7CiBuYW1lc3BhY2UgdGVzdCB7CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNjYWxhcix0eXBlbmFtZSBQYWNrZXRUeXBlLCBib29sIElzQ29tcGxleCwgYm9vbCBJc0ludGVnZXI+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyLCB0eXBlbmFtZSBQYWNrZXRUeXBlLCBib29sIElzQ29tcGxleCwgYm9vbCBJc0ludGVnZXI+CiBzdHJ1Y3QgcnVuYWxsIHsKLSAgc3RhdGljIHZvaWQgcnVuKCkgewotICAgIHBhY2tldG1hdGhfcmVhbDxTY2FsYXIsUGFja2V0VHlwZT4oKTsKLSAgfQorICBzdGF0aWMgdm9pZCBydW4oKSB7IHBhY2tldG1hdGhfcmVhbDxTY2FsYXIsIFBhY2tldFR5cGU+KCk7IH0KIH07CiAKLX0KLX0KK30gIC8vIG5hbWVzcGFjZSB0ZXN0Cit9ICAvLyBuYW1lc3BhY2UgRWlnZW4KIAotRUlHRU5fREVDTEFSRV9URVNUKHNwZWNpYWxfcGFja2V0bWF0aCkKLXsKK0VJR0VOX0RFQ0xBUkVfVEVTVChzcGVjaWFsX3BhY2tldG1hdGgpIHsKICAgZ19maXJzdF9wYXNzID0gdHJ1ZTsKLSAgZm9yKGludCBpID0gMDsgaSA8IGdfcmVwZWF0OyBpKyspIHsKLQotICAgIENBTExfU1VCVEVTVF8xKCB0ZXN0OjpydW5uZXI8ZmxvYXQ+OjpydW4oKSApOwotICAgIENBTExfU1VCVEVTVF8yKCB0ZXN0OjpydW5uZXI8ZG91YmxlPjo6cnVuKCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfMyggdGVzdDo6cnVubmVyPEVpZ2VuOjpoYWxmPjo6cnVuKCkgKTsKLSAgICBDQUxMX1NVQlRFU1RfNCggdGVzdDo6cnVubmVyPEVpZ2VuOjpiZmxvYXQxNj46OnJ1bigpICk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7IGkrKykgeworICAgIENBTExfU1VCVEVTVF8xKHRlc3Q6OnJ1bm5lcjxmbG9hdD46OnJ1bigpKTsKKyAgICBDQUxMX1NVQlRFU1RfMih0ZXN0OjpydW5uZXI8ZG91YmxlPjo6cnVuKCkpOworICAgIENBTExfU1VCVEVTVF8zKHRlc3Q6OnJ1bm5lcjxFaWdlbjo6aGFsZj46OnJ1bigpKTsKKyAgICBDQUxMX1NVQlRFU1RfNCh0ZXN0OjpydW5uZXI8RWlnZW46OmJmbG9hdDE2Pjo6cnVuKCkpOwogICAgIGdfZmlyc3RfcGFzcyA9IGZhbHNlOwogICB9CiB9CmRpZmYgLS1naXQgYS91bnN1cHBvcnRlZC90ZXN0L3NwbGluZXMuY3BwIGIvdW5zdXBwb3J0ZWQvdGVzdC9zcGxpbmVzLmNwcAppbmRleCA4OGVjODdiLi44MDgzNzE4IDEwMDY0NAotLS0gYS91bnN1cHBvcnRlZC90ZXN0L3NwbGluZXMuY3BwCisrKyBiL3Vuc3VwcG9ydGVkL3Rlc3Qvc3BsaW5lcy5jcHAKQEAgLTEyLDIzMCArMTIsMTU4IEBACiAjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vU3BsaW5lcz4KIAogbmFtZXNwYWNlIEVpZ2VuIHsKLSAgCi0gIC8vIGxldHMgZG8gc29tZSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBhbmQgdGh1cwotICAvLyBmb3JjZSB0aGUgY29tcGlsYXRpb24gb2YgYWxsIHNwbGluZSBmdW5jdGlvbnMuLi4KLSAgdGVtcGxhdGUgY2xhc3MgU3BsaW5lPGRvdWJsZSwgMiwgRHluYW1pYz47Ci0gIHRlbXBsYXRlIGNsYXNzIFNwbGluZTxkb3VibGUsIDMsIER5bmFtaWM+OwogCi0gIHRlbXBsYXRlIGNsYXNzIFNwbGluZTxkb3VibGUsIDIsIDI+OwotICB0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZG91YmxlLCAyLCAzPjsKLSAgdGVtcGxhdGUgY2xhc3MgU3BsaW5lPGRvdWJsZSwgMiwgND47Ci0gIHRlbXBsYXRlIGNsYXNzIFNwbGluZTxkb3VibGUsIDIsIDU+OworLy8gbGV0cyBkbyBzb21lIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGFuZCB0aHVzCisvLyBmb3JjZSB0aGUgY29tcGlsYXRpb24gb2YgYWxsIHNwbGluZSBmdW5jdGlvbnMuLi4KK3RlbXBsYXRlIGNsYXNzIFNwbGluZTxkb3VibGUsIDIsIER5bmFtaWM+OwordGVtcGxhdGUgY2xhc3MgU3BsaW5lPGRvdWJsZSwgMywgRHluYW1pYz47CiAKLSAgdGVtcGxhdGUgY2xhc3MgU3BsaW5lPGZsb2F0LCAyLCBEeW5hbWljPjsKLSAgdGVtcGxhdGUgY2xhc3MgU3BsaW5lPGZsb2F0LCAzLCBEeW5hbWljPjsKK3RlbXBsYXRlIGNsYXNzIFNwbGluZTxkb3VibGUsIDIsIDI+OwordGVtcGxhdGUgY2xhc3MgU3BsaW5lPGRvdWJsZSwgMiwgMz47Cit0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZG91YmxlLCAyLCA0PjsKK3RlbXBsYXRlIGNsYXNzIFNwbGluZTxkb3VibGUsIDIsIDU+OwogCi0gIHRlbXBsYXRlIGNsYXNzIFNwbGluZTxmbG9hdCwgMywgMj47Ci0gIHRlbXBsYXRlIGNsYXNzIFNwbGluZTxmbG9hdCwgMywgMz47Ci0gIHRlbXBsYXRlIGNsYXNzIFNwbGluZTxmbG9hdCwgMywgND47Ci0gIHRlbXBsYXRlIGNsYXNzIFNwbGluZTxmbG9hdCwgMywgNT47Cit0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZmxvYXQsIDIsIER5bmFtaWM+OwordGVtcGxhdGUgY2xhc3MgU3BsaW5lPGZsb2F0LCAzLCBEeW5hbWljPjsKIAotfQordGVtcGxhdGUgY2xhc3MgU3BsaW5lPGZsb2F0LCAzLCAyPjsKK3RlbXBsYXRlIGNsYXNzIFNwbGluZTxmbG9hdCwgMywgMz47Cit0ZW1wbGF0ZSBjbGFzcyBTcGxpbmU8ZmxvYXQsIDMsIDQ+OwordGVtcGxhdGUgY2xhc3MgU3BsaW5lPGZsb2F0LCAzLCA1PjsKIAotU3BsaW5lPGRvdWJsZSwgMiwgRHluYW1pYz4gY2xvc2VkX3NwbGluZTJkKCkKLXsKK30gIC8vIG5hbWVzcGFjZSBFaWdlbgorCitTcGxpbmU8ZG91YmxlLCAyLCBEeW5hbWljPiBjbG9zZWRfc3BsaW5lMmQoKSB7CiAgIFJvd1ZlY3RvclhkIGtub3RzKDEyKTsKLSAga25vdHMgPDwgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLjg2NzE5MzE3OTA5Mzg5OCwKLSAgICAxLjY2MDMzMDk1NTM0MjQwOCwKLSAgICAyLjYwNTA4NDgzNDgyMzEzNCwKLSAgICAzLjQ4NDE1NDU4NjM3NDQyOCwKLSAgICA0LjI1MjY5OTQ3ODk1NjI3NiwKLSAgICA0LjI1MjY5OTQ3ODk1NjI3NiwKLSAgICA0LjI1MjY5OTQ3ODk1NjI3NiwKLSAgICA0LjI1MjY5OTQ3ODk1NjI3NjsKKyAga25vdHMgPDwgMCwgMCwgMCwgMCwgMC44NjcxOTMxNzkwOTM4OTgsIDEuNjYwMzMwOTU1MzQyNDA4LCAyLjYwNTA4NDgzNDgyMzEzNCwgMy40ODQxNTQ1ODYzNzQ0MjgsIDQuMjUyNjk5NDc4OTU2Mjc2LAorICAgICAgNC4yNTI2OTk0Nzg5NTYyNzYsIDQuMjUyNjk5NDc4OTU2Mjc2LCA0LjI1MjY5OTQ3ODk1NjI3NjsKIAotICBNYXRyaXhYZCBjdHJscyg4LDIpOwotICBjdHJscyA8PCAtMC4zNzA5Njc3NDE5MzU0ODQsICAgMC4yMzY4NDIxMDUyNjMxNTgsCi0gICAgLTAuMjMxNDAxODYwNjkzMjc3LCAgIDAuNDQyMjQ1MTg1MDI3NjMyLAotICAgIDAuMzQ0MzYxMjI4NTMyODMxLCAgIDAuNzczMzY5OTk0MTIwNzUzLAotICAgIDAuODI4OTkwMjE2MjAzODAyLCAgIDAuMTA2NTUwODgyNjQ3NTk1LAotICAgIDAuNDA3MjcwMTYzNjc4MzgyLCAgLTEuMDQzNDUyOTIyMTcyODQ4LAotICAgIC0wLjQ4ODQ2NzgxMzU4NDA1MywgIC0wLjM5MDA5ODU4MjUzMDA5MCwKLSAgICAtMC40OTQ2NTcxODk0NDY0MjcsICAgMC4wNTQ4MDQ4MjQ4OTc4ODQsCi0gICAgLTAuMzcwOTY3NzQxOTM1NDg0LCAgIDAuMjM2ODQyMTA1MjYzMTU4OworICBNYXRyaXhYZCBjdHJscyg4LCAyKTsKKyAgY3RybHMgPDwgLTAuMzcwOTY3NzQxOTM1NDg0LCAwLjIzNjg0MjEwNTI2MzE1OCwgLTAuMjMxNDAxODYwNjkzMjc3LCAwLjQ0MjI0NTE4NTAyNzYzMiwgMC4zNDQzNjEyMjg1MzI4MzEsCisgICAgICAwLjc3MzM2OTk5NDEyMDc1MywgMC44Mjg5OTAyMTYyMDM4MDIsIDAuMTA2NTUwODgyNjQ3NTk1LCAwLjQwNzI3MDE2MzY3ODM4MiwgLTEuMDQzNDUyOTIyMTcyODQ4LAorICAgICAgLTAuNDg4NDY3ODEzNTg0MDUzLCAtMC4zOTAwOTg1ODI1MzAwOTAsIC0wLjQ5NDY1NzE4OTQ0NjQyNywgMC4wNTQ4MDQ4MjQ4OTc4ODQsIC0wLjM3MDk2Nzc0MTkzNTQ4NCwKKyAgICAgIDAuMjM2ODQyMTA1MjYzMTU4OwogICBjdHJscy50cmFuc3Bvc2VJblBsYWNlKCk7CiAKICAgcmV0dXJuIFNwbGluZTxkb3VibGUsIDIsIER5bmFtaWM+KGtub3RzLCBjdHJscyk7CiB9CiAKIC8qIGNyZWF0ZSBhIHJlZmVyZW5jZSBzcGxpbmUgKi8KLVNwbGluZTxkb3VibGUsIDMsIER5bmFtaWM+IHNwbGluZTNkKCkKLXsKK1NwbGluZTxkb3VibGUsIDMsIER5bmFtaWM+IHNwbGluZTNkKCkgewogICBSb3dWZWN0b3JYZCBrbm90cygxMSk7Ci0gIGtub3RzIDw8IDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAuMTE4OTk3NjgxNTU4Mzc3LAotICAgIDAuMTYyNjExNzM1MTk0NjMxLAotICAgIDAuNDk4MzY0MDUxOTgyMTQzLAotICAgIDAuNjU1MDk4MDAzOTczODQxLAotICAgIDAuNjc5NzAyNjc2ODUzNjc1LAotICAgIDEuMDAwMDAwMDAwMDAwMDAwLAotICAgIDEuMDAwMDAwMDAwMDAwMDAwLAotICAgIDEuMDAwMDAwMDAwMDAwMDAwOworICBrbm90cyA8PCAwLCAwLCAwLCAwLjExODk5NzY4MTU1ODM3NywgMC4xNjI2MTE3MzUxOTQ2MzEsIDAuNDk4MzY0MDUxOTgyMTQzLCAwLjY1NTA5ODAwMzk3Mzg0MSwgMC42Nzk3MDI2NzY4NTM2NzUsCisgICAgICAxLjAwMDAwMDAwMDAwMDAwMCwgMS4wMDAwMDAwMDAwMDAwMDAsIDEuMDAwMDAwMDAwMDAwMDAwOwogCi0gIE1hdHJpeFhkIGN0cmxzKDgsMyk7Ci0gIGN0cmxzIDw8ICAgIDAuOTU5NzQzOTU4NTE2MDgxLCAgIDAuMzQwMzg1NzI2NjY2MTMzLCAgIDAuNTg1MjY3NzUwOTc5Nzc3LAotICAgIDAuMjIzODExOTM5NDkxMTM3LCAgIDAuNzUxMjY3MDU5MzA1NjUzLCAgIDAuMjU1MDk1MTE1NDU5MjY5LAotICAgIDAuNTA1OTU3MDUxNjY1MTQyLCAgIDAuNjk5MDc2NzIyNjU2Njg2LCAgIDAuODkwOTAzMjUyNTM1Nzk5LAotICAgIDAuOTU5MjkxNDI1MjA1NDQ0LCAgIDAuNTQ3MjE1NTI5OTYzODAzLCAgIDAuMTM4NjI0NDQyODI4Njc5LAotICAgIDAuMTQ5Mjk0MDA1NTU5MDU3LCAgIDAuMjU3NTA4MjU0MTIzNzM2LCAgIDAuODQwNzE3MjU1OTgzNjYzLAotICAgIDAuMjU0MjgyMTc4OTcxNTMxLCAgIDAuODE0Mjg0ODI2MDY4ODE2LCAgIDAuMjQzNTI0OTY4NzI0OTg5LAotICAgIDAuOTI5MjYzNjIzMTg3MjI4LCAgIDAuMzQ5OTgzNzY1OTg0ODA5LCAgIDAuMTk2NTk1MjUwNDMxMjA4LAotICAgIDAuMjUxMDgzODU3OTc2MDMxLCAgIDAuNjE2MDQ0Njc2MTQ2NjM5LCAgIDAuNDczMjg4ODQ4OTAyNzI5OworICBNYXRyaXhYZCBjdHJscyg4LCAzKTsKKyAgY3RybHMgPDwgMC45NTk3NDM5NTg1MTYwODEsIDAuMzQwMzg1NzI2NjY2MTMzLCAwLjU4NTI2Nzc1MDk3OTc3NywgMC4yMjM4MTE5Mzk0OTExMzcsIDAuNzUxMjY3MDU5MzA1NjUzLAorICAgICAgMC4yNTUwOTUxMTU0NTkyNjksIDAuNTA1OTU3MDUxNjY1MTQyLCAwLjY5OTA3NjcyMjY1NjY4NiwgMC44OTA5MDMyNTI1MzU3OTksIDAuOTU5MjkxNDI1MjA1NDQ0LCAwLjU0NzIxNTUyOTk2MzgwMywKKyAgICAgIDAuMTM4NjI0NDQyODI4Njc5LCAwLjE0OTI5NDAwNTU1OTA1NywgMC4yNTc1MDgyNTQxMjM3MzYsIDAuODQwNzE3MjU1OTgzNjYzLCAwLjI1NDI4MjE3ODk3MTUzMSwgMC44MTQyODQ4MjYwNjg4MTYsCisgICAgICAwLjI0MzUyNDk2ODcyNDk4OSwgMC45MjkyNjM2MjMxODcyMjgsIDAuMzQ5OTgzNzY1OTg0ODA5LCAwLjE5NjU5NTI1MDQzMTIwOCwgMC4yNTEwODM4NTc5NzYwMzEsIDAuNjE2MDQ0Njc2MTQ2NjM5LAorICAgICAgMC40NzMyODg4NDg5MDI3Mjk7CiAgIGN0cmxzLnRyYW5zcG9zZUluUGxhY2UoKTsKIAogICByZXR1cm4gU3BsaW5lPGRvdWJsZSwgMywgRHluYW1pYz4oa25vdHMsIGN0cmxzKTsKIH0KIAogLyogY29tcGFyZXMgZXZhbHVhdGlvbnMgYWdhaW5zdCBrbm93biByZXN1bHRzICovCi12b2lkIGV2YWxfc3BsaW5lM2QoKQotewordm9pZCBldmFsX3NwbGluZTNkKCkgewogICBTcGxpbmUzZCBzcGxpbmUgPSBzcGxpbmUzZCgpOwogCiAgIFJvd1ZlY3RvclhkIHUoMTApOwotICB1IDw8IDAuMzUxNjU5NTA3MDYyOTk3LAotICAgIDAuODMwODI4NjI3ODk2MjkxLAotICAgIDAuNTg1MjY0MDkxMTUyNzI0LAotICAgIDAuNTQ5NzIzNjA4MjkxMTQwLAotICAgIDAuOTE3MTkzNjYzODI5ODEwLAotICAgIDAuMjg1ODM5MDE4ODIwMzc0LAotICAgIDAuNzU3MjAwMjI5MTEwNzIxLAotICAgIDAuNzUzNzI5MDk0Mjc4NDk1LAotICAgIDAuMzgwNDQ1ODQ2OTc1MzU3LAotICAgIDAuNTY3ODIxNjQwNzI1MjIxOworICB1IDw8IDAuMzUxNjU5NTA3MDYyOTk3LCAwLjgzMDgyODYyNzg5NjI5MSwgMC41ODUyNjQwOTExNTI3MjQsIDAuNTQ5NzIzNjA4MjkxMTQwLCAwLjkxNzE5MzY2MzgyOTgxMCwgMC4yODU4MzkwMTg4MjAzNzQsCisgICAgICAwLjc1NzIwMDIyOTExMDcyMSwgMC43NTM3MjkwOTQyNzg0OTUsIDAuMzgwNDQ1ODQ2OTc1MzU3LCAwLjU2NzgyMTY0MDcyNTIyMTsKIAotICBNYXRyaXhYZCBwdHMoMTAsMyk7Ci0gIHB0cyA8PCAwLjcwNzYyMDgxMTUzNTkxNiwgICAwLjUxMDI1ODkxMTI0MDgxNSwgICAwLjQxNzQ4NTQzNzAyMzQwOSwKLSAgICAwLjYwMzQyMjI1NjQyNjk3OCwgICAwLjUyOTQ5ODI4MjcyNzU1MSwgICAwLjI3MDM1MTU0OTM0ODk4MSwKLSAgICAwLjIyODM2NDE5NzU2OTMzNCwgICAwLjQyMzc0NTYxNTY3NzgxNSwgICAwLjYzNzY4NzI4OTI4NzQ5MCwKLSAgICAwLjI3NTU1Njc5NjMzNTE2OCwgICAwLjM1MDg1NjcwNjQyNzk3MCwgICAwLjY4NDI5NTc4NDU5ODkwNSwKLSAgICAwLjUxNDUxOTMxMTA0NzY1NSwgICAwLjUyNTA3NzIyNDg5MDc1NCwgICAwLjM1MTYyODMwODMwNTg5NiwKLSAgICAwLjcyNDE1MjkxNDMxNTY2NiwgICAwLjU3NDQ2MTE1NTQ1NzMwNCwgICAwLjQ2OTg2MDI4NTQ4NDA1OCwKLSAgICAwLjUyOTM2NTA2Mzc1MzI4OCwgICAwLjYxMzMyODcwMjY1NjgxNiwgICAwLjIzNzgzNzA0MDE0MTczOSwKLSAgICAwLjUyMjQ2OTM5NTEzNjg3OCwgICAwLjYxOTA5OTY1ODY1Mjg5NSwgICAwLjIzNzEzOTY2NTI0MjA2OSwKLSAgICAwLjY3NzM1NzAyMzg0OTU1MiwgICAwLjQ4MDY1NTc2ODQzNTg1MywgICAwLjQyMjIyNzYxMDMxNDM5NywKLSAgICAwLjI0NzA0NjU5MzE3Mzc1OCwgICAwLjM4MDYwNDY3MjQwNDc1MCwgICAwLjY3MDA2NTc5MTQwNTAxOTsKKyAgTWF0cml4WGQgcHRzKDEwLCAzKTsKKyAgcHRzIDw8IDAuNzA3NjIwODExNTM1OTE2LCAwLjUxMDI1ODkxMTI0MDgxNSwgMC40MTc0ODU0MzcwMjM0MDksIDAuNjAzNDIyMjU2NDI2OTc4LCAwLjUyOTQ5ODI4MjcyNzU1MSwKKyAgICAgIDAuMjcwMzUxNTQ5MzQ4OTgxLCAwLjIyODM2NDE5NzU2OTMzNCwgMC40MjM3NDU2MTU2Nzc4MTUsIDAuNjM3Njg3Mjg5Mjg3NDkwLCAwLjI3NTU1Njc5NjMzNTE2OCwgMC4zNTA4NTY3MDY0Mjc5NzAsCisgICAgICAwLjY4NDI5NTc4NDU5ODkwNSwgMC41MTQ1MTkzMTEwNDc2NTUsIDAuNTI1MDc3MjI0ODkwNzU0LCAwLjM1MTYyODMwODMwNTg5NiwgMC43MjQxNTI5MTQzMTU2NjYsIDAuNTc0NDYxMTU1NDU3MzA0LAorICAgICAgMC40Njk4NjAyODU0ODQwNTgsIDAuNTI5MzY1MDYzNzUzMjg4LCAwLjYxMzMyODcwMjY1NjgxNiwgMC4yMzc4MzcwNDAxNDE3MzksIDAuNTIyNDY5Mzk1MTM2ODc4LCAwLjYxOTA5OTY1ODY1Mjg5NSwKKyAgICAgIDAuMjM3MTM5NjY1MjQyMDY5LCAwLjY3NzM1NzAyMzg0OTU1MiwgMC40ODA2NTU3Njg0MzU4NTMsIDAuNDIyMjI3NjEwMzE0Mzk3LCAwLjI0NzA0NjU5MzE3Mzc1OCwgMC4zODA2MDQ2NzI0MDQ3NTAsCisgICAgICAwLjY3MDA2NTc5MTQwNTAxOTsKICAgcHRzLnRyYW5zcG9zZUluUGxhY2UoKTsKIAotICBmb3IgKGludCBpPTA7IGk8dS5zaXplKCk7ICsraSkKLSAgeworICBmb3IgKGludCBpID0gMDsgaSA8IHUuc2l6ZSgpOyArK2kpIHsKICAgICBWZWN0b3IzZCBwdCA9IHNwbGluZSh1KGkpKTsKLSAgICBWRVJJRlkoIChwdCAtIHB0cy5jb2woaSkpLm5vcm0oKSA8IDFlLTE0ICk7CisgICAgVkVSSUZZKChwdCAtIHB0cy5jb2woaSkpLm5vcm0oKSA8IDFlLTE0KTsKICAgfQogfQogCiAvKiBjb21wYXJlcyBldmFsdWF0aW9ucyBvbiBjb3JuZXIgY2FzZXMgKi8KLXZvaWQgZXZhbF9zcGxpbmUzZF9vbmJya3MoKQotewordm9pZCBldmFsX3NwbGluZTNkX29uYnJrcygpIHsKICAgU3BsaW5lM2Qgc3BsaW5lID0gc3BsaW5lM2QoKTsKIAogICBSb3dWZWN0b3JYZCB1ID0gc3BsaW5lLmtub3RzKCk7CiAKLSAgTWF0cml4WGQgcHRzKDExLDMpOwotICBwdHMgPDwgICAgMC45NTk3NDM5NTg1MTYwODEsICAgMC4zNDAzODU3MjY2NjYxMzMsICAgMC41ODUyNjc3NTA5Nzk3NzcsCi0gICAgMC45NTk3NDM5NTg1MTYwODEsICAgMC4zNDAzODU3MjY2NjYxMzMsICAgMC41ODUyNjc3NTA5Nzk3NzcsCi0gICAgMC45NTk3NDM5NTg1MTYwODEsICAgMC4zNDAzODU3MjY2NjYxMzMsICAgMC41ODUyNjc3NTA5Nzk3NzcsCi0gICAgMC40MzAyODI5ODAyODk5NDAsICAgMC43MTMwNzQ2ODAwNTYxMTgsICAgMC43MjAzNzMzMDc5NDMzNDksCi0gICAgMC41NTgwNzQ4NzU1NTMwNjAsICAgMC42ODE2MTc5MjEwMzQ0NTksICAgMC44MDQ0MTcxMjQ4Mzk5NDIsCi0gICAgMC40MDcwNzYwMDgyOTE3NTAsICAgMC4zNDk3MDc3MTA1MTgxNjMsICAgMC42MTcyNzU5Mzc0MTk1NDUsCi0gICAgMC4yNDAwMzcwMDgyODY2MDIsICAgMC43Mzg3MzkzOTAzOTgwMTQsICAgMC4zMjQ1NTQxNTMxMjk0MTEsCi0gICAgMC4zMDI0MzQxMTE0ODA1NzIsICAgMC43ODExNjI0NDM5NjM4OTksICAgMC4yNDAxNzcwODkwOTQ2NDQsCi0gICAgMC4yNTEwODM4NTc5NzYwMzEsICAgMC42MTYwNDQ2NzYxNDY2MzksICAgMC40NzMyODg4NDg5MDI3MjksCi0gICAgMC4yNTEwODM4NTc5NzYwMzEsICAgMC42MTYwNDQ2NzYxNDY2MzksICAgMC40NzMyODg4NDg5MDI3MjksCi0gICAgMC4yNTEwODM4NTc5NzYwMzEsICAgMC42MTYwNDQ2NzYxNDY2MzksICAgMC40NzMyODg4NDg5MDI3Mjk7CisgIE1hdHJpeFhkIHB0cygxMSwgMyk7CisgIHB0cyA8PCAwLjk1OTc0Mzk1ODUxNjA4MSwgMC4zNDAzODU3MjY2NjYxMzMsIDAuNTg1MjY3NzUwOTc5Nzc3LCAwLjk1OTc0Mzk1ODUxNjA4MSwgMC4zNDAzODU3MjY2NjYxMzMsCisgICAgICAwLjU4NTI2Nzc1MDk3OTc3NywgMC45NTk3NDM5NTg1MTYwODEsIDAuMzQwMzg1NzI2NjY2MTMzLCAwLjU4NTI2Nzc1MDk3OTc3NywgMC40MzAyODI5ODAyODk5NDAsIDAuNzEzMDc0NjgwMDU2MTE4LAorICAgICAgMC43MjAzNzMzMDc5NDMzNDksIDAuNTU4MDc0ODc1NTUzMDYwLCAwLjY4MTYxNzkyMTAzNDQ1OSwgMC44MDQ0MTcxMjQ4Mzk5NDIsIDAuNDA3MDc2MDA4MjkxNzUwLCAwLjM0OTcwNzcxMDUxODE2MywKKyAgICAgIDAuNjE3Mjc1OTM3NDE5NTQ1LCAwLjI0MDAzNzAwODI4NjYwMiwgMC43Mzg3MzkzOTAzOTgwMTQsIDAuMzI0NTU0MTUzMTI5NDExLCAwLjMwMjQzNDExMTQ4MDU3MiwgMC43ODExNjI0NDM5NjM4OTksCisgICAgICAwLjI0MDE3NzA4OTA5NDY0NCwgMC4yNTEwODM4NTc5NzYwMzEsIDAuNjE2MDQ0Njc2MTQ2NjM5LCAwLjQ3MzI4ODg0ODkwMjcyOSwgMC4yNTEwODM4NTc5NzYwMzEsIDAuNjE2MDQ0Njc2MTQ2NjM5LAorICAgICAgMC40NzMyODg4NDg5MDI3MjksIDAuMjUxMDgzODU3OTc2MDMxLCAwLjYxNjA0NDY3NjE0NjYzOSwgMC40NzMyODg4NDg5MDI3Mjk7CiAgIHB0cy50cmFuc3Bvc2VJblBsYWNlKCk7CiAKLSAgZm9yIChpbnQgaT0wOyBpPHUuc2l6ZSgpOyArK2kpCi0gIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1LnNpemUoKTsgKytpKSB7CiAgICAgVmVjdG9yM2QgcHQgPSBzcGxpbmUodShpKSk7Ci0gICAgVkVSSUZZKCAocHQgLSBwdHMuY29sKGkpKS5ub3JtKCkgPCAxZS0xNCApOworICAgIFZFUklGWSgocHQgLSBwdHMuY29sKGkpKS5ub3JtKCkgPCAxZS0xNCk7CiAgIH0KIH0KIAotdm9pZCBldmFsX2Nsb3NlZF9zcGxpbmUyZCgpCi17Cit2b2lkIGV2YWxfY2xvc2VkX3NwbGluZTJkKCkgewogICBTcGxpbmUyZCBzcGxpbmUgPSBjbG9zZWRfc3BsaW5lMmQoKTsKIAogICBSb3dWZWN0b3JYZCB1KDEyKTsKLSAgdSA8PCAwLAotICAgIDAuMzMyNDU3MDMwMzk1Nzk2LAotICAgIDAuMzU2NDY3MTMwNTMyOTUyLAotICAgIDAuNDUzNTYyMTgwMTc2MjE1LAotICAgIDAuNjQ4MDE3OTIxODc0ODA0LAotICAgIDAuOTczNzcwMjM1NTU1MDAzLAotICAgIDEuODgyNTc3NjQ3MjE5MzA3LAotICAgIDIuMjg5NDA4NTkzOTMwNDk4LAotICAgIDMuNTExOTUxNDI5ODgzMDQ1LAotICAgIDMuODg0MTQ5MzIxMzY5NDUwLAotICAgIDQuMjM2MjYxNTkwMzY5NDE0LAotICAgIDQuMjUyNjk5NDc4OTU2Mjc2OworICB1IDw8IDAsIDAuMzMyNDU3MDMwMzk1Nzk2LCAwLjM1NjQ2NzEzMDUzMjk1MiwgMC40NTM1NjIxODAxNzYyMTUsIDAuNjQ4MDE3OTIxODc0ODA0LCAwLjk3Mzc3MDIzNTU1NTAwMywKKyAgICAgIDEuODgyNTc3NjQ3MjE5MzA3LCAyLjI4OTQwODU5MzkzMDQ5OCwgMy41MTE5NTE0Mjk4ODMwNDUsIDMuODg0MTQ5MzIxMzY5NDUwLCA0LjIzNjI2MTU5MDM2OTQxNCwgNC4yNTI2OTk0Nzg5NTYyNzY7CiAKLSAgTWF0cml4WGQgcHRzKDEyLDIpOwotICBwdHMgPDwgLTAuMzcwOTY3NzQxOTM1NDg0LCAgIDAuMjM2ODQyMTA1MjYzMTU4LAotICAgIC0wLjE1MjU3Njc3NTEyMzI1MCwgICAwLjQ0ODk3NTAwMTI3OTMzNCwKLSAgICAtMC4xMzM0MTc1MzgyNzc2NjgsICAgMC40NjE2MTU2MTM4NjU2NjcsCi0gICAgLTAuMDUzMTk5MDYwODI2NzQwLCAgIDAuNTA3NjMwMzYwMDA2Mjk5LAotICAgIDAuMTE0MjQ5NTkxMTQ3MjgxLCAgIDAuNTcwNDE0MTM1MDk3NDA5LAotICAgIDAuMzc3ODEwMzE2ODkxOTg3LCAgIDAuNTYwNDk3MTAyODc1MzE1LAotICAgIDAuNjY1MDUyMTIwMTM1OTA4LCAgLTAuMTU3NTU3NDQxMTA5NjExLAotICAgIDAuNTE2MDA2NDg3MDUzMjI4LCAgLTAuNTU5NzYzMjkyMTc0ODI1LAotICAgIC0wLjM3OTQ4NjAzNTM0ODg4NywgIC0wLjMzMTk1OTY0MDQ4ODIyMywKLSAgICAtMC40NjIwMzQ3MjYyNDkwNzgsICAtMC4wMzkxMDU2NzAwODA4MjQsCi0gICAgLTAuMzc4NzMwNjAwOTE3OTgyLCAgIDAuMjI1MTI3MDE1MDk5OTE5LAotICAgIC0wLjM3MDk2Nzc0MTkzNTQ4NCwgICAwLjIzNjg0MjEwNTI2MzE1ODsKKyAgTWF0cml4WGQgcHRzKDEyLCAyKTsKKyAgcHRzIDw8IC0wLjM3MDk2Nzc0MTkzNTQ4NCwgMC4yMzY4NDIxMDUyNjMxNTgsIC0wLjE1MjU3Njc3NTEyMzI1MCwgMC40NDg5NzUwMDEyNzkzMzQsIC0wLjEzMzQxNzUzODI3NzY2OCwKKyAgICAgIDAuNDYxNjE1NjEzODY1NjY3LCAtMC4wNTMxOTkwNjA4MjY3NDAsIDAuNTA3NjMwMzYwMDA2Mjk5LCAwLjExNDI0OTU5MTE0NzI4MSwgMC41NzA0MTQxMzUwOTc0MDksIDAuMzc3ODEwMzE2ODkxOTg3LAorICAgICAgMC41NjA0OTcxMDI4NzUzMTUsIDAuNjY1MDUyMTIwMTM1OTA4LCAtMC4xNTc1NTc0NDExMDk2MTEsIDAuNTE2MDA2NDg3MDUzMjI4LCAtMC41NTk3NjMyOTIxNzQ4MjUsCisgICAgICAtMC4zNzk0ODYwMzUzNDg4ODcsIC0wLjMzMTk1OTY0MDQ4ODIyMywgLTAuNDYyMDM0NzI2MjQ5MDc4LCAtMC4wMzkxMDU2NzAwODA4MjQsIC0wLjM3ODczMDYwMDkxNzk4MiwKKyAgICAgIDAuMjI1MTI3MDE1MDk5OTE5LCAtMC4zNzA5Njc3NDE5MzU0ODQsIDAuMjM2ODQyMTA1MjYzMTU4OwogICBwdHMudHJhbnNwb3NlSW5QbGFjZSgpOwogCi0gIGZvciAoaW50IGk9MDsgaTx1LnNpemUoKTsgKytpKQotICB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdS5zaXplKCk7ICsraSkgewogICAgIFZlY3RvcjJkIHB0ID0gc3BsaW5lKHUoaSkpOwotICAgIFZFUklGWSggKHB0IC0gcHRzLmNvbChpKSkubm9ybSgpIDwgMWUtMTQgKTsKKyAgICBWRVJJRlkoKHB0IC0gcHRzLmNvbChpKSkubm9ybSgpIDwgMWUtMTQpOwogICB9CiB9CiAKLXZvaWQgY2hlY2tfZ2xvYmFsX2ludGVycG9sYXRpb24yZCgpCi17Cit2b2lkIGNoZWNrX2dsb2JhbF9pbnRlcnBvbGF0aW9uMmQoKSB7CiAgIHR5cGVkZWYgU3BsaW5lMmQ6OlBvaW50VHlwZSBQb2ludFR5cGU7CiAgIHR5cGVkZWYgU3BsaW5lMmQ6Oktub3RWZWN0b3JUeXBlIEtub3RWZWN0b3JUeXBlOwogICB0eXBlZGVmIFNwbGluZTJkOjpDb250cm9sUG9pbnRWZWN0b3JUeXBlIENvbnRyb2xQb2ludFZlY3RvclR5cGU7CiAKLSAgQ29udHJvbFBvaW50VmVjdG9yVHlwZSBwb2ludHMgPSBDb250cm9sUG9pbnRWZWN0b3JUeXBlOjpSYW5kb20oMiwxMDApOworICBDb250cm9sUG9pbnRWZWN0b3JUeXBlIHBvaW50cyA9IENvbnRyb2xQb2ludFZlY3RvclR5cGU6OlJhbmRvbSgyLCAxMDApOwogCi0gIEtub3RWZWN0b3JUeXBlIGNob3JkX2xlbmd0aHM7IC8vIGtub3QgcGFyYW1ldGVycworICBLbm90VmVjdG9yVHlwZSBjaG9yZF9sZW5ndGhzOyAgLy8ga25vdCBwYXJhbWV0ZXJzCiAgIEVpZ2VuOjpDaG9yZExlbmd0aHMocG9pbnRzLCBjaG9yZF9sZW5ndGhzKTsKIAogICAvLyBpbnRlcnBvbGF0aW9uIHdpdGhvdXQga25vdCBwYXJhbWV0ZXJzCiAgIHsKLSAgICBjb25zdCBTcGxpbmUyZCBzcGxpbmUgPSBTcGxpbmVGaXR0aW5nPFNwbGluZTJkPjo6SW50ZXJwb2xhdGUocG9pbnRzLDMpOyAgCisgICAgY29uc3QgU3BsaW5lMmQgc3BsaW5lID0gU3BsaW5lRml0dGluZzxTcGxpbmUyZD46OkludGVycG9sYXRlKHBvaW50cywgMyk7CiAKLSAgICBmb3IgKEVpZ2VuOjpEZW5zZUluZGV4IGk9MDsgaTxwb2ludHMuY29scygpOyArK2kpCi0gICAgewotICAgICAgUG9pbnRUeXBlIHB0ID0gc3BsaW5lKCBjaG9yZF9sZW5ndGhzKGkpICk7CisgICAgZm9yIChFaWdlbjo6RGVuc2VJbmRleCBpID0gMDsgaSA8IHBvaW50cy5jb2xzKCk7ICsraSkgeworICAgICAgUG9pbnRUeXBlIHB0ID0gc3BsaW5lKGNob3JkX2xlbmd0aHMoaSkpOwogICAgICAgUG9pbnRUeXBlIHJlZiA9IHBvaW50cy5jb2woaSk7Ci0gICAgICBWRVJJRlkoIChwdCAtIHJlZikubWF0cml4KCkubm9ybSgpIDwgMWUtMTQgKTsKKyAgICAgIFZFUklGWSgocHQgLSByZWYpLm1hdHJpeCgpLm5vcm0oKSA8IDFlLTE0KTsKICAgICB9CiAgIH0KIAogICAvLyBpbnRlcnBvbGF0aW9uIHdpdGggZ2l2ZW4ga25vdCBwYXJhbWV0ZXJzCiAgIHsKLSAgICBjb25zdCBTcGxpbmUyZCBzcGxpbmUgPSBTcGxpbmVGaXR0aW5nPFNwbGluZTJkPjo6SW50ZXJwb2xhdGUocG9pbnRzLDMsY2hvcmRfbGVuZ3Rocyk7ICAKKyAgICBjb25zdCBTcGxpbmUyZCBzcGxpbmUgPSBTcGxpbmVGaXR0aW5nPFNwbGluZTJkPjo6SW50ZXJwb2xhdGUocG9pbnRzLCAzLCBjaG9yZF9sZW5ndGhzKTsKIAotICAgIGZvciAoRWlnZW46OkRlbnNlSW5kZXggaT0wOyBpPHBvaW50cy5jb2xzKCk7ICsraSkKLSAgICB7Ci0gICAgICBQb2ludFR5cGUgcHQgPSBzcGxpbmUoIGNob3JkX2xlbmd0aHMoaSkgKTsKKyAgICBmb3IgKEVpZ2VuOjpEZW5zZUluZGV4IGkgPSAwOyBpIDwgcG9pbnRzLmNvbHMoKTsgKytpKSB7CisgICAgICBQb2ludFR5cGUgcHQgPSBzcGxpbmUoY2hvcmRfbGVuZ3RocyhpKSk7CiAgICAgICBQb2ludFR5cGUgcmVmID0gcG9pbnRzLmNvbChpKTsKLSAgICAgIFZFUklGWSggKHB0IC0gcmVmKS5tYXRyaXgoKS5ub3JtKCkgPCAxZS0xNCApOworICAgICAgVkVSSUZZKChwdCAtIHJlZikubWF0cml4KCkubm9ybSgpIDwgMWUtMTQpOwogICAgIH0KICAgfQogfQogCi12b2lkIGNoZWNrX2dsb2JhbF9pbnRlcnBvbGF0aW9uX3dpdGhfZGVyaXZhdGl2ZXMyZCgpCi17Cit2b2lkIGNoZWNrX2dsb2JhbF9pbnRlcnBvbGF0aW9uX3dpdGhfZGVyaXZhdGl2ZXMyZCgpIHsKICAgdHlwZWRlZiBTcGxpbmUyZDo6UG9pbnRUeXBlIFBvaW50VHlwZTsKICAgdHlwZWRlZiBTcGxpbmUyZDo6S25vdFZlY3RvclR5cGUgS25vdFZlY3RvclR5cGU7CiAKQEAgLTI1MSwxNCArMTc5LDEyIEBACiAgIEFycmF5WFhkIGRlcml2YXRpdmVzID0gQXJyYXlYWGQ6OlJhbmRvbShkaW1lbnNpb24sIG51bVBvaW50cyk7CiAgIFZlY3RvclhkIGRlcml2YXRpdmVJbmRpY2VzKG51bVBvaW50cyk7CiAKLSAgZm9yIChFaWdlbjo6RGVuc2VJbmRleCBpID0gMDsgaSA8IG51bVBvaW50czsgKytpKQotICAgICAgZGVyaXZhdGl2ZUluZGljZXMoaSkgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGkpOworICBmb3IgKEVpZ2VuOjpEZW5zZUluZGV4IGkgPSAwOyBpIDwgbnVtUG9pbnRzOyArK2kpIGRlcml2YXRpdmVJbmRpY2VzKGkpID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpKTsKIAotICBjb25zdCBTcGxpbmUyZCBzcGxpbmUgPSBTcGxpbmVGaXR0aW5nPFNwbGluZTJkPjo6SW50ZXJwb2xhdGVXaXRoRGVyaXZhdGl2ZXMoCi0gICAgcG9pbnRzLCBkZXJpdmF0aXZlcywgZGVyaXZhdGl2ZUluZGljZXMsIGRlZ3JlZSk7ICAKLSAgICAKLSAgZm9yIChFaWdlbjo6RGVuc2VJbmRleCBpID0gMDsgaSA8IHBvaW50cy5jb2xzKCk7ICsraSkKLSAgeworICBjb25zdCBTcGxpbmUyZCBzcGxpbmUgPQorICAgICAgU3BsaW5lRml0dGluZzxTcGxpbmUyZD46OkludGVycG9sYXRlV2l0aERlcml2YXRpdmVzKHBvaW50cywgZGVyaXZhdGl2ZXMsIGRlcml2YXRpdmVJbmRpY2VzLCBkZWdyZWUpOworCisgIGZvciAoRWlnZW46OkRlbnNlSW5kZXggaSA9IDA7IGkgPCBwb2ludHMuY29scygpOyArK2kpIHsKICAgICBQb2ludFR5cGUgcG9pbnQgPSBzcGxpbmUoa25vdHMoaSkpOwogICAgIFBvaW50VHlwZSByZWZlcmVuY2VQb2ludCA9IHBvaW50cy5jb2woaSk7CiAgICAgVkVSSUZZX0lTX0FQUFJPWChwb2ludCwgcmVmZXJlbmNlUG9pbnQpOwpAQCAtMjY4LDE0ICsxOTQsMTIgQEAKICAgfQogfQogCi1FSUdFTl9ERUNMQVJFX1RFU1Qoc3BsaW5lcykKLXsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3JlcGVhdDsgKytpKQotICB7Ci0gICAgQ0FMTF9TVUJURVNUKCBldmFsX3NwbGluZTNkKCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGV2YWxfc3BsaW5lM2Rfb25icmtzKCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGV2YWxfY2xvc2VkX3NwbGluZTJkKCkgKTsKLSAgICBDQUxMX1NVQlRFU1QoIGNoZWNrX2dsb2JhbF9pbnRlcnBvbGF0aW9uMmQoKSApOwotICAgIENBTExfU1VCVEVTVCggY2hlY2tfZ2xvYmFsX2ludGVycG9sYXRpb25fd2l0aF9kZXJpdmF0aXZlczJkKCkgKTsKK0VJR0VOX0RFQ0xBUkVfVEVTVChzcGxpbmVzKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19yZXBlYXQ7ICsraSkgeworICAgIENBTExfU1VCVEVTVChldmFsX3NwbGluZTNkKCkpOworICAgIENBTExfU1VCVEVTVChldmFsX3NwbGluZTNkX29uYnJrcygpKTsKKyAgICBDQUxMX1NVQlRFU1QoZXZhbF9jbG9zZWRfc3BsaW5lMmQoKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2dsb2JhbF9pbnRlcnBvbGF0aW9uMmQoKSk7CisgICAgQ0FMTF9TVUJURVNUKGNoZWNrX2dsb2JhbF9pbnRlcnBvbGF0aW9uX3dpdGhfZGVyaXZhdGl2ZXMyZCgpKTsKICAgfQogfQo=