LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogV2UgY2FuJ3QgdXNlIHB0aHJlYWRzIGRpcmVjdGx5LCBzbyB3aHkgbm90IGxldCBsaWJjcwogKiB0aGF0IHdhbnQgcHRocmVhZHMgdXNlIFdpbmUncyBvd24gdGhyZWFkaW5nIGluc3RlYWQuLi4KICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2RlZmluZSBfR05VX1NPVVJDRSAvKiB3ZSBtYXkgbmVlZCB0byBvdmVycmlkZSBzb21lIEdOVSBleHRlbnNpb25zICovCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAibnRkZGsuaCIKCnN0YXRpYyBpbnQgaW5pdF9kb25lOwoKdm9pZCBQVEhSRUFEX2luaXRfZG9uZSh2b2lkKQp7CiAgICBpbml0X2RvbmUgPSAxOwp9CgovKiBDdXJyZW50bHkgdGhpcyBwcm9iYWJseSB3b3JrcyBvbmx5IGZvciBnbGliYzIsCiAqIHdoaWNoIGNoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIGRvdWJsZS11bmRlcnNjb3JlLXByZXBlbmRlZAogKiBwdGhyZWFkIHByaW1pdGl2ZXMsIGFuZCB1c2UgdGhlbSBpZiBhdmFpbGFibGUuCiAqIElmIHRoZXkgYXJlIG5vdCBhdmFpbGFibGUsIHRoZSBsaWJjIGRlZmF1bHRzIHRvCiAqIG5vbi10aHJlYWRzYWZlIG9wZXJhdGlvbiAobm90IGdvb2QpLiAqLwoKI2lmIGRlZmluZWQoX19HTElCQ19fKQojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CgojaWZkZWYgTkVFRF9VTkRFUlNDT1JFX1BSRUZJWAojIGRlZmluZSBQUkVGSVggIl8iCiNlbHNlCiMgZGVmaW5lIFBSRUZJWAojZW5kaWYKCiNkZWZpbmUgUFNUUihzdHIpIFBSRUZJWCAjc3RyCgovKiBhZGFwdCBhcyBuZWNlc3NhcnkgKGEgY29uc3RydWN0IGxpa2UgdGhpcyBpcyB1c2VkIGluIGdsaWJjIHNvdXJjZXMpICovCiNkZWZpbmUgc3Ryb25nX2FsaWFzKG9yaWcsIGFsaWFzKSBcCiBhc20oIi5nbG9ibCAiIFBTVFIoYWxpYXMpICJcbiIgXAogICAgICJcdC5zZXQgIiBQU1RSKGFsaWFzKSAiLCIgUFNUUihvcmlnKSkKCi8qIHN0cm9uZ19hbGlhcyBkb2VzIG5vdCB3b3JrIG9uIGV4dGVybmFsIHN5bWJvbHMgKC5vIGZvcm1hdCBsaW1pdGF0aW9uPyksCiAqIHNvIGZvciB0aG9zZSwgd2UgbmVlZCB0byB1c2UgdGhlIHBvZ28gc3RpY2sgKi8KI2lmIGRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9fUElDX18pCi8qIEZJWE1FOiBQSUMgKi8KI2RlZmluZSBqdW1wX2FsaWFzKG9yaWcsIGFsaWFzKSBcCiBhc20oIi5nbG9ibCAiIFBTVFIoYWxpYXMpICJcbiIgXAogICAgICJcdC50eXBlICIgUFNUUihhbGlhcykgIixAZnVuY3Rpb25cbiIgXAogICAgIFBTVFIoYWxpYXMpICI6XG4iIFwKICAgICAiXHRqbXAgIiBQU1RSKG9yaWcpKQojZW5kaWYKCi8qIGdldCBuZWNlc3NhcnkgbGliYyBzeW1ib2xzICovCiNpZiAoX19HTElCQ19fID09IDIpICYmIChfX0dMSUJDX01JTk9SX18gPj0gMSkgJiYgZGVmaW5lZChIQVZFX19fTElCQ19GT1JLKQojZGVmaW5lIExJQkNfRk9SSyBfX2xpYmNfZm9yawojZGVmaW5lIFBUSFJFQURfRk9SSyBfX2ZvcmsKI2RlZmluZSBBTElBU19GT1JLCiNlbHNlCiNkZWZpbmUgTElCQ19GT1JLIF9fZm9yawojZGVmaW5lIFBUSFJFQURfRk9SSyBmb3JrCiNlbmRpZgpleHRlcm4gcGlkX3QgTElCQ19GT1JLKHZvaWQpOwoKI2RlZmluZSBMSUJDX1NJR0FDVElPTiBfX3NpZ2FjdGlvbgpleHRlcm4gaW50IExJQkNfU0lHQUNUSU9OKGludCBzaWdudW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqYWN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gKm9sZGFjdCk7CgovKiBOT1RFOiBUaGlzIGlzIGEgdHJ1bHkgZXh0cmVtZWx5IGluY3JlZGlibHkgdWdseSBoYWNrIQogKiBCdXQgaXQgZG9lcyBzZWVtIHRvIHdvcmsuLi4gKi8KCi8qIGFzc3VtZSB0aGF0IHB0aHJlYWRfbXV0ZXhfdCBoYXMgcm9vbSBmb3IgYXQgbGVhc3Qgb25lIHBvaW50ZXIsCiAqIGFuZCBob3BlIHRoYXQgdGhlIHVzZXJzIG9mIHB0aHJlYWRfbXV0ZXhfdCBjb25zaWRlcnMgaXQgb3BhcXVlCiAqIChuZXZlciBjaGVja3Mgd2hhdCdzIGluIGl0KSAKICogYWxzbzogYXNzdW1lIHRoYXQgc3RhdGljIGluaXRpYWxpemVyIHNldHMgcG9pbnRlciB0byBOVUxMCiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgQ1JJVElDQUxfU0VDVElPTiAqY3JpdHNlY3Q7Cn0gKndpbmVfbXV0ZXg7CgovKiBzZWUgd2luZV9tdXRleCBhYm92ZSBmb3IgY29tbWVudHMgKi8KdHlwZWRlZiBzdHJ1Y3QgewogIFJUTF9SV0xPQ0sgKmxvY2s7Cn0gKndpbmVfcndsb2NrOwoKdHlwZWRlZiBzdHJ1Y3QgX3dpbmVfY2xlYW51cCB7CiAgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKik7CiAgdm9pZCAqYXJnOwp9ICp3aW5lX2NsZWFudXA7Cgp0eXBlZGVmIGNvbnN0IHZvaWQgKmtleV9kYXRhOwoKI2RlZmluZSBGSVJTVF9LRVkgMAojZGVmaW5lIE1BWF9LRVlTIDE2IC8qIGxpYmM2IGRvZXNuJ3QgdXNlIHRoYXQgbWFueSwgYnV0Li4uICovCgojZGVmaW5lIFBfT1VUUFVUKHN0dWZmKSB3cml0ZSgyLHN0dWZmLHN0cmxlbihzdHVmZikpCgp2b2lkIF9fcHRocmVhZF9pbml0aWFsaXplKHZvaWQpCnsKfQoKc3RydWN0IHB0aHJlYWRfdGhyZWFkX2luaXQgewoJIHZvaWQqICgqc3RhcnRfcm91dGluZSkodm9pZCopOwoJIHZvaWQqIGFyZzsKfTsgCgpzdGF0aWMgRFdPUkQgQ0FMTEJBQ0sgcHRocmVhZF90aHJlYWRfc3RhcnQoTFBWT0lEIGRhdGEpCnsKICBzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdCBpbml0ID0gKihzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdCopZGF0YTsgCiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGRhdGEpOwogIHJldHVybiAoRFdPUkQpaW5pdC5zdGFydF9yb3V0aW5lKGluaXQuYXJnKTsKfQoKaW50IHB0aHJlYWRfY3JlYXRlKHB0aHJlYWRfdCogdGhyZWFkLCBjb25zdCBwdGhyZWFkX2F0dHJfdCogYXR0ciwgdm9pZCoKICAgICAgICAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQgKiksIHZvaWQqIGFyZykKewogIEhBTkRMRSBoVGhyZWFkOwogIHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KiBpZGF0YSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCAKCQlzaXplb2Yoc3RydWN0IHB0aHJlYWRfdGhyZWFkX2luaXQpKTsKCiAgaWRhdGEtPnN0YXJ0X3JvdXRpbmUgPSBzdGFydF9yb3V0aW5lOyAKICBpZGF0YS0+YXJnID0gYXJnOwogIGhUaHJlYWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgcHRocmVhZF90aHJlYWRfc3RhcnQsIGlkYXRhLCAwLCB0aHJlYWQpOwoKICBpZihoVGhyZWFkKQogICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgZWxzZQogIHsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxpZGF0YSk7IC8qIGZyZWUgaWRhdGEgc3RydWN0IG9uIGZhaWx1cmUgKi8KICAgIHJldHVybiBFQUdBSU47CiAgfQogCiAgcmV0dXJuIDA7Cn0KIAppbnQgcHRocmVhZF9jYW5jZWwocHRocmVhZF90IHRocmVhZCkKewogIEhBTkRMRSBoVGhyZWFkID0gT3BlblRocmVhZChUSFJFQURfQUxMX0FDQ0VTUywgRkFMU0UsIHRocmVhZCk7CiAgICAKICBpZighVGVybWluYXRlVGhyZWFkKGhUaHJlYWQsIDApKQogIHsKICAgIENsb3NlSGFuZGxlKGhUaHJlYWQpOwogICAgcmV0dXJuIEVJTlZBTDsgICAgICAvKiByZXR1cm4gZXJyb3IgKi8KICB9CiAKICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKIAogIHJldHVybiAwOyAgICAgICAgICAgICAvKiByZXR1cm4gc3VjY2VzcyAqLwp9ICAgCgppbnQgcHRocmVhZF9qb2luKHB0aHJlYWRfdCB0aHJlYWQsIHZvaWQgKip2YWx1ZV9wdHIpCnsKICBIQU5ETEUgaFRocmVhZCA9IE9wZW5UaHJlYWQoVEhSRUFEX0FMTF9BQ0NFU1MsIEZBTFNFLCB0aHJlYWQpOwogCiAgV2FpdEZvclNpbmdsZU9iamVjdChoVGhyZWFkLCBJTkZJTklURSk7CiAgaWYoIUdldEV4aXRDb2RlVGhyZWFkKGhUaHJlYWQsIChMUERXT1JEKXZhbHVlX3B0cikpCiAgewogICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgICByZXR1cm4gRUlOVkFMOyAvKiBGSVhNRTogbWFrZSB0aGlzIG1vcmUgY29ycmVjdGx5IG1hdGNoICovCiAgfSAgICAgICAgICAgICAgICAvKiB3aW5kb3dzIGVycm9ycyAqLwoKICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKICByZXR1cm4gMDsKfSAgIAoKLypGSVhNRTogbm90IHN1cmUgd2hhdCB0byBkbyB3aXRoIHRoaXMgb25lLi4uICovCmludCBwdGhyZWFkX2RldGFjaChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfZGV0YWNoXG4iKTsKICByZXR1cm4gMDsKfQoKLyogRklYTUU6IHdlIGhhdmUgbm8gZXF1aXZhbGVudHMgaW4gd2luMzIgZm9yIHRoZSBwb2xpY3lzICovCi8qIHNvIGp1c3Qga2VlcCB0aGlzIGFzIGEgc3R1YiAqLwppbnQgcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5KHB0aHJlYWRfYXR0cl90ICphdHRyLCBpbnQgcG9saWN5KQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeVxuIik7CiAgcmV0dXJuIDA7Cn0KCi8qIEZJWE1FOiBubyB3aW4zMiBlcXVpdmFsZW50IGZvciBzY29wZSAqLwppbnQgcHRocmVhZF9hdHRyX3NldHNjb3BlKHB0aHJlYWRfYXR0cl90ICphdHRyLCBpbnQgc2NvcGUpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9hdHRyX3NldHNjb3BlXG4iKTsKICByZXR1cm4gMDsgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQogIAovKiBGSVhNRTogbm8gd2luMzIgZXF1aXZhbGVudCBmb3Igc2NoZWR1bGUgcGFyYW0gKi8KaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKHB0aHJlYWRfYXR0cl90ICphdHRyLAogICAgY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpwYXJhbSkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbVxuIik7CiAgcmV0dXJuIDA7IC8qIHJldHVybiBzdWNjZXNzICovCn0KCmludCBfX3B0aHJlYWRfb25jZShwdGhyZWFkX29uY2VfdCAqb25jZV9jb250cm9sLCB2b2lkICgqaW5pdF9yb3V0aW5lKSh2b2lkKSkKewogIHN0YXRpYyBwdGhyZWFkX29uY2VfdCB0aGVfb25jZSA9IFBUSFJFQURfT05DRV9JTklUOwogIExPTkcgb25jZV9ub3cgPSAqKExPTkcgKikmdGhlX29uY2U7CgogIGlmIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgoTE9ORyopb25jZV9jb250cm9sLCBvbmNlX25vdysxLCBvbmNlX25vdykgPT0gb25jZV9ub3cpCiAgICAoKmluaXRfcm91dGluZSkoKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX29uY2UsIHB0aHJlYWRfb25jZSk7Cgp2b2lkIF9fcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnAodm9pZCkKewogICAgLyogd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlICovCn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnAsIHB0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wKTsKCi8qKioqKiBhdGZvcmsgKioqKiovCgojZGVmaW5lIE1BWF9BVEZPUksgOCAgLyogbGliYyBkb2Vzbid0IG5lZWQgdGhhdCBtYW55IGFueXdheSAqLwoKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gYXRmb3JrX3NlY3Rpb24gPSBDUklUSUNBTF9TRUNUSU9OX0lOSVQoImF0Zm9ya19zZWN0aW9uIik7CnR5cGVkZWYgdm9pZCAoKmF0Zm9ya19oYW5kbGVyKSgpOwpzdGF0aWMgYXRmb3JrX2hhbmRsZXIgYXRmb3JrX3ByZXBhcmVbTUFYX0FURk9SS107CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfcGFyZW50W01BWF9BVEZPUktdOwpzdGF0aWMgYXRmb3JrX2hhbmRsZXIgYXRmb3JrX2NoaWxkW01BWF9BVEZPUktdOwpzdGF0aWMgaW50IGF0Zm9ya19jb3VudDsKCmludCBfX3B0aHJlYWRfYXRmb3JrKHZvaWQgKCpwcmVwYXJlKSh2b2lkKSwKCQkgICAgIHZvaWQgKCpwYXJlbnQpKHZvaWQpLAoJCSAgICAgdm9pZCAoKmNoaWxkKSh2b2lkKSkKewogICAgaWYgKGluaXRfZG9uZSkgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgYXNzZXJ0KCBhdGZvcmtfY291bnQgPCBNQVhfQVRGT1JLICk7CiAgICBhdGZvcmtfcHJlcGFyZVthdGZvcmtfY291bnRdID0gcHJlcGFyZTsKICAgIGF0Zm9ya19wYXJlbnRbYXRmb3JrX2NvdW50XSA9IHBhcmVudDsKICAgIGF0Zm9ya19jaGlsZFthdGZvcmtfY291bnRdID0gY2hpbGQ7CiAgICBhdGZvcmtfY291bnQrKzsKICAgIGlmIChpbml0X2RvbmUpIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmYXRmb3JrX3NlY3Rpb24gKTsKICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfYXRmb3JrLCBwdGhyZWFkX2F0Zm9yayk7CgpwaWRfdCBQVEhSRUFEX0ZPUksodm9pZCkKewogICAgcGlkX3QgcGlkOwogICAgaW50IGk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgLyogcHJlcGFyZSBoYW5kbGVycyBhcmUgY2FsbGVkIGluIHJldmVyc2UgaW5zZXJ0aW9uIG9yZGVyICovCiAgICBmb3IgKGkgPSBhdGZvcmtfY291bnQgLSAxOyBpID49IDA7IGktLSkgaWYgKGF0Zm9ya19wcmVwYXJlW2ldKSBhdGZvcmtfcHJlcGFyZVtpXSgpOwogICAgaWYgKCEocGlkID0gTElCQ19GT1JLKCkpKQogICAgewogICAgICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdGZvcmtfY291bnQ7IGkrKykgaWYgKGF0Zm9ya19jaGlsZFtpXSkgYXRmb3JrX2NoaWxkW2ldKCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0Zm9ya19jb3VudDsgaSsrKSBpZiAoYXRmb3JrX3BhcmVudFtpXSkgYXRmb3JrX3BhcmVudFtpXSgpOwogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmYXRmb3JrX3NlY3Rpb24gKTsKICAgIH0KICAgIHJldHVybiBwaWQ7Cn0KI2lmZGVmIEFMSUFTX0ZPUksKc3Ryb25nX2FsaWFzKFBUSFJFQURfRk9SSywgZm9yayk7CiNlbmRpZgoKLyoqKioqIE1VVEVYRVMgKioqKiovCgppbnQgX19wdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleF90ICptdXRleCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqbXV0ZXhhdHRyKQp7CiAgLyogZ2xpYmMgaGFzIGEgdGVuZGVuY3kgdG8gaW5pdGlhbGl6ZSBtdXRleGVzIHZlcnkgb2Z0ZW4sIGV2ZW4KICAgICBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZXkgYXJlIG5vdCByZWFsbHkgdXNlZCBsYXRlciBvbi4KCiAgICAgQXMgZm9yIHVzLCBpbml0aWFsaXppbmcgYSBtdXRleCBpcyB2ZXJ5IGV4cGVuc2l2ZSwgd2UgcG9zdHBvbmUKICAgICB0aGUgcmVhbCBpbml0aWFsaXphdGlvbiB1bnRpbCB0aGUgdGltZSB0aGUgbXV0ZXggaXMgZmlyc3QgdXNlZC4gKi8KCiAgKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QgPSBOVUxMOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfaW5pdCwgcHRocmVhZF9tdXRleF9pbml0KTsKCnN0YXRpYyB2b2lkIG11dGV4X3JlYWxfaW5pdCggcHRocmVhZF9tdXRleF90ICptdXRleCApCnsKICBDUklUSUNBTF9TRUNUSU9OICpjcml0c2VjdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoQ1JJVElDQUxfU0VDVElPTikpOwogIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oY3JpdHNlY3QpOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKCh2b2lkKiopJigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCksY3JpdHNlY3QsTlVMTCkgIT0gTlVMTCkgewogICAgLyogdG9vIGxhdGUsIHNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgZGlkIGl0ICovCiAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oY3JpdHNlY3QpOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY3JpdHNlY3QpOwogIH0KfQoKaW50IF9fcHRocmVhZF9tdXRleF9sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoIWluaXRfZG9uZSkgcmV0dXJuIDA7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkgCiAgICBtdXRleF9yZWFsX2luaXQoIG11dGV4ICk7CgogIEVudGVyQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X2xvY2ssIHB0aHJlYWRfbXV0ZXhfbG9jayk7CgppbnQgX19wdGhyZWFkX211dGV4X3RyeWxvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmICghaW5pdF9kb25lKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSAKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgaWYgKCFUcnlFbnRlckNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkpIHsKICAgIGVycm5vID0gRUJVU1k7CiAgICByZXR1cm4gLTE7CiAgfQogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgcHRocmVhZF9tdXRleF90cnlsb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSByZXR1cm4gMDsKICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF91bmxvY2ssIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveShwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkgcmV0dXJuIDA7CiAgaWYgKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0LT5SZWN1cnNpb25Db3VudCkgewojaWYgMCAvKiB0aGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiBsaWJjNiB0aGF0IG1ha2VzIHRoaXMgYSBiYWQgaWRlYSAqLwogICAgcmV0dXJuIEVCVVNZOwojZWxzZQogICAgd2hpbGUgKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0LT5SZWN1cnNpb25Db3VudCkKICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwojZW5kaWYKICB9CiAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9kZXN0cm95LCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kpOwoKCi8qKioqKiBNVVRFWCBBVFRSSUJVVEVTICoqKioqLwovKiBqdXN0IGR1bW1pZXMsIHNpbmNlIGNyaXRpY2FsIHNlY3Rpb25zIGFyZSBhbHdheXMgcmVjdXJzaXZlICovCgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9pbml0KHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9pbml0LCBwdGhyZWFkX211dGV4YXR0cl9pbml0KTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3ksIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQga2luZCkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnAsIHB0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnApOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0a2luZF9ucChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQgKmtpbmQpCnsKICAqa2luZCA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnAsIHB0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnApOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQga2luZCkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUsIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQgKmtpbmQpCnsKICAqa2luZCA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUsIHB0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUpOwoKCi8qKioqKiBUSFJFQUQtU1BFQ0lGSUMgVkFSSUFCTEVTIChLRVlTKSAqKioqKi8KCmludCBfX3B0aHJlYWRfa2V5X2NyZWF0ZShwdGhyZWFkX2tleV90ICprZXksIHZvaWQgKCpkZXN0cl9mdW5jdGlvbikodm9pZCAqKSkKewogIHN0YXRpYyBMT05HIGtleWNudCA9IEZJUlNUX0tFWTsKICAqa2V5ID0gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgma2V5Y250LCAxKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tleV9jcmVhdGUsIHB0aHJlYWRfa2V5X2NyZWF0ZSk7CgppbnQgX19wdGhyZWFkX2tleV9kZWxldGUocHRocmVhZF9rZXlfdCBrZXkpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tleV9kZWxldGUsIHB0aHJlYWRfa2V5X2RlbGV0ZSk7CgppbnQgX19wdGhyZWFkX3NldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5LCBjb25zdCB2b2lkICpwb2ludGVyKQp7CiAgVEVCICp0ZWIgPSBOdEN1cnJlbnRUZWIoKTsKICBpZiAoIXRlYi0+cHRocmVhZF9kYXRhKSB7CiAgICB0ZWItPnB0aHJlYWRfZGF0YSA9IGNhbGxvYyhNQVhfS0VZUyxzaXplb2Yoa2V5X2RhdGEpKTsKICB9CiAgKChrZXlfZGF0YSopKHRlYi0+cHRocmVhZF9kYXRhKSlba2V5XSA9IHBvaW50ZXI7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9zZXRzcGVjaWZpYywgcHRocmVhZF9zZXRzcGVjaWZpYyk7Cgp2b2lkICpfX3B0aHJlYWRfZ2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXkpCnsKICBURUIgKnRlYiA9IE50Q3VycmVudFRlYigpOwogIGlmICghdGViKSByZXR1cm4gTlVMTDsKICBpZiAoIXRlYi0+cHRocmVhZF9kYXRhKSByZXR1cm4gTlVMTDsKICByZXR1cm4gKHZvaWQgKikoKChrZXlfZGF0YSopKHRlYi0+cHRocmVhZF9kYXRhKSlba2V5XSk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9nZXRzcGVjaWZpYywgcHRocmVhZF9nZXRzcGVjaWZpYyk7CgoKLyoqKioqICJFWENFUFRJT04iIEZSQU1FUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3B1c2goc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIHZvaWQgKCpyb3V0aW5lKSh2b2lkICopLCB2b2lkICphcmcpCnsKICAoKHdpbmVfY2xlYW51cClidWZmZXIpLT5yb3V0aW5lID0gcm91dGluZTsKICAoKHdpbmVfY2xlYW51cClidWZmZXIpLT5hcmcgPSBhcmc7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3Aoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIGludCBleGVjdXRlKQp7CiAgaWYgKGV4ZWN1dGUpICgqKCgod2luZV9jbGVhbnVwKWJ1ZmZlciktPnJvdXRpbmUpKSgoKHdpbmVfY2xlYW51cClidWZmZXIpLT5hcmcpOwp9Cgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcihzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKmFyZykKewogIF9wdGhyZWFkX2NsZWFudXBfcHVzaChidWZmZXIsIHJvdXRpbmUsIGFyZyk7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZShzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgaW50IGV4ZWN1dGUpCnsKICBfcHRocmVhZF9jbGVhbnVwX3BvcChidWZmZXIsIGV4ZWN1dGUpOwp9CgoKLyoqKioqIENPTkRJVElPTlMgKioqKiovCi8qIG5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cgKi8KCmludCBwdGhyZWFkX2NvbmRfaW5pdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgY29uc3QgcHRocmVhZF9jb25kYXR0cl90ICpjb25kX2F0dHIpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2luaXRcbiIpOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kX2Rlc3Ryb3kocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2Rlc3Ryb3lcbiIpOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kX3NpZ25hbChwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfc2lnbmFsXG4iKTsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfY29uZF9icm9hZGNhc3QocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2Jyb2FkY2FzdFxuIik7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRfd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfd2FpdFxuIik7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KHB0aHJlYWRfY29uZF90ICpjb25kLCBwdGhyZWFkX211dGV4X3QgKm11dGV4LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmFic3RpbWUpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX3RpbWVkd2FpdFxuIik7CiAgcmV0dXJuIDA7Cn0KCi8qKioqIENPTkRJVElPTiBBVFRSSUJVVEVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgcHRocmVhZF9jb25kYXR0cl9pbml0KHB0aHJlYWRfY29uZGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kYXR0cl9kZXN0cm95KHB0aHJlYWRfY29uZGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgojaWYgKF9fR0xJQkNfXyA9PSAyKSAmJiAoX19HTElCQ19NSU5PUl9fID49IDIpCi8qKioqKiBSRUFELVdSSVRFIExPQ0tTICoqKioqLwoKc3RhdGljIHZvaWQgcndsb2NrX3JlYWxfaW5pdChwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBSVExfUldMT0NLICpsb2NrID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihSVExfUldMT0NLKSk7CiAgUnRsSW5pdGlhbGl6ZVJlc291cmNlKGxvY2spOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKCh2b2lkKiopJigoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spLGxvY2ssTlVMTCkgIT0gTlVMTCkgewogICAgLyogdG9vIGxhdGUsIHNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgZGlkIGl0ICovCiAgICBSdGxEZWxldGVSZXNvdXJjZShsb2NrKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxvY2spOwogIH0KfQoKaW50IF9fcHRocmVhZF9yd2xvY2tfaW5pdChwdGhyZWFkX3J3bG9ja190ICpyd2xvY2ssIGNvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICpyd2xvY2tfYXR0cikKewogICgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jayA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfaW5pdCwgcHRocmVhZF9yd2xvY2tfaW5pdCk7CgppbnQgX19wdGhyZWFkX3J3bG9ja19kZXN0cm95KHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKSByZXR1cm4gMDsKICBSdGxEZWxldGVSZXNvdXJjZSgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jayk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveSwgcHRocmVhZF9yd2xvY2tfZGVzdHJveSk7CgppbnQgX19wdGhyZWFkX3J3bG9ja19yZGxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCFpbml0X2RvbmUpIHJldHVybiAwOwogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIHdoaWxlKFRSVUUpCiAgICBpZiAoUnRsQWNxdWlyZVJlc291cmNlU2hhcmVkKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgVFJVRSkpCiAgICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3JkbG9jaywgcHRocmVhZF9yd2xvY2tfcmRsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoIWluaXRfZG9uZSkgcmV0dXJuIDA7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgaWYgKCFSdGxBY3F1aXJlUmVzb3VyY2VTaGFyZWQoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBGQUxTRSkpIHsKICAgIGVycm5vID0gRUJVU1k7CiAgICByZXR1cm4gLTE7CiAgfQogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaywgcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3dybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoIWluaXRfZG9uZSkgcmV0dXJuIDA7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgd2hpbGUoVFJVRSkKICAgIGlmIChSdGxBY3F1aXJlUmVzb3VyY2VFeGNsdXNpdmUoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBUUlVFKSkKICAgICAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfd3Jsb2NrLCBwdGhyZWFkX3J3bG9ja193cmxvY2spOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghaW5pdF9kb25lKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykKICAgIHJ3bG9ja19yZWFsX2luaXQoIHJ3bG9jayApOwoKICBpZiAoIVJ0bEFjcXVpcmVSZXNvdXJjZUV4Y2x1c2l2ZSgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2ssIEZBTFNFKSkgewogICAgZXJybm8gPSBFQlVTWTsKICAgIHJldHVybiAtMTsKICB9CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrLCBwdGhyZWFkX3J3bG9ja190cnl3cmxvY2spOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfdW5sb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKSByZXR1cm4gMDsKICBSdGxSZWxlYXNlUmVzb3VyY2UoICgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jayApOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3VubG9jaywgcHRocmVhZF9yd2xvY2tfdW5sb2NrKTsKCi8qKioqIFJFQUQtV1JJVEUgTE9DSyBBVFRSSUJVVEVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgcHRocmVhZF9yd2xvY2thdHRyX2luaXQocHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQoKaW50IF9fcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3kocHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja2F0dHJfZGVzdHJveSwgcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3kpOwoKaW50IHB0aHJlYWRfcndsb2NrYXR0cl9nZXRraW5kX25wKGNvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyLCBpbnQgKnByZWYpCnsKICAqcHJlZiA9IDA7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX3J3bG9ja2F0dHJfc2V0a2luZF9ucChwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0ciwgaW50IHByZWYpCnsKICByZXR1cm4gMDsKfQojZW5kaWYgLyogZ2xpYmMgMi4yICovCgovKioqKiogTUlTQyAqKioqKi8KCnB0aHJlYWRfdCBwdGhyZWFkX3NlbGYodm9pZCkKewogIHJldHVybiAocHRocmVhZF90KUdldEN1cnJlbnRUaHJlYWRJZCgpOwp9CgppbnQgcHRocmVhZF9lcXVhbChwdGhyZWFkX3QgdGhyZWFkMSwgcHRocmVhZF90IHRocmVhZDIpCnsKICByZXR1cm4gKERXT1JEKXRocmVhZDEgPT0gKERXT1JEKXRocmVhZDI7Cn0KCnZvaWQgcHRocmVhZF9leGl0KHZvaWQgKnJldHZhbCkKewogIC8qIEZJWE1FOiBwdGhyZWFkIGNsZWFudXAgKi8KICBFeGl0VGhyZWFkKChEV09SRClyZXR2YWwpOwp9CgppbnQgcHRocmVhZF9zZXRjYW5jZWx0eXBlKGludCB0eXBlLCBpbnQgKm9sZHR5cGUpCnsKICBpZiAob2xkdHlwZSkgKm9sZHR5cGUgPSBQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVM7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKiBBTlRJLU9WRVJSSURFUyAqKioqKi8KLyogcHRocmVhZHMgdHJpZXMgdG8gb3ZlcnJpZGUgdGhlc2UsIHBvaW50IHRoZW0gYmFjayB0byBsaWJjICovCgojaWZkZWYganVtcF9hbGlhcwpqdW1wX2FsaWFzKExJQkNfU0lHQUNUSU9OLCBzaWdhY3Rpb24pOwojZWxzZQppbnQgc2lnYWN0aW9uKGludCBzaWdudW0sIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKmFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqb2xkYWN0KQp7CiAgcmV0dXJuIExJQkNfU0lHQUNUSU9OKHNpZ251bSwgYWN0LCBvbGRhY3QpOwp9CiNlbmRpZgoKI2VuZGlmIC8qIF9fR0xJQkNfXyAqLwo=