LyoKICogQ29weXJpZ2h0IChjKSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBDb3B5cmlnaHQgKGMpIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMaW1pdGVkLCBVSwogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgogKiBJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCiAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICogQXV0aG9yczoKICogICAgV2FsZG8gQmFzdGlhbiA8d2FsZG8uYmFzdGlhbkBpbnRlbC5jb20+CiAqICAgIExpIFplbmcgPGxpLnplbmdAaW50ZWwuY29tPgogKgogKi8KCiNpbmNsdWRlICJwbndfVkMxLmgiCiNpbmNsdWRlICJwc2JfZGVmLmgiCiNpbmNsdWRlICJwc2JfZHJ2X2RlYnVnLmgiCiNpbmNsdWRlICJwbndfcm90YXRlLmgiCgojaW5jbHVkZSAidmMxX2hlYWRlci5oIgojaW5jbHVkZSAidmMxX2RlZnMuaCIKCiNpbmNsdWRlICJod2RlZnMvcmVnX2lvMi5oIgojaW5jbHVkZSAiaHdkZWZzL21zdmR4X29mZnNldHMuaCIKI2luY2x1ZGUgImh3ZGVmcy9tc3ZkeF9jbWRzX2lvMi5oIgojaW5jbHVkZSAiaHdkZWZzL21zdmR4X3ZlY19yZWdfaW8yLmgiCiNpbmNsdWRlICJod2RlZnMvbXN2ZHhfdmVjX3ZjMV9yZWdfaW8yLmgiCiNpbmNsdWRlICJod2RlZnMvbXN2ZHhfcmVuZGVjX3ZjMV9yZWdfaW8yLmgiCiNpbmNsdWRlICJod2RlZnMvZHh2YV9md19jdHJsLmgiCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBWQzFfSGVhZGVyX1BhcnNlcl9IVwoKI2RlZmluZSBHRVRfU1VSRkFDRV9JTkZPX2lzX2RlZmluZWQocHNiX3N1cmZhY2UpICgoaW50KSAocHNiX3N1cmZhY2UtPmV4dHJhX2luZm9bMF0pKQojZGVmaW5lIFNFVF9TVVJGQUNFX0lORk9faXNfZGVmaW5lZChwc2Jfc3VyZmFjZSwgdmFsKSBwc2Jfc3VyZmFjZS0+ZXh0cmFfaW5mb1swXSA9ICh1aW50MzJfdCkgdmFsOwojZGVmaW5lIEdFVF9TVVJGQUNFX0lORk9fcGljdHVyZV9zdHJ1Y3R1cmUocHNiX3N1cmZhY2UpIChwc2Jfc3VyZmFjZS0+ZXh0cmFfaW5mb1sxXSkKI2RlZmluZSBTRVRfU1VSRkFDRV9JTkZPX3BpY3R1cmVfc3RydWN0dXJlKHBzYl9zdXJmYWNlLCB2YWwpIHBzYl9zdXJmYWNlLT5leHRyYV9pbmZvWzFdID0gdmFsOwojZGVmaW5lIEdFVF9TVVJGQUNFX0lORk9fcGljdHVyZV9jb2RpbmdfdHlwZShwc2Jfc3VyZmFjZSkgKChpbnQpIChwc2Jfc3VyZmFjZS0+ZXh0cmFfaW5mb1syXSkpCiNkZWZpbmUgU0VUX1NVUkZBQ0VfSU5GT19waWN0dXJlX2NvZGluZ190eXBlKHBzYl9zdXJmYWNlLCB2YWwpIHBzYl9zdXJmYWNlLT5leHRyYV9pbmZvWzJdID0gKHVpbnQzMl90KSB2YWw7CgojZGVmaW5lIFNMSUNFREFUQV9CVUZGRVJfVFlQRSh0eXBlKSAoKHR5cGU9PVZBU2xpY2VEYXRhQnVmZmVyVHlwZSk/IlZBU2xpY2VEYXRhQnVmZmVyVHlwZSI6IlZBUHJvdGVjdGVkU2xpY2VEYXRhQnVmZmVyVHlwZSIpCgojZGVmaW5lIFBJWEVMU19UT19NQih4KSAgICAoKHggKyAxNSkgLyAxNikKCiNkZWZpbmUgUFJFTE9BRF9CVUZGRVJfU0laRSAgICAgICAgKDQqMTAyNCkKI2RlZmluZSBBVVhNU0JfQlVGRkVSX1NJWkUgICAgICAgICAoMTAyNCoxMDI0KQoKI2RlZmluZSBIV19TVVBQT1JURURfTUFYX1BJQ1RVUkVfV0lEVEhfVkMxICAgMTkyMAojZGVmaW5lIEhXX1NVUFBPUlRFRF9NQVhfUElDVFVSRV9IRUlHSFRfVkMxICAxMDg4Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBJTUdfVUlOVDMyICAgICAgICAgICAgICB1aTMyQ29udGV4dElkOwogICAgSU1HX1VJTlQzMiAgICAgICAgICAgICAgdWkzMlNsaWNlUGFyYW1zOwogICAgSU1HX1VJTlQzMiAgICAgICAgICAgICAgdWkzMk1hY3JvYmxvY2tOdW1iZXI7Cn0gVkMxUFJFTE9BRDsKCiNkZWZpbmUgRldQQVJTRVJfVkMxUFJFTE9BRF9TSVpFICgweDYwKQoKLyohCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQExVVHMgICBWTEMgdGFibGUgc2VsZWN0aW9uIExvb2stdXAgVGFibGVzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnR5cGVkZWYgZW51bSB7CiAgICBWQzFfVkxDX0NvZGVfM3gyXzJ4M190aWxlcyAgICAgICAgICAgICAgPSAweDAsCiAgICBWQzFfVkxDX0ZvdXJNVl9QYXR0ZXJuXzAsCiAgICBWQzFfVkxDX0ZvdXJNVl9QYXR0ZXJuXzEsCiAgICBWQzFfVkxDX0ZvdXJNVl9QYXR0ZXJuXzIsCiAgICBWQzFfVkxDX0ZvdXJNVl9QYXR0ZXJuXzMsCiAgICBWQzFfVkxDX0hpZ2hfTW90X0Nocm9tYV9EQ19EaWZmX1ZMQywKICAgIFZDMV9WTENfSGlnaF9Nb3RfSW50ZXJfVkxDLAogICAgVkMxX1ZMQ19IaWdoX01vdF9JbnRyYV9WTEMsCiAgICBWQzFfVkxDX0hpZ2hfTW90X0x1bWluYW5jZV9EQ19EaWZmX1ZMQywKICAgIFZDMV9WTENfSGlnaF9SYXRlX0ludGVyX1ZMQywKICAgIFZDMV9WTENfSGlnaF9SYXRlX0ludHJhX1ZMQywKICAgIFZDMV9WTENfSGlnaF9SYXRlX1NVQkJMS1BBVCwKICAgIFZDMV9WTENfSGlnaF9SYXRlX1RUQkxLLAogICAgVkMxX1ZMQ19IaWdoX1JhdGVfVFRNQiwKICAgIFZDMV9WTENfSV9QaWN0dXJlX0NCUENZX1ZMQywKICAgIFZDMV9WTENfSW50ZXJsYWNlXzJfTVZQX1BhdHRlcm5fMCwKICAgIFZDMV9WTENfSW50ZXJsYWNlXzJfTVZQX1BhdHRlcm5fMSwKICAgIFZDMV9WTENfSW50ZXJsYWNlXzJfTVZQX1BhdHRlcm5fMiwKICAgIFZDMV9WTENfSW50ZXJsYWNlXzJfTVZQX1BhdHRlcm5fMywKICAgIFZDMV9WTENfSW50ZXJsYWNlXzRNVl9NQl8wLAogICAgVkMxX1ZMQ19JbnRlcmxhY2VfNE1WX01CXzEsCiAgICBWQzFfVkxDX0ludGVybGFjZV80TVZfTUJfMiwKICAgIFZDMV9WTENfSW50ZXJsYWNlXzRNVl9NQl8zLAogICAgVkMxX1ZMQ19JbnRlcmxhY2VfTm9uXzRNVl9NQl8wLAogICAgVkMxX1ZMQ19JbnRlcmxhY2VfTm9uXzRNVl9NQl8xLAogICAgVkMxX1ZMQ19JbnRlcmxhY2VfTm9uXzRNVl9NQl8yLAogICAgVkMxX1ZMQ19JbnRlcmxhY2VfTm9uXzRNVl9NQl8zLAogICAgVkMxX1ZMQ19JbnRlcmxhY2VkX0NCUENZXzAsCiAgICBWQzFfVkxDX0ludGVybGFjZWRfQ0JQQ1lfMSwKICAgIFZDMV9WTENfSW50ZXJsYWNlZF9DQlBDWV8yLAogICAgVkMxX1ZMQ19JbnRlcmxhY2VkX0NCUENZXzMsCiAgICBWQzFfVkxDX0ludGVybGFjZWRfQ0JQQ1lfNCwKICAgIFZDMV9WTENfSW50ZXJsYWNlZF9DQlBDWV81LAogICAgVkMxX1ZMQ19JbnRlcmxhY2VkX0NCUENZXzYsCiAgICBWQzFfVkxDX0ludGVybGFjZWRfQ0JQQ1lfNywKICAgIFZDMV9WTENfTG93X01vdF9DaHJvbWFfRENfRGlmZl9WTEMsCiAgICBWQzFfVkxDX0xvd19Nb3RfSW50ZXJfVkxDLAogICAgVkMxX1ZMQ19Mb3dfTW90X0ludHJhX1ZMQywKICAgIFZDMV9WTENfTG93X01vdF9MdW1pbmFuY2VfRENfRGlmZl9WTEMsCiAgICBWQzFfVkxDX0xvd19SYXRlX1NVQkJMS1BBVCwKICAgIFZDMV9WTENfTG93X1JhdGVfVFRCTEssCiAgICBWQzFfVkxDX0xvd19SYXRlX1RUTUIsCiAgICBWQzFfVkxDX01lZGl1bV9SYXRlX1NVQkJMS1BBVCwKICAgIFZDMV9WTENfTWVkaXVtX1JhdGVfVFRCTEssCiAgICBWQzFfVkxDX01lZGl1bV9SYXRlX1RUTUIsCiAgICBWQzFfVkxDX01pZF9SYXRlX0ludGVyX1ZMQywKICAgIFZDMV9WTENfTWlkX1JhdGVfSW50cmFfVkxDLAogICAgVkMxX1ZMQ19NaXhlZF9NVl9NQl8wLAogICAgVkMxX1ZMQ19NaXhlZF9NVl9NQl8xLAogICAgVkMxX1ZMQ19NaXhlZF9NVl9NQl8yLAogICAgVkMxX1ZMQ19NaXhlZF9NVl9NQl8zLAogICAgVkMxX1ZMQ19NaXhlZF9NVl9NQl80LAogICAgVkMxX1ZMQ19NaXhlZF9NVl9NQl81LAogICAgVkMxX1ZMQ19NaXhlZF9NVl9NQl82LAogICAgVkMxX1ZMQ19NaXhlZF9NVl9NQl83LAogICAgVkMxX1ZMQ19Nb3RfVmVjdG9yX0RpZmZfVkxDXzAsCiAgICBWQzFfVkxDX01vdF9WZWN0b3JfRGlmZl9WTENfMSwKICAgIFZDMV9WTENfTW90X1ZlY3Rvcl9EaWZmX1ZMQ18yLAogICAgVkMxX1ZMQ19Nb3RfVmVjdG9yX0RpZmZfVkxDXzMsCiAgICBWQzFfVkxDX09uZV9GaWVsZF9SZWZfSWxhY2VfTVZfMCwKICAgIFZDMV9WTENfT25lX0ZpZWxkX1JlZl9JbGFjZV9NVl8xLAogICAgVkMxX1ZMQ19PbmVfRmllbGRfUmVmX0lsYWNlX01WXzIsCiAgICBWQzFfVkxDX09uZV9GaWVsZF9SZWZfSWxhY2VfTVZfMywKICAgIFZDMV9WTENfT25lX01WX01CXzAsCiAgICBWQzFfVkxDX09uZV9NVl9NQl8xLAogICAgVkMxX1ZMQ19PbmVfTVZfTUJfMiwKICAgIFZDMV9WTENfT25lX01WX01CXzMsCiAgICBWQzFfVkxDX09uZV9NVl9NQl80LAogICAgVkMxX1ZMQ19PbmVfTVZfTUJfNSwKICAgIFZDMV9WTENfT25lX01WX01CXzYsCiAgICBWQzFfVkxDX09uZV9NVl9NQl83LAogICAgVkMxX1ZMQ19QX1BpY3R1cmVfQ0JQQ1lfVkxDXzAsCiAgICBWQzFfVkxDX1BfUGljdHVyZV9DQlBDWV9WTENfMSwKICAgIFZDMV9WTENfUF9QaWN0dXJlX0NCUENZX1ZMQ18yLAogICAgVkMxX1ZMQ19QX1BpY3R1cmVfQ0JQQ1lfVkxDXzMsCiAgICBWQzFfVkxDX1R3b19GaWVsZF9SZWZfSWxhY2VfTVZfMCwKICAgIFZDMV9WTENfVHdvX0ZpZWxkX1JlZl9JbGFjZV9NVl8xLAogICAgVkMxX1ZMQ19Ud29fRmllbGRfUmVmX0lsYWNlX01WXzIsCiAgICBWQzFfVkxDX1R3b19GaWVsZF9SZWZfSWxhY2VfTVZfMywKICAgIFZDMV9WTENfVHdvX0ZpZWxkX1JlZl9JbGFjZV9NVl80LAogICAgVkMxX1ZMQ19Ud29fRmllbGRfUmVmX0lsYWNlX01WXzUsCiAgICBWQzFfVkxDX1R3b19GaWVsZF9SZWZfSWxhY2VfTVZfNiwKICAgIFZDMV9WTENfVHdvX0ZpZWxkX1JlZl9JbGFjZV9NVl83LAoKfSBWQzFfZVZMQ1RhYmxlczsKCnN0YXRpYyBJTUdfVUlOVDggTUJNT0RFVGFibGVGTERJW11bMl0gPSB7CiAgICB7VkMxX1ZMQ19PbmVfTVZfTUJfMCwgVkMxX1ZMQ19NaXhlZF9NVl9NQl8wfSwKICAgIHtWQzFfVkxDX09uZV9NVl9NQl8xLCBWQzFfVkxDX01peGVkX01WX01CXzF9LAogICAge1ZDMV9WTENfT25lX01WX01CXzIsIFZDMV9WTENfTWl4ZWRfTVZfTUJfMn0sCiAgICB7VkMxX1ZMQ19PbmVfTVZfTUJfMywgVkMxX1ZMQ19NaXhlZF9NVl9NQl8zfSwKICAgIHtWQzFfVkxDX09uZV9NVl9NQl80LCBWQzFfVkxDX01peGVkX01WX01CXzR9LAogICAge1ZDMV9WTENfT25lX01WX01CXzUsIFZDMV9WTENfTWl4ZWRfTVZfTUJfNX0sCiAgICB7VkMxX1ZMQ19PbmVfTVZfTUJfNiwgVkMxX1ZMQ19NaXhlZF9NVl9NQl82fSwKICAgIHtWQzFfVkxDX09uZV9NVl9NQl83LCBWQzFfVkxDX01peGVkX01WX01CXzd9LAp9OwoKc3RhdGljIElNR19VSU5UOCBNQk1PREVUYWJsZUZSTUlbXVsyXSA9IHsKICAgIHtWQzFfVkxDX0ludGVybGFjZV80TVZfTUJfMCwgVkMxX1ZMQ19JbnRlcmxhY2VfTm9uXzRNVl9NQl8wfSwKICAgIHtWQzFfVkxDX0ludGVybGFjZV80TVZfTUJfMSwgVkMxX1ZMQ19JbnRlcmxhY2VfTm9uXzRNVl9NQl8xfSwKICAgIHtWQzFfVkxDX0ludGVybGFjZV80TVZfTUJfMiwgVkMxX1ZMQ19JbnRlcmxhY2VfTm9uXzRNVl9NQl8yfSwKICAgIHtWQzFfVkxDX0ludGVybGFjZV80TVZfTUJfMywgVkMxX1ZMQ19JbnRlcmxhY2VfTm9uXzRNVl9NQl8zfSwKfTsKCnN0YXRpYyBJTUdfVUlOVDggQ0JQQ1lUYWJsZVByb2dbXSA9IHsKICAgIFZDMV9WTENfUF9QaWN0dXJlX0NCUENZX1ZMQ18wLAogICAgVkMxX1ZMQ19QX1BpY3R1cmVfQ0JQQ1lfVkxDXzEsCiAgICBWQzFfVkxDX1BfUGljdHVyZV9DQlBDWV9WTENfMiwKICAgIFZDMV9WTENfUF9QaWN0dXJlX0NCUENZX1ZMQ18zLAp9OwoKc3RhdGljIElNR19VSU5UOCBDQlBDWVRhYmxlSW50ZXJsYWNlZFtdID0gewogICAgVkMxX1ZMQ19JbnRlcmxhY2VkX0NCUENZXzAsCiAgICBWQzFfVkxDX0ludGVybGFjZWRfQ0JQQ1lfMSwKICAgIFZDMV9WTENfSW50ZXJsYWNlZF9DQlBDWV8yLAogICAgVkMxX1ZMQ19JbnRlcmxhY2VkX0NCUENZXzMsCiAgICBWQzFfVkxDX0ludGVybGFjZWRfQ0JQQ1lfNCwKICAgIFZDMV9WTENfSW50ZXJsYWNlZF9DQlBDWV81LAogICAgVkMxX1ZMQ19JbnRlcmxhY2VkX0NCUENZXzYsCiAgICBWQzFfVkxDX0ludGVybGFjZWRfQ0JQQ1lfNywKfTsKCnN0YXRpYyBJTUdfVUlOVDggRm91ck1WVGFibGVbXSA9IHsKICAgIFZDMV9WTENfRm91ck1WX1BhdHRlcm5fMCwKICAgIFZDMV9WTENfRm91ck1WX1BhdHRlcm5fMSwKICAgIFZDMV9WTENfRm91ck1WX1BhdHRlcm5fMiwKICAgIFZDMV9WTENfRm91ck1WX1BhdHRlcm5fMywKfTsKCnN0YXRpYyBJTUdfVUlOVDggSW50ZXJsYWNlMk1WVGFibGVbXSA9IHsKICAgIFZDMV9WTENfSW50ZXJsYWNlXzJfTVZQX1BhdHRlcm5fMCwKICAgIFZDMV9WTENfSW50ZXJsYWNlXzJfTVZQX1BhdHRlcm5fMSwKICAgIFZDMV9WTENfSW50ZXJsYWNlXzJfTVZQX1BhdHRlcm5fMiwKICAgIFZDMV9WTENfSW50ZXJsYWNlXzJfTVZQX1BhdHRlcm5fMywKfTsKCnN0YXRpYyBJTUdfVUlOVDggUHJvZ3Jlc3NpdmVNVlRhYmxlW10gPSB7CiAgICBWQzFfVkxDX01vdF9WZWN0b3JfRGlmZl9WTENfMCwKICAgIFZDMV9WTENfTW90X1ZlY3Rvcl9EaWZmX1ZMQ18xLAogICAgVkMxX1ZMQ19Nb3RfVmVjdG9yX0RpZmZfVkxDXzIsCiAgICBWQzFfVkxDX01vdF9WZWN0b3JfRGlmZl9WTENfMywKfTsKCnN0YXRpYyBJTUdfVUlOVDggSW50ZXJsYWNlZDFSZWZNVlRhYmxlW10gPSB7CiAgICBWQzFfVkxDX09uZV9GaWVsZF9SZWZfSWxhY2VfTVZfMCwKICAgIFZDMV9WTENfT25lX0ZpZWxkX1JlZl9JbGFjZV9NVl8xLAogICAgVkMxX1ZMQ19PbmVfRmllbGRfUmVmX0lsYWNlX01WXzIsCiAgICBWQzFfVkxDX09uZV9GaWVsZF9SZWZfSWxhY2VfTVZfMywKfTsKCnN0YXRpYyBJTUdfVUlOVDggTVZUYWJsZTJSZWZJbGFjZVtdID0gewogICAgVkMxX1ZMQ19Ud29fRmllbGRfUmVmX0lsYWNlX01WXzAsCiAgICBWQzFfVkxDX1R3b19GaWVsZF9SZWZfSWxhY2VfTVZfMSwKICAgIFZDMV9WTENfVHdvX0ZpZWxkX1JlZl9JbGFjZV9NVl8yLAogICAgVkMxX1ZMQ19Ud29fRmllbGRfUmVmX0lsYWNlX01WXzMsCiAgICBWQzFfVkxDX1R3b19GaWVsZF9SZWZfSWxhY2VfTVZfNCwKICAgIFZDMV9WTENfVHdvX0ZpZWxkX1JlZl9JbGFjZV9NVl81LAogICAgVkMxX1ZMQ19Ud29fRmllbGRfUmVmX0lsYWNlX01WXzYsCiAgICBWQzFfVkxDX1R3b19GaWVsZF9SZWZfSWxhY2VfTVZfNywKfTsKCnN0YXRpYyBJTUdfVUlOVDggSW50cmFUYWJsZVBRSW5kZXhMVDlbXSA9IHsKICAgIFZDMV9WTENfSGlnaF9SYXRlX0ludHJhX1ZMQywKICAgIFZDMV9WTENfSGlnaF9Nb3RfSW50cmFfVkxDLAogICAgVkMxX1ZMQ19NaWRfUmF0ZV9JbnRyYV9WTEMsCn07CgpzdGF0aWMgSU1HX1VJTlQ4IEludGVyVGFibGVQUUluZGV4TFQ5W10gPSB7CiAgICBWQzFfVkxDX0hpZ2hfUmF0ZV9JbnRlcl9WTEMsCiAgICBWQzFfVkxDX0hpZ2hfTW90X0ludGVyX1ZMQywKICAgIFZDMV9WTENfTWlkX1JhdGVfSW50ZXJfVkxDLAp9OwoKc3RhdGljIElNR19VSU5UOCBJbnRyYVRhYmxlUFFJbmRleEdUOFtdID0gewogICAgVkMxX1ZMQ19Mb3dfTW90X0ludHJhX1ZMQywKICAgIFZDMV9WTENfSGlnaF9Nb3RfSW50cmFfVkxDLAogICAgVkMxX1ZMQ19NaWRfUmF0ZV9JbnRyYV9WTEMsCn07CgpzdGF0aWMgSU1HX1VJTlQ4IEludGVyVGFibGVQUUluZGV4R1Q4W10gPSB7CiAgICBWQzFfVkxDX0xvd19Nb3RfSW50ZXJfVkxDLAogICAgVkMxX1ZMQ19IaWdoX01vdF9JbnRlcl9WTEMsCiAgICBWQzFfVkxDX01pZF9SYXRlX0ludGVyX1ZMQywKfTsKCi8qIFRPRE86IE1ha2UgdGFibGVzIGNvbnN0LCBkb24ndCBwb2x1dGUgbmFtZXNwYWNlICovCmV4dGVybiBJTUdfVUlOVDE2ICAgICAgICBnYXVpMTZ2YzFWbGNUYWJsZURhdGFbXTsKZXh0ZXJuIGNvbnN0IElNR19VSU5UMTYgICAgZ3VpMTZ2YzFWbGNUYWJsZVNpemU7CmV4dGVybiBJTUdfVUlOVDE2ICAgICAgICBnYXVpMTZ2YzFWbGNJbmRleERhdGFbVkxDX0lOREVYX1RBQkxFX1NJWkVdWzNdOwpleHRlcm4gY29uc3QgSU1HX1VJTlQ4ICAgIGd1aTh2YzFWbGNJbmRleFNpemU7CgoKc3RhdGljIElNR19VSU5UMTYgICAgICAgZ2F1aTE2SW52ZXJzZVtdID0gezI1NiwgMTI4LCA4NSwgNjQsIDUxLCA0MywgMzcsIDMyfTsgICAgLyogZmlndXJlIDY2ICovCnN0YXRpYyBJTUdfQk9PTCAgICAgICAgIGdETVZSQU5HRV9FeHRIb3Jpem9udGFsX1JlbWFwVGFibGVbXSA9IHswLCAxLCAwLCAxfTsKc3RhdGljIElNR19CT09MICAgICAgICAgZ0RNVlJBTkdFX0V4dFZlcnRpY2FsX1JlbWFwVGFibGVbXSA9IHswLCAwLCAxLCAxfTsKc3RhdGljIElNR19CWVRFICAgICAgICAgZ0JGUkFDVElPTl9EZW5SZW1hcFRhYmxlW10gPSB7MiwgMywgMywgNCwgNCwgNSwgNSwgNSwgNSwgNiwgNiwgNywgNywgNywgNywgNywgNywgOCwgOCwgOCwgOCwgMjU1LCAyNTV9OwpzdGF0aWMgSU1HX0JZVEUgICAgICAgICBnQkZSQUNUSU9OX051bVJlbWFwVGFibGVbXSA9IHsxLCAxLCAyLCAxLCAzLCAxLCAyLCAzLCA0LCAxLCA1LCAxLCAyLCAzLCA0LCA1LCA2LCAxLCAzLCA1LCA3LCAyNTUsIDI1NX07CgoKI2RlZmluZSBJTklUX0NPTlRFWFRfVkMxICAgIGNvbnRleHRfVkMxX3AgY3R4ID0gKGNvbnRleHRfVkMxX3ApIG9ial9jb250ZXh0LT5mb3JtYXRfZGF0YTsKCiNkZWZpbmUgU1VSRkFDRShpZCkgICAgKChvYmplY3Rfc3VyZmFjZV9wKSBvYmplY3RfaGVhcF9sb29rdXAoICZjdHgtPm9ial9jb250ZXh0LT5kcml2ZXJfZGF0YS0+c3VyZmFjZV9oZWFwLCBpZCApKQoKCnN0YXRpYyB2b2lkIHBud19WQzFfUXVlcnlDb25maWdBdHRyaWJ1dGVzKAogICAgVkFQcm9maWxlIHByb2ZpbGUsCiAgICBWQUVudHJ5cG9pbnQgZW50cnlwb2ludCwKICAgIFZBQ29uZmlnQXR0cmliICphdHRyaWJfbGlzdCwKICAgIGludCBudW1fYXR0cmlicykKewogICAgaW50IGk7CiAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJwbndfVkMxX1F1ZXJ5Q29uZmlnQXR0cmlidXRlc1xuIik7CgogICAgZm9yIChpID0gMDsgaSA8IG51bV9hdHRyaWJzOyBpKyspIHsKICAgICAgICBzd2l0Y2ggKGF0dHJpYl9saXN0W2ldLnR5cGUpIHsKICAgICAgICBjYXNlIFZBQ29uZmlnQXR0cmliTWF4UGljdHVyZVdpZHRoOgogICAgICAgICAgICBpZiAoKGVudHJ5cG9pbnQgPT0gVkFFbnRyeXBvaW50VkxEKSAmJgogICAgICAgICAgICAgICAgKHByb2ZpbGUgPT0gVkFQcm9maWxlVkMxQWR2YW5jZWQpKQogICAgICAgICAgICAgICAgYXR0cmliX2xpc3RbaV0udmFsdWUgPSBIV19TVVBQT1JURURfTUFYX1BJQ1RVUkVfV0lEVEhfVkMxOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBhdHRyaWJfbGlzdFtpXS52YWx1ZSA9IFZBX0FUVFJJQl9OT1RfU1VQUE9SVEVEOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFZBQ29uZmlnQXR0cmliTWF4UGljdHVyZUhlaWdodDoKICAgICAgICAgICAgaWYgKChlbnRyeXBvaW50ID09IFZBRW50cnlwb2ludFZMRCkgJiYKICAgICAgICAgICAgICAgIChwcm9maWxlID09IFZBUHJvZmlsZVZDMUFkdmFuY2VkKSkKICAgICAgICAgICAgICAgIGF0dHJpYl9saXN0W2ldLnZhbHVlID0gSFdfU1VQUE9SVEVEX01BWF9QSUNUVVJFX0hFSUdIVF9WQzE7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGF0dHJpYl9saXN0W2ldLnZhbHVlID0gVkFfQVRUUklCX05PVF9TVVBQT1JURUQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCn0KCnN0YXRpYyBWQVN0YXR1cyBwbndfVkMxX1ZhbGlkYXRlQ29uZmlnKAogICAgb2JqZWN0X2NvbmZpZ19wIG9ial9jb25maWcpCnsKICAgIGludCBpOwogICAgLyogQ2hlY2sgYWxsIGF0dHJpYnV0ZXMgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBvYmpfY29uZmlnLT5hdHRyaWJfY291bnQ7IGkrKykgewogICAgICAgIHN3aXRjaCAob2JqX2NvbmZpZy0+YXR0cmliX2xpc3RbaV0udHlwZSkgewogICAgICAgIGNhc2UgVkFDb25maWdBdHRyaWJSVEZvcm1hdDoKICAgICAgICAgICAgLyogSWdub3JlICovCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX0FUVFJfTk9UX1NVUFBPUlRFRDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwp9CgoKc3RhdGljIHZvaWQgcHNiX19WQzFfcGFja192bGNfdGFibGVzKHVpbnQxNl90ICp2bGNfcGFja2VkX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZ2F1aTE2dmMxVmxjVGFibGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd1aTE2dmMxVmxjVGFibGVTaXplKQp7CiAgICBpbnQgaSwgajsKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAvKiBQYWNrIHRoZSBWTEMgdGFibGVzIGludG8gMzItYml0IGZvcm1hdCByZWFkeSBmb3IgRE1BIGludG8gMTUtYml0IHdpZGUgUkFNLiAgICAgICAgKi8KICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICBmb3IgKGkgPSAwOyBpIDwgZ3VpMTZ2YzFWbGNUYWJsZVNpemU7IGkrKykgewogICAgICAgIGogPSBpICogMzsKICAgICAgICB2bGNfcGFja2VkX2RhdGFbaV0gPSAwOwogICAgICAgIC8qIG9wY29kZSAxNDoxMiAqLy8qIHdpZHRoIDExOjkgKi8vKiBzeW1ib2wgODowICovCiAgICAgICAgdmxjX3BhY2tlZF9kYXRhW2ldID0gKChnYXVpMTZ2YzFWbGNUYWJsZURhdGFbaiArIDBdKSA8PCAxMikgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ2F1aTE2dmMxVmxjVGFibGVEYXRhW2ogKyAxXSkgPDwgOSkgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2F1aTE2dmMxVmxjVGFibGVEYXRhW2ogKyAyXSk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHBzYl9fVkMxX3BhY2tfaW5kZXhfdGFibGVfaW5mbyh1aW50MzJfdCAqcGFja2VkX2luZGV4X3RhYmxlLAogICAgICAgIHVpbnQxNl90IGluZGV4X2RhdGFbVkxDX0lOREVYX1RBQkxFX1NJWkVdWzNdKQp7CiAgICB1aW50MzJfdCAgc3RhcnQgPSAwLCBlbmQgPSAwLCBsZW5ndGggPSAwLCBvcGNvZGUgPSAwLCB3aWR0aCA9IDA7CiAgICBpbnQgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgVkxDX0lOREVYX1RBQkxFX1NJWkU7IGkrKykgewogICAgICAgIHN0YXJ0ID0gaW5kZXhfZGF0YVtpXVsyXTsKICAgICAgICBpZiAoaSA8IChWTENfSU5ERVhfVEFCTEVfU0laRSAtIDEpKSB7IC8vTWFrZSBzdXJlIHdlIGRvbid0IGV4Y2VlZCB0aGUgYm91bmQKICAgICAgICAgICAgZW5kID0gaW5kZXhfZGF0YVtpKzFdWzJdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgNTAwOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBlbmQgLSBzdGFydDsKICAgICAgICB3aWR0aCA9IGluZGV4X2RhdGFbaV1bMV07CiAgICAgICAgb3Bjb2RlID0gaW5kZXhfZGF0YVtpXVswXTsKCiAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAicGFja2VkX2luZGV4X3RhYmxlWyUwMmRdLT5zdGFydCA9ICUwOHggbGVuZ3RoID0gJTA4eCAoJWQpXG4iLCBpLCBzdGFydCAqIDIsIGxlbmd0aCAqIDIsIGxlbmd0aCAqIDIpOwoKICAgICAgICBwYWNrZWRfaW5kZXhfdGFibGVbaV0gPSBvcGNvZGU7CiAgICAgICAgcGFja2VkX2luZGV4X3RhYmxlW2ldIDw8PSAzOwogICAgICAgIHBhY2tlZF9pbmRleF90YWJsZVtpXSB8PSB3aWR0aDsKICAgICAgICBwYWNrZWRfaW5kZXhfdGFibGVbaV0gPDw9IDk7CiAgICAgICAgcGFja2VkX2luZGV4X3RhYmxlW2ldIHw9IGxlbmd0aDsKICAgICAgICBwYWNrZWRfaW5kZXhfdGFibGVbaV0gPDw9IDE2OwogICAgICAgIHBhY2tlZF9pbmRleF90YWJsZVtpXSB8PSBzdGFydDsKICAgIH0KfQoKc3RhdGljIFZBU3RhdHVzIHBzYl9fVkMxX2NoZWNrX2xlZ2FsX3BpY3R1cmUob2JqZWN0X2NvbnRleHRfcCBvYmpfY29udGV4dCwgb2JqZWN0X2NvbmZpZ19wIG9ial9jb25maWcpCnsKICAgIFZBU3RhdHVzIHZhU3RhdHVzID0gVkFfU1RBVFVTX1NVQ0NFU1M7CgogICAgQ0hFQ0tfQ09OVEVYVChvYmpfY29udGV4dCk7CgogICAgQ0hFQ0tfQ09ORklHKG9ial9jb25maWcpOwoKICAgIC8qIE1TVkRYIGRlY29kZSBjYXBhYmlsaXR5IGZvciBWQy0xOgogICAgICogICAgIFNQQE1MCiAgICAgKiAgICAgTVBASEwKICAgICAqICAgICBBUEBMMwogICAgICoKICAgICAqIFJlZmVyIHRvIFRhYmxlIDI1MyAoTGltaXRhdGlvbnMgb2YgcHJvZmlsZXMgYW5kIGxldmVscykgb2YgU01QVEUtNDIxTQogICAgICovCiAgICBzd2l0Y2ggKG9ial9jb25maWctPnByb2ZpbGUpIHsKICAgIGNhc2UgVkFQcm9maWxlVkMxU2ltcGxlOgogICAgICAgIGlmICgob2JqX2NvbnRleHQtPnBpY3R1cmVfd2lkdGggPD0gMCkgfHwgKG9ial9jb250ZXh0LT5waWN0dXJlX3dpZHRoID4gMzUyKQogICAgICAgICAgICB8fCAob2JqX2NvbnRleHQtPnBpY3R1cmVfaGVpZ2h0IDw9IDApIHx8IChvYmpfY29udGV4dC0+cGljdHVyZV9oZWlnaHQgPiAyODgpKSB7CiAgICAgICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX1JFU09MVVRJT05fTk9UX1NVUFBPUlRFRDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBWQVByb2ZpbGVWQzFNYWluOgogICAgICAgIGlmICgob2JqX2NvbnRleHQtPnBpY3R1cmVfd2lkdGggPD0gMCkgfHwgKG9ial9jb250ZXh0LT5waWN0dXJlX3dpZHRoID4gMTkyMCkKICAgICAgICAgICAgfHwgKG9ial9jb250ZXh0LT5waWN0dXJlX2hlaWdodCA8PSAwKSB8fCAob2JqX2NvbnRleHQtPnBpY3R1cmVfaGVpZ2h0ID4gMTA4OCkpIHsKICAgICAgICAgICAgdmFTdGF0dXMgPSBWQV9TVEFUVVNfRVJST1JfUkVTT0xVVElPTl9OT1RfU1VQUE9SVEVEOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFZBUHJvZmlsZVZDMUFkdmFuY2VkOgogICAgICAgIGlmICgob2JqX2NvbnRleHQtPnBpY3R1cmVfd2lkdGggPD0gMCkgfHwgKG9ial9jb250ZXh0LT5waWN0dXJlX3dpZHRoID4gMjA0OCkKICAgICAgICAgICAgfHwgKG9ial9jb250ZXh0LT5waWN0dXJlX2hlaWdodCA8PSAwKSB8fCAob2JqX2NvbnRleHQtPnBpY3R1cmVfaGVpZ2h0ID4gMjA0OCkpIHsKICAgICAgICAgICAgdmFTdGF0dXMgPSBWQV9TVEFUVVNfRVJST1JfUkVTT0xVVElPTl9OT1RfU1VQUE9SVEVEOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX1VOU1VQUE9SVEVEX1BST0ZJTEU7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIHZhU3RhdHVzOwp9CgpzdGF0aWMgdm9pZCBwbndfVkMxX0Rlc3Ryb3lDb250ZXh0KG9iamVjdF9jb250ZXh0X3Agb2JqX2NvbnRleHQpOwpzdGF0aWMgdm9pZCBwc2JfX1ZDMV9wcm9jZXNzX3NsaWNlX2RhdGEoY29udGV4dF9ERUNfcCBkZWNfY3R4LCBWQVNsaWNlUGFyYW1ldGVyQnVmZmVyQmFzZSAqdmxkX3NsaWNlX3BhcmFtKTsKc3RhdGljIHZvaWQgcHNiX19WQzFfZW5kX3NsaWNlKGNvbnRleHRfREVDX3AgZGVjX2N0eCk7CnN0YXRpYyB2b2lkIHBzYl9fVkMxX2JlZ2luX3NsaWNlKGNvbnRleHRfREVDX3AgZGVjX2N0eCwgVkFTbGljZVBhcmFtZXRlckJ1ZmZlckJhc2UgKnZsZF9zbGljZV9wYXJhbSk7CnN0YXRpYyBWQVN0YXR1cyBwbndfVkMxX3Byb2Nlc3NfYnVmZmVyKGNvbnRleHRfREVDX3AgZGVjX2N0eCwgb2JqZWN0X2J1ZmZlcl9wIGJ1ZmZlcik7CgpzdGF0aWMgVkFTdGF0dXMgcG53X1ZDMV9DcmVhdGVDb250ZXh0KAogICAgb2JqZWN0X2NvbnRleHRfcCBvYmpfY29udGV4dCwKICAgIG9iamVjdF9jb25maWdfcCBvYmpfY29uZmlnKQp7CiAgICBWQVN0YXR1cyB2YVN0YXR1cyA9IFZBX1NUQVRVU19TVUNDRVNTOwogICAgY29udGV4dF9WQzFfcCBjdHg7CiAgICAvKiBWYWxpZGF0ZSBmbGFnICovCiAgICAvKiBWYWxpZGF0ZSBwaWN0dXJlIGRpbWVuc2lvbnMgKi8KICAgIHZhU3RhdHVzID0gcHNiX19WQzFfY2hlY2tfbGVnYWxfcGljdHVyZShvYmpfY29udGV4dCwgb2JqX2NvbmZpZyk7CiAgICBpZiAoVkFfU1RBVFVTX1NVQ0NFU1MgIT0gdmFTdGF0dXMpIHsKICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0VSUk9SLCAiV2FybmluZzogZ290IGludmFsaWQgcGljdHVyZSwgYnV0IHN0aWxsIGxldCBnb1xuIik7CiAgICAgICAgLyogREVCVUdfRkFJTFVSRTsKICAgICAgICByZXR1cm4gdmFTdGF0dXM7ICovCiAgICAgICAgdmFTdGF0dXMgPSBWQV9TVEFUVVNfU1VDQ0VTUzsKICAgIH0KCiAgICBjdHggPSAoY29udGV4dF9WQzFfcCkgbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29udGV4dF9WQzFfcykpOwogICAgQ0hFQ0tfQUxMT0NBVElPTihjdHgpOwoKICAgIG1lbXNldChjdHgsIDAsIHNpemVvZihzdHJ1Y3QgY29udGV4dF9WQzFfcykpOwogICAgb2JqX2NvbnRleHQtPmZvcm1hdF9kYXRhID0gKHZvaWQqKSBjdHg7CiAgICBjdHgtPm9ial9jb250ZXh0ID0gb2JqX2NvbnRleHQ7CiAgICBjdHgtPnBpY19wYXJhbXMgPSBOVUxMOwoKICAgIGN0eC0+ZGVjX2N0eC5iZWdpbl9zbGljZSA9IHBzYl9fVkMxX2JlZ2luX3NsaWNlOwogICAgY3R4LT5kZWNfY3R4LnByb2Nlc3Nfc2xpY2UgPSBwc2JfX1ZDMV9wcm9jZXNzX3NsaWNlX2RhdGE7CiAgICBjdHgtPmRlY19jdHguZW5kX3NsaWNlID0gcHNiX19WQzFfZW5kX3NsaWNlOwogICAgY3R4LT5kZWNfY3R4LnByb2Nlc3NfYnVmZmVyID0gcG53X1ZDMV9wcm9jZXNzX2J1ZmZlcjsKCiAgICBzd2l0Y2ggKG9ial9jb25maWctPnByb2ZpbGUpIHsKICAgIGNhc2UgVkFQcm9maWxlVkMxU2ltcGxlOgogICAgICAgIGN0eC0+cHJvZmlsZSA9IFdNRl9QUk9GSUxFX1NJTVBMRTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIFZBUHJvZmlsZVZDMU1haW46CiAgICAgICAgY3R4LT5wcm9maWxlID0gV01GX1BST0ZJTEVfTUFJTjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIFZBUHJvZmlsZVZDMUFkdmFuY2VkOgogICAgICAgIGN0eC0+cHJvZmlsZSA9IFdNRl9QUk9GSUxFX0FEVkFOQ0VEOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgQVNTRVJUKDAgPT0gMSk7CiAgICAgICAgdmFTdGF0dXMgPSBWQV9TVEFUVVNfRVJST1JfVU5LTk9XTjsKICAgIH0KCiAgICAvLyBUT0RPCgogICAgaWYgKHZhU3RhdHVzID09IFZBX1NUQVRVU19TVUNDRVNTKSB7CiAgICAgICAgdmFTdGF0dXMgPSBwc2JfYnVmZmVyX2NyZWF0ZShvYmpfY29udGV4dC0+ZHJpdmVyX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVMT0FEX0JVRkZFUl9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNiX2J0X3ZwdV9vbmx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+cHJlbG9hZF9idWZmZXIpOwogICAgICAgIERFQlVHX0ZBSUxVUkU7CiAgICB9CiAgICBjdHgtPmRlY19jdHgucHJlbG9hZF9idWZmZXIgPSAmY3R4LT5wcmVsb2FkX2J1ZmZlcjsKCiAgICBpZiAodmFTdGF0dXMgPT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKICAgICAgICB1bnNpZ25lZCBjaGFyICpwcmVsb2FkOwogICAgICAgIGlmICgwID09ICBwc2JfYnVmZmVyX21hcCgmY3R4LT5wcmVsb2FkX2J1ZmZlciwgJnByZWxvYWQpKSB7CiAgICAgICAgICAgIG1lbXNldChwcmVsb2FkLCAwLCBQUkVMT0FEX0JVRkZFUl9TSVpFKTsKICAgICAgICAgICAgcHNiX2J1ZmZlcl91bm1hcCgmY3R4LT5wcmVsb2FkX2J1ZmZlcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFTdGF0dXMgPSBWQV9TVEFUVVNfRVJST1JfQUxMT0NBVElPTl9GQUlMRUQ7CiAgICAgICAgICAgIERFQlVHX0ZBSUxVUkU7CiAgICAgICAgfQogICAgfQoKICAgIGlmICh2YVN0YXR1cyA9PSBWQV9TVEFUVVNfU1VDQ0VTUykgewogICAgICAgIHZhU3RhdHVzID0gcHNiX2J1ZmZlcl9jcmVhdGUob2JqX2NvbnRleHQtPmRyaXZlcl9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVYTVNCX0JVRkZFUl9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNiX2J0X3ZwdV9vbmx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+YXV4X21zYl9idWZmZXIpOwogICAgICAgIERFQlVHX0ZBSUxVUkU7CiAgICB9CgogICAgaWYgKHZhU3RhdHVzID09IFZBX1NUQVRVU19TVUNDRVNTKSB7CiAgICAgICAgdmFTdGF0dXMgPSBwc2JfYnVmZmVyX2NyZWF0ZShvYmpfY29udGV4dC0+ZHJpdmVyX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIqMTAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzYl9idF92cHVfb25seSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPmF1eF9saW5lX2J1ZmZlcik7CiAgICAgICAgREVCVUdfRkFJTFVSRTsKICAgIH0KCiAgICBpZiAodmFTdGF0dXMgPT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKI2lmZGVmIFZDMV9IZWFkZXJfUGFyc2VyX0hXCiAgICAgICAgICAgIHZhU3RhdHVzID0gcHNiX2J1ZmZlcl9jcmVhdGUob2JqX2NvbnRleHQtPmRyaXZlcl9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTAwMCAqIDMsICAvLzB4ODgwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzYl9idF92cHVfb25seSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5iaXRwbGFuZV9od19idWZmZXIpOwogICAgICAgICAgICBERUJVR19GQUlMVVJFOwojZWxzZQogICAgICAgICAgICB2YVN0YXR1cyA9IHBzYl9idWZmZXJfY3JlYXRlKG9ial9jb250ZXh0LT5kcml2ZXJfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNiX2J0X3ZwdV9vbmx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPmJpdHBsYW5lX2h3X2J1ZmZlcik7CiAgICAgICAgICAgIERFQlVHX0ZBSUxVUkU7CiNlbmRpZgoKICAgIH0KCiAgICBpZiAodmFTdGF0dXMgPT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKICAgICAgICB2YVN0YXR1cyA9IHBzYl9idWZmZXJfY3JlYXRlKG9ial9jb250ZXh0LT5kcml2ZXJfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChndWkxNnZjMVZsY1RhYmxlU2l6ZSAqIHNpemVvZihJTUdfVUlOVDE2KSArIDB4ZmZmKSAmIH4weGZmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzYl9idF9jcHVfdnB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+dmxjX3BhY2tlZF90YWJsZSk7CiAgICAgICAgREVCVUdfRkFJTFVSRTsKICAgIH0KICAgIGlmICh2YVN0YXR1cyA9PSBWQV9TVEFUVVNfU1VDQ0VTUykgewogICAgICAgIHVpbnQxNl90ICp2bGNfcGFja2VkX2RhdGFfYWRkcmVzczsKICAgICAgICBpZiAoMCA9PSAgcHNiX2J1ZmZlcl9tYXAoJmN0eC0+dmxjX3BhY2tlZF90YWJsZSwgKHVuc2lnbmVkIGNoYXIgKiopJnZsY19wYWNrZWRfZGF0YV9hZGRyZXNzKSkgewogICAgICAgICAgICBwc2JfX1ZDMV9wYWNrX3ZsY190YWJsZXModmxjX3BhY2tlZF9kYXRhX2FkZHJlc3MsIGdhdWkxNnZjMVZsY1RhYmxlRGF0YSwgZ3VpMTZ2YzFWbGNUYWJsZVNpemUpOwogICAgICAgICAgICBwc2JfYnVmZmVyX3VubWFwKCZjdHgtPnZsY19wYWNrZWRfdGFibGUpOwogICAgICAgICAgICBwc2JfX1ZDMV9wYWNrX2luZGV4X3RhYmxlX2luZm8oY3R4LT52bGNfcGFja2VkX2luZGV4X3RhYmxlLCBnYXVpMTZ2YzFWbGNJbmRleERhdGEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX0FMTE9DQVRJT05fRkFJTEVEOwogICAgICAgICAgICBERUJVR19GQUlMVVJFOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodmFTdGF0dXMgPT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKICAgICAgICB2YVN0YXR1cyA9IHZsZF9kZWNfQ3JlYXRlQ29udGV4dCgmY3R4LT5kZWNfY3R4LCBvYmpfY29udGV4dCk7CiAgICAgICAgREVCVUdfRkFJTFVSRTsKICAgIH0KCiAgICBpZiAodmFTdGF0dXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKICAgICAgICBwbndfVkMxX0Rlc3Ryb3lDb250ZXh0KG9ial9jb250ZXh0KTsKICAgIH0KCiAgICByZXR1cm4gdmFTdGF0dXM7Cn0KCnN0YXRpYyB2b2lkIHBud19WQzFfRGVzdHJveUNvbnRleHQoCiAgICBvYmplY3RfY29udGV4dF9wIG9ial9jb250ZXh0KQp7CiAgICBJTklUX0NPTlRFWFRfVkMxCiAgICBpbnQgaTsKCiAgICB2bGRfZGVjX0Rlc3Ryb3lDb250ZXh0KCZjdHgtPmRlY19jdHgpOwoKICAgIHBzYl9idWZmZXJfZGVzdHJveSgmY3R4LT52bGNfcGFja2VkX3RhYmxlKTsKICAgIHBzYl9idWZmZXJfZGVzdHJveSgmY3R4LT5hdXhfbXNiX2J1ZmZlcik7CiAgICBwc2JfYnVmZmVyX2Rlc3Ryb3koJmN0eC0+YXV4X2xpbmVfYnVmZmVyKTsKICAgIHBzYl9idWZmZXJfZGVzdHJveSgmY3R4LT5wcmVsb2FkX2J1ZmZlcik7CiAgICBwc2JfYnVmZmVyX2Rlc3Ryb3koJmN0eC0+Yml0cGxhbmVfaHdfYnVmZmVyKTsKCiAgICBpZiAoY3R4LT5waWNfcGFyYW1zKSB7CiAgICAgICAgZnJlZShjdHgtPnBpY19wYXJhbXMpOwogICAgICAgIGN0eC0+cGljX3BhcmFtcyA9IE5VTEw7CiAgICB9CgogICAgZnJlZShvYmpfY29udGV4dC0+Zm9ybWF0X2RhdGEpOwogICAgb2JqX2NvbnRleHQtPmZvcm1hdF9kYXRhID0gTlVMTDsKfQoKc3RhdGljIHVpbnQzMl90IHBzYl9fdmMxX2dldF9penpfc2Nhbl9pbmRleChjb250ZXh0X1ZDMV9wIGN0eCkKewogICAgaWYgKGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSA9PSBWQzFfRkNNX0ZSTUkpIHsKICAgICAgICAvLyBQX1BJQ1RVUkVfQURWX0ZSQU1FX0lOVEVSTEFDRQogICAgICAgIHJldHVybiAzOwogICAgfQogICAgaWYgKFBJQ19UWVBFX0lTX0lOVFJBKGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUpKSB7CiAgICAgICAgLy8gSS1waWN0dXJlIHRhYmxlcwogICAgICAgIHJldHVybiA0OwogICAgfSBlbHNlIHsKICAgICAgICAvKiBBc3N1bWUgUCBmcmFtZSAqLwogICAgICAgIGlmICgoY3R4LT5wcm9maWxlID09IFdNRl9QUk9GSUxFX1NJTVBMRSkgfHwKICAgICAgICAgICAgKGN0eC0+cHJvZmlsZSA9PSBXTUZfUFJPRklMRV9NQUlOKSkgewogICAgICAgICAgICAvLyBQLXBpY3R1cmUgU2ltcGxlL01haW4gdGFibGVzCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0gZWxzZSB7IC8qIEFkdmFuY2VkIHByb2ZpbGUgKi8KICAgICAgICAgICAgaWYgKGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSA9PSBWQzFfRkNNX1ApIHsKICAgICAgICAgICAgICAgIC8vIFAtcGljdHVyZSBBZHZhbmNlZCBQcm9ncmVzc2l2ZSB0YWJsZXMKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9IGVsc2UgeyAvKiBJbnRlcmxhY2VkIEZpZWxkICovCiAgICAgICAgICAgICAgICAvLyBQLXBpY3R1cmUgQWR2YW5jZWQgRmllbGQgSW50ZXJsYWNlZCB0YWJsZXMKICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgoKLy8jZGVmaW5lIHBzYl9fdHJhY2VfbWVzc2FnZSguLi4pCgojZGVmaW5lIFAoeCkgICAgcHNiX190cmFjZV9tZXNzYWdlKCJQQVJBTVM6ICIgI3ggIlx0PSAlZFxuIiwgcC0+eCkKc3RhdGljIHZvaWQgcHNiX19WQzFfdHJhY2VfcGljX3BhcmFtcyhWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWQzEgKnApCnsKI2RlZmluZSBQMCh4KSAgIHBzYl9fdHJhY2VfbWVzc2FnZSgiUEFSQU1TOiAiICN4ICJcdD0gJWRcbiIsIHAtPnNlcXVlbmNlX2ZpZWxkcy5iaXRzLngpCiAgICBQMChpbnRlcmxhY2UpOwogICAgUDAoc3luY21hcmtlcik7CiAgICBQMChvdmVybGFwKTsKCiAgICBQKGNvZGVkX3dpZHRoKTsKICAgIFAoY29kZWRfaGVpZ2h0KTsKCiNkZWZpbmUgUDIoeCkgICBwc2JfX3RyYWNlX21lc3NhZ2UoIlBBUkFNUzogIiAjeCAiXHQ9ICVkXG4iLCBwLT5waWN0dXJlX2ZpZWxkcy5iaXRzLngpCiAgICAvKiBwaWN0dXJlX2ZpZWxkcyAqLwogICAgUDIocGljdHVyZV90eXBlKTsKICAgIFAyKGZyYW1lX2NvZGluZ19tb2RlKTsKICAgIFAyKHRvcF9maWVsZF9maXJzdCk7CiAgICBQMihpc19maXJzdF9maWVsZCk7CiAgICBQMihpbnRlbnNpdHlfY29tcGVuc2F0aW9uKTsKCiNkZWZpbmUgUDEoeCkgICBwc2JfX3RyYWNlX21lc3NhZ2UoIlBBUkFNUzogIiAjeCAiXHQ9ICVkXG4iLCBwLT5lbnRyeXBvaW50X2ZpZWxkcy5iaXRzLngpCiAgICBQMShjbG9zZWRfZW50cnkpOwogICAgUDEoYnJva2VuX2xpbmspOwogICAgUDEobG9vcGZpbHRlcik7CgogICAgUChjb25kaXRpb25hbF9vdmVybGFwX2ZsYWcpOwogICAgUChmYXN0X3V2bWNfZmxhZyk7CgojZGVmaW5lIFAzKHgpICAgcHNiX190cmFjZV9tZXNzYWdlKCJQQVJBTVM6ICIgI3ggIlx0PSAlZFxuIiwgcC0+cmFuZ2VfbWFwcGluZ19maWVsZHMuYml0cy54KQogICAgLyogcmFuZ2VfbWFwcGluZ19maWVsZHMgKi8KICAgIFAzKGx1bWFfZmxhZyk7CiAgICBQMyhsdW1hKTsKICAgIFAzKGNocm9tYV9mbGFnKTsKICAgIFAzKGNocm9tYSk7CgogICAgUChiX3BpY3R1cmVfZnJhY3Rpb24pOwogICAgUChjYnBfdGFibGUpOwogICAgUChtYl9tb2RlX3RhYmxlKTsKICAgIFAocmFuZ2VfcmVkdWN0aW9uX2ZyYW1lKTsKICAgIFAocm91bmRpbmdfY29udHJvbCk7CiAgICBQKHBvc3RfcHJvY2Vzc2luZyk7CiAgICBQKHBpY3R1cmVfcmVzb2x1dGlvbl9pbmRleCk7CiAgICBQKGx1bWFfc2NhbGUpOwogICAgUChsdW1hX3NoaWZ0KTsKCiAgICBQKHJhd19jb2RpbmcudmFsdWUpOwogICAgUChiaXRwbGFuZV9wcmVzZW50LnZhbHVlKTsKCiNkZWZpbmUgUDQoeCkgICBwc2JfX3RyYWNlX21lc3NhZ2UoIlBBUkFNUzogIiAjeCAiXHQ9ICVkXG4iLCBwLT5yZWZlcmVuY2VfZmllbGRzLmJpdHMueCkKICAgIFA0KHJlZmVyZW5jZV9kaXN0YW5jZV9mbGFnKTsKICAgIFA0KHJlZmVyZW5jZV9kaXN0YW5jZSk7CiAgICBQNChudW1fcmVmZXJlbmNlX3BpY3R1cmVzKTsKICAgIFA0KHJlZmVyZW5jZV9maWVsZF9waWNfaW5kaWNhdG9yKTsKCiNkZWZpbmUgUDUoeCkgICBwc2JfX3RyYWNlX21lc3NhZ2UoIlBBUkFNUzogIiAjeCAiXHQ9ICVkXG4iLCBwLT5tdl9maWVsZHMuYml0cy54KQogICAgUDUobXZfbW9kZSk7CiAgICBQNShtdl9tb2RlMik7CgogICAgUDUobXZfdGFibGUpOwogICAgUDUodHdvX212X2Jsb2NrX3BhdHRlcm5fdGFibGUpOwogICAgUDUoZm91cl9tdl9zd2l0Y2gpOwogICAgUDUoZm91cl9tdl9ibG9ja19wYXR0ZXJuX3RhYmxlKTsKICAgIFA1KGV4dGVuZGVkX212X2ZsYWcpOwogICAgUDUoZXh0ZW5kZWRfbXZfcmFuZ2UpOwogICAgUDUoZXh0ZW5kZWRfZG12X2ZsYWcpOwogICAgUDUoZXh0ZW5kZWRfZG12X3JhbmdlKTsKCiNkZWZpbmUgUDYoeCkgICBwc2JfX3RyYWNlX21lc3NhZ2UoIlBBUkFNUzogIiAjeCAiXHQ9ICVkXG4iLCBwLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLngpCgogICAgUDYoZHF1YW50KTsKICAgIFA2KHF1YW50aXplcik7CiAgICBQNihoYWxmX3FwKTsKICAgIFA2KHBpY19xdWFudGl6ZXJfc2NhbGUpOwogICAgUDYocGljX3F1YW50aXplcl90eXBlKTsKICAgIFA2KGRxX2ZyYW1lKTsKICAgIFA2KGRxX3Byb2ZpbGUpOwogICAgUDYoZHFfc2JfZWRnZSk7CiAgICBQNihkcV9kYl9lZGdlKTsKICAgIFA2KGRxX2JpbmFyeV9sZXZlbCk7CiAgICBQNihhbHRfcGljX3F1YW50aXplcik7CgojZGVmaW5lIFA3KHgpICAgcHNiX190cmFjZV9tZXNzYWdlKCJQQVJBTVM6ICIgI3ggIlx0PSAlZFxuIiwgcC0+dHJhbnNmb3JtX2ZpZWxkcy5iaXRzLngpCgogICAgUDcodmFyaWFibGVfc2l6ZWRfdHJhbnNmb3JtX2ZsYWcpOwogICAgUDcobWJfbGV2ZWxfdHJhbnNmb3JtX3R5cGVfZmxhZyk7CiAgICBQNyhmcmFtZV9sZXZlbF90cmFuc2Zvcm1fdHlwZSk7CiAgICBQNyh0cmFuc2Zvcm1fYWNfY29kaW5nc2V0X2lkeDEpOwogICAgUDcodHJhbnNmb3JtX2FjX2NvZGluZ3NldF9pZHgyKTsKICAgIFA3KGludHJhX3RyYW5zZm9ybV9kY190YWJsZSk7Cn0KCgpzdGF0aWMgVkFTdGF0dXMgcHNiX19WQzFfcHJvY2Vzc19waWN0dXJlX3BhcmFtKGNvbnRleHRfVkMxX3AgY3R4LCBvYmplY3RfYnVmZmVyX3Agb2JqX2J1ZmZlcikKewogICAgVkFTdGF0dXMgdmFTdGF0dXM7CiAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWQzEgKnBpY19wYXJhbXM7CiAgICBJTUdfVUlOVDggICB1aThMdW1hU2NhbGUxID0gMCwgdWk4THVtYVNoaWZ0MSA9IDAsIHVpOEx1bWFTY2FsZTIgPSAwLCB1aThMdW1hU2hpZnQyID0gMDsKICAgIG9iamVjdF9zdXJmYWNlX3Agb2JqX3N1cmZhY2UgPSBjdHgtPm9ial9jb250ZXh0LT5jdXJyZW50X3JlbmRlcl90YXJnZXQ7CgogICAgQVNTRVJUKG9ial9idWZmZXItPnR5cGUgPT0gVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVHlwZSk7CiAgICBBU1NFUlQob2JqX2J1ZmZlci0+bnVtX2VsZW1lbnRzID09IDEpOwogICAgQVNTRVJUKG9ial9idWZmZXItPnNpemUgPT0gc2l6ZW9mKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZDMSkpOwoKICAgIENIRUNLX0lOVkFMSURfUEFSQU0oKG9ial9idWZmZXItPm51bV9lbGVtZW50cyAhPSAxKSB8fAogICAgICAgIChvYmpfYnVmZmVyLT5zaXplICE9IHNpemVvZihWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWQzEpKSk7CgogICAgLyogVHJhbnNmZXIgb3duZXJzaGlwIG9mIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZDMSBkYXRhICovCiAgICBwaWNfcGFyYW1zID0gKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZDMSAqKSBvYmpfYnVmZmVyLT5idWZmZXJfZGF0YTsKICAgIGlmIChjdHgtPnBpY19wYXJhbXMpIHsKICAgICAgICBmcmVlKGN0eC0+cGljX3BhcmFtcyk7CiAgICB9CiAgICBjdHgtPnBpY19wYXJhbXMgPSBwaWNfcGFyYW1zOwogICAgb2JqX2J1ZmZlci0+YnVmZmVyX2RhdGEgPSBOVUxMOwogICAgb2JqX2J1ZmZlci0+c2l6ZSA9IDA7CgogICAgaWYgKHBzYl92aWRlb190cmFjZV9mcCAmJiAocHNiX3ZpZGVvX3RyYWNlX2xldmVsICYgVkFCVUZfVFJBQ0UpKQogICAgICAgIHBzYl9fVkMxX3RyYWNlX3BpY19wYXJhbXMocGljX3BhcmFtcyk7CgogICAgaWYgKHBpY19wYXJhbXMtPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMucXVhbnRpemVyID09IDApIHsKICAgICAgICAvKiBOb24gdW5pZm9ybSBxdWFudGl6ZXIgaW5kaWNhdGVzIFBRSU5ERVggPiA4ICovCiAgICAgICAgY3R4LT5wcWluZGV4X2d0OCA9IChwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLnBpY19xdWFudGl6ZXJfdHlwZSA9PSAwKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogUFFVQU5UIChwaWNfcXVhbnRpemVyX3NjYWxlKSA9PSBQUUlOREVYICovCiAgICAgICAgY3R4LT5wcWluZGV4X2d0OCA9IChwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLnBpY19xdWFudGl6ZXJfc2NhbGUgPiA4KTsKICAgIH0KCiAgICAvKgogICAgICogV2UgZGVjb2RlIHRvIGN0eC0+ZGVjb2RlZF9zdXJmYWNlIFRoaXMgaXMgaW5sb29wIHRhcmdldAogICAgICogdGhlIG91dCBvZiBsb29wIGRlY29kZWQgcGljdHVyZSBpcyBzdG9yZWQgaW4gY3R4LT5vYmpfY29udGV4dC0+Y3VycmVudF9yZW5kZXJfdGFyZ2V0CiAgICAgKi8KICAgIGlmIChwaWNfcGFyYW1zLT5pbmxvb3BfZGVjb2RlZF9waWN0dXJlID09IFZBX0lOVkFMSURfU1VSRkFDRSkgewogICAgICAgIC8qIE5vIG91dCBvZiBsb29wIGRlYmxvY2tpbmcgKi8KICAgICAgICBjdHgtPmRlY29kZWRfc3VyZmFjZSA9IGN0eC0+b2JqX2NvbnRleHQtPmN1cnJlbnRfcmVuZGVyX3RhcmdldDsKICAgIH0gZWxzZSB7CiAgICAgICAgY3R4LT5kZWNvZGVkX3N1cmZhY2UgPSBTVVJGQUNFKHBpY19wYXJhbXMtPmlubG9vcF9kZWNvZGVkX3BpY3R1cmUpOwogICAgICAgIENIRUNLX1NVUkZBQ0UoY3R4LT5kZWNvZGVkX3N1cmZhY2UpOwogICAgfQoKICAgIC8vU0VUX1NVUkZBQ0VfSU5GT19waWN0dXJlX2NvZGluZ190eXBlKGN0eC0+ZGVjb2RlZF9zdXJmYWNlLT5wc2Jfc3VyZmFjZSwgcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSk7CiAgICBTRVRfU1VSRkFDRV9JTkZPX3BpY3R1cmVfY29kaW5nX3R5cGUoY3R4LT5vYmpfY29udGV4dC0+Y3VycmVudF9yZW5kZXJfdGFyZ2V0LT5wc2Jfc3VyZmFjZSwgcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSk7CiAgICBjdHgtPmZvcndhcmRfcmVmX2ZjbSA9ICBwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlOwogICAgY3R4LT5iYWNrd2FyZF9yZWZfZmNtID0gIHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGU7CgogICAgLyogTG9va3VwIHN1cmZhY2VzIGZvciBiYWNrd2FyZC9mb3J3YXJkIHJlZmVyZW5jZXMgKi8KICAgIGN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZSA9IE5VTEw7CiAgICBjdHgtPmJhY2t3YXJkX3JlZl9zdXJmYWNlID0gTlVMTDsKICAgIGlmIChwaWNfcGFyYW1zLT5mb3J3YXJkX3JlZmVyZW5jZV9waWN0dXJlICE9IFZBX0lOVkFMSURfU1VSRkFDRSkgewogICAgICAgIGN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZSA9IFNVUkZBQ0UocGljX3BhcmFtcy0+Zm9yd2FyZF9yZWZlcmVuY2VfcGljdHVyZSk7CiAgICB9CiAgICBpZiAocGljX3BhcmFtcy0+YmFja3dhcmRfcmVmZXJlbmNlX3BpY3R1cmUgIT0gVkFfSU5WQUxJRF9TVVJGQUNFKSB7CiAgICAgICAgY3R4LT5iYWNrd2FyZF9yZWZfc3VyZmFjZSA9IFNVUkZBQ0UocGljX3BhcmFtcy0+YmFja3dhcmRfcmVmZXJlbmNlX3BpY3R1cmUpOwogICAgfQoKICAgIGlmIChjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UpCiAgICAgICAgY3R4LT5mb3J3YXJkX3JlZl9mY20gPSBHRVRfU1VSRkFDRV9JTkZPX3BpY3R1cmVfY29kaW5nX3R5cGUoY3R4LT5mb3J3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZSk7CgogICAgaWYgKGN0eC0+YmFja3dhcmRfcmVmX3N1cmZhY2UpCiAgICAgICAgY3R4LT5iYWNrd2FyZF9yZWZfZmNtID0gR0VUX1NVUkZBQ0VfSU5GT19waWN0dXJlX2NvZGluZ190eXBlKGN0eC0+YmFja3dhcmRfcmVmX3N1cmZhY2UtPnBzYl9zdXJmYWNlKTsKCiNpZiAwCiAgICBpZiAoTlVMTCA9PSBjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UpIHsKICAgICAgICAvKiBmb3IgbW11IGZhdWx0IHByb3RlY3Rpb24gKi8KICAgICAgICBjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UgPSBjdHgtPmRlY29kZWRfc3VyZmFjZTsKICAgIH0KICAgIGlmIChOVUxMID09IGN0eC0+YmFja3dhcmRfcmVmX3N1cmZhY2UpIHsKICAgICAgICAvKiBmb3IgbW11IGZhdWx0IHByb3RlY3Rpb24gKi8KICAgICAgICBjdHgtPmJhY2t3YXJkX3JlZl9zdXJmYWNlID0gY3R4LT5kZWNvZGVkX3N1cmZhY2U7CiAgICB9CiNlbmRpZgoKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIlRhcmdldCByZWYgPSAlMDh4IElEID0gJTA4eFxuIiwgIGN0eC0+b2JqX2NvbnRleHQtPmN1cnJlbnRfcmVuZGVyX3RhcmdldC0+cHNiX3N1cmZhY2UsICBjdHgtPm9ial9jb250ZXh0LT5jdXJyZW50X3JlbmRlcl90YXJnZXQtPnN1cmZhY2VfaWQpOwogICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiRGVjb2RlZCByZWYgPSAlMDh4IElEID0gJTA4eFxuIiwgY3R4LT5kZWNvZGVkX3N1cmZhY2UtPnBzYl9zdXJmYWNlLCBwaWNfcGFyYW1zLT5pbmxvb3BfZGVjb2RlZF9waWN0dXJlKTsKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIkZvcndhcmQgcmVmID0gJTA4eCBJRCA9ICUwOHhcbiIsIGN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZSA/IGN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UgOiAwLCBwaWNfcGFyYW1zLT5mb3J3YXJkX3JlZmVyZW5jZV9waWN0dXJlKTsKICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIkJhY2t3cmQgcmVmID0gJTA4eCBJRCA9ICUwOHhcbiIsIGN0eC0+YmFja3dhcmRfcmVmX3N1cmZhY2UgPyBjdHgtPmJhY2t3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZSA6IDAsIHBpY19wYXJhbXMtPmJhY2t3YXJkX3JlZmVyZW5jZV9waWN0dXJlKTsKCiAgICAvLyBOT1RFOiBjb2RlZF93aWR0aCBhbmQgY29kZWRfaGVpZ2h0IGRvIG5vdCBoYXZlIHRvIGJlIGFuIGV4YWN0IG11bHRpcGxlIG9mIE1CcwoKICAgIGN0eC0+ZGlzcGxheV9waWN0dXJlX3dpZHRoID0gcGljX3BhcmFtcy0+Y29kZWRfd2lkdGg7CiAgICBjdHgtPmRpc3BsYXlfcGljdHVyZV9oZWlnaHQgPSBwaWNfcGFyYW1zLT5jb2RlZF9oZWlnaHQ7CiAgICBjdHgtPnBpY3R1cmVfd2lkdGhfbWIgPSBQSVhFTFNfVE9fTUIoY3R4LT5kaXNwbGF5X3BpY3R1cmVfd2lkdGgpOwogICAgY3R4LT5waWN0dXJlX2hlaWdodF9tYiA9IFBJWEVMU19UT19NQihjdHgtPmRpc3BsYXlfcGljdHVyZV9oZWlnaHQpOwogICAgY3R4LT5jb2RlZF9waWN0dXJlX3dpZHRoID0gY3R4LT5waWN0dXJlX3dpZHRoX21iICogMTY7CiAgICBjdHgtPmNvZGVkX3BpY3R1cmVfaGVpZ2h0ID0gY3R4LT5waWN0dXJlX2hlaWdodF9tYiAqIDE2OwogICAgaWYgKChXTUZfUFJPRklMRV9BRFZBTkNFRCA9PSBjdHgtPnByb2ZpbGUpICYmIChWQzFfRkNNX0ZMREkgPT0gcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSkpIHsKICAgICAgICBjdHgtPnBpY3R1cmVfaGVpZ2h0X21iIC89IDI7CiAgICAgICAgY3R4LT5jb2RlZF9waWN0dXJlX2hlaWdodCA9IGN0eC0+cGljdHVyZV9oZWlnaHRfbWIgKiAxNiAqIDI7CiAgICB9CgogICAgaWYgKG9ial9zdXJmYWNlLT5zaGFyZV9pbmZvKSB7CiAgICAgICAgb2JqX3N1cmZhY2UtPnNoYXJlX2luZm8tPmNvZGVkX3dpZHRoID0gY3R4LT5jb2RlZF9waWN0dXJlX3dpZHRoOwogICAgICAgIG9ial9zdXJmYWNlLT5zaGFyZV9pbmZvLT5jb2RlZF9oZWlnaHQgPSBjdHgtPmNvZGVkX3BpY3R1cmVfaGVpZ2h0OwogICAgfQoKICAgIGN0eC0+c2l6ZV9tYiA9IGN0eC0+cGljdHVyZV93aWR0aF9tYiAqIGN0eC0+cGljdHVyZV9oZWlnaHRfbWI7CgogICAgdWludDMyX3QgY29sb2NhdGVkX3NpemUgPSAoKGN0eC0+c2l6ZV9tYiArIDEpICogMiArIDEyOCkgKiBWQzFfTUJfUEFSQU1fU1RSSURFOwogICAgLy91aW50MzJfdCBjb2xvY2F0ZWRfc2l6ZSA9IChjdHgtPnNpemVfbWIgKyAxKSAqIDIgKiBWQzFfTUJfUEFSQU1fU1RSSURFICsgMHgyMDAwOwoKICAgIHZhU3RhdHVzID0gdmxkX2RlY19hbGxvY2F0ZV9jb2xvY2F0ZWRfYnVmZmVyKCZjdHgtPmRlY19jdHgsIGN0eC0+ZGVjb2RlZF9zdXJmYWNlLCBjb2xvY2F0ZWRfc2l6ZSk7CiAgICB2YVN0YXR1cyA9IHZsZF9kZWNfYWxsb2NhdGVfY29sb2NhdGVkX2J1ZmZlcigmY3R4LT5kZWNfY3R4LCBjdHgtPm9ial9jb250ZXh0LT5jdXJyZW50X3JlbmRlcl90YXJnZXQsIGNvbG9jYXRlZF9zaXplKTsKCiAgICBDSEVDS19WQVNUQVRVUygpOwoKICAgIC8qIFRPRE86IFN0b3JlIHRvcF9maWVsZF9maXJzdCBhbmQgZnJhbWVfY29kaW5nX21vZGUgKG9yIGV2ZW4gYWxsIG9mIHBpY19wYXJhbXMpIGZvciB0aGUgY3VycmVudCBmcmFtZQogICAgICogc28gdGhhdCBpdCBjYW4gYmUgcmVmZXJlbmNlZCB3aGVuIHRoZSBzYW1lIGZyYW1lIGlzIHVzZWQgYXMgcmVmZXJlbmNlIGZyYW1lCiAgICAqLwoKICAgIGlmIChjdHgtPnByb2ZpbGUgIT0gV01GX1BST0ZJTEVfQURWQU5DRUQpIHsKICAgICAgICAvKiBTaW1wbGUgYW5kIE1haW4gcHJvZmlsZXMgYWx3YXlzIHVzZSBwcm9ncmVzc2l2ZSBwaWN0dXJlcyovCiAgICAgICAgcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSA9IFZDMV9GQ01fUDsKICAgIH0KCiAgICBpZiAoKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGUgPT0gVkMxX0ZDTV9QKSB8fCAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSA9PSBWQzFfRkNNX0ZSTUkpKSB7CiAgICAgICAgcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy50b3BfZmllbGRfZmlyc3QgPSAxOwogICAgfQoKICAgIGN0eC0+Yml0cGxhbmVfcHJlc2VudCA9IDA7CiAgICBzd2l0Y2ggKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlKSB7CiAgICBjYXNlIFdNRl9QVFlQRV9JOgogICAgY2FzZSBXTUZfUFRZUEVfQkk6CiAgICAgICAgY3R4LT5iaXRwbGFuZV9wcmVzZW50IHw9IChwaWNfcGFyYW1zLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX292ZXJmbGFncyAmJiAhcGljX3BhcmFtcy0+cmF3X2NvZGluZy5mbGFncy5vdmVyZmxhZ3MpID8gMHgwNCA6IDA7CiAgICAgICAgY3R4LT5iaXRwbGFuZV9wcmVzZW50IHw9IChwaWNfcGFyYW1zLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX2FjX3ByZWQgJiYgIXBpY19wYXJhbXMtPnJhd19jb2RpbmcuZmxhZ3MuYWNfcHJlZCkgPyAweDAyIDogMDsKICAgICAgICBjdHgtPmJpdHBsYW5lX3ByZXNlbnQgfD0gKHBpY19wYXJhbXMtPmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MuYnBfZmllbGRfdHggJiYgIXBpY19wYXJhbXMtPnJhd19jb2RpbmcuZmxhZ3MuZmllbGRfdHgpID8gMHgwMSA6IDA7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBXTUZfUFRZUEVfUDoKICAgICAgICBjdHgtPmJpdHBsYW5lX3ByZXNlbnQgfD0gKHBpY19wYXJhbXMtPmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MuYnBfbXZfdHlwZV9tYiAmJiAhcGljX3BhcmFtcy0+cmF3X2NvZGluZy5mbGFncy5tdl90eXBlX21iKSA/IDB4MDQgOiAwOwogICAgICAgIGN0eC0+Yml0cGxhbmVfcHJlc2VudCB8PSAocGljX3BhcmFtcy0+Yml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9za2lwX21iICYmICFwaWNfcGFyYW1zLT5yYXdfY29kaW5nLmZsYWdzLnNraXBfbWIpID8gMHgwMiA6IDA7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBXTUZfUFRZUEVfQjogLyogQiBwaWN0dXJlICovCiAgICAgICAgY3R4LT5iaXRwbGFuZV9wcmVzZW50IHw9IChwaWNfcGFyYW1zLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX2ZvcndhcmRfbWIgJiYgIXBpY19wYXJhbXMtPnJhd19jb2RpbmcuZmxhZ3MuZm9yd2FyZF9tYikgPyAweDA0IDogMDsKICAgICAgICBjdHgtPmJpdHBsYW5lX3ByZXNlbnQgfD0gKHBpY19wYXJhbXMtPmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MuYnBfc2tpcF9tYiAmJiAhcGljX3BhcmFtcy0+cmF3X2NvZGluZy5mbGFncy5za2lwX21iKSA/IDB4MDIgOiAwOwogICAgICAgIGN0eC0+Yml0cGxhbmVfcHJlc2VudCB8PSAocGljX3BhcmFtcy0+Yml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9kaXJlY3RfbWIgJiYgIXBpY19wYXJhbXMtPnJhd19jb2RpbmcuZmxhZ3MuZGlyZWN0X21iKSA/IDB4MDEgOiAwOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJiaXRwbGFuZV9wcmVzZW50X2ZsYWcgPSAlMDJ4IHJhd19jb2RpbmdfZmxhZyA9ICUwMnggYml0cGxhbmVfcHJlc2VudCA9ICUwMnhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljX3BhcmFtcy0+Yml0cGxhbmVfcHJlc2VudC52YWx1ZSwgcGljX3BhcmFtcy0+cmF3X2NvZGluZy52YWx1ZSwgY3R4LT5iaXRwbGFuZV9wcmVzZW50KTsKCiAgICBpZiAocGljX3BhcmFtcy0+cmVmZXJlbmNlX2ZpZWxkcy5iaXRzLnJlZmVyZW5jZV9kaXN0YW5jZV9mbGFnID09IDApIHsKICAgICAgICBwaWNfcGFyYW1zLT5yZWZlcmVuY2VfZmllbGRzLmJpdHMucmVmZXJlbmNlX2Rpc3RhbmNlID0gMDsKICAgIH0KCiAgICAvKiBjb25kaXRpb25hbF9vdmVybGFwX2ZsYWcgaXMgbm90IGFsd2F5cyBkZWZpbmVkLCBidXQgTVNWRFggZXhwZWN0cyBpdCB0byBiZSBzZXQgaW4gdGhvc2UgY2FzZXMgYW55d2F5ICovCiAgICBpZiAoY3R4LT5wcm9maWxlID09IFdNRl9QUk9GSUxFX0FEVkFOQ0VEKSB7CiAgICAgICAgaWYgKHBpY19wYXJhbXMtPnNlcXVlbmNlX2ZpZWxkcy5iaXRzLm92ZXJsYXAgPT0gRkFMU0UpIHsKICAgICAgICAgICAgY3R4LT5jb25kb3ZlciA9IDA7IC8qIE5vIG92ZXJsYXAgc21vb3RoaW5nICovCiAgICAgICAgfSBlbHNlIGlmIChwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLnBpY19xdWFudGl6ZXJfc2NhbGUgPCA5KSB7CiAgICAgICAgICAgIGN0eC0+Y29uZG92ZXIgPSBwaWNfcGFyYW1zLT5jb25kaXRpb25hbF9vdmVybGFwX2ZsYWc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY3R4LT5jb25kb3ZlciA9IDI7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlID09IFdNRl9QVFlQRV9CKSB8fCAocGljX3BhcmFtcy0+c2VxdWVuY2VfZmllbGRzLmJpdHMub3ZlcmxhcCA9PSBGQUxTRSkgfHwgKHBpY19wYXJhbXMtPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMucGljX3F1YW50aXplcl9zY2FsZSA8IDkpKSB7CiAgICAgICAgICAgIGN0eC0+Y29uZG92ZXIgPSAwOyAvKiBObyBvdmVybGFwIHNtb290aGluZyAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN0eC0+Y29uZG92ZXIgPSAyOwogICAgICAgIH0KICAgIH0KCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiogQ2FsY3VsYXRlIHRoZSBJWlogc2NhbiBpbmRleCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgY3R4LT5zY2FuX2luZGV4ID0gcHNiX192YzFfZ2V0X2l6el9zY2FuX2luZGV4KGN0eCk7CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIENhbGN1bGF0ZSBNVk1PREUgYW5kIE1WTU9ERTIgKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICBjdHgtPm12X21vZGUgPSBwaWNfcGFyYW1zLT5tdl9maWVsZHMuYml0cy5tdl9tb2RlOwogICAgaWYgKGN0eC0+bXZfbW9kZSA9PSBXTUZfTVZNT0RFX0lOVEVOU0lUWV9DT01QRU5TQVRJT04pIHsKICAgICAgICBjdHgtPm12X21vZGUgPSBwaWNfcGFyYW1zLT5tdl9maWVsZHMuYml0cy5tdl9tb2RlMjsKICAgIH0KCiAgICAvKiBOZWl0aGVyIE1WTU9ERSBub3IgTVZNT0RFMiBhcmUgc2lnbmFsZWQgYXQgdGhlIHBpY3R1cmUgbGV2ZWwgZm9yIGludGVybGFjZWQgZnJhbWUgcGljdHVyZXMsCiAgICAgICBidXQgTVZNT0RFIGNhbiBiZSBkZXRlcm1pbmUgZm9yIFAgcGljdHVyZXMgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBNVjRTV0lUQ0gsIGFuZCBmb3IgQgogICAgICAgcGljdHVyZXMgaXQgaXMgYnkgZGVmYXVsdCAxTVYgbW9kZS4gKi8KICAgIGlmICgocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSA9PSBWQzFfRkNNX0ZSTUkpICYmIFBJQ19UWVBFX0lTX0lOVEVSKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlKSkgewogICAgICAgIGlmICgocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUgPT0gV01GX1BUWVBFX1ApICYmIChwaWNfcGFyYW1zLT5tdl9maWVsZHMuYml0cy5mb3VyX212X3N3aXRjaCA9PSAxKSkgewogICAgICAgICAgICBjdHgtPm12X21vZGUgPSBXTUZfTVZNT0RFX01JWEVEX01WOwogICAgICAgICAgICBwaWNfcGFyYW1zLT5tdl9maWVsZHMuYml0cy5tdl9tb2RlID0gV01GX01WTU9ERV9NSVhFRF9NVjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdHgtPm12X21vZGUgPSBXTUZfTVZNT0RFXzFNVjsKICAgICAgICAgICAgcGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMubXZfbW9kZSA9IFdNRl9NVk1PREVfMU1WOwogICAgICAgIH0KICAgIH0KICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDYWxjdWxhdGUgSEFMRlBFTCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICBpZiAoKGN0eC0+bXZfbW9kZSA9PSBXTUZfTVZNT0RFXzFNVikgfHwgKGN0eC0+bXZfbW9kZSA9PSBXTUZfTVZNT0RFX01JWEVEX01WKSkgewogICAgICAgIGN0eC0+aGFsZl9wZWwgPSAwOwogICAgfSBlbHNlIHsKICAgICAgICBjdHgtPmhhbGZfcGVsID0gMTsKICAgIH0KICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgLyogVE9ETzogQXJlIHdlIHVzaW5nIHRoZSBjb3JyZWN0IHNpemUgZm9yIHRoaXMgPyAqLwogICAgY3R4LT5wdWxsX2JhY2tfeCA9IENPTVBVVEVfUFVMTEJBQ0socGljX3BhcmFtcy0+Y29kZWRfd2lkdGgpOwogICAgY3R4LT5wdWxsX2JhY2tfeSA9IENPTVBVVEVfUFVMTEJBQ0socGljX3BhcmFtcy0+Y29kZWRfaGVpZ2h0KTsKCiAgICBpZiAocGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMuZXh0ZW5kZWRfZG12X2ZsYWcgPT0gMSkgewogICAgICAgIGN0eC0+ZXh0ZW5kX3ggPSBnRE1WUkFOR0VfRXh0SG9yaXpvbnRhbF9SZW1hcFRhYmxlW3BpY19wYXJhbXMtPm12X2ZpZWxkcy5iaXRzLmV4dGVuZGVkX2Rtdl9yYW5nZV07CiAgICAgICAgY3R4LT5leHRlbmRfeSA9IGdETVZSQU5HRV9FeHRWZXJ0aWNhbF9SZW1hcFRhYmxlW3BpY19wYXJhbXMtPm12X2ZpZWxkcy5iaXRzLmV4dGVuZGVkX2Rtdl9yYW5nZV07CiAgICB9IGVsc2UgewogICAgICAgIGN0eC0+ZXh0ZW5kX3ggPSBJTUdfRkFMU0U7CiAgICAgICAgY3R4LT5leHRlbmRfeSA9IElNR19GQUxTRTsKICAgIH0KCiAgICAvKiBCIGludGVybGFjZWQgZmllbGQgcGljdHVyZSBhbmQgLi4uPz8gKi8KICAgIGN0eC0+dWkzMlNjYWxlRmFjdG9yID0gMDsKICAgIGN0eC0+aThGd3JkUmVmRnJtRGlzdCA9IDA7CiAgICBjdHgtPmk4QmNrd3JkUmVmRnJtRGlzdCA9IDA7CiAgICBpZiAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUgPT0gV01GX1BUWVBFX0IpIHsKICAgICAgICBJTUdfVUlOVDMyIHVpMzJCRnJhY3Rpb25EZW47CiAgICAgICAgSU1HX1VJTlQzMiB1aTMyQkZyYWN0aW9uTnVtOwoKICAgICAgICBJTUdfVUlOVDMyIHVpMzJGcmFtZVJlY2lwcm9jYWw7CgogICAgICAgIGlmIChwaWNfcGFyYW1zLT5iX3BpY3R1cmVfZnJhY3Rpb24gPiAoc2l6ZW9mKGdCRlJBQ1RJT05fRGVuUmVtYXBUYWJsZSkgLyBzaXplb2YoSU1HX0JZVEUpIC0gMSkpCiAgICAgICAgICAgIHBpY19wYXJhbXMtPmJfcGljdHVyZV9mcmFjdGlvbiA9IHNpemVvZihnQkZSQUNUSU9OX0RlblJlbWFwVGFibGUpIC8gc2l6ZW9mKElNR19CWVRFKSAtIDE7CgogICAgICAgIHVpMzJCRnJhY3Rpb25EZW4gPSBnQkZSQUNUSU9OX0RlblJlbWFwVGFibGVbcGljX3BhcmFtcy0+Yl9waWN0dXJlX2ZyYWN0aW9uXTsKICAgICAgICB1aTMyQkZyYWN0aW9uTnVtID0gZ0JGUkFDVElPTl9OdW1SZW1hcFRhYmxlW3BpY19wYXJhbXMtPmJfcGljdHVyZV9mcmFjdGlvbl07CgogICAgICAgIGlmICh1aTMyQkZyYWN0aW9uRGVuID4gKHNpemVvZihnYXVpMTZJbnZlcnNlKSAvIHNpemVvZihJTUdfVUlOVDE2KSkpCiAgICAgICAgICAgIHVpMzJCRnJhY3Rpb25EZW4gPSBzaXplb2YoZ2F1aTE2SW52ZXJzZSkgLyBzaXplb2YoSU1HX1VJTlQxNik7CgogICAgICAgIGlmICh1aTMyQkZyYWN0aW9uRGVuID09IDApIHsKICAgICAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19FUlJPUiwgIkludmFsaWQgdWkzMkJGcmFjdGlvbkRlbiB2YWx1ZSAlZFxuIiwgdWkzMkJGcmFjdGlvbkRlbik7CiAgICAgICAgICAgIHVpMzJCRnJhY3Rpb25EZW4gPSAxOwogICAgICAgIH0KCiAgICAgICAgdWkzMkZyYW1lUmVjaXByb2NhbCA9IGdhdWkxNkludmVyc2VbdWkzMkJGcmFjdGlvbkRlbiAtIDFdOwogICAgICAgIGN0eC0+dWkzMlNjYWxlRmFjdG9yICAgID0gdWkzMkJGcmFjdGlvbk51bSAqIHVpMzJGcmFtZVJlY2lwcm9jYWw7CgogICAgICAgIGlmIChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlID09IFZDMV9GQ01fRkxESSkgewogICAgICAgICAgICBjdHgtPmk4RndyZFJlZkZybURpc3QgICA9IChJTUdfSU5UOCkoKGN0eC0+dWkzMlNjYWxlRmFjdG9yICogcGljX3BhcmFtcy0+cmVmZXJlbmNlX2ZpZWxkcy5iaXRzLnJlZmVyZW5jZV9kaXN0YW5jZSkgPj4gOCk7ICAgICAvKiAxMC40LjYuMiAqLwogICAgICAgICAgICBjdHgtPmk4QmNrd3JkUmVmRnJtRGlzdCA9IHBpY19wYXJhbXMtPnJlZmVyZW5jZV9maWVsZHMuYml0cy5yZWZlcmVuY2VfZGlzdGFuY2UgLSBjdHgtPmk4RndyZFJlZkZybURpc3QgLSAxOwoKICAgICAgICAgICAgaWYgKGN0eC0+aThCY2t3cmRSZWZGcm1EaXN0IDwgMCkgewogICAgICAgICAgICAgICAgY3R4LT5pOEJja3dyZFJlZkZybURpc3QgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIENvbXB1dGUgdGhlIG1vZGUgY29uZmlnIHBhcmFtZXRlciAqLwogICAgLyoKICAgICAgIE1PREVfQ09ORklHWzE6MF0gPQogICAgICAgIFZDLTEgaW50ZW5zaXR5IGNvbXBlbnNhdGlvbiBmbGFnLCBkZXJpdmVkIGZyb20gTVZNT0RFID0gSW50ZW5zaXR5IGNvbXBlbnNhdGlvbiwgYW5kIElOVENPTVBGSUVMRAogICAgICAgIDAwIJYgTm8gaW50ZW5zaXR5IGNvbXBlbnNhdGlvbgogICAgICAgIDAxIJYgSW50ZW5zaXR5IGNvbXBlbnNhdGlvbiBmb3IgdG9wIGZpZWxkCiAgICAgICAgMTAgliBJbnRlbnNpdHkgY29tcGVuc2F0aW9uIGZvciBib3R0b20gZmllbGQKICAgICAgICAxMSCWIEludGVuc2l0eSBjb21wZW5zYXRpb24gZm9yIHRoZSBmcmFtZQoKICAgICAgIE1PREVfQ09ORklHWzM6Ml0gPQogICAgICAgIFZDLTEgcmVmZXJlbmNlIHJhbmdlIHNjYWxpbmcsIGRlcml2ZWQgZnJvbSBSQU5HRVJFRCwgUkFOR0VSRURGUk0gZm9yIGN1cnJlbnQgZnJhbWUgYW5kIHJlZmVyZW5jZSBmcmFtZS4KICAgICAgICAwMCCWIE5vIHNjYWxpbmcKICAgICAgICAwMSCWIFNjYWxlIGRvd24KICAgICAgICAxMCCWIFNjYWxlIHVwCiAgICAgICAgMTEgliBObyBzY2FsaW5nCiAgICAgKi8KCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOVEVOU0lUWSBDT01QRU5TQVRJT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgLyogRm9yIGVhY2ggTkVXIHJlZmVyZW5jZSBmcmFtZSwgcm90YXRlIElDIGhpc3RvcnkgKi8KICAgIGlmIChQSUNfVFlQRV9JU19SRUYocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUpICYmCiAgICAgICAgcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5pc19maXJzdF9maWVsZCAmJgogICAgICAgIChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlID09IFZDMV9GQ01fRkxESSkpIHsKICAgICAgICAvKgogICAgICAgICAgIFRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIHBpY3R1cmUgb2YgYSBuZXcgZnJhbWUsIHNvIG1vdmUgdGhlIElDIHBhcmFtcyBmb3IgYm90aCBmaWVsZAogICAgICAgICAgIHBpY3R1cmVzIG9mIHRoZSBsYXN0IGZyYW1lIChmcm9tIHBvc2l0aW9uIFsxXVswXSBmb3IgdGhlIGZpcnN0IGZpZWxkIGFuZCBwb3NpdGlvbiBbMV1bMV0gZm9yCiAgICAgICAgICAgdGhlIHNlY29uZCBmaWVsZCB0byBwb3NpdGlvbnMgWzBdWzBdIGFuZCBbMF1bMV0gcmVzcGVjdGV2ZWx5KS4KICAgICAgICAqLwogICAgICAgIG1lbWNweSgmY3R4LT5zSUNwYXJhbXNbMF1bMF0sICZjdHgtPnNJQ3BhcmFtc1sxXVswXSwgc2l6ZW9mKElDX1BBUkFNKSk7CiAgICAgICAgbWVtY3B5KCZjdHgtPnNJQ3BhcmFtc1swXVsxXSwgJmN0eC0+c0lDcGFyYW1zWzFdWzFdLCBzaXplb2YoSUNfUEFSQU0pKTsKCiAgICAgICAgbWVtc2V0KCZjdHgtPnNJQ3BhcmFtc1sxXVswXSwgMCwgc2l6ZW9mKElDX1BBUkFNKSk7CiAgICAgICAgbWVtc2V0KCZjdHgtPnNJQ3BhcmFtc1sxXVsxXSwgMCwgc2l6ZW9mKElDX1BBUkFNKSk7CiAgICB9CgogICAgaWYgKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlID09IFdNRl9QVFlQRV9QKSB7CiAgICAgICAgY3R4LT51aThDdXJyTHVtYVNjYWxlMSA9IDA7CiAgICAgICAgY3R4LT51aThDdXJyTHVtYVNoaWZ0MSA9IDA7CiAgICAgICAgY3R4LT51aThDdXJyTHVtYVNjYWxlMiA9IDA7CiAgICAgICAgY3R4LT51aThDdXJyTHVtYVNoaWZ0MiA9IDA7CgogICAgICAgIGlmIChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlICE9IFZDMV9GQ01fRlJNSSkgewogICAgICAgICAgICBpZiAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5pbnRlbnNpdHlfY29tcGVuc2F0aW9uKSB7CiAgICAgICAgICAgICAgICAvKiBJbnRlbnNpdHkgY29tcGVuc2F0aW9uIG9mIHJlZmVyZW5jZSAqLwogICAgICAgICAgICAgICAgaWYgKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGUgIT0gVkMxX0ZDTV9GTERJKSB7IC8vIHByb2dyZXNzaXZlIHBpY3R1cmUKICAgICAgICAgICAgICAgICAgICBjdHgtPm1vZGVfY29uZmlnID0gMHgzOwoKICAgICAgICAgICAgICAgICAgICB1aThMdW1hU2NhbGUxID0gcGljX3BhcmFtcy0+bHVtYV9zY2FsZSAmIDB4M0Y7CiAgICAgICAgICAgICAgICAgICAgdWk4THVtYVNoaWZ0MSA9IHBpY19wYXJhbXMtPmx1bWFfc2hpZnQgJiAweDNGOwoKICAgICAgICAgICAgICAgICAgICBpZiAodWk4THVtYVNjYWxlMSAhPSAwIHx8IHVpOEx1bWFTaGlmdDEgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnVpOEN1cnJMdW1hU2NhbGUxID0gdWk4THVtYVNjYWxlMTsKICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT51aThDdXJyTHVtYVNoaWZ0MSA9IHVpOEx1bWFTaGlmdDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZmllbGQgaW50ZXJsYWNlZCBwaWN0dXJlCiAgICAgICAgICAgICAgICAgICAgLy8gdG9wIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdWk4THVtYVNjYWxlMSA9IHBpY19wYXJhbXMtPmx1bWFfc2NhbGUgJiAweDNGOwogICAgICAgICAgICAgICAgICAgIHVpOEx1bWFTaGlmdDEgPSBwaWNfcGFyYW1zLT5sdW1hX3NoaWZ0ICYgMHgzRjsKCiAgICAgICAgICAgICAgICAgICAgLy8gYm90dG9tIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgdWk4THVtYVNjYWxlMiA9IHVpOEx1bWFTY2FsZTE7IC8qIFRPRE86IEhvdyB0byBrZWVwIHRyYWNrIG9mIHRvcC9ib3R0b20gZmllbGQgaW50ZW5zaXR5IGNvbXA/ICovCiAgICAgICAgICAgICAgICAgICAgdWk4THVtYVNoaWZ0MiA9IHVpOEx1bWFTaGlmdDE7IC8qIFRPRE86IEhvdyB0byBrZWVwIHRyYWNrIG9mIHRvcC9ib3R0b20gZmllbGQgaW50ZW5zaXR5IGNvbXA/ICovCgogICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIHdoYXQgZmllbGRzIHVuZGVyZ28gaW50ZW5zaXR5IGNvbXBlbnNhdGlvbiAqLwogICAgICAgICAgICAgICAgICAgIGN0eC0+dWk4SW50Q29tcEZpZWxkID0gMDsKICAgICAgICAgICAgICAgICAgICBpZiAodWk4THVtYVNjYWxlMSAhPSAwIHx8IHVpOEx1bWFTaGlmdDEgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnVpOEludENvbXBGaWVsZCA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh1aThMdW1hU2NhbGUyICE9IDAgfHwgdWk4THVtYVNoaWZ0MiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dWk4SW50Q29tcEZpZWxkIHw9IDI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGN0eC0+dWk4SW50Q29tcEZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBub25lICovCiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bW9kZV9jb25maWcgPSAweDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IC8qIHRvcCAqLwogICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm1vZGVfY29uZmlnID0gMHgxOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSUMgcGFyYW1ldGVycyBmb3IgdG9wIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dWk4Q3Vyckx1bWFTY2FsZTEgPSB1aThMdW1hU2NhbGUxOwogICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnVpOEN1cnJMdW1hU2hpZnQxID0gdWk4THVtYVNoaWZ0MTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjogLyogYm90dG9tICovCiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bW9kZV9jb25maWcgPSAweDI7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBJQyBwYXJhbWV0ZXJzIGZvciBib3R0b20gZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT51aThDdXJyTHVtYVNjYWxlMiA9IHVpOEx1bWFTY2FsZTI7CiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dWk4Q3Vyckx1bWFTaGlmdDIgPSB1aThMdW1hU2hpZnQyOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAvKiBib3RoICovCiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bW9kZV9jb25maWcgPSAweDM7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBJQyBwYXJhbWV0ZXJzIGZvciB0b3AgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT51aThDdXJyTHVtYVNjYWxlMSA9IHVpOEx1bWFTY2FsZTE7CiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dWk4Q3Vyckx1bWFTaGlmdDEgPSB1aThMdW1hU2hpZnQxOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSUMgcGFyYW1ldGVycyBmb3IgYm90dG9tIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dWk4Q3Vyckx1bWFTY2FsZTIgPSB1aThMdW1hU2NhbGUyOwogICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnVpOEN1cnJMdW1hU2hpZnQyID0gdWk4THVtYVNoaWZ0MjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY3R4LT5tb2RlX2NvbmZpZyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgeyAvLyBpbnRlcmxhY2VkIGZyYW1lIFAgcGljdHVyZQogICAgICAgICAgICBpZiAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5pbnRlbnNpdHlfY29tcGVuc2F0aW9uKSB7IC8qIGlJTlNPICovCiAgICAgICAgICAgICAgICBjdHgtPm1vZGVfY29uZmlnID0gMHgzOyAgIC8vIGludGVuc2l0eSBjb21wZW5zYXRlIHdob2xlIGZyYW1lCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjdHgtPm1vZGVfY29uZmlnID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAoUElDX1RZUEVfSVNfSU5UUkEocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUpKSB7CiAgICAgICAgY3R4LT5tb2RlX2NvbmZpZyA9IDA7CiAgICB9CgogICAgLyoKICAgICAgICAxMC4zLjggSW50ZW5zaXR5IENvbXBlbnNhdGlvbjoKICAgICAgICBJZiBpbnRlbnNpdHkgY29tcGVuc2F0aW9uIGlzIHBlcmZvcm1lZCBvbiBhIHJlZmVyZW5jZSBmaWVsZCwgdGhlbiBhZnRlciBkZWNvZGluZyB0aGUgZmllbGQsCiAgICAgICAgdGhlIHBvc3QtY29tcGVuc2F0ZWQgcGl4ZWwgdmFsdWVzIHNoYWxsIGJlIHJldGFpbmVkIGFuZCBzaGFsbCBiZSB1c2VkIHdoZW4gZGVjb2RpbmcgdGhlIG5leHQKICAgICAgICBmaWVsZC4gSWYgdGhlIG5leHQgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIGZpZWxkIHRoYXQgd2FzIGludGVuc2l0eSBjb21wZW5zYXRlZCBieSB0aGUKICAgICAgICBwcmV2aW91cyBmaWVsZCBpcyB0byBoYXZlIGludGVuc2l0eSBjb21wZW5zYXRpb24gcGVyZm9ybWVkIGFnYWluIHRoZW4gdGhlIHBvc3QtY29tcGVuc2F0ZWQKICAgICAgICBmaWVsZCBzaGFsbCBiZSB1c2VkLiBUaGVyZWZvcmUsIHdoZW4gYSByZWZlcmVuY2UgZmllbGQgaGFzIGludGVuc2l0eSBjb21wZW5zYXRpb24gcGVyZm9ybWVkCiAgICAgICAgdHdpY2UsIHRoZSByZXN1bHQgb2YgdGhlIGZpcnN0IGludGVuc2l0eSBjb21wZW5zYXRpb24gb3BlcmF0aW9uIHNoYWxsIGJlIHVzZWQgYXMgaW5wdXQKICAgICAgICBmb3IgdGhlIHNlY29uZCBpbnRlbnNpdHkgY29tcGVuc2F0aW9uLgogICAgKi8KICAgIC8qCiAgICAgICAgRG9uJ3QgZm9yZ2V0IHBvaW50IDkuMS4xLjQgaW4gVkMxIFNwZWM6CgogICAgICAgIElmIHRoZSBjdXJyZW50IGZyYW1lLCBjb2RlZCBhcyB0d28gaW50ZXJsYWNlIGZpZWxkIHBpY3R1cmVzLCBjb250YWlucyBhdCBsZWFzdCBvbmUgUCBvciBCCiAgICAgICAgZmllbGQsIGFuZCBpZiB0aGlzIFAgb3IgQiBmaWVsZCB1c2VzIG9uZSBvciBib3RoIGZpZWxkIGluIGFub3RoZXIgZnJhbWUgYXMgYSByZWZlcmVuY2UsIHdoZXJlCiAgICAgICAgdGhlIHJlZmVyZW5jZSBmcmFtZSB3YXMgYWxzbyBjb2RlZCBhcyBhIGludGVybGFjZSBmaWVsZCBwaWN0dWUsIHRoZW4gdGhlIFRGRiBvZiB0aGUgY3VycmVudAogICAgICAgIGZyYW1lIGFuZCByZWZlcmVuY2UgZnJhbWUgc2hhbGwgYmUgdGhlIHNhbWUuCiAgICAqLwogICAgaWYgKChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnBpY3R1cmVfdHlwZSA9PSBXTUZfUFRZUEVfUCkgJiYgKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGUgPT0gVkMxX0ZDTV9GTERJKSkgewogICAgICAgIGlmIChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnRvcF9maWVsZF9maXJzdCkgeyAvLyB0b3AgZmllbGQgZmlyc3QKICAgICAgICAgICAgaWYgKCFwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmlzX2ZpcnN0X2ZpZWxkKSB7IC8vIHRoaXMgaXMgdGhlIHNlY29uZCBmaWVsZCBwaWN0dXJlIChhbmQgYm90dG9tKQogICAgICAgICAgICAgICAgaWYgKGN0eC0+dWk4SW50Q29tcEZpZWxkICYgMHgxKSB7CiAgICAgICAgICAgICAgICAgICAgLyogVGhlIHNlY29uZCBhbmQgYm90dG9tIGZpZWxkIHBpY3R1cmUgb2YgdGhlIGN1cnJlbnQgZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnNpdHkgY29tcGVuc2F0ZXMgdGhlIHRvcCBmaWVsZCBvZiB0aGUgY3VycmVudCBmcmFtZS4gKi8KICAgICAgICAgICAgICAgICAgICBjdHgtPnNJQ3BhcmFtc1sxXVswXS51aThMdW1hU2NhbGUxID0gdWk4THVtYVNjYWxlMTsKICAgICAgICAgICAgICAgICAgICBjdHgtPnNJQ3BhcmFtc1sxXVswXS51aThMdW1hU2hpZnQxID0gdWk4THVtYVNoaWZ0MTsKICAgICAgICAgICAgICAgICAgICBjdHgtPnNJQ3BhcmFtc1sxXVswXS51aThJQzEgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGN0eC0+dWk4SW50Q29tcEZpZWxkICYgMHgyKSB7CiAgICAgICAgICAgICAgICAgICAgLyogVGhlIHNlY29uZCBhbmQgYm90dG9tIGZpZWxkIHBpY3R1cmUgb2YgdGhlIGN1cnJlbnQgZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnNpdHkgY29tcGVuc2F0ZXMgdGhlIGJvdHRvbSBmaWVsZCBvZiB0aGUgcHJldmlvdXMgZnJhbWUuICovCiAgICAgICAgICAgICAgICAgICAgY3R4LT5zSUNwYXJhbXNbMF1bMV0udWk4THVtYVNjYWxlMiA9IHVpOEx1bWFTY2FsZTI7CiAgICAgICAgICAgICAgICAgICAgY3R4LT5zSUNwYXJhbXNbMF1bMV0udWk4THVtYVNoaWZ0MiA9IHVpOEx1bWFTaGlmdDI7CiAgICAgICAgICAgICAgICAgICAgY3R4LT5zSUNwYXJhbXNbMF1bMV0udWk4SUMyID0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsgLy8gZmlyc3QgZmllbGQgcGljdHVyZSAoYW5kIHRvcCkKICAgICAgICAgICAgICAgIGlmIChjdHgtPnVpOEludENvbXBGaWVsZCAmIDB4MSkgewogICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmaXJzdCBhbmQgdG9wIGZpZWxkIHBpY3R1cmUgb2YgdGhlIGN1cnJlbnQgZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnNpdHkgY29tcGVuc2F0ZXMgdGhlIHRvcCBmaWVsZCBvZiB0aGUgcHJldmlvdXMgZnJhbWUuICovCiAgICAgICAgICAgICAgICAgICAgY3R4LT5zSUNwYXJhbXNbMF1bMF0udWk4THVtYVNjYWxlMiA9IHVpOEx1bWFTY2FsZTE7CiAgICAgICAgICAgICAgICAgICAgY3R4LT5zSUNwYXJhbXNbMF1bMF0udWk4THVtYVNoaWZ0MiA9IHVpOEx1bWFTaGlmdDE7CiAgICAgICAgICAgICAgICAgICAgY3R4LT5zSUNwYXJhbXNbMF1bMF0udWk4SUMyID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjdHgtPnVpOEludENvbXBGaWVsZCAmIDB4MikgewogICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmaXJzdCBhbmQgdG9wIGZpZWxkIHBpY3R1cmUgb2YgdGhlIGN1cnJlbnQgZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnNpdHkgY29tcGVuc2F0ZXMgdGhlIGJvdHRvbSBmaWVsZCBvZiB0aGUgcHJldmlvdXMgZnJhbWUuICovCiAgICAgICAgICAgICAgICAgICAgY3R4LT5zSUNwYXJhbXNbMF1bMV0udWk4THVtYVNjYWxlMSA9IHVpOEx1bWFTY2FsZTI7CiAgICAgICAgICAgICAgICAgICAgY3R4LT5zSUNwYXJhbXNbMF1bMV0udWk4THVtYVNoaWZ0MSA9IHVpOEx1bWFTaGlmdDI7CiAgICAgICAgICAgICAgICAgICAgY3R4LT5zSUNwYXJhbXNbMF1bMV0udWk4SUMxID0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7IC8vIGJvdHRvbSBmaWVsZCBmaXJzdAogICAgICAgICAgICBpZiAoIXBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuaXNfZmlyc3RfZmllbGQpIHsgLy8gdGhpcyBpcyB0aGUgc2Vjb25kIGZpZWxkIHBpY3R1cmUgKGFuZCB0b3ApCiAgICAgICAgICAgICAgICBpZiAoY3R4LT51aThJbnRDb21wRmllbGQgJiAweDIpIHsKICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2Vjb25kIGFuZCB0b3AgZmllbGQgcGljdHVyZSBvZiB0aGUgY3VycmVudCBmcmFtZQogICAgICAgICAgICAgICAgICAgICAgIGludGVuc2l0eSBjb21wZW5zYXRlcyB0aGUgYm90dG9tIGZpZWxkIG9mIHRoZSBjdXJyZW50IGZyYW1lLiAqLwogICAgICAgICAgICAgICAgICAgIGN0eC0+c0lDcGFyYW1zWzFdWzFdLnVpOEx1bWFTY2FsZTEgPSB1aThMdW1hU2NhbGUyOwogICAgICAgICAgICAgICAgICAgIGN0eC0+c0lDcGFyYW1zWzFdWzFdLnVpOEx1bWFTaGlmdDEgPSB1aThMdW1hU2hpZnQyOwogICAgICAgICAgICAgICAgICAgIGN0eC0+c0lDcGFyYW1zWzFdWzFdLnVpOElDMSA9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY3R4LT51aThJbnRDb21wRmllbGQgJiAweDEpIHsKICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2Vjb25kIGFuZCB0b3AgZmllbGQgcGljdHVyZSBvZiB0aGUgY3VycmVudCBmcmFtZQogICAgICAgICAgICAgICAgICAgICAgIGludGVuc2l0eSBjb21wZW5zYXRlcyB0aGUgdG9wIGZpZWxkIG9mIHRoZSBwcmV2aW91cyBmcmFtZS4gKi8KICAgICAgICAgICAgICAgICAgICBjdHgtPnNJQ3BhcmFtc1swXVswXS51aThMdW1hU2NhbGUyID0gdWk4THVtYVNjYWxlMTsKICAgICAgICAgICAgICAgICAgICBjdHgtPnNJQ3BhcmFtc1swXVswXS51aThMdW1hU2hpZnQyID0gdWk4THVtYVNoaWZ0MTsKICAgICAgICAgICAgICAgICAgICBjdHgtPnNJQ3BhcmFtc1swXVswXS51aThJQzIgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgeyAvLyBmaXJzdCBmaWVsZCBwaWN0dXJlIChhbmQgYm90dG9tKQogICAgICAgICAgICAgICAgaWYgKGN0eC0+dWk4SW50Q29tcEZpZWxkICYgMHgxKSB7CiAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZpcnN0IGFuZCBib3R0b20gZmllbGQgcGljdHVyZSBvZiB0aGUgY3VycmVudCBmcmFtZQogICAgICAgICAgICAgICAgICAgICAgIGludGVuc2l0eSBjb21wZW5zYXRlcyB0aGUgdG9wIGZpZWxkIG9mIHRoZSBwcmV2aW91cyBmcmFtZS4gKi8KICAgICAgICAgICAgICAgICAgICBjdHgtPnNJQ3BhcmFtc1swXVswXS51aThMdW1hU2NhbGUxID0gdWk4THVtYVNjYWxlMTsKICAgICAgICAgICAgICAgICAgICBjdHgtPnNJQ3BhcmFtc1swXVswXS51aThMdW1hU2hpZnQxID0gdWk4THVtYVNoaWZ0MTsKICAgICAgICAgICAgICAgICAgICBjdHgtPnNJQ3BhcmFtc1swXVswXS51aThJQzEgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGN0eC0+dWk4SW50Q29tcEZpZWxkICYgMHgyKSB7CiAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZpcnN0IGFuZCBib3R0b20gZmllbGQgcGljdHVyZSBvZiB0aGUgY3VycmVudCBmcmFtZQogICAgICAgICAgICAgICAgICAgICAgIGludGVuc2l0eSBjb21wZW5zYXRlcyB0aGUgYm90dG9tIGZpZWxkIG9mIHRoZSBwcmV2aW91cyBmcmFtZS4gKi8KICAgICAgICAgICAgICAgICAgICBjdHgtPnNJQ3BhcmFtc1swXVsxXS51aThMdW1hU2NhbGUyID0gdWk4THVtYVNjYWxlMjsKICAgICAgICAgICAgICAgICAgICBjdHgtPnNJQ3BhcmFtc1swXVsxXS51aThMdW1hU2hpZnQyID0gdWk4THVtYVNoaWZ0MjsKICAgICAgICAgICAgICAgICAgICBjdHgtPnNJQ3BhcmFtc1swXVsxXS51aThJQzIgPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFJBTkdFIFJFRFVDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgLyogRGV0ZXJtaW5lIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJhbmdlIHJlZHVjdGlvbiBvZiBjdXJyZW50IGFuZCByZWZlcmVuY2UgcGljdHVyZSAqLwogICAgaWYgKGN0eC0+cHJvZmlsZSA9PSBXTUZfUFJPRklMRV9NQUlOKSB7CiAgICAgICAgLyogUmFuZ2UgUmVkdWN0aW9uIGlzIG9ubHkgZW5hYmxlZCBmb3IgTWFpbiBQcm9maWxlICovCiAgICAgICAgLyogVGhlIFJBTkdFUkVERlJNIHZhbHVlcyBmcm9tIHRoZSByZWZlcmVuY2UgcGljdHVyZXMgYXJlOwogICAgICAgICAgICBwc1ZMRENvbnRleHQtPmJSZWYwUmFuZ2VSZWQKICAgICAgICAgICAgcHNWTERDb250ZXh0LT5iUmVmMVJhbmdlUmVkICovCgogICAgICAgIHN3aXRjaCAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUpIHsKICAgICAgICBjYXNlIFdNRl9QVFlQRV9JOgogICAgICAgIGNhc2UgV01GX1BUWVBFX0JJOgogICAgICAgICAgICAvKiBubyByZWZlcmVuY2UgcGljdHVyZSBzY2FsaW5nICovCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdNRl9QVFlQRV9QOiAvKiBQIHBpY3R1cmUgKi8KICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIDguMy40LjExIGFsc28gbmVlZCB0byBzY2FsZSB0aGUgcHJldmlvdXNseSByZWNvbnN0cnVjdGVkIGFuY2hvciBmcmFtZSBwcmlvciB0byB1c2luZyBpdCBmb3IgTUMgaWY6CiAgICAgICAgICAgICAgICAtIFJBTkdFUkVERlJNID09IDEgYW5kIHJlZiBSQU5HRVJFREZSTSBmbGFnIGlzIG5vdCBzaWduYWxsZWQgc2NhbGUgZG93biBwcmV2aW91cyByZWNvbnN0cnVjdGVkIGZyYW1lLgogICAgICAgICAgICAgICAgLSBSQU5HRVJFREZSTSA9PSAwIGFuZCByZWYgUkFOR0VSRURGUk0gZmxhZyBpcyBzZXQgc2NhbGUgdXAgcHJldmlvdXMgcmVjb25zdHJ1Y3RlZCBmcmFtZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChjdHgtPnBpY19wYXJhbXMtPnJhbmdlX3JlZHVjdGlvbl9mcmFtZSAmJiAhY3R4LT5iUmVmMFJhbmdlUmVkKSB7CiAgICAgICAgICAgICAgICBjdHgtPm1vZGVfY29uZmlnIHw9ICgweDEgPDwgMik7IC8vIHNjYWxlIGRvd24gcHJldmlvdXMgcmVjb25zdHJ1Y3RlZCBmcmFtZQogICAgICAgICAgICB9IGVsc2UgaWYgKCFjdHgtPnBpY19wYXJhbXMtPnJhbmdlX3JlZHVjdGlvbl9mcmFtZSAmJiBjdHgtPmJSZWYwUmFuZ2VSZWQpIHsKICAgICAgICAgICAgICAgIGN0eC0+bW9kZV9jb25maWcgfD0gKDB4MiA8PCAyKTsgLy8gc2NhbGUgdXAgcHJldmlvdXMgcmVjb25zdHJ1Y3RlZCBmcmFtZQogICAgICAgICAgICB9IGVsc2UgeyAvKiBuZWl0aGVyIG9yIGJvdGggYXJlIHNldCAqLwogICAgICAgICAgICAgICAgY3R4LT5tb2RlX2NvbmZpZyB8PSAoMHgwIDw8IDIpOyAvLyBubyBzY2FsaW5nIG9mIHJlZmVyZW5jZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdNRl9QVFlQRV9COiAvKiBCIHBpY3R1cmUgKi8KICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgOC40LjQuMTQgUkFOR0VSRURGUk0gc2hhbGwgYmUgdGhlIHNhbWUgYXMgZm9yIHRoZSB0ZW1wb3JhbGx5IHN1YnNlcXVlbnQgYW5jaG9yIGZyYW1lIChkaXNwbGF5IG9yZGVyKQogICAgICAgICAgICAgICBJZiB0aGlzIGlzIHNldCB0aGVuIHRoZSBjdXJyZW50IGRlY29kZWQgZnJhbWUgc2hhbGwgYmUgc2NhbGxlZCB1cCBzaW1pbGFyIHRvIFAgZnJhbWUuCiAgICAgICAgICAgICAgIFNjYWxpbmcgZm9yIHRoZSB0ZW1wb3JhbGx5IChkaXNwbGF5IG9yZGVyKSBwcmVjZWVkaW5nIGZyYW1lIHdpbGwgYmUgYXBwbGllZCBhcyBmb3IgUCBmcmFtZXMKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChjdHgtPmJSZWYwUmFuZ2VSZWQgJiYgIWN0eC0+YlJlZjFSYW5nZVJlZCkgewogICAgICAgICAgICAgICAgY3R4LT5tb2RlX2NvbmZpZyB8PSAoMHgxIDw8IDIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFjdHgtPmJSZWYwUmFuZ2VSZWQgJiYgY3R4LT5iUmVmMVJhbmdlUmVkKSB7CiAgICAgICAgICAgICAgICBjdHgtPm1vZGVfY29uZmlnIHw9ICgweDIgPDwgMik7CiAgICAgICAgICAgIH0gZWxzZSB7IC8qIG5laXRoZXIgb3IgYm90aCBhcmUgc2V0ICovCiAgICAgICAgICAgICAgICBjdHgtPm1vZGVfY29uZmlnIHw9ICgweDAgPDwgMik7IC8vIG5vIHNjYWxpbmcgb2YgcmVmZXJlbmNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY3R4LT5tb2RlX2NvbmZpZyB8PSAoMHgwIDw8IDIpOwogICAgfQogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTbGljZSBzdHJ1Y3R1cmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgaWYgKFZDMV9GQ01fRkxESSA9PSBwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlKSB7CiAgICAgICAgaWYgKChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnRvcF9maWVsZF9maXJzdCAmJiBwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmlzX2ZpcnN0X2ZpZWxkKSB8fAogICAgICAgICAgICAoIXBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMudG9wX2ZpZWxkX2ZpcnN0ICYmICFwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmlzX2ZpcnN0X2ZpZWxkKSkgewogICAgICAgICAgICAvLyBUb3AgZmllbGQKICAgICAgICAgICAgY3R4LT5zbGljZV9maWVsZF90eXBlID0gMDsKICAgICAgICAgICAgY3R4LT5ib3R0b21fZmllbGQgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEJvdHRvbSBmaWVsZAogICAgICAgICAgICBjdHgtPnNsaWNlX2ZpZWxkX3R5cGUgPSAxOwogICAgICAgICAgICBjdHgtPmJvdHRvbV9maWVsZCA9IDE7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvLyBwcm9ncmVzc2l2ZSBvciBpbnRlcmxhY2VkIGZyYW1lCiAgICAgICAgY3R4LT5zbGljZV9maWVsZF90eXBlID0gMjsKICAgICAgICBjdHgtPmJvdHRvbV9maWVsZCA9IDE7CiAgICB9CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqIEZDTSBmb3IgdGhlIHJlZmVyZW5jZSBwaWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICBjdHgtPnVpOEZDTV9SZWYwUGljID0gY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlOwogICAgY3R4LT51aThGQ01fUmVmMVBpYyA9IGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZTsKICAgIGlmIChjdHgtPm9ial9jb250ZXh0LT5mcmFtZV9jb3VudCA9PSAwKQogICAgICAgIGN0eC0+dWk4RkNNX1JlZjJQaWMgPSBjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGU7CgogICAgaWYgKFBJQ19UWVBFX0lTX1JFRihwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnBpY3R1cmVfdHlwZSkgfHwKICAgICAgICAoKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlID09IFdNRl9QVFlQRV9CKSAmJiAgICAgICAvKiBUaGUgc2Vjb25kIEIgZmllbGQgcGljdHVyZSBpbiBhbiAgICAgICAgICAgICAqLwogICAgICAgICAoY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlID09IFZDMV9GQ01fRkxESSkgJiYgICAgLyogaW50ZXJsYWNlZCBmaWVsZCBjb2RlZCBmcmFtZSBzaGFsbCAgICovCiAgICAgICAgICFwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmlzX2ZpcnN0X2ZpZWxkKSkgeyAgICAgICAgICAgIC8qIHJlZmVyZW5jZSB0aGUgZmlyc3QgZmllbGQgcGljdHVyZS4gICAqLwogICAgICAgIGlmIChjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGUgPT0gVkMxX0ZDTV9GTERJICYmICFwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmlzX2ZpcnN0X2ZpZWxkKSB7CiAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IHBpY3R1cmUgaXMgdGhlIHNlY29uZCBmaWVsZCBvZiB0aGUgZnJhbWUsIHRoZW4gdGhlIHByZXZpb3VzIGZpZWxkIHBpY3R1cmUKICAgICAgICAgICAgICAgaXMgaW4gdGhlIHNhbWUgZnJhbWUuIFRoZXJlZm9yZSB0aGUgRkNNIG9mIHRoZSBmaXJzdCBmaWVsZCBpcyB0aGUgc2FtZSBhcyB0aGUgRkNNIG9mIHRoZQogICAgICAgICAgICBjdXJyZW50IGZpZWxkIGFuZCB0aGUgZmlyc3QgZmllbGQgd2lsbCBiZSByZWZlcmVuY2UgMC4gKi8KICAgICAgICAgICAgY3R4LT51aThGQ01fUmVmMFBpYyA9IGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZTsKICAgICAgICB9IGVsc2UgaWYgKGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSA9PSBWQzFfRkNNX0ZMREkgJiYgcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5pc19maXJzdF9maWVsZCkgewogICAgICAgICAgICAvKiBUaGUgY3VycmVudCBwaWN0dXJlIGlzIHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgZnJhbWUsIHRoZW4gdGhlIHByZXZpb3VzIGZpZWxkIHBpY3R1cmUKICAgICAgICAgICAgICAgaXMgaW4gYSBkaWZmZXJlbnQgZnJhbWUgYW5kIHdpbGwgYmUgcmVmZXJlbmNlIDEuICovCiAgICAgICAgICAgIGN0eC0+dWk4RkNNX1JlZjFQaWMgPSBjdHgtPnVpOEZDTV9SZWYyUGljOwogICAgICAgIH0gZWxzZSB7IC8vIHByb2dyZXNpdmUgb3IgaW50ZXJsYWNlZCBmcmFtZSBwaWN0dXJlCiAgICAgICAgICAgIGN0eC0+dWk4RkNNX1JlZjFQaWMgPSBjdHgtPnVpOEZDTV9SZWYyUGljOwogICAgICAgIH0KICAgIH0KICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiogVEZGIGZvciB0aGUgcmVmZXJlbmNlIHBpY3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgIGlmIChjdHgtPm9ial9jb250ZXh0LT5mcmFtZV9jb3VudCA9PSAwKSB7CiAgICAgICAgY3R4LT5iVEZGX0Z3UmVmRnJtID0gcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy50b3BfZmllbGRfZmlyc3Q7CiAgICAgICAgY3R4LT5iVEZGX0J3UmVmRnJtID0gcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy50b3BfZmllbGRfZmlyc3Q7CiAgICB9CiAgICBpZiAoUElDX1RZUEVfSVNfUkVGKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlKSAmJgogICAgICAgICgoY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlICE9IFZDMV9GQ01fRkxESSkgfHwKICAgICAgICAgcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5pc19maXJzdF9maWVsZCkpIHsKICAgICAgICBjdHgtPmJURkZfRndSZWZGcm0gPSBjdHgtPmJURkZfQndSZWZGcm07CiAgICB9CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgIHBzYl9DaGVja0ludGVybGFjZVJvdGF0ZShjdHgtPm9ial9jb250ZXh0LCAodm9pZCAqKWN0eC0+cGljX3BhcmFtcyk7CgogICAgcmV0dXJuIFZBX1NUQVRVU19TVUNDRVNTOwp9CgpzdGF0aWMgVkFTdGF0dXMgcHNiX19WQzFfcHJvY2Vzc19iaXRwbGFuZShjb250ZXh0X1ZDMV9wIGN0eCwgb2JqZWN0X2J1ZmZlcl9wIG9ial9idWZmZXIpCnsKICAgIFZBU3RhdHVzIHZhU3RhdHVzID0gVkFfU1RBVFVTX1NVQ0NFU1M7CiAgICBBU1NFUlQob2JqX2J1ZmZlci0+dHlwZSA9PSBWQUJpdFBsYW5lQnVmZmVyVHlwZSk7CiAgICBBU1NFUlQoY3R4LT5waWNfcGFyYW1zKTsKICAgIC8qIFdlIG5lZWQgdG8gaGF2ZSBkYXRhIGluIHRoZSBiaXRwbGFuZSBidWZmZXIgKi8KICAgIENIRUNLX0lOVkFMSURfUEFSQU0oKE5VTEwgPT0gb2JqX2J1ZmZlci0+cHNiX2J1ZmZlcikgfHwgKDAgPT0gb2JqX2J1ZmZlci0+c2l6ZSkpOwoKICAgIGN0eC0+Yml0cGxhbmVfYnVmZmVyID0gb2JqX2J1ZmZlci0+cHNiX2J1ZmZlcjsKICAgIGN0eC0+aGFzX2JpdHBsYW5lID0gVFJVRTsKICAgIHJldHVybiB2YVN0YXR1czsKfQoKLyoKICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSBnaXZlbiB0YWJsZSBmcm9tIHRoZSBpbmRleCBvZiBWTEMgdGFibGVzLgogKi8Kc3RhdGljIHZvaWQgcHNiX19WQzFfZXh0cmFjdF90YWJsZV9pbmZvKGNvbnRleHRfVkMxX3AgY3R4LCBzVGFibGVEYXRhICpwc0luZm8sIGludCBpZHgpCnsKICAgIElNR19VSU5UMzIgdG1wOwoKICAgIGlmIChpZHggPj0gVkxDX0lOREVYX1RBQkxFX1NJWkUpCiAgICAgICAgaWR4ID0gVkxDX0lOREVYX1RBQkxFX1NJWkUgLSAxOwoKICAgIHRtcCA9IGN0eC0+dmxjX3BhY2tlZF9pbmRleF90YWJsZVtpZHhdOwogICAgcHNJbmZvLT5hdWkxNlN0YXJ0TG9jYXRpb24gICAgICA9IChJTUdfVUlOVDE2KSh0bXAgJiAweGZmZmYpOwogICAgcHNJbmZvLT5hdWkxNlZMQ1RhYmxlTGVuZ3RoICAgICA9IChJTUdfVUlOVDE2KSgodG1wID4+IDE2KSAmIDB4MWZmKTsKICAgIHBzSW5mby0+YXVpMTZJbml0aWFsV2lkdGggICAgICAgPSAoSU1HX1VJTlQxNikoKHRtcCA+PiAyNSkgJiAweDcpOwogICAgcHNJbmZvLT5hdWkxNkluaXRpYWxPcGNvZGUgICAgICA9IChJTUdfVUlOVDE2KSgodG1wID4+IDI4KSAmIDB4Myk7Cn0KCi8qCiAqIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyB0aGUgVkxEIHRhYmxlcyBmcm9tIHRoZSBwaWN0dXJlIGxheWVyIHBhcmFtZXRlcnMuCiAqLwpzdGF0aWMgdm9pZCBwc2JfX1ZDMV93cml0ZV9WTENfdGFibGVzKGNvbnRleHRfVkMxX3AgY3R4KQp7CiAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWQzEgKnBpY19wYXJhbXMgPSBjdHgtPnBpY19wYXJhbXM7CiAgICBJTUdfVUlOVDE2ICAgICAgICAgIHVpMTZUYWJsZSA9IDAsIHVpMTZJbnRyYVRhYmxlID0gMCwgdWkxNkludGVyVGFibGUgPSAwLCBhdWkxNlRhYmxlWzNdOwogICAgSU1HX1VJTlQzMiAgICAgICAgICBpLCB1aTMyVGFibGVOdW0gPSAwOwoKICAgIC8qIHNlbGVjdCB0aGUgcmVxdWlyZWQgdGFibGUgZnJvbSB0aGUgbiBkaWZmZXJlbnQgdHlwZXMKICAgICAgICAgICAgQSAtIHZjMURFQ19JX1BpY3R1cmVfQ0JQQ1lfVkxDICAgICAgICAgICAgKDEpICAgICAgIKwKICAgICAgICAgICAgQiAtIHZjMURFQ19QX1BpY3R1cmVfQ0JQQ1lfVkxDX04gICAgICAgICAgKDQpICAgICAgIHwKICAgICAgICAgICAgQyAtIHZjMURFQ19JbnRlcmxhY2VkX0NCUENZX04gICAgICAgICAgICAgKDgpICAgICAgIHwKICAgICAgICAgICAgRCAtIHZjMURFQ19Gb3VyTVZfUGF0dGVybl9OICAgICAgICAgICAgICAgKDQpICAgICAgIHwKICAgICAgICAgICAgRSAtIHZjMURFQ19JTlRFUkxBQ0VfMl9NVlBfUGF0dGVybl9OICAgICAgKDQpICAgICAgIHwKICAgICAgICAgICAgRiAtIHZjMURFQ19Nb3RfVmVjdG9yX0RpZmZfVkxDX04gICAgICAgICAgKDQpICAgICAgIHwgICBNQiBMYXllcgogICAgICAgICAgICBHIC0gdmMxREVDX09uZV9GaWVsZF9SZWZfSWxhY2VfTVZfTiAgICAgICAoNCkgICAgICAgfAogICAgICAgICAgICBIIC0gdmMxREVDX1R3b19GaWVsZF9SZWZfSWxhY2VfTVZfTiAgICAgICAoOCkgICAgICAgfAogICAgICAgICAgICBJIC0gdmMxREVDX01peGVkX01WX01CX04gICAgICAgICAgICAgICAgICAoOCkgICAgICAgfAogICAgICAgICAgICBKIC0gdmMxREVDX09uZV9NVl9NQl9OICAgICAgICAgICAgICAgICAgICAoOCkgICAgICAgfAogICAgICAgICAgICBLIC0gdmMxREVDX0lOVEVSTEFDRV80TVZfTUJfTiAgICAgICAgICAgICAoNCkgICAgICAgfAogICAgICAgICAgICBMIC0gdmMxREVDX0lOVEVSTEFDRV9Ob25fNE1WX01CX04gICAgICAgICAoNCkgICAgICAgfAogICAgICAgICAgICBNIC0gdmMxREVDX1hfUmF0ZV9UVE1CICAgICAgICAgICAgICAgICAgICAoMykgICAgICAgLQogICAgICAgICAgICBOIC0gdmMxREVDX1hfUmF0ZV9UVEJMSyAgICAgICAgICAgICAgICAgICAoMykgICAgICAgrAogICAgICAgICAgICBPIC0gdmMxREVDX1hfUmF0ZV9TVUJCTEtQQVQgICAgICAgICAgICAgICAoMykgICAgICAgfAogICAgICAgICAgICBQIC0gdmMxREVDX1hfWF9JbnRlcl9WTEMgICAgICAgICAgICAgICAgICAoNCkgICAgICAgfCAgIEJsb2NrIExheWVyCiAgICAgICAgICAgIFEgLSB2YzFERUNfWF9YX0ludHJhX1ZMQyAgICAgICAgICAgICAgICAgICg0KSAgICAgICB8CiAgICAgICAgICAgIFIgLSB2YzFERUNfWF9Nb3RfTHVtaW5hbmNlX0RDX0RpZmZfVkxDICAgICgyKSAgICAgICB8CiAgICAgICAgICAgIFMgLSB2YzFERUNfWF9Nb3RfQ2hyb21hX0RDX0RpZmZfVkxDICAgICAgICgyKSAgICAgICAtCgogICAgICAgICAgICBYIC0gdmMxREVDX0NvZGVfM3gyXzJ4M190aWxlcyAgICAgICAgICAgICAoMSkgICBOT1QgVVNFRCAgICAqLwoKICAgIC8qIQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEAgVGFibGUgQSxCLEMgIFZMQyBDQlBDWSBUYWJsZXMKCiAgICAgICAgW1ZDMV0gICA3LjEuMy4xIENvZGVkIEJsb2NrIFBhdHRlcm4gKENCUENZKSAoVmFyaWFibGUgc2l6ZSlbSSwgUCxCXQoKICAgICAgICAgICAgQ0JQQ1kgaXMgYSB2YXJpYWJsZS1zaXplZCBzeW50YXggZWxlbWVudCB0aGF0IHNoYWxsIGJlIHByZXNlbnQgaW4gYWxsCiAgICAgICAgICAgIEkgYW5kIEJJIHBpY3R1cmUgbWFjcm9ibG9ja3MsIGFuZCBtYXkgYmUgcHJlc2VudCBpbiBQIGFuZCBCIHBpY3R1cmUKICAgICAgICAgICAgbWFjcm9ibG9ja3MuIEluIFAgYW5kIEIgcGljdHVyZXMsIENCUENZIHNoYWxsIGJlIGRlY29kZWQgdXNpbmcKICAgICAgICAgICAgdGhlIFZMQyB0YWJsZSBzcGVjaWZpZWQgYnkgdGhlIENCUFRBQiBzeW50YXggZWxlbWVudCBhcyBkZXNjcmliZWQgaW4KICAgICAgICAgICAgc2VjdGlvbiA3LjEuMS4zOS4gVGhlIENCUCB0YWJsZXMgZm9yIFAgYW5kIEIgcGljdHVyZXMgYXJlIGxpc3RlZCBpbgogICAgICAgICAgICBzZWN0aW9uIDExLjYuCgoKICAgICAgICBbVkMxXSAgIDkuMS4zLjIgQ29kZWQgQmxvY2sgUGF0dGVybiAoQ0JQQ1kpIChWYXJpYWJsZSBzaXplKVtJLCBQLEJdCgogICAgICAgICAgICBUYWJsZSAxMDI6IElDQlBUQUIgY29kZS10YWJsZQoKICAgICAgICAgICAgQSAgdmMxREVDX0lfUGljdHVyZV9DQlBDWV9WTEMgICAgICAgICAgICAoMSkKICAgICAgICAgICAgQiAgdmMxREVDX1BfUGljdHVyZV9DQlBDWV9WTENfTiAgICAgICAgICAoNCkKICAgICAgICAgICAgQyAgdmMxREVDX0ludGVybGFjZWRfQ0JQQ1lfTiAgICAgICAgICAgICAoOCkKCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICBpZiAoKCFwaWNfcGFyYW1zLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5pbnRlcmxhY2UpIHx8IChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlID09IFZDMV9GQ01fUCkpIHsKICAgICAgICBpZiAoUElDX1RZUEVfSVNfSU5UUkEocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUpKSB7CiAgICAgICAgICAgIHVpMTZUYWJsZSA9IFZDMV9WTENfSV9QaWN0dXJlX0NCUENZX1ZMQzsKICAgICAgICB9IGVsc2UgaWYgKFBJQ19UWVBFX0lTX0lOVEVSKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlKSkgewogICAgICAgICAgICBwc2JfX2JvdW5kc19jaGVjayhwaWNfcGFyYW1zLT5jYnBfdGFibGUsIDQpOwogICAgICAgICAgICB1aTE2VGFibGUgPSBDQlBDWVRhYmxlUHJvZ1twaWNfcGFyYW1zLT5jYnBfdGFibGVdOwogICAgICAgIH0KICAgIH0gZWxzZSB7IC8qIEludGVybGFjZWQgKi8KICAgICAgICBpZiAoUElDX1RZUEVfSVNfSU5UUkEocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUpKSB7CiAgICAgICAgICAgIHVpMTZUYWJsZSA9IFZDMV9WTENfSV9QaWN0dXJlX0NCUENZX1ZMQzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwc2JfX2JvdW5kc19jaGVjayhwaWNfcGFyYW1zLT5jYnBfdGFibGUsIDgpOwogICAgICAgICAgICB1aTE2VGFibGUgPSBDQlBDWVRhYmxlSW50ZXJsYWNlZFtwaWNfcGFyYW1zLT5jYnBfdGFibGVdOyAgLyogTFVUICovCiAgICAgICAgfQogICAgfQoKICAgIHBzYl9fVkMxX2V4dHJhY3RfdGFibGVfaW5mbyhjdHgsICZjdHgtPnNUYWJsZUluZm9bdWkzMlRhYmxlTnVtXSwgdWkxNlRhYmxlKTsKICAgIHVpMzJUYWJsZU51bSsrOwoKICAgIC8qIQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBAIFRhYmxlIEQgICBWTEMgNE1WIFBhdHRlcm4KCiAgICBbVkMxXSAgICAgICBUYWJsZSAxMDQ6IDRNVkJQIGNvZGUtdGFibGUKCiAgICAgICAgICAgIFRhYmxlcyAxMTYtMTE5CgogICAgICAgICAgICBEIHZjMURFQ19Gb3VyTVZfUGF0dGVybl9OICAgICAgICAgICAgICAgKDQpCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICBwc2JfX2JvdW5kc19jaGVjayhwaWNfcGFyYW1zLT5tdl9maWVsZHMuYml0cy5mb3VyX212X2Jsb2NrX3BhdHRlcm5fdGFibGUsIDQpOwogICAgdWkxNlRhYmxlID0gRm91ck1WVGFibGVbcGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMuZm91cl9tdl9ibG9ja19wYXR0ZXJuX3RhYmxlXTsKCiAgICBwc2JfX1ZDMV9leHRyYWN0X3RhYmxlX2luZm8oY3R4LCAmY3R4LT5zVGFibGVJbmZvW3VpMzJUYWJsZU51bV0sIHVpMTZUYWJsZSk7CiAgICB1aTMyVGFibGVOdW0rKzsKCiAgICAvKiEKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQCBUYWJsZSBFICBWTEMgMk1WQlAgVGFibGVzCgoKICAgICAgICBUYWJsZSAxMDM6IDJNVkJQIGNvZGUtdGFibGUKCiAgICAgICAgZm9yIFRhYmxlcyAxMjAtMTIzCgogICAgICAgIEUgdmMxREVDX0lOVEVSTEFDRV8yX01WUF9QYXR0ZXJuX04gICAgICAoNCkKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgcHNiX19ib3VuZHNfY2hlY2socGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMudHdvX212X2Jsb2NrX3BhdHRlcm5fdGFibGUsIDQpOwogICAgdWkxNlRhYmxlID0gSW50ZXJsYWNlMk1WVGFibGVbcGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMudHdvX212X2Jsb2NrX3BhdHRlcm5fdGFibGVdOwoKICAgIHBzYl9fVkMxX2V4dHJhY3RfdGFibGVfaW5mbyhjdHgsICZjdHgtPnNUYWJsZUluZm9bdWkzMlRhYmxlTnVtXSwgdWkxNlRhYmxlKTsKICAgIHVpMzJUYWJsZU51bSsrOwoKICAgIC8qIQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBAIFRhYmxlIEYsRyxIICBWTEMgTVYgVGFibGVzCgogICAgICAgIFtWQzFdICAgTVZEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlIHNpemUgICB2bGNsYmYgIDcuMS4zLjgKCiAgICAgICAgNy4xLjMuOCBNb3Rpb24gVmVjdG9yIERhdGEgKE1WREFUQSkoVmFyaWFibGUgc2l6ZSlbUF0KCiAgICAgICAgTVZEQVRBIGlzIGEgdmFyaWFibGUgc2l6ZWQgc3ludGF4IGVsZW1lbnQgdGhhdCBtYXkgYmUgcHJlc2VudCBpbiBQIHBpY3R1cmUKICAgICAgICBtYWNyb2Jsb2Nrcy4gVGhpcyBzeW50YXggZWxlbWVudCBkZWNvZGVzIHRvIHRoZSBtb3Rpb24gdmVjdG9yKHMpIGZvciB0aGUKICAgICAgICBtYWNyb2Jsb2NrLiBUaGUgdGFibGUgdXNlZCB0byBkZWNvZGUgdGhpcyBzeW50YXggZWxlbWVudCBpcyBzcGVjaWZpZWQgYnkgdGhlCiAgICAgICAgTVZUQUIgc3ludGF4IGVsZW1lbnQgaW4gdGhlIHBpY3R1cmUgbGF5ZXIgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gNy4xLjEuMzguCgogICAgICAgIEYgICB2YzFERUNfTW90X1ZlY3Rvcl9EaWZmX1ZMQ19OICAgICAgICAgICg0KQoKICAgICAgICBbVkMxXSAgIDkuMS4xLjM0ICAgICAgICBJTlRFUkxBQ0UgTW90aW9uIFZlY3RvciBUYWJsZSAoSU1WVEFCKSAoMiBvciAzIGJpdHMpCgogICAgICAgIFRhYmxlIDEwMDogICAgICBJTVZUQUIgY29kZS10YWJsZSBmb3IgUCBJTlRFUkxBQ0UgZmllbGQgcGljdHVyZSB3aXRoIE5VTVJFRiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZm9yIFAvQiBJTlRFUkxBQ0UgZnJhbWUgcGljdHVyZXMKCiAgICAgICAgICAgIElNVlRBQiAgICAgIE1vdGlvbiBWZWN0b3IgVGFibGUKICAgICAgICAgICAgMDAgICAgICAgICAgMS1SZWZlcmVuY2UgVGFibGUgMAogICAgICAgICAgICAwMSAgICAgICAgICAxLVJlZmVyZW5jZSBUYWJsZSAxCiAgICAgICAgICAgIDEwICAgICAgICAgIDEtUmVmZXJlbmNlIFRhYmxlIDIKICAgICAgICAgICAgMTEgICAgICAgICAgMS1SZWZlcmVuY2UgVGFibGUgMwoKICAgICAgICBUYWJsZSAxMDE6ICAgICAgSU1WVEFCIGNvZGUtdGFibGUgZm9yIFAgSU5URVJMQUNFIGZpZWxkIHBpY3R1cmVzIHdpdGggTlVNUkVGID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmb3IgQiBJTlRFUkxBQ0UgZmllbGQgcGljdHVyZXMKCiAgICAgICAgICAgIElNVlRBQiAgICAgIE1vdGlvbiBWZWN0b3IgVGFibGUKICAgICAgICAgICAgMDAwICAgICAgICAgMi1SZWZlcmVuY2UgVGFibGUgMAogICAgICAgICAgICAwMDEgICAgICAgICAyLVJlZmVyZW5jZSBUYWJsZSAxCiAgICAgICAgICAgIDAxMCAgICAgICAgIDItUmVmZXJlbmNlIFRhYmxlIDIKICAgICAgICAgICAgMDExICAgICAgICAgMi1SZWZlcmVuY2UgVGFibGUgMwogICAgICAgICAgICAxMDAgICAgICAgICAyLVJlZmVyZW5jZSBUYWJsZSA0CiAgICAgICAgICAgIDEwMSAgICAgICAgIDItUmVmZXJlbmNlIFRhYmxlIDUKICAgICAgICAgICAgMTEwICAgICAgICAgMi1SZWZlcmVuY2UgVGFibGUgNgogICAgICAgICAgICAxMTEgICAgICAgICAyLVJlZmVyZW5jZSBUYWJsZSA3CgogICAgICAgIEcgICB2YzFERUNfT25lX0ZpZWxkX1JlZl9JbGFjZV9NVl9OICAgICAgICg0KQogICAgICAgIEggICB2YzFERUNfVHdvX0ZpZWxkX1JlZl9JbGFjZV9NVl9OICAgICAgICg4KQoKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgaWYgKCghcGljX3BhcmFtcy0+c2VxdWVuY2VfZmllbGRzLmJpdHMuaW50ZXJsYWNlKSB8fCAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSA9PSBWQzFfRkNNX1ApKSB7CiAgICAgICAgcHNiX19ib3VuZHNfY2hlY2socGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMubXZfdGFibGUsIDQpOwogICAgICAgIHVpMTZUYWJsZSA9IFByb2dyZXNzaXZlTVZUYWJsZVtwaWNfcGFyYW1zLT5tdl9maWVsZHMuYml0cy5tdl90YWJsZV07CiAgICB9IGVsc2UgewogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgUElDX1RZUEVfSVNfSU5URVIocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUpICYmCiAgICAgICAgICAgICAgICAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSA9PSBWQzFfRkNNX0ZSTUkpCiAgICAgICAgICAgICkKICAgICAgICAgICAgfHwKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlID09IFdNRl9QVFlQRV9QKSAmJgogICAgICAgICAgICAgICAgKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGUgPT0gVkMxX0ZDTV9GTERJKSAmJgogICAgICAgICAgICAgICAgKHBpY19wYXJhbXMtPnJlZmVyZW5jZV9maWVsZHMuYml0cy5udW1fcmVmZXJlbmNlX3BpY3R1cmVzID09IDApCiAgICAgICAgICAgICkKICAgICAgICApIHsKICAgICAgICAgICAgLyogT25lIGZpZWxkICovCiAgICAgICAgICAgIHBzYl9fYm91bmRzX2NoZWNrKHBpY19wYXJhbXMtPm12X2ZpZWxkcy5iaXRzLm12X3RhYmxlLCA0KTsKICAgICAgICAgICAgdWkxNlRhYmxlID0gSW50ZXJsYWNlZDFSZWZNVlRhYmxlW3BpY19wYXJhbXMtPm12X2ZpZWxkcy5iaXRzLm12X3RhYmxlXTsKICAgICAgICB9IGVsc2UgeyAvKmlmICgoKEZDTSA9PSBWQzFfRkNNX0ZMREkpICYmIChOVU1SRUYgPT0gMCkgJiYgKFBUWVBFID09IFdNRl9QVFlQRV9QKSkgfHwgKChQVFlQRSA9PSBXTUZfUFRZUEVfQikgJiYgKEZDTSA9PSBWQzFfRkNNX0ZMREkpKSkgKi8KICAgICAgICAgICAgLyogdHdvIGZpZWxkICovCiAgICAgICAgICAgIHBzYl9fYm91bmRzX2NoZWNrKHBpY19wYXJhbXMtPm12X2ZpZWxkcy5iaXRzLm12X3RhYmxlLCA4KTsKICAgICAgICAgICAgdWkxNlRhYmxlID0gTVZUYWJsZTJSZWZJbGFjZVtwaWNfcGFyYW1zLT5tdl9maWVsZHMuYml0cy5tdl90YWJsZV07ICAgLyogTFVUICovCiAgICAgICAgfQogICAgfQoKICAgIHBzYl9fVkMxX2V4dHJhY3RfdGFibGVfaW5mbyhjdHgsICZjdHgtPnNUYWJsZUluZm9bdWkzMlRhYmxlTnVtXSwgdWkxNlRhYmxlKTsKICAgIHVpMzJUYWJsZU51bSsrOwoKICAgIC8qIQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBAIFRhYmxlIEksSixLLEwgIFZMQyBNQk1PREUgVGFibGVzCgogICAgICAgIEkgdmMxREVDX01peGVkX01WX01CX04gICAgICAgICAgICAgICAgICAoOCkKICAgICAgICBKIHZjMURFQ19PbmVfTVZfTUJfTiAgICAgICAgICAgICAgICAgICAgKDgpCiAgICAgICAgSyB2YzFERUNfSU5URVJMQUNFXzRNVl9NQl9OICAgICAgICAgICAgICg0KQogICAgICAgIEwgdmMxREVDX0lOVEVSTEFDRV9Ob25fNE1WX01CX04gICAgICAgICAoNCkKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgdWkxNlRhYmxlID0gMDsKICAgIGlmIChwaWNfcGFyYW1zLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5pbnRlcmxhY2UgJiYgKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGUgPiBWQzFfRkNNX1ApKSB7CiAgICAgICAgaWYgKFBJQ19UWVBFX0lTX0lOVEVSKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlKSkgewogICAgICAgICAgICBpZiAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSA9PSBWQzFfRkNNX0ZMREkpIHsKICAgICAgICAgICAgICAgIHBzYl9fYm91bmRzX2NoZWNrKHBpY19wYXJhbXMtPm1iX21vZGVfdGFibGUsIDgpOwogICAgICAgICAgICAgICAgLyogOS4xLjEuMzMgdXNlIE1CTU9ERVRBQiBhbmQgTVZNT0RFIHRvIHNlbGVjdCBmaWVsZCBpbnRlcmxhY2VkIHRhYmxlcyAqLwogICAgICAgICAgICAgICAgdWkxNlRhYmxlID0gTUJNT0RFVGFibGVGTERJW3BpY19wYXJhbXMtPm1iX21vZGVfdGFibGVdWyhwaWNfcGFyYW1zLT5tdl9maWVsZHMuYml0cy5tdl9tb2RlID09IFdNRl9NVk1PREVfTUlYRURfTVYpID8gMSA6IDBdOwogICAgICAgICAgICB9IGVsc2UgaWYgKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGUgPT0gVkMxX0ZDTV9GUk1JKSB7CiAgICAgICAgICAgICAgICBwc2JfX2JvdW5kc19jaGVjayhwaWNfcGFyYW1zLT5tYl9tb2RlX3RhYmxlLCA0KTsKICAgICAgICAgICAgICAgIC8qIDkuMS4xLjMzIHVzZSBNQk1PREVUQUIgYW5kIE1WNFNXSVRDSCB0byBzZWxlY3QgZnJhbWUgaW50ZXJsYWNlZCB0YWJsZXMgKi8KICAgICAgICAgICAgICAgIHVpMTZUYWJsZSA9IE1CTU9ERVRhYmxlRlJNSVtwaWNfcGFyYW1zLT5tYl9tb2RlX3RhYmxlXVsocGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMuZm91cl9tdl9zd2l0Y2gpID8gMCA6IDFdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHBzYl9fVkMxX2V4dHJhY3RfdGFibGVfaW5mbyhjdHgsICZjdHgtPnNUYWJsZUluZm9bdWkzMlRhYmxlTnVtXSwgdWkxNlRhYmxlKTsKICAgIHVpMzJUYWJsZU51bSsrOwoKICAgIC8qIQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBAIFRhYmxlIE0sTixPICBWTEMgUFFVQU5UIFRhYmxlcwoKICAgIFtXTVY5XSAgICAgIDMuMi4yLjEwICAgICAgICBNQi1sZXZlbCBUcmFuc2Zvcm0gVHlwZSAoVFRNQikoVmFyaWFibGUgc2l6ZSlbUCxCXQogICAgW1dNVjldICAgICAgMy4yLjMuMTUgICAgICAgIEJsb2NrLWxldmVsIFRyYW5zZm9ybSBUeXBlIChUVEJMSykoVmFyaWFibGUgc2l6ZSlbaW50ZXJdCgogICAgW1dNVjldICAgICAgMy4yLjMuMTYgICAgICAgIFRyYW5zZm9ybSBzdWItYmxvY2sgcGF0dGVybiAoU1VCQkxLUEFUKShWYXJpYWJsZSBzaXplKVtpbnRlcl0KCiAgICAgICAgICAgIE0gdmMxREVDX1hfUmF0ZV9UVE1CICAgICAgICAgICAgICAgICAgICAoMykKICAgICAgICAgICAgTiB2YzFERUNfWF9SYXRlX1RUQkxLICAgICAgICAgICAgICAgICAgICgzKQogICAgICAgICAgICBPIHZjMURFQ19YX1JhdGVfU1VCQkxLUEFUICAgICAgICAgICAgICAgKDMpCgogICAgICAgIFRUQkxLIGFuZCBUVE1CIFAgYW5kIEIgUGljdHVyZXMgb25seQoKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgYXVpMTZUYWJsZVswXSA9IDA7CiAgICBhdWkxNlRhYmxlWzFdID0gMDsKICAgIGF1aTE2VGFibGVbMl0gPSAwOwoKICAgIGlmIChwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLnBpY19xdWFudGl6ZXJfc2NhbGUgPD0gNCkgeyAgICAgICAgICAgIC8qIGhpZ2ggcmF0ZSAqLwogICAgICAgIGF1aTE2VGFibGVbMl0gICA9IFZDMV9WTENfSGlnaF9SYXRlX1NVQkJMS1BBVDsKICAgICAgICBhdWkxNlRhYmxlWzFdICAgPSBWQzFfVkxDX0hpZ2hfUmF0ZV9UVEJMSzsKICAgICAgICBhdWkxNlRhYmxlWzBdICAgPSBWQzFfVkxDX0hpZ2hfUmF0ZV9UVE1COwogICAgfSBlbHNlIGlmIChwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLnBpY19xdWFudGl6ZXJfc2NhbGUgPD0gMTIpIHsgICAgIC8qIG1lZCByYXRlICovCiAgICAgICAgYXVpMTZUYWJsZVsyXSAgID0gVkMxX1ZMQ19NZWRpdW1fUmF0ZV9TVUJCTEtQQVQ7CiAgICAgICAgYXVpMTZUYWJsZVsxXSAgID0gVkMxX1ZMQ19NZWRpdW1fUmF0ZV9UVEJMSzsKICAgICAgICBhdWkxNlRhYmxlWzBdICAgPSBWQzFfVkxDX01lZGl1bV9SYXRlX1RUTUI7CiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG93IHJhdGUgKi8KICAgICAgICBhdWkxNlRhYmxlWzJdICAgPSBWQzFfVkxDX0xvd19SYXRlX1NVQkJMS1BBVDsKICAgICAgICBhdWkxNlRhYmxlWzFdICAgPSBWQzFfVkxDX0xvd19SYXRlX1RUQkxLOwogICAgICAgIGF1aTE2VGFibGVbMF0gICA9IFZDMV9WTENfTG93X1JhdGVfVFRNQjsKICAgIH0KCiAgICBmb3IgKGkgPSB1aTMyVGFibGVOdW07IGkgPCB1aTMyVGFibGVOdW0gKyAzOyBpKyspIHsKICAgICAgICBwc2JfX1ZDMV9leHRyYWN0X3RhYmxlX2luZm8oY3R4LCAmY3R4LT5zVGFibGVJbmZvW2ldLCBhdWkxNlRhYmxlW2ktdWkzMlRhYmxlTnVtXSk7CiAgICB9CgogICAgdWkzMlRhYmxlTnVtID0gdWkzMlRhYmxlTnVtICsgMzsKCiAgICB7CiAgICAgICAgLyohCiAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBJbnRlciBDb2RlZCBCbG9ja3MKCiAgICAgICAgVGFibGUgNTQ6IEluZGV4L0NvZGluZyBTZXQgQ29ycmVzcG9uZGVuY2UgZm9yIFBRSU5ERVggPD0gNwogICAgICAgICAgICBZLCBDYiBhbmQgQ3IgYmxvY2tzCgogICAgICAgICAgICBJbmRleCAgICAgICBUYWJsZQogICAgICAgICAgICAwICAgICAgICAgICBIaWdoIFJhdGUgSW50ZXIKICAgICAgICAgICAgMSAgICAgICAgICAgSGlnaCBNb3Rpb24gSW50ZXIKICAgICAgICAgICAgMiAgICAgICAgICAgTWlkIFJhdGUgSW50ZXIKCiAgICAgICAgVGFibGUgNTU6IEluZGV4L0NvZGluZyBTZXQgQ29ycmVzcG9uZGVuY2UgZm9yIFBRSU5ERVggPiA3CiAgICAgICAgICAgIFksIENiIGFuZCBDciBibG9ja3MKCiAgICAgICAgICAgIEluZGV4ICAgICAgIFRhYmxlCiAgICAgICAgICAgIDAgICAgICAgICAgIExvdyBNb3Rpb24gSW50ZXIKICAgICAgICAgICAgMSAgICAgICAgICAgSGlnaCBNb3Rpb24gSW50ZXIKICAgICAgICAgICAgMiAgICAgICAgICAgTWlkIFJhdGUgSW50ZXIKCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIEludHJhIEJsb2NrcwoKICAgICAgICA4IEFDIENvZWZmIENvZGluZyBTZXRzOgogICAgICAgICAgICA0IHggSU5UUkEsIDQgeCBJTlRFUgoKICAgICAgICAgICAgWSB1c2UgSW50cmEsIENyQ2IgdXNlIEludGVyCgogICAgICAgIFRhYmxlIDM4OiBDb2RpbmcgU2V0IENvcnJlc3BvbmRlbmNlIGZvciBQUUlOREVYIDw9IDcKCiAgICAgICAgICAgIFkgYmxvY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYiBhbmQgQ3IgYmxvY2tzCiAgICAgICAgICAgIEluZGV4ICAgICAgIFRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCAgIFRhYmxlCiAgICAgICAgICAgIDAgICAgICAgICAgIEhpZ2ggUmF0ZSBJbnRyYSAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIEhpZ2ggUmF0ZSBJbnRlcgogICAgICAgICAgICAxICAgICAgICAgICBIaWdoIE1vdGlvbiBJbnRyYSAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICBIaWdoIE1vdGlvbiBJbnRlcgogICAgICAgICAgICAyICAgICAgICAgICBNaWQgUmF0ZSBJbnRyYSAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICBNaWQgUmF0ZSBJbnRlcgoKICAgICAgICBUYWJsZSAzOTogQ29kaW5nIFNldCBDb3JyZXNwb25kZW5jZSBmb3IgUFFJTkRFWCA+IDcKCiAgICAgICAgICAgIFkgYmxvY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYiBhbmQgQ3IgYmxvY2tzCiAgICAgICAgICAgIEluZGV4ICAgICAgIFRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCAgIFRhYmxlCiAgICAgICAgICAgIDAgICAgICAgICAgIExvdyBNb3Rpb24gSW50cmEgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIExvdyBNb3Rpb24gSW50ZXIKICAgICAgICAgICAgMSAgICAgICAgICAgSGlnaCBNb3Rpb24gSW50cmEgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgSGlnaCBNb3Rpb24gSW50ZXIKICAgICAgICAgICAgMiAgICAgICAgICAgTWlkIFJhdGUgSW50cmEgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgTWlkIFJhdGUgSW50ZXIKCiAgICAgICAgVGhlIHZhbHVlIGRlY29kZWQgZnJvbSB0aGUgRENUQUNGUk0yIHN5bnRheCBlbGVtZW50IHNoYWxsIGJlIHVzZWQKICAgICAgICBhcyB0aGUgY29kaW5nIHNldCBpbmRleCBmb3IgWSBibG9ja3MgYW5kIHRoZSB2YWx1ZSBkZWNvZGVkIGZyb20gdGhlCiAgICAgICAgRENUQUNGUk0gc3ludGF4IGVsZW1lbnQgc2hhbGwgYmUgdXNlZCBhcyB0aGUgY29kaW5nIHNldAogICAgICAgIGluZGV4IGZvciBDYiBhbmQgQ3IgYmxvY2tzLgoKICAgICAgICAgICAgUCB2YzFERUNfWF9YX0ludGVyX1ZMQwogICAgICAgICAgICBRIHZjMURFQ19YX1hfSW50cmFfVkxDCgoKICAgICAgICBmb3IgSSBwaWN0dXJlcyAgVFJBTlNBQ0ZSTSBzcGVjaWZpZXMgdGhlIEludGVyIENvZGluZyBzZXQKICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNBQ0ZSTTIgc3BlY2lmaWVzIHRoZSBJbnRyYSBDb2Rpbmcgc2V0CgogICAgICAgIGZvciBQIHBpY3R1cmVzICBUUkFOU0FDRlJNIHNwZWNpZmllcyBJbnRlciBhbmQgSW50cmEgQ29kaW5nIHNldAoKCiAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgIElNR19VSU5UMzIgIHVpMzJJbnRyYUNvZGluZ1NldEluZGV4ID0gUElDX1RZUEVfSVNfSU5UUkEocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICBwaWNfcGFyYW1zLT50cmFuc2Zvcm1fZmllbGRzLmJpdHMudHJhbnNmb3JtX2FjX2NvZGluZ3NldF9pZHgyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICBwaWNfcGFyYW1zLT50cmFuc2Zvcm1fZmllbGRzLmJpdHMudHJhbnNmb3JtX2FjX2NvZGluZ3NldF9pZHgxOwoKICAgICAgICBJTUdfVUlOVDMyICB1aTMySW50ZXJDb2RpbmdTZXRJbmRleCA9IHBpY19wYXJhbXMtPnRyYW5zZm9ybV9maWVsZHMuYml0cy50cmFuc2Zvcm1fYWNfY29kaW5nc2V0X2lkeDE7CgogICAgICAgIC8qIEZvciBQUUlOREVYIDwgOSB0aGUgdW5pZm9ybSBxdWFudGl6ZXIgc2hvdWxkIGJlIHVzZWQsIGFzIGluZGljYXRlZCBieSBQUVVBTlRJWkVSID09IDEgKi8KICAgICAgICBpZiAoIWN0eC0+cHFpbmRleF9ndDgpIHsKICAgICAgICAgICAgdWkxNkludHJhVGFibGUgPSBJbnRyYVRhYmxlUFFJbmRleExUOVt1aTMySW50cmFDb2RpbmdTZXRJbmRleF07CiAgICAgICAgICAgIHVpMTZJbnRlclRhYmxlID0gSW50ZXJUYWJsZVBRSW5kZXhMVDlbdWkzMkludGVyQ29kaW5nU2V0SW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVpMTZJbnRyYVRhYmxlID0gSW50cmFUYWJsZVBRSW5kZXhHVDhbdWkzMkludHJhQ29kaW5nU2V0SW5kZXhdOwogICAgICAgICAgICB1aTE2SW50ZXJUYWJsZSA9IEludGVyVGFibGVQUUluZGV4R1Q4W3VpMzJJbnRlckNvZGluZ1NldEluZGV4XTsKICAgICAgICB9CgogICAgICAgIHBzYl9fVkMxX2V4dHJhY3RfdGFibGVfaW5mbyhjdHgsICZjdHgtPnNUYWJsZUluZm9bdWkzMlRhYmxlTnVtXSwgdWkxNkludHJhVGFibGUpOwogICAgICAgIHVpMzJUYWJsZU51bSsrOwoKICAgICAgICBwc2JfX1ZDMV9leHRyYWN0X3RhYmxlX2luZm8oY3R4LCAmY3R4LT5zVGFibGVJbmZvW3VpMzJUYWJsZU51bV0sIHVpMTZJbnRlclRhYmxlKTsKICAgICAgICB1aTMyVGFibGVOdW0rKzsKICAgIH0KCiAgICAvKiEKICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQCBUYWJsZSBSICYgUyAgVkxDIFRSQU5TRENUQUIgVGFibGVzCgogICAgICAgICAgICAgICAgUiB2YzFERUNfWF9Nb3RfTHVtaW5hbmNlX0RDX0RpZmZfVkxDICAgICgyKQogICAgICAgICAgICAgICAgUyB2YzFERUNfWF9Nb3RfQ2hyb21hX0RDX0RpZmZfVkxDICAgICAgICgyKQoKICAgIFtWQzFdICAgICAgIDguMS4xLjIgSW50cmEgVHJhbnNmb3JtIERDIFRhYmxlCiAgICAgICAgICAgIFRSQU5TRENUQUIgaXMgYSBvbmUtYml0IHN5bnRheCBlbGVtZW50IHRoYXQgc2hhbGwgc3BlY2lmeSB3aGljaCBvZiB0d28KICAgICAgICAgICAgdGFibGVzIGlzIHVzZWQgdG8gZGVjb2RlIHRoZSBUcmFuc2Zvcm0gREMgY29lZmZpY2llbnRzIGluIGludHJhLWNvZGVkIGJsb2Nrcy4KICAgICAgICAgICAgSWYgVFJBTlNEQ1RBQiA9IDAsIHRoZW4gdGhlIGxvdyBtb3Rpb24gdGFibGUgb2YgU2VjdGlvbiAxMS43IHNoYWxsIGJlIHVzZWQuCiAgICAgICAgICAgIElmIFRSQU5TRENUQUIgPSAxLCB0aGVuIHRoZSBoaWdoIG1vdGlvbiB0YWJsZSBvZiBTZWN0aW9uIDExLjcgc2hhbGwgYmUgdXNlZC4KCiAgICBbVkMxXSAgICAgICA4LjEuMS4yIEludHJhIFRyYW5zZm9ybSBEQyBUYWJsZQogICAgICAgICAgICBUUkFOU0RDVEFCIGlzIGEgb25lLWJpdCBzeW50YXggZWxlbWVudCB0aGF0IHNoYWxsIHNwZWNpZnkgd2hpY2ggb2YgdHdvCiAgICAgICAgICAgIHRhYmxlcyBpcyB1c2VkIHRvIGRlY29kZSB0aGUgVHJhbnNmb3JtIERDIGNvZWZmaWNpZW50cyBpbiBpbnRyYS1jb2RlZCBibG9ja3MuCiAgICAgICAgICAgIElmIFRSQU5TRENUQUIgPSAwLCB0aGVuIHRoZSBsb3cgbW90aW9uIHRhYmxlIG9mIFNlY3Rpb24gMTEuNyBzaGFsbCBiZSB1c2VkLgogICAgICAgICAgICBJZiBUUkFOU0RDVEFCID0gMSwgdGhlbiB0aGUgaGlnaCBtb3Rpb24gdGFibGUgb2YgU2VjdGlvbiAxMS43IHNoYWxsIGJlIHVzZWQuCgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICBpZiAocGljX3BhcmFtcy0+dHJhbnNmb3JtX2ZpZWxkcy5iaXRzLmludHJhX3RyYW5zZm9ybV9kY190YWJsZSA9PSAwKSB7CiAgICAgICAgLyogbG93IG1vdGlvbiAqLwoKICAgICAgICAvKiBWQzFfVkxDX0xvd19Nb3RfTHVtaW5hbmNlX0RDX0RpZmZfVkxDICovCiAgICAgICAgdWkxNkludHJhVGFibGUgPSBWQzFfVkxDX0xvd19Nb3RfTHVtaW5hbmNlX0RDX0RpZmZfVkxDOwoKICAgICAgICAvKiBWQzFfVkxDX0xvd19Nb3RfQ2hyb21hX0RDX0RpZmZfVkxDICovCiAgICAgICAgdWkxNkludGVyVGFibGUgPSBWQzFfVkxDX0xvd19Nb3RfQ2hyb21hX0RDX0RpZmZfVkxDOwogICAgfSBlbHNlIHsgLyogVFJBTlNEQ1RBQiA9PSAxICovCiAgICAgICAgLyogaGlnaCBtb3Rpb24gKi8KICAgICAgICAvKiBWQzFfVkxDX0hpZ2hfTW90X0x1bWluYW5jZV9EQ19EaWZmX1ZMQyAqLwogICAgICAgIHVpMTZJbnRyYVRhYmxlID0gVkMxX1ZMQ19IaWdoX01vdF9MdW1pbmFuY2VfRENfRGlmZl9WTEM7CgogICAgICAgIC8qIFZDMV9WTENfSGlnaF9Nb3RfQ2hyb21hX0RDX0RpZmZfVkxDICovCiAgICAgICAgdWkxNkludGVyVGFibGUgPSBWQzFfVkxDX0hpZ2hfTW90X0Nocm9tYV9EQ19EaWZmX1ZMQzsKICAgIH0KCiAgICBwc2JfX1ZDMV9leHRyYWN0X3RhYmxlX2luZm8oY3R4LCAmY3R4LT5zVGFibGVJbmZvW3VpMzJUYWJsZU51bV0sIHVpMTZJbnRyYVRhYmxlKTsKICAgIHVpMzJUYWJsZU51bSsrOwoKICAgIHBzYl9fVkMxX2V4dHJhY3RfdGFibGVfaW5mbyhjdHgsICZjdHgtPnNUYWJsZUluZm9bdWkzMlRhYmxlTnVtXSwgdWkxNkludGVyVGFibGUpOwogICAgdWkzMlRhYmxlTnVtKys7CgogICAgLyogYXQgdGhlIGVuZCBkZXRlcm1pbmUgaG93IG1hbnkgdGFibGVzIGhhdmUgYmVlbiBjaG9zZW4KICAgICAgICB0aGlzIHNob3VsZCBiZSBjb25zdGFudCBhbmQgZXF1YWwgMTIgKi8KICAgIGN0eC0+dWkzMk51bVRhYmxlcyA9IHVpMzJUYWJsZU51bTsKICAgIEFTU0VSVChjdHgtPnVpMzJOdW1UYWJsZXMgPT0gMTIpOwp9CgpzdGF0aWMgdm9pZCBwc2JfX1ZDMV9idWlsZF9WTENfdGFibGVzKGNvbnRleHRfVkMxX3AgY3R4KQp7CiAgICBwc2JfY21kYnVmX3AgY21kYnVmID0gY3R4LT5vYmpfY29udGV4dC0+Y21kYnVmOwogICAgdW5zaWduZWQgaW50IGk7CiAgICB1aW50MTZfdCBSQU1fbG9jYXRpb24gPSAwOwogICAgdWludDMyX3QgcmVnX3ZhbHVlOwoKICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPnVpMzJOdW1UYWJsZXM7IGkrKykgewogICAgICAgIGlmIChSQU1fbG9jYXRpb24gJiAweDAzKSB7CiAgICAgICAgICAgIC8qIEFsaWduICovCiAgICAgICAgICAgIFJBTV9sb2NhdGlvbiArPSA0IC0gKFJBTV9sb2NhdGlvbiAmIDB4MDMpOwogICAgICAgIH0KICAgICAgICBjdHgtPnNUYWJsZUluZm9baV0uYXVpMTZSQU1Mb2NhdGlvbiA9IFJBTV9sb2NhdGlvbjsKCiAgICAgICAgLyogVkxDIFRhYmxlICovCiAgICAgICAgLyogV3JpdGUgYSBMTERNQSBDbWQgdG8gdHJhbnNmZXIgVkxEIFRhYmxlIGRhdGEgKi8KICAgICAgICBwc2JfY21kYnVmX2RtYV93cml0ZV9jbWRidWYoY21kYnVmLCAmY3R4LT52bGNfcGFja2VkX3RhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+c1RhYmxlSW5mb1tpXS5hdWkxNlN0YXJ0TG9jYXRpb24gKiBzaXplb2YoSU1HX1VJTlQxNiksIC8qIG9yaWdpbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+c1RhYmxlSW5mb1tpXS5hdWkxNlZMQ1RhYmxlTGVuZ3RoICogc2l6ZW9mKElNR19VSU5UMTYpLCAvKiBzaXplICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFNX2xvY2F0aW9uICogc2l6ZW9mKElNR19VSU5UMzIpLCAvKiBkZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9UWVBFX1ZMQ19UQUJMRSk7CiAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAidGFibGVbJTAyZF0gc3RhcnRfbG9jID0gJTA4eCBSQU1fbG9jYXRpb24gPSAlMDh4IHwgJTA4eFxuIiwgaSwgY3R4LT5zVGFibGVJbmZvW2ldLmF1aTE2U3RhcnRMb2NhdGlvbiAqIHNpemVvZihJTUdfVUlOVDE2KSwgUkFNX2xvY2F0aW9uLCBSQU1fbG9jYXRpb24gKiBzaXplb2YoSU1HX1VJTlQzMikpOwogICAgICAgIFJBTV9sb2NhdGlvbiArPSBjdHgtPnNUYWJsZUluZm9baV0uYXVpMTZWTENUYWJsZUxlbmd0aDsKICAgIH0KCiAgICAvKiBXcml0ZSB0aGUgdmVjIHJlZ2lzdGVycyB3aXRoIHRoZSBpbmRleCBkYXRhIGZvciBlYWNoIG9mIHRoZSB0YWJsZXMgKi8KICAgIHBzYl9jbWRidWZfcmVnX3N0YXJ0X2Jsb2NrKGNtZGJ1ZiwgMCk7CgogICAgcmVnX3ZhbHVlID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0FERFIwLCBWTENfVEFCTEVfQUREUjAsIGN0eC0+c1RhYmxlSW5mb1swXS5hdWkxNlJBTUxvY2F0aW9uKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0FERFIwLCBWTENfVEFCTEVfQUREUjEsIGN0eC0+c1RhYmxlSW5mb1sxXS5hdWkxNlJBTUxvY2F0aW9uKTsKICAgIHBzYl9jbWRidWZfcmVnX3NldChjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfQUREUjApLCByZWdfdmFsdWUpOwoKICAgIHJlZ192YWx1ZSA9IDA7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9BRERSMSwgVkxDX1RBQkxFX0FERFIyLCBjdHgtPnNUYWJsZUluZm9bMl0uYXVpMTZSQU1Mb2NhdGlvbik7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9BRERSMSwgVkxDX1RBQkxFX0FERFIzLCBjdHgtPnNUYWJsZUluZm9bM10uYXVpMTZSQU1Mb2NhdGlvbik7CiAgICBwc2JfY21kYnVmX3JlZ19zZXQoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0FERFIxKSwgcmVnX3ZhbHVlKTsKCiAgICByZWdfdmFsdWUgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfQUREUjIsIFZMQ19UQUJMRV9BRERSNCwgY3R4LT5zVGFibGVJbmZvWzRdLmF1aTE2UkFNTG9jYXRpb24pOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfQUREUjIsIFZMQ19UQUJMRV9BRERSNSwgY3R4LT5zVGFibGVJbmZvWzVdLmF1aTE2UkFNTG9jYXRpb24pOwogICAgcHNiX2NtZGJ1Zl9yZWdfc2V0KGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9BRERSMiksIHJlZ192YWx1ZSk7CgogICAgcmVnX3ZhbHVlID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0FERFIzLCBWTENfVEFCTEVfQUREUjYsIGN0eC0+c1RhYmxlSW5mb1s2XS5hdWkxNlJBTUxvY2F0aW9uKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0FERFIzLCBWTENfVEFCTEVfQUREUjcsIGN0eC0+c1RhYmxlSW5mb1s3XS5hdWkxNlJBTUxvY2F0aW9uKTsKICAgIHBzYl9jbWRidWZfcmVnX3NldChjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfQUREUjMpLCByZWdfdmFsdWUpOwoKICAgIHJlZ192YWx1ZSA9IDA7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9BRERSNCwgVkxDX1RBQkxFX0FERFI4LCBjdHgtPnNUYWJsZUluZm9bOF0uYXVpMTZSQU1Mb2NhdGlvbik7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9BRERSNCwgVkxDX1RBQkxFX0FERFI5LCBjdHgtPnNUYWJsZUluZm9bOV0uYXVpMTZSQU1Mb2NhdGlvbik7CiAgICBwc2JfY21kYnVmX3JlZ19zZXQoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0FERFI0KSwgcmVnX3ZhbHVlKTsKCiAgICByZWdfdmFsdWUgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfQUREUjUsIFZMQ19UQUJMRV9BRERSMTAsIGN0eC0+c1RhYmxlSW5mb1sxMF0uYXVpMTZSQU1Mb2NhdGlvbik7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9BRERSNSwgVkxDX1RBQkxFX0FERFIxMSwgY3R4LT5zVGFibGVJbmZvWzExXS5hdWkxNlJBTUxvY2F0aW9uKTsKICAgIHBzYl9jbWRidWZfcmVnX3NldChjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfQUREUjUpLCByZWdfdmFsdWUpOwoKICAgIHJlZ192YWx1ZSA9IDA7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9JTklUSUFMX1dJRFRIMCwgVkxDX1RBQkxFX0lOSVRJQUxfV0lEVEgwLCBjdHgtPnNUYWJsZUluZm9bMF0uYXVpMTZJbml0aWFsV2lkdGgpOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfSU5JVElBTF9XSURUSDAsIFZMQ19UQUJMRV9JTklUSUFMX1dJRFRIMSwgY3R4LT5zVGFibGVJbmZvWzFdLmF1aTE2SW5pdGlhbFdpZHRoKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0lOSVRJQUxfV0lEVEgwLCBWTENfVEFCTEVfSU5JVElBTF9XSURUSDIsIGN0eC0+c1RhYmxlSW5mb1syXS5hdWkxNkluaXRpYWxXaWR0aCk7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9JTklUSUFMX1dJRFRIMCwgVkxDX1RBQkxFX0lOSVRJQUxfV0lEVEgzLCBjdHgtPnNUYWJsZUluZm9bM10uYXVpMTZJbml0aWFsV2lkdGgpOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfSU5JVElBTF9XSURUSDAsIFZMQ19UQUJMRV9JTklUSUFMX1dJRFRINCwgY3R4LT5zVGFibGVJbmZvWzRdLmF1aTE2SW5pdGlhbFdpZHRoKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0lOSVRJQUxfV0lEVEgwLCBWTENfVEFCTEVfSU5JVElBTF9XSURUSDUsIGN0eC0+c1RhYmxlSW5mb1s1XS5hdWkxNkluaXRpYWxXaWR0aCk7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9JTklUSUFMX1dJRFRIMCwgVkxDX1RBQkxFX0lOSVRJQUxfV0lEVEg2LCBjdHgtPnNUYWJsZUluZm9bNl0uYXVpMTZJbml0aWFsV2lkdGgpOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfSU5JVElBTF9XSURUSDAsIFZMQ19UQUJMRV9JTklUSUFMX1dJRFRINywgY3R4LT5zVGFibGVJbmZvWzddLmF1aTE2SW5pdGlhbFdpZHRoKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0lOSVRJQUxfV0lEVEgwLCBWTENfVEFCTEVfSU5JVElBTF9XSURUSDgsIGN0eC0+c1RhYmxlSW5mb1s4XS5hdWkxNkluaXRpYWxXaWR0aCk7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9JTklUSUFMX1dJRFRIMCwgVkxDX1RBQkxFX0lOSVRJQUxfV0lEVEg5LCBjdHgtPnNUYWJsZUluZm9bOV0uYXVpMTZJbml0aWFsV2lkdGgpOwogICAgcHNiX2NtZGJ1Zl9yZWdfc2V0KGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9JTklUSUFMX1dJRFRIMCksIHJlZ192YWx1ZSk7CgogICAgcmVnX3ZhbHVlID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0lOSVRJQUxfV0lEVEgxLCBWTENfVEFCTEVfSU5JVElBTF9XSURUSDEwLCBjdHgtPnNUYWJsZUluZm9bMTBdLmF1aTE2SW5pdGlhbFdpZHRoKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0lOSVRJQUxfV0lEVEgxLCBWTENfVEFCTEVfSU5JVElBTF9XSURUSDExLCBjdHgtPnNUYWJsZUluZm9bMTFdLmF1aTE2SW5pdGlhbFdpZHRoKTsKICAgIHBzYl9jbWRidWZfcmVnX3NldChjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfSU5JVElBTF9XSURUSDEpLCByZWdfdmFsdWUpOwoKICAgIHJlZ192YWx1ZSA9IDA7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9JTklUSUFMX09QQ09ERTAsIFZMQ19UQUJMRV9JTklUSUFMX09QQ09ERTAsIGN0eC0+c1RhYmxlSW5mb1swXS5hdWkxNkluaXRpYWxPcGNvZGUpOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfSU5JVElBTF9PUENPREUwLCBWTENfVEFCTEVfSU5JVElBTF9PUENPREUxLCBjdHgtPnNUYWJsZUluZm9bMV0uYXVpMTZJbml0aWFsT3Bjb2RlKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0lOSVRJQUxfT1BDT0RFMCwgVkxDX1RBQkxFX0lOSVRJQUxfT1BDT0RFMiwgY3R4LT5zVGFibGVJbmZvWzJdLmF1aTE2SW5pdGlhbE9wY29kZSk7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9JTklUSUFMX09QQ09ERTAsIFZMQ19UQUJMRV9JTklUSUFMX09QQ09ERTMsIGN0eC0+c1RhYmxlSW5mb1szXS5hdWkxNkluaXRpYWxPcGNvZGUpOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfSU5JVElBTF9PUENPREUwLCBWTENfVEFCTEVfSU5JVElBTF9PUENPREU0LCBjdHgtPnNUYWJsZUluZm9bNF0uYXVpMTZJbml0aWFsT3Bjb2RlKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0lOSVRJQUxfT1BDT0RFMCwgVkxDX1RBQkxFX0lOSVRJQUxfT1BDT0RFNSwgY3R4LT5zVGFibGVJbmZvWzVdLmF1aTE2SW5pdGlhbE9wY29kZSk7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9JTklUSUFMX09QQ09ERTAsIFZMQ19UQUJMRV9JTklUSUFMX09QQ09ERTYsIGN0eC0+c1RhYmxlSW5mb1s2XS5hdWkxNkluaXRpYWxPcGNvZGUpOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfSU5JVElBTF9PUENPREUwLCBWTENfVEFCTEVfSU5JVElBTF9PUENPREU3LCBjdHgtPnNUYWJsZUluZm9bN10uYXVpMTZJbml0aWFsT3Bjb2RlKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0lOSVRJQUxfT1BDT0RFMCwgVkxDX1RBQkxFX0lOSVRJQUxfT1BDT0RFOCwgY3R4LT5zVGFibGVJbmZvWzhdLmF1aTE2SW5pdGlhbE9wY29kZSk7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9JTklUSUFMX09QQ09ERTAsIFZMQ19UQUJMRV9JTklUSUFMX09QQ09ERTksIGN0eC0+c1RhYmxlSW5mb1s5XS5hdWkxNkluaXRpYWxPcGNvZGUpOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfSU5JVElBTF9PUENPREUwLCBWTENfVEFCTEVfSU5JVElBTF9PUENPREUxMCwgY3R4LT5zVGFibGVJbmZvWzEwXS5hdWkxNkluaXRpYWxPcGNvZGUpOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfSU5JVElBTF9PUENPREUwLCBWTENfVEFCTEVfSU5JVElBTF9PUENPREUxMSwgY3R4LT5zVGFibGVJbmZvWzExXS5hdWkxNkluaXRpYWxPcGNvZGUpOwogICAgcHNiX2NtZGJ1Zl9yZWdfc2V0KGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQywgQ1JfVkVDX1ZMQ19UQUJMRV9JTklUSUFMX09QQ09ERTApLCByZWdfdmFsdWUpOwoKICAgIHBzYl9jbWRidWZfcmVnX2VuZF9ibG9jayhjbWRidWYpOwp9CgpzdGF0aWMgdm9pZCBwc2JfX1ZDMV9zZW5kX3JlbmRlY19wYXJhbXMoY29udGV4dF9WQzFfcCBjdHgsIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWQzEgKnNsaWNlX3BhcmFtKQp7CiAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWQzEgKnBpY19wYXJhbXMgPSBjdHgtPnBpY19wYXJhbXM7CiAgICBwc2JfY21kYnVmX3AgY21kYnVmID0gY3R4LT5vYmpfY29udGV4dC0+Y21kYnVmOwogICAgcHNiX3N1cmZhY2VfcCBkZWJsb2NrX3N1cmZhY2UgPSBjdHgtPmRlY29kZWRfc3VyZmFjZS0+cHNiX3N1cmZhY2U7CiAgICBwc2Jfc3VyZmFjZV9wIHRhcmdldF9zdXJmYWNlID0gY3R4LT5vYmpfY29udGV4dC0+Y3VycmVudF9yZW5kZXJfdGFyZ2V0LT5wc2Jfc3VyZmFjZTsKICAgIHVpbnQzMl90IGNtZDsKICAgIElNR19VSU5UMzIgICAgdWkzMk1CUGFyYW1NZW1PZmZzZXQ7CiAgICBJTUdfVUlOVDggICAgIHVpOFByZXZMdW1hU2NhbGUgPSAwLCB1aThQcmV2THVtYVNoaWZ0ID0gMDsKICAgIElNR19VSU5UOCAgICAgdWk4QmFja0x1bWFTY2FsZSA9IDAsIHVpOEJhY2tMdW1hU2hpZnQgPSAwOwogICAgSU1HX1VJTlQ4ICAgICB1aThQcmV2Qm90THVtYVNoaWZ0ID0gMCwgdWk4UHJldkJvdEx1bWFTY2FsZSA9IDA7CiAgICBJTUdfVUlOVDggICAgIHVpOFByZXZJQyA9IDAsIHVpOEJhY2tJQyA9IDAsIHVpOFByZXZCb3RJQyA9IDA7CgogICAgLyogQWxpZ24gTUIgUGFyYW1ldGVyIG1lbW9yeSAqLwogICAgdWkzMk1CUGFyYW1NZW1PZmZzZXQgID0gKChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlID09IFZDMV9GQ01fRkxESSkgJiYgKCFwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmlzX2ZpcnN0X2ZpZWxkKSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN0eC0+c2l6ZV9tYiAqIFZDMV9NQl9QQVJBTV9TVFJJREUpIDogMDsKICAgIHVpMzJNQlBhcmFtTWVtT2Zmc2V0ICs9IDB4MDAwMDBmZmY7CiAgICB1aTMyTUJQYXJhbU1lbU9mZnNldCAmPSAweGZmZmZmMDAwOwoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5URU5TSVRZIENPTVBFTlNBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICBpZiAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSA9PSBWQzFfRkNNX0ZMREkpIHsKICAgICAgICBpZiAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUgPT0gV01GX1BUWVBFX1ApIHsKICAgICAgICAgICAgaWYgKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMudG9wX2ZpZWxkX2ZpcnN0KSB7IC8vIHRvcCBmaWVsZCBmaXJzdAogICAgICAgICAgICAgICAgaWYgKCFwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmlzX2ZpcnN0X2ZpZWxkKSB7IC8vIHRoaXMgaXMgdGhlIHNlY29uZCBmaWVsZCBwaWN0dXJlIChhbmQgYm90dG9tKQogICAgICAgICAgICAgICAgICAgIGlmIChjdHgtPnNJQ3BhcmFtc1swXVsxXS51aThJQzEgPT0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZmlyc3QgYW5kIHRvcCBmaWVsZCBwaWN0dXJlIG9mIHRoZSBjdXJyZW50IGZyYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVuc2l0eSBjb21wZW5zYXRlcyB0aGUgYm90dG9tIGZpZWxkIG9mIHRoZSBwcmV2aW91cyBmcmFtZS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgdWk4UHJldkx1bWFTY2FsZSA9IGN0eC0+c0lDcGFyYW1zWzBdWzFdLnVpOEx1bWFTY2FsZTE7CiAgICAgICAgICAgICAgICAgICAgICAgIHVpOFByZXZMdW1hU2hpZnQgPSBjdHgtPnNJQ3BhcmFtc1swXVsxXS51aThMdW1hU2hpZnQxOwogICAgICAgICAgICAgICAgICAgICAgICB1aThQcmV2SUMgPSAyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGZpcnN0IGZpZWxkIHBpY3R1cmUgKGFuZCB0b3ApCiAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC0+c0lDcGFyYW1zWzBdWzBdLnVpOElDMSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBzZWNvbmQgYW5kIGJvdHRvbSBmaWVsZCBwaWN0dXJlIG9mIHRoZSBwcmV2aW91cyBmcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnNpdHkgY29tcGVuc2F0ZXMgdGhlIHRvcCBmaWVsZCBvZiB0aGUgcHJldmlvdXMgZnJhbWUuICovCiAgICAgICAgICAgICAgICAgICAgICAgIHVpOFByZXZMdW1hU2NhbGUgPSBjdHgtPnNJQ3BhcmFtc1swXVswXS51aThMdW1hU2NhbGUxOwogICAgICAgICAgICAgICAgICAgICAgICB1aThQcmV2THVtYVNoaWZ0ID0gY3R4LT5zSUNwYXJhbXNbMF1bMF0udWk4THVtYVNoaWZ0MTsKICAgICAgICAgICAgICAgICAgICAgICAgdWk4UHJldklDID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7IC8vIGJvdG9tIGZpZWxkIGZpcnN0CiAgICAgICAgICAgICAgICBpZiAoIXBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuaXNfZmlyc3RfZmllbGQpIHsgLy8gdGhpcyBpcyB0aGUgc2Vjb25kIGZpZWxkIHBpY3R1cmUgKGFuZCB0b3ApCiAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC0+c0lDcGFyYW1zWzBdWzBdLnVpOElDMSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmaXJzdCBhbmQgYm90dG9tIGZpZWxkIHBpY3R1cmUgb2YgdGhlIGN1cnJlbnQgZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW5zaXR5IGNvbXBlbnNhdGVzIHRoZSB0b3AgZmllbGQgb2YgdGhlIHByZXZpb3VzIGZyYW1lLiAqLwogICAgICAgICAgICAgICAgICAgICAgICB1aThQcmV2THVtYVNjYWxlID0gY3R4LT5zSUNwYXJhbXNbMF1bMF0udWk4THVtYVNjYWxlMTsKICAgICAgICAgICAgICAgICAgICAgICAgdWk4UHJldkx1bWFTaGlmdCA9IGN0eC0+c0lDcGFyYW1zWzBdWzBdLnVpOEx1bWFTaGlmdDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHVpOFByZXZJQyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZmlyc3QgZmllbGQgcGljdHVyZSAoYW5kIGJvdHRvbSkKICAgICAgICAgICAgICAgICAgICBpZiAoY3R4LT5zSUNwYXJhbXNbMF1bMV0udWk4SUMxID09IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHNlY29uZCBhbmQgdG9wIGZpZWxkIHBpY3R1cmUgb2YgdGhlIHByZXZpb3VzIGZyYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVuc2l0eSBjb21wZW5zYXRlcyB0aGUgYm90dG9tIGZpZWxkIG9mIHRoZSBwcmV2aW91cyBmcmFtZS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgdWk4UHJldkx1bWFTY2FsZSA9IGN0eC0+c0lDcGFyYW1zWzBdWzFdLnVpOEx1bWFTY2FsZTE7CiAgICAgICAgICAgICAgICAgICAgICAgIHVpOFByZXZMdW1hU2hpZnQgPSBjdHgtPnNJQ3BhcmFtc1swXVsxXS51aThMdW1hU2hpZnQxOwogICAgICAgICAgICAgICAgICAgICAgICB1aThQcmV2SUMgPSAyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUgPT0gV01GX1BUWVBFX0IpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIEZpcnN0IGZyYW1lIC0gc2Vjb25kIHRlbXBvcmFsbHkgY2xvc2VzdCByZWZlcmVuY2UgZnJhbWUgdG8gdGhlIEIgZnJhbWUKICAgICAgICAgICAgICAgIFNlY29uZCBmcmFtZSAtIGZpcnN0IHRlbXBvcmFsbHkgY2xvc2VzdCByZWZlcmVuY2UgZnJhbWUgdG8gdGhlIEIgZnJhbWUKICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMudG9wX2ZpZWxkX2ZpcnN0KSB7IC8vIHRvcCBmaWVsZCBmaXJzdAogICAgICAgICAgICAgICAgaWYgKGN0eC0+c0lDcGFyYW1zWzBdWzBdLnVpOElDMSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgLyogVGhlIHNlY29uZCBhbmQgYm90dG9tIGZpZWxkIG9mIHRoZSBmaXJzdCByZWZlcmVuY2UgZnJhbWUgaW50ZW5zaXR5CiAgICAgICAgICAgICAgICAgICAgICAgY29tcGVuc2F0ZXMgdGhlIGZpcnN0IGFuZCB0b3AgZmllbGQgb2YgdGhlIGZpcnN0IHJlZmVyZW5jZSBmcmFtZS4gKi8KICAgICAgICAgICAgICAgICAgICB1aThQcmV2THVtYVNjYWxlID0gY3R4LT5zSUNwYXJhbXNbMF1bMF0udWk4THVtYVNjYWxlMTsKICAgICAgICAgICAgICAgICAgICB1aThQcmV2THVtYVNoaWZ0ID0gY3R4LT5zSUNwYXJhbXNbMF1bMF0udWk4THVtYVNoaWZ0MTsKICAgICAgICAgICAgICAgICAgICB1aThQcmV2SUMgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGN0eC0+c0lDcGFyYW1zWzBdWzBdLnVpOElDMiA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZpcnN0IGFuZCB0b3AgZmllbGQgb2YgdGhlIHNlY29uZCByZWZlcmVuY2UgZnJhbWUgaW50ZW5zaXR5CiAgICAgICAgICAgICAgICAgICAgICAgY29tcGVuc2F0ZXMgdGhlIGZpcnN0IGFuZCB0b3AgZmllbGQgb2YgdGhlIGZpcnN0IHJlZmVyZW5jZSBmcmFtZS4gKi8KICAgICAgICAgICAgICAgICAgICB1aThCYWNrTHVtYVNjYWxlID0gY3R4LT5zSUNwYXJhbXNbMF1bMF0udWk4THVtYVNjYWxlMjsKICAgICAgICAgICAgICAgICAgICB1aThCYWNrTHVtYVNoaWZ0ID0gY3R4LT5zSUNwYXJhbXNbMF1bMF0udWk4THVtYVNoaWZ0MjsKICAgICAgICAgICAgICAgICAgICB1aThCYWNrSUMgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGN0eC0+c0lDcGFyYW1zWzBdWzFdLnVpOElDMiA9PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZpcnN0IGFuZCB0b3AgZmllbGQgb2YgdGhlIHNlY29uZCByZWZlcmVuY2UgZnJhbWUgaW50ZW5zaXR5CiAgICAgICAgICAgICAgICAgICAgICAgY29tcGVuc2F0ZXMgdGhlIHNlY29uZCBhbmQgYm90dG9tIGZpZWxkIG9mIHRoZSBmaXJzdCByZWZlcmVuY2UgZnJhbWUuICovCiAgICAgICAgICAgICAgICAgICAgdWk4UHJldkJvdEx1bWFTY2FsZSA9IGN0eC0+c0lDcGFyYW1zWzBdWzFdLnVpOEx1bWFTY2FsZTI7CiAgICAgICAgICAgICAgICAgICAgdWk4UHJldkJvdEx1bWFTaGlmdCA9IGN0eC0+c0lDcGFyYW1zWzBdWzFdLnVpOEx1bWFTaGlmdDI7CiAgICAgICAgICAgICAgICAgICAgdWk4UHJldkJvdElDID0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsgLy8gYm90b20gZmllbGQgZmlyc3QKICAgICAgICAgICAgICAgIGlmIChjdHgtPnNJQ3BhcmFtc1swXVsxXS51aThJQzEgPT0gMikgewogICAgICAgICAgICAgICAgICAgIC8qIFRoZSBzZWNvbmQgYW5kIHRvcCBmaWVsZCBvZiB0aGUgZmlyc3QgcmVmZXJlbmNlIGZyYW1lIGludGVuc2l0eQogICAgICAgICAgICAgICAgICAgICAgIGNvbXBlbnNhdGVzIHRoZSBmaXJzdCBhbmQgYm90dG9tIGZpZWxkIG9mIHRoZSBmaXJzdCByZWZlcmVuY2UgZnJhbWUuICovCiAgICAgICAgICAgICAgICAgICAgdWk4QmFja0x1bWFTY2FsZSA9IGN0eC0+c0lDcGFyYW1zWzBdWzFdLnVpOEx1bWFTY2FsZTE7CiAgICAgICAgICAgICAgICAgICAgdWk4QmFja0x1bWFTaGlmdCA9IGN0eC0+c0lDcGFyYW1zWzBdWzFdLnVpOEx1bWFTaGlmdDE7CiAgICAgICAgICAgICAgICAgICAgdWk4QmFja0lDID0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjdHgtPnNJQ3BhcmFtc1swXVsxXS51aThJQzIgPT0gMikgewogICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmaXJzdCBhbmQgYm90dG9tIGZpZWxkIG9mIHRoZSBzZWNvbmQgcmVmZXJlbmNlIGZyYW1lIGludGVuc2l0eQogICAgICAgICAgICAgICAgICAgICAgIGNvbXBlbnNhdGVzIHRoZSBmaXJzdCBhbmQgYm90dG9tIGZpZWxkIG9mIHRoZSBmaXJzdCByZWZlcmVuY2UgZnJhbWUuICovCiAgICAgICAgICAgICAgICAgICAgdWk4UHJldkJvdEx1bWFTY2FsZSA9IGN0eC0+c0lDcGFyYW1zWzBdWzFdLnVpOEx1bWFTY2FsZTI7CiAgICAgICAgICAgICAgICAgICAgdWk4UHJldkJvdEx1bWFTaGlmdCA9IGN0eC0+c0lDcGFyYW1zWzBdWzFdLnVpOEx1bWFTaGlmdDI7CiAgICAgICAgICAgICAgICAgICAgdWk4UHJldkJvdElDID0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjdHgtPnNJQ3BhcmFtc1swXVswXS51aThJQzEgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmaXJzdCBhbmQgYm90dG9tIGZpZWxkIG9mIHRoZSBzZWNvbmQgcmVmZXJlbmNlIGZyYW1lIGludGVuc2l0eQogICAgICAgICAgICAgICAgICAgICAgIGNvbXBlbnNhdGVzIHRoZSBzZWNvbmQgYW5kIHRvcCBmaWVsZCBvZiB0aGUgZmlyc3QgcmVmZXJlbmNlIGZyYW1lLiAqLwogICAgICAgICAgICAgICAgICAgIHVpOFByZXZMdW1hU2NhbGUgPSBjdHgtPnNJQ3BhcmFtc1swXVswXS51aThMdW1hU2NhbGUxOwogICAgICAgICAgICAgICAgICAgIHVpOFByZXZMdW1hU2hpZnQgPSBjdHgtPnNJQ3BhcmFtc1swXVswXS51aThMdW1hU2hpZnQxOwogICAgICAgICAgICAgICAgICAgIHVpOFByZXZJQyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgIC8qIENIVU5LOiAxIC0gVkMxU0VRVUVOQ0UwMCAqLwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfc3RhcnQoY21kYnVmLCBSRU5ERUNfUkVHSVNURVJfT0ZGU0VUKE1TVkRYX0NNRFMsIERJU1BMQVlfUElDVFVSRV9TSVpFKSk7CiAgICAqY21kYnVmLT5yZW5kZWNfY2h1bmtfc3RhcnQgfD0gQ01EX1JFTkRFQ19CTE9DS19GTEFHX1ZDMV9DTURfUEFUQ0g7CgogICAgLyogVkMxU0VRVUVOQ0UwMCAgICBDb21tYW5kOiBEaXNwbGF5IFBpY3R1cmUgU2l6ZSAoc2VxdWVuY2UpICovCiAgICBjbWQgPSAwOwogICAgLyogVE9ETzogQ2FuICJkaXNwbGF5IHNpemUiIGFuZCAiY29kZWQgc2l6ZSIgYmUgZGlmZmVyZW50PyAqLwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBWQzFfUkVOREVDX0NNRCwgVkMxU0VRVUVOQ0UwMCwgUElDVFVSRV9IRUlHSFQsIChjdHgtPmRpc3BsYXlfcGljdHVyZV9oZWlnaHQgLSAxKSk7IC8qIGRpc3BsYXkgcGljdHVyZSBzaXplIC0gMSAqLwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBWQzFfUkVOREVDX0NNRCwgVkMxU0VRVUVOQ0UwMCwgUElDVFVSRV9XSURUSCwgKGN0eC0+ZGlzcGxheV9waWN0dXJlX3dpZHRoIC0gMSkpOwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCBjbWQpOwoKICAgIC8qIFZDMVNFUVVFTkNFMDAgICAgQ29tbWFuZDogQ29kZWQgUGljdHVyZSBTaXplICAoc2VxdWVuY2UpICovCiAgICBjbWQgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBWQzFfUkVOREVDX0NNRCwgVkMxU0VRVUVOQ0UwMCwgUElDVFVSRV9IRUlHSFQsIChjdHgtPmNvZGVkX3BpY3R1cmVfaGVpZ2h0IC0gMSkpOyAvKiBjb2RlZCBwaWN0dXJlIHNpemUgLSAxICovCiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIFZDMV9SRU5ERUNfQ01ELCBWQzFTRVFVRU5DRTAwLCBQSUNUVVJFX1dJRFRILCAoY3R4LT5jb2RlZF9waWN0dXJlX3dpZHRoIC0gMSkpOwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCBjbWQpOwoKICAgIC8qIFZDMVNFUVVFTkNFMDEgICAgQ29tbWFuZDogT3BlcmF0aW5nIE1vZGUgKHNlcXVlbmNlKSAqLwogICAgY21kID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNFUVVFTkNFMDEsIENIUk9NQV9JTlRFUkxFQVZFRCwgICAwKTsgLyogMCA9IENiQ3IgLSBNU1ZEWCBkZWZhdWx0ICovCiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIFZDMV9SRU5ERUNfQ01ELCBWQzFTRVFVRU5DRTAxLCBST1dfU1RSSURFLCAgICAgICAgICAgdGFyZ2V0X3N1cmZhY2UtPnN0cmlkZV9tb2RlKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNFUVVFTkNFMDEsIENPREVDX01PREUsICAgICAgICAgICAyKTsgLyogTU9ERV9WQzEgKi8KICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNFUVVFTkNFMDEsIENPREVDX1BST0ZJTEUsICAgICAgICBjdHgtPnByb2ZpbGUpOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBWQzFfUkVOREVDX0NNRCwgVkMxU0VRVUVOQ0UwMSwgQVNZTkNfTU9ERSwgICAgICAgICAgIDAvKigocFBpY1BhcmFtcy0+YlBpY0RlYmxvY2tlZCAmIDB4MDIpID8gMDoxKSovKTsgLy8gQFRPRE86IGFzeW5jIG1vZGUgc2hvdWxkIGJlIHN5bmNocm9ub3VzIG9yIHByZS1sb2FkIGZvciBWQzEKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNFUVVFTkNFMDEsIENIUk9NQV9GT1JNQVQsICAgICAgICAxKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNFUVVFTkNFMDEsIElOVEVSTEFDRUQsICgocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSAmIDB4MDIpID4+IDEpKTsgICAgICAgICAgIC8qIGlmIHByb2dyZXNzaXZlLCBJTlRFUkxBQ0UgaXMgYWx3YXlzIDAgKi8KICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNFUVVFTkNFMDEsIFZDMV9PVkVSTEFQLCAgICAgICAgICBwaWNfcGFyYW1zLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5vdmVybGFwKTsKI2lmbmRlZiBWQzFfSGVhZGVyX1BhcnNlcl9IVwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNFUVVFTkNFMDEsIFBJQ19DT05ET1ZFUiwgICAgICAgICBjdHgtPmNvbmRvdmVyKTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIFZDMV9SRU5ERUNfQ01ELCBWQzFTRVFVRU5DRTAxLCBQSUNfUVVBTlQsICAgICAgICAgICAgcGljX3BhcmFtcy0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5waWNfcXVhbnRpemVyX3NjYWxlKTsKI2VuZGlmCiAgICBjdHgtPm9ial9jb250ZXh0LT5vcGVyYXRpbmdfbW9kZSA9IGNtZDsKICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY21kKTsKCiAgICAvKiBMVU1BX1JFQ09OU1RSVUNURURfUElDVFVSRV9CQVNFX0FERFJFU1NFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZV9hZGRyZXNzKGNtZGJ1ZiwgJnRhcmdldF9zdXJmYWNlLT5idWYsIHRhcmdldF9zdXJmYWNlLT5idWYuYnVmZmVyX29mcyk7CgogICAgLyogQ0hST01BX1JFQ09OU1RSVUNURURfUElDVFVSRV9CQVNFX0FERFJFU1NFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGVfYWRkcmVzcyhjbWRidWYsICZ0YXJnZXRfc3VyZmFjZS0+YnVmLCB0YXJnZXRfc3VyZmFjZS0+YnVmLmJ1ZmZlcl9vZnMgKyB0YXJnZXRfc3VyZmFjZS0+Y2hyb21hX29mZnNldCk7CgogICAgLyogQXV4IE1TQiBidWZmZXIgKi8KICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlX2FkZHJlc3MoY21kYnVmLCAmY3R4LT5hdXhfbXNiX2J1ZmZlciwgMCk7CgogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfZW5kKGNtZGJ1Zik7CgogICAgLyogQ0hVTks6IDIgLSBWQzFTTElDRTAwICovCiAgICBwc2JfY21kYnVmX3JlbmRlY19zdGFydChjbWRidWYsIFJFTkRFQ19SRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgTUNfQ0FDSEVfQ09ORklHVVJBVElPTikpOwoKICAgIC8qIFZDMVNMSUNFMDAgICAgICAgICAgIENvbW1hbmQ6IENhY2hlIENvbmZpZ3VyYXRpb24gKHBpY3R1cmU/KSAqLwogICAgY21kID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNMSUNFMDAsIENPTkZJR19SRUZfT0ZGU0VULCAgNzIpOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBWQzFfUkVOREVDX0NNRCwgVkMxU0xJQ0UwMCwgQ09ORklHX1JPV19PRkZTRVQsICA0KTsKICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY21kKTsKCiAgICAvKiBWQzFTTElDRTAxICAgICAgICAgICBDb21tYW5kOiBWQzEgSW50ZW5zaXR5IENvbXBlbnNhdGlvbiBQYXJhbWV0ZXIgKHBpY3R1cmUgb3Igc2xpY2UpICovCiAgICBjbWQgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBWQzFfUkVOREVDX0NNRCwgVkMxU0xJQ0UwMSwgVkMxX0xVTVNISUZUMiwgIGN0eC0+dWk4Q3Vyckx1bWFTaGlmdDIpOyAvKiBJTlRFUkxBQ0UgZmllbGQgUCBwaWN0dXJlcyAqLwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBWQzFfUkVOREVDX0NNRCwgVkMxU0xJQ0UwMSwgVkMxX0xVTVNDQUxFMiwgIGN0eC0+dWk4Q3Vyckx1bWFTY2FsZTIpOyAvKiBJTlRFUkxBQ0UgZmllbGQgUCBwaWN0dXJlcyAqLwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBWQzFfUkVOREVDX0NNRCwgVkMxU0xJQ0UwMSwgVkMxX0xVTVNISUZUMSwgIGN0eC0+dWk4Q3Vyckx1bWFTaGlmdDEpOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBWQzFfUkVOREVDX0NNRCwgVkMxU0xJQ0UwMSwgVkMxX0xVTVNDQUxFMSwgIGN0eC0+dWk4Q3Vyckx1bWFTY2FsZTEpOwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCBjbWQpOwoKICAgIHBzYl9jbWRidWZfcmVuZGVjX2VuZChjbWRidWYpOwoKICAgIHZsZF9kZWNfc2V0dXBfYWx0ZXJuYXRpdmVfZnJhbWUoY3R4LT5vYmpfY29udGV4dCk7CgogICAgaWYgKGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSA9PSBWQzFfRkNNX1AgJiYgQ09OVEVYVF9ST1RBVEUoY3R4LT5vYmpfY29udGV4dCkpCiAgICAgICAgZGVibG9ja19zdXJmYWNlID0gY3R4LT5vYmpfY29udGV4dC0+Y3VycmVudF9yZW5kZXJfdGFyZ2V0LT5vdXRfbG9vcF9zdXJmYWNlOwoKICAgIC8qIENIVU5LOiAzICovCiAgICBwc2JfY21kYnVmX3JlbmRlY19zdGFydChjbWRidWYsIFJFTkRFQ19SRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgVkMxX0xVTUFfUkFOR0VfTUFQUElOR19CQVNFX0FERFJFU1MpKTsKCiAgICAvKiBWQzEgTHVtYSBSYW5nZSBNYXBwaW5nIEJhc2UgQWRkcmVzcyAqLwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGVfYWRkcmVzcyhjbWRidWYsICZkZWJsb2NrX3N1cmZhY2UtPmJ1ZiwgZGVibG9ja19zdXJmYWNlLT5idWYuYnVmZmVyX29mcyk7CgogICAgLyogVkMxIENocm9tYSBSYW5nZSBNYXBwaW5nIEJhc2UgQWRkcmVzcyAqLwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGVfYWRkcmVzcyhjbWRidWYsICZkZWJsb2NrX3N1cmZhY2UtPmJ1ZiwgZGVibG9ja19zdXJmYWNlLT5jaHJvbWFfb2Zmc2V0ICsgZGVibG9ja19zdXJmYWNlLT5idWYuYnVmZmVyX29mcyk7CgogICAgLyogVkMxU0xJQ0UwMyAgICAgICBSYW5nZSBNYXAgQ29udHJvbCAoY3VycmVudCBwaWN0dXJlKSAqLwogICAgY21kID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNMSUNFMDMsIFJBTkdFX01BUFVWX0ZMQUcsICBwaWNfcGFyYW1zLT5yYW5nZV9tYXBwaW5nX2ZpZWxkcy5iaXRzLmNocm9tYV9mbGFnIC8qUkFOR0VfTUFQVVZfRkxBRyovKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNMSUNFMDMsIFJBTkdFX01BUFVWLCAgICAgICBwaWNfcGFyYW1zLT5yYW5nZV9tYXBwaW5nX2ZpZWxkcy5iaXRzLmNocm9tYSk7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIFZDMV9SRU5ERUNfQ01ELCBWQzFTTElDRTAzLCBSQU5HRV9NQVBZX0ZMQUcsICAgcGljX3BhcmFtcy0+cmFuZ2VfbWFwcGluZ19maWVsZHMuYml0cy5sdW1hX2ZsYWcgLypSQU5HRV9NQVBZX0ZMQUcqLyk7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIFZDMV9SRU5ERUNfQ01ELCBWQzFTTElDRTAzLCBSQU5HRV9NQVBZLCAgICAgICAgcGljX3BhcmFtcy0+cmFuZ2VfbWFwcGluZ19maWVsZHMuYml0cy5sdW1hKTsKICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY21kKTsKCiAgICAvKiBTdG9yZSBWQzFTTElDRTAzIGJpdHMgaW4gbG93ZXIgYml0cyBvZiBSYW5nZSBNYXBwaW5nIEJhc2UgQWRkcmVzcyAqLwogICAgLyogVkMxIEx1bWEgUmFuZ2UgTWFwcGluZyBCYXNlIEFkZHJlc3MgKi8KICAgIFJFTE9DKCpjdHgtPmRlY19jdHgucF9yYW5nZV9tYXBwaW5nX2Jhc2UwLCAvKmNtZCArICovZGVibG9ja19zdXJmYWNlLT5idWYuYnVmZmVyX29mcywgJmRlYmxvY2tfc3VyZmFjZS0+YnVmKTsKICAgIFJFTE9DKCpjdHgtPmRlY19jdHgucF9yYW5nZV9tYXBwaW5nX2Jhc2UxLCBkZWJsb2NrX3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzICsgZGVibG9ja19zdXJmYWNlLT5jaHJvbWFfb2Zmc2V0LCAmZGVibG9ja19zdXJmYWNlLT5idWYpOwoKICAgICpjdHgtPmRlY19jdHguY21kX3BhcmFtcyB8PSBjbWQ7CiAgICAvKiBWQzEgSW50ZW5zaXR5IENvbXBlbnNhdGlvbiBCYWNrd2FyZC9QcmV2aW91cyAgICAgKi8KICAgIC8qCiAgICAgICAgICAgIDMuMy4xMCBWQzEgSW50ZW5zaXR5IENvbXBlbnNhdGlvbiBCYWNrd2FyZC9QcmV2aW91czoKICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgYXBwbGllZCBpbiBWQzEgSW50ZW5zaXR5IENvbXBlbnNhdGlvbiBQYXJhbWV0ZXJzIGFyZSB0aGUgSW50ZW5zaXR5IENvbXBlbnNhdGlvbgogICAgICAgICAgICBhcHBsaWVkIHRvIGZvcndhcmQgcHJlZGljdGlvbi4gSW4gdGhlIGNhc2Ugb2YgSW50ZXJsYWNlZCBQIGZpZWxkIHBpY3R1cmVzLCB0aGUgc2Vjb25kIGZpZWxkIGNhbgogICAgICAgICAgICBiZSBJbnRlbnNpdHkgQ29tcGVuc2F0ZWQgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IFAgZmllbGQgcGljdHVyZS4gSWYgdGhpcyBpcyBkb25lLCB3aGVuIGRlY29kaW5nCiAgICAgICAgICAgIEIgcGljdHVyZXMgdGhlIGZpcnN0IGZpZWxkIGJhY2t3YXJkIE1WIHJlZmVyZW5jZSB0byBQIHBpY3R1cmUgbmVlZHMgdG8gYmUgSW50ZW5zaXR5IENvbXBlbnNhdGVkCiAgICAgICAgICAgIHdpdGggVkMxX0xVTVNDQUxFX0JBQ0sgYW5kIFZDMV9MVU1TSElGVF9CQUNLLiAoVGhlIGNvbW1hbmQgc2hvdWxkIGNvbnRhaW4gdGhlIEludGVuc2l0eQogICAgICAgICAgICBDb21wZW5zYXRpb24gcGFyYW1ldGVycyB0aGF0IHdlcmUgdXNlZCBmb3Igb3Bwb3NpdGUgcGFyaXR5IGZpZWxkIHdoZW4gZGVjb2RpbmcgMm5kIFAgZmllbGQgcGljdHVyZSkuCgogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyB3aWxsIG9ubHkgYmUgdXNlZCBpZiBWQzFfQkFDS19JTlRfQ09NUCBpbiBTbGljZSBQYXJhbXMgY29tbWFuZCBpbmRpY2F0ZXMKICAgICAgICAgICAgQmFja3dhcmQgSW50ZW5zaXR5IENvbXBlbnNhdGlvbiBpcyB1c2VkLgogICAgKi8KICAgIGNtZCA9IDA7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIFZDMV9SRU5ERUNfQ01ELCBWQzFTTElDRTA0LCBWQzFfTFVNU0hJRlRfUFJFViwgIHVpOFByZXZMdW1hU2hpZnQpOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBWQzFfUkVOREVDX0NNRCwgVkMxU0xJQ0UwNCwgVkMxX0xVTVNDQUxFX1BSRVYsICB1aThQcmV2THVtYVNjYWxlKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNMSUNFMDQsIFZDMV9MVU1TSElGVF9CQUNLLCAgdWk4QmFja0x1bWFTaGlmdCk7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIFZDMV9SRU5ERUNfQ01ELCBWQzFTTElDRTA0LCBWQzFfTFVNU0NBTEVfQkFDSywgIHVpOEJhY2tMdW1hU2NhbGUpOwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCBjbWQpOwoKI2lmIDAKICAgIC8qIFZDMSBJbnRlbnNpdHkgQ29tcGVuc2F0aW9uIFByZXZpb3VzIEJvdHRvbSAqLwogICAgaWYgKHVpOFByZXZCb3RJQykgewogICAgICAgIC8qCiAgICAgICAgICAgIFRoZSBWRE1DIGR5bmFtaWNhbGx5IGFwcGxpZXMgaW50ZW5zaXR5IGNvbXBlbnNhdGlvbiB3aGVuIGdlbmVyYXRpbmcgcmVmZXJlbmNlIHByZWRpY3RlZCBkYXRhCiAgICAgICAgICAgIGZvciBQL0IgZmllbGRzL2ZyYW1lcy4gSW4gdGhlIGNhc2Ugb2YgSW50ZXJsYWNlZCBCIGZpZWxkIHBpY3R1cmVzLCBib3RoIHRoZSB0b3AgZmllbGQgYW5kCiAgICAgICAgICAgIGJvdHRvbSBmaWVsZCBjb3VsZCBiZSBJbnRlbnNpdHkgQ29tcGVuc2F0ZWQgdHdpY2UgKGlmIGFsbCBwcmV2aW91cyBQIGZpZWxkIHBpY3R1cmVzIGFwcGxpZWQKICAgICAgICAgICAgc2VwYXJhdGUgdG9wIGFuZCBib3R0b20gSW50ZW5zaXR5IENvbXBlbnNhdGlvbikuIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZSBWQzEgcHJldmlvdXMgZmllbGQKICAgICAgICAgICAgZGVmaW5lZCBpbiAzLjMuMTAgc2hvdWxkIGFwcGx5IHRvIHRvcCBmaWVsZCwgd2hpbHN0IHRoZSBwYXJhbWV0ZXJzIGRlZmluZWQgaW4gdGhpcyByZWdpc3RlcgogICAgICAgICAgICBhcHBseSB0byB0aGUgYm90dG9tIGZpZWxkLiBUaGUgVkMxX1BSRVZfQk9UX0lOVF9DT01QIGZpZWxkIG9mIFNsaWNlIFBhcmFtcyBjb21tYW5kIGluZGljYXRlcwogICAgICAgICAgICBpZiB0aGUgZmllbGRzIGluIHRoaXMgcmVnaXN0ZXIgYXJlIHVzZWQuCiAgICAgICAgKi8KICAgICAgICBjbWQgPSAwOwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfQ01EUywgVkMxX0lOVEVOU0lUWV9DT01QRU5TQVRJT05fLCBWQzFfTFVNU0hJRlRfUFJFVl9CT1QsIHVpOFByZXZCb3RMdW1hU2hpZnQpOwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfQ01EUywgVkMxX0lOVEVOU0lUWV9DT01QRU5TQVRJT05fLCBWQzFfTFVNU0NBTEVfUFJFVl9CT1QsIHVpOFByZXZCb3RMdW1hU2NhbGUpOwogICAgICAgIHBjbWRCdWZmZXJbaSsrXSA9IFJFR0lTVEVSX09GRlNFVChNU1ZEWF9DTURTLCBWQzFfSU5URU5TSVRZX0NPTVBFTlNBVElPTl8pOwogICAgICAgIHBjbWRCdWZmZXJbaSsrXSA9IGNtZDsKICAgIH0KI2VuZGlmCiAgICBwc2JfY21kYnVmX3JlbmRlY19lbmQoY21kYnVmKTsKCiAgICAvKgogICAgICAgIFJlZmVyZW5jZSBQaWN0dXJlIEJhc2UgQWRkcmVzc2VzCgogICAgICAgIFRoZSByZWZlcmVuY2UgcGljdHVyZSBwb2ludGVycyBhbHdheXMgaW5jbHVkZSB0aGUgY3VycmVudCBwaWN0dXJlIGF0IGZpcnN0IGxvY2F0aW9uICgwKSBhbmQKICAgICAgICB0aGUgb2xkZXN0IHJlZmVyZW5jZSBpbiB0aGUgbmV4dCBsb2NhdGlvbiAoMSkuIEZvciBCIHBpY3R1cmVzIHRoZSBzdWJzZXF1ZW50IHJlZmVyZW5jZQogICAgICAgIGZyYW1lIChkaXNwbGF5IG9yZGVyKSBpcyAyLgogICAgKi8KICAgIGlmICgocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUgIT0gV01GX1BUWVBFX0kpICYmIChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnBpY3R1cmVfdHlwZSAhPSBXTUZfUFRZUEVfQkkpKSB7CiAgICAgICAgLyogQ0hVTks6IDQgKi8KICAgICAgICBwc2JfY21kYnVmX3JlbmRlY19zdGFydChjbWRidWYsIFJFTkRFQ19SRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgUkVGRVJFTkNFX1BJQ1RVUkVfQkFTRV9BRERSRVNTRVMpKTsKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKiogQ1VSUkVOVCBQSUNUVVJFICoqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGVfYWRkcmVzcyhjbWRidWYsICZ0YXJnZXRfc3VyZmFjZS0+YnVmLCB0YXJnZXRfc3VyZmFjZS0+YnVmLmJ1ZmZlcl9vZnMpOwogICAgICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlX2FkZHJlc3MoY21kYnVmLCAmdGFyZ2V0X3N1cmZhY2UtPmJ1ZiwgdGFyZ2V0X3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzICsgdGFyZ2V0X3N1cmZhY2UtPmNocm9tYV9vZmZzZXQpOwoKICAgICAgICAvKioqKioqKioqKioqKioqIEZPUldBUkQgUkVGRVJFTkNFICoqKioqKioqKioqKioqKioqLwogICAgICAgIGlmIChjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIEluIFZDMSwgaWYgYSBQIGZpZWxkIHBpY3R1cmUgcmVmZXJlbmNlcyBib3RoIHRvcCBmaWVsZCBhbmQgYm90dG9tIGZpZWxkLCBidXQgdGhlIHR3byBmaWVsZHMKICAgICAgICAgICAgICAgIGFyZSBzdG9yZWQgaW4gZGlmZmVyZW50IGZyYW1lIHN0b3JlcywgdGhlbiB0aGUgbW9zdCByZWNlbnRseSBkZWNvZGVkIGZpZWxkIHdpbGwgdXNlIHJlZmVyZW5jZQogICAgICAgICAgICAgICAgaW5kZXggMCwgYW5kIHRoZSBvdGhlciBmaWVsZCB3aWxsIHVzZSByZWZlcmVuY2UgaW5kZXggMS4KCiAgICAgICAgICAgICAgICBQcm9ncmVzc2l2ZSBQIHBpY3R1cmVzIHVzZSBhbHdheXMgcmVmZXJlbmNlIGluZGV4IDEuCiAgICAgICAgICAgICovCiAgICAgICAgICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlX2FkZHJlc3MoY21kYnVmLCAmY3R4LT5mb3J3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZS0+YnVmLCBjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UtPnBzYl9zdXJmYWNlLT5idWYuYnVmZmVyX29mcyk7CiAgICAgICAgICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlX2FkZHJlc3MoY21kYnVmLCAmY3R4LT5mb3J3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZS0+YnVmLCBjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UtPnBzYl9zdXJmYWNlLT5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmJ1ZmZlcl9vZnMgKyBjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UtPnBzYl9zdXJmYWNlLT5jaHJvbWFfb2Zmc2V0KTsKICAgICAgICAgICAgKGN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmJ1ZikudW5mZW5jZV9mbGFnID0gMTsKICAgICAgICB9CgogICAgICAgIC8qKioqKioqKioqKioqKiogQkFDS1dBUkQgUkVGRVJFTkNFICoqKioqKioqKioqKioqKioqLwogICAgICAgIGlmIChjdHgtPmJhY2t3YXJkX3JlZl9zdXJmYWNlKSB7CiAgICAgICAgICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlX2FkZHJlc3MoY21kYnVmLCAmY3R4LT5iYWNrd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmJ1ZiwgY3R4LT5iYWNrd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzKTsKICAgICAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGVfYWRkcmVzcyhjbWRidWYsICZjdHgtPmJhY2t3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZS0+YnVmLCBjdHgtPmJhY2t3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmJ1Zi5idWZmZXJfb2ZzICsgY3R4LT5iYWNrd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmNocm9tYV9vZmZzZXQpOwogICAgICAgICAgICAoY3R4LT5iYWNrd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmJ1ZikudW5mZW5jZV9mbGFnID0gMTsKICAgICAgICB9CgogICAgICAgIC8qKiogZml4ZWQgY3JjIGVycm9yIGZvciB2YzEgKioqLwogICAgICAgIHRhcmdldF9zdXJmYWNlLT5idWYudW5mZW5jZV9mbGFnID0gMDsKCiAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfZW5kKGNtZGJ1Zik7CiAgICB9CgogICAgLyogQ0hVTks6IDUgLSBWQzFTTElDRTAyICovCiAgICBwc2JfY21kYnVmX3JlbmRlY19zdGFydChjbWRidWYsIFJFTkRFQ19SRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgU0xJQ0VfUEFSQU1TKSk7CiAgICAqY21kYnVmLT5yZW5kZWNfY2h1bmtfc3RhcnQgfD0gQ01EX1JFTkRFQ19CTE9DS19GTEFHX1ZDMV9TUF9QQVRDSDsKCiAgICAvKiBWQzFTTElDRTAyICAgICAgICAgICBDb21tYW5kOiBTbGljZSBQYXJhbXMgKHBpY3R1cmUgb3Igc2xpY2UpICovCiAgICBjbWQgPSAwOwoKICAgIC8vUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9DTURTLCBTTElDRV9QQVJBTVMsIFZDMV9QUkVWX0JPVF9JTlRfQ09NUCwgIHVpOFByZXZCb3RJQyk7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIFZDMV9SRU5ERUNfQ01ELCBWQzFTTElDRTAyLCBWQzFfUFJFVl9JTlRfQ09NUCwgIHVpOFByZXZJQyk7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIFZDMV9SRU5ERUNfQ01ELCBWQzFTTElDRTAyLCBWQzFfQkFDS19JTlRfQ09NUCwgIHVpOEJhY2tJQyk7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIFZDMV9SRU5ERUNfQ01ELCBWQzFTTElDRTAyLCBSTkRfQ1RSTF9CSVQsICAgICAgIHBpY19wYXJhbXMtPnJvdW5kaW5nX2NvbnRyb2wpOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBWQzFfUkVOREVDX0NNRCwgVkMxU0xJQ0UwMiwgTU9ERV9DT05GSUcsICAgICAgICBjdHgtPm1vZGVfY29uZmlnKTsKI2lmbmRlZiBWQzFfSGVhZGVyX1BhcnNlcl9IVwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNMSUNFMDIsIFNVQlBFTF9GSUxURVJfTU9ERSwgKChjdHgtPm12X21vZGUgPT0gV01GX01WTU9ERV8xTVZfSEFMRl9QRUxfQklMSU5FQVIpICYmICEocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSA9PSBWQzFfRkNNX0ZSTUkpKSA/IDAgOiAxKTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIFZDMV9SRU5ERUNfQ01ELCBWQzFTTElDRTAyLCBTTElDRV9DT0RFX1RZUEUsIChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnBpY3R1cmVfdHlwZSA9PSBXTUZfUFRZUEVfQkkpID8gMCA6IChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnBpY3R1cmVfdHlwZSAmIDB4MykpOyAgICAvKiBCSSBpcyBzZW50IGFzIEkgKi8KI2VuZGlmCiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIFZDMV9SRU5ERUNfQ01ELCBWQzFTTElDRTAyLCBWQzFfRkFTVFVWTUMsICAgICAgIHBpY19wYXJhbXMtPmZhc3RfdXZtY19mbGFnKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNMSUNFMDIsIFZDMV9MT09QRklMVEVSLCAgICAgcGljX3BhcmFtcy0+ZW50cnlwb2ludF9maWVsZHMuYml0cy5sb29wZmlsdGVyKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgVkMxX1JFTkRFQ19DTUQsIFZDMVNMSUNFMDIsIFNMSUNFX0ZJRUxEX1RZUEUsICAgY3R4LT5zbGljZV9maWVsZF90eXBlKTsKICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY21kKTsKCiAgICBwc2JfY21kYnVmX3JlbmRlY19lbmQoY21kYnVmKTsKI2lmZGVmIFZDMV9IZWFkZXJfUGFyc2VyX0hXCiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBWQzFfUkVOREVDX0NNRCwgVkMxU0xJQ0UwMiwgU0xJQ0VfQ09ERV9UWVBFLCAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUgPT0gV01GX1BUWVBFX0JJKSA/IDAgOiAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUgJiAweDMpKTsKI2VuZGlmCgogICAgKmN0eC0+ZGVjX2N0eC5wX3NsaWNlX3BhcmFtcyA9IGNtZDsKCiAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJhY2stRW5kIFJlZ2lzdGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgICAvKiBDSFVOSzogNiAoQmFjay1lbmQgcmVnaXN0ZXJzKSAqLwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfc3RhcnQoY21kYnVmLCBSRU5ERUNfUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQywgVkMxX0NSX1ZFQ19WQzFfQkVfU1BTMCkpOwoKICAgIC8qIENSX1ZFQ19WQzFfQkVfU1BTMCAqLwogICAgY21kID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9CRV9TUFMwLCBWQzFfQkVfRVhURU5ERURfRE1WLCAgIHBpY19wYXJhbXMtPm12X2ZpZWxkcy5iaXRzLmV4dGVuZGVkX2Rtdl9mbGFnKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9CRV9TUFMwLCBWQzFfQkVfRVhURU5ERURfTVYsICAgIHBpY19wYXJhbXMtPm12X2ZpZWxkcy5iaXRzLmV4dGVuZGVkX212X2ZsYWcpOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1NQUzAsIFZDMV9CRV9GQVNUVVZNQywgICAgICAgcGljX3BhcmFtcy0+ZmFzdF91dm1jX2ZsYWcpOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1NQUzAsIFZDMV9CRV9JTlRFUkxBQ0UsICAgICAgcGljX3BhcmFtcy0+c2VxdWVuY2VfZmllbGRzLmJpdHMuaW50ZXJsYWNlKTsKICAgIC8vUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1NQUzAsIFZDMV9CRV9QUk9GSUxFLCAgICAgIGN0eC0+cHJvZmlsZSk7CiAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIGNtZCk7CgogICAgLyogQ1JfVkVDX1ZDMV9CRV9TUFMxICovCiAgICBjbWQgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1NQUzEsIFZDMV9CRV9QSUNfSEVJR0hUX0lOX01CU19MRVNTMSwgY3R4LT5waWN0dXJlX2hlaWdodF9tYiAtIDEpOwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCBjbWQpOwoKICAgIC8qIENSX1ZFQ19WQzFfQkVfU1BTMiAqLwogICAgY21kID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9CRV9TUFMyLCBWQzFfQkVfUElDX1dJRFRIX0lOX01CU19MRVNTMSwgY3R4LT5waWN0dXJlX3dpZHRoX21iIC0gMSk7CiAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIGNtZCk7CgogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfZW5kKGNtZGJ1Zik7CgogICAgLyogQ0hVTks6IDZiIChCYWNrLWVuZCByZWdpc3RlcnMpICovCiAgICBwc2JfY21kYnVmX3JlbmRlY19zdGFydChjbWRidWYsIFJFTkRFQ19SRUdJU1RFUl9PRkZTRVQoTVNWRFhfVkVDLCBWQzFfQ1JfVkVDX1ZDMV9CRV9QUFMyKSk7CiAgICAqY21kYnVmLT5yZW5kZWNfY2h1bmtfc3RhcnQgfD0gQ01EX1JFTkRFQ19CTE9DS19GTEFHX1ZDMV9CRV9QQVRDSDsKCiAgICAvKiBDUl9WRUNfVkMxX0JFX1BQUzIgKi8KICAgIGNtZCA9IDA7CiAgICAvL1JFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9CRV9QUFMyLCBWQzFfQkVfRkNNX1JFRjIsIGN0eC0+dWk4RkNNX1JlZjJQaWMpOwogICAgLy9SRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfUFBTMiwgVkMxX0JFX0ZDTV9SRUYxLCBjdHgtPnVpOEZDTV9SZWYxUGljKTsKICAgIC8vUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1BQUzIsIFZDMV9CRV9GQ01fUkVGMCwgY3R4LT51aThGQ01fUmVmMFBpYyk7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfUFBTMiwgVkMxX0JFX0ZDTV9SRUYyLCBjdHgtPmJhY2t3YXJkX3JlZl9mY20pOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1BQUzIsIFZDMV9CRV9GQ01fUkVGMSwgY3R4LT5mb3J3YXJkX3JlZl9mY20pOwogICAgLy9SRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfUFBTMiwgVkMxX0JFX0ZDTV9SRUYwLCBHRVRfU1VSRkFDRV9JTkZPX3BpY3R1cmVfY29kaW5nX3R5cGUoY3R4LT5kZWNvZGVkX3N1cmZhY2UtPnBzYl9zdXJmYWNlKSk7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfUFBTMiwgVkMxX0JFX0ZDTV9SRUYwLCBHRVRfU1VSRkFDRV9JTkZPX3BpY3R1cmVfY29kaW5nX3R5cGUoY3R4LT5vYmpfY29udGV4dC0+Y3VycmVudF9yZW5kZXJfdGFyZ2V0LT5wc2Jfc3VyZmFjZSkpOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1BQUzIsIFZDMV9CRV9DT0xMT0NBVEVEX1NLSVBQRUQsIDApOyAvLyBAVE9ETzogUmVhbGx5IG5lZWQgdGhpcz8KICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY21kKTsKCiAgICAvKiBDUl9WRUNfVkMxX0JFX1BQUzAgKi8KICAgIGNtZCA9IDA7CiNpZm5kZWYgVkMxX0hlYWRlcl9QYXJzZXJfSFcKICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfUFBTMCwgVkMxX0JFX0lRX09WRVJMQVAsICgocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUgPT0gV01GX1BUWVBFX0IpIHx8IChjdHgtPmNvbmRvdmVyID09IDApKSA/IDAgOiAxKTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfUFBTMCwgVkMxX0JFX1VOSUZPUk1fUVVBTlRJWkVSLCBwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLnBpY19xdWFudGl6ZXJfdHlwZSk7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1BQUzAsIFZDMV9CRV9IQUxGUVAsICAgICAgICAgICAgcGljX3BhcmFtcy0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5oYWxmX3FwKTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfUFBTMCwgVkMxX0JFX0JGUkFDVElPTiwgICAgICAgICBwaWNfcGFyYW1zLT5iX3BpY3R1cmVfZnJhY3Rpb24pOwojZW5kaWYKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9CRV9QUFMwLCBWQzFfQkVfVEZGX0ZXRCwgICAgICAgICAgIGN0eC0+YlRGRl9Gd1JlZkZybSk7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfUFBTMCwgVkMxX0JFX1RGRl9CV0QsICAgICAgICAgICBjdHgtPmJURkZfQndSZWZGcm0pOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1BQUzAsIFZDMV9CRV9URkYsICAgICAgICAgICAgICAgcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy50b3BfZmllbGRfZmlyc3QpOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1BQUzAsIFZDMV9CRV9TRUNPTkRfRklFTEQsICAgICAgIXBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuaXNfZmlyc3RfZmllbGQpOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1BQUzAsIFZDMV9CRV9GQ00sICAgICAgICAgICAgICAgcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSk7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfUFBTMCwgVkMxX0JFX1JORENUUkwsICAgICAgICAgICBwaWNfcGFyYW1zLT5yb3VuZGluZ19jb250cm9sKTsKICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY21kKTsKCiAgICAvKiBDUl9WRUNfVkMxX0JFX1BQUzEgKi8KICAgIGNtZCA9IDA7CiNpZm5kZWYgVkMxX0hlYWRlcl9QYXJzZXJfSFcKICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfUFBTMSwgVkMxX0JFX0VYVEVORF9ZLCAgICAgICBjdHgtPmV4dGVuZF95KTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfUFBTMSwgVkMxX0JFX0VYVEVORF9YLCAgICAgICBjdHgtPmV4dGVuZF94KTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfUFBTMSwgVkMxX0JFX1FVQU5USVpFUiwgKHBpY19wYXJhbXMtPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMucGljX3F1YW50aXplcl90eXBlID8gMHgwMyAvKiB1bmlmb3JtICovIDogMHgwMiAvKiBub24tdW5pZm9ybSAqLykpOwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9CRV9QUFMxLCBWQzFfQkVfUFFVQU5ULCAgICAgICAgIHBpY19wYXJhbXMtPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMucGljX3F1YW50aXplcl9zY2FsZSk7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1BQUzEsIFZDMV9CRV9NVk1PREUsICAgICAgICAgcGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMubXZfbW9kZSk7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX1BQUzEsIFZDMV9CRV9NVk1PREUyLCAgICAgICAgcGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMubXZfbW9kZTIpOwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9CRV9QUFMxLCBWQzFfQkVfUFRZUEUsICAgICAgICAgIHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlKTsKI2VuZGlmCiAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIGNtZCk7CgogICAgLyogQ1JfVkVDX1ZDMV9CRV9NVkQwICovCiAgICBjbWQgPSAwOwojaWZuZGVmIFZDMV9IZWFkZXJfUGFyc2VyX0hXCiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX01WRDAsIFZDMV9CRV9CUlBELCAgY3R4LT5pOEJja3dyZFJlZkZybURpc3QpOyAgICAgLyogMTAuNC42LjIgKi8KICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfTVZEMCwgVkMxX0JFX0ZSUEQsICBjdHgtPmk4RndyZFJlZkZybURpc3QpOwojZW5kaWYKICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY21kKTsKCiAgICAvKiBDUl9WRUNfVkMxX0JFX01WRDEgKi8KICAgIGNtZCA9IDA7CiNpZm5kZWYgVkMxX0hlYWRlcl9QYXJzZXJfSFcKICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfTVZEMSwgVkMxX0JFX1NDQUxFRkFDVE9SLCBjdHgtPnVpMzJTY2FsZUZhY3Rvcik7ICAvKiBmaWd1cmUgNjYgKi8KI2VuZGlmCiAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIGNtZCk7CgogICAgLyogQ1JfVkVDX1ZDMV9CRV9NVkQyICovCiAgICBjbWQgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX01WRDIsIFZDMV9CRV9QVUxMQkFDS19YLCBjdHgtPnB1bGxfYmFja194KTsKICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY21kKTsKCiAgICAvKiBDUl9WRUNfVkMxX0JFX01WRDMgKi8KICAgIGNtZCA9IDA7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfTVZEMywgVkMxX0JFX1BVTExCQUNLX1ksIGN0eC0+cHVsbF9iYWNrX3kpOwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCBjbWQpOwoKICAgIC8qIENSX1ZFQ19WQzFfQkVfTVZENCAqLwogICAgY21kID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9CRV9NVkQ0LCBWQzFfQkVfRklSU1RfTUJfSU5fU0xJQ0VfWSwgc2xpY2VfcGFyYW0tPnNsaWNlX3ZlcnRpY2FsX3Bvc2l0aW9uKTsKICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY21kKTsKCiAgICAvKiBDUl9WRUNfVkMxX0JFX01WRDUgKi8KICAgIGNtZCA9IDA7CiNpZm5kZWYgVkMxX0hlYWRlcl9QYXJzZXJfSFcKICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfTVZENSwgVkMxX0JFX1JFRkRJU1QsICAgICAgICAgICAgICAgcGljX3BhcmFtcy0+cmVmZXJlbmNlX2ZpZWxkcy5iaXRzLnJlZmVyZW5jZV9kaXN0YW5jZSk7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0JFX01WRDUsIFZDMV9CRV9OVU1SRUYsICAgICAgICAgICAgICAgIHBpY19wYXJhbXMtPnJlZmVyZW5jZV9maWVsZHMuYml0cy5udW1fcmVmZXJlbmNlX3BpY3R1cmVzKTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfTVZENSwgVkMxX0JFX1JFRkZJRUxELCAgICAgICAgICAgICAgcGljX3BhcmFtcy0+cmVmZXJlbmNlX2ZpZWxkcy5iaXRzLnJlZmVyZW5jZV9maWVsZF9waWNfaW5kaWNhdG9yKTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfTVZENSwgVkMxX0JFX01WUkFOR0UsICAgICAgICAgICAgICAgcGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMuZXh0ZW5kZWRfbXZfcmFuZ2UpOwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9CRV9NVkQ1LCBWQzFfQkVfSEFMRlBFTF9GTEFHLCAgY3R4LT5oYWxmX3BlbCk7CiNlbmRpZgogICAgLy9SRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfTVZENSwgVkMxX0JFX0ZSQU1FX0NPRElOR19NT0RFLCAgICAgICBwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9CRV9NVkQ1LCBWQzFfQkVfQk9UVE9NX0ZJRUxEX0ZMQUcsIGN0eC0+Ym90dG9tX2ZpZWxkKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9CRV9NVkQ1LCBWQzFfQkVfQURWQU5DRURfUFJPRklMRSwgKGN0eC0+cHJvZmlsZSA9PSBXTUZfUFJPRklMRV9BRFZBTkNFRCkgPyAxIDogMCk7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfQkVfTVZENSwgVkMxX0JFX1NDQU5fSU5ERVgsICAgICAgICBjdHgtPnNjYW5faW5kZXgpOwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCBjbWQpOwoKICAgIHBzYl9jbWRidWZfcmVuZGVjX2VuZChjbWRidWYpOwoKICAgIC8qIENIVU5LOiA2YyAoQmFjay1lbmQgcmVnaXN0ZXJzKSAqLwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfc3RhcnQoY21kYnVmLCBSRU5ERUNfUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQywgVkMxX0NSX1ZFQ19WQzFfQkVfUEFSQU1fQkFTRV9BRERSKSk7CgogICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAicG53X1ZDMTogcGljdHVyZV90eXBlID0gJWRcbiIsIHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlKTsKCiAgICBpZiAoUElDX1RZUEVfSVNfSU5UUkEocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUpIHx8IChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnBpY3R1cmVfdHlwZSA9PSBXTUZfUFRZUEVfUCkpIHsKICAgICAgICBwc2JfYnVmZmVyX3AgY29sb2NhdGVkX3RhcmdldF9idWZmZXIgPSB2bGRfZGVjX2xvb2t1cF9jb2xvY2F0ZWRfYnVmZmVyKCZjdHgtPmRlY19jdHgsIHRhcmdldF9zdXJmYWNlKTsKICAgICAgICBBU1NFUlQoY29sb2NhdGVkX3RhcmdldF9idWZmZXIpOwogICAgICAgIGlmIChjb2xvY2F0ZWRfdGFyZ2V0X2J1ZmZlcikgewogICAgICAgICAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZV9hZGRyZXNzKGNtZGJ1ZiwgY29sb2NhdGVkX3RhcmdldF9idWZmZXIsIHVpMzJNQlBhcmFtTWVtT2Zmc2V0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBUaGlzIGlzIGFuIGVycm9yICovCiAgICAgICAgICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgMCk7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnBpY3R1cmVfdHlwZSA9PSBXTUZfUFRZUEVfQikgewogICAgICAgIEFTU0VSVChjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UpOwogICAgICAgIHBzYl9idWZmZXJfcCBjb2xvY2F0ZWRfZm9yd2FyZF9yZWZfYnVmZmVyID0gY3R4LT5mb3J3YXJkX3JlZl9zdXJmYWNlID8gdmxkX2RlY19sb29rdXBfY29sb2NhdGVkX2J1ZmZlcigmY3R4LT5kZWNfY3R4LCBjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UtPnBzYl9zdXJmYWNlKSA6IDA7CiAgICAgICAgQVNTRVJUKGNvbG9jYXRlZF9mb3J3YXJkX3JlZl9idWZmZXIpOwogICAgICAgIGlmIChjb2xvY2F0ZWRfZm9yd2FyZF9yZWZfYnVmZmVyKSB7CiAgICAgICAgICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlX2FkZHJlc3MoY21kYnVmLCBjb2xvY2F0ZWRfZm9yd2FyZF9yZWZfYnVmZmVyLCB1aTMyTUJQYXJhbU1lbU9mZnNldCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogVGhpcyBpcyBhbiBlcnJvciAqLwogICAgICAgICAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIDApOwogICAgICAgIH0KICAgIH0KICAgIHBzYl9jbWRidWZfcmVuZGVjX2VuZChjbWRidWYpOwoKICAgIGlmICghUElDX1RZUEVfSVNfSU5UUkEocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUpKSB7CiAgICAgICAgLyogQ0hVTks6IDZkIChCYWNrLWVuZCByZWdpc3RlcnMpICovCiAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfc3RhcnQoY21kYnVmLCBSRU5ERUNfUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQywgVkMxX0NSX1ZFQ19WQzFfQkVfQ09MUEFSQU1fQkFTRV9BRERSKSk7CgogICAgICAgIGlmIChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnBpY3R1cmVfdHlwZSA9PSBXTUZfUFRZUEVfUCkgewogICAgICAgICAgICAvKiBDUl9WRUNfVkMxX0JFX0NPTFBBUkFNX0JBU0VfQUREUiAqLwogICAgICAgICAgICBBU1NFUlQoY3R4LT5mb3J3YXJkX3JlZl9zdXJmYWNlKTsKICAgICAgICAgICAgcHNiX2J1ZmZlcl9wIGNvbG9jYXRlZF9mb3J3YXJkX3JlZl9idWZmZXIgPSBjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UgPyB2bGRfZGVjX2xvb2t1cF9jb2xvY2F0ZWRfYnVmZmVyKCZjdHgtPmRlY19jdHgsIGN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UpIDogTlVMTDsKICAgICAgICAgICAgQVNTRVJUKGNvbG9jYXRlZF9mb3J3YXJkX3JlZl9idWZmZXIpOwogICAgICAgICAgICBpZiAoY29sb2NhdGVkX2ZvcndhcmRfcmVmX2J1ZmZlcikgewogICAgICAgICAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGVfYWRkcmVzcyhjbWRidWYsIGNvbG9jYXRlZF9mb3J3YXJkX3JlZl9idWZmZXIsIHVpMzJNQlBhcmFtTWVtT2Zmc2V0KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gZXJyb3IgKi8KICAgICAgICAgICAgICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlID09IFdNRl9QVFlQRV9CKSB7CiAgICAgICAgICAgIC8qIENSX1ZFQ19WQzFfQkVfQ09MUEFSQU1fQkFTRV9BRERSICovCiAgICAgICAgICAgIEFTU0VSVChjdHgtPmJhY2t3YXJkX3JlZl9zdXJmYWNlKTsKICAgICAgICAgICAgcHNiX2J1ZmZlcl9wIGNvbG9jYXRlZF9iYWNrd2FyZF9yZWZfYnVmZmVyOwoKICAgICAgICAgICAgaWYgKE5VTEwgPT0gY3R4LT5iYWNrd2FyZF9yZWZfc3VyZmFjZSkgewogICAgICAgICAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19FUlJPUiwgIiVzIEwlZCBJbnZhbGlkIGJhY2t3YXJkX3JlZl9zdXJmYWNlIGhhbmRsZVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbG9jYXRlZF9iYWNrd2FyZF9yZWZfYnVmZmVyID0gY3R4LT5iYWNrd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UgPyB2bGRfZGVjX2xvb2t1cF9jb2xvY2F0ZWRfYnVmZmVyKCZjdHgtPmRlY19jdHgsIGN0eC0+YmFja3dhcmRfcmVmX3N1cmZhY2UtPnBzYl9zdXJmYWNlKSA6IE5VTEw7CiAgICAgICAgICAgIEFTU0VSVChjb2xvY2F0ZWRfYmFja3dhcmRfcmVmX2J1ZmZlcik7CiAgICAgICAgICAgIGlmIChjb2xvY2F0ZWRfYmFja3dhcmRfcmVmX2J1ZmZlcikgewogICAgICAgICAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGVfYWRkcmVzcyhjbWRidWYsIGNvbG9jYXRlZF9iYWNrd2FyZF9yZWZfYnVmZmVyLCB1aTMyTUJQYXJhbU1lbU9mZnNldCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIGFuIGVycm9yICovCiAgICAgICAgICAgICAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIDApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwc2JfY21kYnVmX3JlbmRlY19lbmQoY21kYnVmKTsKICAgIH0KCiAgICAvKiBwc2JfY21kYnVmX3JlbmRlY19lbmRfYmxvY2soIGNtZGJ1ZiApOyAqLwp9CgoKc3RhdGljIHZvaWQgcHNiX19WQzFfbG9hZF9zZXF1ZW5jZV9yZWdpc3RlcnMoY29udGV4dF9WQzFfcCBjdHgpCnsKICAgIHBzYl9jbWRidWZfcCBjbWRidWYgPSBjdHgtPm9ial9jb250ZXh0LT5jbWRidWY7CiAgICB1aW50MzJfdCByZWdfdmFsdWU7CgogICAgcHNiX2NtZGJ1Zl9yZWdfc3RhcnRfYmxvY2soY21kYnVmLCAwKTsKCiAgICAvKiBGRV9DT05UUk9MICovCiAgICByZWdfdmFsdWUgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19FTlRERUNfRkVfQ09OVFJPTCwgRU5UREVDX0ZFX1BST0ZJTEUsIGN0eC0+cHJvZmlsZSk7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX0VOVERFQ19GRV9DT05UUk9MLCBFTlRERUNfRkVfTU9ERSwgMik7ICAvKiAyIC0gVkMxICovCiAgICBwc2JfY21kYnVmX3JlZ19zZXQoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfVkVDLCBDUl9WRUNfRU5UREVDX0ZFX0NPTlRST0wpLCByZWdfdmFsdWUpOwoKICAgIC8qIEZFX1NQUzAgKi8KICAgIHJlZ192YWx1ZSA9IDA7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfU1BTMCwgVkMxX0ZFX1NZTkNNQVJLRVIsIGN0eC0+cGljX3BhcmFtcy0+c2VxdWVuY2VfZmllbGRzLmJpdHMuc3luY21hcmtlcik7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfU1BTMCwgVkMxX0ZFX1ZTVFJBTlNGT1JNLCBjdHgtPnBpY19wYXJhbXMtPnRyYW5zZm9ybV9maWVsZHMuYml0cy52YXJpYWJsZV9zaXplZF90cmFuc2Zvcm1fZmxhZyk7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfU1BTMCwgVkMxX0ZFX0lOVEVSTEFDRSwgY3R4LT5waWNfcGFyYW1zLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5pbnRlcmxhY2UpOwogICAgcHNiX2NtZGJ1Zl9yZWdfc2V0KGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfU1BTMCksIHJlZ192YWx1ZSk7CgogICAgcHNiX2NtZGJ1Zl9yZWdfZW5kX2Jsb2NrKGNtZGJ1Zik7Cgp9CgpzdGF0aWMgdm9pZCBwc2JfX1ZDMV9sb2FkX3BpY3R1cmVfcmVnaXN0ZXJzKGNvbnRleHRfVkMxX3AgY3R4LCBWQVNsaWNlUGFyYW1ldGVyQnVmZmVyVkMxICpzbGljZV9wYXJhbSkKewogICAgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVkMxICpwaWNfcGFyYW1zID0gY3R4LT5waWNfcGFyYW1zOwogICAgcHNiX2NtZGJ1Zl9wIGNtZGJ1ZiA9IGN0eC0+b2JqX2NvbnRleHQtPmNtZGJ1ZjsKICAgIHVpbnQzMl90IHJlZ192YWx1ZTsKICAgIGludCBiRW5hYmxlTVZETGl0ZSA9IEZBTFNFOwoKICAgIHBzYl9jbWRidWZfcmVuZGVjX3N0YXJ0KGNtZGJ1ZiwgUkVHX01TVkRYX1ZFQ19PRkZTRVQgKyBNU1ZEWF9WRUNfQ1JfVkVDX0VOVERFQ19CRV9DT05UUk9MX09GRlNFVCk7CiAgICByZWdfdmFsdWUgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUMsIENSX1ZFQ19FTlRERUNfQkVfQ09OVFJPTCwgRU5UREVDX0JFX1BST0ZJTEUsIGN0eC0+cHJvZmlsZSk7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQywgQ1JfVkVDX0VOVERFQ19CRV9DT05UUk9MLCBFTlRERUNfQkVfTU9ERSwgMik7ICAvKiAyIC0gVkMxICovCiAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIHJlZ192YWx1ZSk7CiAgICBwc2JfY21kYnVmX3JlbmRlY19lbmQoY21kYnVmKTsKCiNpZmRlZiBWQzFfSGVhZGVyX1BhcnNlcl9IVwogICAgcHNiX2NtZGJ1Zl9yZWdfc3RhcnRfYmxvY2soY21kYnVmLCBDTURfUkVHVkFMUEFJUl9GTEFHX1ZDMVBBVENIKTsKI2Vsc2UKICAgIHBzYl9jbWRidWZfcmVnX3N0YXJ0X2Jsb2NrKGNtZGJ1ZiwgMCk7CiNlbmRpZgoKICAgIC8qIEVuYWJsZSBNVkQgbGl0ZSBmb3IgUHJvZ3Jlc3NpdmUgb3IgRkxESSBQICovCiAgICBpZiAoCiAgICAgICAgKAogICAgICAgICAgICAocGljX3BhcmFtcy0+c2VxdWVuY2VfZmllbGRzLmJpdHMuaW50ZXJsYWNlICYmIChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlID09IFZDMV9GQ01fRkxESSkpIHx8CiAgICAgICAgICAgICghcGljX3BhcmFtcy0+c2VxdWVuY2VfZmllbGRzLmJpdHMuaW50ZXJsYWNlKSB8fAogICAgICAgICAgICAocGljX3BhcmFtcy0+c2VxdWVuY2VfZmllbGRzLmJpdHMuaW50ZXJsYWNlICYmIChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlID09IFZDMV9GQ01fUCkpCiAgICAgICAgKSAmJgogICAgICAgIChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnBpY3R1cmVfdHlwZSA9PSBXTUZfUFRZUEVfUCkKICAgICkgewogICAgICAgIGJFbmFibGVNVkRMaXRlID0gVFJVRTsKICAgIH0KCiAgICAvKiBGRV9QUFMwICovCiAgICByZWdfdmFsdWUgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzAsIFZDMV9GRV9QSUNfV0lEVEhfSU5fTUJTX0xFU1MxLCAgY3R4LT5waWN0dXJlX3dpZHRoX21iIC0gMSk7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfUFBTMCwgVkMxX0ZFX1BJQ19IRUlHSFRfSU5fTUJTX0xFU1MxLCBjdHgtPnBpY3R1cmVfaGVpZ2h0X21iIC0gMSk7CiAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfUFBTMCwgVkMxX0ZFX0ZJUlNUX01CX0lOX1NMSUNFX1ksICAgICBzbGljZV9wYXJhbS0+c2xpY2VfdmVydGljYWxfcG9zaXRpb24pOwojaWZuZGVmIFZDMV9IZWFkZXJfUGFyc2VyX0hXCiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzAsIFZDMV9GRV9QVFlQRSwgICAgICAgICAgICAgICAgICAgcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUpOwojZW5kaWYKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9QUFMwLCBWQzFfRkVfRkNNLCAgICAgICAgICAgICAgICAgICAgIHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGUpOwogICAgcHNiX2NtZGJ1Zl9yZWdfc2V0KGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfUFBTMCksIHJlZ192YWx1ZSk7CgogICAgLyogRkVfUFBTMSAqLwogICAgcmVnX3ZhbHVlID0gMDsKI2lmbmRlZiBWQzFfSGVhZGVyX1BhcnNlcl9IVwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9QUFMxLCBWQzFfRkVfQlBfRk9STUFULCAgICAgSU1HX0ZBTFNFKTsgLy8gaW50ZXJsZWF2ZWQgZm9ybWF0CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzEsIFZDMV9GRV9CUF9QUkVTRU5ULCAgICAgIGN0eC0+Yml0cGxhbmVfcHJlc2VudCk7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzEsIFZDMV9GRV9SQVdDT0RJTkdGTEFHLCAocGljX3BhcmFtcy0+cmF3X2NvZGluZy52YWx1ZSAmIDB4N0YpKTsgLy8gNy1iaXRzCiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzEsIFZDMV9GRV9NVk1PREUsICAgICAgcGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMubXZfbW9kZSk7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzEsIFZDMV9GRV9NVk1PREUyLCAgICAgcGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMubXZfbW9kZTIpOwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9QUFMxLCBWQzFfRkVfVFRNQkYsICAgICAgIHBpY19wYXJhbXMtPnRyYW5zZm9ybV9maWVsZHMuYml0cy5tYl9sZXZlbF90cmFuc2Zvcm1fdHlwZV9mbGFnKTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfUFBTMSwgVkMxX0ZFX1RURlJNLCAgICAgICBwaWNfcGFyYW1zLT50cmFuc2Zvcm1fZmllbGRzLmJpdHMuZnJhbWVfbGV2ZWxfdHJhbnNmb3JtX3R5cGUpOwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9QUFMxLCBWQzFfRkVfQkZSQUNUSU9OLCAgIHBpY19wYXJhbXMtPmJfcGljdHVyZV9mcmFjdGlvbik7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzEsIFZDMV9GRV9DT05ET1ZFUiwgICAgY3R4LT5jb25kb3Zlcik7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzEsIFZDMV9GRV9FWFRFTkRfWCwgICAgY3R4LT5leHRlbmRfeCk7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzEsIFZDMV9GRV9FWFRFTkRfWSwgICAgY3R4LT5leHRlbmRfeSk7CiNlbmRpZgogICAgcHNiX2NtZGJ1Zl9yZWdfc2V0KGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfUFBTMSksIHJlZ192YWx1ZSk7CgogICAgLyogRkVfUFBTMiAqLwogICAgcmVnX3ZhbHVlID0gMDsKI2lmbmRlZiBWQzFfSGVhZGVyX1BhcnNlcl9IVwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9QUFMyLCBWQzFfRkVfRFFYQkVER0UsIChwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxX3Byb2ZpbGUgPT0gMSkgPyBwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxX2RiX2VkZ2UgOiBwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxX3NiX2VkZ2UpOwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9QUFMyLCBWQzFfRkVfRFFVQU5ULCAgICAgICAgICAgIHBpY19wYXJhbXMtPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMuZHF1YW50KTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfUFBTMiwgVkMxX0ZFX1BRVUFOVCwgICAgICAgICAgICBwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLnBpY19xdWFudGl6ZXJfc2NhbGUpOwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9QUFMyLCBWQzFfRkVfSEFMRlFQLCAgICAgICAgICAgIHBpY19wYXJhbXMtPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMuaGFsZl9xcCk7CiAgICAgICAgaWYgKCgoY3R4LT5wcm9maWxlID09IFdNRl9QUk9GSUxFX0FEVkFOQ0VEKSAmJiAocGljX3BhcmFtcy0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5kcXVhbnQgIT0gMCkpCiAgICAgICAgICAgIHx8ICgoY3R4LT5wcm9maWxlICE9IFdNRl9QUk9GSUxFX0FEVkFOQ0VEKSAmJiAoKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlID09IFdNRl9QVFlQRV9CKSB8fCAocGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5waWN0dXJlX3R5cGUgPT0gV01GX1BUWVBFX1ApKSkgJiYgKHBpY19wYXJhbXMtPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMuZHF1YW50ICE9IDApKSB7CiAgICAgICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9QUFMyLCBWQzFfRkVfVk9QRFFVQU5UX1BSRVNFTlQsIDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9QUFMyLCBWQzFfRkVfVk9QRFFVQU5UX1BSRVNFTlQsIDApOwogICAgICAgIH0KICAgICAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfUFBTMiwgVkMxX0ZFX0RRVUFOVEZSTSwgICAgICAgICBwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxX2ZyYW1lKTsKICAgICAgICB7CiAgICAgICAgICAgIElNR19CT09MIERRVUFOVF9JTkZSQU1FID0gKHBpY19wYXJhbXMtPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMuZHF1YW50ID09IDIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxdWFudCA9PSAxKSAmJiBwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxX2ZyYW1lKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGljX3BhcmFtcy0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5kcXVhbnQgPT0gMykgJiYgcGljX3BhcmFtcy0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5kcV9mcmFtZSk7CiAgICAgICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9QUFMyLCBWQzFfRkVfRFFVQU5UX0lORlJBTUUsIERRVUFOVF9JTkZSQU1FKTsKICAgICAgICB9CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzIsIFZDMV9GRV9BTFRQUVVBTlQsICAgICAgICAgcGljX3BhcmFtcy0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5hbHRfcGljX3F1YW50aXplcik7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzIsIFZDMV9GRV9EUVBST0ZJTEUsICAgICAgICAgcGljX3BhcmFtcy0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5kcV9wcm9maWxlKTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfUFBTMiwgVkMxX0ZFX0RRQklMRVZFTCwgICAgICAgICBwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxX2JpbmFyeV9sZXZlbCk7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzIsIFZDMV9GRV9QUUlOREVYX0dUOCwgICAgICAgY3R4LT5wcWluZGV4X2d0OCk7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzIsIFZDMV9GRV9UUkFOU0FDRlJNLCAgICAgICAgcGljX3BhcmFtcy0+dHJhbnNmb3JtX2ZpZWxkcy5iaXRzLnRyYW5zZm9ybV9hY19jb2RpbmdzZXRfaWR4MSk7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzIsIFZDMV9GRV9UUkFOU0FDRlJNMiwgICAgICAgcGljX3BhcmFtcy0+dHJhbnNmb3JtX2ZpZWxkcy5iaXRzLnRyYW5zZm9ybV9hY19jb2RpbmdzZXRfaWR4Mik7CiNlbmRpZgogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzIsIFZDMV9GRV9EUVVBTlQsIHBpY19wYXJhbXMtPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMuZHF1YW50KTsKICAgIHBzYl9jbWRidWZfcmVnX3NldChjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX1BQUzIpLCByZWdfdmFsdWUpOwoKICAgIC8qIE1WRF9MSVRFMCAqLwogICAgcmVnX3ZhbHVlID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9NVkRfTElURTAsIFZDMV9GRV9NVkRfTElURV9FTkFCTEUsICAgYkVuYWJsZU1WRExpdGUpOwogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX01WRF9MSVRFMCwgVkMxX0ZFX1BVTExCQUNLX1gsICAgICAgICBjdHgtPnB1bGxfYmFja194KTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9NVkRfTElURTAsIFZDMV9GRV9QVUxMQkFDS19ZLCAgICAgICAgY3R4LT5wdWxsX2JhY2tfeSk7CiAgICBwc2JfY21kYnVmX3JlZ19zZXQoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9NVkRfTElURTApLCByZWdfdmFsdWUpOwoKICAgIC8qIE1WRF9MSVRFMSAqLwogICAgcmVnX3ZhbHVlID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9NVkRfTElURTEsIFZDMV9GRV9URkYsICAgICAgICAgICAgICBwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnRvcF9maWVsZF9maXJzdCk7CiNpZm5kZWYgVkMxX0hlYWRlcl9QYXJzZXJfSFcKICAgICAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfTVZEX0xJVEUxLCBWQzFfRkVfUkVGRElTVCwgICAgICAgICAgcGljX3BhcmFtcy0+cmVmZXJlbmNlX2ZpZWxkcy5iaXRzLnJlZmVyZW5jZV9kaXN0YW5jZSk7CiAgICAgICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX01WRF9MSVRFMSwgVkMxX0ZFX05VTVJFRiwgICAgICAgICAgIHBpY19wYXJhbXMtPnJlZmVyZW5jZV9maWVsZHMuYml0cy5udW1fcmVmZXJlbmNlX3BpY3R1cmVzKTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfTVZEX0xJVEUxLCBWQzFfRkVfUkVGRklFTEQsICAgICAgICAgcGljX3BhcmFtcy0+cmVmZXJlbmNlX2ZpZWxkcy5iaXRzLnJlZmVyZW5jZV9maWVsZF9waWNfaW5kaWNhdG9yKTsKICAgICAgICBSRUdJT19XUklURV9GSUVMRChyZWdfdmFsdWUsIE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfTVZEX0xJVEUxLCBWQzFfRkVfTVZSQU5HRSwgICAgICAgICAgcGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMuZXh0ZW5kZWRfbXZfcmFuZ2UpOwogICAgICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9NVkRfTElURTEsIFZDMV9GRV9IQUxGUEVMX0ZMQUcsICAgICBjdHgtPmhhbGZfcGVsKTsKICAgICAgICAvL1JFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9NVkRfTElURTEsIFZDMV9GRV9GUkFNRV9DT0RJTkdfTU9ERSwgICAgcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5mcmFtZV9jb2RpbmdfbW9kZSk7CiNlbmRpZgogICAgUkVHSU9fV1JJVEVfRklFTEQocmVnX3ZhbHVlLCBNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX01WRF9MSVRFMSwgVkMxX0ZFX0JPVFRPTV9GSUVMRF9GTEFHLCAgICAgIGN0eC0+Ym90dG9tX2ZpZWxkKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKHJlZ192YWx1ZSwgTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9NVkRfTElURTEsIFZDMV9GRV9BRFZBTkNFRF9QUk9GSUxFLCAoY3R4LT5wcm9maWxlID09IFdNRl9QUk9GSUxFX0FEVkFOQ0VEKSA/IDEgOiAwKTsKICAgIHBzYl9jbWRidWZfcmVnX3NldChjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX01WRF9MSVRFMSksIHJlZ192YWx1ZSk7CgogICAgcHNiX2NtZGJ1Zl9yZWdfZW5kX2Jsb2NrKGNtZGJ1Zik7Cn0KCnN0YXRpYyB2b2lkIHBzYl9fVkMxX3NldHVwX2JpdHBsYW5lKGNvbnRleHRfVkMxX3AgY3R4KQp7CiAgICBwc2JfY21kYnVmX3AgY21kYnVmID0gY3R4LT5vYmpfY29udGV4dC0+Y21kYnVmOwoKICAgIHBzYl9jbWRidWZfcmVnX3N0YXJ0X2Jsb2NrKGNtZGJ1ZiwgMCk7CgojaWZkZWYgVkMxX0hlYWRlcl9QYXJzZXJfSFcKICAgICAgICBwc2JfY21kYnVmX3JlZ19zZXRfYWRkcmVzcyhjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX0JJVFBMQU5FU19CQVNFX0FERFIwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5iaXRwbGFuZV9od19idWZmZXIsIDApOwogICAgICAgIHBzYl9jbWRidWZfcmVnX3NldF9hZGRyZXNzKGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfQklUUExBTkVTX0JBU0VfQUREUjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPmJpdHBsYW5lX2h3X2J1ZmZlciwgMHhhMDAwKTsKICAgICAgICBwc2JfY21kYnVmX3JlZ19zZXRfYWRkcmVzcyhjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUNfVkMxLCBDUl9WRUNfVkMxX0ZFX0JJVFBMQU5FU19CQVNFX0FERFIyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5iaXRwbGFuZV9od19idWZmZXIsIDB4YTAwMCAqIDIpOwojZWxzZQogICAgICAgIGlmIChjdHgtPmJpdHBsYW5lX3ByZXNlbnQpCiAgICAgICAgICAgIHBzYl9jbWRidWZfcmVnX3NldF9hZGRyZXNzKGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQ19WQzEsIENSX1ZFQ19WQzFfRkVfQklUUExBTkVTX0JBU0VfQUREUjApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmJpdHBsYW5lX2J1ZmZlciwgMCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwc2JfY21kYnVmX3JlZ19zZXQoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfVkVDX1ZDMSwgQ1JfVkVDX1ZDMV9GRV9CSVRQTEFORVNfQkFTRV9BRERSMCksIDApOwojZW5kaWYKICAgIHBzYl9jbWRidWZfcmVnX2VuZF9ibG9jayhjbWRidWYpOwp9CgpzdGF0aWMgdm9pZCBwc2JfX1ZDMV9TZW5kX1BhcnNlX0hlYWRlcl9DbWQoY29udGV4dF9WQzFfcCBjdHgsIElNR19CT09MIG5ld19waWMpCnsKICAgIFBBUlNFX0hFQURFUl9DTUQqICAgICAgIHBQYXJzZUhlYWRlckNNRDsKICAgIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZDMSAqcGljX3BhcmFtcyA9IGN0eC0+cGljX3BhcmFtczsKICAgIHBzYl9jbWRidWZfcCBjbWRidWYgPSBjdHgtPm9ial9jb250ZXh0LT5jbWRidWY7CgogICAgLy9wUGFyc2VIZWFkZXJDTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoUEFSU0VfSEVBREVSX0NNRCopbUN0cmxBbGxvYy5BbGxvY2F0ZVNwYWNlKHNpemVvZihQQVJTRV9IRUFERVJfQ01EKSk7CiAgICBwUGFyc2VIZWFkZXJDTUQgPSAoUEFSU0VfSEVBREVSX0NNRCopY21kYnVmLT5jbWRfaWR4OwogICAgY21kYnVmLT5jbWRfaWR4ICs9IHNpemVvZihQQVJTRV9IRUFERVJfQ01EKSAvIHNpemVvZih1aW50MzJfdCk7CgogICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyQ21kICAgICAgICAgICAgICAgICA9IENNRF9QQVJTRV9IRUFERVI7CiAgICBpZiAoIW5ld19waWMpIHsKICAgICAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJDbWQgICAgICAgIHw9IENNRF9QQVJTRV9IRUFERVJfTkVXU0xJQ0U7CiAgICB9CgovLyAgICAgICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSAgPSAoc1ZDMUhlYWRlclBhcnNlci5zU2VxSGRyLkVYVEVOREVEX0RNViYweDEpICA8PCBWQzFfU0VRSERSX0VYVEVOREVEX0RNVjsKICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgID0gKHBpY19wYXJhbXMtPm12X2ZpZWxkcy5iaXRzLmV4dGVuZGVkX2Rtdl9mbGFnKSA8PCBWQzFfU0VRSERSX0VYVEVOREVEX0RNVjsKCi8vICAgICAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChzVkMxSGVhZGVyUGFyc2VyLnNTZXFIZHIuUFNGJjB4MSkgICAgICAgICAgICAgICAgICAgPDwgVkMxX1NFUUhEUl9QU0Y7CiAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChwaWNfcGFyYW1zLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5wc2YpICAgICAgICAgICAgICAgPDwgVkMxX1NFUUhEUl9QU0Y7CgovLyAgICAgICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSB8PSAoc1ZDMUhlYWRlclBhcnNlci5zU2VxSGRyLkZJTlRFUlBGTEFHJjB4MSkgICA8PCBWQzFfU0VRSERSX0ZJTlRFUlBGTEFHOwogICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSB8PSAocGljX3BhcmFtcy0+c2VxdWVuY2VfZmllbGRzLmJpdHMuZmludGVycGZsYWcpIDw8IFZDMV9TRVFIRFJfRklOVEVSUEZMQUc7CgovLyAgICAgICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSB8PSAoc1ZDMUhlYWRlclBhcnNlci5zU2VxSGRyLlRGQ05UUkZMQUcmMHgxKSAgICA8PCBWQzFfU0VRSERSX1RGQ05UUkZMQUc7CiAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChwaWNfcGFyYW1zLT5zZXF1ZW5jZV9maWVsZHMuYml0cy50ZmNudHJmbGFnKSA8PCBWQzFfU0VRSERSX1RGQ05UUkZMQUc7OwoKLy8gICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHNWQzFIZWFkZXJQYXJzZXIuc1NlcUhkci5JTlRFUkxBQ0UmMHgxKSAgICAgICAgICAgICA8PCBWQzFfU0VRSERSX0lOVEVSTEFDRTsKICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHBpY19wYXJhbXMtPnNlcXVlbmNlX2ZpZWxkcy5iaXRzLmludGVybGFjZSkgICAgICAgICA8PCBWQzFfU0VRSERSX0lOVEVSTEFDRTsKCi8vICAgICAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChzVkMxSGVhZGVyUGFyc2VyLnNTZXFIZHIuUFVMTERPV04mMHgxKSAgICAgICAgICAgICAgPDwgVkMxX1NFUUhEUl9QVUxMRE9XTjsKICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHBpY19wYXJhbXMtPnNlcXVlbmNlX2ZpZWxkcy5iaXRzLnB1bGxkb3duKSAgICAgICAgICA8PCBWQzFfU0VRSERSX1BVTExET1dOOwoKLy8gICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHNWQzFIZWFkZXJQYXJzZXIuc1NlcUhkci5QT1NUUFJPQ0ZMQUcmMHgxKSAgPDwgVkMxX1NFUUhEUl9QT1NUUFJPQ0ZMQUc7CiAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChwaWNfcGFyYW1zLT5wb3N0X3Byb2Nlc3NpbmcgJiAweDEpICAgICAgICAgIDw8IFZDMV9TRVFIRFJfUE9TVFBST0NGTEFHOwoKLy8gICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHNWQzFIZWFkZXJQYXJzZXIuc1NlcUhkci5WU1RSQU5TRk9STSYweDEpICAgPDwgVkMxX1NFUUhEUl9WU1RSQU5TRk9STTsKICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHBpY19wYXJhbXMtPnRyYW5zZm9ybV9maWVsZHMuYml0cy52YXJpYWJsZV9zaXplZF90cmFuc2Zvcm1fZmxhZykgPDwgVkMxX1NFUUhEUl9WU1RSQU5TRk9STTsKCi8vICAgICAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChyc2VyLnNTZXFIZHIuRFFVQU5UJjB4MykgICAgICAgICAgICAgICAgPDwgVkMxX1NFUUhEUl9EUVVBTlQ7CiAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChwaWNfcGFyYW1zLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxdWFudCkgPDwgVkMxX1NFUUhEUl9EUVVBTlQ7CgovLyAgICAgICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSB8PSAoc1ZDMUhlYWRlclBhcnNlci5zU2VxSGRyLkVYVEVOREVEX01WJjB4MSkgICA8PCBWQzFfU0VRSERSX0VYVEVOREVEX01WOwogICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSB8PSAocGljX3BhcmFtcy0+bXZfZmllbGRzLmJpdHMuZXh0ZW5kZWRfbXZfZmxhZykgPDwgVkMxX1NFUUhEUl9FWFRFTkRFRF9NVjsKCi8vICAgICAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChzVkMxSGVhZGVyUGFyc2VyLnNTZXFIZHIuRkFTVFVWTUMmMHgxKSAgICAgICAgICAgICAgPDwgVkMxX1NFUUhEUl9GQVNUVVZNQzsKICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHBpY19wYXJhbXMtPmZhc3RfdXZtY19mbGFnICYgMHgxKSAgICAgICAgICAgICAgICAgICAgICAgPDwgVkMxX1NFUUhEUl9GQVNUVVZNQzsKCi8vICAgICAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChzVkMxSGVhZGVyUGFyc2VyLnNTZXFIZHIuTE9PUEZJTFRFUiYweDEpICAgIDw8IFZDMV9TRVFIRFJfTE9PUEZJTFRFUjsKICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHBpY19wYXJhbXMtPmVudHJ5cG9pbnRfZmllbGRzLmJpdHMubG9vcGZpbHRlcikgPDwgVkMxX1NFUUhEUl9MT09QRklMVEVSOwoKLy8gICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHNWQzFIZWFkZXJQYXJzZXIuc1NlcUhkci5SRUZESVNUX0ZMQUcmMHgxKSAgPDwgVkMxX1NFUUhEUl9SRUZESVNUX0ZMQUc7CiAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChwaWNfcGFyYW1zLT5yZWZlcmVuY2VfZmllbGRzLmJpdHMucmVmZXJlbmNlX2Rpc3RhbmNlX2ZsYWcpIDw8IFZDMV9TRVFIRFJfUkVGRElTVF9GTEFHOwoKLy8gICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHNWQzFIZWFkZXJQYXJzZXIuc1NlcUhkci5QQU5TQ0FOX0ZMQUcmMHgxKSAgPDwgVkMxX1NFUUhEUl9QQU5TQ0FOX0ZMQUc7CiAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChwaWNfcGFyYW1zLT5lbnRyeXBvaW50X2ZpZWxkcy5iaXRzLnBhbnNjYW5fZmxhZykgPDwgVkMxX1NFUUhEUl9QQU5TQ0FOX0ZMQUc7CgovLyAgICAgICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSB8PSAoc1ZDMUhlYWRlclBhcnNlci5zU2VxSGRyLk1BWEJGUkFNRVMmMHg3KSAgICA8PCBWQzFfU0VRSERSX01BWEJGUkFNRVM7CiAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChwaWNfcGFyYW1zLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5tYXhfYl9mcmFtZXMpIDw8IFZDMV9TRVFIRFJfTUFYQkZSQU1FUzsKCi8vICAgICAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChzVkMxSGVhZGVyUGFyc2VyLnNTZXFIZHIuUkFOR0VSRUQmMHgxKSAgICAgICAgICAgICAgPDwgVkMxX1NFUUhEUl9SQU5HRVJFRDsKICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHBpY19wYXJhbXMtPnNlcXVlbmNlX2ZpZWxkcy5iaXRzLnJhbmdlcmVkKSA8PCBWQzFfU0VRSERSX1JBTkdFUkVEOwoKLy8gICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHNWQzFIZWFkZXJQYXJzZXIuc1NlcUhkci5TWU5DTUFSS0VSJjB4MSkgICAgPDwgVkMxX1NFUUhEUl9TWU5DTUFSS0VSOwogICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSB8PSAocGljX3BhcmFtcy0+c2VxdWVuY2VfZmllbGRzLmJpdHMuc3luY21hcmtlcikgPDwgVkMxX1NFUUhEUl9TWU5DTUFSS0VSOwoKLy8gICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHNWQzFIZWFkZXJQYXJzZXIuc1NlcUhkci5NVUxUSVJFUyYweDEpICAgICAgICAgICAgICA8PCBWQzFfU0VRSERSX01VTFRJUkVTOwogICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSB8PSAocGljX3BhcmFtcy0+c2VxdWVuY2VfZmllbGRzLmJpdHMubXVsdGlyZXMpIDw8IFZDMV9TRVFIRFJfTVVMVElSRVM7CgovLyAgICAgICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSB8PSAoc1ZDMUhlYWRlclBhcnNlci5zU2VxSGRyLlFVQU5USVpFUiYweDMpICAgICAgICAgICAgIDw8IFZDMV9TRVFIRFJfUVVBTlRJWkVSOwogICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSB8PSAocGljX3BhcmFtcy0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5xdWFudGl6ZXIpIDw8IFZDMV9TRVFIRFJfUVVBTlRJWkVSOwoKLy8gICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHNWQzFIZWFkZXJQYXJzZXIuc1NlcUhkci5PVkVSTEFQJjB4MSkgICAgICAgICAgICAgICA8PCBWQzFfU0VRSERSX09WRVJMQVA7CiAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChwaWNfcGFyYW1zLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5vdmVybGFwKSA8PCBWQzFfU0VRSERSX09WRVJMQVA7CgovLyAgICAgICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSB8PSAoc1ZDMUhlYWRlclBhcnNlci5zU2VxSGRyLlBST0ZJTEUmMHgzKSAgICAgICAgICAgICAgIDw8IFZDMV9TRVFIRFJfUFJPRklMRTsKICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKGN0eC0+cHJvZmlsZSkgPDwgVkMxX1NFUUhEUl9QUk9GSUxFOwoKLy8gICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKG1zUGljUGFyYW0uYlNlY29uZEZpZWxkJjB4MSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFZDMV9TRVFIRFJfU0VDT05ERklFTEQ7CiAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9ICghcGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy5pc19maXJzdF9maWVsZCkgPDwgVkMxX1NFUUhEUl9TRUNPTkRGSUVMRDsKCi8vICAgICAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChtcERlc3RGcmFtZS0+RnJhbWVDb2RpbmdNb2RlKCkmMHgzKSAgICAgICAgICAgICAgICAgPDwgVkMxX1NFUUhEUl9GQ01fQ1VSUlBJQzsKICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGUgJiAweDMpIDw8IFZDMV9TRVFIRFJfRkNNX0NVUlJQSUM7CgovLyAgICAgICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyU2VxSGRyRGF0YSB8PSAobXVpOFBpY1R5cGUmMHgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBWQzFfU0VRSERSX1BJQ1RZUEU7CiAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJTZXFIZHJEYXRhIHw9IChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnBpY3R1cmVfdHlwZSAmIDB4MykgPDwgVkMxX1NFUUhEUl9QSUNUWVBFOwoKLy8gICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKChtc1BpY1BhcmFtLmJCaWRpcmVjdGlvbmFsQXZlcmFnaW5nTW9kZT4+NCkmMHgxKSA8PCBWQzFfU0VRSERSX0lDRkxBRzsKICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlNlcUhkckRhdGEgfD0gKHBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuaW50ZW5zaXR5X2NvbXBlbnNhdGlvbikgPDwgIFZDMV9TRVFIRFJfSUNGTEFHOwoKICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlBpY0RpbWVuc2lvbnMgICAgICAgICAgICAgID0gY3R4LT5waWN0dXJlX3dpZHRoX21iOwogICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyUGljRGltZW5zaW9ucyAgICAgICAgIHw9IChjdHgtPnBpY3R1cmVfaGVpZ2h0X21iIDw8IDE2KTsKCi8vICAgICAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJCaXRwbGFuZUFkZHJbMF0gICAgPSAocHNCaXRwbGFuZUhXQnVmZmVyWzBdLT5HZXRUb3BEZXZpY2VNZW1BbGxvYygpKS0+R2V0RGV2aWNlVmlydEFkZHJlc3MoKTsKLy8gICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMkJpdHBsYW5lQWRkclsxXSAgICA9IChwc0JpdHBsYW5lSFdCdWZmZXJbMV0tPkdldFRvcERldmljZU1lbUFsbG9jKCkpLT5HZXREZXZpY2VWaXJ0QWRkcmVzcygpOwovLyAgICAgICAgcFBhcnNlSGVhZGVyQ01ELT51aTMyQml0cGxhbmVBZGRyWzJdICAgID0gKHBzQml0cGxhbmVIV0J1ZmZlclsyXS0+R2V0VG9wRGV2aWNlTWVtQWxsb2MoKSktPkdldERldmljZVZpcnRBZGRyZXNzKCk7CiAgICBSRUxPQyhwUGFyc2VIZWFkZXJDTUQtPnVpMzJCaXRwbGFuZUFkZHJbMF0sIGN0eC0+Yml0cGxhbmVfaHdfYnVmZmVyLmJ1ZmZlcl9vZnMsICZjdHgtPmJpdHBsYW5lX2h3X2J1ZmZlcik7CiAgICBSRUxPQyhwUGFyc2VIZWFkZXJDTUQtPnVpMzJCaXRwbGFuZUFkZHJbMV0sIGN0eC0+Yml0cGxhbmVfaHdfYnVmZmVyLmJ1ZmZlcl9vZnMgKyAweGEwMDAsICZjdHgtPmJpdHBsYW5lX2h3X2J1ZmZlcik7CiAgICBSRUxPQyhwUGFyc2VIZWFkZXJDTUQtPnVpMzJCaXRwbGFuZUFkZHJbMl0sIGN0eC0+Yml0cGxhbmVfaHdfYnVmZmVyLmJ1ZmZlcl9vZnMgKyAweGEwMDAgKiAyLCAmY3R4LT5iaXRwbGFuZV9od19idWZmZXIpOwoKLy8gICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMlZMQ1RhYmxlQWRkciAgICAgICA9ICAgICAgIHBzVmxjUGFja2VkVGFibGVEYXRhLT5HZXRUb3BEZXZpY2VNZW1BbGxvYygpLT5HZXREZXZpY2VWaXJ0QWRkcmVzcygpOwogICAgUkVMT0MocFBhcnNlSGVhZGVyQ01ELT51aTMyVkxDVGFibGVBZGRyLCBjdHgtPnZsY19wYWNrZWRfdGFibGUuYnVmZmVyX29mcywgJmN0eC0+dmxjX3BhY2tlZF90YWJsZSk7CiAgICAvKgogICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMklDUGFyYW1EYXRhWzBdICAgICAgPSAoKG1zUGljUGFyYW0ud0JpdHN0cmVhbUZjb2RlcyA+PiA4KSAmIDB4RkYpOwogICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMklDUGFyYW1EYXRhWzBdIHw9ICgobXNQaWNQYXJhbS53Qml0c3RyZWFtUENFZWxlbWVudHMgPj4gOCkgJiAweEZGKSA8PCA4OwogICAgICAgIGlmKCBtcEZvcndhcmRSZWZGcmFtZS0+VG9wRmllbGRGaXJzdCgpICkKICAgICAgICAgICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMklDUGFyYW1EYXRhWzBdIHw9ICgxIDw8IDE2KTsKICAgICovCiAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJJQ1BhcmFtRGF0YVswXSAgICAgID0gKChwaWNfcGFyYW1zLT5sdW1hX3NjYWxlID4+IDgpICYgMHhGRik7CiAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJJQ1BhcmFtRGF0YVswXSB8PSAoKHBpY19wYXJhbXMtPmx1bWFfc2hpZnQgPj4gOCkgJiAweEZGKSA8PCA4OwogICAgaWYgKGN0eC0+YlRGRl9Gd1JlZkZybSkKICAgICAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJJQ1BhcmFtRGF0YVswXSB8PSAoMSA8PCAxNik7CiAgICAvKgogICAgICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMklDUGFyYW1EYXRhWzFdICAgICAgPSAobXNQaWNQYXJhbS53Qml0c3RyZWFtRmNvZGVzICYgMHhGRik7CiAgICAgICAgcFBhcnNlSGVhZGVyQ01ELT51aTMySUNQYXJhbURhdGFbMV0gICAgIHw9IChtc1BpY1BhcmFtLndCaXRzdHJlYW1QQ0VlbGVtZW50cyAmIDB4RkYpIDw8IDg7CiAgICAgICAgaWYoIG1wRGVzdEZyYW1lLT5Ub3BGaWVsZEZpcnN0KCkgKQogICAgICAgICAgICAgICAgcFBhcnNlSGVhZGVyQ01ELT51aTMySUNQYXJhbURhdGFbMV0gfD0gKDEgPDwgMTYpOwogICAgKi8KICAgIHBQYXJzZUhlYWRlckNNRC0+dWkzMklDUGFyYW1EYXRhWzFdICAgICAgPSAocGljX3BhcmFtcy0+bHVtYV9zY2FsZSAmIDB4RkYpOwogICAgcFBhcnNlSGVhZGVyQ01ELT51aTMySUNQYXJhbURhdGFbMV0gICAgIHw9IChwaWNfcGFyYW1zLT5sdW1hX3NoaWZ0ICYgMHhGRikgPDwgODsKICAgIGlmIChwaWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnRvcF9maWVsZF9maXJzdCkKICAgICAgICBwUGFyc2VIZWFkZXJDTUQtPnVpMzJJQ1BhcmFtRGF0YVsxXSB8PSAoMSA8PCAxNik7CgogICAgcFBhcnNlSGVhZGVyQ01ELT51aTMySUNQYXJhbURhdGFbMF0gPSAweDAwMDEwMDAwOwogICAgcFBhcnNlSGVhZGVyQ01ELT51aTMySUNQYXJhbURhdGFbMV0gPSAweDAwMDEwMDIwOwp9CgpzdGF0aWMgdm9pZCBwc2JfX1ZDMV9iZWdpbl9zbGljZShjb250ZXh0X0RFQ19wIGRlY19jdHgsIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJCYXNlICp2bGRfc2xpY2VfcGFyYW0pCnsKICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWQzEgKnNsaWNlX3BhcmFtID0gKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWQzEgKikgdmxkX3NsaWNlX3BhcmFtOwogICAgY29udGV4dF9WQzFfcCBjdHggPSAoY29udGV4dF9WQzFfcClkZWNfY3R4OwoKICAgIGRlY19jdHgtPmJpdHNfb2Zmc2V0ID0gc2xpY2VfcGFyYW0tPm1hY3JvYmxvY2tfb2Zmc2V0OwogICAgZGVjX2N0eC0+U1JfZmxhZ3MgPSAoY3R4LT5wcm9maWxlID09IFdNRl9QUk9GSUxFX0FEVkFOQ0VEKSA/IChDTURfRU5BQkxFX1JCRFVfRVhUUkFDVElPTiB8IENNRF9TUl9WRVJJRllfU1RBUlRDT0RFKSA6IDA7Cn0KCnN0YXRpYyB2b2lkIHBzYl9fVkMxX3Byb2Nlc3Nfc2xpY2VfZGF0YShjb250ZXh0X0RFQ19wIGRlY19jdHgsIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJCYXNlICp2bGRfc2xpY2VfcGFyYW0pCnsKICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWQzEgKnNsaWNlX3BhcmFtID0gKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWQzEgKikgdmxkX3NsaWNlX3BhcmFtOwogICAgY29udGV4dF9WQzFfcCBjdHggPSAoY29udGV4dF9WQzFfcClkZWNfY3R4OwoKICAgIHBzYl9fVkMxX2xvYWRfc2VxdWVuY2VfcmVnaXN0ZXJzKGN0eCk7CgojaWZuZGVmIFZDMV9IZWFkZXJfUGFyc2VyX0hXCiAgICAgICAgcHNiX19WQzFfd3JpdGVfVkxDX3RhYmxlcyhjdHgpOwogICAgICAgIHBzYl9fVkMxX2J1aWxkX1ZMQ190YWJsZXMoY3R4KTsKI2Vsc2UKICAgICAgICBwc2JfX1ZDMV9TZW5kX1BhcnNlX0hlYWRlcl9DbWQoY3R4LCBjdHgtPmlzX2ZpcnN0X3NsaWNlKTsKI2VuZGlmCgogICAgcHNiX19WQzFfbG9hZF9waWN0dXJlX3JlZ2lzdGVycyhjdHgsIHNsaWNlX3BhcmFtKTsKICAgIHBzYl9fVkMxX3NldHVwX2JpdHBsYW5lKGN0eCk7CiAgICBwc2JfX1ZDMV9zZW5kX3JlbmRlY19wYXJhbXMoY3R4LCBzbGljZV9wYXJhbSk7Cn0KCnN0YXRpYyB2b2lkIHBzYl9fVkMxX2VuZF9zbGljZShjb250ZXh0X0RFQ19wIGRlY19jdHgpCnsKICAgIGNvbnRleHRfVkMxX3AgY3R4ID0gKGNvbnRleHRfVkMxX3ApZGVjX2N0eDsKCiAgICBjdHgtPm9ial9jb250ZXh0LT5maXJzdF9tYiA9IDA7CiAgICBpZiAoY3R4LT5pc19maXJzdF9zbGljZSkgewogICAgICAgIGN0eC0+b2JqX2NvbnRleHQtPmZsYWdzIHw9IEZXX1ZBX1JFTkRFUl9JU19GSVJTVF9TTElDRTsKICAgIH0KICAgIC8vaWYgKGN0eC0+Yml0cGxhbmVfcHJlc2VudCkKICAgIHsKICAgICAgICBjdHgtPm9ial9jb250ZXh0LT5mbGFncyB8PSBGV19WQV9SRU5ERVJfVkMxX0JJVFBMQU5FX1BSRVNFTlQ7CiAgICB9CiAgICBjdHgtPm9ial9jb250ZXh0LT5sYXN0X21iID0gKChjdHgtPnBpY3R1cmVfaGVpZ2h0X21iIC0gMSkgPDwgOCkgfCAoY3R4LT5waWN0dXJlX3dpZHRoX21iIC0gMSk7CgogICAgKihjdHgtPmRlY19jdHguc2xpY2VfZmlyc3RfcGljX2xhc3QpID0gKGN0eC0+b2JqX2NvbnRleHQtPmZpcnN0X21iIDw8IDE2KSB8IChjdHgtPm9ial9jb250ZXh0LT5sYXN0X21iKTsKICAgIGlmIChwc2JfdmlkZW9fdHJhY2VfZnAgJiYgKHBzYl92aWRlb190cmFjZV9sZXZlbCAmIEFVWEJVRl9UUkFDRSkpIHsKICAgICAgICBwc2JfX2RlYnVnX3NjaGVkdWxlX2hleGR1bXAoIlByZWxvYWQgYnVmZmVyIiwgJmN0eC0+cHJlbG9hZF9idWZmZXIsIDAsIFBSRUxPQURfQlVGRkVSX1NJWkUpOwogICAgICAgIHBzYl9fZGVidWdfc2NoZWR1bGVfaGV4ZHVtcCgiQVVYTVNCIGJ1ZmZlciIsICZjdHgtPmF1eF9tc2JfYnVmZmVyLCAwLCAweDgwMDAgLyogQVVYTVNCX0JVRkZFUl9TSVpFICovKTsKICAgICAgICBwc2JfX2RlYnVnX3NjaGVkdWxlX2hleGR1bXAoIlZMQyBUYWJsZSIsICZjdHgtPnZsY19wYWNrZWRfdGFibGUsIDAsIGd1aTE2dmMxVmxjVGFibGVTaXplICogc2l6ZW9mKElNR19VSU5UMTYpKTsKICAgIH0KCiAgICBjdHgtPmlzX2ZpcnN0X3NsaWNlID0gRkFMU0U7IC8qIFJlc2V0ICovCn0KCnN0YXRpYyBWQVN0YXR1cyBwbndfVkMxX0JlZ2luUGljdHVyZSgKICAgIG9iamVjdF9jb250ZXh0X3Agb2JqX2NvbnRleHQpCnsKICAgIElOSVRfQ09OVEVYVF9WQzEKCiAgICBpZiAoY3R4LT5waWNfcGFyYW1zKSB7CiAgICAgICAgZnJlZShjdHgtPnBpY19wYXJhbXMpOwogICAgICAgIGN0eC0+cGljX3BhcmFtcyA9IE5VTEw7CiAgICB9CiAgICBjdHgtPmlzX2ZpcnN0X3NsaWNlID0gVFJVRTsKCiAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7Cn0KCnN0YXRpYyBWQVN0YXR1cyBwbndfVkMxX3Byb2Nlc3NfYnVmZmVyKAogICAgY29udGV4dF9ERUNfcCBkZWNfY3R4LAogICAgb2JqZWN0X2J1ZmZlcl9wIGJ1ZmZlcikKewogICAgY29udGV4dF9WQzFfcCBjdHggPSAoY29udGV4dF9WQzFfcClkZWNfY3R4OwogICAgVkFTdGF0dXMgdmFTdGF0dXMgPSBWQV9TVEFUVVNfU1VDQ0VTUzsKICAgIG9iamVjdF9idWZmZXJfcCBvYmpfYnVmZmVyID0gYnVmZmVyOwoKICAgIHN3aXRjaCAob2JqX2J1ZmZlci0+dHlwZSkgewogICAgY2FzZSBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJUeXBlOgogICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgInBud19WQzFfUmVuZGVyUGljdHVyZSBnb3QgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyXG4iKTsKICAgICAgICB2YVN0YXR1cyA9IHBzYl9fVkMxX3Byb2Nlc3NfcGljdHVyZV9wYXJhbShjdHgsIG9ial9idWZmZXIpOwogICAgICAgIERFQlVHX0ZBSUxVUkU7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBWQUJpdFBsYW5lQnVmZmVyVHlwZToKICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJwbndfVkMxX1JlbmRlclBpY3R1cmUgZ290IFZBQml0UGxhbmVCdWZmZXJcbiIpOwogICAgICAgIHZhU3RhdHVzID0gcHNiX19WQzFfcHJvY2Vzc19iaXRwbGFuZShjdHgsIG9ial9idWZmZXIpOwogICAgICAgIERFQlVHX0ZBSUxVUkU7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICB2YVN0YXR1cyA9IFZBX1NUQVRVU19FUlJPUl9VTktOT1dOOwogICAgICAgIERFQlVHX0ZBSUxVUkU7CiAgICB9CgogICAgcmV0dXJuIHZhU3RhdHVzOwp9CgpzdGF0aWMgVkFTdGF0dXMgcG53X1ZDMV9FbmRQaWN0dXJlKAogICAgb2JqZWN0X2NvbnRleHRfcCBvYmpfY29udGV4dCkKewogICAgSU5JVF9DT05URVhUX1ZDMQoKICAgIGlmIChwc2JfY29udGV4dF9mbHVzaF9jbWRidWYoY3R4LT5vYmpfY29udGV4dCkpIHsKICAgICAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX1VOS05PV047CiAgICB9CgogICAgQVNTRVJUKGN0eC0+cGljX3BhcmFtcyk7CiAgICBpZiAoIWN0eC0+cGljX3BhcmFtcykgewogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfVU5LTk9XTjsKICAgIH0KCiAgICAvKioqKioqKioqIEtlZXAgc29tZSBwaWN0dXJlIHBhcmFtZXRlcnMgb2YgdGhlIHByZXZpb3VzbHkgZGVjb2RlZCBwaWN0dXJlICoqKioqKioqKioqLwogICAgaWYgKFBJQ19UWVBFX0lTX1JFRihjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMucGljdHVyZV90eXBlKSkgeyAvLyBJIG9yIFAKICAgICAgICAvKiBBc3N1bWUgdGhhdCB0aGUgcGljdHVyZSB0aGF0IHdlIGp1c3QgZGVjb2RlZCAodGhlIHBpY3R1cmUgcHJldmlvdXMgdG8gdGhlIG9uZSB0aGF0CiAgICAgICAgICAgaXMgYWJvdXQgdG8gYmUgZGVjb2RlZCkgaXMgdGhlIGJhY2t3YXJkIHJlZmVyZW5jZSBwaWN0dXJlIGZvciBhIEIgcGljdHVyZS4gKi8KICAgICAgICAvKiBUT0RPOiBNYWtlIHRoaXMgbW9yZSByb2J1c3QgKi8KICAgICAgICBjdHgtPnVpOEZDTV9SZWYyUGljID0gY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmZyYW1lX2NvZGluZ19tb2RlOwoKICAgICAgICAvKiBGb3IgaW50ZXJsYWNlZCBmaWVsZCBwaWN0dXJlcyBvbmx5ICovCiAgICAgICAgaWYgKChjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGUgIT0gVkMxX0ZDTV9GTERJKSB8fCAhY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLmlzX2ZpcnN0X2ZpZWxkKSB7CiAgICAgICAgICAgIGN0eC0+YlRGRl9Cd1JlZkZybSA9IGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9maWVsZHMuYml0cy50b3BfZmllbGRfZmlyc3Q7CiAgICAgICAgfQogICAgfQoKICAgIGN0eC0+YlJlZjFSYW5nZVJlZCA9IGN0eC0+YlJlZjBSYW5nZVJlZDsKICAgIGlmIChQSUNfVFlQRV9JU19SRUYoY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnBpY3R1cmVfdHlwZSkpIHsKICAgICAgICBjdHgtPmJSZWYwUmFuZ2VSZWQgPSBjdHgtPnBpY19wYXJhbXMtPnJhbmdlX3JlZHVjdGlvbl9mcmFtZTsKICAgIH0KICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICBmcmVlKGN0eC0+cGljX3BhcmFtcyk7CiAgICBjdHgtPnBpY19wYXJhbXMgPSBOVUxMOwoKICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKfQoKc3RydWN0IGZvcm1hdF92dGFibGVfcyBwbndfVkMxX3Z0YWJsZSA9IHsKcXVlcnlDb25maWdBdHRyaWJ1dGVzOgogICAgcG53X1ZDMV9RdWVyeUNvbmZpZ0F0dHJpYnV0ZXMsCnZhbGlkYXRlQ29uZmlnOgogICAgcG53X1ZDMV9WYWxpZGF0ZUNvbmZpZywKY3JlYXRlQ29udGV4dDoKICAgIHBud19WQzFfQ3JlYXRlQ29udGV4dCwKZGVzdHJveUNvbnRleHQ6CiAgICBwbndfVkMxX0Rlc3Ryb3lDb250ZXh0LApiZWdpblBpY3R1cmU6CiAgICBwbndfVkMxX0JlZ2luUGljdHVyZSwKcmVuZGVyUGljdHVyZToKICAgIHZsZF9kZWNfUmVuZGVyUGljdHVyZSwKZW5kUGljdHVyZToKICAgIHBud19WQzFfRW5kUGljdHVyZQp9Owo=