LyoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggSnVzdGluIEJyYWRmb3JkCiAqIENvcHlyaWdodCAxOTk5IEZyYW5jaXMgQmVhdWRldAogKiBDb3B5cmlnaHQgMTk5OSBTeWx2YWluIFN0LUdlcm1haW4KICogQ29weXJpZ2h0IDIwMDIgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAzIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqIENvcHlyaWdodCAyMDA0IE1pa2UgSGVhcm4sIFJvYiBTaGVhcm1hbiwgQ29kZVdlYXZlcnMgSW5jCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX09MRV9DT01QT0JKX0gKI2RlZmluZSBfX1dJTkVfT0xFX0NPTVBPQkpfSAoKLyogQWxsIHByaXZhdGUgcHJvdG90eXBlIGZ1bmN0aW9ucyB1c2VkIGJ5IE9MRSB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgaGVhZGVyIGZpbGUgKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5lL2xpc3QuaCIKCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInd0eXBlcy5oIgojaW5jbHVkZSAiZGNvbS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgoKc3RydWN0IGFwYXJ0bWVudDsKdHlwZWRlZiBzdHJ1Y3QgYXBhcnRtZW50IEFQQVJUTUVOVDsKCi8qIFRocmVhZC1zYWZldHkgQW5ub3RhdGlvbiBMZWdlbmQ6CiAqCiAqIFJPICAgIC0gVGhlIHZhbHVlIGlzIHJlYWQgb25seS4gSXQgbmV2ZXIgY2hhbmdlcyBhZnRlciBjcmVhdGlvbiwgc28gbm8KICogICAgICAgICBsb2NraW5nIGlzIHJlcXVpcmVkLgogKiBMT0NLICAtIFRoZSB2YWx1ZSBpcyB3cml0dGVuIHRvIG9ubHkgdXNpbmcgSW50ZXJsb2NrZWQqIGZ1bmN0aW9ucy4KICogQ1MgICAgLSBUaGUgdmFsdWUgaXMgcmVhZCBvciB3cml0dGVuIHRvIGluc2lkZSBhIGNyaXRpY2FsIHNlY3Rpb24uCiAqICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9sbG93aW5nICJDUyIgaXMgdGhlIHNwZWNpZmljIGNyaXRpY2FsIHNldGlvbiB0aGF0CiAqICAgICAgICAgbXVzdCBiZSB1c2VkLgogKiBNVVRFWCAtIFRoZSB2YWx1ZSBpcyByZWFkIG9yIHdyaXR0ZW4gdG8gd2l0aCBhIG11dGV4IGhlbGQuCiAqICAgICAgICAgVGhlIGlkZW50aWZpZXIgZm9sbG93aW5nICJNVVRFWCIgaXMgdGhlIHNwZWNpZmljIG11dGV4IHRoYXQKICogICAgICAgICBtdXN0IGJlIHVzZWQuCiAqLwoKdHlwZWRlZiBlbnVtIGlmc3R1Yl9zdGF0ZQp7CiAgICBTVFVCU1RBVEVfTk9STUFMX01BUlNIQUxFRCwKICAgIFNUVUJTVEFURV9OT1JNQUxfVU5NQVJTSEFMRUQsCiAgICBTVFVCU1RBVEVfVEFCTEVfV0VBS19NQVJTSEFMRUQsCiAgICBTVFVCU1RBVEVfVEFCTEVfV0VBS19VTk1BUlNIQUxFRCwKICAgIFNUVUJTVEFURV9UQUJMRV9TVFJPTkcsCn0gU1RVQl9TVEFURTsKCi8qIGFuIGludGVyZmFjZSBzdHViICovCnN0cnVjdCBpZnN0dWIgICAKewogICAgc3RydWN0IGxpc3QgICAgICAgZW50cnk7ICAgICAgLyogZW50cnkgaW4gc3R1Yl9tYW5hZ2VyLT5pZnN0dWJzIGxpc3QgKENTIHN0dWJfbWFuYWdlci0+bG9jaykgKi8KICAgIElScGNTdHViQnVmZmVyICAgKnN0dWJidWZmZXI7IC8qIFJPICovCiAgICBJSUQgICAgICAgICAgICAgICBpaWQ7ICAgICAgICAvKiBSTyAqLwogICAgSVBJRCAgICAgICAgICAgICAgaXBpZDsgICAgICAgLyogUk8gKi8KICAgIElVbmtub3duICAgICAgICAgKmlmYWNlOyAgICAgIC8qIFJPICovCiAgICBNU0hMRkxBR1MgICAgICAgICBmbGFnczsgICAgICAvKiBzbyB3ZSBjYW4gZW5mb3JjZSBwcm9jZXNzLWxvY2FsIG1hcnNoYWxsaW5nIHJ1bGVzIChSTykgKi8KICAgIElScGNDaGFubmVsQnVmZmVyKmNoYW47ICAgICAgIC8qIGNoYW5uZWwgcGFzc2VkIHRvIElScGNTdHViQnVmZmVyOjpJbnZva2UgKFJPKSAqLwp9OwoKCi8qIHN0dWIgbWFuYWdlcnMgaG9sZCByZWZzIG9uIHRoZSBvYmplY3QgYW5kIGVhY2ggaW50ZXJmYWNlIHN0dWIgKi8Kc3RydWN0IHN0dWJfbWFuYWdlcgp7CiAgICBzdHJ1Y3QgbGlzdCAgICAgICBlbnRyeTsgICAgICAvKiBlbnRyeSBpbiBhcGFydG1lbnQgc3R1Ym1nciBsaXN0IChDUyBhcHQtPmNzKSAqLwogICAgc3RydWN0IGxpc3QgICAgICAgaWZzdHViczsgICAgLyogbGlzdCBvZiBhY3RpdmUgaWZzdHVicyBmb3IgdGhlIG9iamVjdCAoQ1MgbG9jaykgKi8KICAgIENSSVRJQ0FMX1NFQ1RJT04gIGxvY2s7CiAgICBBUEFSVE1FTlQgICAgICAgICphcHQ7ICAgICAgICAvKiBvd25pbmcgYXB0IChSTykgKi8KCiAgICBVTE9ORyAgICAgICAgICAgICBleHRyZWZzOyAgICAvKiBudW1iZXIgb2YgJ2V4dGVybmFsJyByZWZlcmVuY2VzIChDUyBsb2NrKSAqLwogICAgVUxPTkcgICAgICAgICAgICAgcmVmczsgICAgICAgLyogaW50ZXJuYWwgcmVmZXJlbmNlIGNvdW50IChDUyBhcHQtPmNzKSAqLwogICAgT0lEICAgICAgICAgICAgICAgb2lkOyAgICAgICAgLyogYXBhcnRtZW50LXNjb3BlZCB1bmlxdWUgaWRlbnRpZmllciAoUk8pICovCiAgICBJVW5rbm93biAgICAgICAgICpvYmplY3Q7ICAgICAvKiB0aGUgb2JqZWN0IHdlIGFyZSBtYW5hZ2luZyB0aGUgc3R1YiBmb3IgKFJPKSAqLwogICAgVUxPTkcgICAgICAgICAgICAgbmV4dF9pcGlkOyAgLyogY3VycmVudGx5IHVudXNlZCAoTE9DSykgKi8KCiAgICAvKiBXZSBuZWVkIHRvIGtlZXAgYSBjb3VudCBvZiB0aGUgb3V0c3RhbmRpbmcgbWFyc2hhbHMsIHNvIHdlIGNhbiBlbmZvcmNlIHRoZQogICAgICogbWFyc2hhbGxpbmcgcnVsZXMgKGllLCB5b3UgY2FuIG9ubHkgdW5tYXJzaGFsIG5vcm1hbCBtYXJzaGFscyBvbmNlKS4gTm90ZQogICAgICogdGhhdCB0aGVzZSBjb3VudHMgZG8gTk9UIGluY2x1ZGUgdW5tYXJzaGFsbGVkIGludGVyZmFjZXMsIG9uY2UgYSBzdHJlYW0gaXMKICAgICAqIHVubWFyc2hhbGxlZCBhbmQgYSBwcm94eSBzZXQgdXAsIHRoaXMgY291bnQgaXMgZGVjcmVtZW50ZWQuCiAgICAgKi8KCiAgICBVTE9ORyAgICAgICAgICAgICBub3JtX3JlZnM7ICAvKiByZWZjb3VudCBvZiBub3JtYWwgbWFyc2hhbHMgKENTIGxvY2spICovCn07CgovKiBpbXBvcnRlZCBpbnRlcmZhY2UgcHJveHkgKi8Kc3RydWN0IGlmcHJveHkKewogIHN0cnVjdCBsaXN0IGVudHJ5OyAgICAgICAvKiBlbnRyeSBpbiBwcm94eV9tYW5hZ2VyIGxpc3QgKENTIHBhcmVudC0+Y3MpICovCiAgc3RydWN0IHByb3h5X21hbmFnZXIgKnBhcmVudDsgLyogb3duaW5nIHByb3h5X21hbmFnZXIgKFJPKSAqLwogIExQVk9JRCBpZmFjZTsgICAgICAgICAgICAvKiBpbnRlcmZhY2UgcG9pbnRlciAoUk8pICovCiAgU1RET0JKUkVGIHN0ZG9ianJlZjsgICAgIC8qIG1hcnNoYWwgZGF0YSB0aGF0IHJlcHJlc2VudHMgdGhpcyBvYmplY3QgKFJPKSAqLwogIElJRCBpaWQ7ICAgICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgSUQgKFJPKSAqLwogIExQUlBDUFJPWFlCVUZGRVIgcHJveHk7ICAvKiBpbnRlcmZhY2UgcHJveHkgKFJPKSAqLwogIERXT1JEIHJlZnM7ICAgICAgICAgICAgICAvKiBpbXBvcnRlZCAocHVibGljKSByZWZlcmVuY2VzIChNVVRFWCBwYXJlbnQtPnJlbW90aW5nX211dGV4KSAqLwogIElScGNDaGFubmVsQnVmZmVyICpjaGFuOyAvKiBjaGFubmVsIHRvIG9iamVjdCAoQ1MgcGFyZW50LT5jcykgKi8KfTsKCi8qIGltcG9ydGVkIG9iamVjdCAvIHByb3h5IG1hbmFnZXIgKi8Kc3RydWN0IHByb3h5X21hbmFnZXIKewogIGNvbnN0IElNdWx0aVFJVnRibCAqbHBWdGJsOwogIGNvbnN0IElNYXJzaGFsVnRibCAqbHBWdGJsTWFyc2hhbDsKICBzdHJ1Y3QgYXBhcnRtZW50ICpwYXJlbnQ7IC8qIG93bmluZyBhcGFydG1lbnQgKFJPKSAqLwogIHN0cnVjdCBsaXN0IGVudHJ5OyAgICAgICAgLyogZW50cnkgaW4gYXBhcnRtZW50IChDUyBwYXJlbnQtPmNzKSAqLwogIE9YSUQgb3hpZDsgICAgICAgICAgICAgICAgLyogb2JqZWN0IGV4cG9ydGVkIElEIChSTykgKi8KICBPSUQgb2lkOyAgICAgICAgICAgICAgICAgIC8qIG9iamVjdCBJRCAoUk8pICovCiAgc3RydWN0IGxpc3QgaW50ZXJmYWNlczsgICAvKiBpbXBvcnRlZCBpbnRlcmZhY2VzIChDUyBjcykgKi8KICBMT05HIHJlZnM7ICAgICAgICAgICAgICAgIC8qIHByb3h5IHJlZmVyZW5jZSBjb3VudCAoTE9DSykgKi8KICBDUklUSUNBTF9TRUNUSU9OIGNzOyAgICAgIC8qIHRocmVhZCBzYWZldHkgZm9yIHRoaXMgb2JqZWN0IGFuZCBjaGlsZHJlbiAqLwogIFVMT05HIHNvcmZsYWdzOyAgICAgICAgICAgLyogU1RET0JKUkVGIGZsYWdzIChSTykgKi8KICBJUmVtVW5rbm93biAqcmVtdW5rOyAgICAgIC8qIHByb3h5IHRvIElSZW1Vbmtub3duIHVzZWQgZm9yIGxpZmVjeWNsZSBtYW5hZ2VtZW50IChDUyBjcykgKi8KICBIQU5ETEUgcmVtb3RpbmdfbXV0ZXg7ICAgIC8qIG11dGV4IHVzZWQgZm9yIHN5bmNocm9uaXppbmcgYWNjZXNzIHRvIElSZW1Vbmtub3duICovCn07CgovKiB0aGlzIG5lZWRzIHRvIGJlY29tZSBhIENPTSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIElSZW1Vbmtub3duICovCnN0cnVjdCBhcGFydG1lbnQKewogIHN0cnVjdCBsaXN0IGVudHJ5OwoKICBMT05HICByZWZzOyAgICAgICAgICAgICAgLyogcmVmY291bnQgb2YgdGhlIGFwYXJ0bWVudCAoTE9DSykgKi8KICBCT09MIG11bHRpX3RocmVhZGVkOyAgICAgLyogbXVsdGktdGhyZWFkZWQgb3Igc2luZ2xlLXRocmVhZGVkIGFwYXJ0bWVudD8gKFJPKSAqLwogIERXT1JEIHRpZDsgICAgICAgICAgICAgICAvKiB0aHJlYWQgaWQgKFJPKSAqLwogIE9YSUQgb3hpZDsgICAgICAgICAgICAgICAvKiBvYmplY3QgZXhwb3J0ZXIgSUQgKFJPKSAqLwogIExPTkcgaXBpZGM7ICAgICAgICAgICAgICAvKiBpbnRlcmZhY2UgcG9pbnRlciBJRCBjb3VudGVyLCBzdGFydHMgYXQgMSAoTE9DSykgKi8KICBIV05EIHdpbjsgICAgICAgICAgICAgICAgLyogbWVzc2FnZSB3aW5kb3cgKExPQ0spICovCiAgQ1JJVElDQUxfU0VDVElPTiBjczsgICAgIC8qIHRocmVhZCBzYWZldHkgKi8KICBMUE1FU1NBR0VGSUxURVIgZmlsdGVyOyAgLyogbWVzc2FnZSBmaWx0ZXIgKENTIGNzKSAqLwogIHN0cnVjdCBsaXN0IHByb3hpZXM7ICAgICAvKiBpbXBvcnRlZCBvYmplY3RzIChDUyBjcykgKi8KICBzdHJ1Y3QgbGlzdCBzdHVibWdyczsgICAgLyogc3R1YiBtYW5hZ2VycyBmb3IgZXhwb3J0ZWQgb2JqZWN0cyAoQ1MgY3MpICovCiAgQk9PTCByZW11bmtfZXhwb3J0ZWQ7ICAgIC8qIGhhcyB0aGUgSVJlbVVua25vd24gaW50ZXJmYWNlIGZvciB0aGlzIGFwYXJ0bWVudCBiZWVuIGNyZWF0ZWQgeWV0PyAoQ1MgY3MpICovCiAgTE9ORyByZW1vdGluZ19zdGFydGVkOyAgIC8qIGhhcyB0aGUgUlBDIHN5c3RlbSBiZWVuIHN0YXJ0ZWQgZm9yIHRoaXMgYXBhcnRtZW50PyAoTE9DSykgKi8KCiAgLyogRklYTUU6IE9JRCdzIHNob3VsZCBiZSBnaXZlbiBvdXQgYnkgUlBDU1MgKi8KICBPSUQgb2lkYzsgICAgICAgICAgICAgICAgLyogb2JqZWN0IElEIGNvdW50ZXIsIHN0YXJ0cyBhdCAxLCB6ZXJvIGlzIGludmFsaWQgT0lEIChDUyBjcykgKi8KfTsKCi8qIHRoaXMgaXMgd2hhdCBpcyBzdG9yZWQgaW4gVEVCLT5SZXNlcnZlZEZvck9sZSAqLwpzdHJ1Y3Qgb2xldGxzCnsKICAgIHN0cnVjdCBhcGFydG1lbnQgKmFwdDsKICAgIElFcnJvckluZm8gICAgICAgKmVycm9yaW5mbzsgICAvKiBzZWUgZXJyb3JpbmZvLmMgKi8KICAgIElVbmtub3duICAgICAgICAgKnN0YXRlOyAgICAgICAvKiBzZWUgQ29TZXRTdGF0ZSAqLwogICAgRFdPUkQgICAgICAgICAgICBpbml0czsgICAgICAgIC8qIG51bWJlciBvZiB0aW1lcyBDb0luaXRpYWxpemVFeCBjYWxsZWQgKi8KfTsKCgovKiBHbG9iYWwgSW50ZXJmYWNlIFRhYmxlIEZ1bmN0aW9ucyAqLwoKZXh0ZXJuIHZvaWQqIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlX0NvbnN0cnVjdCh2b2lkKTsKZXh0ZXJuIHZvaWQgIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlX0Rlc3Ryb3kodm9pZCogc2VsZik7CmV4dGVybiBIUkVTVUxUIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlX0dldEZhY3RvcnkoTFBWT0lEICpwcHYpOwpleHRlcm4gdm9pZCogU3RkR2xvYmFsSW50ZXJmYWNlVGFibGVJbnN0YW5jZTsKCi8qIEZJWE1FOiB0aGVzZSBzaG91bGRuJ3QgYmUgbmVlZGVkLCBleGNlcHQgZm9yIDE2LWJpdCBmdW5jdGlvbnMgKi8KZXh0ZXJuIEhSRVNVTFQgV0lORV9TdHJpbmdGcm9tQ0xTSUQoY29uc3QgQ0xTSUQgKmlkLExQU1RSIGlkc3RyKTsKCkhSRVNVTFQgQ09NX09wZW5LZXlGb3JDTFNJRChSRUZDTFNJRCBjbHNpZCwgTFBDV1NUUiBrZXluYW1lLCBSRUdTQU0gYWNjZXNzLCBIS0VZICprZXkpOwpIUkVTVUxUIE1BUlNIQUxfR2V0U3RhbmRhcmRNYXJzaGFsQ0YoTFBWT0lEICpwcHYpOwoKLyogU3R1YiBNYW5hZ2VyICovCgpVTE9ORyBzdHViX21hbmFnZXJfaW50X2FkZHJlZihzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpUaGlzKTsKVUxPTkcgc3R1Yl9tYW5hZ2VyX2ludF9yZWxlYXNlKHN0cnVjdCBzdHViX21hbmFnZXIgKlRoaXMpOwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpuZXdfc3R1Yl9tYW5hZ2VyKEFQQVJUTUVOVCAqYXB0LCBJVW5rbm93biAqb2JqZWN0KTsKVUxPTkcgc3R1Yl9tYW5hZ2VyX2V4dF9hZGRyZWYoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgVUxPTkcgcmVmcyk7ClVMT05HIHN0dWJfbWFuYWdlcl9leHRfcmVsZWFzZShzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBVTE9ORyByZWZzKTsKc3RydWN0IGlmc3R1YiAqc3R1Yl9tYW5hZ2VyX25ld19pZnN0dWIoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgSVJwY1N0dWJCdWZmZXIgKnNiLCBJVW5rbm93biAqaXB0ciwgUkVGSUlEIGlpZCwgTVNITEZMQUdTIGZsYWdzKTsKc3RydWN0IGlmc3R1YiAqc3R1Yl9tYW5hZ2VyX2ZpbmRfaWZzdHViKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIFJFRklJRCBpaWQsIE1TSExGTEFHUyBmbGFncyk7CnN0cnVjdCBzdHViX21hbmFnZXIgKmdldF9zdHViX21hbmFnZXIoQVBBUlRNRU5UICphcHQsIE9JRCBvaWQpOwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpnZXRfc3R1Yl9tYW5hZ2VyX2Zyb21fb2JqZWN0KEFQQVJUTUVOVCAqYXB0LCB2b2lkICpvYmplY3QpOwpCT09MIHN0dWJfbWFuYWdlcl9ub3RpZnlfdW5tYXJzaGFsKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIGNvbnN0IElQSUQgKmlwaWQpOwpCT09MIHN0dWJfbWFuYWdlcl9pc190YWJsZV9tYXJzaGFsZWQoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgY29uc3QgSVBJRCAqaXBpZCk7CnZvaWQgc3R1Yl9tYW5hZ2VyX3JlbGVhc2VfbWFyc2hhbF9kYXRhKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIFVMT05HIHJlZnMsIGNvbnN0IElQSUQgKmlwaWQpOwpIUkVTVUxUIGlwaWRfdG9fc3R1Yl9tYW5hZ2VyKGNvbnN0IElQSUQgKmlwaWQsIEFQQVJUTUVOVCAqKnN0dWJfYXB0LCBzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICoqc3R1Ym1ncl9yZXQpOwpIUkVTVUxUIGlwaWRfZ2V0X2Rpc3BhdGNoX3BhcmFtcyhjb25zdCBJUElEICppcGlkLCBBUEFSVE1FTlQgKipzdHViX2FwdCwgSVJwY1N0dWJCdWZmZXIgKipzdHViLCBJUnBjQ2hhbm5lbEJ1ZmZlciAqKmNoYW4pOwpIUkVTVUxUIHN0YXJ0X2FwYXJ0bWVudF9yZW1vdGVfdW5rbm93bih2b2lkKTsKCkhSRVNVTFQgbWFyc2hhbF9vYmplY3QoQVBBUlRNRU5UICphcHQsIFNURE9CSlJFRiAqc3Rkb2JqcmVmLCBSRUZJSUQgcmlpZCwgSVVua25vd24gKm9iaiwgTVNITEZMQUdTIG1zaGxmbGFncyk7CgovKiBSUEMgQmFja2VuZCAqLwoKc3RydWN0IGRpc3BhdGNoX3BhcmFtczsKCnZvaWQgICAgUlBDX1N0YXJ0UmVtb3Rpbmcoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKSFJFU1VMVCBSUENfQ3JlYXRlQ2xpZW50Q2hhbm5lbChjb25zdCBPWElEICpveGlkLCBjb25zdCBJUElEICppcGlkLCBJUnBjQ2hhbm5lbEJ1ZmZlciAqKnBpcGVidWYpOwpIUkVTVUxUIFJQQ19DcmVhdGVTZXJ2ZXJDaGFubmVsKElScGNDaGFubmVsQnVmZmVyICoqY2hhbik7CnZvaWQgICAgUlBDX0V4ZWN1dGVDYWxsKHN0cnVjdCBkaXNwYXRjaF9wYXJhbXMgKnBhcmFtcyk7CkhSRVNVTFQgUlBDX1JlZ2lzdGVySW50ZXJmYWNlKFJFRklJRCByaWlkKTsKdm9pZCAgICBSUENfVW5yZWdpc3RlckludGVyZmFjZShSRUZJSUQgcmlpZCk7CnZvaWQgICAgUlBDX1N0YXJ0TG9jYWxTZXJ2ZXIoUkVGQ0xTSUQgY2xzaWQsIElTdHJlYW0gKnN0cmVhbSk7CkhSRVNVTFQgUlBDX0dldExvY2FsQ2xhc3NPYmplY3QoUkVGQ0xTSUQgcmNsc2lkLCBSRUZJSUQgaWlkLCBMUFZPSUQgKnBwdik7CgovKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIFJ1bm5pbmcgT2JqZWN0IFRhYmxlICovCkhSRVNVTFQgV0lOQVBJIFJ1bm5pbmdPYmplY3RUYWJsZUltcGxfSW5pdGlhbGl6ZSh2b2lkKTsKCi8qIFRoaXMgZnVuY3Rpb24gdW5pbml0aWFsaXplIHRoZSBSdW5uaW5nIE9iamVjdCBUYWJsZSAqLwpIUkVTVUxUIFdJTkFQSSBSdW5uaW5nT2JqZWN0VGFibGVJbXBsX1VuSW5pdGlhbGl6ZSh2b2lkKTsKCi8qIFRoaXMgZnVuY3Rpb24gZGVjb21wb3NlcyBhIFN0cmluZyBwYXRoIHRvIGEgU3RyaW5nIFRhYmxlIGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyAoIlwiIG9yICJzdWJEaXJlY3RvcnkiIG9yICJEaXJlY3RvcnkiIG9yICJGaWxlTmFtZSIpIG9mIHRoZSBwYXRoICovCmludCBGaWxlTW9uaWtlckltcGxfRGVjb21wb3NlUGF0aChMUENPTEVTVFIgc3RyLCBMUE9MRVNUUioqIHN0cmluZ1RhYmxlKTsKCgovKiBBcGFydG1lbnQgRnVuY3Rpb25zICovCgpBUEFSVE1FTlQgKmFwYXJ0bWVudF9maW5kZnJvbW94aWQoT1hJRCBveGlkLCBCT09MIHJlZik7CkFQQVJUTUVOVCAqYXBhcnRtZW50X2ZpbmRmcm9tdGlkKERXT1JEIHRpZCk7CkRXT1JEIGFwYXJ0bWVudF9hZGRyZWYoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKRFdPUkQgYXBhcnRtZW50X3JlbGVhc2Uoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKSFJFU1VMVCBhcGFydG1lbnRfZGlzY29ubmVjdHByb3hpZXMoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKdm9pZCBhcGFydG1lbnRfZGlzY29ubmVjdG9iamVjdChzdHJ1Y3QgYXBhcnRtZW50ICphcHQsIHZvaWQgKm9iamVjdCk7CnN0YXRpYyBpbmxpbmUgSFJFU1VMVCBhcGFydG1lbnRfZ2V0b3hpZChzdHJ1Y3QgYXBhcnRtZW50ICphcHQsIE9YSUQgKm94aWQpCnsKICAgICpveGlkID0gYXB0LT5veGlkOwogICAgcmV0dXJuIFNfT0s7Cn0KSFJFU1VMVCBhcGFydG1lbnRfY3JlYXRld2luZG93aWZuZWVkZWQoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKSFdORCBhcGFydG1lbnRfZ2V0d2luZG93KHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CnZvaWQgYXBhcnRtZW50X2pvaW5tdGEodm9pZCk7CgoKLyogRENPTSBtZXNzYWdlcyB1c2VkIGJ5IHRoZSBhcGFydG1lbnQgd2luZG93IChub3QgY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSkgKi8KI2RlZmluZSBETV9FWEVDVVRFUlBDICAgKFdNX1VTRVIgKyAwKSAvKiBXUEFSQU0gPSAwLCBMUEFSQU0gPSAoc3RydWN0IGRpc3BhdGNoX3BhcmFtcyAqKSAqLwoKLyoKICogUGVyLXRocmVhZCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgVEVCIG9uIG9mZnNldCAweEY4MCwKICogc2VlIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9tc2ovMTA5OS9idWdzbGF5ZXIvYnVnc2xheWVyMTA5OS5odG0KICovCgovKiB3aWxsIGNyZWF0ZSBpZiBuZWNlc3NhcnkgKi8Kc3RhdGljIGlubGluZSBzdHJ1Y3Qgb2xldGxzICpDT01fQ3VycmVudEluZm8odm9pZCkKewogICAgaWYgKCFOdEN1cnJlbnRUZWIoKS0+UmVzZXJ2ZWRGb3JPbGUpCiAgICAgICAgTnRDdXJyZW50VGViKCktPlJlc2VydmVkRm9yT2xlID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihzdHJ1Y3Qgb2xldGxzKSk7CgogICAgcmV0dXJuIE50Q3VycmVudFRlYigpLT5SZXNlcnZlZEZvck9sZTsKfQoKc3RhdGljIGlubGluZSBBUEFSVE1FTlQqIENPTV9DdXJyZW50QXB0KHZvaWQpCnsgIAogICAgcmV0dXJuIENPTV9DdXJyZW50SW5mbygpLT5hcHQ7Cn0KCiNkZWZpbmUgSUNPTV9USElTX01VTFRJKGltcGwsZmllbGQsaWZhY2UpIGltcGwqIGNvbnN0IFRoaXM9KGltcGwqKSgoY2hhciopKGlmYWNlKSAtIG9mZnNldG9mKGltcGwsZmllbGQpKQoKLyogaGVscGVycyBmb3IgZGVidWdnaW5nICovCiMgZGVmaW5lIERFQlVHX1NFVF9DUklUU0VDX05BTUUoY3MsIG5hbWUpIChjcyktPkRlYnVnSW5mby0+U3BhcmVbMF0gPSAoRFdPUkRfUFRSKShfX0ZJTEVfXyAiOiAiIG5hbWUpCiMgZGVmaW5lIERFQlVHX0NMRUFSX0NSSVRTRUNfTkFNRShjcykgKGNzKS0+RGVidWdJbmZvLT5TcGFyZVswXSA9IDAKCmV4dGVybiBISU5TVEFOQ0UgT0xFMzJfaEluc3RhbmNlOyAvKiBGSVhNRTogbWFrZSBzdGF0aWMgKi8KCiNkZWZpbmUgQ0hBUlNfSU5fR1VJRCAzOSAvKiBpbmNsdWRpbmcgTlVMTCAqLwoKLyogRXhwb3J0ZWQgbm9uLWludGVyZmFjZSBEYXRhIEFkdmlzZSBIb2xkZXIgZnVuY3Rpb25zICovCkhSRVNVTFQgRGF0YUFkdmlzZUhvbGRlcl9PbkNvbm5lY3QoSURhdGFBZHZpc2VIb2xkZXIgKmlmYWNlLCBJRGF0YU9iamVjdCAqcERlbGVnYXRlKTsKdm9pZCBEYXRhQWR2aXNlSG9sZGVyX09uRGlzY29ubmVjdChJRGF0YUFkdmlzZUhvbGRlciAqaWZhY2UpOwoKI2VuZGlmIC8qIF9fV0lORV9PTEVfQ09NUE9CSl9IICovCg==