LyoKICogQ29weXJpZ2h0IKkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgogKiBJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCiAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICogQXV0aG9yczoKICogICAgWGlhbmcgSGFpaGFvIDxoYWloYW8ueGlhbmdAaW50ZWwuY29tPgogKiAgICBab3UgTmFuIGhhaSA8bmFuaGFpLnpvdUBpbnRlbC5jb20+CiAqCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2luY2x1ZGUgPHZhL3ZhX2JhY2tlbmQuaD4KCiNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgojaW5jbHVkZSAiaW50ZWxfZHJpdmVyLmgiCgojaW5jbHVkZSAiaTk2NV9kZWZpbmVzLmgiCiNpbmNsdWRlICJpOTY1X21lZGlhLmgiCiNpbmNsdWRlICJpOTY1X21lZGlhX21wZWcyLmgiCiNpbmNsdWRlICJpOTY1X2Rydl92aWRlby5oIgoKI2RlZmluZSBTVVJGQUNFX1RBUkdFVAkgICAgMAojZGVmaW5lIFNVUkZBQ0VfRk9SV0FSRAkgICAgMQojZGVmaW5lIFNVUkZBQ0VfQkFDS1dBUkQgICAgMgojZGVmaW5lIFNVUkZBQ0VfQklESVJFQ1QgICAgMwoKZW51bSBpbnRlcmZhY2UgewogICAgRlJBTUVfSU5UUkEgPSAwLAogICAgRlJBTUVfRlJBTUVfUFJFRF9GT1JXQVJELAogICAgRlJBTUVfRlJBTUVfUFJFRF9CQUNLV0FSRCwKICAgIEZSQU1FX0ZSQU1FX1BSRURfQklESVJFQ1QsCiAgICBGUkFNRV9GSUVMRF9QUkVEX0ZPUldBUkQsCiAgICBGUkFNRV9GSUVMRF9QUkVEX0JBQ0tXQVJELAogICAgRlJBTUVfRklFTERfUFJFRF9CSURJUkVDVCwKICAgIExJQl9JTlRFUkZBQ0UsCiAgICBGSUVMRF9JTlRSQSwKICAgIEZJRUxEX0ZPUldBUkQsCiAgICBGSUVMRF9GT1JXQVJEXzE2WDgsCiAgICBGSUVMRF9CQUNLV0FSRCwKICAgIEZJRUxEX0JBQ0tXQVJEXzE2WDgsCiAgICBGSUVMRF9CSURJUkVDVCwKICAgIEZJRUxEX0JJRElSRUNUXzE2WDgKfTsKCi8qIGlkY3QgdGFibGUgKi8KI2RlZmluZSBDMCAyMzE3MAojZGVmaW5lIEMxIDIyNzI1CiNkZWZpbmUgQzIgMjE0MDcKI2RlZmluZSBDMyAxOTI2NgojZGVmaW5lIEM0IDE2MzgzCiNkZWZpbmUgQzUgMTI4NzMKI2RlZmluZSBDNiA4ODY3CiNkZWZpbmUgQzcgNDUyMApjb25zdCB1aW50MzJfdCBpZGN0X3RhYmxlW10gPSB7CiAgICBDNCwgQzEsIEMyLCBDMywgQzQsIEM1LCBDNiwgQzcsICAgICAgICAgICAgIC8vZzUKICAgIEM0LCBDMSwgQzIsIEMzLCBDNCwgQzUsIEM2LCBDNywKICAgIEM0LCBDMywgQzYsLUM3LC1DNCwtQzEsLUMyLC1DNSwKICAgIEM0LCBDMywgQzYsLUM3LC1DNCwtQzEsLUMyLC1DNSwKICAgIEM0LCBDNSwtQzYsLUMxLC1DNCwgQzcsIEMyLCBDMywKICAgIEM0LCBDNSwtQzYsLUMxLC1DNCwgQzcsIEMyLCBDMywKICAgIEM0LCBDNywtQzIsLUM1LCBDNCwgQzMsLUM2LC1DMSwKICAgIEM0LCBDNywtQzIsLUM1LCBDNCwgQzMsLUM2LC1DMSwKICAgIEM0LC1DNywtQzIsIEM1LCBDNCwtQzMsLUM2LCBDMSwKICAgIEM0LC1DNywtQzIsIEM1LCBDNCwtQzMsLUM2LCBDMSwKICAgIEM0LC1DNSwtQzYsIEMxLC1DNCwtQzcsIEMyLC1DMywKICAgIEM0LC1DNSwtQzYsIEMxLC1DNCwtQzcsIEMyLC1DMywKICAgIEM0LC1DMywgQzYsIEM3LC1DNCwgQzEsLUMyLCBDNSwKICAgIEM0LC1DMywgQzYsIEM3LC1DNCwgQzEsLUMyLCBDNSwKICAgIEM0LC1DMSwgQzIsLUMzLCBDNCwtQzUsIEM2LC1DNywKICAgIEM0LC1DMSwgQzIsLUMzLCBDNCwtQzUsIEM2LC1DNyAgICAgICAgICAgICAgLy9nMjAKfTsKI3VuZGVmIEMwCiN1bmRlZiBDMQojdW5kZWYgQzIKI3VuZGVmIEMzCiN1bmRlZiBDNAojdW5kZWYgQzUKI3VuZGVmIEM2CiN1bmRlZiBDNwoKY29uc3QgdWludDMyX3QgemlnemFnX2RpcmVjdFs2NF0gPSB7CiAgICAwLCAgIDEsICA4LCAxNiwgIDksICAyLCAgMywgMTAsCiAgICAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCAgNCwgIDUsCiAgICAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCiAgICAyNywgMjAsIDEzLCAgNiwgIDcsIDE0LCAyMSwgMjgsCiAgICAzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsCiAgICAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsCiAgICA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsCiAgICA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKfTsKCnN0YXRpYyB1aW50MzJfdCBmcmFtZV9pbnRyYV9rZXJuZWxbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ludHJhLmc0YiIKfTsKc3RhdGljIHVpbnQzMl90IGZyYW1lX2ZyYW1lX3ByZWRfZm9yd2FyZF9rZXJuZWxbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ZyYW1lX3ByZWRfZm9yd2FyZC5nNGIiCn07CnN0YXRpYyB1aW50MzJfdCBmcmFtZV9mcmFtZV9wcmVkX2JhY2t3YXJkX2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZnJhbWVfZnJhbWVfcHJlZF9iYWNrd2FyZC5nNGIiCn07CnN0YXRpYyB1aW50MzJfdCBmcmFtZV9mcmFtZV9wcmVkX2JpZGlyZWN0X2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZnJhbWVfZnJhbWVfcHJlZF9iaWRpcmVjdC5nNGIiCn07CnN0YXRpYyB1aW50MzJfdCBmcmFtZV9maWVsZF9wcmVkX2ZvcndhcmRfa2VybmVsW11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9mcmFtZV9maWVsZF9wcmVkX2ZvcndhcmQuZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgZnJhbWVfZmllbGRfcHJlZF9iYWNrd2FyZF9rZXJuZWxbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ZpZWxkX3ByZWRfYmFja3dhcmQuZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgZnJhbWVfZmllbGRfcHJlZF9iaWRpcmVjdF9rZXJuZWxbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ZpZWxkX3ByZWRfYmlkaXJlY3QuZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgbGliX2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvbGliLmc0YiIKfTsKLypmaWVsZCBwaWN0dXJlKi8Kc3RhdGljIHVpbnQzMl90IGZpZWxkX2ludHJhX2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfaW50cmEuZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfZm9yd2FyZF9rZXJuZWxbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZpZWxkX2ZvcndhcmQuZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfZm9yd2FyZF8xNng4X2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfZm9yd2FyZF8xNng4Lmc0YiIKfTsKc3RhdGljIHVpbnQzMl90IGZpZWxkX2JhY2t3YXJkX2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfYmFja3dhcmQuZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfYmFja3dhcmRfMTZ4OF9rZXJuZWxbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZpZWxkX2JhY2t3YXJkXzE2eDguZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfYmlkaXJlY3Rfa2VybmVsW11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9maWVsZF9iaWRpcmVjdC5nNGIiCn07CnN0YXRpYyB1aW50MzJfdCBmaWVsZF9iaWRpcmVjdF8xNng4X2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfYmlkaXJlY3RfMTZ4OC5nNGIiCn07CgpzdGF0aWMgc3RydWN0IG1lZGlhX2tlcm5lbCAgbXBlZzJfdmxkX2tlcm5lbHNfZ2VuNFtdID0gewogICAgewogICAgICAgICJGUkFNRV9JTlRSQSIsCiAgICAgICAgRlJBTUVfSU5UUkEsCiAgICAgICAgZnJhbWVfaW50cmFfa2VybmVsLCAKICAgICAgICBzaXplb2YoZnJhbWVfaW50cmFfa2VybmVsKSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRlJBTUVfRlJBTUVfUFJFRF9GT1JXQVJEIiwKICAgIAlGUkFNRV9GUkFNRV9QUkVEX0ZPUldBUkQsCiAgICAgICAgZnJhbWVfZnJhbWVfcHJlZF9mb3J3YXJkX2tlcm5lbCwgCiAgICAgICAgc2l6ZW9mKGZyYW1lX2ZyYW1lX3ByZWRfZm9yd2FyZF9rZXJuZWwpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGUkFNRV9GUkFNRV9QUkVEX0JBQ0tXQVJEIiwKICAgICAgICBGUkFNRV9GUkFNRV9QUkVEX0JBQ0tXQVJELAogICAgICAgIGZyYW1lX2ZyYW1lX3ByZWRfYmFja3dhcmRfa2VybmVsLCAKICAgICAgICBzaXplb2YoZnJhbWVfZnJhbWVfcHJlZF9iYWNrd2FyZF9rZXJuZWwpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgeyAgIAogICAgICAgICJGUkFNRV9GUkFNRV9QUkVEX0JJRElSRUNUIiwKICAgICAgICBGUkFNRV9GUkFNRV9QUkVEX0JJRElSRUNULAogICAgICAgIGZyYW1lX2ZyYW1lX3ByZWRfYmlkaXJlY3Rfa2VybmVsLCAKICAgICAgICBzaXplb2YoZnJhbWVfZnJhbWVfcHJlZF9iaWRpcmVjdF9rZXJuZWwpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGUkFNRV9GSUVMRF9QUkVEX0ZPUldBUkQiLAogICAgICAgIEZSQU1FX0ZJRUxEX1BSRURfRk9SV0FSRCwKICAgICAgICBmcmFtZV9maWVsZF9wcmVkX2ZvcndhcmRfa2VybmVsLCAKICAgICAgICBzaXplb2YoZnJhbWVfZmllbGRfcHJlZF9mb3J3YXJkX2tlcm5lbCksCiAgICAgICAgTlVMTAogICAgfSwKCiAgICB7CiAgICAgICAgIkZSQU1FX0ZJRUxEX1BSRURfQkFDS1dBUkQiLAogICAgICAgIEZSQU1FX0ZJRUxEX1BSRURfQkFDS1dBUkQsCiAgICAgICAgZnJhbWVfZmllbGRfcHJlZF9iYWNrd2FyZF9rZXJuZWwsIAogICAgICAgIHNpemVvZihmcmFtZV9maWVsZF9wcmVkX2JhY2t3YXJkX2tlcm5lbCksCiAgICAgICAgTlVMTAogICAgfSwKCiAgICB7CiAgICAgICAgIkZSQU1FX0ZJRUxEX1BSRURfQklESVJFQ1QiLAogICAgICAgIEZSQU1FX0ZJRUxEX1BSRURfQklESVJFQ1QsCiAgICAgICAgZnJhbWVfZmllbGRfcHJlZF9iaWRpcmVjdF9rZXJuZWwsIAogICAgICAgIHNpemVvZihmcmFtZV9maWVsZF9wcmVkX2JpZGlyZWN0X2tlcm5lbCksCiAgICAgICAgTlVMTAogICAgfSwKICAgIAogICAgeyAgIAogICAgICAgICJMSUIiLAogICAgICAgIExJQl9JTlRFUkZBQ0UsCiAgICAgICAgbGliX2tlcm5lbCwgCiAgICAgICAgc2l6ZW9mKGxpYl9rZXJuZWwpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGSUVMRF9JTlRSQSIsCiAgICAgICAgRklFTERfSU5UUkEsCiAgICAgICAgZmllbGRfaW50cmFfa2VybmVsLCAKICAgICAgICBzaXplb2YoZmllbGRfaW50cmFfa2VybmVsKSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfRk9SV0FSRCIsCiAgICAgICAgRklFTERfRk9SV0FSRCwKICAgICAgICBmaWVsZF9mb3J3YXJkX2tlcm5lbCwgCiAgICAgICAgc2l6ZW9mKGZpZWxkX2ZvcndhcmRfa2VybmVsKSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfRk9SV0FSRF8xNlg4IiwKICAgICAgICBGSUVMRF9GT1JXQVJEXzE2WDgsCiAgICAgICAgZmllbGRfZm9yd2FyZF8xNng4X2tlcm5lbCwgCiAgICAgICAgc2l6ZW9mKGZpZWxkX2ZvcndhcmRfMTZ4OF9rZXJuZWwpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGSUVMRF9CQUNLV0FSRCIsCiAgICAgICAgRklFTERfQkFDS1dBUkQsCiAgICAgICAgZmllbGRfYmFja3dhcmRfa2VybmVsLCAKICAgICAgICBzaXplb2YoZmllbGRfYmFja3dhcmRfa2VybmVsKSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfQkFDS1dBUkRfMTZYOCIsCiAgICAgICAgRklFTERfQkFDS1dBUkRfMTZYOCwKICAgICAgICBmaWVsZF9iYWNrd2FyZF8xNng4X2tlcm5lbCwgCiAgICAgICAgc2l6ZW9mKGZpZWxkX2JhY2t3YXJkXzE2eDhfa2VybmVsKSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfQklESVJFQ1QiLAogICAgICAgIEZJRUxEX0JJRElSRUNULAogICAgICAgIGZpZWxkX2JpZGlyZWN0X2tlcm5lbCwgCiAgICAgICAgc2l6ZW9mKGZpZWxkX2JpZGlyZWN0X2tlcm5lbCksCiAgICAgICAgTlVMTAogICAgfSwKCiAgICB7CiAgICAgICAgIkZJRUxEX0JJRElSRUNUXzE2WDgiLAogICAgICAgIEZJRUxEX0JJRElSRUNUXzE2WDgsCiAgICAgICAgZmllbGRfYmlkaXJlY3RfMTZ4OF9rZXJuZWwsIAogICAgICAgIHNpemVvZihmaWVsZF9iaWRpcmVjdF8xNng4X2tlcm5lbCksCiAgICAgICAgTlVMTAogICAgfQp9OwoKLyogT24gSVJPTkxBS0UgKi8Kc3RhdGljIHVpbnQzMl90IGZyYW1lX2ludHJhX2tlcm5lbF9nZW41W11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9mcmFtZV9pbnRyYS5nNGIuZ2VuNSIKfTsKc3RhdGljIHVpbnQzMl90IGZyYW1lX2ZyYW1lX3ByZWRfZm9yd2FyZF9rZXJuZWxfZ2VuNVtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZnJhbWVfZnJhbWVfcHJlZF9mb3J3YXJkLmc0Yi5nZW41Igp9OwpzdGF0aWMgdWludDMyX3QgZnJhbWVfZnJhbWVfcHJlZF9iYWNrd2FyZF9rZXJuZWxfZ2VuNVtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZnJhbWVfZnJhbWVfcHJlZF9iYWNrd2FyZC5nNGIuZ2VuNSIKfTsKc3RhdGljIHVpbnQzMl90IGZyYW1lX2ZyYW1lX3ByZWRfYmlkaXJlY3Rfa2VybmVsX2dlbjVbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ZyYW1lX3ByZWRfYmlkaXJlY3QuZzRiLmdlbjUiCn07CnN0YXRpYyB1aW50MzJfdCBmcmFtZV9maWVsZF9wcmVkX2ZvcndhcmRfa2VybmVsX2dlbjVbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ZpZWxkX3ByZWRfZm9yd2FyZC5nNGIuZ2VuNSIKfTsKc3RhdGljIHVpbnQzMl90IGZyYW1lX2ZpZWxkX3ByZWRfYmFja3dhcmRfa2VybmVsX2dlbjVbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ZpZWxkX3ByZWRfYmFja3dhcmQuZzRiLmdlbjUiCn07CnN0YXRpYyB1aW50MzJfdCBmcmFtZV9maWVsZF9wcmVkX2JpZGlyZWN0X2tlcm5lbF9nZW41W11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9mcmFtZV9maWVsZF9wcmVkX2JpZGlyZWN0Lmc0Yi5nZW41Igp9OwpzdGF0aWMgdWludDMyX3QgbGliX2tlcm5lbF9nZW41W11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9saWIuZzRiLmdlbjUiCn07Ci8qZmllbGQgcGljdHVyZSovCnN0YXRpYyB1aW50MzJfdCBmaWVsZF9pbnRyYV9rZXJuZWxfZ2VuNVtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfaW50cmEuZzRiLmdlbjUiCn07CnN0YXRpYyB1aW50MzJfdCBmaWVsZF9mb3J3YXJkX2tlcm5lbF9nZW41W11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9maWVsZF9mb3J3YXJkLmc0Yi5nZW41Igp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfZm9yd2FyZF8xNng4X2tlcm5lbF9nZW41W11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9maWVsZF9mb3J3YXJkXzE2eDguZzRiLmdlbjUiCn07CnN0YXRpYyB1aW50MzJfdCBmaWVsZF9iYWNrd2FyZF9rZXJuZWxfZ2VuNVtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfYmFja3dhcmQuZzRiLmdlbjUiCn07CnN0YXRpYyB1aW50MzJfdCBmaWVsZF9iYWNrd2FyZF8xNng4X2tlcm5lbF9nZW41W11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9maWVsZF9iYWNrd2FyZF8xNng4Lmc0Yi5nZW41Igp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfYmlkaXJlY3Rfa2VybmVsX2dlbjVbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZpZWxkX2JpZGlyZWN0Lmc0Yi5nZW41Igp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfYmlkaXJlY3RfMTZ4OF9rZXJuZWxfZ2VuNVtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfYmlkaXJlY3RfMTZ4OC5nNGIuZ2VuNSIKfTsKCnN0YXRpYyBzdHJ1Y3QgbWVkaWFfa2VybmVsICBtcGVnMl92bGRfa2VybmVsc19nZW41W10gPSB7CiAgICB7CiAgICAgICAgIkZSQU1FX0lOVFJBIiwKICAgICAgICBGUkFNRV9JTlRSQSwKICAgICAgICBmcmFtZV9pbnRyYV9rZXJuZWxfZ2VuNSwgCiAgICAgICAgc2l6ZW9mKGZyYW1lX2ludHJhX2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRlJBTUVfRlJBTUVfUFJFRF9GT1JXQVJEIiwKICAgIAlGUkFNRV9GUkFNRV9QUkVEX0ZPUldBUkQsCiAgICAgICAgZnJhbWVfZnJhbWVfcHJlZF9mb3J3YXJkX2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZnJhbWVfZnJhbWVfcHJlZF9mb3J3YXJkX2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRlJBTUVfRlJBTUVfUFJFRF9CQUNLV0FSRCIsCiAgICAgICAgRlJBTUVfRlJBTUVfUFJFRF9CQUNLV0FSRCwKICAgICAgICBmcmFtZV9mcmFtZV9wcmVkX2JhY2t3YXJkX2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZnJhbWVfZnJhbWVfcHJlZF9iYWNrd2FyZF9rZXJuZWxfZ2VuNSksCiAgICAgICAgTlVMTAogICAgfSwKCiAgICB7ICAgCiAgICAgICAgIkZSQU1FX0ZSQU1FX1BSRURfQklESVJFQ1QiLAogICAgICAgIEZSQU1FX0ZSQU1FX1BSRURfQklESVJFQ1QsCiAgICAgICAgZnJhbWVfZnJhbWVfcHJlZF9iaWRpcmVjdF9rZXJuZWxfZ2VuNSwgCiAgICAgICAgc2l6ZW9mKGZyYW1lX2ZyYW1lX3ByZWRfYmlkaXJlY3Rfa2VybmVsX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGUkFNRV9GSUVMRF9QUkVEX0ZPUldBUkQiLAogICAgICAgIEZSQU1FX0ZJRUxEX1BSRURfRk9SV0FSRCwKICAgICAgICBmcmFtZV9maWVsZF9wcmVkX2ZvcndhcmRfa2VybmVsX2dlbjUsIAogICAgICAgIHNpemVvZihmcmFtZV9maWVsZF9wcmVkX2ZvcndhcmRfa2VybmVsX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGUkFNRV9GSUVMRF9QUkVEX0JBQ0tXQVJEIiwKICAgICAgICBGUkFNRV9GSUVMRF9QUkVEX0JBQ0tXQVJELAogICAgICAgIGZyYW1lX2ZpZWxkX3ByZWRfYmFja3dhcmRfa2VybmVsX2dlbjUsIAogICAgICAgIHNpemVvZihmcmFtZV9maWVsZF9wcmVkX2JhY2t3YXJkX2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRlJBTUVfRklFTERfUFJFRF9CSURJUkVDVCIsCiAgICAgICAgRlJBTUVfRklFTERfUFJFRF9CSURJUkVDVCwKICAgICAgICBmcmFtZV9maWVsZF9wcmVkX2JpZGlyZWN0X2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZnJhbWVfZmllbGRfcHJlZF9iaWRpcmVjdF9rZXJuZWxfZ2VuNSksCiAgICAgICAgTlVMTAogICAgfSwKICAgIAogICAgeyAgIAogICAgICAgICJMSUIiLAogICAgICAgIExJQl9JTlRFUkZBQ0UsCiAgICAgICAgbGliX2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YobGliX2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfSU5UUkEiLAogICAgICAgIEZJRUxEX0lOVFJBLAogICAgICAgIGZpZWxkX2ludHJhX2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZmllbGRfaW50cmFfa2VybmVsX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGSUVMRF9GT1JXQVJEIiwKICAgICAgICBGSUVMRF9GT1JXQVJELAogICAgICAgIGZpZWxkX2ZvcndhcmRfa2VybmVsX2dlbjUsIAogICAgICAgIHNpemVvZihmaWVsZF9mb3J3YXJkX2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfRk9SV0FSRF8xNlg4IiwKICAgICAgICBGSUVMRF9GT1JXQVJEXzE2WDgsCiAgICAgICAgZmllbGRfZm9yd2FyZF8xNng4X2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZmllbGRfZm9yd2FyZF8xNng4X2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfQkFDS1dBUkQiLAogICAgICAgIEZJRUxEX0JBQ0tXQVJELAogICAgICAgIGZpZWxkX2JhY2t3YXJkX2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZmllbGRfYmFja3dhcmRfa2VybmVsX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGSUVMRF9CQUNLV0FSRF8xNlg4IiwKICAgICAgICBGSUVMRF9CQUNLV0FSRF8xNlg4LAogICAgICAgIGZpZWxkX2JhY2t3YXJkXzE2eDhfa2VybmVsX2dlbjUsIAogICAgICAgIHNpemVvZihmaWVsZF9iYWNrd2FyZF8xNng4X2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfQklESVJFQ1QiLAogICAgICAgIEZJRUxEX0JJRElSRUNULAogICAgICAgIGZpZWxkX2JpZGlyZWN0X2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZmllbGRfYmlkaXJlY3Rfa2VybmVsX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGSUVMRF9CSURJUkVDVF8xNlg4IiwKICAgICAgICBGSUVMRF9CSURJUkVDVF8xNlg4LAogICAgICAgIGZpZWxkX2JpZGlyZWN0XzE2eDhfa2VybmVsX2dlbjUsIAogICAgICAgIHNpemVvZihmaWVsZF9iaWRpcmVjdF8xNng4X2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9Cn07CgpzdGF0aWMgc3RydWN0IG1lZGlhX2tlcm5lbCAgKm1wZWcyX3ZsZF9rZXJuZWxzID0gTlVMTDsKCiNkZWZpbmUgTlVNX01QRUcyX1ZMRF9LRVJORUxTIChzaXplb2YobXBlZzJfdmxkX2tlcm5lbHNfZ2VuNCkvc2l6ZW9mKG1wZWcyX3ZsZF9rZXJuZWxzX2dlbjRbMF0pKQoKc3RhdGljIHZvaWQKaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3N0YXRlKFZBRHJpdmVyQ29udGV4dFAgY3R4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmplY3Rfc3VyZmFjZSAqb2JqX3N1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sIGlzX2RzdCwKCQkJICAgICAgIGludCB2ZXJ0X2xpbmVfc3RyaWRlLAoJCQkgICAgICAgaW50IHZlcnRfbGluZV9zdHJpZGVfb2ZzKQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsgIAogICAgc3RydWN0IGk5NjVfbWVkaWFfc3RhdGUgKm1lZGlhX3N0YXRlID0gJmk5NjUtPm1lZGlhX3N0YXRlOwogICAgc3RydWN0IGk5NjVfc3VyZmFjZV9zdGF0ZSAqc3M7CiAgICBkcmlfYm8gKmJvOwogICAgdWludDMyX3Qgd3JpdGVfZG9tYWluLCByZWFkX2RvbWFpbjsKCiAgICBibyA9IGRyaV9ib19hbGxvYyhpOTY1LT5pbnRlbC5idWZtZ3IsIAogICAgICAgICAgICAgICAgICAgICAgInN1cmZhY2Ugc3RhdGUiLCAKICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaTk2NV9zdXJmYWNlX3N0YXRlKSwgMzIpOwogICAgYXNzZXJ0KGJvKTsKICAgIGRyaV9ib19tYXAoYm8sIDEpOwogICAgYXNzZXJ0KGJvLT52aXJ0dWFsKTsKICAgIHNzID0gYm8tPnZpcnR1YWw7CiAgICBtZW1zZXQoc3MsIDAsIHNpemVvZigqc3MpKTsKICAgIHNzLT5zczAuc3VyZmFjZV90eXBlID0gSTk2NV9TVVJGQUNFXzJEOwogICAgc3MtPnNzMC5zdXJmYWNlX2Zvcm1hdCA9IEk5NjVfU1VSRkFDRUZPUk1BVF9SOF9TSU5UOwogICAgc3MtPnNzMC52ZXJ0X2xpbmVfc3RyaWRlID0gdmVydF9saW5lX3N0cmlkZTsKICAgIHNzLT5zczAudmVydF9saW5lX3N0cmlkZV9vZnMgPSB2ZXJ0X2xpbmVfc3RyaWRlX29mczsKICAgIHNzLT5zczEuYmFzZV9hZGRyID0gb2JqX3N1cmZhY2UtPmJvLT5vZmZzZXQgKyBvZmZzZXQ7CiAgICBzcy0+c3MyLndpZHRoID0gdyAtIDE7CiAgICBzcy0+c3MyLmhlaWdodCA9IGggLSAxOwogICAgc3MtPnNzMy5waXRjaCA9IHcgLSAxOwoKICAgIGlmIChpc19kc3QpIHsKICAgICAgICB3cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOwogICAgICAgIHJlYWRfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKICAgIH0gZWxzZSB7CiAgICAgICAgd3JpdGVfZG9tYWluID0gMDsKICAgICAgICByZWFkX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9TQU1QTEVSOwogICAgfQoKICAgIGRyaV9ib19lbWl0X3JlbG9jKGJvLAogICAgICAgICAgICAgICAgICAgICAgcmVhZF9kb21haW4sIHdyaXRlX2RvbWFpbiwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHN0cnVjdCBpOTY1X3N1cmZhY2Vfc3RhdGUsIHNzMSksCiAgICAgICAgICAgICAgICAgICAgICBvYmpfc3VyZmFjZS0+Ym8pOwogICAgZHJpX2JvX3VubWFwKGJvKTsKCiAgICBhc3NlcnQoaW5kZXggPCBNQVhfTUVESUFfU1VSRkFDRVMpOwovLyAgICBhc3NlcnQobWVkaWFfc3RhdGUtPnN1cmZhY2Vfc3RhdGVbaW5kZXhdLmJvID09IE5VTEwpOwogICAgbWVkaWFfc3RhdGUtPnN1cmZhY2Vfc3RhdGVbaW5kZXhdLmJvID0gYm87Cn0KCnN0YXRpYyB2b2lkCmk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZV9zZXR1cChWQURyaXZlckNvbnRleHRQIGN0eCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZV9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmplY3Rfc3VyZmFjZSAqb2JqX3N1cmZhY2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbCBpc19kc3QsIAoJCQkgICAgICAgaW50IHBpY3R1cmVfc3RydWN0dXJlLAoJCQkgICAgICAgaW50IHN1cmZhY2UpCnsKICAgIGludCB3ID0gb2JqX3N1cmZhY2UtPndpZHRoOwogICAgaW50IGggPSBvYmpfc3VyZmFjZS0+aGVpZ2h0OwoKICAgIGlmIChvYmpfc3VyZmFjZS0+Ym8gPT0gTlVMTCkgewogICAgICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOyAgCiAgICAgICAgCiAgICAgICAgb2JqX3N1cmZhY2UtPmJvID0gZHJpX2JvX2FsbG9jKGk5NjUtPmludGVsLmJ1Zm1nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhYXBpIHN1cmZhY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpfc3VyZmFjZS0+c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwKTsKICAgIH0KCiAgICBpZiAocGljdHVyZV9zdHJ1Y3R1cmUgPT0gTVBFR19GUkFNRSkgewoJaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3N0YXRlKGN0eCwgYmFzZV9pbmRleCArIDAsIG9ial9zdXJmYWNlLAoJCQkJCTAsIHcsIGgsIAoJCQkJCWlzX2RzdCwgMCwgMCk7CglpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc3RhdGUoY3R4LCBiYXNlX2luZGV4ICsgMSwgb2JqX3N1cmZhY2UsCgkJCQkJdyAqIGgsIHcgLyAyLCBoIC8gMiwgCgkJCQkJaXNfZHN0LCAwLCAwKTsKCWk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZV9zdGF0ZShjdHgsIGJhc2VfaW5kZXggKyAyLCBvYmpfc3VyZmFjZSwKCQkJCQl3ICogaCArIHcgKiBoIC8gNCwgdyAvIDIsIGggLyAyLCAKCQkJCQlpc19kc3QsIDAsIDApOwogICAgfSBlbHNlIHsKCWlmIChzdXJmYWNlID09IFNVUkZBQ0VfVEFSR0VUKSB7CgkgICAgaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3N0YXRlKGN0eCwgMywgb2JqX3N1cmZhY2UsCgkJCQkJICAgIDAsIHcsIGgsIAoJCQkJCSAgICBGYWxzZSwgMCwgMCk7CgkgICAgaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3N0YXRlKGN0eCwgMTAsIG9ial9zdXJmYWNlLAoJCQkJCSAgICB3ICogaCwgdyAvIDIsIGggLyAyLCAKCQkJCQkgICAgRmFsc2UsIDAsIDApOwoJICAgIGk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZV9zdGF0ZShjdHgsIDExLCBvYmpfc3VyZmFjZSwKCQkJCQkgICAgdyAqIGggKyB3ICogaCAvIDQsIHcgLyAyLCBoIC8gMiwgCgkJCQkJICAgIEZhbHNlLCAwLCAwKTsKCSAgICBpZiAocGljdHVyZV9zdHJ1Y3R1cmUgPT0gTVBFR19UT1BfRklFTEQpIHsKCQlpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc3RhdGUoY3R4LCBiYXNlX2luZGV4ICsgMCwgb2JqX3N1cmZhY2UsCgkJCQkJCTAsIHcsIGgsIAoJCQkJCQlUcnVlLCAxLCAwKTsKCQlpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc3RhdGUoY3R4LCBiYXNlX2luZGV4ICsgMSwgb2JqX3N1cmZhY2UsCgkJCQkJCXcgKiBoLCB3IC8gMiwgaCAvIDIsIAoJCQkJCQlUcnVlLCAxLCAwKTsKCQlpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc3RhdGUoY3R4LCBiYXNlX2luZGV4ICsgMiwgb2JqX3N1cmZhY2UsCgkJCQkJCXcgKiBoICsgdyAqIGggLyA0LCB3IC8gMiwgaCAvIDIsIAoJCQkJCQlUcnVlLCAxLCAwKTsKCSAgICB9IGVsc2UgewoJCWFzc2VydChwaWN0dXJlX3N0cnVjdHVyZSA9PSBNUEVHX0JPVFRPTV9GSUVMRCk7CgkJaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3N0YXRlKGN0eCwgYmFzZV9pbmRleCArIDAsIG9ial9zdXJmYWNlLAoJCQkJCQkwLCB3LCBoLCAKCQkJCQkJVHJ1ZSwgMSwgMSk7CgkJaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3N0YXRlKGN0eCwgYmFzZV9pbmRleCArIDEsIG9ial9zdXJmYWNlLAoJCQkJCQl3ICogaCwgdyAvIDIsIGggLyAyLCAKCQkJCQkJVHJ1ZSwgMSwgMSk7CgkJaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3N0YXRlKGN0eCwgYmFzZV9pbmRleCArIDIsIG9ial9zdXJmYWNlLAoJCQkJCQl3ICogaCArIHcgKiBoIC8gNCwgdyAvIDIsIGggLyAyLCAKCQkJCQkJVHJ1ZSwgMSwgMSk7CgkgICAgfQoJfSBlbHNlIHsKCSAgICBpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc3RhdGUoY3R4LCBiYXNlX2luZGV4ICsgMCwgb2JqX3N1cmZhY2UsCgkJCQkJICAgIDAsIHcsIGgsIAoJCQkJCSAgICBpc19kc3QsIDAsIDApOwoJICAgIGk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZV9zdGF0ZShjdHgsIGJhc2VfaW5kZXggKyAxLCBvYmpfc3VyZmFjZSwKCQkJCQkgICAgdyAqIGgsIHcgLyAyLCBoIC8gMiwgCgkJCQkJICAgIGlzX2RzdCwgMCwgMCk7CgkgICAgaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3N0YXRlKGN0eCwgYmFzZV9pbmRleCArIDIsIG9ial9zdXJmYWNlLAoJCQkJCSAgICB3ICogaCArIHcgKiBoIC8gNCwgdyAvIDIsIGggLyAyLCAKCQkJCQkgICAgaXNfZHN0LCAwLCAwKTsKCX0KICAgIH0KfQoKdm9pZCAKaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlc19zZXR1cChWQURyaXZlckNvbnRleHRQIGN0eCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRlY29kZV9zdGF0ZSAqZGVjb2RlX3N0YXRlKQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsgIAogICAgc3RydWN0IG9iamVjdF9zdXJmYWNlICpvYmpfc3VyZmFjZTsKICAgIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlck1QRUcyICpwYXJhbTsKCiAgICBhc3NlcnQoZGVjb2RlX3N0YXRlLT5waWNfcGFyYW0gJiYgZGVjb2RlX3N0YXRlLT5waWNfcGFyYW0tPmJ1ZmZlcik7CiAgICBwYXJhbSA9IChWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqKWRlY29kZV9zdGF0ZS0+cGljX3BhcmFtLT5idWZmZXI7CgogICAgb2JqX3N1cmZhY2UgPSBTVVJGQUNFKGRlY29kZV9zdGF0ZS0+Y3VycmVudF9yZW5kZXJfdGFyZ2V0KTsKICAgIGFzc2VydChvYmpfc3VyZmFjZSk7CiAgICBpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc2V0dXAoY3R4LCAwLCBvYmpfc3VyZmFjZSwgVHJ1ZSwKCQlwYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMucGljdHVyZV9zdHJ1Y3R1cmUsIFNVUkZBQ0VfVEFSR0VUKTsKCiAgICBvYmpfc3VyZmFjZSA9IFNVUkZBQ0UocGFyYW0tPmZvcndhcmRfcmVmZXJlbmNlX3BpY3R1cmUpOwogICAgaWYgKCFvYmpfc3VyZmFjZSkgewovLyAgICAgICAgYXNzZXJ0KHBhcmFtLT5waWN0dXJlX2NvZGluZ190eXBlID09IDEpOyAvKiBJLXBpY3R1cmUgKi8KICAgIH0gZWxzZSB7CiAgICAgICAgaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3NldHVwKGN0eCwgNCwgb2JqX3N1cmZhY2UsIEZhbHNlLAoJCQlwYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMucGljdHVyZV9zdHJ1Y3R1cmUsIFNVUkZBQ0VfRk9SV0FSRCk7CiAgICAgICAgb2JqX3N1cmZhY2UgPSBTVVJGQUNFKHBhcmFtLT5iYWNrd2FyZF9yZWZlcmVuY2VfcGljdHVyZSk7CiAgICAgICAgaWYgKCFvYmpfc3VyZmFjZSkgewogICAgICAgICAgICBhc3NlcnQocGFyYW0tPnBpY3R1cmVfY29kaW5nX3R5cGUgPT0gMik7IC8qIFAtcGljdHVyZSAqLwoKICAgICAgICAgICAgb2JqX3N1cmZhY2UgPSBTVVJGQUNFKHBhcmFtLT5mb3J3YXJkX3JlZmVyZW5jZV9waWN0dXJlKTsKICAgICAgICAgICAgaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3NldHVwKGN0eCwgNywgb2JqX3N1cmZhY2UsIEZhbHNlLAoJCQkJcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLnBpY3R1cmVfc3RydWN0dXJlLCBTVVJGQUNFX0JBQ0tXQVJEKTsgICAgICAgICAgICAKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhc3NlcnQocGFyYW0tPnBpY3R1cmVfY29kaW5nX3R5cGUgPT0gMyk7IC8qIEItcGljdHVyZSAqLwogICAgICAgICAgICBpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc2V0dXAoY3R4LCA3LCBvYmpfc3VyZmFjZSwgRmFsc2UsCgkJCQlwYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMucGljdHVyZV9zdHJ1Y3R1cmUsIFNVUkZBQ0VfQklESVJFQ1QpOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQKaTk2NV9tZWRpYV9tcGVnMl9iaW5kaW5nX3RhYmxlKFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBpOTY1X21lZGlhX3N0YXRlICptZWRpYV9zdGF0ZSA9ICZpOTY1LT5tZWRpYV9zdGF0ZTsKICAgIGludCBpOwogICAgdW5zaWduZWQgaW50ICpiaW5kaW5nX3RhYmxlOwogICAgZHJpX2JvICpibyA9IG1lZGlhX3N0YXRlLT5iaW5kaW5nX3RhYmxlLmJvOwoKICAgIGRyaV9ib19tYXAoYm8sIDEpOwogICAgYXNzZXJ0KGJvLT52aXJ0dWFsKTsKICAgIGJpbmRpbmdfdGFibGUgPSBiby0+dmlydHVhbDsKICAgIG1lbXNldChiaW5kaW5nX3RhYmxlLCAwLCBiby0+c2l6ZSk7CgogICAgZm9yIChpID0gMDsgaSA8IE1BWF9NRURJQV9TVVJGQUNFUzsgaSsrKSB7CiAgICAgICAgaWYgKG1lZGlhX3N0YXRlLT5zdXJmYWNlX3N0YXRlW2ldLmJvKSB7CiAgICAgICAgICAgIGJpbmRpbmdfdGFibGVbaV0gPSBtZWRpYV9zdGF0ZS0+c3VyZmFjZV9zdGF0ZVtpXS5iby0+b2Zmc2V0OwogICAgICAgICAgICBkcmlfYm9fZW1pdF9yZWxvYyhibywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICogc2l6ZW9mKCpiaW5kaW5nX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfc3RhdGUtPnN1cmZhY2Vfc3RhdGVbaV0uYm8pOwogICAgICAgIH0KICAgIH0KCiAgICBkcmlfYm9fdW5tYXAobWVkaWFfc3RhdGUtPmJpbmRpbmdfdGFibGUuYm8pOwp9CgpzdGF0aWMgdm9pZAppOTY1X21lZGlhX21wZWcyX3ZmZV9zdGF0ZShWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9tZWRpYV9zdGF0ZSAqbWVkaWFfc3RhdGUgPSAmaTk2NS0+bWVkaWFfc3RhdGU7CiAgICBzdHJ1Y3QgaTk2NV92ZmVfc3RhdGUgKnZmZV9zdGF0ZTsKICAgIGRyaV9ibyAqYm87CgogICAgYm8gPSBtZWRpYV9zdGF0ZS0+dmZlX3N0YXRlLmJvOwogICAgZHJpX2JvX21hcChibywgMSk7CiAgICBhc3NlcnQoYm8tPnZpcnR1YWwpOwogICAgdmZlX3N0YXRlID0gYm8tPnZpcnR1YWw7CiAgICBtZW1zZXQodmZlX3N0YXRlLCAwLCBzaXplb2YoKnZmZV9zdGF0ZSkpOwogICAgdmZlX3N0YXRlLT52ZmUwLmV4dGVuZF92ZmVfc3RhdGVfcHJlc2VudCA9IDE7CiAgICB2ZmVfc3RhdGUtPnZmZTEudmZlX21vZGUgPSBWRkVfVkxEX01PREU7CiAgICB2ZmVfc3RhdGUtPnZmZTEubnVtX3VyYl9lbnRyaWVzID0gbWVkaWFfc3RhdGUtPnVyYi5udW1fdmZlX2VudHJpZXM7CiAgICB2ZmVfc3RhdGUtPnZmZTEuY2hpbGRyZW5fcHJlc2VudCA9IDA7CiAgICB2ZmVfc3RhdGUtPnZmZTEudXJiX2VudHJ5X2FsbG9jX3NpemUgPSBtZWRpYV9zdGF0ZS0+dXJiLnNpemVfdmZlX2VudHJ5IC0gMTsKICAgIHZmZV9zdGF0ZS0+dmZlMS5tYXhfdGhyZWFkcyA9IG1lZGlhX3N0YXRlLT51cmIubnVtX3ZmZV9lbnRyaWVzIC0gMTsKICAgIHZmZV9zdGF0ZS0+dmZlMi5pbnRlcmZhY2VfZGVzY3JpcHRvcl9iYXNlID0gCiAgICAgICAgbWVkaWFfc3RhdGUtPmlkcnQuYm8tPm9mZnNldCA+PiA0OyAvKiByZWxvYyAqLwogICAgZHJpX2JvX2VtaXRfcmVsb2MoYm8sCiAgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsCiAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGk5NjVfdmZlX3N0YXRlLCB2ZmUyKSwKICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXRlLT5pZHJ0LmJvKTsKICAgIGRyaV9ib191bm1hcChibyk7Cn0KCnN0YXRpYyB2b2lkIAppOTY1X21lZGlhX21wZWcyX2ludGVyZmFjZV9kZXNjcmlwdG9yX3JlbWFwX3RhYmxlKFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBpOTY1X21lZGlhX3N0YXRlICptZWRpYV9zdGF0ZSA9ICZpOTY1LT5tZWRpYV9zdGF0ZTsKICAgIHN0cnVjdCBpOTY1X2ludGVyZmFjZV9kZXNjcmlwdG9yICpkZXNjOwogICAgaW50IGk7CiAgICBkcmlfYm8gKmJvOwoKICAgIGJvID0gbWVkaWFfc3RhdGUtPmlkcnQuYm87CiAgICBkcmlfYm9fbWFwKGJvLCAxKTsKICAgIGFzc2VydChiby0+dmlydHVhbCk7CiAgICBkZXNjID0gYm8tPnZpcnR1YWw7CgogICAgZm9yIChpID0gMDsgaSA8IE5VTV9NUEVHMl9WTERfS0VSTkVMUzsgaSsrKSB7CiAgICAgICAgbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOwogICAgICAgIGRlc2MtPmRlc2MwLmdyZl9yZWdfYmxvY2tzID0gMTU7CiAgICAgICAgZGVzYy0+ZGVzYzAua2VybmVsX3N0YXJ0X3BvaW50ZXIgPSBtcGVnMl92bGRfa2VybmVsc1tpXS5iby0+b2Zmc2V0ID4+IDY7IC8qIHJlbG9jICovCiAgICAgICAgZGVzYy0+ZGVzYzEuY29uc3RfdXJiX2VudHJ5X3JlYWRfb2Zmc2V0ID0gMDsKICAgICAgICBkZXNjLT5kZXNjMS5jb25zdF91cmJfZW50cnlfcmVhZF9sZW4gPSAzMDsKICAgICAgICBkZXNjLT5kZXNjMy5iaW5kaW5nX3RhYmxlX2VudHJ5X2NvdW50ID0gMDsKICAgICAgICBkZXNjLT5kZXNjMy5iaW5kaW5nX3RhYmxlX3BvaW50ZXIgPSAKICAgICAgICAgICAgbWVkaWFfc3RhdGUtPmJpbmRpbmdfdGFibGUuYm8tPm9mZnNldCA+PiA1OyAvKnJlbG9jICovCgogICAgICAgIGRyaV9ib19lbWl0X3JlbG9jKGJvLAogICAgICAgICAgICAgICAgICAgICAgICAgIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5kZXNjMC5ncmZfcmVnX2Jsb2NrcywKICAgICAgICAgICAgICAgICAgICAgICAgICBpICogc2l6ZW9mKCpkZXNjKSArIG9mZnNldG9mKHN0cnVjdCBpOTY1X2ludGVyZmFjZV9kZXNjcmlwdG9yLCBkZXNjMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzJfdmxkX2tlcm5lbHNbaV0uYm8pOwoKICAgICAgICBkcmlfYm9fZW1pdF9yZWxvYyhibywKICAgICAgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+ZGVzYzMuYmluZGluZ190YWJsZV9lbnRyeV9jb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICBpICogc2l6ZW9mKCpkZXNjKSArIG9mZnNldG9mKHN0cnVjdCBpOTY1X2ludGVyZmFjZV9kZXNjcmlwdG9yLCBkZXNjMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfc3RhdGUtPmJpbmRpbmdfdGFibGUuYm8pOwogICAgICAgIGRlc2MrKzsKICAgIH0KCiAgICBkcmlfYm9fdW5tYXAoYm8pOwp9Cgp2b2lkCmk5NjVfbWVkaWFfbXBlZzJfdmxkX3N0YXRlKFZBRHJpdmVyQ29udGV4dFAgY3R4LCBzdHJ1Y3QgZGVjb2RlX3N0YXRlICpkZWNvZGVfc3RhdGUpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfbWVkaWFfc3RhdGUgKm1lZGlhX3N0YXRlID0gJmk5NjUtPm1lZGlhX3N0YXRlOwogICAgc3RydWN0IGk5NjVfdmxkX3N0YXRlICp2bGRfc3RhdGU7CiAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqcGFyYW07CgogICAgYXNzZXJ0KGRlY29kZV9zdGF0ZS0+cGljX3BhcmFtICYmIGRlY29kZV9zdGF0ZS0+cGljX3BhcmFtLT5idWZmZXIpOwogICAgcGFyYW0gPSAoVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyTVBFRzIgKilkZWNvZGVfc3RhdGUtPnBpY19wYXJhbS0+YnVmZmVyOwoKICAgIGFzc2VydChtZWRpYV9zdGF0ZS0+ZXh0ZW5kZWRfc3RhdGUuYm8pOwogICAgZHJpX2JvX21hcChtZWRpYV9zdGF0ZS0+ZXh0ZW5kZWRfc3RhdGUuYm8sIDEpOwogICAgYXNzZXJ0KG1lZGlhX3N0YXRlLT5leHRlbmRlZF9zdGF0ZS5iby0+dmlydHVhbCk7CiAgICB2bGRfc3RhdGUgPSBtZWRpYV9zdGF0ZS0+ZXh0ZW5kZWRfc3RhdGUuYm8tPnZpcnR1YWw7CiAgICBtZW1zZXQodmxkX3N0YXRlLCAwLCBzaXplb2YoKnZsZF9zdGF0ZSkpOwoKICAgIHZsZF9zdGF0ZS0+dmxkMC5mX2NvZGVfMF8wID0gKChwYXJhbS0+Zl9jb2RlID4+IDEyKSAmIDB4Zik7CiAgICB2bGRfc3RhdGUtPnZsZDAuZl9jb2RlXzBfMSA9ICgocGFyYW0tPmZfY29kZSA+PiA4KSAmIDB4Zik7CiAgICB2bGRfc3RhdGUtPnZsZDAuZl9jb2RlXzFfMCA9ICgocGFyYW0tPmZfY29kZSA+PiA0KSAmIDB4Zik7CiAgICB2bGRfc3RhdGUtPnZsZDAuZl9jb2RlXzFfMSA9IChwYXJhbS0+Zl9jb2RlICYgMHhmKTsKICAgIHZsZF9zdGF0ZS0+dmxkMC5pbnRyYV9kY19wcmVjaXNpb24gPSBwYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMuaW50cmFfZGNfcHJlY2lzaW9uOwogICAgdmxkX3N0YXRlLT52bGQwLnBpY3R1cmVfc3RydWN0dXJlID0gcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLnBpY3R1cmVfc3RydWN0dXJlOwogICAgdmxkX3N0YXRlLT52bGQwLnRvcF9maWVsZF9maXJzdCA9IHBhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy50b3BfZmllbGRfZmlyc3Q7CiAgICB2bGRfc3RhdGUtPnZsZDAuZnJhbWVfcHJlZGljdF9mcmFtZV9kY3QgPSBwYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMuZnJhbWVfcHJlZF9mcmFtZV9kY3Q7CiAgICB2bGRfc3RhdGUtPnZsZDAuY29uY2VhbG1lbnRfbW90aW9uX3ZlY3RvciA9IHBhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5jb25jZWFsbWVudF9tb3Rpb25fdmVjdG9yczsKICAgIHZsZF9zdGF0ZS0+dmxkMC5xdWFudGl6ZXJfc2NhbGVfdHlwZSA9IHBhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5xX3NjYWxlX3R5cGU7CiAgICB2bGRfc3RhdGUtPnZsZDAuaW50cmFfdmxjX2Zvcm1hdCA9IHBhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5pbnRyYV92bGNfZm9ybWF0OwogICAgdmxkX3N0YXRlLT52bGQwLnNjYW5fb3JkZXIgPSBwYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMuYWx0ZXJuYXRlX3NjYW47CgogICAgdmxkX3N0YXRlLT52bGQxLnBpY3R1cmVfY29kaW5nX3R5cGUgPSBwYXJhbS0+cGljdHVyZV9jb2RpbmdfdHlwZTsKCiAgICBpZiAodmxkX3N0YXRlLT52bGQwLnBpY3R1cmVfc3RydWN0dXJlID09IE1QRUdfRlJBTUUpIHsKCS8qZnJhbWUgcGljdHVyZSovIAoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMC5pbmRleF8wID0gRlJBTUVfSU5UUkE7Cgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUwLmluZGV4XzEgPSBGUkFNRV9GUkFNRV9QUkVEX0ZPUldBUkQ7Cgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUwLmluZGV4XzIgPSBGUkFNRV9GSUVMRF9QUkVEX0ZPUldBUkQ7Cgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUwLmluZGV4XzMgPSBGUkFNRV9GSUVMRF9QUkVEX0JJRElSRUNUOyAvKiBkdWFsIHByaW1lICovCgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUwLmluZGV4XzQgPSBGUkFNRV9GUkFNRV9QUkVEX0JBQ0tXQVJEOwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMC5pbmRleF81ID0gRlJBTUVfRklFTERfUFJFRF9CQUNLV0FSRDsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfNiA9IEZSQU1FX0ZSQU1FX1BSRURfQklESVJFQ1Q7Cgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUwLmluZGV4XzcgPSBGUkFNRV9GSUVMRF9QUkVEX0JJRElSRUNUOwoKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTEuaW5kZXhfOCA9IEZSQU1FX0lOVFJBOwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMS5pbmRleF85ID0gRlJBTUVfRlJBTUVfUFJFRF9GT1JXQVJEOwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMS5pbmRleF8xMCA9IEZSQU1FX0ZJRUxEX1BSRURfRk9SV0FSRDsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTEuaW5kZXhfMTEgPSBGUkFNRV9GSUVMRF9QUkVEX0JJRElSRUNUOwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMS5pbmRleF8xMiA9IEZSQU1FX0ZSQU1FX1BSRURfQkFDS1dBUkQ7Cgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUxLmluZGV4XzEzID0gRlJBTUVfRklFTERfUFJFRF9CQUNLV0FSRDsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTEuaW5kZXhfMTQgPSBGUkFNRV9GUkFNRV9QUkVEX0JJRElSRUNUOwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMS5pbmRleF8xNSA9IEZSQU1FX0ZJRUxEX1BSRURfQklESVJFQ1Q7CiAgICB9IGVsc2UgewoJLypmaWVsZCBwaWN0dXJlKi8KCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfMCA9IEZJRUxEX0lOVFJBOwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMC5pbmRleF8xID0gRklFTERfRk9SV0FSRDsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfMiA9IEZJRUxEX0ZPUldBUkRfMTZYODsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfMyA9IEZJRUxEX0JJRElSRUNUOyAvKiBkdWFsIHByaW1lICovCgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUwLmluZGV4XzQgPSBGSUVMRF9CQUNLV0FSRDsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfNSA9IEZJRUxEX0JBQ0tXQVJEXzE2WDg7Cgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUwLmluZGV4XzYgPSBGSUVMRF9CSURJUkVDVDsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfNyA9IEZJRUxEX0JJRElSRUNUXzE2WDg7CiAgICB9CgogICAgZHJpX2JvX3VubWFwKG1lZGlhX3N0YXRlLT5leHRlbmRlZF9zdGF0ZS5ibyk7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfbWVkaWFfbXBlZzJfdXBsb2FkX2NvbnN0YW50cyhWQURyaXZlckNvbnRleHRQIGN0eCwgc3RydWN0IGRlY29kZV9zdGF0ZSAqZGVjb2RlX3N0YXRlKQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBpOTY1X21lZGlhX3N0YXRlICptZWRpYV9zdGF0ZSA9ICZpOTY1LT5tZWRpYV9zdGF0ZTsKICAgIGludCBpLCBqOwogICAgdW5zaWduZWQgY2hhciAqY29uc3RhbnRfYnVmZmVyOwogICAgdW5zaWduZWQgY2hhciAqcW14OwogICAgdW5zaWduZWQgaW50ICpsaWJfcmVsb2M7CiAgICBpbnQgbGliX3JlbG9jX29mZnNldCA9IDA7CgogICAgZHJpX2JvX21hcChtZWRpYV9zdGF0ZS0+Y3VyYmUuYm8sIDEpOwogICAgYXNzZXJ0KG1lZGlhX3N0YXRlLT5jdXJiZS5iby0+dmlydHVhbCk7CiAgICBjb25zdGFudF9idWZmZXIgPSBtZWRpYV9zdGF0ZS0+Y3VyYmUuYm8tPnZpcnR1YWw7CgogICAgLyogaXFfbWF0cml4ICovCiAgICBpZiAoZGVjb2RlX3N0YXRlLT5pcV9tYXRyaXggJiYgZGVjb2RlX3N0YXRlLT5pcV9tYXRyaXgtPmJ1ZmZlcikgewogICAgICAgIFZBSVFNYXRyaXhCdWZmZXJNUEVHMiAqaXFfbWF0cml4ID0gKFZBSVFNYXRyaXhCdWZmZXJNUEVHMiAqKWRlY29kZV9zdGF0ZS0+aXFfbWF0cml4LT5idWZmZXI7CgogICAgICAgIC8qIFVwbG9hZCBxdWFudGlzYXRpb24gbWF0cml4IGluIHJvdy1tYWpvciBvcmRlci4gVGhlIG1wbGF5ZXIgdmFhcGkKICAgICAgICAgKiBwYXRjaCBwYXNzZXMgcXVhbnRpc2F0aW9uIG1hdHJpeCBpbiB6aWctemFnIG9yZGVyIHRvIHZhIGxpYnJhcnkuCiAgICAgICAgICogRG8gd2UgbmVlZCBhIGZsYWcgaW4gVkFJUU1hdHJpeEJ1ZmZlck1QRUcyIHRvIHNwZWNpZnkgdGhlIG9yZGVyCiAgICAgICAgICogb2YgdGhlIHF1YW50aXNhdGlvbiBtYXRyaXg/CiAgICAgICAgICovCiAgICAgICAgcW14ID0gY29uc3RhbnRfYnVmZmVyOwogICAgICAgIGlmIChpcV9tYXRyaXgtPmxvYWRfaW50cmFfcXVhbnRpc2VyX21hdHJpeCkgewogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewogICAgICAgICAgICAgICAgaiA9IHppZ3phZ19kaXJlY3RbaV07CiAgICAgICAgICAgICAgICBxbXhbal0gPSBpcV9tYXRyaXgtPmludHJhX3F1YW50aXNlcl9tYXRyaXhbaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHFteCA9IGNvbnN0YW50X2J1ZmZlciArIDY0OwogICAgICAgIGlmIChpcV9tYXRyaXgtPmxvYWRfbm9uX2ludHJhX3F1YW50aXNlcl9tYXRyaXgpIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKICAgICAgICAgICAgICAgIGogPSB6aWd6YWdfZGlyZWN0W2ldOwogICAgICAgICAgICAgICAgcW14W2pdID0gaXFfbWF0cml4LT5ub25faW50cmFfcXVhbnRpc2VyX21hdHJpeFtpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogbm8gY2hyb21hIHF1YW50aXNhdGlvbiBtYXRyaWNlcyBmb3IgNDoyOjAgZGF0YSAqLwogICAgfQoKICAgIC8qIGlkY3QgdGFibGUgKi8KICAgIG1lbWNweShjb25zdGFudF9idWZmZXIgKyAxMjgsIGlkY3RfdGFibGUsIHNpemVvZihpZGN0X3RhYmxlKSk7CgogICAgLyogaWRjdCBsaWIgcmVsb2MgKi8KICAgIGxpYl9yZWxvY19vZmZzZXQgPSAxMjggKyBzaXplb2YoaWRjdF90YWJsZSk7CiAgICBsaWJfcmVsb2MgPSAodW5zaWduZWQgaW50ICopKGNvbnN0YW50X2J1ZmZlciArIGxpYl9yZWxvY19vZmZzZXQpOwogICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogICAgICAgIGxpYl9yZWxvY1tpXSA9IG1wZWcyX3ZsZF9rZXJuZWxzW0xJQl9JTlRFUkZBQ0VdLmJvLT5vZmZzZXQ7CiAgICAgICAgZHJpX2JvX2VtaXRfcmVsb2MobWVkaWFfc3RhdGUtPmN1cmJlLmJvLAogICAgICAgICAgICAgICAgICAgICAgICAgIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxpYl9yZWxvY19vZmZzZXQgKyBpICogc2l6ZW9mKHVuc2lnbmVkIGludCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzJfdmxkX2tlcm5lbHNbTElCX0lOVEVSRkFDRV0uYm8pOwogICAgfQoKICAgIGRyaV9ib191bm1hcChtZWRpYV9zdGF0ZS0+Y3VyYmUuYm8pOwp9CgpzdGF0aWMgdm9pZAppOTY1X21lZGlhX21wZWcyX3N0YXRlc19zZXR1cChWQURyaXZlckNvbnRleHRQIGN0eCwgc3RydWN0IGRlY29kZV9zdGF0ZSAqZGVjb2RlX3N0YXRlKQp7CiAgICBpOTY1X21lZGlhX21wZWcyX3N1cmZhY2VzX3NldHVwKGN0eCwgZGVjb2RlX3N0YXRlKTsKICAgIGk5NjVfbWVkaWFfbXBlZzJfYmluZGluZ190YWJsZShjdHgpOwogICAgaTk2NV9tZWRpYV9tcGVnMl9pbnRlcmZhY2VfZGVzY3JpcHRvcl9yZW1hcF90YWJsZShjdHgpOwogICAgaTk2NV9tZWRpYV9tcGVnMl92bGRfc3RhdGUoY3R4LCBkZWNvZGVfc3RhdGUpOwogICAgaTk2NV9tZWRpYV9tcGVnMl92ZmVfc3RhdGUoY3R4KTsKICAgIGk5NjVfbWVkaWFfbXBlZzJfdXBsb2FkX2NvbnN0YW50cyhjdHgsIGRlY29kZV9zdGF0ZSk7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfbWVkaWFfbXBlZzJfb2JqZWN0cyhWQURyaXZlckNvbnRleHRQIGN0eCwgc3RydWN0IGRlY29kZV9zdGF0ZSAqZGVjb2RlX3N0YXRlKQp7CiAgICBpbnQgaSwgajsKICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqc2xpY2VfcGFyYW07CgogICAgZm9yIChqID0gMDsgaiA8IGRlY29kZV9zdGF0ZS0+bnVtX3NsaWNlX3BhcmFtczsgaisrKSB7CiAgICAgICAgYXNzZXJ0KGRlY29kZV9zdGF0ZS0+c2xpY2VfcGFyYW1zW2pdICYmIGRlY29kZV9zdGF0ZS0+c2xpY2VfcGFyYW1zW2pdLT5idWZmZXIpOwogICAgICAgIGFzc2VydChkZWNvZGVfc3RhdGUtPnNsaWNlX2RhdGFzW2pdICYmIGRlY29kZV9zdGF0ZS0+c2xpY2VfZGF0YXNbal0tPmJvKTsKICAgICAgICBzbGljZV9wYXJhbSA9IChWQVNsaWNlUGFyYW1ldGVyQnVmZmVyTVBFRzIgKilkZWNvZGVfc3RhdGUtPnNsaWNlX3BhcmFtc1tqXS0+YnVmZmVyOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGVjb2RlX3N0YXRlLT5zbGljZV9wYXJhbXNbal0tPm51bV9lbGVtZW50czsgaSsrKSB7CiAgICAgICAgICAgIGFzc2VydChzbGljZV9wYXJhbS0+c2xpY2VfZGF0YV9mbGFnID09IFZBX1NMSUNFX0RBVEFfRkxBR19BTEwpOwoKICAgICAgICAgICAgQkVHSU5fQkFUQ0goY3R4LCA2KTsKICAgICAgICAgICAgT1VUX0JBVENIKGN0eCwgQ01EX01FRElBX09CSkVDVCB8IDQpOwogICAgICAgICAgICBPVVRfQkFUQ0goY3R4LCAwKTsKICAgICAgICAgICAgT1VUX0JBVENIKGN0eCwgc2xpY2VfcGFyYW0tPnNsaWNlX2RhdGFfc2l6ZSAtIChzbGljZV9wYXJhbS0+bWFjcm9ibG9ja19vZmZzZXQgPj4gMykpOwogICAgICAgICAgICBPVVRfUkVMT0MoY3R4LCBkZWNvZGVfc3RhdGUtPnNsaWNlX2RhdGFzW2pdLT5ibywgCiAgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fU0FNUExFUiwgMCwgCiAgICAgICAgICAgICAgICAgICAgICBzbGljZV9wYXJhbS0+c2xpY2VfZGF0YV9vZmZzZXQgKyAoc2xpY2VfcGFyYW0tPm1hY3JvYmxvY2tfb2Zmc2V0ID4+IDMpKTsKICAgICAgICAgICAgT1VUX0JBVENIKGN0eCwgCiAgICAgICAgICAgICAgICAgICAgICAoKHNsaWNlX3BhcmFtLT5zbGljZV9ob3Jpem9udGFsX3Bvc2l0aW9uIDw8IDI0KSB8ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAoc2xpY2VfcGFyYW0tPnNsaWNlX3ZlcnRpY2FsX3Bvc2l0aW9uIDw8IDE2KSB8CiAgICAgICAgICAgICAgICAgICAgICAgKDEyNyA8PCA4KSB8IAogICAgICAgICAgICAgICAgICAgICAgIChzbGljZV9wYXJhbS0+bWFjcm9ibG9ja19vZmZzZXQgJiAweDcpKSk7CiAgICAgICAgICAgIE9VVF9CQVRDSChjdHgsIHNsaWNlX3BhcmFtLT5xdWFudGlzZXJfc2NhbGVfY29kZSA8PCAyNCk7CiAgICAgICAgICAgIEFEVkFOQ0VfQkFUQ0goY3R4KTsgICAgICAgICAgCiAgICAgICAgICAgIHNsaWNlX3BhcmFtKys7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZAppOTY1X21lZGlhX21wZWcyX2ZyZWVfcHJpdmF0ZV9jb250ZXh0KHZvaWQgKipkYXRhKQp7CiAgICBpbnQgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX01QRUcyX1ZMRF9LRVJORUxTOyBpKyspIHsKICAgICAgICBzdHJ1Y3QgbWVkaWFfa2VybmVsICprZXJuZWwgPSAmbXBlZzJfdmxkX2tlcm5lbHNbaV07CgogICAgICAgIGRyaV9ib191bnJlZmVyZW5jZShrZXJuZWwtPmJvKTsKICAgICAgICBrZXJuZWwtPmJvID0gTlVMTDsKICAgIH0KCiAgICBtcGVnMl92bGRfa2VybmVscyA9IE5VTEw7Cn0KCnZvaWQgCmk5NjVfbWVkaWFfbXBlZzJfZGVjb2RlX2luaXQoVkFEcml2ZXJDb250ZXh0UCBjdHgsIHN0cnVjdCBkZWNvZGVfc3RhdGUgKmRlY29kZV9zdGF0ZSkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9tZWRpYV9zdGF0ZSAqbWVkaWFfc3RhdGUgPSAmaTk2NS0+bWVkaWFfc3RhdGU7CiAgICBkcmlfYm8gKmJvOwogICAgaW50IGk7CiAgICBpZiAobXBlZzJfdmxkX2tlcm5lbHMgPT0gTlVMTCkgewogICAgICAgIC8qIGtlcm5lbCAqLwogICAgICAgIGFzc2VydChOVU1fTVBFRzJfVkxEX0tFUk5FTFMgPT0gKHNpemVvZihtcGVnMl92bGRfa2VybmVsc19nZW41KSAvIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtcGVnMl92bGRfa2VybmVsc19nZW41WzBdKSkpOwogICAgICAgIGFzc2VydChOVU1fTVBFRzJfVkxEX0tFUk5FTFMgPD0gTUFYX0lOVEVSRkFDRV9ERVNDKTsKCiAgICAgICAgaWYgKElTX0lST05MQUtFKGk5NjUtPmludGVsLmRldmljZV9pZCkpCiAgICAgICAgICAgIG1wZWcyX3ZsZF9rZXJuZWxzID0gbXBlZzJfdmxkX2tlcm5lbHNfZ2VuNTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIG1wZWcyX3ZsZF9rZXJuZWxzID0gbXBlZzJfdmxkX2tlcm5lbHNfZ2VuNDsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9NUEVHMl9WTERfS0VSTkVMUzsgaSsrKSB7CiAgICAgICAgICAgIHN0cnVjdCBtZWRpYV9rZXJuZWwgKmtlcm5lbCA9ICZtcGVnMl92bGRfa2VybmVsc1tpXTsKICAgICAgICAgICAga2VybmVsLT5ibyA9IGRyaV9ib19hbGxvYyhpOTY1LT5pbnRlbC5idWZtZ3IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbC0+bmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsLT5zaXplLCA2NCk7CiAgICAgICAgICAgIGFzc2VydChrZXJuZWwtPmJvKTsKICAgICAgICAgICAgZHJpX2JvX3N1YmRhdGEoa2VybmVsLT5ibywgMCwga2VybmVsLT5zaXplLCBrZXJuZWwtPmJpbik7CiAgICAgICAgfQoKICAgICAgICAvKiBVUkIgKi8KICAgICAgICBtZWRpYV9zdGF0ZS0+dXJiLm51bV92ZmVfZW50cmllcyA9IDI4OwogICAgICAgIG1lZGlhX3N0YXRlLT51cmIuc2l6ZV92ZmVfZW50cnkgPSAxMzsKCiAgICAgICAgbWVkaWFfc3RhdGUtPnVyYi5udW1fY3NfZW50cmllcyA9IDE7CiAgICAgICAgbWVkaWFfc3RhdGUtPnVyYi5zaXplX2NzX2VudHJ5ID0gMTY7CgogICAgICAgIG1lZGlhX3N0YXRlLT51cmIudmZlX3N0YXJ0ID0gMDsKICAgICAgICBtZWRpYV9zdGF0ZS0+dXJiLmNzX3N0YXJ0ID0gbWVkaWFfc3RhdGUtPnVyYi52ZmVfc3RhcnQgKyAKICAgICAgICAgICAgbWVkaWFfc3RhdGUtPnVyYi5udW1fdmZlX2VudHJpZXMgKiBtZWRpYV9zdGF0ZS0+dXJiLnNpemVfdmZlX2VudHJ5OwogICAgICAgIGFzc2VydChtZWRpYV9zdGF0ZS0+dXJiLmNzX3N0YXJ0ICsgCiAgICAgICAgICAgICAgIG1lZGlhX3N0YXRlLT51cmIubnVtX2NzX2VudHJpZXMgKiBtZWRpYV9zdGF0ZS0+dXJiLnNpemVfY3NfZW50cnkgPD0gVVJCX1NJWkUoKCZpOTY1LT5pbnRlbCkpKTsKCiAgICAgICAgLyogaG9vayBmdW5jdGlvbnMgKi8KICAgICAgICBtZWRpYV9zdGF0ZS0+bWVkaWFfc3RhdGVzX3NldHVwID0gaTk2NV9tZWRpYV9tcGVnMl9zdGF0ZXNfc2V0dXA7CiAgICAgICAgbWVkaWFfc3RhdGUtPm1lZGlhX29iamVjdHMgPSBpOTY1X21lZGlhX21wZWcyX29iamVjdHM7CiAgICAgICAgbWVkaWFfc3RhdGUtPmZyZWVfcHJpdmF0ZV9jb250ZXh0ID0gaTk2NV9tZWRpYV9tcGVnMl9mcmVlX3ByaXZhdGVfY29udGV4dDsKICAgIH0KCiAgICBtZWRpYV9zdGF0ZS0+ZXh0ZW5kZWRfc3RhdGUuZW5hYmxlZCA9IDE7CiAgICBtZWRpYV9zdGF0ZS0+aW5kaXJlY3Rfb2JqZWN0LmJvID0gTlVMTDsKICAgIGRyaV9ib191bnJlZmVyZW5jZShtZWRpYV9zdGF0ZS0+ZXh0ZW5kZWRfc3RhdGUuYm8pOwogICAgYm8gPSBkcmlfYm9fYWxsb2MoaTk2NS0+aW50ZWwuYnVmbWdyLCAKICAgICAgICAgICAgICAgICAgICAgICJ2bGQgc3RhdGUiLCAKICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaTk2NV92bGRfc3RhdGUpLCAzMik7CiAgICBhc3NlcnQoYm8pOwogICAgbWVkaWFfc3RhdGUtPmV4dGVuZGVkX3N0YXRlLmJvID0gYm87Cn0KCg==