LyogIApDb3B5cmlnaHQgKGMpIDIwMDksIFFVQUxDT01NIFVTQSwgSU5DLgoKQWxsIHJpZ2h0cyByZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCrcgICAgICAgICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAoKtyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCgq3ICAgICAgICAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUVVBTENPTU0gVVNBLCBJTkMuICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgogKi8KCiAvKgogKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgogKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KICovCgojaW5jbHVkZSAibG9jX2FwaV9jYi5oIgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8cnBjL3BtYXBfY2xudC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxtZW1vcnkuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KCiNpZm5kZWYgU0lHX1BGCiNkZWZpbmUgU0lHX1BGIHZvaWQoKikoaW50KQojZW5kaWYKCnZvaWQKbG9jX2FwaWNicHJvZ18weDAwMDEwMDAxKHN0cnVjdCBzdmNfcmVxICpycXN0cCwgcmVnaXN0ZXIgU1ZDWFBSVCAqdHJhbnNwKQp7Cgl1bmlvbiB7CgkJcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV8weDAwMDEwMDAxX2FyZzsKCX0gYXJndW1lbnQ7Cgl1bmlvbiB7CgkJcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cyBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV8weDAwMDEwMDAxX3JlczsKCX0gcmVzdWx0OwoJYm9vbF90IHJldHZhbDsKCXhkcnByb2NfdCBfeGRyX2FyZ3VtZW50LCBfeGRyX3Jlc3VsdDsKCWJvb2xfdCAoKmxvY2FsKShjaGFyICosIHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CgoJc3dpdGNoIChycXN0cC0+cnFfcHJvYykgewoJY2FzZSBOVUxMUFJPQzoKCQkodm9pZCkgc3ZjX3NlbmRyZXBseSAodHJhbnNwLCAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNoYXIgKilOVUxMKTsKCQlyZXR1cm47CgoJY2FzZSBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZToKCQlfeGRyX2FyZ3VtZW50ID0gKHhkcnByb2NfdCkgeGRyX3JwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3M7CgkJX3hkcl9yZXN1bHQgPSAoeGRycHJvY190KSB4ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0czsKCQlsb2NhbCA9IChib29sX3QgKCopIChjaGFyICosIHZvaWQgKiwgIHN0cnVjdCBzdmNfcmVxICopKXJwY19sb2NfZXZlbnRfY2JfZl90eXBlXzB4MDAwMTAwMDFfc3ZjOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJc3ZjZXJyX25vcHJvYyAodHJhbnNwKTsKCQlyZXR1cm47Cgl9CgltZW1zZXQgKChjaGFyICopJmFyZ3VtZW50LCAwLCBzaXplb2YgKGFyZ3VtZW50KSk7CglpZiAoIXN2Y19nZXRhcmdzICh0cmFuc3AsICh4ZHJwcm9jX3QpIF94ZHJfYXJndW1lbnQsIChjYWRkcl90KSAmYXJndW1lbnQpKSB7CgkJc3ZjZXJyX2RlY29kZSAodHJhbnNwKTsKCQlyZXR1cm47Cgl9CglyZXR2YWwgPSAoYm9vbF90KSAoKmxvY2FsKSgoY2hhciAqKSZhcmd1bWVudCwgKHZvaWQgKikmcmVzdWx0LCBycXN0cCk7CglpZiAocmV0dmFsID4gMCAmJiAhc3ZjX3NlbmRyZXBseSh0cmFuc3AsICh4ZHJwcm9jX3QpIF94ZHJfcmVzdWx0LCAoY2hhciAqKSZyZXN1bHQpKSB7CgkJc3ZjZXJyX3N5c3RlbWVyciAodHJhbnNwKTsKCX0KCWlmICghc3ZjX2ZyZWVhcmdzICh0cmFuc3AsICh4ZHJwcm9jX3QpIF94ZHJfYXJndW1lbnQsIChjYWRkcl90KSAmYXJndW1lbnQpKSB7CgkJZnByaW50ZiAoc3RkZXJyLCAiJXMiLCAidW5hYmxlIHRvIGZyZWUgYXJndW1lbnRzIik7CgkJZXhpdCAoMSk7Cgl9CglpZiAoIWxvY19hcGljYnByb2dfMHgwMDAxMDAwMV9mcmVlcmVzdWx0ICh0cmFuc3AsIF94ZHJfcmVzdWx0LCAoY2FkZHJfdCkgJnJlc3VsdCkpCgkJZnByaW50ZiAoc3RkZXJyLCAiJXMiLCAidW5hYmxlIHRvIGZyZWUgcmVzdWx0cyIpOwoKCXJldHVybjsKfQo=