LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qCiAqIHNubXB1c20uYwogKgogKiBSb3V0aW5lcyB0byBtYW5pcHVsYXRlIGEgaW5mb3JtYXRpb24gYWJvdXQgYSAidXNlciIgYXMKICogZGVmaW5lZCBieSB0aGUgU05NUC1VU0VSLUJBU0VELVNNLU1JQiBNSUIuCiAqCiAqIEFsbCBmdW5jdGlvbnMgdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV8qKCkgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEKICogb3RoZXJ3aXNlLgogKgogKiAhISBUYWIgc3RvcHMgc2V0IHRvIDQgaW4gc29tZSBwYXJ0cyBvZiB0aGlzIGZpbGUuICEhCiAqICAgIChEZXNpZ25hdGVkIG9uIGEgcGVyIGZ1bmN0aW9uLikKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX1dJTlNPQ0tfSAojaW5jbHVkZSA8d2luc29jay5oPgojZW5kaWYKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpZmRlZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpZmRlZiBXSU4zMgojICBpbmNsdWRlIDxzeXMvdGltZWIuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZW5kaWYKIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZiBIQVZFX0RNQUxMT0NfSAojaW5jbHVkZSA8ZG1hbGxvYy5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC90eXBlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvb3V0cHV0X2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvY29uZmlnX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvdXRpbGl0aWVzLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9hc24xLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2NhbGxiYWNrLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3Rvb2xzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2tleXRvb2xzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXB2My5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9sY2RfdGltZS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zY2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9jYWxsYmFjay5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX3NlY21vZC5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wdXNtLmg+CgpvaWQgICAgICAgICAgICAgdXNtTm9BdXRoUHJvdG9jb2xbMTBdID0geyAxLCAzLCA2LCAxLCA2LCAzLCAxMCwgMSwgMSwgMSB9OwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NRDUKb2lkICAgICAgICAgICAgIHVzbUhNQUNNRDVBdXRoUHJvdG9jb2xbMTBdID0KICAgIHsgMSwgMywgNiwgMSwgNiwgMywgMTAsIDEsIDEsIDIgfTsKI2VuZGlmCm9pZCAgICAgICAgICAgICB1c21ITUFDU0hBMUF1dGhQcm90b2NvbFsxMF0gPQogICAgeyAxLCAzLCA2LCAxLCA2LCAzLCAxMCwgMSwgMSwgMyB9OwpvaWQgICAgICAgICAgICAgdXNtTm9Qcml2UHJvdG9jb2xbMTBdID0geyAxLCAzLCA2LCAxLCA2LCAzLCAxMCwgMSwgMiwgMSB9OwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKb2lkICAgICAgICAgICAgIHVzbURFU1ByaXZQcm90b2NvbFsxMF0gPSB7IDEsIDMsIDYsIDEsIDYsIDMsIDEwLCAxLCAyLCAyIH07CiNlbmRpZgpvaWQgICAgICAgICAgICAgdXNtQUVTUHJpdlByb3RvY29sWzEwXSA9IHsgMSwgMywgNiwgMSwgNiwgMywgMTAsIDEsIDIsIDQgfTsKLyogYmFja3dhcmRzIGNvbXBhdCAqLwpvaWQgICAgICAgICAgICAgKnVzbUFFUzEyOFByaXZQcm90b2NvbCA9IHVzbUFFU1ByaXZQcm90b2NvbDsKCnN0YXRpYyB1X2ludCAgICBkdW1teV9ldGltZSwgZHVtbXlfZWJvb3Q7ICAgICAgIC8qIEZvciBJU0VOR0lORUtOT1dOKCkuICovCgovKgogKiBHbG9iYWxzLgogKi8Kc3RhdGljIHVfaW50ICAgIHNhbHRfaW50ZWdlcjsKI2lmZGVmIEhBVkVfQUVTCnN0YXRpYyB1X2ludCAgICBzYWx0X2ludGVnZXI2NF8xLCBzYWx0X2ludGVnZXI2NF8yOwojZW5kaWYKICAgICAgICAvKgogICAgICAgICAqIDEvMiBvZiBzZWVkIGZvciB0aGUgc2FsdC4gICBDZi4gUkZDMjI3NCwgU2VjdCA4LjEuMS4xLgogICAgICAgICAqLwoKc3RhdGljIHN0cnVjdCB1c21Vc2VyICpub05hbWVVc2VyID0gTlVMTDsKLyoKICogTG9jYWwgc3RvcmFnZSAoTENEKSBvZiB0aGUgZGVmYXVsdCB1c2VyIGxpc3QuCiAqLwpzdGF0aWMgc3RydWN0IHVzbVVzZXIgKnVzZXJMaXN0ID0gTlVMTDsKCi8qCiAqIFByb3RvdHlwZXMKICovCmludAogICAgICAgICAgICAgICAgdXNtX2NoZWNrX3NlY0xldmVsX3ZzX3Byb3RvY29scyhpbnQgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIGF1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQgYXV0aFByb3RvY29sTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBwcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50IHByaXZQcm90b2NvbExlbik7CmludAogICAgICAgICAgICAgICAgdXNtX2NhbGNfb2Zmc2V0cyhzaXplX3QgZ2xvYmFsRGF0YUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlY0xldmVsLCBzaXplX3Qgc2VjRW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzZWNOYW1lTGVuLCBzaXplX3Qgc2NvcGVkUGR1TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2xvbmcgZW5naW5lYm9vdHMsIGxvbmcgZW5naW5lX3RpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHRoZVRvdGFsTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBhdXRoUGFyYW1zT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBwcml2UGFyYW1zT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBkYXRhT2Zmc2V0LCBzaXplX3QgKiBkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBtc2dBdXRoUGFybUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogbXNnUHJpdlBhcm1MZW4sIHNpemVfdCAqIG90c3RsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNlcV9sZW4sIHNpemVfdCAqIG1zZ1NlY1Bhcm1MZW4pOwovKgogKiBTZXQgYSBnaXZlbiBmaWVsZCBvZiB0aGUgc2VjU3RhdGVSZWYuCiAqCiAqIEFsbG9jYXRlIDxsZW4+IGJ5dGVzIGZvciB0eXBlIDx0eXBlPiBwb2ludGVkIHRvIGJ5IHJlZi0+PGZpZWxkPi4KICogVGhlbiBjb3B5IGluIDxpdGVtPiBhbmQgcmVjb3JkIGl0cyBsZW5ndGggaW4gcmVmLT48ZmllbGRfbGVuPi4KICoKICogUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgogKi8KI2RlZmluZSBNQUtFX0VOVFJZKCB0eXBlLCBpdGVtLCBsZW4sIGZpZWxkLCBmaWVsZF9sZW4gKQkJCVwKewkJCQkJCQkJCVwKCWlmIChyZWYgPT0gTlVMTCkJCQkJCQlcCgkJcmV0dXJuIC0xOwkJCQkJCVwKCWlmIChyZWYtPmZpZWxkICE9IE5VTEwpCXsJCQkJCVwKCQlTTk1QX1pFUk8ocmVmLT5maWVsZCwgcmVmLT5maWVsZF9sZW4pOwkJCVwKCQlTTk1QX0ZSRUUocmVmLT5maWVsZCk7CQkJCQlcCgl9CQkJCQkJCQlcCglyZWYtPmZpZWxkX2xlbiA9IDA7CQkJCQkJXAogICAgICAgIGlmIChsZW4gPT0gMCB8fCBpdGVtID09IE5VTEwpIHsJCQkJCVwKCQlyZXR1cm4gMDsJCQkJCQlcCgl9CQkJCQkgCQkJXAoJaWYgKChyZWYtPmZpZWxkID0gKHR5cGUqKSBtYWxsb2MgKGxlbiAqIHNpemVvZih0eXBlKSkpID09IE5VTEwpCVwKCXsJCQkJCQkJCVwKCQlyZXR1cm4gLTE7CQkJCQkJXAoJfQkJCQkJCQkJXAoJCQkJCQkJCQlcCgltZW1jcHkgKHJlZi0+ZmllbGQsIGl0ZW0sIGxlbiAqIHNpemVvZih0eXBlKSk7CQkJXAoJcmVmLT5maWVsZF9sZW4gPSBsZW47CQkJCQkJXAoJCQkJCQkJCQlcCglyZXR1cm4gMDsJCQkJCQkJXAp9CgoKc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICoKdXNtX21hbGxvY191c21TdGF0ZVJlZmVyZW5jZSh2b2lkKQp7CiAgICBzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKnJldHZhbCA9IChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKikKICAgICAgICBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSkpOwoKICAgIHJldHVybiByZXR2YWw7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9tYWxsb2NfdXNtU3RhdGVSZWZlcmVuY2UoKSAqLwoKCnZvaWQKdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uodm9pZCAqb2xkKQp7CiAgICBzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKm9sZF9yZWYgPSAoc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICopIG9sZDsKCiAgICBpZiAob2xkX3JlZikgewoKICAgICAgICBTTk1QX0ZSRUUob2xkX3JlZi0+dXNyX25hbWUpOwogICAgICAgIFNOTVBfRlJFRShvbGRfcmVmLT51c3JfZW5naW5lX2lkKTsKICAgICAgICBTTk1QX0ZSRUUob2xkX3JlZi0+dXNyX2F1dGhfcHJvdG9jb2wpOwogICAgICAgIFNOTVBfRlJFRShvbGRfcmVmLT51c3JfcHJpdl9wcm90b2NvbCk7CgogICAgICAgIGlmIChvbGRfcmVmLT51c3JfYXV0aF9rZXkpIHsKICAgICAgICAgICAgU05NUF9aRVJPKG9sZF9yZWYtPnVzcl9hdXRoX2tleSwgb2xkX3JlZi0+dXNyX2F1dGhfa2V5X2xlbmd0aCk7CiAgICAgICAgICAgIFNOTVBfRlJFRShvbGRfcmVmLT51c3JfYXV0aF9rZXkpOwogICAgICAgIH0KICAgICAgICBpZiAob2xkX3JlZi0+dXNyX3ByaXZfa2V5KSB7CiAgICAgICAgICAgIFNOTVBfWkVSTyhvbGRfcmVmLT51c3JfcHJpdl9rZXksIG9sZF9yZWYtPnVzcl9wcml2X2tleV9sZW5ndGgpOwogICAgICAgICAgICBTTk1QX0ZSRUUob2xkX3JlZi0+dXNyX3ByaXZfa2V5KTsKICAgICAgICB9CgogICAgICAgIFNOTVBfWkVSTyhvbGRfcmVmLCBzaXplb2YoKm9sZF9yZWYpKTsKICAgICAgICBTTk1QX0ZSRUUob2xkX3JlZik7CgogICAgfQoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UoKSAqLwoKc3RydWN0IHVzbVVzZXIgKgp1c21fZ2V0X3VzZXJMaXN0KHZvaWQpCnsKICAgIHJldHVybiB1c2VyTGlzdDsKfQoKaW50CnVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfbmFtZShzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKnJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgTUFLRV9FTlRSWShjaGFyLCBuYW1lLCBuYW1lX2xlbiwgdXNyX25hbWUsIHVzcl9uYW1lX2xlbmd0aCk7Cn0KCmludAp1c21fc2V0X3VzbVN0YXRlUmVmZXJlbmNlX2VuZ2luZV9pZChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKnJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogZW5naW5lX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW5naW5lX2lkX2xlbikKewogICAgTUFLRV9FTlRSWSh1X2NoYXIsIGVuZ2luZV9pZCwgZW5naW5lX2lkX2xlbiwKICAgICAgICAgICAgICAgdXNyX2VuZ2luZV9pZCwgdXNyX2VuZ2luZV9pZF9sZW5ndGgpOwp9CgppbnQKdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9hdXRoX3Byb3RvY29sKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqcmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICogYXV0aF9wcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhdXRoX3Byb3RvY29sX2xlbikKewogICAgTUFLRV9FTlRSWShvaWQsIGF1dGhfcHJvdG9jb2wsIGF1dGhfcHJvdG9jb2xfbGVuLAogICAgICAgICAgICAgICB1c3JfYXV0aF9wcm90b2NvbCwgdXNyX2F1dGhfcHJvdG9jb2xfbGVuZ3RoKTsKfQoKaW50CnVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfYXV0aF9rZXkoc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICpyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogYXV0aF9rZXksIHNpemVfdCBhdXRoX2tleV9sZW4pCnsKICAgIE1BS0VfRU5UUlkodV9jaGFyLCBhdXRoX2tleSwgYXV0aF9rZXlfbGVuLAogICAgICAgICAgICAgICB1c3JfYXV0aF9rZXksIHVzcl9hdXRoX2tleV9sZW5ndGgpOwp9CgppbnQKdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9wcml2X3Byb3RvY29sKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqcmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICogcHJpdl9wcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwcml2X3Byb3RvY29sX2xlbikKewogICAgTUFLRV9FTlRSWShvaWQsIHByaXZfcHJvdG9jb2wsIHByaXZfcHJvdG9jb2xfbGVuLAogICAgICAgICAgICAgICB1c3JfcHJpdl9wcm90b2NvbCwgdXNyX3ByaXZfcHJvdG9jb2xfbGVuZ3RoKTsKfQoKaW50CnVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfcHJpdl9rZXkoc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICpyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogcHJpdl9rZXksIHNpemVfdCBwcml2X2tleV9sZW4pCnsKICAgIE1BS0VfRU5UUlkodV9jaGFyLCBwcml2X2tleSwgcHJpdl9rZXlfbGVuLAogICAgICAgICAgICAgICB1c3JfcHJpdl9rZXksIHVzcl9wcml2X2tleV9sZW5ndGgpOwp9CgppbnQKdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9zZWNfbGV2ZWwoc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICpyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWNfbGV2ZWwpCnsKICAgIGlmIChyZWYgPT0gTlVMTCkKICAgICAgICByZXR1cm4gLTE7CiAgICByZWYtPnVzcl9zZWNfbGV2ZWwgPSBzZWNfbGV2ZWw7CiAgICByZXR1cm4gMDsKfQoKaW50CnVzbV9jbG9uZV91c21TdGF0ZVJlZmVyZW5jZShzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKmZyb20sIHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqKnRvKQp7CiAgICBzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKmNsb25lZF91c21TdGF0ZVJlZjsKCiAgICBpZiAoZnJvbSA9PSBOVUxMIHx8IHRvID09IE5VTEwpCiAgICAgICAgcmV0dXJuIC0xOwoKICAgICp0byA9IHVzbV9tYWxsb2NfdXNtU3RhdGVSZWZlcmVuY2UoKTsKICAgIGNsb25lZF91c21TdGF0ZVJlZiA9ICp0bzsKCiAgICBpZiAodXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9uYW1lKGNsb25lZF91c21TdGF0ZVJlZiwgZnJvbS0+dXNyX25hbWUsIGZyb20tPnVzcl9uYW1lX2xlbmd0aCkgfHwKICAgICAgICB1c21fc2V0X3VzbVN0YXRlUmVmZXJlbmNlX2VuZ2luZV9pZChjbG9uZWRfdXNtU3RhdGVSZWYsIGZyb20tPnVzcl9lbmdpbmVfaWQsIGZyb20tPnVzcl9lbmdpbmVfaWRfbGVuZ3RoKSB8fAogICAgICAgIHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfYXV0aF9wcm90b2NvbChjbG9uZWRfdXNtU3RhdGVSZWYsIGZyb20tPnVzcl9hdXRoX3Byb3RvY29sLCBmcm9tLT51c3JfYXV0aF9wcm90b2NvbF9sZW5ndGgpIHx8CiAgICAgICAgdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9hdXRoX2tleShjbG9uZWRfdXNtU3RhdGVSZWYsIGZyb20tPnVzcl9hdXRoX2tleSwgZnJvbS0+dXNyX2F1dGhfa2V5X2xlbmd0aCkgfHwKICAgICAgICB1c21fc2V0X3VzbVN0YXRlUmVmZXJlbmNlX3ByaXZfcHJvdG9jb2woY2xvbmVkX3VzbVN0YXRlUmVmLCBmcm9tLT51c3JfcHJpdl9wcm90b2NvbCwgZnJvbS0+dXNyX3ByaXZfcHJvdG9jb2xfbGVuZ3RoKSB8fAogICAgICAgIHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfcHJpdl9rZXkoY2xvbmVkX3VzbVN0YXRlUmVmLCBmcm9tLT51c3JfcHJpdl9rZXksIGZyb20tPnVzcl9wcml2X2tleV9sZW5ndGgpIHx8CiAgICAgICAgdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9zZWNfbGV2ZWwoY2xvbmVkX3VzbVN0YXRlUmVmLCBmcm9tLT51c3Jfc2VjX2xldmVsKSkKICAgIHsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZSgqdG8pOwogICAgICAgICp0byA9IE5VTEw7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHJldHVybiAwOwoKfQoKI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBlbWVyZ2VuY3lfcHJpbnQKICoKICogUGFyYW1ldGVyczoKICoJKmZpZWxkCiAqCSBsZW5ndGgKICogICAgICAKICoJVGhpcyBpcyBhIHByaW50IHJvdXRpbmUgdGhhdCBpcyBzb2xlbHkgaW5jbHVkZWQgc28gdGhhdCBpdCBjYW4gYmUKICoJdXNlZCBpbiBnZGIuICBEb24ndCB1c2UgaXQgYXMgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBwdWxsZWQgYmVmb3JlCiAqCWEgcmVhbCByZWxlYXNlIG9mIHRoZSBjb2RlLgogKgogKgl0YWIgc3RvcCA0CiAqCiAqCVhYWCBmZmx1c2goKSBvbmx5IHdvcmtzIG9uIEZyZWVCU0Q7IGNvcmUgZHVtcHMgb24gU3VuIE9TJ3MKICovCnZvaWQKZW1lcmdlbmN5X3ByaW50KHVfY2hhciAqIGZpZWxkLCB1X2ludCBsZW5ndGgpCnsKICAgIGludCAgICAgICAgICAgICBpaW5kZXg7CiAgICBpbnQgICAgICAgICAgICAgc3RhcnQgPSAwOwogICAgaW50ICAgICAgICAgICAgIHN0b3AgPSAyNTsKCiAgICB3aGlsZSAoc3RhcnQgPCBzdG9wKSB7CiAgICAgICAgZm9yIChpaW5kZXggPSBzdGFydDsgaWluZGV4IDwgc3RvcDsgaWluZGV4KyspCiAgICAgICAgICAgIHByaW50ZigiJTAyWCAiLCBmaWVsZFtpaW5kZXhdKTsKCiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIHN0YXJ0ID0gc3RvcDsKICAgICAgICBzdG9wID0gc3RvcCArIDI1IDwgbGVuZ3RoID8gc3RvcCArIDI1IDogbGVuZ3RoOwogICAgfQogICAgZmZsdXNoKDApOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgZW1lcmdlbmN5X3ByaW50KCkgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBhc25fcHJlZGljdF9pbnRfbGVuZ3RoCiAqCiAqIFBhcmFtZXRlcnM6CiAqCXR5cGUJKFVOVVNFRCkKICoJbnVtYmVyCiAqCWxlbgogKiAgICAgIAogKiBSZXR1cm5zOgogKglOdW1iZXIgb2YgYnl0ZXMgbmVjZXNzYXJ5IHRvIHN0b3JlIHRoZSBBU04uMSBlbmNvZGVkIHZhbHVlIG9mICdudW1iZXInLgogKgogKgogKglUaGlzIGdpdmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB0aGUgQVNOLjEgZW5jb2RlciAoaW4gYXNuMS5jKSB3aWxsCiAqCXVzZSB0byBlbmNvZGUgYSBwYXJ0aWN1bGFyIGludGVnZXIgdmFsdWUuCiAqCiAqCVJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgaW50ZWdlciAtLSBOT1QgVEhFIEhFQURFUiEKICoKICoJRG8gdGhpcyB0aGUgc2FtZSB3YXkgYXMgYXNuX2J1aWxkX2ludCgpLi4uCiAqLwppbnQKYXNuX3ByZWRpY3RfaW50X2xlbmd0aChpbnQgdHlwZSwgbG9uZyBudW1iZXIsIHNpemVfdCBsZW4pCnsKICAgIHJlZ2lzdGVyIHVfbG9uZyBtYXNrOwoKCiAgICBpZiAobGVuICE9IHNpemVvZihsb25nKSkKICAgICAgICByZXR1cm4gLTE7CgogICAgbWFzayA9ICgodV9sb25nKSAweDFGRikgPDwgKCg4ICogKHNpemVvZihsb25nKSAtIDEpKSAtIDEpOwogICAgLyoKICAgICAqIG1hc2sgaXMgMHhGRjgwMDAwMCBvbiBhIGJpZy1lbmRpYW4gbWFjaGluZSAKICAgICAqLwoKICAgIHdoaWxlICgoKChudW1iZXIgJiBtYXNrKSA9PSAwKSB8fCAoKG51bWJlciAmIG1hc2spID09IG1hc2spKQogICAgICAgICAgICYmIGxlbiA+IDEpIHsKICAgICAgICBsZW4tLTsKICAgICAgICBudW1iZXIgPDw9IDg7CiAgICB9CgogICAgcmV0dXJuIGxlbjsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGFzbl9wcmVkaWN0X2xlbmd0aCgpICovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBhc25fcHJlZGljdF9sZW5ndGgKICoKICogUGFyYW1ldGVyczoKICoJIHR5cGUKICoJKnB0cgogKgkgdV9jaGFyX2xlbgogKiAgICAgIAogKiBSZXR1cm5zOgogKglMZW5ndGggaW4gYnl0ZXM6CTEgKyA8bj4gKyA8dV9jaGFyX2xlbj4sIHdoZXJlCiAqCiAqCQkxCQlGb3IgdGhlIEFTTi4xIHR5cGUuCiAqCQk8bj4JCSMgb2YgYnl0ZXMgdG8gc3RvcmUgbGVuZ3RoIG9mIGRhdGEuCiAqCQk8dV9jaGFyX2xlbj4JTGVuZ3RoIG9mIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEFTTi4xIHR5cGUuCiAqCiAqCVRoaXMgZ2l2ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBBU04uMSBlbmNvZGVyIChpbiBhc24xLmMpIHdpbGwKICoJdXNlIHRvIGVuY29kZSBhIHBhcnRpY3VsYXIgaW50ZWdlciB2YWx1ZS4gIFRoaXMgaXMgYXMgYnJva2VuIGFzIHRoZQogKgljdXJyZW50bHkgdXNlZCBlbmNvZGVyLgogKgogKiBYWFgJSG93IGlzIDxuPiBjaG9zZW4sIGV4YWN0bHk/PwogKi8KaW50CmFzbl9wcmVkaWN0X2xlbmd0aChpbnQgdHlwZSwgdV9jaGFyICogcHRyLCBzaXplX3QgdV9jaGFyX2xlbikKewoKICAgIGlmICh0eXBlICYgQVNOX1NFUVVFTkNFKQogICAgICAgIHJldHVybiAxICsgMyArIHVfY2hhcl9sZW47CgogICAgaWYgKHR5cGUgJiBBU05fSU5URUdFUikgewogICAgICAgIHVfbG9uZyAgICAgICAgICB2YWx1ZTsKICAgICAgICBtZW1jcHkoJnZhbHVlLCBwdHIsIHVfY2hhcl9sZW4pOwogICAgICAgIHVfY2hhcl9sZW4gPSBhc25fcHJlZGljdF9pbnRfbGVuZ3RoKHR5cGUsIHZhbHVlLCB1X2NoYXJfbGVuKTsKICAgIH0KCiAgICBpZiAodV9jaGFyX2xlbiA8IDB4ODApCiAgICAgICAgcmV0dXJuIDEgKyAxICsgdV9jaGFyX2xlbjsKICAgIGVsc2UgaWYgKHVfY2hhcl9sZW4gPCAweEZGKQogICAgICAgIHJldHVybiAxICsgMiArIHVfY2hhcl9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIDEgKyAzICsgdV9jaGFyX2xlbjsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGFzbl9wcmVkaWN0X2xlbmd0aCgpICovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiB1c21fY2FsY19vZmZzZXRzCiAqCiAqIFBhcmFtZXRlcnM6CiAqCShTZWUgbGlzdCBiZWxvdy4uLikKICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCiAqCiAqCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIHRoZSBvZmZzZXRzIGludG8gYW4gb3V0Z29pbmcgbWVzc2FnZSBidWZmZXIKICoJZm9yIHRoZSBuZWNlc3NhcnkgdmFsdWVzLiAgVGhlIG91dGdvaW5nIGJ1ZmZlciB3aWxsIGdlbmVyaWNhbGx5CiAqCWxvb2sgbGlrZSB0aGlzOgogKgogKglTTk1QdjMgTWVzc2FnZQogKglTRVEgbGVuWzExXQogKgkJSU5UIGxlbiB2ZXJzaW9uCiAqCUhlYWRlcgogKgkJU0VRIGxlbgogKgkJCUlOVCBsZW4gTXNnSUQKICoJCQlJTlQgbGVuIG1zZ01heFNpemUKICoJCQlPU1QgbGVuIG1zZ0ZsYWdzIChPU1QgPSBPQ1RFVCBTVFJJTkcpCiAqCQkJSU5UIGxlbiBtc2dTZWN1cml0eU1vZGVsCiAqCU1zZ1NlY3VyaXR5UGFyYW1ldGVycwogKgkJWzFdIE9TVCBsZW5bMl0KICoJCQlTRVEgbGVuWzNdCiAqCQkJCU9TVCBsZW4gbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlECiAqCQkJCUlOVCBsZW4gbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUJvb3RzCiAqCQkJCUlOVCBsZW4gbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZVRpbWUKICoJCQkJT1NUIGxlbiBtc2dVc2VyTmFtZQogKgkJCQlPU1QgbGVuWzRdIFs1XSBtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMKICoJCQkJT1NUIGxlbls2XSBbN10gbXNnUHJpdmFjeVBhcmFtZXRlcnMKICoJTXNnRGF0YQogKgkJWzhdIE9TVCBsZW5bOV0gWzEwXSBlbmNyeXB0ZWRQRFUKICoJCW9yCiAqCQlbOCwxMF0gU0VRVUVOQ0UgbGVuWzldIHNjb3BlZFBEVQogKglbMTJdCiAqCiAqCVRoZSBicmFja2V0ZWQgcG9pbnRzIHdpbGwgYmUgbmVlZGVkIHRvIGJlIGlkZW50aWZpZWQgKFt4XSBpcyBhbiBpbmRleAogKgl2YWx1ZSwgbGVuW3hdIG1lYW5zIGEgbGVuZ3RoIHZhbHVlKS4gIEhlcmUgaXMgYSBzZW1hbnRpYyBndWlkZSB0byB0aGVtOgogKgogKglbMV0gPSBnbG9iYWxEYXRhTGVuIChpbnB1dCkKICoJWzJdID0gb3RzdGxlbgogKglbM10gPSBzZXFfbGVuCiAqCVs0XSA9IG1zZ0F1dGhQYXJtTGVuIChtYXkgYmUgMCBvciAxMikKICoJWzVdID0gYXV0aFBhcmFtc09mZnNldAogKglbNl0gPSBtc2dQcml2UGFybUxlbiAobWF5IGJlIDAgb3IgOCkKICoJWzddID0gcHJpdlBhcmFtc09mZnNldAogKglbOF0gPSBnbG9iYWxEYXRhTGVuICsgbXNnU2VjUGFybUxlbgogKglbOV0gPSBkYXRhbGVuCiAqCVsxMF0gPSBkYXRhT2Zmc2V0CiAqCVsxMV0gPSB0aGVUb3RhbExlbmd0aCAtIHRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciBpdHNlbGYKICoJWzEyXSA9IHRoZVRvdGFsTGVuZ3RoCiAqLwppbnQKdXNtX2NhbGNfb2Zmc2V0cyhzaXplX3QgZ2xvYmFsRGF0YUxlbiwgIC8qIFNOTVB2M01lc3NhZ2UgKyBIZWFkZXJEYXRhICovCiAgICAgICAgICAgICAgICAgaW50IHNlY0xldmVsLCBzaXplX3Qgc2VjRW5naW5lSURMZW4sIHNpemVfdCBzZWNOYW1lTGVuLCBzaXplX3Qgc2NvcGVkUGR1TGVuLCAgIC8qIEFuIEJFUiBlbmNvZGVkIHNlcXVlbmNlLiAqLwogICAgICAgICAgICAgICAgIHVfbG9uZyBlbmdpbmVib290cywgICAgLyogWFhYIChhc24xLmMgd29ya3MgaW4gbG9uZywgbm90IGludC4pICovCiAgICAgICAgICAgICAgICAgbG9uZyBlbmdpbmVfdGltZSwgICAgICAvKiBYWFggKGFzbjEuYyB3b3JrcyBpbiBsb25nLCBub3QgaW50LikgKi8KICAgICAgICAgICAgICAgICBzaXplX3QgKiB0aGVUb3RhbExlbmd0aCwgICAgICAgLyogZ2xvYmFsRGF0YUxlbiArIG1zZ1NlY3VyaXR5UC4gKyBtc2dEYXRhICovCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogYXV0aFBhcmFtc09mZnNldCwgICAgIC8qIERpc3RhbmNlIHRvIGF1dGggYnl0ZXMuICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIHNpemVfdCAqIHByaXZQYXJhbXNPZmZzZXQsICAgICAvKiBEaXN0YW5jZSB0byBwcml2IGJ5dGVzLiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBzaXplX3QgKiBkYXRhT2Zmc2V0LCAgIC8qIERpc3RhbmNlIHRvIHNjb3BlZFBkdSBTRVEgIC1vci0gIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjcnlwdGVkIChkYXRhKSBwb3J0aW9uIG9mIG1zZ0RhdGEuICAgICovCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogZGF0YWxlbiwgICAgICAvKiBTaXplIG9mIG1zZ0RhdGEgT0NURVQgU1RSSU5HIGVuY29kaW5nLiAgKi8KICAgICAgICAgICAgICAgICBzaXplX3QgKiBtc2dBdXRoUGFybUxlbiwgICAgICAgLyogU2l6ZSBvZiBtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMuICAgICovCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogbXNnUHJpdlBhcm1MZW4sICAgICAgIC8qIFNpemUgb2YgbXNnUHJpdmFjeVBhcmFtZXRlcnMuICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIHNpemVfdCAqIG90c3RsZW4sICAgICAgLyogU2l6ZSBvZiBtc2dTZWN1cml0eVAuIE8uUy4gZW5jb2RpbmcuICAgICovCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogc2VxX2xlbiwgICAgICAvKiBTaXplIG9mIG1zZ1NlY3VyaXR5UC4gU0VRIGRhdGEuICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBzaXplX3QgKiBtc2dTZWNQYXJtTGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpemUgb2YgbXNnU2VjdXJpdHlQLiBTRVEuICAgICAgICAgICAgICAqLwogICAgaW50ICAgICAgICAgICAgIGVuZ0lEbGVuLCAgIC8qIFNpemVzIG9mIE9DVEVUIFNUUklORyBhbmQgU0VRIGVuY29kaW5ncyAqLwogICAgICAgICAgICAgICAgICAgIGVuZ0J0bGVuLCAgIC8qICAgZm9yIGZpZWxkcyB3aXRoaW4gICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGVuZ1RtbGVuLCAgIC8qICAgbXNnU2VjdXJpdHlQYXJhbWV0ZXJzIHBvcnRpb24gb2YgICAgICAqLwogICAgICAgICAgICAgICAgICAgIG5hbWVsZW4sICAgIC8qICAgU05NUHYzTWVzc2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGF1dGhsZW4sIHByaXZsZW47CgogICAgLyoKICAgICAqIElmIGRvaW5nIGF1dGhlbnRpY2F0aW9uLCBtc2dBdXRoUGFybUxlbiA9IDEyIGVsc2UgbXNnQXV0aFBhcm1MZW4gPSAwLgogICAgICogSWYgZG9pbmcgZW5jcnlwdGlvbiwgICAgIG1zZ1ByaXZQYXJtTGVuID0gOCAgZWxzZSBtc2dQcml2UGFybUxlbiA9IDAuCiAgICAgKi8KICAgICptc2dBdXRoUGFybUxlbiA9IChzZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWCiAgICAgICAgICAgICAgICAgICAgICAgfHwgc2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpID8gMTIgOiAwOwoKICAgICptc2dQcml2UGFybUxlbiA9IChzZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVikgPyA4IDogMDsKCgogICAgLyoKICAgICAqIENhbGN1bGF0ZSBsZW5ndGhzLgogICAgICovCiAgICBpZiAoKGVuZ0lEbGVuID0gYXNuX3ByZWRpY3RfbGVuZ3RoKEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHNlY0VuZ2luZUlETGVuKSkgPT0gLTEpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaWYgKChlbmdCdGxlbiA9IGFzbl9wcmVkaWN0X2xlbmd0aChBU05fSU5URUdFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSAmIGVuZ2luZWJvb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobG9uZykpKSA9PSAtMSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAoKGVuZ1RtbGVuID0gYXNuX3ByZWRpY3RfbGVuZ3RoKEFTTl9JTlRFR0VSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopICYgZW5naW5lX3RpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsb25nKSkpID09IC0xKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmICgobmFtZWxlbiA9IGFzbl9wcmVkaWN0X2xlbmd0aChBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHNlY05hbWVMZW4pKSA9PSAtMSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAoKGF1dGhsZW4gPSBhc25fcHJlZGljdF9sZW5ndGgoQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAqbXNnQXV0aFBhcm1MZW4pKSA9PSAtMSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAoKHByaXZsZW4gPSBhc25fcHJlZGljdF9sZW5ndGgoQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAqbXNnUHJpdlBhcm1MZW4pKSA9PSAtMSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAqc2VxX2xlbiA9CiAgICAgICAgZW5nSURsZW4gKyBlbmdCdGxlbiArIGVuZ1RtbGVuICsgbmFtZWxlbiArIGF1dGhsZW4gKyBwcml2bGVuOwoKICAgIGlmICgoKm90c3RsZW4gPSBhc25fcHJlZGljdF9sZW5ndGgoQVNOX1NFUVVFTkNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAqc2VxX2xlbikpID09IC0xKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmICgoKm1zZ1NlY1Bhcm1MZW4gPSBhc25fcHJlZGljdF9sZW5ndGgoQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgKm90c3RsZW4pKSA9PSAtMSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAqYXV0aFBhcmFtc09mZnNldCA9IGdsb2JhbERhdGFMZW4gKyArKCptc2dTZWNQYXJtTGVuIC0gKnNlcV9sZW4pCiAgICAgICAgKyBlbmdJRGxlbiArIGVuZ0J0bGVuICsgZW5nVG1sZW4gKyBuYW1lbGVuCiAgICAgICAgKyAoYXV0aGxlbiAtICptc2dBdXRoUGFybUxlbik7CgogICAgKnByaXZQYXJhbXNPZmZzZXQgPSAqYXV0aFBhcmFtc09mZnNldCArICptc2dBdXRoUGFybUxlbgogICAgICAgICsgKHByaXZsZW4gLSAqbXNnUHJpdlBhcm1MZW4pOwoKCiAgICAvKgogICAgICogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgcGxhaW50ZXh0LiAgUm91bmQgdXAgdG8gYWNjb3VudCBmb3IgY2lwaGVyCiAgICAgKiBibG9jayBzaXplLCBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogWFhYICBUaGlzIGlzIGhhcmR3aXJlZCBmb3IgMURFUy4uLiBJZiBzY29wZWRQZHVMZW4gaXMgYWxyZWFkeQogICAgICogICAgICBhIG11bHRpcGxlIG9mIDgsIHRoZW4gKmFkZCogOCBtb3JlOyBvdGhlcndpc2UsIHJvdW5kIHVwCiAgICAgKiAgICAgIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIDguCiAgICAgKgogICAgICogRklYICBDYWxjdWxhdGlvbiBvZiBlbmNyeXB0ZWQgcG9ydGlvbiBvZiBtc2dEYXRhIGFuZCBjb25zZXF1ZW50CiAgICAgKiAgICAgIHNldHRpbmcgYW5kIHNhbml0eSBjaGVja2luZyBvZiB0aGVUb3RhbExlbmd0aCwgZXQgYWwuIHNob3VsZAogICAgICogICAgICBvY2N1ciAqYWZ0ZXIqIGVuY3J5cHRpb24gaGFzIHRha2VuIHBsYWNlLgogICAgICovCiAgICBpZiAoc2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBzY29wZWRQZHVMZW4gPSBST1VORFVQOChzY29wZWRQZHVMZW4pOwoKICAgICAgICBpZiAoKCpkYXRhbGVuID0KICAgICAgICAgICAgIGFzbl9wcmVkaWN0X2xlbmd0aChBU05fT0NURVRfU1RSLCBOVUxMLCBzY29wZWRQZHVMZW4pKSA9PSAtMSkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAqZGF0YWxlbiA9IHNjb3BlZFBkdUxlbjsKICAgIH0KCiAgICAqZGF0YU9mZnNldCA9IGdsb2JhbERhdGFMZW4gKyAqbXNnU2VjUGFybUxlbiArCiAgICAgICAgKCpkYXRhbGVuIC0gc2NvcGVkUGR1TGVuKTsKICAgICp0aGVUb3RhbExlbmd0aCA9IGdsb2JhbERhdGFMZW4gKyAqbXNnU2VjUGFybUxlbiArICpkYXRhbGVuOwoKICAgIHJldHVybiAwOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2NhbGNfb2Zmc2V0cygpICovCgoKCgoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9zZXRfc2FsdAogKgogKiBQYXJhbWV0ZXJzOgogKgkqaXYJCSAgKE8pICAgQnVmZmVyIHRvIGNvbnRhaW4gSVYuCiAqCSppdl9sZW5ndGgJICAoTykgICBMZW5ndGggb2YgaXYuCiAqCSpwcml2X3NhbHQJICAoSSkgICBTYWx0IHBvcnRpb24gb2YgcHJpdmF0ZSBrZXkuCiAqCSBwcml2X3NhbHRfbGVuZ3RoIChJKSAgIExlbmd0aCBvZiBwcml2X3NhbHQuCiAqCSptc2dTYWx0CSAgKEkvTykgUG9pbnRlciBzYWx0IHBvcnRpb24gb2Ygb3V0Z29pbmcgbXNnIGJ1ZmZlci4KICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCiAqCURldGVybWluZSB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGZvciB0aGUgREVTLUNCQyBlbmNyeXB0aW9uLgogKgkoQ2YuIFJGQyAyMjc0LCA4LjEuMS4xLikKICoKICoJaXYgaXMgZGVmaW5lZCBhcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBlbmdpbmVCb290cyBhbmQgdGhlCiAqCQlzYWx0IGludGVnZXIuCiAqCVRoZSBzYWx0IGludGVnZXIgaXMgaW5jcmVtZW50ZWQuCiAqCVRoZSByZXN1bHRpbmcgc2FsdCBpcyBjb3BpZWQgaW50byB0aGUgbXNnU2FsdCBidWZmZXIuCiAqCVRoZSByZXN1bHQgb2YgdGhlIGNvbmNhdGVuYXRpb24gaXMgdGhlbiBYT1JlZCB3aXRoIHRoZSBzYWx0CiAqCQlwb3J0aW9uIG9mIHRoZSBwcml2YXRlIGtleSAobGFzdCA4IGJ5dGVzKS4KICoJVGhlIElWIHJlc3VsdCBpcyByZXR1cm5lZCBpbmRpdmlkdWFsbHkgZm9yIGZ1cnRoZXIgdXNlLgogKi8KaW50CnVzbV9zZXRfc2FsdCh1X2NoYXIgKiBpdiwKICAgICAgICAgICAgIHNpemVfdCAqIGl2X2xlbmd0aCwKICAgICAgICAgICAgIHVfY2hhciAqIHByaXZfc2FsdCwgc2l6ZV90IHByaXZfc2FsdF9sZW5ndGgsIHVfY2hhciAqIG1zZ1NhbHQpCnsKICAgIHNpemVfdCAgICAgICAgICBwcm9wZXJzaXplX3NhbHQgPSBCWVRFU0laRShVU01fREVTX1NBTFRfTEVOR1RIKTsKICAgIGludCAgICAgICAgICAgICBuZXRfYm9vdHM7CiAgICBpbnQgICAgICAgICAgICAgbmV0X3NhbHRfaW50OwogICAgLyoKICAgICAqIG5ldF8qIHNob3VsZCBiZSBlbmNvZGVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gIFhYWCAgV2h5PwogICAgICovCiAgICBpbnQgICAgICAgICAgICAgaWluZGV4OwoKCiAgICAvKgogICAgICogU2FuaXR5IGNoZWNrLgogICAgICovCiAgICBpZiAoIWl2IHx8ICFpdl9sZW5ndGggfHwgIXByaXZfc2FsdCB8fCAoKml2X2xlbmd0aCAhPSBwcm9wZXJzaXplX3NhbHQpCiAgICAgICAgfHwgKHByaXZfc2FsdF9sZW5ndGggPCBwcm9wZXJzaXplX3NhbHQpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKCiAgICBuZXRfYm9vdHMgPSBodG9ubChzbm1wdjNfbG9jYWxfc25tcEVuZ2luZUJvb3RzKCkpOwogICAgbmV0X3NhbHRfaW50ID0gaHRvbmwoc2FsdF9pbnRlZ2VyKTsKCiAgICBzYWx0X2ludGVnZXIgKz0gMTsKCiAgICBtZW1jcHkoaXYsICZuZXRfYm9vdHMsIHByb3BlcnNpemVfc2FsdCAvIDIpOwogICAgbWVtY3B5KGl2ICsgKHByb3BlcnNpemVfc2FsdCAvIDIpLCAmbmV0X3NhbHRfaW50LCBwcm9wZXJzaXplX3NhbHQgLyAyKTsKCiAgICBpZiAobXNnU2FsdCkKICAgICAgICBtZW1jcHkobXNnU2FsdCwgaXYsIHByb3BlcnNpemVfc2FsdCk7CgoKICAgIC8qCiAgICAgKiBUdXJuIHRoZSBzYWx0IGludG8gYW4gSVY6IFhPUiA8Ym9vdHMsIHNhbHRfaW50PiB3aXRoIHNhbHQKICAgICAqIHBvcnRpb24gb2YgcHJpdl9rZXkuCiAgICAgKi8KICAgIGZvciAoaWluZGV4ID0gMDsgaWluZGV4IDwgKGludCkgcHJvcGVyc2l6ZV9zYWx0OyBpaW5kZXgrKykKICAgICAgICBpdltpaW5kZXhdIF49IHByaXZfc2FsdFtpaW5kZXhdOwoKCiAgICByZXR1cm4gMDsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9zZXRfc2FsdCgpICovCiNlbmRpZgoKI2lmZGVmIEhBVkVfQUVTCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9zZXRfYWVzX2l2CiAqCiAqIFBhcmFtZXRlcnM6CiAqCSppdgkJICAoTykgICBCdWZmZXIgdG8gY29udGFpbiBJVi4KICoJKml2X2xlbmd0aAkgIChPKSAgIExlbmd0aCBvZiBpdi4KICogICAgICBuZXRfYm9vdHMgICAgICAgICAoSSkgICB0aGUgbmV0d29yayBieXRlIG9yZGVyIG9mIHRoZSBhdXRoRW5nIGJvb3RzIHZhbAogKiAgICAgIG5ldF90aW1lICAgICAgICAgKEkpICAgdGhlIG5ldHdvcmsgYnl0ZSBvcmRlciBvZiB0aGUgYXV0aEVuZyB0aW1lIHZhbAogKiAgICAgICpzYWx0ICAgICAgICAgICAgIChPKSAgIEEgYnVmZmVyIGZvciB0aGUgb3V0Z29pbmcgc2FsdCAoPSA4IGJ5dGVzIG9mIGl2KQogKiAgICAgIAogKiBSZXR1cm5zOgogKgkwCU9uIHN1Y2Nlc3MsCiAqCS0xCU90aGVyd2lzZS4KICoKICoJRGV0ZXJtaW5lIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgZm9yIEFFUyBlbmNyeXB0aW9uLgogKgkoZHJhZnQtYmx1bWVudGhhbC1hZXMtdXNtLTAzLnR4dCwgMy4xLjIuMikKICoKICoJaXYgaXMgZGVmaW5lZCBhcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBlbmdpbmVCb290cywgZW5naW5lVGltZQogIAlhbmQgYSA2NCBiaXQgc2FsdC1pbnRlZ2VyLgogKglUaGUgNjQgYml0IHNhbHQgaW50ZWdlciBpcyBpbmNyZW1lbnRlZC4KICoJVGhlIHJlc3VsdGluZyBzYWx0IGlzIGNvcGllZCBpbnRvIHRoZSBzYWx0IGJ1ZmZlci4KICoJVGhlIElWIHJlc3VsdCBpcyByZXR1cm5lZCBpbmRpdmlkdWFsbHkgZm9yIGZ1cnRoZXIgdXNlLgogKi8KaW50CnVzbV9zZXRfYWVzX2l2KHVfY2hhciAqIGl2LAogICAgICAgICAgICAgICBzaXplX3QgKiBpdl9sZW5ndGgsCiAgICAgICAgICAgICAgIHVfaW50IG5ldF9ib290cywKICAgICAgICAgICAgICAgdV9pbnQgbmV0X3RpbWUsCiAgICAgICAgICAgICAgIHVfY2hhciAqIHNhbHQpCnsKICAgIC8qCiAgICAgKiBuZXRfKiBzaG91bGQgYmUgZW5jb2RlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCiAgICAgKi8KICAgIGludCAgICAgICAgICAgICBuZXRfc2FsdF9pbnQxLCBuZXRfc2FsdF9pbnQyOwojZGVmaW5lIFBST1BFUl9BRVNfSVZfU0laRSA2NAoKICAgIC8qCiAgICAgKiBTYW5pdHkgY2hlY2suCiAgICAgKi8KICAgIGlmICghaXYgfHwgIWl2X2xlbmd0aCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBuZXRfc2FsdF9pbnQxID0gaHRvbmwoc2FsdF9pbnRlZ2VyNjRfMSk7CiAgICBuZXRfc2FsdF9pbnQyID0gaHRvbmwoc2FsdF9pbnRlZ2VyNjRfMik7CgogICAgaWYgKChzYWx0X2ludGVnZXI2NF8yICs9IDEpID09IDApCiAgICAgICAgc2FsdF9pbnRlZ2VyNjRfMiArPSAxOwogICAgCiAgICAvKiBYWFg6IHdhcm5pbmc6IGhhcmQgY29kZWQgcHJvcGVyIGxlbmd0aHMgKi8KICAgIG1lbWNweShpdiwgJm5ldF9ib290cywgNCk7CiAgICBtZW1jcHkoaXYrNCwgJm5ldF90aW1lLCA0KTsKICAgIG1lbWNweShpdis4LCAmbmV0X3NhbHRfaW50MSwgNCk7CiAgICBtZW1jcHkoaXYrMTIsICZuZXRfc2FsdF9pbnQyLCA0KTsKCiAgICBtZW1jcHkoc2FsdCwgaXYrOCwgOCk7IC8qIG9ubHkgY29weSB0aGUgbmVlZGVkIHBvcnRpb24gKi8KICAgIHJldHVybiAwOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB1c21fc2V0X3NhbHQoKSAqLwojZW5kaWYgLyogSEFWRV9BRVMgKi8KCmludAp1c21fc2VjbW9kX2dlbmVyYXRlX291dF9tc2coc3RydWN0IHNubXBfc2VjbW9kX291dGdvaW5nX3BhcmFtcyAqcGFybXMpCnsKICAgIGlmICghcGFybXMpCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgIHJldHVybiB1c21fZ2VuZXJhdGVfb3V0X21zZyhwYXJtcy0+bXNnUHJvY01vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5nbG9iYWxEYXRhLCBwYXJtcy0+Z2xvYmFsRGF0YUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+bWF4TXNnU2l6ZSwgcGFybXMtPnNlY01vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNFbmdpbmVJRCwgcGFybXMtPnNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNOYW1lLCBwYXJtcy0+c2VjTmFtZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjTGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNjb3BlZFBkdSwgcGFybXMtPnNjb3BlZFBkdUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjU3RhdGVSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY1BhcmFtcywgcGFybXMtPnNlY1BhcmFtc0xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+d2hvbGVNc2csIHBhcm1zLT53aG9sZU1zZ0xlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9nZW5lcmF0ZV9vdXRfbXNnCiAqCiAqIFBhcmFtZXRlcnM6CiAqCShTZWUgbGlzdCBiZWxvdy4uLikKICogICAgICAKICogUmV0dXJuczoKICoJU05NUEVSUl9TVUNDRVNTCQkJT24gc3VjY2Vzcy4KICoJU05NUEVSUl9VU01fQVVUSEVOVElDQVRJT05GQUlMVVJFCiAqCVNOTVBFUlJfVVNNX0VOQ1JZUFRJT05FUlJPUgogKglTTk1QRVJSX1VTTV9HRU5FUklDRVJST1IKICoJU05NUEVSUl9VU01fVU5LTk9XTlNFQ1VSSVRZTkFNRQogKglTTk1QRVJSX1VTTV9HRU5FUklDRVJST1IKICoJU05NUEVSUl9VU01fVU5TVVBQT1JURURTRUNVUklUWUxFVkVMCiAqCQogKgogKiBHZW5lcmF0ZXMgYW4gb3V0Z29pbmcgbWVzc2FnZS4KICoKICogWFhYCUJld2FyZSBvZiBtaXNub21lcnMhCiAqLwppbnQKdXNtX2dlbmVyYXRlX291dF9tc2coaW50IG1zZ1Byb2NNb2RlbCwgIC8qIChVTlVTRUQpICovCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIGdsb2JhbERhdGEsICAgICAgIC8qIElOICovCiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqIFBvaW50ZXIgdG8gbXNnIGhlYWRlciBkYXRhIHdpbGwgcG9pbnQgdG8gdGhlIGJlZ2lubmluZwogICAgICAgICAgICAgICAgICAgICAgKiAqIG9mIHRoZSBlbnRpcmUgcGFja2V0IGJ1ZmZlciB0byBiZSB0cmFuc21pdHRlZCBvbiB3aXJlLAogICAgICAgICAgICAgICAgICAgICAgKiAqIG1lbW9yeSB3aWxsIGJlIGNvbnRpZ3VvdXMgd2l0aCBzZWNQYXJhbXMsIHR5cGljYWxseQogICAgICAgICAgICAgICAgICAgICAgKiAqIHRoaXMgcG9pbnRlciB3aWxsIGJlIHBhc3NlZCBiYWNrIGFzIGJlZ2lubmluZyBvZgogICAgICAgICAgICAgICAgICAgICAgKiAqIHdob2xlTXNnIGJlbG93LiAgYXNuIHNlcS4gbGVuZ3RoIGlzIHVwZGF0ZWQgdy8gbmV3IGxlbmd0aC4KICAgICAgICAgICAgICAgICAgICAgICogKgogICAgICAgICAgICAgICAgICAgICAgKiAqIFdoaWxlIHRoaXMgcG9pbnRzIHRvIGEgYnVmZmVyIHRoYXQgc2hvdWxkIGJlIGJpZyBlbm91Z2gKICAgICAgICAgICAgICAgICAgICAgICogKiBmb3IgdGhlIHdob2xlIG1lc3NhZ2UsIG9ubHkgdGhlIGZpcnN0IHR3byBwYXJ0cwogICAgICAgICAgICAgICAgICAgICAgKiAqIG9mIHRoZSBtZXNzYWdlIGFyZSBjb21wbGV0ZWQsIG5hbWVseSBTTk1QdjNNZXNzYWdlIGFuZAogICAgICAgICAgICAgICAgICAgICAgKiAqIEhlYWRlckRhdGEuICBnbG9iYWxEYXRhTGVuIChuZXh0IHBhcmFtZXRlcikgcmVwcmVzZW50cwogICAgICAgICAgICAgICAgICAgICAgKiAqIHRoZSBsZW5ndGggb2YgdGhlc2UgdHdvIGNvbXBsZXRlZCBwYXJ0cy4KICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBnbG9iYWxEYXRhTGVuLCAgICAgIC8qIElOIC0gTGVuZ3RoIG9mIG1zZyBoZWFkZXIgZGF0YS4gICAgICAqLwogICAgICAgICAgICAgICAgICAgICBpbnQgbWF4TXNnU2l6ZSwgICAgLyogKFVOVVNFRCkgKi8KICAgICAgICAgICAgICAgICAgICAgaW50IHNlY01vZGVsLCAgICAgIC8qIChVTlVTRUQpICovCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHNlY0VuZ2luZUlELCAgICAgIC8qIElOIC0gUG9pbnRlciBzbm1wRW5naW5lSUQuICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2VjRW5naW5lSURMZW4sICAgICAvKiBJTiAtIFNubXBFbmdpbmVJRCBsZW5ndGguICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgY2hhciAqc2VjTmFtZSwgICAgIC8qIElOIC0gUG9pbnRlciB0byBzZWN1cml0eU5hbWUuICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2VjTmFtZUxlbiwgLyogSU4gLSBTZWN1cml0eU5hbWUgbGVuZ3RoLiAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIGludCBzZWNMZXZlbCwgICAgICAvKiBJTiAtIEF1dGhOb1ByaXYsIGF1dGhQcml2IGV0Yy4gICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc2NvcGVkUGR1LCAgICAgICAgLyogSU4gKi8KICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogUG9pbnRlciB0byBzY29wZWRQZHUgd2lsbCBiZSBlbmNyeXB0ZWQgYnkgVVNNIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgICAgICAgKiAqIGFuZCB3cml0dGVuIHRvIHBhY2tldCBidWZmZXIgaW1tZWRpYXRlbHkgZm9sbG93aW5nCiAgICAgICAgICAgICAgICAgICAgICAqICogc2VjdXJpdHlQYXJhbWV0ZXJzLCBlbnRpcmUgbXNnIHdpbGwgYmUgYXV0aGVudGljYXRlZCBieQogICAgICAgICAgICAgICAgICAgICAgKiAqIFVTTSBpZiBuZWVkZWQuCiAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2NvcGVkUGR1TGVuLCAgICAgICAvKiBJTiAtIHNjb3BlZFBkdSBsZW5ndGguICovCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNlY1N0YXRlUmVmLCAvKiBJTiAqLwogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiBzZWNTdGF0ZVJlZiwgcG9pbnRlciB0byBjYWNoZWQgaW5mbyBwcm92aWRlZCBvbmx5IGZvcgogICAgICAgICAgICAgICAgICAgICAgKiAqIFJlc3BvbnNlLCBvdGhlcndpc2UgTlVMTC4KICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHNlY1BhcmFtcywgICAgICAgIC8qIE9VVCAqLwogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiBCRVIgZW5jb2RlZCBzZWN1cml0eVBhcmFtZXRlcnMgcG9pbnRlciB0byBvZmZzZXQgd2l0aGluCiAgICAgICAgICAgICAgICAgICAgICAqICogcGFja2V0IGJ1ZmZlciB3aGVyZSBzZWNQYXJhbXMgc2hvdWxkIGJlIHdyaXR0ZW4sIHRoZQogICAgICAgICAgICAgICAgICAgICAgKiAqIGVudGlyZSBCRVIgZW5jb2RlZCBPQ1RFVCBTVFJJTkcgKGluY2x1ZGluZyBoZWFkZXIpIGlzCiAgICAgICAgICAgICAgICAgICAgICAqICogd3JpdHRlbiBoZXJlIGJ5IFVTTSBzZWNQYXJhbXMgPSBnbG9iYWxEYXRhICsKICAgICAgICAgICAgICAgICAgICAgICogKiBnbG9iYWxEYXRhTGVuLgogICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogc2VjUGFyYW1zTGVuLCAgICAgLyogSU4vT1VUIC0gTGVuIGF2YWlsYWJsZSwgbGVuIHJldHVybmVkLiAqLwogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogd2hvbGVNc2csICAgICAgICAvKiBPVVQgKi8KICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogQ29tcGxldGUgYXV0aGVudGljYXRlZC9lbmNyeXB0ZWQgbWVzc2FnZSAtIHR5cGljYWxseQogICAgICAgICAgICAgICAgICAgICAgKiAqIHRoZSBwb2ludGVyIHRvIHN0YXJ0IG9mIHBhY2tldCBidWZmZXIgcHJvdmlkZWQgaW4KICAgICAgICAgICAgICAgICAgICAgICogKiBnbG9iYWxEYXRhIGlzIHJldHVybmVkIGhlcmUsIGNvdWxkIGFsc28gYmUgYSBzZXBhcmF0ZQogICAgICAgICAgICAgICAgICAgICAgKiAqIGJ1ZmZlci4KICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHdob2xlTXNnTGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOL09VVCAtIExlbiBhdmFpbGFibGUsIGxlbiByZXR1cm5lZC4gKi8KICAgIHNpemVfdCAgICAgICAgICBvdHN0bGVuOwogICAgc2l6ZV90ICAgICAgICAgIHNlcV9sZW47CiAgICBzaXplX3QgICAgICAgICAgbXNnQXV0aFBhcm1MZW47CiAgICBzaXplX3QgICAgICAgICAgbXNnUHJpdlBhcm1MZW47CiAgICBzaXplX3QgICAgICAgICAgbXNnU2VjUGFybUxlbjsKICAgIHNpemVfdCAgICAgICAgICBhdXRoUGFyYW1zT2Zmc2V0OwogICAgc2l6ZV90ICAgICAgICAgIHByaXZQYXJhbXNPZmZzZXQ7CiAgICBzaXplX3QgICAgICAgICAgZGF0YWxlbjsKICAgIHNpemVfdCAgICAgICAgICBkYXRhT2Zmc2V0OwogICAgc2l6ZV90ICAgICAgICAgIHRoZVRvdGFsTGVuZ3RoOwoKICAgIHVfY2hhciAgICAgICAgICpwdHI7CiAgICBzaXplX3QgICAgICAgICAgcHRyX2xlbjsKICAgIHNpemVfdCAgICAgICAgICByZW1haW5pbmc7CiAgICBzaXplX3QgICAgICAgICAgb2ZmU2V0OwogICAgdV9pbnQgICAgICAgICAgIGJvb3RzX3VpbnQ7CiAgICB1X2ludCAgICAgICAgICAgdGltZV91aW50OwogICAgbG9uZyAgICAgICAgICAgIGJvb3RzX2xvbmc7CiAgICBsb25nICAgICAgICAgICAgdGltZV9sb25nOwoKICAgIC8qCiAgICAgKiBJbmRpcmVjdGlvbiBiZWNhdXNlIHNlY1N0YXRlUmVmIHZhbHVlcyBvdmVycmlkZSBwYXJhbWV0ZXJzLgogICAgICogCiAgICAgKiBOb25lIG9mIHRoZXNlIGFyZSB0byBiZSBmcmVlJ2QgLSB0aGV5IGFyZSBlaXRoZXIgcG9pbnRpbmcgdG8KICAgICAqIHdoYXQncyBpbiB0aGUgc2VjU3RhdGVSZWYgb3IgdG8gc29tZXRoaW5nIGVpdGhlciBpbiB0aGUKICAgICAqIGFjdHVhbCBwcmFybWV0ZXIgbGlzdCBvciB0aGUgdXNlciBsaXN0LgogICAgICovCgogICAgY2hhciAgICAgICAgICAgKnRoZU5hbWUgPSBOVUxMOwogICAgdV9pbnQgICAgICAgICAgIHRoZU5hbWVMZW5ndGggPSAwOwogICAgdV9jaGFyICAgICAgICAgKnRoZUVuZ2luZUlEID0gTlVMTDsKICAgIHVfaW50ICAgICAgICAgICB0aGVFbmdpbmVJRExlbmd0aCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAqdGhlQXV0aEtleSA9IE5VTEw7CiAgICB1X2ludCAgICAgICAgICAgdGhlQXV0aEtleUxlbmd0aCA9IDA7CiAgICBjb25zdCBvaWQgICAgICAqdGhlQXV0aFByb3RvY29sID0gTlVMTDsKICAgIHVfaW50ICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGggPSAwOwogICAgdV9jaGFyICAgICAgICAgKnRoZVByaXZLZXkgPSBOVUxMOwogICAgdV9pbnQgICAgICAgICAgIHRoZVByaXZLZXlMZW5ndGggPSAwOwogICAgY29uc3Qgb2lkICAgICAgKnRoZVByaXZQcm90b2NvbCA9IE5VTEw7CiAgICB1X2ludCAgICAgICAgICAgdGhlUHJpdlByb3RvY29sTGVuZ3RoID0gMDsKICAgIGludCAgICAgICAgICAgICB0aGVTZWNMZXZlbCA9IDA7ICAgIC8qIE5vIGRlZmluZWQgY29uc3QgZm9yIGJhZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdmFsdWUgKG90aGVyIHRoZW4gZXJyKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVVNNIHByb2Nlc3NpbmcgaGFzIGJlZ3VuLlxuIikpOwoKICAgIGlmIChzZWNTdGF0ZVJlZiAhPSBOVUxMKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBUbyBodXNoIHRoZSBjb21waWxlciBmb3Igbm93LiAgWFhYIAogICAgICAgICAqLwogICAgICAgIHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqcmVmCiAgICAgICAgICAgID0gKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqKSBzZWNTdGF0ZVJlZjsKCiAgICAgICAgdGhlTmFtZSA9IHJlZi0+dXNyX25hbWU7CiAgICAgICAgdGhlTmFtZUxlbmd0aCA9IHJlZi0+dXNyX25hbWVfbGVuZ3RoOwogICAgICAgIHRoZUVuZ2luZUlEID0gcmVmLT51c3JfZW5naW5lX2lkOwogICAgICAgIHRoZUVuZ2luZUlETGVuZ3RoID0gcmVmLT51c3JfZW5naW5lX2lkX2xlbmd0aDsKCiAgICAgICAgaWYgKCF0aGVFbmdpbmVJRExlbmd0aCkgewogICAgICAgICAgICB0aGVFbmdpbmVJRCA9IHNlY0VuZ2luZUlEOwogICAgICAgICAgICB0aGVFbmdpbmVJRExlbmd0aCA9IHNlY0VuZ2luZUlETGVuOwogICAgICAgIH0KCiAgICAgICAgdGhlQXV0aFByb3RvY29sID0gcmVmLT51c3JfYXV0aF9wcm90b2NvbDsKICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGggPSByZWYtPnVzcl9hdXRoX3Byb3RvY29sX2xlbmd0aDsKICAgICAgICB0aGVBdXRoS2V5ID0gcmVmLT51c3JfYXV0aF9rZXk7CiAgICAgICAgdGhlQXV0aEtleUxlbmd0aCA9IHJlZi0+dXNyX2F1dGhfa2V5X2xlbmd0aDsKICAgICAgICB0aGVQcml2UHJvdG9jb2wgPSByZWYtPnVzcl9wcml2X3Byb3RvY29sOwogICAgICAgIHRoZVByaXZQcm90b2NvbExlbmd0aCA9IHJlZi0+dXNyX3ByaXZfcHJvdG9jb2xfbGVuZ3RoOwogICAgICAgIHRoZVByaXZLZXkgPSByZWYtPnVzcl9wcml2X2tleTsKICAgICAgICB0aGVQcml2S2V5TGVuZ3RoID0gcmVmLT51c3JfcHJpdl9rZXlfbGVuZ3RoOwogICAgICAgIHRoZVNlY0xldmVsID0gcmVmLT51c3Jfc2VjX2xldmVsOwogICAgfQoKICAgIC8qCiAgICAgKiBJZGVudGlmeSB0aGUgdXNlciByZWNvcmQuCiAgICAgKi8KICAgIGVsc2UgewogICAgICAgIHN0cnVjdCB1c21Vc2VyICp1c2VyOwoKICAgICAgICAvKgogICAgICAgICAqIHdlIGRvIGFsbG93IGFuIHVua25vd24gdXNlciBuYW1lIGZvcgogICAgICAgICAqIHVuYXV0aGVudGljYXRlZCByZXF1ZXN0cy4gCiAgICAgICAgICovCiAgICAgICAgaWYgKCh1c2VyID0gdXNtX2dldF91c2VyKHNlY0VuZ2luZUlELCBzZWNFbmdpbmVJRExlbiwgc2VjTmFtZSkpCiAgICAgICAgICAgID09IE5VTEwgJiYgc2VjTGV2ZWwgIT0gU05NUF9TRUNfTEVWRUxfTk9BVVRIKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVW5rbm93biBVc2VyKCVzKVxuIiwgc2VjTmFtZSkpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9VTktOT1dOU0VDVVJJVFlOQU1FOwogICAgICAgIH0KCiAgICAgICAgdGhlTmFtZSA9IHNlY05hbWU7CiAgICAgICAgdGhlTmFtZUxlbmd0aCA9IHNlY05hbWVMZW47CiAgICAgICAgdGhlRW5naW5lSUQgPSBzZWNFbmdpbmVJRDsKICAgICAgICB0aGVTZWNMZXZlbCA9IHNlY0xldmVsOwogICAgICAgIHRoZUVuZ2luZUlETGVuZ3RoID0gc2VjRW5naW5lSURMZW47CiAgICAgICAgaWYgKHVzZXIpIHsKICAgICAgICAgICAgdGhlQXV0aFByb3RvY29sID0gdXNlci0+YXV0aFByb3RvY29sOwogICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGggPSB1c2VyLT5hdXRoUHJvdG9jb2xMZW47CiAgICAgICAgICAgIHRoZUF1dGhLZXkgPSB1c2VyLT5hdXRoS2V5OwogICAgICAgICAgICB0aGVBdXRoS2V5TGVuZ3RoID0gdXNlci0+YXV0aEtleUxlbjsKICAgICAgICAgICAgdGhlUHJpdlByb3RvY29sID0gdXNlci0+cHJpdlByb3RvY29sOwogICAgICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGggPSB1c2VyLT5wcml2UHJvdG9jb2xMZW47CiAgICAgICAgICAgIHRoZVByaXZLZXkgPSB1c2VyLT5wcml2S2V5OwogICAgICAgICAgICB0aGVQcml2S2V5TGVuZ3RoID0gdXNlci0+cHJpdktleUxlbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB1bmtub3duIHVzZXJzIGNhbiBub3QgZG8gYXV0aGVudGljYXRpb24gKG9idmlvdXNseSkgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2wgPSB1c21Ob0F1dGhQcm90b2NvbDsKICAgICAgICAgICAgdGhlQXV0aFByb3RvY29sTGVuZ3RoID0KICAgICAgICAgICAgICAgIHNpemVvZih1c21Ob0F1dGhQcm90b2NvbCkgLyBzaXplb2Yob2lkKTsKICAgICAgICAgICAgdGhlQXV0aEtleSA9IE5VTEw7CiAgICAgICAgICAgIHRoZUF1dGhLZXlMZW5ndGggPSAwOwogICAgICAgICAgICB0aGVQcml2UHJvdG9jb2wgPSB1c21Ob1ByaXZQcm90b2NvbDsKICAgICAgICAgICAgdGhlUHJpdlByb3RvY29sTGVuZ3RoID0KICAgICAgICAgICAgICAgIHNpemVvZih1c21Ob1ByaXZQcm90b2NvbCkgLyBzaXplb2Yob2lkKTsKICAgICAgICAgICAgdGhlUHJpdktleSA9IE5VTEw7CiAgICAgICAgICAgIHRoZVByaXZLZXlMZW5ndGggPSAwOwogICAgICAgIH0KICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmRpZiAtLSBzZWNTdGF0ZVJlZj09TlVMTCAqLwoKCiAgICAvKgogICAgICogRnJvbSBoZXJlIHRvIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCBhdm9pZCByZWZlcmVuY2UgdG8KICAgICAqIHNlY05hbWUsIHNlY0VuZ2luZUlELCBzZWNMZXZlbCwgYW5kIGFzc29jaWF0ZWQgbGVuZ3Rocy4KICAgICAqLwoKCiAgICAvKgogICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSB1c2VyIGNhbiB1c2UgdGhlIHJlcXVlc3RlZCBzZWMgc2VydmljZXMuCiAgICAgKi8KICAgIGlmICh1c21fY2hlY2tfc2VjTGV2ZWxfdnNfcHJvdG9jb2xzKHRoZVNlY0xldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXV0aFByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXV0aFByb3RvY29sTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHJpdlByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHJpdlByb3RvY29sTGVuZ3RoKSA9PSAxKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJVbnN1cHBvcnRlZCBTZWN1cml0eSBMZXZlbCAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgIHRoZVNlY0xldmVsKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9VTlNVUFBPUlRFRFNFQ1VSSVRZTEVWRUw7CiAgICB9CgoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgZW5naW5lIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIFhYWCAgTm8gZXJyb3IgaXMgZGVjbGFyZWQgaW4gdGhlIEVvUCB3aGVuIHNlbmRpbmcgbWVzc2FnZXMgdG8KICAgICAqICAgICAgdW5rbm93biBlbmdpbmVzLCBwcm9jZXNzaW5nIGNvbnRpbnVlcyB3LyBib290cy90aW1lID09ICgwLDApLgogICAgICovCiAgICBpZiAoZ2V0X2VuZ2luZXRpbWUodGhlRW5naW5lSUQsIHRoZUVuZ2luZUlETGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICZib290c191aW50LCAmdGltZV91aW50LCBGQUxTRSkgPT0gLTEpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiRmFpbGVkIHRvIGZpbmQgZW5naW5lIGRhdGEuIikpOwogICAgfQoKICAgIGJvb3RzX2xvbmcgPSBib290c191aW50OwogICAgdGltZV9sb25nID0gdGltZV91aW50OwoKCiAgICAvKgogICAgICogU2V0IHVwIHRoZSBPZmZzZXRzLgogICAgICovCiAgICBpZiAodXNtX2NhbGNfb2Zmc2V0cyhnbG9iYWxEYXRhTGVuLCB0aGVTZWNMZXZlbCwgdGhlRW5naW5lSURMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVOYW1lTGVuZ3RoLCBzY29wZWRQZHVMZW4sIGJvb3RzX2xvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2xvbmcsICZ0aGVUb3RhbExlbmd0aCwgJmF1dGhQYXJhbXNPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpdlBhcmFtc09mZnNldCwgJmRhdGFPZmZzZXQsICZkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgJm1zZ0F1dGhQYXJtTGVuLCAmbXNnUHJpdlBhcm1MZW4sICZvdHN0bGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgJnNlcV9sZW4sICZtc2dTZWNQYXJtTGVuKSA9PSAtMSkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiRmFpbGVkIGNhbGN1bGF0aW5nIG9mZnNldHMuXG4iKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICB9CgogICAgLyoKICAgICAqIFNvLCB3ZSBoYXZlIHRoZSBvZmZzZXRzIGZvciB0aGUgdGhyZWUgcGFydHMgdGhhdCBuZWVkIHRvIGJlCiAgICAgKiBkZXRlcm1pbmVkLCBhbmQgYW4gb3ZlcmFsbCBsZW5ndGguICBOb3cgd2UgbmVlZCB0byBtYWtlCiAgICAgKiBzdXJlIGFsbCBvZiB0aGlzIHdvdWxkIGZpdCBpbiB0aGUgb3V0Z29pbmcgYnVmZmVyLCBhbmQKICAgICAqIHdoZXRoZXIgb3Igbm90IHdlIG5lZWQgdG8gbWFrZSBhIG5ldyBidWZmZXIsIGV0Yy4KICAgICAqLwoKCiAgICAvKgogICAgICogU2V0IHdob2xlTXNnIGFzIGEgcG9pbnRlciB0byBnbG9iYWxEYXRhLiAgU2FuaXR5IGNoZWNrIGZvcgogICAgICogdGhlIHByb3BlciBzaXplLgogICAgICogCiAgICAgKiBNYXJrIHdvcmtzcGFjZSBpbiB0aGUgbWVzc2FnZSB3aXRoIGJ5dGVzIG9mIGFsbCAxJ3MgdG8gbWFrZSBpdAogICAgICogZWFzaWVyIHRvIGZpbmQgbWlzdGFrZXMgaW4gcmF3IG1lc3NhZ2UgZHVtcHMuCiAgICAgKi8KICAgIHB0ciA9ICp3aG9sZU1zZyA9IGdsb2JhbERhdGE7CiAgICBpZiAodGhlVG90YWxMZW5ndGggPiAqd2hvbGVNc2dMZW4pIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIk1lc3NhZ2Ugd29uJ3QgZml0IGluIGJ1ZmZlci5cbiIpKTsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgIH0KCiAgICBwdHJfbGVuID0gKndob2xlTXNnTGVuID0gdGhlVG90YWxMZW5ndGg7CgojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICBtZW1zZXQoJnB0cltnbG9iYWxEYXRhTGVuXSwgMHhGRiwgdGhlVG90YWxMZW5ndGggLSBnbG9iYWxEYXRhTGVuKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KCiAgICAvKgogICAgICogRG8gdGhlIGVuY3J5cHRpb24uCiAgICAgKi8KICAgIGlmICh0aGVTZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVikgewogICAgICAgIHNpemVfdCAgICAgICAgICBlbmNyeXB0ZWRfbGVuZ3RoID0gdGhlVG90YWxMZW5ndGggLSBkYXRhT2Zmc2V0OwogICAgICAgIHNpemVfdCAgICAgICAgICBzYWx0X2xlbmd0aCA9IEJZVEVTSVpFKFVTTV9NQVhfU0FMVF9MRU5HVEgpOwogICAgICAgIHVfY2hhciAgICAgICAgICBzYWx0W0JZVEVTSVpFKFVTTV9NQVhfU0FMVF9MRU5HVEgpXTsKCiAgICAgICAgLyoKICAgICAgICAgKiBYWFggIEhhcmR3aXJlZCB0byBzZWVrIGludG8gYSAxREVTIHByaXZhdGUga2V5IQogICAgICAgICAqLwojaWZkZWYgSEFWRV9BRVMKICAgICAgICBpZiAoSVNUUkFOU0ZPUk0odGhlUHJpdlByb3RvY29sLCBBRVNQcml2KSkgewogICAgICAgICAgICBpZiAoIXRoZVByaXZLZXkgfHwKICAgICAgICAgICAgICAgIHVzbV9zZXRfYWVzX2l2KHNhbHQsICZzYWx0X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0b25sKGJvb3RzX3VpbnQpLCBodG9ubCh0aW1lX3VpbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0cltwcml2UGFyYW1zT2Zmc2V0XSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiQ2FuJ3Qgc2V0IEFFUyBpdi5cbiIpKTsKICAgICAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICB9IAojZW5kaWYKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiAgICAgICAgaWYgKElTVFJBTlNGT1JNKHRoZVByaXZQcm90b2NvbCwgREVTUHJpdikpIHsKICAgICAgICAgICAgaWYgKCF0aGVQcml2S2V5IHx8CiAgICAgICAgICAgICAgICAodXNtX3NldF9zYWx0KHNhbHQsICZzYWx0X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHJpdktleSArIDgsIHRoZVByaXZLZXlMZW5ndGggLSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyW3ByaXZQYXJhbXNPZmZzZXRdKQogICAgICAgICAgICAgICAgID09IC0xKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJDYW4ndCBzZXQgREVTLUNCQyBzYWx0LlxuIikpOwogICAgICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmCgogICAgICAgIGlmIChzY19lbmNyeXB0KHRoZVByaXZQcm90b2NvbCwgdGhlUHJpdlByb3RvY29sTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgIHRoZVByaXZLZXksIHRoZVByaXZLZXlMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUGR1LCBzY29wZWRQZHVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgJnB0cltkYXRhT2Zmc2V0XSwgJmVuY3J5cHRlZF9sZW5ndGgpCiAgICAgICAgICAgICE9IFNOTVBfRVJSX05PRVJST1IpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJlbmNyeXB0aW9uIGVycm9yLlxuIikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9FTkNSWVBUSU9ORVJST1I7CiAgICAgICAgfQojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgaWYgKGRlYnVnX2lzX3Rva2VuX3JlZ2lzdGVyZWQoInVzbS9kdW1wIikgPT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIGR1bXBfY2h1bmsoInVzbS9kdW1wIiwgIlRoaXMgZGF0YSB3YXMgZW5jcnlwdGVkOiIsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUGR1LCBzY29wZWRQZHVMZW4pOwogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJzYWx0ICsgRW5jcnlwdGVkIGZvcm06IiwKICAgICAgICAgICAgICAgICAgICAgICBzYWx0LCBzYWx0X2xlbmd0aCk7CiAgICAgICAgICAgIGR1bXBfY2h1bmsoInVzbS9kdW1wIiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAmcHRyW2RhdGFPZmZzZXRdLCBlbmNyeXB0ZWRfbGVuZ3RoKTsKICAgICAgICAgICAgZHVtcF9jaHVuaygidXNtL2R1bXAiLCAiKndob2xlTXNnOiIsCiAgICAgICAgICAgICAgICAgICAgICAgKndob2xlTXNnLCB0aGVUb3RhbExlbmd0aCk7CiAgICAgICAgfQojZW5kaWYKCgogICAgICAgIHB0ciA9ICp3aG9sZU1zZzsKICAgICAgICBwdHJfbGVuID0gKndob2xlTXNnTGVuID0gdGhlVG90YWxMZW5ndGg7CgoKICAgICAgICAvKgogICAgICAgICAqIFhYWCAgU2FuaXR5IGNoZWNrIGZvciBzYWx0IGxlbmd0aCBzaG91bGQgYmUgbW92ZWQgdXAKICAgICAgICAgKiAgICAgIHVuZGVyIHVzbV9jYWxjX29mZnNldHMoKSBvciB0b3NzZWQuCiAgICAgICAgICovCiAgICAgICAgaWYgKChlbmNyeXB0ZWRfbGVuZ3RoICE9ICh0aGVUb3RhbExlbmd0aCAtIGRhdGFPZmZzZXQpKQogICAgICAgICAgICB8fCAoc2FsdF9sZW5ndGggIT0gbXNnUHJpdlBhcm1MZW4pKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiZW5jcnlwdGlvbiBsZW5ndGggZXJyb3IuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0VOQ1JZUFRJT05FUlJPUjsKICAgICAgICB9CgogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiRW5jcnlwdGlvbiBzdWNjZXNzZnVsLlxuIikpOwogICAgfQoKICAgIC8qCiAgICAgKiBObyBlbmNyeXB0aW9uIGZvciB5b3UhCiAgICAgKi8KICAgIGVsc2UgewogICAgICAgIG1lbWNweSgmcHRyW2RhdGFPZmZzZXRdLCBzY29wZWRQZHUsIHNjb3BlZFBkdUxlbik7CiAgICB9CgoKCiAgICAvKgogICAgICogU3RhcnQgZmlsbGluZyBpbiB0aGUgb3RoZXIgZmllbGRzIChpbiBwcmVwIGZvciBhdXRoZW50aWNhdGlvbikuCiAgICAgKiAKICAgICAqIG9mZlNldCBpcyBhbiBvY3RldCBzdHJpbmcgaGVhZGVyLCB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSBhbGwKICAgICAqIHRoZSBvdGhlciBoZWFkZXJzLgogICAgICovCiAgICByZW1haW5pbmcgPSBwdHJfbGVuIC0gZ2xvYmFsRGF0YUxlbjsKCiAgICBvZmZTZXQgPSBwdHJfbGVuIC0gcmVtYWluaW5nOwogICAgYXNuX2J1aWxkX2hlYWRlcigmcHRyW29mZlNldF0sICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSKSwgb3RzdGxlbik7CgogICAgb2ZmU2V0ID0gcHRyX2xlbiAtIHJlbWFpbmluZzsKICAgIGFzbl9idWlsZF9zZXF1ZW5jZSgmcHRyW29mZlNldF0sICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9TRVFVRU5DRSB8IEFTTl9DT05TVFJVQ1RPUiksIHNlcV9sZW4pOwoKICAgIG9mZlNldCA9IHB0cl9sZW4gLSByZW1haW5pbmc7CiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlEIik7CiAgICBhc25fYnVpbGRfc3RyaW5nKCZwdHJbb2ZmU2V0XSwgJnJlbWFpbmluZywKICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9PQ1RFVF9TVFIpLCB0aGVFbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICAgdGhlRW5naW5lSURMZW5ndGgpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgb2ZmU2V0ID0gcHRyX2xlbiAtIHJlbWFpbmluZzsKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJtc2dBdXRob3JpdGF0aXZlRW5naW5lQm9vdHMiKTsKICAgIGFzbl9idWlsZF9pbnQoJnB0cltvZmZTZXRdLCAmcmVtYWluaW5nLAogICAgICAgICAgICAgICAgICAodV9jaGFyKSAoQVNOX1VOSVZFUlNBTCB8IEFTTl9QUklNSVRJVkUgfCBBU05fSU5URUdFUiksCiAgICAgICAgICAgICAgICAgICZib290c19sb25nLCBzaXplb2YobG9uZykpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgb2ZmU2V0ID0gcHRyX2xlbiAtIHJlbWFpbmluZzsKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJtc2dBdXRob3JpdGF0aXZlRW5naW5lVGltZSIpOwogICAgYXNuX2J1aWxkX2ludCgmcHRyW29mZlNldF0sICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8IEFTTl9JTlRFR0VSKSwKICAgICAgICAgICAgICAgICAgJnRpbWVfbG9uZywgc2l6ZW9mKGxvbmcpKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIG9mZlNldCA9IHB0cl9sZW4gLSByZW1haW5pbmc7CiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnVXNlck5hbWUiKTsKICAgIGFzbl9idWlsZF9zdHJpbmcoJnB0cltvZmZTZXRdLCAmcmVtYWluaW5nLAogICAgICAgICAgICAgICAgICAgICAodV9jaGFyKSAoQVNOX1VOSVZFUlNBTCB8IEFTTl9QUklNSVRJVkUgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiksICh1X2NoYXIgKikgdGhlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgdGhlTmFtZUxlbmd0aCk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKCgogICAgLyoKICAgICAqIE5vdGU6IGlmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uIGJlaW5nIGRvbmUsCiAgICAgKiBtc2dBdXRoUGFybUxlbiBpcyAwLCBhbmQgdGhlcmUgaXMgbm8gZWZmZWN0IChvdGhlciB0aGFuCiAgICAgKiBpbnNlcnRpbmcgYSB6ZXJvLWxlbmd0aCBoZWFkZXIpIG9mIHRoZSBmb2xsb3dpbmcKICAgICAqIHN0YXRlbWVudHMuCiAgICAgKi8KCiAgICBvZmZTZXQgPSBwdHJfbGVuIC0gcmVtYWluaW5nOwogICAgYXNuX2J1aWxkX2hlYWRlcigmcHRyW29mZlNldF0sCiAgICAgICAgICAgICAgICAgICAgICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSKSwgbXNnQXV0aFBhcm1MZW4pOwoKICAgIGlmICh0aGVTZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWCiAgICAgICAgfHwgdGhlU2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBvZmZTZXQgPSBwdHJfbGVuIC0gcmVtYWluaW5nOwogICAgICAgIG1lbXNldCgmcHRyW29mZlNldF0sIDAsIG1zZ0F1dGhQYXJtTGVuKTsKICAgIH0KCiAgICByZW1haW5pbmcgLT0gbXNnQXV0aFBhcm1MZW47CgoKICAgIC8qCiAgICAgKiBOb3RlOiBpZiB0aGVyZSBpcyBubyBlbmNyeXB0aW9uIGJlaW5nIGRvbmUsIG1zZ1ByaXZQYXJtTGVuCiAgICAgKiBpcyAwLCBhbmQgdGhlcmUgaXMgbm8gZWZmZWN0IChvdGhlciB0aGFuIGluc2VydGluZyBhCiAgICAgKiB6ZXJvLWxlbmd0aCBoZWFkZXIpIG9mIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cy4KICAgICAqLwoKICAgIG9mZlNldCA9IHB0cl9sZW4gLSByZW1haW5pbmc7CiAgICBhc25fYnVpbGRfaGVhZGVyKCZwdHJbb2ZmU2V0XSwKICAgICAgICAgICAgICAgICAgICAgJnJlbWFpbmluZywKICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9PQ1RFVF9TVFIpLCBtc2dQcml2UGFybUxlbik7CgogICAgcmVtYWluaW5nIC09IG1zZ1ByaXZQYXJtTGVuOyAgICAgICAgLyogU2tpcHBpbmcgdGhlIElWIGFscmVhZHkgdGhlcmUuICovCgoKICAgIC8qCiAgICAgKiBGb3IgcHJpdmFjeSwgbmVlZCB0byBhZGQgdGhlIG9jdGV0IHN0cmluZyBoZWFkZXIgZm9yIGl0LgogICAgICovCiAgICBpZiAodGhlU2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBvZmZTZXQgPSBwdHJfbGVuIC0gcmVtYWluaW5nOwogICAgICAgIGFzbl9idWlsZF9oZWFkZXIoJnB0cltvZmZTZXRdLAogICAgICAgICAgICAgICAgICAgICAgICAgJnJlbWFpbmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiksCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUb3RhbExlbmd0aCAtIGRhdGFPZmZzZXQpOwogICAgfQoKCiAgICAvKgogICAgICogQWRqdXN0IG92ZXJhbGwgbGVuZ3RoIGFuZCBzdG9yZSBpdCBhcyB0aGUgZmlyc3QgU0VRIGxlbmd0aAogICAgICogb2YgdGhlIFNOTVB2M01lc3NhZ2UuCiAgICAgKgogICAgICogRklYICA0IGlzIGEgbWFnaWMgbnVtYmVyIQogICAgICovCiAgICByZW1haW5pbmcgPSB0aGVUb3RhbExlbmd0aDsKICAgIGFzbl9idWlsZF9zZXF1ZW5jZShwdHIsICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9TRVFVRU5DRSB8IEFTTl9DT05TVFJVQ1RPUiksCiAgICAgICAgICAgICAgICAgICAgICAgdGhlVG90YWxMZW5ndGggLSA0KTsKCgogICAgLyoKICAgICAqIE5vdywgdGltZSB0byBjb25zaWRlciAvIGRvIGF1dGhlbnRpY2F0aW9uLgogICAgICovCiAgICBpZiAodGhlU2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSE5PUFJJVgogICAgICAgIHx8IHRoZVNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSB7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIHRlbXBfc2lnX2xlbiA9IG1zZ0F1dGhQYXJtTGVuOwogICAgICAgIHVfY2hhciAgICAgICAgICp0ZW1wX3NpZyA9ICh1X2NoYXIgKikgbWFsbG9jKHRlbXBfc2lnX2xlbik7CgogICAgICAgIGlmICh0ZW1wX3NpZyA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiT3V0IG9mIG1lbW9yeS5cbiIpKTsKICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNjX2dlbmVyYXRlX2tleWVkX2hhc2godGhlQXV0aFByb3RvY29sLCB0aGVBdXRoUHJvdG9jb2xMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXV0aEtleSwgdGhlQXV0aEtleUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIsIHB0cl9sZW4sIHRlbXBfc2lnLCAmdGVtcF9zaWdfbGVuKQogICAgICAgICAgICAhPSBTTk1QX0VSUl9OT0VSUk9SKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEZJWCB0ZW1wX3NpZ19sZW4gZGVmaW5lZD8hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBTTk1QX1pFUk8odGVtcF9zaWcsIHRlbXBfc2lnX2xlbik7CiAgICAgICAgICAgIFNOTVBfRlJFRSh0ZW1wX3NpZyk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiU2lnbmluZyBmYWlsZWQuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0FVVEhFTlRJQ0FUSU9ORkFJTFVSRTsKICAgICAgICB9CgogICAgICAgIGlmICh0ZW1wX3NpZ19sZW4gIT0gbXNnQXV0aFBhcm1MZW4pIHsKICAgICAgICAgICAgU05NUF9aRVJPKHRlbXBfc2lnLCB0ZW1wX3NpZ19sZW4pOwogICAgICAgICAgICBTTk1QX0ZSRUUodGVtcF9zaWcpOwogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIlNpZ25pbmcgbGVuZ3RocyBmYWlsZWQuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0FVVEhFTlRJQ0FUSU9ORkFJTFVSRTsKICAgICAgICB9CgogICAgICAgIG1lbWNweSgmcHRyW2F1dGhQYXJhbXNPZmZzZXRdLCB0ZW1wX3NpZywgbXNnQXV0aFBhcm1MZW4pOwoKICAgICAgICBTTk1QX1pFUk8odGVtcF9zaWcsIHRlbXBfc2lnX2xlbik7CiAgICAgICAgU05NUF9GUkVFKHRlbXBfc2lnKTsKCiAgICB9CgogICAgLyoKICAgICAqIGVuZGlmIC0tIGNyZWF0ZSBrZXllZCBoYXNoIAogICAgICovCiAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CgogICAgREVCVUdNU0dUTCgoInVzbSIsICJVU00gcHJvY2Vzc2luZyBjb21wbGV0ZWQuXG4iKSk7CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9nZW5lcmF0ZV9vdXRfbXNnKCkgKi8KCiNpZmRlZiBORVRTTk1QX1VTRV9SRVZFUlNFX0FTTkVOQ09ESU5HCmludAp1c21fc2VjbW9kX3JnZW5lcmF0ZV9vdXRfbXNnKHN0cnVjdCBzbm1wX3NlY21vZF9vdXRnb2luZ19wYXJhbXMgKnBhcm1zKQp7CiAgICBpZiAoIXBhcm1zKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICByZXR1cm4gdXNtX3JnZW5lcmF0ZV9vdXRfbXNnKHBhcm1zLT5tc2dQcm9jTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5nbG9iYWxEYXRhLCBwYXJtcy0+Z2xvYmFsRGF0YUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPm1heE1zZ1NpemUsIHBhcm1zLT5zZWNNb2RlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY0VuZ2luZUlELCBwYXJtcy0+c2VjRW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNOYW1lLCBwYXJtcy0+c2VjTmFtZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY0xldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2NvcGVkUGR1LCBwYXJtcy0+c2NvcGVkUGR1TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjU3RhdGVSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT53aG9sZU1zZywgcGFybXMtPndob2xlTXNnTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+d2hvbGVNc2dPZmZzZXQpOwp9CgppbnQKdXNtX3JnZW5lcmF0ZV9vdXRfbXNnKGludCBtc2dQcm9jTW9kZWwsIC8qIChVTlVTRUQpICovCiAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBnbG9iYWxEYXRhLCAgICAgIC8qIElOICovCiAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICogcG9pbnRzIGF0IHRoZSBtc2dHbG9iYWxEYXRhLCB3aGljaCBpcyBvZiBsZW5ndGggZ2l2ZW4gYnkgbmV4dCAKICAgICAgICAgICAgICAgICAgICAgICAqIHBhcmFtZXRlci4gIAogICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZ2xvYmFsRGF0YUxlbiwgICAgIC8qIElOIC0gTGVuZ3RoIG9mIG1zZyBoZWFkZXIgZGF0YS4gICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgaW50IG1heE1zZ1NpemUsICAgLyogKFVOVVNFRCkgKi8KICAgICAgICAgICAgICAgICAgICAgIGludCBzZWNNb2RlbCwgICAgIC8qIChVTlVTRUQpICovCiAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzZWNFbmdpbmVJRCwgICAgIC8qIElOIC0gUG9pbnRlciBzbm1wRW5naW5lSUQuICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlY0VuZ2luZUlETGVuLCAgICAvKiBJTiAtIFNubXBFbmdpbmVJRCBsZW5ndGguICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnNlY05hbWUsICAgIC8qIElOIC0gUG9pbnRlciB0byBzZWN1cml0eU5hbWUuICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlY05hbWVMZW4sICAgICAgICAvKiBJTiAtIFNlY3VyaXR5TmFtZSBsZW5ndGguICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgIGludCBzZWNMZXZlbCwgICAgIC8qIElOIC0gQXV0aE5vUHJpdiwgYXV0aFByaXYgZXRjLiAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc2NvcGVkUGR1LCAgICAgICAvKiBJTiAqLwogICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAqIFBvaW50ZXIgdG8gc2NvcGVkUGR1IHdpbGwgYmUgZW5jcnlwdGVkIGJ5IFVTTSBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgICAqICogYW5kIHdyaXR0ZW4gdG8gcGFja2V0IGJ1ZmZlciBpbW1lZGlhdGVseSBmb2xsb3dpbmcKICAgICAgICAgICAgICAgICAgICAgICAqICogc2VjdXJpdHlQYXJhbWV0ZXJzLCBlbnRpcmUgbXNnIHdpbGwgYmUgYXV0aGVudGljYXRlZCBieQogICAgICAgICAgICAgICAgICAgICAgICogKiBVU00gaWYgbmVlZGVkLgogICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2NvcGVkUGR1TGVuLCAgICAgIC8qIElOIC0gc2NvcGVkUGR1IGxlbmd0aC4gKi8KICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNlY1N0YXRlUmVmLCAgICAgICAgLyogSU4gKi8KICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgKiBzZWNTdGF0ZVJlZiwgcG9pbnRlciB0byBjYWNoZWQgaW5mbyBwcm92aWRlZCBvbmx5IGZvcgogICAgICAgICAgICAgICAgICAgICAgICogKiBSZXNwb25zZSwgb3RoZXJ3aXNlIE5VTEwuCiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiB3aG9sZU1zZywgICAgICAgLyogIElOL09VVCAgKi8KICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgKiBQb2ludHMgYXQgdGhlIHBvaW50ZXIgdG8gdGhlIHBhY2tldCBidWZmZXIsIHdoaWNoIG1pZ2h0IGdldCBleHRlbmRlZAogICAgICAgICAgICAgICAgICAgICAgICogaWYgbmVjZXNzYXJ5IHZpYSByZWFsbG9jKCkuICAKICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogd2hvbGVNc2dMZW4sICAgICAvKiAgSU4vT1VUICAqLwogICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAqIExlbmd0aCBvZiB0aGUgZW50aXJlIHBhY2tldCBidWZmZXIsICoqbm90KiogdGhlIGxlbmd0aCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAqIHBhY2tldC4gIAogICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvZmZzZXQgICAvKiAgSU4vT1VUICAqLwogICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAqIE9mZnNldCBmcm9tIHRoZSBlbmQgb2YgdGhlIHBhY2tldCBidWZmZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgKiBhbHNvIGtub3duIGFzIHRoZSBwYWNrZXQgbGVuZ3RoLiAgCiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICkKewogICAgc2l6ZV90ICAgICAgICAgIG1zZ0F1dGhQYXJtTGVuID0gMDsKI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgc2l6ZV90ICAgICAgICAgIHRoZVRvdGFsTGVuZ3RoOwojZW5kaWYKCiAgICB1X2ludCAgICAgICAgICAgYm9vdHNfdWludDsKICAgIHVfaW50ICAgICAgICAgICB0aW1lX3VpbnQ7CiAgICBsb25nICAgICAgICAgICAgYm9vdHNfbG9uZzsKICAgIGxvbmcgICAgICAgICAgICB0aW1lX2xvbmc7CgogICAgLyoKICAgICAqIEluZGlyZWN0aW9uIGJlY2F1c2Ugc2VjU3RhdGVSZWYgdmFsdWVzIG92ZXJyaWRlIHBhcmFtZXRlcnMuCiAgICAgKiAKICAgICAqIE5vbmUgb2YgdGhlc2UgYXJlIHRvIGJlIGZyZWUnZCAtIHRoZXkgYXJlIGVpdGhlciBwb2ludGluZyB0bwogICAgICogd2hhdCdzIGluIHRoZSBzZWNTdGF0ZVJlZiBvciB0byBzb21ldGhpbmcgZWl0aGVyIGluIHRoZQogICAgICogYWN0dWFsIHBhcmFtZXRlciBsaXN0IG9yIHRoZSB1c2VyIGxpc3QuCiAgICAgKi8KCiAgICBjaGFyICAgICAgICAgICAqdGhlTmFtZSA9IE5VTEw7CiAgICB1X2ludCAgICAgICAgICAgdGhlTmFtZUxlbmd0aCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAqdGhlRW5naW5lSUQgPSBOVUxMOwogICAgdV9pbnQgICAgICAgICAgIHRoZUVuZ2luZUlETGVuZ3RoID0gMDsKICAgIHVfY2hhciAgICAgICAgICp0aGVBdXRoS2V5ID0gTlVMTDsKICAgIHVfaW50ICAgICAgICAgICB0aGVBdXRoS2V5TGVuZ3RoID0gMDsKICAgIGNvbnN0IG9pZCAgICAgICp0aGVBdXRoUHJvdG9jb2wgPSBOVUxMOwogICAgdV9pbnQgICAgICAgICAgIHRoZUF1dGhQcm90b2NvbExlbmd0aCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAqdGhlUHJpdktleSA9IE5VTEw7CiAgICB1X2ludCAgICAgICAgICAgdGhlUHJpdktleUxlbmd0aCA9IDA7CiAgICBjb25zdCBvaWQgICAgICAqdGhlUHJpdlByb3RvY29sID0gTlVMTDsKICAgIHVfaW50ICAgICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGggPSAwOwogICAgaW50ICAgICAgICAgICAgIHRoZVNlY0xldmVsID0gMDsgICAgLyogTm8gZGVmaW5lZCBjb25zdCBmb3IgYmFkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2YWx1ZSAob3RoZXIgdGhlbiBlcnIpLiAqLwogICAgc2l6ZV90ICAgICAgICAgIHNhbHRfbGVuZ3RoID0gMCwgc2F2ZV9zYWx0X2xlbmd0aCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAgc2FsdFtCWVRFU0laRShVU01fTUFYX1NBTFRfTEVOR1RIKV07CiAgICB1X2NoYXIgICAgICAgICAgYXV0aFBhcmFtc1tVU01fTUFYX0FVVEhTSVpFXTsKICAgIHVfY2hhciAgICAgICAgICBpdltCWVRFU0laRShVU01fTUFYX1NBTFRfTEVOR1RIKV07CiAgICBzaXplX3QgICAgICAgICAgc3Bfb2Zmc2V0ID0gMCwgbWFjX29mZnNldCA9IDA7CiAgICBpbnQgICAgICAgICAgICAgcmMgPSAwOwoKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVVNNIHByb2Nlc3NpbmcgaGFzIGJlZ3VuIChvZmZzZXQgJWQpXG4iLCAoaW50KSpvZmZzZXQpKTsKCiAgICBpZiAoc2VjU3RhdGVSZWYgIT0gTlVMTCkgewogICAgICAgIC8qCiAgICAgICAgICogVG8gaHVzaCB0aGUgY29tcGlsZXIgZm9yIG5vdy4gIFhYWCAKICAgICAgICAgKi8KICAgICAgICBzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKnJlZgogICAgICAgICAgICA9IChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKikgc2VjU3RhdGVSZWY7CgogICAgICAgIHRoZU5hbWUgPSByZWYtPnVzcl9uYW1lOwogICAgICAgIHRoZU5hbWVMZW5ndGggPSByZWYtPnVzcl9uYW1lX2xlbmd0aDsKICAgICAgICB0aGVFbmdpbmVJRCA9IHJlZi0+dXNyX2VuZ2luZV9pZDsKICAgICAgICB0aGVFbmdpbmVJRExlbmd0aCA9IHJlZi0+dXNyX2VuZ2luZV9pZF9sZW5ndGg7CgogICAgICAgIGlmICghdGhlRW5naW5lSURMZW5ndGgpIHsKICAgICAgICAgICAgdGhlRW5naW5lSUQgPSBzZWNFbmdpbmVJRDsKICAgICAgICAgICAgdGhlRW5naW5lSURMZW5ndGggPSBzZWNFbmdpbmVJRExlbjsKICAgICAgICB9CgogICAgICAgIHRoZUF1dGhQcm90b2NvbCA9IHJlZi0+dXNyX2F1dGhfcHJvdG9jb2w7CiAgICAgICAgdGhlQXV0aFByb3RvY29sTGVuZ3RoID0gcmVmLT51c3JfYXV0aF9wcm90b2NvbF9sZW5ndGg7CiAgICAgICAgdGhlQXV0aEtleSA9IHJlZi0+dXNyX2F1dGhfa2V5OwogICAgICAgIHRoZUF1dGhLZXlMZW5ndGggPSByZWYtPnVzcl9hdXRoX2tleV9sZW5ndGg7CiAgICAgICAgdGhlUHJpdlByb3RvY29sID0gcmVmLT51c3JfcHJpdl9wcm90b2NvbDsKICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGggPSByZWYtPnVzcl9wcml2X3Byb3RvY29sX2xlbmd0aDsKICAgICAgICB0aGVQcml2S2V5ID0gcmVmLT51c3JfcHJpdl9rZXk7CiAgICAgICAgdGhlUHJpdktleUxlbmd0aCA9IHJlZi0+dXNyX3ByaXZfa2V5X2xlbmd0aDsKICAgICAgICB0aGVTZWNMZXZlbCA9IHJlZi0+dXNyX3NlY19sZXZlbDsKICAgIH0KCiAgICAvKgogICAgICogKiBJZGVudGlmeSB0aGUgdXNlciByZWNvcmQuCiAgICAgKi8KICAgIGVsc2UgewogICAgICAgIHN0cnVjdCB1c21Vc2VyICp1c2VyOwoKICAgICAgICAvKgogICAgICAgICAqIHdlIGRvIGFsbG93IGFuIHVua25vd24gdXNlciBuYW1lIGZvcgogICAgICAgICAqIHVuYXV0aGVudGljYXRlZCByZXF1ZXN0cy4gCiAgICAgICAgICovCiAgICAgICAgaWYgKCh1c2VyID0gdXNtX2dldF91c2VyKHNlY0VuZ2luZUlELCBzZWNFbmdpbmVJRExlbiwgc2VjTmFtZSkpCiAgICAgICAgICAgID09IE5VTEwgJiYgc2VjTGV2ZWwgIT0gU05NUF9TRUNfTEVWRUxfTk9BVVRIKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVW5rbm93biBVc2VyXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1VOS05PV05TRUNVUklUWU5BTUU7CiAgICAgICAgfQoKICAgICAgICB0aGVOYW1lID0gc2VjTmFtZTsKICAgICAgICB0aGVOYW1lTGVuZ3RoID0gc2VjTmFtZUxlbjsKICAgICAgICB0aGVFbmdpbmVJRCA9IHNlY0VuZ2luZUlEOwogICAgICAgIHRoZVNlY0xldmVsID0gc2VjTGV2ZWw7CiAgICAgICAgdGhlRW5naW5lSURMZW5ndGggPSBzZWNFbmdpbmVJRExlbjsKICAgICAgICBpZiAodXNlcikgewogICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2wgPSB1c2VyLT5hdXRoUHJvdG9jb2w7CiAgICAgICAgICAgIHRoZUF1dGhQcm90b2NvbExlbmd0aCA9IHVzZXItPmF1dGhQcm90b2NvbExlbjsKICAgICAgICAgICAgdGhlQXV0aEtleSA9IHVzZXItPmF1dGhLZXk7CiAgICAgICAgICAgIHRoZUF1dGhLZXlMZW5ndGggPSB1c2VyLT5hdXRoS2V5TGVuOwogICAgICAgICAgICB0aGVQcml2UHJvdG9jb2wgPSB1c2VyLT5wcml2UHJvdG9jb2w7CiAgICAgICAgICAgIHRoZVByaXZQcm90b2NvbExlbmd0aCA9IHVzZXItPnByaXZQcm90b2NvbExlbjsKICAgICAgICAgICAgdGhlUHJpdktleSA9IHVzZXItPnByaXZLZXk7CiAgICAgICAgICAgIHRoZVByaXZLZXlMZW5ndGggPSB1c2VyLT5wcml2S2V5TGVuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHVua25vd24gdXNlcnMgY2FuIG5vdCBkbyBhdXRoZW50aWNhdGlvbiAob2J2aW91c2x5KSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoZUF1dGhQcm90b2NvbCA9IHVzbU5vQXV0aFByb3RvY29sOwogICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGggPQogICAgICAgICAgICAgICAgc2l6ZW9mKHVzbU5vQXV0aFByb3RvY29sKSAvIHNpemVvZihvaWQpOwogICAgICAgICAgICB0aGVBdXRoS2V5ID0gTlVMTDsKICAgICAgICAgICAgdGhlQXV0aEtleUxlbmd0aCA9IDA7CiAgICAgICAgICAgIHRoZVByaXZQcm90b2NvbCA9IHVzbU5vUHJpdlByb3RvY29sOwogICAgICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGggPQogICAgICAgICAgICAgICAgc2l6ZW9mKHVzbU5vUHJpdlByb3RvY29sKSAvIHNpemVvZihvaWQpOwogICAgICAgICAgICB0aGVQcml2S2V5ID0gTlVMTDsKICAgICAgICAgICAgdGhlUHJpdktleUxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZGlmIC0tIHNlY1N0YXRlUmVmPT1OVUxMICovCgoKICAgIC8qCiAgICAgKiBGcm9tIGhlcmUgdG8gdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIGF2b2lkIHJlZmVyZW5jZSB0bwogICAgICogc2VjTmFtZSwgc2VjRW5naW5lSUQsIHNlY0xldmVsLCBhbmQgYXNzb2NpYXRlZCBsZW5ndGhzLgogICAgICovCgoKICAgIC8qCiAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHVzZXIgY2FuIHVzZSB0aGUgcmVxdWVzdGVkIHNlYyBzZXJ2aWNlcy4KICAgICAqLwogICAgaWYgKHVzbV9jaGVja19zZWNMZXZlbF92c19wcm90b2NvbHModGhlU2VjTGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGgpID09IDEpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIlVuc3VwcG9ydGVkIFNlY3VyaXR5IExldmVsIG9yIHR5cGUgKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICB0aGVTZWNMZXZlbCkpOwoKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1VOU1VQUE9SVEVEU0VDVVJJVFlMRVZFTDsKICAgIH0KCgogICAgLyoKICAgICAqICogUmV0cmlldmUgdGhlIGVuZ2luZSBpbmZvcm1hdGlvbi4KICAgICAqICoKICAgICAqICogWFhYICAgIE5vIGVycm9yIGlzIGRlY2xhcmVkIGluIHRoZSBFb1Agd2hlbiBzZW5kaW5nIG1lc3NhZ2VzIHRvCiAgICAgKiAqICAgICAgICB1bmtub3duIGVuZ2luZXMsIHByb2Nlc3NpbmcgY29udGludWVzIHcvIGJvb3RzL3RpbWUgPT0gKDAsMCkuCiAgICAgKi8KICAgIGlmIChnZXRfZW5naW5ldGltZSh0aGVFbmdpbmVJRCwgdGhlRW5naW5lSURMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgJmJvb3RzX3VpbnQsICZ0aW1lX3VpbnQsIEZBTFNFKSA9PSAtMSkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgdG8gZmluZCBlbmdpbmUgZGF0YS4iKSk7CiAgICB9CgogICAgYm9vdHNfbG9uZyA9IGJvb3RzX3VpbnQ7CiAgICB0aW1lX2xvbmcgPSB0aW1lX3VpbnQ7CgogICAgaWYgKHRoZVNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBJbml0aWFsbHkgYXNzdW1lIHRoYXQgdGhlIGNpcGhlcnRleHQgd2lsbCBlbmQgdXAgdGhlIHNhbWUgc2l6ZSBhcwogICAgICAgICAqIHRoZSBwbGFpbnRleHQgcGx1cyBzb21lIHBhZGRpbmcuICBSZWFsbHkgc2NfZW5jcnlwdCBvdWdodCB0byBiZSBhYmxlCiAgICAgICAgICogdG8gZ3JvdyB0aGlzIGZvciB1cywgYSBsYSBhc25fcmVhbGxvY19yYnVpbGRfPHR5cGU+IGZ1bmN0aW9ucywgYnV0CiAgICAgICAgICogdGhpcyB3aWxsIGRvIGZvciBub3cuICAKICAgICAgICAgKi8KICAgICAgICB1X2NoYXIgICAgICAgICAqY2lwaGVydGV4dCA9IE5VTEw7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIGNpcGhlcnRleHRsZW4gPSBzY29wZWRQZHVMZW4gKyA2NDsKCiAgICAgICAgaWYgKChjaXBoZXJ0ZXh0ID0gKHVfY2hhciAqKSBtYWxsb2MoY2lwaGVydGV4dGxlbikpID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZG4ndCBtYWxsb2MgJWQgYnl0ZXMgZm9yIGVuY3J5cHRlZCBQRFVcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpY2lwaGVydGV4dGxlbikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX01BTExPQzsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogWFhYIEhhcmR3aXJlZCB0byBzZWVrIGludG8gYSAxREVTIHByaXZhdGUga2V5ISAgCiAgICAgICAgICovCiNpZmRlZiBIQVZFX0FFUwogICAgICAgIGlmIChJU1RSQU5TRk9STSh0aGVQcml2UHJvdG9jb2wsIEFFU1ByaXYpKSB7CiAgICAgICAgICAgIHNhbHRfbGVuZ3RoID0gQllURVNJWkUoVVNNX0FFU19TQUxUX0xFTkdUSCk7CiAgICAgICAgICAgIHNhdmVfc2FsdF9sZW5ndGggPSBCWVRFU0laRShVU01fQUVTX1NBTFRfTEVOR1RIKS8yOwogICAgICAgICAgICBpZiAoIXRoZVByaXZLZXkgfHwKICAgICAgICAgICAgICAgIHVzbV9zZXRfYWVzX2l2KHNhbHQsICZzYWx0X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0b25sKGJvb3RzX3VpbnQpLCBodG9ubCh0aW1lX3VpbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYpID09IC0xKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkNhbid0IHNldCBBRVMgaXYuXG4iKSk7CiAgICAgICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoY2lwaGVydGV4dCk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgfSAKI2VuZGlmCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwogICAgICAgIGlmIChJU1RSQU5TRk9STSh0aGVQcml2UHJvdG9jb2wsIERFU1ByaXYpKSB7CiAgICAgICAgICAgIHNhbHRfbGVuZ3RoID0gQllURVNJWkUoVVNNX0RFU19TQUxUX0xFTkdUSCk7CiAgICAgICAgICAgIHNhdmVfc2FsdF9sZW5ndGggPSBCWVRFU0laRShVU01fREVTX1NBTFRfTEVOR1RIKTsKICAgICAgICAgICAgaWYgKCF0aGVQcml2S2V5IHx8ICh1c21fc2V0X3NhbHQoc2FsdCwgJnNhbHRfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQcml2S2V5ICsgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHJpdktleUxlbmd0aCAtIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2KSA9PSAtMSkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiQ2FuJ3Qgc2V0IERFUy1DQkMgc2FsdC5cbiIpKTsKICAgICAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgICAgIFNOTVBfRlJFRShjaXBoZXJ0ZXh0KTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgaWYgKGRlYnVnX2lzX3Rva2VuX3JlZ2lzdGVyZWQoInVzbS9kdW1wIikgPT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIGR1bXBfY2h1bmsoInVzbS9kdW1wIiwgIlRoaXMgZGF0YSB3YXMgZW5jcnlwdGVkOiIsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUGR1LCBzY29wZWRQZHVMZW4pOwogICAgICAgIH0KI2VuZGlmCgogICAgICAgIGlmIChzY19lbmNyeXB0KHRoZVByaXZQcm90b2NvbCwgdGhlUHJpdlByb3RvY29sTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgIHRoZVByaXZLZXksIHRoZVByaXZLZXlMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUGR1LCBzY29wZWRQZHVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dCwgJmNpcGhlcnRleHRsZW4pICE9IFNOTVBfRVJSX05PRVJST1IpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJlbmNyeXB0aW9uIGVycm9yLlxuIikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIFNOTVBfRlJFRShjaXBoZXJ0ZXh0KTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0VOQ1JZUFRJT05FUlJPUjsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogV3JpdGUgdGhlIGVuY3J5cHRlZCBzY29wZWRQZHUgYmFjayBpbnRvIHRoZSBwYWNrZXQgYnVmZmVyLiAgCiAgICAgICAgICovCgojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgdGhlVG90YWxMZW5ndGggPSAqd2hvbGVNc2dMZW47CiNlbmRpZgogICAgICAgICpvZmZzZXQgPSAwOwogICAgICAgIHJjID0gYXNuX3JlYWxsb2NfcmJ1aWxkX3N0cmluZyh3aG9sZU1zZywgd2hvbGVNc2dMZW4sIG9mZnNldCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dCwgY2lwaGVydGV4dGxlbik7CiAgICAgICAgaWYgKHJjID09IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJFbmNyeXB0aW9uIGZhaWxlZC5cbiIpKTsKICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgICAgICBTTk1QX0ZSRUUoY2lwaGVydGV4dCk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9FTkNSWVBUSU9ORVJST1I7CiAgICAgICAgfQoKI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgICAgIGlmIChkZWJ1Z19pc190b2tlbl9yZWdpc3RlcmVkKCJ1c20vZHVtcCIpID09IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJzYWx0ICsgRW5jcnlwdGVkIGZvcm06ICIsIHNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgc2FsdF9sZW5ndGgpOwogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJ3aG9sZU1zZzoiLAogICAgICAgICAgICAgICAgICAgICAgICgqd2hvbGVNc2cgKyAqd2hvbGVNc2dMZW4gLSAqb2Zmc2V0KSwgKm9mZnNldCk7CiAgICAgICAgfQojZW5kaWYKCiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJFbmNyeXB0aW9uIHN1Y2Nlc3NmdWwuXG4iKSk7CiAgICAgICAgU05NUF9GUkVFKGNpcGhlcnRleHQpOwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIHRoZVNlY0xldmVsICE9IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWICAKICAgICAgICAgKi8KICAgIH0KCiAgICAvKgogICAgICogU3RhcnQgZW5jb2RpbmcgdGhlIG1zZ1NlY3VyaXR5UGFyYW1ldGVycy4gIAogICAgICovCgogICAgc3Bfb2Zmc2V0ID0gKm9mZnNldDsKCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnUHJpdmFjeVBhcmFtZXRlcnMiKTsKICAgIC8qCiAgICAgKiBtc2dQcml2YWN5UGFyYW1ldGVycyAod2FybmluZzogYXNzdW1lcyBERVMgc2FsdCkuICAKICAgICAqLwogICAgcmMgPSBhc25fcmVhbGxvY19yYnVpbGRfc3RyaW5nKHdob2xlTXNnLCB3aG9sZU1zZ0xlbiwgb2Zmc2V0LCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFTTl9PQ1RFVF9TVFIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVfc2FsdF9sZW5ndGgpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBpZiAocmMgPT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiYnVpbGRpbmcgcHJpdlBhcmFtcyBmYWlsZWQuXG4iKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1RPT19MT05HOwogICAgfQoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMiKTsKICAgIC8qCiAgICAgKiBtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMgKHdhcm5pbmdzIGFzc3VtZXMgMHgwMCBieSAxMikuICAKICAgICAqLwogICAgaWYgKHRoZVNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhOT1BSSVYKICAgICAgICB8fCB0aGVTZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVikgewogICAgICAgIG1lbXNldChhdXRoUGFyYW1zLCAwLCBVU01fTUQ1X0FORF9TSEFfQVVUSF9MRU4pOwogICAgICAgIG1zZ0F1dGhQYXJtTGVuID0gVVNNX01ENV9BTkRfU0hBX0FVVEhfTEVOOwogICAgfQoKICAgIHJjID0gYXNuX3JlYWxsb2NfcmJ1aWxkX3N0cmluZyh3aG9sZU1zZywgd2hvbGVNc2dMZW4sIG9mZnNldCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyKSAoQVNOX1VOSVZFUlNBTCB8IEFTTl9QUklNSVRJVkUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBU05fT0NURVRfU1RSKSwgYXV0aFBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dBdXRoUGFybUxlbik7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGlmIChyYyA9PSAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJidWlsZGluZyBhdXRoUGFyYW1zIGZhaWxlZC5cbiIpKTsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVE9PX0xPTkc7CiAgICB9CgogICAgLyoKICAgICAqIFJlbWVtYmVyIHdoZXJlIHRvIHB1dCB0aGUgYWN0dWFsIEhNQUMgd2UgY2FsY3VsYXRlIGxhdGVyIG9uLiAgQW4KICAgICAqIGVuY29kZWQgT0NURVQgU1RSSU5HIG9mIGxlbmd0aCBVU01fTUQ1X0FORF9TSEFfQVVUSF9MRU4gaGFzIGFuIEFTTi4xCiAgICAgKiBoZWFkZXIgb2YgbGVuZ3RoIDIsIGhlbmNlIHRoZSBmdWRnZSBmYWN0b3IuICAKICAgICAqLwoKICAgIG1hY19vZmZzZXQgPSAqb2Zmc2V0IC0gMjsKCiAgICAvKgogICAgICogbXNnVXNlck5hbWUuICAKICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIm1zZ1VzZXJOYW1lIik7CiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9zdHJpbmcod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVNOX09DVEVUX1NUUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSB0aGVOYW1lLCB0aGVOYW1lTGVuZ3RoKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIGF1dGhQYXJhbXMgZmFpbGVkLlxuIikpOwogICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9UT09fTE9ORzsKICAgIH0KCiAgICAvKgogICAgICogbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZVRpbWUuICAKICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIm1zZ0F1dGhvcml0YXRpdmVFbmdpbmVUaW1lIik7CiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9pbnQod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX0lOVEVHRVIpLCAmdGltZV9sb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsb25nKSk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGlmIChyYyA9PSAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsCiAgICAgICAgICAgICAgICAgICAgImJ1aWxkaW5nIG1zZ0F1dGhvcml0YXRpdmVFbmdpbmVUaW1lIGZhaWxlZC5cbiIpKTsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVE9PX0xPTkc7CiAgICB9CgogICAgLyoKICAgICAqIG1zZ0F1dGhvcml0YXRpdmVFbmdpbmVCb290cy4gIAogICAgICovCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUJvb3RzIik7CiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9pbnQod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX0lOVEVHRVIpLCAmYm9vdHNfbG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobG9uZykpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBpZiAocmMgPT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLAogICAgICAgICAgICAgICAgICAgICJidWlsZGluZyBtc2dBdXRob3JpdGF0aXZlRW5naW5lQm9vdHMgZmFpbGVkLlxuIikpOwogICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9UT09fTE9ORzsKICAgIH0KCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlEIik7CiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9zdHJpbmcod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVNOX09DVEVUX1NUUiksIHRoZUVuZ2luZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUVuZ2luZUlETGVuZ3RoKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIG1zZ0F1dGhvcml0YXRpdmVFbmdpbmVJRCBmYWlsZWQuXG4iKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1RPT19MT05HOwogICAgfQoKICAgIC8qCiAgICAgKiBVU00gbXNnU2VjdXJpdHlQYXJhbWV0ZXJzIHNlcXVlbmNlIGhlYWRlciAgCiAgICAgKi8KICAgIHJjID0gYXNuX3JlYWxsb2NfcmJ1aWxkX3NlcXVlbmNlKHdob2xlTXNnLCB3aG9sZU1zZ0xlbiwgb2Zmc2V0LCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9TRVFVRU5DRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX0NPTlNUUlVDVE9SKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvZmZzZXQgLSBzcF9vZmZzZXQpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIHVzbSBzZWN1cml0eSBwYXJhbWV0ZXJzIGZhaWxlZC5cbiIpKTsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVE9PX0xPTkc7CiAgICB9CgogICAgLyoKICAgICAqIG1zZ1NlY3VyaXR5UGFyYW1ldGVycyBPQ1RFVCBTVFJJTkcgd3JhcHBlci4gIAogICAgICovCiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9oZWFkZXIod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVNOX09DVEVUX1NUUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCAtIHNwX29mZnNldCk7CgogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIG1zZ1NlY3VyaXR5UGFyYW1ldGVycyBmYWlsZWQuXG4iKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1RPT19MT05HOwogICAgfQoKICAgIC8qCiAgICAgKiBDb3B5IGluIHRoZSBtc2dHbG9iYWxEYXRhIGFuZCBtc2dWZXJzaW9uLiAgCiAgICAgKi8KICAgIHdoaWxlICgoKndob2xlTXNnTGVuIC0gKm9mZnNldCkgPCBnbG9iYWxEYXRhTGVuKSB7CiAgICAgICAgaWYgKCFhc25fcmVhbGxvYyh3aG9sZU1zZywgd2hvbGVNc2dMZW4pKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiYnVpbGRpbmcgZ2xvYmFsIGRhdGEgZmFpbGVkLlxuIikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1RPT19MT05HOwogICAgICAgIH0KICAgIH0KCiAgICAqb2Zmc2V0ICs9IGdsb2JhbERhdGFMZW47CiAgICBtZW1jcHkoKndob2xlTXNnICsgKndob2xlTXNnTGVuIC0gKm9mZnNldCwgZ2xvYmFsRGF0YSwgZ2xvYmFsRGF0YUxlbik7CgogICAgLyoKICAgICAqIFRvdGFsIHBhY2tldCBzZXF1ZW5jZS4gIAogICAgICovCiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9zZXF1ZW5jZSh3aG9sZU1zZywgd2hvbGVNc2dMZW4sIG9mZnNldCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fU0VRVUVOQ0UgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9DT05TVFJVQ1RPUiksICpvZmZzZXQpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIG1hc3RlciBwYWNrZXQgc2VxdWVuY2UgZmFpbGVkLlxuIikpOwogICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9UT09fTE9ORzsKICAgIH0KCiAgICAvKgogICAgICogTm93IGNvbnNpZGVyIC8gZG8gYXV0aGVudGljYXRpb24uICAKICAgICAqLwoKICAgIGlmICh0aGVTZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWIHx8CiAgICAgICAgdGhlU2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBzaXplX3QgICAgICAgICAgdGVtcF9zaWdfbGVuID0gbXNnQXV0aFBhcm1MZW47CiAgICAgICAgdV9jaGFyICAgICAgICAgKnRlbXBfc2lnID0gKHVfY2hhciAqKSBtYWxsb2ModGVtcF9zaWdfbGVuKTsKICAgICAgICB1X2NoYXIgICAgICAgICAqcHJvdG9fbXNnID0gKndob2xlTXNnICsgKndob2xlTXNnTGVuIC0gKm9mZnNldDsKICAgICAgICBzaXplX3QgICAgICAgICAgcHJvdG9fbXNnX2xlbiA9ICpvZmZzZXQ7CgoKICAgICAgICBpZiAodGVtcF9zaWcgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIk91dCBvZiBtZW1vcnkuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CgogICAgICAgIGlmIChzY19nZW5lcmF0ZV9rZXllZF9oYXNoKHRoZUF1dGhQcm90b2NvbCwgdGhlQXV0aFByb3RvY29sTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUF1dGhLZXksIHRoZUF1dGhLZXlMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9fbXNnLCBwcm90b19tc2dfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfc2lnLCAmdGVtcF9zaWdfbGVuKQogICAgICAgICAgICAhPSBTTk1QX0VSUl9OT0VSUk9SKSB7CiAgICAgICAgICAgIFNOTVBfRlJFRSh0ZW1wX3NpZyk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiU2lnbmluZyBmYWlsZWQuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0FVVEhFTlRJQ0FUSU9ORkFJTFVSRTsKICAgICAgICB9CgogICAgICAgIGlmICh0ZW1wX3NpZ19sZW4gIT0gbXNnQXV0aFBhcm1MZW4pIHsKICAgICAgICAgICAgU05NUF9GUkVFKHRlbXBfc2lnKTsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJTaWduaW5nIGxlbmd0aHMgZmFpbGVkLlxuIikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9BVVRIRU5USUNBVElPTkZBSUxVUkU7CiAgICAgICAgfQoKICAgICAgICBtZW1jcHkoKndob2xlTXNnICsgKndob2xlTXNnTGVuIC0gbWFjX29mZnNldCwgdGVtcF9zaWcsCiAgICAgICAgICAgICAgIG1zZ0F1dGhQYXJtTGVuKTsKICAgICAgICBTTk1QX0ZSRUUodGVtcF9zaWcpOwogICAgfQogICAgLyoKICAgICAqIGVuZGlmIC0tIGNyZWF0ZSBrZXllZCBoYXNoIAogICAgICovCiAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICBERUJVR01TR1RMKCgidXNtIiwgIlVTTSBwcm9jZXNzaW5nIGNvbXBsZXRlZC5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9yZ2VuZXJhdGVfb3V0X21zZygpICovCgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICovCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9wYXJzZV9zZWN1cml0eV9wYXJhbWV0ZXJzCiAqCiAqIFBhcmFtZXRlcnM6CiAqCShTZWUgbGlzdCBiZWxvdy4uLikKICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCiAqCXRhYiBzdG9wIDQKICoKICoJRXh0cmFjdHMgdmFsdWVzIGZyb20gdGhlIHNlY3VyaXR5IGhlYWRlciBhbmQgZGF0YSBwb3J0aW9ucyBvZiB0aGUKICoJaW5jb21pbmcgYnVmZmVyLgogKi8KaW50CnVzbV9wYXJzZV9zZWN1cml0eV9wYXJhbWV0ZXJzKHVfY2hhciAqIHNlY1BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlbWFpbmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc2VjRW5naW5lSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCAqIGJvb3RzX3VpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50ICogdGltZV91aW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzZWNOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBzZWNOYW1lTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzaWduYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNpZ25hdHVyZV9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNhbHRfbGVuZ3RoLCB1X2NoYXIgKiogZGF0YV9wdHIpCnsKICAgIHVfY2hhciAgICAgICAgICpwYXJzZV9wdHIgPSBzZWNQYXJhbXM7CiAgICB1X2NoYXIgICAgICAgICAqdmFsdWVfcHRyOwogICAgdV9jaGFyICAgICAgICAgKm5leHRfcHRyOwogICAgdV9jaGFyICAgICAgICAgIHR5cGVfdmFsdWU7CgogICAgc2l6ZV90ICAgICAgICAgIG9jdGV0X3N0cmluZ19sZW5ndGggPSByZW1haW5pbmc7CiAgICBzaXplX3QgICAgICAgICAgc2VxdWVuY2VfbGVuZ3RoOwogICAgc2l6ZV90ICAgICAgICAgIHJlbWFpbmluZ19ieXRlczsKCiAgICBsb25nICAgICAgICAgICAgYm9vdHNfbG9uZzsKICAgIGxvbmcgICAgICAgICAgICB0aW1lX2xvbmc7CgogICAgdV9pbnQgICAgICAgICAgIG9yaWdOYW1lTGVuOwoKCiAgICAvKgogICAgICogRWF0IHRoZSBmaXJzdCBvY3RldCBoZWFkZXIuCiAgICAgKi8KICAgIGlmICgodmFsdWVfcHRyID0gYXNuX3BhcnNlX3NlcXVlbmNlKHBhcnNlX3B0ciwgJm9jdGV0X3N0cmluZ19sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNtIGZpcnN0IG9jdGV0IikpID09IE5VTEwpIHsKICAgICAgICAvKgogICAgICAgICAqIFJFVFVSTiBwYXJzZSBlcnJvciAKICAgICAgICAgKi8gcmV0dXJuIC0xOwogICAgfQoKCiAgICAvKgogICAgICogRWF0IHRoZSBzZXF1ZW5jZSBoZWFkZXIuCiAgICAgKi8KICAgIHBhcnNlX3B0ciA9IHZhbHVlX3B0cjsKICAgIHNlcXVlbmNlX2xlbmd0aCA9IG9jdGV0X3N0cmluZ19sZW5ndGg7CgogICAgaWYgKCh2YWx1ZV9wdHIgPSBhc25fcGFyc2Vfc2VxdWVuY2UocGFyc2VfcHRyLCAmc2VxdWVuY2VfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVNOX1NFUVVFTkNFIHwgQVNOX0NPTlNUUlVDVE9SKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c20gc2VxdWVuY2UiKSkgPT0gTlVMTCkgewogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CgoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgZW5naW5lSUQuCiAgICAgKi8KICAgIHBhcnNlX3B0ciA9IHZhbHVlX3B0cjsKICAgIHJlbWFpbmluZ19ieXRlcyA9IHNlcXVlbmNlX2xlbmd0aDsKCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlEIik7CiAgICBpZiAoKG5leHRfcHRyCiAgICAgICAgID0gYXNuX3BhcnNlX3N0cmluZyhwYXJzZV9wdHIsICZyZW1haW5pbmdfYnl0ZXMsICZ0eXBlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjRW5naW5lSUQsIHNlY0VuZ2luZUlETGVuKSkgPT0gTlVMTCkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBpZiAodHlwZV92YWx1ZSAhPQogICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8IEFTTl9PQ1RFVF9TVFIpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KCgogICAgLyoKICAgICAqIFJldHJpZXZlIHRoZSBlbmdpbmUgYm9vdHMsIG5vdGljZSBzd2l0Y2ggaW4gdGhlIHdheSBuZXh0X3B0ciBhbmQKICAgICAqIHJlbWFpbmluZ19ieXRlcyBhcmUgdXNlZCAodG8gYWNjb21vZGF0ZSB0aGUgYXNuIGNvZGUpLgogICAgICovCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUJvb3RzIik7CiAgICBpZiAoKG5leHRfcHRyID0gYXNuX3BhcnNlX2ludChuZXh0X3B0ciwgJnJlbWFpbmluZ19ieXRlcywgJnR5cGVfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9vdHNfbG9uZywgc2l6ZW9mKGxvbmcpKSkgPT0gTlVMTCkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBpZiAodHlwZV92YWx1ZSAhPQogICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8IEFTTl9JTlRFR0VSKSkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CgogICAgKmJvb3RzX3VpbnQgPSAodV9pbnQpIGJvb3RzX2xvbmc7CgoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgdGltZSB2YWx1ZS4KICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIm1zZ0F1dGhvcml0YXRpdmVFbmdpbmVUaW1lIik7CiAgICBpZiAoKG5leHRfcHRyID0gYXNuX3BhcnNlX2ludChuZXh0X3B0ciwgJnJlbWFpbmluZ19ieXRlcywgJnR5cGVfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZV9sb25nLCBzaXplb2YobG9uZykpKSA9PSBOVUxMKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIGlmICh0eXBlX3ZhbHVlICE9CiAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwgQVNOX0lOVEVHRVIpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KCiAgICAqdGltZV91aW50ID0gKHVfaW50KSB0aW1lX2xvbmc7CgogICAgaWYgKCpib290c191aW50ID4gRU5HSU5FQk9PVF9NQVggfHwgKnRpbWVfdWludCA+IEVOR0lORVRJTUVfTUFYKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgc2VjTmFtZS4KICAgICAqLwogICAgb3JpZ05hbWVMZW4gPSAqc2VjTmFtZUxlbjsKCgogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIm1zZ1VzZXJOYW1lIik7CiAgICBpZiAoKG5leHRfcHRyCiAgICAgICAgID0gYXNuX3BhcnNlX3N0cmluZyhuZXh0X3B0ciwgJnJlbWFpbmluZ19ieXRlcywgJnR5cGVfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopIHNlY05hbWUsIHNlY05hbWVMZW4pKSA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIC8qCiAgICAgKiBGSVggLS0gZG9lc24ndCB0aGlzIGFsc28gaW5kaWNhdGUgYSBidWZmZXIgb3ZlcnJ1bj8KICAgICAqLwogICAgaWYgKChpbnQpIG9yaWdOYW1lTGVuIDwgKnNlY05hbWVMZW4gKyAxKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IsIGJ1dCBpdCdzIHJlYWxseSBhIHBhcmFtZXRlciBlcnJvciAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaWYgKCpzZWNOYW1lTGVuID4gMzIpIHsKICAgICAgICAvKgogICAgICAgICAqIFRoaXMgaXMgYSBVU00tc3BlY2lmaWMgbGltaXRhdGlvbiBvdmVyIGFuZCBhYm92ZSB0aGUgYWJvdmUKICAgICAgICAgKiBsaW1pdGF0aW9uICh3aGljaCB3aWxsIHByb2JhYmx5IGRlZmF1bHQgdG8gdGhlIGxlbmd0aCBvZiBhbgogICAgICAgICAqIFNubXBBZG1pblN0cmluZywgaS5lLiAyNTUpLiAgU2VlIFJGQyAyNTc0LCBzZWMuIDIuNC4gIAogICAgICAgICAqLwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzZWNOYW1lWypzZWNOYW1lTGVuXSA9ICdcMCc7CgogICAgaWYgKHR5cGVfdmFsdWUgIT0KICAgICAgICAodV9jaGFyKSAoQVNOX1VOSVZFUlNBTCB8IEFTTl9QUklNSVRJVkUgfCBBU05fT0NURVRfU1RSKSkgewogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CgoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgc2lnbmF0dXJlIGFuZCBibGFuayBpdCBpZiB0aGVyZS4KICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIm1zZ0F1dGhlbnRpY2F0aW9uUGFyYW1ldGVycyIpOwogICAgaWYgKChuZXh0X3B0cgogICAgICAgICA9IGFzbl9wYXJzZV9zdHJpbmcobmV4dF9wdHIsICZyZW1haW5pbmdfYnl0ZXMsICZ0eXBlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCBzaWduYXR1cmVfbGVuZ3RoKSkgPT0gTlVMTCkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBpZiAodHlwZV92YWx1ZSAhPQogICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8IEFTTl9PQ1RFVF9TVFIpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAoKnNpZ25hdHVyZV9sZW5ndGggIT0gMCkgeyAgICAgICAvKiBCbGFua2luZyBmb3IgYXV0aGVudGljYXRpb24gc3RlcCBsYXRlciAqLwogICAgICAgIG1lbXNldChuZXh0X3B0ciAtICh1X2xvbmcpICogc2lnbmF0dXJlX2xlbmd0aCwKICAgICAgICAgICAgICAgMCwgKnNpZ25hdHVyZV9sZW5ndGgpOwogICAgfQoKCiAgICAvKgogICAgICogUmV0cmlldmUgdGhlIHNhbHQuCiAgICAgKgogICAgICogTm90ZSB0aGF0IHRoZSBuZXh0IHB0ciBpcyB3aGVyZSB0aGUgZGF0YSBzZWN0aW9uIHN0YXJ0cy4KICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIm1zZ1ByaXZhY3lQYXJhbWV0ZXJzIik7CiAgICBpZiAoKCpkYXRhX3B0cgogICAgICAgICA9IGFzbl9wYXJzZV9zdHJpbmcobmV4dF9wdHIsICZyZW1haW5pbmdfYnl0ZXMsICZ0eXBlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW5ndGgpKSA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMjsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIGlmICh0eXBlX3ZhbHVlICE9CiAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwgQVNOX09DVEVUX1NUUikpIHsKICAgICAgICAvKgogICAgICAgICAqIFJFVFVSTiBwYXJzZSBlcnJvciAKICAgICAgICAgKi8gcmV0dXJuIC0yOwogICAgfQoKICAgIHJldHVybiAwOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX3BhcnNlX3NlY3VyaXR5X3BhcmFtZXRlcnMoKSAqLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogdXNtX2NoZWNrX2FuZF91cGRhdGVfdGltZWxpbmVzcwogKgogKiBQYXJhbWV0ZXJzOgogKgkqc2VjRW5naW5lSUQKICoJIHNlY0VuZ2luZUlEZW4KICoJIGJvb3RzX3VpbnQKICoJIHRpbWVfdWludAogKgkqZXJyb3IKICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCQogKgogKiBQZXJmb3JtcyB0aGUgaW5jb21pbmcgdGltZWxpbmVzcyBjaGVja2luZyBhbmQgc2V0dGluZy4KICovCmludAp1c21fY2hlY2tfYW5kX3VwZGF0ZV90aW1lbGluZXNzKHVfY2hhciAqIHNlY0VuZ2luZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzZWNFbmdpbmVJRExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCBib290c191aW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50IHRpbWVfdWludCwgaW50ICplcnJvcikKewogICAgdV9jaGFyICAgICAgICAgIG15SURbVVNNX01BWF9JRF9MRU5HVEhdOwogICAgdV9sb25nICAgICAgICAgIG15SURMZW5ndGggPQogICAgICAgIHNubXB2M19nZXRfZW5naW5lSUQobXlJRCwgVVNNX01BWF9JRF9MRU5HVEgpOwogICAgdV9pbnQgICAgICAgICAgIG15Qm9vdHM7CiAgICB1X2ludCAgICAgICAgICAgbXlUaW1lOwoKCgogICAgaWYgKChteUlETGVuZ3RoID4gVVNNX01BWF9JRF9MRU5HVEgpIHx8IChteUlETGVuZ3RoID09IDApKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBXZSdyZSBwcm9iYWJseSBhbHJlYWR5IHNjcmV3ZWQuLi5idWZmZXIgb3ZlcndyaXRlLiAgWFhYPyAKICAgICAgICAgKi8KICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkJ1ZmZlciBvdmVyZmxvdy5cbiIpKTsKICAgICAgICAqZXJyb3IgPSBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIG15Qm9vdHMgPSBzbm1wdjNfbG9jYWxfc25tcEVuZ2luZUJvb3RzKCk7CiAgICBteVRpbWUgPSBzbm1wdjNfbG9jYWxfc25tcEVuZ2luZVRpbWUoKTsKCgogICAgLyoKICAgICAqIElGIHRoZSB0aW1lIGludm9sdmVkIGlzIGxvY2FsCiAgICAgKiAgICAgTWFrZSBzdXJlICBtZXNzYWdlIGlzIGluc2lkZSB0aGUgdGltZSB3aW5kb3cgCiAgICAgKiBFTFNFIAogICAgICogICAgICBJRiBib290cyBpcyBoaWdoZXIgb3IgYm9vdHMgaXMgdGhlIHNhbWUgYW5kIHRpbWUgaXMgaGlnaGVyCiAgICAgKiAgICAgICAgICAgICAgcmVtZW1iZXIgdGhpcyBuZXcgZGF0YQogICAgICogICAgICBFTFNFCiAgICAgKiAgICAgICAgICAgICAgSUYgIShib290cyBzYW1lIGFuZCB0aW1lIHdpdGhpbiBVU01fVElNRV9XSU5ET1cgc2VjcykKICAgICAqICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgaXMgdG9vIG9sZCAKICAgICAqICAgICAgICAgICAgICBFTFNFICAgIAogICAgICogICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBpcyBvaywgYnV0IGRvbid0IHRha2UgdGltZQogICAgICogICAgICAgICAgICAgIEVORElGCiAgICAgKiAgICAgIEVORElGCiAgICAgKiBFTkRJRgogICAgICovCgogICAgLyoKICAgICAqIFRoaXMgaXMgYSBsb2NhbCByZWZlcmVuY2UuCiAgICAgKi8KICAgIGlmICgoaW50KSBzZWNFbmdpbmVJRExlbiA9PSBteUlETGVuZ3RoCiAgICAgICAgJiYgbWVtY21wKHNlY0VuZ2luZUlELCBteUlELCBteUlETGVuZ3RoKSA9PSAwKSB7CiAgICAgICAgdV9pbnQgICAgICAgICAgIHRpbWVfZGlmZmVyZW5jZSA9IG15VGltZSA+IHRpbWVfdWludCA/CiAgICAgICAgICAgIG15VGltZSAtIHRpbWVfdWludCA6IHRpbWVfdWludCAtIG15VGltZTsKCiAgICAgICAgaWYgKGJvb3RzX3VpbnQgPT0gRU5HSU5FQk9PVF9NQVgKICAgICAgICAgICAgfHwgYm9vdHNfdWludCAhPSBteUJvb3RzCiAgICAgICAgICAgIHx8IHRpbWVfZGlmZmVyZW5jZSA+IFVTTV9USU1FX1dJTkRPVykgewogICAgICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfVVNNU1RBVFNOT1RJTlRJTUVXSU5ET1dTKSA9PQogICAgICAgICAgICAgICAgMCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gaW5jcmVtZW50IHN0YXRpc3RpYy4iKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLAogICAgICAgICAgICAgICAgICAgICAgICAiYm9vdF91aW50ICV1IG15Qm9vdHMgJXUgdGltZV9kaWZmICV1ID0+IG5vdCBpbiB0aW1lIHdpbmRvd1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHNfdWludCwgbXlCb290cywgdGltZV9kaWZmZXJlbmNlKSk7CiAgICAgICAgICAgICplcnJvciA9IFNOTVBFUlJfVVNNX05PVElOVElNRVdJTkRPVzsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KCiAgICAgICAgKmVycm9yID0gU05NUEVSUl9TVUNDRVNTOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qCiAgICAgKiBUaGlzIGlzIGEgcmVtb3RlIHJlZmVyZW5jZS4KICAgICAqLwogICAgZWxzZSB7CiAgICAgICAgdV9pbnQgICAgICAgICAgIHRoZWlyQm9vdHMsIHRoZWlyVGltZSwgdGhlaXJMYXN0VGltZTsKICAgICAgICB1X2ludCAgICAgICAgICAgdGltZV9kaWZmZXJlbmNlOwoKICAgICAgICBpZiAoZ2V0X2VuZ2luZXRpbWVfZXgoc2VjRW5naW5lSUQsIHNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlaXJCb290cywgJnRoZWlyVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZWlyTGFzdFRpbWUsIFRSVUUpCiAgICAgICAgICAgICE9IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCByZW1vdGUgZW5naW5lJ3MgdGltZXMuIikpOwoKICAgICAgICAgICAgKmVycm9yID0gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQoKICAgICAgICB0aW1lX2RpZmZlcmVuY2UgPSB0aGVpclRpbWUgPiB0aW1lX3VpbnQgPwogICAgICAgICAgICB0aGVpclRpbWUgLSB0aW1lX3VpbnQgOiB0aW1lX3VpbnQgLSB0aGVpclRpbWU7CgoKICAgICAgICAvKgogICAgICAgICAqIFhYWCAgQ29udHJhcnkgdG8gdGhlIHBzZXVkb2NvZGU6CiAgICAgICAgICogICAgICBTZWUgaWYgYm9vdHMgaXMgaW52YWxpZCBmaXJzdC4KICAgICAgICAgKi8KICAgICAgICBpZiAodGhlaXJCb290cyA9PSBFTkdJTkVCT09UX01BWCB8fCB0aGVpckJvb3RzID4gYm9vdHNfdWludCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiUmVtb3RlIGJvb3QgY291bnQgaW52YWxpZC4iKSk7CgogICAgICAgICAgICAqZXJyb3IgPSBTTk1QRVJSX1VTTV9OT1RJTlRJTUVXSU5ET1c7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgoKICAgICAgICAvKgogICAgICAgICAqIEJvb3RzIGlzIG9rLCBzZWUgaWYgdGhlIGJvb3RzIGlzIHRoZSBzYW1lIGJ1dCB0aGUgdGltZQogICAgICAgICAqIGlzIG9sZC4KICAgICAgICAgKi8KICAgICAgICBpZiAodGhlaXJCb290cyA9PSBib290c191aW50ICYmIHRpbWVfdWludCA8IHRoZWlyTGFzdFRpbWUpIHsKICAgICAgICAgICAgaWYgKHRpbWVfZGlmZmVyZW5jZSA+IFVTTV9USU1FX1dJTkRPVykgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIk1lc3NhZ2UgdG9vIG9sZC4iKSk7CiAgICAgICAgICAgICAgICAqZXJyb3IgPSBTTk1QRVJSX1VTTV9OT1RJTlRJTUVXSU5ET1c7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgLyogT2xkLCBidXQgYWNjZXB0YWJsZSAqLwoKICAgICAgICAgICAgICAgICplcnJvciA9IFNOTVBFUlJfU1VDQ0VTUzsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKCiAgICAgICAgLyoKICAgICAgICAgKiBNZXNzYWdlIGlzIG9rLCBlaXRoZXIgYm9vdHMgaGFzIGJlZW4gYWR2YW5jZWQsIG9yCiAgICAgICAgICogdGltZSBpcyBncmVhdGVyIHRoYW4gYmVmb3JlIHdpdGggdGhlIHNhbWUgYm9vdHMuCiAgICAgICAgICovCgogICAgICAgIGlmIChzZXRfZW5naW5ldGltZShzZWNFbmdpbmVJRCwgc2VjRW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzX3VpbnQsIHRpbWVfdWludCwgVFJVRSkKICAgICAgICAgICAgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdXBkYXRpbmcgcmVtb3RlIGJvb3QvdGltZS4iKSk7CiAgICAgICAgICAgICplcnJvciA9IFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KCiAgICAgICAgKmVycm9yID0gU05NUEVSUl9TVUNDRVNTOwogICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgIC8qIEZyZXNoIG1lc3NhZ2UgYW5kIHRpbWUgdXBkYXRlZCAqLwoKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmRpZiAtLSBsb2NhbCBvciByZW1vdGUgdGltZSByZWZlcmVuY2UuICovCgoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2NoZWNrX2FuZF91cGRhdGVfdGltZWxpbmVzcygpICovCgoKCmludAp1c21fc2VjbW9kX3Byb2Nlc3NfaW5fbXNnKHN0cnVjdCBzbm1wX3NlY21vZF9pbmNvbWluZ19wYXJhbXMgKnBhcm1zKQp7CiAgICBpZiAoIXBhcm1zKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICByZXR1cm4gdXNtX3Byb2Nlc3NfaW5fbXNnKHBhcm1zLT5tc2dQcm9jTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5tYXhNc2dTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNMZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPndob2xlTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+d2hvbGVNc2dMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNFbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY05hbWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zY29wZWRQZHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zY29wZWRQZHVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5tYXhTaXplUmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNTdGF0ZVJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlc3MsIHBhcm1zLT5tc2dfZmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiB1c21fcHJvY2Vzc19pbl9tc2cKICoKICogUGFyYW1ldGVyczoKICoJKFNlZSBsaXN0IGJlbG93Li4uKQogKiAgICAgIAogKiBSZXR1cm5zOgogKglTTk1QRVJSX1NVQ0NFU1MJCQlPbiBzdWNjZXNzLgogKglTTk1QRVJSX1VTTV9BVVRIRU5USUNBVElPTkZBSUxVUkUKICoJU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SCiAqCVNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUgogKglTTk1QRVJSX1VTTV9QQVJTRUVSUk9SCiAqCVNOTVBFUlJfVVNNX1VOS05PV05FTkdJTkVJRAogKglTTk1QRVJSX1VTTV9QQVJTRUVSUk9SCiAqCVNOTVBFUlJfVVNNX1VOS05PV05TRUNVUklUWU5BTUUKICoJU05NUEVSUl9VU01fVU5TVVBQT1JURURTRUNVUklUWUxFVkVMCiAqCiAqCiAqIEFTU1VNRVMgc2l6ZSBvZiBkZWNyeXB0X2J1ZiB3aWxsIGFsd2F5cyBiZSA+PSBzaXplIG9mIGVuY3J5cHRlZCBzUERVLgogKgogKiBGSVggIE1lbW9yeSBsZWFrcyBpZiBzZWNTdGF0ZVJlZiBpcyBhbGxvY2F0ZWQgYW5kIGEgcmV0dXJuIG9jY3VycwogKgl3aXRob3V0IGNsZWFuaW5nIHVwLiAgTWF5IGNvbnRhaW4gc2VjcmV0cy4uLgogKi8KaW50CnVzbV9wcm9jZXNzX2luX21zZyhpbnQgbXNnUHJvY01vZGVsLCAgICAvKiAoVU5VU0VEKSAqLwogICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heE1zZ1NpemUsICAgLyogSU4gICAgIC0gVXNlZCB0byBjYWxjIG1heFNpemVSZXNwb25zZS4gICovCiAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzZWNQYXJhbXMsICAvKiBJTiAgICAgLSBCRVIgZW5jb2RlZCBzZWN1cml0eVBhcmFtZXRlcnMuICovCiAgICAgICAgICAgICAgICAgICBpbnQgc2VjTW9kZWwsICAgICAgICAvKiAoVU5VU0VEKSAqLwogICAgICAgICAgICAgICAgICAgaW50IHNlY0xldmVsLCAgICAgICAgLyogSU4gICAgIC0gQXV0aE5vUHJpdiwgYXV0aFByaXYgZXRjLiAgICAgICovCiAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB3aG9sZU1zZywgICAvKiBJTiAgICAgLSBPcmlnaW5hbCB2MyBtZXNzYWdlLiAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgIHNpemVfdCB3aG9sZU1zZ0xlbiwgIC8qIElOICAgICAtIE1zZyBsZW5ndGguICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgdV9jaGFyICogc2VjRW5naW5lSUQsICAgICAgICAvKiBPVVQgICAgLSBQb2ludGVyIHNubXBFbmdpbmVJRC4gICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNlY0VuZ2luZUlETGVuLCAgICAgLyogSU4vT1VUIC0gTGVuIGF2YWlsYWJsZSwgbGVuIHJldHVybmVkLiAgICovCiAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICogTk9URTogTWVtb3J5IHByb3ZpZGVkIGJ5IGNhbGxlci4gICAgICAKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgY2hhciAqc2VjTmFtZSwgICAgICAgLyogT1VUICAgIC0gUG9pbnRlciB0byBzZWN1cml0eU5hbWUuICAgICAgICovCiAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBzZWNOYW1lTGVuLCAvKiBJTi9PVVQgLSBMZW4gYXZhaWxhYmxlLCBsZW4gcmV0dXJuZWQuICAgKi8KICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBzY29wZWRQZHUsIC8qIE9VVCAgICAtIFBvaW50ZXIgdG8gcGxhaW50ZXh0IHNjb3BlZFBkdS4gKi8KICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNjb3BlZFBkdUxlbiwgICAgICAgLyogSU4vT1VUIC0gTGVuIGF2YWlsYWJsZSwgbGVuIHJldHVybmVkLiAgICovCiAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBtYXhTaXplUmVzcG9uc2UsICAgIC8qIE9VVCAgICAtIE1heCBzaXplIG9mIFJlc3BvbnNlIFBEVS4gICAgICAqLwogICAgICAgICAgICAgICAgICAgdm9pZCAqKnNlY1N0YXRlUmYsICAgLyogT1VUICAgIC0gUmVmIHRvIHNlY3VyaXR5IHN0YXRlLiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzZXNzLCAgICAgIC8qIElOICAgICAtIHNlc3Npb24gd2hpY2ggZ290IHRoZSBtZXNzYWdlICAqLwogICAgICAgICAgICAgICAgICAgdV9jaGFyIG1zZ19mbGFncykKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJTiAgICAgLSB2MyBNZXNzYWdlIGZsYWdzLiAgICAgICAgICAgICAgKi8KICAgIHNpemVfdCAgICAgICAgICByZW1haW5pbmcgPSB3aG9sZU1zZ0xlbiAtICh1X2ludCkKICAgICAgICAoKHVfbG9uZykgKiBzZWNQYXJhbXMgLSAodV9sb25nKSAqIHdob2xlTXNnKTsKICAgIHVfaW50ICAgICAgICAgICBib290c191aW50OwogICAgdV9pbnQgICAgICAgICAgIHRpbWVfdWludDsKI2lmZGVmIEhBVkVfQUVTCiAgICB1X2ludCAgICAgICAgICAgbmV0X2Jvb3RzLCBuZXRfdGltZTsKI2VuZGlmCiAgICB1X2NoYXIgICAgICAgICAgc2lnbmF0dXJlW0JZVEVTSVpFKFVTTV9NQVhfS0VZRURIQVNIX0xFTkdUSCldOwogICAgc2l6ZV90ICAgICAgICAgIHNpZ25hdHVyZV9sZW5ndGggPSBCWVRFU0laRShVU01fTUFYX0tFWUVESEFTSF9MRU5HVEgpOwogICAgdV9jaGFyICAgICAgICAgIHNhbHRbQllURVNJWkUoVVNNX01BWF9TQUxUX0xFTkdUSCldOwogICAgc2l6ZV90ICAgICAgICAgIHNhbHRfbGVuZ3RoID0gQllURVNJWkUoVVNNX01BWF9TQUxUX0xFTkdUSCk7CiAgICB1X2NoYXIgICAgICAgICAgaXZbQllURVNJWkUoVVNNX01BWF9TQUxUX0xFTkdUSCldOwogICAgdV9pbnQgICAgICAgICAgIGl2X2xlbmd0aCA9IEJZVEVTSVpFKFVTTV9NQVhfU0FMVF9MRU5HVEgpOwogICAgdV9jaGFyICAgICAgICAgKmRhdGFfcHRyOwogICAgdV9jaGFyICAgICAgICAgKnZhbHVlX3B0cjsKICAgIHVfY2hhciAgICAgICAgICB0eXBlX3ZhbHVlOwogICAgdV9jaGFyICAgICAgICAgKmVuZF9vZl9vdmVyaGVhZCA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgZXJyb3I7CiAgICBpbnQgICAgICAgICAgICAgaSwgcmMgPSAwOwogICAgc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICoqc2VjU3RhdGVSZWYgPQogICAgICAgIChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKiopIHNlY1N0YXRlUmY7CgogICAgc3RydWN0IHVzbVVzZXIgKnVzZXI7CgoKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVVNNIHByb2Nlc3NpbmcgYmVndW4uLi5cbiIpKTsKCgogICAgaWYgKHNlY1N0YXRlUmVmKSB7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UoKnNlY1N0YXRlUmVmKTsKICAgICAgICAqc2VjU3RhdGVSZWYgPSB1c21fbWFsbG9jX3VzbVN0YXRlUmVmZXJlbmNlKCk7CiAgICAgICAgaWYgKCpzZWNTdGF0ZVJlZiA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiT3V0IG9mIG1lbW9yeS5cbiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBNYWtlIHN1cmUgdGhlICpzZWNQYXJtcyBpcyBhbiBPQ1RFVCBTVFJJTkcuCiAgICAgKiBFeHRyYWN0IHRoZSB1c2VyIG5hbWUsIGVuZ2luZSBJRCwgYW5kIHNlY3VyaXR5IGxldmVsLgogICAgICovCiAgICBpZiAoKHJjID0gdXNtX3BhcnNlX3NlY3VyaXR5X3BhcmFtZXRlcnMoc2VjUGFyYW1zLCByZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjRW5naW5lSUQsIHNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib290c191aW50LCAmdGltZV91aW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY05hbWUsIHNlY05hbWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCAmc2lnbmF0dXJlX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWx0LCAmc2FsdF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFfcHRyKSkgPCAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJQYXJzaW5nIGZhaWxlZCAocmMgJWQpLlxuIiwgcmMpKTsKICAgICAgICBpZiAocmMgPT0gLTIpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogVGhpcyBpbmRpY2F0ZXMgYSBkZWNyeXB0aW9uRXJyb3IuICAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMoU1RBVF9VU01TVEFUU0RFQ1JZUFRJT05FUlJPUlMpID09CiAgICAgICAgICAgICAgICAwKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbmNyZW1lbnQgc3RhdGlzdGljLiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOwogICAgICAgIH0KICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfU05NUElOQVNOUEFSU0VFUlJTKSA9PSAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgdG8gaW5jcmVtZW50IHN0YXRpc3RpYy4iKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9QQVJTRUVSUk9SOwogICAgfQoKICAgIC8qCiAgICAgKiBSRkMgMjU3NCBzZWN0aW9uIDguMy4yCiAgICAgKiAxKSAgSWYgdGhlIHByaXZQYXJhbWV0ZXJzIGZpZWxkIGlzIG5vdCBhbiA4LW9jdGV0IE9DVEVUIFNUUklORywKICAgICAqIHRoZW4gYW4gZXJyb3IgaW5kaWNhdGlvbiAoZGVjcnlwdGlvbkVycm9yKSBpcyByZXR1cm5lZCB0byB0aGUKICAgICAqIGNhbGxpbmcgbW9kdWxlLgogICAgICovCiAgICBpZiAoKHNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSAmJiAoc2FsdF9sZW5ndGggIT0gOCkpIHsKICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfVVNNU1RBVFNERUNSWVBUSU9ORVJST1JTKSA9PSAKICAgICAgICAgICAgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiRmFpbGVkIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOwogICAgfQoKICAgIGlmIChzZWNMZXZlbCAhPSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVikgewogICAgICAgIC8qCiAgICAgICAgICogcHVsbCB0aGVzZSBvdXQgbm93IHNvIHJlcG9ydHMgY2FuIHVzZSB0aGVtIAogICAgICAgICAqLwogICAgICAgICpzY29wZWRQZHUgPSBkYXRhX3B0cjsKICAgICAgICAqc2NvcGVkUGR1TGVuID0gd2hvbGVNc2dMZW4gLSAoZGF0YV9wdHIgLSB3aG9sZU1zZyk7CiAgICAgICAgZW5kX29mX292ZXJoZWFkID0gZGF0YV9wdHI7CiAgICB9CgogICAgaWYgKHNlY1N0YXRlUmVmKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBDYWNoZSB0aGUgbmFtZSwgZW5naW5lIElELCBhbmQgc2VjdXJpdHkgbGV2ZWwsCiAgICAgICAgICogKiBwZXIgc3RlcCAyIChzZWN0aW9uIDMuMikKICAgICAgICAgKi8KICAgICAgICBpZiAodXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9uYW1lCiAgICAgICAgICAgICgqc2VjU3RhdGVSZWYsIHNlY05hbWUsICpzZWNOYW1lTGVuKSA9PSAtMSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiQ291bGRuJ3QgY2FjaGUgbmFtZS4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgfQoKICAgICAgICBpZiAodXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9lbmdpbmVfaWQKICAgICAgICAgICAgKCpzZWNTdGF0ZVJlZiwgc2VjRW5naW5lSUQsICpzZWNFbmdpbmVJRExlbikgPT0gLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkNvdWxkbid0IGNhY2hlIGVuZ2luZSBpZC4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgfQoKICAgICAgICBpZiAodXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9zZWNfbGV2ZWwoKnNlY1N0YXRlUmVmLCBzZWNMZXZlbCkgPT0KICAgICAgICAgICAgLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkNvdWxkbid0IGNhY2hlIHNlY3VyaXR5IGxldmVsLiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBMb2NhdGUgdGhlIGVuZ2luZSBJRCByZWNvcmQuCiAgICAgKiBJZiBpdCBpcyB1bmtub3duLCB0aGVuIGVpdGhlciBjcmVhdGUgb25lIG9yIG5vdGUgdGhpcyBhcyBhbiBlcnJvci4KICAgICAqLwogICAgaWYgKChzZXNzICYmIChzZXNzLT5pc0F1dGhvcml0YXRpdmUgPT0gU05NUF9TRVNTX0FVVEhPUklUQVRJVkUgfHwKICAgICAgICAgICAgICAgICAgKHNlc3MtPmlzQXV0aG9yaXRhdGl2ZSA9PSBTTk1QX1NFU1NfVU5LTk9XTkFVVEggJiYKICAgICAgICAgICAgICAgICAgIChtc2dfZmxhZ3MgJiBTTk1QX01TR19GTEFHX1JQUlRfQklUKSkpKSB8fAogICAgICAgICghc2VzcyAmJiAobXNnX2ZsYWdzICYgU05NUF9NU0dfRkxBR19SUFJUX0JJVCkpKSB7CiAgICAgICAgaWYgKElTRU5HSU5FS05PV04oc2VjRW5naW5lSUQsICpzZWNFbmdpbmVJRExlbikgPT0gRkFMU0UpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJVbmtub3duIEVuZ2luZSBJRC5cbiIpKTsKICAgICAgICAgICAgaWYgKHNubXBfaW5jcmVtZW50X3N0YXRpc3RpYyhTVEFUX1VTTVNUQVRTVU5LTk9XTkVOR0lORUlEUykgPT0KICAgICAgICAgICAgICAgIDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9VTktOT1dORU5HSU5FSUQ7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoRU5TVVJFX0VOR0lORV9SRUNPUkQoc2VjRW5naW5lSUQsICpzZWNFbmdpbmVJRExlbikKICAgICAgICAgICAgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJDb3VsZG4ndCBlbnN1cmUgZW5naW5lIHJlY29yZC4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgfQoKICAgIH0KCgogICAgLyoKICAgICAqIExvY2F0ZSB0aGUgVXNlciByZWNvcmQuCiAgICAgKiBJZiB0aGUgdXNlci9lbmdpbmUgSUQgaXMgdW5rbm93biwgcmVwb3J0IHRoaXMgYXMgYW4gZXJyb3IuCiAgICAgKi8KICAgIGlmICgodXNlciA9IHVzbV9nZXRfdXNlcl9mcm9tX2xpc3Qoc2VjRW5naW5lSUQsICpzZWNFbmdpbmVJRExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjTmFtZSwgdXNlckxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHNlc3MgJiYgc2Vzcy0+aXNBdXRob3JpdGF0aXZlID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBfU0VTU19BVVRIT1JJVEFUSVZFKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghc2VzcykpID8gMCA6IDEpKSkKICAgICAgICA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJVbmtub3duIFVzZXIoJXMpXG4iLCBzZWNOYW1lKSk7CiAgICAgICAgaWYgKHNubXBfaW5jcmVtZW50X3N0YXRpc3RpYyhTVEFUX1VTTVNUQVRTVU5LTk9XTlVTRVJOQU1FUykgPT0gMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiRmFpbGVkIHRvIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fVU5LTk9XTlNFQ1VSSVRZTkFNRTsKICAgIH0KCiAgICAvKiBlbnN1cmUgdGhlIHVzZXIgaXMgYWN0aXZlICovCiAgICBpZiAodXNlci0+dXNlclN0YXR1cyAhPSBSU19BQ1RJVkUpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkF0dGVtcHQgdG8gdXNlIGFuIGluYWN0aXZlIHVzZXIuXG4iKSk7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1VOS05PV05TRUNVUklUWU5BTUU7CiAgICB9CgogICAgLyoKICAgICAqIE1ha2Ugc3VyZSB0aGUgc2VjdXJpdHkgbGV2ZWwgaXMgYXBwcm9wcmlhdGUuCiAgICAgKi8KCiAgICByYyA9IHVzbV9jaGVja19zZWNMZXZlbChzZWNMZXZlbCwgdXNlcik7CiAgICBpZiAoMSA9PSByYykgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVW5zdXBwb3J0ZWQgU2VjdXJpdHkgTGV2ZWwgKCVkKS5cbiIsCiAgICAgICAgICAgICAgICAgICAgc2VjTGV2ZWwpKTsKICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljCiAgICAgICAgICAgIChTVEFUX1VTTVNUQVRTVU5TVVBQT1JURURTRUNMRVZFTFMpID09IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkZhaWxlZCB0byBpbmNyZW1lbnQgc3RhdGlzdGljLiIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1VOU1VQUE9SVEVEU0VDVVJJVFlMRVZFTDsKICAgIH0gZWxzZSBpZiAocmMgIT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVW5rbm93biBpc3N1ZS5cbiIpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgfQoKICAgIC8qCiAgICAgKiBDaGVjayB0aGUgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKi8KICAgIGlmIChzZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWCiAgICAgICAgfHwgc2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBpZiAoc2NfY2hlY2tfa2V5ZWRfaGFzaCh1c2VyLT5hdXRoUHJvdG9jb2wsIHVzZXItPmF1dGhQcm90b2NvbExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5hdXRoS2V5LCB1c2VyLT5hdXRoS2V5TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob2xlTXNnLCB3aG9sZU1zZ0xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsIHNpZ25hdHVyZV9sZW5ndGgpCiAgICAgICAgICAgICE9IFNOTVBfRVJSX05PRVJST1IpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJWZXJpZmljYXRpb24gZmFpbGVkLlxuIikpOwogICAgICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfVVNNU1RBVFNXUk9OR0RJR0VTVFMpID09IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgICAgICB9CgkgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsICJBdXRoZW50aWNhdGlvbiBmYWlsZWQgZm9yICVzXG4iLAoJCQkJdXNlci0+bmFtZSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9BVVRIRU5USUNBVElPTkZBSUxVUkU7CiAgICAgICAgfQoKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIlZlcmlmaWNhdGlvbiBzdWNjZWVkZWQuXG4iKSk7CiAgICB9CgoKICAgIC8qCiAgICAgKiBTdGVwcyAxMC0xMSAgdXNlciBpcyBhbHJlYWR5IHNldCAtIHJlbG9jYXRlZCBiZWZvcmUgdGltZWxpbmVzcyAKICAgICAqIGNoZWNrIGluIGNhc2UgaXQgZmFpbHMgLSBzdGlsbCBzYXZlIHVzZXIgZGF0YSBmb3IgcmVzcG9uc2UuCiAgICAgKgogICAgICogQ2FjaGUgdGhlIGtleXMgYW5kIHByb3RvY29sIG9pZHMsIHBlciBzdGVwIDExIChzMy4yKS4KICAgICAqLwogICAgaWYgKHNlY1N0YXRlUmVmKSB7CiAgICAgICAgaWYgKHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfYXV0aF9wcm90b2NvbCgqc2VjU3RhdGVSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5hdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhQcm90b2NvbExlbikgPT0KICAgICAgICAgICAgLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNhY2hlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sLiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CgogICAgICAgIGlmICh1c21fc2V0X3VzbVN0YXRlUmVmZXJlbmNlX2F1dGhfa2V5KCpzZWNTdGF0ZVJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5hdXRoS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPmF1dGhLZXlMZW4pID09IC0xKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBjYWNoZSBhdXRoZW50aWNhdGlvbiBrZXkuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgIH0KCiAgICAgICAgaWYgKHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfcHJpdl9wcm90b2NvbCgqc2VjU3RhdGVSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5wcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZQcm90b2NvbExlbikgPT0KICAgICAgICAgICAgLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNhY2hlIHByaXZhY3kgcHJvdG9jb2wuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgIH0KCiAgICAgICAgaWYgKHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfcHJpdl9rZXkoKnNlY1N0YXRlUmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPnByaXZLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+cHJpdktleUxlbikgPT0gLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkNvdWxkbid0IGNhY2hlIHByaXZhY3kga2V5LiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBQZXJmb3JtIHRoZSB0aW1lbGluZXNzL3RpbWUgbWFuYWdlciBmdW5jdGlvbnMuCiAgICAgKi8KICAgIGlmIChzZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWCiAgICAgICAgfHwgc2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBpZiAodXNtX2NoZWNrX2FuZF91cGRhdGVfdGltZWxpbmVzcyhzZWNFbmdpbmVJRCwgKnNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzX3VpbnQsIHRpbWVfdWludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpID09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICAgICB9CiAgICB9CiNpZmRlZgkJCQkJCQlMQ0RfVElNRV9TWU5DX09QVAogICAgLyoKICAgICAqIENhY2hlIHRoZSB1bmF1dGhlbnRpY2F0ZWQgdGltZSB0byB1c2UgaW4gY2FzZSB3ZSBkb24ndCBoYXZlCiAgICAgKiBhbnl0aGluZyBiZXR0ZXIgLSB0aGlzIGd1ZXNzIHdpbGwgYmUgbm8gd29yc2UgdGhhbiAoMCwwKQogICAgICogdGhhdCB3ZSBub3JtYWxseSB1c2UuCiAgICAgKi8KICAgIGVsc2UgewogICAgICAgIHNldF9lbmdpbmV0aW1lKHNlY0VuZ2luZUlELCAqc2VjRW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgYm9vdHNfdWludCwgdGltZV91aW50LCBGQUxTRSk7CiAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTENEX1RJTUVfU1lOQ19PUFQgKi8KCgogICAgLyoKICAgICAqIElmIG5lZWRlZCwgZGVjcnlwdCB0aGUgc2NvcGVkIFBEVS4KICAgICAqLwogICAgaWYgKHNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSB7CiAgICAgICAgcmVtYWluaW5nID0gd2hvbGVNc2dMZW4gLSAoZGF0YV9wdHIgLSB3aG9sZU1zZyk7CgogICAgICAgIGlmICgodmFsdWVfcHRyID0gYXNuX3BhcnNlX3NlcXVlbmNlKGRhdGFfcHRyLCAmcmVtYWluaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFTTl9PQ1RFVF9TVFIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNyeXB0ZWQgc1BEVSIpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgd2hpbGUgcGFyc2luZyBlbmNyeXB0ZWQgc1BEVS4iKSk7CiAgICAgICAgICAgIGlmIChzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMoU1RBVF9TTk1QSU5BU05QQVJTRUVSUlMpID09IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgaW5jcmVtZW50IHN0YXRpc3RpYy4iKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UoKnNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgKnNlY1N0YXRlUmVmID0gTlVMTDsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1BBUlNFRVJST1I7CiAgICAgICAgfQoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiAgICAgICAgaWYgKElTVFJBTlNGT1JNKHVzZXItPnByaXZQcm90b2NvbCwgREVTUHJpdikpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRnJvbSBSRkMyNTc0OgogICAgICAgICAgICAgKiAKICAgICAgICAgICAgICogIkJlZm9yZSBkZWNyeXB0aW9uLCB0aGUgZW5jcnlwdGVkIGRhdGEgbGVuZ3RoIGlzIHZlcmlmaWVkLgogICAgICAgICAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBPQ1RFVCBTVFJJTkcgdG8gYmUgZGVjcnlwdGVkIGlzIG5vdAogICAgICAgICAgICAgKiBhbiBpbnRlZ3JhbCBtdWx0aXBsZSBvZiA4IG9jdGV0cywgdGhlIGRlY3J5cHRpb24gcHJvY2VzcwogICAgICAgICAgICAgKiBpcyBoYWx0ZWQgYW5kIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBub3RlZC4iICAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAocmVtYWluaW5nICUgOCAhPSAwKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaXBoZXJ0ZXh0IGlzICVsdSBieXRlcywgbm90IGFuIGludGVnZXIgbXVsdGlwbGUgb2YgOCAocmVtICVsdSlcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylyZW1haW5pbmcsICh1bnNpZ25lZCBsb25nKXJlbWFpbmluZyAlIDgpKTsKICAgICAgICAgICAgICAgIGlmIChzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMoU1RBVF9VU01TVEFUU0RFQ1JZUFRJT05FUlJPUlMpID09CiAgICAgICAgICAgICAgICAgICAgMCkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgaW5jcmVtZW50IHN0YXRpc3RpYy4iKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZSgqc2VjU3RhdGVSZWYpOwogICAgICAgICAgICAgICAgKnNlY1N0YXRlUmVmID0gTlVMTDsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9ERUNSWVBUSU9ORVJST1I7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVuZF9vZl9vdmVyaGVhZCA9IHZhbHVlX3B0cjsKCiAgICAgICAgICAgIGlmICggIXVzZXItPnByaXZLZXkgKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIk5vIHByaXZhY3kgcGFzcyBwaHJhc2UgZm9yICVzXG4iLCB1c2VyLT5zZWNOYW1lKSk7CiAgICAgICAgICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfVVNNU1RBVFNERUNSWVBUSU9ORVJST1JTKSA9PQogICAgICAgICAgICAgICAgICAgIDApIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiRmFpbGVkIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UoKnNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgICAgICpzZWNTdGF0ZVJlZiA9IE5VTEw7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYT1IgdGhlIHNhbHQgd2l0aCB0aGUgbGFzdCAoaXZfbGVuZ3RoKSBieXRlcwogICAgICAgICAgICAgKiBvZiB0aGUgcHJpdl9rZXkgdG8gb2J0YWluIHRoZSBJVi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGl2X2xlbmd0aCA9IEJZVEVTSVpFKFVTTV9ERVNfU0FMVF9MRU5HVEgpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgaXZfbGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICBpdltpXSA9IHNhbHRbaV0gXiB1c2VyLT5wcml2S2V5W2l2X2xlbmd0aCArIGldOwogICAgICAgIH0KI2VuZGlmCiNpZmRlZiBIQVZFX0FFUwogICAgICAgIGlmIChJU1RSQU5TRk9STSh1c2VyLT5wcml2UHJvdG9jb2wsIEFFU1ByaXYpKSB7CiAgICAgICAgICAgIGl2X2xlbmd0aCA9IEJZVEVTSVpFKFVTTV9BRVNfU0FMVF9MRU5HVEgpOwogICAgICAgICAgICBuZXRfYm9vdHMgPSBudG9obChib290c191aW50KTsKICAgICAgICAgICAgbmV0X3RpbWUgPSBudG9obCh0aW1lX3VpbnQpOwogICAgICAgICAgICBtZW1jcHkoaXYsICZuZXRfYm9vdHMsIDQpOwogICAgICAgICAgICBtZW1jcHkoaXYrNCwgJm5ldF90aW1lLCA0KTsKICAgICAgICAgICAgbWVtY3B5KGl2KzgsIHNhbHQsIHNhbHRfbGVuZ3RoKTsKICAgICAgICB9CiNlbmRpZgogICAgICAgIAogICAgICAgIGlmIChzY19kZWNyeXB0KHVzZXItPnByaXZQcm90b2NvbCwgdXNlci0+cHJpdlByb3RvY29sTGVuLAogICAgICAgICAgICAgICAgICAgICAgIHVzZXItPnByaXZLZXksIHVzZXItPnByaXZLZXlMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaXYsIGl2X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wdHIsIHJlbWFpbmluZywgKnNjb3BlZFBkdSwgc2NvcGVkUGR1TGVuKQogICAgICAgICAgICAhPSBTTk1QX0VSUl9OT0VSUk9SKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgZGVjcnlwdGlvbi4iKSk7CiAgICAgICAgICAgIGlmIChzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMKICAgICAgICAgICAgICAgIChTVEFUX1VTTVNUQVRTREVDUllQVElPTkVSUk9SUykgPT0gMCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkZhaWxlZCBpbmNyZW1lbnQgc3RhdGlzdGljLiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOwogICAgICAgIH0KI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgICAgIGlmIChkZWJ1Z19pc190b2tlbl9yZWdpc3RlcmVkKCJ1c20vZHVtcCIpID09IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJDeXBoZXIgVGV4dCIsIHZhbHVlX3B0ciwgcmVtYWluaW5nKTsKICAgICAgICAgICAgZHVtcF9jaHVuaygidXNtL2R1bXAiLCAic2FsdCArIEVuY3J5cHRlZCBmb3JtOiIsCiAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW5ndGgpOwogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJJViArIEVuY3J5cHRlZCBmb3JtOiIsIGl2LCBpdl9sZW5ndGgpOwogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJEZWNyeXB0ZWQgY2h1bms6IiwKICAgICAgICAgICAgICAgICAgICAgICAqc2NvcGVkUGR1LCAqc2NvcGVkUGR1TGVuKTsKICAgICAgICB9CiNlbmRpZgogICAgfQogICAgLyoKICAgICAqIHNQRFUgaXMgcGxhaW50ZXh0LgogICAgICovCiAgICBlbHNlIHsKICAgICAgICAqc2NvcGVkUGR1ID0gZGF0YV9wdHI7CiAgICAgICAgKnNjb3BlZFBkdUxlbiA9IHdob2xlTXNnTGVuIC0gKGRhdGFfcHRyIC0gd2hvbGVNc2cpOwogICAgICAgIGVuZF9vZl9vdmVyaGVhZCA9IGRhdGFfcHRyOwoKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmRpZiAtLSBQRFUgZGVjcnlwdGlvbiAqLwoKCiAgICAvKgogICAgICogQ2FsY3VsYXRlIHRoZSBiaWdnZXN0IHNQRFUgZm9yIHRoZSByZXNwb25zZSAoaS5lLiwgd2hvbGUgLSBvdnJoZCkuCiAgICAgKgogICAgICogRklYICBDb3JyZWN0PyAKICAgICAqLwogICAgKm1heFNpemVSZXNwb25zZSA9IG1heE1zZ1NpemUgLSAoaW50KQogICAgICAgICgodV9sb25nKSBlbmRfb2Zfb3ZlcmhlYWQgLSAodV9sb25nKSB3aG9sZU1zZyk7CgoKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVVNNIHByb2Nlc3NpbmcgY29tcGxldGVkLlxuIikpOwoKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cgp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB1c21fcHJvY2Vzc19pbl9tc2coKSAqLwoKdm9pZAp1c21faGFuZGxlX3JlcG9ydCh2b2lkICpzZXNzcCwKICAgICAgICAgICAgICAgICAgbmV0c25tcF90cmFuc3BvcnQgKnRyYW5zcG9ydCwgbmV0c25tcF9zZXNzaW9uICpzZXNzaW9uLAogICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0LCBuZXRzbm1wX3BkdSAqcGR1KQp7CiAgICAvKgogICAgICogaGFuZGxlIHJlcG9ydGFibGUgZXJyb3JzIAogICAgICovCgogICAgLyogdGhpcyB3aWxsIGdldCBpbiBvdXIgd2F5ICovCiAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShwZHUtPnNlY3VyaXR5U3RhdGVSZWYpOwogICAgcGR1LT5zZWN1cml0eVN0YXRlUmVmID0gTlVMTDsKCiAgICBzd2l0Y2ggKHJlc3VsdCkgewogICAgY2FzZSBTTk1QRVJSX1VTTV9BVVRIRU5USUNBVElPTkZBSUxVUkU6CiAgICB7CiAgICAgICAgaW50IHJlcyA9IHNlc3Npb24tPnNfc25tcF9lcnJubzsKICAgICAgICBzZXNzaW9uLT5zX3NubXBfZXJybm8gPSByZXN1bHQ7CiAgICAgICAgaWYgKHNlc3Npb24tPmNhbGxiYWNrKSB7CiAgICAgICAgICAgIHNlc3Npb24tPmNhbGxiYWNrKE5FVFNOTVBfQ0FMTEJBQ0tfT1BfUkVDRUlWRURfTUVTU0FHRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwgcGR1LT5yZXFpZCwgcGR1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5jYWxsYmFja19tYWdpYyk7CiAgICAgICAgfQogICAgICAgIHNlc3Npb24tPnNfc25tcF9lcnJubyA9IHJlczsKICAgIH0gIAogICAgLyogZmFsbHRocm91Z2ggKi8KICAgIGNhc2UgU05NUEVSUl9VU01fVU5LTk9XTkVOR0lORUlEOgogICAgY2FzZSBTTk1QRVJSX1VTTV9VTktOT1dOU0VDVVJJVFlOQU1FOgogICAgY2FzZSBTTk1QRVJSX1VTTV9VTlNVUFBPUlRFRFNFQ1VSSVRZTEVWRUw6CiAgICBjYXNlIFNOTVBFUlJfVVNNX05PVElOVElNRVdJTkRPVzoKICAgIGNhc2UgU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOgoKICAgICAgICBpZiAoU05NUF9DTURfQ09ORklSTUVEKHBkdS0+Y29tbWFuZCkgfHwKICAgICAgICAgICAgKHBkdS0+Y29tbWFuZCA9PSAwCiAgICAgICAgICAgICAmJiAocGR1LT5mbGFncyAmIFNOTVBfTVNHX0ZMQUdfUlBSVF9CSVQpKSkgewogICAgICAgICAgICBuZXRzbm1wX3BkdSAgICAqcGR1MjsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZsYWdzID0gcGR1LT5mbGFnczsKCiAgICAgICAgICAgIHBkdS0+ZmxhZ3MgfD0gVUNEX01TR19GTEFHX0ZPUkNFX1BEVV9DT1BZOwogICAgICAgICAgICBwZHUyID0gc25tcF9jbG9uZV9wZHUocGR1KTsKICAgICAgICAgICAgcGR1LT5mbGFncyA9IHBkdTItPmZsYWdzID0gZmxhZ3M7CiAgICAgICAgICAgIHNubXB2M19tYWtlX3JlcG9ydChwZHUyLCByZXN1bHQpOwogICAgICAgICAgICBpZiAoMCA9PSBzbm1wX3Nlc3Nfc2VuZChzZXNzcCwgcGR1MikpIHsKICAgICAgICAgICAgICAgIHNubXBfZnJlZV9wZHUocGR1Mik7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVE9ETzogaW5kaWNhdGUgZXJyb3IgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0gICAgICAgCn0KCnZvaWQKaW5pdF91c20odm9pZCkKewogICAgc3RydWN0IHNubXBfc2VjbW9kX2RlZiAqZGVmOwoKICAgIERFQlVHTVNHVEwoKCJpbml0X3VzbSIsICJ1bml0X3VzbTogJWx1ICVsdVxuIiwgdXNtTm9Qcml2UHJvdG9jb2xbMF0sCiAgICAgICAgICAgICAgICB1c21Ob1ByaXZQcm90b2NvbFsxXSkpOwoKICAgIHNjX2luaXQoKTsgICAgICAgICAgICAgICAgICAvKiBpbml0YWxpemUgc2NhcGkgY29kZSAqLwoKICAgIC8qCiAgICAgKiByZWdpc3RlciBvdXJzZWx2ZXMgYXMgYSBzZWN1cml0eSBzZXJ2aWNlIAogICAgICovCiAgICBkZWYgPSBTTk1QX01BTExPQ19TVFJVQ1Qoc25tcF9zZWNtb2RfZGVmKTsKICAgIGlmIChkZWYgPT0gTlVMTCkKICAgICAgICByZXR1cm47CiAgICAvKgogICAgICogWFhYOiBkZWYtPmluaXRfc2Vzc19zZWNtb2QgbW92ZSBzdHVmZiBmcm9tIHNubXBfYXBpLmMgCiAgICAgKi8KICAgIGRlZi0+ZW5jb2RlX3JldmVyc2UgPSB1c21fc2VjbW9kX3JnZW5lcmF0ZV9vdXRfbXNnOwogICAgZGVmLT5lbmNvZGVfZm9yd2FyZCA9IHVzbV9zZWNtb2RfZ2VuZXJhdGVfb3V0X21zZzsKICAgIGRlZi0+ZGVjb2RlID0gdXNtX3NlY21vZF9wcm9jZXNzX2luX21zZzsKICAgIGRlZi0+cGR1X2ZyZWVfc3RhdGVfcmVmID0gdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2U7CiAgICBkZWYtPmhhbmRsZV9yZXBvcnQgPSB1c21faGFuZGxlX3JlcG9ydDsKICAgIHJlZ2lzdGVyX3NlY19tb2QoVVNNX1NFQ19NT0RFTF9OVU1CRVIsICJ1c20iLCBkZWYpOwoKICAgIHNubXBfcmVnaXN0ZXJfY2FsbGJhY2soU05NUF9DQUxMQkFDS19MSUJSQVJZLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QX0NBTExCQUNLX1BPU1RfUFJFTUlCX1JFQURfQ09ORklHLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3VzbV9wb3N0X2NvbmZpZywgTlVMTCk7CgogICAgc25tcF9yZWdpc3Rlcl9jYWxsYmFjayhTTk1QX0NBTExCQUNLX0xJQlJBUlksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBfQ0FMTEJBQ0tfU0hVVERPV04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlaW5pdF91c21fcG9zdF9jb25maWcsIE5VTEwpOwoKICAgIHNubXBfcmVnaXN0ZXJfY2FsbGJhY2soU05NUF9DQUxMQkFDS19MSUJSQVJZLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QX0NBTExCQUNLX1NIVVRET1dOLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2VuZ2luZUlELCBOVUxMKTsKCn0KCnZvaWQKaW5pdF91c21fY29uZihjb25zdCBjaGFyICphcHApCnsKICAgIHJlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKGFwcCwgInVzbVVzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNtX3BhcnNlX2NvbmZpZ191c21Vc2VyLCBOVUxMLCBOVUxMKTsKICAgIHJlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKGFwcCwgImNyZWF0ZVVzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNtX3BhcnNlX2NyZWF0ZV91c21Vc2VyLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJuYW1lIFstZSBFTkdJTkVJRF0gKE1ENXxTSEEpIGF1dGhwYXNzcGhyYXNlIFtERVMgW3ByaXZwYXNzcGhyYXNlXV0iKTsKCiAgICAvKgogICAgICogd2UgbmVlZCB0byBiZSBjYWxsZWQgYmFjayBsYXRlciAKICAgICAqLwogICAgc25tcF9yZWdpc3Rlcl9jYWxsYmFjayhTTk1QX0NBTExCQUNLX0xJQlJBUlksIFNOTVBfQ0FMTEJBQ0tfU1RPUkVfREFUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNtX3N0b3JlX3VzZXJzLCBOVUxMKTsKfQoKLyoKICogaW5pdGlhbGl6YXRpb25zIGZvciB0aGUgVVNNLgogKgogKiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSAoZW5naW5laWQpIGNvbmZpZ3VyYXRpb24gZmlsZXMgaGF2ZSBiZWVuIHJlYWQuCiAqCiAqIFNldCAiYXJiaXRyYXJ5IiBwb3J0aW9uIG9mIHNhbHQgdG8gYSByYW5kb20gbnVtYmVyLgogKi8KaW50CmluaXRfdXNtX3Bvc3RfY29uZmlnKGludCBtYWpvcmlkLCBpbnQgbWlub3JpZCwgdm9pZCAqc2VydmVyYXJnLAogICAgICAgICAgICAgICAgICAgICB2b2lkICpjbGllbnRhcmcpCnsKICAgIHNpemVfdCAgICAgICAgICBzYWx0X2ludGVnZXJfbGVuID0gc2l6ZW9mKHNhbHRfaW50ZWdlcik7CgogICAgaWYgKHNjX3JhbmRvbSgodV9jaGFyICopICYgc2FsdF9pbnRlZ2VyLCAmc2FsdF9pbnRlZ2VyX2xlbikgIT0KICAgICAgICBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgInNjX3JhbmRvbSgpIGZhaWxlZDogdXNpbmcgdGltZSgpIGFzIHNhbHQuXG4iKSk7CiAgICAgICAgc2FsdF9pbnRlZ2VyID0gKHVfaW50KSB0aW1lKE5VTEwpOwogICAgfQoKI2lmZGVmIEhBVkVfQUVTCiAgICBzYWx0X2ludGVnZXJfbGVuID0gc2l6ZW9mIChzYWx0X2ludGVnZXI2NF8xKTsKICAgIGlmIChzY19yYW5kb20oKHVfY2hhciAqKSAmIHNhbHRfaW50ZWdlcjY0XzEsICZzYWx0X2ludGVnZXJfbGVuKSAhPQogICAgICAgIFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAic2NfcmFuZG9tKCkgZmFpbGVkOiB1c2luZyB0aW1lKCkgYXMgYWVzMSBzYWx0LlxuIikpOwogICAgICAgIHNhbHRfaW50ZWdlcjY0XzEgPSAodV9pbnQpIHRpbWUoTlVMTCk7CiAgICB9CiAgICBzYWx0X2ludGVnZXJfbGVuID0gc2l6ZW9mIChzYWx0X2ludGVnZXI2NF8xKTsKICAgIGlmIChzY19yYW5kb20oKHVfY2hhciAqKSAmIHNhbHRfaW50ZWdlcjY0XzIsICZzYWx0X2ludGVnZXJfbGVuKSAhPQogICAgICAgIFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAic2NfcmFuZG9tKCkgZmFpbGVkOiB1c2luZyB0aW1lKCkgYXMgYWVzMiBzYWx0LlxuIikpOwogICAgICAgIHNhbHRfaW50ZWdlcjY0XzIgPSAodV9pbnQpIHRpbWUoTlVMTCk7CiAgICB9CiNlbmRpZgogICAgCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01ENQogICAgbm9OYW1lVXNlciA9IHVzbV9jcmVhdGVfaW5pdGlhbF91c2VyKCIiLCB1c21ITUFDTUQ1QXV0aFByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTTV9MRU5HVEhfT0lEX1RSQU5TRk9STSwKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNtREVTUHJpdlByb3RvY29sLAojZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbUFFU1ByaXZQcm90b2NvbCwKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNNX0xFTkdUSF9PSURfVFJBTlNGT1JNKTsKI2Vsc2UKICAgIG5vTmFtZVVzZXIgPSB1c21fY3JlYXRlX2luaXRpYWxfdXNlcigiIiwgdXNtSE1BQ1NIQTFBdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNNX0xFTkdUSF9PSURfVFJBTlNGT1JNLAojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c21ERVNQcml2UHJvdG9jb2wsCiNlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNtQUVTUHJpdlByb3RvY29sLAojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU01fTEVOR1RIX09JRF9UUkFOU0ZPUk0pOwojZW5kaWYKCiAgICBpZiAoIG5vTmFtZVVzZXIgKSB7CiAgICAgICAgU05NUF9GUkVFKG5vTmFtZVVzZXItPmVuZ2luZUlEKTsKICAgICAgICBub05hbWVVc2VyLT5lbmdpbmVJRExlbiA9IDA7CiAgICB9CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgaW5pdF91c21fcG9zdF9jb25maWcoKSAqLwoKaW50CmRlaW5pdF91c21fcG9zdF9jb25maWcoaW50IG1ham9yaWQsIGludCBtaW5vcmlkLCB2b2lkICpzZXJ2ZXJhcmcsCgkJICAgICAgIHZvaWQgKmNsaWVudGFyZykKewogICAgaWYgKHVzbV9mcmVlX3VzZXIobm9OYW1lVXNlcikgIT0gTlVMTCkgewoJREVCVUdNU0dUTCgoImRlaW5pdF91c21fcG9zdF9jb25maWciLCAiY291bGQgbm90IGZyZWUgaW5pdGlhbCB1c2VyXG4iKSk7CglyZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICB9CiAgICBub05hbWVVc2VyID0gTlVMTDsKCiAgICBERUJVR01TR1RMKCgiZGVpbml0X3VzbV9wb3N0X2NvbmZpZyIsICJpbml0aWFsIHVzZXIgcmVtb3ZlZFxuIikpOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgZGVpbml0X3VzbV9wb3N0X2NvbmZpZygpICovCgp2b2lkCmNsZWFyX3VzZXJfbGlzdCh2b2lkKQp7CiAgICBzdHJ1Y3QgdXNtVXNlciAqdG1wID0gdXNlckxpc3QsICpuZXh0ID0gTlVMTDsKCiAgICB3aGlsZSAodG1wICE9IE5VTEwpIHsKCW5leHQgPSB0bXAtPm5leHQ7Cgl1c21fZnJlZV91c2VyKHRtcCk7Cgl0bXAgPSBuZXh0OwogICAgfQogICAgdXNlckxpc3QgPSBOVUxMOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogdXNtX2NoZWNrX3NlY0xldmVsCiAqCiAqIFBhcmFtZXRlcnM6CiAqCSBsZXZlbAogKgkqdXNlcgogKiAgICAgIAogKiBSZXR1cm5zOgogKgkwCU9uIHN1Y2Nlc3MsCiAqCS0xCU90aGVyd2lzZS4KICoKICogQ2hlY2tzIHRoYXQgYSBnaXZlbiBzZWN1cml0eSBsZXZlbCBpcyB2YWxpZCBmb3IgYSBnaXZlbiB1c2VyLgogKi8KaW50CnVzbV9jaGVja19zZWNMZXZlbChpbnQgbGV2ZWwsIHN0cnVjdCB1c21Vc2VyICp1c2VyKQp7CgogICAgaWYgKHVzZXItPnVzZXJTdGF0dXMgIT0gUlNfQUNUSVZFKQogICAgICAgIHJldHVybiAtMTsKCiAgICBERUJVR01TR1RMKCgiY29tcGFyZXgiLCAiQ29tcGFyaW5nOiAlbHUgJWx1ICIsIHVzbU5vUHJpdlByb3RvY29sWzBdLAogICAgICAgICAgICAgICAgdXNtTm9Qcml2UHJvdG9jb2xbMV0pKTsKICAgIERFQlVHTVNHT0lEKCgiY29tcGFyZXgiLCB1c21Ob1ByaXZQcm90b2NvbCwKICAgICAgICAgICAgICAgICBzaXplb2YodXNtTm9Qcml2UHJvdG9jb2wpIC8gc2l6ZW9mKG9pZCkpKTsKICAgIERFQlVHTVNHKCgiY29tcGFyZXgiLCAiXG4iKSk7CiAgICBpZiAobGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYKICAgICAgICAmJiAobmV0c25tcF9vaWRfZXF1YWxzKHVzZXItPnByaXZQcm90b2NvbCwgdXNlci0+cHJpdlByb3RvY29sTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbU5vUHJpdlByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1c21Ob1ByaXZQcm90b2NvbCkgLyBzaXplb2Yob2lkKSkgPT0KICAgICAgICAgICAgMCkpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkxldmVsOiAlZFxuIiwgbGV2ZWwpKTsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIlVzZXIgKCVzKSBBdXRoIFByb3RvY29sOiAiLCB1c2VyLT5uYW1lKSk7CiAgICAgICAgREVCVUdNU0dPSUQoKCJ1c20iLCB1c2VyLT5hdXRoUHJvdG9jb2wsIHVzZXItPmF1dGhQcm90b2NvbExlbikpOwogICAgICAgIERFQlVHTVNHKCgidXNtIiwgIiwgVXNlciBQcml2IFByb3RvY29sOiAiKSk7CiAgICAgICAgREVCVUdNU0dPSUQoKCJ1c20iLCB1c2VyLT5wcml2UHJvdG9jb2wsIHVzZXItPnByaXZQcm90b2NvbExlbikpOwogICAgICAgIERFQlVHTVNHKCgidXNtIiwgIlxuIikpOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgaWYgKChsZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVgogICAgICAgICB8fCBsZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWKQogICAgICAgICYmCiAgICAgICAgKG5ldHNubXBfb2lkX2VxdWFscwogICAgICAgICAodXNlci0+YXV0aFByb3RvY29sLCB1c2VyLT5hdXRoUHJvdG9jb2xMZW4sIHVzbU5vQXV0aFByb3RvY29sLAogICAgICAgICAgc2l6ZW9mKHVzbU5vQXV0aFByb3RvY29sKSAvIHNpemVvZihvaWQpKSA9PSAwKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiTGV2ZWw6ICVkXG4iLCBsZXZlbCkpOwogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVXNlciAoJXMpIEF1dGggUHJvdG9jb2w6ICIsIHVzZXItPm5hbWUpKTsKICAgICAgICBERUJVR01TR09JRCgoInVzbSIsIHVzZXItPmF1dGhQcm90b2NvbCwgdXNlci0+YXV0aFByb3RvY29sTGVuKSk7CiAgICAgICAgREVCVUdNU0coKCJ1c20iLCAiLCBVc2VyIFByaXYgUHJvdG9jb2w6ICIpKTsKICAgICAgICBERUJVR01TR09JRCgoInVzbSIsIHVzZXItPnByaXZQcm90b2NvbCwgdXNlci0+cHJpdlByb3RvY29sTGVuKSk7CiAgICAgICAgREVCVUdNU0coKCJ1c20iLCAiXG4iKSk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuIDA7Cgp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB1c21fY2hlY2tfc2VjTGV2ZWwoKSAqLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogdXNtX2NoZWNrX3NlY0xldmVsX3ZzX3Byb3RvY29scwogKgogKiBQYXJhbWV0ZXJzOgogKgkgbGV2ZWwKICoJKmF1dGhQcm90b2NvbAogKgkgYXV0aFByb3RvY29sTGVuCiAqCSpwcml2UHJvdG9jb2wKICoJIHByaXZQcm90b2NvbExlbgogKiAgICAgIAogKiBSZXR1cm5zOgogKgkwCU9uIHN1Y2Nlc3MsCiAqCTEJT3RoZXJ3aXNlLgogKgogKiBTYW1lIGFzIGFib3ZlIGJ1dCB3aXRoIGV4cGxpY2l0bHkgbmFtZWQgdHJhbnNmb3JtIHR5cGVzIGluc3RlYWQgb2YgdGFraW5nCiAqIGZyb20gdGhlIHVzbVVzZXIgc3RydWN0dXJlLgogKi8KaW50CnVzbV9jaGVja19zZWNMZXZlbF92c19wcm90b2NvbHMoaW50IGxldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIGF1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCBhdXRoUHJvdG9jb2xMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogcHJpdlByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50IHByaXZQcm90b2NvbExlbikKewoKICAgIGlmIChsZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVgogICAgICAgICYmCiAgICAgICAgKG5ldHNubXBfb2lkX2VxdWFscwogICAgICAgICAocHJpdlByb3RvY29sLCBwcml2UHJvdG9jb2xMZW4sIHVzbU5vUHJpdlByb3RvY29sLAogICAgICAgICAgc2l6ZW9mKHVzbU5vUHJpdlByb3RvY29sKSAvIHNpemVvZihvaWQpKSA9PSAwKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiTGV2ZWw6ICVkXG4iLCBsZXZlbCkpOwogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiQXV0aCBQcm90b2NvbDogIikpOwogICAgICAgIERFQlVHTVNHT0lEKCgidXNtIiwgYXV0aFByb3RvY29sLCBhdXRoUHJvdG9jb2xMZW4pKTsKICAgICAgICBERUJVR01TRygoInVzbSIsICIsIFByaXYgUHJvdG9jb2w6ICIpKTsKICAgICAgICBERUJVR01TR09JRCgoInVzbSIsIHByaXZQcm90b2NvbCwgcHJpdlByb3RvY29sTGVuKSk7CiAgICAgICAgREVCVUdNU0coKCJ1c20iLCAiXG4iKSk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoKGxldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWCiAgICAgICAgIHx8IGxldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhOT1BSSVYpCiAgICAgICAgJiYKICAgICAgICAobmV0c25tcF9vaWRfZXF1YWxzCiAgICAgICAgIChhdXRoUHJvdG9jb2wsIGF1dGhQcm90b2NvbExlbiwgdXNtTm9BdXRoUHJvdG9jb2wsCiAgICAgICAgICBzaXplb2YodXNtTm9BdXRoUHJvdG9jb2wpIC8gc2l6ZW9mKG9pZCkpID09IDApKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJMZXZlbDogJWRcbiIsIGxldmVsKSk7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJBdXRoIFByb3RvY29sOiAiKSk7CiAgICAgICAgREVCVUdNU0dPSUQoKCJ1c20iLCBhdXRoUHJvdG9jb2wsIGF1dGhQcm90b2NvbExlbikpOwogICAgICAgIERFQlVHTVNHKCgidXNtIiwgIiwgUHJpdiBQcm90b2NvbDogIikpOwogICAgICAgIERFQlVHTVNHT0lEKCgidXNtIiwgcHJpdlByb3RvY29sLCBwcml2UHJvdG9jb2xMZW4pKTsKICAgICAgICBERUJVR01TRygoInVzbSIsICJcbiIpKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMDsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9jaGVja19zZWNMZXZlbF92c19wcm90b2NvbHMoKSAqLwoKCgoKLyoKICogdXNtX2dldF91c2VyKCk6IFJldHVybnMgYSB1c2VyIGZyb20gdXNlckxpc3QgYmFzZWQgb24gdGhlIGVuZ2luZUlELAogKiBlbmdpbmVJRExlbiBhbmQgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIHVzZXIuIAogKi8KCnN0cnVjdCB1c21Vc2VyICoKdXNtX2dldF91c2VyKHVfY2hhciAqIGVuZ2luZUlELCBzaXplX3QgZW5naW5lSURMZW4sIGNoYXIgKm5hbWUpCnsKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiZ2V0dGluZyB1c2VyICVzXG4iLCBuYW1lKSk7CiAgICByZXR1cm4gdXNtX2dldF91c2VyX2Zyb21fbGlzdChlbmdpbmVJRCwgZW5naW5lSURMZW4sIG5hbWUsIHVzZXJMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Cn0KCnN0cnVjdCB1c21Vc2VyICoKdXNtX2dldF91c2VyX2Zyb21fbGlzdCh1X2NoYXIgKiBlbmdpbmVJRCwgc2l6ZV90IGVuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUsIHN0cnVjdCB1c21Vc2VyICpwdXNlckxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZV9kZWZhdWx0KQp7CiAgICBzdHJ1Y3QgdXNtVXNlciAqcHRyOwogICAgY2hhciAgICAgICAgICAgIG5vTmFtZVtdID0gIiI7CiAgICBpZiAobmFtZSA9PSBOVUxMKQogICAgICAgIG5hbWUgPSBub05hbWU7CiAgICBmb3IgKHB0ciA9IHB1c2VyTGlzdDsgcHRyICE9IE5VTEw7IHB0ciA9IHB0ci0+bmV4dCkgewogICAgICAgIGlmIChwdHItPm5hbWUgJiYgIXN0cmNtcChwdHItPm5hbWUsIG5hbWUpKSB7CiAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIm1hdGNoIG9uIHVzZXIgJXNcbiIsIHB0ci0+bmFtZSkpOwogICAgICAgICAgaWYgKHB0ci0+ZW5naW5lSURMZW4gPT0gZW5naW5lSURMZW4gJiYKICAgICAgICAgICAgKChwdHItPmVuZ2luZUlEID09IE5VTEwgJiYgZW5naW5lSUQgPT0gTlVMTCkgfHwKICAgICAgICAgICAgIChwdHItPmVuZ2luZUlEICE9IE5VTEwgJiYgZW5naW5lSUQgIT0gTlVMTCAmJgogICAgICAgICAgICAgIG1lbWNtcChwdHItPmVuZ2luZUlELCBlbmdpbmVJRCwgZW5naW5lSURMZW4pID09IDApKSkKICAgICAgICAgICAgcmV0dXJuIHB0cjsKICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAibm8gbWF0Y2ggb24gZW5naW5lSUQgKCIpKTsKICAgICAgICAgIGlmIChlbmdpbmVJRCkgewogICAgICAgICAgICAgIERFQlVHTVNHSEVYKCgidXNtIiwgZW5naW5lSUQsIGVuZ2luZUlETGVuKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiRW1wdHkgRW5naW5lSUQiKSk7CiAgICAgICAgICB9CiAgICAgICAgICBERUJVR01TRygoInVzbSIsICIpXG4iKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiByZXR1cm4gIiIgdXNlciB1c2VkIHRvIGZhY2lsaXRhdGUgZW5naW5lSUQgZGlzY292ZXJ5IAogICAgICovCiAgICBpZiAodXNlX2RlZmF1bHQgJiYgIXN0cmNtcChuYW1lLCAiIikpCiAgICAgICAgcmV0dXJuIG5vTmFtZVVzZXI7CiAgICByZXR1cm4gTlVMTDsKfQoKLyoKICogdXNtX2FkZF91c2VyKCk6IEFkZCdzIGEgdXNlciB0byB0aGUgdXNlckxpc3QsIHNvcnRlZCBieSB0aGUKICogZW5naW5lSURMZW5ndGggdGhlbiB0aGUgZW5naW5lSUQgdGhlbiB0aGUgbmFtZSBsZW5ndGggdGhlbiB0aGUgbmFtZQogKiB0byBmYWNpbGl0YXRlIGdldE5leHQgY2FsbHMgb24gYSB1c21Vc2VyIHRhYmxlIHdoaWNoIGlzIGluZGV4ZWQgYnkKICogdGhlc2UgdmFsdWVzLgogKiAKICogcmV0dXJucyB0aGUgaGVhZCBvZiB0aGUgbGlzdCAod2hpY2ggY291bGQgY2hhbmdlIGR1ZSB0byB0aGlzIGFkZCkuCiAqLwoKc3RydWN0IHVzbVVzZXIgKgp1c21fYWRkX3VzZXIoc3RydWN0IHVzbVVzZXIgKnVzZXIpCnsKICAgIHN0cnVjdCB1c21Vc2VyICp1cHRyOwogICAgdXB0ciA9IHVzbV9hZGRfdXNlcl90b19saXN0KHVzZXIsIHVzZXJMaXN0KTsKICAgIGlmICh1cHRyICE9IE5VTEwpCiAgICAgICAgdXNlckxpc3QgPSB1cHRyOwogICAgcmV0dXJuIHVwdHI7Cn0KCnN0cnVjdCB1c21Vc2VyICoKdXNtX2FkZF91c2VyX3RvX2xpc3Qoc3RydWN0IHVzbVVzZXIgKnVzZXIsIHN0cnVjdCB1c21Vc2VyICpwdXNlckxpc3QpCnsKICAgIHN0cnVjdCB1c21Vc2VyICpucHRyLCAqcHB0ciwgKm9wdHI7CgogICAgLyoKICAgICAqIGxvb3AgdGhyb3VnaCBwdXNlckxpc3QgdGlsbCB3ZSBmaW5kIHRoZSBwcm9wZXIsIHNvcnRlZCBwbGFjZSB0bwogICAgICogaW5zZXJ0IHRoZSBuZXcgdXNlciAKICAgICAqLwogICAgLyogWFhYIC0gaG93IHRvIGhhbmRsZSBhIE5VTEwgdXNlci0+bmFtZSA/PyAqLwogICAgLyogWFhYIC0gc2ltaWxhcmx5IGZvciBhIE5VTEwgbnB0ci0+bmFtZSA/PyAqLwogICAgZm9yIChucHRyID0gcHVzZXJMaXN0LCBwcHRyID0gTlVMTDsgbnB0ciAhPSBOVUxMOwogICAgICAgICBwcHRyID0gbnB0ciwgbnB0ciA9IG5wdHItPm5leHQpIHsKICAgICAgICBpZiAobnB0ci0+ZW5naW5lSURMZW4gPiB1c2VyLT5lbmdpbmVJRExlbikKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGlmICh1c2VyLT5lbmdpbmVJRCA9PSBOVUxMICYmIG5wdHItPmVuZ2luZUlEICE9IE5VTEwpCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBpZiAobnB0ci0+ZW5naW5lSURMZW4gPT0gdXNlci0+ZW5naW5lSURMZW4gJiYKICAgICAgICAgICAgKG5wdHItPmVuZ2luZUlEICE9IE5VTEwgJiYgdXNlci0+ZW5naW5lSUQgIT0gTlVMTCAmJgogICAgICAgICAgICAgbWVtY21wKG5wdHItPmVuZ2luZUlELCB1c2VyLT5lbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICB1c2VyLT5lbmdpbmVJRExlbikgPiAwKSkKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGlmICghKG5wdHItPmVuZ2luZUlEID09IE5VTEwgJiYgdXNlci0+ZW5naW5lSUQgIT0gTlVMTCkpIHsKICAgICAgICAgICAgaWYgKG5wdHItPmVuZ2luZUlETGVuID09IHVzZXItPmVuZ2luZUlETGVuICYmCiAgICAgICAgICAgICAgICAoKG5wdHItPmVuZ2luZUlEID09IE5VTEwgJiYgdXNlci0+ZW5naW5lSUQgPT0gTlVMTCkgfHwKICAgICAgICAgICAgICAgICBtZW1jbXAobnB0ci0+ZW5naW5lSUQsIHVzZXItPmVuZ2luZUlELAogICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5lbmdpbmVJRExlbikgPT0gMCkKICAgICAgICAgICAgICAgICYmIHN0cmxlbihucHRyLT5uYW1lKSA+IHN0cmxlbih1c2VyLT5uYW1lKSkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgaWYgKG5wdHItPmVuZ2luZUlETGVuID09IHVzZXItPmVuZ2luZUlETGVuICYmCiAgICAgICAgICAgICAgICAoKG5wdHItPmVuZ2luZUlEID09IE5VTEwgJiYgdXNlci0+ZW5naW5lSUQgPT0gTlVMTCkgfHwKICAgICAgICAgICAgICAgICBtZW1jbXAobnB0ci0+ZW5naW5lSUQsIHVzZXItPmVuZ2luZUlELAogICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5lbmdpbmVJRExlbikgPT0gMCkKICAgICAgICAgICAgICAgICYmIHN0cmxlbihucHRyLT5uYW1lKSA9PSBzdHJsZW4odXNlci0+bmFtZSkKICAgICAgICAgICAgICAgICYmIHN0cmNtcChucHRyLT5uYW1lLCB1c2VyLT5uYW1lKSA+IDApCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGlmIChucHRyLT5lbmdpbmVJRExlbiA9PSB1c2VyLT5lbmdpbmVJRExlbiAmJgogICAgICAgICAgICAgICAgKChucHRyLT5lbmdpbmVJRCA9PSBOVUxMICYmIHVzZXItPmVuZ2luZUlEID09IE5VTEwpIHx8CiAgICAgICAgICAgICAgICAgbWVtY21wKG5wdHItPmVuZ2luZUlELCB1c2VyLT5lbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+ZW5naW5lSURMZW4pID09IDApCiAgICAgICAgICAgICAgICAmJiBzdHJsZW4obnB0ci0+bmFtZSkgPT0gc3RybGVuKHVzZXItPm5hbWUpCiAgICAgICAgICAgICAgICAmJiBzdHJjbXAobnB0ci0+bmFtZSwgdXNlci0+bmFtZSkgPT0gMCkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHRoZSB1c2VyIGlzIGFuIGV4YWN0IG1hdGNoIG9mIGEgcHJldmlvdXMgZW50cnkuCiAgICAgICAgICAgICAgICAgKiBDcmVkZW50aWFscyBtYXkgYmUgZGlmZmVyZW50LCB0aG91Z2gsIHNvIHJlbW92ZQogICAgICAgICAgICAgICAgICogdGhlIG9sZCBlbnRyeSAoYW5kIGFkZCB0aGUgbmV3IG9uZSkhCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmIChwcHRyKSB7IC8qIGNoYW5nZSBwcmV2J3MgbmV4dCBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgIHBwdHItPm5leHQgPSBucHRyLT5uZXh0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG5wdHItPm5leHQpIHsgLyogY2hhbmdlIG5leHQncyBwcmV2IHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgbnB0ci0+bmV4dC0+cHJldiA9IHBwdHI7CiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgb3B0ciA9IG5wdHI7CiAgICAgICAgICAgICAgICBucHRyID0gb3B0ci0+bmV4dDsgLyogYWRkIG5ldyB1c2VyIGF0IHRoaXMgcG9zaXRpb24gKi8KICAgICAgICAgICAgICAgIC8qIGZyZWUgdGhlIG9sZCB1c2VyICovCiAgICAgICAgICAgICAgICBvcHRyLT5uZXh0PU5VTEw7CiAgICAgICAgICAgICAgICBvcHRyLT5wcmV2PU5VTEw7CiAgICAgICAgICAgICAgICB1c21fZnJlZV91c2VyKG9wdHIpOyAKICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBuZXcgdXNlciB3aWxsIGJlIGFkZGVkIGJlbG93ICovCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIG5wdHIgc2hvdWxkIG5vdyBwb2ludCB0byB0aGUgdXNlciB0aGF0IHdlIG5lZWQgdG8gYWRkIG91cnNlbHZlcwogICAgICogaW4gZnJvbnQgb2YsIGFuZCBwcHRyIHNob3VsZCBiZSBvdXIgbmV3ICdwcmV2Jy4gCiAgICAgKi8KCiAgICAvKgogICAgICogY2hhbmdlIG91ciBwb2ludGVycyAKICAgICAqLwogICAgdXNlci0+cHJldiA9IHBwdHI7CiAgICB1c2VyLT5uZXh0ID0gbnB0cjsKCiAgICAvKgogICAgICogY2hhbmdlIHRoZSBuZXh0J3MgcHJldiBwb2ludGVyIAogICAgICovCiAgICBpZiAodXNlci0+bmV4dCkKICAgICAgICB1c2VyLT5uZXh0LT5wcmV2ID0gdXNlcjsKCiAgICAvKgogICAgICogY2hhbmdlIHRoZSBwcmV2J3MgbmV4dCBwb2ludGVyIAogICAgICovCiAgICBpZiAodXNlci0+cHJldikKICAgICAgICB1c2VyLT5wcmV2LT5uZXh0ID0gdXNlcjsKCiAgICAvKgogICAgICogcmV3aW5kIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0IGFuZCByZXR1cm4gaXQgKHNpbmNlIHRoZSBuZXcgaGVhZAogICAgICogY291bGQgYmUgdXMsIHdlIG5lZWQgdG8gbm90aWZ5IHRoZSBhYm92ZSByb3V0aW5lIHdobyB0aGUgaGVhZCBub3cgaXMuIAogICAgICovCiAgICBmb3IgKHBwdHIgPSB1c2VyOyBwcHRyLT5wcmV2ICE9IE5VTEw7IHBwdHIgPSBwcHRyLT5wcmV2KTsKICAgIHJldHVybiBwcHRyOwp9CgovKgogKiB1c21fcmVtb3ZlX3VzZXIoKTogZmluZHMgYW5kIHJlbW92ZXMgYSB1c2VyIGZyb20gYSBsaXN0IAogKi8Kc3RydWN0IHVzbVVzZXIgKgp1c21fcmVtb3ZlX3VzZXIoc3RydWN0IHVzbVVzZXIgKnVzZXIpCnsKICAgIHJldHVybiB1c21fcmVtb3ZlX3VzZXJfZnJvbV9saXN0KHVzZXIsICZ1c2VyTGlzdCk7Cn0KCnN0cnVjdCB1c21Vc2VyICoKdXNtX3JlbW92ZV91c2VyX2Zyb21fbGlzdChzdHJ1Y3QgdXNtVXNlciAqdXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNtVXNlciAqKnBwdXNlckxpc3QpCnsKICAgIHN0cnVjdCB1c21Vc2VyICpucHRyLCAqcHB0cjsKCiAgICAvKgogICAgICogTlVMTCBwb2ludGVycyBhcmVuJ3QgYWxsb3dlZCAKICAgICAqLwogICAgaWYgKHBwdXNlckxpc3QgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoKnBwdXNlckxpc3QgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAvKgogICAgICogZmluZCB0aGUgdXNlciBpbiB0aGUgbGlzdCAKICAgICAqLwogICAgZm9yIChucHRyID0gKnBwdXNlckxpc3QsIHBwdHIgPSBOVUxMOyBucHRyICE9IE5VTEw7CiAgICAgICAgIHBwdHIgPSBucHRyLCBucHRyID0gbnB0ci0+bmV4dCkgewogICAgICAgIGlmIChucHRyID09IHVzZXIpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIGlmIChucHRyKSB7CiAgICAgICAgLyoKICAgICAgICAgKiByZW1vdmUgdGhlIHVzZXIgZnJvbSB0aGUgbGlua2VkIGxpc3QgCiAgICAgICAgICovCiAgICAgICAgaWYgKHBwdHIpIHsKICAgICAgICAgICAgcHB0ci0+bmV4dCA9IG5wdHItPm5leHQ7CiAgICAgICAgfQogICAgICAgIGlmIChucHRyLT5uZXh0KSB7CiAgICAgICAgICAgIG5wdHItPm5leHQtPnByZXYgPSBwcHRyOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiB1c2VyIGRpZG4ndCBleGlzdCAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmIChucHRyID09ICpwcHVzZXJMaXN0KSAgICAvKiB3ZSdyZSB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgbmVlZCB0byBjaGFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqIHRoZSBoZWFkIHRvIHRoZSBuZXh0IHVzZXIgKi8KICAgICAgICAqcHB1c2VyTGlzdCA9IG5wdHItPm5leHQ7CiAgICByZXR1cm4gKnBwdXNlckxpc3Q7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9yZW1vdmVfdXNlcl9mcm9tX2xpc3QoKSAqLwoKCgoKLyoKICogdXNtX2ZyZWVfdXNlcigpOiAgY2FsbHMgZnJlZSgpIG9uIGFsbCBuZWVkZWQgcGFydHMgb2Ygc3RydWN0IHVzbVVzZXIgYW5kCiAqIHRoZSB1c2VyIGhpbXNlbGYuCiAqIAogKiBOb3RlOiBUaGlzIHNob3VsZCAqbm90KiBiZSBjYWxsZWQgb24gYW4gb2JqZWN0IGluIGEgbGlzdCAoSUUsCiAqIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IGZpcnN0LCBhbmQgc2V0IG5leHQgYW5kIHByZXYgdG8gTlVMTCksIGJ1dAogKiB3aWxsIHRyeSB0byByZWNvbm5lY3QgdGhlIGxpc3QgcGllY2VzIGFnYWluIGlmIGl0IGlzIGNhbGxlZCB0aGlzCiAqIHdheS4gIElmIGNhbGxlZCBvbiB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgdGhlIGVudGlyZSBsaXN0IHdpbGwgYmUKICogbG9zdC4gCiAqLwpzdHJ1Y3QgdXNtVXNlciAqCnVzbV9mcmVlX3VzZXIoc3RydWN0IHVzbVVzZXIgKnVzZXIpCnsKICAgIGlmICh1c2VyID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgU05NUF9GUkVFKHVzZXItPmVuZ2luZUlEKTsKICAgIFNOTVBfRlJFRSh1c2VyLT5uYW1lKTsKICAgIFNOTVBfRlJFRSh1c2VyLT5zZWNOYW1lKTsKICAgIFNOTVBfRlJFRSh1c2VyLT5jbG9uZUZyb20pOwogICAgU05NUF9GUkVFKHVzZXItPnVzZXJQdWJsaWNTdHJpbmcpOwogICAgU05NUF9GUkVFKHVzZXItPmF1dGhQcm90b2NvbCk7CiAgICBTTk1QX0ZSRUUodXNlci0+cHJpdlByb3RvY29sKTsKCiAgICBpZiAodXNlci0+YXV0aEtleSAhPSBOVUxMKSB7CiAgICAgICAgU05NUF9aRVJPKHVzZXItPmF1dGhLZXksIHVzZXItPmF1dGhLZXlMZW4pOwogICAgICAgIFNOTVBfRlJFRSh1c2VyLT5hdXRoS2V5KTsKICAgIH0KCiAgICBpZiAodXNlci0+cHJpdktleSAhPSBOVUxMKSB7CiAgICAgICAgU05NUF9aRVJPKHVzZXItPnByaXZLZXksIHVzZXItPnByaXZLZXlMZW4pOwogICAgICAgIFNOTVBfRlJFRSh1c2VyLT5wcml2S2V5KTsKICAgIH0KCgogICAgLyoKICAgICAqIEZJWCAgV2h5IG5vdCBwdXQgdGhpcyBjaGVjayAqZmlyc3Q/KgogICAgICovCiAgICBpZiAodXNlci0+cHJldiAhPSBOVUxMKSB7ICAgLyogYWNrLCB0aGlzIHNob3VsZG4ndCBoYXBwZW4gKi8KICAgICAgICB1c2VyLT5wcmV2LT5uZXh0ID0gdXNlci0+bmV4dDsKICAgIH0KICAgIGlmICh1c2VyLT5uZXh0ICE9IE5VTEwpIHsKICAgICAgICB1c2VyLT5uZXh0LT5wcmV2ID0gdXNlci0+cHJldjsKICAgICAgICBpZiAodXNlci0+cHJldiAhPSBOVUxMKSAvKiBhY2sgdGhpcyBpcyByZWFsbHkgYmFkLCBiZWNhdXNlIGl0IG1lYW5zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKiB3ZSdsbCBsb29zZSB0aGUgaGVhZCBvZiBzb21lIHN0cnVjdHVyZSB0cmVlICovCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLAogICAgICAgICAgICAgICAgICAgICAgICAiU2V2ZXJlOiBBc2tlZCB0byBmcmVlIHRoZSBoZWFkIG9mIGEgdXNtVXNlciB0cmVlIHNvbWV3aGVyZS4iKSk7CiAgICB9CgoKICAgIFNOTVBfWkVSTyh1c2VyLCBzaXplb2YoKnVzZXIpKTsKICAgIFNOTVBfRlJFRSh1c2VyKTsKCiAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogZm9yIGNvbnZlbmllbmNlIHRvIHJldHVybnMgZnJvbSBjYWxsaW5nIGZ1bmN0aW9ucyAqLwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2ZyZWVfdXNlcigpICovCgoKCgovKgogKiB0YWtlIGEgZ2l2ZW4gdXNlciBhbmQgY2xvbmUgdGhlIHNlY3VyaXR5IGluZm8gaW50byBhbm90aGVyIAogKi8Kc3RydWN0IHVzbVVzZXIgKgp1c21fY2xvbmVGcm9tX3VzZXIoc3RydWN0IHVzbVVzZXIgKmZyb20sIHN0cnVjdCB1c21Vc2VyICp0bykKewogICAgLyoKICAgICAqIGNvcHkgdGhlIGF1dGhQcm90b2NvbCBvaWQgcm93IHBvaW50ZXIgCiAgICAgKi8KICAgIFNOTVBfRlJFRSh0by0+YXV0aFByb3RvY29sKTsKCiAgICBpZiAoKHRvLT5hdXRoUHJvdG9jb2wgPQogICAgICAgICBzbm1wX2R1cGxpY2F0ZV9vYmppZChmcm9tLT5hdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20tPmF1dGhQcm90b2NvbExlbikpICE9IE5VTEwpCiAgICAgICAgdG8tPmF1dGhQcm90b2NvbExlbiA9IGZyb20tPmF1dGhQcm90b2NvbExlbjsKICAgIGVsc2UKICAgICAgICB0by0+YXV0aFByb3RvY29sTGVuID0gMDsKCgogICAgLyoKICAgICAqIGNvcHkgdGhlIGF1dGhLZXkgCiAgICAgKi8KICAgIFNOTVBfRlJFRSh0by0+YXV0aEtleSk7CgogICAgaWYgKGZyb20tPmF1dGhLZXlMZW4gPiAwICYmCiAgICAgICAgKHRvLT5hdXRoS2V5ID0gKHVfY2hhciAqKSBtYWxsb2MoZnJvbS0+YXV0aEtleUxlbikpCiAgICAgICAgIT0gTlVMTCkgewogICAgICAgIHRvLT5hdXRoS2V5TGVuID0gZnJvbS0+YXV0aEtleUxlbjsKICAgICAgICBtZW1jcHkodG8tPmF1dGhLZXksIGZyb20tPmF1dGhLZXksIHRvLT5hdXRoS2V5TGVuKTsKICAgIH0gZWxzZSB7CiAgICAgICAgdG8tPmF1dGhLZXkgPSBOVUxMOwogICAgICAgIHRvLT5hdXRoS2V5TGVuID0gMDsKICAgIH0KCgogICAgLyoKICAgICAqIGNvcHkgdGhlIHByaXZQcm90b2NvbCBvaWQgcm93IHBvaW50ZXIgCiAgICAgKi8KICAgIFNOTVBfRlJFRSh0by0+cHJpdlByb3RvY29sKTsKCiAgICBpZiAoKHRvLT5wcml2UHJvdG9jb2wgPQogICAgICAgICBzbm1wX2R1cGxpY2F0ZV9vYmppZChmcm9tLT5wcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20tPnByaXZQcm90b2NvbExlbikpICE9IE5VTEwpCiAgICAgICAgdG8tPnByaXZQcm90b2NvbExlbiA9IGZyb20tPnByaXZQcm90b2NvbExlbjsKICAgIGVsc2UKICAgICAgICB0by0+cHJpdlByb3RvY29sTGVuID0gMDsKCiAgICAvKgogICAgICogY29weSB0aGUgcHJpdktleSAKICAgICAqLwogICAgU05NUF9GUkVFKHRvLT5wcml2S2V5KTsKCiAgICBpZiAoZnJvbS0+cHJpdktleUxlbiA+IDAgJiYKICAgICAgICAodG8tPnByaXZLZXkgPSAodV9jaGFyICopIG1hbGxvYyhmcm9tLT5wcml2S2V5TGVuKSkKICAgICAgICAhPSBOVUxMKSB7CiAgICAgICAgdG8tPnByaXZLZXlMZW4gPSBmcm9tLT5wcml2S2V5TGVuOwogICAgICAgIG1lbWNweSh0by0+cHJpdktleSwgZnJvbS0+cHJpdktleSwgdG8tPnByaXZLZXlMZW4pOwogICAgfSBlbHNlIHsKICAgICAgICB0by0+cHJpdktleSA9IE5VTEw7CiAgICAgICAgdG8tPnByaXZLZXlMZW4gPSAwOwogICAgfQogICAgcmV0dXJuIHRvOwp9CgovKgogKiB1c21fY3JlYXRlX3VzZXIodm9pZCk6CiAqIGNyZWF0ZSBhIGRlZmF1bHQgZW1wdHkgdXNlciwgaW5zdGFudGlhdGluZyBvbmx5IHRoZSBhdXRoL3ByaXYKICogcHJvdG9jb2xzIHRvIG5vQXV0aCBhbmQgbm9Qcml2IE9JRCBwb2ludGVycwogKi8Kc3RydWN0IHVzbVVzZXIgKgp1c21fY3JlYXRlX3VzZXIodm9pZCkKewogICAgc3RydWN0IHVzbVVzZXIgKm5ld1VzZXI7CgogICAgLyoKICAgICAqIGNyZWF0ZSB0aGUgbmV3IHVzZXIgCiAgICAgKi8KICAgIG5ld1VzZXIgPSAoc3RydWN0IHVzbVVzZXIgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdXNtVXNlcikpOwogICAgaWYgKG5ld1VzZXIgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAvKgogICAgICogZmlsbCB0aGUgYXV0aC9wcml2IHByb3RvY29scyAKICAgICAqLwogICAgaWYgKChuZXdVc2VyLT5hdXRoUHJvdG9jb2wgPQogICAgICAgICBzbm1wX2R1cGxpY2F0ZV9vYmppZCh1c21Ob0F1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVzbU5vQXV0aFByb3RvY29sKSAvIHNpemVvZihvaWQpKSkgPT0KICAgICAgICBOVUxMKQogICAgICAgIHJldHVybiB1c21fZnJlZV91c2VyKG5ld1VzZXIpOwogICAgbmV3VXNlci0+YXV0aFByb3RvY29sTGVuID0gc2l6ZW9mKHVzbU5vQXV0aFByb3RvY29sKSAvIHNpemVvZihvaWQpOwoKICAgIGlmICgobmV3VXNlci0+cHJpdlByb3RvY29sID0KICAgICAgICAgc25tcF9kdXBsaWNhdGVfb2JqaWQodXNtTm9Qcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1c21Ob1ByaXZQcm90b2NvbCkgLyBzaXplb2Yob2lkKSkpID09CiAgICAgICAgTlVMTCkKICAgICAgICByZXR1cm4gdXNtX2ZyZWVfdXNlcihuZXdVc2VyKTsKICAgIG5ld1VzZXItPnByaXZQcm90b2NvbExlbiA9IHNpemVvZih1c21Ob1ByaXZQcm90b2NvbCkgLyBzaXplb2Yob2lkKTsKCiAgICAvKgogICAgICogc2V0IHRoZSBzdG9yYWdlIHR5cGUgdG8gbm9udm9sYXRpbGUsIGFuZCB0aGUgc3RhdHVzIHRvIEFDVElWRSAKICAgICAqLwogICAgbmV3VXNlci0+dXNlclN0b3JhZ2VUeXBlID0gU1RfTk9OVk9MQVRJTEU7CiAgICBuZXdVc2VyLT51c2VyU3RhdHVzID0gUlNfQUNUSVZFOwogICAgcmV0dXJuIG5ld1VzZXI7Cgp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB1c21fY2xvbmVfdXNlcigpICovCgoKCgovKgogKiB1c21fY3JlYXRlX2luaXRpYWxfdXNlcih2b2lkKToKICogY3JlYXRlcyBhbiBpbml0aWFsIHVzZXIsIGZpbGxlZCB3aXRoIHRoZSBkZWZhdWx0cyBkZWZpbmVkIGluIHRoZQogKiBVU00gZG9jdW1lbnQuCiAqLwpzdHJ1Y3QgdXNtVXNlciAqCnVzbV9jcmVhdGVfaW5pdGlhbF91c2VyKGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIGF1dGhQcm90b2NvbCwgc2l6ZV90IGF1dGhQcm90b2NvbExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogcHJpdlByb3RvY29sLCBzaXplX3QgcHJpdlByb3RvY29sTGVuKQp7CiAgICBzdHJ1Y3QgdXNtVXNlciAqbmV3VXNlciA9IHVzbV9jcmVhdGVfdXNlcigpOwogICAgaWYgKG5ld1VzZXIgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoKG5ld1VzZXItPm5hbWUgPSBzdHJkdXAobmFtZSkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIHVzbV9mcmVlX3VzZXIobmV3VXNlcik7CgogICAgaWYgKChuZXdVc2VyLT5zZWNOYW1lID0gc3RyZHVwKG5hbWUpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiB1c21fZnJlZV91c2VyKG5ld1VzZXIpOwoKICAgIGlmICgobmV3VXNlci0+ZW5naW5lSUQgPQogICAgICAgICBzbm1wdjNfZ2VuZXJhdGVfZW5naW5lSUQoJm5ld1VzZXItPmVuZ2luZUlETGVuKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gdXNtX2ZyZWVfdXNlcihuZXdVc2VyKTsKCiAgICBpZiAoKG5ld1VzZXItPmNsb25lRnJvbSA9IChvaWQgKikgbWFsbG9jKHNpemVvZihvaWQpICogMikpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIHVzbV9mcmVlX3VzZXIobmV3VXNlcik7CiAgICBuZXdVc2VyLT5jbG9uZUZyb21bMF0gPSAwOwogICAgbmV3VXNlci0+Y2xvbmVGcm9tWzFdID0gMDsKICAgIG5ld1VzZXItPmNsb25lRnJvbUxlbiA9IDI7CgogICAgU05NUF9GUkVFKG5ld1VzZXItPnByaXZQcm90b2NvbCk7CiAgICBpZiAoKG5ld1VzZXItPnByaXZQcm90b2NvbCA9IHNubXBfZHVwbGljYXRlX29iamlkKHByaXZQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdlByb3RvY29sTGVuKSkgPT0KICAgICAgICBOVUxMKSB7CiAgICAgICAgcmV0dXJuIHVzbV9mcmVlX3VzZXIobmV3VXNlcik7CiAgICB9CiAgICBuZXdVc2VyLT5wcml2UHJvdG9jb2xMZW4gPSBwcml2UHJvdG9jb2xMZW47CgogICAgU05NUF9GUkVFKG5ld1VzZXItPmF1dGhQcm90b2NvbCk7CiAgICBpZiAoKG5ld1VzZXItPmF1dGhQcm90b2NvbCA9IHNubXBfZHVwbGljYXRlX29iamlkKGF1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aFByb3RvY29sTGVuKSkgPT0KICAgICAgICBOVUxMKSB7CiAgICAgICAgcmV0dXJuIHVzbV9mcmVlX3VzZXIobmV3VXNlcik7CiAgICB9CiAgICBuZXdVc2VyLT5hdXRoUHJvdG9jb2xMZW4gPSBhdXRoUHJvdG9jb2xMZW47CgogICAgbmV3VXNlci0+dXNlclN0YXR1cyA9IFJTX0FDVElWRTsKICAgIG5ld1VzZXItPnVzZXJTdG9yYWdlVHlwZSA9IFNUX1JFQURPTkxZOwoKICAgIHJldHVybiBuZXdVc2VyOwp9CgovKgogKiB0aGlzIGlzIGEgY2FsbGJhY2sgdGhhdCBjYW4gc3RvcmUgYWxsIGtub3duIHVzZXJzIGJhc2VkIG9uIGEKICogcHJldmlvdXNseSByZWdpc3RlcmVkIGFwcGxpY2F0aW9uIElEIAogKi8KaW50CnVzbV9zdG9yZV91c2VycyhpbnQgbWFqb3JJRCwgaW50IG1pbm9ySUQsIHZvaWQgKnNlcnZlcmFyZywgdm9pZCAqY2xpZW50YXJnKQp7CiAgICAvKgogICAgICogZmlndXJlIG91dCBvdXIgYXBwbGljYXRpb24gbmFtZSAKICAgICAqLwogICAgY2hhciAgICAgICAgICAgKmFwcG5hbWUgPSAoY2hhciAqKSBjbGllbnRhcmc7CiAgICBpZiAoYXBwbmFtZSA9PSBOVUxMKSB7CiAgICAgICAgYXBwbmFtZSA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCU5FVFNOTVBfRFNfTElCX0FQUFRZUEUpOwogICAgfQoKICAgIC8qCiAgICAgKiBzYXZlIHRoZSB1c2VyIGJhc2UgCiAgICAgKi8KICAgIHVzbV9zYXZlX3VzZXJzKCJ1c21Vc2VyIiwgYXBwbmFtZSk7CgogICAgLyoKICAgICAqIG5ldmVyIGZhaWxzIAogICAgICovCiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgoKLyoKICogdXNtX3NhdmVfdXNlcnMoKTogc2F2ZXMgYSBsaXN0IG9mIHVzZXJzIHRvIHRoZSBwZXJzaXN0ZW50IGNhY2hlIAogKi8Kdm9pZAp1c21fc2F2ZV91c2Vycyhjb25zdCBjaGFyICp0b2tlbiwgY29uc3QgY2hhciAqdHlwZSkKewogICAgdXNtX3NhdmVfdXNlcnNfZnJvbV9saXN0KHVzZXJMaXN0LCB0b2tlbiwgdHlwZSk7Cn0KCnZvaWQKdXNtX3NhdmVfdXNlcnNfZnJvbV9saXN0KHN0cnVjdCB1c21Vc2VyICpwdXNlckxpc3QsIGNvbnN0IGNoYXIgKnRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSkKewogICAgc3RydWN0IHVzbVVzZXIgKnVwdHI7CiAgICBmb3IgKHVwdHIgPSBwdXNlckxpc3Q7IHVwdHIgIT0gTlVMTDsgdXB0ciA9IHVwdHItPm5leHQpIHsKICAgICAgICBpZiAodXB0ci0+dXNlclN0b3JhZ2VUeXBlID09IFNUX05PTlZPTEFUSUxFKQogICAgICAgICAgICB1c21fc2F2ZV91c2VyKHVwdHIsIHRva2VuLCB0eXBlKTsKICAgIH0KfQoKLyoKICogdXNtX3NhdmVfdXNlcigpOiBzYXZlcyBhIHVzZXIgdG8gdGhlIHBlcnNpc3RlbnQgY2FjaGUgCiAqLwp2b2lkCnVzbV9zYXZlX3VzZXIoc3RydWN0IHVzbVVzZXIgKnVzZXIsIGNvbnN0IGNoYXIgKnRva2VuLCBjb25zdCBjaGFyICp0eXBlKQp7CiAgICBjaGFyICAgICAgICAgICAgbGluZVs0MDk2XTsKICAgIGNoYXIgICAgICAgICAgICpjcHRyOwoKICAgIG1lbXNldChsaW5lLCAwLCBzaXplb2YobGluZSkpOwoKICAgIHNwcmludGYobGluZSwgIiVzICVkICVkICIsIHRva2VuLCB1c2VyLT51c2VyU3RhdHVzLAogICAgICAgICAgICB1c2VyLT51c2VyU3RvcmFnZVR5cGUpOwogICAgY3B0ciA9ICZsaW5lW3N0cmxlbihsaW5lKV07IC8qIHRoZSBOVUxMICovCiAgICBjcHRyID0KICAgICAgICByZWFkX2NvbmZpZ19zYXZlX29jdGV0X3N0cmluZyhjcHRyLCB1c2VyLT5lbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5lbmdpbmVJRExlbik7CiAgICAqY3B0cisrID0gJyAnOwogICAgY3B0ciA9IHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsICh1X2NoYXIgKikgdXNlci0+bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlci0+bmFtZSA9PSBOVUxMKSA/IDAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbih1c2VyLT5uYW1lKSArIDEpOwogICAgKmNwdHIrKyA9ICcgJzsKICAgIGNwdHIgPSByZWFkX2NvbmZpZ19zYXZlX29jdGV0X3N0cmluZyhjcHRyLCAodV9jaGFyICopIHVzZXItPnNlY05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZXItPnNlY05hbWUgPT0gTlVMTCkgPyAwIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4odXNlci0+c2VjTmFtZSkgKyAxKTsKICAgICpjcHRyKysgPSAnICc7CiAgICBjcHRyID0KICAgICAgICByZWFkX2NvbmZpZ19zYXZlX29iamlkKGNwdHIsIHVzZXItPmNsb25lRnJvbSwgdXNlci0+Y2xvbmVGcm9tTGVuKTsKICAgICpjcHRyKysgPSAnICc7CiAgICBjcHRyID0gcmVhZF9jb25maWdfc2F2ZV9vYmppZChjcHRyLCB1c2VyLT5hdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5hdXRoUHJvdG9jb2xMZW4pOwogICAgKmNwdHIrKyA9ICcgJzsKICAgIGNwdHIgPQogICAgICAgIHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsIHVzZXItPmF1dGhLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+YXV0aEtleUxlbik7CiAgICAqY3B0cisrID0gJyAnOwogICAgY3B0ciA9IHJlYWRfY29uZmlnX3NhdmVfb2JqaWQoY3B0ciwgdXNlci0+cHJpdlByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+cHJpdlByb3RvY29sTGVuKTsKICAgICpjcHRyKysgPSAnICc7CiAgICBjcHRyID0KICAgICAgICByZWFkX2NvbmZpZ19zYXZlX29jdGV0X3N0cmluZyhjcHRyLCB1c2VyLT5wcml2S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPnByaXZLZXlMZW4pOwogICAgKmNwdHIrKyA9ICcgJzsKICAgIGNwdHIgPSByZWFkX2NvbmZpZ19zYXZlX29jdGV0X3N0cmluZyhjcHRyLCB1c2VyLT51c2VyUHVibGljU3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPnVzZXJQdWJsaWNTdHJpbmdMZW4pOwoKICAgIHJlYWRfY29uZmlnX3N0b3JlKHR5cGUsIGxpbmUpOwp9CgovKgogKiB1c21fcGFyc2VfdXNlcigpOiByZWFkcyBpbiBhIGxpbmUgY29udGFpbmluZyBhIHNhdmVkIHVzZXIgcHJvZmlsZQogKiBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXdseSBjcmVhdGVkIHN0cnVjdCB1c21Vc2VyLiAKICovCnN0cnVjdCB1c21Vc2VyICoKdXNtX3JlYWRfdXNlcihjaGFyICpsaW5lKQp7CiAgICBzdHJ1Y3QgdXNtVXNlciAqdXNlcjsKICAgIHNpemVfdCAgICAgICAgICBsZW47CiAgICBzaXplX3QgZXhwZWN0ZWRfcHJpdktleUxlbiA9IDA7CgogICAgdXNlciA9IHVzbV9jcmVhdGVfdXNlcigpOwogICAgaWYgKHVzZXIgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICB1c2VyLT51c2VyU3RhdHVzID0gYXRvaShsaW5lKTsKICAgIGxpbmUgPSBza2lwX3Rva2VuKGxpbmUpOwogICAgdXNlci0+dXNlclN0b3JhZ2VUeXBlID0gYXRvaShsaW5lKTsKICAgIGxpbmUgPSBza2lwX3Rva2VuKGxpbmUpOwogICAgbGluZSA9IHJlYWRfY29uZmlnX3JlYWRfb2N0ZXRfc3RyaW5nKGxpbmUsICZ1c2VyLT5lbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+ZW5naW5lSURMZW4pOwoKICAgIC8qCiAgICAgKiBzZXQgdGhlIGxjZCBlbnRyeSBmb3IgdGhpcyBlbmdpbmVJRCB0byB0aGUgbWluaW11bSBib290cy90aW1lCiAgICAgKiB2YWx1ZXMgc28gdGhhdCBpdHMgYSBrbm93biBlbmdpbmVpZCBhbmQgd29uJ3QgcmV0dXJuIGEgcmVwb3J0IHBkdS4KICAgICAqIFRoaXMgaXMgbW9zdGx5IGltcG9ydGFudCB3aGVuIHJlY2VpdmluZyB2MyB0cmFwcyBzbyB0aGF0IHRoZSB1c20KICAgICAqIHdpbGwgYXQgbGVhc3QgY29udGludWUgcHJvY2Vzc2luZyB0aGVtLiAKICAgICAqLwogICAgc2V0X2VuZ2luZXRpbWUodXNlci0+ZW5naW5lSUQsIHVzZXItPmVuZ2luZUlETGVuLCAxLCAwLCAwKTsKCiAgICBsaW5lID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcobGluZSwgKHVfY2hhciAqKikgJiB1c2VyLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pOwogICAgbGluZSA9IHJlYWRfY29uZmlnX3JlYWRfb2N0ZXRfc3RyaW5nKGxpbmUsICh1X2NoYXIgKiopICYgdXNlci0+c2VjTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuKTsKICAgIFNOTVBfRlJFRSh1c2VyLT5jbG9uZUZyb20pOwogICAgdXNlci0+Y2xvbmVGcm9tTGVuID0gMDsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX29iamlkKGxpbmUsICZ1c2VyLT5jbG9uZUZyb20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+Y2xvbmVGcm9tTGVuKTsKCiAgICBTTk1QX0ZSRUUodXNlci0+YXV0aFByb3RvY29sKTsKICAgIHVzZXItPmF1dGhQcm90b2NvbExlbiA9IDA7CgogICAgbGluZSA9IHJlYWRfY29uZmlnX3JlYWRfb2JqaWQobGluZSwgJnVzZXItPmF1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5hdXRoUHJvdG9jb2xMZW4pOwogICAgbGluZSA9IHJlYWRfY29uZmlnX3JlYWRfb2N0ZXRfc3RyaW5nKGxpbmUsICZ1c2VyLT5hdXRoS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5hdXRoS2V5TGVuKTsKICAgIFNOTVBfRlJFRSh1c2VyLT5wcml2UHJvdG9jb2wpOwogICAgdXNlci0+cHJpdlByb3RvY29sTGVuID0gMDsKCiAgICBsaW5lID0gcmVhZF9jb25maWdfcmVhZF9vYmppZChsaW5lLCAmdXNlci0+cHJpdlByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPnByaXZQcm90b2NvbExlbik7CiAgICBsaW5lID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcobGluZSwgJnVzZXItPnByaXZLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPnByaXZLZXlMZW4pOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKICAgIGlmIChJU1RSQU5TRk9STSh1c2VyLT5wcml2UHJvdG9jb2wsIERFU1ByaXYpKSB7CiAgICAgICAgLyogREVTIHVzZXMgYSAxMjggYml0IGtleSwgNjQgYml0cyBvZiB3aGljaCBpcyBhIHNhbHQgKi8KICAgICAgICBleHBlY3RlZF9wcml2S2V5TGVuID0gMTY7CiAgICB9CiNlbmRpZgojaWZkZWYgSEFWRV9BRVMKICAgIGlmIChJU1RSQU5TRk9STSh1c2VyLT5wcml2UHJvdG9jb2wsIEFFU1ByaXYpKSB7CiAgICAgICAgZXhwZWN0ZWRfcHJpdktleUxlbiA9IDE2OwogICAgfQojZW5kaWYKICAgIC8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwogICAgaWYgKHVzZXItPnByaXZLZXlMZW4gPiBleHBlY3RlZF9wcml2S2V5TGVuKSB7CgkgIHVzZXItPnByaXZLZXlMZW4gPSBleHBlY3RlZF9wcml2S2V5TGVuOwogICAgfQoKICAgIGxpbmUgPSByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhsaW5lLCAmdXNlci0+dXNlclB1YmxpY1N0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+dXNlclB1YmxpY1N0cmluZ0xlbik7CiAgICByZXR1cm4gdXNlcjsKfQoKLyoKICogc25tcGQuY29uZiBwYXJzaW5nIHJvdXRpbmVzIAogKi8Kdm9pZAp1c21fcGFyc2VfY29uZmlnX3VzbVVzZXIoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIHN0cnVjdCB1c21Vc2VyICp1cHRyOwoKICAgIHVwdHIgPSB1c21fcmVhZF91c2VyKGxpbmUpOwogICAgaWYgKCB1cHRyKQogICAgICAgIHVzbV9hZGRfdXNlcih1cHRyKTsKfQoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogdXNtX3NldF9wYXNzd29yZAogKgogKiBQYXJhbWV0ZXJzOgogKgkqdG9rZW4KICoJKmxpbmUKICogICAgICAKICoKICogZm9ybWF0OiB1c2VyU2V0QXV0aFBhc3MgICAgIHNlY25hbWUgZW5naW5lSURMZW4gZW5naW5lSUQgcGFzcwogKiAgICAgb3I6IHVzZXJTZXRQcml2UGFzcyAgICAgc2VjbmFtZSBlbmdpbmVJRExlbiBlbmdpbmVJRCBwYXNzIAogKiAgICAgb3I6IHVzZXJTZXRBdXRoS2V5ICAgICAgc2VjbmFtZSBlbmdpbmVJRExlbiBlbmdpbmVJRCBLdUxlbiBLdQogKiAgICAgb3I6IHVzZXJTZXRQcml2S2V5ICAgICAgc2VjbmFtZSBlbmdpbmVJRExlbiBlbmdpbmVJRCBLdUxlbiBLdSAKICogICAgIG9yOiB1c2VyU2V0QXV0aExvY2FsS2V5IHNlY25hbWUgZW5naW5lSURMZW4gZW5naW5lSUQgS3VsTGVuIEt1bAogKiAgICAgb3I6IHVzZXJTZXRQcml2TG9jYWxLZXkgc2VjbmFtZSBlbmdpbmVJRExlbiBlbmdpbmVJRCBLdWxMZW4gS3VsIAogKgogKiB0eXBlIGlzOgkxPXBhc3NwaHJhc2U7IDI9S3U7IDM9S3VsLgogKgogKgogKiBBU1NVTUVTICBQYXNzd29yZHMgYXJlIG51bGwtdGVybWluYXRlZCBwcmludGFibGUgc3RyaW5ncy4KICovCnZvaWQKdXNtX3NldF9wYXNzd29yZChjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgY2hhciAgICAgICAgICAgIG5hbWVCdWZbU05NUF9NQVhCVUZdOwogICAgdV9jaGFyICAgICAgICAgKmVuZ2luZUlEID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBlbmdpbmVJRExlbiA9IDA7CiAgICBzdHJ1Y3QgdXNtVXNlciAqdXNlcjsKCiAgICBjcCA9IGNvcHlfbndvcmQobGluZSwgbmFtZUJ1Ziwgc2l6ZW9mKG5hbWVCdWYpKTsKICAgIGlmIChjcCA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBuYW1lIHNwZWNpZmllciIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBERUJVR01TR1RMKCgidXNtIiwgImNvbXBhcmluZzogJXMgYW5kICVzXG4iLCBjcCwgV0lMRENBUkRTVFJJTkcpKTsKICAgIGlmIChzdHJuY21wKGNwLCBXSUxEQ0FSRFNUUklORywgc3RybGVuKFdJTERDQVJEU1RSSU5HKSkgPT0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogbWF0Y2ggYWdhaW5zdCBhbGwgZW5naW5lSURzIHdlIGtub3cgYWJvdXQgCiAgICAgICAgICovCiAgICAgICAgY3AgPSBza2lwX3Rva2VuKGNwKTsKICAgICAgICBmb3IgKHVzZXIgPSB1c2VyTGlzdDsgdXNlciAhPSBOVUxMOyB1c2VyID0gdXNlci0+bmV4dCkgewogICAgICAgICAgICBpZiAodXNlci0+c2VjTmFtZSAmJiBzdHJjbXAodXNlci0+c2VjTmFtZSwgbmFtZUJ1ZikgPT0gMCkgewogICAgICAgICAgICAgICAgdXNtX3NldF91c2VyX3Bhc3N3b3JkKHVzZXIsIHRva2VuLCBjcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNwID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcoY3AsICZlbmdpbmVJRCwgJmVuZ2luZUlETGVuKTsKICAgICAgICBpZiAoY3AgPT0gTlVMTCkgewogICAgICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIGVuZ2luZUlEIHNwZWNpZmllciIpOwogICAgICAgICAgICBTTk1QX0ZSRUUoZW5naW5lSUQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB1c2VyID0gdXNtX2dldF91c2VyKGVuZ2luZUlELCBlbmdpbmVJRExlbiwgbmFtZUJ1Zik7CiAgICAgICAgaWYgKHVzZXIgPT0gTlVMTCkgewogICAgICAgICAgICBjb25maWdfcGVycm9yKCJub3QgYSB2YWxpZCB1c2VyL2VuZ2luZUlEIHBhaXIiKTsKICAgICAgICAgICAgU05NUF9GUkVFKGVuZ2luZUlEKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB1c21fc2V0X3VzZXJfcGFzc3dvcmQodXNlciwgdG9rZW4sIGNwKTsKICAgICAgICBTTk1QX0ZSRUUoZW5naW5lSUQpOwogICAgfQp9CgovKgogKiB1c2VzIHRoZSByZXN0IG9mIExJTkUgdG8gY29uZmlndXJlIFVTRVIncyBwYXNzd29yZCBvZiB0eXBlIFRPS0VOIAogKi8Kdm9pZAp1c21fc2V0X3VzZXJfcGFzc3dvcmQoc3RydWN0IHVzbVVzZXIgKnVzZXIsIGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBjaGFyICAgICAgICAgICAqY3AgPSBsaW5lOwogICAgdV9jaGFyICAgICAgICAgKmVuZ2luZUlEID0gdXNlci0+ZW5naW5lSUQ7CiAgICBzaXplX3QgICAgICAgICAgZW5naW5lSURMZW4gPSB1c2VyLT5lbmdpbmVJRExlbjsKCiAgICB1X2NoYXIgICAgICAgICoqa2V5OwogICAgc2l6ZV90ICAgICAgICAgKmtleUxlbjsKICAgIHVfY2hhciAgICAgICAgICB1c2VyS2V5W1NOTVBfTUFYQlVGX1NNQUxMXTsKICAgIHNpemVfdCAgICAgICAgICB1c2VyS2V5TGVuID0gU05NUF9NQVhCVUZfU01BTEw7CiAgICB1X2NoYXIgICAgICAgICAqdXNlcktleVAgPSB1c2VyS2V5OwogICAgaW50ICAgICAgICAgICAgIHR5cGUsIHJldDsKCiAgICAvKgogICAgICogUmV0cmlldmUgdGhlICJvbGQiIGtleSBhbmQgc2V0IHRoZSBrZXkgdHlwZS4KICAgICAqLwogICAgaWYgKCF0b2tlbikgewogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoc3RyY21wKHRva2VuLCAidXNlclNldEF1dGhQYXNzIikgPT0gMCkgewogICAgICAgIGtleSA9ICZ1c2VyLT5hdXRoS2V5OwogICAgICAgIGtleUxlbiA9ICZ1c2VyLT5hdXRoS2V5TGVuOwogICAgICAgIHR5cGUgPSAwOwogICAgfSBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJ1c2VyU2V0UHJpdlBhc3MiKSA9PSAwKSB7CiAgICAgICAga2V5ID0gJnVzZXItPnByaXZLZXk7CiAgICAgICAga2V5TGVuID0gJnVzZXItPnByaXZLZXlMZW47CiAgICAgICAgdHlwZSA9IDA7CiAgICB9IGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgInVzZXJTZXRBdXRoS2V5IikgPT0gMCkgewogICAgICAgIGtleSA9ICZ1c2VyLT5hdXRoS2V5OwogICAgICAgIGtleUxlbiA9ICZ1c2VyLT5hdXRoS2V5TGVuOwogICAgICAgIHR5cGUgPSAxOwogICAgfSBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJ1c2VyU2V0UHJpdktleSIpID09IDApIHsKICAgICAgICBrZXkgPSAmdXNlci0+cHJpdktleTsKICAgICAgICBrZXlMZW4gPSAmdXNlci0+cHJpdktleUxlbjsKICAgICAgICB0eXBlID0gMTsKICAgIH0gZWxzZSBpZiAoc3RyY21wKHRva2VuLCAidXNlclNldEF1dGhMb2NhbEtleSIpID09IDApIHsKICAgICAgICBrZXkgPSAmdXNlci0+YXV0aEtleTsKICAgICAgICBrZXlMZW4gPSAmdXNlci0+YXV0aEtleUxlbjsKICAgICAgICB0eXBlID0gMjsKICAgIH0gZWxzZSBpZiAoc3RyY21wKHRva2VuLCAidXNlclNldFByaXZMb2NhbEtleSIpID09IDApIHsKICAgICAgICBrZXkgPSAmdXNlci0+cHJpdktleTsKICAgICAgICBrZXlMZW4gPSAmdXNlci0+cHJpdktleUxlbjsKICAgICAgICB0eXBlID0gMjsKICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBubyBvbGQga2V5LCBvciB0b2tlbiB3YXMgbm90IHJlY29nbml6ZWQgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICgqa2V5KSB7CiAgICAgICAgLyoKICAgICAgICAgKiAoZGVzdHJveSBhbmQpIGZyZWUgdGhlIG9sZCBrZXkgCiAgICAgICAgICovCiAgICAgICAgbWVtc2V0KCprZXksIDAsICprZXlMZW4pOwogICAgICAgIFNOTVBfRlJFRSgqa2V5KTsKICAgIH0KCiAgICBpZiAodHlwZSA9PSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBjb252ZXJ0IHRoZSBwYXNzd29yZCBpbnRvIGEga2V5IAogICAgICAgICAqLwogICAgICAgIGlmIChjcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIGNvbmZpZ19wZXJyb3IoIm1pc3NpbmcgdXNlciBwYXNzd29yZCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHJldCA9IGdlbmVyYXRlX0t1KHVzZXItPmF1dGhQcm90b2NvbCwgdXNlci0+YXV0aFByb3RvY29sTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgY3AsIHN0cmxlbihjcCksIHVzZXJLZXksICZ1c2VyS2V5TGVuKTsKCiAgICAgICAgaWYgKHJldCAhPSBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICAgICAgY29uZmlnX3BlcnJvcigic2V0dGluZyBrZXkgZmFpbGVkIChpbiBzY19nZW5LdSgpKSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlID09IDEpIHsKICAgICAgICBjcCA9IHJlYWRfY29uZmlnX3JlYWRfb2N0ZXRfc3RyaW5nKGNwLCAmdXNlcktleVAsICZ1c2VyS2V5TGVuKTsKCiAgICAgICAgaWYgKGNwID09IE5VTEwpIHsKICAgICAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCB1c2VyIGtleSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICh0eXBlIDwgMikgewogICAgICAgICprZXkgPSAodV9jaGFyICopIG1hbGxvYyhTTk1QX01BWEJVRl9TTUFMTCk7CiAgICAgICAgKmtleUxlbiA9IFNOTVBfTUFYQlVGX1NNQUxMOwogICAgICAgIHJldCA9IGdlbmVyYXRlX2t1bCh1c2VyLT5hdXRoUHJvdG9jb2wsIHVzZXItPmF1dGhQcm90b2NvbExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lSUQsIGVuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyS2V5LCB1c2VyS2V5TGVuLCAqa2V5LCBrZXlMZW4pOwogICAgICAgIGlmIChyZXQgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIGNvbmZpZ19wZXJyb3IoInNldHRpbmcga2V5IGZhaWxlZCAoaW4gZ2VuZXJhdGVfa3VsKCkpIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogKGRlc3Ryb3kgYW5kKSBmcmVlIHRoZSBvbGQga2V5IAogICAgICAgICAqLwogICAgICAgIG1lbXNldCh1c2VyS2V5LCAwLCBzaXplb2YodXNlcktleSkpOwoKICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiB0aGUga2V5IGlzIGdpdmVuLCBjb3B5IGl0IGluIAogICAgICAgICAqLwogICAgICAgIGNwID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcoY3AsIGtleSwga2V5TGVuKTsKCiAgICAgICAgaWYgKGNwID09IE5VTEwpIHsKICAgICAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBsb2NhbGl6ZWQgdXNlciBrZXkiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX3NldF9wYXNzd29yZCgpICovCg==