LyoKICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQuaAogKgogKiAgSW5mb3JtYXRpb24gc3RydWN0dXJlcyBmb3IgYm9hcmQtc3BlY2lmaWMgZGF0YQogKgogKiAgQ29weXJpZ2h0IChDKSAyMDA0CU5va2lhIENvcnBvcmF0aW9uCiAqICBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqLwoKI2lmbmRlZiBfT01BUF9CT0FSRF9ICiNkZWZpbmUgX09NQVBfQk9BUkRfSAoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KCi8qIERpZmZlcmVudCBwZXJpcGhlcmFsIGlkcyAqLwojZGVmaW5lIE9NQVBfVEFHX0NMT0NLCQkweDRmMDEKI2RlZmluZSBPTUFQX1RBR19NTUMJCTB4NGYwMgojZGVmaW5lIE9NQVBfVEFHX1NFUklBTF9DT05TT0xFIDB4NGYwMwojZGVmaW5lIE9NQVBfVEFHX1VTQgkJMHg0ZjA0CiNkZWZpbmUgT01BUF9UQUdfTENECQkweDRmMDUKI2RlZmluZSBPTUFQX1RBR19HUElPX1NXSVRDSAkweDRmMDYKI2RlZmluZSBPTUFQX1RBR19VQVJUCQkweDRmMDcKCiNkZWZpbmUgT01BUF9UQUdfQk9PVF9SRUFTT04gICAgMHg0ZjgwCiNkZWZpbmUgT01BUF9UQUdfRkxBU0hfUEFSVAkweDRmODEKCnN0cnVjdCBvbWFwX2Nsb2NrX2NvbmZpZyB7CgkvKiAwIGZvciAxMiBNSHosIDEgZm9yIDEzIE1IeiBhbmQgMiBmb3IgMTkuMiBNSHogKi8KCXU4IHN5c3RlbV9jbG9ja190eXBlOwp9OwoKc3RydWN0IG9tYXBfbW1jX2NvbmYgewoJdW5zaWduZWQgZW5hYmxlZDoxOwoJLyogbm9tdXggbWVhbnMgInN0YW5kYXJkIiBtdXhpbmcgaXMgd3Jvbmcgb24gdGhpcyBib2FyZCwgYW5kIHRoYXQKCSAqIGJvYXJkLXNwZWNpZmljIGNvZGUgaGFuZGxlZCBpdCBiZWZvcmUgY29tbW9uIGluaXQgbG9naWMuCgkgKi8KCXVuc2lnbmVkIG5vbXV4OjE7CgkvKiBzd2l0Y2ggcGluIGNhbiBiZSBmb3IgY2FyZCBkZXRlY3QgKGRlZmF1bHQpIG9yIGNhcmQgY292ZXIgKi8KCXVuc2lnbmVkIGNvdmVyOjE7CgkvKiA0IHdpcmUgc2lnbmFsaW5nIGlzIG9wdGlvbmFsLCBhbmQgaXMgb25seSB1c2VkIGZvciBTRC9TRElPICovCgl1bnNpZ25lZCB3aXJlNDoxOwoJczE2IHBvd2VyX3BpbjsKCXMxNiBzd2l0Y2hfcGluOwoJczE2IHdwX3BpbjsKfTsKCnN0cnVjdCBvbWFwX21tY19jb25maWcgewoJc3RydWN0IG9tYXBfbW1jX2NvbmYgbW1jWzJdOwp9OwoKc3RydWN0IG9tYXBfc2VyaWFsX2NvbnNvbGVfY29uZmlnIHsKCXU4IGNvbnNvbGVfdWFydDsKCXUzMiBjb25zb2xlX3NwZWVkOwp9OwoKc3RydWN0IG9tYXBfdXNiX2NvbmZpZyB7CgkvKiBDb25maWd1cmUgZHJpdmVycyBhY2NvcmRpbmcgdG8gdGhlIGNvbm5lY3RvcnMgb24geW91ciBib2FyZDoKCSAqICAtICJBIiBjb25uZWN0b3IgKHJlY3RhZ3VsYXIpCgkgKgkuLi4gZm9yIGhvc3QvT0hDSSB1c2UsIHNldCAicmVnaXN0ZXJfaG9zdCIuCgkgKiAgLSAiQiIgY29ubmVjdG9yIChzcXVhcmlzaCkgb3IgIk1pbmktQiIKCSAqCS4uLiBmb3IgZGV2aWNlL2dhZGdldCB1c2UsIHNldCAicmVnaXN0ZXJfZGV2Ii4KCSAqICAtICJNaW5pLUFCIiBjb25uZWN0b3IgKHZlcnkgc2ltaWxhciB0byBNaW5pLUIpCgkgKgkuLi4gZm9yIE9URyB1c2UgYXMgZGV2aWNlIE9SIGhvc3QsIGluaXRpYWxpemUgIm90ZyIKCSAqLwoJdW5zaWduZWQJcmVnaXN0ZXJfaG9zdDoxOwoJdW5zaWduZWQJcmVnaXN0ZXJfZGV2OjE7Cgl1OAkJb3RnOwkvKiBwb3J0IG51bWJlciwgMS1iYXNlZDogIHVzYjEgPT0gMiAqLwoKCXU4CQlobWNfbW9kZTsKCgkvKiBpbXBsaWNpdGx5IHRydWUgaWYgb3RnOiAgaG9zdCBzdXBwb3J0cyByZW1vdGUgd2FrZXVwPyAqLwoJdTgJCXJ3YzsKCgkvKiBzaWduYWxpbmcgcGlucyB1c2VkIHRvIHRhbGsgdG8gdHJhbnNjZWl2ZXIgb24gdXNiTjoKCSAqICAwID09IHVzYk4gdW51c2VkCgkgKiAgMiA9PSB1c2IwLW9ubHksIHVzaW5nIGludGVybmFsIHRyYW5zY2VpdmVyCgkgKiAgMyA9PSAzIHdpcmUgYmlkaXJlY3Rpb25hbAoJICogIDQgPT0gNCB3aXJlIGJpZGlyZWN0aW9uYWwKCSAqICA2ID09IDYgd2lyZSB1bmlkaXJlY3Rpb25hbCAob3IgVExMKQoJICovCgl1OAkJcGluc1szXTsKfTsKCnN0cnVjdCBvbWFwX2xjZF9jb25maWcgewoJY2hhciBwYW5lbF9uYW1lWzE2XTsKCWNoYXIgY3RybF9uYW1lWzE2XTsKfTsKCi8qIENvdmVyOgogKiAgICAgIGhpZ2ggLT4gY2xvc2VkCiAqICAgICAgbG93ICAtPiBvcGVuCiAqIENvbm5lY3Rpb246CiAqICAgICAgaGlnaCAtPiBjb25uZWN0ZWQKICogICAgICBsb3cgIC0+IGRpc2Nvbm5lY3RlZAogKi8KI2RlZmluZSBPTUFQX0dQSU9fU1dJVENIX1RZUEVfQ09WRVIJCTB4MDAwMAojZGVmaW5lIE9NQVBfR1BJT19TV0lUQ0hfVFlQRV9DT05ORUNUSU9OCTB4MDAwMQojZGVmaW5lIE9NQVBfR1BJT19TV0lUQ0hfRkxBR19JTlZFUlRFRAkJMHgwMDAxCiNkZWZpbmUgT01BUF9HUElPX1NXSVRDSF9GTEFHX09VVFBVVAkJMHgwMDAyCnN0cnVjdCBvbWFwX2dwaW9fc3dpdGNoX2NvbmZpZyB7CgljaGFyIG5hbWVbMTJdOwoJdTE2IGdwaW87CglpbnQgZmxhZ3M6NDsKCWludCB0eXBlOjQ7CglpbnQga2V5X2NvZGU6MjQ7IC8qIExpbnV4IGtleSBjb2RlICovCn07CgpzdHJ1Y3Qgb21hcF9mbGFzaF9wYXJ0X2NvbmZpZyB7CgljaGFyIHBhcnRfdGFibGVbMF07Cn07CgpzdHJ1Y3Qgb21hcF9ib290X3JlYXNvbl9jb25maWcgewoJY2hhciByZWFzb25fc3RyWzEyXTsKfTsKCnN0cnVjdCBvbWFwX3VhcnRfY29uZmlnIHsKCS8qIEJpdCBmaWVsZCBvZiBVQVJUcyBwcmVzZW50OyBiaXQgMCAtLT4gVUFSVDEgKi8KCXVuc2lnbmVkIGludCBlbmFibGVkX3VhcnRzOwp9OwoKc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2VudHJ5IHsKCXUxNiB0YWc7Cgl1MTYgbGVuOwoJdTggIGRhdGFbMF07Cn07CgpzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIHsKCXUxNiB0YWc7Cgljb25zdCB2b2lkICpkYXRhOwp9OwoKZXh0ZXJuIGNvbnN0IHZvaWQgKl9fb21hcF9nZXRfY29uZmlnKHUxNiB0YWcsIHNpemVfdCBsZW4sIGludCBucik7CgojZGVmaW5lIG9tYXBfZ2V0X2NvbmZpZyh0YWcsIHR5cGUpIFwKCSgoY29uc3QgdHlwZSAqKSBfX29tYXBfZ2V0X2NvbmZpZygodGFnKSwgc2l6ZW9mKHR5cGUpLCAwKSkKI2RlZmluZSBvbWFwX2dldF9ucl9jb25maWcodGFnLCB0eXBlLCBucikgXAoJKChjb25zdCB0eXBlICopIF9fb21hcF9nZXRfY29uZmlnKCh0YWcpLCBzaXplb2YodHlwZSksIChucikpKQoKZXh0ZXJuIGNvbnN0IHZvaWQgKm9tYXBfZ2V0X3Zhcl9jb25maWcodTE2IHRhZywgc2l6ZV90ICpsZW4pOwoKZXh0ZXJuIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgKm9tYXBfYm9hcmRfY29uZmlnOwpleHRlcm4gaW50IG9tYXBfYm9hcmRfY29uZmlnX3NpemU7CgojZW5kaWYK