I2lmZGVmIEhBVkVfQ09ORklHX0gKI2luY2x1ZGUgImNvbmZpZy5oIgojZW5kaWYKI2luY2x1ZGUgPGdsaWIuaD4KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAiZ29vbV9jb3JlLmgiCiNpbmNsdWRlICJnb29tX3Rvb2xzLmgiCiNpbmNsdWRlICJmaWx0ZXJzLmgiCiNpbmNsdWRlICJsaW5lcy5oIgoKLyojZGVmaW5lIFZFUkJPU0UgKi8KCiNpZmRlZiBWRVJCT1NFCiNpbmNsdWRlIDxzdGRpby5oPgojZW5kaWYKCiNkZWZpbmUgU1RPUF9TUEVFRCAxMjgKCnZvaWQKZ29vbV9pbml0IChHb29tRGF0YSAqIGdvb21kYXRhLCBndWludDMyIHJlc3gsIGd1aW50MzIgcmVzeSkKewojaWZkZWYgVkVSQk9TRQogIHByaW50ZiAoIkdPT006IGluaXQgKCVkLCAlZCk7XG4iLCByZXN4LCByZXN5KTsKI2VuZGlmCiAgZ29vbWRhdGEtPnJlc29seCA9IDA7CiAgZ29vbWRhdGEtPnJlc29seSA9IDA7CiAgZ29vbWRhdGEtPmJ1ZmZzaXplID0gMDsKCiAgZ29vbWRhdGEtPnBpeGVsID0gTlVMTDsKICBnb29tZGF0YS0+YmFjayA9IE5VTEw7CiAgZ29vbWRhdGEtPnAxID0gTlVMTDsKICBnb29tZGF0YS0+cDIgPSBOVUxMOwoKICBnb29tX3NldF9yZXNvbHV0aW9uIChnb29tZGF0YSwgcmVzeCwgcmVzeSk7CiAgUkFORF9JTklUIChnb29tZGF0YSwgR1BPSU5URVJfVE9fSU5UIChnb29tZGF0YS0+cGl4ZWwpKTsKICBnb29tZGF0YS0+Y3ljbGUgPSAwOwoKCiAgZ29vbWRhdGEtPmdvb21saW1pdCA9IDI7ICAgICAgLyogc2Vuc2liaWxpdOkgZHUgZ29vbSAqLwogIGdvb21kYXRhLT56ZmQgPSB6b29tRmlsdGVyTmV3ICgpOwogIGdvb21kYXRhLT5sb2NrdmFyID0gMDsgICAgICAgIC8qIHBvdXIgZW1wZWNoZXIgZGUgbm91dmVhdXggY2hhbmdlbWVudHMgKi8KICBnb29tZGF0YS0+Z29vbXZhciA9IDA7ICAgICAgICAvKiBib3VjbGUgZGVzIGdvb21zICovCiAgZ29vbWRhdGEtPnRvdGFsZ29vbSA9IDA7ICAgICAgLyogbm9tYnJlIGRlIGdvb21zIHBhciBzZWNvbmRzICovCiAgZ29vbWRhdGEtPmFnb29tID0gMDsgICAgICAgICAgLyogdW4gZ29vbSBhIGV1IGxpZXUuLiAgICAgICAqLwogIGdvb21kYXRhLT5sb29wdmFyID0gMDsgICAgICAgIC8qIG1vdXZlbWVudCBkZXMgcG9pbnRzICovCiAgZ29vbWRhdGEtPnNwZWVkdmFyID0gMDsgICAgICAgLyogdml0ZXNzZSBkZXMgcGFydGljdWxlcyAqLwogIGdvb21kYXRhLT5saW5lTW9kZSA9IDA7ICAgICAgIC8qIGwnZWZmZXQgbGluZWFpcmUgYSBkZXNzaW5lciAqLwp9Cgp2b2lkCmdvb21fc2V0X3Jlc29sdXRpb24gKEdvb21EYXRhICogZ29vbWRhdGEsIGd1aW50MzIgcmVzeCwgZ3VpbnQzMiByZXN5KQp7CiAgZ3VpbnQzMiBidWZmc2l6ZSA9IHJlc3ggKiByZXN5OwoKICBpZiAoKGdvb21kYXRhLT5yZXNvbHggPT0gcmVzeCkgJiYgKGdvb21kYXRhLT5yZXNvbHkgPT0gcmVzeSkpCiAgICByZXR1cm47CgogIGlmIChnb29tZGF0YS0+YnVmZnNpemUgPCBidWZmc2l6ZSkgewogICAgaWYgKGdvb21kYXRhLT5waXhlbCkKICAgICAgZnJlZSAoZ29vbWRhdGEtPnBpeGVsKTsKICAgIGlmIChnb29tZGF0YS0+YmFjaykKICAgICAgZnJlZSAoZ29vbWRhdGEtPmJhY2spOwogICAgZ29vbWRhdGEtPnBpeGVsID0gKGd1aW50MzIgKikgbWFsbG9jIChidWZmc2l6ZSAqIHNpemVvZiAoZ3VpbnQzMikgKyAxMjgpOwogICAgZ29vbWRhdGEtPmJhY2sgPSAoZ3VpbnQzMiAqKSBtYWxsb2MgKGJ1ZmZzaXplICogc2l6ZW9mIChndWludDMyKSArIDEyOCk7CiAgICBnb29tZGF0YS0+YnVmZnNpemUgPSBidWZmc2l6ZTsKCiAgICBnb29tZGF0YS0+cDEgPSAodm9pZCAqKSAoKChndWludHB0cikgZ29vbWRhdGEtPnBpeGVsICsgMHg3ZikgJiAofjB4N2YpKTsKICAgIGdvb21kYXRhLT5wMiA9ICh2b2lkICopICgoKGd1aW50cHRyKSBnb29tZGF0YS0+YmFjayArIDB4N2YpICYgKH4weDdmKSk7CiAgfQoKICBnb29tZGF0YS0+cmVzb2x4ID0gcmVzeDsKICBnb29tZGF0YS0+cmVzb2x5ID0gcmVzeTsKCiAgbWVtc2V0IChnb29tZGF0YS0+cGl4ZWwsIDAsIGJ1ZmZzaXplICogc2l6ZW9mIChndWludDMyKSArIDEyOCk7CiAgbWVtc2V0IChnb29tZGF0YS0+YmFjaywgMCwgYnVmZnNpemUgKiBzaXplb2YgKGd1aW50MzIpICsgMTI4KTsKfQoKZ3VpbnQzMiAqCmdvb21fdXBkYXRlIChHb29tRGF0YSAqIGdvb21kYXRhLCBnaW50MTYgZGF0YVsyXVs1MTJdKQp7CiAgZ3VpbnQzMiAqcmV0dXJuX3ZhbDsKICBndWludDMyIHBvaW50V2lkdGg7CiAgZ3VpbnQzMiBwb2ludEhlaWdodDsKICBpbnQgaW5jdmFyOyAgICAgICAgICAgICAgICAgICAvKiB2b2x1bWUgZHUgc29uICovCiAgaW50IGFjY2VsdmFyOyAgICAgICAgICAgICAgICAgLyogYWNjZWxlcmF0aW9uIGRlcyBwYXJ0aWN1bGVzICovCiAgaW50IGk7CiAgZmxvYXQgbGFyZ2ZhY3RvcjsgICAgICAgICAgICAgLyogZWxhcmdpc3NlbWVudCBkZSBsJ2ludGVydmFsbGUgZCfpdm9sdXRpb24gZGVzIHBvaW50cyAqLwogIGludCB6ZmRfdXBkYXRlID0gMDsKICBpbnQgcmVzb2x4ID0gZ29vbWRhdGEtPnJlc29seDsKICBpbnQgcmVzb2x5ID0gZ29vbWRhdGEtPnJlc29seTsKICBab29tRmlsdGVyRGF0YSAqcHpmZCA9IGdvb21kYXRhLT56ZmQ7CiAgZ3VpbnQzMiAqdG1wOwoKICAvKiB0ZXN0IGlmIHRoZSBjb25maWcgaGFzIGNoYW5nZWQsIHVwZGF0ZSBpdCBpZiBzbyAqLwoKICBwb2ludFdpZHRoID0gKHJlc29seCAqIDIpIC8gNTsKICBwb2ludEhlaWdodCA9IChyZXNvbHkgKiAyKSAvIDU7CgogIC8qICEgZXR1ZGUgZHUgc2lnbmFsIC4uLiAqLwogIGluY3ZhciA9IDA7CiAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CiAgICBpZiAoaW5jdmFyIDwgZGF0YVswXVtpXSkKICAgICAgaW5jdmFyID0gZGF0YVswXVtpXTsKICB9CgogIGFjY2VsdmFyID0gaW5jdmFyIC8gNTAwMDsKICBpZiAoZ29vbWRhdGEtPnNwZWVkdmFyID4gNSkgewogICAgYWNjZWx2YXItLTsKICAgIGlmIChnb29tZGF0YS0+c3BlZWR2YXIgPiAyMCkKICAgICAgYWNjZWx2YXItLTsKICAgIGlmIChnb29tZGF0YS0+c3BlZWR2YXIgPiA0MCkKICAgICAgZ29vbWRhdGEtPnNwZWVkdmFyID0gNDA7CiAgfQogIGFjY2VsdmFyLS07CiAgZ29vbWRhdGEtPnNwZWVkdmFyICs9IGFjY2VsdmFyOwoKICBpZiAoZ29vbWRhdGEtPnNwZWVkdmFyIDwgMCkKICAgIGdvb21kYXRhLT5zcGVlZHZhciA9IDA7CiAgaWYgKGdvb21kYXRhLT5zcGVlZHZhciA+IDQwKQogICAgZ29vbWRhdGEtPnNwZWVkdmFyID0gNDA7CgoKICAvKiAhIGNhbGN1bCBkdSBkZXBsYWNlbWVudCBkZXMgcGV0aXRzIHBvaW50cyAuLi4gKi8KCiAgbGFyZ2ZhY3RvciA9CiAgICAgICgoZmxvYXQpIGdvb21kYXRhLT5zcGVlZHZhciAvIDQwLjBmICsgKGZsb2F0KSBpbmN2YXIgLyA1MDAwMC4wZikgLyAxLjVmOwogIGlmIChsYXJnZmFjdG9yID4gMS41ZikKICAgIGxhcmdmYWN0b3IgPSAxLjVmOwoKICBmb3IgKGkgPSAxOyBpICogMTUgPD0gZ29vbWRhdGEtPnNwZWVkdmFyICsgMTU7IGkrKykgewogICAgZ29vbWRhdGEtPmxvb3B2YXIgKz0gZ29vbWRhdGEtPnNwZWVkdmFyICsgMTsKCiAgICBwb2ludEZpbHRlciAoZ29vbWRhdGEsCiAgICAgICAgWUVMTE9XLAogICAgICAgICgocG9pbnRXaWR0aCAtIDYuMGYpICogbGFyZ2ZhY3RvciArIDUuMGYpLAogICAgICAgICgocG9pbnRIZWlnaHQgLSA2LjBmKSAqIGxhcmdmYWN0b3IgKyA1LjBmKSwKICAgICAgICBpICogMTUyLjBmLCAxMjguMGYsIGdvb21kYXRhLT5sb29wdmFyICsgaSAqIDIwMzIpOwogICAgcG9pbnRGaWx0ZXIgKGdvb21kYXRhLCBPUkFOR0UsCiAgICAgICAgKChwb2ludFdpZHRoIC8gMikgKiBsYXJnZmFjdG9yKSAvIGkgKyAxMC4wZiAqIGksCiAgICAgICAgKChwb2ludEhlaWdodCAvIDIpICogbGFyZ2ZhY3RvcikgLyBpICsgMTAuMGYgKiBpLAogICAgICAgIDk2LjBmLCBpICogODAuMGYsIGdvb21kYXRhLT5sb29wdmFyIC8gaSk7CiAgICBwb2ludEZpbHRlciAoZ29vbWRhdGEsIFZJT0xFVCwKICAgICAgICAoKHBvaW50SGVpZ2h0IC8gMyArIDUuMGYpICogbGFyZ2ZhY3RvcikgLyBpICsgMTAuMGYgKiBpLAogICAgICAgICgocG9pbnRIZWlnaHQgLyAzICsgNS4wZikgKiBsYXJnZmFjdG9yKSAvIGkgKyAxMC4wZiAqIGksCiAgICAgICAgaSArIDEyMi4wZiwgMTM0LjBmLCBnb29tZGF0YS0+bG9vcHZhciAvIGkpOwogICAgcG9pbnRGaWx0ZXIgKGdvb21kYXRhLCBCTEFDSywKICAgICAgICAoKHBvaW50SGVpZ2h0IC8gMykgKiBsYXJnZmFjdG9yICsgMjAuMGYpLAogICAgICAgICgocG9pbnRIZWlnaHQgLyAzKSAqIGxhcmdmYWN0b3IgKyAyMC4wZiksCiAgICAgICAgNTguMGYsIGkgKiA2Ni4wZiwgZ29vbWRhdGEtPmxvb3B2YXIgLyBpKTsKICAgIHBvaW50RmlsdGVyIChnb29tZGF0YSwgV0hJVEUsCiAgICAgICAgKHBvaW50SGVpZ2h0ICogbGFyZ2ZhY3RvciArIDEwLjBmICogaSkgLyBpLAogICAgICAgIChwb2ludEhlaWdodCAqIGxhcmdmYWN0b3IgKyAxMC4wZiAqIGkpIC8gaSwKICAgICAgICA2Ni4wZiwgNzQuMGYsIGdvb21kYXRhLT5sb29wdmFyICsgaSAqIDUwMCk7CiAgfQoKICAvKiBkaW1pbnVlciBkZSAxIGxlIHRlbXBzIGRlIGxvY2thZ2UgKi8KICAvKiBub3RlIHBvdXIgY2V1eCBxdWkgbidvbnQgcGFzIHN1aXZpcyA6IGxlIGxvY2t2YXIgcGVybWV0IGQnZW1wZWNoZXIgdW4gKi8KICAvKiBjaGFuZ2VtZW50IGQnZXRhdCBkdSBwbHVnaW5zIGp1c3RlIGFwcmVzIHVuIGF1dHJlIGNoYW5nZW1lbnQgZCdldGF0LiBva2kgPyAqLwogIGlmICgtLWdvb21kYXRhLT5sb2NrdmFyIDwgMCkKICAgIGdvb21kYXRhLT5sb2NrdmFyID0gMDsKCiAgLyogdGVtcHMgZHUgZ29vbSAqLwogIGlmICgtLWdvb21kYXRhLT5hZ29vbSA8IDApCiAgICBnb29tZGF0YS0+YWdvb20gPSAwOwoKICAvKiBvbiB2ZXJpZmllIHF1J2lsIG5lIHNlIHBhcyB1biB0cnVjIGludGVycmVzc2FudCBhdmVjIGxlIHNvbi4gKi8KICBpZiAoKGFjY2VsdmFyID4gZ29vbWRhdGEtPmdvb21saW1pdCkgfHwgKGFjY2VsdmFyIDwgLWdvb21kYXRhLT5nb29tbGltaXQpKSB7CiAgICAvKiBVTiBHT09NICEhISBZQUhPTyAhICovCiAgICBnb29tZGF0YS0+dG90YWxnb29tKys7CiAgICBnb29tZGF0YS0+YWdvb20gPSAyMDsgICAgICAgLyogbWFpcyBwZHQgMjAgY3ljbGVzLCBpbCBuJ3kgZW4gYXVyYSBwbHVzLiAqLwogICAgZ29vbWRhdGEtPmxpbmVNb2RlID0gKGdvb21kYXRhLT5saW5lTW9kZSArIDEpICUgMjA7IC8qIFRvdXMgbGVzIDEwIGdvb21zIG9uIGNoYW5nZSBkZSBtb2RlIGxpbmVhaXJlICovCgogICAgLyogY2hhbmdlbWVudCBldmVudHVlbCBkZSBtb2RlICovCiAgICBzd2l0Y2ggKGlSQU5EIChnb29tZGF0YSwgMTApKSB7CiAgICAgIGNhc2UgMDoKICAgICAgY2FzZSAxOgogICAgICBjYXNlIDI6CiAgICAgICAgcHpmZC0+bW9kZSA9IFdBVkVfTU9ERTsKICAgICAgICBwemZkLT52aXRlc3NlID0gU1RPUF9TUEVFRCAtIDE7CiAgICAgICAgcHpmZC0+cmV2ZXJzZSA9IDA7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgY2FzZSA0OgogICAgICAgIHB6ZmQtPm1vZGUgPSBDUllTVEFMX0JBTExfTU9ERTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA1OgogICAgICAgIHB6ZmQtPm1vZGUgPSBBTVVMRVRURV9NT0RFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDY6CiAgICAgICAgcHpmZC0+bW9kZSA9IFdBVEVSX01PREU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNzoKICAgICAgICBwemZkLT5tb2RlID0gU0NSVU5DSF9NT0RFOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHB6ZmQtPm1vZGUgPSBOT1JNQUxfTU9ERTsKICAgIH0KICB9CgogIC8qIHRvdXQgY2VjaSBuZSBzZXJhIGZhaXQgcXUnZW4gY2FzIGRlIG5vbi1ibG9jYWdlICovCiAgaWYgKGdvb21kYXRhLT5sb2NrdmFyID09IDApIHsKICAgIC8qIHJlcGVyYWdlIGRlIGdvb20gKGFjY2VsZXJhdGlvbiBmb3J0ZSBkZSBsJ2FjY2VsZXJhdGlvbiBkdSB2b2x1bWUpICovCiAgICAvKiAtPiBjb3VwIGRlIGJvb3N0IGRlIGxhIHZpdGVzc2Ugc2kgYmVzb2luLi4gKi8KICAgIGlmICgoYWNjZWx2YXIgPiBnb29tZGF0YS0+Z29vbWxpbWl0KSB8fCAoYWNjZWx2YXIgPCAtZ29vbWRhdGEtPmdvb21saW1pdCkpIHsKICAgICAgZ29vbWRhdGEtPmdvb212YXIrKzsKICAgICAgLyppZiAoZ29vbXZhciAlIDEgPT0gMCkgKi8KICAgICAgewogICAgICAgIGd1aW50MzIgdnRtcDsKICAgICAgICBndWludDMyIG5ld3ZpdDsKCiAgICAgICAgbmV3dml0ID0gU1RPUF9TUEVFRCAtIGdvb21kYXRhLT5zcGVlZHZhciAvIDI7CiAgICAgICAgLyogcmV0YWJsaXIgbGUgem9vbSBhdmFudC4uICovCiAgICAgICAgaWYgKChwemZkLT5yZXZlcnNlKSAmJiAoIShnb29tZGF0YS0+Y3ljbGUgJSAxMikpICYmIChyYW5kICgpICUgMyA9PSAwKSkgewogICAgICAgICAgcHpmZC0+cmV2ZXJzZSA9IDA7CiAgICAgICAgICBwemZkLT52aXRlc3NlID0gU1RPUF9TUEVFRCAtIDI7CiAgICAgICAgICBnb29tZGF0YS0+bG9ja3ZhciA9IDUwOwogICAgICAgIH0KICAgICAgICBpZiAoaVJBTkQgKGdvb21kYXRhLCAxMCkgPT0gMCkgewogICAgICAgICAgcHpmZC0+cmV2ZXJzZSA9IDE7CiAgICAgICAgICBnb29tZGF0YS0+bG9ja3ZhciA9IDEwMDsKICAgICAgICB9CgogICAgICAgIC8qIGNoYW5nZW1lbnQgZGUgbWlsaWV1Li4gKi8KICAgICAgICBzd2l0Y2ggKGlSQU5EIChnb29tZGF0YSwgMjApKSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHB6ZmQtPm1pZGRsZVkgPSByZXNvbHkgLSAxOwogICAgICAgICAgICBwemZkLT5taWRkbGVYID0gcmVzb2x4IC8gMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHB6ZmQtPm1pZGRsZVggPSByZXNvbHggLSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcHpmZC0+bWlkZGxlWCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcHpmZC0+bWlkZGxlWSA9IHJlc29seSAvIDI7CiAgICAgICAgICAgIHB6ZmQtPm1pZGRsZVggPSByZXNvbHggLyAyOwogICAgICAgIH0KCiAgICAgICAgaWYgKHB6ZmQtPm1vZGUgPT0gV0FURVJfTU9ERSkgewogICAgICAgICAgcHpmZC0+bWlkZGxlWCA9IHJlc29seCAvIDI7CiAgICAgICAgICBwemZkLT5taWRkbGVZID0gcmVzb2x5IC8gMjsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAodnRtcCA9IChpUkFORCAoZ29vbWRhdGEsIDI3KSkpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgcHpmZC0+dlBsYW5lRWZmZWN0ID0gaVJBTkQgKGdvb21kYXRhLCAzKTsKICAgICAgICAgICAgcHpmZC0+dlBsYW5lRWZmZWN0IC09IGlSQU5EIChnb29tZGF0YSwgMyk7CiAgICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IGlSQU5EIChnb29tZGF0YSwgMyk7CiAgICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCAtPSBpUkFORCAoZ29vbWRhdGEsIDMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcHpmZC0+dlBsYW5lRWZmZWN0ID0gMDsKICAgICAgICAgICAgcHpmZC0+aFBsYW5lRWZmZWN0ID0gaVJBTkQgKGdvb21kYXRhLCA4KTsKICAgICAgICAgICAgcHpmZC0+aFBsYW5lRWZmZWN0IC09IGlSQU5EIChnb29tZGF0YSwgOCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgPSBpUkFORCAoZ29vbWRhdGEsIDUpOwogICAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgLT0gaVJBTkQgKGdvb21kYXRhLCA1KTsKICAgICAgICAgICAgcHpmZC0+aFBsYW5lRWZmZWN0ID0gLXB6ZmQtPnZQbGFuZUVmZmVjdDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IDUgKyBpUkFORCAoZ29vbWRhdGEsIDgpOwogICAgICAgICAgICBwemZkLT52UGxhbmVFZmZlY3QgPSAtcHpmZC0+aFBsYW5lRWZmZWN0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgcHpmZC0+dlBsYW5lRWZmZWN0ID0gNSArIGlSQU5EIChnb29tZGF0YSwgOCk7CiAgICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IC1wemZkLT5oUGxhbmVFZmZlY3Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgcHpmZC0+aFBsYW5lRWZmZWN0ID0gMDsKICAgICAgICAgICAgcHpmZC0+dlBsYW5lRWZmZWN0ID0gaVJBTkQgKGdvb21kYXRhLCAxMCk7CiAgICAgICAgICAgIHB6ZmQtPnZQbGFuZUVmZmVjdCAtPSBpUkFORCAoZ29vbWRhdGEsIDEwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAodnRtcCA8IDEwKSB7CiAgICAgICAgICAgICAgcHpmZC0+dlBsYW5lRWZmZWN0ID0gMDsKICAgICAgICAgICAgICBwemZkLT5oUGxhbmVFZmZlY3QgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoaVJBTkQgKGdvb21kYXRhLCAzKSAhPSAwKQogICAgICAgICAgcHpmZC0+bm9pc2lmeSA9IDA7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBwemZkLT5ub2lzaWZ5ID0gaVJBTkQgKGdvb21kYXRhLCAzKSArIDI7CiAgICAgICAgICBnb29tZGF0YS0+bG9ja3ZhciAqPSAzOwogICAgICAgIH0KCiAgICAgICAgaWYgKHB6ZmQtPm1vZGUgPT0gQU1VTEVUVEVfTU9ERSkgewogICAgICAgICAgcHpmZC0+dlBsYW5lRWZmZWN0ID0gMDsKICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IDA7CiAgICAgICAgICBwemZkLT5ub2lzaWZ5ID0gMDsKICAgICAgICB9CgogICAgICAgIGlmICgocHpmZC0+bWlkZGxlWCA9PSAxKSB8fCAocHpmZC0+bWlkZGxlWCA9PSByZXNvbHggLSAxKSkgewogICAgICAgICAgcHpmZC0+dlBsYW5lRWZmZWN0ID0gMDsKICAgICAgICAgIHB6ZmQtPmhQbGFuZUVmZmVjdCA9IGlSQU5EIChnb29tZGF0YSwgMikgPyAwIDogcHpmZC0+aFBsYW5lRWZmZWN0OwogICAgICAgIH0KCiAgICAgICAgaWYgKG5ld3ZpdCA8IHB6ZmQtPnZpdGVzc2UpIHsgICAvKiBvbiBhY2NlbGVyZSAqLwogICAgICAgICAgemZkX3VwZGF0ZSA9IDE7CiAgICAgICAgICBpZiAoKChuZXd2aXQgPCBTVE9QX1NQRUVEIC0gNykgJiYKICAgICAgICAgICAgICAgICAgKHB6ZmQtPnZpdGVzc2UgPCBTVE9QX1NQRUVEIC0gNikgJiYKICAgICAgICAgICAgICAgICAgKGdvb21kYXRhLT5jeWNsZSAlIDMgPT0gMCkpIHx8IChpUkFORCAoZ29vbWRhdGEsIDQwKSA9PSAwKSkgewogICAgICAgICAgICBwemZkLT52aXRlc3NlID0gU1RPUF9TUEVFRCAtIDE7CiAgICAgICAgICAgIHB6ZmQtPnJldmVyc2UgPSAhcHpmZC0+cmV2ZXJzZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHB6ZmQtPnZpdGVzc2UgPSAobmV3dml0ICsgcHpmZC0+dml0ZXNzZSAqIDQpIC8gNTsKICAgICAgICAgIH0KICAgICAgICAgIGdvb21kYXRhLT5sb2NrdmFyICs9IDUwOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLyogbW9kZSBtZWdhLWxlbnQgKi8KICAgIGlmIChpUkFORCAoZ29vbWRhdGEsIDEwMDApID09IDApIHsKICAgICAgLyogCiAgICAgICAgIHByaW50ZiAoImNvdXAgZHUgc29ydC4uLlxuIikgOwogICAgICAgKi8KICAgICAgemZkX3VwZGF0ZSA9IDE7CiAgICAgIHB6ZmQtPnZpdGVzc2UgPSBTVE9QX1NQRUVEIC0gMTsKICAgICAgcHpmZC0+cGVydGVkZWMgPSA4OwogICAgICBwemZkLT5zcXJ0cGVydGUgPSAxNjsKICAgICAgZ29vbWRhdGEtPmdvb212YXIgPSAxOwogICAgICBnb29tZGF0YS0+bG9ja3ZhciArPSA3MDsKICAgIH0KICB9CgogIC8qIGdyb3MgZnJlaW4gc2kgbGEgbXVzaXF1ZSBlc3QgY2FsbWUgKi8KICBpZiAoKGdvb21kYXRhLT5zcGVlZHZhciA8IDEpICYmIChwemZkLT52aXRlc3NlIDwgU1RPUF9TUEVFRCAtIDQpCiAgICAgICYmIChnb29tZGF0YS0+Y3ljbGUgJSAxNiA9PSAwKSkgewogICAgLyoKICAgICAgIHByaW50ZiAoIisrc2xvdyBwYXJ0Li4uICVpXG4iLCB6ZmQudml0ZXNzZSkgOwogICAgICovCiAgICB6ZmRfdXBkYXRlID0gMTsKICAgIHB6ZmQtPnZpdGVzc2UgKz0gMzsKICAgIHB6ZmQtPnBlcnRlZGVjID0gODsKICAgIHB6ZmQtPnNxcnRwZXJ0ZSA9IDE2OwogICAgZ29vbWRhdGEtPmdvb212YXIgPSAwOwogICAgLyoKICAgICAgIHByaW50ZiAoIi0tc2xvdyBwYXJ0Li4uICVpXG4iLCB6ZmQudml0ZXNzZSkgOwogICAgICovCiAgfQoKICAvKiBiYWlzc2VyIHJlZ3VsaWVyZW1lbnQgbGEgdml0ZXNzZS4uLiAqLwogIGlmICgoZ29vbWRhdGEtPmN5Y2xlICUgNzMgPT0gMCkgJiYgKHB6ZmQtPnZpdGVzc2UgPCBTVE9QX1NQRUVEIC0gNSkpIHsKICAgIC8qCiAgICAgICBwcmludGYgKCJzbG93IGRvd24uLi5cbiIpIDsKICAgICAqLwogICAgemZkX3VwZGF0ZSA9IDE7CiAgICBwemZkLT52aXRlc3NlKys7CiAgfQoKICAvKiBhcnJldGVyIGRlIGRlY3LpbWVudGVyIGF1IGJvdXQgZCd1biBjZXJ0YWluIHRlbXBzICovCiAgaWYgKChnb29tZGF0YS0+Y3ljbGUgJSAxMDEgPT0gMCkgJiYgKHB6ZmQtPnBlcnRlZGVjID09IDcpKSB7CiAgICB6ZmRfdXBkYXRlID0gMTsKICAgIHB6ZmQtPnBlcnRlZGVjID0gODsKICAgIHB6ZmQtPnNxcnRwZXJ0ZSA9IDE2OwogIH0KCiAgLyogWm9vbSBoZXJlICEgKi8KICB6b29tRmlsdGVyRmFzdFJHQiAoZ29vbWRhdGEsIHB6ZmQsIHpmZF91cGRhdGUpOwoKICAvKiBzaSBvbiBlc3QgZGFucyB1biBnb29tIDogYWZmaWNoZXIgbGVzIGxpZ25lcy4uLiAqLwogIGlmIChnb29tZGF0YS0+YWdvb20gPiAxNSkKICAgIGdvb21fbGluZXMgKGdvb21kYXRhLCBkYXRhLCAoKHB6ZmQtPm1pZGRsZVggPT0gcmVzb2x4IC8gMikKICAgICAgICAgICAgJiYgKHB6ZmQtPm1pZGRsZVkgPT0gcmVzb2x5IC8gMikKICAgICAgICAgICAgJiYgKHB6ZmQtPm1vZGUgIT0gV0FURVJfTU9ERSkpCiAgICAgICAgPyAoZ29vbWRhdGEtPmxpbmVNb2RlIC8gMTApIDogMCwgZ29vbWRhdGEtPnAyLCBnb29tZGF0YS0+YWdvb20gLSAxNSk7CgogIHJldHVybl92YWwgPSBnb29tZGF0YS0+cDI7CiAgdG1wID0gZ29vbWRhdGEtPnAxOwogIGdvb21kYXRhLT5wMSA9IGdvb21kYXRhLT5wMjsKICBnb29tZGF0YS0+cDIgPSB0bXA7CgogIC8qIGFmZmljaGFnZSBldCBzd2FwcGFnZSBkZXMgYnVmZmVycy4uICovCiAgZ29vbWRhdGEtPmN5Y2xlKys7CgogIC8qIHRvdXMgbGVzIDEwMCBjeWNsZXMgOiB26XJpZmllciBzaSBsZSB0YXV4IGRlIGdvb20gZXN0IGNvcnJlY3QgKi8KICAvKiBldCBsZSBtb2RpZmllciBzaW5vbi4uICovCiAgaWYgKCEoZ29vbWRhdGEtPmN5Y2xlICUgMTAwKSkgewogICAgaWYgKGdvb21kYXRhLT50b3RhbGdvb20gPiAxNSkgewogICAgICAvKiAgcHJpbnRmICgibGVzcyBnb29tc1xuIikgOyAqLwogICAgICBnb29tZGF0YS0+Z29vbWxpbWl0Kys7CiAgICB9IGVsc2UgewogICAgICBpZiAoKGdvb21kYXRhLT50b3RhbGdvb20gPT0gMCkgJiYgKGdvb21kYXRhLT5nb29tbGltaXQgPiAxKSkKICAgICAgICBnb29tZGF0YS0+Z29vbWxpbWl0LS07CiAgICB9CiAgICBnb29tZGF0YS0+dG90YWxnb29tID0gMDsKICB9CiAgcmV0dXJuIHJldHVybl92YWw7Cn0KCnZvaWQKZ29vbV9jbG9zZSAoR29vbURhdGEgKiBnb29tZGF0YSkKewogIGlmIChnb29tZGF0YS0+cGl4ZWwgIT0gTlVMTCkKICAgIGZyZWUgKGdvb21kYXRhLT5waXhlbCk7CiAgaWYgKGdvb21kYXRhLT5iYWNrICE9IE5VTEwpCiAgICBmcmVlIChnb29tZGF0YS0+YmFjayk7CiAgaWYgKGdvb21kYXRhLT56ZmQgIT0gTlVMTCkgewogICAgem9vbUZpbHRlckRlc3Ryb3kgKGdvb21kYXRhLT56ZmQpOwogICAgZ29vbWRhdGEtPnpmZCA9IE5VTEw7CiAgfQogIGdvb21kYXRhLT5waXhlbCA9IGdvb21kYXRhLT5iYWNrID0gTlVMTDsKICBSQU5EX0NMT1NFIChnb29tZGF0YSk7Cn0K