LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY3htbC5jLHYgMS4xNiAyMDAyLzA3LzEyIDE5OjE5OjE2IGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAyIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlICJmY2ludC5oIgoKI2lmbmRlZiBIQVZFX0VYUEFUCiNkZWZpbmUgSEFWRV9FWFBBVCAxCiNlbmRpZgoKI2lmbmRlZiBIQVZFX1hNTDIKI2RlZmluZSBIQVZFX1hNTDIgMAojZW5kaWYKCiNpZiBIQVZFX0VYUEFUCiNpZm5kZWYgSEFWRV9YTUxQQVJTRV9ICiNkZWZpbmUgSEFWRV9YTUxQQVJTRV9IIDAKI2VuZGlmCiNpZiBIQVZFX1hNTFBBUlNFX0gKI2luY2x1ZGUgPHhtbHBhcnNlLmg+CiNlbHNlCiNpbmNsdWRlIDxleHBhdC5oPgojZW5kaWYKI2VuZGlmCgojaWYgSEFWRV9YTUwyCiNpbmNsdWRlICJmY2xpYnhtbDIuaCIKI2VuZGlmCgpGY1Rlc3QgKgpGY1Rlc3RDcmVhdGUgKEZjUXVhbCBxdWFsLCBjb25zdCBGY0NoYXI4ICpmaWVsZCwgRmNPcCBjb21wYXJlLCBGY0V4cHIgKmV4cHIpCnsKICAgIEZjVGVzdAkqdGVzdCA9IChGY1Rlc3QgKikgbWFsbG9jIChzaXplb2YgKEZjVGVzdCkpOwoKICAgIGlmICh0ZXN0KQogICAgewoJdGVzdC0+bmV4dCA9IDA7Cgl0ZXN0LT5xdWFsID0gcXVhbDsKCXRlc3QtPmZpZWxkID0gKGNoYXIgKikgRmNTdHJDb3B5IChmaWVsZCk7Cgl0ZXN0LT5vcCA9IGNvbXBhcmU7Cgl0ZXN0LT5leHByID0gZXhwcjsKICAgIH0KICAgIHJldHVybiB0ZXN0Owp9Cgp2b2lkCkZjVGVzdERlc3Ryb3kgKEZjVGVzdCAqdGVzdCkKewogICAgaWYgKHRlc3QtPm5leHQpCglGY1Rlc3REZXN0cm95ICh0ZXN0LT5uZXh0KTsKICAgIEZjRXhwckRlc3Ryb3kgKHRlc3QtPmV4cHIpOwogICAgRmNTdHJGcmVlICgoRmNDaGFyOCAqKSB0ZXN0LT5maWVsZCk7CiAgICBmcmVlICh0ZXN0KTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlSW50ZWdlciAoaW50IGkpCnsKICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOwoKICAgIGlmIChlKQogICAgewoJZS0+b3AgPSBGY09wSW50ZWdlcjsKCWUtPnUuaXZhbCA9IGk7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlRG91YmxlIChkb3VibGUgZCkKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CgllLT5vcCA9IEZjT3BEb3VibGU7CgllLT51LmR2YWwgPSBkOwogICAgfQogICAgcmV0dXJuIGU7Cn0KCkZjRXhwciAqCkZjRXhwckNyZWF0ZVN0cmluZyAoY29uc3QgRmNDaGFyOCAqcykKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CgllLT5vcCA9IEZjT3BTdHJpbmc7CgllLT51LnN2YWwgPSBGY1N0ckNvcHkgKHMpOwogICAgfQogICAgcmV0dXJuIGU7Cn0KCkZjRXhwciAqCkZjRXhwckNyZWF0ZU1hdHJpeCAoY29uc3QgRmNNYXRyaXggKm0pCnsKICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOwoKICAgIGlmIChlKQogICAgewoJZS0+b3AgPSBGY09wTWF0cml4OwoJZS0+dS5tdmFsID0gRmNNYXRyaXhDb3B5IChtKTsKICAgIH0KICAgIHJldHVybiBlOwp9CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVCb29sIChGY0Jvb2wgYikKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CgllLT5vcCA9IEZjT3BCb29sOwoJZS0+dS5idmFsID0gYjsKICAgIH0KICAgIHJldHVybiBlOwp9CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVOaWwgKHZvaWQpCnsKICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOwoKICAgIGlmIChlKQogICAgewoJZS0+b3AgPSBGY09wTmlsOwogICAgfQogICAgcmV0dXJuIGU7Cn0KCkZjRXhwciAqCkZjRXhwckNyZWF0ZUZpZWxkIChjb25zdCBjaGFyICpmaWVsZCkKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CgllLT5vcCA9IEZjT3BGaWVsZDsKCWUtPnUuZmllbGQgPSAoY2hhciAqKSBGY1N0ckNvcHkgKChGY0NoYXI4ICopIGZpZWxkKTsKICAgIH0KICAgIHJldHVybiBlOwp9CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVDb25zdCAoY29uc3QgRmNDaGFyOCAqY29uc3RhbnQpCnsKICAgIEZjRXhwciAqZSA9IChGY0V4cHIgKikgbWFsbG9jIChzaXplb2YgKEZjRXhwcikpOwoKICAgIGlmIChlKQogICAgewoJZS0+b3AgPSBGY09wQ29uc3Q7CgllLT51LmNvbnN0YW50ID0gRmNTdHJDb3B5IChjb25zdGFudCk7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKRmNFeHByICoKRmNFeHByQ3JlYXRlT3AgKEZjRXhwciAqbGVmdCwgRmNPcCBvcCwgRmNFeHByICpyaWdodCkKewogICAgRmNFeHByICplID0gKEZjRXhwciAqKSBtYWxsb2MgKHNpemVvZiAoRmNFeHByKSk7CgogICAgaWYgKGUpCiAgICB7CgllLT5vcCA9IG9wOwoJZS0+dS50cmVlLmxlZnQgPSBsZWZ0OwoJZS0+dS50cmVlLnJpZ2h0ID0gcmlnaHQ7CiAgICB9CiAgICByZXR1cm4gZTsKfQoKdm9pZApGY0V4cHJEZXN0cm95IChGY0V4cHIgKmUpCnsKICAgIHN3aXRjaCAoZS0+b3ApIHsKICAgIGNhc2UgRmNPcEludGVnZXI6CglicmVhazsKICAgIGNhc2UgRmNPcERvdWJsZToKCWJyZWFrOwogICAgY2FzZSBGY09wU3RyaW5nOgoJRmNTdHJGcmVlIChlLT51LnN2YWwpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BNYXRyaXg6CglGY01hdHJpeEZyZWUgKGUtPnUubXZhbCk7CglicmVhazsKICAgIGNhc2UgRmNPcENoYXJTZXQ6CglGY0NoYXJTZXREZXN0cm95IChlLT51LmN2YWwpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BCb29sOgoJYnJlYWs7CiAgICBjYXNlIEZjT3BGaWVsZDoKCUZjU3RyRnJlZSAoKEZjQ2hhcjggKikgZS0+dS5maWVsZCk7CglicmVhazsKICAgIGNhc2UgRmNPcENvbnN0OgoJRmNTdHJGcmVlIChlLT51LmNvbnN0YW50KTsKCWJyZWFrOwogICAgY2FzZSBGY09wQXNzaWduOgogICAgY2FzZSBGY09wQXNzaWduUmVwbGFjZToKICAgIGNhc2UgRmNPcFByZXBlbmQ6CiAgICBjYXNlIEZjT3BQcmVwZW5kRmlyc3Q6CiAgICBjYXNlIEZjT3BBcHBlbmQ6CiAgICBjYXNlIEZjT3BBcHBlbmRMYXN0OgoJYnJlYWs7CiAgICBjYXNlIEZjT3BPcjoKICAgIGNhc2UgRmNPcEFuZDoKICAgIGNhc2UgRmNPcEVxdWFsOgogICAgY2FzZSBGY09wQ29udGFpbnM6CiAgICBjYXNlIEZjT3BOb3RFcXVhbDoKICAgIGNhc2UgRmNPcExlc3M6CiAgICBjYXNlIEZjT3BMZXNzRXF1YWw6CiAgICBjYXNlIEZjT3BNb3JlOgogICAgY2FzZSBGY09wTW9yZUVxdWFsOgogICAgY2FzZSBGY09wUGx1czoKICAgIGNhc2UgRmNPcE1pbnVzOgogICAgY2FzZSBGY09wVGltZXM6CiAgICBjYXNlIEZjT3BEaXZpZGU6CiAgICBjYXNlIEZjT3BRdWVzdDoKICAgIGNhc2UgRmNPcENvbW1hOgoJRmNFeHByRGVzdHJveSAoZS0+dS50cmVlLnJpZ2h0KTsKCS8qIGZhbGwgdGhyb3VnaCAqLwogICAgY2FzZSBGY09wTm90OgoJRmNFeHByRGVzdHJveSAoZS0+dS50cmVlLmxlZnQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BOaWw6CiAgICBjYXNlIEZjT3BJbnZhbGlkOgoJYnJlYWs7CiAgICB9CiAgICBmcmVlIChlKTsKfQoKRmNFZGl0ICoKRmNFZGl0Q3JlYXRlIChjb25zdCBjaGFyICpmaWVsZCwgRmNPcCBvcCwgRmNFeHByICpleHByLCBGY1ZhbHVlQmluZGluZyBiaW5kaW5nKQp7CiAgICBGY0VkaXQgKmUgPSAoRmNFZGl0ICopIG1hbGxvYyAoc2l6ZW9mIChGY0VkaXQpKTsKCiAgICBpZiAoZSkKICAgIHsKCWUtPm5leHQgPSAwOwoJZS0+ZmllbGQgPSBmaWVsZDsgICAvKiBhbHJlYWR5IHNhdmVkIGluIGdyYW1tYXIgKi8KCWUtPm9wID0gb3A7CgllLT5leHByID0gZXhwcjsKCWUtPmJpbmRpbmcgPSBiaW5kaW5nOwogICAgfQogICAgcmV0dXJuIGU7Cn0KCnZvaWQKRmNFZGl0RGVzdHJveSAoRmNFZGl0ICplKQp7CiAgICBpZiAoZS0+bmV4dCkKCUZjRWRpdERlc3Ryb3kgKGUtPm5leHQpOwogICAgRmNTdHJGcmVlICgoRmNDaGFyOCAqKSBlLT5maWVsZCk7CiAgICBpZiAoZS0+ZXhwcikKCUZjRXhwckRlc3Ryb3kgKGUtPmV4cHIpOwp9CgpjaGFyICoKRmNDb25maWdTYXZlRmllbGQgKGNvbnN0IGNoYXIgKmZpZWxkKQp7CiAgICByZXR1cm4gKGNoYXIgKikgRmNTdHJDb3B5ICgoRmNDaGFyOCAqKSBmaWVsZCk7Cn0KCnR5cGVkZWYgZW51bSBfRmNFbGVtZW50IHsKICAgIEZjRWxlbWVudE5vbmUsCiAgICBGY0VsZW1lbnRGb250Y29uZmlnLAogICAgRmNFbGVtZW50RGlyLAogICAgRmNFbGVtZW50Q2FjaGUsCiAgICBGY0VsZW1lbnRJbmNsdWRlLAogICAgRmNFbGVtZW50Q29uZmlnLAogICAgRmNFbGVtZW50TWF0Y2gsCiAgICBGY0VsZW1lbnRBbGlhcywKCQogICAgRmNFbGVtZW50QmxhbmssCiAgICBGY0VsZW1lbnRSZXNjYW4sCgogICAgRmNFbGVtZW50UHJlZmVyLAogICAgRmNFbGVtZW50QWNjZXB0LAogICAgRmNFbGVtZW50RGVmYXVsdCwKICAgIEZjRWxlbWVudEZhbWlseSwKCiAgICBGY0VsZW1lbnRUZXN0LAogICAgRmNFbGVtZW50RWRpdCwKICAgIEZjRWxlbWVudEludCwKICAgIEZjRWxlbWVudERvdWJsZSwKICAgIEZjRWxlbWVudFN0cmluZywKICAgIEZjRWxlbWVudE1hdHJpeCwKICAgIEZjRWxlbWVudEJvb2wsCiAgICBGY0VsZW1lbnRDaGFyc2V0LAogICAgRmNFbGVtZW50TmFtZSwKICAgIEZjRWxlbWVudENvbnN0LAogICAgRmNFbGVtZW50T3IsCiAgICBGY0VsZW1lbnRBbmQsCiAgICBGY0VsZW1lbnRFcSwKICAgIEZjRWxlbWVudE5vdEVxLAogICAgRmNFbGVtZW50TGVzcywKICAgIEZjRWxlbWVudExlc3NFcSwKICAgIEZjRWxlbWVudE1vcmUsCiAgICBGY0VsZW1lbnRNb3JlRXEsCiAgICBGY0VsZW1lbnRQbHVzLAogICAgRmNFbGVtZW50TWludXMsCiAgICBGY0VsZW1lbnRUaW1lcywKICAgIEZjRWxlbWVudERpdmlkZSwKICAgIEZjRWxlbWVudE5vdCwKICAgIEZjRWxlbWVudElmLAogICAgRmNFbGVtZW50VW5rbm93bgp9IEZjRWxlbWVudDsKCnN0YXRpYyBGY0VsZW1lbnQKRmNFbGVtZW50TWFwIChjb25zdCBYTUxfQ2hhciAqbmFtZSkKewogICAgc3RhdGljIHN0cnVjdCB7CgljaGFyCSAgICAqbmFtZTsKCUZjRWxlbWVudCAgIGVsZW1lbnQ7CiAgICB9IGZjRWxlbWVudE1hcFtdID0gewoJeyAiZm9udGNvbmZpZyIsCUZjRWxlbWVudEZvbnRjb25maWcgfSwKCXsgImRpciIsCUZjRWxlbWVudERpciB9LAoJeyAiY2FjaGUiLAlGY0VsZW1lbnRDYWNoZSB9LAoJeyAiaW5jbHVkZSIsCUZjRWxlbWVudEluY2x1ZGUgfSwKCXsgImNvbmZpZyIsCUZjRWxlbWVudENvbmZpZyB9LAoJeyAibWF0Y2giLAlGY0VsZW1lbnRNYXRjaCB9LAoJeyAiYWxpYXMiLAlGY0VsZW1lbnRBbGlhcyB9LAoJCgl7ICJibGFuayIsCUZjRWxlbWVudEJsYW5rIH0sCgl7ICJyZXNjYW4iLAlGY0VsZW1lbnRSZXNjYW4gfSwKCgl7ICJwcmVmZXIiLAlGY0VsZW1lbnRQcmVmZXIgfSwKCXsgImFjY2VwdCIsCUZjRWxlbWVudEFjY2VwdCB9LAoJeyAiZGVmYXVsdCIsCUZjRWxlbWVudERlZmF1bHQgfSwKCXsgImZhbWlseSIsCUZjRWxlbWVudEZhbWlseSB9LAoKCXsgInRlc3QiLAlGY0VsZW1lbnRUZXN0IH0sCgl7ICJlZGl0IiwJRmNFbGVtZW50RWRpdCB9LAoJeyAiaW50IiwJRmNFbGVtZW50SW50IH0sCgl7ICJkb3VibGUiLAlGY0VsZW1lbnREb3VibGUgfSwKCXsgInN0cmluZyIsCUZjRWxlbWVudFN0cmluZyB9LAoJeyAibWF0cml4IiwJRmNFbGVtZW50TWF0cml4IH0sCgl7ICJib29sIiwJRmNFbGVtZW50Qm9vbCB9LAoJeyAiY2hhcnNldCIsCUZjRWxlbWVudENoYXJzZXQgfSwKCXsgIm5hbWUiLAlGY0VsZW1lbnROYW1lIH0sCgl7ICJjb25zdCIsCUZjRWxlbWVudENvbnN0IH0sCgl7ICJvciIsCQlGY0VsZW1lbnRPciB9LAoJeyAiYW5kIiwJRmNFbGVtZW50QW5kIH0sCgl7ICJlcSIsCQlGY0VsZW1lbnRFcSB9LAoJeyAibm90X2VxIiwJRmNFbGVtZW50Tm90RXEgfSwKCXsgImxlc3MiLAlGY0VsZW1lbnRMZXNzIH0sCgl7ICJsZXNzX2VxIiwJRmNFbGVtZW50TGVzc0VxIH0sCgl7ICJtb3JlIiwJRmNFbGVtZW50TW9yZSB9LAoJeyAibW9yZV9lcSIsCUZjRWxlbWVudE1vcmVFcSB9LAoJeyAicGx1cyIsCUZjRWxlbWVudFBsdXMgfSwKCXsgIm1pbnVzIiwJRmNFbGVtZW50TWludXMgfSwKCXsgInRpbWVzIiwJRmNFbGVtZW50VGltZXMgfSwKCXsgImRpdmlkZSIsCUZjRWxlbWVudERpdmlkZSB9LAoJeyAibm90IiwJRmNFbGVtZW50Tm90IH0sCgl7ICJpZiIsCQlGY0VsZW1lbnRJZiB9LAoJCgl7IDAsCQkwIH0KICAgIH07CgogICAgaW50CSAgICBpOwogICAgZm9yIChpID0gMDsgZmNFbGVtZW50TWFwW2ldLm5hbWU7IGkrKykKCWlmICghc3RyY21wICgoY2hhciAqKSBuYW1lLCBmY0VsZW1lbnRNYXBbaV0ubmFtZSkpCgkgICAgcmV0dXJuIGZjRWxlbWVudE1hcFtpXS5lbGVtZW50OwogICAgcmV0dXJuIEZjRWxlbWVudFVua25vd247Cn0KCnR5cGVkZWYgc3RydWN0IF9GY1BTdGFjayB7CiAgICBzdHJ1Y3QgX0ZjUFN0YWNrICAgKnByZXY7CiAgICBGY0VsZW1lbnQJCWVsZW1lbnQ7CiAgICBGY0NoYXI4CQkqKmF0dHI7CiAgICBGY1N0ckJ1ZgkJc3RyOwp9IEZjUFN0YWNrOwogICAgCnR5cGVkZWYgZW51bSBfRmNWU3RhY2tUYWcgewogICAgRmNWU3RhY2tOb25lLAoKICAgIEZjVlN0YWNrU3RyaW5nLAogICAgRmNWU3RhY2tGYW1pbHksCiAgICBGY1ZTdGFja0ZpZWxkLAogICAgRmNWU3RhY2tDb25zdGFudCwKICAgIAogICAgRmNWU3RhY2tQcmVmZXIsCiAgICBGY1ZTdGFja0FjY2VwdCwKICAgIEZjVlN0YWNrRGVmYXVsdCwKICAgIAogICAgRmNWU3RhY2tJbnRlZ2VyLAogICAgRmNWU3RhY2tEb3VibGUsCiAgICBGY1ZTdGFja01hdHJpeCwKICAgIEZjVlN0YWNrQm9vbCwKICAgIAogICAgRmNWU3RhY2tUZXN0LAogICAgRmNWU3RhY2tFeHByLAogICAgRmNWU3RhY2tFZGl0Cn0gRmNWU3RhY2tUYWc7Cgp0eXBlZGVmIHN0cnVjdCBfRmNWU3RhY2sgewogICAgc3RydWN0IF9GY1ZTdGFjawkqcHJldjsKICAgIEZjUFN0YWNrCQkqcHN0YWNrOwkvKiByZWxhdGVkIHBhcnNlIGVsZW1lbnQgKi8KICAgIEZjVlN0YWNrVGFnCQl0YWc7CiAgICB1bmlvbiB7CglGY0NoYXI4CQkqc3RyaW5nOwoKCWludAkJaW50ZWdlcjsKCWRvdWJsZQkJX2RvdWJsZTsKCUZjTWF0cml4CSptYXRyaXg7CglGY0Jvb2wJCWJvb2w7CgoJRmNUZXN0CQkqdGVzdDsKCUZjUXVhbAkJcXVhbDsKCUZjT3AJCW9wOwoJRmNFeHByCQkqZXhwcjsKCUZjRWRpdAkJKmVkaXQ7CiAgICB9IHU7Cn0gRmNWU3RhY2s7Cgp0eXBlZGVmIHN0cnVjdCBfRmNDb25maWdQYXJzZSB7CiAgICBGY1BTdGFjawkgICAgKnBzdGFjazsKICAgIEZjVlN0YWNrCSAgICAqdnN0YWNrOwogICAgRmNCb29sCSAgICBlcnJvcjsKICAgIGNvbnN0IEZjQ2hhcjggICAqbmFtZTsKICAgIEZjQ29uZmlnCSAgICAqY29uZmlnOwogICAgWE1MX1BhcnNlcgkgICAgcGFyc2VyOwp9IEZjQ29uZmlnUGFyc2U7Cgp0eXBlZGVmIGVudW0gX0ZjQ29uZmlnU2V2ZXJpdHkgewogICAgRmNTZXZlcmVJbmZvLCBGY1NldmVyZVdhcm5pbmcsIEZjU2V2ZXJlRXJyb3IKfSBGY0NvbmZpZ1NldmVyaXR5OwoKc3RhdGljIHZvaWQKRmNDb25maWdNZXNzYWdlIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNDb25maWdTZXZlcml0eSBzZXZlcmUsIGNoYXIgKmZtdCwgLi4uKQp7CiAgICBjaGFyCSpzID0gInVua25vd24iOwogICAgdmFfbGlzdAlhcmdzOwoKICAgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOwoKICAgIHN3aXRjaCAoc2V2ZXJlKSB7CiAgICBjYXNlIEZjU2V2ZXJlSW5mbzogcyA9ICJpbmZvIjsgYnJlYWs7CiAgICBjYXNlIEZjU2V2ZXJlV2FybmluZzogcyA9ICJ3YXJuaW5nIjsgYnJlYWs7CiAgICBjYXNlIEZjU2V2ZXJlRXJyb3I6IHMgPSAiZXJyb3IiOyBicmVhazsKICAgIH0KICAgIGlmIChwYXJzZSkKICAgIHsKCWlmIChwYXJzZS0+bmFtZSkKCSAgICBmcHJpbnRmIChzdGRlcnIsICJGb250Y29uZmlnICVzOiBcIiVzXCIsIGxpbmUgJWQ6ICIsIHMsCgkJICAgICBwYXJzZS0+bmFtZSwgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyIChwYXJzZS0+cGFyc2VyKSk7CgllbHNlCgkgICAgZnByaW50ZiAoc3RkZXJyLCAiRm9udGNvbmZpZyAlczogbGluZSAlZDogIiwgcywKCQkgICAgIFhNTF9HZXRDdXJyZW50TGluZU51bWJlciAocGFyc2UtPnBhcnNlcikpOwoJaWYgKHNldmVyZSA+PSBGY1NldmVyZUVycm9yKQoJICAgIHBhcnNlLT5lcnJvciA9IEZjVHJ1ZTsKICAgIH0KICAgIGVsc2UKCWZwcmludGYgKHN0ZGVyciwgIkZvbnRjb25maWcgJXM6ICIsIHMpOwogICAgdmZwcmludGYgKHN0ZGVyciwgZm10LCBhcmdzKTsKICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7CiAgICB2YV9lbmQgKGFyZ3MpOwp9CgpzdGF0aWMgdm9pZApGY1ZTdGFja1B1c2ggKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY1ZTdGFjayAqdnN0YWNrKQp7CiAgICB2c3RhY2stPnByZXYgPSBwYXJzZS0+dnN0YWNrOwogICAgdnN0YWNrLT5wc3RhY2sgPSBwYXJzZS0+cHN0YWNrID8gcGFyc2UtPnBzdGFjay0+cHJldiA6IDA7CiAgICBwYXJzZS0+dnN0YWNrID0gdnN0YWNrOwp9CgpzdGF0aWMgRmNWU3RhY2sgKgpGY1ZTdGFja0NyZWF0ZSAodm9pZCkKewogICAgRmNWU3RhY2sgICAgKm5ldzsKCiAgICBuZXcgPSBtYWxsb2MgKHNpemVvZiAoRmNWU3RhY2spKTsKICAgIGlmICghbmV3KQoJcmV0dXJuIDA7CiAgICBuZXctPnRhZyA9IEZjVlN0YWNrTm9uZTsKICAgIG5ldy0+cHJldiA9IDA7CiAgICByZXR1cm4gbmV3Owp9CgpzdGF0aWMgdm9pZApGY1ZTdGFja0Rlc3Ryb3kgKEZjVlN0YWNrICp2c3RhY2spCnsKICAgIEZjVlN0YWNrICAgICpwcmV2OwoKICAgIGZvciAoOyB2c3RhY2s7IHZzdGFjayA9IHByZXYpCiAgICB7CglwcmV2ID0gdnN0YWNrLT5wcmV2OwoJc3dpdGNoICh2c3RhY2stPnRhZykgewoJY2FzZSBGY1ZTdGFja05vbmU6CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrU3RyaW5nOgoJY2FzZSBGY1ZTdGFja0ZhbWlseToKCWNhc2UgRmNWU3RhY2tGaWVsZDoKCWNhc2UgRmNWU3RhY2tDb25zdGFudDoKCSAgICBGY1N0ckZyZWUgKHZzdGFjay0+dS5zdHJpbmcpOwoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja0ludGVnZXI6CgljYXNlIEZjVlN0YWNrRG91YmxlOgoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja01hdHJpeDoKCSAgICBGY01hdHJpeEZyZWUgKHZzdGFjay0+dS5tYXRyaXgpOwoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja0Jvb2w6CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrVGVzdDoKCSAgICBGY1Rlc3REZXN0cm95ICh2c3RhY2stPnUudGVzdCk7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrRXhwcjoKCWNhc2UgRmNWU3RhY2tQcmVmZXI6CgljYXNlIEZjVlN0YWNrQWNjZXB0OgoJY2FzZSBGY1ZTdGFja0RlZmF1bHQ6CgkgICAgRmNFeHByRGVzdHJveSAodnN0YWNrLT51LmV4cHIpOwoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja0VkaXQ6CgkgICAgRmNFZGl0RGVzdHJveSAodnN0YWNrLT51LmVkaXQpOwoJICAgIGJyZWFrOwoJfQoJZnJlZSAodnN0YWNrKTsKICAgIH0KfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hTdHJpbmcgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY1ZTdGFja1RhZyB0YWcsIEZjQ2hhcjggKnN0cmluZykKewogICAgRmNWU3RhY2sgICAgKnZzdGFjayA9IEZjVlN0YWNrQ3JlYXRlICgpOwogICAgaWYgKCF2c3RhY2spCglyZXR1cm4gRmNGYWxzZTsKICAgIHZzdGFjay0+dS5zdHJpbmcgPSBzdHJpbmc7CiAgICB2c3RhY2stPnRhZyA9IHRhZzsKICAgIEZjVlN0YWNrUHVzaCAocGFyc2UsIHZzdGFjayk7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjVlN0YWNrUHVzaEludGVnZXIgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBpbnQgaW50ZWdlcikKewogICAgRmNWU3RhY2sgICAgKnZzdGFjayA9IEZjVlN0YWNrQ3JlYXRlICgpOwogICAgaWYgKCF2c3RhY2spCglyZXR1cm4gRmNGYWxzZTsKICAgIHZzdGFjay0+dS5pbnRlZ2VyID0gaW50ZWdlcjsKICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tJbnRlZ2VyOwogICAgRmNWU3RhY2tQdXNoIChwYXJzZSwgdnN0YWNrKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWU3RhY2tQdXNoRG91YmxlIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgZG91YmxlIF9kb3VibGUpCnsKICAgIEZjVlN0YWNrICAgICp2c3RhY2sgPSBGY1ZTdGFja0NyZWF0ZSAoKTsKICAgIGlmICghdnN0YWNrKQoJcmV0dXJuIEZjRmFsc2U7CiAgICB2c3RhY2stPnUuX2RvdWJsZSA9IF9kb3VibGU7CiAgICB2c3RhY2stPnRhZyA9IEZjVlN0YWNrRG91YmxlOwogICAgRmNWU3RhY2tQdXNoIChwYXJzZSwgdnN0YWNrKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWU3RhY2tQdXNoTWF0cml4IChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNNYXRyaXggKm1hdHJpeCkKewogICAgRmNWU3RhY2sgICAgKnZzdGFjayA9IEZjVlN0YWNrQ3JlYXRlICgpOwogICAgaWYgKCF2c3RhY2spCglyZXR1cm4gRmNGYWxzZTsKICAgIG1hdHJpeCA9IEZjTWF0cml4Q29weSAobWF0cml4KTsKICAgIGlmICghbWF0cml4KQogICAgewoJRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwoJcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICB2c3RhY2stPnUubWF0cml4ID0gbWF0cml4OwogICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja01hdHJpeDsKICAgIEZjVlN0YWNrUHVzaCAocGFyc2UsIHZzdGFjayk7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjVlN0YWNrUHVzaEJvb2wgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY0Jvb2wgYm9vbCkKewogICAgRmNWU3RhY2sgICAgKnZzdGFjayA9IEZjVlN0YWNrQ3JlYXRlICgpOwogICAgaWYgKCF2c3RhY2spCglyZXR1cm4gRmNGYWxzZTsKICAgIHZzdGFjay0+dS5ib29sID0gYm9vbDsKICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tCb29sOwogICAgRmNWU3RhY2tQdXNoIChwYXJzZSwgdnN0YWNrKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWU3RhY2tQdXNoVGVzdCAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjVGVzdCAqdGVzdCkKewogICAgRmNWU3RhY2sgICAgKnZzdGFjayA9IEZjVlN0YWNrQ3JlYXRlICgpOwogICAgaWYgKCF2c3RhY2spCglyZXR1cm4gRmNGYWxzZTsKICAgIHZzdGFjay0+dS50ZXN0ID0gdGVzdDsKICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tUZXN0OwogICAgRmNWU3RhY2tQdXNoIChwYXJzZSwgdnN0YWNrKTsKICAgIHJldHVybiBGY1RydWU7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWU3RhY2tQdXNoRXhwciAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjVlN0YWNrVGFnIHRhZywgRmNFeHByICpleHByKQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LmV4cHIgPSBleHByOwogICAgdnN0YWNrLT50YWcgPSB0YWc7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjQm9vbApGY1ZTdGFja1B1c2hFZGl0IChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNFZGl0ICplZGl0KQp7CiAgICBGY1ZTdGFjayAgICAqdnN0YWNrID0gRmNWU3RhY2tDcmVhdGUgKCk7CiAgICBpZiAoIXZzdGFjaykKCXJldHVybiBGY0ZhbHNlOwogICAgdnN0YWNrLT51LmVkaXQgPSBlZGl0OwogICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja0VkaXQ7CiAgICBGY1ZTdGFja1B1c2ggKHBhcnNlLCB2c3RhY2spOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIEZjVlN0YWNrICoKRmNWU3RhY2tGZXRjaCAoRmNDb25maWdQYXJzZSAqcGFyc2UsIGludCBvZmYpCnsKICAgIEZjVlN0YWNrICAgICp2c3RhY2s7CgogICAgZm9yICh2c3RhY2sgPSBwYXJzZS0+dnN0YWNrOyB2c3RhY2sgJiYgb2ZmLS0gPiAwOyB2c3RhY2sgPSB2c3RhY2stPnByZXYpOwogICAgcmV0dXJuIHZzdGFjazsKfQoKc3RhdGljIHZvaWQKRmNWU3RhY2tDbGVhciAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIHdoaWxlIChwYXJzZS0+dnN0YWNrICYmIHBhcnNlLT52c3RhY2stPnBzdGFjayA9PSBwYXJzZS0+cHN0YWNrKQogICAgewoJRmNWU3RhY2sgICAgKnZzdGFjayA9IHBhcnNlLT52c3RhY2s7CglwYXJzZS0+dnN0YWNrID0gdnN0YWNrLT5wcmV2OwoJdnN0YWNrLT5wcmV2ID0gMDsKCUZjVlN0YWNrRGVzdHJveSAodnN0YWNrKTsKICAgIH0KfQoKc3RhdGljIEZjVlN0YWNrICoKRmNWU3RhY2tQb3AgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY1ZTdGFjawkqdnN0YWNrID0gcGFyc2UtPnZzdGFjazsKICAgIAogICAgaWYgKCF2c3RhY2sgfHwgdnN0YWNrLT5wc3RhY2sgIT0gcGFyc2UtPnBzdGFjaykKCXJldHVybiAwOwogICAgcGFyc2UtPnZzdGFjayA9IHZzdGFjay0+cHJldjsKICAgIHZzdGFjay0+cHJldiA9IDA7CiAgICByZXR1cm4gdnN0YWNrOwp9CgpzdGF0aWMgaW50CkZjVlN0YWNrRWxlbWVudHMgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBpbnQJCWggPSAwOwogICAgRmNWU3RhY2sJKnZzdGFjayA9IHBhcnNlLT52c3RhY2s7CiAgICB3aGlsZSAodnN0YWNrICYmIHZzdGFjay0+cHN0YWNrID09IHBhcnNlLT5wc3RhY2spCiAgICB7CgloKys7Cgl2c3RhY2sgPSB2c3RhY2stPnByZXY7CiAgICB9CiAgICByZXR1cm4gaDsKfQoKc3RhdGljIEZjQ2hhcjggKioKRmNDb25maWdTYXZlQXR0ciAoY29uc3QgWE1MX0NoYXIgKiphdHRyKQp7CiAgICBpbnQJCW47CiAgICBpbnQJCXNsZW47CiAgICBpbnQJCWk7CiAgICBGY0NoYXI4CSoqbmV3OwogICAgRmNDaGFyOAkqczsKCiAgICBpZiAoIWF0dHIpCglyZXR1cm4gMDsKICAgIHNsZW4gPSAwOwogICAgZm9yIChpID0gMDsgYXR0cltpXTsgaSsrKQoJc2xlbiArPSBzdHJsZW4gKGF0dHJbaV0pICsgMTsKICAgIG4gPSBpOwogICAgbmV3ID0gbWFsbG9jICgoaSArIDEpICogc2l6ZW9mIChGY0NoYXI4ICopICsgc2xlbik7CiAgICBpZiAoIW5ldykKCXJldHVybiAwOwogICAgcyA9IChGY0NoYXI4ICopIChuZXcgKyAoaSArIDEpKTsKICAgIGZvciAoaSA9IDA7IGF0dHJbaV07IGkrKykKICAgIHsKCW5ld1tpXSA9IHM7CglzdHJjcHkgKChjaGFyICopIHMsIChjaGFyICopIGF0dHJbaV0pOwoJcyArPSBzdHJsZW4gKChjaGFyICopIHMpICsgMTsKICAgIH0KICAgIG5ld1tpXSA9IDA7CiAgICByZXR1cm4gbmV3Owp9CgpzdGF0aWMgRmNCb29sCkZjUFN0YWNrUHVzaCAoRmNDb25maWdQYXJzZSAqcGFyc2UsIEZjRWxlbWVudCBlbGVtZW50LCBjb25zdCBYTUxfQ2hhciAqKmF0dHIpCnsKICAgIEZjUFN0YWNrICAgKm5ldyA9IG1hbGxvYyAoc2l6ZW9mIChGY1BTdGFjaykpOwoKICAgIGlmICghbmV3KQoJcmV0dXJuIEZjRmFsc2U7CiAgICBuZXctPnByZXYgPSBwYXJzZS0+cHN0YWNrOwogICAgbmV3LT5lbGVtZW50ID0gZWxlbWVudDsKICAgIGlmIChhdHRyKQogICAgewoJbmV3LT5hdHRyID0gRmNDb25maWdTYXZlQXR0ciAoYXR0cik7CglpZiAoIW5ldy0+YXR0cikKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwogICAgfQogICAgZWxzZQoJbmV3LT5hdHRyID0gMDsKICAgIEZjU3RyQnVmSW5pdCAoJm5ldy0+c3RyLCAwLCAwKTsKICAgIHBhcnNlLT5wc3RhY2sgPSBuZXc7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjUFN0YWNrUG9wIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNQU3RhY2sgICAqb2xkOwogICAgCiAgICBpZiAoIXBhcnNlLT5wc3RhY2spIAogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm1pc21hdGNoaW5nIGVsZW1lbnQiKTsKCXJldHVybiBGY0ZhbHNlOwogICAgfQogICAgRmNWU3RhY2tDbGVhciAocGFyc2UpOwogICAgb2xkID0gcGFyc2UtPnBzdGFjazsKICAgIHBhcnNlLT5wc3RhY2sgPSBvbGQtPnByZXY7CiAgICBGY1N0ckJ1ZkRlc3Ryb3kgKCZvbGQtPnN0cik7CiAgICBpZiAob2xkLT5hdHRyKQoJZnJlZSAob2xkLT5hdHRyKTsKICAgIGZyZWUgKG9sZCk7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjQ29uZmlnSW5pdCAoRmNDb25maWdQYXJzZSAqcGFyc2UsIGNvbnN0IEZjQ2hhcjggKm5hbWUsIEZjQ29uZmlnICpjb25maWcsIFhNTF9QYXJzZXIgcGFyc2VyKQp7CiAgICBwYXJzZS0+cHN0YWNrID0gMDsKICAgIHBhcnNlLT52c3RhY2sgPSAwOwogICAgcGFyc2UtPmVycm9yID0gRmNGYWxzZTsKICAgIHBhcnNlLT5uYW1lID0gbmFtZTsKICAgIHBhcnNlLT5jb25maWcgPSBjb25maWc7CiAgICBwYXJzZS0+cGFyc2VyID0gcGFyc2VyOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKc3RhdGljIHZvaWQKRmNDb25maWdDbGVhbnVwIChGY0NvbmZpZ1BhcnNlCSpwYXJzZSkKewogICAgd2hpbGUgKHBhcnNlLT5wc3RhY2spCglGY1BTdGFja1BvcCAocGFyc2UpOwp9CgpzdGF0aWMgY29uc3QgRmNDaGFyOCAqCkZjQ29uZmlnR2V0QXR0cmlidXRlIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgY2hhciAqYXR0cikKewogICAgRmNDaGFyOCAqKmF0dHJzOwogICAgaWYgKCFwYXJzZS0+cHN0YWNrKQoJcmV0dXJuIDA7CgogICAgYXR0cnMgPSBwYXJzZS0+cHN0YWNrLT5hdHRyOwogICAgd2hpbGUgKCphdHRycykKICAgIHsKCWlmICghc3RyY21wICgoY2hhciAqKSAqYXR0cnMsIGF0dHIpKQoJICAgIHJldHVybiBhdHRyc1sxXTsKCWF0dHJzICs9IDI7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQKRmNTdGFydEVsZW1lbnQodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lLCBjb25zdCBYTUxfQ2hhciAqKmF0dHIpCnsKICAgIEZjQ29uZmlnUGFyc2UgICAqcGFyc2UgPSB1c2VyRGF0YTsKICAgIEZjRWxlbWVudAkgICAgZWxlbWVudDsKICAgIAogICAgZWxlbWVudCA9IEZjRWxlbWVudE1hcCAobmFtZSk7CiAgICBpZiAoZWxlbWVudCA9PSBGY0VsZW1lbnRVbmtub3duKQoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAidW5rbm93biBlbGVtZW50IFwiJXNcIiIsIG5hbWUpOwogICAgCiAgICBpZiAoIUZjUFN0YWNrUHVzaCAocGFyc2UsIGVsZW1lbnQsIGF0dHIpKQogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCXJldHVybjsKICAgIH0KICAgIHJldHVybjsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZUJsYW5rIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgaW50CSAgICBuID0gRmNWU3RhY2tFbGVtZW50cyAocGFyc2UpOwogICAgd2hpbGUgKG4tLSA+IDApCiAgICB7CglGY1ZTdGFjayAgICAqdiA9IEZjVlN0YWNrRmV0Y2ggKHBhcnNlLCBuKTsKCWlmICh2LT50YWcgIT0gRmNWU3RhY2tJbnRlZ2VyKQoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJub24taW50ZWdlciBibGFuayIpOwoJZWxzZQoJewoJICAgIGlmICghcGFyc2UtPmNvbmZpZy0+YmxhbmtzKQoJICAgIHsKCQlwYXJzZS0+Y29uZmlnLT5ibGFua3MgPSBGY0JsYW5rc0NyZWF0ZSAoKTsKCQlpZiAoIXBhcnNlLT5jb25maWctPmJsYW5rcykKCQl7CgkJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CgkJICAgIGJyZWFrOwoJCX0KCSAgICB9CgkgICAgaWYgKCFGY0JsYW5rc0FkZCAocGFyc2UtPmNvbmZpZy0+YmxhbmtzLCB2LT51LmludGVnZXIpKQoJICAgIHsKCQlGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJCWJyZWFrOwoJICAgIH0KCX0KICAgIH0KfQoKc3RhdGljIHZvaWQKRmNQYXJzZVJlc2NhbiAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIGludAkgICAgbiA9IEZjVlN0YWNrRWxlbWVudHMgKHBhcnNlKTsKICAgIHdoaWxlIChuLS0gPiAwKQogICAgewoJRmNWU3RhY2sgICAgKnYgPSBGY1ZTdGFja0ZldGNoIChwYXJzZSwgbik7CglpZiAodi0+dGFnICE9IEZjVlN0YWNrSW50ZWdlcikKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJub24taW50ZWdlciByZXNjYW4iKTsKCWVsc2UKCSAgICBwYXJzZS0+Y29uZmlnLT5yZXNjYW5JbnRlcnZhbCA9IHYtPnUuaW50ZWdlcjsKICAgIH0KfQoKc3RhdGljIHZvaWQKRmNQYXJzZUludCAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIEZjQ2hhcjggKnMsICplbmQ7CiAgICBpbnQJICAgIGw7CiAgICAKICAgIGlmICghcGFyc2UtPnBzdGFjaykKCXJldHVybjsKICAgIHMgPSBGY1N0ckJ1ZkRvbmUgKCZwYXJzZS0+cHN0YWNrLT5zdHIpOwogICAgaWYgKCFzKQogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCXJldHVybjsKICAgIH0KICAgIGVuZCA9IDA7CiAgICBsID0gKGludCkgc3RydG9sICgoY2hhciAqKSBzLCAoY2hhciAqKikmZW5kLCAwKTsKICAgIGlmIChlbmQgIT0gcyArIHN0cmxlbiAoKGNoYXIgKikgcykpCglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAiXCIlc1wiOiBub3QgYSB2YWxpZCBpbnRlZ2VyIiwgcyk7CiAgICBlbHNlCglGY1ZTdGFja1B1c2hJbnRlZ2VyIChwYXJzZSwgbCk7CiAgICBGY1N0ckZyZWUgKHMpOwp9CgovKgogKiBpZGVhIGNvcGllZCBmcm9tIGdsaWIgZ19hc2NpaV9zdHJ0b2Qgd2l0aCAKICogcGVybWlzc2lvbiBvZiB0aGUgYXV0aG9yIChBbGV4YW5kZXIgTGFyc3NvbikgCiAqLwoKI2luY2x1ZGUgPGxvY2FsZS5oPgoKc3RhdGljIGRvdWJsZSAKRmNTdHJ0b2QgKGNoYXIgKnMsIGNoYXIgKiplbmQpCnsKICAgIHN0cnVjdCBsY29udiAgICAqbG9jYWxlX2RhdGE7CiAgICBjaGFyCSAgICAqZG90OwogICAgZG91YmxlCSAgICB2OwoKICAgIC8qCiAgICAgKiBIYXZlIHRvIHN3YXAgdGhlIGRlY2ltYWwgcG9pbnQgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgbG9jYWxlCiAgICAgKiBpZiB0aGF0IGxvY2FsZSBkb2Vzbid0IHVzZSAweDJlCiAgICAgKi8KICAgIGlmICgoZG90ID0gc3RyY2hyIChzLCAweDJlKSkgJiYKCShsb2NhbGVfZGF0YSA9IGxvY2FsZWNvbnYgKCkpICYmCgkobG9jYWxlX2RhdGEtPmRlY2ltYWxfcG9pbnRbMF0gIT0gMHgyZSB8fAoJIGxvY2FsZV9kYXRhLT5kZWNpbWFsX3BvaW50WzFdICE9IDApKQogICAgewoJY2hhcglidWZbMTI4XTsKCWludAlzbGVuID0gc3RybGVuIChzKTsKCWludAlkbGVuID0gc3RybGVuIChsb2NhbGVfZGF0YS0+ZGVjaW1hbF9wb2ludCk7CgkKCWlmIChzbGVuICsgZGxlbiA+IHNpemVvZiAoYnVmKSkKCXsKCSAgICBpZiAoZW5kKQoJCSplbmQgPSBzOwoJICAgIHYgPSAwOwoJfQoJZWxzZQoJewoJICAgIGNoYXIJKmJ1Zl9lbmQ7CgkgICAgLyogbWFudGlzc2EgKi8KCSAgICBzdHJuY3B5IChidWYsIHMsIGRvdCAtIHMpOwoJICAgIC8qIGRlY2ltYWwgcG9pbnQgKi8KCSAgICBzdHJjcHkgKGJ1ZiArIChkb3QgLSBzKSwgbG9jYWxlX2RhdGEtPmRlY2ltYWxfcG9pbnQpOwoJICAgIC8qIHJlc3Qgb2YgbnVtYmVyICovCgkgICAgc3RyY3B5IChidWYgKyAoZG90IC0gcykgKyBkbGVuLCBkb3QgKyAxKTsKCSAgICBidWZfZW5kID0gMDsKCSAgICB2ID0gc3RydG9kIChidWYsICZidWZfZW5kKTsKCSAgICBpZiAoYnVmX2VuZCkKCQlidWZfZW5kID0gcyArIChidWZfZW5kIC0gYnVmKTsKCSAgICBpZiAoZW5kKQoJCSplbmQgPSBidWZfZW5kOwoJfQogICAgfQogICAgZWxzZQoJdiA9IHN0cnRvZCAocywgZW5kKTsKICAgIHJldHVybiB2Owp9CgpzdGF0aWMgdm9pZApGY1BhcnNlRG91YmxlIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNDaGFyOCAqcywgKmVuZDsKICAgIGRvdWJsZSAgZDsKICAgIAogICAgaWYgKCFwYXJzZS0+cHN0YWNrKQoJcmV0dXJuOwogICAgcyA9IEZjU3RyQnVmRG9uZSAoJnBhcnNlLT5wc3RhY2stPnN0cik7CiAgICBpZiAoIXMpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJcmV0dXJuOwogICAgfQogICAgZW5kID0gMDsKICAgIGQgPSBGY1N0cnRvZCAoKGNoYXIgKikgcywgKGNoYXIgKiopJmVuZCk7CiAgICBpZiAoZW5kICE9IHMgKyBzdHJsZW4gKChjaGFyICopIHMpKQoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIlwiJXNcIjogbm90IGEgdmFsaWQgZG91YmxlIiwgcyk7CiAgICBlbHNlCglGY1ZTdGFja1B1c2hEb3VibGUgKHBhcnNlLCBkKTsKICAgIEZjU3RyRnJlZSAocyk7Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VTdHJpbmcgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY1ZTdGFja1RhZyB0YWcpCnsKICAgIEZjQ2hhcjggKnM7CiAgICAKICAgIGlmICghcGFyc2UtPnBzdGFjaykKCXJldHVybjsKICAgIHMgPSBGY1N0ckJ1ZkRvbmUgKCZwYXJzZS0+cHN0YWNrLT5zdHIpOwogICAgaWYgKCFzKQogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCXJldHVybjsKICAgIH0KICAgIGlmICghRmNWU3RhY2tQdXNoU3RyaW5nIChwYXJzZSwgdGFnLCBzKSkKCUZjU3RyRnJlZSAocyk7Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VNYXRyaXggKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY1ZTdGFjawkqdnN0YWNrOwogICAgZW51bSB7IG1fZG9uZSwgbV94eCwgbV94eSwgbV95eCwgbV95eSB9IG1hdHJpeF9zdGF0ZSA9IG1feXk7CiAgICBGY01hdHJpeAltOwogICAgCiAgICB3aGlsZSAoKHZzdGFjayA9IEZjVlN0YWNrUG9wIChwYXJzZSkpKQogICAgewoJZG91YmxlCXY7Cglzd2l0Y2ggKHZzdGFjay0+dGFnKSB7CgljYXNlIEZjVlN0YWNrSW50ZWdlcjoKCSAgICB2ID0gdnN0YWNrLT51LmludGVnZXI7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrRG91YmxlOgoJICAgIHYgPSB2c3RhY2stPnUuX2RvdWJsZTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm5vbi1kb3VibGUgbWF0cml4IGVsZW1lbnQiKTsKCSAgICB2ID0gMS4wOwoJICAgIGJyZWFrOwoJfQoJc3dpdGNoIChtYXRyaXhfc3RhdGUpIHsKCWNhc2UgbV94eDogbS54eCA9IHY7IGJyZWFrOwoJY2FzZSBtX3h5OiBtLnh5ID0gdjsgYnJlYWs7CgljYXNlIG1feXg6IG0ueXggPSB2OyBicmVhazsKCWNhc2UgbV95eTogbS55eSA9IHY7IGJyZWFrOwoJZGVmYXVsdDogYnJlYWs7Cgl9CgltYXRyaXhfc3RhdGUtLTsKICAgIH0KICAgIGlmIChtYXRyaXhfc3RhdGUgIT0gbV9kb25lKQoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIndyb25nIG51bWJlciBvZiBtYXRyaXggZWxlbWVudHMiKTsKICAgIGVsc2UKCUZjVlN0YWNrUHVzaE1hdHJpeCAocGFyc2UsICZtKTsKfQoKc3RhdGljIEZjQm9vbApGY0NvbmZpZ0xleEJvb2wgKGNvbnN0IEZjQ2hhcjggKmJvb2wpCnsKICAgIGlmICgqYm9vbCA9PSAndCcgfHwgKmJvb2wgPT0gJ1QnKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIGlmICgqYm9vbCA9PSAneScgfHwgKmJvb2wgPT0gJ1knKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIGlmICgqYm9vbCA9PSAnMScpCglyZXR1cm4gRmNUcnVlOwogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VCb29sIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNDaGFyOCAqczsKCiAgICBpZiAoIXBhcnNlLT5wc3RhY2spCglyZXR1cm47CiAgICBzID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKICAgIGlmICghcykKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CglyZXR1cm47CiAgICB9CiAgICBGY1ZTdGFja1B1c2hCb29sIChwYXJzZSwgRmNDb25maWdMZXhCb29sIChzKSk7CiAgICBGY1N0ckZyZWUgKHMpOwp9CgpzdGF0aWMgdm9pZApGY1BhcnNlRmFtaWxpZXMgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY1ZTdGFja1RhZyB0YWcpCnsKICAgIEZjVlN0YWNrCSp2c3RhY2s7CiAgICBGY0V4cHIJKmxlZnQsICpleHByID0gMCwgKm5ldzsKCiAgICB3aGlsZSAoKHZzdGFjayA9IEZjVlN0YWNrUG9wIChwYXJzZSkpKQogICAgewoJaWYgKHZzdGFjay0+dGFnICE9IEZjVlN0YWNrRmFtaWx5KQoJewoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgIm5vbi1mYW1pbHkiKTsKCSAgICBGY1ZTdGFja0Rlc3Ryb3kgKHZzdGFjayk7CgkgICAgY29udGludWU7Cgl9CglsZWZ0ID0gdnN0YWNrLT51LmV4cHI7Cgl2c3RhY2stPnRhZyA9IEZjVlN0YWNrTm9uZTsKCUZjVlN0YWNrRGVzdHJveSAodnN0YWNrKTsKCWlmIChleHByKQoJewoJICAgIG5ldyA9IEZjRXhwckNyZWF0ZU9wIChsZWZ0LCBGY09wQ29tbWEsIGV4cHIpOwoJICAgIGlmICghbmV3KQoJICAgIHsKCQlGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJCUZjRXhwckRlc3Ryb3kgKGxlZnQpOwoJCUZjRXhwckRlc3Ryb3kgKGV4cHIpOwoJCWJyZWFrOwoJICAgIH0KCSAgICBleHByID0gbmV3OwoJfQoJZWxzZQoJICAgIGV4cHIgPSBsZWZ0OwogICAgfQogICAgaWYgKGV4cHIpCiAgICB7CglpZiAoIUZjVlN0YWNrUHVzaEV4cHIgKHBhcnNlLCB0YWcsIGV4cHIpKQoJewoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CgkgICAgaWYgKGV4cHIpCgkJRmNFeHByRGVzdHJveSAoZXhwcik7Cgl9CiAgICB9Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VGYW1pbHkgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBGY0NoYXI4ICpzOwogICAgRmNFeHByICAqZXhwcjsKCiAgICBpZiAoIXBhcnNlLT5wc3RhY2spCglyZXR1cm47CiAgICBzID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKICAgIGlmICghcykKICAgIHsKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CglyZXR1cm47CiAgICB9CiAgICBleHByID0gRmNFeHByQ3JlYXRlU3RyaW5nIChzKTsKICAgIEZjU3RyRnJlZSAocyk7CiAgICBpZiAoZXhwcikKCUZjVlN0YWNrUHVzaEV4cHIgKHBhcnNlLCBGY1ZTdGFja0ZhbWlseSwgZXhwcik7Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VBbGlhcyAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIEZjRXhwcgkqZmFtaWx5ID0gMCwgKmFjY2VwdCA9IDAsICpwcmVmZXIgPSAwLCAqZGVmID0gMCwgKm5ldyA9IDA7CiAgICBGY0VkaXQJKmVkaXQgPSAwLCAqbmV4dDsKICAgIEZjVlN0YWNrCSp2c3RhY2s7CiAgICBGY1Rlc3QJKnRlc3Q7CgogICAgd2hpbGUgKCh2c3RhY2sgPSBGY1ZTdGFja1BvcCAocGFyc2UpKSkgCiAgICB7Cglzd2l0Y2ggKHZzdGFjay0+dGFnKSB7CgljYXNlIEZjVlN0YWNrRmFtaWx5OgoJICAgIGlmIChmYW1pbHkpCgkgICAgewoJCW5ldyA9IEZjRXhwckNyZWF0ZU9wICh2c3RhY2stPnUuZXhwciwgRmNPcENvbW1hLCBmYW1pbHkpOwoJCWlmICghbmV3KQoJCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJCWVsc2UKCQkgICAgZmFtaWx5ID0gbmV3OwoJICAgIH0KCSAgICBlbHNlCgkJbmV3ID0gdnN0YWNrLT51LmV4cHI7CgkgICAgaWYgKG5ldykKCSAgICB7CgkJZmFtaWx5ID0gbmV3OwoJCXZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJICAgIH0KCSAgICBicmVhazsKCWNhc2UgRmNWU3RhY2tQcmVmZXI6CgkgICAgaWYgKHByZWZlcikKCQlGY0V4cHJEZXN0cm95IChwcmVmZXIpOwoJICAgIHByZWZlciA9IHZzdGFjay0+dS5leHByOwoJICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJICAgIGJyZWFrOwoJY2FzZSBGY1ZTdGFja0FjY2VwdDoKCSAgICBpZiAoYWNjZXB0KQoJCUZjRXhwckRlc3Ryb3kgKGFjY2VwdCk7CgkgICAgYWNjZXB0ID0gdnN0YWNrLT51LmV4cHI7CgkgICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja05vbmU7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrRGVmYXVsdDoKCSAgICBpZiAoZGVmKQoJCUZjRXhwckRlc3Ryb3kgKGRlZik7CgkgICAgZGVmID0gdnN0YWNrLT51LmV4cHI7CgkgICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja05vbmU7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgImJhZCBhbGlhcyIpOwoJICAgIGJyZWFrOwoJfQoJRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwogICAgfQogICAgaWYgKCFmYW1pbHkpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAibWlzc2luZyBmYW1pbHkgaW4gYWxpYXMiKTsKCWlmIChwcmVmZXIpCgkgICAgRmNFeHByRGVzdHJveSAocHJlZmVyKTsKCWlmIChhY2NlcHQpCgkgICAgRmNFeHByRGVzdHJveSAoYWNjZXB0KTsKCWlmIChkZWYpCgkgICAgRmNFeHByRGVzdHJveSAoZGVmKTsKCXJldHVybjsKICAgIH0KICAgIGlmIChwcmVmZXIpCiAgICB7CgllZGl0ID0gRmNFZGl0Q3JlYXRlIChGY0NvbmZpZ1NhdmVGaWVsZCAoImZhbWlseSIpLAoJCQkgICAgIEZjT3BQcmVwZW5kLAoJCQkgICAgIHByZWZlciwKCQkJICAgICBGY1ZhbHVlQmluZGluZ1dlYWspOwoJaWYgKGVkaXQpCgkgICAgZWRpdC0+bmV4dCA9IDA7CgllbHNlCgkgICAgRmNFeHByRGVzdHJveSAocHJlZmVyKTsKICAgIH0KICAgIGlmIChhY2NlcHQpCiAgICB7CgluZXh0ID0gZWRpdDsKCWVkaXQgPSBGY0VkaXRDcmVhdGUgKEZjQ29uZmlnU2F2ZUZpZWxkICgiZmFtaWx5IiksCgkJCSAgICAgRmNPcEFwcGVuZCwKCQkJICAgICBhY2NlcHQsCgkJCSAgICAgRmNWYWx1ZUJpbmRpbmdXZWFrKTsKCWlmIChlZGl0KQoJICAgIGVkaXQtPm5leHQgPSBuZXh0OwoJZWxzZQoJICAgIEZjRXhwckRlc3Ryb3kgKGFjY2VwdCk7CiAgICB9CiAgICBpZiAoZGVmKQogICAgewoJbmV4dCA9IGVkaXQ7CgllZGl0ID0gRmNFZGl0Q3JlYXRlIChGY0NvbmZpZ1NhdmVGaWVsZCAoImZhbWlseSIpLAoJCQkgICAgIEZjT3BBcHBlbmRMYXN0LAoJCQkgICAgIGRlZiwKCQkJICAgICBGY1ZhbHVlQmluZGluZ1dlYWspOwoJaWYgKGVkaXQpCgkgICAgZWRpdC0+bmV4dCA9IG5leHQ7CgllbHNlCgkgICAgRmNFeHByRGVzdHJveSAoZGVmKTsKICAgIH0KICAgIGlmIChlZGl0KQogICAgewoJdGVzdCA9IEZjVGVzdENyZWF0ZSAoRmNRdWFsQW55LAoJCQkgICAgIChGY0NoYXI4ICopIEZDX0ZBTUlMWSwKCQkJICAgICBGY09wRXF1YWwsCgkJCSAgICAgZmFtaWx5KTsKCWlmICh0ZXN0KQoJICAgIGlmICghRmNDb25maWdBZGRFZGl0IChwYXJzZS0+Y29uZmlnLCB0ZXN0LCBlZGl0LCBGY01hdGNoUGF0dGVybikpCgkJRmNUZXN0RGVzdHJveSAodGVzdCk7CiAgICB9CiAgICBlbHNlCglGY0V4cHJEZXN0cm95IChmYW1pbHkpOwp9CgpzdGF0aWMgRmNFeHByICoKRmNQb3BFeHByIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNWU3RhY2sJKnZzdGFjayA9IEZjVlN0YWNrUG9wIChwYXJzZSk7CiAgICBGY0V4cHIJKmV4cHIgPSAwOwogICAgaWYgKCF2c3RhY2spCglyZXR1cm4gMDsKICAgIHN3aXRjaCAodnN0YWNrLT50YWcpIHsKICAgIGNhc2UgRmNWU3RhY2tOb25lOgoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrU3RyaW5nOgogICAgY2FzZSBGY1ZTdGFja0ZhbWlseToKCWV4cHIgPSBGY0V4cHJDcmVhdGVTdHJpbmcgKHZzdGFjay0+dS5zdHJpbmcpOwoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrRmllbGQ6CglleHByID0gRmNFeHByQ3JlYXRlRmllbGQgKChjaGFyICopIHZzdGFjay0+dS5zdHJpbmcpOwoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrQ29uc3RhbnQ6CglleHByID0gRmNFeHByQ3JlYXRlQ29uc3QgKHZzdGFjay0+dS5zdHJpbmcpOwoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrUHJlZmVyOgogICAgY2FzZSBGY1ZTdGFja0FjY2VwdDoKICAgIGNhc2UgRmNWU3RhY2tEZWZhdWx0OgoJZXhwciA9IHZzdGFjay0+dS5leHByOwoJdnN0YWNrLT50YWcgPSBGY1ZTdGFja05vbmU7CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tJbnRlZ2VyOgoJZXhwciA9IEZjRXhwckNyZWF0ZUludGVnZXIgKHZzdGFjay0+dS5pbnRlZ2VyKTsKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja0RvdWJsZToKCWV4cHIgPSBGY0V4cHJDcmVhdGVEb3VibGUgKHZzdGFjay0+dS5fZG91YmxlKTsKCWJyZWFrOwogICAgY2FzZSBGY1ZTdGFja01hdHJpeDoKCWV4cHIgPSBGY0V4cHJDcmVhdGVNYXRyaXggKHZzdGFjay0+dS5tYXRyaXgpOwoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrQm9vbDoKCWV4cHIgPSBGY0V4cHJDcmVhdGVCb29sICh2c3RhY2stPnUuYm9vbCk7CglicmVhazsKICAgIGNhc2UgRmNWU3RhY2tUZXN0OgoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrRXhwcjoKCWV4cHIgPSB2c3RhY2stPnUuZXhwcjsKCXZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJYnJlYWs7CiAgICBjYXNlIEZjVlN0YWNrRWRpdDoKCWJyZWFrOwogICAgfQogICAgRmNWU3RhY2tEZXN0cm95ICh2c3RhY2spOwogICAgcmV0dXJuIGV4cHI7Cn0KCnN0YXRpYyBGY0V4cHIgKgpGY1BvcEV4cHJzIChGY0NvbmZpZ1BhcnNlICpwYXJzZSwgRmNPcCBvcCkKewogICAgRmNFeHByICAqbGVmdCwgKmV4cHIgPSAwLCAqbmV3OwoKICAgIHdoaWxlICgobGVmdCA9IEZjUG9wRXhwciAocGFyc2UpKSkKICAgIHsKCWlmIChleHByKQoJewoJICAgIG5ldyA9IEZjRXhwckNyZWF0ZU9wIChsZWZ0LCBvcCwgZXhwcik7CgkgICAgaWYgKCFuZXcpCgkgICAgewoJCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CgkJRmNFeHByRGVzdHJveSAobGVmdCk7CgkJRmNFeHByRGVzdHJveSAoZXhwcik7CgkJYnJlYWs7CgkgICAgfQoJICAgIGV4cHIgPSBuZXc7Cgl9CgllbHNlCgkgICAgZXhwciA9IGxlZnQ7CiAgICB9CiAgICByZXR1cm4gZXhwcjsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZUV4cHIgKEZjQ29uZmlnUGFyc2UgKnBhcnNlLCBGY09wIG9wKQp7CiAgICBGY0V4cHIgICpleHByID0gRmNQb3BFeHBycyAocGFyc2UsIG9wKTsKICAgIGlmIChleHByKQoJRmNWU3RhY2tQdXNoRXhwciAocGFyc2UsIEZjVlN0YWNrRXhwciwgZXhwcik7Cn0KCnN0YXRpYyB2b2lkCkZjUGFyc2VJbmNsdWRlIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgRmNDaGFyOAkgICAgKnM7CiAgICBjb25zdCBGY0NoYXI4ICAgKmk7CiAgICBGY0Jvb2wJICAgIGlnbm9yZV9taXNzaW5nID0gRmNGYWxzZTsKICAgIAogICAgcyA9IEZjU3RyQnVmRG9uZSAoJnBhcnNlLT5wc3RhY2stPnN0cik7CiAgICBpZiAoIXMpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJcmV0dXJuOwogICAgfQogICAgaSA9IEZjQ29uZmlnR2V0QXR0cmlidXRlIChwYXJzZSwgImlnbm9yZV9taXNzaW5nIik7CiAgICBpZiAoaSAmJiBGY0NvbmZpZ0xleEJvb2wgKChGY0NoYXI4ICopIGkpID09IEZjVHJ1ZSkKCWlnbm9yZV9taXNzaW5nID0gRmNUcnVlOwogICAgaWYgKCFGY0NvbmZpZ1BhcnNlQW5kTG9hZCAocGFyc2UtPmNvbmZpZywgcywgIWlnbm9yZV9taXNzaW5nKSkKCXBhcnNlLT5lcnJvciA9IEZjVHJ1ZTsKICAgIGZyZWUgKHMpOwp9Cgp0eXBlZGVmIHN0cnVjdCBfRmNPcE1hcCB7CiAgICBjaGFyICAgICpuYW1lOwogICAgRmNPcCAgICBvcDsKfSBGY09wTWFwOwoKc3RhdGljIEZjT3AKRmNDb25maWdMZXhPcCAoY29uc3QgRmNDaGFyOCAqb3AsIGNvbnN0IEZjT3BNYXAJKm1hcCwgaW50IG5tYXApCnsKICAgIGludAlpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBubWFwOyBpKyspCglpZiAoIXN0cmNtcCAoKGNoYXIgKikgb3AsIG1hcFtpXS5uYW1lKSkgCgkgICAgcmV0dXJuIG1hcFtpXS5vcDsKICAgIHJldHVybiBGY09wSW52YWxpZDsKfQoKc3RhdGljIGNvbnN0IEZjT3BNYXAgZmNDb21wYXJlT3BzW10gPSB7CiAgICB7ICJlcSIsCQlGY09wRXF1YWwJICAgIH0sCiAgICB7ICJub3RfZXEiLAkJRmNPcE5vdEVxdWFsCSAgICB9LAogICAgeyAibGVzcyIsCQlGY09wTGVzcwkgICAgfSwKICAgIHsgImxlc3NfZXEiLAlGY09wTGVzc0VxdWFsCSAgICB9LAogICAgeyAibW9yZSIsCQlGY09wTW9yZQkgICAgfSwKICAgIHsgIm1vcmVfZXEiLAlGY09wTW9yZUVxdWFsCSAgICB9Cn07CgojZGVmaW5lIE5VTV9DT01QQVJFX09QUyAoc2l6ZW9mIGZjQ29tcGFyZU9wcyAvIHNpemVvZiBmY0NvbXBhcmVPcHNbMF0pCgpzdGF0aWMgRmNPcApGY0NvbmZpZ0xleENvbXBhcmUgKGNvbnN0IEZjQ2hhcjggKmNvbXBhcmUpCnsKICAgIHJldHVybiBGY0NvbmZpZ0xleE9wIChjb21wYXJlLCBmY0NvbXBhcmVPcHMsIE5VTV9DT01QQVJFX09QUyk7Cn0KCgpzdGF0aWMgdm9pZApGY1BhcnNlVGVzdCAoRmNDb25maWdQYXJzZSAqcGFyc2UpCnsKICAgIGNvbnN0IEZjQ2hhcjggICAqcXVhbF9zdHJpbmc7CiAgICBGY1F1YWwJICAgIHF1YWw7CiAgICBjb25zdCBGY0NoYXI4ICAgKm5hbWU7CiAgICBjb25zdCBGY0NoYXI4ICAgKmNvbXBhcmVfc3RyaW5nOwogICAgRmNPcAkgICAgY29tcGFyZTsKICAgIEZjRXhwcgkgICAgKmV4cHI7CiAgICBGY1Rlc3QJICAgICp0ZXN0OwoKICAgIHF1YWxfc3RyaW5nID0gRmNDb25maWdHZXRBdHRyaWJ1dGUgKHBhcnNlLCAicXVhbCIpOwogICAgaWYgKCFxdWFsX3N0cmluZykKCXF1YWwgPSBGY1F1YWxBbnk7CiAgICBlbHNlCiAgICB7CglpZiAoIXN0cmNtcCAoKGNoYXIgKikgcXVhbF9zdHJpbmcsICJhbnkiKSkKCSAgICBxdWFsID0gRmNRdWFsQW55OwoJZWxzZSBpZiAoIXN0cmNtcCAoKGNoYXIgKikgcXVhbF9zdHJpbmcsICJhbGwiKSkKCSAgICBxdWFsID0gRmNRdWFsQWxsOwoJZWxzZSBpZiAoIXN0cmNtcCAoKGNoYXIgKikgcXVhbF9zdHJpbmcsICJmaXJzdCIpKQoJICAgIHF1YWwgPSBGY1F1YWxGaXJzdDsKCWVsc2UgaWYgKCFzdHJjbXAgKChjaGFyICopIHF1YWxfc3RyaW5nLCAibm90X2ZpcnN0IikpCgkgICAgcXVhbCA9IEZjUXVhbE5vdEZpcnN0OwoJZWxzZQoJewoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgImludmFsaWQgdGVzdCBxdWFsIFwiJXNcIiIsIHF1YWxfc3RyaW5nKTsKCSAgICByZXR1cm47Cgl9CiAgICB9CiAgICBuYW1lID0gRmNDb25maWdHZXRBdHRyaWJ1dGUgKHBhcnNlLCAibmFtZSIpOwogICAgaWYgKCFuYW1lKQogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAibWlzc2luZyB0ZXN0IG5hbWUiKTsKCXJldHVybjsKICAgIH0KICAgIGNvbXBhcmVfc3RyaW5nID0gRmNDb25maWdHZXRBdHRyaWJ1dGUgKHBhcnNlLCAiY29tcGFyZSIpOwogICAgaWYgKCFjb21wYXJlX3N0cmluZykKCWNvbXBhcmUgPSBGY09wRXF1YWw7CiAgICBlbHNlCiAgICB7Cgljb21wYXJlID0gRmNDb25maWdMZXhDb21wYXJlIChjb21wYXJlX3N0cmluZyk7CglpZiAoY29tcGFyZSA9PSBGY09wSW52YWxpZCkKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJpbnZhbGlkIHRlc3QgY29tcGFyZSBcIiVzXCIiLCBjb21wYXJlX3N0cmluZyk7CgkgICAgcmV0dXJuOwoJfQogICAgfQogICAgZXhwciA9IEZjUG9wRXhwcnMgKHBhcnNlLCBGY09wQ29tbWEpOwogICAgaWYgKCFleHByKQogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAibWlzc2luZyB0ZXN0IGV4cHJlc3Npb24iKTsKCXJldHVybjsKICAgIH0KICAgIHRlc3QgPSBGY1Rlc3RDcmVhdGUgKHF1YWwsIG5hbWUsIGNvbXBhcmUsIGV4cHIpOwogICAgaWYgKCF0ZXN0KQogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCXJldHVybjsKICAgIH0KICAgIEZjVlN0YWNrUHVzaFRlc3QgKHBhcnNlLCB0ZXN0KTsKfQoKc3RhdGljIGNvbnN0IEZjT3BNYXAgZmNNb2RlT3BzW10gPSB7CiAgICB7ICJhc3NpZ24iLAkJRmNPcEFzc2lnbgkgICAgfSwKICAgIHsgImFzc2lnbl9yZXBsYWNlIiwJRmNPcEFzc2lnblJlcGxhY2UgICB9LAogICAgeyAicHJlcGVuZCIsCUZjT3BQcmVwZW5kCSAgICB9LAogICAgeyAicHJlcGVuZF9maXJzdCIsCUZjT3BQcmVwZW5kRmlyc3QgICAgfSwKICAgIHsgImFwcGVuZCIsCQlGY09wQXBwZW5kCSAgICB9LAogICAgeyAiYXBwZW5kX2xhc3QiLAlGY09wQXBwZW5kTGFzdAkgICAgfSwKfTsKCiNkZWZpbmUgTlVNX01PREVfT1BTIChzaXplb2YgZmNNb2RlT3BzIC8gc2l6ZW9mIGZjTW9kZU9wc1swXSkKCnN0YXRpYyBGY09wCkZjQ29uZmlnTGV4TW9kZSAoY29uc3QgRmNDaGFyOCAqbW9kZSkKewogICAgcmV0dXJuIEZjQ29uZmlnTGV4T3AgKG1vZGUsIGZjTW9kZU9wcywgTlVNX01PREVfT1BTKTsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZUVkaXQgKEZjQ29uZmlnUGFyc2UgKnBhcnNlKQp7CiAgICBjb25zdCBGY0NoYXI4ICAgKm5hbWU7CiAgICBjb25zdCBGY0NoYXI4ICAgKm1vZGVfc3RyaW5nOwogICAgY29uc3QgRmNDaGFyOCAgICpiaW5kaW5nX3N0cmluZzsKICAgIEZjT3AJICAgIG1vZGU7CiAgICBGY1ZhbHVlQmluZGluZyAgYmluZGluZzsKICAgIEZjRXhwcgkgICAgKmV4cHI7CiAgICBGY0VkaXQJICAgICplZGl0OwoKICAgIG5hbWUgPSBGY0NvbmZpZ0dldEF0dHJpYnV0ZSAocGFyc2UsICJuYW1lIik7CiAgICBpZiAoIW5hbWUpCiAgICB7CglGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJtaXNzaW5nIGVkaXQgbmFtZSIpOwoJcmV0dXJuOwogICAgfQogICAgbW9kZV9zdHJpbmcgPSBGY0NvbmZpZ0dldEF0dHJpYnV0ZSAocGFyc2UsICJtb2RlIik7CiAgICBpZiAoIW1vZGVfc3RyaW5nKQoJbW9kZSA9IEZjT3BBc3NpZ247CiAgICBlbHNlCiAgICB7Cgltb2RlID0gRmNDb25maWdMZXhNb2RlIChtb2RlX3N0cmluZyk7CglpZiAobW9kZSA9PSBGY09wSW52YWxpZCkKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJpbnZhbGlkIGVkaXQgbW9kZSBcIiVzXCIiLCBtb2RlX3N0cmluZyk7CgkgICAgcmV0dXJuOwoJfQogICAgfQogICAgYmluZGluZ19zdHJpbmcgPSBGY0NvbmZpZ0dldEF0dHJpYnV0ZSAocGFyc2UsICJiaW5kaW5nIik7CiAgICBpZiAoIWJpbmRpbmdfc3RyaW5nKQoJYmluZGluZyA9IEZjVmFsdWVCaW5kaW5nV2VhazsKICAgIGVsc2UKICAgIHsKCWlmICghc3RyY21wICgoY2hhciAqKSBiaW5kaW5nX3N0cmluZywgIndlYWsiKSkKCSAgICBiaW5kaW5nID0gRmNWYWx1ZUJpbmRpbmdXZWFrOwoJZWxzZSBpZiAoIXN0cmNtcCAoKGNoYXIgKikgYmluZGluZ19zdHJpbmcsICJzdHJvbmciKSkKCSAgICBiaW5kaW5nID0gRmNWYWx1ZUJpbmRpbmdTdHJvbmc7CgllbHNlCgl7CgkgICAgRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVXYXJuaW5nLCAiaW52YWxpZCBlZGl0IGJpbmRpbmcgXCIlc1wiIiwgYmluZGluZ19zdHJpbmcpOwoJICAgIHJldHVybjsKCX0KICAgIH0KICAgIGV4cHIgPSBGY1BvcEV4cHJzIChwYXJzZSwgRmNPcENvbW1hKTsKICAgIGVkaXQgPSBGY0VkaXRDcmVhdGUgKChjaGFyICopIEZjU3RyQ29weSAobmFtZSksIG1vZGUsIGV4cHIsIGJpbmRpbmcpOwogICAgaWYgKCFlZGl0KQogICAgewoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKCUZjRXhwckRlc3Ryb3kgKGV4cHIpOwoJcmV0dXJuOwogICAgfQogICAgaWYgKCFGY1ZTdGFja1B1c2hFZGl0IChwYXJzZSwgZWRpdCkpCglGY0VkaXREZXN0cm95IChlZGl0KTsKfQoKc3RhdGljIHZvaWQKRmNQYXJzZU1hdGNoIChGY0NvbmZpZ1BhcnNlICpwYXJzZSkKewogICAgY29uc3QgRmNDaGFyOCAgICpraW5kX25hbWU7CiAgICBGY01hdGNoS2luZAkgICAga2luZDsKICAgIEZjVGVzdAkgICAgKnRlc3QgPSAwOwogICAgRmNFZGl0CSAgICAqZWRpdCA9IDA7CiAgICBGY1ZTdGFjawkgICAgKnZzdGFjazsKCiAgICBraW5kX25hbWUgPSBGY0NvbmZpZ0dldEF0dHJpYnV0ZSAocGFyc2UsICJ0YXJnZXQiKTsKICAgIGlmICgha2luZF9uYW1lKQoJa2luZCA9IEZjTWF0Y2hQYXR0ZXJuOwogICAgZWxzZQogICAgewoJaWYgKCFzdHJjbXAgKChjaGFyICopIGtpbmRfbmFtZSwgInBhdHRlcm4iKSkKCSAgICBraW5kID0gRmNNYXRjaFBhdHRlcm47CgllbHNlIGlmICghc3RyY21wICgoY2hhciAqKSBraW5kX25hbWUsICJmb250IikpCgkgICAga2luZCA9IEZjTWF0Y2hGb250OwoJZWxzZQoJewoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlV2FybmluZywgImludmFsaWQgbWF0Y2ggdGFyZ2V0IFwiJXNcIiIsIGtpbmRfbmFtZSk7CgkgICAgcmV0dXJuOwoJfQogICAgfQogICAgd2hpbGUgKCh2c3RhY2sgPSBGY1ZTdGFja1BvcCAocGFyc2UpKSkKICAgIHsKCXN3aXRjaCAodnN0YWNrLT50YWcpIHsKCWNhc2UgRmNWU3RhY2tUZXN0OgoJICAgIHZzdGFjay0+dS50ZXN0LT5uZXh0ID0gdGVzdDsKCSAgICB0ZXN0ID0gdnN0YWNrLT51LnRlc3Q7CgkgICAgdnN0YWNrLT50YWcgPSBGY1ZTdGFja05vbmU7CgkgICAgYnJlYWs7CgljYXNlIEZjVlN0YWNrRWRpdDoKCSAgICB2c3RhY2stPnUuZWRpdC0+bmV4dCA9IGVkaXQ7CgkgICAgZWRpdCA9IHZzdGFjay0+dS5lZGl0OwoJICAgIHZzdGFjay0+dGFnID0gRmNWU3RhY2tOb25lOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZVdhcm5pbmcsICJpbnZhbGlkIG1hdGNoIGVsZW1lbnQiKTsKCSAgICBicmVhazsKCX0KCUZjVlN0YWNrRGVzdHJveSAodnN0YWNrKTsKICAgIH0KICAgIGlmICghRmNDb25maWdBZGRFZGl0IChwYXJzZS0+Y29uZmlnLCB0ZXN0LCBlZGl0LCBraW5kKSkKCUZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7Cn0KCnN0YXRpYyB2b2lkCkZjRW5kRWxlbWVudCh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKm5hbWUpCnsKICAgIEZjQ29uZmlnUGFyc2UgICAqcGFyc2UgPSB1c2VyRGF0YTsKICAgIEZjQ2hhcjgJICAgICpkYXRhOwogICAgCiAgICBpZiAoIXBhcnNlLT5wc3RhY2spCglyZXR1cm47CiAgICBzd2l0Y2ggKHBhcnNlLT5wc3RhY2stPmVsZW1lbnQpIHsKICAgIGNhc2UgRmNFbGVtZW50Tm9uZToKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRGb250Y29uZmlnOgoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudERpcjoKCWRhdGEgPSBGY1N0ckJ1ZkRvbmUgKCZwYXJzZS0+cHN0YWNrLT5zdHIpOwoJaWYgKCFkYXRhKQoJewoJICAgIEZjQ29uZmlnTWVzc2FnZSAocGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJvdXQgb2YgbWVtb3J5Iik7CgkgICAgYnJlYWs7Cgl9CglpZiAoIUZjQ29uZmlnQWRkRGlyIChwYXJzZS0+Y29uZmlnLCBkYXRhKSkKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJZnJlZSAoZGF0YSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Q2FjaGU6CglkYXRhID0gRmNTdHJCdWZEb25lICgmcGFyc2UtPnBzdGFjay0+c3RyKTsKCWlmICghZGF0YSkKCXsKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJICAgIGJyZWFrOwoJfQoJaWYgKCFGY0NvbmZpZ1NldENhY2hlIChwYXJzZS0+Y29uZmlnLCBkYXRhKSkKCSAgICBGY0NvbmZpZ01lc3NhZ2UgKHBhcnNlLCBGY1NldmVyZUVycm9yLCAib3V0IG9mIG1lbW9yeSIpOwoJZnJlZSAoZGF0YSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50SW5jbHVkZToKCUZjUGFyc2VJbmNsdWRlIChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Q29uZmlnOgoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudE1hdGNoOgoJRmNQYXJzZU1hdGNoIChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50QWxpYXM6CglGY1BhcnNlQWxpYXMgKHBhcnNlKTsKCWJyZWFrOwoKICAgIGNhc2UgRmNFbGVtZW50Qmxhbms6CglGY1BhcnNlQmxhbmsgKHBhcnNlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRSZXNjYW46CglGY1BhcnNlUmVzY2FuIChwYXJzZSk7CglicmVhazsKCQogICAgY2FzZSBGY0VsZW1lbnRQcmVmZXI6CglGY1BhcnNlRmFtaWxpZXMgKHBhcnNlLCBGY1ZTdGFja1ByZWZlcik7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50QWNjZXB0OgoJRmNQYXJzZUZhbWlsaWVzIChwYXJzZSwgRmNWU3RhY2tBY2NlcHQpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudERlZmF1bHQ6CglGY1BhcnNlRmFtaWxpZXMgKHBhcnNlLCBGY1ZTdGFja0RlZmF1bHQpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudEZhbWlseToKCUZjUGFyc2VGYW1pbHkgKHBhcnNlKTsKCWJyZWFrOwoKICAgIGNhc2UgRmNFbGVtZW50VGVzdDoKCUZjUGFyc2VUZXN0IChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50RWRpdDoKCUZjUGFyc2VFZGl0IChwYXJzZSk7CglicmVhazsKCiAgICBjYXNlIEZjRWxlbWVudEludDoKCUZjUGFyc2VJbnQgKHBhcnNlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnREb3VibGU6CglGY1BhcnNlRG91YmxlIChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50U3RyaW5nOgoJRmNQYXJzZVN0cmluZyAocGFyc2UsIEZjVlN0YWNrU3RyaW5nKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRNYXRyaXg6CglGY1BhcnNlTWF0cml4IChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Qm9vbDoKCUZjUGFyc2VCb29sIChwYXJzZSk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50Q2hhcnNldDoKLyoJRmNQYXJzZUNoYXJzZXQgKHBhcnNlKTsgKi8KCWJyZWFrOwoKICAgIGNhc2UgRmNFbGVtZW50TmFtZToKCUZjUGFyc2VTdHJpbmcgKHBhcnNlLCBGY1ZTdGFja0ZpZWxkKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRDb25zdDoKCUZjUGFyc2VTdHJpbmcgKHBhcnNlLCBGY1ZTdGFja0NvbnN0YW50KTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRPcjoKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcE9yKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRBbmQ6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BBbmQpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudEVxOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wRXF1YWwpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudE5vdEVxOgoJRmNQYXJzZUV4cHIgKHBhcnNlLCBGY09wTm90RXF1YWwpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudExlc3M6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BMZXNzKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRMZXNzRXE6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BMZXNzRXF1YWwpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudE1vcmU6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BNb3JlKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRNb3JlRXE6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BNb3JlRXF1YWwpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudFBsdXM6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BQbHVzKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRNaW51czoKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcE1pbnVzKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnRUaW1lczoKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcFRpbWVzKTsKCWJyZWFrOwogICAgY2FzZSBGY0VsZW1lbnREaXZpZGU6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BEaXZpZGUpOwoJYnJlYWs7CiAgICBjYXNlIEZjRWxlbWVudE5vdDoKCUZjUGFyc2VFeHByIChwYXJzZSwgRmNPcE5vdCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50SWY6CglGY1BhcnNlRXhwciAocGFyc2UsIEZjT3BRdWVzdCk7CglicmVhazsKICAgIGNhc2UgRmNFbGVtZW50VW5rbm93bjoKCWJyZWFrOwogICAgfQogICAgKHZvaWQpIEZjUFN0YWNrUG9wIChwYXJzZSk7Cn0KCnN0YXRpYyB2b2lkCkZjQ2hhcmFjdGVyRGF0YSAodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKQp7CiAgICBGY0NvbmZpZ1BhcnNlICAgKnBhcnNlID0gdXNlckRhdGE7CiAgICAKICAgIGlmICghcGFyc2UtPnBzdGFjaykKCXJldHVybjsKICAgIGlmICghRmNTdHJCdWZEYXRhICgmcGFyc2UtPnBzdGFjay0+c3RyLCAoRmNDaGFyOCAqKSBzLCBsZW4pKQoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgIm91dCBvZiBtZW1vcnkiKTsKfQoKc3RhdGljIHZvaWQKRmNTdGFydERvY3R5cGVEZWNsICh2b2lkCSAgICAqdXNlckRhdGEsCgkJICAgIGNvbnN0IFhNTF9DaGFyICAqZG9jdHlwZU5hbWUsCgkJICAgIGNvbnN0IFhNTF9DaGFyICAqc3lzaWQsCgkJICAgIGNvbnN0IFhNTF9DaGFyICAqcHViaWQsCgkJICAgIGludAkJICAgIGhhc19pbnRlcm5hbF9zdWJzZXQpCnsKICAgIEZjQ29uZmlnUGFyc2UgICAqcGFyc2UgPSB1c2VyRGF0YTsKCiAgICBpZiAoc3RyY21wICgoY2hhciAqKSBkb2N0eXBlTmFtZSwgImZvbnRjb25maWciKSAhPSAwKQoJRmNDb25maWdNZXNzYWdlIChwYXJzZSwgRmNTZXZlcmVFcnJvciwgImludmFsaWQgZG9jdHlwZSBcIiVzXCIiLCBkb2N0eXBlTmFtZSk7Cn0KCnN0YXRpYyB2b2lkCkZjRW5kRG9jdHlwZURlY2wgKHZvaWQgKnVzZXJEYXRhKQp7Cn0KCkZjQm9vbApGY0NvbmZpZ1BhcnNlQW5kTG9hZCAoRmNDb25maWcJICAgICpjb25maWcsCgkJICAgICAgY29uc3QgRmNDaGFyOCAqbmFtZSwKCQkgICAgICBGY0Jvb2wJICAgIGNvbXBsYWluKQp7CgogICAgWE1MX1BhcnNlcgkgICAgcDsKICAgIEZjQ2hhcjgJICAgICpmaWxlbmFtZTsKICAgIEZJTEUJICAgICpmOwogICAgaW50CQkgICAgbGVuOwogICAgdm9pZAkgICAgKmJ1ZjsKICAgIEZjQ29uZmlnUGFyc2UgICBwYXJzZTsKICAgIEZjQm9vbAkgICAgZXJyb3IgPSBGY1RydWU7CiAgICAKICAgIGZpbGVuYW1lID0gRmNDb25maWdGaWxlbmFtZSAobmFtZSk7CiAgICBpZiAoIWZpbGVuYW1lKQoJZ290byBiYWlsMDsKICAgIAogICAgaWYgKCFGY1N0clNldEFkZCAoY29uZmlnLT5jb25maWdGaWxlcywgZmlsZW5hbWUpKQoJZ290byBiYWlsMDsKCiAgICBmID0gZm9wZW4gKChjaGFyICopIGZpbGVuYW1lLCAiciIpOwogICAgZnJlZSAoZmlsZW5hbWUpOwogICAgaWYgKCFmKQoJZ290byBiYWlsMDsKICAgIAogICAgcCA9IFhNTF9QYXJzZXJDcmVhdGUgKCJVVEYtOCIpOwogICAgaWYgKCFwKQoJZ290byBiYWlsMTsKCiAgICBpZiAoIUZjQ29uZmlnSW5pdCAoJnBhcnNlLCBuYW1lLCBjb25maWcsIHApKQoJZ290byBiYWlsMjsKCiAgICBYTUxfU2V0VXNlckRhdGEgKHAsICZwYXJzZSk7CiAgICAKICAgIFhNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIgKHAsIEZjU3RhcnREb2N0eXBlRGVjbCwgRmNFbmREb2N0eXBlRGVjbCk7CiAgICBYTUxfU2V0RWxlbWVudEhhbmRsZXIgKHAsIEZjU3RhcnRFbGVtZW50LCBGY0VuZEVsZW1lbnQpOwogICAgWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyIChwLCBGY0NoYXJhY3RlckRhdGEpOwoJCiAgICBkbyB7CglidWYgPSBYTUxfR2V0QnVmZmVyIChwLCBCVUZTSVopOwoJaWYgKCFidWYpCgl7CgkgICAgRmNDb25maWdNZXNzYWdlICgmcGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJjYW5ub3QgZ2V0IHBhcnNlIGJ1ZmZlciIpOwoJICAgIGdvdG8gYmFpbDM7Cgl9CglsZW4gPSBmcmVhZCAoYnVmLCAxLCBCVUZTSVosIGYpOwoJaWYgKGxlbiA8IDApCgl7CgkgICAgRmNDb25maWdNZXNzYWdlICgmcGFyc2UsIEZjU2V2ZXJlRXJyb3IsICJmYWlsZWQgcmVhZGluZyBjb25maWcgZmlsZSIpOwoJICAgIGdvdG8gYmFpbDM7Cgl9CglpZiAoIVhNTF9QYXJzZUJ1ZmZlciAocCwgbGVuLCBsZW4gPT0gMCkpCgl7CgkgICAgRmNDb25maWdNZXNzYWdlICgmcGFyc2UsIEZjU2V2ZXJlRXJyb3IsICIlcyIsIAoJCQkgICBYTUxfRXJyb3JTdHJpbmcgKFhNTF9HZXRFcnJvckNvZGUgKHApKSk7CgkgICAgZ290byBiYWlsMzsKCX0KICAgIH0gd2hpbGUgKGxlbiAhPSAwKTsKICAgIGVycm9yID0gcGFyc2UuZXJyb3I7CmJhaWwzOgogICAgRmNDb25maWdDbGVhbnVwICgmcGFyc2UpOwpiYWlsMjoKICAgIFhNTF9QYXJzZXJGcmVlIChwKTsKYmFpbDE6CiAgICBmY2xvc2UgKGYpOwpiYWlsMDoKICAgIGlmIChlcnJvciAmJiBjb21wbGFpbikKICAgIHsKCWlmIChuYW1lKQoJICAgIEZjQ29uZmlnTWVzc2FnZSAoMCwgRmNTZXZlcmVFcnJvciwgIkNhbm5vdCBsb2FkIGNvbmZpZyBmaWxlIFwiJXNcIiIsIG5hbWUpOwoJZWxzZQoJICAgIEZjQ29uZmlnTWVzc2FnZSAoMCwgRmNTZXZlcmVFcnJvciwgIkNhbm5vdCBsb2FkIGRlZmF1bHQgY29uZmlnIGZpbGUiKTsKCXJldHVybiBGY0ZhbHNlOwogICAgfQogICAgcmV0dXJuIEZjVHJ1ZTsKfQo=