ZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgKaW5kZXggMmQ3MzMwZS4uMjdmYzJmOSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgKQEAgLTUxOCw1NCArNTE4LDUxIEBACiBjbGFzcyBDRlhfSW1hZ2VTdHJldGNoZXIKIHsKIHB1YmxpYzoKLQogICAgIENGWF9JbWFnZVN0cmV0Y2hlcigpOwotCiAgICAgfkNGWF9JbWFnZVN0cmV0Y2hlcigpOwogCi0gICAgaW50MzJfdAkJU3RhcnQoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0LCBjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUJiBiaXRtYXBfcmVjdCwgRlhfRFdPUkQgZmxhZ3MpOworICAgIEZYX0JPT0wgU3RhcnQoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0LCBjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCYgYml0bWFwX3JlY3QsCisgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncyk7CiAKKyAgICBGWF9CT09MIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBGWF9CT09MIFN0YXJ0UXVpY2tTdHJldGNoKCk7CisgICAgRlhfQk9PTCBTdGFydFN0cmV0Y2goKTsKKyAgICBGWF9CT09MIENvbnRpbnVlUXVpY2tTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBGWF9CT09MIENvbnRpbnVlU3RyZXRjaChJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBpbnQzMl90CQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgSUZYX1NjYW5saW5lQ29tcG9zZXIqCW1fcERlc3Q7CiAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSoJbV9wU291cmNlOwogICAgIENTdHJldGNoRW5naW5lKgkJbV9wU3RyZXRjaEVuZ2luZTsKICAgICBGWF9EV09SRAkJbV9GbGFnczsKLSAgICBGWF9CT09MCQkJbV9iRmxpcFgsCi0gICAgICAgICAgICAgICAgICAgIG1fYkZsaXBZOwotICAgIGludAkJCQltX0Rlc3RXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgbV9EZXN0SGVpZ2h0OworICAgIEZYX0JPT0wJCQltX2JGbGlwWDsKKyAgICBGWF9CT09MICAgICAgICAgbV9iRmxpcFk7CisgICAgaW50CQkJCW1fRGVzdFdpZHRoOworICAgIGludCAgICAgICAgICAgICBtX0Rlc3RIZWlnaHQ7CiAgICAgRlhfUkVDVAkJCW1fQ2xpcFJlY3Q7CiAgICAgaW50CQkJCW1fTGluZUluZGV4OwogICAgIGludAkJCQltX0Rlc3RCUFA7CiAgICAgdWludDhfdCoJCW1fcFNjYW5saW5lOwogICAgIHVpbnQ4X3QqICAgICAgIG1fcE1hc2tTY2FubGluZTsKICAgICBGWERJQl9Gb3JtYXQJbV9EZXN0Rm9ybWF0OwotCi0gICAgaW50MzJfdAkJU3RhcnRRdWlja1N0cmV0Y2goKTsKLQotICAgIGludDMyX3QJCVN0YXJ0U3RyZXRjaCgpOwotCi0gICAgaW50MzJfdAkJQ29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpOwotCi0gICAgaW50MzJfdAkJQ29udGludWVTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKTsKIH07CiBjbGFzcyBDRlhfSW1hZ2VUcmFuc2Zvcm1lcgogewogcHVibGljOgotCiAgICAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIoKTsKLQogICAgIH5DRlhfSW1hZ2VUcmFuc2Zvcm1lcigpOwogCi0gICAgaW50MzJfdAlTdGFydChjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBpbnQgZmxhZ3MsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwKTsKKyAgICBGWF9CT09MIFN0YXJ0KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwKTsKIAorICAgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgaW50MzJfdAlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAgICAgQ0ZYX0FmZmluZU1hdHJpeCogbV9wTWF0cml4OwogICAgIEZYX1JFQ1QJCW1fU3RyZXRjaENsaXA7Ci0gICAgaW50CQkJbV9SZXN1bHRMZWZ0LCBtX1Jlc3VsdFRvcCwgbV9SZXN1bHRXaWR0aCwgbV9SZXN1bHRIZWlnaHQ7CisgICAgaW50CQkJbV9SZXN1bHRMZWZ0OworICAgIGludAkJCW1fUmVzdWx0VG9wOworICAgIGludAkJCW1fUmVzdWx0V2lkdGg7CisgICAgaW50CQkJbV9SZXN1bHRIZWlnaHQ7CiAgICAgQ0ZYX0FmZmluZU1hdHJpeAltX2Rlc3Qyc3RyZXRjaDsKICAgICBDRlhfSW1hZ2VTdHJldGNoZXIJbV9TdHJldGNoZXI7CiAgICAgQ0ZYX0JpdG1hcFN0b3JlcgltX1N0b3JlcjsKQEAgLTU3NSwxOCArNTcyLDE4IEBACiBjbGFzcyBDRlhfSW1hZ2VSZW5kZXJlcgogewogcHVibGljOgotCiAgICAgQ0ZYX0ltYWdlUmVuZGVyZXIoKTsKLQogICAgIH5DRlhfSW1hZ2VSZW5kZXJlcigpOwogCi0gICAgaW50MzJfdAkJCVN0YXJ0KENGWF9ESUJpdG1hcCogcERldmljZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgaW50IGJpdG1hcF9hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIGRpYl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOworICAgIEZYX0JPT0wgU3RhcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRpYl9mbGFncywgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogCi0gICAgaW50MzJfdAkJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICBGWF9CT09MIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKwogcHJvdGVjdGVkOgogICAgIENGWF9ESUJpdG1hcCoJCW1fcERldmljZTsKICAgICBjb25zdCBDRlhfQ2xpcFJnbioJbV9wQ2xpcFJnbjsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZvbnQuaCBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZvbnQuaAppbmRleCA4YzkxYzQxLi4yODMyZmJmIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9mb250LmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZm9udC5oCkBAIC0zMDAsNyArMzAwLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7CiAKICAgICB2aXJ0dWFsCUZYX0JPT0wJCUVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgRlhfQ0hBUiogZmFjZSwgRlhfQk9PTCYgYkV4YWN0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYWNlLCBpbnQmIGlFeGFjdCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCoJCUdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Rm9udERhdGEodm9pZCogaEZvbnQsIEZYX0RXT1JEIHRhYmxlLCB1aW50OF90KiBidWZmZXIsIEZYX0RXT1JEIHNpemUpID0gMDsKICAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgPSAwOwpAQCAtMzIyLDE1ICszMjIsMjAgQEAKIHB1YmxpYzoKICAgICBDRlhfRm9sZGVyRm9udEluZm8oKTsKICAgICB2aXJ0dWFsIH5DRlhfRm9sZGVyRm9udEluZm8oKTsKLSAgICB2b2lkCQkJCUFkZFBhdGgoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBwYXRoKTsKLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKTsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCUVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcik7Ci0gICAgdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYWNlLCBGWF9CT09MJiBiRXhhY3QpOwotICAgIHZpcnR1YWwgdm9pZCoJCUdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSk7Ci0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsIHVpbnQ4X3QqIGJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSk7Ci0gICAgdmlydHVhbCB2b2lkCQlEZWxldGVGb250KHZvaWQqIGhGb250KTsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCUdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KTsKKyAgICB2b2lkIEFkZFBhdGgoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBwYXRoKTsKKworICAgIC8vIElGWF9TeXRlbUZvbnRJbmZvOgorICAgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIEZYX0JPT0wgRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSBvdmVycmlkZTsKKyAgICB2b2lkKiBNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBmYWNlLCBpbnQmIGJFeGFjdCkgb3ZlcnJpZGU7CisgICAgdm9pZCogR2V0Rm9udChjb25zdCBGWF9DSEFSKiBmYWNlKSBvdmVycmlkZTsKKyAgICBGWF9EV09SRCBHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyLCBGWF9EV09SRCBzaXplKSBvdmVycmlkZTsKKyAgICB2b2lkIERlbGV0ZUZvbnQodm9pZCogaEZvbnQpIG92ZXJyaWRlOworICAgIEZYX0JPT0wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSBvdmVycmlkZTsKKyAgICBGWF9CT09MIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIG92ZXJyaWRlOworCiBwcm90ZWN0ZWQ6CiAgICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX0ZvbnRMaXN0OwogICAgIENGWF9CeXRlU3RyaW5nQXJyYXkJbV9QYXRoTGlzdDsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9pbWFnZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfaW1hZ2UuY3BwCmluZGV4IDJmYmVjYWQuLmRhZDczMjYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9pbWFnZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2ltYWdlLmNwcApAQCAtMTIsNyArMTIsMTEgQEAKICNpbmNsdWRlICIuLi9mcGRmX3JlbmRlci9yZW5kZXJfaW50LmgiCiBDUERGX0RpY3Rpb25hcnkqIENQREZfSW1hZ2U6OkluaXRKUEVHKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKQogewotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgY29sb3JfdHJhbnMsIG51bV9jb21wcywgYml0czsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGludDMyX3QgbnVtX2NvbXBzOworICAgIGludDMyX3QgYml0czsKKyAgICBGWF9CT09MIGNvbG9yX3RyYW5zOwogICAgIGlmICghQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPgogICAgICAgICAgICAgTG9hZEluZm8ocERhdGEsIHNpemUsIHdpZHRoLCBoZWlnaHQsIG51bV9jb21wcywgYml0cywgY29sb3JfdHJhbnMpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9mZGYuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9mZGYuY3BwCmluZGV4IGY2MzBlYTUuLjE5NThmYWIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmRmLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZkZi5jcHAKQEAgLTYyLDcgKzYyLDcgQEAKICAgICAgICAgICAgIGlmICh3b3JkICE9IEZYX0JTVFJDKCJvYmoiKSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwYXJzZXIuR2V0T2JqZWN0KHRoaXMsIG9iam51bSwgMCwgRkFMU0UpOworICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwYXJzZXIuR2V0T2JqZWN0KHRoaXMsIG9iam51bSwgMCwgMCk7CiAgICAgICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHQuY3BwIGIvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0LmNwcAppbmRleCBjNWUwNjRhLi43MjAzYTY5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5jcHAKQEAgLTI2LDEwICsyNiwxMCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhkZWZjaGFyLCAtMSk7CiAgICAgfQotICAgIEZYX0JPT0wgYkRlZiA9IEZBTFNFOwogICAgIGNoYXIgYnVmWzEwXTsKLSAgICBpbnQgcmV0ID0gRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZShkZXN0Y3AsIDAsICh3Y2hhcl90KikmdW5pY29kZSwgMSwgYnVmLCAxMCwgTlVMTCwgJmJEZWYpOwotICAgIGlmIChyZXQgJiYgIWJEZWYpIHsKKyAgICBpbnQgaURlZiA9IDA7CisgICAgaW50IHJldCA9IEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUoZGVzdGNwLCAwLCAod2NoYXJfdCopJnVuaWNvZGUsIDEsIGJ1ZiwgMTAsIE5VTEwsICZpRGVmKTsKKyAgICBpZiAocmV0ICYmICFpRGVmKSB7CiAgICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhidWYsIHJldCk7CiAgICAgfQogICAgIGNvbnN0IEZYX0NIQVIqIGFsdHN0ciA9IEZDU19HZXRBbHRTdHIodW5pY29kZSk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaAppbmRleCA0YzdlYmEwLi43NjY4Zjg0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgKQEAgLTE1Miw3ICsxNTIsNyBAQAogICAgIHZpcnR1YWwgdm9pZAkJRmluaXNoKHZvaWQqIHBDb250ZXh0KTsKICAgICB2aXJ0dWFsIHZvaWQJCUlucHV0KHZvaWQqIHBDb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7CiAgICAgdmlydHVhbCBpbnQJCQlSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBuQ29tcHMpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJU3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpOworICAgIHZpcnR1YWwgaW50CQkJU3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpOwogICAgIHZpcnR1YWwgRlhfQk9PTAkJUmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiBkZXN0X2J1Zik7CiAgICAgdmlydHVhbCBGWF9EV09SRAlHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiogYXZhaWxfYnVmX3B0cik7CiBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwCmluZGV4IDYyMjNiOWMuLmQxMjllMzYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwCkBAIC04NCwxOSArODQsMjEgQEAKIGNsYXNzIENMWldEZWNvZGVyCiB7CiBwdWJsaWM6Ci0gICAgRlhfQk9PTCBEZWNvZGUodWludDhfdCogb3V0cHV0LCBGWF9EV09SRCYgb3V0bGVuLCBjb25zdCB1aW50OF90KiBpbnB1dCwgRlhfRFdPUkQmIHNpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlKTsKKyAgICBpbnQgRGVjb2RlKHVpbnQ4X3QqIG91dHB1dCwgRlhfRFdPUkQmIG91dGxlbiwgY29uc3QgdWludDhfdCogaW5wdXQsIEZYX0RXT1JEJiBzaXplLCBGWF9CT09MIGJFYXJseUNoYW5nZSk7CisKIHByaXZhdGU6CisgICAgdm9pZCBBZGRDb2RlKEZYX0RXT1JEIHByZWZpeF9jb2RlLCB1aW50OF90IGFwcGVuZF9jaGFyKTsKKyAgICB2b2lkIERlY29kZVN0cmluZyhGWF9EV09SRCBjb2RlKTsKKwogICAgIEZYX0RXT1JECW1fSW5Qb3M7CiAgICAgRlhfRFdPUkQJbV9PdXRQb3M7CiAgICAgdWludDhfdCoJbV9wT3V0cHV0OwogICAgIGNvbnN0IHVpbnQ4X3QqCW1fcElucHV0OwogICAgIEZYX0JPT0wJCW1fRWFybHk7Ci0gICAgdm9pZAkJQWRkQ29kZShGWF9EV09SRCBwcmVmaXhfY29kZSwgdWludDhfdCBhcHBlbmRfY2hhcik7CiAgICAgRlhfRFdPUkQJbV9Db2RlQXJyYXlbNTAyMV07CiAgICAgRlhfRFdPUkQJbV9uQ29kZXM7CiAgICAgdWludDhfdAkJbV9EZWNvZGVTdGFja1s0MDAwXTsKICAgICBGWF9EV09SRAltX1N0YWNrTGVuOwotICAgIHZvaWQJCURlY29kZVN0cmluZyhGWF9EV09SRCBjb2RlKTsKICAgICBpbnQJCQltX0NvZGVMZW47CiB9Owogdm9pZCBDTFpXRGVjb2Rlcjo6QWRkQ29kZShGWF9EV09SRCBwcmVmaXhfY29kZSwgdWludDhfdCBhcHBlbmRfY2hhcikKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pwZWcuY3BwCmluZGV4IGI3ZDlmYmUuLjY4MzlkMzEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcGVnLmNwcApAQCAtNjQxLDE0ICs2NDEsMTQgQEAKICAgICAqbkNvbXBzID0gcC0+bV9JbmZvLm51bV9jb21wb25lbnRzOwogICAgIHJldHVybiAwOwogfQotRlhfQk9PTCBDQ29kZWNfSnBlZ01vZHVsZTo6U3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpCitpbnQgQ0NvZGVjX0pwZWdNb2R1bGU6OlN0YXJ0U2NhbmxpbmUodm9pZCogcENvbnRleHQsIGludCBkb3duX3NjYWxlKQogewogICAgIGlmIChtX3BFeHRQcm92aWRlcikgewogICAgICAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPlN0YXJ0U2NhbmxpbmUocENvbnRleHQsIGRvd25fc2NhbGUpOwogICAgIH0KICAgICBGWEpQRUdfQ29udGV4dCogcCA9IChGWEpQRUdfQ29udGV4dCopcENvbnRleHQ7CiAgICAgaWYgKHNldGptcChwLT5tX0p1bXBNYXJrKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBwLT5tX0luZm8uc2NhbGVfZGVub20gPSBkb3duX3NjYWxlOwogICAgIHJldHVybiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJnAtPm1fSW5mbyk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmNwcAppbmRleCBlZDI2ZWM2Li42OGM5NzM1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5jcHAKQEAgLTg3Myw3ICs4NzMsNyBAQAogICAgIHJldHVybiBuUmV0OwogfQogCi1GWF9CT09MIENKQmlnMl9Db250ZXh0OjpwYXJzZVRleHRSZWdpb24oQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50KQoraW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VUZXh0UmVnaW9uKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCkKIHsKICAgICBGWF9EV09SRCBkd1RlbXA7CiAgICAgRlhfV09SRCB3RmxhZ3M7CkBAIC0xMjM5LDcgKzEyMzksNyBAQAogICAgIHJldHVybiBuUmV0OwogfQogCi1GWF9CT09MIENKQmlnMl9Db250ZXh0OjpwYXJzZVBhdHRlcm5EaWN0KENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpCitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVBhdHRlcm5EaWN0KENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpCiB7CiAgICAgRlhfRFdPUkQgZHdUZW1wOwogICAgIHVpbnQ4X3QgY0ZsYWdzOwpAQCAtMTI5Myw3ICsxMjkzLDcgQEAKICAgICBkZWxldGUgcFBERDsKICAgICByZXR1cm4gblJldDsKIH0KLUZYX0JPT0wgQ0pCaWcyX0NvbnRleHQ6OnBhcnNlSGFsZnRvbmVSZWdpb24oQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSkKK2ludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OnBhcnNlSGFsZnRvbmVSZWdpb24oQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSkKIHsKICAgICBGWF9EV09SRCBkd1RlbXA7CiAgICAgdWludDhfdCBjRmxhZ3M7CkBAIC0xMzg3LDcgKzEzODcsNyBAQAogICAgIHJldHVybiBuUmV0OwogfQogCi1GWF9CT09MIENKQmlnMl9Db250ZXh0OjpwYXJzZUdlbmVyaWNSZWdpb24oQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSkKK2ludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OnBhcnNlR2VuZXJpY1JlZ2lvbihDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKQogewogICAgIEZYX0RXT1JEIGR3VGVtcDsKICAgICB1aW50OF90IGNGbGFnczsKQEAgLTE1MDQsNyArMTUwNCw3IEBACiAgICAgcmV0dXJuIG5SZXQ7CiB9CiAKLUZYX0JPT0wgQ0pCaWcyX0NvbnRleHQ6OnBhcnNlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24oQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50KQoraW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VHZW5lcmljUmVmaW5lbWVudFJlZ2lvbihDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQpCiB7CiAgICAgRlhfRFdPUkQgZHdUZW1wOwogICAgIEpCaWcyUmVnaW9uSW5mbyByaTsKQEAgLTE1OTEsNyArMTU5MSw3IEBACiAgICAgZGVsZXRlIHBHUlJEOwogICAgIHJldHVybiBuUmV0OwogfQotRlhfQk9PTCBDSkJpZzJfQ29udGV4dDo6cGFyc2VUYWJsZShDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQpCitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVRhYmxlKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCkKIHsKICAgICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX0hVRkZNQU5fVEFCTEVfUE9JTlRFUjsKICAgICBKQklHMl9BTExPQyhwU2VnbWVudC0+bV9SZXN1bHQuaHQsIENKQmlnMl9IdWZmbWFuVGFibGUobV9wU3RyZWFtKSk7CkBAIC0xNjE4LDkgKzE2MTgsMTUgQEAKICAgICAgICAgRlhfRFdPUkQgU0JOVU1TWU1TKQogewogICAgIEpCaWcySHVmZm1hbkNvZGUgKlNCU1lNQ09ERVM7Ci0gICAgaW50MzJfdCBydW5jb2Rlc1szNV0sIHJ1bmNvZGVzX2xlblszNV0sIHJ1bmNvZGU7Ci0gICAgaW50MzJfdCBpLCBqLCBuVGVtcCwgblZhbCwgbkJpdHM7CisgICAgaW50MzJfdCBydW5jb2Rlc1szNV07CisgICAgaW50MzJfdCBydW5jb2Rlc19sZW5bMzVdOworICAgIGludDMyX3QgcnVuY29kZTsKKyAgICBpbnQzMl90IGk7CisgICAgaW50MzJfdCBqOworICAgIGludDMyX3QgblZhbDsKKyAgICBpbnQzMl90IG5CaXRzOwogICAgIGludDMyX3QgcnVuOworICAgIEZYX0RXT1JEIG5UZW1wOwogICAgIFNCU1lNQ09ERVMgPSAoSkJpZzJIdWZmbWFuQ29kZSopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihKQmlnMkh1ZmZtYW5Db2RlKSwgU0JOVU1TWU1TKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgMzU7IGkgKyspIHsKICAgICAgICAgaWYocFN0cmVhbS0+cmVhZE5CaXRzKDQsICZydW5jb2Rlc19sZW5baV0pICE9IDApIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAKaW5kZXggNjIyZjA0Yi4uY2FiY2Q0YyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAKQEAgLTIxMDEsNyArMjEwMSw3IEBACiAgICAgQ0pCaWcyX0ltYWdlICpJQkk7CiAgICAgRlhfRFdPUkQgV0ksIEhJOwogICAgIGludDMyX3QgSURTOwotICAgIEZYX0JPT0wgUkk7CisgICAgaW50IFJJOwogICAgIGludDMyX3QgUkRXSSwgUkRISSwgUkRYSSwgUkRZSTsKICAgICBDSkJpZzJfSW1hZ2UgKklCT0k7CiAgICAgRlhfRFdPUkQgV09JLCBIT0k7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5EZWNvZGVyLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hbkRlY29kZXIuY3BwCmluZGV4IGRkODIwYWUuLmVmODQ1NDcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hbkRlY29kZXIuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hbkRlY29kZXIuY3BwCkBAIC0xNCw5ICsxNCwxMCBAQAogfQogaW50IENKQmlnMl9IdWZmbWFuRGVjb2Rlcjo6ZGVjb2RlQVZhbHVlKENKQmlnMl9IdWZmbWFuVGFibGUgKnBUYWJsZSwgaW50ICpuUmVzdWx0KQogewotICAgIGludCBuVmFsLCBuVG1wLCBpLCBuQml0czsKLSAgICBuVmFsID0gMDsKLSAgICBuQml0cyA9IDA7CisgICAgaW50IGk7CisgICAgaW50IG5WYWwgPSAwOworICAgIGludCBuQml0cyA9IDA7CisgICAgRlhfRFdPUkQgblRtcDsKICAgICB3aGlsZSgxKSB7CiAgICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZDFCaXQoJm5UbXApID09IC0xKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19nY2MuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfZ2NjLmNwcAppbmRleCBlNDQxNmU5Li4yNDk3Yzc0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19nY2MuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2djYy5jcHAKQEAgLTIwOCw3ICsyMDgsNyBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIGludCBGWFNZU19XaWRlQ2hhclRvTXVsdGlCeXRlKEZYX0RXT1JEIGNvZGVwYWdlLCBGWF9EV09SRCBkd0ZsYWdzLCBjb25zdCBGWF9XQ0hBUiogd3N0ciwgaW50IHdsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSKiBidWYsIGludCBidWZsZW4sIGNvbnN0IEZYX0NIQVIqIGRlZmF1bHRfc3RyLCBGWF9CT09MKiBwVXNlRGVmYXVsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NIQVIqIGJ1ZiwgaW50IGJ1ZmxlbiwgY29uc3QgRlhfQ0hBUiogZGVmYXVsdF9zdHIsIGludCogcFVzZURlZmF1bHQpCiB7CiAgICAgaW50IGxlbiA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3bGVuOyBpICsrKSB7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnRtYXAuY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcAppbmRleCA0Njc0NTg5Li4xNDQyN2E1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnRtYXAuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udG1hcC5jcHAKQEAgLTU5Miw4ICs1OTIsOCBAQAogICAgIGlmIChiTG9jYWxpemVkKSB7CiAgICAgICAgIHZvaWQqIGhGb250ID0gbV9wRm9udEluZm8tPkdldEZvbnQobmFtZSk7CiAgICAgICAgIGlmIChoRm9udCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJFeGFjdDsKLSAgICAgICAgICAgIGhGb250ID0gbV9wRm9udEluZm8tPk1hcEZvbnQoMCwgMCwgRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCwgMCwgbmFtZSwgYkV4YWN0KTsKKyAgICAgICAgICAgIGludCBpRXhhY3Q7CisgICAgICAgICAgICBoRm9udCA9IG1fcEZvbnRJbmZvLT5NYXBGb250KDAsIDAsIEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQsIDAsIG5hbWUsIGlFeGFjdCk7CiAgICAgICAgICAgICBpZiAoaEZvbnQgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTEwNDUsNyArMTA0NSw3IEBACiAgICAgICAgIGJJdGFsaWMgPSBUUlVFOwogICAgIH0KICAgICBGWF9CT09MIGJDSksgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJFeGFjdCA9IEZBTFNFOworICAgIGludCBpRXhhY3QgPSAwOwogICAgIGludCBDaGFyc2V0ID0gRlhGT05UX0FOU0lfQ0hBUlNFVDsKICAgICBpZiAoV2luZG93Q1ApIHsKICAgICAgICAgQ2hhcnNldCA9IF9HZXRDaGFyc2V0RnJvbUNvZGVQYWdlKFdpbmRvd0NQKTsKQEAgLTExMjYsOSArMTEyNiw5IEBACiAgICAgICAgICAgICBiSXRhbGljID0gVFJVRTsKICAgICAgICAgfQogICAgIH0KLSAgICBiRXhhY3QgPSAhbWF0Y2guSXNFbXB0eSgpOwotICAgIHZvaWQqIGhGb250ID0gbV9wRm9udEluZm8tPk1hcEZvbnQod2VpZ2h0LCBiSXRhbGljLCBDaGFyc2V0LCBQaXRjaEZhbWlseSwgZmFtaWx5LCBiRXhhY3QpOwotICAgIGlmIChiRXhhY3QpIHsKKyAgICBpRXhhY3QgPSAhbWF0Y2guSXNFbXB0eSgpOworICAgIHZvaWQqIGhGb250ID0gbV9wRm9udEluZm8tPk1hcEZvbnQod2VpZ2h0LCBiSXRhbGljLCBDaGFyc2V0LCBQaXRjaEZhbWlseSwgZmFtaWx5LCBpRXhhY3QpOworICAgIGlmIChpRXhhY3QpIHsKICAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9FWEFDVDsKICAgICB9CiAgICAgaWYgKGhGb250ID09IE5VTEwpIHsKQEAgLTE0NTEsNyArMTQ1MSw3IEBACiAgICAgfQogICAgIG1fRm9udExpc3QuU2V0QXQoZmFjZW5hbWUsIHBJbmZvKTsKIH0KLXZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIEZYX0JPT0wmIGJFeGFjdCkKK3ZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIGludCYgaUV4YWN0KQogewogICAgIHJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9saW51eC5jcHAgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2xpbnV4LmNwcAppbmRleCA0ZTczMzQ1Li44NjFhZmQyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2xpbnV4LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2xpbnV4LmNwcApAQCAtMzAsNyArMzAsNyBAQAogY2xhc3MgQ0ZYX0xpbnV4Rm9udEluZm8gOiBwdWJsaWMgQ0ZYX0ZvbGRlckZvbnRJbmZvCiB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIEZYX0JPT0wmIGJFeGFjdCk7CisgICAgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBmYW1pbHksIGludCYgaUV4YWN0KSBvdmVycmlkZTsKICAgICBGWF9CT09MCQkJCVBhcnNlRm9udENmZygpOwogICAgIHZvaWQqCQkJCUZpbmRGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgRlhfQk9PTCBiTWF0Y2hOYW1lKTsKIH07CkBAIC03NywxNCArNzcsMTQgQEAKICAgICB9CiAgICAgcmV0dXJuIDI7CiB9Ci12b2lkKiBDRlhfTGludXhGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsIEZYX0JPT0wmIGJFeGFjdCkKK3ZvaWQqIENGWF9MaW51eEZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGNzdHJfZmFjZSwgaW50JiBpRXhhY3QpCiB7CiAgICAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IGNzdHJfZmFjZTsKICAgICBpbnQgaUJhc2VGb250OwogICAgIGZvciAoaUJhc2VGb250ID0gMDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCArKykKICAgICAgICAgaWYgKGZhY2UgPT0gQ0ZYX0J5dGVTdHJpbmdDKEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcE5hbWUpKSB7CiAgICAgICAgICAgICBmYWNlID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wU3Vic3ROYW1lOwotICAgICAgICAgICAgYkV4YWN0ID0gVFJVRTsKKyAgICAgICAgICAgIGlFeGFjdCA9IDE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGlmIChpQmFzZUZvbnQgPCAxMikgewpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZl9zeXNmb250aW5mby5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX3N5c2ZvbnRpbmZvLmNwcAppbmRleCAyNDkwNTVkLi5jZjBjZGQ5IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX3N5c2ZvbnRpbmZvLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmX3N5c2ZvbnRpbmZvLmNwcApAQCAtMjksMTAgKzI5LDEwIEBACiAJCXJldHVybiBGQUxTRTsKIAl9CiAKLQl2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgRlhfQk9PTCYgYkV4YWN0KSAgb3ZlcnJpZGUKKwl2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwgaW50JiBpRXhhY3QpICBvdmVycmlkZQogCXsKIAkJaWYgKG1fcEluZm8tPk1hcEZvbnQpCi0JCQlyZXR1cm4gbV9wSW5mby0+TWFwRm9udChtX3BJbmZvLCB3ZWlnaHQsIGJJdGFsaWMsIGNoYXJzZXQsIHBpdGNoX2ZhbWlseSwgZmFtaWx5LCAmYkV4YWN0KTsKKwkJCXJldHVybiBtX3BJbmZvLT5NYXBGb250KG1fcEluZm8sIHdlaWdodCwgYkl0YWxpYywgY2hhcnNldCwgcGl0Y2hfZmFtaWx5LCBmYW1pbHksICZpRXhhY3QpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX3RyYW5zZm9ybXBhZ2UuY3BwCmluZGV4IDVlZGU2MjYuLmEyOWRiNWEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl90cmFuc2Zvcm1wYWdlLmNwcApAQCAtMzksNyArMzksNyBAQAogfQogCiAKLURMTEVYUE9SVCBGWF9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsIGZsb2F0KiBsZWZ0LCBmbG9hdCogYm90dG9tLCBmbG9hdCogcmlnaHQsIGZsb2F0KiB0b3ApCitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsIGZsb2F0KiBsZWZ0LCBmbG9hdCogYm90dG9tLCBmbG9hdCogcmlnaHQsIGZsb2F0KiB0b3ApCiB7CiAJaWYoIXBhZ2UpCiAJCXJldHVybiBGQUxTRTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuY3BwCmluZGV4IGI4OTY3YzQuLmRhZWNkYmUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmNwcApAQCAtMTA2NiwxMyArMTA2NiwxMyBAQAogICAgICAgICBkVmFsdWUgKz0gRE9VQkxFX0NPUlJFQ1Q7CiAKICAgICBpbnQgaURlYzI7Ci0gICAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKKyAgICBpbnQgaU5lZ2F0aXZlID0gMDsKIAotICAgIHN0clZhbHVlID0gZmN2dChkVmFsdWUsaURlYywmaURlYzIsJmJOZWdhdGl2ZSk7CisgICAgc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmaU5lZ2F0aXZlKTsKICAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQogICAgIHsKICAgICAgICAgZFZhbHVlID0gMDsKLSAgICAgICAgc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5lZ2F0aXZlKTsKKyAgICAgICAgc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmaU5lZ2F0aXZlKTsKICAgICAgICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKICAgICAgICAgewogICAgICAgICAgICAgc3RyVmFsdWUgPSAiMCI7CkBAIC0xMTUwLDcgKzExNTAsNyBAQAogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vZm9yIHByb2Nlc3NpbmcgbmVnYXRpdmUgc3R5bGUKLSAgICBpZiAoYk5lZ2F0aXZlKQorICAgIGlmIChpTmVnYXRpdmUpCiAgICAgewogICAgICAgICBpZiAoaU5lZ1N0eWxlID09IDApCiAgICAgICAgIHsKQEAgLTEzOTMsMTIgKzEzOTMsMTIgQEAKICAgICAgICAgZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOy8v0KPV/QogCiAgICAgaW50IGlEZWMyOwotICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7Ci0gICAgc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5lZ2F0aXZlKTsKKyAgICBpbnQgaU5lZ2F0aXZlID0gMDsKKyAgICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOwogICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCiAgICAgewogICAgICAgICBkVmFsdWUgPSAwOwotICAgICAgICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLGlEZWMsJmlEZWMyLCZiTmVnYXRpdmUpOworICAgICAgICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOwogICAgIH0KIAogICAgIGlmIChpRGVjMiA8IDApCkBAIC0xNDU2LDcgKzE0NTYsNyBAQAogICAgIH0KICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vbmVnYXRpdmUgbWFyawotICAgIGlmKGJOZWdhdGl2ZSkKKyAgICBpZiAoaU5lZ2F0aXZlKQogICAgICAgICBzdHJWYWx1ZSA9ICItIiArIHN0clZhbHVlOwogICAgIHN0clZhbHVlICs9ICIlIjsKICAgICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOwpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfc3lzZm9udGluZm8uaCBiL3B1YmxpYy9mcGRmX3N5c2ZvbnRpbmZvLmgKaW5kZXggZGJhZGI4OS4uNjE0NjVmNCAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfc3lzZm9udGluZm8uaAorKysgYi9wdWJsaWMvZnBkZl9zeXNmb250aW5mby5oCkBAIC05NCwxMyArOTQsMTMgQEAKICAgICAgKiAgICAgICAgICBjaGFyc2V0ICAgICAtICAgQ2hhcmFjdGVyIHNldCBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIGZvbnQuIFNlZSBhYm92ZSBkZWZpbmVkIGNvbnN0YW50cy4KICAgICAgKiAgICAgICAgICBwaXRjaF9mYW1pbHkgLSAgQSBjb21iaW5hdGlvbiBvZiBmbGFncy4gU2VlIGFib3ZlIGRlZmluZWQgY29uc3RhbnRzLgogICAgICAqICAgICAgICAgIGZhY2UgICAgICAgIC0gICBUeXBlZmFjZSBuYW1lLiBDdXJyZW50bHkgdXNlIHN5c3RlbSBsb2NhbCBlbmNvZGluZyBvbmx5LgotICAgICAqICAgICAgICAgIGJFeGFjdCAgICAgIC0gICBQb2ludGVyIHRvIGFuIGJvb2xlYW4gdmFsdWUgcmVjZWl2aW5nIHRoZSBpbmRpY2F0b3Igd2hldGhlciBtYXBwZXIgZm91bmQgdGhlIGV4YWN0IG1hdGNoLgorICAgICAqICAgICAgICAgIGJFeGFjdCAgICAgIC0gICBQb2ludGVyIHRvIGEgYm9vbGVhbiB2YWx1ZSByZWNlaXZpbmcgdGhlIGluZGljYXRvciB3aGV0aGVyIG1hcHBlciBmb3VuZCB0aGUgZXhhY3QgbWF0Y2guCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIElmIG1hcHBlciBpcyBub3Qgc3VyZSB3aGV0aGVyIGl0J3MgZXhhY3QgbWF0Y2gsIGlnbm9yZSB0aGlzIHBhcmFtdGVyLgogICAgICAqIFJldHVybiBWYWx1ZToKICAgICAgKiAgICAgICAgICBBbiBvcGFxdWUgcG9pbnRlciBmb3IgZm9udCBoYW5kbGUsIG9yIE5VTEwgaWYgc3lzdGVtIG1hcHBpbmcgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKiovCi0gICAgdm9pZCogKCpNYXBGb250KShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCBpbnQgd2VpZ2h0LCBpbnQgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYWNlLCBpbnQqIGJFeGFjdCk7CisgICAgdm9pZCogKCpNYXBGb250KShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCBpbnQgd2VpZ2h0LCBGUERGX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYWNlLCBGUERGX0JPT0wqIGJFeGFjdCk7CiAKICAgICAvKioKICAgICAgKiBNZXRob2Q6IEdldEZvbnQK