LyoKICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQuaAogKgogKiAgSW5mb3JtYXRpb24gc3RydWN0dXJlcyBmb3IgYm9hcmQtc3BlY2lmaWMgZGF0YQogKgogKiAgQ29weXJpZ2h0IChDKSAyMDA0CU5va2lhIENvcnBvcmF0aW9uCiAqICBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqLwoKI2lmbmRlZiBfT01BUF9CT0FSRF9ICiNkZWZpbmUgX09NQVBfQk9BUkRfSAoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KCi8qIERpZmZlcmVudCBwZXJpcGhlcmFsIGlkcyAqLwojZGVmaW5lIE9NQVBfVEFHX0NMT0NLCQkweDRmMDEKI2RlZmluZSBPTUFQX1RBR19NTUMJCTB4NGYwMgojZGVmaW5lIE9NQVBfVEFHX1NFUklBTF9DT05TT0xFIDB4NGYwMwojZGVmaW5lIE9NQVBfVEFHX1VTQgkJMHg0ZjA0CiNkZWZpbmUgT01BUF9UQUdfTENECQkweDRmMDUKI2RlZmluZSBPTUFQX1RBR19HUElPX1NXSVRDSAkweDRmMDYKI2RlZmluZSBPTUFQX1RBR19VQVJUCQkweDRmMDcKI2RlZmluZSBPTUFQX1RBR19GQk1FTQkJMHg0ZjA4CiNkZWZpbmUgT01BUF9UQUdfU1RJX0NPTlNPTEUJMHg0ZjA5CgojZGVmaW5lIE9NQVBfVEFHX0JPT1RfUkVBU09OICAgIDB4NGY4MAojZGVmaW5lIE9NQVBfVEFHX0ZMQVNIX1BBUlQJMHg0ZjgxCiNkZWZpbmUgT01BUF9UQUdfVkVSU0lPTl9TVFIJMHg0ZjgyCgpzdHJ1Y3Qgb21hcF9jbG9ja19jb25maWcgewoJLyogMCBmb3IgMTIgTUh6LCAxIGZvciAxMyBNSHogYW5kIDIgZm9yIDE5LjIgTUh6ICovCgl1OCBzeXN0ZW1fY2xvY2tfdHlwZTsKfTsKCnN0cnVjdCBvbWFwX21tY19jb25mIHsKCXVuc2lnbmVkIGVuYWJsZWQ6MTsKCS8qIG5vbXV4IG1lYW5zICJzdGFuZGFyZCIgbXV4aW5nIGlzIHdyb25nIG9uIHRoaXMgYm9hcmQsIGFuZCB0aGF0CgkgKiBib2FyZC1zcGVjaWZpYyBjb2RlIGhhbmRsZWQgaXQgYmVmb3JlIGNvbW1vbiBpbml0IGxvZ2ljLgoJICovCgl1bnNpZ25lZCBub211eDoxOwoJLyogc3dpdGNoIHBpbiBjYW4gYmUgZm9yIGNhcmQgZGV0ZWN0IChkZWZhdWx0KSBvciBjYXJkIGNvdmVyICovCgl1bnNpZ25lZCBjb3ZlcjoxOwoJLyogNCB3aXJlIHNpZ25hbGluZyBpcyBvcHRpb25hbCwgYW5kIGlzIG9ubHkgdXNlZCBmb3IgU0QvU0RJTyAqLwoJdW5zaWduZWQgd2lyZTQ6MTsKCXMxNiBwb3dlcl9waW47CglzMTYgc3dpdGNoX3BpbjsKCXMxNiB3cF9waW47Cn07CgpzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnIHsKCXN0cnVjdCBvbWFwX21tY19jb25mIG1tY1syXTsKfTsKCnN0cnVjdCBvbWFwX3NlcmlhbF9jb25zb2xlX2NvbmZpZyB7Cgl1OCBjb25zb2xlX3VhcnQ7Cgl1MzIgY29uc29sZV9zcGVlZDsKfTsKCnN0cnVjdCBvbWFwX3N0aV9jb25zb2xlX2NvbmZpZyB7Cgl1bnNpZ25lZCBlbmFibGU6MTsKCXU4IGNoYW5uZWw7Cn07CgpzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIHsKCS8qIENvbmZpZ3VyZSBkcml2ZXJzIGFjY29yZGluZyB0byB0aGUgY29ubmVjdG9ycyBvbiB5b3VyIGJvYXJkOgoJICogIC0gIkEiIGNvbm5lY3RvciAocmVjdGFndWxhcikKCSAqCS4uLiBmb3IgaG9zdC9PSENJIHVzZSwgc2V0ICJyZWdpc3Rlcl9ob3N0Ii4KCSAqICAtICJCIiBjb25uZWN0b3IgKHNxdWFyaXNoKSBvciAiTWluaS1CIgoJICoJLi4uIGZvciBkZXZpY2UvZ2FkZ2V0IHVzZSwgc2V0ICJyZWdpc3Rlcl9kZXYiLgoJICogIC0gIk1pbmktQUIiIGNvbm5lY3RvciAodmVyeSBzaW1pbGFyIHRvIE1pbmktQikKCSAqCS4uLiBmb3IgT1RHIHVzZSBhcyBkZXZpY2UgT1IgaG9zdCwgaW5pdGlhbGl6ZSAib3RnIgoJICovCgl1bnNpZ25lZAlyZWdpc3Rlcl9ob3N0OjE7Cgl1bnNpZ25lZAlyZWdpc3Rlcl9kZXY6MTsKCXU4CQlvdGc7CS8qIHBvcnQgbnVtYmVyLCAxLWJhc2VkOiAgdXNiMSA9PSAyICovCgoJdTgJCWhtY19tb2RlOwoKCS8qIGltcGxpY2l0bHkgdHJ1ZSBpZiBvdGc6ICBob3N0IHN1cHBvcnRzIHJlbW90ZSB3YWtldXA/ICovCgl1OAkJcndjOwoKCS8qIHNpZ25hbGluZyBwaW5zIHVzZWQgdG8gdGFsayB0byB0cmFuc2NlaXZlciBvbiB1c2JOOgoJICogIDAgPT0gdXNiTiB1bnVzZWQKCSAqICAyID09IHVzYjAtb25seSwgdXNpbmcgaW50ZXJuYWwgdHJhbnNjZWl2ZXIKCSAqICAzID09IDMgd2lyZSBiaWRpcmVjdGlvbmFsCgkgKiAgNCA9PSA0IHdpcmUgYmlkaXJlY3Rpb25hbAoJICogIDYgPT0gNiB3aXJlIHVuaWRpcmVjdGlvbmFsIChvciBUTEwpCgkgKi8KCXU4CQlwaW5zWzNdOwp9OwoKc3RydWN0IG9tYXBfbGNkX2NvbmZpZyB7CgljaGFyIHBhbmVsX25hbWVbMTZdOwoJY2hhciBjdHJsX25hbWVbMTZdOwp9OwoKc3RydWN0IG9tYXBfZmJtZW1fY29uZmlnIHsKCXUzMiBmYl9zcmFtX3N0YXJ0OwoJdTMyIGZiX3NyYW1fc2l6ZTsKCXUzMiBmYl9zZHJhbV9zdGFydDsKCXUzMiBmYl9zZHJhbV9zaXplOwp9OwoKLyogQ292ZXI6CiAqICAgICAgaGlnaCAtPiBjbG9zZWQKICogICAgICBsb3cgIC0+IG9wZW4KICogQ29ubmVjdGlvbjoKICogICAgICBoaWdoIC0+IGNvbm5lY3RlZAogKiAgICAgIGxvdyAgLT4gZGlzY29ubmVjdGVkCiAqLwojZGVmaW5lIE9NQVBfR1BJT19TV0lUQ0hfVFlQRV9DT1ZFUgkJMHgwMDAwCiNkZWZpbmUgT01BUF9HUElPX1NXSVRDSF9UWVBFX0NPTk5FQ1RJT04JMHgwMDAxCiNkZWZpbmUgT01BUF9HUElPX1NXSVRDSF9GTEFHX0lOVkVSVEVECQkweDAwMDEKI2RlZmluZSBPTUFQX0dQSU9fU1dJVENIX0ZMQUdfT1VUUFVUCQkweDAwMDIKc3RydWN0IG9tYXBfZ3Bpb19zd2l0Y2hfY29uZmlnIHsKCWNoYXIgbmFtZVsxMl07Cgl1MTYgZ3BpbzsKCWludCBmbGFnczo0OwoJaW50IHR5cGU6NDsKCWludCBrZXlfY29kZToyNDsgLyogTGludXgga2V5IGNvZGUgKi8KfTsKCnN0cnVjdCBvbWFwX3VhcnRfY29uZmlnIHsKCS8qIEJpdCBmaWVsZCBvZiBVQVJUcyBwcmVzZW50OyBiaXQgMCAtLT4gVUFSVDEgKi8KCXVuc2lnbmVkIGludCBlbmFibGVkX3VhcnRzOwp9OwoKCnN0cnVjdCBvbWFwX2ZsYXNoX3BhcnRfY29uZmlnIHsKCWNoYXIgcGFydF90YWJsZVswXTsKfTsKCnN0cnVjdCBvbWFwX2Jvb3RfcmVhc29uX2NvbmZpZyB7CgljaGFyIHJlYXNvbl9zdHJbMTJdOwp9OwoKc3RydWN0IG9tYXBfdmVyc2lvbl9jb25maWcgewoJY2hhciBjb21wb25lbnRbMTJdOwoJY2hhciB2ZXJzaW9uWzEyXTsKfTsKCgojaW5jbHVkZSA8YXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtbm9raWEuaD4KCnN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19lbnRyeSB7Cgl1MTYgdGFnOwoJdTE2IGxlbjsKCXU4ICBkYXRhWzBdOwp9OwoKc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCB7Cgl1MTYgdGFnOwoJY29uc3Qgdm9pZCAqZGF0YTsKfTsKCmV4dGVybiBjb25zdCB2b2lkICpfX29tYXBfZ2V0X2NvbmZpZyh1MTYgdGFnLCBzaXplX3QgbGVuLCBpbnQgbnIpOwoKI2RlZmluZSBvbWFwX2dldF9jb25maWcodGFnLCB0eXBlKSBcCgkoKGNvbnN0IHR5cGUgKikgX19vbWFwX2dldF9jb25maWcoKHRhZyksIHNpemVvZih0eXBlKSwgMCkpCiNkZWZpbmUgb21hcF9nZXRfbnJfY29uZmlnKHRhZywgdHlwZSwgbnIpIFwKCSgoY29uc3QgdHlwZSAqKSBfX29tYXBfZ2V0X2NvbmZpZygodGFnKSwgc2l6ZW9mKHR5cGUpLCAobnIpKSkKCmV4dGVybiBjb25zdCB2b2lkICpvbWFwX2dldF92YXJfY29uZmlnKHUxNiB0YWcsIHNpemVfdCAqbGVuKTsKCmV4dGVybiBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsICpvbWFwX2JvYXJkX2NvbmZpZzsKZXh0ZXJuIGludCBvbWFwX2JvYXJkX2NvbmZpZ19zaXplOwoKI2VuZGlmCg==