LyoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggSnVzdGluIEJyYWRmb3JkCiAqIENvcHlyaWdodCAxOTk5IEZyYW5jaXMgQmVhdWRldAogKiBDb3B5cmlnaHQgMTk5OSBTeWx2YWluIFN0LUdlcm1haW4KICogQ29weXJpZ2h0IDIwMDIgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAzIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqIENvcHlyaWdodCAyMDA0IE1pa2UgSGVhcm4sIFJvYiBTaGVhcm1hbiwgQ29kZVdlYXZlcnMgSW5jCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX09MRV9DT01QT0JKX0gKI2RlZmluZSBfX1dJTkVfT0xFX0NPTVBPQkpfSAoKLyogQWxsIHByaXZhdGUgcHJvdG90eXBlIGZ1bmN0aW9ucyB1c2VkIGJ5IE9MRSB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgaGVhZGVyIGZpbGUgKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5lL2xpc3QuaCIKCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInd0eXBlcy5oIgojaW5jbHVkZSAiZGNvbS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgoKc3RydWN0IGFwYXJ0bWVudDsKdHlwZWRlZiBzdHJ1Y3QgYXBhcnRtZW50IEFQQVJUTUVOVDsKCkRFRklORV9PTEVHVUlEKCBDTFNJRF9EZk1hcnNoYWwsIDB4MDAwMDAzMGIsIDAsIDAgKTsKREVGSU5FX09MRUdVSUQoIENMU0lEX1BTRmFjdG9yeUJ1ZmZlciwgMHgwMDAwMDMyMCwgMCwgMCApOwpERUZJTkVfT0xFR1VJRCggQ0xTSURfSW5Qcm9jRnJlZU1hcnNoYWxlciwgMHgwMDAwMDMzYSwgMCwgMCApOwoKLyogc2lnbmFsIHRvIHN0dWIgbWFuYWdlciB0aGF0IHRoaXMgaXMgYSByZW0gdW5rbm93biBvYmplY3QgKi8KI2RlZmluZSBNU0hMRkxBR1NQX1JFTVVOS05PV04gICAweDgwMDAwMDAwCgovKiBUaHJlYWQtc2FmZXR5IEFubm90YXRpb24gTGVnZW5kOgogKgogKiBSTyAgICAtIFRoZSB2YWx1ZSBpcyByZWFkIG9ubHkuIEl0IG5ldmVyIGNoYW5nZXMgYWZ0ZXIgY3JlYXRpb24sIHNvIG5vCiAqICAgICAgICAgbG9ja2luZyBpcyByZXF1aXJlZC4KICogTE9DSyAgLSBUaGUgdmFsdWUgaXMgd3JpdHRlbiB0byBvbmx5IHVzaW5nIEludGVybG9ja2VkKiBmdW5jdGlvbnMuCiAqIENTICAgIC0gVGhlIHZhbHVlIGlzIHJlYWQgb3Igd3JpdHRlbiB0byBpbnNpZGUgYSBjcml0aWNhbCBzZWN0aW9uLgogKiAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvbGxvd2luZyAiQ1MiIGlzIHRoZSBzcGVjaWZpYyBjcml0aWNhbCBzZXRpb24gdGhhdAogKiAgICAgICAgIG11c3QgYmUgdXNlZC4KICogTVVURVggLSBUaGUgdmFsdWUgaXMgcmVhZCBvciB3cml0dGVuIHRvIHdpdGggYSBtdXRleCBoZWxkLgogKiAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvbGxvd2luZyAiTVVURVgiIGlzIHRoZSBzcGVjaWZpYyBtdXRleCB0aGF0CiAqICAgICAgICAgbXVzdCBiZSB1c2VkLgogKi8KCnR5cGVkZWYgZW51bSBpZnN0dWJfc3RhdGUKewogICAgU1RVQlNUQVRFX05PUk1BTF9NQVJTSEFMRUQsCiAgICBTVFVCU1RBVEVfTk9STUFMX1VOTUFSU0hBTEVELAogICAgU1RVQlNUQVRFX1RBQkxFX1dFQUtfTUFSU0hBTEVELAogICAgU1RVQlNUQVRFX1RBQkxFX1dFQUtfVU5NQVJTSEFMRUQsCiAgICBTVFVCU1RBVEVfVEFCTEVfU1RST05HLAp9IFNUVUJfU1RBVEU7CgovKiBhbiBpbnRlcmZhY2Ugc3R1YiAqLwpzdHJ1Y3QgaWZzdHViICAgCnsKICAgIHN0cnVjdCBsaXN0ICAgICAgIGVudHJ5OyAgICAgIC8qIGVudHJ5IGluIHN0dWJfbWFuYWdlci0+aWZzdHVicyBsaXN0IChDUyBzdHViX21hbmFnZXItPmxvY2spICovCiAgICBJUnBjU3R1YkJ1ZmZlciAgICpzdHViYnVmZmVyOyAvKiBSTyAqLwogICAgSUlEICAgICAgICAgICAgICAgaWlkOyAgICAgICAgLyogUk8gKi8KICAgIElQSUQgICAgICAgICAgICAgIGlwaWQ7ICAgICAgIC8qIFJPICovCiAgICBJVW5rbm93biAgICAgICAgICppZmFjZTsgICAgICAvKiBSTyAqLwogICAgTVNITEZMQUdTICAgICAgICAgZmxhZ3M7ICAgICAgLyogc28gd2UgY2FuIGVuZm9yY2UgcHJvY2Vzcy1sb2NhbCBtYXJzaGFsbGluZyBydWxlcyAoUk8pICovCiAgICBJUnBjQ2hhbm5lbEJ1ZmZlcipjaGFuOyAgICAgICAvKiBjaGFubmVsIHBhc3NlZCB0byBJUnBjU3R1YkJ1ZmZlcjo6SW52b2tlIChSTykgKi8KfTsKCgovKiBzdHViIG1hbmFnZXJzIGhvbGQgcmVmcyBvbiB0aGUgb2JqZWN0IGFuZCBlYWNoIGludGVyZmFjZSBzdHViICovCnN0cnVjdCBzdHViX21hbmFnZXIKewogICAgc3RydWN0IGxpc3QgICAgICAgZW50cnk7ICAgICAgLyogZW50cnkgaW4gYXBhcnRtZW50IHN0dWJtZ3IgbGlzdCAoQ1MgYXB0LT5jcykgKi8KICAgIHN0cnVjdCBsaXN0ICAgICAgIGlmc3R1YnM7ICAgIC8qIGxpc3Qgb2YgYWN0aXZlIGlmc3R1YnMgZm9yIHRoZSBvYmplY3QgKENTIGxvY2spICovCiAgICBDUklUSUNBTF9TRUNUSU9OICBsb2NrOwogICAgQVBBUlRNRU5UICAgICAgICAqYXB0OyAgICAgICAgLyogb3duaW5nIGFwdCAoUk8pICovCgogICAgVUxPTkcgICAgICAgICAgICAgZXh0cmVmczsgICAgLyogbnVtYmVyIG9mICdleHRlcm5hbCcgcmVmZXJlbmNlcyAoQ1MgbG9jaykgKi8KICAgIFVMT05HICAgICAgICAgICAgIHJlZnM7ICAgICAgIC8qIGludGVybmFsIHJlZmVyZW5jZSBjb3VudCAoQ1MgYXB0LT5jcykgKi8KICAgIE9JRCAgICAgICAgICAgICAgIG9pZDsgICAgICAgIC8qIGFwYXJ0bWVudC1zY29wZWQgdW5pcXVlIGlkZW50aWZpZXIgKFJPKSAqLwogICAgSVVua25vd24gICAgICAgICAqb2JqZWN0OyAgICAgLyogdGhlIG9iamVjdCB3ZSBhcmUgbWFuYWdpbmcgdGhlIHN0dWIgZm9yIChSTykgKi8KICAgIFVMT05HICAgICAgICAgICAgIG5leHRfaXBpZDsgIC8qIGN1cnJlbnRseSB1bnVzZWQgKExPQ0spICovCiAgICBPWElEX0lORk8gICAgICAgICBveGlkX2luZm87ICAvKiBzdHJpbmcgYmluZGluZywgaXBpZCBvZiByZW0gdW5rbm93biBhbmQgb3RoZXIgaW5mb3JtYXRpb24gKFJPKSAqLwoKICAgIC8qIFdlIG5lZWQgdG8ga2VlcCBhIGNvdW50IG9mIHRoZSBvdXRzdGFuZGluZyBtYXJzaGFscywgc28gd2UgY2FuIGVuZm9yY2UgdGhlCiAgICAgKiBtYXJzaGFsbGluZyBydWxlcyAoaWUsIHlvdSBjYW4gb25seSB1bm1hcnNoYWwgbm9ybWFsIG1hcnNoYWxzIG9uY2UpLiBOb3RlCiAgICAgKiB0aGF0IHRoZXNlIGNvdW50cyBkbyBOT1QgaW5jbHVkZSB1bm1hcnNoYWxsZWQgaW50ZXJmYWNlcywgb25jZSBhIHN0cmVhbSBpcwogICAgICogdW5tYXJzaGFsbGVkIGFuZCBhIHByb3h5IHNldCB1cCwgdGhpcyBjb3VudCBpcyBkZWNyZW1lbnRlZC4KICAgICAqLwoKICAgIFVMT05HICAgICAgICAgICAgIG5vcm1fcmVmczsgIC8qIHJlZmNvdW50IG9mIG5vcm1hbCBtYXJzaGFscyAoQ1MgbG9jaykgKi8KfTsKCi8qIGltcG9ydGVkIGludGVyZmFjZSBwcm94eSAqLwpzdHJ1Y3QgaWZwcm94eQp7CiAgc3RydWN0IGxpc3QgZW50cnk7ICAgICAgIC8qIGVudHJ5IGluIHByb3h5X21hbmFnZXIgbGlzdCAoQ1MgcGFyZW50LT5jcykgKi8KICBzdHJ1Y3QgcHJveHlfbWFuYWdlciAqcGFyZW50OyAvKiBvd25pbmcgcHJveHlfbWFuYWdlciAoUk8pICovCiAgTFBWT0lEIGlmYWNlOyAgICAgICAgICAgIC8qIGludGVyZmFjZSBwb2ludGVyIChSTykgKi8KICBTVERPQkpSRUYgc3Rkb2JqcmVmOyAgICAgLyogbWFyc2hhbCBkYXRhIHRoYXQgcmVwcmVzZW50cyB0aGlzIG9iamVjdCAoUk8pICovCiAgSUlEIGlpZDsgICAgICAgICAgICAgICAgIC8qIGludGVyZmFjZSBJRCAoUk8pICovCiAgTFBSUENQUk9YWUJVRkZFUiBwcm94eTsgIC8qIGludGVyZmFjZSBwcm94eSAoUk8pICovCiAgVUxPTkcgcmVmczsgICAgICAgICAgICAgIC8qIGltcG9ydGVkIChwdWJsaWMpIHJlZmVyZW5jZXMgKExPQ0spICovCiAgSVJwY0NoYW5uZWxCdWZmZXIgKmNoYW47IC8qIGNoYW5uZWwgdG8gb2JqZWN0IChDUyBwYXJlbnQtPmNzKSAqLwp9OwoKLyogaW1wb3J0ZWQgb2JqZWN0IC8gcHJveHkgbWFuYWdlciAqLwpzdHJ1Y3QgcHJveHlfbWFuYWdlcgp7CiAgY29uc3QgSU11bHRpUUlWdGJsICpscFZ0Ymw7CiAgY29uc3QgSU1hcnNoYWxWdGJsICpscFZ0YmxNYXJzaGFsOwogIGNvbnN0IElDbGllbnRTZWN1cml0eVZ0YmwgKmxwVnRibENsaVNlYzsKICBzdHJ1Y3QgYXBhcnRtZW50ICpwYXJlbnQ7IC8qIG93bmluZyBhcGFydG1lbnQgKFJPKSAqLwogIHN0cnVjdCBsaXN0IGVudHJ5OyAgICAgICAgLyogZW50cnkgaW4gYXBhcnRtZW50IChDUyBwYXJlbnQtPmNzKSAqLwogIE9YSUQgb3hpZDsgICAgICAgICAgICAgICAgLyogb2JqZWN0IGV4cG9ydGVkIElEIChSTykgKi8KICBPWElEX0lORk8gb3hpZF9pbmZvOyAgICAgIC8qIHN0cmluZyBiaW5kaW5nLCBpcGlkIG9mIHJlbSB1bmtub3duIGFuZCBvdGhlciBpbmZvcm1hdGlvbiAoUk8pICovCiAgT0lEIG9pZDsgICAgICAgICAgICAgICAgICAvKiBvYmplY3QgSUQgKFJPKSAqLwogIHN0cnVjdCBsaXN0IGludGVyZmFjZXM7ICAgLyogaW1wb3J0ZWQgaW50ZXJmYWNlcyAoQ1MgY3MpICovCiAgTE9ORyByZWZzOyAgICAgICAgICAgICAgICAvKiBwcm94eSByZWZlcmVuY2UgY291bnQgKExPQ0spICovCiAgQ1JJVElDQUxfU0VDVElPTiBjczsgICAgICAvKiB0aHJlYWQgc2FmZXR5IGZvciB0aGlzIG9iamVjdCBhbmQgY2hpbGRyZW4gKi8KICBVTE9ORyBzb3JmbGFnczsgICAgICAgICAgIC8qIFNURE9CSlJFRiBmbGFncyAoUk8pICovCiAgSVJlbVVua25vd24gKnJlbXVuazsgICAgICAvKiBwcm94eSB0byBJUmVtVW5rbm93biB1c2VkIGZvciBsaWZlY3ljbGUgbWFuYWdlbWVudCAoQ1MgY3MpICovCiAgSEFORExFIHJlbW90aW5nX211dGV4OyAgICAvKiBtdXRleCB1c2VkIGZvciBzeW5jaHJvbml6aW5nIGFjY2VzcyB0byBJUmVtVW5rbm93biAqLwogIE1TSENUWCBkZXN0X2NvbnRleHQ7ICAgICAgLyogY29udGV4dCB1c2VkIGZvciBhY3RpdmF0aW5nIG9wdGltaXNhdGlvbnMgKExPQ0spICovCiAgdm9pZCAqZGVzdF9jb250ZXh0X2RhdGE7ICAvKiByZXNlcnZlZCBjb250ZXh0IHZhbHVlIChMT0NLKSAqLwp9OwoKc3RydWN0IGFwYXJ0bWVudAp7CiAgc3RydWN0IGxpc3QgZW50cnk7CgogIExPTkcgIHJlZnM7ICAgICAgICAgICAgICAvKiByZWZjb3VudCBvZiB0aGUgYXBhcnRtZW50IChMT0NLKSAqLwogIEJPT0wgbXVsdGlfdGhyZWFkZWQ7ICAgICAvKiBtdWx0aS10aHJlYWRlZCBvciBzaW5nbGUtdGhyZWFkZWQgYXBhcnRtZW50PyAoUk8pICovCiAgRFdPUkQgdGlkOyAgICAgICAgICAgICAgIC8qIHRocmVhZCBpZCAoUk8pICovCiAgT1hJRCBveGlkOyAgICAgICAgICAgICAgIC8qIG9iamVjdCBleHBvcnRlciBJRCAoUk8pICovCiAgTE9ORyBpcGlkYzsgICAgICAgICAgICAgIC8qIGludGVyZmFjZSBwb2ludGVyIElEIGNvdW50ZXIsIHN0YXJ0cyBhdCAxIChMT0NLKSAqLwogIENSSVRJQ0FMX1NFQ1RJT04gY3M7ICAgICAvKiB0aHJlYWQgc2FmZXR5ICovCiAgc3RydWN0IGxpc3QgcHJveGllczsgICAgIC8qIGltcG9ydGVkIG9iamVjdHMgKENTIGNzKSAqLwogIHN0cnVjdCBsaXN0IHN0dWJtZ3JzOyAgICAvKiBzdHViIG1hbmFnZXJzIGZvciBleHBvcnRlZCBvYmplY3RzIChDUyBjcykgKi8KICBCT09MIHJlbXVua19leHBvcnRlZDsgICAgLyogaGFzIHRoZSBJUmVtVW5rbm93biBpbnRlcmZhY2UgZm9yIHRoaXMgYXBhcnRtZW50IGJlZW4gY3JlYXRlZCB5ZXQ/IChDUyBjcykgKi8KICBMT05HIHJlbW90aW5nX3N0YXJ0ZWQ7ICAgLyogaGFzIHRoZSBSUEMgc3lzdGVtIGJlZW4gc3RhcnRlZCBmb3IgdGhpcyBhcGFydG1lbnQ/IChMT0NLKSAqLwogIHN0cnVjdCBsaXN0IHBzY2xzaWRzOyAgICAvKiBsaXN0IG9mIHJlZ2lzdGVyZWQgUFMgQ0xTSURzIChDUyBjcykgKi8KICBzdHJ1Y3QgbGlzdCBsb2FkZWRfZGxsczsgLyogbGlzdCBvZiBkbGxzIGxvYWRlZCBieSB0aGlzIGFwYXJ0bWVudCAoQ1MgY3MpICovCiAgRFdPUkQgaG9zdF9hcHRfdGlkOyAgICAgIC8qIHRocmVhZCBJRCBvZiBhcGFydG1lbnQgaG9zdGluZyBvYmplY3RzIG9mIGRpZmZlcmluZyB0aHJlYWRpbmcgbW9kZWwgKENTIGNzKSAqLwogIEhXTkQgaG9zdF9hcHRfaHduZDsgICAgICAvKiBoYW5kbGUgdG8gYXBhcnRtZW50IHdpbmRvdyBvZiBob3N0IGFwYXJ0bWVudCAoQ1MgY3MpICovCgogIC8qIEZJWE1FOiBPSUQncyBzaG91bGQgYmUgZ2l2ZW4gb3V0IGJ5IFJQQ1NTICovCiAgT0lEIG9pZGM7ICAgICAgICAgICAgICAgIC8qIG9iamVjdCBJRCBjb3VudGVyLCBzdGFydHMgYXQgMSwgemVybyBpcyBpbnZhbGlkIE9JRCAoQ1MgY3MpICovCgogIC8qIFNUQS1vbmx5IGZpZWxkcyAqLwogIEhXTkQgd2luOyAgICAgICAgICAgICAgICAvKiBtZXNzYWdlIHdpbmRvdyAoTE9DSykgKi8KICBMUE1FU1NBR0VGSUxURVIgZmlsdGVyOyAgLyogbWVzc2FnZSBmaWx0ZXIgKENTIGNzKSAqLwogIEJPT0wgbWFpbjsgICAgICAgICAgICAgICAvKiBpcyB0aGlzIGEgbWFpbi10aHJlYWRlZC1hcGFydG1lbnQ/IChSTykgKi8KfTsKCi8qIHRoaXMgaXMgd2hhdCBpcyBzdG9yZWQgaW4gVEVCLT5SZXNlcnZlZEZvck9sZSAqLwpzdHJ1Y3Qgb2xldGxzCnsKICAgIHN0cnVjdCBhcGFydG1lbnQgKmFwdDsKICAgIElFcnJvckluZm8gICAgICAgKmVycm9yaW5mbzsgICAvKiBzZWUgZXJyb3JpbmZvLmMgKi8KICAgIElVbmtub3duICAgICAgICAgKnN0YXRlOyAgICAgICAvKiBzZWUgQ29TZXRTdGF0ZSAqLwogICAgRFdPUkQgICAgICAgICAgICBpbml0czsgICAgICAgIC8qIG51bWJlciBvZiB0aW1lcyBDb0luaXRpYWxpemVFeCBjYWxsZWQgKi8KICAgIERXT1JEICAgICAgICAgICAgb2xlX2luaXRzOyAgICAvKiBudW1iZXIgb2YgdGltZXMgT2xlSW5pdGlhbGl6ZSBjYWxsZWQgKi8KICAgIEdVSUQgICAgICAgICAgICAgY2F1c2FsaXR5X2lkOyAvKiB1bmlxdWUgaWRlbnRpZmllciBmb3IgZWFjaCBDT00gY2FsbCAqLwogICAgTE9ORyAgICAgICAgICAgICBwZW5kaW5nX2NhbGxfY291bnRfY2xpZW50OyAvKiBudW1iZXIgb2YgY2xpZW50IGNhbGxzIHBlbmRpbmcgKi8KICAgIExPTkcgICAgICAgICAgICAgcGVuZGluZ19jYWxsX2NvdW50X3NlcnZlcjsgLyogbnVtYmVyIG9mIHNlcnZlciBjYWxscyBwZW5kaW5nICovCn07CgoKLyogR2xvYmFsIEludGVyZmFjZSBUYWJsZSBGdW5jdGlvbnMgKi8KCmV4dGVybiB2b2lkKiBTdGRHbG9iYWxJbnRlcmZhY2VUYWJsZV9Db25zdHJ1Y3Qodm9pZCk7CmV4dGVybiBIUkVTVUxUIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlX0dldEZhY3RvcnkoTFBWT0lEICpwcHYpOwpleHRlcm4gdm9pZCogU3RkR2xvYmFsSW50ZXJmYWNlVGFibGVJbnN0YW5jZTsKCi8qIEZJWE1FOiB0aGVzZSBzaG91bGRuJ3QgYmUgbmVlZGVkLCBleGNlcHQgZm9yIDE2LWJpdCBmdW5jdGlvbnMgKi8KZXh0ZXJuIEhSRVNVTFQgV0lORV9TdHJpbmdGcm9tQ0xTSUQoY29uc3QgQ0xTSUQgKmlkLExQU1RSIGlkc3RyKTsKCkhSRVNVTFQgQ09NX09wZW5LZXlGb3JDTFNJRChSRUZDTFNJRCBjbHNpZCwgTFBDV1NUUiBrZXluYW1lLCBSRUdTQU0gYWNjZXNzLCBIS0VZICprZXkpOwpIUkVTVUxUIENPTV9PcGVuS2V5Rm9yQXBwSWRGcm9tQ0xTSUQoUkVGQ0xTSUQgY2xzaWQsIFJFR1NBTSBhY2Nlc3MsIEhLRVkgKnN1YmtleSk7CkhSRVNVTFQgTUFSU0hBTF9HZXRTdGFuZGFyZE1hcnNoYWxDRihMUFZPSUQgKnBwdik7CkhSRVNVTFQgRlRNYXJzaGFsQ0ZfQ3JlYXRlKFJFRklJRCByaWlkLCBMUFZPSUQgKnBwdik7CgovKiBTdHViIE1hbmFnZXIgKi8KClVMT05HIHN0dWJfbWFuYWdlcl9pbnRfYWRkcmVmKHN0cnVjdCBzdHViX21hbmFnZXIgKlRoaXMpOwpVTE9ORyBzdHViX21hbmFnZXJfaW50X3JlbGVhc2Uoc3RydWN0IHN0dWJfbWFuYWdlciAqVGhpcyk7CnN0cnVjdCBzdHViX21hbmFnZXIgKm5ld19zdHViX21hbmFnZXIoQVBBUlRNRU5UICphcHQsIElVbmtub3duICpvYmplY3QpOwpVTE9ORyBzdHViX21hbmFnZXJfZXh0X2FkZHJlZihzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBVTE9ORyByZWZzKTsKVUxPTkcgc3R1Yl9tYW5hZ2VyX2V4dF9yZWxlYXNlKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIFVMT05HIHJlZnMsIEJPT0wgbGFzdF91bmxvY2tfcmVsZWFzZXMpOwpzdHJ1Y3QgaWZzdHViICpzdHViX21hbmFnZXJfbmV3X2lmc3R1YihzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBJUnBjU3R1YkJ1ZmZlciAqc2IsIElVbmtub3duICppcHRyLCBSRUZJSUQgaWlkLCBNU0hMRkxBR1MgZmxhZ3MpOwpzdHJ1Y3QgaWZzdHViICpzdHViX21hbmFnZXJfZmluZF9pZnN0dWIoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgUkVGSUlEIGlpZCwgTVNITEZMQUdTIGZsYWdzKTsKc3RydWN0IHN0dWJfbWFuYWdlciAqZ2V0X3N0dWJfbWFuYWdlcihBUEFSVE1FTlQgKmFwdCwgT0lEIG9pZCk7CnN0cnVjdCBzdHViX21hbmFnZXIgKmdldF9zdHViX21hbmFnZXJfZnJvbV9vYmplY3QoQVBBUlRNRU5UICphcHQsIHZvaWQgKm9iamVjdCk7CkJPT0wgc3R1Yl9tYW5hZ2VyX25vdGlmeV91bm1hcnNoYWwoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgY29uc3QgSVBJRCAqaXBpZCk7CkJPT0wgc3R1Yl9tYW5hZ2VyX2lzX3RhYmxlX21hcnNoYWxlZChzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBjb25zdCBJUElEICppcGlkKTsKdm9pZCBzdHViX21hbmFnZXJfcmVsZWFzZV9tYXJzaGFsX2RhdGEoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgVUxPTkcgcmVmcywgY29uc3QgSVBJRCAqaXBpZCk7CkhSRVNVTFQgaXBpZF90b19zdHViX21hbmFnZXIoY29uc3QgSVBJRCAqaXBpZCwgQVBBUlRNRU5UICoqc3R1Yl9hcHQsIHN0cnVjdCBzdHViX21hbmFnZXIgKipzdHVibWdyX3JldCk7CkhSRVNVTFQgaXBpZF9nZXRfZGlzcGF0Y2hfcGFyYW1zKGNvbnN0IElQSUQgKmlwaWQsIEFQQVJUTUVOVCAqKnN0dWJfYXB0LCBJUnBjU3R1YkJ1ZmZlciAqKnN0dWIsIElScGNDaGFubmVsQnVmZmVyICoqY2hhbiwgSUlEICppaWQsIElVbmtub3duICoqaWZhY2UpOwpIUkVTVUxUIHN0YXJ0X2FwYXJ0bWVudF9yZW1vdGVfdW5rbm93bih2b2lkKTsKCkhSRVNVTFQgbWFyc2hhbF9vYmplY3QoQVBBUlRNRU5UICphcHQsIFNURE9CSlJFRiAqc3Rkb2JqcmVmLCBSRUZJSUQgcmlpZCwgSVVua25vd24gKm9iaiwgTVNITEZMQUdTIG1zaGxmbGFncyk7CgovKiBSUEMgQmFja2VuZCAqLwoKc3RydWN0IGRpc3BhdGNoX3BhcmFtczsKCnZvaWQgICAgUlBDX1N0YXJ0UmVtb3Rpbmcoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKSFJFU1VMVCBSUENfQ3JlYXRlQ2xpZW50Q2hhbm5lbChjb25zdCBPWElEICpveGlkLCBjb25zdCBJUElEICppcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9YSURfSU5GTyAqb3hpZF9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRlc3RfY29udGV4dCwgdm9pZCAqZGVzdF9jb250ZXh0X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJwY0NoYW5uZWxCdWZmZXIgKipjaGFuKTsKSFJFU1VMVCBSUENfQ3JlYXRlU2VydmVyQ2hhbm5lbChJUnBjQ2hhbm5lbEJ1ZmZlciAqKmNoYW4pOwp2b2lkICAgIFJQQ19FeGVjdXRlQ2FsbChzdHJ1Y3QgZGlzcGF0Y2hfcGFyYW1zICpwYXJhbXMpOwpIUkVTVUxUIFJQQ19SZWdpc3RlckludGVyZmFjZShSRUZJSUQgcmlpZCk7CnZvaWQgICAgUlBDX1VucmVnaXN0ZXJJbnRlcmZhY2UoUkVGSUlEIHJpaWQpOwpIUkVTVUxUIFJQQ19TdGFydExvY2FsU2VydmVyKFJFRkNMU0lEIGNsc2lkLCBJU3RyZWFtICpzdHJlYW0sIEJPT0wgbXVsdGlfdXNlLCB2b2lkICoqcmVnaXN0cmF0aW9uKTsKdm9pZCAgICBSUENfU3RvcExvY2FsU2VydmVyKHZvaWQgKnJlZ2lzdHJhdGlvbik7CkhSRVNVTFQgUlBDX0dldExvY2FsQ2xhc3NPYmplY3QoUkVGQ0xTSUQgcmNsc2lkLCBSRUZJSUQgaWlkLCBMUFZPSUQgKnBwdik7CkhSRVNVTFQgUlBDX1JlZ2lzdGVyQ2hhbm5lbEhvb2soUkVGR1VJRCByZ3VpZCwgSUNoYW5uZWxIb29rICpob29rKTsKdm9pZCAgICBSUENfVW5yZWdpc3RlckFsbENoYW5uZWxIb29rcyh2b2lkKTsKSFJFU1VMVCBSUENfUmVzb2x2ZU94aWQoT1hJRCBveGlkLCBPWElEX0lORk8gKm94aWRfaW5mbyk7CgovKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIFJ1bm5pbmcgT2JqZWN0IFRhYmxlICovCkhSRVNVTFQgV0lOQVBJIFJ1bm5pbmdPYmplY3RUYWJsZUltcGxfSW5pdGlhbGl6ZSh2b2lkKTsKCi8qIFRoaXMgZnVuY3Rpb24gdW5pbml0aWFsaXplIHRoZSBSdW5uaW5nIE9iamVjdCBUYWJsZSAqLwpIUkVTVUxUIFdJTkFQSSBSdW5uaW5nT2JqZWN0VGFibGVJbXBsX1VuSW5pdGlhbGl6ZSh2b2lkKTsKCi8qIERyYWcgYW5kIGRyb3AgKi8Kdm9pZCBPTEVERF9VbkluaXRpYWxpemUodm9pZCk7CgovKiBBcGFydG1lbnQgRnVuY3Rpb25zICovCgpBUEFSVE1FTlQgKmFwYXJ0bWVudF9maW5kZnJvbW94aWQoT1hJRCBveGlkLCBCT09MIHJlZik7CkFQQVJUTUVOVCAqYXBhcnRtZW50X2ZpbmRmcm9tdGlkKERXT1JEIHRpZCk7CkRXT1JEIGFwYXJ0bWVudF9hZGRyZWYoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKRFdPUkQgYXBhcnRtZW50X3JlbGVhc2Uoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKSFJFU1VMVCBhcGFydG1lbnRfZGlzY29ubmVjdHByb3hpZXMoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKdm9pZCBhcGFydG1lbnRfZGlzY29ubmVjdG9iamVjdChzdHJ1Y3QgYXBhcnRtZW50ICphcHQsIHZvaWQgKm9iamVjdCk7CnN0YXRpYyBpbmxpbmUgSFJFU1VMVCBhcGFydG1lbnRfZ2V0b3hpZChjb25zdCBzdHJ1Y3QgYXBhcnRtZW50ICphcHQsIE9YSUQgKm94aWQpCnsKICAgICpveGlkID0gYXB0LT5veGlkOwogICAgcmV0dXJuIFNfT0s7Cn0KSFJFU1VMVCBhcGFydG1lbnRfY3JlYXRld2luZG93aWZuZWVkZWQoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKSFdORCBhcGFydG1lbnRfZ2V0d2luZG93KGNvbnN0IHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CnZvaWQgYXBhcnRtZW50X2pvaW5tdGEodm9pZCk7CgoKLyogRENPTSBtZXNzYWdlcyB1c2VkIGJ5IHRoZSBhcGFydG1lbnQgd2luZG93IChub3QgY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSkgKi8KI2RlZmluZSBETV9FWEVDVVRFUlBDICAgKFdNX1VTRVIgKyAwKSAvKiBXUEFSQU0gPSAwLCBMUEFSQU0gPSAoc3RydWN0IGRpc3BhdGNoX3BhcmFtcyAqKSAqLwojZGVmaW5lIERNX0hPU1RPQkpFQ1QgICAoV01fVVNFUiArIDEpIC8qIFdQQVJBTSA9IDAsIExQQVJBTSA9IChzdHJ1Y3QgaG9zdF9vYmplY3RfcGFyYW1zICopICovCgovKgogKiBQZXItdGhyZWFkIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBURUIgb24gb2Zmc2V0IDB4RjgwLAogKiBzZWUgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL21zai8xMDk5L2J1Z3NsYXllci9idWdzbGF5ZXIxMDk5Lmh0bQogKi8KCi8qIHdpbGwgY3JlYXRlIGlmIG5lY2Vzc2FyeSAqLwpzdGF0aWMgaW5saW5lIHN0cnVjdCBvbGV0bHMgKkNPTV9DdXJyZW50SW5mbyh2b2lkKQp7CiAgICBpZiAoIU50Q3VycmVudFRlYigpLT5SZXNlcnZlZEZvck9sZSkKICAgICAgICBOdEN1cnJlbnRUZWIoKS0+UmVzZXJ2ZWRGb3JPbGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKHN0cnVjdCBvbGV0bHMpKTsKCiAgICByZXR1cm4gTnRDdXJyZW50VGViKCktPlJlc2VydmVkRm9yT2xlOwp9CgpzdGF0aWMgaW5saW5lIEFQQVJUTUVOVCogQ09NX0N1cnJlbnRBcHQodm9pZCkKeyAgCiAgICByZXR1cm4gQ09NX0N1cnJlbnRJbmZvKCktPmFwdDsKfQoKc3RhdGljIGlubGluZSBHVUlEIENPTV9DdXJyZW50Q2F1c2FsaXR5SWQodm9pZCkKewogICAgc3RydWN0IG9sZXRscyAqaW5mbyA9IENPTV9DdXJyZW50SW5mbygpOwogICAgaWYgKCFpbmZvKQogICAgICAgIHJldHVybiBHVUlEX05VTEw7CiAgICBpZiAoSXNFcXVhbEdVSUQoJmluZm8tPmNhdXNhbGl0eV9pZCwgJkdVSURfTlVMTCkpCiAgICAgICAgQ29DcmVhdGVHdWlkKCZpbmZvLT5jYXVzYWxpdHlfaWQpOwogICAgcmV0dXJuIGluZm8tPmNhdXNhbGl0eV9pZDsKfQoKI2RlZmluZSBJQ09NX1RISVNfTVVMVEkoaW1wbCxmaWVsZCxpZmFjZSkgaW1wbCogY29uc3QgVGhpcz0oaW1wbCopKChjaGFyKikoaWZhY2UpIC0gb2Zmc2V0b2YoaW1wbCxmaWVsZCkpCgovKiBoZWxwZXJzIGZvciBkZWJ1Z2dpbmcgKi8KIyBkZWZpbmUgREVCVUdfU0VUX0NSSVRTRUNfTkFNRShjcywgbmFtZSkgKGNzKS0+RGVidWdJbmZvLT5TcGFyZVswXSA9IChEV09SRF9QVFIpKF9fRklMRV9fICI6ICIgbmFtZSkKIyBkZWZpbmUgREVCVUdfQ0xFQVJfQ1JJVFNFQ19OQU1FKGNzKSAoY3MpLT5EZWJ1Z0luZm8tPlNwYXJlWzBdID0gMAoKZXh0ZXJuIEhJTlNUQU5DRSBPTEUzMl9oSW5zdGFuY2U7IC8qIEZJWE1FOiBtYWtlIHN0YXRpYyAqLwoKI2RlZmluZSBDSEFSU19JTl9HVUlEIDM5IC8qIGluY2x1ZGluZyBOVUxMICovCgojZGVmaW5lIFdJTkVfQ0xTQ1RYX0RPTlRfSE9TVCAgIDB4ODAwMDAwMDAKCi8qIEV4cG9ydGVkIG5vbi1pbnRlcmZhY2UgRGF0YSBBZHZpc2UgSG9sZGVyIGZ1bmN0aW9ucyAqLwpIUkVTVUxUIERhdGFBZHZpc2VIb2xkZXJfT25Db25uZWN0KElEYXRhQWR2aXNlSG9sZGVyICppZmFjZSwgSURhdGFPYmplY3QgKnBEZWxlZ2F0ZSk7CnZvaWQgRGF0YUFkdmlzZUhvbGRlcl9PbkRpc2Nvbm5lY3QoSURhdGFBZHZpc2VIb2xkZXIgKmlmYWNlKTsKCiNlbmRpZiAvKiBfX1dJTkVfT0xFX0NPTVBPQkpfSCAqLwo=