ZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCA5OTNjOWU5Li5kN2ZlNmY5IDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC0zMDkxLDEyICszMDkxLDYgQEAKIE9QRU5HTEZJTEVTPSIiCiAKIE9QRU5HTDMyX0RMTD0iIgotCi1ER0FfU1JDUz0iIgotCi1ER0EyX1NSQ1M9IiIKLQotTUVTQV9TUkNTPSIiCiBpZiB0ZXN0ICIkaGF2ZV94IiA9ICJ5ZXMiCiB0aGVuCiAgICAgWExJQj0iLWxYZXh0IC1sWDExIgpAQCAtMzEwNywxNyArMzEwMSwxNyBAQAogZG8KIGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxMTE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozMTA1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzExNiAiY29uZmlndXJlIgorI2xpbmUgMzExMCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8JGFjX2hkcj4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEyMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzExNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTMxMzgsNyArMzEzMiw3IEBACiAjZGVmaW5lICRhY190cl9oZHIgMQogRU9GCiAgICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFhwbUNyZWF0ZVBpeG1hcEZyb21EYXRhIGluIC1sWHBtIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTQyOiBjaGVja2luZyBmb3IgWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGEgaW4gLWxYcG0iID4mNQorZWNobyAiY29uZmlndXJlOjMxMzY6IGNoZWNraW5nIGZvciBYcG1DcmVhdGVQaXhtYXBGcm9tRGF0YSBpbiAtbFhwbSIgPiY1CiBhY19saWJfdmFyPWBlY2hvIFhwbSdfJ1hwbUNyZWF0ZVBpeG1hcEZyb21EYXRhIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0zMTQ3LDcgKzMxNDEsNyBAQAogTElCUz0iLWxYcG0gJFhfTElCUyAtbFhleHQgLWxYMTEgJFhfRVhUUkFfTElCUwogICAgICAgICAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTUxICJjb25maWd1cmUiCisjbGluZSAzMTQ1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0zMTU4LDcgKzMxNTIsNyBAQAogWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGEoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMzIwMywxNyArMzE5NywxNyBAQAogZG8KIGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMDc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozMjAxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIxMiAiY29uZmlndXJlIgorI2xpbmUgMzIwNiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8JGFjX2hkcj4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIxNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzIxMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTMyMzgsMTcgKzMyMzIsMTcgQEAKIGRvCiBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjQyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitlY2hvICJjb25maWd1cmU6MzIzNjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNDcgImNvbmZpZ3VyZSIKKyNsaW5lIDMyNDEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPCRhY19oZHI+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMyNTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjMyNDY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC0zMjY5LDcgKzMyNjMsNyBAQAogI2RlZmluZSAkYWNfdHJfaGRyIDEKIEVPRgogICAgICAgICAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYa2JRdWVyeUV4dGVuc2lvbiBpbiAtbFgxMSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI3MzogY2hlY2tpbmcgZm9yIFhrYlF1ZXJ5RXh0ZW5zaW9uIGluIC1sWDExIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozMjY3OiBjaGVja2luZyBmb3IgWGtiUXVlcnlFeHRlbnNpb24gaW4gLWxYMTEiID4mNQogYWNfbGliX3Zhcj1gZWNobyBYMTEnXydYa2JRdWVyeUV4dGVuc2lvbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMzI3Nyw3ICszMjcxLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sWDExICRYX0xJQlMgLWxYZXh0IC1sWDExICRYX0VYVFJBX0xJQlMgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjgxICJjb25maWd1cmUiCisjbGluZSAzMjc1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0zMjg4LDcgKzMyODIsNyBAQAogWGtiUXVlcnlFeHRlbnNpb24oKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyOTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjg2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMzMyNCwxNyArMzMxOCwxNyBAQAogZG8KIGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMjg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozMzIyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzMzMyAiY29uZmlndXJlIgorI2xpbmUgMzMyNyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8JGFjX2hkcj4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzMzMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTMzNTUsNyArMzM0OSw3IEBACiAjZGVmaW5lICRhY190cl9oZHIgMQogRU9GCiAgICAgICAgICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFhTaG1RdWVyeUV4dGVuc2lvbiBpbiAtbFhleHQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzNTk6IGNoZWNraW5nIGZvciBYU2htUXVlcnlFeHRlbnNpb24gaW4gLWxYZXh0IiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozMzUzOiBjaGVja2luZyBmb3IgWFNobVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWGV4dCIgPiY1CiBhY19saWJfdmFyPWBlY2hvIFhleHQnXydYU2htUXVlcnlFeHRlbnNpb24gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTMzNjMsNyArMzM1Nyw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbFhleHQgJFhfTElCUyAtbFhleHQgLWxYMTEgJFhfRVhUUkFfTElCUyAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzNjcgImNvbmZpZ3VyZSIKKyNsaW5lIDMzNjEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTMzNzQsNyArMzM2OCw3IEBACiBYU2htUXVlcnlFeHRlbnNpb24oKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzcyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMzQxMCwxNyArMzQwNCwxNyBAQAogZG8KIGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MTQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozNDA4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQxOSAiY29uZmlndXJlIgorI2xpbmUgMzQxMyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8JGFjX2hkcj4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQyNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzQxODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTM0NDEsNyArMzQzNSw3IEBACiAjZGVmaW5lICRhY190cl9oZHIgMQogRU9GCiAgICAgICAgICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFhTaGFwZVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWGV4dCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ0NTogY2hlY2tpbmcgZm9yIFhTaGFwZVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWGV4dCIgPiY1CitlY2hvICJjb25maWd1cmU6MzQzOTogY2hlY2tpbmcgZm9yIFhTaGFwZVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWGV4dCIgPiY1CiBhY19saWJfdmFyPWBlY2hvIFhleHQnXydYU2hhcGVRdWVyeUV4dGVuc2lvbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMzQ0OSw3ICszNDQzLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sWGV4dCAkWF9MSUJTIC1sWGV4dCAtbFgxMSAkWF9FWFRSQV9MSUJTICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQ1MyAiY29uZmlndXJlIgorI2xpbmUgMzQ0NyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMzQ2MCw3ICszNDU0LDcgQEAKIFhTaGFwZVF1ZXJ5RXh0ZW5zaW9uKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDY0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTM0OTYsMTcgKzM0OTAsMTcgQEAKIGRvCiBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTAwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitlY2hvICJjb25maWd1cmU6MzQ5NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MDUgImNvbmZpZ3VyZSIKKyNsaW5lIDM0OTkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPCRhY19oZHI+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM1MTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MDQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC0zNTI3LDcgKzM1MjEsNyBAQAogI2RlZmluZSAkYWNfdHJfaGRyIDEKIEVPRgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFhER0FRdWVyeUV4dGVuc2lvbiBpbiAtbFh4Zjg2ZGdhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTMxOiBjaGVja2luZyBmb3IgWERHQVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWHhmODZkZ2EiID4mNQorZWNobyAiY29uZmlndXJlOjM1MjU6IGNoZWNraW5nIGZvciBYREdBUXVlcnlFeHRlbnNpb24gaW4gLWxYeGY4NmRnYSIgPiY1CiBhY19saWJfdmFyPWBlY2hvIFh4Zjg2ZGdhJ18nWERHQVF1ZXJ5RXh0ZW5zaW9uIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0zNTM2LDcgKzM1MzAsNyBAQAogTElCUz0iLWxYeGY4NmRnYSAkWF9MSUJTIC1sWGV4dCAtbFgxMSAkWF9FWFRSQV9MSUJTCiAgICAgICAgICAgICAgICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1NDAgImNvbmZpZ3VyZSIKKyNsaW5lIDM1MzQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTM1NDcsNyArMzU0MSw3IEBACiBYREdBUXVlcnlFeHRlbnNpb24oKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1NTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTQ1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMzU3MSwxMyArMzU2NSwxMSBAQAogRU9GCiAKICAgICAgICAgICAgICAgICAgIFhfUFJFX0xJQlM9IiRYX1BSRV9MSUJTIC1sWHhmODZkZ2EiCi0gICAgICAgICAgICAgICAgICBER0FfU1JDUz0nJChER0FfU1JDUyknCi0gICAgICAgICAgICAgICAgICBER0EyX1NSQ1M9JyQoREdBMl9TUkNTKScKICAgICAgICAgICAgICAgIAogZWxzZQogICBlY2hvICIkYWNfdCIibm8iIDE+JjYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWHhmODZkZ2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1ODE6IGNoZWNraW5nIGZvciBYRjg2REdBUXVlcnlFeHRlbnNpb24gaW4gLWxYeGY4NmRnYSIgPiY1CitlY2hvICJjb25maWd1cmU6MzU3MzogY2hlY2tpbmcgZm9yIFhGODZER0FRdWVyeUV4dGVuc2lvbiBpbiAtbFh4Zjg2ZGdhIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gWHhmODZkZ2EnXydYRjg2REdBUXVlcnlFeHRlbnNpb24gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTM1ODYsNyArMzU3OCw3IEBACiBMSUJTPSItbFh4Zjg2ZGdhICRYX0xJQlMgLWxYZXh0IC1sWDExICRYX0VYVFJBX0xJQlMKICAgICAgICAgICAgICAgICAgICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1OTAgImNvbmZpZ3VyZSIKKyNsaW5lIDM1ODIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTM1OTcsNyArMzU4OSw3IEBACiBYRjg2REdBUXVlcnlFeHRlbnNpb24oKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTkzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMzYxNyw3ICszNjA5LDYgQEAKIEVPRgogCiAgICAgICAgICAgICAgICAgICAgICAgWF9QUkVfTElCUz0iJFhfUFJFX0xJQlMgLWxYeGY4NmRnYSIKLSAgICAgICAgICAgICAgICAgICAgICBER0FfU1JDUz0nJChER0FfU1JDUyknCiAgICAgICAgICAgICAgICAgICAgIAogZWxzZQogICBlY2hvICIkYWNfdCIibm8iIDE+JjYKQEAgLTM2MzksMTcgKzM2MzAsMTcgQEAKIGRvCiBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjQzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitlY2hvICJjb25maWd1cmU6MzYzNDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2NDggImNvbmZpZ3VyZSIKKyNsaW5lIDM2MzkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPCRhY19oZHI+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM2NTM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NDQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC0zNjcwLDcgKzM2NjEsNyBAQAogI2RlZmluZSAkYWNfdHJfaGRyIDEKIEVPRgogICAgICAgICAgICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFhGODZWaWRNb2RlUXVlcnlFeHRlbnNpb24gaW4gLWxYeGY4NnZtIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjc0OiBjaGVja2luZyBmb3IgWEY4NlZpZE1vZGVRdWVyeUV4dGVuc2lvbiBpbiAtbFh4Zjg2dm0iID4mNQorZWNobyAiY29uZmlndXJlOjM2NjU6IGNoZWNraW5nIGZvciBYRjg2VmlkTW9kZVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWHhmODZ2bSIgPiY1CiBhY19saWJfdmFyPWBlY2hvIFh4Zjg2dm0nXydYRjg2VmlkTW9kZVF1ZXJ5RXh0ZW5zaW9uIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0zNjc5LDcgKzM2NzAsNyBAQAogTElCUz0iLWxYeGY4NnZtICRYX0xJQlMgLWxYZXh0IC1sWDExICRYX0VYVFJBX0xJQlMKICAgICAgICAgICAgICAgICAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjgzICJjb25maWd1cmUiCisjbGluZSAzNjc0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0zNjkwLDcgKzM2ODEsNyBAQAogWEY4NlZpZE1vZGVRdWVyeUV4dGVuc2lvbigpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2ODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0zNzI4LDE3ICszNzE5LDE3IEBACiBkbwogYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzczMjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQorZWNobyAiY29uZmlndXJlOjM3MjM6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNzM3ICJjb25maWd1cmUiCisjbGluZSAzNzI4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkYWNfaGRyPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzQyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzMzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtMzc1OSw3ICszNzUwLDcgQEAKICNkZWZpbmUgJGFjX3RyX2hkciAxCiBFT0YKICAgICAgICAgICAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYdlNobUNyZWF0ZUltYWdlIGluIC1sWHYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3NjM6IGNoZWNraW5nIGZvciBYdlNobUNyZWF0ZUltYWdlIGluIC1sWHYiID4mNQorZWNobyAiY29uZmlndXJlOjM3NTQ6IGNoZWNraW5nIGZvciBYdlNobUNyZWF0ZUltYWdlIGluIC1sWHYiID4mNQogYWNfbGliX3Zhcj1gZWNobyBYdidfJ1h2U2htQ3JlYXRlSW1hZ2UgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTM3NjgsNyArMzc1OSw3IEBACiBMSUJTPSItbFh2ICRYX0xJQlMgLWxYZXh0IC1sWDExICRYX0VYVFJBX0xJQlMKICAgICAgICAgICAgICAgICAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNzcyICJjb25maWd1cmUiCisjbGluZSAzNzYzICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0zNzc5LDcgKzM3NzAsNyBAQAogWHZTaG1DcmVhdGVJbWFnZSgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc4MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3NzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0zODI2LDE3ICszODE3LDE3IEBACiBkbwogYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzgzMDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQorZWNobyAiY29uZmlndXJlOjM4MjE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzODM1ICJjb25maWd1cmUiCisjbGluZSAzODI2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkYWNfaGRyPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODQwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODMxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtMzg2NSwxOSArMzg1NiwxOSBAQAogCWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfR0xfZ2xfaCIgPSAieWVzIiAtYSAiJGFjX2N2X2hlYWRlcl9HTF9nbHhfaCIgPSAieWVzIgogCXRoZW4KIAkgICAgCSAgICBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIHVwLXRvLWRhdGUgT3BlbkdMIHZlcnNpb24iIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODY5OiBjaGVja2luZyAiZm9yIHVwLXRvLWRhdGUgT3BlbkdMIHZlcnNpb24iIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozODYwOiBjaGVja2luZyAiZm9yIHVwLXRvLWRhdGUgT3BlbkdMIHZlcnNpb24iIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd3aW5lX2N2X29wZW5nbF92ZXJzaW9uX09LJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzg3NCAiY29uZmlndXJlIgorI2xpbmUgMzg2NSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8R0wvZ2wuaD4KIGludCBtYWluKCkgewogR0xlbnVtIHRlc3QgPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTsKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODgxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4NzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICB3aW5lX2N2X29wZW5nbF92ZXJzaW9uX09LPSJ5ZXMiCiBlbHNlCkBAIC0zODk0LDIxICszODg1LDIxIEBACiBlY2hvICIkYWNfdCIiJHdpbmVfY3Zfb3BlbmdsX3ZlcnNpb25fT0siIDE+JjYKIAogCSAgICAJICAgIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgdGhyZWFkLXNhZmUgT3BlbkdMIHZlcnNpb24iIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODk4OiBjaGVja2luZyAiZm9yIHRocmVhZC1zYWZlIE9wZW5HTCB2ZXJzaW9uIiIgPiY1CitlY2hvICJjb25maWd1cmU6Mzg4OTogY2hlY2tpbmcgImZvciB0aHJlYWQtc2FmZSBPcGVuR0wgdmVyc2lvbiIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3Zfb3BlbmdsX3ZlcnNpb25fdGhyZWFkc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIHNhdmVkX2xpYnM9JExJQlMKIAkgICAgICAgTElCUz0iJFhfTElCUyAtbEdMIgogCSAgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTA1ICJjb25maWd1cmUiCisjbGluZSAzODk2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CiBwdGhyZWFkX2dldHNwZWNpZmljKCk7CiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzkxMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5MDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIHdpbmVfY3Zfb3BlbmdsX3ZlcnNpb25fdGhyZWFkc2FmZT0ieWVzIgogZWxzZQpAQCAtMzkyNyw3ICszOTE4LDcgQEAKIAkgICAgaWYgdGVzdCAiJHdpbmVfY3Zfb3BlbmdsX3ZlcnNpb25fT0siID0gInllcyIgLWEgXCggIiR3aW5lX2N2X29wZW5nbF92ZXJzaW9uX3RocmVhZHNhZmUiID0gIm5vIiAtbyAkT1BFTkdMID0gInllcyIgXCkKICAgICAgICAgICAgIHRoZW4KIAkJCQllY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2xYQ3JlYXRlQ29udGV4dCBpbiAtbEdMIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTMxOiBjaGVja2luZyBmb3IgZ2xYQ3JlYXRlQ29udGV4dCBpbiAtbEdMIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozOTIyOiBjaGVja2luZyBmb3IgZ2xYQ3JlYXRlQ29udGV4dCBpbiAtbEdMIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gR0wnXydnbFhDcmVhdGVDb250ZXh0IHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0zOTM1LDcgKzM5MjYsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxHTCAkWF9MSUJTIC1sWGV4dCAtbFgxMSAtbG0gJFhfRVhUUkFfTElCUyAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5MzkgImNvbmZpZ3VyZSIKKyNsaW5lIDM5MzAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTM5NDYsNyArMzkzNyw3IEBACiBnbFhDcmVhdGVDb250ZXh0KCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk0MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTM5NjIsNyArMzk1Myw2IEBACiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgogICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CiAgIFhfUFJFX0xJQlM9IiRYX1BSRV9MSUJTIC1sR0wiCi0JCQkgICAgIE1FU0FfU1JDUz0nJChNRVNBX1NSQ1MpJwogCQkJICAgICAKIGVsc2UKICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CkBAIC0zOTc5LDcgKzM5NjksNyBAQAogCiAKIAkJCWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnbFhHZXRQcm9jQWRkcmVzc0FSQiBpbiAtbEdMIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTgzOiBjaGVja2luZyBmb3IgZ2xYR2V0UHJvY0FkZHJlc3NBUkIgaW4gLWxHTCIgPiY1CitlY2hvICJjb25maWd1cmU6Mzk3MzogY2hlY2tpbmcgZm9yIGdsWEdldFByb2NBZGRyZXNzQVJCIGluIC1sR0wiID4mNQogYWNfbGliX3Zhcj1gZWNobyBHTCdfJ2dsWEdldFByb2NBZGRyZXNzQVJCIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0zOTg3LDcgKzM5NzcsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxHTCAkWF9MSUJTIC1sWGV4dCAtbFgxMSAtbG0gJFhfRVhUUkFfTElCUyAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5OTEgImNvbmZpZ3VyZSIKKyNsaW5lIDM5ODEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTM5OTgsNyArMzk4OCw3IEBACiBnbFhHZXRQcm9jQWRkcmVzc0FSQigpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDAwMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5OTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC00MDI1LDEyICs0MDE1LDEyIEBACiAJCQlpZiB0ZXN0ICRhY19jdl9saWJfR0xfZ2xYR2V0UHJvY0FkZHJlc3NBUkIgPSAieWVzIgogCQkJdGhlbgogCQkJICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgT3BlbkdMIGV4dGVuc2lvbiBmdW5jdGlvbnMgcHJvdG90eXBlcyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMjk6IGNoZWNraW5nICJmb3IgT3BlbkdMIGV4dGVuc2lvbiBmdW5jdGlvbnMgcHJvdG90eXBlcyIiID4mNQorZWNobyAiY29uZmlndXJlOjQwMTk6IGNoZWNraW5nICJmb3IgT3BlbkdMIGV4dGVuc2lvbiBmdW5jdGlvbnMgcHJvdG90eXBlcyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3ZfZXh0ZW5zaW9uX3Byb3RvdHlwZXMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDM0ICJjb25maWd1cmUiCisjbGluZSA0MDI0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxHTC9nbC5oPgogCQkJCSAgCQkgICNpZmRlZiBIQVZFX0dMX0dMRVhUX0gKQEAgLTQwNDEsNyArNDAzMSw3IEBACiBQRk5HTENPTE9SVEFCTEVFWFRQUk9DIHRlc3RfcHJvYzsKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDQ1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQwMzU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICB3aW5lX2N2X2V4dGVuc2lvbl9wcm90b3R5cGVzPSJ5ZXMiCiBlbHNlCkBAIC00MDY2LDYgKzQwNTYsMTM4IEBACiAKIAkJCQlPUEVOR0wzMl9ETEw9b3BlbmdsMzIKIAkJCWZpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhY19oZHIgaW4gR0wvb3NtZXNhLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MDY1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDA3MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NDA3NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBPU01lc2FDcmVhdGVDb250ZXh0IGluIC1sR0wiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQwOTY6IGNoZWNraW5nIGZvciBPU01lc2FDcmVhdGVDb250ZXh0IGluIC1sR0wiID4mNQorYWNfbGliX3Zhcj1gZWNobyBHTCdfJ09TTWVzYUNyZWF0ZUNvbnRleHQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sR0wgJFhfTElCUyAtbFhleHQgLWxYMTEgJFhfRVhUUkFfTElCUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MTA1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgT1NNZXNhQ3JlYXRlQ29udGV4dCgpOworCitpbnQgbWFpbigpIHsKK09TTWVzYUNyZWF0ZUNvbnRleHQoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxMTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX09TTUVTQSAxCitFT0YKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBPU01lc2FDcmVhdGVDb250ZXh0IGluIC1sT1NNZXNhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MTM4OiBjaGVja2luZyBmb3IgT1NNZXNhQ3JlYXRlQ29udGV4dCBpbiAtbE9TTWVzYSIgPiY1CithY19saWJfdmFyPWBlY2hvIE9TTWVzYSdfJ09TTWVzYUNyZWF0ZUNvbnRleHQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sT1NNZXNhICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQxNDYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBPU01lc2FDcmVhdGVDb250ZXh0KCk7CisKK2ludCBtYWluKCkgeworT1NNZXNhQ3JlYXRlQ29udGV4dCgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX09TTUVTQSAxCitFT0YKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWF9QUkVfTElCUz0iJFhfUFJFX0xJQlMgLWxPU01lc2EiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZmkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTogd2FybmluZzogT1NNZXNhIG5vdCBmb3VuZCEhIiAxPiYyCisgICAgICAgICAgICAgICAgICAgICAgICAKK2ZpCitkb25lCisKIAkJZmkKIAkgICAgIGZpCiAJIGZpCkBAIC00MDg2LDE3ICs0MjA4LDE3IEBACiBkbwogYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA5MDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQorZWNobyAiY29uZmlndXJlOjQyMTI6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MDk1ICJjb25maWd1cmUiCisjbGluZSA0MjE3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkYWNfaGRyPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTAwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjIyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtNDEyNSw3ICs0MjQ3LDcgQEAKICAgICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX25jdXJzZXNfaCIgPSAieWVzIgogICAgIHRoZW4gCiAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3YWRkY2ggaW4gLWxuY3Vyc2VzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTI5OiBjaGVja2luZyBmb3Igd2FkZGNoIGluIC1sbmN1cnNlcyIgPiY1CitlY2hvICJjb25maWd1cmU6NDI1MTogY2hlY2tpbmcgZm9yIHdhZGRjaCBpbiAtbG5jdXJzZXMiID4mNQogYWNfbGliX3Zhcj1gZWNobyBuY3Vyc2VzJ18nd2FkZGNoIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC00MTMzLDcgKzQyNTUsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxuY3Vyc2VzICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQxMzcgImNvbmZpZ3VyZSIKKyNsaW5lIDQyNTkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTQxNDQsNyArNDI2Niw3IEBACiB3YWRkY2goKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxNDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtNDE3NSw3ICs0Mjk3LDcgQEAKICAgICBpZiB0ZXN0ICIkYWNfY3ZfbGliX25jdXJzZXNfd2FkZGNoIiA9ICJ5ZXMiCiAgICAgdGhlbgogICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcmVzaXpldGVybSBpbiAtbG5jdXJzZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxNzk6IGNoZWNraW5nIGZvciByZXNpemV0ZXJtIGluIC1sbmN1cnNlcyIgPiY1CitlY2hvICJjb25maWd1cmU6NDMwMTogY2hlY2tpbmcgZm9yIHJlc2l6ZXRlcm0gaW4gLWxuY3Vyc2VzIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gbmN1cnNlcydfJ3Jlc2l6ZXRlcm0gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTQxODMsNyArNDMwNSw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbG5jdXJzZXMgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDE4NyAiY29uZmlndXJlIgorI2xpbmUgNDMwOSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtNDE5NCw3ICs0MzE2LDcgQEAKIHJlc2l6ZXRlcm0oKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxOTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzIwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtNDIxOCw3ICs0MzQwLDcgQEAKIGZpCiAKICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGJrZ2QgaW4gLWxuY3Vyc2VzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjIyOiBjaGVja2luZyBmb3IgZ2V0YmtnZCBpbiAtbG5jdXJzZXMiID4mNQorZWNobyAiY29uZmlndXJlOjQzNDQ6IGNoZWNraW5nIGZvciBnZXRia2dkIGluIC1sbmN1cnNlcyIgPiY1CiBhY19saWJfdmFyPWBlY2hvIG5jdXJzZXMnXydnZXRia2dkIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC00MjI2LDcgKzQzNDgsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxuY3Vyc2VzICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyMzAgImNvbmZpZ3VyZSIKKyNsaW5lIDQzNTIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTQyMzcsNyArNDM1OSw3IEBACiBnZXRia2dkKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjQxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM2MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTQyNjUsMTcgKzQzODcsMTcgQEAKIGRvCiBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjY5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitlY2hvICJjb25maWd1cmU6NDM5MTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQyNzQgImNvbmZpZ3VyZSIKKyNsaW5lIDQzOTYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPCRhY19oZHI+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQyNzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MDE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC00MzA0LDcgKzQ0MjYsNyBAQAogICAgICAgICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX2N1cnNlc19oIiA9ICJ5ZXMiCiAgICAgICAgIHRoZW4gICAgCiAgICAgICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd2FkZGNoIGluIC1sY3Vyc2VzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzA4OiBjaGVja2luZyBmb3Igd2FkZGNoIGluIC1sY3Vyc2VzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0NDMwOiBjaGVja2luZyBmb3Igd2FkZGNoIGluIC1sY3Vyc2VzIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gY3Vyc2VzJ18nd2FkZGNoIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC00MzEyLDcgKzQ0MzQsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxjdXJzZXMgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDMxNiAiY29uZmlndXJlIgorI2xpbmUgNDQzOCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtNDMyMyw3ICs0NDQ1LDcgQEAKIHdhZGRjaCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDMyNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0NDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC00MzUzLDcgKzQ0NzUsNyBAQAogICAgICAgICAgICAgaWYgdGVzdCAiJGFjX2N2X2xpYl9jdXJzZXNfd2FkZGNoIiA9ICJ5ZXMiCiAgICAgICAgICAgICB0aGVuCiAgICAgICAgICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJlc2l6ZXRlcm0gaW4gLWxjdXJzZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzNTc6IGNoZWNraW5nIGZvciByZXNpemV0ZXJtIGluIC1sY3Vyc2VzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0NDc5OiBjaGVja2luZyBmb3IgcmVzaXpldGVybSBpbiAtbGN1cnNlcyIgPiY1CiBhY19saWJfdmFyPWBlY2hvIGN1cnNlcydfJ3Jlc2l6ZXRlcm0gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTQzNjEsNyArNDQ4Myw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbGN1cnNlcyAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzY1ICJjb25maWd1cmUiCisjbGluZSA0NDg3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC00MzcyLDcgKzQ0OTQsNyBAQAogcmVzaXpldGVybSgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0OTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC00Mzk2LDcgKzQ1MTgsNyBAQAogZmkKIAogICAgICAgICAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXRia2dkIGluIC1sY3Vyc2VzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDAwOiBjaGVja2luZyBmb3IgZ2V0YmtnZCBpbiAtbGN1cnNlcyIgPiY1CitlY2hvICJjb25maWd1cmU6NDUyMjogY2hlY2tpbmcgZm9yIGdldGJrZ2QgaW4gLWxjdXJzZXMiID4mNQogYWNfbGliX3Zhcj1gZWNobyBjdXJzZXMnXydnZXRia2dkIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC00NDA0LDcgKzQ1MjYsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxjdXJzZXMgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQwOCAiY29uZmlndXJlIgorI2xpbmUgNDUzMCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtNDQxNSw3ICs0NTM3LDcgQEAKIGdldGJrZ2QoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTQxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtNDQ0NCwxMiArNDU2NiwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBHTlUgc3R5bGUgSVBYIHN1cHBvcnQiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDQ4OiBjaGVja2luZyAiZm9yIEdOVSBzdHlsZSBJUFggc3VwcG9ydCIiID4mNQorZWNobyAiY29uZmlndXJlOjQ1NzA6IGNoZWNraW5nICJmb3IgR05VIHN0eWxlIElQWCBzdXBwb3J0IiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pcHhfZ251JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQ1MyAiY29uZmlndXJlIgorI2xpbmUgNDU3NSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogICAgICNpbmNsdWRlIDxuZXRpcHgvaXB4Lmg+CkBAIC00NDU3LDcgKzQ1NzksNyBAQAogKChzdHJ1Y3Qgc29ja2FkZHJfaXB4ICopMCktPnNpcHhfZmFtaWx5ID09IEFGX0lQWAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0NjE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDU4MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfaXB4X2dudT0ieWVzIgogZWxzZQpAQCAtNDQ4MiwxMiArNDYwNCwxMiBAQAogaWYgdGVzdCAiJGFjX2N2X2NfaXB4X2dudSIgPSAibm8iCiB0aGVuCiAgZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBsaW51eCBzdHlsZSBJUFggc3VwcG9ydCIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0ODY6IGNoZWNraW5nICJmb3IgbGludXggc3R5bGUgSVBYIHN1cHBvcnQiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0NjA4OiBjaGVja2luZyAiZm9yIGxpbnV4IHN0eWxlIElQWCBzdXBwb3J0IiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pcHhfbGludXgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDkxICJjb25maWd1cmUiCisjbGluZSA0NjEzICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAgICAgICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KQEAgLTQ0OTYsNyArNDYxOCw3IEBACiAoKHN0cnVjdCBzb2NrYWRkcl9pcHggKikwKS0+c2lweF9mYW1pbHkgPT0gQUZfSVBYCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDUwMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjIyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19pcHhfbGludXg9InllcyIKIGVsc2UKQEAgLTQ1MjMsMTcgKzQ2NDUsMTcgQEAKIGRvCiBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTI3OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitlY2hvICJjb25maWd1cmU6NDY0OTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ1MzIgImNvbmZpZ3VyZSIKKyNsaW5lIDQ2NTQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPCRhY19oZHI+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQ1Mzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2NTk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC00NTYxLDEyICs0NjgzLDEyIEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBPcGVuIFNvdW5kIFN5c3RlbSIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1NjU6IGNoZWNraW5nICJmb3IgT3BlbiBTb3VuZCBTeXN0ZW0iIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo0Njg3OiBjaGVja2luZyAiZm9yIE9wZW4gU291bmQgU3lzdGVtIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19vcGVuc291bmRzeXN0ZW0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTcwICJjb25maWd1cmUiCisjbGluZSA0NjkyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCSNpZiBkZWZpbmVkKEhBVkVfU1lTX1NPVU5EQ0FSRF9IKQpAQCAtNDU4Nyw3ICs0NzA5LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1OTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDcxMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtPSJ5ZXMiCiBlbHNlCkBAIC00NjEwLDEyICs0NzMyLDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIE9wZW4gU291bmQgU3lzdGVtL01JREkgaW50ZXJmYWNlIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDYxNDogY2hlY2tpbmcgImZvciBPcGVuIFNvdW5kIFN5c3RlbS9NSURJIGludGVyZmFjZSIiID4mNQorZWNobyAiY29uZmlndXJlOjQ3MzY6IGNoZWNraW5nICJmb3IgT3BlbiBTb3VuZCBTeXN0ZW0vTUlESSBpbnRlcmZhY2UiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX29wZW5zb3VuZHN5c3RlbV9taWRpJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDYxOSAiY29uZmlndXJlIgorI2xpbmUgNDc0MSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIAkjaWYgZGVmaW5lZChIQVZFX1NZU19TT1VORENBUkRfSCkKQEAgLTQ2MzYsNyArNDc1OCw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjQwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3NjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX29wZW5zb3VuZHN5c3RlbV9taWRpPSJ5ZXMiCiBlbHNlCkBAIC00NjY1LDcgKzQ3ODcsNyBAQAogdGhlbgogICBDRkxBR1M9IiRDRkxBR1MgLVdhbGwiCiAgIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgZ2NjIHN0cmVuZ3RoLXJlZHVjZSBidWciIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjY5OiBjaGVja2luZyAiZm9yIGdjYyBzdHJlbmd0aC1yZWR1Y2UgYnVnIiIgPiY1CitlY2hvICJjb25maWd1cmU6NDc5MTogY2hlY2tpbmcgImZvciBnY2Mgc3RyZW5ndGgtcmVkdWNlIGJ1ZyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC00NjczLDcgKzQ3OTUsNyBAQAogICBhY19jdl9jX2djY19zdHJlbmd0aF9idWc9InllcyIKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDY3NyAiY29uZmlndXJlIgorI2xpbmUgNDc5OSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludAlMWzRdID0gezAsMSwyLDN9OwpAQCAtNDY4OCw3ICs0ODEwLDcgQEAKICAgZXhpdCggQXJyYXlbMV0gIT0gLTIgfHwgTFsyXSAhPSAzKTsKIH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4MTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnPSJubyIKIGVsc2UKQEAgLTQ3MDksMjEgKzQ4MzEsMjEgQEAKICAgZmkKIAogICAgIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgZ2NjIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIgc3VwcG9ydCIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3MTM6IGNoZWNraW5nICJmb3IgZ2NjIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIgc3VwcG9ydCIiID4mNQorZWNobyAiY29uZmlndXJlOjQ4MzU6IGNoZWNraW5nICJmb3IgZ2NjIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIgc3VwcG9ydCIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZ2NjX3N0YWNrX2JvdW5kYXJ5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgc2F2ZWRfY2ZsYWdzPSRDRkxBR1MKICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIiCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3MjAgImNvbmZpZ3VyZSIKKyNsaW5lIDQ4NDIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIHJldHVybiAwCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDcyNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODQ5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19nY2Nfc3RhY2tfYm91bmRhcnk9InllcyIKIGVsc2UKQEAgLTQ3NDYsNyArNDg2OCw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgLnR5cGUgbXVzdCBzaXQgaW5zaWRlIGEgLmRlZiBkaXJlY3RpdmUiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzUwOiBjaGVja2luZyAid2hldGhlciAudHlwZSBtdXN0IHNpdCBpbnNpZGUgYSAuZGVmIGRpcmVjdGl2ZSIiID4mNQorZWNobyAiY29uZmlndXJlOjQ4NzI6IGNoZWNraW5nICJ3aGV0aGVyIC50eXBlIG11c3Qgc2l0IGluc2lkZSBhIC5kZWYgZGlyZWN0aXZlIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY190eXBlX2luX2RlZicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC00NzU5LDE0ICs0ODgxLDE0IEBACiAJLmxvbmcgMAogRU9GCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NzYzICJjb25maWd1cmUiCisjbGluZSA0ODg1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDg5MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY190eXBlX2luX2RlZj0ieWVzIgogZWxzZQpAQCAtNDc5MCw3ICs0OTEyLDcgQEAKICAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDc5NDogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CitlY2hvICJjb25maWd1cmU6NDkxNjogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19leHRlcm5fcHJlZml4JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTQ4MDIsMTQgKzQ5MjQsMTQgQEAKIAkubG9uZyAwCiBFT0YKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4MDYgImNvbmZpZ3VyZSIKKyNsaW5lIDQ5MjggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogZXh0ZXJuIGludCBhY190ZXN0OwogaW50IG1haW4oKSB7CiBpZiAoYWNfdGVzdCkgcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDkzNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19leHRlcm5fcHJlZml4PSJ5ZXMiCiBlbHNlCkBAIC00ODMzLDcgKzQ5NTUsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIGFzc2VtYmxlciBhY2NlcHRzIC5zdHJpbmciIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODM3OiBjaGVja2luZyAid2hldGhlciBhc3NlbWJsZXIgYWNjZXB0cyAuc3RyaW5nIiIgPiY1CitlY2hvICJjb25maWd1cmU6NDk1OTogY2hlY2tpbmcgIndoZXRoZXIgYXNzZW1ibGVyIGFjY2VwdHMgLnN0cmluZyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYXNtX3N0cmluZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC00ODQzLDE0ICs0OTY1LDE0IEBACiAJLnN0cmluZyAidGVzdCIKIEVPRgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDg0NyAiY29uZmlndXJlIgorI2xpbmUgNDk2OSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDg1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5NzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfYXNtX3N0cmluZz0ieWVzIgogZWxzZQpAQCAtNDg3OCwyMSArNTAwMCwyMSBAQAogaWYgdGVzdCAiJExJQkVYVCIgPSAic28iCiB0aGVuCiAgIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIHdlIGNhbiBidWlsZCBhIExpbnV4IGRsbCIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4ODI6IGNoZWNraW5nICJ3aGV0aGVyIHdlIGNhbiBidWlsZCBhIExpbnV4IGRsbCIiID4mNQorZWNobyAiY29uZmlndXJlOjUwMDQ6IGNoZWNraW5nICJ3aGV0aGVyIHdlIGNhbiBidWlsZCBhIExpbnV4IGRsbCIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZGxsX2xpbnV4JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgc2F2ZWRfY2ZsYWdzPSRDRkxBR1MKICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mUElDIC1zaGFyZWQgLVdsLC1zb25hbWUsY29uZnRlc3Quc28uMS4wLC1Cc3ltYm9saWMiCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4ODkgImNvbmZpZ3VyZSIKKyNsaW5lIDUwMTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIHJldHVybiAxCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDg5NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwMTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfZGxsX2xpbnV4PSJ5ZXMiCiBlbHNlCkBAIC00OTEzLDIxICs1MDM1LDIxIEBACiAgICAgTERETExGTEFHUz0iLVdsLC1Cc3ltYm9saWMiCiAgIGVsc2UKICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGNhbiBidWlsZCBhIFVuaXhXYXJlIChTb2xhcmlzKSBkbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5MTc6IGNoZWNraW5nIHdoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgVW5peFdhcmUgKFNvbGFyaXMpIGRsbCIgPiY1CitlY2hvICJjb25maWd1cmU6NTAzOTogY2hlY2tpbmcgd2hldGhlciB3ZSBjYW4gYnVpbGQgYSBVbml4V2FyZSAoU29sYXJpcykgZGxsIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2RsbF91bml4d2FyZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIHNhdmVkX2NmbGFncz0kQ0ZMQUdTCiAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mUElDIC1XbCwtRywtaCxjb25mdGVzdC5zby4xLjAsLUIsc3ltYm9saWMiCiAgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDkyNCAiY29uZmlndXJlIgorI2xpbmUgNTA0NiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTMxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA1MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19kbGxfdW5peHdhcmU9InllcyIKIGVsc2UKQEAgLTQ5NDgsMjEgKzUwNzAsMjEgQEAKICAgICAgIExERExMRkxBR1M9Ii1XbCwtQixzeW1ib2xpYyIKICAgICBlbHNlCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBOZXRCU0QgZGxsIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDk1MjogY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgTmV0QlNEIGRsbCIiID4mNQorZWNobyAiY29uZmlndXJlOjUwNzQ6IGNoZWNraW5nICJ3aGV0aGVyIHdlIGNhbiBidWlsZCBhIE5ldEJTRCBkbGwiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2RsbF9uZXRic2QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBzYXZlZF9jZmxhZ3M9JENGTEFHUwogICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mUElDIC1XbCwtQnNoYXJlYWJsZSwtQmZvcmNlYXJjaGl2ZSIKICAgICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ5NTkgImNvbmZpZ3VyZSIKKyNsaW5lIDUwODEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIHJldHVybiAxCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwODg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfZGxsX25ldGJzZD0ieWVzIgogZWxzZQpAQCAtNTAxOCwyMSArNTE0MCwyMSBAQAogZWxzZQogICAgIERMTF9MSU5LPSItTFwkKERMTERJUikgXCQoRExMUzolPS1sJSkgXCQoTElCV0lORSkgXCQoTElCVU5JQ09ERSkgXCQoWF9MSUJTKSBcJChYTElCKSIKICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgc3VwcG9ydHMgLS1bbm9dLXdob2xlLWFyY2hpdmUgKExpbnV4KSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTAyMjogY2hlY2tpbmcgd2hldGhlciB0aGUgbGlua2VyIHN1cHBvcnRzIC0tW25vXS13aG9sZS1hcmNoaXZlIChMaW51eCkiID4mNQorZWNobyAiY29uZmlndXJlOjUxNDQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmtlciBzdXBwb3J0cyAtLVtub10td2hvbGUtYXJjaGl2ZSAoTGludXgpIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3dob2xlX2FyY2hpdmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBzYXZlZF9jZmxhZ3M9JENGTEFHUwogICAgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XbCwtLXdob2xlLWFyY2hpdmUgLVdsLC0tbm8td2hvbGUtYXJjaGl2ZSIKICAgICAgICAgICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUwMjkgImNvbmZpZ3VyZSIKKyNsaW5lIDUxNTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIHJldHVybiAxCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTAzNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2Nfd2hvbGVfYXJjaGl2ZT0ieWVzIgogZWxzZQpAQCAtNTA1MiwyMSArNTE3NCwyMSBAQAogICAgICAgICBETExfTElOSz0iLVdsLC0td2hvbGUtYXJjaGl2ZSAkRExMX0xJTksgLVdsLC0tbm8td2hvbGUtYXJjaGl2ZSIKICAgICBlbHNlCiAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmtlciBzdXBwb3J0cyAteiB7YWxsLGRlZmF1bHR9ZXh0cmFjdCAoTGludXgpIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDU2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgc3VwcG9ydHMgLXoge2FsbCxkZWZhdWx0fWV4dHJhY3QgKExpbnV4KSIgPiY1CitlY2hvICJjb25maWd1cmU6NTE3ODogY2hlY2tpbmcgd2hldGhlciB0aGUgbGlua2VyIHN1cHBvcnRzIC16IHthbGwsZGVmYXVsdH1leHRyYWN0IChMaW51eCkiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYWxsZXh0cmFjdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIHNhdmVkX2NmbGFncz0kQ0ZMQUdTCiAJCUNGTEFHUz0iJENGTEFHUyAtV2wsLXosYWxsZXh0cmFjdCAtV2wsLXosZGVmYXVsdGV4dHJhY3QiCiAJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUwNjMgImNvbmZpZ3VyZSIKKyNsaW5lIDUxODUgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIHJldHVybiAxCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUxOTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfYWxsZXh0cmFjdD0ieWVzIgogZWxzZQpAQCAtNTA5OCw3ICs1MjIwLDcgQEAKIAogd2luZV9jdl9saWJjX3JlZW50cmFudD1ubyAKIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgcmVlbnRyYW50IGxpYmM6IF9fZXJybm9fbG9jYXRpb24iIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MTAyOiBjaGVja2luZyAiZm9yIHJlZW50cmFudCBsaWJjOiBfX2Vycm5vX2xvY2F0aW9uIiIgPiY1CitlY2hvICJjb25maWd1cmU6NTIyNDogY2hlY2tpbmcgImZvciByZWVudHJhbnQgbGliYzogX19lcnJub19sb2NhdGlvbiIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3ZfbGliY19yX19lcnJub19sb2NhdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC01MTA2LDE0ICs1MjI4LDE0IEBACiAgIHdpbmVfY3ZfbGliY19yX19lcnJub19sb2NhdGlvbj15ZXMgCiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUxMTAgImNvbmZpZ3VyZSIKKyNsaW5lIDUyMzIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogaW50IG15ZXJybm8gPSAwOwogY2hhciBidWZbMjU2XTsKIGludCAqX19lcnJub19sb2NhdGlvbigpe3JldHVybiAmbXllcnJubzt9CiBtYWluKCl7Y29ubmVjdCgwLGJ1ZiwyNTUpOyBleGl0KCFteWVycm5vKTt9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTExNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjM5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIHdpbmVfY3ZfbGliY19yX19lcnJub19sb2NhdGlvbj15ZXMKIGVsc2UKQEAgLTUxMzgsNyArNTI2MCw3IEBACiAgICAgd2luZV9jdl9saWJjX3JlZW50cmFudD1fX2Vycm5vX2xvY2F0aW9uIAogZmkKIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgcmVlbnRyYW50IGxpYmM6IF9fZXJyb3IiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MTQyOiBjaGVja2luZyAiZm9yIHJlZW50cmFudCBsaWJjOiBfX2Vycm9yIiIgPiY1CitlY2hvICJjb25maWd1cmU6NTI2NDogY2hlY2tpbmcgImZvciByZWVudHJhbnQgbGliYzogX19lcnJvciIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3ZfbGliY19yX19lcnJvcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC01MTQ2LDE0ICs1MjY4LDE0IEBACiAgIHdpbmVfY3ZfbGliY19yX19lcnJvcj15ZXMgCiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUxNTAgImNvbmZpZ3VyZSIKKyNsaW5lIDUyNzIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogaW50IG15ZXJybm8gPSAwOwogY2hhciBidWZbMjU2XTsKIGludCAqX19lcnJvcigpe3JldHVybiAmbXllcnJubzt9CiBtYWluKCl7Y29ubmVjdCgwLGJ1ZiwyNTUpOyBleGl0KCFteWVycm5vKTt9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTE1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1Mjc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIHdpbmVfY3ZfbGliY19yX19lcnJvcj15ZXMKIGVsc2UKQEAgLTUxNzgsNyArNTMwMCw3IEBACiAgICAgd2luZV9jdl9saWJjX3JlZW50cmFudD1fX2Vycm9yIAogZmkKIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgcmVlbnRyYW50IGxpYmM6IF9fX2Vycm5vIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTE4MjogY2hlY2tpbmcgImZvciByZWVudHJhbnQgbGliYzogX19fZXJybm8iIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1MzA0OiBjaGVja2luZyAiZm9yIHJlZW50cmFudCBsaWJjOiBfX19lcnJubyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3ZfbGliY19yX19fZXJybm8nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNTE4NiwxNCArNTMwOCwxNCBAQAogICB3aW5lX2N2X2xpYmNfcl9fX2Vycm5vPXllcyAKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTE5MCAiY29uZmlndXJlIgorI2xpbmUgNTMxMiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiBpbnQgbXllcnJubyA9IDA7CiBjaGFyIGJ1ZlsyNTZdOwogaW50ICpfX19lcnJubygpe3JldHVybiAmbXllcnJubzt9CiBtYWluKCl7Y29ubmVjdCgwLGJ1ZiwyNTUpOyBleGl0KCFteWVycm5vKTt9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTE5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzE5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIHdpbmVfY3ZfbGliY19yX19fZXJybm89eWVzCiBlbHNlCkBAIC01MjE4LDcgKzUzNDAsNyBAQAogICAgIHdpbmVfY3ZfbGliY19yZWVudHJhbnQ9X19fZXJybm8gCiBmaQogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciByZWVudHJhbnQgbGliYzogX190aHJfZXJybm8iIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MjIyOiBjaGVja2luZyAiZm9yIHJlZW50cmFudCBsaWJjOiBfX3Rocl9lcnJubyIiID4mNQorZWNobyAiY29uZmlndXJlOjUzNDQ6IGNoZWNraW5nICJmb3IgcmVlbnRyYW50IGxpYmM6IF9fdGhyX2Vycm5vIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9saWJjX3JfX3Rocl9lcnJubycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC01MjI2LDE0ICs1MzQ4LDE0IEBACiAgIHdpbmVfY3ZfbGliY19yX190aHJfZXJybm89eWVzIAogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MjMwICJjb25maWd1cmUiCisjbGluZSA1MzUyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIGludCBteWVycm5vID0gMDsKIGNoYXIgYnVmWzI1Nl07CiBpbnQgKl9fdGhyX2Vycm5vKCl7cmV0dXJuICZteWVycm5vO30KIG1haW4oKXtjb25uZWN0KDAsYnVmLDI1NSk7IGV4aXQoIW15ZXJybm8pO30KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjM3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzNTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgd2luZV9jdl9saWJjX3JfX3Rocl9lcnJubz15ZXMKIGVsc2UKQEAgLTUyNjksNyArNTM5MSw3IEBACiBpZiB0ZXN0ICIkaGF2ZV94IiA9ICJ5ZXMiIC1hICIkd2luZV9jdl9saWJjX3JlZW50cmFudCIgIT0gIm5vIgogdGhlbgogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciByZWVudHJhbnQgWCBsaWJyYXJpZXMiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MjczOiBjaGVja2luZyAiZm9yIHJlZW50cmFudCBYIGxpYnJhcmllcyIiID4mNQorZWNobyAiY29uZmlndXJlOjUzOTU6IGNoZWNraW5nICJmb3IgcmVlbnRyYW50IFggbGlicmFyaWVzIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl94X3JlZW50cmFudCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC01MzE1LDE0ICs1NDM3LDE0IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTMxOTogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1CitlY2hvICJjb25maWd1cmU6NTQ0MTogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19iaWdlbmRpYW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCiAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTMyNiAiY29uZmlndXJlIgorI2xpbmUgNTQ0OCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CkBAIC01MzMzLDExICs1NDU1LDExIEBACiAjZW5kaWYKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzM3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU0NTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTM0MSAiY29uZmlndXJlIgorI2xpbmUgNTQ2MyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CkBAIC01MzQ4LDcgKzU0NzAsNyBAQAogI2VuZGlmCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTM1MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NDc0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCiBlbHNlCkBAIC01MzY4LDcgKzU0OTAsNyBAQAogICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZyIgMT4mMjsgZXhpdCAxOyB9CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUzNzIgImNvbmZpZ3VyZSIKKyNsaW5lIDU0OTQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogbWFpbiAoKSB7CiAgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KQEAgLTUzODEsNyArNTUwMyw3IEBACiAgIGV4aXQgKHUuY1tzaXplb2YgKGxvbmcpIC0gMV0gPT0gMSk7CiB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTM4NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NTA3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCiBlbHNlCkBAIC01NDA2LDcgKzU1MjgsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIGJpdGZpZWxkcyBhcmUgYmlnZW5kaWFuIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTQxMDogY2hlY2tpbmcgIndoZXRoZXIgYml0ZmllbGRzIGFyZSBiaWdlbmRpYW4iIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1NTMyOiBjaGVja2luZyAid2hldGhlciBiaXRmaWVsZHMgYXJlIGJpZ2VuZGlhbiIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3ZfYml0ZmllbGRzX2JpZ2VuZGlhbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC01NDE0LDcgKzU1MzYsNyBAQAogICB3aW5lX2N2X2JpdGZpZWxkc19iaWdlbmRpYW49bm8gCiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU0MTggImNvbmZpZ3VyZSIKKyNsaW5lIDU1NDAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiB1bmlvbgpAQCAtNTQyOCw3ICs1NTUwLDcgQEAKIH0gdTsKIG1haW4oKSB7IHUud29yZCA9IDA7IHUuYml0ZmllbGQuYml0MCA9IDE7IGV4aXQoIHUud29yZCA9PSAxICk7IH0gCiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTQzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NTU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIHdpbmVfY3ZfYml0ZmllbGRzX2JpZ2VuZGlhbj15ZXMKIGVsc2UKQEAgLTU0NTIsNyArNTU3NCw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBpcyBhbGxvd2VkIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTQ1NjogY2hlY2tpbmcgIndoZXRoZXIgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgaXMgYWxsb3dlZCIiID4mNQorZWNobyAiY29uZmlndXJlOjU1Nzg6IGNoZWNraW5nICJ3aGV0aGVyIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGlzIGFsbG93ZWQiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd3aW5lX2N2X2FsbG93X3VuYWxpZ25lZF9hY2Nlc3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNTQ2MCw3ICs1NTgyLDcgQEAKICAgd2luZV9jdl9hbGxvd191bmFsaWduZWRfYWNjZXNzPW5vIAogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NDY0ICJjb25maWd1cmUiCisjbGluZSA1NTg2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogbG9uZyB2b2xhdGlsZSB0ZXN0WzJdOwpAQCAtNTQ3MSw3ICs1NTkzLDcgQEAKICAgICBleGl0KDApOwogfSAKIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NDc1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1OTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgd2luZV9jdl9hbGxvd191bmFsaWduZWRfYWNjZXNzPXllcwogZWxzZQpAQCAtNTQ5OSwxOSArNTYyMSwxOSBAQAogIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKICMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCiBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTUwMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQorZWNobyAiY29uZmlndXJlOjU2MjU6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NTA4ICJjb25maWd1cmUiCisjbGluZSA1NjMwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxhbGxvY2EuaD4KIGludCBtYWluKCkgewogdm9pZCAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1MTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NjM3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCiBlbHNlCkBAIC01NTMyLDEyICs1NjU0LDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NTM2OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1NjU4OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU1NDEgImNvbmZpZ3VyZSIKKyNsaW5lIDU2NjMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAjaWZkZWYgX19HTlVDX18KQEAgLTU1NjUsNyArNTY4Nyw3IEBACiBjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU1Njk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NjkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKIGVsc2UKQEAgLTU1OTcsMTIgKzU3MTksMTIgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1NjAxOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1NzIzOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTYwNiAiY29uZmlndXJlIgorI2xpbmUgNTcyOCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCiB3ZWJlY3JheQpAQCAtNTYyNywxMiArNTc0OSwxMiBAQAogaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgogZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwogICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2MzE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICJjb25maWd1cmU6NTc1MzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTYzNiAiY29uZmlndXJlIgorI2xpbmUgNTc1OCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCkBAIC01NjU1LDcgKzU3NzcsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTY1OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU3ODE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgogZWxzZQpAQCAtNTY4Miw3ICs1ODA0LDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2ODY6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQorZWNobyAiY29uZmlndXJlOjU4MDg6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTU2OTAsNyArNTgxMiw3IEBACiAgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTY5NCAiY29uZmlndXJlIgorI2xpbmUgNTgxNiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKQogewpAQCAtNTcwOSw3ICs1ODMxLDcgQEAKICAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwogfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU3MTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTgzNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAogdGhlbgogICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCiBlbHNlCkBAIC01NzY2LDEyICs1ODg4LDEyIEBACiAKIGRvCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU3NzA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICJjb25maWd1cmU6NTg5MjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTc3NSAiY29uZmlndXJlIgorI2xpbmUgNTg5NyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCkBAIC01Nzk0LDcgKzU5MTYsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTc5ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU5MjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgogZWxzZQpAQCAtNTg3NiwxNyArNTk5OCwxNyBAQAogZG8KIGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU4ODA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2MDAyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTg4NSAiY29uZmlndXJlIgorI2xpbmUgNjAwNyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8JGFjX2hkcj4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NTg5MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NjAxMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTU5MTMsMTIgKzYwMzUsMTIgQEAKIGRvbmUKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTkxNzogY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1CitlY2hvICJjb25maWd1cmU6NjAzOTogY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTkyMiAiY29uZmlndXJlIgorI2xpbmUgNjA0NCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KQEAgLTU5NzEsMTIgKzYwOTMsMTIgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTk3NTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQorZWNobyAiY29uZmlndXJlOjYwOTc6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTk4MCAiY29uZmlndXJlIgorI2xpbmUgNjEwMiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewpAQCAtNjAyNSw3ICs2MTQ3LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYwMjk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjE1MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfY29uc3Q9eWVzCiBlbHNlCkBAIC02MDQ2LDIxICs2MTY4LDIxIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MDUwOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2MTcyOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGFjX2N2X2NfaW5saW5lPW5vCiBmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDYwNTcgImNvbmZpZ3VyZSIKKyNsaW5lIDYxNzkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIH0gaW50ICRhY19rdyBmb28oKSB7CiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjA2NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MTg2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawogZWxzZQpAQCAtNjA4NiwxMiArNjIwOCwxMiBAQAogZXNhYwogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjA5MDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorZWNobyAiY29uZmlndXJlOjYyMTI6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDYwOTUgImNvbmZpZ3VyZSIKKyNsaW5lIDYyMTcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgpAQCAtNjA5OSw3ICs2MjIxLDcgQEAKICNpbmNsdWRlIDxmbG9hdC5oPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MTAzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MjI1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtNjExNiw3ICs2MjM4LDcgQEAKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDYxMjAgImNvbmZpZ3VyZSIKKyNsaW5lIDYyNDIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0cmluZy5oPgogRU9GCkBAIC02MTM0LDcgKzYyNTYsNyBAQAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNjEzOCAiY29uZmlndXJlIgorI2xpbmUgNjI2MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiBFT0YKQEAgLTYxNTUsNyArNjI3Nyw3IEBACiAgIDoKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNjE1OSAiY29uZmlndXJlIgorI2xpbmUgNjI4MSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQpAQCAtNjE2Niw3ICs2Mjg4LDcgQEAKIGV4aXQgKDApOyB9CiAKIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MTcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYyOTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgOgogZWxzZQpAQCAtNjE5MCwxMiArNjMxMiwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjE5NDogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitlY2hvICJjb25maWd1cmU6NjMxNjogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2MTk5ICJjb25maWd1cmUiCisjbGluZSA2MzIxICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpZiBTVERDX0hFQURFUlMKQEAgLTYyMjMsNyArNjM0NSw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjIyNzogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmciID4mNQorZWNobyAiY29uZmlndXJlOjYzNDk6IGNoZWNraW5nIHNpemUgb2YgbG9uZyBsb25nIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zaXplb2ZfbG9uZ19sb25nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTYyMzEsNyArNjM1Myw3IEBACiAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2MjM1ICJjb25maWd1cmUiCisjbGluZSA2MzU3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdGRpby5oPgogbWFpbigpCkBAIC02MjQyLDcgKzYzNjQsNyBAQAogICBleGl0KDApOwogfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYyNDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjM2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAogdGhlbgogICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPWBjYXQgY29uZnRlc3R2YWxgCiBlbHNlCkBAIC02MjY0LDEyICs2Mzg2LDEyIEBACiAKICAgIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIHVzZSByZS1lbnRyYW50IGdldGhvc3RieW5hbWVfciBMaW51eCBzdHlsZSIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYyNjg6IGNoZWNraW5nICJ3aGV0aGVyIHdlIGNhbiB1c2UgcmUtZW50cmFudCBnZXRob3N0YnluYW1lX3IgTGludXggc3R5bGUiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2MzkwOiBjaGVja2luZyAid2hldGhlciB3ZSBjYW4gdXNlIHJlLWVudHJhbnQgZ2V0aG9zdGJ5bmFtZV9yIExpbnV4IHN0eWxlIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9saW51eF9nZXRob3N0YnluYW1lX3JfNicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDYyNzMgImNvbmZpZ3VyZSIKKyNsaW5lIDYzOTUgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAjaW5jbHVkZSA8bmV0ZGIuaD4KQEAgLTYyOTAsNyArNjQxMiw3IEBACiAgICAgCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjI5NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NDE2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgd2luZV9jdl9saW51eF9nZXRob3N0YnluYW1lX3JfNj15ZXMKIGVsc2UKQEAgLTYzMTYsMTIgKzY0MzgsMTIgQEAKIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfbGludXhfam95c3RpY2tfaCIgPSAieWVzIgogdGhlbgogICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgbGludXgvam95c3RpY2suaCB1c2VzIHRoZSBMaW51eCAyLjIrIEFQSSIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYzMjA6IGNoZWNraW5nICJ3aGV0aGVyIGxpbnV4L2pveXN0aWNrLmggdXNlcyB0aGUgTGludXggMi4yKyBBUEkiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2NDQyOiBjaGVja2luZyAid2hldGhlciBsaW51eC9qb3lzdGljay5oIHVzZXMgdGhlIExpbnV4IDIuMisgQVBJIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9saW51eF9qb3lzdGlja18yMl9hcGknK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2MzI1ICJjb25maWd1cmUiCisjbGluZSA2NDQ3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KQEAgLTYzMzYsNyArNjQ1OCw3IEBACiAvKmVtcHR5Ki8KIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2MzQwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY0NjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICB3aW5lX2N2X2xpbnV4X2pveXN0aWNrXzIyX2FwaT15ZXMKIGVsc2UKQEAgLTYzNjMsMTIgKzY0ODUsMTIgQEAKIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3Zmc19oIiA9ICJ5ZXMiCiB0aGVuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgc3lzL3Zmcy5oIGRlZmluZXMgc3RhdGZzIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjM2NzogY2hlY2tpbmcgIndoZXRoZXIgc3lzL3Zmcy5oIGRlZmluZXMgc3RhdGZzIiIgPiY1CitlY2hvICJjb25maWd1cmU6NjQ4OTogY2hlY2tpbmcgIndoZXRoZXIgc3lzL3Zmcy5oIGRlZmluZXMgc3RhdGZzIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9zeXNfdmZzX2hhc19zdGF0ZnMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2MzcyICJjb25maWd1cmUiCisjbGluZSA2NDk0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTYzODUsNyArNjUwNyw3IEBACiAJCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjM4OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NTExOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgd2luZV9jdl9zeXNfdmZzX2hhc19zdGF0ZnM9eWVzCiBlbHNlCkBAIC02NDEyLDEyICs2NTM0LDEyIEBACiBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19zdGF0ZnNfaCIgPSAieWVzIgogdGhlbgogICAgIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIHN5cy9zdGF0ZnMuaCBkZWZpbmVzIHN0YXRmcyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0MTY6IGNoZWNraW5nICJ3aGV0aGVyIHN5cy9zdGF0ZnMuaCBkZWZpbmVzIHN0YXRmcyIiID4mNQorZWNobyAiY29uZmlndXJlOjY1Mzg6IGNoZWNraW5nICJ3aGV0aGVyIHN5cy9zdGF0ZnMuaCBkZWZpbmVzIHN0YXRmcyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3Zfc3lzX3N0YXRmc19oYXNfc3RhdGZzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNjQyMSAiY29uZmlndXJlIgorI2xpbmUgNjU0MyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIAkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC02NDMyLDcgKzY1NTQsNyBAQAogCQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY0MzY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjU1ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIHdpbmVfY3Zfc3lzX3N0YXRmc19oYXNfc3RhdGZzPXllcwogZWxzZQpAQCAtNjQ1OSwxMiArNjU4MSwxMiBAQAogaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zeXNfbW91bnRfaCIgPSAieWVzIgogdGhlbgogICAgIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIHN5cy9tb3VudC5oIGRlZmluZXMgc3RhdGZzIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQ2MzogY2hlY2tpbmcgIndoZXRoZXIgc3lzL21vdW50LmggZGVmaW5lcyBzdGF0ZnMiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2NTg1OiBjaGVja2luZyAid2hldGhlciBzeXMvbW91bnQuaCBkZWZpbmVzIHN0YXRmcyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3Zfc3lzX21vdW50X2hhc19zdGF0ZnMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2NDY4ICJjb25maWd1cmUiCisjbGluZSA2NTkwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTY0NzksNyArNjYwMSw3IEBACiAJCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjQ4MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NjA1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgd2luZV9jdl9zeXNfbW91bnRfaGFzX3N0YXRmcz15ZXMKIGVsc2UKQEAgLTY1MDUsNyArNjYyNyw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBzdGF0ZnMuZl9iZnJlZSIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY1MDk6IGNoZWNraW5nICJmb3Igc3RhdGZzLmZfYmZyZWUiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2NjMxOiBjaGVja2luZyAiZm9yIHN0YXRmcy5mX2JmcmVlIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9zdGF0ZnNfYmZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjUxNCw3ICs2NjM2LDcgQEAKICAgICAgICAgd2luZV9jdl9zdGF0ZnNfYmZyZWU9bm8KICAgICBlbHNlCiAgICAgCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY1MTggImNvbmZpZ3VyZSIKKyNsaW5lIDY2NDAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtNjU0MSw3ICs2NjYzLDcgQEAKIAkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NTQ1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY2Njc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICB3aW5lX2N2X3N0YXRmc19iZnJlZT15ZXMKIGVsc2UKQEAgLTY1NjUsNyArNjY4Nyw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIHN0YXRmcy5mX2JhdmFpbCIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY1Njk6IGNoZWNraW5nICJmb3Igc3RhdGZzLmZfYmF2YWlsIiIgPiY1CitlY2hvICJjb25maWd1cmU6NjY5MTogY2hlY2tpbmcgImZvciBzdGF0ZnMuZl9iYXZhaWwiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd3aW5lX2N2X3N0YXRmc19iYXZhaWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjU3NCw3ICs2Njk2LDcgQEAKICAgICAgICAgd2luZV9jdl9zdGF0ZnNfYmF2YWlsPW5vCiAgICAgZWxzZQogICAgIAljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2NTc4ICJjb25maWd1cmUiCisjbGluZSA2NzAwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTY2MDEsNyArNjcyMyw3IEBACiAJCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjYwNTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NzI3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgd2luZV9jdl9zdGF0ZnNfYmF2YWlsPXllcwogZWxzZQpAQCAtNjYyNiwxMiArNjc0OCwxMiBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgbXNnX2FjY3JpZ2h0cyBpbiBzdHJ1Y3QgbXNnaGRyIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjYzMDogY2hlY2tpbmcgImZvciBtc2dfYWNjcmlnaHRzIGluIHN0cnVjdCBtc2doZHIiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2NzUyOiBjaGVja2luZyAiZm9yIG1zZ19hY2NyaWdodHMgaW4gc3RydWN0IG1zZ2hkciIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfbXNnX2FjY3JpZ2h0cycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY2MzUgImNvbmZpZ3VyZSIKKyNsaW5lIDY3NTcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KQEAgLTY2MzksNyArNjc2MSw3IEBACiBzdHJ1Y3QgbXNnaGRyIGhkcjsgaGRyLm1zZ19hY2NyaWdodHM9MAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY2NDM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Njc2NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfbXNnX2FjY3JpZ2h0cz0ieWVzIgogZWxzZQpAQCAtNjY2MiwxMiArNjc4NCwxMiBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3Igc3VuX2xlbiBpbiBzdHJ1Y3Qgc29ja2FkZHJfdW4iIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NjY2OiBjaGVja2luZyAiZm9yIHN1bl9sZW4gaW4gc3RydWN0IHNvY2thZGRyX3VuIiIgPiY1CitlY2hvICJjb25maWd1cmU6Njc4ODogY2hlY2tpbmcgImZvciBzdW5fbGVuIGluIHN0cnVjdCBzb2NrYWRkcl91biIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3VuX2xlbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY2NzEgImNvbmZpZ3VyZSIKKyNsaW5lIDY3OTMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KQEAgLTY2NzYsNyArNjc5OCw3IEBACiBzdGF0aWMgc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7IGFkZHIuc3VuX2xlbiA9IDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2NjgwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY4MDI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX3N1bl9sZW49InllcyIKIGVsc2UKQEAgLTY2OTksMTIgKzY4MjEsMTIgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciB3ZSBuZWVkIHRvIGRlZmluZSBfX2kzODZfXyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3MDM6IGNoZWNraW5nICJ3aGV0aGVyIHdlIG5lZWQgdG8gZGVmaW5lIF9faTM4Nl9fIiIgPiY1CitlY2hvICJjb25maWd1cmU6NjgyNTogY2hlY2tpbmcgIndoZXRoZXIgd2UgbmVlZCB0byBkZWZpbmUgX19pMzg2X18iIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jcHBfZGVmX2kzODYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2NzA4ICJjb25maWd1cmUiCisjbGluZSA2ODMwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpZiAoZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9faTM4NikpICYmICFkZWZpbmVkKF9faTM4Nl9fKQogeWVzCkBAIC03MDM2LDkgKzcxNTgsNiBAQAogcyVAWEZJTEVTQCUkWEZJTEVTJWcKIHMlQE9QRU5HTEZJTEVTQCUkT1BFTkdMRklMRVMlZwogcyVAT1BFTkdMMzJfRExMQCUkT1BFTkdMMzJfRExMJWcKLXMlQERHQV9TUkNTQCUkREdBX1NSQ1MlZwotcyVAREdBMl9TUkNTQCUkREdBMl9TUkNTJWcKLXMlQE1FU0FfU1JDU0AlJE1FU0FfU1JDUyVnCiBzJUBETExfTElOS0AlJERMTF9MSU5LJWcKIHMlQERMTEZMQUdTQCUkRExMRkxBR1MlZwogcyVATERTSEFSRURAJSRMRFNIQVJFRCVnCkBAIC03NDYzLDcgKzc1ODIsNyBAQAogaWYgdGVzdCAiJHdpbmVfY3Zfb3BlbmdsX3ZlcnNpb25fdGhyZWFkc2FmZSIgPSAieWVzIiAtYSAkT1BFTkdMID0gInllcyIKIHRoZW4KICAgZWNobwotICBlY2hvICIqKiogV2FybmluZzogeW91IGV4cGxpY2l0ZWx5IGxpbmtlZCBpbiBhIHRocmVhZC1zYWZlIE9wZW5HTCB2ZXJzaW9uLiBJZiB5b3UiCisgIGVjaG8gIioqKiBXYXJuaW5nOiB5b3UgZXhwbGljaXRseSBsaW5rZWQgaW4gYSB0aHJlYWQtc2FmZSBPcGVuR0wgdmVyc2lvbi4gSWYgeW91IgogICBlY2hvICIqKiogZXhwZXJpZW5jZSB1bnVzdWFsIGNyYXNoZXMgb24gRGlyZWN0RHJhdyBnYW1lcywgdHJ5IGZpcnN0IHRvIGRpc2FibGUgT3BlbkdMIgogICBlY2hvICIqKiogc3VwcG9ydCBiZWZvcmUgcmVwb3J0aW5nIGJ1Z3MuIgogZmkKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgppbmRleCA3ZmNkOWU4Li41MTA4NDYwIDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmluCkBAIC0xMzQsMTIgKzEzNCw2IEBACiBPUEVOR0xGSUxFUz0iIgogQUNfU1VCU1QoT1BFTkdMMzJfRExMKQogT1BFTkdMMzJfRExMPSIiCi1BQ19TVUJTVChER0FfU1JDUykKLURHQV9TUkNTPSIiCi1BQ19TVUJTVChER0EyX1NSQ1MpCi1ER0EyX1NSQ1M9IiIKLUFDX1NVQlNUKE1FU0FfU1JDUykKLU1FU0FfU1JDUz0iIgogaWYgdGVzdCAiJGhhdmVfeCIgPSAieWVzIgogdGhlbgogICAgIFhMSUI9Ii1sWGV4dCAtbFgxMSIKQEAgLTIxMiwxNSArMjA2LDEyIEBACiAgICAgICAgICAgICAgICAgICBBQ19ERUZJTkUoSEFWRV9MSUJYWEY4NkRHQTIpCiAgICAgICAgICAgICAgICAgICBBQ19ERUZJTkUoSEFWRV9MSUJYWEY4NkRHQSkKICAgICAgICAgICAgICAgICAgIFhfUFJFX0xJQlM9IiRYX1BSRV9MSUJTIC1sWHhmODZkZ2EiCi0gICAgICAgICAgICAgICAgICBER0FfU1JDUz0nJChER0FfU1JDUyknCi0gICAgICAgICAgICAgICAgICBER0EyX1NSQ1M9JyQoREdBMl9TUkNTKScKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgWyBkbmwgKioqIElmIG5vdCBmb3VuZCwgbG9vayBmb3IgWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uKCkKICAgICAgICAgICAgICAgICAgIGRubCAqKiogaW5zdGVhZCAoREdBIDIuMCBub3QgZm91bmQpLi4uCiAgICAgICAgICAgICAgICAgICBBQ19DSEVDS19MSUIoWHhmODZkZ2EsIFhGODZER0FRdWVyeUV4dGVuc2lvbiwKICAgICAgICAgICAgICAgICAgICAgWyBBQ19ERUZJTkUoSEFWRV9MSUJYWEY4NkRHQSkKICAgICAgICAgICAgICAgICAgICAgICBYX1BSRV9MSUJTPSIkWF9QUkVfTElCUyAtbFh4Zjg2ZGdhIgotICAgICAgICAgICAgICAgICAgICAgIERHQV9TUkNTPSckKERHQV9TUkNTKScKICAgICAgICAgICAgICAgICAgICAgXSwsCiAgICAgICAgICAgICAgICAgICAgICRYX0xJQlMgLWxYZXh0IC1sWDExICRYX0VYVFJBX0xJQlMKICAgICAgICAgICAgICAgICAgICkKQEAgLTI5Miw3ICsyODMsNiBAQAogCQlkbmwgQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgbGlicmFyeQogCQlBQ19DSEVDS19MSUIoR0wsZ2xYQ3JlYXRlQ29udGV4dCwKIAkJCSAgICAgWF9QUkVfTElCUz0iJFhfUFJFX0xJQlMgLWxHTCIKLQkJCSAgICAgTUVTQV9TUkNTPSckKE1FU0FfU1JDUyknCiAJCQkgICAgICwsCiAJCQkgICAgICRYX0xJQlMgLWxYZXh0IC1sWDExIC1sbSAkWF9FWFRSQV9MSUJTKQogCkBAIC0zMjQsNiArMzE0LDIwIEBACiAKIAkJCQlPUEVOR0wzMl9ETEw9b3BlbmdsMzIKIAkJCWZpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDX0NIRUNLX0hFQURFUlMoR0wvb3NtZXNhLmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBkbmwgKioqIElmIEdML29zbWVzYS5oIGV4aXN0cy4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ19DSEVDS19MSUIoR0wsIE9TTWVzYUNyZWF0ZUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfT1NNRVNBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ19DSEVDS19MSUIoT1NNZXNhLCBPU01lc2FDcmVhdGVDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgQUNfREVGSU5FKEhBVkVfT1NNRVNBKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWF9QUkVfTElCUz0iJFhfUFJFX0xJQlMgLWxPU01lc2EiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFhfTElCUyAtbFhleHQgLWxYMTEgJFhfRVhUUkFfTElCUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ19NU0dfV0FSTihbT1NNZXNhIG5vdCBmb3VuZCEhXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKIAkJZmkKIAkgICAgIGZpCiAJIGZpCkBAIC0xMzQ0LDcgKzEzNDgsNyBAQAogaWYgdGVzdCAiJHdpbmVfY3Zfb3BlbmdsX3ZlcnNpb25fdGhyZWFkc2FmZSIgPSAieWVzIiAtYSAkT1BFTkdMID0gInllcyIKIHRoZW4KICAgZWNobwotICBlY2hvICIqKiogV2FybmluZzogeW91IGV4cGxpY2l0ZWx5IGxpbmtlZCBpbiBhIHRocmVhZC1zYWZlIE9wZW5HTCB2ZXJzaW9uLiBJZiB5b3UiCisgIGVjaG8gIioqKiBXYXJuaW5nOiB5b3UgZXhwbGljaXRseSBsaW5rZWQgaW4gYSB0aHJlYWQtc2FmZSBPcGVuR0wgdmVyc2lvbi4gSWYgeW91IgogICBlY2hvICIqKiogZXhwZXJpZW5jZSB1bnVzdWFsIGNyYXNoZXMgb24gRGlyZWN0RHJhdyBnYW1lcywgdHJ5IGZpcnN0IHRvIGRpc2FibGUgT3BlbkdMIgogICBlY2hvICIqKiogc3VwcG9ydCBiZWZvcmUgcmVwb3J0aW5nIGJ1Z3MuIgogZmkKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvTWFrZWZpbGUuaW4gYi9kbGxzL2RkcmF3L01ha2VmaWxlLmluCmluZGV4IGZjZGM1OTQuLmE3NDU3YzYgMTAwNjQ0Ci0tLSBhL2RsbHMvZGRyYXcvTWFrZWZpbGUuaW4KKysrIGIvZGxscy9kZHJhdy9NYWtlZmlsZS5pbgpAQCAtNCw1MSArNCw0MiBAQAogVlBBVEggICAgID0gQHNyY2RpckAKIE1PRFVMRSAgICA9IGRkcmF3CiBFWFRSQUxJQlMgPSAkKExJQlVVSUQpCi1TT1ZFUlNJT04gPSAxLjAKIElNUE9SVFMgICA9IHVzZXIzMiB4MTFkcnYgZ2RpMzIga2VybmVsMzIKIAotTUVTQV9TUkNTID0gXAorT1BFTkdMRklMRVMgPSBcCiAJZDNkY29tbW9uLmMgXAorCWQzZGRldmljZS9tYWluLmMgXAogCWQzZGRldmljZS9tZXNhLmMgXAogCWQzZGV4ZWN1dGVidWZmZXIuYyBcCiAJZDNkbGlnaHQuYyBcCiAJZDNkbWF0ZXJpYWwuYyBcCiAJZDNkdGV4dHVyZS5jIFwKIAlkM2R2aWV3cG9ydC5jIFwKKwlkaXJlY3QzZC9tYWluLmMgXAogCWRpcmVjdDNkL21lc2EuYyBcCiAJbWVzYS5jCiAKLURHQV9TUkNTID0gXAotCWRkcmF3L2RnYS5jIFwKLQlkcGFsZXR0ZS9kZ2EuYyBcCi0JZHN1cmZhY2UvZGdhLmMgXAotCWRnYS5jCi0KLURHQTJfU1JDUz0gXAotCWRnYTIuYyBcCi0JZHN1cmZhY2UvZGdhMi5jIFwKLQlkZHJhdy9kZ2EyLmMKLQotWEZJTEVTID0gXAotCUBER0FfU1JDU0AgXAotCUBNRVNBX1NSQ1NAIFwKLQlAREdBMl9TUkNTQCBcCi0JZGRyYXcveDExLmMgXAotCWRwYWxldHRlL3gxMS5jIFwKLQlkc3VyZmFjZS94MTEuYyBcCi0JeDExLmMgCi0KIENfU1JDUyA9IFwKLQlAWEZJTEVTQCBcCisJQE9QRU5HTEZJTEVTQCBcCiAJY29udmVydC5jIFwKLQlkM2RkZXZpY2UvbWFpbi5jIFwKIAlkY2xpcHBlci9tYWluLmMgXAorCWRkcmF3L2RnYTIuYyBcCiAJZGRyYXcvbWFpbi5jIFwKLQlkaXJlY3QzZC9tYWluLmMgXAorCWRkcmF3L3RodW5rcy5jIFwKKwlkZHJhdy91c2VyLmMgXAorCWRkcmF3L3h2aWRtb2RlLmMgXAogCWRwYWxldHRlL21haW4uYyBcCisJZHN1cmZhY2UvZGdhMi5jIFwKKwlkc3VyZmFjZS9kaWIuYyBcCisJZHN1cmZhY2UvZGlidGV4dHVyZS5jIFwKKwlkc3VyZmFjZS9mYWtlemJ1ZmZlci5jIFwKIAlkc3VyZmFjZS9tYWluLmMgXAorCWRzdXJmYWNlL3RodW5rcy5jIFwKKwlkc3VyZmFjZS91c2VyLmMgXAorCWRzdXJmYWNlL3duZHByb2MuYyBcCiAJaGVscGVyLmMgXAotCW1haW4uYworCW1haW4uYyBcCisJc3RydWN0X2NvbnZlcnQuYwogCiBFWFRSQVNVQkRJUlMgPSBcCiAJZDNkZGV2aWNlIFwKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvY29udmVydC5jIGIvZGxscy9kZHJhdy9jb252ZXJ0LmMKaW5kZXggMzg2ZTFjNS4uYmNiMDA2MCAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy9jb252ZXJ0LmMKKysrIGIvZGxscy9kZHJhdy9jb252ZXJ0LmMKQEAgLTIyNCwxMiArMjI0LDM2IEBACiAgICAgfQogfQogCi1Db252ZXJ0IE1vZGVFbXVsYXRpb25zWzddID0gewotICB7IHsgMzIsIDI0LCAweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGIH0sIHsgIDI0LCAyNCwgMHhGRjAwMDAsIDB4MDAwMEZGMDAsIDB4MDBGRiB9LCB7IHBpeGVsX2NvbnZlcnRfMzJfdG9fMjQsIE5VTEwgfSB9LAotICB7IHsgMzIsIDI0LCAweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGIH0sIHsgIDgsICA4LCAweDAwLCAweDAwLCAweDAwIH0sIHsgcGl4ZWxfY29udmVydF8zMl90b184LCAgcGFsZXR0ZV9jb252ZXJ0XzI0X3RvXzggfSB9LAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgMTYgYnBwIHRvIDMyIGJwcAorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIHZvaWQgcGl4ZWxfY29udmVydF8xNl90b18zMigKKwl2b2lkICpzcmMsIHZvaWQgKmRzdCwgRFdPUkQgd2lkdGgsIERXT1JEIGhlaWdodCwgTE9ORyBwaXRjaCwKKwlJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWxldHRlCispIHsKKyAgICB1bnNpZ25lZCBpbnQgKmNfc3JjID0gKHVuc2lnbmVkIGludCAqKSBzcmM7CisgICAgdW5zaWduZWQgc2hvcnQgKmNfZHN0ID0gKHVuc2lnbmVkIHNob3J0ICopIGRzdDsKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IGhlaWdodDsgeS0tOyApIHsKKwl1bnNpZ25lZCBpbnQgKiBzcmNsaW5lZW5kID0gY19zcmMrd2lkdGg7CisJd2hpbGUgKGNfc3JjIDwgc3JjbGluZWVuZCApIHsKKwkgICAgKmNfZHN0KysgPSAoKCgqY19zcmMgJiAweEY4MDAwMCkgPj4gOCkgfAorCQkJKCgqY19zcmMgJiAweDAwRkMwMCkgPj4gNSkgfAorCQkJKCgqY19zcmMgJiAweDAwMDBGOCkgPj4gMykpOworCSAgICBjX3NyYysrOworCX0KKwljX3NyYys9KChwaXRjaC80KS13aWR0aCk7CisgICAgfQorfQorCitDb252ZXJ0IE1vZGVFbXVsYXRpb25zWzhdID0geworICB7IHsgMzIsIDI0LCAweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGIH0sIHsgIDI0LCAyNCwgMHhGRjAwMDAsIDB4MDBGRjAwLCAweDAwMDBGRiB9LCB7IHBpeGVsX2NvbnZlcnRfMzJfdG9fMjQsIE5VTEwgfSB9LAogICB7IHsgMzIsIDI0LCAweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGIH0sIHsgIDE2LCAxNiwgMHhGODAwLCAweDA3RTAsIDB4MDAxRiB9LCB7IHBpeGVsX2NvbnZlcnRfMzJfdG9fMTYsIE5VTEwgfSB9LAorICB7IHsgMzIsIDI0LCAweDAwRkYwMDAwLCAweDAwMDBGRjAwLCAweDAwMDAwMEZGIH0sIHsgIDgsICA4LCAweDAwLCAweDAwLCAweDAwIH0sIHsgcGl4ZWxfY29udmVydF8zMl90b184LCAgcGFsZXR0ZV9jb252ZXJ0XzI0X3RvXzggfSB9LAogICB7IHsgMjQsIDI0LCAgIDB4RkYwMDAwLCAgIDB4MDBGRjAwLCAgIDB4MDAwMEZGIH0sIHsgIDgsICA4LCAweDAwLCAweDAwLCAweDAwIH0sIHsgcGl4ZWxfY29udmVydF8yNF90b184LCAgcGFsZXR0ZV9jb252ZXJ0XzI0X3RvXzggfSB9LAogICB7IHsgMTYsIDE1LCAgICAgMHg3QzAwLCAgICAgMHgwM0UwLCAgICAgMHgwMDFGIH0sIHsgIDE2LDE2LCAweGY4MDAsIDB4MDdlMCwgMHgwMDFmIH0sIHsgcGl4ZWxfY29udmVydF8xNV90b18xNiwgIE5VTEwgfSB9LAogICB7IHsgMTYsIDE2LCAgICAgMHhGODAwLCAgICAgMHgwN0UwLCAgICAgMHgwMDFGIH0sIHsgIDgsICA4LCAweDAwLCAweDAwLCAweDAwIH0sIHsgcGl4ZWxfY29udmVydF8xNl90b184LCAgcGFsZXR0ZV9jb252ZXJ0XzE2X3RvXzggfSB9LAogICB7IHsgMTYsIDE1LCAgICAgMHg3QzAwLCAgICAgMHgwM0UwLCAgICAgMHgwMDFGIH0sIHsgIDgsICA4LCAweDAwLCAweDAwLCAweDAwIH0sIHsgcGl4ZWxfY29udmVydF8xNl90b184LCAgcGFsZXR0ZV9jb252ZXJ0XzE1X3RvXzggfSB9LAorICB7IHsgMTYsIDE2LCAgICAgMHhGODAwLCAgICAgMHgwN0UwLCAgICAgMHgwMDFGIH0sIHsgIDMyLCAyNCwgMHgwMEZGMDAwMCwgMHgwMDAwRkYwMCwgMHgwMDAwMDBGRiB9LCB7IHBpeGVsX2NvbnZlcnRfMTZfdG9fMzIsIE5VTEwgfSB9CiB9OwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kM2RfcHJpdmF0ZS5oIGIvZGxscy9kZHJhdy9kM2RfcHJpdmF0ZS5oCmluZGV4IDBiNjMwZjcuLjgyY2RiOTEgMTAwNjQ0Ci0tLSBhL2RsbHMvZGRyYXcvZDNkX3ByaXZhdGUuaAorKysgYi9kbGxzL2RkcmF3L2QzZF9wcml2YXRlLmgKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgIC8qIElEaXJlY3QzRFRleHR1cmUyIGZpZWxkcyAqLwogICAgIHZvaWQqCQkJRDNEZGV2aWNlOyAvKiAodm9pZCAqKSB0byB1c2UgdGhlIHNhbWUgcG9pbnRlcgogCQkJCQkgICAgKiBmb3IgYm90aCBEaXJlY3QzRCBhbmQgRGlyZWN0M0QyICovCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGwqCXN1cmZhY2U7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCoJc3VyZmFjZTsKICAgICBMUFZPSUQJCQlwcml2YXRlOwogfTsKIApAQCAtNTM1LDggKzUzNSw4IEBACiApOwogCiAvKiBBbGwgbm9uLXN0YXRpYyBmdW5jdGlvbnMgJ2V4cG9ydGVkJyBieSB2YXJpb3VzIHN1Yi1vYmplY3RzICovCi1leHRlcm4gTFBESVJFQ1QzRFRFWFRVUkUyIGQzZHRleHR1cmUyX2NyZWF0ZShJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCogc3VyZik7Ci1leHRlcm4gTFBESVJFQ1QzRFRFWFRVUkUgZDNkdGV4dHVyZV9jcmVhdGUoSURpcmVjdERyYXdTdXJmYWNlNEltcGwqIHN1cmYpOworZXh0ZXJuIExQRElSRUNUM0RURVhUVVJFMiBkM2R0ZXh0dXJlMl9jcmVhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZik7CitleHRlcm4gTFBESVJFQ1QzRFRFWFRVUkUgZDNkdGV4dHVyZV9jcmVhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZik7CiAKIGV4dGVybiBMUERJUkVDVDNETElHSFQgZDNkbGlnaHRfY3JlYXRlX2R4MyhJRGlyZWN0M0RJbXBsKiBkM2QxKTsKIGV4dGVybiBMUERJUkVDVDNETElHSFQgZDNkbGlnaHRfY3JlYXRlKElEaXJlY3QzRDJJbXBsKiBkM2QyKTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZDNkZGV2aWNlL21lc2EuYyBiL2RsbHMvZGRyYXcvZDNkZGV2aWNlL21lc2EuYwppbmRleCBhZDNkYzI5Li42M2VhNGU3IDEwMDY0NAotLS0gYS9kbGxzL2RkcmF3L2QzZGRldmljZS9tZXNhLmMKKysrIGIvZGxscy9kZHJhdy9kM2RkZXZpY2UvbWVzYS5jCkBAIC0yOCw3ICsyOCw2IEBACiAjdW5kZWYgSEFWRV9CVUdHWV9NRVNBR0wKIAogI2RlZmluZSBEM0REUFJJVkFURSh4KSBtZXNhX2QzZGRfcHJpdmF0ZSAqb2Rldj0oKG1lc2FfZDNkZF9wcml2YXRlKil4LT5wcml2YXRlKQotI2RlZmluZSBERFBSSVZBVEUoeCkgeDExX2RkX3ByaXZhdGUgKmRkcHJpdj0oKHgxMV9kZF9wcml2YXRlKikoeCktPmQtPnByaXZhdGUpCiAKICNpZm5kZWYgSEFWRV9HTEVYVF9QUk9UT1RZUEVTCiAvKiBUaGlzIGlzIGZvciBub24tT3BlbkdMIEFCSSBjb21wbGlhbnQgZ2xleHQuaCBoZWFkZXJzIDotKSAqLwpAQCAtNDgsOCArNDcsOCBAQAogICoJCQkJT3BlbkdMIHN0YXRpYyBmdW5jdGlvbnMKICAqLwogc3RhdGljIHZvaWQgc2V0X2NvbnRleHQoSURpcmVjdDNERGV2aWNlMkltcGwqIFRoaXMpIHsKKyNpZiBDT01QSUxBQkxFCiAgICAgRDNERFBSSVZBVEUoVGhpcyk7Ci0gICAgRERQUklWQVRFKFRoaXMtPnN1cmZhY2UtPnMuZGRyYXcpOwogCiAjaWZkZWYgVVNFX09TTUVTQQogICAgIE9TTWVzYU1ha2VDdXJyZW50KGQzZGRwcml2LT5jdHgsIG9kZXYtPmJ1ZmZlciwgR0xfVU5TSUdORURfQllURSwKQEAgLTU5LDcgKzU4LDggQEAKICAgICBpZiAoZ2xYTWFrZUN1cnJlbnQoZGlzcGxheSxkZHByaXYtPmRyYXdhYmxlLCBvZGV2LT5jdHgpID09IEZhbHNlKSB7CiAJRVJSKCJFcnJvciBpbiBzZXR0aW5nIGN1cnJlbnQgY29udGV4dCAoY29udGV4dCAlcCBkcmF3YWJsZSAlbGQpIVxuIiwKIAkgICAgb2Rldi0+Y3R4LCBkZHByaXYtPmRyYXdhYmxlKTsKLX0KKyAgICB9CisjZW5kaWYKICNlbmRpZgogfQogCkBAIC0xMjMsNiArMTIzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgZmlsbF9kZXZpY2VfY2FwYWJpbGl0aWVzKElEaXJlY3REcmF3SW1wbCogZGRyYXcpIHsKKyNpZiBDT01QSUxBQkxFCiAgIHgxMV9kZF9wcml2YXRlICpwcml2YXRlID0gKHgxMV9kZF9wcml2YXRlICopIGRkcmF3LT5kLT5wcml2YXRlOwogICBjb25zdCBjaGFyICpleHRfc3RyaW5nOwogICBNZXNhX0RldmljZUNhcGFiaWxpdGllcyAqZGV2Y2FwOwpAQCAtMTQwLDYgKzE0MSw3IEBACiAgICAgVFJBQ0UoIkNvbG9yIHRhYmxlIGV4dGVuc2lvbiBub3QgZm91bmQuXG4iKTsKICAgfQogICBMRUFWRV9HTCgpOworI2VuZGlmCiB9CiAKIGludCBkM2RfT3BlbkdMKExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBjYiwgTFBWT0lEIGNvbnRleHQpIHsKQEAgLTIwMSw2ICsyMDMsNyBAQAogICAgIGVsc2UKICAgICAgIFRSQUNFKCJDb250ZXh0IGNyZWF0ZWQgKCVwKVxuIiwgb2Rldi0+Y3R4KTsKICAgICAKKyNpZiBDT01QSUxBQkxFCiAgICAgLyogTm93IG92ZXJyaWRlIHRoZSBzdXJmYWNlJ3MgRmxpcCBtZXRob2QgKGlmIGluIGRvdWJsZSBidWZmZXJpbmcpICovCiAgICAgKCh4MTFfZHNfcHJpdmF0ZSAqKSBzdXJmYWNlLT5wcml2YXRlKS0+b3BlbmdsX2ZsaXAgPSBUUlVFOwogICAgIHsKQEAgLTIxMCw2ICsyMTMsNyBAQAogCSAgaWYgKGNoYWluLT5zdXJmYWNlc1tpXS0+cy5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX0ZMSVApCiAJICAgICAgKCh4MTFfZHNfcHJpdmF0ZSAqKSBjaGFpbi0+c3VyZmFjZXNbaV0tPnByaXZhdGUpLT5vcGVuZ2xfZmxpcCA9IFRSVUU7CiAgICAgfQorI2VuZGlmCiAKICNlbmRpZgogICAgIG9kZXYtPnJzLnNyYyA9IEdMX09ORTsKQEAgLTI5NSwyMSArMjk5LDIxIEBACiAgIAogICBUUkFDRSgiRW51bWVyYXRpbmcgR0xfUkdCQSB1bnBhY2tlZCAoMzIpXG4iKTsKICAgcGZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCIHwgRERQRl9BTFBIQVBJWEVMUzsKLSAgcGZvcm1hdC0+dS5kd1JHQkJpdENvdW50ID0gMzI7Ci0gIHBmb3JtYXQtPnUxLmR3UkJpdE1hc2sgPSAgICAgICAgIDB4RkYwMDAwMDA7Ci0gIHBmb3JtYXQtPnUyLmR3R0JpdE1hc2sgPSAgICAgICAgIDB4MDBGRjAwMDA7Ci0gIHBmb3JtYXQtPnUzLmR3QkJpdE1hc2sgPSAgICAgICAgMHgwMDAwRkYwMDsKLSAgcGZvcm1hdC0+dTQuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDAwMDAwMEZGOworICBwZm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMzI7CisgIHBmb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAgICAgICAgIDB4RkYwMDAwMDA7CisgIHBmb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAgICAgICAgIDB4MDBGRjAwMDA7CisgIHBmb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAgICAgICAgMHgwMDAwRkYwMDsKKyAgcGZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDAwMDAwMEZGOwogICBpZiAoY2IoJnNkZXNjLCBjb250ZXh0KSA9PSAwKQogICAgIHJldHVybiBERF9PSzsKIAogICBUUkFDRSgiRW51bWVyYXRpbmcgR0xfUkdCIHVucGFja2VkICgyNClcbiIpOwogICBwZm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7Ci0gIHBmb3JtYXQtPnUuZHdSR0JCaXRDb3VudCA9IDI0OwotICBwZm9ybWF0LT51MS5kd1JCaXRNYXNrID0gIDB4MDBGRjAwMDA7Ci0gIHBmb3JtYXQtPnUyLmR3R0JpdE1hc2sgPSAgMHgwMDAwRkYwMDsKLSAgcGZvcm1hdC0+dTMuZHdCQml0TWFzayA9IDB4MDAwMDAwRkY7Ci0gIHBmb3JtYXQtPnU0LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwMDAwMDAwMDsKKyAgcGZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDI0OworICBwZm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gIDB4MDBGRjAwMDA7CisgIHBmb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAgMHgwMDAwRkYwMDsKKyAgcGZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAwMDAwRkY7CisgIHBmb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwMDAwMDAwMDsKICAgaWYgKGNiKCZzZGVzYywgY29udGV4dCkgPT0gMCkKICAgICByZXR1cm4gRERfT0s7CiAKQEAgLTMxOCw2MiArMzIyLDYyIEBACiAgICAgIHNvIHRoYXQgZnV0dXJlIHZlcnNpb24gd2lsbCB3b3JrIGdyZWF0LiAqLwogICBUUkFDRSgiRW51bWVyYXRpbmcgR0xfUkdCIHBhY2tlZCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAoMTYpXG4iKTsKICAgcGZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwotICBwZm9ybWF0LT51LmR3UkdCQml0Q291bnQgPSAxNjsKLSAgcGZvcm1hdC0+dTEuZHdSQml0TWFzayA9ICAweDAwMDBGODAwOwotICBwZm9ybWF0LT51Mi5kd0dCaXRNYXNrID0gIDB4MDAwMDA3RTA7Ci0gIHBmb3JtYXQtPnUzLmR3QkJpdE1hc2sgPSAweDAwMDAwMDFGOwotICBwZm9ybWF0LT51NC5kd1JHQkFscGhhQml0TWFzayA9IDB4MDAwMDAwMDA7CisgIHBmb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKKyAgcGZvcm1hdC0+dTIuZHdSQml0TWFzayA9ICAweDAwMDBGODAwOworICBwZm9ybWF0LT51My5kd0dCaXRNYXNrID0gIDB4MDAwMDA3RTA7CisgIHBmb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMDAwMDFGOworICBwZm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDAwMDAwMDA7CiAgIGlmIChjYigmc2Rlc2MsIGNvbnRleHQpID09IDApCiAgICAgcmV0dXJuIEREX09LOwogCiAgIFRSQUNFKCJFbnVtZXJhdGluZyBHTF9SR0JBIHBhY2tlZCBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICgxNilcbiIpOwogICBwZm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0IgfCBERFBGX0FMUEhBUElYRUxTOwotICBwZm9ybWF0LT51LmR3UkdCQml0Q291bnQgPSAxNjsKLSAgcGZvcm1hdC0+dTEuZHdSQml0TWFzayA9ICAgICAgICAgMHgwMDAwRjgwMDsKLSAgcGZvcm1hdC0+dTIuZHdHQml0TWFzayA9ICAgICAgICAgMHgwMDAwMDdDMDsKLSAgcGZvcm1hdC0+dTMuZHdCQml0TWFzayA9ICAgICAgICAweDAwMDAwMDNFOwotICBwZm9ybWF0LT51NC5kd1JHQkFscGhhQml0TWFzayA9IDB4MDAwMDAwMDE7CisgIHBmb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKKyAgcGZvcm1hdC0+dTIuZHdSQml0TWFzayA9ICAgICAgICAgMHgwMDAwRjgwMDsKKyAgcGZvcm1hdC0+dTMuZHdHQml0TWFzayA9ICAgICAgICAgMHgwMDAwMDdDMDsKKyAgcGZvcm1hdC0+dTQuZHdCQml0TWFzayA9ICAgICAgICAweDAwMDAwMDNFOworICBwZm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDAwMDAwMDE7CiAgIGlmIChjYigmc2Rlc2MsIGNvbnRleHQpID09IDApCiAgICAgcmV0dXJuIEREX09LOwogCiAgIFRSQUNFKCJFbnVtZXJhdGluZyBHTF9SR0JBIHBhY2tlZCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICgxNilcbiIpOwogICBwZm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0IgfCBERFBGX0FMUEhBUElYRUxTOwotICBwZm9ybWF0LT51LmR3UkdCQml0Q291bnQgPSAxNjsKLSAgcGZvcm1hdC0+dTEuZHdSQml0TWFzayA9ICAgICAgICAgMHgwMDAwRjAwMDsKLSAgcGZvcm1hdC0+dTIuZHdHQml0TWFzayA9ICAgICAgICAgMHgwMDAwMEYwMDsKLSAgcGZvcm1hdC0+dTMuZHdCQml0TWFzayA9ICAgICAgICAweDAwMDAwMEYwOwotICBwZm9ybWF0LT51NC5kd1JHQkFscGhhQml0TWFzayA9IDB4MDAwMDAwMEY7CisgIHBmb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKKyAgcGZvcm1hdC0+dTIuZHdSQml0TWFzayA9ICAgICAgICAgMHgwMDAwRjAwMDsKKyAgcGZvcm1hdC0+dTMuZHdHQml0TWFzayA9ICAgICAgICAgMHgwMDAwMEYwMDsKKyAgcGZvcm1hdC0+dTQuZHdCQml0TWFzayA9ICAgICAgICAweDAwMDAwMEYwOworICBwZm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDAwMDAwMEY7CiAgIGlmIChjYigmc2Rlc2MsIGNvbnRleHQpID09IDApCiAgICAgcmV0dXJuIEREX09LOwogCiAgIFRSQUNFKCJFbnVtZXJhdGluZyBHTF9SR0IgcGFja2VkIEdMX1VOU0lHTkVEX0JZVEVfM18zXzIgKDgpXG4iKTsKICAgcGZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwotICBwZm9ybWF0LT51LmR3UkdCQml0Q291bnQgPSA4OwotICBwZm9ybWF0LT51MS5kd1JCaXRNYXNrID0gICAgICAgICAweDAwMDBGODAwOwotICBwZm9ybWF0LT51Mi5kd0dCaXRNYXNrID0gICAgICAgICAweDAwMDAwN0MwOwotICBwZm9ybWF0LT51My5kd0JCaXRNYXNrID0gICAgICAgIDB4MDAwMDAwM0U7Ci0gIHBmb3JtYXQtPnU0LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwMDAwMDAwMTsKKyAgcGZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDg7CisgIHBmb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAgICAgICAgIDB4MDAwMEY4MDA7CisgIHBmb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAgICAgICAgIDB4MDAwMDA3QzA7CisgIHBmb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAgICAgICAgMHgwMDAwMDAzRTsKKyAgcGZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDAwMDAwMDAxOwogICBpZiAoY2IoJnNkZXNjLCBjb250ZXh0KSA9PSAwKQogICAgIHJldHVybiBERF9PSzsKICNlbmRpZgogCiAgIFRSQUNFKCJFbnVtZXJhdGluZyBHTF9BUkdCIChubyBkaXJlY3QgT3BlbkdMIGVxdWl2YWxlbnQgLSBjb252ZXJzaW9uIG5lZWRlZClcbiIpOwogICBwZm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0IgfCBERFBGX0FMUEhBUElYRUxTOwotICBwZm9ybWF0LT51LmR3UkdCQml0Q291bnQgPSAxNjsKLSAgcGZvcm1hdC0+dTEuZHdSQml0TWFzayA9ICAgICAgICAgMHgwMDAwN0MwMDsKLSAgcGZvcm1hdC0+dTIuZHdHQml0TWFzayA9ICAgICAgICAgMHgwMDAwMDNFMDsKLSAgcGZvcm1hdC0+dTMuZHdCQml0TWFzayA9ICAgICAgICAgMHgwMDAwMDAxRjsKLSAgcGZvcm1hdC0+dTQuZHdSR0JBbHBoYUJpdE1hc2sgPSAgMHgwMDAwODAwMDsKKyAgcGZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDE2OworICBwZm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gICAgICAgICAweDAwMDA3QzAwOworICBwZm9ybWF0LT51My5kd0dCaXRNYXNrID0gICAgICAgICAweDAwMDAwM0UwOworICBwZm9ybWF0LT51NC5kd0JCaXRNYXNrID0gICAgICAgICAweDAwMDAwMDFGOworICBwZm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9ICAweDAwMDA4MDAwOwogICBpZiAoY2IoJnNkZXNjLCBjb250ZXh0KSA9PSAwKQogICAgIHJldHVybiBERF9PSzsgIAogICAKICAgVFJBQ0UoIkVudW1lcmF0aW5nIFBhbGV0dGVkICg4KVxuIik7CiAgIHBmb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1BBTEVUVEVJTkRFWEVEODsKLSAgcGZvcm1hdC0+dS5kd1JHQkJpdENvdW50ID0gODsKLSAgcGZvcm1hdC0+dTEuZHdSQml0TWFzayA9ICAweDAwMDAwMDAwOwotICBwZm9ybWF0LT51Mi5kd0dCaXRNYXNrID0gIDB4MDAwMDAwMDA7Ci0gIHBmb3JtYXQtPnUzLmR3QkJpdE1hc2sgPSAweDAwMDAwMDAwOwotICBwZm9ybWF0LT51NC5kd1JHQkFscGhhQml0TWFzayA9IDB4MDAwMDAwMDA7CisgIHBmb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSA4OworICBwZm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gIDB4MDAwMDAwMDA7CisgIHBmb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAgMHgwMDAwMDAwMDsKKyAgcGZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAwMDAwMDA7CisgIHBmb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwMDAwMDAwMDsKICAgaWYgKGNiKCZzZGVzYywgY29udGV4dCkgPT0gMCkKICAgICByZXR1cm4gRERfT0s7CiAgIApAQCAtOTM2LDcgKzk0MCw3IEBACiAgICAgZ2xDbGVhckNvbG9yKDAuMCwgMC4wLCAwLjAsIDAuMCk7CiAgICAgZ2xDb2xvcjNmKDEuMCwgMS4wLCAxLjApOwogICAgIAotICAgIGZpbGxfZGV2aWNlX2NhcGFiaWxpdGllcygoSURpcmVjdERyYXdJbXBsICopIHN1cmZhY2UtPnMuZGRyYXcpOworICAgIGZpbGxfZGV2aWNlX2NhcGFiaWxpdGllcygoSURpcmVjdERyYXdJbXBsICopIHN1cmZhY2UtPmRkcmF3X293bmVyKTsKIAogICAgIHJldHVybiAxOwogICB9CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2QzZHRleHR1cmUuYyBiL2RsbHMvZGRyYXcvZDNkdGV4dHVyZS5jCmluZGV4IDMwMTM5NTYuLjczYjZmNmQgMTAwNjQ0Ci0tLSBhL2RsbHMvZGRyYXcvZDNkdGV4dHVyZS5jCisrKyBiL2RsbHMvZGRyYXcvZDNkdGV4dHVyZS5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlUZXh0dXJlMiBDcmVhdGlvbiBmdW5jdGlvbnMKICAqLwotTFBESVJFQ1QzRFRFWFRVUkUyIGQzZHRleHR1cmUyX2NyZWF0ZShJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCogc3VyZikKK0xQRElSRUNUM0RURVhUVVJFMiBkM2R0ZXh0dXJlMl9jcmVhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZikKIHsKICAgSURpcmVjdDNEVGV4dHVyZTJJbXBsKiB0ZXg7CiAgIApAQCAtMTE3LDcgKzExNyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJVGV4dHVyZSBDcmVhdGlvbiBmdW5jdGlvbnMKICAqLwotTFBESVJFQ1QzRFRFWFRVUkUgZDNkdGV4dHVyZV9jcmVhdGUoSURpcmVjdERyYXdTdXJmYWNlNEltcGwqIHN1cmYpCitMUERJUkVDVDNEVEVYVFVSRSBkM2R0ZXh0dXJlX2NyZWF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmKQogewogICBJRGlyZWN0M0RUZXh0dXJlMkltcGwqIHRleDsKICAgCkBAIC0xNDQsMTAgKzE0NCwxMCBAQAogICBUUkFDRSgiKCVwKSA6IGNvbG9ya2V5IGNhbGxiYWNrXG4iLCB0ZXh0dXJlKTsKIAogICAvKiBHZXQgdGhlIHRleHR1cmUgZGVzY3JpcHRpb24gKi8KLSAgdGV4X2QgPSAmKHRleHR1cmUtPnN1cmZhY2UtPnMuc3VyZmFjZV9kZXNjKTsKKyAgdGV4X2QgPSAoRERTVVJGQUNFREVTQyAqKSYodGV4dHVyZS0+c3VyZmFjZS0+c3VyZmFjZV9kZXNjKTsKICAgYnBwID0gKHRleF9kLT5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfUEFMRVRURUlOREVYRUQ4ID8KIAkgMSAvKiA4IGJpdCBvZiBwYWxldHRlIGluZGV4ICovOgotCSB0ZXhfZC0+ZGRwZlBpeGVsRm9ybWF0LnUuZHdSR0JCaXRDb3VudCAvIDggLyogUkdCIGJpdHMgZm9yIGVhY2ggY29sb3JzICovICk7CisJIHRleF9kLT5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCAvIDggLyogUkdCIGJpdHMgZm9yIGVhY2ggY29sb3JzICovICk7CiAgIAogICAvKiBOb3csIHNhdmUgdGhlIGN1cnJlbnQgdGV4dHVyZSAqLwogICBFTlRFUl9HTCgpOwpAQCAtMTY0LDE1ICsxNjQsMTUgQEAKICAgaWYgKHRleF9kLT5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfUEFMRVRURUlOREVYRUQ4KSB7CiAgICAgRklYTUUoIlRvZG8gUGFsZXR0ZWRcbiIpOwogICB9IGVsc2UgaWYgKHRleF9kLT5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfUkdCKSB7Ci0gICAgaWYgKHRleF9kLT5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50ID09IDgpIHsKKyAgICBpZiAodGV4X2QtPmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50ID09IDgpIHsKICAgICAgIEZJWE1FKCJUb2RvIDNfM18yXzBcbiIpOwotICAgIH0gZWxzZSBpZiAodGV4X2QtPmRkcGZQaXhlbEZvcm1hdC51LmR3UkdCQml0Q291bnQgPT0gMTYpIHsKLSAgICAgIGlmICh0ZXhfZC0+ZGRwZlBpeGVsRm9ybWF0LnU0LmR3UkdCQWxwaGFCaXRNYXNrID09IDB4MDAwMDAwMDApIHsKKyAgICB9IGVsc2UgaWYgKHRleF9kLT5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCA9PSAxNikgeworICAgICAgaWYgKHRleF9kLT5kZHBmUGl4ZWxGb3JtYXQudTUuZHdSR0JBbHBoYUJpdE1hc2sgPT0gMHgwMDAwMDAwMCkgewogCS8qIE5vdyB0cmFuc2Zvcm0gdGhlIDVfNl81IGludG8gYSA1XzVfNV8xIHN1cmZhY2UgdG8gc3VwcG9ydCBjb2xvciBrZXlpbmcgKi8KIAl1bnNpZ25lZCBzaG9ydCAqZGVzdCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwKIAkJCQkJCQkgICAgSEVBUF9aRVJPX01FTU9SWSwKIAkJCQkJCQkgICAgdGV4X2QtPmR3V2lkdGggKiB0ZXhfZC0+ZHdIZWlnaHQgKiBicHApOwotCXVuc2lnbmVkIHNob3J0ICpzcmMgPSAodW5zaWduZWQgc2hvcnQgKikgdGV4X2QtPnUxLmxwU3VyZmFjZTsKKwl1bnNpZ25lZCBzaG9ydCAqc3JjID0gKHVuc2lnbmVkIHNob3J0ICopIHRleF9kLT5scFN1cmZhY2U7CiAJaW50IHgsIHk7CiAKIAlmb3IgKHkgPSAwOyB5IDwgdGV4X2QtPmR3SGVpZ2h0OyB5KyspIHsKQEAgLTE5OSwxNiArMTk5LDE2IEBACiAKIAkvKiBGcmVlcyB0aGUgdGVtcG9yYXJ5IHN1cmZhY2UgKi8KIAlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsZGVzdCk7Ci0gICAgICB9IGVsc2UgaWYgKHRleF9kLT5kZHBmUGl4ZWxGb3JtYXQudTQuZHdSR0JBbHBoYUJpdE1hc2sgPT0gMHgwMDAwMDAwMSkgeworICAgICAgfSBlbHNlIGlmICh0ZXhfZC0+ZGRwZlBpeGVsRm9ybWF0LnU1LmR3UkdCQWxwaGFCaXRNYXNrID09IDB4MDAwMDAwMDEpIHsKIAlGSVhNRSgiVG9kbyA1XzVfNV8xXG4iKTsKLSAgICAgIH0gZWxzZSBpZiAodGV4X2QtPmRkcGZQaXhlbEZvcm1hdC51NC5kd1JHQkFscGhhQml0TWFzayA9PSAweDAwMDAwMDBGKSB7CisgICAgICB9IGVsc2UgaWYgKHRleF9kLT5kZHBmUGl4ZWxGb3JtYXQudTUuZHdSR0JBbHBoYUJpdE1hc2sgPT0gMHgwMDAwMDAwRikgewogCUZJWE1FKCJUb2RvIDRfNF80XzRcbiIpOwogICAgICAgfSBlbHNlIHsKIAlFUlIoIlVuaGFuZGxlZCB0ZXh0dXJlIGZvcm1hdCAoYmFkIEFwbGhhIGNoYW5uZWwgZm9yIGEgMTYgYml0IHRleHR1cmUpXG4iKTsKICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHRleF9kLT5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50ID09IDI0KSB7CisgICAgfSBlbHNlIGlmICh0ZXhfZC0+ZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQgPT0gMjQpIHsKICAgICAgIEZJWE1FKCJUb2RvIDhfOF84XzBcbiIpOwotICAgIH0gZWxzZSBpZiAodGV4X2QtPmRkcGZQaXhlbEZvcm1hdC51LmR3UkdCQml0Q291bnQgPT0gMzIpIHsKKyAgICB9IGVsc2UgaWYgKHRleF9kLT5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCA9PSAzMikgewogICAgICAgRklYTUUoIlRvZG8gOF84XzhfOFxuIik7CiAgICAgfSBlbHNlIHsKICAgICAgIEVSUigiVW5oYW5kbGVkIHRleHR1cmUgZm9ybWF0IChiYWQgUkdCIGNvdW50KVxuIik7CkBAIC0zNjYsMTUgKzM2NiwxNSBAQAogICBUUkFDRSgiQ29waWVkIHN1cmZhY2UgJXAgdG8gc3VyZmFjZSAlcFxuIiwgaWxwRDNEVGV4dHVyZTItPnN1cmZhY2UsIFRoaXMtPnN1cmZhY2UpOwogCiAgIC8qIFN1cHByZXNzIHRoZSBBTExPQ09OTE9BRCBmbGFnICovCi0gIFRoaXMtPnN1cmZhY2UtPnMuc3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICY9IH5ERFNDQVBTX0FMTE9DT05MT0FEOworICBUaGlzLT5zdXJmYWNlLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJj0gfkREU0NBUFNfQUxMT0NPTkxPQUQ7CiAKICAgLyogQ29weSBvbmUgc3VyZmFjZSBvbiB0aGUgb3RoZXIgKi8KLSAgZHN0X2QgPSAmKFRoaXMtPnN1cmZhY2UtPnMuc3VyZmFjZV9kZXNjKTsKLSAgc3JjX2QgPSAmKGlscEQzRFRleHR1cmUyLT5zdXJmYWNlLT5zLnN1cmZhY2VfZGVzYyk7CisgIGRzdF9kID0gKEREU1VSRkFDRURFU0MgKikmKFRoaXMtPnN1cmZhY2UtPnN1cmZhY2VfZGVzYyk7CisgIHNyY19kID0gKEREU1VSRkFDRURFU0MgKikmKGlscEQzRFRleHR1cmUyLT5zdXJmYWNlLT5zdXJmYWNlX2Rlc2MpOwogCiAgIC8qIEluc3RhbGwgdGhlIGNhbGxiYWNrcyB0byB0aGUgZGVzdGluYXRpb24gc3VyZmFjZSAqLwotICBUaGlzLT5zdXJmYWNlLT5zLnRleHR1cmUgPSBUaGlzOwotICBUaGlzLT5zdXJmYWNlLT5zLlNldENvbG9yS2V5X2NiID0gU2V0Q29sb3JLZXlfY2I7CisgIFRoaXMtPnN1cmZhY2UtPnRleHR1cmUgPSBUaGlzOworICBUaGlzLT5zdXJmYWNlLT5TZXRDb2xvcktleV9jYiA9IFNldENvbG9yS2V5X2NiOwogICAKICAgaWYgKChzcmNfZC0+ZHdXaWR0aCAhPSBkc3RfZC0+ZHdXaWR0aCkgfHwgKHNyY19kLT5kd0hlaWdodCAhPSBkc3RfZC0+ZHdIZWlnaHQpKSB7CiAgICAgLyogU2hvdWxkIGFsc28gY2hlY2sgZm9yIHNhbWUgcGl4ZWwgZm9ybWF0LCBsUGl0Y2gsIC4uLiAqLwpAQCAtMzg1LDEyICszODUsMTIgQEAKICAgICAvKiBJIHNob3VsZCBwdXQgYSBtYWNybyBmb3IgdGhlIGNhbGN1bHVzIG9mIGJwcCAqLwogICAgIGludCBicHAgPSAoc3JjX2QtPmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzICYgRERQRl9QQUxFVFRFSU5ERVhFRDggPwogCSAgICAgICAxIC8qIDggYml0IG9mIHBhbGV0dGUgaW5kZXggKi86Ci0JICAgICAgIHNyY19kLT5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50IC8gOCAvKiBSR0IgYml0cyBmb3IgZWFjaCBjb2xvcnMgKi8gKTsKKwkgICAgICAgc3JjX2QtPmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50IC8gOCAvKiBSR0IgYml0cyBmb3IgZWFjaCBjb2xvcnMgKi8gKTsKICAgICBHTHVpbnQgY3VycmVudF90ZXh0dXJlOwogCiAgICAgLyogQ29weSB0aGUgbWFpbiBtZW1yeSB0ZXh0dXJlIGludG8gdGhlIHN1cmZhY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgT3BlbkdMCiAgICAgICAgdGV4dHVyZSBvYmplY3QuICovCi0gICAgbWVtY3B5KGRzdF9kLT51MS5scFN1cmZhY2UsIHNyY19kLT51MS5scFN1cmZhY2UsIHNyY19kLT5kd1dpZHRoICogc3JjX2QtPmR3SGVpZ2h0ICogYnBwKTsKKyAgICBtZW1jcHkoZHN0X2QtPmxwU3VyZmFjZSwgc3JjX2QtPmxwU3VyZmFjZSwgc3JjX2QtPmR3V2lkdGggKiBzcmNfZC0+ZHdIZWlnaHQgKiBicHApOwogCiAgICAgRU5URVJfR0woKTsKICAgICAKQEAgLTQwNywxNCArNDA3LDE2IEBACiAgICAgICAvKiAqKioqKioqKioqKioqKioqCiAJIFBhbGV0dGVkIFRleHR1cmUKIAkgKioqKioqKioqKioqKioqKiAqLwotICAgICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsID0gVGhpcy0+c3VyZmFjZS0+cy5wYWxldHRlOworICAgICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsID0gVGhpcy0+c3VyZmFjZS0+cGFsZXR0ZTsKICAgICAgIEJZVEUgdGFibGVbMjU2XVs0XTsKICAgICAgIGludCBpOwogCisjaWYgMAogICAgICAgaWYgKGNvbG9yX3RhYmxlX3F1ZXJpZWQgPT0gRkFMU0UpIHsKIAlwdHJfQ29sb3JUYWJsZUVYVCA9CiAJICAoKE1lc2FfRGV2aWNlQ2FwYWJpbGl0aWVzICopICgoeDExX2RkX3ByaXZhdGUgKikgVGhpcy0+c3VyZmFjZS0+cy5kZHJhdy0+ZC0+cHJpdmF0ZSktPmRldmljZV9jYXBhYmlsaXRpZXMpLT5wdHJfQ29sb3JUYWJsZUVYVDsKICAgICAgIH0KKyNlbmRpZgogICAgICAgCiAgICAgICBpZiAocGFsID09IE5VTEwpIHsKIAlFUlIoIlBhbGV0dGl6ZWQgdGV4dHVyZSBMb2FkaW5nIHdpdGggYSBOVUxMIHBhbGV0dGUgIVxuIik7CkBAIC00MjcsOSArNDI5LDkgQEAKIAl0YWJsZVtpXVswXSA9IHBhbC0+cGFsZW50c1tpXS5wZVJlZDsKIAl0YWJsZVtpXVsxXSA9IHBhbC0+cGFsZW50c1tpXS5wZUdyZWVuOwogCXRhYmxlW2ldWzJdID0gcGFsLT5wYWxlbnRzW2ldLnBlQmx1ZTsKLQlpZiAoKFRoaXMtPnN1cmZhY2UtPnMuc3VyZmFjZV9kZXNjLmR3RmxhZ3MgJiBERFNEX0NLU1JDQkxUKSAmJgotCSAgICAoaSA+PSBUaGlzLT5zdXJmYWNlLT5zLnN1cmZhY2VfZGVzYy5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWUpICYmCi0JICAgIChpIDw9IFRoaXMtPnN1cmZhY2UtPnMuc3VyZmFjZV9kZXNjLmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWUpKQorCWlmICgoVGhpcy0+c3VyZmFjZS0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgJiBERFNEX0NLU1JDQkxUKSAmJgorCSAgICAoaSA+PSBUaGlzLT5zdXJmYWNlLT5zdXJmYWNlX2Rlc2MuZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlKSAmJgorCSAgICAoaSA8PSBUaGlzLT5zdXJmYWNlLT5zdXJmYWNlX2Rlc2MuZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSkpCiAJICB0YWJsZVtpXVszXSA9IDB4MDA7CiAJZWxzZQogCXRhYmxlW2ldWzNdID0gMHhGRjsKQEAgLTQ1NCwxMSArNDU2LDExIEBACiAJCSAgICAgMCwgICAgICAgICAgICAgICAgICAgLyogYm9yZGVyICovCiAJCSAgICAgR0xfQ09MT1JfSU5ERVgsICAgICAgLyogdGV4dHVyZSBmb3JtYXQgKi8KIAkJICAgICBHTF9VTlNJR05FRF9CWVRFLCAgICAvKiB0ZXh0dXJlIHR5cGUgKi8KLQkJICAgICBzcmNfZC0+dTEubHBTdXJmYWNlKTsgLyogdGhlIHRleHR1cmUgKi8KKwkJICAgICBzcmNfZC0+bHBTdXJmYWNlKTsgLyogdGhlIHRleHR1cmUgKi8KICAgICAgIH0gZWxzZSB7CiAJRFdPUkQgKnN1cmZhY2UgPSAoRFdPUkQgKikgSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNyY19kLT5kd1dpZHRoICogc3JjX2QtPmR3SGVpZ2h0ICogc2l6ZW9mKERXT1JEKSk7CiAJRFdPUkQgaTsKLQlCWVRFICpzcmMgPSAoQllURSAqKSBzcmNfZC0+dTEubHBTdXJmYWNlLCAqZHN0ID0gKEJZVEUgKikgc3VyZmFjZTsKKwlCWVRFICpzcmMgPSAoQllURSAqKSBzcmNfZC0+bHBTdXJmYWNlLCAqZHN0ID0gKEJZVEUgKikgc3VyZmFjZTsKIAkKIAlmb3IgKGkgPSAwOyBpIDwgc3JjX2QtPmR3SGVpZ2h0ICogc3JjX2QtPmR3V2lkdGg7IGkrKykgewogCSAgQllURSBjb2xvciA9ICpzcmMrKzsKQEAgLTQ4Myw3ICs0ODUsNyBAQAogICAgICAgLyogKioqKioqKioqKioqCiAJIFJHQiBUZXh0dXJlcwogCSAqKioqKioqKioqKiogKi8KLSAgICAgIGlmIChzcmNfZC0+ZGRwZlBpeGVsRm9ybWF0LnUuZHdSR0JCaXRDb3VudCA9PSA4KSB7CisgICAgICBpZiAoc3JjX2QtPmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50ID09IDgpIHsKIAkvKiAqKioqKioqKioqKioqKioqKioqKioqCiAJICAgR0xfVU5TSUdORURfQllURV8zXzNfMiAKIAkgICAqKioqKioqKioqKioqKioqKioqKioqICovCkBAIC00OTQsOSArNDk2LDkgQEAKIAkJICAgICAwLAogCQkgICAgIEdMX1JHQiwKIAkJICAgICBHTF9VTlNJR05FRF9CWVRFXzNfM18yLAotCQkgICAgIHNyY19kLT51MS5scFN1cmZhY2UpOwotICAgICAgfSBlbHNlIGlmIChzcmNfZC0+ZGRwZlBpeGVsRm9ybWF0LnUuZHdSR0JCaXRDb3VudCA9PSAxNikgewotCWlmIChzcmNfZC0+ZGRwZlBpeGVsRm9ybWF0LnU0LmR3UkdCQWxwaGFCaXRNYXNrID09IDB4MDAwMDAwMDApIHsKKwkJICAgICBzcmNfZC0+bHBTdXJmYWNlKTsKKyAgICAgIH0gZWxzZSBpZiAoc3JjX2QtPmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50ID09IDE2KSB7CisJaWYgKHNyY19kLT5kZHBmUGl4ZWxGb3JtYXQudTUuZHdSR0JBbHBoYUJpdE1hc2sgPT0gMHgwMDAwMDAwMCkgewogCSAgICAKIAkgIC8qIFRleHR1cmUgc25vb3BpbmcgKi8KIAkgIFNOT09QXzU2NTAoKTsKQEAgLTUwOCw4ICs1MTAsOCBAQAogCQkgICAgICAgMCwKIAkJICAgICAgIEdMX1JHQiwKIAkJICAgICAgIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LAotCQkgICAgICAgc3JjX2QtPnUxLmxwU3VyZmFjZSk7Ci0JfSBlbHNlIGlmIChzcmNfZC0+ZGRwZlBpeGVsRm9ybWF0LnU0LmR3UkdCQWxwaGFCaXRNYXNrID09IDB4MDAwMDAwMDEpIHsKKwkJICAgICAgIHNyY19kLT5scFN1cmZhY2UpOworCX0gZWxzZSBpZiAoc3JjX2QtPmRkcGZQaXhlbEZvcm1hdC51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweDAwMDAwMDAxKSB7CiAJICAvKiBUZXh0dXJlIHNub29waW5nICovCiAJICBTTk9PUF81NTUxKCk7CiAJICAKQEAgLTUyMCw4ICs1MjIsOCBAQAogCQkgICAgICAgMCwKIAkJICAgICAgIEdMX1JHQkEsCiAJCSAgICAgICBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xLAotCQkgICAgICAgc3JjX2QtPnUxLmxwU3VyZmFjZSk7Ci0JfSBlbHNlIGlmIChzcmNfZC0+ZGRwZlBpeGVsRm9ybWF0LnU0LmR3UkdCQWxwaGFCaXRNYXNrID09IDB4MDAwMDAwMEYpIHsKKwkJICAgICAgIHNyY19kLT5scFN1cmZhY2UpOworCX0gZWxzZSBpZiAoc3JjX2QtPmRkcGZQaXhlbEZvcm1hdC51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweDAwMDAwMDBGKSB7CiAJICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwKIAkJICAgICAgIDAsCiAJCSAgICAgICBHTF9SR0JBLApAQCAtNTI5LDEyICs1MzEsMTIgQEAKIAkJICAgICAgIDAsCiAJCSAgICAgICBHTF9SR0JBLAogCQkgICAgICAgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwKLQkJICAgICAgIHNyY19kLT51MS5scFN1cmZhY2UpOwotCX0gZWxzZSBpZiAoc3JjX2QtPmRkcGZQaXhlbEZvcm1hdC51NC5kd1JHQkFscGhhQml0TWFzayA9PSAweDAwMDA4MDAwKSB7CisJCSAgICAgICBzcmNfZC0+bHBTdXJmYWNlKTsKKwl9IGVsc2UgaWYgKHNyY19kLT5kZHBmUGl4ZWxGb3JtYXQudTUuZHdSR0JBbHBoYUJpdE1hc2sgPT0gMHgwMDAwODAwMCkgewogCSAgLyogQ29udmVydGluZyB0aGUgMTU1NSBmb3JtYXQgaW4gNTU1MSBwYWNrZWQgKi8KIAkgIFdPUkQgKnN1cmZhY2UgPSAoV09SRCAqKSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc3JjX2QtPmR3V2lkdGggKiBzcmNfZC0+ZHdIZWlnaHQgKiBzaXplb2YoV09SRCkpOwogCSAgRFdPUkQgaTsKLQkgIFdPUkQgKnNyYyA9IChXT1JEICopIHNyY19kLT51MS5scFN1cmZhY2UsICpkc3QgPSBzdXJmYWNlOworCSAgV09SRCAqc3JjID0gKFdPUkQgKikgc3JjX2QtPmxwU3VyZmFjZSwgKmRzdCA9IHN1cmZhY2U7CiAKIAkgIGZvciAoaSA9IDA7IGkgPCBzcmNfZC0+ZHdIZWlnaHQgKiBzcmNfZC0+ZHdXaWR0aDsgaSsrKSB7CiAJICAgICpkc3QrKyA9ICgoKCpzcmMgJiAweDgwMDApID4+IDE1KSB8CkBAIC01NTUsNyArNTU3LDcgQEAKIAl9IGVsc2UgewogCSAgRVJSKCJVbmhhbmRsZWQgdGV4dHVyZSBmb3JtYXQgKGJhZCBBcGxoYSBjaGFubmVsIGZvciBhIDE2IGJpdCB0ZXh0dXJlKVxuIik7CiAJfQotICAgICAgfSBlbHNlIGlmIChzcmNfZC0+ZGRwZlBpeGVsRm9ybWF0LnUuZHdSR0JCaXRDb3VudCA9PSAyNCkgeworICAgICAgfSBlbHNlIGlmIChzcmNfZC0+ZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQgPT0gMjQpIHsKIAlnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwKIAkJICAgICAwLAogCQkgICAgIEdMX1JHQiwKQEAgLTU2Myw4ICs1NjUsOCBAQAogCQkgICAgIDAsCiAJCSAgICAgR0xfUkdCLAogCQkgICAgIEdMX1VOU0lHTkVEX0JZVEUsCi0JCSAgICAgc3JjX2QtPnUxLmxwU3VyZmFjZSk7Ci0gICAgICB9IGVsc2UgaWYgKHNyY19kLT5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50ID09IDMyKSB7CisJCSAgICAgc3JjX2QtPmxwU3VyZmFjZSk7CisgICAgICB9IGVsc2UgaWYgKHNyY19kLT5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCA9PSAzMikgewogCWdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELAogCQkgICAgIDAsCiAJCSAgICAgR0xfUkdCQSwKQEAgLTU3Miw3ICs1NzQsNyBAQAogCQkgICAgIDAsCiAJCSAgICAgR0xfUkdCQSwKIAkJICAgICBHTF9VTlNJR05FRF9CWVRFLAotCQkgICAgIHNyY19kLT51MS5scFN1cmZhY2UpOworCQkgICAgIHNyY19kLT5scFN1cmZhY2UpOwogICAgICAgfSBlbHNlIHsKIAlFUlIoIlVuaGFuZGxlZCB0ZXh0dXJlIGZvcm1hdCAoYmFkIFJHQiBjb3VudClcbiIpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kY2xpcHBlci9tYWluLmMgYi9kbGxzL2RkcmF3L2RjbGlwcGVyL21haW4uYwppbmRleCA1YmI2ZjM3Li4wMjkwYjA0IDEwMDY0NAotLS0gYS9kbGxzL2RkcmF3L2RjbGlwcGVyL21haW4uYworKysgYi9kbGxzL2RkcmF3L2RjbGlwcGVyL21haW4uYwpAQCAtMSw0MyArMSw2NyBAQAogLyoJCURpcmVjdERyYXdDbGlwcGVyIGltcGxlbWVudGF0aW9uCiAgKgogICogQ29weXJpZ2h0IDIwMDAgTWFyY3VzIE1laXNzbmVyCisgKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCiAjaW5jbHVkZSAiZGVidWd0b29scy5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKICNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCisjaW5jbHVkZSAiZGNsaXBwZXIvbWFpbi5oIgorI2luY2x1ZGUgImRkcmF3L21haW4uaCIKIAogREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlEaXJlY3REcmF3Q3JlYXRlQ2xpcHBlciAoRERSQVcuNykKICAqLworCitzdGF0aWMgSUNPTV9WVEFCTEUoSURpcmVjdERyYXdDbGlwcGVyKSBERFJBV19DbGlwcGVyX1ZUYWJsZTsKKwogSFJFU1VMVCBXSU5BUEkgRGlyZWN0RHJhd0NyZWF0ZUNsaXBwZXIoCiAgICAgRFdPUkQgZHdGbGFncywgTFBESVJFQ1REUkFXQ0xJUFBFUiAqbHBscEREQ2xpcHBlciwgTFBVTktOT1dOIHBVbmtPdXRlcgogKSB7Ci0gICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCoqIGlscGxwRERDbGlwcGVyPShJRGlyZWN0RHJhd0NsaXBwZXJJbXBsKiopbHBscEREQ2xpcHBlcjsKLSAgICBUUkFDRSgiKCUwOGx4LCVwLCVwKVxuIiwgZHdGbGFncywgaWxwbHBERENsaXBwZXIsIHBVbmtPdXRlcik7CisgICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCogVGhpczsKKyAgICBUUkFDRSgiKCUwOGx4LCVwLCVwKVxuIiwgZHdGbGFncywgbHBscEREQ2xpcHBlciwgcFVua091dGVyKTsKIAotICAgICppbHBscEREQ2xpcHBlciA9IChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihJRGlyZWN0RHJhd0NsaXBwZXJJbXBsKSk7Ci0gICAgSUNPTV9WVEJMKCppbHBscEREQ2xpcHBlcikgPSAmZGRjbGlwdnQ7Ci0gICAgKCppbHBscEREQ2xpcHBlciktPnJlZiA9IDE7Ci0gICAgKCppbHBscEREQ2xpcHBlciktPmhXbmQgPSAwOyAKKyAgICBpZiAocFVua091dGVyICE9IE5VTEwpIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CisKKyAgICBUaGlzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCisJCSAgICAgc2l6ZW9mKElEaXJlY3REcmF3Q2xpcHBlckltcGwpKTsKKyAgICBpZiAoVGhpcyA9PSBOVUxMKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKworICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdDbGlwcGVyLCBERFJBV19DbGlwcGVyX1ZUYWJsZSk7CisgICAgVGhpcy0+cmVmID0gMTsKKyAgICBUaGlzLT5oV25kID0gMDsgCisgICAgVGhpcy0+ZGRyYXdfb3duZXIgPSBOVUxMOworCisgICAgKmxwbHBERENsaXBwZXIgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd0NsaXBwZXIpOwogICAgIHJldHVybiBERF9PSzsKIH0KIAorLyogVGhpcyBpcyB0aGUgY2xhc3NmYWN0b3J5IGltcGxlbWVudGF0aW9uLiAqLworSFJFU1VMVCBERFJBV19DcmVhdGVEaXJlY3REcmF3Q2xpcHBlcihJVW5rbm93biogcFVua091dGVyLCBSRUZJSUQgcmlpZCwKKwkJCQkgICAgICBMUFZPSUQqIHBwT2JqKQoreworICAgIEhSRVNVTFQgaHI7CisgICAgTFBESVJFQ1REUkFXQ0xJUFBFUiBwQ2xpcDsKKworICAgIGhyID0gRGlyZWN0RHJhd0NyZWF0ZUNsaXBwZXIoMCwgJnBDbGlwLCBwVW5rT3V0ZXIpOworICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7CisKKyAgICBociA9IElEaXJlY3REcmF3Q2xpcHBlcl9RdWVyeUludGVyZmFjZShwQ2xpcCwgcmlpZCwgcHBPYmopOworICAgIElEaXJlY3REcmF3Q2xpcHBlcl9SZWxlYXNlKHBDbGlwKTsKKyAgICByZXR1cm4gaHI7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJSURpcmVjdERyYXdDbGlwcGVyCiAgKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX1NldEh3bmQoCitIUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdDbGlwcGVyX1NldEh3bmQoCiAgICAgTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSwgRFdPUkQgZHdGbGFncywgSFdORCBoV25kCiApIHsKICAgICBJQ09NX1RISVMoSURpcmVjdERyYXdDbGlwcGVySW1wbCxpZmFjZSk7CkBAIC01Miw1MCArNzYsNzcgQEAKICAgICByZXR1cm4gRERfT0s7CiB9CiAKLXN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdDbGlwcGVySW1wbF9SZWxlYXNlKExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UpIHsKK3N0YXRpYyB2b2lkIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfRGVzdHJveShJRGlyZWN0RHJhd0NsaXBwZXJJbXBsKiBUaGlzKQoreworICAgIGlmIChUaGlzLT5kZHJhd19vd25lciAhPSBOVUxMKQorCU1haW5fRGlyZWN0RHJhd19SZW1vdmVDbGlwcGVyKFRoaXMtPmRkcmF3X293bmVyLCBUaGlzKTsKKworICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAgLFRoaXMpOworfQorCit2b2lkIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfRm9yY2VEZXN0cm95KElEaXJlY3REcmF3Q2xpcHBlckltcGwqIFRoaXMpCit7CisgICAgV0FSTigiZGVsZXRpbmcgY2xpcHBlciAlcCB3aXRoIHJlZmNudCAlbHVcbiIsIFRoaXMsIFRoaXMtPnJlZik7CisgICAgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9EZXN0cm95KFRoaXMpOworfQorCitVTE9ORyBXSU5BUEkgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9SZWxlYXNlKExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UpIHsKICAgICBJQ09NX1RISVMoSURpcmVjdERyYXdDbGlwcGVySW1wbCxpZmFjZSk7CiAgICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIFRoaXMtPnJlZiApOwogCi0gICAgVGhpcy0+cmVmLS07Ci0gICAgaWYgKFRoaXMtPnJlZikKLQlyZXR1cm4gVGhpcy0+cmVmOwotICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxUaGlzKTsKLSAgICByZXR1cm4gU19PSzsKKyAgICBpZiAoLS1UaGlzLT5yZWYgPT0gMCkKKyAgICB7CisJTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9EZXN0cm95KFRoaXMpOworCXJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHJldHVybiBUaGlzLT5yZWY7CiB9CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0dldENsaXBMaXN0KAotICAgIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsTFBSRUNUIHJlY3RzLExQUkdOREFUQSBscHJnbixMUERXT1JEIGhtbQorSFJFU1VMVCBXSU5BUEkgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9HZXRDbGlwTGlzdCgKKyAgICBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLExQUkVDVCBwcmNDbGlwLExQUkdOREFUQSBscHJnbixMUERXT1JEIHBkd1NpemUKICkgewogICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0NsaXBwZXJJbXBsLGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLCVwLCVwLCVwKSxzdHViIVxuIixUaGlzLHJlY3RzLGxwcmduLGhtbSk7Ci0gICAgaWYgKGhtbSkgKmhtbT0wOworICAgIEZJWE1FKCIoJXAsJXAsJXAsJXApLHN0dWIhXG4iLFRoaXMscHJjQ2xpcCxscHJnbixwZHdTaXplKTsKKyAgICBhYm9ydCgpOworICAgIGlmIChwZHdTaXplKSAqcGR3U2l6ZT0wOwogICAgIHJldHVybiBERF9PSzsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfU2V0Q2xpcExpc3QoCi0gICAgTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSxMUFJHTkRBVEEgbHByZ24sRFdPUkQgaG1tCitIUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdDbGlwcGVyX1NldENsaXBMaXN0KAorICAgIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsTFBSR05EQVRBIGxwcmduLERXT1JEIHBkd1NpemUKICkgewogICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0NsaXBwZXJJbXBsLGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLCVwLCVsZCksc3R1YiFcbiIsVGhpcyxscHJnbixobW0pOworICAgIEZJWE1FKCIoJXAsJXAsJWxkKSxzdHViIVxuIixUaGlzLGxwcmduLHBkd1NpemUpOworICAgIGFib3J0KCk7CiAgICAgcmV0dXJuIEREX09LOwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdDbGlwcGVySW1wbF9RdWVyeUludGVyZmFjZSgKK0hSRVNVTFQgV0lOQVBJIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfUXVlcnlJbnRlcmZhY2UoCiAgICAgTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSwgUkVGSUlEIHJpaWQsIExQVk9JRCogcHB2T2JqCiApIHsKICAgICBJQ09NX1RISVMoSURpcmVjdERyYXdDbGlwcGVySW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPiglcCwlcCksc3R1YiFcbiIsVGhpcyxyaWlkLHBwdk9iaik7Ci0gICAgcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOworCisgICAgaWYgKElzRXF1YWxHVUlEKCZJSURfSVVua25vd24sIHJpaWQpCisJfHwgSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0RHJhd0NsaXBwZXIsIHJpaWQpKQorICAgIHsKKwkqcHB2T2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdDbGlwcGVyKTsKKwkrK1RoaXMtPnJlZjsKKwlyZXR1cm4gU19PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlyZXR1cm4gRV9OT0lOVEVSRkFDRTsKKyAgICB9CiB9CiAKLXN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdDbGlwcGVySW1wbF9BZGRSZWYoIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UgKQorVUxPTkcgV0lOQVBJIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfQWRkUmVmKCBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlICkKIHsKICAgICBJQ09NX1RISVMoSURpcmVjdERyYXdDbGlwcGVySW1wbCxpZmFjZSk7CiAgICAgVFJBQ0UoIiglcCktPigpIGluY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIFRoaXMtPnJlZiApOwotICAgIHJldHVybiArKyhUaGlzLT5yZWYpOworICAgIHJldHVybiArK1RoaXMtPnJlZjsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfR2V0SFduZCgKK0hSRVNVTFQgV0lOQVBJIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfR2V0SFduZCgKICAgICBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBIV05EKiBoV25kUHRyCiApIHsKICAgICBJQ09NX1RISVMoSURpcmVjdERyYXdDbGlwcGVySW1wbCxpZmFjZSk7CkBAIC0xMDYsMzIgKzE1Nyw0NCBAQAogICAgIHJldHVybiBERF9PSzsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfSW5pdGlhbGl6ZSgKK0hSRVNVTFQgV0lOQVBJIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfSW5pdGlhbGl6ZSgKICAgICAgTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSwgTFBESVJFQ1REUkFXIGxwREQsIERXT1JEIGR3RmxhZ3MKICkgeworICAgIElEaXJlY3REcmF3SW1wbCogcE93bmVyOwogICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0NsaXBwZXJJbXBsLGlmYWNlKTsKICAgICBGSVhNRSgiKCVwKS0+KCVwLDB4JTA4bHgpLHN0dWIhXG4iLFRoaXMsbHBERCxkd0ZsYWdzKTsKKworICAgIGlmIChUaGlzLT5kZHJhd19vd25lciAhPSBOVUxMKSByZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOworCisgICAgcE93bmVyID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0RHJhdywgbHBERCk7CisgICAgVGhpcy0+ZGRyYXdfb3duZXIgPSBwT3duZXI7CisgICAgTWFpbl9EaXJlY3REcmF3X0FkZENsaXBwZXIocE93bmVyLCBUaGlzKTsKKwogICAgIHJldHVybiBERF9PSzsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlckltcGxfSXNDbGlwTGlzdENoYW5nZWQoCitIUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdDbGlwcGVyX0lzQ2xpcExpc3RDaGFuZ2VkKAogICAgIExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsIEJPT0wqIGxwYkNoYW5nZWQKICkgewogICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0NsaXBwZXJJbXBsLGlmYWNlKTsKICAgICBGSVhNRSgiKCVwKS0+KCVwKSxzdHViIVxuIixUaGlzLGxwYkNoYW5nZWQpOworCisgICAgLyogWFhYIFdoYXQgaXMgc2FmZXN0PyAqLworICAgICpscGJDaGFuZ2VkID0gRkFMU0U7CisKICAgICByZXR1cm4gRERfT0s7CiB9CiAKLUlDT01fVlRBQkxFKElEaXJlY3REcmF3Q2xpcHBlcikgZGRjbGlwdnQgPSAKK3N0YXRpYyBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhd0NsaXBwZXIpIEREUkFXX0NsaXBwZXJfVlRhYmxlID0KIHsKICAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9EdW1teVJUVElWQUxVRQotICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGxfUXVlcnlJbnRlcmZhY2UsCi0gICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9BZGRSZWYsCi0gICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9SZWxlYXNlLAotICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGxfR2V0Q2xpcExpc3QsCi0gICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9HZXRIV25kLAotICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGxfSW5pdGlhbGl6ZSwKLSAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsX0lzQ2xpcExpc3RDaGFuZ2VkLAotICAgIElEaXJlY3REcmF3Q2xpcHBlckltcGxfU2V0Q2xpcExpc3QsCi0gICAgSURpcmVjdERyYXdDbGlwcGVySW1wbF9TZXRId25kCisgICAgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9RdWVyeUludGVyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdDbGlwcGVyX0FkZFJlZiwKKyAgICBNYWluX0RpcmVjdERyYXdDbGlwcGVyX1JlbGVhc2UsCisgICAgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9HZXRDbGlwTGlzdCwKKyAgICBNYWluX0RpcmVjdERyYXdDbGlwcGVyX0dldEhXbmQsCisgICAgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9Jbml0aWFsaXplLAorICAgIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfSXNDbGlwTGlzdENoYW5nZWQsCisgICAgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9TZXRDbGlwTGlzdCwKKyAgICBNYWluX0RpcmVjdERyYXdDbGlwcGVyX1NldEh3bmQKIH07CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RjbGlwcGVyL21haW4uaCBiL2RsbHMvZGRyYXcvZGNsaXBwZXIvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDYzZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RjbGlwcGVyL21haW4uaApAQCAtMCwwICsxLDM1IEBACisvKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLiAqLworCisjaWZuZGVmIFdJTkVfRERSQVdfRENMSVBQRVJfTUFJTl9IX0lOQ0xVREVECisjZGVmaW5lIFdJTkVfRERSQVdfRENMSVBQRVJfTUFJTl9IX0lOQ0xVREVECisKK0hSRVNVTFQgV0lOQVBJIERpcmVjdERyYXdDcmVhdGVDbGlwcGVyKERXT1JEIGR3RmxhZ3MsCisJCQkJICAgICAgIExQRElSRUNURFJBV0NMSVBQRVIqIHBwQ2xpcHBlciwKKwkJCQkgICAgICAgTFBVTktOT1dOIHBVbmtPdXRlcik7CitIUkVTVUxUIEREUkFXX0NyZWF0ZUNsaXBwZXIoSVVua25vd24qIHBVbmtPdXRlciwgUkVGSUlEIHJpaWQsIExQVk9JRCogcHBPYmopOwordm9pZCBNYWluX0RpcmVjdERyYXdDbGlwcGVyX0ZvcmNlRGVzdHJveShJRGlyZWN0RHJhd0NsaXBwZXJJbXBsKiBUaGlzKTsKKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd0NsaXBwZXJfU2V0SHduZChMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBEV09SRCBkd0ZsYWdzLAorCQkJICAgICAgIEhXTkQgaFduZCk7CitVTE9ORyBXSU5BUEkgTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9SZWxlYXNlKExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd0NsaXBwZXJfR2V0Q2xpcExpc3QoTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSxMUFJFQ1QgcHJjQ2xpcCwKKwkJCQkgICBMUFJHTkRBVEEgbHByZ24sTFBEV09SRCBwZHdTaXplKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdDbGlwcGVyX1NldENsaXBMaXN0KExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsTFBSR05EQVRBIGxwcmduLAorCQkJCSAgIERXT1JEIHBkd1NpemUpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd0NsaXBwZXJfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSwgUkVGSUlEIHJpaWQsCisJCQkJICAgICAgTFBWT0lEKiBwcHZPYmopOworVUxPTkcgV0lOQVBJIE1haW5fRGlyZWN0RHJhd0NsaXBwZXJfQWRkUmVmKCBMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlICk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3Q2xpcHBlcl9HZXRIV25kKExQRElSRUNURFJBV0NMSVBQRVIgaWZhY2UsIEhXTkQqIGhXbmRQdHIpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd0NsaXBwZXJfSW5pdGlhbGl6ZShMUERJUkVDVERSQVdDTElQUEVSIGlmYWNlLCBMUERJUkVDVERSQVcgbHBERCwKKwkJCQkgIERXT1JEIGR3RmxhZ3MpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd0NsaXBwZXJfSXNDbGlwTGlzdENoYW5nZWQoTFBESVJFQ1REUkFXQ0xJUFBFUiBpZmFjZSwKKwkJCQkJIEJPT0wqIGxwYkNoYW5nZWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGRjb21pbXBsLmggYi9kbGxzL2RkcmF3L2RkY29taW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNGFmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RkY29taW1wbC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qIEEgZmV3IGhlbHBmdWwgbWFjcm9zIGZvciBpbXBsZW1lbnRpbmcgQ09NIG9iamVjdHMuCisgKgorICogQ29weXJpZ2h0IDIwMDAgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEdlbmVyYXRlcyB0aGUgbmFtZSBmb3IgYSB2dGFibGUgcG9pbnRlciBmb3IgYSBnaXZlbiBpbnRlcmZhY2UuICovCisvKiBUaGUgY2Fub25pY2FsIG5hbWUgZm9yIGEgc2luZ2xlIGludGVyZmFjZSBpcyAibHBWdGJsIi4gKi8KKyNkZWZpbmUgSUNPTV9WRklFTERfTVVMVElfTkFNRTIoaWZhY2UpIElURl8jI2lmYWNlCisjZGVmaW5lIElDT01fVkZJRUxEX01VTFRJX05BTUUoaWZhY2UpIElDT01fVkZJRUxEX01VTFRJX05BTUUyKGlmYWNlKQorCisvKiBEZWNsYXJlcyBhIHZ0YWJsZSBwb2ludGVyIGZpZWxkIGluIGFuIGltcGxlbWVudGF0aW9uLiAqLworI2RlZmluZSBJQ09NX1ZGSUVMRF9NVUxUSShpZmFjZSkgXAorCWlmYWNlIElDT01fVkZJRUxEX01VTFRJX05BTUUoaWZhY2UpCisKKy8qIFJldHVybnMgdGhlIG9mZnNldCBvZiBhIHZ0YWJsZSBwb2ludGVyIHdpdGhpbiBhbiBpbXBsZW1lbnRhdGlvbiBvYmplY3QuICovCisjZGVmaW5lIElDT01fVkZJRUxEX09GRlNFVChpbXBsdHlwZSwgaWZhY2UpIFwKKwlvZmZzZXRvZihpbXBsdHlwZSwgSUNPTV9WRklFTERfTVVMVElfTkFNRShpZmFjZSkpCisKKy8qIEdpdmVuIGFuIGludGVyZmFjZSBwb2ludGVyLCByZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBwb2ludGVyLiAqLworI2RlZmluZSBJQ09NX09CSkVDVChpbXBsdHlwZSwgaWZhY2VuYW1lLCBpZmFjZXB0cikJCVwKKwkoaW1wbHR5cGUqKSgoaWZhY2VwdHIpID09IE5VTEwgPyBOVUxMCQkJXAorCQkgIDogKGNoYXIqKShpZmFjZXB0cikgLSBJQ09NX1ZGSUVMRF9PRkZTRVQoaW1wbHR5cGUsaWZhY2VuYW1lKSkKKworI2RlZmluZSBJQ09NX1RISVNfRlJPTShpbXBsdHlwZSwgaWZhY2VuYW1lLCBpZmFjZXB0cikgXAorCWltcGx0eXBlKiBUaGlzID0gSUNPTV9PQkpFQ1QoaW1wbHR5cGUsIGlmYWNlbmFtZSwgaWZhY2VwdHIpCisKKy8qIEdpdmVuIGFuIG9iamVjdCBhbmQgaW50ZXJmYWNlIG5hbWUsIHJldHVybnMgYSBwb2ludGVyIHRvIHRoYXQgaW50ZXJmYWNlLiAqLworI2RlZmluZSBJQ09NX0lOVEVSRkFDRShpbXBsb2JqLCBpZmFjZSkgXAorCSgmKChpbXBsb2JqKS0+SUNPTV9WRklFTERfTVVMVElfTkFNRShpZmFjZSkpKQorCisjZGVmaW5lIElDT01fSU5JVF9JTlRFUkZBQ0UoaW1wbG9iaiwgaWZhY2VuYW1lLCB2dGJsbmFtZSkgXAorCWRvIHsgXAorCSAgKGltcGxvYmopLT5JQ09NX1ZGSUVMRF9NVUxUSV9OQU1FKGlmYWNlbmFtZSkubHBWdGJsID0gJih2dGJsbmFtZSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTV9JTlRFUkZBQ0VfQ0FTVChpbXBsdHlwZSwgaWZuYW1lZnJvbSwgaWZuYW1ldG8sIGlmYWNlcHRyKQlcCisJSUNPTV9JTlRFUkZBQ0UoSUNPTV9PQkpFQ1QoaW1wbHR5cGUsIGlmbmFtZWZyb20sIGlmYWNlcHRyKSwgaWZuYW1ldG8pCmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RkcmF3LnNwZWMgYi9kbGxzL2RkcmF3L2RkcmF3LnNwZWMKaW5kZXggNTg4ODIyYy4uMTY4MmZhNyAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy9kZHJhdy5zcGVjCisrKyBiL2RsbHMvZGRyYXcvZGRyYXcuc3BlYwpAQCAtMSw1ICsxLDYgQEAKIG5hbWUgZGRyYXcKIHR5cGUgd2luMzIKK2luaXQgRERSQVdfRGxsTWFpbgogCiBpbXBvcnQgdXNlcjMyLmRsbAogaW1wb3J0IHgxMWRydi5kbGwKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGRyYXcvZGdhLmMgYi9kbGxzL2RkcmF3L2RkcmF3L2RnYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjk1ZWEzLi4wMDAwMDAwCi0tLSBhL2RsbHMvZGRyYXcvZGRyYXcvZGdhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTQgKzAsMCBAQAotLyoJCURpcmVjdERyYXcgSURpcmVjdERyYXcgWEY4NkRHQSBpbnRlcmZhY2UKLSAqCi0gKiBDb3B5cmlnaHQgMTk5Ny0yMDAwIE1hcmN1cyBNZWlzc25lcgotICogQ29weXJpZ2h0IDE5OTgtMjAwMCBMaW9uZWwgVWxtZXIgKG1vc3Qgb2YgRGlyZWN0M0Qgc3R1ZmYpCi0gKi8KLS8qIFhGODZER0E6Ci0gKiBXaGVuIERpcmVjdFZpZGVvIG1vZGUgaXMgZW5hYmxlZCB5b3UgY2FuIG5vIGxvbmdlciB1c2UgJ25vcm1hbCcgWCAKLSAqIGFwcGxpY2F0aW9ucyBub3IgY2FuIHlvdSBzd2l0Y2ggdG8gYSB2aXJ0dWFsIGNvbnNvbGUuIEFsc28sIGVuYWJsaW5nCi0gKiBvbmx5IHdvcmtzLCBpZiB5b3UgaGF2ZSBzd2l0Y2hlZCB0byB0aGUgc2NyZWVuIHdoZXJlIHRoZSBhcHBsaWNhdGlvbgotICogaXMgcnVubmluZy4KLSAqIFNvbWUgd2F5cyB0byBkZWJ1ZyB0aGlzIHN0dWZmIGFyZToKLSAqIC0gQSB0ZXJtaW5hbCBjb25uZWN0ZWQgdG8gdGhlIHNlcmlhbCBwb3J0LiBDYW4gYmUgYm91Z2h0IHVzZWQgZm9yIGNoZWFwLgotICogICAoVGhpcyBpcyB0aGUgbWV0aG9kIEkgYW0gdXNpbmcuKQotICogLSBBbm90aGVyIG1hY2hpbmUgY29ubmVjdGVkIG92ZXIgc29tZSBraW5kIG9mIG5ldHdvcmsuCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgWEY4NiBER0Egc3BlY2lmaWMgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KLSAqIFdlIGFyZSAnYWxsb3dlZCcgdG8gY2FsbCBYMTEgc3BlY2lmaWMgSURpcmVjdERyYXcgZnVuY3Rpb25zLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgIndpbmVycm9yLmgiCi0jaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKLSNpbmNsdWRlICJkZHJhdy5oIgotI2luY2x1ZGUgImQzZC5oIgotI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKLSNpbmNsdWRlICJvcHRpb25zLmgiCi0KLSNkZWZpbmUgUkVTVE9SRV9TSUdOQUxTCi0KLURFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Ci0KLSNpbmNsdWRlICJkZ2FfcHJpdmF0ZS5oIgotCi1zdHJ1Y3QgSUNPTV9WVEFCTEUoSURpcmVjdERyYXcpCQlkZ2FfZGR2dDsKLXN0cnVjdCBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhdzIpCWRnYV9kZDJ2dDsKLXN0cnVjdCBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhdzQpCWRnYV9kZDR2dDsKLXN0cnVjdCBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhdzcpCWRnYV9kZDd2dDsKLQotI2RlZmluZSBERFBSSVZBVEUoeCkgZGdhX2RkX3ByaXZhdGUgKmRkcHJpdiA9ICgoZGdhX2RkX3ByaXZhdGUqKSh4KS0+ZC0+cHJpdmF0ZSkKLSNkZWZpbmUgRFBQUklWQVRFKHgpIGRnYV9kcF9wcml2YXRlICpkcHByaXYgPSAoKGRnYV9kcF9wcml2YXRlKikoeCktPnByaXZhdGUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlJRGlyZWN0RHJhdwotICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBib3RoIGJ5IERHQSBhbmQgREdBMiBkcml2ZXJzLCB0aHVzIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCi0gICBpcyBub3Qgc2V0IGhlcmUsIGJ1dCBpbiB0aGUgY2FsbGluZyBmdW5jdGlvbiAqLwotSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlU3VyZmFjZV93aXRoX1ZUKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFICpscGRzZiwKLSAgICBJVW5rbm93biAqbHB1bmssIHZvaWQgKnZ0YWJsZQotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGRzdXJmOwotICAgIEREUFJJVkFURShUaGlzKTsKLSAgICBkZ2FfZHNfcHJpdmF0ZSAqZHNwcml2OwotICAgIGludAlpLCBmYmhlaWdodCA9IGRkcHJpdi0+ZmJfaGVpZ2h0OwotCi0gICAgVFJBQ0UoIiglcCktPiglcCwlcCwlcClcbiIsVGhpcyxscGRkc2QsbHBkc2YsbHB1bmspOwotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIF9kdW1wX3N1cmZhY2VfZGVzYyhscGRkc2QpOwotCi0gICAgKmxwZHNmID0gKExQRElSRUNURFJBV1NVUkZBQ0UpSGVhcEFsbG9jKAotICAgIAlHZXRQcm9jZXNzSGVhcCgpLAotCUhFQVBfWkVST19NRU1PUlksCi0Jc2l6ZW9mKElEaXJlY3REcmF3U3VyZmFjZUltcGwpCi0gICAgKTsKLSAgICBkc3VyZiA9ICooSURpcmVjdERyYXdTdXJmYWNlSW1wbCoqKWxwZHNmOwotICAgIGRzdXJmLT5wcml2YXRlID0gKGRnYV9kc19wcml2YXRlKilIZWFwQWxsb2MoCi0JR2V0UHJvY2Vzc0hlYXAoKSwKLQlIRUFQX1pFUk9fTUVNT1JZLAotCXNpemVvZihkZ2FfZHNfcHJpdmF0ZSkKLSAgICApOwotICAgIElDT01fVlRCTChkc3VyZikgPSAoSUNPTV9WVEFCTEUoSURpcmVjdERyYXdTdXJmYWNlKSopdnRhYmxlOwotCi0gICAgZHNwcml2ID0gKGRnYV9kc19wcml2YXRlKilkc3VyZi0+cHJpdmF0ZTsKLSAgICBJRGlyZWN0RHJhdzJfQWRkUmVmKGlmYWNlKTsKLQotICAgIGRzdXJmLT5yZWYgPSAxOwotICAgIGRzdXJmLT5zLmRkcmF3ID0gVGhpczsKLSAgICBkc3VyZi0+cy5wYWxldHRlID0gTlVMTDsKLSAgICBkc3ByaXYtPmZiX2hlaWdodCA9IC0xOyAvKiBUaGlzIGlzIHRvIGhhdmUgbm9uLW9uIHNjcmVlbiBzdXJmYWNlcyBmcmVlZCAqLwotICAgIGRzdXJmLT5zLmxwQ2xpcHBlciA9IE5VTEw7Ci0KLSAgICAvKiBDb3B5IHRoZSBzdXJmYWNlIGRlc2NyaXB0aW9uICovCi0gICAgZHN1cmYtPnMuc3VyZmFjZV9kZXNjID0gKmxwZGRzZDsKLQotICAgIGlmICghKGxwZGRzZC0+ZHdGbGFncyAmIEREU0RfV0lEVEgpKQotCWRzdXJmLT5zLnN1cmZhY2VfZGVzYy5kd1dpZHRoICA9IFRoaXMtPmQtPndpZHRoOwotICAgIGlmICghKGxwZGRzZC0+ZHdGbGFncyAmIEREU0RfSEVJR0hUKSkKLQlkc3VyZi0+cy5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQgPSBUaGlzLT5kLT5oZWlnaHQ7Ci0KLSAgICBkc3VyZi0+cy5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX1dJRFRIfEREU0RfSEVJR0hUOwotCi0gICAgLyogQ2hlY2sgaWYgdGhpcyBhICdwcmltYXJ5IHN1cmZhY2UnIG9yIG5vdCAqLwotICAgIGlmICgobHBkZHNkLT5kd0ZsYWdzICYgRERTRF9DQVBTKSAmJgotCShscGRkc2QtPmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSkpIHsKLQkvKiBUaGlzIGlzIFRIRSBwcmltYXJ5IHN1cmZhY2UgPT4gdGhlcmUgaXMgREdBLXNwZWNpZmljIGNvZGUgKi8KLQotCS8qIEZpbmQgYSB2aWV3cG9ydCAqLwotCWZvciAoaT0wO2k8MzI7aSsrKQotCSAgICBpZiAoIShkZHByaXYtPnZwbWFzayAmICgxPDxpKSkpCi0JCWJyZWFrOwotCVRSQUNFKCJ1c2luZyB2aWV3cG9ydCAlZCBmb3IgYSBwcmltYXJ5IHN1cmZhY2VcbiIsaSk7Ci0JLyogaWYgaSA9PSAzMiBvciBtYXhpbXVtIC4uLiByZXR1cm4gZXJyb3IgKi8KLQlkZHByaXYtPnZwbWFza3w9KDE8PGkpOwotCWxwZGRzZC0+bFBpdGNoID0gZHN1cmYtPnMuc3VyZmFjZV9kZXNjLmxQaXRjaCA9IAotCQlkZHByaXYtPmZiX3dpZHRoKlBGR0VUX0JQUChUaGlzLT5kLT5kaXJlY3RkcmF3X3BpeGVsZm9ybWF0KTsKLQotCWRzdXJmLT5zLnN1cmZhY2VfZGVzYy51MS5scFN1cmZhY2UgPQotCSAgICBkZHByaXYtPmZiX2FkZHIgKyBpKmZiaGVpZ2h0KmxwZGRzZC0+bFBpdGNoOwotCi0JZHNwcml2LT5mYl9oZWlnaHQgPSBpKmZiaGVpZ2h0OwotCi0JLyogQWRkIGZsYWdzIGlmIHRoZXJlIHdlcmUgbm90IHByZXNlbnQgKi8KLQlkc3VyZi0+cy5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX1dJRFRIfEREU0RfSEVJR0hUfEREU0RfUElUQ0h8RERTRF9MUFNVUkZBQ0V8RERTRF9QSVhFTEZPUk1BVDsKLQlkc3VyZi0+cy5zdXJmYWNlX2Rlc2MuZHdXaWR0aCA9IFRoaXMtPmQtPndpZHRoOwotCWRzdXJmLT5zLnN1cmZhY2VfZGVzYy5kd0hlaWdodCA9IFRoaXMtPmQtPmhlaWdodDsKLQlUUkFDRSgicHJpbWFyeSBzdXJmYWNlOiBkd1dpZHRoPSVsZCwgZHdIZWlnaHQ9JWxkLCBsUGl0Y2g9JWxkXG4iLFRoaXMtPmQtPndpZHRoLFRoaXMtPmQtPmhlaWdodCxscGRkc2QtPmxQaXRjaCk7Ci0JLyogV2UgcHV0IG91ciBzdXJmYWNlIGFsd2F5cyBpbiB2aWRlbyBtZW1vcnkgKi8KLQlTRERTQ0FQUyhkc3VyZikgfD0gRERTQ0FQU19WSVNJQkxFfEREU0NBUFNfVklERU9NRU1PUlk7Ci0JZHN1cmYtPnMuc3VyZmFjZV9kZXNjLmRkcGZQaXhlbEZvcm1hdCA9IFRoaXMtPmQtPmRpcmVjdGRyYXdfcGl4ZWxmb3JtYXQ7Ci0JZHN1cmYtPnMuY2hhaW4gPSBOVUxMOwotCi0JaWYgKGxwZGRzZC0+ZHdGbGFncyAmIEREU0RfQkFDS0JVRkZFUkNPVU5UKSB7Ci0JICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsKgliYWNrOwotCSAgICBkZ2FfZHNfcHJpdmF0ZQkJKmJzcHJpdjsKLQkgICAgaW50CWJiYzsKLQotCSAgICBmb3IgKGJiYz1scGRkc2QtPmR3QmFja0J1ZmZlckNvdW50O2JiYy0tOykgewotCSAgICAgICAgaW50IGk7Ci0JICAgICAgCi0JCWJhY2sgPSAoSURpcmVjdERyYXdTdXJmYWNlNEltcGwqKUhlYXBBbGxvYygKLQkJICAgIEdldFByb2Nlc3NIZWFwKCksCi0JCSAgICBIRUFQX1pFUk9fTUVNT1JZLAotCQkgICAgc2l6ZW9mKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsKQotCQkpOwotCQlJRGlyZWN0RHJhdzJfQWRkUmVmKGlmYWNlKTsKLQkJYmFjay0+cmVmID0gMTsKLQkJSUNPTV9WVEJMKGJhY2spID0gKElDT01fVlRBQkxFKElEaXJlY3REcmF3U3VyZmFjZTQpKil2dGFibGU7Ci0JCWJhY2stPnByaXZhdGUgPSBIZWFwQWxsb2MoCi0JCQlHZXRQcm9jZXNzSGVhcCgpLAotCQkJSEVBUF9aRVJPX01FTU9SWSwKLQkJCXNpemVvZihkZ2FfZHNfcHJpdmF0ZSkKLQkJKTsKLQkJYnNwcml2ID0gKGRnYV9kc19wcml2YXRlKiliYWNrLT5wcml2YXRlOwotCi0JCWZvciAoaT0wO2k8MzI7aSsrKQotCQkgICAgaWYgKCEoZGRwcml2LT52cG1hc2sgJiAoMTw8aSkpKQotCQkJYnJlYWs7Ci0JCVRSQUNFKCJ1c2luZyB2aWV3cG9ydCAlZCBmb3IgYmFja2J1ZmZlciAlZFxuIixpLCBiYmMpOwotCQkvKiBpZiBpID09IDMyIG9yIG1heGltdW0gLi4uIHJldHVybiBlcnJvciAqLwotCQlkZHByaXYtPnZwbWFza3w9KDE8PGkpOwotCi0JCWJzcHJpdi0+ZmJfaGVpZ2h0ID0gaSpmYmhlaWdodDsKLQkJLyogQ29weSB0aGUgc3VyZmFjZSBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmcm9udCBidWZmZXIgKi8KLQkJYmFjay0+cy5zdXJmYWNlX2Rlc2MgPSBkc3VyZi0+cy5zdXJmYWNlX2Rlc2M7Ci0JCS8qIENoYW5nZSB0aGUgcGFyYW1ldGVycyB0aGF0IGFyZSBub3QgdGhlIHNhbWUgKi8KLQkJYmFjay0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlID0KLQkJICAgIGRkcHJpdi0+ZmJfYWRkciArIGkqZmJoZWlnaHQqbHBkZHNkLT5sUGl0Y2g7Ci0KLQkJYmFjay0+cy5kZHJhdyA9IFRoaXM7Ci0JCS8qIEFkZCByZWxldmFudCBpbmZvIHRvIGZyb250IGFuZCBiYWNrIGJ1ZmZlcnMgKi8KLQkJLyogRklYTUU6IGJhY2tidWZmZXIvZnJvbnRidWZmZXIgaGFuZGxpbmcgYnJva2VuIGhlcmUsIGJ1dAotCQkgKiB3aWxsIGJlIGZpeGVkIHVwIGluIF9GbGlwKCkuCi0JCSAqLwotCQlTRERTQ0FQUyhkc3VyZikgfD0gRERTQ0FQU19GUk9OVEJVRkZFUjsKLQkJU0REU0NBUFMoYmFjaykgfD0gRERTQ0FQU19GTElQfEREU0NBUFNfQkFDS0JVRkZFUnxERFNDQVBTX1ZJREVPTUVNT1JZOwotCQliYWNrLT5zLnN1cmZhY2VfZGVzYy5kd0ZsYWdzICY9IH5ERFNEX0JBQ0tCVUZGRVJDT1VOVDsKLQkJU0REU0NBUFMoYmFjaykgJj0gfihERFNDQVBTX1ZJU0lCTEV8RERTQ0FQU19QUklNQVJZU1VSRkFDRSk7Ci0JCUlEaXJlY3REcmF3U3VyZmFjZTRfQWRkQXR0YWNoZWRTdXJmYWNlKChMUERJUkVDVERSQVdTVVJGQUNFNCkoKmxwZHNmKSwoTFBESVJFQ1REUkFXU1VSRkFDRTQpYmFjayk7Ci0JICAgIH0KLQl9Ci0gICAgfSBlbHNlIHsKLQkvKiBUaGVyZSBpcyBubyBER0Etc3BlY2lmaWMgY29kZSBoZXJlLi4uCi0JICogR28gdG8gdGhlIGNvbW1vbiBzdXJmYWNlIGNyZWF0aW9uIGZ1bmN0aW9uCi0JICovCi0JcmV0dXJuIGNvbW1vbl9vZmZfc2NyZWVuX0NyZWF0ZVN1cmZhY2UoVGhpcywgZHN1cmYpOwotICAgIH0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXcySW1wbF9DcmVhdGVTdXJmYWNlKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFICpscGRzZiwKLSAgICBJVW5rbm93biAqbHB1bmsKLSkgewotICBIUkVTVUxUIHJldDsKLQotICByZXQgPSBER0FfSURpcmVjdERyYXcySW1wbF9DcmVhdGVTdXJmYWNlX3dpdGhfVlQoaWZhY2UsIGxwZGRzZCwgbHBkc2YsIGxwdW5rLCAmZGdhX2RkczR2dCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3SW1wbF9TZXREaXNwbGF5TW9kZSgKLSAgICBMUERJUkVDVERSQVcgaWZhY2UsRFdPUkQgd2lkdGgsRFdPUkQgaGVpZ2h0LERXT1JEIGRlcHRoCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLGlmYWNlKTsKLSAgICBERFBSSVZBVEUoVGhpcyk7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVsZCwlbGQsJWxkKVxuIiwgVGhpcywgd2lkdGgsIGhlaWdodCwgZGVwdGgpOwotCi0gICAgLyogV2UgaG9wZSBnZXR0aW5nIHRoZSBhc2tlZCBmb3IgZGVwdGggKi8KLSAgICBpZiAoIF9jb21tb25fZGVwdGhfdG9fcGl4ZWxmb3JtYXQoZGVwdGgsaWZhY2UpICE9ICAtMSApIHsKLQkvKiBJLmUuIG5vIHZpc3VhbCBmb3VuZCBvciBlbXVsYXRlZCAqLwotCUVSUigiKHc9JWxkLGg9JWxkLGQ9JWxkKSwgdW5zdXBwb3J0ZWQgZGVwdGghXG4iLHdpZHRoLGhlaWdodCxkZXB0aCk7Ci0JcmV0dXJuIERERVJSX1VOU1VQUE9SVEVETU9ERTsKLSAgICB9Ci0KLSAgICBpZiAoVGhpcy0+ZC0+d2lkdGggPCB3aWR0aCkgewotCUVSUigiU2V0RGlzcGxheU1vZGUodz0lbGQsaD0lbGQsZD0lbGQpLCB3aWR0aCAlbGQgZXhjZWVkcyBmcmFtZWJ1ZmZlciB3aWR0aCAlbGRcbiIsd2lkdGgsaGVpZ2h0LGRlcHRoLHdpZHRoLFRoaXMtPmQtPndpZHRoKTsKLQlyZXR1cm4gRERFUlJfVU5TVVBQT1JURURNT0RFOwotICAgIH0KLSAgICBUaGlzLT5kLT53aWR0aAk9IHdpZHRoOwotICAgIFRoaXMtPmQtPmhlaWdodAk9IGhlaWdodDsKLQotICAgIC8qIGFkanVzdCBmYl9oZWlnaHQsIHNvIHdlIGRvbid0IG92ZXJsYXAgKi8KLSAgICBpZiAoZGRwcml2LT5mYl9oZWlnaHQgPCBoZWlnaHQpCi0JZGRwcml2LT5mYl9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgX2NvbW1vbl9JRGlyZWN0RHJhd0ltcGxfU2V0RGlzcGxheU1vZGUoVGhpcyk7Ci0KLSAgICB4Zjg2dm1vZGVfc2V0ZGlzcGxheW1vZGUod2lkdGgsaGVpZ2h0KTsKLQotICAgIC8qIEZJWE1FOiB0aGlzIGZ1bmN0aW9uIE9WRVJXUklURVMgc2V2ZXJhbCBzaWduYWwgaGFuZGxlcnMuIAotICAgICAqIGNhbiB3ZSBzYXZlIHRoZW0/IGFuZCByZXN0b3JlIHRoZW0gbGF0ZXI/IEluIGEgd2F5IHRoYXQKLSAgICAgKiBpdCB3b3JrcyBmb3IgdGhlIGxpYnJhcnkgdG9vPwotICAgICAqLwotICAgIFRTWEY4NkRHQURpcmVjdFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSxYRjg2REdBRGlyZWN0R3JhcGhpY3MpOwotICAgIFRTWEY4NkRHQVNldFZpZXdQb3J0KGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwwLDApOwotCi0jaWZkZWYgUkVTVE9SRV9TSUdOQUxTCi0gICAgU0lHTkFMX0luaXQoKTsKLSNlbmRpZgotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3MkltcGxfR2V0Q2FwcygKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLExQRERDQVBTIGNhcHMxLExQRERDQVBTIGNhcHMyCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXcySW1wbCxpZmFjZSk7Ci0gICAgRERQUklWQVRFKFRoaXMpOwotCi0gICAgVFJBQ0UoIiglcCktPkdldENhcHMoJXAsJXApXG4iLFRoaXMsY2FwczEsY2FwczIpOwotICAgIGlmICghY2FwczEgJiYgIWNhcHMyKQotICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotICAgIGlmIChjYXBzMSkgewotCWNhcHMxLT5kd1ZpZE1lbVRvdGFsID0gZGRwcml2LT5mYl9tZW1zaXplOwotCWNhcHMxLT5kd0NhcHMgPSAweGZmZmZmZmZmJn4oRERDQVBTX0JBTktTV0lUQ0hFRCk7CQkvKiB3ZSBjYW4gZG8gYW55dGhpbmcgKi8KLQljYXBzMS0+ZGRzQ2Fwcy5kd0NhcHMgPSAweGZmZmZmZmZmOwkvKiB3ZSBjYW4gZG8gYW55dGhpbmcgKi8KLSAgICB9Ci0gICAgaWYgKGNhcHMyKSB7Ci0JY2FwczItPmR3VmlkTWVtVG90YWwgPSBkZHByaXYtPmZiX21lbXNpemU7Ci0JY2FwczItPmR3Q2FwcyA9IDB4ZmZmZmZmZmYmfihERENBUFNfQkFOS1NXSVRDSEVEKTsJCS8qIHdlIGNhbiBkbyBhbnl0aGluZyAqLwotCWNhcHMyLT5kZHNDYXBzLmR3Q2FwcyA9IDB4ZmZmZmZmZmY7CS8qIHdlIGNhbiBkbyBhbnl0aGluZyAqLwotICAgIH0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLSNpZiAwIC8qIE5vdCB1c2VkIGFzIG9mIG5vdy4uLi4gKi8KLXN0YXRpYyB2b2lkIGZpbGxfY2FwcyhMUEREQ0FQUyBjYXBzKSB7Ci0gICAgLyogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBmaWxsIHRoZSBjYXBhYmlsaXRpZXMgb2YgV2luZSdzIEREcmF3Ci0gICAgICogaW1wbGVtZW50YXRpb24uIE5lZWRzIHRvIGJlIGZpeGVkLCB0aG91Z2guLiAqLwotICAgIGlmIChjYXBzID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgY2Fwcy0+ZHdTaXplID0gc2l6ZW9mKCpjYXBzKTsKLSAgICBjYXBzLT5kd0NhcHMgPSBERENBUFNfQUxQSEEgfCBERENBUFNfQkxUIHwgRERDQVBTX0JMVFNUUkVUQ0ggfCBERENBUFNfQkxUQ09MT1JGSUxMIHwgRERDQVBTX0JMVERFUFRIRklMTCB8IEREQ0FQU19DQU5CTFRTWVNNRU0gfCAgRERDQVBTX0NPTE9SS0VZIHwgRERDQVBTX1BBTEVUVEUgLyp8IEREQ0FQU19OT0hBUkRXQVJFKi87Ci0gICAgY2Fwcy0+ZHdDYXBzMiA9IEREQ0FQUzJfQ0VSVElGSUVEIHwgRERDQVBTMl9OT1BBR0VMT0NLUkVRVUlSRUQgfCBERENBUFMyX1dJREVTVVJGQUNFUzsKLSAgICBjYXBzLT5kd0NLZXlDYXBzID0gMHhGRkZGRkZGRjsgLyogU2hvdWxkIHB1dCByZWFsIGNhcHMgaGVyZSBvbmUgZGF5Li4uICovCi0gICAgY2Fwcy0+ZHdGWENhcHMgPSAwOwotICAgIGNhcHMtPmR3RlhBbHBoYUNhcHMgPSAwOwotICAgIGNhcHMtPmR3UGFsQ2FwcyA9IEREUENBUFNfOEJJVCB8IEREUENBUFNfQUxMT1cyNTY7Ci0gICAgY2Fwcy0+ZHdTVkNhcHMgPSAwOwotICAgIGNhcHMtPmR3WkJ1ZmZlckJpdERlcHRocyA9IEREQkRfMTY7Ci0gICAgLyogSSBwdXQgaGVyZSA4IE1vIHNvIHRoYXQgRDNEIGFwcGxpY2F0aW9ucyB3aWxsIGJlbGlldmUgdGhleSBoYXZlIGVub3VnaAotICAgICAqIG1lbW9yeSB0byBwdXQgdGV4dHVyZXMgaW4gdmlkZW8gbWVtb3J5LgotICAgICAqIEJUVywgaXMgdGhpcyBvbmx5IGZyYW1lIGJ1ZmZlciBtZW1vcnkgb3IgYWxzbyB0ZXh0dXJlIG1lbW9yeSAoZm9yIFZvb2RvbwotICAgICAqIGJvYXJkcyBmb3IgZXhhbXBsZSkgPwotICAgICAqLwotICAgIGNhcHMtPmR3VmlkTWVtVG90YWwgPSA4MTkyICogMTAyNDsKLSAgICBjYXBzLT5kd1ZpZE1lbUZyZWUgPSA4MTkyICogMTAyNDsKLSAgICAvKiBUaGVzZSBhcmUgYWxsIHRoZSBzdXBwb3J0ZWQgY2FwYWJpbGl0aWVzIG9mIHRoZSBzdXJmYWNlcyAqLwotICAgIGNhcHMtPmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19BTFBIQSB8IEREU0NBUFNfQkFDS0JVRkZFUiB8IEREU0NBUFNfQ09NUExFWCB8IEREU0NBUFNfRkxJUCB8Ci0gICAgRERTQ0FQU19GUk9OVEJVRkZFUiB8IEREU0NBUFNfTE9DQUxWSURNRU0gfCBERFNDQVBTX05PTkxPQ0FMVklETUVNIHwgRERTQ0FQU19PRkZTQ1JFRU5QTEFJTiB8Ci0gICAgICAvKkREU0NBUFNfT1ZFUkxBWSB8Ki8gRERTQ0FQU19QQUxFVFRFIHwgRERTQ0FQU19QUklNQVJZU1VSRkFDRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZIHwKLQlERFNDQVBTX1ZJREVPTUVNT1JZIHwgRERTQ0FQU19WSVNJQkxFOwotI2lmZGVmIEhBVkVfT1BFTkdMCi0gICAgY2Fwcy0+ZHdDYXBzIHw9IEREQ0FQU18zRCB8IEREQ0FQU19aQkxUUzsKLSAgICBjYXBzLT5kd0NhcHMyIHw9ICBERENBUFMyX05PMkREVVJJTkczRFNDRU5FOwotICAgIGNhcHMtPmRkc0NhcHMuZHdDYXBzIHw9IEREU0NBUFNfM0RERVZJQ0UgfCBERFNDQVBTX01JUE1BUCB8IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfWkJVRkZFUjsKLSNlbmRpZgotfQotI2VuZGlmCi0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXcySW1wbF9DcmVhdGVQYWxldHRlKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsRFdPUkQgZHdGbGFncyxMUFBBTEVUVEVFTlRSWSBwYWxlbnQsTFBESVJFQ1REUkFXUEFMRVRURSAqbHBkZHBhbCxMUFVOS05PV04gbHB1bmsKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKglkZHBhbDsKLSAgICBkZ2FfZHBfcHJpdmF0ZQkJKmRwcHJpdjsKLSAgICBIUkVTVUxUCQkJcmVzOwotICAgIGludCAJCQl4c2l6ZSA9IDAsaTsKLQotICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJXAsJXAsJXApXG4iLFRoaXMsZHdGbGFncyxwYWxlbnQsbHBkZHBhbCxscHVuayk7Ci0gICAgcmVzID0gY29tbW9uX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlUGFsZXR0ZShUaGlzLGR3RmxhZ3MscGFsZW50LChJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiopbHBkZHBhbCxscHVuaywmeHNpemUpOwotICAgIGlmIChyZXMgIT0gMCkKLQlyZXR1cm4gcmVzOwotICAgIGRkcGFsID0gKihJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiopbHBkZHBhbDsKLSAgICBkZHBhbC0+cHJpdmF0ZSA9IEhlYXBBbGxvYygKLQlHZXRQcm9jZXNzSGVhcCgpLAotCUhFQVBfWkVST19NRU1PUlksCi0Jc2l6ZW9mKGRnYV9kcF9wcml2YXRlKQotICAgICk7Ci0gICAgZHBwcml2ID0gKGRnYV9kcF9wcml2YXRlKilkZHBhbC0+cHJpdmF0ZTsKLQotICAgIElDT01fVlRCTChkZHBhbCk9ICZkZ2FfZGRwYWx2dDsKLSAgICBpZiAoVGhpcy0+ZC0+ZGlyZWN0ZHJhd19waXhlbGZvcm1hdC51LmR3UkdCQml0Q291bnQ8PTgpIHsKLQlkcHByaXYtPmNtID0gVFNYQ3JlYXRlQ29sb3JtYXAoZGlzcGxheSxEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSxEZWZhdWx0VmlzdWFsT2ZTY3JlZW4oWDExRFJWX0dldFhTY3JlZW4oKSksQWxsb2NBbGwpOwotICAgIH0gZWxzZSB7Ci0JRVJSKCJ3aHkgYXJlIHdlIGRvaW5nIENyZWF0ZVBhbGV0dGUgaW4gaGkvdHJ1ZWNvbG9yP1xuIik7Ci0JZHBwcml2LT5jbSA9IDA7Ci0gICAgfQotICAgIGlmIChkcHByaXYtPmNtICYmIHhzaXplKSB7Ci0JZm9yIChpPTA7aTx4c2l6ZTtpKyspIHsKLQkgICAgWENvbG9yIHhjOwotCi0JICAgIHhjLnJlZCA9IGRkcGFsLT5wYWxlbnRzW2ldLnBlUmVkPDw4OwotCSAgICB4Yy5ibHVlID0gZGRwYWwtPnBhbGVudHNbaV0ucGVCbHVlPDw4OwotCSAgICB4Yy5ncmVlbiA9IGRkcGFsLT5wYWxlbnRzW2ldLnBlR3JlZW48PDg7Ci0JICAgIHhjLmZsYWdzID0gRG9SZWR8RG9CbHVlfERvR3JlZW47Ci0JICAgIHhjLnBpeGVsID0gaTsKLQkgICAgVFNYU3RvcmVDb2xvcihkaXNwbGF5LGRwcHJpdi0+Y20sJnhjKTsKLQl9Ci0gICAgfQotICAgIHJldHVybiBERF9PSzsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhdzJJbXBsX1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVcyIGlmYWNlKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICAgIFRSQUNFKCIoJXApLT4oKVxuIixUaGlzKTsKLSAgICBTbGVlcCgxMDAwKTsKLSAgICBUU1hGODZER0FEaXJlY3RWaWRlbyhkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksMCk7Ci0jaWZkZWYgUkVTVE9SRV9TSUdOQUxTCi0gICAgU0lHTkFMX0luaXQoKTsKLSNlbmRpZgotICAgIHJldHVybiBERF9PSzsKLX0KLQotc3RhdGljIFVMT05HIFdJTkFQSSBER0FfSURpcmVjdERyYXcySW1wbF9SZWxlYXNlKExQRElSRUNURFJBVzIgaWZhY2UpIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXcySW1wbCxpZmFjZSk7Ci0gICAgRERQUklWQVRFKFRoaXMpOwotICAgIFRSQUNFKCIoJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCBUaGlzLT5yZWYgKTsKLQotICAgIGlmICghLS0oVGhpcy0+cmVmKSkgewotICAgICAgaWYgKCEtLShUaGlzLT5kLT5yZWYpKSB7Ci0JICBWaXJ0dWFsRnJlZShkZHByaXYtPmZiX2FkZHIsIDAsIE1FTV9SRUxFQVNFKTsKLQkgIFRTWEY4NkRHQURpcmVjdFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwwKTsKLQkgIGlmIChUaGlzLT5kLT53aW5kb3cgJiYgR2V0UHJvcEEoVGhpcy0+ZC0+d2luZG93LGRkUHJvcCkpCi0JICAgIERlc3Ryb3lXaW5kb3coVGhpcy0+ZC0+d2luZG93KTsKLQotCSAgeGY4NnZtb2RlX3Jlc3RvcmUoKTsKLQotI2lmZGVmIFJFU1RPUkVfU0lHTkFMUwotCSAgU0lHTkFMX0luaXQoKTsKLSNlbmRpZgotCSAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLFRoaXMtPmQpOwotICAgICAgfQotICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLFRoaXMpOwotICAgICAgcmV0dXJuIFNfT0s7Ci0gICAgfQotICAgIHJldHVybiBUaGlzLT5yZWY7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhdzJJbXBsX1F1ZXJ5SW50ZXJmYWNlKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iagotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotCi0gICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsVGhpcyxkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksb2JqKTsKLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCByZWZpaWQgKSApIHsKLQkqb2JqID0gVGhpczsKLQlJRGlyZWN0RHJhdzJfQWRkUmVmKGlmYWNlKTsKLQotCVRSQUNFKCIgIENyZWF0aW5nIElVbmtub3duIGludGVyZmFjZSAoJXApXG4iLCAqb2JqKTsKLQkKLQlyZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhdywgcmVmaWlkICkgKSB7Ci0JSURpcmVjdERyYXdJbXBsCSpkZCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKCpkZCkpOwotCUlDT01fVlRCTChkZCkgPSAmZGdhX2RkdnQ7ZGQtPnJlZiA9IDE7ZGQtPmQgPSBUaGlzLT5kO1RoaXMtPmQrKzsKLQkqb2JqID0gZGQ7Ci0KLQlJRGlyZWN0RHJhdzJfQWRkUmVmKGlmYWNlKTsKLQlUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0RHJhdyBpbnRlcmZhY2UgKCVwKVxuIiwgKm9iaik7Ci0JCi0JcmV0dXJuIFNfT0s7Ci0gICAgfQotICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXcyLCByZWZpaWQgKSApIHsKLQlJRGlyZWN0RHJhdzJJbXBsCSpkZCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKCpkZCkpOwotCUlDT01fVlRCTChkZCkgPSAmZGdhX2RkMnZ0O2RkLT5yZWYgPSAxO2RkLT5kID0gVGhpcy0+ZDtUaGlzLT5kKys7Ci0JKm9iaiA9IGRkOwotCi0JSURpcmVjdERyYXcyX0FkZFJlZihpZmFjZSk7Ci0JVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdERyYXcyIGludGVyZmFjZSAoJXApXG4iLCAqb2JqKTsKLQlyZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhdzQsIHJlZmlpZCApICkgewotCUlEaXJlY3REcmF3NEltcGwJKmRkID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoKmRkKSk7Ci0JSUNPTV9WVEJMKGRkKSA9ICZkZ2FfZGQ0dnQ7ZGQtPnJlZiA9IDE7ZGQtPmQgPSBUaGlzLT5kO1RoaXMtPmQrKzsKLQkqb2JqID0gZGQ7Ci0KLQlJRGlyZWN0RHJhdzRfQWRkUmVmKGlmYWNlKTsKLQlUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0RHJhdzQgaW50ZXJmYWNlICglcClcbiIsICpvYmopOwotCXJldHVybiBTX09LOwotICAgIH0KLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3NywgcmVmaWlkICkgKSB7Ci0JSURpcmVjdERyYXc0SW1wbAkqZGQgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZigqZGQpKTsKLQlJQ09NX1ZUQkwoZGQpID0gKElDT01fVlRBQkxFKElEaXJlY3REcmF3NCkqKSZkZ2FfZGQ3dnQ7ZGQtPnJlZiA9IDE7ZGQtPmQgPSBUaGlzLT5kO1RoaXMtPmQrKzsKLQkqb2JqID0gZGQ7Ci0KLQlJRGlyZWN0RHJhdzdfQWRkUmVmKGlmYWNlKTsKLQlGSVhNRSgiICBDcmVhdGluZyBJRGlyZWN0RHJhdzcgaW50ZXJmYWNlIChieSB1c2luZyBEaXJlY3REcmF3NCBpbXBsLikgKCVwKVxuIiwgKm9iaik7Ci0JcmV0dXJuIFNfT0s7Ci0gICAgfQotICAgIEZJWE1FKCIoJXApOmludGVyZmFjZSBmb3IgSUlEICVzIF9OT1RfIGZvdW5kIVxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmVmaWlkKSk7Ci0gICAgcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3MkltcGxfRW51bURpc3BsYXlNb2RlcygKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLERXT1JEIGR3RmxhZ3MsTFBERFNVUkZBQ0VERVNDIGxwZGRzZmQsTFBWT0lEIGNvbnRleHQsTFBEREVOVU1NT0RFU0NBTExCQUNLIG1vZGVzY2IKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBERFNVUkZBQ0VERVNDCWRkc2ZkOwotICAgIHN0YXRpYyBzdHJ1Y3QgewotCSAgICBpbnQgdyxoOwotICAgIH0gbW9kZXNbNV0gPSB7IC8qIHNvbWUgdXN1YWwgbW9kZXMgKi8KLQl7NTEyLDM4NH0sCi0JezY0MCw0MDB9LAotCXs2NDAsNDgwfSwKLQl7ODAwLDYwMH0sCi0JezEwMjQsNzY4fSwKLSAgICB9OwotICAgIHN0YXRpYyBpbnQgZGVwdGhzWzRdID0gezgsMTYsMjQsMzJ9OwotICAgIGludAlpLGo7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KDB4JTA4bHgsJXAsJXAsJXApXG4iLFRoaXMsZHdGbGFncyxscGRkc2ZkLGNvbnRleHQsbW9kZXNjYik7Ci0gICAgZGRzZmQuZHdTaXplID0gc2l6ZW9mKGRkc2ZkKTsKLSAgICBkZHNmZC5kd0ZsYWdzID0gRERTRF9IRUlHSFR8RERTRF9XSURUSHxERFNEX0JBQ0tCVUZGRVJDT1VOVHxERFNEX1BJWEVMRk9STUFUfEREU0RfQ0FQUzsKLSAgICBpZiAoZHdGbGFncyAmIERERURNX1JFRlJFU0hSQVRFUykgewotCSAgICBkZHNmZC5kd0ZsYWdzIHw9IEREU0RfUkVGUkVTSFJBVEU7Ci0JICAgIGRkc2ZkLnUuZHdSZWZyZXNoUmF0ZSA9IDYwOwotICAgIH0KLSAgICBkZHNmZC5kZHNDYXBzLmR3Q2FwcyA9IDA7Ci0gICAgZGRzZmQuZHdCYWNrQnVmZmVyQ291bnQgPSAxOwotCi0gICAgZm9yIChpPTA7aTxzaXplb2YoZGVwdGhzKS9zaXplb2YoZGVwdGhzWzBdKTtpKyspIHsKLSAgICAgIGRkc2ZkLmR3QmFja0J1ZmZlckNvdW50ID0gMTsKLSAgICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC5kd0ZvdXJDQwk9IDA7Ci0gICAgICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAJPSBERFBGX1JHQjsKLSAgICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51LmR3UkdCQml0Q291bnQJPSBkZXB0aHNbaV07Ci0gICAgICAvKiBGSVhNRTogdGhvc2UgbWFza3Mgd291bGQgaGF2ZSB0byBiZSBzZXQgaW4gZGVwdGggPiA4ICovCi0gICAgICBpZiAoZGVwdGhzW2ldPT04KSB7Ci0JZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkJpdE1hc2sgIAk9IDA7Ci0JZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUyLmR3R0JpdE1hc2sgIAk9IDA7Ci0JZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUzLmR3QkJpdE1hc2sgCT0gMDsKLQlkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTQuZHdSR0JBbHBoYUJpdE1hc2s9IDA7Ci0JZGRzZmQuZGRzQ2Fwcy5kd0NhcHM9RERTQ0FQU19QQUxFVFRFOwotCWRkc2ZkLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzfD1ERFBGX1BBTEVUVEVJTkRFWEVEODsKLSAgICAgIH0gZWxzZSB7Ci0JZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnU0LmR3UkdCQWxwaGFCaXRNYXNrPSAwOwotCQotCS8qIEZJWE1FOiBXZSBzaG91bGQgcXVlcnkgdGhvc2UgZnJvbSBYIGl0c2VsZiAqLwotCXN3aXRjaCAoZGVwdGhzW2ldKSB7Ci0JY2FzZSAxNjoKLQkgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51MS5kd1JCaXRNYXNrID0gMHhGODAwOwotCSAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUyLmR3R0JpdE1hc2sgPSAweDA3RTA7Ci0JICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTMuZHdCQml0TWFzaz0gMHgwMDFGOwotCSAgYnJlYWs7Ci0JY2FzZSAyNDoKLQkgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51MS5kd1JCaXRNYXNrID0gMHgwMEZGMDAwMDsKLQkgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51Mi5kd0dCaXRNYXNrID0gMHgwMDAwRkYwMDsKLQkgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51My5kd0JCaXRNYXNrPSAweDAwMDAwMEZGOwotCSAgYnJlYWs7Ci0JY2FzZSAzMjoKLQkgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51MS5kd1JCaXRNYXNrID0gMHgwMEZGMDAwMDsKLQkgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51Mi5kd0dCaXRNYXNrID0gMHgwMDAwRkYwMDsKLQkgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51My5kd0JCaXRNYXNrPSAweDAwMDAwMEZGOwotCSAgYnJlYWs7Ci0JfQotICAgICAgfQotICAgICAgCi0gICAgICBkZHNmZC5kd1dpZHRoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7Ci0gICAgICBkZHNmZC5kd0hlaWdodCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pOwotICAgICAgVFJBQ0UoIiBlbnVtZXJhdGluZyAoJWxkeCVsZHglZClcbiIsZGRzZmQuZHdXaWR0aCxkZHNmZC5kd0hlaWdodCxkZXB0aHNbaV0pOwotICAgICAgaWYgKCFtb2Rlc2NiKCZkZHNmZCxjb250ZXh0KSkgcmV0dXJuIEREX09LOwotICAgICAgCi0gICAgICBmb3IgKGo9MDtqPHNpemVvZihtb2Rlcykvc2l6ZW9mKG1vZGVzWzBdKTtqKyspIHsKLQlkZHNmZC5kd1dpZHRoCT0gbW9kZXNbal0udzsKLQlkZHNmZC5kd0hlaWdodAk9IG1vZGVzW2pdLmg7Ci0JVFJBQ0UoIiBlbnVtZXJhdGluZyAoJWxkeCVsZHglZClcbiIsZGRzZmQuZHdXaWR0aCxkZHNmZC5kd0hlaWdodCxkZXB0aHNbaV0pOwotCWlmICghbW9kZXNjYigmZGRzZmQsY29udGV4dCkpIHJldHVybiBERF9PSzsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKCEoZHdGbGFncyAmIERERURNX1NUQU5EQVJEVkdBTU9ERVMpKSB7Ci0JLyogbW9kZVggaXMgbm90IHN0YW5kYXJkIFZHQSAqLwotCQotCWRkc2ZkLmR3SGVpZ2h0ID0gMjAwOwotCWRkc2ZkLmR3V2lkdGggPSAzMjA7Ci0JVFJBQ0UoIiBlbnVtZXJhdGluZyAoMzIweDIwMHglZClcbiIsZGVwdGhzW2ldKTsKLQlpZiAoIW1vZGVzY2IoJmRkc2ZkLGNvbnRleHQpKSByZXR1cm4gRERfT0s7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXcySW1wbF9HZXREaXNwbGF5TW9kZSgKLQlMUERJUkVDVERSQVcyIGlmYWNlLExQRERTVVJGQUNFREVTQyBscGRkc2ZkCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXcySW1wbCxpZmFjZSk7Ci0gICAgRERQUklWQVRFKFRoaXMpOwotCi0gICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxscGRkc2ZkKTsKLSAgICBscGRkc2ZkLT5kd0ZsYWdzID0gRERTRF9IRUlHSFR8RERTRF9XSURUSHxERFNEX1BJVENIfEREU0RfQkFDS0JVRkZFUkNPVU5UfEREU0RfUElYRUxGT1JNQVR8RERTRF9DQVBTOwotICAgIGxwZGRzZmQtPmR3SGVpZ2h0ID0gVGhpcy0+ZC0+aGVpZ2h0OwotICAgIGxwZGRzZmQtPmR3V2lkdGggPSBUaGlzLT5kLT53aWR0aDsKLSAgICBscGRkc2ZkLT5sUGl0Y2ggPSBkZHByaXYtPmZiX3dpZHRoKlBGR0VUX0JQUChUaGlzLT5kLT5kaXJlY3RkcmF3X3BpeGVsZm9ybWF0KTsKLSAgICBscGRkc2ZkLT5kd0JhY2tCdWZmZXJDb3VudCA9IDI7Ci0gICAgbHBkZHNmZC0+dS5kd1JlZnJlc2hSYXRlID0gNjA7Ci0gICAgbHBkZHNmZC0+ZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX1BBTEVUVEU7Ci0gICAgbHBkZHNmZC0+ZGRwZlBpeGVsRm9ybWF0ID0gVGhpcy0+ZC0+ZGlyZWN0ZHJhd19waXhlbGZvcm1hdDsKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKQotCV9kdW1wX3N1cmZhY2VfZGVzYyhscGRkc2ZkKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLS8qIE5vdGU6IEhhY2sgc28gd2UgY2FuIHJldXNlIHRoZSBvbGQgZnVuY3Rpb25zIHdpdGhvdXQgY29tcGlsZXIgd2FybmluZ3MgKi8KLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pICYmIGRlZmluZWQoX19HTlVDX18pCi0jIGRlZmluZSBYQ0FTVChmdW4pCSh0eXBlb2YoZGdhX2RkdnQuZm4jI2Z1bikpCi0jZWxzZQotIyBkZWZpbmUgWENBU1QoZnVuKQkodm9pZCAqKQotI2VuZGlmCi0KLXN0cnVjdCBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhdykgZGdhX2RkdnQgPSAKLXsKLSAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9EdW1teVJUVElWQUxVRQotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKURHQV9JRGlyZWN0RHJhdzJJbXBsX1F1ZXJ5SW50ZXJmYWNlLAotICAgIFhDQVNUKEFkZFJlZilJRGlyZWN0RHJhdzJJbXBsX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKURHQV9JRGlyZWN0RHJhdzJJbXBsX1JlbGVhc2UsCi0gICAgWENBU1QoQ29tcGFjdClJRGlyZWN0RHJhdzJJbXBsX0NvbXBhY3QsCi0gICAgWENBU1QoQ3JlYXRlQ2xpcHBlcilJRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZUNsaXBwZXIsCi0gICAgWENBU1QoQ3JlYXRlUGFsZXR0ZSlER0FfSURpcmVjdERyYXcySW1wbF9DcmVhdGVQYWxldHRlLAotICAgIFhDQVNUKENyZWF0ZVN1cmZhY2UpREdBX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlU3VyZmFjZSwKLSAgICBYQ0FTVChEdXBsaWNhdGVTdXJmYWNlKUlEaXJlY3REcmF3MkltcGxfRHVwbGljYXRlU3VyZmFjZSwKLSAgICBYQ0FTVChFbnVtRGlzcGxheU1vZGVzKURHQV9JRGlyZWN0RHJhdzJJbXBsX0VudW1EaXNwbGF5TW9kZXMsCi0gICAgWENBU1QoRW51bVN1cmZhY2VzKUlEaXJlY3REcmF3MkltcGxfRW51bVN1cmZhY2VzLAotICAgIFhDQVNUKEZsaXBUb0dESVN1cmZhY2UpSURpcmVjdERyYXcySW1wbF9GbGlwVG9HRElTdXJmYWNlLAotICAgIFhDQVNUKEdldENhcHMpREdBX0lEaXJlY3REcmF3MkltcGxfR2V0Q2FwcywKLSAgICBYQ0FTVChHZXREaXNwbGF5TW9kZSlER0FfSURpcmVjdERyYXcySW1wbF9HZXREaXNwbGF5TW9kZSwKLSAgICBYQ0FTVChHZXRGb3VyQ0NDb2RlcylJRGlyZWN0RHJhdzJJbXBsX0dldEZvdXJDQ0NvZGVzLAotICAgIFhDQVNUKEdldEdESVN1cmZhY2UpSURpcmVjdERyYXcySW1wbF9HZXRHRElTdXJmYWNlLAotICAgIFhDQVNUKEdldE1vbml0b3JGcmVxdWVuY3kpSURpcmVjdERyYXcySW1wbF9HZXRNb25pdG9yRnJlcXVlbmN5LAotICAgIFhDQVNUKEdldFNjYW5MaW5lKUlEaXJlY3REcmF3MkltcGxfR2V0U2NhbkxpbmUsCi0gICAgWENBU1QoR2V0VmVydGljYWxCbGFua1N0YXR1cylJRGlyZWN0RHJhdzJJbXBsX0dldFZlcnRpY2FsQmxhbmtTdGF0dXMsCi0gICAgWENBU1QoSW5pdGlhbGl6ZSlJRGlyZWN0RHJhdzJJbXBsX0luaXRpYWxpemUsCi0gICAgWENBU1QoUmVzdG9yZURpc3BsYXlNb2RlKURHQV9JRGlyZWN0RHJhdzJJbXBsX1Jlc3RvcmVEaXNwbGF5TW9kZSwKLSAgICBYQ0FTVChTZXRDb29wZXJhdGl2ZUxldmVsKUlEaXJlY3REcmF3MkltcGxfU2V0Q29vcGVyYXRpdmVMZXZlbCwKLSAgICBER0FfSURpcmVjdERyYXdJbXBsX1NldERpc3BsYXlNb2RlLAotICAgIFhDQVNUKFdhaXRGb3JWZXJ0aWNhbEJsYW5rKUlEaXJlY3REcmF3MkltcGxfV2FpdEZvclZlcnRpY2FsQmxhbmssCi19OwotI3VuZGVmIFhDQVNUCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCUlEaXJlY3REcmF3MgotICoKLSAqLwotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3MkltcGxfU2V0RGlzcGxheU1vZGUoCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSxEV09SRCB3aWR0aCxEV09SRCBoZWlnaHQsRFdPUkQgZGVwdGgsRFdPUkQgZHdSZWZyZXNoUmF0ZSwgRFdPUkQgZHdGbGFncwotKSB7Ci0gICAgRklYTUUoICJJZ25vcmVkIHBhcmFtZXRlcnMgKDB4JTA4bHgsMHglMDhseClcbiIsIGR3UmVmcmVzaFJhdGUsIGR3RmxhZ3MgKTsgCi0gICAgcmV0dXJuIERHQV9JRGlyZWN0RHJhd0ltcGxfU2V0RGlzcGxheU1vZGUoKExQRElSRUNURFJBVylpZmFjZSx3aWR0aCxoZWlnaHQsZGVwdGgpOwotfQotCi1IUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXcySW1wbF9HZXRBdmFpbGFibGVWaWRNZW0oCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSxMUEREU0NBUFMgZGRzY2FwcyxMUERXT1JEIHRvdGFsLExQRFdPUkQgZnJlZQotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICAgIEREUFJJVkFURShUaGlzKTsKLQotICAgIFRSQUNFKCIoJXApLT4oJXAsJXAsJXApXG4iLFRoaXMsZGRzY2Fwcyx0b3RhbCxmcmVlKTsKLSAgICBpZiAodG90YWwpICp0b3RhbCA9IGRkcHJpdi0+ZmJfbWVtc2l6ZSAqIDEwMjQ7Ci0gICAgaWYgKGZyZWUpICpmcmVlID0gZGRwcml2LT5mYl9tZW1zaXplICogMTAyNDsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUlDT01fVlRBQkxFKElEaXJlY3REcmF3MikgZGdhX2RkMnZ0ID0gCi17Ci0gICAgSUNPTV9NU1ZUQUJMRV9DT01QQVRfRHVtbXlSVFRJVkFMVUUKLSAgICBER0FfSURpcmVjdERyYXcySW1wbF9RdWVyeUludGVyZmFjZSwKLSAgICBJRGlyZWN0RHJhdzJJbXBsX0FkZFJlZiwKLSAgICBER0FfSURpcmVjdERyYXcySW1wbF9SZWxlYXNlLAotICAgIElEaXJlY3REcmF3MkltcGxfQ29tcGFjdCwKLSAgICBJRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZUNsaXBwZXIsCi0gICAgREdBX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlUGFsZXR0ZSwKLSAgICBER0FfSURpcmVjdERyYXcySW1wbF9DcmVhdGVTdXJmYWNlLAotICAgIElEaXJlY3REcmF3MkltcGxfRHVwbGljYXRlU3VyZmFjZSwKLSAgICBER0FfSURpcmVjdERyYXcySW1wbF9FbnVtRGlzcGxheU1vZGVzLAotICAgIElEaXJlY3REcmF3MkltcGxfRW51bVN1cmZhY2VzLAotICAgIElEaXJlY3REcmF3MkltcGxfRmxpcFRvR0RJU3VyZmFjZSwKLSAgICBER0FfSURpcmVjdERyYXcySW1wbF9HZXRDYXBzLAotICAgIERHQV9JRGlyZWN0RHJhdzJJbXBsX0dldERpc3BsYXlNb2RlLAotICAgIElEaXJlY3REcmF3MkltcGxfR2V0Rm91ckNDQ29kZXMsCi0gICAgSURpcmVjdERyYXcySW1wbF9HZXRHRElTdXJmYWNlLAotICAgIElEaXJlY3REcmF3MkltcGxfR2V0TW9uaXRvckZyZXF1ZW5jeSwKLSAgICBJRGlyZWN0RHJhdzJJbXBsX0dldFNjYW5MaW5lLAotICAgIElEaXJlY3REcmF3MkltcGxfR2V0VmVydGljYWxCbGFua1N0YXR1cywKLSAgICBJRGlyZWN0RHJhdzJJbXBsX0luaXRpYWxpemUsCi0gICAgREdBX0lEaXJlY3REcmF3MkltcGxfUmVzdG9yZURpc3BsYXlNb2RlLAotICAgIElEaXJlY3REcmF3MkltcGxfU2V0Q29vcGVyYXRpdmVMZXZlbCwKLSAgICBER0FfSURpcmVjdERyYXcySW1wbF9TZXREaXNwbGF5TW9kZSwKLSAgICBJRGlyZWN0RHJhdzJJbXBsX1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAotICAgIERHQV9JRGlyZWN0RHJhdzJJbXBsX0dldEF2YWlsYWJsZVZpZE1lbQotfTsKLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSMgZGVmaW5lIFhDQVNUKGZ1bikJKHR5cGVvZihkZ2FfZGQ0dnQuZm4jI2Z1bikpCi0jZWxzZQotIyBkZWZpbmUgWENBU1QoZnVuKQkodm9pZCopCi0jZW5kaWYKLQotSUNPTV9WVEFCTEUoSURpcmVjdERyYXc0KSBkZ2FfZGQ0dnQgPSAKLXsKLSAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9EdW1teVJUVElWQUxVRQotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKURHQV9JRGlyZWN0RHJhdzJJbXBsX1F1ZXJ5SW50ZXJmYWNlLAotICAgIFhDQVNUKEFkZFJlZilJRGlyZWN0RHJhdzJJbXBsX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKURHQV9JRGlyZWN0RHJhdzJJbXBsX1JlbGVhc2UsCi0gICAgWENBU1QoQ29tcGFjdClJRGlyZWN0RHJhdzJJbXBsX0NvbXBhY3QsCi0gICAgWENBU1QoQ3JlYXRlQ2xpcHBlcilJRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZUNsaXBwZXIsCi0gICAgWENBU1QoQ3JlYXRlUGFsZXR0ZSlER0FfSURpcmVjdERyYXcySW1wbF9DcmVhdGVQYWxldHRlLAotICAgIFhDQVNUKENyZWF0ZVN1cmZhY2UpREdBX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlU3VyZmFjZSwKLSAgICBYQ0FTVChEdXBsaWNhdGVTdXJmYWNlKUlEaXJlY3REcmF3MkltcGxfRHVwbGljYXRlU3VyZmFjZSwKLSAgICBYQ0FTVChFbnVtRGlzcGxheU1vZGVzKURHQV9JRGlyZWN0RHJhdzJJbXBsX0VudW1EaXNwbGF5TW9kZXMsCi0gICAgWENBU1QoRW51bVN1cmZhY2VzKUlEaXJlY3REcmF3MkltcGxfRW51bVN1cmZhY2VzLAotICAgIFhDQVNUKEZsaXBUb0dESVN1cmZhY2UpSURpcmVjdERyYXcySW1wbF9GbGlwVG9HRElTdXJmYWNlLAotICAgIFhDQVNUKEdldENhcHMpREdBX0lEaXJlY3REcmF3MkltcGxfR2V0Q2FwcywKLSAgICBYQ0FTVChHZXREaXNwbGF5TW9kZSlER0FfSURpcmVjdERyYXcySW1wbF9HZXREaXNwbGF5TW9kZSwKLSAgICBYQ0FTVChHZXRGb3VyQ0NDb2RlcylJRGlyZWN0RHJhdzJJbXBsX0dldEZvdXJDQ0NvZGVzLAotICAgIFhDQVNUKEdldEdESVN1cmZhY2UpSURpcmVjdERyYXcySW1wbF9HZXRHRElTdXJmYWNlLAotICAgIFhDQVNUKEdldE1vbml0b3JGcmVxdWVuY3kpSURpcmVjdERyYXcySW1wbF9HZXRNb25pdG9yRnJlcXVlbmN5LAotICAgIFhDQVNUKEdldFNjYW5MaW5lKUlEaXJlY3REcmF3MkltcGxfR2V0U2NhbkxpbmUsCi0gICAgWENBU1QoR2V0VmVydGljYWxCbGFua1N0YXR1cylJRGlyZWN0RHJhdzJJbXBsX0dldFZlcnRpY2FsQmxhbmtTdGF0dXMsCi0gICAgWENBU1QoSW5pdGlhbGl6ZSlJRGlyZWN0RHJhdzJJbXBsX0luaXRpYWxpemUsCi0gICAgWENBU1QoUmVzdG9yZURpc3BsYXlNb2RlKURHQV9JRGlyZWN0RHJhdzJJbXBsX1Jlc3RvcmVEaXNwbGF5TW9kZSwKLSAgICBYQ0FTVChTZXRDb29wZXJhdGl2ZUxldmVsKUlEaXJlY3REcmF3MkltcGxfU2V0Q29vcGVyYXRpdmVMZXZlbCwKLSAgICBYQ0FTVChTZXREaXNwbGF5TW9kZSlER0FfSURpcmVjdERyYXdJbXBsX1NldERpc3BsYXlNb2RlLAotICAgIFhDQVNUKFdhaXRGb3JWZXJ0aWNhbEJsYW5rKUlEaXJlY3REcmF3MkltcGxfV2FpdEZvclZlcnRpY2FsQmxhbmssCi0gICAgWENBU1QoR2V0QXZhaWxhYmxlVmlkTWVtKURHQV9JRGlyZWN0RHJhdzJJbXBsX0dldEF2YWlsYWJsZVZpZE1lbSwKLSAgICBJRGlyZWN0RHJhdzRJbXBsX0dldFN1cmZhY2VGcm9tREMsCi0gICAgSURpcmVjdERyYXc0SW1wbF9SZXN0b3JlQWxsU3VyZmFjZXMsCi0gICAgSURpcmVjdERyYXc0SW1wbF9UZXN0Q29vcGVyYXRpdmVMZXZlbCwKLSAgICBJRGlyZWN0RHJhdzRJbXBsX0dldERldmljZUlkZW50aWZpZXIKLX07Ci0jdW5kZWYgWENBU1QKLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSMgZGVmaW5lIFhDQVNUKGZ1bikJKHR5cGVvZihkZ2FfZGQ3dnQuZm4jI2Z1bikpCi0jZWxzZQotIyBkZWZpbmUgWENBU1QoZnVuKQkodm9pZCopCi0jZW5kaWYKLQotSUNPTV9WVEFCTEUoSURpcmVjdERyYXc3KSBkZ2FfZGQ3dnQgPSAKLXsKLSAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9EdW1teVJUVElWQUxVRQotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKURHQV9JRGlyZWN0RHJhdzJJbXBsX1F1ZXJ5SW50ZXJmYWNlLAotICAgIFhDQVNUKEFkZFJlZilJRGlyZWN0RHJhdzJJbXBsX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKURHQV9JRGlyZWN0RHJhdzJJbXBsX1JlbGVhc2UsCi0gICAgWENBU1QoQ29tcGFjdClJRGlyZWN0RHJhdzJJbXBsX0NvbXBhY3QsCi0gICAgWENBU1QoQ3JlYXRlQ2xpcHBlcilJRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZUNsaXBwZXIsCi0gICAgWENBU1QoQ3JlYXRlUGFsZXR0ZSlER0FfSURpcmVjdERyYXcySW1wbF9DcmVhdGVQYWxldHRlLAotICAgIFhDQVNUKENyZWF0ZVN1cmZhY2UpREdBX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlU3VyZmFjZSwKLSAgICBYQ0FTVChEdXBsaWNhdGVTdXJmYWNlKUlEaXJlY3REcmF3MkltcGxfRHVwbGljYXRlU3VyZmFjZSwKLSAgICBYQ0FTVChFbnVtRGlzcGxheU1vZGVzKURHQV9JRGlyZWN0RHJhdzJJbXBsX0VudW1EaXNwbGF5TW9kZXMsCi0gICAgWENBU1QoRW51bVN1cmZhY2VzKUlEaXJlY3REcmF3MkltcGxfRW51bVN1cmZhY2VzLAotICAgIFhDQVNUKEZsaXBUb0dESVN1cmZhY2UpSURpcmVjdERyYXcySW1wbF9GbGlwVG9HRElTdXJmYWNlLAotICAgIFhDQVNUKEdldENhcHMpREdBX0lEaXJlY3REcmF3MkltcGxfR2V0Q2FwcywKLSAgICBYQ0FTVChHZXREaXNwbGF5TW9kZSlER0FfSURpcmVjdERyYXcySW1wbF9HZXREaXNwbGF5TW9kZSwKLSAgICBYQ0FTVChHZXRGb3VyQ0NDb2RlcylJRGlyZWN0RHJhdzJJbXBsX0dldEZvdXJDQ0NvZGVzLAotICAgIFhDQVNUKEdldEdESVN1cmZhY2UpSURpcmVjdERyYXcySW1wbF9HZXRHRElTdXJmYWNlLAotICAgIFhDQVNUKEdldE1vbml0b3JGcmVxdWVuY3kpSURpcmVjdERyYXcySW1wbF9HZXRNb25pdG9yRnJlcXVlbmN5LAotICAgIFhDQVNUKEdldFNjYW5MaW5lKUlEaXJlY3REcmF3MkltcGxfR2V0U2NhbkxpbmUsCi0gICAgWENBU1QoR2V0VmVydGljYWxCbGFua1N0YXR1cylJRGlyZWN0RHJhdzJJbXBsX0dldFZlcnRpY2FsQmxhbmtTdGF0dXMsCi0gICAgWENBU1QoSW5pdGlhbGl6ZSlJRGlyZWN0RHJhdzJJbXBsX0luaXRpYWxpemUsCi0gICAgWENBU1QoUmVzdG9yZURpc3BsYXlNb2RlKURHQV9JRGlyZWN0RHJhdzJJbXBsX1Jlc3RvcmVEaXNwbGF5TW9kZSwKLSAgICBYQ0FTVChTZXRDb29wZXJhdGl2ZUxldmVsKUlEaXJlY3REcmF3MkltcGxfU2V0Q29vcGVyYXRpdmVMZXZlbCwKLSAgICBYQ0FTVChTZXREaXNwbGF5TW9kZSlER0FfSURpcmVjdERyYXdJbXBsX1NldERpc3BsYXlNb2RlLAotICAgIFhDQVNUKFdhaXRGb3JWZXJ0aWNhbEJsYW5rKUlEaXJlY3REcmF3MkltcGxfV2FpdEZvclZlcnRpY2FsQmxhbmssCi0gICAgWENBU1QoR2V0QXZhaWxhYmxlVmlkTWVtKURHQV9JRGlyZWN0RHJhdzJJbXBsX0dldEF2YWlsYWJsZVZpZE1lbSwKLSAgICBYQ0FTVChHZXRTdXJmYWNlRnJvbURDKUlEaXJlY3REcmF3NEltcGxfR2V0U3VyZmFjZUZyb21EQywKLSAgICBYQ0FTVChSZXN0b3JlQWxsU3VyZmFjZXMpSURpcmVjdERyYXc0SW1wbF9SZXN0b3JlQWxsU3VyZmFjZXMsCi0gICAgWENBU1QoVGVzdENvb3BlcmF0aXZlTGV2ZWwpSURpcmVjdERyYXc0SW1wbF9UZXN0Q29vcGVyYXRpdmVMZXZlbCwKLSAgICBYQ0FTVChHZXREZXZpY2VJZGVudGlmaWVyKUlEaXJlY3REcmF3NEltcGxfR2V0RGV2aWNlSWRlbnRpZmllciwKLSAgICBJRGlyZWN0RHJhdzdJbXBsX1N0YXJ0TW9kZVRlc3QsCi0gICAgSURpcmVjdERyYXc3SW1wbF9FdmFsdWF0ZU1vZGUKLX07Ci0jdW5kZWYgWENBU1QKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGRyYXcvZGdhMi5jIGIvZGxscy9kZHJhdy9kZHJhdy9kZ2EyLmMKaW5kZXggODhmMjY2NS4uZmFiYzJhZiAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy9kZHJhdy9kZ2EyLmMKKysrIGIvZGxscy9kZHJhdy9kZHJhdy9kZ2EyLmMKQEAgLTEsNDMxICsxLDQwNyBAQAotLyoJCURpcmVjdERyYXcgSURpcmVjdERyYXcgWEY4NkRHQSBpbnRlcmZhY2UKKy8qCURpcmVjdERyYXcgZHJpdmVyIGZvciBYRjg2REdBMiBwcmltYXJ5IHN1cmZhY2UKICAqCi0gKiAgREdBMidzIHNwZWNpZmljIElEaXJlY3REcmF3IGZ1bmN0aW9ucy4uLgorICogQ29weXJpZ2h0IDIwMDAgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfTElCWFhGODZER0EyCisKKyNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCisjaW5jbHVkZSAidHNfeGxpYi5oIgorI2luY2x1ZGUgInRzX3hmODZkZ2EyLmgiCisjaW5jbHVkZSAieDExZHJ2LmgiCisjaW5jbHVkZSA8ZGRyYXcuaD4KKwogI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKLSNpbmNsdWRlICJ3aW5lcnJvci5oIgotI2luY2x1ZGUgIndpbmUvZXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiZGRyYXcuaCIKLSNpbmNsdWRlICJkM2QuaCIKLSNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCi0jaW5jbHVkZSAibWVzc2FnZS5oIgorI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKKyNpbmNsdWRlICJkZHJhdy9tYWluLmgiCisjaW5jbHVkZSAiZGRyYXcvdXNlci5oIgorI2luY2x1ZGUgImRkcmF3L2RnYTIuaCIKKyNpbmNsdWRlICJkY2xpcHBlci9tYWluLmgiCisjaW5jbHVkZSAiZHBhbGV0dGUvbWFpbi5oIgorI2luY2x1ZGUgImRzdXJmYWNlL21haW4uaCIKKyNpbmNsdWRlICJkc3VyZmFjZS9kaWIuaCIKKyNpbmNsdWRlICJkc3VyZmFjZS91c2VyLmgiCisjaW5jbHVkZSAiZHN1cmZhY2UvZGdhMi5oIgorCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogCiBERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwogCi0jaW5jbHVkZSAiZGdhMl9wcml2YXRlLmgiCitzdGF0aWMgSUNPTV9WVEFCTEUoSURpcmVjdERyYXc3KSBYRjg2REdBMl9EaXJlY3REcmF3X1ZUYWJsZTsKIAotc3RydWN0IElDT01fVlRBQkxFKElEaXJlY3REcmF3KQkJZGdhMl9kZHZ0Owotc3RydWN0IElDT01fVlRBQkxFKElEaXJlY3REcmF3MikJZGdhMl9kZDJ2dDsKLXN0cnVjdCBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhdzQpCWRnYTJfZGQ0dnQ7CitzdGF0aWMgY29uc3QgRERERVZJQ0VJREVOVElGSUVSMiB4Zjg2ZGdhMl9kZXZpY2UgPSAKK3sKKyAgICAiWEY4NkRHQTIgRHJpdmVyIiwKKyAgICAiV0lORSBEaXJlY3REcmF3IG9uIFhGODZER0EyIiwKKyAgICB7IHsgMHgwMDAxMDAwMSwgMHgwMDAxMDAwMSB9IH0sCisgICAgMCwgMCwgMCwgMCwKKyAgICAvKiBlMmRjYjAyMC1kYzYwLTExZDEtODQwNy05NzE0ZjVkNTA4MDMgKi8KKyAgICB7MHhlMmRjYjAyMCwweGRjNjAsMHgxMWQxLHsweDg0LDB4MDcsMHg5NywweDE0LDB4ZjUsMHhkNSwweDA4LDB4MDN9fSwKKyAgICAwCit9OwogCi0jZGVmaW5lIEREUFJJVkFURSh4KSBkZ2EyX2RkX3ByaXZhdGUgKmRkcHJpdiA9ICgoZGdhMl9kZF9wcml2YXRlKikoeCktPmQtPnByaXZhdGUpCi0jZGVmaW5lIERQUFJJVkFURSh4KSBkZ2EyX2RwX3ByaXZhdGUgKmRwcHJpdiA9ICgoZGdhMl9kcF9wcml2YXRlKikoeCktPnByaXZhdGUpCitIUkVTVUxUIFhGODZER0EyX0RpcmVjdERyYXdfQ3JlYXRlKGNvbnN0IEdVSUQqIHBHVUlELCBMUERJUkVDVERSQVc3KiBwSWZhY2UsCisJCQkJICAgSVVua25vd24qIHBVbmtPdXRlciwgQk9PTCBleCk7CitIUkVTVUxUIFhGODZER0EyX0RpcmVjdERyYXdfSW5pdGlhbGl6ZShJRGlyZWN0RHJhd0ltcGwqLCBjb25zdCBHVUlEKik7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlJRGlyZWN0RHJhdwotICovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBMl9JRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVN1cmZhY2UoCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSxMUEREU1VSRkFDRURFU0MgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmLAotICAgIElVbmtub3duICpscHVuawotKSB7Ci0gIEhSRVNVTFQgcmV0Oworc3RhdGljIGNvbnN0IGRkcmF3X2RyaXZlciB4Zjg2ZGdhMl9kcml2ZXIgPQoreworICAgICZ4Zjg2ZGdhMl9kZXZpY2UsCisgICAgMjAsIC8qIFhWaWRNb2RlIGlzIDExICovCisgICAgWEY4NkRHQTJfRGlyZWN0RHJhd19DcmVhdGUsCisgICAgWEY4NkRHQTJfRGlyZWN0RHJhd19Jbml0aWFsaXplCit9OwogCi0gIHJldCA9IERHQV9JRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVN1cmZhY2Vfd2l0aF9WVChpZmFjZSwgbHBkZHNkLCBscGRzZiwgbHB1bmssICZkZ2EyX2RkczR2dCk7CitzdGF0aWMgWERHQU1vZGUqIG1vZGVzOworc3RhdGljIERXT1JEIG51bV9tb2RlczsKK3N0YXRpYyBpbnQgZGdhX2V2ZW50LCBkZ2FfZXJyb3I7CiAKLSAgcmV0dXJuIHJldDsKLX0KKy8qIENhbGxlZCBmcm9tIERsbEluaXQsIHdoaWNoIGlzIHN5bmNocm9uaXNlZCBzbyB0aGVyZSBhcmUgbm8gdGhyZWFkaW5nCisgKiBjb25jZXJucy4gKi8KK3N0YXRpYyBCT09MIGluaXRpYWxpemUodm9pZCkKK3sKKyAgICBpbnQgbm1vZGVzOworICAgIGludCBtYWpvciwgbWlub3I7CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0EyX0lEaXJlY3REcmF3MkltcGxfU2V0Q29vcGVyYXRpdmVMZXZlbCgKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLEhXTkQgaHduZCxEV09SRCBjb29wbGV2ZWwKLSkgewotICAgIC8qIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsgKi8KLSAgICBIUkVTVUxUIHJldDsKLSAgICBpbnQgZXZiYXNlLCBlcmJhc2U7CisgICAgaWYgKFgxMURSVl9HZXRYUm9vdFdpbmRvdygpICE9IERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpKSByZXR1cm4gRkFMU0U7CiAKLSAgICByZXQgPSBJRGlyZWN0RHJhdzJJbXBsX1NldENvb3BlcmF0aXZlTGV2ZWwoaWZhY2UsIGh3bmQsIGNvb3BsZXZlbCk7CisgICAgLyogRklYTUU6IGRvbid0IHVzZSBQUk9GSUxFIGNhbGxzICovCisgICAgaWYgKCFQUk9GSUxFX0dldFdpbmVJbmlCb29sKCJ4MTFkcnYiLCAiVXNlREdBIiwgMSkpIHJldHVybiBGQUxTRTsKIAotICAgIGlmIChyZXQgIT0gRERfT0spCi0gICAgICByZXR1cm4gcmV0OworICAgIGlmICghVFNYREdBUXVlcnlFeHRlbnNpb24oZGlzcGxheSwgJmRnYV9ldmVudCwgJmRnYV9lcnJvcikpIHJldHVybiBGQUxTRTsKIAotICAgIFRTWERHQVF1ZXJ5RXh0ZW5zaW9uKGRpc3BsYXksICZldmJhc2UsICZlcmJhc2UpOworICAgIGlmICghVFNYREdBUXVlcnlWZXJzaW9uKGRpc3BsYXksICZtYWpvciwgJm1pbm9yKSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKG1ham9yIDwgMikgcmV0dXJuIEZBTFNFOyAvKiBvbmx5IGJvdGhlciB3aXRoIERHQTIgKi8KKworICAgIC8qIHRlc3QgdGhhdCBpdCB3b3JrcyAqLworICAgIGlmICghVFNYREdBT3BlbkZyYW1lYnVmZmVyKGRpc3BsYXksIERlZmF1bHRTY3JlZW4oZGlzcGxheSkpKSB7CisJVFJBQ0UoImRpc2FibGluZyBYRjg2REdBMiAoaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zPylcbiIpOworCXJldHVybiBGQUxTRTsKKyAgICB9CisgICAgVFNYREdBQ2xvc2VGcmFtZWJ1ZmZlcihkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKTsKICAgICAKLSAgICAvKiBOb3csIHN0YXJ0IGhhbmRsaW5nIG9mIERHQSBldmVudHMgZ2l2aW5nIHRoZSBoYW5kbGUgdG8gdGhlIEREcmF3IHdpbmRvdwotICAgICAgIGFzIHRoZSB3aW5kb3cgZm9yIHdoaWNoIHRoZSBldmVudCB3aWxsIGJlIHJlcG9ydGVkICovCi0gICAgVFNYREdBU2VsZWN0SW5wdXQoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwKLQkJICAgICAgS2V5UHJlc3NNYXNrfEtleVJlbGVhc2VNYXNrfEJ1dHRvblByZXNzTWFza3xCdXR0b25SZWxlYXNlTWFza3xQb2ludGVyTW90aW9uTWFzayApOwotICAgIFgxMURSVl9FVkVOVF9TZXRER0FTdGF0dXMoaHduZCwgZXZiYXNlKTsKLSAgICByZXR1cm4gRERfT0s7CisgICAgVFJBQ0UoImdldHRpbmcgWEY4NkRHQTIgbW9kZSBsaXN0XG4iKTsKKyAgICBtb2RlcyA9IFRTWERHQVF1ZXJ5TW9kZXMoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwgJm5tb2Rlcyk7CisgICAgaWYgKCFtb2RlcykgcmV0dXJuIEZBTFNFOworICAgIG51bV9tb2RlcyA9IG5tb2RlczsKKworICAgIFRSQUNFKCJlbmFibGluZyBYRjg2REdBMlxuIik7CisKKyAgICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBfREdBMl9Jbml0aWFsaXplX0ZyYW1lQnVmZmVyKElEaXJlY3REcmF3SW1wbCAqVGhpcywgaW50IG1vZGUpIHsKLSAgICBERFBJWEVMRk9STUFUICpwZiA9ICYoVGhpcy0+ZC0+ZGlyZWN0ZHJhd19waXhlbGZvcm1hdCk7Ci0gICAgRERQUklWQVRFKFRoaXMpOwotCi0gICAgLyogTm93LCBnZXQgdGhlIGRldmljZSAvIG1vZGUgZGVzY3JpcHRpb24gKi8KLSAgICBkZHByaXYtPmRldiA9IFRTWERHQVNldE1vZGUoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwgbW9kZSk7Ci0KLSAgICBkZHByaXYtPkRHQS5mYl93aWR0aCA9IGRkcHJpdi0+ZGV2LT5tb2RlLmltYWdlV2lkdGg7Ci0gICAgVFNYREdBU2V0Vmlld3BvcnQoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLDAsMCwgWERHQUZsaXBJbW1lZGlhdGUpOwotICAgIGRkcHJpdi0+REdBLmZiX2hlaWdodCA9IGRkcHJpdi0+ZGV2LT5tb2RlLnZpZXdwb3J0SGVpZ2h0OwotICAgIFRSQUNFKCJ2aWRlbyBmcmFtZWJ1ZmZlcjogYmVnaW4gJXAsIHdpZHRoICVkLCBtZW1zaXplICVkXG4iLAotCWRkcHJpdi0+ZGV2LT5kYXRhLAotCWRkcHJpdi0+ZGV2LT5tb2RlLmltYWdlV2lkdGgsCi0JKGRkcHJpdi0+ZGV2LT5tb2RlLmltYWdlV2lkdGggKgotCSBkZHByaXYtPmRldi0+bW9kZS5pbWFnZUhlaWdodCAqCi0JIChkZHByaXYtPmRldi0+bW9kZS5iaXRzUGVyUGl4ZWwgLyA4KSkKLSAgICApOwotICAgIFRSQUNFKCJ2aWV3cG9ydCBoZWlnaHQ6ICVkXG4iLCBkZHByaXYtPmRldi0+bW9kZS52aWV3cG9ydEhlaWdodCk7Ci0gICAgLyogR2V0IHRoZSBzY3JlZW4gZGltZW5zaW9ucyBhcyBzZWVuIGJ5IFdpbmUuCi0gICAgICogSW4gdGhhdCBjYXNlLCBpdCBtYXkgYmUgYmV0dGVyIHRvIGlnbm9yZSB0aGUgLWRlc2t0b3AgbW9kZSBhbmQgcmV0dXJuIHRoZQotICAgICAqIHJlYWwgc2NyZWVuIHNpemUgPT4gcHJpbnQgYSB3YXJuaW5nICovCi0gICAgVGhpcy0+ZC0+aGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7Ci0gICAgVGhpcy0+ZC0+d2lkdGggPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKLSAgICBkZHByaXYtPkRHQS5mYl9hZGRyID0gZGRwcml2LT5kZXYtPmRhdGE7Ci0gICAgZGRwcml2LT5ER0EuZmJfbWVtc2l6ZSA9IChkZHByaXYtPmRldi0+bW9kZS5pbWFnZVdpZHRoICoKLQkJCSAgICAgIGRkcHJpdi0+ZGV2LT5tb2RlLmltYWdlSGVpZ2h0ICoKLQkJCSAgICAgIChkZHByaXYtPmRldi0+bW9kZS5iaXRzUGVyUGl4ZWwgLyA4KSk7Ci0gICAgZGRwcml2LT5ER0EudnBtYXNrID0gMDsKLQotICAgIC8qIEZpbGwgdGhlIHNjcmVlbiBwaXhlbGZvcm1hdCAqLwotICAgIHBmLT5kd1NpemUgPSBzaXplb2YoRERQSVhFTEZPUk1BVCk7Ci0gICAgcGYtPmR3Rm91ckNDID0gMDsKLSAgICBwZi0+dS5kd1JHQkJpdENvdW50ID0gZGRwcml2LT5kZXYtPm1vZGUuYml0c1BlclBpeGVsOwotICAgIGlmIChkZHByaXYtPmRldi0+bW9kZS5kZXB0aCA9PSA4KSB7Ci0JcGYtPmR3RmxhZ3MgPSBERFBGX1BBTEVUVEVJTkRFWEVEOHxERFBGX1JHQjsKLQlwZi0+dTEuZHdSQml0TWFzayA9IDA7Ci0JcGYtPnUyLmR3R0JpdE1hc2sgPSAwOwotCXBmLT51My5kd0JCaXRNYXNrID0gMDsKLSAgICB9IGVsc2UgewotCXBmLT5kd0ZsYWdzID0gRERQRl9SR0I7Ci0JcGYtPnUxLmR3UkJpdE1hc2sgPSBkZHByaXYtPmRldi0+bW9kZS5yZWRNYXNrOwotCXBmLT51Mi5kd0dCaXRNYXNrID0gZGRwcml2LT5kZXYtPm1vZGUuZ3JlZW5NYXNrOwotCXBmLT51My5kd0JCaXRNYXNrID0gZGRwcml2LT5kZXYtPm1vZGUuYmx1ZU1hc2s7Ci0gICAgfQotICAgIHBmLT51NC5kd1JHQkFscGhhQml0TWFzaz0gMDsKLSAgICBUaGlzLT5kLT5zY3JlZW5fcGl4ZWxmb3JtYXQgPSAqcGY7IAorc3RhdGljIHZvaWQgY2xlYW51cCh2b2lkKQoreworICAgIFRTWEZyZWUobW9kZXMpOwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBMl9JRGlyZWN0RHJhd0ltcGxfU2V0RGlzcGxheU1vZGUoCi0gICAgTFBESVJFQ1REUkFXIGlmYWNlLERXT1JEIHdpZHRoLERXT1JEIGhlaWdodCxEV09SRCBkZXB0aAotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3SW1wbCxpZmFjZSk7Ci0gICAgRERQUklWQVRFKFRoaXMpOwotICAgIGludAlpOwotICAgIFhER0FNb2RlICptb2RlcyA9IGRkcHJpdi0+bW9kZXM7Ci0gICAgaW50IG1vZGVfdG9fdXNlID0gLTE7CitzdGF0aWMgWERHQU1vZGUqIGNob29zZV9tb2RlKERXT1JEIGR3V2lkdGgsIERXT1JEIGR3SGVpZ2h0LAorCQkgICAgICAgRFdPUkQgZHdSZWZyZXNoUmF0ZSwgRFdPUkQgZHdGbGFncykKK3sKKyAgICBYREdBTW9kZSogYmVzdCA9IE5VTEw7CisgICAgaW50IGk7CiAKLSAgICBUUkFDRSgiKCVwKS0+KCVsZCwlbGQsJWxkKVxuIiwgVGhpcywgd2lkdGgsIGhlaWdodCwgZGVwdGgpOwotCi0gICAgLyogU2VhcmNoIGluIHRoZSBsaXN0IGEgZGlzcGxheSBtb2RlIHRoYXQgY29ycmVzcG9uZHMgdG8gd2hhdCBpcyByZXF1ZXN0ZWQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgZGRwcml2LT5udW1fbW9kZXM7IGkrKykgewotICAgICAgaWYgKChoZWlnaHQgPT0gbW9kZXNbaV0udmlld3BvcnRIZWlnaHQpICYmCi0JICAod2lkdGggPT0gbW9kZXNbaV0udmlld3BvcnRXaWR0aCkgJiYKLQkgIChkZXB0aCA9PSBtb2Rlc1tpXS5kZXB0aCkKLQkgICkKLQltb2RlX3RvX3VzZSA9IG1vZGVzW2ldLm51bTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKG1vZGVfdG9fdXNlIDwgMCkgewotICAgICAgRVJSKCJDb3VsZCBub3QgZmluZCBtYXRjaGluZyBtb2RlICEhIVxuIik7Ci0gICAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURURNT0RFOwotICAgIH0gZWxzZSB7Ci0gICAgICBUUkFDRSgiVXNpbmcgbW9kZSBudW1iZXIgJWRcbiIsIG1vZGVfdG9fdXNlKTsKLSAgICAgIAotICAgICAgVmlydHVhbEZyZWUoZGRwcml2LT5ER0EuZmJfYWRkciwgMCwgTUVNX1JFTEVBU0UpOwotICAgICAgVFNYREdBQ2xvc2VGcmFtZWJ1ZmZlcihkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKTsKLSAgICAgIAotICAgICAgaWYgKCFUU1hER0FPcGVuRnJhbWVidWZmZXIoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSkpIHsKLQlFUlIoIkVycm9yIG9wZW5pbmcgdGhlIGZyYW1lIGJ1ZmZlciAhISFcbiIpOwotCXJldHVybiBEREVSUl9HRU5FUklDOwotICAgICAgfQotICAgICAgCi0gICAgICAvKiBJbml0aWFsaXplIHRoZSBmcmFtZSBidWZmZXIgKi8KLSAgICAgIF9ER0EyX0luaXRpYWxpemVfRnJhbWVCdWZmZXIoVGhpcywgbW9kZV90b191c2UpOwotICAgICAgVmlydHVhbEFsbG9jKGRkcHJpdi0+REdBLmZiX2FkZHIsIGRkcHJpdi0+REdBLmZiX21lbXNpemUsIE1FTV9SRVNFUlZFfE1FTV9TWVNURU0sIFBBR0VfUkVBRFdSSVRFKTsKLSAgICAgIAotICAgICAgLyogUmUtZ2V0IChpZiBuZWNlc3NhcnkpIHRoZSBER0EgZXZlbnRzICovCi0gICAgICBUU1hER0FTZWxlY3RJbnB1dChkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLAotCQkJS2V5UHJlc3NNYXNrfEtleVJlbGVhc2VNYXNrfEJ1dHRvblByZXNzTWFza3xCdXR0b25SZWxlYXNlTWFza3xQb2ludGVyTW90aW9uTWFzayApOwotCi0gICAgICAvKiBBbmQgY2hhbmdlIHRoZSBERHJhdyBwYXJhbWV0ZXJzICovCi0gICAgICBUaGlzLT5kLT53aWR0aAk9IHdpZHRoOwotICAgICAgVGhpcy0+ZC0+aGVpZ2h0CT0gaGVpZ2h0OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0EyX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlUGFsZXR0ZSgKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLERXT1JEIGR3RmxhZ3MsTFBQQUxFVFRFRU5UUlkgcGFsZW50LExQRElSRUNURFJBV1BBTEVUVEUgKmxwZGRwYWwsTFBVTktOT1dOIGxwdW5rCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXcySW1wbCxpZmFjZSk7Ci0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCoJZGRwYWw7Ci0gICAgZGdhX2RwX3ByaXZhdGUJCSpkcHByaXY7Ci0gICAgSFJFU1VMVAkJCXJlczsKLSAgICBpbnQgCQkJeHNpemUgPSAwLGk7Ci0gICAgRERQUklWQVRFKFRoaXMpOwotCi0gICAgVFJBQ0UoIiglcCktPiglMDhseCwlcCwlcCwlcClcbiIsVGhpcyxkd0ZsYWdzLHBhbGVudCxscGRkcGFsLGxwdW5rKTsKLSAgICByZXMgPSBjb21tb25fSURpcmVjdERyYXcySW1wbF9DcmVhdGVQYWxldHRlKFRoaXMsZHdGbGFncyxwYWxlbnQsKElEaXJlY3REcmF3UGFsZXR0ZUltcGwqKilscGRkcGFsLGxwdW5rLCZ4c2l6ZSk7Ci0gICAgaWYgKHJlcyAhPSAwKQotCXJldHVybiByZXM7Ci0gICAgZGRwYWwgPSAqKElEaXJlY3REcmF3UGFsZXR0ZUltcGwqKilscGRkcGFsOwotICAgIGRkcGFsLT5wcml2YXRlID0gSGVhcEFsbG9jKAotCUdldFByb2Nlc3NIZWFwKCksCi0JSEVBUF9aRVJPX01FTU9SWSwKLQlzaXplb2YoZGdhX2RwX3ByaXZhdGUpCi0gICAgKTsKLSAgICBkcHByaXYgPSAoZGdhX2RwX3ByaXZhdGUqKWRkcGFsLT5wcml2YXRlOwotCi0gICAgSUNPTV9WVEJMKGRkcGFsKT0gJmRnYV9kZHBhbHZ0OwotICAgIGlmIChUaGlzLT5kLT5kaXJlY3RkcmF3X3BpeGVsZm9ybWF0LnUuZHdSR0JCaXRDb3VudDw9OCkgewotCWRwcHJpdi0+Y20gPSBUU1hER0FDcmVhdGVDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksIGRkcHJpdi0+ZGV2LCBBbGxvY0FsbCk7Ci0gICAgfSBlbHNlIHsKLQlFUlIoIndoeSBhcmUgd2UgZG9pbmcgQ3JlYXRlUGFsZXR0ZSBpbiBoaS90cnVlY29sb3I/XG4iKTsKLQlkcHByaXYtPmNtID0gMDsKLSAgICB9Ci0gICAgaWYgKGRwcHJpdi0+Y20gJiYgeHNpemUpIHsKLQlmb3IgKGk9MDtpPHhzaXplO2krKykgewotCSAgICBYQ29sb3IgeGM7Ci0KLQkgICAgeGMucmVkID0gZGRwYWwtPnBhbGVudHNbaV0ucGVSZWQ8PDg7Ci0JICAgIHhjLmJsdWUgPSBkZHBhbC0+cGFsZW50c1tpXS5wZUJsdWU8PDg7Ci0JICAgIHhjLmdyZWVuID0gZGRwYWwtPnBhbGVudHNbaV0ucGVHcmVlbjw8ODsKLQkgICAgeGMuZmxhZ3MgPSBEb1JlZHxEb0JsdWV8RG9HcmVlbjsKLQkgICAgeGMucGl4ZWwgPSBpOwotCSAgICBUU1hTdG9yZUNvbG9yKGRpc3BsYXksZHBwcml2LT5jbSwmeGMpOworICAgIC8qIENob29zZSB0aGUgc21hbGxlc3QgbW9kZSB0aGF0IGlzIGxhcmdlIGVub3VnaC4gKi8KKyAgICBmb3IgKGk9MDsgaSA8IG51bV9tb2RlczsgaSsrKQorICAgIHsKKwlpZiAobW9kZXNbaV0udmlld3BvcnRXaWR0aCA+PSBkd1dpZHRoICYmIG1vZGVzW2ldLnZpZXdwb3J0SGVpZ2h0ID49IGR3SGVpZ2h0KQorCXsKKwkgICAgaWYgKGJlc3QgPT0gTlVMTCkgYmVzdCA9ICZtb2Rlc1tpXTsKKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChtb2Rlc1tpXS52aWV3cG9ydFdpZHRoIDwgYmVzdC0+dmlld3BvcnRXaWR0aAorCQkgICAgfHwgbW9kZXNbaV0udmlld3BvcnRIZWlnaHQgPCBiZXN0LT52aWV3cG9ydEhlaWdodCkKKwkJICAgIGJlc3QgPSAmbW9kZXNbaV07CisJICAgIH0KIAl9CiAgICAgfQotICAgIHJldHVybiBERF9PSzsKKworICAgIC8qIGFsbCBtb2RlcyB3ZXJlIHRvbyBzbWFsbCwgdXNlIHRoZSBsYXJnZXN0ICovCisgICAgaWYgKCFiZXN0KQorICAgIHsKKwlUUkFDRSgiYWxsIG1vZGVzIHRvbyBzbWFsbFxuIik7CisKKwlmb3IgKGk9MTsgaSA8IG51bV9tb2RlczsgaSsrKQorCXsKKwkgICAgaWYgKGJlc3QgPT0gTlVMTCkgYmVzdCA9ICZtb2Rlc1tpXTsKKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChtb2Rlc1tpXS52aWV3cG9ydFdpZHRoID4gYmVzdC0+dmlld3BvcnRXaWR0aAorCQkgICAgfHwgbW9kZXNbaV0udmlld3BvcnRIZWlnaHQgPiBiZXN0LT52aWV3cG9ydEhlaWdodCkKKwkJICAgIGJlc3QgPSAmbW9kZXNbaV07CisJICAgIH0KKwl9CisgICAgfQorCisgICAgVFJBQ0UoInVzaW5nICVkICVkIGZvciAlbHUgJWx1XG4iLCBiZXN0LT52aWV3cG9ydFdpZHRoLCBiZXN0LT52aWV3cG9ydEhlaWdodCwKKwkgIGR3V2lkdGgsIGR3SGVpZ2h0KTsKKworICAgIHJldHVybiBiZXN0OwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBMl9JRGlyZWN0RHJhdzJJbXBsX1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVcyIGlmYWNlKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICAgIFRSQUNFKCIoJXApLT4oKVxuIixUaGlzKTsKLSAgICBTbGVlcCgxMDAwKTsKLSAgICAKLSAgICBYREdBQ2xvc2VGcmFtZWJ1ZmZlcihkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSkpOwotICAgIFhER0FTZXRNb2RlKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwgMCk7CitCT09MIEREUkFXX1hGODZER0EyX0luaXQoSElOU1RBTkNFIGhJbnN0RExMLCBEV09SRCBmZHdSZWFzb24sIExQVk9JRCBscHYpCit7CisgICAgaWYgKGZkd1JlYXNvbiA9PSBETExfUFJPQ0VTU19BVFRBQ0gpCisgICAgeworCWlmIChpbml0aWFsaXplKCkpCisJICAgIEREUkFXX3JlZ2lzdGVyX2RyaXZlcigmeGY4NmRnYTJfZHJpdmVyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZmR3UmVhc29uID09IERMTF9QUk9DRVNTX0RFVEFDSCkKKyAgICB7CisJY2xlYW51cCgpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKiBOb3QgY2FsbGVkIGZyb20gdGhlIHZ0YWJsZS4gKi8KK0hSRVNVTFQgWEY4NkRHQTJfRGlyZWN0RHJhd19Db25zdHJ1Y3QoSURpcmVjdERyYXdJbXBsICpUaGlzLCBCT09MIGV4KQoreworICAgIEhSRVNVTFQgaHI7CisKKyAgICBUUkFDRSgiXG4iKTsKKworICAgIGhyID0gVXNlcl9EaXJlY3REcmF3X0NvbnN0cnVjdChUaGlzLCBleCk7CisgICAgaWYgKEZBSUxFRChocikpIHJldHVybiBocjsKKworICAgIFRoaXMtPmZpbmFsX3JlbGVhc2UgPSBYRjg2REdBMl9EaXJlY3REcmF3X2ZpbmFsX3JlbGVhc2U7CisKKyAgICBUaGlzLT5jcmVhdGVfcHJpbWFyeSAgICA9IFhGODZER0EyX0RpcmVjdERyYXdfY3JlYXRlX3ByaW1hcnk7CisgICAgVGhpcy0+Y3JlYXRlX2JhY2tidWZmZXIgPSBYRjg2REdBMl9EaXJlY3REcmF3X2NyZWF0ZV9iYWNrYnVmZmVyOworCisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcsIFhGODZER0EyX0RpcmVjdERyYXdfVlRhYmxlKTsKKworICAgIHJldHVybiBTX09LOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIERpcmVjdERyYXdDcmVhdGUoRXgpIG9uIHRoZSBtb3N0LWRlcml2ZWQKKyAqIGNsYXNzIHRvIHN0YXJ0IGNvbnN0cnVjdGlvbi4KKyAqIE5vdCBjYWxsZWQgZnJvbSB0aGUgdnRhYmxlLiAqLworSFJFU1VMVCBYRjg2REdBMl9EaXJlY3REcmF3X0NyZWF0ZShjb25zdCBHVUlEKiBwR1VJRCwgTFBESVJFQ1REUkFXNyogcElmYWNlLAorCQkJCSAgIElVbmtub3duKiBwVW5rT3V0ZXIsIEJPT0wgZXgpCit7CisgICAgSFJFU1VMVCBocjsKKyAgICBJRGlyZWN0RHJhd0ltcGwqIFRoaXM7CisKKyAgICBUUkFDRSgiXG4iKTsKKworICAgIGFzc2VydChwVW5rT3V0ZXIgPT0gTlVMTCk7CisKKyAgICBUaGlzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCisJCSAgICAgc2l6ZW9mKElEaXJlY3REcmF3SW1wbCkKKwkJICAgICArIHNpemVvZihYRjg2REdBMl9EaXJlY3REcmF3SW1wbCkpOworICAgIGlmIChUaGlzID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOworCisgICAgLyogTm90ZSB0aGF0IHRoaXMgcmVsYXRpb24gZG9lcyAqbm90KiBob2xkIHRydWUgaWYgdGhlIEREIG9iamVjdCB3YXMKKyAgICAgKiBDb0NyZWF0ZUluc3RhbmNlZCB0aGVuIEluaXRpYWxpemVkLiAqLworICAgIFRoaXMtPnByaXZhdGUgPSAoWEY4NkRHQTJfRGlyZWN0RHJhd0ltcGwgKikoVGhpcysxKTsKKworICAgIGhyID0gWEY4NkRHQTJfRGlyZWN0RHJhd19Db25zdHJ1Y3QoVGhpcywgZXgpOworICAgIGlmIChGQUlMRUQoaHIpKQorCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOworICAgIGVsc2UKKwkqcElmYWNlID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KTsKKworICAgIHJldHVybiBocjsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBVbmluaXRfRGlyZWN0RHJhd19Jbml0aWFsaXplIG9uIHRoZQorICogbW9zdC1kZXJpdmVkLWNsYXNzIHRvIHN0YXJ0IGluaXRpYWxpemF0aW9uLgorICogTm90IGNhbGxlZCBmcm9tIHRoZSB2dGFibGUuICovCitIUkVTVUxUIFhGODZER0EyX0RpcmVjdERyYXdfSW5pdGlhbGl6ZShJRGlyZWN0RHJhd0ltcGwgKlRoaXMsIGNvbnN0IEdVSUQqIGd1aWQpCit7CisgICAgSFJFU1VMVCBocjsKKworICAgIFRSQUNFKCJcbiIpOworCisgICAgVGhpcy0+cHJpdmF0ZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkJICAgICAgc2l6ZW9mKFhGODZER0EyX0RpcmVjdERyYXdJbXBsKSk7CisgICAgaWYgKFRoaXMtPnByaXZhdGUgPT0gTlVMTCkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisKKyAgICBociA9IFhGODZER0EyX0RpcmVjdERyYXdfQ29uc3RydWN0KFRoaXMsIFRSVUUpOyAvKiBYWFggZXg/ICovCisgICAgaWYgKEZBSUxFRChocikpCisgICAgeworCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPnByaXZhdGUpOworCXJldHVybiBocjsKKyAgICB9CiAKICAgICByZXR1cm4gRERfT0s7CiB9CiAKLXN0YXRpYyBVTE9ORyBXSU5BUEkgREdBMl9JRGlyZWN0RHJhdzJJbXBsX1JlbGVhc2UoTFBESVJFQ1REUkFXMiBpZmFjZSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBERFBSSVZBVEUoVGhpcyk7Ci0gICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIFRoaXMtPnJlZiApOworLyogQ2FsbGVkIGZyb20gYW4gaW50ZXJuYWwgZnVuY3Rpb24gcG9pbnRlci4gKi8KK3ZvaWQgWEY4NkRHQTJfRGlyZWN0RHJhd19maW5hbF9yZWxlYXNlKElEaXJlY3REcmF3SW1wbCAqVGhpcykKK3sKKyAgICBYRjg2REdBMl9ERFJBV19QUklWX1ZBUihwcml2LCBUaGlzKTsKIAotICAgIGlmICghLS0oVGhpcy0+cmVmKSkgewotICAgICAgaWYgKCEtLShUaGlzLT5kLT5yZWYpKSB7Ci0JICBUUkFDRSgiQ2xvc2luZyBhY2Nlc3MgdG8gdGhlIEZyYW1lQnVmZmVyXG4iKTsKLQkgIFZpcnR1YWxGcmVlKGRkcHJpdi0+REdBLmZiX2FkZHIsIDAsIE1FTV9SRUxFQVNFKTsKLQkgIFRTWERHQUNsb3NlRnJhbWVidWZmZXIoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSk7Ci0JICBUUkFDRSgiR29pbmcgYmFjayB0byBub3JtYWwgWCBtb2RlIG9mIG9wZXJhdGlvblxuIik7Ci0JICBUU1hER0FTZXRNb2RlKGRpc3BsYXksIERlZmF1bHRTY3JlZW4oZGlzcGxheSksIDApOwotCi0JICAvKiBTZXQgdGhlIGlucHV0IGhhbmRsaW5nIGJhY2sgdG8gYWJzb2x1dGUgKi8KLQkgIFgxMURSVl9FVkVOVF9TZXRJbnB1dE1ldGhvZChYMTFEUlZfSU5QVVRfQUJTT0xVVEUpOwotCSAgCi0JICAvKiBSZW1vdmUgdGhlIGhhbmRsaW5nIG9mIERHQTIgZXZlbnRzICovCi0JICBYMTFEUlZfRVZFTlRfU2V0REdBU3RhdHVzKDAsIC0xKTsKLQkgIAotCSAgLyogRnJlZSB0aGUgbW9kZXMgbGlzdCAqLwotCSAgVFNYRnJlZShkZHByaXYtPm1vZGVzKTsKLSAgICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcy0+ZCk7Ci0gICAgICB9Ci0gICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcyk7Ci0gICAgICByZXR1cm4gMDsKKyAgICBpZiAocHJpdi0+eGY4NmRnYTIuY3VycmVudF9tb2RlKSB7CisJVFNYREdBU2V0TW9kZShkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLCAwKTsKKwlWaXJ0dWFsRnJlZShwcml2LT54Zjg2ZGdhMi5jdXJyZW50X21vZGUtPmRhdGEsIDAsIE1FTV9SRUxFQVNFKTsKKwlYMTFEUlZfRVZFTlRfU2V0SW5wdXRNZXRob2QoWDExRFJWX0lOUFVUX0FCU09MVVRFKTsKKwlYMTFEUlZfRVZFTlRfU2V0REdBU3RhdHVzKDAsIC0xKTsKKwlUU1hGcmVlKHByaXYtPnhmODZkZ2EyLmN1cnJlbnRfbW9kZSk7CisJVFNYREdBQ2xvc2VGcmFtZWJ1ZmZlcihkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKTsKKwlwcml2LT54Zjg2ZGdhMi5jdXJyZW50X21vZGUgPSBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gVGhpcy0+cmVmOworCisgICAgVXNlcl9EaXJlY3REcmF3X2ZpbmFsX3JlbGVhc2UoVGhpcyk7CiB9CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0EyX0lEaXJlY3REcmF3MkltcGxfRW51bURpc3BsYXlNb2RlcygKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLERXT1JEIGR3RmxhZ3MsTFBERFNVUkZBQ0VERVNDIGxwZGRzZmQsTFBWT0lEIGNvbnRleHQsTFBEREVOVU1NT0RFU0NBTExCQUNLIG1vZGVzY2IKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBERFNVUkZBQ0VERVNDCWRkc2ZkOwotICAgIEREUFJJVkFURShUaGlzKTsKLSAgICBpbnQJaTsKLSAgICBYREdBTW9kZSAqbW9kZXMgPSBkZHByaXYtPm1vZGVzOworSFJFU1VMVCBYRjg2REdBMl9EaXJlY3REcmF3X2NyZWF0ZV9wcmltYXJ5KElEaXJlY3REcmF3SW1wbCogVGhpcywKKwkJCQkJICAgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAorCQkJCQkgICBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLAorCQkJCQkgICBJVW5rbm93biogcFVua091dGVyKQoreworICAgIGlmIChUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCAmIEREU0NMX0VYQ0xVU0lWRSkKKwlyZXR1cm4gWEY4NkRHQTJfRGlyZWN0RHJhd1N1cmZhY2VfQ3JlYXRlKFRoaXMsIHBERFNELCBwcFN1cmYsIHBVbmtPdXRlcik7CisgICAgZWxzZQorCXJldHVybiBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLCBwRERTRCwgcHBTdXJmLCBwVW5rT3V0ZXIpOworfQogCi0gICAgVFJBQ0UoIiglcCktPigweCUwOGx4LCVwLCVwLCVwKVxuIixUaGlzLGR3RmxhZ3MsbHBkZHNmZCxjb250ZXh0LG1vZGVzY2IpOwotICAgIGRkc2ZkLmR3U2l6ZSA9IHNpemVvZihkZHNmZCk7Ci0gICAgZGRzZmQuZHdGbGFncyA9IEREU0RfSEVJR0hUfEREU0RfV0lEVEh8RERTRF9CQUNLQlVGRkVSQ09VTlR8RERTRF9QSVhFTEZPUk1BVHxERFNEX0NBUFM7Ci0gICAgaWYgKGR3RmxhZ3MgJiBEREVETV9SRUZSRVNIUkFURVMpIHsKLQkgICAgZGRzZmQuZHdGbGFncyB8PSBERFNEX1JFRlJFU0hSQVRFOwotCSAgICBkZHNmZC51LmR3UmVmcmVzaFJhdGUgPSA2MDsKLSAgICB9Ci0gICAgZGRzZmQuZGRzQ2Fwcy5kd0NhcHMgPSAwOwotICAgIGRkc2ZkLmR3QmFja0J1ZmZlckNvdW50ID0gMTsKK0hSRVNVTFQgWEY4NkRHQTJfRGlyZWN0RHJhd19jcmVhdGVfYmFja2J1ZmZlcihJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCisJCQkJCSAgICAgIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKKwkJCQkJICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwKKwkJCQkJICAgICAgSVVua25vd24qIHBVbmtPdXRlciwKKwkJCQkJICAgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJpbWFyeSkKK3sKKyAgICBpZiAoVGhpcy0+Y29vcGVyYXRpdmVfbGV2ZWwgJiBERFNDTF9FWENMVVNJVkUpCisJcmV0dXJuIFhGODZER0EyX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLCBwRERTRCwgcHBTdXJmLCBwVW5rT3V0ZXIpOworICAgIGVsc2UKKwlyZXR1cm4gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoVGhpcywgcEREU0QsIHBwU3VyZiwgcFVua091dGVyKTsKK30KIAotCi0gICAgZGRzZmQuZHdGbGFncyB8PSBERFNEX1BJVENIOwotICAgIGZvciAoaSA9IDA7IGkgPCBkZHByaXYtPm51bV9tb2RlczsgaSsrKSB7Ci0gICAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JRFBSSU5URigiICBFbnVtZXJhdGluZyBtb2RlICVkIDogJXMgKEZCOiAlZHglZCAvIFZQOiAlZHglZCkgLSBkZXB0aCAlZCAtIiwKLQkJbW9kZXNbaV0ubnVtLAotCQltb2Rlc1tpXS5uYW1lLCBtb2Rlc1tpXS5pbWFnZVdpZHRoLCBtb2Rlc1tpXS5pbWFnZUhlaWdodCwKLQkJbW9kZXNbaV0udmlld3BvcnRXaWR0aCwgbW9kZXNbaV0udmlld3BvcnRIZWlnaHQsCi0JCW1vZGVzW2ldLmRlcHRoKTsKLQlpZiAobW9kZXNbaV0uZmxhZ3MgJiBYREdBQ29uY3VycmVudEFjY2VzcykgRFBSSU5URigiIFhER0FDb25jdXJyZW50QWNjZXNzICIpOwotCWlmIChtb2Rlc1tpXS5mbGFncyAmIFhER0FTb2xpZEZpbGxSZWN0KSBEUFJJTlRGKCIgWERHQVNvbGlkRmlsbFJlY3QgIik7Ci0JaWYgKG1vZGVzW2ldLmZsYWdzICYgWERHQUJsaXRSZWN0KSBEUFJJTlRGKCIgWERHQUJsaXRSZWN0ICIpOwotCWlmIChtb2Rlc1tpXS5mbGFncyAmIFhER0FCbGl0VHJhbnNSZWN0KSBEUFJJTlRGKCIgWERHQUJsaXRUcmFuc1JlY3QgIik7Ci0JaWYgKG1vZGVzW2ldLmZsYWdzICYgWERHQVBpeG1hcCkgRFBSSU5URigiIFhER0FQaXhtYXAgIik7Ci0JRFBSSU5URigiXG4iKTsKLSAgICAgIH0KLSAgICAgIC8qIEZpbGwgdGhlIHBpeGVsIGZvcm1hdCAqLwotICAgICAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LmR3U2l6ZSA9IHNpemVvZihERFBJWEVMRk9STUFUKTsKLSAgICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC5kd0ZvdXJDQyA9IDA7Ci0gICAgICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTQuZHdSR0JBbHBoYUJpdE1hc2s9IDA7Ci0gICAgICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50ID0gbW9kZXNbaV0uYml0c1BlclBpeGVsOwotICAgICAgaWYgKG1vZGVzW2ldLmRlcHRoID09IDgpIHsKLQlkZHNmZC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyA9IEREUEZfUkdCfEREUEZfUEFMRVRURUlOREVYRUQ4OwotCWRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51MS5kd1JCaXRNYXNrID0gMDsKLQlkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTIuZHdHQml0TWFzayA9IDA7Ci0JZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUzLmR3QkJpdE1hc2sgPSAwOwotCWRkc2ZkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19QQUxFVFRFOwotICAgICAgfSBlbHNlIHsKLQlkZHNmZC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyA9IEREUEZfUkdCOwotCWRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51MS5kd1JCaXRNYXNrID0gbW9kZXNbaV0ucmVkTWFzazsKLQlkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTIuZHdHQml0TWFzayA9IG1vZGVzW2ldLmdyZWVuTWFzazsKLQlkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTMuZHdCQml0TWFzayA9IG1vZGVzW2ldLmJsdWVNYXNrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZHNmZC5kd1dpZHRoID0gbW9kZXNbaV0udmlld3BvcnRXaWR0aDsKLSAgICAgIGRkc2ZkLmR3SGVpZ2h0ID0gbW9kZXNbaV0udmlld3BvcnRIZWlnaHQ7Ci0gICAgICBkZHNmZC5sUGl0Y2ggPSBtb2Rlc1tpXS5pbWFnZVdpZHRoOwotICAgICAgCi0gICAgICAvKiBTZW5kIG1vZGUgdG8gdGhlIGFwcGxpY2F0aW9uICovCi0gICAgICBpZiAoIW1vZGVzY2IoJmRkc2ZkLGNvbnRleHQpKSByZXR1cm4gRERfT0s7Ci0gICAgfQotICAgIAorSFJFU1VMVCBXSU5BUEkKK1hGODZER0EyX0RpcmVjdERyYXdfR2V0RGV2aWNlSWRlbnRpZmllcihMUERJUkVDVERSQVc3IGlmYWNlLAorCQkJCQlMUEREREVWSUNFSURFTlRJRklFUjIgcEREREksCisJCQkJCURXT1JEIGR3RmxhZ3MpCit7CisgICAgKnBERERJID0geGY4NmRnYTJfZGV2aWNlOwogICAgIHJldHVybiBERF9PSzsKIH0KIAotLyogTm90ZTogSGFjayBzbyB3ZSBjYW4gcmV1c2UgdGhlIG9sZCBmdW5jdGlvbnMgd2l0aG91dCBjb21waWxlciB3YXJuaW5ncyAqLwotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSMgZGVmaW5lIFhDQVNUKGZ1bikJKHR5cGVvZihkZ2EyX2RkdnQuZm4jI2Z1bikpCi0jZWxzZQotIyBkZWZpbmUgWENBU1QoZnVuKQkodm9pZCAqKQotI2VuZGlmCi0KLXN0cnVjdCBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhdykgZGdhMl9kZHZ0ID0gCitIUkVTVUxUIFdJTkFQSQorWEY4NkRHQTJfRGlyZWN0RHJhd19SZXN0b3JlRGlzcGxheU1vZGUoTFBESVJFQ1REUkFXNyBpZmFjZSkKIHsKLSAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9EdW1teVJUVElWQUxVRQotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKURHQV9JRGlyZWN0RHJhdzJJbXBsX1F1ZXJ5SW50ZXJmYWNlLAotICAgIFhDQVNUKEFkZFJlZilJRGlyZWN0RHJhdzJJbXBsX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKURHQTJfSURpcmVjdERyYXcySW1wbF9SZWxlYXNlLAotICAgIFhDQVNUKENvbXBhY3QpSURpcmVjdERyYXcySW1wbF9Db21wYWN0LAotICAgIFhDQVNUKENyZWF0ZUNsaXBwZXIpSURpcmVjdERyYXcySW1wbF9DcmVhdGVDbGlwcGVyLAotICAgIFhDQVNUKENyZWF0ZVBhbGV0dGUpREdBMl9JRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVBhbGV0dGUsCi0gICAgWENBU1QoQ3JlYXRlU3VyZmFjZSlER0EyX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlU3VyZmFjZSwKLSAgICBYQ0FTVChEdXBsaWNhdGVTdXJmYWNlKUlEaXJlY3REcmF3MkltcGxfRHVwbGljYXRlU3VyZmFjZSwKLSAgICBYQ0FTVChFbnVtRGlzcGxheU1vZGVzKURHQTJfSURpcmVjdERyYXcySW1wbF9FbnVtRGlzcGxheU1vZGVzLAotICAgIFhDQVNUKEVudW1TdXJmYWNlcylJRGlyZWN0RHJhdzJJbXBsX0VudW1TdXJmYWNlcywKLSAgICBYQ0FTVChGbGlwVG9HRElTdXJmYWNlKUlEaXJlY3REcmF3MkltcGxfRmxpcFRvR0RJU3VyZmFjZSwKLSAgICBYQ0FTVChHZXRDYXBzKURHQV9JRGlyZWN0RHJhdzJJbXBsX0dldENhcHMsCi0gICAgWENBU1QoR2V0RGlzcGxheU1vZGUpREdBX0lEaXJlY3REcmF3MkltcGxfR2V0RGlzcGxheU1vZGUsCi0gICAgWENBU1QoR2V0Rm91ckNDQ29kZXMpSURpcmVjdERyYXcySW1wbF9HZXRGb3VyQ0NDb2RlcywKLSAgICBYQ0FTVChHZXRHRElTdXJmYWNlKUlEaXJlY3REcmF3MkltcGxfR2V0R0RJU3VyZmFjZSwKLSAgICBYQ0FTVChHZXRNb25pdG9yRnJlcXVlbmN5KUlEaXJlY3REcmF3MkltcGxfR2V0TW9uaXRvckZyZXF1ZW5jeSwKLSAgICBYQ0FTVChHZXRTY2FuTGluZSlJRGlyZWN0RHJhdzJJbXBsX0dldFNjYW5MaW5lLAotICAgIFhDQVNUKEdldFZlcnRpY2FsQmxhbmtTdGF0dXMpSURpcmVjdERyYXcySW1wbF9HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzLAotICAgIFhDQVNUKEluaXRpYWxpemUpSURpcmVjdERyYXcySW1wbF9Jbml0aWFsaXplLAotICAgIFhDQVNUKFJlc3RvcmVEaXNwbGF5TW9kZSlER0EyX0lEaXJlY3REcmF3MkltcGxfUmVzdG9yZURpc3BsYXlNb2RlLAotICAgIFhDQVNUKFNldENvb3BlcmF0aXZlTGV2ZWwpREdBMl9JRGlyZWN0RHJhdzJJbXBsX1NldENvb3BlcmF0aXZlTGV2ZWwsCi0gICAgREdBMl9JRGlyZWN0RHJhd0ltcGxfU2V0RGlzcGxheU1vZGUsCi0gICAgWENBU1QoV2FpdEZvclZlcnRpY2FsQmxhbmspSURpcmVjdERyYXcySW1wbF9XYWl0Rm9yVmVydGljYWxCbGFuaywKLX07Ci0jdW5kZWYgWENBU1QKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLCBpZmFjZSk7CisgICAgSFJFU1VMVCBocjsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJSURpcmVjdERyYXcyCi0gKgotICovCisgICAgVFJBQ0UoIlxuIik7CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0EyX0lEaXJlY3REcmF3MkltcGxfU2V0RGlzcGxheU1vZGUoCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSxEV09SRCB3aWR0aCxEV09SRCBoZWlnaHQsRFdPUkQgZGVwdGgsRFdPUkQgZHdSZWZyZXNoUmF0ZSwgRFdPUkQgZHdGbGFncwotKSB7Ci0gICAgRklYTUUoICJJZ25vcmVkIHBhcmFtZXRlcnMgKDB4JTA4bHgsMHglMDhseClcbiIsIGR3UmVmcmVzaFJhdGUsIGR3RmxhZ3MgKTsgCi0gICAgcmV0dXJuIERHQTJfSURpcmVjdERyYXdJbXBsX1NldERpc3BsYXlNb2RlKChMUERJUkVDVERSQVcpaWZhY2Usd2lkdGgsaGVpZ2h0LGRlcHRoKTsKKyAgICBociA9IE1haW5fRGlyZWN0RHJhd19SZXN0b3JlRGlzcGxheU1vZGUoaWZhY2UpOworICAgIGlmIChTVUNDRUVERUQoaHIpKQorICAgIHsKKwlYRjg2REdBMl9ERFJBV19QUklWX1ZBUihwcml2LCBUaGlzKTsKKworCWlmIChwcml2LT54Zjg2ZGdhMi5jdXJyZW50X21vZGUpCisJeworCSAgICBUU1hER0FTZXRNb2RlKGRpc3BsYXksIERlZmF1bHRTY3JlZW4oZGlzcGxheSksIDApOworCSAgICBWaXJ0dWFsRnJlZShwcml2LT54Zjg2ZGdhMi5jdXJyZW50X21vZGUtPmRhdGEsIDAsIE1FTV9SRUxFQVNFKTsKKwkgICAgWDExRFJWX0VWRU5UX1NldElucHV0TWV0aG9kKFgxMURSVl9JTlBVVF9BQlNPTFVURSk7CisJICAgIFgxMURSVl9FVkVOVF9TZXRER0FTdGF0dXMoMCwgLTEpOworCSAgICBUU1hGcmVlKHByaXYtPnhmODZkZ2EyLmN1cnJlbnRfbW9kZSk7CisJICAgIFRTWERHQUNsb3NlRnJhbWVidWZmZXIoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSk7CisJICAgIHByaXYtPnhmODZkZ2EyLmN1cnJlbnRfbW9kZSA9IE5VTEw7CisJfQorICAgIH0KKworICAgIHJldHVybiBocjsKIH0KIAotSUNPTV9WVEFCTEUoSURpcmVjdERyYXcyKSBkZ2EyX2RkMnZ0ID0gCitIUkVTVUxUIFdJTkFQSQorWEY4NkRHQTJfRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZShMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd1dpZHRoLAorCQkJCSAgIERXT1JEIGR3SGVpZ2h0LCBEV09SRCBkd0JQUCwKKwkJCQkgICBEV09SRCBkd1JlZnJlc2hSYXRlLCBEV09SRCBkd0ZsYWdzKQogewotICAgIElDT01fTVNWVEFCTEVfQ09NUEFUX0R1bW15UlRUSVZBTFVFCi0gICAgREdBX0lEaXJlY3REcmF3MkltcGxfUXVlcnlJbnRlcmZhY2UsCi0gICAgSURpcmVjdERyYXcySW1wbF9BZGRSZWYsCi0gICAgREdBMl9JRGlyZWN0RHJhdzJJbXBsX1JlbGVhc2UsCi0gICAgSURpcmVjdERyYXcySW1wbF9Db21wYWN0LAotICAgIElEaXJlY3REcmF3MkltcGxfQ3JlYXRlQ2xpcHBlciwKLSAgICBER0EyX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlUGFsZXR0ZSwKLSAgICBER0EyX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlU3VyZmFjZSwKLSAgICBJRGlyZWN0RHJhdzJJbXBsX0R1cGxpY2F0ZVN1cmZhY2UsCi0gICAgREdBMl9JRGlyZWN0RHJhdzJJbXBsX0VudW1EaXNwbGF5TW9kZXMsCi0gICAgSURpcmVjdERyYXcySW1wbF9FbnVtU3VyZmFjZXMsCi0gICAgSURpcmVjdERyYXcySW1wbF9GbGlwVG9HRElTdXJmYWNlLAotICAgIERHQV9JRGlyZWN0RHJhdzJJbXBsX0dldENhcHMsCi0gICAgREdBX0lEaXJlY3REcmF3MkltcGxfR2V0RGlzcGxheU1vZGUsCi0gICAgSURpcmVjdERyYXcySW1wbF9HZXRGb3VyQ0NDb2RlcywKLSAgICBJRGlyZWN0RHJhdzJJbXBsX0dldEdESVN1cmZhY2UsCi0gICAgSURpcmVjdERyYXcySW1wbF9HZXRNb25pdG9yRnJlcXVlbmN5LAotICAgIElEaXJlY3REcmF3MkltcGxfR2V0U2NhbkxpbmUsCi0gICAgSURpcmVjdERyYXcySW1wbF9HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzLAotICAgIElEaXJlY3REcmF3MkltcGxfSW5pdGlhbGl6ZSwKLSAgICBER0EyX0lEaXJlY3REcmF3MkltcGxfUmVzdG9yZURpc3BsYXlNb2RlLAotICAgIERHQTJfSURpcmVjdERyYXcySW1wbF9TZXRDb29wZXJhdGl2ZUxldmVsLAotICAgIERHQTJfSURpcmVjdERyYXcySW1wbF9TZXREaXNwbGF5TW9kZSwKLSAgICBJRGlyZWN0RHJhdzJJbXBsX1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAotICAgIERHQV9JRGlyZWN0RHJhdzJJbXBsX0dldEF2YWlsYWJsZVZpZE1lbQorICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0ltcGwsIGlmYWNlKTsKKworICAgIEhSRVNVTFQgaHI7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVsZHglbGR4JWxkLCVsZCBIeiwlMDhseClcbiIsVGhpcyxkd1dpZHRoLGR3SGVpZ2h0LGR3QlBQLGR3UmVmcmVzaFJhdGUsZHdGbGFncyk7CisgICAgaHIgPSBVc2VyX0RpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoaWZhY2UsIGR3V2lkdGgsIGR3SGVpZ2h0LCBkd0JQUCwKKwkJCQkJZHdSZWZyZXNoUmF0ZSwgZHdGbGFncyk7CisKKyAgICBpZiAoU1VDQ0VFREVEKGhyKSkKKyAgICB7CisJWEY4NkRHQTJfRERSQVdfUFJJVl9WQVIocHJpdiwgVGhpcyk7CisJWERHQURldmljZSogb2xkX21vZGUgPSBwcml2LT54Zjg2ZGdhMi5jdXJyZW50X21vZGU7CisJWERHQU1vZGUqIG5ld19tb2RlOworCWludCBvbGRfbW9kZV9udW0gPSBvbGRfbW9kZSA/IG9sZF9tb2RlLT5tb2RlLm51bSA6IDA7CisKKwluZXdfbW9kZSA9IGNob29zZV9tb2RlKGR3V2lkdGgsIGR3SGVpZ2h0LCBkd1JlZnJlc2hSYXRlLCBkd0ZsYWdzKTsKKworCWlmIChuZXdfbW9kZSAmJiBuZXdfbW9kZS0+bnVtICE9IG9sZF9tb2RlX251bSkKKwl7CisJICAgIFhER0FEZXZpY2UgKiBubSA9IE5VTEw7CisJICAgIGlmIChvbGRfbW9kZSB8fCBUU1hER0FPcGVuRnJhbWVidWZmZXIoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSkpCisJCW5tID0gVFNYREdBU2V0TW9kZShkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLCBuZXdfbW9kZS0+bnVtKTsKKwkgICAgaWYgKG5tKSB7CisJCVRTWERHQVNldFZpZXdwb3J0KGRpc3BsYXksIERlZmF1bHRTY3JlZW4oZGlzcGxheSksIDAsIDAsIFhER0FGbGlwSW1tZWRpYXRlKTsKKwkJaWYgKG9sZF9tb2RlKSB7CisJCSAgICBWaXJ0dWFsRnJlZShvbGRfbW9kZS0+ZGF0YSwgMCwgTUVNX1JFTEVBU0UpOworCQkgICAgVFNYRnJlZShvbGRfbW9kZSk7CisJCX0gZWxzZSB7CisJCSAgICBUU1hER0FTZWxlY3RJbnB1dChkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLAorCQkJCSAgICAgIEtleVByZXNzTWFza3xLZXlSZWxlYXNlTWFza3wKKwkJCQkgICAgICBCdXR0b25QcmVzc01hc2t8QnV0dG9uUmVsZWFzZU1hc2t8CisJCQkJICAgICAgUG9pbnRlck1vdGlvbk1hc2spOworCQkgICAgWDExRFJWX0VWRU5UX1NldERHQVN0YXR1cyhUaGlzLT53aW5kb3csIGRnYV9ldmVudCk7CisJCSAgICBYMTFEUlZfRVZFTlRfU2V0SW5wdXRNZXRob2QoWDExRFJWX0lOUFVUX1JFTEFUSVZFKTsKKwkJfQorCQlwcml2LT54Zjg2ZGdhMi5jdXJyZW50X21vZGUgPSBubTsKKwkJcHJpdi0+eGY4NmRnYTIubmV4dF92b2ZzID0gMDsKKwkJVFJBQ0UoImZyYW1lIGJ1ZmZlciBhdCAlcCwgcGl0Y2g9JWQsIHdpZHRoPSVkLCBoZWlnaHQ9JWRcbiIsIG5tLT5kYXRhLAorCQkgICAgICBubS0+bW9kZS5ieXRlc1BlclNjYW5saW5lLCBubS0+bW9kZS5pbWFnZVdpZHRoLCBubS0+bW9kZS5pbWFnZUhlaWdodCk7CisJCVZpcnR1YWxBbGxvYyhubS0+ZGF0YSwgbm0tPm1vZGUuYnl0ZXNQZXJTY2FubGluZSAqIG5tLT5tb2RlLmltYWdlSGVpZ2h0LAorCQkJICAgICBNRU1fUkVTRVJWRXxNRU1fU1lTVEVNLCBQQUdFX1JFQURXUklURSk7CisJICAgIH0gZWxzZSB7CisJCS8qIGFyZ2ggKi8KKwkJRVJSKCJmYWlsZWRcbiIpOworCQkvKiBYWFggcmV2ZXJ0IHNpemUgZGF0YSB0byBwcmV2aW91cyBtb2RlICovCisJCWlmICghb2xkX21vZGUpCisJCSAgICBUU1hER0FDbG9zZUZyYW1lYnVmZmVyKGRpc3BsYXksIERlZmF1bHRTY3JlZW4oZGlzcGxheSkpOworCSAgICB9CisJfQorICAgIH0KKworICAgIHJldHVybiBocjsKK30KKworc3RhdGljIElDT01fVlRBQkxFKElEaXJlY3REcmF3NykgWEY4NkRHQTJfRGlyZWN0RHJhd19WVGFibGUgPQoreworICAgIE1haW5fRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdfQWRkUmVmLAorICAgIE1haW5fRGlyZWN0RHJhd19SZWxlYXNlLAorICAgIE1haW5fRGlyZWN0RHJhd19Db21wYWN0LAorICAgIE1haW5fRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyLAorICAgIE1haW5fRGlyZWN0RHJhd19DcmVhdGVQYWxldHRlLAorICAgIE1haW5fRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlLAorICAgIE1haW5fRGlyZWN0RHJhd19EdXBsaWNhdGVTdXJmYWNlLAorICAgIFVzZXJfRGlyZWN0RHJhd19FbnVtRGlzcGxheU1vZGVzLAorICAgIE1haW5fRGlyZWN0RHJhd19FbnVtU3VyZmFjZXMsCisgICAgTWFpbl9EaXJlY3REcmF3X0ZsaXBUb0dESVN1cmZhY2UsCisgICAgVXNlcl9EaXJlY3REcmF3X0dldENhcHMsCisgICAgTWFpbl9EaXJlY3REcmF3X0dldERpc3BsYXlNb2RlLAorICAgIE1haW5fRGlyZWN0RHJhd19HZXRGb3VyQ0NDb2RlcywKKyAgICBNYWluX0RpcmVjdERyYXdfR2V0R0RJU3VyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdfR2V0TW9uaXRvckZyZXF1ZW5jeSwKKyAgICBNYWluX0RpcmVjdERyYXdfR2V0U2NhbkxpbmUsCisgICAgTWFpbl9EaXJlY3REcmF3X0dldFZlcnRpY2FsQmxhbmtTdGF0dXMsCisgICAgTWFpbl9EaXJlY3REcmF3X0luaXRpYWxpemUsCisgICAgWEY4NkRHQTJfRGlyZWN0RHJhd19SZXN0b3JlRGlzcGxheU1vZGUsCisgICAgTWFpbl9EaXJlY3REcmF3X1NldENvb3BlcmF0aXZlTGV2ZWwsCisgICAgWEY4NkRHQTJfRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZSwKKyAgICBNYWluX0RpcmVjdERyYXdfV2FpdEZvclZlcnRpY2FsQmxhbmssCisgICAgTWFpbl9EaXJlY3REcmF3X0dldEF2YWlsYWJsZVZpZE1lbSwKKyAgICBNYWluX0RpcmVjdERyYXdfR2V0U3VyZmFjZUZyb21EQywKKyAgICBNYWluX0RpcmVjdERyYXdfUmVzdG9yZUFsbFN1cmZhY2VzLAorICAgIE1haW5fRGlyZWN0RHJhd19UZXN0Q29vcGVyYXRpdmVMZXZlbCwKKyAgICBYRjg2REdBMl9EaXJlY3REcmF3X0dldERldmljZUlkZW50aWZpZXIsCisgICAgTWFpbl9EaXJlY3REcmF3X1N0YXJ0TW9kZVRlc3QsCisgICAgTWFpbl9EaXJlY3REcmF3X0V2YWx1YXRlTW9kZQogfTsKIAotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSMgZGVmaW5lIFhDQVNUKGZ1bikJKHR5cGVvZihkZ2EyX2RkNHZ0LmZuIyNmdW4pKQotI2Vsc2UKLSMgZGVmaW5lIFhDQVNUKGZ1bikJKHZvaWQqKQotI2VuZGlmCi0KLUlDT01fVlRBQkxFKElEaXJlY3REcmF3NCkgZGdhMl9kZDR2dCA9IAotewotICAgIElDT01fTVNWVEFCTEVfQ09NUEFUX0R1bW15UlRUSVZBTFVFCi0gICAgWENBU1QoUXVlcnlJbnRlcmZhY2UpREdBX0lEaXJlY3REcmF3MkltcGxfUXVlcnlJbnRlcmZhY2UsCi0gICAgWENBU1QoQWRkUmVmKUlEaXJlY3REcmF3MkltcGxfQWRkUmVmLAotICAgIFhDQVNUKFJlbGVhc2UpREdBMl9JRGlyZWN0RHJhdzJJbXBsX1JlbGVhc2UsCi0gICAgWENBU1QoQ29tcGFjdClJRGlyZWN0RHJhdzJJbXBsX0NvbXBhY3QsCi0gICAgWENBU1QoQ3JlYXRlQ2xpcHBlcilJRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZUNsaXBwZXIsCi0gICAgWENBU1QoQ3JlYXRlUGFsZXR0ZSlER0EyX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlUGFsZXR0ZSwKLSAgICBYQ0FTVChDcmVhdGVTdXJmYWNlKURHQTJfSURpcmVjdERyYXcySW1wbF9DcmVhdGVTdXJmYWNlLAotICAgIFhDQVNUKER1cGxpY2F0ZVN1cmZhY2UpSURpcmVjdERyYXcySW1wbF9EdXBsaWNhdGVTdXJmYWNlLAotICAgIFhDQVNUKEVudW1EaXNwbGF5TW9kZXMpREdBMl9JRGlyZWN0RHJhdzJJbXBsX0VudW1EaXNwbGF5TW9kZXMsCi0gICAgWENBU1QoRW51bVN1cmZhY2VzKUlEaXJlY3REcmF3MkltcGxfRW51bVN1cmZhY2VzLAotICAgIFhDQVNUKEZsaXBUb0dESVN1cmZhY2UpSURpcmVjdERyYXcySW1wbF9GbGlwVG9HRElTdXJmYWNlLAotICAgIFhDQVNUKEdldENhcHMpREdBX0lEaXJlY3REcmF3MkltcGxfR2V0Q2FwcywKLSAgICBYQ0FTVChHZXREaXNwbGF5TW9kZSlER0FfSURpcmVjdERyYXcySW1wbF9HZXREaXNwbGF5TW9kZSwKLSAgICBYQ0FTVChHZXRGb3VyQ0NDb2RlcylJRGlyZWN0RHJhdzJJbXBsX0dldEZvdXJDQ0NvZGVzLAotICAgIFhDQVNUKEdldEdESVN1cmZhY2UpSURpcmVjdERyYXcySW1wbF9HZXRHRElTdXJmYWNlLAotICAgIFhDQVNUKEdldE1vbml0b3JGcmVxdWVuY3kpSURpcmVjdERyYXcySW1wbF9HZXRNb25pdG9yRnJlcXVlbmN5LAotICAgIFhDQVNUKEdldFNjYW5MaW5lKUlEaXJlY3REcmF3MkltcGxfR2V0U2NhbkxpbmUsCi0gICAgWENBU1QoR2V0VmVydGljYWxCbGFua1N0YXR1cylJRGlyZWN0RHJhdzJJbXBsX0dldFZlcnRpY2FsQmxhbmtTdGF0dXMsCi0gICAgWENBU1QoSW5pdGlhbGl6ZSlJRGlyZWN0RHJhdzJJbXBsX0luaXRpYWxpemUsCi0gICAgWENBU1QoUmVzdG9yZURpc3BsYXlNb2RlKURHQTJfSURpcmVjdERyYXcySW1wbF9SZXN0b3JlRGlzcGxheU1vZGUsCi0gICAgWENBU1QoU2V0Q29vcGVyYXRpdmVMZXZlbClER0EyX0lEaXJlY3REcmF3MkltcGxfU2V0Q29vcGVyYXRpdmVMZXZlbCwKLSAgICBYQ0FTVChTZXREaXNwbGF5TW9kZSlER0EyX0lEaXJlY3REcmF3SW1wbF9TZXREaXNwbGF5TW9kZSwKLSAgICBYQ0FTVChXYWl0Rm9yVmVydGljYWxCbGFuaylJRGlyZWN0RHJhdzJJbXBsX1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAotICAgIFhDQVNUKEdldEF2YWlsYWJsZVZpZE1lbSlER0FfSURpcmVjdERyYXcySW1wbF9HZXRBdmFpbGFibGVWaWRNZW0sCi0gICAgSURpcmVjdERyYXc0SW1wbF9HZXRTdXJmYWNlRnJvbURDLAotICAgIElEaXJlY3REcmF3NEltcGxfUmVzdG9yZUFsbFN1cmZhY2VzLAotICAgIElEaXJlY3REcmF3NEltcGxfVGVzdENvb3BlcmF0aXZlTGV2ZWwsCi0gICAgSURpcmVjdERyYXc0SW1wbF9HZXREZXZpY2VJZGVudGlmaWVyCi19OwotI3VuZGVmIFhDQVNUCisjZW5kaWYgIC8qIEhBVkVfTElCWFhGODZER0EyICovCmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RkcmF3L2RnYTIuaCBiL2RsbHMvZGRyYXcvZGRyYXcvZGdhMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDZiODMKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RkcmF3L2RnYTIuaApAQCAtMCwwICsxLDQ4IEBACisvKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMsIEluYy4gKi8KKyNpZm5kZWYgV0lORV9ERFJBV19ERFJBV19ER0EyX0hfSU5DTFVERUQKKyNkZWZpbmUgV0lORV9ERFJBV19ERFJBV19ER0EyX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3hmODZkZ2EuaD4KKworI2RlZmluZSBYRjg2REdBMl9ERFJBV19QUklWKGRkcmF3KSBcCisJKChYRjg2REdBMl9EaXJlY3REcmF3SW1wbCopKChkZHJhdyktPnByaXZhdGUpKQorI2RlZmluZSBYRjg2REdBMl9ERFJBV19QUklWX1ZBUihuYW1lLGRkcmF3KSBcCisJWEY4NkRHQTJfRGlyZWN0RHJhd0ltcGwqIG5hbWUgPSBYRjg2REdBMl9ERFJBV19QUklWKGRkcmF3KQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIFhER0FEZXZpY2UqIGN1cnJlbnRfbW9kZTsKKyAgICBEV09SRCBuZXh0X3ZvZnM7Cit9IFhGODZER0EyX0RpcmVjdERyYXdJbXBsX1BhcnQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVXNlcl9EaXJlY3REcmF3SW1wbF9QYXJ0IHVzZXI7CisgICAgWEY4NkRHQTJfRGlyZWN0RHJhd0ltcGxfUGFydCB4Zjg2ZGdhMjsKK30gWEY4NkRHQTJfRGlyZWN0RHJhd0ltcGw7CisKK3ZvaWQgWEY4NkRHQTJfRGlyZWN0RHJhd19maW5hbF9yZWxlYXNlKElEaXJlY3REcmF3SW1wbCogVGhpcyk7CitIUkVTVUxUIFhGODZER0EyX0RpcmVjdERyYXdfY3JlYXRlX3ByaW1hcnkoSURpcmVjdERyYXdJbXBsKiBUaGlzLAorCQkJCQkgICBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QsCisJCQkJCSAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsCisJCQkJCSAgIExQVU5LTk9XTiBwT3V0ZXIpOworSFJFU1VMVCBYRjg2REdBMl9EaXJlY3REcmF3X2NyZWF0ZV9iYWNrYnVmZmVyKElEaXJlY3REcmF3SW1wbCogVGhpcywKKwkJCQkJICAgICAgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAorCQkJCQkgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLAorCQkJCQkgICAgICBMUFVOS05PV04gcE91dGVyLAorCQkJCQkgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBwcmltYXJ5KTsKK0hSRVNVTFQgWEY4NkRHQTJfRGlyZWN0RHJhd19Db25zdHJ1Y3QoSURpcmVjdERyYXdJbXBsICpUaGlzLCBCT09MIGV4KTsKK0hSRVNVTFQgWEY4NkRHQTJfRGlyZWN0RHJhd19DcmVhdGUoY29uc3QgR1VJRCogcEdVSUQsIExQRElSRUNURFJBVzcqIHBJZmFjZSwKKwkJCQkgICBJVW5rbm93biogcFVua091dGVyLCBCT09MIGV4KTsKK0hSRVNVTFQgV0lOQVBJCitYRjg2REdBMl9EaXJlY3REcmF3X0dldERldmljZUlkZW50aWZpZXIoTFBESVJFQ1REUkFXNyBpZmFjZSwKKwkJCQkJTFBERERFVklDRUlERU5USUZJRVIyIHBERERJLAorCQkJCQlEV09SRCBkd0ZsYWdzKTsKK0hSRVNVTFQgV0lOQVBJCitYRjg2REdBMl9EaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsIERXT1JEIGR3V2lkdGgsCisJCQkJICAgRFdPUkQgZHdIZWlnaHQsIERXT1JEIGR3QlBQLAorCQkJCSAgIERXT1JEIGR3UmVmcmVzaFJhdGUsIERXT1JEIGR3RmxhZ3MpOworSFJFU1VMVCBXSU5BUEkKK1hGODZER0EyX0RpcmVjdERyYXdfUmVzdG9yZURpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGRyYXcvbWFpbi5jIGIvZGxscy9kZHJhdy9kZHJhdy9tYWluLmMKaW5kZXggOGJlY2MyMS4uNmVmMzFiOSAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy9kZHJhdy9tYWluLmMKKysrIGIvZGxscy9kZHJhdy9kZHJhdy9tYWluLmMKQEAgLTIsNDc2ICsyLDk4OSBAQAogICoKICAqIENvcHlyaWdodCAxOTk3LTIwMDAgTWFyY3VzIE1laXNzbmVyCiAgKiBDb3B5cmlnaHQgMTk5OC0yMDAwIExpb25lbCBVbG1lciAobW9zdCBvZiBEaXJlY3QzRCBzdHVmZikKKyAqIENvcHlyaWdodCAyMDAwIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCiAgKi8KIAogLyoKICAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGludGVyZmFjZSBmdW5jdGlvbnMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4KLSAqIGFsbCBpbnRlcmZhY2VzLiBPciBiZXR0ZXIsIGl0IGlzIGEgImNvbW1vbiBzdHViIiBsaWJyYXJ5IGZvciB0aGUgSURpcmVjdERyYXcqCi0gKiBvYmplY3RzCisgKiBhbGwgaW50ZXJmYWNlcy4gT3IgYmV0dGVyLCBpdCBpcyBhICJjb21tb24gc3R1YiIgbGlicmFyeSBmb3IgdGhlCisgKiBJRGlyZWN0RHJhdyogb2JqZWN0cwogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKIAogI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KIAogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAiZGRyYXcuaCIKICNpbmNsdWRlICJkM2QuaCIKICNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgImJpdG1hcC5oIgorCisjaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImRkcmF3L21haW4uaCIKKyNpbmNsdWRlICJkY2xpcHBlci9tYWluLmgiCisjaW5jbHVkZSAiZHBhbGV0dGUvbWFpbi5oIgorI2luY2x1ZGUgImRzdXJmYWNlL21haW4uaCIKKyNpbmNsdWRlICJkc3VyZmFjZS9kaWIuaCIKKyNpbmNsdWRlICJkc3VyZmFjZS9mYWtlemJ1ZmZlci5oIgorI2luY2x1ZGUgImRzdXJmYWNlL2RpYnRleHR1cmUuaCIKIAogREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKIAotI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKK2V4dGVybiBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhdykgRERSQVdfSURpcmVjdERyYXdfVlRhYmxlOworZXh0ZXJuIElDT01fVlRBQkxFKElEaXJlY3REcmF3MikgRERSQVdfSURpcmVjdERyYXcyX1ZUYWJsZTsKK2V4dGVybiBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhdzQpIEREUkFXX0lEaXJlY3REcmF3NF9WVGFibGU7CiAKLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfRHVwbGljYXRlU3VyZmFjZSgKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLExQRElSRUNURFJBV1NVUkZBQ0Ugc3JjLExQRElSRUNURFJBV1NVUkZBQ0UgKmRzdAotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICAgIEZJWE1FKCIoJXApLT4oJXAsJXApIHNpbXBseSBjb3BpZXNcbiIsVGhpcyxzcmMsZHN0KTsKLSAgICAqZHN0ID0gc3JjOyAvKiBGSVhNRSAqLworc3RhdGljIHZvaWQgRERSQVdfVW5zdWJjbGFzc1dpbmRvdyhJRGlyZWN0RHJhd0ltcGwqIFRoaXMpOworCitzdGF0aWMgdm9pZCBNYWluX0RpcmVjdERyYXdfRGVsZXRlU3VyZmFjZXMoSURpcmVjdERyYXdJbXBsKiBUaGlzKTsKK3N0YXRpYyB2b2lkIE1haW5fRGlyZWN0RHJhd19EZWxldGVDbGlwcGVycyhJRGlyZWN0RHJhd0ltcGwqIFRoaXMpOworc3RhdGljIHZvaWQgTWFpbl9EaXJlY3REcmF3X0RlbGV0ZVBhbGV0dGVzKElEaXJlY3REcmF3SW1wbCogVGhpcyk7CitzdGF0aWMgdm9pZCBMb3NlUHJpbWFyeVN1cmZhY2UoSURpcmVjdERyYXdJbXBsKiBUaGlzKTsKKworc3RhdGljIGNvbnN0IGNoYXIgZGRQcm9wW10gPSAiV0lORV9ERFJBV19Qcm9wZXJ0eSI7CisKKy8qIE5vdCBjYWxsZWQgZnJvbSB0aGUgdnRhYmxlLiAqLworSFJFU1VMVCBNYWluX0RpcmVjdERyYXdfQ29uc3RydWN0KElEaXJlY3REcmF3SW1wbCAqVGhpcywgQk9PTCBleCkKK3sKKyAgICAvKiBOT1RFOiBUaGUgY3JlYXRvciBtdXN0IHVzZSBIRUFQX1pFUk9fTUVNT1JZIG9yIGVxdWl2YWxlbnQuICovCisgICAgVGhpcy0+cmVmID0gMTsKKyAgICBUaGlzLT5leCA9IGV4OworCisgICAgVGhpcy0+ZmluYWxfcmVsZWFzZSA9IE1haW5fRGlyZWN0RHJhd19maW5hbF9yZWxlYXNlOworCisgICAgVGhpcy0+Y3JlYXRlX3BhbGV0dGUgPSBNYWluX0RpcmVjdERyYXdQYWxldHRlX0NyZWF0ZTsKKworICAgIFRoaXMtPmNyZWF0ZV9vZmZzY3JlZW4gPSBNYWluX2NyZWF0ZV9vZmZzY3JlZW47CisgICAgVGhpcy0+Y3JlYXRlX3RleHR1cmUgICA9IE1haW5fY3JlYXRlX3RleHR1cmU7CisgICAgVGhpcy0+Y3JlYXRlX3pidWZmZXIgICA9IE1haW5fY3JlYXRlX3pidWZmZXI7CisgICAgLyogVGhlcmUgYXJlIG5vIGdlbmVyaWMgdmVyc2lvbnMgb2YgY3JlYXRlX3twcmltYXJ5LGJhY2tidWZmZXJ9LiAqLworCisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdywgIEREUkFXX0lEaXJlY3REcmF3X1ZUYWJsZSk7CisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzIsIEREUkFXX0lEaXJlY3REcmF3Ml9WVGFibGUpOworICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc0LCBERFJBV19JRGlyZWN0RHJhdzRfVlRhYmxlKTsKKyAgICAvKiBUaGVyZSBpcyBubyBnZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIElERDcgKi8KKwogICAgIHJldHVybiBERF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9TZXRDb29wZXJhdGl2ZUxldmVsKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsSFdORCBod25kLERXT1JEIGNvb3BsZXZlbAotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotCi0gICAgRklYTUUoIiglcCktPiglMDhseCwlMDhseClcbiIsVGhpcywoRFdPUkQpaHduZCxjb29wbGV2ZWwpOwotICAgIF9kdW1wX2Nvb3BlcmF0aXZlbGV2ZWwoY29vcGxldmVsKTsKLSAgICBUaGlzLT5kLT5tYWluV2luZG93ID0gaHduZDsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLS8qCi0gKiBTbWFsbCBoZWxwZXIgdG8gZWl0aGVyIHVzZSB0aGUgY29vcGVyYXRpdmUgd2luZG93IG9yIGNyZWF0ZSBhIG5ldyAKLSAqIG9uZSAoZm9yIG1vdXNlIGFuZCBrZXlib2FyZCBpbnB1dCkgYW5kIGRyYXdpbmcgaW4gdGhlIFhsaWIgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIE5vdGUgdGhpcyBqdXN0IHVzZXMgVVNFUiBjYWxscywgc28gaXQgaXMgc2FmZSBpbiBoZXJlLgotICovCi12b2lkIF9jb21tb25fSURpcmVjdERyYXdJbXBsX1NldERpc3BsYXlNb2RlKElEaXJlY3REcmF3SW1wbCogVGhpcykgewotICAgIFJFQ1QJcmVjdDsKLQotICAgIC8qIERvIGRlc3Ryb3kgb25seSBvdXIgd2luZG93ICovCi0gICAgaWYgKFRoaXMtPmQtPndpbmRvdyAmJiBHZXRQcm9wQShUaGlzLT5kLT53aW5kb3csZGRQcm9wKSkgewotCURlc3Ryb3lXaW5kb3coVGhpcy0+ZC0+d2luZG93KTsKLQlUaGlzLT5kLT53aW5kb3cgPSAwOwordm9pZCBNYWluX0RpcmVjdERyYXdfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMpCit7CisgICAgaWYgKElzV2luZG93KFRoaXMtPndpbmRvdykpCisgICAgeworCWlmIChHZXRQcm9wQShUaGlzLT53aW5kb3csIGRkUHJvcCkpCisJICAgIEREUkFXX1Vuc3ViY2xhc3NXaW5kb3coVGhpcyk7CisJZWxzZQorCSAgICBGSVhNRSgidGhpcyBzaG91bGRuJ3QgaGFwcGVuLCByaWdodD9cbiIpOwogICAgIH0KLSAgICAvKiBTYW5pdHkgY2hlY2sgY29vcGVyYXRpdmUgd2luZG93IGJlZm9yZSBhc3NpZ25pbmcgaXQgdG8gZHJhd2luZy4gKi8KLSAgICBpZiAoSXNXaW5kb3coVGhpcy0+ZC0+bWFpbldpbmRvdykgJiYKLQlJc1dpbmRvd1Zpc2libGUoVGhpcy0+ZC0+bWFpbldpbmRvdykKLSAgICApIHsKLQlHZXRXaW5kb3dSZWN0KFRoaXMtPmQtPm1haW5XaW5kb3csJnJlY3QpOwotCWlmICgoKChyZWN0LnJpZ2h0LXJlY3QubGVmdCkgPj0gVGhpcy0+ZC0+d2lkdGgpCSYmCi0JICAgICAoKHJlY3QuYm90dG9tLXJlY3QudG9wKSA+PSBUaGlzLT5kLT5oZWlnaHQpKQotCSkgewotCSAgICBUaGlzLT5kLT53aW5kb3cgPSBUaGlzLT5kLT5tYWluV2luZG93OwotCSAgICAvKiBGSVhNRTogcmVzaXppbmcgaXMgbm90IHdpbmRvd3MgY29tcGF0aWJsZSBiZWhhdmlvdXIsIG5lZWQgdGVzdCAqLwotCSAgICAvKiBTZXRXaW5kb3dQb3MoVGhpcy0+ZC0+bWFpbldpbmRvdyxIV05EX1RPUE1PU1QsMCwwLFRoaXMtPmQtPndpZHRoLFRoaXMtPmQtPmhlaWdodCxTV1BfTk9NT1ZFfFNXUF9OT0FDVElWQVRFfFNXUF9OT09XTkVSWk9SREVSKTsgKi8KLQkgICAgVGhpcy0+ZC0+cGFpbnRhYmxlID0gMTsgLyogZG9uJ3Qgd2FpdCBmb3IgV01fUEFJTlQgKi8KLQl9Ci0gICAgfQotICAgIC8qIC4uLiBmYWlsZWQsIGNyZWF0ZSBuZXcgb25lLiAqLwotICAgIGlmICghVGhpcy0+ZC0+d2luZG93KSB7Ci0JVGhpcy0+ZC0+d2luZG93ID0gQ3JlYXRlV2luZG93RXhBKAotCSAgICAwLAotCSAgICAiV0lORV9EaXJlY3REcmF3IiwKLQkgICAgIldJTkVfRGlyZWN0RHJhdyIsCi0JICAgIFdTX1BPUFVQLAotCSAgICAwLDAsCi0JICAgIFRoaXMtPmQtPndpZHRoLAotCSAgICBUaGlzLT5kLT5oZWlnaHQsCi0JICAgIDAsCi0JICAgIDAsCi0JICAgIDAsCi0JICAgIE5VTEwKLQkpOwotCS8qU3RvcmUgVEhJUyB3aXRoIHRoZSB3aW5kb3cuIFdlJ2xsIHVzZSBpdCBpbiB0aGUgd2luZG93IHByb2NlZHVyZSovCi0JU2V0UHJvcEEoVGhpcy0+ZC0+d2luZG93LGRkUHJvcCwoTE9ORylUaGlzKTsKLQlTaG93V2luZG93KFRoaXMtPmQtPndpbmRvdyxUUlVFKTsKLQlVcGRhdGVXaW5kb3coVGhpcy0+ZC0+d2luZG93KTsKLSAgICB9Ci0gICAgU2V0Rm9jdXMoVGhpcy0+ZC0+d2luZG93KTsKKworICAgIE1haW5fRGlyZWN0RHJhd19EZWxldGVTdXJmYWNlcyhUaGlzKTsKKyAgICBNYWluX0RpcmVjdERyYXdfRGVsZXRlQ2xpcHBlcnMoVGhpcyk7CisgICAgTWFpbl9EaXJlY3REcmF3X0RlbGV0ZVBhbGV0dGVzKFRoaXMpOwogfQogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd0ltcGxfU2V0RGlzcGxheU1vZGUoCi0JTFBESVJFQ1REUkFXIGlmYWNlLERXT1JEIHdpZHRoLERXT1JEIGhlaWdodCxEV09SRCBkZXB0aAotKSB7Ci0gICAgICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0ltcGwsaWZhY2UpOworLyogVGhlcmUgaXMgbm8gTWFpbl9EaXJlY3REcmF3X0NyZWF0ZS4gKi8KIAotCUZJWE1FKCIoJXApLT5TZXREaXNwbGF5TW9kZSglbGQsJWxkLCVsZCksIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGZvciB5b3VyIGRpc3BsYXkgYWRhcHRlciFcbiIsVGhpcyx3aWR0aCxoZWlnaHQsZGVwdGgpOwotCVRoaXMtPmQtPndpZHRoCT0gd2lkdGg7Ci0JVGhpcy0+ZC0+aGVpZ2h0CT0gaGVpZ2h0OwotCV9jb21tb25fSURpcmVjdERyYXdJbXBsX1NldERpc3BsYXlNb2RlKFRoaXMpOwotCXJldHVybiBERF9PSzsKLX0KLQotc3RhdGljIHZvaWQgZmlsbF9jYXBzKExQRERDQVBTIGNhcHMpIHsKLSAgICAvKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGZpbGwgdGhlIGNhcGFiaWxpdGllcyBvZiBXaW5lcyBERHJhdwotICAgICAqIGltcGxlbWVudGF0aW9uLiBOZWVkcyB0byBiZSBmaXhlZCwgdGhvdWdoLi4gKi8KLSAgICBpZiAoY2FwcyA9PSBOVUxMKQotCXJldHVybjsKLQotICAgIGNhcHMtPmR3U2l6ZSA9IHNpemVvZigqY2Fwcyk7Ci0gICAgY2Fwcy0+ZHdDYXBzID0gRERDQVBTX0FMUEhBIHwgRERDQVBTX0JMVCB8IEREQ0FQU19CTFRTVFJFVENIIHwgRERDQVBTX0JMVENPTE9SRklMTCB8IEREQ0FQU19CTFRERVBUSEZJTEwgfCBERENBUFNfQ0FOQkxUU1lTTUVNIHwgIEREQ0FQU19DT0xPUktFWSB8IEREQ0FQU19QQUxFVFRFIC8qfCBERENBUFNfTk9IQVJEV0FSRSovOwotICAgIGNhcHMtPmR3Q2FwczIgPSBERENBUFMyX0NFUlRJRklFRCB8IEREQ0FQUzJfTk9QQUdFTE9DS1JFUVVJUkVEIHwgRERDQVBTMl9XSURFU1VSRkFDRVM7Ci0gICAgY2Fwcy0+ZHdDS2V5Q2FwcyA9IDB4RkZGRkZGRkY7IC8qIFNob3VsZCBwdXQgcmVhbCBjYXBzIGhlcmUgb25lIGRheS4uLiAqLwotICAgIGNhcHMtPmR3RlhDYXBzID0gMDsKLSAgICBjYXBzLT5kd0ZYQWxwaGFDYXBzID0gMDsKLSAgICBjYXBzLT5kd1BhbENhcHMgPSBERFBDQVBTXzhCSVQgfCBERFBDQVBTX0FMTE9XMjU2OwotICAgIGNhcHMtPmR3U1ZDYXBzID0gMDsKLSAgICBjYXBzLT5kd1pCdWZmZXJCaXREZXB0aHMgPSBEREJEXzE2OwotICAgIC8qIEkgcHV0IGhlcmUgOCBNbyBzbyB0aGF0IEQzRCBhcHBsaWNhdGlvbnMgd2lsbCBiZWxpZXZlIHRoZXkgaGF2ZSBlbm91Z2gKLSAgICAgKiBtZW1vcnkgdG8gcHV0IHRleHR1cmVzIGluIHZpZGVvIG1lbW9yeS4gQlRXLCBpcyB0aGlzIG9ubHkgZnJhbWUgYnVmZmVyCi0gICAgICogbWVtb3J5IG9yIGFsc28gdGV4dHVyZSBtZW1vcnkgKGZvciBWb29kb28gYm9hcmRzIGZvciBleGFtcGxlKSA/Ci0gICAgICovCi0gICAgY2Fwcy0+ZHdWaWRNZW1Ub3RhbCA9IDgxOTIgKiAxMDI0OwotICAgIGNhcHMtPmR3VmlkTWVtRnJlZSA9IDgxOTIgKiAxMDI0OwotICAgIC8qIFRoZXNlIGFyZSBhbGwgdGhlIHN1cHBvcnRlZCBjYXBhYmlsaXRpZXMgb2YgdGhlIHN1cmZhY2VzICovCi0gICAgY2Fwcy0+ZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX0FMUEhBIHwgRERTQ0FQU19CQUNLQlVGRkVSIHwgRERTQ0FQU19DT01QTEVYIHwgRERTQ0FQU19GTElQIHwKLSAgICBERFNDQVBTX0ZST05UQlVGRkVSIHwgRERTQ0FQU19MT0NBTFZJRE1FTSB8IEREU0NBUFNfTk9OTE9DQUxWSURNRU0gfCBERFNDQVBTX09GRlNDUkVFTlBMQUlOIHwKLSAgICAgIC8qRERTQ0FQU19PVkVSTEFZIHwqLyBERFNDQVBTX1BBTEVUVEUgfCBERFNDQVBTX1BSSU1BUllTVVJGQUNFIHwgRERTQ0FQU19TWVNURU1NRU1PUlkgfAotCUREU0NBUFNfVklERU9NRU1PUlkgfCBERFNDQVBTX1ZJU0lCTEU7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfR2V0Q2FwcygKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLExQRERDQVBTIGNhcHMxLExQRERDQVBTIGNhcHMyCi0pICB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICAgIFRSQUNFKCIoJXApLT5HZXRDYXBzKCVwLCVwKVxuIixUaGlzLGNhcHMxLGNhcHMyKTsKLQotICAgIC8qIFB1dCB0aGUgc2FtZSBjYXBzIGZvciB0aGUgdHdvIGNhcGFiaWxpdGllcyAqLwotICAgIGZpbGxfY2FwcyhjYXBzMSk7Ci0gICAgZmlsbF9jYXBzKGNhcHMyKTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9DcmVhdGVDbGlwcGVyKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsRFdPUkQgeCxMUERJUkVDVERSQVdDTElQUEVSICpscGRkY2xpcCxMUFVOS05PV04gbHB1bmsKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsKiogaWxwZGRjbGlwPShJRGlyZWN0RHJhd0NsaXBwZXJJbXBsKiopbHBkZGNsaXA7Ci0gICAgRklYTUUoIiglcCktPiglMDhseCwlcCwlcCksc3R1YiFcbiIsIFRoaXMseCxpbHBkZGNsaXAsbHB1bmspOwotICAgICppbHBkZGNsaXAgPSAoSURpcmVjdERyYXdDbGlwcGVySW1wbCopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoSURpcmVjdERyYXdDbGlwcGVySW1wbCkpOwotICAgICgqaWxwZGRjbGlwKS0+cmVmID0gMTsKLSAgICBJQ09NX1ZUQkwoKmlscGRkY2xpcCkgPSAmZGRjbGlwdnQ7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBjb21tb25fSURpcmVjdERyYXcySW1wbF9DcmVhdGVQYWxldHRlKAotICAgIElEaXJlY3REcmF3MkltcGwqIFRoaXMsRFdPUkQgZHdGbGFncyxMUFBBTEVUVEVFTlRSWSBwYWxlbnQsCi0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCAqKmxwZGRwYWwsTFBVTktOT1dOIGxwdW5rLGludCAqcHNpemUKLSkgewotICAgIGludCBzaXplID0gMDsKLQkgIAotICAgIGlmIChUUkFDRV9PTihkZHJhdykpCi0JX2R1bXBfcGFsZXR0ZWZvcm1hdChkd0ZsYWdzKTsKLQkKLSAgICAqbHBkZHBhbCA9IChJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKSk7Ci0gICAgaWYgKCpscGRkcGFsID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOwotICAgICgqbHBkZHBhbCktPnJlZiA9IDE7Ci0gICAgKCpscGRkcGFsKS0+ZGRyYXcgPSAoSURpcmVjdERyYXdJbXBsKilUaGlzOwotCi0gICAgaWYgKGR3RmxhZ3MgJiBERFBDQVBTXzFCSVQpCi0Jc2l6ZSA9IDI7Ci0gICAgZWxzZSBpZiAoZHdGbGFncyAmIEREUENBUFNfMkJJVCkKLQlzaXplID0gNDsKLSAgICBlbHNlIGlmIChkd0ZsYWdzICYgRERQQ0FQU180QklUKQotCXNpemUgPSAxNjsKLSAgICBlbHNlIGlmIChkd0ZsYWdzICYgRERQQ0FQU184QklUKQotCXNpemUgPSAyNTY7Ci0gICAgZWxzZQotCUVSUigidW5oYW5kbGVkIHBhbGV0dGUgZm9ybWF0XG4iKTsKLQotICAgICpwc2l6ZSA9IHNpemU7Ci0gICAgaWYgKFRoaXMtPmQtPnBhbGV0dGVfY29udmVydCA9PSBOVUxMKSB7Ci0JLyogTm8gZGVwdGggY29udmVyc2lvbiAtIGNyZWF0ZSA4PC0+OCBpZGVudGl0eSBtYXAgKi8KLQlpbnQgZW50OwotCWZvciAoZW50PTA7IGVudDwyNTY7IGVudCsrKQotCSAgICAoKmxwZGRwYWwpLT5zY3JlZW5fcGFsZW50c1tlbnRdID0gZW50OwotICAgIH0KLSAgICBpZiAocGFsZW50KSB7Ci0JLyogTm93LCBpZiB3ZSBhcmUgaW4gZGVwdGggY29udmVyc2lvbiBtb2RlLCBjcmVhdGUgdGhlIHNjcmVlbiBwYWxldHRlICovCi0JaWYgKFRoaXMtPmQtPnBhbGV0dGVfY29udmVydCAhPSBOVUxMKQkgICAgCi0JICAgIFRoaXMtPmQtPnBhbGV0dGVfY29udmVydChwYWxlbnQsKCpscGRkcGFsKS0+c2NyZWVuX3BhbGVudHMsMCxzaXplKTsKLQotCW1lbWNweSgoKmxwZGRwYWwpLT5wYWxlbnRzLCBwYWxlbnQsIHNpemUgKiBzaXplb2YoUEFMRVRURUVOVFJZKSk7Ci0gICAgfSBlbHNlIGlmIChUaGlzLT5kLT5wYWxldHRlX2NvbnZlcnQgIT0gTlVMTCkgewotCS8qIEluIHRoYXQgY2FzZSwgcHV0IGFsbCAweEZGICovCi0JbWVtc2V0KCgqbHBkZHBhbCktPnNjcmVlbl9wYWxlbnRzLCAweEZGLCAyNTYgKiBzaXplb2YoaW50KSk7Ci0gICAgfQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9DcmVhdGVQYWxldHRlKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsRFdPUkQgZHdGbGFncyxMUFBBTEVUVEVFTlRSWSBwYWxlbnQsTFBESVJFQ1REUkFXUEFMRVRURSAqbHBkZHBhbCxMUFVOS05PV04gbHB1bmsKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiogaWxwZGRwYWw9KElEaXJlY3REcmF3UGFsZXR0ZUltcGwqKilscGRkcGFsOwotICAgIGludCB4c2l6ZTsKLSAgICBIUkVTVUxUIHJlczsKLQotICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJXAsJXAsJXApXG4iLFRoaXMsZHdGbGFncyxwYWxlbnQsaWxwZGRwYWwsbHB1bmspOwotICAgIHJlcyA9IGNvbW1vbl9JRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVBhbGV0dGUoVGhpcyxkd0ZsYWdzLHBhbGVudCxpbHBkZHBhbCxscHVuaywmeHNpemUpOwotICAgIGlmIChyZXMgIT0gMCkgcmV0dXJuIHJlczsKLSAgICBJQ09NX1ZUQkwoKmlscGRkcGFsKSA9ICZkZHJhd19kZHBhbHZ0OwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9SZXN0b3JlRGlzcGxheU1vZGUoTFBESVJFQ1REUkFXMiBpZmFjZSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwKS0+UmVzdG9yZURpc3BsYXlNb2RlKClcbiIsIFRoaXMpOwotICAgIFNsZWVwKDEwMDApOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9XYWl0Rm9yVmVydGljYWxCbGFuaygKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLERXT1JEIHgsSEFORExFIGgKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwKS0+KGZsYWdzPTB4JTA4bHgsaGFuZGxlPTB4JTA4eClcbiIsVGhpcyx4LGgpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfQWRkUmVmKExQRElSRUNURFJBVzIgaWZhY2UpIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXcySW1wbCxpZmFjZSk7CitVTE9ORyBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X0FkZFJlZihMUERJUkVDVERSQVc3IGlmYWNlKSB7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3SW1wbCxpZmFjZSk7CiAgICAgVFJBQ0UoIiglcCktPigpIGluY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIFRoaXMtPnJlZiApOwogCi0gICAgcmV0dXJuICsrKFRoaXMtPnJlZik7CisgICAgcmV0dXJuICsrVGhpcy0+cmVmOwogfQogCi1VTE9ORyBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9SZWxlYXNlKExQRElSRUNURFJBVzIgaWZhY2UpIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXcySW1wbCxpZmFjZSk7CitVTE9ORyBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X1JlbGVhc2UoTFBESVJFQ1REUkFXNyBpZmFjZSkgeworICAgIFVMT05HIHJlZjsKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLGlmYWNlKTsKICAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgVGhpcy0+cmVmICk7CiAKLSAgICBpZiAoIS0tKFRoaXMtPnJlZikpIHsKLQlpZiAoIS0tKFRoaXMtPmQtPnJlZikpIHsKLQkgICAgaWYgKFRoaXMtPmQtPndpbmRvdyAmJiBHZXRQcm9wQShUaGlzLT5kLT53aW5kb3csZGRQcm9wKSkKLQkJRGVzdHJveVdpbmRvdyhUaGlzLT5kLT53aW5kb3cpOwotCSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcy0+ZCk7Ci0JfQotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxUaGlzKTsKLQlyZXR1cm4gU19PSzsKKyAgICByZWYgPSAtLVRoaXMtPnJlZjsKKworICAgIGlmIChyZWYgPT0gMCkKKyAgICB7CisJaWYgKFRoaXMtPmZpbmFsX3JlbGVhc2UgIT0gTlVMTCkKKwkgICAgVGhpcy0+ZmluYWxfcmVsZWFzZShUaGlzKTsKKworCS8qIFdlIGZyZWUgdGhlIHByaXZhdGUuIFRoaXMgaXMgYW4gYXJ0aWZhY3Qgb2YgdGhlIGZhY3QgdGhhdCBJIGRvbid0CisJICogaGF2ZSB0aGUgZGVzdHJ1Y3RvcnMgc2V0IHVwIGNvcnJlY3RseS4gKi8KKwlpZiAoVGhpcy0+cHJpdmF0ZSAhPSAoVGhpcysxKSkKKwkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+cHJpdmF0ZSk7CisKKwlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKICAgICB9Ci0gICAgcmV0dXJuIFRoaXMtPnJlZjsKKworICAgIHJldHVybiByZWY7CiB9CiAKLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfUXVlcnlJbnRlcmZhY2UoCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqCisvKiBUT0RPOiBuZWVkIHRvIHN1cHBvcnQgSURpcmVjdDNELiAqLworSFJFU1VMVCBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKAorICAgIExQRElSRUNURFJBVzcgaWZhY2UsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iagogKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0ltcGwsaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXMsJXApXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksIG9iaik7CiAKLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCByZWZpaWQgKSApIHsKLQkqb2JqID0gVGhpczsKLQlJRGlyZWN0RHJhdzJfQWRkUmVmKGlmYWNlKTsKLQlUUkFDRSgiICBDcmVhdGluZyBJVW5rbm93biBpbnRlcmZhY2UgKCVwKVxuIiwgKm9iaik7Ci0JcmV0dXJuIFNfT0s7CisgICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JVW5rbm93biwgcmVmaWlkICkKKwkgfHwgSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXc3LCByZWZpaWQgKSApCisgICAgeworCSpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpOwogICAgIH0KLSAgICBFUlIoIiglcCktPiglcywlcCksIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZGlzcGxheSBpbnRlcmZhY2UhXG4iLFRoaXMsZGVidWdzdHJfZ3VpZChyZWZpaWQpLG9iaik7Ci0gICAgcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOworICAgIGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhdywgcmVmaWlkICkgKQorICAgIHsKKwkqb2JqID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXcpOworICAgIH0KKyAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXcyLCByZWZpaWQgKSApCisgICAgeworCSpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzIpOworICAgIH0KKyAgICBlbHNlIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXc0LCByZWZpaWQgKSApCisgICAgeworCSpvYmogPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzQpOworICAgIH0KKyNpZmRlZiBIQVZFX09QRU5HTAorICAgIGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0QzLCByZWZpaWQgKSApCisgICAgeworCXJldHVybiBjcmVhdGVfZGlyZWN0M2QzKG9iaiwgVGhpcyk7CisgICAgfQorICAgIGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0QyLCByZWZpaWQgKSApCisgICAgeworCXJldHVybiBjcmVhdGVfZGlyZWN0M2QyKG9iaiwgVGhpcyk7CisgICAgfQorICAgIGVsc2UgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0QsIHJlZmlpZCApICkKKyAgICB7CisJcmV0dXJuIGNyZWF0ZV9kaXJlY3QzZChvYmosIFRoaXMpOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICB7CisJRklYTUUoIiglcCktPiglcywlcCk6IG5vIGludGVyZmFjZVxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmVmaWlkKSxvYmopOworCXJldHVybiBFX05PSU5URVJGQUNFOworICAgIH0KKworICAgIElEaXJlY3REcmF3N19BZGRSZWYoaWZhY2UpOworICAgIHJldHVybiBTX09LOwogfQogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJJbXBsX0dldFZlcnRpY2FsQmxhbmtTdGF0dXMoCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSxCT09MICpzdGF0dXMKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLHN0YXR1cyk7Ci0gICAgKnN0YXR1cyA9IFRSVUU7CisvKiBNU0ROOiAibm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZCIuICovCitIUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdfQ29tcGFjdChMUERJUkVDVERSQVc3IGlmYWNlKQoreworICAgIFRSQUNFKCIoJXApXG4iLCBpZmFjZSk7CisKICAgICByZXR1cm4gRERfT0s7CiB9CiAKLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfRW51bURpc3BsYXlNb2RlcygKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLERXT1JEIGR3RmxhZ3MsTFBERFNVUkZBQ0VERVNDIGxwZGRzZmQsTFBWT0lEIGNvbnRleHQsCi0gICAgTFBEREVOVU1NT0RFU0NBTExCQUNLIG1vZGVzY2IKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBERFNVUkZBQ0VERVNDCWRkc2ZkOwotICAgIHN0YXRpYyBzdHJ1Y3QgewotCWludCB3LGg7Ci0gICAgfSBtb2Rlc1s1XSA9IHsgLyogc29tZSBvZiB0aGUgdXN1YWwgbW9kZXMgKi8KLQl7NTEyLDM4NH0sCi0JezY0MCw0MDB9LAotCXs2NDAsNDgwfSwKLQl7ODAwLDYwMH0sCi0JezEwMjQsNzY4fSwKK0hSRVNVTFQgV0lOQVBJIE1haW5fRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyKExQRElSRUNURFJBVzcgaWZhY2UsCisJCQkJCSAgICAgRFdPUkQgZHdGbGFncywKKwkJCQkJICAgICBMUERJUkVDVERSQVdDTElQUEVSICpwcENsaXBwZXIsCisJCQkJCSAgICAgSVVua25vd24gKnBVbmtPdXRlcikKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLCBpZmFjZSk7CisgICAgSFJFU1VMVCBocjsKKworICAgIFRSQUNFKCIoJXApLT4oMHglbHgsICVwLCAlcClcbiIsIGlmYWNlLCBkd0ZsYWdzLCBwcENsaXBwZXIsIHBVbmtPdXRlcik7CisKKyAgICBociA9IERpcmVjdERyYXdDcmVhdGVDbGlwcGVyKGR3RmxhZ3MsIHBwQ2xpcHBlciwgcFVua091dGVyKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOworCisgICAgLyogZHdGbGFncyBpcyBwYXNzZWQgdHdpY2UsIGFwcGFyZW50bHkgYW4gQVBJIHdhcnQuICovCisgICAgaHIgPSBJRGlyZWN0RHJhd0NsaXBwZXJfSW5pdGlhbGl6ZSgqcHBDbGlwcGVyLAorCQkJCSAgICAgICBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdyksCisJCQkJICAgICAgIGR3RmxhZ3MpOworICAgIGlmIChGQUlMRUQoaHIpKQorICAgIHsKKwlJRGlyZWN0RHJhd0NsaXBwZXJfUmVsZWFzZSgqcHBDbGlwcGVyKTsKKwlyZXR1cm4gaHI7CisgICAgfQorCisgICAgcmV0dXJuIEREX09LOworfQorCitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKKwkJCSAgICAgIExQUEFMRVRURUVOVFJZIHBhbGVudCwKKwkJCSAgICAgIExQRElSRUNURFJBV1BBTEVUVEUqIHBwUGFsZXR0ZSwKKwkJCSAgICAgIExQVU5LTk9XTiBwVW5rbm93bikKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLGlmYWNlKTsKKyAgICBMUERJUkVDVERSQVdQQUxFVFRFIHBQYWxldHRlOworICAgIEhSRVNVTFQgaHI7CisKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCVwLCVwLCVwKVxuIixUaGlzLGR3RmxhZ3MscGFsZW50LHBwUGFsZXR0ZSxwVW5rbm93bik7CisKKyAgICBpZiAocHBQYWxldHRlID09IE5VTEwpIHJldHVybiBFX1BPSU5URVI7IC8qIHVuY2hlY2tlZCAqLworICAgIGlmIChwVW5rbm93biAhPSBOVUxMKSByZXR1cm4gQ0xBU1NfRV9OT0FHR1JFR0FUSU9OOyAvKiB1bmNoZWNrZWQgKi8KKworICAgIGhyID0gVGhpcy0+Y3JlYXRlX3BhbGV0dGUoVGhpcywgZHdGbGFncywgJnBQYWxldHRlLCBwVW5rbm93bik7CisgICAgaWYgKEZBSUxFRChocikpIHJldHVybiBocjsKKworICAgIGhyID0gSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMocFBhbGV0dGUsIDAsIDAsCisJCQkJICAgICAgIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfU2l6ZShkd0ZsYWdzKSwKKwkJCQkgICAgICAgcGFsZW50KTsKKyAgICBpZiAoRkFJTEVEKGhyKSkKKyAgICB7CisJSURpcmVjdERyYXdQYWxldHRlX1JlbGVhc2UocFBhbGV0dGUpOworCXJldHVybiBocjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkqcHBQYWxldHRlID0gcFBhbGV0dGU7CisJcmV0dXJuIEREX09LOworICAgIH0KK30KKworSFJFU1VMVAorTWFpbl9jcmVhdGVfb2Zmc2NyZWVuKElEaXJlY3REcmF3SW1wbCogVGhpcywgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAorCQkgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLCBMUFVOS05PV04gcE91dGVyKQoreworICAgIGFzc2VydChwT3V0ZXIgPT0gTlVMTCk7CisKKyAgICByZXR1cm4gRElCX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLCBwRERTRCwgcHBTdXJmLCBwT3V0ZXIpOworfQorCitIUkVTVUxUCitNYWluX2NyZWF0ZV90ZXh0dXJlKElEaXJlY3REcmF3SW1wbCogVGhpcywgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAorCQkgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwgTFBVTktOT1dOIHBPdXRlciwKKwkJICAgIERXT1JEIGR3TWlwTWFwTGV2ZWwpCit7CisgICAgYXNzZXJ0KHBPdXRlciA9PSBOVUxMKTsKKworICAgIHJldHVybiBESUJUZXh0dXJlX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLCBwRERTRCwgcHBTdXJmLCBwT3V0ZXIpOworfQorCitIUkVTVUxUCitNYWluX2NyZWF0ZV96YnVmZmVyKElEaXJlY3REcmF3SW1wbCogVGhpcywgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAorCQkgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwgTFBVTktOT1dOIHBPdXRlcikKK3sKKyAgICBhc3NlcnQocE91dGVyID09IE5VTEwpOworCisgICAgcmV0dXJuIEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLCBwRERTRCwgcHBTdXJmLCBwT3V0ZXIpOworfQorCisvKiBEb2VzIHRoZSB0ZXh0dXJlIHN1cmZhY2UgZGVzY3JpYmVkIGluIHBERFNEIGhhdmUgYW55IHNtYWxsZXIgbWlwbWFwcz8gKi8KK3N0YXRpYyBCT09MIG1vcmVfbWlwbWFwcyhjb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QpCit7CisgICAgcmV0dXJuICgocEREU0QtPmR3RmxhZ3MgJiBERFNEX01JUE1BUENPVU5UKSAmJiBwRERTRC0+dTIuZHdNaXBNYXBDb3VudCA+IDEKKwkgICAgJiYgKHBERFNELT5kd1dpZHRoID4gMSB8fCBwRERTRC0+ZHdIZWlnaHQgPiAxKSk7Cit9CisKKy8qIENyZWF0ZSBhIHRleHR1cmUgc3VyZmFjZSBhbG9uZyB3aXRoIGFueSBvZiBpdHMgbWlwbWFwcy4gKi8KK3N0YXRpYyBIUkVTVUxUCitjcmVhdGVfdGV4dHVyZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsIGNvbnN0IEREU1VSRkFDRURFU0MyICpwRERTRCwKKwkgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwgTFBVTktOT1dOIHBVbmtPdXRlcikKK3sKKyAgICBERFNVUkZBQ0VERVNDMiBkZHNkOworICAgIERXT1JEIG1pcG1hcF9sZXZlbCA9IDA7CisgICAgSFJFU1VMVCBocjsKKworICAgIGFzc2VydChwVW5rT3V0ZXIgPT0gTlVMTCk7CisKKyAgICAvKiBpcyB0aGlzIGNoZWNrIHJpZ2h0PyAocGl4ZWxmb3JtYXQgY2FuIGJlIGNvcGllZCBmcm9tIHByaW1hcnkpICovCisgICAgaWYgKChwRERTRC0+ZHdGbGFncyYoRERTRF9IRUlHSFR8RERTRF9XSURUSCkpICE9IChERFNEX0hFSUdIVHxERFNEX1dJRFRIKSkKKwlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIGRkc2QgPSAqcEREU0Q7CisKKyAgICBpZiAoIShkZHNkLmR3RmxhZ3MgJiBERFNEX1BJWEVMRk9STUFUKSkKKyAgICB7CisJZGRzZC51NC5kZHBmUGl4ZWxGb3JtYXQgPSBUaGlzLT5waXhlbGZvcm1hdDsKKyAgICB9CisKKyAgICBpZiAoIShkZHNkLmR3RmxhZ3MgJiBERFNEX1BJVENIKSkKKyAgICB7CisJZGRzZC51MS5sUGl0Y2ggPSBERFJBV193aWR0aF9icHBfdG9fcGl0Y2goZGRzZC5kd1dpZHRoLAorCQkJCQkJICBHRVRfQlBQKGRkc2QpKjgpOworICAgIH0KKworICAgIGRkc2QuZHdGbGFncyB8PSBERFNEX1BJVENIIHwgRERTRF9QSVhFTEZPUk1BVDsKKworICAgIGhyID0gVGhpcy0+Y3JlYXRlX3RleHR1cmUoVGhpcywgJmRkc2QsIHBwU3VyZiwgcFVua091dGVyLCBtaXBtYXBfbGV2ZWwpOworICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7CisKKyAgICAvKiBDcmVhdGUgYXR0YWNoZWQgbWlwbWFwcyBpZiByZXF1aXJlZC4gKi8KKyAgICBpZiAobW9yZV9taXBtYXBzKCZkZHNkKSkKKyAgICB7CisJTFBESVJFQ1REUkFXU1VSRkFDRTcgbWlwbWFwOworCUxQRElSRUNURFJBV1NVUkZBQ0U3IHByZXZfbWlwbWFwOworCUREU1VSRkFDRURFU0MyIG1pcG1hcF9zdXJmYWNlX2Rlc2M7CisKKwlwcmV2X21pcG1hcCA9ICpwcFN1cmY7CisJSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYocHJldl9taXBtYXApOworCW1pcG1hcF9zdXJmYWNlX2Rlc2MgPSBkZHNkOworCisJd2hpbGUgKG1vcmVfbWlwbWFwcygmbWlwbWFwX3N1cmZhY2VfZGVzYykpCisJeworCSAgICBtaXBtYXBfbGV2ZWwrKzsKKworCSAgICBtaXBtYXBfc3VyZmFjZV9kZXNjLnUyLmR3TWlwTWFwQ291bnQtLTsKKworCSAgICBpZiAobWlwbWFwX3N1cmZhY2VfZGVzYy5kd1dpZHRoID4gMSkKKwkJbWlwbWFwX3N1cmZhY2VfZGVzYy5kd1dpZHRoIC89IDI7CisKKwkgICAgaWYgKG1pcG1hcF9zdXJmYWNlX2Rlc2MuZHdIZWlnaHQgPiAxKQorCQltaXBtYXBfc3VyZmFjZV9kZXNjLmR3SGVpZ2h0IC89IDI7CisKKwkgICAgbWlwbWFwX3N1cmZhY2VfZGVzYy51MS5sUGl0Y2gKKwkJPSBERFJBV193aWR0aF9icHBfdG9fcGl0Y2gobWlwbWFwX3N1cmZhY2VfZGVzYy5kd1dpZHRoLAorCQkJCQkgICBHRVRfQlBQKGRkc2QpKjgpOworCisJICAgIGhyID0gVGhpcy0+Y3JlYXRlX3RleHR1cmUoVGhpcywgJm1pcG1hcF9zdXJmYWNlX2Rlc2MsICZtaXBtYXAsCisJCQkJICAgICAgcFVua091dGVyLCBtaXBtYXBfbGV2ZWwpOworCSAgICBpZiAoRkFJTEVEKGhyKSkKKwkgICAgeworCQlJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UocHJldl9taXBtYXApOworCQlJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UoKnBwU3VyZik7CisJCXJldHVybiBocjsKKwkgICAgfQorCisJICAgIElEaXJlY3REcmF3U3VyZmFjZTdfQWRkQXR0YWNoZWRTdXJmYWNlKHByZXZfbWlwbWFwLCBtaXBtYXApOworCSAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UocHJldl9taXBtYXApOworCSAgICBwcmV2X21pcG1hcCA9IG1pcG1hcDsKKwl9CisKKwlJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UocHJldl9taXBtYXApOworICAgIH0KKworICAgIHJldHVybiBERF9PSzsKK30KKworLyogQ3JlYXRlcyBhIHByaW1hcnkgc3VyZmFjZSBhbmQgYW55IGluZGljYXRlZCBiYWNrYnVmZmVycy4gKi8KK3N0YXRpYyBIUkVTVUxUCitjcmVhdGVfcHJpbWFyeShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsIExQRERTVVJGQUNFREVTQzIgcEREU0QsCisJICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsIExQVU5LTk9XTiBwVW5rT3V0ZXIpCit7CisgICAgRERTVVJGQUNFREVTQzIgZGRzZDsKKyAgICBIUkVTVUxUIGhyOworCisgICAgYXNzZXJ0KHBVbmtPdXRlciA9PSBOVUxMKTsKKworICAgIGlmIChUaGlzLT5wcmltYXJ5X3N1cmZhY2UgIT0gTlVMTCkKKwlyZXR1cm4gRERFUlJfUFJJTUFSWVNVUkZBQ0VBTFJFQURZRVhJU1RTOworCisgICAgLyogYXMgZG9jdW1lbnRlZCAod2hhdCBhYm91dCBwaXRjaD8pICovCisgICAgaWYgKHBERFNELT5kd0ZsYWdzICYgKEREU0RfSEVJR0hUfEREU0RfV0lEVEh8RERTRF9QSVhFTEZPUk1BVCkpCisJcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICBkZHNkID0gKnBERFNEOworICAgIGRkc2QuZHdGbGFncyB8PSBERFNEX0hFSUdIVCB8IEREU0RfV0lEVEggfCBERFNEX1BJVENIIHwgRERTRF9QSVhFTEZPUk1BVDsKKyAgICBkZHNkLmR3SGVpZ2h0ID0gVGhpcy0+aGVpZ2h0OworICAgIGRkc2QuZHdXaWR0aCA9IFRoaXMtPndpZHRoOworICAgIGRkc2QudTEubFBpdGNoID0gVGhpcy0+cGl0Y2g7CisgICAgZGRzZC51NC5kZHBmUGl4ZWxGb3JtYXQgPSBUaGlzLT5waXhlbGZvcm1hdDsKKyAgICBkZHNkLmRkc0NhcHMuZHdDYXBzIHw9IEREU0NBUFNfTE9DQUxWSURNRU0gfCBERFNDQVBTX1ZJREVPTUVNT1JZCisJfCBERFNDQVBTX1ZJU0lCTEUgfCBERFNDQVBTX0ZST05UQlVGRkVSOworCisgICAgaWYgKChkZHNkLmR3RmxhZ3MgJiBERFNEX0JBQ0tCVUZGRVJDT1VOVCkgJiYgZGRzZC5kd0JhY2tCdWZmZXJDb3VudCA+IDApCisJZGRzZC5kZHNDYXBzLmR3Q2FwcyB8PSBERFNDQVBTX0ZMSVA7CisKKyAgICBociA9IFRoaXMtPmNyZWF0ZV9wcmltYXJ5KFRoaXMsICZkZHNkLCBwcFN1cmYsIHBVbmtPdXRlcik7CisgICAgaWYgKEZBSUxFRChocikpIHJldHVybiBocjsKKworICAgIGlmIChkZHNkLmR3RmxhZ3MgJiBERFNEX0JBQ0tCVUZGRVJDT1VOVCkKKyAgICB7CisJSURpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJpbWFyeTsKKwlMUERJUkVDVERSQVdTVVJGQUNFNyBwUHJldjsKKwlEV09SRCBpOworCisJZGRzZC5kd0ZsYWdzICY9IH5ERFNEX0JBQ0tCVUZGRVJDT1VOVDsKKwlkZHNkLmRkc0NhcHMuZHdDYXBzICY9IH4oRERTQ0FQU19WSVNJQkxFIHwgRERTQ0FQU19QUklNQVJZU1VSRkFDRQorCQkJCSB8IEREU0NBUFNfQkFDS0JVRkZFUik7CisKKwlwcmltYXJ5ID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCxJRGlyZWN0RHJhd1N1cmZhY2U3LAorCQkJICAgICAgKnBwU3VyZik7CisJcFByZXYgPSAqcHBTdXJmOworCUlEaXJlY3REcmF3U3VyZmFjZTdfQWRkUmVmKHBQcmV2KTsKKworCWZvciAoaT0wOyBpIDwgZGRzZC5kd0JhY2tCdWZmZXJDb3VudDsgaSsrKQorCXsKKwkgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcEJhY2s7CisKKwkgICAgaWYgKGkgPT0gMCkKKwkJZGRzZC5kZHNDYXBzLmR3Q2FwcyB8PSBERFNDQVBTX0JBQ0tCVUZGRVI7CisJICAgIGVsc2UKKwkJZGRzZC5kZHNDYXBzLmR3Q2FwcyAmPSB+RERTQ0FQU19CQUNLQlVGRkVSOworCisJICAgIGhyID0gVGhpcy0+Y3JlYXRlX2JhY2tidWZmZXIoVGhpcywgJmRkc2QsICZwQmFjaywgcFVua091dGVyLAorCQkJCQkgcHJpbWFyeSk7CisKKwkgICAgaWYgKEZBSUxFRChocikpCisJICAgIHsKKwkJSURpcmVjdERyYXc3X1JlbGVhc2UocFByZXYpOworCQlJRGlyZWN0RHJhdzdfUmVsZWFzZSgqcHBTdXJmKTsKKwkJcmV0dXJuIGhyOworCSAgICB9CisKKwkgICAgSURpcmVjdERyYXdTdXJmYWNlN19BZGRBdHRhY2hlZFN1cmZhY2UocFByZXYsIHBCYWNrKTsKKwkgICAgSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKHBQcmV2KTsKKwkgICAgcFByZXYgPSBwQmFjazsKKwl9CisKKwlJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UocFByZXYpOworICAgIH0KKworICAgIFRoaXMtPnByaW1hcnlfc3VyZmFjZSA9ICpwcFN1cmY7CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUCitjcmVhdGVfb2Zmc2NyZWVuKElEaXJlY3REcmF3SW1wbCogVGhpcywgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwKKwkJIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsIExQVU5LTk9XTiBwVW5rT3V0ZXIpCit7CisgICAgRERTVVJGQUNFREVTQzIgZGRzZDsKKyAgICBIUkVTVUxUIGhyOworCisgICAgLyogaXMgdGhpcyBjaGVjayByaWdodD8gKHBpeGVsZm9ybWF0IGNhbiBiZSBjb3BpZWQgZnJvbSBwcmltYXJ5KSAqLworICAgIGlmICgocEREU0QtPmR3RmxhZ3MmKEREU0RfSEVJR0hUfEREU0RfV0lEVEgpKSAhPSAoRERTRF9IRUlHSFR8RERTRF9XSURUSCkpCisJcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICBkZHNkID0gKnBERFNEOworCisgICAgaWYgKCEoZGRzZC5kd0ZsYWdzICYgRERTRF9QSVhFTEZPUk1BVCkpCisgICAgeworCWRkc2QudTQuZGRwZlBpeGVsRm9ybWF0ID0gVGhpcy0+cGl4ZWxmb3JtYXQ7CisgICAgfQorCisgICAgaWYgKCEoZGRzZC5kd0ZsYWdzICYgRERTRF9QSVRDSCkpCisgICAgeworCWRkc2QudTEubFBpdGNoID0gRERSQVdfd2lkdGhfYnBwX3RvX3BpdGNoKGRkc2QuZHdXaWR0aCwKKwkJCQkJCSAgR0VUX0JQUChkZHNkKSo4KTsKKyAgICB9CisKKyAgICBkZHNkLmR3RmxhZ3MgfD0gRERTRF9QSVRDSCB8IEREU0RfUElYRUxGT1JNQVQ7CisKKyAgICBociA9IFRoaXMtPmNyZWF0ZV9vZmZzY3JlZW4oVGhpcywgJmRkc2QsIHBwU3VyZiwgcFVua091dGVyKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOworCisgICAgcmV0dXJuIGhyOworfQorCitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwKKwkJCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3ICpwcFN1cmYsCisJCQkgICAgICBJVW5rbm93biAqcFVua091dGVyKQoreworICAgIEhSRVNVTFQgaHI7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3SW1wbCwgaWZhY2UpOworCisgICAgVFJBQ0UoIiglcCktPiglcCwlcCwlcClcbiIsVGhpcyxwRERTRCxwcFN1cmYscFVua091dGVyKTsKKyAgICBUUkFDRSgiUmVxdWVzdGVkIENhcHM6IDB4JXhcbiIsIHBERFNELT5kZHNDYXBzLmR3Q2Fwcyk7CisKKyAgICBpZiAocFVua091dGVyICE9IE5VTEwpCisJcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsgLyogdW5jaGVja2VkICovCisKKyAgICBpZiAoIShwRERTRC0+ZHdGbGFncyAmIEREU0RfQ0FQUykpCisJcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7IC8qIHVuY2hlY2tlZCAqLworCisgICAgaWYgKHBwU3VyZiA9PSBOVUxMKQorCXJldHVybiBFX1BPSU5URVI7IC8qIHVuY2hlY2tlZCAqLworCisgICAgaWYgKHBERFNELT5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpCisgICAgeworCS8qIGNyZWF0ZSBwcmltYXJ5IHN1cmZhY2UgJiBiYWNrYnVmZmVycyAqLworCWhyID0gY3JlYXRlX3ByaW1hcnkoVGhpcywgcEREU0QsIHBwU3VyZiwgcFVua091dGVyKTsKKyAgICB9CisgICAgZWxzZSBpZiAocEREU0QtPmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19CQUNLQlVGRkVSKQorICAgIHsKKyAgICAgICAvKiBjcmVhdGUgYmFja2J1ZmZlciBzdXJmYWNlICovCisgICAgICAgaHIgPSBUaGlzLT5jcmVhdGVfYmFja2J1ZmZlcihUaGlzLCBwRERTRCwgcHBTdXJmLCBwVW5rT3V0ZXIsIE5VTEwpOworICAgIH0KKyAgICBlbHNlIGlmIChwRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX09GRlNDUkVFTlBMQUlOKQorICAgIHsKKwkvKiBjcmVhdGUgb2Zmc2NyZWVucGxhaW4gc3VyZmFjZSAqLworCWhyID0gY3JlYXRlX29mZnNjcmVlbihUaGlzLCBwRERTRCwgcHBTdXJmLCBwVW5rT3V0ZXIpOworICAgIH0KKyAgICBlbHNlIGlmIChwRERTRC0+ZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1pCVUZGRVIpCisgICAgeworCS8qIGNyZWF0ZSB6LWJ1ZmZlciAqLworCWhyID0gVGhpcy0+Y3JlYXRlX3pidWZmZXIoVGhpcywgcEREU0QsIHBwU3VyZiwgcFVua091dGVyKTsKKyAgICB9CisgICAgZWxzZSBpZiAocEREU0QtPmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19URVhUVVJFKQorICAgIHsKKwkvKiBjcmVhdGUgdGV4dHVyZSAqLworCWhyID0gY3JlYXRlX3RleHR1cmUoVGhpcywgcEREU0QsIHBwU3VyZiwgcFVua091dGVyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBPdGhlcndpc2UsIGFzc3VtZSBvZmZzY3JlZW5wbGFpbiBzdXJmYWNlICovCisJRklYTUUoIkFwcCBkaWRuJ3QgcmVxdWVzdCBhIHZhbGlkIHN1cmZhY2UgdHlwZSAtIGFzc3VtaW5nIG9mZnNjcmVlbnBsYWluXG4iKTsKKwlociA9IGNyZWF0ZV9vZmZzY3JlZW4oVGhpcywgcEREU0QsIHBwU3VyZiwgcFVua091dGVyKTsKKyAgICB9CisKKyAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOworCisgICAgcmV0dXJuIEREX09LOworfQorCitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X0R1cGxpY2F0ZVN1cmZhY2UoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBESVJFQ1REUkFXU1VSRkFDRTcgc3JjLAorCQkJCSBMUERJUkVDVERSQVdTVVJGQUNFNyogZHN0KQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0ltcGwsaWZhY2UpOworCisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqcFNyYyA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsCisJCQkJCSAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3LCBzcmMpOworCisgICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsVGhpcyxzcmMsZHN0KTsKKworICAgIHJldHVybiBwU3JjLT5kdXBsaWNhdGVfc3VyZmFjZShwU3JjLCBkc3QpOworfQorCisvKiBFbnVtRGlzcGxheU1vZGVzICovCisKK0JPT0wgTWFpbl9EaXJlY3REcmF3X0REUElYRUxGT1JNQVRfTWF0Y2goY29uc3QgRERQSVhFTEZPUk1BVCAqcmVxdWVzdGVkLAorCQkJCQkgY29uc3QgRERQSVhFTEZPUk1BVCAqcHJvdmlkZWQpCit7CisgICAgLyogU29tZSBmbGFncyBtdXN0IGJlIHByZXNlbnQgaW4gYm90aCBvciBuZWl0aGVyIGZvciBhIG1hdGNoLiAqLworICAgIHN0YXRpYyBjb25zdCBEV09SRCBtdXN0X21hdGNoID0gRERQRl9QQUxFVFRFSU5ERVhFRDEgfCBERFBGX1BBTEVUVEVJTkRFWEVEMgorCXwgRERQRl9QQUxFVFRFSU5ERVhFRDQgfCBERFBGX1BBTEVUVEVJTkRFWEVEOCB8IEREUEZfRk9VUkNDCisJfCBERFBGX1pCVUZGRVIgfCBERFBGX1NURU5DSUxCVUZGRVI7CisKKyAgICBpZiAoKHJlcXVlc3RlZC0+ZHdGbGFncyAmIHByb3ZpZGVkLT5kd0ZsYWdzKSAhPSByZXF1ZXN0ZWQtPmR3RmxhZ3MpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKChyZXF1ZXN0ZWQtPmR3RmxhZ3MgJiBtdXN0X21hdGNoKSAhPSAocHJvdmlkZWQtPmR3RmxhZ3MgJiBtdXN0X21hdGNoKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBpZiAocmVxdWVzdGVkLT5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpCisJaWYgKHJlcXVlc3RlZC0+ZHdGb3VyQ0MgIT0gcHJvdmlkZWQtPmR3Rm91ckNDKQorCSAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAocmVxdWVzdGVkLT5kd0ZsYWdzICYgKEREUEZfUkdCfEREUEZfWVVWfEREUEZfWkJVRkZFUnxERFBGX0FMUEhBCisJCQkgICAgICB8RERQRl9MVU1JTkFOQ0V8RERQRl9CVU1QRFVEVikpCisJaWYgKHJlcXVlc3RlZC0+dTEuZHdSR0JCaXRDb3VudCAhPSBwcm92aWRlZC0+dTEuZHdSR0JCaXRDb3VudCkKKwkgICAgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKHJlcXVlc3RlZC0+ZHdGbGFncyAmIChERFBGX1JHQnxERFBGX1lVVnxERFBGX1NURU5DSUxCVUZGRVIKKwkJCSAgICAgIHxERFBGX0xVTUlOQU5DRXxERFBGX0JVTVBEVURWKSkKKwlpZiAocmVxdWVzdGVkLT51Mi5kd1JCaXRNYXNrICE9IHByb3ZpZGVkLT51Mi5kd1JCaXRNYXNrKQorCSAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAocmVxdWVzdGVkLT5kd0ZsYWdzICYgKEREUEZfUkdCfEREUEZfWVVWfEREUEZfWkJVRkZFUnxERFBGX0JVTVBEVURWKSkKKwlpZiAocmVxdWVzdGVkLT51My5kd0dCaXRNYXNrICE9IHByb3ZpZGVkLT51My5kd0dCaXRNYXNrKQorCSAgICByZXR1cm4gRkFMU0U7CisKKyAgICAvKiBJIGNvdWxkIGJlIHdyb25nIGFib3V0IHRoZSBidW1wbWFwcGluZy4gTVNETiBkb2NzIGFyZSB2YWd1ZS4gKi8KKyAgICBpZiAocmVxdWVzdGVkLT5kd0ZsYWdzICYgKEREUEZfUkdCfEREUEZfWVVWfEREUEZfU1RFTkNJTEJVRkZFUgorCQkJICAgICAgfEREUEZfQlVNUERVRFYpKQorCWlmIChyZXF1ZXN0ZWQtPnU0LmR3QkJpdE1hc2sgIT0gcHJvdmlkZWQtPnU0LmR3QkJpdE1hc2spCisJICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChyZXF1ZXN0ZWQtPmR3RmxhZ3MgJiAoRERQRl9BTFBIQVBJWEVMU3xERFBGX1pQSVhFTFMpKQorCWlmIChyZXF1ZXN0ZWQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrICE9IHByb3ZpZGVkLT51NS5kd1JHQkFscGhhQml0TWFzaykKKwkgICAgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0wgTWFpbl9EaXJlY3REcmF3X0REU0RfTWF0Y2goY29uc3QgRERTVVJGQUNFREVTQzIqIHJlcXVlc3RlZCwKKwkJCQljb25zdCBERFNVUkZBQ0VERVNDMiogcHJvdmlkZWQpCit7CisgICAgc3RydWN0IGNvbXBhcmVfaW5mbworICAgIHsKKwlEV09SRCBmbGFnOworCXB0cmRpZmZfdCBvZmZzZXQ7CisJc2l6ZV90IHNpemU7CiAgICAgfTsKLSAgICBzdGF0aWMgaW50IGRlcHRoc1s0XSA9IHs4LDE2LDI0LDMyfTsKLSAgICBpbnQJaSxqOwogCi0gICAgVFJBQ0UoIiglcCktPigweCUwOGx4LCVwLCVwLCVwKVxuIixUaGlzLGR3RmxhZ3MsbHBkZHNmZCxjb250ZXh0LG1vZGVzY2IpOwotICAgIGRkc2ZkLmR3U2l6ZSA9IHNpemVvZihkZHNmZCk7Ci0gICAgZGRzZmQuZHdGbGFncyA9IEREU0RfSEVJR0hUfEREU0RfV0lEVEh8RERTRF9CQUNLQlVGRkVSQ09VTlR8RERTRF9QSVhFTEZPUk1BVHxERFNEX0NBUFM7Ci0gICAgaWYgKGR3RmxhZ3MgJiBEREVETV9SRUZSRVNIUkFURVMpIHsKLQlkZHNmZC5kd0ZsYWdzIHw9IEREU0RfUkVGUkVTSFJBVEU7Ci0JZGRzZmQudS5kd1JlZnJlc2hSYXRlID0gNjA7CisjZGVmaW5lIENNUChGTEFHLCBGSUVMRCkJCQkJXAorCXsgRERTRF8jI0ZMQUcsIG9mZnNldG9mKEREU1VSRkFDRURFU0MyLCBGSUVMRCksCVwKKwkgIHNpemVvZigoKEREU1VSRkFDRURFU0MyICopKE5VTEwpKS0+RklFTEQpIH0KKworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcGFyZV9pbmZvIGNvbXBhcmVbXSA9IHsKKwlDTVAoQUxQSEFCSVRERVBUSCwgZHdBbHBoYUJpdERlcHRoKSwKKwlDTVAoQkFDS0JVRkZFUkNPVU5ULCBkd0JhY2tCdWZmZXJDb3VudCksCisJQ01QKENBUFMsIGRkc0NhcHMpLAorCUNNUChDS0RFU1RCTFQsIGRkY2tDS0Rlc3RCbHQpLAorCUNNUChDS0RFU1RPVkVSTEFZLCB1My5kZGNrQ0tEZXN0T3ZlcmxheSksCisJQ01QKENLU1JDQkxULCBkZGNrQ0tTcmNCbHQpLAorCUNNUChDS1NSQ09WRVJMQVksIGRkY2tDS1NyY092ZXJsYXkpLAorCUNNUChIRUlHSFQsIGR3SGVpZ2h0KSwKKwlDTVAoTElORUFSU0laRSwgdTEuZHdMaW5lYXJTaXplKSwKKwlDTVAoTFBTVVJGQUNFLCBscFN1cmZhY2UpLAorCUNNUChNSVBNQVBDT1VOVCwgdTIuZHdNaXBNYXBDb3VudCksCisJQ01QKFBJVENILCB1MS5sUGl0Y2gpLAorCS8qIFBJWEVMRk9STUFUOiBtYW51YWwgKi8KKwlDTVAoUkVGUkVTSFJBVEUsIHUyLmR3UmVmcmVzaFJhdGUpLAorCUNNUChURVhUVVJFU1RBR0UsIGR3VGV4dHVyZVN0YWdlKSwKKwlDTVAoV0lEVEgsIGR3V2lkdGgpLAorCS8qIFpCVUZGRVJCSVRERVBUSDogIm9ic29sZXRlIiAqLworICAgIH07CisKKyN1bmRlZiBDTVAKKworICAgIGludCBpOworCisgICAgaWYgKChyZXF1ZXN0ZWQtPmR3RmxhZ3MgJiBwcm92aWRlZC0+ZHdGbGFncykgIT0gcmVxdWVzdGVkLT5kd0ZsYWdzKQorCXJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKGNvbXBhcmUpL3NpemVvZihjb21wYXJlWzBdKTsgaSsrKQorICAgIHsKKwlpZiAocmVxdWVzdGVkLT5kd0ZsYWdzICYgY29tcGFyZVtpXS5mbGFnCisJICAgICYmIG1lbWNtcCgoY29uc3QgY2hhciAqKXByb3ZpZGVkICsgY29tcGFyZVtpXS5vZmZzZXQsCisJCSAgICAgIChjb25zdCBjaGFyICopcmVxdWVzdGVkICsgY29tcGFyZVtpXS5vZmZzZXQsCisJCSAgICAgIGNvbXBhcmVbaV0uc2l6ZSkgIT0gMCkKKwkgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBkZHNmZC5kZHNDYXBzLmR3Q2FwcyA9IDA7Ci0gICAgZGRzZmQuZHdCYWNrQnVmZmVyQ291bnQgPSAxOwogCi0gICAgZm9yIChpPTA7aTxzaXplb2YoZGVwdGhzKS9zaXplb2YoZGVwdGhzWzBdKTtpKyspIHsKLQlkZHNmZC5kd0JhY2tCdWZmZXJDb3VudCA9IDE7Ci0JZGRzZmQuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDCT0gMDsKLQlkZHNmZC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAJPSBERFBGX1JHQjsKLQlkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50CT0gZGVwdGhzW2ldOwotCS8qIEZJWE1FOiB0aG9zZSBtYXNrcyB3b3VsZCBoYXZlIHRvIGJlIHNldCBpbiBkZXB0aCA+IDggKi8KLQlpZiAoZGVwdGhzW2ldPT04KSB7Ci0JICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSQml0TWFzayAgCT0gMDsKLQkgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51Mi5kd0dCaXRNYXNrICAJPSAwOwotCSAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUzLmR3QkJpdE1hc2sgCT0gMDsKLQkgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51NC5kd1JHQkFscGhhQml0TWFzaz0gMDsKLQkgIGRkc2ZkLmRkc0NhcHMuZHdDYXBzPUREU0NBUFNfUEFMRVRURTsKLQkgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzfD1ERFBGX1BBTEVUVEVJTkRFWEVEODsKLQl9IGVsc2UgewotCSAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnU0LmR3UkdCQWxwaGFCaXRNYXNrPSAwOwotCSAgCi0JICAvKiBGSVhNRTogV2Ugc2hvdWxkIHF1ZXJ5IHRob3NlIGZyb20gWCBpdHNlbGYgKi8KLQkgIHN3aXRjaCAoZGVwdGhzW2ldKSB7Ci0JICBjYXNlIDE2OgotCSAgICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSQml0TWFzayA9IDB4RjgwMDsKLQkgICAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUyLmR3R0JpdE1hc2sgPSAweDA3RTA7Ci0JICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51My5kd0JCaXRNYXNrPSAweDAwMUY7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyNDoKLQkgICAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkJpdE1hc2sgPSAweDAwRkYwMDAwOwotCSAgICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTIuZHdHQml0TWFzayA9IDB4MDAwMEZGMDA7Ci0JICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51My5kd0JCaXRNYXNrPSAweDAwMDAwMEZGOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzI6Ci0JICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51MS5kd1JCaXRNYXNrID0gMHgwMEZGMDAwMDsKLQkgICAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUyLmR3R0JpdE1hc2sgPSAweDAwMDBGRjAwOwotCSAgICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTMuZHdCQml0TWFzaz0gMHgwMDAwMDBGRjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JfQorICAgIGlmIChyZXF1ZXN0ZWQtPmR3RmxhZ3MgJiBERFNEX1BJWEVMRk9STUFUKQorICAgIHsKKwlpZiAoIU1haW5fRGlyZWN0RHJhd19ERFBJWEVMRk9STUFUX01hdGNoKCZyZXF1ZXN0ZWQtPnU0LmRkcGZQaXhlbEZvcm1hdCwKKwkJCQkJCSAmcHJvdmlkZWQtPnU0LmRkcGZQaXhlbEZvcm1hdCkpCisJICAgIHJldHVybiBGQUxTRTsKKyAgICB9CiAKLQlkZHNmZC5kd1dpZHRoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7Ci0JZGRzZmQuZHdIZWlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKLQlUUkFDRSgiIGVudW1lcmF0aW5nICglbGR4JWxkeCVkKVxuIixkZHNmZC5kd1dpZHRoLGRkc2ZkLmR3SGVpZ2h0LGRlcHRoc1tpXSk7Ci0JaWYgKCFtb2Rlc2NiKCZkZHNmZCxjb250ZXh0KSkgcmV0dXJuIEREX09LOworICAgIHJldHVybiBUUlVFOworfQogCi0JZm9yIChqPTA7ajxzaXplb2YobW9kZXMpL3NpemVvZihtb2Rlc1swXSk7aisrKSB7Ci0JICAgIGRkc2ZkLmR3V2lkdGgJPSBtb2Rlc1tqXS53OwotCSAgICBkZHNmZC5kd0hlaWdodAk9IG1vZGVzW2pdLmg7Ci0JICAgIFRSQUNFKCIgZW51bWVyYXRpbmcgKCVsZHglbGR4JWQpXG4iLGRkc2ZkLmR3V2lkdGgsZGRzZmQuZHdIZWlnaHQsZGVwdGhzW2ldKTsKLQkgICAgaWYgKCFtb2Rlc2NiKCZkZHNmZCxjb250ZXh0KSkgcmV0dXJuIEREX09LOwotCX0KKyNkZWZpbmUgRERFTlVNU1VSRkFDRVNfU0VBUkNIVFlQRSAoRERFTlVNU1VSRkFDRVNfQ0FOQkVDUkVBVEVEfERERU5VTVNVUkZBQ0VTX0RPRVNFWElTVCkKKyNkZWZpbmUgRERFTlVNU1VSRkFDRVNfTUFUQ0hUWVBFIChEREVOVU1TVVJGQUNFU19BTEx8RERFTlVNU1VSRkFDRVNfTUFUQ0h8RERFTlVNU1VSRkFDRVNfTk9NQVRDSCkKIAotCWlmICghKGR3RmxhZ3MgJiBEREVETV9TVEFOREFSRFZHQU1PREVTKSkgewotCSAgICAvKiBtb2RlWCBpcyBub3Qgc3RhbmRhcmQgVkdBICovCisvKiBUaGlzIHNob3VsZCBiZSBleHRlbmRlZCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5CisgKiBJRGlyZWN0RHJhd1N1cmZhY2U3OjpFbnVtQXR0YWNoZWRTdXJmYWNlcy4gKi8KK0hSRVNVTFQKK01haW5fRGlyZWN0RHJhd19FbnVtRXhpc3RpbmdTdXJmYWNlcyhJRGlyZWN0RHJhd0ltcGwgKlRoaXMsIERXT1JEIGR3RmxhZ3MsCisJCQkJICAgICBMUEREU1VSRkFDRURFU0MyIGxwRERTRDIsIExQVk9JRCBjb250ZXh0LAorCQkJCSAgICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYWxsYmFjaykKK3sKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmOworICAgIEJPT0wgYWxsLCBub21hdGNoOwogCi0JICAgIGRkc2ZkLmR3SGVpZ2h0ID0gMjAwOwotCSAgICBkZHNmZC5kd1dpZHRoID0gMzIwOwotCSAgICBUUkFDRSgiIGVudW1lcmF0aW5nICgzMjB4MjAweCVkKVxuIixkZXB0aHNbaV0pOwotCSAgICBpZiAoIW1vZGVzY2IoJmRkc2ZkLGNvbnRleHQpKSByZXR1cm4gRERfT0s7CisgICAgLyogQSBOVUxMIGxwRERTRDIgaXMgcGVybWl0dGVkIGlmIHdlIGFyZSBlbnVtZXJhdGluZyBhbGwgc3VyZmFjZXMgYW55d2F5ICovCisgICAgaWYgKGxwRERTRDIgPT0gTlVMTCAmJiAhKGR3RmxhZ3MgJiBEREVOVU1TVVJGQUNFU19BTEwpKQorCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgYWxsID0gZHdGbGFncyAmIERERU5VTVNVUkZBQ0VTX0FMTDsKKyAgICBub21hdGNoID0gZHdGbGFncyAmIERERU5VTVNVUkZBQ0VTX05PTUFUQ0g7CisKKyAgICBmb3IgKHN1cmYgPSBUaGlzLT5zdXJmYWNlczsgc3VyZiAhPSBOVUxMOyBzdXJmID0gc3VyZi0+bmV4dF9kZHJhdykKKyAgICB7CisJaWYgKGFsbAorCSAgICB8fCAobm9tYXRjaCAhPSBNYWluX0RpcmVjdERyYXdfRERTRF9NYXRjaChscEREU0QyLAorCQkJCQkJICAgICAgJnN1cmYtPnN1cmZhY2VfZGVzYykpKQorCXsKKwkgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgc3VyZmFjZSA9IElDT01fSU5URVJGQUNFKHN1cmYsCisJCQkJCQkJICBJRGlyZWN0RHJhd1N1cmZhY2U3KTsKKworCSAgICAvKiBCT0dVUyEgVmlvbGF0ZXMgQ09NIHJ1bGVzLCBidXQgTVNETiBzYXlzIHNvLiAqLworCSAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihzdXJmYWNlKTsKKworCSAgICBpZiAoY2FsbGJhY2soc3VyZmFjZSwgJnN1cmYtPnN1cmZhY2VfZGVzYywgY29udGV4dCkKKwkJPT0gRERFTlVNUkVUX0NBTkNFTCkKKwkJYnJlYWs7CiAJfQogICAgIH0KKwogICAgIHJldHVybiBERF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9HZXREaXNwbGF5TW9kZSgKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLExQRERTVVJGQUNFREVTQyBscGRkc2ZkCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXcySW1wbCxpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcCktPkdldERpc3BsYXlNb2RlKCVwKVxuIixUaGlzLGxwZGRzZmQpOwotICAgIGxwZGRzZmQtPmR3RmxhZ3MgPSBERFNEX0hFSUdIVHxERFNEX1dJRFRIfEREU0RfUElUQ0h8RERTRF9CQUNLQlVGRkVSQ09VTlR8RERTRF9QSVhFTEZPUk1BVHxERFNEX0NBUFM7Ci0gICAgbHBkZHNmZC0+ZHdIZWlnaHQgPSBUaGlzLT5kLT5oZWlnaHQ7Ci0gICAgbHBkZHNmZC0+ZHdXaWR0aCA9IFRoaXMtPmQtPndpZHRoOwotICAgIGxwZGRzZmQtPmxQaXRjaCA9bHBkZHNmZC0+ZHdXaWR0aCpQRkdFVF9CUFAoVGhpcy0+ZC0+ZGlyZWN0ZHJhd19waXhlbGZvcm1hdCk7Ci0gICAgbHBkZHNmZC0+ZHdCYWNrQnVmZmVyQ291bnQgPSAyOwotICAgIGxwZGRzZmQtPnUuZHdSZWZyZXNoUmF0ZSA9IDYwOwotICAgIGxwZGRzZmQtPmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19QQUxFVFRFOwotICAgIGxwZGRzZmQtPmRkcGZQaXhlbEZvcm1hdCA9IFRoaXMtPmQtPmRpcmVjdGRyYXdfcGl4ZWxmb3JtYXQ7Ci0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkKLQlfZHVtcF9zdXJmYWNlX2Rlc2MobHBkZHNmZCk7CisvKiBJIHJlYWxseSBkb24ndCB1bmRlcnN0YW5kIGhvdyB0aGlzIGlzIHN1cHBvc2VkIHRvIHdvcmsuCisgKiBXZSBvbmx5IGNvbnNpZGVyIGR3SGVpZ2h0LCBkd1dpZHRoIGFuZCBkZHBmUGl4ZWxGb3JtYXQuZHdGbGFncy4gKi8KK0hSRVNVTFQKK01haW5fRGlyZWN0RHJhd19FbnVtQ3JlYXRlYWJsZVN1cmZhY2VzKElEaXJlY3REcmF3SW1wbCAqVGhpcywgRFdPUkQgZHdGbGFncywKKwkJCQkgICAgICAgTFBERFNVUkZBQ0VERVNDMiBscEREU0QyLAorCQkJCSAgICAgICBMUFZPSUQgY29udGV4dCwKKwkJCQkgICAgICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYWxsYmFjaykKK3sKKyAgICBGSVhNRSgiVGhpcyBpc24ndCBnb2luZyB0byB3b3JrLlxuIik7CisKKyAgICBpZiAoKGR3RmxhZ3MgJiBEREVOVU1TVVJGQUNFU19NQVRDSFRZUEUpICE9IERERU5VTVNVUkZBQ0VTX01BVENIKQorCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgLyogVE9ETzogaW1wbGVtZW50IHRoaXMuCisgICAgICogRG9lcyB0aGlzIHdvcmsgYmVmb3JlIFNDTCBpcyBjYWxsZWQ/CisgICAgICogRG9lcyBpdCBvbmx5IGNvbnNpZGVyIG9mZi1zY3JlZW4gc3VyZmFjZXM/CisgICAgICovCisKKyAgICByZXR1cm4gRV9GQUlMOworfQorCisvKiBGb3IgdW5zaWduZWQgeC4gMCBpcyBub3QgYSBwb3dlciBvZiAyLiAqLworI2RlZmluZSBJU19QT1dfMih4KSAoKCh4KSAmICgoeCkgLSAxKSkgPT0gMCkKKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd19FbnVtU3VyZmFjZXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKKwkJCSAgICAgTFBERFNVUkZBQ0VERVNDMiBscEREU0QyLCBMUFZPSUQgY29udGV4dCwKKwkJCSAgICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYWxsYmFjaykKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLCBpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPigweCVseCwgJXAsICVwLCAlcClcbiIsIGlmYWNlLCBkd0ZsYWdzLCBscEREU0QyLCBjb250ZXh0LAorCSAgY2FsbGJhY2spOworCisgICAgaWYgKGNhbGxiYWNrID09IE5VTEwpCisJcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICBpZiAoZHdGbGFncyAmIH4oRERFTlVNU1VSRkFDRVNfU0VBUkNIVFlQRXxEREVOVU1TVVJGQUNFU19NQVRDSFRZUEUpKQorCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgaWYgKCFJU19QT1dfMihkd0ZsYWdzICYgRERFTlVNU1VSRkFDRVNfU0VBUkNIVFlQRSkKKwl8fCAhSVNfUE9XXzIoZHdGbGFncyAmIERERU5VTVNVUkZBQ0VTX01BVENIVFlQRSkpCisJcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisKKyAgICBpZiAoZHdGbGFncyAmIERERU5VTVNVUkZBQ0VTX0RPRVNFWElTVCkKKyAgICB7CisJcmV0dXJuIE1haW5fRGlyZWN0RHJhd19FbnVtRXhpc3RpbmdTdXJmYWNlcyhUaGlzLCBkd0ZsYWdzLCBscEREU0QyLAorCQkJCQkJICAgIGNvbnRleHQsIGNhbGxiYWNrKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlyZXR1cm4gTWFpbl9EaXJlY3REcmF3X0VudW1DcmVhdGVhYmxlU3VyZmFjZXMoVGhpcywgZHdGbGFncywgbHBERFNEMiwKKwkJCQkJCSAgICAgIGNvbnRleHQsIGNhbGxiYWNrKTsKKyAgICB9Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfRXZhbHVhdGVNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsRFdPUkQgYSxEV09SRCogYikKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLGlmYWNlKTsKKyAgICBGSVhNRSgiKCVwKS0+KCkgc3R1YlxuIiwgVGhpcyk7CisKICAgICByZXR1cm4gRERfT0s7CiB9CiAKLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfRmxpcFRvR0RJU3VyZmFjZShMUERJUkVDVERSQVcyIGlmYWNlKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICAgIEZJWE1FKCIoJXApLT4oKVxuIixUaGlzKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfRmxpcFRvR0RJU3VyZmFjZShMUERJUkVDVERSQVc3IGlmYWNlKQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0ltcGwsaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oKVxuIixUaGlzKTsKICAgICByZXR1cm4gRERfT0s7CiB9CiAKLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfR2V0TW9uaXRvckZyZXF1ZW5jeSgKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLExQRFdPUkQgZnJlcQotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOworLyogR2V0Q2FwcyAqLworLyogR2V0RGV2aWNlSWRlbnRpZmllciAqLworLyogR2V0RElzcGxheU1vZGUgKi8KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd19HZXRGb3VyQ0NDb2RlcyhMUERJUkVDVERSQVc3IGlmYWNlLCBMUERXT1JEIHBOdW1Db2RlcywKKwkJCSAgICAgICBMUERXT1JEIHBDb2RlcykKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLGlmYWNlKTsKKyAgICBGSVhNRSgiKCVwLCVwLCVwKSwgc3R1YlxuIixUaGlzLHBOdW1Db2RlcyxwQ29kZXMpOworICAgIHJldHVybiBERF9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd19HZXRHRElTdXJmYWNlKExQRElSRUNURFJBVzcgaWZhY2UsCisJCQkgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqbHBscEdESUREU1N1cmZhY2UpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3SW1wbCxpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIGxwbHBHRElERFNTdXJmYWNlKTsKKyAgICBUUkFDRSgicmV0dXJuaW5nIHByaW1hcnkgKCVwKVxuIiwgVGhpcy0+cHJpbWFyeV9zdXJmYWNlKTsKKyAgICAqbHBscEdESUREU1N1cmZhY2UgPSBJQ09NX0lOVEVSRkFDRShUaGlzLT5wcmltYXJ5X3N1cmZhY2UsIElEaXJlY3REcmF3U3VyZmFjZTcpOworICAgIGlmICgqbHBscEdESUREU1N1cmZhY2UpCisJSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoKmxwbHBHRElERFNTdXJmYWNlKTsKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfR2V0TW9uaXRvckZyZXF1ZW5jeShMUERJUkVDVERSQVc3IGlmYWNlLExQRFdPUkQgZnJlcSkKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLGlmYWNlKTsKICAgICBGSVhNRSgiKCVwKS0+KCVwKSByZXR1cm5zIDYwIEh6IGFsd2F5c1xuIixUaGlzLGZyZXEpOwogICAgICpmcmVxID0gNjAqMTAwOyAvKiA2MCBIeiAqLwogICAgIHJldHVybiBERF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9HZXRGb3VyQ0NDb2RlcygKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLExQRFdPUkQgeCxMUERXT1JEIHkKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwLCVwLCVwKSwgc3R1YlxuIixUaGlzLHgseSk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJJbXBsX0VudW1TdXJmYWNlcygKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLERXT1JEIHgsTFBERFNVUkZBQ0VERVNDIGRkc2ZkLExQVk9JRCBjb250ZXh0LAotICAgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSyBkZHNmY2IKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwKS0+KDB4JTA4bHgsJXAsJXAsJXApLHN0dWIhXG4iLFRoaXMseCxkZHNmZCxjb250ZXh0LGRkc2ZjYik7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJJbXBsX0NvbXBhY3QoIExQRElSRUNURFJBVzIgaWZhY2UgKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICAgIEZJWE1FKCIoJXApLT4oKVxuIiwgVGhpcyApOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9HZXRHRElTdXJmYWNlKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsIExQRElSRUNURFJBV1NVUkZBQ0UgKmxwbHBHRElERFNTdXJmYWNlCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXcySW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPiglcClcbiIsIFRoaXMsIGxwbHBHRElERFNTdXJmYWNlKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfR2V0U2NhbkxpbmUoCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSwgTFBEV09SRCBscGR3U2NhbkxpbmUKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfR2V0U2NhbkxpbmUoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBEV09SRCBscGR3U2NhbkxpbmUpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3SW1wbCxpZmFjZSk7CiAgICAgRklYTUUoIiglcCktPiglcClcbiIsIFRoaXMsIGxwZHdTY2FuTGluZSk7CiAKLSAgICBpZiAobHBkd1NjYW5MaW5lKQotCSpscGR3U2NhbkxpbmUgPSAxOworICAgICpscGR3U2NhbkxpbmUgPSAxOworCiAgICAgcmV0dXJuIEREX09LOwogfQogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJJbXBsX0luaXRpYWxpemUoTFBESVJFQ1REUkFXMiBpZmFjZSwgR1VJRCAqbHBHVUlEKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICAgIEZJWE1FKCIoJXApLT4oJXApXG4iLCBUaGlzLCBscEdVSUQpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd19HZXRTdXJmYWNlRnJvbURDKExQRElSRUNURFJBVzcgaWZhY2UsIEhEQyBoZGMsCisJCQkJIExQRElSRUNURFJBV1NVUkZBQ0U3ICpscEREUykKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLGlmYWNlKTsKKyAgICBGSVhNRSgiKCVwKS0+KCUwOGxkLCVwKVxuIiwgVGhpcywgKERXT1JEKSBoZGMsIGxwRERTKTsKKwogICAgIHJldHVybiBERF9PSzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJSURpcmVjdERyYXcyCi0gKgotICogV2Ugb25seSBuZWVkIHRvIGxpc3QgdGhlIGNoYW5nZWQvbmV3IGZ1bmN0aW9ucy4KLSAqLwotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9TZXREaXNwbGF5TW9kZSgKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLERXT1JEIHdpZHRoLERXT1JEIGhlaWdodCxEV09SRCBkZXB0aCwKLSAgICBEV09SRCBkd1JlZnJlc2hSYXRlLCBEV09SRCBkd0ZsYWdzCi0pIHsKLSAgICBGSVhNRSgiSWdub3JpbmcgcGFyYW1ldGVycyAoMHglMDhseCwweCUwOGx4KVxuIiwgZHdSZWZyZXNoUmF0ZSwgZHdGbGFncyApOyAKLSAgICByZXR1cm4gSURpcmVjdERyYXdJbXBsX1NldERpc3BsYXlNb2RlKChMUERJUkVDVERSQVcpaWZhY2Usd2lkdGgsaGVpZ2h0LGRlcHRoKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfR2V0VmVydGljYWxCbGFua1N0YXR1cyhMUERJUkVDVERSQVc3IGlmYWNlLCBMUEJPT0wgc3RhdHVzKQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0ltcGwsaWZhY2UpOworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMsc3RhdHVzKTsKKyAgICAqc3RhdHVzID0gVFJVRTsKKyAgICByZXR1cm4gRERfT0s7CiB9CiAKLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfR2V0QXZhaWxhYmxlVmlkTWVtKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsTFBERFNDQVBTIGRkc2NhcHMsTFBEV09SRCB0b3RhbCxMUERXT1JEIGZyZWUKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKKy8qIElmIHdlIHdlcmUgbm90IGluaXRpYWxpc2VkIHRoZW4gVW5pbml0X01haW5fSURpcmVjdERyYXc3X0luaXRpYWxpemUgd291bGQKKyAqIGhhdmUgYmVlbiBjYWxsZWQgaW5zdGVhZC4gKi8KK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfSW5pdGlhbGl6ZShMUERJUkVDVERSQVc3IGlmYWNlLCBMUEdVSUQgbHBHdWlkKQoreworICAgIFRSQUNFKCIoJXApLT4oJXMpXG4iLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChscEd1aWQpKTsKKworICAgIHJldHVybiBEREVSUl9BTFJFQURZSU5JVElBTElaRUQ7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfUmVzdG9yZUFsbFN1cmZhY2VzKExQRElSRUNURFJBVzcgaWZhY2UpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3SW1wbCxpZmFjZSk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZjsKKworICAgIFRSQUNFKCIoJXApLT4oKVxuIiwgVGhpcyk7CisKKyAgICBmb3IgKHN1cmYgPSBUaGlzLT5zdXJmYWNlczsgc3VyZiAhPSBOVUxMOyBzdXJmID0gc3VyZi0+bmV4dF9kZHJhdykKKwlJRGlyZWN0RHJhd1N1cmZhY2U3X1Jlc3RvcmUoSUNPTV9JTlRFUkZBQ0Uoc3VyZiwgSURpcmVjdERyYXdTdXJmYWNlNykpOworCisgICAgcmV0dXJuIEREX09LOworfQorCitzdGF0aWMgdm9pZCBERFJBV19TdWJjbGFzc1dpbmRvdyhJRGlyZWN0RHJhd0ltcGwqIFRoaXMpCit7CisgICAgLyogV2VsbCB3ZSBkb24ndCBhY3R1YWxseSBzdWJjbGFzcyB0aGUgd2luZG93IHlldC4gKi8KKyAgICBTZXRQcm9wQShUaGlzLT53aW5kb3csIGRkUHJvcCwgKExPTkcpVGhpcyk7Cit9CisKK3N0YXRpYyB2b2lkIEREUkFXX1Vuc3ViY2xhc3NXaW5kb3coSURpcmVjdERyYXdJbXBsKiBUaGlzKQoreworICAgIFJlbW92ZVByb3BBKFRoaXMtPndpbmRvdywgZGRQcm9wKTsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsKExQRElSRUNURFJBVzcgaWZhY2UsIEhXTkQgaHduZCwKKwkJCQkgICAgRFdPUkQgY29vcGxldmVsKQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0ltcGwsaWZhY2UpOworCisgICAgRklYTUUoIiglcCktPiglMDhseCwlMDhseClcbiIsVGhpcywoRFdPUkQpaHduZCxjb29wbGV2ZWwpOworICAgIEREUkFXX2R1bXBfY29vcGVyYXRpdmVsZXZlbChjb29wbGV2ZWwpOworCisgICAgLyogTWFrZXMgcmVhbE1ZU1QgdGVzdCBoYXBweS4gKi8KKyAgICBpZiAoVGhpcy0+Y29vcGVyYXRpdmVfbGV2ZWwgPT0gY29vcGxldmVsCisJJiYgVGhpcy0+d2luZG93ID09IGh3bmQpCisJcmV0dXJuIEREX09LOworCisgICAgaWYgKChUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCAmIEREU0NMX0VYQ0xVU0lWRSkgJiYKKyAgICAgICAgKGNvb3BsZXZlbCAmIEREU0NMX0VYQ0xVU0lWRSkpCisJcmV0dXJuIERERVJSX0VYQ0xVU0lWRU1PREVBTFJFQURZU0VUOworCisgICAgLyogWFhYICJJdCBjYW5ub3QgYmUgcmVzZXQgd2hpbGUgdGhlIHByb2Nlc3MgaGFzIHN1cmZhY2VzIG9yIHBhbGV0dGVzCisgICAgICogY3JlYXRlZC4iIE90aGVyd2lzZSB0aGUgd2luZG93IGNhbiBiZSBjaGFuZ2VkPz8/IAorICAgICAqIAorICAgICAqIFRoaXMgYXBwZWFycyB0byBiZSB3cm9uZyAtIGNvbW1lbnQgaXQgb3V0IGZvciBub3cuCisgICAgaWYgKFRoaXMtPndpbmRvdykKKwlyZXR1cm4gRERFUlJfSFdOREFMUkVBRFlTRVQ7IAorICAgICovCisKKyAgICBpZiAoIShjb29wbGV2ZWwgJiAoRERTQ0xfRVhDTFVTSVZFfEREU0NMX05PUk1BTCkpKQorCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgVGhpcy0+d2luZG93ID0gaHduZDsKKyAgICBUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCA9IGNvb3BsZXZlbDsKKworICAgIFNob3dXaW5kb3coaHduZCwgU1dfU0hPVyk7CisKKyAgICBERFJBV19TdWJjbGFzc1dpbmRvdyhUaGlzKTsKKworICAgIC8qIFRPRE8gRG9lcyBpdCBhbHNvIGdldCByZXNpemVkIHRvIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplPyAqLworCisgICAgcmV0dXJuIEREX09LOworfQorCitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsIERXT1JEIGR3V2lkdGgsCisJCQkgICAgICAgRFdPUkQgZHdIZWlnaHQsIExPTkcgbFBpdGNoLAorCQkJICAgICAgIERXT1JEIGR3UmVmcmVzaFJhdGUsIERXT1JEIGR3RmxhZ3MsCisJCQkgICAgICAgY29uc3QgRERQSVhFTEZPUk1BVCogcGl4ZWxmb3JtYXQpCit7CisgICAgc2hvcnQgc2NyZWVuWDsKKyAgICBzaG9ydCBzY3JlZW5ZOworICAgIAorICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0ltcGwsaWZhY2UpOworCisgICAgVFJBQ0UoIiglcCktPlNldERpc3BsYXlNb2RlKCVsZCwlbGQpXG4iLFRoaXMsZHdXaWR0aCxkd0hlaWdodCk7CisKKyAgICBpZiAoIShUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCAmIEREU0NMX0VYQ0xVU0lWRSkpCisJcmV0dXJuIERERVJSX05PRVhDTFVTSVZFTU9ERTsKKworICAgIGlmICghSXNXaW5kb3coVGhpcy0+d2luZG93KSkKKwlyZXR1cm4gRERFUlJfR0VORVJJQzsgLyogdW5jaGVja2VkICovCisKKyAgICBMb3NlUHJpbWFyeVN1cmZhY2UoVGhpcyk7CisKKyAgICBzY3JlZW5YID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7CisgICAgc2NyZWVuWSA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pOworICAgIAorICAgIFRoaXMtPndpZHRoID0gZHdXaWR0aDsKKyAgICBUaGlzLT5oZWlnaHQgPSBkd0hlaWdodDsKKyAgICBUaGlzLT5waXRjaCA9IGxQaXRjaDsKKyAgICBUaGlzLT5waXhlbGZvcm1hdCA9ICpwaXhlbGZvcm1hdDsKKworICAgIC8qIFBvc2l0aW9uIHRoZSB3aW5kb3cgaW4gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuIC0gZG9uJ3QgY2VudGVyIGZvciBub3cgKi8KKyAgICAvKiBNb3ZlV2luZG93KFRoaXMtPndpbmRvdywgKHNjcmVlblgtZHdXaWR0aCkvMiwgKHNjcmVlblktZHdIZWlnaHQpLzIsIAorICAgICAgICAgICAgICAgICAgZHdXaWR0aCwgZHdIZWlnaHQsIFRSVUUpOyovCisgICAgTW92ZVdpbmRvdyhUaGlzLT53aW5kb3csIDAsIDAsIGR3V2lkdGgsIGR3SGVpZ2h0LCBUUlVFKTsKKworICAgIFNldEZvY3VzKFRoaXMtPndpbmRvdyk7CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfUmVzdG9yZURpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3SW1wbCxpZmFjZSk7CisKKyAgICBUUkFDRSgiKCVwKVxuIixUaGlzKTsKKyAgICBpZiAoIShUaGlzLT5jb29wZXJhdGl2ZV9sZXZlbCAmIEREU0NMX0VYQ0xVU0lWRSkpCisJcmV0dXJuIERERVJSX05PRVhDTFVTSVZFTU9ERTsKKworICAgIC8qIExvc2UgdGhlIHByaW1hcnkgc3VyZmFjZSBpZiB0aGUgcmVzb2x1dGlvbiBjaGFuZ2VzLiAqLworICAgIGlmIChUaGlzLT5vcmlnX3dpZHRoICE9IFRoaXMtPndpZHRoIHx8IFRoaXMtPm9yaWdfaGVpZ2h0ICE9IFRoaXMtPmhlaWdodAorCXx8IFRoaXMtPm9yaWdfcGl0Y2ggIT0gVGhpcy0+cGl0Y2gKKwl8fCBUaGlzLT5vcmlnX3BpeGVsZm9ybWF0LmR3RmxhZ3MgIT0gVGhpcy0+cGl4ZWxmb3JtYXQuZHdGbGFncworCXx8ICFNYWluX0RpcmVjdERyYXdfRERQSVhFTEZPUk1BVF9NYXRjaCgmVGhpcy0+cGl4ZWxmb3JtYXQsCisJCQkJCQkmVGhpcy0+b3JpZ19waXhlbGZvcm1hdCkpCisgICAgeworCUxvc2VQcmltYXJ5U3VyZmFjZShUaGlzKTsKKyAgICB9CisKKyAgICAvKiBUT0RPIE1vdmUgdGhlIHdpbmRvdyBiYWNrIHdoZXJlIGl0IGJlbG9uZ3MuICovCisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfV2FpdEZvclZlcnRpY2FsQmxhbmsoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKKwkJCQkgICAgIEhBTkRMRSBoKQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0ltcGwsaWZhY2UpOworICAgIEZJWE1FKCIoJXApLT4oZmxhZ3M9MHglMDhseCxoYW5kbGU9MHglMDh4KVxuIixUaGlzLGR3RmxhZ3MsaCk7CisgICAgcmV0dXJuIEREX09LOworfQorCitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X0dldERpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsIExQRERTVVJGQUNFREVTQzIgcEREU0QpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3SW1wbCxpZmFjZSk7CisgICAgVFJBQ0UoIiglcCktPkdldERpc3BsYXlNb2RlKCVwKVxuIixUaGlzLHBERFNEKTsKKworICAgIHBERFNELT5kd0ZsYWdzID0gRERTRF9IRUlHSFR8RERTRF9XSURUSHxERFNEX1BJVENIfEREU0RfUElYRUxGT1JNQVR8RERTRF9SRUZSRVNIUkFURTsKKyAgICBwRERTRC0+ZHdIZWlnaHQgPSBUaGlzLT5oZWlnaHQ7CisgICAgcEREU0QtPmR3V2lkdGggPSBUaGlzLT53aWR0aDsKKyAgICBwRERTRC0+dTEubFBpdGNoID0gVGhpcy0+cGl0Y2g7CisgICAgcEREU0QtPnUyLmR3UmVmcmVzaFJhdGUgPSA2MDsKKyAgICBwRERTRC0+dTQuZGRwZlBpeGVsRm9ybWF0ID0gVGhpcy0+cGl4ZWxmb3JtYXQ7CisgICAgcEREU0QtPmRkc0NhcHMuZHdDYXBzID0gMDsKKworICAgIHJldHVybiBERF9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd19HZXRBdmFpbGFibGVWaWRNZW0oTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBERFNDQVBTMiBkZHNjYXBzLAorCQkJCSAgIExQRFdPUkQgdG90YWwsIExQRFdPUkQgZnJlZSkKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLGlmYWNlKTsKICAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCVwKVxuIiwgVGhpcyxkZHNjYXBzLHRvdGFsLGZyZWUpOwogCiAgICAgLyogV2UgaGF2ZSAxNiBNQiB2aWRlb21lbW9yeSAqLwpAQCAtNDgwLDEyMiArOTkzLDQzNiBAQAogICAgIHJldHVybiBERF9PSzsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJSURpcmVjdERyYXc0Ci0gKgorSFJFU1VMVCBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X1Rlc3RDb29wZXJhdGl2ZUxldmVsKExQRElSRUNURFJBVzcgaWZhY2UpIHsKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCk6IHN0dWJcbiIsIFRoaXMpOworCisgICAgcmV0dXJuIEREX09LOworfQorCitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X1N0YXJ0TW9kZVRlc3QoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBTSVpFIHBNb2RlcywKKwkJCSAgICAgIERXT1JEIGR3TnVtTW9kZXMsIERXT1JEIGR3RmxhZ3MpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3SW1wbCxpZmFjZSk7CisgICAgRklYTUUoIiglcCktPigpIHN0dWJcbiIsIFRoaXMpOworCisgICAgcmV0dXJuIEREX09LOworfQorCisvKioqIE93bmVkIG9iamVjdCBtYW5hZ2VtZW50LiAqLworCit2b2lkIE1haW5fRGlyZWN0RHJhd19BZGRTdXJmYWNlKElEaXJlY3REcmF3SW1wbCogVGhpcywKKwkJCQlJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmYWNlKQoreworICAgIGFzc2VydChzdXJmYWNlLT5kZHJhd19vd25lciA9PSBOVUxMIHx8IHN1cmZhY2UtPmRkcmF3X293bmVyID09IFRoaXMpOworCisgICAgc3VyZmFjZS0+ZGRyYXdfb3duZXIgPSBUaGlzOworCisgICAgLyogd2hlcmUgc2hvdWxkIGl0IGdvPyAqLworICAgIHN1cmZhY2UtPm5leHRfZGRyYXcgPSBUaGlzLT5zdXJmYWNlczsKKyAgICBzdXJmYWNlLT5wcmV2X2RkcmF3ID0gTlVMTDsKKyAgICBpZiAoVGhpcy0+c3VyZmFjZXMpCisJVGhpcy0+c3VyZmFjZXMtPnByZXZfZGRyYXcgPSBzdXJmYWNlOworICAgIFRoaXMtPnN1cmZhY2VzID0gc3VyZmFjZTsKK30KKwordm9pZCBNYWluX0RpcmVjdERyYXdfUmVtb3ZlU3VyZmFjZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCisJCQkJICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZmFjZSkKK3sKKyAgICBhc3NlcnQoc3VyZmFjZS0+ZGRyYXdfb3duZXIgPT0gVGhpcyk7CisKKyAgICBpZiAoVGhpcy0+c3VyZmFjZXMgPT0gc3VyZmFjZSkKKwlUaGlzLT5zdXJmYWNlcyA9IHN1cmZhY2UtPm5leHRfZGRyYXc7CisKKyAgICBpZiAoVGhpcy0+cHJpbWFyeV9zdXJmYWNlID09IHN1cmZhY2UpCisJVGhpcy0+cHJpbWFyeV9zdXJmYWNlID0gTlVMTDsKKworICAgIGlmIChzdXJmYWNlLT5uZXh0X2RkcmF3KQorCXN1cmZhY2UtPm5leHRfZGRyYXctPnByZXZfZGRyYXcgPSBzdXJmYWNlLT5wcmV2X2RkcmF3OworICAgIGlmIChzdXJmYWNlLT5wcmV2X2RkcmF3KQorCXN1cmZhY2UtPnByZXZfZGRyYXctPm5leHRfZGRyYXcgPSBzdXJmYWNlLT5uZXh0X2RkcmF3OworfQorCitzdGF0aWMgdm9pZCBNYWluX0RpcmVjdERyYXdfRGVsZXRlU3VyZmFjZXMoSURpcmVjdERyYXdJbXBsKiBUaGlzKQoreworICAgIHdoaWxlIChUaGlzLT5zdXJmYWNlcyAhPSBOVUxMKQorCU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRm9yY2VEZXN0cm95KFRoaXMtPnN1cmZhY2VzKTsKK30KKwordm9pZCBNYWluX0RpcmVjdERyYXdfQWRkQ2xpcHBlcihJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCisJCQkJSURpcmVjdERyYXdDbGlwcGVySW1wbCogY2xpcHBlcikKK3sKKyAgICBhc3NlcnQoY2xpcHBlci0+ZGRyYXdfb3duZXIgPT0gTlVMTCB8fCBjbGlwcGVyLT5kZHJhd19vd25lciA9PSBUaGlzKTsKKworICAgIGNsaXBwZXItPmRkcmF3X293bmVyID0gVGhpczsKKworICAgIGNsaXBwZXItPm5leHRfZGRyYXcgPSBUaGlzLT5jbGlwcGVyczsKKyAgICBjbGlwcGVyLT5wcmV2X2RkcmF3ID0gTlVMTDsKKyAgICBpZiAoVGhpcy0+Y2xpcHBlcnMpCisJVGhpcy0+Y2xpcHBlcnMtPnByZXZfZGRyYXcgPSBjbGlwcGVyOworICAgIFRoaXMtPmNsaXBwZXJzID0gY2xpcHBlcjsKK30KKwordm9pZCBNYWluX0RpcmVjdERyYXdfUmVtb3ZlQ2xpcHBlcihJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCisJCQkJICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCogY2xpcHBlcikKK3sKKyAgICBhc3NlcnQoY2xpcHBlci0+ZGRyYXdfb3duZXIgPT0gVGhpcyk7CisKKyAgICBpZiAoVGhpcy0+Y2xpcHBlcnMgPT0gY2xpcHBlcikKKwlUaGlzLT5jbGlwcGVycyA9IGNsaXBwZXItPm5leHRfZGRyYXc7CisKKyAgICBpZiAoY2xpcHBlci0+bmV4dF9kZHJhdykKKwljbGlwcGVyLT5uZXh0X2RkcmF3LT5wcmV2X2RkcmF3ID0gY2xpcHBlci0+cHJldl9kZHJhdzsKKyAgICBpZiAoY2xpcHBlci0+cHJldl9kZHJhdykKKwljbGlwcGVyLT5wcmV2X2RkcmF3LT5uZXh0X2RkcmF3ID0gY2xpcHBlci0+bmV4dF9kZHJhdzsKK30KKworc3RhdGljIHZvaWQgTWFpbl9EaXJlY3REcmF3X0RlbGV0ZUNsaXBwZXJzKElEaXJlY3REcmF3SW1wbCogVGhpcykKK3sKKyAgICB3aGlsZSAoVGhpcy0+Y2xpcHBlcnMgIT0gTlVMTCkKKwlNYWluX0RpcmVjdERyYXdDbGlwcGVyX0ZvcmNlRGVzdHJveShUaGlzLT5jbGlwcGVycyk7Cit9CisKK3ZvaWQgTWFpbl9EaXJlY3REcmF3X0FkZFBhbGV0dGUoSURpcmVjdERyYXdJbXBsKiBUaGlzLAorCQkJCUlEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbGV0dGUpCit7CisgICAgYXNzZXJ0KHBhbGV0dGUtPmRkcmF3X293bmVyID09IE5VTEwgfHwgcGFsZXR0ZS0+ZGRyYXdfb3duZXIgPT0gVGhpcyk7CisKKyAgICBwYWxldHRlLT5kZHJhd19vd25lciA9IFRoaXM7CisKKyAgICAvKiB3aGVyZSBzaG91bGQgaXQgZ28/ICovCisgICAgcGFsZXR0ZS0+bmV4dF9kZHJhdyA9IFRoaXMtPnBhbGV0dGVzOworICAgIHBhbGV0dGUtPnByZXZfZGRyYXcgPSBOVUxMOworICAgIGlmIChUaGlzLT5wYWxldHRlcykKKwlUaGlzLT5wYWxldHRlcy0+cHJldl9kZHJhdyA9IHBhbGV0dGU7CisgICAgVGhpcy0+cGFsZXR0ZXMgPSBwYWxldHRlOworfQorCit2b2lkIE1haW5fRGlyZWN0RHJhd19SZW1vdmVQYWxldHRlKElEaXJlY3REcmF3SW1wbCogVGhpcywKKwkJCQkgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWxldHRlKQoreworICAgIGFzc2VydChwYWxldHRlLT5kZHJhd19vd25lciA9PSBUaGlzKTsKKworICAgIGlmIChUaGlzLT5wYWxldHRlcyA9PSBwYWxldHRlKQorCVRoaXMtPnBhbGV0dGVzID0gcGFsZXR0ZS0+bmV4dF9kZHJhdzsKKworICAgIGlmIChwYWxldHRlLT5uZXh0X2RkcmF3KQorCXBhbGV0dGUtPm5leHRfZGRyYXctPnByZXZfZGRyYXcgPSBwYWxldHRlLT5wcmV2X2RkcmF3OworICAgIGlmIChwYWxldHRlLT5wcmV2X2RkcmF3KQorCXBhbGV0dGUtPnByZXZfZGRyYXctPm5leHRfZGRyYXcgPSBwYWxldHRlLT5uZXh0X2RkcmF3OworfQorCitzdGF0aWMgdm9pZCBNYWluX0RpcmVjdERyYXdfRGVsZXRlUGFsZXR0ZXMoSURpcmVjdERyYXdJbXBsKiBUaGlzKQoreworICAgIHdoaWxlIChUaGlzLT5wYWxldHRlcyAhPSBOVUxMKQorCU1haW5fRGlyZWN0RHJhd1BhbGV0dGVfRm9yY2VEZXN0cm95KFRoaXMtPnBhbGV0dGVzKTsKK30KKworLyoqKiA/Pz8gKi8KKworc3RhdGljIHZvaWQKK0xvc2VTdXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmZhY2UpCit7CisgICAgaWYgKHN1cmZhY2UgIT0gTlVMTCkgc3VyZmFjZS0+bG9zZV9zdXJmYWNlKHN1cmZhY2UpOworfQorCitzdGF0aWMgdm9pZAorTG9zZVByaW1hcnlTdXJmYWNlKElEaXJlY3REcmF3SW1wbCAqVGhpcykKK3sKKyAgICAvKiBNU0ROOiAiSWYgYW5vdGhlciBhcHBsaWNhdGlvbiBjaGFuZ2VzIHRoZSBkaXNwbGF5IG1vZGUsIHRoZSBwcmltYXJ5CisgICAgICogc3VyZmFjZSBpcyBsb3N0LCBhbmQgdGhlIG1ldGhvZCByZXR1cm5zIERERVJSX1NVUkZBQ0VMT1NUIHVudGlsIHRoZQorICAgICAqIHByaW1hcnkgc3VyZmFjZSBpcyByZWNyZWF0ZWQgdG8gbWF0Y2ggdGhlIG5ldyBkaXNwbGF5IG1vZGUuIgorICAgICAqCisgICAgICogV2UgbWFyayBhbGwgdGhlIHByaW1hcnkgc3VyZmFjZXMgYXMgbG9zdCBhcyBzb29uIGFzIHRoZSBkaXNwbGF5CisgICAgICogbW9kZSBpcyBjaGFuZ2VkIChieSBhbnkgYXBwbGljYXRpb24pLiAqLworCisgICAgTG9zZVN1cmZhY2UoVGhpcy0+cHJpbWFyeV9zdXJmYWNlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVW5pbml0aWFsaXNlZCBEaXJlY3REcmF3IGZ1bmN0aW9ucworICogCisgKiBUaGlzIHZ0YWJsZSBpcyB1c2VkIHdoZW4gYSBEaXJlY3REcmF3IG9iamVjdCBpcyBjcmVhdGVkIHdpdGgKKyAqIENvQ3JlYXRlSW5zdGFuY2UuIFRoZSBvbmx5IHVzYWJsZSBtZXRob2QgaXMgSW5pdGlhbGl6ZS4KICAqLwogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzRJbXBsX0dldFN1cmZhY2VGcm9tREMoCi0gICAgTFBESVJFQ1REUkFXNCBpZmFjZSwgSERDIGhkYywgTFBESVJFQ1REUkFXU1VSRkFDRSAqbHBERFMKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzRJbXBsLGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwKS0+KCUwOGxkLCVwKVxuIiwgVGhpcywgKERXT1JEKSBoZGMsIGxwRERTKTsKLQotICAgIHJldHVybiBERF9PSzsKK3ZvaWQgVW5pbml0X0RpcmVjdERyYXdfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd0ltcGwgKlRoaXMpCit7CisgICAgTWFpbl9EaXJlY3REcmF3X2ZpbmFsX3JlbGVhc2UoVGhpcyk7CiB9CiAKLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3NEltcGxfUmVzdG9yZUFsbFN1cmZhY2VzKExQRElSRUNURFJBVzQgaWZhY2UpIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXc0SW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPigpXG4iLCBUaGlzKTsKK3N0YXRpYyBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhdzcpIFVuaW5pdF9EaXJlY3REcmF3X1ZUYWJsZTsKIAotICAgIHJldHVybiBERF9PSzsKKy8qIE5vdCBjYWxsZWQgZnJvbSB0aGUgdnRhYmxlLiAqLworSFJFU1VMVCBVbmluaXRfRGlyZWN0RHJhd19Db25zdHJ1Y3QoSURpcmVjdERyYXdJbXBsICpUaGlzLCBCT09MIGV4KQoreworICAgIEhSRVNVTFQgaHI7CisKKyAgICBociA9IE1haW5fRGlyZWN0RHJhd19Db25zdHJ1Y3QoVGhpcywgZXgpOworICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7CisKKyAgICBUaGlzLT5maW5hbF9yZWxlYXNlID0gVW5pbml0X0RpcmVjdERyYXdfZmluYWxfcmVsZWFzZTsKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NywgVW5pbml0X0RpcmVjdERyYXdfVlRhYmxlKTsKKworICAgIHJldHVybiBTX09LOwogfQogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzRJbXBsX1Rlc3RDb29wZXJhdGl2ZUxldmVsKExQRElSRUNURFJBVzQgaWZhY2UpIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXc0SW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPigpXG4iLCBUaGlzKTsKK0hSRVNVTFQgVW5pbml0X0RpcmVjdERyYXdfQ3JlYXRlKGNvbnN0IEdVSUQqIHBHVUlELAorCQkJCSAgICAgICBMUERJUkVDVERSQVc3KiBwSWZhY2UsCisJCQkJICAgICAgIElVbmtub3duKiBwVW5rT3V0ZXIsIEJPT0wgZXgpCit7CisgICAgSFJFU1VMVCBocjsKKyAgICBJRGlyZWN0RHJhd0ltcGwqIFRoaXM7CiAKLSAgICByZXR1cm4gRERfT0s7CisgICAgYXNzZXJ0KHBVbmtPdXRlciA9PSBOVUxMKTsgLyogWFhYIG5vOiB3ZSBtdXN0IGNoZWNrIHRoaXMgKi8KKworICAgIFRoaXMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKKwkJICAgICBzaXplb2YoSURpcmVjdERyYXdJbXBsKSk7CisgICAgaWYgKFRoaXMgPT0gTlVMTCkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisKKyAgICBociA9IFVuaW5pdF9EaXJlY3REcmF3X0NvbnN0cnVjdChUaGlzLCBleCk7CisgICAgaWYgKEZBSUxFRChocikpCisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgVGhpcyk7CisgICAgZWxzZQorCSpwSWZhY2UgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpOworCisgICAgcmV0dXJuIGhyOwogfQogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzRJbXBsX0dldERldmljZUlkZW50aWZpZXIoCi0gICAgTFBESVJFQ1REUkFXNCBpZmFjZSxMUEREREVWSUNFSURFTlRJRklFUiBscGRkZGksRFdPUkQgZHdGbGFncwotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3NEltcGwsaWZhY2UpOwotICAgIEZJWE1FKCIoJXApLT4oJXAsJTA4bHgpXG4iLCBUaGlzLCBscGRkZGksIGR3RmxhZ3MpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19Jbml0aWFsaXplKExQRElSRUNURFJBVzcgaWZhY2UsIExQR1VJRCBwRGV2aWNlR3VpZCkKK3sKKyAgICBjb25zdCBkZHJhd19kcml2ZXIqIGRyaXZlcjsKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLCBpZmFjZSk7CiAKLSAgICAvKiBqdXN0IGd1ZXNzaW5nIHZhbHVlcyAqLwotICAgIHN0cmNweShscGRkZGktPnN6RHJpdmVyLCJkaXJlY3RkcmF3Iik7Ci0gICAgc3RyY3B5KGxwZGRkaS0+c3pEZXNjcmlwdGlvbiwiV0lORSBEaXJlY3REcmF3Iik7Ci0gICAgbHBkZGRpLT5saURyaXZlclZlcnNpb24ucy5IaWdoUGFydCA9IDc7Ci0gICAgbHBkZGRpLT5saURyaXZlclZlcnNpb24ucy5Mb3dQYXJ0ID0gMDsKLSAgICAvKiBEbyBJIHNtZWxsIFBDSSBpZHMgaGVyZSA/IC1NTSAqLwotICAgIGxwZGRkaS0+ZHdWZW5kb3JJZAkJCT0gMDsKLSAgICBscGRkZGktPmR3RGV2aWNlSWQJCQk9IDA7Ci0gICAgbHBkZGRpLT5kd1N1YlN5c0lkCQkJPSAwOwotICAgIGxwZGRkaS0+ZHdSZXZpc2lvbgkJCT0gMTsKLSAgICBtZW1zZXQoJihscGRkZGktPmd1aWREZXZpY2VJZGVudGlmaWVyKSwwLHNpemVvZihscGRkZGktPmd1aWREZXZpY2VJZGVudGlmaWVyKSk7Ci0gICAgcmV0dXJuIEREX09LOworICAgIFRSQUNFKCIoJXApLT4oJXApIiwgaWZhY2UsIHBEZXZpY2VHdWlkKTsKKworICAgIGRyaXZlciA9IEREUkFXX0ZpbmREcml2ZXIocERldmljZUd1aWQpOworICAgIC8qIFhYWCBUaGlzIHJldHVybiB2YWx1ZSBpcyBub3QgZG9jdW1lbnRlZC4gKE5vdCBjaGVja2VkLikgKi8KKyAgICBpZiAoZHJpdmVyID09IE5VTEwpIHJldHVybiBEREVSUl9JTlZBTElERElSRUNURFJBV0dVSUQ7CisKKyAgICByZXR1cm4gZHJpdmVyLT5pbml0KFRoaXMsIHBEZXZpY2VHdWlkKTsKIH0KIAotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXc3SW1wbF9TdGFydE1vZGVUZXN0KAotICAgIExQRElSRUNURFJBVzcgaWZhY2UsTFBTSVpFIGxwTW9kZXNUb1Rlc3QsRFdPUkQgZHdOdW1FbnRyaWVzLERXT1JEIGR3RmxhZ3MKLSkgewotICAgIEZJWE1FKCIoJXApLT4oJXAsJWxkLDB4JTA4bHgpLGVtcHR5IHN0dWIhXG4iLGlmYWNlLAotCWxwTW9kZXNUb1Rlc3QsZHdOdW1FbnRyaWVzLGR3RmxhZ3MKLSAgICApOwotICAgIHJldHVybiBERF9PSzsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVW5pbml0X0RpcmVjdERyYXdfQ29tcGFjdChMUERJUkVDVERSQVc3IGlmYWNlKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKIH0KIAotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXc3SW1wbF9FdmFsdWF0ZU1vZGUoCi0gICAgTFBESVJFQ1REUkFXNyBpZmFjZSxEV09SRCBkd0ZsYWdzLCBEV09SRCAqcFNlY29uZHNVbnRpbFRpbWVvdXQKLSkgewotICAgIEZJWE1FKCIoJXApLT4oMHglMDhseCwlcCksZW1wdHkgc3R1YiFcbiIsaWZhY2UsCi0JZHdGbGFncyxwU2Vjb25kc1VudGlsVGltZW91dAotICAgICk7Ci0gICAgcmV0dXJuIEREX09LOworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyKExQRElSRUNURFJBVzcgaWZhY2UsIERXT1JEIGR3RmxhZ3MsCisJCQkJTFBESVJFQ1REUkFXQ0xJUFBFUiAqbHBscEREQ2xpcHBlciwKKwkJCQlJVW5rbm93biAqcFVua091dGVyKQorCit7CisgICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwogfQogCi1IUkVTVUxUIGNvbW1vbl9vZmZfc2NyZWVuX0NyZWF0ZVN1cmZhY2UoCi0gICAgSURpcmVjdERyYXcySW1wbCogVGhpcyxJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBscGRzZgotKSB7Ci0gICAgaW50IGJwcDsKLQotICAgIC8qIFRoZSBzdXJmYWNlIHdhcyBhbHJlYWR5IGFsbG9jYXRlZCB3aGVuIGVudGVyaW5nIGluIHRoaXMgZnVuY3Rpb24gKi8KLSAgICBUUkFDRSgidXNpbmcgc3lzdGVtIG1lbW9yeSBmb3IgYSBzdXJmYWNlICglcCkgXG4iLCBscGRzZik7Ci0KLSAgICBpZiAobHBkc2YtPnMuc3VyZmFjZV9kZXNjLmR3RmxhZ3MgJiBERFNEX1pCVUZGRVJCSVRERVBUSCkgewotCS8qIFRoaXMgaXMgYSBaIEJ1ZmZlciAqLwotCVRSQUNFKCJDcmVhdGluZyBaLUJ1ZmZlciBvZiAlbGQgYml0IGRlcHRoXG4iLCBscGRzZi0+cy5zdXJmYWNlX2Rlc2MudS5kd1pCdWZmZXJCaXREZXB0aCk7Ci0JYnBwID0gbHBkc2YtPnMuc3VyZmFjZV9kZXNjLnUuZHdaQnVmZmVyQml0RGVwdGggLyA4OwotICAgIH0gZWxzZSB7Ci0JLyogVGhpcyBpcyBhIHN0YW5kYXJkIGltYWdlICovCi0JaWYgKCEobHBkc2YtPnMuc3VyZmFjZV9kZXNjLmR3RmxhZ3MgJiBERFNEX1BJWEVMRk9STUFUKSkgewotCSAgICAvKiBObyBwaXhlbCBmb3JtYXQgPT4gdXNlIERpcmVjdERyYXcncyBmb3JtYXQgKi8KLQkgICAgbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmRkcGZQaXhlbEZvcm1hdCA9IFRoaXMtPmQtPmRpcmVjdGRyYXdfcGl4ZWxmb3JtYXQ7Ci0JICAgIGxwZHNmLT5zLnN1cmZhY2VfZGVzYy5kd0ZsYWdzIHw9IEREU0RfUElYRUxGT1JNQVQ7Ci0JfQotCWJwcCA9IEdFVF9CUFAobHBkc2YtPnMuc3VyZmFjZV9kZXNjKTsKLQotCS8qIFdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIHJlcXVlc3RpbmcgYSAyNCBicHAgc3VyZmFjZSBhbmQgdGhlIERpcmVjdCBEcmF3IGJwcAotCSAgIGlzIHNldCB0byAzMiwgd2UgJ3VwZ3JhZGUnIHRoZSByZXF1ZXN0ZWQgYnBwIHRvIDMyIHRvIG1ha2UgdGhlIGJsaXQgZmFzdGVyCi0JICAgZnJvbSBvZmYtc2NyZWVuIHN1cmZhY2UgdG8gdmlzaWJsZSBzdXJmYWNlcy4KLQkgICAKLQkgICBUaGlzIGNhbiBhbHNvIGhhcHBlbiB3aXRoIDE1IC8gMTYgYnBwLgotCSAgIAotCSAgIFdpdGggdGhpcywgV2luZG93cyBNZWRpYSBQbGF5ZXIgd29ya3MgaW4gMzIgYnBwIG1vZGUuCi0JICAgICAgICAgICAgICAgICAgTGlvbmVsCi0JKi8KLQlpZiAoKChicHAgPT0gMykgJiYgKFBGR0VUX0JQUChUaGlzLT5kLT5kaXJlY3RkcmF3X3BpeGVsZm9ybWF0KSA9PSA0KSkgfHwKLQkgICAgKChicHAgPT0gMikgJiYgKFBGR0VUX0JQUChUaGlzLT5kLT5kaXJlY3RkcmF3X3BpeGVsZm9ybWF0KSA9PSAyKSAmJgotCSAgICAgKGxwZHNmLT5zLnN1cmZhY2VfZGVzYy5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSQml0TWFzayAhPSBUaGlzLT5kLT5kaXJlY3RkcmF3X3BpeGVsZm9ybWF0LnUxLmR3UkJpdE1hc2spKSkgewotCSAgVFJBQ0UoIldhcm5pbmc6ICd1cGdyYWRpbmcnIHJlcXVlc3RlZCBwaXhlbCBmb3JtYXQgdG8gc2NyZWVuIHBpeGVsIGZvcm1hdCBmb3IgYmxpdCBlZmZpY2llbmN5XG4iKTsKLQkgIFRSQUNFKCIgICAgICAgICBzb21lIGFwcGxpY2F0aW9ucyBtYXkgaGF2ZSBwcm9ibGVtcyB3aXRoIGl0LlxuIik7Ci0JICBicHAgPSBQRkdFVF9CUFAoVGhpcy0+ZC0+ZGlyZWN0ZHJhd19waXhlbGZvcm1hdCk7Ci0JICBscGRzZi0+cy5zdXJmYWNlX2Rlc2MuZGRwZlBpeGVsRm9ybWF0ID0gVGhpcy0+ZC0+ZGlyZWN0ZHJhd19waXhlbGZvcm1hdDsKLQl9Ci0gICAgfQotICAgIAotICAgIGlmIChscGRzZi0+cy5zdXJmYWNlX2Rlc2MuZHdGbGFncyAmIEREU0RfTFBTVVJGQUNFKQotCUVSUigiQ3JlYXRlcyBhIHN1cmZhY2UgdGhhdCBpcyBhbHJlYWR5IGFsbG9jYXRlZCA6IGFzc3VtaW5nIHRoaXMgaXMgYW4gYXBwbGljYXRpb24gYnVnICFcbiIpOwotCi0gICAgbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9QSVRDSHxERFNEX0xQU1VSRkFDRTsKLSAgICBscGRzZi0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlID0oTFBCWVRFKVZpcnR1YWxBbGxvYygKLQlOVUxMLAotCWxwZHNmLT5zLnN1cmZhY2VfZGVzYy5kd1dpZHRoICogbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmR3SGVpZ2h0ICogYnBwLAotCU1FTV9SRVNFUlZFIHwgTUVNX0NPTU1JVCwKLQlQQUdFX1JFQURXUklURQotICAgICk7Ci0gICAgbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmxQaXRjaCA9IGxwZHNmLT5zLnN1cmZhY2VfZGVzYy5kd1dpZHRoICogYnBwOwotICAgIHJldHVybiBERF9PSzsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVW5pbml0X0RpcmVjdERyYXdfQ3JlYXRlUGFsZXR0ZShMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd0ZsYWdzLAorCQkJCUxQUEFMRVRURUVOVFJZIGxwQ29sb3JUYWJsZSwKKwkJCQlMUERJUkVDVERSQVdQQUxFVFRFICpscGxwRERQYWxldHRlLAorCQkJCUlVbmtub3duICpwVW5rT3V0ZXIpCit7CisgICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOwogfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1VuaW5pdF9EaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UoTFBESVJFQ1REUkFXNyBpZmFjZSwKKwkJCQlMUEREU1VSRkFDRURFU0MyIGxwRERTdXJmYWNlRGVzYywKKwkJCQlMUERJUkVDVERSQVdTVVJGQUNFNyAqbHBscEREU3VyZmFjZSwKKwkJCQlJVW5rbm93biAqcFVua091dGVyKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19EdXBsaWNhdGVTdXJmYWNlKExQRElSRUNURFJBVzcgaWZhY2UsCisJCQkJICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcFN1cmYsCisJCQkJICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgKnBEdXBTdXJmKQorCit7CisgICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1VuaW5pdF9EaXJlY3REcmF3X0VudW1EaXNwbGF5TW9kZXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKKwkJCQkgICBMUEREU1VSRkFDRURFU0MyIGxwRERTRCwKKwkJCQkgICBMUFZPSUQgY29udGV4dCwKKwkJCQkgICBMUERERU5VTU1PREVTQ0FMTEJBQ0syIGNiKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19FbnVtU3VyZmFjZXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKKwkJCSAgICAgICBMUEREU1VSRkFDRURFU0MyIHBERFNELCBMUFZPSUQgY29udGV4dCwKKwkJCSAgICAgICBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0s3IGNiKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19GbGlwVG9HRElTdXJmYWNlKExQRElSRUNURFJBVzcgaWZhY2UpCit7CisgICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1VuaW5pdF9EaXJlY3REcmF3X0dldENhcHMoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBERENBUFMgcERyaXZlckNhcHMsCisJCQkgIExQRERDQVBTIHBIRUxDYXBzKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19HZXREaXNwbGF5TW9kZShMUERJUkVDVERSQVc3IGlmYWNlLAorCQkJCSBMUEREU1VSRkFDRURFU0MyIHBERFNEKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19HZXRGb3VyQ0NDb2RlcyhMUERJUkVDVERSQVc3IGlmYWNlLCBMUERXT1JEIHBOdW1Db2RlcywKKwkJCQkgTFBEV09SRCBwQ29kZXMpCit7CisgICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1VuaW5pdF9EaXJlY3REcmF3X0dldEdESVN1cmZhY2UoTFBESVJFQ1REUkFXNyBpZmFjZSwKKwkJCQlMUERJUkVDVERSQVdTVVJGQUNFNyAqcEdESVN1cmYpCit7CisgICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1VuaW5pdF9EaXJlY3REcmF3X0dldE1vbml0b3JGcmVxdWVuY3koTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBEV09SRCBwZHdGcmVxKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19HZXRTY2FuTGluZShMUERJUkVDVERSQVc3IGlmYWNlLCBMUERXT1JEIHBkd1NjYW5MaW5lKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzKExQRElSRUNURFJBVzcgaWZhY2UsIFBCT09MIHBiSXNJblZCKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19SZXN0b3JlRGlzcGxheU1vZGUoTFBESVJFQ1REUkFXNyBpZmFjZSkKK3sKKyAgICByZXR1cm4gRERFUlJfTk9USU5JVElBTElaRUQ7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVW5pbml0X0RpcmVjdERyYXdfU2V0Q29vcGVyYXRpdmVMZXZlbChMUERJUkVDVERSQVc3IGlmYWNlLCBIV05EIGhXbmQsCisJCQkJICAgICAgRFdPUkQgZHdGbGFncykKK3sKKyAgICByZXR1cm4gRERFUlJfTk9USU5JVElBTElaRUQ7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVW5pbml0X0RpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdXaWR0aCwKKwkJCQkgRFdPUkQgZHdIZWlnaHQsIERXT1JEIGR3QlBQLAorCQkJCSBEV09SRCBkd1JlZnJlc2hSYXRlLCBEV09SRCBkd0ZsYWdzKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19XYWl0Rm9yVmVydGljYWxCbGFuayhMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd0ZsYWdzLAorCQkJCSAgICAgICBIQU5ETEUgaEV2ZW50KQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19HZXRBdmFpbGFibGVWaWRNZW0oTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBERFNDQVBTMiBwRERDYXBzLAorCQkJCSAgICAgTFBEV09SRCBwZHdUb3RhbCwgTFBEV09SRCBwZHdGcmVlKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19HZXRTdXJmYWNlRnJvbURDKExQRElSRUNURFJBVzcgaWZhY2UsIEhEQyBoREMsCisJCQkJICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgKnBTdXJmKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19SZXN0b3JlQWxsU3VyZmFjZXMoTFBESVJFQ1REUkFXNyBpZmFjZSkKK3sKKyAgICByZXR1cm4gRERFUlJfTk9USU5JVElBTElaRUQ7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVW5pbml0X0RpcmVjdERyYXdfVGVzdENvb3BlcmF0aXZlTGV2ZWwoTFBESVJFQ1REUkFXNyBpZmFjZSkKK3sKKyAgICByZXR1cm4gRERFUlJfTk9USU5JVElBTElaRUQ7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorVW5pbml0X0RpcmVjdERyYXdfR2V0RGV2aWNlSWRlbnRpZmllcihMUERJUkVDVERSQVc3IGlmYWNlLAorCQkJCSAgICAgIExQRERERVZJQ0VJREVOVElGSUVSMiBwRERESSwKKwkJCQkgICAgICBEV09SRCBkd0ZsYWdzKQoreworICAgIHJldHVybiBEREVSUl9OT1RJTklUSUFMSVpFRDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitVbmluaXRfRGlyZWN0RHJhd19TdGFydE1vZGVUZXN0KExQRElSRUNURFJBVzcgaWZhY2UsIExQU0laRSBwc3pNb2RlcywKKwkJCQlEV09SRCBjTW9kZXMsIERXT1JEIGR3RmxhZ3MpCit7CisgICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK1VuaW5pdF9EaXJlY3REcmF3X0V2YWx1YXRlTW9kZShMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd0ZsYWdzLAorCQkJICAgICAgIExQRFdPUkQgcFRpbWVvdXQpCit7CisgICAgcmV0dXJuIERERVJSX05PVElOSVRJQUxJWkVEOworfQorCitzdGF0aWMgSUNPTV9WVEFCTEUoSURpcmVjdERyYXc3KSBVbmluaXRfRGlyZWN0RHJhd19WVGFibGUgPQoreworICAgIElDT01fTVNWVEFCTEVfQ09NUEFUX0R1bW15UlRUSVZBTFVFCisgICAgTWFpbl9EaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlLAorICAgIE1haW5fRGlyZWN0RHJhd19BZGRSZWYsCisgICAgTWFpbl9EaXJlY3REcmF3X1JlbGVhc2UsCisgICAgVW5pbml0X0RpcmVjdERyYXdfQ29tcGFjdCwKKyAgICBVbmluaXRfRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyLAorICAgIFVuaW5pdF9EaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUsCisgICAgVW5pbml0X0RpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSwKKyAgICBVbmluaXRfRGlyZWN0RHJhd19EdXBsaWNhdGVTdXJmYWNlLAorICAgIFVuaW5pdF9EaXJlY3REcmF3X0VudW1EaXNwbGF5TW9kZXMsCisgICAgVW5pbml0X0RpcmVjdERyYXdfRW51bVN1cmZhY2VzLAorICAgIFVuaW5pdF9EaXJlY3REcmF3X0ZsaXBUb0dESVN1cmZhY2UsCisgICAgVW5pbml0X0RpcmVjdERyYXdfR2V0Q2FwcywKKyAgICBVbmluaXRfRGlyZWN0RHJhd19HZXREaXNwbGF5TW9kZSwKKyAgICBVbmluaXRfRGlyZWN0RHJhd19HZXRGb3VyQ0NDb2RlcywKKyAgICBVbmluaXRfRGlyZWN0RHJhd19HZXRHRElTdXJmYWNlLAorICAgIFVuaW5pdF9EaXJlY3REcmF3X0dldE1vbml0b3JGcmVxdWVuY3ksCisgICAgVW5pbml0X0RpcmVjdERyYXdfR2V0U2NhbkxpbmUsCisgICAgVW5pbml0X0RpcmVjdERyYXdfR2V0VmVydGljYWxCbGFua1N0YXR1cywKKyAgICBVbmluaXRfRGlyZWN0RHJhd19Jbml0aWFsaXplLAorICAgIFVuaW5pdF9EaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZSwKKyAgICBVbmluaXRfRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsLAorICAgIFVuaW5pdF9EaXJlY3REcmF3X1NldERpc3BsYXlNb2RlLAorICAgIFVuaW5pdF9EaXJlY3REcmF3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAorICAgIFVuaW5pdF9EaXJlY3REcmF3X0dldEF2YWlsYWJsZVZpZE1lbSwKKyAgICBVbmluaXRfRGlyZWN0RHJhd19HZXRTdXJmYWNlRnJvbURDLAorICAgIFVuaW5pdF9EaXJlY3REcmF3X1Jlc3RvcmVBbGxTdXJmYWNlcywKKyAgICBVbmluaXRfRGlyZWN0RHJhd19UZXN0Q29vcGVyYXRpdmVMZXZlbCwKKyAgICBVbmluaXRfRGlyZWN0RHJhd19HZXREZXZpY2VJZGVudGlmaWVyLAorICAgIFVuaW5pdF9EaXJlY3REcmF3X1N0YXJ0TW9kZVRlc3QsCisgICAgVW5pbml0X0RpcmVjdERyYXdfRXZhbHVhdGVNb2RlCit9OwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kZHJhdy9tYWluLmggYi9kbGxzL2RkcmF3L2RkcmF3L21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAxZDExCi0tLSAvZGV2L251bGwKKysrIGIvZGxscy9kZHJhdy9kZHJhdy9tYWluLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qIENvcHlyaWdodCAyMDAwIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuICovCisKKyNpZm5kZWYgV0lORV9ERFJBV19ERFJBV19NQUlOX0hfSU5DTFVERUQKKyNkZWZpbmUgV0lORV9ERFJBV19ERFJBV19NQUlOX0hfSU5DTFVERUQKKworLyogaW50ZXJuYWwgdmlydHVhbCBmdW5jdGlvbnMgKi8KK3ZvaWQgTWFpbl9EaXJlY3REcmF3X2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdJbXBsKiBUaGlzKTsKK0hSRVNVTFQKK01haW5fY3JlYXRlX29mZnNjcmVlbihJRGlyZWN0RHJhd0ltcGwqIFRoaXMsIGNvbnN0IEREU1VSRkFDRURFU0MyICpwRERTRCwKKwkJICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwgTFBVTktOT1dOIHBPdXRlcik7CitIUkVTVUxUCitNYWluX2NyZWF0ZV90ZXh0dXJlKElEaXJlY3REcmF3SW1wbCogVGhpcywgY29uc3QgRERTVVJGQUNFREVTQzIgKnBERFNELAorCQkgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwgTFBVTktOT1dOIHBPdXRlciwKKwkJICAgIERXT1JEIGR3TWlwTWFwTGV2ZWwpOworSFJFU1VMVAorTWFpbl9jcmVhdGVfemJ1ZmZlcihJRGlyZWN0RHJhd0ltcGwqIFRoaXMsIGNvbnN0IEREU1VSRkFDRURFU0MyICpwRERTRCwKKwkJICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsIExQVU5LTk9XTiBwT3V0ZXIpOworCisvKiBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KK0hSRVNVTFQgTWFpbl9EaXJlY3REcmF3X0NvbnN0cnVjdChJRGlyZWN0RHJhd0ltcGwgKlRoaXMsIEJPT0wgZXgpOwordm9pZCBNYWluX0RpcmVjdERyYXdfQWRkU3VyZmFjZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCisJCQkJSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZmFjZSk7Cit2b2lkIE1haW5fRGlyZWN0RHJhd19SZW1vdmVTdXJmYWNlKElEaXJlY3REcmF3SW1wbCogVGhpcywKKwkJCQkgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmYWNlKTsKK3ZvaWQgTWFpbl9EaXJlY3REcmF3X0FkZENsaXBwZXIoSURpcmVjdERyYXdJbXBsKiBUaGlzLAorCQkJCUlEaXJlY3REcmF3Q2xpcHBlckltcGwqIGNsaXBwZXIpOwordm9pZCBNYWluX0RpcmVjdERyYXdfUmVtb3ZlQ2xpcHBlcihJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCisJCQkJICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCogY2xpcHBlcik7Cit2b2lkIE1haW5fRGlyZWN0RHJhd19BZGRQYWxldHRlKElEaXJlY3REcmF3SW1wbCogVGhpcywKKwkJCQlJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBzdXJmYWNlKTsKK3ZvaWQgTWFpbl9EaXJlY3REcmF3X1JlbW92ZVBhbGV0dGUoSURpcmVjdERyYXdJbXBsKiBUaGlzLAorCQkJCSAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbGV0dGUpOworCisKKy8qIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KKworVUxPTkcgV0lOQVBJIE1haW5fRGlyZWN0RHJhd19BZGRSZWYoTFBESVJFQ1REUkFXNyBpZmFjZSk7CitVTE9ORyBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X1JlbGVhc2UoTFBESVJFQ1REUkFXNyBpZmFjZSk7CitIUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1REUkFXNyBpZmFjZSwKKwkJCQkJICAgICAgUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iaik7CitIUkVTVUxUIFdJTkFQSSBNYWluX0RpcmVjdERyYXdfQ29tcGFjdChMUERJUkVDVERSQVc3IGlmYWNlKTsKK0hSRVNVTFQgV0lOQVBJIE1haW5fRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyKExQRElSRUNURFJBVzcgaWZhY2UsCisJCQkJCSAgICAgRFdPUkQgZHdGbGFncywKKwkJCQkJICAgICBMUERJUkVDVERSQVdDTElQUEVSICpwcENsaXBwZXIsCisJCQkJCSAgICAgSVVua25vd24gKnBVbmtPdXRlcik7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKKwkJCSAgICAgIExQUEFMRVRURUVOVFJZIHBhbGVudCwKKwkJCSAgICAgIExQRElSRUNURFJBV1BBTEVUVEUqIHBwUGFsZXR0ZSwKKwkJCSAgICAgIExQVU5LTk9XTiBwVW5rbm93bik7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwKKwkJCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3ICpwcFN1cmYsCisJCQkgICAgICBJVW5rbm93biAqcFVua091dGVyKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfRHVwbGljYXRlU3VyZmFjZShMUERJUkVDVERSQVc3IGlmYWNlLCBMUERJUkVDVERSQVdTVVJGQUNFNyBzcmMsCisJCQkJIExQRElSRUNURFJBV1NVUkZBQ0U3KiBkc3QpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd19FbnVtU3VyZmFjZXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKKwkJCSAgICAgTFBERFNVUkZBQ0VERVNDMiBscEREU0QyLCBMUFZPSUQgY29udGV4dCwKKwkJCSAgICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYWxsYmFjayk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X0V2YWx1YXRlTW9kZShMUERJUkVDVERSQVc3IGlmYWNlLERXT1JEIGEsRFdPUkQqIGIpOworSFJFU1VMVCBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X0ZsaXBUb0dESVN1cmZhY2UoTFBESVJFQ1REUkFXNyBpZmFjZSk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X0dldEZvdXJDQ0NvZGVzKExQRElSRUNURFJBVzcgaWZhY2UsIExQRFdPUkQgcE51bUNvZGVzLAorCQkJICAgICAgIExQRFdPUkQgcENvZGVzKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfR2V0R0RJU3VyZmFjZShMUERJUkVDVERSQVc3IGlmYWNlLAorCQkJICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgKmxwbHBHRElERFNTdXJmYWNlKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfR2V0TW9uaXRvckZyZXF1ZW5jeShMUERJUkVDVERSQVc3IGlmYWNlLExQRFdPUkQgZnJlcSk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X0dldFNjYW5MaW5lKExQRElSRUNURFJBVzcgaWZhY2UsIExQRFdPUkQgbHBkd1NjYW5MaW5lKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfR2V0U3VyZmFjZUZyb21EQyhMUERJUkVDVERSQVc3IGlmYWNlLCBIREMgaGRjLAorCQkJCSBMUERJUkVDVERSQVdTVVJGQUNFNyAqbHBERFMpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd19HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzKExQRElSRUNURFJBVzcgaWZhY2UsIExQQk9PTCBzdGF0dXMpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd19Jbml0aWFsaXplKExQRElSRUNURFJBVzcgaWZhY2UsIExQR1VJRCBscEd1aWQpOworSFJFU1VMVCBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X1Jlc3RvcmVBbGxTdXJmYWNlcyhMUERJUkVDVERSQVc3IGlmYWNlKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfU2V0Q29vcGVyYXRpdmVMZXZlbChMUERJUkVDVERSQVc3IGlmYWNlLCBIV05EIGh3bmQsCisJCQkJICAgIERXT1JEIGNvb3BsZXZlbCk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsIERXT1JEIGR3V2lkdGgsCisJCQkgICAgICAgRFdPUkQgZHdIZWlnaHQsIExPTkcgbFBpdGNoLAorCQkJICAgICAgIERXT1JEIGR3UmVmcmVzaFJhdGUsIERXT1JEIGR3RmxhZ3MsCisJCQkgICAgICAgY29uc3QgRERQSVhFTEZPUk1BVCogcGl4ZWxmb3JtYXQpOworSFJFU1VMVCBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVc3IGlmYWNlKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfV2FpdEZvclZlcnRpY2FsQmxhbmsoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKKwkJCQkgICAgIEhBTkRMRSBoKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdfR2V0RGlzcGxheU1vZGUoTFBESVJFQ1REUkFXNyBpZmFjZSwgTFBERFNVUkZBQ0VERVNDMiBwRERTRCk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3X0dldEF2YWlsYWJsZVZpZE1lbShMUERJUkVDVERSQVc3IGlmYWNlLExQRERTQ0FQUzIgZGRzY2FwcywKKwkJCQkgICBMUERXT1JEIHRvdGFsLCBMUERXT1JEIGZyZWUpOworSFJFU1VMVCBXSU5BUEkgTWFpbl9EaXJlY3REcmF3X1Rlc3RDb29wZXJhdGl2ZUxldmVsKExQRElSRUNURFJBVzcgaWZhY2UpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd19TdGFydE1vZGVUZXN0KExQRElSRUNURFJBVzcgaWZhY2UsIExQU0laRSBwTW9kZXMsCisJCQkgICAgICBEV09SRCBkd051bU1vZGVzLCBEV09SRCBkd0ZsYWdzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RkcmF3L3RodW5rcy5jIGIvZGxscy9kZHJhdy9kZHJhdy90aHVua3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzZmN2EzCi0tLSAvZGV2L251bGwKKysrIGIvZGxscy9kZHJhdy9kZHJhdy90aHVua3MuYwpAQCAtMCwwICsxLDk2MyBAQAorLyogRGlyZWN0IERyYXcgVGh1bmtzIGFuZCBvbGQgdnRhYmxlcworICogQ29weXJpZ2h0IDIwMDAgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KKyAqLworI2luY2x1ZGUgPGRkcmF3Lmg+CisjaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImRkY29taW1wbC5oIgorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9RdWVyeUludGVyZmFjZShMUERJUkVDVERSQVcgVGhpcywgUkVGSUlEIGlpZCwgTFBWT0lEICpwcE9iaikKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJICBJRGlyZWN0RHJhdywKKwkJCQkJCQkgIElEaXJlY3REcmF3NywgVGhpcyksCisJCQkJICAgICAgIGlpZCwgcHBPYmopOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3MkltcGxfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1REUkFXMiBUaGlzLCBSRUZJSUQgaWlkLCBMUFZPSUQgKnBwT2JqKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgIElEaXJlY3REcmF3MiwKKwkJCQkJCQkgIElEaXJlY3REcmF3NywgVGhpcyksCisJCQkJICAgICAgIGlpZCwgcHBPYmopOworfQorCisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXc0SW1wbF9RdWVyeUludGVyZmFjZShMUERJUkVDVERSQVc0IFRoaXMsIFJFRklJRCBpaWQsIExQVk9JRCAqcHBPYmopCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19RdWVyeUludGVyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgSURpcmVjdERyYXc0LAorCQkJCQkJCSAgSURpcmVjdERyYXc3LCBUaGlzKSwKKwkJCQkgICAgICAgaWlkLCBwcE9iaik7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9BZGRSZWYoTFBESVJFQ1REUkFXIFRoaXMpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCSAgSURpcmVjdERyYXcsIElEaXJlY3REcmF3NywKKwkJCQkJCSAgVGhpcykpOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJCitJRGlyZWN0RHJhdzJJbXBsX0FkZFJlZihMUERJUkVDVERSQVcyIFRoaXMpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCSAgSURpcmVjdERyYXcyLCBJRGlyZWN0RHJhdzcsCisJCQkJCQkgIFRoaXMpKTsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSQorSURpcmVjdERyYXc0SW1wbF9BZGRSZWYoTFBESVJFQ1REUkFXNCBUaGlzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfQWRkUmVmKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkgIElEaXJlY3REcmF3NCwgSURpcmVjdERyYXc3LAorCQkJCQkJICBUaGlzKSk7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9SZWxlYXNlKExQRElSRUNURFJBVyBUaGlzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJICAgSURpcmVjdERyYXcsIElEaXJlY3REcmF3NywKKwkJCQkJCSAgIFRoaXMpKTsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9SZWxlYXNlKExQRElSRUNURFJBVzIgVGhpcykKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X1JlbGVhc2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCSAgIElEaXJlY3REcmF3MiwgSURpcmVjdERyYXc3LAorCQkJCQkJICAgVGhpcykpOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJCitJRGlyZWN0RHJhdzRJbXBsX1JlbGVhc2UoTFBESVJFQ1REUkFXNCBUaGlzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJICAgSURpcmVjdERyYXc0LCBJRGlyZWN0RHJhdzcsCisJCQkJCQkgICBUaGlzKSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX0NvbXBhY3QoTFBESVJFQ1REUkFXIFRoaXMpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19Db21wYWN0KENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkgICBJRGlyZWN0RHJhdywgSURpcmVjdERyYXc3LAorCQkJCQkJICAgVGhpcykpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3MkltcGxfQ29tcGFjdChMUERJUkVDVERSQVcyIFRoaXMpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19Db21wYWN0KENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkgICBJRGlyZWN0RHJhdzIsIElEaXJlY3REcmF3NywKKwkJCQkJCSAgIFRoaXMpKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzRJbXBsX0NvbXBhY3QoTFBESVJFQ1REUkFXNCBUaGlzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfQ29tcGFjdChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJICAgSURpcmVjdERyYXc0LCBJRGlyZWN0RHJhdzcsCisJCQkJCQkgICBUaGlzKSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX0NyZWF0ZUNsaXBwZXIoTFBESVJFQ1REUkFXIFRoaXMsIERXT1JEIGR3RmxhZ3MsCisJCQkgICAgICBMUERJUkVDVERSQVdDTElQUEVSICpwcENsaXBwZXIsCisJCQkgICAgICBJVW5rbm93biAqcFVua091dGVyKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfQ3JlYXRlQ2xpcHBlcihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSBJRGlyZWN0RHJhdywKKwkJCQkJCQkgSURpcmVjdERyYXc3LAorCQkJCQkJCSBUaGlzKSwKKwkJCQkgICAgICBkd0ZsYWdzLCBwcENsaXBwZXIsIHBVbmtPdXRlcik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9DcmVhdGVDbGlwcGVyKExQRElSRUNURFJBVzIgVGhpcywgRFdPUkQgZHdGbGFncywKKwkJCSAgICAgICBMUERJUkVDVERSQVdDTElQUEVSICpwcENsaXBwZXIsCisJCQkgICAgICAgSVVua25vd24gKnBVbmtPdXRlcikKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0NyZWF0ZUNsaXBwZXIoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgSURpcmVjdERyYXcyLAorCQkJCQkJCSBJRGlyZWN0RHJhdzcsCisJCQkJCQkJIFRoaXMpLAorCQkJCSAgICAgIGR3RmxhZ3MsIHBwQ2xpcHBlciwgcFVua091dGVyKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzRJbXBsX0NyZWF0ZUNsaXBwZXIoTFBESVJFQ1REUkFXNCBUaGlzLCBEV09SRCBkd0ZsYWdzLAorCQkJICAgICAgIExQRElSRUNURFJBV0NMSVBQRVIgKnBwQ2xpcHBlciwKKwkJCSAgICAgICBJVW5rbm93biAqcFVua091dGVyKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfQ3JlYXRlQ2xpcHBlcihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSBJRGlyZWN0RHJhdzQsCisJCQkJCQkJIElEaXJlY3REcmF3NywKKwkJCQkJCQkgVGhpcyksCisJCQkJICAgICAgZHdGbGFncywgcHBDbGlwcGVyLCBwVW5rT3V0ZXIpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9DcmVhdGVQYWxldHRlKExQRElSRUNURFJBVyBUaGlzLCBEV09SRCBkd0ZsYWdzLAorCQkJICAgICAgTFBQQUxFVFRFRU5UUlkgcEVudHJpZXMsCisJCQkgICAgICBMUERJUkVDVERSQVdQQUxFVFRFICpwcFBhbGV0dGUsCisJCQkgICAgICBJVW5rbm93biAqcFVua091dGVyKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfQ3JlYXRlUGFsZXR0ZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSBJRGlyZWN0RHJhdywKKwkJCQkJCQkgSURpcmVjdERyYXc3LAorCQkJCQkJCSBUaGlzKSwKKwkJCQkgICAgICBkd0ZsYWdzLCBwRW50cmllcywgcHBQYWxldHRlLCBwVW5rT3V0ZXIpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlUGFsZXR0ZShMUERJUkVDVERSQVcyIFRoaXMsIERXT1JEIGR3RmxhZ3MsCisJCQkgICAgICAgTFBQQUxFVFRFRU5UUlkgcEVudHJpZXMsCisJCQkgICAgICAgTFBESVJFQ1REUkFXUEFMRVRURSAqcHBQYWxldHRlLAorCQkJICAgICAgIElVbmtub3duICpwVW5rT3V0ZXIpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19DcmVhdGVQYWxldHRlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJIElEaXJlY3REcmF3MiwKKwkJCQkJCQkgSURpcmVjdERyYXc3LAorCQkJCQkJCSBUaGlzKSwKKwkJCQkgICAgICBkd0ZsYWdzLCBwRW50cmllcywgcHBQYWxldHRlLCBwVW5rT3V0ZXIpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3NEltcGxfQ3JlYXRlUGFsZXR0ZShMUERJUkVDVERSQVc0IFRoaXMsIERXT1JEIGR3RmxhZ3MsCisJCQkgICAgICAgTFBQQUxFVFRFRU5UUlkgcEVudHJpZXMsCisJCQkgICAgICAgTFBESVJFQ1REUkFXUEFMRVRURSAqcHBQYWxldHRlLAorCQkJICAgICAgIElVbmtub3duICpwVW5rT3V0ZXIpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19DcmVhdGVQYWxldHRlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJIElEaXJlY3REcmF3NCwKKwkJCQkJCQkgSURpcmVjdERyYXc3LAorCQkJCQkJCSBUaGlzKSwKKwkJCQkgICAgICBkd0ZsYWdzLCBwRW50cmllcywgcHBQYWxldHRlLCBwVW5rT3V0ZXIpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9DcmVhdGVTdXJmYWNlKExQRElSRUNURFJBVyBUaGlzLCBMUEREU1VSRkFDRURFU0MgcFNEZXNjLAorCQkJICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSAqcHBTdXJmYWNlLAorCQkJICAgICAgSVVua25vd24gKnBVbmtPdXRlcikKK3sKKyAgICBMUERJUkVDVERSQVdTVVJGQUNFNyBwU3VyZmFjZTc7CisgICAgSFJFU1VMVCBocjsKKworICAgIGhyID0gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCSAgICAgICBJRGlyZWN0RHJhdywKKwkJCQkJCSAgICAgICBJRGlyZWN0RHJhdzcsCisJCQkJCQkgICAgICAgVGhpcyksCisJCQkJICAgIHBTRGVzYywgJnBTdXJmYWNlNywgcFVua091dGVyKTsKKworICAgICpwcFN1cmZhY2UgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwKKwkJCQkgICAgSURpcmVjdERyYXdTdXJmYWNlNywgSURpcmVjdERyYXdTdXJmYWNlMywKKwkJCQkgICAgcFN1cmZhY2U3KTsKKworICAgIHJldHVybiBocjsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVN1cmZhY2UoTFBESVJFQ1REUkFXMiBUaGlzLCBMUEREU1VSRkFDRURFU0MgcFNEZXNjLAorCQkJICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0UgKnBwU3VyZmFjZSwKKwkJCSAgICAgICBJVW5rbm93biAqcFVua091dGVyKQoreworICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IHBTdXJmYWNlNzsKKyAgICBIUkVTVUxUIGhyOworCisgICAgaHIgPSBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJICAgICAgIElEaXJlY3REcmF3LAorCQkJCQkJICAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCSAgICAgICBUaGlzKSwKKwkJCQkgICAgcFNEZXNjLCAmcFN1cmZhY2U3LCBwVW5rT3V0ZXIpOworCisgICAgKnBwU3VyZmFjZSA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLAorCQkJCSAgICBJRGlyZWN0RHJhd1N1cmZhY2U3LCBJRGlyZWN0RHJhd1N1cmZhY2UzLAorCQkJCSAgICBwU3VyZmFjZTcpOworCisgICAgcmV0dXJuIGhyOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3NEltcGxfQ3JlYXRlU3VyZmFjZShMUERJUkVDVERSQVc0IFRoaXMsIExQRERTVVJGQUNFREVTQzIgcFNEZXNjLAorCQkJICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U0ICpwcFN1cmZhY2UsCisJCQkgICAgICAgSVVua25vd24gKnBVbmtPdXRlcikKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0NyZWF0ZVN1cmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgSURpcmVjdERyYXc0LAorCQkJCQkJCSBJRGlyZWN0RHJhdzcsCisJCQkJCQkJIFRoaXMpLAorCQkJCSAgICAgIHBTRGVzYywKKwkJCQkgICAgICAoTFBESVJFQ1REUkFXU1VSRkFDRTcgKilwcFN1cmZhY2UsCisJCQkJICAgICAgcFVua091dGVyKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfRHVwbGljYXRlU3VyZmFjZShMUERJUkVDVERSQVcgVGhpcywgTFBESVJFQ1REUkFXU1VSRkFDRSBwU3JjLAorCQkJCSBMUERJUkVDVERSQVdTVVJGQUNFICpwcERzdCkKK3sKKyAgICBMUERJUkVDVERSQVdTVVJGQUNFNyBwRHN0NzsKKyAgICBIUkVTVUxUIGhyOworCisgICAgaHIgPSBJRGlyZWN0RHJhdzdfRHVwbGljYXRlU3VyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgSURpcmVjdERyYXcsCisJCQkJCQkJICBJRGlyZWN0RHJhdzcsIFRoaXMpLAorCQkJCSAgICAgICBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwKKwkJCQkJCQkgIElEaXJlY3REcmF3U3VyZmFjZTMsCisJCQkJCQkJICBJRGlyZWN0RHJhd1N1cmZhY2U3LAorCQkJCQkJCSAgcFNyYyksCisJCQkJICAgICAgICZwRHN0Nyk7CisKKyAgICAqcHBEc3QgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywKKwkJCQlJRGlyZWN0RHJhd1N1cmZhY2UzLCBwRHN0Nyk7CisKKyAgICByZXR1cm4gaHI7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9EdXBsaWNhdGVTdXJmYWNlKExQRElSRUNURFJBVzIgVGhpcywgTFBESVJFQ1REUkFXU1VSRkFDRSBwU3JjLAorCQkJCSAgTFBESVJFQ1REUkFXU1VSRkFDRSAqcHBEc3QpCit7CisgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcERzdDc7CisgICAgSFJFU1VMVCBocjsKKworICAgIGhyID0gSURpcmVjdERyYXc3X0R1cGxpY2F0ZVN1cmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgIElEaXJlY3REcmF3MiwKKwkJCQkJCQkgIElEaXJlY3REcmF3NywgVGhpcyksCisJCQkJICAgICAgIENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLAorCQkJCQkJCSAgSURpcmVjdERyYXdTdXJmYWNlMywKKwkJCQkJCQkgIElEaXJlY3REcmF3U3VyZmFjZTcsCisJCQkJCQkJICBwU3JjKSwKKwkJCQkgICAgICAgJnBEc3Q3KTsKKworICAgICpwcERzdCA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LAorCQkJCUlEaXJlY3REcmF3U3VyZmFjZTMsIHBEc3Q3KTsKKworICAgIHJldHVybiBocjsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzRJbXBsX0R1cGxpY2F0ZVN1cmZhY2UoTFBESVJFQ1REUkFXNCBUaGlzLAorCQkJCSAgTFBESVJFQ1REUkFXU1VSRkFDRTQgcFNyYywKKwkJCQkgIExQRElSRUNURFJBV1NVUkZBQ0U0ICpwcERzdCkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0R1cGxpY2F0ZVN1cmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgICAgSURpcmVjdERyYXc0LAorCQkJCQkJCSAgICBJRGlyZWN0RHJhdzcsCisJCQkJCQkJICAgIFRoaXMpLAorCQkJCQkgKExQRElSRUNURFJBV1NVUkZBQ0U3KXBTcmMsCisJCQkJCSAoTFBESVJFQ1REUkFXU1VSRkFDRTcgKilwcERzdCk7Cit9CisKK3N0cnVjdCBkaXNwbGF5bW9kZXNjYWxsYmFja19jb250ZXh0Cit7CisgICAgTFBEREVOVU1NT0RFU0NBTExCQUNLIGZ1bmM7CisgICAgTFBWT0lEIGNvbnRleHQ7Cit9OworCitzdGF0aWMgSFJFU1VMVCBDQUxMQkFDSworRW51bURpc3BsYXlNb2Rlc0NhbGxiYWNrVGh1bmsoTFBERFNVUkZBQ0VERVNDMiBwRERTRDIsIExQVk9JRCBjb250ZXh0KQoreworICAgIHN0cnVjdCBkaXNwbGF5bW9kZXNjYWxsYmFja19jb250ZXh0ICpjYmNvbnRleHQgPSBjb250ZXh0OworCisgICAgcmV0dXJuIGNiY29udGV4dC0+ZnVuYygoTFBERFNVUkZBQ0VERVNDKXBERFNEMiwgY2Jjb250ZXh0LT5jb250ZXh0KTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfRW51bURpc3BsYXlNb2RlcyhMUERJUkVDVERSQVcgVGhpcywgRFdPUkQgZHdGbGFncywKKwkJCQkgTFBERFNVUkZBQ0VERVNDIHBERFNELCBMUFZPSUQgY29udGV4dCwKKwkJCQkgTFBEREVOVU1NT0RFU0NBTExCQUNLIGNiKQoreworICAgIHN0cnVjdCBkaXNwbGF5bW9kZXNjYWxsYmFja19jb250ZXh0IGNiY29udGV4dCA9IHsgY2IsIGNvbnRleHQgfTsKKworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfRW51bURpc3BsYXlNb2RlcyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgICBJRGlyZWN0RHJhdywKKwkJCQkJCQkgICAgSURpcmVjdERyYXc3LAorCQkJCQkJCSAgICBUaGlzKSwKKwkJCQkJIGR3RmxhZ3MsIHBERFNELCAmY2Jjb250ZXh0LAorCQkJCQkgRW51bURpc3BsYXlNb2Rlc0NhbGxiYWNrVGh1bmspOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3MkltcGxfRW51bURpc3BsYXlNb2RlcyhMUERJUkVDVERSQVcyIFRoaXMsIERXT1JEIGR3RmxhZ3MsCisJCQkJICBMUEREU1VSRkFDRURFU0MgcEREU0QsIExQVk9JRCBjb250ZXh0LAorCQkJCSAgTFBEREVOVU1NT0RFU0NBTExCQUNLIGNiKQoreworICAgIHN0cnVjdCBkaXNwbGF5bW9kZXNjYWxsYmFja19jb250ZXh0IGNiY29udGV4dCA9IHsgY2IsIGNvbnRleHQgfTsKKworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfRW51bURpc3BsYXlNb2RlcyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgICBJRGlyZWN0RHJhdzIsCisJCQkJCQkJICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgVGhpcyksCisJCQkJCSBkd0ZsYWdzLCBwRERTRCwgJmNiY29udGV4dCwKKwkJCQkJIEVudW1EaXNwbGF5TW9kZXNDYWxsYmFja1RodW5rKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzRJbXBsX0VudW1EaXNwbGF5TW9kZXMoTFBESVJFQ1REUkFXNCBUaGlzLCBEV09SRCBkd0ZsYWdzLAorCQkJCSAgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwgTFBWT0lEIGNvbnRleHQsCisJCQkJICBMUERERU5VTU1PREVTQ0FMTEJBQ0syIGNiKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfRW51bURpc3BsYXlNb2RlcyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgICBJRGlyZWN0RHJhdzQsCisJCQkJCQkJICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgVGhpcyksCisJCQkJCSBkd0ZsYWdzLCBwRERTRCwgY29udGV4dCwgY2IpOworfQorCitzdHJ1Y3Qgc3VyZmFjZXNjYWxsYmFja19jb250ZXh0Cit7CisgICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLIGZ1bmM7CisgICAgTFBWT0lEIGNvbnRleHQ7Cit9OworCitzdGF0aWMgSFJFU1VMVCBDQUxMQkFDSworRW51bVN1cmZhY2VzQ2FsbGJhY2tUaHVuayhMUERJUkVDVERSQVdTVVJGQUNFNyBwU3VyZiwgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwKKwkJCSAgTFBWT0lEIGNvbnRleHQpCit7CisgICAgc3RydWN0IHN1cmZhY2VzY2FsbGJhY2tfY29udGV4dCAqY2Jjb250ZXh0ID0gY29udGV4dDsKKworICAgIHJldHVybiBjYmNvbnRleHQtPmZ1bmMoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsCisJCQkJCSAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcsCisJCQkJCSAgICAgIElEaXJlY3REcmF3U3VyZmFjZTMsIHBTdXJmKSwKKwkJCSAgIChMUEREU1VSRkFDRURFU0MpcEREU0QsIGNiY29udGV4dC0+Y29udGV4dCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX0VudW1TdXJmYWNlcyhMUERJUkVDVERSQVcgVGhpcywgRFdPUkQgZHdGbGFncywKKwkJCSAgICAgTFBERFNVUkZBQ0VERVNDIHBERFNELCBMUFZPSUQgY29udGV4dCwKKwkJCSAgICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLIGNiKQoreworICAgIHN0cnVjdCBzdXJmYWNlc2NhbGxiYWNrX2NvbnRleHQgY2Jjb250ZXh0ID0geyBjYiwgY29udGV4dCB9OworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfRW51bVN1cmZhY2VzKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJSURpcmVjdERyYXcsCisJCQkJCQkJSURpcmVjdERyYXc3LCBUaGlzKSwKKwkJCQkgICAgIGR3RmxhZ3MsIChMUEREU1VSRkFDRURFU0MyKXBERFNELAorCQkJCSAgICAgJmNiY29udGV4dCwgRW51bVN1cmZhY2VzQ2FsbGJhY2tUaHVuayk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9FbnVtU3VyZmFjZXMoTFBESVJFQ1REUkFXMiBUaGlzLCBEV09SRCBkd0ZsYWdzLAorCQkJICAgICAgTFBERFNVUkZBQ0VERVNDIHBERFNELCBMUFZPSUQgY29udGV4dCwKKwkJCSAgICAgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSyBjYikKK3sKKyAgICBzdHJ1Y3Qgc3VyZmFjZXNjYWxsYmFja19jb250ZXh0IGNiY29udGV4dCA9IHsgY2IsIGNvbnRleHQgfTsKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0VudW1TdXJmYWNlcyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCUlEaXJlY3REcmF3MiwKKwkJCQkJCQlJRGlyZWN0RHJhdzcsIFRoaXMpLAorCQkJCSAgICAgZHdGbGFncywgKExQRERTVVJGQUNFREVTQzIpcEREU0QsCisJCQkJICAgICAmY2Jjb250ZXh0LCBFbnVtU3VyZmFjZXNDYWxsYmFja1RodW5rKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzRJbXBsX0VudW1TdXJmYWNlcyhMUERJUkVDVERSQVc0IFRoaXMsIERXT1JEIGR3RmxhZ3MsCisJCQkgICAgICBMUEREU1VSRkFDRURFU0MyIHBERFNELCBMUFZPSUQgY29udGV4dCwKKwkJCSAgICAgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzIgY2IpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19FbnVtU3VyZmFjZXMoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQlJRGlyZWN0RHJhdzQsCisJCQkJCQkJSURpcmVjdERyYXc3LCBUaGlzKSwKKwkJCQkgICAgIGR3RmxhZ3MsIHBERFNELCBjb250ZXh0LAorCQkJCSAgICAgKExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzcpY2IpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9GbGlwVG9HRElTdXJmYWNlKExQRElSRUNURFJBVyBUaGlzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfRmxpcFRvR0RJU3VyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgICBJRGlyZWN0RHJhdywKKwkJCQkJCQkgICAgSURpcmVjdERyYXc3LAorCQkJCQkJCSAgICBUaGlzKSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9GbGlwVG9HRElTdXJmYWNlKExQRElSRUNURFJBVzIgVGhpcykKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0ZsaXBUb0dESVN1cmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgICAgSURpcmVjdERyYXcyLAorCQkJCQkJCSAgICBJRGlyZWN0RHJhdzcsCisJCQkJCQkJICAgIFRoaXMpKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzRJbXBsX0ZsaXBUb0dESVN1cmZhY2UoTFBESVJFQ1REUkFXNCBUaGlzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfRmxpcFRvR0RJU3VyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgICBJRGlyZWN0RHJhdzQsCisJCQkJCQkJICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgVGhpcykpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9HZXRDYXBzKExQRElSRUNURFJBVyBUaGlzLCBMUEREQ0FQUyBwRERDMSwgTFBERENBUFMgcEREQzIpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19HZXRDYXBzKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkgICBJRGlyZWN0RHJhdywgSURpcmVjdERyYXc3LAorCQkJCQkJICAgVGhpcyksIHBEREMxLCBwRERDMik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9HZXRDYXBzKExQRElSRUNURFJBVzIgVGhpcywgTFBERENBUFMgcEREQzEsIExQRERDQVBTIHBEREMyKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfR2V0Q2FwcyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJICAgSURpcmVjdERyYXcyLCBJRGlyZWN0RHJhdzcsCisJCQkJCQkgICBUaGlzKSwgcEREQzEsIHBEREMyKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzRJbXBsX0dldENhcHMoTFBESVJFQ1REUkFXNCBUaGlzLCBMUEREQ0FQUyBwRERDMSwgTFBERENBUFMgcEREQzIpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19HZXRDYXBzKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkgICBJRGlyZWN0RHJhdzQsIElEaXJlY3REcmF3NywKKwkJCQkJCSAgIFRoaXMpLCBwRERDMSwgcEREQzIpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3SW1wbF9HZXREaXNwbGF5TW9kZShMUERJUkVDVERSQVcgVGhpcywgTFBERFNVUkZBQ0VERVNDIHBERFNEKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfR2V0RGlzcGxheU1vZGUoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgIElEaXJlY3REcmF3LAorCQkJCQkJCSAgSURpcmVjdERyYXc3LCBUaGlzKSwKKwkJCQkgICAgICAgKExQRERTVVJGQUNFREVTQzIpcEREU0QpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3MkltcGxfR2V0RGlzcGxheU1vZGUoTFBESVJFQ1REUkFXMiBUaGlzLCBMUEREU1VSRkFDRURFU0MgcEREU0QpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19HZXREaXNwbGF5TW9kZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgSURpcmVjdERyYXcyLAorCQkJCQkJCSAgSURpcmVjdERyYXc3LCBUaGlzKSwKKwkJCQkgICAgICAgKExQRERTVVJGQUNFREVTQzIpcEREU0QpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3NEltcGxfR2V0RGlzcGxheU1vZGUoTFBESVJFQ1REUkFXNCBUaGlzLCBMUEREU1VSRkFDRURFU0MyIHBERFNEKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfR2V0RGlzcGxheU1vZGUoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgIElEaXJlY3REcmF3NCwKKwkJCQkJCQkgIElEaXJlY3REcmF3NywgVGhpcyksCisJCQkJICAgICAgIHBERFNEKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfR2V0Rm91ckNDQ29kZXMoTFBESVJFQ1REUkFXIFRoaXMsIExQRFdPUkQgbHBOdW1Db2RlcywKKwkJCSAgICAgICBMUERXT1JEIGxwQ29kZXMpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19HZXRGb3VyQ0NDb2RlcyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgSURpcmVjdERyYXcsCisJCQkJCQkJICBJRGlyZWN0RHJhdzcsCisJCQkJCQkJICBUaGlzKSwKKwkJCQkgICAgICAgbHBOdW1Db2RlcywgbHBDb2Rlcyk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9HZXRGb3VyQ0NDb2RlcyhMUERJUkVDVERSQVcyIFRoaXMsIExQRFdPUkQgbHBOdW1Db2RlcywKKwkJCQlMUERXT1JEIGxwQ29kZXMpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19HZXRGb3VyQ0NDb2RlcyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgSURpcmVjdERyYXcyLAorCQkJCQkJCSAgSURpcmVjdERyYXc3LAorCQkJCQkJCSAgVGhpcyksCisJCQkJICAgICAgIGxwTnVtQ29kZXMsIGxwQ29kZXMpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3NEltcGxfR2V0Rm91ckNDQ29kZXMoTFBESVJFQ1REUkFXNCBUaGlzLCBMUERXT1JEIGxwTnVtQ29kZXMsCisJCQkJTFBEV09SRCBscENvZGVzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfR2V0Rm91ckNDQ29kZXMoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgIElEaXJlY3REcmF3NCwKKwkJCQkJCQkgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgIFRoaXMpLAorCQkJCSAgICAgICBscE51bUNvZGVzLCBscENvZGVzKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfR2V0R0RJU3VyZmFjZShMUERJUkVDVERSQVcgVGhpcywgTFBESVJFQ1REUkFXU1VSRkFDRSAqcHBTdXJmKQoreworICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IHBTdXJmNzsKKyAgICBIUkVTVUxUIGhyOworCisgICAgaHIgPSBJRGlyZWN0RHJhdzdfR2V0R0RJU3VyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJICAgICAgIElEaXJlY3REcmF3LAorCQkJCQkJICAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCSAgICAgICBUaGlzKSwgJnBTdXJmNyk7CisKKyAgICAqcHBTdXJmID0gQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3REcmF3U3VyZmFjZTcsCisJCQkJIElEaXJlY3REcmF3U3VyZmFjZTMsIHBTdXJmNyk7CisKKyAgICByZXR1cm4gaHI7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9HZXRHRElTdXJmYWNlKExQRElSRUNURFJBVzIgVGhpcywgTFBESVJFQ1REUkFXU1VSRkFDRSAqcHBTdXJmKQoreworICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IHBTdXJmNzsKKyAgICBIUkVTVUxUIGhyOworCisgICAgaHIgPSBJRGlyZWN0RHJhdzdfR2V0R0RJU3VyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJICAgICAgIElEaXJlY3REcmF3MiwKKwkJCQkJCSAgICAgICBJRGlyZWN0RHJhdzcsCisJCQkJCQkgICAgICAgVGhpcyksICZwU3VyZjcpOworCisgICAgKnBwU3VyZiA9IENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LAorCQkJCSBJRGlyZWN0RHJhd1N1cmZhY2UzLCBwU3VyZjcpOworCisgICAgcmV0dXJuIGhyOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3NEltcGxfR2V0R0RJU3VyZmFjZShMUERJUkVDVERSQVc0IFRoaXMsCisJCQkgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgKnBwU3VyZikKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0dldEdESVN1cmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgSURpcmVjdERyYXc0LAorCQkJCQkJCSBJRGlyZWN0RHJhdzcsCisJCQkJCQkJIFRoaXMpLAorCQkJCSAgICAgIChMUERJUkVDVERSQVdTVVJGQUNFNyAqKXBwU3VyZik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX0dldE1vbml0b3JGcmVxdWVuY3koTFBESVJFQ1REUkFXIFRoaXMsIExQRFdPUkQgcGR3RnJlcSkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0dldE1vbml0b3JGcmVxdWVuY3koQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgICAgICAgSURpcmVjdERyYXcsCisJCQkJCQkJICAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgICAgVGhpcyksCisJCQkJCSAgICBwZHdGcmVxKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzJJbXBsX0dldE1vbml0b3JGcmVxdWVuY3koTFBESVJFQ1REUkFXMiBUaGlzLCBMUERXT1JEIHBkd0ZyZXEpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19HZXRNb25pdG9yRnJlcXVlbmN5KENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJICAgICAgIElEaXJlY3REcmF3MiwKKwkJCQkJCQkgICAgICAgSURpcmVjdERyYXc3LAorCQkJCQkJCSAgICAgICBUaGlzKSwKKwkJCQkJICAgIHBkd0ZyZXEpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3NEltcGxfR2V0TW9uaXRvckZyZXF1ZW5jeShMUERJUkVDVERSQVc0IFRoaXMsIExQRFdPUkQgcGR3RnJlcSkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0dldE1vbml0b3JGcmVxdWVuY3koQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgICAgICAgSURpcmVjdERyYXc0LAorCQkJCQkJCSAgICAgICBJRGlyZWN0RHJhdzcsCisJCQkJCQkJICAgICAgIFRoaXMpLAorCQkJCQkgICAgcGR3RnJlcSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX0dldFNjYW5MaW5lKExQRElSRUNURFJBVyBUaGlzLCBMUERXT1JEIHBkd0xpbmUpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19HZXRTY2FuTGluZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJICAgICAgIElEaXJlY3REcmF3LAorCQkJCQkJICAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCSAgICAgICBUaGlzKSwgcGR3TGluZSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9HZXRTY2FuTGluZShMUERJUkVDVERSQVcyIFRoaXMsIExQRFdPUkQgcGR3TGluZSkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0dldFNjYW5MaW5lKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkgICAgICAgSURpcmVjdERyYXcyLAorCQkJCQkJICAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCSAgICAgICBUaGlzKSwgcGR3TGluZSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXc0SW1wbF9HZXRTY2FuTGluZShMUERJUkVDVERSQVc0IFRoaXMsIExQRFdPUkQgcGR3TGluZSkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0dldFNjYW5MaW5lKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkgICAgICAgSURpcmVjdERyYXc0LAorCQkJCQkJICAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCSAgICAgICBUaGlzKSwgcGR3TGluZSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX0dldFZlcnRpY2FsQmxhbmtTdGF0dXMoTFBESVJFQ1REUkFXIFRoaXMsIExQQk9PTCBscGJJc0luVkIpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJCSAgSURpcmVjdERyYXcsCisJCQkJCQkJCSAgSURpcmVjdERyYXc3LAorCQkJCQkJCQkgIFRoaXMpLAorCQkJCQkgICAgICAgbHBiSXNJblZCKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzJJbXBsX0dldFZlcnRpY2FsQmxhbmtTdGF0dXMoTFBESVJFQ1REUkFXMiBUaGlzLCBMUEJPT0wgbHBiSXNJblZCKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfR2V0VmVydGljYWxCbGFua1N0YXR1cyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCQkgIElEaXJlY3REcmF3MiwKKwkJCQkJCQkJICBJRGlyZWN0RHJhdzcsCisJCQkJCQkJCSAgVGhpcyksCisJCQkJCSAgICAgICBscGJJc0luVkIpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3NEltcGxfR2V0VmVydGljYWxCbGFua1N0YXR1cyhMUERJUkVDVERSQVc0IFRoaXMsIExQQk9PTCBscGJJc0luVkIpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJCSAgSURpcmVjdERyYXc0LAorCQkJCQkJCQkgIElEaXJlY3REcmF3NywKKwkJCQkJCQkJICBUaGlzKSwKKwkJCQkJICAgICAgIGxwYklzSW5WQik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX0luaXRpYWxpemUoTFBESVJFQ1REUkFXIFRoaXMsIExQR1VJRCBwR1VJRCkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0luaXRpYWxpemUoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCSAgICAgIElEaXJlY3REcmF3LAorCQkJCQkJICAgICAgSURpcmVjdERyYXc3LCBUaGlzKSwKKwkJCQkgICBwR1VJRCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9Jbml0aWFsaXplKExQRElSRUNURFJBVzIgVGhpcywgTFBHVUlEIHBHVUlEKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfSW5pdGlhbGl6ZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJICAgICAgSURpcmVjdERyYXcyLAorCQkJCQkJICAgICAgSURpcmVjdERyYXc3LCBUaGlzKSwKKwkJCQkgICBwR1VJRCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXc0SW1wbF9Jbml0aWFsaXplKExQRElSRUNURFJBVzQgVGhpcywgTFBHVUlEIHBHVUlEKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfSW5pdGlhbGl6ZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJICAgICAgSURpcmVjdERyYXc0LAorCQkJCQkJICAgICAgSURpcmVjdERyYXc3LCBUaGlzKSwKKwkJCQkgICBwR1VJRCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVcgVGhpcykKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X1Jlc3RvcmVEaXNwbGF5TW9kZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgICAgIElEaXJlY3REcmF3LAorCQkJCQkJCSAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgICBUaGlzKSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9SZXN0b3JlRGlzcGxheU1vZGUoTFBESVJFQ1REUkFXMiBUaGlzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUmVzdG9yZURpc3BsYXlNb2RlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJICAgICAgSURpcmVjdERyYXcyLAorCQkJCQkJCSAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgICBUaGlzKSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXc0SW1wbF9SZXN0b3JlRGlzcGxheU1vZGUoTFBESVJFQ1REUkFXNCBUaGlzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUmVzdG9yZURpc3BsYXlNb2RlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJICAgICAgSURpcmVjdERyYXc0LAorCQkJCQkJCSAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgICBUaGlzKSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX1NldENvb3BlcmF0aXZlTGV2ZWwoTFBESVJFQ1REUkFXIFRoaXMsIEhXTkQgaFduZCwKKwkJCQkgICAgRFdPUkQgZHdGbGFncykKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X1NldENvb3BlcmF0aXZlTGV2ZWwoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgICAgICAgSURpcmVjdERyYXcsCisJCQkJCQkJICAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgICAgVGhpcyksCisJCQkJCSAgICBoV25kLCBkd0ZsYWdzKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzJJbXBsX1NldENvb3BlcmF0aXZlTGV2ZWwoTFBESVJFQ1REUkFXMiBUaGlzLCBIV05EIGhXbmQsCisJCQkJICAgICBEV09SRCBkd0ZsYWdzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfU2V0Q29vcGVyYXRpdmVMZXZlbChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgICAgICBJRGlyZWN0RHJhdzIsCisJCQkJCQkJICAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgICAgVGhpcyksCisJCQkJCSAgICBoV25kLCBkd0ZsYWdzKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzRJbXBsX1NldENvb3BlcmF0aXZlTGV2ZWwoTFBESVJFQ1REUkFXNCBUaGlzLCBIV05EIGhXbmQsCisJCQkJICAgICBEV09SRCBkd0ZsYWdzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfU2V0Q29vcGVyYXRpdmVMZXZlbChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgICAgICBJRGlyZWN0RHJhdzQsCisJCQkJCQkJICAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgICAgVGhpcyksCisJCQkJCSAgICBoV25kLCBkd0ZsYWdzKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd0ltcGxfU2V0RGlzcGxheU1vZGUoTFBESVJFQ1REUkFXIFRoaXMsIERXT1JEIGEsIERXT1JEIGIsIERXT1JEIGMpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19TZXREaXNwbGF5TW9kZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgSURpcmVjdERyYXcsCisJCQkJCQkJICBJRGlyZWN0RHJhdzcsCisJCQkJCQkJICBUaGlzKSwKKwkJCQkgICAgICAgYSwgYiwgYywgMCwgMCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9TZXREaXNwbGF5TW9kZShMUERJUkVDVERSQVcyIFRoaXMsIERXT1JEIGEsIERXT1JEIGIsIERXT1JEIGMsCisJCQkJRFdPUkQgZCwgRFdPUkQgZSkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X1NldERpc3BsYXlNb2RlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJICBJRGlyZWN0RHJhdzIsCisJCQkJCQkJICBJRGlyZWN0RHJhdzcsCisJCQkJCQkJICBUaGlzKSwKKwkJCQkgICAgICAgYSwgYiwgYywgZCwgZSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXc0SW1wbF9TZXREaXNwbGF5TW9kZShMUERJUkVDVERSQVc0IFRoaXMsIERXT1JEIGEsIERXT1JEIGIsIERXT1JEIGMsCisJCQkJRFdPUkQgZCwgRFdPUkQgZSkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X1NldERpc3BsYXlNb2RlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJICBJRGlyZWN0RHJhdzQsCisJCQkJCQkJICBJRGlyZWN0RHJhdzcsCisJCQkJCQkJICBUaGlzKSwKKwkJCQkgICAgICAgYSwgYiwgYywgZCwgZSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdJbXBsX1dhaXRGb3JWZXJ0aWNhbEJsYW5rKExQRElSRUNURFJBVyBUaGlzLCBEV09SRCBkd0ZsYWdzLAorCQkJCSAgICAgSEFORExFIGhFdmVudCkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJCUlEaXJlY3REcmF3LAorCQkJCQkJCQlJRGlyZWN0RHJhdzcsCisJCQkJCQkJCVRoaXMpLAorCQkJCQkgICAgIGR3RmxhZ3MsIGhFdmVudCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXcySW1wbF9XYWl0Rm9yVmVydGljYWxCbGFuayhMUERJUkVDVERSQVcyIFRoaXMsIERXT1JEIGR3RmxhZ3MsCisJCQkJICAgICAgSEFORExFIGhFdmVudCkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJCUlEaXJlY3REcmF3MiwKKwkJCQkJCQkJSURpcmVjdERyYXc3LAorCQkJCQkJCQlUaGlzKSwKKwkJCQkJICAgICBkd0ZsYWdzLCBoRXZlbnQpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3NEltcGxfV2FpdEZvclZlcnRpY2FsQmxhbmsoTFBESVJFQ1REUkFXNCBUaGlzLCBEV09SRCBkd0ZsYWdzLAorCQkJCSAgICAgIEhBTkRMRSBoRXZlbnQpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19XYWl0Rm9yVmVydGljYWxCbGFuayhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCQlJRGlyZWN0RHJhdzQsCisJCQkJCQkJCUlEaXJlY3REcmF3NywKKwkJCQkJCQkJVGhpcyksCisJCQkJCSAgICAgZHdGbGFncywgaEV2ZW50KTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzJJbXBsX0dldEF2YWlsYWJsZVZpZE1lbShMUERJUkVDVERSQVcyIFRoaXMsIExQRERTQ0FQUyBwQ2FwcywKKwkJCQkgICAgTFBEV09SRCBwZHdUb3RhbCwgTFBEV09SRCBwZHdGcmVlKQoreworICAgIEREU0NBUFMyIENhcHMyOworICAgIEREUkFXX0NvbnZlcnRfRERTQ0FQU18xX1RvXzIocENhcHMsICZDYXBzMik7CisKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X0dldEF2YWlsYWJsZVZpZE1lbShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgICAgIElEaXJlY3REcmF3MiwKKwkJCQkJCQkgICAgICBJRGlyZWN0RHJhdzcsCisJCQkJCQkJICAgICAgVGhpcyksCisJCQkJCSAgICZDYXBzMiwgcGR3VG90YWwsIHBkd0ZyZWUpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3NEltcGxfR2V0QXZhaWxhYmxlVmlkTWVtKExQRElSRUNURFJBVzQgVGhpcywgTFBERFNDQVBTMiBwQ2FwcywKKwkJCQkgICAgTFBEV09SRCBwZHdUb3RhbCwgTFBEV09SRCBwZHdGcmVlKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfR2V0QXZhaWxhYmxlVmlkTWVtKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJICAgICAgSURpcmVjdERyYXcyLAorCQkJCQkJCSAgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgICBUaGlzKSwKKwkJCQkJICAgcENhcHMsIHBkd1RvdGFsLCBwZHdGcmVlKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzRJbXBsX0dldFN1cmZhY2VGcm9tREMoTFBESVJFQ1REUkFXNCBUaGlzLCBIREMgaERDLAorCQkJCSAgTFBESVJFQ1REUkFXU1VSRkFDRTQgKnBTdXJmKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhdzdfR2V0U3VyZmFjZUZyb21EQyhDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdJbXBsLAorCQkJCQkJCSAgICBJRGlyZWN0RHJhdzQsCisJCQkJCQkJICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgVGhpcyksCisJCQkJCSBoREMsIChMUERJUkVDVERSQVdTVVJGQUNFNyAqKXBTdXJmKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzRJbXBsX1Jlc3RvcmVBbGxTdXJmYWNlcyhMUERJUkVDVERSQVc0IFRoaXMpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3N19SZXN0b3JlQWxsU3VyZmFjZXMoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgICAgICBJRGlyZWN0RHJhdzQsCisJCQkJCQkJICAgICAgSURpcmVjdERyYXc3LAorCQkJCQkJCSAgICAgIFRoaXMpKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhdzRJbXBsX1Rlc3RDb29wZXJhdGl2ZUxldmVsKExQRElSRUNURFJBVzQgVGhpcykKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXc3X1Rlc3RDb29wZXJhdGl2ZUxldmVsKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd0ltcGwsCisJCQkJCQkJCUlEaXJlY3REcmF3NCwKKwkJCQkJCQkJSURpcmVjdERyYXc3LAorCQkJCQkJCQlUaGlzKSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXc0SW1wbF9HZXREZXZpY2VJZGVudGlmaWVyKExQRElSRUNURFJBVzQgVGhpcywKKwkJCQkgICAgIExQRERERVZJQ0VJREVOVElGSUVSIHBERERJLCBEV09SRCBkd0ZsYWdzKQoreworICAgIEREREVWSUNFSURFTlRJRklFUjIgRERESTI7CisgICAgSFJFU1VMVCBocjsKKworICAgIGhyID0gSURpcmVjdERyYXc3X0dldERldmljZUlkZW50aWZpZXIoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3SW1wbCwKKwkJCQkJCQkgICAgIElEaXJlY3REcmF3NCwKKwkJCQkJCQkgICAgIElEaXJlY3REcmF3NywKKwkJCQkJCQkgICAgIFRoaXMpLAorCQkJCQkgICZERERJMiwgZHdGbGFncyk7CisKKyAgICBERFJBV19Db252ZXJ0X0REREVWSUNFSURFTlRJRklFUl8yX1RvXzEocEREREksICZERERJMik7CisKKyAgICByZXR1cm4gaHI7Cit9CisKK0lDT01fVlRBQkxFKElEaXJlY3REcmF3KSBERFJBV19JRGlyZWN0RHJhd19WVGFibGUgPQoreworICAgIElDT01fTVNWVEFCTEVfQ09NUEFUX0R1bW15UlRUSVZBTFVFCisgICAgSURpcmVjdERyYXdJbXBsX1F1ZXJ5SW50ZXJmYWNlLAorICAgIElEaXJlY3REcmF3SW1wbF9BZGRSZWYsCisgICAgSURpcmVjdERyYXdJbXBsX1JlbGVhc2UsCisgICAgSURpcmVjdERyYXdJbXBsX0NvbXBhY3QsCisgICAgSURpcmVjdERyYXdJbXBsX0NyZWF0ZUNsaXBwZXIsCisgICAgSURpcmVjdERyYXdJbXBsX0NyZWF0ZVBhbGV0dGUsCisgICAgSURpcmVjdERyYXdJbXBsX0NyZWF0ZVN1cmZhY2UsCisgICAgSURpcmVjdERyYXdJbXBsX0R1cGxpY2F0ZVN1cmZhY2UsCisgICAgSURpcmVjdERyYXdJbXBsX0VudW1EaXNwbGF5TW9kZXMsCisgICAgSURpcmVjdERyYXdJbXBsX0VudW1TdXJmYWNlcywKKyAgICBJRGlyZWN0RHJhd0ltcGxfRmxpcFRvR0RJU3VyZmFjZSwKKyAgICBJRGlyZWN0RHJhd0ltcGxfR2V0Q2FwcywKKyAgICBJRGlyZWN0RHJhd0ltcGxfR2V0RGlzcGxheU1vZGUsCisgICAgSURpcmVjdERyYXdJbXBsX0dldEZvdXJDQ0NvZGVzLAorICAgIElEaXJlY3REcmF3SW1wbF9HZXRHRElTdXJmYWNlLAorICAgIElEaXJlY3REcmF3SW1wbF9HZXRNb25pdG9yRnJlcXVlbmN5LAorICAgIElEaXJlY3REcmF3SW1wbF9HZXRTY2FuTGluZSwKKyAgICBJRGlyZWN0RHJhd0ltcGxfR2V0VmVydGljYWxCbGFua1N0YXR1cywKKyAgICBJRGlyZWN0RHJhd0ltcGxfSW5pdGlhbGl6ZSwKKyAgICBJRGlyZWN0RHJhd0ltcGxfUmVzdG9yZURpc3BsYXlNb2RlLAorICAgIElEaXJlY3REcmF3SW1wbF9TZXRDb29wZXJhdGl2ZUxldmVsLAorICAgIElEaXJlY3REcmF3SW1wbF9TZXREaXNwbGF5TW9kZSwKKyAgICBJRGlyZWN0RHJhd0ltcGxfV2FpdEZvclZlcnRpY2FsQmxhbmssCit9OworCitJQ09NX1ZUQUJMRShJRGlyZWN0RHJhdzIpIEREUkFXX0lEaXJlY3REcmF3Ml9WVGFibGUgPQoreworICAgIElDT01fTVNWVEFCTEVfQ09NUEFUX0R1bW15UlRUSVZBTFVFCisgICAgSURpcmVjdERyYXcySW1wbF9RdWVyeUludGVyZmFjZSwKKyAgICBJRGlyZWN0RHJhdzJJbXBsX0FkZFJlZiwKKyAgICBJRGlyZWN0RHJhdzJJbXBsX1JlbGVhc2UsCisgICAgSURpcmVjdERyYXcySW1wbF9Db21wYWN0LAorICAgIElEaXJlY3REcmF3MkltcGxfQ3JlYXRlQ2xpcHBlciwKKyAgICBJRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVBhbGV0dGUsCisgICAgSURpcmVjdERyYXcySW1wbF9DcmVhdGVTdXJmYWNlLAorICAgIElEaXJlY3REcmF3MkltcGxfRHVwbGljYXRlU3VyZmFjZSwKKyAgICBJRGlyZWN0RHJhdzJJbXBsX0VudW1EaXNwbGF5TW9kZXMsCisgICAgSURpcmVjdERyYXcySW1wbF9FbnVtU3VyZmFjZXMsCisgICAgSURpcmVjdERyYXcySW1wbF9GbGlwVG9HRElTdXJmYWNlLAorICAgIElEaXJlY3REcmF3MkltcGxfR2V0Q2FwcywKKyAgICBJRGlyZWN0RHJhdzJJbXBsX0dldERpc3BsYXlNb2RlLAorICAgIElEaXJlY3REcmF3MkltcGxfR2V0Rm91ckNDQ29kZXMsCisgICAgSURpcmVjdERyYXcySW1wbF9HZXRHRElTdXJmYWNlLAorICAgIElEaXJlY3REcmF3MkltcGxfR2V0TW9uaXRvckZyZXF1ZW5jeSwKKyAgICBJRGlyZWN0RHJhdzJJbXBsX0dldFNjYW5MaW5lLAorICAgIElEaXJlY3REcmF3MkltcGxfR2V0VmVydGljYWxCbGFua1N0YXR1cywKKyAgICBJRGlyZWN0RHJhdzJJbXBsX0luaXRpYWxpemUsCisgICAgSURpcmVjdERyYXcySW1wbF9SZXN0b3JlRGlzcGxheU1vZGUsCisgICAgSURpcmVjdERyYXcySW1wbF9TZXRDb29wZXJhdGl2ZUxldmVsLAorICAgIElEaXJlY3REcmF3MkltcGxfU2V0RGlzcGxheU1vZGUsCisgICAgSURpcmVjdERyYXcySW1wbF9XYWl0Rm9yVmVydGljYWxCbGFuaywKKyAgICBJRGlyZWN0RHJhdzJJbXBsX0dldEF2YWlsYWJsZVZpZE1lbQorfTsKKworSUNPTV9WVEFCTEUoSURpcmVjdERyYXc0KSBERFJBV19JRGlyZWN0RHJhdzRfVlRhYmxlID0KK3sKKyAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9EdW1teVJUVElWQUxVRQorICAgIElEaXJlY3REcmF3NEltcGxfUXVlcnlJbnRlcmZhY2UsCisgICAgSURpcmVjdERyYXc0SW1wbF9BZGRSZWYsCisgICAgSURpcmVjdERyYXc0SW1wbF9SZWxlYXNlLAorICAgIElEaXJlY3REcmF3NEltcGxfQ29tcGFjdCwKKyAgICBJRGlyZWN0RHJhdzRJbXBsX0NyZWF0ZUNsaXBwZXIsCisgICAgSURpcmVjdERyYXc0SW1wbF9DcmVhdGVQYWxldHRlLAorICAgIElEaXJlY3REcmF3NEltcGxfQ3JlYXRlU3VyZmFjZSwKKyAgICBJRGlyZWN0RHJhdzRJbXBsX0R1cGxpY2F0ZVN1cmZhY2UsCisgICAgSURpcmVjdERyYXc0SW1wbF9FbnVtRGlzcGxheU1vZGVzLAorICAgIElEaXJlY3REcmF3NEltcGxfRW51bVN1cmZhY2VzLAorICAgIElEaXJlY3REcmF3NEltcGxfRmxpcFRvR0RJU3VyZmFjZSwKKyAgICBJRGlyZWN0RHJhdzRJbXBsX0dldENhcHMsCisgICAgSURpcmVjdERyYXc0SW1wbF9HZXREaXNwbGF5TW9kZSwKKyAgICBJRGlyZWN0RHJhdzRJbXBsX0dldEZvdXJDQ0NvZGVzLAorICAgIElEaXJlY3REcmF3NEltcGxfR2V0R0RJU3VyZmFjZSwKKyAgICBJRGlyZWN0RHJhdzRJbXBsX0dldE1vbml0b3JGcmVxdWVuY3ksCisgICAgSURpcmVjdERyYXc0SW1wbF9HZXRTY2FuTGluZSwKKyAgICBJRGlyZWN0RHJhdzRJbXBsX0dldFZlcnRpY2FsQmxhbmtTdGF0dXMsCisgICAgSURpcmVjdERyYXc0SW1wbF9Jbml0aWFsaXplLAorICAgIElEaXJlY3REcmF3NEltcGxfUmVzdG9yZURpc3BsYXlNb2RlLAorICAgIElEaXJlY3REcmF3NEltcGxfU2V0Q29vcGVyYXRpdmVMZXZlbCwKKyAgICBJRGlyZWN0RHJhdzRJbXBsX1NldERpc3BsYXlNb2RlLAorICAgIElEaXJlY3REcmF3NEltcGxfV2FpdEZvclZlcnRpY2FsQmxhbmssCisgICAgSURpcmVjdERyYXc0SW1wbF9HZXRBdmFpbGFibGVWaWRNZW0sCisgICAgSURpcmVjdERyYXc0SW1wbF9HZXRTdXJmYWNlRnJvbURDLAorICAgIElEaXJlY3REcmF3NEltcGxfUmVzdG9yZUFsbFN1cmZhY2VzLAorICAgIElEaXJlY3REcmF3NEltcGxfVGVzdENvb3BlcmF0aXZlTGV2ZWwsCisgICAgSURpcmVjdERyYXc0SW1wbF9HZXREZXZpY2VJZGVudGlmaWVyCit9OwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kZHJhdy91c2VyLmMgYi9kbGxzL2RkcmF3L2RkcmF3L3VzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGM3OGZjCi0tLSAvZGV2L251bGwKKysrIGIvZGxscy9kZHJhdy9kZHJhdy91c2VyLmMKQEAgLTAsMCArMSw1NDAgQEAKKy8qCURpcmVjdERyYXcgZHJpdmVyIGZvciBVc2VyLWJhc2VkIHByaW1hcnkgc3VyZmFjZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCisjaW5jbHVkZSA8ZGRyYXcuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImRkcmF3L21haW4uaCIKKyNpbmNsdWRlICJkZHJhdy91c2VyLmgiCisjaW5jbHVkZSAiZGNsaXBwZXIvbWFpbi5oIgorI2luY2x1ZGUgImRwYWxldHRlL21haW4uaCIKKyNpbmNsdWRlICJkc3VyZmFjZS9tYWluLmgiCisjaW5jbHVkZSAiZHN1cmZhY2UvZGliLmgiCisjaW5jbHVkZSAiZHN1cmZhY2UvdXNlci5oIgorCitERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOworCitzdGF0aWMgSUNPTV9WVEFCTEUoSURpcmVjdERyYXc3KSBVc2VyX0RpcmVjdERyYXdfVlRhYmxlOworCitzdGF0aWMgY29uc3QgRERERVZJQ0VJREVOVElGSUVSMiB1c2VyX2RldmljZSA9IAoreworICAgICJVc2VyIERyaXZlciIsCisgICAgIldJTkUgRGlyZWN0RHJhdyBvbiBVc2VyIChhbmQgR0RJKSIsCisgICAgeyB7IDB4MDAwMTAwMDEsIDB4MDAwMTAwMDEgfSB9LAorICAgIDAsIDAsIDAsIDAsCisgICAgLyogZmUzODQ0MGMtODk2OS00MjgzLWJjNzMtNzQ5ZTdiYzNjMmViICovCisgICAgezB4ZmUzODQ0MGMsMHg4OTY5LDB4NDI4ZSwgezB4NzMsMHhiYywweDc0LDB4OWUsMHg3YiwweGMzLDB4YzIsMHhlYn19LAorICAgIDAKK307CisKK3N0YXRpYyBjb25zdCBERFBJWEVMRk9STUFUIHBpeGVsZm9ybWF0c1tdID0gCit7CisgICAgLyogOGJwcCBwYWxldHRlZCAqLworICAgIHsgc2l6ZW9mKEREUElYRUxGT1JNQVQpLCBERFBGX1JHQnxERFBGX1BBTEVUVEVJTkRFWEVEOCwgMCwgeyA4IH0gfSwKKyAgICAvKiAxNWJwcCA1LzUvNSAqLworICAgIHsgc2l6ZW9mKEREUElYRUxGT1JNQVQpLCBERFBGX1JHQiwgMCwgeyAxNiB9LCB7IDB4N0MwMCB9LCB7IDB4M0UwIH0sCisgICAgICB7IDB4MUYgfSB9LAorICAgIC8qIDE2YnBwIDUvNi81ICovCisgICAgeyBzaXplb2YoRERQSVhFTEZPUk1BVCksIEREUEZfUkdCLCAwLCB7IDE2IH0sIHsgMHhGODAwIH0sIHsgMHg3RTAgfSwKKyAgICAgIHsgMHgxRiB9IH0sCisgICAgLyogMjRicHAgOC84LzggKi8KKyAgICB7IHNpemVvZihERFBJWEVMRk9STUFUKSwgRERQRl9SR0IsIDAsIHsgMjQgfSwgeyAweEZGMDAwMCB9LAorICAgICAgeyAweDAwRkYwMCB9LCB7IDB4MDAwMEZGIH0gfSwKKyAgICAvKiAzMmJwcCA4LzgvOCAqLworICAgIHsgc2l6ZW9mKEREUElYRUxGT1JNQVQpLCBERFBGX1JHQiwgMCwgeyAzMiB9LCB7IDB4RkYwMDAwIH0sCisgICAgICB7IDB4MDBGRjAwIH0sIHsgMHgwMDAwRkYgfSB9Cit9OworCitIUkVTVUxUIFVzZXJfRGlyZWN0RHJhd19DcmVhdGUoY29uc3QgR1VJRCogcEdVSUQsIExQRElSRUNURFJBVzcqIHBJZmFjZSwKKwkJCQkgICAgIElVbmtub3duKiBwVW5rT3V0ZXIsIEJPT0wgZXgpOworSFJFU1VMVCBVc2VyX0RpcmVjdERyYXdfSW5pdGlhbGl6ZShJRGlyZWN0RHJhd0ltcGwqLCBjb25zdCBHVUlEKik7CisKK3N0YXRpYyBjb25zdCBkZHJhd19kcml2ZXIgdXNlcl9kcml2ZXIgPQoreworICAgICZ1c2VyX2RldmljZSwKKyAgICAxMCwKKyAgICBVc2VyX0RpcmVjdERyYXdfQ3JlYXRlLAorICAgIFVzZXJfRGlyZWN0RHJhd19Jbml0aWFsaXplCit9OworCitCT09MIEREUkFXX1VzZXJfSW5pdChISU5TVEFOQ0UgaEluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwdikKK3sKKyAgICBpZiAoZmR3UmVhc29uID09IERMTF9QUk9DRVNTX0FUVEFDSCkKKwlERFJBV19yZWdpc3Rlcl9kcml2ZXIoJnVzZXJfZHJpdmVyKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKiBJZiB5b3UgY2hhbmdlIHRoaXMgZnVuY3Rpb24sIHlvdSBwcm9iYWJseSB3YW50IHRvIGNoYW5nZSB0aGUgZW51bWVyYXRpb24KKyAqIGNvZGUgaW4gRW51bURpc3BsYXlNb2Rlcy4gKi8KK3N0YXRpYyBCT09MCitJc1ZhbGlkRGlzcGxheU1vZGUoRFdPUkQgZHdXaWR0aCwgRFdPUkQgZHdIZWlnaHQsIERXT1JEIGR3QlBQLAorCQkgICBEV09SRCBkd1JlZnJlc2hSYXRlLCBEV09SRCBkd0ZsYWdzKQoreworICAgIGlmIChkd1dpZHRoID4gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTikKKwl8fCBkd0hlaWdodCA+IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pKQorCXJldHVybiBGQUxTRTsKKworICAgIHN3aXRjaCAoZHdCUFApCisgICAgeworICAgIGNhc2UgODoKKyAgICBjYXNlIDE1OgorICAgIGNhc2UgMTY6CisgICAgY2FzZSAyNDoKKyAgICBjYXNlIDMyOgorCWJyZWFrOworCisgICAgZGVmYXVsdDoKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBjb25zdCBERFBJWEVMRk9STUFUKiBwaXhlbGZvcm1hdF9mb3JfZGVwdGgoRFdPUkQgZGVwdGgpCit7CisgICAgc3dpdGNoIChkZXB0aCkKKyAgICB7CisgICAgY2FzZSAgODogcmV0dXJuIHBpeGVsZm9ybWF0cyArIDA7CisgICAgY2FzZSAxNTogcmV0dXJuIHBpeGVsZm9ybWF0cyArIDE7CisgICAgY2FzZSAxNjogcmV0dXJuIHBpeGVsZm9ybWF0cyArIDI7CisgICAgY2FzZSAyNDogcmV0dXJuIHBpeGVsZm9ybWF0cyArIDM7CisgICAgY2FzZSAzMjogcmV0dXJuIHBpeGVsZm9ybWF0cyArIDQ7CisgICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CisgICAgfQorfQorCisvKiBOb3QgY2FsbGVkIGZyb20gdGhlIHZ0YWJsZS4gKi8KK0hSRVNVTFQgVXNlcl9EaXJlY3REcmF3X0NvbnN0cnVjdChJRGlyZWN0RHJhd0ltcGwgKlRoaXMsIEJPT0wgZXgpCit7CisgICAgSFJFU1VMVCBocjsKKyAgICBEV09SRCBkZXB0aDsKKyAgICBIREMgaERDOworCisgICAgVFJBQ0UoIiglcCwlZClcbiIsVGhpcyxleCk7CisKKyAgICBociA9IE1haW5fRGlyZWN0RHJhd19Db25zdHJ1Y3QoVGhpcywgZXgpOworICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7CisKKyAgICBUaGlzLT5maW5hbF9yZWxlYXNlID0gVXNlcl9EaXJlY3REcmF3X2ZpbmFsX3JlbGVhc2U7CisKKyAgICBUaGlzLT5jcmVhdGVfcHJpbWFyeSAgICA9IFVzZXJfRGlyZWN0RHJhd19jcmVhdGVfcHJpbWFyeTsKKyAgICBUaGlzLT5jcmVhdGVfYmFja2J1ZmZlciA9IFVzZXJfRGlyZWN0RHJhd19jcmVhdGVfYmFja2J1ZmZlcjsKKworICAgIGhEQyA9IENyZWF0ZURDQSgiRElTUExBWSIsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGRlcHRoID0gR2V0RGV2aWNlQ2FwcyhoREMsIEJJVFNQSVhFTCkgKiBHZXREZXZpY2VDYXBzKGhEQywgUExBTkVTKTsKKyAgICBEZWxldGVEQyhoREMpOworCisgICAgVGhpcy0+d2lkdGggICAgICAgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKKyAgICBUaGlzLT5oZWlnaHQgICAgICA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTQ1JFRU4pOworICAgIFRoaXMtPnBpdGNoICAgICAgID0gRERSQVdfd2lkdGhfYnBwX3RvX3BpdGNoKFRoaXMtPndpZHRoLCBkZXB0aCk7CisgICAgVGhpcy0+cGl4ZWxmb3JtYXQgPSAqcGl4ZWxmb3JtYXRfZm9yX2RlcHRoKGRlcHRoKTsKKworICAgIFRoaXMtPm9yaWdfd2lkdGggICAgICAgPSBUaGlzLT53aWR0aDsKKyAgICBUaGlzLT5vcmlnX2hlaWdodCAgICAgID0gVGhpcy0+aGVpZ2h0OworICAgIFRoaXMtPm9yaWdfcGl0Y2ggICAgICAgPSBUaGlzLT5waXRjaDsKKyAgICBUaGlzLT5vcmlnX3BpeGVsZm9ybWF0ID0gVGhpcy0+cGl4ZWxmb3JtYXQ7CisKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NywgVXNlcl9EaXJlY3REcmF3X1ZUYWJsZSk7CisKKyAgICByZXR1cm4gU19PSzsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBEaXJlY3REcmF3Q3JlYXRlKEV4KSBvbiB0aGUgbW9zdC1kZXJpdmVkCisgKiBjbGFzcyB0byBzdGFydCBjb25zdHJ1Y3Rpb24uCisgKiBOb3QgY2FsbGVkIGZyb20gdGhlIHZ0YWJsZS4gKi8KK0hSRVNVTFQgVXNlcl9EaXJlY3REcmF3X0NyZWF0ZShjb25zdCBHVUlEKiBwR1VJRCwgTFBESVJFQ1REUkFXNyogcElmYWNlLAorCQkJICAgICAgIElVbmtub3duKiBwVW5rT3V0ZXIsIEJPT0wgZXgpCit7CisgICAgSFJFU1VMVCBocjsKKyAgICBJRGlyZWN0RHJhd0ltcGwqIFRoaXM7CisKKyAgICBhc3NlcnQocFVua091dGVyID09IE5VTEwpOworCisgICAgVGhpcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkgICAgIHNpemVvZihJRGlyZWN0RHJhd0ltcGwpICsgc2l6ZW9mKFVzZXJfRGlyZWN0RHJhd0ltcGwpKTsKKyAgICBpZiAoVGhpcyA9PSBOVUxMKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKworICAgIC8qIE5vdGUgdGhhdCB0aGlzIHJlbGF0aW9uIGRvZXMgKm5vdCogaG9sZCB0cnVlIGlmIHRoZSBERCBvYmplY3Qgd2FzCisgICAgICogQ29DcmVhdGVJbnN0YW5jZWQgdGhlbiBJbml0aWFsaXplZC4gKi8KKyAgICBUaGlzLT5wcml2YXRlID0gKFVzZXJfRGlyZWN0RHJhd0ltcGwgKikoVGhpcysxKTsKKworICAgIGhyID0gVXNlcl9EaXJlY3REcmF3X0NvbnN0cnVjdChUaGlzLCBleCk7CisgICAgaWYgKEZBSUxFRChocikpCisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7CisgICAgZWxzZQorCSpwSWZhY2UgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpOworCisgICAgcmV0dXJuIGhyOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIFVuaW5pdF9EaXJlY3REcmF3X0luaXRpYWxpemUgb24gdGhlCisgKiBtb3N0LWRlcml2ZWQtY2xhc3MgdG8gc3RhcnQgaW5pdGlhbGl6YXRpb24uCisgKiBOb3QgY2FsbGVkIGZyb20gdGhlIHZ0YWJsZS4gKi8KK0hSRVNVTFQgVXNlcl9EaXJlY3REcmF3X0luaXRpYWxpemUoSURpcmVjdERyYXdJbXBsICpUaGlzLCBjb25zdCBHVUlEKiBndWlkKQoreworICAgIEhSRVNVTFQgaHI7CisgICAgVGhpcy0+cHJpdmF0ZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkJICAgICAgc2l6ZW9mKFVzZXJfRGlyZWN0RHJhd0ltcGwpKTsKKyAgICBpZiAoVGhpcy0+cHJpdmF0ZSA9PSBOVUxMKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKworICAgIGhyID0gVXNlcl9EaXJlY3REcmF3X0NvbnN0cnVjdChUaGlzLCBUUlVFKTsgLyogWFhYIGV4PyAqLworICAgIGlmIChGQUlMRUQoaHIpKQorICAgIHsKKwlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5wcml2YXRlKTsKKwlyZXR1cm4gaHI7CisgICAgfQorCisgICAgcmV0dXJuIEREX09LOworfQorCisvKiBDYWxsZWQgZnJvbSBhbiBpbnRlcm5hbCBmdW5jdGlvbiBwb2ludGVyLiAqLwordm9pZCBVc2VyX0RpcmVjdERyYXdfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd0ltcGwgKlRoaXMpCit7CisgICAgTWFpbl9EaXJlY3REcmF3X2ZpbmFsX3JlbGVhc2UoVGhpcyk7Cit9CisKKy8qIENvbXBhY3Q6IGdlbmVyaWMgKi8KKy8qIENyZWF0ZUNsaXBwZXI6IGdlbmVyaWMgKi8KKy8qIENyZWF0ZVBhbGV0dGU6IGdlbmVyaWMgKHdpdGggY2FsbGJhY2spICovCisvKiBDcmVhdGVTdXJmYWNlOiBnZW5lcmljICh3aXRoIGNhbGxiYWNrcykgKi8KKworSFJFU1VMVAorVXNlcl9EaXJlY3REcmF3X2NyZWF0ZV9wcmltYXJ5KElEaXJlY3REcmF3SW1wbCogVGhpcywKKwkJCSAgICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QsCisJCQkgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwKKwkJCSAgICAgICBJVW5rbm93biogcFVua091dGVyKQoreworICAgIHJldHVybiBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLCBwRERTRCwgcHBTdXJmLCBwVW5rT3V0ZXIpOworfQorCitIUkVTVUxUCitVc2VyX0RpcmVjdERyYXdfY3JlYXRlX2JhY2tidWZmZXIoSURpcmVjdERyYXdJbXBsKiBUaGlzLAorCQkJCSAgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAorCQkJCSAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwKKwkJCQkgIElVbmtub3duKiBwVW5rT3V0ZXIsCisJCQkJICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBwcmltYXJ5KQoreworICAgIHJldHVybiBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLCBwRERTRCwgcHBTdXJmLCBwVW5rT3V0ZXIpOworfQorCisvKiBEdXBsaWNhdGVTdXJmYWNlOiBnZW5lcmljICovCisKKy8qIERlcml2ZWQgZnJvbSBYbGliX0lEaXJlY3REcmF3MkltcGxfRW51bURpc3BsYXlNb2Rlcy4KKyAqIFZlcnkgZmFrZToganVzdCBlbnVtZXJhdGUgc29tZSBhcmJpdHJhcnkgbW9kZXMuCisgKgorICogVGhlIHNjcmVlbiBzaXplcyBhcmUgcGxhdXNpYmxlLWxvb2tpbmcgc2NyZWVuIHNpemVzIGFuZCB3aWxsIGJlIGxpbWl0ZWQKKyAqIGJ5ICh2aXJ0dWFsKSBzY3JlZW4gc2l6ZS4KKyAqCisgKiBUaGUgZGVwdGhzIGFyZSB3aGF0ZXZlciBESUJzZWN0aW9ucyBzdXBwb3J0IG9uIHRoZSBjbGllbnQgc2lkZS4KKyAqIFNob3VsZCB0aGV5IGJlIGxpbWl0ZWQgYnkgc2NyZWVuIGRlcHRoPworICovCitIUkVTVUxUIFdJTkFQSQorVXNlcl9EaXJlY3REcmF3X0VudW1EaXNwbGF5TW9kZXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKKwkJCQkgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwgTFBWT0lEIGNvbnRleHQsCisJCQkJIExQRERFTlVNTU9ERVNDQUxMQkFDSzIgY2FsbGJhY2spCit7CisgICAgc3RydWN0IG1vZGUKKyAgICB7CisJaW50IHdpZHRoOworCWludCBoZWlnaHQ7CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbW9kZSBtb2Rlc1tdID0KKyAgICB7CisJeyA1MTIsIDM4NCB9LCB7IDY0MCwgNDAwIH0sIHsgNjQwLCA0ODAgfSwgeyA4MDAsIDYwMCB9LCB7IDEwMjQsIDc2OCB9LAorCXsgMTE1MiwgODY0IH0sIHsgMTI4MCwgMTAyNCB9LCB7IDE2MDAsIDEyMDAgfQorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgaW50IG51bV9tb2RlcyA9IHNpemVvZihtb2Rlcykvc2l6ZW9mKG1vZGVzWzBdKTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQgbnVtX3BpeGVsZm9ybWF0cworCT0gc2l6ZW9mKHBpeGVsZm9ybWF0cykvc2l6ZW9mKHBpeGVsZm9ybWF0c1swXSk7CisKKyAgICBERFNVUkZBQ0VERVNDMiBjYWxsYmFja19zZDsKKworICAgIGludCBtYXhfd2lkdGgsIG1heF9oZWlnaHQ7CisgICAgaW50IGksIGo7CisKKyAgICBUUkFDRSgiKCVwKS0+KDB4JTA4bHgsJXAsJXAsJXApXG4iLGlmYWNlLGR3RmxhZ3MscEREU0QsY29udGV4dCxjYWxsYmFjayk7CisKKyAgICAvKiBVbmZvcnR1bmF0ZWx5IHRoaXMgaXMgdGhlIHZpcnR1YWwgc2NyZWVuIHNpemUsIG5vdCBwaHlzaWNhbC4gKi8KKyAgICBtYXhfd2lkdGggPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKKyAgICBtYXhfaGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7CisKKyAgICBaZXJvTWVtb3J5KCZjYWxsYmFja19zZCwgc2l6ZW9mKGNhbGxiYWNrX3NkKSk7CisgICAgY2FsbGJhY2tfc2QuZHdTaXplID0gc2l6ZW9mKGNhbGxiYWNrX3NkKTsKKworICAgIGNhbGxiYWNrX3NkLmR3RmxhZ3MgPSBERFNEX0hFSUdIVHxERFNEX1dJRFRIfEREU0RfUElYRUxGT1JNQVR8RERTRF9DQVBTCisJfCBERFNEX1BJVENIOworCisgICAgaWYgKGR3RmxhZ3MgJiBEREVETV9SRUZSRVNIUkFURVMpCisJY2FsbGJhY2tfc2QuZHdGbGFncyB8PSBERFNEX1JFRlJFU0hSQVRFOworCisgICAgY2FsbGJhY2tfc2QudTIuZHdSZWZyZXNoUmF0ZSA9IDYwLjA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX21vZGVzOyBpKyspCisgICAgeworCWlmIChtb2Rlc1tpXS53aWR0aCA+IG1heF93aWR0aCB8fCBtb2Rlc1tpXS5oZWlnaHQgPiBtYXhfaGVpZ2h0KQorCSAgICBjb250aW51ZTsKKworCWNhbGxiYWNrX3NkLmR3SGVpZ2h0ID0gbW9kZXNbaV0uaGVpZ2h0OworCWNhbGxiYWNrX3NkLmR3V2lkdGggPSBtb2Rlc1tpXS53aWR0aDsKKworCVRSQUNFKCItIG1vZGU6ICVsZHglbGRcbiIsIGNhbGxiYWNrX3NkLmR3V2lkdGgsIGNhbGxiYWNrX3NkLmR3SGVpZ2h0KTsKKwlmb3IgKGogPSAwOyBqIDwgbnVtX3BpeGVsZm9ybWF0czsgaisrKQorCXsKKwkgICAgY2FsbGJhY2tfc2QudTEubFBpdGNoCisJCT0gRERSQVdfd2lkdGhfYnBwX3RvX3BpdGNoKG1vZGVzW2ldLndpZHRoLAorCQkJCQkgICBwaXhlbGZvcm1hdHNbal0udTEuZHdSR0JCaXRDb3VudCk7CisKKwkgICAgY2FsbGJhY2tfc2QudTQuZGRwZlBpeGVsRm9ybWF0ID0gcGl4ZWxmb3JtYXRzW2pdOworCisJICAgIGNhbGxiYWNrX3NkLmRkc0NhcHMuZHdDYXBzID0gMDsKKwkgICAgaWYgKHBpeGVsZm9ybWF0c1tqXS5kd0ZsYWdzICYgRERQRl9QQUxFVFRFSU5ERVhFRDgpIC8qIGljayAqLworCQljYWxsYmFja19zZC5kZHNDYXBzLmR3Q2FwcyB8PSBERFNDQVBTX1BBTEVUVEU7CisKKwkgICAgYXNzZXJ0KElzVmFsaWREaXNwbGF5TW9kZShjYWxsYmFja19zZC5kd1dpZHRoLAorCQkJCSAgICAgIGNhbGxiYWNrX3NkLmR3SGVpZ2h0LAorCQkJCSAgICAgIGNhbGxiYWNrX3NkLnU0LmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50LAorCQkJCSAgICAgIDAsIDApKTsKKworCSAgICBUUkFDRSgiIC0gJTJsZCBicHAsIFI9JTA4bHggRz0lMDhseCBCPSUwOGx4XG4iLAorCQkgIGNhbGxiYWNrX3NkLnU0LmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50LAorCQkgIGNhbGxiYWNrX3NkLnU0LmRkcGZQaXhlbEZvcm1hdC51Mi5kd1JCaXRNYXNrLAorCQkgIGNhbGxiYWNrX3NkLnU0LmRkcGZQaXhlbEZvcm1hdC51My5kd0dCaXRNYXNrLAorCQkgIGNhbGxiYWNrX3NkLnU0LmRkcGZQaXhlbEZvcm1hdC51NC5kd0JCaXRNYXNrKTsKKwkgICAgaWYgKGNhbGxiYWNrKCZjYWxsYmFja19zZCwgY29udGV4dCkgPT0gRERFTlVNUkVUX0NBTkNFTCkKKwkJcmV0dXJuIEREX09LOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qIEVudW1TdXJmYWNlczogZ2VuZXJpYyAqLworLyogRmxpcFRvR0RJU3VyZmFjZTogPz8/ICovCisKK0hSRVNVTFQgV0lOQVBJCitVc2VyX0RpcmVjdERyYXdfR2V0Q2FwcyhMUERJUkVDVERSQVc3IGlmYWNlLCBMUEREQ0FQUyBwRHJpdmVyQ2FwcywKKwkJCUxQRERDQVBTIHBIRUxDYXBzKQoreworLyogQmFzZWQgb24gbXkgZ3Vlc3NlcyBmb3Igd2hhdCBpcyBhcHByb3ByaWF0ZSB3aXRoIHNvbWUgY2x1ZXMgZnJvbSB0aGUKKyAqIE5WaWRpYSBkcml2ZXIuIE5vdCBldmVyeXRoaW5nIGlzIGFjdHVhbGx5IGltcGxlbWVudGVkIHlldC4KKyAqIE5WIGhhcyBidXQgd2UgZG9uJ3Q6IE92ZXJsYXlzLCBWaWRlbyBQb3J0cywgRERDQVBTX1JFQURTQ0FOTElORSwKKyAqIEREQ0FQUzJfQ0VSVElGSUVEIChoZWgpLCBERFNDQVBTMl9OT05MT0NBTFZJRE1FTSwgRERTQ0FQUzJfQ09QWUZPVVJDQy4KKyAqIEl0IGFjdHVhbGx5IGhhcyBubyBGWCBhbHBoYSBjYXBzLgorICogT2RkbHksIGl0IGRvZXNuJ3QgbGlzdCBERFBDQVBTX1BSSU1BUllTVVJGQUNFLgorICogQW5kIHRoZSBIRUwgY2FwcyBtYWtlIGxpdHRsZSBzZW5zZS4KKyAqLworI2RlZmluZSBCTElUX0NBUFMgKEREQ0FQU19CTFQgfCBERENBUFNfQkxUQ09MT1JGSUxMIHwgRERDQVBTX0JMVERFUFRIRklMTCBcCisJICB8IEREQ0FQU19CTFRTVFJFVENIIHwgRERDQVBTX0NBTkJMVFNZU01FTSB8IEREQ0FQU19DQU5DTElQCSAgXAorCSAgfCBERENBUFNfQ0FOQ0xJUFNUUkVUQ0hFRCB8IEREQ0FQU19DT0xPUktFWQkJCSAgXAorCSAgfCBERENBUFNfQ09MT1JLRVlIV0FTU0lTVCkKKworI2RlZmluZSBDS0VZX0NBUFMgKEREQ0tFWUNBUFNfREVTVEJMVCB8IEREQ0tFWUNBUFNfU1JDQkxUKQorCisjZGVmaW5lIEZYX0NBUFMgKERERlhDQVBTX0JMVEFMUEhBIHwgRERGWENBUFNfQkxUTUlSUk9STEVGVFJJR0hUCVwKKwkJfCBEREZYQ0FQU19CTFRNSVJST1JVUERPV04gfCBEREZYQ0FQU19CTFRST1RBVElPTjkwCVwKKwkJfCBEREZYQ0FQU19CTFRTSFJJTktYIHwgRERGWENBUFNfQkxUU0hSSU5LWE4JCVwKKwkJfCBEREZYQ0FQU19CTFRTSFJJTktZIHwgRERGWENBUFNfQkxUU0hSSU5LWE4JCVwKKwkJfCBEREZYQ0FQU19CTFRTVFJFVENIWCB8IERERlhDQVBTX0JMVFNUUkVUQ0hYTgkJXAorCQl8IERERlhDQVBTX0JMVFNUUkVUQ0hZIHwgRERGWENBUFNfQkxUU1RSRVRDSFlOKQorCisjaWYgMAorI2RlZmluZSBST1BTIHsgU1JDQ09QWSwgU1JDUEFJTlQsIFNSQ0FORCwgU1JDSU5WRVJULCBTUkNFUkFTRSwgTk9UU1JDQ09QWSwgXAorCU5PVFNSQ0VSQVNFLCBNRVJHRVBBSU5ULCBCTEFDS05FU1MsIFdISVRFTkVTUywgfQorI2Vsc2UKKyNkZWZpbmUgUk9QUyB7IDAsIH0KKyNlbmRpZgorCisgICAgc3RhdGljIGNvbnN0IEREQ0FQUyBjYXBzID0gCisgICAgeyBzaXplb2YoRERDQVBTKSwKKyAgICAgIEREQ0FQU18zRCB8IEREQ0FQU19HREkgfCBERENBUFNfUEFMRVRURSB8IEJMSVRfQ0FQUywKKyAgICAgIEREQ0FQUzJfQ0FOTUFOQUdFVEVYVFVSRSB8IEREQ0FQUzJfQ0FOUkVOREVSV0lORE9XRUQgfCBERENBUFMyX0NFUlRJRklFRAorICAgICAgfCBERENBUFMyX05PUEFHRUxPQ0tSRVFVSVJFRCB8IEREQ0FQUzJfUFJJTUFSWUdBTU1BCisgICAgICB8IEREQ0FQUzJfV0lERVNVUkZBQ0VTLAorICAgICAgQ0tFWV9DQVBTLAorICAgICAgRlhfQ0FQUywKKyAgICAgIDAsIC8qIGR3RlhBbHBoYUNhcHMgKi8KKyAgICAgIEREUENBUFNfOEJJVCB8IEREUENBUFNfUFJJTUFSWVNVUkZBQ0UsCisgICAgICAwLCAvKiBkd1NWQ2FwcyAqLworICAgICAgMCwgLyogPyBkd0FscGhhQml0Q29uc3RCaXREZXB0aHMgKi8KKyAgICAgIDAsIC8qID8gZHdBbHBoYUJpdFBpeGVsUGl0RGVwdGhzICovCisgICAgICAwLCAvKiA/IGR3QWxwaGFCbHRTdXJmYWNlQml0RGVwdGhzICovCisgICAgICAwLCAvKiA/IGR3QWxwaGFPdmVybGF5Q29uc3RCaXREZXB0aHMgKi8KKyAgICAgIDAsIC8qID8gZHdBbHBoYU92ZXJsYXlQaXhlbEJpdERlcHRocyAqLworICAgICAgMCwgLyogPyBkd0FscGhhT3ZlcmxheVN1cmZhY2VCaXREZXB0aHMgKi8KKyAgICAgIEREQkRfMTYsIC8qID8gZHdaQnVmZmVyQml0RGVwdGhzICovCisgICAgICAxNioxMDI0KjEwMjQsIC8qIGR3VmlkTWVtVG90YWwgKi8KKyAgICAgIDE2KjEwMjQqMTAyNCwgLyogZHdWaWRNZW1GcmVlICovCisgICAgICAwLCAvKiBkd01heFZpc2libGVPdmVybGF5cyAqLworICAgICAgMCwgLyogZHdDdXJyVmlzaWJsZU92ZXJsYXlzICovCisgICAgICAwLCAvKiBkd051bUZvdXJDQ0NvZGVzICovCisgICAgICAwLCAvKiBkd0FsaWduQm91bmRhcnlTcmMgKi8KKyAgICAgIDAsIC8qIGR3QWxpZ25TaXplU3JjICovCisgICAgICAwLCAvKiBkd0FsaWduQm91bmRhcnlEZXN0ICovCisgICAgICAwLCAvKiBkd0FsaWduU2l6ZURlc3QgKi8KKyAgICAgIDAsIC8qIGR3QWxpZ25TdHJpZGVBbGlnbiAqLworICAgICAgUk9QUywgLyogWFhYIGR3Um9wc1tERF9ST1BfU1BBQ0VdICovCisgICAgICB7IDAsIH0sIC8qIFhYWCBkZHNPbGRDYXBzICovCisgICAgICAxMDAwLCAvKiBkd01pbk92ZXJsYXlTdHJldGNoICovCisgICAgICAxMDAwLCAvKiBkd01heE92ZXJsYXlTdHJldGNoICovCisgICAgICAxMDAwLCAvKiBkd01pbkxpdmVWaWRlb1N0cmV0Y2ggKi8KKyAgICAgIDEwMDAsIC8qIGR3TWF4TGl2ZVZpZGVvU3RyZXRjaCAqLworICAgICAgMTAwMCwgLyogZHdNaW5Id0NvZGVjU3RyZXRjaCAqLworICAgICAgMTAwMCwgLyogZHdNYXhId0NvZGVjU3RyZXRjaCAqLworICAgICAgMCwgMCwgMCwgLyogZHdSZXNlcnZlZDEsIDIsIDMgKi8KKyAgICAgIEJMSVRfQ0FQUywgLyogZHdTVkJDYXBzICovCisgICAgICBDS0VZX0NBUFMsIC8qIGR3U1ZCQ0tleUNhcHMgKi8KKyAgICAgIEZYX0NBUFMsIC8qIGR3U1ZCRlhDYXBzICovCisgICAgICBST1BTLCAvKiBkd1NWQlJvcHMgKi8KKyAgICAgIEJMSVRfQ0FQUywgLyogZHdWU0JDYXBzICovCisgICAgICBDS0VZX0NBUFMsIC8qIGR3VlNCQ0tleUNhcHMgKi8KKyAgICAgIEZYX0NBUFMsIC8qIGR3VlNCRlhDYXBzICovCisgICAgICBST1BTLCAvKiBkd1ZTQlJvcHMgKi8KKyAgICAgIEJMSVRfQ0FQUywgLyogZHdTU0JDYXBzICovCisgICAgICBDS0VZX0NBUFMsIC8qIGR3U1NCQ0tleUNhcHMgKi8KKyAgICAgIEZYX0NBUFMsIC8qIGR3U1NCRlhDYXBzICovCisgICAgICBST1BTLCAvKiBkd1NTQlJvcHMgKi8KKyAgICAgIDAsIC8qIGR3TWF4VmlkZW9Qb3J0cyAqLworICAgICAgMCwgLyogZHdDdXJyVmlkZW9Qb3J0cyAqLworICAgICAgMCwgLyogPyBkd1NWQkNhcHMyICovCisgICAgICBCTElUX0NBUFMsIC8qID8gZHdOTFZCQ2FwcyAqLworICAgICAgMCwgLyogPyBkd05MVkJDYXBzMiAqLworICAgICAgQ0tFWV9DQVBTLCAvKiBkd05MVkJDS2V5Q2FwcyAqLworICAgICAgRlhfQ0FQUywgLyogZHdOTFZCRlhDYXBzICovCisgICAgICBST1BTLCAvKiBkd05MVkJSb3BzICovCisgICAgICB7IC8qIGRkc0NhcHMgKi8KKwkgIEREU0NBUFNfM0RERVZJQ0UgfCBERFNDQVBTX0FMUEhBIHwgRERTQ0FQU19CQUNLQlVGRkVSIHwgRERTQ0FQU19GTElQCisJICB8IEREU0NBUFNfRlJPTlRCVUZGRVIgfCBERFNDQVBTX01JUE1BUCB8IEREU0NBUFNfT0ZGU0NSRUVOUExBSU4KKwkgIHwgRERTQ0FQU19QQUxFVFRFIHwgRERTQ0FQU19QUklNQVJZU1VSRkFDRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZCisJICB8IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfVklERU9NRU1PUlkgfCBERFNDQVBTX1ZJU0lCTEUKKwkgIHwgRERTQ0FQU19aQlVGRkVSLAorCSAgRERTQ0FQUzJfQ1VCRU1BUCwKKwkgIDAsCisJICAwCisgICAgICB9CisgICAgfTsKKworI3VuZGVmIEJMSVRfQ0FQUworI3VuZGVmIENLRVlfQ0FQUworI3VuZGVmIEZYX0NBUFMKKyN1bmRlZiBST1BTCisKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdJbXBsLCBpZmFjZSk7CisJCisgICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsVGhpcyxwRHJpdmVyQ2FwcyxwSEVMQ2Fwcyk7CisgICAgaWYgKChwRHJpdmVyQ2FwcyAhPSBOVUxMICYmIHBEcml2ZXJDYXBzLT5kd1NpemUgIT0gc2l6ZW9mKEREQ0FQUykpCisJfHwgKHBIRUxDYXBzICE9IE5VTEwgJiYgcEhFTENhcHMtPmR3U2l6ZSAhPSBzaXplb2YoRERDQVBTKSkpCisgICAgeworCUZJWE1FKCJ1bnN1cHBvcnRlZCBzdHJ1Y3R1cmUgdmVyc2lvbnM6ICVsdS8lbHUgdnMgJXVcbiIsCisJICAgICAgcERyaXZlckNhcHMgPyBwRHJpdmVyQ2Fwcy0+ZHdTaXplIDogc2l6ZW9mKEREQ0FQUyksCisJICAgICAgcEhFTENhcHMgPyBwSEVMQ2Fwcy0+ZHdTaXplIDogc2l6ZW9mKEREQ0FQUyksCisJICAgICAgc2l6ZW9mKEREQ0FQUykpOworCS8qIFRoZSBvbGQgREQgY2FwcyBzdHJ1Y3R1cmVzIGFyZSBjb250YWluZWQgaW4gdGhlIERYNyBTREssIGFuZCBzaW5jZQorCSAqIGl0J3MgY2hhbmdlZCBldmVyeSB2ZXJzaW9uLCB3ZSBzaG91bGQgcHJvYmFibHkgdHJ5IHRvIHN1cHBvcnQgdGhlCisJICogb2xkIG9uZXMuICovCisgICAgfQorCisgICAgaWYgKHBEcml2ZXJDYXBzICE9IE5VTEwpCisJbWVtY3B5KHBEcml2ZXJDYXBzLCAmY2FwcywgcERyaXZlckNhcHMtPmR3U2l6ZSk7CisKKyAgICBpZiAocEhFTENhcHMgIT0gTlVMTCkKKwltZW1jcHkocEhFTENhcHMsICZjYXBzLCBwSEVMQ2Fwcy0+ZHdTaXplKTsKKworICAgIHJldHVybiBERF9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkKK1VzZXJfRGlyZWN0RHJhd19HZXREZXZpY2VJZGVudGlmaWVyKExQRElSRUNURFJBVzcgaWZhY2UsCisJCQkJICAgIExQRERERVZJQ0VJREVOVElGSUVSMiBwRERESSwKKwkJCQkgICAgRFdPUkQgZHdGbGFncykKK3sKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCUwOGx4KVxuIixpZmFjZSxwRERESSxkd0ZsYWdzKTsKKyAgICAqcEREREkgPSB1c2VyX2RldmljZTsKKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qIEdldERpc3BsYXlNb2RlOiBnZW5lcmljICovCisvKiBHZXRGb3VyQ0NDb2RlczogZ2VuZXJpYyAqLworLyogR2V0R0RJU3VyZmFjZTogPz8/ICovCisvKiBHZXRNb25pdG9yRnJlcXVlbmN5OiBnZW5lcmljICovCisvKiBHZXRTY2FuTGluZTogZ2VuZXJpYyAqLworLyogR2V0U3VyZmFjZUZyb21EQzogZ2VuZXJpYyAqLworLyogR2V0VmVydGljYWxCbGFua1N0YXR1czogZ2VuZXJpYyAqLworLyogSW5pdGlhbGl6ZTogZ2VuZXJpYyAqLworLyogUmVzdG9yZUFsbFN1cmZhY2VzOiBnZW5lcmljICovCisvKiBSZXN0b3JlRGlzcGxheU1vZGU6IGdlbmVyaWMgKi8KKy8qIFNldENvb3BlcmF0aXZlTGV2ZWw6ID8/PyAqLworCitIUkVTVUxUIFdJTkFQSQorVXNlcl9EaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsIERXT1JEIGR3V2lkdGgsCisJCQkgICAgICAgRFdPUkQgZHdIZWlnaHQsIERXT1JEIGR3QlBQLAorCQkJICAgICAgIERXT1JEIGR3UmVmcmVzaFJhdGUsIERXT1JEIGR3RmxhZ3MpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3SW1wbCwgaWZhY2UpOworCisgICAgY29uc3QgRERQSVhFTEZPUk1BVCogcGl4ZWxmb3JtYXQ7CisgICAgTE9ORyBwaXRjaDsKKworICAgIFRSQUNFKCIoJXApLT4oJWxkeCVsZHglbGQsJWxkIEh6LCUwOGx4KVxuIixUaGlzLGR3V2lkdGgsZHdIZWlnaHQsZHdCUFAsZHdSZWZyZXNoUmF0ZSxkd0ZsYWdzKTsKKyAgICBpZiAoIUlzVmFsaWREaXNwbGF5TW9kZShkd1dpZHRoLCBkd0hlaWdodCwgZHdCUFAsIGR3UmVmcmVzaFJhdGUsIGR3RmxhZ3MpKQorCXJldHVybiBEREVSUl9JTlZBTElETU9ERTsKKworICAgIHBpeGVsZm9ybWF0ID0gcGl4ZWxmb3JtYXRfZm9yX2RlcHRoKGR3QlBQKTsKKyAgICBpZiAocGl4ZWxmb3JtYXQgPT0gTlVMTCkKKyAgICB7CisJYXNzZXJ0KDApOworCXJldHVybiBEREVSUl9HRU5FUklDOworICAgIH0KKworICAgIHBpdGNoID0gRERSQVdfd2lkdGhfYnBwX3RvX3BpdGNoKGR3V2lkdGgsIGR3QlBQKTsKKworICAgIHJldHVybiBNYWluX0RpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoaWZhY2UsIGR3V2lkdGgsIGR3SGVpZ2h0LCBwaXRjaCwKKwkJCQkJICBkd1JlZnJlc2hSYXRlLCBkd0ZsYWdzLCBwaXhlbGZvcm1hdCk7Cit9CisKKy8qIFN0YXJ0TW9kZVRlc3Q6ID8/PyAqLworLyogVGVzdENvb3BlcmF0aXZlTGV2ZWw6IGdlbmVyaWM/ICovCisvKiBXYWl0Rm9yVmVydGljYWxCbGFuazogPz8/ICovCisKK3N0YXRpYyBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhdzcpIFVzZXJfRGlyZWN0RHJhd19WVGFibGUgPQoreworICAgIE1haW5fRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdfQWRkUmVmLAorICAgIE1haW5fRGlyZWN0RHJhd19SZWxlYXNlLAorICAgIE1haW5fRGlyZWN0RHJhd19Db21wYWN0LAorICAgIE1haW5fRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyLAorICAgIE1haW5fRGlyZWN0RHJhd19DcmVhdGVQYWxldHRlLAorICAgIE1haW5fRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlLAorICAgIE1haW5fRGlyZWN0RHJhd19EdXBsaWNhdGVTdXJmYWNlLAorICAgIFVzZXJfRGlyZWN0RHJhd19FbnVtRGlzcGxheU1vZGVzLAorICAgIE1haW5fRGlyZWN0RHJhd19FbnVtU3VyZmFjZXMsCisgICAgTWFpbl9EaXJlY3REcmF3X0ZsaXBUb0dESVN1cmZhY2UsCisgICAgVXNlcl9EaXJlY3REcmF3X0dldENhcHMsCisgICAgTWFpbl9EaXJlY3REcmF3X0dldERpc3BsYXlNb2RlLAorICAgIE1haW5fRGlyZWN0RHJhd19HZXRGb3VyQ0NDb2RlcywKKyAgICBNYWluX0RpcmVjdERyYXdfR2V0R0RJU3VyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdfR2V0TW9uaXRvckZyZXF1ZW5jeSwKKyAgICBNYWluX0RpcmVjdERyYXdfR2V0U2NhbkxpbmUsCisgICAgTWFpbl9EaXJlY3REcmF3X0dldFZlcnRpY2FsQmxhbmtTdGF0dXMsCisgICAgTWFpbl9EaXJlY3REcmF3X0luaXRpYWxpemUsCisgICAgTWFpbl9EaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZSwKKyAgICBNYWluX0RpcmVjdERyYXdfU2V0Q29vcGVyYXRpdmVMZXZlbCwKKyAgICBVc2VyX0RpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUsCisgICAgTWFpbl9EaXJlY3REcmF3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAorICAgIE1haW5fRGlyZWN0RHJhd19HZXRBdmFpbGFibGVWaWRNZW0sCisgICAgTWFpbl9EaXJlY3REcmF3X0dldFN1cmZhY2VGcm9tREMsCisgICAgTWFpbl9EaXJlY3REcmF3X1Jlc3RvcmVBbGxTdXJmYWNlcywKKyAgICBNYWluX0RpcmVjdERyYXdfVGVzdENvb3BlcmF0aXZlTGV2ZWwsCisgICAgVXNlcl9EaXJlY3REcmF3X0dldERldmljZUlkZW50aWZpZXIsCisgICAgTWFpbl9EaXJlY3REcmF3X1N0YXJ0TW9kZVRlc3QsCisgICAgTWFpbl9EaXJlY3REcmF3X0V2YWx1YXRlTW9kZQorfTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGRyYXcvdXNlci5oIGIvZGxscy9kZHJhdy9kZHJhdy91c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxNWE2NAotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvZGRyYXcvZGRyYXcvdXNlci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIENvcHlyaWdodCAyMDAwIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuICovCisKKyNpZm5kZWYgV0lORV9ERFJBV19ERFJBV19VU0VSX0hfSU5DTFVERUQKKyNkZWZpbmUgV0lORV9ERFJBV19ERFJBV19VU0VSX0hfSU5DTFVERUQKKworI2RlZmluZSBVU0VSX0REUkFXX1BSSVYoZGRyYXcpICgoVXNlcl9EaXJlY3REcmF3SW1wbCopKChkZHJhdyktPnByaXZhdGUpKQorI2RlZmluZSBVU0VSX0REUkFXX1BSSVZfVkFSKG5hbWUsZGRyYXcpIFwKKwlVc2VyX0RpcmVjdERyYXdJbXBsKiBuYW1lID0gVVNFUl9ERFJBV19QUklWKGRkcmF3KQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIGVtcHR5ICovCit9IFVzZXJfRGlyZWN0RHJhd0ltcGxfUGFydDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVc2VyX0RpcmVjdERyYXdJbXBsX1BhcnQgdXNlcjsKK30gVXNlcl9EaXJlY3REcmF3SW1wbDsKKwordm9pZCBVc2VyX0RpcmVjdERyYXdfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd0ltcGwqIFRoaXMpOworSFJFU1VMVCBVc2VyX0RpcmVjdERyYXdfY3JlYXRlX3ByaW1hcnkoSURpcmVjdERyYXdJbXBsKiBUaGlzLAorCQkJCSAgICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QsCisJCQkJICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsCisJCQkJICAgICAgIExQVU5LTk9XTiBwT3V0ZXIpOworSFJFU1VMVCBVc2VyX0RpcmVjdERyYXdfY3JlYXRlX2JhY2tidWZmZXIoSURpcmVjdERyYXdJbXBsKiBUaGlzLAorCQkJCQkgIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKKwkJCQkJICBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLAorCQkJCQkgIExQVU5LTk9XTiBwT3V0ZXIsCisJCQkJCSAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJpbWFyeSk7CitIUkVTVUxUIFVzZXJfRGlyZWN0RHJhd19Db25zdHJ1Y3QoSURpcmVjdERyYXdJbXBsICpUaGlzLCBCT09MIGV4KTsKK0hSRVNVTFQgVXNlcl9EaXJlY3REcmF3X0NyZWF0ZShjb25zdCBHVUlEKiBwR1VJRCwgTFBESVJFQ1REUkFXNyogcElmYWNlLAorCQkJICAgICAgIElVbmtub3duKiBwVW5rT3V0ZXIsIEJPT0wgZXgpOworCitIUkVTVUxUIFdJTkFQSQorVXNlcl9EaXJlY3REcmF3X0VudW1EaXNwbGF5TW9kZXMoTFBESVJFQ1REUkFXNyBpZmFjZSwgRFdPUkQgZHdGbGFncywKKwkJCQkgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwgTFBWT0lEIGNvbnRleHQsCisJCQkJIExQRERFTlVNTU9ERVNDQUxMQkFDSzIgY2FsbGJhY2spOworSFJFU1VMVCBXSU5BUEkKK1VzZXJfRGlyZWN0RHJhd19HZXRDYXBzKExQRElSRUNURFJBVzcgaWZhY2UsIExQRERDQVBTIHBEcml2ZXJDYXBzLAorCQkJTFBERENBUFMgcEhFTENhcHMpOworSFJFU1VMVCBXSU5BUEkKK1VzZXJfRGlyZWN0RHJhd19HZXREZXZpY2VJZGVudGlmaWVyKExQRElSRUNURFJBVzcgaWZhY2UsCisJCQkJICAgIExQRERERVZJQ0VJREVOVElGSUVSMiBwRERESSwKKwkJCQkgICAgRFdPUkQgZHdGbGFncyk7CitIUkVTVUxUIFdJTkFQSQorVXNlcl9EaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UsIERXT1JEIGR3V2lkdGgsCisJCQkgICAgICAgRFdPUkQgZHdIZWlnaHQsIERXT1JEIGR3QlBQLAorCQkJICAgICAgIERXT1JEIGR3UmVmcmVzaFJhdGUsIERXT1JEIGR3RmxhZ3MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZGRyYXcveDExLmMgYi9kbGxzL2RkcmF3L2RkcmF3L3gxMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODI3ZTgxLi4wMDAwMDAwCi0tLSBhL2RsbHMvZGRyYXcvZGRyYXcveDExLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzM1ICswLDAgQEAKLS8qCQlEaXJlY3REcmF3IElEaXJlY3REcmF3IFhsaWIgaW50ZXJmYWNlCi0gKgotICogQ29weXJpZ2h0IDE5OTctMjAwMCBNYXJjdXMgTWVpc3NuZXIKLSAqIENvcHlyaWdodCAxOTk4LTIwMDAgTGlvbmVsIFVsbWVyIChtb3N0IG9mIERpcmVjdDNEIHN0dWZmKQotICovCi0vKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBYbGliIHNwZWNpZmljIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJkZHJhdy5oIgotI2luY2x1ZGUgImQzZC5oIgotI2luY2x1ZGUgIndpbi5oIgotI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKLSNpbmNsdWRlICJvcHRpb25zLmgiCi0KLURFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Ci0KLSNpbmNsdWRlICJ4MTFfcHJpdmF0ZS5oIgotCi0jZGVmaW5lIEREUFJJVkFURSh4KSB4MTFfZGRfcHJpdmF0ZSAqZGRwcml2ID0gKCh4MTFfZGRfcHJpdmF0ZSopKHgpLT5kLT5wcml2YXRlKQotI2RlZmluZSBEUFBSSVZBVEUoeCkgeDExX2RwX3ByaXZhdGUgKmRwcHJpdiA9ICgoeDExX2RwX3ByaXZhdGUqKSh4KS0+cHJpdmF0ZSkKLSNkZWZpbmUgRFNQUklWQVRFKHgpIHgxMV9kc19wcml2YXRlICpkc3ByaXYgPSAoKHgxMV9kc19wcml2YXRlKikoeCktPnByaXZhdGUpCi0KLXN0YXRpYyBpbmxpbmUgQk9PTCBnZXRfb3B0aW9uKCBjb25zdCBjaGFyICpuYW1lLCBCT09MIGRlZiApIHsKLSAgICByZXR1cm4gUFJPRklMRV9HZXRXaW5lSW5pQm9vbCggIngxMWRydiIsIG5hbWUsIGRlZiApOwotfQotCi1pbnQgX2NvbW1vbl9kZXB0aF90b19waXhlbGZvcm1hdChEV09SRCBkZXB0aCxMUERJUkVDVERSQVcgZGRyYXcpCi17Ci0gIElDT01fVEhJUyhJRGlyZWN0RHJhd0ltcGwsZGRyYXcpOwotICBYVmlzdWFsSW5mbyAqdmk7Ci0gIFhQaXhtYXBGb3JtYXRWYWx1ZXMgKnBmOwotICBYVmlzdWFsSW5mbyB2dDsKLSAgaW50IG52aXN1YWxzLCBucGl4bWFwLCBpOwotICBpbnQgbWF0Y2ggPSAwOwotICBpbnQgaW5kZXggPSAtMjsKLSAgRERQSVhFTEZPUk1BVCAqcGl4ZWxmb3JtYXQgPSAmKFRoaXMtPmQtPmRpcmVjdGRyYXdfcGl4ZWxmb3JtYXQpOwotICBERFBJWEVMRk9STUFUICpzY3JlZW5fcGl4ZWxmb3JtYXQgPSAmKFRoaXMtPmQtPnNjcmVlbl9waXhlbGZvcm1hdCk7Ci0KLSAgVGhpcy0+ZC0+cGl4ZWxfY29udmVydCA9IE5VTEw7Ci0gIFRoaXMtPmQtPnBhbGV0dGVfY29udmVydCA9IE5VTEw7Ci0KLSAgdmkgPSBUU1hHZXRWaXN1YWxJbmZvKGRpc3BsYXksIFZpc3VhbE5vTWFzaywgJnZ0LCAmbnZpc3VhbHMpOwotICBwZiA9IFRTWExpc3RQaXhtYXBGb3JtYXRzKGRpc3BsYXksICZucGl4bWFwKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnBpeG1hcDsgaSsrKSB7Ci0gICAgaWYgKHBmW2ldLmRlcHRoID09IGRlcHRoKSB7Ci0gICAgICBpbnQgajsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IG52aXN1YWxzOyBqKyspIHsKLQlpZiAodmlbal0uZGVwdGggPT0gcGZbaV0uZGVwdGgpIHsKLQkgIHBpeGVsZm9ybWF0LT5kd1NpemUgPSBzaXplb2YoKnBpeGVsZm9ybWF0KTsKLQkgIGlmIChkZXB0aCA9PSA4KSB7Ci0JICAgIHBpeGVsZm9ybWF0LT5kd0ZsYWdzID0gRERQRl9QQUxFVFRFSU5ERVhFRDh8RERQRl9SR0I7Ci0JICAgIHBpeGVsZm9ybWF0LT51MS5kd1JCaXRNYXNrID0gMDsKLQkgICAgcGl4ZWxmb3JtYXQtPnUyLmR3R0JpdE1hc2sgPSAwOwotCSAgICBwaXhlbGZvcm1hdC0+dTMuZHdCQml0TWFzayA9IDA7Ci0JICB9IGVsc2UgewotCSAgICBwaXhlbGZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwotCSAgICBwaXhlbGZvcm1hdC0+dTEuZHdSQml0TWFzayA9IHZpW2pdLnJlZF9tYXNrOwotCSAgICBwaXhlbGZvcm1hdC0+dTIuZHdHQml0TWFzayA9IHZpW2pdLmdyZWVuX21hc2s7Ci0JICAgIHBpeGVsZm9ybWF0LT51My5kd0JCaXRNYXNrID0gdmlbal0uYmx1ZV9tYXNrOwotCSAgfQotCSAgcGl4ZWxmb3JtYXQtPmR3Rm91ckNDID0gMDsKLQkgIHBpeGVsZm9ybWF0LT51LmR3UkdCQml0Q291bnQgPSBwZltpXS5iaXRzX3Blcl9waXhlbDsKLQkgIHBpeGVsZm9ybWF0LT51NC5kd1JHQkFscGhhQml0TWFzaz0gMDsKLQkgICpzY3JlZW5fcGl4ZWxmb3JtYXQgPSAqcGl4ZWxmb3JtYXQ7Ci0JICBUaGlzLT5kLT5waXhtYXBfZGVwdGggPSBkZXB0aDsKLQkgIG1hdGNoID0gMTsKLQkgIGluZGV4ID0gLTE7Ci0JICBnb3RvIGNsZWFuX3VwX2FuZF9leGl0OwotCX0KLSAgICAgIH0KLSAgICAgIEZJWE1FKCJObyB2aXN1YWwgY29ycmVzcG9uZGluZyB0byBwaXhtYXAgZm9ybWF0IChkZXB0aD0lbGQpIVxuIixkZXB0aCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG1hdGNoID09IDApIHsKLSAgICAvKiBXZSB0cnkgbm93IHRvIGZpbmQgYW4gZW11bGF0ZWQgbW9kZSAqLwotICAgIGludCBjOwotCi0gICAgZm9yIChjID0gMDsgYyA8IHNpemVvZihNb2RlRW11bGF0aW9ucykgLyBzaXplb2YoQ29udmVydCk7IGMrKykgewotICAgICAgaWYgKChNb2RlRW11bGF0aW9uc1tjXS5kZXN0LmRlcHRoID09IGRlcHRoKSAmJgotICAgICAgICAgIChNb2RlRW11bGF0aW9uc1tjXS5kZXN0LmJwcCA9PSBkZXB0aCkKLSAgICAgICkgewotCS8qIEZvdW5kIGFuIGVtdWxhdGlvbiBmdW5jdGlvbiwgbm93IHRyaWVzIHRvIGZpbmQgYSBtYXRjaGluZyB2aXN1YWwgLyBwaXhlbCBmb3JtYXQgcGFpciAqLwotCWZvciAoaSA9IDA7IGkgPCBucGl4bWFwOyBpKyspIHsKLQkgIGlmICgocGZbaV0uZGVwdGggPT0gTW9kZUVtdWxhdGlvbnNbY10uc2NyZWVuLmRlcHRoKSAmJgotCSAgICAgIChwZltpXS5iaXRzX3Blcl9waXhlbCA9PSBNb2RlRW11bGF0aW9uc1tjXS5zY3JlZW4uYnBwKSkgewotCSAgICBpbnQgajsKLQotCSAgICBmb3IgKGogPSAwOyBqIDwgbnZpc3VhbHM7IGorKykgewotCSAgICAgIGlmICh2aVtqXS5kZXB0aCA9PSBwZltpXS5kZXB0aCkgewotCQlzY3JlZW5fcGl4ZWxmb3JtYXQtPmR3U2l6ZSA9IHNpemVvZigqc2NyZWVuX3BpeGVsZm9ybWF0KTsKLQkJc2NyZWVuX3BpeGVsZm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7Ci0JCXNjcmVlbl9waXhlbGZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwotCQlzY3JlZW5fcGl4ZWxmb3JtYXQtPnUuZHdSR0JCaXRDb3VudCA9IHBmW2ldLmJpdHNfcGVyX3BpeGVsOwotCQlzY3JlZW5fcGl4ZWxmb3JtYXQtPnUxLmR3UkJpdE1hc2sgPSB2aVtqXS5yZWRfbWFzazsKLQkJc2NyZWVuX3BpeGVsZm9ybWF0LT51Mi5kd0dCaXRNYXNrID0gdmlbal0uZ3JlZW5fbWFzazsKLQkJc2NyZWVuX3BpeGVsZm9ybWF0LT51My5kd0JCaXRNYXNrID0gdmlbal0uYmx1ZV9tYXNrOwotCQlzY3JlZW5fcGl4ZWxmb3JtYXQtPnU0LmR3UkdCQWxwaGFCaXRNYXNrPSAwOwotCi0JCXBpeGVsZm9ybWF0LT5kd1NpemUgPSBzaXplb2YoKnBpeGVsZm9ybWF0KTsKLQkJcGl4ZWxmb3JtYXQtPmR3Rm91ckNDID0gMDsKLQkJaWYgKGRlcHRoID09IDgpIHsKLQkJICBwaXhlbGZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCfEREUEZfUEFMRVRURUlOREVYRUQ4OwotCQkgIHBpeGVsZm9ybWF0LT51LmR3UkdCQml0Q291bnQgPSA4OwotCQkgIHBpeGVsZm9ybWF0LT51MS5kd1JCaXRNYXNrID0gMDsKLQkJICBwaXhlbGZvcm1hdC0+dTIuZHdHQml0TWFzayA9IDA7Ci0JCSAgcGl4ZWxmb3JtYXQtPnUzLmR3QkJpdE1hc2sgPSAwOwotCQl9IGVsc2UgewotCQkgIHBpeGVsZm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7Ci0JCSAgcGl4ZWxmb3JtYXQtPnUuZHdSR0JCaXRDb3VudCA9IE1vZGVFbXVsYXRpb25zW2NdLmRlc3QuYnBwOwotCQkgIHBpeGVsZm9ybWF0LT51MS5kd1JCaXRNYXNrID0gTW9kZUVtdWxhdGlvbnNbY10uZGVzdC5ybWFzazsKLQkJICBwaXhlbGZvcm1hdC0+dTIuZHdHQml0TWFzayA9IE1vZGVFbXVsYXRpb25zW2NdLmRlc3QuZ21hc2s7Ci0JCSAgcGl4ZWxmb3JtYXQtPnUzLmR3QkJpdE1hc2sgPSBNb2RlRW11bGF0aW9uc1tjXS5kZXN0LmJtYXNrOwotCQl9Ci0JCXBpeGVsZm9ybWF0LT51NC5kd1JHQkFscGhhQml0TWFzaz0gMDsgICAgCi0JCVRoaXMtPmQtPnBpeG1hcF9kZXB0aCA9IHZpW2pdLmRlcHRoOwotCQltYXRjaCA9IDI7Ci0JCWluZGV4ID0gYzsKLQkJVGhpcy0+ZC0+cGl4ZWxfY29udmVydCAgPU1vZGVFbXVsYXRpb25zW2NdLmZ1bmNzLnBpeGVsX2NvbnZlcnQ7Ci0JCVRoaXMtPmQtPnBhbGV0dGVfY29udmVydD1Nb2RlRW11bGF0aW9uc1tjXS5mdW5jcy5wYWxldHRlX2NvbnZlcnQ7Ci0JCWdvdG8gY2xlYW5fdXBfYW5kX2V4aXQ7Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0JfQotICAgICAgfQotICAgIH0KLSAgICBFUlIoIk5vIGVtdWxhdGlvbiBmb3VuZCBmb3IgZGVwdGggJWxkIVxuIixkZXB0aCk7Ci0gIH0KLQotY2xlYW5fdXBfYW5kX2V4aXQ6Ci0gIFRTWEZyZWUodmkpOwotICBUU1hGcmVlKHBmKTsKLQotICByZXR1cm4gaW5kZXg7Ci19Ci0KLSNpZmRlZiBIQVZFX0xJQlhYRjg2Vk0KLXN0YXRpYyBYRjg2VmlkTW9kZU1vZGVJbmZvICpvcmlnX21vZGUgPSBOVUxMOwotCi12b2lkCi14Zjg2dm1vZGVfc2V0ZGlzcGxheW1vZGUoRFdPUkQgd2lkdGgsIERXT1JEIGhlaWdodCkgewotICAgIGludCBpLCBtb2RlX2NvdW50OwotICAgIFhGODZWaWRNb2RlTW9kZUluZm8gKiphbGxfbW9kZXMsICp2aWRtb2RlID0gTlVMTDsKLSAgICBYRjg2VmlkTW9kZU1vZGVMaW5lIG1vZF90bXA7Ci0gICAgLyogaW50IGRvdGNsb2NrX3RtcDsgKi8KLQotICAgIC8qIHNhdmUgb3JpZ2luYWwgdmlkZW8gbW9kZSBhbmQgc2V0IGZ1bGxzY3JlZW4gaWYgYXZhaWxhYmxlICovCi0gICAgb3JpZ19tb2RlID0gKFhGODZWaWRNb2RlTW9kZUluZm8gKiltYWxsb2Moc2l6ZW9mKFhGODZWaWRNb2RlTW9kZUluZm8pKTsgIAotICAgIFRTWEY4NlZpZE1vZGVHZXRNb2RlTGluZShkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLCAmb3JpZ19tb2RlLT5kb3RjbG9jaywgJm1vZF90bXApOwotICAgIG9yaWdfbW9kZS0+aGRpc3BsYXkgPSBtb2RfdG1wLmhkaXNwbGF5OyAKLSAgICBvcmlnX21vZGUtPmhzeW5jc3RhcnQgPSBtb2RfdG1wLmhzeW5jc3RhcnQ7Ci0gICAgb3JpZ19tb2RlLT5oc3luY2VuZCA9IG1vZF90bXAuaHN5bmNlbmQ7IAotICAgIG9yaWdfbW9kZS0+aHRvdGFsID0gbW9kX3RtcC5odG90YWw7Ci0gICAgb3JpZ19tb2RlLT52ZGlzcGxheSA9IG1vZF90bXAudmRpc3BsYXk7IAotICAgIG9yaWdfbW9kZS0+dnN5bmNzdGFydCA9IG1vZF90bXAudnN5bmNzdGFydDsKLSAgICBvcmlnX21vZGUtPnZzeW5jZW5kID0gbW9kX3RtcC52c3luY2VuZDsgCi0gICAgb3JpZ19tb2RlLT52dG90YWwgPSBtb2RfdG1wLnZ0b3RhbDsKLSAgICBvcmlnX21vZGUtPmZsYWdzID0gbW9kX3RtcC5mbGFnczsgCi0JLyogY29weSBwcml2YXRlIGRhdGEgdG8gb3VyIG9yaWdfbW9kZSBzdHJ1Y3R1cmUgKi8KLSAgICBvcmlnX21vZGUtPnByaXZzaXplID0gbW9kX3RtcC5wcml2c2l6ZTsKLSAgICBpZiAob3JpZ19tb2RlLT5wcml2c2l6ZSkKLSAgICB7Ci0gICAgICBvcmlnX21vZGUtPnByaXZhdGUgPSBtYWxsb2MobW9kX3RtcC5wcml2c2l6ZSk7Ci0gICAgICBtZW1jcHkob3JpZ19tb2RlLT5wcml2YXRlLCBtb2RfdG1wLnByaXZhdGUsIG1vZF90bXAucHJpdnNpemUpOwotICAgIH0KLQotICAgIFRTWEY4NlZpZE1vZGVHZXRBbGxNb2RlTGluZXMoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLCZtb2RlX2NvdW50LCZhbGxfbW9kZXMpOwotICAgIGZvciAoaT0wO2k8bW9kZV9jb3VudDtpKyspIHsKLQlpZiAoYWxsX21vZGVzW2ldLT5oZGlzcGxheSA9PSB3aWR0aCAmJgotCSAgICBhbGxfbW9kZXNbaV0tPnZkaXNwbGF5ID09IGhlaWdodAotCSkgewotCSAgICB2aWRtb2RlID0gKFhGODZWaWRNb2RlTW9kZUluZm8gKiltYWxsb2Moc2l6ZW9mKFhGODZWaWRNb2RlTW9kZUluZm8pKTsKLQkgICAgKnZpZG1vZGUgPSAqKGFsbF9tb2Rlc1tpXSk7Ci0JICAgIGJyZWFrOwotCX0gZWxzZQotCSAgICBUU1hGcmVlKGFsbF9tb2Rlc1tpXS0+cHJpdmF0ZSk7Ci0gICAgfQotICAgIGZvciAoaSsrO2k8bW9kZV9jb3VudDtpKyspIFRTWEZyZWUoYWxsX21vZGVzW2ldLT5wcml2YXRlKTsKLQlUU1hGcmVlKGFsbF9tb2Rlcyk7Ci0KLSAgICBpZiAoIXZpZG1vZGUpCi0JV0FSTigiRnVsbHNjcmVlbiBtb2RlIG5vdCBhdmFpbGFibGUhXG4iKTsKLQotICAgIGlmICh2aWRtb2RlKSB7Ci0JVFJBQ0UoIlN3aXRjaFRvTW9kZSglZHglZClcbiIsdmlkbW9kZS0+aGRpc3BsYXksdmlkbW9kZS0+dmRpc3BsYXkpOwotCVRTWEY4NlZpZE1vZGVTd2l0Y2hUb01vZGUoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwgdmlkbW9kZSk7Ci0jaWYgMCAvKiBUaGlzIG1lc3NlcyB1cCBteSBzY3JlZW4gKFhGODZfTWFjaDY0LCAzLjMuMi4zYSkgZm9yIHNvbWUgcmVhc29uLCBhbmQgc2hvdWxkIG5vdyBiZSB1bm5lY2Vzc2FyeSAqLwotCVRTWEY4NlZpZE1vZGVTZXRWaWV3UG9ydChkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLCAwLCAwKTsKLSNlbmRpZgotICAgIH0KLX0KLQotdm9pZCB4Zjg2dm1vZGVfcmVzdG9yZSgpIHsKLSAgICBpZiAoIW9yaWdfbW9kZSkKLQlyZXR1cm47Ci0gICAgVFNYRjg2VmlkTW9kZVN3aXRjaFRvTW9kZShkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksb3JpZ19tb2RlKTsKLSAgICAvKiBtYW51YWxseSBmcmVlIHRoZSBwcml2YXRlIGRhdGEgaWYgaXQgd2FzIGFsbG9jYXRlZCAqLwotICAgIGlmIChvcmlnX21vZGUtPnByaXZzaXplKQotCWZyZWUob3JpZ19tb2RlLT5wcml2YXRlKTsJCQotCi0gICAgZnJlZShvcmlnX21vZGUpOwotICAgIG9yaWdfbW9kZSA9IE5VTEw7Ci19Ci0jZWxzZQotdm9pZCB4Zjg2dm1vZGVfc2V0ZGlzcGxheW1vZGUoRFdPUkQgd2lkdGgsIERXT1JEIGhlaWdodCkge30KLXZvaWQgeGY4NnZtb2RlX3Jlc3RvcmUoKSB7fQotI2VuZGlmCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCUlEaXJlY3REcmF3Ci0gKi8KLSNpZmRlZiBIQVZFX0xJQlhYU0hNCi0vKiBFcnJvciBoYW5kbGVycyBmb3IgSW1hZ2UgY3JlYXRpb24gKi8KLXN0YXRpYyBpbnQgWFNobUVycm9ySGFuZGxlcihEaXNwbGF5ICpkcHksIFhFcnJvckV2ZW50ICpldmVudCkgewotICAgIFhTaG1FcnJvckZsYWcgPSAxOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgWEltYWdlICpjcmVhdGVfeHNobWltYWdlKAotICAgIElEaXJlY3REcmF3MkltcGwqIFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsKiBscGRzZgotKSB7Ci0gICAgRFNQUklWQVRFKGxwZHNmKTsKLSAgICBERFBSSVZBVEUoVGhpcyk7Ci0gICAgWEltYWdlICppbWc7Ci0gICAgaW50ICgqV2luZVhIYW5kbGVyKShEaXNwbGF5ICosIFhFcnJvckV2ZW50ICopOwotCi0gICAgaW1nID0gVFNYU2htQ3JlYXRlSW1hZ2UoZGlzcGxheSwKLQlEZWZhdWx0VmlzdWFsT2ZTY3JlZW4oWDExRFJWX0dldFhTY3JlZW4oKSksCi0JVGhpcy0+ZC0+cGl4bWFwX2RlcHRoLAotCVpQaXhtYXAsCi0JTlVMTCwKLQkmKGRzcHJpdi0+c2htaW5mbyksCi0JbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmR3V2lkdGgsCi0JbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmR3SGVpZ2h0Ci0gICAgKTsKLQotICAgIGlmIChpbWcgPT0gTlVMTCkgewotCUZJWE1FKCJDb3VsZG4ndCBjcmVhdGUgWFNobSBpbWFnZSAoZHVlIHRvIFgxMSByZW1vdGUgZGlzcGxheSBvciBmYWlsdXJlKS5cblJldmVydGluZyB0byBzdGFuZGFyZCBYIGltYWdlcyAhXG4iKTsKLQlkZHByaXYtPnhzaG1fYWN0aXZlID0gMDsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBkc3ByaXYtPnNobWluZm8uc2htaWQgPSBzaG1nZXQoIElQQ19QUklWQVRFLCBpbWctPmJ5dGVzX3Blcl9saW5lICogaW1nLT5oZWlnaHQsIElQQ19DUkVBVHwwNzc3ICk7Ci0KLSAgICBpZiAoZHNwcml2LT5zaG1pbmZvLnNobWlkIDwgMCkgewotCUZJWE1FKCJDb3VsZG4ndCBjcmVhdGUgc2hhcmVkIG1lbW9yeSBzZWdtZW50IChkdWUgdG8gWDExIHJlbW90ZSBkaXNwbGF5IG9yIGZhaWx1cmUpLlxuUmV2ZXJ0aW5nIHRvIHN0YW5kYXJkIFggaW1hZ2VzICFcbiIpOwotCWRkcHJpdi0+eHNobV9hY3RpdmUgPSAwOwotCVRTWERlc3Ryb3lJbWFnZShpbWcpOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGRzcHJpdi0+c2htaW5mby5zaG1hZGRyPWltZy0+ZGF0YT0oY2hhciopc2htYXQoZHNwcml2LT5zaG1pbmZvLnNobWlkLDAsMCk7Ci0KLSAgICBpZiAoaW1nLT5kYXRhID09IChjaGFyICopIC0xKSB7Ci0JRklYTUUoIkNvdWxkbid0IGF0dGFjaCBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgKGR1ZSB0byBYMTEgcmVtb3RlIGRpc3BsYXkgb3IgZmFpbHVyZSkuXG5SZXZlcnRpbmcgdG8gc3RhbmRhcmQgWCBpbWFnZXMgIVxuIik7Ci0JZGRwcml2LT54c2htX2FjdGl2ZSA9IDA7Ci0JVFNYRGVzdHJveUltYWdlKGltZyk7Ci0Jc2htY3RsKGRzcHJpdi0+c2htaW5mby5zaG1pZCwgSVBDX1JNSUQsIDApOwotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICBkc3ByaXYtPnNobWluZm8ucmVhZE9ubHkgPSBGYWxzZTsKLQotICAgIC8qIFRoaXMgaXMgd2hlcmUgdGhpbmdzIHN0YXJ0IHRvIGdldCB0cmlja2llci4uLi4KLSAgICAgKiBGaXJzdCwgd2UgZmx1c2ggdGhlIGN1cnJlbnQgWCBjb25uZWN0aW9ucyB0byBiZSBzdXJlIHRvIGNhdGNoIGFsbAotICAgICAqIG5vbi1YU2htIHJlbGF0ZWQgZXJyb3JzCi0gICAgICovCi0gICAgVFNYU3luYyhkaXNwbGF5LCBGYWxzZSk7Ci0gICAgLyogVGhlbiB3ZSBlbnRlciBpbiB0aGUgbm9uLXRocmVhZCBzYWZlIHBhcnQgb2YgdGhlIHRlc3RzICovCi0gICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLQotICAgIC8qIFJlc2V0IHRoZSBlcnJvciBmbGFnLCBzZXRzIG91ciBuZXcgZXJyb3IgaGFuZGxlciBhbmQgdHJ5IHRvIGF0dGFjaAotICAgICAqIHRoZSBzdXJmYWNlCi0gICAgICovCi0gICAgWFNobUVycm9yRmxhZyA9IDA7Ci0gICAgV2luZVhIYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcihYU2htRXJyb3JIYW5kbGVyKTsKLSAgICBYU2htQXR0YWNoKGRpc3BsYXksICYoZHNwcml2LT5zaG1pbmZvKSk7Ci0gICAgWFN5bmMoZGlzcGxheSwgRmFsc2UpOwotCi0gICAgLyogQ2hlY2sgdGhlIGVycm9yIGZsYWcgKi8KLSAgICBpZiAoWFNobUVycm9yRmxhZykgewotCS8qIEFuIGVycm9yIG9jY3VyZWQgKi8KLQlYRmx1c2goZGlzcGxheSk7Ci0JWFNobUVycm9yRmxhZyA9IDA7Ci0JWERlc3Ryb3lJbWFnZShpbWcpOwotCXNobWR0KGRzcHJpdi0+c2htaW5mby5zaG1hZGRyKTsKLQlzaG1jdGwoZHNwcml2LT5zaG1pbmZvLnNobWlkLCBJUENfUk1JRCwgMCk7Ci0JWFNldEVycm9ySGFuZGxlcihXaW5lWEhhbmRsZXIpOwotCi0JRklYTUUoIkNvdWxkbid0IGF0dGFjaCBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgdG8gWCBzZXJ2ZXIgKGR1ZSB0byBYMTEgcmVtb3RlIGRpc3BsYXkgb3IgZmFpbHVyZSkuXG5SZXZlcnRpbmcgdG8gc3RhbmRhcmQgWCBpbWFnZXMgIVxuIik7Ci0JZGRwcml2LT54c2htX2FjdGl2ZSA9IDA7Ci0KLQkvKiBMZWF2ZSB0aGUgY3JpdGljYWwgc2VjdGlvbiAqLwotCUxlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8qIEhlcmUsIHRvIGJlIFJFQUxMWSBzdXJlLCBJIHNob3VsZCBkbyBhIFhTaG1QdXRJbWFnZSB0byBjaGVjayBpZgotICAgICAqIHRoaXMgd29ya3MsIGJ1dCBpdCBtYXkgYmUgYSBiaXQgb3ZlcmtpbGwuLi4uCi0gICAgICovCi0gICAgWFNldEVycm9ySGFuZGxlcihXaW5lWEhhbmRsZXIpOwotICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0KLSAgICBzaG1jdGwoZHNwcml2LT5zaG1pbmZvLnNobWlkLCBJUENfUk1JRCwgMCk7Ci0KLSAgICBpZiAoVGhpcy0+ZC0+cGl4ZWxfY29udmVydCAhPSBOVUxMKSB7Ci0JaW50IGJwcCA9IFBGR0VUX0JQUChUaGlzLT5kLT5kaXJlY3RkcmF3X3BpeGVsZm9ybWF0KTsKLQlscGRzZi0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlID0gVmlydHVhbEFsbG9jKAotCSAgICBOVUxMLAotCSAgICBscGRzZi0+cy5zdXJmYWNlX2Rlc2MuZHdXaWR0aCAqCi0JICAgIGxwZHNmLT5zLnN1cmZhY2VfZGVzYy5kd0hlaWdodCAqCi0JICAgIGJwcCwKLQkgICAgTUVNX1JFU0VSVkUgfCBNRU1fQ09NTUlULAotCSAgICBQQUdFX1JFQURXUklURQotCSk7Ci0gICAgfSBlbHNlIHsKLQlscGRzZi0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlID0gaW1nLT5kYXRhOwotCVZpcnR1YWxBbGxvYyhpbWctPmRhdGEsIGltZy0+Ynl0ZXNfcGVyX2xpbmUgKiBpbWctPmhlaWdodCwgTUVNX1JFU0VSVkV8TUVNX1NZU1RFTSwgUEFHRV9SRUFEV1JJVEUpOwotICAgIH0KLSAgICByZXR1cm4gaW1nOwotfQotI2VuZGlmIC8qIEhBVkVfTElCWFhTSE0gKi8KLQotc3RhdGljIFhJbWFnZSAqY3JlYXRlX3hpbWFnZShJRGlyZWN0RHJhdzJJbXBsKiBUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCogbHBkc2YpIHsKLSAgICBYSW1hZ2UgKmltZyA9IE5VTEw7Ci0gICAgRERQUklWQVRFKFRoaXMpOwotICAgIHZvaWQgKmltZ19kYXRhOwotICAgIGludCBicHAgPSBQRkdFVF9CUFAoVGhpcy0+ZC0+ZGlyZWN0ZHJhd19waXhlbGZvcm1hdCk7Ci0gICAgaW50IHNjcmVlbl9icHAgPSBQRkdFVF9CUFAoVGhpcy0+ZC0+c2NyZWVuX3BpeGVsZm9ybWF0KTsKLQotI2lmZGVmIEhBVkVfTElCWFhTSE0KLSAgICBpZiAoZGRwcml2LT54c2htX2FjdGl2ZSkKLQlpbWcgPSBjcmVhdGVfeHNobWltYWdlKFRoaXMsIGxwZHNmKTsKLQotICAgIGlmIChpbWcgPT0gTlVMTCkgewotI2VuZGlmCi0gICAgLyogQWxsb2NhdGUgc3VyZmFjZSBtZW1vcnkgKi8KLQlscGRzZi0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlID0gVmlydHVhbEFsbG9jKAotCSAgICBOVUxMLAotCSAgICBscGRzZi0+cy5zdXJmYWNlX2Rlc2MuZHdXaWR0aCAqCi0JICAgIGxwZHNmLT5zLnN1cmZhY2VfZGVzYy5kd0hlaWdodCAqCi0JICAgIGJwcCwKLQkgICAgTUVNX1JFU0VSVkUgfCBNRU1fQ09NTUlULAotCSAgICBQQUdFX1JFQURXUklURQotCSk7Ci0KLQlpZiAoVGhpcy0+ZC0+cGl4ZWxfY29udmVydCAhPSBOVUxMKQotCSAgICBpbWdfZGF0YSA9IFZpcnR1YWxBbGxvYygKLQkJTlVMTCwKLQkJbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmR3V2lkdGggKgotCQlscGRzZi0+cy5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQgKgotCQlzY3JlZW5fYnBwLAotCQlNRU1fUkVTRVJWRSB8IE1FTV9DT01NSVQsCi0JCVBBR0VfUkVBRFdSSVRFCi0JICAgICk7Ci0gICAgICAgIGVsc2UKLQkgICAgaW1nX2RhdGEgPSBscGRzZi0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlOwotCi0JLyogSW4gdGhpcyBjYXNlLCBjcmVhdGUgYW4gWEltYWdlICovCi0JaW1nID0gVFNYQ3JlYXRlSW1hZ2UoZGlzcGxheSwKLQkgICAgRGVmYXVsdFZpc3VhbE9mU2NyZWVuKFgxMURSVl9HZXRYU2NyZWVuKCkpLAotCSAgICBUaGlzLT5kLT5waXhtYXBfZGVwdGgsCi0JICAgIFpQaXhtYXAsCi0JICAgIDAsCi0JICAgIGltZ19kYXRhLAotCSAgICBscGRzZi0+cy5zdXJmYWNlX2Rlc2MuZHdXaWR0aCwKLQkgICAgbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmR3SGVpZ2h0LAotCSAgICAzMiwKLQkgICAgbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmR3V2lkdGgqc2NyZWVuX2JwcAotCSk7Ci0jaWZkZWYgSEFWRV9MSUJYWFNITQotICAgIH0KLSNlbmRpZgotICAgIGlmIChUaGlzLT5kLT5waXhlbF9jb252ZXJ0ICE9IE5VTEwpCi0JbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmxQaXRjaCA9IGJwcCpscGRzZi0+cy5zdXJmYWNlX2Rlc2MuZHdXaWR0aDsKLSAgICBlbHNlCi0JbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmxQaXRjaCA9IGltZy0+Ynl0ZXNfcGVyX2xpbmU7Ci0gICAgcmV0dXJuIGltZzsKLX0KLQotI2lmZGVmIEhBVkVfWFZJREVPCi0jaWZkZWYgSEFWRV9MSUJYWFNITQotc3RhdGljIFh2SW1hZ2UgKmNyZWF0ZV94dnNobWltYWdlKElEaXJlY3REcmF3MkltcGwqIFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsKiBscGRzZikgewotICAgIERTUFJJVkFURShscGRzZik7Ci0gICAgRERQUklWQVRFKFRoaXMpOwotICAgIFh2SW1hZ2UgKmltZzsKLSAgICBpbnQgKCpXaW5lWEhhbmRsZXIpKERpc3BsYXkgKiwgWEVycm9yRXZlbnQgKik7Ci0KLSAgICBpbWcgPSBUU1h2U2htQ3JlYXRlSW1hZ2UoZGlzcGxheSwKLQkJCSAgICAgZGRwcml2LT5wb3J0X2lkLAotCQkJICAgICAoaW50KSBscGRzZi0+cy5zdXJmYWNlX2Rlc2MuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDLAotCQkJICAgICBOVUxMLAotCQkJICAgICBscGRzZi0+cy5zdXJmYWNlX2Rlc2MuZHdXaWR0aCwKLQkJCSAgICAgbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmR3SGVpZ2h0LAotCQkJICAgICAmKGRzcHJpdi0+c2htaW5mbykpOwotICAgIAotICAgIGlmIChpbWcgPT0gTlVMTCkgewotCUZJWE1FKCJDb3VsZG4ndCBjcmVhdGUgWFNobSBYdkltYWdlIChkdWUgdG8gWDExIHJlbW90ZSBkaXNwbGF5IG9yIGZhaWx1cmUpLlxuUmV2ZXJ0aW5nIHRvIHN0YW5kYXJkIFggaW1hZ2VzICFcbiIpOwotCWRkcHJpdi0+eHNobV9hY3RpdmUgPSAwOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGRzcHJpdi0+c2htaW5mby5zaG1pZCA9IHNobWdldCggSVBDX1BSSVZBVEUsIGltZy0+ZGF0YV9zaXplLCBJUENfQ1JFQVR8MDc3NyApOwotCi0gICAgaWYgKGRzcHJpdi0+c2htaW5mby5zaG1pZCA8IDApIHsKLQlGSVhNRSgiQ291bGRuJ3QgY3JlYXRlIHNoYXJlZCBtZW1vcnkgc2VnbWVudCAoZHVlIHRvIFgxMSByZW1vdGUgZGlzcGxheSBvciBmYWlsdXJlKS5cblJldmVydGluZyB0byBzdGFuZGFyZCBYIGltYWdlcyAhXG4iKTsKLQlkZHByaXYtPnhzaG1fYWN0aXZlID0gMDsKLQlUU1hGcmVlKGltZyk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZHNwcml2LT5zaG1pbmZvLnNobWFkZHI9aW1nLT5kYXRhPShjaGFyKilzaG1hdChkc3ByaXYtPnNobWluZm8uc2htaWQsMCwwKTsKLQotICAgIGlmIChpbWctPmRhdGEgPT0gKGNoYXIgKikgLTEpIHsKLQlGSVhNRSgiQ291bGRuJ3QgYXR0YWNoIHNoYXJlZCBtZW1vcnkgc2VnbWVudCAoZHVlIHRvIFgxMSByZW1vdGUgZGlzcGxheSBvciBmYWlsdXJlKS5cblJldmVydGluZyB0byBzdGFuZGFyZCBYIGltYWdlcyAhXG4iKTsKLQlkZHByaXYtPnhzaG1fYWN0aXZlID0gMDsKLQlUU1hGcmVlKGltZyk7Ci0Jc2htY3RsKGRzcHJpdi0+c2htaW5mby5zaG1pZCwgSVBDX1JNSUQsIDApOwotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICBkc3ByaXYtPnNobWluZm8ucmVhZE9ubHkgPSBGYWxzZTsKLQotICAgIC8qIFRoaXMgaXMgd2hlcmUgdGhpbmdzIHN0YXJ0IHRvIGdldCB0cmlja2llci4uLi4KLSAgICAgKiBGaXJzdCwgd2UgZmx1c2ggdGhlIGN1cnJlbnQgWCBjb25uZWN0aW9ucyB0byBiZSBzdXJlIHRvIGNhdGNoIGFsbAotICAgICAqIG5vbi1YU2htIHJlbGF0ZWQgZXJyb3JzCi0gICAgICovCi0gICAgVFNYU3luYyhkaXNwbGF5LCBGYWxzZSk7Ci0gICAgLyogVGhlbiB3ZSBlbnRlciBpbiB0aGUgbm9uLXRocmVhZCBzYWZlIHBhcnQgb2YgdGhlIHRlc3RzICovCi0gICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLQotICAgIC8qIFJlc2V0IHRoZSBlcnJvciBmbGFnLCBzZXRzIG91ciBuZXcgZXJyb3IgaGFuZGxlciBhbmQgdHJ5IHRvIGF0dGFjaAotICAgICAqIHRoZSBzdXJmYWNlCi0gICAgICovCi0gICAgWFNobUVycm9yRmxhZyA9IDA7Ci0gICAgV2luZVhIYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcihYU2htRXJyb3JIYW5kbGVyKTsKLSAgICBYU2htQXR0YWNoKGRpc3BsYXksICYoZHNwcml2LT5zaG1pbmZvKSk7Ci0gICAgWFN5bmMoZGlzcGxheSwgRmFsc2UpOwotCi0gICAgLyogQ2hlY2sgdGhlIGVycm9yIGZsYWcgKi8KLSAgICBpZiAoWFNobUVycm9yRmxhZykgewotCS8qIEFuIGVycm9yIG9jY3VyZWQgKi8KLQlYRmx1c2goZGlzcGxheSk7Ci0JWFNobUVycm9yRmxhZyA9IDA7Ci0JWEZyZWUoaW1nKTsKLQlzaG1kdChkc3ByaXYtPnNobWluZm8uc2htYWRkcik7Ci0Jc2htY3RsKGRzcHJpdi0+c2htaW5mby5zaG1pZCwgSVBDX1JNSUQsIDApOwotCVhTZXRFcnJvckhhbmRsZXIoV2luZVhIYW5kbGVyKTsKLQotCUZJWE1FKCJDb3VsZG4ndCBhdHRhY2ggc2hhcmVkIG1lbW9yeSBzZWdtZW50IHRvIFggc2VydmVyIChkdWUgdG8gWDExIHJlbW90ZSBkaXNwbGF5IG9yIGZhaWx1cmUpLlxuUmV2ZXJ0aW5nIHRvIHN0YW5kYXJkIFggaW1hZ2VzICFcbiIpOwotCWRkcHJpdi0+eHNobV9hY3RpdmUgPSAwOwotCi0JLyogTGVhdmUgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KLQlMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICAvKiBIZXJlLCB0byBiZSBSRUFMTFkgc3VyZSwgSSBzaG91bGQgZG8gYSBYU2htUHV0SW1hZ2UgdG8gY2hlY2sgaWYKLSAgICAgKiB0aGlzIHdvcmtzLCBidXQgaXQgbWF5IGJlIGEgYml0IG92ZXJraWxsLi4uLgotICAgICAqLwotICAgIFhTZXRFcnJvckhhbmRsZXIoV2luZVhIYW5kbGVyKTsKLSAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotCi0gICAgc2htY3RsKGRzcHJpdi0+c2htaW5mby5zaG1pZCwgSVBDX1JNSUQsIDApOwotCi0gICAgbHBkc2YtPnMuc3VyZmFjZV9kZXNjLnUxLmxwU3VyZmFjZSA9IGltZy0+ZGF0YTsKLSAgICBWaXJ0dWFsQWxsb2MoaW1nLT5kYXRhLCBpbWctPmRhdGFfc2l6ZSwgTUVNX1JFU0VSVkV8TUVNX1NZU1RFTSwgUEFHRV9SRUFEV1JJVEUpOwotCi0gICAgcmV0dXJuIGltZzsKLX0KLSNlbmRpZgotCi1zdGF0aWMgWHZJbWFnZSAqY3JlYXRlX3h2aW1hZ2UoSURpcmVjdERyYXcySW1wbCogVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNEltcGwqIGxwZHNmLCBIUkVTVUxUICplcnJfY29kZSkgewotICAgIFh2SW1hZ2UgKmltZyA9IE5VTEw7Ci0gICAgRERQUklWQVRFKFRoaXMpOwotICAgIHZvaWQgKmltZ19kYXRhOwotICAgIFh2SW1hZ2VGb3JtYXRWYWx1ZXMJKmZvOwotICAgIGludCBmb3JtYXRzLCBpOwotICAgIGludCBicHAgPSBQRkdFVF9CUFAobHBkc2YtPnMuc3VyZmFjZV9kZXNjLmRkcGZQaXhlbEZvcm1hdCk7Ci0gICAgCi0gICAgKmVycl9jb2RlID0gRERFUlJfT1VUT0ZWSURFT01FTU9SWTsKLSAgICAKLSAgICBpZiAoIShscGRzZi0+cy5zdXJmYWNlX2Rlc2MuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykpIHsKLSAgICAgIC8qIEhtbW0sIG92ZXJsYXkgd2l0aG91dCBGT1VSQ0MgY29kZS4uIEJhYWFhYWFkICovCi0gICAgICBFUlIoIk92ZXJsYXkgd2l0aG91dCBhIEZPVVJDQyBwaXhlbCBmb3JtYXQgIVxuIik7Ci0gICAgICAqZXJyX2NvZGUgPSBEREVSUl9JTlZBTElEUElYRUxGT1JNQVQ7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgICAKLSAgICAvKiBGaXJzdCwgZmluZCBvdXQgaWYgd2Ugc3VwcG9ydCB0aGlzIFBpeGVsRm9ybWF0LgotICAgICAgIEkgbWFrZSB0aGUgYXNzdW1wdGlvbiBoZXJlIHRoYXQgdGhlIGlkIG9mIHRoZSBYdkltYWdlIGZvcm1hdCBpcyB0aGUKLSAgICAgICBzYW1lIGFzIHRoZSBXaW5kb3dzIEZPVVJDQyBjb2RlLiAqLwotICAgIGZvID0gVFNYdkxpc3RJbWFnZUZvcm1hdHMoZGlzcGxheSwgZGRwcml2LT5wb3J0X2lkLCAmZm9ybWF0cyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGZvcm1hdHM7IGkrKykKLSAgICAgIGlmIChmb1tpXS5pZCA9PSBscGRzZi0+cy5zdXJmYWNlX2Rlc2MuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDKSBicmVhazsKLSAgICBpZiAoZm8pCi0gICAgICBUU1hGcmVlKGZvKTsKLSAgICAKLSAgICBpZiAoaSA9PSBmb3JtYXRzKSB7Ci0gICAgICBFUlIoIkZPVVJDQyBjb2RlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHZpZGVvIGNhcmQgIVxuIik7Ci0gICAgICAqZXJyX2NvZGUgPSBEREVSUl9JTlZBTElEUElYRUxGT1JNQVQ7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgCi0jaWZkZWYgSEFWRV9MSUJYWFNITQotICAgIGlmIChkZHByaXYtPnhzaG1fYWN0aXZlKQotCWltZyA9IGNyZWF0ZV94dnNobWltYWdlKFRoaXMsIGxwZHNmKTsKLQotICAgIGlmIChpbWcgPT0gTlVMTCkgewotI2VuZGlmCi0gICAgICAvKiBBbGxvY2F0ZSBzdXJmYWNlIG1lbW9yeSAqLwotICAgICAgbHBkc2YtPnMuc3VyZmFjZV9kZXNjLnUxLmxwU3VyZmFjZSA9Ci0JVmlydHVhbEFsbG9jKE5VTEwsCi0JCSAgICAgbHBkc2YtPnMuc3VyZmFjZV9kZXNjLmR3V2lkdGggKgotCQkgICAgIGxwZHNmLT5zLnN1cmZhY2VfZGVzYy5kd0hlaWdodCAqCi0JCSAgICAgYnBwLAotCQkgICAgIE1FTV9SRVNFUlZFIHwgTUVNX0NPTU1JVCwKLQkJICAgICBQQUdFX1JFQURXUklURSk7Ci0gICAgICBpbWdfZGF0YSA9IGxwZHNmLT5zLnN1cmZhY2VfZGVzYy51MS5scFN1cmZhY2U7Ci0KLSAgICAgIC8qIEluIHRoaXMgY2FzZSwgY3JlYXRlIGFuIFh2SW1hZ2UgKi8KLSAgICAgIGltZyA9IFRTWHZDcmVhdGVJbWFnZShkaXNwbGF5LAotCQkJICAgIGRkcHJpdi0+cG9ydF9pZCwKLQkJCSAgICAoaW50KSBscGRzZi0+cy5zdXJmYWNlX2Rlc2MuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDLAotCQkJICAgIGltZ19kYXRhLAotCQkJICAgIGxwZHNmLT5zLnN1cmZhY2VfZGVzYy5kd1dpZHRoLAotCQkJICAgIGxwZHNmLT5zLnN1cmZhY2VfZGVzYy5kd0hlaWdodCk7Ci0jaWZkZWYgSEFWRV9MSUJYWFNITQotICAgIH0KLSNlbmRpZgotICAgIGxwZHNmLT5zLnN1cmZhY2VfZGVzYy5sUGl0Y2ggPSAoKFh2SW1hZ2UgKikgaW1nKS0+cGl0Y2hlc1swXTsKLSAgICByZXR1cm4gaW1nOwotfQotI2Vsc2UKLXN0YXRpYyBYdkltYWdlICpjcmVhdGVfeHZpbWFnZShJRGlyZWN0RHJhdzJJbXBsKiBUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCogbHBkc2YsIEhSRVNVTFQgKmVycl9jb2RlKSB7Ci0gICplcnJfY29kZSA9IERERVJSX0lOVkFMSURQSVhFTEZPUk1BVDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLQotVUxPTkcgV0lOQVBJIFhsaWJfSURpcmVjdERyYXcySW1wbF9SZWxlYXNlKExQRElSRUNURFJBVzIgaWZhY2UpIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXcySW1wbCxpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIFRoaXMtPnJlZiApOwotCi0gICAgaWYgKCEtLShUaGlzLT5yZWYpKSB7Ci0JaWYgKCEtLShUaGlzLT5kLT5yZWYpKSB7Ci0JICAgIGlmIChUaGlzLT5kLT53aW5kb3cgJiYgR2V0UHJvcEEoVGhpcy0+ZC0+d2luZG93LGRkUHJvcCkpCi0JCURlc3Ryb3lXaW5kb3coVGhpcy0+ZC0+d2luZG93KTsKLQkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLFRoaXMtPmQpOwotCX0KLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcyk7Ci0JeGY4NnZtb2RlX3Jlc3RvcmUoKTsKLQlyZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgcmV0dXJuIFRoaXMtPnJlZjsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhsaWJfSURpcmVjdERyYXcySW1wbF9DcmVhdGVTdXJmYWNlKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFICpscGRzZiwKLSAgICBJVW5rbm93biAqbHB1bmsKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBkc3VyZjsKLSAgICB4MTFfZHNfcHJpdmF0ZQkqZHNwcml2OwotCi0gICAgVFJBQ0UoIiglcCktPkNyZWF0ZVN1cmZhY2UoJXAsJXAsJXApXG4iLCBUaGlzLGxwZGRzZCxscGRzZixscHVuayk7Ci0KLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSBfZHVtcF9zdXJmYWNlX2Rlc2MobHBkZHNkKTsKLQotICAgICpscGRzZiA9IEhlYXBBbGxvYygKLSAgICAJR2V0UHJvY2Vzc0hlYXAoKSwKLQlIRUFQX1pFUk9fTUVNT1JZLAotCXNpemVvZihJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKQotICAgICk7Ci0gICAgZHN1cmYgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCopKmxwZHNmOwotICAgIGRzdXJmLT5yZWYgICAgICAgICAgICAgICAgID0gMTsKLSAgICBkc3VyZi0+cHJpdmF0ZSA9IEhlYXBBbGxvYygKLQkgICAgR2V0UHJvY2Vzc0hlYXAoKSwKLQkgICAgSEVBUF9aRVJPX01FTU9SWSwKLQkgICAgc2l6ZW9mKHgxMV9kc19wcml2YXRlKQotICAgICk7Ci0gICAgSUNPTV9WVEJMKGRzdXJmKSA9IChJQ09NX1ZUQUJMRShJRGlyZWN0RHJhd1N1cmZhY2UpKikmeGxpYl9kZHM0dnQ7Ci0gICAgZHNwcml2ID0gKHgxMV9kc19wcml2YXRlKilkc3VyZi0+cHJpdmF0ZTsKLQotICAgIGRzdXJmLT5zLmRkcmF3CT0gVGhpczsKLSAgICBJRGlyZWN0RHJhdzJfQWRkUmVmKGlmYWNlKTsKLQotICAgIGRzdXJmLT5zLnBhbGV0dGUJPSBOVUxMOwotICAgIGRzdXJmLT5zLmxwQ2xpcHBlcgk9IE5VTEw7Ci0gICAgZHNwcml2LT5pc19vdmVybGF5ICA9IEZBTFNFOwotICAgIGRzcHJpdi0+aW5mby5pbWFnZQk9IE5VTEw7IC8qIFRoaXMgaXMgZm9yIG9mZi1zY3JlZW4gYnVmZmVycyAqLwotCi0gICAgLyogQ29weSB0aGUgc3VyZmFjZSBkZXNjcmlwdGlvbiAqLwotICAgIGRzdXJmLT5zLnN1cmZhY2VfZGVzYyA9ICpscGRkc2Q7Ci0KLSAgICBpZiAoIShscGRkc2QtPmR3RmxhZ3MgJiBERFNEX1dJRFRIKSkKLQlkc3VyZi0+cy5zdXJmYWNlX2Rlc2MuZHdXaWR0aCAgPSBUaGlzLT5kLT53aWR0aDsKLSAgICBpZiAoIShscGRkc2QtPmR3RmxhZ3MgJiBERFNEX0hFSUdIVCkpCi0JZHN1cmYtPnMuc3VyZmFjZV9kZXNjLmR3SGVpZ2h0ID0gVGhpcy0+ZC0+aGVpZ2h0OwotICAgIGRzdXJmLT5zLnN1cmZhY2VfZGVzYy5kd0ZsYWdzIHw9IEREU0RfV0lEVEh8RERTRF9IRUlHSFQ7Ci0KLSAgICAvKiBDaGVjayBpZiB0aGlzIGEgJ3ByaW1hcnkgc3VyZmFjZScgb3IgYW4gb3ZlcmxheSAqLwotICAgIGlmICgobHBkZHNkLT5kd0ZsYWdzICYgRERTRF9DQVBTKSAmJiAKLQkoKGxwZGRzZC0+ZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKSB8fAotCSAobHBkZHNkLT5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfT1ZFUkxBWSkpCi0gICAgKSB7Ci0JLyogQWRkIGZsYWdzIGlmIHRoZXJlIHdlcmUgbm90IHByZXNlbnQgKi8KLQlkc3VyZi0+cy5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX1dJRFRIfEREU0RfSEVJR0hUfEREU0RfUElUQ0h8RERTRF9MUFNVUkZBQ0V8RERTRF9QSVhFTEZPUk1BVDsKLQlkc3VyZi0+cy5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19WSURFT01FTU9SWTsKLQotCWlmIChscGRkc2QtPmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSkgewotCSAgZHN1cmYtPnMuc3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzIHw9IEREU0NBUFNfVklTSUJMRTsKLQkgIGRzdXJmLT5zLnN1cmZhY2VfZGVzYy5kZHBmUGl4ZWxGb3JtYXQgPSBUaGlzLT5kLT5kaXJlY3RkcmF3X3BpeGVsZm9ybWF0OwotCSAgZHN1cmYtPnMuc3VyZmFjZV9kZXNjLmR3V2lkdGggPSBUaGlzLT5kLT53aWR0aDsKLQkgIGRzdXJmLT5zLnN1cmZhY2VfZGVzYy5kd0hlaWdodCA9IFRoaXMtPmQtPmhlaWdodDsKLQl9IGVsc2UgewotCSAgZHNwcml2LT5pc19vdmVybGF5ID0gVFJVRTsKLQkgIC8qIEluIHRoZSBjYXNlIG9mIE92ZXJsYXkgc3VyZmFjZXMsIGNvcHkgdGhlIG9uZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gKi8KLQkgIGRzdXJmLT5zLnN1cmZhY2VfZGVzYy5kZHBmUGl4ZWxGb3JtYXQgPSBscGRkc2QtPmRkcGZQaXhlbEZvcm1hdDsKLQl9Ci0JCi0JaWYgKGxwZGRzZC0+ZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX09WRVJMQVkpIHsKLQkgIEhSRVNVTFQgZXJyX2NvZGU7Ci0JICBUUkFDRSgidXNpbmcgYW4gWHZJbWFnZSBmb3IgdGhlIG92ZXJsYXkgKCVwKVxuIiwgZHN1cmYpOwotCSAgZHNwcml2LT5pbmZvLm92ZXJsYXkuaW1hZ2UgPSBjcmVhdGVfeHZpbWFnZShUaGlzLChJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCopZHN1cmYsICZlcnJfY29kZSk7Ci0JICBpZiAoZHNwcml2LT5pbmZvLm92ZXJsYXkuaW1hZ2UgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGVycl9jb2RlOwotCX0gZWxzZSB7Ci0JICBUUkFDRSgidXNpbmcgc3RhbmRhcmQgWEltYWdlIGZvciBhIHByaW1hcnkgc3VyZmFjZSAoJXApXG4iLCBkc3VyZik7Ci0JICAvKiBDcmVhdGUgdGhlIFhJbWFnZSAqLwotCSAgZHNwcml2LT5pbmZvLmltYWdlID0gY3JlYXRlX3hpbWFnZShUaGlzLChJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCopZHN1cmYpOwotCSAgaWYgKGRzcHJpdi0+aW5mby5pbWFnZSA9PSBOVUxMKQotCSAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7Ci0JfQotCi0JLyogQ2hlY2sgZm9yIGJhY2tidWZmZXJzICovCi0JaWYgKGxwZGRzZC0+ZHdGbGFncyAmIEREU0RfQkFDS0JVRkZFUkNPVU5UKSB7Ci0JICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsKgliYWNrOwotCSAgICBpbnQJaTsKLQotCSAgICBmb3IgKGk9bHBkZHNkLT5kd0JhY2tCdWZmZXJDb3VudDtpLS07KSB7Ci0JCXgxMV9kc19wcml2YXRlICpic3ByaXY7Ci0JCWJhY2sgPSAoSURpcmVjdERyYXdTdXJmYWNlNEltcGwqKUhlYXBBbGxvYygKLQkJICAgIEdldFByb2Nlc3NIZWFwKCksCi0JCSAgICBIRUFQX1pFUk9fTUVNT1JZLAotCQkgICAgc2l6ZW9mKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsKQotCQkpOwotCQlUUkFDRSgiYWxsb2NhdGVkIGJhY2stYnVmZmVyICglcClcbiIsIGJhY2spOwotCi0JCUlEaXJlY3REcmF3Ml9BZGRSZWYoaWZhY2UpOwotCQliYWNrLT5zLmRkcmF3ID0gVGhpczsKLQkJCi0JCWJhY2stPnJlZiA9IDE7Ci0JCUlDT01fVlRCTChiYWNrKT0oSUNPTV9WVEFCTEUoSURpcmVjdERyYXdTdXJmYWNlNCkqKSZ4bGliX2RkczR2dDsKLQkJLyogQ29weSB0aGUgc3VyZmFjZSBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmcm9udCBidWZmZXIgKi8KLQkJYmFjay0+cy5zdXJmYWNlX2Rlc2MgPSBkc3VyZi0+cy5zdXJmYWNlX2Rlc2M7Ci0JCWJhY2stPnMuc3VyZmFjZV9kZXNjLnUxLmxwU3VyZmFjZSA9IE5VTEw7Ci0JCQotCQliYWNrLT5wcml2YXRlID0gSGVhcEFsbG9jKAotCQkgICAgR2V0UHJvY2Vzc0hlYXAoKSwKLQkJICAgIEhFQVBfWkVST19NRU1PUlksCi0JCSAgICBzaXplb2YoeDExX2RzX3ByaXZhdGUpCi0JCSk7Ci0JCWJzcHJpdiA9ICh4MTFfZHNfcHJpdmF0ZSopYmFjay0+cHJpdmF0ZTsKLQotCQkvKiBDcmVhdGUgdGhlIFhJbWFnZS4gKi8KLQkJaWYgKGxwZGRzZC0+ZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX09WRVJMQVkpIHsKLQkJICBIUkVTVUxUIGVycl9jb2RlOwotCQkgIGRzcHJpdi0+aXNfb3ZlcmxheSA9IFRSVUU7Ci0JCSAgYnNwcml2LT5pbmZvLm92ZXJsYXkuaW1hZ2UgPSBjcmVhdGVfeHZpbWFnZShUaGlzLCBiYWNrLCAmZXJyX2NvZGUpOwotCQkgIGlmIChic3ByaXYtPmluZm8ub3ZlcmxheS5pbWFnZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGVycl9jb2RlOwotCQl9IGVsc2UgewotCQkgIGJzcHJpdi0+aW5mby5pbWFnZSA9IGNyZWF0ZV94aW1hZ2UoVGhpcywgYmFjayk7Ci0JCSAgaWYgKGJzcHJpdi0+aW5mby5pbWFnZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOwotCQl9Ci0JCVRSQUNFKCJic3ByaXYgPSAlcFxuIixic3ByaXYpOwotCi0JCS8qIEFkZCByZWxldmFudCBpbmZvIHRvIGZyb250IGFuZCBiYWNrIGJ1ZmZlcnMgKi8KLQkJLyogRklYTUU6IGJhY2tidWZmZXIvZnJvbnRidWZmZXIgaGFuZGxpbmcgYnJva2VuIGhlcmUsIGJ1dAotCQkgKiB3aWxsIGJlIGZpeGVkIHVwIGluIF9GbGlwKCkuCi0JCSAqLwotCQlTRERTQ0FQUyhkc3VyZikgfD0gRERTQ0FQU19GUk9OVEJVRkZFUjsKLQkJU0REU0NBUFMoYmFjaykgfD0gRERTQ0FQU19CQUNLQlVGRkVSfEREU0NBUFNfVklERU9NRU1PUll8RERTQ0FQU19GTElQOwotCQliYWNrLT5zLnN1cmZhY2VfZGVzYy5kd0ZsYWdzICY9IH5ERFNEX0JBQ0tCVUZGRVJDT1VOVDsKLQkJU0REU0NBUFMoYmFjaykgJj0gfihERFNDQVBTX1ZJU0lCTEV8RERTQ0FQU19QUklNQVJZU1VSRkFDRSk7Ci0JCVRSQUNFKCJhdHRhY2hpbmcgc3VyZmFjZSAlcCB0byAlcFxuIixiYWNrLCpscGRzZik7Ci0JCUlEaXJlY3REcmF3U3VyZmFjZTRfQWRkQXR0YWNoZWRTdXJmYWNlKChMUERJUkVDVERSQVdTVVJGQUNFNCkoKmxwZHNmKSwoTFBESVJFQ1REUkFXU1VSRkFDRTQpYmFjayk7Ci0JICAgIH0KLQl9Ci0gICAgfSBlbHNlIHsKLQkvKiBUaGVyZSBpcyBubyBYbGliLXNwZWNpZmljIGNvZGUgaGVyZS4uLgotCSAqIEdvIHRvIHRoZSBjb21tb24gc3VyZmFjZSBjcmVhdGlvbiBmdW5jdGlvbgotCSAqLwotCXJldHVybiBjb21tb25fb2ZmX3NjcmVlbl9DcmVhdGVTdXJmYWNlKFRoaXMsZHN1cmYpOwotICAgIH0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLS8qIAotICogVGhlIFhsaWIgSW1wbGVtZW50YXRpb24gdHJpZXMgdG8gdXNlIHRoZSBwYXNzZWQgaHduZCBhcyBkcmF3aW5nIHdpbmRvdywKLSAqIGV2ZW4gd2hlbiB0aGUgYXBwcm9iaWF0ZSBiaXRtYXNrcyBhcmUgbm90IHNwZWNpZmllZC4KLSAqLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhsaWJfSURpcmVjdERyYXcySW1wbF9TZXRDb29wZXJhdGl2ZUxldmVsKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsSFdORCBod25kLERXT1JEIGNvb3BsZXZlbAotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICAgIEREUFJJVkFURShUaGlzKTsKLQotICAgIEZJWE1FKCIoJXApLT4oJTA4bHgsJTA4bHgpXG4iLFRoaXMsKERXT1JEKWh3bmQsY29vcGxldmVsKTsKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKQotCV9kdW1wX2Nvb3BlcmF0aXZlbGV2ZWwoY29vcGxldmVsKTsKLSAgICBUaGlzLT5kLT5tYWluV2luZG93ID0gaHduZDsKLQotICAgIC8qIFRoaXMgd2lsbCBiZSBvdmVyd3JpdHRlbiBpbiB0aGUgY2FzZSBvZiBGdWxsIFNjcmVlbiBtb2RlLgotICAgICAgIFdpbmRvd2VkIGdhbWVzIGNvdWxkIHdvcmsgd2l0aCB0aGF0IDotKSAqLwotICAgIGlmIChod25kKSB7Ci0JV05EICp0bXBXbmQgPSBXSU5fRmluZFduZFB0cihod25kKTsKLQlkZHByaXYtPmRyYXdhYmxlICA9IFgxMURSVl9XTkRfR2V0WFdpbmRvdyh0bXBXbmQpOwotCVdJTl9SZWxlYXNlV25kUHRyKHRtcFduZCk7Ci0KLQlpZiggIWRkcHJpdi0+ZHJhd2FibGUgKSB7Ci0JICAgIGRkcHJpdi0+ZHJhd2FibGUgPSAoKFgxMURSVl9XTkRfREFUQSAqKSBXSU5fR2V0RGVza3RvcCgpLT5wRHJpdmVyRGF0YSktPndpbmRvdzsKLQkgICAgV0lOX1JlbGVhc2VEZXNrdG9wKCk7Ci0JfQotCVRSQUNFKCJTZXR0aW5nIGRyYXdhYmxlIHRvICVsZFxuIiwgZGRwcml2LT5kcmF3YWJsZSk7Ci0gICAgfQotICAgIHJldHVybiBERF9PSzsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhsaWJfSURpcmVjdERyYXdJbXBsX1NldERpc3BsYXlNb2RlKAotICAgIExQRElSRUNURFJBVyBpZmFjZSxEV09SRCB3aWR0aCxEV09SRCBoZWlnaHQsRFdPUkQgZGVwdGgKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0ltcGwsaWZhY2UpOwotICAgIEREUFJJVkFURShUaGlzKTsKLSAgICBjaGFyCWJ1ZlsyMDBdOwotICAgIFdORCAqdG1wV25kOwotICAgIGludCBjOwotCi0gICAgVFJBQ0UoIiglcCktPlNldERpc3BsYXlNb2RlKCVsZCwlbGQsJWxkKVxuIiwKLQkJICBUaGlzLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7Ci0KLSAgICBzd2l0Y2ggKChjID0gX2NvbW1vbl9kZXB0aF90b19waXhlbGZvcm1hdChkZXB0aCxpZmFjZSkpKSB7Ci0gICAgY2FzZSAtMjoKLSAgICAgIHNwcmludGYoYnVmLCJTZXREaXNwbGF5TW9kZSh3PSVsZCxoPSVsZCxkPSVsZCksIHVuc3VwcG9ydGVkIGRlcHRoISIsd2lkdGgsaGVpZ2h0LGRlcHRoKTsKLSAgICAgIE1lc3NhZ2VCb3hBKDAsYnVmLCJXSU5FIERpcmVjdERyYXciLE1CX09LfE1CX0lDT05TVE9QKTsKLSAgICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRE1PREU7Ci0gICAgY2FzZSAtMToKLSAgICAgIC8qIE5vIGNvbnZlcnNpb24uIEdvb2QuICovCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRFBSSU5URigiRGlyZWN0RHJhdyB3YXJuaW5nOiBydW5uaW5nIGluIGRlcHRoLWNvbnZlcnNpb24gbW9kZSAlZC4gU2hvdWxkIHJ1biB1c2luZyBhICVsZCBkZXB0aCBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZXMuXG4iLCBjLGRlcHRoKTsKLSAgICB9Ci0JCi0gICAgVGhpcy0+ZC0+d2lkdGgJPSB3aWR0aDsKLSAgICBUaGlzLT5kLT5oZWlnaHQJPSBoZWlnaHQ7Ci0KLSAgICBfY29tbW9uX0lEaXJlY3REcmF3SW1wbF9TZXREaXNwbGF5TW9kZShUaGlzKTsKLQotICAgIHhmODZ2bW9kZV9zZXRkaXNwbGF5bW9kZSh3aWR0aCxoZWlnaHQpOwotCi0gICAgdG1wV25kID0gV0lOX0ZpbmRXbmRQdHIoVGhpcy0+ZC0+d2luZG93KTsKLSAgICBUaGlzLT5kLT5wYWludGFibGUgPSAxOwotICAgIGRkcHJpdi0+ZHJhd2FibGUgID0gKChYMTFEUlZfV05EX0RBVEEgKikgdG1wV25kLT5wRHJpdmVyRGF0YSktPndpbmRvdzsKLSAgICBXSU5fUmVsZWFzZVduZFB0cih0bXBXbmQpOwotCi0gICAgLyogV2UgZG9uJ3QgaGF2ZSBhIGNvbnRleHQgZm9yIHRoaXMgd2luZG93LiBIb3N0IG9mZiB0aGUgZGVza3RvcCAqLwotICAgIGlmKCAhZGRwcml2LT5kcmF3YWJsZSApCi0gICAgewotICAgICAgIGRkcHJpdi0+ZHJhd2FibGUgPSAoKFgxMURSVl9XTkRfREFUQSAqKSBXSU5fR2V0RGVza3RvcCgpLT5wRHJpdmVyRGF0YSktPndpbmRvdzsKLQlXSU5fUmVsZWFzZURlc2t0b3AoKTsKLSAgICB9Ci0gICAgVFJBQ0UoIlNldHRpbmcgZHJhd2FibGUgdG8gJWxkXG4iLCBkZHByaXYtPmRyYXdhYmxlKTsKLQotICAgIGlmIChnZXRfb3B0aW9uKCAiRFhHcmFiIiwgMCApKSB7Ci0JLyogQ29uZmluZSBjdXJzb3IgbW92ZW1lbnQgKHJpc2t5LCBidXQgdGhlIHVzZXIgYXNrZWQgZm9yIGl0KSAqLwotCVRTWEdyYWJQb2ludGVyKGRpc3BsYXksIGRkcHJpdi0+ZHJhd2FibGUsIFRydWUsIDAsIEdyYWJNb2RlQXN5bmMsIEdyYWJNb2RlQXN5bmMsIGRkcHJpdi0+ZHJhd2FibGUsIE5vbmUsIEN1cnJlbnRUaW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbGxfY2FwcyhMUEREQ0FQUyBjYXBzLCB4MTFfZGRfcHJpdmF0ZSAqeDExZGRwKSB7Ci0gIC8qIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gZmlsbCB0aGUgY2FwYWJpbGl0aWVzIG9mIFdpbmUncyBERHJhdyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgTmVlZCB0byBiZSBmaXhlZCwgdGhvdWdoLi4gKi8KLSAgaWYgKGNhcHMgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgY2Fwcy0+ZHdTaXplID0gc2l6ZW9mKCpjYXBzKTsKLSAgY2Fwcy0+ZHdDYXBzID0gRERDQVBTX0FMUEhBIHwgRERDQVBTX0JMVCB8IEREQ0FQU19CTFRTVFJFVENIIHwgRERDQVBTX0JMVENPTE9SRklMTCB8IEREQ0FQU19CTFRERVBUSEZJTEwgfCBERENBUFNfQ0FOQkxUU1lTTUVNIHwgIEREQ0FQU19DT0xPUktFWSB8IEREQ0FQU19QQUxFVFRFIC8qfCBERENBUFNfTk9IQVJEV0FSRSovOwotICBjYXBzLT5kd0NhcHMyID0gRERDQVBTMl9DRVJUSUZJRUQgfCBERENBUFMyX05PUEFHRUxPQ0tSRVFVSVJFRCB8IEREQ0FQUzJfV0lERVNVUkZBQ0VTOwotICBjYXBzLT5kd0NLZXlDYXBzID0gMHhGRkZGRkZGRjsgLyogU2hvdWxkIHB1dCByZWFsIGNhcHMgaGVyZSBvbmUgZGF5Li4uICovCi0gIGNhcHMtPmR3RlhDYXBzID0gMDsKLSAgY2Fwcy0+ZHdGWEFscGhhQ2FwcyA9IDA7Ci0gIGNhcHMtPmR3UGFsQ2FwcyA9IEREUENBUFNfOEJJVCB8IEREUENBUFNfQUxMT1cyNTY7Ci0gIGNhcHMtPmR3U1ZDYXBzID0gMDsKLSAgY2Fwcy0+ZHdaQnVmZmVyQml0RGVwdGhzID0gRERCRF8xNjsKLSAgLyogSSBwdXQgaGVyZSA4IE1vIHNvIHRoYXQgRDNEIGFwcGxpY2F0aW9ucyB3aWxsIGJlbGlldmUgdGhleSBoYXZlIGVub3VnaCBtZW1vcnkKLSAgICAgdG8gcHV0IHRleHR1cmVzIGluIHZpZGVvIG1lbW9yeS4KLSAgICAgQlRXLCBpcyB0aGlzIG9ubHkgZnJhbWUgYnVmZmVyIG1lbW9yeSBvciBhbHNvIHRleHR1cmUgbWVtb3J5IChmb3IgVm9vZG9vIGJvYXJkcwotICAgICBmb3IgZXhhbXBsZSkgPyAqLwotICBjYXBzLT5kd1ZpZE1lbVRvdGFsID0gODE5MiAqIDEwMjQ7Ci0gIGNhcHMtPmR3VmlkTWVtRnJlZSA9IDgxOTIgKiAxMDI0OwotICAvKiBUaGVzZSBhcmUgYWxsIHRoZSBzdXBwb3J0ZWQgY2FwYWJpbGl0aWVzIG9mIHRoZSBzdXJmYWNlcyAqLwotICBjYXBzLT5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfQUxQSEEgfCBERFNDQVBTX0JBQ0tCVUZGRVIgfCBERFNDQVBTX0NPTVBMRVggfCBERFNDQVBTX0ZMSVAgfAotICAgIEREU0NBUFNfRlJPTlRCVUZGRVIgfCBERFNDQVBTX0xPQ0FMVklETUVNIHwgRERTQ0FQU19OT05MT0NBTFZJRE1FTSB8IEREU0NBUFNfT0ZGU0NSRUVOUExBSU4gfAotICAgICAgRERTQ0FQU19QQUxFVFRFIHwgRERTQ0FQU19QUklNQVJZU1VSRkFDRSB8IEREU0NBUFNfU1lTVEVNTUVNT1JZIHwKLQlERFNDQVBTX1ZJREVPTUVNT1JZIHwgRERTQ0FQU19WSVNJQkxFOwotI2lmZGVmIEhBVkVfT1BFTkdMCi0gIGNhcHMtPmR3Q2FwcyB8PSBERENBUFNfM0QgfCBERENBUFNfWkJMVFM7Ci0gIGNhcHMtPmR3Q2FwczIgfD0gIEREQ0FQUzJfTk8yRERVUklORzNEU0NFTkU7Ci0gIGNhcHMtPmRkc0NhcHMuZHdDYXBzIHw9IEREU0NBUFNfM0RERVZJQ0UgfCBERFNDQVBTX01JUE1BUCB8IEREU0NBUFNfVEVYVFVSRSB8IEREU0NBUFNfWkJVRkZFUjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9YVklERU8KLSAgaWYgKHgxMWRkcC0+eHZpZGVvX2FjdGl2ZSkgewotICAgIGNhcHMtPmR3Q2FwcyB8PSBERENBUFNfT1ZFUkxBWSB8IEREQ0FQU19PVkVSTEFZRk9VUkNDIHwgRERDQVBTX09WRVJMQVlTVFJFVENIIHwgRERDQVBTX0JMVEZPVVJDQzsKLSAgICBjYXBzLT5kd0NhcHMyIHw9IEREQ0FQUzJfVklERU9QT1JUOwotICAgIGNhcHMtPmR3TWF4VmlzaWJsZU92ZXJsYXlzID0gMTY7Ci0gICAgY2Fwcy0+ZHdDdXJyVmlzaWJsZU92ZXJsYXlzID0gMDsKLSAgICBjYXBzLT5kd01pbk92ZXJsYXlTdHJldGNoID0gMTsgLyogQXBwYXJlbnRseSB0aGVyZSBpcyBubyAnZG93bicgc3RyZXRjaGluZyBpbiBYVmlkZW8sIGJ1dCB3ZWxsLCBXaW5kb3dzCi0JCQkJICAgICAgTWVkaWEgcGxheWVyIHJlZnVzZXMgdG8gd29yayB3aGVuIEkgcHV0IDEwMDAgaGVyZSA6LS8gKi8KLSAgICBjYXBzLT5kd01heE92ZXJsYXlTdHJldGNoID0gMTAwMDAwOyAvKiBUaGlzIGlzIGEgJ2JvZ3VzJyB2YWx1ZSwgSSBkbyBub3Qga25vdyB0aGUgbWF4aW11bSBzdHJldGNoaW5nICovCi0gICAgVFNYdkxpc3RJbWFnZUZvcm1hdHMoZGlzcGxheSwgeDExZGRwLT5wb3J0X2lkLCAodW5zaWduZWQgaW50ICopICYoY2Fwcy0+ZHdOdW1Gb3VyQ0NDb2RlcykpOwotICAgIGNhcHMtPmRkc0NhcHMuZHdDYXBzIHw9IEREU0NBUFNfT1ZFUkxBWTsKLSAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3MkltcGxfR2V0Q2FwcygKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLExQRERDQVBTIGNhcHMxLExQRERDQVBTIGNhcHMyCi0pICB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICAgIEREUFJJVkFURShUaGlzKTsKLSAgICBUUkFDRSgiKCVwKS0+R2V0Q2FwcyglcCwlcClcbiIsVGhpcyxjYXBzMSxjYXBzMik7Ci0KLSAgICAvKiBQdXQgdGhlIHNhbWUgY2FwcyBmb3IgdGhlIHR3byBjYXBhYmlsaXRpZXMgKi8KLSAgICBmaWxsX2NhcHMoY2FwczEsIGRkcHJpdik7Ci0gICAgZmlsbF9jYXBzKGNhcHMyLCBkZHByaXYpOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVBhbGV0dGUoCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSxEV09SRCBkd0ZsYWdzLExQUEFMRVRURUVOVFJZIHBhbGVudCwKLSAgICBMUERJUkVDVERSQVdQQUxFVFRFICpscGRkcGFsLExQVU5LTk9XTiBscHVuawotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqKiBpbHBkZHBhbD0oSURpcmVjdERyYXdQYWxldHRlSW1wbCoqKWxwZGRwYWw7Ci0gICAgaW50IHhzaXplOwotICAgIEhSRVNVTFQgcmVzOwotCi0gICAgVFJBQ0UoIiglcCktPiglMDhseCwlcCwlcCwlcClcbiIsVGhpcyxkd0ZsYWdzLHBhbGVudCxpbHBkZHBhbCxscHVuayk7Ci0gICAgcmVzID0gY29tbW9uX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlUGFsZXR0ZShUaGlzLGR3RmxhZ3MscGFsZW50LGlscGRkcGFsLGxwdW5rLCZ4c2l6ZSk7Ci0gICAgaWYgKHJlcyAhPSAwKQotCXJldHVybiByZXM7Ci0gICAgKCppbHBkZHBhbCktPnByaXZhdGUgPSBIZWFwQWxsb2MoCi0JR2V0UHJvY2Vzc0hlYXAoKSwKLQlIRUFQX1pFUk9fTUVNT1JZLAotCXNpemVvZih4MTFfZHBfcHJpdmF0ZSkKLSAgICApOwotICAgIElDT01fVlRCTCgqaWxwZGRwYWwpID0gJnhsaWJfZGRwYWx2dDsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3MkltcGxfUXVlcnlJbnRlcmZhY2UoCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXcySW1wbCxpZmFjZSk7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmVmaWlkKSxvYmopOwotICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSVVua25vd24sIHJlZmlpZCApICkgewotCSpvYmogPSBUaGlzOwotCUlEaXJlY3REcmF3Ml9BZGRSZWYoaWZhY2UpOwotCi0JVFJBQ0UoIiAgQ3JlYXRpbmcgSVVua25vd24gaW50ZXJmYWNlICglcClcbiIsICpvYmopOwotCQotCXJldHVybiBTX09LOwotICAgIH0KLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3LCByZWZpaWQgKSApIHsKLQlJRGlyZWN0RHJhd0ltcGwJKmRkID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoKmRkKSk7Ci0JSURpcmVjdERyYXcyX0FkZFJlZihpZmFjZSk7Ci0KLQlkZC0+cmVmID0gMTtJQ09NX1ZUQkwoZGQpID0gJnhsaWJfZGR2dDtkZC0+ZCA9IFRoaXMtPmQ7VGhpcy0+ZC0+cmVmKys7Ci0JKm9iaiA9IGRkOwotCi0JVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdERyYXcgaW50ZXJmYWNlICglcClcbiIsICpvYmopOwotCXJldHVybiBTX09LOwotICAgIH0KLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3MiwgcmVmaWlkICkgKSB7Ci0JSURpcmVjdERyYXcySW1wbCAqZGQgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZigqZGQpKTsKLQlJRGlyZWN0RHJhdzJfQWRkUmVmKGlmYWNlKTsKLQotCWRkLT5yZWYgPSAxO0lDT01fVlRCTChkZCkgPSAmeGxpYl9kZDJ2dDtkZC0+ZCA9IFRoaXMtPmQ7VGhpcy0+ZC0+cmVmKys7Ci0JKm9iaiA9IGRkOwotCi0JVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdERyYXcyIGludGVyZmFjZSAoJXApXG4iLCAqb2JqKTsKLQlyZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhdzQsIHJlZmlpZCApICkgewotCUlEaXJlY3REcmF3NEltcGwgKmRkID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoKmRkKSk7Ci0JZGQtPnJlZiA9IDE7SUNPTV9WVEJMKGRkKSA9ICZ4bGliX2RkNHZ0O2RkLT5kID0gVGhpcy0+ZDtUaGlzLT5kLT5yZWYrKzsKLQkqb2JqID0gZGQ7Ci0KLQlJRGlyZWN0RHJhdzRfQWRkUmVmKGlmYWNlKTsKLQlUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0RHJhdzQgaW50ZXJmYWNlICglcClcbiIsICpvYmopOwotCXJldHVybiBTX09LOwotICAgIH0KLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3NywgcmVmaWlkICkgKSB7Ci0JSURpcmVjdERyYXc0SW1wbCAqZGQgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZigqZGQpKTsKLQlkZC0+cmVmID0gMTtJQ09NX1ZUQkwoZGQpID0gKElDT01fVlRBQkxFKElEaXJlY3REcmF3NCkqKSZ4bGliX2RkN3Z0O2RkLT5kID0gVGhpcy0+ZDtUaGlzLT5kLT5yZWYrKzsKLQkqb2JqID0gZGQ7Ci0KLQlJRGlyZWN0RHJhdzdfQWRkUmVmKGlmYWNlKTsKLQlGSVhNRSgiICBDcmVhdGluZyBJRGlyZWN0RHJhdzcgaW50ZXJmYWNlIGJ5IHJldXNpbmcgRGlyZWN0RHJhdzQhKCVwKVxuIiwgKm9iaik7Ci0JcmV0dXJuIFNfT0s7Ci0gICAgfQotI2lmZGVmIEhBVkVfT1BFTkdMCi0gICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0QsIHJlZmlpZCApICkKLQlyZXR1cm4gY3JlYXRlX2RpcmVjdDNkKG9iaixUaGlzKTsKLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRDIsIHJlZmlpZCApICkKLQlyZXR1cm4gY3JlYXRlX2RpcmVjdDNkMihvYmosVGhpcyk7Ci0gICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0QzLCByZWZpaWQgKSApIAotICAgICAgICByZXR1cm4gY3JlYXRlX2RpcmVjdDNkMyhvYmosVGhpcyk7Ci0jZWxzZQotICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNELCByZWZpaWQgKSB8fAotICAgICAgICAgSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEMiwgcmVmaWlkICkgfHwKLSAgICAgICAgIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRDMsIHJlZmlpZCApCi0gICAgICAgKQotICAgIHsKLSAgICAgICBFUlIoICJDYW5ub3QgcHJvdmlkZSAzRCBzdXBwb3J0IHdpdGhvdXQgT3BlbkdML01lc2EgaW5zdGFsbGVkXG4iICk7Ci0gICAgfSAKLSNlbmRpZgotICAgIEZJWE1FKCIoJXApOmludGVyZmFjZSBmb3IgSUlEICVzIF9OT1RfIGZvdW5kIVxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmVmaWlkKSk7Ci0gICAgcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhdzJJbXBsX0VudW1EaXNwbGF5TW9kZXMoCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSxEV09SRCBkd0ZsYWdzLExQRERTVVJGQUNFREVTQyBscGRkc2ZkLExQVk9JRCBjb250ZXh0LExQRERFTlVNTU9ERVNDQUxMQkFDSyBtb2Rlc2NiCi0pIHsKLSAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICBYVmlzdWFsSW5mbyAqdmk7Ci0gIFhQaXhtYXBGb3JtYXRWYWx1ZXMgKnBmOwotICBYVmlzdWFsSW5mbyB2dDsKLSAgaW50IHhicHAgPSAxLCBudmlzdWFscywgbnBpeG1hcCwgaSwgZW11OwotICBpbnQgaGFzX21vZGVbXSAgPSB7IDAsICAwLCAgMCwgIDAgfTsKLSAgaW50IGhhc19kZXB0aFtdID0geyA4LCAxNSwgMTYsIDI0IH07Ci0gIEREU1VSRkFDRURFU0MJZGRzZmQ7Ci0gIHN0YXRpYyBzdHJ1Y3QgewotCWludCB3LGg7Ci0gIH0gbW9kZXNbXSA9IHsgLyogc29tZSBvZiB0aGUgdXN1YWwgbW9kZXMgKi8KLQl7NTEyLDM4NH0sCi0JezY0MCw0MDB9LAotCXs2NDAsNDgwfSwKLQl7ODAwLDYwMH0sCi0JezEwMjQsNzY4fSwKLQl7MTI4MCwxMDI0fQotICB9OwotICBEV09SRCBtYXhXaWR0aCwgbWF4SGVpZ2h0OwotCi0gIFRSQUNFKCIoJXApLT4oMHglMDhseCwlcCwlcCwlcClcbiIsVGhpcyxkd0ZsYWdzLGxwZGRzZmQsY29udGV4dCxtb2Rlc2NiKTsKLSAgZGRzZmQuZHdTaXplID0gc2l6ZW9mKGRkc2ZkKTsKLSAgZGRzZmQuZHdGbGFncyA9IEREU0RfSEVJR0hUfEREU0RfV0lEVEh8RERTRF9QSVhFTEZPUk1BVHxERFNEX0NBUFN8RERTRF9QSVRDSDsKLSAgaWYgKGR3RmxhZ3MgJiBEREVETV9SRUZSRVNIUkFURVMpIHsKLSAgICBkZHNmZC5kd0ZsYWdzIHw9IEREU0RfUkVGUkVTSFJBVEU7Ci0gICAgZGRzZmQudS5kd1JlZnJlc2hSYXRlID0gNjA7Ci0gIH0KLSAgbWF4V2lkdGggPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKLSAgbWF4SGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7Ci0gIAotICB2aSA9IFRTWEdldFZpc3VhbEluZm8oZGlzcGxheSwgVmlzdWFsTm9NYXNrLCAmdnQsICZudmlzdWFscyk7Ci0gIHBmID0gVFNYTGlzdFBpeG1hcEZvcm1hdHMoZGlzcGxheSwgJm5waXhtYXApOwotCi0gIGkgPSAwOwotICBlbXUgPSAwOwotICB3aGlsZSAoKGkgPCBucGl4bWFwKSB8fCAoZW11ICE9IDQpKSB7Ci0gICAgaW50IG1vZGVfaW5kZXggPSAwOwotICAgIGludCBzZW5kX21vZGUgPSAwOwotICAgIGludCBqOwotCi0gICAgaWYgKGkgPCBucGl4bWFwKSB7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JaWYgKGhhc19kZXB0aFtqXSA9PSBwZltpXS5kZXB0aCkgewotCSAgbW9kZV9pbmRleCA9IGo7Ci0JICBicmVhazsKLQl9Ci0gICAgICB9Ci0gICAgICBpZiAoaiA9PSA0KSB7Ci0JaSsrOwotCWNvbnRpbnVlOwotICAgICAgfQotICAgICAgCi0KLSAgICAgIGlmIChoYXNfbW9kZVttb2RlX2luZGV4XSA9PSAwKSB7Ci0JaWYgKG1vZGVfaW5kZXggPT0gMCkgewotCSAgc2VuZF9tb2RlID0gMTsKLQotCSAgZGRzZmQuZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX1BBTEVUVEU7Ci0JICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQuZHdTaXplID0gc2l6ZW9mKGRkc2ZkLmRkcGZQaXhlbEZvcm1hdCk7Ci0JICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyA9IEREUEZfUkdCfEREUEZfUEFMRVRURUlOREVYRUQ4OwotCSAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDID0gMDsKLQkgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51LmR3UkdCQml0Q291bnQgPSA4OwotCSAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkJpdE1hc2sgPSAwOwotCSAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUyLmR3R0JpdE1hc2sgPSAwOwotCSAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUzLmR3QkJpdE1hc2sgPSAwOwotCSAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnU0LmR3UkdCQWxwaGFCaXRNYXNrPSAwOwotCi0JICB4YnBwID0gMTsKLQkgIAotCSAgaGFzX21vZGVbbW9kZV9pbmRleF0gPSAxOwotCX0gZWxzZSB7Ci0JICAvKiBBbGwgdGhlICd0cnVlIGNvbG9yJyBkZXB0aHMgKDE1LCAxNiBhbmQgMjQpCi0JICAgICBGaXJzdCwgZmluZCB0aGUgY29ycmVzcG9uZGluZyB2aXN1YWwgdG8gZXh0cmFjdCB0aGUgYml0IG1hc2tzICovCi0JICBmb3IgKGogPSAwOyBqIDwgbnZpc3VhbHM7IGorKykgewotCSAgICBpZiAodmlbal0uZGVwdGggPT0gcGZbaV0uZGVwdGgpIHsKLQkgICAgICBkZHNmZC5kZHNDYXBzLmR3Q2FwcyA9IDA7Ci0JICAgICAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LmR3U2l6ZSA9IHNpemVvZihkZHNmZC5kZHBmUGl4ZWxGb3JtYXQpOwotCSAgICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID0gRERQRl9SR0I7Ci0JICAgICAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LmR3Rm91ckNDID0gMDsKLQkgICAgICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50ID0gcGZbaV0uYml0c19wZXJfcGl4ZWw7Ci0JICAgICAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkJpdE1hc2sgPSB2aVtqXS5yZWRfbWFzazsKLQkgICAgICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTIuZHdHQml0TWFzayA9IHZpW2pdLmdyZWVuX21hc2s7Ci0JICAgICAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUzLmR3QkJpdE1hc2sgPSB2aVtqXS5ibHVlX21hc2s7Ci0JICAgICAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnU0LmR3UkdCQWxwaGFCaXRNYXNrPSAwOwotCi0JICAgICAgeGJwcCA9IHBmW2ldLmJpdHNfcGVyX3BpeGVsLzg7Ci0KLQkgICAgICBzZW5kX21vZGUgPSAxOwotCQkgIGhhc19tb2RlW21vZGVfaW5kZXhdID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgfQotCSAgaWYgKGogPT0gbnZpc3VhbHMpCi0JICAgIFdBUk4oIkRpZCBub3QgZmluZCB2aXN1YWwgY29ycmVzcG9uZGluZyB0byB0aGUgcGl4bWFwIGZvcm1hdCAhXG4iKTsKLQl9Ci0gICAgICB9Ci0gICAgICBpKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE5vdyB0byBlbXVsYXRlZCBtb2RlcyAqLwotICAgICAgaWYgKGhhc19tb2RlW2VtdV0gPT0gMCkgewotCWludCBjOwotCWludCBsOwotCWludCBkZXB0aCA9IGhhc19kZXB0aFtlbXVdOwotICAgICAgCi0JZm9yIChjID0gMDsgKGMgPCBzaXplb2YoTW9kZUVtdWxhdGlvbnMpIC8gc2l6ZW9mKENvbnZlcnQpKSAmJiAoc2VuZF9tb2RlID09IDApOyBjKyspIHsKLQkgIGlmIChNb2RlRW11bGF0aW9uc1tjXS5kZXN0LmRlcHRoID09IGRlcHRoKSB7Ci0JICAgIC8qIEZvdW5kIGFuIGVtdWxhdGlvbiBmdW5jdGlvbiwgbm93IHRyaWVzIHRvIGZpbmQgYSBtYXRjaGluZyB2aXN1YWwgLyBwaXhlbCBmb3JtYXQgcGFpciAqLwotCSAgICBmb3IgKGwgPSAwOyAobCA8IG5waXhtYXApICYmIChzZW5kX21vZGUgPT0gMCk7IGwrKykgewotCSAgICAgIGlmICgocGZbbF0uZGVwdGggPT0gTW9kZUVtdWxhdGlvbnNbY10uc2NyZWVuLmRlcHRoKSAmJgotCQkgIChwZltsXS5iaXRzX3Blcl9waXhlbCA9PSBNb2RlRW11bGF0aW9uc1tjXS5zY3JlZW4uYnBwKSkgewotCQlpbnQgajsKLQkJZm9yIChqID0gMDsgKGogPCBudmlzdWFscykgJiYgKHNlbmRfbW9kZSA9PSAwKTsgaisrKSB7Ci0JCSAgaWYgKCh2aVtqXS5kZXB0aCA9PSBwZltsXS5kZXB0aCkgJiYKLQkJICAgICAgKHZpW2pdLnJlZF9tYXNrID09IE1vZGVFbXVsYXRpb25zW2NdLnNjcmVlbi5ybWFzaykgJiYKLQkJICAgICAgKHZpW2pdLmdyZWVuX21hc2sgPT0gTW9kZUVtdWxhdGlvbnNbY10uc2NyZWVuLmdtYXNrKSAmJgotCQkgICAgICAodmlbal0uYmx1ZV9tYXNrID09IE1vZGVFbXVsYXRpb25zW2NdLnNjcmVlbi5ibWFzaykpIHsKLQkJICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC5kd1NpemUgPSBzaXplb2YoZGRzZmQuZGRwZlBpeGVsRm9ybWF0KTsKLQkJICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC5kd0ZvdXJDQyA9IDA7Ci0JCSAgICBpZiAoZGVwdGggPT0gOCkgewotCQkgICAgICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyA9IEREUEZfUkdCfEREUEZfUEFMRVRURUlOREVYRUQ4OwotCQkgICAgICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50ID0gODsKLQkJICAgICAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkJpdE1hc2sgPSAwOwotCQkgICAgICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTIuZHdHQml0TWFzayA9IDA7Ci0JCSAgICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51My5kd0JCaXRNYXNrID0gMDsKLQkJICAgIH0gZWxzZSB7Ci0JCSAgICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC5kd0ZsYWdzID0gRERQRl9SR0I7Ci0JCSAgICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51LmR3UkdCQml0Q291bnQgPSBNb2RlRW11bGF0aW9uc1tjXS5kZXN0LmJwcDsKLQkJICAgICAgZGRzZmQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkJpdE1hc2sgPSBNb2RlRW11bGF0aW9uc1tjXS5kZXN0LnJtYXNrOwotCQkgICAgICBkZHNmZC5kZHBmUGl4ZWxGb3JtYXQudTIuZHdHQml0TWFzayA9IE1vZGVFbXVsYXRpb25zW2NdLmRlc3QuZ21hc2s7Ci0JCSAgICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51My5kd0JCaXRNYXNrID0gTW9kZUVtdWxhdGlvbnNbY10uZGVzdC5ibWFzazsKLQkJICAgIH0KLQkJICAgIGRkc2ZkLmRkcGZQaXhlbEZvcm1hdC51NC5kd1JHQkFscGhhQml0TWFzaz0gMDsKLQkJICAgIHNlbmRfbW9kZSA9IDE7Ci0JCSAgfQotCQkgIAotCQkgIGlmIChzZW5kX21vZGUgPT0gMCkKLQkJICAgIFdBUk4oIk5vIHZpc3VhbCBjb3JyZXNwb25kaW5nIHRvIHBpeG1hcCBmb3JtYXQgIVxuIik7Ci0JCX0KLQkgICAgICB9Ci0JICAgIH0KLSAgICAgICAgICB9Ci0JfQotICAgICAgfQotCi0gICAgICBlbXUrKzsKLSAgICB9Ci0KLSAgICBpZiAoc2VuZF9tb2RlKSB7Ci0gICAgICBpbnQgbW9kZTsKLQotICAgICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgewotCVRSQUNFKCJFbnVtZXJhdGluZyB3aXRoIHBpeGVsIGZvcm1hdCA6IFxuIik7Ci0JX2R1bXBfcGl4ZWxmb3JtYXQoJihkZHNmZC5kZHBmUGl4ZWxGb3JtYXQpKTsKLQlEUFJJTlRGKCJcbiIpOwotICAgICAgfQotICAgICAgCi0gICAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgc2l6ZW9mKG1vZGVzKS9zaXplb2YobW9kZXNbMF0pOyBtb2RlKyspIHsKLQkvKiBEbyBub3QgZW51bWVyYXRlIG1vZGVzIHdlIGNhbm5vdCBoYW5kbGUgYW55d2F5ICovCi0JaWYgKChtb2Rlc1ttb2RlXS53ID4gbWF4V2lkdGgpIHx8IChtb2Rlc1ttb2RlXS5oID4gbWF4SGVpZ2h0KSkKLQkgIGJyZWFrOwotCi0JZGRzZmQuZHdXaWR0aCA9IG1vZGVzW21vZGVdLnc7Ci0JZGRzZmQuZHdIZWlnaHQ9IG1vZGVzW21vZGVdLmg7Ci0JZGRzZmQubFBpdGNoICA9IGRkc2ZkLmR3V2lkdGggKiB4YnBwOwotCQotCS8qIE5vdywgc2VuZCB0aGUgbW9kZSBkZXNjcmlwdGlvbiB0byB0aGUgYXBwbGljYXRpb24gKi8KLQlUUkFDRSgiIC0gbW9kZSAlNGxkIC0gJTRsZFxuIiwgZGRzZmQuZHdXaWR0aCwgZGRzZmQuZHdIZWlnaHQpOwotCWlmICghbW9kZXNjYigmZGRzZmQsIGNvbnRleHQpKQotCSAgZ290byBleGl0X2VudW07Ci0gICAgICB9Ci0KLSAgICAgIGlmICghKGR3RmxhZ3MgJiBEREVETV9TVEFOREFSRFZHQU1PREVTKSkgewotCS8qIG1vZGVYIGlzIG5vdCBzdGFuZGFyZCBWR0EgKi8KLQlkZHNmZC5kd1dpZHRoID0gMzIwOwotCWRkc2ZkLmR3SGVpZ2h0ID0gMjAwOwotCWRkc2ZkLmxQaXRjaCAgPSAzMjAgKiB4YnBwOwotCWlmICghbW9kZXNjYigmZGRzZmQsIGNvbnRleHQpKQotCSAgZ290byBleGl0X2VudW07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gZXhpdF9lbnVtOgotICBUU1hGcmVlKHZpKTsKLSAgVFNYRnJlZShwZik7Ci0KLSAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3MkltcGxfR2V0Rm91ckNDQ29kZXMoCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSxMUERXT1JEIGxwTnVtQ29kZXMsIExQRFdPUkQgbHBDb2RlcwotKSB7Ci0jaWZkZWYgSEFWRV9YVklERU8KLSAgSUNPTV9USElTKElEaXJlY3REcmF3MkltcGwsaWZhY2UpOwotICBERFBSSVZBVEUoVGhpcyk7Ci0gIFh2SW1hZ2VGb3JtYXRWYWx1ZXMgKmZvOwotICBpbnQgbnVtX2NvZGVzOwotICAKLSAgVFJBQ0UoIiglcCwlcCwlcCkgLSAlbGQgc2xvdHMgYXZhaWxhYmxlXG4iLFRoaXMsIGxwTnVtQ29kZXMsIGxwQ29kZXMsICpscE51bUNvZGVzKTsKLSAgCi0gIGZvID0gVFNYdkxpc3RJbWFnZUZvcm1hdHMoZGlzcGxheSwgZGRwcml2LT5wb3J0X2lkLCAmbnVtX2NvZGVzKTsKLSAgaWYgKGxwQ29kZXMgIT0gTlVMTCkgewotICAgIC8qIEZpbGwgaW4gdGhlIEZvdXJDQyB0YWJsZSAqLwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCAqbHBOdW1Db2RlczsgaSsrKSBscENvZGVzW2ldID0gZm9baV0uaWQ7Ci0gIH0KLSAgaWYgKGZvKSB7Ci0gICAgKmxwTnVtQ29kZXMgPSBudW1fY29kZXM7Ci0gICAgVFNYRnJlZShmbyk7Ci0gIH0gZWxzZSB7Ci0gICAgKmxwTnVtQ29kZXMgPSAwOyAvKiBOb3Qgc3VyZSBpZiBYIGZpbGxzIHRoaXMgdmFyaWFibGUgaW4gdGhlIGVycm9yIGNhc2UgKi8KLSAgfQotICAKLSAgcmV0dXJuIEREX09LOwotI2Vsc2UKLSAgcmV0dXJuIElEaXJlY3REcmF3MkltcGxfR2V0Rm91ckNDQ29kZXMoaWZhY2UsIGxwTnVtQ29kZXMsIGxwQ29kZXMpOwotI2VuZGlmCi19Ci0KLS8qIE5vdGU6IEhhY2sgc28gd2UgY2FuIHJldXNlIHRoZSBvbGQgZnVuY3Rpb25zIHdpdGhvdXQgY29tcGlsZXIgd2FybmluZ3MgKi8KLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pICYmIGRlZmluZWQoX19HTlVDX18pCi0jIGRlZmluZSBYQ0FTVChmdW4pCSh0eXBlb2YoeGxpYl9kZHZ0LmZuIyNmdW4pKQotI2Vsc2UKLSMgZGVmaW5lIFhDQVNUKGZ1bikJKHZvaWQgKikKLSNlbmRpZgotCi1JQ09NX1ZUQUJMRShJRGlyZWN0RHJhdykgeGxpYl9kZHZ0ID0gewotICAgIElDT01fTVNWVEFCTEVfQ09NUEFUX0R1bW15UlRUSVZBTFVFCi0gICAgWENBU1QoUXVlcnlJbnRlcmZhY2UpWGxpYl9JRGlyZWN0RHJhdzJJbXBsX1F1ZXJ5SW50ZXJmYWNlLAotICAgIFhDQVNUKEFkZFJlZilJRGlyZWN0RHJhdzJJbXBsX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKVhsaWJfSURpcmVjdERyYXcySW1wbF9SZWxlYXNlLAotICAgIFhDQVNUKENvbXBhY3QpSURpcmVjdERyYXcySW1wbF9Db21wYWN0LAotICAgIFhDQVNUKENyZWF0ZUNsaXBwZXIpSURpcmVjdERyYXcySW1wbF9DcmVhdGVDbGlwcGVyLAotICAgIFhDQVNUKENyZWF0ZVBhbGV0dGUpWGxpYl9JRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVBhbGV0dGUsCi0gICAgWENBU1QoQ3JlYXRlU3VyZmFjZSlYbGliX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlU3VyZmFjZSwKLSAgICBYQ0FTVChEdXBsaWNhdGVTdXJmYWNlKUlEaXJlY3REcmF3MkltcGxfRHVwbGljYXRlU3VyZmFjZSwKLSAgICBYQ0FTVChFbnVtRGlzcGxheU1vZGVzKVhsaWJfSURpcmVjdERyYXcySW1wbF9FbnVtRGlzcGxheU1vZGVzLAotICAgIFhDQVNUKEVudW1TdXJmYWNlcylJRGlyZWN0RHJhdzJJbXBsX0VudW1TdXJmYWNlcywKLSAgICBYQ0FTVChGbGlwVG9HRElTdXJmYWNlKUlEaXJlY3REcmF3MkltcGxfRmxpcFRvR0RJU3VyZmFjZSwKLSAgICBYQ0FTVChHZXRDYXBzKVhsaWJfSURpcmVjdERyYXcySW1wbF9HZXRDYXBzLAotICAgIFhDQVNUKEdldERpc3BsYXlNb2RlKUlEaXJlY3REcmF3MkltcGxfR2V0RGlzcGxheU1vZGUsCi0gICAgWENBU1QoR2V0Rm91ckNDQ29kZXMpWGxpYl9JRGlyZWN0RHJhdzJJbXBsX0dldEZvdXJDQ0NvZGVzLAotICAgIFhDQVNUKEdldEdESVN1cmZhY2UpSURpcmVjdERyYXcySW1wbF9HZXRHRElTdXJmYWNlLAotICAgIFhDQVNUKEdldE1vbml0b3JGcmVxdWVuY3kpSURpcmVjdERyYXcySW1wbF9HZXRNb25pdG9yRnJlcXVlbmN5LAotICAgIFhDQVNUKEdldFNjYW5MaW5lKUlEaXJlY3REcmF3MkltcGxfR2V0U2NhbkxpbmUsCi0gICAgWENBU1QoR2V0VmVydGljYWxCbGFua1N0YXR1cylJRGlyZWN0RHJhdzJJbXBsX0dldFZlcnRpY2FsQmxhbmtTdGF0dXMsCi0gICAgWENBU1QoSW5pdGlhbGl6ZSlJRGlyZWN0RHJhdzJJbXBsX0luaXRpYWxpemUsCi0gICAgWENBU1QoUmVzdG9yZURpc3BsYXlNb2RlKUlEaXJlY3REcmF3MkltcGxfUmVzdG9yZURpc3BsYXlNb2RlLAotICAgIFhDQVNUKFNldENvb3BlcmF0aXZlTGV2ZWwpWGxpYl9JRGlyZWN0RHJhdzJJbXBsX1NldENvb3BlcmF0aXZlTGV2ZWwsCi0gICAgWGxpYl9JRGlyZWN0RHJhd0ltcGxfU2V0RGlzcGxheU1vZGUsCi0gICAgWENBU1QoV2FpdEZvclZlcnRpY2FsQmxhbmspSURpcmVjdERyYXcySW1wbF9XYWl0Rm9yVmVydGljYWxCbGFuaywKLX07Ci0KLSN1bmRlZiBYQ0FTVAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAlJRGlyZWN0RHJhdzIKLSAqCi0gKi8KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhsaWJfSURpcmVjdERyYXcySW1wbF9TZXREaXNwbGF5TW9kZSgKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLERXT1JEIHdpZHRoLERXT1JEIGhlaWdodCxEV09SRCBkZXB0aCxEV09SRCBkd1JlZnJlc2hSYXRlLERXT1JEIGR3RmxhZ3MKLSkgewotICAgIEZJWE1FKCAiSWdub3JlZCBwYXJhbWV0ZXJzICgweCUwOGx4LDB4JTA4bHgpXG4iLCBkd1JlZnJlc2hSYXRlLCBkd0ZsYWdzICk7IAotICAgIHJldHVybiBYbGliX0lEaXJlY3REcmF3SW1wbF9TZXREaXNwbGF5TW9kZSgoTFBESVJFQ1REUkFXKWlmYWNlLHdpZHRoLGhlaWdodCxkZXB0aCk7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3MkltcGxfR2V0QXZhaWxhYmxlVmlkTWVtKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsTFBERFNDQVBTIGRkc2NhcHMsTFBEV09SRCB0b3RhbCxMUERXT1JEIGZyZWUKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhdzJJbXBsLGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCVwKVxuIixUaGlzLGRkc2NhcHMsdG90YWwsZnJlZSk7Ci0gICAgaWYgKHRvdGFsKSAqdG90YWwgPSAxNiogMTAyNCAqIDEwMjQ7Ci0gICAgaWYgKGZyZWUpICpmcmVlID0gMTYqIDEwMjQgKiAxMDI0OwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSUNPTV9WVEFCTEUoSURpcmVjdERyYXcyKSB4bGliX2RkMnZ0ID0gewotICAgIElDT01fTVNWVEFCTEVfQ09NUEFUX0R1bW15UlRUSVZBTFVFCi0gICAgWGxpYl9JRGlyZWN0RHJhdzJJbXBsX1F1ZXJ5SW50ZXJmYWNlLAotICAgIElEaXJlY3REcmF3MkltcGxfQWRkUmVmLAotICAgIFhsaWJfSURpcmVjdERyYXcySW1wbF9SZWxlYXNlLAotICAgIElEaXJlY3REcmF3MkltcGxfQ29tcGFjdCwKLSAgICBJRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZUNsaXBwZXIsCi0gICAgWGxpYl9JRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVBhbGV0dGUsCi0gICAgWGxpYl9JRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVN1cmZhY2UsCi0gICAgSURpcmVjdERyYXcySW1wbF9EdXBsaWNhdGVTdXJmYWNlLAotICAgIFhsaWJfSURpcmVjdERyYXcySW1wbF9FbnVtRGlzcGxheU1vZGVzLAotICAgIElEaXJlY3REcmF3MkltcGxfRW51bVN1cmZhY2VzLAotICAgIElEaXJlY3REcmF3MkltcGxfRmxpcFRvR0RJU3VyZmFjZSwKLSAgICBYbGliX0lEaXJlY3REcmF3MkltcGxfR2V0Q2FwcywKLSAgICBJRGlyZWN0RHJhdzJJbXBsX0dldERpc3BsYXlNb2RlLAotICAgIFhsaWJfSURpcmVjdERyYXcySW1wbF9HZXRGb3VyQ0NDb2RlcywKLSAgICBJRGlyZWN0RHJhdzJJbXBsX0dldEdESVN1cmZhY2UsCi0gICAgSURpcmVjdERyYXcySW1wbF9HZXRNb25pdG9yRnJlcXVlbmN5LAotICAgIElEaXJlY3REcmF3MkltcGxfR2V0U2NhbkxpbmUsCi0gICAgSURpcmVjdERyYXcySW1wbF9HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzLAotICAgIElEaXJlY3REcmF3MkltcGxfSW5pdGlhbGl6ZSwKLSAgICBJRGlyZWN0RHJhdzJJbXBsX1Jlc3RvcmVEaXNwbGF5TW9kZSwKLSAgICBYbGliX0lEaXJlY3REcmF3MkltcGxfU2V0Q29vcGVyYXRpdmVMZXZlbCwKLSAgICBYbGliX0lEaXJlY3REcmF3MkltcGxfU2V0RGlzcGxheU1vZGUsCi0gICAgSURpcmVjdERyYXcySW1wbF9XYWl0Rm9yVmVydGljYWxCbGFuaywKLSAgICBYbGliX0lEaXJlY3REcmF3MkltcGxfR2V0QXZhaWxhYmxlVmlkTWVtCQotfTsKLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgJiYgZGVmaW5lZChfX0dOVUNfXykKLSMgZGVmaW5lIFhDQVNUKGZ1bikJKHR5cGVvZih4bGliX2RkNHZ0LmZuIyNmdW4pKQotI2Vsc2UKLSMgZGVmaW5lIFhDQVNUKGZ1bikJKHZvaWQqKQotI2VuZGlmCi0KLUlDT01fVlRBQkxFKElEaXJlY3REcmF3NCkgeGxpYl9kZDR2dCA9IHsKLSAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9EdW1teVJUVElWQUxVRQotICAgIFhDQVNUKFF1ZXJ5SW50ZXJmYWNlKVhsaWJfSURpcmVjdERyYXcySW1wbF9RdWVyeUludGVyZmFjZSwKLSAgICBYQ0FTVChBZGRSZWYpSURpcmVjdERyYXcySW1wbF9BZGRSZWYsCi0gICAgWENBU1QoUmVsZWFzZSlYbGliX0lEaXJlY3REcmF3MkltcGxfUmVsZWFzZSwKLSAgICBYQ0FTVChDb21wYWN0KUlEaXJlY3REcmF3MkltcGxfQ29tcGFjdCwKLSAgICBYQ0FTVChDcmVhdGVDbGlwcGVyKUlEaXJlY3REcmF3MkltcGxfQ3JlYXRlQ2xpcHBlciwKLSAgICBYQ0FTVChDcmVhdGVQYWxldHRlKVhsaWJfSURpcmVjdERyYXcySW1wbF9DcmVhdGVQYWxldHRlLAotICAgIFhDQVNUKENyZWF0ZVN1cmZhY2UpWGxpYl9JRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVN1cmZhY2UsCi0gICAgWENBU1QoRHVwbGljYXRlU3VyZmFjZSlJRGlyZWN0RHJhdzJJbXBsX0R1cGxpY2F0ZVN1cmZhY2UsCi0gICAgWENBU1QoRW51bURpc3BsYXlNb2RlcylYbGliX0lEaXJlY3REcmF3MkltcGxfRW51bURpc3BsYXlNb2RlcywKLSAgICBYQ0FTVChFbnVtU3VyZmFjZXMpSURpcmVjdERyYXcySW1wbF9FbnVtU3VyZmFjZXMsCi0gICAgWENBU1QoRmxpcFRvR0RJU3VyZmFjZSlJRGlyZWN0RHJhdzJJbXBsX0ZsaXBUb0dESVN1cmZhY2UsCi0gICAgWENBU1QoR2V0Q2FwcylYbGliX0lEaXJlY3REcmF3MkltcGxfR2V0Q2FwcywKLSAgICBYQ0FTVChHZXREaXNwbGF5TW9kZSlJRGlyZWN0RHJhdzJJbXBsX0dldERpc3BsYXlNb2RlLAotICAgIFhDQVNUKEdldEZvdXJDQ0NvZGVzKVhsaWJfSURpcmVjdERyYXcySW1wbF9HZXRGb3VyQ0NDb2RlcywKLSAgICBYQ0FTVChHZXRHRElTdXJmYWNlKUlEaXJlY3REcmF3MkltcGxfR2V0R0RJU3VyZmFjZSwKLSAgICBYQ0FTVChHZXRNb25pdG9yRnJlcXVlbmN5KUlEaXJlY3REcmF3MkltcGxfR2V0TW9uaXRvckZyZXF1ZW5jeSwKLSAgICBYQ0FTVChHZXRTY2FuTGluZSlJRGlyZWN0RHJhdzJJbXBsX0dldFNjYW5MaW5lLAotICAgIFhDQVNUKEdldFZlcnRpY2FsQmxhbmtTdGF0dXMpSURpcmVjdERyYXcySW1wbF9HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzLAotICAgIFhDQVNUKEluaXRpYWxpemUpSURpcmVjdERyYXcySW1wbF9Jbml0aWFsaXplLAotICAgIFhDQVNUKFJlc3RvcmVEaXNwbGF5TW9kZSlJRGlyZWN0RHJhdzJJbXBsX1Jlc3RvcmVEaXNwbGF5TW9kZSwKLSAgICBYQ0FTVChTZXRDb29wZXJhdGl2ZUxldmVsKVhsaWJfSURpcmVjdERyYXcySW1wbF9TZXRDb29wZXJhdGl2ZUxldmVsLAotICAgIFhDQVNUKFNldERpc3BsYXlNb2RlKVhsaWJfSURpcmVjdERyYXcySW1wbF9TZXREaXNwbGF5TW9kZSwKLSAgICBYQ0FTVChXYWl0Rm9yVmVydGljYWxCbGFuaylJRGlyZWN0RHJhdzJJbXBsX1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAotICAgIFhDQVNUKEdldEF2YWlsYWJsZVZpZE1lbSlYbGliX0lEaXJlY3REcmF3MkltcGxfR2V0QXZhaWxhYmxlVmlkTWVtLAotICAgIElEaXJlY3REcmF3NEltcGxfR2V0U3VyZmFjZUZyb21EQywKLSAgICBJRGlyZWN0RHJhdzRJbXBsX1Jlc3RvcmVBbGxTdXJmYWNlcywKLSAgICBJRGlyZWN0RHJhdzRJbXBsX1Rlc3RDb29wZXJhdGl2ZUxldmVsLAotICAgIElEaXJlY3REcmF3NEltcGxfR2V0RGV2aWNlSWRlbnRpZmllcgotfTsKLSN1bmRlZiBYQ0FTVAotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKQotIyBkZWZpbmUgWENBU1QoZnVuKQkodHlwZW9mKHhsaWJfZGQ3dnQuZm4jI2Z1bikpCi0jZWxzZQotIyBkZWZpbmUgWENBU1QoZnVuKQkodm9pZCopCi0jZW5kaWYKLQotSUNPTV9WVEFCTEUoSURpcmVjdERyYXc3KSB4bGliX2RkN3Z0ID0gewotICAgIElDT01fTVNWVEFCTEVfQ09NUEFUX0R1bW15UlRUSVZBTFVFCi0gICAgWENBU1QoUXVlcnlJbnRlcmZhY2UpWGxpYl9JRGlyZWN0RHJhdzJJbXBsX1F1ZXJ5SW50ZXJmYWNlLAotICAgIFhDQVNUKEFkZFJlZilJRGlyZWN0RHJhdzJJbXBsX0FkZFJlZiwKLSAgICBYQ0FTVChSZWxlYXNlKVhsaWJfSURpcmVjdERyYXcySW1wbF9SZWxlYXNlLAotICAgIFhDQVNUKENvbXBhY3QpSURpcmVjdERyYXcySW1wbF9Db21wYWN0LAotICAgIFhDQVNUKENyZWF0ZUNsaXBwZXIpSURpcmVjdERyYXcySW1wbF9DcmVhdGVDbGlwcGVyLAotICAgIFhDQVNUKENyZWF0ZVBhbGV0dGUpWGxpYl9JRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVBhbGV0dGUsCi0gICAgWENBU1QoQ3JlYXRlU3VyZmFjZSlYbGliX0lEaXJlY3REcmF3MkltcGxfQ3JlYXRlU3VyZmFjZSwKLSAgICBYQ0FTVChEdXBsaWNhdGVTdXJmYWNlKUlEaXJlY3REcmF3MkltcGxfRHVwbGljYXRlU3VyZmFjZSwKLSAgICBYQ0FTVChFbnVtRGlzcGxheU1vZGVzKVhsaWJfSURpcmVjdERyYXcySW1wbF9FbnVtRGlzcGxheU1vZGVzLAotICAgIFhDQVNUKEVudW1TdXJmYWNlcylJRGlyZWN0RHJhdzJJbXBsX0VudW1TdXJmYWNlcywKLSAgICBYQ0FTVChGbGlwVG9HRElTdXJmYWNlKUlEaXJlY3REcmF3MkltcGxfRmxpcFRvR0RJU3VyZmFjZSwKLSAgICBYQ0FTVChHZXRDYXBzKVhsaWJfSURpcmVjdERyYXcySW1wbF9HZXRDYXBzLAotICAgIFhDQVNUKEdldERpc3BsYXlNb2RlKUlEaXJlY3REcmF3MkltcGxfR2V0RGlzcGxheU1vZGUsCi0gICAgWENBU1QoR2V0Rm91ckNDQ29kZXMpWGxpYl9JRGlyZWN0RHJhdzJJbXBsX0dldEZvdXJDQ0NvZGVzLAotICAgIFhDQVNUKEdldEdESVN1cmZhY2UpSURpcmVjdERyYXcySW1wbF9HZXRHRElTdXJmYWNlLAotICAgIFhDQVNUKEdldE1vbml0b3JGcmVxdWVuY3kpSURpcmVjdERyYXcySW1wbF9HZXRNb25pdG9yRnJlcXVlbmN5LAotICAgIFhDQVNUKEdldFNjYW5MaW5lKUlEaXJlY3REcmF3MkltcGxfR2V0U2NhbkxpbmUsCi0gICAgWENBU1QoR2V0VmVydGljYWxCbGFua1N0YXR1cylJRGlyZWN0RHJhdzJJbXBsX0dldFZlcnRpY2FsQmxhbmtTdGF0dXMsCi0gICAgWENBU1QoSW5pdGlhbGl6ZSlJRGlyZWN0RHJhdzJJbXBsX0luaXRpYWxpemUsCi0gICAgWENBU1QoUmVzdG9yZURpc3BsYXlNb2RlKUlEaXJlY3REcmF3MkltcGxfUmVzdG9yZURpc3BsYXlNb2RlLAotICAgIFhDQVNUKFNldENvb3BlcmF0aXZlTGV2ZWwpWGxpYl9JRGlyZWN0RHJhdzJJbXBsX1NldENvb3BlcmF0aXZlTGV2ZWwsCi0gICAgWENBU1QoU2V0RGlzcGxheU1vZGUpWGxpYl9JRGlyZWN0RHJhdzJJbXBsX1NldERpc3BsYXlNb2RlLAotICAgIFhDQVNUKFdhaXRGb3JWZXJ0aWNhbEJsYW5rKUlEaXJlY3REcmF3MkltcGxfV2FpdEZvclZlcnRpY2FsQmxhbmssCi0gICAgWENBU1QoR2V0QXZhaWxhYmxlVmlkTWVtKVhsaWJfSURpcmVjdERyYXcySW1wbF9HZXRBdmFpbGFibGVWaWRNZW0sCi0gICAgWENBU1QoR2V0U3VyZmFjZUZyb21EQylJRGlyZWN0RHJhdzRJbXBsX0dldFN1cmZhY2VGcm9tREMsCi0gICAgWENBU1QoUmVzdG9yZUFsbFN1cmZhY2VzKUlEaXJlY3REcmF3NEltcGxfUmVzdG9yZUFsbFN1cmZhY2VzLAotICAgIFhDQVNUKFRlc3RDb29wZXJhdGl2ZUxldmVsKUlEaXJlY3REcmF3NEltcGxfVGVzdENvb3BlcmF0aXZlTGV2ZWwsCi0gICAgWENBU1QoR2V0RGV2aWNlSWRlbnRpZmllcilJRGlyZWN0RHJhdzRJbXBsX0dldERldmljZUlkZW50aWZpZXIsCi0gICAgSURpcmVjdERyYXc3SW1wbF9TdGFydE1vZGVUZXN0LAotICAgIElEaXJlY3REcmF3N0ltcGxfRXZhbHVhdGVNb2RlLAotfTsKLSN1bmRlZiBYQ0FTVApkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kZHJhdy94dmlkbW9kZS5jIGIvZGxscy9kZHJhdy9kZHJhdy94dmlkbW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmRmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RkcmF3L3h2aWRtb2RlLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qCURpcmVjdERyYXcgZHJpdmVyIGZvciBVc2VyLWJhc2VkIHByaW1hcnkgc3VyZmFjZXMKKyAqCXdpdGggWEY4NlZpZE1vZGUgbW9kZSBzd2l0Y2hpbmcgaW4gZnVsbC1zY3JlZW4gbW9kZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmZGVmIEhBVkVfTElCWFhGODZWTQorCisjaW5jbHVkZSAiZGVidWd0b29scy5oIgorI2luY2x1ZGUgInRzX3hsaWIuaCIKKyNpbmNsdWRlICJ0c194Zjg2dm1vZGUuaCIKKyNpbmNsdWRlICJ4MTFkcnYuaCIKKyNpbmNsdWRlIDxkZHJhdy5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCisjaW5jbHVkZSAiZGRyYXcvbWFpbi5oIgorI2luY2x1ZGUgImRkcmF3L3VzZXIuaCIKKyNpbmNsdWRlICJkZHJhdy94dmlkbW9kZS5oIgorI2luY2x1ZGUgImRjbGlwcGVyL21haW4uaCIKKyNpbmNsdWRlICJkcGFsZXR0ZS9tYWluLmgiCisjaW5jbHVkZSAiZHN1cmZhY2UvbWFpbi5oIgorI2luY2x1ZGUgImRzdXJmYWNlL2RpYi5oIgorI2luY2x1ZGUgImRzdXJmYWNlL3VzZXIuaCIKKworREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKKworc3RhdGljIElDT01fVlRBQkxFKElEaXJlY3REcmF3NykgWFZpZE1vZGVfRGlyZWN0RHJhd19WVGFibGU7CisKK3N0YXRpYyBjb25zdCBERERFVklDRUlERU5USUZJRVIyIHh2aWRtb2RlX2RldmljZSA9IAoreworICAgICJVc2VyL1hGODZWaWRNb2RlIERyaXZlciIsCisgICAgIldJTkUgRGlyZWN0RHJhdyBvbiBVc2VyIHdpdGggWEY4NlZpZE1vZGUiLAorICAgIHsgeyAweDAwMDEwMDAxLCAweDAwMDEwMDAxIH0gfSwKKyAgICAwLCAwLCAwLCAwLAorICAgIC8qIDQwYzFiMjQ4LTlkN2QtNGEyOS1iN2Q3LTRjZDgxMDlmM2Q1ZCAqLworICAgIHsweDQwYzFiMjQ4LDB4OWQ3ZCwweDRhMjksezB4ZDcsMHhiNywweDRjLDB4ZDgsMHgxMCwweDlmLDB4M2QsMHg1ZH19LAorICAgIDAKK307CisKK0hSRVNVTFQgWFZpZE1vZGVfRGlyZWN0RHJhd19DcmVhdGUoY29uc3QgR1VJRCogcEdVSUQsIExQRElSRUNURFJBVzcqIHBJZmFjZSwKKwkJCQkgICBJVW5rbm93biogcFVua091dGVyLCBCT09MIGV4KTsKK0hSRVNVTFQgWFZpZE1vZGVfRGlyZWN0RHJhd19Jbml0aWFsaXplKElEaXJlY3REcmF3SW1wbCosIGNvbnN0IEdVSUQqKTsKKworc3RhdGljIGNvbnN0IGRkcmF3X2RyaXZlciB4dmlkbW9kZV9kcml2ZXIgPQoreworICAgICZ4dmlkbW9kZV9kZXZpY2UsCisgICAgMTEsIC8qIFVzZXIgaXMgMTAgKi8KKyAgICBYVmlkTW9kZV9EaXJlY3REcmF3X0NyZWF0ZSwKKyAgICBYVmlkTW9kZV9EaXJlY3REcmF3X0luaXRpYWxpemUKK307CisKK3N0YXRpYyBYRjg2VmlkTW9kZU1vZGVJbmZvKiogbW9kZXM7CitzdGF0aWMgRFdPUkQgbnVtX21vZGVzOworCisvKiBDYWxsZWQgZnJvbSBEbGxJbml0LCB3aGljaCBpcyBzeW5jaHJvbmlzZWQgc28gdGhlcmUgYXJlIG5vIHRocmVhZGluZworICogY29uY2VybnMuICovCitzdGF0aWMgQk9PTCBpbml0aWFsaXplKHZvaWQpCit7CisgICAgaW50IG5tb2RlczsKKyAgICBpbnQgbWFqb3IsIG1pbm9yOworCisgICAgaWYgKFgxMURSVl9HZXRYUm9vdFdpbmRvdygpICE9IERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoIVRTWEY4NlZpZE1vZGVRdWVyeVZlcnNpb24oZGlzcGxheSwgJm1ham9yLCAmbWlub3IpKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoIVRTWEY4NlZpZE1vZGVHZXRBbGxNb2RlTGluZXMoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwgJm5tb2RlcywKKwkJCQkgICAgICAmbW9kZXMpKQorCXJldHVybiBGQUxTRTsKKworICAgIG51bV9tb2RlcyA9IG5tb2RlczsKKworICAgIFRSQUNFKCJlbmFibGluZyBYVmlkTW9kZVxuIik7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cCh2b2lkKQoreworICAgIFRTWEZyZWUobW9kZXMpOworfQorCitzdGF0aWMgSFJFU1VMVCBzZXRfZGlzcGxheV9tb2RlKFhGODZWaWRNb2RlTW9kZUluZm8qIG1vZGUpCit7CisgICAgaW50IHNjcmVlbiA9IERlZmF1bHRTY3JlZW4oZGlzcGxheSk7CisKKyAgICBUUkFDRSgiJWQgJWRcbiIsIG1vZGUtPmhkaXNwbGF5LCBtb2RlLT52ZGlzcGxheSk7CisKKyAgICAvKiBUaGlzIGlzIHF1ZXN0aW9uYWJsZS4gUHJvZ3JhbXMgc2hvdWxkIGxlYXZlIHN3aXRjaGluZyB1bmxvY2tlZCB3aGVuCisgICAgICogdGhleSBleGl0LiBTbyB0aGUgb25seSByZWFzb24gdGhlIGRpc3BsYXkgc2hvdWxkIGJlIGxvY2tlZCBpcyBpZgorICAgICAqIGFub3RoZXIgcmVhbGx5IGRvZXNuJ3Qgd2FudCBzd2l0Y2hlcyB0byBoYXBwZW4uIE1heWJlIGl0IHdvdWxkIGJlIGJldHRlcgorICAgICAqIHRvIGRldGVjdCBhbiBYRjg2VmlkZU1vZGVab29tTG9ja2VkIGVycm9yLiAqLworICAgIFRTWEY4NlZpZE1vZGVMb2NrTW9kZVN3aXRjaChkaXNwbGF5LCBzY3JlZW4sIEZhbHNlKTsKKworICAgIFRTWFN5bmMoZGlzcGxheSwgRmFsc2UpOworCisgICAgVFNYRjg2VmlkTW9kZVN3aXRjaFRvTW9kZShkaXNwbGF5LCBzY3JlZW4sIG1vZGUpOworCisgICAgVFNYU3luYyhkaXNwbGF5LCBGYWxzZSk7CisKKyNpZiAwIC8qIGRvZXNuJ3Qgd29yayBmb3IgbWUgKi8KKyAgICBUU1hGODZWaWRNb2RlU2V0Vmlld1BvcnQoZGlzcGxheSwgc2NyZWVuLCAwLCAwKTsKKyNlbHNlCisgICAgVFNYV2FycFBvaW50ZXIoZGlzcGxheSwgTm9uZSwgUm9vdFdpbmRvdyhkaXNwbGF5LCBzY3JlZW4pLCAwLCAwLCAwLCAwLCAwLAorCQkgICAwKTsKKyNlbmRpZgorCisgICAgVFNYRmx1c2goZGlzcGxheSk7CisKKyAgICByZXR1cm4gU19PSzsKK30KKworc3RhdGljIFhGODZWaWRNb2RlTW9kZUluZm8qIGNob29zZV9tb2RlKERXT1JEIGR3V2lkdGgsIERXT1JEIGR3SGVpZ2h0LAorCQkJCQlEV09SRCBkd1JlZnJlc2hSYXRlLCBEV09SRCBkd0ZsYWdzKQoreworICAgIFhGODZWaWRNb2RlTW9kZUluZm8qIGJlc3QgPSBOVUxMOworICAgIGludCBpOworCisgICAgLyogQ2hvb3NlIHRoZSBzbWFsbGVzdCBtb2RlIHRoYXQgaXMgbGFyZ2UgZW5vdWdoLiAqLworICAgIGZvciAoaT0wOyBpIDwgbnVtX21vZGVzOyBpKyspCisgICAgeworCWlmIChtb2Rlc1tpXS0+aGRpc3BsYXkgPj0gZHdXaWR0aCAmJiBtb2Rlc1tpXS0+dmRpc3BsYXkgPj0gZHdIZWlnaHQpCisJeworCSAgICBpZiAoYmVzdCA9PSBOVUxMKSBiZXN0ID0gbW9kZXNbaV07CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAobW9kZXNbaV0tPmhkaXNwbGF5IDwgYmVzdC0+aGRpc3BsYXkKKwkJICAgIHx8IG1vZGVzW2ldLT52ZGlzcGxheSA8IGJlc3QtPnZkaXNwbGF5KQorCQkgICAgYmVzdCA9IG1vZGVzW2ldOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8qIGFsbCBtb2RlcyB3ZXJlIHRvbyBzbWFsbCwgdXNlIHRoZSBsYXJnZXN0ICovCisgICAgaWYgKGJlc3QgPT0gTlVMTCkKKyAgICB7CisJVFJBQ0UoImFsbCBtb2RlcyB0b28gc21hbGxcbiIpOworCisJZm9yIChpPTE7IGkgPCBudW1fbW9kZXM7IGkrKykKKwl7CisJICAgIGlmIChiZXN0ID09IE5VTEwpIGJlc3QgPSBtb2Rlc1tpXTsKKwkgICAgZWxzZQorCSAgICB7CisJCWlmIChtb2Rlc1tpXS0+aGRpc3BsYXkgPiBiZXN0LT5oZGlzcGxheQorCQkgICAgfHwgbW9kZXNbaV0tPnZkaXNwbGF5ID4gYmVzdC0+dmRpc3BsYXkpCisJCSAgICBiZXN0ID0gbW9kZXNbaV07CisJICAgIH0KKwl9CisgICAgfQorCisgICAgVFJBQ0UoInVzaW5nICVkICVkIGZvciAlbHUgJWx1XG4iLCBiZXN0LT5oZGlzcGxheSwgYmVzdC0+dmRpc3BsYXksCisJICBkd1dpZHRoLCBkd0hlaWdodCk7CisKKyAgICByZXR1cm4gYmVzdDsKK30KKworc3RhdGljIFhGODZWaWRNb2RlTW9kZUluZm8qIGdldF9jdXJyZW50X21vZGUodm9pZCkKK3sKKyAgICBYRjg2VmlkTW9kZU1vZGVMaW5lIGxpbmU7CisgICAgaW50IGRvdGNsb2NrOworICAgIGludCBpOworCisgICAgVFNYRjg2VmlkTW9kZUdldE1vZGVMaW5lKGRpc3BsYXksIERlZmF1bHRTY3JlZW4oZGlzcGxheSksICZkb3RjbG9jaywKKwkJCSAgICAgJmxpbmUpOworCisgICAgZm9yIChpPTA7IGkgPCBudW1fbW9kZXM7IGkrKykKKyAgICB7CisJaWYgKG1vZGVzW2ldLT5kb3RjbG9jayA9PSBkb3RjbG9jaworCSAgICAmJiBtb2Rlc1tpXS0+aGRpc3BsYXkgPT0gbGluZS5oZGlzcGxheQorCSAgICAmJiBtb2Rlc1tpXS0+aHN5bmNzdGFydCA9PSBsaW5lLmhzeW5jc3RhcnQKKwkgICAgJiYgbW9kZXNbaV0tPmhzeW5jZW5kID09IGxpbmUuaHN5bmNlbmQKKwkgICAgJiYgbW9kZXNbaV0tPmh0b3RhbCA9PSBsaW5lLmh0b3RhbAorCSAgICAvKiAmJiBtb2Rlc1tpXS0+aHNrZXcgPT0gbGluZS5oc2tldyAqLworCSAgICAmJiBtb2Rlc1tpXS0+dmRpc3BsYXkgPT0gbGluZS52ZGlzcGxheQorCSAgICAmJiBtb2Rlc1tpXS0+dnN5bmNzdGFydCA9PSBsaW5lLnZzeW5jc3RhcnQKKwkgICAgJiYgbW9kZXNbaV0tPnZzeW5jZW5kID09IGxpbmUudnN5bmNlbmQKKwkgICAgJiYgbW9kZXNbaV0tPnZ0b3RhbCA9PSBsaW5lLnZ0b3RhbAorCSAgICAmJiBtb2Rlc1tpXS0+ZmxhZ3MgPT0gbGluZS5mbGFncykKKwkgICAgcmV0dXJuIG1vZGVzW2ldOworICAgIH0KKworICAgIFdBUk4oInRoaXMgY2FuJ3QgaGFwcGVuXG4iKTsKKyAgICByZXR1cm4gbW9kZXNbMF07IC8qIHNob3VsZCBiZSB0aGUgbW9kZSB0aGF0IFggc3RhcnRlZCBpbiAqLworfQorCitCT09MIEREUkFXX1hWaWRNb2RlX0luaXQoSElOU1RBTkNFIGhJbnN0RExMLCBEV09SRCBmZHdSZWFzb24sIExQVk9JRCBscHYpCit7CisgICAgaWYgKGZkd1JlYXNvbiA9PSBETExfUFJPQ0VTU19BVFRBQ0gpCisgICAgeworCWlmIChpbml0aWFsaXplKCkpCisJICAgIEREUkFXX3JlZ2lzdGVyX2RyaXZlcigmeHZpZG1vZGVfZHJpdmVyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZmR3UmVhc29uID09IERMTF9QUk9DRVNTX0RFVEFDSCkKKyAgICB7CisJY2xlYW51cCgpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKiBOb3QgY2FsbGVkIGZyb20gdGhlIHZ0YWJsZS4gKi8KK0hSRVNVTFQgWFZpZE1vZGVfRGlyZWN0RHJhd19Db25zdHJ1Y3QoSURpcmVjdERyYXdJbXBsICpUaGlzLCBCT09MIGV4KQoreworICAgIFhWSURNT0RFX0REUkFXX1BSSVZfVkFSKHByaXYsVGhpcyk7CisgICAgSFJFU1VMVCBocjsKKworICAgIFRSQUNFKCJcbiIpOworCisgICAgaHIgPSBVc2VyX0RpcmVjdERyYXdfQ29uc3RydWN0KFRoaXMsIGV4KTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOworCisgICAgVGhpcy0+ZmluYWxfcmVsZWFzZSA9IFhWaWRNb2RlX0RpcmVjdERyYXdfZmluYWxfcmVsZWFzZTsKKworICAgIHByaXYtPnh2aWRtb2RlLm9yaWdpbmFsX21vZGUgPSBnZXRfY3VycmVudF9tb2RlKCk7CisgICAgcHJpdi0+eHZpZG1vZGUuY3VycmVudF9tb2RlID0gcHJpdi0+eHZpZG1vZGUub3JpZ2luYWxfbW9kZTsKKworICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3LCBYVmlkTW9kZV9EaXJlY3REcmF3X1ZUYWJsZSk7CisKKyAgICByZXR1cm4gU19PSzsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBEaXJlY3REcmF3Q3JlYXRlKEV4KSBvbiB0aGUgbW9zdC1kZXJpdmVkCisgKiBjbGFzcyB0byBzdGFydCBjb25zdHJ1Y3Rpb24uCisgKiBOb3QgY2FsbGVkIGZyb20gdGhlIHZ0YWJsZS4gKi8KK0hSRVNVTFQgWFZpZE1vZGVfRGlyZWN0RHJhd19DcmVhdGUoY29uc3QgR1VJRCogcEdVSUQsIExQRElSRUNURFJBVzcqIHBJZmFjZSwKKwkJCQkgICBJVW5rbm93biogcFVua091dGVyLCBCT09MIGV4KQoreworICAgIEhSRVNVTFQgaHI7CisgICAgSURpcmVjdERyYXdJbXBsKiBUaGlzOworCisgICAgVFJBQ0UoIlxuIik7CisKKyAgICBhc3NlcnQocFVua091dGVyID09IE5VTEwpOworCisgICAgVGhpcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkgICAgIHNpemVvZihJRGlyZWN0RHJhd0ltcGwpCisJCSAgICAgKyBzaXplb2YoWFZpZE1vZGVfRGlyZWN0RHJhd0ltcGwpKTsKKyAgICBpZiAoVGhpcyA9PSBOVUxMKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKworICAgIC8qIE5vdGUgdGhhdCB0aGlzIHJlbGF0aW9uIGRvZXMgKm5vdCogaG9sZCB0cnVlIGlmIHRoZSBERCBvYmplY3Qgd2FzCisgICAgICogQ29DcmVhdGVJbnN0YW5jZWQgdGhlbiBJbml0aWFsaXplZC4gKi8KKyAgICBUaGlzLT5wcml2YXRlID0gKFhWaWRNb2RlX0RpcmVjdERyYXdJbXBsICopKFRoaXMrMSk7CisKKyAgICBociA9IFhWaWRNb2RlX0RpcmVjdERyYXdfQ29uc3RydWN0KFRoaXMsIGV4KTsKKyAgICBpZiAoRkFJTEVEKGhyKSkKKwlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKKyAgICBlbHNlCisJKnBJZmFjZSA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3Nyk7CisKKyAgICByZXR1cm4gaHI7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gVW5pbml0X0RpcmVjdERyYXdfSW5pdGlhbGl6ZSBvbiB0aGUKKyAqIG1vc3QtZGVyaXZlZC1jbGFzcyB0byBzdGFydCBpbml0aWFsaXphdGlvbi4KKyAqIE5vdCBjYWxsZWQgZnJvbSB0aGUgdnRhYmxlLiAqLworSFJFU1VMVCBYVmlkTW9kZV9EaXJlY3REcmF3X0luaXRpYWxpemUoSURpcmVjdERyYXdJbXBsICpUaGlzLCBjb25zdCBHVUlEKiBndWlkKQoreworICAgIEhSRVNVTFQgaHI7CisKKyAgICBUUkFDRSgiXG4iKTsKKworICAgIFRoaXMtPnByaXZhdGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKKwkJCSAgICAgIHNpemVvZihYVmlkTW9kZV9EaXJlY3REcmF3SW1wbCkpOworICAgIGlmIChUaGlzLT5wcml2YXRlID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOworCisgICAgaHIgPSBYVmlkTW9kZV9EaXJlY3REcmF3X0NvbnN0cnVjdChUaGlzLCBUUlVFKTsgLyogWFhYIGV4PyAqLworICAgIGlmIChGQUlMRUQoaHIpKQorICAgIHsKKwlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5wcml2YXRlKTsKKwlyZXR1cm4gaHI7CisgICAgfQorCisgICAgcmV0dXJuIEREX09LOworfQorCisvKiBDYWxsZWQgZnJvbSBhbiBpbnRlcm5hbCBmdW5jdGlvbiBwb2ludGVyLiAqLwordm9pZCBYVmlkTW9kZV9EaXJlY3REcmF3X2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdJbXBsICpUaGlzKQoreworICAgIFhWSURNT0RFX0REUkFXX1BSSVZfVkFSKHByaXYsIFRoaXMpOworCisgICAgaWYgKHByaXYtPnh2aWRtb2RlLmN1cnJlbnRfbW9kZSAhPSBwcml2LT54dmlkbW9kZS5vcmlnaW5hbF9tb2RlKQorCXNldF9kaXNwbGF5X21vZGUocHJpdi0+eHZpZG1vZGUub3JpZ2luYWxfbW9kZSk7CisKKyAgICBVc2VyX0RpcmVjdERyYXdfZmluYWxfcmVsZWFzZShUaGlzKTsKK30KKworSFJFU1VMVCBXSU5BUEkKK1hWaWRNb2RlX0RpcmVjdERyYXdfR2V0RGV2aWNlSWRlbnRpZmllcihMUERJUkVDVERSQVc3IGlmYWNlLAorCQkJCQlMUEREREVWSUNFSURFTlRJRklFUjIgcEREREksCisJCQkJCURXT1JEIGR3RmxhZ3MpCit7CisgICAgKnBERERJID0geHZpZG1vZGVfZGV2aWNlOworICAgIHJldHVybiBERF9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkKK1hWaWRNb2RlX0RpcmVjdERyYXdfUmVzdG9yZURpc3BsYXlNb2RlKExQRElSRUNURFJBVzcgaWZhY2UpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3SW1wbCwgaWZhY2UpOworICAgIEhSRVNVTFQgaHI7CisKKyAgICBUUkFDRSgiXG4iKTsKKworICAgIGhyID0gTWFpbl9EaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZShpZmFjZSk7CisgICAgaWYgKFNVQ0NFRURFRChocikpCisgICAgeworCVhWSURNT0RFX0REUkFXX1BSSVZfVkFSKHByaXYsIFRoaXMpOworCisJaWYgKHByaXYtPnh2aWRtb2RlLmN1cnJlbnRfbW9kZSAhPSBwcml2LT54dmlkbW9kZS5vcmlnaW5hbF9tb2RlKQorCXsKKwkgICAgc2V0X2Rpc3BsYXlfbW9kZShwcml2LT54dmlkbW9kZS5vcmlnaW5hbF9tb2RlKTsKKwkgICAgcHJpdi0+eHZpZG1vZGUuY3VycmVudF9tb2RlID0gcHJpdi0+eHZpZG1vZGUub3JpZ2luYWxfbW9kZTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIGhyOworfQorCitIUkVTVUxUIFdJTkFQSQorWFZpZE1vZGVfRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZShMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd1dpZHRoLAorCQkJCSAgIERXT1JEIGR3SGVpZ2h0LCBEV09SRCBkd0JQUCwKKwkJCQkgICBEV09SRCBkd1JlZnJlc2hSYXRlLCBEV09SRCBkd0ZsYWdzKQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd0ltcGwsIGlmYWNlKTsKKworICAgIEhSRVNVTFQgaHI7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVsZHglbGR4JWxkLCVsZCBIeiwlMDhseClcbiIsVGhpcyxkd1dpZHRoLGR3SGVpZ2h0LGR3QlBQLGR3UmVmcmVzaFJhdGUsZHdGbGFncyk7CisgICAgaHIgPSBVc2VyX0RpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoaWZhY2UsIGR3V2lkdGgsIGR3SGVpZ2h0LCBkd0JQUCwKKwkJCQkJZHdSZWZyZXNoUmF0ZSwgZHdGbGFncyk7CisKKyAgICBpZiAoU1VDQ0VFREVEKGhyKSkKKyAgICB7CisJWFZJRE1PREVfRERSQVdfUFJJVl9WQVIocHJpdiwgVGhpcyk7CisJWEY4NlZpZE1vZGVNb2RlSW5mbyogbmV3X21vZGU7CisKKwluZXdfbW9kZSA9IGNob29zZV9tb2RlKGR3V2lkdGgsIGR3SGVpZ2h0LCBkd1JlZnJlc2hSYXRlLCBkd0ZsYWdzKTsKKworCWlmIChuZXdfbW9kZSAhPSBOVUxMICYmIG5ld19tb2RlICE9IHByaXYtPnh2aWRtb2RlLmN1cnJlbnRfbW9kZSkKKwl7CisJICAgIHByaXYtPnh2aWRtb2RlLmN1cnJlbnRfbW9kZSA9IG5ld19tb2RlOworCSAgICBzZXRfZGlzcGxheV9tb2RlKHByaXYtPnh2aWRtb2RlLmN1cnJlbnRfbW9kZSk7CisJfQorICAgIH0KKworICAgIHJldHVybiBocjsKK30KKworc3RhdGljIElDT01fVlRBQkxFKElEaXJlY3REcmF3NykgWFZpZE1vZGVfRGlyZWN0RHJhd19WVGFibGUgPQoreworICAgIE1haW5fRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdfQWRkUmVmLAorICAgIE1haW5fRGlyZWN0RHJhd19SZWxlYXNlLAorICAgIE1haW5fRGlyZWN0RHJhd19Db21wYWN0LAorICAgIE1haW5fRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyLAorICAgIE1haW5fRGlyZWN0RHJhd19DcmVhdGVQYWxldHRlLAorICAgIE1haW5fRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlLAorICAgIE1haW5fRGlyZWN0RHJhd19EdXBsaWNhdGVTdXJmYWNlLAorICAgIFVzZXJfRGlyZWN0RHJhd19FbnVtRGlzcGxheU1vZGVzLAorICAgIE1haW5fRGlyZWN0RHJhd19FbnVtU3VyZmFjZXMsCisgICAgTWFpbl9EaXJlY3REcmF3X0ZsaXBUb0dESVN1cmZhY2UsCisgICAgVXNlcl9EaXJlY3REcmF3X0dldENhcHMsCisgICAgTWFpbl9EaXJlY3REcmF3X0dldERpc3BsYXlNb2RlLAorICAgIE1haW5fRGlyZWN0RHJhd19HZXRGb3VyQ0NDb2RlcywKKyAgICBNYWluX0RpcmVjdERyYXdfR2V0R0RJU3VyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdfR2V0TW9uaXRvckZyZXF1ZW5jeSwKKyAgICBNYWluX0RpcmVjdERyYXdfR2V0U2NhbkxpbmUsCisgICAgTWFpbl9EaXJlY3REcmF3X0dldFZlcnRpY2FsQmxhbmtTdGF0dXMsCisgICAgTWFpbl9EaXJlY3REcmF3X0luaXRpYWxpemUsCisgICAgWFZpZE1vZGVfRGlyZWN0RHJhd19SZXN0b3JlRGlzcGxheU1vZGUsCisgICAgTWFpbl9EaXJlY3REcmF3X1NldENvb3BlcmF0aXZlTGV2ZWwsCisgICAgWFZpZE1vZGVfRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZSwKKyAgICBNYWluX0RpcmVjdERyYXdfV2FpdEZvclZlcnRpY2FsQmxhbmssCisgICAgTWFpbl9EaXJlY3REcmF3X0dldEF2YWlsYWJsZVZpZE1lbSwKKyAgICBNYWluX0RpcmVjdERyYXdfR2V0U3VyZmFjZUZyb21EQywKKyAgICBNYWluX0RpcmVjdERyYXdfUmVzdG9yZUFsbFN1cmZhY2VzLAorICAgIE1haW5fRGlyZWN0RHJhd19UZXN0Q29vcGVyYXRpdmVMZXZlbCwKKyAgICBYVmlkTW9kZV9EaXJlY3REcmF3X0dldERldmljZUlkZW50aWZpZXIsCisgICAgTWFpbl9EaXJlY3REcmF3X1N0YXJ0TW9kZVRlc3QsCisgICAgTWFpbl9EaXJlY3REcmF3X0V2YWx1YXRlTW9kZQorfTsKKworI2VuZGlmIC8qIEhBVkVfTElCWFhGODZWTSAqLwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kZHJhdy94dmlkbW9kZS5oIGIvZGxscy9kZHJhdy9kZHJhdy94dmlkbW9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYTBiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RkcmF3L3h2aWRtb2RlLmgKQEAgLTAsMCArMSwzOSBAQAorLyogQ29weXJpZ2h0IDIwMDAgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzLCBJbmMuICovCisjaWZuZGVmIFdJTkVfRERSQVdfRERSQVdfWFZJRE1PREVfSF9JTkNMVURFRAorI2RlZmluZSBXSU5FX0REUkFXX0REUkFXX1hWSURNT0RFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3hmODZ2bW9kZS5oPgorCisjZGVmaW5lIFhWSURNT0RFX0REUkFXX1BSSVYoZGRyYXcpIFwKKwkoKFhWaWRNb2RlX0RpcmVjdERyYXdJbXBsKikoKGRkcmF3KS0+cHJpdmF0ZSkpCisjZGVmaW5lIFhWSURNT0RFX0REUkFXX1BSSVZfVkFSKG5hbWUsZGRyYXcpIFwKKwlYVmlkTW9kZV9EaXJlY3REcmF3SW1wbCogbmFtZSA9IFhWSURNT0RFX0REUkFXX1BSSVYoZGRyYXcpCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgWEY4NlZpZE1vZGVNb2RlSW5mbyogb3JpZ2luYWxfbW9kZTsKKyAgICBYRjg2VmlkTW9kZU1vZGVJbmZvKiBjdXJyZW50X21vZGU7Cit9IFhWaWRNb2RlX0RpcmVjdERyYXdJbXBsX1BhcnQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVXNlcl9EaXJlY3REcmF3SW1wbF9QYXJ0IHVzZXI7CisgICAgWFZpZE1vZGVfRGlyZWN0RHJhd0ltcGxfUGFydCB4dmlkbW9kZTsKK30gWFZpZE1vZGVfRGlyZWN0RHJhd0ltcGw7CisKK3ZvaWQgWFZpZE1vZGVfRGlyZWN0RHJhd19maW5hbF9yZWxlYXNlKElEaXJlY3REcmF3SW1wbCogVGhpcyk7CitIUkVTVUxUIFhWaWRNb2RlX0RpcmVjdERyYXdfQ29uc3RydWN0KElEaXJlY3REcmF3SW1wbCAqVGhpcywgQk9PTCBleCk7CitIUkVTVUxUIFhWaWRNb2RlX0RpcmVjdERyYXdfQ3JlYXRlKGNvbnN0IEdVSUQqIHBHVUlELCBMUERJUkVDVERSQVc3KiBwSWZhY2UsCisJCQkJICAgSVVua25vd24qIHBVbmtPdXRlciwgQk9PTCBleCk7CitIUkVTVUxUIFdJTkFQSQorWFZpZE1vZGVfRGlyZWN0RHJhd19HZXREZXZpY2VJZGVudGlmaWVyKExQRElSRUNURFJBVzcgaWZhY2UsCisJCQkJCUxQRERERVZJQ0VJREVOVElGSUVSMiBwRERESSwKKwkJCQkJRFdPUkQgZHdGbGFncyk7CitIUkVTVUxUIFdJTkFQSQorWFZpZE1vZGVfRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZShMUERJUkVDVERSQVc3IGlmYWNlLCBEV09SRCBkd1dpZHRoLAorCQkJCSAgIERXT1JEIGR3SGVpZ2h0LCBEV09SRCBkd0JQUCwKKwkJCQkgICBEV09SRCBkd1JlZnJlc2hSYXRlLCBEV09SRCBkd0ZsYWdzKTsKK0hSRVNVTFQgV0lOQVBJCitYVmlkTW9kZV9EaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVc3IGlmYWNlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RkcmF3X3ByaXZhdGUuaCBiL2RsbHMvZGRyYXcvZGRyYXdfcHJpdmF0ZS5oCmluZGV4IDgwM2E0YjUuLjIwNjE3ZmMgMTAwNjQ0Ci0tLSBhL2RsbHMvZGRyYXcvZGRyYXdfcHJpdmF0ZS5oCisrKyBiL2RsbHMvZGRyYXcvZGRyYXdfcHJpdmF0ZS5oCkBAIC0xLDMgKzEsNSBAQAorLyogQ29weXJpZ2h0IDIwMDAgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4gKi8KKwogI2lmbmRlZiBfX1dJTkVfRExMU19ERFJBV19ERFJBV19QUklWQVRFX0gKICNkZWZpbmUgX19XSU5FX0RMTFNfRERSQVdfRERSQVdfUFJJVkFURV9ICiAKQEAgLTgsMjIzICsxMCwxNDYgQEAKICNpbmNsdWRlICJ3aW5nZGkuaCIKICNpbmNsdWRlICJ3aW51c2VyLmgiCiAjaW5jbHVkZSAiZGRyYXcuaCIKKyNpbmNsdWRlICJkZGNvbWltcGwuaCIKIAotc3RhdGljIGNvbnN0IGNoYXIgV0lORV9VTlVTRUQgKmRkUHJvcCA9ICJXSU5FX0REUkFXX1Byb3BlcnR5IjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoaXMgaXMgdGhlIG1haW4gRGlyZWN0RHJhdyBkcml2ZXIgaW50ZXJmYWNlLiBJdCBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQKLSAqIG9ubHkgZnJvbSB0aGUgYmFzZSBmdW5jdGlvbnMgYW5kIG9ubHkgdXNlZCBieSB0aG9zZS4gSXQgc2hvdWxkIG5laXRoZXIgYmUKLSAqIGJlIGNhbGxlZCBub3IgdXNlZCB3aXRoaW4gdGhlIGludGVyZmFjZXMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGRkcmF3X2RyaXZlciB7Ci0JTFBHVUlECWd1aWQ7CQkvKnVuZGVyIHdoaWNoIHdlIGFyZSByZWZlcmVuY2VkIGFuZCBlbnVtZXJhdGVkKi8KLQlDSEFSCXR5cGVbMjBdOwkvKiB0eXBlLCB1c3VhbGx5ICJkaXNwbGF5IiAqLwotCUNIQVIJbmFtZVs0MF07CS8qIG5hbWUsIGxpa2UgIldJTkUgRm9vYmFyIERpcmVjdERyYXcgRHJpdmVyIiAqLwotCWludAlwcmVmZXJlbmNlOwkvKiBob3cgZ29vZCB3ZSBhcmUuIGRnYSBtaWdodCBnZXQgMTAwLCB4bGliIDUwKi8KLQlIUkVTVUxUCSgqY3JlYXRlRERSQVcpKExQRElSRUNURFJBVyopOyAvKiBhbHNvIGNoZWNrIGlmIGFyZyBpcyBOVUxMICovCi19IGRkcmF3X2RyaXZlcjsKLQotZXh0ZXJuIHZvaWQgZGRyYXdfcmVnaXN0ZXJfZHJpdmVyKGRkcmF3X2RyaXZlciopOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmVzLiBUaGV5IG11c3Qgbm90IGNvbnRhaW4gZHJpdmVyIHNwZWNpZmljIHN0dWZmLgotICogCi0gKiBGb3IgcHJpdmF0ZSBkYXRhIHRoZSAiTFBWT0lEIHByaXZhdGUiIHBvaW50ZXIgc2hvdWxkIGJlIHVzZWQuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdJbXBsCUlEaXJlY3REcmF3SW1wbDsKLXR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3MkltcGwJSURpcmVjdERyYXcySW1wbDsKLXR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3M0ltcGwJSURpcmVjdERyYXczSW1wbDsKLXR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3NEltcGwJSURpcmVjdERyYXc0SW1wbDsKLXR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZUltcGwJSURpcmVjdERyYXdQYWxldHRlSW1wbDsKLXR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwJSURpcmVjdERyYXdDbGlwcGVySW1wbDsKLQotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlSW1wbCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsOwotdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlMkltcGwgSURpcmVjdERyYXdTdXJmYWNlMkltcGw7Ci10eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbDsKLQotCi1leHRlcm4gc3RydWN0IElDT01fVlRBQkxFKElEaXJlY3REcmF3Q2xpcHBlcikJZGRjbGlwdnQ7Ci1leHRlcm4gc3RydWN0IElDT01fVlRBQkxFKElEaXJlY3REcmF3UGFsZXR0ZSkJZGRyYXdfZGRwYWx2dDsKKy8qIFhYWCBQdXQgdGhpcyBzb21ld2hlcmUgcHJvcGVyLiAqLworI2RlZmluZSBERF9TVFJVQ1RfSU5JVCh4KQkJCVwKKwlkbyB7CQkJCQlcCisJCW1lbXNldCgoeCksIDAsIHNpemVvZigqKHgpKSk7CVwKKwkJKHgpLT5kd1NpemUgPSBzaXplb2YoKngpOwlcCisJfSB3aGlsZSAoMCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJRGlyZWN0RHJhdyBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKICAqLwotc3RydWN0IF9jb21tb25fZGlyZWN0ZHJhd2RhdGEKKwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdJbXBsIElEaXJlY3REcmF3SW1wbDsKK3R5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZUltcGwgSURpcmVjdERyYXdQYWxldHRlSW1wbDsKK3R5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlckltcGwgSURpcmVjdERyYXdDbGlwcGVySW1wbDsKK3R5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwgSURpcmVjdERyYXdTdXJmYWNlSW1wbDsKKwordHlwZWRlZiB2b2lkICgqcGl4ZWxfY29udmVydF9mdW5jKSh2b2lkICpzcmMsIHZvaWQgKmRzdCwgRFdPUkQgd2lkdGgsCisJCQkJICAgRFdPUkQgaGVpZ2h0LCBMT05HIHBpdGNoLAorCQkJCSAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwgKnBhbGV0dGUpOworCit0eXBlZGVmIHZvaWQgKCpwYWxldHRlX2NvbnZlcnRfZnVuYykoTFBQQUxFVFRFRU5UUlkgcGFsZW50LAorCQkJCSAgICAgdm9pZCAqc2NyZWVuX3BhbGV0dGUsIERXT1JEIHN0YXJ0LAorCQkJCSAgICAgRFdPUkQgY291bnQpOworCitzdHJ1Y3QgSURpcmVjdERyYXdJbXBsCiB7Ci0gICAgaW50CQkgIHJlZjsJCS8qIGZvciB0aGlzIHN0cnVjdHVyZSwgb25seSBvbmNlIHBlciBvYmogKi8KLSAgICBERFBJWEVMRk9STUFUIGRpcmVjdGRyYXdfcGl4ZWxmb3JtYXQ7CisgICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXc3KTsKKyAgICBJQ09NX1ZGSUVMRF9NVUxUSShJRGlyZWN0RHJhdzQpOworICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3Mik7CisgICAgSUNPTV9WRklFTERfTVVMVEkoSURpcmVjdERyYXcpOworCisgICAgRFdPUkQgcmVmOworCisgICAgLyogVFJVRSBpZiBjcmVhdGVkIHZpYSBEaXJlY3REcmF3Q3JlYXRlRXggb3IgQ29DcmVhdGVJbnN0YW5jZSwKKyAgICAgKiBGQUxTRSBpZiBjcmVhdGVkIHZpYSBEaXJlY3REcmF3Q3JlYXRlLiAqLworICAgIEJPT0wgZXg7CisKKyAgICAvKiBMaW5rZWQgbGlzdCBvZiBzdXJmYWNlcywgam9pbmVkIGJ5IG5leHRfZGRyYXcgaW4gSURpcmVjdFN1cmZhY2VJbXBsLiAqLworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIHN1cmZhY2VzOworICAgIC8qIExpbmtlZCBsaXN0IG9mIHBhbGV0dGVzLCBqb2luZWQgYnkgbmV4dF9kZHJhdy4gKi8KKyAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWxldHRlczsKKyAgICAvKiBMaW5rZWQgbGlzdCBvZiBjbGlwcGVycywgam9pbmVkIGJ5IG5leHRfZGRyYXcuICovCisgICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCogY2xpcHBlcnM7CisKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBwcmltYXJ5X3N1cmZhY2U7CisKKyAgICBIV05EIHdpbmRvdzsKKyAgICBEV09SRCBjb29wZXJhdGl2ZV9sZXZlbDsKKyAgICBXTkRQUk9DIG9yaWdpbmFsX3duZHByb2M7CisKKyAgICBEV09SRCB3aWR0aCwgaGVpZ2h0OworICAgIExPTkcgcGl0Y2g7CisgICAgRERQSVhFTEZPUk1BVCBwaXhlbGZvcm1hdDsKKworICAgIC8qIFNob3VsZCBlYWNoIG9mIHRoZXNlIGdvIGludG8gc29tZSBzdHJ1Y3R1cmU/ICovCisgICAgRFdPUkQgb3JpZ193aWR0aCwgb3JpZ19oZWlnaHQ7CisgICAgTE9ORyBvcmlnX3BpdGNoOworICAgIEREUElYRUxGT1JNQVQgb3JpZ19waXhlbGZvcm1hdDsKKworICAgIC8qIENhbGxlZCB3aGVuIHRoZSByZWZjb3VudCBnb2VzIHRvIDAuICovCisgICAgdm9pZCAoKmZpbmFsX3JlbGVhc2UpKElEaXJlY3REcmF3SW1wbCAqVGhpcyk7CisKKyAgICBIUkVTVUxUICgqY3JlYXRlX3BhbGV0dGUpKElEaXJlY3REcmF3SW1wbCogVGhpcywgRFdPUkQgZHdGbGFncywKKwkJCSAgICAgIExQRElSRUNURFJBV1BBTEVUVEUqIHBwUGFsZXR0ZSwKKwkJCSAgICAgIExQVU5LTk9XTiBwVW5rT3V0ZXIpOworCisgICAgLyogU3VyZmFjZSBjcmVhdGlvbiBmdW5jdGlvbnMuIEZvciBhbGwgb2YgdGhlc2UsIHBPdXRlciA9PSBOVUxMLiAqLworCisgICAgLyogRG8gbm90IGNyZWF0ZSBhbnkgYmFja2J1ZmZlcnMgb3IgdGhlIGZsaXBwaW5nIGNoYWluLiAqLworICAgIEhSRVNVTFQgKCpjcmVhdGVfcHJpbWFyeSkoSURpcmVjdERyYXdJbXBsKiBUaGlzLAorCQkJICAgICAgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAorCQkJICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwgTFBVTktOT1dOIHBPdXRlcik7CisKKyAgICAvKiBQcmltYXJ5IG1heSBiZSBOVUxMIGlmIHdlIGFyZSBjcmVhdGluZyBhbiB1bmF0dGFjaGVkIGJhY2tidWZmZXIuICovCisgICAgSFJFU1VMVCAoKmNyZWF0ZV9iYWNrYnVmZmVyKShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCisJCQkJIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKKwkJCQkgTFBESVJFQ1REUkFXU1VSRkFDRTcqIHBwU3VyZiwKKwkJCQkgTFBVTktOT1dOIHBPdXRlciwKKwkJCQkgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJpbWFyeSk7CisKKyAgICAvKiBzaGlueSBoYXBweSBvZmZzY3JlZW5wbGFpbiBzdXJmYWNlcyAqLworICAgIEhSRVNVTFQgKCpjcmVhdGVfb2Zmc2NyZWVuKShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCisJCQkJY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAorCQkJCUxQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsCisJCQkJTFBVTktOT1dOIHBPdXRlcik7CisKKyAgICAvKiBkd01pcE1hcExldmVsIGlzIHNwZWNpZmllZCBhcyBwZXIgT3BlbkdMLiAoaS5lLiAwIGlzIGJhc2UpICovCisgICAgSFJFU1VMVCAoKmNyZWF0ZV90ZXh0dXJlKShJRGlyZWN0RHJhd0ltcGwqIFRoaXMsCisJCQkgICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QsCisJCQkgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLCBMUFVOS05PV04gcE91dGVyLAorCQkJICAgICAgRFdPUkQgZHdNaXBNYXBMZXZlbCk7CisKKyAgICBIUkVTVUxUICgqY3JlYXRlX3pidWZmZXIpKElEaXJlY3REcmF3SW1wbCogVGhpcywKKwkJCSAgICAgIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKKwkJCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsIExQVU5LTk9XTiBwT3V0ZXIpOworICAgIAorICAgIExQVk9JRAlwcml2YXRlOworCisgICAgLyogRXZlcnl0aGluZyBiZWxvdyBoZXJlIGlzIHN0aWxsIHF1ZXN0aW9uYWJsZS4gKi8KKwogICAgIEREUElYRUxGT1JNQVQgc2NyZWVuX3BpeGVsZm9ybWF0OwogCiAgICAgaW50ICAgICAgICAgICBwaXhtYXBfZGVwdGg7Ci0gICAgdm9pZCAoKnBpeGVsX2NvbnZlcnQpKHZvaWQgKnNyYywgdm9pZCAqZHN0LCBEV09SRCB3aWR0aCwgRFdPUkQgaGVpZ2h0LCBMT05HIHBpdGNoLCBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICpwYWxldHRlKTsKLSAgICB2b2lkICgqcGFsZXR0ZV9jb252ZXJ0KShMUFBBTEVUVEVFTlRSWSBwYWxlbnQsIHZvaWQgKnNjcmVlbl9wYWxldHRlLCBEV09SRCBzdGFydCwgRFdPUkQgY291bnQpOwotICAgIERXT1JEICAgICAgICAgaGVpZ2h0LHdpZHRoOwkvKiBzZXQgYnkgU2V0RGlzcGxheU1vZGUgKi8KLSAgICBIV05EICAgICAgICAgIG1haW5XaW5kb3c7ICAgLyogc2V0IGJ5IFNldENvb3BlcmF0aXZlTGV2ZWwgKi8KKyAgICBwaXhlbF9jb252ZXJ0X2Z1bmMgcGl4ZWxfY29udmVydDsKKyAgICBwYWxldHRlX2NvbnZlcnRfZnVuYyBwYWxldHRlX2NvbnZlcnQ7CisgICAgY29uc3Qgc3RydWN0IHRhZ0RDX0ZVTkNTICpmdW5jcywgKm9sZF9mdW5jczsgLyogRElTUExBWS5EUlYgb3ZlcnJpZGVzICovCiAKICAgICAvKiBUaGlzIGlzIGZvciB0aGUgZmFrZSBtYWluV2luZG93ICovCi0gICAgQVRPTSAgICAgICAgICB3aW5jbGFzczsKLSAgICBIV05EICAgICAgICAgIHdpbmRvdzsKLSAgICBQQUlOVFNUUlVDVCAgIHBzOwotICAgIGludCAgICAgICAgICAgcGFpbnRhYmxlOwotICAgIExQVk9JRAkgIHByaXZhdGU7CisgICAgQVRPTQl3aW5jbGFzczsKKyAgICBQQUlOVFNUUlVDVAlwczsKKyAgICBCT09MCXBhaW50YWJsZTsKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSURpcmVjdERyYXcgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCi0gKiAKLSAqIE5vdGU6IEFsbCB0aGUgSURpcmVjdERyYXcqSW1wbCBzdHJ1Y3R1cmVzIF9NVVNUXyBoYXZlIElERU5USUNBTCBsYXlvdXQsCi0gKiAJIHNpbmNlIHdlIHJldXNlIGZ1bmN0aW9ucyBhY3Jvc3MgaW50ZXJmYWNlIHZlcnNpb25zLgotICovCi1zdHJ1Y3QgSURpcmVjdERyYXdJbXBsCi17Ci0gICAgLyogSVVua25vd24gZmllbGRzICovCi0gICAgSUNPTV9WRklFTEQoSURpcmVjdERyYXcpOwotICAgIERXT1JECQkJCXJlZjsKLQotICAgIC8qIElEaXJlY3REcmF3IGZpZWxkcyAqLwotICAgIHN0cnVjdCBfY29tbW9uX2RpcmVjdGRyYXdkYXRhCSpkOwotfTsKLQotc3RydWN0IElEaXJlY3REcmF3MkltcGwKLXsKLSAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KLSAgICBJQ09NX1ZGSUVMRChJRGlyZWN0RHJhdzIpOwotICAgIERXT1JECQkJCXJlZjsKLQotICAgIC8qIElEaXJlY3REcmF3IGZpZWxkcyAqLwotICAgIHN0cnVjdCBfY29tbW9uX2RpcmVjdGRyYXdkYXRhCSpkOwotfTsKLQotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3SW1wbF9TZXREaXNwbGF5TW9kZSgKLQlMUERJUkVDVERSQVcgaWZhY2UsRFdPUkQgd2lkdGgsRFdPUkQgaGVpZ2h0LERXT1JEIGRlcHRoCi0pOwotCi1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9EdXBsaWNhdGVTdXJmYWNlKAotCUxQRElSRUNURFJBVzIgaWZhY2UsTFBESVJFQ1REUkFXU1VSRkFDRSBzcmMsTFBESVJFQ1REUkFXU1VSRkFDRSAqZHN0Ci0pOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfU2V0Q29vcGVyYXRpdmVMZXZlbCgKLQlMUERJUkVDVERSQVcyIGlmYWNlLEhXTkQgaHduZCxEV09SRCBjb29wbGV2ZWwKLSk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9HZXRDYXBzKAotCUxQRElSRUNURFJBVzIgaWZhY2UsTFBERENBUFMgY2FwczEsTFBERENBUFMgY2FwczIKLSkgOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfQ3JlYXRlQ2xpcHBlcigKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLERXT1JEIHgsTFBESVJFQ1REUkFXQ0xJUFBFUiAqbHBkZGNsaXAsTFBVTktOT1dOIGxwdW5rCi0pOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIGNvbW1vbl9JRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVBhbGV0dGUoCi0gICAgSURpcmVjdERyYXcySW1wbCogVGhpcyxEV09SRCBkd0ZsYWdzLExQUEFMRVRURUVOVFJZIHBhbGVudCwKLSAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICoqbHBkZHBhbCxMUFVOS05PV04gbHB1bmssaW50ICpwc2l6ZQotKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVBhbGV0dGUoCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSxEV09SRCBkd0ZsYWdzLExQUEFMRVRURUVOVFJZIHBhbGVudCxMUERJUkVDVERSQVdQQUxFVFRFICpscGRkcGFsLExQVU5LTk9XTiBscHVuawotKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJJbXBsX1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVcyIGlmYWNlKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJJbXBsX1dhaXRGb3JWZXJ0aWNhbEJsYW5rKAotCUxQRElSRUNURFJBVzIgaWZhY2UsRFdPUkQgeCxIQU5ETEUgaAotKTsKLWV4dGVybiBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9BZGRSZWYoTFBESVJFQ1REUkFXMiBpZmFjZSk7Ci1leHRlcm4gVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfUmVsZWFzZShMUERJUkVDVERSQVcyIGlmYWNlKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJJbXBsX1F1ZXJ5SW50ZXJmYWNlKAotCUxQRElSRUNURFJBVzIgaWZhY2UsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iagotKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJJbXBsX0dldFZlcnRpY2FsQmxhbmtTdGF0dXMoCi0JTFBESVJFQ1REUkFXMiBpZmFjZSxCT09MICpzdGF0dXMKLSk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9FbnVtRGlzcGxheU1vZGVzKAotCUxQRElSRUNURFJBVzIgaWZhY2UsRFdPUkQgZHdGbGFncyxMUEREU1VSRkFDRURFU0MgbHBkZHNmZCxMUFZPSUQgY29udGV4dCxMUERERU5VTU1PREVTQ0FMTEJBQ0sgbW9kZXNjYgotKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJJbXBsX0dldERpc3BsYXlNb2RlKAotCUxQRElSRUNURFJBVzIgaWZhY2UsTFBERFNVUkZBQ0VERVNDIGxwZGRzZmQKLSk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9GbGlwVG9HRElTdXJmYWNlKExQRElSRUNURFJBVzIgaWZhY2UpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfR2V0TW9uaXRvckZyZXF1ZW5jeSgKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLExQRFdPUkQgZnJlcQotKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJJbXBsX0dldEZvdXJDQ0NvZGVzKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsTFBEV09SRCB4LExQRFdPUkQgeQotKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJJbXBsX0VudW1TdXJmYWNlcygKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLERXT1JEIHgsTFBERFNVUkZBQ0VERVNDIGRkc2ZkLExQVk9JRCBjb250ZXh0LAotICAgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSyBkZHNmY2IKLSk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9Db21wYWN0KCBMUERJUkVDVERSQVcyIGlmYWNlICk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9HZXRHRElTdXJmYWNlKAotICAgIExQRElSRUNURFJBVzIgaWZhY2UsIExQRElSRUNURFJBV1NVUkZBQ0UgKmxwbHBHRElERFNTdXJmYWNlCi0pOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfR2V0U2NhbkxpbmUoCi0gICAgTFBESVJFQ1REUkFXMiBpZmFjZSwgTFBEV09SRCBscGR3U2NhbkxpbmUKLSk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9Jbml0aWFsaXplKExQRElSRUNURFJBVzIgaWZhY2UsIEdVSUQgKmxwR1VJRCk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcySW1wbF9TZXREaXNwbGF5TW9kZSgKLSAgICBMUERJUkVDVERSQVcyIGlmYWNlLERXT1JEIHdpZHRoLERXT1JEIGhlaWdodCxEV09SRCBkZXB0aCwKLSAgICBEV09SRCBkd1JlZnJlc2hSYXRlLCBEV09SRCBkd0ZsYWdzCi0pOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3MkltcGxfR2V0QXZhaWxhYmxlVmlkTWVtKAotCUxQRElSRUNURFJBVzIgaWZhY2UsTFBERFNDQVBTIGRkc2NhcHMsTFBEV09SRCB0b3RhbCxMUERXT1JEIGZyZWUKLSk7Ci1leHRlcm4gSFJFU1VMVCBjb21tb25fb2ZmX3NjcmVlbl9DcmVhdGVTdXJmYWNlKAotCUlEaXJlY3REcmF3MkltcGwqIFRoaXMsSURpcmVjdERyYXdTdXJmYWNlSW1wbCogbHBkc2YKLSk7Ci0KLS8qCi0gKiBJRGlyZWN0RHJhdzQgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCi0gKi8KLXN0cnVjdCBJRGlyZWN0RHJhdzRJbXBsCi17Ci0gICAgLyogSVVua25vd24gZmllbGRzICovCi0gICAgSUNPTV9WRklFTEQoSURpcmVjdERyYXc0KTsKLSAgICBEV09SRAkJCQlyZWY7Ci0gICAgLyogSURpcmVjdERyYXc0IGZpZWxkcyAqLwotICAgIHN0cnVjdCBfY29tbW9uX2RpcmVjdGRyYXdkYXRhCSpkOwotfTsKLQotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3NEltcGxfR2V0U3VyZmFjZUZyb21EQygKLQlMUERJUkVDVERSQVc0IGlmYWNlLCBIREMgaGRjLCBMUERJUkVDVERSQVdTVVJGQUNFICpscEREUwotKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzRJbXBsX1Jlc3RvcmVBbGxTdXJmYWNlcyhMUERJUkVDVERSQVc0IGlmYWNlKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzRJbXBsX1Rlc3RDb29wZXJhdGl2ZUxldmVsKExQRElSRUNURFJBVzQgaWZhY2UpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3NEltcGxfR2V0RGV2aWNlSWRlbnRpZmllcihMUERJUkVDVERSQVc0IGlmYWNlLAotCQkJCQkJICAgIExQRERERVZJQ0VJREVOVElGSUVSIGxwZGRkaSwKLQkJCQkJCSAgICBEV09SRCBkd0ZsYWdzCi0pOwotCi1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXc3SW1wbF9TdGFydE1vZGVUZXN0KAotCUxQRElSRUNURFJBVzcgaWZhY2UsTFBTSVpFIG1vZGV0b3Rlc3QsRFdPUkQgbnVtLERXT1JEIGZsYWdzCi0pOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3N0ltcGxfRXZhbHVhdGVNb2RlKAotCUxQRElSRUNURFJBVzcgaWZhY2UsRFdPUkQgZmxhZ3MsRFdPUkQgKnNlY29uZHVudGlsdGltZW91dAotKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJRGlyZWN0RHJhd1BhbGV0dGUgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCiAgKi8KIHN0cnVjdCBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsCiB7CiAgICAgLyogSVVua25vd24gZmllbGRzICovCi0gICAgSUNPTV9WRklFTEQoSURpcmVjdERyYXdQYWxldHRlKTsKLSAgICBEV09SRAkJcmVmOworICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3UGFsZXR0ZSk7CisgICAgRFdPUkQgcmVmOwogCiAgICAgLyogSURpcmVjdERyYXdQYWxldHRlIGZpZWxkcyAqLwotICAgIElEaXJlY3REcmF3SW1wbCoJCWRkcmF3OwkvKiBkaXJlY3QgZHJhdywgbm8gcmVmZXJlbmNlIGNvdW50ICovCisgICAgRFdPUkQJCWZsYWdzOworICAgIEhQQUxFVFRFCQlocGFsOworICAgIFdPUkQJCXBhbFZlcnNpb24sIHBhbE51bUVudHJpZXM7IC8qIExPR1BBTEVUVEUgKi8KICAgICBQQUxFVFRFRU5UUlkJcGFsZW50c1syNTZdOwotCiAgICAgLyogVGhpcyBpcyB0byBzdG9yZSB0aGUgcGFsZXR0ZSBpbiAnc2NyZWVuIGZvcm1hdCcgKi8KICAgICBpbnQJCQlzY3JlZW5fcGFsZW50c1syNTZdOworCisgICAgVk9JRCAoKmZpbmFsX3JlbGVhc2UpKElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIFRoaXMpOworCisgICAgSURpcmVjdERyYXdJbXBsKiBkZHJhd19vd25lcjsKKyAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwcmV2X2RkcmF3OworICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIG5leHRfZGRyYXc7CisKICAgICBMUFZPSUQJCXByaXZhdGU7CiB9OwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfR2V0RW50cmllcyhMUERJUkVDVERSQVdQQUxFVFRFLERXT1JELERXT1JELERXT1JELExQUEFMRVRURUVOVFJZKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1NldEVudHJpZXMoTFBESVJFQ1REUkFXUEFMRVRURSxEV09SRCxEV09SRCxEV09SRCxMUFBBTEVUVEVFTlRSWSk7Ci1leHRlcm4gVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfUmVsZWFzZShMUERJUkVDVERSQVdQQUxFVFRFKTsKLWV4dGVybiBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdQYWxldHRlSW1wbF9BZGRSZWYoTFBESVJFQ1REUkFXUEFMRVRURSk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdQYWxldHRlSW1wbF9Jbml0aWFsaXplKExQRElSRUNURFJBV1BBTEVUVEUsTFBESVJFQ1REUkFXLERXT1JELExQUEFMRVRURUVOVFJZKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0dldENhcHMoTFBESVJFQ1REUkFXUEFMRVRURSxMUERXT1JEKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNURFJBV1BBTEVUVEUsUkVGSUlELExQVk9JRCAqKTsKLQotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIGNvbW1vbl9JRGlyZWN0RHJhdzJJbXBsX0NyZWF0ZVBhbGV0dGUoCi0gICAgSURpcmVjdERyYXcySW1wbCogVGhpcyxEV09SRCBkd0ZsYWdzLExQUEFMRVRURUVOVFJZIHBhbGVudCwKLSAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICoqbHBkZHBhbCxMUFVOS05PV04gbHB1bmssaW50ICpwc2l6ZQotKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJRGlyZWN0RHJhd0NsaXBwZXIgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCkBAIC0yMzIsMTQ1ICsxNTcsMTE0IEBACiBzdHJ1Y3QgSURpcmVjdERyYXdDbGlwcGVySW1wbAogewogICAgIC8qIElVbmtub3duIGZpZWxkcyAqLwotICAgIElDT01fVkZJRUxEKElEaXJlY3REcmF3Q2xpcHBlcik7Ci0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmOworICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3Q2xpcHBlcik7CisgICAgRFdPUkQgcmVmOwogCiAgICAgLyogSURpcmVjdERyYXdDbGlwcGVyIGZpZWxkcyAqLwogICAgIEhXTkQgaFduZDsKKworICAgIElEaXJlY3REcmF3SW1wbCogZGRyYXdfb3duZXI7CisgICAgSURpcmVjdERyYXdDbGlwcGVySW1wbCogcHJldl9kZHJhdzsKKyAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsKiBuZXh0X2RkcmF3OwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJRGlyZWN0RHJhd1N1cmZhY2UgaW1wbGVtZW50YXRpb24gc3RydWN0dXJlCiAgKi8KLXN0cnVjdCBJRGlyZWN0M0RUZXh0dXJlMkltcGw7Ci1zdHJ1Y3QgX2NvbW1vbl9kaXJlY3RkcmF3c3VyZmFjZQotewotICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqICAgICBwYWxldHRlOwotICAgIElEaXJlY3REcmF3MkltcGwqICAgICAgICAgICBkZHJhdzsKLQotICAgIHN0cnVjdCBfc3VyZmFjZV9jaGFpbiAJKmNoYWluOwotCi0gICAgRERTVVJGQUNFREVTQyAgICAgICAgICAgICAgIHN1cmZhY2VfZGVzYzsKLQotICAgIC8qIEZvciBHZXQgLyBSZWxlYXNlIERDIG1ldGhvZHMgKi8KLSAgICBIQklUTUFQCQkJRElCc2VjdGlvbjsKLSAgICB2b2lkCQkJKmJpdG1hcF9kYXRhOwotICAgIEhEQwkJCQloZGM7Ci0gICAgSEdESU9CSgkJCWhvbGRiaXRtYXA7Ci0gICAgTFBESVJFQ1REUkFXQ0xJUFBFUgkJbHBDbGlwcGVyOwotICAgIAotICAgIC8qIENhbGxiYWNrIGZvciBsb2FkZWQgdGV4dHVyZXMgKi8KLSAgICBzdHJ1Y3QgSURpcmVjdDNEVGV4dHVyZTJJbXBsKgl0ZXh0dXJlOwotICAgIEhSRVNVTFQgV0lOQVBJCQkoKlNldENvbG9yS2V5X2NiKShzdHJ1Y3QgSURpcmVjdDNEVGV4dHVyZTJJbXBsICp0ZXh0dXJlLCBEV09SRCBkd0ZsYWdzLCBMUEREQ09MT1JLRVkgY2tleSApIDsgCi19OwotZXh0ZXJuIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsKiBfY29tbW9uX2ZpbmRfZmxpcHRvKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsKiBUaGlzLElEaXJlY3REcmF3U3VyZmFjZTRJbXBsKiBmbGlwdG8pOwogCiBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlSW1wbAogewogICAgIC8qIElVbmtub3duIGZpZWxkcyAqLwotICAgIElDT01fVkZJRUxEKElEaXJlY3REcmF3U3VyZmFjZSk7Ci0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmOworICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3U3VyZmFjZTcpOworICAgIElDT01fVkZJRUxEX01VTFRJKElEaXJlY3REcmF3U3VyZmFjZTMpOworICAgIERXT1JEIHJlZjsKIAotICAgIC8qIElEaXJlY3REcmF3U3VyZmFjZSBmaWVsZHMgKi8KLSAgICBzdHJ1Y3QgX2NvbW1vbl9kaXJlY3RkcmF3c3VyZmFjZQlzOworICAgIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBhdHRhY2hlZDsgLyogYXR0YWNoZWQgc3VyZmFjZXMgKi8KKworICAgIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBuZXh0X2RkcmF3OyAvKiBkZHJhdyBzdXJmYWNlIGNoYWluICovCisgICAgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwqIHByZXZfZGRyYXc7CisgICAgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZUltcGwqIG5leHRfYXR0YWNoZWQ7IC8qIGF0dGFjaGVkIHN1cmZhY2UgY2hhaW4gKi8KKyAgICBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJldl9hdHRhY2hlZDsKKworICAgIElEaXJlY3REcmF3SW1wbCogZGRyYXdfb3duZXI7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZmFjZV9vd25lcjsKKworICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbGV0dGU7IC8qIHN0cm9uZyByZWYgKi8KKyAgICBJRGlyZWN0RHJhd0NsaXBwZXJJbXBsKiBjbGlwcGVyOyAvKiBzdHJvbmcgcmVmICovCisKKyAgICBERFNVUkZBQ0VERVNDMiBzdXJmYWNlX2Rlc2M7CisKKyAgICBIREMgaERDOworICAgIEJPT0wgZGNfaW5fdXNlOworCisgICAgSFJFU1VMVCAoKmR1cGxpY2F0ZV9zdXJmYWNlKShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzcmMsCisJCQkJIExQRElSRUNURFJBV1NVUkZBQ0U3KiBkc3QpOworICAgIHZvaWQgKCpmaW5hbF9yZWxlYXNlKShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzKTsKKyAgICBCT09MICgqYXR0YWNoKShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICp0byk7CisgICAgQk9PTCAoKmRldGFjaCkoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyk7CisgICAgdm9pZCAoKmxvY2tfdXBkYXRlKShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBMUENSRUNUIHBSZWN0KTsKKyAgICB2b2lkICgqdW5sb2NrX3VwZGF0ZSkoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgTFBDUkVDVCBwUmVjdCk7CisgICAgdm9pZCAoKmxvc2Vfc3VyZmFjZSkoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyk7CisgICAgdm9pZCAoKmZsaXBfZGF0YSkoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogZnJvbnQsCisJCSAgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGJhY2spOworICAgIHZvaWQgKCpmbGlwX3VwZGF0ZSkoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogZnJvbnQpOworICAgIEhSRVNVTFQgKCpnZXRfZGMpKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIEhEQyogcGhEQyk7CisgICAgSFJFU1VMVCAoKnJlbGVhc2VfZGMpKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIEhEQyBoREMpOworICAgIHZvaWQgKCpzZXRfcGFsZXR0ZSkoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsKTsKKyAgICB2b2lkICgqdXBkYXRlX3BhbGV0dGUpKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCwKKwkJCSAgIERXT1JEIGR3U3RhcnQsIERXT1JEIGR3Q291bnQsIExQUEFMRVRURUVOVFJZIHBhbGVudCk7CisgICAgSFdORCAoKmdldF9kaXNwbGF5X3dpbmRvdykoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcyk7CisKKyAgICBzdHJ1Y3QgUHJpdmF0ZURhdGEqIHByaXZhdGVfZGF0YTsKKworICAgIERXT1JEIG1heF9sb2Q7CisgICAgRFdPUkQgcHJpb3JpdHk7CisKKyAgICBCT09MIGxvc3Q7CisKKyAgICBEV09SRCB1bmlxdWVuZXNzX3ZhbHVlOworCiAgICAgTFBWT0lEIHByaXZhdGU7CisKKyAgICAvKiBFdmVyeXRoaW5nIGJlbG93IGhlcmUgaXMgZG9kZ3kuICovCisgICAgLyogRm9yIERpcmVjdDNEIHVzZSAqLworICAgIExQVk9JRAkJCWF1eF9jdHgsIGF1eF9kYXRhOworICAgIHZvaWQgKCphdXhfcmVsZWFzZSkoTFBWT0lEIGN0eCwgTFBWT0lEIGRhdGEpOworICAgIEJPT0wgKCphdXhfZmxpcCkoTFBWT0lEIGN0eCwgTFBWT0lEIGRhdGEpOworICAgIHZvaWQgKCphdXhfdW5sb2NrKShMUFZPSUQgY3R4LCBMUFZPSUQgZGF0YSwgTFBSRUNUIGxwUmVjdCk7CisgICAgc3RydWN0IElEaXJlY3QzRFRleHR1cmUySW1wbCoJdGV4dHVyZTsKKyAgICBIUkVTVUxUIFdJTkFQSQkJKCpTZXRDb2xvcktleV9jYikoc3RydWN0IElEaXJlY3QzRFRleHR1cmUySW1wbCAqdGV4dHVyZSwgRFdPUkQgZHdGbGFncywgTFBERENPTE9SS0VZIGNrZXkgKSA7IAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJRGlyZWN0RHJhd1N1cmZhY2UyIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZQorICogRHJpdmVyIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucy4KICAqLwotc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTJJbXBsCi17Ci0gICAgLyogSVVua25vd24gZmllbGRzICovCi0gICAgSUNPTV9WRklFTEQoSURpcmVjdERyYXdTdXJmYWNlMik7Ci0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjsKLSAgICAvKiBJRGlyZWN0RHJhd1N1cmZhY2UyIGZpZWxkcyAqLwotICAgIHN0cnVjdCBfY29tbW9uX2RpcmVjdGRyYXdzdXJmYWNlCXM7Ci0gICAgTFBWT0lEIHByaXZhdGU7Ci19OworQk9PTCBERFJBV19Vc2VyX0luaXQoSElOU1RBTkNFLCBEV09SRCwgTFBWT0lEKTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJRGlyZWN0RHJhd1N1cmZhY2UzIGltcGxlbWVudGF0aW9uIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IEREREVWSUNFSURFTlRJRklFUjIqIGluZm87CisgICAgaW50CXByZWZlcmVuY2U7CS8qIGhvdyBnb29kIHdlIGFyZS4gZGdhIG1pZ2h0IGdldCAxMDAsIHhsaWIgNTAqLworICAgIEhSRVNVTFQgKCpjcmVhdGUpKGNvbnN0IEdVSUQqLCBMUERJUkVDVERSQVc3KiwgTFBVTktOT1dOLCBCT09MIGV4KTsKKworICAgIC8qIEZvciBJRGlyZWN0RHJhdzc6OkluaXRpYWxpemUuICovCisgICAgSFJFU1VMVCAoKmluaXQpKElEaXJlY3REcmF3SW1wbCAqLCBjb25zdCBHVUlEKik7Cit9IGRkcmF3X2RyaXZlcjsKKwordm9pZCBERFJBV19yZWdpc3Rlcl9kcml2ZXIoY29uc3QgZGRyYXdfZHJpdmVyKik7CisKK2NvbnN0IGRkcmF3X2RyaXZlciogRERSQVdfRmluZERyaXZlcihjb25zdCBHVUlEKiBndWlkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFuZG9tIHV0aWxpdGllcwogICovCi1zdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlM0ltcGwKLXsKLSAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KLSAgICBJQ09NX1ZGSUVMRChJRGlyZWN0RHJhd1N1cmZhY2UzKTsKLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmOwotICAgIC8qIElEaXJlY3REcmF3U3VyZmFjZTMgZmllbGRzICovCi0gICAgc3RydWN0IF9jb21tb25fZGlyZWN0ZHJhd3N1cmZhY2UJczsKLSAgICBMUFZPSUQgcHJpdmF0ZTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSURpcmVjdERyYXdTdXJmYWNlNCBpbXBsZW1lbnRhdGlvbiBzdHJ1Y3R1cmUKLSAqLwotc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTRJbXBsCi17Ci0gICAgLyogSVVua25vd24gZmllbGRzICovCi0gICAgSUNPTV9WRklFTEQoSURpcmVjdERyYXdTdXJmYWNlNCk7Ci0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjsKLQotICAgIC8qIElEaXJlY3REcmF3U3VyZmFjZTQgZmllbGRzICovCi0gICAgc3RydWN0IF9jb21tb25fZGlyZWN0ZHJhd3N1cmZhY2UJczsKLSAgICBMUFZPSUQgcHJpdmF0ZTsKLX0gOwotCi1zdHJ1Y3QgX3N1cmZhY2VfY2hhaW4gewotCUlEaXJlY3REcmF3U3VyZmFjZTRJbXBsCSoqc3VyZmFjZXM7Ci0JaW50CQkJbnJvZnN1cmZhY2VzOwotfTsKLWV4dGVybiBIUkVTVUxUIGNvbW1vbl9vZmZfc2NyZWVuX0NyZWF0ZVN1cmZhY2UoSURpcmVjdERyYXcySW1wbCogVGhpcyxJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBscGRzZik7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfTG9jayhMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUFJFQ1QgbHByZWN0LExQRERTVVJGQUNFREVTQyBscGRkc2QsRFdPUkQgZmxhZ3MsIEhBTkRMRSBobmQpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1VubG9jayggTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBWT0lEIHN1cmZhY2UpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0JsdChMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUFJFQ1QgcmRzdCxMUERJUkVDVERSQVdTVVJGQUNFNCBzcmMsTFBSRUNUIHJzcmMsRFdPUkQgZHdGbGFncyxMUEREQkxURlggbHBibHRmeCk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfQmx0RmFzdChMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxEV09SRCBkc3R4LERXT1JEIGRzdHksTFBESVJFQ1REUkFXU1VSRkFDRTQgc3JjLExQUkVDVCByc3JjLERXT1JEIHRyYW5zKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9CbHRCYXRjaChMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUEREQkxUQkFUQ0ggZGRibHRiYXRjaCxEV09SRCB4LERXT1JEIHkpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldENhcHMoTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBERFNDQVBTIGNhcHMpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldFN1cmZhY2VEZXNjKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLExQRERTVVJGQUNFREVTQyBkZHNkKTsKLWV4dGVybiBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfQWRkUmVmKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRBdHRhY2hlZFN1cmZhY2UoTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBERFNDQVBTIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFNCAqbHBkc2YpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0luaXRpYWxpemUoTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBESVJFQ1REUkFXIGRkcmF3LExQRERTVVJGQUNFREVTQyBscGRzZmQpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldFBpeGVsRm9ybWF0KExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLExQRERQSVhFTEZPUk1BVCBwZik7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0Qmx0U3RhdHVzKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLERXT1JEIGR3RmxhZ3MpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldE92ZXJsYXlQb3NpdGlvbihMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUExPTkcgeDEsTFBMT05HIHgyKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRDbGlwcGVyKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLExQRElSRUNURFJBV0NMSVBQRVIgbHBDbGlwcGVyKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9BZGRBdHRhY2hlZFN1cmZhY2UoTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBESVJFQ1REUkFXU1VSRkFDRTQgc3VyZik7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0REMoTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsSERDKiBscGhkYyk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUmVsZWFzZURDKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLEhEQyBoZGMpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLFJFRklJRCByZWZpaWQsTFBWT0lEICpvYmopOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0lzTG9zdChMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfRW51bUF0dGFjaGVkU3VyZmFjZXMoTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBWT0lEIGNvbnRleHQsTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLIGVzZmNiKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9SZXN0b3JlKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRDb2xvcktleShMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSwgRFdPUkQgZHdGbGFncywgTFBERENPTE9SS0VZIGNrZXkpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0FkZE92ZXJsYXlEaXJ0eVJlY3QoTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBSRUNUIGxwUmVjdCk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfRGVsZXRlQXR0YWNoZWRTdXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLERXT1JEIGR3RmxhZ3MsTFBESVJFQ1REUkFXU1VSRkFDRTQgbHBERFNBdHRhY2hlZFN1cmZhY2UpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0VudW1PdmVybGF5Wk9yZGVycyhMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxEV09SRCBkd0ZsYWdzLExQVk9JRCBscENvbnRleHQsTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLIGxwZm5DYWxsYmFjayk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0Q2xpcHBlcihMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUERJUkVDVERSQVdDTElQUEVSKiBscGxwRERDbGlwcGVyKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRDb2xvcktleShMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxEV09SRCBkd0ZsYWdzLExQRERDT0xPUktFWSBscEREQ29sb3JLZXkpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldEZsaXBTdGF0dXMoTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsRFdPUkQgZHdGbGFncyk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0UGFsZXR0ZShMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUERJUkVDVERSQVdQQUxFVFRFKiBscGxwRERQYWxldHRlKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRPdmVybGF5UG9zaXRpb24oTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTE9ORyBsWCxMT05HIGxZKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9VcGRhdGVPdmVybGF5KExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLExQUkVDVCBscFNyY1JlY3QsTFBESVJFQ1REUkFXU1VSRkFDRTQgbHBERERlc3RTdXJmYWNlLExQUkVDVCBscERlc3RSZWN0LERXT1JEIGR3RmxhZ3MsTFBERE9WRVJMQVlGWCBscERET3ZlcmxheUZ4KTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9VcGRhdGVPdmVybGF5RGlzcGxheShMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxEV09SRCBkd0ZsYWdzKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9VcGRhdGVPdmVybGF5Wk9yZGVyKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLERXT1JEIGR3RmxhZ3MsTFBESVJFQ1REUkFXU1VSRkFDRTQgbHBERFNSZWZlcmVuY2UpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldERESW50ZXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLExQVk9JRCogbHBscEREKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9QYWdlTG9jayhMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxEV09SRCBkd0ZsYWdzKTsKLWV4dGVybiBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9QYWdlVW5sb2NrKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLERXT1JEIGR3RmxhZ3MpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1NldFN1cmZhY2VEZXNjKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLExQRERTVVJGQUNFREVTQyBscEREU0QsRFdPUkQgZHdGbGFncyk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfU2V0UHJpdmF0ZURhdGEoTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsUkVGR1VJRCBndWlkVGFnLExQVk9JRCBscERhdGEsRFdPUkQgY2JTaXplLERXT1JEIGR3RmxhZ3MpOwotZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldFByaXZhdGVEYXRhKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLFJFRkdVSUQgZ3VpZFRhZyxMUFZPSUQgbHBCdWZmZXIsTFBEV09SRCBscGNiQnVmZmVyU2l6ZSk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfRnJlZVByaXZhdGVEYXRhKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLFJFRkdVSUQgZ3VpZFRhZyk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0VW5pcXVlbmVzc1ZhbHVlKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLExQRFdPUkQgbHBWYWx1ZSk7Ci1leHRlcm4gSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfQ2hhbmdlVW5pcXVlbmVzc1ZhbHVlKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlKTsKLQotZXh0ZXJuIHZvaWQgX2NvbW1vbl9JRGlyZWN0RHJhd0ltcGxfU2V0RGlzcGxheU1vZGUoSURpcmVjdERyYXdJbXBsKiBUaGlzKTsKIAogLyogR2V0IEREU0NBUFMgb2Ygc3VyZmFjZSAoc2hvcnRjdXRtYWNybykgKi8KICNkZWZpbmUgU0REU0NBUFMoaWZhY2UpICgoaWZhY2UpLT5zLnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcykKIC8qIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbCBmb3IgYSBnaXZlbiBzdXJmYWNlICovCi0jZGVmaW5lIFBGR0VUX0JQUChwZikgKHBmLmR3RmxhZ3MmRERQRl9QQUxFVFRFSU5ERVhFRDg/MTooKHBmLnUuZHdSR0JCaXRDb3VudCs3KS84KSkKLSNkZWZpbmUgR0VUX0JQUChkZXNjKSBQRkdFVF9CUFAoZGVzYy5kZHBmUGl4ZWxGb3JtYXQpCisjZGVmaW5lIFBGR0VUX0JQUChwZikgKHBmLmR3RmxhZ3MmRERQRl9QQUxFVFRFSU5ERVhFRDg/MTooKHBmLnUxLmR3UkdCQml0Q291bnQrNykvOCkpCisjZGVmaW5lIEdFVF9CUFAoZGVzYykgUEZHRVRfQlBQKGRlc2MudTQuZGRwZlBpeGVsRm9ybWF0KQorCitMT05HIEREUkFXX3dpZHRoX2JwcF90b19waXRjaChEV09SRCB3aWR0aCwgRFdPUkQgYnBwKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIHVuc2lnbmVkIHNob3J0CWJwcCxkZXB0aDsKQEAgLTM4NywyNyArMjgxLDMzIEBACiAgICAgQ29udmVydEZ1bmNzIGZ1bmNzOwogfSBDb252ZXJ0OwogCi1leHRlcm4gQ29udmVydCBNb2RlRW11bGF0aW9uc1s3XTsKK2V4dGVybiBDb252ZXJ0IE1vZGVFbXVsYXRpb25zWzhdOwogZXh0ZXJuIGludCBfY29tbW9uX2RlcHRoX3RvX3BpeGVsZm9ybWF0KERXT1JEIGRlcHRoLExQRElSRUNURFJBVyBkZHJhdyk7CiAKLWV4dGVybiBIUkVTVUxUIGNyZWF0ZV9kaXJlY3QzZChMUFZPSUQgKm9iaixJRGlyZWN0RHJhdzJJbXBsKik7Ci1leHRlcm4gSFJFU1VMVCBjcmVhdGVfZGlyZWN0M2QyKExQVk9JRCAqb2JqLElEaXJlY3REcmF3MkltcGwqKTsKLWV4dGVybiBIUkVTVUxUIGNyZWF0ZV9kaXJlY3QzZDMoTFBWT0lEICpvYmosSURpcmVjdERyYXcySW1wbCopOworZXh0ZXJuIEhSRVNVTFQgY3JlYXRlX2RpcmVjdDNkKExQVk9JRCAqb2JqLElEaXJlY3REcmF3SW1wbCopOworZXh0ZXJuIEhSRVNVTFQgY3JlYXRlX2RpcmVjdDNkMihMUFZPSUQgKm9iaixJRGlyZWN0RHJhd0ltcGwqKTsKK2V4dGVybiBIUkVTVUxUIGNyZWF0ZV9kaXJlY3QzZDMoTFBWT0lEICpvYmosSURpcmVjdERyYXdJbXBsKik7CitleHRlcm4gSFJFU1VMVCBjcmVhdGVfZGlyZWN0M2Q3KExQVk9JRCAqb2JqLElEaXJlY3REcmF3SW1wbCopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdHJ1Y3R1cmUgY29udmVyc2lvbiAoZm9yIHRodW5rcykKKyAqLwordm9pZCBERFJBV19Db252ZXJ0X0REU0NBUFNfMV9Ub18yKGNvbnN0IEREU0NBUFMqIHBJbiwgRERTQ0FQUzIqIHBPdXQpOwordm9pZCBERFJBV19Db252ZXJ0X0REREVWSUNFSURFTlRJRklFUl8yX1RvXzEoY29uc3QgRERERVZJQ0VJREVOVElGSUVSKiBwSW4sCisJCQkJCSAgICAgRERERVZJQ0VJREVOVElGSUVSMiogcE91dCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERlYnVnZ2luZyAvIEZsYWdzIG91dHB1dCBmdW5jdGlvbnMKICAqLwotZXh0ZXJuIHZvaWQgX2R1bXBfRERCTFRGWChEV09SRCBmbGFnbWFzayk7Ci1leHRlcm4gdm9pZCBfZHVtcF9EREJMVEZBU1QoRFdPUkQgZmxhZ21hc2spOwotZXh0ZXJuIHZvaWQgX2R1bXBfRERCTFQoRFdPUkQgZmxhZ21hc2spOwotZXh0ZXJuIHZvaWQgX2R1bXBfRERTQ0FQUyh2b2lkICppbik7Ci1leHRlcm4gdm9pZCBfZHVtcF9waXhlbGZvcm1hdF9mbGFnKERXT1JEIGZsYWdtYXNrKTsKLWV4dGVybiB2b2lkIF9kdW1wX3BhbGV0dGVmb3JtYXQoRFdPUkQgZHdGbGFncyk7Ci1leHRlcm4gdm9pZCBfZHVtcF9waXhlbGZvcm1hdCh2b2lkICppbik7Ci1leHRlcm4gdm9pZCBfZHVtcF9jb2xvcmtleWZsYWcoRFdPUkQgY2spOwotZXh0ZXJuIHZvaWQgX2R1bXBfc3VyZmFjZV9kZXNjKEREU1VSRkFDRURFU0MgKmxwZGRzZCk7Ci1leHRlcm4gdm9pZCBfZHVtcF9jb29wZXJhdGl2ZWxldmVsKERXT1JEIGNvb3BsZXZlbCk7Ci1leHRlcm4gdm9pZCBfZHVtcF9zdXJmYWNlX2Rlc2MoRERTVVJGQUNFREVTQyAqbHBkZHNkKTsKLWV4dGVybiB2b2lkIF9kdW1wX0REQ09MT1JLRVkodm9pZCAqaW4pOwotZXh0ZXJuIHZvaWQgX2R1bXBfRERPVkVSTEFZKERXT1JEIGZsYWdtYXNrKSA7CitleHRlcm4gdm9pZCBERFJBV19kdW1wX0REQkxURlgoRFdPUkQgZmxhZ21hc2spOworZXh0ZXJuIHZvaWQgRERSQVdfZHVtcF9EREJMVEZBU1QoRFdPUkQgZmxhZ21hc2spOworZXh0ZXJuIHZvaWQgRERSQVdfZHVtcF9EREJMVChEV09SRCBmbGFnbWFzayk7CitleHRlcm4gdm9pZCBERFJBV19kdW1wX0REU0NBUFMoY29uc3QgRERTQ0FQUzIgKmluKTsKK2V4dGVybiB2b2lkIEREUkFXX2R1bXBfcGl4ZWxmb3JtYXRfZmxhZyhEV09SRCBmbGFnbWFzayk7CitleHRlcm4gdm9pZCBERFJBV19kdW1wX3BhbGV0dGVmb3JtYXQoRFdPUkQgZHdGbGFncyk7CitleHRlcm4gdm9pZCBERFJBV19kdW1wX3BpeGVsZm9ybWF0KGNvbnN0IEREUElYRUxGT1JNQVQgKmluKTsKK2V4dGVybiB2b2lkIEREUkFXX2R1bXBfY29sb3JrZXlmbGFnKERXT1JEIGNrKTsKK2V4dGVybiB2b2lkIEREUkFXX2R1bXBfc3VyZmFjZV9kZXNjKGNvbnN0IEREU1VSRkFDRURFU0MyICpscGRkc2QpOworZXh0ZXJuIHZvaWQgRERSQVdfZHVtcF9jb29wZXJhdGl2ZWxldmVsKERXT1JEIGNvb3BsZXZlbCk7CitleHRlcm4gdm9pZCBERFJBV19kdW1wX0REQ09MT1JLRVkoY29uc3QgRERDT0xPUktFWSAqaW4pOwogI2VuZGlmIC8qIF9fV0lORV9ETExTX0REUkFXX0REUkFXX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kaXJlY3QzZC9tZXNhLmMgYi9kbGxzL2RkcmF3L2RpcmVjdDNkL21lc2EuYwppbmRleCA3MDlmZGVmLi5kN2ZhNzM1IDEwMDY0NAotLS0gYS9kbGxzL2RkcmF3L2RpcmVjdDNkL21lc2EuYworKysgYi9kbGxzL2RkcmF3L2RpcmVjdDNkL21lc2EuYwpAQCAtMzQyLDcgKzM0Miw3IEBACiAjdW5kZWYgWENBU1QKICNlbmRpZgogCi1IUkVTVUxUIGNyZWF0ZV9kaXJlY3QzZChMUFZPSUQgKm9iaixJRGlyZWN0RHJhdzJJbXBsKiBkZHJhdykgeworSFJFU1VMVCBjcmVhdGVfZGlyZWN0M2QoTFBWT0lEICpvYmosSURpcmVjdERyYXdJbXBsKiBkZHJhdykgewogICAgIElEaXJlY3QzREltcGwqIGQzZDsKIAogICAgIGQzZCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKCpkM2QpKTsKQEAgLTM1Nyw3ICszNTcsNyBAQAogICAgIHJldHVybiBTX09LOwogfQogCi1IUkVTVUxUIGNyZWF0ZV9kaXJlY3QzZDIoTFBWT0lEICpvYmosSURpcmVjdERyYXcySW1wbCogZGRyYXcpIHsKK0hSRVNVTFQgY3JlYXRlX2RpcmVjdDNkMihMUFZPSUQgKm9iaixJRGlyZWN0RHJhd0ltcGwqIGRkcmF3KSB7CiAgICAgSURpcmVjdDNEMkltcGwqIGQzZDsKIAogICAgIGQzZCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKCpkM2QpKTsKQEAgLTM3Miw3ICszNzIsNyBAQAogICAgIHJldHVybiBTX09LOwogfQogCi1IUkVTVUxUIGNyZWF0ZV9kaXJlY3QzZDMoTFBWT0lEICpvYmosSURpcmVjdERyYXcySW1wbCogZGRyYXcpIHsKK0hSRVNVTFQgY3JlYXRlX2RpcmVjdDNkMyhMUFZPSUQgKm9iaixJRGlyZWN0RHJhd0ltcGwqIGRkcmF3KSB7CiAgICAgSURpcmVjdDNEM0ltcGwqIGQzZDsKIAogICAgIGQzZCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKCpkM2QpKTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZHBhbGV0dGUvZGdhLmMgYi9kbGxzL2RkcmF3L2RwYWxldHRlL2RnYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjc0N2M4Li4wMDAwMDAwCi0tLSBhL2RsbHMvZGRyYXcvZHBhbGV0dGUvZGdhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgkJRGlyZWN0RHJhd1BhbGV0dGUgWEY4NkRHQSBpbXBsZW1lbnRhdGlvbgotICoKLSAqIENvcHlyaWdodCAxOTk3LTIwMDAgTWFyY3VzIE1laXNzbmVyCi0gKiBDb3B5cmlnaHQgMTk5OCBMaW9uZWwgVWxtZXIgKG1vc3Qgb2YgRGlyZWN0M0Qgc3R1ZmYpCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIndpbmVycm9yLmgiCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKLQotI2luY2x1ZGUgImRnYV9wcml2YXRlLmgiCi0KLURFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Ci0KLSNkZWZpbmUgRFBQUklWQVRFKHgpIGRnYV9kcF9wcml2YXRlICpkcHByaXYgPSAoKGRnYV9kcF9wcml2YXRlKikoeCktPnByaXZhdGUpCi0jZGVmaW5lIEREUFJJVkFURSh4KSBkZ2FfZGRfcHJpdmF0ZSAqZGRwcml2ID0gKChkZ2FfZGRfcHJpdmF0ZSopKHgpLT5kLT5wcml2YXRlKQotCi1IUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXdQYWxldHRlSW1wbF9TZXRFbnRyaWVzKAotICAgIExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UsRFdPUkQgeCxEV09SRCBzdGFydCxEV09SRCBjb3VudCxMUFBBTEVUVEVFTlRSWSBwYWxlbnQKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1BhbGV0dGVJbXBsLGlmYWNlKTsKLSAgICBEUFBSSVZBVEUoVGhpcyk7Ci0gICAgWENvbG9yCXhjOwotICAgIGludAkJaTsKLQotICAgIFRSQUNFKCIoJXApLT5TZXRFbnRyaWVzKCUwOGx4LCVsZCwlbGQsJXApXG4iLFRoaXMseCxzdGFydCxjb3VudCxwYWxlbnQpOwotICAgIGlmICghZHBwcml2LT5jbSkgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8gewotCVRSQUNFKCJhcHAgdHJpZWQgdG8gc2V0IGNvbG9ybWFwIGluIG5vbi1wYWxldHRpemVkIG1vZGVcbiIpOwotICAgIH0KLSAgICBmb3IgKGk9MDtpPGNvdW50O2krKykgewotCXhjLnJlZCA9IHBhbGVudFtpXS5wZVJlZDw8ODsKLQl4Yy5ibHVlID0gcGFsZW50W2ldLnBlQmx1ZTw8ODsKLQl4Yy5ncmVlbiA9IHBhbGVudFtpXS5wZUdyZWVuPDw4OwotCXhjLmZsYWdzID0gRG9SZWR8RG9CbHVlfERvR3JlZW47Ci0JeGMucGl4ZWwgPSBpK3N0YXJ0OwotCQotCWlmIChkcHByaXYtPmNtKQotCSAgVFNYU3RvcmVDb2xvcihkaXNwbGF5LGRwcHJpdi0+Y20sJnhjKTsKLQotCVRoaXMtPnBhbGVudHNbc3RhcnQraV0ucGVSZWQgPSBwYWxlbnRbaV0ucGVSZWQ7Ci0JVGhpcy0+cGFsZW50c1tzdGFydCtpXS5wZUJsdWUgPSBwYWxlbnRbaV0ucGVCbHVlOwotCVRoaXMtPnBhbGVudHNbc3RhcnQraV0ucGVHcmVlbiA9IHBhbGVudFtpXS5wZUdyZWVuOwotCVRoaXMtPnBhbGVudHNbc3RhcnQraV0ucGVGbGFncyA9IHBhbGVudFtpXS5wZUZsYWdzOwotICAgIH0KLSAgICAvKiBGbHVzaCB0aGUgZGlzcGxheSBxdWV1ZSBzbyB0aGF0IHBhbGV0dGUgdXBkYXRlcyBhcmUgdmlzaWJsZSBkaXJlY3RseSAqLwotICAgIFRTWEZsdXNoKGRpc3BsYXkpOwotICAgIHJldHVybiBERF9PSzsKLX0KLUlDT01fVlRBQkxFKElEaXJlY3REcmF3UGFsZXR0ZSkgZGdhX2RkcGFsdnQgPSAKLXsKLQlJQ09NX01TVlRBQkxFX0NPTVBBVF9EdW1teVJUVElWQUxVRQotCUlEaXJlY3REcmF3UGFsZXR0ZUltcGxfUXVlcnlJbnRlcmZhY2UsCi0JSURpcmVjdERyYXdQYWxldHRlSW1wbF9BZGRSZWYsCi0JWGxpYl9JRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1JlbGVhc2UsCi0JSURpcmVjdERyYXdQYWxldHRlSW1wbF9HZXRDYXBzLAotCUlEaXJlY3REcmF3UGFsZXR0ZUltcGxfR2V0RW50cmllcywKLQlJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0luaXRpYWxpemUsCi0JREdBX0lEaXJlY3REcmF3UGFsZXR0ZUltcGxfU2V0RW50cmllcwotfTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZHBhbGV0dGUvbWFpbi5jIGIvZGxscy9kZHJhdy9kcGFsZXR0ZS9tYWluLmMKaW5kZXggMTJiMmRiYS4uOTViZmNhNCAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy9kcGFsZXR0ZS9tYWluLmMKKysrIGIvZGxscy9kZHJhdy9kcGFsZXR0ZS9tYWluLmMKQEAgLTEsMTEwICsxLDI1OSBAQAogLyoJCURpcmVjdERyYXcgLSBJRGlyZWN0UGFsZXR0ZSBiYXNlIGludGVyZmFjZQogICoKICAqIENvcHlyaWdodCAxOTk3LTIwMDAgTWFyY3VzIE1laXNzbmVyCisgKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKICNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKKyNpbmNsdWRlICJkcGFsZXR0ZS9tYWluLmgiCisjaW5jbHVkZSAiZGRyYXcvbWFpbi5oIgorCiBERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwogCisjZGVmaW5lIFNJWkVfQklUUyAoRERQQ0FQU18xQklUIHwgRERQQ0FQU18yQklUIHwgRERQQ0FQU180QklUIHwgRERQQ0FQU184QklUKQorCisvKiBGb3IgdW5zaWduZWQgeC4gMCBpcyBub3QgYSBwb3dlciBvZiAyLiAqLworI2RlZmluZSBJU19QT1dfMih4KSAoKCh4KSAmICgoeCkgLSAxKSkgPT0gMCkKKworc3RhdGljIElDT01fVlRBQkxFKElEaXJlY3REcmF3UGFsZXR0ZSkgRERSQVdfTWFpbl9QYWxldHRlX1ZUYWJsZTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlJRGlyZWN0RHJhd1BhbGV0dGUKICAqLwotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdQYWxldHRlSW1wbF9HZXRFbnRyaWVzKAotICAgIExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UsRFdPUkQgeCxEV09SRCBzdGFydCxEV09SRCBjb3VudCxMUFBBTEVUVEVFTlRSWSBwYWxlbnQKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1BhbGV0dGVJbXBsLGlmYWNlKTsKLSAgICBpbnQJaTsKK0hSRVNVTFQgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcywKKwkJCQkJIElEaXJlY3REcmF3SW1wbCogcERELCBEV09SRCBkd0ZsYWdzKQoreworICAgIGlmICghSVNfUE9XXzIoZHdGbGFncyAmIFNJWkVfQklUUykpIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogCi0gICAgVFJBQ0UoIiglcCktPkdldEVudHJpZXMoJTA4bHgsJWxkLCVsZCwlcClcbiIsVGhpcyx4LHN0YXJ0LGNvdW50LHBhbGVudCk7CisgICAgaWYgKGR3RmxhZ3MgJiBERFBDQVBTXzhCSVRFTlRSSUVTKQorCVdBUk4oImNyZWF0aW5nIHBhbGV0dGUgd2l0aCA4IGJpdCBlbnRyaWVzXG4iKTsKIAotICAgIGZvciAoaT0wO2k8Y291bnQ7aSsrKSB7Ci0JcGFsZW50W2ldLnBlUmVkICAgPSBUaGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlUmVkOwotCXBhbGVudFtpXS5wZUJsdWUgID0gVGhpcy0+cGFsZW50c1tzdGFydCtpXS5wZUJsdWU7Ci0JcGFsZW50W2ldLnBlR3JlZW4gPSBUaGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlR3JlZW47Ci0JcGFsZW50W2ldLnBlRmxhZ3MgPSBUaGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlRmxhZ3M7Ci0gICAgfQorICAgIFRoaXMtPmZsYWdzID0gZHdGbGFnczsKKyAgICBUaGlzLT5wYWxOdW1FbnRyaWVzID0gTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9TaXplKGR3RmxhZ3MpOworICAgIFRoaXMtPnJlZiA9IDE7CisgICAgVGhpcy0+ZmluYWxfcmVsZWFzZSA9IE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfZmluYWxfcmVsZWFzZTsKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3UGFsZXR0ZSwgRERSQVdfTWFpbl9QYWxldHRlX1ZUYWJsZSk7CisKKyAgICAvKiB3ZSBjb3VsZCBkZWZlciBocGFsIGNyZWF0aW9uIHVudGlsIHdlIG5lZWQgaXQsCisgICAgICogYnV0IGRvZXMgYW55b25lIGhhdmUgYSBjYXNlIHdoZXJlIGl0IHdvdWxkIGJlIHVzZWZ1bD8gKi8KKyAgICBUaGlzLT5ocGFsID0gQ3JlYXRlUGFsZXR0ZSgoY29uc3QgTE9HUEFMRVRURSopJihUaGlzLT5wYWxWZXJzaW9uKSk7CisKKyAgICBNYWluX0RpcmVjdERyYXdfQWRkUGFsZXR0ZShwREQsIFRoaXMpOworCiAgICAgcmV0dXJuIEREX09LOwogfQogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1NldEVudHJpZXMoCi0gICAgTFBESVJFQ1REUkFXUEFMRVRURSBpZmFjZSxEV09SRCB4LERXT1JEIHN0YXJ0LERXT1JEIGNvdW50LExQUEFMRVRURUVOVFJZIHBhbGVudAotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsaWZhY2UpOwotICAgIGludAkJaTsKK0hSRVNVTFQKK01haW5fRGlyZWN0RHJhd1BhbGV0dGVfQ3JlYXRlKElEaXJlY3REcmF3SW1wbCogcERELCBEV09SRCBkd0ZsYWdzLAorCQkJICAgICAgTFBESVJFQ1REUkFXUEFMRVRURSogcHBQYWxldHRlLAorCQkJICAgICAgTFBVTktOT1dOIHBVbmtPdXRlcikKK3sKKyAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBUaGlzOworICAgIEhSRVNVTFQgaHI7CiAKLSAgICBUUkFDRSgiKCVwKS0+U2V0RW50cmllcyglMDhseCwlbGQsJWxkLCVwKVxuIiwgVGhpcyx4LHN0YXJ0LGNvdW50LHBhbGVudCk7Ci0gICAgZm9yIChpPTA7aTxjb3VudDtpKyspIHsKLQlUaGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlUmVkID0gcGFsZW50W2ldLnBlUmVkOwotCVRoaXMtPnBhbGVudHNbc3RhcnQraV0ucGVCbHVlID0gcGFsZW50W2ldLnBlQmx1ZTsKLQlUaGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlR3JlZW4gPSBwYWxlbnRbaV0ucGVHcmVlbjsKLQlUaGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlRmxhZ3MgPSBwYWxlbnRbaV0ucGVGbGFnczsKKyAgICBpZiAocFVua091dGVyICE9IE5VTEwpCisJcmV0dXJuIENMQVNTX0VfTk9BR0dSRUdBVElPTjsgLyogdW5jaGVja2VkICovCisKKyAgICBUaGlzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZigqVGhpcykpOworICAgIGlmIChUaGlzID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOworCisgICAgaHIgPSBNYWluX0RpcmVjdERyYXdQYWxldHRlX0NvbnN0cnVjdChUaGlzLCBwREQsIGR3RmxhZ3MpOworICAgIGlmIChGQUlMRUQoaHIpKQorCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOworICAgIGVsc2UKKwkqcHBQYWxldHRlID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdQYWxldHRlKTsKKworICAgIHJldHVybiBocjsKK30KKworRFdPUkQgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9TaXplKERXT1JEIGR3RmxhZ3MpCit7CisgICAgc3dpdGNoIChkd0ZsYWdzICYgU0laRV9CSVRTKQorICAgIHsKKyAgICBjYXNlIEREUENBUFNfMUJJVDogcmV0dXJuIDI7CisgICAgY2FzZSBERFBDQVBTXzJCSVQ6IHJldHVybiA0OworICAgIGNhc2UgRERQQ0FQU180QklUOiByZXR1cm4gMTY7CisgICAgY2FzZSBERFBDQVBTXzhCSVQ6IHJldHVybiAyNTY7CisgICAgZGVmYXVsdDogYXNzZXJ0KDApOyByZXR1cm4gMjU2OworICAgIH0KK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcyhMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLCBEV09SRCBkd0ZsYWdzLAorCQkJCSAgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKKwkJCQkgIExQUEFMRVRURUVOVFJZIHBhbGVudCkKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdQYWxldHRlSW1wbCxpZmFjZSk7CisKKyAgICBUUkFDRSgiKCVwKS0+R2V0RW50cmllcyglMDhseCwlbGQsJWxkLCVwKVxuIixUaGlzLGR3RmxhZ3MsZHdTdGFydCxkd0NvdW50LAorCSAgcGFsZW50KTsKKworICAgIGlmIChkd0ZsYWdzICE9IDApIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOyAvKiB1bmNoZWNrZWQgKi8KKyAgICBpZiAoZHdTdGFydCArIGR3Q291bnQgPiBNYWluX0RpcmVjdERyYXdQYWxldHRlX1NpemUoVGhpcy0+ZmxhZ3MpKQorCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworCisgICAgaWYgKFRoaXMtPmZsYWdzICYgRERQQ0FQU184QklURU5UUklFUykKKyAgICB7CisJaW50IGk7CisJTFBCWVRFIGVudHJ5ID0gKExQQllURSlwYWxlbnQ7CisKKwlmb3IgKGk9ZHdTdGFydDsgaSA8IGR3Q291bnQrZHdTdGFydDsgaSsrKQorCSAgICAqZW50cnkrKyA9IFRoaXMtPnBhbGVudHNbaV0ucGVSZWQ7CisgICAgfQorICAgIGVsc2UKKwltZW1jcHkocGFsZW50LCBUaGlzLT5wYWxlbnRzK2R3U3RhcnQsIGR3Q291bnQgKiBzaXplb2YoUEFMRVRURUVOVFJZKSk7CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMoTFBESVJFQ1REUkFXUEFMRVRURSBpZmFjZSwgRFdPUkQgZHdGbGFncywKKwkJCQkgIERXT1JEIGR3U3RhcnQsIERXT1JEIGR3Q291bnQsCisJCQkJICBMUFBBTEVUVEVFTlRSWSBwYWxlbnQpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsaWZhY2UpOworCisgICAgVFJBQ0UoIiglcCktPlNldEVudHJpZXMoJTA4bHgsJWxkLCVsZCwlcClcbiIsVGhpcyxkd0ZsYWdzLGR3U3RhcnQsZHdDb3VudCwKKwkgIHBhbGVudCk7CisKKyAgICBpZiAoVGhpcy0+ZmxhZ3MgJiBERFBDQVBTXzhCSVRFTlRSSUVTKQorICAgIHsKKwlpbnQgaTsKKwljb25zdCBCWVRFKiBlbnRyeSA9IChjb25zdCBCWVRFKilwYWxlbnQ7CisKKwlmb3IgKGk9ZHdTdGFydDsgaSA8IGR3Q291bnQrZHdTdGFydDsgaSsrKQorCSAgICBUaGlzLT5wYWxlbnRzW2ldLnBlUmVkID0gKmVudHJ5Kys7CisgICAgfQorICAgIGVsc2UgeworCW1lbWNweShUaGlzLT5wYWxlbnRzK2R3U3RhcnQsIHBhbGVudCwgZHdDb3VudCAqIHNpemVvZihQQUxFVFRFRU5UUlkpKTsKKworCWlmIChUaGlzLT5ocGFsKQorCSAgICBTZXRQYWxldHRlRW50cmllcyhUaGlzLT5ocGFsLCBkd1N0YXJ0LCBkd0NvdW50LCBUaGlzLT5wYWxlbnRzK2R3U3RhcnQpOworCisJaWYgKFRoaXMtPmZsYWdzICYgRERQQ0FQU19QUklNQVJZU1VSRkFDRSkgeworCSAgICAvKiB1cGRhdGUgcGh5c2ljYWwgcGFsZXR0ZSAqLworCSAgICBMUERJUkVDVERSQVdTVVJGQUNFNyBwc3VyZiA9IE5VTEw7CisJICAgIElEaXJlY3REcmF3N19HZXRHRElTdXJmYWNlKElDT01fSU5URVJGQUNFKFRoaXMtPmRkcmF3X293bmVyLElEaXJlY3REcmF3NyksICZwc3VyZik7CisJICAgIGlmIChwc3VyZikgeworCQlJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpzdXJmID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwKKwkJCQkJCQkgICBJRGlyZWN0RHJhd1N1cmZhY2U3LCBwc3VyZik7CisJCXN1cmYtPnVwZGF0ZV9wYWxldHRlKHN1cmYsIFRoaXMsIGR3U3RhcnQsIGR3Q291bnQsIHBhbGVudCk7CisJCUlEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShwc3VyZik7CisJICAgIH0KKwkgICAgZWxzZSBFUlIoImNhbid0IGZpbmQgR0RJIHN1cmZhY2UhIVxuIik7CisJfQogICAgIH0KIAorI2lmIDAKICAgICAvKiBOb3csIGlmIHdlIGFyZSBpbiAnZGVwdGggY29udmVyc2lvbiBtb2RlJywgdXBkYXRlIHRoZSBzY3JlZW4gcGFsZXR0ZSAqLwogICAgIC8qIEZJWE1FOiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgaW1hZ2Ugb3Igd2Ugd29uJ3QgZ2V0IHBhbGV0dGUgZmFkaW5nLiAqLwogICAgIGlmIChUaGlzLT5kZHJhdy0+ZC0+cGFsZXR0ZV9jb252ZXJ0ICE9IE5VTEwpCiAJVGhpcy0+ZGRyYXctPmQtPnBhbGV0dGVfY29udmVydChwYWxlbnQsVGhpcy0+c2NyZWVuX3BhbGVudHMsc3RhcnQsY291bnQpOworI2VuZGlmCisKICAgICByZXR1cm4gRERfT0s7CiB9CiAKLVVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1JlbGVhc2UoTFBESVJFQ1REUkFXUEFMRVRURSBpZmFjZSkgewordm9pZCBNYWluX0RpcmVjdERyYXdQYWxldHRlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcykKK3sKKyAgICBNYWluX0RpcmVjdERyYXdfUmVtb3ZlUGFsZXR0ZShUaGlzLT5kZHJhd19vd25lciwgVGhpcyk7CisKKyAgICBpZiAoVGhpcy0+aHBhbCkgRGVsZXRlT2JqZWN0KFRoaXMtPmhwYWwpOworfQorCitzdGF0aWMgdm9pZCBNYWluX0RpcmVjdERyYXdQYWxldHRlX0Rlc3Ryb3koSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcykKK3sKKyAgICBUaGlzLT5maW5hbF9yZWxlYXNlKFRoaXMpOworCisgICAgaWYgKFRoaXMtPnByaXZhdGUgIT0gVGhpcysxKQorCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPnByaXZhdGUpOworCQkgICAgIAorICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxUaGlzKTsKK30KKwordm9pZCBNYWluX0RpcmVjdERyYXdQYWxldHRlX0ZvcmNlRGVzdHJveShJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBUaGlzKQoreworICAgIFdBUk4oImRlbGV0aW5nIHBhbGV0dGUgJXAgd2l0aCByZWZjbnQgJWx1XG4iLCBUaGlzLCBUaGlzLT5yZWYpOworICAgIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfRGVzdHJveShUaGlzKTsKK30KKworVUxPTkcgV0lOQVBJCitNYWluX0RpcmVjdERyYXdQYWxldHRlX1JlbGVhc2UoTFBESVJFQ1REUkFXUEFMRVRURSBpZmFjZSkKK3sKICAgICBJQ09NX1RISVMoSURpcmVjdERyYXdQYWxldHRlSW1wbCxpZmFjZSk7CiAgICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIFRoaXMtPnJlZiApOwotICAgIGlmICghLS0oVGhpcy0+cmVmKSkgewotCSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcyk7Ci0JICAgIHJldHVybiBTX09LOworCisgICAgaWYgKCEtLVRoaXMtPnJlZikKKyAgICB7CisJTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9EZXN0cm95KFRoaXMpOworCXJldHVybiAwOwogICAgIH0KKwogICAgIHJldHVybiBUaGlzLT5yZWY7CiB9CiAKLVVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0FkZFJlZihMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlKSB7CitVTE9ORyBXSU5BUEkgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYoTFBESVJFQ1REUkFXUEFMRVRURSBpZmFjZSkgewogICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1BhbGV0dGVJbXBsLGlmYWNlKTsKICAgICBUUkFDRSgiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgVGhpcy0+cmVmICk7Ci0gICAgcmV0dXJuICsrKFRoaXMtPnJlZik7CisgICAgcmV0dXJuICsrVGhpcy0+cmVmOwogfQogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0luaXRpYWxpemUoCi0gICAgTFBESVJFQ1REUkFXUEFMRVRURSBpZmFjZSxMUERJUkVDVERSQVcgZGRyYXcsRFdPUkQgeCxMUFBBTEVUVEVFTlRSWSBwYWxlbnQKLSkgeworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1BhbGV0dGVfSW5pdGlhbGl6ZShMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLAorCQkJCSAgTFBESVJFQ1REUkFXIGRkcmF3LCBEV09SRCBkd0ZsYWdzLAorCQkJCSAgTFBQQUxFVFRFRU5UUlkgcGFsZW50KQorewogICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1BhbGV0dGVJbXBsLGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVsZCwlcClcbiIsIFRoaXMsIGRkcmF3LCB4LCBwYWxlbnQpOworICAgIFRSQUNFKCIoJXApLT4oJXAsJWxkLCVwKVxuIiwgVGhpcywgZGRyYXcsIGR3RmxhZ3MsIHBhbGVudCk7CiAgICAgcmV0dXJuIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRDsKIH0KIAotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdQYWxldHRlSW1wbF9HZXRDYXBzKAotICAgICBMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLCBMUERXT1JEIGxwZHdDYXBzICkKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdQYWxldHRlX0dldENhcHMoTFBESVJFQ1REUkFXUEFMRVRURSBpZmFjZSwgTFBEV09SRCBscGR3Q2FwcykKIHsKICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1BhbGV0dGVJbXBsLGlmYWNlKTsKLSAgIEZJWE1FKCIoJXApLT4oJXApIHN0dWIuXG4iLCBUaGlzLCBscGR3Q2FwcyApOworICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxscGR3Q2Fwcyk7CisKKyAgICpscGR3Q2FwcyA9IFRoaXMtPmZsYWdzOworCiAgICByZXR1cm4gRERfT0s7CiB9IAogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1F1ZXJ5SW50ZXJmYWNlKAotICAgIExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iaiApIAorSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1BhbGV0dGVfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1REUkFXUEFMRVRURSBpZmFjZSwKKwkJCQkgICAgICBSRUZJSUQgcmVmaWlkLCBMUFZPSUQgKm9iaikKIHsKICAgICBJQ09NX1RISVMoSURpcmVjdERyYXdQYWxldHRlSW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPiglcywlcCkgc3R1Yi5cbiIsVGhpcyxkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksb2JqKTsKLSAgICByZXR1cm4gU19PSzsKKyAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmVmaWlkKSxvYmopOworCisgICAgaWYgKElzRXF1YWxHVUlEKHJlZmlpZCwgJklJRF9JVW5rbm93bikKKwl8fCBJc0VxdWFsR1VJRChyZWZpaWQsICZJSURfSURpcmVjdERyYXdQYWxldHRlKSkKKyAgICB7CisJKm9iaiA9IGlmYWNlOworCUlEaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYoaWZhY2UpOworCXJldHVybiBTX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXJldHVybiBFX05PSU5URVJGQUNFOworICAgIH0KIH0KIAotSUNPTV9WVEFCTEUoSURpcmVjdERyYXdQYWxldHRlKSBkZHJhd19kZHBhbHZ0ID0gCitzdGF0aWMgSUNPTV9WVEFCTEUoSURpcmVjdERyYXdQYWxldHRlKSBERFJBV19NYWluX1BhbGV0dGVfVlRhYmxlID0KIHsKICAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9EdW1teVJUVElWQUxVRQotICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfUXVlcnlJbnRlcmZhY2UsCi0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9BZGRSZWYsCi0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9SZWxlYXNlLAotICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfR2V0Q2FwcywKLSAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0dldEVudHJpZXMsCi0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9Jbml0aWFsaXplLAotICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfU2V0RW50cmllcworICAgIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfUXVlcnlJbnRlcmZhY2UsCisgICAgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYsCisgICAgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlLAorICAgIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfR2V0Q2FwcywKKyAgICBNYWluX0RpcmVjdERyYXdQYWxldHRlX0dldEVudHJpZXMsCisgICAgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9Jbml0aWFsaXplLAorICAgIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcwogfTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZHBhbGV0dGUvbWFpbi5oIGIvZGxscy9kZHJhdy9kcGFsZXR0ZS9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkZWZlYQotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvZGRyYXcvZHBhbGV0dGUvbWFpbi5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIENvcHlyaWdodCAyMDAwIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuICovCisKKyNpZm5kZWYgV0lORV9ERFJBV19EUEFMRVRURV9NQUlOX0hfSU5DTFVERUQKKyNkZWZpbmUgV0lORV9ERFJBV19EUEFMRVRURV9NQUlOX0hfSU5DTFVERUQKKworSFJFU1VMVCBNYWluX0RpcmVjdERyYXdQYWxldHRlX0NvbnN0cnVjdChJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBUaGlzLAorCQkJCQkgSURpcmVjdERyYXdJbXBsKiBwREQsIERXT1JEIGR3RmxhZ3MpOwordm9pZCBNYWluX0RpcmVjdERyYXdQYWxldHRlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcyk7CisKKworSFJFU1VMVAorTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9DcmVhdGUoSURpcmVjdERyYXdJbXBsKiBwREQsIERXT1JEIGR3RmxhZ3MsCisJCQkgICAgICBMUERJUkVDVERSQVdQQUxFVFRFKiBwcFBhbGV0dGUsCisJCQkgICAgICBMUFVOS05PV04gcFVua091dGVyKTsKK3ZvaWQgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9Gb3JjZURlc3Ryb3koSURpcmVjdERyYXdQYWxldHRlSW1wbCogVGhpcyk7CisKKworRFdPUkQgTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9TaXplKERXT1JEIGR3RmxhZ3MpOworCisKKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcyhMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLCBEV09SRCBkd0ZsYWdzLAorCQkJCSAgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKKwkJCQkgIExQUEFMRVRURUVOVFJZIHBhbGVudCk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9TZXRFbnRyaWVzKExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UsIERXT1JEIGR3RmxhZ3MsCisJCQkJICBEV09SRCBkd1N0YXJ0LCBEV09SRCBkd0NvdW50LAorCQkJCSAgTFBQQUxFVFRFRU5UUlkgcGFsZW50KTsKK1VMT05HIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UpOworVUxPTkcgV0lOQVBJIE1haW5fRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmKExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1BhbGV0dGVfSW5pdGlhbGl6ZShMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLAorCQkJCSAgTFBESVJFQ1REUkFXIGRkcmF3LCBEV09SRCBkd0ZsYWdzLAorCQkJCSAgTFBQQUxFVFRFRU5UUlkgcGFsZW50KTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdQYWxldHRlX0dldENhcHMoTFBESVJFQ1REUkFXUEFMRVRURSBpZmFjZSwgTFBEV09SRCBscGR3Q2Fwcyk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3UGFsZXR0ZV9RdWVyeUludGVyZmFjZShMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLAorCQkJCSAgICAgIFJFRklJRCByZWZpaWQsIExQVk9JRCAqb2JqKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZHBhbGV0dGUveDExLmMgYi9kbGxzL2RkcmF3L2RwYWxldHRlL3gxMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWJlNjk4Li4wMDAwMDAwCi0tLSBhL2RsbHMvZGRyYXcvZHBhbGV0dGUveDExLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgkJRGlyZWN0RHJhdyBJRGlyZWN0RHJhd1BhbGV0dGUgWDExIGltcGxlbWVudGF0aW9uCi0gKgotICogQ29weXJpZ2h0IDE5OTctMjAwMCBNYXJjdXMgTWVpc3NuZXIKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAid2luZXJyb3IuaCIKLQotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCi0KLSNpbmNsdWRlICJ4MTFfcHJpdmF0ZS5oIgotCi1ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwotCi0jZGVmaW5lIERQUFJJVkFURSh4KSB4MTFfZHBfcHJpdmF0ZSAqZHBwcml2ID0gKCh4MTFfZHBfcHJpdmF0ZSopeC0+cHJpdmF0ZSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlJRGlyZWN0RHJhd1BhbGV0dGUKLSAqLwotCi1IUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3UGFsZXR0ZUltcGxfU2V0RW50cmllcygKLSAgICBMUERJUkVDVERSQVdQQUxFVFRFIGlmYWNlLERXT1JEIHgsRFdPUkQgc3RhcnQsRFdPUkQgY291bnQsTFBQQUxFVFRFRU5UUlkgcGFsZW50Ci0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdQYWxldHRlSW1wbCxpZmFjZSk7Ci0gICAgWENvbG9yCXhjOwotICAgIGludAkJaTsKLSAgICBEUFBSSVZBVEUoVGhpcyk7Ci0KLSAgICBUUkFDRSgiKCVwKS0+U2V0RW50cmllcyglMDhseCwlbGQsJWxkLCVwKVxuIixUaGlzLHgsc3RhcnQsY291bnQscGFsZW50KTsKLSAgICBmb3IgKGk9MDtpPGNvdW50O2krKykgewotCXhjLnJlZCA9IHBhbGVudFtpXS5wZVJlZDw8ODsKLQl4Yy5ibHVlID0gcGFsZW50W2ldLnBlQmx1ZTw8ODsKLQl4Yy5ncmVlbiA9IHBhbGVudFtpXS5wZUdyZWVuPDw4OwotCXhjLmZsYWdzID0gRG9SZWR8RG9CbHVlfERvR3JlZW47Ci0JeGMucGl4ZWwgPSBzdGFydCtpOwotCi0JaWYgKGRwcHJpdi0+Y20pCi0JICAgIFRTWFN0b3JlQ29sb3IoZGlzcGxheSxkcHByaXYtPmNtLCZ4Yyk7Ci0KLQlUaGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlUmVkID0gcGFsZW50W2ldLnBlUmVkOwotCVRoaXMtPnBhbGVudHNbc3RhcnQraV0ucGVCbHVlID0gcGFsZW50W2ldLnBlQmx1ZTsKLQlUaGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlR3JlZW4gPSBwYWxlbnRbaV0ucGVHcmVlbjsKLQlUaGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlRmxhZ3MgPSBwYWxlbnRbaV0ucGVGbGFnczsKLSAgICB9Ci0KLSAgICAvKiBOb3csIGlmIHdlIGFyZSBpbiAnZGVwdGggY29udmVyc2lvbiBtb2RlJywgdXBkYXRlIHRoZSBzY3JlZW4gcGFsZXR0ZSAqLwotICAgIC8qIEZJWE1FOiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgaW1hZ2Ugb3Igd2Ugd29uJ3QgZ2V0IHBhbGV0dGUgZmFkaW5nLiAqLwotICAgIGlmIChUaGlzLT5kZHJhdy0+ZC0+cGFsZXR0ZV9jb252ZXJ0ICE9IE5VTEwpIHsKLQlUaGlzLT5kZHJhdy0+ZC0+cGFsZXR0ZV9jb252ZXJ0KHBhbGVudCxUaGlzLT5zY3JlZW5fcGFsZW50cyxzdGFydCxjb3VudCk7Ci0gICAgfQotICAgIHJldHVybiBERF9PSzsKLX0KLQotVUxPTkcgV0lOQVBJIFhsaWJfSURpcmVjdERyYXdQYWxldHRlSW1wbF9SZWxlYXNlKExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UpIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdQYWxldHRlSW1wbCxpZmFjZSk7Ci0gICAgRFBQUklWQVRFKFRoaXMpOwotICAgIFRSQUNFKCIoJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCBUaGlzLT5yZWYgKTsKLSAgICBpZiAoIS0tKFRoaXMtPnJlZikpIHsKLQlpZiAoZHBwcml2LT5jbSkgewotCSAgICBUU1hGcmVlQ29sb3JtYXAoZGlzcGxheSxkcHByaXYtPmNtKTsKLQkgICAgZHBwcml2LT5jbSA9IDA7Ci0JfQotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxUaGlzKTsKLQlyZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgcmV0dXJuIFRoaXMtPnJlZjsKLX0KLQotSUNPTV9WVEFCTEUoSURpcmVjdERyYXdQYWxldHRlKSB4bGliX2RkcGFsdnQgPSAKLXsKLSAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9EdW1teVJUVElWQUxVRQotICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfUXVlcnlJbnRlcmZhY2UsCi0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9BZGRSZWYsCi0gICAgWGxpYl9JRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1JlbGVhc2UsCi0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbF9HZXRDYXBzLAotICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfR2V0RW50cmllcywKLSAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0luaXRpYWxpemUsCi0gICAgWGxpYl9JRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1NldEVudHJpZXMKLX07CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RzdXJmYWNlL2RnYS5jIGIvZGxscy9kZHJhdy9kc3VyZmFjZS9kZ2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExOTIwNS4uMDAwMDAwMAotLS0gYS9kbGxzL2RkcmF3L2RzdXJmYWNlL2RnYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qCQlEaXJlY3REcmF3U3VyZmFjZSBYRjg2REdBIGltcGxlbWVudGF0aW9uCi0gKgotICogQ29weXJpZ2h0IDE5OTctMjAwMCBNYXJjdXMgTWVpc3NuZXIKLSAqIENvcHlyaWdodCAxOTk4LTIwMDAgTGlvbmVsIFVsbWVyIChtb3N0IG9mIERpcmVjdDNEIHN0dWZmKQotICovCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAid2luZXJyb3IuaCIKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKLSNpbmNsdWRlICJkZ2FfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImJpdG1hcC5oIgotCi1ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwotCi0jZGVmaW5lIEREUFJJVkFURSh4KSBkZ2FfZGRfcHJpdmF0ZSAqZGRwcml2ID0gKChkZ2FfZGRfcHJpdmF0ZSopKHgpLT5kLT5wcml2YXRlKQotI2RlZmluZSBEUFBSSVZBVEUoeCkgZGdhX2RwX3ByaXZhdGUgKmRwcHJpdiA9ICgoZGdhX2RwX3ByaXZhdGUqKSh4KS0+cHJpdmF0ZSkKLSNkZWZpbmUgRFNQUklWQVRFKHgpIGRnYV9kc19wcml2YXRlICpkc3ByaXYgPSAoKGRnYV9kc19wcml2YXRlKikoeCktPnByaXZhdGUpCi0KLXN0YXRpYyBCWVRFIERHQV9Ub3VjaFN1cmZhY2UoTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UpCi17Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICAvKiBpZiB0aGUgRElCIHNlY3Rpb24gaXMgaW4gR2RpTW9kIHN0YXRlLCB3ZSBtdXN0Ci0gICAgICogdG91Y2ggdGhlIHN1cmZhY2UgdG8gZ2V0IGFueSB1cGRhdGVzIGZyb20gdGhlIERJQiAqLwotICAgIHJldHVybiAqKEJZVEUqKShUaGlzLT5zLnN1cmZhY2VfZGVzYy51MS5scFN1cmZhY2UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJSURpcmVjdERyYXdTdXJmYWNlIG1ldGhvZHMKLSAqCi0gKiBTaW5jZSBERFMzIGFuZCBERFMyIGFyZSBzdXBlcnNldHMgb2YgRERTLCB3ZSBpbXBsZW1lbnQgRERTMyBhbmQgbGV0Ci0gKiBERFMgYW5kIEREUzIgdXNlIHRob3NlIGZ1bmN0aW9ucy4gKEZ1bmN0aW9uIGNhbGxzIGRpZCBub3QgY2hhbmdlIChleGNlcHQKLSAqIHVzaW5nIGRpZmZlcmVudCBEaXJlY3REcmF3U3VyZmFjZVggdmVyc2lvbiksIGp1c3QgYWRkZWQgZmxhZ3MgYW5kIGZ1bmN0aW9ucykKLSAqLwotCi1IUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXdTdXJmYWNlNEltcGxfRmxpcCgKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUERJUkVDVERSQVdTVVJGQUNFNCBmbGlwdG8sRFdPUkQgZHdGbGFncwotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBEU1BSSVZBVEUoVGhpcyk7Ci0gICAgZGdhX2RzX3ByaXZhdGUJKmZzcHJpdjsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCogaWZsaXB0bz0oSURpcmVjdERyYXdTdXJmYWNlNEltcGwqKWZsaXB0bzsKLSAgICBEV09SRAkJeGhlaWdodDsKLSAgICBMUEJZVEUJCXN1cmY7Ci0KLSAgICBUUkFDRSgiKCVwKS0+RmxpcCglcCwlMDhseClcbiIsVGhpcyxpZmxpcHRvLGR3RmxhZ3MpOwotCi0gICAgREdBX1RvdWNoU3VyZmFjZShpZmFjZSk7Ci0gICAgaWZsaXB0byA9IF9jb21tb25fZmluZF9mbGlwdG8oVGhpcyxpZmxpcHRvKTsKLQotICAgIC8qIGFuZCBmbGlwISAqLwotICAgIGZzcHJpdiA9IChkZ2FfZHNfcHJpdmF0ZSopaWZsaXB0by0+cHJpdmF0ZTsKLSAgICBUU1hGODZER0FTZXRWaWV3UG9ydChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksMCxmc3ByaXYtPmZiX2hlaWdodCk7Ci0gICAgaWYgKGlmbGlwdG8tPnMucGFsZXR0ZSkgewotCURQUFJJVkFURShpZmxpcHRvKTsKLQkKLQlpZiAoZHBwcml2LT5jbSkKLQkgICAgVFNYRjg2REdBSW5zdGFsbENvbG9ybWFwKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSxkcHByaXYtPmNtKTsKLSAgICB9Ci0gICAgd2hpbGUgKCFUU1hGODZER0FWaWV3UG9ydENoYW5nZWQoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLDIpKSB7Ci0JLyogRU1QVFkgKi8KLSAgICB9Ci0gICAgLyogV2UgbmVlZCB0byBzd2l0Y2ggdGhlIGxvd2xldmVsIHN1cmZhY2VzLCBmb3IgREdBIHRoaXMgaXM6ICovCi0KLSAgICAvKiBUaGUgaGVpZ2h0IHdpdGhpbiB0aGUgZnJhbWVidWZmZXIgKi8KLSAgICB4aGVpZ2h0CQk9IGRzcHJpdi0+ZmJfaGVpZ2h0OwotICAgIGRzcHJpdi0+ZmJfaGVpZ2h0CT0gZnNwcml2LT5mYl9oZWlnaHQ7Ci0gICAgZnNwcml2LT5mYl9oZWlnaHQJPSB4aGVpZ2h0OwotCi0gICAgLyogQW5kIHRoZSBhc3NjaWF0ZWQgc3VyZmFjZSBwb2ludGVyICovCi0gICAgc3VyZgkJCQk9IFRoaXMtPnMuc3VyZmFjZV9kZXNjLnUxLmxwU3VyZmFjZTsKLSAgICBUaGlzLT5zLnN1cmZhY2VfZGVzYy51MS5scFN1cmZhY2UJPSBpZmxpcHRvLT5zLnN1cmZhY2VfZGVzYy51MS5scFN1cmZhY2U7Ci0gICAgaWZsaXB0by0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlPSBzdXJmOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1NldFBhbGV0dGUoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBESVJFQ1REUkFXUEFMRVRURSBwYWwKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCogaXBhbD0oSURpcmVjdERyYXdQYWxldHRlSW1wbCopcGFsOwotCi0gICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxpcGFsKTsKLQotICAgIC8qIEFjY29yZGluZyB0byBzcGVjLCB3ZSBhcmUgb25seSBzdXBwb3NlZCB0byAKLSAgICAgKiBBZGRSZWYgaWYgdGhpcyBpcyBub3QgdGhlIHNhbWUgcGFsZXR0ZS4KLSAgICAgKi8KLSAgICBpZiggVGhpcy0+cy5wYWxldHRlICE9IGlwYWwgKSB7Ci0JZGdhX2RwX3ByaXZhdGUJKmZwcHJpdjsKLQlpZiggaXBhbCAhPSBOVUxMICkKLQkgICAgSURpcmVjdERyYXdQYWxldHRlX0FkZFJlZiggKElEaXJlY3REcmF3UGFsZXR0ZSopaXBhbCApOwotCWlmKCBUaGlzLT5zLnBhbGV0dGUgIT0gTlVMTCApCi0JICAgIElEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKCAoSURpcmVjdERyYXdQYWxldHRlKilUaGlzLT5zLnBhbGV0dGUgKTsKLQlUaGlzLT5zLnBhbGV0dGUgPSBpcGFsOwotCWZwcHJpdiA9IChkZ2FfZHBfcHJpdmF0ZSopVGhpcy0+cy5wYWxldHRlLT5wcml2YXRlOwotCi0JaWYgKCFmcHByaXYtPmNtICYmCi0JICAgIChUaGlzLT5zLmRkcmF3LT5kLT5zY3JlZW5fcGl4ZWxmb3JtYXQudS5kd1JHQkJpdENvdW50PD04KSApIHsKLQkgIGludCBpOwotCSAgCi0JICAvKiBEZWxheWVkIHBhbGV0dGUgY3JlYXRpb24gKi8KLQkgIGZwcHJpdi0+Y20gPSBUU1hDcmVhdGVDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpLAotCQkJCQkgRGVmYXVsdFZpc3VhbE9mU2NyZWVuKFgxMURSVl9HZXRYU2NyZWVuKCkpLEFsbG9jQWxsKTsKLQkgICAgCi0JICBmb3IgKGk9MDtpPDI1NjtpKyspIHsKLQkgICAgWENvbG9yIHhjOwotCSAgICAKLQkgICAgeGMucmVkCQk9IGlwYWwtPnBhbGVudHNbaV0ucGVSZWQ8PDg7Ci0JICAgIHhjLmJsdWUJCT0gaXBhbC0+cGFsZW50c1tpXS5wZUJsdWU8PDg7Ci0JICAgIHhjLmdyZWVuCT0gaXBhbC0+cGFsZW50c1tpXS5wZUdyZWVuPDw4OwotCSAgICB4Yy5mbGFncwk9IERvUmVkfERvQmx1ZXxEb0dyZWVuOwotCSAgICB4Yy5waXhlbAk9IGk7Ci0JICAgIFRTWFN0b3JlQ29sb3IoZGlzcGxheSxmcHByaXYtPmNtLCZ4Yyk7Ci0JICB9Ci0JfQotCi0JVFNYRjg2REdBSW5zdGFsbENvbG9ybWFwKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSxmcHByaXYtPmNtKTsKLQotICAgICAgICBpZiAoVGhpcy0+cy5oZGMgIT0gMCkgewotCSAgICAvKiBoYWNrOiBzZXQgdGhlIERJQnNlY3Rpb24gY29sb3IgbWFwICovCi0JICAgIEJJVE1BUE9CSiAqYm1wID0gKEJJVE1BUE9CSiAqKSBHRElfR2V0T2JqUHRyKFRoaXMtPnMuRElCc2VjdGlvbiwgQklUTUFQX01BR0lDKTsKLQkgICAgWDExRFJWX0RJQlNFQ1RJT04gKmRpYiA9IChYMTFEUlZfRElCU0VDVElPTiAqKWJtcC0+ZGliOwotCSAgICBkaWItPmNvbG9yTWFwID0gVGhpcy0+cy5wYWxldHRlID8gVGhpcy0+cy5wYWxldHRlLT5zY3JlZW5fcGFsZW50cyA6IE5VTEw7Ci0JICAgIEdESV9SZWxlYXNlT2JqKFRoaXMtPnMuRElCc2VjdGlvbik7Ci0JfQotCVRTWEZsdXNoKGRpc3BsYXkpOwotICAgIH0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLVVMT05HIFdJTkFQSSBER0FfSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUmVsZWFzZShMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgRERQUklWQVRFKFRoaXMtPnMuZGRyYXcpOwotICAgIERTUFJJVkFURShUaGlzKTsKLQotICAgIFRSQUNFKCIoJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCBUaGlzLT5yZWYgKTsKLQotICAgIGlmICgtLShUaGlzLT5yZWYpKQotICAgIAlyZXR1cm4gVGhpcy0+cmVmOwotCi0gICAgSURpcmVjdERyYXcyX1JlbGVhc2UoKElEaXJlY3REcmF3MiopVGhpcy0+cy5kZHJhdyk7Ci0gICAgLyogY2xlYXIgb3V0IG9mIHN1cmZhY2UgbGlzdCAqLwotICAgIGlmIChkZHByaXYtPmZiX2hlaWdodCA9PSAtMSkKLQlWaXJ0dWFsRnJlZShUaGlzLT5zLnN1cmZhY2VfZGVzYy51MS5scFN1cmZhY2UsIDAsIE1FTV9SRUxFQVNFKTsKLSAgICBlbHNlCi0JZGRwcml2LT52cG1hc2sgJj0gfigxPDwoZHNwcml2LT5mYl9oZWlnaHQvZGRwcml2LT5mYl9oZWlnaHQpKTsKLQotICAgIC8qIEZyZWUgdGhlIERJQlNlY3Rpb24gKGlmIGFueSkgKi8KLSAgICBpZiAoVGhpcy0+cy5oZGMgIT0gMCkgewotCS8qIGhhY2s6IHJlc3RvcmUgdGhlIG9yaWdpbmFsIERJQnNlY3Rpb24gY29sb3IgbWFwICovICAgIAotCUJJVE1BUE9CSiAqYm1wID0gKEJJVE1BUE9CSiAqKSBHRElfR2V0T2JqUHRyKFRoaXMtPnMuRElCc2VjdGlvbiwgQklUTUFQX01BR0lDKTsKLQlYMTFEUlZfRElCU0VDVElPTiAqZGliID0gKFgxMURSVl9ESUJTRUNUSU9OICopYm1wLT5kaWI7Ci0JZGliLT5jb2xvck1hcCA9IGRzcHJpdi0+b2xkRElCbWFwOwotCUdESV9SZWxlYXNlT2JqKFRoaXMtPnMuRElCc2VjdGlvbik7Ci0KLQlTZWxlY3RPYmplY3QoVGhpcy0+cy5oZGMsIFRoaXMtPnMuaG9sZGJpdG1hcCk7Ci0JRGVsZXRlREMoVGhpcy0+cy5oZGMpOwotCURlbGV0ZU9iamVjdChUaGlzLT5zLkRJQnNlY3Rpb24pOwotICAgIH0KLSAgICAvKiBGcmVlIHRoZSBjbGlwcGVyIGlmIGF0dGFjaGVkIHRvIHRoaXMgc3VyZmFjZSAqLwotICAgIGlmKCBUaGlzLT5zLmxwQ2xpcHBlciApCi0JSURpcmVjdERyYXdDbGlwcGVyX1JlbGVhc2UoVGhpcy0+cy5scENsaXBwZXIpOwotICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxUaGlzKTsKLSAgICByZXR1cm4gU19PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1VubG9jaygKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUFZPSUQgc3VyZmFjZQotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwKS0+VW5sb2NrKCVwKVxuIixUaGlzLHN1cmZhY2UpOwotCi0gICAgLyogaW4gY2FzZSB0aGlzIHdhcyBjYWxsZWQgZnJvbSBSZWxlYXNlREMgKi8KLSAgICBER0FfVG91Y2hTdXJmYWNlKGlmYWNlKTsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldERDKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLEhEQyogbHBoZGMpIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIERTUFJJVkFURShUaGlzKTsKLSAgICBpbnQgd2FzX29rID0gVGhpcy0+cy5oZGMgIT0gMDsKLSAgICBIUkVTVUxUIHJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldERDKGlmYWNlLGxwaGRjKTsKLSAgICBpZiAoVGhpcy0+cy5oZGMgJiYgIXdhc19vaykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkvKiBoYWNrOiB0YWtlIG92ZXIgdGhlIERJQnNlY3Rpb24gY29sb3IgbWFwICovCi0JQklUTUFQT0JKICpibXAgPSAoQklUTUFQT0JKICopIEdESV9HZXRPYmpQdHIoVGhpcy0+cy5ESUJzZWN0aW9uLCBCSVRNQVBfTUFHSUMpOwotCVgxMURSVl9ESUJTRUNUSU9OICpkaWIgPSAoWDExRFJWX0RJQlNFQ1RJT04gKilibXAtPmRpYjsKLQlkc3ByaXYtPm9sZERJQm1hcCA9IGRpYi0+Y29sb3JNYXA7Ci0JZGliLT5jb2xvck1hcCA9IFRoaXMtPnMucGFsZXR0ZSA/IFRoaXMtPnMucGFsZXR0ZS0+c2NyZWVuX3BhbGVudHMgOiBOVUxMOwotCUdESV9SZWxlYXNlT2JqKFRoaXMtPnMuRElCc2VjdGlvbik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUlDT01fVlRBQkxFKElEaXJlY3REcmF3U3VyZmFjZTQpIGRnYV9kZHM0dnQgPSAKLXsKLSAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9EdW1teVJUVElWQUxVRQotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1F1ZXJ5SW50ZXJmYWNlLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0FkZFJlZiwKLSAgICBER0FfSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUmVsZWFzZSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9BZGRBdHRhY2hlZFN1cmZhY2UsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfQWRkT3ZlcmxheURpcnR5UmVjdCwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9CbHQsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfQmx0QmF0Y2gsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfQmx0RmFzdCwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9EZWxldGVBdHRhY2hlZFN1cmZhY2UsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfRW51bUF0dGFjaGVkU3VyZmFjZXMsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfRW51bU92ZXJsYXlaT3JkZXJzLAotICAgIERHQV9JRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9GbGlwLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldEF0dGFjaGVkU3VyZmFjZSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRCbHRTdGF0dXMsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0Q2FwcywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRDbGlwcGVyLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldENvbG9yS2V5LAotICAgIERHQV9JRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXREQywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRGbGlwU3RhdHVzLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldE92ZXJsYXlQb3NpdGlvbiwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRQYWxldHRlLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldFBpeGVsRm9ybWF0LAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldFN1cmZhY2VEZXNjLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0luaXRpYWxpemUsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfSXNMb3N0LAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0xvY2ssCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUmVsZWFzZURDLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1Jlc3RvcmUsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfU2V0Q2xpcHBlciwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRDb2xvcktleSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRPdmVybGF5UG9zaXRpb24sCi0gICAgREdBX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1NldFBhbGV0dGUsCi0gICAgREdBX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1VubG9jaywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9VcGRhdGVPdmVybGF5LAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1VwZGF0ZU92ZXJsYXlEaXNwbGF5LAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1VwZGF0ZU92ZXJsYXlaT3JkZXIsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0RERJbnRlcmZhY2UsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUGFnZUxvY2ssCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUGFnZVVubG9jaywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRTdXJmYWNlRGVzYywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRQcml2YXRlRGF0YSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRQcml2YXRlRGF0YSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9GcmVlUHJpdmF0ZURhdGEsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0VW5pcXVlbmVzc1ZhbHVlLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0NoYW5nZVVuaXF1ZW5lc3NWYWx1ZQotfTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZHN1cmZhY2UvZGdhMi5jIGIvZGxscy9kZHJhdy9kc3VyZmFjZS9kZ2EyLmMKaW5kZXggYjI1M2ZhMC4uNTNiY2MyZCAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy9kc3VyZmFjZS9kZ2EyLmMKKysrIGIvZGxscy9kZHJhdy9kc3VyZmFjZS9kZ2EyLmMKQEAgLTEsMTc2ICsxLDI1MyBAQAotLyoJCURpcmVjdERyYXdTdXJmYWNlIFhGODZER0EgaW1wbGVtZW50YXRpb24KKy8qCVhGODZER0EyIHByaW1hcnkgc3VyZmFjZSBkcml2ZXIKICAqCi0gKiBER0EyJ3Mgc3BlY2lmaWMgRGlyZWN0RHJhd1N1cmZhY2Ugcm91dGluZXMKKyAqIENvcHlyaWdodCAyMDAwIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCiAgKi8KKwogI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgSEFWRV9MSUJYWEY4NkRHQTIKKworI2luY2x1ZGUgInRzX3hsaWIuaCIKKyNpbmNsdWRlICJ0c194Zjg2ZGdhMi5oIgorI2luY2x1ZGUgIngxMWRydi5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAKLSNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAKICNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCi0jaW5jbHVkZSAiZGdhMl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiYml0bWFwLmgiCisjaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImRkcmF3L3VzZXIuaCIKKyNpbmNsdWRlICJkZHJhdy9kZ2EyLmgiCisjaW5jbHVkZSAiZHN1cmZhY2UvbWFpbi5oIgorI2luY2x1ZGUgImRzdXJmYWNlL2RpYi5oIgorI2luY2x1ZGUgImRzdXJmYWNlL2RnYTIuaCIKIAogREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKIAotI2RlZmluZSBERFBSSVZBVEUoeCkgZGdhMl9kZF9wcml2YXRlICpkZHByaXYgPSAoKGRnYTJfZGRfcHJpdmF0ZSopKHgpLT5kLT5wcml2YXRlKQotI2RlZmluZSBEUFBSSVZBVEUoeCkgZGdhMl9kcF9wcml2YXRlICpkcHByaXYgPSAoKGRnYTJfZHBfcHJpdmF0ZSopKHgpLT5wcml2YXRlKQotI2RlZmluZSBEU1BSSVZBVEUoeCkgZGdhMl9kc19wcml2YXRlICpkc3ByaXYgPSAoKGRnYTJfZHNfcHJpdmF0ZSopKHgpLT5wcml2YXRlKQorc3RhdGljIElDT01fVlRBQkxFKElEaXJlY3REcmF3U3VyZmFjZTcpIFhGODZER0EyX0lEaXJlY3REcmF3U3VyZmFjZTdfVlRhYmxlOwogCi1zdGF0aWMgQllURSBER0EyX1RvdWNoU3VyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSkKLXsgICAKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICAgIC8qIGlmIHRoZSBESUIgc2VjdGlvbiBpcyBpbiBHZGlNb2Qgc3RhdGUsIHdlIG11c3QKLSAgICAgKiB0b3VjaCB0aGUgc3VyZmFjZSB0byBnZXQgYW55IHVwZGF0ZXMgZnJvbSB0aGUgRElCICovCi0gICAgcmV0dXJuICooQllURSopKFRoaXMtPnMuc3VyZmFjZV9kZXNjLnUxLmxwU3VyZmFjZSk7Ci19CitIUkVTVUxUCitYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkgICAgIElEaXJlY3REcmF3SW1wbCogcERELAorCQkJCSAgICAgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNEKQoreworICAgIFhGODZER0EyX1BSSVZfVkFSKHByaXYsIFRoaXMpOworICAgIFhGODZER0EyX0REUkFXX1BSSVZfVkFSKGRkcHJpdiwgcEREKTsKKyAgICBIUkVTVUxUIGhyOworICAgIFhER0FEZXZpY2UqIG1vZGU7CiAKLUhSRVNVTFQgV0lOQVBJIERHQTJfSURpcmVjdERyYXdTdXJmYWNlNEltcGxfRmxpcCgKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUERJUkVDVERSQVdTVVJGQUNFNCBmbGlwdG8sRFdPUkQgZHdGbGFncwotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCogaWZsaXB0bz0oSURpcmVjdERyYXdTdXJmYWNlNEltcGwqKWZsaXB0bzsKLSAgICBEV09SRAl4aGVpZ2h0OwotICAgIERTUFJJVkFURShUaGlzKTsKLSAgICBkZ2FfZHNfcHJpdmF0ZQkqZnNwcml2OwotICAgIExQQllURQlzdXJmOwotCi0gICAgVFJBQ0UoIiglcCktPkZsaXAoJXAsJTA4bHgpXG4iLFRoaXMsaWZsaXB0byxkd0ZsYWdzKTsKLQotICAgIERHQTJfVG91Y2hTdXJmYWNlKGlmYWNlKTsKLSAgICBpZmxpcHRvID0gX2NvbW1vbl9maW5kX2ZsaXB0byhUaGlzLGlmbGlwdG8pOwotCi0gICAgLyogYW5kIGZsaXAhICovCi0gICAgZnNwcml2ID0gKGRnYV9kc19wcml2YXRlKilpZmxpcHRvLT5wcml2YXRlOwotICAgIFRTWERHQVNldFZpZXdwb3J0KGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwwLGZzcHJpdi0+ZmJfaGVpZ2h0LCBYREdBRmxpcFJldHJhY2UpOwotICAgIFRTWERHQVN5bmMoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKTsKLSAgICBUU1hGbHVzaChkaXNwbGF5KTsKLSAgICBpZiAoaWZsaXB0by0+cy5wYWxldHRlKSB7Ci0JRFBQUklWQVRFKGlmbGlwdG8tPnMucGFsZXR0ZSk7Ci0JaWYgKGRwcHJpdi0+Y20pCi0JICAgIFRTWERHQUluc3RhbGxDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksZHBwcml2LT5jbSk7CisgICAgVFJBQ0UoIiglcCwlcCwlcClcbiIsVGhpcyxwREQscEREU0QpOworICAgIGlmICghZGRwcml2LT54Zjg2ZGdhMi5jdXJyZW50X21vZGUpIHsKKwkvKiB3ZSBuZWVkIGEgbW9kZSEgKi8KKwlociA9IFhGODZER0EyX0RpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoSUNPTV9JTlRFUkZBQ0UocERELCBJRGlyZWN0RHJhdzcpLAorCQkJCQkJcERELT53aWR0aCwgcERELT5oZWlnaHQsCisJCQkJCQlwREQtPnBpeGVsZm9ybWF0LnUxLmR3UkdCQml0Q291bnQsCisJCQkJCQkwLCAwKTsKKwlpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOwogICAgIH0KIAotICAgIC8qIFdlIG5lZWQgdG8gc3dpdGNoIHRoZSBsb3dsZXZlbCBzdXJmYWNlcywgZm9yIERHQSB0aGlzIGlzOiAqLwotICAgIC8qIFRoZSBoZWlnaHQgd2l0aGluIHRoZSBmcmFtZWJ1ZmZlciAqLwotICAgIHhoZWlnaHQJCT0gZHNwcml2LT5mYl9oZWlnaHQ7Ci0gICAgZHNwcml2LT5mYl9oZWlnaHQJPSBmc3ByaXYtPmZiX2hlaWdodDsKLSAgICBmc3ByaXYtPmZiX2hlaWdodAk9IHhoZWlnaHQ7CisgICAgLyogZ3JhYiBmcmFtZWJ1ZmZlciBkYXRhIGZyb20gY3VycmVudF9tb2RlICovCisgICAgbW9kZSA9IGRkcHJpdi0+eGY4NmRnYTIuY3VycmVudF9tb2RlOworICAgIHByaXYtPnhmODZkZ2EyLmZiX3BpdGNoID0gbW9kZS0+bW9kZS5ieXRlc1BlclNjYW5saW5lOworICAgIHByaXYtPnhmODZkZ2EyLmZiX3ZvZnMgID0gZGRwcml2LT54Zjg2ZGdhMi5uZXh0X3ZvZnM7CisgICAgcHJpdi0+eGY4NmRnYTIuZmJfYWRkciAgPSBtb2RlLT5kYXRhICsKKwkJCSAgICAgIHByaXYtPnhmODZkZ2EyLmZiX3BpdGNoICogcHJpdi0+eGY4NmRnYTIuZmJfdm9mczsKKyAgICBUUkFDRSgidm9mcz0lbGQsIGFkZHI9JXBcbiIsIHByaXYtPnhmODZkZ2EyLmZiX3ZvZnMsIHByaXYtPnhmODZkZ2EyLmZiX2FkZHIpOwogCi0gICAgLyogQW5kIHRoZSBhc3NjaWF0ZWQgc3VyZmFjZSBwb2ludGVyICovCi0gICAgc3VyZgkgICAgICAgICAgICAgICAgICAgICAgICAgPSBUaGlzLT5zLnN1cmZhY2VfZGVzYy51MS5scFN1cmZhY2U7Ci0gICAgVGhpcy0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlICAgID0gaWZsaXB0by0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlOwotICAgIGlmbGlwdG8tPnMuc3VyZmFjZV9kZXNjLnUxLmxwU3VyZmFjZSA9IHN1cmY7CisgICAgLyogZmlsbCBpbiBzdXJmYWNlX2Rlc2MgYmVmb3JlIHdlIGNvbnN0cnVjdCBESUIgZnJvbSBpdCAqLworICAgIFRoaXMtPnN1cmZhY2VfZGVzYyA9ICpwRERTRDsKKyAgICBUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlID0gcHJpdi0+eGY4NmRnYTIuZmJfYWRkcjsKKyAgICBUaGlzLT5zdXJmYWNlX2Rlc2MudTEubFBpdGNoID0gcHJpdi0+eGY4NmRnYTIuZmJfcGl0Y2g7CisgICAgVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9MUFNVUkZBQ0UgfCBERFNEX1BJVENIOworCisgICAgaHIgPSBESUJfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KFRoaXMsIHBERCwgJlRoaXMtPnN1cmZhY2VfZGVzYyk7CisgICAgaWYgKEZBSUxFRChocikpIHJldHVybiBocjsKKworICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LmR3RmxhZ3MgJiBERFBGX1BBTEVUVEVJTkRFWEVEOCkgeworCXByaXYtPnhmODZkZ2EyLnBhbCA9IFRTWERHQUNyZWF0ZUNvbG9ybWFwKGRpc3BsYXksIERlZmF1bHRTY3JlZW4oZGlzcGxheSksIG1vZGUsIEFsbG9jQWxsKTsKKwlUU1hER0FJbnN0YWxsQ29sb3JtYXAoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwgcHJpdi0+eGY4NmRnYTIucGFsKTsKKyAgICB9CisKKyAgICBkZHByaXYtPnhmODZkZ2EyLm5leHRfdm9mcyArPSBwRERTRC0+ZHdIZWlnaHQ7CisKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcsCisJCQlYRjg2REdBMl9JRGlyZWN0RHJhd1N1cmZhY2U3X1ZUYWJsZSk7CisKKyAgICBUaGlzLT5maW5hbF9yZWxlYXNlID0gWEY4NkRHQTJfRGlyZWN0RHJhd1N1cmZhY2VfZmluYWxfcmVsZWFzZTsKKyAgICBUaGlzLT5kdXBsaWNhdGVfc3VyZmFjZSA9IFhGODZER0EyX0RpcmVjdERyYXdTdXJmYWNlX2R1cGxpY2F0ZV9zdXJmYWNlOworCisgICAgVGhpcy0+ZmxpcF9kYXRhICAgPSBYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX2RhdGE7CisgICAgVGhpcy0+ZmxpcF91cGRhdGUgPSBYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX3VwZGF0ZTsKKworICAgIFRoaXMtPnNldF9wYWxldHRlICAgID0gWEY4NkRHQTJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGU7CisgICAgVGhpcy0+dXBkYXRlX3BhbGV0dGUgPSBYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZV91cGRhdGVfcGFsZXR0ZTsKKworICAgIFRoaXMtPmdldF9kaXNwbGF5X3dpbmRvdyA9IFhGODZER0EyX0RpcmVjdERyYXdTdXJmYWNlX2dldF9kaXNwbGF5X3dpbmRvdzsKIAogICAgIHJldHVybiBERF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkgREdBMl9JRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRQYWxldHRlKAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLExQRElSRUNURFJBV1BBTEVUVEUgcGFsCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICAgIEREUFJJVkFURShUaGlzLT5zLmRkcmF3KTsKLSAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBpcGFsPShJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKilwYWw7CitIUkVTVUxUCitYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoSURpcmVjdERyYXdJbXBsICpwREQsCisJCQkgICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QsCisJCQkgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcHBTdXJmLAorCQkJICAgICAgSVVua25vd24gKnBVbmtPdXRlcikKK3sKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzOworICAgIEhSRVNVTFQgaHI7CisgICAgYXNzZXJ0KHBVbmtPdXRlciA9PSBOVUxMKTsKIAotICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMsaXBhbCk7CisgICAgVGhpcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkgICAgIHNpemVvZigqVGhpcykgKyBzaXplb2YoWEY4NkRHQTJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsKSk7CisgICAgaWYgKFRoaXMgPT0gTlVMTCkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CiAKLSAgICAvKiBBY2NvcmRpbmcgdG8gc3BlYywgd2UgYXJlIG9ubHkgc3VwcG9zZWQgdG8gCi0gICAgICogQWRkUmVmIGlmIHRoaXMgaXMgbm90IHRoZSBzYW1lIHBhbGV0dGUuCi0gICAgICovCi0gICAgaWYoIFRoaXMtPnMucGFsZXR0ZSAhPSBpcGFsICkgewotCWRnYV9kcF9wcml2YXRlCSpmcHByaXY7Ci0JaWYoIGlwYWwgIT0gTlVMTCApCi0JICAgIElEaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYoIChJRGlyZWN0RHJhd1BhbGV0dGUqKWlwYWwgKTsKLQlpZiggVGhpcy0+cy5wYWxldHRlICE9IE5VTEwgKQotCSAgICBJRGlyZWN0RHJhd1BhbGV0dGVfUmVsZWFzZSggKElEaXJlY3REcmF3UGFsZXR0ZSopVGhpcy0+cy5wYWxldHRlICk7Ci0JVGhpcy0+cy5wYWxldHRlID0gaXBhbDsKLQlmcHByaXYgPSAoZGdhX2RwX3ByaXZhdGUqKVRoaXMtPnMucGFsZXR0ZS0+cHJpdmF0ZTsKKyAgICBUaGlzLT5wcml2YXRlID0gKFhGODZER0EyX0RpcmVjdERyYXdTdXJmYWNlSW1wbCopKFRoaXMrMSk7CiAKLQlpZiAoIWZwcHJpdi0+Y20gJiYKLQkgICAgKFRoaXMtPnMuZGRyYXctPmQtPnNjcmVlbl9waXhlbGZvcm1hdC51LmR3UkdCQml0Q291bnQ8PTgpICkgewotCSAgaW50IGk7Ci0JICAKLQkgIC8qIERlbGF5ZWQgcGFsZXR0ZSBjcmVhdGlvbiAqLwotCSAgZnBwcml2LT5jbSA9IFRTWERHQUNyZWF0ZUNvbG9ybWFwKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwgZGRwcml2LT5kZXYsIEFsbG9jQWxsKTsKLQkgICAgCi0JICBmb3IgKGk9MDtpPDI1NjtpKyspIHsKLQkgICAgWENvbG9yIHhjOwotCSAgICAKLQkgICAgeGMucmVkCQk9IGlwYWwtPnBhbGVudHNbaV0ucGVSZWQ8PDg7Ci0JICAgIHhjLmJsdWUJCT0gaXBhbC0+cGFsZW50c1tpXS5wZUJsdWU8PDg7Ci0JICAgIHhjLmdyZWVuCT0gaXBhbC0+cGFsZW50c1tpXS5wZUdyZWVuPDw4OwotCSAgICB4Yy5mbGFncwk9IERvUmVkfERvQmx1ZXxEb0dyZWVuOwotCSAgICB4Yy5waXhlbAk9IGk7Ci0JICAgIFRTWFN0b3JlQ29sb3IoZGlzcGxheSxmcHByaXYtPmNtLCZ4Yyk7Ci0JICB9Ci0JfQorICAgIGhyID0gWEY4NkRHQTJfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KFRoaXMsIHBERCwgcEREU0QpOworICAgIGlmIChGQUlMRUQoaHIpKQorCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOworICAgIGVsc2UKKwkqcHBTdXJmID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNyk7CiAKLQlUU1hER0FJbnN0YWxsQ29sb3JtYXAoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLGZwcHJpdi0+Y20pOworICAgIHJldHVybiBocjsKK30KIAotICAgICAgICBpZiAoVGhpcy0+cy5oZGMgIT0gMCkgewotCSAgICAvKiBoYWNrOiBzZXQgdGhlIERJQnNlY3Rpb24gY29sb3IgbWFwICovCi0JICAgIEJJVE1BUE9CSiAqYm1wID0gKEJJVE1BUE9CSiAqKSBHRElfR2V0T2JqUHRyKFRoaXMtPnMuRElCc2VjdGlvbiwgQklUTUFQX01BR0lDKTsKLQkgICAgWDExRFJWX0RJQlNFQ1RJT04gKmRpYiA9IChYMTFEUlZfRElCU0VDVElPTiAqKWJtcC0+ZGliOwotCSAgICBkaWItPmNvbG9yTWFwID0gVGhpcy0+cy5wYWxldHRlID8gVGhpcy0+cy5wYWxldHRlLT5zY3JlZW5fcGFsZW50cyA6IE5VTEw7Ci0JICAgIEdESV9SZWxlYXNlT2JqKFRoaXMtPnMuRElCc2VjdGlvbik7Cit2b2lkIFhGODZER0EyX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKK3sKKyAgICBYRjg2REdBMl9QUklWX1ZBUihwcml2LCBUaGlzKTsKKworICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlKFRoaXMpOworICAgIGlmIChwcml2LT54Zjg2ZGdhMi5wYWwpCisJVFNYRnJlZUNvbG9ybWFwKGRpc3BsYXksIHByaXYtPnhmODZkZ2EyLnBhbCk7Cit9CisKK3ZvaWQgWEY4NkRHQTJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkJSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsKSAKK3sKKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGUoVGhpcywgcGFsKTsKK30KKwordm9pZCBYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZV91cGRhdGVfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCQkgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWwsCisJCQkJCSAgIERXT1JEIGR3U3RhcnQsIERXT1JEIGR3Q291bnQsCisJCQkJCSAgIExQUEFMRVRURUVOVFJZIHBhbGVudCkKK3sKKyAgICBYRjg2REdBMl9QUklWX1ZBUihwcml2LCBUaGlzKTsKKworICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKQorICAgIHsKKwlYQ29sb3IgYzsKKwlpbnQgbjsKKworCWMuZmxhZ3MgPSBEb1JlZHxEb0dyZWVufERvQmx1ZTsKKwljLnBpeGVsID0gZHdTdGFydDsKKwlmb3IgKG49MDsgbjxkd0NvdW50OyBuKyssYy5waXhlbCsrKSB7CisJICAgIGMucmVkICAgPSBwYWxlbnRbbl0ucGVSZWQgICA8PCA4OworCSAgICBjLmdyZWVuID0gcGFsZW50W25dLnBlR3JlZW4gPDwgODsKKwkgICAgYy5ibHVlICA9IHBhbGVudFtuXS5wZUJsdWUgIDw8IDg7CisJICAgIFRTWFN0b3JlQ29sb3IoZGlzcGxheSwgcHJpdi0+eGY4NmRnYTIucGFsLCAmYyk7CiAJfQogCVRTWEZsdXNoKGRpc3BsYXkpOwogICAgIH0KLSAgICByZXR1cm4gRERfT0s7CiB9CiAKLQotSUNPTV9WVEFCTEUoSURpcmVjdERyYXdTdXJmYWNlNCkgZGdhMl9kZHM0dnQgPSAKK0hSRVNVTFQgWEY4NkRHQTJfRGlyZWN0RHJhd1N1cmZhY2VfZHVwbGljYXRlX3N1cmZhY2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkJCSBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBEdXApCiB7Ci0gICAgSUNPTV9NU1ZUQUJMRV9DT01QQVRfRHVtbXlSVFRJVkFMVUUKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9RdWVyeUludGVyZmFjZSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9BZGRSZWYsCi0gICAgREdBX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1JlbGVhc2UsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfQWRkQXR0YWNoZWRTdXJmYWNlLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0FkZE92ZXJsYXlEaXJ0eVJlY3QsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfQmx0LAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0JsdEJhdGNoLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0JsdEZhc3QsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfRGVsZXRlQXR0YWNoZWRTdXJmYWNlLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0VudW1BdHRhY2hlZFN1cmZhY2VzLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0VudW1PdmVybGF5Wk9yZGVycywKLSAgICBER0EyX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0ZsaXAsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0QXR0YWNoZWRTdXJmYWNlLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldEJsdFN0YXR1cywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRDYXBzLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldENsaXBwZXIsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0Q29sb3JLZXksCi0gICAgREdBX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldERDLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldEZsaXBTdGF0dXMsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0T3ZlcmxheVBvc2l0aW9uLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldFBhbGV0dGUsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0UGl4ZWxGb3JtYXQsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0U3VyZmFjZURlc2MsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfSW5pdGlhbGl6ZSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9Jc0xvc3QsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfTG9jaywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9SZWxlYXNlREMsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUmVzdG9yZSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRDbGlwcGVyLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1NldENvbG9yS2V5LAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1NldE92ZXJsYXlQb3NpdGlvbiwKLSAgICBER0EyX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1NldFBhbGV0dGUsCi0gICAgREdBX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1VubG9jaywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9VcGRhdGVPdmVybGF5LAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1VwZGF0ZU92ZXJsYXlEaXNwbGF5LAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1VwZGF0ZU92ZXJsYXlaT3JkZXIsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0RERJbnRlcmZhY2UsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUGFnZUxvY2ssCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUGFnZVVubG9jaywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRTdXJmYWNlRGVzYywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRQcml2YXRlRGF0YSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRQcml2YXRlRGF0YSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9GcmVlUHJpdmF0ZURhdGEsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0VW5pcXVlbmVzc1ZhbHVlLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0NoYW5nZVVuaXF1ZW5lc3NWYWx1ZQorICAgIHJldHVybiBYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoVGhpcy0+ZGRyYXdfb3duZXIsCisJCQkJCSAgICAgJlRoaXMtPnN1cmZhY2VfZGVzYywgcHBEdXAsIE5VTEwpOworfQorCit2b2lkIFhGODZER0EyX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBmcm9udCwKKwkJCQkgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBiYWNrKQoreworICAgIFhGODZER0EyX1BSSVZfVkFSKGZyb250X3ByaXYsIGZyb250KTsKKyAgICBYRjg2REdBMl9QUklWX1ZBUihiYWNrX3ByaXYsIGJhY2spOworCisgICAgeworCURXT1JEIHRtcDsKKwl0bXAgPSBmcm9udF9wcml2LT54Zjg2ZGdhMi5mYl92b2ZzOworCWZyb250X3ByaXYtPnhmODZkZ2EyLmZiX3ZvZnMgPSBiYWNrX3ByaXYtPnhmODZkZ2EyLmZiX3ZvZnM7CisJYmFja19wcml2LT54Zjg2ZGdhMi5mYl92b2ZzID0gdG1wOworICAgIH0KKyAgICB7CisJTFBWT0lEIHRtcDsKKwl0bXAgPSBmcm9udF9wcml2LT54Zjg2ZGdhMi5mYl9hZGRyOworCWZyb250X3ByaXYtPnhmODZkZ2EyLmZiX2FkZHIgPSBiYWNrX3ByaXYtPnhmODZkZ2EyLmZiX2FkZHI7CisJYmFja19wcml2LT54Zjg2ZGdhMi5mYl9hZGRyID0gdG1wOworICAgIH0KKworICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX2RhdGEoZnJvbnQsIGJhY2spOworfQorCit2b2lkIFhGODZER0EyX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpCit7CisgICAgWEY4NkRHQTJfUFJJVl9WQVIocHJpdiwgVGhpcyk7CisKKyAgICAvKiBYWFggaGF2aW5nIHRoZSBGbGlwJ3MgZHdGbGFncyB3b3VsZCBiZSBuaWNlIGhlcmUgKi8KKyAgICBUU1hER0FTZXRWaWV3cG9ydChkaXNwbGF5LCBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLAorCQkgICAgICAwLCBwcml2LT54Zjg2ZGdhMi5mYl92b2ZzLCBYREdBRmxpcEltbWVkaWF0ZSk7Cit9CisKK0hXTkQgWEY4NkRHQTJfRGlyZWN0RHJhd1N1cmZhY2VfZ2V0X2Rpc3BsYXlfd2luZG93KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpCit7CisgICAgLyogdGhlcmUncyBhIHBvdGVudGlhbCBkcmF3YWJsZSBpbiB0aGUgZGRyYXcgb2JqZWN0J3MgY3VycmVudF9tb2RlLT5waXhtYXAuLi4KKyAgICAgKiBwZXJoYXBzIGl0J3MgcG9zc2libGUgdG8gdXNlIGl0IGZvciB0aGUgRGlyZWN0M0QgcmVuZGVyaW5nIGFzIHdlbGw/ICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhd1N1cmZhY2U3KSBYRjg2REdBMl9JRGlyZWN0RHJhd1N1cmZhY2U3X1ZUYWJsZSA9Cit7CisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0FkZFJlZiwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9BZGRBdHRhY2hlZFN1cmZhY2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9BZGRPdmVybGF5RGlydHlSZWN0LAorICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZV9CbHQsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9CbHRCYXRjaCwKKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VfQmx0RmFzdCwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0RlbGV0ZUF0dGFjaGVkU3VyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0VudW1BdHRhY2hlZFN1cmZhY2VzLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRW51bU92ZXJsYXlaT3JkZXJzLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRmxpcCwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldEF0dGFjaGVkU3VyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldEJsdFN0YXR1cywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENhcHMsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRDbGlwcGVyLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q29sb3JLZXksCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXREQywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldEZsaXBTdGF0dXMsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRPdmVybGF5UG9zaXRpb24sCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQYWxldHRlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UGl4ZWxGb3JtYXQsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRTdXJmYWNlRGVzYywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0luaXRpYWxpemUsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Jc0xvc3QsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Mb2NrLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZURDLAorICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZV9SZXN0b3JlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0Q2xpcHBlciwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldENvbG9yS2V5LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0T3ZlcmxheVBvc2l0aW9uLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UGFsZXR0ZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VubG9jaywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VwZGF0ZU92ZXJsYXksCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5RGlzcGxheSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VwZGF0ZU92ZXJsYXlaT3JkZXIsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXREREludGVyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1BhZ2VMb2NrLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUGFnZVVubG9jaywKKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VfU2V0U3VyZmFjZURlc2MsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRQcml2YXRlRGF0YSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFByaXZhdGVEYXRhLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRnJlZVByaXZhdGVEYXRhLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0VW5pcXVlbmVzc1ZhbHVlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQ2hhbmdlVW5pcXVlbmVzc1ZhbHVlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UHJpb3JpdHksCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQcmlvcml0eSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldExPRCwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldExPRAogfTsKKworI2VuZGlmIC8qIEhBVkVfTElCWFhGODZER0EyICovCmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RzdXJmYWNlL2RnYTIuaCBiL2RsbHMvZGRyYXcvZHN1cmZhY2UvZGdhMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjhmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RzdXJmYWNlL2RnYTIuaApAQCAtMCwwICsxLDUwIEBACisvKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLiAqLworCisjaWZuZGVmIEREUkFXX0RTVVJGQUNFX0RHQTJfSF9JTkNMVURFRAorI2RlZmluZSBERFJBV19EU1VSRkFDRV9ER0EyX0hfSU5DTFVERUQKKworI2RlZmluZSBYRjg2REdBMl9QUklWKHN1cmYpICgoWEY4NkRHQTJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsKikoKHN1cmYpLT5wcml2YXRlKSkKKworI2RlZmluZSBYRjg2REdBMl9QUklWX1ZBUihuYW1lLHN1cmYpIFwKKwlYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZUltcGwqIG5hbWUgPSBYRjg2REdBMl9QUklWKHN1cmYpCisKK3N0cnVjdCBYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydAoreworICAgIExQVk9JRCBmYl9hZGRyOworICAgIERXT1JEIGZiX3BpdGNoLCBmYl92b2ZzOworICAgIENvbG9ybWFwIHBhbDsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgc3RydWN0IERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydCBkaWI7CisgICAgc3RydWN0IFhGODZER0EyX0RpcmVjdERyYXdTdXJmYWNlSW1wbF9QYXJ0IHhmODZkZ2EyOworfSBYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZUltcGw7CisKK0hSRVNVTFQKK1hGODZER0EyX0RpcmVjdERyYXdTdXJmYWNlX0NvbnN0cnVjdChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCSAgICAgSURpcmVjdERyYXdJbXBsKiBwREQsCisJCQkJICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QpOworCitIUkVTVUxUCitYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoSURpcmVjdERyYXdJbXBsICpwREQsCisJCQkJICBjb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QsCisJCQkJICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcHBTdXJmLAorCQkJCSAgSVVua25vd24gKnBVbmtPdXRlcik7CisKK3ZvaWQgWEY4NkRHQTJfRGlyZWN0RHJhd1N1cmZhY2VfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKKwordm9pZCBYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZV9zZXRfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCQkgICAgSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsKTsKK3ZvaWQgWEY4NkRHQTJfRGlyZWN0RHJhd1N1cmZhY2VfdXBkYXRlX3BhbGV0dGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkJICAgICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCwKKwkJCQkJICAgICAgIERXT1JEIGR3U3RhcnQsIERXT1JEIGR3Q291bnQsCisJCQkJCSAgICAgICBMUFBBTEVUVEVFTlRSWSBwYWxlbnQpOworSFJFU1VMVCBYRjg2REdBMl9EaXJlY3REcmF3U3VyZmFjZV9kdXBsaWNhdGVfc3VyZmFjZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCQkJIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcER1cCk7Cit2b2lkIFhGODZER0EyX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBmcm9udCwKKwkJCQkJICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBiYWNrKTsKK3ZvaWQgWEY4NkRHQTJfRGlyZWN0RHJhd1N1cmZhY2VfZmxpcF91cGRhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyk7CitIV05EIFhGODZER0EyX0RpcmVjdERyYXdTdXJmYWNlX2dldF9kaXNwbGF5X3dpbmRvdyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RzdXJmYWNlL2RpYi5jIGIvZGxscy9kZHJhdy9kc3VyZmFjZS9kaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODVmNjZkCi0tLSAvZGV2L251bGwKKysrIGIvZGxscy9kZHJhdy9kc3VyZmFjZS9kaWIuYwpAQCAtMCwwICsxLDg3OSBAQAorLyoJCURJQlNlY3Rpb24gRGlyZWN0RHJhd1N1cmZhY2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDE5OTctMjAwMCBNYXJjdXMgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAxOTk4LTIwMDAgTGlvbmVsIFVsbWVyCisgKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgImJpdG1hcC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCisjaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImRzdXJmYWNlL21haW4uaCIKKyNpbmNsdWRlICJkc3VyZmFjZS9kaWIuaCIKKworREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKKworc3RhdGljIElDT01fVlRBQkxFKElEaXJlY3REcmF3U3VyZmFjZTcpIERJQl9JRGlyZWN0RHJhd1N1cmZhY2U3X1ZUYWJsZTsKKworc3RhdGljIEhSRVNVTFQgY3JlYXRlX2RpYihJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQoreworICAgIEJJVE1BUElORk8qIGJfaW5mbzsKKyAgICBVSU5UIHVzYWdlOworICAgIEhEQyBkZGM7CisgICAgRElCX0RpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJpdiA9IFRoaXMtPnByaXZhdGU7CisKKyAgICBhc3NlcnQoVGhpcy0+c3VyZmFjZV9kZXNjLmxwU3VyZmFjZSAhPSBOVUxMKTsKKworICAgIHN3aXRjaCAoVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50KQorICAgIHsKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgMzI6CisJLyogQWxsb2NhdGUgZXh0cmEgc3BhY2UgdG8gc3RvcmUgdGhlIFJHQiBiaXQgbWFza3MuICovCisJYl9pbmZvID0gKEJJVE1BUElORk8qKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkJCQlzaXplb2YoQklUTUFQSU5GT0hFQURFUikKKwkJCQkJKyAzICogc2l6ZW9mKERXT1JEKSk7CisJYnJlYWs7CisKKyAgICBjYXNlIDI0OgorCWJfaW5mbyA9IChCSVRNQVBJTkZPKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKKwkJCQkJc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJLyogQWxsb2NhdGUgZXh0cmEgc3BhY2UgZm9yIGEgcGFsZXR0ZS4gKi8KKwliX2luZm8gPSAoQklUTUFQSU5GTyopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCisJCQkJCXNpemVvZihCSVRNQVBJTkZPSEVBREVSKQorCQkJCQkrIHNpemVvZihSR0JRVUFEKQorCQkJCQkqICgxIDw8IFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCkpOworCWJyZWFrOworICAgIH0KKworICAgIGJfaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgICBiX2luZm8tPmJtaUhlYWRlci5iaVdpZHRoID0gVGhpcy0+c3VyZmFjZV9kZXNjLmR3V2lkdGg7CisgICAgYl9pbmZvLT5ibWlIZWFkZXIuYmlIZWlnaHQgPSAtVGhpcy0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0OworICAgIGJfaW5mby0+Ym1pSGVhZGVyLmJpUGxhbmVzID0gMTsKKyAgICBiX2luZm8tPmJtaUhlYWRlci5iaUJpdENvdW50ID0gVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50OworCisgICAgaWYgKChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQgIT0gMTYpCisJJiYgKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCAhPSAzMikpCisgICAgICAgIGJfaW5mby0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSBCSV9SR0I7CisgICAgZWxzZQorICAgICAgICBiX2luZm8tPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfQklURklFTERTOworCisgICAgYl9pbmZvLT5ibWlIZWFkZXIuYmlTaXplSW1hZ2UKKwk9IChUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQgLyA4KQorCSogVGhpcy0+c3VyZmFjZV9kZXNjLmR3V2lkdGggKiBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQ7CisKKyAgICBiX2luZm8tPmJtaUhlYWRlci5iaVhQZWxzUGVyTWV0ZXIgPSAwOworICAgIGJfaW5mby0+Ym1pSGVhZGVyLmJpWVBlbHNQZXJNZXRlciA9IDA7CisgICAgYl9pbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkID0gMDsKKyAgICBiX2luZm8tPmJtaUhlYWRlci5iaUNsckltcG9ydGFudCA9IDA7CisKKyAgICBzd2l0Y2ggKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQudTEuZHdSR0JCaXRDb3VudCkKKyAgICB7CisgICAgY2FzZSAxNjoKKyAgICBjYXNlIDMyOgorICAgIHsKKwlEV09SRCAqbWFza3MgPSAoRFdPUkQgKikgJihiX2luZm8tPmJtaUNvbG9ycyk7CisKKwl1c2FnZSA9IDA7CisJbWFza3NbMF0gPSBUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUyLmR3UkJpdE1hc2s7CisJbWFza3NbMV0gPSBUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnUzLmR3R0JpdE1hc2s7CisJbWFza3NbMl0gPSBUaGlzLT5zdXJmYWNlX2Rlc2MudTQuZGRwZlBpeGVsRm9ybWF0LnU0LmR3QkJpdE1hc2s7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSAyNDoKKwkvKiBOb3RoaW5nIHRvIGRvICovCisJdXNhZ2UgPSBESUJfUkdCX0NPTE9SUzsKKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJLyogRG9uJ3Qga25vdyBwYWxldHRlICovCisJdXNhZ2UgPSAwOworCWJyZWFrOworICAgIH0KKworICAgIGRkYyA9IENyZWF0ZURDQSgiRElTUExBWSIsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGlmIChkZGMgPT0gMCkKKyAgICB7CisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYl9pbmZvKTsKKwlyZXR1cm4gSFJFU1VMVF9GUk9NX1dJTjMyKEdldExhc3RFcnJvcigpKTsKKyAgICB9CisKKyAgICBwcml2LT5kaWIuRElCc2VjdGlvbgorCT0gRElCX0NyZWF0ZURJQlNlY3Rpb24oZGRjLCBiX2luZm8sIHVzYWdlLCAmKHByaXYtPmRpYi5iaXRtYXBfZGF0YSksIDAsCisJCQkgICAgICAgKERXT1JEKVRoaXMtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2UsCisJCQkgICAgICAgVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaCk7CisgICAgRGVsZXRlREMoZGRjKTsKKyAgICBpZiAoIXByaXYtPmRpYi5ESUJzZWN0aW9uKSB7CisJRVJSKCJDcmVhdGVESUJTZWN0aW9uIGZhaWxlZCFcbiIpOworCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGJfaW5mbyk7CisJcmV0dXJuIEhSRVNVTFRfRlJPTV9XSU4zMihHZXRMYXN0RXJyb3IoKSk7CisgICAgfQorCisgICAgVFJBQ0UoIkRJQlNlY3Rpb24gYXQgOiAlcFxuIiwgcHJpdi0+ZGliLmJpdG1hcF9kYXRhKTsKKyAgICBpZiAoIVRoaXMtPnN1cmZhY2VfZGVzYy51MS5sUGl0Y2gpIHsKKwkvKiBUaGlzIGNhbid0IGhhcHBlbiwgcmlnaHQ/ICovCisJLyogb3IgdXNlIEdESV9HZXRPYmogdG8gZ2V0IGl0IGZyb20gdGhlIGNyZWF0ZWQgRElCPyAqLworCVRoaXMtPnN1cmZhY2VfZGVzYy51MS5sUGl0Y2ggPSBESUJfR2V0RElCV2lkdGhCeXRlcyhiX2luZm8tPmJtaUhlYWRlci5iaVdpZHRoLCBiX2luZm8tPmJtaUhlYWRlci5iaUJpdENvdW50KTsKKwlUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX1BJVENIOworICAgIH0KKworICAgIGlmICghVGhpcy0+c3VyZmFjZV9kZXNjLmxwU3VyZmFjZSkgeworCVRoaXMtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2UgPSBwcml2LT5kaWIuYml0bWFwX2RhdGE7CisJVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9MUFNVUkZBQ0U7CisgICAgfQorCisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYl9pbmZvKTsKKworICAgIC8qIEkgZG9uJ3QgdGhpbmsgaXQncyB3b3J0aCBjaGVja2luZyBmb3IgdGhpcy4gKi8KKyAgICBpZiAocHJpdi0+ZGliLmJpdG1hcF9kYXRhICE9IFRoaXMtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2UpCisJRVJSKCJ1bmV4cGVjdGVkIGVycm9yIGNyZWF0aW5nIERpcmVjdERyYXdTdXJmYWNlIERJQiBzZWN0aW9uXG4iKTsKKworICAgIHJldHVybiBTX09LOworfQorCit2b2lkIERJQl9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpCit7CisgICAgRElCX0RpcmVjdERyYXdTdXJmYWNlSW1wbCogcHJpdiA9IFRoaXMtPnByaXZhdGU7CisKKyAgICBEZWxldGVPYmplY3QocHJpdi0+ZGliLkRJQnNlY3Rpb24pOworCisgICAgaWYgKCFwcml2LT5kaWIuY2xpZW50X21lbW9yeSkKKwlWaXJ0dWFsRnJlZShUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlLCAwLCBNRU1fUkVMRUFTRSk7CisKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoVGhpcyk7Cit9CisKK0hSRVNVTFQgRElCX0RpcmVjdERyYXdTdXJmYWNlX2R1cGxpY2F0ZV9zdXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCisJCQkJCQlMUERJUkVDVERSQVdTVVJGQUNFNyogcHBEdXApCit7CisgICAgcmV0dXJuIERJQl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoVGhpcy0+ZGRyYXdfb3duZXIsCisJCQkJCSZUaGlzLT5zdXJmYWNlX2Rlc2MsIHBwRHVwLCBOVUxMKTsKK30KKworSFJFU1VMVCBESUJfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMsCisJCQkJCUlEaXJlY3REcmF3SW1wbCAqcERELAorCQkJCQljb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QpCit7CisgICAgSFJFU1VMVCBocjsKKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBwcml2ID0gVGhpcy0+cHJpdmF0ZTsKKworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLFRoaXMscERELHBERFNEKTsKKyAgICBociA9IE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KFRoaXMsIHBERCwgcEREU0QpOworICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7CisKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcsCisJCQlESUJfSURpcmVjdERyYXdTdXJmYWNlN19WVGFibGUpOworCisgICAgVGhpcy0+ZmluYWxfcmVsZWFzZSA9IERJQl9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlOworICAgIFRoaXMtPmR1cGxpY2F0ZV9zdXJmYWNlID0gRElCX0RpcmVjdERyYXdTdXJmYWNlX2R1cGxpY2F0ZV9zdXJmYWNlOworICAgIFRoaXMtPmZsaXBfZGF0YSA9IERJQl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX2RhdGE7CisKKyAgICBUaGlzLT5nZXRfZGMgICAgID0gRElCX0RpcmVjdERyYXdTdXJmYWNlX2dldF9kYzsKKyAgICBUaGlzLT5yZWxlYXNlX2RjID0gRElCX0RpcmVjdERyYXdTdXJmYWNlX3JlbGVhc2VfZGM7CisgICAgVGhpcy0+aERDID0gKEhEQylOVUxMOworCisgICAgVGhpcy0+c2V0X3BhbGV0dGUgICAgPSBESUJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGU7CisgICAgVGhpcy0+dXBkYXRlX3BhbGV0dGUgPSBESUJfRGlyZWN0RHJhd1N1cmZhY2VfdXBkYXRlX3BhbGV0dGU7CisKKyAgICBUUkFDRSgiKCVsZHglbGQsIHBpdGNoPSVsZClcbiIsCisJICBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aCwgVGhpcy0+c3VyZmFjZV9kZXNjLmR3SGVpZ2h0LAorCSAgVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaCk7CisgICAgLyogWFhYIGxvYWQgZHdXaWR0aCBhbmQgZHdIZWlnaHQgZnJvbSBwREQgaWYgdGhleSBhcmUgbm90IHNwZWNpZmllZD8gKi8KKworICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZHdGbGFncyAmIEREU0RfTFBTVVJGQUNFKQorICAgIHsKKwkvKiAiQ2xpZW50IG1lbW9yeSI6IGl0IGlzIG1hbmFnZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAqLworCS8qIFhYWCBXaGF0IGlmIGxQaXRjaCBpcyBub3Qgc2V0PyBVc2UgZHdXaWR0aCBvciBmYWlsPyAqLworCisJcHJpdi0+ZGliLmNsaWVudF9tZW1vcnkgPSBUUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWlmICghKFRoaXMtPnN1cmZhY2VfZGVzYy5kd0ZsYWdzICYgRERTRF9QSVRDSCkpCisJeworCSAgICBpbnQgcGl0Y2ggPSBUaGlzLT5zdXJmYWNlX2Rlc2MudTEubFBpdGNoOworCSAgICBpZiAocGl0Y2ggJSA4ICE9IDApCisJCXBpdGNoICs9IDggLSAocGl0Y2ggJSA4KTsKKwl9CisJLyogWFhYIGVsc2U6IGhvdyBzaG91bGQgbFBpdGNoIGJlIHZlcmlmaWVkPyAqLworCisJVGhpcy0+c3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9QSVRDSHxERFNEX0xQU1VSRkFDRTsKKworCVRoaXMtPnN1cmZhY2VfZGVzYy5scFN1cmZhY2UKKwkgICAgPSBWaXJ0dWFsQWxsb2MoTlVMTCwgVGhpcy0+c3VyZmFjZV9kZXNjLnUxLmxQaXRjaAorCQkJICAgKiBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQsCisJCQkgICBNRU1fUkVTRVJWRSB8IE1FTV9DT01NSVQsIFBBR0VfUkVBRFdSSVRFKTsKKworCWlmIChUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlID09IE5VTEwpCisJeworCSAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoVGhpcyk7CisJICAgIHJldHVybiBIUkVTVUxUX0ZST01fV0lOMzIoR2V0TGFzdEVycm9yKCkpOworCX0KKworCXByaXYtPmRpYi5jbGllbnRfbWVtb3J5ID0gRkFMU0U7CisgICAgfQorCisgICAgaHIgPSBjcmVhdGVfZGliKFRoaXMpOworICAgIGlmIChGQUlMRUQoaHIpKQorICAgIHsKKwlpZiAoIXByaXYtPmRpYi5jbGllbnRfbWVtb3J5KQorCSAgICBWaXJ0dWFsRnJlZShUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlLCAwLCBNRU1fUkVMRUFTRSk7CisKKwlNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoVGhpcyk7CisKKwlyZXR1cm4gaHI7CisgICAgfQorCisgICAgcmV0dXJuIEREX09LOworfQorCisvKiBOb3QgYW4gQVBJICovCitIUkVTVUxUIERJQl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoSURpcmVjdERyYXdJbXBsICpwREQsCisJCQkJICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QsCisJCQkJICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcHBTdXJmLAorCQkJCSAgICAgSVVua25vd24gKnBVbmtPdXRlcikKK3sKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzOworICAgIEhSRVNVTFQgaHI7CisgICAgYXNzZXJ0KHBVbmtPdXRlciA9PSBOVUxMKTsKKworICAgIFRoaXMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKKwkJICAgICBzaXplb2YoKlRoaXMpICsgc2l6ZW9mKERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGwpKTsKKyAgICBpZiAoVGhpcyA9PSBOVUxMKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKworICAgIFRoaXMtPnByaXZhdGUgPSAoRElCX0RpcmVjdERyYXdTdXJmYWNlSW1wbCopKFRoaXMrMSk7CisKKyAgICBociA9IERJQl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoVGhpcywgcERELCBwRERTRCk7CisgICAgaWYgKEZBSUxFRChocikpCisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7CisgICAgZWxzZQorCSpwcFN1cmYgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KTsKKworICAgIHJldHVybiBocjsKKworfQorCisvKiBBZGRBdHRhY2hlZFN1cmZhY2U6IGdlbmVyaWMgKi8KKy8qIEFkZE92ZXJsYXlEaXJ0eVJlY3Q6IGdlbmVyaWMsIHVuaW1wbGVtZW50ZWQgKi8KKworc3RhdGljIEhSRVNVTFQgX0JsdF9Db2xvckZpbGwoCisgICAgTFBCWVRFIGJ1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYnBwLCBMT05HIGxQaXRjaCwgRFdPUkQgY29sb3IKKykgeworICAgIGludCB4LCB5OworICAgIExQQllURSBmaXJzdDsKKworICAgIC8qIERvIGZpcnN0IHJvdyAqLworCisjZGVmaW5lIENPTE9SRklMTF9ST1codHlwZSkgeyBcCisgICAgdHlwZSAqZCA9ICh0eXBlICopIGJ1ZjsgXAorICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSBcCisJZFt4XSA9ICh0eXBlKSBjb2xvcjsgXAorICAgIGJyZWFrOyBcCit9CisKKyAgICBzd2l0Y2goYnBwKSB7CisgICAgY2FzZSAxOiBDT0xPUkZJTExfUk9XKEJZVEUpCisgICAgY2FzZSAyOiBDT0xPUkZJTExfUk9XKFdPUkQpCisgICAgY2FzZSA0OiBDT0xPUkZJTExfUk9XKERXT1JEKQorICAgIGRlZmF1bHQ6CisJRklYTUUoIkNvbG9yIGZpbGwgbm90IGltcGxlbWVudGVkIGZvciBicHAgJWQhXG4iLCBicHAqOCk7CisJcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOworICAgIH0KKworI3VuZGVmIENPTE9SRklMTF9ST1cKKworICAgIC8qIE5vdyBjb3B5IGZpcnN0IHJvdyAqLworICAgIGZpcnN0ID0gYnVmOworICAgIGZvciAoeSA9IDE7IHkgPCBoZWlnaHQ7IHkrKykgeworCWJ1ZiArPSBsUGl0Y2g7CisJbWVtY3B5KGJ1ZiwgZmlyc3QsIHdpZHRoICogYnBwKTsKKyAgICB9CisgICAgcmV0dXJuIEREX09LOworfQorCitIUkVTVUxUIFdJTkFQSQorRElCX0RpcmVjdERyYXdTdXJmYWNlX0JsdChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgTFBSRUNUIHJkc3QsCisJCQkgIExQRElSRUNURFJBV1NVUkZBQ0U3IHNyYywgTFBSRUNUIHJzcmMsCisJCQkgIERXT1JEIGR3RmxhZ3MsIExQRERCTFRGWCBscGJsdGZ4KQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLGlmYWNlKTsKKyAgICBSRUNUCQl4ZHN0LHhzcmM7CisgICAgRERTVVJGQUNFREVTQzIJZGRlc2Msc2Rlc2M7CisgICAgSFJFU1VMVAkJcmV0ID0gRERfT0s7CisgICAgaW50IGJwcCwgc3JjaGVpZ2h0LCBzcmN3aWR0aCwgZHN0aGVpZ2h0LCBkc3R3aWR0aCwgd2lkdGg7CisgICAgaW50IHgsIHk7CisgICAgTFBCWVRFIGRidWYsIHNidWY7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVwLCVwLCUwOGx4LCVwKVxuIiwgVGhpcyxyZHN0LHNyYyxyc3JjLGR3RmxhZ3MsbHBibHRmeCk7CisKKyAgICBERF9TVFJVQ1RfSU5JVCgmZGRlc2MpOworICAgIEREX1NUUlVDVF9JTklUKCZzZGVzYyk7CisKKyAgICBzZGVzYy5kd1NpemUgPSBzaXplb2Yoc2Rlc2MpOworICAgIGlmIChzcmMpIElEaXJlY3REcmF3U3VyZmFjZTdfTG9jayhzcmMsIE5VTEwsICZzZGVzYywgMCwgMCk7CisgICAgZGRlc2MuZHdTaXplID0gc2l6ZW9mKGRkZXNjKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2soaWZhY2UsTlVMTCwmZGRlc2MsMCwwKTsKKworICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKKwlpZiAocmRzdCkgVFJBQ0UoIlx0ZGVzdHJlY3QgOiVkeCVkLSVkeCVkXG4iLHJkc3QtPmxlZnQscmRzdC0+dG9wLHJkc3QtPnJpZ2h0LHJkc3QtPmJvdHRvbSk7CisJaWYgKHJzcmMpIFRSQUNFKCJcdHNyY3JlY3QgIDolZHglZC0lZHglZFxuIixyc3JjLT5sZWZ0LHJzcmMtPnRvcCxyc3JjLT5yaWdodCxyc3JjLT5ib3R0b20pOworCVRSQUNFKCJcdGZsYWdzOiAiKTsKKwlERFJBV19kdW1wX0REQkxUKGR3RmxhZ3MpOworCWlmIChkd0ZsYWdzICYgRERCTFRfRERGWCkgeworCSAgICBUUkFDRSgiXHRibGl0Zng6ICIpOworCSAgICBERFJBV19kdW1wX0REQkxURlgobHBibHRmeC0+ZHdEREZYKTsKKwl9CisgICAgfQorCisgICAgaWYgKHJkc3QpIHsKKwlpZiAoKHJkc3QtPnRvcCA8IDApIHx8CisJICAgIChyZHN0LT5sZWZ0IDwgMCkgfHwKKwkgICAgKHJkc3QtPmJvdHRvbSA8IDApIHx8CisJICAgIChyZHN0LT5yaWdodCA8IDApKSB7CisJICBFUlIoIiBOZWdhdGl2ZSB2YWx1ZXMgaW4gTFBSRUNUICEhIVxuIik7CisJICBnb3RvIHJlbGVhc2U7CisJfQorCW1lbWNweSgmeGRzdCxyZHN0LHNpemVvZih4ZHN0KSk7CisgICAgfSBlbHNlIHsKKwl4ZHN0LnRvcAk9IDA7CisJeGRzdC5ib3R0b20JPSBkZGVzYy5kd0hlaWdodDsKKwl4ZHN0LmxlZnQJPSAwOworCXhkc3QucmlnaHQJPSBkZGVzYy5kd1dpZHRoOworICAgIH0KKworICAgIGlmIChyc3JjKSB7CisJaWYgKChyc3JjLT50b3AgPCAwKSB8fAorCSAgICAocnNyYy0+bGVmdCA8IDApIHx8CisJICAgIChyc3JjLT5ib3R0b20gPCAwKSB8fAorCSAgICAocnNyYy0+cmlnaHQgPCAwKSkgeworCSAgRVJSKCIgTmVnYXRpdmUgdmFsdWVzIGluIExQUkVDVCAhISFcbiIpOworCSAgZ290byByZWxlYXNlOworCX0KKwltZW1jcHkoJnhzcmMscnNyYyxzaXplb2YoeHNyYykpOworICAgIH0gZWxzZSB7CisJaWYgKHNyYykgeworCSAgICB4c3JjLnRvcAk9IDA7CisJICAgIHhzcmMuYm90dG9tCT0gc2Rlc2MuZHdIZWlnaHQ7CisJICAgIHhzcmMubGVmdAk9IDA7CisJICAgIHhzcmMucmlnaHQJPSBzZGVzYy5kd1dpZHRoOworCX0gZWxzZSB7CisJICAgIG1lbXNldCgmeHNyYywwLHNpemVvZih4c3JjKSk7CisJfQorICAgIH0KKyAgICBpZiAoc3JjKSBhc3NlcnQoKHhzcmMuYm90dG9tLXhzcmMudG9wKSA8PSBzZGVzYy5kd0hlaWdodCk7CisgICAgYXNzZXJ0KCh4ZHN0LmJvdHRvbS14ZHN0LnRvcCkgPD0gZGRlc2MuZHdIZWlnaHQpOworCisgICAgYnBwID0gR0VUX0JQUChkZGVzYyk7CisgICAgc3JjaGVpZ2h0ID0geHNyYy5ib3R0b20gLSB4c3JjLnRvcDsKKyAgICBzcmN3aWR0aCA9IHhzcmMucmlnaHQgLSB4c3JjLmxlZnQ7CisgICAgZHN0aGVpZ2h0ID0geGRzdC5ib3R0b20gLSB4ZHN0LnRvcDsKKyAgICBkc3R3aWR0aCA9IHhkc3QucmlnaHQgLSB4ZHN0LmxlZnQ7CisgICAgd2lkdGggPSAoeGRzdC5yaWdodCAtIHhkc3QubGVmdCkgKiBicHA7CisKKyAgICBhc3NlcnQod2lkdGggPD0gZGRlc2MudTEubFBpdGNoKTsKKworICAgIGRidWYgPSAoQllURSopZGRlc2MubHBTdXJmYWNlKyh4ZHN0LnRvcCpkZGVzYy51MS5sUGl0Y2gpKyh4ZHN0LmxlZnQqYnBwKTsKKworICAgIGR3RmxhZ3MgJj0gfihEREJMVF9XQUlUfEREQkxUX0FTWU5DKTsvKiBGSVhNRTogY2FuJ3QgaGFuZGxlIHJpZ2h0IG5vdyAqLworCisgICAgLyogRmlyc3QsIGFsbCB0aGUgJ3NvdXJjZS1sZXNzJyBibGl0cyAqLworICAgIGlmIChkd0ZsYWdzICYgRERCTFRfQ09MT1JGSUxMKSB7CisJcmV0ID0gX0JsdF9Db2xvckZpbGwoZGJ1ZiwgZHN0d2lkdGgsIGRzdGhlaWdodCwgYnBwLAorCQkJICAgICBkZGVzYy51MS5sUGl0Y2gsIGxwYmx0ZngtPnU1LmR3RmlsbENvbG9yKTsKKwlkd0ZsYWdzICY9IH5EREJMVF9DT0xPUkZJTEw7CisgICAgfQorCisgICAgaWYgKGR3RmxhZ3MgJiBEREJMVF9ERVBUSEZJTEwpCisJRklYTUUoIkREQkxUX0RFUFRIRklMTCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCFcbiIpOworICAgIGlmIChkd0ZsYWdzICYgRERCTFRfUk9QKSB7CisJLyogQ2F0Y2ggc29tZSBkZWdlbmVyYXRlIGNhc2VzIGhlcmUgKi8KKwlzd2l0Y2gobHBibHRmeC0+ZHdST1ApIHsKKwljYXNlIEJMQUNLTkVTUzoKKwkgICAgcmV0ID0gX0JsdF9Db2xvckZpbGwoZGJ1Zixkc3R3aWR0aCxkc3RoZWlnaHQsYnBwLGRkZXNjLnUxLmxQaXRjaCwwKTsKKwkgICAgYnJlYWs7CisJY2FzZSAweEFBMDAyOTogLyogTm8tb3AgKi8KKwkgICAgYnJlYWs7CisJY2FzZSBXSElURU5FU1M6CisJICAgIHJldCA9IF9CbHRfQ29sb3JGaWxsKGRidWYsZHN0d2lkdGgsZHN0aGVpZ2h0LGJwcCxkZGVzYy51MS5sUGl0Y2gsfjApOworCSAgICBicmVhazsKKwljYXNlIFNSQ0NPUFk6IC8qIHdlbGwsIHdlIGRvIHRoYXQgYmVsb3cgPyAqLworCSAgICBicmVhazsKKwlkZWZhdWx0OiAKKwkgICAgRklYTUUoIlVuc3VwcG9ydGVkIHJhc3RlciBvcDogJTA4bHggIFBhdHRlcm46ICVwXG4iLCBscGJsdGZ4LT5kd1JPUCwgbHBibHRmeC0+dTUubHBERFNQYXR0ZXJuKTsKKwkgICAgZ290byBlcnJvcjsKKwl9CisJZHdGbGFncyAmPSB+RERCTFRfUk9QOworICAgIH0KKyAgICBpZiAoZHdGbGFncyAmIEREQkxUX0REUk9QUykgeworCUZJWE1FKCJcdERkcmF3IFJhc3RlciBPcHM6ICUwOGx4ICBQYXR0ZXJuOiAlcFxuIiwgbHBibHRmeC0+ZHdERFJPUCwgbHBibHRmeC0+dTUubHBERFNQYXR0ZXJuKTsKKyAgICB9CisgICAgLyogTm93IHRoZSAnd2l0aCBzb3VyY2UnIGJsaXRzICovCisgICAgaWYgKHNyYykgeworCUxQQllURSBzYmFzZTsKKwlpbnQgc3gsIHhpbmMsIHN5LCB5aW5jOworCisJaWYgKCFkc3R3aWR0aCB8fCAhZHN0aGVpZ2h0KSAvKiBobW0uLi4gc3R1cGlkIHByb2dyYW0gPyAqLworCSAgICBnb3RvIHJlbGVhc2U7CisJc2Jhc2UgPSAoQllURSopc2Rlc2MubHBTdXJmYWNlKyh4c3JjLnRvcCpzZGVzYy51MS5sUGl0Y2gpK3hzcmMubGVmdCpicHA7CisJeGluYyA9IChzcmN3aWR0aCA8PCAxNikgLyBkc3R3aWR0aDsKKwl5aW5jID0gKHNyY2hlaWdodCA8PCAxNikgLyBkc3RoZWlnaHQ7CisKKwlpZiAoIWR3RmxhZ3MpIHsKKwkgICAgLyogTm8gZWZmZWN0cywgd2UgY2FuIGNoZWF0IGhlcmUgKi8KKwkgICAgaWYgKGRzdHdpZHRoID09IHNyY3dpZHRoKSB7CisJCWlmIChkc3RoZWlnaHQgPT0gc3JjaGVpZ2h0KSB7CisJCSAgICAvKiBObyBzdHJldGNoaW5nIGluIGVpdGhlciBkaXJlY3Rpb24uIFRoaXMgbmVlZHMgdG8gYmUgYXMKKwkJICAgICAqIGZhc3QgYXMgcG9zc2libGUgKi8KKwkJICAgIHNidWYgPSBzYmFzZTsKKwkJICAgIGZvciAoeSA9IDA7IHkgPCBkc3RoZWlnaHQ7IHkrKykgeworCQkJbWVtY3B5KGRidWYsIHNidWYsIHdpZHRoKTsKKwkJCXNidWYgKz0gc2Rlc2MudTEubFBpdGNoOworCQkJZGJ1ZiArPSBkZGVzYy51MS5sUGl0Y2g7CisJCSAgICB9CisJCX0gZWxzZSB7CisJCSAgICAvKiBTdHJldGNoaW5nIGluIFkgZGlyZWN0aW9uIG9ubHkgKi8KKwkJICAgIGZvciAoeSA9IHN5ID0gMDsgeSA8IGRzdGhlaWdodDsgeSsrLCBzeSArPSB5aW5jKSB7CisJCQlzYnVmID0gc2Jhc2UgKyAoc3kgPj4gMTYpICogc2Rlc2MudTEubFBpdGNoOworCQkJbWVtY3B5KGRidWYsIHNidWYsIHdpZHRoKTsKKwkJCWRidWYgKz0gZGRlc2MudTEubFBpdGNoOworCQkgICAgfQorCQl9CisJICAgIH0gZWxzZSB7CisJCS8qIFN0cmV0Y2hpbmcgaW4gWCBkaXJlY3Rpb24gKi8KKwkJaW50IGxhc3Rfc3kgPSAtMTsKKwkJZm9yICh5ID0gc3kgPSAwOyB5IDwgZHN0aGVpZ2h0OyB5KyssIHN5ICs9IHlpbmMpIHsKKwkJICAgIHNidWYgPSBzYmFzZSArIChzeSA+PiAxNikgKiBzZGVzYy51MS5sUGl0Y2g7CisKKwkJICAgIGlmICgoc3kgPj4gMTYpID09IChsYXN0X3N5ID4+IDE2KSkgeworCQkJLyogdGhpcyBzb3VyY2Vyb3cgaXMgdGhlIHNhbWUgYXMgbGFzdCBzb3VyY2Vyb3cgLQorCQkJICogY29weSBhbHJlYWR5IHN0cmV0Y2hlZCByb3cKKwkJCSAqLworCQkJbWVtY3B5KGRidWYsIGRidWYgLSBkZGVzYy51MS5sUGl0Y2gsIHdpZHRoKTsKKwkJICAgIH0gZWxzZSB7CisjZGVmaW5lIFNUUkVUQ0hfUk9XKHR5cGUpIHsgXAorCQkgICAgdHlwZSAqcyA9ICh0eXBlICopIHNidWYsICpkID0gKHR5cGUgKikgZGJ1ZjsgXAorCQkgICAgZm9yICh4ID0gc3ggPSAwOyB4IDwgZHN0d2lkdGg7IHgrKywgc3ggKz0geGluYykgXAorCQkgICAgZFt4XSA9IHNbc3ggPj4gMTZdOyBcCisJCSAgICBicmVhazsgfQorCisJCSAgICBzd2l0Y2goYnBwKSB7CisJCSAgICBjYXNlIDE6IFNUUkVUQ0hfUk9XKEJZVEUpCisJCSAgICBjYXNlIDI6IFNUUkVUQ0hfUk9XKFdPUkQpCisJCSAgICBjYXNlIDQ6IFNUUkVUQ0hfUk9XKERXT1JEKQorCQkgICAgY2FzZSAzOiB7CisJCQlMUEJZVEUgcyxkID0gZGJ1ZjsKKwkJCWZvciAoeCA9IHN4ID0gMDsgeCA8IGRzdHdpZHRoOyB4KyssIHN4Kz0geGluYykgeworCQkJICAgIERXT1JEIHBpeGVsOworCisJCQkgICAgcyA9IHNidWYrMyooc3g+PjE2KTsKKwkJCSAgICBwaXhlbCA9IChzWzBdPDwxNil8KHNbMV08PDgpfHNbMl07CisJCQkgICAgZFswXSA9IChwaXhlbD4+MTYpJjB4ZmY7CisJCQkgICAgZFsxXSA9IChwaXhlbD4+IDgpJjB4ZmY7CisJCQkgICAgZFsyXSA9IChwaXhlbCAgICApJjB4ZmY7CisJCQkgICAgZCs9MzsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAgZGVmYXVsdDoKKwkJCUZJWE1FKCJTdHJldGNoZWQgYmxpdCBub3QgaW1wbGVtZW50ZWQgZm9yIGJwcCAlZCFcbiIsIGJwcCo4KTsKKwkJCXJldCA9IERERVJSX1VOU1VQUE9SVEVEOworCQkJZ290byBlcnJvcjsKKwkJICAgIH0KKyN1bmRlZiBTVFJFVENIX1JPVworCQkgICAgfQorCQkgICAgZGJ1ZiArPSBkZGVzYy51MS5sUGl0Y2g7CisJCSAgICBsYXN0X3N5ID0gc3k7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoZHdGbGFncyAmIChEREJMVF9LRVlTUkMgfCBEREJMVF9LRVlERVNUKSkgeworCSAgICBEV09SRCBrZXlsb3csIGtleWhpZ2g7CisKKwkgICAgaWYgKGR3RmxhZ3MgJiBEREJMVF9LRVlTUkMpIHsKKwkJa2V5bG93ICA9IHNkZXNjLmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZTsKKwkJa2V5aGlnaCA9IHNkZXNjLmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWU7CisJICAgIH0gZWxzZSB7CisJCS8qIEknbSBub3Qgc3VyZSBpZiB0aGlzIGlzIGNvcnJlY3QgKi8KKwkJRklYTUUoIkREQkxUX0tFWURFU1Qgbm90IGZ1bGx5IHN1cHBvcnRlZCB5ZXQuXG4iKTsKKwkJa2V5bG93ICA9IGRkZXNjLmRkY2tDS0Rlc3RCbHQuZHdDb2xvclNwYWNlTG93VmFsdWU7CisJCWtleWhpZ2ggPSBkZGVzYy5kZGNrQ0tEZXN0Qmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZTsKKwkgICAgfQorCisKKwkgICAgZm9yICh5ID0gc3kgPSAwOyB5IDwgZHN0aGVpZ2h0OyB5KyssIHN5ICs9IHlpbmMpIHsKKwkJc2J1ZiA9IHNiYXNlICsgKHN5ID4+IDE2KSAqIHNkZXNjLnUxLmxQaXRjaDsKKworI2RlZmluZSBDT1BZUk9XX0NPTE9SS0VZKHR5cGUpIHsgXAorCQl0eXBlICpzID0gKHR5cGUgKikgc2J1ZiwgKmQgPSAodHlwZSAqKSBkYnVmLCB0bXA7IFwKKwkJZm9yICh4ID0gc3ggPSAwOyB4IDwgZHN0d2lkdGg7IHgrKywgc3ggKz0geGluYykgeyBcCisJCSAgICB0bXAgPSBzW3N4ID4+IDE2XTsgXAorCQkgICAgaWYgKHRtcCA8IGtleWxvdyB8fCB0bXAgPiBrZXloaWdoKSBkW3hdID0gdG1wOyBcCisJCX0gXAorCQlicmVhazsgfQorCisJCXN3aXRjaCAoYnBwKSB7CisJCWNhc2UgMTogQ09QWVJPV19DT0xPUktFWShCWVRFKQorCQljYXNlIDI6IENPUFlST1dfQ09MT1JLRVkoV09SRCkKKwkJY2FzZSA0OiBDT1BZUk9XX0NPTE9SS0VZKERXT1JEKQorCQlkZWZhdWx0OgorCQkgICAgRklYTUUoIiVzIGNvbG9yLWtleWVkIGJsaXQgbm90IGltcGxlbWVudGVkIGZvciBicHAgJWQhXG4iLAorCQkgICAgKGR3RmxhZ3MgJiBEREJMVF9LRVlTUkMpID8gIlNvdXJjZSIgOiAiRGVzdGluYXRpb24iLCBicHAqOCk7CisJCSAgICByZXQgPSBEREVSUl9VTlNVUFBPUlRFRDsKKwkJICAgIGdvdG8gZXJyb3I7CisJCX0KKwkJZGJ1ZiArPSBkZGVzYy51MS5sUGl0Y2g7CisJICAgIH0KKyN1bmRlZiBDT1BZUk9XX0NPTE9SS0VZCisJICAgIGR3RmxhZ3MgJj0gfihEREJMVF9LRVlTUkMgfCBEREJMVF9LRVlERVNUKTsKKwl9CisgICAgfQorCitlcnJvcjoKKyAgICBpZiAoZHdGbGFncyAmJiBGSVhNRV9PTihkZHJhdykpIHsKKwlGSVhNRSgiXHRVbnN1cHBvcnRlZCBmbGFnczogIik7CisJRERSQVdfZHVtcF9EREJMVChkd0ZsYWdzKTsKKyAgICB9CisKK3JlbGVhc2U6CisgICAgSURpcmVjdERyYXdTdXJmYWNlN19VbmxvY2soaWZhY2UsTlVMTCk7CisgICAgaWYgKHNyYykgSURpcmVjdERyYXdTdXJmYWNlN19VbmxvY2soc3JjLE5VTEwpOworICAgIHJldHVybiBERF9PSzsKK30KKworLyogQmx0QmF0Y2g6IGdlbmVyaWMsIHVuaW1wbGVtZW50ZWQgKi8KKworSFJFU1VMVCBXSU5BUEkKK0RJQl9EaXJlY3REcmF3U3VyZmFjZV9CbHRGYXN0KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBEV09SRCBkc3R4LAorCQkJICAgICAgRFdPUkQgZHN0eSwgTFBESVJFQ1REUkFXU1VSRkFDRTcgc3JjLAorCQkJICAgICAgTFBSRUNUIHJzcmMsIERXT1JEIHRyYW5zKQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLGlmYWNlKTsKKyAgICBpbnQJCQlicHAsIHcsIGgsIHgsIHk7CisgICAgRERTVVJGQUNFREVTQzIJZGRlc2Msc2Rlc2M7CisgICAgSFJFU1VMVAkJcmV0ID0gRERfT0s7CisgICAgTFBCWVRFCQlzYnVmLCBkYnVmOworICAgIFJFQ1QJCXJzcmMyOworCisKKyAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7CisJRklYTUUoIiglcCktPiglbGQsJWxkLCVwLCVwLCUwOGx4KVxuIiwKKwkJVGhpcyxkc3R4LGRzdHksc3JjLHJzcmMsdHJhbnMKKwkpOworCUZJWE1FKCIJdHJhbnM6Iik7CisJaWYgKEZJWE1FX09OKGRkcmF3KSkKKwkgIEREUkFXX2R1bXBfRERCTFRGQVNUKHRyYW5zKTsKKwlpZiAocnNyYykKKwkgIEZJWE1FKCJcdHNyY3JlY3Q6ICVkeCVkLSVkeCVkXG4iLHJzcmMtPmxlZnQscnNyYy0+dG9wLHJzcmMtPnJpZ2h0LHJzcmMtPmJvdHRvbSk7CisJZWxzZQorCSAgRklYTUUoIiBzcmNyZWN0OiBOVUxMXG4iKTsKKyAgICB9CisgICAgCisgICAgLyogV2UgbmVlZCB0byBsb2NrIHRoZSBzdXJmYWNlcywgb3Igd2Ugd29uJ3QgZ2V0IHJlZnJlc2hlcyB3aGVuIGRvbmUuICovCisgICAgc2Rlc2MuZHdTaXplID0gc2l6ZW9mKHNkZXNjKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2soc3JjLCBOVUxMLCZzZGVzYyxERExPQ0tfUkVBRE9OTFksIDApOworICAgIGRkZXNjLmR3U2l6ZSA9IHNpemVvZihkZGVzYyk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlN19Mb2NrKGlmYWNlLE5VTEwsJmRkZXNjLERETE9DS19XUklURU9OTFksMCk7CisKKyAgIGlmICghcnNyYykgeworCSAgIFdBUk4oInJzcmMgaXMgTlVMTCFcbiIpOworCSAgIHJzcmMgPSAmcnNyYzI7CisJICAgcnNyYy0+bGVmdCA9IHJzcmMtPnRvcCA9IDA7CisJICAgcnNyYy0+cmlnaHQgPSBzZGVzYy5kd1dpZHRoOworCSAgIHJzcmMtPmJvdHRvbSA9IHNkZXNjLmR3SGVpZ2h0OworICAgfQorCisgICAgYnBwID0gR0VUX0JQUChUaGlzLT5zdXJmYWNlX2Rlc2MpOworICAgIHNidWYgPSAoQllURSAqKXNkZXNjLmxwU3VyZmFjZSsocnNyYy0+dG9wKnNkZXNjLnUxLmxQaXRjaCkrcnNyYy0+bGVmdCpicHA7CisgICAgZGJ1ZiA9IChCWVRFICopZGRlc2MubHBTdXJmYWNlKyhkc3R5KmRkZXNjLnUxLmxQaXRjaCkrZHN0eCogYnBwOworCisKKyAgICBoPXJzcmMtPmJvdHRvbS1yc3JjLT50b3A7CisgICAgaWYgKGg+ZGRlc2MuZHdIZWlnaHQtZHN0eSkgaD1kZGVzYy5kd0hlaWdodC1kc3R5OworICAgIGlmIChoPnNkZXNjLmR3SGVpZ2h0LXJzcmMtPnRvcCkgaD1zZGVzYy5kd0hlaWdodC1yc3JjLT50b3A7CisgICAgaWYgKGg8MCkgaD0wOworCisgICAgdz1yc3JjLT5yaWdodC1yc3JjLT5sZWZ0OworICAgIGlmICh3PmRkZXNjLmR3V2lkdGgtZHN0eCkgdz1kZGVzYy5kd1dpZHRoLWRzdHg7CisgICAgaWYgKHc+c2Rlc2MuZHdXaWR0aC1yc3JjLT5sZWZ0KSB3PXNkZXNjLmR3V2lkdGgtcnNyYy0+bGVmdDsKKyAgICBpZiAodzwwKSB3PTA7CisKKyAgICBpZiAodHJhbnMgJiAoRERCTFRGQVNUX1NSQ0NPTE9SS0VZIHwgRERCTFRGQVNUX0RFU1RDT0xPUktFWSkpIHsKKwlEV09SRCBrZXlsb3csIGtleWhpZ2g7CisJaWYgKHRyYW5zICYgRERCTFRGQVNUX1NSQ0NPTE9SS0VZKSB7CisJICAgIGtleWxvdyAgPSBzZGVzYy5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWU7CisJICAgIGtleWhpZ2ggPSBzZGVzYy5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlSGlnaFZhbHVlOworCX0gZWxzZSB7CisJICAgIC8qIEknbSBub3Qgc3VyZSBpZiB0aGlzIGlzIGNvcnJlY3QgKi8KKwkgICAgRklYTUUoIkREQkxURkFTVF9ERVNUQ09MT1JLRVkgbm90IGZ1bGx5IHN1cHBvcnRlZCB5ZXQuXG4iKTsKKwkgICAga2V5bG93ICA9IGRkZXNjLmRkY2tDS0Rlc3RCbHQuZHdDb2xvclNwYWNlTG93VmFsdWU7CisJICAgIGtleWhpZ2ggPSBkZGVzYy5kZGNrQ0tEZXN0Qmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZTsKKwl9CisKKyNkZWZpbmUgQ09QWUJPWF9DT0xPUktFWSh0eXBlKSB7IFwKKyAgICB0eXBlICpkID0gKHR5cGUgKilkYnVmLCAqcyA9ICh0eXBlICopc2J1ZiwgdG1wOyBcCisgICAgcyA9ICh0eXBlICopICgoQllURSAqKSBzZGVzYy5scFN1cmZhY2UgKyAocnNyYy0+dG9wICogc2Rlc2MudTEubFBpdGNoKSArIHJzcmMtPmxlZnQgKiBicHApOyBcCisgICAgZCA9ICh0eXBlICopICgoQllURSAqKSBkZGVzYy5scFN1cmZhY2UgKyAoZHN0eSAqIGRkZXNjLnUxLmxQaXRjaCkgKyBkc3R4ICogYnBwKTsgXAorICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsgXAorCWZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsgXAorCSAgICB0bXAgPSBzW3hdOyBcCisJICAgIGlmICh0bXAgPCBrZXlsb3cgfHwgdG1wID4ga2V5aGlnaCkgZFt4XSA9IHRtcDsgXAorCX0gXAorCShMUEJZVEUpcyArPSBzZGVzYy51MS5sUGl0Y2g7IFwKKwkoTFBCWVRFKWQgKz0gZGRlc2MudTEubFBpdGNoOyBcCisgICAgfSBcCisgICAgYnJlYWs7IFwKK30KKworCXN3aXRjaCAoYnBwKSB7CisJY2FzZSAxOiBDT1BZQk9YX0NPTE9SS0VZKEJZVEUpCisJY2FzZSAyOiBDT1BZQk9YX0NPTE9SS0VZKFdPUkQpCisJY2FzZSA0OiBDT1BZQk9YX0NPTE9SS0VZKERXT1JEKQorCWRlZmF1bHQ6CisJICAgIEZJWE1FKCJTb3VyY2UgY29sb3Iga2V5IGJsaXR0aW5nIG5vdCBzdXBwb3J0ZWQgZm9yIGJwcCAlZFxuIixicHAqOCk7CisJICAgIHJldCA9IERERVJSX1VOU1VQUE9SVEVEOworCSAgICBnb3RvIGVycm9yOworCX0KKyN1bmRlZiBDT1BZQk9YX0NPTE9SS0VZCisgICAgfSBlbHNlIHsKKwlpbnQgd2lkdGggPSB3ICogYnBwOworCisJZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworCSAgICBtZW1jcHkoZGJ1Ziwgc2J1Ziwgd2lkdGgpOworCSAgICBzYnVmICs9IHNkZXNjLnUxLmxQaXRjaDsKKwkgICAgZGJ1ZiArPSBkZGVzYy51MS5sUGl0Y2g7CisJfQorICAgIH0KK2Vycm9yOgorICAgIElEaXJlY3REcmF3U3VyZmFjZTdfVW5sb2NrKGlmYWNlLCBOVUxMKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1VubG9jayhzcmMsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIENoYW5nZVVuaXF1ZW5lc3NWYWx1ZTogZ2VuZXJpYyAqLworLyogRGVsZXRlQXR0YWNoZWRTdXJmYWNlOiBnZW5lcmljICovCisvKiBFbnVtQXR0YWNoZWRTdXJmYWNlczogZ2VuZXJpYyAqLworLyogRW51bU92ZXJsYXlaT3JkZXJzOiBnZW5lcmljLCB1bmltcGxlbWVudGVkICovCisKK3ZvaWQgRElCX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBmcm9udCwKKwkJCQkgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGJhY2spCit7CisgICAgRElCX0RpcmVjdERyYXdTdXJmYWNlSW1wbCogZnJvbnRfcHJpdiA9IGZyb250LT5wcml2YXRlOworICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGwqIGJhY2tfcHJpdiA9IGJhY2stPnByaXZhdGU7CisKKyAgICBUUkFDRSgiKCVwLCVwKVxuIixmcm9udCxiYWNrKTsKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YShmcm9udCwgYmFjayk7CisKKyAgICB7CisJSEJJVE1BUCB0bXA7CisJdG1wID0gZnJvbnRfcHJpdi0+ZGliLkRJQnNlY3Rpb247CisJZnJvbnRfcHJpdi0+ZGliLkRJQnNlY3Rpb24gPSBiYWNrX3ByaXYtPmRpYi5ESUJzZWN0aW9uOworCWJhY2tfcHJpdi0+ZGliLkRJQnNlY3Rpb24gPSB0bXA7CisgICAgfQorCisgICAgeworCXZvaWQqIHRtcDsKKwl0bXAgPSBmcm9udF9wcml2LT5kaWIuYml0bWFwX2RhdGE7CisJZnJvbnRfcHJpdi0+ZGliLmJpdG1hcF9kYXRhID0gYmFja19wcml2LT5kaWIuYml0bWFwX2RhdGE7CisJYmFja19wcml2LT5kaWIuYml0bWFwX2RhdGEgPSB0bXA7CisKKwl0bXAgPSBmcm9udC0+c3VyZmFjZV9kZXNjLmxwU3VyZmFjZTsKKwlmcm9udC0+c3VyZmFjZV9kZXNjLmxwU3VyZmFjZSA9IGJhY2stPnN1cmZhY2VfZGVzYy5scFN1cmZhY2U7CisJYmFjay0+c3VyZmFjZV9kZXNjLmxwU3VyZmFjZSA9IHRtcDsKKyAgICB9CisKKyAgICAvKiBjbGllbnRfbWVtb3J5IHNob3VsZCBub3QgYmUgZGlmZmVyZW50LCBidXQganVzdCBpbiBjYXNlICovCisgICAgeworCUJPT0wgdG1wOworCXRtcCA9IGZyb250X3ByaXYtPmRpYi5jbGllbnRfbWVtb3J5OworCWZyb250X3ByaXYtPmRpYi5jbGllbnRfbWVtb3J5ID0gYmFja19wcml2LT5kaWIuY2xpZW50X21lbW9yeTsKKwliYWNrX3ByaXYtPmRpYi5jbGllbnRfbWVtb3J5ID0gdG1wOworICAgIH0KK30KKworLyogRmxpcDogZ2VuZXJpYyAqLworLyogRnJlZVByaXZhdGVEYXRhOiBnZW5lcmljICovCisvKiBHZXRBdHRhY2hlZFN1cmZhY2U6IGdlbmVyaWMgKi8KKy8qIEdldEJsdFN0YXR1czogZ2VuZXJpYyAqLworLyogR2V0Q2FwczogZ2VuZXJpYyAoUmV0dXJucyB0aGUgY2FwcyBmcm9tIFRoaXMtPnN1cmZhY2VfZGVzYy4pICovCisvKiBHZXRDbGlwcGVyOiBnZW5lcmljICovCisvKiBHZXRDb2xvcktleTogZ2VuZXJpYyAqLworCitIUkVTVUxUIERJQl9EaXJlY3REcmF3U3VyZmFjZV9hbGxvY19kYyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBIREMqIHBoREMpCit7CisgICAgRElCX1BSSVZfVkFSKHByaXYsIFRoaXMpOworICAgIEhEQyBoREM7CisKKyAgICBUUkFDRSgiR3JhYmJpbmcgYSBEQyBmb3Igc3VyZmFjZTogJXBcbiIsIFRoaXMpOworCisgICAgaERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKDApOworICAgIHByaXYtPmRpYi5ob2xkYml0bWFwID0gU2VsZWN0T2JqZWN0KGhEQywgcHJpdi0+ZGliLkRJQnNlY3Rpb24pOworICAgIGlmIChUaGlzLT5wYWxldHRlKQorCVNlbGVjdFBhbGV0dGUoaERDLCBUaGlzLT5wYWxldHRlLT5ocGFsLCBGQUxTRSk7CisKKyAgICAqcGhEQyA9IGhEQzsKKworICAgIHJldHVybiBTX09LOworfQorCitIUkVTVUxUIERJQl9EaXJlY3REcmF3U3VyZmFjZV9mcmVlX2RjKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIEhEQyBoREMpCit7CisgICAgRElCX1BSSVZfVkFSKHByaXYsIFRoaXMpOworCisgICAgVFJBQ0UoIlJlbGVhc2luZyBEQyBmb3Igc3VyZmFjZTogJXBcbiIsIFRoaXMpOworCisgICAgU2VsZWN0T2JqZWN0KGhEQywgcHJpdi0+ZGliLmhvbGRiaXRtYXApOworICAgIERlbGV0ZURDKGhEQyk7CisKKyAgICByZXR1cm4gU19PSzsKK30KKworSFJFU1VMVCBESUJfRGlyZWN0RHJhd1N1cmZhY2VfZ2V0X2RjKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIEhEQyogcGhEQykKK3sKKyAgICByZXR1cm4gRElCX0RpcmVjdERyYXdTdXJmYWNlX2FsbG9jX2RjKFRoaXMsIHBoREMpOworfQorCitIUkVTVUxUIERJQl9EaXJlY3REcmF3U3VyZmFjZV9yZWxlYXNlX2RjKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIEhEQyBoREMpCit7CisgICAgcmV0dXJuIERJQl9EaXJlY3REcmF3U3VyZmFjZV9mcmVlX2RjKFRoaXMsIGhEQyk7Cit9CisKKy8qIEdldERESW50ZXJmYWNlOiBnZW5lcmljICovCisvKiBHZXRGbGlwU3RhdHVzOiBnZW5lcmljICovCisvKiBHZXRMT0Q6IGdlbmVyaWMgKi8KKy8qIEdldE92ZXJsYXlQb3NpdGlvbjogZ2VuZXJpYyAqLworLyogR2V0UGFsZXR0ZTogZ2VuZXJpYyAqLworLyogR2V0UGl4ZWxGb3JtYXQ6IGdlbmVyaWMgKi8KKy8qIEdldFByaW9yaXR5OiBnZW5lcmljICovCisvKiBHZXRQcml2YXRlRGF0YTogZ2VuZXJpYyAqLworLyogR2V0U3VyZmFjZURlc2M6IGdlbmVyaWMgKi8KKy8qIEdldFVuaXF1ZW5lc3NWYWx1ZTogZ2VuZXJpYyAqLworLyogSW5pdGlhbGl6ZTogZ2VuZXJpYyAqLworLyogSXNMb3N0OiBnZW5lcmljICovCisvKiBMb2NrOiBnZW5lcmljIHdpdGggY2FsbGJhY2s/ICovCisvKiBQYWdlTG9jazogZ2VuZXJpYyAqLworLyogUGFnZVVubG9jazogZ2VuZXJpYyAqLworCitIUkVTVUxUIFdJTkFQSQorRElCX0RpcmVjdERyYXdTdXJmYWNlX1Jlc3RvcmUoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UpCit7CisgICAgVFJBQ0UoIiglcClcbiIsaWZhY2UpOworICAgIHJldHVybiBERF9PSzsJLyogPz8/ICovCit9CisKKy8qIFNldENsaXBwZXI6IGdlbmVyaWMgKi8KKy8qIFNldENvbG9yS2V5OiBnZW5lcmljICovCisvKiBTZXRMT0Q6IGdlbmVyaWMgKi8KKy8qIFNldE92ZXJsYXlQb3NpdGlvbjogZ2VuZXJpYyAqLworCit2b2lkIERJQl9EaXJlY3REcmF3U3VyZmFjZV9zZXRfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCSAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWwpIAoreworICAgIGlmICghcGFsKSByZXR1cm47CisgICAgaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpCisJVGhpcy0+dXBkYXRlX3BhbGV0dGUoVGhpcywgcGFsLAorCQkJICAgICAwLCBwYWwtPnBhbE51bUVudHJpZXMsCisJCQkgICAgIHBhbC0+cGFsZW50cyk7Cit9CisKK3ZvaWQgRElCX0RpcmVjdERyYXdTdXJmYWNlX3VwZGF0ZV9wYWxldHRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCisJCQkJCSAgSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsLAorCQkJCQkgIERXT1JEIGR3U3RhcnQsIERXT1JEIGR3Q291bnQsCisJCQkJCSAgTFBQQUxFVFRFRU5UUlkgcGFsZW50KQoreworICAgIFJHQlFVQUQgY29sWzI1Nl07CisgICAgaW50IG47CisgICAgSERDIGRjOworCisgICAgVFJBQ0UoInVwZGF0aW5nIHByaW1hcnkgcGFsZXR0ZVxuIik7CisgICAgZm9yIChuPTA7IG48ZHdDb3VudDsgbisrKSB7CisgICAgICBjb2xbbl0ucmdiUmVkICAgPSBwYWxlbnRbbl0ucGVSZWQ7CisgICAgICBjb2xbbl0ucmdiR3JlZW4gPSBwYWxlbnRbbl0ucGVHcmVlbjsKKyAgICAgIGNvbFtuXS5yZ2JCbHVlICA9IHBhbGVudFtuXS5wZUJsdWU7CisgICAgICBjb2xbbl0ucmdiUmVzZXJ2ZWQgPSAwOworICAgIH0KKyAgICBUaGlzLT5nZXRfZGMoVGhpcywgJmRjKTsKKyAgICBTZXRESUJDb2xvclRhYmxlKGRjLCBkd1N0YXJ0LCBkd0NvdW50LCBjb2wpOworICAgIFRoaXMtPnJlbGVhc2VfZGMoVGhpcywgZGMpOworICAgIC8qIEZJWE1FOiBwcm9wYWdhdGUgY2hhbmdlIHRvIGJhY2tidWZmZXJzICovCit9CisKKworLyogU2V0UGFsZXR0ZTogZ2VuZXJpYyAqLworLyogU2V0UHJpb3JpdHk6IGdlbmVyaWMgKi8KKy8qIFNldFByaXZhdGVEYXRhOiBnZW5lcmljICovCisKK0hSRVNVTFQgV0lOQVBJCitESUJfRGlyZWN0RHJhd1N1cmZhY2VfU2V0U3VyZmFjZURlc2MoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICAgICBMUEREU1VSRkFDRURFU0MyIHBERFNELCBEV09SRCBkd0ZsYWdzKQoreworICAgIC8qIFhYWCAqLworICAgIEZJWE1FKCIoJXApLT4oJXAsJTA4bHgpXG4iLGlmYWNlLHBERFNELGR3RmxhZ3MpOworICAgIGFib3J0KCk7CisgICAgcmV0dXJuIEVfRkFJTDsKK30KKworLyogVW5sb2NrOiA/Pz8sIG5lZWQgY2FsbGJhY2sgKi8KKy8qIFVwZGF0ZU92ZXJsYXk6IGdlbmVyaWMgKi8KKy8qIFVwZGF0ZU92ZXJsYXlEaXNwbGF5OiBnZW5lcmljICovCisvKiBVcGRhdGVPdmVybGF5Wk9yZGVyOiBnZW5lcmljICovCisKK3N0YXRpYyBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhd1N1cmZhY2U3KSBESUJfSURpcmVjdERyYXdTdXJmYWNlN19WVGFibGUgPQoreworICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9BZGRSZWYsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkQXR0YWNoZWRTdXJmYWNlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkT3ZlcmxheURpcnR5UmVjdCwKKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VfQmx0LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQmx0QmF0Y2gsCisgICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX0JsdEZhc3QsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9EZWxldGVBdHRhY2hlZFN1cmZhY2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9FbnVtQXR0YWNoZWRTdXJmYWNlcywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0VudW1PdmVybGF5Wk9yZGVycywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0ZsaXAsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRBdHRhY2hlZFN1cmZhY2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRCbHRTdGF0dXMsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRDYXBzLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2xpcHBlciwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENvbG9yS2V5LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0REMsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRGbGlwU3RhdHVzLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0T3ZlcmxheVBvc2l0aW9uLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UGFsZXR0ZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFBpeGVsRm9ybWF0LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2MsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Jbml0aWFsaXplLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfSXNMb3N0LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfTG9jaywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2VEQywKKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VfUmVzdG9yZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldENsaXBwZXIsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRDb2xvcktleSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldE92ZXJsYXlQb3NpdGlvbiwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFBhbGV0dGUsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VbmxvY2ssCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheURpc3BsYXksCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5Wk9yZGVyLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0RERJbnRlcmZhY2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9QYWdlTG9jaywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1BhZ2VVbmxvY2ssCisgICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX1NldFN1cmZhY2VEZXNjLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UHJpdmF0ZURhdGEsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQcml2YXRlRGF0YSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0ZyZWVQcml2YXRlRGF0YSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFVuaXF1ZW5lc3NWYWx1ZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0NoYW5nZVVuaXF1ZW5lc3NWYWx1ZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFByaW9yaXR5LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UHJpb3JpdHksCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRMT0QsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRMT0QKK307CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RzdXJmYWNlL2RpYi5oIGIvZGxscy9kZHJhdy9kc3VyZmFjZS9kaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmJhZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvZGxscy9kZHJhdy9kc3VyZmFjZS9kaWIuaApAQCAtMCwwICsxLDY3IEBACisvKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLiAqLworCisjaWZuZGVmIEREUkFXX0RTVVJGQUNFX0RJQl9IX0lOQ0xVREVECisjZGVmaW5lIEREUkFXX0RTVVJGQUNFX0RJQl9IX0lOQ0xVREVECisKKyNkZWZpbmUgRElCX1BSSVYoc3VyZikgKChESUJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsKikoKHN1cmYpLT5wcml2YXRlKSkKKworI2RlZmluZSBESUJfUFJJVl9WQVIobmFtZSwgc3VyZikgXAorCURJQl9EaXJlY3REcmF3U3VyZmFjZUltcGwqIG5hbWUgPSBESUJfUFJJVihzdXJmKQorCisKK3N0cnVjdCBESUJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1BhcnQKK3sKKyAgICBIQklUTUFQIERJQnNlY3Rpb247CisgICAgdm9pZCogYml0bWFwX2RhdGE7CisgICAgSEdESU9CSiBob2xkYml0bWFwOworICAgIEJPT0wgY2xpZW50X21lbW9yeTsKKyAgICBEV09SRCBkM2RfZGF0YVs0XTsgLyogcm9vbSBmb3IgRGlyZWN0M0QgZHJpdmVyIGRhdGEgKi8KK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgc3RydWN0IERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydCBkaWI7Cit9IERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGw7CisKK0hSRVNVTFQKK0RJQl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcywKKwkJCQlJRGlyZWN0RHJhd0ltcGwgKnBERCwKKwkJCQljb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QpOworSFJFU1VMVAorRElCX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShJRGlyZWN0RHJhd0ltcGwgKnBERCwKKwkJCSAgICAgY29uc3QgRERTVVJGQUNFREVTQzIgKnBERFNELAorCQkJICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcHBTdXJmLAorCQkJICAgICBJVW5rbm93biAqcFVua091dGVyKTsKKwordm9pZCBESUJfRGlyZWN0RHJhd1N1cmZhY2VfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKK3ZvaWQgRElCX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBmcm9udCwKKwkJCQkgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGJhY2spOworCit2b2lkIERJQl9EaXJlY3REcmF3U3VyZmFjZV9zZXRfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCSAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWwpOwordm9pZCBESUJfRGlyZWN0RHJhd1N1cmZhY2VfdXBkYXRlX3BhbGV0dGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkJICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWwsCisJCQkJCSAgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKKwkJCQkJICBMUFBBTEVUVEVFTlRSWSBwYWxlbnQpOworCitIUkVTVUxUIERJQl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgSERDKiBwaERDKTsKK0hSRVNVTFQgRElCX0RpcmVjdERyYXdTdXJmYWNlX3JlbGVhc2VfZGMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyxIREMgaERDKTsKKworSFJFU1VMVCBESUJfRGlyZWN0RHJhd1N1cmZhY2VfYWxsb2NfZGMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyxIREMqIHBoREMpOworSFJFU1VMVCBESUJfRGlyZWN0RHJhd1N1cmZhY2VfZnJlZV9kYyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLCBIREMgaERDKTsKKworCitIUkVTVUxUIFdJTkFQSQorRElCX0RpcmVjdERyYXdTdXJmYWNlX0JsdChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgTFBSRUNUIHByY0Rlc3QsCisJCQkgIExQRElSRUNURFJBV1NVUkZBQ0U3IHBTcmNTdXJmLCBMUFJFQ1QgcHJjU3JjLAorCQkJICBEV09SRCBkd0ZsYWdzLCBMUEREQkxURlggcEJsdEZ4KTsKK0hSRVNVTFQgV0lOQVBJCitESUJfRGlyZWN0RHJhd1N1cmZhY2VfQmx0RmFzdChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgRFdPUkQgZHdYLAorCQkJICAgICAgRFdPUkQgZHdZLCBMUERJUkVDVERSQVdTVVJGQUNFNyBwU3JjU3VyZiwKKwkJCSAgICAgIExQUkVDVCBwcmNTcmMsIERXT1JEIGR3VHJhbnMpOworSFJFU1VMVCBXSU5BUEkKK0RJQl9EaXJlY3REcmF3U3VyZmFjZV9SZXN0b3JlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlKTsKK0hSRVNVTFQgV0lOQVBJCitESUJfRGlyZWN0RHJhd1N1cmZhY2VfU2V0U3VyZmFjZURlc2MoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICAgICBMUEREU1VSRkFDRURFU0MyIHBERFNELCBEV09SRCBkd0ZsYWdzKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kc3VyZmFjZS9kaWJ0ZXh0dXJlLmMgYi9kbGxzL2RkcmF3L2RzdXJmYWNlL2RpYnRleHR1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFlYTVmCi0tLSAvZGV2L251bGwKKysrIGIvZGxscy9kZHJhdy9kc3VyZmFjZS9kaWJ0ZXh0dXJlLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCQlESUIgU2VjdGlvbiBUZXh0dXJlIERpcmVjdERyYXdTdXJmYWNlIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDAwIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKKyNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCisjaW5jbHVkZSAiZHN1cmZhY2UvbWFpbi5oIgorI2luY2x1ZGUgImRzdXJmYWNlL2RpYi5oIgorI2luY2x1ZGUgImRzdXJmYWNlL2RpYnRleHR1cmUuaCIKKworREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKKworc3RhdGljIElDT01fVlRBQkxFKElEaXJlY3REcmF3U3VyZmFjZTcpIERJQlRleHR1cmVfSURpcmVjdERyYXdTdXJmYWNlN19WVGFibGU7CisKK0hSRVNVTFQKK0RJQlRleHR1cmVfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCisJCQkJICAgICAgIElEaXJlY3REcmF3SW1wbCogcERELAorCQkJCSAgICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QpCit7CisgICAgSFJFU1VMVCBocjsKKworICAgIGhyID0gRElCX0RpcmVjdERyYXdTdXJmYWNlX0NvbnN0cnVjdChUaGlzLCBwREQsIHBERFNEKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOworCisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3LAorCQkJRElCVGV4dHVyZV9JRGlyZWN0RHJhd1N1cmZhY2U3X1ZUYWJsZSk7CisKKyAgICBUaGlzLT5maW5hbF9yZWxlYXNlID0gRElCVGV4dHVyZV9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlOworICAgIFRoaXMtPmR1cGxpY2F0ZV9zdXJmYWNlID0gRElCVGV4dHVyZV9EaXJlY3REcmF3U3VyZmFjZV9kdXBsaWNhdGVfc3VyZmFjZTsKKworICAgIHJldHVybiBTX09LOworfQorCitIUkVTVUxUCitESUJUZXh0dXJlX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShJRGlyZWN0RHJhd0ltcGwgKnBERCwKKwkJCQkgICAgY29uc3QgRERTVVJGQUNFREVTQzIgKnBERFNELAorCQkJCSAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcHBTdXJmLAorCQkJCSAgICBJVW5rbm93biAqcFVua091dGVyKQoreworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXM7CisgICAgSFJFU1VMVCBocjsKKworICAgIGFzc2VydChwVW5rT3V0ZXIgPT0gTlVMTCk7CisgICAgYXNzZXJ0KHBERFNELT5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfVEVYVFVSRSk7CisKKyAgICBUaGlzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCisJCSAgICAgc2l6ZW9mKCpUaGlzKSArIHNpemVvZihESUJUZXh0dXJlX0RpcmVjdERyYXdTdXJmYWNlSW1wbCkpOworICAgIGlmIChUaGlzID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOworCisgICAgVGhpcy0+cHJpdmF0ZSA9IChESUJUZXh0dXJlX0RpcmVjdERyYXdTdXJmYWNlSW1wbCopKFRoaXMrMSk7CisKKyAgICBociA9IERJQlRleHR1cmVfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KFRoaXMsIHBERCwgcEREU0QpOworICAgIGlmIChGQUlMRUQoaHIpKQorCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOworICAgIGVsc2UKKwkqcHBTdXJmID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNyk7CisKKyAgICByZXR1cm4gaHI7Cit9CisKK3ZvaWQgRElCVGV4dHVyZV9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpCit7CisgICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoVGhpcyk7Cit9CisKK0hSRVNVTFQKK0RJQlRleHR1cmVfRGlyZWN0RHJhd1N1cmZhY2VfZHVwbGljYXRlX3N1cmZhY2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkJICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcER1cCkKK3sKKyAgICByZXR1cm4gRElCVGV4dHVyZV9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoVGhpcy0+ZGRyYXdfb3duZXIsCisJCQkJCSAgICAgICAmVGhpcy0+c3VyZmFjZV9kZXNjLCBwcER1cCwKKwkJCQkJICAgICAgIE5VTEwpOworfQorCitzdGF0aWMgSUNPTV9WVEFCTEUoSURpcmVjdERyYXdTdXJmYWNlNykgRElCVGV4dHVyZV9JRGlyZWN0RHJhd1N1cmZhY2U3X1ZUYWJsZSA9Cit7CisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0FkZFJlZiwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9BZGRBdHRhY2hlZFN1cmZhY2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9BZGRPdmVybGF5RGlydHlSZWN0LAorICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZV9CbHQsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9CbHRCYXRjaCwKKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VfQmx0RmFzdCwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0RlbGV0ZUF0dGFjaGVkU3VyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0VudW1BdHRhY2hlZFN1cmZhY2VzLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRW51bU92ZXJsYXlaT3JkZXJzLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRmxpcCwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldEF0dGFjaGVkU3VyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldEJsdFN0YXR1cywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENhcHMsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRDbGlwcGVyLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q29sb3JLZXksCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXREQywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldEZsaXBTdGF0dXMsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRPdmVybGF5UG9zaXRpb24sCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQYWxldHRlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UGl4ZWxGb3JtYXQsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRTdXJmYWNlRGVzYywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0luaXRpYWxpemUsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Jc0xvc3QsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Mb2NrLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZURDLAorICAgIERJQl9EaXJlY3REcmF3U3VyZmFjZV9SZXN0b3JlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0Q2xpcHBlciwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldENvbG9yS2V5LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0T3ZlcmxheVBvc2l0aW9uLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UGFsZXR0ZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VubG9jaywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VwZGF0ZU92ZXJsYXksCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5RGlzcGxheSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VwZGF0ZU92ZXJsYXlaT3JkZXIsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXREREludGVyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1BhZ2VMb2NrLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUGFnZVVubG9jaywKKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VfU2V0U3VyZmFjZURlc2MsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRQcml2YXRlRGF0YSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFByaXZhdGVEYXRhLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRnJlZVByaXZhdGVEYXRhLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0VW5pcXVlbmVzc1ZhbHVlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQ2hhbmdlVW5pcXVlbmVzc1ZhbHVlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UHJpb3JpdHksCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQcmlvcml0eSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldExPRCwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldExPRAorfTsKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZHN1cmZhY2UvZGlidGV4dHVyZS5oIGIvZGxscy9kZHJhdy9kc3VyZmFjZS9kaWJ0ZXh0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1MzljMwotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvZGRyYXcvZHN1cmZhY2UvZGlidGV4dHVyZS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIENvcHlyaWdodCAyMDAwIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuICovCisKKyNpZm5kZWYgRERSQVdfRFNVUkZBQ0VfRElCVEVYVFVSRV9IX0lOQ0xVREVECisjZGVmaW5lIEREUkFXX0RTVVJGQUNFX0RJQlRFWFRVUkVfSF9JTkNMVURFRAorCisjZGVmaW5lIERJQlRFWFRVUkVfUFJJVihzdXJmKSBcCisJKChESUJUZXh0dXJlX0RpcmVjdERyYXdTdXJmYWNlSW1wbCopKHN1cmYtPnByaXZhdGUpKQorCisjZGVmaW5lIERJQlRFWFRVUkVfUFJJVl9WQVIobmFtZSxzdXJmKSBcCisJRElCVGV4dHVyZV9EaXJlY3REcmF3U3VyZmFjZUltcGwqIG5hbWUgPSBESUJURVhUVVJFX1BSSVYoc3VyZikKKworLyogV2UgYWRkIGEgc3BvdCBmb3IgM0QgZHJpdmVycyB0byBzdG9yZSBzb21lIHByaXZhdGUgZGF0YS4gQSBjbGVhbmVyCisgKiBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgU2V0UHJpdmF0ZURhdGEsIGJ1dCBpdCdzIG11Y2ggdG9vIHNsb3cuICovCit1bmlvbiBESUJUZXh0dXJlX2RhdGEKK3sKKyAgICBpbnQgaTsKKyAgICB2b2lkKiBwOworfTsKKworc3RydWN0IERJQlRleHR1cmVfRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1BhcnQKK3sKKyAgICB1bmlvbiBESUJUZXh0dXJlX2RhdGEgZGF0YTsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgc3RydWN0IERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydCBkaWI7CisgICAgc3RydWN0IERJQlRleHR1cmVfRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1BhcnQgZGlidGV4dHVyZTsKK30gRElCVGV4dHVyZV9EaXJlY3REcmF3U3VyZmFjZUltcGw7CisKK0hSRVNVTFQKK0RJQlRleHR1cmVfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCisJCQkJICAgICAgIElEaXJlY3REcmF3SW1wbCogcERELAorCQkJCSAgICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QpOworCitIUkVTVUxUCitESUJUZXh0dXJlX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShJRGlyZWN0RHJhd0ltcGwgKnBERCwKKwkJCQkgICAgY29uc3QgRERTVVJGQUNFREVTQzIgKnBERFNELAorCQkJCSAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcHBTdXJmLAorCQkJCSAgICBJVW5rbm93biAqcFVua091dGVyKTsKKwordm9pZCBESUJUZXh0dXJlX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyk7CisKK0hSRVNVTFQKK0RJQlRleHR1cmVfRGlyZWN0RHJhd1N1cmZhY2VfZHVwbGljYXRlX3N1cmZhY2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkJICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcER1cCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kc3VyZmFjZS9mYWtlemJ1ZmZlci5jIGIvZGxscy9kZHJhdy9kc3VyZmFjZS9mYWtlemJ1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMmViZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RzdXJmYWNlL2Zha2V6YnVmZmVyLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCQlEaXJlY3REcmF3L0RpcmVjdDNEIFotQnVmZmVyIHN0YW5kIGluCisgKgorICogQ29weXJpZ2h0IDIwMDAgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KKyAqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgRGlyZWN0RHJhd1N1cmZhY2UgaW1wbGVtZW50YXRpb24gdGhhdCByZXByZXNlbnRzCisgKiBhIFotQnVmZmVyIHN1cmZhY2UuIEhvd2V2ZXIgaXQgZG9lcyBub3Qgc3RvcmUgYW4gaW1hZ2UgYW5kIGRvZXMgbm90CisgKiBzdXBwb3J0IExvY2svVW5sb2NrIG9yIEdldERDLiBJdCBpcyBtZXJlbHkgYSBwbGFjZWhvbGRlciByZXF1aXJlZCBieSB0aGUKKyAqIERpcmVjdDNEIGFyY2hpdGVjdHVyZS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPGRkcmF3Lmg+CisjaW5jbHVkZSA8ZDNkLmg+CisKKyNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCisKKyNpbmNsdWRlICJkZGNvbWltcGwuaCIKKyNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCisjaW5jbHVkZSAiZHN1cmZhY2UvbWFpbi5oIgorI2luY2x1ZGUgImRzdXJmYWNlL2Zha2V6YnVmZmVyLmgiCisKK0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7CisKK3N0YXRpYyBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhd1N1cmZhY2U3KSBGYWtlWkJ1ZmZlcl9JRGlyZWN0RHJhd1N1cmZhY2U3X1ZUYWJsZTsKKworSFJFU1VMVCBGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcywKKwkJCQkJCUlEaXJlY3REcmF3SW1wbCAqcERELAorCQkJCQkJY29uc3QgRERTVVJGQUNFREVTQzIgKnBERFNEKQoreworICAgIEhSRVNVTFQgaHI7CisKKyAgICBhc3NlcnQocEREU0QtPmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19aQlVGRkVSKTsKKworICAgIGhyID0gTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoVGhpcywgcERELCBwRERTRCk7CisgICAgaWYgKEZBSUxFRChocikpIHJldHVybiBocjsKKworICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNywKKwkJCUZha2VaQnVmZmVyX0lEaXJlY3REcmF3U3VyZmFjZTdfVlRhYmxlKTsKKworICAgIFRoaXMtPmZpbmFsX3JlbGVhc2UgPSBGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlOworICAgIFRoaXMtPmR1cGxpY2F0ZV9zdXJmYWNlID0gRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VfZHVwbGljYXRlX3N1cmZhY2U7CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKKy8qIE5vdCBhbiBBUEkgKi8KK0hSRVNVTFQgRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VfQ3JlYXRlKElEaXJlY3REcmF3SW1wbCogcERELAorCQkJCQkgICAgIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCwKKwkJCQkJICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBTdXJmLAorCQkJCQkgICAgIElVbmtub3duKiBwVW5rT3V0ZXIpCit7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpczsKKyAgICBIUkVTVUxUIGhyOworICAgIGFzc2VydChwVW5rT3V0ZXIgPT0gTlVMTCk7CisKKyAgICBUaGlzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCisJCSAgICAgc2l6ZW9mKCpUaGlzKQorCQkgICAgICsgc2l6ZW9mKEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlSW1wbCkpOworICAgIGlmIChUaGlzID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOworCisgICAgVGhpcy0+cHJpdmF0ZSA9IChGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZUltcGwqKShUaGlzKzEpOworCisgICAgaHIgPSBGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoVGhpcywgcERELCBwRERTRCk7CisgICAgaWYgKEZBSUxFRChocikpCisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7CisgICAgZWxzZQorCSpwcFN1cmYgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KTsKKworICAgIHJldHVybiBocjsKK30KKwordm9pZAorRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VfZmluYWxfcmVsZWFzZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQoreworICAgIHJldHVybiBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoVGhpcyk7Cit9CisKK0hSRVNVTFQKK0Zha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX2R1cGxpY2F0ZV9zdXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCisJCQkJCQlMUERJUkVDVERSQVdTVVJGQUNFNyogcHBEdXApCit7CisgICAgcmV0dXJuIEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShUaGlzLT5kZHJhd19vd25lciwKKwkJCQkJCSZUaGlzLT5zdXJmYWNlX2Rlc2MsIHBwRHVwLAorCQkJCQkJTlVMTCk7Cit9CisKKy8qIHB1dCB5b3VyIGJyZWFrcG9pbnQvYWJvcnQgY2FsbCBoZXJlICovCitzdGF0aWMgSFJFU1VMVCBjYW50X2RvX3RoYXQoY29uc3QgY2hhciAqcykKK3sKKyAgICBGSVhNRSgiYXR0ZW1wdCB0byAlcyBmYWtlIHotYnVmZmVyXG4iLCBzKTsKKyAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9CbHQoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIExQUkVDVCByZHN0LAorCQkJCSAgTFBESVJFQ1REUkFXU1VSRkFDRTcgc3JjLCBMUFJFQ1QgcnNyYywKKwkJCQkgIERXT1JEIGR3RmxhZ3MsIExQRERCTFRGWCBscGJsdGZ4KQoreworICAgIHJldHVybiBjYW50X2RvX3RoYXQoImJsdCB0byBhIik7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9CbHRGYXN0KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBEV09SRCBkc3R4LAorCQkJCSAgICAgIERXT1JEIGRzdHksIExQRElSRUNURFJBV1NVUkZBQ0U3IHNyYywKKwkJCQkgICAgICBMUFJFQ1QgcnNyYywgRFdPUkQgdHJhbnMpCit7CisgICAgcmV0dXJuIGNhbnRfZG9fdGhhdCgiYmx0ZmFzdCB0byBhIik7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9HZXREQyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgSERDICpwaERDKQoreworICAgIHJldHVybiBjYW50X2RvX3RoYXQoImdldCBhIERDIGZvciBhIik7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlREMoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIEhEQyBoREMpCit7CisgICAgcmV0dXJuIGNhbnRfZG9fdGhhdCgicmVsZWFzZSBhIERDIGZvciBhIik7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9SZXN0b3JlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlKQoreworICAgIHJldHVybiBERF9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkKK0Zha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX1NldFN1cmZhY2VEZXNjKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCQkgICAgIExQRERTVVJGQUNFREVTQzIgcEREU0QsCisJCQkJCSAgICAgRFdPUkQgZHdGbGFncykKK3sKKyAgICAvKiBYWFggKi8KKyAgICBhYm9ydCgpOworICAgIHJldHVybiBFX0ZBSUw7Cit9CisKKworc3RhdGljIElDT01fVlRBQkxFKElEaXJlY3REcmF3U3VyZmFjZTcpIEZha2VaQnVmZmVyX0lEaXJlY3REcmF3U3VyZmFjZTdfVlRhYmxlPQoreworICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9BZGRSZWYsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkQXR0YWNoZWRTdXJmYWNlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkT3ZlcmxheURpcnR5UmVjdCwKKyAgICBGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9CbHQsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9CbHRCYXRjaCwKKyAgICBGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9CbHRGYXN0LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRGVsZXRlQXR0YWNoZWRTdXJmYWNlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRW51bUF0dGFjaGVkU3VyZmFjZXMsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9FbnVtT3ZlcmxheVpPcmRlcnMsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9GbGlwLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0QXR0YWNoZWRTdXJmYWNlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Qmx0U3RhdHVzLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2FwcywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENsaXBwZXIsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRDb2xvcktleSwKKyAgICBGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9HZXREQywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldEZsaXBTdGF0dXMsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRPdmVybGF5UG9zaXRpb24sCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQYWxldHRlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UGl4ZWxGb3JtYXQsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRTdXJmYWNlRGVzYywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0luaXRpYWxpemUsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Jc0xvc3QsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Mb2NrLAorICAgIEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2VEQywKKyAgICBGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9SZXN0b3JlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0Q2xpcHBlciwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldENvbG9yS2V5LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0T3ZlcmxheVBvc2l0aW9uLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UGFsZXR0ZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VubG9jaywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VwZGF0ZU92ZXJsYXksCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5RGlzcGxheSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VwZGF0ZU92ZXJsYXlaT3JkZXIsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXREREludGVyZmFjZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1BhZ2VMb2NrLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUGFnZVVubG9jaywKKyAgICBGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9TZXRTdXJmYWNlRGVzYywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFByaXZhdGVEYXRhLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UHJpdmF0ZURhdGEsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9GcmVlUHJpdmF0ZURhdGEsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRVbmlxdWVuZXNzVmFsdWUsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9DaGFuZ2VVbmlxdWVuZXNzVmFsdWUsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRQcmlvcml0eSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFByaW9yaXR5LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0TE9ELAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0TE9ECit9OwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kc3VyZmFjZS9mYWtlemJ1ZmZlci5oIGIvZGxscy9kZHJhdy9kc3VyZmFjZS9mYWtlemJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNDE5ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RzdXJmYWNlL2Zha2V6YnVmZmVyLmgKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IDIwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLiAqLworCisjaWZuZGVmIEREUkFXX0RTVVJGQUNFX0ZBS0VaQlVGRkVSX0hfSU5DTFVERUQKKyNkZWZpbmUgRERSQVdfRFNVUkZBQ0VfRkFLRVpCVUZGRVJfSF9JTkNMVURFRAorCitzdHJ1Y3QgRmFrZVpCdWZmZXJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1BhcnQKK3sKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgc3RydWN0IEZha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlSW1wbF9QYXJ0IGZha2V6YnVmZmVyOworfSBGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZUltcGw7CisKK0hSRVNVTFQKK0Zha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX0NvbnN0cnVjdChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCQlJRGlyZWN0RHJhd0ltcGwqIHBERCwKKwkJCQkJY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNEKTsKKworSFJFU1VMVCBGYWtlWkJ1ZmZlcl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoSURpcmVjdERyYXdJbXBsKiBwREQsCisJCQkJCSAgICAgY29uc3QgRERTVVJGQUNFREVTQzIqIHBERFNELAorCQkJCQkgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmYsCisJCQkJCSAgICAgSVVua25vd24qIHBVbmtPdXRlcik7CisKK3ZvaWQKK0Zha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyk7CisKK0hSRVNVTFQKK0Zha2VaQnVmZmVyX0RpcmVjdERyYXdTdXJmYWNlX2R1cGxpY2F0ZV9zdXJmYWNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCisJCQkJCQlMUERJUkVDVERSQVdTVVJGQUNFNyogcHBEdXApOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kc3VyZmFjZS9tYWluLmMgYi9kbGxzL2RkcmF3L2RzdXJmYWNlL21haW4uYwppbmRleCBjNjI0M2E0Li41ZWNhZDMzIDEwMDY0NAotLS0gYS9kbGxzL2RkcmF3L2RzdXJmYWNlL21haW4uYworKysgYi9kbGxzL2RkcmF3L2RzdXJmYWNlL21haW4uYwpAQCAtMiwxMTgwICsyLDEwNzUgQEAKICAqCiAgKiBDb3B5cmlnaHQgMTk5Ny0yMDAwIE1hcmN1cyBNZWlzc25lcgogICogQ29weXJpZ2h0IDE5OTgtMjAwMCBMaW9uZWwgVWxtZXIgKG1vc3Qgb2YgRGlyZWN0M0Qgc3R1ZmYpCisgKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgogICovCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKIAotCi0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogCiAjaW5jbHVkZSAiZGVidWd0b29scy5oIgotI2luY2x1ZGUgImJpdG1hcC5oIgogI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKKyNpbmNsdWRlICJkc3VyZmFjZS9tYWluLmgiCisjaW5jbHVkZSAiZGRyYXcvbWFpbi5oIgorI2luY2x1ZGUgImRzdXJmYWNlL3RodW5rcy5oIgogCiBERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJSURpcmVjdERyYXdTdXJmYWNlIG1ldGhvZHMKLSAqCi0gKiBTaW5jZSBERFMzIGFuZCBERFMyIGFyZSBzdXBlcnNldHMgb2YgRERTLCB3ZSBpbXBsZW1lbnQgRERTMyBhbmQgbGV0Ci0gKiBERFMgYW5kIEREUzIgdXNlIHRob3NlIGZ1bmN0aW9ucy4gKEZ1bmN0aW9uIGNhbGxzIGRpZCBub3QgY2hhbmdlIChleGNlcHQKLSAqIHVzaW5nIGRpZmZlcmVudCBEaXJlY3REcmF3U3VyZmFjZVggdmVyc2lvbiksIGp1c3QgYWRkZWQgZmxhZ3MgYW5kIGZ1bmN0aW9ucykKLSAqLworLyoqIENyZWF0aW9uL0Rlc3RydWN0aW9uIGZ1bmN0aW9ucyAqLwogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9Mb2NrKAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLExQUkVDVCBscHJlY3QsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxEV09SRCBmbGFncywgSEFORExFIGhuZAotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKK0hSRVNVTFQKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMsCisJCQkJIElEaXJlY3REcmF3SW1wbCAqcERELAorCQkJCSBjb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QpCit7CisgICAgaWYgKHBERFNEICE9ICZUaGlzLT5zdXJmYWNlX2Rlc2MpCisJVGhpcy0+c3VyZmFjZV9kZXNjID0gKnBERFNEOworICAgIFRoaXMtPnVuaXF1ZW5lc3NfdmFsdWUgPSAxOyAvKiB1bmNoZWNrZWQgKi8KKyAgICBUaGlzLT5yZWYgPSAxOwogCi0gICAgVFJBQ0UoIiglcCktPkxvY2soJXAsJXAsJTA4bHgsJTA4bHgpXG4iLAotCVRoaXMsbHByZWN0LGxwZGRzZCxmbGFncywoRFdPUkQpaG5kKTsKKyAgICBUaGlzLT5maW5hbF9yZWxlYXNlID0gTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlOworICAgIFRoaXMtPmF0dGFjaCA9IE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfYXR0YWNoOworICAgIFRoaXMtPmRldGFjaCA9IE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfZGV0YWNoOworICAgIFRoaXMtPmxvY2tfdXBkYXRlID0gTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9sb2NrX3VwZGF0ZTsKKyAgICBUaGlzLT51bmxvY2tfdXBkYXRlID0gTWFpbl9EaXJlY3REcmF3U3VyZmFjZV91bmxvY2tfdXBkYXRlOworICAgIFRoaXMtPmxvc2Vfc3VyZmFjZSA9IE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfbG9zZV9zdXJmYWNlOworICAgIFRoaXMtPnNldF9wYWxldHRlICAgID0gTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9zZXRfcGFsZXR0ZTsKKyAgICBUaGlzLT51cGRhdGVfcGFsZXR0ZSA9IE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfdXBkYXRlX3BhbGV0dGU7CisgICAgVGhpcy0+Z2V0X2Rpc3BsYXlfd2luZG93ID0gTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGlzcGxheV93aW5kb3c7CiAKLSAgICAvKiBETyBOT1QgQWRkUmVmIHRoZSBzdXJmYWNlISBMb2NrL1VubG9jayBtdXN0IG5vdCBjb21lIGluIG1hdGNoZWQgcGFpcnMKLSAgICAgKiAtTWFyY3VzIE1laXNzbmVyIDIwMDAwNTA5Ci0gICAgICovCi0gICAgaWYgKGZsYWdzICYgfihERExPQ0tfV0FJVHxERExPQ0tfUkVBRE9OTFl8RERMT0NLX1dSSVRFT05MWSkpCi0JV0FSTigiKCVwKS0+TG9jayglcCwlcCwlMDhseCwlMDhseClcbiIsCi0JCSBUaGlzLGxwcmVjdCxscGRkc2QsZmxhZ3MsKERXT1JEKWhuZCk7CisgICAgSUNPTV9JTklUX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2UzLAorCQkJRERSQVdfSUREUzNfVGh1bmtfVlRhYmxlKTsKKyAgICAvKiBUaGVyZSBpcyBubyBnZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIElERFM3ICovCiAKLSAgICAvKiBGaXJzdCwgY29weSB0aGUgU3VyZmFjZSBkZXNjcmlwdGlvbiAqLwotICAgICpscGRkc2QgPSBUaGlzLT5zLnN1cmZhY2VfZGVzYzsKLSAgICBUUkFDRSgibG9ja2VkIHN1cmZhY2U6IGhlaWdodD0lbGQsIHdpZHRoPSVsZCwgcGl0Y2g9JWxkXG4iLAotCSAgbHBkZHNkLT5kd0hlaWdodCxscGRkc2QtPmR3V2lkdGgsbHBkZHNkLT5sUGl0Y2gpOwotCi0gICAgLyogSWYgYXNrZWQgb25seSBmb3IgYSBwYXJ0LCBjaGFuZ2UgdGhlIHN1cmZhY2UgcG9pbnRlciAqLwotICAgIGlmIChscHJlY3QpIHsKLQlUUkFDRSgiCWxwcmVjdDogJWR4JWQtJWR4JWRcbiIsCi0JCWxwcmVjdC0+dG9wLGxwcmVjdC0+bGVmdCxscHJlY3QtPmJvdHRvbSxscHJlY3QtPnJpZ2h0Ci0JKTsKLQlpZiAoKGxwcmVjdC0+dG9wIDwgMCkgfHwKLQkgICAgKGxwcmVjdC0+bGVmdCA8IDApIHx8Ci0JICAgIChscHJlY3QtPmJvdHRvbSA8IDApIHx8Ci0JICAgIChscHJlY3QtPnJpZ2h0IDwgMCkpIHsKLQkgIEVSUigiIE5lZ2F0aXZlIHZhbHVlcyBpbiBMUFJFQ1QgISEhXG4iKTsKLQkgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotICAgICAgIH0KLSAgICAgICAKLQlscGRkc2QtPnUxLmxwU3VyZmFjZSA9IChMUFZPSUQpICgoY2hhciAqKSBUaGlzLT5zLnN1cmZhY2VfZGVzYy51MS5scFN1cmZhY2UgKwotCQkobHByZWN0LT50b3AqVGhpcy0+cy5zdXJmYWNlX2Rlc2MubFBpdGNoKSArCi0JCWxwcmVjdC0+bGVmdCpHRVRfQlBQKFRoaXMtPnMuc3VyZmFjZV9kZXNjKSk7Ci0gICAgfSBlbHNlIHsKLQlhc3NlcnQoVGhpcy0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlKTsKLSAgICB9CisgICAgTWFpbl9EaXJlY3REcmF3X0FkZFN1cmZhY2UocERELCBUaGlzKTsKICAgICByZXR1cm4gRERfT0s7CiB9CiAKLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1VubG9jaygKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUFZPSUQgc3VyZmFjZQotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKK3ZvaWQgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9maW5hbF9yZWxlYXNlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpCit7CisgICAgTWFpbl9EaXJlY3REcmF3X1JlbW92ZVN1cmZhY2UoVGhpcy0+ZGRyYXdfb3duZXIsIFRoaXMpOworfQogCi0gICAgLyogRE8gTk9UIFJlbGVhc2UgdGhlIHN1cmZhY2UhIExvY2svVW5sb2NrIE1VU1QgTk9UIGNvbWUgaW4gbWF0Y2hlZCBwYWlycwotICAgICAqIE1hcmN1cyBNZWlzc25lciAyMDAwMDUwOQotICAgICAqLwotICAgIFRSQUNFKCIoJXApLT5VbmxvY2soJXApXG4iLFRoaXMsc3VyZmFjZSk7CitzdGF0aWMgdm9pZCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0Rlc3Ryb3koSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKK3sKKyAgICBUaGlzLT5maW5hbF9yZWxlYXNlKFRoaXMpOworICAgIGlmIChUaGlzLT5wcml2YXRlICE9IFRoaXMrMSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+cHJpdmF0ZSk7CisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7Cit9CisKK3ZvaWQgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Gb3JjZURlc3Ryb3koSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKK3sKKyAgICBXQVJOKCJkZXN0cm95aW5nIHN1cmZhY2UgJXAgd2l0aCByZWZjbnQgJWx1XG4iLCBUaGlzLCBUaGlzLT5yZWYpOworICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRGVzdHJveShUaGlzKTsKK30KKworVUxPTkcgV0lOQVBJIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSkKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgaWZhY2UpOworCisgICAgaWYgKC0tVGhpcy0+cmVmID09IDApCisgICAgeworCWlmIChUaGlzLT5hdXhfcmVsZWFzZSkKKwkgICAgVGhpcy0+YXV4X3JlbGVhc2UoVGhpcy0+YXV4X2N0eCwgVGhpcy0+YXV4X2RhdGEpOworCU1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRGVzdHJveShUaGlzKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gVGhpcy0+cmVmOworfQorCitVTE9ORyBXSU5BUEkgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9BZGRSZWYoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKworICAgIHJldHVybiArK1RoaXMtPnJlZjsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIFJFRklJRCByaWlkLAorCQkJCSAgICAgIExQVk9JRCogcHBPYmopCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKyAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgcHBPYmopOworCisgICAgaWYgKElzRXF1YWxHVUlEKCZJSURfSVVua25vd24sIHJpaWQpCisJfHwgSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0RHJhd1N1cmZhY2U3LCByaWlkKQorCXx8IElzRXF1YWxHVUlEKCZJSURfSURpcmVjdERyYXdTdXJmYWNlNCwgcmlpZCkpCisgICAgeworCVRoaXMtPnJlZisrOworCSpwcE9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcpOworCXJldHVybiBTX09LOworICAgIH0KKyAgICBlbHNlIGlmIChJc0VxdWFsR1VJRCgmSUlEX0lEaXJlY3REcmF3U3VyZmFjZSwgcmlpZCkKKwkgICAgIHx8IElzRXF1YWxHVUlEKCZJSURfSURpcmVjdERyYXdTdXJmYWNlMiwgcmlpZCkKKwkgICAgIHx8IElzRXF1YWxHVUlEKCZJSURfSURpcmVjdERyYXdTdXJmYWNlMywgcmlpZCkpCisgICAgeworCVRoaXMtPnJlZisrOworCSpwcE9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTMpOworCXJldHVybiBTX09LOworICAgIH0KKyAgICBlbHNlCisJcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cit9CisKKy8qKiogQ2FsbGJhY2tzICovCisKK0JPT0wKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfYXR0YWNoKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXMsCisJCQkgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICp0bykKK3sKKyAgICByZXR1cm4gVFJVRTsKK30KKworQk9PTCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2RldGFjaChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzKQoreworICAgIHJldHVybiBUUlVFOworfQorCit2b2lkCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX2xvY2tfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIExQQ1JFQ1QgcFJlY3QpCit7Cit9CisKK3ZvaWQKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfdW5sb2NrX3VwZGF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCSAgICAgTFBDUkVDVCBwUmVjdCkKK3sKK30KKwordm9pZAorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9sb3NlX3N1cmZhY2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKK3sKK30KKwordm9pZAorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9zZXRfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCSAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCkKK3sKK30KKwordm9pZAorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV91cGRhdGVfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCSAgICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCwKKwkJCQkgICAgICBEV09SRCBkd1N0YXJ0LCBEV09SRCBkd0NvdW50LAorCQkJCSAgICAgIExQUEFMRVRURUVOVFJZIHBhbGVudCkKK3sKK30KKworSFdORAorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGlzcGxheV93aW5kb3coSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKK3sKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqIEludGVyZmFjZSBmdW5jdGlvbnMgKi8KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkQXR0YWNoZWRTdXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCQkgIExQRElSRUNURFJBV1NVUkZBQ0U3IHBBdHRhY2gpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwKKwkJCQkJICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcsIHBBdHRhY2gpOworCisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxwQXR0YWNoKTsKKworICAgIC8qIERvZXMgd2luZG93cyBjaGVjayB0aGlzPyAqLworICAgIGlmIChzdXJmID09IFRoaXMpCisJcmV0dXJuIERERVJSX0NBTk5PVEFUVEFDSFNVUkZBQ0U7IC8qIHVuY2hlY2tlZCAqLworCisgICAgLyogRG9lcyB3aW5kb3dzIGNoZWNrIHRoaXM/ICovCisgICAgaWYgKHN1cmYtPmRkcmF3X293bmVyICE9IFRoaXMtPmRkcmF3X293bmVyKQorCXJldHVybiBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFOyAvKiB1bmNoZWNrZWQgKi8KKworICAgIGlmIChzdXJmLT5zdXJmYWNlX293bmVyICE9IE5VTEwpCisJcmV0dXJuIERERVJSX1NVUkZBQ0VBTFJFQURZQVRUQUNIRUQ7IC8qIHVuY2hlY2tlZCAqLworCisgICAgLyogVE9ETyBNU0ROOiAiWW91IGNhbiBhdHRhY2ggb25seSB6LWJ1ZmZlciBzdXJmYWNlcyB3aXRoIHRoaXMgbWV0aG9kLiIKKyAgICAgKiBCdXQgYXBwYXJlbnRseSBiYWNrYnVmZmVycyBhbmQgbWlwbWFwcyBjYW4gYmUgYXR0YWNoZWQgdG9vLiAqLworCisgICAgLyogQ2FsbGJhY2sgdG8gYWxsb3cgdGhlIHN1cmZhY2UgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwgbm93IHRoYXQgaXQgaXMKKyAgICAgKiBhdHRhY2hlZC4gKGUuZy4gbWF5YmUgdGhlIFotYnVmZmVyIHRlbGxzIHRoZSByZW5kZXJlciB0byB1c2UgaXQuKSAqLworICAgIGlmICghc3VyZi0+YXR0YWNoKHN1cmYsIFRoaXMpKQorCXJldHVybiBEREVSUl9DQU5OT1RBVFRBQ0hTVVJGQUNFOworCisgICAgLyogY2hlY2s6IFdoZXJlIHNob3VsZCBpdCBnbyBpbiB0aGUgY2hhaW4/IFRoaXMgcHV0cyBpdCBvbiB0aGUgaGVhZC4gKi8KKyAgICBpZiAoVGhpcy0+YXR0YWNoZWQpCisJVGhpcy0+YXR0YWNoZWQtPnByZXZfYXR0YWNoZWQgPSBzdXJmOworICAgIHN1cmYtPm5leHRfYXR0YWNoZWQgPSBUaGlzLT5hdHRhY2hlZDsKKyAgICBzdXJmLT5wcmV2X2F0dGFjaGVkID0gTlVMTDsKKyAgICBUaGlzLT5hdHRhY2hlZCA9IHN1cmY7CisgICAgc3VyZi0+c3VyZmFjZV9vd25lciA9IFRoaXM7CisKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihwQXR0YWNoKTsKKwogICAgIHJldHVybiBERF9PSzsKIH0KIAotSURpcmVjdERyYXdTdXJmYWNlNEltcGwqIF9jb21tb25fZmluZF9mbGlwdG8oCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGwqIFRoaXMsSURpcmVjdERyYXdTdXJmYWNlNEltcGwqIGZsaXB0bwotKSB7Ci0gICAgaW50CWksaixmbGlwYWJsZT0wOwotICAgIHN0cnVjdCBfc3VyZmFjZV9jaGFpbgkqY2hhaW4gPSBUaGlzLT5zLmNoYWluOworLyogTVNETjogIm5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuIiAqLworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkT3ZlcmxheURpcnR5UmVjdChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkJICAgTFBSRUNUIHBSZWN0KQoreworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLGlmYWNlLHBSZWN0KTsKKyAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7IC8qIHVuY2hlY2tlZCAqLworfQogCi0gICAgaWYgKCFjaGFpbikgewotCUVSUigiTm8gZmxpcCBjaGFpbj8gLT4gcmV0dXJuaW5nIFRoaXMuXG4iKTsKLQlyZXR1cm4gVGhpczsKKy8qIE1TRE46ICJub3QgY3VycmVudGx5IGltcGxlbWVudGVkLiIgKi8KK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0JsdEJhdGNoKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCUxQRERCTFRCQVRDSCBwQmF0Y2gsIERXT1JEIGR3Q291bnQsCisJCQkJRFdPUkQgZHdGbGFncykKK3sKKyAgICBUUkFDRSgiKCVwKS0+KCVwLCVsZCwlMDhseClcbiIsaWZhY2UscEJhdGNoLGR3Q291bnQsZHdGbGFncyk7CisgICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOyAvKiB1bmNoZWNrZWQgKi8KK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfQ2hhbmdlVW5pcXVlbmVzc1ZhbHVlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlKQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBpZmFjZSk7CisgICAgdm9sYXRpbGUgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogdlRoaXMgPSBUaGlzOworCisgICAgVFJBQ0UoIiglcClcbiIsVGhpcyk7CisgICAgLyogQSB1bmlxdW5lc3MgdmFsdWUgb2YgMCBpcyBhcHBhcmVudGx5IHNwZWNpYWwuCisgICAgICogVGhpcyBuZWVkcyB0byBiZSBjaGVja2VkLiAqLworICAgIHdoaWxlICgxKQorICAgIHsKKwlEV09SRCBvbGRfdW5pcXVlbmVzc192YWx1ZSA9IHZUaGlzLT51bmlxdWVuZXNzX3ZhbHVlOworCURXT1JEIG5ld191bmlxdWVuZXNzX3ZhbHVlID0gb2xkX3VuaXF1ZW5lc3NfdmFsdWUrMTsKKworCWlmIChvbGRfdW5pcXVlbmVzc192YWx1ZSA9PSAwKSBicmVhazsKKwlpZiAobmV3X3VuaXF1ZW5lc3NfdmFsdWUgPT0gMCkgbmV3X3VuaXF1ZW5lc3NfdmFsdWUgPSAxOworCisJaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKCZ2VGhpcy0+dW5pcXVlbmVzc192YWx1ZSwKKwkJCQkgICAgICAgb2xkX3VuaXF1ZW5lc3NfdmFsdWUsCisJCQkJICAgICAgIG5ld191bmlxdWVuZXNzX3ZhbHVlKQorCSAgICA9PSBvbGRfdW5pcXVlbmVzc192YWx1ZSkKKwkgICAgYnJlYWs7CiAgICAgfQogCi0gICAgLyogaWYgdGhlcmUgd2FzIG5vIG92ZXJyaWRlIGZsaXB0bywgbG9vayBmb3IgY3VycmVudCBiYWNrYnVmZmVyICovCi0gICAgaWYgKCFmbGlwdG8pIHsKLQkvKiB3YWxrIHRoZSBmbGlwIGNoYWluIGxvb2tpbmcgZm9yIGJhY2tidWZmZXIgKi8KLQlmb3IgKGk9MDtpPGNoYWluLT5ucm9mc3VyZmFjZXM7aSsrKSB7Ci0JICAgIGlmIChTRERTQ0FQUyhjaGFpbi0+c3VyZmFjZXNbaV0pICYgRERTQ0FQU19GTElQKQotCSAgICAJZmxpcGFibGUrKzsKLQkgICAgaWYgKFNERFNDQVBTKGNoYWluLT5zdXJmYWNlc1tpXSkgJiBERFNDQVBTX0JBQ0tCVUZGRVIpCi0JCWZsaXB0byA9IGNoYWluLT5zdXJmYWNlc1tpXTsKLQl9Ci0JLyogc2FuaXR5IGNoZWNrcyAuLi4gKi8KLQlpZiAoIWZsaXB0bykgewotCSAgICBpZiAoZmxpcGFibGU+MSkgewotCQlmb3IgKGk9MDtpPGNoYWluLT5ucm9mc3VyZmFjZXM7aSsrKQotCQkgICAgaWYgKFNERFNDQVBTKGNoYWluLT5zdXJmYWNlc1tpXSkgJiBERFNDQVBTX0ZST05UQlVGRkVSKQotCQkgICAgCWJyZWFrOwotCQlpZiAoaT09Y2hhaW4tPm5yb2ZzdXJmYWNlcykgewotCQkgICAgLyogd2UgZG8gbm90IGhhdmUgYSBmcm9udGJ1ZmZlciBlaXRoZXIgKi8KLQkJICAgIGZvciAoaT0wO2k8Y2hhaW4tPm5yb2ZzdXJmYWNlcztpKyspCi0JCQlpZiAoU0REU0NBUFMoY2hhaW4tPnN1cmZhY2VzW2ldKSAmIEREU0NBUFNfRkxJUCkgewotCQkJICAgIFNERFNDQVBTKGNoYWluLT5zdXJmYWNlc1tpXSl8PUREU0NBUFNfRlJPTlRCVUZGRVI7Ci0JCQkgICAgYnJlYWs7Ci0JCQl9Ci0JCSAgICBmb3IgKGo9aSsxO2o8aStjaGFpbi0+bnJvZnN1cmZhY2VzKzE7aisrKSB7Ci0JCSAgICAJaW50IGsgPSBqICUgY2hhaW4tPm5yb2ZzdXJmYWNlczsKLQkJCWlmIChTRERTQ0FQUyhjaGFpbi0+c3VyZmFjZXNba10pICYgRERTQ0FQU19GTElQKSB7Ci0JCQkgICAgU0REU0NBUFMoY2hhaW4tPnN1cmZhY2VzW2tdKXw9RERTQ0FQU19CQUNLQlVGRkVSOwotCQkJICAgIGZsaXB0byA9IGNoYWluLT5zdXJmYWNlc1trXTsKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJfQorICAgIHJldHVybiBERF9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfRGVsZXRlQXR0YWNoZWRTdXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCQkgICAgIERXT1JEIGR3RmxhZ3MsCisJCQkJCSAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcEF0dGFjaCkKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgaWZhY2UpOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIHN1cmYgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLAorCQkJCQkgICAgICAgSURpcmVjdERyYXdTdXJmYWNlNywgcEF0dGFjaCk7CisKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCVwKVxuIixUaGlzLGR3RmxhZ3MscEF0dGFjaCk7CisKKyAgICBpZiAoIXN1cmYgfHwgKHN1cmYtPnN1cmZhY2Vfb3duZXIgIT0gVGhpcykpCisJcmV0dXJuIERERVJSX1NVUkZBQ0VOT1RBVFRBQ0hFRDsgLyogdW5jaGVja2VkICovCisKKyAgICBzdXJmLT5kZXRhY2goc3VyZik7CisKKyAgICBpZiAoc3VyZi0+bmV4dF9hdHRhY2hlZCkKKwlzdXJmLT5uZXh0X2F0dGFjaGVkLT5wcmV2X2F0dGFjaGVkID0gc3VyZi0+cHJldl9hdHRhY2hlZDsKKyAgICBpZiAoc3VyZi0+cHJldl9hdHRhY2hlZCkKKwlzdXJmLT5wcmV2X2F0dGFjaGVkLT5uZXh0X2F0dGFjaGVkID0gc3VyZi0+bmV4dF9hdHRhY2hlZDsKKyAgICBpZiAoVGhpcy0+YXR0YWNoZWQgPT0gc3VyZikKKwlUaGlzLT5hdHRhY2hlZCA9IHN1cmYtPm5leHRfYXR0YWNoZWQ7CisKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UocEF0dGFjaCk7CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0VudW1BdHRhY2hlZFN1cmZhY2VzKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCQkgICAgTFBWT0lEIGNvbnRleHQsCisJCQkJCSAgICBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0s3IGNiKQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBpZmFjZSk7CisgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCogc3VyZjsKKworICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLFRoaXMsY29udGV4dCxjYik7CisKKyAgICBmb3IgKHN1cmYgPSBUaGlzLT5hdHRhY2hlZDsgc3VyZiAhPSBOVUxMOyBzdXJmID0gc3VyZi0+bmV4dF9hdHRhY2hlZCkKKyAgICB7CisJLyogY2hlY2s6ICE9IERERU5VTVJFVF9PSyBvciA9PSBEREVOVU1SRVRfQ0FOQ0VMPyAqLworCWlmIChjYihJQ09NX0lOVEVSRkFDRShzdXJmLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwgJnN1cmYtPnN1cmZhY2VfZGVzYywKKwkgICAgICAgY29udGV4dCkgPT0gRERFTlVNUkVUX0NBTkNFTCkKKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEREX09LOworfQorCitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9FbnVtT3ZlcmxheVpPcmRlcnMoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJCSAgRFdPUkQgZHdGbGFncywgTFBWT0lEIGNvbnRleHQsCisJCQkJCSAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNyBjYikKK3sKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4LCVwLCVwKVxuIixpZmFjZSxkd0ZsYWdzLGNvbnRleHQsY2IpOworICAgIHJldHVybiBERF9PSzsKK30KKwordm9pZCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBmcm9udCwKKwkJCQkgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBiYWNrKQoreworICAgIC8qIHVuaXF1ZW5lc3NfdmFsdWU/ICovCisgICAgLyogVGhpcyBpcyBuZWNlc3NhcnkuIEJ1dCBpcyBpdCBzYWZlPyAqLworICAgIHsKKwlIREMgdG1wID0gZnJvbnQtPmhEQzsKKwlmcm9udC0+aERDID0gYmFjay0+aERDOworCWJhY2stPmhEQyA9IHRtcDsKKyAgICB9CisKKyAgICB7CisJQk9PTCB0bXAgPSBmcm9udC0+ZGNfaW5fdXNlOworCWZyb250LT5kY19pbl91c2UgPSBiYWNrLT5kY19pbl91c2U7CisJYmFjay0+ZGNfaW5fdXNlID0gdG1wOworICAgIH0KK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfRmxpcChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCSAgICBMUERJUkVDVERSQVdTVVJGQUNFNyBvdmVycmlkZSwgRFdPUkQgZHdGbGFncykKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgaWZhY2UpOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIHRhcmdldDsKKyAgICBIUkVTVUxUIGhyOworCisgICAgVFJBQ0UoIiglcCktPiglcCwlMDhseClcbiIsVGhpcyxvdmVycmlkZSxkd0ZsYWdzKTsKKworICAgIC8qIE1TRE46ICJUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9ubHkgZm9yIGEgc3VyZmFjZSB0aGF0IGhhcyB0aGUKKyAgICAgKiBERFNDQVBTX0ZMSVAgYW5kIEREU0NBUFNfRlJPTlRCVUZGRVIgY2FwYWJpbGl0aWVzLiIgKi8KKyAgICBpZiAoKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyYoRERTQ0FQU19GTElQfEREU0NBUFNfRlJPTlRCVUZGRVIpKQorCSE9IChERFNDQVBTX0ZMSVB8RERTQ0FQU19GUk9OVEJVRkZFUikpCisJcmV0dXJuIERERVJSX05PVEZMSVBQQUJMRTsKKworICAgIGlmIChUaGlzLT5hdXhfZmxpcCkKKwlpZiAoVGhpcy0+YXV4X2ZsaXAoVGhpcy0+YXV4X2N0eCwgVGhpcy0+YXV4X2RhdGEpKQorCSAgICByZXR1cm4gRERfT0s7CisKKyAgICAvKiAxLiBmaW5kIHRoZSBmbGlwIHRhcmdldCAqLworICAgIC8qIFhYWCBJIGRvbid0IHRoaW5rIHRoaXMgYWxnb3JpdGhtIHdvcmtzIGZvciBtb3JlIHRoYW4gMSBiYWNrYnVmZmVyLiAqLworICAgIGlmIChvdmVycmlkZSA9PSBOVUxMKQorICAgIHsKKwlzdGF0aWMgY29uc3QgRERTQ0FQUzIgYmFja19jYXBzID0geyBERFNDQVBTX0JBQ0tCVUZGRVIgfTsKKwlMUERJUkVDVERSQVdTVVJGQUNFNyB0Z3Q7CisKKwlociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0QXR0YWNoZWRTdXJmYWNlKGlmYWNlLCAmYmFja19jYXBzLCAmdGd0KTsKKwlpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIERERVJSX05PVEZMSVBQQUJMRTsgLyogdW5jaGVja2VkICovCisKKwl0YXJnZXQgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LAorCQkJICAgICB0Z3QpOworCUlEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZSh0Z3QpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCUJPT0wgb25fY2hhaW4gPSBGQUxTRTsKKwlJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmOworCisJLyogTVNETjogIlRoZSBtZXRob2QgZmFpbHMgaWYgdGhlIHNwZWNpZmllZCBbb3ZlcnJpZGVdIHN1cmZhY2UgaXMgbm90CisJICogYSBtZW1iZXIgb2YgdGhlIGZsaXBwaW5nIGNoYWluLiIgKi8KKwkKKwkvKiBWZXJpZnkgdGhhdCBvdmVycmlkZSBpcyBvbiB0aGlzIGZsaXAgY2hhaW4uIFdlIGFzc3VtZSB0aGF0CisJICogc3VyZiBpcyB0aGUgaGVhZCBvZiB0aGUgZmxpcHBpbmcgY2hhaW4sIGJlY2F1c2UgaXQncyB0aGUgZnJvbnQKKwkgKiBidWZmZXIuICovCisJdGFyZ2V0ID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywKKwkJCSAgICAgb3ZlcnJpZGUpOworCisJLyogRWl0aGVyIHRhcmdldCBpcyAoaW5kaXJlY3RseSkgYXR0YWNoZWQgdG8gVGhpcyBvciBUaGlzIGlzCisJICogKGluZGlyZWN0bHkpIGF0dGFjaGVkIHRvIHRhcmdldC4gKi8KKwlmb3IgKHN1cmYgPSB0YXJnZXQ7IHN1cmYgIT0gTlVMTDsgc3VyZiA9IHN1cmYtPnN1cmZhY2Vfb3duZXIpCisJeworCSAgICBpZiAoc3VyZiA9PSBUaGlzKQorCSAgICB7CisJCW9uX2NoYWluID0gVFJVRTsKKwkJYnJlYWs7CiAJICAgIH0KLQkgICAgaWYgKCFmbGlwdG8pCi0JCWZsaXB0byA9IFRoaXM7Ci0JfQotCVRSQUNFKCJmbGlwcGluZyB0byAlcFxuIixmbGlwdG8pOwotICAgIH0KLSAgICByZXR1cm4gZmxpcHRvOwotfQotCi1zdGF0aWMgSFJFU1VMVCBfQmx0X0NvbG9yRmlsbCgKLSAgICBMUEJZVEUgYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBicHAsIExPTkcgbFBpdGNoLCBEV09SRCBjb2xvcgotKSB7Ci0gICAgaW50IHgsIHk7Ci0gICAgTFBCWVRFIGZpcnN0OwotCi0gICAgLyogRG8gZmlyc3Qgcm93ICovCi0KLSNkZWZpbmUgQ09MT1JGSUxMX1JPVyh0eXBlKSB7IFwKLSAgICB0eXBlICpkID0gKHR5cGUgKikgYnVmOyBcCi0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIFwKLQlkW3hdID0gKHR5cGUpIGNvbG9yOyBcCi0gICAgYnJlYWs7IFwKLX0KLQotICAgIHN3aXRjaChicHApIHsKLSAgICBjYXNlIDE6IENPTE9SRklMTF9ST1coQllURSkKLSAgICBjYXNlIDI6IENPTE9SRklMTF9ST1coV09SRCkKLSAgICBjYXNlIDQ6IENPTE9SRklMTF9ST1coRFdPUkQpCi0gICAgZGVmYXVsdDoKLQlGSVhNRSgiQ29sb3IgZmlsbCBub3QgaW1wbGVtZW50ZWQgZm9yIGJwcCAlZCFcbiIsIGJwcCo4KTsKLQlyZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0jdW5kZWYgQ09MT1JGSUxMX1JPVwotCi0gICAgLyogTm93IGNvcHkgZmlyc3Qgcm93ICovCi0gICAgZmlyc3QgPSBidWY7Ci0gICAgZm9yICh5ID0gMTsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JYnVmICs9IGxQaXRjaDsKLQltZW1jcHkoYnVmLCBmaXJzdCwgd2lkdGggKiBicHApOwotICAgIH0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0JsdCgKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUFJFQ1QgcmRzdCxMUERJUkVDVERSQVdTVVJGQUNFNCBzcmMsTFBSRUNUIHJzcmMsCi0gICAgRFdPUkQgZHdGbGFncyxMUEREQkxURlggbHBibHRmeAotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBSRUNUCQl4ZHN0LHhzcmM7Ci0gICAgRERTVVJGQUNFREVTQwlkZGVzYyxzZGVzYzsKLSAgICBIUkVTVUxUCQlyZXQgPSBERF9PSzsKLSAgICBpbnQgYnBwLCBzcmNoZWlnaHQsIHNyY3dpZHRoLCBkc3RoZWlnaHQsIGRzdHdpZHRoLCB3aWR0aDsKLSAgICBpbnQgeCwgeTsKLSAgICBMUEJZVEUgZGJ1Ziwgc2J1ZjsKLQotICAgIFRSQUNFKCIoJXApLT4oJXAsJXAsJXAsJTA4bHgsJXApXG4iLCBUaGlzLHJkc3Qsc3JjLHJzcmMsZHdGbGFncyxscGJsdGZ4KTsKLQotICAgIGlmIChzcmMpIElEaXJlY3REcmF3U3VyZmFjZTRfTG9jayhzcmMsIE5VTEwsICZzZGVzYywgMCwgMCk7Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlNF9Mb2NrKGlmYWNlLE5VTEwsJmRkZXNjLDAsMCk7Ci0KLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JaWYgKHJkc3QpIFRSQUNFKCJcdGRlc3RyZWN0IDolZHglZC0lZHglZFxuIixyZHN0LT5sZWZ0LHJkc3QtPnRvcCxyZHN0LT5yaWdodCxyZHN0LT5ib3R0b20pOwotCWlmIChyc3JjKSBUUkFDRSgiXHRzcmNyZWN0ICA6JWR4JWQtJWR4JWRcbiIscnNyYy0+bGVmdCxyc3JjLT50b3AscnNyYy0+cmlnaHQscnNyYy0+Ym90dG9tKTsKLQlUUkFDRSgiXHRmbGFnczogIik7Ci0JX2R1bXBfRERCTFQoZHdGbGFncyk7Ci0JaWYgKGR3RmxhZ3MgJiBEREJMVF9EREZYKSB7Ci0JICAgIFRSQUNFKCJcdGJsaXRmeDogIik7Ci0JICAgIF9kdW1wX0REQkxURlgobHBibHRmeC0+ZHdEREZYKTsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHJkc3QpIHsKLQlpZiAoKHJkc3QtPnRvcCA8IDApIHx8Ci0JICAgIChyZHN0LT5sZWZ0IDwgMCkgfHwKLQkgICAgKHJkc3QtPmJvdHRvbSA8IDApIHx8Ci0JICAgIChyZHN0LT5yaWdodCA8IDApKSB7Ci0JICBFUlIoIiBOZWdhdGl2ZSB2YWx1ZXMgaW4gTFBSRUNUICEhIVxuIik7Ci0JICBnb3RvIHJlbGVhc2U7Ci0JfQotCW1lbWNweSgmeGRzdCxyZHN0LHNpemVvZih4ZHN0KSk7Ci0gICAgfSBlbHNlIHsKLQl4ZHN0LnRvcAk9IDA7Ci0JeGRzdC5ib3R0b20JPSBkZGVzYy5kd0hlaWdodDsKLQl4ZHN0LmxlZnQJPSAwOwotCXhkc3QucmlnaHQJPSBkZGVzYy5kd1dpZHRoOwotICAgIH0KLQotICAgIGlmIChyc3JjKSB7Ci0JaWYgKChyc3JjLT50b3AgPCAwKSB8fAotCSAgICAocnNyYy0+bGVmdCA8IDApIHx8Ci0JICAgIChyc3JjLT5ib3R0b20gPCAwKSB8fAotCSAgICAocnNyYy0+cmlnaHQgPCAwKSkgewotCSAgRVJSKCIgTmVnYXRpdmUgdmFsdWVzIGluIExQUkVDVCAhISFcbiIpOwotCSAgZ290byByZWxlYXNlOwotCX0KLQltZW1jcHkoJnhzcmMscnNyYyxzaXplb2YoeHNyYykpOwotICAgIH0gZWxzZSB7Ci0JaWYgKHNyYykgewotCSAgICB4c3JjLnRvcAk9IDA7Ci0JICAgIHhzcmMuYm90dG9tCT0gc2Rlc2MuZHdIZWlnaHQ7Ci0JICAgIHhzcmMubGVmdAk9IDA7Ci0JICAgIHhzcmMucmlnaHQJPSBzZGVzYy5kd1dpZHRoOwotCX0gZWxzZSB7Ci0JICAgIG1lbXNldCgmeHNyYywwLHNpemVvZih4c3JjKSk7Ci0JfQotICAgIH0KLSAgICBpZiAoc3JjKSBhc3NlcnQoKHhzcmMuYm90dG9tLXhzcmMudG9wKSA8PSBzZGVzYy5kd0hlaWdodCk7Ci0KLSAgICAvKiB0cnVuY2F0ZSBkc3QgcmVjdCB0byBkZXN0IHN1cmZhY2UuICovCi0gICAgaWYgKCh4ZHN0LmJvdHRvbS14ZHN0LnRvcCkgPiBkZGVzYy5kd0hlaWdodCkKLQl4ZHN0LmJvdHRvbSA9IHhkc3QudG9wK2RkZXNjLmR3SGVpZ2h0OwotICAgIGlmICgoeGRzdC5yaWdodC14ZHN0LmxlZnQpID4gZGRlc2MuZHdXaWR0aCkKLQl4ZHN0LnJpZ2h0ID0geGRzdC5sZWZ0K2RkZXNjLmR3V2lkdGg7Ci0KLSAgICBicHAgPSBHRVRfQlBQKGRkZXNjKTsKLSAgICBzcmNoZWlnaHQgPSB4c3JjLmJvdHRvbSAtIHhzcmMudG9wOwotICAgIHNyY3dpZHRoID0geHNyYy5yaWdodCAtIHhzcmMubGVmdDsKLSAgICBkc3RoZWlnaHQgPSB4ZHN0LmJvdHRvbSAtIHhkc3QudG9wOwotICAgIGRzdHdpZHRoID0geGRzdC5yaWdodCAtIHhkc3QubGVmdDsKLSAgICB3aWR0aCA9ICh4ZHN0LnJpZ2h0IC0geGRzdC5sZWZ0KSAqIGJwcDsKLQotICAgIGFzc2VydCh3aWR0aCA8PSBkZGVzYy5sUGl0Y2gpOwotCi0gICAgZGJ1ZiA9IChCWVRFKilkZGVzYy51MS5scFN1cmZhY2UrKHhkc3QudG9wKmRkZXNjLmxQaXRjaCkrKHhkc3QubGVmdCpicHApOwotCi0gICAgZHdGbGFncyAmPSB+KEREQkxUX1dBSVR8RERCTFRfQVNZTkMpOy8qIEZJWE1FOiBjYW4ndCBoYW5kbGUgcmlnaHQgbm93ICovCi0KLSAgICAvKiBGaXJzdCwgYWxsIHRoZSAnc291cmNlLWxlc3MnIGJsaXRzICovCi0gICAgaWYgKGR3RmxhZ3MgJiBEREJMVF9DT0xPUkZJTEwpIHsKLQlyZXQgPSBfQmx0X0NvbG9yRmlsbChkYnVmLCBkc3R3aWR0aCwgZHN0aGVpZ2h0LCBicHAsCi0JCQkgICAgIGRkZXNjLmxQaXRjaCwgbHBibHRmeC0+dTQuZHdGaWxsQ29sb3IpOwotCWR3RmxhZ3MgJj0gfkREQkxUX0NPTE9SRklMTDsKLSAgICB9Ci0KLSAgICBpZiAoZHdGbGFncyAmIEREQkxUX0RFUFRIRklMTCkKLQlGSVhNRSgiRERCTFRfREVQVEhGSUxMIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIVxuIik7Ci0gICAgaWYgKGR3RmxhZ3MgJiBEREJMVF9ST1ApIHsKLQkvKiBDYXRjaCBzb21lIGRlZ2VuZXJhdGUgY2FzZXMgaGVyZSAqLwotCXN3aXRjaChscGJsdGZ4LT5kd1JPUCkgewotCWNhc2UgQkxBQ0tORVNTOgotCSAgICByZXQgPSBfQmx0X0NvbG9yRmlsbChkYnVmLGRzdHdpZHRoLGRzdGhlaWdodCxicHAsZGRlc2MubFBpdGNoLDApOwotCSAgICBicmVhazsKLQljYXNlIDB4QUEwMDI5OiAvKiBOby1vcCAqLwotCSAgICBicmVhazsKLQljYXNlIFdISVRFTkVTUzoKLQkgICAgcmV0ID0gX0JsdF9Db2xvckZpbGwoZGJ1Zixkc3R3aWR0aCxkc3RoZWlnaHQsYnBwLGRkZXNjLmxQaXRjaCx+MCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgU1JDQ09QWTogLyogd2VsbCwgd2UgZG8gdGhhdCBiZWxvdyA/ICovCi0JICAgIGJyZWFrOwotCWRlZmF1bHQ6IAotCSAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgcmFzdGVyIG9wOiAlMDhseCAgUGF0dGVybjogJXBcbiIsIGxwYmx0ZngtPmR3Uk9QLCBscGJsdGZ4LT51NC5scEREU1BhdHRlcm4pOwotCSAgICBnb3RvIGVycm9yOwotCX0KLQlkd0ZsYWdzICY9IH5EREJMVF9ST1A7Ci0gICAgfQotICAgIGlmIChkd0ZsYWdzICYgRERCTFRfRERST1BTKSB7Ci0JRklYTUUoIlx0RGRyYXcgUmFzdGVyIE9wczogJTA4bHggIFBhdHRlcm46ICVwXG4iLCBscGJsdGZ4LT5kd0REUk9QLCBscGJsdGZ4LT51NC5scEREU1BhdHRlcm4pOwotICAgIH0KLSAgICAvKiBOb3cgdGhlICd3aXRoIHNvdXJjZScgYmxpdHMgKi8KLSAgICBpZiAoc3JjKSB7Ci0JTFBCWVRFIHNiYXNlOwotCWludCBzeCwgeGluYywgc3ksIHlpbmM7Ci0KLQlpZiAoIWRzdHdpZHRoIHx8ICFkc3RoZWlnaHQpIC8qIGhtbS4uLiBzdHVwaWQgcHJvZ3JhbSA/ICovCi0JICAgIGdvdG8gcmVsZWFzZTsKLQlzYmFzZSA9IChCWVRFKilzZGVzYy51MS5scFN1cmZhY2UrKHhzcmMudG9wKnNkZXNjLmxQaXRjaCkreHNyYy5sZWZ0KmJwcDsKLQl4aW5jID0gKHNyY3dpZHRoIDw8IDE2KSAvIGRzdHdpZHRoOwotCXlpbmMgPSAoc3JjaGVpZ2h0IDw8IDE2KSAvIGRzdGhlaWdodDsKLQotCWlmICghZHdGbGFncykgewotCSAgICAvKiBObyBlZmZlY3RzLCB3ZSBjYW4gY2hlYXQgaGVyZSAqLwotCSAgICBpZiAoZHN0d2lkdGggPT0gc3Jjd2lkdGgpIHsKLQkJaWYgKGRzdGhlaWdodCA9PSBzcmNoZWlnaHQpIHsKLQkJICAgIC8qIE5vIHN0cmV0Y2hpbmcgaW4gZWl0aGVyIGRpcmVjdGlvbi4gVGhpcyBuZWVkcyB0byBiZSBhcwotCQkgICAgICogZmFzdCBhcyBwb3NzaWJsZSAqLwotCQkgICAgc2J1ZiA9IHNiYXNlOwotCQkgICAgZm9yICh5ID0gMDsgeSA8IGRzdGhlaWdodDsgeSsrKSB7Ci0JCQltZW1jcHkoZGJ1Ziwgc2J1Ziwgd2lkdGgpOwotCQkJc2J1ZiArPSBzZGVzYy5sUGl0Y2g7Ci0JCQlkYnVmICs9IGRkZXNjLmxQaXRjaDsKLQkJICAgIH0KLQkJfSBlbHNlIHsKLQkJICAgIC8qIFN0cmV0Y2hpbmcgaW4gWSBkaXJlY3Rpb24gb25seSAqLwotCQkgICAgZm9yICh5ID0gc3kgPSAwOyB5IDwgZHN0aGVpZ2h0OyB5KyssIHN5ICs9IHlpbmMpIHsKLQkJCXNidWYgPSBzYmFzZSArIChzeSA+PiAxNikgKiBzZGVzYy5sUGl0Y2g7Ci0JCQltZW1jcHkoZGJ1Ziwgc2J1Ziwgd2lkdGgpOwotCQkJZGJ1ZiArPSBkZGVzYy5sUGl0Y2g7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfSBlbHNlIHsKLQkJLyogU3RyZXRjaGluZyBpbiBYIGRpcmVjdGlvbiAqLwotCQlpbnQgbGFzdF9zeSA9IC0xOwotCQlmb3IgKHkgPSBzeSA9IDA7IHkgPCBkc3RoZWlnaHQ7IHkrKywgc3kgKz0geWluYykgewotCQkgICAgc2J1ZiA9IHNiYXNlICsgKHN5ID4+IDE2KSAqIHNkZXNjLmxQaXRjaDsKLQotCQkgICAgaWYgKChzeSA+PiAxNikgPT0gKGxhc3Rfc3kgPj4gMTYpKSB7Ci0JCQkvKiB0aGlzIHNvdXJjZXJvdyBpcyB0aGUgc2FtZSBhcyBsYXN0IHNvdXJjZXJvdyAtCi0JCQkgKiBjb3B5IGFscmVhZHkgc3RyZXRjaGVkIHJvdwotCQkJICovCi0JCQltZW1jcHkoZGJ1ZiwgZGJ1ZiAtIGRkZXNjLmxQaXRjaCwgd2lkdGgpOwotCQkgICAgfSBlbHNlIHsKLSNkZWZpbmUgU1RSRVRDSF9ST1codHlwZSkgeyBcCi0JCSAgICB0eXBlICpzID0gKHR5cGUgKikgc2J1ZiwgKmQgPSAodHlwZSAqKSBkYnVmOyBcCi0JCSAgICBmb3IgKHggPSBzeCA9IDA7IHggPCBkc3R3aWR0aDsgeCsrLCBzeCArPSB4aW5jKSBcCi0JCSAgICBkW3hdID0gc1tzeCA+PiAxNl07IFwKLQkJICAgIGJyZWFrOyB9Ci0KLQkJICAgIHN3aXRjaChicHApIHsKLQkJICAgIGNhc2UgMTogU1RSRVRDSF9ST1coQllURSkKLQkJICAgIGNhc2UgMjogU1RSRVRDSF9ST1coV09SRCkKLQkJICAgIGNhc2UgNDogU1RSRVRDSF9ST1coRFdPUkQpCi0JCSAgICBjYXNlIDM6IHsKLQkJCUxQQllURSBzLGQgPSBkYnVmOwotCQkJZm9yICh4ID0gc3ggPSAwOyB4IDwgZHN0d2lkdGg7IHgrKywgc3grPSB4aW5jKSB7Ci0JCQkgICAgRFdPUkQgcGl4ZWw7Ci0KLQkJCSAgICBzID0gc2J1ZiszKihzeD4+MTYpOwotCQkJICAgIHBpeGVsID0gKHNbMF08PDE2KXwoc1sxXTw8OCl8c1syXTsKLQkJCSAgICBkWzBdID0gKHBpeGVsPj4xNikmMHhmZjsKLQkJCSAgICBkWzFdID0gKHBpeGVsPj4gOCkmMHhmZjsKLQkJCSAgICBkWzJdID0gKHBpeGVsICAgICkmMHhmZjsKLQkJCSAgICBkKz0zOwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICBkZWZhdWx0OgotCQkJRklYTUUoIlN0cmV0Y2hlZCBibGl0IG5vdCBpbXBsZW1lbnRlZCBmb3IgYnBwICVkIVxuIiwgYnBwKjgpOwotCQkJcmV0ID0gRERFUlJfVU5TVVBQT1JURUQ7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgfQotI3VuZGVmIFNUUkVUQ0hfUk9XCi0JCSAgICB9Ci0JCSAgICBkYnVmICs9IGRkZXNjLmxQaXRjaDsKLQkJICAgIGxhc3Rfc3kgPSBzeTsKLQkJfQotCSAgICB9Ci0JfSBlbHNlIGlmIChkd0ZsYWdzICYgKEREQkxUX0tFWVNSQyB8IEREQkxUX0tFWURFU1QpKSB7Ci0JICAgIERXT1JEIGtleWxvdywga2V5aGlnaDsKLQotCSAgICBpZiAoZHdGbGFncyAmIEREQkxUX0tFWVNSQykgewotCQlrZXlsb3cgID0gc2Rlc2MuZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlOwotCQlrZXloaWdoID0gc2Rlc2MuZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZTsKLQkgICAgfSBlbHNlIHsKLQkJLyogSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdCAqLwotCQlGSVhNRSgiRERCTFRfS0VZREVTVCBub3QgZnVsbHkgc3VwcG9ydGVkIHlldC5cbiIpOwotCQlrZXlsb3cgID0gZGRlc2MuZGRja0NLRGVzdEJsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZTsKLQkJa2V5aGlnaCA9IGRkZXNjLmRkY2tDS0Rlc3RCbHQuZHdDb2xvclNwYWNlSGlnaFZhbHVlOwotCSAgICB9Ci0KLQotCSAgICBmb3IgKHkgPSBzeSA9IDA7IHkgPCBkc3RoZWlnaHQ7IHkrKywgc3kgKz0geWluYykgewotCQlzYnVmID0gc2Jhc2UgKyAoc3kgPj4gMTYpICogc2Rlc2MubFBpdGNoOwotCi0jZGVmaW5lIENPUFlST1dfQ09MT1JLRVkodHlwZSkgeyBcCi0JCXR5cGUgKnMgPSAodHlwZSAqKSBzYnVmLCAqZCA9ICh0eXBlICopIGRidWYsIHRtcDsgXAotCQlmb3IgKHggPSBzeCA9IDA7IHggPCBkc3R3aWR0aDsgeCsrLCBzeCArPSB4aW5jKSB7IFwKLQkJICAgIHRtcCA9IHNbc3ggPj4gMTZdOyBcCi0JCSAgICBpZiAodG1wIDwga2V5bG93IHx8IHRtcCA+IGtleWhpZ2gpIGRbeF0gPSB0bXA7IFwKLQkJfSBcCi0JCWJyZWFrOyB9Ci0KLQkJc3dpdGNoIChicHApIHsKLQkJY2FzZSAxOiBDT1BZUk9XX0NPTE9SS0VZKEJZVEUpCi0JCWNhc2UgMjogQ09QWVJPV19DT0xPUktFWShXT1JEKQotCQljYXNlIDQ6IENPUFlST1dfQ09MT1JLRVkoRFdPUkQpCi0JCWRlZmF1bHQ6Ci0JCSAgICBGSVhNRSgiJXMgY29sb3Ita2V5ZWQgYmxpdCBub3QgaW1wbGVtZW50ZWQgZm9yIGJwcCAlZCFcbiIsCi0JCSAgICAoZHdGbGFncyAmIEREQkxUX0tFWVNSQykgPyAiU291cmNlIiA6ICJEZXN0aW5hdGlvbiIsIGJwcCo4KTsKLQkJICAgIHJldCA9IERERVJSX1VOU1VQUE9SVEVEOwotCQkgICAgZ290byBlcnJvcjsKLQkJfQotCQlkYnVmICs9IGRkZXNjLmxQaXRjaDsKLQkgICAgfQotI3VuZGVmIENPUFlST1dfQ09MT1JLRVkKLQkgICAgZHdGbGFncyAmPSB+KEREQkxUX0tFWVNSQyB8IEREQkxUX0tFWURFU1QpOwotCX0KLSAgICB9Ci0KLWVycm9yOgotICAgIGlmIChkd0ZsYWdzICYmIEZJWE1FX09OKGRkcmF3KSkgewotCUZJWE1FKCJcdFVuc3VwcG9ydGVkIGZsYWdzOiAiKTsKLQlfZHVtcF9EREJMVChkd0ZsYWdzKTsKLSAgICB9Ci0KLXJlbGVhc2U6Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlNF9VbmxvY2soaWZhY2UsZGRlc2MudTEubHBTdXJmYWNlKTsKLSAgICBpZiAoc3JjKSBJRGlyZWN0RHJhd1N1cmZhY2U0X1VubG9jayhzcmMsc2Rlc2MudTEubHBTdXJmYWNlKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0JsdEZhc3QoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsRFdPUkQgZHN0eCxEV09SRCBkc3R5LExQRElSRUNURFJBV1NVUkZBQ0U0IHNyYywKLSAgICBMUFJFQ1QgcnNyYyxEV09SRCB0cmFucwotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBpbnQJCQlicHAsIHcsIGgsIHgsIHk7Ci0gICAgRERTVVJGQUNFREVTQwlkZGVzYyxzZGVzYzsKLSAgICBIUkVTVUxUCQlyZXQgPSBERF9PSzsKLSAgICBMUEJZVEUJCXNidWYsIGRidWY7Ci0gICAgUkVDVAkJcnNyYzI7Ci0KLQotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKLQlGSVhNRSgiKCVwKS0+KCVsZCwlbGQsJXAsJXAsJTA4bHgpXG4iLAotCQlUaGlzLGRzdHgsZHN0eSxzcmMscnNyYyx0cmFucwotCSk7Ci0JRklYTUUoIgl0cmFuczoiKTsKLQlpZiAoRklYTUVfT04oZGRyYXcpKQotCSAgX2R1bXBfRERCTFRGQVNUKHRyYW5zKTsKLQlpZiAocnNyYykKLQkgIEZJWE1FKCJcdHNyY3JlY3Q6ICVkeCVkLSVkeCVkXG4iLHJzcmMtPmxlZnQscnNyYy0+dG9wLHJzcmMtPnJpZ2h0LHJzcmMtPmJvdHRvbSk7Ci0JZWxzZQotCSAgRklYTUUoIiBzcmNyZWN0OiBOVUxMXG4iKTsKLSAgICB9Ci0gICAgCi0gICAgLyogV2UgbmVlZCB0byBsb2NrIHRoZSBzdXJmYWNlcywgb3Igd2Ugd29uJ3QgZ2V0IHJlZnJlc2hlcyB3aGVuIGRvbmUuICovCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNF9Mb2NrKHNyYywgTlVMTCwmc2Rlc2MsRERMT0NLX1JFQURPTkxZLCAwKTsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0X0xvY2soaWZhY2UsTlVMTCwmZGRlc2MsRERMT0NLX1dSSVRFT05MWSwwKTsKLQotICAgaWYgKCFyc3JjKSB7Ci0JICAgV0FSTigicnNyYyBpcyBOVUxMIVxuIik7Ci0JICAgcnNyYyA9ICZyc3JjMjsKLQkgICByc3JjLT5sZWZ0ID0gcnNyYy0+dG9wID0gMDsKLQkgICByc3JjLT5yaWdodCA9IHNkZXNjLmR3V2lkdGg7Ci0JICAgcnNyYy0+Ym90dG9tID0gc2Rlc2MuZHdIZWlnaHQ7Ci0gICB9Ci0KLSAgICBicHAgPSBHRVRfQlBQKFRoaXMtPnMuc3VyZmFjZV9kZXNjKTsKLSAgICBzYnVmID0gKEJZVEUgKilzZGVzYy51MS5scFN1cmZhY2UrKHJzcmMtPnRvcCpzZGVzYy5sUGl0Y2gpK3JzcmMtPmxlZnQqYnBwOwotICAgIGRidWYgPSAoQllURSAqKWRkZXNjLnUxLmxwU3VyZmFjZSsoZHN0eSpkZGVzYy5sUGl0Y2gpK2RzdHgqIGJwcDsKLQotCi0gICAgaD1yc3JjLT5ib3R0b20tcnNyYy0+dG9wOwotICAgIGlmIChoPmRkZXNjLmR3SGVpZ2h0LWRzdHkpIGg9ZGRlc2MuZHdIZWlnaHQtZHN0eTsKLSAgICBpZiAoaD5zZGVzYy5kd0hlaWdodC1yc3JjLT50b3ApIGg9c2Rlc2MuZHdIZWlnaHQtcnNyYy0+dG9wOwotICAgIGlmIChoPDApIGg9MDsKLQotICAgIHc9cnNyYy0+cmlnaHQtcnNyYy0+bGVmdDsKLSAgICBpZiAodz5kZGVzYy5kd1dpZHRoLWRzdHgpIHc9ZGRlc2MuZHdXaWR0aC1kc3R4OwotICAgIGlmICh3PnNkZXNjLmR3V2lkdGgtcnNyYy0+bGVmdCkgdz1zZGVzYy5kd1dpZHRoLXJzcmMtPmxlZnQ7Ci0gICAgaWYgKHc8MCkgdz0wOwotCi0gICAgaWYgKHRyYW5zICYgKEREQkxURkFTVF9TUkNDT0xPUktFWSB8IEREQkxURkFTVF9ERVNUQ09MT1JLRVkpKSB7Ci0JRFdPUkQga2V5bG93LCBrZXloaWdoOwotCWlmICh0cmFucyAmIEREQkxURkFTVF9TUkNDT0xPUktFWSkgewotCSAgICBrZXlsb3cgID0gc2Rlc2MuZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlOwotCSAgICBrZXloaWdoID0gc2Rlc2MuZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZTsKLQl9IGVsc2UgewotCSAgICAvKiBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBjb3JyZWN0ICovCi0JICAgIEZJWE1FKCJEREJMVEZBU1RfREVTVENPTE9SS0VZIG5vdCBmdWxseSBzdXBwb3J0ZWQgeWV0LlxuIik7Ci0JICAgIGtleWxvdyAgPSBkZGVzYy5kZGNrQ0tEZXN0Qmx0LmR3Q29sb3JTcGFjZUxvd1ZhbHVlOwotCSAgICBrZXloaWdoID0gZGRlc2MuZGRja0NLRGVzdEJsdC5kd0NvbG9yU3BhY2VIaWdoVmFsdWU7CiAJfQogCi0jZGVmaW5lIENPUFlCT1hfQ09MT1JLRVkodHlwZSkgeyBcCi0gICAgdHlwZSAqZCA9ICh0eXBlICopZGJ1ZiwgKnMgPSAodHlwZSAqKXNidWYsIHRtcDsgXAotICAgIHMgPSAodHlwZSAqKSAoKEJZVEUgKikgc2Rlc2MudTEubHBTdXJmYWNlICsgKHJzcmMtPnRvcCAqIHNkZXNjLmxQaXRjaCkgKyByc3JjLT5sZWZ0ICogYnBwKTsgXAotICAgIGQgPSAodHlwZSAqKSAoKEJZVEUgKikgZGRlc2MudTEubHBTdXJmYWNlICsgKGRzdHkgKiBkZGVzYy5sUGl0Y2gpICsgZHN0eCAqIGJwcCk7IFwKLSAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7IFwKLQlmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7IFwKLQkgICAgdG1wID0gc1t4XTsgXAotCSAgICBpZiAodG1wIDwga2V5bG93IHx8IHRtcCA+IGtleWhpZ2gpIGRbeF0gPSB0bXA7IFwKLQl9IFwKLQkoTFBCWVRFKXMgKz0gc2Rlc2MubFBpdGNoOyBcCi0JKExQQllURSlkICs9IGRkZXNjLmxQaXRjaDsgXAotICAgIH0gXAotICAgIGJyZWFrOyBcCi19Ci0KLQlzd2l0Y2ggKGJwcCkgewotCWNhc2UgMTogQ09QWUJPWF9DT0xPUktFWShCWVRFKQotCWNhc2UgMjogQ09QWUJPWF9DT0xPUktFWShXT1JEKQotCWNhc2UgNDogQ09QWUJPWF9DT0xPUktFWShEV09SRCkKLQlkZWZhdWx0OgotCSAgICBGSVhNRSgiU291cmNlIGNvbG9yIGtleSBibGl0dGluZyBub3Qgc3VwcG9ydGVkIGZvciBicHAgJWRcbiIsYnBwKjgpOwotCSAgICByZXQgPSBEREVSUl9VTlNVUFBPUlRFRDsKLQkgICAgZ290byBlcnJvcjsKLQl9Ci0jdW5kZWYgQ09QWUJPWF9DT0xPUktFWQotICAgIH0gZWxzZSB7Ci0JaW50IHdpZHRoID0gdyAqIGJwcDsKLQotCWZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKLQkgICAgbWVtY3B5KGRidWYsIHNidWYsIHdpZHRoKTsKLQkgICAgc2J1ZiArPSBzZGVzYy5sUGl0Y2g7Ci0JICAgIGRidWYgKz0gZGRlc2MubFBpdGNoOwotCX0KKwlpZiAoIW9uX2NoYWluKQorCSAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsgLyogdW5jaGVja2VkICovCiAgICAgfQotZXJyb3I6Ci0gICAgSURpcmVjdERyYXdTdXJmYWNlNF9VbmxvY2soaWZhY2UsZGRlc2MudTEubHBTdXJmYWNlKTsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0X1VubG9jayhzcmMsc2Rlc2MudTEubHBTdXJmYWNlKTsKLSAgICByZXR1cm4gcmV0OwotfQogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9CbHRCYXRjaCgKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUEREQkxUQkFUQ0ggZGRibHRiYXRjaCxEV09SRCB4LERXT1JEIHkKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPkJsdEJhdGNoKCVwLCUwOGx4LCUwOGx4KSxzdHViIVxuIixUaGlzLGRkYmx0YmF0Y2gseCx5KTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldENhcHMoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBERFNDQVBTIGNhcHMKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcCktPkdldENhcHMoJXApXG4iLFRoaXMsY2Fwcyk7Ci0gICAgY2Fwcy0+ZHdDYXBzID0gRERTQ0FQU19QQUxFVFRFOyAvKiBwcm9iYWJseSBtb3JlICovCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRTdXJmYWNlRGVzYygKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUEREU1VSRkFDRURFU0MgZGRzZAotKSB7IAotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcCktPkdldFN1cmZhY2VEZXNjKCVwKVxuIiwgVGhpcyxkZHNkKTsKLSAgCi0gICAgLyogU2ltcGx5IGNvcHkgdGhlIHN1cmZhY2UgZGVzY3JpcHRpb24gc3RvcmVkIGluIHRoZSBvYmplY3QgKi8KLSAgICAqZGRzZCA9IFRoaXMtPnMuc3VyZmFjZV9kZXNjOwotICAKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7IF9kdW1wX3N1cmZhY2VfZGVzYyhkZHNkKTsgfQorICAgIFRSQUNFKCJmbGlwIHRvIGJhY2tidWZmZXI6ICVwXG4iLHRhcmdldCk7CisgICAgVGhpcy0+ZmxpcF9kYXRhKFRoaXMsIHRhcmdldCk7CisgICAgVGhpcy0+ZmxpcF91cGRhdGUoVGhpcyk7CiAKICAgICByZXR1cm4gRERfT0s7CiB9CiAKLVVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9BZGRSZWYoTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UpIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICAgIFRSQUNFKCIoJXApLT4oKSBpbmNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCBUaGlzLT5yZWYgKTsKLSAgICByZXR1cm4gKysoVGhpcy0+cmVmKTsKK3N0YXRpYyBQcml2YXRlRGF0YSogZmluZF9wcml2YXRlX2RhdGEoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqVGhpcywKKwkJCQkgICAgICBSRUZHVUlEIHRhZykKK3sKKyAgICBQcml2YXRlRGF0YSogZGF0YTsKKyAgICBmb3IgKGRhdGEgPSBUaGlzLT5wcml2YXRlX2RhdGE7IGRhdGEgIT0gTlVMTDsgZGF0YSA9IGRhdGEtPm5leHQpCisgICAgeworCWlmIChJc0VxdWFsR1VJRCgmZGF0YS0+dGFnLCB0YWcpKSBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZGF0YTsKIH0KIAorSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfRnJlZVByaXZhdGVEYXRhKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBSRUZHVUlEIHRhZykKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgaWZhY2UpOworICAgIFByaXZhdGVEYXRhICpkYXRhOwogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRBdHRhY2hlZFN1cmZhY2UoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBERFNDQVBTIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFNCAqbHBkc2YKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgaW50CWksZm91bmQgPSAwLHhzdGFydDsKLSAgICBzdHJ1Y3QgX3N1cmZhY2VfY2hhaW4JKmNoYWluOworICAgIGRhdGEgPSBmaW5kX3ByaXZhdGVfZGF0YShUaGlzLCB0YWcpOworICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiBEREVSUl9OT1RGT1VORDsKIAotICAgIFRSQUNFKCIoJXApLT5HZXRBdHRhY2hlZFN1cmZhY2UoJXAsJXApXG4iLCBUaGlzLCBscGRkc2QsIGxwZHNmKTsKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JVFJBQ0UoIgljYXBzICIpO19kdW1wX0REU0NBUFMoKHZvaWQgKikgJihscGRkc2QtPmR3Q2FwcykpOwotCURQUklOVEYoIlxuIik7CisgICAgaWYgKGRhdGEtPnByZXYpCisJZGF0YS0+cHJldi0+bmV4dCA9IGRhdGEtPm5leHQ7CisgICAgaWYgKGRhdGEtPm5leHQpCisJZGF0YS0+bmV4dC0+cHJldiA9IGRhdGEtPnByZXY7CisKKyAgICBpZiAoZGF0YS0+ZmxhZ3MgJiBERFNQRF9JVU5LTk9XTlBUUikKKyAgICB7CisJaWYgKGRhdGEtPnB0ci5vYmplY3QgIT0gTlVMTCkKKwkgICAgSVVua25vd25fUmVsZWFzZShkYXRhLT5wdHIub2JqZWN0KTsKICAgICB9Ci0gICAgY2hhaW4gPSBUaGlzLT5zLmNoYWluOwotICAgIGlmICghY2hhaW4pCi0gICAgCXJldHVybiBEREVSUl9OT1RGT1VORDsKKyAgICBlbHNlCisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGF0YS0+cHRyLmRhdGEpOwogCi0gICAgZm9yIChpPTA7aTxjaGFpbi0+bnJvZnN1cmZhY2VzO2krKykKLSAgICAJaWYgKGNoYWluLT5zdXJmYWNlc1tpXSA9PSBUaGlzKQotCSAgICBicmVhazsKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkYXRhKTsKIAotICAgIHhzdGFydCA9IGk7Ci0gICAgZm9yIChpPTA7aTxjaGFpbi0+bnJvZnN1cmZhY2VzO2krKykgewotCWlmICgoU0REU0NBUFMoY2hhaW4tPnN1cmZhY2VzWyh4c3RhcnQraSklY2hhaW4tPm5yb2ZzdXJmYWNlc10pJmxwZGRzZC0+ZHdDYXBzKSA9PSBscGRkc2QtPmR3Q2FwcykgewotI2lmIDAKLQkgICAgaWYgKGZvdW5kKSAvKiBtYXkgbm90IGZpbmQgdGhlIHNhbWUgY2FwcyB0d2ljZSwgKGRvYykgKi8KLQkJcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7LypGSVhNRTogY29ycmVjdD8gKi8KLSNlbmRpZgotCSAgICBmb3VuZCA9IChpKzEpK3hzdGFydDsKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldEF0dGFjaGVkU3VyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkJICBMUEREU0NBUFMyIHBDYXBzLAorCQkJCQkgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmZhY2UpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmOworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGZvdW5kID0gTlVMTDsKKworICAgIFRSQUNFKCIoJXApLT5Mb29raW5nIGZvciBjYXBzOiAleCwleCwleCwleCBvdXRwdXQ6ICVwXG4iLFRoaXMscENhcHMtPmR3Q2FwcywgcENhcHMtPmR3Q2FwczIsIAorICAgICAgICAgIHBDYXBzLT5kd0NhcHMzLCBwQ2Fwcy0+ZHdDYXBzNCwgcHBTdXJmYWNlKTsKKworICAgIGZvciAoc3VyZiA9IFRoaXMtPmF0dGFjaGVkOyBzdXJmICE9IE5VTEw7IHN1cmYgPSBzdXJmLT5uZXh0X2F0dGFjaGVkKQorICAgIHsKKyAgICAgICAgVFJBQ0UoIlN1cmZhY2U6ICglcCkgY2FwczogJXgsJXgsJXgsJXggXG4iLHN1cmYgLAorICAgICAgICAgICAgICAgc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzLAorICAgICAgICAgICAgICAgc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzMiwKKyAgICAgICAgICAgICAgIHN1cmYtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwczMsCisgICAgICAgICAgICAgICBzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHM0KTsKKwlpZiAoKChzdXJmLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBwQ2Fwcy0+ZHdDYXBzKSA9PSBwQ2Fwcy0+ZHdDYXBzKQorCSAgICYmICgoc3VyZi0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzMiAmIHBDYXBzLT5kd0NhcHMyKSA9PSBwQ2Fwcy0+ZHdDYXBzMikpCisJeworCSAgICAvKiBNU0ROOiAiVGhpcyBtZXRob2QgZmFpbHMgaWYgbW9yZSB0aGFuIG9uZSBzdXJmYWNlIGlzIGF0dGFjaGVkCisJICAgICAqIHRoYXQgbWF0Y2hlcyB0aGUgY2FwYWJpbGl0aWVzIHJlcXVlc3RlZC4iICovCisJICAgIGlmIChmb3VuZCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZJWE1FKCJNb3JlIHRoYW4gb25lIGF0dGFjaGVkIHN1cmZhY2UgbWF0Y2hlcyByZXF1ZXN0ZWQgY2Fwcy4gIFdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/XG4iKTsKKyAgICAgICAgICAgICAgICAvKiBQcmV2aW91cyBjb2RlIHJldHVybmVkICdEREVSUl9OT1RGT1VORCcuICBUaGF0IGFwcGVhcnMgbm90IAorICAgICAgICAgICAgICAgICAgIHRvIGJlIGNvcnJlY3QsIGdpdmVuIHdoYXQgM0RNYXJrIGV4cGVjdHMgZnJvbSBNaXBNYXBwZWQgc3VyZmFjZXMuIAorICAgICAgICAgICAgICAgICAgIFdlIHNoYWxsIGp1c3QgY29udGludWUgaW5zdGVhZC4gKi8KKyAgICAgICAgICAgIH0KKworCSAgICBmb3VuZCA9IHN1cmY7CiAJfQogICAgIH0KLSAgICBpZiAoIWZvdW5kKQorCisgICAgaWYgKGZvdW5kID09IE5VTEwpCiAJcmV0dXJuIERERVJSX05PVEZPVU5EOwotICAgICpscGRzZiA9IChMUERJUkVDVERSQVdTVVJGQUNFNCljaGFpbi0+c3VyZmFjZXNbZm91bmQtMS14c3RhcnRdOwogCi0gICAgLyogRm9yIEV2ZXJRdWVzdCB0ZXN0aW5nICovCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNF9BZGRSZWYoKmxwZHNmKTsKLSAgICAKLSAgICBUUkFDRSgiZm91bmQgJXBcbiIsKmxwZHNmKTsKKyAgICAqcHBTdXJmYWNlID0gSUNPTV9JTlRFUkZBQ0UoZm91bmQsIElEaXJlY3REcmF3U3VyZmFjZTcpOworCisgICAgLyogWFhYIGQzZGZyYW1lLmNwcCBzb21ldGltZXMgQWRkUmVmcyB0aGluZ3MgdGhhdCBpdCBnZXRzIGZyb20gdXMuICovCisgICAgSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoZm91bmQsIElEaXJlY3REcmF3U3VyZmFjZTcpKTsKICAgICByZXR1cm4gRERfT0s7CiB9CiAKLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0luaXRpYWxpemUoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBESVJFQ1REUkFXIGRkcmF3LExQRERTVVJGQUNFREVTQyBscGRzZmQKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcCktPiglcCwgJXApXG4iLFRoaXMsZGRyYXcsbHBkc2ZkKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldEJsdFN0YXR1cyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgRFdPUkQgZHdGbGFncykKK3sKKyAgICBUUkFDRSgiKCVwKS0+KCUwOGx4KVxuIixpZmFjZSxkd0ZsYWdzKTsKIAorICAgIHN3aXRjaCAoZHdGbGFncykKKyAgICB7CisgICAgY2FzZSBEREdCU19DQU5CTFQ6CisgICAgY2FzZSBEREdCU19JU0JMVERPTkU6CisJcmV0dXJuIEREX09LOworCisgICAgZGVmYXVsdDoKKwlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICB9Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENhcHMoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIExQRERTQ0FQUzIgcENhcHMpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMscENhcHMpOworICAgICpwQ2FwcyA9IFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzOworICAgIHJldHVybiBERF9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2xpcHBlcihMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkgIExQRElSRUNURFJBV0NMSVBQRVIqIHBwQ2xpcHBlcikKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgaWZhY2UpOworCisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxwcENsaXBwZXIpOworICAgIGlmIChUaGlzLT5jbGlwcGVyID09IE5VTEwpCisJcmV0dXJuIERERVJSX05PQ0xJUFBFUkFUVEFDSEVEOworCisgICAgKnBwQ2xpcHBlciA9IElDT01fSU5URVJGQUNFKFRoaXMtPmNsaXBwZXIsIElEaXJlY3REcmF3Q2xpcHBlcik7CisgICAgSURpcmVjdERyYXdDbGlwcGVyX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLT5jbGlwcGVyLAorCQkJCQkgICAgIElEaXJlY3REcmF3Q2xpcHBlcikpOworICAgIHJldHVybiBERF9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q29sb3JLZXkoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIERXT1JEIGR3RmxhZ3MsCisJCQkJICAgTFBERENPTE9SS0VZIHBDS2V5KQoreworICAgIC8qIFRoZXJlIGlzIGEgRERFUlJfTk9DT0xPUktFWSBlcnJvciwgYnV0IGhvdyBkbyB3ZSBrbm93IGlmIGEgY29sb3Iga2V5CisgICAgICogaXNuJ3QgdGhlcmU/IFRoYXQncyBsaWtlIHNheWluZyB0aGF0IGFuIGludCBpc24ndCB0aGVyZS4gKFdoaWNoIE1TCisgICAgICogaGFzIGRvbmUgaW4gb3RoZXIgZG9jcy4pICovCisKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgaWZhY2UpOworCisgICAgVFJBQ0UoIiglcCktPiglMDhseCwlcClcbiIsVGhpcyxkd0ZsYWdzLHBDS2V5KTsKKyAgICBzd2l0Y2ggKGR3RmxhZ3MpCisgICAgeworICAgIGNhc2UgRERDS0VZX0RFU1RCTFQ6CisJKnBDS2V5ID0gVGhpcy0+c3VyZmFjZV9kZXNjLmRkY2tDS0Rlc3RCbHQ7CisJYnJlYWs7CisKKyAgICBjYXNlIEREQ0tFWV9ERVNUT1ZFUkxBWToKKwkqcENLZXkgPSBUaGlzLT5zdXJmYWNlX2Rlc2MudTMuZGRja0NLRGVzdE92ZXJsYXk7CisJYnJlYWs7CisKKyAgICBjYXNlIEREQ0tFWV9TUkNCTFQ6CisJKnBDS2V5ID0gVGhpcy0+c3VyZmFjZV9kZXNjLmRkY2tDS1NyY0JsdDsKKwlicmVhazsKKworICAgIGNhc2UgRERDS0VZX1NSQ09WRVJMQVk6CisJKnBDS2V5ID0gVGhpcy0+c3VyZmFjZV9kZXNjLmRkY2tDS1NyY092ZXJsYXk7CisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCXJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgIH0KKworICAgIHJldHVybiBERF9PSzsKK30KKworLyogWFhYIFdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIHdpdGggdGhlIERDIGlmIHRoZSBzdXJmYWNlIGdldHMgbG9zdC4gKi8KK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldERDKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBIREMgKnBoREMpCit7CisgICAgRERTVVJGQUNFREVTQzIgZGRzZDsKKyAgICBIUkVTVUxUIGhyOworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBpZmFjZSk7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLHBoREMpOworICAgIENIRUNLX0xPU1QoVGhpcyk7CisKKyAgICBMT0NLX09CSkVDVChUaGlzKTsKKworICAgIGlmIChUaGlzLT5kY19pbl91c2UpCisgICAgeworCVVOTE9DS19PQkpFQ1QoVGhpcyk7CisJcmV0dXJuIERERVJSX0RDQUxSRUFEWUNSRUFURUQ7CisgICAgfQorCisgICAgLyogTG9jayBhcyBwZXIgTVNETi4KKyAgICAgKiBTdHJhbmdlOiBMb2NrIGxpc3RzIERERVJSX1NVUkZBQ0VCVVNZIGFzIGFuIGVycm9yLCBtZWFuaW5nIHRoYXQgYW5vdGhlcgorICAgICAqIHRocmVhZCBoYXMgaXQgbG9ja2VkLCBidXQgR2V0REMgZG9lcyBub3QuICovCisgICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CisgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2soaWZhY2UsIE5VTEwsICZkZHNkLCAwLCAwKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkKKyAgICB7CisJVU5MT0NLX09CSkVDVChUaGlzKTsKKwlyZXR1cm4gaHI7CisgICAgfQorCisgICAgaHIgPSBUaGlzLT5nZXRfZGMoVGhpcywgJlRoaXMtPmhEQyk7CisgICAgaWYgKFNVQ0NFRURFRChocikpCisgICAgeworCVRSQUNFKCJyZXR1cm5pbmcgJTA4eFxuIixUaGlzLT5oREMpOworCisJKnBoREMgPSBUaGlzLT5oREM7CisJVGhpcy0+ZGNfaW5fdXNlID0gVFJVRTsKKyAgICB9CisgICAgZWxzZSBXQVJOKCJObyBEQyEgUHJlcGFyZSBmb3IgdHJvdWJsZVxuIik7CisKKyAgICBVTkxPQ0tfT0JKRUNUKFRoaXMpOworICAgIHJldHVybiBocjsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0RERJbnRlcmZhY2UoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIExQVk9JRCogcEREKQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBpZmFjZSk7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLHBERCk7CisgICAgKnBERCA9IElDT01fSU5URVJGQUNFKFRoaXMtPmRkcmF3X293bmVyLCBJRGlyZWN0RHJhdzcpOworICAgIElEaXJlY3REcmF3N19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+ZGRyYXdfb3duZXIsIElEaXJlY3REcmF3NykpOworICAgIHJldHVybiBERF9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0RmxpcFN0YXR1cyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgRFdPUkQgZHdGbGFncykKK3sKKyAgICAvKiBYWFg6IERERVJSX0lOVkFMSURTVVJGQUNFVFlQRSAqLworCisgICAgVFJBQ0UoIiglcCktPiglMDhseClcbiIsaWZhY2UsZHdGbGFncyk7CisgICAgc3dpdGNoIChkd0ZsYWdzKQorICAgIHsKKyAgICBjYXNlIERER0ZTX0NBTkZMSVA6CisgICAgY2FzZSBEREdGU19JU0ZMSVBET05FOgorCXJldHVybiBERF9PSzsKKworICAgIGRlZmF1bHQ6CisJcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CisgICAgfQorfQorCitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRMT0QoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIExQRFdPUkQgcGR3TWF4TE9EKQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBpZmFjZSk7CisKKyAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIixUaGlzLHBkd01heExPRCk7CisgICAgQ0hFQ0tfVEVYVFVSRShUaGlzKTsKKworICAgICpwZHdNYXhMT0QgPSBUaGlzLT5tYXhfbG9kOworICAgIHJldHVybiBERF9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0T3ZlcmxheVBvc2l0aW9uKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCQkgIExQTE9ORyBwWCwgTFBMT05HIHBZKQoreworICAgIHJldHVybiBEREVSUl9OT1RBT1ZFUkxBWVNVUkZBQ0U7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFBhbGV0dGUoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICBMUERJUkVDVERSQVdQQUxFVFRFKiBwcFBhbGV0dGUpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMscHBQYWxldHRlKTsKKyAgICBpZiAoVGhpcy0+cGFsZXR0ZSA9PSBOVUxMKQorCXJldHVybiBEREVSUl9OT1BBTEVUVEVBVFRBQ0hFRDsKKworICAgICpwcFBhbGV0dGUgPSBJQ09NX0lOVEVSRkFDRShUaGlzLT5wYWxldHRlLCBJRGlyZWN0RHJhd1BhbGV0dGUpOworICAgIElEaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+cGFsZXR0ZSwKKwkJCQkJICAgICBJRGlyZWN0RHJhd1BhbGV0dGUpKTsKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFBpeGVsRm9ybWF0KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgICAgIExQRERQSVhFTEZPUk1BVCBwRERQaXhlbEZvcm1hdCkKK3sKKyAgICAvKiBXaGF0IGlzIERERVJSX0lOVkFMSURTVVJGQUNFVFlQRSBmb3IgaGVyZT8gKi8KKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgaWZhY2UpOworCisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxwRERQaXhlbEZvcm1hdCk7CisgICAgKnBERFBpeGVsRm9ybWF0ID0gVGhpcy0+c3VyZmFjZV9kZXNjLnU0LmRkcGZQaXhlbEZvcm1hdDsKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFByaW9yaXR5KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgIExQRFdPUkQgcGR3UHJpb3JpdHkpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMscGR3UHJpb3JpdHkpOworICAgIENIRUNLX1RFWFRVUkUoVGhpcyk7CisKKyAgICAqcGR3UHJpb3JpdHkgPSBUaGlzLT5wcmlvcml0eTsKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFByaXZhdGVEYXRhKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgICAgIFJFRkdVSUQgdGFnLCBMUFZPSUQgcEJ1ZmZlciwKKwkJCQkgICAgICBMUERXT1JEIHBjYkJ1ZmZlclNpemUpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKyAgICBQcml2YXRlRGF0YSogZGF0YTsKKworICAgIGRhdGEgPSBmaW5kX3ByaXZhdGVfZGF0YShUaGlzLCB0YWcpOworICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiBEREVSUl9OT1RGT1VORDsKKworICAgIC8qIFRoaXMgbWF5IG5vdCBiZSByaWdodC4gKi8KKyAgICBpZiAoKGRhdGEtPmZsYWdzICYgRERTUERfVk9MQVRJTEUpCisJJiYgZGF0YS0+dW5pcXVlbmVzc192YWx1ZSAhPSBUaGlzLT51bmlxdWVuZXNzX3ZhbHVlKQorCXJldHVybiBEREVSUl9FWFBJUkVEOworCisgICAgaWYgKCpwY2JCdWZmZXJTaXplIDwgZGF0YS0+c2l6ZSkKKyAgICB7CisJKnBjYkJ1ZmZlclNpemUgPSBkYXRhLT5zaXplOworCXJldHVybiBEREVSUl9NT1JFREFUQTsKKyAgICB9CisKKyAgICBpZiAoZGF0YS0+ZmxhZ3MgJiBERFNQRF9JVU5LTk9XTlBUUikKKyAgICB7CisJKihMUFVOS05PV04gKilwQnVmZmVyID0gZGF0YS0+cHRyLm9iamVjdDsKKwlJVW5rbm93bl9BZGRSZWYoZGF0YS0+cHRyLm9iamVjdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJbWVtY3B5KHBCdWZmZXIsIGRhdGEtPnB0ci5kYXRhLCBkYXRhLT5zaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgICAgIExQRERTVVJGQUNFREVTQzIgcEREU0QpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMscEREU0QpOworICAgICpwRERTRCA9IFRoaXMtPnN1cmZhY2VfZGVzYzsKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFVuaXF1ZW5lc3NWYWx1ZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkJICBMUERXT1JEIHBWYWx1ZSkKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgaWZhY2UpOworCisgICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxwVmFsdWUpOworICAgICpwVmFsdWUgPSBUaGlzLT51bmlxdWVuZXNzX3ZhbHVlOworICAgIHJldHVybiBERF9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfSW5pdGlhbGl6ZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkgIExQRElSRUNURFJBVyBwREQsIExQRERTVVJGQUNFREVTQzIgcEREU0QpCit7CisgICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsaWZhY2UscERELHBERFNEKTsKICAgICByZXR1cm4gRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOwogfQogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRQaXhlbEZvcm1hdCgKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUEREUElYRUxGT1JNQVQgcGYKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxwZik7Ci0KLSAgICAqcGYgPSBUaGlzLT5zLnN1cmZhY2VfZGVzYy5kZHBmUGl4ZWxGb3JtYXQ7Ci0gICAgaWYgKFRSQUNFX09OKGRkcmF3KSkgeyBfZHVtcF9waXhlbGZvcm1hdChwZik7IERQUklOVEYoIlxuIik7IH0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldEJsdFN0YXR1cyhMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxEV09SRCBkd0ZsYWdzKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwKS0+KDB4JTA4bHgpLHN0dWIhXG4iLFRoaXMsZHdGbGFncyk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRPdmVybGF5UG9zaXRpb24oCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBMT05HIHgxLExQTE9ORyB4MgotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwKS0+KCVwLCVwKSxzdHViIVxuIixUaGlzLHgxLHgyKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1NldENsaXBwZXIoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBESVJFQ1REUkFXQ0xJUFBFUiBscENsaXBwZXIKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcCktPiglcCkhXG4iLFRoaXMsbHBDbGlwcGVyKTsKLQotICAgIGlmIChUaGlzLT5zLmxwQ2xpcHBlcikgSURpcmVjdERyYXdDbGlwcGVyX1JlbGVhc2UoIFRoaXMtPnMubHBDbGlwcGVyICk7Ci0gICAgVGhpcy0+cy5scENsaXBwZXIgPSBscENsaXBwZXI7Ci0gICAgaWYgKGxwQ2xpcHBlcikgSURpcmVjdERyYXdDbGlwcGVyX0FkZFJlZiggbHBDbGlwcGVyICk7Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9BZGRBdHRhY2hlZFN1cmZhY2UoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBESVJFQ1REUkFXU1VSRkFDRTQgc3VyZgotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCppc3VyZiA9IChJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCopc3VyZjsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgX3N1cmZhY2VfY2hhaW4gKmNoYWluOwotCi0gICAgRklYTUUoIiglcCktPiglcClcbiIsVGhpcyxzdXJmKTsKLSAgICBjaGFpbiA9IFRoaXMtPnMuY2hhaW47Ci0KLSAgICAvKiBJRGlyZWN0RHJhd1N1cmZhY2U0X0FkZFJlZihzdXJmKTsgKi8KLSAgICAKLSAgICBpZiAoY2hhaW4pIHsKLQlmb3IgKGk9MDtpPGNoYWluLT5ucm9mc3VyZmFjZXM7aSsrKQotCSAgICBpZiAoY2hhaW4tPnN1cmZhY2VzW2ldID09IGlzdXJmKQotCQlGSVhNRSgiYXR0YWNoaW5nIGFscmVhZHkgYXR0YWNoZWQgc3VyZmFjZSAlcCB0byAlcCFcbiIsaWZhY2UsaXN1cmYpOwotICAgIH0gZWxzZSB7Ci0gICAgCWNoYWluID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoKmNoYWluKSk7Ci0JY2hhaW4tPm5yb2ZzdXJmYWNlcyA9IDE7Ci0JY2hhaW4tPnN1cmZhY2VzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoY2hhaW4tPnN1cmZhY2VzWzBdKSk7Ci0JY2hhaW4tPnN1cmZhY2VzWzBdID0gVGhpczsKLQlUaGlzLT5zLmNoYWluID0gY2hhaW47Ci0gICAgfQotCi0gICAgaWYgKGNoYWluLT5zdXJmYWNlcykKLQljaGFpbi0+c3VyZmFjZXMgPSBIZWFwUmVBbGxvYygKLQkgICAgR2V0UHJvY2Vzc0hlYXAoKSwKLQkgICAgMCwKLQkgICAgY2hhaW4tPnN1cmZhY2VzLAotCSAgICBzaXplb2YoY2hhaW4tPnN1cmZhY2VzWzBdKSooY2hhaW4tPm5yb2ZzdXJmYWNlcysxKQotCSk7Ci0gICAgZWxzZQotCWNoYWluLT5zdXJmYWNlcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKGNoYWluLT5zdXJmYWNlc1swXSkpOwotICAgIGlzdXJmLT5zLmNoYWluID0gY2hhaW47Ci0gICAgY2hhaW4tPnN1cmZhY2VzW2NoYWluLT5ucm9mc3VyZmFjZXMrK10gPSBpc3VyZjsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldERDKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLEhEQyogbHBoZGMpIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICAgIEREU1VSRkFDRURFU0MgZGVzYzsKLSAgICBCSVRNQVBJTkZPICpiX2luZm87Ci0gICAgVUlOVCB1c2FnZTsKLSAgICBIREMgZGRjOwotCi0gICAgVFJBQ0UoIiglcCktPkdldERDKCVwKVxuIixUaGlzLGxwaGRjKTsKLQotICAgIC8qIENyZWF0ZXMgYSBESUIgU2VjdGlvbiBvZiB0aGUgc2FtZSBzaXplIC8gZm9ybWF0IGFzIHRoZSBzdXJmYWNlICovCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNF9Mb2NrKGlmYWNlLE5VTEwsJmRlc2MsMCwwKTsKLQotICAgIGlmIChUaGlzLT5zLmhkYyA9PSAwKSB7Ci0Jc3dpdGNoIChkZXNjLmRkcGZQaXhlbEZvcm1hdC51LmR3UkdCQml0Q291bnQpIHsKLQljYXNlIDE2OgotCWNhc2UgMzI6Ci0jaWYgMCAvKiBUaGlzIHNob3VsZCBiZSBmaWxsZWQgaWYgV2luZSdzIERJQlNlY3Rpb24gZGlkIHVuZGVyc3RhbmQgQklfQklURklFTERTICovCi0JICAgIGJfaW5mbyA9IChCSVRNQVBJTkZPICopIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyAzICogc2l6ZW9mKERXT1JEKSk7Ci0JICAgIGJyZWFrOwotI2VuZGlmCi0KLQljYXNlIDI0OgotCSAgICBiX2luZm8gPSAoQklUTUFQSU5GTyAqKSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKLQkgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgICBiX2luZm8gPSAoQklUTUFQSU5GTyAqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkgICAgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsgc2l6ZW9mKFJHQlFVQUQpICogKDIgPDwgZGVzYy5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50KSk7Ci0JICAgIGJyZWFrOwotCX0KLQotCWJfaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLQliX2luZm8tPmJtaUhlYWRlci5iaVdpZHRoID0gZGVzYy5kd1dpZHRoOwotCWJfaW5mby0+Ym1pSGVhZGVyLmJpSGVpZ2h0ID0gLWRlc2MuZHdIZWlnaHQ7Ci0JYl9pbmZvLT5ibWlIZWFkZXIuYmlQbGFuZXMgPSAxOwotCWJfaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPSBkZXNjLmRkcGZQaXhlbEZvcm1hdC51LmR3UkdCQml0Q291bnQ7Ci0jaWYgMAotCWlmICgoZGVzYy5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50ICE9IDE2KSAmJgotCSAgICAoZGVzYy5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50ICE9IDMyKSkKLSNlbmRpZgotCWJfaW5mby0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSBCSV9SR0I7Ci0jaWYgMAotCWVsc2UKLQliX2luZm8tPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfQklURklFTERTOwotI2VuZGlmCi0JYl9pbmZvLT5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgPSAoZGVzYy5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50IC8gOCkgKiBkZXNjLmR3V2lkdGggKiBkZXNjLmR3SGVpZ2h0OwotCWJfaW5mby0+Ym1pSGVhZGVyLmJpWFBlbHNQZXJNZXRlciA9IDA7Ci0JYl9pbmZvLT5ibWlIZWFkZXIuYmlZUGVsc1Blck1ldGVyID0gMDsKLQliX2luZm8tPmJtaUhlYWRlci5iaUNsclVzZWQgPSAwOwotCWJfaW5mby0+Ym1pSGVhZGVyLmJpQ2xySW1wb3J0YW50ID0gMDsKLQotCXN3aXRjaCAoZGVzYy5kZHBmUGl4ZWxGb3JtYXQudS5kd1JHQkJpdENvdW50KSB7Ci0JY2FzZSAxNjoKLQljYXNlIDMyOgotI2lmIDAKLQkgICAgewotCQlEV09SRCAqbWFza3MgPSAoRFdPUkQgKikgJihiX2luZm8tPmJtaUNvbG9ycyk7Ci0KLQkJdXNhZ2UgPSAwOwotCQltYXNrc1swXSA9IGRlc2MuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkJpdE1hc2s7Ci0JCW1hc2tzWzFdID0gZGVzYy5kZHBmUGl4ZWxGb3JtYXQudTIuZHdHQml0TWFzazsKLQkJbWFza3NbMl0gPSBkZXNjLmRkcGZQaXhlbEZvcm1hdC51My5kd0JCaXRNYXNrOwotCSAgICB9Ci0JICAgIGJyZWFrOwotI2VuZGlmCi0JY2FzZSAyNDoKLQkgICAgLyogTm90aGluZyB0byBkbyAqLwotCSAgICB1c2FnZSA9IERJQl9SR0JfQ09MT1JTOwotCSAgICBicmVhazsKLQotCWRlZmF1bHQ6IHsKLQkJaW50IGk7Ci0KLQkJLyogRmlsbCB0aGUgcGFsZXR0ZSAqLwotCQl1c2FnZSA9IERJQl9SR0JfQ09MT1JTOwotCi0JCWlmIChUaGlzLT5zLnBhbGV0dGUgPT0gTlVMTCkgewotCQkgICAgRVJSKCJCYWQgcGFsZXR0ZSAhISFcbiIpOwotCQl9IGVsc2UgewotCQkgICAgUkdCUVVBRCAqcmdiID0gKFJHQlFVQUQgKikgJihiX2luZm8tPmJtaUNvbG9ycyk7Ci0JCSAgICBQQUxFVFRFRU5UUlkgKnBlbnQgPSAoUEFMRVRURUVOVFJZICopJihUaGlzLT5zLnBhbGV0dGUtPnBhbGVudHMpOwotCi0JCSAgICBmb3IgKGk9MDtpPCgxPDxkZXNjLmRkcGZQaXhlbEZvcm1hdC51LmR3UkdCQml0Q291bnQpO2krKykgewotCQkJcmdiW2ldLnJnYkJsdWUgPSBwZW50W2ldLnBlQmx1ZTsKLQkJCXJnYltpXS5yZ2JSZWQgPSBwZW50W2ldLnBlUmVkOwotCQkJcmdiW2ldLnJnYkdyZWVuID0gcGVudFtpXS5wZUdyZWVuOyAKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICAgIGJyZWFrOwotCX0KLQlkZGMgPSBDcmVhdGVEQ0EoIkRJU1BMQVkiLE5VTEwsTlVMTCxOVUxMKTsKLQlUaGlzLT5zLkRJQnNlY3Rpb24gPSBkZGMgPyBESUJfQ3JlYXRlRElCU2VjdGlvbihkZGMsCi0JICAgIGJfaW5mbywKLQkgICAgdXNhZ2UsCi0JICAgICYoVGhpcy0+cy5iaXRtYXBfZGF0YSksCi0JICAgIDAsCi0JICAgIChEV09SRClkZXNjLnUxLmxwU3VyZmFjZSwKLQkgICAgZGVzYy5sUGl0Y2gKLQkpIDogMDsKLQlpZiAoIVRoaXMtPnMuRElCc2VjdGlvbikgewotCQlFUlIoIkNyZWF0ZURJQlNlY3Rpb24gZmFpbGVkIVxuIik7Ci0JCWlmIChkZGMpIERlbGV0ZURDKGRkYyk7Ci0JCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGJfaW5mbyk7Ci0JCXJldHVybiBFX0ZBSUw7Ci0JfQotCVRSQUNFKCJESUJTZWN0aW9uIGF0IDogJXBcbiIsIFRoaXMtPnMuYml0bWFwX2RhdGEpOwotCi0JLyogYl9pbmZvIGlzIG5vdCB1c2VmdWwgYW55bW9yZSAqLwotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGJfaW5mbyk7Ci0KLQkvKiBDcmVhdGUgdGhlIERDICovCi0JVGhpcy0+cy5oZGMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGRjKTsKLQlUaGlzLT5zLmhvbGRiaXRtYXAgPSBTZWxlY3RPYmplY3QoVGhpcy0+cy5oZGMsIFRoaXMtPnMuRElCc2VjdGlvbik7Ci0KLQlpZiAoZGRjKSBEZWxldGVEQyhkZGMpOwotICAgIH0KLQotICAgIGlmIChUaGlzLT5zLmJpdG1hcF9kYXRhICE9IGRlc2MudTEubHBTdXJmYWNlKSB7Ci0gICAgICAgIEZJWE1FKCJESUJTZWN0aW9uIG5vdCBjcmVhdGVkIGZvciBmcmFtZSBidWZmZXIsIHJldmVydGluZyB0byBvbGQgY29kZVxuIik7Ci0JLyogQ29weSBvdXIgc3VyZmFjZSBpbiB0aGUgRElCIHNlY3Rpb24gKi8KLQlpZiAoKEdFVF9CUFAoZGVzYykgKiBkZXNjLmR3V2lkdGgpID09IGRlc2MubFBpdGNoKQotCSAgICBtZW1jcHkoVGhpcy0+cy5iaXRtYXBfZGF0YSxkZXNjLnUxLmxwU3VyZmFjZSxkZXNjLmxQaXRjaCpkZXNjLmR3SGVpZ2h0KTsKLQllbHNlCi0JICAgIC8qIFRPRE8gKi8KLQkgICAgRklYTUUoIlRoaXMgY2FzZSBoYXMgdG8gYmUgZG9uZSA6L1xuIik7Ci0gICAgfQotCi0gICAgaWYgKGxwaGRjKSB7Ci0JVFJBQ0UoIkhEQyA6ICUwOGx4XG4iLCAoRFdPUkQpIFRoaXMtPnMuaGRjKTsKLQkqbHBoZGMgPSBUaGlzLT5zLmhkYzsKLSAgICB9Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1JlbGVhc2VEQyhMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxIREMgaGRjKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLQotICAgIFRSQUNFKCIoJXApLT4oMHglMDhseClcbiIsVGhpcywobG9uZyloZGMpOwotCi0gICAgaWYgKFRoaXMtPnMuYml0bWFwX2RhdGEgIT0gVGhpcy0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlKSB7Ci0JVFJBQ0UoICJDb3B5aW5nIERJQlNlY3Rpb24gYXQgOiAlcFxuIiwgVGhpcy0+cy5iaXRtYXBfZGF0YSk7Ci0JLyogQ29weSB0aGUgRElCIHNlY3Rpb24gdG8gb3VyIHN1cmZhY2UgKi8KLQlpZiAoKEdFVF9CUFAoVGhpcy0+cy5zdXJmYWNlX2Rlc2MpICogVGhpcy0+cy5zdXJmYWNlX2Rlc2MuZHdXaWR0aCkgPT0gVGhpcy0+cy5zdXJmYWNlX2Rlc2MubFBpdGNoKSB7Ci0JICAgIG1lbWNweShUaGlzLT5zLnN1cmZhY2VfZGVzYy51MS5scFN1cmZhY2UsIFRoaXMtPnMuYml0bWFwX2RhdGEsIFRoaXMtPnMuc3VyZmFjZV9kZXNjLmxQaXRjaCAqIFRoaXMtPnMuc3VyZmFjZV9kZXNjLmR3SGVpZ2h0KTsKLQl9IGVsc2UgewotCSAgICAvKiBUT0RPICovCi0JICAgIEZJWE1FKCJUaGlzIGNhc2UgaGFzIHRvIGJlIGRvbmUgOi9cbiIpOwotCX0KLSAgICB9Ci0gICAgLyogVW5sb2NrIHRoZSBzdXJmYWNlICovCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNF9VbmxvY2soaWZhY2UsVGhpcy0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlKTsKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1F1ZXJ5SW50ZXJmYWNlKAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLFJFRklJRCByZWZpaWQsTFBWT0lEICpvYmoKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmVmaWlkKSxvYmopOwotICAgIAotICAgIC8qIEFsbCBEaXJlY3REcmF3U3VyZmFjZSB2ZXJzaW9ucyAoMSwgMiwgMyBhbmQgNCkgdXNlCi0gICAgICogdGhlIHNhbWUgaW50ZXJmYWNlLiBBbmQgSVVua25vd24gZG9lcyB0aGF0IHRvbyBvZiBjb3Vyc2UuCi0gICAgICovCi0gICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhd1N1cmZhY2U0LCByZWZpaWQgKQl8fAotCSBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhd1N1cmZhY2UzLCByZWZpaWQgKQl8fAotCSBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhd1N1cmZhY2UyLCByZWZpaWQgKQl8fAotCSBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhd1N1cmZhY2UsICByZWZpaWQgKQl8fAotCSBJc0VxdWFsR1VJRCggJklJRF9JVW5rbm93biwgICAgICAgICAgICByZWZpaWQgKQotICAgICkgewotCSAgICAqb2JqID0gVGhpczsKLQkgICAgSURpcmVjdERyYXdTdXJmYWNlNF9BZGRSZWYoaWZhY2UpOwotCi0JICAgIFRSQUNFKCIgIENyZWF0aW5nIElEaXJlY3REcmF3U3VyZmFjZSBpbnRlcmZhY2UgKCVwKVxuIiwgKm9iaik7Ci0JICAgIHJldHVybiBTX09LOwotICAgIH0KLSAgICBGSVhNRSgiKCVwKTppbnRlcmZhY2UgZm9yIElJRCAlcyBOT1QgZm91bmQhXG4iLFRoaXMsZGVidWdzdHJfZ3VpZChyZWZpaWQpKTsKLSAgICByZXR1cm4gT0xFX0VfRU5VTV9OT01PUkU7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0lzTG9zdChMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgVFJBQ0UoIiglcCktPigpLCBzdHViIVxuIixUaGlzKTsKLSAgICByZXR1cm4gRERfT0s7IC8qIGhtbSAqLwotfQotCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9FbnVtQXR0YWNoZWRTdXJmYWNlcygKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUFZPSUQgY29udGV4dCxMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0sgZXNmY2IKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgaW50IGk7Ci0gICAgc3RydWN0IF9zdXJmYWNlX2NoYWluICpjaGFpbiA9IFRoaXMtPnMuY2hhaW47Ci0KLSAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIixUaGlzLGNvbnRleHQsZXNmY2IpOwotICAgIGlmIChjaGFpbikgewotCWZvciAoaT0wO2k8Y2hhaW4tPm5yb2ZzdXJmYWNlcztpKyspIHsKLQkgICAgVFJBQ0UoICJFbnVtZXJhdGluZyBhdHRhY2hlZCBzdXJmYWNlICglcClcbiIsIGNoYWluLT5zdXJmYWNlc1tpXSk7Ci0JICAgIGlmIChlc2ZjYigoTFBESVJFQ1REUkFXU1VSRkFDRSkgY2hhaW4tPnN1cmZhY2VzW2ldLCAmKGNoYWluLT5zdXJmYWNlc1tpXS0+cy5zdXJmYWNlX2Rlc2MpLCBjb250ZXh0KSA9PSBEREVOVU1SRVRfQ0FOQ0VMKQotCQlyZXR1cm4gRERfT0s7IC8qIEZJWE1FOiByZXR1cm4gdmFsdWUgY29ycmVjdD8gKi8KLQl9Ci0gICAgfQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUmVzdG9yZShMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPigpLHN0dWIhXG4iLFRoaXMpOwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfU2V0Q29sb3JLZXkoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsIERXT1JEIGR3RmxhZ3MsIExQRERDT0xPUktFWSBja2V5ICkgCitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Jc0xvc3QoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UpCiB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwKS0+KDB4JTA4bHgsJXApXG4iLFRoaXMsZHdGbGFncyxja2V5KTsKLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0JX2R1bXBfY29sb3JrZXlmbGFnKGR3RmxhZ3MpOwotCURQUklOVEYoIiA6ICIpOwotCV9kdW1wX0REQ09MT1JLRVkoKHZvaWQgKikgY2tleSk7Ci0JRFBSSU5URigiXG4iKTsKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgaWZhY2UpOworCisgICAgVFJBQ0UoIiglcCkgaXMlcyBsb3N0XG4iLFRoaXMsIChUaGlzLT5sb3N0ID8gIiIgOiAiIG5vdCIpKTsKKyAgICByZXR1cm4gVGhpcy0+bG9zdCA/IERERVJSX1NVUkZBQ0VMT1NUIDogRERfT0s7Cit9CisKKworLyogWFhYIFRoaXMgZG9lc24ndCBhY3R1YWxseSBkbyBhbnkgbG9ja2luZyBvciBrZWVwIHRyYWNrIG9mIHRoZSBsb2NrZWQKKyAqIHJlY3RhbmdsZXMuIFRoZSBiZWhhdmlvdXIgaXMgcG9vcmx5IGRvY3VtZW50ZWQuICovCitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Mb2NrKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBMUFJFQ1QgcHJlY3QsCisJCQkgICAgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwgRFdPUkQgZmxhZ3MsIEhBTkRMRSBoKQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBpZmFjZSk7CisKKyAgICBUUkFDRSgiKCVwKS0+TG9jayglcCwlcCwlMDhseCwlMDhseClcbiIsVGhpcyxwcmVjdCxwRERTRCxmbGFncywoRFdPUkQpaCk7CisKKyAgICBpZiAoZmxhZ3MgJiB+KERETE9DS19XQUlUfERETE9DS19SRUFET05MWXxERExPQ0tfV1JJVEVPTkxZKSkKKwlXQVJOKCIoJXApLT5Mb2NrKCVwLCVwLCUwOGx4LCUwOGx4KVxuIiwKKwkJIFRoaXMscHJlY3QscEREU0QsZmxhZ3MsKERXT1JEKWgpOworCisgICAgLyogRmlyc3QsIGNvcHkgdGhlIFN1cmZhY2UgZGVzY3JpcHRpb24gKi8KKyAgICBtZW1jcHkocEREU0QsICYoVGhpcy0+c3VyZmFjZV9kZXNjKSwgcEREU0QtPmR3U2l6ZSk7CisgICAgVFJBQ0UoImxvY2tlZCBzdXJmYWNlOiBoZWlnaHQ9JWxkLCB3aWR0aD0lbGQsIHBpdGNoPSVsZFxuIiwKKwkgIHBERFNELT5kd0hlaWdodCxwRERTRC0+ZHdXaWR0aCxwRERTRC0+dTEubFBpdGNoKTsKKworICAgIC8qIElmIGFza2VkIG9ubHkgZm9yIGEgcGFydCwgY2hhbmdlIHRoZSBzdXJmYWNlIHBvaW50ZXIuCisgICAgICogKE5vdCBkb2N1bWVudGVkLikgKi8KKyAgICBpZiAocHJlY3QgIT0gTlVMTCkgeworCVRSQUNFKCIJbHByZWN0OiAlZHglZC0lZHglZFxuIiwKKwkJcHJlY3QtPnRvcCxwcmVjdC0+bGVmdCxwcmVjdC0+Ym90dG9tLHByZWN0LT5yaWdodAorCSk7CisJaWYgKChwcmVjdC0+dG9wIDwgMCkgfHwKKwkgICAgKHByZWN0LT5sZWZ0IDwgMCkgfHwKKwkgICAgKHByZWN0LT5ib3R0b20gPCAwKSB8fAorCSAgICAocHJlY3QtPnJpZ2h0IDwgMCkpIHsKKwkgIEVSUigiIE5lZ2F0aXZlIHZhbHVlcyBpbiBMUFJFQ1QgISEhXG4iKTsKKwkgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOworICAgICAgIH0KKworCVRoaXMtPmxvY2tfdXBkYXRlKFRoaXMsIHByZWN0KTsKKyAgICAgICAKKwlwRERTRC0+bHBTdXJmYWNlID0gKGNoYXIgKilUaGlzLT5zdXJmYWNlX2Rlc2MubHBTdXJmYWNlCisJICAgICsgcHJlY3QtPnRvcCAqIFRoaXMtPnN1cmZhY2VfZGVzYy51MS5sUGl0Y2gKKwkgICAgKyBwcmVjdC0+bGVmdCAqIEdFVF9CUFAoVGhpcy0+c3VyZmFjZV9kZXNjKTsKICAgICB9CiAKLSAgICAvKiBJZiB0aGlzIHN1cmZhY2Ugd2FzIGxvYWRlZCBhcyBhIHRleHR1cmUsIGNhbGwgYWxzbyB0aGUgdGV4dHVyZQotICAgICAqIFNldENvbG9yS2V5IGNhbGxiYWNrLiBGSVhNRTogaGFjayBhcHByb2FjaCA6KAotICAgICAqLwotICAgIGlmIChUaGlzLT5zLnRleHR1cmUpCi0JVGhpcy0+cy5TZXRDb2xvcktleV9jYihUaGlzLT5zLnRleHR1cmUsIGR3RmxhZ3MsIGNrZXkpOwotCi0gICAgaWYoIGR3RmxhZ3MgJiBERENLRVlfU1JDQkxUICkgewotCWR3RmxhZ3MgJj0gfkREQ0tFWV9TUkNCTFQ7Ci0JVGhpcy0+cy5zdXJmYWNlX2Rlc2MuZHdGbGFncyB8PSBERFNEX0NLU1JDQkxUOwotCW1lbWNweSggJihUaGlzLT5zLnN1cmZhY2VfZGVzYy5kZGNrQ0tTcmNCbHQpLCBja2V5LCBzaXplb2YoICpja2V5ICkgKTsKLSAgICB9Ci0KLSAgICBpZiggZHdGbGFncyAmIEREQ0tFWV9ERVNUQkxUICkgewotCWR3RmxhZ3MgJj0gfkREQ0tFWV9ERVNUQkxUOwotCVRoaXMtPnMuc3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9DS0RFU1RCTFQ7Ci0JbWVtY3B5KCAmKFRoaXMtPnMuc3VyZmFjZV9kZXNjLmRkY2tDS0Rlc3RCbHQpLCBja2V5LCBzaXplb2YoICpja2V5ICkgKTsKLSAgICB9Ci0KLSAgICBpZiggZHdGbGFncyAmIEREQ0tFWV9TUkNPVkVSTEFZICkgewotCWR3RmxhZ3MgJj0gfkREQ0tFWV9TUkNPVkVSTEFZOwotCVRoaXMtPnMuc3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9DS1NSQ09WRVJMQVk7Ci0JbWVtY3B5KCAmKFRoaXMtPnMuc3VyZmFjZV9kZXNjLmRkY2tDS1NyY092ZXJsYXkpLCBja2V5LCBzaXplb2YoICpja2V5ICkgKTsJICAgCi0gICAgfQotCi0gICAgaWYoIGR3RmxhZ3MgJiBERENLRVlfREVTVE9WRVJMQVkgKSB7Ci0JZHdGbGFncyAmPSB+RERDS0VZX0RFU1RPVkVSTEFZOwotCVRoaXMtPnMuc3VyZmFjZV9kZXNjLmR3RmxhZ3MgfD0gRERTRF9DS0RFU1RPVkVSTEFZOwotCW1lbWNweSggJihUaGlzLT5zLnN1cmZhY2VfZGVzYy5kZGNrQ0tEZXN0T3ZlcmxheSksIGNrZXksIHNpemVvZiggKmNrZXkgKSApOwkgICAKLSAgICB9Ci0gICAgaWYoIGR3RmxhZ3MgKQotCUZJWE1FKCJ1bmhhbmRsZWQgZHdGbGFnczogMHglMDhseFxuIiwgZHdGbGFncyApOwogICAgIHJldHVybiBERF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfQWRkT3ZlcmxheURpcnR5UmVjdCgKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSwgTFBSRUNUIGxwUmVjdAotKSB7Ci0gIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gIEZJWE1FKCIoJXApLT4oJXApLHN0dWIhXG4iLFRoaXMsbHBSZWN0KTsgCi0KLSAgcmV0dXJuIEREX09LOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfUGFnZUxvY2soTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIERXT1JEIGR3RmxhZ3MpCit7CisgICAgLyogU29tZSBzdXJmYWNlIHR5cGVzIHNob3VsZCByZXR1cm4gRERFUlJfQ0FOVFBBR0VMT0NLLiAqLworICAgIHJldHVybiBERF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfRGVsZXRlQXR0YWNoZWRTdXJmYWNlKAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLCBEV09SRCBkd0ZsYWdzLAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGxwRERTQXR0YWNoZWRTdXJmYWNlCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICAgIGludCBpOwotICAgIHN0cnVjdCBfc3VyZmFjZV9jaGFpbiAqY2hhaW47CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9QYWdlVW5sb2NrKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBEV09SRCBkd0ZsYWdzKQoreworICAgIC8qIFNvbWUgc3VyZmFjZSB0eXBlcyBzaG91bGQgcmV0dXJuIERERVJSX0NBTlRQQUdFVU5MT0NLLCBhbmQgd2Ugc2hvdWxkCisgICAgICoga2VlcCB0cmFjayBzbyB3ZSBjYW4gcmV0dXJuIERERVJSX05PVFBBR0VMT0NLRUQgYXMgYXBwcm9wcmlhdGUuICovCisgICAgcmV0dXJuIEREX09LOworfQogCi0gICAgVFJBQ0UoIiglcCktPigweCUwOGx4LCVwKVxuIixUaGlzLGR3RmxhZ3MsbHBERFNBdHRhY2hlZFN1cmZhY2UpOwotICAgIGNoYWluID0gVGhpcy0+cy5jaGFpbjsKLSAgICBmb3IgKGk9MDtpPGNoYWluLT5ucm9mc3VyZmFjZXM7aSsrKSB7Ci0JaWYgKChJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCopbHBERFNBdHRhY2hlZFN1cmZhY2U9PWNoYWluLT5zdXJmYWNlc1tpXSl7Ci0JICAgIC8qIFRoZXJlIGlzIG5vIEFkZFJlZiBpbiBBZGRBdHRhY2hlZFN1cmZhY2UsIHNvIHdoeSBhIHJlbGVhc2UgaGVyZSA6LSkgCi0JICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTRfUmVsZWFzZShscEREU0F0dGFjaGVkU3VyZmFjZSk7ICovCitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlREMoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIEhEQyBoREMpCit7CisgICAgSFJFU1VMVCBocjsKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgaWZhY2UpOwogCi0JICAgIGNoYWluLT5zdXJmYWNlc1tpXS0+cy5jaGFpbiA9IE5VTEw7Ci0JICAgIG1lbWNweSggY2hhaW4tPnN1cmZhY2VzK2ksCi0JCSAgICBjaGFpbi0+c3VyZmFjZXMrKGkrMSksCi0JCSAgICAoY2hhaW4tPm5yb2ZzdXJmYWNlcy1pLTEpKnNpemVvZihjaGFpbi0+c3VyZmFjZXNbaV0pCi0JICAgICk7Ci0JICAgIGNoYWluLT5zdXJmYWNlcyA9IEhlYXBSZUFsbG9jKAotCQlHZXRQcm9jZXNzSGVhcCgpLAotCQkwLAotCQljaGFpbi0+c3VyZmFjZXMsCi0JCXNpemVvZihjaGFpbi0+c3VyZmFjZXNbaV0pKihjaGFpbi0+bnJvZnN1cmZhY2VzLTEpCi0JICAgICk7Ci0JICAgIGNoYWluLT5ucm9mc3VyZmFjZXMtLTsKLQkgICAgcmV0dXJuIEREX09LOworICAgIFRSQUNFKCIoJXApLT4oJTA4eClcbiIsVGhpcyxoREMpOworCisgICAgaWYgKCFUaGlzLT5kY19pbl91c2UgfHwgVGhpcy0+aERDICE9IGhEQykKKwlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKworICAgIFRoaXMtPnJlbGVhc2VfZGMoVGhpcywgaERDKTsKKworICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19VbmxvY2soaWZhY2UsIE5VTEwpOworICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7CisKKyAgICBUaGlzLT5kY19pbl91c2UgPSBGQUxTRTsKKyAgICBUaGlzLT5oREMgPSAwOworCisgICAgcmV0dXJuIEREX09LOworfQorCisvKiBSZXN0b3JlICovCisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldENsaXBwZXIoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICBMUERJUkVDVERSQVdDTElQUEVSIHBERENsaXBwZXIpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMscEREQ2xpcHBlcik7CisgICAgaWYgKHBERENsaXBwZXIgPT0gSUNPTV9JTlRFUkZBQ0UoVGhpcy0+Y2xpcHBlciwgSURpcmVjdERyYXdDbGlwcGVyKSkKKwlyZXR1cm4gRERfT0s7CisKKyAgICBpZiAoVGhpcy0+Y2xpcHBlciAhPSBOVUxMKQorCUlEaXJlY3REcmF3Q2xpcHBlcl9SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMtPmNsaXBwZXIsCisJCQkJCQkgIElEaXJlY3REcmF3Q2xpcHBlcikpOworCisgICAgVGhpcy0+Y2xpcHBlciA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3Q2xpcHBlckltcGwsIElEaXJlY3REcmF3Q2xpcHBlciwKKwkJCQlwRERDbGlwcGVyKTsKKyAgICBpZiAocEREQ2xpcHBlciAhPSBOVUxMKQorCUlEaXJlY3REcmF3Q2xpcHBlcl9BZGRSZWYocEREQ2xpcHBlcik7CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldENvbG9yS2V5KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgIERXT1JEIGR3RmxhZ3MsIExQRERDT0xPUktFWSBwQ0tleSkKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgaWZhY2UpOworCisgICAgVFJBQ0UoIiglcCktPiglMDhseCwlcClcbiIsVGhpcyxkd0ZsYWdzLHBDS2V5KTsKKyAgICBpZiAocENLZXkgPT0gTlVMTCkKKyAgICB7CisJRklYTUUoInN1cHBvc2VkbHkgcmVtb3ZpbmcgY29sb3Iga2V5ICVsdVxuIiwKKwkgICAgICBkd0ZsYWdzICYgfkREQ0tFWV9DT0xPUlNQQUNFKTsKKwlyZXR1cm4gRERfT0s7CisgICAgfQorCisgICAgc3dpdGNoIChkd0ZsYWdzICYgfkREQ0tFWV9DT0xPUlNQQUNFKQorICAgIHsKKyAgICBjYXNlIEREQ0tFWV9ERVNUQkxUOgorCVRoaXMtPnN1cmZhY2VfZGVzYy5kZGNrQ0tEZXN0Qmx0ID0gKnBDS2V5OworCWJyZWFrOworCisgICAgY2FzZSBERENLRVlfREVTVE9WRVJMQVk6CisJVGhpcy0+c3VyZmFjZV9kZXNjLnUzLmRkY2tDS0Rlc3RPdmVybGF5ID0gKnBDS2V5OworCWJyZWFrOworCisgICAgY2FzZSBERENLRVlfU1JDT1ZFUkxBWToKKwlUaGlzLT5zdXJmYWNlX2Rlc2MuZGRja0NLU3JjT3ZlcmxheSA9ICpwQ0tleTsKKwlicmVhazsKKworICAgIGNhc2UgRERDS0VZX1NSQ0JMVDoKKwlUaGlzLT5zdXJmYWNlX2Rlc2MuZGRja0NLU3JjQmx0ID0gKnBDS2V5OworCWJyZWFrOworCisgICAgZGVmYXVsdDoKKwlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKKyAgICB9CisKKyAgICByZXR1cm4gRERfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldExPRChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgRFdPUkQgZHdNYXhMT0QpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKworICAgIFRSQUNFKCIoJXApLT4oJTA4bHgpXG4iLFRoaXMsZHdNYXhMT0QpOworICAgIENIRUNLX1RFWFRVUkUoVGhpcyk7CisKKyAgICBUaGlzLT5tYXhfbG9kID0gZHdNYXhMT0Q7CisgICAgcmV0dXJuIEREX09LOworfQorCitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRPdmVybGF5UG9zaXRpb24oTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJCSAgTE9ORyBYLCBMT05HIFkpCit7CisgICAgcmV0dXJuIERERVJSX05PVEFPVkVSTEFZU1VSRkFDRTsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UGFsZXR0ZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkgIExQRElSRUNURFJBV1BBTEVUVEUgcFBhbGV0dGUpCit7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKworICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLFRoaXMscFBhbGV0dGUpOworICAgIGlmIChwUGFsZXR0ZSA9PSBJQ09NX0lOVEVSRkFDRShUaGlzLT5wYWxldHRlLCBJRGlyZWN0RHJhd1BhbGV0dGUpKQorCXJldHVybiBERF9PSzsKKworICAgIGlmIChUaGlzLT5wYWxldHRlICE9IE5VTEwpIHsKKwlpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSkKKwkgICAgVGhpcy0+cGFsZXR0ZS0+ZmxhZ3MgJj0gfkREUENBUFNfUFJJTUFSWVNVUkZBQ0U7CisJSURpcmVjdERyYXdQYWxldHRlX1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+cGFsZXR0ZSwKKwkJCQkJCSAgSURpcmVjdERyYXdQYWxldHRlKSk7CisgICAgfQorCisgICAgVGhpcy0+cGFsZXR0ZSA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSwKKwkJCQlwUGFsZXR0ZSk7CisgICAgaWYgKHBQYWxldHRlICE9IE5VTEwpIHsKKwlJRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmKHBQYWxldHRlKTsKKwlpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSkKKwkgICAgVGhpcy0+cGFsZXR0ZS0+ZmxhZ3MgfD0gRERQQ0FQU19QUklNQVJZU1VSRkFDRTsKKyAgICB9CisKKyAgICBUaGlzLT5zZXRfcGFsZXR0ZShUaGlzLCBUaGlzLT5wYWxldHRlKTsKKworICAgIHJldHVybiBERF9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UHJpb3JpdHkoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICAgRFdPUkQgZHdQcmlvcml0eSkKK3sKKyAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgaWZhY2UpOworCisgICAgVFJBQ0UoIiglcCktPiglMDhseClcbiIsVGhpcyxkd1ByaW9yaXR5KTsKKyAgICBDSEVDS19URVhUVVJFKFRoaXMpOworCisgICAgVGhpcy0+cHJpb3JpdHkgPSBkd1ByaW9yaXR5OworICAgIHJldHVybiBERF9PSzsKK30KKworLyogQmUgY2FyZWZ1bCB3aGVuIGxvY2tpbmcgdGhpczogaXQgaXMgcmlza3kgdG8gY2FsbCB0aGUgb2JqZWN0J3MgQWRkUmVmCisgKiBvciBSZWxlYXNlIGhvbGRpbmcgYSBsb2NrLiAqLworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UHJpdmF0ZURhdGEoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICAgICAgUkVGR1VJRCB0YWcsIExQVk9JRCBwRGF0YSwKKwkJCQkgICAgICBEV09SRCBjYlNpemUsIERXT1JEIGR3RmxhZ3MpCit7CisgICAgUHJpdmF0ZURhdGEqIGRhdGE7CisgICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIGlmYWNlKTsKKworICAgIGRhdGEgPSBmaW5kX3ByaXZhdGVfZGF0YShUaGlzLCB0YWcpOworICAgIGlmIChkYXRhID09IE5VTEwpCisgICAgeworCWRhdGEgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKGRhdGEgPT0gTlVMTCkgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOworCisJZGF0YS0+dGFnID0gKnRhZzsKKwlkYXRhLT5mbGFncyA9IGR3RmxhZ3M7CisJZGF0YS0+dW5pcXVlbmVzc192YWx1ZSA9IFRoaXMtPnVuaXF1ZW5lc3NfdmFsdWU7CisKKwlpZiAoZHdGbGFncyAmIEREU1BEX0lVTktOT1dOUFRSKQorCXsKKwkgICAgZGF0YS0+cHRyLm9iamVjdCA9IChMUFVOS05PV04pcERhdGE7CisJICAgIGRhdGEtPnNpemUgPSBzaXplb2YoTFBVTktOT1dOKTsKKwkgICAgSVVua25vd25fQWRkUmVmKGRhdGEtPnB0ci5vYmplY3QpOwogCX0KKwllbHNlCisJeworCSAgICBkYXRhLT5wdHIuZGF0YSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBjYlNpemUpOworCSAgICBpZiAoZGF0YS0+cHRyLmRhdGEgPT0gTlVMTCkKKwkgICAgeworCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkYXRhKTsKKwkJcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOworCSAgICB9CisJfQorCisJLyogbGluayBpdCBpbiAqLworCWRhdGEtPm5leHQgPSBUaGlzLT5wcml2YXRlX2RhdGE7CisJZGF0YS0+cHJldiA9IE5VTEw7CisJaWYgKFRoaXMtPnByaXZhdGVfZGF0YSkKKwkgICAgVGhpcy0+cHJpdmF0ZV9kYXRhLT5wcmV2ID0gZGF0YTsKKwlUaGlzLT5wcml2YXRlX2RhdGEgPSBkYXRhOworCisJcmV0dXJuIEREX09LOwogICAgIH0KLSAgICByZXR1cm4gRERfT0s7Ci19CisgICAgZWxzZQorICAgIHsKKwkvKiBJIGRvbid0IGFjdHVhbGx5IGtub3cgaG93IHdpbmRvd3MgaGFuZGxlcyB0aGlzIGNhc2UuIFRoZSBvbmx5CisJICogcmVhc29uIEkgZG9uJ3QganVzdCBjYWxsIEZyZWVQcml2YXRlRGF0YSBpcyBiZWNhdXNlIEkgd2FudCB0bworCSAqIGd1YXJhbnRlZSBTZXRQcml2YXRlRGF0YSB3b3JraW5nIHdoZW4gdXNpbmcgTFBVTktOT1dOIG9yIGRhdGEKKwkgKiB0aGF0IGlzIG5vIGxhcmdlciB0aGFuIHRoZSBvbGQgZGF0YS4gKi8KIAotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfRW51bU92ZXJsYXlaT3JkZXJzKAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLCBEV09SRCBkd0ZsYWdzLCBMUFZPSUQgbHBDb250ZXh0LAotICAgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSyBscGZuQ2FsbGJhY2sKLSkgewotICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICBGSVhNRSgiKCVwKS0+KDB4JTA4bHgsJXAsJXApLHN0dWIhXG4iLCBUaGlzLGR3RmxhZ3MsCi0gICAgICAgICAgbHBDb250ZXh0LCBscGZuQ2FsbGJhY2sgKTsKLQotICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldENsaXBwZXIoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsIExQRElSRUNURFJBV0NMSVBQRVIqIGxwbHBERENsaXBwZXIKLSkgewotICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICBGSVhNRSgiKCVwKS0+KCVwKSxzdHViIVxuIiwgVGhpcywgbHBscEREQ2xpcHBlcik7Ci0KLSAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRDb2xvcktleSgKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSwgRFdPUkQgZHdGbGFncywgTFBERENPTE9SS0VZIGxwRERDb2xvcktleQotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBUUkFDRSgiKCVwKS0+KDB4JTA4bHgsJXApXG4iLCBUaGlzLCBkd0ZsYWdzLCBscEREQ29sb3JLZXkpOwotCi0gICAgaWYoIGR3RmxhZ3MgJiBERENLRVlfU1JDQkxUICkgIHsKLQlkd0ZsYWdzICY9IH5ERENLRVlfU1JDQkxUOwotCW1lbWNweSggbHBERENvbG9yS2V5LCAmKFRoaXMtPnMuc3VyZmFjZV9kZXNjLmRkY2tDS1NyY0JsdCksIHNpemVvZiggKmxwRERDb2xvcktleSApICk7CisJcmV0dXJuIEVfRkFJTDsKICAgICB9Ci0gICAgaWYoIGR3RmxhZ3MgJiBERENLRVlfREVTVEJMVCApIHsKLQlkd0ZsYWdzICY9IH5ERENLRVlfREVTVEJMVDsKLQltZW1jcHkoIGxwRERDb2xvcktleSwgJihUaGlzLT5zLnN1cmZhY2VfZGVzYy5kZGNrQ0tEZXN0Qmx0KSwgc2l6ZW9mKCAqbHBERENvbG9yS2V5ICkgKTsKLSAgICB9Ci0gICAgaWYoIGR3RmxhZ3MgJiBERENLRVlfU1JDT1ZFUkxBWSApIHsKLQlkd0ZsYWdzICY9IH5ERENLRVlfU1JDT1ZFUkxBWTsKLQltZW1jcHkoIGxwRERDb2xvcktleSwgJihUaGlzLT5zLnN1cmZhY2VfZGVzYy5kZGNrQ0tTcmNPdmVybGF5KSwgc2l6ZW9mKCAqbHBERENvbG9yS2V5ICkgKTsKLSAgICB9Ci0gICAgaWYoIGR3RmxhZ3MgJiBERENLRVlfREVTVE9WRVJMQVkgKSB7Ci0JZHdGbGFncyAmPSB+RERDS0VZX0RFU1RPVkVSTEFZOwotCW1lbWNweSggbHBERENvbG9yS2V5LCAmKFRoaXMtPnMuc3VyZmFjZV9kZXNjLmRkY2tDS0Rlc3RPdmVybGF5KSwgc2l6ZW9mKCAqbHBERENvbG9yS2V5ICkgKTsKLSAgICB9Ci0gICAgaWYoIGR3RmxhZ3MgKQotCUZJWE1FKCJ1bmhhbmRsZWQgZHdGbGFnczogMHglMDhseFxuIiwgZHdGbGFncyApOwotICAgIHJldHVybiBERF9PSzsKIH0KIAotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0RmxpcFN0YXR1cygKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSwgRFdPUkQgZHdGbGFncwotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwKS0+KDB4JTA4bHgpLHN0dWIhXG4iLCBUaGlzLCBkd0ZsYWdzKTsKKy8qIFNldFN1cmZhY2VEZXNjICovCisKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VubG9jayhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgTFBSRUNUIHBSZWN0KQoreworICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLGlmYWNlKTsKKworICAgIFRSQUNFKCIoJXApLT5VbmxvY2soJXApXG4iLFRoaXMscFJlY3QpOworCisgICAgVGhpcy0+dW5sb2NrX3VwZGF0ZShUaGlzLCBwUmVjdCk7CisgICAgaWYgKFRoaXMtPmF1eF91bmxvY2spCisJVGhpcy0+YXV4X3VubG9jayhUaGlzLT5hdXhfY3R4LCBUaGlzLT5hdXhfZGF0YSwgcFJlY3QpOwogCiAgICAgcmV0dXJuIEREX09LOwogfQogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRQYWxldHRlKAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLCBMUERJUkVDVERSQVdQQUxFVFRFKiBscGxwRERQYWxldHRlCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICAgIFRSQUNFKCIoJXApLT4oJXApLHN0dWIhXG4iLCBUaGlzLCBscGxwRERQYWxldHRlKTsKLQotICAgIGlmICghVGhpcy0+cy5wYWxldHRlKQotCXJldHVybiBEREVSUl9OT1BBTEVUVEVBVFRBQ0hFRDsKLQotICAgIElEaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYoIChJRGlyZWN0RHJhd1BhbGV0dGUqKSBUaGlzLT5zLnBhbGV0dGUgKTsKLSAgICAqbHBscEREUGFsZXR0ZSA9IChJRGlyZWN0RHJhd1BhbGV0dGUqKSBUaGlzLT5zLnBhbGV0dGU7Ci0gICAgcmV0dXJuIEREX09LOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkgICAgIExQUkVDVCBwU3JjUmVjdCwKKwkJCQkgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IHBEc3RTdXJmYWNlLAorCQkJCSAgICAgTFBSRUNUIHBEc3RSZWN0LCBEV09SRCBkd0ZsYWdzLAorCQkJCSAgICAgTFBERE9WRVJMQVlGWCBwRlgpCit7CisgICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOwogfQogCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRPdmVybGF5UG9zaXRpb24oCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsIExPTkcgbFgsIExPTkcgbFkKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPiglbGQsJWxkKSxzdHViIVxuIiwgVGhpcywgbFgsIGxZKTsKLQotICAgIHJldHVybiBERF9PSzsKKy8qIE1TRE46ICJub3QgY3VycmVudGx5IGltcGxlbWVudGVkLiIgKi8KK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VwZGF0ZU92ZXJsYXlEaXNwbGF5KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCQkgICAgRFdPUkQgZHdGbGFncykKK3sKKyAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7CiB9CiAKLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1VwZGF0ZU92ZXJsYXkoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsIExQUkVDVCBscFNyY1JlY3QsCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgbHBERERlc3RTdXJmYWNlLCBMUFJFQ1QgbHBEZXN0UmVjdCwgRFdPUkQgZHdGbGFncywKLSAgICBMUERET1ZFUkxBWUZYIGxwRERPdmVybGF5RngKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPiglcCwlcCwlcCwweCUwOGx4LCVwKSxzdHViIVxuIiwgVGhpcywKLQkgbHBTcmNSZWN0LCBscERERGVzdFN1cmZhY2UsIGxwRGVzdFJlY3QsIGR3RmxhZ3MsIGxwRERPdmVybGF5RnggKTsgIAotCi0gICAgcmV0dXJuIEREX09LOwotfQotIAotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfVXBkYXRlT3ZlcmxheURpc3BsYXkoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsIERXT1JEIGR3RmxhZ3MKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPigweCUwOGx4KSxzdHViIVxuIiwgVGhpcywgZHdGbGFncyk7IAotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9VcGRhdGVPdmVybGF5Wk9yZGVyKAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLERXT1JEIGR3RmxhZ3MsTFBESVJFQ1REUkFXU1VSRkFDRTQgbHBERFNSZWZlcmVuY2UKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPigweCUwOGx4LCVwKSxzdHViIVxuIiwgVGhpcywgZHdGbGFncywgbHBERFNSZWZlcmVuY2UpOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXREREludGVyZmFjZSgKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSwgTFBWT0lEKiBscGxwREQKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPiglcCksc3R1YiFcbiIsIFRoaXMsIGxwbHBERCk7Ci0KLSAgICAvKiBOb3Qgc3VyZSBhYm91dCB0aGF0Li4uICovCi0KLSAgICBJRGlyZWN0RHJhd19BZGRSZWYoKExQRElSRUNURFJBVylUaGlzLT5zLmRkcmF3KSwKLSAgICAqbHBscEREID0gKHZvaWQgKikgVGhpcy0+cy5kZHJhdzsKLQotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUGFnZUxvY2soCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsIERXT1JEIGR3RmxhZ3MKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPigweCUwOGx4KSxzdHViIVxuIiwgVGhpcywgZHdGbGFncyk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1BhZ2VVbmxvY2soCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsIERXT1JEIGR3RmxhZ3MKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgRklYTUUoIiglcCktPigweCUwOGx4KSxzdHViIVxuIiwgVGhpcywgZHdGbGFncyk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1NldFN1cmZhY2VEZXNjKAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLCBMUEREU1VSRkFDRURFU0MgbHBERFNELCBEV09SRCBkd0ZsYWdzCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICAgIEZJWE1FKCIoJXApLT4oJXAsMHglMDhseCksc3R1YiFcbiIsIFRoaXMsIGxwRERTRCwgZHdGbGFncyk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1NldFByaXZhdGVEYXRhKAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLCBSRUZHVUlEIGd1aWRUYWcsIExQVk9JRCBscERhdGEsIERXT1JEIGNiU2l6ZSwKLSAgICBEV09SRCBkd0ZsYWdzCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICAgIEZJWE1FKCIoJXApLT4oJXAsJXAsJWxkLCUwOGx4XG4iLCBUaGlzLCBndWlkVGFnLCBscERhdGEsIGNiU2l6ZSwgZHdGbGFncyk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldFByaXZhdGVEYXRhKAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLCBSRUZHVUlEIGd1aWRUYWcsIExQVk9JRCBscEJ1ZmZlciwKLSAgICBMUERXT1JEIGxwY2JCdWZmZXJTaXplCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICAgIEZJWE1FKCIoJXApLT4oJXAsJXAsJXApXG4iLCBUaGlzLCBndWlkVGFnLCBscEJ1ZmZlciwgbHBjYkJ1ZmZlclNpemUpOwotCi0gICAgcmV0dXJuIEREX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9GcmVlUHJpdmF0ZURhdGEoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsIFJFRkdVSUQgZ3VpZFRhZwotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgZ3VpZFRhZyk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldFVuaXF1ZW5lc3NWYWx1ZSgKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSwgTFBEV09SRCBscFZhbHVlCi0pICB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBWYWx1ZSk7Ci0KLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLUhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0NoYW5nZVVuaXF1ZW5lc3NWYWx1ZSgKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZQotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBGSVhNRSgiKCVwKVxuIiwgVGhpcyk7Ci0KLSAgICByZXR1cm4gRERfT0s7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5Wk9yZGVyKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCQkgICBEV09SRCBkd0ZsYWdzLAorCQkJCQkgICBMUERJUkVDVERSQVdTVVJGQUNFNyBwRERTUmVmKQoreworICAgIHJldHVybiBEREVSUl9OT1RBT1ZFUkxBWVNVUkZBQ0U7CiB9CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RzdXJmYWNlL21haW4uaCBiL2RsbHMvZGRyYXcvZHN1cmZhY2UvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MzA5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RzdXJmYWNlL21haW4uaApAQCAtMCwwICsxLDIxNSBAQAorLyogQ29weXJpZ2h0IDIwMDAgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4gKi8KKworI2lmbmRlZiBERFJBV19EU1VSRkFDRV9NQUlOX0hfSU5DTFVERUQKKyNkZWZpbmUgRERSQVdfRFNVUkZBQ0VfTUFJTl9IX0lOQ0xVREVECisKKyNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCisKKy8qIFN1cHBvcnQgZm9yIElEaXJlY3REcmF3U3VyZmFjZTc6OlNldC9HZXQvRnJlZVByaXZhdGVEYXRhLiBJIGRvbid0IHRoaW5rCisgKiBhbnlib2R5IHVzZXMgaXQgZm9yIG11Y2ggc28gYSBnb29kIGltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLiAqLwordHlwZWRlZiBzdHJ1Y3QgUHJpdmF0ZURhdGEKK3sKKyAgICBzdHJ1Y3QgUHJpdmF0ZURhdGEqIG5leHQ7CisgICAgc3RydWN0IFByaXZhdGVEYXRhKiBwcmV2OworCisgICAgR1VJRCB0YWc7CisgICAgRFdPUkQgZmxhZ3M7IC8qIEREU1BEXyogKi8KKyAgICBEV09SRCB1bmlxdWVuZXNzX3ZhbHVlOworCisgICAgdW5pb24KKyAgICB7CisJTFBWT0lEIGRhdGE7CisJTFBVTktOT1dOIG9iamVjdDsKKyAgICB9IHB0cjsKKworICAgIERXT1JEIHNpemU7Cit9IFByaXZhdGVEYXRhOworCisvKiBOb24taW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworSFJFU1VMVAorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkgSURpcmVjdERyYXdJbXBsKiBwREQsCisJCQkJIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCk7Cit2b2lkIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfRm9yY2VEZXN0cm95KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMpOworCit2b2lkCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyk7CitCT09MCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX2F0dGFjaChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzLAorCQkJICAgICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqdG8pOworQk9PTCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2RldGFjaChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzKTsKK3ZvaWQKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfbG9ja191cGRhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkgICBMUENSRUNUIHBSZWN0KTsKK3ZvaWQKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfdW5sb2NrX3VwZGF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCSAgICAgTFBDUkVDVCBwUmVjdCk7Cit2b2lkCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX2xvc2Vfc3VyZmFjZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKK3ZvaWQKK01haW5fRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWwpOwordm9pZAorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV91cGRhdGVfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCSAgICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCwKKwkJCQkgICAgICBEV09SRCBkd1N0YXJ0LCBEV09SRCBkd0NvdW50LAorCQkJCSAgICAgIExQUEFMRVRURUVOVFJZIHBhbGVudCk7CitIV05ECitNYWluX0RpcmVjdERyYXdTdXJmYWNlX2dldF9kaXNwbGF5X3dpbmRvdyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKKwordm9pZCBNYWluX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBmcm9udCwKKwkJCQkgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBiYWNrKTsKKworI2RlZmluZSBDSEVDS19MT1NUKFRoaXMpCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmIChUaGlzLT5sb3N0KSByZXR1cm4gRERFUlJfU1VSRkFDRUxPU1Q7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIENIRUNLX1RFWFRVUkUoVGhpcykJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaWYgKCEoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzMglcCisJCSAgICAgICYgRERTQ0FQUzJfVEVYVFVSRU1BTkFHRSkpCQlcCisJCQlyZXR1cm4gRERFUlJfSU5WQUxJRE9CSkVDVDsJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIExPQ0tfT0JKRUNUKFRoaXMpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgVU5MT0NLX09CSkVDVChUaGlzKSBkbyB7IH0gd2hpbGUgKDApCisKKy8qIElEaXJlY3REcmF3U3VyZmFjZTcgKHBhcnRpYWwpIGltcGxlbWVudGF0aW9uICovCitVTE9ORyBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkUmVmKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlKTsKK1VMT05HIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBSRUZJSUQgcmlpZCwKKwkJCQkgICAgICBMUFZPSUQqIHBwT2JqKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0FkZEF0dGFjaGVkU3VyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkJICBMUERJUkVDVERSQVdTVVJGQUNFNyBwQXR0YWNoKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0FkZE92ZXJsYXlEaXJ0eVJlY3QoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJCSAgIExQUkVDVCBwUmVjdCk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9CbHRCYXRjaChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQlMUEREQkxUQkFUQ0ggcEJhdGNoLCBEV09SRCBkd0NvdW50LAorCQkJCURXT1JEIGR3RmxhZ3MpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfQ2hhbmdlVW5pcXVlbmVzc1ZhbHVlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0RlbGV0ZUF0dGFjaGVkU3VyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkJICAgICBEV09SRCBkd0ZsYWdzLAorCQkJCQkgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IHBBdHRhY2gpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfRW51bUF0dGFjaGVkU3VyZmFjZXMoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJCSAgICBMUFZPSUQgY29udGV4dCwKKwkJCQkJICAgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzcgY2IpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfRW51bU92ZXJsYXlaT3JkZXJzKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCQkgIERXT1JEIGR3RmxhZ3MsIExQVk9JRCBjb250ZXh0LAorCQkJCQkgIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzcgY2IpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfRmxpcChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCSAgICBMUERJUkVDVERSQVdTVVJGQUNFNyBvdmVycmlkZSwgRFdPUkQgZHdGbGFncyk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9GcmVlUHJpdmF0ZURhdGEoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICAgICAgIFJFRkdVSUQgdGFnKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldEF0dGFjaGVkU3VyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkJICBMUEREU0NBUFMyIHBDYXBzLAorCQkJCQkgIExQRElSRUNURFJBV1NVUkZBQ0U3KiBwcFN1cmZhY2UpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Qmx0U3RhdHVzKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgICBEV09SRCBkd0ZsYWdzKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENhcHMoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkgICAgICAgTFBERFNDQVBTMiBwQ2Fwcyk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRDbGlwcGVyKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgTFBESVJFQ1REUkFXQ0xJUFBFUiogcHBDbGlwcGVyKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENvbG9yS2V5KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgIERXT1JEIGR3RmxhZ3MsIExQRERDT0xPUktFWSBwQ0tleSk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXREQyhMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgSERDICpwaERDKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldERESW50ZXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgICAgIExQVk9JRCogcEREKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldEZsaXBTdGF0dXMoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICAgICBEV09SRCBkd0ZsYWdzKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldExPRChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCSAgICAgIExQRFdPUkQgcGR3TWF4TE9EKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldE92ZXJsYXlQb3NpdGlvbihMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkJICBMUExPTkcgcFgsIExQTE9ORyBwWSk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQYWxldHRlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgTFBESVJFQ1REUkFXUEFMRVRURSogcHBQYWxldHRlKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFBpeGVsRm9ybWF0KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgICAgIExQRERQSVhFTEZPUk1BVCBwRERQaXhlbEZvcm1hdCk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQcmlvcml0eShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkgICBMUERXT1JEIHBkd1ByaW9yaXR5KTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFByaXZhdGVEYXRhKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBSRUZHVUlEIHRhZywKKwkJCQkgICAgICBMUFZPSUQgcEJ1ZmZlciwgTFBEV09SRCBwY2JCdWZmZXJTaXplKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgICAgIExQRERTVVJGQUNFREVTQzIgcEREU0QpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0VW5pcXVlbmVzc1ZhbHVlKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCQkgIExQRFdPUkQgcFZhbHVlKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0luaXRpYWxpemUoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICBMUERJUkVDVERSQVcgcERELCBMUEREU1VSRkFDRURFU0MyIHBERFNEKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0lzTG9zdChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSk7CitIUkVTVUxUIFdJTkFQSQorTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Mb2NrKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBMUFJFQ1QgcHJlY3QsCisJCQkgICAgTFBERFNVUkZBQ0VERVNDMiBwRERTRCwgRFdPUkQgZmxhZ3MsIEhBTkRMRSBoKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1BhZ2VMb2NrKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBEV09SRCBkd0ZsYWdzKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1BhZ2VVbmxvY2soTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsIERXT1JEIGR3RmxhZ3MpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZURDKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBIREMgaERDKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldENsaXBwZXIoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICBMUERJUkVDVERSQVdDTElQUEVSIHBERENsaXBwZXIpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0Q29sb3JLZXkoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICAgRFdPUkQgZHdGbGFncywgTFBERENPTE9SS0VZIHBDS2V5KTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldExPRChMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwgRFdPUkQgZHdNYXhMT0QpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0T3ZlcmxheVBvc2l0aW9uKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCQkgIExPTkcgWCwgTE9ORyBZKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFBhbGV0dGUoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICBMUERJUkVDVERSQVdQQUxFVFRFIHBQYWxldHRlKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFByaW9yaXR5KExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLAorCQkJCSAgIERXT1JEIGR3UHJpb3JpdHkpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UHJpdmF0ZURhdGEoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJICAgICAgUkVGR1VJRCB0YWcsIExQVk9JRCBwRGF0YSwKKwkJCQkgICAgICBEV09SRCBjYlNpemUsIERXT1JEIGR3RmxhZ3MpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBMUFJFQ1QgcFJlY3QpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheShMUERJUkVDVERSQVdTVVJGQUNFNyBpZmFjZSwKKwkJCQkgICAgIExQUkVDVCBwU3JjUmVjdCwKKwkJCQkgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3IHBEc3RTdXJmYWNlLAorCQkJCSAgICAgTFBSRUNUIHBEc3RSZWN0LCBEV09SRCBkd0ZsYWdzLAorCQkJCSAgICAgTFBERE9WRVJMQVlGWCBwRlgpOworSFJFU1VMVCBXSU5BUEkKK01haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheURpc3BsYXkoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJCSAgICBEV09SRCBkd0ZsYWdzKTsKK0hSRVNVTFQgV0lOQVBJCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX1VwZGF0ZU92ZXJsYXlaT3JkZXIoTFBESVJFQ1REUkFXU1VSRkFDRTcgaWZhY2UsCisJCQkJCSAgIERXT1JEIGR3RmxhZ3MsCisJCQkJCSAgIExQRElSRUNURFJBV1NVUkZBQ0U3IHBERFNSZWYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvZHN1cmZhY2UvdGh1bmtzLmMgYi9kbGxzL2RkcmF3L2RzdXJmYWNlL3RodW5rcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTA0MTcKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RzdXJmYWNlL3RodW5rcy5jCkBAIC0wLDAgKzEsNDAxIEBACisvKiBJRGlyZWN0RHJhd1N1cmZhY2UzIC0+IElEaXJlY3REcmF3U3VyZmFjZTcgdGh1bmtzCisgKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJkZHJhdy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisKKyNpbmNsdWRlICJkZGNvbWltcGwuaCIKKyNpbmNsdWRlICJkc3VyZmFjZS9tYWluLmgiCisjaW5jbHVkZSAiZHN1cmZhY2UvdGh1bmtzLmgiCisKKyNkZWZpbmUgQ09OVkVSVChwZGRzKSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwJXAorCQkJCQkgSURpcmVjdERyYXdTdXJmYWNlMywJCVwKKwkJCQkJIElEaXJlY3REcmF3U3VyZmFjZTcsCQlcCisJCQkJCSAocGRkcykpCisKKyNkZWZpbmUgQ09OVkVSVF9SRVYocGRkcykgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsCVwKKwkJCQkJICAgICBJRGlyZWN0RHJhd1N1cmZhY2U3LAlcCisJCQkJCSAgICAgSURpcmVjdERyYXdTdXJmYWNlMywJXAorCQkJCQkgICAgIChwZGRzKSkKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9RdWVyeUludGVyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFMyBUaGlzLCBSRUZJSUQgaWlkLAorCQkJCSAgICAgICBMUFZPSUQgKnBwT2JqKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1F1ZXJ5SW50ZXJmYWNlKENPTlZFUlQoVGhpcyksIGlpZCwgcHBPYmopOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9BZGRSZWYoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcykKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoQ09OVkVSVChUaGlzKSk7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX1JlbGVhc2UoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcykKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlKENPTlZFUlQoVGhpcykpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0FkZEF0dGFjaGVkU3VyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFMyBUaGlzLAorCQkJCQkgICBMUERJUkVDVERSQVdTVVJGQUNFMyBwQXR0YWNoKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShDT05WRVJUKFRoaXMpLAorCQkJCQkJICBDT05WRVJUKHBBdHRhY2gpKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9BZGRPdmVybGF5RGlydHlSZWN0KExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMsCisJCQkJCSAgICBMUFJFQ1QgcFJlY3QpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfQWRkT3ZlcmxheURpcnR5UmVjdChDT05WRVJUKFRoaXMpLCBwUmVjdCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfQmx0KExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMsIExQUkVDVCBwcmNEc3QsCisJCQkgICAgTFBESVJFQ1REUkFXU1VSRkFDRTMgcFNyY1N1cmYsIExQUkVDVCBwcmNTcmMsCisJCQkgICAgRFdPUkQgZHdGbGFncywgTFBEREJMVEZYIHBGWCkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19CbHQoQ09OVkVSVChUaGlzKSwgcHJjRHN0LCBDT05WRVJUKHBTcmNTdXJmKSwKKwkJCQkgICBwcmNTcmMsIGR3RmxhZ3MsIHBGWCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfQmx0QmF0Y2goTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywKKwkJCQkgTFBEREJMVEJBVENIIHBCYXRjaCwgRFdPUkQgZHdDb3VudCwKKwkJCQkgRFdPUkQgZHdGbGFncykKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19CbHRCYXRjaChDT05WRVJUKFRoaXMpLCBwQmF0Y2gsIGR3Q291bnQsCisJCQkJCWR3RmxhZ3MpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0JsdEZhc3QoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywgRFdPUkQgeCwgRFdPUkQgeSwKKwkJCQlMUERJUkVDVERSQVdTVVJGQUNFMyBwU3JjU3VyZiwgTFBSRUNUIHByY1NyYywKKwkJCQlEV09SRCBkd1RyYW5zKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0JsdEZhc3QoQ09OVkVSVChUaGlzKSwgeCwgeSwgQ09OVkVSVChwU3JjU3VyZiksCisJCQkJICAgICAgIHByY1NyYywgZHdUcmFucyk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfRGVsZXRlQXR0YWNoZWRTdXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMsCisJCQkJCSAgICAgIERXT1JEIGR3RmxhZ3MsCisJCQkJCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0UzIHBBdHRhY2hlZCkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19EZWxldGVBdHRhY2hlZFN1cmZhY2UoQ09OVkVSVChUaGlzKSwgZHdGbGFncywKKwkJCQkJCSAgICAgQ09OVkVSVChwQXR0YWNoZWQpKTsKK30KKworc3RydWN0IGNhbGxiYWNrX2luZm8KK3sKKyAgICBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0sgY2FsbGJhY2s7CisgICAgTFBWT0lEIGNvbnRleHQ7Cit9OworCitzdGF0aWMgSFJFU1VMVCBDQUxMQkFDSworRW51bUNhbGxiYWNrKExQRElSRUNURFJBV1NVUkZBQ0U3IGlmYWNlLCBMUEREU1VSRkFDRURFU0MyIHBERFNELAorCSAgICAgTFBWT0lEIGNvbnRleHQpCit7CisgICAgY29uc3Qgc3RydWN0IGNhbGxiYWNrX2luZm8qIGluZm8gPSBjb250ZXh0OworCisjaWYgMAorICAgIC8qIFRoaXMgaXMgYW4gb3V0Z29pbmcgY29udmVyc2lvbiBzbyB3ZSBoYXZlIHRvIGRvIGl0LiAqLworICAgIEREU1VSRkFDRURFU0MgZGRzZDsKKyAgICBtZW1zZXQoJmRkc2QsIDAsIHNpemVvZihkZHNkKSk7CisgICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CisgICAgRERSQVdfQ29udmVydF9ERFNVUkZBQ0VERVNDXzJfVG9fMShwRERTRCwgJmRkc2QpOworI2VuZGlmCisKKyAgICByZXR1cm4gaW5mby0+Y2FsbGJhY2soKExQRElSRUNURFJBV1NVUkZBQ0UpQ09OVkVSVF9SRVYoaWZhY2UpLCBwRERTRCwKKwkJCSAgaW5mby0+Y29udGV4dCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfRW51bUF0dGFjaGVkU3VyZmFjZXMoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywKKwkJCQkJICAgICBMUFZPSUQgY29udGV4dCwKKwkJCQkJICAgICBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0sgY2FsbGJhY2spCit7CisgICAgc3RydWN0IGNhbGxiYWNrX2luZm8gaW5mbyA9IHsgY2FsbGJhY2ssIGNvbnRleHQgfTsKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19FbnVtQXR0YWNoZWRTdXJmYWNlcyhDT05WRVJUKFRoaXMpLCAmaW5mbywKKwkJCQkJCSAgICBFbnVtQ2FsbGJhY2spOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0VudW1PdmVybGF5Wk9yZGVycyhMUERJUkVDVERSQVdTVVJGQUNFMyBUaGlzLAorCQkJCQkgICBEV09SRCBkd0ZsYWdzLCBMUFZPSUQgY29udGV4dCwKKwkJCQkJICAgTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLIGNhbGxiYWNrKQoreworICAgIHN0cnVjdCBjYWxsYmFja19pbmZvIGluZm8gPSB7IGNhbGxiYWNrLCBjb250ZXh0IH07CisgICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfRW51bU92ZXJsYXlaT3JkZXJzKENPTlZFUlQoVGhpcyksIGR3RmxhZ3MsCisJCQkJCQkgICZpbmZvLCBFbnVtQ2FsbGJhY2spOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0ZsaXAoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywKKwkJCSAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTMgcE92ZXJyaWRlLCBEV09SRCBkd0ZsYWdzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0ZsaXAoQ09OVkVSVChUaGlzKSwgQ09OVkVSVChwT3ZlcnJpZGUpLAorCQkJCSAgICBkd0ZsYWdzKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9HZXRBdHRhY2hlZFN1cmZhY2UoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywKKwkJCQkJICAgTFBERFNDQVBTIHBDYXBzLAorCQkJCQkgICBMUERJUkVDVERSQVdTVVJGQUNFMyogcHBBdHRhY2hlZCkKK3sKKyAgICBERFNDQVBTMiBjYXBzID0geyBwQ2Fwcy0+ZHdDYXBzLCAwLCAwLCAwIH07CisgICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgcEF0dGFjaGVkNzsKKyAgICBIUkVTVUxUIGhyOworCisgICAgaHIgPSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldEF0dGFjaGVkU3VyZmFjZShDT05WRVJUKFRoaXMpLCAmY2FwcywKKwkJCQkJCSZwQXR0YWNoZWQ3KTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOworCisgICAgKnBwQXR0YWNoZWQgPSBDT05WRVJUX1JFVihwQXR0YWNoZWQ3KTsKKyAgICByZXR1cm4gaHI7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfR2V0Qmx0U3RhdHVzKExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMsIERXT1JEIGR3RmxhZ3MpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfR2V0Qmx0U3RhdHVzKENPTlZFUlQoVGhpcyksIGR3RmxhZ3MpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0dldENhcHMoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywgTFBERFNDQVBTIHBDYXBzKQoreworICAgIEREU0NBUFMyIGNhcHM7CisgICAgSFJFU1VMVCBocjsKKworICAgIGhyID0gSURpcmVjdERyYXdTdXJmYWNlN19HZXRDYXBzKENPTlZFUlQoVGhpcyksICZjYXBzKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOworCisgICAgcENhcHMtPmR3Q2FwcyA9IGNhcHMuZHdDYXBzOworICAgIHJldHVybiBocjsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9HZXRDbGlwcGVyKExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMsCisJCQkJICAgTFBESVJFQ1REUkFXQ0xJUFBFUiogcHBDbGlwcGVyKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldENsaXBwZXIoQ09OVkVSVChUaGlzKSwgcHBDbGlwcGVyKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9HZXRDb2xvcktleShMUERJUkVDVERSQVdTVVJGQUNFMyBUaGlzLCBEV09SRCBkd0ZsYWdzLAorCQkJCSAgICBMUEREQ09MT1JLRVkgcENLZXkpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfR2V0Q29sb3JLZXkoQ09OVkVSVChUaGlzKSwgZHdGbGFncywgcENLZXkpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0dldERDKExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMsIEhEQyogcGhEQykKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19HZXREQyhDT05WRVJUKFRoaXMpLCBwaERDKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9HZXRGbGlwU3RhdHVzKExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMsIERXT1JEIGR3RmxhZ3MpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfR2V0RmxpcFN0YXR1cyhDT05WRVJUKFRoaXMpLCBkd0ZsYWdzKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9HZXRPdmVybGF5UG9zaXRpb24oTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywgTFBMT05HIHBYLAorCQkJCSAgICAgICBMUExPTkcgcFkpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfR2V0T3ZlcmxheVBvc2l0aW9uKENPTlZFUlQoVGhpcyksIHBYLCBwWSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfR2V0UGFsZXR0ZShMUERJUkVDVERSQVdTVVJGQUNFMyBUaGlzLAorCQkJCSAgIExQRElSRUNURFJBV1BBTEVUVEUqIHBwUGFsZXR0ZSkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19HZXRQYWxldHRlKENPTlZFUlQoVGhpcyksIHBwUGFsZXR0ZSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfR2V0UGl4ZWxGb3JtYXQoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywKKwkJCQkgICAgICAgTFBERFBJWEVMRk9STUFUIHBQaXhlbEZvcm1hdCkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19HZXRQaXhlbEZvcm1hdChDT05WRVJUKFRoaXMpLCBwUGl4ZWxGb3JtYXQpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0dldFN1cmZhY2VEZXNjKExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMsCisJCQkJICAgICAgIExQRERTVVJGQUNFREVTQyBwRERTRCkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19HZXRTdXJmYWNlRGVzYyhDT05WRVJUKFRoaXMpLAorCQkJCQkgICAgICAoTFBERFNVUkZBQ0VERVNDMilwRERTRCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfSW5pdGlhbGl6ZShMUERJUkVDVERSQVdTVVJGQUNFMyBUaGlzLCBMUERJUkVDVERSQVcgcERELAorCQkJCSAgIExQRERTVVJGQUNFREVTQyBwRERTRCkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19Jbml0aWFsaXplKENPTlZFUlQoVGhpcyksIHBERCwKKwkJCQkJICAoTFBERFNVUkZBQ0VERVNDMilwRERTRCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfSXNMb3N0KExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfSXNMb3N0KENPTlZFUlQoVGhpcykpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0xvY2soTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywgTFBSRUNUIHBSZWN0LAorCQkJICAgICBMUEREU1VSRkFDRURFU0MgcEREU0QsIERXT1JEIGR3RmxhZ3MsIEhBTkRMRSBoKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0xvY2soQ09OVkVSVChUaGlzKSwgcFJlY3QsCisJCQkJICAgIChMUEREU1VSRkFDRURFU0MyKXBERFNELCBkd0ZsYWdzLCBoKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9SZWxlYXNlREMoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywgSERDIGhEQykKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19SZWxlYXNlREMoQ09OVkVSVChUaGlzKSwgaERDKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9SZXN0b3JlKExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfUmVzdG9yZShDT05WRVJUKFRoaXMpKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9TZXRDbGlwcGVyKExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMsCisJCQkJICAgTFBESVJFQ1REUkFXQ0xJUFBFUiBwQ2xpcHBlcikKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19TZXRDbGlwcGVyKENPTlZFUlQoVGhpcyksIHBDbGlwcGVyKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9TZXRDb2xvcktleShMUERJUkVDVERSQVdTVVJGQUNFMyBUaGlzLCBEV09SRCBkd0ZsYWdzLAorCQkJCSAgICBMUEREQ09MT1JLRVkgcENLZXkpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfU2V0Q29sb3JLZXkoQ09OVkVSVChUaGlzKSwgZHdGbGFncywgcENLZXkpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX1NldE92ZXJsYXlQb3NpdGlvbihMUERJUkVDVERSQVdTVVJGQUNFMyBUaGlzLCBMT05HIHgsCisJCQkJICAgICAgIExPTkcgeSkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19TZXRPdmVybGF5UG9zaXRpb24oQ09OVkVSVChUaGlzKSwgeCwgeSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfU2V0UGFsZXR0ZShMUERJUkVDVERSQVdTVVJGQUNFMyBUaGlzLAorCQkJCSAgIExQRElSRUNURFJBV1BBTEVUVEUgcFBhbGV0dGUpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfU2V0UGFsZXR0ZShDT05WRVJUKFRoaXMpLCBwUGFsZXR0ZSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfVW5sb2NrKExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMsIExQVk9JRCBkYXRhKQoreworICAgIC8qIFhYWCBUaGlzIG1pZ2h0IGJlIHdyb25nIGFzIExQVk9JRCBjaGFuZ2VkIHRvIExQUkVDVCBhbG9uZyB0aGUgd2F5LiAqLworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1VubG9jayhDT05WRVJUKFRoaXMpLCBkYXRhKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJCitJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9VcGRhdGVPdmVybGF5KExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMsIExQUkVDVCBwcmNTcmMsCisJCQkJICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTMgcERzdFN1cmYsCisJCQkJICAgICAgTFBSRUNUIHByY0RzdCwgRFdPUkQgZHdGbGFncywKKwkJCQkgICAgICBMUERET1ZFUkxBWUZYIHBGWCkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19VcGRhdGVPdmVybGF5KENPTlZFUlQoVGhpcyksIHByY1NyYywKKwkJCQkJICAgICBDT05WRVJUKHBEc3RTdXJmKSwgcHJjRHN0LAorCQkJCQkgICAgIGR3RmxhZ3MsIHBGWCk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfVXBkYXRlT3ZlcmxheURpc3BsYXkoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywKKwkJCQkJICAgICBEV09SRCBkd0ZsYWdzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1VwZGF0ZU92ZXJsYXlEaXNwbGF5KENPTlZFUlQoVGhpcyksIGR3RmxhZ3MpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX1VwZGF0ZU92ZXJsYXlaT3JkZXIoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywKKwkJCQkJICAgIERXT1JEIGR3RmxhZ3MsCisJCQkJCSAgICBMUERJUkVDVERSQVdTVVJGQUNFMyBwU3VyZlJlZmVyZW5jZSkKK3sKKyAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19VcGRhdGVPdmVybGF5Wk9yZGVyKENPTlZFUlQoVGhpcyksIGR3RmxhZ3MsCisJCQkJCQkgICBDT05WRVJUKHBTdXJmUmVmZXJlbmNlKSk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfR2V0RERJbnRlcmZhY2UoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywgTFBWT0lEKiBwcEREKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldERESW50ZXJmYWNlKENPTlZFUlQoVGhpcyksIHBwREQpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkKK0lEaXJlY3REcmF3U3VyZmFjZTNJbXBsX1BhZ2VMb2NrKExQRElSRUNURFJBV1NVUkZBQ0UzIFRoaXMsIERXT1JEIGR3RmxhZ3MpCit7CisgICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfUGFnZUxvY2soQ09OVkVSVChUaGlzKSwgZHdGbGFncyk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfUGFnZVVubG9jayhMUERJUkVDVERSQVdTVVJGQUNFMyBUaGlzLCBEV09SRCBkd0ZsYWdzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1BhZ2VVbmxvY2soQ09OVkVSVChUaGlzKSwgZHdGbGFncyk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSQorSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfU2V0U3VyZmFjZURlc2MoTFBESVJFQ1REUkFXU1VSRkFDRTMgVGhpcywKKwkJCQkgICAgICAgTFBERFNVUkZBQ0VERVNDIHBERFNELCBEV09SRCBkd0ZsYWdzKQoreworICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1NldFN1cmZhY2VEZXNjKENPTlZFUlQoVGhpcyksCisJCQkJCSAgICAgIChMUEREU1VSRkFDRURFU0MyKXBERFNELAorCQkJCQkgICAgICBkd0ZsYWdzKTsKK30KKworSUNPTV9WVEFCTEUoSURpcmVjdERyYXdTdXJmYWNlMykgRERSQVdfSUREUzNfVGh1bmtfVlRhYmxlID0KK3sKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9RdWVyeUludGVyZmFjZSwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9BZGRSZWYsCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfUmVsZWFzZSwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9BZGRBdHRhY2hlZFN1cmZhY2UsCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfQWRkT3ZlcmxheURpcnR5UmVjdCwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9CbHQsCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfQmx0QmF0Y2gsCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfQmx0RmFzdCwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9EZWxldGVBdHRhY2hlZFN1cmZhY2UsCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfRW51bUF0dGFjaGVkU3VyZmFjZXMsCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfRW51bU92ZXJsYXlaT3JkZXJzLAorICAgIElEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0ZsaXAsCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfR2V0QXR0YWNoZWRTdXJmYWNlLAorICAgIElEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0dldEJsdFN0YXR1cywKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9HZXRDYXBzLAorICAgIElEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0dldENsaXBwZXIsCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfR2V0Q29sb3JLZXksCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfR2V0REMsCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfR2V0RmxpcFN0YXR1cywKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9HZXRPdmVybGF5UG9zaXRpb24sCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfR2V0UGFsZXR0ZSwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9HZXRQaXhlbEZvcm1hdCwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9HZXRTdXJmYWNlRGVzYywKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9Jbml0aWFsaXplLAorICAgIElEaXJlY3REcmF3U3VyZmFjZTNJbXBsX0lzTG9zdCwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9Mb2NrLAorICAgIElEaXJlY3REcmF3U3VyZmFjZTNJbXBsX1JlbGVhc2VEQywKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9SZXN0b3JlLAorICAgIElEaXJlY3REcmF3U3VyZmFjZTNJbXBsX1NldENsaXBwZXIsCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfU2V0Q29sb3JLZXksCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfU2V0T3ZlcmxheVBvc2l0aW9uLAorICAgIElEaXJlY3REcmF3U3VyZmFjZTNJbXBsX1NldFBhbGV0dGUsCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfVW5sb2NrLAorICAgIElEaXJlY3REcmF3U3VyZmFjZTNJbXBsX1VwZGF0ZU92ZXJsYXksCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfVXBkYXRlT3ZlcmxheURpc3BsYXksCisgICAgSURpcmVjdERyYXdTdXJmYWNlM0ltcGxfVXBkYXRlT3ZlcmxheVpPcmRlciwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9HZXREREludGVyZmFjZSwKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9QYWdlTG9jaywKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2UzSW1wbF9QYWdlVW5sb2NrLAorICAgIElEaXJlY3REcmF3U3VyZmFjZTNJbXBsX1NldFN1cmZhY2VEZXNjCit9OwpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kc3VyZmFjZS90aHVua3MuaCBiL2RsbHMvZGRyYXcvZHN1cmZhY2UvdGh1bmtzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5ZjBhNwotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvZGRyYXcvZHN1cmZhY2UvdGh1bmtzLmgKQEAgLTAsMCArMSw4IEBACisvKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLiAqLworCisjaWZuZGVmIEREUkFXX0RTVVJGQUNFX1RIVU5LU19IX0lOQ0xVREVECisjZGVmaW5lIEREUkFXX0RTVVJGQUNFX1RIVU5LU19IX0lOQ0xVREVECisKK2V4dGVybiBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhd1N1cmZhY2UzKSBERFJBV19JRERTM19UaHVua19WVGFibGU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kc3VyZmFjZS91c2VyLmMgYi9kbGxzL2RkcmF3L2RzdXJmYWNlL3VzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTA0ZmZlCi0tLSAvZGV2L251bGwKKysrIGIvZGxscy9kZHJhdy9kc3VyZmFjZS91c2VyLmMKQEAgLTAsMCArMSw0OTkgQEAKKy8qCVVzZXItYmFzZWQgcHJpbWFyeSBzdXJmYWNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDAwIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKKyNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCisjaW5jbHVkZSAiZHN1cmZhY2UvbWFpbi5oIgorI2luY2x1ZGUgImRzdXJmYWNlL2RpYi5oIgorI2luY2x1ZGUgImRzdXJmYWNlL3VzZXIuaCIKKyNpbmNsdWRlICJkc3VyZmFjZS93bmRwcm9jLmgiCisKK0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7CisKKy8qIGlmIHlvdSB1c2UgT1dOX1dJTkRPVywgZG9uJ3QgdXNlIFNZTkNfVVBEQVRFLCBvciB5b3UgbWF5IGdldCB0cm91YmxlICovCisvKiAjZGVmaW5lIFNZTkNfVVBEQVRFICovCisjZGVmaW5lIE9XTl9XSU5ET1cKKworI2lmZGVmIE9XTl9XSU5ET1cKK3N0YXRpYyB2b2lkIFVzZXJfY3JlYXRlX293bl93aW5kb3coSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyk7CitzdGF0aWMgdm9pZCBVc2VyX2Rlc3Ryb3lfb3duX3dpbmRvdyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKKyNlbmRpZgorI2lmbmRlZiBTWU5DX1VQREFURQorc3RhdGljIERXT1JEIENBTExCQUNLIFVzZXJfdXBkYXRlX3RocmVhZChMUFZPSUQpOworI2VuZGlmCitzdGF0aWMgdm9pZCBVc2VyX2NvcHlfdG9fc2NyZWVuKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIExQQ1JFQ1QgcmMpOworc3RhdGljIHZvaWQgVXNlcl9jb3B5X2Zyb21fc2NyZWVuKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIExQQ1JFQ1QgcmMpOworCitzdGF0aWMgSUNPTV9WVEFCTEUoSURpcmVjdERyYXdTdXJmYWNlNykgVXNlcl9JRGlyZWN0RHJhd1N1cmZhY2U3X1ZUYWJsZTsKKworSFJFU1VMVAorVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkgSURpcmVjdERyYXdJbXBsKiBwREQsCisJCQkJIGNvbnN0IEREU1VSRkFDRURFU0MyKiBwRERTRCkKK3sKKyAgICBVU0VSX1BSSVZfVkFSKHByaXYsIFRoaXMpOworICAgIEhSRVNVTFQgaHI7CisKKyAgICBUUkFDRSgiKCVwLCVwLCVwKVxuIixUaGlzLHBERCxwRERTRCk7CisgICAgaHIgPSBESUJfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KFRoaXMsIHBERCwgcEREU0QpOworICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7CisKKyAgICBJQ09NX0lOSVRfSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3U3VyZmFjZTcsCisJCQlVc2VyX0lEaXJlY3REcmF3U3VyZmFjZTdfVlRhYmxlKTsKKworICAgIFRoaXMtPmZpbmFsX3JlbGVhc2UgPSBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2U7CisgICAgVGhpcy0+ZHVwbGljYXRlX3N1cmZhY2UgPSBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2R1cGxpY2F0ZV9zdXJmYWNlOworCisgICAgVGhpcy0+bG9ja191cGRhdGUgICA9IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfbG9ja191cGRhdGU7CisgICAgVGhpcy0+dW5sb2NrX3VwZGF0ZSA9IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfdW5sb2NrX3VwZGF0ZTsKKworICAgIFRoaXMtPmZsaXBfZGF0YSAgID0gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX2RhdGE7CisgICAgVGhpcy0+ZmxpcF91cGRhdGUgPSBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfdXBkYXRlOworCisgICAgVGhpcy0+Z2V0X2RjICAgICA9IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZ2V0X2RjOworICAgIFRoaXMtPnJlbGVhc2VfZGMgPSBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX3JlbGVhc2VfZGM7CisKKyAgICBUaGlzLT5zZXRfcGFsZXR0ZSAgICA9IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGU7CisgICAgVGhpcy0+dXBkYXRlX3BhbGV0dGUgPSBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX3VwZGF0ZV9wYWxldHRlOworCisgICAgVGhpcy0+Z2V0X2Rpc3BsYXlfd2luZG93ID0gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGlzcGxheV93aW5kb3c7CisKKyAgICBpZiAoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSkKKyAgICB7CisjaWZuZGVmIFNZTkNfVVBEQVRFCisJcHJpdi0+dXNlci51cGRhdGVfZXZlbnQgPSBDcmVhdGVFdmVudEEoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKwlwcml2LT51c2VyLnVwZGF0ZV90aHJlYWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgVXNlcl91cGRhdGVfdGhyZWFkLCBUaGlzLCAwLCBOVUxMKTsKKyNlbHNlCisjaWZkZWYgT1dOX1dJTkRPVworCVVzZXJfY3JlYXRlX293bl93aW5kb3coVGhpcyk7CisjZW5kaWYKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiBESUJfRGlyZWN0RHJhd1N1cmZhY2VfYWxsb2NfZGMoVGhpcywgJnByaXYtPnVzZXIuY2FjaGVkX2RjKTsKK30KKworSFJFU1VMVAorVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9DcmVhdGUoSURpcmVjdERyYXdJbXBsICpwREQsCisJCQkgICAgICBjb25zdCBERFNVUkZBQ0VERVNDMiAqcEREU0QsCisJCQkgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyAqcHBTdXJmLAorCQkJICAgICAgSVVua25vd24gKnBVbmtPdXRlcikKK3sKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzOworICAgIEhSRVNVTFQgaHI7CisgICAgYXNzZXJ0KHBVbmtPdXRlciA9PSBOVUxMKTsKKworICAgIFRoaXMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKKwkJICAgICBzaXplb2YoKlRoaXMpICsgc2l6ZW9mKFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsKSk7CisgICAgaWYgKFRoaXMgPT0gTlVMTCkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisKKyAgICBUaGlzLT5wcml2YXRlID0gKFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsKikoVGhpcysxKTsKKworICAgIGhyID0gVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9Db25zdHJ1Y3QoVGhpcywgcERELCBwRERTRCk7CisgICAgaWYgKEZBSUxFRChocikpCisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7CisgICAgZWxzZQorCSpwcFN1cmYgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KTsKKworICAgIHJldHVybiBocjsKK30KKwordm9pZCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKK3sKKyAgICBVU0VSX1BSSVZfVkFSKHByaXYsIFRoaXMpOworCisgICAgaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpCisgICAgeworI2lmbmRlZiBTWU5DX1VQREFURQorCUhBTkRMRSBldmVudCA9IHByaXYtPnVzZXIudXBkYXRlX2V2ZW50OworCXByaXYtPnVzZXIudXBkYXRlX2V2ZW50ID0gMDsKKwlTZXRFdmVudChldmVudCk7CisJVFJBQ0UoIndhaXRpbmcgZm9yIHVwZGF0ZSB0aHJlYWQgdG8gdGVybWluYXRlLi4uXG4iKTsKKyNpZmRlZiBPV05fV0lORE9XCisJLyogZGlzcGF0Y2ggYW55IHdhaXRpbmcgc2VuZG1lc3NhZ2VzICovCisJeworCSAgICBNU0cgbXNnOworCSAgICBQZWVrTWVzc2FnZUEoJm1zZywgMCwgMCwgMCwgUE1fTk9SRU1PVkUpOworCX0KKwkvKiB0byBhdm9pZCBkZWFkbG9ja3MsIGFsbG93IFNlbmRNZXNzYWdlcyBmcm9tIHVwZGF0ZSB0aHJlYWQKKwkgKiB0aHJvdWdoIHdoaWxlIHdlIHdhaXQgZm9yIGl0ICovCisJd2hpbGUgKE1zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHMoMSwgJnByaXYtPnVzZXIudXBkYXRlX3RocmVhZCwgRkFMU0UsCisJCQkJCSBJTkZJTklURSwgUVNfU0VORE1FU1NBR0UpID09IFdBSVRfT0JKRUNUXzArMSkKKwl7CisJICAgIE1TRyBtc2c7CisJICAgIFBlZWtNZXNzYWdlQSgmbXNnLCAwLCAwLCAwLCBQTV9OT1JFTU9WRSk7CisJfQorI2Vsc2UKKwlXYWl0Rm9yU2luZ2xlT2JqZWN0KHByaXYtPnVzZXIudXBkYXRlX3RocmVhZCxJTkZJTklURSk7CisjZW5kaWYKKwlUUkFDRSgidXBkYXRlIHRocmVhZCB0ZXJtaW5hdGVkXG4iKTsKKwlDbG9zZUhhbmRsZShwcml2LT51c2VyLnVwZGF0ZV90aHJlYWQpOworI2Vsc2UKKyNpZmRlZiBPV05fV0lORE9XCisJVXNlcl9kZXN0cm95X293bl93aW5kb3coVGhpcyk7CisjZW5kaWYKKyNlbmRpZgorICAgIH0KKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VfZnJlZV9kYyhUaGlzLCBwcml2LT51c2VyLmNhY2hlZF9kYyk7CisgICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoVGhpcyk7Cit9CisKK3ZvaWQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9sb2NrX3VwZGF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCQlMUENSRUNUIHBSZWN0KQoreworICAgIFVzZXJfY29weV9mcm9tX3NjcmVlbihUaGlzLCBwUmVjdCk7Cit9CisKK3ZvaWQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV91bmxvY2tfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCisJCQkJCSAgTFBDUkVDVCBwUmVjdCkKK3sKKyNpZmRlZiBTWU5DX1VQREFURQorICAgIFVzZXJfY29weV90b19zY3JlZW4oVGhpcywgcFJlY3QpOworI2Vsc2UKKyAgICBVU0VSX1BSSVZfVkFSKHByaXYsIFRoaXMpOworICAgIFNldEV2ZW50KHByaXYtPnVzZXIudXBkYXRlX2V2ZW50KTsKKyNlbmRpZgorfQorCit2b2lkIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkJSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsKSAKK3sKKyAgICBVU0VSX1BSSVZfVkFSKHByaXYsIFRoaXMpOworCisgICAgaWYgKCFwYWwpIHsKKwlGSVhNRSgic2VsZWN0aW5nIG51bGwgcGFsZXR0ZVxuIik7CisJLyogSSBkb24ndCB0aGluayBzZWxlY3RpbmcgR0RJIG9iamVjdCAwIHdpbGwgd29yaywgd2Ugc2hvdWxkIHNlbGVjdAorCSAqIHRoZSBvcmlnaW5hbCBwYWxldHRlLCByZXR1cm5lZCBieSB0aGUgZmlyc3QgU2VsZWN0UGFsZXR0ZSAqLworCVNlbGVjdFBhbGV0dGUocHJpdi0+dXNlci5jYWNoZWRfZGMsIDAsIEZBTFNFKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgU2VsZWN0UGFsZXR0ZShwcml2LT51c2VyLmNhY2hlZF9kYywgcGFsLT5ocGFsLCBGQUxTRSk7CisKKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGUoVGhpcywgcGFsKTsKK30KKwordm9pZCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX3VwZGF0ZV9wYWxldHRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCisJCQkJCSAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIHBhbCwKKwkJCQkJICAgRFdPUkQgZHdTdGFydCwgRFdPUkQgZHdDb3VudCwKKwkJCQkJICAgTFBQQUxFVFRFRU5UUlkgcGFsZW50KQoreworICAgIFVTRVJfUFJJVl9WQVIocHJpdiwgVGhpcyk7CisKKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VfdXBkYXRlX3BhbGV0dGUoVGhpcywgcGFsLCBkd1N0YXJ0LCBkd0NvdW50LCBwYWxlbnQpOworICAgIC8qIEZJWE1FOiByZWFsaXplIHBhbGV0dGUgb24gZGlzcGxheSB3aW5kb3cgKi8KKworI2lmbmRlZiBTWU5DX1VQREFURQorICAgIC8qIHdpdGggYXN5bmMgdXBkYXRlcywgaXQncyBwcm9iYWJseSBjb29sIHRvIGZvcmNlIGFuIHVwZGF0ZSAqLworICAgIFNldEV2ZW50KHByaXYtPnVzZXIudXBkYXRlX2V2ZW50KTsKKyNlbmRpZgorfQorCitIUkVTVUxUIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZHVwbGljYXRlX3N1cmZhY2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkJCSBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBEdXApCit7CisgICAgcmV0dXJuIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfQ3JlYXRlKFRoaXMtPmRkcmF3X293bmVyLAorCQkJCQkgJlRoaXMtPnN1cmZhY2VfZGVzYywgcHBEdXAsIE5VTEwpOworfQorCit2b2lkIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZmxpcF9kYXRhKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGZyb250LAorCQkJCSAgICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIGJhY2spCit7CisgICAgVVNFUl9QUklWX1ZBUihmcm9udF9wcml2LCBmcm9udCk7CisgICAgVVNFUl9QUklWX1ZBUihiYWNrX3ByaXYsIGJhY2spOworCisgICAgeworCUhEQyB0bXA7CisJdG1wID0gZnJvbnRfcHJpdi0+dXNlci5jYWNoZWRfZGM7CisJZnJvbnRfcHJpdi0+dXNlci5jYWNoZWRfZGMgPSBiYWNrX3ByaXYtPnVzZXIuY2FjaGVkX2RjOworCWJhY2tfcHJpdi0+dXNlci5jYWNoZWRfZGMgPSB0bXA7CisgICAgfQorCisgICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YShmcm9udCwgYmFjayk7Cit9CisKK3ZvaWQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX3VwZGF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQoreworI2lmZGVmIFNZTkNfVVBEQVRFCisgICAgYXNzZXJ0KFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpOworICAgIFVzZXJfY29weV90b19zY3JlZW4oVGhpcyxOVUxMKTsKKyNlbHNlCisgICAgVVNFUl9QUklWX1ZBUihwcml2LCBUaGlzKTsKKyAgICBhc3NlcnQoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19QUklNQVJZU1VSRkFDRSk7CisgICAgU2V0RXZlbnQocHJpdi0+dXNlci51cGRhdGVfZXZlbnQpOworI2VuZGlmCit9CisKK0hSRVNVTFQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgSERDKiBwaERDKQoreworICAgIFVTRVJfUFJJVl9WQVIocHJpdiwgVGhpcyk7CisKKyAgICAqcGhEQyA9IHByaXYtPnVzZXIuY2FjaGVkX2RjOworICAgIHJldHVybiBTX09LOworfQorCitIUkVTVUxUIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfcmVsZWFzZV9kYyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCQkgIEhEQyBoREMpCit7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKKy8qIFJldHVybnMgdGhlIHdpbmRvdyB0aGF0IGhvc3RzIHRoZSBkaXNwbGF5LgorICogKnB0IGlzIHNldCB0byB0aGUgdXBwZXIgbGVmdCBwb3NpdGlvbiBvZiB0aGUgd2luZG93IHJlbGF0aXZlIHRvIHRoZQorICogdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHN1cmZhY2UuICovCitzdGF0aWMgSFdORCBnZXRfZGlzcGxheV93aW5kb3coSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgTFBQT0lOVCBwdCkKK3sKKyAgICBtZW1zZXQocHQsIDAsIHNpemVvZigqcHQpKTsKKworICAgIGlmIChUaGlzLT5kZHJhd19vd25lci0+Y29vcGVyYXRpdmVfbGV2ZWwgJiBERFNDTF9GVUxMU0NSRUVOKQorICAgIHsKKyNpZmRlZiBPV05fV0lORE9XCisJVVNFUl9QUklWX1ZBUihwcml2LCBUaGlzKTsKKwlTZXRXaW5kb3dQb3MocHJpdi0+dXNlci53aW5kb3csIEhXTkRfVE9QLCAwLCAwLCAwLCAwLAorCQkgICAgIFNXUF9ERUZFUkVSQVNFfFNXUF9OT0FDVElWQVRFfFNXUF9OT0NPUFlCSVRTfFNXUF9OT01PVkV8CisJCSAgICAgU1dQX05PUkVEUkFXfFNXUF9OT1NFTkRDSEFOR0lOR3xTV1BfTk9TSVpFKTsKKwlyZXR1cm4gcHJpdi0+dXNlci53aW5kb3c7CisjZWxzZQorCXJldHVybiBUaGlzLT5kZHJhd19vd25lci0+d2luZG93OworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJaWYgKFRoaXMtPmNsaXBwZXIgIT0gTlVMTCkKKwl7CisJICAgIC8qIGxvb2tzIHNpbGx5LCBidXQgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgY2xpcHBlciBsb2NrZWQgKi8KKwkgICAgSFdORCBoV25kID0gVGhpcy0+Y2xpcHBlci0+aFduZDsKKworCSAgICBpZiAoaFduZCAhPSAwKQorCSAgICB7CisJCUNsaWVudFRvU2NyZWVuKGhXbmQsIHB0KTsKKwkJcmV0dXJuIGhXbmQ7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCXN0YXRpYyBCT09MIHdhcm4gPSAwOworCQlpZiAoIXdhcm4rKykgRklYTUUoImNsaXBwZXIgY2xpcCBsaXN0cyBub3Qgc3VwcG9ydGVkXG4iKTsKKworCQlyZXR1cm4gR2V0RGVza3RvcFdpbmRvdygpOworCSAgICB9CisJfQorCWVsc2UKKwl7CisJICAgIHN0YXRpYyBCT09MIHdhcm4gPSAwOworCSAgICBpZiAoIXdhcm4rKykgV0FSTigiaG9zdGluZyBvbiByb290XG4iKTsKKworCSAgICByZXR1cm4gR2V0RGVza3RvcFdpbmRvdygpOworCX0KKyAgICB9Cit9CisKK0hXTkQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGlzcGxheV93aW5kb3coSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKK3sKKyAgICBQT0lOVCBvZmZzZXQ7CisgICAgcmV0dXJuIGdldF9kaXNwbGF5X3dpbmRvdyhUaGlzLCAmb2Zmc2V0KTsKK30KKworI2lmZGVmIE9XTl9XSU5ET1cKK3N0YXRpYyB2b2lkIFVzZXJfY3JlYXRlX293bl93aW5kb3coSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcykKK3sKKyAgICBVU0VSX1BSSVZfVkFSKHByaXYsIFRoaXMpOworCisgICAgaWYgKFRoaXMtPmRkcmF3X293bmVyLT5jb29wZXJhdGl2ZV9sZXZlbCAmIEREU0NMX0ZVTExTQ1JFRU4pCisgICAgeworCURpcmVjdERyYXdTdXJmYWNlX1JlZ2lzdGVyQ2xhc3MoKTsKKwlwcml2LT51c2VyLndpbmRvdyA9IENyZWF0ZVdpbmRvd0V4QShXU19FWF9UT1BNT1NULAorCQkJCQkgICAgIldJTkVfRERSQVciLCAiRGlyZWN0RHJhdyIsCisJCQkJCSAgICBXU19QT1BVUCwKKwkJCQkJICAgIDAsIDAsCisJCQkJCSAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdXaWR0aCwKKwkJCQkJICAgIFRoaXMtPnN1cmZhY2VfZGVzYy5kd0hlaWdodCwKKwkJCQkJICAgIEdldERlc2t0b3BXaW5kb3coKSwKKwkJCQkJICAgIDAsIDAsIFRoaXMpOworCVNldFdpbmRvd1Bvcyhwcml2LT51c2VyLndpbmRvdywgSFdORF9UT1AsIDAsIDAsIDAsIDAsCisJCSAgICAgU1dQX0RFRkVSRVJBU0V8U1dQX05PQUNUSVZBVEV8U1dQX05PQ09QWUJJVFN8U1dQX05PTU9WRXwKKwkJICAgICBTV1BfTk9SRURSQVd8U1dQX05PU0VORENIQU5HSU5HfFNXUF9OT1NJWkV8U1dQX1NIT1dXSU5ET1cpOworCVVwZGF0ZVdpbmRvdyhwcml2LT51c2VyLndpbmRvdyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBVc2VyX2Rlc3Ryb3lfb3duX3dpbmRvdyhJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKQoreworICAgIFVTRVJfUFJJVl9WQVIocHJpdiwgVGhpcyk7CisKKyAgICBpZiAoVGhpcy0+ZGRyYXdfb3duZXItPmNvb3BlcmF0aXZlX2xldmVsICYgRERTQ0xfRlVMTFNDUkVFTikKKyAgICB7CisJU2V0V2luZG93UG9zKHByaXYtPnVzZXIud2luZG93LCAwLCAwLCAwLCAwLCAwLAorCQkgICAgIFNXUF9ERUZFUkVSQVNFfFNXUF9OT0FDVElWQVRFfFNXUF9OT0NPUFlCSVRTfFNXUF9OT01PVkV8U1dQX05PWk9SREVSfAorCQkgICAgIFNXUF9OT1JFRFJBV3xTV1BfTk9TRU5EQ0hBTkdJTkd8U1dQX05PU0laRXxTV1BfSElERVdJTkRPVyk7CisJRGVzdHJveVdpbmRvdyhwcml2LT51c2VyLndpbmRvdyk7CisJRGlyZWN0RHJhd1N1cmZhY2VfVW5yZWdpc3RlckNsYXNzKCk7CisgICAgfQorfQorI2VuZGlmCisKKyNpZm5kZWYgU1lOQ19VUERBVEUKK3N0YXRpYyBEV09SRCBDQUxMQkFDSyBVc2VyX3VwZGF0ZV90aHJlYWQoTFBWT0lEIGFyZykKK3sKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICpUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKilhcmc7CisgICAgVVNFUl9QUklWX1ZBUihwcml2LCBUaGlzKTsKKyAgICB2b2xhdGlsZSBEV09SRCAqcEFjdGl2ZSA9ICh2b2xhdGlsZSBEV09SRCAqKSZwcml2LT51c2VyLnVwZGF0ZV9ldmVudDsKKyAgICBIQU5ETEUgZXZlbnQgPSAqcEFjdGl2ZTsKKworI2lmZGVmIE9XTl9XSU5ET1cKKyAgICBVc2VyX2NyZWF0ZV9vd25fd2luZG93KFRoaXMpOworI2VuZGlmCisKKyAgICAvKiB0aGUgcG9pbnQgb2YgdGhpcyBpcyB0aGF0IG1hbnkgZ2FtZXMgbG9jayB0aGUgcHJpbWFyeSBzdXJmYWNlCisgICAgICogbXVsdGlwbGUgdGltZXMgcGVyIGZyYW1lOyB0aGlzIHRocmVhZCB3aWxsIHRoZW4gc2ltcGx5IGNvcHkgYXMKKyAgICAgKiBvZnRlbiBhcyBpdCBjYW4gd2l0aG91dCBrZWVwaW5nIHRoZSBtYWluIHRocmVhZCB3YWl0aW5nIGZvcgorICAgICAqIGVhY2ggdW5sb2NrLCB0aHVzIGtlZXBpbmcgdGhlIGZyYW1lIHJhdGUgaGlnaCAqLworICAgIGRvIHsKKyNpZmRlZiBPV05fV0lORE9XCisJRFdPUkQgcmV0ID0gTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cygxLCAmZXZlbnQsIEZBTFNFLCBJTkZJTklURSwgUVNfQUxMSU5QVVQpOworCU1TRyBtc2c7CisKKwl3aGlsZSAoUGVla01lc3NhZ2VBKCZtc2csIDAsIDAsIDAsIFBNX1JFTU9WRSkpCisJeworCSAgICBzd2l0Y2ggKG1zZy5tZXNzYWdlKSB7CisJICAgIGNhc2UgV01fUEFJTlQ6CisJCURpc3BhdGNoTWVzc2FnZUEoJm1zZyk7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQkvKiBzaW5jZSB3ZSByaXNrIGdldHRpbmcga2V5Ym9hcmQgbWVzc2FnZXMgcG9zdGVkIHRvIHVzLAorCQkgKiByZXBvc3QgcG9zdGVkIG1lc3NhZ2VzIHRvIGNvb3BlcmF0aXZlIHdpbmRvdyAqLworCQlQb3N0TWVzc2FnZUEoVGhpcy0+ZGRyYXdfb3duZXItPndpbmRvdywgbXNnLm1lc3NhZ2UsIG1zZy53UGFyYW0sIG1zZy5sUGFyYW0pOworCSAgICB9CisJfQorI2Vsc2UKKwlEV09SRCByZXQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGV2ZW50LCBJTkZJTklURSk7CisjZW5kaWYKKwlpZiAocmV0ID09IFdBSVRfT0JKRUNUXzApCisJeworCSAgICBpZiAoKnBBY3RpdmUpCisJCVVzZXJfY29weV90b19zY3JlZW4oVGhpcywgTlVMTCk7CisJICAgIGVsc2UKKwkJYnJlYWs7CisJfQorCWVsc2UgaWYgKHJldCAhPSBXQUlUX09CSkVDVF8wKzEpIGJyZWFrOworICAgIH0gd2hpbGUgKFRSVUUpOworCisjaWZkZWYgT1dOX1dJTkRPVworICAgIFVzZXJfZGVzdHJveV9vd25fd2luZG93KFRoaXMpOworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBVc2VyX2NvcHlfdG9fc2NyZWVuKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIExQQ1JFQ1QgcmMpCit7CisgICAgLyogcmMgaXMgdW51c2VkLiBXZSBjb3B5IHRoZSB3aG9sZSB0aGluZy4gKi8KKworICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKQorICAgIHsKKwlQT0lOVCBvZmZzZXQ7CisJSFdORCBoRGlzcGxheVduZDsKKwlIREMgaERpc3BsYXlEQzsKKwlIREMgaFN1cmZhY2VEQzsKKworCWlmIChGQUlMRUQoVGhpcy0+Z2V0X2RjKFRoaXMsICZoU3VyZmFjZURDKSkpCisJICAgIHJldHVybjsKKworCWhEaXNwbGF5V25kID0gZ2V0X2Rpc3BsYXlfd2luZG93KFRoaXMsICZvZmZzZXQpOworCWhEaXNwbGF5REMgPSBHZXREQ0V4KGhEaXNwbGF5V25kLCAwLCBEQ1hfQ0xJUFNJQkxJTkdTKTsKKyNpZiAwCisJLyogRklYTUU6IHRoaXMgZG9lc24ndCB3b3JrLi4uIGlmIHVzZXJzIHJlYWxseSB3YW50IHRvIHJ1bgorCSAqIFggaW4gOGJwcCwgdGhlbiB3ZSBuZWVkIHRvIGNhbGwgZGlyZWN0bHkgaW50byBkaXNwbGF5LmRydgorCSAqIChvciBXaW5lJ3MgZXF1aXZhbGVudCksIGFuZCBmb3JjZSBhIHByaXZhdGUgY29sb3JtYXAKKwkgKiB3aXRob3V0IGRlZmF1bHQgZW50cmllcy4gKi8KKwlpZiAoVGhpcy0+cGFsZXR0ZSkgeworCSAgICBTZWxlY3RQYWxldHRlKGhEaXNwbGF5REMsIFRoaXMtPnBhbGV0dGUtPmhwYWwsIEZBTFNFKTsKKwkgICAgUmVhbGl6ZVBhbGV0dGUoaERpc3BsYXlEQyk7IC8qIHNlbmRzIG1lc3NhZ2VzID0+IGRlYWRsb2NrcyAqLworCX0KKyNlbmRpZgorCisJQml0Qmx0KGhEaXNwbGF5REMsIDAsIDAsIFRoaXMtPnN1cmZhY2VfZGVzYy5kd1dpZHRoLAorCSAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZHdIZWlnaHQsIGhTdXJmYWNlREMsIG9mZnNldC54LCBvZmZzZXQueSwKKwkgICAgICAgU1JDQ09QWSk7CisKKwlSZWxlYXNlREMoaERpc3BsYXlXbmQsIGhEaXNwbGF5REMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgVXNlcl9jb3B5X2Zyb21fc2NyZWVuKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsIExQQ1JFQ1QgcmMpCit7CisgICAgLyogcmMgaXMgdW51c2VkLiBXZSBjb3B5IHRoZSB3aG9sZSB0aGluZy4gKi8KKworICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKQorICAgIHsKKwlQT0lOVCBvZmZzZXQ7CisJSFdORCBoRGlzcGxheVduZCA9IGdldF9kaXNwbGF5X3dpbmRvdyhUaGlzLCAmb2Zmc2V0KTsKKwlIREMgaERpc3BsYXlEQyA9IEdldERDKGhEaXNwbGF5V25kKTsKKworCUJpdEJsdChUaGlzLT5oREMsIG9mZnNldC54LCBvZmZzZXQueSwgVGhpcy0+c3VyZmFjZV9kZXNjLmR3V2lkdGgsCisJICAgICAgIFRoaXMtPnN1cmZhY2VfZGVzYy5kd0hlaWdodCwgaERpc3BsYXlEQywgMCwgMCwgU1JDQ09QWSk7CisKKwlSZWxlYXNlREMoaERpc3BsYXlXbmQsIGhEaXNwbGF5REMpOworICAgIH0KK30KKworc3RhdGljIElDT01fVlRBQkxFKElEaXJlY3REcmF3U3VyZmFjZTcpIFVzZXJfSURpcmVjdERyYXdTdXJmYWNlN19WVGFibGUgPQoreworICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfUXVlcnlJbnRlcmZhY2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9BZGRSZWYsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkQXR0YWNoZWRTdXJmYWNlLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQWRkT3ZlcmxheURpcnR5UmVjdCwKKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VfQmx0LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfQmx0QmF0Y2gsCisgICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX0JsdEZhc3QsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9EZWxldGVBdHRhY2hlZFN1cmZhY2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9FbnVtQXR0YWNoZWRTdXJmYWNlcywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0VudW1PdmVybGF5Wk9yZGVycywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0ZsaXAsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRBdHRhY2hlZFN1cmZhY2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRCbHRTdGF0dXMsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRDYXBzLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2xpcHBlciwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldENvbG9yS2V5LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0REMsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRGbGlwU3RhdHVzLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0T3ZlcmxheVBvc2l0aW9uLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UGFsZXR0ZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFBpeGVsRm9ybWF0LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2MsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9Jbml0aWFsaXplLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfSXNMb3N0LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfTG9jaywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2VEQywKKyAgICBESUJfRGlyZWN0RHJhd1N1cmZhY2VfUmVzdG9yZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldENsaXBwZXIsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRDb2xvcktleSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldE92ZXJsYXlQb3NpdGlvbiwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFBhbGV0dGUsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VbmxvY2ssCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfVXBkYXRlT3ZlcmxheURpc3BsYXksCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9VcGRhdGVPdmVybGF5Wk9yZGVyLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0RERJbnRlcmZhY2UsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9QYWdlTG9jaywKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1BhZ2VVbmxvY2ssCisgICAgRElCX0RpcmVjdERyYXdTdXJmYWNlX1NldFN1cmZhY2VEZXNjLAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfU2V0UHJpdmF0ZURhdGEsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRQcml2YXRlRGF0YSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0ZyZWVQcml2YXRlRGF0YSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0dldFVuaXF1ZW5lc3NWYWx1ZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX0NoYW5nZVVuaXF1ZW5lc3NWYWx1ZSwKKyAgICBNYWluX0RpcmVjdERyYXdTdXJmYWNlX1NldFByaW9yaXR5LAorICAgIE1haW5fRGlyZWN0RHJhd1N1cmZhY2VfR2V0UHJpb3JpdHksCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9TZXRMT0QsCisgICAgTWFpbl9EaXJlY3REcmF3U3VyZmFjZV9HZXRMT0QKK307CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2RzdXJmYWNlL3VzZXIuaCBiL2RsbHMvZGRyYXcvZHN1cmZhY2UvdXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMzkyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL2RkcmF3L2RzdXJmYWNlL3VzZXIuaApAQCAtMCwwICsxLDU4IEBACisvKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLiAqLworCisjaWZuZGVmIEREUkFXX0RTVVJGQUNFX1VTRVJfSF9JTkNMVURFRAorI2RlZmluZSBERFJBV19EU1VSRkFDRV9VU0VSX0hfSU5DTFVERUQKKworI2RlZmluZSBVU0VSX1BSSVYoc3VyZikgKChVc2VyX0RpcmVjdERyYXdTdXJmYWNlSW1wbCopKChzdXJmKS0+cHJpdmF0ZSkpCisKKyNkZWZpbmUgVVNFUl9QUklWX1ZBUihuYW1lLHN1cmYpIFwKKwlVc2VyX0RpcmVjdERyYXdTdXJmYWNlSW1wbCogbmFtZSA9IFVTRVJfUFJJVihzdXJmKQorCitzdHJ1Y3QgVXNlcl9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydAoreworICAgIEhXTkQgd2luZG93OworICAgIEhEQyBjYWNoZWRfZGM7CisgICAgSEFORExFIHVwZGF0ZV90aHJlYWQsIHVwZGF0ZV9ldmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgc3RydWN0IERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydCBkaWI7CisgICAgc3RydWN0IFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VJbXBsX1BhcnQgdXNlcjsKK30gVXNlcl9EaXJlY3REcmF3U3VyZmFjZUltcGw7CisKK0hSRVNVTFQKK1VzZXJfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0KElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCisJCQkJIElEaXJlY3REcmF3SW1wbCogcERELAorCQkJCSBjb25zdCBERFNVUkZBQ0VERVNDMiogcEREU0QpOworCitIUkVTVUxUCitVc2VyX0RpcmVjdERyYXdTdXJmYWNlX0NyZWF0ZShJRGlyZWN0RHJhd0ltcGwgKnBERCwKKwkJCSAgICAgIGNvbnN0IEREU1VSRkFDRURFU0MyICpwRERTRCwKKwkJCSAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3ICpwcFN1cmYsCisJCQkgICAgICBJVW5rbm93biAqcFVua091dGVyKTsKKwordm9pZCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2ZpbmFsX3JlbGVhc2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyk7CisKK3ZvaWQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9sb2NrX3VwZGF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCQlMUENSRUNUIHBSZWN0KTsKK3ZvaWQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV91bmxvY2tfdXBkYXRlKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCisJCQkJCSAgTFBDUkVDVCBwUmVjdCk7Cit2b2lkIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2Vfc2V0X3BhbGV0dGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkJSURpcmVjdERyYXdQYWxldHRlSW1wbCogcGFsKTsKK3ZvaWQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV91cGRhdGVfcGFsZXR0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzLAorCQkJCQkgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsKiBwYWwsCisJCQkJCSAgIERXT1JEIGR3U3RhcnQsIERXT1JEIGR3Q291bnQsCisJCQkJCSAgIExQUEFMRVRURUVOVFJZIHBhbGVudCk7CitIUkVTVUxUIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfZHVwbGljYXRlX3N1cmZhY2UoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywKKwkJCQkJCSBMUERJUkVDVERSQVdTVVJGQUNFNyogcHBEdXApOwordm9pZCBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX2ZsaXBfZGF0YShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBmcm9udCwKKwkJCQkgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBiYWNrKTsKK3ZvaWQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9mbGlwX3VwZGF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBUaGlzKTsKK0hXTkQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGlzcGxheV93aW5kb3coSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcyk7CisKK0hSRVNVTFQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9nZXRfZGMoSURpcmVjdERyYXdTdXJmYWNlSW1wbCogVGhpcywgSERDKiBwaERDKTsKK0hSRVNVTFQgVXNlcl9EaXJlY3REcmF3U3VyZmFjZV9yZWxlYXNlX2RjKElEaXJlY3REcmF3U3VyZmFjZUltcGwqIFRoaXMsCisJCQkJCSAgSERDIGhEQyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kc3VyZmFjZS93bmRwcm9jLmMgYi9kbGxzL2RkcmF3L2RzdXJmYWNlL3duZHByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTNhMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZGxscy9kZHJhdy9kc3VyZmFjZS93bmRwcm9jLmMKQEAgLTAsMCArMSw4NSBAQAorLyoJVXNlci1iYXNlZCBwcmltYXJ5IHN1cmZhY2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDAgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZGVidWd0b29scy5oIgorI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKKworREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKKworc3RhdGljIExSRVNVTFQgV0lOQVBJIERpcmVjdERyYXdTdXJmYWNlX1duZFByb2MoSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CisKK3ZvaWQgRGlyZWN0RHJhd1N1cmZhY2VfUmVnaXN0ZXJDbGFzcyh2b2lkKQoreworICAgIFdORENMQVNTQSB3YzsKKyAgICBtZW1zZXQoJndjLCAwLCBzaXplb2Yod2MpKTsKKyAgICB3Yy5scGZuV25kUHJvYyA9IERpcmVjdERyYXdTdXJmYWNlX1duZFByb2M7CisgICAgd2MuY2JXbmRFeHRyYSAgPSBzaXplb2YoSURpcmVjdERyYXdTdXJmYWNlSW1wbCopOworICAgIHdjLmhDdXJzb3IgICAgID0gKEhDVVJTT1IpSURDX0FSUk9XQTsKKyAgICB3Yy5scHN6Q2xhc3NOYW1lID0gIldJTkVfRERSQVciOworICAgIFJlZ2lzdGVyQ2xhc3NBKCZ3Yyk7Cit9CisKK3ZvaWQgRGlyZWN0RHJhd1N1cmZhY2VfVW5yZWdpc3RlckNsYXNzKHZvaWQpCit7CisgICAgVW5yZWdpc3RlckNsYXNzQSgiV0lORV9ERFJBVyIsIDApOworfQorCitzdGF0aWMgTFJFU1VMVCBXSU5BUEkgRGlyZWN0RHJhd1N1cmZhY2VfV25kUHJvYyhIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRoaXM7CisgICAgTFJFU1VMVCByZXQ7CisKKyAgICBUaGlzID0gKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKilHZXRXaW5kb3dMb25nQShod25kLCAwKTsKKyAgICBpZiAoVGhpcykgeworCUhXTkQgd2luZG93ID0gVGhpcy0+ZGRyYXdfb3duZXItPndpbmRvdzsKKworCXN3aXRjaCAobXNnKSB7CisJY2FzZSBXTV9ERVNUUk9ZOgorCWNhc2UgV01fTkNERVNUUk9ZOgorCWNhc2UgV01fU0hPV1dJTkRPVzoKKwljYXNlIFdNX1dJTkRPV1BPU0NIQU5HSU5HOgorCWNhc2UgV01fV0lORE9XUE9TQ0hBTkdFRDoKKwljYXNlIFdNX1NJWkU6CisJY2FzZSBXTV9NT1ZFOgorCWNhc2UgV01fRVJBU0VCS0dORDoKKwkgICAgLyogc2luY2Ugd2UncmUgcHJldGVuZGluZyBmdWxsc2NyZWVuLAorCSAgICAgKiBsZXQncyBub3QgcGFzcyB0aGVzZSBvbiB0byB0aGUgYXBwICovCisJICAgIHJldCA9IERlZldpbmRvd1Byb2NBKGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworCSAgICBicmVhazsKKwljYXNlIFdNX05DSElUVEVTVDoKKwkgICAgcmV0ID0gSFRDTElFTlQ7CisJICAgIGJyZWFrOworCWNhc2UgV01fTU9VU0VBQ1RJVkFURToKKwkgICAgcmV0ID0gTUFfTk9BQ1RJVkFURTsKKwkgICAgYnJlYWs7CisJY2FzZSBXTV9QQUlOVDoKKwkgICAgeworCQlQQUlOVFNUUlVDVCBwczsKKwkJSERDIGRjID0gQmVnaW5QYWludChod25kLCAmcHMpOworCQkvKiBjYWxsIFVzZXJfY29weV90b19zY3JlZW4/ICovCisJCUVuZFBhaW50KGh3bmQsICZwcyk7CisJCXJldCA9IDA7CisJICAgIH0KKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgcmV0ID0gd2luZG93ID8gU2VuZE1lc3NhZ2VBKHdpbmRvdywgbXNnLCB3UGFyYW0sIGxQYXJhbSkKKwkJCSA6IERlZldpbmRvd1Byb2NBKGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworCX0KKyAgICB9IGVsc2UgeworCWlmIChtc2cgPT0gV01fQ1JFQVRFKSB7CisJICAgIENSRUFURVNUUlVDVEEgKmNzID0gKENSRUFURVNUUlVDVEEgKilsUGFyYW07CisJICAgIFRoaXMgPSAoSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqKWNzLT5scENyZWF0ZVBhcmFtczsKKwkgICAgU2V0V2luZG93TG9uZ0EoaHduZCwgMCwgKExPTkcpVGhpcyk7CisJfQorCXJldCA9IERlZldpbmRvd1Byb2NBKGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kc3VyZmFjZS93bmRwcm9jLmggYi9kbGxzL2RkcmF3L2RzdXJmYWNlL3duZHByb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODM1NDhiCi0tLSAvZGV2L251bGwKKysrIGIvZGxscy9kZHJhdy9kc3VyZmFjZS93bmRwcm9jLmgKQEAgLTAsMCArMSw5IEBACisvKiBDb3B5cmlnaHQgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLiAqLworCisjaWZuZGVmIEREUkFXX0RTVVJGQUNFX1dORFBST0NfSF9JTkNMVURFRAorI2RlZmluZSBERFJBV19EU1VSRkFDRV9XTkRQUk9DX0hfSU5DTFVERUQKKwordm9pZCBEaXJlY3REcmF3U3VyZmFjZV9SZWdpc3RlckNsYXNzKHZvaWQpOwordm9pZCBEaXJlY3REcmF3U3VyZmFjZV9VbnJlZ2lzdGVyQ2xhc3Modm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGxscy9kZHJhdy9kc3VyZmFjZS94MTEuYyBiL2RsbHMvZGRyYXcvZHN1cmZhY2UveDExLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NGIxMGIuLjAwMDAwMDAKLS0tIGEvZGxscy9kZHJhdy9kc3VyZmFjZS94MTEuYworKysgL2Rldi9udWxsCkBAIC0xLDcyMyArMCwwIEBACi0vKgkJRGlyZWN0RHJhd1N1cmZhY2UgWGxpYiBpbXBsZW1lbnRhdGlvbgotICoKLSAqIENvcHlyaWdodCAxOTk3LTIwMDAgTWFyY3VzIE1laXNzbmVyCi0gKiBDb3B5cmlnaHQgMTk5OC0yMDAwIExpb25lbCBVbG1lciAobW9zdCBvZiBEaXJlY3QzRCBzdHVmZikKLSAqLwotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIndpbmVycm9yLmgiCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJvcHRpb25zLmgiCi0jaW5jbHVkZSAiZGVidWd0b29scy5oIgotI2luY2x1ZGUgIngxMV9wcml2YXRlLmgiCi0jaW5jbHVkZSAiYml0bWFwLmgiCi0jaW5jbHVkZSAid2luLmgiCi0jaW5jbHVkZSAiZDNkLmgiCi0KLSNpZmRlZiBIQVZFX09QRU5HTAotLyogZm9yIGQzZCB0ZXh0dXJlIHN0dWZmICovCi0jIGluY2x1ZGUgIm1lc2FfcHJpdmF0ZS5oIgotI2VuZGlmCi0KLURFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Ci0KLSNkZWZpbmUgVklTSUJMRSh4KSAoU0REU0NBUFMoeCkgJiAoRERTQ0FQU19WSVNJQkxFfEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UpKQotCi0jZGVmaW5lIEREUFJJVkFURSh4KSB4MTFfZGRfcHJpdmF0ZSAqZGRwcml2ID0gKCh4MTFfZGRfcHJpdmF0ZSopKHgpLT5kLT5wcml2YXRlKQotI2RlZmluZSBEUFBSSVZBVEUoeCkgeDExX2RwX3ByaXZhdGUgKmRwcHJpdiA9ICgoeDExX2RwX3ByaXZhdGUqKSh4KS0+cHJpdmF0ZSkKLSNkZWZpbmUgRFNQUklWQVRFKHgpIHgxMV9kc19wcml2YXRlICpkc3ByaXYgPSAoKHgxMV9kc19wcml2YXRlKikoeCktPnByaXZhdGUpCi0KLXN0YXRpYyBCWVRFIFhsaWJfVG91Y2hEYXRhKExQVk9JRCBkYXRhKQotewotICAgIC8qIHRoaXMgaXMgYSBmdW5jdGlvbiBzbyBpdCBkb2Vzbid0IGdldCBvcHRpbWl6ZWQgb3V0ICovCi0gICAgcmV0dXJuICooQllURSopZGF0YTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCUlEaXJlY3REcmF3U3VyZmFjZSBtZXRob2RzCi0gKgotICogU2luY2UgRERTMyBhbmQgRERTMiBhcmUgc3VwZXJzZXRzIG9mIEREUywgd2UgaW1wbGVtZW50IEREUzMgYW5kIGxldAotICogRERTIGFuZCBERFMyIHVzZSB0aG9zZSBmdW5jdGlvbnMuIChGdW5jdGlvbiBjYWxscyBkaWQgbm90IGNoYW5nZSAoZXhjZXB0Ci0gKiB1c2luZyBkaWZmZXJlbnQgRGlyZWN0RHJhd1N1cmZhY2VYIHZlcnNpb24pLCBqdXN0IGFkZGVkIGZsYWdzIGFuZCBmdW5jdGlvbnMpCi0gKi8KLUhSRVNVTFQgV0lOQVBJIFhsaWJfSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUXVlcnlJbnRlcmZhY2UoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iagotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLQotICAgIFRSQUNFKCIoJXApLT4oJXMsJXApXG4iLFRoaXMsZGVidWdzdHJfZ3VpZChyZWZpaWQpLG9iaik7Ci0gICAgCi0gICAgLyogQWxsIERpcmVjdERyYXdTdXJmYWNlIHZlcnNpb25zICgxLCAyLCAzIGFuZCA0KSB1c2UKLSAgICAgKiB0aGUgc2FtZSBpbnRlcmZhY2UuIEFuZCBJVW5rbm93biBkb2VzIHRoYXQgdG9vIG9mIGNvdXJzZS4KLSAgICAgKi8KLSAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTQsIHJlZmlpZCApCXx8Ci0JIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTMsIHJlZmlpZCApCXx8Ci0JIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZTIsIHJlZmlpZCApCXx8Ci0JIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3U3VyZmFjZSwgIHJlZmlpZCApCXx8Ci0JIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCAgICAgICAgICAgIHJlZmlpZCApCi0gICAgKSB7Ci0JICAgICpvYmogPSBUaGlzOwotCSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0X0FkZFJlZihpZmFjZSk7Ci0KLQkgICAgVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdERyYXdTdXJmYWNlIGludGVyZmFjZSAoJXApXG4iLCAqb2JqKTsKLQkgICAgcmV0dXJuIFNfT0s7Ci0gICAgfQotI2lmZGVmIEhBVkVfT1BFTkdMCi0gICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RUZXh0dXJlMiwgcmVmaWlkICkgKSB7Ci0JLyogVGV4dHVyZSBpbnRlcmZhY2UgKi8KLQkqb2JqID0gZDNkdGV4dHVyZTJfY3JlYXRlKFRoaXMpOwotCUlEaXJlY3REcmF3U3VyZmFjZTRfQWRkUmVmKGlmYWNlKTsKLQlUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0M0RUZXh0dXJlMiBpbnRlcmZhY2UgKCVwKVxuIiwgKm9iaik7Ci0JcmV0dXJuIFNfT0s7Ci0gICAgfQotICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNEVGV4dHVyZSwgcmVmaWlkICkgKSB7Ci0JLyogVGV4dHVyZSBpbnRlcmZhY2UgKi8KLQkqb2JqID0gZDNkdGV4dHVyZV9jcmVhdGUoVGhpcyk7Ci0JSURpcmVjdERyYXdTdXJmYWNlNF9BZGRSZWYoaWZhY2UpOwotCVRSQUNFKCIgIENyZWF0aW5nIElEaXJlY3QzRFRleHR1cmUgaW50ZXJmYWNlICglcClcbiIsICpvYmopOwotCXJldHVybiBTX09LOwotICAgIH0KLSNlbHNlCi0gICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RUZXh0dXJlMiwgcmVmaWlkICkgfHwKLSAgICAgICAgIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRFRleHR1cmUsIHJlZmlpZCApCi0gICAgICAgKQotICAgIHsKLSAgICAgICBFUlIoICJDYW5ub3QgcHJvdmlkZSAzRCBzdXBwb3J0IHdpdGhvdXQgT3BlbkdML01lc2EgaW5zdGFsbGVkXG4iICk7Ci0gICAgfQotI2VuZGlmIC8qIEhBVkVfT1BFTkdMICovCi0gICAgRklYTUUoIiglcCk6aW50ZXJmYWNlIGZvciBJSUQgJXMgTk9UIGZvdW5kIVxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmVmaWlkKSk7Ci0gICAgcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOwotfQotCi1IUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0xvY2soCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBSRUNUIGxwcmVjdCxMUEREU1VSRkFDRURFU0MgbHBkZHNkLERXT1JEIGZsYWdzLCBIQU5ETEUgaG5kCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICAgIERTUFJJVkFURShUaGlzKTsKLSAgICBERFBSSVZBVEUoVGhpcy0+cy5kZHJhdyk7Ci0KLSAgICAvKiBETyBOT1QgQWRkUmVmIHRoZSBzdXJmYWNlISBMb2NrL1VubG9jayBhcmUgTk9UIGd1YXJhbnRlZWQgdG8gY29tZSBpbiAKLSAgICAgKiBtYXRjaGVkIHBhaXJzISAtIE1hcmN1cyBNZWlzc25lciAyMDAwMDUwOSAqLwotICAgIFRSQUNFKCIoJXApLT5Mb2NrKCVwLCVwLCUwOGx4LCUwOGx4KSByZXQ9JXBcbiIsVGhpcyxscHJlY3QsbHBkZHNkLGZsYWdzLChEV09SRClobmQsX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLSAgICBpZiAoZmxhZ3MgJiB+KERETE9DS19XQUlUfERETE9DS19SRUFET05MWXxERExPQ0tfV1JJVEVPTkxZKSkKLQlXQVJOKCIoJXApLT5Mb2NrKCVwLCVwLCUwOGx4LCUwOGx4KVxuIiwKLQkJICAgICBUaGlzLGxwcmVjdCxscGRkc2QsZmxhZ3MsKERXT1JEKWhuZCk7Ci0KLSAgICAvKiBGaXJzdCwgY29weSB0aGUgU3VyZmFjZSBkZXNjcmlwdGlvbiAqLwotICAgICpscGRkc2QgPSBUaGlzLT5zLnN1cmZhY2VfZGVzYzsKLSAgICBUUkFDRSgibG9ja2VkIHN1cmZhY2U6IGhlaWdodD0lbGQsIHdpZHRoPSVsZCwgcGl0Y2g9JWxkXG4iLAotCSAgbHBkZHNkLT5kd0hlaWdodCxscGRkc2QtPmR3V2lkdGgsbHBkZHNkLT5sUGl0Y2gpOwotCi0gICAgLyogSWYgYXNrZWQgb25seSBmb3IgYSBwYXJ0LCBjaGFuZ2UgdGhlIHN1cmZhY2UgcG9pbnRlciAqLwotICAgIGlmIChscHJlY3QpIHsKLQlUUkFDRSgiCWxwcmVjdDogJWR4JWQtJWR4JWRcbiIsCi0JCWxwcmVjdC0+dG9wLGxwcmVjdC0+bGVmdCxscHJlY3QtPmJvdHRvbSxscHJlY3QtPnJpZ2h0Ci0JKTsKLQlpZiAoKGxwcmVjdC0+dG9wIDwgMCkgfHwKLQkgICAgKGxwcmVjdC0+bGVmdCA8IDApIHx8Ci0JICAgIChscHJlY3QtPmJvdHRvbSA8IDApIHx8Ci0JICAgIChscHJlY3QtPnJpZ2h0IDwgMCkpIHsKLQkgIEVSUigiIE5lZ2F0aXZlIHZhbHVlcyBpbiBMUFJFQ1QgISEhXG4iKTsKLQkgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwotCX0KLQlscGRkc2QtPnUxLmxwU3VyZmFjZT0oTFBWT0lEKSgoY2hhciopVGhpcy0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlKwotCQkobHByZWN0LT50b3AqVGhpcy0+cy5zdXJmYWNlX2Rlc2MubFBpdGNoKSArCi0JCWxwcmVjdC0+bGVmdCpHRVRfQlBQKFRoaXMtPnMuc3VyZmFjZV9kZXNjKSk7Ci0gICAgfSBlbHNlCi0JYXNzZXJ0KFRoaXMtPnMuc3VyZmFjZV9kZXNjLnUxLmxwU3VyZmFjZSk7Ci0gICAgLyogd2FpdCBmb3IgYW55IHByZXZpb3VzIG9wZXJhdGlvbnMgdG8gY29tcGxldGUgKi8KLSNpZmRlZiBIQVZFX0xJQlhYU0hNCi0gICAgaWYgKGRzcHJpdi0+aW5mby5pbWFnZSAmJiBWSVNJQkxFKFRoaXMpICYmIGRkcHJpdi0+eHNobV9hY3RpdmUpIHsKLS8qCi0JaW50IGNvbXBsID0gSW50ZXJsb2NrZWRFeGNoYW5nZSggJihkZHByaXYtPnhzaG1fY29tcGwpLCAwICk7Ci0JaWYgKGNvbXBsKSBYMTFEUlZfRVZFTlRfV2FpdFNobUNvbXBsZXRpb24oIGNvbXBsICk7Ci0qLwotCVgxMURSVl9FVkVOVF9XYWl0U2htQ29tcGxldGlvbnMoIGRkcHJpdi0+ZHJhd2FibGUgKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIElmIHBhcnQgb2YgYSB2aXNpYmxlICdjbGlwcGVkJyBzdXJmYWNlLCBjb3B5IHdoYXQgaXMgc2VlbiBvbiB0aGUKLSAgICAgICBzY3JlZW4gdG8gdGhlIHN1cmZhY2UgKi8KLSAgICBpZiAoKGRzcHJpdi0+aW5mby5pbWFnZSAmJiBWSVNJQkxFKFRoaXMpKSAmJgotCShUaGlzLT5zLmxwQ2xpcHBlcikpIHsKLSAgICAgICAgICBIV05EIGhXbmQgPSAoKElEaXJlY3REcmF3Q2xpcHBlckltcGwgKikgVGhpcy0+cy5scENsaXBwZXIpLT5oV25kOwotCSAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKLQkgIERyYXdhYmxlIGRyYXdhYmxlID0gWDExRFJWX1dORF9HZXRYV2luZG93KHduZFB0cik7Ci0JICBpbnQgd2lkdGggPSB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RDbGllbnQubGVmdDsKLQkgIGludCBoZWlnaHQgPSB3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tIC0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcDsKLQkgIC8qIE5vdywgZ2V0IHRoZSBzb3VyY2UgLyBkZXN0aW5hdGlvbiBjb29yZGluYXRlcyAqLwotCSAgaW50IGRlc3RfeCA9IHduZFB0ci0+cmVjdENsaWVudC5sZWZ0OwotCSAgaW50IGRlc3RfeSA9IHduZFB0ci0+cmVjdENsaWVudC50b3A7Ci0KLQkgIGlmICghZHJhd2FibGUpIHsgLyogd2UgYXJlIHJ1bm5pbmcgaW4gLWRlc2t0b3AgbW9kZSAqLwotCSAgICAgIGRyYXdhYmxlID0gWDExRFJWX1dORF9HZXRYV2luZG93KFdJTl9HZXREZXNrdG9wKCkpOwotCSAgICAgIC8qIEZJWE1FOiBub3Qgc3VyZSB3aGV0aGVyIHRoZXNlIGFyZSB0aGUgcmlnaHQgb2Zmc2V0cyAqLwotCSAgICAgIGRlc3RfeCs9d25kUHRyLT5yZWN0V2luZG93LmxlZnQ7Ci0JICAgICAgZGVzdF95Kz13bmRQdHItPnJlY3RXaW5kb3cudG9wOwotCSAgICAgIFdJTl9SZWxlYXNlRGVza3RvcCgpOwotCSAgfQotCi0JICBUU1hHZXRTdWJJbWFnZShkaXNwbGF5LCBkcmF3YWJsZSwgMCwgMCwgd2lkdGgsIGhlaWdodCwgMHhGRkZGRkZGRiwKLQkJICAgICAgIFpQaXhtYXAsIGRzcHJpdi0+aW5mby5pbWFnZSwgZGVzdF94LCBkZXN0X3kpOwotCSAgCi0JICBXSU5fUmVsZWFzZVduZFB0cih3bmRQdHIpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIFhsaWJfY29weV9zdXJmYWNlX29uX3NjcmVlbihJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCogVGhpcykgewotICBEU1BSSVZBVEUoVGhpcyk7Ci0gIEREUFJJVkFURShUaGlzLT5zLmRkcmF3KTsKLSAgRHJhd2FibGUgZHJhd2FibGUgPSBkZHByaXYtPmRyYXdhYmxlOwotICBQT0lOVCBhZGp1c3RbMl0gPSB7ezAsIDB9LCB7MCwgMH19OwotICBTSVpFIGltZ3NpejsKLQotICAvKiBHZXQgWEltYWdlIHNpemUgKi8KLSAgaW1nc2l6LmN4ID0gZHNwcml2LT5pbmZvLmltYWdlLT53aWR0aDsKLSAgaW1nc2l6LmN5ID0gZHNwcml2LT5pbmZvLmltYWdlLT5oZWlnaHQ7Ci0KLSAgaWYgKFRoaXMtPnMubHBDbGlwcGVyKSB7Ci0gICAgSFdORCBoV25kID0gKChJRGlyZWN0RHJhd0NsaXBwZXJJbXBsICopIFRoaXMtPnMubHBDbGlwcGVyKS0+aFduZDsKLSAgICBTSVpFIGNzaXo7Ci0gICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKLSAgICBkcmF3YWJsZSA9IFgxMURSVl9XTkRfR2V0WFdpbmRvdyh3bmRQdHIpOwotICAgIAotICAgIE1hcFdpbmRvd1BvaW50cyhoV25kLCAwLCBhZGp1c3QsIDIpOwotCi0gICAgaW1nc2l6LmN4IC09IGFkanVzdFswXS54OwotICAgIGltZ3Npei5jeSAtPSBhZGp1c3RbMF0ueTsKLSAgICAvKiAobm90ZTogdGhlIHJlY3RXaW5kb3cgaGVyZSBzaG91bGQgYmUgdGhlIFggd2luZG93J3MgaW50ZXJpb3IgcmVjdCwgaW4KLSAgICAgKiAgY2FzZSBhbnlvbmUgdGhpbmtzIG90aGVyd2lzZSB3aGlsZSByZXdyaXRpbmcgbWFuYWdlZCBtb2RlKSAqLwotICAgIGFkanVzdFsxXS54IC09IHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0OwotICAgIGFkanVzdFsxXS55IC09IHduZFB0ci0+cmVjdFdpbmRvdy50b3A7Ci0gICAgY3Npei5jeCA9IHduZFB0ci0+cmVjdENsaWVudC5yaWdodCAtIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0OwotICAgIGNzaXouY3kgPSB3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tIC0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcDsKLSAgICBpZiAoY3Npei5jeCA8IGltZ3Npei5jeCkgaW1nc2l6LmN4ID0gY3Npei5jeDsKLSAgICBpZiAoY3Npei5jeSA8IGltZ3Npei5jeSkgaW1nc2l6LmN5ID0gY3Npei5jeTsKLSAgICAKLSAgICBUUkFDRSgiYWRqdXN0OiBod25kPSUwOHgsIHN1cmZhY2UgJWxkeCVsZCwgZHJhd2FibGUgJWxkeCVsZFxuIiwgaFduZCwKLQkgIGFkanVzdFswXS54LCBhZGp1c3RbMF0ueSwKLQkgIGFkanVzdFsxXS54LGFkanVzdFsxXS55KTsKLSAgICAKLSAgICBXSU5fUmVsZWFzZVduZFB0cih3bmRQdHIpOwotICB9Ci0KLSAgaWYgKCFkcmF3YWJsZSkgewotICAgIFdORCAqdG1wV25kID0gV0lOX0ZpbmRXbmRQdHIoVGhpcy0+cy5kZHJhdy0+ZC0+d2luZG93KTsKLSAgICBkcmF3YWJsZSA9IFgxMURSVl9XTkRfR2V0WFdpbmRvdyh0bXBXbmQpOwotICAgIFdJTl9SZWxlYXNlV25kUHRyKHRtcFduZCk7Ci0KLSAgICAvKiBXZSBkb24ndCBoYXZlIGEgY29udGV4dCBmb3IgdGhpcyB3aW5kb3cuIEhvc3Qgb2ZmIHRoZSBkZXNrdG9wICovCi0gICAgaWYoICFkcmF3YWJsZSApIHsKLQlGSVhNRSgiSGF2ZSB0byB1c2UgRGVza3RvcCBSb290IFdpbmRvdz8/PyBCdW1tZXIuXG4iKTsKLQlkcmF3YWJsZSA9IFgxMURSVl9XTkRfR2V0WFdpbmRvdyhXSU5fR2V0RGVza3RvcCgpKTsKLQlXSU5fUmVsZWFzZURlc2t0b3AoKTsKLSAgICB9Ci0gICAgZGRwcml2LT5kcmF3YWJsZSA9IGRyYXdhYmxlOwotICB9Ci0gIAotICBpZiAoVGhpcy0+cy5kZHJhdy0+ZC0+cGl4ZWxfY29udmVydCAhPSBOVUxMKQotICAgIFRoaXMtPnMuZGRyYXctPmQtPnBpeGVsX2NvbnZlcnQoVGhpcy0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlLAotCQkJCSAgIGRzcHJpdi0+aW5mby5pbWFnZS0+ZGF0YSwKLQkJCQkgICBUaGlzLT5zLnN1cmZhY2VfZGVzYy5kd1dpZHRoLAotCQkJCSAgIFRoaXMtPnMuc3VyZmFjZV9kZXNjLmR3SGVpZ2h0LAotCQkJCSAgIFRoaXMtPnMuc3VyZmFjZV9kZXNjLmxQaXRjaCwKLQkJCQkgICBUaGlzLT5zLnBhbGV0dGUpOwotCi0gIC8qIGlmIHRoZSBESUIgc2VjdGlvbiBpcyBpbiBHZGlNb2Qgc3RhdGUsIHdlIG11c3QKLSAgICogdG91Y2ggdGhlIHN1cmZhY2UgdG8gZ2V0IGFueSB1cGRhdGVzIGZyb20gdGhlIERJQiAqLwotICBYbGliX1RvdWNoRGF0YShkc3ByaXYtPmluZm8uaW1hZ2UtPmRhdGEpOwotI2lmZGVmIEhBVkVfTElCWFhTSE0KLSAgICBpZiAoZGRwcml2LT54c2htX2FjdGl2ZSkgewotLyoKLQlYMTFEUlZfRVZFTlRfV2FpdFJlcGxhY2VTaG1Db21wbGV0aW9uKCAmKGRkcHJpdi0+eHNobV9jb21wbCksIFRoaXMtPnMuZGRyYXctPmQuZHJhd2FibGUgKTsKLSovCi0JLyogbGV0IFdhaXRTaG1Db21wbGV0aW9ucyB0cmFjayAnZW0gZm9yIG5vdyAqLwotCS8qICh5b3UgbWF5IHdhbnQgdG8gdHJhY2sgaXQgYWdhaW4gd2hlbmV2ZXIgeW91IGltcGxlbWVudCBEWDcncyBwYXJ0aWFsCi0JKiBzdXJmYWNlIGxvY2tpbmcsIHdoZXJlIHRocmVhZHMgaGF2ZSBjb25jdXJyZW50IGFjY2VzcykgKi8KLQlYMTFEUlZfRVZFTlRfUHJlcGFyZVNobUNvbXBsZXRpb24oIGRkcHJpdi0+ZHJhd2FibGUgKTsKLQlUU1hTaG1QdXRJbWFnZShkaXNwbGF5LAotCQkgICAgICAgZHJhd2FibGUsCi0JCSAgICAgICBEZWZhdWx0R0NPZlNjcmVlbihYMTFEUlZfR2V0WFNjcmVlbigpKSwKLQkJICAgICAgIGRzcHJpdi0+aW5mby5pbWFnZSwKLQkJICAgICAgIGFkanVzdFswXS54LCBhZGp1c3RbMF0ueSwgYWRqdXN0WzFdLngsIGFkanVzdFsxXS55LAotCQkgICAgICAgaW1nc2l6LmN4LCBpbWdzaXouY3ksCi0JCSAgICAgICBUcnVlCi0JCSAgICAgICApOwotCS8qIG1ha2Ugc3VyZSB0aGUgaW1hZ2UgaXMgdHJhbnNmZXJyZWQgQVNBUCAqLwotCVRTWEZsdXNoKGRpc3BsYXkpOwotICAgIH0gZWxzZQotI2VuZGlmCi0JVFNYUHV0SW1hZ2UoZGlzcGxheSwKLQkJICAgIGRyYXdhYmxlLAotCQkgICAgRGVmYXVsdEdDT2ZTY3JlZW4oWDExRFJWX0dldFhTY3JlZW4oKSksCi0JCSAgICBkc3ByaXYtPmluZm8uaW1hZ2UsCi0JCSAgICBhZGp1c3RbMF0ueCwgYWRqdXN0WzBdLnksIGFkanVzdFsxXS54LCBhZGp1c3RbMV0ueSwKLQkJICAgIGltZ3Npei5jeCwgaW1nc2l6LmN5Ci0JCSAgICApOwotfQotCi0jaWZkZWYgSEFWRV9YVklERU8KLXN0YXRpYyB2b2lkIFhsaWJfY29weV9vdmVybGF5X29uX3NjcmVlbihJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCogVGhpcykgewotICBEU1BSSVZBVEUoVGhpcyk7Ci0gIEREUFJJVkFURShUaGlzLT5zLmRkcmF3KTsKLSAgRHJhd2FibGUgZHJhd2FibGUgPSBkZHByaXYtPmRyYXdhYmxlOwotCi0gIGlmICghZHJhd2FibGUpIHsKLSAgICBXTkQgKnRtcFduZCA9IFdJTl9GaW5kV25kUHRyKFRoaXMtPnMuZGRyYXctPmQtPndpbmRvdyk7Ci0gICAgZHJhd2FibGUgPSBYMTFEUlZfV05EX0dldFhXaW5kb3codG1wV25kKTsKLSAgICBXSU5fUmVsZWFzZVduZFB0cih0bXBXbmQpOwotCi0gICAgLyogV2UgZG9uJ3QgaGF2ZSBhIGNvbnRleHQgZm9yIHRoaXMgd2luZG93LiBIb3N0IG9mZiB0aGUgZGVza3RvcCAqLwotICAgIGlmKCAhZHJhd2FibGUgKSB7Ci0JRklYTUUoIkhhdmUgdG8gdXNlIERlc2t0b3AgUm9vdCBXaW5kb3c/Pz8gQnVtbWVyLlxuIik7Ci0JZHJhd2FibGUgPSBYMTFEUlZfV05EX0dldFhXaW5kb3coV0lOX0dldERlc2t0b3AoKSk7Ci0JV0lOX1JlbGVhc2VEZXNrdG9wKCk7Ci0gICAgfQotICAgIGRkcHJpdi0+ZHJhd2FibGUgPSBkcmF3YWJsZTsKLSAgfQotCi0jaWZkZWYgSEFWRV9MSUJYWFNITQotICAgIGlmIChkZHByaXYtPnhzaG1fYWN0aXZlKSB7Ci0JLyogbGV0IFdhaXRTaG1Db21wbGV0aW9ucyB0cmFjayAnZW0gZm9yIG5vdyAqLwotCS8qICh5b3UgbWF5IHdhbnQgdG8gdHJhY2sgaXQgYWdhaW4gd2hlbmV2ZXIgeW91IGltcGxlbWVudCBEWDcncyBwYXJ0aWFsCi0JKiBzdXJmYWNlIGxvY2tpbmcsIHdoZXJlIHRocmVhZHMgaGF2ZSBjb25jdXJyZW50IGFjY2VzcykgKi8KLQlYMTFEUlZfRVZFTlRfUHJlcGFyZVNobUNvbXBsZXRpb24oIGRkcHJpdi0+ZHJhd2FibGUgKTsKLQlUU1h2U2htUHV0SW1hZ2UoZGlzcGxheSwgZGRwcml2LT5wb3J0X2lkLCBkcmF3YWJsZSwgRGVmYXVsdEdDT2ZTY3JlZW4oWDExRFJWX0dldFhTY3JlZW4oKSksCi0JCQlkc3ByaXYtPmluZm8ub3ZlcmxheS5pbWFnZSwKLQkJCWRzcHJpdi0+aW5mby5vdmVybGF5LnNyY19yZWN0LmxlZnQsIGRzcHJpdi0+aW5mby5vdmVybGF5LnNyY19yZWN0LnRvcCwKLQkJCWRzcHJpdi0+aW5mby5vdmVybGF5LnNyY19yZWN0LnJpZ2h0IC0gZHNwcml2LT5pbmZvLm92ZXJsYXkuc3JjX3JlY3QubGVmdCwKLQkJCWRzcHJpdi0+aW5mby5vdmVybGF5LnNyY19yZWN0LmJvdHRvbSAtIGRzcHJpdi0+aW5mby5vdmVybGF5LnNyY19yZWN0LnRvcCwKLQkJCWRzcHJpdi0+aW5mby5vdmVybGF5LmRzdF9yZWN0LmxlZnQsIGRzcHJpdi0+aW5mby5vdmVybGF5LmRzdF9yZWN0LnRvcCwKLQkJCWRzcHJpdi0+aW5mby5vdmVybGF5LmRzdF9yZWN0LnJpZ2h0IC0gZHNwcml2LT5pbmZvLm92ZXJsYXkuZHN0X3JlY3QubGVmdCwKLQkJCWRzcHJpdi0+aW5mby5vdmVybGF5LmRzdF9yZWN0LmJvdHRvbSAtIGRzcHJpdi0+aW5mby5vdmVybGF5LmRzdF9yZWN0LnRvcCwKLQkJCVRydWUpOwotCS8qIG1ha2Ugc3VyZSB0aGUgaW1hZ2UgaXMgdHJhbnNmZXJyZWQgQVNBUCAqLwotCVRTWEZsdXNoKGRpc3BsYXkpOwotICAgIH0gZWxzZQotI2VuZGlmCi0gICAgICBUU1h2UHV0SW1hZ2UoZGlzcGxheSwgZGRwcml2LT5wb3J0X2lkLCBkcmF3YWJsZSwgRGVmYXVsdEdDT2ZTY3JlZW4oWDExRFJWX0dldFhTY3JlZW4oKSksCi0JCSAgIGRzcHJpdi0+aW5mby5vdmVybGF5LmltYWdlLAotCQkgICBkc3ByaXYtPmluZm8ub3ZlcmxheS5zcmNfcmVjdC5sZWZ0LCBkc3ByaXYtPmluZm8ub3ZlcmxheS5zcmNfcmVjdC50b3AsCi0JCSAgIGRzcHJpdi0+aW5mby5vdmVybGF5LnNyY19yZWN0LnJpZ2h0IC0gZHNwcml2LT5pbmZvLm92ZXJsYXkuc3JjX3JlY3QubGVmdCwKLQkJICAgZHNwcml2LT5pbmZvLm92ZXJsYXkuc3JjX3JlY3QuYm90dG9tIC0gZHNwcml2LT5pbmZvLm92ZXJsYXkuc3JjX3JlY3QudG9wLAotCQkgICBkc3ByaXYtPmluZm8ub3ZlcmxheS5kc3RfcmVjdC5sZWZ0LCBkc3ByaXYtPmluZm8ub3ZlcmxheS5kc3RfcmVjdC50b3AsCi0JCSAgIGRzcHJpdi0+aW5mby5vdmVybGF5LmRzdF9yZWN0LnJpZ2h0IC0gZHNwcml2LT5pbmZvLm92ZXJsYXkuZHN0X3JlY3QubGVmdCwKLQkJICAgZHNwcml2LT5pbmZvLm92ZXJsYXkuZHN0X3JlY3QuYm90dG9tIC0gZHNwcml2LT5pbmZvLm92ZXJsYXkuZHN0X3JlY3QudG9wKTsKLX0KLSNlbmRpZgotCi1IUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1VubG9jaygKLSAgICBMUERJUkVDVERSQVdTVVJGQUNFNCBpZmFjZSxMUFZPSUQgc3VyZmFjZQotKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBERFBSSVZBVEUoVGhpcy0+cy5kZHJhdyk7Ci0gICAgRFNQUklWQVRFKFRoaXMpOwotICAgIFRSQUNFKCIoJXApLT5VbmxvY2soJXApXG4iLFRoaXMsc3VyZmFjZSk7Ci0KLSAgICAvKmlmICghVGhpcy0+cy5kZHJhdy0+ZC5wYWludGFibGUpCi0JcmV0dXJuIEREX09LOyAqLwotCi0gICAgLyogT25seSByZWRyYXcgdGhlIHNjcmVlbiB3aGVuIHVubG9ja2luZyB0aGUgYnVmZmVyIHRoYXQgaXMgb24gc2NyZWVuICovCi0gICAgaWYgKGRzcHJpdi0+aW5mby5pbWFnZSAmJiBWSVNJQkxFKFRoaXMpKSB7Ci0JWGxpYl9jb3B5X3N1cmZhY2Vfb25fc2NyZWVuKFRoaXMpOwotCWlmIChUaGlzLT5zLnBhbGV0dGUpIHsKLSAgICAJICAgIERQUFJJVkFURShUaGlzLT5zLnBhbGV0dGUpOwotCSAgICBpZihkcHByaXYtPmNtKQotCQlUU1hTZXRXaW5kb3dDb2xvcm1hcChkaXNwbGF5LGRkcHJpdi0+ZHJhd2FibGUsZHBwcml2LT5jbSk7Ci0JfQotICAgIH0gZWxzZSBpZiAoZHNwcml2LT5pc19vdmVybGF5KSB7Ci0gICAgICAvKiBDYXNlIG9mIGFuIG92ZXJsYXkgc3VyZmFjZSAqLwotI2lmZGVmIEhBVkVfWFZJREVPCi0gICAgICBpZiAoZHNwcml2LT5pbmZvLm92ZXJsYXkuc2hvd24pCi0JWGxpYl9jb3B5X292ZXJsYXlfb25fc2NyZWVuKFRoaXMpOwotI2Vsc2UKLSAgICAgIEVSUigiV2h5IHdhcyB0aGlzIGNvZGUgYWN0aXZhdGVkIFdJVEhPVVQgWFZpZGVvIHN1cHBvcnQgP1xuIik7Ci0jZW5kaWYKLSAgICB9IAotICAgIC8qIERPIE5PVCBSZWxlYXNlIHRoZSBzdXJmYWNlISBMb2NrL1VubG9jayBhcmUgTk9UIGd1YXJhbnRlZWQgdG8gY29tZSBpbiAKLSAgICAgKiBtYXRjaGVkIHBhaXJzISAtIE1hcmN1cyBNZWlzc25lciAyMDAwMDUwOSAqLwotICAgIHJldHVybiBERF9PSzsKLX0KLQotSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9GbGlwKAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLExQRElSRUNURFJBV1NVUkZBQ0U0IGZsaXB0byxEV09SRCBkd0ZsYWdzCi0pIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICAgIFhJbWFnZQkqaW1hZ2U7Ci0gICAgRERQUklWQVRFKFRoaXMtPnMuZGRyYXcpOwotICAgIERTUFJJVkFURShUaGlzKTsKLSAgICB4MTFfZHNfcHJpdmF0ZQkqZnNwcml2OwotICAgIExQQllURQlzdXJmOwotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsKiBpZmxpcHRvPShJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCopZmxpcHRvOwotCi0gICAgVFJBQ0UoIiglcCktPkZsaXAoJXAsJTA4bHgpXG4iLFRoaXMsaWZsaXB0byxkd0ZsYWdzKTsKLSAgICBpZiAoKCFUaGlzLT5zLmRkcmF3LT5kLT5wYWludGFibGUpICYmIChkc3ByaXYtPmlzX292ZXJsYXkgPT0gRkFMU0UpKQotCXJldHVybiBERF9PSzsKLSAgICAKLSAgICBpZmxpcHRvID0gX2NvbW1vbl9maW5kX2ZsaXB0byhUaGlzLGlmbGlwdG8pOwotICAgIGZzcHJpdiA9ICh4MTFfZHNfcHJpdmF0ZSopaWZsaXB0by0+cHJpdmF0ZTsKLQotICAgIC8qIFdlIG5lZWQgdG8gc3dpdGNoIHRoZSBsb3dsZXZlbCBzdXJmYWNlcywgZm9yIHhsaWIgdGhpcyBpczogKi8KLSAgICAvKiBUaGUgc3VyZmFjZSBwb2ludGVyICovCi0gICAgc3VyZgkJCQk9IFRoaXMtPnMuc3VyZmFjZV9kZXNjLnUxLmxwU3VyZmFjZTsKLSAgICBUaGlzLT5zLnN1cmZhY2VfZGVzYy51MS5scFN1cmZhY2UJPSBpZmxpcHRvLT5zLnN1cmZhY2VfZGVzYy51MS5scFN1cmZhY2U7Ci0gICAgaWZsaXB0by0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlCT0gc3VyZjsKLQotICAgIC8qIHRoZSBhc3NvY2lhdGVkIHhpbWFnZQotCi0gICAgICAgTk9URSA6IGZvciBYVmlkZW8sIHRoZSBwb2ludGVyIHRvIHRoZSBYdkltYWdlIGlzIGF0IHRoZSBzYW1lIHBvc2l0aW9uCi0gICAgICAgICAgICAgIGluIG1lbW9yeSB0aGFuIHRoZSBzdGFuZGFyZCBYSW1hZ2UuIFRoaXMgbWVhbnMgdGhhdCB0aGlzIGNvZGUKLQkgICAgICBzdGlsbCB3b3JrcyA6LSkKLSAgICAqLwotICAgIGltYWdlCQk9IGRzcHJpdi0+aW5mby5pbWFnZTsKLSAgICBkc3ByaXYtPmluZm8uaW1hZ2UJPSBmc3ByaXYtPmluZm8uaW1hZ2U7Ci0gICAgZnNwcml2LT5pbmZvLmltYWdlCT0gaW1hZ2U7Ci0KLSAgICBpZiAoZHNwcml2LT5vcGVuZ2xfZmxpcCkgewotI2lmZGVmIEhBVkVfT1BFTkdMCi0gICAgICBFTlRFUl9HTCgpOwotICAgICAgZ2xYU3dhcEJ1ZmZlcnMoZGlzcGxheSwgZGRwcml2LT5kcmF3YWJsZSk7Ci0gICAgICBMRUFWRV9HTCgpOwotI2VuZGlmCi0gICAgfSBlbHNlIGlmIChkc3ByaXYtPmlzX292ZXJsYXkpIHsKLSNpZmRlZiBIQVZFX1hWSURFTwotICAgICAgaWYgKGRzcHJpdi0+aW5mby5vdmVybGF5LnNob3duKQotCVhsaWJfY29weV9vdmVybGF5X29uX3NjcmVlbihUaGlzKTsKLSNlbHNlCi0gICAgICBFUlIoIldoeSB3YXMgdGhpcyBjb2RlIGFjdGl2YXRlZCBXSVRIT1VUIFhWaWRlbyBzdXBwb3J0ID9cbiIpOwotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSNpZmRlZiBIQVZFX0xJQlhYU0hNCi0gICAgICBpZiAoZGRwcml2LT54c2htX2FjdGl2ZSkgewotCS8qCi0JICAgaW50IGNvbXBsID0gSW50ZXJsb2NrZWRFeGNoYW5nZSggJihkZHByaXYtPnhzaG1fY29tcGwpLCAwICk7Ci0JICAgaWYgKGNvbXBsKSBYMTFEUlZfRVZFTlRfV2FpdFNobUNvbXBsZXRpb24oIGNvbXBsICk7Ci0JICAgKi8KLQlYMTFEUlZfRVZFTlRfV2FpdFNobUNvbXBsZXRpb25zKCBkZHByaXYtPmRyYXdhYmxlICk7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIFhsaWJfY29weV9zdXJmYWNlX29uX3NjcmVlbihUaGlzKTsKLSAgICAgIGlmIChpZmxpcHRvLT5zLnBhbGV0dGUpIHsKLSAgICAgICAgRFBQUklWQVRFKGlmbGlwdG8tPnMucGFsZXR0ZSk7Ci0JaWYgKGRwcHJpdi0+Y20pCi0JICBUU1hTZXRXaW5kb3dDb2xvcm1hcChkaXNwbGF5LGRkcHJpdi0+ZHJhd2FibGUsZHBwcml2LT5jbSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBERF9PSzsKLX0KLQotLyogVGhlIElEaXJlY3REcmF3U3VyZmFjZTQ6OlNldFBhbGV0dGUgbWV0aG9kIGF0dGFjaGVzIHRoZSBzcGVjaWZpZWQKLSAqIERpcmVjdERyYXdQYWxldHRlIG9iamVjdCB0byBhIHN1cmZhY2UuIFRoZSBzdXJmYWNlIHVzZXMgdGhpcyBwYWxldHRlIGZvciBhbGwKLSAqIHN1YnNlcXVlbnQgb3BlcmF0aW9ucy4gVGhlIHBhbGV0dGUgY2hhbmdlIHRha2VzIHBsYWNlIGltbWVkaWF0ZWx5LgotICovCi1IUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1NldFBhbGV0dGUoCi0gICAgTFBESVJFQ1REUkFXU1VSRkFDRTQgaWZhY2UsTFBESVJFQ1REUkFXUEFMRVRURSBwYWwKLSkgewotICAgIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxpZmFjZSk7Ci0gICAgRERQUklWQVRFKFRoaXMtPnMuZGRyYXcpOwotICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGwqIGlwYWw9KElEaXJlY3REcmF3UGFsZXR0ZUltcGwqKXBhbDsKLSAgICB4MTFfZHBfcHJpdmF0ZQkqZHBwcml2OwotICAgIGludCBpOwotCi0gICAgVFJBQ0UoIiglcCktPiglcClcbiIsVGhpcyxpcGFsKTsKLQotICAgIGlmIChpcGFsID09IE5VTEwpIHsKLQlpZiggVGhpcy0+cy5wYWxldHRlICE9IE5VTEwgKQotCSAgICBJRGlyZWN0RHJhd1BhbGV0dGVfUmVsZWFzZSgoSURpcmVjdERyYXdQYWxldHRlKilUaGlzLT5zLnBhbGV0dGUpOwotCVRoaXMtPnMucGFsZXR0ZSA9IGlwYWw7Ci0JcmV0dXJuIEREX09LOwotICAgIH0KLSAgICBkcHByaXYgPSAoeDExX2RwX3ByaXZhdGUqKWlwYWwtPnByaXZhdGU7Ci0KLSAgICBpZiAoIWRwcHJpdi0+Y20gJiYKLQkoVGhpcy0+cy5kZHJhdy0+ZC0+c2NyZWVuX3BpeGVsZm9ybWF0LnUuZHdSR0JCaXRDb3VudDw9OCkKLSAgICApIHsKLQlkcHByaXYtPmNtID0gVFNYQ3JlYXRlQ29sb3JtYXAoCi0JICAgIGRpc3BsYXksCi0JICAgIGRkcHJpdi0+ZHJhd2FibGUsCi0JICAgIERlZmF1bHRWaXN1YWxPZlNjcmVlbihYMTFEUlZfR2V0WFNjcmVlbigpKSwKLQkgICAgQWxsb2NBbGwKLQkpOwotCWlmICghT3B0aW9ucy5tYW5hZ2VkKQotCSAgICBUU1hJbnN0YWxsQ29sb3JtYXAoZGlzcGxheSxkcHByaXYtPmNtKTsKLQotCWZvciAoaT0wO2k8MjU2O2krKykgewotCSAgICBYQ29sb3IgeGM7Ci0KLQkgICAgeGMucmVkCQk9IGlwYWwtPnBhbGVudHNbaV0ucGVSZWQ8PDg7Ci0JICAgIHhjLmJsdWUJCT0gaXBhbC0+cGFsZW50c1tpXS5wZUJsdWU8PDg7Ci0JICAgIHhjLmdyZWVuCT0gaXBhbC0+cGFsZW50c1tpXS5wZUdyZWVuPDw4OwotCSAgICB4Yy5mbGFncwk9IERvUmVkfERvQmx1ZXxEb0dyZWVuOwotCSAgICB4Yy5waXhlbAk9IGk7Ci0JICAgIFRTWFN0b3JlQ29sb3IoZGlzcGxheSxkcHByaXYtPmNtLCZ4Yyk7Ci0JfQotCVRTWEluc3RhbGxDb2xvcm1hcChkaXNwbGF5LGRwcHJpdi0+Y20pOwotICAgIH0KLSAgICAvKiBBY2NvcmRpbmcgdG8gc3BlYywgd2UgYXJlIG9ubHkgc3VwcG9zZWQgdG8gCi0gICAgICogQWRkUmVmIGlmIHRoaXMgaXMgbm90IHRoZSBzYW1lIHBhbGV0dGUuCi0gICAgICovCi0gICAgaWYgKCBUaGlzLT5zLnBhbGV0dGUgIT0gaXBhbCApIHsKLQlpZiggaXBhbCAhPSBOVUxMICkKLQkgICAgSURpcmVjdERyYXdQYWxldHRlX0FkZFJlZiggKElEaXJlY3REcmF3UGFsZXR0ZSopaXBhbCApOwotCWlmKCBUaGlzLT5zLnBhbGV0dGUgIT0gTlVMTCApCi0JICAgIElEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKCAoSURpcmVjdERyYXdQYWxldHRlKilUaGlzLT5zLnBhbGV0dGUgKTsKLQlUaGlzLT5zLnBhbGV0dGUgPSBpcGFsOyAKLQkvKiBQZXJmb3JtIHRoZSByZWZyZXNoLCBvbmx5IGlmIGEgcGFsZXR0ZSB3YXMgY3JlYXRlZCAqLwotCWlmIChkcHByaXYtPmNtKQotCSAgVFNYU2V0V2luZG93Q29sb3JtYXAoZGlzcGxheSxkZHByaXYtPmRyYXdhYmxlLGRwcHJpdi0+Y20pOwotCi0JaWYgKFRoaXMtPnMuaGRjICE9IDApIHsKLQkgICAgLyogaGFjazogc2V0IHRoZSBESUJzZWN0aW9uIGNvbG9yIG1hcCAqLwotCSAgICBCSVRNQVBPQkogKmJtcCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0cihUaGlzLT5zLkRJQnNlY3Rpb24sIEJJVE1BUF9NQUdJQyk7Ci0JICAgIFgxMURSVl9ESUJTRUNUSU9OICpkaWIgPSAoWDExRFJWX0RJQlNFQ1RJT04gKilibXAtPmRpYjsKLQkgICAgZGliLT5jb2xvck1hcCA9IFRoaXMtPnMucGFsZXR0ZSA/IFRoaXMtPnMucGFsZXR0ZS0+c2NyZWVuX3BhbGVudHMgOiBOVUxMOwotCSAgICBHRElfUmVsZWFzZU9iaihUaGlzLT5zLkRJQnNlY3Rpb24pOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIEREX09LOwotfQotCi1VTE9ORyBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9SZWxlYXNlKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlKSB7Ci0gICAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSAgICBEU1BSSVZBVEUoVGhpcyk7Ci0gICAgRERQUklWQVRFKFRoaXMtPnMuZGRyYXcpOwotCi0gICAgVFJBQ0UoICIoJXApLT4oKSBkZWNyZW1lbnRpbmcgZnJvbSAlbHUuXG4iLCBUaGlzLCBUaGlzLT5yZWYgKTsKLSAgICBpZiAoLS0oVGhpcy0+cmVmKSkKLSAgICAJcmV0dXJuIFRoaXMtPnJlZjsKLQotICAgIElEaXJlY3REcmF3Ml9SZWxlYXNlKChJRGlyZWN0RHJhdzIqKVRoaXMtPnMuZGRyYXcpOwotCi0gICAgLyogVGhpcyBmcmVlcyB0aGUgcHJvZ3JhbS1zaWRlIHN1cmZhY2UuIEluIHNvbWUgY2FzZXMgaXQgaGFkIGJlZW4KLSAgICAgKiBhbGxvY2F0ZWQgd2l0aCBNRU1fU1lTVEVNLCBzbyBpdCBkb2VzIG5vdCBnZXQgJ3JlYWxseScgZnJlZWQKLSAgICAgKi8KLSAgICBWaXJ0dWFsRnJlZShUaGlzLT5zLnN1cmZhY2VfZGVzYy51MS5scFN1cmZhY2UsIDAsIE1FTV9SRUxFQVNFKTsKLQotICAgIC8qIE5vdyBmcmVlIHRoZSBYSW1hZ2VzIGFuZCB0aGUgcmVzcGVjdGl2ZSBzY3JlZW4tc2lkZSBzdXJmYWNlcyAqLwotICAgIGlmIChkc3ByaXYtPmluZm8uaW1hZ2UgIT0gTlVMTCkgewotCWlmIChkc3ByaXYtPmluZm8uaW1hZ2UtPmRhdGEgIT0gVGhpcy0+cy5zdXJmYWNlX2Rlc2MudTEubHBTdXJmYWNlKQotCSAgICBWaXJ0dWFsRnJlZShkc3ByaXYtPmluZm8uaW1hZ2UtPmRhdGEsIDAsIE1FTV9SRUxFQVNFKTsKLSNpZmRlZiBIQVZFX0xJQlhYU0hNCi0JaWYgKGRkcHJpdi0+eHNobV9hY3RpdmUpIHsKLQkgICAgVFNYU2htRGV0YWNoKGRpc3BsYXksICYoZHNwcml2LT5zaG1pbmZvKSk7Ci0JICAgIGlmIChUaGlzLT5zLnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfT1ZFUkxBWSkgewotCSAgICAgIFRTWEZyZWUoZHNwcml2LT5pbmZvLmltYWdlKTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICBUU1hEZXN0cm95SW1hZ2UoZHNwcml2LT5pbmZvLmltYWdlKTsKLQkgICAgfQotCSAgICBzaG1kdChkc3ByaXYtPnNobWluZm8uc2htYWRkcik7Ci0JfSBlbHNlIAotI2VuZGlmCi0JewotCSAgaWYgKFRoaXMtPnMuc3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19PVkVSTEFZKSB7Ci0JICAgIFRTWEZyZWUoZHNwcml2LT5pbmZvLmltYWdlKTsKLQkgIH0gZWxzZSB7Ci0JICAgIC8qIG5vcm1hbCBYIEltYWdlIG1lbW9yeSB3YXMgbmV2ZXIgYWxsb2NhdGVkIGJ5IFgsIGJ1dCBhbHdheXMgYnkgCi0JICAgICAqIG91cnNlbHZlcyAtPiBEb24ndCBsZXQgWCBmcmVlIG91ciBpbWFnZWRhdGEuCi0JICAgICAqLwotCSAgICBkc3ByaXYtPmluZm8uaW1hZ2UtPmRhdGEgPSBOVUxMOwotCSAgICBUU1hEZXN0cm95SW1hZ2UoZHNwcml2LT5pbmZvLmltYWdlKTsKLQkgIH0KLQl9Ci0JZHNwcml2LT5pbmZvLmltYWdlID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoVGhpcy0+cy5wYWxldHRlKQotCUlEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKChJRGlyZWN0RHJhd1BhbGV0dGUqKVRoaXMtPnMucGFsZXR0ZSk7Ci0KLSAgICAvKiBGcmVlIHRoZSBESUJTZWN0aW9uIChpZiBhbnkpICovCi0gICAgaWYgKFRoaXMtPnMuaGRjICE9IDApIHsKLQkvKiBoYWNrOiByZXN0b3JlIHRoZSBvcmlnaW5hbCBESUJzZWN0aW9uIGNvbG9yIG1hcCAqLwotCUJJVE1BUE9CSiAqYm1wID0gKEJJVE1BUE9CSiAqKSBHRElfR2V0T2JqUHRyKFRoaXMtPnMuRElCc2VjdGlvbiwgQklUTUFQX01BR0lDKTsKLQlYMTFEUlZfRElCU0VDVElPTiAqZGliID0gKFgxMURSVl9ESUJTRUNUSU9OICopYm1wLT5kaWI7Ci0JZGliLT5jb2xvck1hcCA9IGRzcHJpdi0+b2xkRElCbWFwOwotCUdESV9SZWxlYXNlT2JqKFRoaXMtPnMuRElCc2VjdGlvbik7Ci0KLQlTZWxlY3RPYmplY3QoVGhpcy0+cy5oZGMsIFRoaXMtPnMuaG9sZGJpdG1hcCk7Ci0JRGVsZXRlREMoVGhpcy0+cy5oZGMpOwotCURlbGV0ZU9iamVjdChUaGlzLT5zLkRJQnNlY3Rpb24pOwotICAgIH0KLQotICAgIC8qIEZyZWUgdGhlIGNsaXBwZXIgaWYgcHJlc2VudCAqLwotICAgIGlmKFRoaXMtPnMubHBDbGlwcGVyKQotCUlEaXJlY3REcmF3Q2xpcHBlcl9SZWxlYXNlKFRoaXMtPnMubHBDbGlwcGVyKTsKLSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcy0+cHJpdmF0ZSk7Ci0gICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLFRoaXMpOwotICAgIHJldHVybiBTX09LOwotfQotCi1IUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldERDKExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLEhEQyogbHBoZGMpIHsKLSAgICBJQ09NX1RISVMoSURpcmVjdERyYXdTdXJmYWNlNEltcGwsaWZhY2UpOwotICAgIERTUFJJVkFURShUaGlzKTsKLSAgICBpbnQgd2FzX29rID0gVGhpcy0+cy5oZGMgIT0gMDsKLSAgICBIUkVTVUxUIHJlc3VsdCA9IElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldERDKGlmYWNlLGxwaGRjKTsKLSAgICBpZiAoVGhpcy0+cy5oZGMgJiYgIXdhc19vaykgewotCS8qIGhhY2s6IHRha2Ugb3ZlciB0aGUgRElCc2VjdGlvbiBjb2xvciBtYXAgKi8KLQlCSVRNQVBPQkogKmJtcCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0cihUaGlzLT5zLkRJQnNlY3Rpb24sIEJJVE1BUF9NQUdJQyk7Ci0JWDExRFJWX0RJQlNFQ1RJT04gKmRpYiA9IChYMTFEUlZfRElCU0VDVElPTiAqKWJtcC0+ZGliOwotCWRzcHJpdi0+b2xkRElCbWFwID0gZGliLT5jb2xvck1hcDsKLQlkaWItPmNvbG9yTWFwID0gVGhpcy0+cy5wYWxldHRlID8gVGhpcy0+cy5wYWxldHRlLT5zY3JlZW5fcGFsZW50cyA6IE5VTEw7Ci0JR0RJX1JlbGVhc2VPYmooVGhpcy0+cy5ESUJzZWN0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotI2lmZGVmIEhBVkVfWFZJREVPCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEJPT0wgc2hvd247Ci0gIExQUkVDVCBzcmNfcmVjdDsKLSAgTFBSRUNUIGRzdF9yZWN0OwotICBMUERJUkVDVERSQVdTVVJGQUNFIGRlc3Rfc3VyZmFjZTsKLX0gVXBkYXRlT3ZlcmxheUVudW1lcmF0ZTsKLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIGVudW1fZnVuYyhMUERJUkVDVERSQVdTVVJGQUNFIGxwRERTdXJmYWNlLAotCQkJCUxQRERTVVJGQUNFREVTQyBscEREU3VyZmFjZURlc2MsICAKLQkJCQlMUFZPSUQgbHBDb250ZXh0KSB7Ci0gIElDT01fVEhJUyhJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCxscEREU3VyZmFjZSk7Ci0gIERTUFJJVkFURShUaGlzKTsKLSAgVXBkYXRlT3ZlcmxheUVudW1lcmF0ZSAqY3R4ID0gKFVwZGF0ZU92ZXJsYXlFbnVtZXJhdGUgKikgbHBDb250ZXh0OwotCi0gIGlmICgobHBERFN1cmZhY2VEZXNjLT5kZHNDYXBzLmR3Q2FwcykgJiBERFNDQVBTX0JBQ0tCVUZGRVIpIHsKLSAgICBUUkFDRSgiVXBncmFkaW5nIHN1cmZhY2UgJXBcbiIsIGxwRERTdXJmYWNlKTsKLQotICAgIGlmIChjdHgtPnNob3duKSB7Ci0gICAgICBkc3ByaXYtPmluZm8ub3ZlcmxheS5zaG93biA9IFRSVUU7Ci0gICAgICBkc3ByaXYtPmluZm8ub3ZlcmxheS5zcmNfcmVjdCA9ICooY3R4LT5zcmNfcmVjdCk7Ci0gICAgICBkc3ByaXYtPmluZm8ub3ZlcmxheS5kc3RfcmVjdCA9ICooY3R4LT5kc3RfcmVjdCk7Ci0gICAgICBkc3ByaXYtPmluZm8ub3ZlcmxheS5kZXN0X3N1cmZhY2UgPSBjdHgtPmRlc3Rfc3VyZmFjZTsKLSAgICB9IGVsc2UgewotICAgICAgZHNwcml2LT5pbmZvLm92ZXJsYXkuc2hvd24gPSBGQUxTRTsKLSAgICB9Ci0gIH0KLSAgCi0gIHJldHVybiBEREVOVU1SRVRfT0s7Ci19Ci0jZW5kaWYKLQotSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9VcGRhdGVPdmVybGF5KAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGlmYWNlLCBMUFJFQ1QgbHBTcmNSZWN0LAotICAgIExQRElSRUNURFJBV1NVUkZBQ0U0IGxwREREZXN0U3VyZmFjZSwgTFBSRUNUIGxwRGVzdFJlY3QsIERXT1JEIGR3RmxhZ3MsCi0gICAgTFBERE9WRVJMQVlGWCBscERET3ZlcmxheUZ4Ci0pIHsKLSAgSUNPTV9USElTKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsLGlmYWNlKTsKLSNpZmRlZiBIQVZFX1hWSURFTwotICBEU1BSSVZBVEUoVGhpcyk7Ci0gIEREUFJJVkFURShUaGlzLT5zLmRkcmF3KTsKLQotICBpZiAoZGRwcml2LT54dmlkZW9fYWN0aXZlKSB7Ci0gICAgVFJBQ0UoIiglcCktPiglcCwlcCwlcCwweCUwOGx4LCVwKVxuIiwgVGhpcywKLQkgIGxwU3JjUmVjdCwgbHBERERlc3RTdXJmYWNlLCBscERlc3RSZWN0LCBkd0ZsYWdzLCBscERET3ZlcmxheUZ4ICk7Ci0KLSAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKSB7Ci0gICAgICBEUFJJTlRGKCIgLSBkd0ZsYWdzIDogIik7Ci0gICAgICBfZHVtcF9ERE9WRVJMQVkoZHdGbGFncyk7Ci0gICAgICAKLSAgICAgIGlmIChscFNyY1JlY3QpICBEUFJJTlRGKCIgLSBzcmMgIHJlY3RhbmdsZSA6JWR4JWQtJWR4JWRcbiIsbHBTcmNSZWN0LT5sZWZ0LGxwU3JjUmVjdC0+dG9wLAotCQkJICAgICAgbHBTcmNSZWN0LT5yaWdodCxscFNyY1JlY3QtPmJvdHRvbSk7Ci0gICAgICBpZiAobHBEZXN0UmVjdCkgRFBSSU5URigiIC0gZGVzdCByZWN0YW5nbGUgOiVkeCVkLSVkeCVkXG4iLGxwRGVzdFJlY3QtPmxlZnQsbHBEZXN0UmVjdC0+dG9wLAotCQkJICAgICAgbHBEZXN0UmVjdC0+cmlnaHQsbHBEZXN0UmVjdC0+Ym90dG9tKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGR3RmxhZ3MgJiBERE9WRVJfU0hPVykgewotICAgICAgVXBkYXRlT3ZlcmxheUVudW1lcmF0ZSBjdHg7Ci0gICAgICAKLSAgICAgIGR3RmxhZ3MgJj0gfkRET1ZFUl9TSE9XOwotCi0gICAgICBpZiAoKGxwU3JjUmVjdCA9PSBOVUxMKSB8fCAobHBEZXN0UmVjdCA9PSBOVUxMKSkgewotCUZJWE1FKCJUaGlzIGlzIE5PVCBzdXBwb3J0ZWQgeWV0Li4uXG4iKTsKLQlyZXR1cm4gRERfT0s7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgc2hvd24gQk9PTCB0byBUUlVFIGFuZCB1cGRhdGUgdGhlIHJlY3RhbmdsZXMgKi8KLSAgICAgIGRzcHJpdi0+aW5mby5vdmVybGF5LnNob3duID0gVFJVRTsKLSAgICAgIGRzcHJpdi0+aW5mby5vdmVybGF5LnNyY19yZWN0ID0gKmxwU3JjUmVjdDsKLSAgICAgIGRzcHJpdi0+aW5mby5vdmVybGF5LmRzdF9yZWN0ID0gKmxwRGVzdFJlY3Q7Ci0gICAgICBkc3ByaXYtPmluZm8ub3ZlcmxheS5kZXN0X3N1cmZhY2UgPSAoTFBESVJFQ1REUkFXU1VSRkFDRSkgbHBERERlc3RTdXJmYWNlOwotCi0gICAgICAvKiBOb3cgdGhlIHNhbWUgZm9yIHRoZSBiYWNrYnVmZmVycywgZXhjZXB0IHRoYXQgdGhleSBhcmUgTk9UIHNob3duICovCi0gICAgICBjdHguc2hvd24gPSBGQUxTRTsKLSAgICAgIGN0eC5zcmNfcmVjdCA9IGxwU3JjUmVjdDsKLSAgICAgIGN0eC5kc3RfcmVjdCA9IGxwRGVzdFJlY3Q7Ci0gICAgICBjdHguZGVzdF9zdXJmYWNlID0gKExQRElSRUNURFJBV1NVUkZBQ0UpIGxwREREZXN0U3VyZmFjZTsKLQotICAgICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfRW51bUF0dGFjaGVkU3VyZmFjZXMoaWZhY2UsICZjdHgsIGVudW1fZnVuYyk7Ci0gICAgfSBlbHNlIGlmIChkd0ZsYWdzICYgRERPVkVSX0hJREUpIHsKLSAgICAgIFVwZGF0ZU92ZXJsYXlFbnVtZXJhdGUgY3R4OwotICAgICAgCi0gICAgICBkd0ZsYWdzICY9IH5ERE9WRVJfSElERTsKLQotICAgICAgLyogU2V0IHRoZSBzaG93biBCT09MIHRvIEZBTFNFIGZvciBhbGwgb3ZlcmxheXMgKi8KLSAgICAgIGRzcHJpdi0+aW5mby5vdmVybGF5LnNob3duID0gRkFMU0U7Ci0gICAgICBjdHguc2hvd24gPSBGQUxTRTsKLSAgICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0VudW1BdHRhY2hlZFN1cmZhY2VzKGlmYWNlLCAmY3R4LCBlbnVtX2Z1bmMpOwotICAgIH0KLQotICAgIGlmIChkd0ZsYWdzICYmIFRSQUNFX09OKGRkcmF3KSkgewotICAgICAgV0FSTigiVW5zdXBwb3J0ZWQgZmxhZ3MgOiAiKTsKLSAgICAgIF9kdW1wX0RET1ZFUkxBWShkd0ZsYWdzKTsgICAKLSAgICB9Ci0gIH0gZWxzZQotI2VuZGlmCi0gICAgRklYTUUoIiglcCktPiglcCwlcCwlcCwweCUwOGx4LCVwKSBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgWFZpZGVvICFcbiIsIFRoaXMsCi0JICBscFNyY1JlY3QsIGxwREREZXN0U3VyZmFjZSwgbHBEZXN0UmVjdCwgZHdGbGFncywgbHBERE92ZXJsYXlGeCApOyAgCi0KLSAgcmV0dXJuIEREX09LOwotfQotCi1JQ09NX1ZUQUJMRShJRGlyZWN0RHJhd1N1cmZhY2U0KSB4bGliX2RkczR2dCA9IAotewotICAgIElDT01fTVNWVEFCTEVfQ09NUEFUX0R1bW15UlRUSVZBTFVFCi0gICAgWGxpYl9JRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9RdWVyeUludGVyZmFjZSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9BZGRSZWYsCi0gICAgWGxpYl9JRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9SZWxlYXNlLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0FkZEF0dGFjaGVkU3VyZmFjZSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9BZGRPdmVybGF5RGlydHlSZWN0LAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0JsdCwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9CbHRCYXRjaCwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9CbHRGYXN0LAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0RlbGV0ZUF0dGFjaGVkU3VyZmFjZSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9FbnVtQXR0YWNoZWRTdXJmYWNlcywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9FbnVtT3ZlcmxheVpPcmRlcnMsCi0gICAgWGxpYl9JRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9GbGlwLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldEF0dGFjaGVkU3VyZmFjZSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRCbHRTdGF0dXMsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0Q2FwcywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRDbGlwcGVyLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldENvbG9yS2V5LAotICAgIFhsaWJfSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0REMsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0RmxpcFN0YXR1cywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRPdmVybGF5UG9zaXRpb24sCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0UGFsZXR0ZSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRQaXhlbEZvcm1hdCwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9HZXRTdXJmYWNlRGVzYywKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9Jbml0aWFsaXplLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0lzTG9zdCwKLSAgICBYbGliX0lEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0xvY2ssCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfUmVsZWFzZURDLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1Jlc3RvcmUsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfU2V0Q2xpcHBlciwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRDb2xvcktleSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRPdmVybGF5UG9zaXRpb24sCi0gICAgWGxpYl9JRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9TZXRQYWxldHRlLAotICAgIFhsaWJfSURpcmVjdERyYXdTdXJmYWNlNEltcGxfVW5sb2NrLAotICAgIFhsaWJfSURpcmVjdERyYXdTdXJmYWNlNEltcGxfVXBkYXRlT3ZlcmxheSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9VcGRhdGVPdmVybGF5RGlzcGxheSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9VcGRhdGVPdmVybGF5Wk9yZGVyLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldERESW50ZXJmYWNlLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1BhZ2VMb2NrLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX1BhZ2VVbmxvY2ssCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfU2V0U3VyZmFjZURlc2MsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfU2V0UHJpdmF0ZURhdGEsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfR2V0UHJpdmF0ZURhdGEsCi0gICAgSURpcmVjdERyYXdTdXJmYWNlNEltcGxfRnJlZVByaXZhdGVEYXRhLAotICAgIElEaXJlY3REcmF3U3VyZmFjZTRJbXBsX0dldFVuaXF1ZW5lc3NWYWx1ZSwKLSAgICBJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbF9DaGFuZ2VVbmlxdWVuZXNzVmFsdWUKLX07CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L2hlbHBlci5jIGIvZGxscy9kZHJhdy9oZWxwZXIuYwppbmRleCBiN2ZjODRlLi41MmY5ODRiIDEwMDY0NAotLS0gYS9kbGxzL2RkcmF3L2hlbHBlci5jCisrKyBiL2RsbHMvZGRyYXcvaGVscGVyLmMKQEAgLTMsMTYgKzMsMTIgQEAKICAqCiAgKiBDb3B5cmlnaHQgMTk5Ny0xOTk5IE1hcmN1cyBNZWlzc25lcgogICogQ29weXJpZ2h0IDE5OTggTGlvbmVsIFVsbWVyIChtb3N0IG9mIERpcmVjdDNEIHN0dWZmKQorICogQ29weXJpZ2h0IDIwMDAgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CiAKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgImhlYXAuaCIKQEAgLTI3LDIzMiArMjMsMjA1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJZGVidWcgb3V0cHV0IGZ1bmN0aW9ucwogICovCi12b2lkIF9kdW1wX0REQkxURlgoRFdPUkQgZmxhZ21hc2spIHsKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgRFdPUkQgdmFsOworICAgIGNvbnN0IGNoYXIqIG5hbWU7Cit9IGZsYWdfaW5mbzsKKworI2RlZmluZSBGRSh4KSB7IHgsICN4IH0KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBEV09SRCB2YWw7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICB2b2lkICgqZnVuYykoY29uc3Qgdm9pZCAqKTsKKyAgICBwdHJkaWZmX3Qgb2Zmc2V0OworfSBtZW1iZXJfaW5mbzsKKworI2RlZmluZSBNRSh4LGYsZSkgeyB4LCAjeCwgKHZvaWQgKCopKGNvbnN0IHZvaWQgKikpKGYpLCBvZmZzZXRvZihTVFJVQ1QsIGUpIH0KKworc3RhdGljIHZvaWQgRERSQVdfZHVtcF9mbGFncyhEV09SRCBmbGFncywgY29uc3QgZmxhZ19pbmZvKiBuYW1lcywKKwkJCSAgICAgc2l6ZV90IG51bV9uYW1lcykKK3sKICAgICBpbnQJaTsKLSAgICBjb25zdCBzdHJ1Y3QgewotCURXT1JECW1hc2s7Ci0JY2hhcgkqbmFtZTsKLSAgICB9IGZsYWdzW10gPSB7Ci0jZGVmaW5lIEZFKHgpIHsgeCwgI3h9LAotCUZFKEREQkxURlhfQVJJVEhTVFJFVENIWSkKLQlGRShEREJMVEZYX01JUlJPUkxFRlRSSUdIVCkKLQlGRShEREJMVEZYX01JUlJPUlVQRE9XTikKLQlGRShEREJMVEZYX05PVEVBUklORykKLQlGRShEREJMVEZYX1JPVEFURTE4MCkKLQlGRShEREJMVEZYX1JPVEFURTI3MCkKLQlGRShEREJMVEZYX1JPVEFURTkwKQotCUZFKEREQkxURlhfWkJVRkZFUlJBTkdFKQotCUZFKEREQkxURlhfWkJVRkZFUkJBU0VERVNUKQotI3VuZGVmIEZFCi0gICAgfTsKLSAgICBmb3IgKGk9MDtpPHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKTtpKyspCi0JaWYgKGZsYWdzW2ldLm1hc2sgJiBmbGFnbWFzaykKLQkgICAgRFBSSU5URigiJXMgIixmbGFnc1tpXS5uYW1lKTsKKworICAgIGZvciAoaT0wOyBpIDwgbnVtX25hbWVzOyBpKyspCisJaWYgKG5hbWVzW2ldLnZhbCAmIGZsYWdzKQorCSAgICBEUFJJTlRGKCIlcyAiLCBuYW1lc1tpXS5uYW1lKTsKKwogICAgIERQUklOVEYoIlxuIik7CiB9CiAKLXZvaWQgX2R1bXBfRERPVkVSTEFZKERXT1JEIGZsYWdtYXNrKSB7Ci0gICAgaW50CWk7Ci0gICAgY29uc3Qgc3RydWN0IHsKLQlEV09SRAltYXNrOwotCWNoYXIJKm5hbWU7Ci0gICAgfSBmbGFnc1tdID0gewotI2RlZmluZSBGRSh4KSB7IHgsICN4fSwKLQlGRShERE9WRVJfQUxQSEFERVNUKQotCUZFKERET1ZFUl9BTFBIQURFU1RDT05TVE9WRVJSSURFKQotCUZFKERET1ZFUl9BTFBIQURFU1RORUcpCi0JRkUoRERPVkVSX0FMUEhBREVTVFNVUkZBQ0VPVkVSUklERSkKLQlGRShERE9WRVJfQUxQSEFFREdFQkxFTkQpCi0JRkUoRERPVkVSX0FMUEhBU1JDKQotCUZFKERET1ZFUl9BTFBIQVNSQ0NPTlNUT1ZFUlJJREUpCi0JRkUoRERPVkVSX0FMUEhBU1JDTkVHKQotCUZFKERET1ZFUl9BTFBIQVNSQ1NVUkZBQ0VPVkVSUklERSkKLQlGRShERE9WRVJfSElERSkKLQlGRShERE9WRVJfS0VZREVTVCkKLQlGRShERE9WRVJfS0VZREVTVE9WRVJSSURFKQotCUZFKERET1ZFUl9LRVlTUkMpCi0JRkUoRERPVkVSX0tFWVNSQ09WRVJSSURFKQotCUZFKERET1ZFUl9TSE9XKQotCUZFKERET1ZFUl9BRERESVJUWVJFQ1QpCi0JRkUoRERPVkVSX1JFRlJFU0hESVJUWVJFQ1RTKQotCUZFKERET1ZFUl9SRUZSRVNIQUxMKQotCUZFKERET1ZFUl9EREZYKQotCUZFKERET1ZFUl9BVVRPRkxJUCkKLQlGRShERE9WRVJfQk9CKQotCUZFKERET1ZFUl9PVkVSUklERUJPQldFQVZFKQotCUZFKERET1ZFUl9JTlRFUkxFQVZFRCkKLSN1bmRlZiBGRQotICAgIH07Ci0gICAgZm9yIChpPTA7aTxzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSk7aSsrKQotCWlmIChmbGFnc1tpXS5tYXNrICYgZmxhZ21hc2spCi0JICAgIERQUklOVEYoIiVzICIsZmxhZ3NbaV0ubmFtZSk7Ci0gICAgRFBSSU5URigiXG4iKTsKK3N0YXRpYyB2b2lkIEREUkFXX2R1bXBfbWVtYmVycyhEV09SRCBmbGFncywgY29uc3Qgdm9pZCogZGF0YSwKKwkJCSAgICAgICBjb25zdCBtZW1iZXJfaW5mbyogbWVtcywgc2l6ZV90IG51bV9tZW1zKQoreworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGkgPCBzaXplb2YobWVtcykvc2l6ZW9mKG1lbXNbMF0pOyBpKyspCisgICAgeworCWlmIChtZW1zW2ldLnZhbCAmIGZsYWdzKQorCXsKKwkgICAgRFBSSU5URigiIC0gJXMgOiAiLCBtZW1zW2ldLm5hbWUpOworCSAgICBtZW1zW2ldLmZ1bmMoKGNvbnN0IGNoYXIgKilkYXRhICsgbWVtc1tpXS5vZmZzZXQpOworCSAgICBEUFJJTlRGKCJcbiIpOworCX0KKyAgICB9CiB9CiAKLXZvaWQgX2R1bXBfRERCTFRGQVNUKERXT1JEIGZsYWdtYXNrKSB7Ci0gICAgaW50CWk7Ci0gICAgY29uc3Qgc3RydWN0IHsKLQlEV09SRAltYXNrOwotCWNoYXIJKm5hbWU7Ci0gICAgfSBmbGFnc1tdID0gewotI2RlZmluZSBGRSh4KSB7IHgsICN4fSwKLQlGRShEREJMVEZBU1RfTk9DT0xPUktFWSkKLQlGRShEREJMVEZBU1RfU1JDQ09MT1JLRVkpCi0JRkUoRERCTFRGQVNUX0RFU1RDT0xPUktFWSkKLQlGRShEREJMVEZBU1RfV0FJVCkKLSN1bmRlZiBGRQotICAgIH07Ci0gICAgZm9yIChpPTA7aTxzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSk7aSsrKQotCWlmIChmbGFnc1tpXS5tYXNrICYgZmxhZ21hc2spCi0JICAgIERQUklOVEYoIiVzICIsZmxhZ3NbaV0ubmFtZSk7Ci0gICAgRFBSSU5URigiXG4iKTsKK3ZvaWQgRERSQVdfZHVtcF9EREJMVEZYKERXT1JEIGZsYWdtYXNrKQoreworICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3NbXSA9CisJeworCSAgICBGRShEREJMVEZYX0FSSVRIU1RSRVRDSFkpLAorCSAgICBGRShEREJMVEZYX01JUlJPUkxFRlRSSUdIVCksCisJICAgIEZFKEREQkxURlhfTUlSUk9SVVBET1dOKSwKKwkgICAgRkUoRERCTFRGWF9OT1RFQVJJTkcpLAorCSAgICBGRShEREJMVEZYX1JPVEFURTE4MCksCisJICAgIEZFKEREQkxURlhfUk9UQVRFMjcwKSwKKwkgICAgRkUoRERCTFRGWF9ST1RBVEU5MCksCisJICAgIEZFKEREQkxURlhfWkJVRkZFUlJBTkdFKSwKKwkgICAgRkUoRERCTFRGWF9aQlVGRkVSQkFTRURFU1QpCisJfTsKKworICAgIEREUkFXX2R1bXBfZmxhZ3MoZmxhZ21hc2ssIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSkpOwogfQogCi12b2lkIF9kdW1wX0REQkxUKERXT1JEIGZsYWdtYXNrKSB7Ci0gICAgaW50CWk7Ci0gICAgY29uc3Qgc3RydWN0IHsKLQlEV09SRAltYXNrOwotCWNoYXIJKm5hbWU7Ci0gICAgfSBmbGFnc1tdID0gewotI2RlZmluZSBGRSh4KSB7IHgsICN4fSwKLQlGRShEREJMVF9BTFBIQURFU1QpCi0JRkUoRERCTFRfQUxQSEFERVNUQ09OU1RPVkVSUklERSkKLQlGRShEREJMVF9BTFBIQURFU1RORUcpCi0JRkUoRERCTFRfQUxQSEFERVNUU1VSRkFDRU9WRVJSSURFKQotCUZFKEREQkxUX0FMUEhBRURHRUJMRU5EKQotCUZFKEREQkxUX0FMUEhBU1JDKQotCUZFKEREQkxUX0FMUEhBU1JDQ09OU1RPVkVSUklERSkKLQlGRShEREJMVF9BTFBIQVNSQ05FRykKLQlGRShEREJMVF9BTFBIQVNSQ1NVUkZBQ0VPVkVSUklERSkKLQlGRShEREJMVF9BU1lOQykKLQlGRShEREJMVF9DT0xPUkZJTEwpCi0JRkUoRERCTFRfRERGWCkKLQlGRShEREJMVF9ERFJPUFMpCi0JRkUoRERCTFRfS0VZREVTVCkKLQlGRShEREJMVF9LRVlERVNUT1ZFUlJJREUpCi0JRkUoRERCTFRfS0VZU1JDKQotCUZFKEREQkxUX0tFWVNSQ09WRVJSSURFKQotCUZFKEREQkxUX1JPUCkKLQlGRShEREJMVF9ST1RBVElPTkFOR0xFKQotCUZFKEREQkxUX1pCVUZGRVIpCi0JRkUoRERCTFRfWkJVRkZFUkRFU1RDT05TVE9WRVJSSURFKQotCUZFKEREQkxUX1pCVUZGRVJERVNUT1ZFUlJJREUpCi0JRkUoRERCTFRfWkJVRkZFUlNSQ0NPTlNUT1ZFUlJJREUpCi0JRkUoRERCTFRfWkJVRkZFUlNSQ09WRVJSSURFKQotCUZFKEREQkxUX1dBSVQpCi0JRkUoRERCTFRfREVQVEhGSUxMKQotI3VuZGVmIEZFCi0gICAgfTsKLSAgICBmb3IgKGk9MDtpPHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKTtpKyspCi0JaWYgKGZsYWdzW2ldLm1hc2sgJiBmbGFnbWFzaykKLQkgICAgRFBSSU5URigiJXMgIixmbGFnc1tpXS5uYW1lKTsKLSAgICBEUFJJTlRGKCJcbiIpOwordm9pZCBERFJBV19kdW1wX0REQkxURkFTVChEV09SRCBmbGFnbWFzaykKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPQorCXsKKwkgICAgRkUoRERCTFRGQVNUX05PQ09MT1JLRVkpLAorCSAgICBGRShEREJMVEZBU1RfU1JDQ09MT1JLRVkpLAorCSAgICBGRShEREJMVEZBU1RfREVTVENPTE9SS0VZKSwKKwkgICAgRkUoRERCTFRGQVNUX1dBSVQpCisJfTsKKworICAgIEREUkFXX2R1bXBfZmxhZ3MoZmxhZ21hc2ssIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSkpOwogfQogCi12b2lkIF9kdW1wX0REU0NBUFModm9pZCAqaW4pIHsKLSAgICBpbnQJaTsKLSAgICBjb25zdCBzdHJ1Y3QgewotCURXT1JECW1hc2s7Ci0JY2hhcgkqbmFtZTsKLSAgICB9IGZsYWdzW10gPSB7Ci0jZGVmaW5lIEZFKHgpIHsgeCwgI3h9LAotCUZFKEREU0NBUFNfUkVTRVJWRUQxKQotCUZFKEREU0NBUFNfQUxQSEEpCi0JRkUoRERTQ0FQU19CQUNLQlVGRkVSKQotCUZFKEREU0NBUFNfQ09NUExFWCkKLQlGRShERFNDQVBTX0ZMSVApCi0JRkUoRERTQ0FQU19GUk9OVEJVRkZFUikKLQlGRShERFNDQVBTX09GRlNDUkVFTlBMQUlOKQotCUZFKEREU0NBUFNfT1ZFUkxBWSkKLQlGRShERFNDQVBTX1BBTEVUVEUpCi0JRkUoRERTQ0FQU19QUklNQVJZU1VSRkFDRSkKLQlGRShERFNDQVBTX1BSSU1BUllTVVJGQUNFTEVGVCkKLQlGRShERFNDQVBTX1NZU1RFTU1FTU9SWSkKLQlGRShERFNDQVBTX1RFWFRVUkUpCi0JRkUoRERTQ0FQU18zRERFVklDRSkKLQlGRShERFNDQVBTX1ZJREVPTUVNT1JZKQotCUZFKEREU0NBUFNfVklTSUJMRSkKLQlGRShERFNDQVBTX1dSSVRFT05MWSkKLQlGRShERFNDQVBTX1pCVUZGRVIpCi0JRkUoRERTQ0FQU19PV05EQykKLQlGRShERFNDQVBTX0xJVkVWSURFTykKLQlGRShERFNDQVBTX0hXQ09ERUMpCi0JRkUoRERTQ0FQU19NT0RFWCkKLQlGRShERFNDQVBTX01JUE1BUCkKLQlGRShERFNDQVBTX1JFU0VSVkVEMikKLQlGRShERFNDQVBTX0FMTE9DT05MT0FEKQotCUZFKEREU0NBUFNfVklERU9QT1JUKQotCUZFKEREU0NBUFNfTE9DQUxWSURNRU0pCi0JRkUoRERTQ0FQU19OT05MT0NBTFZJRE1FTSkKLQlGRShERFNDQVBTX1NUQU5EQVJEVkdBTU9ERSkKLQlGRShERFNDQVBTX09QVElNSVpFRCkKLSN1bmRlZiBGRQordm9pZCBERFJBV19kdW1wX0REQkxUKERXT1JEIGZsYWdtYXNrKQoreworICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3NbXSA9CisJeworCSAgICBGRShEREJMVF9BTFBIQURFU1QpLAorCSAgICBGRShEREJMVF9BTFBIQURFU1RDT05TVE9WRVJSSURFKSwKKwkgICAgRkUoRERCTFRfQUxQSEFERVNUTkVHKSwKKwkgICAgRkUoRERCTFRfQUxQSEFERVNUU1VSRkFDRU9WRVJSSURFKSwKKwkgICAgRkUoRERCTFRfQUxQSEFFREdFQkxFTkQpLAorCSAgICBGRShEREJMVF9BTFBIQVNSQyksCisJICAgIEZFKEREQkxUX0FMUEhBU1JDQ09OU1RPVkVSUklERSksCisJICAgIEZFKEREQkxUX0FMUEhBU1JDTkVHKSwKKwkgICAgRkUoRERCTFRfQUxQSEFTUkNTVVJGQUNFT1ZFUlJJREUpLAorCSAgICBGRShEREJMVF9BU1lOQyksCisJICAgIEZFKEREQkxUX0NPTE9SRklMTCksCisJICAgIEZFKEREQkxUX0RERlgpLAorCSAgICBGRShEREJMVF9ERFJPUFMpLAorCSAgICBGRShEREJMVF9LRVlERVNUKSwKKwkgICAgRkUoRERCTFRfS0VZREVTVE9WRVJSSURFKSwKKwkgICAgRkUoRERCTFRfS0VZU1JDKSwKKwkgICAgRkUoRERCTFRfS0VZU1JDT1ZFUlJJREUpLAorCSAgICBGRShEREJMVF9ST1ApLAorCSAgICBGRShEREJMVF9ST1RBVElPTkFOR0xFKSwKKwkgICAgRkUoRERCTFRfWkJVRkZFUiksCisJICAgIEZFKEREQkxUX1pCVUZGRVJERVNUQ09OU1RPVkVSUklERSksCisJICAgIEZFKEREQkxUX1pCVUZGRVJERVNUT1ZFUlJJREUpLAorCSAgICBGRShEREJMVF9aQlVGRkVSU1JDQ09OU1RPVkVSUklERSksCisJICAgIEZFKEREQkxUX1pCVUZGRVJTUkNPVkVSUklERSksCisJICAgIEZFKEREQkxUX1dBSVQpLAorCSAgICBGRShEREJMVF9ERVBUSEZJTEwpCiAgICAgfTsKLSAgICBEV09SRCBmbGFnbWFzayA9ICooKERXT1JEICopIGluKTsKLSAgICBmb3IgKGk9MDtpPHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKTtpKyspCi0JaWYgKGZsYWdzW2ldLm1hc2sgJiBmbGFnbWFzaykKLQkgICAgRFBSSU5URigiJXMgIixmbGFnc1tpXS5uYW1lKTsKKworICAgIEREUkFXX2R1bXBfZmxhZ3MoZmxhZ21hc2ssIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSkpOwogfQogCi12b2lkIF9kdW1wX3BpeGVsZm9ybWF0X2ZsYWcoRFdPUkQgZmxhZ21hc2spIHsKLSAgICBpbnQJaTsKLSAgICBjb25zdCBzdHJ1Y3QgewotCURXT1JECW1hc2s7Ci0JY2hhcgkqbmFtZTsKLSAgICB9IGZsYWdzW10gPSB7Ci0jZGVmaW5lIEZFKHgpIHsgeCwgI3h9LAotCUZFKEREUEZfQUxQSEFQSVhFTFMpCi0JRkUoRERQRl9BTFBIQSkKLQlGRShERFBGX0ZPVVJDQykKLQlGRShERFBGX1BBTEVUVEVJTkRFWEVENCkKLQlGRShERFBGX1BBTEVUVEVJTkRFWEVEVE84KQotCUZFKEREUEZfUEFMRVRURUlOREVYRUQ4KQotCUZFKEREUEZfUkdCKQotCUZFKEREUEZfQ09NUFJFU1NFRCkKLQlGRShERFBGX1JHQlRPWVVWKQotCUZFKEREUEZfWVVWKQotCUZFKEREUEZfWkJVRkZFUikKLQlGRShERFBGX1BBTEVUVEVJTkRFWEVEMSkKLQlGRShERFBGX1BBTEVUVEVJTkRFWEVEMikKLQlGRShERFBGX1pQSVhFTFMpCi0jdW5kZWYgRkUKK3ZvaWQgRERSQVdfZHVtcF9ERFNDQVBTKGNvbnN0IEREU0NBUFMyICppbikKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPSAKKwl7CisJICAgIEZFKEREU0NBUFNfUkVTRVJWRUQxKSwKKwkgICAgRkUoRERTQ0FQU19BTFBIQSksCisJICAgIEZFKEREU0NBUFNfQkFDS0JVRkZFUiksCisJICAgIEZFKEREU0NBUFNfQ09NUExFWCksCisJICAgIEZFKEREU0NBUFNfRkxJUCksCisJICAgIEZFKEREU0NBUFNfRlJPTlRCVUZGRVIpLAorCSAgICBGRShERFNDQVBTX09GRlNDUkVFTlBMQUlOKSwKKwkgICAgRkUoRERTQ0FQU19PVkVSTEFZKSwKKwkgICAgRkUoRERTQ0FQU19QQUxFVFRFKSwKKwkgICAgRkUoRERTQ0FQU19QUklNQVJZU1VSRkFDRSksCisJICAgIEZFKEREU0NBUFNfUFJJTUFSWVNVUkZBQ0VMRUZUKSwKKwkgICAgRkUoRERTQ0FQU19TWVNURU1NRU1PUlkpLAorCSAgICBGRShERFNDQVBTX1RFWFRVUkUpLAorCSAgICBGRShERFNDQVBTXzNEREVWSUNFKSwKKwkgICAgRkUoRERTQ0FQU19WSURFT01FTU9SWSksCisJICAgIEZFKEREU0NBUFNfVklTSUJMRSksCisJICAgIEZFKEREU0NBUFNfV1JJVEVPTkxZKSwKKwkgICAgRkUoRERTQ0FQU19aQlVGRkVSKSwKKwkgICAgRkUoRERTQ0FQU19PV05EQyksCisJICAgIEZFKEREU0NBUFNfTElWRVZJREVPKSwKKwkgICAgRkUoRERTQ0FQU19IV0NPREVDKSwKKwkgICAgRkUoRERTQ0FQU19NT0RFWCksCisJICAgIEZFKEREU0NBUFNfTUlQTUFQKSwKKwkgICAgRkUoRERTQ0FQU19SRVNFUlZFRDIpLAorCSAgICBGRShERFNDQVBTX0FMTE9DT05MT0FEKSwKKwkgICAgRkUoRERTQ0FQU19WSURFT1BPUlQpLAorCSAgICBGRShERFNDQVBTX0xPQ0FMVklETUVNKSwKKwkgICAgRkUoRERTQ0FQU19OT05MT0NBTFZJRE1FTSksCisJICAgIEZFKEREU0NBUFNfU1RBTkRBUkRWR0FNT0RFKSwKKwkgICAgRkUoRERTQ0FQU19PUFRJTUlaRUQpCiAgICAgfTsKLSAgICBmb3IgKGk9MDtpPHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKTtpKyspCi0JaWYgKGZsYWdzW2ldLm1hc2sgJiBmbGFnbWFzaykKLQkgICAgRFBSSU5URigiJXMgIixmbGFnc1tpXS5uYW1lKTsKKworICAgIEREUkFXX2R1bXBfZmxhZ3MoaW4tPmR3Q2FwcywgZmxhZ3MsIHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKSk7CiB9CiAKLXZvaWQgX2R1bXBfcGFsZXR0ZWZvcm1hdChEV09SRCBkd0ZsYWdzKSB7Ci0gICAgaW50CWk7Ci0gICAgY29uc3Qgc3RydWN0IHsKLQlEV09SRAltYXNrOwotCWNoYXIJKm5hbWU7Ci0gICAgfSBmbGFnc1tdID0gewotI2RlZmluZSBGRSh4KSB7IHgsICN4fSwKLQlGRShERFBDQVBTXzRCSVQpCi0JRkUoRERQQ0FQU184QklURU5UUklFUykKLQlGRShERFBDQVBTXzhCSVQpCi0JRkUoRERQQ0FQU19JTklUSUFMSVpFKQotCUZFKEREUENBUFNfUFJJTUFSWVNVUkZBQ0UpCi0JRkUoRERQQ0FQU19QUklNQVJZU1VSRkFDRUxFRlQpCi0JRkUoRERQQ0FQU19BTExPVzI1NikKLQlGRShERFBDQVBTX1ZTWU5DKQotCUZFKEREUENBUFNfMUJJVCkKLQlGRShERFBDQVBTXzJCSVQpCi0JRkUoRERQQ0FQU19BTFBIQSkKLSN1bmRlZiBGRQordm9pZCBERFJBV19kdW1wX3BpeGVsZm9ybWF0X2ZsYWcoRFdPUkQgZmxhZ21hc2spCit7CisgICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0KKwl7CisJICAgIEZFKEREUEZfQUxQSEFQSVhFTFMpLAorCSAgICBGRShERFBGX0FMUEhBKSwKKwkgICAgRkUoRERQRl9GT1VSQ0MpLAorCSAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVENCksCisJICAgIEZFKEREUEZfUEFMRVRURUlOREVYRURUTzgpLAorCSAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVEOCksCisJICAgIEZFKEREUEZfUkdCKSwKKwkgICAgRkUoRERQRl9DT01QUkVTU0VEKSwKKwkgICAgRkUoRERQRl9SR0JUT1lVViksCisJICAgIEZFKEREUEZfWVVWKSwKKwkgICAgRkUoRERQRl9aQlVGRkVSKSwKKwkgICAgRkUoRERQRl9QQUxFVFRFSU5ERVhFRDEpLAorCSAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVEMiksCisJICAgIEZFKEREUEZfWlBJWEVMUykKICAgICB9OwotICAgIGZvciAoaT0wO2k8c2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pO2krKykKLQlpZiAoZmxhZ3NbaV0ubWFzayAmIGR3RmxhZ3MpCi0JICAgIERQUklOVEYoIiVzICIsZmxhZ3NbaV0ubmFtZSk7Ci0gICAgRFBSSU5URigiXG4iKTsKKworICAgIEREUkFXX2R1bXBfZmxhZ3MoZmxhZ21hc2ssIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSkpOwogfQogCi12b2lkIF9kdW1wX3BpeGVsZm9ybWF0KHZvaWQgKmluKSB7Cit2b2lkIEREUkFXX2R1bXBfcGFsZXR0ZWZvcm1hdChEV09SRCBkd0ZsYWdzKQoreworICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3NbXSA9CisJeworCSAgICBGRShERFBDQVBTXzRCSVQpLAorCSAgICBGRShERFBDQVBTXzhCSVRFTlRSSUVTKSwKKwkgICAgRkUoRERQQ0FQU184QklUKSwKKwkgICAgRkUoRERQQ0FQU19JTklUSUFMSVpFKSwKKwkgICAgRkUoRERQQ0FQU19QUklNQVJZU1VSRkFDRSksCisJICAgIEZFKEREUENBUFNfUFJJTUFSWVNVUkZBQ0VMRUZUKSwKKwkgICAgRkUoRERQQ0FQU19BTExPVzI1NiksCisJICAgIEZFKEREUENBUFNfVlNZTkMpLAorCSAgICBGRShERFBDQVBTXzFCSVQpLAorCSAgICBGRShERFBDQVBTXzJCSVQpLAorCSAgICBGRShERFBDQVBTX0FMUEhBKQorICAgIH07CisKKyAgICBERFJBV19kdW1wX2ZsYWdzKGR3RmxhZ3MsIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSkpOworfQorCit2b2lkIEREUkFXX2R1bXBfcGl4ZWxmb3JtYXQodm9pZCAqaW4pIHsKICAgICBMUEREUElYRUxGT1JNQVQgcGYgPSAoTFBERFBJWEVMRk9STUFUKSBpbjsKIAogICAgIERQUklOVEYoIiggIik7Ci0gICAgX2R1bXBfcGl4ZWxmb3JtYXRfZmxhZyhwZi0+ZHdGbGFncyk7CisgICAgRERSQVdfZHVtcF9waXhlbGZvcm1hdF9mbGFnKHBmLT5kd0ZsYWdzKTsKICAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykgewogCURQUklOVEYoIiwgZHdGb3VyQ0MgY29kZSAnJWMlYyVjJWMnICgweCUwOGx4KSAtICVsZCBiaXRzIHBlciBwaXhlbCIsCiAJCSh1bnNpZ25lZCBjaGFyKSggcGYtPmR3Rm91ckNDICAgICAmMHhmZiksCkBAIC0yNjAsMTMgKzIyOSwxMyBAQAogCQkodW5zaWduZWQgY2hhcikoKHBmLT5kd0ZvdXJDQz4+MTYpJjB4ZmYpLAogCQkodW5zaWduZWQgY2hhcikoKHBmLT5kd0ZvdXJDQz4+MjQpJjB4ZmYpLAogCQlwZi0+ZHdGb3VyQ0MsCi0JCXBmLT51LmR3WVVWQml0Q291bnQKKwkJcGYtPnUxLmR3WVVWQml0Q291bnQKIAkpOwogICAgIH0KICAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX1JHQikgewogCWNoYXIgKmNtZDsKLQlEUFJJTlRGKCIsIFJHQiBiaXRzOiAlbGQsICIsIHBmLT51LmR3UkdCQml0Q291bnQpOwotCXN3aXRjaCAocGYtPnUuZHdSR0JCaXRDb3VudCkgeworCURQUklOVEYoIiwgUkdCIGJpdHM6ICVsZCwgIiwgcGYtPnUxLmR3UkdCQml0Q291bnQpOworCXN3aXRjaCAocGYtPnUxLmR3UkdCQml0Q291bnQpIHsKIAljYXNlIDQ6IGNtZCA9ICIlMWx4IjsgYnJlYWs7CiAJY2FzZSA4OiBjbWQgPSAiJTAybHgiOyBicmVhazsKIAljYXNlIDE2OiBjbWQgPSAiJTA0bHgiOyBicmVhazsKQEAgLTI3NCwxMTQgKzI0Myw5NSBAQAogCWNhc2UgMzI6IGNtZCA9ICIlMDhseCI7IGJyZWFrOwogCWRlZmF1bHQ6IEVSUigiVW5leHBlY3RlZCBiaXQgZGVwdGggIVxuIik7IGNtZCA9ICIlZCI7IGJyZWFrOwogCX0KLQlEUFJJTlRGKCIgUiAiKTsgRFBSSU5URihjbWQsIHBmLT51MS5kd1JCaXRNYXNrKTsKLQlEUFJJTlRGKCIgRyAiKTsgRFBSSU5URihjbWQsIHBmLT51Mi5kd0dCaXRNYXNrKTsKLQlEUFJJTlRGKCIgQiAiKTsgRFBSSU5URihjbWQsIHBmLT51My5kd0JCaXRNYXNrKTsKKwlEUFJJTlRGKCIgUiAiKTsgRFBSSU5URihjbWQsIHBmLT51Mi5kd1JCaXRNYXNrKTsKKwlEUFJJTlRGKCIgRyAiKTsgRFBSSU5URihjbWQsIHBmLT51My5kd0dCaXRNYXNrKTsKKwlEUFJJTlRGKCIgQiAiKTsgRFBSSU5URihjbWQsIHBmLT51NC5kd0JCaXRNYXNrKTsKIAlpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKSB7Ci0JICAgIERQUklOVEYoIiBBICIpOyBEUFJJTlRGKGNtZCwgcGYtPnU0LmR3UkdCQWxwaGFCaXRNYXNrKTsKKwkgICAgRFBSSU5URigiIEEgIik7IERQUklOVEYoY21kLCBwZi0+dTUuZHdSR0JBbHBoYUJpdE1hc2spOwogCX0KIAlpZiAocGYtPmR3RmxhZ3MgJiBERFBGX1pQSVhFTFMpIHsKLQkgICAgRFBSSU5URigiIFogIik7IERQUklOVEYoY21kLCBwZi0+dTQuZHdSR0JaQml0TWFzayk7CisJICAgIERQUklOVEYoIiBaICIpOyBEUFJJTlRGKGNtZCwgcGYtPnU1LmR3UkdCWkJpdE1hc2spOwogCX0KICAgICB9CiAgICAgaWYgKHBmLT5kd0ZsYWdzICYgRERQRl9aQlVGRkVSKSB7Ci0JRFBSSU5URigiLCBaIGJpdHMgOiAlbGQiLCBwZi0+dS5kd1pCdWZmZXJCaXREZXB0aCk7CisJRFBSSU5URigiLCBaIGJpdHMgOiAlbGQiLCBwZi0+dTEuZHdaQnVmZmVyQml0RGVwdGgpOwogICAgIH0KICAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0FMUEhBKSB7Ci0JRFBSSU5URigiLCBBbHBoYSBiaXRzIDogJWxkIiwgcGYtPnUuZHdBbHBoYUJpdERlcHRoKTsKKwlEUFJJTlRGKCIsIEFscGhhIGJpdHMgOiAlbGQiLCBwZi0+dTEuZHdBbHBoYUJpdERlcHRoKTsKICAgICB9CiAgICAgRFBSSU5URigiKSIpOwogfQogCi12b2lkIF9kdW1wX2NvbG9ya2V5ZmxhZyhEV09SRCBjaykgewotICAgIGludAlpOwotICAgIGNvbnN0IHN0cnVjdCB7Ci0JRFdPUkQJbWFzazsKLQljaGFyCSpuYW1lOwotICAgIH0gZmxhZ3NbXSA9IHsKLSNkZWZpbmUgRkUoeCkgeyB4LCAjeH0sCi0JRkUoRERDS0VZX0NPTE9SU1BBQ0UpCi0JRkUoRERDS0VZX0RFU1RCTFQpCi0JRkUoRERDS0VZX0RFU1RPVkVSTEFZKQotCUZFKEREQ0tFWV9TUkNCTFQpCi0JRkUoRERDS0VZX1NSQ09WRVJMQVkpCi0jdW5kZWYgRkUKK3ZvaWQgRERSQVdfZHVtcF9jb2xvcmtleWZsYWcoRFdPUkQgY2spCit7CisgICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0KKwl7CisJICAgIEZFKEREQ0tFWV9DT0xPUlNQQUNFKSwKKwkgICAgRkUoRERDS0VZX0RFU1RCTFQpLAorCSAgICBGRShERENLRVlfREVTVE9WRVJMQVkpLAorCSAgICBGRShERENLRVlfU1JDQkxUKSwKKwkgICAgRkUoRERDS0VZX1NSQ09WRVJMQVkpCiAgICAgfTsKLSAgICBmb3IgKGk9MDtpPHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKTtpKyspCi0JaWYgKGZsYWdzW2ldLm1hc2sgJiBjaykKLQkgICAgRFBSSU5URigiJXMgIixmbGFnc1tpXS5uYW1lKTsKKworICAgIEREUkFXX2R1bXBfZmxhZ3MoY2ssIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSkpOwogfQogCi1zdGF0aWMgdm9pZCBfZHVtcF9EV09SRCh2b2lkICppbikgewotICAgIERQUklOVEYoIiVsZCIsICooKERXT1JEICopIGluKSk7CitzdGF0aWMgdm9pZCBERFJBV19kdW1wX0RXT1JEKGNvbnN0IHZvaWQgKmluKSB7CisgICAgRFBSSU5URigiJWxkIiwgKigoY29uc3QgRFdPUkQgKikgaW4pKTsKIH0KLXN0YXRpYyB2b2lkIF9kdW1wX1BUUih2b2lkICppbikgewotICAgIERQUklOVEYoIiVwIiwgKigodm9pZCAqKikgaW4pKTsKK3N0YXRpYyB2b2lkIEREUkFXX2R1bXBfUFRSKGNvbnN0IHZvaWQgKmluKSB7CisgICAgRFBSSU5URigiJXAiLCAqKChjb25zdCB2b2lkICoqKSBpbikpOwogfQotdm9pZCBfZHVtcF9ERENPTE9SS0VZKHZvaWQgKmluKSB7Ci0gICAgRERDT0xPUktFWSAqZGRjayA9IChERENPTE9SS0VZICopIGluOwordm9pZCBERFJBV19kdW1wX0REQ09MT1JLRVkoY29uc3Qgdm9pZCAqaW4pIHsKKyAgICBjb25zdCBERENPTE9SS0VZICpkZGNrID0gKGNvbnN0IEREQ09MT1JLRVkgKikgaW47CiAKICAgICBEUFJJTlRGKCIgTG93IDogJWxkICAtIEhpZ2ggOiAlbGQiLCBkZGNrLT5kd0NvbG9yU3BhY2VMb3dWYWx1ZSwgZGRjay0+ZHdDb2xvclNwYWNlSGlnaFZhbHVlKTsKIH0KIAotdm9pZCBfZHVtcF9zdXJmYWNlX2Rlc2MoRERTVVJGQUNFREVTQyAqbHBkZHNkKSB7Ci0gICAgaW50CWk7Ci0gICAgc3RydWN0IHsKLQlEV09SRAltYXNrOwotCWNoYXIJKm5hbWU7Ci0Jdm9pZCAoKmZ1bmMpKHZvaWQgKik7Ci0Jdm9pZAkqZWx0OwotICAgIH0gZmxhZ3NbMTZdLCAqZmUgPSBmbGFnczsKLSNkZWZpbmUgRkUoeCxmLGUpIGRvIHsgZmUtPm1hc2sgPSB4OyAgZmUtPm5hbWUgPSAjeDsgZmUtPmZ1bmMgPSBmOyBmZS0+ZWx0ID0gKHZvaWQgKikgJihscGRkc2QtPmUpOyBmZSsrOyB9IHdoaWxlKDApCi0JRkUoRERTRF9DQVBTLCBfZHVtcF9ERFNDQVBTLCBkZHNDYXBzKTsKLQlGRShERFNEX0hFSUdIVCwgX2R1bXBfRFdPUkQsIGR3SGVpZ2h0KTsKLQlGRShERFNEX1dJRFRILCBfZHVtcF9EV09SRCwgZHdXaWR0aCk7Ci0JRkUoRERTRF9QSVRDSCwgX2R1bXBfRFdPUkQsIGxQaXRjaCk7Ci0JRkUoRERTRF9CQUNLQlVGRkVSQ09VTlQsIF9kdW1wX0RXT1JELCBkd0JhY2tCdWZmZXJDb3VudCk7Ci0JRkUoRERTRF9aQlVGRkVSQklUREVQVEgsIF9kdW1wX0RXT1JELCB1LmR3WkJ1ZmZlckJpdERlcHRoKTsKLQlGRShERFNEX0FMUEhBQklUREVQVEgsIF9kdW1wX0RXT1JELCBkd0FscGhhQml0RGVwdGgpOwotCUZFKEREU0RfUElYRUxGT1JNQVQsIF9kdW1wX3BpeGVsZm9ybWF0LCBkZHBmUGl4ZWxGb3JtYXQpOwotCUZFKEREU0RfQ0tERVNUT1ZFUkxBWSwgX2R1bXBfRERDT0xPUktFWSwgZGRja0NLRGVzdE92ZXJsYXkpOwotCUZFKEREU0RfQ0tERVNUQkxULCBfZHVtcF9ERENPTE9SS0VZLCBkZGNrQ0tEZXN0Qmx0KTsKLQlGRShERFNEX0NLU1JDT1ZFUkxBWSwgX2R1bXBfRERDT0xPUktFWSwgZGRja0NLU3JjT3ZlcmxheSk7Ci0JRkUoRERTRF9DS1NSQ0JMVCwgX2R1bXBfRERDT0xPUktFWSwgZGRja0NLU3JjQmx0KTsKLQlGRShERFNEX01JUE1BUENPVU5ULCBfZHVtcF9EV09SRCwgdS5kd01pcE1hcENvdW50KTsKLQlGRShERFNEX1JFRlJFU0hSQVRFLCBfZHVtcF9EV09SRCwgdS5kd1JlZnJlc2hSYXRlKTsKLQlGRShERFNEX0xJTkVBUlNJWkUsIF9kdW1wX0RXT1JELCB1MS5kd0xpbmVhclNpemUpOwotCUZFKEREU0RfTFBTVVJGQUNFLCBfZHVtcF9QVFIsIHUxLmxwU3VyZmFjZSk7Ci0jdW5kZWYgRkUKK3ZvaWQgRERSQVdfZHVtcF9zdXJmYWNlX2Rlc2MoY29uc3QgRERTVVJGQUNFREVTQzIgKmxwZGRzZCkKK3sKKyNkZWZpbmUgU1RSVUNUIEREU1VSRkFDRURFU0MyCisgICAgc3RhdGljIGNvbnN0IG1lbWJlcl9pbmZvIG1lbWJlcnNbXSA9CisJeworCSAgICBNRShERFNEX0NBUFMsIEREUkFXX2R1bXBfRERTQ0FQUywgZGRzQ2FwcyksCisJICAgIE1FKEREU0RfSEVJR0hULCBERFJBV19kdW1wX0RXT1JELCBkd0hlaWdodCksCisJICAgIE1FKEREU0RfV0lEVEgsIEREUkFXX2R1bXBfRFdPUkQsIGR3V2lkdGgpLAorCSAgICBNRShERFNEX1BJVENILCBERFJBV19kdW1wX0RXT1JELCB1MS5sUGl0Y2gpLAorCSAgICBNRShERFNEX0xJTkVBUlNJWkUsIEREUkFXX2R1bXBfRFdPUkQsIHUxLmR3TGluZWFyU2l6ZSksCisJICAgIE1FKEREU0RfQkFDS0JVRkZFUkNPVU5ULCBERFJBV19kdW1wX0RXT1JELCBkd0JhY2tCdWZmZXJDb3VudCksCisJICAgIE1FKEREU0RfTUlQTUFQQ09VTlQsIEREUkFXX2R1bXBfRFdPUkQsIHUyLmR3TWlwTWFwQ291bnQpLAorCSAgICBNRShERFNEX1JFRlJFU0hSQVRFLCBERFJBV19kdW1wX0RXT1JELCB1Mi5kd1JlZnJlc2hSYXRlKSwKKwkgICAgTUUoRERTRF9BTFBIQUJJVERFUFRILCBERFJBV19kdW1wX0RXT1JELCBkd0FscGhhQml0RGVwdGgpLAorCSAgICBNRShERFNEX0xQU1VSRkFDRSwgRERSQVdfZHVtcF9QVFIsIGxwU3VyZmFjZSksCisJICAgIE1FKEREU0RfQ0tERVNUT1ZFUkxBWSwgRERSQVdfZHVtcF9ERENPTE9SS0VZLCB1My5kZGNrQ0tEZXN0T3ZlcmxheSksCisJICAgIE1FKEREU0RfQ0tERVNUQkxULCBERFJBV19kdW1wX0REQ09MT1JLRVksIGRkY2tDS0Rlc3RCbHQpLAorCSAgICBNRShERFNEX0NLU1JDT1ZFUkxBWSwgRERSQVdfZHVtcF9ERENPTE9SS0VZLCBkZGNrQ0tTcmNPdmVybGF5KSwKKwkgICAgTUUoRERTRF9DS1NSQ0JMVCwgRERSQVdfZHVtcF9ERENPTE9SS0VZLCBkZGNrQ0tTcmNCbHQpLAorCSAgICBNRShERFNEX1BJWEVMRk9STUFULCBERFJBV19kdW1wX3BpeGVsZm9ybWF0LCB1NC5kZHBmUGl4ZWxGb3JtYXQpCisJfTsKIAotICAgIGZvciAoaT0wO2k8c2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pO2krKykKLQlpZiAoZmxhZ3NbaV0ubWFzayAmIGxwZGRzZC0+ZHdGbGFncykgewotCSAgICBEUFJJTlRGKCIgLSAlcyA6ICIsZmxhZ3NbaV0ubmFtZSk7Ci0JICAgIGZsYWdzW2ldLmZ1bmMoZmxhZ3NbaV0uZWx0KTsKLQkgICAgRFBSSU5URigiXG4iKTsgIAotCX0KKyAgICBERFJBV19kdW1wX21lbWJlcnMobHBkZHNkLT5kd0ZsYWdzLCBscGRkc2QsIG1lbWJlcnMsCisJCSAgICAgICBzaXplb2YobWVtYmVycykvc2l6ZW9mKG1lbWJlcnNbMF0pKTsKIH0KLXZvaWQgX2R1bXBfY29vcGVyYXRpdmVsZXZlbChEV09SRCBjb29wbGV2ZWwpIHsKLSAgICBpbnQgaTsKLSAgICBjb25zdCBzdHJ1Y3QgewotCWludAltYXNrOwotCWNoYXIJKm5hbWU7Ci0gICAgfSBmbGFnc1tdID0gewotI2RlZmluZSBGRSh4KSB7IHgsICN4fSwKLQkgICAgRkUoRERTQ0xfRlVMTFNDUkVFTikKLQkgICAgRkUoRERTQ0xfQUxMT1dSRUJPT1QpCi0JICAgIEZFKEREU0NMX05PV0lORE9XQ0hBTkdFUykKLQkgICAgRkUoRERTQ0xfTk9STUFMKQotCSAgICBGRShERFNDTF9BTExPV01PREVYKQotCSAgICBGRShERFNDTF9FWENMVVNJVkUpCi0JICAgIEZFKEREU0NMX1NFVEZPQ1VTV0lORE9XKQotCSAgICBGRShERFNDTF9TRVRERVZJQ0VXSU5ET1cpCisKK3ZvaWQgRERSQVdfZHVtcF9jb29wZXJhdGl2ZWxldmVsKERXT1JEIGNvb3BsZXZlbCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPQorCXsKKwkgICAgRkUoRERTQ0xfRlVMTFNDUkVFTiksCisJICAgIEZFKEREU0NMX0FMTE9XUkVCT09UKSwKKwkgICAgRkUoRERTQ0xfTk9XSU5ET1dDSEFOR0VTKSwKKwkgICAgRkUoRERTQ0xfTk9STUFMKSwKKwkgICAgRkUoRERTQ0xfQUxMT1dNT0RFWCksCisJICAgIEZFKEREU0NMX0VYQ0xVU0lWRSksCisJICAgIEZFKEREU0NMX1NFVEZPQ1VTV0lORE9XKSwKKwkgICAgRkUoRERTQ0xfU0VUREVWSUNFV0lORE9XKSwKIAkgICAgRkUoRERTQ0xfQ1JFQVRFREVWSUNFV0lORE9XKQotI3VuZGVmIEZFCiAgICAgfTsKIAotICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKKyAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKQorICAgIHsKIAlEUFJJTlRGKCIgLSAiKTsKLQlmb3IgKGk9MDtpPHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKTtpKyspCi0JICAgIGlmIChmbGFnc1tpXS5tYXNrICYgY29vcGxldmVsKQotCQlEUFJJTlRGKCIlcyAiLGZsYWdzW2ldLm5hbWUpOwotCURQUklOVEYoIlxuIik7CisJRERSQVdfZHVtcF9mbGFncyhjb29wbGV2ZWwsIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcvbWFpbi5jIGIvZGxscy9kZHJhdy9tYWluLmMKaW5kZXggMzA3MjJlNS4uM2M0YWNmNiAxMDA2NDQKLS0tIGEvZGxscy9kZHJhdy9tYWluLmMKKysrIGIvZGxscy9kZHJhdy9tYWluLmMKQEAgLTIsNDEgKzIsMzYgQEAKICAqCiAgKiBDb3B5cmlnaHQgMTk5Ny0xOTk5IE1hcmN1cyBNZWlzc25lcgogICogQ29weXJpZ2h0IDE5OTggTGlvbmVsIFVsbWVyIChtb3N0IG9mIERpcmVjdDNEIHN0dWZmKQorICogQ29weXJpZ2h0IDIwMDAgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIChpbnRlcm5hbCkgZHJpdmVyIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMsCisgKiBkcml2ZXIgZW51bWVyYXRpb24gQVBJcyBhbmQgRGlyZWN0RHJhdyBjcmVhdGlvbiBmdW5jdGlvbnMuCiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgogCi0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKICNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorCisjaW5jbHVkZSAiaW5pdGd1aWQuaCIKKyNpbmNsdWRlICJkZHJhdy5oIgorI2luY2x1ZGUgImQzZC5oIgogCiAvKiBUaGlzIGZvciBhbGwgdGhlIGVudW1lcmF0aW9uIGFuZCBjcmVhdGlvbiBvZiBEM0QtcmVsYXRlZCBvYmplY3RzICovCiAjaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgogCi0jZGVmaW5lIE1BWF9ERFJBV19EUklWRVJTCTMKLXN0YXRpYyBkZHJhd19kcml2ZXIgKiBkZHJhd19kcml2ZXJzW01BWF9ERFJBV19EUklWRVJTXTsKLXN0YXRpYyBpbnQgbnJvZl9kZHJhd19kcml2ZXJzCQkJPSAwOworI2RlZmluZSBNQVhfRERSQVdfRFJJVkVSUyAzCitzdGF0aWMgY29uc3QgZGRyYXdfZHJpdmVyKiBERFJBV19kcml2ZXJzW01BWF9ERFJBV19EUklWRVJTXTsKK3N0YXRpYyBpbnQgRERSQVdfbnVtX2RyaXZlcnM7IC8qID0gMCAqLworc3RhdGljIGludCBERFJBV19kZWZhdWx0X2RyaXZlcjsKIAogREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKIAotLyogcmVnaXN0ZXIgYSBkaXJlY3QgZHJhdyBkcml2ZXIuIFdlIGJldHRlciBub3QgdXNlIG1hbGxvYyBmb3Igd2UgYXJlIGluIAotICogdGhlIEVMRiBzdGFydHVwIGluaXRpYWxpc2F0aW9uIGF0IHRoaXMgcG9pbnQuCi0gKi8KLXZvaWQgZGRyYXdfcmVnaXN0ZXJfZHJpdmVyKGRkcmF3X2RyaXZlciAqZHJpdmVyKSB7Ci0gICAgZGRyYXdfZHJpdmVyc1tucm9mX2RkcmF3X2RyaXZlcnMrK10gPSBkcml2ZXI7Ci0KLSAgICAvKiBpbmNyZWFzZSBNQVhfRERSQVdfRFJJVkVSUyBpZiB0aGUgbGluZSBiZWxvdyB0cmlnZ2VycyAqLwotICAgIGFzc2VydChucm9mX2RkcmF3X2RyaXZlcnMgPD0gTUFYX0REUkFXX0RSSVZFUlMpOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtNTEsNyArNDYsNiBAQAogICAgIExQRERFTlVNQ0FMTEJBQ0tFWEEgbHBDYWxsYmFjaywgTFBWT0lEIGxwQ29udGV4dCwgRFdPUkQgZHdGbGFncykKIHsKICAgICBpbnQgaTsKLSAgICBHVUlECXplcm9HVUlEOwogICAgIFRSQUNFKCIoJXAsJXAsICUwOGx4KVxuIiwgbHBDYWxsYmFjaywgbHBDb250ZXh0LCBkd0ZsYWdzKTsKIAogICAgIGlmIChUUkFDRV9PTihkZHJhdykpIHsKQEAgLTY0LDQzICs1OCwyMCBAQAogCSAgICBEUFJJTlRGKCJEREVOVU1fTk9ORElTUExBWURFVklDRVMgIik7CiAJRFBSSU5URigiXG4iKTsKICAgICB9Ci0gICAgaWYgKGR3RmxhZ3MgJiBEREVOVU1fQVRUQUNIRURTRUNPTkRBUllERVZJQ0VTKSB7Ci0JRklYTUUoIm5vIGF0dGFjaGVkIHNlY29uZGFyeSBkZXZpY2VzIHN1cHBvcnRlZC5cbiIpOwotCS8qcmV0dXJuIEVfRkFJTDsqLwotICAgIH0KIAotICAgIG1lbXNldCgmemVyb0dVSUQsMCxzaXplb2YoemVyb0dVSUQpKTsKKyAgICBmb3IgKGk9MDsgaTxERFJBV19udW1fZHJpdmVyczsgaSsrKQorICAgIHsKKyAgICAgICAgVFJBQ0UoIkVudW1lcmF0aW5nICVzLyVzIGludGVyZmFjZVxuIiwKKwkgICAgICBERFJBV19kcml2ZXJzW2ldLT5pbmZvLT5zekRyaXZlciwKKwkgICAgICBERFJBV19kcml2ZXJzW2ldLT5pbmZvLT5zekRlc2NyaXB0aW9uKTsKIAotICAgIC8qIHdlIGhhdmUgYXQgbGVhc3Qgb25lIEREUkFXIGRyaXZlciAqLwotICAgIGlmIChkZHJhd19kcml2ZXJzWzBdKSB7Ci0JaWYgKCFscENhbGxiYWNrKAotCSAgICAmemVyb0dVSUQsIC8qIEZJWE1FOiBvciBOVUxMPyAtTU0gKi8KLQkgICAgIldJTkUgRGlyZWN0RHJhdyIsCi0JICAgICJkaXNwbGF5IiwKLQkgICAgbHBDb250ZXh0LAotCSAgICAwCQkvKiBGSVhNRTogZmxhZ3Mgbm90IHN1cHBvcnRlZCBoZXJlICovCi0JKSkKLQkgICAgcmV0dXJuIEREX09LOwotICAgIH0KLSAgICAvKiBJbnZva2UgY2FsbGJhY2sgZm9yIHdoYXQgZmxhZ3Mgd2UgZG8gc3VwcG9ydCAqLwotICAgIGZvciAoaT0wO2k8TUFYX0REUkFXX0RSSVZFUlM7aSsrKSB7Ci0JaWYgKCFkZHJhd19kcml2ZXJzW2ldKQotCSAgICBjb250aW51ZTsKLQlpZiAoZGRyYXdfZHJpdmVyc1tpXS0+Y3JlYXRlRERSQVcoTlVMTCkpIC8qICEwIGlzIGZhaWxpbmcgKi8KLQkgICAgY29udGludWU7Ci0gICAgICAgIFRSQUNFKCJFbnVtZXJhdGluZyAlcy8lcyBpbnRlcmZhY2VcbiIsZGRyYXdfZHJpdmVyc1tpXS0+bmFtZSxkZHJhd19kcml2ZXJzW2ldLT50eXBlKTsKLQlpZiAoIWxwQ2FsbGJhY2soCi0JICAgIGRkcmF3X2RyaXZlcnNbaV0tPmd1aWQsCi0JICAgIChMUFNUUilkZHJhd19kcml2ZXJzW2ldLT5uYW1lLAotCSAgICAoTFBTVFIpZGRyYXdfZHJpdmVyc1tpXS0+dHlwZSwKLQkgICAgbHBDb250ZXh0LAotCSAgICAwCQkvKiBGSVhNRTogZmxhZ3Mgbm90IHN1cHBvcnRlZCBoZXJlICovCi0JKSkKLQkgICAgcmV0dXJuIEREX09LOwotICAgIH0KLSAgICBpZiAobnJvZl9kZHJhd19kcml2ZXJzKSB7Ci0JVFJBQ0UoIkVudW1lcmF0aW5nIHRoZSBkZWZhdWx0IGludGVyZmFjZVxuIik7Ci0JaWYgKCFscENhbGxiYWNrKE5VTEwsIldJTkUgKGRlZmF1bHQpIiwgImRpc3BsYXkiLCBscENvbnRleHQsIDApKQorCS8qIFdlIGhhdmUgdG8gcGFzcyBOVUxMIGZyb20gdGhlIHByaW1hcnkgZGlzcGxheSBkZXZpY2UuCisJICogUm9hZFJhZ2UgY2hhcHRlciA2J3MgZW51bWVyYXRpb24gcm91dGluZSBleHBlY3RzIGl0LiAqLworCWlmICghbHBDYWxsYmFjaygoRERSQVdfZGVmYXVsdF9kcml2ZXIgPT0gaSkgPyBOVUxMCisJCQk6KExQR1VJRCkmRERSQVdfZHJpdmVyc1tpXS0+aW5mby0+Z3VpZERldmljZUlkZW50aWZpZXIsCisJCQkoTFBTVFIpRERSQVdfZHJpdmVyc1tpXS0+aW5mby0+c3pEZXNjcmlwdGlvbiwKKwkJCShMUFNUUilERFJBV19kcml2ZXJzW2ldLT5pbmZvLT5zekRyaXZlciwKKwkJCWxwQ29udGV4dCwgMCkpCiAJICAgIHJldHVybiBERF9PSzsKICAgICB9CiAKQEAgLTEzNyw4ICsxMDgsNiBAQAogICAgIHJldHVybiBiUmVzdWx0OwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogSFJFU1VMVCBXSU5BUEkgRGlyZWN0RHJhd0VudW1lcmF0ZUV4VygKICAgTFBEREVOVU1DQUxMQkFDS0VYVyBscENhbGxiYWNrLCBMUFZPSUQgbHBDb250ZXh0LCBEV09SRCBkd0ZsYWdzKQogewpAQCAtMTYzLDggKzEzMiw2IEBACiAJbHBHVUlELCBscERyaXZlckRlc2NyaXB0aW9uLCBscERyaXZlck5hbWUsIHBFUEQtPmxwQ29udGV4dCk7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBIUkVTVUxUIFdJTkFQSSBEaXJlY3REcmF3RW51bWVyYXRlQSgKICAgTFBEREVOVU1DQUxMQkFDS0EgbHBDYWxsYmFjaywgTFBWT0lEIGxwQ29udGV4dCkgCiB7CkBAIC0xODksOCArMTU2LDYgQEAKIAlscEdVSUQsIGxwRHJpdmVyRGVzY3JpcHRpb24sIGxwRHJpdmVyTmFtZSwgcEVQRC0+bHBDb250ZXh0KTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIEhSRVNVTFQgV0lOQVBJIERpcmVjdERyYXdFbnVtZXJhdGVXKAogICBMUERERU5VTUNBTExCQUNLVyBscENhbGxiYWNrLCBMUFZPSUQgbHBDb250ZXh0KSAKIHsKQEAgLTIwMSwyMTUgKzE2NiwyMDMgQEAKICAgICByZXR1cm4gRGlyZWN0RHJhd0VudW1lcmF0ZUV4VyhEaXJlY3REcmF3RW51bWVyYXRlUHJvY1csIChMUFZPSUQpICZlcGQsIDApOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJCQkJRGlyZWN0RHJhdyBXaW5kb3cgUHJvY2VkdXJlCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlEaXJlY3REcmF3Q3JlYXRlCiAgKi8KLXN0YXRpYyBMUkVTVUxUIFdJTkFQSSBERFduZFByb2MoSFdORCBod25kLFVJTlQgbXNnLFdQQVJBTSB3UGFyYW0sTFBBUkFNIGxQYXJhbSkKKworY29uc3QgZGRyYXdfZHJpdmVyKiBERFJBV19GaW5kRHJpdmVyKGNvbnN0IEdVSUQqIHBHVUlEKQogewotICAgIExSRVNVTFQgcmV0OwotICAgIElEaXJlY3REcmF3SW1wbCogZGRyYXcgPSBOVUxMOwotICAgIERXT1JEIGxhc3RFcnJvcjsKKyAgICBzdGF0aWMgY29uc3QgR1VJRCB6ZXJvR1VJRDsgLyogZ2V0cyB6ZXJvLWluaXRlZCAqLwogCi0gICAgLyogRklYTUUoZGRyYXcsIigweCUwNHgsJXMsMHglMDhseCwweCUwOGx4KSxzdHViIVxuIiwoaW50KWh3bmQsU1BZX0dldE1zZ05hbWUobXNnKSwobG9uZyl3UGFyYW0sKGxvbmcpbFBhcmFtKTsgKi8KKyAgICBUUkFDRSgiKCVzKVxuIiwgcEdVSUQgPyBkZWJ1Z3N0cl9ndWlkKHBHVUlEKSA6ICIobnVsbCkiKTsKIAotICAgIFNldExhc3RFcnJvciggRVJST1JfU1VDQ0VTUyApOwotICAgIGRkcmF3ICA9IChJRGlyZWN0RHJhd0ltcGwqKUdldFByb3BBKCBod25kLCBkZFByb3AgKTsKLSAgICBpZiggKCFkZHJhdykgICYmICggKCBsYXN0RXJyb3IgPSBHZXRMYXN0RXJyb3IoKSApICE9IEVSUk9SX1NVQ0NFU1MgKSkgCi0JRVJSKCJVbmFibGUgdG8gcmV0cmlldmUgdGhpcyBwdHIgZnJvbSB3aW5kb3cuIEVycm9yICUwOGx4XG4iLGxhc3RFcnJvcik7CisgICAgaWYgKEREUkFXX251bV9kcml2ZXJzID09IDApIHJldHVybiBOVUxMOwogCi0gICAgaWYoIGRkcmF3ICkgewotICAgIC8qIFBlcmZvcm0gYW55IHNwZWNpYWwgZGlyZWN0IGRyYXcgZnVuY3Rpb25zICovCi0JaWYgKG1zZz09V01fUEFJTlQpCi0JICAgIGRkcmF3LT5kLT5wYWludGFibGUgPSAxOworICAgIGlmIChwR1VJRCA9PSAoTFBHVUlEKUREQ1JFQVRFX0VNVUxBVElPTk9OTFkKKwl8fCBwR1VJRCA9PSAoTFBHVUlEKUREQ1JFQVRFX0hBUkRXQVJFT05MWSkKKwlwR1VJRCA9IE5VTEw7CiAKLQkvKiBOb3cgbGV0IHRoZSBhcHBsaWNhdGlvbiBkZWFsIHdpdGggdGhlIHJlc3Qgb2YgdGhpcyAqLwotCWlmKCBkZHJhdy0+ZC0+bWFpbldpbmRvdyApIHsKKyAgICBpZiAocEdVSUQgPT0gTlVMTCB8fCBtZW1jbXAocEdVSUQsICZ6ZXJvR1VJRCwgc2l6ZW9mKEdVSUQpKSA9PSAwKQorICAgIHsKKwkvKiBVc2UgdGhlIGRlZmF1bHQgZHJpdmVyLiAqLworCXJldHVybiBERFJBV19kcml2ZXJzW0REUkFXX2RlZmF1bHRfZHJpdmVyXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBMb29rIGZvciBhIG1hdGNoaW5nIEdVSUQuICovCiAKLQkgICAgLyogRG9uJ3QgdGhpbmsgdGhhdCB3ZSBhY3R1YWxseSBuZWVkIHRvIGNhbGwgdGhpcyBidXQuLi4gCi0JICAgICAqIG1pZ2h0IGFzIHdlbGwgYmUgb24gdGhlIHNhZmUgc2lkZSBvZiB0aGluZ3MuLi4KLQkgICAgICovCisJaW50IGk7CisJZm9yIChpPTA7IGkgPCBERFJBV19udW1fZHJpdmVyczsgaSsrKQorCXsKKwkgICAgaWYgKElzRXF1YWxHVUlEKHBHVUlELAorCQkJICAgICZERFJBV19kcml2ZXJzW2ldLT5pbmZvLT5ndWlkRGV2aWNlSWRlbnRpZmllcikpCisJCWJyZWFrOworCX0KIAotCSAgICAvKiBJIGNoYW5nZWQgaHduZCB0byBkZHJhdy0+ZC0+bWFpbldpbmRvdyBhcyBJIGRpZCBub3Qgc2VlIHdoeQotCSAgICAgKiBpdCBzaG91bGQgYmUgdGhlIHByb2NlZHVyZXMgb2Ygb3VyIGZha2Ugd2luZG93IHRoYXQgZ2V0cyBjYWxsZWQKLQkgICAgICogaW5zdGVhZCBvZiB0aG9zZSBvZiB0aGUgd2luZG93IHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLQkgICAgICogQW5kIHdpdGggdGhpcyBwYXRjaCwgbW91c2UgY2xpY2tzIHdvcmsgd2l0aCBNb25rZXkgSXNsYW5kIElJSQotCSAgICAgKiAtIExpb25lbAotCSAgICAgKi8KLQkgICAgcmV0ID0gRGVmV2luZG93UHJvY0EoIGRkcmF3LT5kLT5tYWluV2luZG93LCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisJaWYgKGkgPCBERFJBV19udW1fZHJpdmVycykKKwl7CisJICAgIHJldHVybiBERFJBV19kcml2ZXJzW2ldOworCX0KKwllbHNlCisJeworCSAgICBFUlIoIiglcyk6IGRpZCBub3QgcmVjb2duaXplIHJlcXVlc3RlZCBHVUlELlxuIixkZWJ1Z3N0cl9ndWlkKHBHVUlEKSk7CisJICAgIHJldHVybiBOVUxMOworCX0KKyAgICB9Cit9CiAKLQkgICAgaWYoICFyZXQgKSB7Ci0JCS8qIFdlIGRpZG4ndCBoYW5kbGUgdGhlIG1lc3NhZ2UgLSBnaXZlIGl0IHRvIHRoZSBhcHBsaWNhdGlvbiAqLwotCQlpZiAoZGRyYXcgJiYgZGRyYXctPmQtPm1haW5XaW5kb3cpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBXTkRQUk9DIHdpbnByb2MgPSAoV05EUFJPQylHZXRXaW5kb3dMb25nQSggZGRyYXctPmQtPm1haW5XaW5kb3csIEdXTF9XTkRQUk9DICk7Ci0JCSAgICByZXQgPSBDYWxsV2luZG93UHJvY0Eod2lucHJvYywgZGRyYXctPmQtPm1haW5XaW5kb3csIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKLSAgICAgICAgICAgICAgICB9Ci0JICAgIH0KLQkgICAgcmV0dXJuIHJldDsKLQl9IC8qIGVsc2UgRkFMTFRIUk9VR0ggKi8KLSAgICB9IC8qIGVsc2UgRkFMTFRIUk9VR0ggKi8KLSAgICByZXR1cm4gRGVmV2luZG93UHJvY0EoaHduZCxtc2csd1BhcmFtLGxQYXJhbSk7CitzdGF0aWMgSFJFU1VMVCBERFJBV19DcmVhdGUoCisJTFBHVUlEIGxwR1VJRCwgTFBWT0lEICpscGxwREQsIExQVU5LTk9XTiBwVW5rT3V0ZXIsIFJFRklJRCBpaWQsIEJPT0wgZXgKKykgeworICAgIGNvbnN0IGRkcmF3X2RyaXZlciogZHJpdmVyOworICAgIExQRElSRUNURFJBVzcgcEREOworICAgIEhSRVNVTFQgaHI7CisKKyAgICBpZiAoRERSQVdfbnVtX2RyaXZlcnMgPT0gMCkKKyAgICB7CisJV0FSTigibm8gRGlyZWN0RHJhdyBkcml2ZXJzIHJlZ2lzdGVyZWRcbiIpOworCXJldHVybiBEREVSUl9JTlZBTElERElSRUNURFJBV0dVSUQ7CisgICAgfQorCisgICAgaWYgKGxwR1VJRCA9PSAoTFBHVUlEKUREQ1JFQVRFX0VNVUxBVElPTk9OTFkKKwl8fCBscEdVSUQgPT0gKExQR1VJRClERENSRUFURV9IQVJEV0FSRU9OTFkpCisJbHBHVUlEID0gTlVMTDsKKworICAgIFRSQUNFKCIoJXMsJXAsJXApXG4iLGRlYnVnc3RyX2d1aWQobHBHVUlEKSxscGxwREQscFVua091dGVyKTsKKworICAgIGlmIChwVW5rT3V0ZXIgIT0gTlVMTCkKKwlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsgLyogQ0xBU1NfRV9OT0FHR1JFR0FUSU9OPyAqLworCisgICAgZHJpdmVyID0gRERSQVdfRmluZERyaXZlcihscEdVSUQpOworICAgIGlmIChkcml2ZXIgPT0gTlVMTCkgcmV0dXJuIERERVJSX0lOVkFMSURESVJFQ1REUkFXR1VJRDsKKworICAgIGhyID0gZHJpdmVyLT5jcmVhdGUobHBHVUlELCAmcERELCBwVW5rT3V0ZXIsIGV4KTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOworCisgICAgaHIgPSBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UocERELCBpaWQsIGxwbHBERCk7CisgICAgSURpcmVjdERyYXc3X1JlbGVhc2UocEREKTsKKyAgICByZXR1cm4gaHI7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCURpcmVjdERyYXdDcmVhdGUKKyAqCisgKiBPbmx5IGNyZWF0ZXMgbGVnYWN5IElEaXJlY3REcmF3IGludGVyZmFjZXMuCisgKiBDYW5ub3QgY3JlYXRlIElEaXJlY3REcmF3NyBpbnRlcmZhY2VzLgorICogSW4gdGhlb3J5LgogICovCiBIUkVTVUxUIFdJTkFQSSBEaXJlY3REcmF3Q3JlYXRlKAotCUxQR1VJRCBscEdVSUQsIExQRElSRUNURFJBVyAqbHBscERELCBMUFVOS05PV04gcFVua091dGVyCisJTFBHVUlEIGxwR1VJRCwgTFBESVJFQ1REUkFXKiBscGxwREQsIExQVU5LTk9XTiBwVW5rT3V0ZXIKICkgewotICAgIElEaXJlY3REcmF3SW1wbCoqIGlscGxwREQ9KElEaXJlY3REcmF3SW1wbCoqKWxwbHBERDsKLSAgICBXTkRDTEFTU0EJd2M7Ci0gICAgSFJFU1VMVAlyZXQgPSAwOwotICAgIGludAkJaSxkcnZpbmRleD0wOwotICAgIEdVSUQJemVyb0dVSUQ7Ci0KLSAgICBzdHJ1Y3QgZGRyYXdfZHJpdmVyCSpkZGQgPSBOVUxMOwotCi0gICAgaWYgKCFISVdPUkQobHBHVUlEKSkgbHBHVUlEID0gTlVMTDsKLQotICAgIFRSQUNFKCIoJXMsJXAsJXApXG4iLGRlYnVnc3RyX2d1aWQobHBHVUlEKSxpbHBscERELHBVbmtPdXRlcik7Ci0KLSAgICBtZW1zZXQoJnplcm9HVUlELDAsc2l6ZW9mKHplcm9HVUlEKSk7Ci0gICAgd2hpbGUgKDEpIHsKLQlkZGQgPSBOVUxMOwotCWlmICggKCAhbHBHVUlEICkgfHwKLQkgICAgICggSXNFcXVhbEdVSUQoICZ6ZXJvR1VJRCwgIGxwR1VJRCApICkgfHwKLQkgICAgICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXcsICBscEdVSUQgKSApIHx8Ci0JICAgICAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3MiwgbHBHVUlEICkgKSB8fAotCSAgICAgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhdzQsIGxwR1VJRCApICkgfHwKLQkgICAgICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXc3LCBscEdVSUQgKSApCi0JKSB7Ci0JICAgIC8qIGNob29zZSBhbiBpbnRlcmZhY2Ugb3V0IG9mIHRoZSBsaXN0ICovCi0JICAgIGZvciAoaT0wO2k8bnJvZl9kZHJhd19kcml2ZXJzO2krKykgewotCQlkZHJhd19kcml2ZXIgKnhkZGQgPSBkZHJhd19kcml2ZXJzW2ldOwotCQlpZiAoIXhkZGQpCi0JCSAgICBjb250aW51ZTsKLQkJaWYgKCFkZGQgfHwgKGRkZC0+cHJlZmVyZW5jZTx4ZGRkLT5wcmVmZXJlbmNlKSkgewotCQkgICAgZHJ2aW5kZXggPSBpOwotCQkgICAgZGRkID0geGRkZDsKLQkJfQotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgZm9yIChpPTA7aTxucm9mX2RkcmF3X2RyaXZlcnM7aSsrKSB7Ci0JCWlmICghZGRyYXdfZHJpdmVyc1tpXSkKLQkJICAgIGNvbnRpbnVlOwotCQlpZiAoSXNFcXVhbEdVSUQoZGRyYXdfZHJpdmVyc1tpXS0+Z3VpZCxscEdVSUQpKSB7Ci0JCSAgICBkcnZpbmRleCA9IGk7Ci0JCSAgICBkZGQgPSBkZHJhd19kcml2ZXJzW2ldOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQlpZiAoIWRkZCkgewotCSAgICBpZiAoIW5yb2ZfZGRyYXdfZHJpdmVycykgewotCQlFUlIoIkRpcmVjdERyYXdDcmVhdGUoJXMsJXAsJXApOiBubyBEaXJlY3REcmF3IGRyaXZlcnMgY29tcGlsZWQgaW4uXG4iLGRlYnVnc3RyX2d1aWQobHBHVUlEKSxscGxwREQscFVua091dGVyKTsKLQkJcmV0dXJuIERERVJSX05PRElSRUNURFJBV0hXOwotCSAgICB9Ci0JICAgIEVSUigiRGlyZWN0RHJhd0NyZWF0ZSglcywlcCwlcCk6IGRpZCBub3QgcmVjb2duaXplIHJlcXVlc3RlZCBHVUlELlxuIixkZWJ1Z3N0cl9ndWlkKGxwR1VJRCksbHBscERELHBVbmtPdXRlcik7Ci0JICAgIHJldHVybiBEREVSUl9JTlZBTElERElSRUNURFJBV0dVSUQ7Ci0JfQotCVRSQUNFKCJ1c2luZyBcIiVzXCIgZHJpdmVyLCBjYWxsaW5nICVwXG4iLGRkZC0+bmFtZSxkZGQtPmNyZWF0ZUREUkFXKTsKLQotCXJldCA9IGRkZC0+Y3JlYXRlRERSQVcobHBscEREKTsKLQlpZiAoIXJldCkKLQkgICAgYnJlYWs7Ci0JZGRyYXdfZHJpdmVyc1tkcnZpbmRleF0gPSBOVUxMOyAvKiBtYXJrIHRoaXMgb25lIGFzIHVudXNhYmxlICovCi0gICAgfQotCi0gICAgaWYgKGxwR1VJRCAmJgotCShJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhdzIsIGxwR1VJRCApIHx8Ci0JIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3NCwgbHBHVUlEICkgfHwKLQkgSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXc3LCBscEdVSUQgKQotCSkKLSAgICApIHsKLQlMUFZPSUQgeDsKLQlyZXQgPSBJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSgqbHBscERELGxwR1VJRCwmeCk7Ci0JSURpcmVjdERyYXdfUmVsZWFzZSgqbHBscEREKTsgLyogZWl0aGVyIGRyb3AgMSByZWZjb3VudCwgb3IgcmVsZWFzZSAqLwotCWlmICghcmV0KQotCSAgICAqbHBscEREID0geDsKLQllbHNlCi0JICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIHdjLnN0eWxlCQk9IENTX0dMT0JBTENMQVNTOwotICAgIHdjLmxwZm5XbmRQcm9jCT0gRERXbmRQcm9jOwotICAgIHdjLmNiQ2xzRXh0cmEJPSAwOwotICAgIHdjLmNiV25kRXh0cmEJPSAwOwotCi0gICAgLyogV2UgY2FuIGJlIGEgY2hpbGQgb2YgdGhlIGRlc2t0b3Agc2luY2Ugd2UncmUgcmVhbGx5IGltcG9ydGFudCAqLwotICAgIHdjLmhJbnN0YW5jZT0gMDsgCi0gICAgd2MuaEljb24JPSAwOwotICAgIHdjLmhDdXJzb3IJPSAoSENVUlNPUilJRENfQVJST1dBOwotICAgIHdjLmhickJhY2tncm91bmQJPSBOVUxMX0JSVVNIOwotICAgIHdjLmxwc3pNZW51TmFtZSAJPSAwOwotICAgIHdjLmxwc3pDbGFzc05hbWUJPSAiV0lORV9EaXJlY3REcmF3IjsKLSAgICAoKmlscGxwREQpLT5kLT53aW5jbGFzcyA9IFJlZ2lzdGVyQ2xhc3NBKCZ3Yyk7Ci0gICAgcmV0dXJuIHJldDsKKyAgcmV0dXJuIEREUkFXX0NyZWF0ZShscEdVSUQsKExQVk9JRCopbHBscERELHBVbmtPdXRlciwmSUlEX0lEaXJlY3REcmF3LEZBTFNFKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJRGlyZWN0RHJhd0NyZWF0ZUV4CisgKgorICogT25seSBjcmVhdGVzIG5ldyBJRGlyZWN0RHJhdzcgaW50ZXJmYWNlcy4KKyAqIFN1cHBvc2VkIHRvIGZhaWwgaWYgbGVnYWN5IGludGVyZmFjZXMgYXJlIHJlcXVlc3RlZC4KKyAqIEluIHRoZW9yeS4KICAqLwogSFJFU1VMVCBXSU5BUEkgRGlyZWN0RHJhd0NyZWF0ZUV4KAogCUxQR1VJRCBscEdVSUQsIExQVk9JRCogbHBscERELCBSRUZJSUQgaWlkLCBMUFVOS05PV04gcFVua091dGVyCiApIHsKLSAgTFBESVJFQ1REUkFXCWRkcmF3OwotICBIUkVTVUxUCWhyZXM7CisgICAgaWYgKCFJc0VxdWFsR1VJRChpaWQsICZJSURfSURpcmVjdERyYXc3KSkKKwlyZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKIAotICBGSVhNRSgiKCVwLCVwLCVzLCVwKSwgbWlnaHQgYmUgd3JvbmcuXG4iLGxwR1VJRCxscGxwREQsZGVidWdzdHJfZ3VpZChpaWQpLHBVbmtPdXRlcik7Ci0KLSAgaHJlcz1EaXJlY3REcmF3Q3JlYXRlKGxwR1VJRCwoTFBESVJFQ1REUkFXKikmZGRyYXcscFVua091dGVyKTsKLSAgaWYgKCFocmVzKSB7Ci0gICAgICBocmVzPUlEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKGRkcmF3LGlpZCxscGxwREQpOwotICAgICAgSURpcmVjdERyYXdfUmVsZWFzZShkZHJhdyk7Ci0gIH0KLSAgcmV0dXJuIGhyZXM7CisgIHJldHVybiBERFJBV19DcmVhdGUobHBHVUlELCBscGxwREQsIHBVbmtPdXRlciwgaWlkLCBUUlVFKTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2V4dGVybiBIUkVTVUxUIFVuaW5pdF9EaXJlY3REcmF3X0NyZWF0ZShjb25zdCBHVUlEKiwgTFBESVJFQ1REUkFXNyosCisJCQkJCUxQVU5LTk9XTiwgQk9PTCk7CisKKy8qIFRoaXMgaXMgZm9yIHRoZSBjbGFzcyBmYWN0b3J5LiAqLworc3RhdGljIEhSRVNVTFQgRERSQVdfQ3JlYXRlRGlyZWN0RHJhdyhJVW5rbm93biogcFVua091dGVyLCBSRUZJSUQgaWlkLAorCQkJCSAgICAgIExQVk9JRCogcHBPYmopCit7CisgICAgTFBESVJFQ1REUkFXNyBwREQ7CisgICAgSFJFU1VMVCBocjsKKworICAgIGhyID0gVW5pbml0X0RpcmVjdERyYXdfQ3JlYXRlKE5VTEwsICZwREQsIHBVbmtPdXRlciwgVFJVRSk7IC8qIGV4PyAqLworICAgIGlmIChGQUlMRUQoaHIpKSByZXR1cm4gaHI7CisKKyAgICBociA9IElEaXJlY3REcmF3N19RdWVyeUludGVyZmFjZShwREQsIGlpZCwgcHBPYmopOworICAgIElEaXJlY3REcmF3X1JlbGVhc2UocEREKTsKKyAgICByZXR1cm4gaHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERpcmVjdERyYXcgQ2xhc3NGYWN0b3J5Ci0gKgotICogIEhlYXZpbHkgaW5zcGlyZWQgKHdlbGwsIGNhbiB5b3Ugc2F5IGNvbXBsZXRlbHkgY29waWVkIDotKSApIGZyb20gRGlyZWN0U291bmQKLSAqCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KLSAgICBJQ09NX1ZGSUVMRChJQ2xhc3NGYWN0b3J5KTsKLSAgICBEV09SRAkJcmVmOworICAgIElDT01fVkZJRUxEX01VTFRJKElDbGFzc0ZhY3RvcnkpOworCisgICAgRFdPUkQgcmVmOworICAgIEhSRVNVTFQgKCpwZm5DcmVhdGVJbnN0YW5jZSkoSVVua25vd24gKnBVbmtPdXRlciwgUkVGSUlEIGlpZCwKKwkJCQkgTFBWT0lEICpwcE9iaik7CiB9IElDbGFzc0ZhY3RvcnlJbXBsOwogCitzdHJ1Y3Qgb2JqZWN0X2NyZWF0aW9uX2luZm8KK3sKKyAgICBjb25zdCBDTFNJRCAqY2xzaWQ7CisgICAgSFJFU1VMVCAoKnBmbkNyZWF0ZUluc3RhbmNlKShJVW5rbm93biAqcFVua091dGVyLCBSRUZJSUQgcmlpZCwKKwkJCQkgTFBWT0lEICpwcE9iaik7Cit9OworCisvKiBUaGVyZSBzaG91bGQgYmUgbW9yZSwgYnV0IHRoZXNlIGFyZSB0aGUgb25seSBvbmVzIGxpc3RlZCBpbiB0aGUgaGVhZGVyCisgKiBmaWxlLiAqLworZXh0ZXJuIEhSRVNVTFQgRERSQVdfQ3JlYXRlRGlyZWN0RHJhd0NsaXBwZXIoSVVua25vd24gKnBVbmtPdXRlciwgUkVGSUlEIHJpaWQsCisJCQkJCSAgICAgTFBWT0lEICpwcE9iaik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2JqZWN0X2NyZWF0aW9uX2luZm8gb2JqZWN0X2NyZWF0aW9uW10gPQoreworICAgIHsgJkNMU0lEX0RpcmVjdERyYXcsICAgICAgIAlERFJBV19DcmVhdGVEaXJlY3REcmF3IH0sCisgICAgeyAmQ0xTSURfRGlyZWN0RHJhdzcsCUREUkFXX0NyZWF0ZURpcmVjdERyYXcgfSwKKyAgICB7ICZDTFNJRF9EaXJlY3REcmF3Q2xpcHBlciwJRERSQVdfQ3JlYXRlRGlyZWN0RHJhd0NsaXBwZXIgfQorfTsKKwogc3RhdGljIEhSRVNVTFQgV0lOQVBJIAotRERDRl9RdWVyeUludGVyZmFjZShMUENMQVNTRkFDVE9SWSBpZmFjZSxSRUZJSUQgcmlpZCxMUFZPSUQgKnBwb2JqKSB7CitERENGX1F1ZXJ5SW50ZXJmYWNlKExQQ0xBU1NGQUNUT1JZIGlmYWNlLFJFRklJRCByaWlkLExQVk9JRCAqcHBvYmopCit7CiAgICAgSUNPTV9USElTKElDbGFzc0ZhY3RvcnlJbXBsLGlmYWNlKTsKIAotICAgIEZJWE1FKCIoJXApLT4oJXMsJXApLHN0dWIhXG4iLFRoaXMsZGVidWdzdHJfZ3VpZChyaWlkKSxwcG9iaik7CisgICAgaWYgKElzRXF1YWxHVUlEKHJpaWQsICZJSURfSVVua25vd24pCisJfHwgSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JQ2xhc3NGYWN0b3J5KSkKKyAgICB7CisJSUNsYXNzRmFjdG9yeV9BZGRSZWYoaWZhY2UpOworCSpwcG9iaiA9IFRoaXM7CisJcmV0dXJuIFNfT0s7CisgICAgfQorCisgICAgV0FSTigiKCVwKS0+KCVzLCVwKSxub3QgZm91bmRcbiIsVGhpcyxkZWJ1Z3N0cl9ndWlkKHJpaWQpLHBwb2JqKTsKICAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKIH0KIAotc3RhdGljIFVMT05HIFdJTkFQSQotRERDRl9BZGRSZWYoTFBDTEFTU0ZBQ1RPUlkgaWZhY2UpIHsKK3N0YXRpYyBVTE9ORyBXSU5BUEkgRERDRl9BZGRSZWYoTFBDTEFTU0ZBQ1RPUlkgaWZhY2UpIHsKICAgICBJQ09NX1RISVMoSUNsYXNzRmFjdG9yeUltcGwsaWZhY2UpOwogICAgIHJldHVybiArKyhUaGlzLT5yZWYpOwogfQogCiBzdGF0aWMgVUxPTkcgV0lOQVBJIEREQ0ZfUmVsZWFzZShMUENMQVNTRkFDVE9SWSBpZmFjZSkgewogICAgIElDT01fVEhJUyhJQ2xhc3NGYWN0b3J5SW1wbCxpZmFjZSk7Ci0gICAgLyogc3RhdGljIGNsYXNzLCB3b24ndCBiZSAgZnJlZWQgKi8KLSAgICByZXR1cm4gLS0oVGhpcy0+cmVmKTsKKworICAgIFVMT05HIHJlZiA9IC0tVGhpcy0+cmVmOworCisgICAgaWYgKHJlZiA9PSAwKQorCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOworCisgICAgcmV0dXJuIHJlZjsKIH0KIAorCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgRERDRl9DcmVhdGVJbnN0YW5jZSgKIAlMUENMQVNTRkFDVE9SWSBpZmFjZSxMUFVOS05PV04gcE91dGVyLFJFRklJRCByaWlkLExQVk9JRCAqcHBvYmoKICkgewogICAgIElDT01fVEhJUyhJQ2xhc3NGYWN0b3J5SW1wbCxpZmFjZSk7CiAKICAgICBUUkFDRSgiKCVwKS0+KCVwLCVzLCVwKVxuIixUaGlzLHBPdXRlcixkZWJ1Z3N0cl9ndWlkKHJpaWQpLHBwb2JqKTsKLSAgICBpZiAoICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdERyYXcsICByaWlkICkgKSB8fAotCSAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3REcmF3MiwgcmlpZCApICkgfHwKLQkgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0RHJhdzQsIHJpaWQgKSApICkgewotCSAgICAvKiBGSVhNRTogcmV1c2UgYWxyZWFkeSBjcmVhdGVkIERpcmVjdERyYXcgaWYgcHJlc2VudD8gKi8KLQkgICAgcmV0dXJuIERpcmVjdERyYXdDcmVhdGUoKExQR1VJRCkgcmlpZCwoTFBESVJFQ1REUkFXKilwcG9iaixwT3V0ZXIpOwotICAgIH0KLSAgICByZXR1cm4gQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRTsKKworICAgIHJldHVybiBUaGlzLT5wZm5DcmVhdGVJbnN0YW5jZShwT3V0ZXIsIHJpaWQsIHBwb2JqKTsKIH0KIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIEREQ0ZfTG9ja1NlcnZlcihMUENMQVNTRkFDVE9SWSBpZmFjZSxCT09MIGRvbG9jaykgewpAQCAtNDI3LDcgKzM4MCw2IEBACiAgICAgRERDRl9DcmVhdGVJbnN0YW5jZSwKICAgICBERENGX0xvY2tTZXJ2ZXIKIH07Ci1zdGF0aWMgSUNsYXNzRmFjdG9yeUltcGwgRERSQVdfQ0YgPSB7JkREQ0ZfVnRibCwgMSB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRGxsR2V0Q2xhc3NPYmplY3QgW0REUkFXLjEzXQpAQCAtNDQ4LDE0ICs0MDAsMzcgQEAKICAqLwogRFdPUkQgV0lOQVBJIEREUkFXX0RsbEdldENsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCxSRUZJSUQgcmlpZCxMUFZPSUQgKnBwdikKIHsKKyAgICBpbnQgaTsKKyAgICBJQ2xhc3NGYWN0b3J5SW1wbCAqZmFjdG9yeTsKKwogICAgIFRSQUNFKCIoJXAsJXAsJXApXG4iLCBkZWJ1Z3N0cl9ndWlkKHJjbHNpZCksIGRlYnVnc3RyX2d1aWQocmlpZCksIHBwdik7Ci0gICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JQ2xhc3NGYWN0b3J5LCByaWlkICkgKSB7Ci0gICAgCSpwcHYgPSAoTFBWT0lEKSZERFJBV19DRjsKLQlJQ2xhc3NGYWN0b3J5X0FkZFJlZigoSUNsYXNzRmFjdG9yeSopKnBwdik7Ci0JcmV0dXJuIFNfT0s7CisKKyAgICBpZiAoICFJc0VxdWFsR1VJRCggJklJRF9JQ2xhc3NGYWN0b3J5LCByaWlkICkKKwkgJiYgISBJc0VxdWFsR1VJRCggJklJRF9JVW5rbm93biwgcmlpZCkgKQorCXJldHVybiBFX05PSU5URVJGQUNFOworCisgICAgZm9yIChpPTA7IGkgPCBzaXplb2Yob2JqZWN0X2NyZWF0aW9uKS9zaXplb2Yob2JqZWN0X2NyZWF0aW9uWzBdKTsgaSsrKQorICAgIHsKKwlpZiAoSXNFcXVhbEdVSUQoJm9iamVjdF9jcmVhdGlvbltpXS5jbHNpZCwgcmNsc2lkKSkKKwkgICAgYnJlYWs7CiAgICAgfQotICAgIEZJWE1FKCIoJXAsJXAsJXApOiBubyBpbnRlcmZhY2UgZm91bmQuXG4iLCBkZWJ1Z3N0cl9ndWlkKHJjbHNpZCksIGRlYnVnc3RyX2d1aWQocmlpZCksIHBwdik7Ci0gICAgcmV0dXJuIENMQVNTX0VfQ0xBU1NOT1RBVkFJTEFCTEU7CisKKyAgICBpZiAoaSA9PSBzaXplb2Yob2JqZWN0X2NyZWF0aW9uKS9zaXplb2Yob2JqZWN0X2NyZWF0aW9uWzBdKSkKKyAgICB7CisJRklYTUUoIiVzOiBubyBjbGFzcyBmb3VuZC5cbiIsIGRlYnVnc3RyX2d1aWQocmNsc2lkKSk7CisJcmV0dXJuIENMQVNTX0VfQ0xBU1NOT1RBVkFJTEFCTEU7CisgICAgfQorCisgICAgZmFjdG9yeSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoKmZhY3RvcnkpKTsKKyAgICBpZiAoZmFjdG9yeSA9PSBOVUxMKSByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKworICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoZmFjdG9yeSwgSUNsYXNzRmFjdG9yeSwgRERDRl9WdGJsKTsKKyAgICBmYWN0b3J5LT5yZWYgPSAxOworCisgICAgZmFjdG9yeS0+cGZuQ3JlYXRlSW5zdGFuY2UgPSBvYmplY3RfY3JlYXRpb25baV0ucGZuQ3JlYXRlSW5zdGFuY2U7CisKKyAgICAqcHB2ID0gSUNPTV9JTlRFUkZBQ0UoZmFjdG9yeSwgSUNsYXNzRmFjdG9yeSk7CisgICAgcmV0dXJuIFNfT0s7CiB9CiAKIApAQCAtNDcwLDMgKzQ0NSw4OSBAQAogICAgIEZJWE1FKCIodm9pZCk6IHN0dWJcbiIpOwogICAgIHJldHVybiBTX0ZBTFNFOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbml0aWFsaXNhdGlvbgorICovCisKKy8qIENob29zZSB3aGljaCBkcml2ZXIgaXMgY29uc2lkZXJlZCB0aGUgcHJpbWFyeSBkaXNwbGF5IGRyaXZlci4gSXQgd2lsbAorICogYmUgY3JlYXRlZCB3aGVuIHdlIGdldCBhIE5VTEwgZ3VpZCBmb3IgdGhlIERpcmVjdERyYXdDcmVhdGUoRXgpLiAqLworc3RhdGljIGludCBERFJBV19DaG9vc2VEZWZhdWx0RHJpdmVyKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgaW50IGJlc3QgPSAwOworICAgIGludCBiZXN0X3Njb3JlID0gMDsKKworICAgIGFzc2VydChERFJBV19udW1fZHJpdmVycyA+IDApOworCisgICAgLyogVGhpcyBhbGdvcml0aG0gaXMgcmVhbGx5IHN0dXBpZC4gKi8KKyAgICBmb3IgKGk9MDsgaSA8IEREUkFXX251bV9kcml2ZXJzOyBpKyspCisgICAgeworCWlmIChERFJBV19kcml2ZXJzW2ldLT5wcmVmZXJlbmNlID4gYmVzdF9zY29yZSkKKwl7CisJICAgIGJlc3Rfc2NvcmUgPSBERFJBV19kcml2ZXJzW2ldLT5wcmVmZXJlbmNlOworCSAgICBiZXN0ID0gaTsKKwl9CisgICAgfQorCisgICAgYXNzZXJ0KGJlc3Rfc2NvcmUgPiAwKTsKKworICAgIHJldHVybiBiZXN0OworfQorCitCT09MIFdJTkFQSSBERFJBV19EbGxNYWluKEhJTlNUQU5DRSBoSW5zdERMTCwgRFdPUkQgZmR3UmVhc29uLCBMUFZPSUQgbHB2KQoreworICAgIC8qIElmIHdlIHdlcmUgc3VmZmljaWVudGx5IGNvb2wsIEREcmF3IGRyaXZlcnMgd291bGQganVzdCBiZSBDT00KKyAgICAgKiBvYmplY3RzLCByZWdpc3RlcmVkIHdpdGggYSBwYXJ0aWN1bGFyIGNvbXBvbmVudCBjYXRlZ29yeS4gKi8KKworICAgIEREUkFXX1VzZXJfSW5pdChoSW5zdERMTCwgZmR3UmVhc29uLCBscHYpOworCisjaWZkZWYgSEFWRV9MSUJYWEY4NlZNCisgICAgRERSQVdfWFZpZE1vZGVfSW5pdChoSW5zdERMTCwgZmR3UmVhc29uLCBscHYpOworI2VuZGlmCisjaWZkZWYgSEFWRV9MSUJYWEY4NkRHQTIKKyAgICBERFJBV19YRjg2REdBMl9Jbml0KGhJbnN0RExMLCBmZHdSZWFzb24sIGxwdik7CisjZW5kaWYKKworICAgIGlmIChERFJBV19udW1fZHJpdmVycyA+IDApCisJRERSQVdfZGVmYXVsdF9kcml2ZXIgPSBERFJBV19DaG9vc2VEZWZhdWx0RHJpdmVyKCk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyogUmVnaXN0ZXIgYSBkaXJlY3QgZHJhdyBkcml2ZXIuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHlvdXIgaW5pdAorICogZnVuY3Rpb24uIChUaGF0J3Mgd2h5IHRoZXJlIGlzIG5vIGxvY2tpbmc6IHlvdXIgaW5pdCBmdW5jIGlzIGNhbGxlZCBmcm9tCisgKiBvdXIgRGxsSW5pdCwgd2hpY2ggaXMgc2VyaWFsaXNlZC4pICovCit2b2lkIEREUkFXX3JlZ2lzdGVyX2RyaXZlcihjb25zdCBkZHJhd19kcml2ZXIgKmRyaXZlcikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBERFJBV19udW1fZHJpdmVyczsgaSsrKQorICAgIHsKKwlpZiAoRERSQVdfZHJpdmVyc1tpXSA9PSBkcml2ZXIpCisJeworCSAgICBFUlIoIkRyaXZlciByZXJlZ2lzdGVyaW5nICVwXG4iLCBkcml2ZXIpOworCSAgICByZXR1cm47CisJfQorICAgIH0KKworICAgIGlmIChERFJBV19udW1fZHJpdmVycyA9PSBzaXplb2YoRERSQVdfZHJpdmVycykvc2l6ZW9mKEREUkFXX2RyaXZlcnNbMF0pKQorICAgIHsKKwlFUlIoInRvbyBtYW55IEREUkFXIGRyaXZlcnNcbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBERFJBV19kcml2ZXJzW0REUkFXX251bV9kcml2ZXJzKytdID0gZHJpdmVyOworfQorCisvKiBUaGlzIHRvdGFsbHkgZG9lc24ndCBiZWxvbmcgaGVyZS4gKi8KK0xPTkcgRERSQVdfd2lkdGhfYnBwX3RvX3BpdGNoKERXT1JEIHdpZHRoLCBEV09SRCBicHApCit7CisgICAgTE9ORyBwaXRjaDsKKworICAgIGFzc2VydChicHAgIT0gMCk7IC8qIGtlZXBzIGhhcHBlbmluZy4uLiAqLworCisgICAgaWYgKGJwcCA9PSAxNSkgYnBwID0gMTY7CisgICAgcGl0Y2ggPSB3aWR0aCAqIChicHAgLyA4KTsKKyAgICByZXR1cm4gcGl0Y2ggKyAoOCAtIChwaXRjaCAlIDgpKSAlIDg7Cit9CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L21lc2FfcHJpdmF0ZS5oIGIvZGxscy9kZHJhdy9tZXNhX3ByaXZhdGUuaAppbmRleCA1YWE1Yzk0Li4zOThhMGZkIDEwMDY0NAotLS0gYS9kbGxzL2RkcmF3L21lc2FfcHJpdmF0ZS5oCisrKyBiL2RsbHMvZGRyYXcvbWVzYV9wcml2YXRlLmgKQEAgLTE0LDggKzE0LDYgQEAKIAogI3VuZGVmIFVTRV9PU01FU0EKIAotI2luY2x1ZGUgIngxMV9wcml2YXRlLmgiCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSURpcmVjdDNETGlnaHQgTUVTQSBwcml2YXRlIHN0cnVjdHVyZQogICovCkBAIC0xMTAsOCArMTA4LDggQEAKIAkJICAgICAgRFdPUkQgZHdSZW5kZXJTdGF0ZSwgUmVuZGVyU3RhdGUgKnJzKSA7CiAKIC8qIEFsbCBub24tc3RhdGljIGZ1bmN0aW9ucyAnZXhwb3J0ZWQnIGJ5IHZhcmlvdXMgc3ViLW9iamVjdHMgKi8KLWV4dGVybiBMUERJUkVDVDNEVEVYVFVSRTIgZDNkdGV4dHVyZTJfY3JlYXRlKElEaXJlY3REcmF3U3VyZmFjZTRJbXBsKiBzdXJmKTsKLWV4dGVybiBMUERJUkVDVDNEVEVYVFVSRSBkM2R0ZXh0dXJlX2NyZWF0ZShJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCogc3VyZik7CitleHRlcm4gTFBESVJFQ1QzRFRFWFRVUkUyIGQzZHRleHR1cmUyX2NyZWF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmKTsKK2V4dGVybiBMUERJUkVDVDNEVEVYVFVSRSBkM2R0ZXh0dXJlX2NyZWF0ZShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsKiBzdXJmKTsKIAogZXh0ZXJuIExQRElSRUNUM0RMSUdIVCBkM2RsaWdodF9jcmVhdGVfZHgzKElEaXJlY3QzREltcGwqIGQzZDEpOwogZXh0ZXJuIExQRElSRUNUM0RMSUdIVCBkM2RsaWdodF9jcmVhdGUoSURpcmVjdDNEMkltcGwqIGQzZDIpOwpAQCAtMTI5LDggKzEyNyw4IEBACiBleHRlcm4gaW50IGQzZF9PcGVuR0woTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLIGNiLCBMUFZPSUQgY29udGV4dCkgOwogZXh0ZXJuIGludCBpc19PcGVuR0woUkVGQ0xTSUQgcmd1aWQsIElEaXJlY3REcmF3U3VyZmFjZUltcGwqIHN1cmZhY2UsIElEaXJlY3QzRERldmljZTJJbXBsKiogZGV2aWNlLCBJRGlyZWN0M0QySW1wbCogZDNkKTsKIAotZXh0ZXJuIExQRElSRUNUM0RURVhUVVJFMiBtZXNhX2QzZHRleHR1cmUyX2NyZWF0ZShJRGlyZWN0RHJhd1N1cmZhY2U0SW1wbCopOwotZXh0ZXJuIExQRElSRUNUM0RURVhUVVJFIG1lc2FfZDNkdGV4dHVyZV9jcmVhdGUoSURpcmVjdERyYXdTdXJmYWNlNEltcGwqKTsKK2V4dGVybiBMUERJUkVDVDNEVEVYVFVSRTIgbWVzYV9kM2R0ZXh0dXJlMl9jcmVhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCopOworZXh0ZXJuIExQRElSRUNUM0RURVhUVVJFIG1lc2FfZDNkdGV4dHVyZV9jcmVhdGUoSURpcmVjdERyYXdTdXJmYWNlSW1wbCopOwogCiBzdGF0aWMgY29uc3QgR1VJRCBXSU5FX1VOVVNFRCBJSURfRDNEREVWSUNFMl9PcGVuR0wgPSB7CiAgIDB4MzlhMGRhMzgsCmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3N0cnVjdF9jb252ZXJ0LmMgYi9kbGxzL2RkcmF3L3N0cnVjdF9jb252ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5ZTZkNAotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvZGRyYXcvc3RydWN0X2NvbnZlcnQuYwpAQCAtMCwwICsxLDI4IEBACisvKglkZHJhdy9kM2Qgc3RydWN0dXJlIHZlcnNpb24gY29udmVyc2lvbgorICoKKyAqIENvcHlyaWdodCAyMDAwIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCisgKi8KKworI2luY2x1ZGUgPGRkcmF3Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKKwordm9pZCBERFJBV19Db252ZXJ0X0REU0NBUFNfMV9Ub18yKGNvbnN0IEREU0NBUFMqIHBJbiwgRERTQ0FQUzIqIHBPdXQpCit7CisgICAgLyogMiBhZGRzIHRocmVlIGFkZGl0aW9uYWwgY2FwcyBmaWVsZHMgdG8gdGhlIGVuZC4gQm90aCB2ZXJzaW9ucworICAgICAqIGFyZSB1bnZlcnNpb25lZC4gKi8KKyAgICBwT3V0LT5kd0NhcHMgPSBwSW4tPmR3Q2FwczsKKyAgICBwT3V0LT5kd0NhcHMyID0gMDsKKyAgICBwT3V0LT5kd0NhcHMzID0gMDsKKyAgICBwT3V0LT5kd0NhcHM0ID0gMDsKK30KKwordm9pZCBERFJBV19Db252ZXJ0X0REREVWSUNFSURFTlRJRklFUl8yX1RvXzEoY29uc3QgRERERVZJQ0VJREVOVElGSUVSKiBwSW4sCisJCQkJCSAgICAgRERERVZJQ0VJREVOVElGSUVSMiogcE91dCkKK3sKKyAgICAvKiAyIGFkZHMgYSBkd1dIUUxMZXZlbCBmaWVsZCB0byB0aGUgZW5kLiBCb3RoIHN0cnVjdHVyZXMgYXJlCisgICAgICogdW52ZXJzaW9uZWQuICovCisgICAgbWVtY3B5KHBPdXQsIHBJbiwgc2l6ZW9mKCpwT3V0KSk7Cit9CmRpZmYgLS1naXQgYS9kbGxzL2RkcmF3L3gxMS5jIGIvZGxscy9kZHJhdy94MTEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5MDJhYi4uMDAwMDAwMAotLS0gYS9kbGxzL2RkcmF3L3gxMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCQlEaXJlY3REcmF3IHVzaW5nIERHQSBvciBYbGliKFhTSE0pCi0gKgotICogQ29weXJpZ2h0IDE5OTctMTk5OSBNYXJjdXMgTWVpc3NuZXIKLSAqIENvcHlyaWdodCAxOTk4IExpb25lbCBVbG1lciAobW9zdCBvZiBEaXJlY3QzRCBzdHVmZikKLSAqLwotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJvcHRpb25zLmgiCi0jaW5jbHVkZSAiZGVidWd0b29scy5oIgotI2luY2x1ZGUgImRkcmF3LmgiCi0KLURFRkFVTFRfREVCVUdfQ0hBTk5FTChkZHJhdyk7Ci0KLSNpbmNsdWRlICJ4MTFfcHJpdmF0ZS5oIgotCi0jaWZkZWYgSEFWRV9MSUJYWFNITQotaW50IFhTaG1FcnJvckZsYWcgPSAwOwotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgQk9PTCBnZXRfb3B0aW9uKCBjb25zdCBjaGFyICpuYW1lLCBCT09MIGRlZiApIHsKLSAgICByZXR1cm4gUFJPRklMRV9HZXRXaW5lSW5pQm9vbCggIngxMWRydiIsIG5hbWUsIGRlZiApOwotfQotCi1zdGF0aWMgQk9PTAotRERSQVdfWFNITV9BdmFpbGFibGUodm9pZCkgewotI2lmZGVmIEhBVkVfTElCWFhTSE0KLSAgICBpZiAoZ2V0X29wdGlvbiggIlVzZVhTaG0iLCAxICkpIHsKLQlpZiAoVFNYU2htUXVlcnlFeHRlbnNpb24oZGlzcGxheSkpIHsKLQkgICAgaW50CQltYWpvcixtaW5vcjsKLQkgICAgQm9vbAlzaHBpeDsKLQotCSAgICBpZiAoVFNYU2htUXVlcnlWZXJzaW9uKGRpc3BsYXksICZtYWpvciwgJm1pbm9yLCAmc2hwaXgpKQotCQlyZXR1cm4gVFJVRTsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0jaWZkZWYgSEFWRV9YVklERU8KLXN0YXRpYyBCT09MCi1ERFJBV19YVklERU9fQXZhaWxhYmxlKHgxMV9kZF9wcml2YXRlICp4MTFkZHApIHsKLSAgdW5zaWduZWQgaW50IHBfdmVyc2lvbiwgcF9yZWxlYXNlLCBwX3JlcXVlc3RfYmFzZSwgcF9ldmVudF9iYXNlLCBwX2Vycm9yX2Jhc2U7Ci0gIAotICBpZiAoVFNYdlF1ZXJ5RXh0ZW5zaW9uKGRpc3BsYXksICZwX3ZlcnNpb24sICZwX3JlbGVhc2UsICZwX3JlcXVlc3RfYmFzZSwKLQkJICAgICAgICZwX2V2ZW50X2Jhc2UsICZwX2Vycm9yX2Jhc2UpID09IFN1Y2Nlc3MpIHsKLSAgICBYdkFkYXB0b3JJbmZvICphaTsKLSAgICBpbnQgbnVtX2FkYXB0YXRvcnMsIGksIGRlZmF1bHRfcG9ydDsKLSAgICAKLSAgICBpZiAoKHBfdmVyc2lvbiA8IDIpIHx8ICgocF92ZXJzaW9uID09IDIpICYmIChwX3JlbGVhc2UgPCAyKSkpIHsKLSAgICAgIFRSQUNFKCJYVmlkZW8gZXh0ZW5zaW9uIGRvZXMgTk9UIHN1cHBvcnQgbmVlZGVkIGZlYXR1cmVzIChuZWVkIHZlcnNpb24gMi4yKSAhXG4iKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoVFNYdlF1ZXJ5QWRhcHRvcnMoZGlzcGxheSwgWDExRFJWX0dldFhSb290V2luZG93KCksICZudW1fYWRhcHRhdG9ycywgJmFpKSAhPSBTdWNjZXNzKSB7Ci0gICAgICBUUkFDRSgiRmFpbGVkIHRvIGdldCBsaXN0IG9mIGFkYXB0YXRvcnMuXG4iKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG51bV9hZGFwdGF0b3JzID09IDApIHsKLSAgICAgIFRSQUNFKCJObyBYVmlkZW8gc3VwcG9ydGluZyBhZGFwdGF0b3JzIGZvdW5kLlxuIik7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgZGVmYXVsdF9wb3J0ID0gUFJPRklMRV9HZXRXaW5lSW5pSW50KCJ4MTFkcnYiLCAiWFZpZGVvUG9ydCIsIC0xKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2FkYXB0YXRvcnM7IGkrKykgewotICAgICAgaWYgKChhaVtpXS50eXBlICYgWHZJbnB1dE1hc2spICYmIChhaVtpXS50eXBlICYgWHZJbWFnZU1hc2spKSB7Ci0JLyogVGhpcyBzdXBwb3J0cyBldmVyeXRoaW5nIEkgd2FudCA6IFh2SW1hZ2VzIGFuZCB0aGUgcG9zc2liaWxpdHkgdG8gcHV0IHNvbWV0aGluZyAqLwotCWlmIChkZWZhdWx0X3BvcnQgPT0gLTEpIHsKLQkgIGRlZmF1bHRfcG9ydCA9IGFpW2ldLmJhc2VfaWQ7Ci0JICBicmVhazsKLQl9IGVsc2UgewotCSAgaWYgKChhaVtpXS5iYXNlX2lkIDw9IGRlZmF1bHRfcG9ydCkgJiYKLQkgICAgICAoKGFpW2ldLmJhc2VfaWQgKyBhaVtpXS5udW1fcG9ydHMpID4gZGVmYXVsdF9wb3J0KSkgewotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChpID09IG51bV9hZGFwdGF0b3JzKSB7Ci0gICAgICBpZiAoZGVmYXVsdF9wb3J0ICE9IC0xKSB7Ci0JRVJSKCJVc2VyIHNwZWNpZmllZCBwb3J0ICglZCkgbm90IGZvdW5kLlxuIiwgZGVmYXVsdF9wb3J0KTsKLSAgICAgIH0gZWxzZSB7Ci0JVFJBQ0UoIk5vIGlucHV0ICsgaW1hZ2UgY2FwYWJsZSBkZXZpY2UgZm91bmQuXG4iKTsKLSAgICAgIH0KLSAgICAgIFRTWHZGcmVlQWRhcHRvckluZm8oYWkpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICB4MTFkZHAtPnBvcnRfaWQgPSBkZWZhdWx0X3BvcnQ7Ci0KLSAgICBUUkFDRSgiWFZpZGVvIHN1cHBvcnQgYXZhaWxhYmxlICh1c2luZyB2ZXJzaW9uICVkLiVkKVxuIiwgcF92ZXJzaW9uLCBwX3JlbGVhc2UpOwotICAgIFRTWHZGcmVlQWRhcHRvckluZm8oYWkpOwotICAgIHJldHVybiBUUlVFOwotICB9Ci0gIHJldHVybiBGQUxTRTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgSFJFU1VMVCBYMTFfQ3JlYXRlKCBMUERJUkVDVERSQVcgKmxwbHBERCApIHsKLSAgICBJRGlyZWN0RHJhd0ltcGwqCWRkcmF3OwotICAgIGludAkJCWRlcHRoOwotICAgIHgxMV9kZF9wcml2YXRlCSp4MTFwcml2OwotCi0gICAgaWYgKGxwbHBERCA9PSBOVUxMKSAvKiBUZXN0aW5nIC4uLiB0aGlzIGRyaXZlciB3b3JrcyBhbGwgdGhlIHRpbWUgKi8KLQlyZXR1cm4gRERfT0s7Ci0KLSAgICAqbHBscEREID0gKExQRElSRUNURFJBVylIZWFwQWxsb2MoCi0JR2V0UHJvY2Vzc0hlYXAoKSwKLQlIRUFQX1pFUk9fTUVNT1JZLAotCXNpemVvZihJRGlyZWN0RHJhd0ltcGwpCi0gICAgKTsKLSAgICBkZHJhdyA9IChJRGlyZWN0RHJhd0ltcGwqKSpscGxwREQ7Ci0gICAgSUNPTV9WVEJMKGRkcmF3KT0gJnhsaWJfZGR2dDsKLSAgICBkZHJhdy0+cmVmCT0gMTsKLQotICAgIGRkcmF3LT5kID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoKihkZHJhdy0+ZCkpKTsKLSAgICBkZHJhdy0+ZC0+cmVmID0gMTsKLSAgICBkZHJhdy0+ZC0+cHJpdmF0ZQk9IEhlYXBBbGxvYygKLQlHZXRQcm9jZXNzSGVhcCgpLAotCUhFQVBfWkVST19NRU1PUlksCi0Jc2l6ZW9mKHgxMV9kZF9wcml2YXRlKQotICAgICk7Ci0gICAgeDExcHJpdiA9ICh4MTFfZGRfcHJpdmF0ZSopZGRyYXctPmQtPnByaXZhdGU7Ci0KLSAgICAvKiBBdCBEaXJlY3REcmF3IGNyZWF0aW9uLCB0aGUgZGVwdGggaXMgdGhlIGRlZmF1bHQgZGVwdGggKi8KLSAgICBkZXB0aCA9IERlZmF1bHREZXB0aE9mU2NyZWVuKFgxMURSVl9HZXRYU2NyZWVuKCkpOwotCi0gICAgc3dpdGNoIChfY29tbW9uX2RlcHRoX3RvX3BpeGVsZm9ybWF0KGRlcHRoLChMUERJUkVDVERSQVcpZGRyYXcpKSB7Ci0gICAgY2FzZSAtMjogRVJSKCJubyBkZXB0aCBjb252ZXJzaW9uIG1vZGUgZm9yIGRlcHRoICVkIGZvdW5kXG4iLGRlcHRoKTsgYnJlYWs7Ci0gICAgY2FzZSAtMTogV0FSTigiTm8gY29udmVyc2lvbiBuZWVkZWQgZm9yIGRlcHRoICVkLlxuIixkZXB0aCk7IGJyZWFrOwotICAgIGNhc2UgMDogTUVTU0FHRSgiQ29udmVyc2lvbiBuZWVkZWQgZnJvbSAlZC5cbiIsZGVwdGgpOyBicmVhazsKLSAgICB9Ci0KLSAgICBkZHJhdy0+ZC0+aGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7Ci0gICAgZGRyYXctPmQtPndpZHRoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7Ci0jaWZkZWYgSEFWRV9MSUJYWFNITQotICAgIC8qIFRlc3QgaWYgWFNobSBpcyBhdmFpbGFibGUuICovCi0gICAgaWYgKCh4MTFwcml2LT54c2htX2FjdGl2ZSA9IEREUkFXX1hTSE1fQXZhaWxhYmxlKCkpKSB7Ci0JeDExcHJpdi0+eHNobV9jb21wbCA9IDA7Ci0JVFJBQ0UoIlVzaW5nIFhTaG0gZXh0ZW5zaW9uLlxuIik7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1hWSURFTwotICAgIC8qIFRlc3QgaWYgWFZpZGVvIHN1cHBvcnQgaXMgYXZhaWxhYmxlICovCi0gICAgaWYgKCh4MTFwcml2LT54dmlkZW9fYWN0aXZlID0gRERSQVdfWFZJREVPX0F2YWlsYWJsZSh4MTFwcml2KSkpIHsKLSAgICAgIFRSQUNFKCJVc2luZyBYVmlkZW8gZXh0ZW5zaW9uIG9uIHBvcnQgJyVsZCcuXG4iLCB4MTFwcml2LT5wb3J0X2lkKTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gRERfT0s7Ci19Ci0KLS8qIFdoZXJlIGRvIHRoZXNlIEdVSURzIGNvbWUgZnJvbT8gIG1rdXVpZC4KLSAqIFRoZXkgZXhpc3Qgc29sZWx5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHRhcmdldHMgV2luZSBzdXBwb3J0LAotICogYW5kIHNob3VsZCBiZSBkaWZmZXJlbnQgdGhhbiBhbnkgb3RoZXIgR1VJRHMgaW4gZXhpc3RlbmNlLgotICovCi1zdGF0aWMgR1VJRCBYMTFfRGlyZWN0RHJhd19HVUlEID0geyAvKiAxNTc0YTc0MC1kYzYxLTExZDEtODQwNy1mNzg3NWE3ZDE4NzkgKi8KLSAgICAweDE1NzRhNzQwLAotICAgIDB4ZGM2MSwKLSAgICAweDExZDEsCi0gICAgezB4ODQsIDB4MDcsIDB4ZjcsIDB4ODcsIDB4NWEsIDB4N2QsIDB4MTgsIDB4Nzl9Ci19OwotCi1kZHJhd19kcml2ZXIgeDExX2RyaXZlciA9IHsKLSAgICAmWDExX0RpcmVjdERyYXdfR1VJRCwKLSAgICAiZGlzcGxheSIsCi0gICAgIldJTkUgWDExIERpcmVjdERyYXcgRHJpdmVyIiwKLSAgICA1MCwKLSAgICBYMTFfQ3JlYXRlCi19OyAKLQotREVDTF9HTE9CQUxfQ09OU1RSVUNUT1IoWDExX3JlZ2lzdGVyKSB7IGRkcmF3X3JlZ2lzdGVyX2RyaXZlcigmeDExX2RyaXZlcik7IH0KZGlmZiAtLWdpdCBhL2RsbHMvZGRyYXcveDExX3ByaXZhdGUuaCBiL2RsbHMvZGRyYXcveDExX3ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzNWZhOC4uMDAwMDAwMAotLS0gYS9kbGxzL2RkcmF3L3gxMV9wcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0jaWZuZGVmIF9fV0lORV9ERFJBV19YMTFfUFJJVkFURV9ICi0jZGVmaW5lIF9fV0lORV9ERFJBV19YMTFfUFJJVkFURV9ICi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBhbGwgWDExIHByaXZhdGUgYW5kIHNwZWNpZmljIGRlZmluaXRpb25zLgotICogSXQgbWF5IGFsc28gYmUgdXNlZCBieSBhbGwgcG9ydHMgdGhhdCByZXVzZSBYMTEgc3R1ZmYgKGxpa2UgWEY4NiBER0EpCi0gKi8KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJ0c194bGliLmgiCi0jaW5jbHVkZSAidHNfeHV0aWwuaCIKLQotI2lmZGVmIEhBVkVfTElCWFhTSE0KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGlmZGVmIEhBVkVfU1lTX0lQQ19ICi0jICBpbmNsdWRlIDxzeXMvaXBjLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfU1lTX1NITV9ICi0jICBpbmNsdWRlIDxzeXMvc2htLmg+Ci0jIGVuZGlmCi0jIGluY2x1ZGUgInRzX3hzaG0uaCIKLSNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfTElCWFhTSE0pICovCi0KLSNpZmRlZiBIQVZFX0xJQlhYRjg2Vk0KLSMgaW5jbHVkZSAidHNfeGY4NnZtb2RlLmgiCi1leHRlcm4gWEY4NlZpZE1vZGVNb2RlSW5mbyAqb3JpZ19tb2RlOwotI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9MSUJYWEY4NlZNKSAqLwotCi1leHRlcm4gdm9pZCB4Zjg2dm1vZGVfc2V0ZGlzcGxheW1vZGUoRFdPUkQsRFdPUkQpOwotZXh0ZXJuIHZvaWQgeGY4NnZtb2RlX3Jlc3RvcmUoKTsKLQotI2lmZGVmIEhBVkVfWFZJREVPCi0jaW5jbHVkZSAidHNfeHZpZGVvLmgiCi0jZWxzZQotLyogRmFrZSB0eXBlIHNvIHRoYXQgTk9UIHRvIGhhdmUgdG9vIG1hbnkgI2lmZGVmIFhWaWRlbyBseWluZyBhcm91bmQgKi8KLXR5cGVkZWYgaW50IFh2SW1hZ2U7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIngxMWRydi5oIgotCi0jaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgotCi0jaW5jbHVkZSAid2luZV9nbC5oIgotCi1leHRlcm4gSUNPTV9WVEFCTEUoSURpcmVjdERyYXcpCQl4bGliX2RkdnQ7Ci1leHRlcm4gSUNPTV9WVEFCTEUoSURpcmVjdERyYXcyKSAgICAgICAgeGxpYl9kZDJ2dDsKLWV4dGVybiBJQ09NX1ZUQUJMRShJRGlyZWN0RHJhdzQpICAgICAgICB4bGliX2RkNHZ0OwotZXh0ZXJuIElDT01fVlRBQkxFKElEaXJlY3REcmF3NykgICAgICAgIHhsaWJfZGQ3dnQ7Ci1leHRlcm4gSUNPTV9WVEFCTEUoSURpcmVjdERyYXdQYWxldHRlKQl4bGliX2RkcGFsdnQ7Ci1leHRlcm4gSUNPTV9WVEFCTEUoSURpcmVjdERyYXdTdXJmYWNlNCkgeGxpYl9kZHM0dnQ7Ci0KLXR5cGVkZWYgc3RydWN0IHgxMV9kZF9wcml2YXRlIHsKLSNpZmRlZiBIQVZFX0xJQlhYU0hNCi0gICAgaW50IHhzaG1fYWN0aXZlLCB4c2htX2NvbXBsOwotI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9MSUJYWFNITSkgKi8KLSNpZmRlZiBIQVZFX1hWSURFTwotICAgIEJPT0wgeHZpZGVvX2FjdGl2ZTsKLSAgICBYdlBvcnRJRCBwb3J0X2lkOwotI2VuZGlmCi0gICAgV2luZG93IGRyYXdhYmxlOwotICAgIHZvaWQgKmRldmljZV9jYXBhYmlsaXRpZXM7Ci19IHgxMV9kZF9wcml2YXRlOwotCi10eXBlZGVmIHN0cnVjdCB4MTFfZHBfcHJpdmF0ZSB7Ci0gICAgQk9PTAlpbnN0YWxsZWQ7CS8qIGlzIGNvbG9ybWFwIGluc3RhbGxlZCAqLwotICAgIENvbG9ybWFwCWNtOwkJLyogdGhlIFgxMSBDb2xvcm1hcCBhc3NvY2lhdGVkICovCi19IHgxMV9kcF9wcml2YXRlOwotCi1leHRlcm4gSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1NldEVudHJpZXMoTFBESVJFQ1REUkFXUEFMRVRURSxEV09SRCxEV09SRCxEV09SRCxMUFBBTEVUVEVFTlRSWSk7Ci1leHRlcm4gVUxPTkcgV0lOQVBJIFhsaWJfSURpcmVjdERyYXdQYWxldHRlSW1wbF9SZWxlYXNlKExQRElSRUNURFJBV1BBTEVUVEUgaWZhY2UpOwotCi10eXBlZGVmIHN0cnVjdCB4MTFfZHNfcHJpdmF0ZSB7Ci0gICAgQk9PTCBpc19vdmVybGF5OwotICAgIHVuaW9uIHsKLSAgICAgIFhJbWFnZQkqaW1hZ2U7Ci0gICAgICBzdHJ1Y3QgewotCS8qIFRoZSAnaW1hZ2UnIGZpZWxkIHNob3VsZCBiZSBpbiBGSVJTVCAhISEhIFRoZSBGbGlwIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhhdC4uLiAqLwotCVh2SW1hZ2UgKmltYWdlOwotCUJPT0wgc2hvd247Ci0JUkVDVCBzcmNfcmVjdDsKLQlSRUNUIGRzdF9yZWN0OwotCUxQRElSRUNURFJBV1NVUkZBQ0UgZGVzdF9zdXJmYWNlOwotICAgICAgfSBvdmVybGF5OwotICAgIH0gaW5mbzsgCi0jaWZkZWYgSEFWRV9MSUJYWFNITQotICAgIFhTaG1TZWdtZW50SW5mbwlzaG1pbmZvOwotI2VuZGlmCi0gICAgaW50CQkqb2xkRElCbWFwOwotICAgIEJPT0wgICAgICAgICBvcGVuZ2xfZmxpcDsKLX0geDExX2RzX3ByaXZhdGU7Ci0KLSNpZmRlZiBIQVZFX0xJQlhYU0hNCi1leHRlcm4gaW50IFhTaG1FcnJvckZsYWc7Ci0jZW5kaWYKLSNlbmRpZiAvKiBfX1dJTkVfRERSQVdfWDExX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9kZHJhdy50eHQgYi9kb2N1bWVudGF0aW9uL2RkcmF3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzBlYWIxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jdW1lbnRhdGlvbi9kZHJhdy50eHQKQEAgLTAsMCArMSwxMzQgQEAKK1RoaXMgaXMgYW4gb3V0bGluZSBvZiB0aGUgYXJjaGl0ZWN0dXJlLiBNYW55IGRldGFpbHMgYXJlCitza2lwcGVkLCBidXQgaG9wZWZ1bGx5IHRoaXMgaXMgdXNlZnVsLgorCitCeSBBbmRyZXcgTGV3eWNreSA8YW5kcmV3QHRyYW5zZ2FtaW5nLmNvbT4KKyh3aXRoIHVwZGF0ZXMgYnkgT3ZlIEvldmVuIDxvdmVrQHRyYW5zZ2FtaW5nLmNvbT4pCisKKworKiBEaXJlY3REcmF3IGluaGVyaXRhbmNlIHRyZWUKKworICAgICAgICBNYWluCisgICAgICAgICB8CisgICAgICAgIFVzZXIKKyAgICAgICAgIHwtLS0tLS0tLS0tLVwKKyAgICAgICAgWFZpZE1vZGUgICAgREdBMgorCitNb3N0IG9mIHRoZSBEaXJlY3REcmF3IGZ1bmN0aW9uYWxpdHkgaXMgaW1wbGVtZW50ZWQgaW4gYSBjb21tb24gYmFzZQorY2xhc3MuIERlcml2ZWQgY2xhc3NlcyBhcmUgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBkaXNwbGF5Cittb2RlIGZ1bmN0aW9ucyAoRW51bSwgU2V0LCBSZXN0b3JlKSwgR2V0Q2FwcywgR2V0RGV2aWNlIGlkZW50aWZpZXIKK2FuZCBpbnRlcm5hbCBmdW5jdGlvbnMgY2FsbGVkIHRvIGNyZWF0ZSBwcmltYXJ5IGFuZCBiYWNrYnVmZmVyCitzdXJmYWNlcy4KKworVXNlciBwcm92aWRlcyBmb3IgRGlyZWN0RHJhdyBjYXBhYmlsaXRpZXMgYmFzZWQgb24gZHJhd2luZyB0byBhCitXaW5lIHdpbmRvdy4gSXQgdXNlcyB0aGUgVXNlciBEaXJlY3REcmF3U3VyZmFjZSBpbXBsZW1lbnRhdGlvbgorZm9yIHByaW1hcnkgYW5kIGJhY2tidWZmZXIgc3VyZmFjZXMuCisKK1hWaWRNb2RlIGF0dGVtcHQgdG8gdXNlIHRoZSBYRnJlZTg2IFZpZE1vZGUgZXh0ZW5zaW9uIHRvIHNldCB0aGUKK2Rpc3BsYXkgcmVzb2x1dGlvbiB0byBtYXRjaCB0aGUgcGFyYW1ldGVycyB0byBTZXREaXNwbGF5TW9kZS4KKworREdBMiBhdHRlbXB0IHRvIHVzZSB0aGUgWEZyZWU4NiBER0EgMi54IGV4dGVuc2lvbiB0byBzZXQgdGhlCitkaXNwbGF5IHJlc29sdXRpb24gYW5kIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIGZyYW1lYnVmZmVyLCBpZiB0aGUKK2Z1bGwtc2NyZWVuLWV4Y2x1c2l2ZSBjb29wZXJhdGl2ZSBsZXZlbCBpcyB1c2VkLiBJZiBub3QsIGl0IGp1c3QKK3VzZXMgdGhlIFVzZXIgaW1wbGVtZW50YXRpb24uCisKKworKiBEaXJlY3REcmF3U3VyZmFjZSBpbmhlcml0YW5jZSB0cmVlCisKKyAgICAgICAgTWFpbgorICAgICAgICAgfC0tLS0tLS0tLS0tLS0tXAorICAgICAgICAgfCAgICAgICAgICAgICAgfAorICAgICAgICBESUIgICAgICAgIEZha2UgWi1CdWZmZXIKKyAgICAgICAgIHwKKyAgICAgICAgIHwtLS0tLS1cLS0tLS0tLS0tXAorICAgICAgICAgfCAgICAgIHwgICAgICAgICB8CisgICAgICAgIFVzZXIgICBER0EyICAgRElCVGV4dHVyZQorCitNYWluIHByb3ZpZGVzIGEgdmVyeSBzaW1wbGUgYmFzZSBjbGFzcyB0aGF0IGRvZXMgbm90IGltcGxlbWVudCBhbnkgb2YKK3RoZSBpbWFnZS1yZWxhdGVkIGZ1bmN0aW9ucy4gVGhlcmVmb3JlIGl0IGRvZXMgbm90IHBsYWNlIGFueQorY29uc3RyYWludHMgb24gaG93IHRoZSBzdXJmYWNlIGRhdGEgaXMgc3RvcmVkLgorCitESUIgc3RvcmVzIHRoZSBzdXJmYWNlIGRhdGEgaW4gYSBESUIgc2VjdGlvbi4gSXQgaXMgdXNlZCBieSB0aGUgTWFpbgorRGlyZWN0RHJhdyBkcml2ZXIgdG8gY3JlYXRlIG9mZi1zY3JlZW4gc3VyZmFjZXMuCisKK1VzZXIgaW1wbGVtZW50cyBwcmltYXJ5IGFuZCBiYWNrYnVmZmVyIHN1cmZhY2VzIGZvciB0aGUgVXNlciBEaXJlY3REcmF3Citkcml2ZXIuIElmIGl0IGlzIGEgcHJpbWFyeSBzdXJmYWNlLCBpdCB3aWxsIGF0dGVtcHQgdG8ga2VlcCBpdHNlbGYKK3N5bmNocm9uaXplZCB0byB0aGUgd2luZG93LgorCitER0EyIHN1cmZhY2VzIGNsYWltcyBhbiBhcHByb3ByaWF0ZSBzZWN0aW9uIG9mIGZyYW1lYnVmZmVyIHNwYWNlIGFuZAorbGV0cyBESUIgYnVpbGQgaXRzIERJQiBzZWN0aW9uIG9uIHRvcCBvZiBpdC4KKworRmFrZSBaLUJ1ZmZlciBzdXJmYWNlcyBhcmUgdXNlZCBieSBEaXJlY3QzRCB0byBpbmRpY2F0ZSB0aGF0IGEgcHJpbWFyeQorc3VyZmFjZSBoYXMgYW4gYXNzb2NpYXRlZCB6LWJ1ZmZlci4gRm9yIGEgZmlyc3QgaW1wbGVtZW50YXRpb24sIGl0Citkb2Vzbid0IG5lZWQgdG8gc3RvcmUgYW55IGltYWdlIGRhdGEgc2luY2UgaXQgaXMganVzdCBhIHBsYWNlaG9sZGVyLgorCisoQWN0dWFsbHkgM0QgcHJvZ3JhbXMgd2lsbCByYXJlbHkgdXNlIExvY2sgb3IgR2V0REMgb24gcHJpbWFyeQorc3VyZmFjZXMsIGJhY2tidWZmZXJzIG9yIHotYnVmZmVycyBzbyB3ZSBtYXkgd2FudCB0byBhcnJhbmdlIGZvcgorbGF6eSBhbGxvY2F0aW9uIG9mIHRoZSBESUIgc2VjdGlvbnMuKQorCisKKyogSW50ZXJmYWNlIFRodW5rcworCitPbmx5IHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIGFuIGludGVyZmFjZSBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZC4KK090aGVyIHZlcnNpb25zIGFyZSBoYW5kbGVkIGJ5IGhhdmluZyB0aHVua3MgY29udmVydCB0aGVpciBwYXJhbWV0ZXJzCithbmQgY2FsbCB0aGUgcm9vdCB2ZXJzaW9uLgorCitOb3QgYWxsIGludGVyZmFjZSB2ZXJzaW9ucyBoYXZlIHRodW5rcy4gU29tZSB2ZXJzaW9ucyBjb3VsZCBiZSBjb21iaW5lZAorYmVjYXVzZSB0aGVpciBwYXJhbWV0ZXJzIHdlcmUgY29tcGF0aWJsZS4gRm9yIGV4YW1wbGUgaWYgYSBzdHJ1Y3R1cmUKK2NoYW5nZXMgYnV0IHRoZSBzdHJ1Y3R1cmUgaGFzIGEgZHdTaXplIGZpZWxkLCBtZXRob2RzIHVzaW5nIHRoYXQgc3RydWN0dXJlCithcmUgY29tcGF0aWJsZSwgYXMgbG9uZyBhcyB0aGUgaW1wbGVtZW50YXRpb24gcmVtZW1iZXJzIHRvIHRha2UgdGhlIGR3U2l6ZQoraW50byBhY2NvdW50LgorCitJbnRlcmZhY2UgdGh1bmtzIGZvciBEaXJlY3QzRCBhcmUgbW9yZSBjb21wbGljYXRlZCBzaW5jZSB0aGUgcGFyYWRpZ20KK2NoYW5nZWQgYmV0d2VlbiB2ZXJzaW9ucy4KKworCisqIExvZ2ljYWwgT2JqZWN0IExheW91dAorCitUaGUgb2JqZWN0cyBhcmUgc3BsaXQgaW50byB0aGUgZ2VuZXJpYyBwYXJ0IChlc3NlbnRpYWxseSB0aGUgZmllbGRzIGZvcgorTWFpbikgYW5kIGEgcHJpdmF0ZSBwYXJ0LiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgb2JqZWN0cworY2FuIGJlIGNyZWF0ZWQgd2l0aCBDb0NyZWF0ZUluc3RhbmNlLCB0aGVuIEluaXRpYWxpemVkIGxhdGVyLiBPbmx5CithdCBpbml0aWFsaXNhdGlvbiB0aW1lIGRvIHdlIGtub3cgd2hpY2ggY2xhc3MgdG8gdXNlLiBFYWNoIGNsYXNzCitleGNlcHQgTWFpbiBkZWNsYXJlcyBhIFBhcnQgc3RydWN0dXJlIGFuZCBhZGRzIHRoYXQgdG8gaXRzIEltcGwuCisKK0ZvciBleGFtcGxlLCB0aGUgRElCVGV4dHVyZSBEaXJlY3REcmF3U3VyZmFjZSBpbXBsZW1lbnRhdGlvbiBsb29rcworbGlrZSB0aGlzOgorCitzdHJ1Y3QgRElCVGV4dHVyZV9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydAoreworICAgICAgICB1bmlvbiBESUJUZXh0dXJlX2RhdGEgZGF0YTsgLypkZWNsYXJlZCBpbiB0aGUgcmVhbCBoZWFkZXIqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAgICAgc3RydWN0IERJQl9EaXJlY3REcmF3U3VyZmFjZUltcGxfUGFydCBkaWI7CisgICAgICAgIHN0cnVjdCBESUJUZXh0dXJlX0RpcmVjdERyYXdTdXJmYWNlSW1wbF9QYXJ0IGRpYnRleHR1cmU7Cit9IERJQlRleHR1cmVfRGlyZWN0RHJhd1N1cmZhY2VJbXBsOworCitTbyB0aGUgRElCVGV4dHVyZSBzdXJmYWNlIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSB0aGUgRElCIHN1cmZhY2UKK2NsYXNzIGFuZCBpdCBhZGRzIG9uZSBwaWVjZSBvZiBkYXRhLCBhIHVuaW9uLgorCitNYWluIGRvZXMgbm90IGhhdmUgYSBQYXJ0IHN0cnVjdHVyZS4gSXRzIGZpZWxkcyBhcmUgc3RvcmVkIGluCitJRGlyZWN0RHJhd0ltcGwvSURpcmVjdERyYXdTdXJmYWNlSW1wbC4KKworVG8gYWNjZXNzIHByaXZhdGUgZGF0YSwgb25lIHNheXMKKworRElCVGV4dHVyZV9EaXJlY3REcmF3U3VyZmFjZUltcGwqIHByaXYgPSBUaGlzLT5wcml2YXRlOworZG9fc29tZXRoaW5nX3dpdGgocHJpdi0+ZGlidGV4dHVyZS5kYXRhKTsKKworCisqIENyZWF0aW5nIE9iamVjdHMKKworQ2xhc3NlcyBoYXZlIHR3byBmdW5jdGlvbnMgcmVsZXZhbnQgdG8gb2JqZWN0IGNyZWF0aW9uLCBDcmVhdGUgYW5kCitDb25zdHJ1Y3QuIFRvIGNyZWF0ZSBhIG5ldyBvYmplY3QsIHRoZSBjbGFzcycgQ3JlYXRlIGZ1bmN0aW9uIGlzCitjYWxsZWQuIEl0IGFsbG9jYXRlcyBlbm91Z2ggbWVtb3J5IGZvciBJRGlyZWN0RHJhd0ltcGwgb3IKK0lEaXJlY3REcmF3U3VyZmFjZUltcGwgYXMgd2VsbCBhcyB0aGUgcHJpdmF0ZSBkYXRhIGZvciBkZXJpdmVkCitjbGFzc2VzIGFuZCB0aGVuIGNhbGxzIENvbnN0cnVjdC4KKworRWFjaCBjbGFzcydzIENvbnN0cnVjdCBmdW5jdGlvbiBjYWxscyB0aGUgYmFzZSBjbGFzcydzIENvbnN0cnVjdCwKK3RoZW4gZG9lcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgorCitGb3IgZXhhbXBsZSwgY3JlYXRpbmcgYSBwcmltYXJ5IHN1cmZhY2Ugd2l0aCB0aGUgdXNlciBkZHJhdyBkcml2ZXIKK2NhbGxzIFVzZXJfRGlyZWN0RHJhd1N1cmZhY2VfQ3JlYXRlIHdoaWNoIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoZQorb2JqZWN0IGFuZCBjYWxscyBVc2VyX0RpcmVjdERyYXdTdXJmYWNlX0NvbnN0cnVjdCB0byBpbml0aWFsaXplIGl0LgorVGhpcyBjYWxscyBESUJfRGlyZWN0RHJhd1N1cmZhY2VfQ29uc3RydWN0IHdoaWNoIGNhbGxzCitNYWluX0RpcmVjdERyYXdTdXJmYWNlX0NvbnN0cnVjdC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNjb25maWcuaCBiL2luY2x1ZGUvYWNjb25maWcuaAppbmRleCA4ZGM3NThmLi45MWIzZDU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjY29uZmlnLmgKKysrIGIvaW5jbHVkZS9hY2NvbmZpZy5oCkBAIC0xMjksNSArMTI5LDggQEAKIC8qIERlZmluZSBpZiB0aGUgWCBsaWJyYXJpZXMgc3VwcG9ydCBYVmlkZW8gKi8KICN1bmRlZiBIQVZFX1hWSURFTwogCisvKiBEZWZpbmUgaWYgTWVzYSdzIE9TTWVzYSAob2ZmLXNjcmVlbiByZW5kZXJpbmcpIGxpYnJhcnkgaXMgcHJlc2VudCAqLworI3VuZGVmIEhBVkVfT1NNRVNBCisKIC8qIERlZmluZSBpZiBMaW51eC1zdHlsZSBnZXRob3N0YnluYW1lX3IgYW5kIGdldGhvc3RieWFkZHJfciBhcmUgYXZhaWxhYmxlICovCiAjdW5kZWYgSEFWRV9MSU5VWF9HRVRIT1NUQllOQU1FX1JfNgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWcuaC5pbiBiL2luY2x1ZGUvY29uZmlnLmguaW4KaW5kZXggZTE4MzlkZi4uMjdjMmRmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWcuaC5pbgorKysgYi9pbmNsdWRlL2NvbmZpZy5oLmluCkBAIC0xNjQsNiArMTY0LDkgQEAKIC8qIERlZmluZSBpZiB0aGUgWCBsaWJyYXJpZXMgc3VwcG9ydCBYVmlkZW8gKi8KICN1bmRlZiBIQVZFX1hWSURFTwogCisvKiBEZWZpbmUgaWYgTWVzYSdzIE9TTWVzYSAob2ZmLXNjcmVlbiByZW5kZXJpbmcpIGxpYnJhcnkgaXMgcHJlc2VudCAqLworI3VuZGVmIEhBVkVfT1NNRVNBCisKIC8qIERlZmluZSBpZiBMaW51eC1zdHlsZSBnZXRob3N0YnluYW1lX3IgYW5kIGdldGhvc3RieWFkZHJfciBhcmUgYXZhaWxhYmxlICovCiAjdW5kZWYgSEFWRV9MSU5VWF9HRVRIT1NUQllOQU1FX1JfNgogCkBAIC0yOTAsNiArMjkzLDkgQEAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPEdML2dseC5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9HTF9HTFhfSAogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxHTC9vc21lc2EuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfR0xfT1NNRVNBX0gKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8WDExL1hLQmxpYi5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9YMTFfWEtCTElCX0gKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZHJhdy5oIGIvaW5jbHVkZS9kZHJhdy5oCmluZGV4IGRiYTVhMzEuLmQ3MTI2MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGRyYXcuaAorKysgYi9pbmNsdWRlL2RkcmF3LmgKQEAgLTMsMTQgKzMsMTQgQEAKIAogI2luY2x1ZGUgIndpbmRlZi5oIiAvKiBMQVJHRV9JTlRFR0VSIC4uLiAqLwogI2luY2x1ZGUgIndpbmdkaS5oIiAvKiBQQUxFVFRFIHN0dWZmIC4uLiAqLwotI2luY2x1ZGUgIndpbmUvb2JqX2Jhc2UuaCIKKyNpbmNsdWRlICJvYmpiYXNlLmgiCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYgLyogZGVmaW5lZChfX2NwbHVzcGx1cykgKi8KIAogI2lmbmRlZglESVJFQ1REUkFXX1ZFUlNJT04KLSNkZWZpbmUJRElSRUNURFJBV19WRVJTSU9OCTB4MDUwMAorI2RlZmluZQlESVJFQ1REUkFXX1ZFUlNJT04JMHgwNzAwCiAjZW5kaWYgLyogRElSRUNURFJBV19WRVJTSU9OICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjI1LDYgKzIyNSwxNCBAQAogI2RlZmluZSBEREdCU19DQU5CTFQJCQkJMHgwMDAwMDAwMQogI2RlZmluZSBEREdCU19JU0JMVERPTkUJCQkJMHgwMDAwMDAwMgogCisvKiBkd0ZsYWdzIGZvciBJRGlyZWN0RHJhd1N1cmZhY2U3OjpHZXRGbGlwU3RhdHVzICovCisjZGVmaW5lIERER0ZTX0NBTkZMSVAJCTFMCisjZGVmaW5lIERER0ZTX0lTRkxJUERPTkUJMkwKKworLyogZHdGbGFncyBmb3IgSURpcmVjdERyYXdTdXJmYWNlNzo6U2V0UHJpdmF0ZURhdGEgKi8KKyNkZWZpbmUgRERTUERfSVVOS05PV05QVFIJMUwKKyNkZWZpbmUgRERTUERfVk9MQVRJTEUJCTJMCisKIC8qIEREU0NBUFMuZHdDYXBzICovCiAvKiByZXNlcnZlZDEsIHdhcyAzZCBjYXBhYmxlICovCiAjZGVmaW5lIEREU0NBUFNfUkVTRVJWRUQxCQkweDAwMDAwMDAxCkBAIC03MDMsMjUgKzcxMSwzNSBAQAogCURXT1JECWR3WVVWQml0Q291bnQ7ICAgICAgICAgIC8qIEM6IGhvdyBtYW55IGJpdHMgcGVyIHBpeGVsICovCiAJRFdPUkQJZHdaQnVmZmVyQml0RGVwdGg7ICAgICAgLyogQzogaG93IG1hbnkgYml0cyBmb3IgeiBidWZmZXJzICovCiAJRFdPUkQJZHdBbHBoYUJpdERlcHRoOyAgICAgICAgLyogQzogaG93IG1hbnkgYml0cyBmb3IgYWxwaGEgY2hhbm5lbHMqLwotICAgIH0gRFVNTVlVTklPTk5BTUU7CisJRFdPUkQJZHdMdW1pbmFuY2VCaXRDb3VudDsKKwlEV09SRAlkd0J1bXBCaXRDb3VudDsKKyAgICB9IERVTU1ZVU5JT05OQU1FMTsKICAgICB1bmlvbiB7CiAJRFdPUkQJZHdSQml0TWFzazsgICAgICAgICAgICAgLyogMTA6IG1hc2sgZm9yIHJlZCBiaXQqLwogCURXT1JECWR3WUJpdE1hc2s7ICAgICAgICAgICAgIC8qIDEwOiBtYXNrIGZvciBZIGJpdHMqLwotICAgIH0gRFVNTVlVTklPTk5BTUUxOworCURXT1JECWR3U3RlbmNpbEJpdERlcHRoOworCURXT1JECWR3THVtaW5hbmNlQml0TWFzazsKKwlEV09SRAlkd0J1bXBEdUJpdE1hc2s7CisgICAgfSBEVU1NWVVOSU9OTkFNRTI7CiAgICAgdW5pb24gewogCURXT1JECWR3R0JpdE1hc2s7ICAgICAgICAgICAgIC8qIDE0OiBtYXNrIGZvciBncmVlbiBiaXRzKi8KIAlEV09SRAlkd1VCaXRNYXNrOyAgICAgICAgICAgICAvKiAxNDogbWFzayBmb3IgVSBiaXRzKi8KLSAgICB9IERVTU1ZVU5JT05OQU1FMjsKKwlEV09SRAlkd1pCaXRNYXNrOworCURXT1JECWR3QnVtcER2Qml0TWFzazsKKyAgICB9IERVTU1ZVU5JT05OQU1FMzsKICAgICB1bmlvbiB7CiAJRFdPUkQgICBkd0JCaXRNYXNrOyAgICAgICAgICAgICAvKiAxODogbWFzayBmb3IgYmx1ZSBiaXRzKi8KIAlEV09SRCAgIGR3VkJpdE1hc2s7ICAgICAgICAgICAgIC8qIDE4OiBtYXNrIGZvciBWIGJpdHMqLwotICAgIH0gRFVNTVlVTklPTk5BTUUzOworCURXT1JECWR3U3RlbmNpbEJpdE1hc2s7CisJRFdPUkQJZHdCdW1wTHVtaW5hbmNlQml0TWFzazsKKyAgICB9IERVTU1ZVU5JT05OQU1FNDsKICAgICB1bmlvbiB7CiAgICAgCURXT1JECWR3UkdCQWxwaGFCaXRNYXNrOwkvKiAxQzogbWFzayBmb3IgYWxwaGEgY2hhbm5lbCAqLwogICAgIAlEV09SRAlkd1lVVkFscGhhQml0TWFzazsJLyogMUM6IG1hc2sgZm9yIGFscGhhIGNoYW5uZWwgKi8KKwlEV09SRAlkd0x1bWluYW5jZUFscGhhQml0TWFzazsKIAlEV09SRAlkd1JHQlpCaXRNYXNrOwkJLyogMUM6IG1hc2sgZm9yIFogY2hhbm5lbCAqLwogCURXT1JECWR3WVVWWkJpdE1hc2s7CQkvKiAxQzogbWFzayBmb3IgWiBjaGFubmVsICovCi0gICAgfSBEVU1NWVVOSU9OTkFNRTQ7CisgICAgfSBEVU1NWVVOSU9OTkFNRTU7CiAgICAgCQkJCQkvKiAyMDogbmV4dCBzdHJ1Y3R1cmUgKi8KIH0gRERQSVhFTEZPUk1BVCwqTFBERFBJWEVMRk9STUFUOwogCkBAIC05MjAsMTkgKzkzOCwxOSBAQAogCURXT1JECWR3RmxhZ3M7CS8qIDQ6IGRldGVybWluZXMgd2hhdCBmaWVsZHMgYXJlIHZhbGlkKi8KIAlEV09SRAlkd0hlaWdodDsJLyogODogaGVpZ2h0IG9mIHN1cmZhY2UgdG8gYmUgY3JlYXRlZCovCiAJRFdPUkQJZHdXaWR0aDsJLyogQzogd2lkdGggb2YgaW5wdXQgc3VyZmFjZSovCi0JTE9ORwlsUGl0Y2g7CQkvKjEwOiBkaXN0YW5jZSB0byBzdGFydCBvZiBuZXh0IGxpbmUgKHJldHVybiB2YWx1ZSBvbmx5KSovCisJdW5pb24geworCQlMT05HCWxQaXRjaDsJLyogMTA6IGRpc3RhbmNlIHRvIHN0YXJ0IG9mIG5leHQgbGluZSAocmV0dXJuIHZhbHVlIG9ubHkpKi8KKwkJRFdPUkQJZHdMaW5lYXJTaXplOworCX0gRFVNTVlVTklPTk5BTUUxOwogCURXT1JECWR3QmFja0J1ZmZlckNvdW50Oy8qIDE0OiBudW1iZXIgb2YgYmFjayBidWZmZXJzIHJlcXVlc3RlZCovCiAJdW5pb24gewogCQlEV09SRAlkd01pcE1hcENvdW50Oy8qIDE4Om51bWJlciBvZiBtaXAtbWFwIGxldmVscyByZXF1ZXN0ZWQqLwogCQlEV09SRAlkd1pCdWZmZXJCaXREZXB0aDsvKjE4OiBkZXB0aCBvZiBaIGJ1ZmZlciByZXF1ZXN0ZWQqLwogCQlEV09SRAlkd1JlZnJlc2hSYXRlOy8qIDE4OnJlZnJlc2ggcmF0ZSAodXNlZCB3aGVuIGRpc3BsYXkgbW9kZSBpcyBkZXNjcmliZWQpKi8KLQl9IERVTU1ZVU5JT05OQU1FOwkJCisJfSBEVU1NWVVOSU9OTkFNRTI7CQkKIAlEV09SRAlkd0FscGhhQml0RGVwdGg7LyogMUM6ZGVwdGggb2YgYWxwaGEgYnVmZmVyIHJlcXVlc3RlZCovCiAJRFdPUkQJZHdSZXNlcnZlZDsJLyogMjA6cmVzZXJ2ZWQqLwotCXVuaW9uIHsKLQkJTFBWT0lECWxwU3VyZmFjZTsJLyogMjQ6cG9pbnRlciB0byB0aGUgYXNzb2NpYXRlZCBzdXJmYWNlIG1lbW9yeSovCi0JCURXT1JECWR3TGluZWFyU2l6ZTsJLyogMjQ6Rm9ybWxlc3MgbGF0ZS1hbGxvY2F0ZWQgb3B0aW1pemVkIHN1cmZhY2Ugc2l6ZSovCi0JfSBEVU1NWVVOSU9OTkFNRTE7CisJTFBWT0lECWxwU3VyZmFjZTsJLyogMjQ6cG9pbnRlciB0byB0aGUgYXNzb2NpYXRlZCBzdXJmYWNlIG1lbW9yeSovCiAJRERDT0xPUktFWQlkZGNrQ0tEZXN0T3ZlcmxheTsvKiAyODogQ0sgZm9yIGRlc3Qgb3ZlcmxheSB1c2UqLwogCUREQ09MT1JLRVkJZGRja0NLRGVzdEJsdDsJLyogMzA6IENLIGZvciBkZXN0aW5hdGlvbiBibHQgdXNlKi8KIAlERENPTE9SS0VZCWRkY2tDS1NyY092ZXJsYXk7LyogMzg6IENLIGZvciBzb3VyY2Ugb3ZlcmxheSB1c2UqLwpAQCAtOTUwLDEzICs5NjgsMTMgQEAKIAl1bmlvbiB7CiAJCUxPTkcJbFBpdGNoOwkgICAgICAvKjEwOiBkaXN0YW5jZSB0byBzdGFydCBvZiBuZXh0IGxpbmUgKHJldHVybiB2YWx1ZSBvbmx5KSovCiAJCURXT1JEICAgZHdMaW5lYXJTaXplOyAvKjEwOiBmb3JtbGVzcyBsYXRlLWFsbG9jYXRlZCBvcHRpbWl6ZWQgc3VyZmFjZSBzaXplICovCi0JfSBEVU1NWVVOSU9OTkFNRTsKKwl9IERVTU1ZVU5JT05OQU1FMTsKIAlEV09SRAlkd0JhY2tCdWZmZXJDb3VudDsvKiAxNDogbnVtYmVyIG9mIGJhY2sgYnVmZmVycyByZXF1ZXN0ZWQqLwogCXVuaW9uIHsKIAkJRFdPUkQJZHdNaXBNYXBDb3VudDsvKiAxODpudW1iZXIgb2YgbWlwLW1hcCBsZXZlbHMgcmVxdWVzdGVkKi8KIAkJRFdPUkQJZHdSZWZyZXNoUmF0ZTsvKiAxODpyZWZyZXNoIHJhdGUgKHVzZWQgd2hlbiBkaXNwbGF5IG1vZGUgaXMgZGVzY3JpYmVkKSovCiAJCURXT1JEICAgZHdTcmNWQkhhbmRsZTsvKiAxODpzb3VyY2UgdXNlZCBpbiBWQjo6T3B0aW1pemUgKi8KLQl9IERVTU1ZVU5JT05OQU1FMjsJCQorCX0gRFVNTVlVTklPTk5BTUUyOwogCURXT1JECWR3QWxwaGFCaXREZXB0aDsvKiAxQzpkZXB0aCBvZiBhbHBoYSBidWZmZXIgcmVxdWVzdGVkKi8KIAlEV09SRAlkd1Jlc2VydmVkOwkvKiAyMDpyZXNlcnZlZCovCiAJTFBWT0lECWxwU3VyZmFjZTsJLyogMjQ6cG9pbnRlciB0byB0aGUgYXNzb2NpYXRlZCBzdXJmYWNlIG1lbW9yeSovCkBAIC05NjQsMTYgKzk4MiwxNiBAQAogCQlERENPTE9SS0VZCWRkY2tDS0Rlc3RPdmVybGF5OyAvKiAyODogQ0sgZm9yIGRlc3Qgb3ZlcmxheSB1c2UqLwogCQlEV09SRCAJCWR3RW1wdHlGYWNlQ29sb3I7ICAvKiAyODogY29sb3IgZm9yIGVtcHR5IGN1YmVtYXAgZmFjZXMgKi8KIAl9IERVTU1ZVU5JT05OQU1FMzsKLQlERENPTE9SS0VZCWRkY2tDS0Rlc3RCbHQ7CS8qIDJDOiBDSyBmb3IgZGVzdGluYXRpb24gYmx0IHVzZSovCi0JRERDT0xPUktFWQlkZGNrQ0tTcmNPdmVybGF5Oy8qIDMwOiBDSyBmb3Igc291cmNlIG92ZXJsYXkgdXNlKi8KLQlERENPTE9SS0VZCWRkY2tDS1NyY0JsdDsJLyogMzQ6IENLIGZvciBzb3VyY2UgYmx0IHVzZSovCisJRERDT0xPUktFWQlkZGNrQ0tEZXN0Qmx0OwkvKiAzMDogQ0sgZm9yIGRlc3RpbmF0aW9uIGJsdCB1c2UqLworCUREQ09MT1JLRVkJZGRja0NLU3JjT3ZlcmxheTsvKiAzODogQ0sgZm9yIHNvdXJjZSBvdmVybGF5IHVzZSovCisJRERDT0xPUktFWQlkZGNrQ0tTcmNCbHQ7CS8qIDQwOiBDSyBmb3Igc291cmNlIGJsdCB1c2UqLwogCiAJdW5pb24gewotCQlERFBJWEVMRk9STUFUCWRkcGZQaXhlbEZvcm1hdDsvKiAzODogcGl4ZWwgZm9ybWF0IGRlc2NyaXB0aW9uIG9mIHRoZSBzdXJmYWNlKi8KLQkJRFdPUkQgCQlkd0ZWRjsJLyogMzg6IHZlcnRleCBmb3JtYXQgZGVzY3JpcHRpb24gb2YgdmVydGV4IGJ1ZmZlcnMgKi8JCisJCUREUElYRUxGT1JNQVQJZGRwZlBpeGVsRm9ybWF0Oy8qIDQ4OiBwaXhlbCBmb3JtYXQgZGVzY3JpcHRpb24gb2YgdGhlIHN1cmZhY2UqLworCQlEV09SRCAJCWR3RlZGOwkvKiA0ODogdmVydGV4IGZvcm1hdCBkZXNjcmlwdGlvbiBvZiB2ZXJ0ZXggYnVmZmVycyAqLwkKIAl9IERVTU1ZVU5JT05OQU1FNDsKLQlERFNDQVBTMglkZHNDYXBzOyAgLyogM0M6IEREcmF3IHN1cmZhY2UgY2FwcyAqLwotCURXT1JECQlkd1RleHR1cmVTdGFnZTsgLyogNDA6IHN0YWdlIGluIG11bHRpdGV4dHVyZSBjYXNjYWRlICovCisJRERTQ0FQUzIJZGRzQ2FwczsgIC8qIDY4OiBERHJhdyBzdXJmYWNlIGNhcHMgKi8KKwlEV09SRAkJZHdUZXh0dXJlU3RhZ2U7IC8qIDc4OiBzdGFnZSBpbiBtdWx0aXRleHR1cmUgY2FzY2FkZSAqLwogfSBERFNVUkZBQ0VERVNDMiwqTFBERFNVUkZBQ0VERVNDMjsKIAogLyogRERDT0xPUkNPTlRST0wuZHdGbGFncyAqLwpAQCAtMTAwMyw4ICsxMDIxLDkgQEAKIERFQ0xfV0lORUxJQl9UWVBFX0FXKExQRERFTlVNQ0FMTEJBQ0spCiAKIHR5cGVkZWYgSFJFU1VMVCBDQUxMQkFDSyAoKkxQRERFTlVNTU9ERVNDQUxMQkFDSykoTFBERFNVUkZBQ0VERVNDLCBMUFZPSUQpOwotdHlwZWRlZiBIUkVTVUxUIENBTExCQUNLICgqTFBEREVOVU1NT0RFU0NBTExCQUNLNykoTFBERFNVUkZBQ0VERVNDMiwgTFBWT0lEKTsKK3R5cGVkZWYgSFJFU1VMVCBDQUxMQkFDSyAoKkxQRERFTlVNTU9ERVNDQUxMQkFDSzIpKExQRERTVVJGQUNFREVTQzIsIExQVk9JRCk7CiB0eXBlZGVmIEhSRVNVTFQgQ0FMTEJBQ0sgKCpMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0spKExQRElSRUNURFJBV1NVUkZBQ0UsIExQRERTVVJGQUNFREVTQywgTFBWT0lEKTsKK3R5cGVkZWYgSFJFU1VMVCBDQUxMQkFDSyAoKkxQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzIpKExQRElSRUNURFJBV1NVUkZBQ0U0LCBMUEREU1VSRkFDRURFU0MyLCBMUFZPSUQpOwogdHlwZWRlZiBIUkVTVUxUIENBTExCQUNLICgqTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLNykoTFBESVJFQ1REUkFXU1VSRkFDRTcsIExQRERTVVJGQUNFREVTQzIsIExQVk9JRCk7CiAKIHR5cGVkZWYgQk9PTCBDQUxMQkFDSyAoKkxQRERFTlVNQ0FMTEJBQ0tFWEEpKEdVSUQgKiwgTFBTVFIsIExQU1RSLCBMUFZPSUQsIEhNT05JVE9SKTsKQEAgLTEwMjAsNiArMTAzOSwxMCBAQAogI2RlZmluZSBEREVOVU1fREVUQUNIRURTRUNPTkRBUllERVZJQ0VTCTB4MDAwMDAwMDIKICNkZWZpbmUgRERFTlVNX05PTkRJU1BMQVlERVZJQ0VTCTB4MDAwMDAwMDQKIAorLyogZmxhZ3MgZm9yIERpcmVjdERyYXdDcmVhdGUgb3IgSURpcmVjdERyYXc6OkluaXRpYWxpemUgKi8KKyNkZWZpbmUgRERDUkVBVEVfSEFSRFdBUkVPTkxZCTFMCisjZGVmaW5lIEREQ1JFQVRFX0VNVUxBVElPTk9OTFkJMkwKKwogdHlwZWRlZiBzdHJ1Y3QgX0REQkxURlgKIHsKICAgICBEV09SRCAgICAgICBkd1NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc3RydWN0dXJlICovCkBAIC0xMDM2LDEzICsxMDU5LDEzIEBACiAgICAgewogICAgICAgICBEV09SRCAgIGR3WkRlc3RDb25zdDsgICAgICAgICAgICAgICAgICAgLyogQ29uc3RhbnQgdG8gdXNlIGFzIFogYnVmZmVyIGZvciBkZXN0ICovCiAgICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0UgbHBERFNaQnVmZmVyRGVzdDsgICAvKiBTdXJmYWNlIHRvIHVzZSBhcyBaIGJ1ZmZlciBmb3IgZGVzdCAqLwotICAgIH0gRFVNTVlVTklPTk5BTUU7CisgICAgfSBEVU1NWVVOSU9OTkFNRTE7CiAgICAgRFdPUkQgICAgICAgZHdaU3JjQ29uc3RCaXREZXB0aDsgICAgICAgICAgICAvKiBCaXQgZGVwdGggdXNlZCB0byBzcGVjaWZ5IFogY29uc3RhbnQgZm9yIHNvdXJjZSAqLwogICAgIHVuaW9uCiAgICAgewogICAgICAgICBEV09SRCAgIGR3WlNyY0NvbnN0OyAgICAgICAgICAgICAgICAgICAgLyogQ29uc3RhbnQgdG8gdXNlIGFzIFogYnVmZmVyIGZvciBzcmMgKi8KICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSBscEREU1pCdWZmZXJTcmM7ICAgIC8qIFN1cmZhY2UgdG8gdXNlIGFzIFogYnVmZmVyIGZvciBzcmMgKi8KLSAgICB9IERVTU1ZVU5JT05OQU1FMTsKKyAgICB9IERVTU1ZVU5JT05OQU1FMjsKICAgICBEV09SRCAgICAgICBkd0FscGhhRWRnZUJsZW5kQml0RGVwdGg7ICAgICAgIC8qIEJpdCBkZXB0aCB1c2VkIHRvIHNwZWNpZnkgY29uc3RhbnQgZm9yIGFscGhhIGVkZ2UgYmxlbmQgKi8KICAgICBEV09SRCAgICAgICBkd0FscGhhRWRnZUJsZW5kOyAgICAgICAgICAgICAgIC8qIEFscGhhIGZvciBlZGdlIGJsZW5kaW5nICovCiAgICAgRFdPUkQgICAgICAgZHdSZXNlcnZlZDsKQEAgLTEwNTEsMjAgKzEwNzQsMjAgQEAKICAgICB7CiAgICAgICAgIERXT1JEICAgZHdBbHBoYURlc3RDb25zdDsgICAgICAgICAgICAgICAvKiBDb25zdGFudCB0byB1c2UgYXMgQWxwaGEgQ2hhbm5lbCAqLwogICAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFIGxwRERTQWxwaGFEZXN0OyAgICAgLyogU3VyZmFjZSB0byB1c2UgYXMgQWxwaGEgQ2hhbm5lbCAqLwotICAgIH0gRFVNTVlVTklPTk5BTUUyOworICAgIH0gRFVNTVlVTklPTk5BTUUzOwogICAgIERXT1JEICAgICAgIGR3QWxwaGFTcmNDb25zdEJpdERlcHRoOyAgICAgICAgLyogQml0IGRlcHRoIHVzZWQgdG8gc3BlY2lmeSBhbHBoYSBjb25zdGFudCBmb3Igc291cmNlICovCiAgICAgdW5pb24KICAgICB7CiAgICAgICAgIERXT1JEICAgZHdBbHBoYVNyY0NvbnN0OyAgICAgICAgICAgICAgICAvKiBDb25zdGFudCB0byB1c2UgYXMgQWxwaGEgQ2hhbm5lbCAqLwogICAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFIGxwRERTQWxwaGFTcmM7ICAgICAgLyogU3VyZmFjZSB0byB1c2UgYXMgQWxwaGEgQ2hhbm5lbCAqLwotICAgIH0gRFVNTVlVTklPTk5BTUUzOworICAgIH0gRFVNTVlVTklPTk5BTUU0OwogICAgIHVuaW9uCiAgICAgewogICAgICAgICBEV09SRCAgIGR3RmlsbENvbG9yOyAgICAgICAgICAgICAgICAgICAgLyogY29sb3IgaW4gUkdCIG9yIFBhbGV0dGl6ZWQgKi8KICAgICAgICAgRFdPUkQgICBkd0ZpbGxEZXB0aDsgICAgICAgICAgICAgICAgICAgIC8qIGRlcHRoIHZhbHVlIGZvciB6LWJ1ZmZlciAqLwogCURXT1JEICAgZHdGaWxsUGl4ZWw7CQkJLyogcGl4ZWwgdmFsIGZvciBSR0JBIG9yIFJHQlogKi8KICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSBscEREU1BhdHRlcm47ICAgICAgIC8qIFN1cmZhY2UgdG8gdXNlIGFzIHBhdHRlcm4gKi8KLSAgICB9IERVTU1ZVU5JT05OQU1FNDsKKyAgICB9IERVTU1ZVU5JT05OQU1FNTsKICAgICBERENPTE9SS0VZICBkZGNrRGVzdENvbG9ya2V5OyAgICAgICAgICAgICAgIC8qIERlc3RDb2xvcmtleSBvdmVycmlkZSAqLwogICAgIEREQ09MT1JLRVkgIGRkY2tTcmNDb2xvcmtleTsgICAgICAgICAgICAgICAgLyogU3JjQ29sb3JrZXkgb3ZlcnJpZGUgKi8KIH0gRERCTFRGWCwqTFBEREJMVEZYOwpAQCAtMTEwMCwxMyArMTEyMywxMyBAQAogICAgIHsKICAgICAgICAgRFdPUkQgICBkd0FscGhhRGVzdENvbnN0OyAgICAgICAgICAgICAgIC8qIENvbnN0YW50IHRvIHVzZSBhcyBhbHBoYSBjaGFubmVsIGZvciBkZXN0ICovCiAgICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0UgbHBERFNBbHBoYURlc3Q7ICAgICAvKiBTdXJmYWNlIHRvIHVzZSBhcyBhbHBoYSBjaGFubmVsIGZvciBkZXN0ICovCi0gICAgfSBEVU1NWVVOSU9OTkFNRTsKKyAgICB9IERVTU1ZVU5JT05OQU1FMTsKICAgICBEV09SRCAgICAgICBkd0FscGhhU3JjQ29uc3RCaXREZXB0aDsgICAgICAgIC8qIEJpdCBkZXB0aCB1c2VkIHRvIHNwZWNpZnkgYWxwaGEgY29uc3RhbnQgZm9yIHNvdXJjZSAqLwogICAgIHVuaW9uCiAgICAgewogICAgICAgICBEV09SRCAgIGR3QWxwaGFTcmNDb25zdDsgICAgICAgICAgICAgICAgLyogQ29uc3RhbnQgdG8gdXNlIGFzIGFscGhhIGNoYW5uZWwgZm9yIHNyYyAqLwogICAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFIGxwRERTQWxwaGFTcmM7ICAgICAgLyogU3VyZmFjZSB0byB1c2UgYXMgYWxwaGEgY2hhbm5lbCBmb3Igc3JjICovCi0gICAgfSBEVU1NWVVOSU9OTkFNRTE7CisgICAgfSBEVU1NWVVOSU9OTkFNRTI7CiAgICAgRERDT0xPUktFWSAgZGNrRGVzdENvbG9ya2V5OyAgICAgICAgICAgICAgICAvKiBEZXN0Q29sb3JrZXkgb3ZlcnJpZGUgKi8KICAgICBERENPTE9SS0VZICBkY2tTcmNDb2xvcmtleTsgICAgICAgICAgICAgICAgIC8qIERlc3RDb2xvcmtleSBvdmVycmlkZSAqLwogICAgIERXT1JEICAgICAgIGR3RERGWDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3ZlcmxheSBGWCAqLwpAQCAtMTM0MCwxNCArMTM2MywzNyBAQAogICovCiAjZGVmaW5lIElDT01fSU5URVJGQUNFIElEaXJlY3REcmF3NAogI2RlZmluZSBJRGlyZWN0RHJhdzRfTUVUSE9EUyBcCi0gICAgSUNPTV9NRVRIT0QyKEhSRVNVTFQsR2V0U3VyZmFjZUZyb21EQywgICAgSERDLCwgTFBESVJFQ1REUkFXU1VSRkFDRSosKSBcCisvKjBjKi8gICAgSUNPTV9NRVRIT0QgKEhSRVNVTFQsQ29tcGFjdCkgXAorLyoxMCovICAgIElDT01fTUVUSE9EMyhIUkVTVUxULENyZWF0ZUNsaXBwZXIsICAgICAgICAgIERXT1JELGR3RmxhZ3MsIExQRElSRUNURFJBV0NMSVBQRVIqLGxwbHBERENsaXBwZXIsIElVbmtub3duKixwVW5rT3V0ZXIpIFwKKy8qMTQqLyAgICBJQ09NX01FVEhPRDQoSFJFU1VMVCxDcmVhdGVQYWxldHRlLCAgICAgICAgICBEV09SRCxkd0ZsYWdzLCBMUFBBTEVUVEVFTlRSWSxscENvbG9yVGFibGUsIExQRElSRUNURFJBV1BBTEVUVEUqLGxwbHBERFBhbGV0dGUsIElVbmtub3duKixwVW5rT3V0ZXIpIFwKKy8qMTgqLyAgICBJQ09NX01FVEhPRDMoSFJFU1VMVCxDcmVhdGVTdXJmYWNlLCAgICAgICAgICBMUEREU1VSRkFDRURFU0MyLGxwRERTdXJmYWNlRGVzYywgTFBESVJFQ1REUkFXU1VSRkFDRTQqLGxwbHBERFN1cmZhY2UsIElVbmtub3duKixwVW5rT3V0ZXIpIFwKKy8qMWMqLyAgICBJQ09NX01FVEhPRDIoSFJFU1VMVCxEdXBsaWNhdGVTdXJmYWNlLCAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNCxscEREU3VyZmFjZSwgTFBESVJFQ1REUkFXU1VSRkFDRTQqLGxwbHBEdXBERFN1cmZhY2UpIFwKKy8qMjAqLyAgICBJQ09NX01FVEhPRDQoSFJFU1VMVCxFbnVtRGlzcGxheU1vZGVzLCAgICAgICBEV09SRCxkd0ZsYWdzLCBMUEREU1VSRkFDRURFU0MyLGxwRERTdXJmYWNlRGVzYywgTFBWT0lELGxwQ29udGV4dCwgTFBEREVOVU1NT0RFU0NBTExCQUNLMixscEVudW1Nb2Rlc0NhbGxiYWNrKSBcCisvKjI0Ki8gICAgSUNPTV9NRVRIT0Q0KEhSRVNVTFQsRW51bVN1cmZhY2VzLCAgICAgICAgICAgRFdPUkQsZHdGbGFncywgTFBERFNVUkZBQ0VERVNDMixscEREU0QsIExQVk9JRCxscENvbnRleHQsIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzIsbHBFbnVtU3VyZmFjZXNDYWxsYmFjaykgXAorLyoyOCovICAgIElDT01fTUVUSE9EIChIUkVTVUxULEZsaXBUb0dESVN1cmZhY2UpIFwKKy8qMmMqLyAgICBJQ09NX01FVEhPRDIoSFJFU1VMVCxHZXRDYXBzLCAgICAgICAgICAgICAgICBMUEREQ0FQUyxscERERHJpdmVyQ2FwcywgTFBERENBUFMsbHBEREhFTENhcHMpIFwKKy8qMzAqLyAgICBJQ09NX01FVEhPRDEoSFJFU1VMVCxHZXREaXNwbGF5TW9kZSwgICAgICAgICBMUEREU1VSRkFDRURFU0MyLGxwRERTdXJmYWNlRGVzYykgXAorLyozNCovICAgIElDT01fTUVUSE9EMihIUkVTVUxULEdldEZvdXJDQ0NvZGVzLCAgICAgICAgIExQRFdPUkQsbHBOdW1Db2RlcywgTFBEV09SRCxscENvZGVzKSBcCisvKjM4Ki8gICAgSUNPTV9NRVRIT0QxKEhSRVNVTFQsR2V0R0RJU3VyZmFjZSwgICAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTQqLGxwbHBHRElERFN1cmZhY2UpIFwKKy8qM2MqLyAgICBJQ09NX01FVEhPRDEoSFJFU1VMVCxHZXRNb25pdG9yRnJlcXVlbmN5LCAgICBMUERXT1JELGxwZHdGcmVxdWVuY3kpIFwKKy8qNDAqLyAgICBJQ09NX01FVEhPRDEoSFJFU1VMVCxHZXRTY2FuTGluZSwgICAgICAgICAgICBMUERXT1JELGxwZHdTY2FuTGluZSkgXAorLyo0NCovICAgIElDT01fTUVUSE9EMShIUkVTVUxULEdldFZlcnRpY2FsQmxhbmtTdGF0dXMsIEJPT0wqLGxwYklzSW5WQikgXAorLyo0OCovICAgIElDT01fTUVUSE9EMShIUkVTVUxULEluaXRpYWxpemUsICAgICAgICAgICAgIEdVSUQqLGxwR1VJRCkgXAorLyo0YyovICAgIElDT01fTUVUSE9EIChIUkVTVUxULFJlc3RvcmVEaXNwbGF5TW9kZSkgXAorLyo1MCovICAgIElDT01fTUVUSE9EMihIUkVTVUxULFNldENvb3BlcmF0aXZlTGV2ZWwsICAgIEhXTkQsaFduZCwgRFdPUkQsZHdGbGFncykgXAorLyo1NCovICAgIElDT01fTUVUSE9ENShIUkVTVUxULFNldERpc3BsYXlNb2RlLCAgICAgICAgIERXT1JELGR3V2lkdGgsIERXT1JELGR3SGVpZ2h0LCBEV09SRCxkd0JQUCwgRFdPUkQsZHdSZWZyZXNoUmF0ZSwgRFdPUkQsZHdGbGFncykgXAorLyo1OCovICAgIElDT01fTUVUSE9EMihIUkVTVUxULFdhaXRGb3JWZXJ0aWNhbEJsYW5rLCAgIERXT1JELGR3RmxhZ3MsIEhBTkRMRSxoRXZlbnQpIFwKKyAgICAgICAgICAvKiBhZGRlZCBpbiB2MiAqLyBcCisvKjVjKi8gICAgSUNPTV9NRVRIT0QzKEhSRVNVTFQsR2V0QXZhaWxhYmxlVmlkTWVtLCBMUEREU0NBUFMyLGxwRERDYXBzLCBMUERXT1JELGxwZHdUb3RhbCwgTFBEV09SRCxscGR3RnJlZSkgXAorICAgIC8qIGFkZGVkIGluIHY0ICovIFwKKyAgICBJQ09NX01FVEhPRDIoSFJFU1VMVCxHZXRTdXJmYWNlRnJvbURDLCAgICBIREMsLCBMUERJUkVDVERSQVdTVVJGQUNFNCosKSBcCiAgICAgSUNPTV9NRVRIT0QgKEhSRVNVTFQsUmVzdG9yZUFsbFN1cmZhY2VzKSBcCiAgICAgSUNPTV9NRVRIT0QgKEhSRVNVTFQsVGVzdENvb3BlcmF0aXZlTGV2ZWwpIFwKICAgICBJQ09NX01FVEhPRDIoSFJFU1VMVCxHZXREZXZpY2VJZGVudGlmaWVyLCBMUEREREVWSUNFSURFTlRJRklFUiwsIERXT1JELCkKICNkZWZpbmUgSURpcmVjdERyYXc0X0lNRVRIT0RTIFwKLSAgICBJRGlyZWN0RHJhdzJfSU1FVEhPRFMgXAorICAgIElVbmtub3duX0lNRVRIT0RTIFwKICAgICBJRGlyZWN0RHJhdzRfTUVUSE9EUwotSUNPTV9ERUZJTkUoSURpcmVjdERyYXc0LElEaXJlY3REcmF3MikKK0lDT01fREVGSU5FKElEaXJlY3REcmF3NCxJVW5rbm93bikKICN1bmRlZiBJQ09NX0lOVEVSRkFDRQogCiAgICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KQEAgLTEzNzgsNyArMTQyNCw3IEBACiAvKioqIElEaXJlY3REcmF3MiBtZXRob2RzICoqKi8KICNkZWZpbmUgSURpcmVjdERyYXc0X0dldEF2YWlsYWJsZVZpZE1lbShwLGEsYixjKSBJQ09NX0NBTEwzKEdldEF2YWlsYWJsZVZpZE1lbSxwLGEsYixjKQogLyoqKiBJRGlyZWN0RHJhdzQgbWV0aG9kcyAqKiovCi0jZGVmaW5lIElEaXJlY3REcmF3NF9HZXRTdXJmYWNlRnJvbURDKHAsYSxiKSAgICBJQ09NX0NBTEwyKEdldFN1cmZhY2VGcm9tREMscCxhLGIsYykKKyNkZWZpbmUgSURpcmVjdERyYXc0X0dldFN1cmZhY2VGcm9tREMocCxhLGIpICAgIElDT01fQ0FMTDIoR2V0U3VyZmFjZUZyb21EQyxwLGEsYikKICNkZWZpbmUgSURpcmVjdERyYXc0X1Jlc3RvcmVBbGxTdXJmYWNlcyhwYykgICAgIElDT01fQ0FMTCAoUmVzdG9yZUFsbFN1cmZhY2VzLHApCiAjZGVmaW5lIElEaXJlY3REcmF3NF9UZXN0Q29vcGVyYXRpdmVMZXZlbChwKSAgICBJQ09NX0NBTEwgKFRlc3RDb29wZXJhdGl2ZUxldmVsLHApCiAjZGVmaW5lIElEaXJlY3REcmF3NF9HZXREZXZpY2VJZGVudGlmaWVyKHAsYSxiKSBJQ09NX0NBTEwyKEdldERldmljZUlkZW50aWZpZXIscCxhLGIpCkBAIC0xMzk3LDcgKzE0NDMsNyBAQAogLyoxNCovICAgIElDT01fTUVUSE9ENChIUkVTVUxULENyZWF0ZVBhbGV0dGUsICAgICAgICAgIERXT1JELGR3RmxhZ3MsIExQUEFMRVRURUVOVFJZLGxwQ29sb3JUYWJsZSwgTFBESVJFQ1REUkFXUEFMRVRURSosbHBscEREUGFsZXR0ZSwgSVVua25vd24qLHBVbmtPdXRlcikgXAogLyoxOCovICAgIElDT01fTUVUSE9EMyhIUkVTVUxULENyZWF0ZVN1cmZhY2UsICAgICAgICAgIExQRERTVVJGQUNFREVTQzIsbHBERFN1cmZhY2VEZXNjLCBMUERJUkVDVERSQVdTVVJGQUNFNyosbHBscEREU3VyZmFjZSwgSVVua25vd24qLHBVbmtPdXRlcikgXAogLyoxYyovICAgIElDT01fTUVUSE9EMihIUkVTVUxULER1cGxpY2F0ZVN1cmZhY2UsICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0U3LGxwRERTdXJmYWNlLCBMUERJUkVDVERSQVdTVVJGQUNFNyosbHBscER1cEREU3VyZmFjZSkgXAotLyoyMCovICAgIElDT01fTUVUSE9ENChIUkVTVUxULEVudW1EaXNwbGF5TW9kZXMsICAgICAgIERXT1JELGR3RmxhZ3MsIExQRERTVVJGQUNFREVTQzIsbHBERFN1cmZhY2VEZXNjLCBMUFZPSUQsbHBDb250ZXh0LCBMUERERU5VTU1PREVTQ0FMTEJBQ0s3LGxwRW51bU1vZGVzQ2FsbGJhY2spIFwKKy8qMjAqLyAgICBJQ09NX01FVEhPRDQoSFJFU1VMVCxFbnVtRGlzcGxheU1vZGVzLCAgICAgICBEV09SRCxkd0ZsYWdzLCBMUEREU1VSRkFDRURFU0MyLGxwRERTdXJmYWNlRGVzYywgTFBWT0lELGxwQ29udGV4dCwgTFBEREVOVU1NT0RFU0NBTExCQUNLMixscEVudW1Nb2Rlc0NhbGxiYWNrKSBcCiAvKjI0Ki8gICAgSUNPTV9NRVRIT0Q0KEhSRVNVTFQsRW51bVN1cmZhY2VzLCAgICAgICAgICAgRFdPUkQsZHdGbGFncywgTFBERFNVUkZBQ0VERVNDMixscEREU0QsIExQVk9JRCxscENvbnRleHQsIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzcsbHBFbnVtU3VyZmFjZXNDYWxsYmFjaykgXAogLyoyOCovICAgIElDT01fTUVUSE9EIChIUkVTVUxULEZsaXBUb0dESVN1cmZhY2UpIFwKIC8qMmMqLyAgICBJQ09NX01FVEhPRDIoSFJFU1VMVCxHZXRDYXBzLCAgICAgICAgICAgICAgICBMUEREQ0FQUyxscERERHJpdmVyQ2FwcywgTFBERENBUFMsbHBEREhFTENhcHMpIFwKQEAgLTE0MTgsNyArMTQ2NCw3IEBACiAvKjYwKi8gICAgSUNPTV9NRVRIT0QyKEhSRVNVTFQsR2V0U3VyZmFjZUZyb21EQywgICAgSERDLCwgTFBESVJFQ1REUkFXU1VSRkFDRTcqLCkgXAogLyo2NCovICAgIElDT01fTUVUSE9EIChIUkVTVUxULFJlc3RvcmVBbGxTdXJmYWNlcykgXAogLyo2OCovICAgIElDT01fTUVUSE9EIChIUkVTVUxULFRlc3RDb29wZXJhdGl2ZUxldmVsKSBcCi0vKjZjKi8gICAgSUNPTV9NRVRIT0QyKEhSRVNVTFQsR2V0RGV2aWNlSWRlbnRpZmllciwgTFBERERFVklDRUlERU5USUZJRVIsLCBEV09SRCwpIFwKKy8qNmMqLyAgICBJQ09NX01FVEhPRDIoSFJFU1VMVCxHZXREZXZpY2VJZGVudGlmaWVyLCBMUEREREVWSUNFSURFTlRJRklFUjIsLCBEV09SRCwpIFwKICAgICAgICAgICAvKiBhZGRlZCBpbiB2NyAqLyBcCiAvKjcwKi8gICAgSUNPTV9NRVRIT0QzKEhSRVNVTFQsU3RhcnRNb2RlVGVzdCwgICAgTFBTSVpFLCwgRFdPUkQsLCBEV09SRCwpIFwKIC8qNzQqLyAgICBJQ09NX01FVEhPRDIoSFJFU1VMVCxFdmFsdWF0ZU1vZGUsICAgICBEV09SRCwsIERXT1JEICosKQpAQCAtMTQ1Niw4ICsxNTAyLDggQEAKIC8qKiogYWRkZWQgaW4gSURpcmVjdERyYXcyICoqKi8KICNkZWZpbmUgSURpcmVjdERyYXc3X0dldEF2YWlsYWJsZVZpZE1lbShwLGEsYixjKSBJQ09NX0NBTEwzKEdldEF2YWlsYWJsZVZpZE1lbSxwLGEsYixjKQogLyoqKiBhZGRlZCBpbiBJRGlyZWN0RHJhdzQgKioqLwotI2RlZmluZSBJRGlyZWN0RHJhdzdfR2V0U3VyZmFjZUZyb21EQyhwLGEsYikgICAgSUNPTV9DQUxMMihHZXRTdXJmYWNlRnJvbURDLHAsYSxiLGMpCi0jZGVmaW5lIElEaXJlY3REcmF3N19SZXN0b3JlQWxsU3VyZmFjZXMocGMpICAgICBJQ09NX0NBTEwgKFJlc3RvcmVBbGxTdXJmYWNlcyxwKQorI2RlZmluZSBJRGlyZWN0RHJhdzdfR2V0U3VyZmFjZUZyb21EQyhwLGEsYikgICAgSUNPTV9DQUxMMihHZXRTdXJmYWNlRnJvbURDLHAsYSxiKQorI2RlZmluZSBJRGlyZWN0RHJhdzdfUmVzdG9yZUFsbFN1cmZhY2VzKHApICAgICBJQ09NX0NBTEwgKFJlc3RvcmVBbGxTdXJmYWNlcyxwKQogI2RlZmluZSBJRGlyZWN0RHJhdzdfVGVzdENvb3BlcmF0aXZlTGV2ZWwocCkgICAgSUNPTV9DQUxMIChUZXN0Q29vcGVyYXRpdmVMZXZlbCxwKQogI2RlZmluZSBJRGlyZWN0RHJhdzdfR2V0RGV2aWNlSWRlbnRpZmllcihwLGEsYikgSUNPTV9DQUxMMihHZXREZXZpY2VJZGVudGlmaWVyLHAsYSxiKQogLyoqKiBhZGRlZCBpbiBJRGlyZWN0RHJhdyA3ICoqKi8KQEAgLTE1MzksNyArMTU4NSw3IEBACiAjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKHAsYSxiLGMsZCkgICAgICAgICAgICAgIElDT01fQ0FMTDQoTG9jayxwLGEsYixjLGQpCiAjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlREMocCxhKSAgICAgICAgICAgICAgIElDT01fQ0FMTDEoUmVsZWFzZURDLHAsYSkKICNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlX1Jlc3RvcmUocCkgICAgICAgICAgICAgICAgICAgSUNPTV9DQUxMIChSZXN0b3JlLHApCi0jZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZV9TZXRDbGlwcGVyKHAsYSxiKSAgICAgICAgICAgIElDT01fQ0FMTDEoU2V0Q2xpcHBlcixwLGEsYikKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlX1NldENsaXBwZXIocCxhKSAgICAgICAgICAgICAgSUNPTV9DQUxMMShTZXRDbGlwcGVyLHAsYSkKICNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlX1NldENvbG9yS2V5KHAsYSxiKSAgICAgICAgICAgSUNPTV9DQUxMMihTZXRDb2xvcktleSxwLGEsYikKICNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlX1NldE92ZXJsYXlQb3NpdGlvbihwLGEsYikgICAgSUNPTV9DQUxMMihTZXRPdmVybGF5UG9zaXRpb24scCxhLGIpCiAjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZV9TZXRQYWxldHRlKHAsYSkgICAgICAgICAgICAgIElDT01fQ0FMTDEoU2V0UGFsZXR0ZSxwLGEpCkBAIC0xNjI5LDggKzE2NzUsOCBAQAogI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2UyX0lzTG9zdChwKSAgICAgICAgICAgICAgICAgICAgSUNPTV9DQUxMIChJc0xvc3QscCkKICNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlMl9Mb2NrKHAsYSxiLGMsZCkgICAgICAgICAgICAgIElDT01fQ0FMTDQoTG9jayxwLGEsYixjLGQpCiAjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTJfUmVsZWFzZURDKHAsYSkgICAgICAgICAgICAgICBJQ09NX0NBTEwxKFJlbGVhc2VEQyxwLGEpCi0jZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTJfUmVzdG9yZShwLGEsYikgICAgICAgICAgICAgICBJQ09NX0NBTEwgKFJlc3RvcmUscCxhLGIpCi0jZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTJfU2V0Q2xpcHBlcihwLGEsYikgICAgICAgICAgICBJQ09NX0NBTEwxKFNldENsaXBwZXIscCxhLGIpCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTJfUmVzdG9yZShwKSAgICAgICAgICAgICAgICAgICBJQ09NX0NBTEwgKFJlc3RvcmUscCkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlMl9TZXRDbGlwcGVyKHAsYSkgICAgICAgICAgICAgIElDT01fQ0FMTDEoU2V0Q2xpcHBlcixwLGEpCiAjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTJfU2V0Q29sb3JLZXkocCxhLGIpICAgICAgICAgICBJQ09NX0NBTEwyKFNldENvbG9yS2V5LHAsYSxiKQogI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2UyX1NldE92ZXJsYXlQb3NpdGlvbihwLGEsYikgICAgSUNPTV9DQUxMMihTZXRPdmVybGF5UG9zaXRpb24scCxhLGIpCiAjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTJfU2V0UGFsZXR0ZShwLGEpICAgICAgICAgICAgICBJQ09NX0NBTEwxKFNldFBhbGV0dGUscCxhKQpAQCAtMTcyNiw4ICsxNzcyLDggQEAKICNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlM19Jc0xvc3QocCkgICAgICAgICAgICAgICAgICAgIElDT01fQ0FMTCAoSXNMb3N0LHApCiAjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTNfTG9jayhwLGEsYixjLGQpICAgICAgICAgICAgICBJQ09NX0NBTEw0KExvY2sscCxhLGIsYyxkKQogI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2UzX1JlbGVhc2VEQyhwLGEpICAgICAgICAgICAgICAgSUNPTV9DQUxMMShSZWxlYXNlREMscCxhKQotI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2UzX1Jlc3RvcmUocCxhLGIpICAgICAgICAgICAgICAgSUNPTV9DQUxMIChSZXN0b3JlLHAsYSxiKQotI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2UzX1NldENsaXBwZXIocCxhLGIpICAgICAgICAgICAgSUNPTV9DQUxMMShTZXRDbGlwcGVyLHAsYSxiKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2UzX1Jlc3RvcmUocCkgICAgICAgICAgICAgICAgICAgSUNPTV9DQUxMIChSZXN0b3JlLHApCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTNfU2V0Q2xpcHBlcihwLGEpICAgICAgICAgICAgICBJQ09NX0NBTEwxKFNldENsaXBwZXIscCxhKQogI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2UzX1NldENvbG9yS2V5KHAsYSxiKSAgICAgICAgICAgSUNPTV9DQUxMMihTZXRDb2xvcktleSxwLGEsYikKICNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlM19TZXRPdmVybGF5UG9zaXRpb24ocCxhLGIpICAgIElDT01fQ0FMTDIoU2V0T3ZlcmxheVBvc2l0aW9uLHAsYSxiKQogI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2UzX1NldFBhbGV0dGUocCxhKSAgICAgICAgICAgICAgSUNPTV9DQUxMMShTZXRQYWxldHRlLHAsYSkKQEAgLTE3ODQsNyArMTgzMCw3IEBACiAgICAgSUNPTV9NRVRIT0QyKEhSRVNVTFQsU2V0Q29sb3JLZXksICAgICAgICAgICBEV09SRCxkd0ZsYWdzLCBMUEREQ09MT1JLRVksbHBERENvbG9yS2V5KSBcCiAgICAgSUNPTV9NRVRIT0QyKEhSRVNVTFQsU2V0T3ZlcmxheVBvc2l0aW9uLCAgICBMT05HLGxYLCBMT05HLGxZKSBcCiAgICAgSUNPTV9NRVRIT0QxKEhSRVNVTFQsU2V0UGFsZXR0ZSwgICAgICAgICAgICBMUERJUkVDVERSQVdQQUxFVFRFLGxwRERQYWxldHRlKSBcCi0gICAgSUNPTV9NRVRIT0QxKEhSRVNVTFQsVW5sb2NrLCAgICAgICAgICAgICAgICBMUFZPSUQsbHBTdXJmYWNlRGF0YSkgXAorICAgIElDT01fTUVUSE9EMShIUkVTVUxULFVubG9jaywgICAgICAgICAgICAgICAgTFBSRUNULGxwU3VyZmFjZURhdGEpIFwKICAgICBJQ09NX01FVEhPRDUoSFJFU1VMVCxVcGRhdGVPdmVybGF5LCAgICAgICAgIExQUkVDVCxscFNyY1JlY3QsIExQRElSRUNURFJBV1NVUkZBQ0U0LGxwREREZXN0U3VyZmFjZSwgTFBSRUNULGxwRGVzdFJlY3QsIERXT1JELGR3RmxhZ3MsIExQRERPVkVSTEFZRlgsbHBERE92ZXJsYXlGeCkgXAogICAgIElDT01fTUVUSE9EMShIUkVTVUxULFVwZGF0ZU92ZXJsYXlEaXNwbGF5LCAgRFdPUkQsZHdGbGFncykgXAogICAgIElDT01fTUVUSE9EMihIUkVTVUxULFVwZGF0ZU92ZXJsYXlaT3JkZXIsICAgRFdPUkQsZHdGbGFncywgTFBESVJFQ1REUkFXU1VSRkFDRTQsbHBERFNSZWZlcmVuY2UpIFwKQEAgLTE4MzUsOCArMTg4MSw4IEBACiAjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTRfSXNMb3N0KHApICAgICAgICAgICAgICAgICAgICBJQ09NX0NBTEwgKElzTG9zdCxwKQogI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U0X0xvY2socCxhLGIsYyxkKSAgICAgICAgICAgICAgSUNPTV9DQUxMNChMb2NrLHAsYSxiLGMsZCkKICNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlNF9SZWxlYXNlREMocCxhKSAgICAgICAgICAgICAgIElDT01fQ0FMTDEoUmVsZWFzZURDLHAsYSkKLSNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlNF9SZXN0b3JlKHAsYSxiKSAgICAgICAgICAgICAgIElDT01fQ0FMTCAoUmVzdG9yZSxwLGEsYikKLSNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlNF9TZXRDbGlwcGVyKHAsYSxiKSAgICAgICAgICAgIElDT01fQ0FMTDEoU2V0Q2xpcHBlcixwLGEsYikKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlNF9SZXN0b3JlKHApICAgICAgICAgICAgICAgICAgIElDT01fQ0FMTCAoUmVzdG9yZSxwKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U0X1NldENsaXBwZXIocCxhKSAgICAgICAgICAgICAgSUNPTV9DQUxMMShTZXRDbGlwcGVyLHAsYSkKICNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlNF9TZXRDb2xvcktleShwLGEsYikgICAgICAgICAgIElDT01fQ0FMTDIoU2V0Q29sb3JLZXkscCxhLGIpCiAjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTRfU2V0T3ZlcmxheVBvc2l0aW9uKHAsYSxiKSAgICBJQ09NX0NBTEwyKFNldE92ZXJsYXlQb3NpdGlvbixwLGEsYikKICNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlNF9TZXRQYWxldHRlKHAsYSkgICAgICAgICAgICAgIElDT01fQ0FMTDEoU2V0UGFsZXR0ZSxwLGEpCkBAIC0xODQ5LDcgKzE4OTUsNyBAQAogI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U0X1BhZ2VMb2NrKHAsYSkgICAgICAgSUNPTV9DQUxMMShQYWdlTG9jayxwLGEpCiAjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTRfUGFnZVVubG9jayhwLGEpICAgICBJQ09NX0NBTEwxKFBhZ2VVbmxvY2sscCxhKQogLyoqKiBJRGlyZWN0RHJhd1N1cmZhY2UzIG1ldGhvZHMgKioqLwotI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U0X1NldFN1cmZhY2VEZXNjKHAsYSkgSUNPTV9DQUxMKFNldFN1cmZhY2VEZXNjLHAsYSkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlNF9TZXRTdXJmYWNlRGVzYyhwLGEsYikgSUNPTV9DQUxMMihTZXRTdXJmYWNlRGVzYyxwLGEsYikKIC8qKiogSURpcmVjdERyYXdTdXJmYWNlNCBtZXRob2RzICoqKi8KICNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlNF9TZXRQcml2YXRlRGF0YShwLGEsYixjLGQpIElDT01fQ0FMTDQoU2V0UHJpdmF0ZURhdGEscCxhLGIsYyxkKQogI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U0X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpICAgSUNPTV9DQUxMMyhHZXRQcml2YXRlRGF0YSxwLGEsYixjKQpAQCAtMTg2OSw4ICsxOTE1LDggQEAKICAgICBJQ09NX01FVEhPRDMoSFJFU1VMVCxCbHRCYXRjaCwgICAgICAgICAgICAgIExQRERCTFRCQVRDSCxscEREQmx0QmF0Y2gsIERXT1JELGR3Q291bnQsIERXT1JELGR3RmxhZ3MpIFwKICAgICBJQ09NX01FVEhPRDUoSFJFU1VMVCxCbHRGYXN0LCAgICAgICAgICAgICAgIERXT1JELGR3WCwgRFdPUkQsZHdZLCBMUERJUkVDVERSQVdTVVJGQUNFNyxscEREU3JjU3VyZmFjZSwgTFBSRUNULGxwU3JjUmVjdCwgRFdPUkQsZHdUcmFucykgXAogICAgIElDT01fTUVUSE9EMihIUkVTVUxULERlbGV0ZUF0dGFjaGVkU3VyZmFjZSwgRFdPUkQsZHdGbGFncywgTFBESVJFQ1REUkFXU1VSRkFDRTcsbHBERFNBdHRhY2hlZFN1cmZhY2UpIFwKLSAgICBJQ09NX01FVEhPRDIoSFJFU1VMVCxFbnVtQXR0YWNoZWRTdXJmYWNlcywgIExQVk9JRCxscENvbnRleHQsIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSyxscEVudW1TdXJmYWNlc0NhbGxiYWNrKSBcCi0gICAgSUNPTV9NRVRIT0QzKEhSRVNVTFQsRW51bU92ZXJsYXlaT3JkZXJzLCAgICBEV09SRCxkd0ZsYWdzLCBMUFZPSUQsbHBDb250ZXh0LCBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0ssbHBmbkNhbGxiYWNrKSBcCisgICAgSUNPTV9NRVRIT0QyKEhSRVNVTFQsRW51bUF0dGFjaGVkU3VyZmFjZXMsICBMUFZPSUQsbHBDb250ZXh0LCBMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0s3LGxwRW51bVN1cmZhY2VzQ2FsbGJhY2spIFwKKyAgICBJQ09NX01FVEhPRDMoSFJFU1VMVCxFbnVtT3ZlcmxheVpPcmRlcnMsICAgIERXT1JELGR3RmxhZ3MsIExQVk9JRCxscENvbnRleHQsIExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSzcsbHBmbkNhbGxiYWNrKSBcCiAgICAgSUNPTV9NRVRIT0QyKEhSRVNVTFQsRmxpcCwgICAgICAgICAgICAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFNyxscEREU3VyZmFjZVRhcmdldE92ZXJyaWRlLCBEV09SRCxkd0ZsYWdzKSBcCiAgICAgSUNPTV9NRVRIT0QyKEhSRVNVTFQsR2V0QXR0YWNoZWRTdXJmYWNlLCAgICBMUEREU0NBUFMyLGxwRERTQ2FwcywgTFBESVJFQ1REUkFXU1VSRkFDRTcqLGxwbHBEREF0dGFjaGVkU3VyZmFjZSkgXAogICAgIElDT01fTUVUSE9EMShIUkVTVUxULEdldEJsdFN0YXR1cywgICAgICAgICAgRFdPUkQsZHdGbGFncykgXApAQCAtMTg5Miw3ICsxOTM4LDcgQEAKICAgICBJQ09NX01FVEhPRDIoSFJFU1VMVCxTZXRDb2xvcktleSwgICAgICAgICAgIERXT1JELGR3RmxhZ3MsIExQRERDT0xPUktFWSxscEREQ29sb3JLZXkpIFwKICAgICBJQ09NX01FVEhPRDIoSFJFU1VMVCxTZXRPdmVybGF5UG9zaXRpb24sICAgIExPTkcsbFgsIExPTkcsbFkpIFwKICAgICBJQ09NX01FVEhPRDEoSFJFU1VMVCxTZXRQYWxldHRlLCAgICAgICAgICAgIExQRElSRUNURFJBV1BBTEVUVEUsbHBERFBhbGV0dGUpIFwKLSAgICBJQ09NX01FVEhPRDEoSFJFU1VMVCxVbmxvY2ssICAgICAgICAgICAgICAgIExQVk9JRCxscFN1cmZhY2VEYXRhKSBcCisgICAgSUNPTV9NRVRIT0QxKEhSRVNVTFQsVW5sb2NrLCAgICAgICAgICAgICAgICBMUFJFQ1QsbHBTdXJmYWNlRGF0YSkgXAogICAgIElDT01fTUVUSE9ENShIUkVTVUxULFVwZGF0ZU92ZXJsYXksICAgICAgICAgTFBSRUNULGxwU3JjUmVjdCwgTFBESVJFQ1REUkFXU1VSRkFDRTcsbHBERERlc3RTdXJmYWNlLCBMUFJFQ1QsbHBEZXN0UmVjdCwgRFdPUkQsZHdGbGFncywgTFBERE9WRVJMQVlGWCxscERET3ZlcmxheUZ4KSBcCiAgICAgSUNPTV9NRVRIT0QxKEhSRVNVTFQsVXBkYXRlT3ZlcmxheURpc3BsYXksICBEV09SRCxkd0ZsYWdzKSBcCiAgICAgSUNPTV9NRVRIT0QyKEhSRVNVTFQsVXBkYXRlT3ZlcmxheVpPcmRlciwgICBEV09SRCxkd0ZsYWdzLCBMUERJUkVDVERSQVdTVVJGQUNFNyxscEREU1JlZmVyZW5jZSkgXApAQCAtMTkxOSw2ICsxOTY1LDYxIEBACiBJQ09NX0RFRklORShJRGlyZWN0RHJhd1N1cmZhY2U3LElVbmtub3duKQogI3VuZGVmIElDT01fSU5URVJGQUNFCiAKKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLworI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSBJQ09NX0NBTEwyKFF1ZXJ5SW50ZXJmYWNlLHAsYSxiKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihwKSAgICAgICAgICAgICBJQ09NX0NBTEwgKEFkZFJlZixwKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UocCkgICAgICAgICAgICBJQ09NX0NBTEwgKFJlbGVhc2UscCkKKy8qKiogSURpcmVjdERyYXdTdXJmYWNlIChhbG1vc3QpIG1ldGhvZHMgKioqLworI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZEF0dGFjaGVkU3VyZmFjZShwLGEpICAgICAgSUNPTV9DQUxMMShBZGRBdHRhY2hlZFN1cmZhY2UscCxhKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZE92ZXJsYXlEaXJ0eVJlY3QocCxhKSAgICAgSUNPTV9DQUxMMShBZGRPdmVybGF5RGlydHlSZWN0LHAsYSkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19CbHQocCxhLGIsYyxkLGUpICAgICAgICAgICAgIElDT01fQ0FMTDUoQmx0LHAsYSxiLGMsZCxlKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0JsdEJhdGNoKHAsYSxiLGMpICAgICAgICAgICAgSUNPTV9DQUxMMyhCbHRCYXRjaCxwLGEsYixjKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0JsdEZhc3QocCxhLGIsYyxkLGUpICAgICAgICAgSUNPTV9DQUxMNShCbHRGYXN0LHAsYSxiLGMsZCxlKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0RlbGV0ZUF0dGFjaGVkU3VyZmFjZShwLGEsYikgSUNPTV9DQUxMMihEZWxldGVBdHRhY2hlZFN1cmZhY2UscCxhLGIpCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTdfRW51bUF0dGFjaGVkU3VyZmFjZXMocCxhLGIpICBJQ09NX0NBTEwyKEVudW1BdHRhY2hlZFN1cmZhY2VzLHAsYSxiKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0VudW1PdmVybGF5Wk9yZGVycyhwLGEsYixjKSAgSUNPTV9DQUxMMyhFbnVtT3ZlcmxheVpPcmRlcnMscCxhLGIsYykKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19GbGlwKHAsYSxiKSAgICAgICAgICAgICAgICAgIElDT01fQ0FMTDIoRmxpcCxwLGEsYikKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19HZXRBdHRhY2hlZFN1cmZhY2UocCxhLGIpICAgIElDT01fQ0FMTDIoR2V0QXR0YWNoZWRTdXJmYWNlLHAsYSxiKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldEJsdFN0YXR1cyhwLGEpICAgICAgICAgICAgSUNPTV9DQUxMMShHZXRCbHRTdGF0dXMscCxhKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldENhcHMocCxhKSAgICAgICAgICAgICAgICAgSUNPTV9DQUxMMShHZXRDYXBzLHAsYSkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19HZXRDbGlwcGVyKHAsYSkgICAgICAgICAgICAgIElDT01fQ0FMTDEoR2V0Q2xpcHBlcixwLGEpCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTdfR2V0Q29sb3JLZXkocCxhLGIpICAgICAgICAgICBJQ09NX0NBTEwyKEdldENvbG9yS2V5LHAsYSxiKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldERDKHAsYSkgICAgICAgICAgICAgICAgICAgSUNPTV9DQUxMMShHZXREQyxwLGEpCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTdfR2V0RmxpcFN0YXR1cyhwLGEpICAgICAgICAgICBJQ09NX0NBTEwxKEdldEZsaXBTdGF0dXMscCxhKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldE92ZXJsYXlQb3NpdGlvbihwLGEsYikgICAgSUNPTV9DQUxMMihHZXRPdmVybGF5UG9zaXRpb24scCxhLGIpCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTdfR2V0UGFsZXR0ZShwLGEpICAgICAgICAgICAgICBJQ09NX0NBTEwxKEdldFBhbGV0dGUscCxhKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldFBpeGVsRm9ybWF0KHAsYSkgICAgICAgICAgSUNPTV9DQUxMMShHZXRQaXhlbEZvcm1hdCxwLGEpCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTdfR2V0U3VyZmFjZURlc2MocCxhKSAgICAgICAgICBJQ09NX0NBTEwxKEdldFN1cmZhY2VEZXNjLHAsYSkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19Jbml0aWFsaXplKHAsYSxiKSAgICAgICAgICAgIElDT01fQ0FMTDIoSW5pdGlhbGl6ZSxwLGEsYikKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19Jc0xvc3QocCkgICAgICAgICAgICAgICAgICAgIElDT01fQ0FMTCAoSXNMb3N0LHApCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTdfTG9jayhwLGEsYixjLGQpICAgICAgICAgICAgICBJQ09NX0NBTEw0KExvY2sscCxhLGIsYyxkKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2VEQyhwLGEpICAgICAgICAgICAgICAgSUNPTV9DQUxMMShSZWxlYXNlREMscCxhKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X1Jlc3RvcmUocCkgICAgICAgICAgICAgICAgICAgSUNPTV9DQUxMIChSZXN0b3JlLHApCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTdfU2V0Q2xpcHBlcihwLGEpICAgICAgICAgICAgICBJQ09NX0NBTEwxKFNldENsaXBwZXIscCxhKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X1NldENvbG9yS2V5KHAsYSxiKSAgICAgICAgICAgSUNPTV9DQUxMMihTZXRDb2xvcktleSxwLGEsYikKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19TZXRPdmVybGF5UG9zaXRpb24ocCxhLGIpICAgIElDT01fQ0FMTDIoU2V0T3ZlcmxheVBvc2l0aW9uLHAsYSxiKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X1NldFBhbGV0dGUocCxhKSAgICAgICAgICAgICAgSUNPTV9DQUxMMShTZXRQYWxldHRlLHAsYSkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19VbmxvY2socCxhKSAgICAgICAgICAgICAgICAgIElDT01fQ0FMTDEoVW5sb2NrLHAsYSkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19VcGRhdGVPdmVybGF5KHAsYSxiLGMsZCxlKSAgIElDT01fQ0FMTDUoVXBkYXRlT3ZlcmxheSxwLGEsYixjLGQsZSkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19VcGRhdGVPdmVybGF5RGlzcGxheShwLGEpICAgIElDT01fQ0FMTDEoVXBkYXRlT3ZlcmxheURpc3BsYXkscCxhKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X1VwZGF0ZU92ZXJsYXlaT3JkZXIocCxhLGIpICAgSUNPTV9DQUxMMihVcGRhdGVPdmVybGF5Wk9yZGVyLHAsYSxiKQorLyoqKiBJRGlyZWN0RHJhd1N1cmZhY2UyIG1ldGhvZHMgKioqLworI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldERESW50ZXJmYWNlKHAsYSkgSUNPTV9DQUxMMShHZXREREludGVyZmFjZSxwLGEpCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTdfUGFnZUxvY2socCxhKSAgICAgICBJQ09NX0NBTEwxKFBhZ2VMb2NrLHAsYSkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19QYWdlVW5sb2NrKHAsYSkgICAgIElDT01fQ0FMTDEoUGFnZVVubG9jayxwLGEpCisvKioqIElEaXJlY3REcmF3U3VyZmFjZTMgbWV0aG9kcyAqKiovCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTdfU2V0U3VyZmFjZURlc2MocCxhLGIpIElDT01fQ0FMTDIoU2V0U3VyZmFjZURlc2MscCxhLGIpCisvKioqIElEaXJlY3REcmF3U3VyZmFjZTQgbWV0aG9kcyAqKiovCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTdfU2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKSBJQ09NX0NBTEw0KFNldFByaXZhdGVEYXRhLHAsYSxiLGMsZCkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19HZXRQcml2YXRlRGF0YShwLGEsYixjKSAgIElDT01fQ0FMTDMoR2V0UHJpdmF0ZURhdGEscCxhLGIsYykKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19GcmVlUHJpdmF0ZURhdGEocCxhKSAgICAgIElDT01fQ0FMTDEoRnJlZVByaXZhdGVEYXRhLHAsYSkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19HZXRVbmlxdWVuZXNzVmFsdWUocCxhKSAgIElDT01fQ0FMTDEoR2V0VW5pcXVlbmVzc1ZhbHVlLHAsYSkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19DaGFuZ2VVbmlxdWVuZXNzVmFsdWUocCkgIElDT01fQ0FMTCAoQ2hhbmdlVW5pcXVlbmVzc1ZhbHVlLHApCisvKioqIElEaXJlY3REcmF3U3VyZmFjZTcgbWV0aG9kcyAqKiovCisjZGVmaW5lIElEaXJlY3REcmF3U3VyZmFjZTdfU2V0UHJpb3JpdHkocCxhKSAgICAgICAgICBJQ09NX0NBTEwxKFNldFByaW9yaXR5LHAsYSkKKyNkZWZpbmUgSURpcmVjdERyYXdTdXJmYWNlN19HZXRQcmlvcml0eShwLGEpICAgICAgICAgIElDT01fQ0FMTDEoR2V0UHJpb3JpdHkscCxhKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X1NldExPRChwLGEpICAgICAgICAgICAgICAgSUNPTV9DQUxMMShTZXRMT0QscCxhKQorI2RlZmluZSBJRGlyZWN0RHJhd1N1cmZhY2U3X0dldExPRChwLGEpICAgICAgICAgICAgICAgSUNPTV9DQUxMMShHZXRMT0QscCxhKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElEaXJlY3REcmF3Q29sb3JDb250cm9sIGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvbXNkb3MvdmdhLmMgYi9tc2Rvcy92Z2EuYwppbmRleCBmZjcwZDBmLi44NGMzZGFiIDEwMDY0NAotLS0gYS9tc2Rvcy92Z2EuYworKysgYi9tc2Rvcy92Z2EuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgaWYgKCFscGRkc3VyZikgcmV0dXJuIDE7CiAgICAgaWYgKEhlaWdodCkgKkhlaWdodD1zZGVzYy5kd0hlaWdodDsKICAgICBpZiAoV2lkdGgpICpXaWR0aD1zZGVzYy5kd1dpZHRoOwotICAgIGlmIChEZXB0aCkgKkRlcHRoPXNkZXNjLmRkcGZQaXhlbEZvcm1hdC51LmR3UkdCQml0Q291bnQ7CisgICAgaWYgKERlcHRoKSAqRGVwdGg9c2Rlc2MuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQ7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE0NywxNiArMTQ3LDE2IEBACiAgICAgICAgIEVSUigiY291bGQgbm90IGxvY2sgc3VyZmFjZSFcbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKFBpdGNoKSAqUGl0Y2g9c2Rlc2MubFBpdGNoOworICAgIGlmIChQaXRjaCkgKlBpdGNoPXNkZXNjLnUxLmxQaXRjaDsKICAgICBpZiAoSGVpZ2h0KSAqSGVpZ2h0PXNkZXNjLmR3SGVpZ2h0OwogICAgIGlmIChXaWR0aCkgKldpZHRoPXNkZXNjLmR3V2lkdGg7Ci0gICAgaWYgKERlcHRoKSAqRGVwdGg9c2Rlc2MuZGRwZlBpeGVsRm9ybWF0LnUuZHdSR0JCaXRDb3VudDsKLSAgICByZXR1cm4gc2Rlc2MudTEubHBTdXJmYWNlOworICAgIGlmIChEZXB0aCkgKkRlcHRoPXNkZXNjLmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50OworICAgIHJldHVybiBzZGVzYy5scFN1cmZhY2U7CiB9CiAKIHZvaWQgVkdBX1VubG9jayh2b2lkKQogewotICAgIElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2sobHBkZHN1cmYsc2Rlc2MudTEubHBTdXJmYWNlKTsKKyAgICBJRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrKGxwZGRzdXJmLHNkZXNjLmxwU3VyZmFjZSk7CiB9CiAKIC8qKiogVEVYVCBNT0RFICoqKi8K