LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogV2UgY2FuJ3QgdXNlIHB0aHJlYWRzIGRpcmVjdGx5LCBzbyB3aHkgbm90IGxldCBsaWJjcwogKiB0aGF0IHdhbnQgcHRocmVhZHMgdXNlIFdpbmUncyBvd24gdGhyZWFkaW5nIGluc3RlYWQuLi4KICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmUvcG9ydC5oIgoKI2lmbmRlZiBIQVZFX05QVEwKCnN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlcjsKCiNkZWZpbmUgX0dOVV9TT1VSQ0UgLyogd2UgbWF5IG5lZWQgdG8gb3ZlcnJpZGUgc29tZSBHTlUgZXh0ZW5zaW9ucyAqLwoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c2V0am1wLmg+CiNpZmRlZiBIQVZFX1VOSVNURF9ICiMgaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX01NQU5fSAojaW5jbHVkZSA8c3lzL21tYW4uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSAojIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1JFU09MVl9ICiMgaW5jbHVkZSA8cmVzb2x2Lmg+CiNlbmRpZgojaWZkZWYgSEFWRV9WQUxHUklORF9NRU1DSEVDS19ICiNpbmNsdWRlIDx2YWxncmluZC9tZW1jaGVjay5oPgojZW5kaWYKCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ0aHJlYWQuaCIKI2luY2x1ZGUgIndpbnRlcm5sLmgiCgovKiBkZWZhdWx0IGVycm5vIGJlZm9yZSB0aHJlYWRpbmcgaXMgaW5pdGlhbGl6ZWQgKi8Kc3RhdGljIGludCAqZGVmYXVsdF9lcnJub19sb2NhdGlvbih2b2lkKQp7CiAgICBzdGF0aWMgaW50IHN0YXRpY19lcnJubzsKICAgIHJldHVybiAmc3RhdGljX2Vycm5vOwp9CgovKiBkZWZhdWx0IGhfZXJybm8gYmVmb3JlIHRocmVhZGluZyBpcyBpbml0aWFsaXplZCAqLwpzdGF0aWMgaW50ICpkZWZhdWx0X2hfZXJybm9fbG9jYXRpb24odm9pZCkKewogICAgc3RhdGljIGludCBzdGF0aWNfaF9lcnJubzsKICAgIHJldHVybiAmc3RhdGljX2hfZXJybm87Cn0KCi8qIGVycm5vIG9uY2UgdGhyZWFkaW5nIGlzIHdvcmtpbmcgKi8Kc3RhdGljIGludCAqdGhyZWFkX2Vycm5vX2xvY2F0aW9uKHZvaWQpCnsKICAgIHJldHVybiAmTnRDdXJyZW50VGViKCktPnRocmVhZF9lcnJubzsKfQoKLyogaF9lcnJubyBvbmNlIHRocmVhZGluZyBpcyB3b3JraW5nICovCnN0YXRpYyBpbnQgKnRocmVhZF9oX2Vycm5vX2xvY2F0aW9uKHZvaWQpCnsKICAgIHJldHVybiAmTnRDdXJyZW50VGViKCktPnRocmVhZF9oX2Vycm5vOwp9CgpzdGF0aWMgaW50KiAoKmVycm5vX2xvY2F0aW9uX3B0cikodm9pZCkgPSBkZWZhdWx0X2Vycm5vX2xvY2F0aW9uOwpzdGF0aWMgaW50KiAoKmhfZXJybm9fbG9jYXRpb25fcHRyKSh2b2lkKSA9IGRlZmF1bHRfaF9lcnJub19sb2NhdGlvbjsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgX19lcnJub19sb2NhdGlvbi9fX2Vycm9yL19fZXJybm8vX19fZXJybm8vX190aHJfZXJybm8KICoKICogR2V0IHRoZSBwZXItdGhyZWFkIGVycm5vIGxvY2F0aW9uLgogKi8KaW50ICpfX2Vycm5vX2xvY2F0aW9uKHZvaWQpIHsgcmV0dXJuIGVycm5vX2xvY2F0aW9uX3B0cigpOyB9ICAvKiBMaW51eCAqLwppbnQgKl9fZXJyb3Iodm9pZCkgICAgICAgICAgeyByZXR1cm4gZXJybm9fbG9jYXRpb25fcHRyKCk7IH0gIC8qIEZyZWVCU0QgKi8KaW50ICpfX2Vycm5vKHZvaWQpICAgICAgICAgIHsgcmV0dXJuIGVycm5vX2xvY2F0aW9uX3B0cigpOyB9ICAvKiBOZXRCU0QgKi8KaW50ICpfX19lcnJubyh2b2lkKSAgICAgICAgIHsgcmV0dXJuIGVycm5vX2xvY2F0aW9uX3B0cigpOyB9ICAvKiBTb2xhcmlzICovCmludCAqX190aHJfZXJybm8odm9pZCkgICAgICB7IHJldHVybiBlcnJub19sb2NhdGlvbl9wdHIoKTsgfSAgLyogVW5peFdhcmUgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgX19oX2Vycm5vX2xvY2F0aW9uCiAqCiAqIEdldCB0aGUgcGVyLXRocmVhZCBoX2Vycm5vIGxvY2F0aW9uLgogKi8KaW50ICpfX2hfZXJybm9fbG9jYXRpb24odm9pZCkKewogICAgcmV0dXJuIGhfZXJybm9fbG9jYXRpb25fcHRyKCk7Cn0KCgovKiBDdXJyZW50bHkgdGhpcyBwcm9iYWJseSB3b3JrcyBvbmx5IGZvciBnbGliYzIsCiAqIHdoaWNoIGNoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIGRvdWJsZS11bmRlcnNjb3JlLXByZXBlbmRlZAogKiBwdGhyZWFkIHByaW1pdGl2ZXMsIGFuZCB1c2UgdGhlbSBpZiBhdmFpbGFibGUuCiAqIElmIHRoZXkgYXJlIG5vdCBhdmFpbGFibGUsIHRoZSBsaWJjIGRlZmF1bHRzIHRvCiAqIG5vbi10aHJlYWRzYWZlIG9wZXJhdGlvbiAobm90IGdvb2QpLiAqLwoKI2lmIGRlZmluZWQoX19HTElCQ19fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQoKI2lmbmRlZiBfX1VTRV9VTklYOTgKI2RlZmluZSBfX1VTRV9VTklYOTgKI2VuZGlmCgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CgojZGVmaW5lIFBfT1VUUFVUKHN0dWZmKSB3cml0ZSgyLHN0dWZmLHN0cmxlbihzdHVmZikpCgojZGVmaW5lIFBTVFIoc3RyKSBfX0FTTV9OQU1FKCNzdHIpCgovKiBhZGFwdCBhcyBuZWNlc3NhcnkgKGEgY29uc3RydWN0IGxpa2UgdGhpcyBpcyB1c2VkIGluIGdsaWJjIHNvdXJjZXMpICovCiNkZWZpbmUgc3Ryb25nX2FsaWFzKG9yaWcsIGFsaWFzKSBcCiBhc20oIi5nbG9ibCAiIFBTVFIoYWxpYXMpICJcbiIgXAogICAgICJcdC5zZXQgIiBQU1RSKGFsaWFzKSAiLCIgUFNUUihvcmlnKSkKCi8qIHRocmVhZCBkZXNjcmlwdG9yICovCgojZGVmaW5lIEZJUlNUX0tFWSAwCiNkZWZpbmUgTUFYX0tFWVMgMTYgLyogbGliYzYgZG9lc24ndCB1c2UgdGhhdCBtYW55LCBidXQuLi4gKi8KI2RlZmluZSBNQVhfVFNEICAxNgoKc3RydWN0IGZvcmtfYmxvY2s7CgpzdHJ1Y3QgcHRocmVhZF9kZXNjcl9zdHJ1Y3QKewogICAgY2hhciAgICAgICAgICAgICAgIGR1bW15WzIwNDhdOwogICAgc3RydWN0IF9fcmVzX3N0YXRlIHJlc19zdGF0ZTsKICAgIGNvbnN0IHZvaWQgICAgICAgICprZXlfZGF0YVtNQVhfS0VZU107ICAvKiBmb3Igbm9ybWFsIHB0aHJlYWQga2V5cyAqLwogICAgY29uc3Qgdm9pZCAgICAgICAgKnRzZF9kYXRhW01BWF9UU0RdOyAgIC8qIGZvciBsaWJjIGludGVybmFsIHRzZCB2YXJpYWJsZXMgKi8KfTsKCnR5cGVkZWYgc3RydWN0IHB0aHJlYWRfZGVzY3Jfc3RydWN0ICpwdGhyZWFkX2Rlc2NyOwoKc3RhdGljIHN0cnVjdCBwdGhyZWFkX2Rlc2NyX3N0cnVjdCBpbml0aWFsX2Rlc2NyOwoKcHRocmVhZF9kZXNjciBfX3B0aHJlYWRfdGhyZWFkX3NlbGYodm9pZCkKewogICAgc3RydWN0IHB0aHJlYWRfZGVzY3Jfc3RydWN0ICpkZXNjciA9IE50Q3VycmVudFRlYigpLT5wdGhyZWFkX2RhdGE7CiAgICBpZiAoIWRlc2NyKSByZXR1cm4gJmluaXRpYWxfZGVzY3I7CiAgICByZXR1cm4gZGVzY3I7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF90aHJlYWRfc2VsZiwgcHRocmVhZF90aHJlYWRfc2VsZik7CgovKiBwdGhyZWFkIGZ1bmN0aW9ucyByZWRpcmVjdGlvbiAqLwoKc3RydWN0IHB0aHJlYWRfZnVuY3Rpb25zCnsKICBwaWRfdCAoKnB0cl9wdGhyZWFkX2ZvcmspIChzdHJ1Y3QgZm9ya19ibG9jayAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX2Rlc3Ryb3kpIChwdGhyZWFkX2F0dHJfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2F0dHJfaW5pdF8yXzApIChwdGhyZWFkX2F0dHJfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2F0dHJfaW5pdF8yXzEpIChwdGhyZWFkX2F0dHJfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX2dldGRldGFjaHN0YXRlKSAoY29uc3QgcHRocmVhZF9hdHRyX3QgKiwgaW50ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUpIChwdGhyZWFkX2F0dHJfdCAqLCBpbnQpOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfZ2V0aW5oZXJpdHNjaGVkKSAoY29uc3QgcHRocmVhZF9hdHRyX3QgKiwgaW50ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfc2V0aW5oZXJpdHNjaGVkKSAocHRocmVhZF9hdHRyX3QgKiwgaW50KTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX2dldHNjaGVkcGFyYW0pIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqLCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKSAocHRocmVhZF9hdHRyX3QgKiwgY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfZ2V0c2NoZWRwb2xpY3kpIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqLCBpbnQgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSkgKHB0aHJlYWRfYXR0cl90ICosIGludCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9nZXRzY29wZSkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIGludCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX3NldHNjb3BlKSAocHRocmVhZF9hdHRyX3QgKiwgaW50KTsKICBpbnQgKCpwdHJfcHRocmVhZF9jb25kYXR0cl9kZXN0cm95KSAocHRocmVhZF9jb25kYXR0cl90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2NvbmRhdHRyX2luaXQpIChwdGhyZWFkX2NvbmRhdHRyX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9jb25kX2Jyb2FkY2FzdCkgKHB0aHJlYWRfY29uZF90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfY29uZF9kZXN0cm95KSAocHRocmVhZF9jb25kX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9jb25kX2luaXQpIChwdGhyZWFkX2NvbmRfdCAqLCBjb25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9jb25kX3NpZ25hbCkgKHB0aHJlYWRfY29uZF90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfY29uZF93YWl0KSAocHRocmVhZF9jb25kX3QgKiwgcHRocmVhZF9tdXRleF90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2VxdWFsKSAocHRocmVhZF90LCBwdGhyZWFkX3QpOwogIHZvaWQgKCpwdHJfX19wdGhyZWFkX2V4aXQpICh2b2lkICopOwogIGludCAoKnB0cl9wdGhyZWFkX2dldHNjaGVkcGFyYW0pIChwdGhyZWFkX3QsIGludCAqLCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfc2V0c2NoZWRwYXJhbSkgKHB0aHJlYWRfdCwgaW50LCBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSkgKHB0aHJlYWRfbXV0ZXhfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9tdXRleF9pbml0KSAocHRocmVhZF9tdXRleF90ICosIGNvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfbXV0ZXhfbG9jaykgKHB0aHJlYWRfbXV0ZXhfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9tdXRleF90cnlsb2NrKSAocHRocmVhZF9tdXRleF90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX211dGV4X3VubG9jaykgKHB0aHJlYWRfbXV0ZXhfdCAqKTsKICBwdGhyZWFkX3QgKCpwdHJfcHRocmVhZF9zZWxmKSAodm9pZCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUpIChpbnQsIGludCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9zZXRjYW5jZWx0eXBlKSAoaW50LCBpbnQgKik7CiAgdm9pZCAoKnB0cl9wdGhyZWFkX2RvX2V4aXQpICh2b2lkICpyZXR2YWwsIGNoYXIgKmN1cnJlbnRmcmFtZSk7CiAgdm9pZCAoKnB0cl9wdGhyZWFkX2NsZWFudXBfdXB0bykgKGptcF9idWYgdGFyZ2V0LCBjaGFyICp0YXJnZXRmcmFtZSk7CiAgcHRocmVhZF9kZXNjciAoKnB0cl9wdGhyZWFkX3RocmVhZF9zZWxmKSAodm9pZCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfaW50ZXJuYWxfdHNkX3NldCkgKGludCBrZXksIGNvbnN0IHZvaWQgKnBvaW50ZXIpOwogIHZvaWQgKiAoKnB0cl9wdGhyZWFkX2ludGVybmFsX3RzZF9nZXQpIChpbnQga2V5KTsKICB2b2lkICoqIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKSAoKnB0cl9wdGhyZWFkX2ludGVybmFsX3RzZF9hZGRyZXNzKSAoaW50IGtleSk7CiAgaW50ICgqcHRyX3B0aHJlYWRfc2lnYWN0aW9uKSAoaW50IHNpZywgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqIGFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqb2FjdCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfc2lnd2FpdCkgKGNvbnN0IHNpZ3NldF90ICpzZXQsIGludCAqc2lnKTsKICBpbnQgKCpwdHJfcHRocmVhZF9yYWlzZSkgKGludCBzaWcpOwp9OwoKc3RhdGljIHN0cnVjdCBwdGhyZWFkX2Z1bmN0aW9ucyB3aW5lX3B0aHJlYWRfZnVuY3Rpb25zOwpzdGF0aWMgaW50IGluaXRfZG9uZTsKCnN0YXRpYyBwaWRfdCAoKmxpYmNfZm9yaykodm9pZCk7CnN0YXRpYyBpbnQgKCpsaWJjX3NpZ2FjdGlvbikoaW50IHNpZ251bSwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqYWN0LCBzdHJ1Y3Qgc2lnYWN0aW9uICpvbGRhY3QpOwpzdGF0aWMgaW50ICgqbGliY191c2Vsb2NhbGUpKGludCBzZXQpOwpzdGF0aWMgaW50ICooKmxpYmNfcHRocmVhZF9pbml0KSggY29uc3Qgc3RydWN0IHB0aHJlYWRfZnVuY3Rpb25zICpmdW5jcyApOwpzdGF0aWMgaW50ICpsaWJjX211bHRpcGxlX3RocmVhZHM7Cgp2b2lkIFBUSFJFQURfaW5pdF9kb25lKHZvaWQpCnsKICAgIGluaXRfZG9uZSA9IDE7CiAgICBpZiAoIWxpYmNfZm9yaykgbGliY19mb3JrID0gZGxzeW0oIFJUTERfTkVYVCwgImZvcmsiICk7CiAgICBpZiAoIWxpYmNfc2lnYWN0aW9uKSBsaWJjX3NpZ2FjdGlvbiA9IGRsc3ltKCBSVExEX05FWFQsICJzaWdhY3Rpb24iICk7Cn0KCnN0cnVjdCBfX3Jlc19zdGF0ZSAqX19yZXNfc3RhdGUodm9pZCkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgcmV0dXJuICZkZXNjci0+cmVzX3N0YXRlOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVqdW1wKCBjb25zdCBjaGFyICpzeW1ib2wsIHZvaWQgKmRlc3QgKQp7CiNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgZGVmaW5lZChfX2kzODZfXykKICAgIHVuc2lnbmVkIGNoYXIgKmFkZHIgPSBkbHN5bSggUlRMRF9ORVhULCBzeW1ib2wgKTsKCiAgICBpZiAoIWFkZHIpIHJldHVybjsKCiAgICAvKiB3cml0ZSBhIHJlbGF0aXZlIGp1bXAgYXQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MgKi8KICAgIG1wcm90ZWN0KCh2b2lkKikoKHVuc2lnbmVkIGludClhZGRyICYgfihnZXRwYWdlc2l6ZSgpLTEpKSwgNSwgUFJPVF9SRUFEfFBST1RfRVhFQ3xQUk9UX1dSSVRFKTsKICAgIGFkZHJbMF0gPSAweGU5OwogICAgKihpbnQgKikoYWRkcisxKSA9ICh1bnNpZ25lZCBjaGFyICopZGVzdCAtIChhZGRyICsgNSk7CiAgICBtcHJvdGVjdCgodm9pZCopKCh1bnNpZ25lZCBpbnQpYWRkciAmIH4oZ2V0cGFnZXNpemUoKS0xKSksIDUsIFBST1RfUkVBRHxQUk9UX0VYRUMpOwoKIyBpZmRlZiBIQVZFX1ZBTEdSSU5EX01FTUNIRUNLX0gKICAgIFZBTEdSSU5EX0RJU0NBUkRfVFJBTlNMQVRJT05TKCBhZGRyLCA1ICk7CiMgZW5kaWYKI2VuZGlmICAvKiBfX0dMSUJDX18gJiYgX19pMzg2X18gKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBQVEhSRUFEX2luaXRfdGhyZWFkCiAqCiAqIEluaXRpYWxpemF0aW9uIGZvciBhIG5ld2x5IGNyZWF0ZWQgdGhyZWFkLgogKi8Kdm9pZCBQVEhSRUFEX2luaXRfdGhyZWFkKHZvaWQpCnsKICAgIHN0YXRpYyBpbnQgZmlyc3QgPSAxOwoKICAgIGlmIChmaXJzdCkKICAgIHsKICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgTnRDdXJyZW50VGViKCktPnB0aHJlYWRfZGF0YSA9ICZpbml0aWFsX2Rlc2NyOwogICAgICAgIGVycm5vX2xvY2F0aW9uX3B0ciA9IHRocmVhZF9lcnJub19sb2NhdGlvbjsKICAgICAgICBoX2Vycm5vX2xvY2F0aW9uX3B0ciA9IHRocmVhZF9oX2Vycm5vX2xvY2F0aW9uOwogICAgICAgIGxpYmNfdXNlbG9jYWxlID0gZGxzeW0oIFJUTERfTkVYVCwgInVzZWxvY2FsZSIgKTsKICAgICAgICBsaWJjX3B0aHJlYWRfaW5pdCA9IGRsc3ltKCBSVExEX05FWFQsICJfX2xpYmNfcHRocmVhZF9pbml0IiApOwogICAgICAgIGlmIChsaWJjX3B0aHJlYWRfaW5pdCkgbGliY19tdWx0aXBsZV90aHJlYWRzID0gbGliY19wdGhyZWFkX2luaXQoICZ3aW5lX3B0aHJlYWRfZnVuY3Rpb25zICk7CiAgICAgICAgd3JpdGVqdW1wKCAiX19lcnJub19sb2NhdGlvbiIsIHRocmVhZF9lcnJub19sb2NhdGlvbiApOwogICAgICAgIHdyaXRlanVtcCggIl9faF9lcnJub19sb2NhdGlvbiIsIHRocmVhZF9oX2Vycm5vX2xvY2F0aW9uICk7CiAgICAgICAgd3JpdGVqdW1wKCAiX19yZXNfc3RhdGUiLCBfX3Jlc19zdGF0ZSApOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHN0cnVjdCBwdGhyZWFkX2Rlc2NyX3N0cnVjdCAqZGVzY3IgPSBjYWxsb2MoIDEsIHNpemVvZigqZGVzY3IpICk7CiAgICAgICAgTnRDdXJyZW50VGViKCktPnB0aHJlYWRfZGF0YSA9IGRlc2NyOwogICAgICAgIGlmIChsaWJjX211bHRpcGxlX3RocmVhZHMpICpsaWJjX211bHRpcGxlX3RocmVhZHMgPSAxOwogICAgfQogICAgaWYgKGxpYmNfdXNlbG9jYWxlKSBsaWJjX3VzZWxvY2FsZSggLTEgLypMQ19HTE9CQUxfTE9DQUxFKi8gKTsKfQoKLyogcmVkZWZpbmUgdGhpcyB0byBwcmV2ZW50IGxpYnB0aHJlYWQgZnJvbSBvdmVycmlkaW5nIG91ciBmdW5jdGlvbiBwb2ludGVycyAqLwppbnQgKl9fbGliY19wdGhyZWFkX2luaXQoIGNvbnN0IHN0cnVjdCBwdGhyZWFkX2Z1bmN0aW9ucyAqZnVuY3MgKQp7CiAgICByZXR1cm4gbGliY19tdWx0aXBsZV90aHJlYWRzOwp9CgovKiBOT1RFOiBUaGlzIGlzIGEgdHJ1bHkgZXh0cmVtZWx5IGluY3JlZGlibHkgdWdseSBoYWNrIQogKiBCdXQgaXQgZG9lcyBzZWVtIHRvIHdvcmsuLi4gKi8KCi8qIGFzc3VtZSB0aGF0IHB0aHJlYWRfbXV0ZXhfdCBoYXMgcm9vbSBmb3IgYXQgbGVhc3Qgb25lIHBvaW50ZXIsCiAqIGFuZCBob3BlIHRoYXQgdGhlIHVzZXJzIG9mIHB0aHJlYWRfbXV0ZXhfdCBjb25zaWRlcnMgaXQgb3BhcXVlCiAqIChuZXZlciBjaGVja3Mgd2hhdCdzIGluIGl0KQogKiBhbHNvOiBhc3N1bWUgdGhhdCBzdGF0aWMgaW5pdGlhbGl6ZXIgc2V0cyBwb2ludGVyIHRvIE5VTEwKICovCnR5cGVkZWYgc3RydWN0CnsKI2lmZGVmIF9fR0xJQkNfXwogIGludCByZXNlcnZlZDsKI2VuZGlmCiAgQ1JJVElDQUxfU0VDVElPTiAqY3JpdHNlY3Q7Cn0gKndpbmVfbXV0ZXg7CgovKiBzZWUgd2luZV9tdXRleCBhYm92ZSBmb3IgY29tbWVudHMgKi8KdHlwZWRlZiBzdHJ1Y3QgewogIFJUTF9SV0xPQ0sgKmxvY2s7Cn0gKndpbmVfcndsb2NrOwoKdHlwZWRlZiBzdHJ1Y3QgX3dpbmVfY2xlYW51cCB7CiAgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKik7CiAgdm9pZCAqYXJnOwp9ICp3aW5lX2NsZWFudXA7Cgp2b2lkIF9fcHRocmVhZF9pbml0aWFsaXplKHZvaWQpCnsKfQoKc3RydWN0IHB0aHJlYWRfdGhyZWFkX2luaXQgewoJIHZvaWQqICgqc3RhcnRfcm91dGluZSkodm9pZCopOwoJIHZvaWQqIGFyZzsKfTsKCnN0YXRpYyBEV09SRCBDQUxMQkFDSyBwdGhyZWFkX3RocmVhZF9zdGFydChMUFZPSUQgZGF0YSkKewogIHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0IGluaXQgPSAqKHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KilkYXRhOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxkYXRhKTsKICByZXR1cm4gKERXT1JEKWluaXQuc3RhcnRfcm91dGluZShpbml0LmFyZyk7Cn0KCmludCBwdGhyZWFkX2NyZWF0ZShwdGhyZWFkX3QqIHRocmVhZCwgY29uc3QgcHRocmVhZF9hdHRyX3QqIGF0dHIsIHZvaWQqCiAgICAgICAgKCpzdGFydF9yb3V0aW5lKSh2b2lkICopLCB2b2lkKiBhcmcpCnsKICBIQU5ETEUgaFRocmVhZDsKICBzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdCogaWRhdGEgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKCQlzaXplb2Yoc3RydWN0IHB0aHJlYWRfdGhyZWFkX2luaXQpKTsKCiAgaWRhdGEtPnN0YXJ0X3JvdXRpbmUgPSBzdGFydF9yb3V0aW5lOwogIGlkYXRhLT5hcmcgPSBhcmc7CiAgaFRocmVhZCA9IENyZWF0ZVRocmVhZCggTlVMTCwgMCwgcHRocmVhZF90aHJlYWRfc3RhcnQsIGlkYXRhLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIChMUERXT1JEKXRocmVhZCk7CgogIGlmKGhUaHJlYWQpCiAgICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKICBlbHNlCiAgewogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGlkYXRhKTsgLyogZnJlZSBpZGF0YSBzdHJ1Y3Qgb24gZmFpbHVyZSAqLwogICAgcmV0dXJuIEVBR0FJTjsKICB9CgogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jYW5jZWwocHRocmVhZF90IHRocmVhZCkKewogIEhBTkRMRSBoVGhyZWFkID0gT3BlblRocmVhZChUSFJFQURfQUxMX0FDQ0VTUywgRkFMU0UsIChEV09SRCl0aHJlYWQpOwoKICBpZighVGVybWluYXRlVGhyZWFkKGhUaHJlYWQsIDApKQogIHsKICAgIENsb3NlSGFuZGxlKGhUaHJlYWQpOwogICAgcmV0dXJuIEVJTlZBTDsgICAgICAvKiByZXR1cm4gZXJyb3IgKi8KICB9CgogIENsb3NlSGFuZGxlKGhUaHJlYWQpOwoKICByZXR1cm4gMDsgICAgICAgICAgICAgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKaW50IHB0aHJlYWRfam9pbihwdGhyZWFkX3QgdGhyZWFkLCB2b2lkICoqdmFsdWVfcHRyKQp7CiAgSEFORExFIGhUaHJlYWQgPSBPcGVuVGhyZWFkKFRIUkVBRF9BTExfQUNDRVNTLCBGQUxTRSwgKERXT1JEKXRocmVhZCk7CgogIFdhaXRGb3JTaW5nbGVPYmplY3QoaFRocmVhZCwgSU5GSU5JVEUpOwogIGlmKCFHZXRFeGl0Q29kZVRocmVhZChoVGhyZWFkLCAoTFBEV09SRCl2YWx1ZV9wdHIpKQogIHsKICAgIENsb3NlSGFuZGxlKGhUaHJlYWQpOwogICAgcmV0dXJuIEVJTlZBTDsgLyogRklYTUU6IG1ha2UgdGhpcyBtb3JlIGNvcnJlY3RseSBtYXRjaCAqLwogIH0gICAgICAgICAgICAgICAgLyogd2luZG93cyBlcnJvcnMgKi8KCiAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgcmV0dXJuIDA7Cn0KCi8qRklYTUU6IG5vdCBzdXJlIHdoYXQgdG8gZG8gd2l0aCB0aGlzIG9uZS4uLiAqLwppbnQgcHRocmVhZF9kZXRhY2gocHRocmVhZF90IHRocmVhZCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2RldGFjaFxuIik7CiAgcmV0dXJuIDA7Cn0KCi8qIEZJWE1FOiB3ZSBoYXZlIG5vIGVxdWl2YWxlbnRzIGluIHdpbjMyIGZvciB0aGUgcG9saWN5cyAqLwovKiBzbyBqdXN0IGtlZXAgdGhpcyBhcyBhIHN0dWIgKi8KaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeShwdGhyZWFkX2F0dHJfdCAqYXR0ciwgaW50IHBvbGljeSkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3lcbiIpOwogIHJldHVybiAwOwp9CgovKiBGSVhNRTogbm8gd2luMzIgZXF1aXZhbGVudCBmb3Igc2NvcGUgKi8KaW50IHB0aHJlYWRfYXR0cl9zZXRzY29wZShwdGhyZWFkX2F0dHJfdCAqYXR0ciwgaW50IHNjb3BlKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfYXR0cl9zZXRzY29wZVxuIik7CiAgcmV0dXJuIDA7IC8qIHJldHVybiBzdWNjZXNzICovCn0KCi8qIEZJWE1FOiBubyB3aW4zMiBlcXVpdmFsZW50IGZvciBzY2hlZHVsZSBwYXJhbSAqLwppbnQgcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0ocHRocmVhZF9hdHRyX3QgKmF0dHIsCiAgICBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKnBhcmFtKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtXG4iKTsKICByZXR1cm4gMDsgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKaW50IF9fcHRocmVhZF9vbmNlKHB0aHJlYWRfb25jZV90ICpvbmNlX2NvbnRyb2wsIHZvaWQgKCppbml0X3JvdXRpbmUpKHZvaWQpKQp7CiAgc3RhdGljIHB0aHJlYWRfb25jZV90IHRoZV9vbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CiAgTE9ORyBvbmNlX25vdzsKCiAgbWVtY3B5KCZvbmNlX25vdywmdGhlX29uY2Usc2l6ZW9mKG9uY2Vfbm93KSk7CiAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKChMT05HKilvbmNlX2NvbnRyb2wsIG9uY2Vfbm93KzEsIG9uY2Vfbm93KSA9PSBvbmNlX25vdykKICAgICgqaW5pdF9yb3V0aW5lKSgpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfb25jZSwgcHRocmVhZF9vbmNlKTsKCnZvaWQgX19wdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucCh2b2lkKQp7CiAgICAvKiB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUgKi8KfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucCwgcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnApOwoKLyoqKioqIGF0Zm9yayAqKioqKi8KCiNkZWZpbmUgTUFYX0FURk9SSyA4ICAvKiBsaWJjIGRvZXNuJ3QgbmVlZCB0aGF0IG1hbnkgYW55d2F5ICovCgpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBhdGZvcmtfc2VjdGlvbjsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT05fREVCVUcgY3JpdHNlY3RfZGVidWcgPQp7CiAgICAwLCAwLCAmYXRmb3JrX3NlY3Rpb24sCiAgICB7ICZjcml0c2VjdF9kZWJ1Zy5Qcm9jZXNzTG9ja3NMaXN0LCAmY3JpdHNlY3RfZGVidWcuUHJvY2Vzc0xvY2tzTGlzdCB9LAogICAgICAwLCAwLCB7IDAsIChEV09SRCkoX19GSUxFX18gIjogYXRmb3JrX3NlY3Rpb24iKSB9Cn07CnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIGF0Zm9ya19zZWN0aW9uID0geyAmY3JpdHNlY3RfZGVidWcsIC0xLCAwLCAwLCAwLCAwIH07Cgp0eXBlZGVmIHZvaWQgKCphdGZvcmtfaGFuZGxlcikoKTsKc3RhdGljIGF0Zm9ya19oYW5kbGVyIGF0Zm9ya19wcmVwYXJlW01BWF9BVEZPUktdOwpzdGF0aWMgYXRmb3JrX2hhbmRsZXIgYXRmb3JrX3BhcmVudFtNQVhfQVRGT1JLXTsKc3RhdGljIGF0Zm9ya19oYW5kbGVyIGF0Zm9ya19jaGlsZFtNQVhfQVRGT1JLXTsKc3RhdGljIGludCBhdGZvcmtfY291bnQ7CgppbnQgX19wdGhyZWFkX2F0Zm9yayh2b2lkICgqcHJlcGFyZSkodm9pZCksCgkJICAgICB2b2lkICgqcGFyZW50KSh2b2lkKSwKCQkgICAgIHZvaWQgKCpjaGlsZCkodm9pZCkpCnsKICAgIGlmIChpbml0X2RvbmUpIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmYXRmb3JrX3NlY3Rpb24gKTsKICAgIGFzc2VydCggYXRmb3JrX2NvdW50IDwgTUFYX0FURk9SSyApOwogICAgYXRmb3JrX3ByZXBhcmVbYXRmb3JrX2NvdW50XSA9IHByZXBhcmU7CiAgICBhdGZvcmtfcGFyZW50W2F0Zm9ya19jb3VudF0gPSBwYXJlbnQ7CiAgICBhdGZvcmtfY2hpbGRbYXRmb3JrX2NvdW50XSA9IGNoaWxkOwogICAgYXRmb3JrX2NvdW50Kys7CiAgICBpZiAoaW5pdF9kb25lKSBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2F0Zm9yaywgcHRocmVhZF9hdGZvcmspOwoKcGlkX3QgX19mb3JrKHZvaWQpCnsKICAgIHBpZF90IHBpZDsKICAgIGludCBpOwoKICAgIGlmICghbGliY19mb3JrKQogICAgewogICAgICAgIGxpYmNfZm9yayA9IGRsc3ltKCBSVExEX05FWFQsICJmb3JrIiApOwogICAgICAgIGFzc2VydCggbGliY19mb3JrICk7CiAgICB9CiAgICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICAvKiBwcmVwYXJlIGhhbmRsZXJzIGFyZSBjYWxsZWQgaW4gcmV2ZXJzZSBpbnNlcnRpb24gb3JkZXIgKi8KICAgIGZvciAoaSA9IGF0Zm9ya19jb3VudCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoYXRmb3JrX3ByZXBhcmVbaV0pIGF0Zm9ya19wcmVwYXJlW2ldKCk7CiAgICBpZiAoIShwaWQgPSBsaWJjX2ZvcmsoKSkpCiAgICB7CiAgICAgICAgUnRsSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0Zm9ya19jb3VudDsgaSsrKSBpZiAoYXRmb3JrX2NoaWxkW2ldKSBhdGZvcmtfY2hpbGRbaV0oKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRmb3JrX2NvdW50OyBpKyspIGlmIChhdGZvcmtfcGFyZW50W2ldKSBhdGZvcmtfcGFyZW50W2ldKCk7CiAgICAgICAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgfQogICAgcmV0dXJuIHBpZDsKfQpzdHJvbmdfYWxpYXMoX19mb3JrLCBmb3JrKTsKCi8qKioqKiBNVVRFWEVTICoqKioqLwoKaW50IF9fcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKm11dGV4YXR0cikKewogIC8qIGdsaWJjIGhhcyBhIHRlbmRlbmN5IHRvIGluaXRpYWxpemUgbXV0ZXhlcyB2ZXJ5IG9mdGVuLCBldmVuCiAgICAgaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGV5IGFyZSBub3QgcmVhbGx5IHVzZWQgbGF0ZXIgb24uCgogICAgIEFzIGZvciB1cywgaW5pdGlhbGl6aW5nIGEgbXV0ZXggaXMgdmVyeSBleHBlbnNpdmUsIHdlIHBvc3Rwb25lCiAgICAgdGhlIHJlYWwgaW5pdGlhbGl6YXRpb24gdW50aWwgdGhlIHRpbWUgdGhlIG11dGV4IGlzIGZpcnN0IHVzZWQuICovCgogICgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0ID0gTlVMTDsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X2luaXQsIHB0aHJlYWRfbXV0ZXhfaW5pdCk7CgpzdGF0aWMgdm9pZCBtdXRleF9yZWFsX2luaXQoIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXggKQp7CiAgQ1JJVElDQUxfU0VDVElPTiAqY3JpdHNlY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKENSSVRJQ0FMX1NFQ1RJT04pKTsKICBSdGxJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKGNyaXRzZWN0KTsKCiAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcigodm9pZCoqKSYoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpLGNyaXRzZWN0LE5VTEwpICE9IE5VTEwpIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgUnRsRGVsZXRlQ3JpdGljYWxTZWN0aW9uKGNyaXRzZWN0KTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGNyaXRzZWN0KTsKICB9Cn0KCmludCBfX3B0aHJlYWRfbXV0ZXhfbG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCFpbml0X2RvbmUpIHJldHVybiAwOwogIGlmICghKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpCiAgICBtdXRleF9yZWFsX2luaXQoIG11dGV4ICk7CgogIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X2xvY2ssIHB0aHJlYWRfbXV0ZXhfbG9jayk7CgppbnQgX19wdGhyZWFkX211dGV4X3RyeWxvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmICghaW5pdF9kb25lKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KQogICAgbXV0ZXhfcmVhbF9pbml0KCBtdXRleCApOwoKICBpZiAoIVJ0bFRyeUVudGVyQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSkgewogICAgZXJybm8gPSBFQlVTWTsKICAgIHJldHVybiAtMTsKICB9CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF90cnlsb2NrLCBwdGhyZWFkX211dGV4X3RyeWxvY2spOwoKaW50IF9fcHRocmVhZF9tdXRleF91bmxvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmICghKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpIHJldHVybiAwOwogIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X3VubG9jaywgcHRocmVhZF9tdXRleF91bmxvY2spOwoKaW50IF9fcHRocmVhZF9tdXRleF9kZXN0cm95KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSByZXR1cm4gMDsKICBpZiAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QtPlJlY3Vyc2lvbkNvdW50KSB7CiNpZiAwIC8qIHRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIGxpYmM2IHRoYXQgbWFrZXMgdGhpcyBhIGJhZCBpZGVhICovCiAgICByZXR1cm4gRUJVU1k7CiNlbHNlCiAgICB3aGlsZSAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QtPlJlY3Vyc2lvbkNvdW50KQogICAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiNlbmRpZgogIH0KICBSdGxEZWxldGVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9kZXN0cm95LCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kpOwoKCi8qKioqKiBNVVRFWCBBVFRSSUJVVEVTICoqKioqLwovKiBqdXN0IGR1bW1pZXMsIHNpbmNlIGNyaXRpY2FsIHNlY3Rpb25zIGFyZSBhbHdheXMgcmVjdXJzaXZlICovCgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9pbml0KHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9pbml0LCBwdGhyZWFkX211dGV4YXR0cl9pbml0KTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3ksIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQga2luZCkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnAsIHB0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnApOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0a2luZF9ucChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQgKmtpbmQpCnsKICAqa2luZCA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnAsIHB0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnApOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQga2luZCkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUsIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQgKmtpbmQpCnsKICAqa2luZCA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUsIHB0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUpOwoKCi8qKioqKiBUSFJFQUQtU1BFQ0lGSUMgVkFSSUFCTEVTIChLRVlTKSAqKioqKi8KCmludCBfX3B0aHJlYWRfa2V5X2NyZWF0ZShwdGhyZWFkX2tleV90ICprZXksIHZvaWQgKCpkZXN0cl9mdW5jdGlvbikodm9pZCAqKSkKewogIHN0YXRpYyBMT05HIGtleWNudCA9IEZJUlNUX0tFWTsKICAqa2V5ID0gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgma2V5Y250LCAxKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tleV9jcmVhdGUsIHB0aHJlYWRfa2V5X2NyZWF0ZSk7CgppbnQgX19wdGhyZWFkX2tleV9kZWxldGUocHRocmVhZF9rZXlfdCBrZXkpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tleV9kZWxldGUsIHB0aHJlYWRfa2V5X2RlbGV0ZSk7CgppbnQgX19wdGhyZWFkX3NldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5LCBjb25zdCB2b2lkICpwb2ludGVyKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICBkZXNjci0+a2V5X2RhdGFba2V5XSA9IHBvaW50ZXI7CiAgICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3NldHNwZWNpZmljLCBwdGhyZWFkX3NldHNwZWNpZmljKTsKCnZvaWQgKl9fcHRocmVhZF9nZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgcmV0dXJuICh2b2lkICopZGVzY3ItPmtleV9kYXRhW2tleV07Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9nZXRzcGVjaWZpYywgcHRocmVhZF9nZXRzcGVjaWZpYyk7CgovKiB0aGVzZSBhcmUgbm90IGV4cG9ydGVkLCB0aGV5IGFyZSBvbmx5IHVzZWQgaW4gdGhlIHB0aHJlYWRfZnVuY3Rpb25zIHN0cnVjdHVyZSAqLwoKc3RhdGljIGludCBwdGhyZWFkX2ludGVybmFsX3RzZF9zZXQoIGludCBrZXksIGNvbnN0IHZvaWQgKnBvaW50ZXIgKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICBkZXNjci0+dHNkX2RhdGFba2V5XSA9IHBvaW50ZXI7CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgKnB0aHJlYWRfaW50ZXJuYWxfdHNkX2dldCggaW50IGtleSApCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIHJldHVybiAodm9pZCAqKWRlc2NyLT50c2RfZGF0YVtrZXldOwp9CgpzdGF0aWMgdm9pZCAqKiBfX2F0dHJpYnV0ZV9fKChjb25zdCkpIHB0aHJlYWRfaW50ZXJuYWxfdHNkX2FkZHJlc3MoIGludCBrZXkgKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICByZXR1cm4gKHZvaWQgKiopJmRlc2NyLT50c2RfZGF0YVtrZXldOwp9CgovKioqKiogIkVYQ0VQVElPTiIgRlJBTUVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKmFyZykKewogICgod2luZV9jbGVhbnVwKWJ1ZmZlciktPnJvdXRpbmUgPSByb3V0aW5lOwogICgod2luZV9jbGVhbnVwKWJ1ZmZlciktPmFyZyA9IGFyZzsKfQoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgaW50IGV4ZWN1dGUpCnsKICBpZiAoZXhlY3V0ZSkgKCooKCh3aW5lX2NsZWFudXApYnVmZmVyKS0+cm91dGluZSkpKCgod2luZV9jbGVhbnVwKWJ1ZmZlciktPmFyZyk7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCB2b2lkICgqcm91dGluZSkodm9pZCAqKSwgdm9pZCAqYXJnKQp7CiAgX3B0aHJlYWRfY2xlYW51cF9wdXNoKGJ1ZmZlciwgcm91dGluZSwgYXJnKTsKfQoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCBpbnQgZXhlY3V0ZSkKewogIF9wdGhyZWFkX2NsZWFudXBfcG9wKGJ1ZmZlciwgZXhlY3V0ZSk7Cn0KCnZvaWQgX19wdGhyZWFkX2NsZWFudXBfdXB0byhqbXBfYnVmIHRhcmdldCwgY2hhciAqZnJhbWUpCnsKICAgIC8qIEZJWE1FICovCn0KCi8qKioqKiBDT05ESVRJT05TICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgX19wdGhyZWFkX2NvbmRfaW5pdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgY29uc3QgcHRocmVhZF9jb25kYXR0cl90ICpjb25kX2F0dHIpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2luaXRcbiIpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF9pbml0LCBwdGhyZWFkX2NvbmRfaW5pdCk7CgppbnQgX19wdGhyZWFkX2NvbmRfZGVzdHJveShwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfZGVzdHJveVxuIik7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX2Rlc3Ryb3ksIHB0aHJlYWRfY29uZF9kZXN0cm95KTsKCmludCBfX3B0aHJlYWRfY29uZF9zaWduYWwocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX3NpZ25hbFxuIik7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX3NpZ25hbCwgcHRocmVhZF9jb25kX3NpZ25hbCk7CgppbnQgX19wdGhyZWFkX2NvbmRfYnJvYWRjYXN0KHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfY29uZF9icm9hZGNhc3RcbiIpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF9icm9hZGNhc3QsIHB0aHJlYWRfY29uZF9icm9hZGNhc3QpOwoKaW50IF9fcHRocmVhZF9jb25kX3dhaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX3dhaXRcbiIpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF93YWl0LCBwdGhyZWFkX2NvbmRfd2FpdCk7CgppbnQgX19wdGhyZWFkX2NvbmRfdGltZWR3YWl0KHB0aHJlYWRfY29uZF90ICpjb25kLCBwdGhyZWFkX211dGV4X3QgKm11dGV4LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmFic3RpbWUpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX3RpbWVkd2FpdFxuIik7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX3RpbWVkd2FpdCwgcHRocmVhZF9jb25kX3RpbWVkd2FpdCk7CgovKioqKiBDT05ESVRJT04gQVRUUklCVVRFUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKaW50IHB0aHJlYWRfY29uZGF0dHJfaW5pdChwdGhyZWFkX2NvbmRhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfY29uZGF0dHJfZGVzdHJveShwdGhyZWFkX2NvbmRhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQoKI2lmIChfX0dMSUJDX18gPT0gMikgJiYgKF9fR0xJQkNfTUlOT1JfXyA+PSAyKQovKioqKiogUkVBRC1XUklURSBMT0NLUyAqKioqKi8KCnN0YXRpYyB2b2lkIHJ3bG9ja19yZWFsX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgUlRMX1JXTE9DSyAqbG9jayA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoUlRMX1JXTE9DSykpOwogIFJ0bEluaXRpYWxpemVSZXNvdXJjZShsb2NrKTsKCiAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcigodm9pZCoqKSYoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKSxsb2NrLE5VTEwpICE9IE5VTEwpIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgUnRsRGVsZXRlUmVzb3VyY2UobG9jayk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBsb2NrKTsKICB9Cn0KCmludCBfX3B0aHJlYWRfcndsb2NrX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrLCBjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqcndsb2NrX2F0dHIpCnsKICAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2sgPSBOVUxMOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX2luaXQsIHB0aHJlYWRfcndsb2NrX2luaXQpOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveShwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykgcmV0dXJuIDA7CiAgUnRsRGVsZXRlUmVzb3VyY2UoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3ksIHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3kpOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghaW5pdF9kb25lKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykKICAgIHJ3bG9ja19yZWFsX2luaXQoIHJ3bG9jayApOwoKICB3aGlsZShUUlVFKQogICAgaWYgKFJ0bEFjcXVpcmVSZXNvdXJjZVNoYXJlZCgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2ssIFRSVUUpKQogICAgICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja19yZGxvY2ssIHB0aHJlYWRfcndsb2NrX3JkbG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCFpbml0X2RvbmUpIHJldHVybiAwOwogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIGlmICghUnRsQWNxdWlyZVJlc291cmNlU2hhcmVkKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgRkFMU0UpKSB7CiAgICBlcnJubyA9IEVCVVNZOwogICAgcmV0dXJuIC0xOwogIH0KICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2ssIHB0aHJlYWRfcndsb2NrX3RyeXJkbG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja193cmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCFpbml0X2RvbmUpIHJldHVybiAwOwogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIHdoaWxlKFRSVUUpCiAgICBpZiAoUnRsQWNxdWlyZVJlc291cmNlRXhjbHVzaXZlKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgVFJVRSkpCiAgICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3dybG9jaywgcHRocmVhZF9yd2xvY2tfd3Jsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoIWluaXRfZG9uZSkgcmV0dXJuIDA7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgaWYgKCFSdGxBY3F1aXJlUmVzb3VyY2VFeGNsdXNpdmUoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBGQUxTRSkpIHsKICAgIGVycm5vID0gRUJVU1k7CiAgICByZXR1cm4gLTE7CiAgfQogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jaywgcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3VubG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykgcmV0dXJuIDA7CiAgUnRsUmVsZWFzZVJlc291cmNlKCAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2sgKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja191bmxvY2ssIHB0aHJlYWRfcndsb2NrX3VubG9jayk7CgovKioqKiBSRUFELVdSSVRFIExPQ0sgQVRUUklCVVRFUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKaW50IHB0aHJlYWRfcndsb2NrYXR0cl9pbml0KHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0KCmludCBfX3B0aHJlYWRfcndsb2NrYXR0cl9kZXN0cm95KHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3ksIHB0aHJlYWRfcndsb2NrYXR0cl9kZXN0cm95KTsKCmludCBwdGhyZWFkX3J3bG9ja2F0dHJfZ2V0a2luZF9ucChjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0ciwgaW50ICpwcmVmKQp7CiAgKnByZWYgPSAwOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9yd2xvY2thdHRyX3NldGtpbmRfbnAocHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIsIGludCBwcmVmKQp7CiAgcmV0dXJuIDA7Cn0KI2VuZGlmIC8qIGdsaWJjIDIuMiAqLwoKLyoqKioqIE1JU0MgKioqKiovCgpwdGhyZWFkX3QgcHRocmVhZF9zZWxmKHZvaWQpCnsKICByZXR1cm4gKHB0aHJlYWRfdClHZXRDdXJyZW50VGhyZWFkSWQoKTsKfQoKaW50IHB0aHJlYWRfZXF1YWwocHRocmVhZF90IHRocmVhZDEsIHB0aHJlYWRfdCB0aHJlYWQyKQp7CiAgcmV0dXJuIChEV09SRCl0aHJlYWQxID09IChEV09SRCl0aHJlYWQyOwp9Cgp2b2lkIF9fcHRocmVhZF9kb19leGl0KHZvaWQgKnJldHZhbCwgY2hhciAqY3VycmVudGZyYW1lKQp7CiAgLyogRklYTUU6IHB0aHJlYWQgY2xlYW51cCAqLwogIEV4aXRUaHJlYWQoKERXT1JEKXJldHZhbCk7Cn0KCnZvaWQgX19wdGhyZWFkX2V4aXQodm9pZCAqcmV0dmFsKQp7CiAgICBfX3B0aHJlYWRfZG9fZXhpdCggcmV0dmFsLCBOVUxMICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9leGl0LCBwdGhyZWFkX2V4aXQpOwoKaW50IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZShpbnQgdHlwZSwgaW50ICpvbGR0eXBlKQp7CiAgaWYgKG9sZHR5cGUpICpvbGR0eXBlID0gUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTOwogIHJldHVybiAwOwp9CgovKioqKiogQU5USS1PVkVSUklERVMgKioqKiovCi8qIHB0aHJlYWRzIHRyaWVzIHRvIG92ZXJyaWRlIHRoZXNlLCBwb2ludCB0aGVtIGJhY2sgdG8gbGliYyAqLwoKaW50IHNpZ2FjdGlvbihpbnQgc2lnbnVtLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICphY3QsIHN0cnVjdCBzaWdhY3Rpb24gKm9sZGFjdCkKewogICAgaWYgKCFsaWJjX3NpZ2FjdGlvbikKICAgIHsKICAgICAgICBsaWJjX3NpZ2FjdGlvbiA9IGRsc3ltKCBSVExEX05FWFQsICJzaWdhY3Rpb24iICk7CiAgICAgICAgYXNzZXJ0KCBsaWJjX3NpZ2FjdGlvbiApOwogICAgfQogICAgcmV0dXJuIGxpYmNfc2lnYWN0aW9uKHNpZ251bSwgYWN0LCBvbGRhY3QpOwp9CgpzdGF0aWMgc3RydWN0IHB0aHJlYWRfZnVuY3Rpb25zIHdpbmVfcHRocmVhZF9mdW5jdGlvbnMgPQp7CiAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZm9yayAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfZGVzdHJveSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfYXR0cl9pbml0XzJfMCAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfYXR0cl9pbml0XzJfMSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfZ2V0ZGV0YWNoc3RhdGUgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9nZXRpbmhlcml0c2NoZWQgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX3NldGluaGVyaXRzY2hlZCAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfZ2V0c2NoZWRwYXJhbSAqLwogICAgcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0sICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfZ2V0c2NoZWRwb2xpY3kpIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqLCBpbnQgKik7ICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSkgKHB0aHJlYWRfYXR0cl90ICosIGludCk7ICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9nZXRzY29wZSkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIGludCAqKTsgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX3NldHNjb3BlKSAocHRocmVhZF9hdHRyX3QgKiwgaW50KTsgKi8KICAgIHB0aHJlYWRfY29uZGF0dHJfZGVzdHJveSwgICAgICAvKiBwdHJfcHRocmVhZF9jb25kYXR0cl9kZXN0cm95ICovCiAgICBwdGhyZWFkX2NvbmRhdHRyX2luaXQsICAgICAgICAgLyogcHRyX3B0aHJlYWRfY29uZGF0dHJfaW5pdCAqLwogICAgX19wdGhyZWFkX2NvbmRfYnJvYWRjYXN0LCAgICAgIC8qIHB0cl9fX3B0aHJlYWRfY29uZF9icm9hZGNhc3QgKi8KICAgIF9fcHRocmVhZF9jb25kX2Rlc3Ryb3ksICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2NvbmRfZGVzdHJveSAqLwogICAgX19wdGhyZWFkX2NvbmRfaW5pdCwgICAgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfY29uZF9pbml0ICovCiAgICBfX3B0aHJlYWRfY29uZF9zaWduYWwsICAgICAgICAgLyogcHRyX19fcHRocmVhZF9jb25kX3NpZ25hbCAqLwogICAgX19wdGhyZWFkX2NvbmRfd2FpdCwgICAgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfY29uZF93YWl0ICovCiAgICBwdGhyZWFkX2VxdWFsLCAgICAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZXF1YWwgKi8KICAgIF9fcHRocmVhZF9leGl0LCAgICAgICAgICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2V4aXQgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9nZXRzY2hlZHBhcmFtICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2V0c2NoZWRwYXJhbSAqLwogICAgX19wdGhyZWFkX211dGV4X2Rlc3Ryb3ksICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X2Rlc3Ryb3kgKi8KICAgIF9fcHRocmVhZF9tdXRleF9pbml0LCAgICAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF9pbml0ICovCiAgICBfX3B0aHJlYWRfbXV0ZXhfbG9jaywgICAgICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfbG9jayAqLwogICAgX19wdGhyZWFkX211dGV4X3RyeWxvY2ssICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X3RyeWxvY2sgKi8KICAgIF9fcHRocmVhZF9tdXRleF91bmxvY2ssICAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF91bmxvY2sgKi8KICAgIHB0aHJlYWRfc2VsZiwgICAgICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9zZWxmICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUgKi8KICAgIHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSwgICAgICAgICAvKiBwdHJfcHRocmVhZF9zZXRjYW5jZWx0eXBlICovCiAgICBfX3B0aHJlYWRfZG9fZXhpdCwgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZG9fZXhpdCAqLwogICAgX19wdGhyZWFkX2NsZWFudXBfdXB0bywgICAgICAgIC8qIHB0cl9wdGhyZWFkX2NsZWFudXBfdXB0byAqLwogICAgX19wdGhyZWFkX3RocmVhZF9zZWxmLCAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3RocmVhZF9zZWxmICovCiAgICBwdGhyZWFkX2ludGVybmFsX3RzZF9zZXQsICAgICAgLyogcHRyX3B0aHJlYWRfaW50ZXJuYWxfdHNkX3NldCAqLwogICAgcHRocmVhZF9pbnRlcm5hbF90c2RfZ2V0LCAgICAgIC8qIHB0cl9wdGhyZWFkX2ludGVybmFsX3RzZF9nZXQgKi8KICAgIHB0aHJlYWRfaW50ZXJuYWxfdHNkX2FkZHJlc3MsICAvKiBwdHJfcHRocmVhZF9pbnRlcm5hbF90c2RfYWRkcmVzcyAqLwogICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NpZ2FjdGlvbiAqLwogICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NpZ3dhaXQgKi8KICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9yYWlzZSAqLwp9OwoKI2VuZGlmIC8qIF9fR0xJQkNfXyB8fCBfX0ZSRUVCU0RfXyAqLwoKI2Vsc2UgIC8qIEhBVkVfTlBUTCAqLwoKdm9pZCBQVEhSRUFEX2luaXRfZG9uZSh2b2lkKQp7Cn0KCiNlbmRpZiAgLyogSEFWRV9OUFRMICovCg==