LyoKICogSVMtSVMgUm91dChlKWluZyBwcm90b2NvbCAtIGlzaXNfdGx2LmMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTLUlTIFRMViByZWxhdGVkIHJvdXRpbmVzCiAqCiAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyICAgU2FtcG8gU2FhcmlzdG8KICogICAgICAgICAgICAgICAgICAgICAgICAgICBUYW1wZXJlIFVuaXZlcnNpdHkgb2YgVGVjaG5vbG9neSAgICAgIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RpdHV0ZSBvZiBDb21tdW5pY2F0aW9ucyBFbmdpbmVlcmluZwogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKICogYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLGJ1dCBXSVRIT1VUIAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCiAqIG1vcmUgZGV0YWlscy4KCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIAogKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAKICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCiAqLwoKI2luY2x1ZGUgPHplYnJhLmg+CgojaW5jbHVkZSAibG9nLmgiCiNpbmNsdWRlICJsaW5rbGlzdC5oIgojaW5jbHVkZSAic3RyZWFtLmgiCiNpbmNsdWRlICJtZW1vcnkuaCIKI2luY2x1ZGUgInByZWZpeC5oIgojaW5jbHVkZSAidnR5LmgiCiNpbmNsdWRlICJpZi5oIgoKI2luY2x1ZGUgImlzaXNkL2RpY3QuaCIKI2luY2x1ZGUgImlzaXNkL2lzaXNfY29uc3RhbnRzLmgiCiNpbmNsdWRlICJpc2lzZC9pc2lzX2NvbW1vbi5oIgojaW5jbHVkZSAiaXNpc2QvaXNpc19mbGFncy5oIgojaW5jbHVkZSAiaXNpc2QvaXNpc19jaXJjdWl0LmgiCiNpbmNsdWRlICJpc2lzZC9pc2lzX3Rsdi5oIgojaW5jbHVkZSAiaXNpc2QvaXNpc2QuaCIKI2luY2x1ZGUgImlzaXNkL2lzaXNfZHluaG4uaCIKI2luY2x1ZGUgImlzaXNkL2lzaXNfbWlzYy5oIgojaW5jbHVkZSAiaXNpc2QvaXNpc19wZHUuaCIKI2luY2x1ZGUgImlzaXNkL2lzaXNfbHNwLmgiCgp2b2lkCmZyZWVfdGx2ICh2b2lkICp2YWwpCnsKICBYRlJFRSAoTVRZUEVfSVNJU19UTFYsIHZhbCk7CgogIHJldHVybjsKfQoKLyoKICogQ2FsbGVkIGFmdGVyIHBhcnNpbmcgb2YgYSBQRFUuIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgdGx2J3MgbGVmdCwgc28gdGhpcwogKiBpcyBvbmx5IGEgY2F1dGlvbiB0byBhdm9pZCBtZW1vcnkgbGVha3MKICovCnZvaWQKZnJlZV90bHZzIChzdHJ1Y3QgdGx2cyAqdGx2cykKewogIGlmICh0bHZzLT5hcmVhX2FkZHJzKQogICAgbGlzdF9kZWxldGUgKHRsdnMtPmFyZWFfYWRkcnMpOwogIGlmICh0bHZzLT5pc19uZWlnaHMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXNfbmVpZ2hzKTsKICBpZiAodGx2cy0+dGVfaXNfbmVpZ2hzKQogICAgbGlzdF9kZWxldGUgKHRsdnMtPnRlX2lzX25laWdocyk7CiAgaWYgKHRsdnMtPmVzX25laWdocykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT5lc19uZWlnaHMpOwogIGlmICh0bHZzLT5sc3BfZW50cmllcykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT5sc3BfZW50cmllcyk7CiAgaWYgKHRsdnMtPnByZWZpeF9uZWlnaHMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+cHJlZml4X25laWdocyk7CiAgaWYgKHRsdnMtPmxhbl9uZWlnaHMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+bGFuX25laWdocyk7CiAgaWYgKHRsdnMtPmlwdjRfYWRkcnMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2NF9hZGRycyk7CiAgaWYgKHRsdnMtPmlwdjRfaW50X3JlYWNocykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT5pcHY0X2ludF9yZWFjaHMpOwogIGlmICh0bHZzLT5pcHY0X2V4dF9yZWFjaHMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2NF9leHRfcmVhY2hzKTsKICBpZiAodGx2cy0+dGVfaXB2NF9yZWFjaHMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+dGVfaXB2NF9yZWFjaHMpOwojaWZkZWYgSEFWRV9JUFY2CiAgaWYgKHRsdnMtPmlwdjZfYWRkcnMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2Nl9hZGRycyk7CiAgaWYgKHRsdnMtPmlwdjZfcmVhY2hzKQogICAgbGlzdF9kZWxldGUgKHRsdnMtPmlwdjZfcmVhY2hzKTsKI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwoKICBtZW1zZXQgKHRsdnMsIDAsIHNpemVvZiAoc3RydWN0IHRsdnMpKTsKCiAgcmV0dXJuOwp9CgovKgogKiBQYXJzZXMgdGhlIHRsdnMgZm91bmQgaW4gdGhlIHZhcmlhbnQgbGVuZ3RoIHBhcnQgb2YgdGhlIFBEVS4KICogQ2FsbGVyIHRlbGxzIHdpdGggZmxhZ3MgaW4gImV4cGVjdGVkIiB3aGljaCBUTFYncyBpdCBpcyBpbnRlcmVzdGVkIGluLgogKi8KaW50CnBhcnNlX3RsdnMgKGNoYXIgKmFyZWF0YWcsIHVfY2hhciAqIHN0cmVhbSwgaW50IHNpemUsIHVfaW50MzJfdCAqIGV4cGVjdGVkLAoJICAgIHVfaW50MzJfdCAqIGZvdW5kLCBzdHJ1Y3QgdGx2cyAqdGx2cywgdV9pbnQzMl90ICphdXRoX3Rsdl9vZmZzZXQpCnsKICB1X2NoYXIgdHlwZSwgbGVuZ3RoOwogIHN0cnVjdCBsYW5fbmVpZ2ggKmxhbl9uZWk7CiAgc3RydWN0IGFyZWFfYWRkciAqYXJlYV9hZGRyOwogIHN0cnVjdCBpc19uZWlnaCAqaXNfbmVpOwogIHN0cnVjdCB0ZV9pc19uZWlnaCAqdGVfaXNfbmVpOwogIHN0cnVjdCBlc19uZWlnaCAqZXNfbmVpOwogIHN0cnVjdCBsc3BfZW50cnkgKmxzcF9lbnRyeTsKICBzdHJ1Y3QgaW5fYWRkciAqaXB2NF9hZGRyOwogIHN0cnVjdCBpcHY0X3JlYWNoYWJpbGl0eSAqaXB2NF9yZWFjaDsKICBzdHJ1Y3QgdGVfaXB2NF9yZWFjaGFiaWxpdHkgKnRlX2lwdjRfcmVhY2g7CiNpZmRlZiBIQVZFX0lQVjYKICBzdHJ1Y3QgaW42X2FkZHIgKmlwdjZfYWRkcjsKICBzdHJ1Y3QgaXB2Nl9yZWFjaGFiaWxpdHkgKmlwdjZfcmVhY2g7CiAgaW50IHByZWZpeF9vY3RldHM7CiNlbmRpZiAvKiBIQVZFX0lQVjYgKi8KICB1X2NoYXIgdmlydHVhbDsKICBpbnQgdmFsdWVfbGVuLCByZXR2YWwgPSBJU0lTX09LOwogIHVfY2hhciAqc3RhcnQgPSBzdHJlYW0sICpwbnQgPSBzdHJlYW0sICplbmRwbnQ7CgogICpmb3VuZCA9IDA7CiAgbWVtc2V0ICh0bHZzLCAwLCBzaXplb2YgKHN0cnVjdCB0bHZzKSk7CgogIHdoaWxlIChwbnQgPCBzdHJlYW0gKyBzaXplIC0gMikKICAgIHsKICAgICAgdHlwZSA9ICpwbnQ7CiAgICAgIGxlbmd0aCA9ICoocG50ICsgMSk7CiAgICAgIHBudCArPSAyOwogICAgICB2YWx1ZV9sZW4gPSAwOwogICAgICBpZiAocG50ICsgbGVuZ3RoID4gc3RyZWFtICsgc2l6ZSkKCXsKCSAgemxvZ193YXJuICgiSVNJUy1UTFYgKCVzKTogVExWICh0eXBlICVkLCBsZW5ndGggJWQpIGV4Y2VlZHMgcGFja2V0ICIKCQkgICAgICJib3VuZGFyaWVzIiwgYXJlYXRhZywgdHlwZSwgbGVuZ3RoKTsKCSAgcmV0dmFsID0gSVNJU19XQVJOSU5HOwoJICBicmVhazsKCX0KICAgICAgc3dpdGNoICh0eXBlKQoJewoJY2FzZSBBUkVBX0FERFJFU1NFUzoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgIHwgCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgQXJlYSBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICB8IAoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfQVJFQV9BRERSUzsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJUTFYgQXJlYSBBZHJlc3NlcyBsZW4gJWQiLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfQVJFQV9BRERSUykKCSAgICB7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIGFyZWFfYWRkciA9IChzdHJ1Y3QgYXJlYV9hZGRyICopIHBudDsKCQkgIHZhbHVlX2xlbiArPSBhcmVhX2FkZHItPmFkZHJfbGVuICsgMTsKCQkgIHBudCArPSBhcmVhX2FkZHItPmFkZHJfbGVuICsgMTsKCQkgIGlmICghdGx2cy0+YXJlYV9hZGRycykKCQkgICAgdGx2cy0+YXJlYV9hZGRycyA9IGxpc3RfbmV3ICgpOwoJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5hcmVhX2FkZHJzLCBhcmVhX2FkZHIpOwoJCX0KCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBwbnQgKz0gbGVuZ3RoOwoJICAgIH0KCSAgYnJlYWs7CgoJY2FzZSBJU19ORUlHSEJPVVJTOgoJICAqZm91bmQgfD0gVExWRkxBR19JU19ORUlHSFM7CiNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwoJICB6bG9nX2RlYnVnICgiSVNJUy1UTFYgKCVzKTogSVMgTmVpZ2hib3VycyBsZW5ndGggJWQiLAoJCSAgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBpZiAoVExWRkxBR19JU19ORUlHSFMgJiAqZXhwZWN0ZWQpCgkgICAgewoJICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0dWFsIEZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICB8IAoJICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICAgICAqLwoJICAgICAgdmlydHVhbCA9ICpwbnQ7CS8qIEZJWE1FOiB3aGF0IGlzIHRoZSB1c2UgZm9yIHRoaXM/ICovCgkgICAgICBwbnQrKzsKCSAgICAgIHZhbHVlX2xlbisrOwoJICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICAgICAqIHwgICAwICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVmYXVsdCBNZXRyaWMgICAgICAgICAgICAgICAgICB8IAoJICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICAgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8CgkgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgICAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFeHBlbnNlIE1ldHJpYyAgICAgICAgICAgICAgICAgIHwKCSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAgICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfAoJICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBOZWlnaGJvdXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgkgICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgICAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICAgICAqLwoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICBpc19uZWkgPSAoc3RydWN0IGlzX25laWdoICopIHBudDsKCQkgIHZhbHVlX2xlbiArPSA0ICsgSVNJU19TWVNfSURfTEVOICsgMTsKCQkgIHBudCArPSA0ICsgSVNJU19TWVNfSURfTEVOICsgMTsKCQkgIGlmICghdGx2cy0+aXNfbmVpZ2hzKQoJCSAgICB0bHZzLT5pc19uZWlnaHMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXNfbmVpZ2hzLCBpc19uZWkpOwoJCX0KCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBwbnQgKz0gbGVuZ3RoOwoJICAgIH0KCSAgYnJlYWs7CgoJY2FzZSBURV9JU19ORUlHSEJPVVJTOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTmVpZ2hib3VyIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBURSBNZXRyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIFN1YlRMVnMgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfVEVfSVNfTkVJR0hTOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IEV4dGVuZGVkIElTIE5laWdoYm91cnMgbGVuZ3RoICVkIiwKCQkgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBpZiAoVExWRkxBR19URV9JU19ORUlHSFMgJiAqZXhwZWN0ZWQpCgkgICAgewoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICB0ZV9pc19uZWkgPSAoc3RydWN0IHRlX2lzX25laWdoICopIHBudDsKCQkgIHZhbHVlX2xlbiArPSAxMTsKCQkgIHBudCArPSAxMTsKCQkgIC8qIEZJWE1FIC0gc3VidGx2cyBhcmUgaGFuZGxlZCBoZXJlLCBmb3Igbm93IHdlIHNraXAgKi8KCQkgIHZhbHVlX2xlbiArPSB0ZV9pc19uZWktPnN1Yl90bHZzX2xlbmd0aDsKCQkgIHBudCArPSB0ZV9pc19uZWktPnN1Yl90bHZzX2xlbmd0aDsKCgkJICBpZiAoIXRsdnMtPnRlX2lzX25laWdocykKCQkgICAgdGx2cy0+dGVfaXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7CgkJICBsaXN0bm9kZV9hZGQgKHRsdnMtPnRlX2lzX25laWdocywgdGVfaXNfbmVpKTsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgRVNfTkVJR0hCT1VSUzoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgIDAgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBEZWZhdWx0IE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXhwZW5zZSBNZXRyaWMgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXJyb3IgTWV0cmljICAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBOZWlnaGJvdXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBOZWlnaGJvdXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CgkgICAqLwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IEVTIE5laWdoYm91cnMgbGVuZ3RoICVkIiwKCQkgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICAqZm91bmQgfD0gVExWRkxBR19FU19ORUlHSFM7CgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0VTX05FSUdIUykKCSAgICB7CgkgICAgICBlc19uZWkgPSAoc3RydWN0IGVzX25laWdoICopIHBudDsKCSAgICAgIHZhbHVlX2xlbiArPSA0OwoJICAgICAgcG50ICs9IDQ7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIC8qIEZJWE1FIEZJWE1FIEZJWE1FIC0gYWRkIHRvIHRoZSBsaXN0ICovCgkJICAvKiAgICAgICAgICBzeXNfaWQtPmlkID0gcG50OyAqLwoJCSAgdmFsdWVfbGVuICs9IElTSVNfU1lTX0lEX0xFTjsKCQkgIHBudCArPSBJU0lTX1NZU19JRF9MRU47CgkJICAvKiAgaWYgKCFlc19uZWktPm5laWdoX2lkcykgZXNfbmVpLT5uZWlnaF9pZHMgPSBzeXNpZDsgKi8KCQl9CgkgICAgICBpZiAoIXRsdnMtPmVzX25laWdocykKCQl0bHZzLT5lc19uZWlnaHMgPSBsaXN0X25ldyAoKTsKCSAgICAgIGxpc3Rub2RlX2FkZCAodGx2cy0+ZXNfbmVpZ2hzLCBlc19uZWkpOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIHBudCArPSBsZW5ndGg7CgkgICAgfQoJICBicmVhazsKCgljYXNlIExBTl9ORUlHSEJPVVJTOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTEFOIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX0xBTl9ORUlHSFM7CiNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwoJICB6bG9nX2RlYnVnICgiSVNJUy1UTFYgKCVzKTogTEFOIE5laWdib3VycyBsZW5ndGggJWQiLAoJCSAgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBpZiAoVExWRkxBR19MQU5fTkVJR0hTICYgKmV4cGVjdGVkKQoJICAgIHsKCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCgkJewoJCSAgbGFuX25laSA9IChzdHJ1Y3QgbGFuX25laWdoICopIHBudDsKCQkgIGlmICghdGx2cy0+bGFuX25laWdocykKCQkgICAgdGx2cy0+bGFuX25laWdocyA9IGxpc3RfbmV3ICgpOwoJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5sYW5fbmVpZ2hzLCBsYW5fbmVpKTsKCQkgIHZhbHVlX2xlbiArPSBFVEhfQUxFTjsKCQkgIHBudCArPSBFVEhfQUxFTjsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgUEFERElORzoKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJUTFYgcGFkZGluZyAlZCIsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBwbnQgKz0gbGVuZ3RoOwoJICBicmVhazsKCgljYXNlIExTUF9FTlRSSUVTOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgUmVtYWluaW5nIExpZmV0aW1lICAgICAgICAgICAgICAgICAgICAgICAgfCAyCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgTFNQIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlkKzIKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICBMU1AgU2VxdWVuY2UgTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgIHygNAoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tzdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqLwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IExTUCBFbnRyaWVzIGxlbmd0aCAlZCIsIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICAqZm91bmQgfD0gVExWRkxBR19MU1BfRU5UUklFUzsKCSAgaWYgKFRMVkZMQUdfTFNQX0VOVFJJRVMgJiAqZXhwZWN0ZWQpCgkgICAgewoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICBsc3BfZW50cnkgPSAoc3RydWN0IGxzcF9lbnRyeSAqKSBwbnQ7CgkJICB2YWx1ZV9sZW4gKz0gMTAgKyBJU0lTX1NZU19JRF9MRU47CgkJICBwbnQgKz0gMTAgKyBJU0lTX1NZU19JRF9MRU47CgkJICBpZiAoIXRsdnMtPmxzcF9lbnRyaWVzKQoJCSAgICB0bHZzLT5sc3BfZW50cmllcyA9IGxpc3RfbmV3ICgpOwoJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5sc3BfZW50cmllcywgbHNwX2VudHJ5KTsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgQ0hFQ0tTVU06CgkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgMTYgYml0IGZsZXRjaGVyIENIRUNLU1VNICAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CgkgICAqLwoJICAqZm91bmQgfD0gVExWRkxBR19DSEVDS1NVTTsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBDaGVja3N1bSBsZW5ndGggJWQiLCBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfQ0hFQ0tTVU0pCgkgICAgewoJICAgICAgdGx2cy0+Y2hlY2tzdW0gPSAoc3RydWN0IGNoZWNrc3VtICopIHBudDsKCSAgICB9CgkgIHBudCArPSBsZW5ndGg7CgkgIGJyZWFrOwoKCWNhc2UgUFJPVE9DT0xTX1NVUFBPUlRFRDoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgTkxQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX05MUElEOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IFByb3RvY29scyBTdXBwb3J0ZWQgbGVuZ3RoICVkIiwKCQkgICAgICBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfTkxQSUQpCgkgICAgewoJICAgICAgdGx2cy0+bmxwaWRzID0gKHN0cnVjdCBubHBpZHMgKikgKHBudCAtIDEpOwoJICAgIH0KCSAgcG50ICs9IGxlbmd0aDsKCSAgYnJlYWs7CgoJY2FzZSBJUFY0X0FERFI6CgkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqICsgICAgICAgICAgICAgICAgIElQIHZlcnNpb24gNCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICArIDQKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX0lQVjRfQUREUjsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBJUHY0IEFkZHJlc3MgbGVuZ3RoICVkIiwKCQkgICAgICBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfSVBWNF9BRERSKQoJICAgIHsKCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCgkJewoJCSAgaXB2NF9hZGRyID0gKHN0cnVjdCBpbl9hZGRyICopIHBudDsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkJICB6bG9nX2RlYnVnICgiSVNJUy1UTFYgKCVzKSA6IElQIEFERFIgJXMsIHBudCAlcCIsIGFyZWF0YWcsCgkJCSAgICAgIGluZXRfbnRvYSAoKmlwdjRfYWRkciksIHBudCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJCSAgaWYgKCF0bHZzLT5pcHY0X2FkZHJzKQoJCSAgICB0bHZzLT5pcHY0X2FkZHJzID0gbGlzdF9uZXcgKCk7CgkJICBsaXN0bm9kZV9hZGQgKHRsdnMtPmlwdjRfYWRkcnMsIGlwdjRfYWRkcik7CgkJICB2YWx1ZV9sZW4gKz0gNDsKCQkgIHBudCArPSA0OwoJCX0KCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBwbnQgKz0gbGVuZ3RoOwoJICAgIH0KCSAgYnJlYWs7CgoJY2FzZSBBVVRIX0lORk86CgkgICpmb3VuZCB8PSBUTFZGTEFHX0FVVEhfSU5GTzsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBJUy1JUyBBdXRoZW50aWNhdGlvbiBJbmZvcm1hdGlvbiIsCgkJICAgICAgYXJlYXRhZyk7CiNlbmRpZgoJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19BVVRIX0lORk8pCgkgICAgewoJICAgICAgdGx2cy0+YXV0aF9pbmZvLnR5cGUgPSAqcG50OwogICAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgemxvZ193YXJuICgiSVNJUy1UTFYgKCVzKTogVExWICh0eXBlICVkLCBsZW5ndGggJWQpICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb3JyZWN0LiIsIGFyZWF0YWcsIHR5cGUsIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLS1sZW5ndGg7CgkgICAgICB0bHZzLT5hdXRoX2luZm8ubGVuID0gbGVuZ3RoOwoJICAgICAgcG50Kys7CgkgICAgICBtZW1jcHkgKHRsdnMtPmF1dGhfaW5mby5wYXNzd2QsIHBudCwgbGVuZ3RoKTsKICAgICAgICAgICAgICAvKiBSZXR1cm4gdGhlIGF1dGhlbnRpY2F0aW9uIHRsdiBwb3MgZm9yIGxhdGVyIGNvbXB1dGF0aW9uCiAgICAgICAgICAgICAgICogb2YgTUQ1IChSRkMgNTMwNCwgMikKICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICBpZiAoYXV0aF90bHZfb2Zmc2V0KQogICAgICAgICAgICAgICAgKmF1dGhfdGx2X29mZnNldCArPSAocG50IC0gc3RhcnQgLSAzKTsKICAgICAgICAgICAgICBwbnQgKz0gbGVuZ3RoOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIHBudCArPSBsZW5ndGg7CgkgICAgfQoJICBicmVhazsKCgljYXNlIERZTkFNSUNfSE9TVE5BTUU6CgkgICpmb3VuZCB8PSBUTFZGTEFHX0RZTl9IT1NUTkFNRTsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBEeW5hbWljIEhvc3RuYW1lIGxlbmd0aCAlZCIsCgkJICAgICAgYXJlYXRhZywgbGVuZ3RoKTsKI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0RZTl9IT1NUTkFNRSkKCSAgICB7CgkgICAgICAvKiB0aGUgbGVuZ3RoIGlzIGFsc28gaW5jbHVkZWQgaW4gdGhlIHBvaW50ZWQgc3RydWN0ICovCgkgICAgICB0bHZzLT5ob3N0bmFtZSA9IChzdHJ1Y3QgaG9zdG5hbWUgKikgKHBudCAtIDEpOwoJICAgIH0KCSAgcG50ICs9IGxlbmd0aDsKCSAgYnJlYWs7CgoJY2FzZSBURV9ST1VURVJfSUQ6CgkgIC8qICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqICsgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVyIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDQKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX1RFX1JPVVRFUl9JRDsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBURSBSb3V0ZXIgSUQgJWQiLCBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfVEVfUk9VVEVSX0lEKQoJICAgIHRsdnMtPnJvdXRlcl9pZCA9IChzdHJ1Y3QgdGVfcm91dGVyX2lkICopIChwbnQpOwoJICBwbnQgKz0gbGVuZ3RoOwoJICBicmVhazsKCgljYXNlIElQVjRfSU5UX1JFQUNIQUJJTElUWToKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgIDAgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBEZWZhdWx0IE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlbGF5IE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfCAxCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXhwZW5zZSBNZXRyaWMgICAgICAgICAgICAgICAgICB8IDEKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFcnJvciBNZXRyaWMgICAgICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgaXAgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX0lQVjRfSU5UX1JFQUNIQUJJTElUWTsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBJUHY0IGludGVybmFsIFJlYWNoYWJpbGl0eSBsZW5ndGggJWQiLAoJCSAgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY0X0lOVF9SRUFDSEFCSUxJVFkpCgkgICAgewoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICBpcHY0X3JlYWNoID0gKHN0cnVjdCBpcHY0X3JlYWNoYWJpbGl0eSAqKSBwbnQ7CgkJICBpZiAoIXRsdnMtPmlwdjRfaW50X3JlYWNocykKCQkgICAgdGx2cy0+aXB2NF9pbnRfcmVhY2hzID0gbGlzdF9uZXcgKCk7CgkJICBsaXN0bm9kZV9hZGQgKHRsdnMtPmlwdjRfaW50X3JlYWNocywgaXB2NF9yZWFjaCk7CgkJICB2YWx1ZV9sZW4gKz0gMTI7CgkJICBwbnQgKz0gMTI7CgkJfQoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIHBudCArPSBsZW5ndGg7CgkgICAgfQoJICBicmVhazsKCgljYXNlIElQVjRfRVhUX1JFQUNIQUJJTElUWToKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgIDAgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBEZWZhdWx0IE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlbGF5IE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfCAxCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXhwZW5zZSBNZXRyaWMgICAgICAgICAgICAgICAgICB8IDEKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFcnJvciBNZXRyaWMgICAgICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgaXAgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX0lQVjRfRVhUX1JFQUNIQUJJTElUWTsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBJUHY0IGV4dGVybmFsIFJlYWNoYWJpbGl0eSBsZW5ndGggJWQiLAoJCSAgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY0X0VYVF9SRUFDSEFCSUxJVFkpCgkgICAgewoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICBpcHY0X3JlYWNoID0gKHN0cnVjdCBpcHY0X3JlYWNoYWJpbGl0eSAqKSBwbnQ7CgkJICBpZiAoIXRsdnMtPmlwdjRfZXh0X3JlYWNocykKCQkgICAgdGx2cy0+aXB2NF9leHRfcmVhY2hzID0gbGlzdF9uZXcgKCk7CgkJICBsaXN0bm9kZV9hZGQgKHRsdnMtPmlwdjRfZXh0X3JlYWNocywgaXB2NF9yZWFjaCk7CgkJICB2YWx1ZV9sZW4gKz0gMTI7CgkJICBwbnQgKz0gMTI7CgkJfQoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIHBudCArPSBsZW5ndGg7CgkgICAgfQoJICBicmVhazsKCgljYXNlIFRFX0lQVjRfUkVBQ0hBQklMSVRZOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgVEUgTWV0cmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0CgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgIFUvRCAgfCBzVExWPyB8ICAgICAgICAgICAgICAgUHJlZml4IE1hc2sgTGVuICAgICAgICAgICAgICAgICB8IDEKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMC00CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgc3ViIHRsdnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CgkgICAqLwoJICAqZm91bmQgfD0gVExWRkxBR19URV9JUFY0X1JFQUNIQUJJTElUWTsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBJUHY0IGV4dGVuZGVkIFJlYWNoYWJpbGl0eSBsZW5ndGggJWQiLAoJCSAgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBlbmRwbnQgPSBwbnQgKyBsZW5ndGg7CgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX1RFX0lQVjRfUkVBQ0hBQklMSVRZKQoJICAgIHsKCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCgkJewoJCSAgdGVfaXB2NF9yZWFjaCA9IChzdHJ1Y3QgdGVfaXB2NF9yZWFjaGFiaWxpdHkgKikgcG50OwoJCSAgaWYgKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgPiBJUFY0X01BWF9CSVRMRU4pCgkJICAgIHsKCQkgICAgICB6bG9nX3dhcm4gKCJJU0lTLVRMViAoJXMpOiBpbnZhbGlkIElQdjQgZXh0ZW5kZWQgcmVhY2giCgkJCQkgImFiaWxpdHkgcHJlZml4IGxlbmd0aCAlZCIsIGFyZWF0YWcsCgkJCQkgdGVfaXB2NF9yZWFjaC0+Y29udHJvbCAmIDB4M0YpOwoJCSAgICAgIHJldHZhbCA9IElTSVNfV0FSTklORzsKCQkgICAgICBicmVhazsKCQkgICAgfQoJCSAgaWYgKCF0bHZzLT50ZV9pcHY0X3JlYWNocykKCQkgICAgdGx2cy0+dGVfaXB2NF9yZWFjaHMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+dGVfaXB2NF9yZWFjaHMsIHRlX2lwdjRfcmVhY2gpOwoJCSAgLyogdGhpcyB0cmlja2VyeSBpcyBwZXJtaXRhYmxlIHNpbmNlIG5vIHN1YnRsdnMgYXJlIGRlZmluZWQgKi8KCQkgIHZhbHVlX2xlbiArPSA1ICsgKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgPwoJCQkJICAgICgoKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgLQoJCQkJICAgICAgIDEpID4+IDMpICsgMSkgOiAwKTsKCQkgIHBudCArPSA1ICsgKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgPwoJCSAgICAgICAgICAgICAgKCgoKHRlX2lwdjRfcmVhY2gtPmNvbnRyb2wgJiAweDNGKSAtIDEpID4+IDMpICsgMSkgOiAwKTsKCQl9CgkgICAgfQoKCSAgcG50ID0gZW5kcG50OwoJICBicmVhazsKCiNpZmRlZiAgSEFWRV9JUFY2CgljYXNlIElQVjZfQUREUjoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogKyAgICAgICAgICAgICAgICAgSVAgdmVyc2lvbiA2IGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICsgMTYKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX0lQVjZfQUREUjsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBJUHY2IEFkZHJlc3MgbGVuZ3RoICVkIiwKCQkgICAgICBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfSVBWNl9BRERSKQoJICAgIHsKCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCgkJewoJCSAgaXB2Nl9hZGRyID0gKHN0cnVjdCBpbjZfYWRkciAqKSBwbnQ7CgkJICBpZiAoIXRsdnMtPmlwdjZfYWRkcnMpCgkJICAgIHRsdnMtPmlwdjZfYWRkcnMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXB2Nl9hZGRycywgaXB2Nl9hZGRyKTsKCQkgIHZhbHVlX2xlbiArPSAxNjsKCQkgIHBudCArPSAxNjsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgSVBWNl9SRUFDSEFCSUxJVFk6CgkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgIERlZmF1bHQgTWV0cmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQgCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIEluZm9ybWFudGlvbiAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBJUHY2IFByZWZpeCBMZW5ndGggICAgICAgICAgICAgICAgICAgICB8LS0rCgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8CgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBJUHY2IFByZWZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8PC0rCgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqLwoJICAqZm91bmQgfD0gVExWRkxBR19JUFY2X1JFQUNIQUJJTElUWTsKCSAgZW5kcG50ID0gcG50ICsgbGVuZ3RoOwoKCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfSVBWNl9SRUFDSEFCSUxJVFkpCgkgICAgewoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICBpcHY2X3JlYWNoID0gKHN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSAqKSBwbnQ7CgkJICBpZiAoaXB2Nl9yZWFjaC0+cHJlZml4X2xlbiA+IElQVjZfTUFYX0JJVExFTikKCQkgICAgewoJCSAgICAgIHpsb2dfd2FybiAoIklTSVMtVExWICglcyk6IGludmFsaWQgSVB2NiBleHRlbmRlZCByZWFjaCIKCQkJCSAiYWJpbGl0eSBwcmVmaXggbGVuZ3RoICVkIiwgYXJlYXRhZywKCQkJCSBpcHY2X3JlYWNoLT5wcmVmaXhfbGVuKTsKCQkgICAgICByZXR2YWwgPSBJU0lTX1dBUk5JTkc7CgkJICAgICAgYnJlYWs7CgkJICAgIH0KCgkJICBwcmVmaXhfb2N0ZXRzID0gKChpcHY2X3JlYWNoLT5wcmVmaXhfbGVuICsgNykgLyA4KTsKCQkgIHZhbHVlX2xlbiArPSBwcmVmaXhfb2N0ZXRzICsgNjsKCQkgIHBudCArPSBwcmVmaXhfb2N0ZXRzICsgNjsKCQkgIC8qIEZJWE1FOiBzdWItdGx2cyAqLwoJCSAgaWYgKCF0bHZzLT5pcHY2X3JlYWNocykKCQkgICAgdGx2cy0+aXB2Nl9yZWFjaHMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXB2Nl9yZWFjaHMsIGlwdjZfcmVhY2gpOwoJCX0KCSAgICB9CgoJICBwbnQgPSBlbmRwbnQ7CgkgIGJyZWFrOwojZW5kaWYgLyogSEFWRV9JUFY2ICovCgoJY2FzZSBXQVkzX0hFTExPOgoJICAvKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgQWRqYWNlbmN5IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxCgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICBFeHRlbmRlZCBMb2NhbCBDaXJjdWl0IElEICAgICAgICAgICAgICAgICAgICB8IDQKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgIE5laWdoYm9yIFN5c3RlbSBJRCAoSWYga25vd24pICAgICAgICAgICAgICAgIHwgMC04CgkgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvYmFibHkgNikKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgIE5laWdoYm9yIExvY2FsIENpcmN1aXQgSUQgKElmIGtub3duKSAgICAgICAgIHwgNAoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfM1dBWV9IRUxMTzsKCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfM1dBWV9IRUxMTykKCSAgICB7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIC8qIEZJWE1FOiBtYWtlIHRoaXMgd29yayAqLwovKiAgICAgICAgICAgQWRqYWNlbmN5IFN0YXRlIChvbmUgb2N0ZXQpOgogICAgICAgICAgICAgIDAgPSBVcAogICAgICAgICAgICAgIDEgPSBJbml0aWFsaXppbmcKICAgICAgICAgICAgICAyID0gRG93bgogICAgICAgICAgICBFeHRlbmRlZCBMb2NhbCBDaXJjdWl0IElEIChmb3VyIG9jdGV0cykKICAgICAgICAgICAgTmVpZ2hib3IgU3lzdGVtIElEIGlmIGtub3duICh6ZXJvIHRvIGVpZ2h0IG9jdGV0cykKICAgICAgICAgICAgTmVpZ2hib3IgRXh0ZW5kZWQgTG9jYWwgQ2lyY3VpdCBJRCAoZm91ciBvY3RldHMsIGlmIE5laWdoYm9yCiAgICAgICAgICAgICAgU3lzdGVtIElEIGlzIHByZXNlbnQpICovCgkJICBwbnQgKz0gbGVuZ3RoOwoJCSAgdmFsdWVfbGVuICs9IGxlbmd0aDsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgoJICBicmVhazsKCWNhc2UgR1JBQ0VGVUxfUkVTVEFSVDoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgIHwgIFNBICAgfCAgUkEgICB8ICBSUiAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1haW5pbmcgVGltZSAgICAgICAgICAgICAgICAgICAgICAgfCAyCgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgUmVzdGFydGluZyBOZWlnaGJvciBJRCAoSWYga25vd24pICAgICAgICAgICAgICB8IDAtOAoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfR1JBQ0VGVUxfUkVTVEFSVDsKCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfR1JBQ0VGVUxfUkVTVEFSVCkKCSAgICB7CgkgICAgICAvKiBGSVhNRTogbWFrZSB0aGlzIHdvcmsgKi8KCSAgICB9CgkgIHBudCArPSBsZW5ndGg7CgkgIGJyZWFrOwoKCWRlZmF1bHQ6CgkgIHpsb2dfd2FybiAoIklTSVMtVExWICglcyk6IHVuc3VwcG9ydGVkIFRMViB0eXBlICVkLCBsZW5ndGggJWQiLAoJCSAgICAgYXJlYXRhZywgdHlwZSwgbGVuZ3RoKTsKCgkgIHJldHZhbCA9IElTSVNfV0FSTklORzsKCSAgcG50ICs9IGxlbmd0aDsKCSAgYnJlYWs7Cgl9CiAgICB9CgogIHJldHVybiByZXR2YWw7Cn0KCmludAphZGRfdGx2ICh1X2NoYXIgdGFnLCB1X2NoYXIgbGVuLCB1X2NoYXIgKiB2YWx1ZSwgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CiAgaWYgKChzdHJlYW1fZ2V0X3NpemUgKHN0cmVhbSkgLSBzdHJlYW1fZ2V0X2VuZHAgKHN0cmVhbSkpIDwKICAgICAgKCgodW5zaWduZWQpbGVuKSArIDIpKQogICAgewogICAgICB6bG9nX3dhcm4gKCJObyByb29tIGZvciBUTFYgb2YgdHlwZSAlZCAiCiAgICAgICAgICAgICAgICAgIih0b3RhbCBzaXplICVkIGF2YWlsYWJsZSAlZCByZXF1aXJlZCAlZCkiLAogICAgICAgICAgICAgICAgIHRhZywgKGludClzdHJlYW1fZ2V0X3NpemUgKHN0cmVhbSksCiAgICAgICAgICAgICAgICAgKGludCkoc3RyZWFtX2dldF9zaXplIChzdHJlYW0pIC0gc3RyZWFtX2dldF9lbmRwIChzdHJlYW0pKSwKICAgICAgICAgICAgICAgICBsZW4rMik7CiAgICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CiAgICB9CgogIHN0cmVhbV9wdXRjIChzdHJlYW0sIHRhZyk7CS8qIFRBRyAqLwogIHN0cmVhbV9wdXRjIChzdHJlYW0sIGxlbik7CS8qIExFTkdUSCAqLwogIHN0cmVhbV9wdXQgKHN0cmVhbSwgdmFsdWUsIChpbnQpIGxlbik7CS8qIFZBTFVFICovCgojaWZkZWYgRVhUUkVNRV9ERUJVRwogIHpsb2dfZGVidWcgKCJBZGRlZCBUTFYgJWQgbGVuICVkIiwgdGFnLCBsZW4pOwojZW5kaWYgLyogRVhUUkVNRSBERUJVRyAqLwogIHJldHVybiBJU0lTX09LOwp9CgppbnQKdGx2X2FkZF9hcmVhX2FkZHJzIChzdHJ1Y3QgbGlzdCAqYXJlYV9hZGRycywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CiAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogIHN0cnVjdCBhcmVhX2FkZHIgKmFyZWFfYWRkcjsKCiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKCiAgZm9yIChBTExfTElTVF9FTEVNRU5UU19STyAoYXJlYV9hZGRycywgbm9kZSwgYXJlYV9hZGRyKSkKICAgIHsKICAgICAgaWYgKHBvcyAtIHZhbHVlICsgYXJlYV9hZGRyLT5hZGRyX2xlbiA+IDI1NSkKCWdvdG8gZXJyOwogICAgICAqcG9zID0gYXJlYV9hZGRyLT5hZGRyX2xlbjsKICAgICAgcG9zKys7CiAgICAgIG1lbWNweSAocG9zLCBhcmVhX2FkZHItPmFyZWFfYWRkciwgKGludCkgYXJlYV9hZGRyLT5hZGRyX2xlbik7CiAgICAgIHBvcyArPSBhcmVhX2FkZHItPmFkZHJfbGVuOwogICAgfQoKICByZXR1cm4gYWRkX3RsdiAoQVJFQV9BRERSRVNTRVMsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKCmVycjoKICB6bG9nX3dhcm4gKCJ0bHZfYWRkX2FyZWFfYWRkcnMoKTogVExWIGxvbmdlciB0aGFuIDI1NSIpOwogIHJldHVybiBJU0lTX1dBUk5JTkc7Cn0KCmludAp0bHZfYWRkX2lzX25laWdocyAoc3RydWN0IGxpc3QgKmlzX25laWdocywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CiAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogIHN0cnVjdCBpc19uZWlnaCAqaXNfbmVpZ2g7CiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICBpbnQgcmV0dmFsOwoKICAqcG9zID0gMDsJCQkvKmlzX25laWdoLT52aXJ0dWFsOyAqLwogIHBvcysrOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTX1JPIChpc19uZWlnaHMsIG5vZGUsIGlzX25laWdoKSkKICAgIHsKICAgICAgaWYgKHBvcyAtIHZhbHVlICsgSVNfTkVJR0hCT1VSU19MRU4gPiAyNTUpCgl7CgkgIHJldHZhbCA9IGFkZF90bHYgKElTX05FSUdIQk9VUlMsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKCSAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQoJICAgIHJldHVybiByZXR2YWw7CgkgIHBvcyA9IHZhbHVlOwoJfQogICAgICAqcG9zID0gaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2RlZmF1bHQ7CiAgICAgIHBvcysrOwogICAgICAqcG9zID0gaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2RlbGF5OwogICAgICBwb3MrKzsKICAgICAgKnBvcyA9IGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19leHBlbnNlOwogICAgICBwb3MrKzsKICAgICAgKnBvcyA9IGlzX25laWdoLT5tZXRyaWNzLm1ldHJpY19lcnJvcjsKICAgICAgcG9zKys7CiAgICAgIG1lbWNweSAocG9zLCBpc19uZWlnaC0+bmVpZ2hfaWQsIElTSVNfU1lTX0lEX0xFTiArIDEpOwogICAgICBwb3MgKz0gSVNJU19TWVNfSURfTEVOICsgMTsKICAgIH0KCiAgcmV0dXJuIGFkZF90bHYgKElTX05FSUdIQk9VUlMsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKfQoKaW50CnRsdl9hZGRfdGVfaXNfbmVpZ2hzIChzdHJ1Y3QgbGlzdCAqdGVfaXNfbmVpZ2hzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgc3RydWN0IHRlX2lzX25laWdoICp0ZV9pc19uZWlnaDsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIGludCByZXR2YWw7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFNfUk8gKHRlX2lzX25laWdocywgbm9kZSwgdGVfaXNfbmVpZ2gpKQogICAgewogICAgICAvKiBGSVhNRTogVGhpcyB3aWxsIGJlIHdyb25nIGlmIHdlIGFyZSBnb2luZyB0byBhZGQgVEUgc3ViIFRMVnMuICovCiAgICAgIGlmIChwb3MgLSB2YWx1ZSArIElTX05FSUdIQk9VUlNfTEVOID4gMjU1KQogICAgICAgIHsKICAgICAgICAgIHJldHZhbCA9IGFkZF90bHYgKFRFX0lTX05FSUdIQk9VUlMsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKICAgICAgICAgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKICAgICAgICAgIHBvcyA9IHZhbHVlOwogICAgICAgIH0KICAgICAgCiAgICAgIG1lbWNweSAocG9zLCB0ZV9pc19uZWlnaC0+bmVpZ2hfaWQsIElTSVNfU1lTX0lEX0xFTiArIDEpOwogICAgICBwb3MgKz0gSVNJU19TWVNfSURfTEVOICsgMTsKICAgICAgbWVtY3B5IChwb3MsIHRlX2lzX25laWdoLT50ZV9tZXRyaWMsIDMpOwogICAgICBwb3MgKz0gMzsKICAgICAgLyogU3ViIFRMVnMgbGVuZ3RoLiAqLwogICAgICAqcG9zID0gMDsKICAgICAgcG9zKys7CiAgICB9CgogIHJldHVybiBhZGRfdGx2IChURV9JU19ORUlHSEJPVVJTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KCmludAp0bHZfYWRkX2xhbl9uZWlnaHMgKHN0cnVjdCBsaXN0ICpsYW5fbmVpZ2hzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgdV9jaGFyICpzbnBhOwogIHVfY2hhciB2YWx1ZVsyNTVdOwogIHVfY2hhciAqcG9zID0gdmFsdWU7CiAgaW50IHJldHZhbDsKCiAgZm9yIChBTExfTElTVF9FTEVNRU5UU19STyAobGFuX25laWdocywgbm9kZSwgc25wYSkpCiAgICB7CiAgICAgIGlmIChwb3MgLSB2YWx1ZSArIEVUSF9BTEVOID4gMjU1KQoJewoJICByZXR2YWwgPSBhZGRfdGx2IChMQU5fTkVJR0hCT1VSUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwoJICBpZiAocmV0dmFsICE9IElTSVNfT0spCgkgICAgcmV0dXJuIHJldHZhbDsKCSAgcG9zID0gdmFsdWU7Cgl9CiAgICAgIG1lbWNweSAocG9zLCBzbnBhLCBFVEhfQUxFTik7CiAgICAgIHBvcyArPSBFVEhfQUxFTjsKICAgIH0KCiAgcmV0dXJuIGFkZF90bHYgKExBTl9ORUlHSEJPVVJTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KCmludAp0bHZfYWRkX25scGlkIChzdHJ1Y3QgbmxwaWRzICpubHBpZHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHJldHVybiBhZGRfdGx2IChQUk9UT0NPTFNfU1VQUE9SVEVELCBubHBpZHMtPmNvdW50LCBubHBpZHMtPm5scGlkcywgc3RyZWFtKTsKfQoKaW50CnRsdl9hZGRfYXV0aGluZm8gKHVfY2hhciBhdXRoX3R5cGUsIHVfY2hhciBhdXRoX2xlbiwgdV9jaGFyICphdXRoX3ZhbHVlLAoJCSAgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICAqcG9zKysgPSBhdXRoX3R5cGU7CiAgbWVtY3B5IChwb3MsIGF1dGhfdmFsdWUsIGF1dGhfbGVuKTsKCiAgcmV0dXJuIGFkZF90bHYgKEFVVEhfSU5GTywgYXV0aF9sZW4gKyAxLCB2YWx1ZSwgc3RyZWFtKTsKfQoKaW50CnRsdl9hZGRfY2hlY2tzdW0gKHN0cnVjdCBjaGVja3N1bSAqY2hlY2tzdW0sIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHVfY2hhciB2YWx1ZVsyNTVdOwogIHVfY2hhciAqcG9zID0gdmFsdWU7CiAgcmV0dXJuIGFkZF90bHYgKENIRUNLU1VNLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KCmludAp0bHZfYWRkX2lwX2FkZHJzIChzdHJ1Y3QgbGlzdCAqaXBfYWRkcnMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICBzdHJ1Y3QgcHJlZml4X2lwdjQgKmlwdjQ7CiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICBpbnQgcmV0dmFsOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTX1JPIChpcF9hZGRycywgbm9kZSwgaXB2NCkpCiAgICB7CiAgICAgIGlmIChwb3MgLSB2YWx1ZSArIElQVjRfTUFYX0JZVEVMRU4gPiAyNTUpCgl7CgkgIC8qIFJGQyAxMTk1IHM0LjI6IG9ubHkgb25lIHR1cGxlIG9mIDYzIGFsbG93ZWQuICovCgkgIHpsb2dfd2FybiAoInRsdl9hZGRfaXBfYWRkcnMoKTogY3V0dGluZyBvZmYgYXQgNjMgSVAgYWRkcmVzc2VzIik7CgkgIGJyZWFrOwoJfQogICAgICAqKHVfaW50MzJfdCAqKSBwb3MgPSBpcHY0LT5wcmVmaXguc19hZGRyOwogICAgICBwb3MgKz0gSVBWNF9NQVhfQllURUxFTjsKICAgIH0KCiAgcmV0dXJuIGFkZF90bHYgKElQVjRfQUREUiwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwp9CgovKiBVc2VkIHRvIGFkZCBUTFYgY29udGFpbmluZyBqdXN0IG9uZSBJUHY0IGFkZHJlc3MgLSBlaXRoZXIgSVB2NCBhZGRyZXNzIFRMVgogKiAoaW4gY2FzZSBvZiBMU1ApIG9yIFRFIHJvdXRlciBJRCBUTFYuICovCmludAp0bHZfYWRkX2luX2FkZHIgKHN0cnVjdCBpbl9hZGRyICphZGRyLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sIHVfY2hhciB0YWcpCnsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIAogIG1lbWNweSAocG9zLCBhZGRyLCBJUFY0X01BWF9CWVRFTEVOKTsKICBwb3MgKz0gSVBWNF9NQVhfQllURUxFTjsKCiAgcmV0dXJuIGFkZF90bHYgKHRhZywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwp9CgppbnQKdGx2X2FkZF9keW5hbWljX2hvc3RuYW1lIChzdHJ1Y3QgaG9zdG5hbWUgKmhvc3RuYW1lLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICByZXR1cm4gYWRkX3RsdiAoRFlOQU1JQ19IT1NUTkFNRSwgaG9zdG5hbWUtPm5hbWVsZW4sIGhvc3RuYW1lLT5uYW1lLAoJCSAgc3RyZWFtKTsKfQoKaW50CnRsdl9hZGRfbHNwX2VudHJpZXMgKHN0cnVjdCBsaXN0ICpsc3BzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgc3RydWN0IGlzaXNfbHNwICpsc3A7CiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICBpbnQgcmV0dmFsOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTX1JPIChsc3BzLCBub2RlLCBsc3ApKQogICAgewogICAgICBpZiAocG9zIC0gdmFsdWUgKyBMU1BfRU5UUklFU19MRU4gPiAyNTUpCgl7CgkgIHJldHZhbCA9IGFkZF90bHYgKExTUF9FTlRSSUVTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CgkgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKCSAgICByZXR1cm4gcmV0dmFsOwoJICBwb3MgPSB2YWx1ZTsKCX0KICAgICAgKigodV9pbnQxNl90ICopIHBvcykgPSBsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZTsKICAgICAgcG9zICs9IDI7CiAgICAgIG1lbWNweSAocG9zLCBsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCwgSVNJU19TWVNfSURfTEVOICsgMik7CiAgICAgIHBvcyArPSBJU0lTX1NZU19JRF9MRU4gKyAyOwogICAgICAqKCh1X2ludDMyX3QgKikgcG9zKSA9IGxzcC0+bHNwX2hlYWRlci0+c2VxX251bTsKICAgICAgcG9zICs9IDQ7CiAgICAgICooKHVfaW50MTZfdCAqKSBwb3MpID0gbHNwLT5sc3BfaGVhZGVyLT5jaGVja3N1bTsKICAgICAgcG9zICs9IDI7CiAgICB9CgogIHJldHVybiBhZGRfdGx2IChMU1BfRU5UUklFUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwp9CgppbnQKdGx2X2FkZF9pcHY0X3JlYWNocyAoc3RydWN0IGxpc3QgKmlwdjRfcmVhY2hzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgc3RydWN0IGlwdjRfcmVhY2hhYmlsaXR5ICpyZWFjaDsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIGludCByZXR2YWw7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFNfUk8gKGlwdjRfcmVhY2hzLCBub2RlLCByZWFjaCkpCiAgICB7CiAgICAgIGlmIChwb3MgLSB2YWx1ZSArIElQVjRfUkVBQ0hfTEVOID4gMjU1KQoJewoJICByZXR2YWwgPQoJICAgIGFkZF90bHYgKElQVjRfSU5UX1JFQUNIQUJJTElUWSwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwoJICBpZiAocmV0dmFsICE9IElTSVNfT0spCgkgICAgcmV0dXJuIHJldHZhbDsKCSAgcG9zID0gdmFsdWU7Cgl9CiAgICAgICpwb3MgPSByZWFjaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdDsKICAgICAgcG9zKys7CiAgICAgICpwb3MgPSByZWFjaC0+bWV0cmljcy5tZXRyaWNfZGVsYXk7CiAgICAgIHBvcysrOwogICAgICAqcG9zID0gcmVhY2gtPm1ldHJpY3MubWV0cmljX2V4cGVuc2U7CiAgICAgIHBvcysrOwogICAgICAqcG9zID0gcmVhY2gtPm1ldHJpY3MubWV0cmljX2Vycm9yOwogICAgICBwb3MrKzsKICAgICAgKih1X2ludDMyX3QgKikgcG9zID0gcmVhY2gtPnByZWZpeC5zX2FkZHI7CiAgICAgIHBvcyArPSBJUFY0X01BWF9CWVRFTEVOOwogICAgICAqKHVfaW50MzJfdCAqKSBwb3MgPSByZWFjaC0+bWFzay5zX2FkZHI7CiAgICAgIHBvcyArPSBJUFY0X01BWF9CWVRFTEVOOwogICAgfQoKICByZXR1cm4gYWRkX3RsdiAoSVBWNF9JTlRfUkVBQ0hBQklMSVRZLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KCmludAp0bHZfYWRkX3RlX2lwdjRfcmVhY2hzIChzdHJ1Y3QgbGlzdCAqdGVfaXB2NF9yZWFjaHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICBzdHJ1Y3QgdGVfaXB2NF9yZWFjaGFiaWxpdHkgKnRlX3JlYWNoOwogIHVfY2hhciB2YWx1ZVsyNTVdOwogIHVfY2hhciAqcG9zID0gdmFsdWU7CiAgdV9jaGFyIHByZWZpeF9zaXplOwogIGludCByZXR2YWw7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFNfUk8gKHRlX2lwdjRfcmVhY2hzLCBub2RlLCB0ZV9yZWFjaCkpCiAgICB7CiAgICAgIHByZWZpeF9zaXplID0gKCgoKHRlX3JlYWNoLT5jb250cm9sICYgMHgzRikgLSAxKSA+PiAzKSArIDEpOwoKICAgICAgaWYgKHBvcyAtIHZhbHVlICsgKDUgKyBwcmVmaXhfc2l6ZSkgPiAyNTUpCgl7CgkgIHJldHZhbCA9CgkgICAgYWRkX3RsdiAoVEVfSVBWNF9SRUFDSEFCSUxJVFksIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKCSAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQoJICAgIHJldHVybiByZXR2YWw7CgkgIHBvcyA9IHZhbHVlOwoJfQogICAgICAqKHVfaW50MzJfdCAqKSBwb3MgPSB0ZV9yZWFjaC0+dGVfbWV0cmljOwogICAgICBwb3MgKz0gNDsKICAgICAgKnBvcyA9IHRlX3JlYWNoLT5jb250cm9sOwogICAgICBwb3MrKzsKICAgICAgbWVtY3B5IChwb3MsICZ0ZV9yZWFjaC0+cHJlZml4X3N0YXJ0LCBwcmVmaXhfc2l6ZSk7CiAgICAgIHBvcyArPSBwcmVmaXhfc2l6ZTsKICAgIH0KCiAgcmV0dXJuIGFkZF90bHYgKFRFX0lQVjRfUkVBQ0hBQklMSVRZLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KCiNpZmRlZiBIQVZFX0lQVjYKaW50CnRsdl9hZGRfaXB2Nl9hZGRycyAoc3RydWN0IGxpc3QgKmlwdjZfYWRkcnMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICBzdHJ1Y3QgcHJlZml4X2lwdjYgKmlwdjY7CiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICBpbnQgcmV0dmFsOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTX1JPIChpcHY2X2FkZHJzLCBub2RlLCBpcHY2KSkKICAgIHsKICAgICAgaWYgKHBvcyAtIHZhbHVlICsgSVBWNl9NQVhfQllURUxFTiA+IDI1NSkKCXsKCSAgcmV0dmFsID0gYWRkX3RsdiAoSVBWNl9BRERSLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CgkgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKCSAgICByZXR1cm4gcmV0dmFsOwoJICBwb3MgPSB2YWx1ZTsKCX0KICAgICAgbWVtY3B5IChwb3MsIGlwdjYtPnByZWZpeC5zNl9hZGRyLCBJUFY2X01BWF9CWVRFTEVOKTsKICAgICAgcG9zICs9IElQVjZfTUFYX0JZVEVMRU47CiAgICB9CgogIHJldHVybiBhZGRfdGx2IChJUFY2X0FERFIsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKfQoKaW50CnRsdl9hZGRfaXB2Nl9yZWFjaHMgKHN0cnVjdCBsaXN0ICppcHY2X3JlYWNocywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CiAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogIHN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSAqaXA2cmVhY2g7CiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICBpbnQgcmV0dmFsLCBwcmVmaXhfb2N0ZXRzOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTX1JPIChpcHY2X3JlYWNocywgbm9kZSwgaXA2cmVhY2gpKQogICAgewogICAgICBpZiAocG9zIC0gdmFsdWUgKyBJUFY2X01BWF9CWVRFTEVOICsgNiA+IDI1NSkKCXsKCSAgcmV0dmFsID0gYWRkX3RsdiAoSVBWNl9SRUFDSEFCSUxJVFksIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKCSAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQoJICAgIHJldHVybiByZXR2YWw7CgkgIHBvcyA9IHZhbHVlOwoJfQogICAgICAqKHVpbnQzMl90ICopIHBvcyA9IGlwNnJlYWNoLT5tZXRyaWM7CiAgICAgIHBvcyArPSA0OwogICAgICAqcG9zID0gaXA2cmVhY2gtPmNvbnRyb2xfaW5mbzsKICAgICAgcG9zKys7CiAgICAgIHByZWZpeF9vY3RldHMgPSAoKGlwNnJlYWNoLT5wcmVmaXhfbGVuICsgNykgLyA4KTsKICAgICAgKnBvcyA9IGlwNnJlYWNoLT5wcmVmaXhfbGVuOwogICAgICBwb3MrKzsKICAgICAgbWVtY3B5IChwb3MsIGlwNnJlYWNoLT5wcmVmaXgsIHByZWZpeF9vY3RldHMpOwogICAgICBwb3MgKz0gcHJlZml4X29jdGV0czsKICAgIH0KCiAgcmV0dXJuIGFkZF90bHYgKElQVjZfUkVBQ0hBQklMSVRZLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cn0KI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwoKaW50CnRsdl9hZGRfcGFkZGluZyAoc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CiAgaW50IGZ1bGxwYWRzLCBpLCBsZWZ0OwoKICAvKgogICAqIEhvdyBtYW55IHRpbWVzIGNhbiB3ZSBhZGQgZnVsbCBwYWRkaW5nID8KICAgKi8KICBmdWxscGFkcyA9IChzdHJlYW1fZ2V0X3NpemUgKHN0cmVhbSkgLSBzdHJlYW1fZ2V0X2VuZHAgKHN0cmVhbSkpIC8gMjU3OwogIGZvciAoaSA9IDA7IGkgPCBmdWxscGFkczsgaSsrKQogICAgewogICAgICBpZiAoIXN0cmVhbV9wdXRjIChzdHJlYW0sICh1X2NoYXIpIFBBRERJTkcpKQkvKiBUQUcgKi8KCWdvdG8gZXJyOwogICAgICBpZiAoIXN0cmVhbV9wdXRjIChzdHJlYW0sICh1X2NoYXIpIDI1NSkpCS8qIExFTkdIVCAqLwoJZ290byBlcnI7CiAgICAgIHN0cmVhbV9wdXQgKHN0cmVhbSwgTlVMTCwgMjU1KTsJCS8qIHplcm8gcGFkZGluZyAqLwogICAgfQoKICBsZWZ0ID0gc3RyZWFtX2dldF9zaXplIChzdHJlYW0pIC0gc3RyZWFtX2dldF9lbmRwIChzdHJlYW0pOwoKICBpZiAobGVmdCA8IDIpCiAgICByZXR1cm4gSVNJU19PSzsKCiAgaWYgKGxlZnQgPT0gMikKICAgIHsKICAgICAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgUEFERElORyk7CiAgICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIDApOwogICAgICByZXR1cm4gSVNJU19PSzsKICAgIH0KCiAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgUEFERElORyk7CiAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgbGVmdCAtIDIpOwogIHN0cmVhbV9wdXQgKHN0cmVhbSwgTlVMTCwgbGVmdC0yKTsKCiAgcmV0dXJuIElTSVNfT0s7CgplcnI6CiAgemxvZ193YXJuICgidGx2X2FkZF9wYWRkaW5nKCk6IG5vIHJvb20gZm9yIHRsdiIpOwogIHJldHVybiBJU0lTX1dBUk5JTkc7Cn0K