LyoKICogQ29weXJpZ2h0IKkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgogKiBJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCiAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICogQXV0aG9yczoKICogICAgWGlhbmcgSGFpaGFvIDxoYWloYW8ueGlhbmdAaW50ZWwuY29tPgogKiAgICBab3UgTmFuIGhhaSA8bmFuaGFpLnpvdUBpbnRlbC5jb20+CiAqCiAqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KCiNpbmNsdWRlICJ2YS94MTEvdmFfZHJpY29tbW9uLmgiCgojaW5jbHVkZSAiaW50ZWxfZHJpdmVyLmgiCiNpbmNsdWRlICJpbnRlbF9tZW1tYW4uaCIKI2luY2x1ZGUgImludGVsX2JhdGNoYnVmZmVyLmgiCgojaW5jbHVkZSAiaTk2NV9tZWRpYS5oIgojaW5jbHVkZSAiaTk2NV9kcnZfdmlkZW8uaCIKI2luY2x1ZGUgImk5NjVfZGVmaW5lcy5oIgoKI2RlZmluZSBDT05GSUdfSURfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKI2RlZmluZSBDT05URVhUX0lEX09GRlNFVCAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKI2RlZmluZSBTVVJGQUNFX0lEX09GRlNFVCAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKI2RlZmluZSBCVUZGRVJfSURfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKI2RlZmluZSBJTUFHRV9JRF9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MGEwMDAwMDAKI2RlZmluZSBTVUJQSUNfSURfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKCmVudW0gewogICAgSTk2NV9TVVJGQUNFVFlQRV9SR0JBID0gMSwKICAgIEk5NjVfU1VSRkFDRVRZUEVfWVVWLAogICAgSTk2NV9TVVJGQUNFVFlQRV9JTkRFWEVECn07CgovKiBMaXN0IG9mIHN1cHBvcnRlZCBpbWFnZSBmb3JtYXRzICovCnR5cGVkZWYgc3RydWN0IHsKICAgIHVuc2lnbmVkIGludCAgICAgICAgdHlwZTsKICAgIFZBSW1hZ2VGb3JtYXQgICAgICAgdmFfZm9ybWF0Owp9IGk5NjVfaW1hZ2VfZm9ybWF0X21hcF90OwoKc3RhdGljIGNvbnN0IGk5NjVfaW1hZ2VfZm9ybWF0X21hcF90Cmk5NjVfaW1hZ2VfZm9ybWF0c19tYXBbSTk2NV9NQVhfSU1BR0VfRk9STUFUUyArIDFdID0gewogICAgeyBJOTY1X1NVUkZBQ0VUWVBFX1lVViwKICAgICAgeyBWQV9GT1VSQ0MoJ1knLCdWJywnMScsJzInKSwgVkFfTFNCX0ZJUlNULCAxMiwgfSB9LAogICAgeyBJOTY1X1NVUkZBQ0VUWVBFX1lVViwKICAgICAgeyBWQV9GT1VSQ0MoJ0knLCc0JywnMicsJzAnKSwgVkFfTFNCX0ZJUlNULCAxMiwgfSB9LAogICAgeyBJOTY1X1NVUkZBQ0VUWVBFX1lVViwKICAgICAgeyBWQV9GT1VSQ0MoJ04nLCdWJywnMScsJzInKSwgVkFfTFNCX0ZJUlNULCAxMiwgfSB9LAp9OwoKLyogTGlzdCBvZiBzdXBwb3J0ZWQgc3VicGljdHVyZSBmb3JtYXRzICovCnR5cGVkZWYgc3RydWN0IHsKICAgIHVuc2lnbmVkIGludCAgICAgICAgdHlwZTsKICAgIHVuc2lnbmVkIGludCAgICAgICAgZm9ybWF0OwogICAgVkFJbWFnZUZvcm1hdCAgICAgICB2YV9mb3JtYXQ7CiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHZhX2ZsYWdzOwp9IGk5NjVfc3VicGljX2Zvcm1hdF9tYXBfdDsKCnN0YXRpYyBjb25zdCBpOTY1X3N1YnBpY19mb3JtYXRfbWFwX3QKaTk2NV9zdWJwaWNfZm9ybWF0c19tYXBbSTk2NV9NQVhfU1VCUElDX0ZPUk1BVFMgKyAxXSA9IHsKICAgIHsgSTk2NV9TVVJGQUNFVFlQRV9JTkRFWEVELCBJOTY1X1NVUkZBQ0VGT1JNQVRfUDRBNF9VTk9STSwKICAgICAgeyBWQV9GT1VSQ0MoJ0knLCdBJywnNCcsJzQnKSwgVkFfTVNCX0ZJUlNULCA4LCB9LAogICAgICAwIH0sCiAgICB7IEk5NjVfU1VSRkFDRVRZUEVfSU5ERVhFRCwgSTk2NV9TVVJGQUNFRk9STUFUX0E0UDRfVU5PUk0sCiAgICAgIHsgVkFfRk9VUkNDKCdBJywnSScsJzQnLCc0JyksIFZBX01TQl9GSVJTVCwgOCwgfSwKICAgICAgMCB9LAogICAgeyBJOTY1X1NVUkZBQ0VUWVBFX1JHQkEsIEk5NjVfU1VSRkFDRUZPUk1BVF9COEc4UjhBOF9VTk9STSwKICAgICAgeyBWQV9GT1VSQ0MoJ0InLCdHJywnUicsJ0EnKSwgVkFfTFNCX0ZJUlNULCAzMiwKICAgICAgICAzMiwgMHgwMGZmMDAwMCwgMHgwMDAwZmYwMCwgMHgwMDAwMDBmZiwgMHhmZjAwMDAwMCB9LAogICAgICAwIH0sCiAgICB7IEk5NjVfU1VSRkFDRVRZUEVfUkdCQSwgSTk2NV9TVVJGQUNFRk9STUFUX1I4RzhCOEE4X1VOT1JNLAogICAgICB7IFZBX0ZPVVJDQygnUicsJ0cnLCdCJywnQScpLCBWQV9MU0JfRklSU1QsIDMyLAogICAgICAgIDMyLCAweDAwMDAwMGZmLCAweDAwMDBmZjAwLCAweDAwZmYwMDAwLCAweGZmMDAwMDAwIH0sCiAgICAgIDAgfSwKfTsKCnN0YXRpYyBjb25zdCBpOTY1X3N1YnBpY19mb3JtYXRfbWFwX3QgKgpnZXRfc3VicGljX2Zvcm1hdChjb25zdCBWQUltYWdlRm9ybWF0ICp2YV9mb3JtYXQpCnsKICAgIHVuc2lnbmVkIGludCBpOwogICAgZm9yIChpID0gMDsgaTk2NV9zdWJwaWNfZm9ybWF0c19tYXBbaV0udHlwZSAhPSAwOyBpKyspIHsKICAgICAgICBjb25zdCBpOTY1X3N1YnBpY19mb3JtYXRfbWFwX3QgKiBjb25zdCBtID0gJmk5NjVfc3VicGljX2Zvcm1hdHNfbWFwW2ldOwogICAgICAgIGlmIChtLT52YV9mb3JtYXQuZm91cmNjID09IHZhX2Zvcm1hdC0+Zm91cmNjICYmCiAgICAgICAgICAgIChtLT50eXBlID09IEk5NjVfU1VSRkFDRVRZUEVfUkdCQSA/CiAgICAgICAgICAgICAobS0+dmFfZm9ybWF0LmJ5dGVfb3JkZXIgPT0gdmFfZm9ybWF0LT5ieXRlX29yZGVyICYmCiAgICAgICAgICAgICAgbS0+dmFfZm9ybWF0LnJlZF9tYXNrICAgPT0gdmFfZm9ybWF0LT5yZWRfbWFzayAgICYmCiAgICAgICAgICAgICAgbS0+dmFfZm9ybWF0LmdyZWVuX21hc2sgPT0gdmFfZm9ybWF0LT5ncmVlbl9tYXNrICYmCiAgICAgICAgICAgICAgbS0+dmFfZm9ybWF0LmJsdWVfbWFzayAgPT0gdmFfZm9ybWF0LT5ibHVlX21hc2sgICYmCiAgICAgICAgICAgICAgbS0+dmFfZm9ybWF0LmFscGhhX21hc2sgPT0gdmFfZm9ybWF0LT5hbHBoYV9tYXNrKSA6IDEpKQogICAgICAgICAgICByZXR1cm4gbTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgpWQVN0YXR1cyAKaTk2NV9RdWVyeUNvbmZpZ1Byb2ZpbGVzKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgVkFQcm9maWxlICpwcm9maWxlX2xpc3QsICAgICAgIC8qIG91dCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1fcHJvZmlsZXMpICAgICAgICAgICAgIC8qIG91dCAqLwp7CiAgICBpbnQgaSA9IDA7CgogICAgcHJvZmlsZV9saXN0W2krK10gPSBWQVByb2ZpbGVNUEVHMlNpbXBsZTsKICAgIHByb2ZpbGVfbGlzdFtpKytdID0gVkFQcm9maWxlTVBFRzJNYWluOwogICAgcHJvZmlsZV9saXN0W2krK10gPSBWQVByb2ZpbGVIMjY0QmFzZWxpbmU7CiAgICBwcm9maWxlX2xpc3RbaSsrXSA9IFZBUHJvZmlsZUgyNjRNYWluOwogICAgcHJvZmlsZV9saXN0W2krK10gPSBWQVByb2ZpbGVIMjY0SGlnaDsKCiAgICAvKiBJZiB0aGUgYXNzZXJ0IGZhaWxzIHRoZW4gSTk2NV9NQVhfUFJPRklMRVMgbmVlZHMgdG8gYmUgYmlnZ2VyICovCiAgICBhc3NlcnQoaSA8PSBJOTY1X01BWF9QUk9GSUxFUyk7CiAgICAqbnVtX3Byb2ZpbGVzID0gaTsKCiAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7Cn0KClZBU3RhdHVzIAppOTY1X1F1ZXJ5Q29uZmlnRW50cnlwb2ludHMoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVByb2ZpbGUgcHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBRW50cnlwb2ludCAqZW50cnlwb2ludF9saXN0LCAgICAgIC8qIG91dCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1fZW50cnlwb2ludHMpICAgICAgICAgICAgICAgLyogb3V0ICovCnsKICAgIFZBU3RhdHVzIHZhU3RhdHVzID0gVkFfU1RBVFVTX1NVQ0NFU1M7CgogICAgc3dpdGNoIChwcm9maWxlKSB7CiAgICBjYXNlIFZBUHJvZmlsZU1QRUcyU2ltcGxlOgogICAgY2FzZSBWQVByb2ZpbGVNUEVHMk1haW46CiAgICAgICAgKm51bV9lbnRyeXBvaW50cyA9IDE7CiAgICAgICAgZW50cnlwb2ludF9saXN0WzBdID0gVkFFbnRyeXBvaW50VkxEOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgVkFQcm9maWxlSDI2NEJhc2VsaW5lOgogICAgY2FzZSBWQVByb2ZpbGVIMjY0TWFpbjoKICAgIGNhc2UgVkFQcm9maWxlSDI2NEhpZ2g6CiAgICAgICAgKm51bV9lbnRyeXBvaW50cyA9IDE7CiAgICAgICAgZW50cnlwb2ludF9saXN0WzBdID0gVkFFbnRyeXBvaW50VkxEOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgdmFTdGF0dXMgPSBWQV9TVEFUVVNfRVJST1JfVU5TVVBQT1JURURfUFJPRklMRTsKICAgICAgICAqbnVtX2VudHJ5cG9pbnRzID0gMDsKICAgICAgICBicmVhazsKICAgIH0KCiAgICAvKiBJZiB0aGUgYXNzZXJ0IGZhaWxzIHRoZW4gSTk2NV9NQVhfRU5UUllQT0lOVFMgbmVlZHMgdG8gYmUgYmlnZ2VyICovCiAgICBhc3NlcnQoKm51bV9lbnRyeXBvaW50cyA8PSBJOTY1X01BWF9FTlRSWVBPSU5UUyk7CgogICAgcmV0dXJuIHZhU3RhdHVzOwp9CgpWQVN0YXR1cyAKaTk2NV9HZXRDb25maWdBdHRyaWJ1dGVzKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgVkFQcm9maWxlIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBWQUVudHJ5cG9pbnQgZW50cnlwb2ludCwKICAgICAgICAgICAgICAgICAgICAgICAgIFZBQ29uZmlnQXR0cmliICphdHRyaWJfbGlzdCwgIC8qIGluL291dCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9hdHRyaWJzKQp7CiAgICBpbnQgaTsKCiAgICAvKiBPdGhlciBhdHRyaWJ1dGVzIGRvbid0IHNlZW0gdG8gYmUgZGVmaW5lZCAqLwogICAgLyogV2hhdCB0byBkbyBpZiB3ZSBkb24ndCBrbm93IHRoZSBhdHRyaWJ1dGU/ICovCiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2F0dHJpYnM7IGkrKykgewogICAgICAgIHN3aXRjaCAoYXR0cmliX2xpc3RbaV0udHlwZSkgewogICAgICAgIGNhc2UgVkFDb25maWdBdHRyaWJSVEZvcm1hdDoKICAgICAgICAgICAgYXR0cmliX2xpc3RbaV0udmFsdWUgPSBWQV9SVF9GT1JNQVRfWVVWNDIwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgLyogRG8gbm90aGluZyAqLwogICAgICAgICAgICBhdHRyaWJfbGlzdFtpXS52YWx1ZSA9IFZBX0FUVFJJQl9OT1RfU1VQUE9SVEVEOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwp9CgpzdGF0aWMgdm9pZCAKaTk2NV9kZXN0cm95X2NvbmZpZyhzdHJ1Y3Qgb2JqZWN0X2hlYXAgKmhlYXAsIHN0cnVjdCBvYmplY3RfYmFzZSAqb2JqKQp7CiAgICBvYmplY3RfaGVhcF9mcmVlKGhlYXAsIG9iaik7Cn0KCnN0YXRpYyBWQVN0YXR1cyAKaTk2NV91cGRhdGVfYXR0cmlidXRlKHN0cnVjdCBvYmplY3RfY29uZmlnICpvYmpfY29uZmlnLCBWQUNvbmZpZ0F0dHJpYiAqYXR0cmliKQp7CiAgICBpbnQgaTsKCiAgICAvKiBDaGVjayBleGlzdGluZyBhdHRyYml1dGVzICovCiAgICBmb3IgKGkgPSAwOyBvYmpfY29uZmlnLT5udW1fYXR0cmlicyA8IGk7IGkrKykgewogICAgICAgIGlmIChvYmpfY29uZmlnLT5hdHRyaWJfbGlzdFtpXS50eXBlID09IGF0dHJpYi0+dHlwZSkgewogICAgICAgICAgICAvKiBVcGRhdGUgZXhpc3RpbmcgYXR0cmlidXRlICovCiAgICAgICAgICAgIG9ial9jb25maWctPmF0dHJpYl9saXN0W2ldLnZhbHVlID0gYXR0cmliLT52YWx1ZTsKICAgICAgICAgICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAob2JqX2NvbmZpZy0+bnVtX2F0dHJpYnMgPCBJOTY1X01BWF9DT05GSUdfQVRUUklCVVRFUykgewogICAgICAgIGkgPSBvYmpfY29uZmlnLT5udW1fYXR0cmliczsKICAgICAgICBvYmpfY29uZmlnLT5hdHRyaWJfbGlzdFtpXS50eXBlID0gYXR0cmliLT50eXBlOwogICAgICAgIG9ial9jb25maWctPmF0dHJpYl9saXN0W2ldLnZhbHVlID0gYXR0cmliLT52YWx1ZTsKICAgICAgICBvYmpfY29uZmlnLT5udW1fYXR0cmlicysrOwogICAgICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKICAgIH0KCiAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX01BWF9OVU1fRVhDRUVERUQ7Cn0KClZBU3RhdHVzIAppOTY1X0NyZWF0ZUNvbmZpZyhWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgVkFQcm9maWxlIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgIFZBRW50cnlwb2ludCBlbnRyeXBvaW50LAogICAgICAgICAgICAgICAgICBWQUNvbmZpZ0F0dHJpYiAqYXR0cmliX2xpc3QsCiAgICAgICAgICAgICAgICAgIGludCBudW1fYXR0cmlicywKICAgICAgICAgICAgICAgICAgVkFDb25maWdJRCAqY29uZmlnX2lkKQkJLyogb3V0ICovCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IG9iamVjdF9jb25maWcgKm9ial9jb25maWc7CiAgICBpbnQgY29uZmlnSUQ7CiAgICBpbnQgaTsKICAgIFZBU3RhdHVzIHZhU3RhdHVzOwoKICAgIC8qIFZhbGlkYXRlIHByb2ZpbGUgJiBlbnRyeXBvaW50ICovCiAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKICAgIGNhc2UgVkFQcm9maWxlTVBFRzJTaW1wbGU6CiAgICBjYXNlIFZBUHJvZmlsZU1QRUcyTWFpbjoKICAgICAgICBpZiAoVkFFbnRyeXBvaW50VkxEID09IGVudHJ5cG9pbnQpIHsKICAgICAgICAgICAgdmFTdGF0dXMgPSBWQV9TVEFUVVNfU1VDQ0VTUzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YVN0YXR1cyA9IFZBX1NUQVRVU19FUlJPUl9VTlNVUFBPUlRFRF9FTlRSWVBPSU5UOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFZBUHJvZmlsZUgyNjRCYXNlbGluZToKICAgIGNhc2UgVkFQcm9maWxlSDI2NE1haW46CiAgICBjYXNlIFZBUHJvZmlsZUgyNjRIaWdoOgogICAgICAgIGlmIChWQUVudHJ5cG9pbnRWTEQgPT0gZW50cnlwb2ludCkgewogICAgICAgICAgICB2YVN0YXR1cyA9IFZBX1NUQVRVU19TVUNDRVNTOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX1VOU1VQUE9SVEVEX0VOVFJZUE9JTlQ7CiAgICAgICAgfQoKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX1VOU1VQUE9SVEVEX1BST0ZJTEU7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKFZBX1NUQVRVU19TVUNDRVNTICE9IHZhU3RhdHVzKSB7CiAgICAgICAgcmV0dXJuIHZhU3RhdHVzOwogICAgfQoKICAgIGNvbmZpZ0lEID0gTkVXX0NPTkZJR19JRCgpOwogICAgb2JqX2NvbmZpZyA9IENPTkZJRyhjb25maWdJRCk7CgogICAgaWYgKE5VTEwgPT0gb2JqX2NvbmZpZykgewogICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX0FMTE9DQVRJT05fRkFJTEVEOwogICAgICAgIHJldHVybiB2YVN0YXR1czsKICAgIH0KCiAgICBvYmpfY29uZmlnLT5wcm9maWxlID0gcHJvZmlsZTsKICAgIG9ial9jb25maWctPmVudHJ5cG9pbnQgPSBlbnRyeXBvaW50OwogICAgb2JqX2NvbmZpZy0+YXR0cmliX2xpc3RbMF0udHlwZSA9IFZBQ29uZmlnQXR0cmliUlRGb3JtYXQ7CiAgICBvYmpfY29uZmlnLT5hdHRyaWJfbGlzdFswXS52YWx1ZSA9IFZBX1JUX0ZPUk1BVF9ZVVY0MjA7CiAgICBvYmpfY29uZmlnLT5udW1fYXR0cmlicyA9IDE7CgogICAgZm9yKGkgPSAwOyBpIDwgbnVtX2F0dHJpYnM7IGkrKykgewogICAgICAgIHZhU3RhdHVzID0gaTk2NV91cGRhdGVfYXR0cmlidXRlKG9ial9jb25maWcsICYoYXR0cmliX2xpc3RbaV0pKTsKCiAgICAgICAgaWYgKFZBX1NUQVRVU19TVUNDRVNTICE9IHZhU3RhdHVzKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBFcnJvciByZWNvdmVyeSAqLwogICAgaWYgKFZBX1NUQVRVU19TVUNDRVNTICE9IHZhU3RhdHVzKSB7CiAgICAgICAgaTk2NV9kZXN0cm95X2NvbmZpZygmaTk2NS0+Y29uZmlnX2hlYXAsIChzdHJ1Y3Qgb2JqZWN0X2Jhc2UgKilvYmpfY29uZmlnKTsKICAgIH0gZWxzZSB7CiAgICAgICAgKmNvbmZpZ19pZCA9IGNvbmZpZ0lEOwogICAgfQoKICAgIHJldHVybiB2YVN0YXR1czsKfQoKVkFTdGF0dXMgCmk5NjVfRGVzdHJveUNvbmZpZyhWQURyaXZlckNvbnRleHRQIGN0eCwgVkFDb25maWdJRCBjb25maWdfaWQpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IG9iamVjdF9jb25maWcgKm9ial9jb25maWcgPSBDT05GSUcoY29uZmlnX2lkKTsKICAgIFZBU3RhdHVzIHZhU3RhdHVzOwoKICAgIGlmIChOVUxMID09IG9ial9jb25maWcpIHsKICAgICAgICB2YVN0YXR1cyA9IFZBX1NUQVRVU19FUlJPUl9JTlZBTElEX0NPTkZJRzsKICAgICAgICByZXR1cm4gdmFTdGF0dXM7CiAgICB9CgogICAgaTk2NV9kZXN0cm95X2NvbmZpZygmaTk2NS0+Y29uZmlnX2hlYXAsIChzdHJ1Y3Qgb2JqZWN0X2Jhc2UgKilvYmpfY29uZmlnKTsKICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKfQoKVkFTdGF0dXMgaTk2NV9RdWVyeUNvbmZpZ0F0dHJpYnV0ZXMoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQ29uZmlnSUQgY29uZmlnX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVByb2ZpbGUgKnByb2ZpbGUsICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFFbnRyeXBvaW50ICplbnRyeXBvaW50LCAgICAgICAgICAgLyogb3V0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQ29uZmlnQXR0cmliICphdHRyaWJfbGlzdCwgICAgICAgIC8qIG91dCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm51bV9hdHRyaWJzKSAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3Qgb2JqZWN0X2NvbmZpZyAqb2JqX2NvbmZpZyA9IENPTkZJRyhjb25maWdfaWQpOwogICAgVkFTdGF0dXMgdmFTdGF0dXMgPSBWQV9TVEFUVVNfU1VDQ0VTUzsKICAgIGludCBpOwoKICAgIGFzc2VydChvYmpfY29uZmlnKTsKICAgICpwcm9maWxlID0gb2JqX2NvbmZpZy0+cHJvZmlsZTsKICAgICplbnRyeXBvaW50ID0gb2JqX2NvbmZpZy0+ZW50cnlwb2ludDsKICAgICpudW1fYXR0cmlicyA9IG9ial9jb25maWctPm51bV9hdHRyaWJzOwoKICAgIGZvcihpID0gMDsgaSA8IG9ial9jb25maWctPm51bV9hdHRyaWJzOyBpKyspIHsKICAgICAgICBhdHRyaWJfbGlzdFtpXSA9IG9ial9jb25maWctPmF0dHJpYl9saXN0W2ldOwogICAgfQoKICAgIHJldHVybiB2YVN0YXR1czsKfQoKc3RhdGljIHZvaWQgCmk5NjVfZGVzdHJveV9zdXJmYWNlKHN0cnVjdCBvYmplY3RfaGVhcCAqaGVhcCwgc3RydWN0IG9iamVjdF9iYXNlICpvYmopCnsKICAgIHN0cnVjdCBvYmplY3Rfc3VyZmFjZSAqb2JqX3N1cmZhY2UgPSAoc3RydWN0IG9iamVjdF9zdXJmYWNlICopb2JqOwoKICAgIGRyaV9ib191bnJlZmVyZW5jZShvYmpfc3VyZmFjZS0+Ym8pOwogICAgb2JqX3N1cmZhY2UtPmJvID0gTlVMTDsKCiAgICBpZiAob2JqX3N1cmZhY2UtPmZyZWVfcHJpdmF0ZV9kYXRhICE9IE5VTEwpIHsKICAgICAgICBvYmpfc3VyZmFjZS0+ZnJlZV9wcml2YXRlX2RhdGEoJm9ial9zdXJmYWNlLT5wcml2YXRlX2RhdGEpOwogICAgICAgIG9ial9zdXJmYWNlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwogICAgfQoKICAgIG9iamVjdF9oZWFwX2ZyZWUoaGVhcCwgb2JqKTsKfQoKVkFTdGF0dXMgCmk5NjVfQ3JlYXRlU3VyZmFjZXMoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAogICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3N1cmZhY2VzLAogICAgICAgICAgICAgICAgICAgIFZBU3VyZmFjZUlEICpzdXJmYWNlcykgICAgICAvKiBvdXQgKi8KewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBpbnQgaTsKICAgIFZBU3RhdHVzIHZhU3RhdHVzID0gVkFfU1RBVFVTX1NVQ0NFU1M7CgogICAgLyogV2Ugb25seSBzdXBwb3J0IG9uZSBmb3JtYXQgKi8KICAgIGlmIChWQV9SVF9GT1JNQVRfWVVWNDIwICE9IGZvcm1hdCkgewogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfVU5TVVBQT1JURURfUlRfRk9STUFUOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3VyZmFjZXM7IGkrKykgewogICAgICAgIGludCBzdXJmYWNlSUQgPSBORVdfU1VSRkFDRV9JRCgpOwogICAgICAgIHN0cnVjdCBvYmplY3Rfc3VyZmFjZSAqb2JqX3N1cmZhY2UgPSBTVVJGQUNFKHN1cmZhY2VJRCk7CgogICAgICAgIGlmIChOVUxMID09IG9ial9zdXJmYWNlKSB7CiAgICAgICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX0FMTE9DQVRJT05fRkFJTEVEOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHN1cmZhY2VzW2ldID0gc3VyZmFjZUlEOwogICAgICAgIG9ial9zdXJmYWNlLT5zdGF0dXMgPSBWQVN1cmZhY2VSZWFkeTsKICAgICAgICBvYmpfc3VyZmFjZS0+c3VicGljID0gVkFfSU5WQUxJRF9JRDsKICAgICAgICBvYmpfc3VyZmFjZS0+b3JpZ193aWR0aCA9IHdpZHRoOwogICAgICAgIG9ial9zdXJmYWNlLT5vcmlnX2hlaWdodCA9IGhlaWdodDsKICAgICAgICBvYmpfc3VyZmFjZS0+d2lkdGggPSBBTElHTihvYmpfc3VyZmFjZS0+b3JpZ193aWR0aCwgMTYpOwogICAgICAgIG9ial9zdXJmYWNlLT5oZWlnaHQgPSBBTElHTihvYmpfc3VyZmFjZS0+b3JpZ19oZWlnaHQsIDE2KTsKICAgICAgICBvYmpfc3VyZmFjZS0+c2l6ZSA9IFNJWkVfWVVWNDIwKG9ial9zdXJmYWNlLT53aWR0aCwgb2JqX3N1cmZhY2UtPmhlaWdodCk7CiAgICAgICAgb2JqX3N1cmZhY2UtPmZsYWdzID0gU1VSRkFDRV9SRUZFUkVOQ0VEOwogICAgICAgIG9ial9zdXJmYWNlLT5ibyA9IE5VTEw7CiAgICAgICAgb2JqX3N1cmZhY2UtPnByaXZhdGVfZGF0YSA9IE5VTEw7CiAgICAgICAgb2JqX3N1cmZhY2UtPmZyZWVfcHJpdmF0ZV9kYXRhID0gTlVMTDsKICAgIH0KCiAgICAvKiBFcnJvciByZWNvdmVyeSAqLwogICAgaWYgKFZBX1NUQVRVU19TVUNDRVNTICE9IHZhU3RhdHVzKSB7CiAgICAgICAgLyogc3VyZmFjZXNbaS0xXSB3YXMgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBhbGxvY2F0aW9uICovCiAgICAgICAgZm9yICg7IGktLTsgKSB7CiAgICAgICAgICAgIHN0cnVjdCBvYmplY3Rfc3VyZmFjZSAqb2JqX3N1cmZhY2UgPSBTVVJGQUNFKHN1cmZhY2VzW2ldKTsKCiAgICAgICAgICAgIHN1cmZhY2VzW2ldID0gVkFfSU5WQUxJRF9TVVJGQUNFOwogICAgICAgICAgICBhc3NlcnQob2JqX3N1cmZhY2UpOwogICAgICAgICAgICBpOTY1X2Rlc3Ryb3lfc3VyZmFjZSgmaTk2NS0+c3VyZmFjZV9oZWFwLCAoc3RydWN0IG9iamVjdF9iYXNlICopb2JqX3N1cmZhY2UpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdmFTdGF0dXM7Cn0KClZBU3RhdHVzIAppOTY1X0Rlc3Ryb3lTdXJmYWNlcyhWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgKnN1cmZhY2VfbGlzdCwKICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9zdXJmYWNlcykKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBpbnQgaTsKCiAgICBmb3IgKGkgPSBudW1fc3VyZmFjZXM7IGktLTsgKSB7CiAgICAgICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZSA9IFNVUkZBQ0Uoc3VyZmFjZV9saXN0W2ldKTsKCiAgICAgICAgYXNzZXJ0KG9ial9zdXJmYWNlKTsKICAgICAgICBpOTY1X2Rlc3Ryb3lfc3VyZmFjZSgmaTk2NS0+c3VyZmFjZV9oZWFwLCAoc3RydWN0IG9iamVjdF9iYXNlICopb2JqX3N1cmZhY2UpOwogICAgfQoKICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKfQoKVkFTdGF0dXMgCmk5NjVfUXVlcnlJbWFnZUZvcm1hdHMoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgVkFJbWFnZUZvcm1hdCAqZm9ybWF0X2xpc3QsICAgICAgLyogb3V0ICovCiAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1fZm9ybWF0cykgICAgICAgICAgICAgICAgLyogb3V0ICovCnsKICAgIGludCBuOwoKICAgIGZvciAobiA9IDA7IGk5NjVfaW1hZ2VfZm9ybWF0c19tYXBbbl0udmFfZm9ybWF0LmZvdXJjYyAhPSAwOyBuKyspIHsKICAgICAgICBjb25zdCBpOTY1X2ltYWdlX2Zvcm1hdF9tYXBfdCAqIGNvbnN0IG0gPSAmaTk2NV9pbWFnZV9mb3JtYXRzX21hcFtuXTsKICAgICAgICBpZiAoZm9ybWF0X2xpc3QpCiAgICAgICAgICAgIGZvcm1hdF9saXN0W25dID0gbS0+dmFfZm9ybWF0OwogICAgfQoKICAgIGlmIChudW1fZm9ybWF0cykKICAgICAgICAqbnVtX2Zvcm1hdHMgPSBuOwoKICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKfQoKVkFTdGF0dXMgCmk5NjVfUHV0SW1hZ2UoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgc3VyZmFjZSwKICAgICAgICAgICAgICBWQUltYWdlSUQgaW1hZ2UsCiAgICAgICAgICAgICAgaW50IHNyY194LAogICAgICAgICAgICAgIGludCBzcmNfeSwKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3JjX3dpZHRoLAogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcmNfaGVpZ2h0LAogICAgICAgICAgICAgIGludCBkZXN0X3gsCiAgICAgICAgICAgICAgaW50IGRlc3RfeSwKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF93aWR0aCwKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVzdF9oZWlnaHQpCnsKICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKfQoKVkFTdGF0dXMgCmk5NjVfUXVlcnlTdWJwaWN0dXJlRm9ybWF0cyhWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBSW1hZ2VGb3JtYXQgKmZvcm1hdF9saXN0LCAgICAgICAgIC8qIG91dCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpmbGFncywgICAgICAgICAgICAgICAgLyogb3V0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9mb3JtYXRzKSAgICAgICAgICAvKiBvdXQgKi8KewogICAgaW50IG47CgogICAgZm9yIChuID0gMDsgaTk2NV9zdWJwaWNfZm9ybWF0c19tYXBbbl0udmFfZm9ybWF0LmZvdXJjYyAhPSAwOyBuKyspIHsKICAgICAgICBjb25zdCBpOTY1X3N1YnBpY19mb3JtYXRfbWFwX3QgKiBjb25zdCBtID0gJmk5NjVfc3VicGljX2Zvcm1hdHNfbWFwW25dOwogICAgICAgIGlmIChmb3JtYXRfbGlzdCkKICAgICAgICAgICAgZm9ybWF0X2xpc3Rbbl0gPSBtLT52YV9mb3JtYXQ7CiAgICAgICAgaWYgKGZsYWdzKQogICAgICAgICAgICBmbGFnc1tuXSA9IG0tPnZhX2ZsYWdzOwogICAgfQoKICAgIGlmIChudW1fZm9ybWF0cykKICAgICAgICAqbnVtX2Zvcm1hdHMgPSBuOwoKICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKfQoKc3RhdGljIHZvaWQgCmk5NjVfZGVzdHJveV9zdWJwaWMoc3RydWN0IG9iamVjdF9oZWFwICpoZWFwLCBzdHJ1Y3Qgb2JqZWN0X2Jhc2UgKm9iaikKewovLyAgICBzdHJ1Y3Qgb2JqZWN0X3N1YnBpYyAqb2JqX3N1YnBpYyA9IChzdHJ1Y3Qgb2JqZWN0X3N1YnBpYyAqKW9iajsKCiAgICBvYmplY3RfaGVhcF9mcmVlKGhlYXAsIG9iaik7Cn0KClZBU3RhdHVzIAppOTY1X0NyZWF0ZVN1YnBpY3R1cmUoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICBWQUltYWdlSUQgaW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICBWQVN1YnBpY3R1cmVJRCAqc3VicGljdHVyZSkgICAgICAgICAvKiBvdXQgKi8KewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBWQVN1YnBpY3R1cmVJRCBzdWJwaWNJRCA9IE5FV19TVUJQSUNfSUQoKQoJCiAgICAgICAgc3RydWN0IG9iamVjdF9zdWJwaWMgKm9ial9zdWJwaWMgPSBTVUJQSUMoc3VicGljSUQpOwogICAgaWYgKCFvYmpfc3VicGljKQogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfQUxMT0NBVElPTl9GQUlMRUQ7CgogICAgc3RydWN0IG9iamVjdF9pbWFnZSAqb2JqX2ltYWdlID0gSU1BR0UoaW1hZ2UpOwogICAgaWYgKCFvYmpfaW1hZ2UpCiAgICAgICAgcmV0dXJuIFZBX1NUQVRVU19FUlJPUl9JTlZBTElEX0lNQUdFOwoKICAgIGNvbnN0IGk5NjVfc3VicGljX2Zvcm1hdF9tYXBfdCAqIGNvbnN0IG0gPSBnZXRfc3VicGljX2Zvcm1hdCgmb2JqX2ltYWdlLT5pbWFnZS5mb3JtYXQpOwogICAgaWYgKCFtKQogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfVU5LTk9XTjsgLyogWFhYOiBWQV9TVEFUVVNfRVJST1JfVU5TVVBQT1JURURfRk9STUFUPyAqLwoKICAgICpzdWJwaWN0dXJlID0gc3VicGljSUQ7CiAgICBvYmpfc3VicGljLT5pbWFnZSAgPSBpbWFnZTsKICAgIG9ial9zdWJwaWMtPmZvcm1hdCA9IG0tPmZvcm1hdDsKICAgIG9ial9zdWJwaWMtPndpZHRoICA9IG9ial9pbWFnZS0+aW1hZ2Uud2lkdGg7CiAgICBvYmpfc3VicGljLT5oZWlnaHQgPSBvYmpfaW1hZ2UtPmltYWdlLmhlaWdodDsKICAgIG9ial9zdWJwaWMtPnBpdGNoICA9IG9ial9pbWFnZS0+aW1hZ2UucGl0Y2hlc1swXTsKICAgIG9ial9zdWJwaWMtPmJvICAgICA9IG9ial9pbWFnZS0+Ym87CiAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7Cn0KClZBU3RhdHVzIAppOTY1X0Rlc3Ryb3lTdWJwaWN0dXJlKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgIFZBU3VicGljdHVyZUlEIHN1YnBpY3R1cmUpCnsKCQogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3Qgb2JqZWN0X3N1YnBpYyAqb2JqX3N1YnBpYyA9IFNVQlBJQyhzdWJwaWN0dXJlKTsKICAgIGk5NjVfZGVzdHJveV9zdWJwaWMoJmk5NjUtPnN1YnBpY19oZWFwLCAoc3RydWN0IG9iamVjdF9iYXNlICopb2JqX3N1YnBpYyk7CiAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7Cn0KClZBU3RhdHVzIAppOTY1X1NldFN1YnBpY3R1cmVJbWFnZShWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgVkFTdWJwaWN0dXJlSUQgc3VicGljdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgVkFJbWFnZUlEIGltYWdlKQp7CiAgICAvKiBUT0RPICovCiAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX1VOSU1QTEVNRU5URUQ7Cn0KClZBU3RhdHVzIAppOTY1X1NldFN1YnBpY3R1cmVDaHJvbWFrZXkoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVN1YnBpY3R1cmVJRCBzdWJwaWN0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNocm9tYWtleV9taW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hyb21ha2V5X21heCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaHJvbWFrZXlfbWFzaykKewogICAgLyogVE9ETyAqLwogICAgcmV0dXJuIFZBX1NUQVRVU19FUlJPUl9VTklNUExFTUVOVEVEOwp9CgpWQVN0YXR1cyAKaTk2NV9TZXRTdWJwaWN0dXJlR2xvYmFsQWxwaGEoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBU3VicGljdHVyZUlEIHN1YnBpY3R1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGdsb2JhbF9hbHBoYSkKewogICAgLyogVE9ETyAqLwogICAgcmV0dXJuIFZBX1NUQVRVU19FUlJPUl9VTklNUExFTUVOVEVEOwp9CgpWQVN0YXR1cyAKaTk2NV9Bc3NvY2lhdGVTdWJwaWN0dXJlKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgVkFTdWJwaWN0dXJlSUQgc3VicGljdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFZBU3VyZmFjZUlEICp0YXJnZXRfc3VyZmFjZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3N1cmZhY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc3JjX3gsIC8qIHVwcGVyIGxlZnQgb2Zmc2V0IGluIHN1YnBpY3R1cmUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHNyY195LAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGRlc3RfeCwgLyogdXBwZXIgbGVmdCBvZmZzZXQgaW4gc3VyZmFjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgZGVzdF95LAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVzdF93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlc3RfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZXRoZXIgdG8gZW5hYmxlIGNocm9tYS1rZXlpbmcgb3IgZ2xvYmFsLWFscGhhCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZWUgVkFfU1VCUElDVFVSRV9YWFggdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3Qgb2JqZWN0X3N1YnBpYyAqb2JqX3N1YnBpYyA9IFNVQlBJQyhzdWJwaWN0dXJlKTsKICAgIGludCBpOwoKICAgIG9ial9zdWJwaWMtPnNyY19yZWN0LnggICAgICA9IHNyY194OwogICAgb2JqX3N1YnBpYy0+c3JjX3JlY3QueSAgICAgID0gc3JjX3k7CiAgICBvYmpfc3VicGljLT5zcmNfcmVjdC53aWR0aCAgPSBzcmNfd2lkdGg7CiAgICBvYmpfc3VicGljLT5zcmNfcmVjdC5oZWlnaHQgPSBzcmNfaGVpZ2h0OwogICAgb2JqX3N1YnBpYy0+ZHN0X3JlY3QueCAgICAgID0gZGVzdF94OwogICAgb2JqX3N1YnBpYy0+ZHN0X3JlY3QueSAgICAgID0gZGVzdF95OwogICAgb2JqX3N1YnBpYy0+ZHN0X3JlY3Qud2lkdGggID0gZGVzdF93aWR0aDsKICAgIG9ial9zdWJwaWMtPmRzdF9yZWN0LmhlaWdodCA9IGRlc3RfaGVpZ2h0OwoKICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3VyZmFjZXM7IGkrKykgewogICAgICAgIHN0cnVjdCBvYmplY3Rfc3VyZmFjZSAqb2JqX3N1cmZhY2UgPSBTVVJGQUNFKHRhcmdldF9zdXJmYWNlc1tpXSk7CiAgICAgICAgaWYgKCFvYmpfc3VyZmFjZSkKICAgICAgICAgICAgcmV0dXJuIFZBX1NUQVRVU19FUlJPUl9JTlZBTElEX1NVUkZBQ0U7CiAgICAgICAgb2JqX3N1cmZhY2UtPnN1YnBpYyA9IHN1YnBpY3R1cmU7CiAgICB9CiAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7Cn0KCgpWQVN0YXR1cyAKaTk2NV9EZWFzc29jaWF0ZVN1YnBpY3R1cmUoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBU3VicGljdHVyZUlEIHN1YnBpY3R1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBU3VyZmFjZUlEICp0YXJnZXRfc3VyZmFjZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fc3VyZmFjZXMpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgaW50IGk7CgogICAgZm9yIChpID0gMDsgaSA8IG51bV9zdXJmYWNlczsgaSsrKSB7CiAgICAgICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZSA9IFNVUkZBQ0UodGFyZ2V0X3N1cmZhY2VzW2ldKTsKICAgICAgICBpZiAoIW9ial9zdXJmYWNlKQogICAgICAgICAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX0lOVkFMSURfU1VSRkFDRTsKICAgICAgICBpZiAob2JqX3N1cmZhY2UtPnN1YnBpYyA9PSBzdWJwaWN0dXJlKQogICAgICAgICAgICBvYmpfc3VyZmFjZS0+c3VicGljID0gVkFfSU5WQUxJRF9JRDsKICAgIH0KICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKfQoKc3RhdGljIHZvaWQKaTk2NV9yZWZlcmVuY2VfYnVmZmVyX3N0b3JlKHN0cnVjdCBidWZmZXJfc3RvcmUgKipwdHIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9zdG9yZSAqYnVmZmVyX3N0b3JlKQp7CiAgICBhc3NlcnQoKnB0ciA9PSBOVUxMKTsKCiAgICBpZiAoYnVmZmVyX3N0b3JlKSB7CiAgICAgICAgYnVmZmVyX3N0b3JlLT5yZWZfY291bnQrKzsKICAgICAgICAqcHRyID0gYnVmZmVyX3N0b3JlOwogICAgfQp9CgpzdGF0aWMgdm9pZCAKaTk2NV9yZWxlYXNlX2J1ZmZlcl9zdG9yZShzdHJ1Y3QgYnVmZmVyX3N0b3JlICoqcHRyKQp7CiAgICBzdHJ1Y3QgYnVmZmVyX3N0b3JlICpidWZmZXJfc3RvcmUgPSAqcHRyOwoKICAgIGlmIChidWZmZXJfc3RvcmUgPT0gTlVMTCkKICAgICAgICByZXR1cm47CgogICAgYXNzZXJ0KGJ1ZmZlcl9zdG9yZS0+Ym8gfHwgYnVmZmVyX3N0b3JlLT5idWZmZXIpOwogICAgYXNzZXJ0KCEoYnVmZmVyX3N0b3JlLT5ibyAmJiBidWZmZXJfc3RvcmUtPmJ1ZmZlcikpOwogICAgYnVmZmVyX3N0b3JlLT5yZWZfY291bnQtLTsKICAgIAogICAgaWYgKGJ1ZmZlcl9zdG9yZS0+cmVmX2NvdW50ID09IDApIHsKICAgICAgICBkcmlfYm9fdW5yZWZlcmVuY2UoYnVmZmVyX3N0b3JlLT5ibyk7CiAgICAgICAgZnJlZShidWZmZXJfc3RvcmUtPmJ1ZmZlcik7CiAgICAgICAgYnVmZmVyX3N0b3JlLT5ibyA9IE5VTEw7CiAgICAgICAgYnVmZmVyX3N0b3JlLT5idWZmZXIgPSBOVUxMOwogICAgICAgIGZyZWUoYnVmZmVyX3N0b3JlKTsKICAgIH0KCiAgICAqcHRyID0gTlVMTDsKfQoKc3RhdGljIHZvaWQgCmk5NjVfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBvYmplY3RfaGVhcCAqaGVhcCwgc3RydWN0IG9iamVjdF9iYXNlICpvYmopCnsKICAgIHN0cnVjdCBvYmplY3RfY29udGV4dCAqb2JqX2NvbnRleHQgPSAoc3RydWN0IG9iamVjdF9jb250ZXh0ICopb2JqOwogICAgaW50IGk7CgogICAgYXNzZXJ0KG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubnVtX3NsaWNlX3BhcmFtcyA8PSBvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLm1heF9zbGljZV9wYXJhbXMpOwogICAgYXNzZXJ0KG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubnVtX3NsaWNlX2RhdGFzIDw9IG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubWF4X3NsaWNlX2RhdGFzKTsKCiAgICBpOTY1X3JlbGVhc2VfYnVmZmVyX3N0b3JlKCZvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLnBpY19wYXJhbSk7CiAgICBpOTY1X3JlbGVhc2VfYnVmZmVyX3N0b3JlKCZvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLmlxX21hdHJpeCk7CiAgICBpOTY1X3JlbGVhc2VfYnVmZmVyX3N0b3JlKCZvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLmJpdF9wbGFuZSk7CgogICAgZm9yIChpID0gMDsgaSA8IG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubnVtX3NsaWNlX3BhcmFtczsgaSsrKQogICAgICAgIGk5NjVfcmVsZWFzZV9idWZmZXJfc3RvcmUoJm9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUuc2xpY2VfcGFyYW1zW2ldKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgb2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5udW1fc2xpY2VfZGF0YXM7IGkrKykKICAgICAgICBpOTY1X3JlbGVhc2VfYnVmZmVyX3N0b3JlKCZvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLnNsaWNlX2RhdGFzW2ldKTsKCiAgICBmcmVlKG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUuc2xpY2VfcGFyYW1zKTsKICAgIGZyZWUob2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5zbGljZV9kYXRhcyk7CiAgICBmcmVlKG9ial9jb250ZXh0LT5yZW5kZXJfdGFyZ2V0cyk7CiAgICBvYmplY3RfaGVhcF9mcmVlKGhlYXAsIG9iaik7Cn0KClZBU3RhdHVzIAppOTY1X0NyZWF0ZUNvbnRleHQoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICBWQUNvbmZpZ0lEIGNvbmZpZ19pZCwKICAgICAgICAgICAgICAgICAgIGludCBwaWN0dXJlX3dpZHRoLAogICAgICAgICAgICAgICAgICAgaW50IHBpY3R1cmVfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgaW50IGZsYWcsCiAgICAgICAgICAgICAgICAgICBWQVN1cmZhY2VJRCAqcmVuZGVyX3RhcmdldHMsCiAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3JlbmRlcl90YXJnZXRzLAogICAgICAgICAgICAgICAgICAgVkFDb250ZXh0SUQgKmNvbnRleHQpICAgICAgICAgICAgICAgIC8qIG91dCAqLwp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBpOTY1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyX3N0YXRlID0gJmk5NjUtPnJlbmRlcl9zdGF0ZTsKICAgIHN0cnVjdCBvYmplY3RfY29uZmlnICpvYmpfY29uZmlnID0gQ09ORklHKGNvbmZpZ19pZCk7CiAgICBzdHJ1Y3Qgb2JqZWN0X2NvbnRleHQgKm9ial9jb250ZXh0ID0gTlVMTDsKICAgIFZBU3RhdHVzIHZhU3RhdHVzID0gVkFfU1RBVFVTX1NVQ0NFU1M7CiAgICBpbnQgY29udGV4dElEOwogICAgaW50IGk7CgogICAgaWYgKE5VTEwgPT0gb2JqX2NvbmZpZykgewogICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX0lOVkFMSURfQ09ORklHOwogICAgICAgIHJldHVybiB2YVN0YXR1czsKICAgIH0KCiAgICAvKiBWYWxpZGF0ZSBmbGFnICovCiAgICAvKiBWYWxpZGF0ZSBwaWN0dXJlIGRpbWVuc2lvbnMgKi8KICAgIGNvbnRleHRJRCA9IE5FV19DT05URVhUX0lEKCk7CiAgICBvYmpfY29udGV4dCA9IENPTlRFWFQoY29udGV4dElEKTsKCiAgICBpZiAoTlVMTCA9PSBvYmpfY29udGV4dCkgewogICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX0FMTE9DQVRJT05fRkFJTEVEOwogICAgICAgIHJldHVybiB2YVN0YXR1czsKICAgIH0KCiAgICBzd2l0Y2ggKG9ial9jb25maWctPnByb2ZpbGUpIHsKICAgIGNhc2UgVkFQcm9maWxlSDI2NEJhc2VsaW5lOgogICAgY2FzZSBWQVByb2ZpbGVIMjY0TWFpbjoKICAgIGNhc2UgVkFQcm9maWxlSDI2NEhpZ2g6CiAgICAgICAgcmVuZGVyX3N0YXRlLT5pbnRlcmxlYXZlZF91diA9IDE7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHJlbmRlcl9zdGF0ZS0+aW50ZXJsZWF2ZWRfdXYgPSAwOwogICAgfQoKICAgIG9ial9jb250ZXh0LT5jb250ZXh0X2lkID0gY29udGV4dElEOwogICAgKmNvbnRleHQgPSBjb250ZXh0SUQ7CiAgICBtZW1zZXQoJm9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUsIDAsIHNpemVvZihvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlKSk7CiAgICBvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLmN1cnJlbnRfcmVuZGVyX3RhcmdldCA9IC0xOwogICAgb2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5tYXhfc2xpY2VfcGFyYW1zID0gTlVNX1NMSUNFUzsKICAgIG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubWF4X3NsaWNlX2RhdGFzID0gTlVNX1NMSUNFUzsKICAgIG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUuc2xpY2VfcGFyYW1zID0gY2FsbG9jKG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubWF4X3NsaWNlX3BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqb2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5zbGljZV9wYXJhbXMpKTsKICAgIG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUuc2xpY2VfZGF0YXMgPSBjYWxsb2Mob2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5tYXhfc2xpY2VfZGF0YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqb2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5zbGljZV9kYXRhcykpOwogICAgb2JqX2NvbnRleHQtPmNvbmZpZ19pZCA9IGNvbmZpZ19pZDsKICAgIG9ial9jb250ZXh0LT5waWN0dXJlX3dpZHRoID0gcGljdHVyZV93aWR0aDsKICAgIG9ial9jb250ZXh0LT5waWN0dXJlX2hlaWdodCA9IHBpY3R1cmVfaGVpZ2h0OwogICAgb2JqX2NvbnRleHQtPm51bV9yZW5kZXJfdGFyZ2V0cyA9IG51bV9yZW5kZXJfdGFyZ2V0czsKICAgIG9ial9jb250ZXh0LT5yZW5kZXJfdGFyZ2V0cyA9IAogICAgICAgIChWQVN1cmZhY2VJRCAqKWNhbGxvYyhudW1fcmVuZGVyX3RhcmdldHMsIHNpemVvZihWQVN1cmZhY2VJRCkpOwoKICAgIGZvcihpID0gMDsgaSA8IG51bV9yZW5kZXJfdGFyZ2V0czsgaSsrKSB7CiAgICAgICAgaWYgKE5VTEwgPT0gU1VSRkFDRShyZW5kZXJfdGFyZ2V0c1tpXSkpIHsKICAgICAgICAgICAgdmFTdGF0dXMgPSBWQV9TVEFUVVNfRVJST1JfSU5WQUxJRF9TVVJGQUNFOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIG9ial9jb250ZXh0LT5yZW5kZXJfdGFyZ2V0c1tpXSA9IHJlbmRlcl90YXJnZXRzW2ldOwogICAgfQoKICAgIG9ial9jb250ZXh0LT5mbGFncyA9IGZsYWc7CgogICAgLyogRXJyb3IgcmVjb3ZlcnkgKi8KICAgIGlmIChWQV9TVEFUVVNfU1VDQ0VTUyAhPSB2YVN0YXR1cykgewogICAgICAgIGk5NjVfZGVzdHJveV9jb250ZXh0KCZpOTY1LT5jb250ZXh0X2hlYXAsIChzdHJ1Y3Qgb2JqZWN0X2Jhc2UgKilvYmpfY29udGV4dCk7CiAgICB9CgogICAgcmV0dXJuIHZhU3RhdHVzOwp9CgpWQVN0YXR1cyAKaTk2NV9EZXN0cm95Q29udGV4dChWQURyaXZlckNvbnRleHRQIGN0eCwgVkFDb250ZXh0SUQgY29udGV4dCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3Qgb2JqZWN0X2NvbnRleHQgKm9ial9jb250ZXh0ID0gQ09OVEVYVChjb250ZXh0KTsKCiAgICBhc3NlcnQob2JqX2NvbnRleHQpOwogICAgaTk2NV9kZXN0cm95X2NvbnRleHQoJmk5NjUtPmNvbnRleHRfaGVhcCwgKHN0cnVjdCBvYmplY3RfYmFzZSAqKW9ial9jb250ZXh0KTsKCiAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7Cn0KCnN0YXRpYyB2b2lkIAppOTY1X2Rlc3Ryb3lfYnVmZmVyKHN0cnVjdCBvYmplY3RfaGVhcCAqaGVhcCwgc3RydWN0IG9iamVjdF9iYXNlICpvYmopCnsKICAgIHN0cnVjdCBvYmplY3RfYnVmZmVyICpvYmpfYnVmZmVyID0gKHN0cnVjdCBvYmplY3RfYnVmZmVyICopb2JqOwoKICAgIGFzc2VydChvYmpfYnVmZmVyLT5idWZmZXJfc3RvcmUpOwogICAgaTk2NV9yZWxlYXNlX2J1ZmZlcl9zdG9yZSgmb2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlKTsKICAgIG9iamVjdF9oZWFwX2ZyZWUoaGVhcCwgb2JqKTsKfQoKVkFTdGF0dXMgCmk5NjVfQ3JlYXRlQnVmZmVyKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICBWQUNvbnRleHRJRCBjb250ZXh0LCAgICAgICAgICAvKiBpbiAqLwogICAgICAgICAgICAgICAgICBWQUJ1ZmZlclR5cGUgdHlwZSwgICAgICAgICAgICAvKiBpbiAqLwogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgICAgICAgICAgICAvKiBpbiAqLwogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2VsZW1lbnRzLCAgICAvKiBpbiAqLwogICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCAgICAgICAgICAgICAgICAgICAvKiBpbiAqLwogICAgICAgICAgICAgICAgICBWQUJ1ZmZlcklEICpidWZfaWQpICAgICAgICAgICAvKiBvdXQgKi8KewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3Qgb2JqZWN0X2J1ZmZlciAqb2JqX2J1ZmZlciA9IE5VTEw7CiAgICBzdHJ1Y3QgYnVmZmVyX3N0b3JlICpidWZmZXJfc3RvcmUgPSBOVUxMOwogICAgaW50IGJ1ZmZlcklEOwoKICAgIC8qIFZhbGlkYXRlIHR5cGUgKi8KICAgIHN3aXRjaCAodHlwZSkgewogICAgY2FzZSBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJUeXBlOgogICAgY2FzZSBWQUlRTWF0cml4QnVmZmVyVHlwZToKICAgIGNhc2UgVkFCaXRQbGFuZUJ1ZmZlclR5cGU6CiAgICBjYXNlIFZBU2xpY2VHcm91cE1hcEJ1ZmZlclR5cGU6CiAgICBjYXNlIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJUeXBlOgogICAgY2FzZSBWQVNsaWNlRGF0YUJ1ZmZlclR5cGU6CiAgICBjYXNlIFZBTWFjcm9ibG9ja1BhcmFtZXRlckJ1ZmZlclR5cGU6CiAgICBjYXNlIFZBUmVzaWR1YWxEYXRhQnVmZmVyVHlwZToKICAgIGNhc2UgVkFEZWJsb2NraW5nUGFyYW1ldGVyQnVmZmVyVHlwZToKICAgIGNhc2UgVkFJbWFnZUJ1ZmZlclR5cGU6CiAgICAgICAgLyogT2sgKi8KICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfVU5TVVBQT1JURURfQlVGRkVSVFlQRTsKICAgIH0KCiAgICBidWZmZXJJRCA9IE5FV19CVUZGRVJfSUQoKTsKICAgIG9ial9idWZmZXIgPSBCVUZGRVIoYnVmZmVySUQpOwoKICAgIGlmIChOVUxMID09IG9ial9idWZmZXIpIHsKICAgICAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX0FMTE9DQVRJT05fRkFJTEVEOwogICAgfQoKICAgIG9ial9idWZmZXItPm1heF9udW1fZWxlbWVudHMgPSBudW1fZWxlbWVudHM7CiAgICBvYmpfYnVmZmVyLT5udW1fZWxlbWVudHMgPSBudW1fZWxlbWVudHM7CiAgICBvYmpfYnVmZmVyLT5zaXplX2VsZW1lbnQgPSBzaXplOwogICAgb2JqX2J1ZmZlci0+dHlwZSA9IHR5cGU7CiAgICBvYmpfYnVmZmVyLT5idWZmZXJfc3RvcmUgPSBOVUxMOwogICAgYnVmZmVyX3N0b3JlID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgYnVmZmVyX3N0b3JlKSk7CiAgICBhc3NlcnQoYnVmZmVyX3N0b3JlKTsKICAgIGJ1ZmZlcl9zdG9yZS0+cmVmX2NvdW50ID0gMTsKCiAgICBpZiAodHlwZSA9PSBWQVNsaWNlRGF0YUJ1ZmZlclR5cGUgfHwgdHlwZSA9PSBWQUltYWdlQnVmZmVyVHlwZSkgewogICAgICAgIGJ1ZmZlcl9zdG9yZS0+Ym8gPSBkcmlfYm9fYWxsb2MoaTk2NS0+aW50ZWwuYnVmbWdyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWZmZXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKiBudW1fZWxlbWVudHMsIDY0KTsKICAgICAgICBhc3NlcnQoYnVmZmVyX3N0b3JlLT5ibyk7CgogICAgICAgIGlmIChkYXRhKQogICAgICAgICAgICBkcmlfYm9fc3ViZGF0YShidWZmZXJfc3RvcmUtPmJvLCAwLCBzaXplICogbnVtX2VsZW1lbnRzLCBkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgICAgYnVmZmVyX3N0b3JlLT5idWZmZXIgPSBtYWxsb2Moc2l6ZSAqIG51bV9lbGVtZW50cyk7CiAgICAgICAgYXNzZXJ0KGJ1ZmZlcl9zdG9yZS0+YnVmZmVyKTsKCiAgICAgICAgaWYgKGRhdGEpCiAgICAgICAgICAgIG1lbWNweShidWZmZXJfc3RvcmUtPmJ1ZmZlciwgZGF0YSwgc2l6ZSAqIG51bV9lbGVtZW50cyk7CiAgICB9CgogICAgYnVmZmVyX3N0b3JlLT5udW1fZWxlbWVudHMgPSBvYmpfYnVmZmVyLT5udW1fZWxlbWVudHM7CiAgICBpOTY1X3JlZmVyZW5jZV9idWZmZXJfc3RvcmUoJm9ial9idWZmZXItPmJ1ZmZlcl9zdG9yZSwgYnVmZmVyX3N0b3JlKTsKICAgIGk5NjVfcmVsZWFzZV9idWZmZXJfc3RvcmUoJmJ1ZmZlcl9zdG9yZSk7CiAgICAqYnVmX2lkID0gYnVmZmVySUQ7CgogICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwp9CgoKVkFTdGF0dXMgCmk5NjVfQnVmZmVyU2V0TnVtRWxlbWVudHMoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVkFCdWZmZXJJRCBidWZfaWQsICAgICAgICAgICAvKiBpbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fZWxlbWVudHMpICAgLyogaW4gKi8KewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3Qgb2JqZWN0X2J1ZmZlciAqb2JqX2J1ZmZlciA9IEJVRkZFUihidWZfaWQpOwogICAgVkFTdGF0dXMgdmFTdGF0dXMgPSBWQV9TVEFUVVNfU1VDQ0VTUzsKCiAgICBhc3NlcnQob2JqX2J1ZmZlcik7CgogICAgaWYgKChudW1fZWxlbWVudHMgPCAwKSB8fCAKICAgICAgICAobnVtX2VsZW1lbnRzID4gb2JqX2J1ZmZlci0+bWF4X251bV9lbGVtZW50cykpIHsKICAgICAgICB2YVN0YXR1cyA9IFZBX1NUQVRVU19FUlJPUl9VTktOT1dOOwogICAgfSBlbHNlIHsKICAgICAgICBvYmpfYnVmZmVyLT5udW1fZWxlbWVudHMgPSBudW1fZWxlbWVudHM7CiAgICB9CgogICAgcmV0dXJuIHZhU3RhdHVzOwp9CgpWQVN0YXR1cyAKaTk2NV9NYXBCdWZmZXIoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgIFZBQnVmZmVySUQgYnVmX2lkLCAgICAgICAvKiBpbiAqLwogICAgICAgICAgICAgICB2b2lkICoqcGJ1ZikgICAgICAgICAgICAgLyogb3V0ICovCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IG9iamVjdF9idWZmZXIgKm9ial9idWZmZXIgPSBCVUZGRVIoYnVmX2lkKTsKICAgIFZBU3RhdHVzIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX1VOS05PV047CgogICAgYXNzZXJ0KG9ial9idWZmZXIgJiYgb2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlKTsKICAgIGFzc2VydChvYmpfYnVmZmVyLT5idWZmZXJfc3RvcmUtPmJvIHx8IG9ial9idWZmZXItPmJ1ZmZlcl9zdG9yZS0+YnVmZmVyKTsKICAgIGFzc2VydCghKG9ial9idWZmZXItPmJ1ZmZlcl9zdG9yZS0+Ym8gJiYgb2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlLT5idWZmZXIpKTsKCiAgICBpZiAoTlVMTCAhPSBvYmpfYnVmZmVyLT5idWZmZXJfc3RvcmUtPmJvKSB7CiAgICAgICAgZHJpX2JvX21hcChvYmpfYnVmZmVyLT5idWZmZXJfc3RvcmUtPmJvLCAxKTsKICAgICAgICBhc3NlcnQob2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlLT5iby0+dmlydHVhbCk7CiAgICAgICAgKnBidWYgPSBvYmpfYnVmZmVyLT5idWZmZXJfc3RvcmUtPmJvLT52aXJ0dWFsOwogICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX1NVQ0NFU1M7CiAgICB9IGVsc2UgaWYgKE5VTEwgIT0gb2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlLT5idWZmZXIpIHsKICAgICAgICAqcGJ1ZiA9IG9ial9idWZmZXItPmJ1ZmZlcl9zdG9yZS0+YnVmZmVyOwogICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX1NVQ0NFU1M7CiAgICB9CgogICAgcmV0dXJuIHZhU3RhdHVzOwp9CgpWQVN0YXR1cyAKaTk2NV9Vbm1hcEJ1ZmZlcihWQURyaXZlckNvbnRleHRQIGN0eCwgVkFCdWZmZXJJRCBidWZfaWQpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IG9iamVjdF9idWZmZXIgKm9ial9idWZmZXIgPSBCVUZGRVIoYnVmX2lkKTsKICAgIFZBU3RhdHVzIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX1VOS05PV047CgogICAgYXNzZXJ0KG9ial9idWZmZXIgJiYgb2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlKTsKICAgIGFzc2VydChvYmpfYnVmZmVyLT5idWZmZXJfc3RvcmUtPmJvIHx8IG9ial9idWZmZXItPmJ1ZmZlcl9zdG9yZS0+YnVmZmVyKTsKICAgIGFzc2VydCghKG9ial9idWZmZXItPmJ1ZmZlcl9zdG9yZS0+Ym8gJiYgb2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlLT5idWZmZXIpKTsKCiAgICBpZiAoTlVMTCAhPSBvYmpfYnVmZmVyLT5idWZmZXJfc3RvcmUtPmJvKSB7CiAgICAgICAgZHJpX2JvX3VubWFwKG9ial9idWZmZXItPmJ1ZmZlcl9zdG9yZS0+Ym8pOwogICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX1NVQ0NFU1M7CiAgICB9IGVsc2UgaWYgKE5VTEwgIT0gb2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlLT5idWZmZXIpIHsKICAgICAgICAvKiBEbyBub3RoaW5nICovCiAgICAgICAgdmFTdGF0dXMgPSBWQV9TVEFUVVNfU1VDQ0VTUzsKICAgIH0KCiAgICByZXR1cm4gdmFTdGF0dXM7ICAgIAp9CgpWQVN0YXR1cyAKaTk2NV9EZXN0cm95QnVmZmVyKFZBRHJpdmVyQ29udGV4dFAgY3R4LCBWQUJ1ZmZlcklEIGJ1ZmZlcl9pZCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3Qgb2JqZWN0X2J1ZmZlciAqb2JqX2J1ZmZlciA9IEJVRkZFUihidWZmZXJfaWQpOwoKICAgIGFzc2VydChvYmpfYnVmZmVyKTsKICAgIGk5NjVfZGVzdHJveV9idWZmZXIoJmk5NjUtPmJ1ZmZlcl9oZWFwLCAoc3RydWN0IG9iamVjdF9iYXNlICopb2JqX2J1ZmZlcik7CgogICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwp9CgpWQVN0YXR1cyAKaTk2NV9CZWdpblBpY3R1cmUoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgIFZBQ29udGV4dElEIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgIFZBU3VyZmFjZUlEIHJlbmRlcl90YXJnZXQpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOyAKICAgIHN0cnVjdCBvYmplY3RfY29udGV4dCAqb2JqX2NvbnRleHQgPSBDT05URVhUKGNvbnRleHQpOwogICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZSA9IFNVUkZBQ0UocmVuZGVyX3RhcmdldCk7CiAgICBzdHJ1Y3Qgb2JqZWN0X2NvbmZpZyAqb2JqX2NvbmZpZzsKICAgIFZBQ29udGV4dElEIGNvbmZpZzsKICAgIFZBU3RhdHVzIHZhU3RhdHVzOwoKICAgIGFzc2VydChvYmpfY29udGV4dCk7CiAgICBhc3NlcnQob2JqX3N1cmZhY2UpOwoKICAgIGNvbmZpZyA9IG9ial9jb250ZXh0LT5jb25maWdfaWQ7CiAgICBvYmpfY29uZmlnID0gQ09ORklHKGNvbmZpZyk7CiAgICBhc3NlcnQob2JqX2NvbmZpZyk7CgogICAgc3dpdGNoIChvYmpfY29uZmlnLT5wcm9maWxlKSB7CiAgICBjYXNlIFZBUHJvZmlsZU1QRUcyU2ltcGxlOgogICAgY2FzZSBWQVByb2ZpbGVNUEVHMk1haW46CiAgICAgICAgdmFTdGF0dXMgPSBWQV9TVEFUVVNfU1VDQ0VTUzsKICAgICAgICBicmVhazsKCiAgICBjYXNlIFZBUHJvZmlsZUgyNjRCYXNlbGluZToKICAgIGNhc2UgVkFQcm9maWxlSDI2NE1haW46CiAgICBjYXNlIFZBUHJvZmlsZUgyNjRIaWdoOgogICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX1NVQ0NFU1M7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBhc3NlcnQoMCk7CiAgICAgICAgdmFTdGF0dXMgPSBWQV9TVEFUVVNfRVJST1JfVU5TVVBQT1JURURfUFJPRklMRTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLmN1cnJlbnRfcmVuZGVyX3RhcmdldCA9IHJlbmRlcl90YXJnZXQ7CgogICAgcmV0dXJuIHZhU3RhdHVzOwp9CgpzdGF0aWMgVkFTdGF0dXMKaTk2NV9yZW5kZXJfcGljdHVyZV9wYXJhbWV0ZXJfYnVmZmVyKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9iamVjdF9jb250ZXh0ICpvYmpfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmplY3RfYnVmZmVyICpvYmpfYnVmZmVyKQp7CiAgICBhc3NlcnQob2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlLT5ibyA9PSBOVUxMKTsKICAgIGFzc2VydChvYmpfYnVmZmVyLT5idWZmZXJfc3RvcmUtPmJ1ZmZlcik7CiAgICBpOTY1X3JlbGVhc2VfYnVmZmVyX3N0b3JlKCZvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLnBpY19wYXJhbSk7CiAgICBpOTY1X3JlZmVyZW5jZV9idWZmZXJfc3RvcmUoJm9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUucGljX3BhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9idWZmZXItPmJ1ZmZlcl9zdG9yZSk7CgogICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwp9CgpzdGF0aWMgVkFTdGF0dXMKaTk2NV9yZW5kZXJfaXFfbWF0cml4X2J1ZmZlcihWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb2JqZWN0X2NvbnRleHQgKm9ial9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmplY3RfYnVmZmVyICpvYmpfYnVmZmVyKQp7CiAgICBhc3NlcnQob2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlLT5ibyA9PSBOVUxMKTsKICAgIGFzc2VydChvYmpfYnVmZmVyLT5idWZmZXJfc3RvcmUtPmJ1ZmZlcik7CiAgICBpOTY1X3JlbGVhc2VfYnVmZmVyX3N0b3JlKCZvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLmlxX21hdHJpeCk7CiAgICBpOTY1X3JlZmVyZW5jZV9idWZmZXJfc3RvcmUoJm9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUuaXFfbWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9idWZmZXItPmJ1ZmZlcl9zdG9yZSk7CgogICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwp9CgpzdGF0aWMgVkFTdGF0dXMKaTk2NV9yZW5kZXJfYml0X3BsYW5lX2J1ZmZlcihWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb2JqZWN0X2NvbnRleHQgKm9ial9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmplY3RfYnVmZmVyICpvYmpfYnVmZmVyKQp7CiAgICBhc3NlcnQob2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlLT5ibyA9PSBOVUxMKTsKICAgIGFzc2VydChvYmpfYnVmZmVyLT5idWZmZXJfc3RvcmUtPmJ1ZmZlcik7CiAgICBpOTY1X3JlbGVhc2VfYnVmZmVyX3N0b3JlKCZvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLmJpdF9wbGFuZSk7CiAgICBpOTY1X3JlZmVyZW5jZV9idWZmZXJfc3RvcmUoJm9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUuYml0X3BsYW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9idWZmZXItPmJ1ZmZlcl9zdG9yZSk7CiAgICAKICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKfQoKc3RhdGljIFZBU3RhdHVzCmk5NjVfcmVuZGVyX3NsaWNlX3BhcmFtZXRlcl9idWZmZXIoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9iamVjdF9jb250ZXh0ICpvYmpfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb2JqZWN0X2J1ZmZlciAqb2JqX2J1ZmZlcikKewogICAgYXNzZXJ0KG9ial9idWZmZXItPmJ1ZmZlcl9zdG9yZS0+Ym8gPT0gTlVMTCk7CiAgICBhc3NlcnQob2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlLT5idWZmZXIpOwogICAgCiAgICBpZiAob2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5udW1fc2xpY2VfcGFyYW1zID09IG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubWF4X3NsaWNlX3BhcmFtcykgewogICAgICAgIG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUuc2xpY2VfcGFyYW1zID0gcmVhbGxvYyhvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLnNsaWNlX3BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubWF4X3NsaWNlX3BhcmFtcyArIE5VTV9TTElDRVMpICogc2l6ZW9mKCpvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLnNsaWNlX3BhcmFtcykpOwogICAgICAgIG1lbXNldChvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLnNsaWNlX3BhcmFtcyArIG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubWF4X3NsaWNlX3BhcmFtcywgMCwgTlVNX1NMSUNFUyAqIHNpemVvZigqb2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5zbGljZV9wYXJhbXMpKTsKICAgICAgICBvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLm1heF9zbGljZV9wYXJhbXMgKz0gTlVNX1NMSUNFUzsKICAgIH0KICAgICAgICAKICAgIGk5NjVfcmVsZWFzZV9idWZmZXJfc3RvcmUoJm9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUuc2xpY2VfcGFyYW1zW29ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubnVtX3NsaWNlX3BhcmFtc10pOwogICAgaTk2NV9yZWZlcmVuY2VfYnVmZmVyX3N0b3JlKCZvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLnNsaWNlX3BhcmFtc1tvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLm51bV9zbGljZV9wYXJhbXNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9idWZmZXItPmJ1ZmZlcl9zdG9yZSk7CiAgICBvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLm51bV9zbGljZV9wYXJhbXMrKzsKICAgIAogICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwp9CgpzdGF0aWMgVkFTdGF0dXMKaTk2NV9yZW5kZXJfc2xpY2VfZGF0YV9idWZmZXIoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmplY3RfY29udGV4dCAqb2JqX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmplY3RfYnVmZmVyICpvYmpfYnVmZmVyKQp7CiAgICBhc3NlcnQob2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlLT5idWZmZXIgPT0gTlVMTCk7CiAgICBhc3NlcnQob2JqX2J1ZmZlci0+YnVmZmVyX3N0b3JlLT5ibyk7CgogICAgaWYgKG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubnVtX3NsaWNlX2RhdGFzID09IG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubWF4X3NsaWNlX2RhdGFzKSB7CiAgICAgICAgb2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5zbGljZV9kYXRhcyA9IHJlYWxsb2Mob2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5zbGljZV9kYXRhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5tYXhfc2xpY2VfZGF0YXMgKyBOVU1fU0xJQ0VTKSAqIHNpemVvZigqb2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5zbGljZV9kYXRhcykpOwogICAgICAgIG1lbXNldChvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLnNsaWNlX2RhdGFzICsgb2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5tYXhfc2xpY2VfZGF0YXMsIDAsIE5VTV9TTElDRVMgKiBzaXplb2YoKm9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUuc2xpY2VfZGF0YXMpKTsKICAgICAgICBvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLm1heF9zbGljZV9kYXRhcyArPSBOVU1fU0xJQ0VTOwogICAgfQogICAgICAgIAogICAgaTk2NV9yZWxlYXNlX2J1ZmZlcl9zdG9yZSgmb2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5zbGljZV9kYXRhc1tvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLm51bV9zbGljZV9kYXRhc10pOwogICAgaTk2NV9yZWZlcmVuY2VfYnVmZmVyX3N0b3JlKCZvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLnNsaWNlX2RhdGFzW29ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubnVtX3NsaWNlX2RhdGFzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpfYnVmZmVyLT5idWZmZXJfc3RvcmUpOwogICAgb2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5udW1fc2xpY2VfZGF0YXMrKzsKICAgIAogICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwp9CgpWQVN0YXR1cyAKaTk2NV9SZW5kZXJQaWN0dXJlKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgVkFDb250ZXh0SUQgY29udGV4dCwKICAgICAgICAgICAgICAgICAgIFZBQnVmZmVySUQgKmJ1ZmZlcnMsCiAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2J1ZmZlcnMpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IG9iamVjdF9jb250ZXh0ICpvYmpfY29udGV4dDsKICAgIGludCBpOwogICAgVkFTdGF0dXMgdmFTdGF0dXMgPSBWQV9TVEFUVVNfRVJST1JfVU5LTk9XTjsKCiAgICBvYmpfY29udGV4dCA9IENPTlRFWFQoY29udGV4dCk7CiAgICBhc3NlcnQob2JqX2NvbnRleHQpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYnVmZmVyczsgaSsrKSB7CiAgICAgICAgc3RydWN0IG9iamVjdF9idWZmZXIgKm9ial9idWZmZXIgPSBCVUZGRVIoYnVmZmVyc1tpXSk7CiAgICAgICAgYXNzZXJ0KG9ial9idWZmZXIpOwoKICAgICAgICBzd2l0Y2ggKG9ial9idWZmZXItPnR5cGUpIHsKICAgICAgICBjYXNlIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclR5cGU6CiAgICAgICAgICAgIHZhU3RhdHVzID0gaTk2NV9yZW5kZXJfcGljdHVyZV9wYXJhbWV0ZXJfYnVmZmVyKGN0eCwgb2JqX2NvbnRleHQsIG9ial9idWZmZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgCiAgICAgICAgY2FzZSBWQUlRTWF0cml4QnVmZmVyVHlwZToKICAgICAgICAgICAgdmFTdGF0dXMgPSBpOTY1X3JlbmRlcl9pcV9tYXRyaXhfYnVmZmVyKGN0eCwgb2JqX2NvbnRleHQsIG9ial9idWZmZXIpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBWQUJpdFBsYW5lQnVmZmVyVHlwZToKICAgICAgICAgICAgdmFTdGF0dXMgPSBpOTY1X3JlbmRlcl9iaXRfcGxhbmVfYnVmZmVyKGN0eCwgb2JqX2NvbnRleHQsIG9ial9idWZmZXIpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBWQVNsaWNlUGFyYW1ldGVyQnVmZmVyVHlwZToKICAgICAgICAgICAgdmFTdGF0dXMgPSBpOTY1X3JlbmRlcl9zbGljZV9wYXJhbWV0ZXJfYnVmZmVyKGN0eCwgb2JqX2NvbnRleHQsIG9ial9idWZmZXIpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBWQVNsaWNlRGF0YUJ1ZmZlclR5cGU6CiAgICAgICAgICAgIHZhU3RhdHVzID0gaTk2NV9yZW5kZXJfc2xpY2VfZGF0YV9idWZmZXIoY3R4LCBvYmpfY29udGV4dCwgb2JqX2J1ZmZlcik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHZhU3RhdHVzOwp9CgpWQVN0YXR1cyAKaTk2NV9FbmRQaWN0dXJlKFZBRHJpdmVyQ29udGV4dFAgY3R4LCBWQUNvbnRleHRJRCBjb250ZXh0KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsgCiAgICBzdHJ1Y3Qgb2JqZWN0X2NvbnRleHQgKm9ial9jb250ZXh0ID0gQ09OVEVYVChjb250ZXh0KTsKICAgIHN0cnVjdCBvYmplY3RfY29uZmlnICpvYmpfY29uZmlnOwogICAgVkFDb250ZXh0SUQgY29uZmlnOwogICAgaW50IGk7CgogICAgYXNzZXJ0KG9ial9jb250ZXh0KTsKICAgIGFzc2VydChvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLnBpY19wYXJhbSk7CiAgICBhc3NlcnQob2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5udW1fc2xpY2VfcGFyYW1zID49IDEpOwogICAgYXNzZXJ0KG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubnVtX3NsaWNlX2RhdGFzID49IDEpOwogICAgYXNzZXJ0KG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubnVtX3NsaWNlX3BhcmFtcyA9PSBvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLm51bV9zbGljZV9kYXRhcyk7CgogICAgY29uZmlnID0gb2JqX2NvbnRleHQtPmNvbmZpZ19pZDsKICAgIG9ial9jb25maWcgPSBDT05GSUcoY29uZmlnKTsKICAgIGFzc2VydChvYmpfY29uZmlnKTsKCiAgICBpOTY1X21lZGlhX2RlY29kZV9waWN0dXJlKGN0eCwgb2JqX2NvbmZpZy0+cHJvZmlsZSwgJm9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUpOwogICAgb2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5jdXJyZW50X3JlbmRlcl90YXJnZXQgPSAtMTsKICAgIG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubnVtX3NsaWNlX3BhcmFtcyA9IDA7CiAgICBvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLm51bV9zbGljZV9kYXRhcyA9IDA7CiAgICBpOTY1X3JlbGVhc2VfYnVmZmVyX3N0b3JlKCZvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLnBpY19wYXJhbSk7CiAgICBpOTY1X3JlbGVhc2VfYnVmZmVyX3N0b3JlKCZvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLmlxX21hdHJpeCk7CiAgICBpOTY1X3JlbGVhc2VfYnVmZmVyX3N0b3JlKCZvYmpfY29udGV4dC0+ZGVjb2RlX3N0YXRlLmJpdF9wbGFuZSk7CgogICAgZm9yIChpID0gMDsgaSA8IG9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUubnVtX3NsaWNlX3BhcmFtczsgaSsrKSB7CiAgICAgICAgaTk2NV9yZWxlYXNlX2J1ZmZlcl9zdG9yZSgmb2JqX2NvbnRleHQtPmRlY29kZV9zdGF0ZS5zbGljZV9wYXJhbXNbaV0pOwogICAgICAgIGk5NjVfcmVsZWFzZV9idWZmZXJfc3RvcmUoJm9ial9jb250ZXh0LT5kZWNvZGVfc3RhdGUuc2xpY2VfZGF0YXNbaV0pOwogICAgfQoKICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKfQoKVkFTdGF0dXMgCmk5NjVfU3luY1N1cmZhY2UoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgcmVuZGVyX3RhcmdldCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7IAogICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZSA9IFNVUkZBQ0UocmVuZGVyX3RhcmdldCk7CgogICAgYXNzZXJ0KG9ial9zdXJmYWNlKTsKCiAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7Cn0KClZBU3RhdHVzIAppOTY1X1F1ZXJ5U3VyZmFjZVN0YXR1cyhWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgcmVuZGVyX3RhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgVkFTdXJmYWNlU3RhdHVzICpzdGF0dXMpICAgICAgICAvKiBvdXQgKi8KewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7IAogICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZSA9IFNVUkZBQ0UocmVuZGVyX3RhcmdldCk7CgogICAgYXNzZXJ0KG9ial9zdXJmYWNlKTsKICAgICpzdGF0dXMgPSBvYmpfc3VyZmFjZS0+c3RhdHVzOwoKICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKfQoKCi8qIAogKiBRdWVyeSBkaXNwbGF5IGF0dHJpYnV0ZXMgCiAqIFRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGEgImF0dHJfbGlzdCIgYXJyYXkgdGhhdCBjYW4gaG9sZCBhdAogKiBsZWFzdCB2YU1heE51bURpc3BsYXlBdHRyaWJ1dGVzKCkgZW50cmllcy4gVGhlIGFjdHVhbCBudW1iZXIgb2YgYXR0cmlidXRlcwogKiByZXR1cm5lZCBpbiAiYXR0cl9saXN0IiBpcyByZXR1cm5lZCBpbiAibnVtX2F0dHJpYnV0ZXMiLgogKi8KVkFTdGF0dXMgCmk5NjVfUXVlcnlEaXNwbGF5QXR0cmlidXRlcyhWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBRGlzcGxheUF0dHJpYnV0ZSAqYXR0cl9saXN0LAkvKiBvdXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbnVtX2F0dHJpYnV0ZXMpCQkvKiBvdXQgKi8KewogICAgaWYgKG51bV9hdHRyaWJ1dGVzKQogICAgICAgICpudW1fYXR0cmlidXRlcyA9IDA7CgogICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwp9CgovKiAKICogR2V0IGRpc3BsYXkgYXR0cmlidXRlcyAKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IGF0dHJpYnV0ZSB2YWx1ZXMgaW4gImF0dHJfbGlzdCIuCiAqIE9ubHkgYXR0cmlidXRlcyByZXR1cm5lZCB3aXRoIFZBX0RJU1BMQVlfQVRUUklCX0dFVFRBQkxFIHNldCBpbiB0aGUgImZsYWdzIiBmaWVsZAogKiBmcm9tIHZhUXVlcnlEaXNwbGF5QXR0cmlidXRlcygpIGNhbiBoYXZlIHRoZWlyIHZhbHVlcyByZXRyaWV2ZWQuICAKICovClZBU3RhdHVzIAppOTY1X0dldERpc3BsYXlBdHRyaWJ1dGVzKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgIFZBRGlzcGxheUF0dHJpYnV0ZSAqYXR0cl9saXN0LAkvKiBpbi9vdXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2F0dHJpYnV0ZXMpCnsKICAgIC8qIFRPRE8gKi8KICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfVU5JTVBMRU1FTlRFRDsKfQoKLyogCiAqIFNldCBkaXNwbGF5IGF0dHJpYnV0ZXMgCiAqIE9ubHkgYXR0cmlidXRlcyByZXR1cm5lZCB3aXRoIFZBX0RJU1BMQVlfQVRUUklCX1NFVFRBQkxFIHNldCBpbiB0aGUgImZsYWdzIiBmaWVsZAogKiBmcm9tIHZhUXVlcnlEaXNwbGF5QXR0cmlidXRlcygpIGNhbiBiZSBzZXQuICBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBzZXR0YWJsZSBvciAKICogdGhlIHZhbHVlIGlzIG91dCBvZiByYW5nZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgVkFfU1RBVFVTX0VSUk9SX0FUVFJfTk9UX1NVUFBPUlRFRAogKi8KVkFTdGF0dXMgCmk5NjVfU2V0RGlzcGxheUF0dHJpYnV0ZXMoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVkFEaXNwbGF5QXR0cmlidXRlICphdHRyX2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9hdHRyaWJ1dGVzKQp7CiAgICAvKiBUT0RPICovCiAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX1VOSU1QTEVNRU5URUQ7Cn0KClZBU3RhdHVzIAppOTY1X0RiZ0NvcHlTdXJmYWNlVG9CdWZmZXIoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVN1cmZhY2VJRCBzdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmJ1ZmZlciwgICAgICAgICAgICAgIC8qIG91dCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpzdHJpZGUpICAgICAgIC8qIG91dCAqLwp7CiAgICAvKiBUT0RPICovCiAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX1VOSU1QTEVNRU5URUQ7Cn0KCnN0YXRpYyBWQVN0YXR1cyAKaTk2NV9Jbml0KFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsgCgogICAgaWYgKGludGVsX2RyaXZlcl9pbml0KGN0eCkgPT0gRmFsc2UpCiAgICAgICAgcmV0dXJuIFZBX1NUQVRVU19FUlJPUl9VTktOT1dOOwoKICAgIGlmICghSVNfRzRYKGk5NjUtPmludGVsLmRldmljZV9pZCkgJiYKICAgICAgICAhSVNfSVJPTkxBS0UoaTk2NS0+aW50ZWwuZGV2aWNlX2lkKSkKICAgICAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX1VOS05PV047CgogICAgaWYgKGk5NjVfbWVkaWFfaW5pdChjdHgpID09IEZhbHNlKQogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfVU5LTk9XTjsKCiAgICBpZiAoaTk2NV9yZW5kZXJfaW5pdChjdHgpID09IEZhbHNlKQogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfVU5LTk9XTjsKCiAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfZGVzdHJveV9oZWFwKHN0cnVjdCBvYmplY3RfaGVhcCAqaGVhcCwgCiAgICAgICAgICAgICAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3Qgb2JqZWN0X2hlYXAgKmhlYXAsIHN0cnVjdCBvYmplY3RfYmFzZSAqb2JqZWN0KSkKewogICAgc3RydWN0IG9iamVjdF9iYXNlICpvYmplY3Q7CiAgICBvYmplY3RfaGVhcF9pdGVyYXRvciBpdGVyOyAgICAKCiAgICBvYmplY3QgPSBvYmplY3RfaGVhcF9maXJzdChoZWFwLCAmaXRlcik7CgogICAgd2hpbGUgKG9iamVjdCkgewogICAgICAgIGlmIChmdW5jKQogICAgICAgICAgICBmdW5jKGhlYXAsIG9iamVjdCk7CgogICAgICAgIG9iamVjdCA9IG9iamVjdF9oZWFwX25leHQoaGVhcCwgJml0ZXIpOwogICAgfQoKICAgIG9iamVjdF9oZWFwX2Rlc3Ryb3koaGVhcCk7Cn0KCgpWQVN0YXR1cyAKaTk2NV9EZXN0cm95SW1hZ2UoVkFEcml2ZXJDb250ZXh0UCBjdHgsIFZBSW1hZ2VJRCBpbWFnZSk7CgpWQVN0YXR1cyAKaTk2NV9DcmVhdGVJbWFnZShWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICAgICBWQUltYWdlRm9ybWF0ICpmb3JtYXQsCiAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAogICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgVkFJbWFnZSAqb3V0X2ltYWdlKSAgICAgICAgLyogb3V0ICovCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IG9iamVjdF9pbWFnZSAqb2JqX2ltYWdlOwogICAgVkFTdGF0dXMgdmFfc3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX09QRVJBVElPTl9GQUlMRUQ7CiAgICBWQUltYWdlSUQgaW1hZ2VfaWQ7CiAgICB1bnNpZ25lZCBpbnQgd2lkdGgyLCBoZWlnaHQyLCBzaXplMiwgc2l6ZTsKCiAgICBvdXRfaW1hZ2UtPmltYWdlX2lkID0gVkFfSU5WQUxJRF9JRDsKICAgIG91dF9pbWFnZS0+YnVmICAgICAgPSBWQV9JTlZBTElEX0lEOwoKICAgIGltYWdlX2lkID0gTkVXX0lNQUdFX0lEKCk7CiAgICBpZiAoaW1hZ2VfaWQgPT0gVkFfSU5WQUxJRF9JRCkKICAgICAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX0FMTE9DQVRJT05fRkFJTEVEOwoKICAgIG9ial9pbWFnZSA9IElNQUdFKGltYWdlX2lkKTsKICAgIGlmICghb2JqX2ltYWdlKQogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfQUxMT0NBVElPTl9GQUlMRUQ7CiAgICBvYmpfaW1hZ2UtPmJvICAgICAgICAgPSBOVUxMOwogICAgb2JqX2ltYWdlLT5wYWxldHRlICAgID0gTlVMTDsKCiAgICBWQUltYWdlICogY29uc3QgaW1hZ2UgPSAmb2JqX2ltYWdlLT5pbWFnZTsKICAgIGltYWdlLT5pbWFnZV9pZCAgICAgICA9IGltYWdlX2lkOwogICAgaW1hZ2UtPmJ1ZiAgICAgICAgICAgID0gVkFfSU5WQUxJRF9JRDsKCiAgICBzaXplICAgID0gd2lkdGggKiBoZWlnaHQ7CiAgICB3aWR0aDIgID0gKHdpZHRoICArIDEpIC8gMjsKICAgIGhlaWdodDIgPSAoaGVpZ2h0ICsgMSkgLyAyOwogICAgc2l6ZTIgICA9IHdpZHRoMiAqIGhlaWdodDI7CgogICAgaW1hZ2UtPm51bV9wYWxldHRlX2VudHJpZXMgPSAwOwogICAgaW1hZ2UtPmVudHJ5X2J5dGVzICAgICAgICAgPSAwOwogICAgbWVtc2V0KGltYWdlLT5jb21wb25lbnRfb3JkZXIsIDAsIHNpemVvZihpbWFnZS0+Y29tcG9uZW50X29yZGVyKSk7CgogICAgc3dpdGNoIChmb3JtYXQtPmZvdXJjYykgewogICAgY2FzZSBWQV9GT1VSQ0MoJ0knLCdBJywnNCcsJzQnKToKICAgIGNhc2UgVkFfRk9VUkNDKCdBJywnSScsJzQnLCc0Jyk6CiAgICAgICAgaW1hZ2UtPm51bV9wbGFuZXMgPSAxOwogICAgICAgIGltYWdlLT5waXRjaGVzWzBdID0gd2lkdGg7CiAgICAgICAgaW1hZ2UtPm9mZnNldHNbMF0gPSAwOwogICAgICAgIGltYWdlLT5kYXRhX3NpemUgID0gaW1hZ2UtPm9mZnNldHNbMF0gKyBpbWFnZS0+cGl0Y2hlc1swXSAqIGhlaWdodDsKICAgICAgICBpbWFnZS0+bnVtX3BhbGV0dGVfZW50cmllcyA9IDE2OwogICAgICAgIGltYWdlLT5lbnRyeV9ieXRlcyAgICAgICAgID0gMzsKICAgICAgICBpbWFnZS0+Y29tcG9uZW50X29yZGVyWzBdICA9ICdSJzsKICAgICAgICBpbWFnZS0+Y29tcG9uZW50X29yZGVyWzFdICA9ICdHJzsKICAgICAgICBpbWFnZS0+Y29tcG9uZW50X29yZGVyWzJdICA9ICdCJzsKICAgICAgICBicmVhazsKICAgIGNhc2UgVkFfRk9VUkNDKCdBJywnUicsJ0cnLCdCJyk6CiAgICBjYXNlIFZBX0ZPVVJDQygnQScsJ0InLCdHJywnUicpOgogICAgY2FzZSBWQV9GT1VSQ0MoJ0InLCdHJywnUicsJ0EnKToKICAgIGNhc2UgVkFfRk9VUkNDKCdSJywnRycsJ0InLCdBJyk6CiAgICAgICAgaW1hZ2UtPm51bV9wbGFuZXMgPSAxOwogICAgICAgIGltYWdlLT5waXRjaGVzWzBdID0gd2lkdGggKiA0OwogICAgICAgIGltYWdlLT5vZmZzZXRzWzBdID0gMDsKICAgICAgICBpbWFnZS0+ZGF0YV9zaXplICA9IGltYWdlLT5vZmZzZXRzWzBdICsgaW1hZ2UtPnBpdGNoZXNbMF0gKiBoZWlnaHQ7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFZBX0ZPVVJDQygnWScsJ1YnLCcxJywnMicpOgogICAgICAgIGltYWdlLT5udW1fcGxhbmVzID0gMzsKICAgICAgICBpbWFnZS0+cGl0Y2hlc1swXSA9IHdpZHRoOwogICAgICAgIGltYWdlLT5vZmZzZXRzWzBdID0gMDsKICAgICAgICBpbWFnZS0+cGl0Y2hlc1sxXSA9IHdpZHRoMjsKICAgICAgICBpbWFnZS0+b2Zmc2V0c1sxXSA9IHNpemUgKyBzaXplMjsKICAgICAgICBpbWFnZS0+cGl0Y2hlc1syXSA9IHdpZHRoMjsKICAgICAgICBpbWFnZS0+b2Zmc2V0c1syXSA9IHNpemU7CiAgICAgICAgaW1hZ2UtPmRhdGFfc2l6ZSAgPSBzaXplICsgMiAqIHNpemUyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBWQV9GT1VSQ0MoJ0knLCc0JywnMicsJzAnKToKICAgICAgICBpbWFnZS0+bnVtX3BsYW5lcyA9IDM7CiAgICAgICAgaW1hZ2UtPnBpdGNoZXNbMF0gPSB3aWR0aDsKICAgICAgICBpbWFnZS0+b2Zmc2V0c1swXSA9IDA7CiAgICAgICAgaW1hZ2UtPnBpdGNoZXNbMV0gPSB3aWR0aDI7CiAgICAgICAgaW1hZ2UtPm9mZnNldHNbMV0gPSBzaXplOwogICAgICAgIGltYWdlLT5waXRjaGVzWzJdID0gd2lkdGgyOwogICAgICAgIGltYWdlLT5vZmZzZXRzWzJdID0gc2l6ZSArIHNpemUyOwogICAgICAgIGltYWdlLT5kYXRhX3NpemUgID0gc2l6ZSArIDIgKiBzaXplMjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVkFfRk9VUkNDKCdOJywnVicsJzEnLCcyJyk6CiAgICAgICAgaW1hZ2UtPm51bV9wbGFuZXMgPSAyOwogICAgICAgIGltYWdlLT5waXRjaGVzWzBdID0gd2lkdGg7CiAgICAgICAgaW1hZ2UtPm9mZnNldHNbMF0gPSAwOwogICAgICAgIGltYWdlLT5waXRjaGVzWzFdID0gd2lkdGg7CiAgICAgICAgaW1hZ2UtPm9mZnNldHNbMV0gPSBzaXplOwogICAgICAgIGltYWdlLT5kYXRhX3NpemUgID0gc2l6ZSArIDIgKiBzaXplMjsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgZ290byBlcnJvcjsKICAgIH0KCiAgICB2YV9zdGF0dXMgPSBpOTY1X0NyZWF0ZUJ1ZmZlcihjdHgsIDAsIFZBSW1hZ2VCdWZmZXJUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmRhdGFfc2l6ZSwgMSwgTlVMTCwgJmltYWdlLT5idWYpOwogICAgaWYgKHZhX3N0YXR1cyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykKICAgICAgICBnb3RvIGVycm9yOwoKICAgIG9ial9pbWFnZS0+Ym8gPSBCVUZGRVIoaW1hZ2UtPmJ1ZiktPmJ1ZmZlcl9zdG9yZS0+Ym87CgogICAgaWYgKGltYWdlLT5udW1fcGFsZXR0ZV9lbnRyaWVzID4gMCAmJiBpbWFnZS0+ZW50cnlfYnl0ZXMgPiAwKSB7CiAgICAgICAgb2JqX2ltYWdlLT5wYWxldHRlID0gbWFsbG9jKGltYWdlLT5udW1fcGFsZXR0ZV9lbnRyaWVzICogc2l6ZW9mKG9ial9pbWFnZS0+cGFsZXR0ZSkpOwogICAgICAgIGlmICghb2JqX2ltYWdlLT5wYWxldHRlKQogICAgICAgICAgICBnb3RvIGVycm9yOwogICAgfQoKICAgIGltYWdlLT5pbWFnZV9pZCAgICAgICAgICAgICA9IGltYWdlX2lkOwogICAgaW1hZ2UtPmZvcm1hdCAgICAgICAgICAgICAgID0gKmZvcm1hdDsKICAgIGltYWdlLT53aWR0aCAgICAgICAgICAgICAgICA9IHdpZHRoOwogICAgaW1hZ2UtPmhlaWdodCAgICAgICAgICAgICAgID0gaGVpZ2h0OwoKICAgICpvdXRfaW1hZ2UgICAgICAgICAgICAgICAgICA9ICppbWFnZTsKICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKCmVycm9yOgogICAgaTk2NV9EZXN0cm95SW1hZ2UoY3R4LCBpbWFnZV9pZCk7CiAgICByZXR1cm4gdmFfc3RhdHVzOwp9CgpWQVN0YXR1cyBpOTY1X0Rlcml2ZUltYWdlKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgIFZBU3VyZmFjZUlEIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVkFJbWFnZSAqaW1hZ2UpICAgICAgICAvKiBvdXQgKi8KewogICAgLyogVE9ETyAqLwogICAgcmV0dXJuIFZBX1NUQVRVU19FUlJPUl9PUEVSQVRJT05fRkFJTEVEOwp9CgpzdGF0aWMgdm9pZCAKaTk2NV9kZXN0cm95X2ltYWdlKHN0cnVjdCBvYmplY3RfaGVhcCAqaGVhcCwgc3RydWN0IG9iamVjdF9iYXNlICpvYmopCnsKICAgIG9iamVjdF9oZWFwX2ZyZWUoaGVhcCwgb2JqKTsKfQoKClZBU3RhdHVzIAppOTY1X0Rlc3Ryb3lJbWFnZShWQURyaXZlckNvbnRleHRQIGN0eCwgVkFJbWFnZUlEIGltYWdlKQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBvYmplY3RfaW1hZ2UgKm9ial9pbWFnZSA9IElNQUdFKGltYWdlKTsgCgogICAgaWYgKCFvYmpfaW1hZ2UpCiAgICAgICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwoKICAgIGlmIChvYmpfaW1hZ2UtPmltYWdlLmJ1ZiAhPSBWQV9JTlZBTElEX0lEKSB7CiAgICAgICAgaTk2NV9EZXN0cm95QnVmZmVyKGN0eCwgb2JqX2ltYWdlLT5pbWFnZS5idWYpOwogICAgICAgIG9ial9pbWFnZS0+aW1hZ2UuYnVmID0gVkFfSU5WQUxJRF9JRDsKICAgIH0KCiAgICBpZiAob2JqX2ltYWdlLT5wYWxldHRlKSB7CiAgICAgICAgZnJlZShvYmpfaW1hZ2UtPnBhbGV0dGUpOwogICAgICAgIG9ial9pbWFnZS0+cGFsZXR0ZSA9IE5VTEw7CiAgICB9CgogICAgaTk2NV9kZXN0cm95X2ltYWdlKCZpOTY1LT5pbWFnZV9oZWFwLCAoc3RydWN0IG9iamVjdF9iYXNlICopb2JqX2ltYWdlKTsKCQogICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwp9CgovKgogKiBwb2ludGVyIHRvIGFuIGFycmF5IGhvbGRpbmcgdGhlIHBhbGV0dGUgZGF0YS4gIFRoZSBzaXplIG9mIHRoZSBhcnJheSBpcwogKiBudW1fcGFsZXR0ZV9lbnRyaWVzICogZW50cnlfYnl0ZXMgaW4gc2l6ZS4gIFRoZSBvcmRlciBvZiB0aGUgY29tcG9uZW50cwogKiBpbiB0aGUgcGFsZXR0ZSBpcyBkZXNjcmliZWQgYnkgdGhlIGNvbXBvbmVudF9vcmRlciBpbiBWQVN1YnBpY3R1cmUgc3RydWN0CiAqLwpWQVN0YXR1cyAKaTk2NV9TZXRJbWFnZVBhbGV0dGUoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgIFZBSW1hZ2VJRCBpbWFnZSwKICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcGFsZXR0ZSkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICB1bnNpZ25lZCBpbnQgaTsKCiAgICBzdHJ1Y3Qgb2JqZWN0X2ltYWdlICpvYmpfaW1hZ2UgPSBJTUFHRShpbWFnZSk7CiAgICBpZiAoIW9ial9pbWFnZSkKICAgICAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX0lOVkFMSURfSU1BR0U7CgogICAgaWYgKCFvYmpfaW1hZ2UtPnBhbGV0dGUpCiAgICAgICAgcmV0dXJuIFZBX1NUQVRVU19FUlJPUl9BTExPQ0FUSU9OX0ZBSUxFRDsgLyogWFhYOiB1bnBhbGV0dGVkL2Vycm9yICovCgogICAgZm9yIChpID0gMDsgaSA8IG9ial9pbWFnZS0+aW1hZ2UubnVtX3BhbGV0dGVfZW50cmllczsgaSsrKQogICAgICAgIG9ial9pbWFnZS0+cGFsZXR0ZVtpXSA9ICgoKHVuc2lnbmVkIGludClwYWxldHRlWzMqaSArIDBdIDw8IDE2KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgaW50KXBhbGV0dGVbMyppICsgMV0gPDwgIDgpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClwYWxldHRlWzMqaSArIDJdKTsKICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKfQoKc3RhdGljIGlubGluZSB2b2lkCm1lbWNweV9waWModWludDhfdCAqZHN0LCB1bnNpZ25lZCBpbnQgZHN0X3N0cmlkZSwKICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHVuc2lnbmVkIGludCBzcmNfc3RyaWRlLAogICAgICAgICAgIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBoZWlnaHQpCnsKICAgIHVuc2lnbmVkIGludCBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgICAgIG1lbWNweShkc3QsIHNyYywgbGVuKTsKICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKICAgIH0KfQoKc3RhdGljIHZvaWQKZ2V0X2ltYWdlX2k0MjAoc3RydWN0IG9iamVjdF9pbWFnZSAqb2JqX2ltYWdlLCB1aW50OF90ICppbWFnZV9kYXRhLAogICAgICAgICAgICAgICBzdHJ1Y3Qgb2JqZWN0X3N1cmZhY2UgKm9ial9zdXJmYWNlLAogICAgICAgICAgICAgICBjb25zdCBWQVJlY3RhbmdsZSAqcmVjdCkKewogICAgdWludDhfdCAqZHN0WzNdLCAqc3JjWzNdOwogICAgY29uc3QgaW50IFkgPSAwOwogICAgY29uc3QgaW50IFUgPSBvYmpfaW1hZ2UtPmltYWdlLmZvcm1hdC5mb3VyY2MgPT0gVkFfRk9VUkNDX1lWMTIgPyAyIDogMTsKICAgIGNvbnN0IGludCBWID0gb2JqX2ltYWdlLT5pbWFnZS5mb3JtYXQuZm91cmNjID09IFZBX0ZPVVJDQ19ZVjEyID8gMSA6IDI7CgogICAgaWYgKCFvYmpfc3VyZmFjZS0+Ym8pCiAgICAgICAgcmV0dXJuOwoKICAgIGRyaV9ib19tYXAob2JqX3N1cmZhY2UtPmJvLCAwKTsKCiAgICBpZiAoIW9ial9zdXJmYWNlLT5iby0+dmlydHVhbCkKICAgICAgICByZXR1cm47CgogICAgLyogRGVzdCBWQSBpbWFnZSBoYXMgZWl0aGVyIEk0MjAgb3IgWVYxMiBmb3JtYXQuCiAgICAgICBTb3VyY2UgVkEgc3VyZmFjZSBhbHdheSBoYXMgSTQyMCBmb3JtYXQgKi8KICAgIGRzdFtZXSA9IGltYWdlX2RhdGEgKyBvYmpfaW1hZ2UtPmltYWdlLm9mZnNldHNbWV07CiAgICBzcmNbMF0gPSAodWludDhfdCAqKW9ial9zdXJmYWNlLT5iby0+dmlydHVhbDsKICAgIGRzdFtVXSA9IGltYWdlX2RhdGEgKyBvYmpfaW1hZ2UtPmltYWdlLm9mZnNldHNbVV07CiAgICBzcmNbMV0gPSBzcmNbMF0gKyBvYmpfc3VyZmFjZS0+d2lkdGggKiBvYmpfc3VyZmFjZS0+aGVpZ2h0OwogICAgZHN0W1ZdID0gaW1hZ2VfZGF0YSArIG9ial9pbWFnZS0+aW1hZ2Uub2Zmc2V0c1tWXTsKICAgIHNyY1syXSA9IHNyY1sxXSArIChvYmpfc3VyZmFjZS0+d2lkdGggLyAyKSAqIChvYmpfc3VyZmFjZS0+aGVpZ2h0IC8gMik7CgogICAgLyogWSBwbGFuZSAqLwogICAgZHN0W1ldICs9IHJlY3QtPnkgKiBvYmpfaW1hZ2UtPmltYWdlLnBpdGNoZXNbWV0gKyByZWN0LT54OwogICAgc3JjWzBdICs9IHJlY3QtPnkgKiBvYmpfc3VyZmFjZS0+d2lkdGggKyByZWN0LT54OwogICAgbWVtY3B5X3BpYyhkc3RbWV0sIG9ial9pbWFnZS0+aW1hZ2UucGl0Y2hlc1tZXSwKICAgICAgICAgICAgICAgc3JjWzBdLCBvYmpfc3VyZmFjZS0+d2lkdGgsCiAgICAgICAgICAgICAgIHJlY3QtPndpZHRoLCByZWN0LT5oZWlnaHQpOwoKICAgIC8qIFUgcGxhbmUgKi8KICAgIGRzdFtVXSArPSAocmVjdC0+eSAvIDIpICogb2JqX2ltYWdlLT5pbWFnZS5waXRjaGVzW1VdICsgcmVjdC0+eCAvIDI7CiAgICBzcmNbMV0gKz0gKHJlY3QtPnkgLyAyKSAqIG9ial9zdXJmYWNlLT53aWR0aCAvIDIgKyByZWN0LT54IC8gMjsKICAgIG1lbWNweV9waWMoZHN0W1VdLCBvYmpfaW1hZ2UtPmltYWdlLnBpdGNoZXNbVV0sCiAgICAgICAgICAgICAgIHNyY1sxXSwgb2JqX3N1cmZhY2UtPndpZHRoIC8gMiwKICAgICAgICAgICAgICAgcmVjdC0+d2lkdGggLyAyLCByZWN0LT5oZWlnaHQgLyAyKTsKCiAgICAvKiBWIHBsYW5lICovCiAgICBkc3RbVl0gKz0gKHJlY3QtPnkgLyAyKSAqIG9ial9pbWFnZS0+aW1hZ2UucGl0Y2hlc1tWXSArIHJlY3QtPnggLyAyOwogICAgc3JjWzJdICs9IChyZWN0LT55IC8gMikgKiBvYmpfc3VyZmFjZS0+d2lkdGggLyAyICsgcmVjdC0+eCAvIDI7CiAgICBtZW1jcHlfcGljKGRzdFtWXSwgb2JqX2ltYWdlLT5pbWFnZS5waXRjaGVzW1ZdLAogICAgICAgICAgICAgICBzcmNbMl0sIG9ial9zdXJmYWNlLT53aWR0aCAvIDIsCiAgICAgICAgICAgICAgIHJlY3QtPndpZHRoIC8gMiwgcmVjdC0+aGVpZ2h0IC8gMik7CgogICAgZHJpX2JvX3VubWFwKG9ial9zdXJmYWNlLT5ibyk7Cn0KCnN0YXRpYyB2b2lkCmdldF9pbWFnZV9udjEyKHN0cnVjdCBvYmplY3RfaW1hZ2UgKm9ial9pbWFnZSwgdWludDhfdCAqaW1hZ2VfZGF0YSwKICAgICAgICAgICAgICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZSwKICAgICAgICAgICAgICAgY29uc3QgVkFSZWN0YW5nbGUgKnJlY3QpCnsKICAgIHVpbnQ4X3QgKmRzdFsyXSwgKnNyY1syXTsKCiAgICBpZiAoIW9ial9zdXJmYWNlLT5ibykKICAgICAgICByZXR1cm47CgogICAgZHJpX2JvX21hcChvYmpfc3VyZmFjZS0+Ym8sIDApOwoKICAgIGlmICghb2JqX3N1cmZhY2UtPmJvLT52aXJ0dWFsKQogICAgICAgIHJldHVybjsKCiAgICAvKiBCb3RoIGRlc3QgVkEgaW1hZ2UgYW5kIHNvdXJjZSBzdXJmYWNlIGhhdmUgTlYxMiBmb3JtYXQgKi8KICAgIGRzdFswXSA9IGltYWdlX2RhdGEgKyBvYmpfaW1hZ2UtPmltYWdlLm9mZnNldHNbMF07CiAgICBzcmNbMF0gPSAodWludDhfdCAqKW9ial9zdXJmYWNlLT5iby0+dmlydHVhbDsKICAgIGRzdFsxXSA9IGltYWdlX2RhdGEgKyBvYmpfaW1hZ2UtPmltYWdlLm9mZnNldHNbMV07CiAgICBzcmNbMV0gPSBzcmNbMF0gKyBvYmpfc3VyZmFjZS0+d2lkdGggKiBvYmpfc3VyZmFjZS0+aGVpZ2h0OwoKICAgIC8qIFkgcGxhbmUgKi8KICAgIGRzdFswXSArPSByZWN0LT55ICogb2JqX2ltYWdlLT5pbWFnZS5waXRjaGVzWzBdICsgcmVjdC0+eDsKICAgIHNyY1swXSArPSByZWN0LT55ICogb2JqX3N1cmZhY2UtPndpZHRoICsgcmVjdC0+eDsKICAgIG1lbWNweV9waWMoZHN0WzBdLCBvYmpfaW1hZ2UtPmltYWdlLnBpdGNoZXNbMF0sCiAgICAgICAgICAgICAgIHNyY1swXSwgb2JqX3N1cmZhY2UtPndpZHRoLAogICAgICAgICAgICAgICByZWN0LT53aWR0aCwgcmVjdC0+aGVpZ2h0KTsKCiAgICAvKiBVViBwbGFuZSAqLwogICAgZHN0WzFdICs9IChyZWN0LT55IC8gMikgKiBvYmpfaW1hZ2UtPmltYWdlLnBpdGNoZXNbMV0gKyAocmVjdC0+eCAmIC0yKTsKICAgIHNyY1sxXSArPSAocmVjdC0+eSAvIDIpICogb2JqX3N1cmZhY2UtPndpZHRoICsgKHJlY3QtPnggJiAtMik7CiAgICBtZW1jcHlfcGljKGRzdFsxXSwgb2JqX2ltYWdlLT5pbWFnZS5waXRjaGVzWzFdLAogICAgICAgICAgICAgICBzcmNbMV0sIG9ial9zdXJmYWNlLT53aWR0aCwKICAgICAgICAgICAgICAgcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCAvIDIpOwoKICAgIGRyaV9ib191bm1hcChvYmpfc3VyZmFjZS0+Ym8pOwp9CgpWQVN0YXR1cyAKaTk2NV9HZXRJbWFnZShWQURyaXZlckNvbnRleHRQIGN0eCwKICAgICAgICAgICAgICBWQVN1cmZhY2VJRCBzdXJmYWNlLAogICAgICAgICAgICAgIGludCB4LCAgIC8qIGNvb3JkaW5hdGVzIG9mIHRoZSB1cHBlciBsZWZ0IHNvdXJjZSBwaXhlbCAqLwogICAgICAgICAgICAgIGludCB5LAogICAgICAgICAgICAgIHVuc2lnbmVkIGludCB3aWR0aCwgICAgICAvKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSByZWdpb24gKi8KICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgIFZBSW1hZ2VJRCBpbWFnZSkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CgogICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZSA9IFNVUkZBQ0Uoc3VyZmFjZSk7CiAgICBpZiAoIW9ial9zdXJmYWNlKQogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfSU5WQUxJRF9TVVJGQUNFOwoKICAgIHN0cnVjdCBvYmplY3RfaW1hZ2UgKm9ial9pbWFnZSA9IElNQUdFKGltYWdlKTsKICAgIGlmICghb2JqX2ltYWdlKQogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfSU5WQUxJRF9JTUFHRTsKCiAgICBpZiAoeCA8IDAgfHwgeSA8IDApCiAgICAgICAgcmV0dXJuIFZBX1NUQVRVU19FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgIGlmICh4ICsgd2lkdGggPiBvYmpfc3VyZmFjZS0+b3JpZ193aWR0aCB8fAogICAgICAgIHkgKyBoZWlnaHQgPiBvYmpfc3VyZmFjZS0+b3JpZ19oZWlnaHQpCiAgICAgICAgcmV0dXJuIFZBX1NUQVRVU19FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgIGlmICh4ICsgd2lkdGggPiBvYmpfaW1hZ2UtPmltYWdlLndpZHRoIHx8CiAgICAgICAgeSArIGhlaWdodCA+IG9ial9pbWFnZS0+aW1hZ2UuaGVpZ2h0KQogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CgogICAgLyogQ29tbWl0IHBlbmRpbmcgb3BlcmF0aW9ucyB0byB0aGUgSFcgKi8KICAgIGludGVsX2JhdGNoYnVmZmVyX2ZsdXNoKGN0eCk7CgogICAgVkFTdGF0dXMgdmFfc3RhdHVzOwogICAgdm9pZCAqaW1hZ2VfZGF0YSA9IE5VTEw7CgogICAgdmFfc3RhdHVzID0gaTk2NV9NYXBCdWZmZXIoY3R4LCBvYmpfaW1hZ2UtPmltYWdlLmJ1ZiwgJmltYWdlX2RhdGEpOwogICAgaWYgKHZhX3N0YXR1cyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykKICAgICAgICByZXR1cm4gdmFfc3RhdHVzOwoKICAgIFZBUmVjdGFuZ2xlIHJlY3Q7CiAgICByZWN0LnggPSB4OwogICAgcmVjdC55ID0geTsKICAgIHJlY3Qud2lkdGggPSB3aWR0aDsKICAgIHJlY3QuaGVpZ2h0ID0gaGVpZ2h0OwoKICAgIHN3aXRjaCAob2JqX2ltYWdlLT5pbWFnZS5mb3JtYXQuZm91cmNjKSB7CiAgICBjYXNlIFZBX0ZPVVJDQygnWScsJ1YnLCcxJywnMicpOgogICAgY2FzZSBWQV9GT1VSQ0MoJ0knLCc0JywnMicsJzAnKToKICAgICAgICAvKiBJNDIwIGlzIG5hdGl2ZSBmb3JtYXQgZm9yIE1QRUctMiBkZWNvZGVkIHN1cmZhY2VzICovCiAgICAgICAgaWYgKHJlbmRlcl9zdGF0ZS0+aW50ZXJsZWF2ZWRfdXYpCiAgICAgICAgICAgIGdvdG8gb3BlcmF0aW9uX2ZhaWxlZDsKICAgICAgICBnZXRfaW1hZ2VfaTQyMChvYmpfaW1hZ2UsIGltYWdlX2RhdGEsIG9ial9zdXJmYWNlLCAmcmVjdCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFZBX0ZPVVJDQygnTicsJ1YnLCcxJywnMicpOgogICAgICAgIC8qIE5WMTIgaXMgbmF0aXZlIGZvcm1hdCBmb3IgSC4yNjQgZGVjb2RlZCBzdXJmYWNlcyAqLwogICAgICAgIGlmICghcmVuZGVyX3N0YXRlLT5pbnRlcmxlYXZlZF91dikKICAgICAgICAgICAgZ290byBvcGVyYXRpb25fZmFpbGVkOwogICAgICAgIGdldF9pbWFnZV9udjEyKG9ial9pbWFnZSwgaW1hZ2VfZGF0YSwgb2JqX3N1cmZhY2UsICZyZWN0KTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICBvcGVyYXRpb25fZmFpbGVkOgogICAgICAgIHZhX3N0YXR1cyA9IFZBX1NUQVRVU19FUlJPUl9PUEVSQVRJT05fRkFJTEVEOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIGk5NjVfVW5tYXBCdWZmZXIoY3R4LCBvYmpfaW1hZ2UtPmltYWdlLmJ1Zik7CiAgICByZXR1cm4gdmFfc3RhdHVzOwp9CgpWQVN0YXR1cyAKaTk2NV9QdXRTdXJmYWNlKFZBRHJpdmVyQ29udGV4dFAgY3R4LAogICAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgc3VyZmFjZSwKICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXcsIC8qIFggRHJhd2FibGUgKi8KICAgICAgICAgICAgICAgIHNob3J0IHNyY3gsCiAgICAgICAgICAgICAgICBzaG9ydCBzcmN5LAogICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjdywKICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNyY2gsCiAgICAgICAgICAgICAgICBzaG9ydCBkZXN0eCwKICAgICAgICAgICAgICAgIHNob3J0IGRlc3R5LAogICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVzdHcsCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXN0aCwKICAgICAgICAgICAgICAgIFZBUmVjdGFuZ2xlICpjbGlwcmVjdHMsIC8qIGNsaWVudCBzdXBwbGllZCBjbGlwIGxpc3QgKi8KICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1iZXJfY2xpcHJlY3RzLCAvKiBudW1iZXIgb2YgY2xpcCByZWN0cyBpbiB0aGUgY2xpcCBsaXN0ICovCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIC8qIGRlLWludGVybGFjaW5nIGZsYWdzICovCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOyAKICAgIHN0cnVjdCBkcmlfc3RhdGUgKmRyaV9zdGF0ZSA9IChzdHJ1Y3QgZHJpX3N0YXRlICopY3R4LT5kcmlfc3RhdGU7CiAgICBzdHJ1Y3QgaTk2NV9yZW5kZXJfc3RhdGUgKnJlbmRlcl9zdGF0ZSA9ICZpOTY1LT5yZW5kZXJfc3RhdGU7CiAgICBzdHJ1Y3QgZHJpX2RyYXdhYmxlICpkcmlfZHJhd2FibGU7CiAgICB1bmlvbiBkcmlfYnVmZmVyICpidWZmZXI7CiAgICBzdHJ1Y3QgaW50ZWxfcmVnaW9uICpkZXN0X3JlZ2lvbjsKICAgIHN0cnVjdCBvYmplY3Rfc3VyZmFjZSAqb2JqX3N1cmZhY2U7IAogICAgaW50IHJldDsKICAgIHVpbnQzMl90IG5hbWU7CiAgICBCb29sIG5ld19yZWdpb24gPSBGYWxzZTsKICAgIC8qIEN1cnJlbnRseSBkb24ndCBzdXBwb3J0IERSSTEgKi8KICAgIGlmIChkcmlfc3RhdGUtPmRyaUNvbm5lY3RlZEZsYWcgIT0gVkFfRFJJMikKICAgICAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX1VOS05PV047CgogICAgLyogU29tZSBicm9rZW4gc291cmNlcyBzdWNoIGFzIEguMjY0IGNvbmZvcm1hbmNlIGNhc2UgRk0yX1NWQV9DCiAgICAgKiB3aWxsIGdldCBoZXJlCiAgICAgKi8KICAgIG9ial9zdXJmYWNlID0gU1VSRkFDRShzdXJmYWNlKTsKICAgIGlmIChvYmpfc3VyZmFjZS0+Ym8gPT0gTlVMTCkKICAgICAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7CgogICAgZHJpX2RyYXdhYmxlID0gZHJpX2dldF9kcmF3YWJsZShjdHgsIGRyYXcpOwogICAgYXNzZXJ0KGRyaV9kcmF3YWJsZSk7CgogICAgYnVmZmVyID0gZHJpX2dldF9yZW5kZXJpbmdfYnVmZmVyKGN0eCwgZHJpX2RyYXdhYmxlKTsKICAgIGFzc2VydChidWZmZXIpOwogICAgCiAgICBkZXN0X3JlZ2lvbiA9IHJlbmRlcl9zdGF0ZS0+ZHJhd19yZWdpb247CgogICAgaWYgKGRlc3RfcmVnaW9uKSB7CiAgICAgICAgYXNzZXJ0KGRlc3RfcmVnaW9uLT5ibyk7CiAgICAgICAgZHJpX2JvX2ZsaW5rKGRlc3RfcmVnaW9uLT5ibywgJm5hbWUpOwogICAgICAgIAogICAgICAgIGlmIChidWZmZXItPmRyaTIubmFtZSAhPSBuYW1lKSB7CiAgICAgICAgICAgIG5ld19yZWdpb24gPSBUcnVlOwogICAgICAgICAgICBkcmlfYm9fdW5yZWZlcmVuY2UoZGVzdF9yZWdpb24tPmJvKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGRlc3RfcmVnaW9uID0gKHN0cnVjdCBpbnRlbF9yZWdpb24gKiljYWxsb2MoMSwgc2l6ZW9mKCpkZXN0X3JlZ2lvbikpOwogICAgICAgIGFzc2VydChkZXN0X3JlZ2lvbik7CiAgICAgICAgcmVuZGVyX3N0YXRlLT5kcmF3X3JlZ2lvbiA9IGRlc3RfcmVnaW9uOwogICAgICAgIG5ld19yZWdpb24gPSBUcnVlOwogICAgfQoKICAgIGlmIChuZXdfcmVnaW9uKSB7CiAgICAgICAgZGVzdF9yZWdpb24tPnggPSBkcmlfZHJhd2FibGUtPng7CiAgICAgICAgZGVzdF9yZWdpb24tPnkgPSBkcmlfZHJhd2FibGUtPnk7CiAgICAgICAgZGVzdF9yZWdpb24tPndpZHRoID0gZHJpX2RyYXdhYmxlLT53aWR0aDsKICAgICAgICBkZXN0X3JlZ2lvbi0+aGVpZ2h0ID0gZHJpX2RyYXdhYmxlLT5oZWlnaHQ7CiAgICAgICAgZGVzdF9yZWdpb24tPmNwcCA9IGJ1ZmZlci0+ZHJpMi5jcHA7CiAgICAgICAgZGVzdF9yZWdpb24tPnBpdGNoID0gYnVmZmVyLT5kcmkyLnBpdGNoOwoKICAgICAgICBkZXN0X3JlZ2lvbi0+Ym8gPSBpbnRlbF9ib19nZW1fY3JlYXRlX2Zyb21fbmFtZShpOTY1LT5pbnRlbC5idWZtZ3IsICJyZW5kZXJpbmcgYnVmZmVyIiwgYnVmZmVyLT5kcmkyLm5hbWUpOwogICAgICAgIGFzc2VydChkZXN0X3JlZ2lvbi0+Ym8pOwoKICAgICAgICByZXQgPSBkcmlfYm9fZ2V0X3RpbGluZyhkZXN0X3JlZ2lvbi0+Ym8sICYoZGVzdF9yZWdpb24tPnRpbGluZyksICYoZGVzdF9yZWdpb24tPnN3aXp6bGUpKTsKICAgICAgICBhc3NlcnQocmV0ID09IDApOwogICAgfQoKICAgIGk5NjVfcmVuZGVyX3B1dF9zdXJmYWNlKGN0eCwgc3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3gsIHNyY3ksIHNyY3csIHNyY2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0eCwgZGVzdHksIGRlc3R3LCBkZXN0aCk7CgogICAgaWYob2JqX3N1cmZhY2UtPnN1YnBpYyAhPSBWQV9JTlZBTElEX0lEKSB7CQoJaTk2NV9yZW5kZXJfcHV0X3N1YnBpYyhjdHgsIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmN4LCBzcmN5LCBzcmN3LCBzcmNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHgsIGRlc3R5LCBkZXN0dywgZGVzdGgpOwogICAgfSAKCiAgICBkcmlfc3dhcF9idWZmZXIoY3R4LCBkcmlfZHJhd2FibGUpOwogICAgb2JqX3N1cmZhY2UtPmZsYWdzIHw9IFNVUkZBQ0VfRElTUExBWUVEOwoKICAgIGlmICghKG9ial9zdXJmYWNlLT5mbGFncyAmIFNVUkZBQ0VfUkVGRVJFTkNFRCkpIHsKICAgICAgICBkcmlfYm9fdW5yZWZlcmVuY2Uob2JqX3N1cmZhY2UtPmJvKTsKICAgICAgICBvYmpfc3VyZmFjZS0+Ym8gPSBOVUxMOwogICAgICAgIG9ial9zdXJmYWNlLT5mbGFncyA9IDA7CgogICAgICAgIGlmIChvYmpfc3VyZmFjZS0+ZnJlZV9wcml2YXRlX2RhdGEpCiAgICAgICAgICAgIG9ial9zdXJmYWNlLT5mcmVlX3ByaXZhdGVfZGF0YSgmb2JqX3N1cmZhY2UtPnByaXZhdGVfZGF0YSk7CiAgICB9CgogICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwp9CgpWQVN0YXR1cyAKaTk2NV9UZXJtaW5hdGUoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwoKICAgIGlmIChpOTY1X3JlbmRlcl90ZXJtaW5hdGUoY3R4KSA9PSBGYWxzZSkKCXJldHVybiBWQV9TVEFUVVNfRVJST1JfVU5LTk9XTjsKCiAgICBpZiAoaTk2NV9tZWRpYV90ZXJtaW5hdGUoY3R4KSA9PSBGYWxzZSkKCXJldHVybiBWQV9TVEFUVVNfRVJST1JfVU5LTk9XTjsKCiAgICBpZiAoaW50ZWxfZHJpdmVyX3Rlcm1pbmF0ZShjdHgpID09IEZhbHNlKQoJcmV0dXJuIFZBX1NUQVRVU19FUlJPUl9VTktOT1dOOwoKICAgIGk5NjVfZGVzdHJveV9oZWFwKCZpOTY1LT5idWZmZXJfaGVhcCwgaTk2NV9kZXN0cm95X2J1ZmZlcik7CiAgICBpOTY1X2Rlc3Ryb3lfaGVhcCgmaTk2NS0+aW1hZ2VfaGVhcCwgaTk2NV9kZXN0cm95X2ltYWdlKTsKICAgIGk5NjVfZGVzdHJveV9oZWFwKCZpOTY1LT5zdWJwaWNfaGVhcCwgaTk2NV9kZXN0cm95X3N1YnBpYyk7CiAgICBpOTY1X2Rlc3Ryb3lfaGVhcCgmaTk2NS0+c3VyZmFjZV9oZWFwLCBpOTY1X2Rlc3Ryb3lfc3VyZmFjZSk7CiAgICBpOTY1X2Rlc3Ryb3lfaGVhcCgmaTk2NS0+Y29udGV4dF9oZWFwLCBpOTY1X2Rlc3Ryb3lfY29udGV4dCk7CiAgICBpOTY1X2Rlc3Ryb3lfaGVhcCgmaTk2NS0+Y29uZmlnX2hlYXAsIGk5NjVfZGVzdHJveV9jb25maWcpOwoKICAgIGZyZWUoY3R4LT5wRHJpdmVyRGF0YSk7CiAgICBjdHgtPnBEcml2ZXJEYXRhID0gTlVMTDsKCiAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7Cn0KClZBU3RhdHVzIApfX3ZhRHJpdmVySW5pdF8wXzMxKCAgVkFEcml2ZXJDb250ZXh0UCBjdHggKQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NTsKICAgIGludCByZXN1bHQ7CgogICAgY3R4LT52ZXJzaW9uX21ham9yID0gVkFfTUFKT1JfVkVSU0lPTjsKICAgIGN0eC0+dmVyc2lvbl9taW5vciA9IFZBX01JTk9SX1ZFUlNJT047CiAgICBjdHgtPm1heF9wcm9maWxlcyA9IEk5NjVfTUFYX1BST0ZJTEVTOwogICAgY3R4LT5tYXhfZW50cnlwb2ludHMgPSBJOTY1X01BWF9FTlRSWVBPSU5UUzsKICAgIGN0eC0+bWF4X2F0dHJpYnV0ZXMgPSBJOTY1X01BWF9DT05GSUdfQVRUUklCVVRFUzsKICAgIGN0eC0+bWF4X2ltYWdlX2Zvcm1hdHMgPSBJOTY1X01BWF9JTUFHRV9GT1JNQVRTOwogICAgY3R4LT5tYXhfc3VicGljX2Zvcm1hdHMgPSBJOTY1X01BWF9TVUJQSUNfRk9STUFUUzsKICAgIGN0eC0+bWF4X2Rpc3BsYXlfYXR0cmlidXRlcyA9IEk5NjVfTUFYX0RJU1BMQVlfQVRUUklCVVRFUzsKICAgIGN0eC0+c3RyX3ZlbmRvciA9IEk5NjVfU1RSX1ZFTkRPUjsKCiAgICBjdHgtPnZ0YWJsZS52YVRlcm1pbmF0ZSA9IGk5NjVfVGVybWluYXRlOwogICAgY3R4LT52dGFibGUudmFRdWVyeUNvbmZpZ0VudHJ5cG9pbnRzID0gaTk2NV9RdWVyeUNvbmZpZ0VudHJ5cG9pbnRzOwogICAgY3R4LT52dGFibGUudmFRdWVyeUNvbmZpZ1Byb2ZpbGVzID0gaTk2NV9RdWVyeUNvbmZpZ1Byb2ZpbGVzOwogICAgY3R4LT52dGFibGUudmFRdWVyeUNvbmZpZ0VudHJ5cG9pbnRzID0gaTk2NV9RdWVyeUNvbmZpZ0VudHJ5cG9pbnRzOwogICAgY3R4LT52dGFibGUudmFRdWVyeUNvbmZpZ0F0dHJpYnV0ZXMgPSBpOTY1X1F1ZXJ5Q29uZmlnQXR0cmlidXRlczsKICAgIGN0eC0+dnRhYmxlLnZhQ3JlYXRlQ29uZmlnID0gaTk2NV9DcmVhdGVDb25maWc7CiAgICBjdHgtPnZ0YWJsZS52YURlc3Ryb3lDb25maWcgPSBpOTY1X0Rlc3Ryb3lDb25maWc7CiAgICBjdHgtPnZ0YWJsZS52YUdldENvbmZpZ0F0dHJpYnV0ZXMgPSBpOTY1X0dldENvbmZpZ0F0dHJpYnV0ZXM7CiAgICBjdHgtPnZ0YWJsZS52YUNyZWF0ZVN1cmZhY2VzID0gaTk2NV9DcmVhdGVTdXJmYWNlczsKICAgIGN0eC0+dnRhYmxlLnZhRGVzdHJveVN1cmZhY2VzID0gaTk2NV9EZXN0cm95U3VyZmFjZXM7CiAgICBjdHgtPnZ0YWJsZS52YUNyZWF0ZUNvbnRleHQgPSBpOTY1X0NyZWF0ZUNvbnRleHQ7CiAgICBjdHgtPnZ0YWJsZS52YURlc3Ryb3lDb250ZXh0ID0gaTk2NV9EZXN0cm95Q29udGV4dDsKICAgIGN0eC0+dnRhYmxlLnZhQ3JlYXRlQnVmZmVyID0gaTk2NV9DcmVhdGVCdWZmZXI7CiAgICBjdHgtPnZ0YWJsZS52YUJ1ZmZlclNldE51bUVsZW1lbnRzID0gaTk2NV9CdWZmZXJTZXROdW1FbGVtZW50czsKICAgIGN0eC0+dnRhYmxlLnZhTWFwQnVmZmVyID0gaTk2NV9NYXBCdWZmZXI7CiAgICBjdHgtPnZ0YWJsZS52YVVubWFwQnVmZmVyID0gaTk2NV9Vbm1hcEJ1ZmZlcjsKICAgIGN0eC0+dnRhYmxlLnZhRGVzdHJveUJ1ZmZlciA9IGk5NjVfRGVzdHJveUJ1ZmZlcjsKICAgIGN0eC0+dnRhYmxlLnZhQmVnaW5QaWN0dXJlID0gaTk2NV9CZWdpblBpY3R1cmU7CiAgICBjdHgtPnZ0YWJsZS52YVJlbmRlclBpY3R1cmUgPSBpOTY1X1JlbmRlclBpY3R1cmU7CiAgICBjdHgtPnZ0YWJsZS52YUVuZFBpY3R1cmUgPSBpOTY1X0VuZFBpY3R1cmU7CiAgICBjdHgtPnZ0YWJsZS52YVN5bmNTdXJmYWNlID0gaTk2NV9TeW5jU3VyZmFjZTsKICAgIGN0eC0+dnRhYmxlLnZhUXVlcnlTdXJmYWNlU3RhdHVzID0gaTk2NV9RdWVyeVN1cmZhY2VTdGF0dXM7CiAgICBjdHgtPnZ0YWJsZS52YVB1dFN1cmZhY2UgPSBpOTY1X1B1dFN1cmZhY2U7CiAgICBjdHgtPnZ0YWJsZS52YVF1ZXJ5SW1hZ2VGb3JtYXRzID0gaTk2NV9RdWVyeUltYWdlRm9ybWF0czsKICAgIGN0eC0+dnRhYmxlLnZhQ3JlYXRlSW1hZ2UgPSBpOTY1X0NyZWF0ZUltYWdlOwogICAgY3R4LT52dGFibGUudmFEZXJpdmVJbWFnZSA9IGk5NjVfRGVyaXZlSW1hZ2U7CiAgICBjdHgtPnZ0YWJsZS52YURlc3Ryb3lJbWFnZSA9IGk5NjVfRGVzdHJveUltYWdlOwogICAgY3R4LT52dGFibGUudmFTZXRJbWFnZVBhbGV0dGUgPSBpOTY1X1NldEltYWdlUGFsZXR0ZTsKICAgIGN0eC0+dnRhYmxlLnZhR2V0SW1hZ2UgPSBpOTY1X0dldEltYWdlOwogICAgY3R4LT52dGFibGUudmFQdXRJbWFnZSA9IGk5NjVfUHV0SW1hZ2U7CiAgICBjdHgtPnZ0YWJsZS52YVF1ZXJ5U3VicGljdHVyZUZvcm1hdHMgPSBpOTY1X1F1ZXJ5U3VicGljdHVyZUZvcm1hdHM7CiAgICBjdHgtPnZ0YWJsZS52YUNyZWF0ZVN1YnBpY3R1cmUgPSBpOTY1X0NyZWF0ZVN1YnBpY3R1cmU7CiAgICBjdHgtPnZ0YWJsZS52YURlc3Ryb3lTdWJwaWN0dXJlID0gaTk2NV9EZXN0cm95U3VicGljdHVyZTsKICAgIGN0eC0+dnRhYmxlLnZhU2V0U3VicGljdHVyZUltYWdlID0gaTk2NV9TZXRTdWJwaWN0dXJlSW1hZ2U7CiAgICBjdHgtPnZ0YWJsZS52YVNldFN1YnBpY3R1cmVDaHJvbWFrZXkgPSBpOTY1X1NldFN1YnBpY3R1cmVDaHJvbWFrZXk7CiAgICBjdHgtPnZ0YWJsZS52YVNldFN1YnBpY3R1cmVHbG9iYWxBbHBoYSA9IGk5NjVfU2V0U3VicGljdHVyZUdsb2JhbEFscGhhOwogICAgY3R4LT52dGFibGUudmFBc3NvY2lhdGVTdWJwaWN0dXJlID0gaTk2NV9Bc3NvY2lhdGVTdWJwaWN0dXJlOwogICAgY3R4LT52dGFibGUudmFEZWFzc29jaWF0ZVN1YnBpY3R1cmUgPSBpOTY1X0RlYXNzb2NpYXRlU3VicGljdHVyZTsKICAgIGN0eC0+dnRhYmxlLnZhUXVlcnlEaXNwbGF5QXR0cmlidXRlcyA9IGk5NjVfUXVlcnlEaXNwbGF5QXR0cmlidXRlczsKICAgIGN0eC0+dnRhYmxlLnZhR2V0RGlzcGxheUF0dHJpYnV0ZXMgPSBpOTY1X0dldERpc3BsYXlBdHRyaWJ1dGVzOwogICAgY3R4LT52dGFibGUudmFTZXREaXNwbGF5QXR0cmlidXRlcyA9IGk5NjVfU2V0RGlzcGxheUF0dHJpYnV0ZXM7Ci8vICAgIGN0eC0+dnRhYmxlLnZhRGJnQ29weVN1cmZhY2VUb0J1ZmZlciA9IGk5NjVfRGJnQ29weVN1cmZhY2VUb0J1ZmZlcjsKCiAgICBpOTY1ID0gKHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICopY2FsbG9jKDEsIHNpemVvZigqaTk2NSkpOwogICAgYXNzZXJ0KGk5NjUpOwogICAgY3R4LT5wRHJpdmVyRGF0YSA9ICh2b2lkICopaTk2NTsKCiAgICByZXN1bHQgPSBvYmplY3RfaGVhcF9pbml0KCZpOTY1LT5jb25maWdfaGVhcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2NvbmZpZyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfSURfT0ZGU0VUKTsKICAgIGFzc2VydChyZXN1bHQgPT0gMCk7CgogICAgcmVzdWx0ID0gb2JqZWN0X2hlYXBfaW5pdCgmaTk2NS0+Y29udGV4dF9oZWFwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBvYmplY3RfY29udGV4dCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUX0lEX09GRlNFVCk7CiAgICBhc3NlcnQocmVzdWx0ID09IDApOwoKICAgIHJlc3VsdCA9IG9iamVjdF9oZWFwX2luaXQoJmk5NjUtPnN1cmZhY2VfaGVhcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X3N1cmZhY2UpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VSRkFDRV9JRF9PRkZTRVQpOwogICAgYXNzZXJ0KHJlc3VsdCA9PSAwKTsKCiAgICByZXN1bHQgPSBvYmplY3RfaGVhcF9pbml0KCZpOTY1LT5idWZmZXJfaGVhcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2J1ZmZlciksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUZGRVJfSURfT0ZGU0VUKTsKICAgIGFzc2VydChyZXN1bHQgPT0gMCk7CgogICAgcmVzdWx0ID0gb2JqZWN0X2hlYXBfaW5pdCgmaTk2NS0+aW1hZ2VfaGVhcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2ltYWdlKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX0lEX09GRlNFVCk7CiAgICBhc3NlcnQocmVzdWx0ID09IDApOwoJCiAgICByZXN1bHQgPSBvYmplY3RfaGVhcF9pbml0KCZpOTY1LT5zdWJwaWNfaGVhcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X3N1YnBpYyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJQSUNfSURfT0ZGU0VUKTsKICAgIGFzc2VydChyZXN1bHQgPT0gMCk7CiAgICAKICAgIHJldHVybiBpOTY1X0luaXQoY3R4KTsKfQo=