LyoKQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cm1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKbWV0OgogICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCiAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwogICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECldBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwpCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCkNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GClNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgpCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgpJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKi8KCiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlICJtbV9jYW1lcmFfZGJnLmgiCiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlIDxwb2xsLmg+CiNpbmNsdWRlIDxsaW51eC9tZWRpYS5oPgoKI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UyLmgiCiNpbmNsdWRlICJtbV9jYW1lcmEuaCIKCiNkZWZpbmUgU0VUX1BBUk1fQklUMzIocGFybSwgcGFybV9hcnIpIFwKICAgIChwYXJtX2FycltwYXJtLzMyXSB8PSAoMTw8KHBhcm0lMzIpKSkKCiNkZWZpbmUgR0VUX1BBUk1fQklUMzIocGFybSwgcGFybV9hcnIpIFwKICAgICgocGFybV9hcnJbcGFybS8zMl0+PihwYXJtJTMyKSkmIDB4MSkKCnN0YXRpYyBwdGhyZWFkX211dGV4X3QgZ19tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CgpzdGF0aWMgbW1fY2FtZXJhX2N0cmxfdCBnX2NhbV9jdHJsOwoKc3RhdGljIGludCBtbV9jYW1lcmFfdXRpbF9vcGNvZGVfMl9jaF90eXBlKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190eXBlX3Qgb3Bjb2RlKQp7CiAgICBzd2l0Y2gob3Bjb2RlKSB7CiAgICBjYXNlIE1NX0NBTUVSQV9PUFNfUFJFVklFVzoKICAgICAgICByZXR1cm4gTU1fQ0FNRVJBX0NIX1BSRVZJRVc7CiAgICBjYXNlIE1NX0NBTUVSQV9PUFNfWlNMOgogICAgY2FzZSBNTV9DQU1FUkFfT1BTX1NOQVBTSE9UOgogICAgICAgIHJldHVybiBNTV9DQU1FUkFfQ0hfU05BUFNIT1Q7CiAgICBjYXNlIE1NX0NBTUVSQV9PUFNfUFJFUEFSRV9TTkFQU0hPVDoKICAgICAgICByZXR1cm4gTU1fQ0FNRVJBX0NIX1NOQVBTSE9UOwogICAgY2FzZSBNTV9DQU1FUkFfT1BTX1JBVzoKICAgICAgICByZXR1cm4gTU1fQ0FNRVJBX0NIX1JBVzsKICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KCmNvbnN0IGNoYXIgKm1tX2NhbWVyYV91dGlsX2dldF9kZXZfbmFtZShtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmopCnsKICAgIENEQkcoIiVzOiBSZXR1cm5pbmcgJXMgYXQgaW5kZXggOiVkXG4iLAogICAgICAgIF9fZnVuY19fLGdfY2FtX2N0cmwuY2FtZXJhW215X29iai0+bXlfaWRdLnZpZGVvX2Rldl9uYW1lLG15X29iai0+bXlfaWQpOwogICAgcmV0dXJuIGdfY2FtX2N0cmwuY2FtZXJhW215X29iai0+bXlfaWRdLnZpZGVvX2Rldl9uYW1lOwp9CgovKiB1c2VkIGZvciBxdWVyeWluZyB0aGUgY2FtZXJhX2luZm8gb2YgdGhlIGdpdmVuIGNhbWVyYV9pZCAqLwpzdGF0aWMgY29uc3QgcWNhbWVyYV9pbmZvX3QgKiBtbV9jYW1lcmFfY2ZnX3F1ZXJ5X2NhbWVyYV9pbmZvIChpbnQ4X3QgY2FtZXJhX2lkKQp7CiAgICBpZihjYW1lcmFfaWQgPj0gTVNNX01BWF9DQU1FUkFfU0VOU09SUykKICAgICAgICByZXR1cm4gTlVMTDsKICAgIHJldHVybiAmZ19jYW1fY3RybC5jYW1lcmFbY2FtZXJhX2lkXS5jYW1lcmFfaW5mbzsKfQovKiBjaGVjayBpZiB0aGUgcGFybSBpcyBzdXBwb3J0ZWQgKi8Kc3RhdGljIHVpbnQ4X3QgbW1fY2FtZXJhX2NmZ19pc19wYXJtX3N1cHBvcnRlZCAobW1fY2FtZXJhX3QgKiBjYW1lcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9wYXJtX3R5cGVfdCBwYXJtX3R5cGUpCnsKICAgIGludCBpc19wYXJtX3N1cHBvcnRlZCA9IDA7CiAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOwoKICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19tdXRleCk7CiAgICBteV9vYmogPSBnX2NhbV9jdHJsLmNhbV9vYmpbY2FtZXJhLT5jYW1lcmFfaW5mby5jYW1lcmFfaWRdOwogICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbXV0ZXgpOwogICAgaWYobXlfb2JqKSB7CiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPm11dGV4KTsKICAgICAgICBpc19wYXJtX3N1cHBvcnRlZCA9IEdFVF9QQVJNX0JJVDMyKHBhcm1fdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X29iai0+cHJvcGVydGllcy5wYXJtKTsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5tdXRleCk7CiAgICB9CgogICAgcmV0dXJuIGlzX3Bhcm1fc3VwcG9ydGVkOwp9CgovKiBjaGVjayBpZiB0aGUgY2hhbm5lbCBpcyBzdXBwb3J0ZWQgKi8Kc3RhdGljIHVpbnQ4X3QgbW1fY2FtZXJhX2NmZ19pc19jaF9zdXBwb3J0ZWQgKG1tX2NhbWVyYV90ICogY2FtZXJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUpCnsKICAgIHN3aXRjaChjaF90eXBlKSB7CiAgICBjYXNlIE1NX0NBTUVSQV9DSF9QUkVWSUVXOgogICAgY2FzZSBNTV9DQU1FUkFfQ0hfVklERU86CiAgICBjYXNlIE1NX0NBTUVSQV9DSF9TTkFQU0hPVDoKICAgIGNhc2UgTU1fQ0FNRVJBX0NIX1JBVzoKICAgICAgICByZXR1cm4gVFJVRTsKICAgIGNhc2UgTU1fQ0FNRVJBX0NIX01BWDoKICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIEZBTFNFOwp9CgovKiBzZXQgYSBwYXJtknMgY3VycmVudCB2YWx1ZSAqLwpzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfY2ZnX3NldF9wYXJtIChtbV9jYW1lcmFfdCAqIGNhbWVyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3Bhcm1fdHlwZV90IHBhcm1fdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcF92YWx1ZSkKewogICAgaW50MzJfdCByYyA9IC1NTV9DQU1FUkFfRV9HRU5FUkFMOwogICAgdWludDMyX3QgdG1wOwogICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKICAgIG1tX2NhbWVyYV9wYXJtX3QgcGFybSA9IHsucGFybV90eXBlID0gcGFybV90eXBlLCAucF92YWx1ZSA9IHBfdmFsdWV9OwoKICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19tdXRleCk7CiAgICBteV9vYmogPSBnX2NhbV9jdHJsLmNhbV9vYmpbY2FtZXJhLT5jYW1lcmFfaW5mby5jYW1lcmFfaWRdOwogICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbXV0ZXgpOwogICAgaWYobXlfb2JqKSB7CiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPm11dGV4KTsKICAgICAgICByYyA9IG1tX2NhbWVyYV9zZXRfcGFybShteV9vYmosICZwYXJtKTsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5tdXRleCk7CiAgICB9CiAgICByZXR1cm4gcmM7Cn0KCi8qIGdldCBhIHBhcm2ScyBjdXJyZW50IHZhbHVlICovCnN0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9jZmdfZ2V0X3Bhcm0gKG1tX2NhbWVyYV90ICogY2FtZXJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfcGFybV90eXBlX3QgcGFybV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3ZhbHVlKQp7CiAgICBpbnQzMl90IHJjID0gLU1NX0NBTUVSQV9FX0dFTkVSQUw7CiAgICB1aW50MzJfdCB0bXA7CiAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOwogICAgbW1fY2FtZXJhX3Bhcm1fdCBwYXJtID0gey5wYXJtX3R5cGUgPSBwYXJtX3R5cGUsIC5wX3ZhbHVlID0gcF92YWx1ZX07CgogICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX211dGV4KTsKICAgIG15X29iaiA9IGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmEtPmNhbWVyYV9pbmZvLmNhbWVyYV9pZF07CiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdXRleCk7CiAgICBpZihteV9vYmopIHsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+bXV0ZXgpOwogICAgICAgIHJjID0gIG1tX2NhbWVyYV9nZXRfcGFybShteV9vYmosICZwYXJtKTsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5tdXRleCk7CiAgICB9CiAgICByZXR1cm4gcmM7Cn0KCnN0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9jZmdfcmVxdWVzdF9idWYobW1fY2FtZXJhX3QgKiBjYW1lcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3JlZ19idWZfdCAqYnVmKQp7CiAgICBpbnQzMl90IHJjID0gLU1NX0NBTUVSQV9FX0dFTkVSQUw7CiAgICB1aW50MzJfdCB0bXA7CiAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOwoKICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19tdXRleCk7CiAgICBteV9vYmogPSBnX2NhbV9jdHJsLmNhbV9vYmpbY2FtZXJhLT5jYW1lcmFfaW5mby5jYW1lcmFfaWRdOwogICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbXV0ZXgpOwogICAgaWYobXlfb2JqKSB7CiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPm11dGV4KTsKICAgICAgICByYyA9ICBtbV9jYW1lcmFfcmVxdWVzdF9idWYobXlfb2JqLCBidWYpOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPm11dGV4KTsKICAgIH0KICAgIHJldHVybiByYzsKfQoKc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX2NmZ19lbnF1ZXVlX2J1ZihtbV9jYW1lcmFfdCAqIGNhbWVyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfcmVnX2J1Zl90ICpidWYpCnsKICAgIGludDMyX3QgcmMgPSAtTU1fQ0FNRVJBX0VfR0VORVJBTDsKICAgIHVpbnQzMl90IHRtcDsKICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CgogICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX211dGV4KTsKICAgIG15X29iaiA9IGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmEtPmNhbWVyYV9pbmZvLmNhbWVyYV9pZF07CiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdXRleCk7CiAgICBpZihteV9vYmopIHsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+bXV0ZXgpOwogICAgICAgIHJjID0gIG1tX2NhbWVyYV9lbnF1ZXVlX2J1ZihteV9vYmosIGJ1Zik7CiAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+bXV0ZXgpOwogICAgfQogICAgcmV0dXJuIHJjOwp9CgpzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfY2ZnX3ByZXBhcmVfYnVmKG1tX2NhbWVyYV90ICogY2FtZXJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9yZWdfYnVmX3QgKmJ1ZikKewogICAgaW50MzJfdCByYyA9IC1NTV9DQU1FUkFfRV9HRU5FUkFMOwogICAgdWludDMyX3QgdG1wOwogICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKCiAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfbXV0ZXgpOwogICAgbXlfb2JqID0gZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYS0+Y2FtZXJhX2luZm8uY2FtZXJhX2lkXTsKICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX211dGV4KTsKICAgIGlmKG15X29iaikgewogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5tdXRleCk7CiAgICAgICAgcmMgPSAgbW1fY2FtZXJhX3ByZXBhcmVfYnVmKG15X29iaiwgYnVmKTsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5tdXRleCk7CiAgICB9CiAgICByZXR1cm4gcmM7Cn0Kc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX2NmZ191bnByZXBhcmVfYnVmKG1tX2NhbWVyYV90ICogY2FtZXJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUpCnsKICAgIGludDMyX3QgcmMgPSAtTU1fQ0FNRVJBX0VfR0VORVJBTDsKICAgIHVpbnQzMl90IHRtcDsKICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CgogICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX211dGV4KTsKICAgIG15X29iaiA9IGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmEtPmNhbWVyYV9pbmZvLmNhbWVyYV9pZF07CiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdXRleCk7CiAgICBpZihteV9vYmopIHsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+bXV0ZXgpOwogICAgICAgIHJjID0gIG1tX2NhbWVyYV91bnByZXBhcmVfYnVmKG15X29iaixjaF90eXBlKTsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5tdXRleCk7CiAgICB9CiAgICByZXR1cm4gcmM7Cn0KCnN0YXRpYyBtbV9jYW1lcmFfY29uZmlnX3QgbW1fY2FtZXJhX2NmZyA9IHsKICAuaXNfcGFybV9zdXBwb3J0ZWQgPSBtbV9jYW1lcmFfY2ZnX2lzX3Bhcm1fc3VwcG9ydGVkLAogIC5pc19jaF9zdXBwb3J0ZWQgPSBtbV9jYW1lcmFfY2ZnX2lzX2NoX3N1cHBvcnRlZCwKICAuc2V0X3Bhcm0gPSBtbV9jYW1lcmFfY2ZnX3NldF9wYXJtLAogIC5nZXRfcGFybSA9IG1tX2NhbWVyYV9jZmdfZ2V0X3Bhcm0sCiAgLnJlcXVlc3RfYnVmID0gbW1fY2FtZXJhX2NmZ19yZXF1ZXN0X2J1ZiwKICAuZW5xdWV1ZV9idWYgPSBtbV9jYW1lcmFfY2ZnX2VucXVldWVfYnVmLAogIC5wcmVwYXJlX2J1ZiA9IG1tX2NhbWVyYV9jZmdfcHJlcGFyZV9idWYsCiAgLnVucHJlcGFyZV9idWYgPSBtbV9jYW1lcmFfY2ZnX3VucHJlcGFyZV9idWYKfTsKCnN0YXRpYyB1aW50OF90IG1tX2NhbWVyYV9vcHNfaXNfb3Bfc3VwcG9ydGVkIChtbV9jYW1lcmFfdCAqIGNhbWVyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdHlwZV90IG9wY29kZSkKewogICAgdWludDhfdCBpc19vcHNfc3VwcG9ydGVkOwogICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKICAgIGludCBpbmRleCA9IDA7CiAgICBtbV9jYW1lcmFfbGVnYWN5X29wc190eXBlX3QgbGVnYWN5X29wY29kZSA9IENBTUVSQV9PUFNfTUFYOwoKICAgIC8qIFRlbXA6IFdlIHdpbGwgYmUgdHJhbnNsYXRpbmcgb3VyIG5ldyBvcGNvZGUKICAgICAgIHRvIGxlZ2FjeSBvcHMgdHlwZS4gVGhpcyBpcyBqdXN0IGEgaGFjayB0bwogICAgICAgdGVtcG9yYXJpbHkgdW5ibG9jayBBUFQgdGVhbS4gTmV3IGRlc2lnbiBpcwogICAgICAgdW5kZXIgZGlzY3Vzc2lvbiAqLwogICAgc3dpdGNoIChvcGNvZGUpIHsKICAgIGNhc2UgTU1fQ0FNRVJBX09QU19QUkVWSUVXOgogICAgICAgIGxlZ2FjeV9vcGNvZGUgPSBDQU1FUkFfT1BTX1NUUkVBTUlOR19QUkVWSUVXOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBNTV9DQU1FUkFfT1BTX1ZJREVPOgogICAgICAgIGxlZ2FjeV9vcGNvZGUgPSBDQU1FUkFfT1BTX1NUUkVBTUlOR19WSURFTzsKICAgICAgICBicmVhazsKICAgIGNhc2UgTU1fQ0FNRVJBX09QU19QUkVQQVJFX1NOQVBTSE9UOgogICAgICAgIGxlZ2FjeV9vcGNvZGUgPSBDQU1FUkFfT1BTX1BSRVBBUkVfU05BUFNIT1Q7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE1NX0NBTUVSQV9PUFNfU05BUFNIT1Q6CiAgICAgICAgbGVnYWN5X29wY29kZSA9IENBTUVSQV9PUFNfU05BUFNIT1Q7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE1NX0NBTUVSQV9PUFNfUkFXOgogICAgICAgIGxlZ2FjeV9vcGNvZGUgPSBDQU1FUkFfT1BTX1JBV19DQVBUVVJFOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBNTV9DQU1FUkFfT1BTX1pTTDoKICAgICAgICBsZWdhY3lfb3Bjb2RlID0gQ0FNRVJBX09QU19TVFJFQU1JTkdfWlNMOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBNTV9DQU1FUkFfT1BTX0ZPQ1VTOgogICAgICAgIGxlZ2FjeV9vcGNvZGUgPSBDQU1FUkFfT1BTX0ZPQ1VTOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBNTV9DQU1FUkFfT1BTX0dFVF9CVUZGRVJFRF9GUkFNRToKICAgICAgbGVnYWN5X29wY29kZSA9IENBTUVSQV9PUFNfTE9DQUw7CiAgICAgIGlzX29wc19zdXBwb3J0ZWQgPSBUUlVFOwogICAgICBDREJHKCJNTV9DQU1FUkFfT1BTX0dFVF9CVUZGRVJFRF9GUkFNRSBub3QgaGFuZGxlZCIpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIENEQkdfRVJST1IoIiVzOiBjYXNlICVkIG5vdCBoYW5kbGVkIiwgX19mdW5jX18sIG9wY29kZSk7CiAgICAgIGxlZ2FjeV9vcGNvZGUgPSBDQU1FUkFfT1BTX0xPQ0FMOwogICAgICBpc19vcHNfc3VwcG9ydGVkID0gRkFMU0U7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGxlZ2FjeV9vcGNvZGUgIT0gQ0FNRVJBX09QU19MT0NBTCkgewogICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX211dGV4KTsKICAgIG15X29iaiA9IGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmEtPmNhbWVyYV9pbmZvLmNhbWVyYV9pZF07CiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdXRleCk7CiAgICBpZihteV9vYmopIHsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+bXV0ZXgpOwogICAgICAgIGluZGV4ID0gbGVnYWN5X29wY29kZS8zMjsgIC8qIDMyIGJpdHMgKi8KICAgICAgICBpc19vcHNfc3VwcG9ydGVkID0gKChteV9vYmotPnByb3BlcnRpZXMub3BzW2luZGV4XSAmCiAgICAgICAgICAgICgxPDxsZWdhY3lfb3Bjb2RlKSkgIT0gMCk7CiAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+bXV0ZXgpOwogICAgICB9IGVsc2UgewogICAgICAgIGlzX29wc19zdXBwb3J0ZWQgPSBGQUxTRTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBpc19vcHNfc3VwcG9ydGVkOwp9CgpzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfb3BzX2FjdGlvbiAobW1fY2FtZXJhX3QgKiBjYW1lcmEsIHVpbnQ4X3Qgc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdHlwZV90IG9wY29kZSwgdm9pZCAqdmFsKQp7CiAgICBpbnQzMl90IHJjID0gLU1NX0NBTUVSQV9FX0dFTkVSQUw7CiAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOwogICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX211dGV4KTsKICAgIG15X29iaiA9IGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmEtPmNhbWVyYV9pbmZvLmNhbWVyYV9pZF07CiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdXRleCk7CiAgICBpZihteV9vYmopIHsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+bXV0ZXgpOwogICAgICAgIHJjID0gbW1fY2FtZXJhX2FjdGlvbihteV9vYmosIHN0YXJ0LCBvcGNvZGUsIHZhbCk7CiAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+bXV0ZXgpOwogICAgfQogICAgcmV0dXJuIHJjOwp9CgovKiBvcGVuIHVzZXMgZmxhZ3MgdG8gb3B0aW9uYWxseSBkaXNhYmxlIGpwZWcvdnBlIGludGVyZmFjZS4gKi8Kc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX29wc19vcGVuIChtbV9jYW1lcmFfdCAqIGNhbWVyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfb3BfbW9kZV90eXBlX3Qgb3BfbW9kZSkKewogICAgaW50OF90IGNhbWVyYV9pZCA9IGNhbWVyYS0+Y2FtZXJhX2luZm8uY2FtZXJhX2lkOwogICAgaW50MzJfdCByYyA9IE1NX0NBTUVSQV9PSzsKCiAgICBDREJHKCIlczogQkVHSU5cbiIsIF9fZnVuY19fKTsKICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19tdXRleCk7CiAgICAvKiBub3QgZmlyc3Qgb3BlbiAqLwogICAgaWYoZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYV9pZF0pIHsKICAgICAgICBnX2NhbV9jdHJsLmNhbV9vYmpbY2FtZXJhX2lkXS0+cmVmX2NvdW50Kys7CiAgICBDREJHKCIlczogIG9wZW5lZCBhbHJlYWR5biIsIF9fZnVuY19fKTsKICAgICAgICBnb3RvIGVuZDsKICAgIH0KICAgIGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmFfaWRdID0KICAgIChtbV9jYW1lcmFfb2JqX3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9vYmpfdCkpOwogICAgaWYoIWdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmFfaWRdKSB7CiAgICAgICAgcmMgPSAtTU1fQ0FNRVJBX0VfTk9fTUVNT1JZOwogICAgIENEQkcoIiVzOiAgbm8gbWVtIiwgX19mdW5jX18pOwogICAgICAgZ290byBlbmQ7CiAgICB9CiAgICBtZW1zZXQoZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYV9pZF0sIDAsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKG1tX2NhbWVyYV9vYmpfdCkpOwogICAgLy9nX2NhbV9jdHJsLmNhbV9vYmpbY2FtZXJhX2lkXS0+Y3RybF9mZCA9IC0xOwogICAgZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYV9pZF0tPnJlZl9jb3VudCsrOwogICAgZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYV9pZF0tPm15X2lkPWNhbWVyYV9pZDsKCiAgICBwdGhyZWFkX211dGV4X2luaXQoJmdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmFfaWRdLT5tdXRleCwgTlVMTCk7CiAgICByYyA9IG1tX2NhbWVyYV9vcGVuKGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmFfaWRdLCBvcF9tb2RlKTsKICAgIGlmKHJjIDwgMCkgewogICAgICAgIENEQkcoIiVzOiBvcGVuIGZhaWxlZCwgcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmFfaWRdLT5tdXRleCk7CiAgICAgICAgZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYV9pZF0tPnJlZl9jb3VudC0tOwogICAgICAgIGZyZWUoZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYV9pZF0pOwogICAgICAgIGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmFfaWRdPU5VTEw7CiAgICBDREJHKCIlczogbW1fY2FtZXJhX29wZW4gZXJyID0gJWQiLCBfX2Z1bmNfXywgcmMpOwogICAgICAgIGdvdG8gZW5kOwogICAgfWVsc2V7CiAgICAgICAgQ0RCRygiJXM6IG9wZW4gc3VjY2VkZWRcbiIsIF9fZnVuY19fKTsKICAgIH0KZW5kOgogICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbXV0ZXgpOwogICAgQ0RCRygiJXM6IEVORCwgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAgICByZXR1cm4gcmM7Cn0KCnN0YXRpYyB2b2lkIG1tX2NhbWVyYV9vcHNfY2xvc2UgKG1tX2NhbWVyYV90ICogY2FtZXJhKQp7CiAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmo7CiAgICBpbnQgaTsKICAgIGludDhfdCBjYW1lcmFfaWQgPSBjYW1lcmEtPmNhbWVyYV9pbmZvLmNhbWVyYV9pZDsKCiAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfbXV0ZXgpOwogICAgbXlfb2JqID0gZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYV9pZF07CiAgICBpZihteV9vYmopIHsKICAgICAgbXlfb2JqLT5yZWZfY291bnQtLTsKICAgICAgaWYobXlfb2JqLT5yZWZfY291bnQgPiAwKSB7CiAgICAgICAgQ0RCRygiJXM6IHJlZl9jb3VudD0lZFxuIiwgX19mdW5jX18sIG15X29iai0+cmVmX2NvdW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBtbV9jYW1lcmFfcG9sbF90aHJlYWRfcmVsZWFzZShteV9vYmosIE1NX0NBTUVSQV9DSF9NQVgpOwogICAgICAgICh2b2lkKW1tX2NhbWVyYV9jbG9zZShnX2NhbV9jdHJsLmNhbV9vYmpbY2FtZXJhX2lkXSk7CiAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZteV9vYmotPm11dGV4KTsKICAgICAgICBmcmVlKG15X29iaik7CiAgICAgICAgZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYV9pZF0gPSBOVUxMOwogICAgICB9CiAgICB9CiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdXRleCk7Cn0KCnN0YXRpYyB2b2lkIG1tX2NhbWVyYV9vcHNfc3RvcCAobW1fY2FtZXJhX3QgKiBjYW1lcmEpCnsKICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iajsKICAgIGludCBpOwogICAgaW50OF90IGNhbWVyYV9pZCA9IGNhbWVyYS0+Y2FtZXJhX2luZm8uY2FtZXJhX2lkOwoKICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19tdXRleCk7CiAgICBteV9vYmogPSBnX2NhbV9jdHJsLmNhbV9vYmpbY2FtZXJhX2lkXTsKICAgIGlmKG15X29iaikgewogICAgICAgIENEQkcoIiVzIDogQ2xvc2UgVGhyZWFkcyBpbiBtbV9jYW1lcmFfb3BzX3N0b3AiLF9fZnVuY19fKTsKICAgICAgICBmb3IoaSA9IDA7IGkgPD0gTU1fQ0FNRVJBX0NIX01BWDsgaSsrKSB7CiAgICAgICAgICAgIG1tX2NhbWVyYV9wb2xsX3RocmVhZF9yZWxlYXNlKG15X29iaiwobW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90KWkpOwogICAgICAgIH0KICAgICAgICBtbV9jYW1lcmFfcG9sbF90aHJlYWRzX2RlaW5pdChteV9vYmopOwogICAgfQogICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbXV0ZXgpOwp9CgoKc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX29wc19jaF9hY3F1aXJlKG1tX2NhbWVyYV90ICogY2FtZXJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUpCnsKICAgIGludDMyX3QgcmMgPSAtTU1fQ0FNRVJBX0VfR0VORVJBTDsKICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CiAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfbXV0ZXgpOwogICAgbXlfb2JqID0gZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYS0+Y2FtZXJhX2luZm8uY2FtZXJhX2lkXTsKICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX211dGV4KTsKICAgIGlmKG15X29iaikgewogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5tdXRleCk7CiAgICAgICAgcmMgPSBtbV9jYW1lcmFfY2hfYWNxdWlyZShteV9vYmosIGNoX3R5cGUpOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPm11dGV4KTsKICAgIH0KICAgIHJldHVybiByYzsKCn0Kc3RhdGljIHZvaWQgbW1fY2FtZXJhX29wc19jaF9yZWxlYXNlKG1tX2NhbWVyYV90ICogY2FtZXJhLCBtbV9jYW1lcmFfY2hhbm5lbF90eXBlX3QgY2hfdHlwZSkKewogICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19tdXRleCk7CiAgICBteV9vYmogPSBnX2NhbV9jdHJsLmNhbV9vYmpbY2FtZXJhLT5jYW1lcmFfaW5mby5jYW1lcmFfaWRdOwogICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbXV0ZXgpOwogICAgaWYobXlfb2JqKSB7CiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPm11dGV4KTsKICAgICAgICBtbV9jYW1lcmFfY2hfcmVsZWFzZShteV9vYmosIGNoX3R5cGUpOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPm11dGV4KTsKICAgIH0KfQoKc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX29wc19jaF9hdHRyKG1tX2NhbWVyYV90ICogY2FtZXJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QgKmF0dHIpCnsKICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CiAgICBpbnQzMl90IHJjID0gLU1NX0NBTUVSQV9FX0dFTkVSQUw7CiAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfbXV0ZXgpOwogICAgbXlfb2JqID0gZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYS0+Y2FtZXJhX2luZm8uY2FtZXJhX2lkXTsKICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX211dGV4KTsKICAgIGlmKG15X29iaikgewogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5tdXRleCk7CiAgICAgICAgcmMgPSBtbV9jYW1lcmFfY2hfZm4obXlfb2JqLCBjaF90eXBlLCBNTV9DQU1FUkFfU1RBVEVfRVZUX0FUVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWF0dHIpOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPm11dGV4KTsKICAgIH0KICAgIHJldHVybiByYzsKfQoKc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX29wc19zZW5kbXNnKG1tX2NhbWVyYV90ICogY2FtZXJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZGZkKQp7CiAgICBpbnQzMl90IHJjID0gLU1NX0NBTUVSQV9FX0dFTkVSQUw7CiAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOwogICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX211dGV4KTsKICAgIG15X29iaiA9IGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmEtPmNhbWVyYV9pbmZvLmNhbWVyYV9pZF07CiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdXRleCk7CiAgICBpZihteV9vYmopIHsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+bXV0ZXgpOwogICAgICAgIHJjID0gbW1fY2FtZXJhX3NlbmRtc2cobXlfb2JqLCBtc2csIGJ1Zl9zaXplLCBzZW5kZmQpOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPm11dGV4KTsKICAgIH0KICAgIHJldHVybiByYzsKfQoKc3RhdGljIG1tX2NhbWVyYV9vcHNfdCBtbV9jYW1lcmFfb3BzID0gewogIC5pc19vcF9zdXBwb3J0ZWQgPSBtbV9jYW1lcmFfb3BzX2lzX29wX3N1cHBvcnRlZCwKICAgIC5hY3Rpb24gPSBtbV9jYW1lcmFfb3BzX2FjdGlvbiwKICAgIC5vcGVuID0gbW1fY2FtZXJhX29wc19vcGVuLAogICAgLmNsb3NlID0gbW1fY2FtZXJhX29wc19jbG9zZSwKICAgIC5zdG9wID0gbW1fY2FtZXJhX29wc19zdG9wLAogICAgLmNoX2FjcXVpcmUgPSBtbV9jYW1lcmFfb3BzX2NoX2FjcXVpcmUsCiAgICAuY2hfcmVsZWFzZSA9IG1tX2NhbWVyYV9vcHNfY2hfcmVsZWFzZSwKICAgIC5jaF9zZXRfYXR0ciA9IG1tX2NhbWVyYV9vcHNfY2hfYXR0ciwKICAgIC5zZW5kbXNnID0gbW1fY2FtZXJhX29wc19zZW5kbXNnCn07CgpzdGF0aWMgdWludDhfdCBtbV9jYW1lcmFfbm90aWZ5X2lzX2V2ZW50X3N1cHBvcnRlZChtbV9jYW1lcmFfdCAqIGNhbWVyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfZXZlbnRfdHlwZV90IGV2dF90eXBlKQp7CiAgc3dpdGNoKGV2dF90eXBlKSB7CiAgY2FzZSBNTV9DQU1FUkFfRVZUX1RZUEVfQ0g6CiAgY2FzZSBNTV9DQU1FUkFfRVZUX1RZUEVfQ1RSTDoKICBjYXNlIE1NX0NBTUVSQV9FVlRfVFlQRV9TVEFUUzoKICBjYXNlIE1NX0NBTUVSQV9FVlRfVFlQRV9JTkZPOgogICAgcmV0dXJuIDE7CiAgZGVmYXVsdDoKICAgIHJldHVybiAwOwogIH0KICByZXR1cm4gMDsKfQoKc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX25vdGlmeV9yZWdpc3Rlcl9ldmVudF9jYihtbV9jYW1lcmFfdCAqIGNhbWVyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfZXZlbnRfbm90aWZ5X3QgZXZ0X2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcl9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9ldmVudF90eXBlX3QgZXZ0X3R5cGUpCnsKICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOwogIG1tX2NhbWVyYV9idWZfY2JfdCByZWcgOwogIGludCByYyA9IC0xOwoKICBwdGhyZWFkX211dGV4X2xvY2soJmdfbXV0ZXgpOwogIG15X29iaiA9IGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmEtPmNhbWVyYV9pbmZvLmNhbWVyYV9pZF07CiAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbXV0ZXgpOwogIGlmKG15X29iaikgewogICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+bXV0ZXgpOwogICAgICByYyA9IG1tX2NhbWVyYV9yZWdfZXZlbnQobXlfb2JqLCBldnRfY2IsIHVzZXJfZGF0YSwgZXZ0X3R5cGUpOwogICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5tdXRleCk7CiAgfQogIHJldHVybiByYzsKfQoKc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX3JlZ2lzdGVyX2J1Zl9ub3RpZnkgKAogICAgICAgICAgbW1fY2FtZXJhX3QgKiBjYW1lcmEsCiAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90eXBlX3QgY2hfdHlwZSwKICAgICAgICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3QgIGJ1Zl9jYiwKICAgICAgICAgIG1tX2NhbWVyYV9yZWdpc3Rlcl9idWZfY2JfdHlwZV90IGNiX3R5cGUsCiAgICAgICAgICB1aW50MzJfdCBjYl9jb3VudCwKICAgICAgICAgIHZvaWQgKiB1c2VyX2RhdGEpCnsKICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CiAgICBtbV9jYW1lcmFfYnVmX2NiX3QgcmVnIDsKICAgIGludCByYyA9IC0xOwoKICAgIHJlZy5jYiA9IGJ1Zl9jYjsKICAgIHJlZy51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CiAgICByZWcuY2JfdHlwZT1jYl90eXBlOwogICAgcmVnLmNiX2NvdW50PWNiX2NvdW50OwogICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX211dGV4KTsKICAgIG15X29iaiA9IGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmEtPmNhbWVyYV9pbmZvLmNhbWVyYV9pZF07CiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tdXRleCk7CiAgICBpZihteV9vYmopIHsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+bXV0ZXgpOwogICAgICAgIHJjID0gbW1fY2FtZXJhX2NoX2ZuKG15X29iaixjaF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX1NUQVRFX0VWVF9SRUdfQlVGX0NCLCAodm9pZCAqKSZyZWcpOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPm11dGV4KTsKICAgIH0KICAgIHJldHVybiByYzsKfQpzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfYnVmX2RvbmUobW1fY2FtZXJhX3QgKiBjYW1lcmEsIG1tX2NhbWVyYV9jaF9kYXRhX2J1Zl90ICogYnVmcykKewogICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKICAgIGludCByYyA9IC0xOwogICAgbXlfb2JqID0gZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYS0+Y2FtZXJhX2luZm8uY2FtZXJhX2lkXTsKICAgIGlmKG15X29iaikgewogICAgICAgIC8qcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPm11dGV4KTsqLwogICAgICAgIHJjID0gbW1fY2FtZXJhX2NoX2ZuKG15X29iaiwgYnVmcy0+dHlwZSwKICAgICAgICAgICAgICAgICBNTV9DQU1FUkFfU1RBVEVfRVZUX1FCVUYsICAgKHZvaWQgKilidWZzKTsKICAgICAgICAvKnB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPm11dGV4KTsqLwogICAgfQogICAgcmV0dXJuIHJjOwp9CgpzdGF0aWMgbW1fY2FtZXJhX25vdGlmeV90IG1tX2NhbWVyYV9ub3RpZnkgPSB7CiAgICAuaXNfZXZlbnRfc3VwcG9ydGVkID0gbW1fY2FtZXJhX25vdGlmeV9pc19ldmVudF9zdXBwb3J0ZWQsCiAgICAucmVnaXN0ZXJfZXZlbnRfbm90aWZ5ID0gbW1fY2FtZXJhX25vdGlmeV9yZWdpc3Rlcl9ldmVudF9jYiwKICAgIC5yZWdpc3Rlcl9idWZfbm90aWZ5ID0gbW1fY2FtZXJhX3JlZ2lzdGVyX2J1Zl9ub3RpZnksCiAgICAuYnVmX2RvbmUgPSBtbV9jYW1lcmFfYnVmX2RvbmUKfTsKCnN0YXRpYyB1aW50OF90IG1tX2NhbWVyYV9qcGVnX2lzX2pwZWdfc3VwcG9ydGVkIChtbV9jYW1lcmFfdCAqIGNhbWVyYSkKewogICAgcmV0dXJuIEZBTFNFOwp9CnN0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9qcGVnX3NldF9wYXJtIChtbV9jYW1lcmFfdCAqIGNhbWVyYSwKICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfanBlZ19wYXJtX3R5cGVfdCBwYXJtX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgdm9pZCogcF92YWx1ZSkKewogICAgcmV0dXJuIC0xOwp9CnN0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9qcGVnX2dldF9wYXJtIChtbV9jYW1lcmFfdCAqIGNhbWVyYSwKICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfanBlZ19wYXJtX3R5cGVfdCBwYXJtX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgdm9pZCogcF92YWx1ZSkKewogICAgcmV0dXJuIC0xOwp9CnN0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9qcGVnX3JlZ2lzdGVyX2V2ZW50X2NiKG1tX2NhbWVyYV90ICogY2FtZXJhLAogICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9qcGVnX2NiX3QgKiBldnRfY2IsCiAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHVzZXJfZGF0YSkKewogICAgcmV0dXJuIC0xOwp9CnN0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9qcGVnX2VuY29kZSAobW1fY2FtZXJhX3QgKiBjYW1lcmEsIHVpbnQ4X3Qgc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2pwZWdfZW5jb2RlX3QgKmRhdGEpCnsKICAgIHJldHVybiAtMTsKfQoKc3RhdGljIG1tX2NhbWVyYV9qcGVnX3QgbW1fY2FtZXJhX2pwZWcgPSAgewogICAgLmlzX2pwZWdfc3VwcG9ydGVkID0gbW1fY2FtZXJhX2pwZWdfaXNfanBlZ19zdXBwb3J0ZWQsCiAgICAuc2V0X3Bhcm0gPSBtbV9jYW1lcmFfanBlZ19zZXRfcGFybSwKICAgIC5nZXRfcGFybSA9IG1tX2NhbWVyYV9qcGVnX2dldF9wYXJtLAogICAgLnJlZ2lzdGVyX2V2ZW50X2NiID0gbW1fY2FtZXJhX2pwZWdfcmVnaXN0ZXJfZXZlbnRfY2IsCiAgICAuZW5jb2RlID0gbW1fY2FtZXJhX2pwZWdfZW5jb2RlLAp9OwoKZXh0ZXJuIG1tX2NhbWVyYV90ICogbW1fY2FtZXJhX3F1ZXJ5ICh1aW50OF90ICpudW1fY2FtZXJhcykKewogICAgaW50IGkgPSAwLCByYyA9IE1NX0NBTUVSQV9PSzsKICAgIGludCBkZXZfZmQgPSAwOwogICAgc3RydWN0IG1lZGlhX2RldmljZV9pbmZvIG1kZXZfaW5mbzsKICAgIGludCBudW1fbWVkaWFfZGV2aWNlcyA9IDA7CiAgICBpZiAoIW51bV9jYW1lcmFzKQogICAgICByZXR1cm4gTlVMTDsKICAgIC8qIGxvY2sgdGhlIG11dGV4ICovCiAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfbXV0ZXgpOwogICAgKm51bV9jYW1lcmFzID0gMDsKICAgIHdoaWxlICgxKSB7CiAgICAgIGNoYXIgZGV2X25hbWVbMzJdOwogICAgICBzbnByaW50ZihkZXZfbmFtZSwgc2l6ZW9mKGRldl9uYW1lKSwgIi9kZXYvbWVkaWElZCIsIG51bV9tZWRpYV9kZXZpY2VzKTsKICAgICAgZGV2X2ZkID0gb3BlbihkZXZfbmFtZSwgT19SRFdSIHwgT19OT05CTE9DSyk7CiAgICAgIGlmIChkZXZfZmQgPCAwKSB7CiAgICAgICAgQ0RCRygiRG9uZSBkaXNjb3ZlcmluZyBtZWRpYSBkZXZpY2VzXG4iKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBudW1fbWVkaWFfZGV2aWNlcysrOwogICAgICByYyA9IGlvY3RsKGRldl9mZCwgTUVESUFfSU9DX0RFVklDRV9JTkZPLCAmbWRldl9pbmZvKTsKICAgICAgaWYgKHJjIDwgMCkgewogICAgICAgIENEQkdfRVJST1IoIkVycm9yOiBpb2N0bCBtZWRpYV9kZXYgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICBjbG9zZShkZXZfZmQpOwogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICBpZihzdHJuY21wKG1kZXZfaW5mby5tb2RlbCwgUUNBTUVSQV9OQU1FLCBzaXplb2YobWRldl9pbmZvLm1vZGVsKSAhPSAwKSkgewogICAgICAgIGNsb3NlKGRldl9mZCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIGNoYXIgKiBtZGV2X2NmZzsKICAgICAgaW50IGNhbV90eXBlID0gMCwgbW91bnRfYW5nbGUgPSAwLCBpbmZvX2luZGV4ID0gMDsKICAgICAgbWRldl9jZmcgPSBzdHJ0b2sobWRldl9pbmZvLnNlcmlhbCwgIi0iKTsKICAgICAgd2hpbGUobWRldl9jZmcgIT0gTlVMTCkgewogICAgICAgICAgaWYoaW5mb19pbmRleCA9PSAwKSB7CiAgICAgICAgICAgICAgaWYoc3RyY21wKG1kZXZfY2ZnLCBRQ0FNRVJBX05BTUUpKQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0gZWxzZSBpZihpbmZvX2luZGV4ID09IDEpIHsKICAgICAgICAgICAgICBtb3VudF9hbmdsZSA9IGF0b2kobWRldl9jZmcpOwogICAgICAgICAgfSBlbHNlIGlmKGluZm9faW5kZXggPT0gMikgewogICAgICAgICAgICAgIGNhbV90eXBlID0gYXRvaShtZGV2X2NmZyk7CiAgICAgICAgICB9CiAgICAgICAgICBtZGV2X2NmZyA9IHN0cnRvayhOVUxMLCAiLSIpOwogICAgICAgICAgaW5mb19pbmRleCsrOwogICAgICB9CgogICAgICBpZihpbmZvX2luZGV4ID09IDApIHsKICAgICAgICAgIGNsb3NlKGRldl9mZCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgaW50IG51bV9lbnRpdGllcyA9IDE7CiAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgc3RydWN0IG1lZGlhX2VudGl0eV9kZXNjIGVudGl0eTsKICAgICAgICBtZW1zZXQoJmVudGl0eSwgMCwgc2l6ZW9mKGVudGl0eSkpOwogICAgICAgIGVudGl0eS5pZCA9IG51bV9lbnRpdGllcysrOwogICAgICAgIHJjID0gaW9jdGwoZGV2X2ZkLCBNRURJQV9JT0NfRU5VTV9FTlRJVElFUywgJmVudGl0eSk7CiAgICAgICAgaWYgKHJjIDwgMCkgewogICAgICAgICAgICBDREJHKCJEb25lIGVudW1lcmF0aW5nIG1lZGlhIGVudGl0aWVzXG4iKTsKICAgICAgICAgICAgcmMgPSAwOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYoZW50aXR5LnR5cGUgPT0gTUVESUFfRU5UX1RfREVWTk9ERV9WNEwgJiYgZW50aXR5Lmdyb3VwX2lkID09IFFDQU1FUkFfVk5PREVfR1JPVVBfSUQpIHsKICAgICAgICAgICAgIHN0cm5jcHkoZ19jYW1fY3RybC5jYW1lcmFbKm51bV9jYW1lcmFzXS52aWRlb19kZXZfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgZW50aXR5Lm5hbWUsIHNpemVvZihlbnRpdHkubmFtZSkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CgogICAgICBnX2NhbV9jdHJsLmNhbWVyYVsqbnVtX2NhbWVyYXNdLmNhbWVyYV9pbmZvLmNhbWVyYV9pZCA9ICpudW1fY2FtZXJhczsKCiAgICAgIGdfY2FtX2N0cmwuY2FtZXJhWypudW1fY2FtZXJhc10uCiAgICAgICAgICBjYW1lcmFfaW5mby5tb2Rlc19zdXBwb3J0ZWQgPSBDQU1FUkFfTU9ERV8yRDsKICAgICAgaWYoY2FtX3R5cGUgPiAxKQogICAgICAgIGdfY2FtX2N0cmwuY2FtZXJhWypudW1fY2FtZXJhc10uCiAgICAgICAgICBjYW1lcmFfaW5mby5tb2Rlc19zdXBwb3J0ZWQgfD0gQ0FNRVJBX01PREVfM0Q7CgogICAgICBnX2NhbV9jdHJsLmNhbWVyYVsqbnVtX2NhbWVyYXNdLmNhbWVyYV9pbmZvLnBvc2l0aW9uID0KICAgICAgICAoY2FtX3R5cGUgPT0gMSkgPyBGUk9OVF9DQU1FUkEgOiBCQUNLX0NBTUVSQTsKICAgICAgZ19jYW1fY3RybC5jYW1lcmFbKm51bV9jYW1lcmFzXS5jYW1lcmFfaW5mby5zZW5zb3JfbW91bnRfYW5nbGUgPQogICAgICAgICAgbW91bnRfYW5nbGU7CiAgICAgIGdfY2FtX2N0cmwuY2FtZXJhWypudW1fY2FtZXJhc10uc2Vuc29yX3R5cGUgPSAwOwogICAgICBnX2NhbV9jdHJsLmNhbWVyYVsqbnVtX2NhbWVyYXNdLmNmZyA9ICZtbV9jYW1lcmFfY2ZnOwogICAgICBnX2NhbV9jdHJsLmNhbWVyYVsqbnVtX2NhbWVyYXNdLm9wcyA9ICZtbV9jYW1lcmFfb3BzOwogICAgICBnX2NhbV9jdHJsLmNhbWVyYVsqbnVtX2NhbWVyYXNdLmV2dCA9ICZtbV9jYW1lcmFfbm90aWZ5OwogICAgICBnX2NhbV9jdHJsLmNhbWVyYVsqbnVtX2NhbWVyYXNdLmpwZWdfb3BzID0gTlVMTDsKCiAgICAgIENEQkcoIiVzOiBkZXZfaW5mb1tpZD0lZCxuYW1lPSclcycscG9zPSVkLG1vZGVzPTB4JXgsc2Vuc29yPSVkXVxuIiwKICAgICAgICBfX2Z1bmNfXywgKm51bV9jYW1lcmFzLAogICAgICAgIGdfY2FtX2N0cmwuY2FtZXJhWypudW1fY2FtZXJhc10udmlkZW9fZGV2X25hbWUsCiAgICAgICAgZ19jYW1fY3RybC5jYW1lcmFbKm51bV9jYW1lcmFzXS5jYW1lcmFfaW5mby5wb3NpdGlvbiwKICAgICAgICBnX2NhbV9jdHJsLmNhbWVyYVsqbnVtX2NhbWVyYXNdLmNhbWVyYV9pbmZvLm1vZGVzX3N1cHBvcnRlZCwKICAgICAgICBnX2NhbV9jdHJsLmNhbWVyYVsqbnVtX2NhbWVyYXNdLnNlbnNvcl90eXBlKTsKCiAgICAgICpudW1fY2FtZXJhcys9MTsKICAgICAgaWYgKGRldl9mZCA+IDApIHsKICAgICAgICAgIGNsb3NlKGRldl9mZCk7CiAgICAgIH0KICAgIH0KICAgICpudW1fY2FtZXJhcyA9ICpudW1fY2FtZXJhczsKICAgIGdfY2FtX2N0cmwubnVtX2NhbSA9ICpudW1fY2FtZXJhczsKZW5kOgogICAgLyogdW5sb2NrIHRoZSBtdXRleCAqLwogICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbXV0ZXgpOwogICAgQ0RCRygiJXM6IG51bV9jYW1lcmFzPSVkXG4iLCBfX2Z1bmNfXywgZ19jYW1fY3RybC5udW1fY2FtKTsKICAgIGlmKHJjID09IDApCiAgICAgICAgcmV0dXJuICZnX2NhbV9jdHJsLmNhbWVyYVswXTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gTlVMTDsKfQoKCnN0YXRpYyBtbV9jYW1lcmFfdCAqIGdldF9jYW1lcmFfYnlfaWQoIGludCBjYW1faWQpCnsKICBtbV9jYW1lcmFfdCAqIG1tX2NhbTsKICBpZiggY2FtX2lkIDwgMCB8fCBjYW1faWQgPj0gZ19jYW1fY3RybC5udW1fY2FtKSB7CiAgICAgbW1fY2FtID0gTlVMTDsKICB9IGVsc2UgewogICAgbW1fY2FtID0gJiBnX2NhbV9jdHJsLmNhbWVyYVtjYW1faWRdOwogIH0KICByZXR1cm4gbW1fY2FtOwp9CgovKmNvbmZpZ3VyZSBtZXRob2RzKi8KdWludDhfdCBjYW1fY29uZmlnX2lzX3Bhcm1fc3VwcG9ydGVkKAogIGludCBjYW1faWQsCiAgbW1fY2FtZXJhX3Bhcm1fdHlwZV90IHBhcm1fdHlwZSkKewogIHVpbnQ4X3QgcmMgPSAwOwogIG1tX2NhbWVyYV90ICogbW1fY2FtID0gZ2V0X2NhbWVyYV9ieV9pZChjYW1faWQpOwogIGlmIChtbV9jYW0gJiYgbW1fY2FtLT5jZmcpIHsKICAgIHJjID0gbW1fY2FtLT5jZmctPmlzX3Bhcm1fc3VwcG9ydGVkKG1tX2NhbSwgcGFybV90eXBlKTsKICB9CiAgcmV0dXJuIHJjOwp9Cgp1aW50OF90IGNhbV9jb25maWdfaXNfY2hfc3VwcG9ydGVkKAogIGludCBjYW1faWQsCiAgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUpCnsKICB1aW50OF90IHJjID0gMDsKICBtbV9jYW1lcmFfdCAqIG1tX2NhbSA9IGdldF9jYW1lcmFfYnlfaWQoY2FtX2lkKTsKICBpZiAobW1fY2FtKSB7CiAgICByYyA9IG1tX2NhbS0+Y2ZnLT5pc19jaF9zdXBwb3J0ZWQobW1fY2FtLCBjaF90eXBlKTsKICB9CiAgcmV0dXJuIHJjOwoKfQoKLyogc2V0IGEgcGFybZJzIGN1cnJlbnQgdmFsdWUgKi8KaW50MzJfdCBjYW1fY29uZmlnX3NldF9wYXJtKAogIGludCBjYW1faWQsCiAgbW1fY2FtZXJhX3Bhcm1fdHlwZV90IHBhcm1fdHlwZSwKICB2b2lkKiBwX3ZhbHVlKQp7CiAgaW50MzJfdCByYyA9IC0xOwogIG1tX2NhbWVyYV90ICogbW1fY2FtID0gZ2V0X2NhbWVyYV9ieV9pZChjYW1faWQpOwogIGlmIChtbV9jYW0pIHsKICAgIHJjID0gbW1fY2FtLT5jZmctPnNldF9wYXJtKG1tX2NhbSwgcGFybV90eXBlLCBwX3ZhbHVlKTsKICB9CiAgcmV0dXJuIHJjOwp9CgovKiBnZXQgYSBwYXJtknMgY3VycmVudCB2YWx1ZSAqLwppbnQzMl90IGNhbV9jb25maWdfZ2V0X3Bhcm0oCiAgaW50IGNhbV9pZCwKICBtbV9jYW1lcmFfcGFybV90eXBlX3QgcGFybV90eXBlLAogIHZvaWQqIHBfdmFsdWUpCnsKICBpbnQzMl90IHJjID0gLTE7CiAgbW1fY2FtZXJhX3QgKiBtbV9jYW0gPSBnZXRfY2FtZXJhX2J5X2lkKGNhbV9pZCk7CiAgaWYgKG1tX2NhbSkgewogICAgcmMgPSBtbV9jYW0tPmNmZy0+Z2V0X3Bhcm0obW1fY2FtLCBwYXJtX3R5cGUsIHBfdmFsdWUpOwogIH0KICByZXR1cm4gcmM7Cn0KCmludDMyX3QgY2FtX2NvbmZpZ19yZXF1ZXN0X2J1ZihpbnQgY2FtX2lkLCBtbV9jYW1lcmFfcmVnX2J1Zl90ICpidWYpCnsKCiAgaW50MzJfdCByYyA9IC0xOwogIG1tX2NhbWVyYV90ICogbW1fY2FtID0gZ2V0X2NhbWVyYV9ieV9pZChjYW1faWQpOwogIGlmIChtbV9jYW0pIHsKICAgIHJjID0gbW1fY2FtLT5jZmctPnJlcXVlc3RfYnVmKG1tX2NhbSwgYnVmKTsKICB9CiAgcmV0dXJuIHJjOwp9CgppbnQzMl90IGNhbV9jb25maWdfZW5xdWV1ZV9idWYoaW50IGNhbV9pZCwgbW1fY2FtZXJhX3JlZ19idWZfdCAqYnVmKQp7CgogIGludDMyX3QgcmMgPSAtMTsKICBtbV9jYW1lcmFfdCAqIG1tX2NhbSA9IGdldF9jYW1lcmFfYnlfaWQoY2FtX2lkKTsKICBpZiAobW1fY2FtKSB7CiAgICByYyA9IG1tX2NhbS0+Y2ZnLT5lbnF1ZXVlX2J1ZihtbV9jYW0sIGJ1Zik7CiAgfQogIHJldHVybiByYzsKfQoKaW50MzJfdCBjYW1fY29uZmlnX3ByZXBhcmVfYnVmKGludCBjYW1faWQsIG1tX2NhbWVyYV9yZWdfYnVmX3QgKmJ1ZikKewoKICBpbnQzMl90IHJjID0gLTE7CiAgbW1fY2FtZXJhX3QgKiBtbV9jYW0gPSBnZXRfY2FtZXJhX2J5X2lkKGNhbV9pZCk7CiAgaWYgKG1tX2NhbSkgewogICAgcmMgPSBtbV9jYW0tPmNmZy0+cHJlcGFyZV9idWYobW1fY2FtLCBidWYpOwogIH0KICByZXR1cm4gcmM7Cn0KaW50MzJfdCBjYW1fY29uZmlnX3VucHJlcGFyZV9idWYoaW50IGNhbV9pZCwgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUpCnsKICBpbnQzMl90IHJjID0gLTE7CiAgbW1fY2FtZXJhX3QgKiBtbV9jYW0gPSBnZXRfY2FtZXJhX2J5X2lkKGNhbV9pZCk7CiAgaWYgKG1tX2NhbSkgewogICAgcmMgPSBtbV9jYW0tPmNmZy0+dW5wcmVwYXJlX2J1ZihtbV9jYW0sIGNoX3R5cGUpOwogIH0KICByZXR1cm4gcmM7Cn0KCi8qb3BlcmF0aW9uIG1ldGhvZHMqLwp1aW50OF90IGNhbV9vcHNfaXNfb3Bfc3VwcG9ydGVkKGludCBjYW1faWQsIG1tX2NhbWVyYV9vcHNfdHlwZV90IG9wY29kZSkKewogIHVpbnQ4X3QgcmMgPSAwOwogIG1tX2NhbWVyYV90ICogbW1fY2FtID0gZ2V0X2NhbWVyYV9ieV9pZChjYW1faWQpOwogIGlmIChtbV9jYW0pIHsKICAgIHJjID0gbW1fY2FtLT5vcHMtPmlzX29wX3N1cHBvcnRlZChtbV9jYW0sIG9wY29kZSk7CiAgfQogIHJldHVybiByYzsKfQovKiB2YWwgaXMgcmVzZXJ2ZWQgZm9yIHNvbWUgYWN0aW9uIHN1Y2ggYXMgTU1fQ0FNRVJBX09QU19GT0NVUyAqLwppbnQzMl90IGNhbV9vcHNfYWN0aW9uKGludCBjYW1faWQsIHVpbnQ4X3Qgc3RhcnQsCiAgbW1fY2FtZXJhX29wc190eXBlX3Qgb3Bjb2RlLCB2b2lkICp2YWwpCnsKICBpbnQzMl90IHJjID0gLTE7CiAgbW1fY2FtZXJhX3QgKiBtbV9jYW0gPSBnZXRfY2FtZXJhX2J5X2lkKGNhbV9pZCk7CiAgaWYgKG1tX2NhbSkgewogICAgcmMgPSBtbV9jYW0tPm9wcy0+YWN0aW9uKG1tX2NhbSwgc3RhcnQsIG9wY29kZSwgdmFsKTsKICB9CiAgcmV0dXJuIHJjOwp9CgppbnQzMl90IGNhbV9vcHNfb3BlbihpbnQgY2FtX2lkLCBtbV9jYW1lcmFfb3BfbW9kZV90eXBlX3Qgb3BfbW9kZSkKewogIGludDMyX3QgcmMgPSAtMTsKICBtbV9jYW1lcmFfdCAqIG1tX2NhbSA9IGdldF9jYW1lcmFfYnlfaWQoY2FtX2lkKTsKICBpZiAobW1fY2FtKSB7CiAgICByYyA9IG1tX2NhbS0+b3BzLT5vcGVuKG1tX2NhbSwgb3BfbW9kZSk7CiAgfQogIHJldHVybiByYzsKfQoKdm9pZCBjYW1fb3BzX2Nsb3NlKGludCBjYW1faWQpCnsKICBtbV9jYW1lcmFfdCAqIG1tX2NhbSA9IGdldF9jYW1lcmFfYnlfaWQoY2FtX2lkKTsKICBpZiAobW1fY2FtKSB7CiAgICBtbV9jYW0tPm9wcy0+Y2xvc2UobW1fY2FtKTsKICB9Cn0KCnZvaWQgY2FtX29wc19zdG9wKGludCBjYW1faWQpCnsKICBtbV9jYW1lcmFfdCAqIG1tX2NhbSA9IGdldF9jYW1lcmFfYnlfaWQoY2FtX2lkKTsKICBpZiAobW1fY2FtKSB7CiAgICBtbV9jYW0tPm9wcy0+c3RvcChtbV9jYW0pOwogIH0KfQoKaW50MzJfdCBjYW1fb3BzX2NoX2FjcXVpcmUoaW50IGNhbV9pZCwgbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90IGNoX3R5cGUpCnsKICBpbnQzMl90IHJjID0gLTE7CiAgbW1fY2FtZXJhX3QgKiBtbV9jYW0gPSBnZXRfY2FtZXJhX2J5X2lkKGNhbV9pZCk7CiAgaWYgKG1tX2NhbSkgewogICAgcmMgPSBtbV9jYW0tPm9wcy0+Y2hfYWNxdWlyZShtbV9jYW0sIGNoX3R5cGUpOwogIH0KICByZXR1cm4gcmM7Cn0KCnZvaWQgY2FtX29wc19jaF9yZWxlYXNlKGludCBjYW1faWQsIG1tX2NhbWVyYV9jaGFubmVsX3R5cGVfdCBjaF90eXBlKQp7CiAgbW1fY2FtZXJhX3QgKiBtbV9jYW0gPSBnZXRfY2FtZXJhX2J5X2lkKGNhbV9pZCk7CiAgaWYgKG1tX2NhbSkgewogICAgbW1fY2FtLT5vcHMtPmNoX3JlbGVhc2UobW1fY2FtLCBjaF90eXBlKTsKICB9Cn0KCmludDMyX3QgY2FtX29wc19jaF9zZXRfYXR0cihpbnQgY2FtX2lkLCBtbV9jYW1lcmFfY2hhbm5lbF90eXBlX3QgY2hfdHlwZSwKICBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QgKmF0dHIpCnsKICBpbnQzMl90IHJjID0gLTE7CiAgbW1fY2FtZXJhX3QgKiBtbV9jYW0gPSBnZXRfY2FtZXJhX2J5X2lkKGNhbV9pZCk7CiAgaWYgKG1tX2NhbSkgewogICAgcmMgPSBtbV9jYW0tPm9wcy0+Y2hfc2V0X2F0dHIobW1fY2FtLCBjaF90eXBlLCBhdHRyKTsKICB9CiAgcmV0dXJuIHJjOwp9CgppbnQzMl90IGNhbV9vcHNfc2VuZG1zZyhpbnQgY2FtX2lkLCB2b2lkICptc2csIHVpbnQzMl90IGJ1Zl9zaXplLCBpbnQgc2VuZGZkKQp7CiAgICBpbnQzMl90IHJjID0gLTE7CiAgICBtbV9jYW1lcmFfdCAqIG1tX2NhbSA9IGdldF9jYW1lcmFfYnlfaWQoY2FtX2lkKTsKICAgIGlmIChtbV9jYW0pIHsKICAgICAgcmMgPSBtbV9jYW0tPm9wcy0+c2VuZG1zZyhtbV9jYW0sIG1zZywgYnVmX3NpemUsIHNlbmRmZCk7CiAgICB9CiAgICByZXR1cm4gcmM7Cn0KCi8qY2FsbC1iYWNrIG5vdGlmeSBtZXRob2RzKi8KdWludDhfdCBjYW1fZXZ0X2lzX2V2ZW50X3N1cHBvcnRlZChpbnQgY2FtX2lkLCBtbV9jYW1lcmFfZXZlbnRfdHlwZV90IGV2dF90eXBlKQp7CiAgdWludDhfdCByYyA9IDA7CiAgbW1fY2FtZXJhX3QgKiBtbV9jYW0gPSBnZXRfY2FtZXJhX2J5X2lkKGNhbV9pZCk7CiAgaWYgKG1tX2NhbSkgewogICAgcmMgPSBtbV9jYW0tPmV2dC0+aXNfZXZlbnRfc3VwcG9ydGVkKG1tX2NhbSwgZXZ0X3R5cGUpOwogIH0KICByZXR1cm4gcmM7Cn0KCmludDMyX3QgY2FtX2V2dF9yZWdpc3Rlcl9ldmVudF9ub3RpZnkoaW50IGNhbV9pZCwKICBtbV9jYW1lcmFfZXZlbnRfbm90aWZ5X3QgZXZ0X2NiLAogIHZvaWQgKiB1c2VyX2RhdGEsCiAgbW1fY2FtZXJhX2V2ZW50X3R5cGVfdCBldnRfdHlwZSkKewogIGludDMyX3QgcmMgPSAtMTsKICBtbV9jYW1lcmFfdCAqIG1tX2NhbSA9IGdldF9jYW1lcmFfYnlfaWQoY2FtX2lkKTsKICBpZiAobW1fY2FtKSB7CiAgICByYyA9IG1tX2NhbS0+ZXZ0LT5yZWdpc3Rlcl9ldmVudF9ub3RpZnkoCiAgICAgIG1tX2NhbSwgZXZ0X2NiLCB1c2VyX2RhdGEsIGV2dF90eXBlKTsKICB9CiAgcmV0dXJuIHJjOwp9CgppbnQzMl90IGNhbV9ldnRfcmVnaXN0ZXJfYnVmX25vdGlmeShpbnQgY2FtX2lkLAogIG1tX2NhbWVyYV9jaGFubmVsX3R5cGVfdCBjaF90eXBlLAogIG1tX2NhbWVyYV9idWZfbm90aWZ5X3QgYnVmX2NiLAogIG1tX2NhbWVyYV9yZWdpc3Rlcl9idWZfY2JfdHlwZV90IGNiX3R5cGUsCiAgdWludDMyX3QgY2JfY291bnQsCiAgdm9pZCAqIHVzZXJfZGF0YSkKewogIGludDMyX3QgcmMgPSAtMTsKICBtbV9jYW1lcmFfdCAqIG1tX2NhbSA9IGdldF9jYW1lcmFfYnlfaWQoY2FtX2lkKTsKICBpZiAobW1fY2FtKSB7CiAgICByYyA9IG1tX2NhbS0+ZXZ0LT5yZWdpc3Rlcl9idWZfbm90aWZ5KAogICAgICBtbV9jYW0sIGNoX3R5cGUsIGJ1Zl9jYiwgY2JfdHlwZSwKICAgICAgY2JfY291bnQsIHVzZXJfZGF0YSk7CiAgfQogIHJldHVybiByYzsKfQoKaW50MzJfdCBjYW1fZXZ0X2J1Zl9kb25lKGludCBjYW1faWQsIG1tX2NhbWVyYV9jaF9kYXRhX2J1Zl90ICpidWZzKQp7CiAgaW50MzJfdCByYyA9IC0xOwogIG1tX2NhbWVyYV90ICogbW1fY2FtID0gZ2V0X2NhbWVyYV9ieV9pZChjYW1faWQpOwogIGlmIChtbV9jYW0pIHsKICAgIHJjID0gbW1fY2FtLT5ldnQtPmJ1Zl9kb25lKG1tX2NhbSwgYnVmcyk7CiAgfQogIHJldHVybiByYzsKfQoKLypjYW1lcmEgSlBFRyBtZXRob2RzKi8KdWludDhfdCBjYW1fanBlZ19pc19qcGVnX3N1cHBvcnRlZChpbnQgY2FtX2lkKQp7CiAgdWludDhfdCByYyA9IDA7CiAgbW1fY2FtZXJhX3QgKiBtbV9jYW0gPSBnZXRfY2FtZXJhX2J5X2lkKGNhbV9pZCk7CiAgaWYgKG1tX2NhbSkgewogICAgcmMgPSBtbV9jYW0tPmpwZWdfb3BzLT5pc19qcGVnX3N1cHBvcnRlZChtbV9jYW0pOwogIH0KICByZXR1cm4gcmM7Cn0KCmludDMyX3QgY2FtX2pwZWdfc2V0X3Bhcm0oaW50IGNhbV9pZCwgbW1fY2FtZXJhX2pwZWdfcGFybV90eXBlX3QgcGFybV90eXBlLAogIHZvaWQqIHBfdmFsdWUpCnsKICBpbnQzMl90IHJjID0gLTE7CiAgbW1fY2FtZXJhX3QgKiBtbV9jYW0gPSBnZXRfY2FtZXJhX2J5X2lkKGNhbV9pZCk7CiAgaWYgKG1tX2NhbSkgewogICAgcmMgPSBtbV9jYW0tPmpwZWdfb3BzLT5zZXRfcGFybShtbV9jYW0sIHBhcm1fdHlwZSwgcF92YWx1ZSk7CiAgfQogIHJldHVybiByYzsKfQoKaW50MzJfdCBjYW1fanBlZ19nZXRfcGFybShpbnQgY2FtX2lkLCBtbV9jYW1lcmFfanBlZ19wYXJtX3R5cGVfdCBwYXJtX3R5cGUsCiAgdm9pZCogcF92YWx1ZSkKewogIGludDMyX3QgcmMgPSAtMTsKICBtbV9jYW1lcmFfdCAqIG1tX2NhbSA9IGdldF9jYW1lcmFfYnlfaWQoY2FtX2lkKTsKICBpZiAobW1fY2FtKSB7CiAgICByYyA9IG1tX2NhbS0+anBlZ19vcHMtPmdldF9wYXJtKG1tX2NhbSwgcGFybV90eXBlLCBwX3ZhbHVlKTsKICB9CiAgcmV0dXJuIHJjOwp9CmludDMyX3QgY2FtX2pwZWdfcmVnaXN0ZXJfZXZlbnRfY2IoaW50IGNhbV9pZCwgbW1fY2FtZXJhX2pwZWdfY2JfdCAqIGV2dF9jYiwKICB2b2lkICogdXNlcl9kYXRhKQp7CiAgaW50MzJfdCByYyA9IC0xOwogIG1tX2NhbWVyYV90ICogbW1fY2FtID0gZ2V0X2NhbWVyYV9ieV9pZChjYW1faWQpOwogIGlmIChtbV9jYW0pIHsKICAgIHJjID0gbW1fY2FtLT5qcGVnX29wcy0+cmVnaXN0ZXJfZXZlbnRfY2IobW1fY2FtLCBldnRfY2IsIHVzZXJfZGF0YSk7CiAgfQogIHJldHVybiByYzsKfQppbnQzMl90IGNhbV9qcGVnX2VuY29kZShpbnQgY2FtX2lkLCB1aW50OF90IHN0YXJ0LAogIG1tX2NhbWVyYV9qcGVnX2VuY29kZV90ICpkYXRhKQp7CiAgaW50MzJfdCByYyA9IC0xOwogIG1tX2NhbWVyYV90ICogbW1fY2FtID0gZ2V0X2NhbWVyYV9ieV9pZChjYW1faWQpOwogIGlmIChtbV9jYW0pIHsKICAgIHJjID0gbW1fY2FtLT5qcGVnX29wcy0+ZW5jb2RlKG1tX2NhbSwgc3RhcnQsIGRhdGEpOwogIH0KICByZXR1cm4gcmM7Cn0KCg==