LyoKICogQ29weXJpZ2h0IKkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgogKiBJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCiAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICogQXV0aG9yczoKICogICAgWGlhbmcgSGFpaGFvIDxoYWloYW8ueGlhbmdAaW50ZWwuY29tPgogKiAgICBab3UgTmFuIGhhaSA8bmFuaGFpLnpvdUBpbnRlbC5jb20+CiAqCiAqLwoKI2lmbmRlZiBfSTk2NV9NRURJQV9IXwojZGVmaW5lIF9JOTY1X01FRElBX0hfCgojaW5jbHVkZSA8eGY4NmRybS5oPgojaW5jbHVkZSA8ZHJtLmg+CiNpbmNsdWRlIDxpOTE1X2RybS5oPgojaW5jbHVkZSA8aW50ZWxfYnVmbWdyLmg+CgojaW5jbHVkZSAiaTk2NV9zdHJ1Y3RzLmgiCgojZGVmaW5lIE1BWF9JTlRFUkZBQ0VfREVTQyAgICAgIDE2CiNkZWZpbmUgTUFYX01FRElBX1NVUkZBQ0VTICAgICAgMzIKCiNkZWZpbmUgTVBFR19UT1BfRklFTEQJCTEKI2RlZmluZSBNUEVHX0JPVFRPTV9GSUVMRAkyCiNkZWZpbmUgTVBFR19GUkFNRQkJMwoKc3RydWN0IGRlY29kZV9zdGF0ZTsKCnN0cnVjdCBtZWRpYV9rZXJuZWwgCnsKICAgIGNoYXIgKm5hbWU7CiAgICBpbnQgaW50ZXJmYWNlOwogICAgdW5zaWduZWQgaW50ICgqYmluKVs0XTsKICAgIGludCBzaXplOwogICAgZHJpX2JvICpibzsKfTsKCnN0cnVjdCBpOTY1X21lZGlhX3N0YXRlIAp7CiAgICBzdHJ1Y3QgewogICAgICAgIGRyaV9ibyAqYm87CiAgICB9IHN1cmZhY2Vfc3RhdGVbTUFYX01FRElBX1NVUkZBQ0VTXTsKCiAgICBzdHJ1Y3QgewogICAgICAgIGRyaV9ibyAqYm87CiAgICB9IGJpbmRpbmdfdGFibGU7CgogICAgc3RydWN0IHsKICAgICAgICBkcmlfYm8gKmJvOwogICAgfSBpZHJ0OyAgLyogaW50ZXJmYWNlIGRlc2NyaXB0b3IgcmVtYXAgdGFibGUgKi8KCiAgICBzdHJ1Y3QgewogICAgICAgIGRyaV9ibyAqYm87CiAgICAgICAgaW50IGVuYWJsZWQ7CiAgICB9IGV4dGVuZGVkX3N0YXRlOwoKICAgIHN0cnVjdCB7CiAgICAgICAgZHJpX2JvICpibzsKICAgIH0gdmZlX3N0YXRlOwoKICAgIHN0cnVjdCB7CiAgICAgICAgZHJpX2JvICpibzsKICAgIH0gY3VyYmU7CgogICAgc3RydWN0IHsKICAgICAgICB1bnNpZ25lZCBpbnQgdmZlX3N0YXJ0OwogICAgICAgIHVuc2lnbmVkIGludCBjc19zdGFydDsKCiAgICAgICAgdW5zaWduZWQgaW50IG51bV92ZmVfZW50cmllczsKICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2NzX2VudHJpZXM7CgogICAgICAgIHVuc2lnbmVkIGludCBzaXplX3ZmZV9lbnRyeTsKICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZV9jc19lbnRyeTsKICAgIH0gdXJiOwoKICAgIHZvaWQgKCpzdGF0ZXNfc2V0dXApKFZBRHJpdmVyQ29udGV4dFAgY3R4LCBzdHJ1Y3QgZGVjb2RlX3N0YXRlICpkZWNvZGVfc3RhdGUpOwogICAgdm9pZCAoKm1lZGlhX29iamVjdHMpKFZBRHJpdmVyQ29udGV4dFAgY3R4LCBzdHJ1Y3QgZGVjb2RlX3N0YXRlICpkZWNvZGVfc3RhdGUpOwp9OwoKQm9vbCBpOTY1X21lZGlhX2luaXQoVkFEcml2ZXJDb250ZXh0UCBjdHgpOwpCb29sIGk5NjVfbWVkaWFfdGVybWluYXRlKFZBRHJpdmVyQ29udGV4dFAgY3R4KTsKdm9pZCBpOTY1X21lZGlhX2RlY29kZV9waWN0dXJlKFZBRHJpdmVyQ29udGV4dFAgY3R4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUHJvZmlsZSBwcm9maWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZWNvZGVfc3RhdGUgKmRlY29kZV9zdGF0ZSk7CiNlbmRpZiAvKiBfSTk2NV9NRURJQV9IXyAqLwo=